@winspan/claude-forge 8.54.4 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPMENT.md +649 -33
- package/README.md +154 -16
- package/dist/catalogs/agents.json +72 -0
- package/dist/catalogs/skills.json +194 -0
- package/dist/claudemd/claudemd-generator.d.ts +45 -45
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +128 -449
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/index.d.ts +14 -4
- package/dist/claudemd/index.d.ts.map +1 -1
- package/dist/claudemd/index.js +15 -4
- package/dist/claudemd/index.js.map +1 -1
- package/dist/claudemd/resume-manager.d.ts.map +1 -1
- package/dist/claudemd/resume-manager.js +37 -9
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/templates/swarm-protocol.md +35 -186
- package/dist/claudemd/violations-manager.d.ts +40 -0
- package/dist/claudemd/violations-manager.d.ts.map +1 -0
- package/dist/claudemd/violations-manager.js +106 -0
- package/dist/claudemd/violations-manager.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +15 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +177 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +18 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +160 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/bypass.d.ts +18 -0
- package/dist/cli/commands/bypass.d.ts.map +1 -0
- package/dist/cli/commands/bypass.js +87 -0
- package/dist/cli/commands/bypass.js.map +1 -0
- package/dist/cli/commands/claudemd.d.ts +60 -0
- package/dist/cli/commands/claudemd.d.ts.map +1 -1
- package/dist/cli/commands/claudemd.js +174 -37
- package/dist/cli/commands/claudemd.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +94 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +39 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +167 -20
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/decisions.d.ts +129 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +669 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +124 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/entropy.d.ts +35 -0
- package/dist/cli/commands/entropy.d.ts.map +1 -0
- package/dist/cli/commands/entropy.js +121 -0
- package/dist/cli/commands/entropy.js.map +1 -0
- package/dist/cli/commands/executions.d.ts +1 -0
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +10 -1
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/fix.d.ts +31 -0
- package/dist/cli/commands/fix.d.ts.map +1 -0
- package/dist/cli/commands/fix.js +108 -0
- package/dist/cli/commands/fix.js.map +1 -0
- package/dist/cli/commands/governance.d.ts +21 -0
- package/dist/cli/commands/governance.d.ts.map +1 -0
- package/dist/cli/commands/governance.js +60 -0
- package/dist/cli/commands/governance.js.map +1 -0
- package/dist/cli/commands/init.d.ts +27 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +158 -146
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +50 -0
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
- package/dist/cli/commands/insights-goal-check.js +318 -0
- package/dist/cli/commands/insights-goal-check.js.map +1 -0
- package/dist/cli/commands/insights.d.ts +15 -0
- package/dist/cli/commands/insights.d.ts.map +1 -0
- package/dist/cli/commands/insights.js +127 -0
- package/dist/cli/commands/insights.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +66 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +897 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +0 -12
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +11 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/menu.d.ts.map +1 -1
- package/dist/cli/commands/menu.js +10 -184
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/project.d.ts +98 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +382 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +14 -128
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +40 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +49 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +3 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +17 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/trace.d.ts.map +1 -1
- package/dist/cli/commands/trace.js +4 -9
- package/dist/cli/commands/trace.js.map +1 -1
- package/dist/cli/commands/violations.d.ts +14 -0
- package/dist/cli/commands/violations.d.ts.map +1 -0
- package/dist/cli/commands/violations.js +43 -0
- package/dist/cli/commands/violations.js.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/hook-manager.d.ts +1 -1
- package/dist/cli/init/hook-manager.d.ts.map +1 -1
- package/dist/cli/init/hook-manager.js +6 -0
- package/dist/cli/init/hook-manager.js.map +1 -1
- package/dist/cli/utils/resolve-session.d.ts +32 -0
- package/dist/cli/utils/resolve-session.d.ts.map +1 -0
- package/dist/cli/utils/resolve-session.js +39 -0
- package/dist/cli/utils/resolve-session.js.map +1 -0
- package/dist/core/config.d.ts +4 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +11 -23
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +14 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +20 -13
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts +151 -0
- package/dist/core/diagnostics/checks.d.ts.map +1 -0
- package/dist/core/diagnostics/checks.js +765 -0
- package/dist/core/diagnostics/checks.js.map +1 -0
- package/dist/core/diagnostics/daemon-status.d.ts +77 -0
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
- package/dist/core/diagnostics/daemon-status.js +113 -0
- package/dist/core/diagnostics/daemon-status.js.map +1 -0
- package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
- package/dist/core/diagnostics/entropy-checks.js +395 -0
- package/dist/core/diagnostics/entropy-checks.js.map +1 -0
- package/dist/core/diagnostics/fix-runner.d.ts +54 -0
- package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/fix-runner.js +90 -0
- package/dist/core/diagnostics/fix-runner.js.map +1 -0
- package/dist/core/diagnostics/knip-runner.d.ts +49 -0
- package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/knip-runner.js +100 -0
- package/dist/core/diagnostics/knip-runner.js.map +1 -0
- package/dist/core/diagnostics/markers.d.ts +96 -0
- package/dist/core/diagnostics/markers.d.ts.map +1 -0
- package/dist/core/diagnostics/markers.js +153 -0
- package/dist/core/diagnostics/markers.js.map +1 -0
- package/dist/core/governance/global-inject.d.ts +60 -0
- package/dist/core/governance/global-inject.d.ts.map +1 -0
- package/dist/core/governance/global-inject.js +129 -0
- package/dist/core/governance/global-inject.js.map +1 -0
- package/dist/core/queue/index.d.ts +16 -3
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +14 -3
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +158 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +570 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
- package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
- package/dist/core/storage/codec/tool-input-codec.js +159 -0
- package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +362 -0
- package/dist/core/storage/decisions.d.ts.map +1 -0
- package/dist/core/storage/decisions.js +502 -0
- package/dist/core/storage/decisions.js.map +1 -0
- package/dist/core/storage/events.d.ts +112 -8
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +390 -39
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +131 -0
- package/dist/core/storage/feedback.d.ts.map +1 -0
- package/dist/core/storage/feedback.js +187 -0
- package/dist/core/storage/feedback.js.map +1 -0
- package/dist/core/storage/forge-config.d.ts +40 -0
- package/dist/core/storage/forge-config.d.ts.map +1 -0
- package/dist/core/storage/forge-config.js +65 -0
- package/dist/core/storage/forge-config.js.map +1 -0
- package/dist/core/storage/injections.d.ts +28 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +62 -5
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +106 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -0
- package/dist/core/storage/knowledge.js +202 -0
- package/dist/core/storage/knowledge.js.map +1 -0
- package/dist/core/storage/maintenance.d.ts +36 -9
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +56 -24
- package/dist/core/storage/maintenance.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +117 -0
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
- package/dist/core/storage/pipeline-rollup.js +471 -0
- package/dist/core/storage/pipeline-rollup.js.map +1 -0
- package/dist/core/storage/routing.d.ts +16 -3
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +39 -8
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +50 -7
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +302 -23
- package/dist/core/storage/sessions.d.ts +136 -0
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +351 -15
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +1 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +21 -6
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +253 -20
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +425 -16
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +474 -2
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +1213 -18
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +69 -0
- package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
- package/dist/core/storage/tool-intercepts.js +116 -0
- package/dist/core/storage/tool-intercepts.js.map +1 -0
- package/dist/core/storage/workflow-recommendations.d.ts +124 -0
- package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
- package/dist/core/storage/workflow-recommendations.js +274 -0
- package/dist/core/storage/workflow-recommendations.js.map +1 -0
- package/dist/core/types.d.ts +112 -17
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +12 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/backup.d.ts +81 -0
- package/dist/core/utils/backup.d.ts.map +1 -0
- package/dist/core/utils/backup.js +98 -0
- package/dist/core/utils/backup.js.map +1 -0
- package/dist/core/utils/binary-paths.d.ts +92 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -0
- package/dist/core/utils/binary-paths.js +166 -0
- package/dist/core/utils/binary-paths.js.map +1 -0
- package/dist/core/utils/bypass-token.d.ts +75 -0
- package/dist/core/utils/bypass-token.d.ts.map +1 -0
- package/dist/core/utils/bypass-token.js +133 -0
- package/dist/core/utils/bypass-token.js.map +1 -0
- package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
- package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
- package/dist/core/utils/cc-builtin-agents.js +29 -0
- package/dist/core/utils/cc-builtin-agents.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
- package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
- package/dist/core/utils/claude-cli-spawn.js +219 -0
- package/dist/core/utils/claude-cli-spawn.js.map +1 -0
- package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
- package/dist/core/utils/forge-resume-block.js +3 -2
- package/dist/core/utils/forge-resume-block.js.map +1 -1
- package/dist/core/utils/logger.d.ts +15 -3
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +20 -2
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +97 -0
- package/dist/core/utils/noise-prompt.d.ts.map +1 -0
- package/dist/core/utils/noise-prompt.js +127 -0
- package/dist/core/utils/noise-prompt.js.map +1 -0
- package/dist/core/utils/path.d.ts +0 -4
- package/dist/core/utils/path.d.ts.map +1 -1
- package/dist/core/utils/path.js +0 -7
- package/dist/core/utils/path.js.map +1 -1
- package/dist/core/utils/time.d.ts +41 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +114 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/agent-sync.d.ts +24 -0
- package/dist/daemon/agent-sync.d.ts.map +1 -0
- package/dist/daemon/agent-sync.js +114 -0
- package/dist/daemon/agent-sync.js.map +1 -0
- package/dist/daemon/config-store.d.ts +55 -0
- package/dist/daemon/config-store.d.ts.map +1 -0
- package/dist/daemon/config-store.js +137 -0
- package/dist/daemon/config-store.js.map +1 -0
- package/dist/daemon/event-parser.d.ts +22 -0
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +49 -3
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
- package/dist/daemon/handlers/history-exporter.js +9 -8
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +261 -8
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
- package/dist/daemon/handlers/pre-tool-use.js +585 -0
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
- package/dist/daemon/handlers/stop.d.ts +35 -7
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +157 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +36 -14
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +135 -48
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/hook-sync.d.ts.map +1 -1
- package/dist/daemon/hook-sync.js +2 -1
- package/dist/daemon/hook-sync.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +471 -43
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/lifecycle.d.ts +48 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +98 -2
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/router.d.ts +4 -1
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +4 -2
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts +20 -0
- package/dist/daemon/rules/defaults.d.ts.map +1 -0
- package/dist/daemon/rules/defaults.js +692 -0
- package/dist/daemon/rules/defaults.js.map +1 -0
- package/dist/daemon/rules/registry.d.ts +47 -0
- package/dist/daemon/rules/registry.d.ts.map +1 -0
- package/dist/daemon/rules/registry.js +84 -0
- package/dist/daemon/rules/registry.js.map +1 -0
- package/dist/daemon/rules/types.d.ts +170 -0
- package/dist/daemon/rules/types.d.ts.map +1 -0
- package/dist/daemon/rules/types.js +15 -0
- package/dist/daemon/rules/types.js.map +1 -0
- package/dist/daemon/rules/whitelist.d.ts +101 -0
- package/dist/daemon/rules/whitelist.d.ts.map +1 -0
- package/dist/daemon/rules/whitelist.js +210 -0
- package/dist/daemon/rules/whitelist.js.map +1 -0
- package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
- package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
- package/dist/daemon/rules/workflow-defaults.js +521 -0
- package/dist/daemon/rules/workflow-defaults.js.map +1 -0
- package/dist/daemon/server.d.ts +11 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +7 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/context-injector.d.ts +34 -0
- package/dist/daemon/services/context-injector.d.ts.map +1 -0
- package/dist/daemon/services/context-injector.js +61 -0
- package/dist/daemon/services/context-injector.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +203 -0
- package/dist/daemon/services/decision-hint.d.ts.map +1 -0
- package/dist/daemon/services/decision-hint.js +487 -0
- package/dist/daemon/services/decision-hint.js.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.js +123 -0
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
- package/dist/daemon/services/experience-extractor.d.ts +67 -0
- package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
- package/dist/daemon/services/experience-extractor.js +323 -0
- package/dist/daemon/services/experience-extractor.js.map +1 -0
- package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
- package/dist/daemon/services/feedback-aggregator.js +455 -0
- package/dist/daemon/services/feedback-aggregator.js.map +1 -0
- package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
- package/dist/daemon/services/heartbeat-writer.js +111 -0
- package/dist/daemon/services/heartbeat-writer.js.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.js +94 -0
- package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
- package/dist/daemon/services/idle-task-budget.d.ts +50 -0
- package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
- package/dist/daemon/services/idle-task-budget.js +72 -0
- package/dist/daemon/services/idle-task-budget.js.map +1 -0
- package/dist/daemon/services/intercept-revive.d.ts +60 -0
- package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
- package/dist/daemon/services/intercept-revive.js +86 -0
- package/dist/daemon/services/intercept-revive.js.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.js +152 -0
- package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
- package/dist/daemon/services/kb-injector.d.ts +57 -0
- package/dist/daemon/services/kb-injector.d.ts.map +1 -0
- package/dist/daemon/services/kb-injector.js +140 -0
- package/dist/daemon/services/kb-injector.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
- package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +214 -0
- package/dist/daemon/services/outcome-classification-service.js.map +1 -0
- package/dist/daemon/services/outcome-classifier.d.ts +136 -0
- package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classifier.js +178 -0
- package/dist/daemon/services/outcome-classifier.js.map +1 -0
- package/dist/daemon/services/outcome-nudge.d.ts +107 -0
- package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
- package/dist/daemon/services/outcome-nudge.js +242 -0
- package/dist/daemon/services/outcome-nudge.js.map +1 -0
- package/dist/daemon/services/spec-approval.d.ts +127 -0
- package/dist/daemon/services/spec-approval.d.ts.map +1 -0
- package/dist/daemon/services/spec-approval.js +216 -0
- package/dist/daemon/services/spec-approval.js.map +1 -0
- package/dist/daemon/services/spec-gate.d.ts +54 -0
- package/dist/daemon/services/spec-gate.d.ts.map +1 -0
- package/dist/daemon/services/spec-gate.js +113 -0
- package/dist/daemon/services/spec-gate.js.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.js +202 -0
- package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
- package/dist/daemon/services/task-segmenter.d.ts +219 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +481 -17
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/services/violation-reporter.d.ts +130 -0
- package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
- package/dist/daemon/services/violation-reporter.js +339 -0
- package/dist/daemon/services/violation-reporter.js.map +1 -0
- package/dist/daemon/skill-sync.d.ts +7 -2
- package/dist/daemon/skill-sync.d.ts.map +1 -1
- package/dist/daemon/skill-sync.js +114 -9
- package/dist/daemon/skill-sync.js.map +1 -1
- package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
- package/dist/daemon/templates/agents/coder.md +105 -0
- package/dist/daemon/templates/agents/decision-maker.md +460 -0
- package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
- package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
- package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
- package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
- package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
- package/dist/daemon/templates/agents/patch-applier.md +144 -0
- package/dist/daemon/templates/agents/planner.md +165 -0
- package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
- package/dist/daemon/templates/agents/skill-distiller.md +113 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
- package/dist/daemon/templates/agents/verify-agent.md +136 -0
- package/dist/daemon/utils/inject-block.d.ts +39 -0
- package/dist/daemon/utils/inject-block.d.ts.map +1 -0
- package/dist/daemon/utils/inject-block.js +25 -0
- package/dist/daemon/utils/inject-block.js.map +1 -0
- package/dist/hooks/hook-lib.sh +8 -0
- package/dist/hooks/notification.sh +19 -8
- package/dist/hooks/post-tool-use.sh +41 -23
- package/dist/hooks/pre-tool-use.sh +54 -23
- package/dist/hooks/session-start.sh +68 -0
- package/dist/hooks/stop.sh +24 -10
- package/dist/hooks/user-prompt-submit.sh +37 -21
- package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
- package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/go-adapter.js +294 -0
- package/dist/knowledge/adapters/go-adapter.js.map +1 -0
- package/dist/knowledge/adapters/index.d.ts +41 -0
- package/dist/knowledge/adapters/index.d.ts.map +1 -0
- package/dist/knowledge/adapters/index.js +71 -0
- package/dist/knowledge/adapters/index.js.map +1 -0
- package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
- package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/java-adapter.js +260 -0
- package/dist/knowledge/adapters/java-adapter.js.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
- package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
- package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
- package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
- package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
- package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/python-adapter.js +358 -0
- package/dist/knowledge/adapters/python-adapter.js.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.js +329 -0
- package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
- package/dist/knowledge/adapters/types.d.ts +99 -0
- package/dist/knowledge/adapters/types.d.ts.map +1 -0
- package/dist/knowledge/adapters/types.js +17 -0
- package/dist/knowledge/adapters/types.js.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.js +171 -0
- package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
- package/dist/knowledge/audit-applier.d.ts +70 -0
- package/dist/knowledge/audit-applier.d.ts.map +1 -0
- package/dist/knowledge/audit-applier.js +251 -0
- package/dist/knowledge/audit-applier.js.map +1 -0
- package/dist/knowledge/builder.d.ts +261 -0
- package/dist/knowledge/builder.d.ts.map +1 -0
- package/dist/knowledge/builder.js +937 -0
- package/dist/knowledge/builder.js.map +1 -0
- package/dist/knowledge/cli-provider.d.ts +151 -0
- package/dist/knowledge/cli-provider.d.ts.map +1 -0
- package/dist/knowledge/cli-provider.js +313 -0
- package/dist/knowledge/cli-provider.js.map +1 -0
- package/dist/knowledge/constants.d.ts +73 -0
- package/dist/knowledge/constants.d.ts.map +1 -0
- package/dist/knowledge/constants.js +93 -0
- package/dist/knowledge/constants.js.map +1 -0
- package/dist/knowledge/cross-module.d.ts +139 -0
- package/dist/knowledge/cross-module.d.ts.map +1 -0
- package/dist/knowledge/cross-module.js +370 -0
- package/dist/knowledge/cross-module.js.map +1 -0
- package/dist/knowledge/git-hooks.d.ts +67 -0
- package/dist/knowledge/git-hooks.d.ts.map +1 -0
- package/dist/knowledge/git-hooks.js +258 -0
- package/dist/knowledge/git-hooks.js.map +1 -0
- package/dist/knowledge/module-hash.d.ts +88 -0
- package/dist/knowledge/module-hash.d.ts.map +1 -0
- package/dist/knowledge/module-hash.js +162 -0
- package/dist/knowledge/module-hash.js.map +1 -0
- package/dist/knowledge/project-detector.d.ts +101 -0
- package/dist/knowledge/project-detector.d.ts.map +1 -0
- package/dist/knowledge/project-detector.js +223 -0
- package/dist/knowledge/project-detector.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +228 -0
- package/dist/knowledge/prompt.d.ts.map +1 -0
- package/dist/knowledge/prompt.js +404 -0
- package/dist/knowledge/prompt.js.map +1 -0
- package/dist/knowledge/query.d.ts +105 -0
- package/dist/knowledge/query.d.ts.map +1 -0
- package/dist/knowledge/query.js +341 -0
- package/dist/knowledge/query.js.map +1 -0
- package/dist/knowledge/repo-map.d.ts +91 -0
- package/dist/knowledge/repo-map.d.ts.map +1 -0
- package/dist/knowledge/repo-map.js +408 -0
- package/dist/knowledge/repo-map.js.map +1 -0
- package/dist/knowledge/tools/index.d.ts +14 -0
- package/dist/knowledge/tools/index.d.ts.map +1 -0
- package/dist/knowledge/tools/index.js +11 -0
- package/dist/knowledge/tools/index.js.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.js +101 -0
- package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
- package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
- package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-query.js +104 -0
- package/dist/knowledge/tools/knowledge-query.js.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.js +82 -0
- package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
- package/dist/knowledge/types.d.ts +269 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +10 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/knowledge/validator.d.ts +90 -0
- package/dist/knowledge/validator.d.ts.map +1 -0
- package/dist/knowledge/validator.js +288 -0
- package/dist/knowledge/validator.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +222 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/builtin-skills.d.ts +35 -0
- package/dist/skills/builtin-skills.d.ts.map +1 -0
- package/dist/skills/builtin-skills.js +68 -0
- package/dist/skills/builtin-skills.js.map +1 -0
- package/dist/skills/distill/attribution.d.ts +59 -0
- package/dist/skills/distill/attribution.d.ts.map +1 -0
- package/dist/skills/distill/attribution.js +101 -0
- package/dist/skills/distill/attribution.js.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.js +115 -0
- package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
- package/dist/skills/distill/distiller.d.ts +161 -0
- package/dist/skills/distill/distiller.d.ts.map +1 -0
- package/dist/skills/distill/distiller.js +461 -0
- package/dist/skills/distill/distiller.js.map +1 -0
- package/dist/skills/distill/index.d.ts +223 -0
- package/dist/skills/distill/index.d.ts.map +1 -0
- package/dist/skills/distill/index.js +466 -0
- package/dist/skills/distill/index.js.map +1 -0
- package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
- package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
- package/dist/skills/distill/project-anchor-guard.js +334 -0
- package/dist/skills/distill/project-anchor-guard.js.map +1 -0
- package/dist/skills/distill/topic-deduper.d.ts +77 -0
- package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
- package/dist/skills/distill/topic-deduper.js +119 -0
- package/dist/skills/distill/topic-deduper.js.map +1 -0
- package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
- package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
- package/dist/skills/distill/upstream-fetcher.js +202 -0
- package/dist/skills/distill/upstream-fetcher.js.map +1 -0
- package/dist/skills/distilled/distilled-api-design.md +491 -0
- package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
- package/dist/skills/distilled/distilled-creator.md +178 -0
- package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
- package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
- package/dist/skills/distilled/distilled-executing-plans.md +113 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
- package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
- package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
- package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
- package/dist/skills/keyword-score.d.ts +29 -0
- package/dist/skills/keyword-score.d.ts.map +1 -0
- package/dist/skills/keyword-score.js +54 -0
- package/dist/skills/keyword-score.js.map +1 -0
- package/dist/skills/registry.d.ts +64 -20
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +102 -105
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +14 -14
- package/dist/skills/tools/skill-invoke.d.ts +1 -1
- package/dist/skills/tools/skill-invoke.js +1 -1
- package/dist/web/routes/agent-content.d.ts +30 -0
- package/dist/web/routes/agent-content.d.ts.map +1 -0
- package/dist/web/routes/agent-content.js +139 -0
- package/dist/web/routes/agent-content.js.map +1 -0
- package/dist/web/routes/decisions.d.ts +15 -0
- package/dist/web/routes/decisions.d.ts.map +1 -0
- package/dist/web/routes/decisions.js +181 -0
- package/dist/web/routes/decisions.js.map +1 -0
- package/dist/web/routes/diagnostics.d.ts +61 -0
- package/dist/web/routes/diagnostics.d.ts.map +1 -0
- package/dist/web/routes/diagnostics.js +203 -0
- package/dist/web/routes/diagnostics.js.map +1 -0
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +24 -0
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/health.d.ts +33 -0
- package/dist/web/routes/health.d.ts.map +1 -0
- package/dist/web/routes/health.js +37 -0
- package/dist/web/routes/health.js.map +1 -0
- package/dist/web/routes/insights.d.ts +0 -5
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +783 -2
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +16 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/knowledge.js +661 -0
- package/dist/web/routes/knowledge.js.map +1 -0
- package/dist/web/routes/patch.d.ts +60 -1
- package/dist/web/routes/patch.d.ts.map +1 -1
- package/dist/web/routes/patch.js +170 -64
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +37 -0
- package/dist/web/routes/pipeline.d.ts.map +1 -0
- package/dist/web/routes/pipeline.js +149 -0
- package/dist/web/routes/pipeline.js.map +1 -0
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +6 -1
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +9 -1
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-content.d.ts +30 -0
- package/dist/web/routes/skill-content.d.ts.map +1 -0
- package/dist/web/routes/skill-content.js +117 -0
- package/dist/web/routes/skill-content.js.map +1 -0
- package/dist/web/routes/skills-distill.d.ts +29 -0
- package/dist/web/routes/skills-distill.d.ts.map +1 -0
- package/dist/web/routes/skills-distill.js +552 -0
- package/dist/web/routes/skills-distill.js.map +1 -0
- package/dist/web/routes/skills.js +7 -7
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +102 -0
- package/dist/web/routes/task-timeline.d.ts.map +1 -0
- package/dist/web/routes/task-timeline.js +274 -0
- package/dist/web/routes/task-timeline.js.map +1 -0
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +355 -8
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/trace.d.ts.map +1 -1
- package/dist/web/routes/trace.js +3 -2
- package/dist/web/routes/trace.js.map +1 -1
- package/dist/web/routes/types.d.ts +0 -4
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +1 -1
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/routes/violations.d.ts +14 -0
- package/dist/web/routes/violations.d.ts.map +1 -0
- package/dist/web/routes/violations.js +111 -0
- package/dist/web/routes/violations.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +79 -19
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/build-manager.d.ts +72 -0
- package/dist/web/services/build-manager.d.ts.map +1 -0
- package/dist/web/services/build-manager.js +189 -0
- package/dist/web/services/build-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +125 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -0
- package/dist/web/services/distill-manager.js +308 -0
- package/dist/web/services/distill-manager.js.map +1 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
- package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
- package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
- package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
- package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
- package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
- package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
- package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
- package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
- package/dist/web/static/index.html +12 -8
- package/package.json +14 -3
- package/dist/core/ai/provider.d.ts +0 -63
- package/dist/core/ai/provider.d.ts.map +0 -1
- package/dist/core/ai/provider.js +0 -241
- package/dist/core/ai/provider.js.map +0 -1
- package/dist/core/ai/types.d.ts +0 -43
- package/dist/core/ai/types.d.ts.map +0 -1
- package/dist/core/ai/types.js +0 -5
- package/dist/core/ai/types.js.map +0 -1
- package/dist/core/storage/token-usage.d.ts +0 -36
- package/dist/core/storage/token-usage.d.ts.map +0 -1
- package/dist/core/storage/token-usage.js +0 -59
- package/dist/core/storage/token-usage.js.map +0 -1
- package/dist/core/utils/token-tracker.d.ts +0 -39
- package/dist/core/utils/token-tracker.d.ts.map +0 -1
- package/dist/core/utils/token-tracker.js +0 -69
- package/dist/core/utils/token-tracker.js.map +0 -1
- package/dist/skills/index.d.ts +0 -3
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -3
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/matcher.d.ts +0 -26
- package/dist/skills/matcher.d.ts.map +0 -1
- package/dist/skills/matcher.js +0 -113
- package/dist/skills/matcher.js.map +0 -1
- package/dist/skills/official/code-simplifier.md +0 -52
- package/dist/skills/official/find-skills.md +0 -142
- package/dist/skills/official/official-api-design.md +0 -30
- package/dist/skills/official/official-architecture-decision.md +0 -41
- package/dist/skills/official/official-bmad.md +0 -118
- package/dist/skills/official/official-db-schema-design.md +0 -34
- package/dist/skills/official/official-debug.md +0 -25
- package/dist/skills/official/official-doc-driven.md +0 -31
- package/dist/skills/official/official-harness-engineering.md +0 -108
- package/dist/skills/official/official-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/task-title-BhOcemuR.js +0 -2
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
- package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
- package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
- package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
- package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KbInjector — queries the project knowledge base for a prompt and renders
|
|
3
|
+
* the additionalContext block.
|
|
4
|
+
*
|
|
5
|
+
* Extracted from `UserPromptHandler` (D-3 step 3). Single responsibility:
|
|
6
|
+
* 1. Probe `.forge-knowledge/` presence (cheap).
|
|
7
|
+
* 2. Run `queryKnowledge` (augmented with optional intent keywords).
|
|
8
|
+
* 3. Apply score threshold + return `{ block, hits }`.
|
|
9
|
+
*
|
|
10
|
+
* Caching: per-(session_id, prompt[:200]) LRU+TTL to dedupe consecutive
|
|
11
|
+
* Enter re-fires within 5 minutes. Bounded by 500 entries.
|
|
12
|
+
*
|
|
13
|
+
* The cache key includes `session_id` so different sessions never collide,
|
|
14
|
+
* but `kbQueryCache` is intentionally NOT cleared at Stop time — D-1 in the
|
|
15
|
+
* refactor spec resolved this: the 5-min TTL + 500-entry LRU bound is
|
|
16
|
+
* sufficient (worst case ~500KB held briefly), and enumerating session-
|
|
17
|
+
* prefixed keys would require a second index map.
|
|
18
|
+
*/
|
|
19
|
+
// Namespace import (not named) so test code can `vi.spyOn(knowledgeQuery, ...)`
|
|
20
|
+
// and have the service see the stub — named imports bind eagerly under ESM.
|
|
21
|
+
import * as knowledgeQuery from '../../knowledge/query.js';
|
|
22
|
+
import { LRUCache } from '../../core/utils/lru-cache.js';
|
|
23
|
+
import { createHash } from 'node:crypto';
|
|
24
|
+
import { logger } from '../../core/utils/logger.js';
|
|
25
|
+
import { truncateString } from '../../core/utils/format.js';
|
|
26
|
+
import { wrapInjectBlock } from '../utils/inject-block.js';
|
|
27
|
+
export class KbInjector {
|
|
28
|
+
storage;
|
|
29
|
+
// ── KB injection (MVP1) ──────────────────────────────────────────────────
|
|
30
|
+
// Score threshold below which we don't inject. History:
|
|
31
|
+
// spec §4.1 estimated 30 → too strict (ASCII prompts maxed at ~30)
|
|
32
|
+
// 2026-05-22 calibration → 10 (CJK still dead because tokenize 无分词)
|
|
33
|
+
// 2026-05-22 KPI fix → 5, after CJK n-gram tokenize landed
|
|
34
|
+
// (n-gram tokens lower per-hit score; real CJK technical prompt
|
|
35
|
+
// "如何修复 daemon socket bug" hits modules/daemon.md @ score 7).
|
|
36
|
+
// Revisit when feedback-aggregator shows real score distribution.
|
|
37
|
+
static KB_SCORE_THRESHOLD = 5;
|
|
38
|
+
/** Cap on KB pages injected per prompt to avoid context bloat. */
|
|
39
|
+
static KB_MAX_RESULTS = 2;
|
|
40
|
+
/** Per-page content truncation (chars) — keeps the additionalContext modest. */
|
|
41
|
+
static KB_CONTENT_TRUNCATE = 800;
|
|
42
|
+
/** LRU+TTL cache TTL for de-duping Enter re-fires of the same prompt. */
|
|
43
|
+
static KB_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
44
|
+
/** Cache capacity (entries). */
|
|
45
|
+
static KB_CACHE_MAX = 500;
|
|
46
|
+
kbQueryCache = new LRUCache(KbInjector.KB_CACHE_MAX);
|
|
47
|
+
constructor(storage = null) {
|
|
48
|
+
this.storage = storage;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Query the KB and (if any qualifying hits) return a formatted block ready
|
|
52
|
+
* to push onto `additionalContext`. Always fail-silent — KB failures must
|
|
53
|
+
* not break the prompt path.
|
|
54
|
+
*
|
|
55
|
+
* Returns `null` block when there are zero qualifying hits.
|
|
56
|
+
*/
|
|
57
|
+
async inject(event, prompt, extraKeywords = []) {
|
|
58
|
+
const hits = await this.queryKbForPrompt(event.session_id, event.project_path, prompt, extraKeywords);
|
|
59
|
+
if (hits.length === 0)
|
|
60
|
+
return { block: null, hits: [] };
|
|
61
|
+
const block = formatKbBlock(hits, KbInjector.KB_CONTENT_TRUNCATE);
|
|
62
|
+
return { block, hits };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Query the project knowledge base, returning only hits at or above the
|
|
66
|
+
* MVP1 score threshold. Always fail-silent — KB failures must not break
|
|
67
|
+
* the UserPrompt pipeline (resume / convention / skill remain unaffected).
|
|
68
|
+
*
|
|
69
|
+
* Cache key is `${session_id}:${sha1(prompt[:200])}` with a 5-minute TTL.
|
|
70
|
+
* This dedupes consecutive Enter re-fires of the same prompt without
|
|
71
|
+
* leaking memory across sessions.
|
|
72
|
+
*/
|
|
73
|
+
async queryKbForPrompt(sessionId, projectPath, prompt, extraKeywords) {
|
|
74
|
+
try {
|
|
75
|
+
if (!knowledgeQuery.isKnowledgeBuilt(projectPath))
|
|
76
|
+
return [];
|
|
77
|
+
const cacheKey = makeKbCacheKey(sessionId, prompt);
|
|
78
|
+
const now = Date.now();
|
|
79
|
+
const cached = this.kbQueryCache.get(cacheKey);
|
|
80
|
+
if (cached && cached.expiresAt > now) {
|
|
81
|
+
logger.debug(`[KbInjector] cache hit (${cached.hits.length} hits)`);
|
|
82
|
+
return cached.hits;
|
|
83
|
+
}
|
|
84
|
+
const augmentedQuery = extraKeywords.length > 0
|
|
85
|
+
? `${prompt} ${extraKeywords.join(' ')}`
|
|
86
|
+
: prompt;
|
|
87
|
+
const result = await knowledgeQuery.queryKnowledge(augmentedQuery, {
|
|
88
|
+
projectRoot: projectPath,
|
|
89
|
+
maxResults: KbInjector.KB_MAX_RESULTS,
|
|
90
|
+
// Skip repo-map symbol hits in the inject path: pages already carry
|
|
91
|
+
// file:line refs and symbol noise would just lengthen the prompt.
|
|
92
|
+
includeRepoMap: false,
|
|
93
|
+
storage: this.storage ?? undefined,
|
|
94
|
+
});
|
|
95
|
+
const qualifying = result.pages.filter((h) => h.score >= KbInjector.KB_SCORE_THRESHOLD);
|
|
96
|
+
this.kbQueryCache.set(cacheKey, {
|
|
97
|
+
hits: qualifying,
|
|
98
|
+
expiresAt: now + KbInjector.KB_CACHE_TTL_MS,
|
|
99
|
+
});
|
|
100
|
+
return qualifying;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
logger.warn(`[KbInjector] KB query failed (silently skipped): ${err}`);
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// ── Module-private helpers ──────────────────────────────────────────────────
|
|
109
|
+
/**
|
|
110
|
+
* Build a stable cache key from `sessionId` + the first 200 chars of `prompt`
|
|
111
|
+
* (hashed to keep the key small and avoid logging concerns).
|
|
112
|
+
*/
|
|
113
|
+
function makeKbCacheKey(sessionId, prompt) {
|
|
114
|
+
const hash = createHash('sha1').update(prompt.slice(0, 200)).digest('hex');
|
|
115
|
+
return `${sessionId}:${hash}`;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Render KB query hits into the additionalContext block (spec §4.1).
|
|
119
|
+
* Layout mirrors CLAUDE.md:194-206 — banners, per-page header with score &
|
|
120
|
+
* matched keywords, truncated content, then a "关键文件" list of refs.
|
|
121
|
+
*/
|
|
122
|
+
function formatKbBlock(hits, contentTruncate) {
|
|
123
|
+
const sections = hits.map((hit) => {
|
|
124
|
+
const matched = hit.matched_keywords.slice(0, 5).join(', ');
|
|
125
|
+
const header = `### ${hit.page.name}(score ${hit.score}${matched ? `, matched: ${matched}` : ''})`;
|
|
126
|
+
const body = truncateString(hit.page.content, contentTruncate);
|
|
127
|
+
const refLines = hit.page.refs.slice(0, 4).map((r) => {
|
|
128
|
+
const sym = r.symbol ? ` — ${r.symbol}` : '';
|
|
129
|
+
return `- ${r.file}:${r.lineStart}${sym}`;
|
|
130
|
+
});
|
|
131
|
+
const refs = refLines.length > 0 ? `\n关键文件:\n${refLines.join('\n')}` : '';
|
|
132
|
+
return `${header}\n\n${body}${refs}`;
|
|
133
|
+
});
|
|
134
|
+
return wrapInjectBlock({
|
|
135
|
+
openLine: '━━━ 项目背景(来自 .forge-knowledge/)━━━',
|
|
136
|
+
// Blank lines on both sides preserve the pre-refactor visual padding.
|
|
137
|
+
body: `\n${sections.join('\n\n')}\n`,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=kb-injector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-injector.js","sourceRoot":"","sources":["../../../src/daemon/services/kb-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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 type { StopEvent } from '../../core/types.js';
|
|
17
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
18
|
+
import type { TaskSegmenter } from './task-segmenter.js';
|
|
19
|
+
export declare class OutcomeClassificationService {
|
|
20
|
+
/**
|
|
21
|
+
* Classify the session's outcome at Stop time and persist to both
|
|
22
|
+
* `sessions` and the most recent task row. Also rolls up Phase 2 metrics
|
|
23
|
+
* (intercept_count / kb_inject_count / skill_match_count).
|
|
24
|
+
*
|
|
25
|
+
* Fire-and-forget; never throws (debug-logs on error).
|
|
26
|
+
*/
|
|
27
|
+
classifySession(event: StopEvent, storage: SQLiteStorage, taskSegmenter: TaskSegmenter | null): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Backfill outcome on all unclassified completed/abandoned tasks for the
|
|
30
|
+
* session. Without this, TaskSegmenter-completed tasks (the ones closed by a
|
|
31
|
+
* new-prompt switch) stay outcome=NULL forever.
|
|
32
|
+
*
|
|
33
|
+
* spec 1100 v2: classification is pure edit-intent — NO git subprocess per
|
|
34
|
+
* task. Gated to MAX_IDLE_TASKS_PER_RUN to bound the per-task edit-intent
|
|
35
|
+
* queries. Fire-and-forget; never throws.
|
|
36
|
+
*/
|
|
37
|
+
classifyIdleTasks(event: StopEvent, storage: SQLiteStorage): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Count a single task's Edit/Write intent events. Best-effort: 0 on error so
|
|
40
|
+
* classification never throws because of a storage hiccup.
|
|
41
|
+
*/
|
|
42
|
+
private safeTaskEditIntent;
|
|
43
|
+
/**
|
|
44
|
+
* Session-level edit intent = COUNT of Edit/Write events across the session
|
|
45
|
+
* (tool_name only; gzip-safe). Best-effort, 0 on error.
|
|
46
|
+
*/
|
|
47
|
+
private safeSessionEditIntent;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=outcome-classification-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-classification-service.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/outcome-classification-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAczD,qBAAa,4BAA4B;IACvC;;;;;;OAMG;IACG,eAAe,CACnB,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,aAAa,EACtB,aAAa,EAAE,aAAa,GAAG,IAAI,GAClC,OAAO,CAAC,IAAI,CAAC;IAwHhB;;;;;;;;OAQG;IACG,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA8ChF;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;CAQ9B"}
|
|
@@ -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 './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"}
|