@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
package/dist/daemon/index.js
CHANGED
|
@@ -8,29 +8,77 @@
|
|
|
8
8
|
* 4. Create event handlers and start socket server
|
|
9
9
|
* 5. Handle graceful shutdown
|
|
10
10
|
*/
|
|
11
|
+
import { readFileSync } from 'node:fs';
|
|
11
12
|
import { SocketServer } from './server.js';
|
|
12
|
-
import { writePidFile, removePidFile, cleanSocket, getSocketPath, writeAuthToken, syncMcpToken, removeAuthToken, } from './lifecycle.js';
|
|
13
|
+
import { writePidFile, removePidFile, cleanSocket, getSocketPath, writeAuthToken, syncMcpToken, removeAuthToken, isAnotherDaemonListening, } from './lifecycle.js';
|
|
13
14
|
import { routeEvent } from './router.js';
|
|
14
|
-
import { logger } from '../core/utils/logger.js';
|
|
15
|
+
import { logger, enableFileLogging } from '../core/utils/logger.js';
|
|
15
16
|
import { ConfigManager } from '../core/config.js';
|
|
16
17
|
import { SQLiteStorage } from '../core/storage/sqlite.js';
|
|
17
18
|
import { expandPath } from '../core/utils/path.js';
|
|
18
|
-
|
|
19
|
+
// D R-A (2026-05-29): ClaudeProvider import removed — daemon no longer
|
|
20
|
+
// instantiates ClaudeProvider at startup. SkillRegistry is now keyword-only
|
|
21
|
+
// and takes no args. Provider file itself is deleted in D R-D.
|
|
22
|
+
// See master spec 0902 §2.4.4 and src/skills/registry.ts (design rationale).
|
|
19
23
|
import { TaskSegmenter } from './services/task-segmenter.js';
|
|
24
|
+
import { TaskBoundaryClassifier } from './services/task-boundary-classifier.js';
|
|
25
|
+
import { sweepIdleSessions } from './services/idle-session-sweeper.js';
|
|
26
|
+
import { sweepInterceptTimeouts } from './services/intercept-timeout-sweeper.js';
|
|
27
|
+
import { sweepEventTtl, resolveSweepConfig, DEFAULTS as TTL_DEFAULTS, } from './services/event-ttl-sweep.js';
|
|
20
28
|
import { SkillRegistry } from '../skills/registry.js';
|
|
21
29
|
import { InvocationGuard } from '../skills/invocation-guard.js';
|
|
22
30
|
import { HistoryExporter } from './handlers/history-exporter.js';
|
|
23
31
|
import { ResumeManager } from '../claudemd/resume-manager.js';
|
|
32
|
+
import { ViolationsManager } from '../claudemd/violations-manager.js';
|
|
24
33
|
import { ConventionExtractor } from '../claudemd/convention-extractor.js';
|
|
25
34
|
import { UserPromptHandler } from './handlers/user-prompt.js';
|
|
26
35
|
import { PostToolUseHandler } from './handlers/post-tool-use.js';
|
|
27
36
|
import { StopHandler } from './handlers/stop.js';
|
|
37
|
+
import { PreToolUseHandler } from './handlers/pre-tool-use.js';
|
|
38
|
+
import { SpecApproval } from './services/spec-approval.js';
|
|
39
|
+
import { RuleRegistry } from './rules/registry.js';
|
|
40
|
+
import { assertWhitelistInvariants } from './rules/whitelist.js';
|
|
28
41
|
import { syncHooks } from './hook-sync.js';
|
|
29
42
|
import { syncSkills } from './skill-sync.js';
|
|
43
|
+
import { syncAgents } from './agent-sync.js';
|
|
30
44
|
import { replayQueue } from '../core/queue/index.js';
|
|
31
|
-
import { DEFAULTS } from '../core/constants.js';
|
|
45
|
+
import { DEFAULTS, FORGE_PATHS } from '../core/constants.js';
|
|
32
46
|
import { getUserPrompt } from '../core/event-fields.js';
|
|
47
|
+
// D-2: BuildManager is now lazy-loaded inside the `webEnabled` branch (L460-475)
|
|
48
|
+
// so the daemon has zero static edges into `src/web/`. The previous
|
|
49
|
+
// `import { buildManager } from '../web/services/build-manager.js'` lived here.
|
|
50
|
+
import { ConfigStore } from './config-store.js';
|
|
51
|
+
import { reviveInterceptIfStale } from './services/intercept-revive.js';
|
|
52
|
+
import { startHeartbeat } from './services/heartbeat-writer.js';
|
|
53
|
+
import { DECISION_MAKER_COOLDOWN_CONFIG_KEY, DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS, MAX_DECISION_MAKER_COOLDOWN_SECONDS, } from './services/decision-hint.js';
|
|
54
|
+
// F12: module-level mutex shared by all 3 maintenance setInterval handlers.
|
|
55
|
+
// Prevents SQLite "database is locked" when sleep/wake fires multiple cron
|
|
56
|
+
// timers in the same tick. Pure JS flag — single-threaded event loop keeps
|
|
57
|
+
// check-and-set atomic.
|
|
58
|
+
let isMaintenanceRunning = false;
|
|
33
59
|
export async function startDaemon(foreground = false, options = {}) {
|
|
60
|
+
// ── 0pre. Anti-recursion guard ──────────────────────────────────────────────
|
|
61
|
+
// Refuse to boot a second daemon from inside an internal subprocess marked
|
|
62
|
+
// with CLAUDE_FORGE_INTERNAL=1. Guards against a misconfigured user hook
|
|
63
|
+
// accidentally invoking `cf daemon start` from a spawned child — otherwise
|
|
64
|
+
// we'd have two daemons fighting over the same socket. Defensive: nothing in
|
|
65
|
+
// the current codebase sets this env, but the check is cheap insurance.
|
|
66
|
+
if (process.env.CLAUDE_FORGE_INTERNAL === '1') {
|
|
67
|
+
console.error('[daemon] refusing to start under CLAUDE_FORGE_INTERNAL=1');
|
|
68
|
+
process.exit(0);
|
|
69
|
+
}
|
|
70
|
+
// ── 0a. File logging wire (Stage D, 2026-05-27) ────────────────────────────
|
|
71
|
+
// MUST be the first thing in startDaemon — before any logger.* call AND
|
|
72
|
+
// before the uncaughtException/unhandledRejection handlers (which log via
|
|
73
|
+
// `logger.error`). The default stderr-only sink is swallowed in detached
|
|
74
|
+
// production mode (stdout/stderr → /dev/null) and that's why subsystem
|
|
75
|
+
// startup lines (`[ConfigStore] Seeded N keys`, `[InterceptRevive] ...`,
|
|
76
|
+
// etc.) never landed on disk. The dev-daemon.sh wrapper hides this bug by
|
|
77
|
+
// shell-redirecting `2> daemon-dev.log` but real `cf daemon start` users
|
|
78
|
+
// see nothing. Skip when FORGE_DAEMON_DISABLE_FILE_LOG=1 (tests / CI).
|
|
79
|
+
if (process.env.FORGE_DAEMON_DISABLE_FILE_LOG !== '1') {
|
|
80
|
+
enableFileLogging(FORGE_PATHS.daemonLog());
|
|
81
|
+
}
|
|
34
82
|
// ── 0. Global Exception Handlers ───────────────────────────────────────────
|
|
35
83
|
process.on('uncaughtException', (err) => {
|
|
36
84
|
logger.error(`[Daemon] Uncaught exception: ${err.message}`);
|
|
@@ -44,7 +92,55 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
44
92
|
// Log level is auto-parsed from LOG_LEVEL env var at logger module load time.
|
|
45
93
|
const config = new ConfigManager().get();
|
|
46
94
|
logger.info('Claude Forge daemon starting...');
|
|
95
|
+
// ── 1a. Deprecated env detection (spec 1851 R-A User Decisions Q7) ─────────
|
|
96
|
+
// The Phase B `CF_SKILL_DISTILLER_AGENT=1` toggle was removed in R-A; the
|
|
97
|
+
// env is now silently ignored. Warn users so they remove it from their rc
|
|
98
|
+
// / launchd plist before R-D removes the warning altogether.
|
|
99
|
+
if (process.env.CF_SKILL_DISTILLER_AGENT) {
|
|
100
|
+
logger.warn('[daemon] env CF_SKILL_DISTILLER_AGENT detected — this flag is deprecated ' +
|
|
101
|
+
'and has no effect. Distill now uses claude CLI shell-out unconditionally. ' +
|
|
102
|
+
'Please unset it from your shell rc / launchd plist.');
|
|
103
|
+
}
|
|
104
|
+
// ── 1.5. Whitelist self-test (Phase 2c safety-net) ────────────────────────
|
|
105
|
+
// Fail-fast at boot if the enforcement whitelist regresses — better than
|
|
106
|
+
// letting the user discover that `cf bypass` itself is denied on first use.
|
|
107
|
+
try {
|
|
108
|
+
assertWhitelistInvariants();
|
|
109
|
+
logger.debug('[Whitelist] self-test passed');
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
logger.error(`[Whitelist] self-test FAILED: ${err}`);
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
// ── 1.6. Global governance protocol injection (decision 7fa0f2ab) ─────────
|
|
116
|
+
// Idempotently write the DECISION HINT protocol contract into the global
|
|
117
|
+
// ~/.claude/CLAUDE.md so Claude in *other* projects knows to spawn
|
|
118
|
+
// decision-maker. Fail-silent: a write error here must never block daemon
|
|
119
|
+
// startup. Skip when FORGE_DAEMON_SKIP_GLOBAL_INJECT=1 (tests / CI).
|
|
120
|
+
if (process.env.FORGE_DAEMON_SKIP_GLOBAL_INJECT !== '1') {
|
|
121
|
+
try {
|
|
122
|
+
const { injectGlobalGovernance } = await import('../core/governance/global-inject.js');
|
|
123
|
+
const res = injectGlobalGovernance();
|
|
124
|
+
logger.debug(`[Governance] global inject ${res.action} (${res.path})`);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
logger.warn(`[Governance] global inject failed (continuing): ${err}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
47
130
|
// ── 2. Lifecycle (PID, socket, auth token) ─────────────────────────────────
|
|
131
|
+
// Single-instance guard (task-link orphan fix, 2026-06-02). MUST run BEFORE
|
|
132
|
+
// cleanSocket() — if a healthy daemon is already accepting on the socket, a
|
|
133
|
+
// second instance (typically launchd re-spawn after a prior EADDRINUSE crash)
|
|
134
|
+
// would otherwise unlink + re-bind the live socket, steal it, then die on the
|
|
135
|
+
// web port. That orphaned socket breaks every hook `nc` connect → events get
|
|
136
|
+
// queued instead of delivered and tasks freeze at "0 events". We exit 0
|
|
137
|
+
// (clean) so launchd's KeepAlive.SuccessfulExit=false does NOT immediately
|
|
138
|
+
// re-spawn us, breaking the 10s crash loop.
|
|
139
|
+
if (await isAnotherDaemonListening()) {
|
|
140
|
+
logger.warn('[Daemon] Another daemon is already listening on the socket — aborting ' +
|
|
141
|
+
'startup to avoid socket theft (single-instance guard). Exiting cleanly.');
|
|
142
|
+
process.exit(0);
|
|
143
|
+
}
|
|
48
144
|
cleanSocket();
|
|
49
145
|
writePidFile();
|
|
50
146
|
const authToken = writeAuthToken();
|
|
@@ -54,6 +150,43 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
54
150
|
const dbPath = expandPath(config.storage.path);
|
|
55
151
|
const storage = new SQLiteStorage(dbPath);
|
|
56
152
|
logger.info(`Storage initialized: ${dbPath}`);
|
|
153
|
+
// ── 3.45. Seed feature-flag defaults (v9.x Phase 0) ───────────────────────
|
|
154
|
+
// Insert any missing flags from DEFAULT_FLAGS; user-edited values via
|
|
155
|
+
// `cf config set ...` are preserved (only writes when key is absent).
|
|
156
|
+
// ConfigStore is instantiated once here and shared with handlers that need
|
|
157
|
+
// to probe flags at request time (e.g. PreToolUseHandler).
|
|
158
|
+
const configStore = new ConfigStore(storage);
|
|
159
|
+
try {
|
|
160
|
+
const seeded = configStore.seedDefaults();
|
|
161
|
+
if (seeded > 0) {
|
|
162
|
+
logger.info(`[ConfigStore] Seeded ${seeded} default feature flag(s)`);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
logger.debug('[ConfigStore] All default feature flags already present');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
logger.warn(`[ConfigStore] seedDefaults failed: ${err}`);
|
|
170
|
+
}
|
|
171
|
+
// ── 3.46. Intercept Revive (8-in-1 Phase D, 2026-05-27) ───────────────────
|
|
172
|
+
// If `InterceptRollbackGuard` auto-disabled `pre_tool_intercept.enabled`
|
|
173
|
+
// more than 24h ago and the user never manually re-enabled it, flip it back
|
|
174
|
+
// on. Without this, the rollback guard is a one-way trap — the user has
|
|
175
|
+
// to remember to run `cf config set ...` which (per spec § Problem
|
|
176
|
+
// statement) they never did. Manual disables (no `auto_disabled_at` audit
|
|
177
|
+
// key) are left alone.
|
|
178
|
+
try {
|
|
179
|
+
const outcome = reviveInterceptIfStale(configStore);
|
|
180
|
+
if (outcome.revived) {
|
|
181
|
+
logger.info(`[InterceptRevive] ${outcome.reason}`);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
logger.debug(`[InterceptRevive] no-op: ${outcome.reason}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
logger.warn(`[InterceptRevive] startup call failed (non-fatal): ${err}`);
|
|
189
|
+
}
|
|
57
190
|
// ── 3.5. Auto-sync hooks ────────────────────────────────────────────────
|
|
58
191
|
// npm upgrade 不会自动更新 ~/.claude-forge/hooks/,每次 daemon 启动
|
|
59
192
|
// 用 SHA-256 比对源 dist/hooks 与本地副本,不一致则覆盖。
|
|
@@ -63,57 +196,195 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
63
196
|
catch (err) {
|
|
64
197
|
logger.warn(`[HookSync] unexpected error: ${err}`);
|
|
65
198
|
}
|
|
66
|
-
// ── 3.6. Auto-sync
|
|
199
|
+
// ── 3.6. Auto-sync built-in distilled skills ───────────────────────────
|
|
67
200
|
// npm upgrade 不会自动更新 ~/.claude/skills/,每次 daemon 启动
|
|
68
|
-
// 用 SHA-256 比对 dist/skills/
|
|
201
|
+
// 用 SHA-256 比对 dist/skills/distilled 与本地副本,不一致则覆盖。
|
|
69
202
|
try {
|
|
70
203
|
syncSkills();
|
|
71
204
|
}
|
|
72
205
|
catch (err) {
|
|
73
206
|
logger.warn(`[SkillSync] unexpected error: ${err}`);
|
|
74
207
|
}
|
|
75
|
-
// ──
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
208
|
+
// ── 3.7. Auto-sync project-specific agent prompts ───────────────────────
|
|
209
|
+
// npm upgrade / fresh npm install 不会自动填充 ~/.claude/agents/。每次 daemon
|
|
210
|
+
// 启动用 SHA-256 比对 dist/daemon/templates/agents/ 与本地副本,不一致则覆盖。
|
|
211
|
+
// 用户自己加的 my-*.md 不在 source list → 始终保留。
|
|
212
|
+
try {
|
|
213
|
+
syncAgents();
|
|
79
214
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
: null;
|
|
83
|
-
// ── 5. Initialize services ─────────────────────────────────────────────────
|
|
84
|
-
const skillApiKey = config.skill_matching?.api_key || apiKey;
|
|
85
|
-
const skillRegistry = new SkillRegistry(skillApiKey, config.ai.model, config.ai.base_url);
|
|
86
|
-
const invocationGuard = new InvocationGuard();
|
|
87
|
-
if (skillApiKey) {
|
|
88
|
-
logger.info('[Skills] Registry loaded with semantic matching support');
|
|
215
|
+
catch (err) {
|
|
216
|
+
logger.warn(`[AgentSync] unexpected error: ${err}`);
|
|
89
217
|
}
|
|
90
|
-
|
|
91
|
-
|
|
218
|
+
// ── 4. AI Provider (DELETED — D R-A → R-D, 2026-05-29) ────────────────────
|
|
219
|
+
// The daemon used to instantiate a ClaudeProvider here for two reasons:
|
|
220
|
+
// (a) emit `[AI Stats]` on shutdown (dead log — no consumers, removed)
|
|
221
|
+
// (b) hand model/base_url to the (now-deleted) semantic skill matcher
|
|
222
|
+
// Master spec 0902 §2.4.4 (decision f5a5b030 / Option B 彻底) eliminates
|
|
223
|
+
// both: distill / claudemd / knowledge / patch now shell out to the
|
|
224
|
+
// `claude` CLI (sub-specs A/B/C R-B already landed). SkillRegistry is
|
|
225
|
+
// keyword-only. D R-D (this commit) deleted `src/core/ai/provider.ts`
|
|
226
|
+
// outright and the `ai.*` / `skill_matching.*` config schema.
|
|
227
|
+
// Design rationale for the keyword-only switch lives in
|
|
228
|
+
// `src/skills/registry.ts` (single source of truth — decision 3baa0e7c).
|
|
229
|
+
//
|
|
230
|
+
// Migration warn: if the user still has `ai:` or `skill_matching:` in the
|
|
231
|
+
// raw yaml, or `ANTHROPIC_API_KEY` exported, tell them it's deprecated and
|
|
232
|
+
// has no effect. We re-read the raw yaml here (rather than the typed
|
|
233
|
+
// `config`) because the schema no longer holds those fields.
|
|
234
|
+
try {
|
|
235
|
+
const rawCfg = readFileSync(FORGE_PATHS.config(), 'utf-8');
|
|
236
|
+
const legacyAiKey = /^\s*ai\s*:/m.test(rawCfg);
|
|
237
|
+
const legacySkillMatchKey = /^\s*skill_matching\s*:/m.test(rawCfg);
|
|
238
|
+
const legacyApiKeyEnv = !!process.env.ANTHROPIC_API_KEY;
|
|
239
|
+
if (legacyAiKey || legacySkillMatchKey || legacyApiKeyEnv) {
|
|
240
|
+
const sources = [];
|
|
241
|
+
if (legacyAiKey)
|
|
242
|
+
sources.push('config.ai.api_key');
|
|
243
|
+
if (legacySkillMatchKey)
|
|
244
|
+
sources.push('config.skill_matching.api_key');
|
|
245
|
+
if (legacyApiKeyEnv)
|
|
246
|
+
sources.push('ANTHROPIC_API_KEY env');
|
|
247
|
+
logger.warn(`[daemon] ${sources.join(' + ')} detected — these are deprecated ` +
|
|
248
|
+
'and have no effect after spec 0902 (decision f5a5b030). Distill / ' +
|
|
249
|
+
'claudemd / knowledge build / patch now use claude CLI shell-out, ' +
|
|
250
|
+
'and SkillRegistry is keyword-only. Remove from config.yaml + ' +
|
|
251
|
+
'shell rc to silence this warning.');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// No config.yaml or read error → nothing to warn about.
|
|
256
|
+
}
|
|
257
|
+
// ── 4.7. decision 7aa0ec63 (2026-06-01) — cooldown config validation ────
|
|
258
|
+
// If forge_config.decision_maker_cooldown_seconds is present but holds an
|
|
259
|
+
// out-of-range value (≤ 0 or > MAX_DECISION_MAKER_COOLDOWN_SECONDS) or a
|
|
260
|
+
// non-number, the resolver silently falls back to the default. Warn once at
|
|
261
|
+
// boot so the user notices typos instead of wondering why their override
|
|
262
|
+
// had no effect.
|
|
263
|
+
try {
|
|
264
|
+
const raw = storage.readConfig(DECISION_MAKER_COOLDOWN_CONFIG_KEY);
|
|
265
|
+
if (raw !== undefined && raw !== null) {
|
|
266
|
+
const n = Number(raw);
|
|
267
|
+
const invalid = !Number.isFinite(n) ||
|
|
268
|
+
n <= 0 ||
|
|
269
|
+
n > MAX_DECISION_MAKER_COOLDOWN_SECONDS;
|
|
270
|
+
if (invalid) {
|
|
271
|
+
logger.warn(`[daemon] forge_config.${DECISION_MAKER_COOLDOWN_CONFIG_KEY}=${String(raw)} ` +
|
|
272
|
+
`is out of range (0, ${MAX_DECISION_MAKER_COOLDOWN_SECONDS}]; ` +
|
|
273
|
+
`falling back to default ${DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS}s. ` +
|
|
274
|
+
`Set a valid value via \`cf config set ${DECISION_MAKER_COOLDOWN_CONFIG_KEY} <seconds>\`.`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
92
277
|
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
logger.debug(`[daemon] cooldown config probe failed (non-fatal): ${err}`);
|
|
280
|
+
}
|
|
281
|
+
// ── 5. Initialize services ─────────────────────────────────────────────────
|
|
282
|
+
// D R-B (spec 0902): SkillRegistry is keyword-only — no args. The legacy
|
|
283
|
+
// `skill_matching.api_key` field is silently ignored (warned above) and
|
|
284
|
+
// will be removed from the JSON schema in D R-D.
|
|
285
|
+
const skillRegistry = new SkillRegistry();
|
|
286
|
+
const invocationGuard = new InvocationGuard();
|
|
287
|
+
logger.info('[Skills] Registry loaded (keyword matching)');
|
|
93
288
|
logger.info('[Skills] InvocationGuard ready (idempotent + depth/total limits)');
|
|
94
289
|
const exporter = new HistoryExporter(storage);
|
|
95
290
|
const resume = new ResumeManager(storage);
|
|
291
|
+
const violationsManager = new ViolationsManager();
|
|
96
292
|
const conventionExtractor = new ConventionExtractor();
|
|
97
293
|
const taskSegmenter = new TaskSegmenter(storage);
|
|
98
|
-
|
|
294
|
+
// decision 265f59d5 (2026-06-08): async LLM boundary classifier. Fire-and-
|
|
295
|
+
// forget — NEVER awaited on the UserPromptSubmit hot path. Only spawns claude
|
|
296
|
+
// for prompts the sync segmenter flagged ambiguous (~30%).
|
|
297
|
+
const boundaryClassifier = new TaskBoundaryClassifier();
|
|
298
|
+
// Orphan-event robustness fix (2026-06-01): proactively rebuild the
|
|
299
|
+
// in-memory currentTasks map from the DB so events arriving right after a
|
|
300
|
+
// daemon restart (buffered + replayed) hit the fast currentTasks path
|
|
301
|
+
// instead of relying on per-event lazy recovery. Idempotent + fault-tolerant.
|
|
302
|
+
taskSegmenter.hydrateActiveTasks();
|
|
303
|
+
logger.info('[Services] Initialized: ResumeManager, ViolationsManager, TaskSegmenter, SkillRegistry');
|
|
304
|
+
// ── 5.45. Heartbeat writer (watchdog spec 0843) ───────────────────────────
|
|
305
|
+
// Writes ~/.claude-forge/daemon.heartbeat every 60s via atomic rename.
|
|
306
|
+
// Removed on graceful shutdown so ensure-running detects the gap.
|
|
307
|
+
let daemonVersion = 'unknown';
|
|
308
|
+
try {
|
|
309
|
+
const pkgUrl = new URL('../../package.json', import.meta.url);
|
|
310
|
+
const { createRequire } = await import('node:module');
|
|
311
|
+
const req = createRequire(import.meta.url);
|
|
312
|
+
const pkg = req(pkgUrl.pathname);
|
|
313
|
+
daemonVersion = pkg.version;
|
|
314
|
+
}
|
|
315
|
+
catch { /* version string is nice-to-have, not critical */ }
|
|
316
|
+
const heartbeatHandle = startHeartbeat({ version: daemonVersion });
|
|
317
|
+
logger.info('[Heartbeat] writer started (60s interval)');
|
|
99
318
|
// ── 5.5. Schedule daily maintenance ────────────────────────────────────────
|
|
100
|
-
// Clean old fact-table data every 24 hours (events / routing / skills
|
|
319
|
+
// Clean old fact-table data every 24 hours (events / routing / skills).
|
|
101
320
|
const MAINTENANCE_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
|
|
102
321
|
const maintenanceInterval = setInterval(() => {
|
|
103
|
-
|
|
322
|
+
if (isMaintenanceRunning) {
|
|
323
|
+
logger.warn('[Daemon] maintenance already running, skipping daily cron');
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
isMaintenanceRunning = true;
|
|
104
327
|
try {
|
|
105
|
-
|
|
106
|
-
|
|
328
|
+
logger.info('[Daemon] Running daily maintenance: cleaning old fact-table data');
|
|
329
|
+
try {
|
|
330
|
+
const r = storage.cleanOldData(30);
|
|
331
|
+
logger.info(`[Daemon] cleanOldData: events=${r.events}, taskEvents=${r.taskEvents}, routing=${r.routing}, skills=${r.skills}`);
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
logger.error(`[Daemon] Maintenance failed: ${err}`);
|
|
335
|
+
}
|
|
336
|
+
// Phase 9.5: sweep idle un-classified sessions (no Stop hook fired).
|
|
337
|
+
// Logs only when something actually moves, so the steady-state daily line
|
|
338
|
+
// stays quiet.
|
|
339
|
+
try {
|
|
340
|
+
const s = sweepIdleSessions(storage);
|
|
341
|
+
if (s.swept > 0 || s.errors > 0) {
|
|
342
|
+
logger.info(`[Daemon] idleSweeper: scanned=${s.scanned} swept=${s.swept} errors=${s.errors}`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
logger.error(`[Daemon] idleSweeper failed: ${err}`);
|
|
347
|
+
}
|
|
107
348
|
}
|
|
108
|
-
|
|
109
|
-
|
|
349
|
+
finally {
|
|
350
|
+
isMaintenanceRunning = false;
|
|
110
351
|
}
|
|
111
352
|
}, MAINTENANCE_INTERVAL);
|
|
112
353
|
logger.info('[Daemon] Scheduled daily maintenance (clean fact-table data older than 30 days)');
|
|
354
|
+
// Run initial cleanup 60s after startup (covers frequent-restart scenarios)
|
|
355
|
+
const initialCleanupTimeout = setTimeout(() => {
|
|
356
|
+
try {
|
|
357
|
+
const r = storage.cleanOldData(30);
|
|
358
|
+
const total = r.events + r.taskEvents + r.routing + r.skills;
|
|
359
|
+
if (total > 0) {
|
|
360
|
+
logger.info(`[Daemon] Initial cleanup: events=${r.events}, taskEvents=${r.taskEvents}, routing=${r.routing}, skills=${r.skills}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
catch (err) {
|
|
364
|
+
logger.warn(`[Daemon] Initial cleanup failed: ${err}`);
|
|
365
|
+
}
|
|
366
|
+
// Phase 9.5: also run an initial sweep at startup so frequent daemon
|
|
367
|
+
// restarts don't let abandoned sessions accumulate for a full day.
|
|
368
|
+
try {
|
|
369
|
+
const s = sweepIdleSessions(storage);
|
|
370
|
+
if (s.swept > 0 || s.errors > 0) {
|
|
371
|
+
logger.info(`[Daemon] Initial idleSweeper: scanned=${s.scanned} swept=${s.swept} errors=${s.errors}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch (err) {
|
|
375
|
+
logger.warn(`[Daemon] Initial idleSweeper failed: ${err}`);
|
|
376
|
+
}
|
|
377
|
+
}, 60_000);
|
|
378
|
+
initialCleanupTimeout.unref?.();
|
|
113
379
|
// ── 5.5.1. Schedule weekly VACUUM (every 7 days) ───────────────────────────
|
|
114
380
|
// VACUUM 重写整库,释放页空间。频率 7 天足以应对一般负载。
|
|
115
381
|
const VACUUM_INTERVAL = 7 * 24 * 60 * 60 * 1000;
|
|
116
382
|
const vacuumInterval = setInterval(() => {
|
|
383
|
+
if (isMaintenanceRunning) {
|
|
384
|
+
logger.warn('[Daemon] maintenance already running, skipping weekly VACUUM');
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
isMaintenanceRunning = true;
|
|
117
388
|
try {
|
|
118
389
|
// 500 MB 阈值:低于此值不 VACUUM(避免空转的 fsync 抖动)。
|
|
119
390
|
storage.runMaintenance(500);
|
|
@@ -121,28 +392,135 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
121
392
|
catch (err) {
|
|
122
393
|
logger.error(`[Daemon] VACUUM failed: ${err}`);
|
|
123
394
|
}
|
|
395
|
+
finally {
|
|
396
|
+
isMaintenanceRunning = false;
|
|
397
|
+
}
|
|
124
398
|
}, VACUUM_INTERVAL);
|
|
125
399
|
logger.info('[Daemon] Scheduled weekly VACUUM (threshold: 500MB)');
|
|
400
|
+
// ── 5.5.2. Event TTL sweep (db-size optimization 2026-05-26) ─────────────
|
|
401
|
+
// Two-tier sweep: warm = NULL `tool_input`, cold = DELETE row. Both bounds
|
|
402
|
+
// are configurable via forge_config (events.warm_ttl_days /
|
|
403
|
+
// events.cold_ttl_days / events.sweep_interval_hours). See
|
|
404
|
+
// src/daemon/services/event-ttl-sweep.ts for full design.
|
|
405
|
+
const ttlSweepCfg = resolveSweepConfig(configStore);
|
|
406
|
+
const ttlSweepIntervalHours = (() => {
|
|
407
|
+
const raw = configStore.get('events.sweep_interval_hours');
|
|
408
|
+
const n = raw === undefined ? TTL_DEFAULTS.sweepIntervalHours : Number(raw);
|
|
409
|
+
return Number.isFinite(n) && n > 0 ? n : TTL_DEFAULTS.sweepIntervalHours;
|
|
410
|
+
})();
|
|
411
|
+
const EVENT_TTL_INTERVAL = ttlSweepIntervalHours * 60 * 60 * 1000;
|
|
412
|
+
const eventTtlInterval = setInterval(() => {
|
|
413
|
+
if (isMaintenanceRunning) {
|
|
414
|
+
logger.warn('[Daemon] maintenance already running, skipping event TTL sweep');
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
isMaintenanceRunning = true;
|
|
418
|
+
try {
|
|
419
|
+
const r = sweepEventTtl(storage, configStore);
|
|
420
|
+
if (r.warmedNull > 0 || r.coldDeleted > 0) {
|
|
421
|
+
logger.info(`[EventTTL] sweep: warmedNull=${r.warmedNull} coldDeleted=${r.coldDeleted} taskEventsPruned=${r.taskEventsPruned} morePending=${r.morePending}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
catch (err) {
|
|
425
|
+
logger.error(`[EventTTL] sweep failed: ${err}`);
|
|
426
|
+
}
|
|
427
|
+
finally {
|
|
428
|
+
isMaintenanceRunning = false;
|
|
429
|
+
}
|
|
430
|
+
}, EVENT_TTL_INTERVAL);
|
|
431
|
+
logger.info(`[Daemon] Scheduled event TTL sweep every ${ttlSweepIntervalHours}h (warm=${ttlSweepCfg.warmTtlDays}d, cold=${ttlSweepCfg.coldTtlDays}d)`);
|
|
432
|
+
// Initial event TTL sweep ~90s after startup so frequent daemon restarts
|
|
433
|
+
// don't sit on backlog for a full interval. Skipped when isMaintenanceRunning
|
|
434
|
+
// is set (rare in practice but defensive).
|
|
435
|
+
const initialEventTtlTimeout = setTimeout(() => {
|
|
436
|
+
if (isMaintenanceRunning)
|
|
437
|
+
return;
|
|
438
|
+
isMaintenanceRunning = true;
|
|
439
|
+
try {
|
|
440
|
+
const r = sweepEventTtl(storage, configStore);
|
|
441
|
+
if (r.warmedNull > 0 || r.coldDeleted > 0) {
|
|
442
|
+
logger.info(`[EventTTL] initial sweep: warmedNull=${r.warmedNull} coldDeleted=${r.coldDeleted} taskEventsPruned=${r.taskEventsPruned}`);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
catch (err) {
|
|
446
|
+
logger.warn(`[EventTTL] initial sweep failed: ${err}`);
|
|
447
|
+
}
|
|
448
|
+
finally {
|
|
449
|
+
isMaintenanceRunning = false;
|
|
450
|
+
}
|
|
451
|
+
}, 90_000);
|
|
452
|
+
initialEventTtlTimeout.unref?.();
|
|
126
453
|
// ── 5.6. Stale task GC (every 5 minutes) ──────────────────────────────────
|
|
127
454
|
const STALE_TASK_GC_INTERVAL = 5 * 60 * 1000; // 5 分钟
|
|
128
455
|
const STALE_TASK_IDLE_MINUTES = 10; // idle 超 10 分钟视为滞留
|
|
129
456
|
const staleTaskGcInterval = setInterval(() => {
|
|
457
|
+
if (isMaintenanceRunning) {
|
|
458
|
+
logger.warn('[Maintenance] maintenance already running, skipping stale task GC');
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
isMaintenanceRunning = true;
|
|
130
462
|
try {
|
|
131
463
|
const closed = storage.completeStaleActiveTasks(STALE_TASK_IDLE_MINUTES);
|
|
132
|
-
if (closed > 0) {
|
|
133
|
-
|
|
464
|
+
if (closed.length > 0) {
|
|
465
|
+
// decision c6613590 P0 缺陷 B: evict GC'd tasks from the segmenter's
|
|
466
|
+
// in-memory currentTasks map so no dangling pointer keeps dragging a
|
|
467
|
+
// closed task's end_time forward (which merged independent prompts).
|
|
468
|
+
const evicted = taskSegmenter.evictTasks(closed);
|
|
469
|
+
logger.info(`[Maintenance] Auto-completed ${closed.length} stale active task(s)` +
|
|
470
|
+
` (evicted ${evicted} from in-memory map)`);
|
|
134
471
|
}
|
|
135
472
|
}
|
|
136
473
|
catch (err) {
|
|
137
474
|
logger.error(`[Maintenance] Stale task GC failed: ${err}`);
|
|
138
475
|
}
|
|
476
|
+
// C4 hotfix (2026-05-26): backfill NULL-outcome deny/dry_run rows that
|
|
477
|
+
// aged past the 1h grace beyond the 30s PostToolUse window. "Passive
|
|
478
|
+
// obey" — main thread saw the hint, stopped to think, never re-invoked
|
|
479
|
+
// any tool inside the classification window. Without this sweep the
|
|
480
|
+
// NULL rows persist forever, pinning the C4 numerator to 0.
|
|
481
|
+
try {
|
|
482
|
+
const s = sweepInterceptTimeouts(storage);
|
|
483
|
+
if (s.swept > 0) {
|
|
484
|
+
logger.info(`[Maintenance] InterceptTimeoutSweeper: swept ${s.swept} NULL → obeyed (passive obey)`);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
catch (err) {
|
|
488
|
+
logger.error(`[Maintenance] InterceptTimeoutSweeper failed: ${err}`);
|
|
489
|
+
}
|
|
490
|
+
finally {
|
|
491
|
+
isMaintenanceRunning = false;
|
|
492
|
+
}
|
|
139
493
|
}, STALE_TASK_GC_INTERVAL);
|
|
140
494
|
// ── 6. Create handlers ─────────────────────────────────────────────────────
|
|
141
|
-
|
|
495
|
+
// Phase 5: shared RuleRegistry so PreToolUse sees the same rule set.
|
|
496
|
+
const ruleRegistry = new RuleRegistry();
|
|
497
|
+
// ── 6.2. v9.x Phase 2b — Spec Approval ─────────────────────────────────
|
|
498
|
+
// SpecGenerator removed (Spec 1702: 0% real-world acceptance → dead code).
|
|
499
|
+
// SpecApproval retained for the hand-written path: planner agent calls
|
|
500
|
+
// `cf spec register`, user replies "批准 <token>" → daemon short-circuits.
|
|
501
|
+
const specApproval = new SpecApproval(storage);
|
|
502
|
+
// Spec 1200 (2026-05-28): IntentEngine + WorkflowRecommender removed.
|
|
503
|
+
// Decision 3baa0e7c Batch 1 (2026-06-01): deprecated `_workflowRecommender`
|
|
504
|
+
// and `_intentEngine` ctor positions cleaned up; specApproval now arg 5.
|
|
505
|
+
const userPromptHandler = new UserPromptHandler(resume, conventionExtractor, storage, skillRegistry, specApproval);
|
|
506
|
+
// Phase 1: PreToolUseHandler runs in dry_run mode unless
|
|
507
|
+
// `pre_tool_intercept.enabled` is flipped on via `cf config set`.
|
|
508
|
+
// Phase 5: same registry is shared so the workflow-recommendation-mismatch
|
|
509
|
+
// deny rule + pending_workflow_rec lookup work end-to-end.
|
|
510
|
+
//
|
|
511
|
+
// Constructed BEFORE StopHandler so the latter can receive it as its 8th
|
|
512
|
+
// arg for the D-1 clearSession wiring (memory-leak fix).
|
|
513
|
+
const preToolUseHandler = new PreToolUseHandler(storage, configStore, ruleRegistry);
|
|
142
514
|
const handlers = {
|
|
143
515
|
UserPromptSubmit: userPromptHandler,
|
|
144
|
-
|
|
145
|
-
|
|
516
|
+
// Phase 6: configStore wired so agent_writeback.enabled flag is probed
|
|
517
|
+
// on every Write/Edit (default OFF; opt-in via `cf config set`).
|
|
518
|
+
PostToolUse: new PostToolUseHandler(storage, configStore),
|
|
519
|
+
Stop: new StopHandler(exporter, resume, taskSegmenter, storage, invocationGuard, userPromptHandler, violationsManager,
|
|
520
|
+
// D-1: clearSession on PreToolUseHandler.editedFilesCache at Stop time
|
|
521
|
+
// (fixes per-session Set leak across long-running daemons).
|
|
522
|
+
preToolUseHandler),
|
|
523
|
+
PreToolUse: preToolUseHandler,
|
|
146
524
|
};
|
|
147
525
|
// ── 7. Event handler ───────────────────────────────────────────────────────
|
|
148
526
|
const handleEvent = async (event) => {
|
|
@@ -165,15 +543,27 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
165
543
|
// Task segmentation: UserPromptSubmit starts/continues tasks
|
|
166
544
|
const prompt = getUserPrompt(event);
|
|
167
545
|
if (event.hook_type === 'UserPromptSubmit' && prompt) {
|
|
168
|
-
taskSegmenter.
|
|
546
|
+
const decision = taskSegmenter.processPromptWithBoundary(event.session_id, prompt, event.timestamp, event.event_id);
|
|
547
|
+
// decision 265f59d5: ambiguous merge → hand off to the async LLM
|
|
548
|
+
// classifier. fire-and-forget: NOT awaited, never blocks the hook
|
|
549
|
+
// response. The classifier internally re-checks idempotency + the
|
|
550
|
+
// event's current FK before any re-attribution.
|
|
551
|
+
if (decision.ambiguous) {
|
|
552
|
+
void boundaryClassifier.classify(decision.ambiguous, storage);
|
|
553
|
+
}
|
|
169
554
|
}
|
|
170
555
|
else if (event.event_id) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
556
|
+
// Spec 1713 §10.3: forward hookType / toolName so the segmenter can
|
|
557
|
+
// detect sub-agent return (PostToolUse Task/Agent) and arm the
|
|
558
|
+
// "next prompt = new task" flag.
|
|
559
|
+
taskSegmenter.linkEvent(event.session_id, event.event_id, event.timestamp, {
|
|
560
|
+
hookType: event.hook_type,
|
|
561
|
+
toolName: event.tool_name,
|
|
562
|
+
});
|
|
176
563
|
}
|
|
564
|
+
// PreToolUse / PostToolUse / UserPromptSubmit / Stop all routed via routeEvent.
|
|
565
|
+
// PreToolUse now goes through PreToolUseHandler (Phase 1 rule engine),
|
|
566
|
+
// which honors `pre_tool_intercept.enabled` flag (dry_run when OFF).
|
|
177
567
|
const result = await routeEvent(event, handlers);
|
|
178
568
|
if (result) {
|
|
179
569
|
const handlerName = event.hook_type + 'Handler';
|
|
@@ -217,7 +607,21 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
217
607
|
// setImmediate ensures the event loop has had a chance to process the listen
|
|
218
608
|
// callback before we touch storage (not strictly required, but defensive).
|
|
219
609
|
setImmediate(() => {
|
|
220
|
-
replayQueue(storage
|
|
610
|
+
replayQueue(storage, {
|
|
611
|
+
// Mirror handleEvent line 480-484: feed replayed UserPromptSubmit events
|
|
612
|
+
// into TaskSegmenter so the tasks table gets populated. We do NOT route
|
|
613
|
+
// through full handleEvent — KB inject / decision-hint / skill-match
|
|
614
|
+
// would all be stale (no live hook is waiting on the response).
|
|
615
|
+
onReplayed: (event) => {
|
|
616
|
+
const prompt = getUserPrompt(event);
|
|
617
|
+
if (event.hook_type === 'UserPromptSubmit' && prompt) {
|
|
618
|
+
taskSegmenter.processPrompt(event.session_id, prompt, event.timestamp, event.event_id);
|
|
619
|
+
}
|
|
620
|
+
else if (event.event_id) {
|
|
621
|
+
taskSegmenter.linkEvent(event.session_id, event.event_id, event.timestamp);
|
|
622
|
+
}
|
|
623
|
+
},
|
|
624
|
+
}).then(({ replayed, skipped, dead }) => {
|
|
221
625
|
if (replayed > 0 || skipped > 0 || dead > 0) {
|
|
222
626
|
logger.info(`[Queue] Replay: ${replayed} replayed, ${skipped} skipped (dup), ${dead} dead-lettered`);
|
|
223
627
|
}
|
|
@@ -230,6 +634,13 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
230
634
|
const webEnabled = options.web ?? (process.env.FORGE_DAEMON_NO_WEB === '1' ? false : config.web.enabled);
|
|
231
635
|
let webServer = null;
|
|
232
636
|
if (webEnabled) {
|
|
637
|
+
// D-2: lazy-load BuildManager + WebServer so the daemon has zero static
|
|
638
|
+
// edges into `src/web/` (matches the documented core ← {daemon, web}
|
|
639
|
+
// peer-layering). BuildManager's storage injection is safe to defer
|
|
640
|
+
// because the only consumer is `web/routes/knowledge.ts`, which runs
|
|
641
|
+
// only after `WebServer.start()` returns (post-setStorage).
|
|
642
|
+
const { buildManager } = await import('../web/services/build-manager.js');
|
|
643
|
+
buildManager.setStorage(storage);
|
|
233
644
|
const { WebServer } = await import('../web/server.js');
|
|
234
645
|
webServer = new WebServer({
|
|
235
646
|
port: config.web.port,
|
|
@@ -237,7 +648,19 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
237
648
|
skillRegistry,
|
|
238
649
|
invocationGuard,
|
|
239
650
|
});
|
|
240
|
-
|
|
651
|
+
// Defense-in-depth (task-link orphan fix, 2026-06-02): a failed web-server
|
|
652
|
+
// start (most commonly EADDRINUSE on port 3721 when another daemon already
|
|
653
|
+
// holds it) MUST NOT propagate to `process.exit(1)`. The core daemon job is
|
|
654
|
+
// the socket event pipeline, which is already listening by now; killing the
|
|
655
|
+
// process here is what previously created the launchd crash loop + socket
|
|
656
|
+
// theft. Log and continue with web disabled.
|
|
657
|
+
try {
|
|
658
|
+
await webServer.start();
|
|
659
|
+
}
|
|
660
|
+
catch (err) {
|
|
661
|
+
logger.error(`[Web] Server failed to start (continuing without web UI): ${err instanceof Error ? err.message : err}`);
|
|
662
|
+
webServer = null;
|
|
663
|
+
}
|
|
241
664
|
}
|
|
242
665
|
else {
|
|
243
666
|
logger.info('[Web] Server disabled (--no-web or config.web.enabled=false)');
|
|
@@ -249,11 +672,16 @@ export async function startDaemon(foreground = false, options = {}) {
|
|
|
249
672
|
return;
|
|
250
673
|
shuttingDown = true;
|
|
251
674
|
logger.info('Shutting down...');
|
|
252
|
-
|
|
253
|
-
|
|
675
|
+
// D R-A (2026-05-29): removed `[AI Stats]` shutdown line — there was no
|
|
676
|
+
// consumer (dead log), and the only producer (ClaudeProvider instance)
|
|
677
|
+
// was deleted with the §4 block above. Master spec 0902 §2.4.4.
|
|
678
|
+
heartbeatHandle.stop();
|
|
254
679
|
clearInterval(maintenanceInterval);
|
|
255
680
|
clearInterval(vacuumInterval);
|
|
256
681
|
clearInterval(staleTaskGcInterval);
|
|
682
|
+
clearInterval(eventTtlInterval);
|
|
683
|
+
clearTimeout(initialCleanupTimeout);
|
|
684
|
+
clearTimeout(initialEventTtlTimeout);
|
|
257
685
|
if (webServer)
|
|
258
686
|
await webServer.stop();
|
|
259
687
|
await server.close();
|