@winspan/claude-forge 8.54.4 → 9.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPMENT.md +649 -33
- package/README.md +154 -16
- package/dist/catalogs/agents.json +72 -0
- package/dist/catalogs/skills.json +194 -0
- package/dist/claudemd/claudemd-generator.d.ts +45 -45
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +128 -449
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/index.d.ts +14 -4
- package/dist/claudemd/index.d.ts.map +1 -1
- package/dist/claudemd/index.js +15 -4
- package/dist/claudemd/index.js.map +1 -1
- package/dist/claudemd/resume-manager.d.ts.map +1 -1
- package/dist/claudemd/resume-manager.js +37 -9
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/templates/swarm-protocol.md +35 -186
- package/dist/claudemd/violations-manager.d.ts +40 -0
- package/dist/claudemd/violations-manager.d.ts.map +1 -0
- package/dist/claudemd/violations-manager.js +106 -0
- package/dist/claudemd/violations-manager.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +15 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +177 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +18 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +160 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/bypass.d.ts +18 -0
- package/dist/cli/commands/bypass.d.ts.map +1 -0
- package/dist/cli/commands/bypass.js +87 -0
- package/dist/cli/commands/bypass.js.map +1 -0
- package/dist/cli/commands/claudemd.d.ts +60 -0
- package/dist/cli/commands/claudemd.d.ts.map +1 -1
- package/dist/cli/commands/claudemd.js +174 -37
- package/dist/cli/commands/claudemd.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +94 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +39 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +167 -20
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/decisions.d.ts +129 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +669 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +124 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/entropy.d.ts +35 -0
- package/dist/cli/commands/entropy.d.ts.map +1 -0
- package/dist/cli/commands/entropy.js +121 -0
- package/dist/cli/commands/entropy.js.map +1 -0
- package/dist/cli/commands/executions.d.ts +1 -0
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +10 -1
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/fix.d.ts +31 -0
- package/dist/cli/commands/fix.d.ts.map +1 -0
- package/dist/cli/commands/fix.js +108 -0
- package/dist/cli/commands/fix.js.map +1 -0
- package/dist/cli/commands/governance.d.ts +21 -0
- package/dist/cli/commands/governance.d.ts.map +1 -0
- package/dist/cli/commands/governance.js +60 -0
- package/dist/cli/commands/governance.js.map +1 -0
- package/dist/cli/commands/init.d.ts +27 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +158 -146
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +50 -0
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
- package/dist/cli/commands/insights-goal-check.js +318 -0
- package/dist/cli/commands/insights-goal-check.js.map +1 -0
- package/dist/cli/commands/insights.d.ts +15 -0
- package/dist/cli/commands/insights.d.ts.map +1 -0
- package/dist/cli/commands/insights.js +127 -0
- package/dist/cli/commands/insights.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +66 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +897 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +0 -12
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +11 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/menu.d.ts.map +1 -1
- package/dist/cli/commands/menu.js +10 -184
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/project.d.ts +98 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +382 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +14 -128
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +40 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +49 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +3 -2
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +17 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/trace.d.ts.map +1 -1
- package/dist/cli/commands/trace.js +4 -9
- package/dist/cli/commands/trace.js.map +1 -1
- package/dist/cli/commands/violations.d.ts +14 -0
- package/dist/cli/commands/violations.d.ts.map +1 -0
- package/dist/cli/commands/violations.js +43 -0
- package/dist/cli/commands/violations.js.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/hook-manager.d.ts +1 -1
- package/dist/cli/init/hook-manager.d.ts.map +1 -1
- package/dist/cli/init/hook-manager.js +6 -0
- package/dist/cli/init/hook-manager.js.map +1 -1
- package/dist/cli/utils/resolve-session.d.ts +32 -0
- package/dist/cli/utils/resolve-session.d.ts.map +1 -0
- package/dist/cli/utils/resolve-session.js +39 -0
- package/dist/cli/utils/resolve-session.js.map +1 -0
- package/dist/core/config.d.ts +4 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +11 -23
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +14 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +20 -13
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts +151 -0
- package/dist/core/diagnostics/checks.d.ts.map +1 -0
- package/dist/core/diagnostics/checks.js +765 -0
- package/dist/core/diagnostics/checks.js.map +1 -0
- package/dist/core/diagnostics/daemon-status.d.ts +77 -0
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
- package/dist/core/diagnostics/daemon-status.js +113 -0
- package/dist/core/diagnostics/daemon-status.js.map +1 -0
- package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
- package/dist/core/diagnostics/entropy-checks.js +395 -0
- package/dist/core/diagnostics/entropy-checks.js.map +1 -0
- package/dist/core/diagnostics/fix-runner.d.ts +54 -0
- package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/fix-runner.js +90 -0
- package/dist/core/diagnostics/fix-runner.js.map +1 -0
- package/dist/core/diagnostics/knip-runner.d.ts +49 -0
- package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/knip-runner.js +100 -0
- package/dist/core/diagnostics/knip-runner.js.map +1 -0
- package/dist/core/diagnostics/markers.d.ts +96 -0
- package/dist/core/diagnostics/markers.d.ts.map +1 -0
- package/dist/core/diagnostics/markers.js +153 -0
- package/dist/core/diagnostics/markers.js.map +1 -0
- package/dist/core/governance/global-inject.d.ts +60 -0
- package/dist/core/governance/global-inject.d.ts.map +1 -0
- package/dist/core/governance/global-inject.js +129 -0
- package/dist/core/governance/global-inject.js.map +1 -0
- package/dist/core/queue/index.d.ts +16 -3
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +14 -3
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +158 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +570 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
- package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
- package/dist/core/storage/codec/tool-input-codec.js +159 -0
- package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +362 -0
- package/dist/core/storage/decisions.d.ts.map +1 -0
- package/dist/core/storage/decisions.js +502 -0
- package/dist/core/storage/decisions.js.map +1 -0
- package/dist/core/storage/events.d.ts +112 -8
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +390 -39
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +131 -0
- package/dist/core/storage/feedback.d.ts.map +1 -0
- package/dist/core/storage/feedback.js +187 -0
- package/dist/core/storage/feedback.js.map +1 -0
- package/dist/core/storage/forge-config.d.ts +40 -0
- package/dist/core/storage/forge-config.d.ts.map +1 -0
- package/dist/core/storage/forge-config.js +65 -0
- package/dist/core/storage/forge-config.js.map +1 -0
- package/dist/core/storage/injections.d.ts +28 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +62 -5
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +106 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -0
- package/dist/core/storage/knowledge.js +202 -0
- package/dist/core/storage/knowledge.js.map +1 -0
- package/dist/core/storage/maintenance.d.ts +36 -9
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +56 -24
- package/dist/core/storage/maintenance.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +117 -0
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
- package/dist/core/storage/pipeline-rollup.js +471 -0
- package/dist/core/storage/pipeline-rollup.js.map +1 -0
- package/dist/core/storage/routing.d.ts +16 -3
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +39 -8
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +50 -7
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +302 -23
- package/dist/core/storage/sessions.d.ts +136 -0
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +351 -15
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +1 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +21 -6
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +253 -20
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +425 -16
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +474 -2
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +1213 -18
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +69 -0
- package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
- package/dist/core/storage/tool-intercepts.js +116 -0
- package/dist/core/storage/tool-intercepts.js.map +1 -0
- package/dist/core/storage/workflow-recommendations.d.ts +124 -0
- package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
- package/dist/core/storage/workflow-recommendations.js +274 -0
- package/dist/core/storage/workflow-recommendations.js.map +1 -0
- package/dist/core/types.d.ts +112 -17
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +12 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/backup.d.ts +81 -0
- package/dist/core/utils/backup.d.ts.map +1 -0
- package/dist/core/utils/backup.js +98 -0
- package/dist/core/utils/backup.js.map +1 -0
- package/dist/core/utils/binary-paths.d.ts +92 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -0
- package/dist/core/utils/binary-paths.js +166 -0
- package/dist/core/utils/binary-paths.js.map +1 -0
- package/dist/core/utils/bypass-token.d.ts +75 -0
- package/dist/core/utils/bypass-token.d.ts.map +1 -0
- package/dist/core/utils/bypass-token.js +133 -0
- package/dist/core/utils/bypass-token.js.map +1 -0
- package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
- package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
- package/dist/core/utils/cc-builtin-agents.js +29 -0
- package/dist/core/utils/cc-builtin-agents.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
- package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
- package/dist/core/utils/claude-cli-spawn.js +219 -0
- package/dist/core/utils/claude-cli-spawn.js.map +1 -0
- package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
- package/dist/core/utils/forge-resume-block.js +3 -2
- package/dist/core/utils/forge-resume-block.js.map +1 -1
- package/dist/core/utils/logger.d.ts +15 -3
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +20 -2
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +97 -0
- package/dist/core/utils/noise-prompt.d.ts.map +1 -0
- package/dist/core/utils/noise-prompt.js +127 -0
- package/dist/core/utils/noise-prompt.js.map +1 -0
- package/dist/core/utils/path.d.ts +0 -4
- package/dist/core/utils/path.d.ts.map +1 -1
- package/dist/core/utils/path.js +0 -7
- package/dist/core/utils/path.js.map +1 -1
- package/dist/core/utils/time.d.ts +41 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +114 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/agent-sync.d.ts +24 -0
- package/dist/daemon/agent-sync.d.ts.map +1 -0
- package/dist/daemon/agent-sync.js +114 -0
- package/dist/daemon/agent-sync.js.map +1 -0
- package/dist/daemon/config-store.d.ts +55 -0
- package/dist/daemon/config-store.d.ts.map +1 -0
- package/dist/daemon/config-store.js +137 -0
- package/dist/daemon/config-store.js.map +1 -0
- package/dist/daemon/event-parser.d.ts +22 -0
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +49 -3
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
- package/dist/daemon/handlers/history-exporter.js +9 -8
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +261 -8
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
- package/dist/daemon/handlers/pre-tool-use.js +585 -0
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
- package/dist/daemon/handlers/stop.d.ts +35 -7
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +157 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +36 -14
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +135 -48
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/hook-sync.d.ts.map +1 -1
- package/dist/daemon/hook-sync.js +2 -1
- package/dist/daemon/hook-sync.js.map +1 -1
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +471 -43
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/lifecycle.d.ts +48 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +98 -2
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/router.d.ts +4 -1
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +4 -2
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts +20 -0
- package/dist/daemon/rules/defaults.d.ts.map +1 -0
- package/dist/daemon/rules/defaults.js +692 -0
- package/dist/daemon/rules/defaults.js.map +1 -0
- package/dist/daemon/rules/registry.d.ts +47 -0
- package/dist/daemon/rules/registry.d.ts.map +1 -0
- package/dist/daemon/rules/registry.js +84 -0
- package/dist/daemon/rules/registry.js.map +1 -0
- package/dist/daemon/rules/types.d.ts +170 -0
- package/dist/daemon/rules/types.d.ts.map +1 -0
- package/dist/daemon/rules/types.js +15 -0
- package/dist/daemon/rules/types.js.map +1 -0
- package/dist/daemon/rules/whitelist.d.ts +101 -0
- package/dist/daemon/rules/whitelist.d.ts.map +1 -0
- package/dist/daemon/rules/whitelist.js +210 -0
- package/dist/daemon/rules/whitelist.js.map +1 -0
- package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
- package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
- package/dist/daemon/rules/workflow-defaults.js +521 -0
- package/dist/daemon/rules/workflow-defaults.js.map +1 -0
- package/dist/daemon/server.d.ts +11 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +7 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/context-injector.d.ts +34 -0
- package/dist/daemon/services/context-injector.d.ts.map +1 -0
- package/dist/daemon/services/context-injector.js +61 -0
- package/dist/daemon/services/context-injector.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +203 -0
- package/dist/daemon/services/decision-hint.d.ts.map +1 -0
- package/dist/daemon/services/decision-hint.js +487 -0
- package/dist/daemon/services/decision-hint.js.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.js +123 -0
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
- package/dist/daemon/services/experience-extractor.d.ts +67 -0
- package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
- package/dist/daemon/services/experience-extractor.js +323 -0
- package/dist/daemon/services/experience-extractor.js.map +1 -0
- package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
- package/dist/daemon/services/feedback-aggregator.js +455 -0
- package/dist/daemon/services/feedback-aggregator.js.map +1 -0
- package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
- package/dist/daemon/services/heartbeat-writer.js +111 -0
- package/dist/daemon/services/heartbeat-writer.js.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.js +94 -0
- package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
- package/dist/daemon/services/idle-task-budget.d.ts +50 -0
- package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
- package/dist/daemon/services/idle-task-budget.js +72 -0
- package/dist/daemon/services/idle-task-budget.js.map +1 -0
- package/dist/daemon/services/intercept-revive.d.ts +60 -0
- package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
- package/dist/daemon/services/intercept-revive.js +86 -0
- package/dist/daemon/services/intercept-revive.js.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.js +152 -0
- package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
- package/dist/daemon/services/kb-injector.d.ts +57 -0
- package/dist/daemon/services/kb-injector.d.ts.map +1 -0
- package/dist/daemon/services/kb-injector.js +140 -0
- package/dist/daemon/services/kb-injector.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
- package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +214 -0
- package/dist/daemon/services/outcome-classification-service.js.map +1 -0
- package/dist/daemon/services/outcome-classifier.d.ts +136 -0
- package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classifier.js +178 -0
- package/dist/daemon/services/outcome-classifier.js.map +1 -0
- package/dist/daemon/services/outcome-nudge.d.ts +107 -0
- package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
- package/dist/daemon/services/outcome-nudge.js +242 -0
- package/dist/daemon/services/outcome-nudge.js.map +1 -0
- package/dist/daemon/services/spec-approval.d.ts +127 -0
- package/dist/daemon/services/spec-approval.d.ts.map +1 -0
- package/dist/daemon/services/spec-approval.js +216 -0
- package/dist/daemon/services/spec-approval.js.map +1 -0
- package/dist/daemon/services/spec-gate.d.ts +54 -0
- package/dist/daemon/services/spec-gate.d.ts.map +1 -0
- package/dist/daemon/services/spec-gate.js +113 -0
- package/dist/daemon/services/spec-gate.js.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.js +202 -0
- package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
- package/dist/daemon/services/task-segmenter.d.ts +219 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +481 -17
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/services/violation-reporter.d.ts +130 -0
- package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
- package/dist/daemon/services/violation-reporter.js +339 -0
- package/dist/daemon/services/violation-reporter.js.map +1 -0
- package/dist/daemon/skill-sync.d.ts +7 -2
- package/dist/daemon/skill-sync.d.ts.map +1 -1
- package/dist/daemon/skill-sync.js +114 -9
- package/dist/daemon/skill-sync.js.map +1 -1
- package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
- package/dist/daemon/templates/agents/coder.md +105 -0
- package/dist/daemon/templates/agents/decision-maker.md +460 -0
- package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
- package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
- package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
- package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
- package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
- package/dist/daemon/templates/agents/patch-applier.md +144 -0
- package/dist/daemon/templates/agents/planner.md +165 -0
- package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
- package/dist/daemon/templates/agents/skill-distiller.md +113 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
- package/dist/daemon/templates/agents/verify-agent.md +136 -0
- package/dist/daemon/utils/inject-block.d.ts +39 -0
- package/dist/daemon/utils/inject-block.d.ts.map +1 -0
- package/dist/daemon/utils/inject-block.js +25 -0
- package/dist/daemon/utils/inject-block.js.map +1 -0
- package/dist/hooks/hook-lib.sh +8 -0
- package/dist/hooks/notification.sh +19 -8
- package/dist/hooks/post-tool-use.sh +41 -23
- package/dist/hooks/pre-tool-use.sh +54 -23
- package/dist/hooks/session-start.sh +68 -0
- package/dist/hooks/stop.sh +24 -10
- package/dist/hooks/user-prompt-submit.sh +37 -21
- package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
- package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/go-adapter.js +294 -0
- package/dist/knowledge/adapters/go-adapter.js.map +1 -0
- package/dist/knowledge/adapters/index.d.ts +41 -0
- package/dist/knowledge/adapters/index.d.ts.map +1 -0
- package/dist/knowledge/adapters/index.js +71 -0
- package/dist/knowledge/adapters/index.js.map +1 -0
- package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
- package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/java-adapter.js +260 -0
- package/dist/knowledge/adapters/java-adapter.js.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
- package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
- package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
- package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
- package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
- package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/python-adapter.js +358 -0
- package/dist/knowledge/adapters/python-adapter.js.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.js +329 -0
- package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
- package/dist/knowledge/adapters/types.d.ts +99 -0
- package/dist/knowledge/adapters/types.d.ts.map +1 -0
- package/dist/knowledge/adapters/types.js +17 -0
- package/dist/knowledge/adapters/types.js.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.js +171 -0
- package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
- package/dist/knowledge/audit-applier.d.ts +70 -0
- package/dist/knowledge/audit-applier.d.ts.map +1 -0
- package/dist/knowledge/audit-applier.js +251 -0
- package/dist/knowledge/audit-applier.js.map +1 -0
- package/dist/knowledge/builder.d.ts +261 -0
- package/dist/knowledge/builder.d.ts.map +1 -0
- package/dist/knowledge/builder.js +937 -0
- package/dist/knowledge/builder.js.map +1 -0
- package/dist/knowledge/cli-provider.d.ts +151 -0
- package/dist/knowledge/cli-provider.d.ts.map +1 -0
- package/dist/knowledge/cli-provider.js +313 -0
- package/dist/knowledge/cli-provider.js.map +1 -0
- package/dist/knowledge/constants.d.ts +73 -0
- package/dist/knowledge/constants.d.ts.map +1 -0
- package/dist/knowledge/constants.js +93 -0
- package/dist/knowledge/constants.js.map +1 -0
- package/dist/knowledge/cross-module.d.ts +139 -0
- package/dist/knowledge/cross-module.d.ts.map +1 -0
- package/dist/knowledge/cross-module.js +370 -0
- package/dist/knowledge/cross-module.js.map +1 -0
- package/dist/knowledge/git-hooks.d.ts +67 -0
- package/dist/knowledge/git-hooks.d.ts.map +1 -0
- package/dist/knowledge/git-hooks.js +258 -0
- package/dist/knowledge/git-hooks.js.map +1 -0
- package/dist/knowledge/module-hash.d.ts +88 -0
- package/dist/knowledge/module-hash.d.ts.map +1 -0
- package/dist/knowledge/module-hash.js +162 -0
- package/dist/knowledge/module-hash.js.map +1 -0
- package/dist/knowledge/project-detector.d.ts +101 -0
- package/dist/knowledge/project-detector.d.ts.map +1 -0
- package/dist/knowledge/project-detector.js +223 -0
- package/dist/knowledge/project-detector.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +228 -0
- package/dist/knowledge/prompt.d.ts.map +1 -0
- package/dist/knowledge/prompt.js +404 -0
- package/dist/knowledge/prompt.js.map +1 -0
- package/dist/knowledge/query.d.ts +105 -0
- package/dist/knowledge/query.d.ts.map +1 -0
- package/dist/knowledge/query.js +341 -0
- package/dist/knowledge/query.js.map +1 -0
- package/dist/knowledge/repo-map.d.ts +91 -0
- package/dist/knowledge/repo-map.d.ts.map +1 -0
- package/dist/knowledge/repo-map.js +408 -0
- package/dist/knowledge/repo-map.js.map +1 -0
- package/dist/knowledge/tools/index.d.ts +14 -0
- package/dist/knowledge/tools/index.d.ts.map +1 -0
- package/dist/knowledge/tools/index.js +11 -0
- package/dist/knowledge/tools/index.js.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.js +101 -0
- package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
- package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
- package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-query.js +104 -0
- package/dist/knowledge/tools/knowledge-query.js.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.js +82 -0
- package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
- package/dist/knowledge/types.d.ts +269 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +10 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/knowledge/validator.d.ts +90 -0
- package/dist/knowledge/validator.d.ts.map +1 -0
- package/dist/knowledge/validator.js +288 -0
- package/dist/knowledge/validator.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +222 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/builtin-skills.d.ts +35 -0
- package/dist/skills/builtin-skills.d.ts.map +1 -0
- package/dist/skills/builtin-skills.js +68 -0
- package/dist/skills/builtin-skills.js.map +1 -0
- package/dist/skills/distill/attribution.d.ts +59 -0
- package/dist/skills/distill/attribution.d.ts.map +1 -0
- package/dist/skills/distill/attribution.js +101 -0
- package/dist/skills/distill/attribution.js.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
- package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
- package/dist/skills/distill/claude-cli-resolver.js +115 -0
- package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
- package/dist/skills/distill/distiller.d.ts +161 -0
- package/dist/skills/distill/distiller.d.ts.map +1 -0
- package/dist/skills/distill/distiller.js +461 -0
- package/dist/skills/distill/distiller.js.map +1 -0
- package/dist/skills/distill/index.d.ts +223 -0
- package/dist/skills/distill/index.d.ts.map +1 -0
- package/dist/skills/distill/index.js +466 -0
- package/dist/skills/distill/index.js.map +1 -0
- package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
- package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
- package/dist/skills/distill/project-anchor-guard.js +334 -0
- package/dist/skills/distill/project-anchor-guard.js.map +1 -0
- package/dist/skills/distill/topic-deduper.d.ts +77 -0
- package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
- package/dist/skills/distill/topic-deduper.js +119 -0
- package/dist/skills/distill/topic-deduper.js.map +1 -0
- package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
- package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
- package/dist/skills/distill/upstream-fetcher.js +202 -0
- package/dist/skills/distill/upstream-fetcher.js.map +1 -0
- package/dist/skills/distilled/distilled-api-design.md +491 -0
- package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
- package/dist/skills/distilled/distilled-creator.md +178 -0
- package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
- package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
- package/dist/skills/distilled/distilled-executing-plans.md +113 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
- package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
- package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
- package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
- package/dist/skills/keyword-score.d.ts +29 -0
- package/dist/skills/keyword-score.d.ts.map +1 -0
- package/dist/skills/keyword-score.js +54 -0
- package/dist/skills/keyword-score.js.map +1 -0
- package/dist/skills/registry.d.ts +64 -20
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +102 -105
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +14 -14
- package/dist/skills/tools/skill-invoke.d.ts +1 -1
- package/dist/skills/tools/skill-invoke.js +1 -1
- package/dist/web/routes/agent-content.d.ts +30 -0
- package/dist/web/routes/agent-content.d.ts.map +1 -0
- package/dist/web/routes/agent-content.js +139 -0
- package/dist/web/routes/agent-content.js.map +1 -0
- package/dist/web/routes/decisions.d.ts +15 -0
- package/dist/web/routes/decisions.d.ts.map +1 -0
- package/dist/web/routes/decisions.js +181 -0
- package/dist/web/routes/decisions.js.map +1 -0
- package/dist/web/routes/diagnostics.d.ts +61 -0
- package/dist/web/routes/diagnostics.d.ts.map +1 -0
- package/dist/web/routes/diagnostics.js +203 -0
- package/dist/web/routes/diagnostics.js.map +1 -0
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +24 -0
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/health.d.ts +33 -0
- package/dist/web/routes/health.d.ts.map +1 -0
- package/dist/web/routes/health.js +37 -0
- package/dist/web/routes/health.js.map +1 -0
- package/dist/web/routes/insights.d.ts +0 -5
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +783 -2
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +16 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/knowledge.js +661 -0
- package/dist/web/routes/knowledge.js.map +1 -0
- package/dist/web/routes/patch.d.ts +60 -1
- package/dist/web/routes/patch.d.ts.map +1 -1
- package/dist/web/routes/patch.js +170 -64
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +37 -0
- package/dist/web/routes/pipeline.d.ts.map +1 -0
- package/dist/web/routes/pipeline.js +149 -0
- package/dist/web/routes/pipeline.js.map +1 -0
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +6 -1
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +9 -1
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-content.d.ts +30 -0
- package/dist/web/routes/skill-content.d.ts.map +1 -0
- package/dist/web/routes/skill-content.js +117 -0
- package/dist/web/routes/skill-content.js.map +1 -0
- package/dist/web/routes/skills-distill.d.ts +29 -0
- package/dist/web/routes/skills-distill.d.ts.map +1 -0
- package/dist/web/routes/skills-distill.js +552 -0
- package/dist/web/routes/skills-distill.js.map +1 -0
- package/dist/web/routes/skills.js +7 -7
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +102 -0
- package/dist/web/routes/task-timeline.d.ts.map +1 -0
- package/dist/web/routes/task-timeline.js +274 -0
- package/dist/web/routes/task-timeline.js.map +1 -0
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +355 -8
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/trace.d.ts.map +1 -1
- package/dist/web/routes/trace.js +3 -2
- package/dist/web/routes/trace.js.map +1 -1
- package/dist/web/routes/types.d.ts +0 -4
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +1 -1
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/routes/violations.d.ts +14 -0
- package/dist/web/routes/violations.d.ts.map +1 -0
- package/dist/web/routes/violations.js +111 -0
- package/dist/web/routes/violations.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +79 -19
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/build-manager.d.ts +72 -0
- package/dist/web/services/build-manager.d.ts.map +1 -0
- package/dist/web/services/build-manager.js +189 -0
- package/dist/web/services/build-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +125 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -0
- package/dist/web/services/distill-manager.js +308 -0
- package/dist/web/services/distill-manager.js.map +1 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
- package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
- package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
- package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
- package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
- package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
- package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
- package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
- package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
- package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
- package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
- package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
- package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
- package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
- package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
- package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
- package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
- package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
- package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
- package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
- package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
- package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
- package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
- package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
- package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
- package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
- package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
- package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
- package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
- package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
- package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
- package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
- package/dist/web/static/index.html +12 -8
- package/package.json +14 -3
- package/dist/core/ai/provider.d.ts +0 -63
- package/dist/core/ai/provider.d.ts.map +0 -1
- package/dist/core/ai/provider.js +0 -241
- package/dist/core/ai/provider.js.map +0 -1
- package/dist/core/ai/types.d.ts +0 -43
- package/dist/core/ai/types.d.ts.map +0 -1
- package/dist/core/ai/types.js +0 -5
- package/dist/core/ai/types.js.map +0 -1
- package/dist/core/storage/token-usage.d.ts +0 -36
- package/dist/core/storage/token-usage.d.ts.map +0 -1
- package/dist/core/storage/token-usage.js +0 -59
- package/dist/core/storage/token-usage.js.map +0 -1
- package/dist/core/utils/token-tracker.d.ts +0 -39
- package/dist/core/utils/token-tracker.d.ts.map +0 -1
- package/dist/core/utils/token-tracker.js +0 -69
- package/dist/core/utils/token-tracker.js.map +0 -1
- package/dist/skills/index.d.ts +0 -3
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -3
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/matcher.d.ts +0 -26
- package/dist/skills/matcher.d.ts.map +0 -1
- package/dist/skills/matcher.js +0 -113
- package/dist/skills/matcher.js.map +0 -1
- package/dist/skills/official/code-simplifier.md +0 -52
- package/dist/skills/official/find-skills.md +0 -142
- package/dist/skills/official/official-api-design.md +0 -30
- package/dist/skills/official/official-architecture-decision.md +0 -41
- package/dist/skills/official/official-bmad.md +0 -118
- package/dist/skills/official/official-db-schema-design.md +0 -34
- package/dist/skills/official/official-debug.md +0 -25
- package/dist/skills/official/official-doc-driven.md +0 -31
- package/dist/skills/official/official-harness-engineering.md +0 -108
- package/dist/skills/official/official-openspec.md +0 -89
- package/dist/skills/official/official-performance-optimization.md +0 -30
- package/dist/skills/official/official-pr-review.md +0 -35
- package/dist/skills/official/official-release-checklist.md +0 -30
- package/dist/skills/official/official-security-hardening.md +0 -32
- package/dist/skills/official/official-spec-driven-design.md +0 -31
- package/dist/skills/official/planning-with-files.md +0 -241
- package/dist/skills/official/ui-ux-pro-max.md +0 -105
- package/dist/skills/official/webapp-testing.md +0 -96
- package/dist/skills/official-skills.d.ts +0 -26
- package/dist/skills/official-skills.d.ts.map +0 -1
- package/dist/skills/official-skills.js +0 -74
- package/dist/skills/official-skills.js.map +0 -1
- package/dist/skills/semantic-matcher.d.ts +0 -60
- package/dist/skills/semantic-matcher.d.ts.map +0 -1
- package/dist/skills/semantic-matcher.js +0 -192
- package/dist/skills/semantic-matcher.js.map +0 -1
- package/dist/skills/upgrade-engine.d.ts +0 -93
- package/dist/skills/upgrade-engine.d.ts.map +0 -1
- package/dist/skills/upgrade-engine.js +0 -447
- package/dist/skills/upgrade-engine.js.map +0 -1
- package/dist/skills/upgrade-prompt.d.ts +0 -20
- package/dist/skills/upgrade-prompt.d.ts.map +0 -1
- package/dist/skills/upgrade-prompt.js +0 -75
- package/dist/skills/upgrade-prompt.js.map +0 -1
- package/dist/web/routes/ai.d.ts +0 -10
- package/dist/web/routes/ai.d.ts.map +0 -1
- package/dist/web/routes/ai.js +0 -186
- package/dist/web/routes/ai.js.map +0 -1
- package/dist/web/routes/token-usage.d.ts +0 -7
- package/dist/web/routes/token-usage.d.ts.map +0 -1
- package/dist/web/routes/token-usage.js +0 -18
- package/dist/web/routes/token-usage.js.map +0 -1
- package/dist/web/ssrf-guard.d.ts +0 -35
- package/dist/web/ssrf-guard.d.ts.map +0 -1
- package/dist/web/ssrf-guard.js +0 -93
- package/dist/web/ssrf-guard.js.map +0 -1
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
- package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
- package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
- package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
- package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
- package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
- package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
- package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
- package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
- package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
- package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
- package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
- package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
- package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
- package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
- package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
- package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
- package/dist/web/static/assets/index-CBX47X8l.js +0 -3
- package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
- package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
- package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
- package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
- package/dist/web/static/assets/query-C99w429o.js +0 -2
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
- package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
- package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
- package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
- package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
- package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
- package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills distillation job manager — single-instance concurrency control and
|
|
3
|
+
* SSE event broadcast for `cf skills distill run` invocations issued via the
|
|
4
|
+
* web API.
|
|
5
|
+
*
|
|
6
|
+
* Design (v9.7, BMAD Phase 2 of "Skill 蒸馏 Web UI"):
|
|
7
|
+
* - Only one distill job can run at a time (global singleton, lock by `current`).
|
|
8
|
+
* - Events accumulate in `session.events[]` so SSE clients can replay history
|
|
9
|
+
* after reconnect (mirrors build-manager.ts).
|
|
10
|
+
* - Finished sessions live 5 minutes (SESSION_TTL_MS) then are GC'd.
|
|
11
|
+
* - State machine source-of-truth is the JSON file at
|
|
12
|
+
* `~/.claude-forge/skills-distill-state.json` (shared with CLI). This class
|
|
13
|
+
* only owns event delivery + the in-flight lock; the JSON file owns
|
|
14
|
+
* `phase`/`pending`/`completed`.
|
|
15
|
+
* - The `distillRun` function in `src/skills/distill/index.ts` does NOT
|
|
16
|
+
* accept an onEvent callback today, so we synthesize a coarse-grained
|
|
17
|
+
* event stream around it: `start` → ... → `done | cancelled | error`
|
|
18
|
+
* (the legacy `gate-paused` terminal was removed by R-D, spec 1851).
|
|
19
|
+
* Per-skill progress events are emitted from inside this wrapper by
|
|
20
|
+
* polling the state file as `completed.length` advances. Acceptable
|
|
21
|
+
* granularity given the slow LLM calls (~30-60s per skill).
|
|
22
|
+
*
|
|
23
|
+
* Critical constraints honoured:
|
|
24
|
+
* - DOES NOT modify any `src/skills/distill/*` module.
|
|
25
|
+
* - DOES NOT change the state file schema or CLI semantics.
|
|
26
|
+
* - Lock check is in-process; CLI + Web in parallel may still race on the
|
|
27
|
+
* JSON file (writeFile is atomic on POSIX — acceptable, documented in spec).
|
|
28
|
+
*/
|
|
29
|
+
import { DEFAULT_STATE_PATH, type DistillState, type RunOptions, type RunResult } from '../../skills/distill/index.js';
|
|
30
|
+
/**
|
|
31
|
+
* Event types emitted to SSE subscribers.
|
|
32
|
+
* R-D: `gate-paused` removed (no sample-approve gate in R-B; never emitted).
|
|
33
|
+
*/
|
|
34
|
+
export type DistillEventType = 'connected' | 'start' | 'progress' | 'phase-changed' | 'skill-distilled' | 'done' | 'cancelled' | 'error';
|
|
35
|
+
export interface DistillEvent {
|
|
36
|
+
type: DistillEventType;
|
|
37
|
+
/** ISO timestamp the event was emitted. */
|
|
38
|
+
at: string;
|
|
39
|
+
/** Optional human-readable message for the UI. */
|
|
40
|
+
message?: string;
|
|
41
|
+
/** Snapshot of state file phase at emit time. */
|
|
42
|
+
phase?: DistillState['phase'];
|
|
43
|
+
/** Counts of completed / pending / skipped at emit time. */
|
|
44
|
+
completed?: number;
|
|
45
|
+
pending?: number;
|
|
46
|
+
skipped?: number;
|
|
47
|
+
/** Per-skill payload when applicable. */
|
|
48
|
+
topicId?: string;
|
|
49
|
+
/** Distill result fields when the run terminates. */
|
|
50
|
+
distilledCount?: number;
|
|
51
|
+
pausedAtGate?: boolean;
|
|
52
|
+
/** Error detail. */
|
|
53
|
+
errorMessage?: string;
|
|
54
|
+
/** runId echoed for downstream filtering. */
|
|
55
|
+
runId?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface DistillSession {
|
|
58
|
+
runId: string;
|
|
59
|
+
startedAt: number;
|
|
60
|
+
doneAt: number | null;
|
|
61
|
+
events: DistillEvent[];
|
|
62
|
+
/** Snapshot of caller options. R-A: no providers field; R-B may add abortSignal. */
|
|
63
|
+
options: RunOptions;
|
|
64
|
+
/** Last RunResult if the job finished naturally. */
|
|
65
|
+
lastResult: RunResult | null;
|
|
66
|
+
/** Set by cancel(); the runner observes and short-circuits. */
|
|
67
|
+
cancelRequested: boolean;
|
|
68
|
+
}
|
|
69
|
+
export declare class DistillConflictError extends Error {
|
|
70
|
+
status: number;
|
|
71
|
+
constructor(msg: string);
|
|
72
|
+
}
|
|
73
|
+
export declare class DistillManager {
|
|
74
|
+
private current;
|
|
75
|
+
private sessions;
|
|
76
|
+
private listeners;
|
|
77
|
+
private lastFinished;
|
|
78
|
+
/** True when a distill job is currently running. */
|
|
79
|
+
isBusy(): boolean;
|
|
80
|
+
getCurrent(): DistillSession | null;
|
|
81
|
+
getSession(id: string): DistillSession | null;
|
|
82
|
+
getLastFinished(): DistillSession | null;
|
|
83
|
+
/**
|
|
84
|
+
* Kick off a new distill run. Throws DistillConflictError if one is already
|
|
85
|
+
* running. Returns immediately; the actual distillRun() executes in the
|
|
86
|
+
* background. Subscribers receive events via subscribe().
|
|
87
|
+
*/
|
|
88
|
+
start(options: RunOptions): {
|
|
89
|
+
runId: string;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Subscribe to future events for this run. Returns an unsubscribe fn.
|
|
93
|
+
* Does NOT replay history — the SSE handler replays session.events directly
|
|
94
|
+
* before subscribing.
|
|
95
|
+
*/
|
|
96
|
+
subscribe(runId: string, listener: (e: DistillEvent) => void): () => void;
|
|
97
|
+
/**
|
|
98
|
+
* Request cancellation of the running job. The job loop checks this flag
|
|
99
|
+
* between skills. Already-in-flight LLM calls are not aborted (their cost
|
|
100
|
+
* is sunk by the time cancel is requested).
|
|
101
|
+
*/
|
|
102
|
+
cancel(runId: string): boolean;
|
|
103
|
+
private pushEvent;
|
|
104
|
+
/**
|
|
105
|
+
* R-B: run distillRun() with an onProgress callback bridging claude CLI
|
|
106
|
+
* stream-json events into our SSE event stream. No state-file polling
|
|
107
|
+
* anymore — events come directly from the child process. Terminates with
|
|
108
|
+
* one of: `done`, `cancelled`, `error`.
|
|
109
|
+
*/
|
|
110
|
+
private runWithChildProcess;
|
|
111
|
+
/**
|
|
112
|
+
* Test-only: reset internal state.
|
|
113
|
+
* @internal
|
|
114
|
+
*/
|
|
115
|
+
_reset(): void;
|
|
116
|
+
}
|
|
117
|
+
/** Module-level singleton (one distill job per daemon). */
|
|
118
|
+
export declare const distillManager: DistillManager;
|
|
119
|
+
/** Path of the state file (re-export for routes / tests). */
|
|
120
|
+
export { DEFAULT_STATE_PATH };
|
|
121
|
+
/** Read the state file (re-export). */
|
|
122
|
+
export declare function readDistillState(statePath?: string): Promise<DistillState | null>;
|
|
123
|
+
/** Check if the state file exists on disk. */
|
|
124
|
+
export declare function distillStateExists(statePath?: string): Promise<boolean>;
|
|
125
|
+
//# sourceMappingURL=distill-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distill-manager.d.ts","sourceRoot":"","sources":["../../../src/web/services/distill-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,EAGL,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,+BAA+B,CAAC;AAmBvC;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,OAAO,GACP,UAAU,GACV,eAAe,GACf,iBAAiB,GACjB,MAAM,GACN,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,oFAAoF;IACpF,OAAO,EAAE,UAAU,CAAC;IACpB,oDAAoD;IACpD,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,+DAA+D;IAC/D,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,MAAM,SAAO;gBACD,GAAG,EAAE,MAAM;CAIxB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,SAAS,CAAqD;IACtE,OAAO,CAAC,YAAY,CAA+B;IACnD,oDAAoD;IACpD,MAAM,IAAI,OAAO;IAIjB,UAAU,IAAI,cAAc,GAAG,IAAI;IAInC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAI7C,eAAe,IAAI,cAAc,GAAG,IAAI;IAIxC;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;IAyD7C;;;;OAIG;IACH,SAAS,CACP,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAClC,MAAM,IAAI;IAab;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAO9B,OAAO,CAAC,SAAS;IAgBjB;;;;;OAKG;YACW,mBAAmB;IA8GjC;;;OAGG;IACH,MAAM,IAAI,IAAI;CAMf;AAED,2DAA2D;AAC3D,eAAO,MAAM,cAAc,gBAAuB,CAAC;AAEnD,6DAA6D;AAC7D,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,uCAAuC;AACvC,wBAAsB,gBAAgB,CACpC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAE9B;AAED,8CAA8C;AAC9C,wBAAsB,kBAAkB,CACtC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAOlB"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills distillation job manager — single-instance concurrency control and
|
|
3
|
+
* SSE event broadcast for `cf skills distill run` invocations issued via the
|
|
4
|
+
* web API.
|
|
5
|
+
*
|
|
6
|
+
* Design (v9.7, BMAD Phase 2 of "Skill 蒸馏 Web UI"):
|
|
7
|
+
* - Only one distill job can run at a time (global singleton, lock by `current`).
|
|
8
|
+
* - Events accumulate in `session.events[]` so SSE clients can replay history
|
|
9
|
+
* after reconnect (mirrors build-manager.ts).
|
|
10
|
+
* - Finished sessions live 5 minutes (SESSION_TTL_MS) then are GC'd.
|
|
11
|
+
* - State machine source-of-truth is the JSON file at
|
|
12
|
+
* `~/.claude-forge/skills-distill-state.json` (shared with CLI). This class
|
|
13
|
+
* only owns event delivery + the in-flight lock; the JSON file owns
|
|
14
|
+
* `phase`/`pending`/`completed`.
|
|
15
|
+
* - The `distillRun` function in `src/skills/distill/index.ts` does NOT
|
|
16
|
+
* accept an onEvent callback today, so we synthesize a coarse-grained
|
|
17
|
+
* event stream around it: `start` → ... → `done | cancelled | error`
|
|
18
|
+
* (the legacy `gate-paused` terminal was removed by R-D, spec 1851).
|
|
19
|
+
* Per-skill progress events are emitted from inside this wrapper by
|
|
20
|
+
* polling the state file as `completed.length` advances. Acceptable
|
|
21
|
+
* granularity given the slow LLM calls (~30-60s per skill).
|
|
22
|
+
*
|
|
23
|
+
* Critical constraints honoured:
|
|
24
|
+
* - DOES NOT modify any `src/skills/distill/*` module.
|
|
25
|
+
* - DOES NOT change the state file schema or CLI semantics.
|
|
26
|
+
* - Lock check is in-process; CLI + Web in parallel may still race on the
|
|
27
|
+
* JSON file (writeFile is atomic on POSIX — acceptable, documented in spec).
|
|
28
|
+
*/
|
|
29
|
+
import { randomBytes } from 'node:crypto';
|
|
30
|
+
import { promises as fsp } from 'node:fs';
|
|
31
|
+
import { logger } from '../../core/utils/logger.js';
|
|
32
|
+
import { distillRun, readState, DEFAULT_STATE_PATH, } from '../../skills/distill/index.js';
|
|
33
|
+
// R-A (spec 1851): ClaudeProvider import dropped — distill no longer takes
|
|
34
|
+
// a provider. R-B will replace `runWithPolling` with a child_process spawn.
|
|
35
|
+
const SESSION_TTL_MS = 5 * 60 * 1000;
|
|
36
|
+
// R-D: DEFAULT_POLL_INTERVAL_MS removed — R-B's runWithChildProcess no
|
|
37
|
+
// longer polls the state file; cancel handling is via AbortController.
|
|
38
|
+
/** Human-readable status for the phase-changed event message field. */
|
|
39
|
+
function phaseLabel(phase) {
|
|
40
|
+
switch (phase) {
|
|
41
|
+
case 'idle': return '空闲';
|
|
42
|
+
case 'running': return '正在蒸馏 (R-A stub; R-B 接 claude CLI)…';
|
|
43
|
+
case 'done': return '完成';
|
|
44
|
+
case 'error': return '出错';
|
|
45
|
+
default: return String(phase);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class DistillConflictError extends Error {
|
|
49
|
+
status = 409;
|
|
50
|
+
constructor(msg) {
|
|
51
|
+
super(msg);
|
|
52
|
+
this.name = 'DistillConflictError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class DistillManager {
|
|
56
|
+
current = null;
|
|
57
|
+
sessions = new Map();
|
|
58
|
+
listeners = new Map();
|
|
59
|
+
lastFinished = null;
|
|
60
|
+
/** True when a distill job is currently running. */
|
|
61
|
+
isBusy() {
|
|
62
|
+
return this.current !== null && this.current.doneAt === null;
|
|
63
|
+
}
|
|
64
|
+
getCurrent() {
|
|
65
|
+
return this.current;
|
|
66
|
+
}
|
|
67
|
+
getSession(id) {
|
|
68
|
+
return this.sessions.get(id) ?? null;
|
|
69
|
+
}
|
|
70
|
+
getLastFinished() {
|
|
71
|
+
return this.lastFinished;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Kick off a new distill run. Throws DistillConflictError if one is already
|
|
75
|
+
* running. Returns immediately; the actual distillRun() executes in the
|
|
76
|
+
* background. Subscribers receive events via subscribe().
|
|
77
|
+
*/
|
|
78
|
+
start(options) {
|
|
79
|
+
if (this.isBusy()) {
|
|
80
|
+
throw new DistillConflictError(`Distill job already running: ${this.current.runId}`);
|
|
81
|
+
}
|
|
82
|
+
const runId = `distill-${randomBytes(6).toString('hex')}`;
|
|
83
|
+
const session = {
|
|
84
|
+
runId,
|
|
85
|
+
startedAt: Date.now(),
|
|
86
|
+
doneAt: null,
|
|
87
|
+
events: [],
|
|
88
|
+
options,
|
|
89
|
+
lastResult: null,
|
|
90
|
+
cancelRequested: false,
|
|
91
|
+
};
|
|
92
|
+
this.current = session;
|
|
93
|
+
this.sessions.set(runId, session);
|
|
94
|
+
// Spec 0930 / 1641: log targeted re-distill invocations for observability
|
|
95
|
+
// (topicIds, outputIds, and/or force imply user explicitly bypassed
|
|
96
|
+
// topicCap / completedSet — record so operators can correlate with API
|
|
97
|
+
// spend).
|
|
98
|
+
if ((options.topicIds && options.topicIds.length > 0) ||
|
|
99
|
+
(options.outputIds && options.outputIds.length > 0) ||
|
|
100
|
+
options.force === true) {
|
|
101
|
+
logger.info(`[DistillManager] ${runId} targeted run: topicIds=${JSON.stringify(options.topicIds ?? [])} outputIds=${JSON.stringify(options.outputIds ?? [])} force=${options.force === true}`);
|
|
102
|
+
}
|
|
103
|
+
// Emit synthetic 'start' event so subscribers know the job is live.
|
|
104
|
+
this.pushEvent(runId, {
|
|
105
|
+
type: 'start',
|
|
106
|
+
at: new Date().toISOString(),
|
|
107
|
+
message: 'Distillation started',
|
|
108
|
+
runId,
|
|
109
|
+
});
|
|
110
|
+
// R-B: run claude CLI shell-out, listen for stream-json events via callback.
|
|
111
|
+
void this.runWithChildProcess(session, options).finally(() => {
|
|
112
|
+
session.doneAt = Date.now();
|
|
113
|
+
this.lastFinished = session;
|
|
114
|
+
if (this.current === session)
|
|
115
|
+
this.current = null;
|
|
116
|
+
setTimeout(() => {
|
|
117
|
+
this.sessions.delete(runId);
|
|
118
|
+
this.listeners.delete(runId);
|
|
119
|
+
}, SESSION_TTL_MS).unref?.();
|
|
120
|
+
});
|
|
121
|
+
return { runId };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Subscribe to future events for this run. Returns an unsubscribe fn.
|
|
125
|
+
* Does NOT replay history — the SSE handler replays session.events directly
|
|
126
|
+
* before subscribing.
|
|
127
|
+
*/
|
|
128
|
+
subscribe(runId, listener) {
|
|
129
|
+
let set = this.listeners.get(runId);
|
|
130
|
+
if (!set) {
|
|
131
|
+
set = new Set();
|
|
132
|
+
this.listeners.set(runId, set);
|
|
133
|
+
}
|
|
134
|
+
set.add(listener);
|
|
135
|
+
return () => {
|
|
136
|
+
const s = this.listeners.get(runId);
|
|
137
|
+
if (s)
|
|
138
|
+
s.delete(listener);
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Request cancellation of the running job. The job loop checks this flag
|
|
143
|
+
* between skills. Already-in-flight LLM calls are not aborted (their cost
|
|
144
|
+
* is sunk by the time cancel is requested).
|
|
145
|
+
*/
|
|
146
|
+
cancel(runId) {
|
|
147
|
+
const session = this.sessions.get(runId);
|
|
148
|
+
if (!session || session.doneAt !== null)
|
|
149
|
+
return false;
|
|
150
|
+
session.cancelRequested = true;
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
pushEvent(runId, ev) {
|
|
154
|
+
const session = this.sessions.get(runId);
|
|
155
|
+
if (!session)
|
|
156
|
+
return;
|
|
157
|
+
session.events.push(ev);
|
|
158
|
+
const subs = this.listeners.get(runId);
|
|
159
|
+
if (subs) {
|
|
160
|
+
for (const fn of subs) {
|
|
161
|
+
try {
|
|
162
|
+
fn(ev);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
logger.warn(`[DistillManager] listener error: ${err}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* R-B: run distillRun() with an onProgress callback bridging claude CLI
|
|
172
|
+
* stream-json events into our SSE event stream. No state-file polling
|
|
173
|
+
* anymore — events come directly from the child process. Terminates with
|
|
174
|
+
* one of: `done`, `cancelled`, `error`.
|
|
175
|
+
*/
|
|
176
|
+
async runWithChildProcess(session, opts) {
|
|
177
|
+
const statePath = opts.statePath ?? DEFAULT_STATE_PATH;
|
|
178
|
+
// AbortController bridges DistillSession.cancelRequested → child.kill in
|
|
179
|
+
// the distiller. We poll the flag every 100ms (cheaper than rewriting
|
|
180
|
+
// cancel() to be Promise-based).
|
|
181
|
+
const abort = new AbortController();
|
|
182
|
+
const cancelPoll = setInterval(() => {
|
|
183
|
+
if (session.cancelRequested && !abort.signal.aborted) {
|
|
184
|
+
abort.abort();
|
|
185
|
+
}
|
|
186
|
+
}, 100).unref?.();
|
|
187
|
+
// Track which topics we've already emitted skill-distilled for, so the
|
|
188
|
+
// last-skill final event isn't duplicated in the terminal block.
|
|
189
|
+
const seenTopics = new Set();
|
|
190
|
+
// Push a phase-changed=running event so the UI knows scoring/distilling
|
|
191
|
+
// has actually kicked off (mirrors the R-A "正在 …" prompt).
|
|
192
|
+
this.pushEvent(session.runId, {
|
|
193
|
+
type: 'phase-changed',
|
|
194
|
+
at: new Date().toISOString(),
|
|
195
|
+
phase: 'running',
|
|
196
|
+
message: phaseLabel('running'),
|
|
197
|
+
runId: session.runId,
|
|
198
|
+
});
|
|
199
|
+
try {
|
|
200
|
+
if (session.cancelRequested) {
|
|
201
|
+
this.pushEvent(session.runId, {
|
|
202
|
+
type: 'cancelled',
|
|
203
|
+
at: new Date().toISOString(),
|
|
204
|
+
message: 'Cancelled before start',
|
|
205
|
+
runId: session.runId,
|
|
206
|
+
});
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const result = await distillRun({
|
|
210
|
+
...opts,
|
|
211
|
+
cancelSignal: abort.signal,
|
|
212
|
+
onProgress: (ev) => {
|
|
213
|
+
// Forward partial-message char counts as `progress` events; emit
|
|
214
|
+
// `skill-distilled` once we see a clear terminal event per topic.
|
|
215
|
+
this.pushEvent(session.runId, {
|
|
216
|
+
type: 'progress',
|
|
217
|
+
at: new Date().toISOString(),
|
|
218
|
+
topicId: ev.topicId,
|
|
219
|
+
message: ev.charCount != null ? `chars=${ev.charCount}` : undefined,
|
|
220
|
+
runId: session.runId,
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
session.lastResult = result;
|
|
225
|
+
if (cancelPoll)
|
|
226
|
+
clearInterval(cancelPoll);
|
|
227
|
+
// Emit skill-distilled for each topic that produced a file. distillRun
|
|
228
|
+
// returns DistillResult[] only for successful (non-skipped) entries.
|
|
229
|
+
for (const r of result.distilled) {
|
|
230
|
+
if (seenTopics.has(r.topicId))
|
|
231
|
+
continue;
|
|
232
|
+
seenTopics.add(r.topicId);
|
|
233
|
+
this.pushEvent(session.runId, {
|
|
234
|
+
type: 'skill-distilled',
|
|
235
|
+
at: new Date().toISOString(),
|
|
236
|
+
topicId: r.topicId,
|
|
237
|
+
runId: session.runId,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
const finalState = await readState(statePath);
|
|
241
|
+
if (session.cancelRequested) {
|
|
242
|
+
this.pushEvent(session.runId, {
|
|
243
|
+
type: 'cancelled',
|
|
244
|
+
at: new Date().toISOString(),
|
|
245
|
+
message: 'Cancelled by user',
|
|
246
|
+
phase: finalState?.phase,
|
|
247
|
+
completed: finalState?.completed.length,
|
|
248
|
+
distilledCount: result.distilled.length,
|
|
249
|
+
runId: session.runId,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
this.pushEvent(session.runId, {
|
|
254
|
+
type: 'done',
|
|
255
|
+
at: new Date().toISOString(),
|
|
256
|
+
message: result.message,
|
|
257
|
+
phase: finalState?.phase ?? 'done',
|
|
258
|
+
completed: finalState?.completed.length ?? result.distilled.length,
|
|
259
|
+
skipped: finalState?.skipped.length ?? 0,
|
|
260
|
+
distilledCount: result.distilled.length,
|
|
261
|
+
pausedAtGate: false,
|
|
262
|
+
runId: session.runId,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
if (cancelPoll)
|
|
268
|
+
clearInterval(cancelPoll);
|
|
269
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
270
|
+
this.pushEvent(session.runId, {
|
|
271
|
+
type: 'error',
|
|
272
|
+
at: new Date().toISOString(),
|
|
273
|
+
errorMessage: msg,
|
|
274
|
+
runId: session.runId,
|
|
275
|
+
});
|
|
276
|
+
logger.warn(`[DistillManager] run failed: ${msg}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Test-only: reset internal state.
|
|
281
|
+
* @internal
|
|
282
|
+
*/
|
|
283
|
+
_reset() {
|
|
284
|
+
this.current = null;
|
|
285
|
+
this.sessions.clear();
|
|
286
|
+
this.listeners.clear();
|
|
287
|
+
this.lastFinished = null;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
/** Module-level singleton (one distill job per daemon). */
|
|
291
|
+
export const distillManager = new DistillManager();
|
|
292
|
+
/** Path of the state file (re-export for routes / tests). */
|
|
293
|
+
export { DEFAULT_STATE_PATH };
|
|
294
|
+
/** Read the state file (re-export). */
|
|
295
|
+
export async function readDistillState(statePath) {
|
|
296
|
+
return readState(statePath ?? DEFAULT_STATE_PATH);
|
|
297
|
+
}
|
|
298
|
+
/** Check if the state file exists on disk. */
|
|
299
|
+
export async function distillStateExists(statePath) {
|
|
300
|
+
try {
|
|
301
|
+
await fsp.access(statePath ?? DEFAULT_STATE_PATH);
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=distill-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distill-manager.js","sourceRoot":"","sources":["../../../src/web/services/distill-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./react-vendor-tkvCrao7.js";import{b as m,L as c}from"./react-router-JVUrkhdd.js";import{u as p}from"./query-S6X1S7K9.js";import{m as s,u as x,T as o,d as y,E as a,Y as u}from"./arco-Bhi3a6Qp.js";import{M as g}from"./MarkdownRenderer-DZmTl-8J.js";import"./vendor-DWgdB1eY.js";import"./syntax-highlighter-BkZfCDsz.js";const j=["name","description","tools","model","version","spawn_agent","tags"];function f(t){if(t==null)return"-";if(Array.isArray(t))return t.join(", ");if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);try{return JSON.stringify(t)}catch{return String(t)}}function I(){const{name:t}=m(),{data:n,isLoading:i,isError:l,error:d}=p({queryKey:["agent-content-page",t],enabled:!!t,queryFn:async()=>{const r=await fetch(`/api/agents/${encodeURIComponent(t)}/content`);if(!r.ok)throw new Error(`HTTP ${r.status}`);return r.json()},staleTime:5*6e4});return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:12},children:[e.jsxs(s,{children:[e.jsx(s.Item,{children:e.jsx(c,{to:"/context?tab=agents",children:"/context"})}),e.jsx(s.Item,{children:"agent"}),e.jsx(s.Item,{children:e.jsx("span",{style:{fontFamily:"monospace"},children:t})})]}),e.jsxs(x,{bordered:!0,children:[e.jsx("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:12},children:e.jsx(o.Title,{heading:5,style:{margin:0,fontFamily:"monospace"},children:t})}),i&&e.jsx(y,{animation:!0,text:{rows:10}}),l&&e.jsx(a,{description:e.jsxs(o.Text,{type:"error",children:["加载失败: ",String(d)]})}),n&&!n.exists&&e.jsx(a,{description:e.jsxs("span",{children:["未找到 ",e.jsxs("code",{style:{fontFamily:"monospace"},children:[".claude/agents/",t,".md"]}),"。",e.jsx("br",{}),"这通常是 Claude Code 内置的虚拟 subagent_type(如 ",e.jsx("code",{children:"general-purpose"}),"),无对应的 markdown 文件。"]})}),n&&n.exists&&e.jsxs(e.Fragment,{children:[e.jsx(u,{colon:" :",size:"small",column:2,title:e.jsx(o.Text,{style:{fontSize:13},children:"Frontmatter"}),data:j.map(r=>({label:r,value:f(n.frontmatter[r])})),style:{marginBottom:16}}),e.jsxs(o.Text,{type:"secondary",style:{fontSize:12},children:["path: ",n.path," · ",n.bytes," bytes"]}),e.jsx("div",{style:{marginTop:12},children:e.jsx(g,{content:n.body})})]})]})]})}export{I as default};
|
|
2
|
+
//# sourceMappingURL=AgentContentPage-DkeRNxok.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentContentPage-DkeRNxok.js","sources":["../../src/pages/AgentContentPage.tsx"],"sourcesContent":["/**\n * /context/agent/:name — full-page view of an agent's .claude/agents/<name>.md.\n *\n * Standalone fallback for long agent definitions where the 760px drawer is\n * cramped. Linked from AgentContentDrawer's \"Open in full page\" anchor.\n *\n * Breadcrumb: /context → /context/agent/:name\n */\nimport { useParams, Link } from 'react-router-dom'\nimport { useQuery } from '@tanstack/react-query'\nimport Breadcrumb from '@arco-design/web-react/es/Breadcrumb'\nimport Card from '@arco-design/web-react/es/Card'\nimport Descriptions from '@arco-design/web-react/es/Descriptions'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport MarkdownRenderer from '../components/MarkdownRenderer'\n\ninterface AgentContentResponse {\n name: string\n exists: boolean\n path: string | null\n bytes: number\n body: string\n frontmatter: Record<string, unknown>\n tools: string | null\n model: string | null\n}\n\nconst WHITELIST: ReadonlyArray<string> = [\n 'name',\n 'description',\n 'tools',\n 'model',\n 'version',\n 'spawn_agent',\n 'tags',\n]\n\nfunction renderFmValue(v: unknown): string {\n if (v == null) return '-'\n if (Array.isArray(v)) return v.join(', ')\n if (typeof v === 'string') return v\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n\nexport default function AgentContentPage() {\n const { name } = useParams<{ name: string }>()\n const { data, isLoading, isError, error } = useQuery<AgentContentResponse>({\n queryKey: ['agent-content-page', name],\n enabled: !!name,\n queryFn: async () => {\n const r = await fetch(`/api/agents/${encodeURIComponent(name!)}/content`)\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n return r.json()\n },\n staleTime: 5 * 60_000,\n })\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 12 }}>\n <Breadcrumb>\n <Breadcrumb.Item>\n <Link to=\"/context?tab=agents\">/context</Link>\n </Breadcrumb.Item>\n <Breadcrumb.Item>agent</Breadcrumb.Item>\n <Breadcrumb.Item>\n <span style={{ fontFamily: 'monospace' }}>{name}</span>\n </Breadcrumb.Item>\n </Breadcrumb>\n\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 }}>\n <Typography.Title heading={5} style={{ margin: 0, fontFamily: 'monospace' }}>{name}</Typography.Title>\n </div>\n\n {isLoading && <Skeleton animation text={{ rows: 10 }} />}\n {isError && (\n <Empty description={<Typography.Text type=\"error\">加载失败: {String(error)}</Typography.Text>} />\n )}\n {data && !data.exists && (\n <Empty\n description={\n <span>\n 未找到 <code style={{ fontFamily: 'monospace' }}>.claude/agents/{name}.md</code>。\n <br />\n 这通常是 Claude Code 内置的虚拟 subagent_type(如 <code>general-purpose</code>),无对应的 markdown 文件。\n </span>\n }\n />\n )}\n {data && data.exists && (\n <>\n <Descriptions\n colon=\" :\"\n size=\"small\"\n column={2}\n title={<Typography.Text style={{ fontSize: 13 }}>Frontmatter</Typography.Text>}\n data={WHITELIST.map((key) => ({\n label: key,\n value: renderFmValue(data.frontmatter[key]),\n }))}\n style={{ marginBottom: 16 }}\n />\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n path: {data.path} · {data.bytes} bytes\n </Typography.Text>\n <div style={{ marginTop: 12 }}>\n <MarkdownRenderer content={data.body} />\n </div>\n </>\n )}\n </Card>\n </div>\n )\n}\n"],"names":["WHITELIST","renderFmValue","v","AgentContentPage","name","useParams","data","isLoading","isError","error","useQuery","jsxs","Breadcrumb","jsx","Link","Card","Typography","Skeleton","Empty","Fragment","Descriptions","key","MarkdownRenderer"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e,r as x}from"./react-vendor-tkvCrao7.js";import{u as y}from"./query-S6X1S7K9.js";import{U as h,Y as g,d as f,E as l,T as i,ai as j,X as b,b as u}from"./arco-Bhi3a6Qp.js";import{M as w}from"./MarkdownRenderer-DZmTl-8J.js";import"./vendor-DWgdB1eY.js";import"./syntax-highlighter-BkZfCDsz.js";const T=["name","description","tools","model","version","spawn_agent","tags"];function S(n){if(n==null)return"-";if(Array.isArray(n))return n.join(", ");if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);try{return JSON.stringify(n)}catch{return String(n)}}function z({open:n,agentName:a,stats:o,onClose:c}){const{data:r,isLoading:p,isError:d,error:m}=y({queryKey:["agent-content",a],enabled:!!a&&n,queryFn:async()=>{const s=await fetch(`/api/agents/${encodeURIComponent(a)}/content`);if(!s.ok)throw new Error(`HTTP ${s.status}`);return s.json()},staleTime:3e5}),t=e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx("span",{style:{fontFamily:"monospace",fontSize:13},children:a??"-"}),a&&e.jsxs("a",{href:`/context/agent/${encodeURIComponent(a)}`,target:"_blank",rel:"noopener noreferrer",style:{marginLeft:"auto",fontSize:12,display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(j,{})," Open in full page"]})]});return e.jsxs(h,{visible:n,onCancel:c,onOk:c,title:t,width:760,footer:null,unmountOnExit:!0,children:[o&&e.jsx(g,{colon:" :",size:"small",column:3,data:[{label:"delegations (7d)",value:o.count},{label:"rate",value:o.rate},{label:"subagent_type",value:o.agent}],style:{marginBottom:12}}),p&&e.jsx(f,{animation:!0,text:{rows:6}}),d&&e.jsx(l,{description:e.jsxs(i.Text,{type:"error",children:["加载失败: ",String(m)]})}),r&&!r.exists&&r.source==="builtin"&&e.jsx(l,{description:e.jsxs("span",{children:[e.jsx("code",{style:{fontFamily:"monospace"},children:a})," 是 Claude Code 内置的虚拟 subagent_type,无项目级 markdown 文件。",e.jsx("br",{}),r.message??"Claude Code built-in agent; no project-level details available"]})}),r&&!r.exists&&r.source!=="builtin"&&e.jsx(l,{description:e.jsxs("span",{children:["未找到 ",e.jsxs("code",{style:{fontFamily:"monospace"},children:[".claude/agents/",a,".md"]}),"。",e.jsx("br",{}),"若这是新建 agent,请在 TUI 重启(Cmd+R)后再触发。"]})}),r&&r.exists&&e.jsxs(e.Fragment,{children:[e.jsx(g,{colon:" :",size:"mini",column:2,title:e.jsx(i.Text,{style:{fontSize:13},children:"Frontmatter"}),data:T.map(s=>({label:s,value:S(r.frontmatter[s])})),style:{marginBottom:16}}),e.jsx(i.Text,{style:{fontSize:13,fontWeight:600},children:"Body"}),e.jsx("div",{style:{marginTop:8,maxHeight:"calc(100vh - 360px)",overflow:"auto",border:"1px solid var(--color-border-2)",borderRadius:4,padding:12},children:e.jsx(w,{content:r.body})})]})]})}function R(){const[n,a]=x.useState(null),{data:o,isLoading:c,isError:r,error:p}=y({queryKey:["ctx-agent-hit-rate"],queryFn:async()=>{const t=await fetch("/api/rules/hit-rate?days=7");if(!t.ok)throw new Error(`HTTP ${t.status}`);return t.json()},staleTime:6e4}),d=x.useMemo(()=>o?o.agents.map(t=>({...t})).sort((t,s)=>s.count-t.count):[],[o]);if(r)return e.jsx(l,{description:e.jsxs(i.Text,{type:"error",children:["加载失败: ",String(p)]})});if(c||!o)return e.jsx(f,{animation:!0,text:{rows:8}});const m=[{title:"agent (subagent_type)",dataIndex:"agent",render:(t,s)=>e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e.jsx("span",{style:{fontFamily:"monospace",fontSize:12},children:t}),s.source==="builtin"&&e.jsx(u,{color:"gray",size:"small",children:"built-in"})]})},{title:"delegations (7d)",dataIndex:"count",width:160,sorter:(t,s)=>t.count-s.count,render:t=>e.jsx("span",{style:{fontFamily:"monospace",fontWeight:600},children:t})},{title:"rate (vs 全部 prompt)",dataIndex:"rate",width:160,render:t=>e.jsx(i.Text,{style:{fontSize:12},children:t})},{title:"热度",dataIndex:"count",key:"tier",width:100,render:t=>t>=50?e.jsx(u,{color:"green",size:"small",children:"heavy"}):t>=5?e.jsx(u,{color:"arcoblue",size:"small",children:"used"}):e.jsx(u,{color:"orange",size:"small",children:"rare"})}];return e.jsxs("div",{children:[e.jsx("div",{style:{marginBottom:12},children:e.jsxs(i.Text,{style:{fontSize:13,color:"var(--color-text-3)"},children:["近 7d · 总 delegation ",o.summary.agentDelegations," / ",o.summary.totalPrompts," prompts · agent rate ",o.summary.agentRate," · 共 ",d.length," 个 agent"]})}),e.jsx(b,{rowKey:"agent",data:d,columns:m,pagination:{pageSize:20,showTotal:!0},size:"small",border:{wrapper:!0,cell:!0},onRow:t=>({onClick:()=>a(t),style:{cursor:"pointer"}}),noDataElement:e.jsx(l,{description:"无 agent 委托记录"})}),e.jsx(z,{open:n!==null,agentName:(n==null?void 0:n.agent)??null,stats:n,onClose:()=>a(null)})]})}export{R as default};
|
|
2
|
+
//# sourceMappingURL=AgentDelegationTable-ByBa0x1l.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentDelegationTable-ByBa0x1l.js","sources":["../../src/components/context/AgentContentDrawer.tsx","../../src/components/context/AgentDelegationTable.tsx"],"sourcesContent":["/**\n * AgentContentDrawer — right-side Arco Drawer that shows an agent's full\n * markdown (frontmatter + body) when a row in AgentDelegationTable is clicked.\n *\n * Mirrors SkillContentDrawer but reads .claude/agents/<name>.md via\n * /api/agents/:name/content.\n *\n * Empty case: virtual subagents (`general-purpose`, etc.) have no .md file —\n * the endpoint returns exists:false; UI renders a friendly Empty rather than\n * disabling the row click (spec Q6 = default Empty).\n */\nimport { useQuery } from '@tanstack/react-query'\nimport Drawer from '@arco-design/web-react/es/Drawer'\nimport Descriptions from '@arco-design/web-react/es/Descriptions'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { IconLaunch } from '@arco-design/web-react/icon'\nimport MarkdownRenderer from '../MarkdownRenderer'\n\nexport interface AgentRowStats {\n agent: string\n count: number\n rate: string\n source?: 'project' | 'builtin'\n}\n\ninterface AgentContentResponse {\n name: string\n source?: 'project' | 'builtin'\n exists: boolean\n path: string | null\n bytes: number\n body: string\n frontmatter: Record<string, unknown>\n tools: string | null\n model: string | null\n message?: string\n}\n\ninterface Props {\n open: boolean\n agentName: string | null\n stats?: AgentRowStats | null\n onClose: () => void\n}\n\nconst WHITELIST: ReadonlyArray<string> = [\n 'name',\n 'description',\n 'tools',\n 'model',\n 'version',\n 'spawn_agent',\n 'tags',\n]\n\nfunction renderFmValue(v: unknown): string {\n if (v == null) return '-'\n if (Array.isArray(v)) return v.join(', ')\n if (typeof v === 'string') return v\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n\nexport default function AgentContentDrawer({ open, agentName, stats, onClose }: Props) {\n const { data, isLoading, isError, error } = useQuery<AgentContentResponse>({\n queryKey: ['agent-content', agentName],\n enabled: !!agentName && open,\n queryFn: async () => {\n const r = await fetch(`/api/agents/${encodeURIComponent(agentName!)}/content`)\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n return r.json()\n },\n staleTime: 5 * 60_000,\n })\n\n const title = (\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <span style={{ fontFamily: 'monospace', fontSize: 13 }}>{agentName ?? '-'}</span>\n {agentName && (\n <a\n href={`/context/agent/${encodeURIComponent(agentName)}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ marginLeft: 'auto', fontSize: 12, display: 'inline-flex', alignItems: 'center', gap: 4 }}\n >\n <IconLaunch /> Open in full page\n </a>\n )}\n </div>\n )\n\n return (\n <Drawer\n visible={open}\n onCancel={onClose}\n onOk={onClose}\n title={title}\n width={760}\n footer={null}\n unmountOnExit\n >\n {stats && (\n <Descriptions\n colon=\" :\"\n size=\"small\"\n column={3}\n data={[\n { label: 'delegations (7d)', value: stats.count },\n { label: 'rate', value: stats.rate },\n { label: 'subagent_type', value: stats.agent },\n ]}\n style={{ marginBottom: 12 }}\n />\n )}\n\n {isLoading && <Skeleton animation text={{ rows: 6 }} />}\n {isError && (\n <Empty description={<Typography.Text type=\"error\">加载失败: {String(error)}</Typography.Text>} />\n )}\n\n {data && !data.exists && data.source === 'builtin' && (\n <Empty\n description={\n <span>\n <code style={{ fontFamily: 'monospace' }}>{agentName}</code> 是 Claude Code 内置的虚拟 subagent_type,无项目级 markdown 文件。\n <br />\n {data.message ?? 'Claude Code built-in agent; no project-level details available'}\n </span>\n }\n />\n )}\n\n {data && !data.exists && data.source !== 'builtin' && (\n <Empty\n description={\n <span>\n 未找到 <code style={{ fontFamily: 'monospace' }}>.claude/agents/{agentName}.md</code>。\n <br />\n 若这是新建 agent,请在 TUI 重启(Cmd+R)后再触发。\n </span>\n }\n />\n )}\n\n {data && data.exists && (\n <>\n <Descriptions\n colon=\" :\"\n size=\"mini\"\n column={2}\n title={<Typography.Text style={{ fontSize: 13 }}>Frontmatter</Typography.Text>}\n data={WHITELIST.map((key) => ({\n label: key,\n value: renderFmValue(data.frontmatter[key]),\n }))}\n style={{ marginBottom: 16 }}\n />\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }}>Body</Typography.Text>\n <div\n style={{\n marginTop: 8,\n maxHeight: 'calc(100vh - 360px)',\n overflow: 'auto',\n border: '1px solid var(--color-border-2)',\n borderRadius: 4,\n padding: 12,\n }}\n >\n <MarkdownRenderer content={data.body} />\n </div>\n </>\n )}\n </Drawer>\n )\n}\n","/**\n * AgentDelegationTable — Tab 3 of /context (🤖 Agent 委托).\n *\n * 数据: GET /api/rules/hit-rate?days=7 — 复用同一个 endpoint, 取 agents[].\n * 0 改后端.\n *\n * 列: agent (subagent_type) | delegations_7d | rate (vs 全部 prompt) | 状态 chip.\n */\nimport { useMemo, useState } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport Table from '@arco-design/web-react/es/Table'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport AgentContentDrawer, { type AgentRowStats } from './AgentContentDrawer'\n\ninterface AgentRow {\n agent: string\n count: number\n rate: string\n source?: 'project' | 'builtin'\n}\ninterface HitRateResponse {\n summary: { totalPrompts: number; agentDelegations: number; agentRate: string }\n agents: AgentRow[]\n}\n\nexport default function AgentDelegationTable() {\n const [openAgent, setOpenAgent] = useState<AgentRowStats | null>(null)\n const { data, isLoading, isError, error } = useQuery<HitRateResponse>({\n queryKey: ['ctx-agent-hit-rate'],\n queryFn: async () => {\n const r = await fetch('/api/rules/hit-rate?days=7')\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n return r.json()\n },\n staleTime: 60_000,\n })\n\n const rows = useMemo(() => {\n if (!data) return []\n return data.agents.map((a) => ({ ...a })).sort((a, b) => b.count - a.count)\n }, [data])\n\n if (isError) return <Empty description={<Typography.Text type=\"error\">加载失败: {String(error)}</Typography.Text>} />\n if (isLoading || !data) return <Skeleton animation text={{ rows: 8 }} />\n\n const columns = [\n {\n title: 'agent (subagent_type)',\n dataIndex: 'agent',\n render: (id: string, record: AgentRow) => (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <span style={{ fontFamily: 'monospace', fontSize: 12 }}>{id}</span>\n {record.source === 'builtin' && (\n <Tag color=\"gray\" size=\"small\">built-in</Tag>\n )}\n </span>\n ),\n },\n {\n title: 'delegations (7d)',\n dataIndex: 'count',\n width: 160,\n sorter: (a: { count: number }, b: { count: number }) => a.count - b.count,\n render: (n: number) => <span style={{ fontFamily: 'monospace', fontWeight: 600 }}>{n}</span>,\n },\n {\n title: 'rate (vs 全部 prompt)',\n dataIndex: 'rate',\n width: 160,\n render: (s: string) => <Typography.Text style={{ fontSize: 12 }}>{s}</Typography.Text>,\n },\n {\n title: '热度',\n dataIndex: 'count',\n key: 'tier',\n width: 100,\n render: (n: number) => (\n n >= 50 ? <Tag color=\"green\" size=\"small\">heavy</Tag> :\n n >= 5 ? <Tag color=\"arcoblue\" size=\"small\">used</Tag> :\n <Tag color=\"orange\" size=\"small\">rare</Tag>\n ),\n },\n ]\n\n return (\n <div>\n <div style={{ marginBottom: 12 }}>\n <Typography.Text style={{ fontSize: 13, color: 'var(--color-text-3)' }}>\n 近 7d · 总 delegation {data.summary.agentDelegations} / {data.summary.totalPrompts} prompts ·\n agent rate {data.summary.agentRate} · 共 {rows.length} 个 agent\n </Typography.Text>\n </div>\n <Table\n rowKey=\"agent\"\n data={rows}\n columns={columns}\n pagination={{ pageSize: 20, showTotal: true }}\n size=\"small\"\n border={{ wrapper: true, cell: true }}\n onRow={(record) => ({\n onClick: () => setOpenAgent(record as AgentRowStats),\n style: { cursor: 'pointer' },\n })}\n noDataElement={<Empty description=\"无 agent 委托记录\" />}\n />\n <AgentContentDrawer\n open={openAgent !== null}\n agentName={openAgent?.agent ?? null}\n stats={openAgent}\n onClose={() => setOpenAgent(null)}\n />\n </div>\n )\n}\n"],"names":["WHITELIST","renderFmValue","v","AgentContentDrawer","open","agentName","stats","onClose","data","isLoading","isError","error","useQuery","r","title","jsxs","jsx","IconLaunch","Drawer","Descriptions","Skeleton","Empty","Typography","Fragment","key","MarkdownRenderer","AgentDelegationTable","openAgent","setOpenAgent","useState","rows","useMemo","a","b","columns","id","record","Tag","n","s","Table"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/KbHitRateTable-ByEIWujF.js","assets/react-vendor-tkvCrao7.js","assets/query-S6X1S7K9.js","assets/react-router-JVUrkhdd.js","assets/vendor-DWgdB1eY.js","assets/arco-Bhi3a6Qp.js","assets/arco-DFQA6dO_.css","assets/MarkdownRenderer-DZmTl-8J.js","assets/syntax-highlighter-BkZfCDsz.js","assets/ProjectSwitcher-D3lZMFd3.js","assets/SkillStatsTable-DYMzjEUV.js","assets/AgentDelegationTable-ByBa0x1l.js","assets/SkillsDistillTab-C7qaG8q3.js","assets/auth-Bnf8ZcqN.js","assets/charts-BuHQWDbQ.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{_ as l}from"./index-BIYnq1Dx.js";import{j as e,r as s}from"./react-vendor-tkvCrao7.js";import{u as n,T as r,c as o,p,aa as j,W as b,ab as h}from"./arco-Bhi3a6Qp.js";import{P as m}from"./ProjectSwitcher-D3lZMFd3.js";import{u as g}from"./useTabsParam-k8qte_0C.js";import"./react-router-JVUrkhdd.js";import"./vendor-DWgdB1eY.js";import"./query-S6X1S7K9.js";import"./lucide-CnlPQoG8.js";const _=s.lazy(()=>l(()=>import("./KbHitRateTable-ByEIWujF.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))),u=s.lazy(()=>l(()=>import("./SkillStatsTable-DYMzjEUV.js"),__vite__mapDeps([10,1,2,5,4,6,7,8]))),y=s.lazy(()=>l(()=>import("./AgentDelegationTable-ByBa0x1l.js"),__vite__mapDeps([11,1,2,5,4,6,7,8]))),f=s.lazy(()=>l(()=>import("./SkillsDistillTab-C7qaG8q3.js"),__vite__mapDeps([12,1,2,5,4,6,13,14]))),t=o.TabPane,T=["kb","skills","agents","distill"];function a(){return e.jsx("div",{style:{padding:24,color:"var(--color-text-3)",fontSize:13},children:"加载中…"})}function R(){const{tab:i,setTab:d}=g(T,"kb"),c=x=>d(x);return e.jsxs("div",{"data-testid":"context-insights","data-tab":i,style:{padding:16,display:"flex",flexDirection:"column",gap:12},children:[e.jsx(n,{bordered:!1,bodyStyle:{padding:"12px 16px"},style:{background:"var(--color-bg-1)"},children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(r.Title,{heading:5,style:{margin:0},children:"AI 在拿什么"}),e.jsx(r.Text,{type:"secondary",style:{fontSize:12},children:"Claude 写代码时调用了哪些 KB / Skill / Agent · 近 7d"}),e.jsx("div",{style:{marginLeft:"auto"},children:e.jsx(m,{})})]})}),e.jsx(n,{bordered:!0,bodyStyle:{padding:12},children:e.jsxs(o,{activeTab:i,onChange:c,type:"line",children:[e.jsx(t,{title:e.jsxs("span",{children:[e.jsx(p,{})," 📚 KB 命中"]}),children:e.jsx(s.Suspense,{fallback:e.jsx(a,{}),children:e.jsx(_,{})})},"kb"),e.jsx(t,{title:e.jsxs("span",{children:[e.jsx(j,{})," 🔧 Skill 调用"]}),children:e.jsx(s.Suspense,{fallback:e.jsx(a,{}),children:e.jsx(u,{})})},"skills"),e.jsx(t,{title:e.jsxs("span",{children:[e.jsx(b,{})," 🤖 Agent 委托"]}),children:e.jsx(s.Suspense,{fallback:e.jsx(a,{}),children:e.jsx(y,{})})},"agents"),e.jsx(t,{title:e.jsxs("span",{children:[e.jsx(h,{})," 🧪 蒸馏"]}),children:e.jsx(s.Suspense,{fallback:e.jsx(a,{}),children:e.jsx(f,{})})},"distill")]})})]})}export{R as default};
|
|
3
|
+
//# sourceMappingURL=ContextInsightsPage-oUk7_I8u.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":";sYAqBA,MAAMA,EAAiBC,OAAK,IAAAC,EAAA,IAAM,OAAO,8BAAsC,yCAAC,EAC1EC,EAAkBF,OAAK,IAAAC,EAAA,IAAM,OAAO,+BAAuC,sCAAC,EAC5EE,EAAuBH,OAAK,IAAAC,EAAA,IAAM,OAAO,oCAA4C,sCAAC,EACtFG,EAAmBJ,OAAK,IAAAC,EAAA,IAAM,OAAO,gCAAwC,wCAAC,EAE9EI,EAAUC,EAAK,QAGfC,EAA2B,CAAC,KAAM,SAAU,SAAU,SAAS,EAErE,SAASC,GAAe,CACtB,OACEC,MAAC,OAAI,MAAO,CAAE,QAAS,GAAI,MAAO,sBAAuB,SAAU,IAAM,gBAEzE,CAEJ,CAEA,SAAwBC,GAAsB,CAC5C,KAAM,CAAE,IAAAC,EAAK,OAAAC,CAAA,EAAWC,EAAqBN,EAAO,IAAI,EAClDO,EAAgBC,GAAgBH,EAAOG,CAAa,EAE1D,cACG,OAAI,cAAY,mBAAmB,WAAUJ,EAAK,MAAO,CAAE,QAAS,GAAI,QAAS,OAAQ,cAAe,SAAU,IAAK,IAEtH,UAAAF,MAACO,EAAA,CAAK,SAAU,GAAO,UAAW,CAAE,QAAS,aAAe,MAAO,CAAE,WAAY,qBAC/E,SAAAC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,SAAU,QACtE,UAAAR,MAACS,EAAW,MAAX,CAAiB,QAAS,EAAG,MAAO,CAAE,OAAQ,GAAK,mBAAO,EAC3DT,MAACS,EAAW,KAAX,CAAgB,KAAK,YAAY,MAAO,CAAE,SAAU,IAAM,sDAE3D,EACAT,MAAC,OAAI,MAAO,CAAE,WAAY,QACxB,SAAAA,MAACU,EAAA,EAAgB,EACnB,GACF,EACF,QAGCH,EAAA,CAAK,SAAQ,GAAC,UAAW,CAAE,QAAS,IACnC,SAAAC,OAACX,GAAK,UAAWK,EAAK,SAAUG,EAAc,KAAK,OACjD,UAAAL,MAACJ,EAAA,CAEC,aAAQ,QAAK,UAAAI,MAACW,EAAA,EAAS,EAAE,aAAS,EAElC,SAAAX,MAACY,YAAS,SAAUZ,MAACD,IAAa,EAChC,SAAAC,MAACV,IAAe,EAClB,GALI,MAONU,MAACJ,EAAA,CAEC,aAAQ,QAAK,UAAAI,MAACa,EAAA,EAAS,EAAE,gBAAY,EAErC,SAAAb,MAACY,YAAS,SAAUZ,MAACD,IAAa,EAChC,SAAAC,MAACP,IAAgB,EACnB,GALI,UAONO,MAACJ,EAAA,CAEC,aAAQ,QAAK,UAAAI,MAACc,EAAA,EAAU,EAAE,gBAAY,EAEtC,SAAAd,MAACY,YAAS,SAAUZ,MAACD,IAAa,EAChC,SAAAC,MAACN,IAAqB,EACxB,GALI,UAONM,MAACJ,EAAA,CAEC,aAAQ,QAAK,UAAAI,MAACe,EAAA,EAAe,EAAE,UAAM,EAErC,SAAAf,MAACY,YAAS,SAAUZ,MAACD,IAAa,EAChC,SAAAC,MAACL,IAAiB,EACpB,GALI,UAMN,EACF,EACF,GACF,CAEJ","names":["KbHitRateTable","lazy","__vitePreload","SkillStatsTable","AgentDelegationTable","SkillsDistillTab","TabPane","Tabs","KNOWN","PaneFallback","jsx","ContextInsightsPage","tab","setTab","useTabsParam","handleChange","key","Card","jsxs","Typography","ProjectSwitcher","IconBook","Suspense","IconTool","IconRobot","IconExperiment"],"ignoreList":[],"sources":["../../src/pages/ContextInsightsPage.tsx"],"sourcesContent":["/**\n * /context — AI 在拿什么 (v4 IA).\n *\n * Step 3 实施: 3 tabs — 📚 KB 命中 / 🔧 Skill 调用 / 🤖 Agent 委托.\n * Active tab 由 ?tab=kb|skills|agents 驱动 (default kb).\n *\n * 数据 100% 复用现有 API (无后端改动):\n * - KB tab: /api/knowledge/list + /api/insights/agent-board (per-page 聚合)\n * - Skill tab: /api/rules/hit-rate (skills[] + neverTriggered[])\n * - Agent tab: /api/rules/hit-rate (agents[])\n *\n * 覆盖场景: D (KB 命中率) / F (Skill 是否被调用) — spec §3.3 §6 Step 3.\n */\nimport { lazy, Suspense } from 'react'\nimport Card from '@arco-design/web-react/es/Card'\nimport Tabs from '@arco-design/web-react/es/Tabs'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { IconBook, IconTool, IconRobot, IconExperiment } from '@arco-design/web-react/icon'\nimport { ProjectSwitcher } from '../components/ProjectSwitcher'\nimport { useTabsParam } from '../hooks/useTabsParam'\n\nconst KbHitRateTable = lazy(() => import('../components/context/KbHitRateTable'))\nconst SkillStatsTable = lazy(() => import('../components/context/SkillStatsTable'))\nconst AgentDelegationTable = lazy(() => import('../components/context/AgentDelegationTable'))\nconst SkillsDistillTab = lazy(() => import('../components/distill/SkillsDistillTab'))\n\nconst TabPane = Tabs.TabPane\n\ntype CtxTab = 'kb' | 'skills' | 'agents' | 'distill'\nconst KNOWN: readonly CtxTab[] = ['kb', 'skills', 'agents', 'distill'] as const\n\nfunction PaneFallback() {\n return (\n <div style={{ padding: 24, color: 'var(--color-text-3)', fontSize: 13 }}>\n 加载中…\n </div>\n )\n}\n\nexport default function ContextInsightsPage() {\n const { tab, setTab } = useTabsParam<CtxTab>(KNOWN, 'kb')\n const handleChange = (key: string) => setTab(key as CtxTab)\n\n return (\n <div data-testid=\"context-insights\" data-tab={tab} style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 12 }}>\n {/* Header */}\n <Card bordered={false} bodyStyle={{ padding: '12px 16px' }} style={{ background: 'var(--color-bg-1)' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <Typography.Title heading={5} style={{ margin: 0 }}>AI 在拿什么</Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n Claude 写代码时调用了哪些 KB / Skill / Agent · 近 7d\n </Typography.Text>\n <div style={{ marginLeft: 'auto' }}>\n <ProjectSwitcher />\n </div>\n </div>\n </Card>\n\n {/* Tabs */}\n <Card bordered bodyStyle={{ padding: 12 }}>\n <Tabs activeTab={tab} onChange={handleChange} type=\"line\">\n <TabPane\n key=\"kb\"\n title={<span><IconBook /> 📚 KB 命中</span>}\n >\n <Suspense fallback={<PaneFallback />}>\n <KbHitRateTable />\n </Suspense>\n </TabPane>\n <TabPane\n key=\"skills\"\n title={<span><IconTool /> 🔧 Skill 调用</span>}\n >\n <Suspense fallback={<PaneFallback />}>\n <SkillStatsTable />\n </Suspense>\n </TabPane>\n <TabPane\n key=\"agents\"\n title={<span><IconRobot /> 🤖 Agent 委托</span>}\n >\n <Suspense fallback={<PaneFallback />}>\n <AgentDelegationTable />\n </Suspense>\n </TabPane>\n <TabPane\n key=\"distill\"\n title={<span><IconExperiment /> 🧪 蒸馏</span>}\n >\n <Suspense fallback={<PaneFallback />}>\n <SkillsDistillTab />\n </Suspense>\n </TabPane>\n </Tabs>\n </Card>\n </div>\n )\n}\n"],"file":"assets/ContextInsightsPage-oUk7_I8u.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./react-vendor-tkvCrao7.js";import{u as d}from"./query-S6X1S7K9.js";import{c,f as m}from"./index-BIYnq1Dx.js";import{T as a,t as h,S as p,u as n,f as u}from"./arco-Bhi3a6Qp.js";import"./react-router-JVUrkhdd.js";import"./vendor-DWgdB1eY.js";import"./lucide-CnlPQoG8.js";const x={alive:"var(--color-success)",stale:"var(--color-warning)",dead:"var(--color-danger, #f53f3f)"};function y(t){return t==null?"no heartbeat":c(Date.now()-t)}function f(t){return t==null?"—":m(t,{includeSeconds:!0})}function C(){const{data:t,isLoading:s,error:o,refetch:i}=d({queryKey:["daemon-health-page"],queryFn:async()=>{const r=await fetch("/api/health");if(!r.ok)throw new Error(`HTTP ${r.status}`);return r.json()},refetchInterval:15e3,retry:1});return e.jsxs("div",{style:{maxWidth:640,margin:"0 auto"},children:[e.jsxs("div",{style:{marginBottom:16,display:"flex",alignItems:"center",justifyContent:"space-between"},children:[e.jsx(a.Title,{heading:4,style:{margin:0},children:"Daemon Health"}),e.jsx(h,{size:"small",onClick:()=>i(),children:"Refresh"})]}),s&&e.jsx("div",{style:{textAlign:"center",padding:32},children:e.jsx(p,{})}),o&&e.jsx(n,{children:e.jsxs(a.Text,{type:"error",children:["Failed to load health data: ",String(o)]})}),t&&e.jsxs(u,{direction:"vertical",size:16,style:{width:"100%"},children:[e.jsxs(n,{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:16},children:[e.jsx("span",{style:{width:12,height:12,borderRadius:"50%",background:x[t.daemon.status]??"#999",display:"inline-block"}}),e.jsx(a.Title,{heading:5,style:{margin:0},children:t.daemon.status.toUpperCase()})]}),e.jsx("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:e.jsx("tbody",{children:[["Status",t.daemon.status],["PID",t.daemon.pid??"—"],["Heartbeat age",y(t.daemon.heartbeat_age_ms)],["Started at",f(t.daemon.started_at)],["Version",t.daemon.version??"—"]].map(([r,l])=>e.jsxs("tr",{style:{borderBottom:"1px solid var(--color-border-2)"},children:[e.jsx("td",{style:{padding:"8px 4px",color:"var(--color-text-3)",width:140},children:r}),e.jsx("td",{style:{padding:"8px 4px",fontFamily:"monospace"},children:String(l)})]},String(r)))})})]}),e.jsx(n,{children:e.jsxs(a.Text,{type:"secondary",style:{fontSize:12},children:["Historical uptime chart — coming in next spec (requires daemon_health table). For now, run ",e.jsx("code",{children:"cf daemon status"})," in your terminal for recent history."]})})]})]})}export{C as default};
|
|
2
|
+
//# sourceMappingURL=DaemonHealthPage-DG2fyOP7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DaemonHealthPage-DG2fyOP7.js","sources":["../../src/pages/DaemonHealthPage.tsx"],"sourcesContent":["/**\n * DaemonHealthPage — placeholder page for /daemon-health.\n *\n * Displays current daemon health JSON and provides a link back.\n * Historical uptime chart is deferred to the next spec (daemon_health table).\n *\n * Spec: docs/design/2026-05-28/0843-daemon-watchdog-spec.md §5 Commit 3 Q4\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { Card, Typography, Space, Button, Spin } from '@arco-design/web-react'\nimport { formatLocalDisplay, formatRelative } from '../utils/time'\n\ninterface HealthResponse {\n daemon: {\n status: 'alive' | 'stale' | 'dead'\n pid: number | null\n heartbeat_age_ms: number | null\n started_at: number | null\n version: string | null\n }\n}\n\nconst STATUS_COLORS = {\n alive: 'var(--color-success)',\n stale: 'var(--color-warning)',\n dead: 'var(--color-danger, #f53f3f)',\n}\n\nfunction formatAge(ms: number | null): string {\n if (ms == null) return 'no heartbeat'\n // Convert age-in-ms to a past timestamp, then format relative\n return formatRelative(Date.now() - ms)\n}\n\nfunction formatTs(ts: number | null): string {\n if (ts == null) return '—'\n return formatLocalDisplay(ts, { includeSeconds: true })\n}\n\nexport default function DaemonHealthPage() {\n const { data, isLoading, error, refetch } = useQuery<HealthResponse>({\n queryKey: ['daemon-health-page'],\n queryFn: async () => {\n const res = await fetch('/api/health')\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n return res.json()\n },\n refetchInterval: 15_000,\n retry: 1,\n })\n\n return (\n <div style={{ maxWidth: 640, margin: '0 auto' }}>\n <div style={{ marginBottom: 16, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography.Title heading={4} style={{ margin: 0 }}>\n Daemon Health\n </Typography.Title>\n <Button size=\"small\" onClick={() => refetch()}>\n Refresh\n </Button>\n </div>\n\n {isLoading && (\n <div style={{ textAlign: 'center', padding: 32 }}>\n <Spin />\n </div>\n )}\n\n {error && (\n <Card>\n <Typography.Text type=\"error\">\n Failed to load health data: {String(error)}\n </Typography.Text>\n </Card>\n )}\n\n {data && (\n <Space direction=\"vertical\" size={16} style={{ width: '100%' }}>\n <Card>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 16 }}>\n <span\n style={{\n width: 12,\n height: 12,\n borderRadius: '50%',\n background: STATUS_COLORS[data.daemon.status] ?? '#999',\n display: 'inline-block',\n }}\n />\n <Typography.Title heading={5} style={{ margin: 0 }}>\n {data.daemon.status.toUpperCase()}\n </Typography.Title>\n </div>\n\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>\n <tbody>\n {[\n ['Status', data.daemon.status],\n ['PID', data.daemon.pid ?? '—'],\n ['Heartbeat age', formatAge(data.daemon.heartbeat_age_ms)],\n ['Started at', formatTs(data.daemon.started_at)],\n ['Version', data.daemon.version ?? '—'],\n ].map(([label, value]) => (\n <tr key={String(label)} style={{ borderBottom: '1px solid var(--color-border-2)' }}>\n <td style={{ padding: '8px 4px', color: 'var(--color-text-3)', width: 140 }}>\n {label}\n </td>\n <td style={{ padding: '8px 4px', fontFamily: 'monospace' }}>\n {String(value)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </Card>\n\n <Card>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n Historical uptime chart — coming in next spec (requires daemon_health table).\n For now, run <code>cf daemon status</code> in your terminal for recent history.\n </Typography.Text>\n </Card>\n </Space>\n )}\n </div>\n )\n}\n"],"names":["STATUS_COLORS","formatAge","ms","formatRelative","formatTs","ts","formatLocalDisplay","DaemonHealthPage","data","isLoading","error","refetch","useQuery","res","jsxs","jsx","Typography","Button","Spin","Card","Space","label","value"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as x,j as e}from"./react-vendor-tkvCrao7.js";import{b,u as f,c as S,k as C}from"./query-S6X1S7K9.js";import{T as i,b as l,f as g,t as y,u as I,d as w,X as F,E as v,R as c,U as L,O as _}from"./arco-Bhi3a6Qp.js";import"./vendor-DWgdB1eY.js";async function D(s){const t=new URLSearchParams({limit:"50"});s!=="all"&&t.set("status",s);const a=await fetch(`/api/decisions?${t.toString()}`);if(!a.ok)throw new Error(`API ${a.status}`);return a.json()}async function P(s){const t=await fetch(`/api/decisions/${s}`);if(!t.ok)throw new Error(`API ${t.status}`);return t.json()}async function $(s){const t=await fetch(`/api/decisions/${s}/approve`,{method:"POST"});if(!t.ok)throw new Error(`API ${t.status}`);return t.json()}function T(s){return s==="pending"?e.jsx(l,{color:"orange",size:"small",children:"pending"}):s==="resolved"?e.jsx(l,{color:"green",size:"small",children:"resolved"}):s==="bypassed"?e.jsx(l,{color:"gray",size:"small",children:"bypassed"}):e.jsx(l,{color:"red",size:"small",children:"expired"})}function j(s){if(!s)return[];try{const t=JSON.parse(s);return Array.isArray(t)?t:[]}catch{return[]}}function O(s){try{return new Date(s.includes("T")?s:s.replace(" ","T")+"Z").toISOString().slice(0,16).replace("T"," ")}catch{return s}}function Q(){const[s,t]=x.useState("all"),[a,d]=x.useState(null),h=b(),{data:n,isLoading:o}=f({queryKey:["decisions-list",s],queryFn:()=>D(s),placeholderData:C,refetchInterval:3e4}),{data:p,isLoading:k}=f({queryKey:["decisions-detail",a],queryFn:()=>P(a),enabled:!!a}),m=S({mutationFn:r=>$(r),onSuccess:()=>{_.success("决策已批准"),h.invalidateQueries({queryKey:["decisions-list"]}),h.invalidateQueries({queryKey:["decisions-detail"]})},onError:r=>_.error(`批准失败: ${r.message}`)}),z=x.useMemo(()=>[{title:"id",dataIndex:"id",width:110,render:r=>e.jsx(i.Text,{style:{fontFamily:"monospace",fontSize:12},children:r})},{title:"状态",dataIndex:"status",width:100,render:r=>T(r)},{title:"workflow",dataIndex:"workflow_type",width:110,render:r=>e.jsx(l,{size:"small",children:r})},{title:"trigger_prompt",dataIndex:"trigger_prompt",ellipsis:!0,render:r=>r.length>80?e.jsxs("span",{title:r,children:[r.slice(0,80),e.jsx("span",{style:{color:"var(--color-text-3)"},children:"…"})]}):r},{title:"推荐 agents",dataIndex:"recommended_agents",width:200,render:r=>r?r.split(",").map(u=>e.jsx(l,{size:"small",color:"arcoblue",children:u.trim()},u.trim())):e.jsx("span",{style:{color:"var(--color-text-3)"},children:"—"})},{title:"创建时间",dataIndex:"created_at",width:150,render:r=>e.jsx("span",{style:{fontSize:12},children:O(r)})},{title:"操作",dataIndex:"id",width:200,render:(r,u)=>e.jsxs(g,{size:"small",children:[e.jsx(y,{size:"mini",onClick:()=>d(r),children:"查看"}),u.status==="pending"&&e.jsx(y,{type:"primary",size:"mini",loading:m.isPending&&m.variables===r,onClick:()=>m.mutate(r),children:"批准"})]})}],[m]);return e.jsxs("div",{style:{padding:0},children:[e.jsx(I,{bordered:!0,title:"决策记录",extra:e.jsxs(c.Group,{type:"button",size:"small",value:s,onChange:r=>t(r),children:[e.jsx(c,{value:"all",children:"全部"}),e.jsx(c,{value:"pending",children:"待批准"}),e.jsx(c,{value:"resolved",children:"已批准"}),e.jsx(c,{value:"bypassed",children:"已 bypass"}),e.jsx(c,{value:"expired",children:"过期"})]}),style:{marginBottom:16},children:o?e.jsx(w,{animation:!0}):n&&n.length>0?e.jsx(F,{data:n,columns:z,rowKey:"id",pagination:{pageSize:20,showTotal:!0},size:"small"}):e.jsx(v,{description:"暂无决策"})}),e.jsx(L,{title:p?`决策 #${p.id}`:"决策详情",visible:!!a,onCancel:()=>d(null),onOk:()=>d(null),width:640,footer:null,children:k?e.jsx(w,{animation:!0}):p?e.jsx(q,{detail:p,onApprove:()=>m.mutate(p.id)}):e.jsx(v,{description:"未找到决策"})})]})}function q({detail:s,onApprove:t}){const a=j(s.options_json),d=j(s.risks_json),h=j(s.open_questions_json);return e.jsxs("div",{children:[e.jsx("div",{style:{marginBottom:12},children:e.jsxs(g,{size:"small",children:[T(s.status),e.jsx(l,{size:"small",children:s.workflow_type}),s.status==="pending"&&e.jsx(y,{type:"primary",size:"small",onClick:t,children:"批准"})]})}),e.jsx(i.Title,{heading:6,children:"Trigger prompt"}),e.jsx(i.Paragraph,{style:{background:"var(--color-fill-1)",padding:8,borderRadius:4},children:s.trigger_prompt}),s.recommendation&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"推荐"}),e.jsx(i.Paragraph,{children:s.recommendation})]}),a.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"Options"}),e.jsx("ul",{style:{paddingLeft:18},children:a.map((n,o)=>e.jsxs("li",{children:[e.jsx("strong",{children:n.name??`Option ${o+1}`}),n.loc?` — LOC ${n.loc}`:"",n.risk?` — risk ${n.risk}`:""]},o))})]}),d.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"Risks"}),e.jsx("ul",{style:{paddingLeft:18},children:d.map((n,o)=>e.jsx("li",{children:n},o))})]}),h.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"Open Questions"}),e.jsx("ul",{style:{paddingLeft:18},children:h.map((n,o)=>e.jsx("li",{children:n},o))})]}),s.recommended_agents&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"推荐 agents"}),e.jsx(g,{size:"small",wrap:!0,children:s.recommended_agents.split(",").map(n=>e.jsx(l,{color:"arcoblue",children:n.trim()},n.trim()))})]}),s.recommended_skills&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,style:{marginTop:12},children:"推荐 skills"}),e.jsx(g,{size:"small",wrap:!0,children:s.recommended_skills.split(",").map(n=>e.jsx(l,{color:"cyan",children:n.trim()},n.trim()))})]}),s.related_spawns.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs(i.Title,{heading:6,style:{marginTop:12},children:["关联 spawn (",s.related_spawns.length,")"]}),e.jsx("ul",{style:{paddingLeft:18},children:s.related_spawns.map(n=>e.jsxs("li",{children:[n.routed_to_name??"(unknown)"," — ts=",new Date(n.ts).toISOString().slice(0,19),n.obeyed===1?" ✅":n.obeyed===0?" ❌":" ⏳"]},n.id))})]}),(s.related_changelogs??[]).length>0&&e.jsxs(e.Fragment,{children:[e.jsxs(i.Title,{heading:6,style:{marginTop:12},children:["关联 changelog (",(s.related_changelogs??[]).length,")"]}),e.jsx("ul",{style:{paddingLeft:18,fontFamily:"monospace",fontSize:12},children:(s.related_changelogs??[]).map(n=>e.jsx("li",{children:n},n))})]}),s.decision_doc_path&&e.jsxs(i.Paragraph,{style:{marginTop:12,fontSize:12,color:"var(--color-text-3)"},children:["Decision doc: ",e.jsx("code",{children:s.decision_doc_path})]})]})}export{Q as default};
|
|
2
|
+
//# sourceMappingURL=DecisionsPage-CMAPEnKb.js.map
|