- Implement 12 Temporal activities for memory operations - Activities: create, update, search, context, diagnose, analyze, document - Add activity registration and worker setup - Full retry/timeout configuration with observability - Include workflow patterns and examples - All tests passing (23/23) Documentation: - MEMORY_INTEGRATION.md: High-level integration guide - MEMORY_ACTIVITIES.md: Complete activities reference - REGISTERED_ACTIVITIES.md: Registry and calling conventions
9.7 KiB
9.7 KiB
Registered Memory Service Activities
Summary
Total Activities Registered: 12
Package: github.com/rockliang/poimen/workflows/internal/memory
Registration Method: RegisterMemoryActivities(worker, service)
Task Queue: poimen-taskqueue
Namespace: poimen-harness
Registered Activities List
1. CreateKnowledgeActivity
- Function:
CreateKnowledgeActivity(ctx context.Context, record *KnowledgeRecord) (string, error) - Input:
KnowledgeRecord(level, title, content, source, metadata) - Output: Knowledge ID (string)
- Timeout: 1 minute (default)
- Retries: 3 attempts (default)
- Purpose: Create L1/L2/reference knowledge records
- Call in Workflow:
memory.ExecuteCreateKnowledge(ctx, record, opts)
2. UpdateKnowledgeActivity
- Function:
UpdateKnowledgeActivity(ctx context.Context, record *KnowledgeRecord) (string, error) - Input:
KnowledgeRecord(with ID) - Output: Knowledge ID (string)
- Timeout: 1 minute
- Retries: 3 attempts
- Purpose: Update existing knowledge records
- Call in Workflow:
memory.ExecuteUpdateKnowledge(ctx, record, opts)(not implemented yet)
3. SearchKnowledgeActivity
- Function:
SearchKnowledgeActivity(ctx context.Context, query string, opts *RetrievalOptions) ([]KnowledgeRecord, error) - Input: Query string + retrieval options (limit, levelFilter, floor, scope)
- Output: Array of
KnowledgeRecord - Timeout: 2 minutes
- Retries: 3 attempts
- Purpose: Hybrid search (semantic + lexical)
- Call in Workflow:
memory.ExecuteSearchKnowledge(ctx, query, opts, activityOpts)
4. GetContextActivity
- Function:
GetContextActivity(ctx context.Context, tool, task string, budget int) (*ServiceContext, error) - Input: Tool name, task name, budget (bytes)
- Output:
ServiceContext(tier, lessons, skills, budget) - Timeout: 2 minutes
- Retries: 3 attempts
- Purpose: Three-tier retrieval (signature → vector → reference)
- Call in Workflow:
memory.ExecuteGetContext(ctx, tool, task, budget, opts)
5. GetVaultActivity
- Function:
GetVaultActivity(ctx context.Context) ([]VaultInfo, error) - Input: None
- Output: Array of
VaultInfo(path, title, level, updatedAt, recordCount) - Timeout: 1 minute
- Retries: 3 attempts
- Purpose: Browse vault files and structure
- Call in Workflow: Use via service:
service.GetVault(ctx)
6. HealthCheckActivity
- Function:
HealthCheckActivity(ctx context.Context) (bool, error) - Input: None
- Output: Boolean (healthy or not)
- Timeout: 30 seconds
- Retries: 3 attempts
- Purpose: Check memory service availability
- Call in Workflow:
memory.ExecuteHealthCheck(ctx, opts)
7. LearnFromExecutionActivity
- Function:
LearnFromExecutionActivity(ctx context.Context, taskID string, result string, tags []string) (string, error) - Input: Task ID, execution result, tags (optional)
- Output: Knowledge record ID
- Timeout: 1 minute
- Retries: 3 attempts
- Purpose: Learn from task execution results
- Call in Workflow:
memory.ExecuteLearnFromExecution(ctx, taskID, result, tags, opts)
8. DiagnoseIssueActivity
- Function:
DiagnoseIssueActivity(ctx context.Context, tool, issue string) ([]string, error) - Input: Tool name, issue description
- Output: Array of recommendation strings
- Timeout: 1 minute
- Retries: 3 attempts
- Purpose: Diagnose issues using memory context
- Call in Workflow:
memory.ExecuteDiagnoseIssue(ctx, tool, issue, opts)
9. AnalyzeErrorActivity
- Function:
AnalyzeErrorActivity(ctx context.Context, errorMsg string) ([]KnowledgeRecord, error) - Input: Error message
- Output: Array of
KnowledgeRecord(solutions) - Timeout: 1 minute
- Retries: 3 attempts
- Purpose: Analyze errors and find recovery paths
- Call in Workflow:
memory.ExecuteAnalyzeError(ctx, errorMsg, opts)
10. DocumentDecisionActivity
- Function:
DocumentDecisionActivity(ctx context.Context, decisionType, decision, reasoning string) (string, error) - Input: Decision type, decision, reasoning
- Output: Knowledge record ID
- Timeout: 1 minute
- Retries: 3 attempts
- Purpose: Record workflow decisions (L2 knowledge)
- Call in Workflow:
memory.ExecuteDocumentDecision(ctx, decisionType, decision, reasoning, opts)
11. SearchAndApplyActivity
- Function:
SearchAndApplyActivity(ctx context.Context, query string, selector func(record *KnowledgeRecord) bool) ([]string, error) - Input: Query string, optional selector function
- Output: Array of applied content strings
- Timeout: 1 minute
- Retries: 3 attempts
- Purpose: Search knowledge and apply selective results
- Call in Workflow: Use via service
12. RefreshMemoryActivity
- Function:
RefreshMemoryActivity(ctx context.Context) (map[string]interface{}, error) - Input: None
- Output: Map with vault stats and health
- Timeout: 1 minute
- Retries: 3 attempts
- Purpose: Periodic memory context refresh
- Call in Workflow:
memory.ExecuteRefreshMemory(ctx, opts)
Registration Code
// In cmd/worker/main.go or similar
import "github.com/rockliang/poimen/workflows/internal/memory"
func setupWorker() {
// Create memory service
memoryService := memory.NewService(
os.Getenv("MEMORY_SERVICE_URL"),
os.Getenv("MEMORY_SERVICE_TOKEN"),
"poimen",
)
// Register all memory activities
memory.RegisterMemoryActivities(workerInstance, memoryService)
}
Activity Naming Convention
Temporal activity names (as seen in logs/UI):
- CreateKnowledgeActivity → createKnowledgeActivity
- UpdateKnowledgeActivity → updateKnowledgeActivity
- SearchKnowledgeActivity → searchKnowledgeActivity
- GetContextActivity → getContextActivity
- GetVaultActivity → getVaultActivity
- HealthCheckActivity → healthCheckActivity
- LearnFromExecutionActivity → learnFromExecutionActivity
- DiagnoseIssueActivity → diagnoseIssueActivity
- AnalyzeErrorActivity → analyzeErrorActivity
- DocumentDecisionActivity → documentDecisionActivity
- SearchAndApplyActivity → searchAndApplyActivity
- RefreshMemoryActivity → refreshMemoryActivity
Default Retry Policy
InitialInterval: 1 second
BackoffCoefficient: 2.0
MaximumInterval: 30 seconds
MaximumAttempts: 3
NonRetryableErrors: (empty - all errors retry)
Timeline: 1s → 2s → 4s → fail
Default Timeouts
| Activity | Schedule-to-Close | Start-to-Close |
|---|---|---|
| CreateKnowledge | 2 min | 1 min |
| SearchKnowledge | 3 min | 2 min |
| GetContext | 3 min | 2 min |
| DiagnoseIssue | 2 min | 1 min |
| AnalyzeError | 2 min | 1 min |
| LearnFromExecution | 2 min | 1 min |
| DocumentDecision | 2 min | 1 min |
| HealthCheck | 1 min | 30s |
| GetVault | 2 min | 1 min |
| RefreshMemory | 2 min | 1 min |
How to List Activities at Runtime
Option 1: Check Logs
kubectl -n poimen logs -f deployment/poimen-worker | grep "ActivityType"
Option 2: In Workflow Test
suite := &testsuite.WorkflowTestSuite{}
env := suite.NewTestActivityEnvironment()
activities := memory.NewActivities(service)
env.RegisterActivity(activities.CreateKnowledgeActivity)
// ... etc
// Run test - activities are registered
Option 3: Via Temporal CLI (when connected)
temporal task-queue describe --namespace poimen-harness --task-queue poimen-taskqueue
Option 4: Temporal Web UI
http://temporal.riotpiao.com (or local Temporal UI)
→ Namespace: poimen-harness
→ Task Queue: poimen-taskqueue
→ View registered worker versions with activities
Activity Flow Diagram
Workflow
↓
ExecuteCreateKnowledge(ctx, record, opts)
↓
Temporal Worker polls poimen-taskqueue
↓
CreateKnowledgeActivity runs with retry policy
↓
Memory Service HTTP call (with Bearer token)
↓
Result → Workflow continues
Integration with Worker
// cmd/worker/main.go
func main() {
c, _ := client.Dial(client.Options{
HostPort: "temporal-frontend.temporal:7233",
Namespace: "poimen-harness",
})
defer c.Close()
w := worker.New(c, "poimen-taskqueue", worker.Options{})
// Register memory activities
memSvc := memory.NewService(
"http://memory-service:8080",
os.Getenv("MEMORY_TOKEN"),
"poimen",
)
memory.RegisterMemoryActivities(w, memSvc)
// Start worker
w.Start()
defer w.Stop()
}
Summary Table
| # | Activity | Input | Output | Timeout |
|---|---|---|---|---|
| 1 | CreateKnowledge | KnowledgeRecord | string | 1m |
| 2 | UpdateKnowledge | KnowledgeRecord | string | 1m |
| 3 | SearchKnowledge | string, opts | []KnowledgeRecord | 2m |
| 4 | GetContext | tool, task, budget | ServiceContext | 2m |
| 5 | GetVault | — | []VaultInfo | 1m |
| 6 | HealthCheck | — | bool | 30s |
| 7 | LearnFromExecution | taskID, result, tags | string | 1m |
| 8 | DiagnoseIssue | tool, issue | []string | 1m |
| 9 | AnalyzeError | errorMsg | []KnowledgeRecord | 1m |
| 10 | DocumentDecision | type, decision, reason | string | 1m |
| 11 | SearchAndApply | query, selector | []string | 1m |
| 12 | RefreshMemory | — | map[string]interface{} | 1m |
Next Steps
- ✅ Activities defined & registered
- ✅ All 12 activities implemented
- 🔄 Deploy worker to cluster
- 🔄 Verify registration in Temporal UI
- 🔄 Use in workflows