- 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
135 lines
3.8 KiB
Go
135 lines
3.8 KiB
Go
package memory
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// ExampleActivity demonstrates memory service integration in workflows
|
|
// This can be used as a template for workflow activities
|
|
|
|
// LearnTaskActivity learns from task execution
|
|
func LearnTaskActivity(ctx context.Context, service *Service, task string, result string) error {
|
|
// Create knowledge from task result
|
|
knowledgeID, err := service.CreateKnowledge(ctx, &KnowledgeRecord{
|
|
Level: "L1",
|
|
Title: fmt.Sprintf("Task: %s", task),
|
|
Content: result,
|
|
Source: fmt.Sprintf("workflow://task/%s", task),
|
|
Metadata: map[string]interface{}{
|
|
"task": task,
|
|
"type": "execution_result",
|
|
},
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("learn task: %w", err)
|
|
}
|
|
|
|
fmt.Printf("Learned: %s\n", knowledgeID)
|
|
return nil
|
|
}
|
|
|
|
// DiagnosticActivity retrieves context for problem diagnosis
|
|
func DiagnosticActivity(ctx context.Context, service *Service, tool string, issue string) ([]string, error) {
|
|
// Retrieve context for tool/issue
|
|
svcCtx, err := service.RetrieveContext(ctx, tool, issue, 8192)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("diagnose: %w", err)
|
|
}
|
|
|
|
// Extract lessons
|
|
diagnostics := make([]string, 0)
|
|
for _, lesson := range svcCtx.Lessons {
|
|
if lesson.Tier == 1 {
|
|
diagnostics = append(diagnostics, lesson.Text)
|
|
}
|
|
}
|
|
|
|
// Extract skills
|
|
for _, skill := range svcCtx.Skills {
|
|
diagnostics = append(diagnostics, fmt.Sprintf("Skill: %s (%s)", skill.Name, skill.Why))
|
|
}
|
|
|
|
return diagnostics, nil
|
|
}
|
|
|
|
// DocumentationActivity searches vault for relevant docs
|
|
func DocumentationActivity(ctx context.Context, service *Service, topic string) ([]string, error) {
|
|
// Retrieve vault files
|
|
files, err := service.GetVault(ctx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("get vault: %w", err)
|
|
}
|
|
|
|
// Filter by topic
|
|
results := make([]string, 0)
|
|
for _, file := range files {
|
|
if file.Level == "R" { // Reference docs
|
|
results = append(results, fmt.Sprintf("%s: %s", file.Title, file.Path))
|
|
}
|
|
}
|
|
|
|
return results, nil
|
|
}
|
|
|
|
// SearchKnowledgeActivity searches knowledge base
|
|
func SearchKnowledgeActivity(ctx context.Context, service *Service, query string) ([]string, error) {
|
|
records, err := service.RetrieveKnowledge(ctx, query, &RetrievalOptions{
|
|
LevelFilter: []string{"L1", "L2"},
|
|
Limit: 5,
|
|
Floor: 0.7,
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("search: %w", err)
|
|
}
|
|
|
|
results := make([]string, 0)
|
|
for _, record := range records {
|
|
results = append(results, fmt.Sprintf("[%s] %s", record.Level, record.Content))
|
|
}
|
|
|
|
return results, nil
|
|
}
|
|
|
|
// UpdateLessonActivity updates learned facts
|
|
func UpdateLessonActivity(ctx context.Context, service *Service, id string, newContent string) error {
|
|
_, err := service.UpdateKnowledge(ctx, &KnowledgeRecord{
|
|
ID: id,
|
|
Level: "L2",
|
|
Content: newContent,
|
|
})
|
|
return err
|
|
}
|
|
|
|
// HealthCheckActivity checks memory service health
|
|
func HealthCheckActivity(ctx context.Context, service *Service) (bool, error) {
|
|
return service.IsHealthy(ctx), nil
|
|
}
|
|
|
|
// Example workflow structure using memory service
|
|
type WorkflowWithMemory struct {
|
|
MemoryService *Service
|
|
}
|
|
|
|
// ExecuteWithLearning executes task and learns from it
|
|
func (w *WorkflowWithMemory) ExecuteWithLearning(ctx context.Context, task string, executor func() (string, error)) error {
|
|
// Execute task
|
|
result, err := executor()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Learn from result
|
|
return LearnTaskActivity(ctx, w.MemoryService, task, result)
|
|
}
|
|
|
|
// DiagnoseWithContext diagnoses issue using memory context
|
|
func (w *WorkflowWithMemory) DiagnoseWithContext(ctx context.Context, tool string, issue string) ([]string, error) {
|
|
return DiagnosticActivity(ctx, w.MemoryService, tool, issue)
|
|
}
|
|
|
|
// SearchKnowledge searches knowledge
|
|
func (w *WorkflowWithMemory) SearchKnowledge(ctx context.Context, query string) ([]string, error) {
|
|
return SearchKnowledgeActivity(ctx, w.MemoryService, query)
|
|
}
|