@winspan/claude-forge 9.2.0 → 9.12.0
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/DEVELOPMENT.md +80 -19
- package/README.md +13 -6
- package/dist/catalogs/agents.json +19 -24
- package/dist/catalogs/skills.json +139 -27
- package/dist/claudemd/templates/swarm-protocol.md +1 -1
- package/dist/cli/commands/agent.d.ts +169 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +690 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/codegraph.d.ts +17 -0
- package/dist/cli/commands/codegraph.d.ts.map +1 -0
- package/dist/cli/commands/codegraph.js +263 -0
- package/dist/cli/commands/codegraph.js.map +1 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -1
- package/dist/cli/commands/decisions.js +46 -9
- package/dist/cli/commands/decisions.js.map +1 -1
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +2 -1
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +5 -1
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -1
- package/dist/cli/commands/insights-goal-check.js +15 -15
- package/dist/cli/commands/insights-goal-check.js.map +1 -1
- package/dist/cli/commands/knowledge.d.ts +51 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -1
- package/dist/cli/commands/knowledge.js +202 -29
- package/dist/cli/commands/knowledge.js.map +1 -1
- package/dist/cli/commands/loop.d.ts +95 -0
- package/dist/cli/commands/loop.d.ts.map +1 -0
- package/dist/cli/commands/loop.js +408 -0
- package/dist/cli/commands/loop.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +33 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +75 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +23 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +82 -0
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/skills.d.ts +131 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +409 -9
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +9 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/constants.d.ts +37 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +43 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts.map +1 -1
- package/dist/core/diagnostics/checks.js +2 -1
- package/dist/core/diagnostics/checks.js.map +1 -1
- package/dist/core/diagnostics/daemon-status.d.ts +1 -1
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -1
- package/dist/core/diagnostics/daemon-status.js +1 -1
- package/dist/core/diagnostics/daemon-status.js.map +1 -1
- package/dist/core/diagnostics/entropy-checks.d.ts +3 -2
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -1
- package/dist/core/diagnostics/entropy-checks.js +10 -5
- package/dist/core/diagnostics/entropy-checks.js.map +1 -1
- package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
- package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/diagnostics/heartbeat-reader.js +50 -0
- package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
- package/dist/core/event-fields.d.ts +27 -0
- package/dist/core/event-fields.d.ts.map +1 -1
- package/dist/core/event-fields.js +43 -0
- package/dist/core/event-fields.js.map +1 -1
- package/dist/core/governance/global-inject.d.ts +34 -4
- package/dist/core/governance/global-inject.d.ts.map +1 -1
- package/dist/core/governance/global-inject.js +80 -25
- package/dist/core/governance/global-inject.js.map +1 -1
- package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
- package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
- package/dist/core/insights/agent-anchor-guard.js +119 -0
- package/dist/core/insights/agent-anchor-guard.js.map +1 -0
- package/dist/core/insights/agent-distill-context.d.ts +55 -0
- package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-context.js +146 -0
- package/dist/core/insights/agent-distill-context.js.map +1 -0
- package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
- package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-spawn.js +179 -0
- package/dist/core/insights/agent-distill-spawn.js.map +1 -0
- package/dist/core/insights/agent-drift.d.ts +66 -0
- package/dist/core/insights/agent-drift.d.ts.map +1 -0
- package/dist/core/insights/agent-drift.js +109 -0
- package/dist/core/insights/agent-drift.js.map +1 -0
- package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
- package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
- package/dist/core/insights/agent-evolution-sources.js +36 -0
- package/dist/core/insights/agent-evolution-sources.js.map +1 -0
- package/dist/core/insights/agent-health.d.ts +142 -0
- package/dist/core/insights/agent-health.d.ts.map +1 -0
- package/dist/core/insights/agent-health.js +296 -0
- package/dist/core/insights/agent-health.js.map +1 -0
- package/dist/core/insights/agent-patch-apply.d.ts +45 -0
- package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
- package/dist/core/insights/agent-patch-apply.js +165 -0
- package/dist/core/insights/agent-patch-apply.js.map +1 -0
- package/dist/core/insights/agent-suggest.d.ts +128 -0
- package/dist/core/insights/agent-suggest.d.ts.map +1 -0
- package/dist/core/insights/agent-suggest.js +284 -0
- package/dist/core/insights/agent-suggest.js.map +1 -0
- package/dist/core/insights/coverage-tiers.d.ts +46 -0
- package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
- package/dist/core/insights/coverage-tiers.js +95 -0
- package/dist/core/insights/coverage-tiers.js.map +1 -0
- package/dist/{daemon/services → core/insights}/experience-extractor.d.ts +0 -7
- package/dist/core/insights/experience-extractor.d.ts.map +1 -0
- package/dist/{daemon/services → core/insights}/experience-extractor.js +5 -9
- package/dist/core/insights/experience-extractor.js.map +1 -0
- package/dist/{daemon/services → core/insights}/violation-reporter.d.ts +20 -1
- package/dist/core/insights/violation-reporter.d.ts.map +1 -0
- package/dist/{daemon/services → core/insights}/violation-reporter.js +56 -4
- package/dist/core/insights/violation-reporter.js.map +1 -0
- package/dist/core/loop/loop-engine.d.ts +140 -0
- package/dist/core/loop/loop-engine.d.ts.map +1 -0
- package/dist/core/loop/loop-engine.js +266 -0
- package/dist/core/loop/loop-engine.js.map +1 -0
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +2 -1
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +159 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +523 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codegraph-types.d.ts +79 -0
- package/dist/core/storage/codegraph-types.d.ts.map +1 -0
- package/dist/core/storage/codegraph-types.js +14 -0
- package/dist/core/storage/codegraph-types.js.map +1 -0
- package/dist/core/storage/codegraph.d.ts +186 -0
- package/dist/core/storage/codegraph.d.ts.map +1 -0
- package/dist/core/storage/codegraph.js +452 -0
- package/dist/core/storage/codegraph.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +30 -5
- package/dist/core/storage/decisions.d.ts.map +1 -1
- package/dist/core/storage/decisions.js +45 -13
- package/dist/core/storage/decisions.js.map +1 -1
- package/dist/core/storage/events.d.ts +127 -0
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +318 -3
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +3 -23
- package/dist/core/storage/feedback.d.ts.map +1 -1
- package/dist/core/storage/feedback.js +37 -38
- package/dist/core/storage/feedback.js.map +1 -1
- package/dist/core/storage/injections.d.ts +40 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +69 -0
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +226 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -1
- package/dist/core/storage/knowledge.js +391 -4
- package/dist/core/storage/knowledge.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +1 -7
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -1
- package/dist/core/storage/pipeline-rollup.js +18 -57
- package/dist/core/storage/pipeline-rollup.js.map +1 -1
- package/dist/core/storage/routing.d.ts +34 -0
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +92 -2
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +5 -25
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +92 -27
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +2 -1
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +159 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +350 -4
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +81 -25
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +143 -45
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +270 -0
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +495 -16
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +1 -1
- package/dist/core/storage/tool-intercepts.js +1 -1
- package/dist/core/types.d.ts +26 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +1 -3
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/binary-paths.d.ts +32 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -1
- package/dist/core/utils/binary-paths.js +52 -0
- package/dist/core/utils/binary-paths.js.map +1 -1
- package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
- package/dist/{skills/distill → core/utils}/claude-cli-resolver.js +1 -1
- package/dist/core/utils/claude-cli-resolver.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +1 -1
- package/dist/core/utils/claude-cli-spawn.js +2 -2
- package/dist/core/utils/claude-cli-spawn.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +1 -1
- package/dist/core/utils/noise-prompt.js +1 -1
- package/dist/core/utils/time.d.ts +26 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +33 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/config-store.d.ts.map +1 -1
- package/dist/daemon/config-store.js +14 -5
- package/dist/daemon/config-store.js.map +1 -1
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +5 -0
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +24 -16
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +76 -116
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +35 -10
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.js +71 -38
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
- package/dist/daemon/handlers/stop.d.ts +20 -0
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +96 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +16 -1
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +97 -56
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
- package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
- package/dist/daemon/handlers/violation-content-backfill.js +167 -0
- package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
- package/dist/daemon/index.d.ts +19 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +125 -200
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts.map +1 -1
- package/dist/daemon/rules/defaults.js +151 -64
- package/dist/daemon/rules/defaults.js.map +1 -1
- package/dist/daemon/rules/types.d.ts +28 -22
- package/dist/daemon/rules/types.d.ts.map +1 -1
- package/dist/daemon/rules/workflow-defaults.js +9 -9
- package/dist/daemon/rules/workflow-defaults.js.map +1 -1
- package/dist/daemon/services/codegraph-sync.d.ts +94 -0
- package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
- package/dist/daemon/services/codegraph-sync.js +159 -0
- package/dist/daemon/services/codegraph-sync.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +47 -10
- package/dist/daemon/services/decision-hint.d.ts.map +1 -1
- package/dist/daemon/services/decision-hint.js +99 -24
- package/dist/daemon/services/decision-hint.js.map +1 -1
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -1
- package/dist/daemon/services/event-ttl-sweep.js +3 -2
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -1
- package/dist/daemon/services/feedback-aggregator.d.ts +14 -26
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -1
- package/dist/daemon/services/feedback-aggregator.js +23 -63
- package/dist/daemon/services/feedback-aggregator.js.map +1 -1
- package/dist/daemon/services/heartbeat-writer.d.ts +6 -15
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -1
- package/dist/daemon/services/heartbeat-writer.js +7 -36
- package/dist/daemon/services/heartbeat-writer.js.map +1 -1
- package/dist/daemon/services/kb-injector.d.ts +1 -1
- package/dist/daemon/services/kb-injector.d.ts.map +1 -1
- package/dist/daemon/services/kb-injector.js +10 -2
- package/dist/daemon/services/kb-injector.js.map +1 -1
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
- package/dist/daemon/services/loop-hint.d.ts +139 -0
- package/dist/daemon/services/loop-hint.d.ts.map +1 -0
- package/dist/daemon/services/loop-hint.js +272 -0
- package/dist/daemon/services/loop-hint.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +1 -1
- package/dist/daemon/services/outcome-classification-service.js.map +1 -1
- package/dist/daemon/services/task-segmenter.d.ts +11 -0
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +48 -2
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
- package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
- package/dist/daemon/startup/maintenance-schedulers.js +294 -0
- package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
- package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
- package/dist/daemon/templates/agents/claudemd-writer.md +1 -0
- package/dist/daemon/templates/agents/coder.md +165 -8
- package/dist/daemon/templates/agents/decision-maker.md +107 -21
- package/dist/daemon/templates/agents/doc-reviewer.md +4 -1
- package/dist/daemon/templates/agents/harness-debug-full.md +85 -3
- package/dist/daemon/templates/agents/knowledge-builder.md +1 -0
- package/dist/daemon/templates/agents/patch-applier.md +1 -0
- package/dist/daemon/templates/agents/planner.md +55 -3
- package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
- package/dist/daemon/templates/agents/skill-distiller.md +1 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +1 -0
- package/dist/daemon/templates/agents/verify-agent.md +128 -5
- package/dist/hooks/stop.sh +7 -1
- package/dist/knowledge/builder.js +36 -7
- package/dist/knowledge/builder.js.map +1 -1
- package/dist/knowledge/constants.d.ts +10 -5
- package/dist/knowledge/constants.d.ts.map +1 -1
- package/dist/knowledge/constants.js +10 -5
- package/dist/knowledge/constants.js.map +1 -1
- package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
- package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
- package/dist/knowledge/graph/edge-extractor.js +242 -0
- package/dist/knowledge/graph/edge-extractor.js.map +1 -0
- package/dist/knowledge/graph/impact.d.ts +73 -0
- package/dist/knowledge/graph/impact.d.ts.map +1 -0
- package/dist/knowledge/graph/impact.js +94 -0
- package/dist/knowledge/graph/impact.js.map +1 -0
- package/dist/knowledge/graph/types.d.ts +22 -0
- package/dist/knowledge/graph/types.d.ts.map +1 -0
- package/dist/knowledge/graph/types.js +13 -0
- package/dist/knowledge/graph/types.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +9 -0
- package/dist/knowledge/prompt.d.ts.map +1 -1
- package/dist/knowledge/prompt.js +17 -5
- package/dist/knowledge/prompt.js.map +1 -1
- package/dist/knowledge/query.d.ts +13 -0
- package/dist/knowledge/query.d.ts.map +1 -1
- package/dist/knowledge/query.js +107 -10
- package/dist/knowledge/query.js.map +1 -1
- package/dist/knowledge/repo-map.d.ts +11 -5
- package/dist/knowledge/repo-map.d.ts.map +1 -1
- package/dist/knowledge/repo-map.js +42 -3
- package/dist/knowledge/repo-map.js.map +1 -1
- package/dist/knowledge/validator.d.ts.map +1 -1
- package/dist/knowledge/validator.js +69 -2
- package/dist/knowledge/validator.js.map +1 -1
- package/dist/mcp/server.d.ts +64 -8
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +233 -18
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/distill/distiller.js +1 -1
- package/dist/skills/distill/distiller.js.map +1 -1
- package/dist/skills/distilled/distilled-api-design.md +4 -0
- package/dist/skills/distilled/distilled-brainstorming.md +79 -0
- package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
- package/dist/skills/distilled/distilled-canvas-design.md +128 -0
- package/dist/skills/distilled/distilled-claude-api.md +185 -0
- package/dist/skills/distilled/distilled-creator.md +5 -2
- package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
- package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
- package/dist/skills/distilled/distilled-docx.md +231 -0
- package/dist/skills/distilled/distilled-executing-plans.md +85 -50
- package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
- package/dist/skills/distilled/distilled-frontend-design.md +118 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +1 -1
- package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
- package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +108 -260
- package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
- package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +88 -78
- package/dist/skills/distilled/distilled-writing-skills.md +175 -0
- package/dist/skills/registry.d.ts +10 -50
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +7 -118
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +2 -2
- package/dist/skills/tools/pipeline-suggest.js.map +1 -1
- package/dist/skills/tools/skill-invoke.d.ts +2 -1
- package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
- package/dist/skills/tools/skill-invoke.js +3 -1
- package/dist/skills/tools/skill-invoke.js.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.js +6 -1
- package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
- package/dist/web/analytics/drift-detector.d.ts +6 -0
- package/dist/web/analytics/drift-detector.d.ts.map +1 -1
- package/dist/web/analytics/drift-detector.js +15 -8
- package/dist/web/analytics/drift-detector.js.map +1 -1
- package/dist/web/analytics/weekly-report.d.ts +13 -0
- package/dist/web/analytics/weekly-report.d.ts.map +1 -1
- package/dist/web/analytics/weekly-report.js +17 -3
- package/dist/web/analytics/weekly-report.js.map +1 -1
- package/dist/web/routes/_helpers.d.ts +31 -0
- package/dist/web/routes/_helpers.d.ts.map +1 -1
- package/dist/web/routes/_helpers.js +33 -0
- package/dist/web/routes/_helpers.js.map +1 -1
- package/dist/web/routes/agent-distill.d.ts +49 -0
- package/dist/web/routes/agent-distill.d.ts.map +1 -0
- package/dist/web/routes/agent-distill.js +526 -0
- package/dist/web/routes/agent-distill.js.map +1 -0
- package/dist/web/routes/config.d.ts +56 -0
- package/dist/web/routes/config.d.ts.map +1 -0
- package/dist/web/routes/config.js +243 -0
- package/dist/web/routes/config.js.map +1 -0
- package/dist/web/routes/decisions.js +1 -1
- package/dist/web/routes/decisions.js.map +1 -1
- package/dist/web/routes/error-handler.d.ts +0 -4
- package/dist/web/routes/error-handler.d.ts.map +1 -1
- package/dist/web/routes/error-handler.js +0 -8
- package/dist/web/routes/error-handler.js.map +1 -1
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +2 -1
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +0 -0
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +43 -2
- package/dist/web/routes/knowledge.d.ts.map +1 -1
- package/dist/web/routes/knowledge.js +117 -6
- package/dist/web/routes/knowledge.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +0 -9
- package/dist/web/routes/pipeline.d.ts.map +1 -1
- package/dist/web/routes/pipeline.js +0 -4
- package/dist/web/routes/pipeline.js.map +1 -1
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +20 -6
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +8 -7
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-stats.d.ts.map +1 -1
- package/dist/web/routes/skill-stats.js +153 -16
- package/dist/web/routes/skill-stats.js.map +1 -1
- package/dist/web/routes/skills-distill.js +1 -1
- package/dist/web/routes/skills-distill.js.map +1 -1
- package/dist/web/routes/stats.d.ts.map +1 -1
- package/dist/web/routes/stats.js +2 -1
- package/dist/web/routes/stats.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +95 -19
- package/dist/web/routes/task-timeline.d.ts.map +1 -1
- package/dist/web/routes/task-timeline.js +344 -88
- package/dist/web/routes/task-timeline.js.map +1 -1
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +52 -30
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/violations.d.ts +1 -1
- package/dist/web/routes/violations.d.ts.map +1 -1
- package/dist/web/routes/violations.js +3 -2
- package/dist/web/routes/violations.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +20 -0
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/agent-distill-manager.d.ts +122 -0
- package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
- package/dist/web/services/agent-distill-manager.js +397 -0
- package/dist/web/services/agent-distill-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +47 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -1
- package/dist/web/services/distill-manager.js +103 -0
- package/dist/web/services/distill-manager.js.map +1 -1
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
- package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js → MarkdownRenderer-DlDQNihj.js} +2 -2
- package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js.map → MarkdownRenderer-DlDQNihj.js.map} +1 -1
- package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
- package/dist/web/static/assets/{NotFound-BQPh0vaF.js.map → NotFound-LMzbP51V.js.map} +1 -1
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
- package/dist/web/static/assets/{index-7bl3kbcx.css → index-B_v_MKlb.css} +1 -1
- package/dist/web/static/assets/index-DileOOE4.js +4 -0
- package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
- package/dist/web/static/assets/{outcome-DUn1NjlC.js → outcome-BKGy9azt.js} +2 -2
- package/dist/web/static/assets/{outcome-DUn1NjlC.js.map → outcome-BKGy9azt.js.map} +1 -1
- package/dist/web/static/assets/{query-S6X1S7K9.js → query-CgCOpYWf.js} +2 -2
- package/dist/web/static/assets/{query-S6X1S7K9.js.map → query-CgCOpYWf.js.map} +1 -1
- package/dist/web/static/assets/{react-router-JVUrkhdd.js → react-router-Cxmg8RuL.js} +3 -3
- package/dist/web/static/assets/{react-router-JVUrkhdd.js.map → react-router-Cxmg8RuL.js.map} +1 -1
- package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js → syntax-highlighter-BDYycNja.js} +3 -3
- package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js.map → syntax-highlighter-BDYycNja.js.map} +1 -1
- package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
- package/dist/web/static/index.html +6 -6
- package/package.json +5 -3
- package/dist/core/storage/workflow-recommendations.d.ts +0 -124
- package/dist/core/storage/workflow-recommendations.d.ts.map +0 -1
- package/dist/core/storage/workflow-recommendations.js +0 -274
- package/dist/core/storage/workflow-recommendations.js.map +0 -1
- package/dist/daemon/services/experience-extractor.d.ts.map +0 -1
- package/dist/daemon/services/experience-extractor.js.map +0 -1
- package/dist/daemon/services/violation-reporter.d.ts.map +0 -1
- package/dist/daemon/services/violation-reporter.js.map +0 -1
- package/dist/daemon/templates/agents/harness-hotfix.md +0 -99
- package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +0 -104
- package/dist/daemon/templates/agents/refactor-specialist.md +0 -98
- package/dist/skills/distill/claude-cli-resolver.d.ts.map +0 -1
- package/dist/skills/distill/claude-cli-resolver.js.map +0 -1
- package/dist/skills/distilled/distilled-defi-amm-security.md +0 -293
- package/dist/skills/keyword-score.d.ts +0 -29
- package/dist/skills/keyword-score.d.ts.map +0 -1
- package/dist/skills/keyword-score.js +0 -54
- package/dist/skills/keyword-score.js.map +0 -1
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +0 -2
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +0 -1
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +0 -2
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +0 -1
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +0 -3
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +0 -1
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +0 -2
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +0 -1
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +0 -2
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +0 -1
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +0 -2
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +0 -1
- package/dist/web/static/assets/DriftTab-DqpepOhI.js +0 -2
- package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +0 -1
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +0 -3
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +0 -1
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +0 -2
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +0 -1
- package/dist/web/static/assets/NotFound-BQPh0vaF.js +0 -2
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +0 -2
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +0 -1
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +0 -2
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +0 -1
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +0 -2
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +0 -1
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +0 -2
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +0 -1
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +0 -2
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +0 -1
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +0 -6
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +0 -1
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +0 -3
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +0 -1
- package/dist/web/static/assets/arco-Bhi3a6Qp.js +0 -14
- package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +0 -1
- package/dist/web/static/assets/charts-BuHQWDbQ.js +0 -37
- package/dist/web/static/assets/charts-BuHQWDbQ.js.map +0 -1
- package/dist/web/static/assets/index-BIYnq1Dx.js +0 -4
- package/dist/web/static/assets/index-BIYnq1Dx.js.map +0 -1
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js +0 -2
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +0 -1
- package/dist/web/static/assets/vendor-DWgdB1eY.js +0 -65
- package/dist/web/static/assets/vendor-DWgdB1eY.js.map +0 -1
- /package/dist/{skills/distill → core/utils}/claude-cli-resolver.d.ts +0 -0
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loop-engine.ts — Goal-convergence orchestration state machine.
|
|
3
|
+
*
|
|
4
|
+
* Spec: docs/design/2026-06-11/0943-loop-goal-convergence-spec.md (Option A)
|
|
5
|
+
* Decision: 1f9e71be
|
|
6
|
+
*
|
|
7
|
+
* CLI-RESIDENT, NEVER daemon. Each iteration:
|
|
8
|
+
* spawn coder (implement) → spawn verify-agent → parse `## Verdict:` →
|
|
9
|
+
* PASS/SKIP = terminate(success) · FAIL = iterate · BLOCKED/unparseable =
|
|
10
|
+
* terminate(blocked, stop-safe).
|
|
11
|
+
*
|
|
12
|
+
* The loop is only safe unattended because every guardrail lands here:
|
|
13
|
+
* - max-iterations hard cap (+ a ceiling on explicit overrides)
|
|
14
|
+
* - cumulative token budget (pre-emptive stop, conservative estimate)
|
|
15
|
+
* - verify-gate (only PASS/SKIP advances success)
|
|
16
|
+
* - irreversible-op gate (NEEDS-IRREVERSIBLE sentinel + git-HEAD-moved backstop)
|
|
17
|
+
* - no-progress / oscillation detector (identical diff hash repeated)
|
|
18
|
+
*
|
|
19
|
+
* `runLoop(cfg, deps)` takes a DEPENDENCY-INJECTION seam (`deps`): in production
|
|
20
|
+
* `deps.spawnAgent` wraps `spawnClaudeCli` and the git helpers shell out; in
|
|
21
|
+
* tests they are stubs returning canned verify reports. This seam is what makes
|
|
22
|
+
* the engine testable WITHOUT spawning real `claude` — mandatory, load-bearing
|
|
23
|
+
* for coverage in the 38%-line `src/cli` host area.
|
|
24
|
+
*/
|
|
25
|
+
import { LOOP } from '../constants.js';
|
|
26
|
+
export const EXIT_CODES = {
|
|
27
|
+
converged: 0,
|
|
28
|
+
'max-iter-exhausted': 2,
|
|
29
|
+
stalled: 3,
|
|
30
|
+
'budget-exhausted': 4,
|
|
31
|
+
'irreversible-blocked': 5,
|
|
32
|
+
'verify-blocked': 6,
|
|
33
|
+
};
|
|
34
|
+
// ── Pure functions (unit-testable, no I/O) ──────────────────────────────────
|
|
35
|
+
/**
|
|
36
|
+
* Parse the verify-agent's `## Verdict: X` line.
|
|
37
|
+
* Case-insensitive, first match wins. Returns `null` if absent — the caller
|
|
38
|
+
* MUST treat null as BLOCKED ("FAIL when in doubt"), never as PASS.
|
|
39
|
+
*/
|
|
40
|
+
export function parseVerifyVerdict(text) {
|
|
41
|
+
if (!text)
|
|
42
|
+
return null;
|
|
43
|
+
// Match `## Verdict: PASS` (markdown heading) or a looser `Verdict: PASS`.
|
|
44
|
+
const re = /^\s*#{0,6}\s*Verdict\s*:\s*(PASS|FAIL|BLOCKED|SKIP)\b/im;
|
|
45
|
+
const m = re.exec(text);
|
|
46
|
+
if (!m)
|
|
47
|
+
return null;
|
|
48
|
+
return m[1].toUpperCase();
|
|
49
|
+
}
|
|
50
|
+
const IRREVERSIBLE_SENTINEL = /NEEDS-IRREVERSIBLE\s*:\s*(.+)/i;
|
|
51
|
+
/**
|
|
52
|
+
* Detect whether an iteration attempted or needs an irreversible op.
|
|
53
|
+
* Two signals (either fires the gate):
|
|
54
|
+
* 1. coder output contains the `NEEDS-IRREVERSIBLE: <desc>` sentinel.
|
|
55
|
+
* 2. git HEAD moved (a commit happened) between before/after — backstop for
|
|
56
|
+
* a coder that ignored the directive.
|
|
57
|
+
*/
|
|
58
|
+
export function detectIrreversible(coderOutput, gitHeadBefore, gitHeadAfter) {
|
|
59
|
+
const m = IRREVERSIBLE_SENTINEL.exec(coderOutput ?? '');
|
|
60
|
+
if (m)
|
|
61
|
+
return { fired: true, reason: `sentinel: ${m[1].trim()}` };
|
|
62
|
+
if (gitHeadBefore && gitHeadAfter && gitHeadBefore !== gitHeadAfter) {
|
|
63
|
+
return { fired: true, reason: `git HEAD moved ${gitHeadBefore.slice(0, 8)}→${gitHeadAfter.slice(0, 8)} (commit inside loop)` };
|
|
64
|
+
}
|
|
65
|
+
return { fired: false };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Estimate token cost from a spawn. Prefers a reported usage number; falls
|
|
69
|
+
* back to a coarse char/4 estimate over prompt+output. Conservative by design:
|
|
70
|
+
* the budget gate stops BEFORE exceeding, so over-estimating is the safe error.
|
|
71
|
+
*/
|
|
72
|
+
export function estimateTokens(reportedTokens, promptText, outputText) {
|
|
73
|
+
if (typeof reportedTokens === 'number' && reportedTokens > 0)
|
|
74
|
+
return reportedTokens;
|
|
75
|
+
return Math.ceil(((promptText?.length ?? 0) + (outputText?.length ?? 0)) / 4);
|
|
76
|
+
}
|
|
77
|
+
/** Build the coder prompt, injecting the goal, the last verify report (if any), and the irreversible directive. */
|
|
78
|
+
export function buildCoderPrompt(goal, lastVerifyReport) {
|
|
79
|
+
const lines = [];
|
|
80
|
+
lines.push(`Goal (drive toward convergence): ${goal}`);
|
|
81
|
+
lines.push('');
|
|
82
|
+
if (lastVerifyReport) {
|
|
83
|
+
lines.push('The previous verify-agent run returned FAIL. Its report follows — fix exactly what it flagged:');
|
|
84
|
+
lines.push('--- verify report ---');
|
|
85
|
+
lines.push(lastVerifyReport.trim());
|
|
86
|
+
lines.push('--- end verify report ---');
|
|
87
|
+
lines.push('');
|
|
88
|
+
}
|
|
89
|
+
lines.push('IMPORTANT — irreversible-op gate: Do NOT run irreversible operations ' +
|
|
90
|
+
'(git commit, git push, schema migration, network send, destructive rm -rf, ' +
|
|
91
|
+
'package publish). If the task genuinely needs one, STOP and report a single line ' +
|
|
92
|
+
'`NEEDS-IRREVERSIBLE: <short description>` instead of performing it. Leave changes ' +
|
|
93
|
+
'in the working tree only.');
|
|
94
|
+
return lines.join('\n');
|
|
95
|
+
}
|
|
96
|
+
/** Build the verify-agent prompt for the current goal. */
|
|
97
|
+
export function buildVerifyPrompt(goal) {
|
|
98
|
+
return [
|
|
99
|
+
`Verify whether this goal is met by the current working tree: ${goal}`,
|
|
100
|
+
'',
|
|
101
|
+
'Run the relevant tests/build and emit your standard structured report ending in a ' +
|
|
102
|
+
'`## Verdict: PASS|FAIL|BLOCKED|SKIP` line. PASS = goal met; FAIL = not yet met ' +
|
|
103
|
+
'(describe what to fix); BLOCKED = cannot measure; SKIP = doc-only/non-runtime change.',
|
|
104
|
+
].join('\n');
|
|
105
|
+
}
|
|
106
|
+
/** Map a terminal verdict + exit reason to a decisions outcome value. */
|
|
107
|
+
export function verdictToOutcome(reason) {
|
|
108
|
+
switch (reason) {
|
|
109
|
+
case 'converged':
|
|
110
|
+
return 'success';
|
|
111
|
+
case 'max-iter-exhausted':
|
|
112
|
+
return 'failed';
|
|
113
|
+
case 'stalled':
|
|
114
|
+
case 'irreversible-blocked':
|
|
115
|
+
case 'verify-blocked':
|
|
116
|
+
case 'budget-exhausted':
|
|
117
|
+
return 'partial';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// ── Orchestrator ────────────────────────────────────────────────────────────
|
|
121
|
+
/** Clamp the requested iteration cap to the hard ceiling. */
|
|
122
|
+
export function clampMaxIterations(requested) {
|
|
123
|
+
if (!Number.isFinite(requested) || requested < 1)
|
|
124
|
+
return LOOP.MAX_ITERATIONS;
|
|
125
|
+
return Math.min(requested, LOOP.MAX_ITERATIONS_HARD_CEILING);
|
|
126
|
+
}
|
|
127
|
+
function nowIso() {
|
|
128
|
+
return new Date().toISOString();
|
|
129
|
+
}
|
|
130
|
+
function finalize(cfg, deps, iterations, reason, terminalVerdict, totalTokens) {
|
|
131
|
+
const outcome = reason === 'converged' && (terminalVerdict === 'PASS' || terminalVerdict === 'SKIP')
|
|
132
|
+
? 'success'
|
|
133
|
+
: verdictToOutcome(reason);
|
|
134
|
+
const result = {
|
|
135
|
+
outcome,
|
|
136
|
+
terminalVerdict,
|
|
137
|
+
iterations,
|
|
138
|
+
totalTokens,
|
|
139
|
+
exitReason: reason,
|
|
140
|
+
exitCode: EXIT_CODES[reason],
|
|
141
|
+
};
|
|
142
|
+
// Single final outcome backfill (Q4 fallback path): one explicit
|
|
143
|
+
// `--result` derived from the TERMINAL VERIFY VERDICT — never inferred from a
|
|
144
|
+
// commit. Skipped entirely when no decisionId (ad-hoc loop) or dry-run.
|
|
145
|
+
if (cfg.decisionId && !cfg.dryRun) {
|
|
146
|
+
deps.writeFinalOutcome(outcome, `loop terminal: reason=${reason} verdict=${terminalVerdict ?? 'none'} ` +
|
|
147
|
+
`iterations=${iterations.length} tokens=${totalTokens}`);
|
|
148
|
+
}
|
|
149
|
+
deps.appendRunLog({ kind: 'summary', ...result, ts: nowIso() });
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Drive the goal-convergence loop. Returns a {@link LoopResult}; the caller
|
|
154
|
+
* (CLI) maps `exitCode` onto `process.exitCode`.
|
|
155
|
+
*
|
|
156
|
+
* In `dryRun` mode this spawns NOTHING and returns a zero-iteration success —
|
|
157
|
+
* the CLI prints the planned prompts/config separately.
|
|
158
|
+
*/
|
|
159
|
+
export async function runLoop(cfg, deps) {
|
|
160
|
+
const iterations = [];
|
|
161
|
+
if (cfg.dryRun) {
|
|
162
|
+
// No spawns, no git, no token spend. CLI renders the plan.
|
|
163
|
+
return {
|
|
164
|
+
outcome: 'success',
|
|
165
|
+
terminalVerdict: null,
|
|
166
|
+
iterations,
|
|
167
|
+
totalTokens: 0,
|
|
168
|
+
exitReason: 'converged',
|
|
169
|
+
exitCode: 0,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const maxIter = clampMaxIterations(cfg.maxIterations);
|
|
173
|
+
let totalTokens = 0;
|
|
174
|
+
let lastVerifyReport;
|
|
175
|
+
let lastDiffHash = null;
|
|
176
|
+
let noProgressStreak = 0;
|
|
177
|
+
for (let iter = 1; iter <= maxIter; iter++) {
|
|
178
|
+
// ── Token-budget gate (pre-emptive: stop BEFORE the next spawn) ──
|
|
179
|
+
// Estimate the next iteration's cost from the running average so we stop
|
|
180
|
+
// before exceeding, not after.
|
|
181
|
+
if (cfg.tokenBudget != null) {
|
|
182
|
+
const avgPerIter = iterations.length > 0 ? totalTokens / iterations.length : 0;
|
|
183
|
+
const projectedNext = avgPerIter > 0 ? avgPerIter : 1;
|
|
184
|
+
if (totalTokens + projectedNext > cfg.tokenBudget) {
|
|
185
|
+
return finalize(cfg, deps, iterations, 'budget-exhausted', lastVerifyReport ? parseVerifyVerdict(lastVerifyReport) : null, totalTokens);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const headBefore = await deps.gitHeadRef();
|
|
189
|
+
// ── 1. Implement (coder) ──
|
|
190
|
+
const coderPrompt = buildCoderPrompt(cfg.goal, lastVerifyReport);
|
|
191
|
+
const coderRes = await deps.spawnAgent({ agent: cfg.coderAgent, prompt: coderPrompt });
|
|
192
|
+
totalTokens += coderRes.tokens;
|
|
193
|
+
const headAfter = await deps.gitHeadRef();
|
|
194
|
+
// ── Irreversible-op gate ──
|
|
195
|
+
const irr = detectIrreversible(coderRes.text, headBefore, headAfter);
|
|
196
|
+
if (irr.fired && !cfg.allowIrreversible && cfg.onIrreversible === 'stop') {
|
|
197
|
+
const rec = {
|
|
198
|
+
iter, verdict: null, tokensSpent: coderRes.tokens,
|
|
199
|
+
diffHash: lastDiffHash ?? '', irreversible: true, terminated: true,
|
|
200
|
+
reason: 'irreversible-blocked', ts: nowIso(),
|
|
201
|
+
};
|
|
202
|
+
iterations.push(rec);
|
|
203
|
+
deps.appendRunLog(rec);
|
|
204
|
+
deps.writeIterationNote(`iter=${iter} irreversible-blocked: ${irr.reason ?? ''}`);
|
|
205
|
+
return finalize(cfg, deps, iterations, 'irreversible-blocked', null, totalTokens);
|
|
206
|
+
}
|
|
207
|
+
// onIrreversible==='skip' (or allowIrreversible): record the skip and
|
|
208
|
+
// continue — the coder is re-prompted next round to proceed without the op.
|
|
209
|
+
// ── 2. Verify ──
|
|
210
|
+
const verifyPrompt = buildVerifyPrompt(cfg.goal);
|
|
211
|
+
const verifyRes = await deps.spawnAgent({ agent: cfg.verifyAgent, prompt: verifyPrompt });
|
|
212
|
+
totalTokens += verifyRes.tokens;
|
|
213
|
+
const verdict = parseVerifyVerdict(verifyRes.text);
|
|
214
|
+
// ── Working-tree fingerprint (for no-progress detection) ──
|
|
215
|
+
const diffHash = await deps.gitDiffHash();
|
|
216
|
+
const rec = {
|
|
217
|
+
iter,
|
|
218
|
+
verdict,
|
|
219
|
+
tokensSpent: coderRes.tokens + verifyRes.tokens,
|
|
220
|
+
diffHash,
|
|
221
|
+
irreversible: irr.fired,
|
|
222
|
+
terminated: false,
|
|
223
|
+
ts: nowIso(),
|
|
224
|
+
};
|
|
225
|
+
deps.writeIterationNote(`iter=${iter} verdict=${verdict ?? 'none'} tokens=${rec.tokensSpent}`);
|
|
226
|
+
// ── Verify-gate: PASS/SKIP converge, FAIL iterate, BLOCKED/null stop-safe ──
|
|
227
|
+
if (verdict === 'PASS' || verdict === 'SKIP') {
|
|
228
|
+
rec.terminated = true;
|
|
229
|
+
rec.reason = 'converged';
|
|
230
|
+
iterations.push(rec);
|
|
231
|
+
deps.appendRunLog(rec);
|
|
232
|
+
return finalize(cfg, deps, iterations, 'converged', verdict, totalTokens);
|
|
233
|
+
}
|
|
234
|
+
if (verdict === null || verdict === 'BLOCKED') {
|
|
235
|
+
// Unparseable or explicitly blocked → cannot measure convergence; do NOT
|
|
236
|
+
// iterate blindly (would burn budget). Stop-safe.
|
|
237
|
+
rec.terminated = true;
|
|
238
|
+
rec.reason = 'verify-blocked';
|
|
239
|
+
iterations.push(rec);
|
|
240
|
+
deps.appendRunLog(rec);
|
|
241
|
+
return finalize(cfg, deps, iterations, 'verify-blocked', verdict, totalTokens);
|
|
242
|
+
}
|
|
243
|
+
// verdict === 'FAIL' → iterate. First check no-progress / oscillation.
|
|
244
|
+
if (lastDiffHash !== null && diffHash === lastDiffHash) {
|
|
245
|
+
noProgressStreak += 1;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
noProgressStreak = 0;
|
|
249
|
+
}
|
|
250
|
+
lastDiffHash = diffHash;
|
|
251
|
+
if (noProgressStreak >= cfg.noProgressLimit) {
|
|
252
|
+
rec.terminated = true;
|
|
253
|
+
rec.reason = 'stalled';
|
|
254
|
+
iterations.push(rec);
|
|
255
|
+
deps.appendRunLog(rec);
|
|
256
|
+
return finalize(cfg, deps, iterations, 'stalled', verdict, totalTokens);
|
|
257
|
+
}
|
|
258
|
+
iterations.push(rec);
|
|
259
|
+
deps.appendRunLog(rec);
|
|
260
|
+
lastVerifyReport = verifyRes.text;
|
|
261
|
+
}
|
|
262
|
+
// Ran out of iterations without a PASS.
|
|
263
|
+
const terminalVerdict = lastVerifyReport ? parseVerifyVerdict(lastVerifyReport) : null;
|
|
264
|
+
return finalize(cfg, deps, iterations, 'max-iter-exhausted', terminalVerdict, totalTokens);
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=loop-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-engine.js","sourceRoot":"","sources":["../../../src/core/loop/loop-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/queue/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/queue/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAsB1B;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAID;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAUpD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0EvB"}
|
package/dist/core/queue/index.js
CHANGED
|
@@ -18,12 +18,13 @@ import { join } from 'node:path';
|
|
|
18
18
|
import { randomUUID } from 'node:crypto';
|
|
19
19
|
import { logger } from '../utils/logger.js';
|
|
20
20
|
import { FORGE_PATHS } from '../constants.js';
|
|
21
|
+
import { DAY_MS } from '../utils/time.js';
|
|
21
22
|
// ── Constants ──────────────────────────────────────────────────────────────
|
|
22
23
|
const QUEUE_DIR = FORGE_PATHS.queue();
|
|
23
24
|
const DEAD_DIR = FORGE_PATHS.queueDead();
|
|
24
25
|
export const MAX_FILES = 500;
|
|
25
26
|
export const TTL_DAYS = 7;
|
|
26
|
-
const TTL_MS = TTL_DAYS *
|
|
27
|
+
const TTL_MS = TTL_DAYS * DAY_MS;
|
|
27
28
|
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
28
29
|
function ensureDirs() {
|
|
29
30
|
mkdirSync(QUEUE_DIR, { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/queue/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/queue/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,8EAA8E;AAC9E,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC;AACtC,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;AACzC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAC7B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AAE1B,MAAM,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEjC,8EAA8E;AAE9E,SAAS,UAAU;IACjB,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,sEAAsE;AACtE,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,SAAS,CAAC;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,IAAI,EAAE,CAAC,CAAC,uDAAuD;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS;QAAE,OAAO;IAErC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;IAC9D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IAEb,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,IAAI,UAAU,EAAE,CAAC;IAC/C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,OAAO,OAAO,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE3C,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACnF,CAAC;AAwBD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAsB,EACtB,UAAyB,EAAE;IAE3B,UAAU,EAAE,CAAC;IAEb,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,qBAAqB,KAAK,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAElE,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE3C,0EAA0E;QAC1E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;gBAChC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACrC,IAAI,EAAE,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;gBAC/D,SAAS;YACX,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,uBAAuB,QAAQ,eAAe,GAAG,EAAE,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QAED,0EAA0E;QAC1E,IAAI,KAAiB,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC7C,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACrC,IAAI,EAAE,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,0EAA0E;QAC1E,IAAI,CAAC;YACH,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjB,QAAQ,EAAE,CAAC;YACX,qEAAqE;YACrE,sEAAsE;YACtE,2CAA2C;YAC3C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,OAAO,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,qCAAqC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;gBAC3E,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,iDAAiD;gBACjD,IAAI,CAAC;oBAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBAChD,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACrC,IAAI,EAAE,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,4CAA4C,QAAQ,KAAK,GAAG,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,QAAgB,EAAE,QAAgB;IAC1D,IAAI,CAAC;QACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,0BAA0B,QAAQ,oBAAoB,GAAG,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC;YAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -8,8 +8,36 @@
|
|
|
8
8
|
* - 一次性 sessions 回填
|
|
9
9
|
*
|
|
10
10
|
* 不涉及业务读写。所有业务读写由 *Operations 类组合 db 实例实现。
|
|
11
|
+
*
|
|
12
|
+
* 迁移机制(无编号 .sql runner):schema.sql 是当前 schema 的唯一真相
|
|
13
|
+
* (全 idempotent CREATE ... IF NOT EXISTS,每次启动 db.exec 重放)+
|
|
14
|
+
* 本文件 runColumnMigrations()/runIndexMigrations()/runPostMigrations()
|
|
15
|
+
* 对旧库就地补列/补索引/补 CHECK。migrations/ 目录下不存在被读取的编号 .sql。
|
|
16
|
+
* 详见 migrations/README.md。
|
|
11
17
|
*/
|
|
12
18
|
import Database from 'better-sqlite3';
|
|
19
|
+
/**
|
|
20
|
+
* Backfill window for events.decision_id / subagent_type (decision c425f26f,
|
|
21
|
+
* spec 1544 § 1.3, user ruling #4). The spec aligns the window to existing
|
|
22
|
+
* retention; the only retention constant that bounds recoverability is the
|
|
23
|
+
* event-ttl-sweep WARM TTL (default 7 days), past which `tool_input` is NULLed
|
|
24
|
+
* (gzip blob gone — nothing left to decode). We use 10 days (spec default) as a
|
|
25
|
+
* conservative-but-safe ceiling: rows older than the warm TTL simply have NULL
|
|
26
|
+
* tool_input and are skipped by the WHERE (`tool_input IS NOT NULL` implied by a
|
|
27
|
+
* successful decode). base.ts is in the leaf-most `core` layer and MUST NOT
|
|
28
|
+
* depend on the daemon ConfigStore (decision ed98c8e8), so this is a static
|
|
29
|
+
* constant, not a config read.
|
|
30
|
+
*/
|
|
31
|
+
export declare const SPAWN_FIELD_BACKFILL_WINDOW = "-10 days";
|
|
32
|
+
/**
|
|
33
|
+
* Backfill window for the one-shot tasks.parent_task_id historical linkage
|
|
34
|
+
* (decision f47c2c90, spec 1711 § Phase 1.1, user ruling Q2 = -10 days). Aligned
|
|
35
|
+
* with SPAWN_FIELD_BACKFILL_WINDOW so the two boot-time backfills cover the same
|
|
36
|
+
* recent slice. Historical rows cannot read the in-memory agentJustReturned flag,
|
|
37
|
+
* so the backfill uses a WEAKER pure-SQL heuristic (ack-title + same session +
|
|
38
|
+
* ≤30min prior non-ack user task); anything ambiguous stays NULL (宁缺毋滥).
|
|
39
|
+
*/
|
|
40
|
+
export declare const TASK_PARENT_BACKFILL_WINDOW = "-10 days";
|
|
13
41
|
export declare class SQLiteBase {
|
|
14
42
|
protected db: Database.Database;
|
|
15
43
|
protected dbPath: string;
|
|
@@ -154,6 +182,84 @@ export declare class SQLiteBase {
|
|
|
154
182
|
* default already minting 'pending', this one-shot UPDATE realigns history.
|
|
155
183
|
*/
|
|
156
184
|
private backfillRoutingRoutedToTypePending;
|
|
185
|
+
/**
|
|
186
|
+
* One-shot back-fill of skill_invocations.project_path from
|
|
187
|
+
* sessions.project_path (decision 39839e30 Part 2). A skill pull's session_id
|
|
188
|
+
* JOINs sessions to recover the project it belonged to. Idempotent: the WHERE
|
|
189
|
+
* clause restricts to `project_path IS NULL AND session_id IS NOT NULL`, so a
|
|
190
|
+
* second startup touches 0 rows. Rows whose session can't be joined (sentinel
|
|
191
|
+
* session 'cli-no-session', or a session not in the sessions table) stay NULL
|
|
192
|
+
* — we deliberately do NOT invent a project for them.
|
|
193
|
+
*
|
|
194
|
+
* Errors are warn-logged and swallowed — daemon startup must not fail on a
|
|
195
|
+
* data back-fill; worst case some legacy rows stay project_path=NULL and only
|
|
196
|
+
* the all-projects view counts them.
|
|
197
|
+
*/
|
|
198
|
+
private backfillSkillInvocationsProjectPathIfNeeded;
|
|
199
|
+
/**
|
|
200
|
+
* decision f47c2c90 (二期B, spec 1711 § Phase 1.1): one-shot, idempotent,
|
|
201
|
+
* gzip-free backfill of `tasks.parent_task_id` for recent ack/continue-class
|
|
202
|
+
* follow-up tasks that have no parent linked yet.
|
|
203
|
+
*
|
|
204
|
+
* Why gzip-free + weaker than go-forward: this runs over HISTORY, which has no
|
|
205
|
+
* in-memory `agentJustReturned` flag to read (R2). It uses a pure-SQL heuristic
|
|
206
|
+
* over the plaintext tasks columns ONLY (title / start_time / session_id —
|
|
207
|
+
* never the gzip events.tool_input, R7). Conservatism over recall:
|
|
208
|
+
* - child candidate: task_kind='user', parent_task_id IS NULL, title is a
|
|
209
|
+
* short ack token (TASK_PARENT_ACK_TITLES), start_time within the window.
|
|
210
|
+
* - parent: the MOST RECENT same-session task_kind='user' task whose
|
|
211
|
+
* start_time is STRICTLY earlier than the child AND within 30min AND whose
|
|
212
|
+
* title is NOT itself an ack token (avoid ack→ack chains, prefer a
|
|
213
|
+
* substantive originating task). No qualifying parent → stays NULL.
|
|
214
|
+
* - never self-links (parent.id != child.id is implied by strict earlier
|
|
215
|
+
* start_time + the explicit guard below).
|
|
216
|
+
*
|
|
217
|
+
* Idempotent gate: only runs when at least one un-linked recent ack child
|
|
218
|
+
* exists; the UPDATE itself only touches `parent_task_id IS NULL` rows, so a
|
|
219
|
+
* second boot updates 0 rows (success criterion: `backfilled 0 rows`).
|
|
220
|
+
*
|
|
221
|
+
* Wrapped in a transaction. Errors are warn-logged and swallowed — daemon
|
|
222
|
+
* startup must not fail on a data backfill. Time math uses
|
|
223
|
+
* `datetime('now', ?)` + ISO lexical comparison (tasks.start_time is ISO TEXT;
|
|
224
|
+
* NO numeric probe — DB column type landmine, MEMORY).
|
|
225
|
+
*/
|
|
226
|
+
private backfillTasksParentIfNeeded;
|
|
227
|
+
/**
|
|
228
|
+
* decision c425f26f (spec 1544 § 1.3): one-shot, idempotent backfill of the
|
|
229
|
+
* PLAINTEXT `events.decision_id` / `events.subagent_type` columns for recent
|
|
230
|
+
* Task/Agent spawn rows whose values still live only inside the gzip
|
|
231
|
+
* `tool_input` blob.
|
|
232
|
+
*
|
|
233
|
+
* Idempotent gate: only spawn rows in the backfill window where BOTH new
|
|
234
|
+
* columns are still NULL are touched, so a second daemon boot updates 0 rows
|
|
235
|
+
* (success criterion: `backfilled 0 rows`).
|
|
236
|
+
*
|
|
237
|
+
* gzip one-way-door: we DECODE `tool_input` via the codec (sniffs gzip magic),
|
|
238
|
+
* run `extractSpawnFields` on the decoded object, then write the extracted
|
|
239
|
+
* strings to the plaintext columns. The columns themselves never see gzip.
|
|
240
|
+
* Rows whose `tool_input` was already NULLed by the warm-TTL sweep have
|
|
241
|
+
* nothing to decode and are skipped (decode → undefined → both NULL, but the
|
|
242
|
+
* WHERE already excludes most via `tool_input IS NOT NULL`).
|
|
243
|
+
*
|
|
244
|
+
* Per-row try/catch: one malformed gzip blob never aborts the batch. Wrapped
|
|
245
|
+
* in a single transaction. Errors are warn-logged and swallowed — daemon
|
|
246
|
+
* startup must not fail on a data backfill.
|
|
247
|
+
*
|
|
248
|
+
* This is the boot-time wrapper (gated). The re-runnable engine lives in
|
|
249
|
+
* {@link backfillEventsDecisionId} so `cf maintenance backfill-spawn-fields`
|
|
250
|
+
* can force a full re-scan of the window.
|
|
251
|
+
*/
|
|
252
|
+
private backfillEventsDecisionIdIfNeeded;
|
|
253
|
+
/**
|
|
254
|
+
* Re-runnable engine for the decision_id / subagent_type backfill (decision
|
|
255
|
+
* c425f26f, user ruling #3 manual fallback). Scans the backfill window for
|
|
256
|
+
* Pre/Post Task/Agent spawn rows that still have NULL plaintext columns,
|
|
257
|
+
* decodes their gzip `tool_input`, and writes the extracted fields. Returns
|
|
258
|
+
* the number of rows updated. Safe to call repeatedly (idempotent: only NULL
|
|
259
|
+
* rows are touched). Exposed via the SQLiteStorage facade for the
|
|
260
|
+
* `cf maintenance backfill-spawn-fields` command.
|
|
261
|
+
*/
|
|
262
|
+
backfillEventsDecisionId(): number;
|
|
157
263
|
/**
|
|
158
264
|
* Migration 010: widen workflow_recommendations.outcome CHECK to include
|
|
159
265
|
* 'partial_accepted'. SQLite cannot ALTER a CHECK constraint in place — we
|
|
@@ -203,6 +309,59 @@ export declare class SQLiteBase {
|
|
|
203
309
|
* build.
|
|
204
310
|
*/
|
|
205
311
|
private rebuildOutcomeCheckIfNeeded;
|
|
312
|
+
/**
|
|
313
|
+
* Migration 012 (decision 0fc1883c, 2026-06-08): DROP the dead
|
|
314
|
+
* `decisions.workflow_type` column. It was hard-coded to the literal
|
|
315
|
+
* 'pending' by decision-hint.ts (daemon no longer pre-classifies) and had
|
|
316
|
+
* ZERO consumers — no UPDATE path, no business logic branch. (The
|
|
317
|
+
* `intent.workflow_type` read by rules/pipeline-rollup is a DIFFERENT field
|
|
318
|
+
* sourced from injection metadata, NOT this column.)
|
|
319
|
+
*
|
|
320
|
+
* SQLite cannot reliably DROP COLUMN on older engines, so we mirror the
|
|
321
|
+
* migration-010/011 table-rebuild pattern: read the table's stored CREATE
|
|
322
|
+
* statement, strip the `workflow_type` line, CREATE the temp table, copy
|
|
323
|
+
* every OTHER column by EXPLICIT name (never `SELECT *` — the live column
|
|
324
|
+
* ORDER differs from schema.sql because migration-added columns are appended),
|
|
325
|
+
* DROP old, RENAME, replay indexes.
|
|
326
|
+
*
|
|
327
|
+
* Robustness choices:
|
|
328
|
+
* - **Idempotent**: guarded by hasColumn — if workflow_type is already gone
|
|
329
|
+
* (fresh DB from current schema.sql, or a prior boot) this is a no-op.
|
|
330
|
+
* - **Data-preserving**: copies all non-workflow_type columns by name, so
|
|
331
|
+
* every decision row keeps its other fields verbatim.
|
|
332
|
+
* - **Index-preserving**: snapshots user indexes before the drop and replays
|
|
333
|
+
* each `sql` after rename (made IF NOT EXISTS so schema.sql's recreate on
|
|
334
|
+
* the same boot doesn't clash).
|
|
335
|
+
*
|
|
336
|
+
* Errors are warn-logged, never thrown — daemon startup must not fail on a
|
|
337
|
+
* migration. Worst case the dead column lingers (harmless — nothing reads it).
|
|
338
|
+
*/
|
|
339
|
+
/**
|
|
340
|
+
* Migration 013 (decision 93e8fff1, 2026-06-08): widen the
|
|
341
|
+
* `decisions.status` CHECK to include 'advisory'. The advisory mint default
|
|
342
|
+
* (writeDecision) writes status='advisory', which the legacy CHECK
|
|
343
|
+
* (`status IN ('pending','resolved','bypassed','expired')`) would REJECT on
|
|
344
|
+
* existing live DBs — SQLite cannot ALTER a CHECK in place, so we mirror the
|
|
345
|
+
* migration-011/012 table-rebuild pattern: read the stored CREATE, string-
|
|
346
|
+
* replace ONLY the status CHECK fragment, CREATE temp → INSERT SELECT * →
|
|
347
|
+
* DROP → RENAME → replay indexes.
|
|
348
|
+
*
|
|
349
|
+
* Robustness:
|
|
350
|
+
* - **Idempotent**: detected by sniffing the stored CREATE for the legacy
|
|
351
|
+
* status enum WITHOUT 'advisory'. New DBs (schema.sql already carries
|
|
352
|
+
* 'advisory') and a second boot are no-ops.
|
|
353
|
+
* - **Data-preserving**: copies every column verbatim via `SELECT *`.
|
|
354
|
+
* - **Index-preserving**: snapshots non-autoindexes before the drop, replays
|
|
355
|
+
* each (made IF NOT EXISTS so schema.sql's recreate on the same boot is
|
|
356
|
+
* harmless).
|
|
357
|
+
*
|
|
358
|
+
* Errors are warn-logged, never thrown — daemon startup must not fail on a
|
|
359
|
+
* migration. Worst case the old CHECK lingers and a fresh advisory write is
|
|
360
|
+
* rejected at write time (writeDecision callers fail-silent), and the operator
|
|
361
|
+
* can re-run after the next build.
|
|
362
|
+
*/
|
|
363
|
+
private widenDecisionsStatusCheckIfNeeded;
|
|
364
|
+
private dropDecisionsWorkflowTypeIfNeeded;
|
|
206
365
|
/**
|
|
207
366
|
* 将 events 表按 session_id 聚合回填到 sessions 表,仅在 sessions 尚未对齐
|
|
208
367
|
* (没有任何一行带 first_prompt)时触发。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/storage/base.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/storage/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,2BAA2B,aAAa,CAAC;AAEtD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,aAAa,CAAC;AAsBtD,qBAAa,UAAU;IACrB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAChC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEb,MAAM,EAAE,MAAM;IAqD1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,yBAAyB;IAwBjC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAa1D,OAAO,CAAC,UAAU;IAclB,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWzC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAS3D,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAerF,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWzC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA+O3B;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAqI1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,4BAA4B;IAyCpC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,6BAA6B;IAmCrC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iCAAiC;IAmBzC;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAWnC;;;;;OAKG;IACH,OAAO,CAAC,kCAAkC;IAc1C;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,2CAA2C;IA4BnD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,2BAA2B;IAkEnC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,gCAAgC;IAwBxC;;;;;;;;OAQG;IACH,wBAAwB,IAAI,MAAM;IA2ClC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,2CAA2C;IAsDnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,OAAO,CAAC,2BAA2B;IA8EnC;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,iCAAiC;IA4DzC,OAAO,CAAC,iCAAiC;IAuEzC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAoDhC;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,QAAQ;IAIhC,SAAS,IAAI,MAAM;IAInB,SAAS,CAAC,WAAW,IAAI,MAAM;CAIhC"}
|