Files
poimen-workflows/activity/router.go
T
Test 9c9e9450bc refactor: rename action→activity, statemachine→workflow, remove HTTP API layer
- action/ → activity/ (Temporal activities)
- statemachine/ → workflow/ (Temporal workflows)
- Removed internal/api/ and cmd/server/ (api-gw handles HTTP, Temporal is the API)
- Created pkg/types/types.go as single source of truth for all shared types
- Extracted CallRoleLLM helper (DRY: implementer/planner/judge shared pattern)
- Fixed circular import: workflow_graph_query uses string activity names
- Fixed logger.logf → logger.Info/Warn (method didn't exist)
- Fixed routing types: added Branches, Activity, BackoffSeconds, TaskActivity
- Fixed db.Canvas.Name, db.Client→DB, GetWorkflow→FetchWorkflow
- Removed unused imports
- All tests pass, build clean, vet clean
2026-09-05 23:59:13 -07:00

90 lines
2.6 KiB
Go

package activity
import (
"context"
"fmt"
"github.com/rockliang/poimen/workflows/internal/routing"
"go.temporal.io/sdk/activity"
)
// LLMRouterActivity is the Temporal activity that routes user requests to workflows
func LLMRouterActivity(ctx context.Context, input routing.LLMRouterInput) (*routing.LLMRouterOutput, error) {
logger := activity.GetLogger(ctx)
logger.Info("LLMRouterActivity started", "message", input.Message)
// Load knowledge base
kb, err := routing.LoadKnowledgeBaseFromDefaultPath()
if err != nil {
return nil, fmt.Errorf("failed to load knowledge base: %w", err)
}
// Create router
router, err := routing.NewLLMRouterDefault(kb)
if err != nil {
return nil, fmt.Errorf("failed to create router: %w", err)
}
// Route the request
output, err := router.Route(ctx, input)
if err != nil {
logger.Error("LLMRouterActivity failed", "error", err)
return nil, err
}
if output.IsCron {
logger.Info("LLMRouterActivity completed (cron)",
"workflowName", output.CronSpec.Name,
"schedule", output.CronSpec.Schedule,
"stateCount", len(output.CronSpec.States))
} else {
logger.Info("LLMRouterActivity completed",
"workflowName", output.Spec.Name,
"stateCount", len(output.Spec.States))
}
return output, nil
}
// ValidateWorkflowSpecActivity validates a workflow spec before execution
func ValidateWorkflowSpecActivity(ctx context.Context, spec routing.WorkflowSpec) (*routing.ValidationResult, error) {
logger := activity.GetLogger(ctx)
logger.Info("ValidateWorkflowSpecActivity started", "workflowName", spec.Name)
kb, err := routing.LoadKnowledgeBaseFromDefaultPath()
if err != nil {
return nil, fmt.Errorf("failed to load knowledge base: %w", err)
}
validator := routing.NewValidator(kb)
result := validator.ValidateWorkflowSpec(&spec)
logger.Info("ValidateWorkflowSpecActivity completed",
"valid", result.Valid,
"errorCount", len(result.Errors))
return result, nil
}
// ValidateCronWorkflowSpecActivity validates a cron workflow spec before scheduling
func ValidateCronWorkflowSpecActivity(ctx context.Context, spec routing.CronWorkflowSpec) (*routing.ValidationResult, error) {
logger := activity.GetLogger(ctx)
logger.Info("ValidateCronWorkflowSpecActivity started",
"workflowName", spec.Name,
"schedule", spec.Schedule)
kb, err := routing.LoadKnowledgeBaseFromDefaultPath()
if err != nil {
return nil, fmt.Errorf("failed to load knowledge base: %w", err)
}
validator := routing.NewValidator(kb)
result := validator.ValidateCronWorkflowSpec(&spec)
logger.Info("ValidateCronWorkflowSpecActivity completed",
"valid", result.Valid,
"errorCount", len(result.Errors))
return result, nil
}