@winspan/claude-forge 8.54.3 → 9.2.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 +649 -33
- package/README.md +155 -17
- package/dist/catalogs/agents.json +72 -0
- package/dist/catalogs/skills.json +194 -0
- package/dist/claudemd/claudemd-generator.d.ts +45 -45
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +128 -449
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/index.d.ts +14 -4
- package/dist/claudemd/index.d.ts.map +1 -1
- package/dist/claudemd/index.js +15 -4
- package/dist/claudemd/index.js.map +1 -1
- package/dist/claudemd/resume-manager.d.ts.map +1 -1
- package/dist/claudemd/resume-manager.js +37 -9
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/templates/swarm-protocol.md +35 -186
- package/dist/claudemd/violations-manager.d.ts +40 -0
- package/dist/claudemd/violations-manager.d.ts.map +1 -0
- package/dist/claudemd/violations-manager.js +106 -0
- package/dist/claudemd/violations-manager.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +15 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +177 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +18 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +160 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/bypass.d.ts +18 -0
- package/dist/cli/commands/bypass.d.ts.map +1 -0
- package/dist/cli/commands/bypass.js +87 -0
- package/dist/cli/commands/bypass.js.map +1 -0
- package/dist/cli/commands/claudemd.d.ts +60 -0
- package/dist/cli/commands/claudemd.d.ts.map +1 -1
- package/dist/cli/commands/claudemd.js +174 -37
- package/dist/cli/commands/claudemd.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +94 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +39 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +167 -20
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/decisions.d.ts +129 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +669 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +124 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/entropy.d.ts +35 -0
- package/dist/cli/commands/entropy.d.ts.map +1 -0
- package/dist/cli/commands/entropy.js +121 -0
- package/dist/cli/commands/entropy.js.map +1 -0
- package/dist/cli/commands/executions.d.ts +1 -0
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +10 -1
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/fix.d.ts +31 -0
- package/dist/cli/commands/fix.d.ts.map +1 -0
- package/dist/cli/commands/fix.js +108 -0
- package/dist/cli/commands/fix.js.map +1 -0
- package/dist/cli/commands/governance.d.ts +21 -0
- package/dist/cli/commands/governance.d.ts.map +1 -0
- package/dist/cli/commands/governance.js +60 -0
- package/dist/cli/commands/governance.js.map +1 -0
- package/dist/cli/commands/init.d.ts +27 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +158 -146
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +50 -0
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
- package/dist/cli/commands/insights-goal-check.js +318 -0
- package/dist/cli/commands/insights-goal-check.js.map +1 -0
- package/dist/cli/commands/insights.d.ts +15 -0
- package/dist/cli/commands/insights.d.ts.map +1 -0
- package/dist/cli/commands/insights.js +127 -0
- package/dist/cli/commands/insights.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +66 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +897 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +0 -12
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +11 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/menu.d.ts.map +1 -1
- package/dist/cli/commands/menu.js +10 -184
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/project.d.ts +98 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +382 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +14 -128
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +40 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +49 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +3 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +17 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/trace.d.ts.map +1 -1
- package/dist/cli/commands/trace.js +4 -9
- package/dist/cli/commands/trace.js.map +1 -1
- package/dist/cli/commands/violations.d.ts +14 -0
- package/dist/cli/commands/violations.d.ts.map +1 -0
- package/dist/cli/commands/violations.js +43 -0
- package/dist/cli/commands/violations.js.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/hook-manager.d.ts +1 -1
- package/dist/cli/init/hook-manager.d.ts.map +1 -1
- package/dist/cli/init/hook-manager.js +6 -0
- package/dist/cli/init/hook-manager.js.map +1 -1
- package/dist/cli/utils/resolve-session.d.ts +32 -0
- package/dist/cli/utils/resolve-session.d.ts.map +1 -0
- package/dist/cli/utils/resolve-session.js +39 -0
- package/dist/cli/utils/resolve-session.js.map +1 -0
- package/dist/core/config.d.ts +4 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +11 -23
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +14 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +20 -13
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts +151 -0
- package/dist/core/diagnostics/checks.d.ts.map +1 -0
- package/dist/core/diagnostics/checks.js +765 -0
- package/dist/core/diagnostics/checks.js.map +1 -0
- package/dist/core/diagnostics/daemon-status.d.ts +77 -0
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
- package/dist/core/diagnostics/daemon-status.js +113 -0
- package/dist/core/diagnostics/daemon-status.js.map +1 -0
- package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
- package/dist/core/diagnostics/entropy-checks.js +395 -0
- package/dist/core/diagnostics/entropy-checks.js.map +1 -0
- package/dist/core/diagnostics/fix-runner.d.ts +54 -0
- package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/fix-runner.js +90 -0
- package/dist/core/diagnostics/fix-runner.js.map +1 -0
- package/dist/core/diagnostics/knip-runner.d.ts +49 -0
- package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/knip-runner.js +100 -0
- package/dist/core/diagnostics/knip-runner.js.map +1 -0
- package/dist/core/diagnostics/markers.d.ts +96 -0
- package/dist/core/diagnostics/markers.d.ts.map +1 -0
- package/dist/core/diagnostics/markers.js +153 -0
- package/dist/core/diagnostics/markers.js.map +1 -0
- package/dist/core/governance/global-inject.d.ts +60 -0
- package/dist/core/governance/global-inject.d.ts.map +1 -0
- package/dist/core/governance/global-inject.js +129 -0
- package/dist/core/governance/global-inject.js.map +1 -0
- package/dist/core/queue/index.d.ts +16 -3
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +14 -3
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +158 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +570 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
- package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
- package/dist/core/storage/codec/tool-input-codec.js +159 -0
- package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +362 -0
- package/dist/core/storage/decisions.d.ts.map +1 -0
- package/dist/core/storage/decisions.js +502 -0
- package/dist/core/storage/decisions.js.map +1 -0
- package/dist/core/storage/events.d.ts +112 -8
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +390 -39
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +131 -0
- package/dist/core/storage/feedback.d.ts.map +1 -0
- package/dist/core/storage/feedback.js +187 -0
- package/dist/core/storage/feedback.js.map +1 -0
- package/dist/core/storage/forge-config.d.ts +40 -0
- package/dist/core/storage/forge-config.d.ts.map +1 -0
- package/dist/core/storage/forge-config.js +65 -0
- package/dist/core/storage/forge-config.js.map +1 -0
- package/dist/core/storage/injections.d.ts +28 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +62 -5
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +106 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -0
- package/dist/core/storage/knowledge.js +202 -0
- package/dist/core/storage/knowledge.js.map +1 -0
- package/dist/core/storage/maintenance.d.ts +36 -9
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +56 -24
- package/dist/core/storage/maintenance.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +117 -0
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
- package/dist/core/storage/pipeline-rollup.js +471 -0
- package/dist/core/storage/pipeline-rollup.js.map +1 -0
- package/dist/core/storage/routing.d.ts +16 -3
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +39 -8
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +50 -7
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +302 -23
- package/dist/core/storage/sessions.d.ts +136 -0
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +351 -15
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +1 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +21 -6
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +253 -20
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +425 -16
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +474 -2
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +1213 -18
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +69 -0
- package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
- package/dist/core/storage/tool-intercepts.js +116 -0
- package/dist/core/storage/tool-intercepts.js.map +1 -0
- package/dist/core/storage/workflow-recommendations.d.ts +124 -0
- package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
- package/dist/core/storage/workflow-recommendations.js +274 -0
- package/dist/core/storage/workflow-recommendations.js.map +1 -0
- package/dist/core/types.d.ts +112 -17
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +12 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/backup.d.ts +81 -0
- package/dist/core/utils/backup.d.ts.map +1 -0
- package/dist/core/utils/backup.js +98 -0
- package/dist/core/utils/backup.js.map +1 -0
- package/dist/core/utils/binary-paths.d.ts +92 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -0
- package/dist/core/utils/binary-paths.js +166 -0
- package/dist/core/utils/binary-paths.js.map +1 -0
- package/dist/core/utils/bypass-token.d.ts +75 -0
- package/dist/core/utils/bypass-token.d.ts.map +1 -0
- package/dist/core/utils/bypass-token.js +133 -0
- package/dist/core/utils/bypass-token.js.map +1 -0
- package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
- package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
- package/dist/core/utils/cc-builtin-agents.js +29 -0
- package/dist/core/utils/cc-builtin-agents.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
- package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
- package/dist/core/utils/claude-cli-spawn.js +219 -0
- package/dist/core/utils/claude-cli-spawn.js.map +1 -0
- package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
- package/dist/core/utils/forge-resume-block.js +3 -2
- package/dist/core/utils/forge-resume-block.js.map +1 -1
- package/dist/core/utils/logger.d.ts +15 -3
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +20 -2
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +97 -0
- package/dist/core/utils/noise-prompt.d.ts.map +1 -0
- package/dist/core/utils/noise-prompt.js +127 -0
- package/dist/core/utils/noise-prompt.js.map +1 -0
- package/dist/core/utils/path.d.ts +0 -4
- package/dist/core/utils/path.d.ts.map +1 -1
- package/dist/core/utils/path.js +0 -7
- package/dist/core/utils/path.js.map +1 -1
- package/dist/core/utils/time.d.ts +41 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +114 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/agent-sync.d.ts +24 -0
- package/dist/daemon/agent-sync.d.ts.map +1 -0
- package/dist/daemon/agent-sync.js +114 -0
- package/dist/daemon/agent-sync.js.map +1 -0
- package/dist/daemon/config-store.d.ts +55 -0
- package/dist/daemon/config-store.d.ts.map +1 -0
- package/dist/daemon/config-store.js +137 -0
- package/dist/daemon/config-store.js.map +1 -0
- package/dist/daemon/event-parser.d.ts +22 -0
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +49 -3
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
- package/dist/daemon/handlers/history-exporter.js +9 -8
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +261 -8
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
- package/dist/daemon/handlers/pre-tool-use.js +585 -0
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
- package/dist/daemon/handlers/stop.d.ts +35 -7
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +157 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +36 -14
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +135 -48
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/hook-sync.d.ts.map +1 -1
- package/dist/daemon/hook-sync.js +2 -1
- package/dist/daemon/hook-sync.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +471 -43
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/lifecycle.d.ts +48 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +98 -2
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/router.d.ts +4 -1
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +4 -2
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts +20 -0
- package/dist/daemon/rules/defaults.d.ts.map +1 -0
- package/dist/daemon/rules/defaults.js +692 -0
- package/dist/daemon/rules/defaults.js.map +1 -0
- package/dist/daemon/rules/registry.d.ts +47 -0
- package/dist/daemon/rules/registry.d.ts.map +1 -0
- package/dist/daemon/rules/registry.js +84 -0
- package/dist/daemon/rules/registry.js.map +1 -0
- package/dist/daemon/rules/types.d.ts +170 -0
- package/dist/daemon/rules/types.d.ts.map +1 -0
- package/dist/daemon/rules/types.js +15 -0
- package/dist/daemon/rules/types.js.map +1 -0
- package/dist/daemon/rules/whitelist.d.ts +101 -0
- package/dist/daemon/rules/whitelist.d.ts.map +1 -0
- package/dist/daemon/rules/whitelist.js +210 -0
- package/dist/daemon/rules/whitelist.js.map +1 -0
- package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
- package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
- package/dist/daemon/rules/workflow-defaults.js +521 -0
- package/dist/daemon/rules/workflow-defaults.js.map +1 -0
- package/dist/daemon/server.d.ts +11 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +7 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/context-injector.d.ts +34 -0
- package/dist/daemon/services/context-injector.d.ts.map +1 -0
- package/dist/daemon/services/context-injector.js +61 -0
- package/dist/daemon/services/context-injector.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +203 -0
- package/dist/daemon/services/decision-hint.d.ts.map +1 -0
- package/dist/daemon/services/decision-hint.js +487 -0
- package/dist/daemon/services/decision-hint.js.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.js +123 -0
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
- package/dist/daemon/services/experience-extractor.d.ts +67 -0
- package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
- package/dist/daemon/services/experience-extractor.js +323 -0
- package/dist/daemon/services/experience-extractor.js.map +1 -0
- package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
- package/dist/daemon/services/feedback-aggregator.js +455 -0
- package/dist/daemon/services/feedback-aggregator.js.map +1 -0
- package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
- package/dist/daemon/services/heartbeat-writer.js +111 -0
- package/dist/daemon/services/heartbeat-writer.js.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.js +94 -0
- package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
- package/dist/daemon/services/idle-task-budget.d.ts +50 -0
- package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
- package/dist/daemon/services/idle-task-budget.js +72 -0
- package/dist/daemon/services/idle-task-budget.js.map +1 -0
- package/dist/daemon/services/intercept-revive.d.ts +60 -0
- package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
- package/dist/daemon/services/intercept-revive.js +86 -0
- package/dist/daemon/services/intercept-revive.js.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.js +152 -0
- package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
- package/dist/daemon/services/kb-injector.d.ts +57 -0
- package/dist/daemon/services/kb-injector.d.ts.map +1 -0
- package/dist/daemon/services/kb-injector.js +140 -0
- package/dist/daemon/services/kb-injector.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
- package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +214 -0
- package/dist/daemon/services/outcome-classification-service.js.map +1 -0
- package/dist/daemon/services/outcome-classifier.d.ts +136 -0
- package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classifier.js +178 -0
- package/dist/daemon/services/outcome-classifier.js.map +1 -0
- package/dist/daemon/services/outcome-nudge.d.ts +107 -0
- package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
- package/dist/daemon/services/outcome-nudge.js +242 -0
- package/dist/daemon/services/outcome-nudge.js.map +1 -0
- package/dist/daemon/services/spec-approval.d.ts +127 -0
- package/dist/daemon/services/spec-approval.d.ts.map +1 -0
- package/dist/daemon/services/spec-approval.js +216 -0
- package/dist/daemon/services/spec-approval.js.map +1 -0
- package/dist/daemon/services/spec-gate.d.ts +54 -0
- package/dist/daemon/services/spec-gate.d.ts.map +1 -0
- package/dist/daemon/services/spec-gate.js +113 -0
- package/dist/daemon/services/spec-gate.js.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.js +202 -0
- package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
- package/dist/daemon/services/task-segmenter.d.ts +219 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +481 -17
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/services/violation-reporter.d.ts +130 -0
- package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
- package/dist/daemon/services/violation-reporter.js +339 -0
- package/dist/daemon/services/violation-reporter.js.map +1 -0
- package/dist/daemon/skill-sync.d.ts +7 -2
- package/dist/daemon/skill-sync.d.ts.map +1 -1
- package/dist/daemon/skill-sync.js +114 -9
- package/dist/daemon/skill-sync.js.map +1 -1
- package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
- package/dist/daemon/templates/agents/coder.md +105 -0
- package/dist/daemon/templates/agents/decision-maker.md +460 -0
- package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
- package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
- package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
- package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
- package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
- package/dist/daemon/templates/agents/patch-applier.md +144 -0
- package/dist/daemon/templates/agents/planner.md +165 -0
- package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
- package/dist/daemon/templates/agents/skill-distiller.md +113 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
- package/dist/daemon/templates/agents/verify-agent.md +136 -0
- package/dist/daemon/utils/inject-block.d.ts +39 -0
- package/dist/daemon/utils/inject-block.d.ts.map +1 -0
- package/dist/daemon/utils/inject-block.js +25 -0
- package/dist/daemon/utils/inject-block.js.map +1 -0
- package/dist/hooks/hook-lib.sh +8 -0
- package/dist/hooks/notification.sh +19 -8
- package/dist/hooks/post-tool-use.sh +41 -23
- package/dist/hooks/pre-tool-use.sh +54 -23
- package/dist/hooks/session-start.sh +68 -0
- package/dist/hooks/stop.sh +24 -10
- package/dist/hooks/user-prompt-submit.sh +37 -21
- package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
- package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/go-adapter.js +294 -0
- package/dist/knowledge/adapters/go-adapter.js.map +1 -0
- package/dist/knowledge/adapters/index.d.ts +41 -0
- package/dist/knowledge/adapters/index.d.ts.map +1 -0
- package/dist/knowledge/adapters/index.js +71 -0
- package/dist/knowledge/adapters/index.js.map +1 -0
- package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
- package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/java-adapter.js +260 -0
- package/dist/knowledge/adapters/java-adapter.js.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
- package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
- package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
- package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
- package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
- package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/python-adapter.js +358 -0
- package/dist/knowledge/adapters/python-adapter.js.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.js +329 -0
- package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
- package/dist/knowledge/adapters/types.d.ts +99 -0
- package/dist/knowledge/adapters/types.d.ts.map +1 -0
- package/dist/knowledge/adapters/types.js +17 -0
- package/dist/knowledge/adapters/types.js.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.js +171 -0
- package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
- package/dist/knowledge/audit-applier.d.ts +70 -0
- package/dist/knowledge/audit-applier.d.ts.map +1 -0
- package/dist/knowledge/audit-applier.js +251 -0
- package/dist/knowledge/audit-applier.js.map +1 -0
- package/dist/knowledge/builder.d.ts +261 -0
- package/dist/knowledge/builder.d.ts.map +1 -0
- package/dist/knowledge/builder.js +937 -0
- package/dist/knowledge/builder.js.map +1 -0
- package/dist/knowledge/cli-provider.d.ts +151 -0
- package/dist/knowledge/cli-provider.d.ts.map +1 -0
- package/dist/knowledge/cli-provider.js +313 -0
- package/dist/knowledge/cli-provider.js.map +1 -0
- package/dist/knowledge/constants.d.ts +73 -0
- package/dist/knowledge/constants.d.ts.map +1 -0
- package/dist/knowledge/constants.js +93 -0
- package/dist/knowledge/constants.js.map +1 -0
- package/dist/knowledge/cross-module.d.ts +139 -0
- package/dist/knowledge/cross-module.d.ts.map +1 -0
- package/dist/knowledge/cross-module.js +370 -0
- package/dist/knowledge/cross-module.js.map +1 -0
- package/dist/knowledge/git-hooks.d.ts +67 -0
- package/dist/knowledge/git-hooks.d.ts.map +1 -0
- package/dist/knowledge/git-hooks.js +258 -0
- package/dist/knowledge/git-hooks.js.map +1 -0
- package/dist/knowledge/module-hash.d.ts +88 -0
- package/dist/knowledge/module-hash.d.ts.map +1 -0
- package/dist/knowledge/module-hash.js +162 -0
- package/dist/knowledge/module-hash.js.map +1 -0
- package/dist/knowledge/project-detector.d.ts +101 -0
- package/dist/knowledge/project-detector.d.ts.map +1 -0
- package/dist/knowledge/project-detector.js +223 -0
- package/dist/knowledge/project-detector.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +228 -0
- package/dist/knowledge/prompt.d.ts.map +1 -0
- package/dist/knowledge/prompt.js +404 -0
- package/dist/knowledge/prompt.js.map +1 -0
- package/dist/knowledge/query.d.ts +105 -0
- package/dist/knowledge/query.d.ts.map +1 -0
- package/dist/knowledge/query.js +341 -0
- package/dist/knowledge/query.js.map +1 -0
- package/dist/knowledge/repo-map.d.ts +91 -0
- package/dist/knowledge/repo-map.d.ts.map +1 -0
- package/dist/knowledge/repo-map.js +408 -0
- package/dist/knowledge/repo-map.js.map +1 -0
- package/dist/knowledge/tools/index.d.ts +14 -0
- package/dist/knowledge/tools/index.d.ts.map +1 -0
- package/dist/knowledge/tools/index.js +11 -0
- package/dist/knowledge/tools/index.js.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.js +101 -0
- package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
- package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
- package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-query.js +104 -0
- package/dist/knowledge/tools/knowledge-query.js.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.js +82 -0
- package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
- package/dist/knowledge/types.d.ts +269 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +10 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/knowledge/validator.d.ts +90 -0
- package/dist/knowledge/validator.d.ts.map +1 -0
- package/dist/knowledge/validator.js +288 -0
- package/dist/knowledge/validator.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +222 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/builtin-skills.d.ts +35 -0
- package/dist/skills/builtin-skills.d.ts.map +1 -0
- package/dist/skills/builtin-skills.js +68 -0
- package/dist/skills/builtin-skills.js.map +1 -0
- package/dist/skills/distill/attribution.d.ts +59 -0
- package/dist/skills/distill/attribution.d.ts.map +1 -0
- package/dist/skills/distill/attribution.js +101 -0
- package/dist/skills/distill/attribution.js.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.js +115 -0
- package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
- package/dist/skills/distill/distiller.d.ts +161 -0
- package/dist/skills/distill/distiller.d.ts.map +1 -0
- package/dist/skills/distill/distiller.js +461 -0
- package/dist/skills/distill/distiller.js.map +1 -0
- package/dist/skills/distill/index.d.ts +223 -0
- package/dist/skills/distill/index.d.ts.map +1 -0
- package/dist/skills/distill/index.js +466 -0
- package/dist/skills/distill/index.js.map +1 -0
- package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
- package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
- package/dist/skills/distill/project-anchor-guard.js +334 -0
- package/dist/skills/distill/project-anchor-guard.js.map +1 -0
- package/dist/skills/distill/topic-deduper.d.ts +77 -0
- package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
- package/dist/skills/distill/topic-deduper.js +119 -0
- package/dist/skills/distill/topic-deduper.js.map +1 -0
- package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
- package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
- package/dist/skills/distill/upstream-fetcher.js +202 -0
- package/dist/skills/distill/upstream-fetcher.js.map +1 -0
- package/dist/skills/distilled/distilled-api-design.md +491 -0
- package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
- package/dist/skills/distilled/distilled-creator.md +178 -0
- package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
- package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
- package/dist/skills/distilled/distilled-executing-plans.md +113 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
- package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
- package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
- package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
- package/dist/skills/keyword-score.d.ts +29 -0
- package/dist/skills/keyword-score.d.ts.map +1 -0
- package/dist/skills/keyword-score.js +54 -0
- package/dist/skills/keyword-score.js.map +1 -0
- package/dist/skills/registry.d.ts +64 -20
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +102 -105
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +14 -14
- package/dist/skills/tools/skill-invoke.d.ts +1 -1
- package/dist/skills/tools/skill-invoke.js +1 -1
- package/dist/web/routes/agent-content.d.ts +30 -0
- package/dist/web/routes/agent-content.d.ts.map +1 -0
- package/dist/web/routes/agent-content.js +139 -0
- package/dist/web/routes/agent-content.js.map +1 -0
- package/dist/web/routes/decisions.d.ts +15 -0
- package/dist/web/routes/decisions.d.ts.map +1 -0
- package/dist/web/routes/decisions.js +181 -0
- package/dist/web/routes/decisions.js.map +1 -0
- package/dist/web/routes/diagnostics.d.ts +61 -0
- package/dist/web/routes/diagnostics.d.ts.map +1 -0
- package/dist/web/routes/diagnostics.js +203 -0
- package/dist/web/routes/diagnostics.js.map +1 -0
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +24 -0
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/health.d.ts +33 -0
- package/dist/web/routes/health.d.ts.map +1 -0
- package/dist/web/routes/health.js +37 -0
- package/dist/web/routes/health.js.map +1 -0
- package/dist/web/routes/insights.d.ts +0 -5
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +783 -2
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +16 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/knowledge.js +661 -0
- package/dist/web/routes/knowledge.js.map +1 -0
- package/dist/web/routes/patch.d.ts +60 -1
- package/dist/web/routes/patch.d.ts.map +1 -1
- package/dist/web/routes/patch.js +170 -64
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +37 -0
- package/dist/web/routes/pipeline.d.ts.map +1 -0
- package/dist/web/routes/pipeline.js +149 -0
- package/dist/web/routes/pipeline.js.map +1 -0
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +6 -1
- 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 +9 -1
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-content.d.ts +30 -0
- package/dist/web/routes/skill-content.d.ts.map +1 -0
- package/dist/web/routes/skill-content.js +117 -0
- package/dist/web/routes/skill-content.js.map +1 -0
- package/dist/web/routes/skills-distill.d.ts +29 -0
- package/dist/web/routes/skills-distill.d.ts.map +1 -0
- package/dist/web/routes/skills-distill.js +552 -0
- package/dist/web/routes/skills-distill.js.map +1 -0
- package/dist/web/routes/skills.js +7 -7
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +102 -0
- package/dist/web/routes/task-timeline.d.ts.map +1 -0
- package/dist/web/routes/task-timeline.js +274 -0
- package/dist/web/routes/task-timeline.js.map +1 -0
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +355 -8
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/trace.d.ts.map +1 -1
- package/dist/web/routes/trace.js +3 -2
- package/dist/web/routes/trace.js.map +1 -1
- package/dist/web/routes/types.d.ts +0 -4
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +1 -1
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/routes/violations.d.ts +14 -0
- package/dist/web/routes/violations.d.ts.map +1 -0
- package/dist/web/routes/violations.js +111 -0
- package/dist/web/routes/violations.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +79 -19
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/build-manager.d.ts +72 -0
- package/dist/web/services/build-manager.d.ts.map +1 -0
- package/dist/web/services/build-manager.js +189 -0
- package/dist/web/services/build-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +125 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -0
- package/dist/web/services/distill-manager.js +308 -0
- package/dist/web/services/distill-manager.js.map +1 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
- package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
- package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
- package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
- package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
- package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
- package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
- package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
- package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
- package/dist/web/static/index.html +12 -8
- package/package.json +14 -3
- package/dist/core/ai/provider.d.ts +0 -63
- package/dist/core/ai/provider.d.ts.map +0 -1
- package/dist/core/ai/provider.js +0 -241
- package/dist/core/ai/provider.js.map +0 -1
- package/dist/core/ai/types.d.ts +0 -43
- package/dist/core/ai/types.d.ts.map +0 -1
- package/dist/core/ai/types.js +0 -5
- package/dist/core/ai/types.js.map +0 -1
- package/dist/core/storage/token-usage.d.ts +0 -36
- package/dist/core/storage/token-usage.d.ts.map +0 -1
- package/dist/core/storage/token-usage.js +0 -59
- package/dist/core/storage/token-usage.js.map +0 -1
- package/dist/core/utils/token-tracker.d.ts +0 -39
- package/dist/core/utils/token-tracker.d.ts.map +0 -1
- package/dist/core/utils/token-tracker.js +0 -69
- package/dist/core/utils/token-tracker.js.map +0 -1
- package/dist/skills/index.d.ts +0 -3
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -3
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/matcher.d.ts +0 -26
- package/dist/skills/matcher.d.ts.map +0 -1
- package/dist/skills/matcher.js +0 -113
- package/dist/skills/matcher.js.map +0 -1
- package/dist/skills/official/code-simplifier.md +0 -52
- package/dist/skills/official/find-skills.md +0 -142
- package/dist/skills/official/official-api-design.md +0 -30
- package/dist/skills/official/official-architecture-decision.md +0 -41
- package/dist/skills/official/official-bmad.md +0 -118
- package/dist/skills/official/official-db-schema-design.md +0 -34
- package/dist/skills/official/official-debug.md +0 -25
- package/dist/skills/official/official-doc-driven.md +0 -31
- package/dist/skills/official/official-harness-engineering.md +0 -108
- package/dist/skills/official/official-performance-optimization.md +0 -30
- package/dist/skills/official/official-pr-review.md +0 -35
- package/dist/skills/official/official-release-checklist.md +0 -30
- package/dist/skills/official/official-security-hardening.md +0 -32
- package/dist/skills/official/official-spec-driven-design.md +0 -31
- package/dist/skills/official/planning-with-files.md +0 -241
- package/dist/skills/official/ui-ux-pro-max.md +0 -105
- package/dist/skills/official/webapp-testing.md +0 -96
- package/dist/skills/official-skills.d.ts +0 -26
- package/dist/skills/official-skills.d.ts.map +0 -1
- package/dist/skills/official-skills.js +0 -73
- package/dist/skills/official-skills.js.map +0 -1
- package/dist/skills/semantic-matcher.d.ts +0 -60
- package/dist/skills/semantic-matcher.d.ts.map +0 -1
- package/dist/skills/semantic-matcher.js +0 -192
- package/dist/skills/semantic-matcher.js.map +0 -1
- package/dist/skills/upgrade-engine.d.ts +0 -93
- package/dist/skills/upgrade-engine.d.ts.map +0 -1
- package/dist/skills/upgrade-engine.js +0 -447
- package/dist/skills/upgrade-engine.js.map +0 -1
- package/dist/skills/upgrade-prompt.d.ts +0 -20
- package/dist/skills/upgrade-prompt.d.ts.map +0 -1
- package/dist/skills/upgrade-prompt.js +0 -75
- package/dist/skills/upgrade-prompt.js.map +0 -1
- package/dist/web/routes/ai.d.ts +0 -10
- package/dist/web/routes/ai.d.ts.map +0 -1
- package/dist/web/routes/ai.js +0 -186
- package/dist/web/routes/ai.js.map +0 -1
- package/dist/web/routes/token-usage.d.ts +0 -7
- package/dist/web/routes/token-usage.d.ts.map +0 -1
- package/dist/web/routes/token-usage.js +0 -18
- package/dist/web/routes/token-usage.js.map +0 -1
- package/dist/web/ssrf-guard.d.ts +0 -35
- package/dist/web/ssrf-guard.d.ts.map +0 -1
- package/dist/web/ssrf-guard.js +0 -93
- package/dist/web/ssrf-guard.js.map +0 -1
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
- package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
- package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
- package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
- package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
- package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
- package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
- package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
- package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
- package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
- package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
- package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
- package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
- package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
- package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
- package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
- package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
- package/dist/web/static/assets/index-CBX47X8l.js +0 -3
- package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
- package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
- package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
- package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
- package/dist/web/static/assets/query-C99w429o.js +0 -2
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
- package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
- package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
- package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
- package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
- package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecApproval — v9.x Phase 2b approve-token verifier.
|
|
3
|
+
*
|
|
4
|
+
* Companion service to `SpecGenerator`. Called by `UserPromptHandler.step 2.7`
|
|
5
|
+
* when the user types `approve <token>` exactly. The handler:
|
|
6
|
+
* 1. Detects the 'approve <8-hex>' pattern
|
|
7
|
+
* 2. Asks `SpecApproval.verify(token, session_id)` for the outcome
|
|
8
|
+
* 3. Surfaces a systemMessage based on the outcome
|
|
9
|
+
* 4. Short-circuits if outcome === 'ok' (skips KB / Skill / workflow rec)
|
|
10
|
+
*
|
|
11
|
+
* Why a separate service: keeps the handler thin and makes the verifier
|
|
12
|
+
* trivially testable without spinning up the whole UserPromptHandler graph.
|
|
13
|
+
*
|
|
14
|
+
* P0 safety (doc-reviewer Sub-2 report): verify() MUST filter by session_id.
|
|
15
|
+
* A token leaked across sessions must NOT be approve-able. The underlying
|
|
16
|
+
* facade method `findSpecByTokenAndSession` enforces this.
|
|
17
|
+
*
|
|
18
|
+
* No 'modify' code path is implemented in Phase 2b (spec § 3.4 mentions it
|
|
19
|
+
* in the systemMessage hint but § 3.5 leaves it un-implemented). The
|
|
20
|
+
* handler-side messages have been adjusted to advertise only `approve` and
|
|
21
|
+
* `skip`. See changelog "modify path simplification" decision.
|
|
22
|
+
*/
|
|
23
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
24
|
+
import type { SpecLikeRow } from '../../core/storage/decisions.js';
|
|
25
|
+
import type { SpecApprovalOutcome, SpecApprovalResult, SpecApprovalRowLike } from '../../core/types.js';
|
|
26
|
+
/**
|
|
27
|
+
* Regex matching exactly `approve <8-hex>` with no surrounding text.
|
|
28
|
+
*
|
|
29
|
+
* Kept for backward compatibility — `extractToken` still uses it for the
|
|
30
|
+
* pure-token path. Bug 1 (2026-05-27 spec § 3.1) extends approval semantics
|
|
31
|
+
* to CJK / token-less variants via {@link APPROVAL_KEYWORD_REGEX} + the new
|
|
32
|
+
* {@link SpecApproval.extractApprovalIntent} method.
|
|
33
|
+
*/
|
|
34
|
+
export declare const APPROVE_REGEX: RegExp;
|
|
35
|
+
/**
|
|
36
|
+
* Regex matching the WHOLE prompt as a bare approval keyword
|
|
37
|
+
* (Chinese / English) OPTIONALLY followed by an 8-hex token. Used by
|
|
38
|
+
* {@link SpecApproval.extractApprovalIntent} so any of the following short-
|
|
39
|
+
* circuit into spec-approval pipeline (Bug 1 spec § 3.1):
|
|
40
|
+
*
|
|
41
|
+
* '批准' → hasIntent=true, token=undefined → fallback search
|
|
42
|
+
* '同意' → ditto (Chinese formal)
|
|
43
|
+
* 'approve' → ditto (English bare; legacy regex required token)
|
|
44
|
+
* '批准 a1b2c3d4' → hasIntent=true, token='a1b2c3d4'
|
|
45
|
+
* '批准 A1B2C3D4 ' → tolerates whitespace + case
|
|
46
|
+
*
|
|
47
|
+
* Strict anchoring (`^…$`) prevents '我同意,但是...' from matching — a
|
|
48
|
+
* complex sentence containing the keyword is NOT an approval signal.
|
|
49
|
+
*/
|
|
50
|
+
export declare const APPROVAL_KEYWORD_REGEX: RegExp;
|
|
51
|
+
/**
|
|
52
|
+
* Result of {@link SpecApproval.extractApprovalIntent}. `hasIntent` is the
|
|
53
|
+
* caller's short-circuit gate; `token` is set ONLY when the prompt carried
|
|
54
|
+
* an explicit 8-hex (otherwise the caller must fallback to listSessionPending).
|
|
55
|
+
*/
|
|
56
|
+
export interface ApprovalIntent {
|
|
57
|
+
hasIntent: boolean;
|
|
58
|
+
token?: string;
|
|
59
|
+
}
|
|
60
|
+
export declare class SpecApproval {
|
|
61
|
+
private readonly storage;
|
|
62
|
+
constructor(storage: SQLiteStorage);
|
|
63
|
+
/**
|
|
64
|
+
* Try to extract a token from a raw user prompt. Returns the 8-hex string
|
|
65
|
+
* (lowercase) when the WHOLE prompt is exactly `approve <token>`. Returns
|
|
66
|
+
* null otherwise — that's the signal for the handler to NOT short-circuit.
|
|
67
|
+
*
|
|
68
|
+
* Strict-format requirement (spec § 3.5 risk note): if the user mixes
|
|
69
|
+
* 'approve abc12345' with additional text, we let the prompt proceed
|
|
70
|
+
* through the normal pipeline to avoid losing their new request.
|
|
71
|
+
*/
|
|
72
|
+
extractToken(prompt: string): string | null;
|
|
73
|
+
/**
|
|
74
|
+
* Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval detector.
|
|
75
|
+
* Returns:
|
|
76
|
+
* - `{ hasIntent: false }` when prompt is NOT an approval signal
|
|
77
|
+
* - `{ hasIntent: true, token }` when prompt is e.g. '批准 a1b2c3d4'
|
|
78
|
+
* - `{ hasIntent: true }` (no token) when prompt is bare '批准' / 'approve'
|
|
79
|
+
*
|
|
80
|
+
* Caller (`SpecGate.handleApproval`) uses `hasIntent` as the short-circuit
|
|
81
|
+
* gate and `token` to decide whether to call `verify` directly or fall back
|
|
82
|
+
* to `listSessionPending` to pick the latest pending row.
|
|
83
|
+
*
|
|
84
|
+
* Strict-format anchoring prevents complex sentences like '我同意,但是…'
|
|
85
|
+
* from triggering approval — the keyword must be the WHOLE prompt.
|
|
86
|
+
*/
|
|
87
|
+
extractApprovalIntent(prompt: string): ApprovalIntent;
|
|
88
|
+
/**
|
|
89
|
+
* Verify a token. C1 (spec 0854): look up the decisions table (kind='spec'),
|
|
90
|
+
* scoped by session_id (P0 safety — a leaked cross-session token must never
|
|
91
|
+
* approve someone else's spec). The legacy pending_specs table is gone.
|
|
92
|
+
*
|
|
93
|
+
* Outcomes (see SpecApprovalResult in src/core/types.ts):
|
|
94
|
+
* • 'ok' — found, status='generated', flipped to 'approved'
|
|
95
|
+
* • 'not_found' — token unknown OR session mismatch (P0 safety)
|
|
96
|
+
* • 'expired' — found but status='expired'
|
|
97
|
+
* • 'already_approved' — found but status='approved'
|
|
98
|
+
*
|
|
99
|
+
* The function COMMITS the status flip when outcome === 'ok' via
|
|
100
|
+
* markSpecApproved (decisions). Idempotent.
|
|
101
|
+
*/
|
|
102
|
+
verify(token: string, sessionId: string, nowIso?: string): SpecApprovalResult;
|
|
103
|
+
/**
|
|
104
|
+
* List still-pending specs for a session (for the "unknown token" hint).
|
|
105
|
+
*
|
|
106
|
+
* C1 (spec 0854): reads decisions kind='spec' pending rows only. Returns the
|
|
107
|
+
* SpecLikeRow shape consumed by spec-gate / formatApprovalMessage.
|
|
108
|
+
*/
|
|
109
|
+
listSessionPending(sessionId: string, limit?: number): SpecLikeRow[];
|
|
110
|
+
private classifyAndCommit;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Render the systemMessage shown to the main thread for each outcome.
|
|
114
|
+
*
|
|
115
|
+
* Centralized here so SpecGenerator / SpecApproval / the handler all agree
|
|
116
|
+
* on the wording. Format is intentionally short to keep the system message
|
|
117
|
+
* cheap (KB inject + intent + KB block already accumulate).
|
|
118
|
+
*/
|
|
119
|
+
export declare function formatApprovalMessage(outcome: SpecApprovalOutcome, args: {
|
|
120
|
+
token: string;
|
|
121
|
+
row?: SpecApprovalRowLike;
|
|
122
|
+
pendingList?: Array<{
|
|
123
|
+
token: string;
|
|
124
|
+
spec_path: string;
|
|
125
|
+
}>;
|
|
126
|
+
}): string;
|
|
127
|
+
//# sourceMappingURL=spec-approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-approval.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/spec-approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAG7B;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAqC,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,QACc,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAEnD;;;;;;;;OAQG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM3C;;;;;;;;;;;;;OAaG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAQrD;;;;;;;;;;;;;OAaG;IACH,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB;IAcrB;;;;;OAKG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,WAAW,EAAE;IAS/D,OAAO,CAAC,iBAAiB;CAkC1B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IAId,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D,GACA,MAAM,CAmCR"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecApproval — v9.x Phase 2b approve-token verifier.
|
|
3
|
+
*
|
|
4
|
+
* Companion service to `SpecGenerator`. Called by `UserPromptHandler.step 2.7`
|
|
5
|
+
* when the user types `approve <token>` exactly. The handler:
|
|
6
|
+
* 1. Detects the 'approve <8-hex>' pattern
|
|
7
|
+
* 2. Asks `SpecApproval.verify(token, session_id)` for the outcome
|
|
8
|
+
* 3. Surfaces a systemMessage based on the outcome
|
|
9
|
+
* 4. Short-circuits if outcome === 'ok' (skips KB / Skill / workflow rec)
|
|
10
|
+
*
|
|
11
|
+
* Why a separate service: keeps the handler thin and makes the verifier
|
|
12
|
+
* trivially testable without spinning up the whole UserPromptHandler graph.
|
|
13
|
+
*
|
|
14
|
+
* P0 safety (doc-reviewer Sub-2 report): verify() MUST filter by session_id.
|
|
15
|
+
* A token leaked across sessions must NOT be approve-able. The underlying
|
|
16
|
+
* facade method `findSpecByTokenAndSession` enforces this.
|
|
17
|
+
*
|
|
18
|
+
* No 'modify' code path is implemented in Phase 2b (spec § 3.4 mentions it
|
|
19
|
+
* in the systemMessage hint but § 3.5 leaves it un-implemented). The
|
|
20
|
+
* handler-side messages have been adjusted to advertise only `approve` and
|
|
21
|
+
* `skip`. See changelog "modify path simplification" decision.
|
|
22
|
+
*/
|
|
23
|
+
import { toSpecLikeRow } from '../../core/storage/decisions.js';
|
|
24
|
+
import { logger } from '../../core/utils/logger.js';
|
|
25
|
+
/**
|
|
26
|
+
* Regex matching exactly `approve <8-hex>` with no surrounding text.
|
|
27
|
+
*
|
|
28
|
+
* Kept for backward compatibility — `extractToken` still uses it for the
|
|
29
|
+
* pure-token path. Bug 1 (2026-05-27 spec § 3.1) extends approval semantics
|
|
30
|
+
* to CJK / token-less variants via {@link APPROVAL_KEYWORD_REGEX} + the new
|
|
31
|
+
* {@link SpecApproval.extractApprovalIntent} method.
|
|
32
|
+
*/
|
|
33
|
+
export const APPROVE_REGEX = /^\s*approve\s+([a-f0-9]{8})\s*$/i;
|
|
34
|
+
/**
|
|
35
|
+
* Regex matching the WHOLE prompt as a bare approval keyword
|
|
36
|
+
* (Chinese / English) OPTIONALLY followed by an 8-hex token. Used by
|
|
37
|
+
* {@link SpecApproval.extractApprovalIntent} so any of the following short-
|
|
38
|
+
* circuit into spec-approval pipeline (Bug 1 spec § 3.1):
|
|
39
|
+
*
|
|
40
|
+
* '批准' → hasIntent=true, token=undefined → fallback search
|
|
41
|
+
* '同意' → ditto (Chinese formal)
|
|
42
|
+
* 'approve' → ditto (English bare; legacy regex required token)
|
|
43
|
+
* '批准 a1b2c3d4' → hasIntent=true, token='a1b2c3d4'
|
|
44
|
+
* '批准 A1B2C3D4 ' → tolerates whitespace + case
|
|
45
|
+
*
|
|
46
|
+
* Strict anchoring (`^…$`) prevents '我同意,但是...' from matching — a
|
|
47
|
+
* complex sentence containing the keyword is NOT an approval signal.
|
|
48
|
+
*/
|
|
49
|
+
export const APPROVAL_KEYWORD_REGEX = /^\s*(批准|同意|approve)(?:\s+([a-f0-9]{8}))?\s*$/i;
|
|
50
|
+
export class SpecApproval {
|
|
51
|
+
storage;
|
|
52
|
+
constructor(storage) {
|
|
53
|
+
this.storage = storage;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Try to extract a token from a raw user prompt. Returns the 8-hex string
|
|
57
|
+
* (lowercase) when the WHOLE prompt is exactly `approve <token>`. Returns
|
|
58
|
+
* null otherwise — that's the signal for the handler to NOT short-circuit.
|
|
59
|
+
*
|
|
60
|
+
* Strict-format requirement (spec § 3.5 risk note): if the user mixes
|
|
61
|
+
* 'approve abc12345' with additional text, we let the prompt proceed
|
|
62
|
+
* through the normal pipeline to avoid losing their new request.
|
|
63
|
+
*/
|
|
64
|
+
extractToken(prompt) {
|
|
65
|
+
if (!prompt)
|
|
66
|
+
return null;
|
|
67
|
+
const m = prompt.match(APPROVE_REGEX);
|
|
68
|
+
return m ? m[1].toLowerCase() : null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval detector.
|
|
72
|
+
* Returns:
|
|
73
|
+
* - `{ hasIntent: false }` when prompt is NOT an approval signal
|
|
74
|
+
* - `{ hasIntent: true, token }` when prompt is e.g. '批准 a1b2c3d4'
|
|
75
|
+
* - `{ hasIntent: true }` (no token) when prompt is bare '批准' / 'approve'
|
|
76
|
+
*
|
|
77
|
+
* Caller (`SpecGate.handleApproval`) uses `hasIntent` as the short-circuit
|
|
78
|
+
* gate and `token` to decide whether to call `verify` directly or fall back
|
|
79
|
+
* to `listSessionPending` to pick the latest pending row.
|
|
80
|
+
*
|
|
81
|
+
* Strict-format anchoring prevents complex sentences like '我同意,但是…'
|
|
82
|
+
* from triggering approval — the keyword must be the WHOLE prompt.
|
|
83
|
+
*/
|
|
84
|
+
extractApprovalIntent(prompt) {
|
|
85
|
+
if (!prompt)
|
|
86
|
+
return { hasIntent: false };
|
|
87
|
+
const m = prompt.match(APPROVAL_KEYWORD_REGEX);
|
|
88
|
+
if (!m)
|
|
89
|
+
return { hasIntent: false };
|
|
90
|
+
const token = m[2] ? m[2].toLowerCase() : undefined;
|
|
91
|
+
return { hasIntent: true, token };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Verify a token. C1 (spec 0854): look up the decisions table (kind='spec'),
|
|
95
|
+
* scoped by session_id (P0 safety — a leaked cross-session token must never
|
|
96
|
+
* approve someone else's spec). The legacy pending_specs table is gone.
|
|
97
|
+
*
|
|
98
|
+
* Outcomes (see SpecApprovalResult in src/core/types.ts):
|
|
99
|
+
* • 'ok' — found, status='generated', flipped to 'approved'
|
|
100
|
+
* • 'not_found' — token unknown OR session mismatch (P0 safety)
|
|
101
|
+
* • 'expired' — found but status='expired'
|
|
102
|
+
* • 'already_approved' — found but status='approved'
|
|
103
|
+
*
|
|
104
|
+
* The function COMMITS the status flip when outcome === 'ok' via
|
|
105
|
+
* markSpecApproved (decisions). Idempotent.
|
|
106
|
+
*/
|
|
107
|
+
verify(token, sessionId, nowIso) {
|
|
108
|
+
if (!token || !sessionId) {
|
|
109
|
+
return { outcome: 'not_found' };
|
|
110
|
+
}
|
|
111
|
+
const tok = token.toLowerCase();
|
|
112
|
+
const decisionRow = this.storage.findSpecByTokenAndSession(tok, sessionId);
|
|
113
|
+
if (decisionRow) {
|
|
114
|
+
return this.classifyAndCommit(toSpecLikeRow(decisionRow), decisionRow.id, nowIso);
|
|
115
|
+
}
|
|
116
|
+
return { outcome: 'not_found' };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* List still-pending specs for a session (for the "unknown token" hint).
|
|
120
|
+
*
|
|
121
|
+
* C1 (spec 0854): reads decisions kind='spec' pending rows only. Returns the
|
|
122
|
+
* SpecLikeRow shape consumed by spec-gate / formatApprovalMessage.
|
|
123
|
+
*/
|
|
124
|
+
listSessionPending(sessionId, limit = 5) {
|
|
125
|
+
return this.storage
|
|
126
|
+
.listSpecsBySessionPending(sessionId, limit)
|
|
127
|
+
.map((d) => toSpecLikeRow(d))
|
|
128
|
+
.slice(0, limit);
|
|
129
|
+
}
|
|
130
|
+
// ── Internals ─────────────────────────────────────────────────────────
|
|
131
|
+
classifyAndCommit(row, rowId, nowIso) {
|
|
132
|
+
switch (row.status) {
|
|
133
|
+
case 'expired':
|
|
134
|
+
return { outcome: 'expired', row };
|
|
135
|
+
case 'approved':
|
|
136
|
+
return { outcome: 'already_approved', row };
|
|
137
|
+
case 'skipped':
|
|
138
|
+
case 'modified':
|
|
139
|
+
// Treat anything non-'generated' that isn't expired/approved as
|
|
140
|
+
// already-approved for UX simplicity. Surface row so the caller
|
|
141
|
+
// can format a useful systemMessage.
|
|
142
|
+
return { outcome: 'already_approved', row };
|
|
143
|
+
case 'generated':
|
|
144
|
+
try {
|
|
145
|
+
this.storage.markSpecApproved(rowId, nowIso);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
logger.warn(`[SpecApproval] markApproved failed for id=${rowId}: ${err}`);
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
outcome: 'ok',
|
|
152
|
+
row: {
|
|
153
|
+
...row,
|
|
154
|
+
status: 'approved',
|
|
155
|
+
approved_at: nowIso ?? new Date().toISOString(),
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
default:
|
|
159
|
+
return { outcome: 'not_found', row };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Render the systemMessage shown to the main thread for each outcome.
|
|
165
|
+
*
|
|
166
|
+
* Centralized here so SpecGenerator / SpecApproval / the handler all agree
|
|
167
|
+
* on the wording. Format is intentionally short to keep the system message
|
|
168
|
+
* cheap (KB inject + intent + KB block already accumulate).
|
|
169
|
+
*/
|
|
170
|
+
export function formatApprovalMessage(outcome, args) {
|
|
171
|
+
const { token, row, pendingList } = args;
|
|
172
|
+
switch (outcome) {
|
|
173
|
+
case 'ok': {
|
|
174
|
+
const spec = row?.spec_path ?? '(unknown spec)';
|
|
175
|
+
const intent = safeParseIntent(row?.intent_json);
|
|
176
|
+
const agent = intent?.suggested_agent ?? 'planner';
|
|
177
|
+
return [
|
|
178
|
+
'[AUTO-SPEC APPROVED]',
|
|
179
|
+
'',
|
|
180
|
+
`Spec 已批准: ${spec}`,
|
|
181
|
+
`推荐 agent: ${agent}`,
|
|
182
|
+
'',
|
|
183
|
+
`主线程请用 Task tool spawn subagent_type='${agent}'`,
|
|
184
|
+
`Task prompt 必须以 "Read ${spec} 然后..." 开头。`,
|
|
185
|
+
].join('\n');
|
|
186
|
+
}
|
|
187
|
+
case 'not_found': {
|
|
188
|
+
const hint = pendingList && pendingList.length > 0
|
|
189
|
+
? '\n当前 pending tokens:\n' +
|
|
190
|
+
pendingList
|
|
191
|
+
.map((r) => ` • ${r.token} → ${r.spec_path}`)
|
|
192
|
+
.join('\n')
|
|
193
|
+
: '\n本 session 没有 pending spec。';
|
|
194
|
+
return `[AUTO-SPEC] 未找到 token "${token}"。可能已过期,或不属于本 session。${hint}`;
|
|
195
|
+
}
|
|
196
|
+
case 'expired':
|
|
197
|
+
return `[AUTO-SPEC] token "${token}" 已过期。请重新发起原 prompt 让 daemon 生成新 spec。`;
|
|
198
|
+
case 'already_approved':
|
|
199
|
+
return `[AUTO-SPEC] token "${token}" 已被 approve 过。请按 spec 执行;无需再次回复 approve。`;
|
|
200
|
+
case 'wrong_session':
|
|
201
|
+
return `[AUTO-SPEC] token "${token}" 不属于本 session。`;
|
|
202
|
+
default:
|
|
203
|
+
return `[AUTO-SPEC] 未识别的状态。`;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function safeParseIntent(json) {
|
|
207
|
+
if (!json)
|
|
208
|
+
return null;
|
|
209
|
+
try {
|
|
210
|
+
return JSON.parse(json);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=spec-approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-approval.js","sourceRoot":"","sources":["../../../src/daemon/services/spec-approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecGate — orchestrates the approve-token short-circuit (step 0) inside
|
|
3
|
+
* `UserPromptHandler`.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from `UserPromptHandler` (D-3 step 0). Stateless wrapper around
|
|
6
|
+
* `SpecApproval` so the handler can stay thin.
|
|
7
|
+
*
|
|
8
|
+
* The method is fail-silent unless documented otherwise — the prompt pipeline
|
|
9
|
+
* must keep running even if persistence hiccups.
|
|
10
|
+
*
|
|
11
|
+
* 2026-05-27 Spec 1702: `tryAutoGenerate` + `SpecGenerator` integration
|
|
12
|
+
* removed entirely (0% real-world acceptance rate → dead code).
|
|
13
|
+
* `SpecApproval` + `handleApproval` + `handleApproveToken` are preserved for
|
|
14
|
+
* the hand-written spec register path (planner agent calls `cf spec register`
|
|
15
|
+
* then user replies "批准").
|
|
16
|
+
*/
|
|
17
|
+
import type { UserPromptSubmitEvent } from '../../core/types.js';
|
|
18
|
+
import type { SpecApproval } from './spec-approval.js';
|
|
19
|
+
export declare class SpecGate {
|
|
20
|
+
private readonly specApproval;
|
|
21
|
+
constructor(specApproval?: SpecApproval | null);
|
|
22
|
+
/**
|
|
23
|
+
* Step 0 short-circuit: if the prompt is exactly `approve <8-hex>`,
|
|
24
|
+
* verify the token and return a system message. Returns `null` when the
|
|
25
|
+
* prompt is not an approve command (caller continues the regular pipeline).
|
|
26
|
+
*
|
|
27
|
+
* @deprecated Bug 1 (2026-05-27 spec § 3.1) — use {@link handleApproval}
|
|
28
|
+
* instead, which also handles bare CJK keywords ('批准' / '同意') and
|
|
29
|
+
* falls back to the latest pending row when no token is supplied. Kept
|
|
30
|
+
* for backwards compatibility / unit tests that already cover the
|
|
31
|
+
* token-only path.
|
|
32
|
+
*/
|
|
33
|
+
handleApproveToken(event: UserPromptSubmitEvent, prompt: string): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval handler.
|
|
36
|
+
*
|
|
37
|
+
* Recognises:
|
|
38
|
+
* - 'approve <8-hex>' → verify token directly
|
|
39
|
+
* - '批准 <8-hex>' / '同意 <8-hex>' → verify token directly
|
|
40
|
+
* - bare '批准' / '同意' / 'approve' → fallback to latest pending row in
|
|
41
|
+
* the session, verify its token
|
|
42
|
+
*
|
|
43
|
+
* Returns:
|
|
44
|
+
* - systemMessage string → caller short-circuits (skip KB / Skill / wf rec)
|
|
45
|
+
* - null → not an approval signal; caller runs normal pipe
|
|
46
|
+
*
|
|
47
|
+
* Per spec Q6 (user-approved): even when fallback finds NO pending row,
|
|
48
|
+
* we STILL short-circuit with a [AUTO-SPEC] '本 session 没有 pending spec'
|
|
49
|
+
* systemMessage. Letting bare '批准' fall through to normal pipeline would
|
|
50
|
+
* eat the prompt as a no-op task title (Bug 1 root cause).
|
|
51
|
+
*/
|
|
52
|
+
handleApproval(event: UserPromptSubmitEvent, prompt: string): string | null;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=spec-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-gate.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/spec-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,GAAE,YAAY,GAAG,IAAW;IAG3D;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkB/E;;;;;;;;;;;;;;;;;OAiBG;IACH,cAAc,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAkD5E"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecGate — orchestrates the approve-token short-circuit (step 0) inside
|
|
3
|
+
* `UserPromptHandler`.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from `UserPromptHandler` (D-3 step 0). Stateless wrapper around
|
|
6
|
+
* `SpecApproval` so the handler can stay thin.
|
|
7
|
+
*
|
|
8
|
+
* The method is fail-silent unless documented otherwise — the prompt pipeline
|
|
9
|
+
* must keep running even if persistence hiccups.
|
|
10
|
+
*
|
|
11
|
+
* 2026-05-27 Spec 1702: `tryAutoGenerate` + `SpecGenerator` integration
|
|
12
|
+
* removed entirely (0% real-world acceptance rate → dead code).
|
|
13
|
+
* `SpecApproval` + `handleApproval` + `handleApproveToken` are preserved for
|
|
14
|
+
* the hand-written spec register path (planner agent calls `cf spec register`
|
|
15
|
+
* then user replies "批准").
|
|
16
|
+
*/
|
|
17
|
+
import { formatApprovalMessage } from './spec-approval.js';
|
|
18
|
+
import { logger } from '../../core/utils/logger.js';
|
|
19
|
+
export class SpecGate {
|
|
20
|
+
specApproval;
|
|
21
|
+
constructor(specApproval = null) {
|
|
22
|
+
this.specApproval = specApproval;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Step 0 short-circuit: if the prompt is exactly `approve <8-hex>`,
|
|
26
|
+
* verify the token and return a system message. Returns `null` when the
|
|
27
|
+
* prompt is not an approve command (caller continues the regular pipeline).
|
|
28
|
+
*
|
|
29
|
+
* @deprecated Bug 1 (2026-05-27 spec § 3.1) — use {@link handleApproval}
|
|
30
|
+
* instead, which also handles bare CJK keywords ('批准' / '同意') and
|
|
31
|
+
* falls back to the latest pending row when no token is supplied. Kept
|
|
32
|
+
* for backwards compatibility / unit tests that already cover the
|
|
33
|
+
* token-only path.
|
|
34
|
+
*/
|
|
35
|
+
handleApproveToken(event, prompt) {
|
|
36
|
+
if (!this.specApproval)
|
|
37
|
+
return null;
|
|
38
|
+
const token = this.specApproval.extractToken(prompt);
|
|
39
|
+
if (!token)
|
|
40
|
+
return null;
|
|
41
|
+
const result = this.specApproval.verify(token, event.session_id, event.timestamp);
|
|
42
|
+
const pendingList = result.outcome === 'not_found'
|
|
43
|
+
? this.specApproval.listSessionPending(event.session_id)
|
|
44
|
+
: undefined;
|
|
45
|
+
const msg = formatApprovalMessage(result.outcome, {
|
|
46
|
+
token,
|
|
47
|
+
row: result.row,
|
|
48
|
+
pendingList,
|
|
49
|
+
});
|
|
50
|
+
logger.info(`[SpecGate] Approve short-circuit: ${result.outcome} token=${token}`);
|
|
51
|
+
return msg;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval handler.
|
|
55
|
+
*
|
|
56
|
+
* Recognises:
|
|
57
|
+
* - 'approve <8-hex>' → verify token directly
|
|
58
|
+
* - '批准 <8-hex>' / '同意 <8-hex>' → verify token directly
|
|
59
|
+
* - bare '批准' / '同意' / 'approve' → fallback to latest pending row in
|
|
60
|
+
* the session, verify its token
|
|
61
|
+
*
|
|
62
|
+
* Returns:
|
|
63
|
+
* - systemMessage string → caller short-circuits (skip KB / Skill / wf rec)
|
|
64
|
+
* - null → not an approval signal; caller runs normal pipe
|
|
65
|
+
*
|
|
66
|
+
* Per spec Q6 (user-approved): even when fallback finds NO pending row,
|
|
67
|
+
* we STILL short-circuit with a [AUTO-SPEC] '本 session 没有 pending spec'
|
|
68
|
+
* systemMessage. Letting bare '批准' fall through to normal pipeline would
|
|
69
|
+
* eat the prompt as a no-op task title (Bug 1 root cause).
|
|
70
|
+
*/
|
|
71
|
+
handleApproval(event, prompt) {
|
|
72
|
+
if (!this.specApproval)
|
|
73
|
+
return null;
|
|
74
|
+
const intent = this.specApproval.extractApprovalIntent(prompt);
|
|
75
|
+
if (!intent.hasIntent)
|
|
76
|
+
return null;
|
|
77
|
+
// Path A: caller supplied explicit token → direct verify (legacy behavior).
|
|
78
|
+
if (intent.token) {
|
|
79
|
+
const result = this.specApproval.verify(intent.token, event.session_id, event.timestamp);
|
|
80
|
+
const pendingList = result.outcome === 'not_found'
|
|
81
|
+
? this.specApproval.listSessionPending(event.session_id)
|
|
82
|
+
: undefined;
|
|
83
|
+
const msg = formatApprovalMessage(result.outcome, {
|
|
84
|
+
token: intent.token,
|
|
85
|
+
row: result.row,
|
|
86
|
+
pendingList,
|
|
87
|
+
});
|
|
88
|
+
logger.info(`[SpecGate] Approval short-circuit (with-token): ${result.outcome} token=${intent.token}`);
|
|
89
|
+
return msg;
|
|
90
|
+
}
|
|
91
|
+
// Path B: bare keyword → fallback to the latest pending row for this
|
|
92
|
+
// session. listSessionPending already filters status='generated' DESC by
|
|
93
|
+
// created_at, so LIMIT 1 gives us the most recent unapproved spec.
|
|
94
|
+
const recent = this.specApproval.listSessionPending(event.session_id, 1);
|
|
95
|
+
if (recent.length === 0) {
|
|
96
|
+
// Spec Q6: no pending → return systemMessage saying so (DON'T fallthrough).
|
|
97
|
+
logger.info('[SpecGate] Approval short-circuit (no-token): no pending spec found');
|
|
98
|
+
return formatApprovalMessage('not_found', {
|
|
99
|
+
token: '(无 token)',
|
|
100
|
+
pendingList: [],
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const candidate = recent[0];
|
|
104
|
+
const result = this.specApproval.verify(candidate.token, event.session_id, event.timestamp);
|
|
105
|
+
logger.info(`[SpecGate] Approval short-circuit (no-token fallback): ${result.outcome} ` +
|
|
106
|
+
`token=${candidate.token} spec=${candidate.spec_path}`);
|
|
107
|
+
return formatApprovalMessage(result.outcome, {
|
|
108
|
+
token: candidate.token,
|
|
109
|
+
row: result.row ?? candidate,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=spec-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-gate.js","sourceRoot":"","sources":["../../../src/daemon/services/spec-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TaskBoundaryClassifier — async LLM "new task vs continuation" re-attribution.
|
|
3
|
+
*
|
|
4
|
+
* decision 265f59d5 (Option A, 2026-06-08). Solves the residual case the
|
|
5
|
+
* synchronous lexical segmenter cannot: a SHORT, ambiguous follow-up prompt
|
|
6
|
+
* that is neither a clear ack ("继续"/"好的") nor carries a NEW_TASK_KEYWORD,
|
|
7
|
+
* e.g. "现在全链路是不是都顺了" vs "文件也看下" — lexically indistinguishable,
|
|
8
|
+
* yet one is a new task and the other a continuation.
|
|
9
|
+
*
|
|
10
|
+
* ── Hot-path contract (NEVER block UserPromptSubmit) ──────────────────────
|
|
11
|
+
* The synchronous segmenter ALWAYS runs first and gives the prompt a
|
|
12
|
+
* best-effort task (zero latency). THIS service runs entirely in the
|
|
13
|
+
* background, fire-and-forget. It spawns `claude` (haiku) only for the ~30%
|
|
14
|
+
* of prompts the segmenter flagged ambiguous, then LAZILY re-attributes:
|
|
15
|
+
* • LLM says NEW_TASK → move the prompt's event onto a brand-new task row
|
|
16
|
+
* (only `task_events.task_id` FK is touched — no event delete, no content
|
|
17
|
+
* mutation). See SQLiteStorage.reattributePromptToNewTask.
|
|
18
|
+
* • LLM says CONTINUATION → leave the sync best-effort merge untouched, just
|
|
19
|
+
* stamp `llm_classified_at` so a replay never re-spawns.
|
|
20
|
+
*
|
|
21
|
+
* Failure mode: ANY spawn / timeout / parse error → give up, keep the sync
|
|
22
|
+
* result, never throw. Mirrors OutcomeClassificationService's fire-and-forget
|
|
23
|
+
* discipline.
|
|
24
|
+
*/
|
|
25
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
26
|
+
/** Verdict the agent must return (exactly one of these tokens). */
|
|
27
|
+
export type BoundaryVerdict = 'NEW_TASK' | 'CONTINUATION';
|
|
28
|
+
/**
|
|
29
|
+
* Pluggable spawn function — production binds {@link spawnClaudeCli}; tests
|
|
30
|
+
* inject a stub that returns a canned verdict WITHOUT touching claude.
|
|
31
|
+
*/
|
|
32
|
+
export type BoundarySpawnFn = (prompt: string) => Promise<string>;
|
|
33
|
+
/** A unit of work enqueued by the segmenter for the ambiguous prompt. */
|
|
34
|
+
export interface BoundaryClassifyJob {
|
|
35
|
+
sessionId: string;
|
|
36
|
+
/** The task the sync path best-effort merged this prompt into. */
|
|
37
|
+
mergedTaskId: string;
|
|
38
|
+
/** The UserPromptSubmit event that should move if the verdict is NEW_TASK. */
|
|
39
|
+
eventId: string;
|
|
40
|
+
/** The ambiguous prompt text itself. */
|
|
41
|
+
prompt: string;
|
|
42
|
+
/** Event timestamp (ISO) — used as the new task's start_time. */
|
|
43
|
+
timestamp: string;
|
|
44
|
+
}
|
|
45
|
+
export declare class TaskBoundaryClassifier {
|
|
46
|
+
private readonly spawnFn;
|
|
47
|
+
/**
|
|
48
|
+
* @param spawnFn optional spawn override (tests). Default spawns the
|
|
49
|
+
* `task-boundary-classifier` agent via claude haiku.
|
|
50
|
+
*/
|
|
51
|
+
constructor(opts?: {
|
|
52
|
+
spawnFn?: BoundarySpawnFn;
|
|
53
|
+
timeoutMs?: number;
|
|
54
|
+
claudeBin?: string;
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* Classify one ambiguous prompt and, if NEW_TASK, re-attribute it.
|
|
58
|
+
* Fire-and-forget: never throws. Returns the new task id when it split,
|
|
59
|
+
* else null (CONTINUATION, idempotent skip, or any failure).
|
|
60
|
+
*/
|
|
61
|
+
classify(job: BoundaryClassifyJob, storage: SQLiteStorage): Promise<string | null>;
|
|
62
|
+
private safePriorPrompts;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Build the bare classification prompt handed to the agent. The agent body
|
|
66
|
+
* (.claude/agents/task-boundary-classifier.md) instructs it to answer with a
|
|
67
|
+
* single token; we still keep the contract inline so a bare-prompt spawn
|
|
68
|
+
* (no agent template synced yet) also works.
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildBoundaryPrompt(priorPrompts: string[], current: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* Extract the agent's single-token verdict from raw stdout. Tolerant: the
|
|
73
|
+
* model may wrap the token in punctuation / markdown / a sentence. We scan for
|
|
74
|
+
* the first NEW_TASK / CONTINUATION occurrence (case-insensitive). Returns null
|
|
75
|
+
* when neither token is present (caller keeps the sync merge).
|
|
76
|
+
*/
|
|
77
|
+
export declare function parseVerdict(raw: string): BoundaryVerdict | null;
|
|
78
|
+
//# sourceMappingURL=task-boundary-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-boundary-classifier.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/task-boundary-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAOlE,mEAAmE;AACnE,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,cAAc,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAElE,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAE1C;;;OAGG;gBACS,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,eAAe,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAe5F;;;;OAIG;IACG,QAAQ,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgGxF,OAAO,CAAC,gBAAgB;CAQzB;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAcnF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAUhE"}
|