@winspan/claude-forge 8.54.3 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPMENT.md +649 -33
- package/README.md +155 -17
- package/dist/catalogs/agents.json +72 -0
- package/dist/catalogs/skills.json +194 -0
- package/dist/claudemd/claudemd-generator.d.ts +45 -45
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +128 -449
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/index.d.ts +14 -4
- package/dist/claudemd/index.d.ts.map +1 -1
- package/dist/claudemd/index.js +15 -4
- package/dist/claudemd/index.js.map +1 -1
- package/dist/claudemd/resume-manager.d.ts.map +1 -1
- package/dist/claudemd/resume-manager.js +37 -9
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/templates/swarm-protocol.md +35 -186
- package/dist/claudemd/violations-manager.d.ts +40 -0
- package/dist/claudemd/violations-manager.d.ts.map +1 -0
- package/dist/claudemd/violations-manager.js +106 -0
- package/dist/claudemd/violations-manager.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +15 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +177 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +18 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +160 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/bypass.d.ts +18 -0
- package/dist/cli/commands/bypass.d.ts.map +1 -0
- package/dist/cli/commands/bypass.js +87 -0
- package/dist/cli/commands/bypass.js.map +1 -0
- package/dist/cli/commands/claudemd.d.ts +60 -0
- package/dist/cli/commands/claudemd.d.ts.map +1 -1
- package/dist/cli/commands/claudemd.js +174 -37
- package/dist/cli/commands/claudemd.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +94 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +39 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +167 -20
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/decisions.d.ts +129 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +669 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +124 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/entropy.d.ts +35 -0
- package/dist/cli/commands/entropy.d.ts.map +1 -0
- package/dist/cli/commands/entropy.js +121 -0
- package/dist/cli/commands/entropy.js.map +1 -0
- package/dist/cli/commands/executions.d.ts +1 -0
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +10 -1
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/fix.d.ts +31 -0
- package/dist/cli/commands/fix.d.ts.map +1 -0
- package/dist/cli/commands/fix.js +108 -0
- package/dist/cli/commands/fix.js.map +1 -0
- package/dist/cli/commands/governance.d.ts +21 -0
- package/dist/cli/commands/governance.d.ts.map +1 -0
- package/dist/cli/commands/governance.js +60 -0
- package/dist/cli/commands/governance.js.map +1 -0
- package/dist/cli/commands/init.d.ts +27 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +158 -146
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +50 -0
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
- package/dist/cli/commands/insights-goal-check.js +318 -0
- package/dist/cli/commands/insights-goal-check.js.map +1 -0
- package/dist/cli/commands/insights.d.ts +15 -0
- package/dist/cli/commands/insights.d.ts.map +1 -0
- package/dist/cli/commands/insights.js +127 -0
- package/dist/cli/commands/insights.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +66 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +897 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +0 -12
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +11 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/menu.d.ts.map +1 -1
- package/dist/cli/commands/menu.js +10 -184
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/project.d.ts +98 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +382 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +14 -128
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +40 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +49 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +3 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +17 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/trace.d.ts.map +1 -1
- package/dist/cli/commands/trace.js +4 -9
- package/dist/cli/commands/trace.js.map +1 -1
- package/dist/cli/commands/violations.d.ts +14 -0
- package/dist/cli/commands/violations.d.ts.map +1 -0
- package/dist/cli/commands/violations.js +43 -0
- package/dist/cli/commands/violations.js.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/hook-manager.d.ts +1 -1
- package/dist/cli/init/hook-manager.d.ts.map +1 -1
- package/dist/cli/init/hook-manager.js +6 -0
- package/dist/cli/init/hook-manager.js.map +1 -1
- package/dist/cli/utils/resolve-session.d.ts +32 -0
- package/dist/cli/utils/resolve-session.d.ts.map +1 -0
- package/dist/cli/utils/resolve-session.js +39 -0
- package/dist/cli/utils/resolve-session.js.map +1 -0
- package/dist/core/config.d.ts +4 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +11 -23
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +14 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +20 -13
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts +151 -0
- package/dist/core/diagnostics/checks.d.ts.map +1 -0
- package/dist/core/diagnostics/checks.js +765 -0
- package/dist/core/diagnostics/checks.js.map +1 -0
- package/dist/core/diagnostics/daemon-status.d.ts +77 -0
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
- package/dist/core/diagnostics/daemon-status.js +113 -0
- package/dist/core/diagnostics/daemon-status.js.map +1 -0
- package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
- package/dist/core/diagnostics/entropy-checks.js +395 -0
- package/dist/core/diagnostics/entropy-checks.js.map +1 -0
- package/dist/core/diagnostics/fix-runner.d.ts +54 -0
- package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/fix-runner.js +90 -0
- package/dist/core/diagnostics/fix-runner.js.map +1 -0
- package/dist/core/diagnostics/knip-runner.d.ts +49 -0
- package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/knip-runner.js +100 -0
- package/dist/core/diagnostics/knip-runner.js.map +1 -0
- package/dist/core/diagnostics/markers.d.ts +96 -0
- package/dist/core/diagnostics/markers.d.ts.map +1 -0
- package/dist/core/diagnostics/markers.js +153 -0
- package/dist/core/diagnostics/markers.js.map +1 -0
- package/dist/core/governance/global-inject.d.ts +60 -0
- package/dist/core/governance/global-inject.d.ts.map +1 -0
- package/dist/core/governance/global-inject.js +129 -0
- package/dist/core/governance/global-inject.js.map +1 -0
- package/dist/core/queue/index.d.ts +16 -3
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +14 -3
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +158 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +570 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
- package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
- package/dist/core/storage/codec/tool-input-codec.js +159 -0
- package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +362 -0
- package/dist/core/storage/decisions.d.ts.map +1 -0
- package/dist/core/storage/decisions.js +502 -0
- package/dist/core/storage/decisions.js.map +1 -0
- package/dist/core/storage/events.d.ts +112 -8
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +390 -39
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +131 -0
- package/dist/core/storage/feedback.d.ts.map +1 -0
- package/dist/core/storage/feedback.js +187 -0
- package/dist/core/storage/feedback.js.map +1 -0
- package/dist/core/storage/forge-config.d.ts +40 -0
- package/dist/core/storage/forge-config.d.ts.map +1 -0
- package/dist/core/storage/forge-config.js +65 -0
- package/dist/core/storage/forge-config.js.map +1 -0
- package/dist/core/storage/injections.d.ts +28 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +62 -5
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +106 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -0
- package/dist/core/storage/knowledge.js +202 -0
- package/dist/core/storage/knowledge.js.map +1 -0
- package/dist/core/storage/maintenance.d.ts +36 -9
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +56 -24
- package/dist/core/storage/maintenance.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +117 -0
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
- package/dist/core/storage/pipeline-rollup.js +471 -0
- package/dist/core/storage/pipeline-rollup.js.map +1 -0
- package/dist/core/storage/routing.d.ts +16 -3
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +39 -8
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +50 -7
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +302 -23
- package/dist/core/storage/sessions.d.ts +136 -0
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +351 -15
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +1 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +21 -6
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +253 -20
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +425 -16
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +474 -2
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +1213 -18
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +69 -0
- package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
- package/dist/core/storage/tool-intercepts.js +116 -0
- package/dist/core/storage/tool-intercepts.js.map +1 -0
- package/dist/core/storage/workflow-recommendations.d.ts +124 -0
- package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
- package/dist/core/storage/workflow-recommendations.js +274 -0
- package/dist/core/storage/workflow-recommendations.js.map +1 -0
- package/dist/core/types.d.ts +112 -17
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +12 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/backup.d.ts +81 -0
- package/dist/core/utils/backup.d.ts.map +1 -0
- package/dist/core/utils/backup.js +98 -0
- package/dist/core/utils/backup.js.map +1 -0
- package/dist/core/utils/binary-paths.d.ts +92 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -0
- package/dist/core/utils/binary-paths.js +166 -0
- package/dist/core/utils/binary-paths.js.map +1 -0
- package/dist/core/utils/bypass-token.d.ts +75 -0
- package/dist/core/utils/bypass-token.d.ts.map +1 -0
- package/dist/core/utils/bypass-token.js +133 -0
- package/dist/core/utils/bypass-token.js.map +1 -0
- package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
- package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
- package/dist/core/utils/cc-builtin-agents.js +29 -0
- package/dist/core/utils/cc-builtin-agents.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
- package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
- package/dist/core/utils/claude-cli-spawn.js +219 -0
- package/dist/core/utils/claude-cli-spawn.js.map +1 -0
- package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
- package/dist/core/utils/forge-resume-block.js +3 -2
- package/dist/core/utils/forge-resume-block.js.map +1 -1
- package/dist/core/utils/logger.d.ts +15 -3
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +20 -2
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +97 -0
- package/dist/core/utils/noise-prompt.d.ts.map +1 -0
- package/dist/core/utils/noise-prompt.js +127 -0
- package/dist/core/utils/noise-prompt.js.map +1 -0
- package/dist/core/utils/path.d.ts +0 -4
- package/dist/core/utils/path.d.ts.map +1 -1
- package/dist/core/utils/path.js +0 -7
- package/dist/core/utils/path.js.map +1 -1
- package/dist/core/utils/time.d.ts +41 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +114 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/agent-sync.d.ts +24 -0
- package/dist/daemon/agent-sync.d.ts.map +1 -0
- package/dist/daemon/agent-sync.js +114 -0
- package/dist/daemon/agent-sync.js.map +1 -0
- package/dist/daemon/config-store.d.ts +55 -0
- package/dist/daemon/config-store.d.ts.map +1 -0
- package/dist/daemon/config-store.js +137 -0
- package/dist/daemon/config-store.js.map +1 -0
- package/dist/daemon/event-parser.d.ts +22 -0
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +49 -3
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
- package/dist/daemon/handlers/history-exporter.js +9 -8
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +261 -8
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
- package/dist/daemon/handlers/pre-tool-use.js +585 -0
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
- package/dist/daemon/handlers/stop.d.ts +35 -7
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +157 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +36 -14
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +135 -48
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/hook-sync.d.ts.map +1 -1
- package/dist/daemon/hook-sync.js +2 -1
- package/dist/daemon/hook-sync.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +471 -43
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/lifecycle.d.ts +48 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +98 -2
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/router.d.ts +4 -1
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +4 -2
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts +20 -0
- package/dist/daemon/rules/defaults.d.ts.map +1 -0
- package/dist/daemon/rules/defaults.js +692 -0
- package/dist/daemon/rules/defaults.js.map +1 -0
- package/dist/daemon/rules/registry.d.ts +47 -0
- package/dist/daemon/rules/registry.d.ts.map +1 -0
- package/dist/daemon/rules/registry.js +84 -0
- package/dist/daemon/rules/registry.js.map +1 -0
- package/dist/daemon/rules/types.d.ts +170 -0
- package/dist/daemon/rules/types.d.ts.map +1 -0
- package/dist/daemon/rules/types.js +15 -0
- package/dist/daemon/rules/types.js.map +1 -0
- package/dist/daemon/rules/whitelist.d.ts +101 -0
- package/dist/daemon/rules/whitelist.d.ts.map +1 -0
- package/dist/daemon/rules/whitelist.js +210 -0
- package/dist/daemon/rules/whitelist.js.map +1 -0
- package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
- package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
- package/dist/daemon/rules/workflow-defaults.js +521 -0
- package/dist/daemon/rules/workflow-defaults.js.map +1 -0
- package/dist/daemon/server.d.ts +11 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +7 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/context-injector.d.ts +34 -0
- package/dist/daemon/services/context-injector.d.ts.map +1 -0
- package/dist/daemon/services/context-injector.js +61 -0
- package/dist/daemon/services/context-injector.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +203 -0
- package/dist/daemon/services/decision-hint.d.ts.map +1 -0
- package/dist/daemon/services/decision-hint.js +487 -0
- package/dist/daemon/services/decision-hint.js.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.js +123 -0
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
- package/dist/daemon/services/experience-extractor.d.ts +67 -0
- package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
- package/dist/daemon/services/experience-extractor.js +323 -0
- package/dist/daemon/services/experience-extractor.js.map +1 -0
- package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
- package/dist/daemon/services/feedback-aggregator.js +455 -0
- package/dist/daemon/services/feedback-aggregator.js.map +1 -0
- package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
- package/dist/daemon/services/heartbeat-writer.js +111 -0
- package/dist/daemon/services/heartbeat-writer.js.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.js +94 -0
- package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
- package/dist/daemon/services/idle-task-budget.d.ts +50 -0
- package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
- package/dist/daemon/services/idle-task-budget.js +72 -0
- package/dist/daemon/services/idle-task-budget.js.map +1 -0
- package/dist/daemon/services/intercept-revive.d.ts +60 -0
- package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
- package/dist/daemon/services/intercept-revive.js +86 -0
- package/dist/daemon/services/intercept-revive.js.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.js +152 -0
- package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
- package/dist/daemon/services/kb-injector.d.ts +57 -0
- package/dist/daemon/services/kb-injector.d.ts.map +1 -0
- package/dist/daemon/services/kb-injector.js +140 -0
- package/dist/daemon/services/kb-injector.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
- package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +214 -0
- package/dist/daemon/services/outcome-classification-service.js.map +1 -0
- package/dist/daemon/services/outcome-classifier.d.ts +136 -0
- package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classifier.js +178 -0
- package/dist/daemon/services/outcome-classifier.js.map +1 -0
- package/dist/daemon/services/outcome-nudge.d.ts +107 -0
- package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
- package/dist/daemon/services/outcome-nudge.js +242 -0
- package/dist/daemon/services/outcome-nudge.js.map +1 -0
- package/dist/daemon/services/spec-approval.d.ts +127 -0
- package/dist/daemon/services/spec-approval.d.ts.map +1 -0
- package/dist/daemon/services/spec-approval.js +216 -0
- package/dist/daemon/services/spec-approval.js.map +1 -0
- package/dist/daemon/services/spec-gate.d.ts +54 -0
- package/dist/daemon/services/spec-gate.d.ts.map +1 -0
- package/dist/daemon/services/spec-gate.js +113 -0
- package/dist/daemon/services/spec-gate.js.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.js +202 -0
- package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
- package/dist/daemon/services/task-segmenter.d.ts +219 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +481 -17
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/services/violation-reporter.d.ts +130 -0
- package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
- package/dist/daemon/services/violation-reporter.js +339 -0
- package/dist/daemon/services/violation-reporter.js.map +1 -0
- package/dist/daemon/skill-sync.d.ts +7 -2
- package/dist/daemon/skill-sync.d.ts.map +1 -1
- package/dist/daemon/skill-sync.js +114 -9
- package/dist/daemon/skill-sync.js.map +1 -1
- package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
- package/dist/daemon/templates/agents/coder.md +105 -0
- package/dist/daemon/templates/agents/decision-maker.md +460 -0
- package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
- package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
- package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
- package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
- package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
- package/dist/daemon/templates/agents/patch-applier.md +144 -0
- package/dist/daemon/templates/agents/planner.md +165 -0
- package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
- package/dist/daemon/templates/agents/skill-distiller.md +113 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
- package/dist/daemon/templates/agents/verify-agent.md +136 -0
- package/dist/daemon/utils/inject-block.d.ts +39 -0
- package/dist/daemon/utils/inject-block.d.ts.map +1 -0
- package/dist/daemon/utils/inject-block.js +25 -0
- package/dist/daemon/utils/inject-block.js.map +1 -0
- package/dist/hooks/hook-lib.sh +8 -0
- package/dist/hooks/notification.sh +19 -8
- package/dist/hooks/post-tool-use.sh +41 -23
- package/dist/hooks/pre-tool-use.sh +54 -23
- package/dist/hooks/session-start.sh +68 -0
- package/dist/hooks/stop.sh +24 -10
- package/dist/hooks/user-prompt-submit.sh +37 -21
- package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
- package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/go-adapter.js +294 -0
- package/dist/knowledge/adapters/go-adapter.js.map +1 -0
- package/dist/knowledge/adapters/index.d.ts +41 -0
- package/dist/knowledge/adapters/index.d.ts.map +1 -0
- package/dist/knowledge/adapters/index.js +71 -0
- package/dist/knowledge/adapters/index.js.map +1 -0
- package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
- package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/java-adapter.js +260 -0
- package/dist/knowledge/adapters/java-adapter.js.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
- package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
- package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
- package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
- package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
- package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/python-adapter.js +358 -0
- package/dist/knowledge/adapters/python-adapter.js.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.js +329 -0
- package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
- package/dist/knowledge/adapters/types.d.ts +99 -0
- package/dist/knowledge/adapters/types.d.ts.map +1 -0
- package/dist/knowledge/adapters/types.js +17 -0
- package/dist/knowledge/adapters/types.js.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.js +171 -0
- package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
- package/dist/knowledge/audit-applier.d.ts +70 -0
- package/dist/knowledge/audit-applier.d.ts.map +1 -0
- package/dist/knowledge/audit-applier.js +251 -0
- package/dist/knowledge/audit-applier.js.map +1 -0
- package/dist/knowledge/builder.d.ts +261 -0
- package/dist/knowledge/builder.d.ts.map +1 -0
- package/dist/knowledge/builder.js +937 -0
- package/dist/knowledge/builder.js.map +1 -0
- package/dist/knowledge/cli-provider.d.ts +151 -0
- package/dist/knowledge/cli-provider.d.ts.map +1 -0
- package/dist/knowledge/cli-provider.js +313 -0
- package/dist/knowledge/cli-provider.js.map +1 -0
- package/dist/knowledge/constants.d.ts +73 -0
- package/dist/knowledge/constants.d.ts.map +1 -0
- package/dist/knowledge/constants.js +93 -0
- package/dist/knowledge/constants.js.map +1 -0
- package/dist/knowledge/cross-module.d.ts +139 -0
- package/dist/knowledge/cross-module.d.ts.map +1 -0
- package/dist/knowledge/cross-module.js +370 -0
- package/dist/knowledge/cross-module.js.map +1 -0
- package/dist/knowledge/git-hooks.d.ts +67 -0
- package/dist/knowledge/git-hooks.d.ts.map +1 -0
- package/dist/knowledge/git-hooks.js +258 -0
- package/dist/knowledge/git-hooks.js.map +1 -0
- package/dist/knowledge/module-hash.d.ts +88 -0
- package/dist/knowledge/module-hash.d.ts.map +1 -0
- package/dist/knowledge/module-hash.js +162 -0
- package/dist/knowledge/module-hash.js.map +1 -0
- package/dist/knowledge/project-detector.d.ts +101 -0
- package/dist/knowledge/project-detector.d.ts.map +1 -0
- package/dist/knowledge/project-detector.js +223 -0
- package/dist/knowledge/project-detector.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +228 -0
- package/dist/knowledge/prompt.d.ts.map +1 -0
- package/dist/knowledge/prompt.js +404 -0
- package/dist/knowledge/prompt.js.map +1 -0
- package/dist/knowledge/query.d.ts +105 -0
- package/dist/knowledge/query.d.ts.map +1 -0
- package/dist/knowledge/query.js +341 -0
- package/dist/knowledge/query.js.map +1 -0
- package/dist/knowledge/repo-map.d.ts +91 -0
- package/dist/knowledge/repo-map.d.ts.map +1 -0
- package/dist/knowledge/repo-map.js +408 -0
- package/dist/knowledge/repo-map.js.map +1 -0
- package/dist/knowledge/tools/index.d.ts +14 -0
- package/dist/knowledge/tools/index.d.ts.map +1 -0
- package/dist/knowledge/tools/index.js +11 -0
- package/dist/knowledge/tools/index.js.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.js +101 -0
- package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
- package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
- package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-query.js +104 -0
- package/dist/knowledge/tools/knowledge-query.js.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.js +82 -0
- package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
- package/dist/knowledge/types.d.ts +269 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +10 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/knowledge/validator.d.ts +90 -0
- package/dist/knowledge/validator.d.ts.map +1 -0
- package/dist/knowledge/validator.js +288 -0
- package/dist/knowledge/validator.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +222 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/builtin-skills.d.ts +35 -0
- package/dist/skills/builtin-skills.d.ts.map +1 -0
- package/dist/skills/builtin-skills.js +68 -0
- package/dist/skills/builtin-skills.js.map +1 -0
- package/dist/skills/distill/attribution.d.ts +59 -0
- package/dist/skills/distill/attribution.d.ts.map +1 -0
- package/dist/skills/distill/attribution.js +101 -0
- package/dist/skills/distill/attribution.js.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.js +115 -0
- package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
- package/dist/skills/distill/distiller.d.ts +161 -0
- package/dist/skills/distill/distiller.d.ts.map +1 -0
- package/dist/skills/distill/distiller.js +461 -0
- package/dist/skills/distill/distiller.js.map +1 -0
- package/dist/skills/distill/index.d.ts +223 -0
- package/dist/skills/distill/index.d.ts.map +1 -0
- package/dist/skills/distill/index.js +466 -0
- package/dist/skills/distill/index.js.map +1 -0
- package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
- package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
- package/dist/skills/distill/project-anchor-guard.js +334 -0
- package/dist/skills/distill/project-anchor-guard.js.map +1 -0
- package/dist/skills/distill/topic-deduper.d.ts +77 -0
- package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
- package/dist/skills/distill/topic-deduper.js +119 -0
- package/dist/skills/distill/topic-deduper.js.map +1 -0
- package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
- package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
- package/dist/skills/distill/upstream-fetcher.js +202 -0
- package/dist/skills/distill/upstream-fetcher.js.map +1 -0
- package/dist/skills/distilled/distilled-api-design.md +491 -0
- package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
- package/dist/skills/distilled/distilled-creator.md +178 -0
- package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
- package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
- package/dist/skills/distilled/distilled-executing-plans.md +113 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
- package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
- package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
- package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
- package/dist/skills/keyword-score.d.ts +29 -0
- package/dist/skills/keyword-score.d.ts.map +1 -0
- package/dist/skills/keyword-score.js +54 -0
- package/dist/skills/keyword-score.js.map +1 -0
- package/dist/skills/registry.d.ts +64 -20
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +102 -105
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +14 -14
- package/dist/skills/tools/skill-invoke.d.ts +1 -1
- package/dist/skills/tools/skill-invoke.js +1 -1
- package/dist/web/routes/agent-content.d.ts +30 -0
- package/dist/web/routes/agent-content.d.ts.map +1 -0
- package/dist/web/routes/agent-content.js +139 -0
- package/dist/web/routes/agent-content.js.map +1 -0
- package/dist/web/routes/decisions.d.ts +15 -0
- package/dist/web/routes/decisions.d.ts.map +1 -0
- package/dist/web/routes/decisions.js +181 -0
- package/dist/web/routes/decisions.js.map +1 -0
- package/dist/web/routes/diagnostics.d.ts +61 -0
- package/dist/web/routes/diagnostics.d.ts.map +1 -0
- package/dist/web/routes/diagnostics.js +203 -0
- package/dist/web/routes/diagnostics.js.map +1 -0
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +24 -0
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/health.d.ts +33 -0
- package/dist/web/routes/health.d.ts.map +1 -0
- package/dist/web/routes/health.js +37 -0
- package/dist/web/routes/health.js.map +1 -0
- package/dist/web/routes/insights.d.ts +0 -5
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +783 -2
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +16 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/knowledge.js +661 -0
- package/dist/web/routes/knowledge.js.map +1 -0
- package/dist/web/routes/patch.d.ts +60 -1
- package/dist/web/routes/patch.d.ts.map +1 -1
- package/dist/web/routes/patch.js +170 -64
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +37 -0
- package/dist/web/routes/pipeline.d.ts.map +1 -0
- package/dist/web/routes/pipeline.js +149 -0
- package/dist/web/routes/pipeline.js.map +1 -0
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +6 -1
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +9 -1
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-content.d.ts +30 -0
- package/dist/web/routes/skill-content.d.ts.map +1 -0
- package/dist/web/routes/skill-content.js +117 -0
- package/dist/web/routes/skill-content.js.map +1 -0
- package/dist/web/routes/skills-distill.d.ts +29 -0
- package/dist/web/routes/skills-distill.d.ts.map +1 -0
- package/dist/web/routes/skills-distill.js +552 -0
- package/dist/web/routes/skills-distill.js.map +1 -0
- package/dist/web/routes/skills.js +7 -7
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +102 -0
- package/dist/web/routes/task-timeline.d.ts.map +1 -0
- package/dist/web/routes/task-timeline.js +274 -0
- package/dist/web/routes/task-timeline.js.map +1 -0
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +355 -8
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/trace.d.ts.map +1 -1
- package/dist/web/routes/trace.js +3 -2
- package/dist/web/routes/trace.js.map +1 -1
- package/dist/web/routes/types.d.ts +0 -4
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +1 -1
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/routes/violations.d.ts +14 -0
- package/dist/web/routes/violations.d.ts.map +1 -0
- package/dist/web/routes/violations.js +111 -0
- package/dist/web/routes/violations.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +79 -19
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/build-manager.d.ts +72 -0
- package/dist/web/services/build-manager.d.ts.map +1 -0
- package/dist/web/services/build-manager.js +189 -0
- package/dist/web/services/build-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +125 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -0
- package/dist/web/services/distill-manager.js +308 -0
- package/dist/web/services/distill-manager.js.map +1 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
- package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
- package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
- package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
- package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
- package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
- package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
- package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
- package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
- package/dist/web/static/index.html +12 -8
- package/package.json +14 -3
- package/dist/core/ai/provider.d.ts +0 -63
- package/dist/core/ai/provider.d.ts.map +0 -1
- package/dist/core/ai/provider.js +0 -241
- package/dist/core/ai/provider.js.map +0 -1
- package/dist/core/ai/types.d.ts +0 -43
- package/dist/core/ai/types.d.ts.map +0 -1
- package/dist/core/ai/types.js +0 -5
- package/dist/core/ai/types.js.map +0 -1
- package/dist/core/storage/token-usage.d.ts +0 -36
- package/dist/core/storage/token-usage.d.ts.map +0 -1
- package/dist/core/storage/token-usage.js +0 -59
- package/dist/core/storage/token-usage.js.map +0 -1
- package/dist/core/utils/token-tracker.d.ts +0 -39
- package/dist/core/utils/token-tracker.d.ts.map +0 -1
- package/dist/core/utils/token-tracker.js +0 -69
- package/dist/core/utils/token-tracker.js.map +0 -1
- package/dist/skills/index.d.ts +0 -3
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -3
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/matcher.d.ts +0 -26
- package/dist/skills/matcher.d.ts.map +0 -1
- package/dist/skills/matcher.js +0 -113
- package/dist/skills/matcher.js.map +0 -1
- package/dist/skills/official/code-simplifier.md +0 -52
- package/dist/skills/official/find-skills.md +0 -142
- package/dist/skills/official/official-api-design.md +0 -30
- package/dist/skills/official/official-architecture-decision.md +0 -41
- package/dist/skills/official/official-bmad.md +0 -118
- package/dist/skills/official/official-db-schema-design.md +0 -34
- package/dist/skills/official/official-debug.md +0 -25
- package/dist/skills/official/official-doc-driven.md +0 -31
- package/dist/skills/official/official-harness-engineering.md +0 -108
- package/dist/skills/official/official-performance-optimization.md +0 -30
- package/dist/skills/official/official-pr-review.md +0 -35
- package/dist/skills/official/official-release-checklist.md +0 -30
- package/dist/skills/official/official-security-hardening.md +0 -32
- package/dist/skills/official/official-spec-driven-design.md +0 -31
- package/dist/skills/official/planning-with-files.md +0 -241
- package/dist/skills/official/ui-ux-pro-max.md +0 -105
- package/dist/skills/official/webapp-testing.md +0 -96
- package/dist/skills/official-skills.d.ts +0 -26
- package/dist/skills/official-skills.d.ts.map +0 -1
- package/dist/skills/official-skills.js +0 -73
- package/dist/skills/official-skills.js.map +0 -1
- package/dist/skills/semantic-matcher.d.ts +0 -60
- package/dist/skills/semantic-matcher.d.ts.map +0 -1
- package/dist/skills/semantic-matcher.js +0 -192
- package/dist/skills/semantic-matcher.js.map +0 -1
- package/dist/skills/upgrade-engine.d.ts +0 -93
- package/dist/skills/upgrade-engine.d.ts.map +0 -1
- package/dist/skills/upgrade-engine.js +0 -447
- package/dist/skills/upgrade-engine.js.map +0 -1
- package/dist/skills/upgrade-prompt.d.ts +0 -20
- package/dist/skills/upgrade-prompt.d.ts.map +0 -1
- package/dist/skills/upgrade-prompt.js +0 -75
- package/dist/skills/upgrade-prompt.js.map +0 -1
- package/dist/web/routes/ai.d.ts +0 -10
- package/dist/web/routes/ai.d.ts.map +0 -1
- package/dist/web/routes/ai.js +0 -186
- package/dist/web/routes/ai.js.map +0 -1
- package/dist/web/routes/token-usage.d.ts +0 -7
- package/dist/web/routes/token-usage.d.ts.map +0 -1
- package/dist/web/routes/token-usage.js +0 -18
- package/dist/web/routes/token-usage.js.map +0 -1
- package/dist/web/ssrf-guard.d.ts +0 -35
- package/dist/web/ssrf-guard.d.ts.map +0 -1
- package/dist/web/ssrf-guard.js +0 -93
- package/dist/web/ssrf-guard.js.map +0 -1
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
- package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
- package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
- package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
- package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
- package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
- package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
- package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
- package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
- package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
- package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
- package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
- package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
- package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
- package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
- package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
- package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
- package/dist/web/static/assets/index-CBX47X8l.js +0 -3
- package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
- package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
- package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
- package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
- package/dist/web/static/assets/query-C99w429o.js +0 -2
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
- package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
- package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
- package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
- package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
- package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DecisionHint — formats the [DECISION HINT] systemMessage that daemon emits
|
|
3
|
+
* when a prompt is long enough and passes noise/bypass guards.
|
|
4
|
+
*
|
|
5
|
+
* 2026-05-27 Spec 1702: replaces the deleted `SpecGate.tryAutoGenerate` at
|
|
6
|
+
* step 4.5. Instead of silently generating a spec (0% real-world acceptance),
|
|
7
|
+
* the daemon now emits an explicit hint telling the main thread to spawn the
|
|
8
|
+
* `decision-maker` agent.
|
|
9
|
+
*
|
|
10
|
+
* 2026-05-28 decision-flow-overhaul (spec §5.1):
|
|
11
|
+
* - Added `isSystemGeneratedPrompt()` guard (G9 fix): skip noise prompts
|
|
12
|
+
* injected by daemon itself (<task-notification>, <forge-resume-body>, etc.)
|
|
13
|
+
* - Added `isSkipDecisionKeyword()`: bypass token check for "skip decision"
|
|
14
|
+
* - `emitDecisionHint()` now accepts optional SQLiteStorage + event context
|
|
15
|
+
* and writes a `decisions` table row, returning `{ message, decision_id }`
|
|
16
|
+
* instead of a bare string so UserPromptHandler can embed the id in the hint
|
|
17
|
+
*
|
|
18
|
+
* 2026-05-28 Spec 1200 (daemon decision-layer simplification):
|
|
19
|
+
* - Removed intent dependency — trigger is now pure length check:
|
|
20
|
+
* `prompt.length >= TRIGGER_LEN && !isNoise(prompt) && !hasBypass(prompt)`
|
|
21
|
+
* - TRIGGER_LEN configurable via `forge_config.decision_trigger_len` (default 50)
|
|
22
|
+
*
|
|
23
|
+
* Fail-safe: all errors are caught and return `null`; the pipeline keeps running.
|
|
24
|
+
*/
|
|
25
|
+
import { randomBytes } from 'node:crypto';
|
|
26
|
+
import { logger } from '../../core/utils/logger.js';
|
|
27
|
+
/**
|
|
28
|
+
* Default minimum prompt length to trigger a decision hint.
|
|
29
|
+
*
|
|
30
|
+
* Set to 0 per 用户诉求 "必须要走" — every non-noise / non-bypass prompt routes
|
|
31
|
+
* to decision-maker. Users wanting to cap short prompts can override via
|
|
32
|
+
* `forge_config.decision_trigger_len`.
|
|
33
|
+
*/
|
|
34
|
+
export const DEFAULT_TRIGGER_LEN = 0;
|
|
35
|
+
/** forge_config key for overriding trigger length (spec Q7). */
|
|
36
|
+
export const TRIGGER_LEN_CONFIG_KEY = 'decision_trigger_len';
|
|
37
|
+
/**
|
|
38
|
+
* decision 7aa0ec63 (2026-06-01 Option C) — cooldown configuration.
|
|
39
|
+
*
|
|
40
|
+
* forge_config key for overriding the per-session decision-maker spawn cooldown
|
|
41
|
+
* (in seconds). When the daemon emitted a hint that the main thread satisfied
|
|
42
|
+
* by actually spawning `decision-maker` (visible as a PreToolUse Task event),
|
|
43
|
+
* we suppress further hints for this many seconds. The same session can still
|
|
44
|
+
* spawn a fresh maker by adding "skip decision" or by waiting out the window.
|
|
45
|
+
*
|
|
46
|
+
* Default: 60 s (covers a typical "read decision doc → approve" loop).
|
|
47
|
+
* Sane range: 0 < value <= 3600. Values outside that range fall back to the
|
|
48
|
+
* default; daemon startup logs a warning so users notice typos.
|
|
49
|
+
*/
|
|
50
|
+
export const DECISION_MAKER_COOLDOWN_CONFIG_KEY = 'decision_maker_cooldown_seconds';
|
|
51
|
+
/** Default cooldown when forge_config has no override or holds a bad value. */
|
|
52
|
+
export const DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS = 60;
|
|
53
|
+
/** Hard upper bound for the cooldown override (1 hour). */
|
|
54
|
+
export const MAX_DECISION_MAKER_COOLDOWN_SECONDS = 3600;
|
|
55
|
+
/** Max chars to include in the hint intent summary. */
|
|
56
|
+
const HINT_SUMMARY_MAX = 150;
|
|
57
|
+
/**
|
|
58
|
+
* Pattern for system-generated prompt prefixes (G9 fix).
|
|
59
|
+
*
|
|
60
|
+
* Daemon injects several envelope types into the conversation:
|
|
61
|
+
* - <task-notification> — when a sub-agent starts/finishes
|
|
62
|
+
* - <task-id> — task tracking metadata
|
|
63
|
+
* - <forge-resume-body> — session resume context
|
|
64
|
+
* - <system-reminder> — periodic rule reminder
|
|
65
|
+
* - <local-command-stdout> / <command-message> — shell output
|
|
66
|
+
* - <!-- forge:… — forge magic markers
|
|
67
|
+
*
|
|
68
|
+
* When any of these appear at the start of the prompt, it is daemon-generated
|
|
69
|
+
* and should NOT trigger a decision hint.
|
|
70
|
+
*/
|
|
71
|
+
const SYSTEM_PROMPT_PATTERNS = [
|
|
72
|
+
/^<task-notification>/i,
|
|
73
|
+
/^<task-id>/i,
|
|
74
|
+
/^<forge-resume-body>/i,
|
|
75
|
+
/^<system-reminder>/i,
|
|
76
|
+
/^<local-command-stdout>/i,
|
|
77
|
+
/^<command-message>/i,
|
|
78
|
+
/^<command-name>/i,
|
|
79
|
+
/^<!--\s*forge:/i,
|
|
80
|
+
// Guard against prompts that are ONLY daemon-injected tags (e.g. multi-tag blocks)
|
|
81
|
+
/^\s*<[a-z-]+>\s*$/i,
|
|
82
|
+
];
|
|
83
|
+
/**
|
|
84
|
+
* Returns true when the prompt appears to be daemon-injected content
|
|
85
|
+
* rather than a genuine user message. Guards against G9 false positives
|
|
86
|
+
* where daemon-inserted task-notification blobs triggered [DECISION HINT].
|
|
87
|
+
*/
|
|
88
|
+
export function isSystemGeneratedPrompt(prompt) {
|
|
89
|
+
const trimmed = prompt.trim();
|
|
90
|
+
return SYSTEM_PROMPT_PATTERNS.some(re => re.test(trimmed));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Returns true when the user has included the "skip decision" bypass keyword.
|
|
94
|
+
* This is the OQ3 answer: natural-language bypass (same pattern as
|
|
95
|
+
* bmad-question-default's "直接修" / "skip" escapes).
|
|
96
|
+
*/
|
|
97
|
+
export function isSkipDecisionKeyword(prompt) {
|
|
98
|
+
return /skip\s+decision/i.test(prompt);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Resolve the effective TRIGGER_LEN from forge_config or use the default.
|
|
102
|
+
* Used by UserPromptHandler (Step 4.5) to pass into emitDecisionHintSimple.
|
|
103
|
+
*/
|
|
104
|
+
export function resolveTriggerLen(storage) {
|
|
105
|
+
if (!storage)
|
|
106
|
+
return DEFAULT_TRIGGER_LEN;
|
|
107
|
+
try {
|
|
108
|
+
const raw = storage.readConfig(TRIGGER_LEN_CONFIG_KEY);
|
|
109
|
+
if (raw !== undefined && raw !== null) {
|
|
110
|
+
const n = Number(raw);
|
|
111
|
+
if (Number.isFinite(n) && n >= 0)
|
|
112
|
+
return n;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// fail-silent
|
|
117
|
+
}
|
|
118
|
+
return DEFAULT_TRIGGER_LEN;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* decision 7aa0ec63 (Option C, Q1 + Q6) — resolve the per-session
|
|
122
|
+
* decision-maker spawn cooldown from forge_config, with default fallback.
|
|
123
|
+
*
|
|
124
|
+
* Read from `forge_config.decision_maker_cooldown_seconds`. Values outside
|
|
125
|
+
* `(0, MAX_DECISION_MAKER_COOLDOWN_SECONDS]` are treated as invalid and
|
|
126
|
+
* the default is returned. Caller is expected to log a warn separately when
|
|
127
|
+
* an invalid value is rejected (daemon startup does this once at boot).
|
|
128
|
+
*/
|
|
129
|
+
export function resolveDecisionMakerCooldownSeconds(storage) {
|
|
130
|
+
if (!storage)
|
|
131
|
+
return DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS;
|
|
132
|
+
try {
|
|
133
|
+
const raw = storage.readConfig(DECISION_MAKER_COOLDOWN_CONFIG_KEY);
|
|
134
|
+
if (raw === undefined || raw === null) {
|
|
135
|
+
return DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS;
|
|
136
|
+
}
|
|
137
|
+
const n = Number(raw);
|
|
138
|
+
if (!Number.isFinite(n))
|
|
139
|
+
return DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS;
|
|
140
|
+
if (n <= 0)
|
|
141
|
+
return DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS;
|
|
142
|
+
if (n > MAX_DECISION_MAKER_COOLDOWN_SECONDS) {
|
|
143
|
+
return DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS;
|
|
144
|
+
}
|
|
145
|
+
return n;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* decision 7aa0ec63 (Option C, Q2 + Q6) — session-scoped cooldown check.
|
|
153
|
+
*
|
|
154
|
+
* Returns true when this session spawned `decision-maker` (PreToolUse Task
|
|
155
|
+
* event with `tool_input.subagent_type === 'decision-maker'`) within the last
|
|
156
|
+
* `windowSeconds` seconds. The main thread is currently working through a
|
|
157
|
+
* recent maker output; emitting a fresh hint would just stack pending rows.
|
|
158
|
+
*
|
|
159
|
+
* Source-of-truth = `events` table (per Q6): persistent across daemon restart,
|
|
160
|
+
* trivially injectable in unit tests, and same fixture pattern reused from
|
|
161
|
+
* `findRecentDecisionMakerSpawn` (src/cli/commands/decisions.ts §B). The
|
|
162
|
+
* narrower 60 s window (vs 5 min in approve-governance) targets the actual
|
|
163
|
+
* "back-to-back batch nudge" symptom this gate exists for.
|
|
164
|
+
*
|
|
165
|
+
* Fail-silent — if storage.queryEvents throws, returns false so the regular
|
|
166
|
+
* emit path still runs (better to over-emit than swallow a real decision).
|
|
167
|
+
*/
|
|
168
|
+
export function isWithinDecisionMakerCoolDown(storage, session_id, windowSeconds, nowMs = Date.now()) {
|
|
169
|
+
if (!session_id)
|
|
170
|
+
return false;
|
|
171
|
+
if (!Number.isFinite(windowSeconds) || windowSeconds <= 0)
|
|
172
|
+
return false;
|
|
173
|
+
const sinceIso = new Date(nowMs - windowSeconds * 1000).toISOString();
|
|
174
|
+
try {
|
|
175
|
+
const rows = storage.queryEvents({
|
|
176
|
+
session_id,
|
|
177
|
+
hook_type: 'PreToolUse',
|
|
178
|
+
since: sinceIso,
|
|
179
|
+
limit: 200,
|
|
180
|
+
});
|
|
181
|
+
for (const ev of rows) {
|
|
182
|
+
if ((ev.tool_name ?? '') !== 'Task')
|
|
183
|
+
continue;
|
|
184
|
+
const input = (ev.tool_input ?? {});
|
|
185
|
+
const sub = typeof input['subagent_type'] === 'string' ? input['subagent_type'] : '';
|
|
186
|
+
if (sub === 'decision-maker')
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
// Fail-silent — degrade to "no cooldown" so we still emit. Safer than
|
|
192
|
+
// accidentally suppressing a real decision.
|
|
193
|
+
}
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Main entry point — pure length-based trigger (spec 1200 simplification).
|
|
198
|
+
*
|
|
199
|
+
* Guards (in order):
|
|
200
|
+
* 1. skip-decision bypass keyword
|
|
201
|
+
* 2. prompt.length < TRIGGER_LEN
|
|
202
|
+
* 3. system-generated prompt (G9 fix)
|
|
203
|
+
*
|
|
204
|
+
* When all guards pass:
|
|
205
|
+
* 1. Writes a `decisions` row (status='pending') to the DB (fail-silent)
|
|
206
|
+
* 2. Returns `{ message, decision_id }` — UserPromptHandler splices
|
|
207
|
+
* `decision_id: <id>` into the systemMessage
|
|
208
|
+
*
|
|
209
|
+
* Returns `null` when any guard fires (no DB write, no systemMessage).
|
|
210
|
+
*
|
|
211
|
+
* @param prompt - The raw user prompt text.
|
|
212
|
+
* @param triggerLen - Minimum prompt length (default DEFAULT_TRIGGER_LEN=50).
|
|
213
|
+
* @param storage - Optional SQLiteStorage for persisting the decision row.
|
|
214
|
+
* @param eventContext - Optional event fields for the DB row.
|
|
215
|
+
*/
|
|
216
|
+
export function emitDecisionHintSimple(prompt, triggerLen = DEFAULT_TRIGGER_LEN, storage, eventContext) {
|
|
217
|
+
// Guard: bypass keyword → respect user's wish.
|
|
218
|
+
if (isSkipDecisionKeyword(prompt))
|
|
219
|
+
return null;
|
|
220
|
+
// Guard: short prompts (only enforced if triggerLen > 0; default 0 = always emit).
|
|
221
|
+
if (triggerLen > 0 && prompt.length < triggerLen)
|
|
222
|
+
return null;
|
|
223
|
+
// G9 fix: skip system-generated prompts (daemon-injected envelopes).
|
|
224
|
+
if (isSystemGeneratedPrompt(prompt))
|
|
225
|
+
return null;
|
|
226
|
+
// decision 7aa0ec63 (Option C) — per-session decision-maker spawn cooldown.
|
|
227
|
+
// If the main thread already spawned decision-maker for THIS session within
|
|
228
|
+
// the cooldown window, suppress new hints. The deny gate
|
|
229
|
+
// (decision-hint-pending rule) keeps enforcing the existing pending row;
|
|
230
|
+
// we just stop stacking duplicates while the main thread is mid-flight.
|
|
231
|
+
if (storage && eventContext?.session_id) {
|
|
232
|
+
try {
|
|
233
|
+
const cooldownSeconds = resolveDecisionMakerCooldownSeconds(storage);
|
|
234
|
+
if (isWithinDecisionMakerCoolDown(storage, eventContext.session_id, cooldownSeconds)) {
|
|
235
|
+
logger.debug(`[DecisionHint] gate=cooldown (session=${eventContext.session_id}, ` +
|
|
236
|
+
`window=${cooldownSeconds}s)`);
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (err) {
|
|
241
|
+
logger.debug(`[DecisionHint] cooldown lookup failed (proceeding): ${err}`);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Spec 1944 §8 (trivial filter): drop very short trivial replies (`批准`/
|
|
245
|
+
// `ok`/`继续` …). `&&` with length<TRIVIAL_MAX_LEN avoids killing
|
|
246
|
+
// meaningful short prompts like `rebase`/`fix lint` (not in the keyword
|
|
247
|
+
// regex) or `批准 abc12345` (length ≥ 10).
|
|
248
|
+
if (isLikelyTrivial(prompt) && prompt.length < TRIVIAL_MAX_LEN) {
|
|
249
|
+
logger.debug(`[DecisionHint] gate=trivial keywords-match (len=${prompt.length})`);
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
// Option B (decision b95e0956, 2026-05-29 — Q1+Q2): continuation skip.
|
|
253
|
+
// When the session has ≥3 resolved decisions and the most recent is within
|
|
254
|
+
// 30 min AND the prompt contains a continuation keyword, suppress the new
|
|
255
|
+
// hint. The post-tool-use rule keeps enforcing any still-pending row from
|
|
256
|
+
// earlier, so we don't lose enforcement here — we just stop spamming new
|
|
257
|
+
// decisions for delivery follow-ups like "提交并推送".
|
|
258
|
+
if (storage && eventContext) {
|
|
259
|
+
try {
|
|
260
|
+
const recent = storage.listRecentResolvedDecisions(eventContext.session_id, CONTINUATION_MIN_RESOLVED);
|
|
261
|
+
if (isContinuation(prompt, recent)) {
|
|
262
|
+
logger.debug(`[DecisionHint] gate=continuation (resolved=${recent.length}, prompt len=${prompt.length})`);
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
logger.debug(`[DecisionHint] continuation lookup failed (proceeding): ${err}`);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Spec 1944 §1.5 goal 3 — active pending skip + dedup:
|
|
271
|
+
// • active-skip: if an unresolved pending decision still exists for this
|
|
272
|
+
// session within the active window, suppress the new hint. The deny
|
|
273
|
+
// gate (decision-hint-pending rule) will keep enforcing the existing
|
|
274
|
+
// decision; we just don't pile up duplicate rows.
|
|
275
|
+
// • dedup: same trimmed prompt in the dedup window is a special case of
|
|
276
|
+
// active-skip (it surfaces the diagnostic differently in logs).
|
|
277
|
+
if (storage && eventContext) {
|
|
278
|
+
try {
|
|
279
|
+
const existing = storage.getMostRecentPendingDecision(eventContext.session_id, ACTIVE_PENDING_WINDOW_SECONDS,
|
|
280
|
+
// global-governance Phase 1 (decision 7fa0f2ab): scope active-skip by
|
|
281
|
+
// project so a pending decision in another project on the same session
|
|
282
|
+
// doesn't suppress a legitimately new hint here.
|
|
283
|
+
eventContext.project_path);
|
|
284
|
+
if (existing) {
|
|
285
|
+
const sameTrigger = typeof existing.trigger_prompt === 'string' &&
|
|
286
|
+
normalizePrompt(existing.trigger_prompt) === normalizePrompt(prompt);
|
|
287
|
+
logger.debug(`[DecisionHint] skipped (active pending exists, sameTrigger=${sameTrigger}) id=${existing.id}`);
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
// Fail-silent — fall through to the normal emit path.
|
|
293
|
+
logger.debug(`[DecisionHint] active-skip lookup failed (proceeding): ${err}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
const decision_id = randomBytes(4).toString('hex'); // 8-char hex
|
|
297
|
+
const summary = truncateSummary(prompt);
|
|
298
|
+
// Write decisions row (fail-silent — never block the pipeline).
|
|
299
|
+
if (storage && eventContext) {
|
|
300
|
+
try {
|
|
301
|
+
storage.writeDecision({
|
|
302
|
+
id: decision_id,
|
|
303
|
+
session_id: eventContext.session_id,
|
|
304
|
+
project_path: eventContext.project_path,
|
|
305
|
+
trigger_event_id: eventContext.event_id ?? null,
|
|
306
|
+
trigger_prompt: prompt,
|
|
307
|
+
workflow_type: 'pending', // LLM will classify; daemon no longer pre-classifies
|
|
308
|
+
suggested_agent: 'decision-maker',
|
|
309
|
+
});
|
|
310
|
+
logger.debug(`[DecisionHint] wrote decision row id=${decision_id}`);
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
logger.warn(`[DecisionHint] failed to write decision row (skipped): ${err}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
const message = formatHintMessage('pending', 'decision-maker', summary, decision_id);
|
|
317
|
+
return { message, decision_id };
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Spec 1944 §8 — trivial filter max length. trim() < TRIVIAL_MAX_LEN AND
|
|
321
|
+
* isLikelyTrivial() → guard fires.
|
|
322
|
+
*
|
|
323
|
+
* decision 7aa0ec63 (Option C, Q4): raised 10 → 15. Covers real-world batch
|
|
324
|
+
* controls like `启动 Batch 3 第一项` (15 chars) and `执行第二项` (5 chars) that
|
|
325
|
+
* previously slipped past the length cap. `批准 abc12345` (12 chars) is now
|
|
326
|
+
* also classified trivial, which is the desired behaviour — the matching
|
|
327
|
+
* pending decision row would already be approved by the parallel `cf decisions
|
|
328
|
+
* approve` flow, so no information is lost.
|
|
329
|
+
*/
|
|
330
|
+
const TRIVIAL_MAX_LEN = 15;
|
|
331
|
+
/**
|
|
332
|
+
* Spec 1944 §1.5 — active pending skip window. While any unresolved pending
|
|
333
|
+
* decision row exists within this many seconds for the session, new hints are
|
|
334
|
+
* suppressed (avoids stacking dozens of pending rows). 1h matches the rule
|
|
335
|
+
* gate's own pending-lookup window (`getMostRecentPendingDecision`).
|
|
336
|
+
*/
|
|
337
|
+
const ACTIVE_PENDING_WINDOW_SECONDS = 3600;
|
|
338
|
+
function normalizePrompt(text) {
|
|
339
|
+
return text.replace(/\s+/g, ' ').trim();
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Returns true when the prompt is likely trivial (a simple approval or
|
|
343
|
+
* one-word command) and can skip the full decision-maker workflow.
|
|
344
|
+
*
|
|
345
|
+
* Two conditions — BOTH must be true to avoid false positives:
|
|
346
|
+
* 1. prompt length < 50 chars (short enough to be trivial)
|
|
347
|
+
* 2. Starts with or consists of a trivial keyword
|
|
348
|
+
*
|
|
349
|
+
* Used by formatHintMessage to suggest model=haiku for trivial prompts.
|
|
350
|
+
* The decision-maker template Step 0 uses a tighter threshold (< 30 chars)
|
|
351
|
+
* for its own fast-exit — this function uses 50 for the daemon-side hint
|
|
352
|
+
* to bias toward haiku earlier in the pipeline.
|
|
353
|
+
*
|
|
354
|
+
* Option B (decision b95e0956, 2026-05-29 — Q1): keyword set expanded to
|
|
355
|
+
* cover the real-world "continuation" short prompts that previously slipped
|
|
356
|
+
* through and forced a [DECISION HINT] emit for trivial follow-ups:
|
|
357
|
+
* added: 提交 / 推送 / push / commit / 那就 / 修复吧 / 启动吧 / 开始 /
|
|
358
|
+
* 搞 / 做 / 开干 / 接着做 / 继续做
|
|
359
|
+
* Original list (好/对/是/继续/批准/approve/yes/ok/skip/确认/确定/go/
|
|
360
|
+
* proceed/done/完成/可以) preserved — additive expansion.
|
|
361
|
+
*
|
|
362
|
+
* @param s - The intent summary or raw prompt.
|
|
363
|
+
*/
|
|
364
|
+
export function isLikelyTrivial(s) {
|
|
365
|
+
if (s.length >= 50)
|
|
366
|
+
return false;
|
|
367
|
+
const trimmed = s.trim();
|
|
368
|
+
if (!trimmed)
|
|
369
|
+
return false;
|
|
370
|
+
// decision 7aa0ec63 (Option C, Q3) — greeting/informational extension.
|
|
371
|
+
// Greetings ("hi" / "hello" / "say hi" / "say hello" / "你好") are trivial
|
|
372
|
+
// regardless of exact wording, and short prompts ending in `?` / `?` are
|
|
373
|
+
// informational queries that the main thread should answer directly without
|
|
374
|
+
// going through decision-maker. Note: ASCII greetings require an end or
|
|
375
|
+
// non-word boundary (avoid matching `hint…` / `hire …`); CJK `你好` is
|
|
376
|
+
// checked separately because JS `\b` is ASCII-only.
|
|
377
|
+
if (/^你好/.test(trimmed))
|
|
378
|
+
return true;
|
|
379
|
+
if (/^(say\s+hi|say\s+hello)\b/i.test(trimmed))
|
|
380
|
+
return true;
|
|
381
|
+
if (/^(hi|hello)(\b|$)/i.test(trimmed))
|
|
382
|
+
return true;
|
|
383
|
+
if (trimmed.length < 30 && /[??]\s*$/.test(trimmed))
|
|
384
|
+
return true;
|
|
385
|
+
// decision 7aa0ec63 (Option C, Q3) — batch-control verbs commonly used as
|
|
386
|
+
// continuation triggers (`启动 Batch 3`, `执行第二项`, `查看 KB`, `批准 X`).
|
|
387
|
+
// Kept additive to the prior keyword set (b95e0956); nothing is removed.
|
|
388
|
+
return /^(好|对|是|继续|批准|approve|yes|ok|skip|确认|确定|go|proceed|done|完成|可以|提交|推送|push|commit|那就|修复吧|启动吧|开始|搞|做|开干|接着做|继续做|启动|执行|查看|看看)/i.test(trimmed);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Option B (decision b95e0956, 2026-05-29 — Q1+Q2) — "continuation" prompt
|
|
392
|
+
* detection.
|
|
393
|
+
*
|
|
394
|
+
* Returns true when the current prompt is plausibly a continuation of recent
|
|
395
|
+
* decided work and should NOT trigger a fresh [DECISION HINT].
|
|
396
|
+
*
|
|
397
|
+
* Q2 contract: **both** conditions must hold (AND, not OR):
|
|
398
|
+
* 1. There are at least `CONTINUATION_MIN_RESOLVED` (=3) resolved decisions
|
|
399
|
+
* for this session AND
|
|
400
|
+
* 2. The most recent resolved one is within `CONTINUATION_WINDOW_MS`
|
|
401
|
+
* (=30 min)
|
|
402
|
+
*
|
|
403
|
+
* AND the current prompt itself must look continuation-flavoured — i.e.
|
|
404
|
+
* contain one of the Q1 recommended keywords. This avoids classifying a
|
|
405
|
+
* genuinely fresh long task as a continuation just because the session has
|
|
406
|
+
* been busy.
|
|
407
|
+
*
|
|
408
|
+
* @param prompt - The raw user prompt text.
|
|
409
|
+
* @param recentResolved - Output of `listRecentResolvedDecisions` for this
|
|
410
|
+
* session (any length; newest first).
|
|
411
|
+
* @param nowMs - Override clock for tests (defaults to Date.now()).
|
|
412
|
+
*/
|
|
413
|
+
export const CONTINUATION_WINDOW_MS = 30 * 60 * 1000; // 30 minutes
|
|
414
|
+
export const CONTINUATION_MIN_RESOLVED = 3;
|
|
415
|
+
/** Q1 keyword set used by isContinuation (subset of isLikelyTrivial). */
|
|
416
|
+
const CONTINUATION_KEYWORDS_RE = /(提交|推送|push|commit|那就|修复吧|启动吧|开始|搞|做|开干|继续|接着做|ok|好)/i;
|
|
417
|
+
export function isContinuation(prompt, recentResolved, nowMs = Date.now()) {
|
|
418
|
+
if (!prompt)
|
|
419
|
+
return false;
|
|
420
|
+
if (!Array.isArray(recentResolved))
|
|
421
|
+
return false;
|
|
422
|
+
// Q2 (count condition)
|
|
423
|
+
if (recentResolved.length < CONTINUATION_MIN_RESOLVED)
|
|
424
|
+
return false;
|
|
425
|
+
// Q2 (time-window condition)
|
|
426
|
+
const newest = recentResolved[0];
|
|
427
|
+
if (!newest)
|
|
428
|
+
return false;
|
|
429
|
+
const ts = newest.resolved_at ?? newest.created_at;
|
|
430
|
+
if (!ts)
|
|
431
|
+
return false;
|
|
432
|
+
const tsMs = Date.parse(ts);
|
|
433
|
+
if (!Number.isFinite(tsMs))
|
|
434
|
+
return false;
|
|
435
|
+
if (nowMs - tsMs > CONTINUATION_WINDOW_MS)
|
|
436
|
+
return false;
|
|
437
|
+
// Keyword condition — must look continuation-flavoured to count.
|
|
438
|
+
return CONTINUATION_KEYWORDS_RE.test(prompt.trim());
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Formats the hint message body. Kept separate for unit-test readability.
|
|
442
|
+
*
|
|
443
|
+
* The message tells the main thread:
|
|
444
|
+
* 1. That daemon classified this as decision-worthy
|
|
445
|
+
* 2. The suggested agent to spawn
|
|
446
|
+
* 3. A concrete Task tool command the main thread can copy-paste
|
|
447
|
+
* 4. The decision_id magic marker (OQ5) for DB tracking
|
|
448
|
+
* 5. Suggested model (haiku for trivial, sonnet for complex)
|
|
449
|
+
*
|
|
450
|
+
* Output contains `[DECISION HINT]` prefix so CLAUDE.md rule can detect it
|
|
451
|
+
* and enforce the spawn (R2 mitigation in spec 1702 § 9).
|
|
452
|
+
*/
|
|
453
|
+
export function formatHintMessage(workflowType, suggestedAgent, intentSummary, decision_id) {
|
|
454
|
+
const suggestedModel = isLikelyTrivial(intentSummary) ? 'haiku' : 'sonnet';
|
|
455
|
+
const lines = [
|
|
456
|
+
'[DECISION HINT]',
|
|
457
|
+
'',
|
|
458
|
+
`daemon 检测到本 prompt 超过阈值,属于值得决策的任务。`,
|
|
459
|
+
`建议主线程 spawn \`decision-maker\` agent 出"决策建议"再决定 how to proceed:`,
|
|
460
|
+
'',
|
|
461
|
+
`Task tool subagent_type='decision-maker' with prompt: "${intentSummary}"`,
|
|
462
|
+
'',
|
|
463
|
+
`decision-maker agent 会:`,
|
|
464
|
+
` 1. 查 KB 理解项目背景`,
|
|
465
|
+
` 2. 读 skill catalog,选 1-3 个相关 skill`,
|
|
466
|
+
` 3. 读 agent catalog,选推荐 implementation agent`,
|
|
467
|
+
` 4. 列 2-3 方案 + pros/cons + LOC 估算`,
|
|
468
|
+
` 5. cf decisions update 持久化方案 + 推荐 agent/skill`,
|
|
469
|
+
'',
|
|
470
|
+
`建议 model:\`${suggestedModel}\`(trivial 用 haiku 加速,complex 用 sonnet 保质)`,
|
|
471
|
+
`如果已经知道要做什么,直接告知并忽略本提示即可。`,
|
|
472
|
+
`原推荐 agent: \`${suggestedAgent}\``,
|
|
473
|
+
];
|
|
474
|
+
if (decision_id) {
|
|
475
|
+
lines.push('');
|
|
476
|
+
lines.push(`<!-- decision-id: ${decision_id} -->`);
|
|
477
|
+
lines.push(`bypass: 在 prompt 中加 "skip decision" 跳过决策流程。`);
|
|
478
|
+
}
|
|
479
|
+
return lines.join('\n');
|
|
480
|
+
}
|
|
481
|
+
function truncateSummary(text) {
|
|
482
|
+
const oneLine = text.replace(/\s+/g, ' ').trim();
|
|
483
|
+
if (oneLine.length <= HINT_SUMMARY_MAX)
|
|
484
|
+
return oneLine;
|
|
485
|
+
return oneLine.slice(0, HINT_SUMMARY_MAX - 1) + '…';
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=decision-hint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decision-hint.js","sourceRoot":"","sources":["../../../src/daemon/services/decision-hint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* event-ttl-sweep — two-tier TTL maintenance for `events` (db-size optimization).
|
|
3
|
+
*
|
|
4
|
+
* Background
|
|
5
|
+
* ----------
|
|
6
|
+
* The live DB (~274 MB, 240 MB in `events`) was unbounded growth: ~17 MB/day,
|
|
7
|
+
* ~6 GB/yr at the current rate. After Batch F redaction the
|
|
8
|
+
* `tool_input_summary` (on `tool_intercepts`) carries the user-actionable bits
|
|
9
|
+
* of every intercepted tool call; raw `events.tool_input` is mostly dead
|
|
10
|
+
* weight after a week.
|
|
11
|
+
*
|
|
12
|
+
* Policy (configurable via forge_config):
|
|
13
|
+
* - warm TTL (default 7d): rows older than this get `tool_input = NULL`.
|
|
14
|
+
* Other event fields stay so analytics / dashboards still render.
|
|
15
|
+
* - cold TTL (default 30d): rows older than this DELETEd entirely
|
|
16
|
+
* (plus orphan task_events rows pruned).
|
|
17
|
+
*
|
|
18
|
+
* Run cadence: `events.sweep_interval_hours` (default 6h), scheduled by the
|
|
19
|
+
* daemon alongside the existing maintenance intervals. Capped at SWEEP_MAX_ROWS
|
|
20
|
+
* per pass to keep the SQLite writer lock short; if a pass hits the cap the
|
|
21
|
+
* next tick picks up the rest.
|
|
22
|
+
*
|
|
23
|
+
* Design notes
|
|
24
|
+
* ------------
|
|
25
|
+
* - Cold sweep runs FIRST (DELETEs free pages before warm UPDATE could touch
|
|
26
|
+
* the same rows — saves one pass).
|
|
27
|
+
* - Both ops live in EventOperations to honor the "no db.prepare outside
|
|
28
|
+
* Operations" rule (base.ts:402).
|
|
29
|
+
* - `tool_input_summary` is on `tool_intercepts`, not `events` — left
|
|
30
|
+
* untouched here, surviving as the post-TTL fallback for rule audits.
|
|
31
|
+
*/
|
|
32
|
+
import type { SQLiteStorage } from '../../core/storage/sqlite.js';
|
|
33
|
+
import type { ConfigStore } from '../config-store.js';
|
|
34
|
+
export interface SweepConfig {
|
|
35
|
+
/** Defaults to `events.warm_ttl_days` config (default 7). */
|
|
36
|
+
warmTtlDays?: number;
|
|
37
|
+
/** Defaults to `events.cold_ttl_days` config (default 30). */
|
|
38
|
+
coldTtlDays?: number;
|
|
39
|
+
/** Maximum rows touched per pass (per operation). Defaults to SWEEP_MAX_ROWS. */
|
|
40
|
+
maxRowsPerPass?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface SweepResult {
|
|
43
|
+
/** Number of rows whose `tool_input` was NULLed in this pass. */
|
|
44
|
+
warmedNull: number;
|
|
45
|
+
/** Number of events rows DELETEd in this pass. */
|
|
46
|
+
coldDeleted: number;
|
|
47
|
+
/** Number of task_events orphan rows pruned during the cold DELETE. */
|
|
48
|
+
taskEventsPruned: number;
|
|
49
|
+
/** Number of free pages reclaimed by incremental_vacuum at end of sweep. */
|
|
50
|
+
pagesReclaimed: number;
|
|
51
|
+
/** True if either op hit `maxRowsPerPass` — caller should re-run sooner. */
|
|
52
|
+
morePending: boolean;
|
|
53
|
+
}
|
|
54
|
+
/** Default rows-per-pass cap. Tuned to ~few-seconds writer-lock budget. */
|
|
55
|
+
export declare const SWEEP_MAX_ROWS = 10000;
|
|
56
|
+
/** Config keys this service consults. */
|
|
57
|
+
export declare const CFG_WARM_TTL = "events.warm_ttl_days";
|
|
58
|
+
export declare const CFG_COLD_TTL = "events.cold_ttl_days";
|
|
59
|
+
export declare const CFG_SWEEP_INTERVAL = "events.sweep_interval_hours";
|
|
60
|
+
/** Default values seeded into forge_config on daemon startup. */
|
|
61
|
+
export declare const DEFAULTS: {
|
|
62
|
+
readonly warmTtlDays: 7;
|
|
63
|
+
readonly coldTtlDays: 30;
|
|
64
|
+
readonly sweepIntervalHours: 6;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Resolve effective TTL params from explicit opts > forge_config > defaults.
|
|
68
|
+
* Exported for tests.
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolveSweepConfig(configStore: ConfigStore, opts?: SweepConfig): {
|
|
71
|
+
warmTtlDays: number;
|
|
72
|
+
coldTtlDays: number;
|
|
73
|
+
maxRowsPerPass: number;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Run one TTL sweep pass. Idempotent; safe to call repeatedly.
|
|
77
|
+
*
|
|
78
|
+
* Order:
|
|
79
|
+
* 1) cold DELETE (rows >= coldTtlDays) — frees pages first
|
|
80
|
+
* 2) warm UPDATE (rows >= warmTtlDays AND tool_input IS NOT NULL)
|
|
81
|
+
*
|
|
82
|
+
* Returns counters + a `morePending` hint so the caller knows when to skip
|
|
83
|
+
* waiting a full interval for the next pass.
|
|
84
|
+
*/
|
|
85
|
+
export declare function sweepEventTtl(storage: SQLiteStorage, configStore: ConfigStore, opts?: SweepConfig): SweepResult;
|
|
86
|
+
//# sourceMappingURL=event-ttl-sweep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-ttl-sweep.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/event-ttl-sweep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,gBAAgB,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,cAAc,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,2EAA2E;AAC3E,eAAO,MAAM,cAAc,QAAS,CAAC;AAErC,yCAAyC;AACzC,eAAO,MAAM,YAAY,yBAAyB,CAAC;AACnD,eAAO,MAAM,YAAY,yBAAyB,CAAC;AACnD,eAAO,MAAM,kBAAkB,gCAAgC,CAAC;AAEhE,iEAAiE;AACjE,eAAO,MAAM,QAAQ;;;;CAIX,CAAC;AAWX;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,GAAE,WAAgB,GAAG;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB,CAeA;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,WAAW,EACxB,IAAI,GAAE,WAAgB,GACrB,WAAW,CAwCb"}
|