attocode 0.2.2 → 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 +169 -3
- 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 +44 -98
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +716 -2648
- package/dist/src/agent.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +25 -3
- 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 +4 -4
- 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 +8 -3
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +65 -3
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/integrations/agent-registry.d.ts +11 -0
- package/dist/src/integrations/agent-registry.d.ts.map +1 -1
- package/dist/src/integrations/agent-registry.js.map +1 -1
- package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
- package/dist/src/integrations/auto-compaction.js +8 -3
- package/dist/src/integrations/auto-compaction.js.map +1 -1
- package/dist/src/integrations/bash-policy.d.ts +33 -0
- package/dist/src/integrations/bash-policy.d.ts.map +1 -0
- package/dist/src/integrations/bash-policy.js +142 -0
- package/dist/src/integrations/bash-policy.js.map +1 -0
- 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 +23 -0
- package/dist/src/integrations/codebase-context.d.ts.map +1 -1
- package/dist/src/integrations/codebase-context.js +230 -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/delegation-protocol.js +2 -2
- package/dist/src/integrations/delegation-protocol.js.map +1 -1
- package/dist/src/integrations/economics.d.ts +67 -1
- package/dist/src/integrations/economics.d.ts.map +1 -1
- package/dist/src/integrations/economics.js +328 -33
- 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 +20 -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 +10 -1
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +12 -2
- 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/policy-engine.d.ts +55 -0
- package/dist/src/integrations/policy-engine.d.ts.map +1 -0
- package/dist/src/integrations/policy-engine.js +247 -0
- package/dist/src/integrations/policy-engine.js.map +1 -0
- 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 +5 -4
- package/dist/src/integrations/safety.d.ts.map +1 -1
- package/dist/src/integrations/safety.js +45 -20
- package/dist/src/integrations/safety.js.map +1 -1
- package/dist/src/integrations/sandbox/basic.d.ts +7 -0
- package/dist/src/integrations/sandbox/basic.d.ts.map +1 -1
- package/dist/src/integrations/sandbox/basic.js +27 -2
- package/dist/src/integrations/sandbox/basic.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 +6 -0
- package/dist/src/integrations/sandbox/index.d.ts.map +1 -1
- package/dist/src/integrations/sandbox/index.js +8 -4
- package/dist/src/integrations/sandbox/index.js.map +1 -1
- package/dist/src/integrations/sandbox/landlock.d.ts.map +1 -1
- package/dist/src/integrations/sandbox/landlock.js +3 -0
- package/dist/src/integrations/sandbox/landlock.js.map +1 -1
- package/dist/src/integrations/self-improvement.d.ts.map +1 -1
- package/dist/src/integrations/self-improvement.js +12 -0
- package/dist/src/integrations/self-improvement.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 +45 -1
- package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
- package/dist/src/integrations/smart-decomposer.js +486 -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/index.d.ts +1 -1
- package/dist/src/integrations/swarm/index.d.ts.map +1 -1
- package/dist/src/integrations/swarm/index.js.map +1 -1
- package/dist/src/integrations/swarm/model-selector.d.ts +15 -0
- package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -1
- package/dist/src/integrations/swarm/model-selector.js +100 -20
- package/dist/src/integrations/swarm/model-selector.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-budget.d.ts +4 -0
- package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-budget.js +6 -0
- package/dist/src/integrations/swarm/swarm-budget.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 +249 -7
- package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-event-bridge.d.ts +86 -1
- package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-event-bridge.js +207 -23
- package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-events.d.ts +58 -1
- package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-events.js +22 -5
- package/dist/src/integrations/swarm/swarm-events.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +147 -8
- package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-orchestrator.js +2179 -132
- package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -1
- package/dist/src/integrations/swarm/swarm-quality-gate.d.ts +83 -2
- package/dist/src/integrations/swarm/swarm-quality-gate.d.ts.map +1 -1
- package/dist/src/integrations/swarm/swarm-quality-gate.js +278 -19
- package/dist/src/integrations/swarm/swarm-quality-gate.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 +54 -0
- package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -1
- package/dist/src/integrations/swarm/task-queue.js +310 -12
- package/dist/src/integrations/swarm/task-queue.js.map +1 -1
- package/dist/src/integrations/swarm/types.d.ts +251 -13
- package/dist/src/integrations/swarm/types.d.ts.map +1 -1
- package/dist/src/integrations/swarm/types.js +70 -8
- package/dist/src/integrations/swarm/types.js.map +1 -1
- package/dist/src/integrations/swarm/worker-pool.d.ts +21 -4
- package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -1
- package/dist/src/integrations/swarm/worker-pool.js +223 -44
- 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/integrations/tool-recommendation.d.ts +7 -4
- package/dist/src/integrations/tool-recommendation.d.ts.map +1 -1
- package/dist/src/integrations/tool-recommendation.js +58 -5
- package/dist/src/integrations/tool-recommendation.js.map +1 -1
- package/dist/src/integrations/work-log.js +4 -4
- package/dist/src/integrations/work-log.js.map +1 -1
- package/dist/src/main.js +106 -30
- package/dist/src/main.js.map +1 -1
- package/dist/src/modes/repl.d.ts.map +1 -1
- package/dist/src/modes/repl.js +50 -12
- 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 +41 -6
- package/dist/src/modes/tui.js.map +1 -1
- package/dist/src/modes.d.ts.map +1 -1
- package/dist/src/modes.js +4 -27
- package/dist/src/modes.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/agent.d.ts.map +1 -1
- package/dist/src/tools/agent.js +11 -2
- package/dist/src/tools/agent.js.map +1 -1
- package/dist/src/tools/bash.d.ts +1 -1
- 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/coercion.d.ts +6 -0
- package/dist/src/tools/coercion.d.ts.map +1 -1
- package/dist/src/tools/coercion.js +13 -0
- package/dist/src/tools/coercion.js.map +1 -1
- package/dist/src/tools/file.d.ts +5 -5
- package/dist/src/tools/file.js +2 -2
- package/dist/src/tools/file.js.map +1 -1
- package/dist/src/tools/permission.d.ts.map +1 -1
- package/dist/src/tools/permission.js +10 -116
- 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 +292 -0
- package/dist/src/tracing/trace-collector.d.ts.map +1 -1
- package/dist/src/tracing/trace-collector.js +249 -5
- package/dist/src/tracing/trace-collector.js.map +1 -1
- package/dist/src/tracing/types.d.ts +200 -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 +162 -19
- 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 +214 -1
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +18 -3
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2.2: Agent State Machine
|
|
3
|
+
*
|
|
4
|
+
* Formalizes the phase tracking that previously lived in economics.ts into a
|
|
5
|
+
* proper state machine with typed transitions, event emission, and per-phase
|
|
6
|
+
* metrics. Testable independently of the economics system.
|
|
7
|
+
*
|
|
8
|
+
* Phases:
|
|
9
|
+
* - exploring: Reading files, searching code, understanding the problem
|
|
10
|
+
* - planning: Creating or editing a plan
|
|
11
|
+
* - acting: Writing/editing files, running commands
|
|
12
|
+
* - verifying: Running tests, checking results
|
|
13
|
+
*
|
|
14
|
+
* Valid transitions:
|
|
15
|
+
* exploring → planning | acting
|
|
16
|
+
* planning → acting | exploring
|
|
17
|
+
* acting → verifying | exploring
|
|
18
|
+
* verifying → acting | exploring
|
|
19
|
+
*/
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// VALID TRANSITIONS
|
|
22
|
+
// =============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Allowed phase transitions. Each phase lists the phases it can transition to.
|
|
25
|
+
* Invalid transitions are rejected with a warning.
|
|
26
|
+
*/
|
|
27
|
+
const VALID_TRANSITIONS = {
|
|
28
|
+
exploring: new Set(['planning', 'acting']),
|
|
29
|
+
planning: new Set(['acting', 'exploring']),
|
|
30
|
+
acting: new Set(['verifying', 'exploring']),
|
|
31
|
+
verifying: new Set(['acting', 'exploring']),
|
|
32
|
+
};
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// AGENT STATE MACHINE
|
|
35
|
+
// =============================================================================
|
|
36
|
+
export class AgentStateMachine {
|
|
37
|
+
currentPhase;
|
|
38
|
+
phaseEnteredAt;
|
|
39
|
+
phaseIterations = 0;
|
|
40
|
+
phaseToolCalls = 0;
|
|
41
|
+
listeners = [];
|
|
42
|
+
transitions = [];
|
|
43
|
+
// Per-phase tracking (mirrors economics PhaseState for backward compat)
|
|
44
|
+
uniqueFilesRead = new Set();
|
|
45
|
+
uniqueSearches = new Set();
|
|
46
|
+
filesModified = new Set();
|
|
47
|
+
testsRun = 0;
|
|
48
|
+
shouldTransition = false;
|
|
49
|
+
recentNewFiles = 0;
|
|
50
|
+
lastTestPassed = null;
|
|
51
|
+
consecutiveTestFailures = 0;
|
|
52
|
+
inTestFixCycle = false;
|
|
53
|
+
consecutiveBashFailures = 0;
|
|
54
|
+
// Accumulated metrics per phase (for history)
|
|
55
|
+
phaseHistory = [];
|
|
56
|
+
// Tuning thresholds
|
|
57
|
+
explorationFileThreshold;
|
|
58
|
+
explorationIterThreshold;
|
|
59
|
+
constructor(options) {
|
|
60
|
+
this.currentPhase = options?.initialPhase ?? 'exploring';
|
|
61
|
+
this.phaseEnteredAt = Date.now();
|
|
62
|
+
this.explorationFileThreshold = options?.explorationFileThreshold ?? 10;
|
|
63
|
+
this.explorationIterThreshold = options?.explorationIterThreshold ?? 5;
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// PUBLIC API
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/** Get the current phase */
|
|
69
|
+
getPhase() {
|
|
70
|
+
return this.currentPhase;
|
|
71
|
+
}
|
|
72
|
+
/** Get a snapshot of the current phase state (backward-compatible with economics) */
|
|
73
|
+
getPhaseSnapshot() {
|
|
74
|
+
return {
|
|
75
|
+
phase: this.currentPhase,
|
|
76
|
+
iterationsInPhase: this.phaseIterations,
|
|
77
|
+
uniqueFilesRead: new Set(this.uniqueFilesRead),
|
|
78
|
+
uniqueSearches: new Set(this.uniqueSearches),
|
|
79
|
+
filesModified: new Set(this.filesModified),
|
|
80
|
+
testsRun: this.testsRun,
|
|
81
|
+
shouldTransition: this.shouldTransition,
|
|
82
|
+
recentNewFiles: this.recentNewFiles,
|
|
83
|
+
lastTestPassed: this.lastTestPassed,
|
|
84
|
+
consecutiveTestFailures: this.consecutiveTestFailures,
|
|
85
|
+
inTestFixCycle: this.inTestFixCycle,
|
|
86
|
+
consecutiveBashFailures: this.consecutiveBashFailures,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/** Get metrics for the current phase */
|
|
90
|
+
getCurrentPhaseMetrics() {
|
|
91
|
+
return {
|
|
92
|
+
phase: this.currentPhase,
|
|
93
|
+
iterations: this.phaseIterations,
|
|
94
|
+
enteredAt: this.phaseEnteredAt,
|
|
95
|
+
duration: Date.now() - this.phaseEnteredAt,
|
|
96
|
+
filesRead: this.uniqueFilesRead.size,
|
|
97
|
+
filesModified: this.filesModified.size,
|
|
98
|
+
toolCalls: this.phaseToolCalls,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Get all phase transition history */
|
|
102
|
+
getTransitions() {
|
|
103
|
+
return this.transitions;
|
|
104
|
+
}
|
|
105
|
+
/** Get accumulated phase history */
|
|
106
|
+
getPhaseHistory() {
|
|
107
|
+
return this.phaseHistory;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Attempt a phase transition.
|
|
111
|
+
* Returns true if transition was valid and executed, false if rejected.
|
|
112
|
+
*/
|
|
113
|
+
transition(to, reason) {
|
|
114
|
+
if (to === this.currentPhase)
|
|
115
|
+
return false;
|
|
116
|
+
const validTargets = VALID_TRANSITIONS[this.currentPhase];
|
|
117
|
+
if (!validTargets.has(to)) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
const fromMetrics = this.getCurrentPhaseMetrics();
|
|
121
|
+
fromMetrics.duration = Date.now() - this.phaseEnteredAt;
|
|
122
|
+
const transition = {
|
|
123
|
+
from: this.currentPhase,
|
|
124
|
+
to,
|
|
125
|
+
reason,
|
|
126
|
+
timestamp: Date.now(),
|
|
127
|
+
fromMetrics,
|
|
128
|
+
};
|
|
129
|
+
// Record history
|
|
130
|
+
this.phaseHistory.push({ ...fromMetrics });
|
|
131
|
+
this.transitions.push(transition);
|
|
132
|
+
// Reset phase-local counters
|
|
133
|
+
this.currentPhase = to;
|
|
134
|
+
this.phaseEnteredAt = Date.now();
|
|
135
|
+
this.phaseIterations = 0;
|
|
136
|
+
this.phaseToolCalls = 0;
|
|
137
|
+
this.recentNewFiles = 0;
|
|
138
|
+
this.shouldTransition = false;
|
|
139
|
+
// Emit event
|
|
140
|
+
this.emit({ type: 'phase.changed', transition });
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Record a tool call and update phase state.
|
|
145
|
+
* This is the primary input signal for the state machine.
|
|
146
|
+
*/
|
|
147
|
+
recordToolCall(toolName, args, result) {
|
|
148
|
+
this.phaseIterations++;
|
|
149
|
+
this.phaseToolCalls++;
|
|
150
|
+
// Reset recentNewFiles counter every 3 iterations
|
|
151
|
+
if (this.phaseIterations % 3 === 0) {
|
|
152
|
+
this.recentNewFiles = 0;
|
|
153
|
+
}
|
|
154
|
+
// Track file reads
|
|
155
|
+
if (toolName === 'read_file' && args.path) {
|
|
156
|
+
const path = String(args.path);
|
|
157
|
+
const isNew = !this.uniqueFilesRead.has(path);
|
|
158
|
+
this.uniqueFilesRead.add(path);
|
|
159
|
+
if (isNew)
|
|
160
|
+
this.recentNewFiles++;
|
|
161
|
+
}
|
|
162
|
+
// Track searches
|
|
163
|
+
if (['grep', 'search', 'glob', 'find_files', 'search_files'].includes(toolName)) {
|
|
164
|
+
const query = String(args.pattern || args.query || args.path || '');
|
|
165
|
+
this.uniqueSearches.add(query);
|
|
166
|
+
}
|
|
167
|
+
// Track file modifications → auto-transition to acting
|
|
168
|
+
if (['write_file', 'edit_file'].includes(toolName) && args.path) {
|
|
169
|
+
this.filesModified.add(String(args.path));
|
|
170
|
+
if (this.currentPhase === 'exploring' || this.currentPhase === 'planning') {
|
|
171
|
+
this.transition('acting', 'First file edit made');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Track bash commands
|
|
175
|
+
if (toolName === 'bash' && args.command) {
|
|
176
|
+
const command = String(args.command);
|
|
177
|
+
const bashResult = extractBashSuccess(result);
|
|
178
|
+
// Track consecutive bash failures
|
|
179
|
+
if (result !== undefined) {
|
|
180
|
+
if (!bashResult) {
|
|
181
|
+
this.consecutiveBashFailures++;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this.consecutiveBashFailures = 0;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Detect test runs
|
|
188
|
+
if (isTestCommand(command)) {
|
|
189
|
+
this.testsRun++;
|
|
190
|
+
// Auto-transition to verifying when tests run after edits
|
|
191
|
+
if (this.currentPhase === 'acting' && this.filesModified.size > 0) {
|
|
192
|
+
this.transition('verifying', 'Tests run after edits');
|
|
193
|
+
}
|
|
194
|
+
// Track test outcomes
|
|
195
|
+
if (result !== undefined) {
|
|
196
|
+
if (bashResult) {
|
|
197
|
+
this.lastTestPassed = true;
|
|
198
|
+
this.consecutiveTestFailures = 0;
|
|
199
|
+
this.inTestFixCycle = false;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
this.lastTestPassed = false;
|
|
203
|
+
this.consecutiveTestFailures++;
|
|
204
|
+
// Enter test-fix cycle after 2+ failures
|
|
205
|
+
if (this.consecutiveTestFailures >= 2) {
|
|
206
|
+
this.inTestFixCycle = true;
|
|
207
|
+
// Go back to acting to fix
|
|
208
|
+
if (this.currentPhase === 'verifying') {
|
|
209
|
+
this.transition('acting', `Test failed ${this.consecutiveTestFailures} times, fixing`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Check exploration saturation
|
|
217
|
+
this.checkExplorationSaturation();
|
|
218
|
+
}
|
|
219
|
+
/** Subscribe to state machine events */
|
|
220
|
+
subscribe(listener) {
|
|
221
|
+
this.listeners.push(listener);
|
|
222
|
+
return () => {
|
|
223
|
+
const idx = this.listeners.indexOf(listener);
|
|
224
|
+
if (idx >= 0)
|
|
225
|
+
this.listeners.splice(idx, 1);
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/** Reset state machine to initial state */
|
|
229
|
+
reset(phase) {
|
|
230
|
+
this.currentPhase = phase ?? 'exploring';
|
|
231
|
+
this.phaseEnteredAt = Date.now();
|
|
232
|
+
this.phaseIterations = 0;
|
|
233
|
+
this.phaseToolCalls = 0;
|
|
234
|
+
this.uniqueFilesRead.clear();
|
|
235
|
+
this.uniqueSearches.clear();
|
|
236
|
+
this.filesModified.clear();
|
|
237
|
+
this.testsRun = 0;
|
|
238
|
+
this.shouldTransition = false;
|
|
239
|
+
this.recentNewFiles = 0;
|
|
240
|
+
this.lastTestPassed = null;
|
|
241
|
+
this.consecutiveTestFailures = 0;
|
|
242
|
+
this.inTestFixCycle = false;
|
|
243
|
+
this.consecutiveBashFailures = 0;
|
|
244
|
+
this.transitions = [];
|
|
245
|
+
this.phaseHistory = [];
|
|
246
|
+
}
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
// PRIVATE
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
/** Check for exploration saturation (too many reads without action) */
|
|
251
|
+
checkExplorationSaturation() {
|
|
252
|
+
if (this.currentPhase !== 'exploring') {
|
|
253
|
+
this.shouldTransition = false;
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// After N+ unique files without edits
|
|
257
|
+
if (this.uniqueFilesRead.size >= this.explorationFileThreshold && this.filesModified.size === 0) {
|
|
258
|
+
this.shouldTransition = true;
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
// After N+ iterations with diminishing returns
|
|
262
|
+
if (this.phaseIterations >= this.explorationIterThreshold && this.recentNewFiles < 2 && this.filesModified.size === 0) {
|
|
263
|
+
this.shouldTransition = true;
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
this.shouldTransition = false;
|
|
267
|
+
}
|
|
268
|
+
emit(event) {
|
|
269
|
+
for (const listener of this.listeners) {
|
|
270
|
+
try {
|
|
271
|
+
listener(event);
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
// Don't let listener errors break the state machine
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
// =============================================================================
|
|
280
|
+
// HELPERS
|
|
281
|
+
// =============================================================================
|
|
282
|
+
/** Check if a bash command is a test command */
|
|
283
|
+
function isTestCommand(command) {
|
|
284
|
+
return (command.includes('test') ||
|
|
285
|
+
command.includes('pytest') ||
|
|
286
|
+
command.includes('npm test') ||
|
|
287
|
+
command.includes('jest'));
|
|
288
|
+
}
|
|
289
|
+
/** Extract success from a bash result (object or string) */
|
|
290
|
+
function extractBashSuccess(result) {
|
|
291
|
+
if (result && typeof result === 'object') {
|
|
292
|
+
return result.success !== false;
|
|
293
|
+
}
|
|
294
|
+
return true; // strings and undefined are treated as success
|
|
295
|
+
}
|
|
296
|
+
// =============================================================================
|
|
297
|
+
// FACTORY
|
|
298
|
+
// =============================================================================
|
|
299
|
+
export function createAgentStateMachine(options) {
|
|
300
|
+
return new AgentStateMachine(options);
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=agent-state-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-state-machine.js","sourceRoot":"","sources":["../../../src/core/agent-state-machine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2.3: Base Manager Pattern
|
|
3
|
+
*
|
|
4
|
+
* Provides a common base class for managers with consistent lifecycle
|
|
5
|
+
* (init/cleanup/reset), event emission, and subscription management.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```ts
|
|
9
|
+
* interface MyEvent { type: 'my.event'; data: string }
|
|
10
|
+
*
|
|
11
|
+
* class MyManager extends BaseManager<MyEvent> {
|
|
12
|
+
* protected managerName = 'MyManager';
|
|
13
|
+
*
|
|
14
|
+
* async onInit(): Promise<void> { ... }
|
|
15
|
+
* async onCleanup(): Promise<void> { ... }
|
|
16
|
+
* onReset(): void { ... }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
/** Standard lifecycle states for managers */
|
|
21
|
+
export type ManagerState = 'created' | 'initializing' | 'ready' | 'cleaning_up' | 'disposed';
|
|
22
|
+
/** Base event type — all manager events must have a `type` field */
|
|
23
|
+
export interface BaseEvent {
|
|
24
|
+
type: string;
|
|
25
|
+
}
|
|
26
|
+
/** Lifecycle events emitted by all managers */
|
|
27
|
+
export interface ManagerLifecycleEvent extends BaseEvent {
|
|
28
|
+
type: 'manager.initialized' | 'manager.cleanup' | 'manager.reset' | 'manager.error';
|
|
29
|
+
manager: string;
|
|
30
|
+
error?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare abstract class BaseManager<TEvent extends BaseEvent = BaseEvent> {
|
|
33
|
+
/** Name for logging and events */
|
|
34
|
+
protected abstract readonly managerName: string;
|
|
35
|
+
private _state;
|
|
36
|
+
private _listeners;
|
|
37
|
+
private _unsubscribers;
|
|
38
|
+
private _initPromise;
|
|
39
|
+
/** Current lifecycle state */
|
|
40
|
+
get state(): ManagerState;
|
|
41
|
+
/** Whether the manager is ready to use */
|
|
42
|
+
get isReady(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Initialize the manager. Idempotent — calling multiple times returns the
|
|
45
|
+
* same promise. Override `onInit()` for custom initialization.
|
|
46
|
+
*/
|
|
47
|
+
init(): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Clean up resources. Override `onCleanup()` for custom cleanup.
|
|
50
|
+
* Automatically unsubscribes all tracked subscriptions.
|
|
51
|
+
*/
|
|
52
|
+
cleanup(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Reset manager to initial state without disposing.
|
|
55
|
+
* Override `onReset()` for custom reset logic.
|
|
56
|
+
*/
|
|
57
|
+
reset(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Subscribe to manager events.
|
|
60
|
+
* Returns an unsubscribe function.
|
|
61
|
+
*/
|
|
62
|
+
subscribe(listener: (event: TEvent | ManagerLifecycleEvent) => void): () => void;
|
|
63
|
+
/**
|
|
64
|
+
* Track an external unsubscription function.
|
|
65
|
+
* All tracked subscriptions are cleaned up on `cleanup()`.
|
|
66
|
+
*/
|
|
67
|
+
protected trackSubscription(unsub: () => void): void;
|
|
68
|
+
/** Emit a typed event to all listeners */
|
|
69
|
+
protected emit(event: TEvent): void;
|
|
70
|
+
/** Called during init(). Override for custom initialization. */
|
|
71
|
+
protected onInit(): Promise<void>;
|
|
72
|
+
/** Called during cleanup(). Override for custom resource release. */
|
|
73
|
+
protected onCleanup(): Promise<void>;
|
|
74
|
+
/** Called during reset(). Override to clear state without disposing. */
|
|
75
|
+
protected onReset(): void;
|
|
76
|
+
private _doInit;
|
|
77
|
+
private emitLifecycle;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=base-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-manager.d.ts","sourceRoot":"","sources":["../../../src/core/base-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAMH,6CAA6C;AAC7C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,cAAc,GAAG,OAAO,GAAG,aAAa,GAAG,UAAU,CAAC;AAE7F,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAsB,SAAQ,SAAS;IACtD,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,GAAG,eAAe,GAAG,eAAe,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,8BAAsB,WAAW,CAAC,MAAM,SAAS,SAAS,GAAG,SAAS;IACpE,kCAAkC;IAClC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAEhD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAA8D;IAChF,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,YAAY,CAA8B;IAMlD,8BAA8B;IAC9B,IAAI,KAAK,IAAI,YAAY,CAExB;IAED,0CAA0C;IAC1C,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;;OAGG;IACH,KAAK,IAAI,IAAI;IAWb;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,KAAK,IAAI,GAAG,MAAM,IAAI;IAShF;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,IAAI,GAAG,IAAI;IAIpD,0CAA0C;IAC1C,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAcnC,gEAAgE;cAChD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvC,qEAAqE;cACrD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1C,wEAAwE;IACxE,SAAS,CAAC,OAAO,IAAI,IAAI;YAQX,OAAO;IAarB,OAAO,CAAC,aAAa;CAWtB"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 2.3: Base Manager Pattern
|
|
3
|
+
*
|
|
4
|
+
* Provides a common base class for managers with consistent lifecycle
|
|
5
|
+
* (init/cleanup/reset), event emission, and subscription management.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```ts
|
|
9
|
+
* interface MyEvent { type: 'my.event'; data: string }
|
|
10
|
+
*
|
|
11
|
+
* class MyManager extends BaseManager<MyEvent> {
|
|
12
|
+
* protected managerName = 'MyManager';
|
|
13
|
+
*
|
|
14
|
+
* async onInit(): Promise<void> { ... }
|
|
15
|
+
* async onCleanup(): Promise<void> { ... }
|
|
16
|
+
* onReset(): void { ... }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// BASE MANAGER
|
|
22
|
+
// =============================================================================
|
|
23
|
+
export class BaseManager {
|
|
24
|
+
_state = 'created';
|
|
25
|
+
_listeners = [];
|
|
26
|
+
_unsubscribers = [];
|
|
27
|
+
_initPromise = null;
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// LIFECYCLE
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/** Current lifecycle state */
|
|
32
|
+
get state() {
|
|
33
|
+
return this._state;
|
|
34
|
+
}
|
|
35
|
+
/** Whether the manager is ready to use */
|
|
36
|
+
get isReady() {
|
|
37
|
+
return this._state === 'ready';
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Initialize the manager. Idempotent — calling multiple times returns the
|
|
41
|
+
* same promise. Override `onInit()` for custom initialization.
|
|
42
|
+
*/
|
|
43
|
+
async init() {
|
|
44
|
+
if (this._state === 'ready')
|
|
45
|
+
return;
|
|
46
|
+
if (this._initPromise)
|
|
47
|
+
return this._initPromise;
|
|
48
|
+
this._state = 'initializing';
|
|
49
|
+
this._initPromise = this._doInit();
|
|
50
|
+
return this._initPromise;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clean up resources. Override `onCleanup()` for custom cleanup.
|
|
54
|
+
* Automatically unsubscribes all tracked subscriptions.
|
|
55
|
+
*/
|
|
56
|
+
async cleanup() {
|
|
57
|
+
if (this._state === 'disposed')
|
|
58
|
+
return;
|
|
59
|
+
this._state = 'cleaning_up';
|
|
60
|
+
// Unsubscribe all tracked subscriptions
|
|
61
|
+
for (const unsub of this._unsubscribers) {
|
|
62
|
+
try {
|
|
63
|
+
unsub();
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Ignore errors during cleanup
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
this._unsubscribers = [];
|
|
70
|
+
try {
|
|
71
|
+
await this.onCleanup();
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
this.emitLifecycle('manager.error', String(err));
|
|
75
|
+
}
|
|
76
|
+
this._state = 'disposed';
|
|
77
|
+
this._initPromise = null;
|
|
78
|
+
this.emitLifecycle('manager.cleanup');
|
|
79
|
+
this._listeners = [];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Reset manager to initial state without disposing.
|
|
83
|
+
* Override `onReset()` for custom reset logic.
|
|
84
|
+
*/
|
|
85
|
+
reset() {
|
|
86
|
+
this.onReset();
|
|
87
|
+
this._state = 'ready';
|
|
88
|
+
this._initPromise = null;
|
|
89
|
+
this.emitLifecycle('manager.reset');
|
|
90
|
+
}
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// EVENT SYSTEM
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
/**
|
|
95
|
+
* Subscribe to manager events.
|
|
96
|
+
* Returns an unsubscribe function.
|
|
97
|
+
*/
|
|
98
|
+
subscribe(listener) {
|
|
99
|
+
this._listeners.push(listener);
|
|
100
|
+
const unsub = () => {
|
|
101
|
+
const idx = this._listeners.indexOf(listener);
|
|
102
|
+
if (idx >= 0)
|
|
103
|
+
this._listeners.splice(idx, 1);
|
|
104
|
+
};
|
|
105
|
+
return unsub;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Track an external unsubscription function.
|
|
109
|
+
* All tracked subscriptions are cleaned up on `cleanup()`.
|
|
110
|
+
*/
|
|
111
|
+
trackSubscription(unsub) {
|
|
112
|
+
this._unsubscribers.push(unsub);
|
|
113
|
+
}
|
|
114
|
+
/** Emit a typed event to all listeners */
|
|
115
|
+
emit(event) {
|
|
116
|
+
for (const listener of this._listeners) {
|
|
117
|
+
try {
|
|
118
|
+
listener(event);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Don't let listener errors break the manager
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
// HOOKS (override in subclasses)
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
/** Called during init(). Override for custom initialization. */
|
|
129
|
+
async onInit() {
|
|
130
|
+
// Default: no-op
|
|
131
|
+
}
|
|
132
|
+
/** Called during cleanup(). Override for custom resource release. */
|
|
133
|
+
async onCleanup() {
|
|
134
|
+
// Default: no-op
|
|
135
|
+
}
|
|
136
|
+
/** Called during reset(). Override to clear state without disposing. */
|
|
137
|
+
onReset() {
|
|
138
|
+
// Default: no-op
|
|
139
|
+
}
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// PRIVATE
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
async _doInit() {
|
|
144
|
+
try {
|
|
145
|
+
await this.onInit();
|
|
146
|
+
this._state = 'ready';
|
|
147
|
+
this.emitLifecycle('manager.initialized');
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
this._state = 'created';
|
|
151
|
+
this._initPromise = null;
|
|
152
|
+
this.emitLifecycle('manager.error', String(err));
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
emitLifecycle(type, error) {
|
|
157
|
+
const event = { type, manager: this.managerName };
|
|
158
|
+
if (error)
|
|
159
|
+
event.error = error;
|
|
160
|
+
for (const listener of this._listeners) {
|
|
161
|
+
try {
|
|
162
|
+
listener(event);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Ignore
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=base-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-manager.js","sourceRoot":"","sources":["../../../src/core/base-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAqBH,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF,MAAM,OAAgB,WAAW;IAIvB,MAAM,GAAiB,SAAS,CAAC;IACjC,UAAU,GAA2D,EAAE,CAAC;IACxE,cAAc,GAAsB,EAAE,CAAC;IACvC,YAAY,GAAyB,IAAI,CAAC;IAElD,8EAA8E;IAC9E,YAAY;IACZ,8EAA8E;IAE9E,8BAA8B;IAC9B,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,0CAA0C;IAC1C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO;QACpC,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAEhD,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO;QAEvC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC;QAE5B,wCAAwC;QACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxC,IAAI,CAAC;gBACH,KAAK,EAAE,CAAC;YACV,CAAC;YAAC,MAAM,CAAC;gBACP,+BAA+B;YACjC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACtC,CAAC;IAED,8EAA8E;IAC9E,eAAe;IACf,8EAA8E;IAE9E;;;OAGG;IACH,SAAS,CAAC,QAAyD;QACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,GAAG,IAAI,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACO,iBAAiB,CAAC,KAAiB;QAC3C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,0CAA0C;IAChC,IAAI,CAAC,KAAa;QAC1B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,iCAAiC;IACjC,8EAA8E;IAE9E,gEAAgE;IACtD,KAAK,CAAC,MAAM;QACpB,iBAAiB;IACnB,CAAC;IAED,qEAAqE;IAC3D,KAAK,CAAC,SAAS;QACvB,iBAAiB;IACnB,CAAC;IAED,wEAAwE;IAC9D,OAAO;QACf,iBAAiB;IACnB,CAAC;IAED,8EAA8E;IAC9E,UAAU;IACV,8EAA8E;IAEtE,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,IAAmC,EAAE,KAAc;QACvE,MAAM,KAAK,GAA0B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QACzE,IAAI,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAC/B,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAuC,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Completion Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Shared logic for identifying responses that describe future intent
|
|
5
|
+
* ("I'll do X") instead of completed work. This must stay centralized so
|
|
6
|
+
* execution-loop and final run guardrails classify consistently.
|
|
7
|
+
*/
|
|
8
|
+
export interface CompletionIntentAnalysis {
|
|
9
|
+
isIncompleteAction: boolean;
|
|
10
|
+
reason: 'none' | 'future_intent' | 'failure_admission' | 'narrative_action';
|
|
11
|
+
confidence: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function analyzeCompletionIntent(content: string): CompletionIntentAnalysis;
|
|
14
|
+
export declare function detectIncompleteActionResponse(content: string): boolean;
|
|
15
|
+
//# sourceMappingURL=completion-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-analyzer.d.ts","sourceRoot":"","sources":["../../../src/core/completion-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,mBAAmB,GAAG,kBAAkB,CAAC;IAC5E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CA+CjF;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Completion Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Shared logic for identifying responses that describe future intent
|
|
5
|
+
* ("I'll do X") instead of completed work. This must stay centralized so
|
|
6
|
+
* execution-loop and final run guardrails classify consistently.
|
|
7
|
+
*/
|
|
8
|
+
export function analyzeCompletionIntent(content) {
|
|
9
|
+
const trimmed = content.trim();
|
|
10
|
+
if (!trimmed) {
|
|
11
|
+
return { isIncompleteAction: false, reason: 'none', confidence: 0 };
|
|
12
|
+
}
|
|
13
|
+
const lower = trimmed.toLowerCase();
|
|
14
|
+
// Positive completion signals should override weaker future-intent cues.
|
|
15
|
+
const completionSignals = /\b(done|completed|finished|here is the (final|complete)|created successfully|saved|wrote|all (changes|tasks) (are )?complete)\b/;
|
|
16
|
+
if (completionSignals.test(lower)) {
|
|
17
|
+
return { isIncompleteAction: false, reason: 'none', confidence: 0.9 };
|
|
18
|
+
}
|
|
19
|
+
const futureIntentPatterns = [
|
|
20
|
+
/\b(i\s+will|i'll|let me)\s+(create|write|save|update|modify|fix|add|edit|implement|change|run|execute|build|set up|start)\b/,
|
|
21
|
+
/\b(i\s+need to|i\s+should|i\s+can)\s+(create|write|update|modify|fix|add|edit|implement)\b/,
|
|
22
|
+
/\b(the next step|first[, ]+i|now i)\b/,
|
|
23
|
+
/\b(i am going to|i'm going to)\b/,
|
|
24
|
+
];
|
|
25
|
+
if (futureIntentPatterns.some(pattern => pattern.test(lower))) {
|
|
26
|
+
return { isIncompleteAction: true, reason: 'future_intent', confidence: 0.95 };
|
|
27
|
+
}
|
|
28
|
+
const failureAdmissionPatterns = [
|
|
29
|
+
/\bran out of budget\b/,
|
|
30
|
+
/\bbudget exhausted\b/,
|
|
31
|
+
/\bunable to complete\b/,
|
|
32
|
+
/\bcould not complete\b/,
|
|
33
|
+
/\bno changes were made\b/,
|
|
34
|
+
/\bno files were modified\b/,
|
|
35
|
+
];
|
|
36
|
+
if (failureAdmissionPatterns.some(pattern => pattern.test(lower))) {
|
|
37
|
+
return { isIncompleteAction: true, reason: 'failure_admission', confidence: 0.9 };
|
|
38
|
+
}
|
|
39
|
+
// Heuristic: short narrative about "changing code" with no artifact.
|
|
40
|
+
const hasCodeBlock = /```/.test(trimmed);
|
|
41
|
+
const mentionsCodeConcepts = /\b(file|function|class|module|component|import|export|variable|method)\b/i.test(trimmed);
|
|
42
|
+
if (!hasCodeBlock && mentionsCodeConcepts && trimmed.length < 600) {
|
|
43
|
+
const actionWords = /\b(update|modify|create|add|change|fix|implement|refactor|write|edit)\b/i;
|
|
44
|
+
if (actionWords.test(lower)) {
|
|
45
|
+
return { isIncompleteAction: true, reason: 'narrative_action', confidence: 0.65 };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { isIncompleteAction: false, reason: 'none', confidence: 0.3 };
|
|
49
|
+
}
|
|
50
|
+
export function detectIncompleteActionResponse(content) {
|
|
51
|
+
return analyzeCompletionIntent(content).isIncompleteAction;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=completion-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-analyzer.js","sourceRoot":"","sources":["../../../src/core/completion-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,yEAAyE;IACzE,MAAM,iBAAiB,GAAG,iIAAiI,CAAC;IAC5J,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACxE,CAAC;IAED,MAAM,oBAAoB,GAAa;QACrC,6HAA6H;QAC7H,4FAA4F;QAC5F,uCAAuC;QACvC,kCAAkC;KACnC,CAAC;IACF,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACjF,CAAC;IAED,MAAM,wBAAwB,GAAa;QACzC,uBAAuB;QACvB,sBAAsB;QACtB,wBAAwB;QACxB,wBAAwB;QACxB,0BAA0B;QAC1B,4BAA4B;KAC7B,CAAC;IACF,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACpF,CAAC;IAED,qEAAqE;IACrE,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,oBAAoB,GAAG,2EAA2E,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvH,IAAI,CAAC,YAAY,IAAI,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAClE,MAAM,WAAW,GAAG,0EAA0E,CAAC;QAC/F,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACpF,CAAC;IACH,CAAC;IAED,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,OAAe;IAC5D,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC;AAC7D,CAAC"}
|