@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 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-nudge.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/outcome-nudge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,uEAAuE;AACvE,eAAO,MAAM,2BAA2B,4BAA4B,CAAC;AAErE,kFAAkF;AAClF,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD,+DAA+D;AAC/D,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAE3E,kEAAkE;AAClE,eAAO,MAAM,sCAAsC,QAAQ,CAAC;AAQ5D;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAWnF;AAED;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAazF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EAAE,EACb,MAAM,EAAE,YAAY,GAAG,WAAW,GACjC,MAAM,CA4BR;AAaD;;;;GAIG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IAEzD,OAAO,CAAC,GAAG;IAIX;;;;;;OAMG;IACH,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GAAG,IAAI,GAC5B,IAAI;IAkBP;;;;;;;;;;;OAWG;IACH,QAAQ,CACN,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,KAAK,GAAE,MAAmB,GACzB,MAAM,GAAG,IAAI;IAkEhB;;yDAEqD;IACrD,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;CAG3D"}
|
|
@@ -0,0 +1,242 @@
|
|
|
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 { logger } from '../../core/utils/logger.js';
|
|
46
|
+
/** forge_config key for the resolved-unfilled threshold (Option A). */
|
|
47
|
+
export const OUTCOME_NUDGE_THRESHOLD_KEY = 'outcome_nudge_threshold';
|
|
48
|
+
/** Default Option A threshold — nudge once 2 decisions are awaiting back-fill. */
|
|
49
|
+
export const DEFAULT_OUTCOME_NUDGE_THRESHOLD = 2;
|
|
50
|
+
/** forge_config key for the per-session cooldown (seconds). */
|
|
51
|
+
export const OUTCOME_NUDGE_COOLDOWN_KEY = 'outcome_nudge_cooldown_seconds';
|
|
52
|
+
/** Default cooldown — 24h between nudges for the same session. */
|
|
53
|
+
export const DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS = 86400;
|
|
54
|
+
/** Hard upper bound for the cooldown override (7 days). */
|
|
55
|
+
const MAX_OUTCOME_NUDGE_COOLDOWN_SECONDS = 7 * 86400;
|
|
56
|
+
/** Max ids to list inline in the nudge message (keeps it readable). */
|
|
57
|
+
const MAX_IDS_IN_MESSAGE = 8;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve the Option A threshold from forge_config, falling back to the
|
|
60
|
+
* default for missing / non-finite / < 1 values.
|
|
61
|
+
*/
|
|
62
|
+
export function resolveOutcomeNudgeThreshold(storage) {
|
|
63
|
+
if (!storage)
|
|
64
|
+
return DEFAULT_OUTCOME_NUDGE_THRESHOLD;
|
|
65
|
+
try {
|
|
66
|
+
const raw = storage.readConfig(OUTCOME_NUDGE_THRESHOLD_KEY);
|
|
67
|
+
if (raw === undefined || raw === null)
|
|
68
|
+
return DEFAULT_OUTCOME_NUDGE_THRESHOLD;
|
|
69
|
+
const n = Number(raw);
|
|
70
|
+
if (Number.isFinite(n) && n >= 1)
|
|
71
|
+
return Math.floor(n);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// fail-silent
|
|
75
|
+
}
|
|
76
|
+
return DEFAULT_OUTCOME_NUDGE_THRESHOLD;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve the cooldown (seconds) from forge_config. Values <= 0 or above the
|
|
80
|
+
* hard bound fall back to the default.
|
|
81
|
+
*/
|
|
82
|
+
export function resolveOutcomeNudgeCooldownSeconds(storage) {
|
|
83
|
+
if (!storage)
|
|
84
|
+
return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
|
|
85
|
+
try {
|
|
86
|
+
const raw = storage.readConfig(OUTCOME_NUDGE_COOLDOWN_KEY);
|
|
87
|
+
if (raw === undefined || raw === null)
|
|
88
|
+
return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
|
|
89
|
+
const n = Number(raw);
|
|
90
|
+
if (!Number.isFinite(n))
|
|
91
|
+
return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
|
|
92
|
+
if (n <= 0)
|
|
93
|
+
return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
|
|
94
|
+
if (n > MAX_OUTCOME_NUDGE_COOLDOWN_SECONDS)
|
|
95
|
+
return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
|
|
96
|
+
return Math.floor(n);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return DEFAULT_OUTCOME_NUDGE_COOLDOWN_SECONDS;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Format the `[OUTCOME NUDGE]` systemMessage. Independent `[OUTCOME NUDGE]`
|
|
104
|
+
* prefix (parallel to `[DECISION HINT]`) so the two never visually merge when
|
|
105
|
+
* both appear in the same systemMessage (OQ4). Pure / exported for tests.
|
|
106
|
+
*
|
|
107
|
+
* `reason` distinguishes the trigger purely for the leading line; the body
|
|
108
|
+
* (id list + command) is identical either way.
|
|
109
|
+
*/
|
|
110
|
+
export function formatOutcomeNudge(ids, reason) {
|
|
111
|
+
const shown = ids.slice(0, MAX_IDS_IN_MESSAGE);
|
|
112
|
+
const extra = ids.length - shown.length;
|
|
113
|
+
const idList = shown.join(' ') + (extra > 0 ? ` (+${extra} more)` : '');
|
|
114
|
+
const lead = reason === 'completion'
|
|
115
|
+
? `刚完工 — 有 ${ids.length} 个已批准(resolved)的决策还没回填实施结果(outcome)。`
|
|
116
|
+
: `已攒到 ${ids.length} 个已批准(resolved)但未回填 outcome 的决策。`;
|
|
117
|
+
const lines = [
|
|
118
|
+
'[OUTCOME NUDGE]',
|
|
119
|
+
'',
|
|
120
|
+
lead,
|
|
121
|
+
`回填能让 decision-maker 的历史先例加权(成功加权/失败警示)不空转。请就近回填:`,
|
|
122
|
+
'',
|
|
123
|
+
...shown.map((id) => `cf decisions outcome ${id} --result success|failed|partial [--note ...]`),
|
|
124
|
+
];
|
|
125
|
+
if (extra > 0) {
|
|
126
|
+
lines.push(`# 还有 ${extra} 个:cf decisions outcome --list-pending 查看全部`);
|
|
127
|
+
}
|
|
128
|
+
lines.push('');
|
|
129
|
+
lines.push(`(仅提示,不阻断;outcome 永不自动推断——必须你/实施 agent 明确回填)`);
|
|
130
|
+
lines.push(`<!-- outcome-nudge: ${idList} -->`);
|
|
131
|
+
return lines.join('\n');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* OutcomeNudgeService — owns the cooldown / Stop-pending state and computes the
|
|
135
|
+
* nudge message. One instance lives on UserPromptHandler; StopHandler reaches
|
|
136
|
+
* it through the existing userPromptHandler reference to set the Stop flag.
|
|
137
|
+
*/
|
|
138
|
+
export class OutcomeNudgeService {
|
|
139
|
+
state = new Map();
|
|
140
|
+
key(sessionId, projectPath) {
|
|
141
|
+
return `${sessionId}:${projectPath}`;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Degraded Option B entry point. Called by StopHandler at completion. Sets an
|
|
145
|
+
* in-memory flag iff the session/project has resolved-unfilled decisions, so
|
|
146
|
+
* the NEXT UserPromptSubmit injects the nudge regardless of the threshold.
|
|
147
|
+
*
|
|
148
|
+
* Pure read of storage + flag set; NEVER writes an outcome. Fail-silent.
|
|
149
|
+
*/
|
|
150
|
+
markStopPending(sessionId, projectPath, storage) {
|
|
151
|
+
if (!storage || !sessionId)
|
|
152
|
+
return;
|
|
153
|
+
try {
|
|
154
|
+
const pending = storage.listResolvedUnfilledDecisions(sessionId, projectPath);
|
|
155
|
+
if (pending.length === 0)
|
|
156
|
+
return;
|
|
157
|
+
const k = this.key(sessionId, projectPath);
|
|
158
|
+
const s = this.state.get(k) ?? { lastNudgedMs: 0, stopPending: false };
|
|
159
|
+
s.stopPending = true;
|
|
160
|
+
this.state.set(k, s);
|
|
161
|
+
logger.debug(`[OutcomeNudge] Stop-pending flag set for ${sessionId} ` +
|
|
162
|
+
`(${pending.length} resolved-unfilled)`);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
logger.debug(`[OutcomeNudge] markStopPending failed (skipped): ${err}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* UserPromptSubmit entry point. Returns the `[OUTCOME NUDGE]` message to
|
|
170
|
+
* append to systemMessage, or null when no nudge is warranted.
|
|
171
|
+
*
|
|
172
|
+
* Fires when EITHER:
|
|
173
|
+
* - the Stop-pending flag is set (degraded Option B, completion timing), OR
|
|
174
|
+
* - resolved-unfilled count >= threshold (Option A backstop)
|
|
175
|
+
* AND the per-session cooldown has elapsed.
|
|
176
|
+
*
|
|
177
|
+
* Side effects: clears the Stop-pending flag (consumed once) and records the
|
|
178
|
+
* nudge timestamp for cooldown. NEVER writes an outcome. Fail-silent → null.
|
|
179
|
+
*/
|
|
180
|
+
evaluate(sessionId, projectPath, storage, nowMs = Date.now()) {
|
|
181
|
+
if (!storage || !sessionId)
|
|
182
|
+
return null;
|
|
183
|
+
try {
|
|
184
|
+
const k = this.key(sessionId, projectPath);
|
|
185
|
+
const s = this.state.get(k) ?? { lastNudgedMs: 0, stopPending: false };
|
|
186
|
+
const pending = storage.listResolvedUnfilledDecisions(sessionId, projectPath);
|
|
187
|
+
// Always clear a stale Stop flag when nothing is actually pending — keeps
|
|
188
|
+
// the flag from lingering if outcomes got filled out-of-band.
|
|
189
|
+
if (pending.length === 0) {
|
|
190
|
+
if (s.stopPending) {
|
|
191
|
+
s.stopPending = false;
|
|
192
|
+
this.state.set(k, s);
|
|
193
|
+
}
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
const threshold = resolveOutcomeNudgeThreshold(storage);
|
|
197
|
+
const reason = s.stopPending
|
|
198
|
+
? 'completion'
|
|
199
|
+
: pending.length >= threshold
|
|
200
|
+
? 'threshold'
|
|
201
|
+
: null;
|
|
202
|
+
if (reason === null)
|
|
203
|
+
return null;
|
|
204
|
+
// Cooldown gate (applies to BOTH paths — a Stop followed by an immediate
|
|
205
|
+
// prompt should not double-nudge). The Stop flag is consumed regardless,
|
|
206
|
+
// so a cooled-down completion still clears the flag (the threshold path
|
|
207
|
+
// will re-surface it later if the backlog persists).
|
|
208
|
+
const cooldownSeconds = resolveOutcomeNudgeCooldownSeconds(storage);
|
|
209
|
+
const elapsedMs = nowMs - s.lastNudgedMs;
|
|
210
|
+
const cooledDown = s.lastNudgedMs === 0 || elapsedMs >= cooldownSeconds * 1000;
|
|
211
|
+
if (!cooledDown) {
|
|
212
|
+
if (s.stopPending) {
|
|
213
|
+
s.stopPending = false; // consume — don't let it fire after cooldown stale
|
|
214
|
+
this.state.set(k, s);
|
|
215
|
+
}
|
|
216
|
+
logger.debug(`[OutcomeNudge] suppressed by cooldown (session=${sessionId}, ` +
|
|
217
|
+
`elapsed=${Math.round(elapsedMs / 1000)}s < ${cooldownSeconds}s)`);
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
const ids = pending.map((r) => r.id);
|
|
221
|
+
const message = formatOutcomeNudge(ids, reason);
|
|
222
|
+
// Record + consume.
|
|
223
|
+
s.lastNudgedMs = nowMs;
|
|
224
|
+
s.stopPending = false;
|
|
225
|
+
this.state.set(k, s);
|
|
226
|
+
logger.info(`[OutcomeNudge] emitted (reason=${reason}, count=${ids.length}, ` +
|
|
227
|
+
`session=${sessionId})`);
|
|
228
|
+
return message;
|
|
229
|
+
}
|
|
230
|
+
catch (err) {
|
|
231
|
+
logger.debug(`[OutcomeNudge] evaluate failed (skipped): ${err}`);
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/** Clear per-session state. Called by StopHandler.clearSession path is NOT
|
|
236
|
+
* used (we need the flag to survive into the next prompt); exposed for tests
|
|
237
|
+
* and for symmetry with other per-session caches. */
|
|
238
|
+
clearSession(sessionId, projectPath) {
|
|
239
|
+
this.state.delete(this.key(sessionId, projectPath));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=outcome-nudge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outcome-nudge.js","sourceRoot":"","sources":["../../../src/daemon/services/outcome-nudge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecApproval — v9.x Phase 2b approve-token verifier.
|
|
3
|
+
*
|
|
4
|
+
* Companion service to `SpecGenerator`. Called by `UserPromptHandler.step 2.7`
|
|
5
|
+
* when the user types `approve <token>` exactly. The handler:
|
|
6
|
+
* 1. Detects the 'approve <8-hex>' pattern
|
|
7
|
+
* 2. Asks `SpecApproval.verify(token, session_id)` for the outcome
|
|
8
|
+
* 3. Surfaces a systemMessage based on the outcome
|
|
9
|
+
* 4. Short-circuits if outcome === 'ok' (skips KB / Skill / workflow rec)
|
|
10
|
+
*
|
|
11
|
+
* Why a separate service: keeps the handler thin and makes the verifier
|
|
12
|
+
* trivially testable without spinning up the whole UserPromptHandler graph.
|
|
13
|
+
*
|
|
14
|
+
* P0 safety (doc-reviewer Sub-2 report): verify() MUST filter by session_id.
|
|
15
|
+
* A token leaked across sessions must NOT be approve-able. The underlying
|
|
16
|
+
* facade method `findSpecByTokenAndSession` enforces this.
|
|
17
|
+
*
|
|
18
|
+
* No 'modify' code path is implemented in Phase 2b (spec § 3.4 mentions it
|
|
19
|
+
* in the systemMessage hint but § 3.5 leaves it un-implemented). The
|
|
20
|
+
* handler-side messages have been adjusted to advertise only `approve` and
|
|
21
|
+
* `skip`. See changelog "modify path simplification" decision.
|
|
22
|
+
*/
|
|
23
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
24
|
+
import type { SpecLikeRow } from '../../core/storage/decisions.js';
|
|
25
|
+
import type { SpecApprovalOutcome, SpecApprovalResult, SpecApprovalRowLike } from '../../core/types.js';
|
|
26
|
+
/**
|
|
27
|
+
* Regex matching exactly `approve <8-hex>` with no surrounding text.
|
|
28
|
+
*
|
|
29
|
+
* Kept for backward compatibility — `extractToken` still uses it for the
|
|
30
|
+
* pure-token path. Bug 1 (2026-05-27 spec § 3.1) extends approval semantics
|
|
31
|
+
* to CJK / token-less variants via {@link APPROVAL_KEYWORD_REGEX} + the new
|
|
32
|
+
* {@link SpecApproval.extractApprovalIntent} method.
|
|
33
|
+
*/
|
|
34
|
+
export declare const APPROVE_REGEX: RegExp;
|
|
35
|
+
/**
|
|
36
|
+
* Regex matching the WHOLE prompt as a bare approval keyword
|
|
37
|
+
* (Chinese / English) OPTIONALLY followed by an 8-hex token. Used by
|
|
38
|
+
* {@link SpecApproval.extractApprovalIntent} so any of the following short-
|
|
39
|
+
* circuit into spec-approval pipeline (Bug 1 spec § 3.1):
|
|
40
|
+
*
|
|
41
|
+
* '批准' → hasIntent=true, token=undefined → fallback search
|
|
42
|
+
* '同意' → ditto (Chinese formal)
|
|
43
|
+
* 'approve' → ditto (English bare; legacy regex required token)
|
|
44
|
+
* '批准 a1b2c3d4' → hasIntent=true, token='a1b2c3d4'
|
|
45
|
+
* '批准 A1B2C3D4 ' → tolerates whitespace + case
|
|
46
|
+
*
|
|
47
|
+
* Strict anchoring (`^…$`) prevents '我同意,但是...' from matching — a
|
|
48
|
+
* complex sentence containing the keyword is NOT an approval signal.
|
|
49
|
+
*/
|
|
50
|
+
export declare const APPROVAL_KEYWORD_REGEX: RegExp;
|
|
51
|
+
/**
|
|
52
|
+
* Result of {@link SpecApproval.extractApprovalIntent}. `hasIntent` is the
|
|
53
|
+
* caller's short-circuit gate; `token` is set ONLY when the prompt carried
|
|
54
|
+
* an explicit 8-hex (otherwise the caller must fallback to listSessionPending).
|
|
55
|
+
*/
|
|
56
|
+
export interface ApprovalIntent {
|
|
57
|
+
hasIntent: boolean;
|
|
58
|
+
token?: string;
|
|
59
|
+
}
|
|
60
|
+
export declare class SpecApproval {
|
|
61
|
+
private readonly storage;
|
|
62
|
+
constructor(storage: SQLiteStorage);
|
|
63
|
+
/**
|
|
64
|
+
* Try to extract a token from a raw user prompt. Returns the 8-hex string
|
|
65
|
+
* (lowercase) when the WHOLE prompt is exactly `approve <token>`. Returns
|
|
66
|
+
* null otherwise — that's the signal for the handler to NOT short-circuit.
|
|
67
|
+
*
|
|
68
|
+
* Strict-format requirement (spec § 3.5 risk note): if the user mixes
|
|
69
|
+
* 'approve abc12345' with additional text, we let the prompt proceed
|
|
70
|
+
* through the normal pipeline to avoid losing their new request.
|
|
71
|
+
*/
|
|
72
|
+
extractToken(prompt: string): string | null;
|
|
73
|
+
/**
|
|
74
|
+
* Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval detector.
|
|
75
|
+
* Returns:
|
|
76
|
+
* - `{ hasIntent: false }` when prompt is NOT an approval signal
|
|
77
|
+
* - `{ hasIntent: true, token }` when prompt is e.g. '批准 a1b2c3d4'
|
|
78
|
+
* - `{ hasIntent: true }` (no token) when prompt is bare '批准' / 'approve'
|
|
79
|
+
*
|
|
80
|
+
* Caller (`SpecGate.handleApproval`) uses `hasIntent` as the short-circuit
|
|
81
|
+
* gate and `token` to decide whether to call `verify` directly or fall back
|
|
82
|
+
* to `listSessionPending` to pick the latest pending row.
|
|
83
|
+
*
|
|
84
|
+
* Strict-format anchoring prevents complex sentences like '我同意,但是…'
|
|
85
|
+
* from triggering approval — the keyword must be the WHOLE prompt.
|
|
86
|
+
*/
|
|
87
|
+
extractApprovalIntent(prompt: string): ApprovalIntent;
|
|
88
|
+
/**
|
|
89
|
+
* Verify a token. C1 (spec 0854): look up the decisions table (kind='spec'),
|
|
90
|
+
* scoped by session_id (P0 safety — a leaked cross-session token must never
|
|
91
|
+
* approve someone else's spec). The legacy pending_specs table is gone.
|
|
92
|
+
*
|
|
93
|
+
* Outcomes (see SpecApprovalResult in src/core/types.ts):
|
|
94
|
+
* • 'ok' — found, status='generated', flipped to 'approved'
|
|
95
|
+
* • 'not_found' — token unknown OR session mismatch (P0 safety)
|
|
96
|
+
* • 'expired' — found but status='expired'
|
|
97
|
+
* • 'already_approved' — found but status='approved'
|
|
98
|
+
*
|
|
99
|
+
* The function COMMITS the status flip when outcome === 'ok' via
|
|
100
|
+
* markSpecApproved (decisions). Idempotent.
|
|
101
|
+
*/
|
|
102
|
+
verify(token: string, sessionId: string, nowIso?: string): SpecApprovalResult;
|
|
103
|
+
/**
|
|
104
|
+
* List still-pending specs for a session (for the "unknown token" hint).
|
|
105
|
+
*
|
|
106
|
+
* C1 (spec 0854): reads decisions kind='spec' pending rows only. Returns the
|
|
107
|
+
* SpecLikeRow shape consumed by spec-gate / formatApprovalMessage.
|
|
108
|
+
*/
|
|
109
|
+
listSessionPending(sessionId: string, limit?: number): SpecLikeRow[];
|
|
110
|
+
private classifyAndCommit;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Render the systemMessage shown to the main thread for each outcome.
|
|
114
|
+
*
|
|
115
|
+
* Centralized here so SpecGenerator / SpecApproval / the handler all agree
|
|
116
|
+
* on the wording. Format is intentionally short to keep the system message
|
|
117
|
+
* cheap (KB inject + intent + KB block already accumulate).
|
|
118
|
+
*/
|
|
119
|
+
export declare function formatApprovalMessage(outcome: SpecApprovalOutcome, args: {
|
|
120
|
+
token: string;
|
|
121
|
+
row?: SpecApprovalRowLike;
|
|
122
|
+
pendingList?: Array<{
|
|
123
|
+
token: string;
|
|
124
|
+
spec_path: string;
|
|
125
|
+
}>;
|
|
126
|
+
}): string;
|
|
127
|
+
//# sourceMappingURL=spec-approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-approval.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/spec-approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAG7B;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAqC,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,QACc,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAEnD;;;;;;;;OAQG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM3C;;;;;;;;;;;;;OAaG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAQrD;;;;;;;;;;;;;OAaG;IACH,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB;IAcrB;;;;;OAKG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,WAAW,EAAE;IAS/D,OAAO,CAAC,iBAAiB;CAkC1B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IAId,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D,GACA,MAAM,CAmCR"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SpecApproval — v9.x Phase 2b approve-token verifier.
|
|
3
|
+
*
|
|
4
|
+
* Companion service to `SpecGenerator`. Called by `UserPromptHandler.step 2.7`
|
|
5
|
+
* when the user types `approve <token>` exactly. The handler:
|
|
6
|
+
* 1. Detects the 'approve <8-hex>' pattern
|
|
7
|
+
* 2. Asks `SpecApproval.verify(token, session_id)` for the outcome
|
|
8
|
+
* 3. Surfaces a systemMessage based on the outcome
|
|
9
|
+
* 4. Short-circuits if outcome === 'ok' (skips KB / Skill / workflow rec)
|
|
10
|
+
*
|
|
11
|
+
* Why a separate service: keeps the handler thin and makes the verifier
|
|
12
|
+
* trivially testable without spinning up the whole UserPromptHandler graph.
|
|
13
|
+
*
|
|
14
|
+
* P0 safety (doc-reviewer Sub-2 report): verify() MUST filter by session_id.
|
|
15
|
+
* A token leaked across sessions must NOT be approve-able. The underlying
|
|
16
|
+
* facade method `findSpecByTokenAndSession` enforces this.
|
|
17
|
+
*
|
|
18
|
+
* No 'modify' code path is implemented in Phase 2b (spec § 3.4 mentions it
|
|
19
|
+
* in the systemMessage hint but § 3.5 leaves it un-implemented). The
|
|
20
|
+
* handler-side messages have been adjusted to advertise only `approve` and
|
|
21
|
+
* `skip`. See changelog "modify path simplification" decision.
|
|
22
|
+
*/
|
|
23
|
+
import { toSpecLikeRow } from '../../core/storage/decisions.js';
|
|
24
|
+
import { logger } from '../../core/utils/logger.js';
|
|
25
|
+
/**
|
|
26
|
+
* Regex matching exactly `approve <8-hex>` with no surrounding text.
|
|
27
|
+
*
|
|
28
|
+
* Kept for backward compatibility — `extractToken` still uses it for the
|
|
29
|
+
* pure-token path. Bug 1 (2026-05-27 spec § 3.1) extends approval semantics
|
|
30
|
+
* to CJK / token-less variants via {@link APPROVAL_KEYWORD_REGEX} + the new
|
|
31
|
+
* {@link SpecApproval.extractApprovalIntent} method.
|
|
32
|
+
*/
|
|
33
|
+
export const APPROVE_REGEX = /^\s*approve\s+([a-f0-9]{8})\s*$/i;
|
|
34
|
+
/**
|
|
35
|
+
* Regex matching the WHOLE prompt as a bare approval keyword
|
|
36
|
+
* (Chinese / English) OPTIONALLY followed by an 8-hex token. Used by
|
|
37
|
+
* {@link SpecApproval.extractApprovalIntent} so any of the following short-
|
|
38
|
+
* circuit into spec-approval pipeline (Bug 1 spec § 3.1):
|
|
39
|
+
*
|
|
40
|
+
* '批准' → hasIntent=true, token=undefined → fallback search
|
|
41
|
+
* '同意' → ditto (Chinese formal)
|
|
42
|
+
* 'approve' → ditto (English bare; legacy regex required token)
|
|
43
|
+
* '批准 a1b2c3d4' → hasIntent=true, token='a1b2c3d4'
|
|
44
|
+
* '批准 A1B2C3D4 ' → tolerates whitespace + case
|
|
45
|
+
*
|
|
46
|
+
* Strict anchoring (`^…$`) prevents '我同意,但是...' from matching — a
|
|
47
|
+
* complex sentence containing the keyword is NOT an approval signal.
|
|
48
|
+
*/
|
|
49
|
+
export const APPROVAL_KEYWORD_REGEX = /^\s*(批准|同意|approve)(?:\s+([a-f0-9]{8}))?\s*$/i;
|
|
50
|
+
export class SpecApproval {
|
|
51
|
+
storage;
|
|
52
|
+
constructor(storage) {
|
|
53
|
+
this.storage = storage;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Try to extract a token from a raw user prompt. Returns the 8-hex string
|
|
57
|
+
* (lowercase) when the WHOLE prompt is exactly `approve <token>`. Returns
|
|
58
|
+
* null otherwise — that's the signal for the handler to NOT short-circuit.
|
|
59
|
+
*
|
|
60
|
+
* Strict-format requirement (spec § 3.5 risk note): if the user mixes
|
|
61
|
+
* 'approve abc12345' with additional text, we let the prompt proceed
|
|
62
|
+
* through the normal pipeline to avoid losing their new request.
|
|
63
|
+
*/
|
|
64
|
+
extractToken(prompt) {
|
|
65
|
+
if (!prompt)
|
|
66
|
+
return null;
|
|
67
|
+
const m = prompt.match(APPROVE_REGEX);
|
|
68
|
+
return m ? m[1].toLowerCase() : null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval detector.
|
|
72
|
+
* Returns:
|
|
73
|
+
* - `{ hasIntent: false }` when prompt is NOT an approval signal
|
|
74
|
+
* - `{ hasIntent: true, token }` when prompt is e.g. '批准 a1b2c3d4'
|
|
75
|
+
* - `{ hasIntent: true }` (no token) when prompt is bare '批准' / 'approve'
|
|
76
|
+
*
|
|
77
|
+
* Caller (`SpecGate.handleApproval`) uses `hasIntent` as the short-circuit
|
|
78
|
+
* gate and `token` to decide whether to call `verify` directly or fall back
|
|
79
|
+
* to `listSessionPending` to pick the latest pending row.
|
|
80
|
+
*
|
|
81
|
+
* Strict-format anchoring prevents complex sentences like '我同意,但是…'
|
|
82
|
+
* from triggering approval — the keyword must be the WHOLE prompt.
|
|
83
|
+
*/
|
|
84
|
+
extractApprovalIntent(prompt) {
|
|
85
|
+
if (!prompt)
|
|
86
|
+
return { hasIntent: false };
|
|
87
|
+
const m = prompt.match(APPROVAL_KEYWORD_REGEX);
|
|
88
|
+
if (!m)
|
|
89
|
+
return { hasIntent: false };
|
|
90
|
+
const token = m[2] ? m[2].toLowerCase() : undefined;
|
|
91
|
+
return { hasIntent: true, token };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Verify a token. C1 (spec 0854): look up the decisions table (kind='spec'),
|
|
95
|
+
* scoped by session_id (P0 safety — a leaked cross-session token must never
|
|
96
|
+
* approve someone else's spec). The legacy pending_specs table is gone.
|
|
97
|
+
*
|
|
98
|
+
* Outcomes (see SpecApprovalResult in src/core/types.ts):
|
|
99
|
+
* • 'ok' — found, status='generated', flipped to 'approved'
|
|
100
|
+
* • 'not_found' — token unknown OR session mismatch (P0 safety)
|
|
101
|
+
* • 'expired' — found but status='expired'
|
|
102
|
+
* • 'already_approved' — found but status='approved'
|
|
103
|
+
*
|
|
104
|
+
* The function COMMITS the status flip when outcome === 'ok' via
|
|
105
|
+
* markSpecApproved (decisions). Idempotent.
|
|
106
|
+
*/
|
|
107
|
+
verify(token, sessionId, nowIso) {
|
|
108
|
+
if (!token || !sessionId) {
|
|
109
|
+
return { outcome: 'not_found' };
|
|
110
|
+
}
|
|
111
|
+
const tok = token.toLowerCase();
|
|
112
|
+
const decisionRow = this.storage.findSpecByTokenAndSession(tok, sessionId);
|
|
113
|
+
if (decisionRow) {
|
|
114
|
+
return this.classifyAndCommit(toSpecLikeRow(decisionRow), decisionRow.id, nowIso);
|
|
115
|
+
}
|
|
116
|
+
return { outcome: 'not_found' };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* List still-pending specs for a session (for the "unknown token" hint).
|
|
120
|
+
*
|
|
121
|
+
* C1 (spec 0854): reads decisions kind='spec' pending rows only. Returns the
|
|
122
|
+
* SpecLikeRow shape consumed by spec-gate / formatApprovalMessage.
|
|
123
|
+
*/
|
|
124
|
+
listSessionPending(sessionId, limit = 5) {
|
|
125
|
+
return this.storage
|
|
126
|
+
.listSpecsBySessionPending(sessionId, limit)
|
|
127
|
+
.map((d) => toSpecLikeRow(d))
|
|
128
|
+
.slice(0, limit);
|
|
129
|
+
}
|
|
130
|
+
// ── Internals ─────────────────────────────────────────────────────────
|
|
131
|
+
classifyAndCommit(row, rowId, nowIso) {
|
|
132
|
+
switch (row.status) {
|
|
133
|
+
case 'expired':
|
|
134
|
+
return { outcome: 'expired', row };
|
|
135
|
+
case 'approved':
|
|
136
|
+
return { outcome: 'already_approved', row };
|
|
137
|
+
case 'skipped':
|
|
138
|
+
case 'modified':
|
|
139
|
+
// Treat anything non-'generated' that isn't expired/approved as
|
|
140
|
+
// already-approved for UX simplicity. Surface row so the caller
|
|
141
|
+
// can format a useful systemMessage.
|
|
142
|
+
return { outcome: 'already_approved', row };
|
|
143
|
+
case 'generated':
|
|
144
|
+
try {
|
|
145
|
+
this.storage.markSpecApproved(rowId, nowIso);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
logger.warn(`[SpecApproval] markApproved failed for id=${rowId}: ${err}`);
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
outcome: 'ok',
|
|
152
|
+
row: {
|
|
153
|
+
...row,
|
|
154
|
+
status: 'approved',
|
|
155
|
+
approved_at: nowIso ?? new Date().toISOString(),
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
default:
|
|
159
|
+
return { outcome: 'not_found', row };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Render the systemMessage shown to the main thread for each outcome.
|
|
165
|
+
*
|
|
166
|
+
* Centralized here so SpecGenerator / SpecApproval / the handler all agree
|
|
167
|
+
* on the wording. Format is intentionally short to keep the system message
|
|
168
|
+
* cheap (KB inject + intent + KB block already accumulate).
|
|
169
|
+
*/
|
|
170
|
+
export function formatApprovalMessage(outcome, args) {
|
|
171
|
+
const { token, row, pendingList } = args;
|
|
172
|
+
switch (outcome) {
|
|
173
|
+
case 'ok': {
|
|
174
|
+
const spec = row?.spec_path ?? '(unknown spec)';
|
|
175
|
+
const intent = safeParseIntent(row?.intent_json);
|
|
176
|
+
const agent = intent?.suggested_agent ?? 'planner';
|
|
177
|
+
return [
|
|
178
|
+
'[AUTO-SPEC APPROVED]',
|
|
179
|
+
'',
|
|
180
|
+
`Spec 已批准: ${spec}`,
|
|
181
|
+
`推荐 agent: ${agent}`,
|
|
182
|
+
'',
|
|
183
|
+
`主线程请用 Task tool spawn subagent_type='${agent}'`,
|
|
184
|
+
`Task prompt 必须以 "Read ${spec} 然后..." 开头。`,
|
|
185
|
+
].join('\n');
|
|
186
|
+
}
|
|
187
|
+
case 'not_found': {
|
|
188
|
+
const hint = pendingList && pendingList.length > 0
|
|
189
|
+
? '\n当前 pending tokens:\n' +
|
|
190
|
+
pendingList
|
|
191
|
+
.map((r) => ` • ${r.token} → ${r.spec_path}`)
|
|
192
|
+
.join('\n')
|
|
193
|
+
: '\n本 session 没有 pending spec。';
|
|
194
|
+
return `[AUTO-SPEC] 未找到 token "${token}"。可能已过期,或不属于本 session。${hint}`;
|
|
195
|
+
}
|
|
196
|
+
case 'expired':
|
|
197
|
+
return `[AUTO-SPEC] token "${token}" 已过期。请重新发起原 prompt 让 daemon 生成新 spec。`;
|
|
198
|
+
case 'already_approved':
|
|
199
|
+
return `[AUTO-SPEC] token "${token}" 已被 approve 过。请按 spec 执行;无需再次回复 approve。`;
|
|
200
|
+
case 'wrong_session':
|
|
201
|
+
return `[AUTO-SPEC] token "${token}" 不属于本 session。`;
|
|
202
|
+
default:
|
|
203
|
+
return `[AUTO-SPEC] 未识别的状态。`;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function safeParseIntent(json) {
|
|
207
|
+
if (!json)
|
|
208
|
+
return null;
|
|
209
|
+
try {
|
|
210
|
+
return JSON.parse(json);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=spec-approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec-approval.js","sourceRoot":"","sources":["../../../src/daemon/services/spec-approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAOhE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,kCAAkC,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,sBAAsB,GACjC,+CAA+C,CAAC;AAYlD,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IAAG,CAAC;IAEvD;;;;;;;;OAQG;IACH,YAAY,CAAC,MAAc;QACzB,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,qBAAqB,CAAC,MAAc;QAClC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC/C,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACpD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CACJ,KAAa,EACb,SAAiB,EACjB,MAAe;QAEf,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAClC,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC3E,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,SAAiB,EAAE,KAAK,GAAG,CAAC;QAC7C,OAAO,IAAI,CAAC,OAAO;aAChB,yBAAyB,CAAC,SAAS,EAAE,KAAK,CAAC;aAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aAC5B,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,yEAAyE;IAEjE,iBAAiB,CACvB,GAAgB,EAChB,KAAa,EACb,MAAe;QAEf,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,KAAK,SAAS;gBACZ,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;YACrC,KAAK,UAAU;gBACb,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC;YAC9C,KAAK,SAAS,CAAC;YACf,KAAK,UAAU;gBACb,gEAAgE;gBAChE,gEAAgE;gBAChE,qCAAqC;gBACrC,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC;YAC9C,KAAK,WAAW;gBACd,IAAI,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC/C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,CAAC,6CAA6C,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;gBAC5E,CAAC;gBACD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,GAAG,EAAE;wBACH,GAAG,GAAG;wBACN,MAAM,EAAE,UAAU;wBAClB,WAAW,EAAE,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBAChD;iBACF,CAAC;YACJ;gBACE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAA4B,EAC5B,IAOC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IACzC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,IAAI,GAAG,GAAG,EAAE,SAAS,IAAI,gBAAgB,CAAC;YAChD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,EAAE,eAAe,IAAI,SAAS,CAAC;YACnD,OAAO;gBACL,sBAAsB;gBACtB,EAAE;gBACF,aAAa,IAAI,EAAE;gBACnB,aAAa,KAAK,EAAE;gBACpB,EAAE;gBACF,wCAAwC,KAAK,GAAG;gBAChD,yBAAyB,IAAI,aAAa;aAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;gBAChD,CAAC,CAAC,wBAAwB;oBACxB,WAAW;yBACR,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;yBAC7C,IAAI,CAAC,IAAI,CAAC;gBACf,CAAC,CAAC,8BAA8B,CAAC;YACnC,OAAO,0BAA0B,KAAK,yBAAyB,IAAI,EAAE,CAAC;QACxE,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,sBAAsB,KAAK,wCAAwC,CAAC;QAC7E,KAAK,kBAAkB;YACrB,OAAO,sBAAsB,KAAK,2CAA2C,CAAC;QAChF,KAAK,eAAe;YAClB,OAAO,sBAAsB,KAAK,iBAAiB,CAAC;QACtD;YACE,OAAO,qBAAqB,CAAC;IACjC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAwB;IAC/C,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|