@winspan/claude-forge 8.54.4 → 9.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPMENT.md +723 -46
- package/README.md +166 -21
- package/dist/catalogs/agents.json +67 -0
- package/dist/catalogs/skills.json +306 -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/agent.d.ts +169 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +690 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/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/codegraph.d.ts +17 -0
- package/dist/cli/commands/codegraph.d.ts.map +1 -0
- package/dist/cli/commands/codegraph.js +263 -0
- package/dist/cli/commands/codegraph.js.map +1 -0
- package/dist/cli/commands/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 +706 -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 +12 -2
- 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 +54 -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 +117 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +1070 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/loop.d.ts +95 -0
- package/dist/cli/commands/loop.d.ts.map +1 -0
- package/dist/cli/commands/loop.js +408 -0
- package/dist/cli/commands/loop.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +33 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +75 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +22 -11
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +93 -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 +131 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +404 -118
- 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 +11 -3
- 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 +34 -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 +51 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +63 -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 +766 -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 +83 -0
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
- package/dist/core/diagnostics/entropy-checks.js +400 -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/heartbeat-reader.d.ts +28 -0
- package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/diagnostics/heartbeat-reader.js +50 -0
- package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
- package/dist/core/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/event-fields.d.ts +27 -0
- package/dist/core/event-fields.d.ts.map +1 -1
- package/dist/core/event-fields.js +43 -0
- package/dist/core/event-fields.js.map +1 -1
- package/dist/core/governance/global-inject.d.ts +90 -0
- package/dist/core/governance/global-inject.d.ts.map +1 -0
- package/dist/core/governance/global-inject.js +184 -0
- package/dist/core/governance/global-inject.js.map +1 -0
- package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
- package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
- package/dist/core/insights/agent-anchor-guard.js +119 -0
- package/dist/core/insights/agent-anchor-guard.js.map +1 -0
- package/dist/core/insights/agent-distill-context.d.ts +55 -0
- package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-context.js +146 -0
- package/dist/core/insights/agent-distill-context.js.map +1 -0
- package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
- package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-spawn.js +179 -0
- package/dist/core/insights/agent-distill-spawn.js.map +1 -0
- package/dist/core/insights/agent-drift.d.ts +66 -0
- package/dist/core/insights/agent-drift.d.ts.map +1 -0
- package/dist/core/insights/agent-drift.js +109 -0
- package/dist/core/insights/agent-drift.js.map +1 -0
- package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
- package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
- package/dist/core/insights/agent-evolution-sources.js +36 -0
- package/dist/core/insights/agent-evolution-sources.js.map +1 -0
- package/dist/core/insights/agent-health.d.ts +142 -0
- package/dist/core/insights/agent-health.d.ts.map +1 -0
- package/dist/core/insights/agent-health.js +296 -0
- package/dist/core/insights/agent-health.js.map +1 -0
- package/dist/core/insights/agent-patch-apply.d.ts +45 -0
- package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
- package/dist/core/insights/agent-patch-apply.js +165 -0
- package/dist/core/insights/agent-patch-apply.js.map +1 -0
- package/dist/core/insights/agent-suggest.d.ts +128 -0
- package/dist/core/insights/agent-suggest.d.ts.map +1 -0
- package/dist/core/insights/agent-suggest.js +284 -0
- package/dist/core/insights/agent-suggest.js.map +1 -0
- package/dist/core/insights/coverage-tiers.d.ts +46 -0
- package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
- package/dist/core/insights/coverage-tiers.js +95 -0
- package/dist/core/insights/coverage-tiers.js.map +1 -0
- package/dist/core/insights/experience-extractor.d.ts +60 -0
- package/dist/core/insights/experience-extractor.d.ts.map +1 -0
- package/dist/core/insights/experience-extractor.js +319 -0
- package/dist/core/insights/experience-extractor.js.map +1 -0
- package/dist/core/insights/violation-reporter.d.ts +149 -0
- package/dist/core/insights/violation-reporter.d.ts.map +1 -0
- package/dist/core/insights/violation-reporter.js +391 -0
- package/dist/core/insights/violation-reporter.js.map +1 -0
- package/dist/core/loop/loop-engine.d.ts +140 -0
- package/dist/core/loop/loop-engine.d.ts.map +1 -0
- package/dist/core/loop/loop-engine.js +266 -0
- package/dist/core/loop/loop-engine.js.map +1 -0
- package/dist/core/queue/index.d.ts +16 -3
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +16 -4
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +317 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +1093 -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/codegraph-types.d.ts +79 -0
- package/dist/core/storage/codegraph-types.d.ts.map +1 -0
- package/dist/core/storage/codegraph-types.js +14 -0
- package/dist/core/storage/codegraph-types.js.map +1 -0
- package/dist/core/storage/codegraph.d.ts +186 -0
- package/dist/core/storage/codegraph.d.ts.map +1 -0
- package/dist/core/storage/codegraph.js +452 -0
- package/dist/core/storage/codegraph.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +387 -0
- package/dist/core/storage/decisions.d.ts.map +1 -0
- package/dist/core/storage/decisions.js +534 -0
- package/dist/core/storage/decisions.js.map +1 -0
- package/dist/core/storage/events.d.ts +239 -8
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +705 -39
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +111 -0
- package/dist/core/storage/feedback.d.ts.map +1 -0
- package/dist/core/storage/feedback.js +186 -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 +68 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +131 -5
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +332 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -0
- package/dist/core/storage/knowledge.js +589 -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 +111 -0
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
- package/dist/core/storage/pipeline-rollup.js +432 -0
- package/dist/core/storage/pipeline-rollup.js.map +1 -0
- package/dist/core/storage/routing.d.ts +50 -3
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +131 -10
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +31 -8
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +367 -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 +352 -15
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +160 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +368 -7
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +309 -20
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +523 -16
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +744 -2
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +1691 -17
- 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/types.d.ts +136 -18
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +10 -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 +124 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -0
- package/dist/core/utils/binary-paths.js +218 -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-resolver.d.ts +26 -0
- package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
- package/dist/core/utils/claude-cli-resolver.js +115 -0
- package/dist/core/utils/claude-cli-resolver.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 +67 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +147 -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 +146 -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 +54 -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 +66 -4
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +221 -8
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +181 -0
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
- package/dist/daemon/handlers/pre-tool-use.js +618 -0
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
- package/dist/daemon/handlers/stop.d.ts +55 -7
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +245 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +51 -14
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +223 -95
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
- package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
- package/dist/daemon/handlers/violation-content-backfill.js +167 -0
- package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
- package/dist/daemon/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 +19 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +439 -86
- 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 +779 -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 +176 -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/codegraph-sync.d.ts +94 -0
- package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
- package/dist/daemon/services/codegraph-sync.js +159 -0
- package/dist/daemon/services/codegraph-sync.js.map +1 -0
- package/dist/daemon/services/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 +240 -0
- package/dist/daemon/services/decision-hint.d.ts.map +1 -0
- package/dist/daemon/services/decision-hint.js +562 -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 +124 -0
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
- package/dist/daemon/services/feedback-aggregator.d.ts +167 -0
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
- package/dist/daemon/services/feedback-aggregator.js +415 -0
- package/dist/daemon/services/feedback-aggregator.js.map +1 -0
- package/dist/daemon/services/heartbeat-writer.d.ts +46 -0
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
- package/dist/daemon/services/heartbeat-writer.js +82 -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 +148 -0
- package/dist/daemon/services/kb-injector.js.map +1 -0
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
- package/dist/daemon/services/loop-hint.d.ts +139 -0
- package/dist/daemon/services/loop-hint.d.ts.map +1 -0
- package/dist/daemon/services/loop-hint.js +272 -0
- package/dist/daemon/services/loop-hint.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.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 +230 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +527 -17
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- 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/startup/maintenance-schedulers.d.ts +68 -0
- package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
- package/dist/daemon/startup/maintenance-schedulers.js +294 -0
- package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
- package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
- package/dist/daemon/templates/agents/claudemd-writer.md +102 -0
- package/dist/daemon/templates/agents/coder.md +262 -0
- package/dist/daemon/templates/agents/decision-maker.md +546 -0
- package/dist/daemon/templates/agents/doc-reviewer.md +118 -0
- package/dist/daemon/templates/agents/harness-debug-full.md +196 -0
- package/dist/daemon/templates/agents/knowledge-builder.md +120 -0
- package/dist/daemon/templates/agents/patch-applier.md +145 -0
- package/dist/daemon/templates/agents/planner.md +217 -0
- package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
- package/dist/daemon/templates/agents/skill-distiller.md +114 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +65 -0
- package/dist/daemon/templates/agents/verify-agent.md +259 -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 +31 -11
- 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 +966 -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 +78 -0
- package/dist/knowledge/constants.d.ts.map +1 -0
- package/dist/knowledge/constants.js +98 -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/graph/edge-extractor.d.ts +45 -0
- package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
- package/dist/knowledge/graph/edge-extractor.js +242 -0
- package/dist/knowledge/graph/edge-extractor.js.map +1 -0
- package/dist/knowledge/graph/impact.d.ts +73 -0
- package/dist/knowledge/graph/impact.d.ts.map +1 -0
- package/dist/knowledge/graph/impact.js +94 -0
- package/dist/knowledge/graph/impact.js.map +1 -0
- package/dist/knowledge/graph/types.d.ts +22 -0
- package/dist/knowledge/graph/types.d.ts.map +1 -0
- package/dist/knowledge/graph/types.js +13 -0
- package/dist/knowledge/graph/types.js.map +1 -0
- package/dist/knowledge/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 +237 -0
- package/dist/knowledge/prompt.d.ts.map +1 -0
- package/dist/knowledge/prompt.js +416 -0
- package/dist/knowledge/prompt.js.map +1 -0
- package/dist/knowledge/query.d.ts +118 -0
- package/dist/knowledge/query.d.ts.map +1 -0
- package/dist/knowledge/query.js +438 -0
- package/dist/knowledge/query.js.map +1 -0
- package/dist/knowledge/repo-map.d.ts +97 -0
- package/dist/knowledge/repo-map.d.ts.map +1 -0
- package/dist/knowledge/repo-map.js +447 -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 +355 -0
- package/dist/knowledge/validator.js.map +1 -0
- package/dist/mcp/server.d.ts +64 -8
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +448 -12
- 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/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 +495 -0
- package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
- package/dist/skills/distilled/distilled-brainstorming.md +79 -0
- package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
- package/dist/skills/distilled/distilled-canvas-design.md +128 -0
- package/dist/skills/distilled/distilled-claude-api.md +185 -0
- package/dist/skills/distilled/distilled-creator.md +181 -0
- package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
- package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
- package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
- package/dist/skills/distilled/distilled-docx.md +231 -0
- package/dist/skills/distilled/distilled-executing-plans.md +148 -0
- package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
- package/dist/skills/distilled/distilled-frontend-design.md +118 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +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-receiving-code-review.md +185 -0
- package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
- package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +154 -0
- package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
- package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +213 -0
- package/dist/skills/distilled/distilled-writing-skills.md +175 -0
- package/dist/skills/registry.d.ts +55 -51
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +82 -196
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +14 -14
- package/dist/skills/tools/pipeline-suggest.js.map +1 -1
- package/dist/skills/tools/skill-invoke.d.ts +3 -2
- package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
- package/dist/skills/tools/skill-invoke.js +4 -2
- package/dist/skills/tools/skill-invoke.js.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.js +6 -1
- package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
- package/dist/web/analytics/drift-detector.d.ts +6 -0
- package/dist/web/analytics/drift-detector.d.ts.map +1 -1
- package/dist/web/analytics/drift-detector.js +15 -8
- package/dist/web/analytics/drift-detector.js.map +1 -1
- package/dist/web/analytics/weekly-report.d.ts +13 -0
- package/dist/web/analytics/weekly-report.d.ts.map +1 -1
- package/dist/web/analytics/weekly-report.js +17 -3
- package/dist/web/analytics/weekly-report.js.map +1 -1
- package/dist/web/routes/_helpers.d.ts +31 -0
- package/dist/web/routes/_helpers.d.ts.map +1 -1
- package/dist/web/routes/_helpers.js +33 -0
- package/dist/web/routes/_helpers.js.map +1 -1
- package/dist/web/routes/agent-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/agent-distill.d.ts +49 -0
- package/dist/web/routes/agent-distill.d.ts.map +1 -0
- package/dist/web/routes/agent-distill.js +526 -0
- package/dist/web/routes/agent-distill.js.map +1 -0
- package/dist/web/routes/config.d.ts +56 -0
- package/dist/web/routes/config.d.ts.map +1 -0
- package/dist/web/routes/config.js +243 -0
- package/dist/web/routes/config.js.map +1 -0
- package/dist/web/routes/decisions.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/error-handler.d.ts +0 -4
- package/dist/web/routes/error-handler.d.ts.map +1 -1
- package/dist/web/routes/error-handler.js +0 -8
- package/dist/web/routes/error-handler.js.map +1 -1
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +26 -1
- 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 +0 -0
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +57 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/knowledge.js +772 -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 +28 -0
- package/dist/web/routes/pipeline.d.ts.map +1 -0
- package/dist/web/routes/pipeline.js +145 -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 +26 -7
- 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 +17 -8
- 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/skill-stats.d.ts.map +1 -1
- package/dist/web/routes/skill-stats.js +153 -16
- package/dist/web/routes/skill-stats.js.map +1 -1
- package/dist/web/routes/skills-distill.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/stats.d.ts.map +1 -1
- package/dist/web/routes/stats.js +2 -1
- package/dist/web/routes/stats.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +178 -0
- package/dist/web/routes/task-timeline.d.ts.map +1 -0
- package/dist/web/routes/task-timeline.js +530 -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 +377 -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 +112 -0
- package/dist/web/routes/violations.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +99 -19
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/agent-distill-manager.d.ts +122 -0
- package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
- package/dist/web/services/agent-distill-manager.js +397 -0
- package/dist/web/services/agent-distill-manager.js.map +1 -0
- package/dist/web/services/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 +172 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -0
- package/dist/web/services/distill-manager.js +411 -0
- package/dist/web/services/distill-manager.js.map +1 -0
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-DlDQNihj.js +3 -0
- package/dist/web/static/assets/MarkdownRenderer-DlDQNihj.js.map +1 -0
- package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
- package/dist/web/static/assets/NotFound-LMzbP51V.js.map +1 -0
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
- package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
- package/dist/web/static/assets/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-B_v_MKlb.css +1 -0
- package/dist/web/static/assets/index-DileOOE4.js +4 -0
- package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
- package/dist/web/static/assets/outcome-BKGy9azt.js +2 -0
- package/dist/web/static/assets/outcome-BKGy9azt.js.map +1 -0
- package/dist/web/static/assets/query-CgCOpYWf.js +2 -0
- package/dist/web/static/assets/{query-C99w429o.js.map → query-CgCOpYWf.js.map} +1 -1
- package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-Cxmg8RuL.js} +3 -3
- package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-Cxmg8RuL.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-BDYycNja.js +6 -0
- package/dist/web/static/assets/syntax-highlighter-BDYycNja.js.map +1 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
- package/dist/web/static/index.html +12 -8
- package/package.json +18 -5
- 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-openspec.md +0 -89
- 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 -74
- 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/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,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OutcomeClassificationService — Stop-time outcome instrumentation.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `StopHandler` (D-3) so the orchestrator stays thin.
|
|
5
|
+
* Single responsibility: gather signals + run `classifyOutcome` + persist
|
|
6
|
+
* outcome columns on `sessions` + `tasks`, plus the Phase 2 metrics rollup
|
|
7
|
+
* back-fill.
|
|
8
|
+
*
|
|
9
|
+
* Lifecycle: owned by `StopHandler` (constructed per-daemon, called per-event).
|
|
10
|
+
* Stateless — no per-call construction deps; each method receives storage +
|
|
11
|
+
* taskSegmenter explicitly so the service is trivially injectable in tests.
|
|
12
|
+
*
|
|
13
|
+
* Failure mode: every public method is fire-and-forget. Never throws; logs at
|
|
14
|
+
* debug level when storage / git subprocess hiccups.
|
|
15
|
+
*/
|
|
16
|
+
import { logger } from '../../core/utils/logger.js';
|
|
17
|
+
import { formatError } from '../../core/utils/format.js';
|
|
18
|
+
import { truncateSessionId } from '../../core/utils/session.js';
|
|
19
|
+
import { collectViolations } from '../../core/insights/violation-reporter.js';
|
|
20
|
+
import { classifyOutcome, collectCommitStats, } from './outcome-classifier.js';
|
|
21
|
+
/** Upper bound on idle tasks backfilled per Stop (mirrors original). */
|
|
22
|
+
const MAX_IDLE_TASKS_PER_RUN = 20;
|
|
23
|
+
export class OutcomeClassificationService {
|
|
24
|
+
/**
|
|
25
|
+
* Classify the session's outcome at Stop time and persist to both
|
|
26
|
+
* `sessions` and the most recent task row. Also rolls up Phase 2 metrics
|
|
27
|
+
* (intercept_count / kb_inject_count / skill_match_count).
|
|
28
|
+
*
|
|
29
|
+
* Fire-and-forget; never throws (debug-logs on error).
|
|
30
|
+
*/
|
|
31
|
+
async classifySession(event, storage, taskSegmenter) {
|
|
32
|
+
try {
|
|
33
|
+
const session = storage.getSession(event.session_id);
|
|
34
|
+
if (!session) {
|
|
35
|
+
logger.debug(`[OutcomeClassification] skipped: session ${truncateSessionId(event.session_id)} not in aggregate`);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const startIso = session.start_time;
|
|
39
|
+
const endIso = event.timestamp;
|
|
40
|
+
// Violations are collected ONLY for the persisted user_violation_count
|
|
41
|
+
// column (dashboard surfacing) — they NEVER influence the outcome verdict
|
|
42
|
+
// (governance interceptions inflate them). Best-effort.
|
|
43
|
+
let violationCount = 0;
|
|
44
|
+
try {
|
|
45
|
+
violationCount = collectViolations(storage, {
|
|
46
|
+
sessionId: event.session_id,
|
|
47
|
+
days: 365,
|
|
48
|
+
limit: 1000,
|
|
49
|
+
}).length;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
logger.debug(`[OutcomeClassification] violation collect failed: ${formatError(err)}`);
|
|
53
|
+
}
|
|
54
|
+
// Informational only: session-level git commit count (NOT load-bearing —
|
|
55
|
+
// see outcome-classifier v2). Surfaced in the reason / persisted column.
|
|
56
|
+
const commitStats = await collectCommitStats(event.project_path, startIso, endIso);
|
|
57
|
+
// PRIMARY signal: session-level edit intent (Edit/Write count via
|
|
58
|
+
// tool_name; gzip-safe). Drives success vs answered.
|
|
59
|
+
const sessionEditIntent = this.safeSessionEditIntent(storage, event.session_id);
|
|
60
|
+
const input = {
|
|
61
|
+
session_id: event.session_id,
|
|
62
|
+
start_time: startIso,
|
|
63
|
+
end_time: endIso,
|
|
64
|
+
event_count: session.event_count,
|
|
65
|
+
edit_intent_count: sessionEditIntent,
|
|
66
|
+
commit_count: commitStats.commit_count,
|
|
67
|
+
reverted_commits: commitStats.reverted_commits,
|
|
68
|
+
};
|
|
69
|
+
const result = classifyOutcome(input);
|
|
70
|
+
const classifiedAt = new Date().toISOString();
|
|
71
|
+
storage.updateSessionOutcome(event.session_id, {
|
|
72
|
+
outcome: result.outcome,
|
|
73
|
+
outcome_reason: result.reason,
|
|
74
|
+
commit_count: commitStats.commit_count,
|
|
75
|
+
reverted_commits: commitStats.reverted_commits,
|
|
76
|
+
user_violation_count: violationCount,
|
|
77
|
+
classified_at: classifiedAt,
|
|
78
|
+
});
|
|
79
|
+
// Stamp the CURRENT task with its OWN edit-intent signal (from
|
|
80
|
+
// task_events — includes sub-agent edits). This is the fix for "活跃 task
|
|
81
|
+
// 套 session result": a 干活 task is classified on whether IT changed
|
|
82
|
+
// code, independent of the session-level verdict.
|
|
83
|
+
const currentTaskId = taskSegmenter?.getCurrentTaskId(event.session_id) ?? null;
|
|
84
|
+
if (currentTaskId) {
|
|
85
|
+
try {
|
|
86
|
+
const taskEditIntent = this.safeTaskEditIntent(storage, currentTaskId);
|
|
87
|
+
const taskInput = {
|
|
88
|
+
session_id: event.session_id,
|
|
89
|
+
start_time: startIso,
|
|
90
|
+
end_time: endIso,
|
|
91
|
+
event_count: session.event_count,
|
|
92
|
+
edit_intent_count: taskEditIntent,
|
|
93
|
+
commit_count: commitStats.commit_count,
|
|
94
|
+
};
|
|
95
|
+
const taskResult = classifyOutcome(taskInput);
|
|
96
|
+
storage.updateTask(currentTaskId, {
|
|
97
|
+
outcome: taskResult.outcome,
|
|
98
|
+
outcome_reason: taskResult.reason,
|
|
99
|
+
user_violation_count: violationCount,
|
|
100
|
+
classified_at: classifiedAt,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
logger.debug(`[OutcomeClassification] task update failed: ${formatError(err)}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
logger.info(`[OutcomeClassification] ${truncateSessionId(event.session_id)}: ` +
|
|
108
|
+
`${result.outcome} (${result.reason}) — ` +
|
|
109
|
+
`events=${session.event_count} edit_intent=${sessionEditIntent} ` +
|
|
110
|
+
`commits=${commitStats.commit_count}`);
|
|
111
|
+
// Phase 2 metrics rollup (master roadmap §2): aggregate row counts from
|
|
112
|
+
// the three Phase 0/1/MVP1 fact tables and back-fill sessions.* so the
|
|
113
|
+
// dashboard / weekly-report can SELECT directly instead of JOINing on
|
|
114
|
+
// every read. Pure analytics — always on, no feature flag.
|
|
115
|
+
try {
|
|
116
|
+
const interceptCount = storage.countToolInterceptsBySession(event.session_id);
|
|
117
|
+
const kbInjectCount = storage.countInjectionsBySessionByHandler(event.session_id, 'UserPromptSubmitHandler:kb');
|
|
118
|
+
const skillMatchCount = storage.countSkillInvocationsBySession(event.session_id);
|
|
119
|
+
storage.updateSessionMetrics(event.session_id, {
|
|
120
|
+
interceptCount,
|
|
121
|
+
kbInjectCount,
|
|
122
|
+
skillMatchCount,
|
|
123
|
+
});
|
|
124
|
+
logger.info(`[OutcomeClassification] Session metrics: ` +
|
|
125
|
+
`intercept=${interceptCount} kb=${kbInjectCount} skill=${skillMatchCount}`);
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
logger.debug(`[OutcomeClassification] metrics rollup failed: ${formatError(err)}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
logger.debug(`[OutcomeClassification] failed: ${formatError(err)}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Backfill outcome on all unclassified completed/abandoned tasks for the
|
|
137
|
+
* session. Without this, TaskSegmenter-completed tasks (the ones closed by a
|
|
138
|
+
* new-prompt switch) stay outcome=NULL forever.
|
|
139
|
+
*
|
|
140
|
+
* spec 1100 v2: classification is pure edit-intent — NO git subprocess per
|
|
141
|
+
* task. Gated to MAX_IDLE_TASKS_PER_RUN to bound the per-task edit-intent
|
|
142
|
+
* queries. Fire-and-forget; never throws.
|
|
143
|
+
*/
|
|
144
|
+
async classifyIdleTasks(event, storage) {
|
|
145
|
+
try {
|
|
146
|
+
const idle = storage.queryIdleUnclassifiedTasks(event.session_id);
|
|
147
|
+
if (idle.length === 0)
|
|
148
|
+
return;
|
|
149
|
+
const slice = idle.slice(0, MAX_IDLE_TASKS_PER_RUN);
|
|
150
|
+
const classifiedAt = new Date().toISOString();
|
|
151
|
+
let updated = 0;
|
|
152
|
+
for (const t of slice) {
|
|
153
|
+
try {
|
|
154
|
+
const startIso = t.start_time;
|
|
155
|
+
const endIso = t.end_time ?? event.timestamp;
|
|
156
|
+
// PRIMARY signal: per-task edit intent (task_events; gzip-safe).
|
|
157
|
+
const editIntent = this.safeTaskEditIntent(storage, t.id);
|
|
158
|
+
const input = {
|
|
159
|
+
session_id: event.session_id,
|
|
160
|
+
start_time: startIso,
|
|
161
|
+
end_time: endIso,
|
|
162
|
+
event_count: t.event_count ?? 0,
|
|
163
|
+
edit_intent_count: editIntent,
|
|
164
|
+
};
|
|
165
|
+
const result = classifyOutcome(input);
|
|
166
|
+
storage.updateTask(t.id, {
|
|
167
|
+
outcome: result.outcome,
|
|
168
|
+
outcome_reason: result.reason,
|
|
169
|
+
classified_at: classifiedAt,
|
|
170
|
+
});
|
|
171
|
+
updated += 1;
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
logger.debug(`[OutcomeClassification] idle task classify failed for ${t.id}: ${formatError(err)}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (updated > 0) {
|
|
178
|
+
logger.info(`[OutcomeClassification] Backfilled outcome for ${updated}/${idle.length} idle task(s) ` +
|
|
179
|
+
`on session ${truncateSessionId(event.session_id)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
logger.debug(`[OutcomeClassification] idle task classification failed: ${formatError(err)}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// ── edit-intent helpers (spec 1100 v2) ────────────────────────────────
|
|
187
|
+
/**
|
|
188
|
+
* Count a single task's Edit/Write intent events. Best-effort: 0 on error so
|
|
189
|
+
* classification never throws because of a storage hiccup.
|
|
190
|
+
*/
|
|
191
|
+
safeTaskEditIntent(storage, taskId) {
|
|
192
|
+
try {
|
|
193
|
+
return storage.countEditIntentEventsByTask(taskId);
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
logger.debug(`[OutcomeClassification] edit-intent count failed for ${taskId}: ${formatError(err)}`);
|
|
197
|
+
return 0;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Session-level edit intent = COUNT of Edit/Write events across the session
|
|
202
|
+
* (tool_name only; gzip-safe). Best-effort, 0 on error.
|
|
203
|
+
*/
|
|
204
|
+
safeSessionEditIntent(storage, sessionId) {
|
|
205
|
+
try {
|
|
206
|
+
return storage.countEditIntentEventsBySession(sessionId);
|
|
207
|
+
}
|
|
208
|
+
catch (err) {
|
|
209
|
+
logger.debug(`[OutcomeClassification] session edit-intent failed for ${sessionId}: ${formatError(err)}`);
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=outcome-classification-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-classification-service.js","sourceRoot":"","sources":["../../../src/daemon/services/outcome-classification-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outcome classifier (spec 1100 v2 — edit-intent-driven, 2026-06-02)
|
|
3
|
+
*
|
|
4
|
+
* Pure-function module that assigns one of
|
|
5
|
+
* `success | answered | abandoned (| partial)` to a session (or task) based on
|
|
6
|
+
* a tiny set of robust signals collected at Stop time.
|
|
7
|
+
*
|
|
8
|
+
* ## Why this rewrite
|
|
9
|
+
* The previous version keyed `success` off git `commit_count` attributed by a
|
|
10
|
+
* time window, then a v1.5 attempted to fix it with file→task commit
|
|
11
|
+
* attribution. A dry-run proved the attribution path is **broken**: `tool_input`
|
|
12
|
+
* (which holds `file_path`) is gzip-compressed, so file attribution silently
|
|
13
|
+
* fails → 0 commits attributed → genuine work judged failed AND ~105 real
|
|
14
|
+
* successes downgraded. We therefore **delete all commit attribution** and key
|
|
15
|
+
* the verdict off a signal that cannot be corrupted by gzip:
|
|
16
|
+
*
|
|
17
|
+
* `edit_intent_count` = COUNT(events WHERE tool_name IN
|
|
18
|
+
* ('Edit','Write','MultiEdit','NotebookEdit')) on the task's task_events.
|
|
19
|
+
* Only the `tool_name` column is read — never the compressed `tool_input` —
|
|
20
|
+
* so it is always correct. Sub-agent Edit/Write events are already linked to
|
|
21
|
+
* the parent task's task_events, so "did this task change code?" is captured.
|
|
22
|
+
*
|
|
23
|
+
* ## Design principles
|
|
24
|
+
* - **No LLM, no I/O**: classify is referentially transparent; signal
|
|
25
|
+
* gathering (edit-intent count) lives in the caller.
|
|
26
|
+
* - **Edit-intent is the primary signal**; `commit_count` is informational
|
|
27
|
+
* only and NOT load-bearing for the verdict.
|
|
28
|
+
* - **No violation-based downgrade**: daemon governance interceptions inflate
|
|
29
|
+
* `violation_count`, so it must not influence outcome.
|
|
30
|
+
* - **Tunable**: thresholds are exported constants.
|
|
31
|
+
*
|
|
32
|
+
* ## Priority chain (first matching branch wins)
|
|
33
|
+
* 1. abandoned/no_work — event_count <= 1
|
|
34
|
+
* 2. abandoned/too_short — duration < 30s && event_count < 5
|
|
35
|
+
* 3. answered/no-change-expected — edit_intent == 0 (pure Q&A / research)
|
|
36
|
+
* 4. success/did-work — edit_intent > 0
|
|
37
|
+
*
|
|
38
|
+
* The `partial` outcome is retained as a defensive fallback only (the chain
|
|
39
|
+
* above is total over valid inputs, so it is effectively unreachable).
|
|
40
|
+
*/
|
|
41
|
+
/**
|
|
42
|
+
* Thresholds (exported for visibility in tests and for back-test tuning).
|
|
43
|
+
* Spec defaults — DO NOT casually mutate; the spec contains rationale.
|
|
44
|
+
*/
|
|
45
|
+
export declare const OUTCOME_THRESHOLDS: {
|
|
46
|
+
/** Below this duration with few events → `abandoned/too_short`. */
|
|
47
|
+
readonly MIN_DURATION_FOR_ABANDONED_SEC: 30;
|
|
48
|
+
/** Below this event count combined with short duration → `abandoned/too_short`. */
|
|
49
|
+
readonly MIN_EVENT_FOR_ABANDONED: 5;
|
|
50
|
+
/** At or below this event count → `abandoned/no_work` (regardless of duration). */
|
|
51
|
+
readonly ABSOLUTE_NO_WORK_EVENT_CAP: 1;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Edit-intent threshold. A task with at least this many Edit/Write intents is
|
|
55
|
+
* treated as "code work was done" → `success`; below it (i.e. 0) the task is a
|
|
56
|
+
* pure Q&A / research task → `answered/no-change-expected`.
|
|
57
|
+
*
|
|
58
|
+
* Kept as a named constant (not a magic literal) so the answered-vs-success
|
|
59
|
+
* split can be retuned in one place. Currently 1 = "any edit counts".
|
|
60
|
+
*/
|
|
61
|
+
export declare const EDIT_INTENT_THRESHOLD_FOR_WORK = 1;
|
|
62
|
+
export interface OutcomeInput {
|
|
63
|
+
/** Only used in `reason` strings; not load-bearing. */
|
|
64
|
+
session_id?: string;
|
|
65
|
+
/** ISO 8601 timestamp (parsed via Date.parse). */
|
|
66
|
+
start_time: string;
|
|
67
|
+
/** ISO 8601 timestamp (parsed via Date.parse). */
|
|
68
|
+
end_time: string;
|
|
69
|
+
/** Total events on this session (or task window). */
|
|
70
|
+
event_count: number;
|
|
71
|
+
/**
|
|
72
|
+
* Number of Edit/Write/MultiEdit/NotebookEdit events on this task (via
|
|
73
|
+
* task_events join). THE primary signal: >0 → success, ==0 → answered.
|
|
74
|
+
* Optional + defaults to 0 so legacy callers / unit tests stay green.
|
|
75
|
+
*/
|
|
76
|
+
edit_intent_count?: number;
|
|
77
|
+
/**
|
|
78
|
+
* Informational only — NOT used by the verdict. Kept so callers can pass it
|
|
79
|
+
* through to persistence (sessions/tasks.commit_count column) and so the
|
|
80
|
+
* `reason` string can optionally surface a session-level commit count.
|
|
81
|
+
*/
|
|
82
|
+
commit_count?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Informational only — NOT used by the verdict. Retained for the persisted
|
|
85
|
+
* `reverted_commits` column; the previous per-task git revert signal was
|
|
86
|
+
* removed (it required per-task git subprocesses we deleted).
|
|
87
|
+
*/
|
|
88
|
+
reverted_commits?: number;
|
|
89
|
+
/**
|
|
90
|
+
* Informational only — NOT used by the verdict. Daemon governance
|
|
91
|
+
* interceptions inflate this, so it must never downgrade an outcome.
|
|
92
|
+
*/
|
|
93
|
+
violation_count?: number;
|
|
94
|
+
}
|
|
95
|
+
export interface OutcomeResult {
|
|
96
|
+
/**
|
|
97
|
+
* `answered` is a first-class outcome for pure Q&A / research tasks that
|
|
98
|
+
* legitimately produced no code change. `failed` / `partial` are retained in
|
|
99
|
+
* the union for back-compat with persisted historical rows and the defensive
|
|
100
|
+
* fallback, but the v2 chain only emits `success | answered | abandoned`.
|
|
101
|
+
* The schema `outcome` CHECK was relaxed to a non-empty-string guard so these
|
|
102
|
+
* values persist without a per-value table rebuild.
|
|
103
|
+
*/
|
|
104
|
+
outcome: 'success' | 'partial' | 'failed' | 'abandoned' | 'answered';
|
|
105
|
+
/** Short, machine-stable text describing which rule fired. */
|
|
106
|
+
reason: string;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Classify an outcome from aggregated signals. Pure function; no I/O.
|
|
110
|
+
*
|
|
111
|
+
* Decision tree (spec 1100 v2 — edit-intent-driven):
|
|
112
|
+
* 1. event_count <= 1 → abandoned/no_work
|
|
113
|
+
* 2. duration < 30s && event_count < 5 → abandoned/too_short
|
|
114
|
+
* 3. edit_intent == 0 → answered/no-change-expected
|
|
115
|
+
* 4. edit_intent > 0 → success/did-work
|
|
116
|
+
* (fallback: partial — effectively unreachable, defensive only)
|
|
117
|
+
*
|
|
118
|
+
* `null` / undefined / NaN inputs are coerced defensively (missing counts → 0,
|
|
119
|
+
* missing timestamps → durationSec = 0) so callers can pass partial data
|
|
120
|
+
* without blowing up.
|
|
121
|
+
*/
|
|
122
|
+
export declare function classifyOutcome(input: OutcomeInput): OutcomeResult;
|
|
123
|
+
export interface CommitStats {
|
|
124
|
+
commit_count: number;
|
|
125
|
+
reverted_commits: number;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Gather git commit stats for the time window `[startIso, endIso]` at
|
|
129
|
+
* `projectPath`. Returns `{ commit_count: 0, reverted_commits: 0 }` for any
|
|
130
|
+
* failure (non-git directory, missing path, git not installed, timeout, etc.) —
|
|
131
|
+
* outcome classifier handles "no signal" as the non-git fallback.
|
|
132
|
+
*
|
|
133
|
+
* Timeout: 5s total (per spec §2.5 prior art).
|
|
134
|
+
*/
|
|
135
|
+
export declare function collectCommitStats(projectPath: string | null | undefined, startIso: string, endIso: string): Promise<CommitStats>;
|
|
136
|
+
//# sourceMappingURL=outcome-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-classifier.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/outcome-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB;IAC7B,mEAAmE;;IAEnE,mFAAmF;;IAEnF,mFAAmF;;CAE3E,CAAC;AAEX;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;OAOG;IACH,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;IACrE,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,aAAa,CAuClE;AAqBD,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,CAmCtB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outcome classifier (spec 1100 v2 — edit-intent-driven, 2026-06-02)
|
|
3
|
+
*
|
|
4
|
+
* Pure-function module that assigns one of
|
|
5
|
+
* `success | answered | abandoned (| partial)` to a session (or task) based on
|
|
6
|
+
* a tiny set of robust signals collected at Stop time.
|
|
7
|
+
*
|
|
8
|
+
* ## Why this rewrite
|
|
9
|
+
* The previous version keyed `success` off git `commit_count` attributed by a
|
|
10
|
+
* time window, then a v1.5 attempted to fix it with file→task commit
|
|
11
|
+
* attribution. A dry-run proved the attribution path is **broken**: `tool_input`
|
|
12
|
+
* (which holds `file_path`) is gzip-compressed, so file attribution silently
|
|
13
|
+
* fails → 0 commits attributed → genuine work judged failed AND ~105 real
|
|
14
|
+
* successes downgraded. We therefore **delete all commit attribution** and key
|
|
15
|
+
* the verdict off a signal that cannot be corrupted by gzip:
|
|
16
|
+
*
|
|
17
|
+
* `edit_intent_count` = COUNT(events WHERE tool_name IN
|
|
18
|
+
* ('Edit','Write','MultiEdit','NotebookEdit')) on the task's task_events.
|
|
19
|
+
* Only the `tool_name` column is read — never the compressed `tool_input` —
|
|
20
|
+
* so it is always correct. Sub-agent Edit/Write events are already linked to
|
|
21
|
+
* the parent task's task_events, so "did this task change code?" is captured.
|
|
22
|
+
*
|
|
23
|
+
* ## Design principles
|
|
24
|
+
* - **No LLM, no I/O**: classify is referentially transparent; signal
|
|
25
|
+
* gathering (edit-intent count) lives in the caller.
|
|
26
|
+
* - **Edit-intent is the primary signal**; `commit_count` is informational
|
|
27
|
+
* only and NOT load-bearing for the verdict.
|
|
28
|
+
* - **No violation-based downgrade**: daemon governance interceptions inflate
|
|
29
|
+
* `violation_count`, so it must not influence outcome.
|
|
30
|
+
* - **Tunable**: thresholds are exported constants.
|
|
31
|
+
*
|
|
32
|
+
* ## Priority chain (first matching branch wins)
|
|
33
|
+
* 1. abandoned/no_work — event_count <= 1
|
|
34
|
+
* 2. abandoned/too_short — duration < 30s && event_count < 5
|
|
35
|
+
* 3. answered/no-change-expected — edit_intent == 0 (pure Q&A / research)
|
|
36
|
+
* 4. success/did-work — edit_intent > 0
|
|
37
|
+
*
|
|
38
|
+
* The `partial` outcome is retained as a defensive fallback only (the chain
|
|
39
|
+
* above is total over valid inputs, so it is effectively unreachable).
|
|
40
|
+
*/
|
|
41
|
+
/**
|
|
42
|
+
* Thresholds (exported for visibility in tests and for back-test tuning).
|
|
43
|
+
* Spec defaults — DO NOT casually mutate; the spec contains rationale.
|
|
44
|
+
*/
|
|
45
|
+
export const OUTCOME_THRESHOLDS = {
|
|
46
|
+
/** Below this duration with few events → `abandoned/too_short`. */
|
|
47
|
+
MIN_DURATION_FOR_ABANDONED_SEC: 30,
|
|
48
|
+
/** Below this event count combined with short duration → `abandoned/too_short`. */
|
|
49
|
+
MIN_EVENT_FOR_ABANDONED: 5,
|
|
50
|
+
/** At or below this event count → `abandoned/no_work` (regardless of duration). */
|
|
51
|
+
ABSOLUTE_NO_WORK_EVENT_CAP: 1,
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Edit-intent threshold. A task with at least this many Edit/Write intents is
|
|
55
|
+
* treated as "code work was done" → `success`; below it (i.e. 0) the task is a
|
|
56
|
+
* pure Q&A / research task → `answered/no-change-expected`.
|
|
57
|
+
*
|
|
58
|
+
* Kept as a named constant (not a magic literal) so the answered-vs-success
|
|
59
|
+
* split can be retuned in one place. Currently 1 = "any edit counts".
|
|
60
|
+
*/
|
|
61
|
+
export const EDIT_INTENT_THRESHOLD_FOR_WORK = 1;
|
|
62
|
+
/**
|
|
63
|
+
* Classify an outcome from aggregated signals. Pure function; no I/O.
|
|
64
|
+
*
|
|
65
|
+
* Decision tree (spec 1100 v2 — edit-intent-driven):
|
|
66
|
+
* 1. event_count <= 1 → abandoned/no_work
|
|
67
|
+
* 2. duration < 30s && event_count < 5 → abandoned/too_short
|
|
68
|
+
* 3. edit_intent == 0 → answered/no-change-expected
|
|
69
|
+
* 4. edit_intent > 0 → success/did-work
|
|
70
|
+
* (fallback: partial — effectively unreachable, defensive only)
|
|
71
|
+
*
|
|
72
|
+
* `null` / undefined / NaN inputs are coerced defensively (missing counts → 0,
|
|
73
|
+
* missing timestamps → durationSec = 0) so callers can pass partial data
|
|
74
|
+
* without blowing up.
|
|
75
|
+
*/
|
|
76
|
+
export function classifyOutcome(input) {
|
|
77
|
+
const startMs = parseTs(input.start_time);
|
|
78
|
+
const endMs = parseTs(input.end_time);
|
|
79
|
+
const durationSec = startMs !== null && endMs !== null && endMs >= startMs
|
|
80
|
+
? (endMs - startMs) / 1000
|
|
81
|
+
: 0;
|
|
82
|
+
const eventCount = nonNegInt(input.event_count);
|
|
83
|
+
// Primary signal: >0 means code was changed (Edit/Write/MultiEdit/Notebook),
|
|
84
|
+
// ==0 means a pure Q&A / research task. Reads only tool_name → gzip-safe.
|
|
85
|
+
const editIntent = nonNegInt(input.edit_intent_count);
|
|
86
|
+
const hasEditIntent = editIntent >= EDIT_INTENT_THRESHOLD_FOR_WORK;
|
|
87
|
+
// ── 1. abandoned ────────────────────────────────────────────────────────
|
|
88
|
+
if (eventCount <= OUTCOME_THRESHOLDS.ABSOLUTE_NO_WORK_EVENT_CAP) {
|
|
89
|
+
return { outcome: 'abandoned', reason: 'no_work' };
|
|
90
|
+
}
|
|
91
|
+
if (durationSec < OUTCOME_THRESHOLDS.MIN_DURATION_FOR_ABANDONED_SEC &&
|
|
92
|
+
eventCount < OUTCOME_THRESHOLDS.MIN_EVENT_FOR_ABANDONED) {
|
|
93
|
+
return { outcome: 'abandoned', reason: 'too_short' };
|
|
94
|
+
}
|
|
95
|
+
// ── 2. answered (pure Q&A / research — no change expected) ───────────────
|
|
96
|
+
// No edit intent → the task did exactly what was asked (answer / investigate)
|
|
97
|
+
// and legitimately produced no code change. NOT a failure.
|
|
98
|
+
if (!hasEditIntent) {
|
|
99
|
+
return { outcome: 'answered', reason: 'no-change-expected' };
|
|
100
|
+
}
|
|
101
|
+
// ── 3. success (code was changed) ────────────────────────────────────────
|
|
102
|
+
// edit_intent > 0 → the task (incl. sub-agents whose Edit/Write events are
|
|
103
|
+
// linked to this task) changed code. commit_count is surfaced in the reason
|
|
104
|
+
// for context but does NOT gate the verdict.
|
|
105
|
+
const commits = nonNegInt(input.commit_count);
|
|
106
|
+
const reason = commits > 0 ? `did-work+commit=${commits}` : 'did-work';
|
|
107
|
+
return { outcome: 'success', reason };
|
|
108
|
+
}
|
|
109
|
+
// ── Git signal gathering (informational only) ──────────────────────────────
|
|
110
|
+
//
|
|
111
|
+
// spec 1100 v2: the verdict no longer depends on git. `collectCommitStats` is
|
|
112
|
+
// kept ONLY as an informational session-level signal (other callers —
|
|
113
|
+
// backfill-outcomes.ts, idle-session-sweeper — still import it) so the success
|
|
114
|
+
// `reason` can optionally surface a commit count. The previous per-task
|
|
115
|
+
// file→commit attribution (`attributeCommitsToTasks`) was DELETED: it relied on
|
|
116
|
+
// decoding gzip `tool_input` for file paths, which silently failed and
|
|
117
|
+
// corrupted the verdict (0 commits attributed → real work judged failed).
|
|
118
|
+
import { execFile } from 'node:child_process';
|
|
119
|
+
import { promisify } from 'node:util';
|
|
120
|
+
import { existsSync } from 'node:fs';
|
|
121
|
+
const execFileAsync = promisify(execFile);
|
|
122
|
+
/** Subjects matching these patterns count as "reverted_commits" (case-insensitive). */
|
|
123
|
+
const REVERT_KEYWORDS_REGEX = /^(revert|hotfix|amend|fix\s+typo)/i;
|
|
124
|
+
/**
|
|
125
|
+
* Gather git commit stats for the time window `[startIso, endIso]` at
|
|
126
|
+
* `projectPath`. Returns `{ commit_count: 0, reverted_commits: 0 }` for any
|
|
127
|
+
* failure (non-git directory, missing path, git not installed, timeout, etc.) —
|
|
128
|
+
* outcome classifier handles "no signal" as the non-git fallback.
|
|
129
|
+
*
|
|
130
|
+
* Timeout: 5s total (per spec §2.5 prior art).
|
|
131
|
+
*/
|
|
132
|
+
export async function collectCommitStats(projectPath, startIso, endIso) {
|
|
133
|
+
if (!projectPath || !existsSync(projectPath)) {
|
|
134
|
+
return { commit_count: 0, reverted_commits: 0 };
|
|
135
|
+
}
|
|
136
|
+
const opts = { cwd: projectPath, timeout: 5000 };
|
|
137
|
+
try {
|
|
138
|
+
// Confirm a git work-tree at projectPath; cheaper than letting `log` fail.
|
|
139
|
+
await execFileAsync('git', ['rev-parse', '--is-inside-work-tree'], opts);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return { commit_count: 0, reverted_commits: 0 };
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
// `--all` so commits on non-HEAD branches still count (rare for our case
|
|
146
|
+
// but cheap to include). `%s` outputs subject only.
|
|
147
|
+
const { stdout } = await execFileAsync('git', [
|
|
148
|
+
'log',
|
|
149
|
+
'--all',
|
|
150
|
+
'--since', startIso,
|
|
151
|
+
'--until', endIso,
|
|
152
|
+
'--pretty=format:%s',
|
|
153
|
+
], opts);
|
|
154
|
+
const lines = stdout
|
|
155
|
+
.toString()
|
|
156
|
+
.split('\n')
|
|
157
|
+
.map((l) => l.trim())
|
|
158
|
+
.filter((l) => l.length > 0);
|
|
159
|
+
const reverted = lines.filter((subj) => REVERT_KEYWORDS_REGEX.test(subj)).length;
|
|
160
|
+
return { commit_count: lines.length, reverted_commits: reverted };
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return { commit_count: 0, reverted_commits: 0 };
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
167
|
+
function parseTs(s) {
|
|
168
|
+
if (typeof s !== 'string' || s.length === 0)
|
|
169
|
+
return null;
|
|
170
|
+
const t = Date.parse(s);
|
|
171
|
+
return Number.isFinite(t) ? t : null;
|
|
172
|
+
}
|
|
173
|
+
function nonNegInt(v) {
|
|
174
|
+
if (typeof v !== 'number' || !Number.isFinite(v) || v < 0)
|
|
175
|
+
return 0;
|
|
176
|
+
return Math.floor(v);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=outcome-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-classifier.js","sourceRoot":"","sources":["../../../src/daemon/services/outcome-classifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OutcomeNudge — outcome-backfill soft-gate (decision 1ac6fc31, 2026-06-04).
|
|
3
|
+
*
|
|
4
|
+
* Closes the last gap in the harness learning loop: of ~12 resolved decisions,
|
|
5
|
+
* only 3 had their `outcome` back-filled (75% miss), so decision-maker's
|
|
6
|
+
* Step 1.5 precedent weighting ran empty. CLAUDE.md already mandates the
|
|
7
|
+
* implementing agent back-fill via `cf decisions outcome <id> --result ...`,
|
|
8
|
+
* but the document constraint alone failed.
|
|
9
|
+
*
|
|
10
|
+
* This is a PURE SOFT-GATE. It ONLY emits a `[OUTCOME NUDGE]` systemMessage
|
|
11
|
+
* reminding the human/agent to run `cf decisions outcome`. It NEVER:
|
|
12
|
+
* - writes / infers an outcome value (precedent f4614f7f deleted auto-
|
|
13
|
+
* attribution twice — this gate produces text only, never touches
|
|
14
|
+
* writeDecisionOutcome),
|
|
15
|
+
* - denies / blocks any tool (no `allow:false`, no PreToolUse rule).
|
|
16
|
+
*
|
|
17
|
+
* Two delivery paths, both surfacing at UserPromptSubmit (the only hook whose
|
|
18
|
+
* systemMessage Claude Code actually consumes — see OQ1 below):
|
|
19
|
+
*
|
|
20
|
+
* Option A (threshold, primary backstop): when a session/project has
|
|
21
|
+
* accumulated >= N (`outcome_nudge_threshold`, default 2) resolved-but-
|
|
22
|
+
* unfilled decisions, inject the nudge on the next UserPromptSubmit, subject
|
|
23
|
+
* to cooldown.
|
|
24
|
+
*
|
|
25
|
+
* Option B (completion nudge, DEGRADED): the Stop hook is the natural "just
|
|
26
|
+
* finished" moment, but OQ1 found that `stop.sh` only parses `allow`/`reason`
|
|
27
|
+
* from the daemon response — it never echoes systemMessage back to Claude
|
|
28
|
+
* Code. So Option B cannot deliver text at Stop. Degraded path: StopHandler
|
|
29
|
+
* calls `markStopPending()` to set an in-memory per-session flag; the next
|
|
30
|
+
* UserPromptSubmit consumes it and injects the nudge regardless of the
|
|
31
|
+
* threshold (completion timing is high-signal). The flag is transient (lost
|
|
32
|
+
* on daemon restart) — acceptable because Option A's threshold still catches
|
|
33
|
+
* the same backlog on the next prompt.
|
|
34
|
+
*
|
|
35
|
+
* Cooldown (anti-nag): per-session in-memory timestamp + the global
|
|
36
|
+
* `outcome_nudge_cooldown_seconds` (default 86400 = 24h). Within the cooldown
|
|
37
|
+
* window we do not re-nudge the same session. The cooldown is NOT applied to
|
|
38
|
+
* the degraded Option B path's first fire after a Stop — completion is the
|
|
39
|
+
* moment we most want the reminder — but it IS recorded so a follow-up prompt
|
|
40
|
+
* seconds later doesn't double-nudge.
|
|
41
|
+
*
|
|
42
|
+
* Fail-safe: every public method catches and degrades to "no nudge". The soft-
|
|
43
|
+
* gate must never break the prompt pipeline.
|
|
44
|
+
*/
|
|
45
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
46
|
+
/** forge_config key for the resolved-unfilled threshold (Option A). */
|
|
47
|
+
export declare const OUTCOME_NUDGE_THRESHOLD_KEY = "outcome_nudge_threshold";
|
|
48
|
+
/** Default Option A threshold — nudge once 2 decisions are awaiting back-fill. */
|
|
49
|
+
export declare const DEFAULT_OUTCOME_NUDGE_THRESHOLD = 2;
|
|
50
|
+
/** forge_config key for the per-session cooldown (seconds). */
|
|
51
|
+
export declare const OUTCOME_NUDGE_COOLDOWN_KEY = "outcome_nudge_cooldown_seconds";
|
|
52
|
+
/** Default cooldown — 24h between nudges for the same session. */
|
|
53
|
+
export declare const DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS = 86400;
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the Option A threshold from forge_config, falling back to the
|
|
56
|
+
* default for missing / non-finite / < 1 values.
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveOutcomeNudgeThreshold(storage?: SQLiteStorage | null): number;
|
|
59
|
+
/**
|
|
60
|
+
* Resolve the cooldown (seconds) from forge_config. Values <= 0 or above the
|
|
61
|
+
* hard bound fall back to the default.
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveOutcomeNudgeCooldownSeconds(storage?: SQLiteStorage | null): number;
|
|
64
|
+
/**
|
|
65
|
+
* Format the `[OUTCOME NUDGE]` systemMessage. Independent `[OUTCOME NUDGE]`
|
|
66
|
+
* prefix (parallel to `[DECISION HINT]`) so the two never visually merge when
|
|
67
|
+
* both appear in the same systemMessage (OQ4). Pure / exported for tests.
|
|
68
|
+
*
|
|
69
|
+
* `reason` distinguishes the trigger purely for the leading line; the body
|
|
70
|
+
* (id list + command) is identical either way.
|
|
71
|
+
*/
|
|
72
|
+
export declare function formatOutcomeNudge(ids: string[], reason: 'completion' | 'threshold'): string;
|
|
73
|
+
/**
|
|
74
|
+
* OutcomeNudgeService — owns the cooldown / Stop-pending state and computes the
|
|
75
|
+
* nudge message. One instance lives on UserPromptHandler; StopHandler reaches
|
|
76
|
+
* it through the existing userPromptHandler reference to set the Stop flag.
|
|
77
|
+
*/
|
|
78
|
+
export declare class OutcomeNudgeService {
|
|
79
|
+
private readonly state;
|
|
80
|
+
private key;
|
|
81
|
+
/**
|
|
82
|
+
* Degraded Option B entry point. Called by StopHandler at completion. Sets an
|
|
83
|
+
* in-memory flag iff the session/project has resolved-unfilled decisions, so
|
|
84
|
+
* the NEXT UserPromptSubmit injects the nudge regardless of the threshold.
|
|
85
|
+
*
|
|
86
|
+
* Pure read of storage + flag set; NEVER writes an outcome. Fail-silent.
|
|
87
|
+
*/
|
|
88
|
+
markStopPending(sessionId: string, projectPath: string, storage: SQLiteStorage | null): void;
|
|
89
|
+
/**
|
|
90
|
+
* UserPromptSubmit entry point. Returns the `[OUTCOME NUDGE]` message to
|
|
91
|
+
* append to systemMessage, or null when no nudge is warranted.
|
|
92
|
+
*
|
|
93
|
+
* Fires when EITHER:
|
|
94
|
+
* - the Stop-pending flag is set (degraded Option B, completion timing), OR
|
|
95
|
+
* - resolved-unfilled count >= threshold (Option A backstop)
|
|
96
|
+
* AND the per-session cooldown has elapsed.
|
|
97
|
+
*
|
|
98
|
+
* Side effects: clears the Stop-pending flag (consumed once) and records the
|
|
99
|
+
* nudge timestamp for cooldown. NEVER writes an outcome. Fail-silent → null.
|
|
100
|
+
*/
|
|
101
|
+
evaluate(sessionId: string, projectPath: string, storage: SQLiteStorage | null, nowMs?: number): string | null;
|
|
102
|
+
/** Clear per-session state. Called by StopHandler.clearSession path is NOT
|
|
103
|
+
* used (we need the flag to survive into the next prompt); exposed for tests
|
|
104
|
+
* and for symmetry with other per-session caches. */
|
|
105
|
+
clearSession(sessionId: string, projectPath: string): void;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=outcome-nudge.d.ts.map
|