attocode 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +67 -1
- package/README.md +65 -5
- package/dist/src/adapters.d.ts.map +1 -1
- package/dist/src/adapters.js +15 -11
- package/dist/src/adapters.js.map +1 -1
- package/dist/src/agent.d.ts +38 -98
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +505 -2892
- package/dist/src/agent.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +2 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/handler.d.ts.map +1 -1
- package/dist/src/commands/handler.js +11 -3
- package/dist/src/commands/handler.js.map +1 -1
- package/dist/src/commands/init-commands.d.ts.map +1 -1
- package/dist/src/commands/init-commands.js +16 -1
- package/dist/src/commands/init-commands.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +31 -0
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/config/base-types.d.ts +45 -0
- package/dist/src/config/base-types.d.ts.map +1 -0
- package/dist/src/config/base-types.js +9 -0
- package/dist/src/config/base-types.js.map +1 -0
- package/dist/src/config/config-manager.d.ts +35 -0
- package/dist/src/config/config-manager.d.ts.map +1 -0
- package/dist/src/config/config-manager.js +108 -0
- package/dist/src/config/config-manager.js.map +1 -0
- package/dist/src/config/index.d.ts +4 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +3 -0
- package/dist/src/config/index.js.map +1 -0
- package/dist/src/config/schema.d.ts +1546 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +268 -0
- package/dist/src/config/schema.js.map +1 -0
- package/dist/src/config.d.ts +4 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +8 -12
- package/dist/src/config.js.map +1 -1
- package/dist/src/core/agent-state-machine.d.ts +131 -0
- package/dist/src/core/agent-state-machine.d.ts.map +1 -0
- package/dist/src/core/agent-state-machine.js +302 -0
- package/dist/src/core/agent-state-machine.js.map +1 -0
- package/dist/src/core/base-manager.d.ts +79 -0
- package/dist/src/core/base-manager.d.ts.map +1 -0
- package/dist/src/core/base-manager.js +170 -0
- package/dist/src/core/base-manager.js.map +1 -0
- package/dist/src/core/completion-analyzer.d.ts +15 -0
- package/dist/src/core/completion-analyzer.d.ts.map +1 -0
- package/dist/src/core/completion-analyzer.js +53 -0
- package/dist/src/core/completion-analyzer.js.map +1 -0
- package/dist/src/core/execution-loop.d.ts +46 -0
- package/dist/src/core/execution-loop.d.ts.map +1 -0
- package/dist/src/core/execution-loop.js +1258 -0
- package/dist/src/core/execution-loop.js.map +1 -0
- package/dist/src/core/index.d.ts +7 -0
- package/dist/src/core/index.d.ts.map +1 -1
- package/dist/src/core/index.js +9 -0
- package/dist/src/core/index.js.map +1 -1
- package/dist/src/core/process-handlers.d.ts.map +1 -1
- package/dist/src/core/process-handlers.js +14 -0
- package/dist/src/core/process-handlers.js.map +1 -1
- package/dist/src/core/protocol/types.d.ts +12 -12
- package/dist/src/core/response-handler.d.ts +16 -0
- package/dist/src/core/response-handler.d.ts.map +1 -0
- package/dist/src/core/response-handler.js +234 -0
- package/dist/src/core/response-handler.js.map +1 -0
- package/dist/src/core/subagent-spawner.d.ts +43 -0
- package/dist/src/core/subagent-spawner.d.ts.map +1 -0
- package/dist/src/core/subagent-spawner.js +966 -0
- package/dist/src/core/subagent-spawner.js.map +1 -0
- package/dist/src/core/tool-executor.d.ts +59 -0
- package/dist/src/core/tool-executor.d.ts.map +1 -0
- package/dist/src/core/tool-executor.js +677 -0
- package/dist/src/core/tool-executor.js.map +1 -0
- package/dist/src/core/types.d.ts +133 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +12 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/defaults.d.ts +2 -2
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +29 -1
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
- package/dist/src/integrations/auto-compaction.js +3 -2
- package/dist/src/integrations/auto-compaction.js.map +1 -1
- package/dist/src/integrations/budget-pool.d.ts +7 -0
- package/dist/src/integrations/budget-pool.d.ts.map +1 -1
- package/dist/src/integrations/budget-pool.js +43 -0
- package/dist/src/integrations/budget-pool.js.map +1 -1
- package/dist/src/integrations/codebase-ast.d.ts +52 -0
- package/dist/src/integrations/codebase-ast.d.ts.map +1 -0
- package/dist/src/integrations/codebase-ast.js +457 -0
- package/dist/src/integrations/codebase-ast.js.map +1 -0
- package/dist/src/integrations/codebase-context.d.ts +18 -0
- package/dist/src/integrations/codebase-context.d.ts.map +1 -1
- package/dist/src/integrations/codebase-context.js +197 -17
- package/dist/src/integrations/codebase-context.js.map +1 -1
- package/dist/src/integrations/compaction.d.ts.map +1 -1
- package/dist/src/integrations/compaction.js +14 -6
- package/dist/src/integrations/compaction.js.map +1 -1
- package/dist/src/integrations/context-engineering.d.ts +8 -0
- package/dist/src/integrations/context-engineering.d.ts.map +1 -1
- package/dist/src/integrations/context-engineering.js +19 -0
- package/dist/src/integrations/context-engineering.js.map +1 -1
- package/dist/src/integrations/economics.d.ts +25 -1
- package/dist/src/integrations/economics.d.ts.map +1 -1
- package/dist/src/integrations/economics.js +217 -38
- package/dist/src/integrations/economics.js.map +1 -1
- package/dist/src/integrations/edit-validator.d.ts +30 -0
- package/dist/src/integrations/edit-validator.d.ts.map +1 -0
- package/dist/src/integrations/edit-validator.js +85 -0
- package/dist/src/integrations/edit-validator.js.map +1 -0
- package/dist/src/integrations/file-cache.d.ts +7 -0
- package/dist/src/integrations/file-cache.d.ts.map +1 -1
- package/dist/src/integrations/file-cache.js +54 -0
- package/dist/src/integrations/file-cache.js.map +1 -1
- package/dist/src/integrations/health-check.d.ts.map +1 -1
- package/dist/src/integrations/health-check.js +3 -2
- package/dist/src/integrations/health-check.js.map +1 -1
- package/dist/src/integrations/hierarchical-config.d.ts +3 -0
- package/dist/src/integrations/hierarchical-config.d.ts.map +1 -1
- package/dist/src/integrations/hierarchical-config.js +3 -0
- package/dist/src/integrations/hierarchical-config.js.map +1 -1
- package/dist/src/integrations/hooks.d.ts +2 -0
- package/dist/src/integrations/hooks.d.ts.map +1 -1
- package/dist/src/integrations/hooks.js +99 -15
- package/dist/src/integrations/hooks.js.map +1 -1
- package/dist/src/integrations/index.d.ts +7 -0
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +9 -1
- package/dist/src/integrations/index.js.map +1 -1
- package/dist/src/integrations/logger.d.ts +104 -0
- package/dist/src/integrations/logger.d.ts.map +1 -0
- package/dist/src/integrations/logger.js +219 -0
- package/dist/src/integrations/logger.js.map +1 -0
- package/dist/src/integrations/lsp.d.ts.map +1 -1
- package/dist/src/integrations/lsp.js +5 -4
- package/dist/src/integrations/lsp.js.map +1 -1
- package/dist/src/integrations/mcp-client.d.ts.map +1 -1
- package/dist/src/integrations/mcp-client.js +8 -7
- package/dist/src/integrations/mcp-client.js.map +1 -1
- package/dist/src/integrations/observability.d.ts.map +1 -1
- package/dist/src/integrations/observability.js +5 -4
- package/dist/src/integrations/observability.js.map +1 -1
- package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -1
- package/dist/src/integrations/openrouter-pricing.js +4 -3
- package/dist/src/integrations/openrouter-pricing.js.map +1 -1
- package/dist/src/integrations/persistence.d.ts.map +1 -1
- package/dist/src/integrations/persistence.js +5 -4
- package/dist/src/integrations/persistence.js.map +1 -1
- package/dist/src/integrations/planning.d.ts.map +1 -1
- package/dist/src/integrations/planning.js +5 -4
- package/dist/src/integrations/planning.js.map +1 -1
- package/dist/src/integrations/retry.d.ts +1 -0
- package/dist/src/integrations/retry.d.ts.map +1 -1
- package/dist/src/integrations/retry.js.map +1 -1
- package/dist/src/integrations/routing.d.ts.map +1 -1
- package/dist/src/integrations/routing.js +2 -1
- package/dist/src/integrations/routing.js.map +1 -1
- package/dist/src/integrations/safety.d.ts.map +1 -1
- package/dist/src/integrations/safety.js +13 -13
- package/dist/src/integrations/safety.js.map +1 -1
- package/dist/src/integrations/sandbox/docker.d.ts.map +1 -1
- package/dist/src/integrations/sandbox/docker.js +2 -1
- package/dist/src/integrations/sandbox/docker.js.map +1 -1
- package/dist/src/integrations/sandbox/index.d.ts.map +1 -1
- package/dist/src/integrations/sandbox/index.js +5 -4
- package/dist/src/integrations/sandbox/index.js.map +1 -1
- package/dist/src/integrations/session-store.d.ts +1 -0
- package/dist/src/integrations/session-store.d.ts.map +1 -1
- package/dist/src/integrations/session-store.js +1 -0
- package/dist/src/integrations/session-store.js.map +1 -1
- package/dist/src/integrations/shared-blackboard.d.ts +3 -0
- package/dist/src/integrations/shared-blackboard.d.ts.map +1 -1
- package/dist/src/integrations/shared-blackboard.js +47 -0
- package/dist/src/integrations/shared-blackboard.js.map +1 -1
- package/dist/src/integrations/smart-decomposer.d.ts +27 -0
- package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
- package/dist/src/integrations/smart-decomposer.js +414 -30
- package/dist/src/integrations/smart-decomposer.js.map +1 -1
- package/dist/src/integrations/sqlite-store.d.ts +2 -0
- package/dist/src/integrations/sqlite-store.d.ts.map +1 -1
- package/dist/src/integrations/sqlite-store.js +18 -6
- package/dist/src/integrations/sqlite-store.js.map +1 -1
- package/dist/src/integrations/swarm/failure-classifier.d.ts +11 -0
- package/dist/src/integrations/swarm/failure-classifier.d.ts.map +1 -0
- package/dist/src/integrations/swarm/failure-classifier.js +95 -0
- package/dist/src/integrations/swarm/failure-classifier.js.map +1 -0
- package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
- package/dist/src/integrations/swarm/model-selector.js +2 -1
- package/dist/src/integrations/swarm/model-selector.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-config-loader.d.ts +8 -0
- package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-config-loader.js +95 -0
- package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-event-bridge.d.ts +74 -0
- package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-event-bridge.js +37 -0
- package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-events.d.ts +3 -0
- package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-events.js +1 -1
- package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +23 -0
- package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-orchestrator.js +530 -55
- package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-state-store.d.ts +4 -1
- package/dist/src/integrations/swarm/swarm-state-store.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-state-store.js +8 -1
- package/dist/src/integrations/swarm/swarm-state-store.js.map +1 -1
- package/dist/src/integrations/swarm/task-queue.d.ts +10 -0
- package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
- package/dist/src/integrations/swarm/task-queue.js +36 -1
- package/dist/src/integrations/swarm/task-queue.js.map +1 -1
- package/dist/src/integrations/swarm/types.d.ts +41 -0
- package/dist/src/integrations/swarm/types.d.ts.map +1 -1
- package/dist/src/integrations/swarm/types.js +9 -0
- package/dist/src/integrations/swarm/types.js.map +1 -1
- package/dist/src/integrations/swarm/worker-pool.d.ts +12 -2
- package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
- package/dist/src/integrations/swarm/worker-pool.js +53 -4
- package/dist/src/integrations/swarm/worker-pool.js.map +1 -1
- package/dist/src/integrations/task-manager.d.ts +33 -1
- package/dist/src/integrations/task-manager.d.ts.map +1 -1
- package/dist/src/integrations/task-manager.js +78 -4
- package/dist/src/integrations/task-manager.js.map +1 -1
- package/dist/src/main.js +83 -32
- package/dist/src/main.js.map +1 -1
- package/dist/src/modes/repl.d.ts.map +1 -1
- package/dist/src/modes/repl.js +40 -8
- package/dist/src/modes/repl.js.map +1 -1
- package/dist/src/modes/tui.d.ts.map +1 -1
- package/dist/src/modes/tui.js +36 -6
- package/dist/src/modes/tui.js.map +1 -1
- package/dist/src/observability/tracer.d.ts.map +1 -1
- package/dist/src/observability/tracer.js +2 -1
- package/dist/src/observability/tracer.js.map +1 -1
- package/dist/src/persistence/schema.d.ts.map +1 -1
- package/dist/src/persistence/schema.js +11 -0
- package/dist/src/persistence/schema.js.map +1 -1
- package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
- package/dist/src/providers/adapters/anthropic.js +3 -2
- package/dist/src/providers/adapters/anthropic.js.map +1 -1
- package/dist/src/providers/adapters/openai.d.ts.map +1 -1
- package/dist/src/providers/adapters/openai.js +3 -2
- package/dist/src/providers/adapters/openai.js.map +1 -1
- package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
- package/dist/src/providers/adapters/openrouter.js +11 -11
- package/dist/src/providers/adapters/openrouter.js.map +1 -1
- package/dist/src/providers/circuit-breaker.d.ts +1 -0
- package/dist/src/providers/circuit-breaker.d.ts.map +1 -1
- package/dist/src/providers/circuit-breaker.js.map +1 -1
- package/dist/src/providers/provider.d.ts.map +1 -1
- package/dist/src/providers/provider.js +2 -1
- package/dist/src/providers/provider.js.map +1 -1
- package/dist/src/providers/resilient-provider.d.ts.map +1 -1
- package/dist/src/providers/resilient-provider.js +2 -1
- package/dist/src/providers/resilient-provider.js.map +1 -1
- package/dist/src/session-picker.d.ts.map +1 -1
- package/dist/src/session-picker.js +40 -5
- package/dist/src/session-picker.js.map +1 -1
- package/dist/src/shared/budget-tracker.d.ts +65 -0
- package/dist/src/shared/budget-tracker.d.ts.map +1 -0
- package/dist/src/shared/budget-tracker.js +128 -0
- package/dist/src/shared/budget-tracker.js.map +1 -0
- package/dist/src/shared/context-engine.d.ts +64 -0
- package/dist/src/shared/context-engine.d.ts.map +1 -0
- package/dist/src/shared/context-engine.js +117 -0
- package/dist/src/shared/context-engine.js.map +1 -0
- package/dist/src/shared/index.d.ts +12 -0
- package/dist/src/shared/index.d.ts.map +1 -0
- package/dist/src/shared/index.js +12 -0
- package/dist/src/shared/index.js.map +1 -0
- package/dist/src/shared/persistence.d.ts +57 -0
- package/dist/src/shared/persistence.d.ts.map +1 -0
- package/dist/src/shared/persistence.js +168 -0
- package/dist/src/shared/persistence.js.map +1 -0
- package/dist/src/shared/shared-context-state.d.ts +89 -0
- package/dist/src/shared/shared-context-state.d.ts.map +1 -0
- package/dist/src/shared/shared-context-state.js +175 -0
- package/dist/src/shared/shared-context-state.js.map +1 -0
- package/dist/src/shared/shared-economics-state.d.ts +61 -0
- package/dist/src/shared/shared-economics-state.d.ts.map +1 -0
- package/dist/src/shared/shared-economics-state.js +100 -0
- package/dist/src/shared/shared-economics-state.js.map +1 -0
- package/dist/src/tools/bash.d.ts +3 -3
- package/dist/src/tools/bash.d.ts.map +1 -1
- package/dist/src/tools/bash.js +2 -1
- package/dist/src/tools/bash.js.map +1 -1
- package/dist/src/tools/file.d.ts +3 -3
- package/dist/src/tools/permission.d.ts.map +1 -1
- package/dist/src/tools/permission.js +6 -5
- package/dist/src/tools/permission.js.map +1 -1
- package/dist/src/tools/types.d.ts +1 -0
- package/dist/src/tools/types.d.ts.map +1 -1
- package/dist/src/tools/types.js.map +1 -1
- package/dist/src/tracing/trace-collector.d.ts +125 -0
- package/dist/src/tracing/trace-collector.d.ts.map +1 -1
- package/dist/src/tracing/trace-collector.js +112 -5
- package/dist/src/tracing/trace-collector.js.map +1 -1
- package/dist/src/tracing/types.d.ts +96 -1
- package/dist/src/tracing/types.d.ts.map +1 -1
- package/dist/src/tracing/types.js.map +1 -1
- package/dist/src/tricks/failure-evidence.d.ts.map +1 -1
- package/dist/src/tricks/failure-evidence.js +2 -1
- package/dist/src/tricks/failure-evidence.js.map +1 -1
- package/dist/src/tui/app.d.ts +13 -0
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +129 -15
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/components/ErrorBoundary.d.ts.map +1 -1
- package/dist/src/tui/components/ErrorBoundary.js +3 -2
- package/dist/src/tui/components/ErrorBoundary.js.map +1 -1
- package/dist/src/tui/event-display.d.ts.map +1 -1
- package/dist/src/tui/event-display.js +36 -62
- package/dist/src/tui/event-display.js.map +1 -1
- package/dist/src/tui/index.d.ts +4 -0
- package/dist/src/tui/index.d.ts.map +1 -1
- package/dist/src/tui/index.js +17 -0
- package/dist/src/tui/index.js.map +1 -1
- package/dist/src/types.d.ts +143 -1
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +18 -3
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Budget Tracker (Phase 3.2 completion)
|
|
3
|
+
*
|
|
4
|
+
* Lightweight per-worker budget + doom-loop tracker that reports to
|
|
5
|
+
* SharedEconomicsState for cross-worker doom loop aggregation.
|
|
6
|
+
*/
|
|
7
|
+
import { computeToolFingerprint } from '../integrations/economics.js';
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// WORKER BUDGET TRACKER
|
|
10
|
+
// =============================================================================
|
|
11
|
+
export class WorkerBudgetTracker {
|
|
12
|
+
workerId;
|
|
13
|
+
maxTokens;
|
|
14
|
+
maxIterations;
|
|
15
|
+
doomLoopThreshold;
|
|
16
|
+
inputTokens = 0;
|
|
17
|
+
outputTokens = 0;
|
|
18
|
+
iterations = 0;
|
|
19
|
+
toolCalls = [];
|
|
20
|
+
sharedEconomics;
|
|
21
|
+
constructor(config, sharedEconomics) {
|
|
22
|
+
this.workerId = config.workerId;
|
|
23
|
+
this.maxTokens = config.maxTokens;
|
|
24
|
+
this.maxIterations = config.maxIterations;
|
|
25
|
+
this.doomLoopThreshold = config.doomLoopThreshold ?? 3;
|
|
26
|
+
this.sharedEconomics = sharedEconomics;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Record LLM token usage.
|
|
30
|
+
*/
|
|
31
|
+
recordLLMUsage(inputTokens, outputTokens) {
|
|
32
|
+
this.inputTokens += inputTokens;
|
|
33
|
+
this.outputTokens += outputTokens;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Record a completed iteration.
|
|
37
|
+
*/
|
|
38
|
+
recordIteration() {
|
|
39
|
+
this.iterations++;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Record a tool call. Computes fingerprint and reports to SharedEconomicsState.
|
|
43
|
+
*/
|
|
44
|
+
recordToolCall(toolName, args) {
|
|
45
|
+
const fingerprint = computeToolFingerprint(toolName, args);
|
|
46
|
+
this.toolCalls.push({ fingerprint, timestamp: Date.now() });
|
|
47
|
+
// Report to shared economics for cross-worker doom loop detection
|
|
48
|
+
if (this.sharedEconomics) {
|
|
49
|
+
this.sharedEconomics.recordToolCall(this.workerId, fingerprint);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if the worker can continue within budget.
|
|
54
|
+
*/
|
|
55
|
+
checkBudget() {
|
|
56
|
+
// Token budget
|
|
57
|
+
const totalTokens = this.inputTokens + this.outputTokens;
|
|
58
|
+
if (totalTokens >= this.maxTokens) {
|
|
59
|
+
return {
|
|
60
|
+
canContinue: false,
|
|
61
|
+
reason: `Token budget exhausted: ${totalTokens.toLocaleString()} / ${this.maxTokens.toLocaleString()}`,
|
|
62
|
+
budgetType: 'tokens',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
// Iteration budget
|
|
66
|
+
if (this.iterations >= this.maxIterations) {
|
|
67
|
+
return {
|
|
68
|
+
canContinue: false,
|
|
69
|
+
reason: `Iteration budget exhausted: ${this.iterations} / ${this.maxIterations}`,
|
|
70
|
+
budgetType: 'iterations',
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Local doom loop detection (consecutive identical tool calls)
|
|
74
|
+
if (this.toolCalls.length >= this.doomLoopThreshold) {
|
|
75
|
+
const recent = this.toolCalls.slice(-this.doomLoopThreshold);
|
|
76
|
+
const allSame = recent.every(tc => tc.fingerprint === recent[0].fingerprint);
|
|
77
|
+
if (allSame) {
|
|
78
|
+
return {
|
|
79
|
+
canContinue: false,
|
|
80
|
+
reason: `Doom loop detected: ${this.doomLoopThreshold} consecutive identical tool calls`,
|
|
81
|
+
budgetType: 'doom_loop',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Cross-worker doom loop detection via SharedEconomicsState
|
|
86
|
+
if (this.sharedEconomics && this.toolCalls.length > 0) {
|
|
87
|
+
const lastFingerprint = this.toolCalls[this.toolCalls.length - 1].fingerprint;
|
|
88
|
+
if (this.sharedEconomics.isGlobalDoomLoop(lastFingerprint)) {
|
|
89
|
+
const info = this.sharedEconomics.getGlobalLoopInfo(lastFingerprint);
|
|
90
|
+
return {
|
|
91
|
+
canContinue: false,
|
|
92
|
+
reason: `Global doom loop: ${info?.count ?? 0} calls across ${info?.workerCount ?? 0} workers`,
|
|
93
|
+
budgetType: 'doom_loop',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { canContinue: true };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get current usage stats.
|
|
101
|
+
*/
|
|
102
|
+
getUsage() {
|
|
103
|
+
return {
|
|
104
|
+
inputTokens: this.inputTokens,
|
|
105
|
+
outputTokens: this.outputTokens,
|
|
106
|
+
totalTokens: this.inputTokens + this.outputTokens,
|
|
107
|
+
iterations: this.iterations,
|
|
108
|
+
toolCalls: this.toolCalls.length,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get budget utilization as a percentage (0-100).
|
|
113
|
+
*/
|
|
114
|
+
getUtilization() {
|
|
115
|
+
const totalTokens = this.inputTokens + this.outputTokens;
|
|
116
|
+
return {
|
|
117
|
+
tokenPercent: this.maxTokens > 0 ? Math.round((totalTokens / this.maxTokens) * 100) : 0,
|
|
118
|
+
iterationPercent: this.maxIterations > 0 ? Math.round((this.iterations / this.maxIterations) * 100) : 0,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// =============================================================================
|
|
123
|
+
// FACTORY
|
|
124
|
+
// =============================================================================
|
|
125
|
+
export function createWorkerBudgetTracker(config, sharedEconomics) {
|
|
126
|
+
return new WorkerBudgetTracker(config, sharedEconomics);
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=budget-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget-tracker.js","sourceRoot":"","sources":["../../../src/shared/budget-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Context Engine (Phase 3.1)
|
|
3
|
+
*
|
|
4
|
+
* Orchestration layer that composes SharedContextState primitives into
|
|
5
|
+
* worker-optimized prompts. Workers get a single buildWorkerSystemPrompt()
|
|
6
|
+
* call instead of manually assembling prefix + failures + recitation.
|
|
7
|
+
*/
|
|
8
|
+
import type { SharedContextState } from './shared-context-state.js';
|
|
9
|
+
import type { FailureInput, Failure } from '../tricks/failure-evidence.js';
|
|
10
|
+
import type { Reference } from '../tricks/reversible-compaction.js';
|
|
11
|
+
export interface SharedContextEngineConfig {
|
|
12
|
+
/** Maximum failures to include in worker prompts (default: 5) */
|
|
13
|
+
maxFailuresInPrompt?: number;
|
|
14
|
+
/** Whether to include cross-worker insights (default: true) */
|
|
15
|
+
includeInsights?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface WorkerTask {
|
|
18
|
+
/** Unique task ID */
|
|
19
|
+
id: string;
|
|
20
|
+
/** Human-readable task description */
|
|
21
|
+
description: string;
|
|
22
|
+
/** The specific goal this worker should accomplish */
|
|
23
|
+
goal: string;
|
|
24
|
+
/** IDs of tasks this depends on */
|
|
25
|
+
dependencies?: string[];
|
|
26
|
+
/** Additional context for this specific task */
|
|
27
|
+
context?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class SharedContextEngine {
|
|
30
|
+
private contextState;
|
|
31
|
+
private maxFailuresInPrompt;
|
|
32
|
+
private includeInsights;
|
|
33
|
+
constructor(contextState: SharedContextState, config?: SharedContextEngineConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Build a complete system prompt for a worker.
|
|
36
|
+
* Concatenates: shared prefix → task context → failure guidance → goal recitation.
|
|
37
|
+
* Empty sections are omitted.
|
|
38
|
+
*/
|
|
39
|
+
buildWorkerSystemPrompt(task: WorkerTask): string;
|
|
40
|
+
/**
|
|
41
|
+
* Get the shared static prefix for KV-cache alignment.
|
|
42
|
+
*/
|
|
43
|
+
getSharedPrefix(): string;
|
|
44
|
+
/**
|
|
45
|
+
* Report a failure from a worker. Delegates to SharedContextState.
|
|
46
|
+
*/
|
|
47
|
+
reportFailure(workerId: string, failure: FailureInput): Failure;
|
|
48
|
+
/**
|
|
49
|
+
* Get formatted failure guidance for inclusion in prompts.
|
|
50
|
+
* Returns empty string when no failures exist.
|
|
51
|
+
*/
|
|
52
|
+
getFailureGuidance(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Get a goal recitation block for a worker task.
|
|
55
|
+
*/
|
|
56
|
+
getGoalRecitation(task: WorkerTask): string;
|
|
57
|
+
/**
|
|
58
|
+
* Search for relevant references. Delegates to SharedContextState.
|
|
59
|
+
*/
|
|
60
|
+
getRelevantReferences(query: string): Reference[];
|
|
61
|
+
private buildTaskSection;
|
|
62
|
+
}
|
|
63
|
+
export declare function createSharedContextEngine(contextState: SharedContextState, config?: SharedContextEngineConfig): SharedContextEngine;
|
|
64
|
+
//# sourceMappingURL=context-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-engine.d.ts","sourceRoot":"","sources":["../../../src/shared/context-engine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAMpE,MAAM,WAAW,yBAAyB;IACxC,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,eAAe,CAAU;gBAG/B,YAAY,EAAE,kBAAkB,EAChC,MAAM,GAAE,yBAA8B;IAOxC;;;;OAIG;IACH,uBAAuB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IA8BjD;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/D;;;OAGG;IACH,kBAAkB,IAAI,MAAM;IAkB5B;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAc3C;;OAEG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAQjD,OAAO,CAAC,gBAAgB;CAWzB;AAMD,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,kBAAkB,EAChC,MAAM,CAAC,EAAE,yBAAyB,GACjC,mBAAmB,CAErB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Context Engine (Phase 3.1)
|
|
3
|
+
*
|
|
4
|
+
* Orchestration layer that composes SharedContextState primitives into
|
|
5
|
+
* worker-optimized prompts. Workers get a single buildWorkerSystemPrompt()
|
|
6
|
+
* call instead of manually assembling prefix + failures + recitation.
|
|
7
|
+
*/
|
|
8
|
+
// =============================================================================
|
|
9
|
+
// SHARED CONTEXT ENGINE
|
|
10
|
+
// =============================================================================
|
|
11
|
+
export class SharedContextEngine {
|
|
12
|
+
contextState;
|
|
13
|
+
maxFailuresInPrompt;
|
|
14
|
+
includeInsights;
|
|
15
|
+
constructor(contextState, config = {}) {
|
|
16
|
+
this.contextState = contextState;
|
|
17
|
+
this.maxFailuresInPrompt = config.maxFailuresInPrompt ?? 5;
|
|
18
|
+
this.includeInsights = config.includeInsights ?? true;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build a complete system prompt for a worker.
|
|
22
|
+
* Concatenates: shared prefix → task context → failure guidance → goal recitation.
|
|
23
|
+
* Empty sections are omitted.
|
|
24
|
+
*/
|
|
25
|
+
buildWorkerSystemPrompt(task) {
|
|
26
|
+
const sections = [];
|
|
27
|
+
// 1. Shared prefix (cache-aligned, identical for all workers)
|
|
28
|
+
const prefix = this.getSharedPrefix();
|
|
29
|
+
if (prefix) {
|
|
30
|
+
sections.push(prefix);
|
|
31
|
+
}
|
|
32
|
+
// 2. Task context
|
|
33
|
+
const taskSection = this.buildTaskSection(task);
|
|
34
|
+
if (taskSection) {
|
|
35
|
+
sections.push(taskSection);
|
|
36
|
+
}
|
|
37
|
+
// 3. Failure guidance
|
|
38
|
+
const failureGuidance = this.getFailureGuidance();
|
|
39
|
+
if (failureGuidance) {
|
|
40
|
+
sections.push(failureGuidance);
|
|
41
|
+
}
|
|
42
|
+
// 4. Goal recitation
|
|
43
|
+
const goalRecitation = this.getGoalRecitation(task);
|
|
44
|
+
if (goalRecitation) {
|
|
45
|
+
sections.push(goalRecitation);
|
|
46
|
+
}
|
|
47
|
+
return sections.join('\n\n');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the shared static prefix for KV-cache alignment.
|
|
51
|
+
*/
|
|
52
|
+
getSharedPrefix() {
|
|
53
|
+
return this.contextState.getStaticPrefix();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Report a failure from a worker. Delegates to SharedContextState.
|
|
57
|
+
*/
|
|
58
|
+
reportFailure(workerId, failure) {
|
|
59
|
+
return this.contextState.recordFailure(workerId, failure);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get formatted failure guidance for inclusion in prompts.
|
|
63
|
+
* Returns empty string when no failures exist.
|
|
64
|
+
*/
|
|
65
|
+
getFailureGuidance() {
|
|
66
|
+
const parts = [];
|
|
67
|
+
const failureContext = this.contextState.getFailureContext(this.maxFailuresInPrompt);
|
|
68
|
+
if (failureContext) {
|
|
69
|
+
parts.push(failureContext);
|
|
70
|
+
}
|
|
71
|
+
if (this.includeInsights) {
|
|
72
|
+
const insights = this.contextState.getFailureInsights();
|
|
73
|
+
if (insights.length > 0) {
|
|
74
|
+
parts.push('## Cross-Worker Insights\n' + insights.map(i => `- ${i}`).join('\n'));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return parts.join('\n\n');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get a goal recitation block for a worker task.
|
|
81
|
+
*/
|
|
82
|
+
getGoalRecitation(task) {
|
|
83
|
+
const lines = [
|
|
84
|
+
'## Current Goal',
|
|
85
|
+
`**Task:** ${task.description}`,
|
|
86
|
+
`**Goal:** ${task.goal}`,
|
|
87
|
+
];
|
|
88
|
+
if (task.dependencies && task.dependencies.length > 0) {
|
|
89
|
+
lines.push(`**Depends on:** ${task.dependencies.join(', ')}`);
|
|
90
|
+
}
|
|
91
|
+
return lines.join('\n');
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Search for relevant references. Delegates to SharedContextState.
|
|
95
|
+
*/
|
|
96
|
+
getRelevantReferences(query) {
|
|
97
|
+
return this.contextState.searchReferences(query);
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// Private helpers
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
buildTaskSection(task) {
|
|
103
|
+
const parts = ['## Task Assignment'];
|
|
104
|
+
parts.push(`You are working on task **${task.id}**: ${task.description}`);
|
|
105
|
+
if (task.context) {
|
|
106
|
+
parts.push(`\n### Additional Context\n${task.context}`);
|
|
107
|
+
}
|
|
108
|
+
return parts.join('\n');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// =============================================================================
|
|
112
|
+
// FACTORY
|
|
113
|
+
// =============================================================================
|
|
114
|
+
export function createSharedContextEngine(contextState, config) {
|
|
115
|
+
return new SharedContextEngine(contextState, config);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=context-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-engine.js","sourceRoot":"","sources":["../../../src/shared/context-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared State Modules
|
|
3
|
+
*
|
|
4
|
+
* Thin shared-state layers that swarm workers plug into for
|
|
5
|
+
* cross-worker failure learning, reference pooling, and doom loop aggregation.
|
|
6
|
+
*/
|
|
7
|
+
export { SharedContextState, createSharedContextState, type SharedContextConfig, } from './shared-context-state.js';
|
|
8
|
+
export { SharedEconomicsState, createSharedEconomicsState, type SharedEconomicsConfig, } from './shared-economics-state.js';
|
|
9
|
+
export { type PersistenceAdapter, JSONFilePersistenceAdapter, SQLitePersistenceAdapter, createPersistenceAdapter, } from './persistence.js';
|
|
10
|
+
export { SharedContextEngine, createSharedContextEngine, type SharedContextEngineConfig, type WorkerTask, } from './context-engine.js';
|
|
11
|
+
export { WorkerBudgetTracker, createWorkerBudgetTracker, type WorkerBudgetConfig, type WorkerBudgetCheckResult, } from './budget-tracker.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,mBAAmB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,KAAK,kBAAkB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,yBAAyB,EAC9B,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared State Modules
|
|
3
|
+
*
|
|
4
|
+
* Thin shared-state layers that swarm workers plug into for
|
|
5
|
+
* cross-worker failure learning, reference pooling, and doom loop aggregation.
|
|
6
|
+
*/
|
|
7
|
+
export { SharedContextState, createSharedContextState, } from './shared-context-state.js';
|
|
8
|
+
export { SharedEconomicsState, createSharedEconomicsState, } from './shared-economics-state.js';
|
|
9
|
+
export { JSONFilePersistenceAdapter, SQLitePersistenceAdapter, createPersistenceAdapter, } from './persistence.js';
|
|
10
|
+
export { SharedContextEngine, createSharedContextEngine, } from './context-engine.js';
|
|
11
|
+
export { WorkerBudgetTracker, createWorkerBudgetTracker, } from './budget-tracker.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAE3B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAEL,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAG1B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,GAG1B,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Persistence Adapters
|
|
3
|
+
*
|
|
4
|
+
* Thin interface over different storage backends (JSON files, SQLite).
|
|
5
|
+
* Provides a common API for save/load/list/delete operations.
|
|
6
|
+
*
|
|
7
|
+
* Existing stores (SQLiteStore, SwarmStateStore) continue unchanged.
|
|
8
|
+
* These adapters are opt-in wrappers for unified access patterns.
|
|
9
|
+
*/
|
|
10
|
+
export interface PersistenceAdapter {
|
|
11
|
+
/** Save data under a key within a namespace */
|
|
12
|
+
save(namespace: string, key: string, data: unknown): Promise<void>;
|
|
13
|
+
/** Load data by namespace + key */
|
|
14
|
+
load(namespace: string, key: string): Promise<unknown | null>;
|
|
15
|
+
/** List all keys in a namespace */
|
|
16
|
+
list(namespace: string): Promise<string[]>;
|
|
17
|
+
/** Delete a key */
|
|
18
|
+
delete(namespace: string, key: string): Promise<boolean>;
|
|
19
|
+
/** Check if a key exists */
|
|
20
|
+
exists(namespace: string, key: string): Promise<boolean>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* JSON file-based persistence.
|
|
24
|
+
* Each namespace is a directory, each key is a JSON file.
|
|
25
|
+
*/
|
|
26
|
+
export declare class JSONFilePersistenceAdapter implements PersistenceAdapter {
|
|
27
|
+
private baseDir;
|
|
28
|
+
constructor(baseDir: string);
|
|
29
|
+
private keyPath;
|
|
30
|
+
private nsDir;
|
|
31
|
+
save(namespace: string, key: string, data: unknown): Promise<void>;
|
|
32
|
+
load(namespace: string, key: string): Promise<unknown | null>;
|
|
33
|
+
list(namespace: string): Promise<string[]>;
|
|
34
|
+
delete(namespace: string, key: string): Promise<boolean>;
|
|
35
|
+
exists(namespace: string, key: string): Promise<boolean>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* SQLite-based persistence.
|
|
39
|
+
* Uses a generic key-value table with namespace partitioning.
|
|
40
|
+
*/
|
|
41
|
+
export declare class SQLitePersistenceAdapter implements PersistenceAdapter {
|
|
42
|
+
private db;
|
|
43
|
+
constructor(dbPath: string);
|
|
44
|
+
save(namespace: string, key: string, data: unknown): Promise<void>;
|
|
45
|
+
load(namespace: string, key: string): Promise<unknown | null>;
|
|
46
|
+
list(namespace: string): Promise<string[]>;
|
|
47
|
+
delete(namespace: string, key: string): Promise<boolean>;
|
|
48
|
+
exists(namespace: string, key: string): Promise<boolean>;
|
|
49
|
+
/** Close the database connection */
|
|
50
|
+
close(): void;
|
|
51
|
+
}
|
|
52
|
+
/** Create a persistence adapter of the given type */
|
|
53
|
+
export declare function createPersistenceAdapter(type: 'json' | 'sqlite', config: {
|
|
54
|
+
baseDir?: string;
|
|
55
|
+
dbPath?: string;
|
|
56
|
+
}): PersistenceAdapter;
|
|
57
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../../src/shared/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkCH,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,mCAAmC;IACnC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC9D,mCAAmC;IACnC,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,mBAAmB;IACnB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,4BAA4B;IAC5B,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAMD;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,kBAAkB;IACvD,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAEnC,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IAIP,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAS7D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAW1C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASxD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ/D;AAgBD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,kBAAkB;IACjE,OAAO,CAAC,EAAE,CAAgC;gBAE9B,MAAM,EAAE,MAAM;IAMpB,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASlE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAQ7D,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAO1C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOxD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS9D,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAGd;AAMD,qDAAqD;AACrD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GAAG,QAAQ,EACvB,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,kBAAkB,CAOpB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Persistence Adapters
|
|
3
|
+
*
|
|
4
|
+
* Thin interface over different storage backends (JSON files, SQLite).
|
|
5
|
+
* Provides a common API for save/load/list/delete operations.
|
|
6
|
+
*
|
|
7
|
+
* Existing stores (SQLiteStore, SwarmStateStore) continue unchanged.
|
|
8
|
+
* These adapters are opt-in wrappers for unified access patterns.
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'node:fs/promises';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import Database from 'better-sqlite3';
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// MAP SERIALIZATION (reused from swarm-state-store pattern)
|
|
15
|
+
// =============================================================================
|
|
16
|
+
/** JSON replacer that serializes Maps as { __type: 'Map', entries: [...] } */
|
|
17
|
+
function mapReplacer(_key, value) {
|
|
18
|
+
if (value instanceof Map) {
|
|
19
|
+
return { __type: 'Map', entries: [...value.entries()] };
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
/** JSON reviver that deserializes Maps from { __type: 'Map', entries: [...] } */
|
|
24
|
+
function mapReviver(_key, value) {
|
|
25
|
+
if (value &&
|
|
26
|
+
typeof value === 'object' &&
|
|
27
|
+
value.__type === 'Map') {
|
|
28
|
+
return new Map(value.entries);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
// =============================================================================
|
|
33
|
+
// JSON FILE ADAPTER
|
|
34
|
+
// =============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* JSON file-based persistence.
|
|
37
|
+
* Each namespace is a directory, each key is a JSON file.
|
|
38
|
+
*/
|
|
39
|
+
export class JSONFilePersistenceAdapter {
|
|
40
|
+
baseDir;
|
|
41
|
+
constructor(baseDir) {
|
|
42
|
+
this.baseDir = baseDir;
|
|
43
|
+
}
|
|
44
|
+
keyPath(namespace, key) {
|
|
45
|
+
return path.join(this.baseDir, namespace, `${key}.json`);
|
|
46
|
+
}
|
|
47
|
+
nsDir(namespace) {
|
|
48
|
+
return path.join(this.baseDir, namespace);
|
|
49
|
+
}
|
|
50
|
+
async save(namespace, key, data) {
|
|
51
|
+
const filePath = this.keyPath(namespace, key);
|
|
52
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
53
|
+
await fs.writeFile(filePath, JSON.stringify(data, mapReplacer, 2));
|
|
54
|
+
}
|
|
55
|
+
async load(namespace, key) {
|
|
56
|
+
try {
|
|
57
|
+
const content = await fs.readFile(this.keyPath(namespace, key), 'utf-8');
|
|
58
|
+
return JSON.parse(content, mapReviver);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async list(namespace) {
|
|
65
|
+
try {
|
|
66
|
+
const entries = await fs.readdir(this.nsDir(namespace));
|
|
67
|
+
return entries
|
|
68
|
+
.filter((e) => e.endsWith('.json'))
|
|
69
|
+
.map((e) => e.slice(0, -5));
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async delete(namespace, key) {
|
|
76
|
+
try {
|
|
77
|
+
await fs.unlink(this.keyPath(namespace, key));
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async exists(namespace, key) {
|
|
85
|
+
try {
|
|
86
|
+
await fs.access(this.keyPath(namespace, key));
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// =============================================================================
|
|
95
|
+
// SQLITE ADAPTER
|
|
96
|
+
// =============================================================================
|
|
97
|
+
const CREATE_TABLE_SQL = `
|
|
98
|
+
CREATE TABLE IF NOT EXISTS kv_store (
|
|
99
|
+
namespace TEXT NOT NULL,
|
|
100
|
+
key TEXT NOT NULL,
|
|
101
|
+
data TEXT NOT NULL,
|
|
102
|
+
updated_at INTEGER NOT NULL,
|
|
103
|
+
PRIMARY KEY (namespace, key)
|
|
104
|
+
)
|
|
105
|
+
`;
|
|
106
|
+
/**
|
|
107
|
+
* SQLite-based persistence.
|
|
108
|
+
* Uses a generic key-value table with namespace partitioning.
|
|
109
|
+
*/
|
|
110
|
+
export class SQLitePersistenceAdapter {
|
|
111
|
+
db;
|
|
112
|
+
constructor(dbPath) {
|
|
113
|
+
this.db = new Database(dbPath);
|
|
114
|
+
this.db.pragma('journal_mode = WAL');
|
|
115
|
+
this.db.exec(CREATE_TABLE_SQL);
|
|
116
|
+
}
|
|
117
|
+
async save(namespace, key, data) {
|
|
118
|
+
this.db
|
|
119
|
+
.prepare(`INSERT OR REPLACE INTO kv_store (namespace, key, data, updated_at)
|
|
120
|
+
VALUES (?, ?, ?, ?)`)
|
|
121
|
+
.run(namespace, key, JSON.stringify(data, mapReplacer), Date.now());
|
|
122
|
+
}
|
|
123
|
+
async load(namespace, key) {
|
|
124
|
+
const row = this.db
|
|
125
|
+
.prepare(`SELECT data FROM kv_store WHERE namespace = ? AND key = ?`)
|
|
126
|
+
.get(namespace, key);
|
|
127
|
+
if (!row)
|
|
128
|
+
return null;
|
|
129
|
+
return JSON.parse(row.data, mapReviver);
|
|
130
|
+
}
|
|
131
|
+
async list(namespace) {
|
|
132
|
+
const rows = this.db
|
|
133
|
+
.prepare(`SELECT key FROM kv_store WHERE namespace = ? ORDER BY key`)
|
|
134
|
+
.all(namespace);
|
|
135
|
+
return rows.map((r) => r.key);
|
|
136
|
+
}
|
|
137
|
+
async delete(namespace, key) {
|
|
138
|
+
const result = this.db
|
|
139
|
+
.prepare(`DELETE FROM kv_store WHERE namespace = ? AND key = ?`)
|
|
140
|
+
.run(namespace, key);
|
|
141
|
+
return result.changes > 0;
|
|
142
|
+
}
|
|
143
|
+
async exists(namespace, key) {
|
|
144
|
+
const row = this.db
|
|
145
|
+
.prepare(`SELECT 1 FROM kv_store WHERE namespace = ? AND key = ? LIMIT 1`)
|
|
146
|
+
.get(namespace, key);
|
|
147
|
+
return row !== undefined;
|
|
148
|
+
}
|
|
149
|
+
/** Close the database connection */
|
|
150
|
+
close() {
|
|
151
|
+
this.db.close();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// =============================================================================
|
|
155
|
+
// FACTORY
|
|
156
|
+
// =============================================================================
|
|
157
|
+
/** Create a persistence adapter of the given type */
|
|
158
|
+
export function createPersistenceAdapter(type, config) {
|
|
159
|
+
if (type === 'json') {
|
|
160
|
+
if (!config.baseDir)
|
|
161
|
+
throw new Error('baseDir is required for json adapter');
|
|
162
|
+
return new JSONFilePersistenceAdapter(config.baseDir);
|
|
163
|
+
}
|
|
164
|
+
if (!config.dbPath)
|
|
165
|
+
throw new Error('dbPath is required for sqlite adapter');
|
|
166
|
+
return new SQLitePersistenceAdapter(config.dbPath);
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../../../src/shared/persistence.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,gFAAgF;AAChF,4DAA4D;AAC5D,gFAAgF;AAEhF,8EAA8E;AAC9E,SAAS,WAAW,CAAC,IAAY,EAAE,KAAc;IAC/C,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iFAAiF;AACjF,SAAS,UAAU,CAAC,IAAY,EAAE,KAAc;IAC9C,IACE,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACxB,KAAiC,CAAC,MAAM,KAAK,KAAK,EACnD,CAAC;QACD,OAAO,IAAI,GAAG,CAAE,KAA2C,CAAC,OAAO,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAmBD,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,OAAO,0BAA0B;IACjB;IAApB,YAAoB,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;IAAG,CAAC;IAE/B,OAAO,CAAC,SAAiB,EAAE,GAAW;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,SAAiB;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,GAAW,EAAE,IAAa;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,GAAW;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;YACzE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAY,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YACxD,OAAO,OAAO;iBACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,GAAW;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,GAAW;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG;;;;;;;;CAQxB,CAAC;AAEF;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IAC3B,EAAE,CAAgC;IAE1C,YAAY,MAAc;QACxB,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,GAAW,EAAE,IAAa;QACtD,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;6BACqB,CACtB;aACA,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,GAAW;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CAAC,2DAA2D,CAAC;aACpE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAiC,CAAC;QACvD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAY,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;aACjB,OAAO,CAAC,2DAA2D,CAAC;aACpE,GAAG,CAAC,SAAS,CAAsB,CAAC;QACvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,GAAW;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,sDAAsD,CAAC;aAC/D,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,GAAW;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,OAAO,CACN,gEAAgE,CACjE;aACA,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACvB,OAAO,GAAG,KAAK,SAAS,CAAC;IAC3B,CAAC;IAED,oCAAoC;IACpC,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,qDAAqD;AACrD,MAAM,UAAU,wBAAwB,CACtC,IAAuB,EACvB,MAA6C;IAE7C,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC7E,OAAO,IAAI,0BAA0B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7E,OAAO,IAAI,wBAAwB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC"}
|