feat(keeld): construct AW memory store, nop fallback when AW is down
This commit is contained in:
@@ -14,10 +14,12 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"keel/internal/ai"
|
"keel/internal/ai"
|
||||||
|
"keel/internal/aw"
|
||||||
"keel/internal/enforce"
|
"keel/internal/enforce"
|
||||||
"keel/internal/evidence"
|
"keel/internal/evidence"
|
||||||
"keel/internal/harness"
|
"keel/internal/harness"
|
||||||
"keel/internal/knowledge"
|
"keel/internal/knowledge"
|
||||||
|
"keel/internal/memory"
|
||||||
"keel/internal/mode"
|
"keel/internal/mode"
|
||||||
"keel/internal/mode/focus"
|
"keel/internal/mode/focus"
|
||||||
"keel/internal/mode/offscreen"
|
"keel/internal/mode/offscreen"
|
||||||
@@ -63,11 +65,28 @@ func main() {
|
|||||||
return harness.Services{}, fmt.Errorf("%w: %v", settings.ErrInvalidBackend, err)
|
return harness.Services{}, fmt.Errorf("%w: %v", settings.ErrInvalidBackend, err)
|
||||||
}
|
}
|
||||||
svc := ai.NewService(backend)
|
svc := ai.NewService(backend)
|
||||||
|
|
||||||
|
// Defend against a hand-blanked aw_url: SeedFromEnv defaults this only on
|
||||||
|
// first run, but Load returns whatever the JSON file holds on later starts.
|
||||||
|
awURL := s.AWURL
|
||||||
|
if awURL == "" {
|
||||||
|
awURL = "http://localhost:5600"
|
||||||
|
}
|
||||||
|
var mem memory.Store = memory.NewNop()
|
||||||
|
awc := aw.New(awURL)
|
||||||
|
if err := awc.EnsureBucket(context.Background(), "keel.events", "keel.event", "keel"); err != nil {
|
||||||
|
log.Printf("memory: AW unavailable at %s (%v); running without memory", awURL, err)
|
||||||
|
} else {
|
||||||
|
mem = memory.NewAWStore(awc, "keel.events")
|
||||||
|
log.Printf("memory: keel.events ready at %s", awURL)
|
||||||
|
}
|
||||||
|
|
||||||
return harness.Services{
|
return harness.Services{
|
||||||
AI: svc,
|
AI: svc,
|
||||||
Tasks: tasks.NewMarvin(s.MarvinCmd),
|
Tasks: tasks.NewMarvin(s.MarvinCmd),
|
||||||
Knowledge: knowledge.NewFileSource(s.KnowledgePath),
|
Knowledge: knowledge.NewFileSource(s.KnowledgePath),
|
||||||
Enforce: enforce.NewGuard(),
|
Enforce: enforce.NewGuard(),
|
||||||
|
Memory: mem,
|
||||||
Clock: time.Now,
|
Clock: time.Now,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,18 +6,21 @@ import (
|
|||||||
"keel/internal/ai"
|
"keel/internal/ai"
|
||||||
"keel/internal/enforce"
|
"keel/internal/enforce"
|
||||||
"keel/internal/knowledge"
|
"keel/internal/knowledge"
|
||||||
|
"keel/internal/memory"
|
||||||
"keel/internal/tasks"
|
"keel/internal/tasks"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Services is the shared infrastructure every mode receives from the harness.
|
// Services is the shared infrastructure every mode receives from the harness.
|
||||||
// Dir is the mode's namespaced persistence directory (~/.keel/modes/<kind>);
|
// Dir is the mode's namespaced persistence directory (~/.keel/modes/<kind>);
|
||||||
// modes build their own file paths under it. Notify fires the harness change
|
// modes build their own file paths under it. Notify fires the harness change
|
||||||
// listeners (web SSE + status bar).
|
// listeners (web SSE + status bar). Memory is Keel's durable cross-run event
|
||||||
|
// store (AW-backed, or a nop when AW is down).
|
||||||
type Services struct {
|
type Services struct {
|
||||||
AI *ai.Service
|
AI *ai.Service
|
||||||
Tasks tasks.Provider
|
Tasks tasks.Provider
|
||||||
Knowledge knowledge.Source
|
Knowledge knowledge.Source
|
||||||
Enforce enforce.Guard
|
Enforce enforce.Guard
|
||||||
|
Memory memory.Store
|
||||||
Clock func() time.Time
|
Clock func() time.Time
|
||||||
Dir string
|
Dir string
|
||||||
Notify func()
|
Notify func()
|
||||||
|
|||||||
Reference in New Issue
Block a user