@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 @@
|
|
|
1
|
+
{"version":3,"file":"DecisionsPage-CMAPEnKb.js","sources":["../../src/pages/DecisionsPage.tsx"],"sourcesContent":["/**\n * /decisions — 决策列表 + 详情 (spec 1527 Commit 4).\n *\n * 端到端 pipeline 第 ⑤ 步: 让用户在 Web 上看到 decision-maker 产出的决策,\n * 一键 Approve,并查看关联 spawn / changelog (来自 routing_events.decision_id\n * 回填 + best-effort docs/implementation 文件名匹配).\n *\n * Q3 (spec 1527 Open Questions): read + approve only — 不让用户在 Web 上编辑\n * recommendation / options_json. 想改 → 走 cf decisions update CLI.\n *\n * 数据源:\n * - GET /api/decisions?limit=50&status=...\n * - GET /api/decisions/:id (含 related_spawns + related_changelogs)\n * - POST /api/decisions/:id/approve\n */\n\nimport { useMemo, useState } from 'react'\nimport { useQuery, useMutation, useQueryClient, keepPreviousData } from '@tanstack/react-query'\nimport Card from '@arco-design/web-react/es/Card'\nimport Table from '@arco-design/web-react/es/Table'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Button from '@arco-design/web-react/es/Button'\nimport Drawer from '@arco-design/web-react/es/Drawer'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Message from '@arco-design/web-react/es/Message'\nimport Radio from '@arco-design/web-react/es/Radio'\nimport Space from '@arco-design/web-react/es/Space'\n\n// ─── Types (mirror /api/decisions response shape) ────────────────────────\n\ninterface DecisionRow {\n id: string\n session_id: string\n project_path: string\n trigger_prompt: string\n workflow_type: string\n suggested_agent: string | null\n status: 'pending' | 'resolved' | 'bypassed' | 'expired'\n options_json: string | null\n recommendation: string | null\n risks_json: string | null\n open_questions_json: string | null\n decision_doc_path: string | null\n recommended_agents: string | null\n recommended_skills: string | null\n approved_at: string | null\n approved_by: string | null\n created_at: string\n expires_at: string\n}\n\ninterface RelatedSpawn {\n id: number\n routed_to_name: string | null\n ts: number\n obeyed: number | null\n}\n\ninterface DecisionDetail extends DecisionRow {\n related_spawns: RelatedSpawn[]\n spawn_count: number\n related_changelogs?: string[]\n}\n\ntype StatusFilter = 'all' | 'pending' | 'resolved' | 'bypassed' | 'expired'\n\n// ─── API helpers ─────────────────────────────────────────────────────────\n\nasync function fetchList(status: StatusFilter): Promise<DecisionRow[]> {\n const params = new URLSearchParams({ limit: '50' })\n if (status !== 'all') params.set('status', status)\n const res = await fetch(`/api/decisions?${params.toString()}`)\n if (!res.ok) throw new Error(`API ${res.status}`)\n return res.json()\n}\n\nasync function fetchDetail(id: string): Promise<DecisionDetail> {\n const res = await fetch(`/api/decisions/${id}`)\n if (!res.ok) throw new Error(`API ${res.status}`)\n return res.json()\n}\n\nasync function postApprove(id: string): Promise<{ ok: boolean; status?: string }> {\n const res = await fetch(`/api/decisions/${id}/approve`, { method: 'POST' })\n if (!res.ok) throw new Error(`API ${res.status}`)\n return res.json()\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────\n\nfunction statusTag(s: DecisionRow['status']) {\n if (s === 'pending') return <Tag color=\"orange\" size=\"small\">pending</Tag>\n if (s === 'resolved') return <Tag color=\"green\" size=\"small\">resolved</Tag>\n if (s === 'bypassed') return <Tag color=\"gray\" size=\"small\">bypassed</Tag>\n return <Tag color=\"red\" size=\"small\">expired</Tag>\n}\n\nfunction safeJsonArr<T>(s: string | null): T[] {\n if (!s) return []\n try {\n const v = JSON.parse(s)\n return Array.isArray(v) ? (v as T[]) : []\n } catch {\n return []\n }\n}\n\nfunction tsLabel(iso: string): string {\n try {\n const d = new Date(iso.includes('T') ? iso : iso.replace(' ', 'T') + 'Z')\n return d.toISOString().slice(0, 16).replace('T', ' ')\n } catch {\n return iso\n }\n}\n\n// ─── Page ────────────────────────────────────────────────────────────────\n\nexport default function DecisionsPage() {\n const [status, setStatus] = useState<StatusFilter>('all')\n const [activeId, setActiveId] = useState<string | null>(null)\n const queryClient = useQueryClient()\n\n const { data: rows, isLoading } = useQuery({\n queryKey: ['decisions-list', status],\n queryFn: () => fetchList(status),\n placeholderData: keepPreviousData,\n refetchInterval: 30_000,\n })\n\n const { data: detail, isLoading: isDetailLoading } = useQuery({\n queryKey: ['decisions-detail', activeId],\n queryFn: () => fetchDetail(activeId!),\n enabled: !!activeId,\n })\n\n const approveMutation = useMutation({\n mutationFn: (id: string) => postApprove(id),\n onSuccess: () => {\n Message.success('决策已批准')\n queryClient.invalidateQueries({ queryKey: ['decisions-list'] })\n queryClient.invalidateQueries({ queryKey: ['decisions-detail'] })\n },\n onError: (err: Error) => Message.error(`批准失败: ${err.message}`),\n })\n\n const columns = useMemo(\n () => [\n {\n title: 'id',\n dataIndex: 'id',\n width: 110,\n render: (id: string) => (\n <Typography.Text style={{ fontFamily: 'monospace', fontSize: 12 }}>{id}</Typography.Text>\n ),\n },\n {\n title: '状态',\n dataIndex: 'status',\n width: 100,\n render: (s: DecisionRow['status']) => statusTag(s),\n },\n {\n title: 'workflow',\n dataIndex: 'workflow_type',\n width: 110,\n render: (w: string) => <Tag size=\"small\">{w}</Tag>,\n },\n {\n title: 'trigger_prompt',\n dataIndex: 'trigger_prompt',\n ellipsis: true,\n render: (p: string) =>\n p.length > 80 ? (\n <span title={p}>\n {p.slice(0, 80)}\n <span style={{ color: 'var(--color-text-3)' }}>…</span>\n </span>\n ) : (\n p\n ),\n },\n {\n title: '推荐 agents',\n dataIndex: 'recommended_agents',\n width: 200,\n render: (a: string | null) =>\n a ? a.split(',').map((x) => <Tag key={x.trim()} size=\"small\" color=\"arcoblue\">{x.trim()}</Tag>) : (\n <span style={{ color: 'var(--color-text-3)' }}>—</span>\n ),\n },\n {\n title: '创建时间',\n dataIndex: 'created_at',\n width: 150,\n render: (t: string) => <span style={{ fontSize: 12 }}>{tsLabel(t)}</span>,\n },\n {\n title: '操作',\n dataIndex: 'id',\n width: 200,\n render: (id: string, row: DecisionRow) => (\n <Space size=\"small\">\n <Button size=\"mini\" onClick={() => setActiveId(id)}>\n 查看\n </Button>\n {row.status === 'pending' && (\n <Button\n type=\"primary\"\n size=\"mini\"\n loading={approveMutation.isPending && approveMutation.variables === id}\n onClick={() => approveMutation.mutate(id)}\n >\n 批准\n </Button>\n )}\n </Space>\n ),\n },\n ],\n [approveMutation],\n )\n\n return (\n <div style={{ padding: 0 }}>\n <Card\n bordered\n title=\"决策记录\"\n extra={\n <Radio.Group\n type=\"button\"\n size=\"small\"\n value={status}\n onChange={(v) => setStatus(v as StatusFilter)}\n >\n <Radio value=\"all\">全部</Radio>\n <Radio value=\"pending\">待批准</Radio>\n <Radio value=\"resolved\">已批准</Radio>\n <Radio value=\"bypassed\">已 bypass</Radio>\n <Radio value=\"expired\">过期</Radio>\n </Radio.Group>\n }\n style={{ marginBottom: 16 }}\n >\n {isLoading ? (\n <Skeleton animation />\n ) : rows && rows.length > 0 ? (\n <Table\n data={rows}\n columns={columns as never}\n rowKey=\"id\"\n pagination={{ pageSize: 20, showTotal: true }}\n size=\"small\"\n />\n ) : (\n <Empty description=\"暂无决策\" />\n )}\n </Card>\n\n <Drawer\n title={detail ? `决策 #${detail.id}` : '决策详情'}\n visible={!!activeId}\n onCancel={() => setActiveId(null)}\n onOk={() => setActiveId(null)}\n width={640}\n footer={null}\n >\n {isDetailLoading ? (\n <Skeleton animation />\n ) : detail ? (\n <DecisionDetailView detail={detail} onApprove={() => approveMutation.mutate(detail.id)} />\n ) : (\n <Empty description=\"未找到决策\" />\n )}\n </Drawer>\n </div>\n )\n}\n\n// ─── Detail view (read-only per Q3) ──────────────────────────────────────\n\nfunction DecisionDetailView({\n detail,\n onApprove,\n}: {\n detail: DecisionDetail\n onApprove: () => void\n}) {\n const options = safeJsonArr<{ name?: string; risk?: string; loc?: string }>(detail.options_json)\n const risks = safeJsonArr<string>(detail.risks_json)\n const oqs = safeJsonArr<string>(detail.open_questions_json)\n\n return (\n <div>\n <div style={{ marginBottom: 12 }}>\n <Space size=\"small\">\n {statusTag(detail.status)}\n <Tag size=\"small\">{detail.workflow_type}</Tag>\n {detail.status === 'pending' && (\n <Button type=\"primary\" size=\"small\" onClick={onApprove}>\n 批准\n </Button>\n )}\n </Space>\n </div>\n\n <Typography.Title heading={6}>Trigger prompt</Typography.Title>\n <Typography.Paragraph style={{ background: 'var(--color-fill-1)', padding: 8, borderRadius: 4 }}>\n {detail.trigger_prompt}\n </Typography.Paragraph>\n\n {detail.recommendation && (\n <>\n <Typography.Title heading={6}>推荐</Typography.Title>\n <Typography.Paragraph>{detail.recommendation}</Typography.Paragraph>\n </>\n )}\n\n {options.length > 0 && (\n <>\n <Typography.Title heading={6}>Options</Typography.Title>\n <ul style={{ paddingLeft: 18 }}>\n {options.map((o, i) => (\n <li key={i}>\n <strong>{o.name ?? `Option ${i + 1}`}</strong>\n {o.loc ? ` — LOC ${o.loc}` : ''}\n {o.risk ? ` — risk ${o.risk}` : ''}\n </li>\n ))}\n </ul>\n </>\n )}\n\n {risks.length > 0 && (\n <>\n <Typography.Title heading={6}>Risks</Typography.Title>\n <ul style={{ paddingLeft: 18 }}>\n {risks.map((r, i) => (\n <li key={i}>{r}</li>\n ))}\n </ul>\n </>\n )}\n\n {oqs.length > 0 && (\n <>\n <Typography.Title heading={6}>Open Questions</Typography.Title>\n <ul style={{ paddingLeft: 18 }}>\n {oqs.map((q, i) => (\n <li key={i}>{q}</li>\n ))}\n </ul>\n </>\n )}\n\n {detail.recommended_agents && (\n <>\n <Typography.Title heading={6}>推荐 agents</Typography.Title>\n <Space size=\"small\" wrap>\n {detail.recommended_agents.split(',').map((a) => (\n <Tag key={a.trim()} color=\"arcoblue\">\n {a.trim()}\n </Tag>\n ))}\n </Space>\n </>\n )}\n\n {detail.recommended_skills && (\n <>\n <Typography.Title heading={6} style={{ marginTop: 12 }}>\n 推荐 skills\n </Typography.Title>\n <Space size=\"small\" wrap>\n {detail.recommended_skills.split(',').map((s) => (\n <Tag key={s.trim()} color=\"cyan\">\n {s.trim()}\n </Tag>\n ))}\n </Space>\n </>\n )}\n\n {detail.related_spawns.length > 0 && (\n <>\n <Typography.Title heading={6} style={{ marginTop: 12 }}>\n 关联 spawn ({detail.related_spawns.length})\n </Typography.Title>\n <ul style={{ paddingLeft: 18 }}>\n {detail.related_spawns.map((s) => (\n <li key={s.id}>\n {s.routed_to_name ?? '(unknown)'} — ts={new Date(s.ts).toISOString().slice(0, 19)}\n {s.obeyed === 1 ? ' ✅' : s.obeyed === 0 ? ' ❌' : ' ⏳'}\n </li>\n ))}\n </ul>\n </>\n )}\n\n {(detail.related_changelogs ?? []).length > 0 && (\n <>\n <Typography.Title heading={6} style={{ marginTop: 12 }}>\n 关联 changelog ({(detail.related_changelogs ?? []).length})\n </Typography.Title>\n <ul style={{ paddingLeft: 18, fontFamily: 'monospace', fontSize: 12 }}>\n {(detail.related_changelogs ?? []).map((p) => (\n <li key={p}>{p}</li>\n ))}\n </ul>\n </>\n )}\n\n {detail.decision_doc_path && (\n <Typography.Paragraph style={{ marginTop: 12, fontSize: 12, color: 'var(--color-text-3)' }}>\n Decision doc: <code>{detail.decision_doc_path}</code>\n </Typography.Paragraph>\n )}\n </div>\n )\n}\n"],"names":["fetchList","status","params","res","fetchDetail","id","postApprove","statusTag","jsx","Tag","safeJsonArr","v","tsLabel","iso","DecisionsPage","setStatus","useState","activeId","setActiveId","queryClient","useQueryClient","rows","isLoading","useQuery","keepPreviousData","detail","isDetailLoading","approveMutation","useMutation","Message","err","columns","useMemo","Typography","s","w","p","jsxs","a","x","t","row","Space","Button","Card","Radio","Skeleton","Table","Empty","Drawer","DecisionDetailView","onApprove","options","risks","oqs","Fragment","o","i","r","q"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as g,j as e}from"./react-vendor-tkvCrao7.js";import{b as k,u as z,c as P}from"./query-S6X1S7K9.js";import{a as A}from"./auth-Bnf8ZcqN.js";import{T as s,f as m,t as j,u as r,S as _,b,K as F,ah as S}from"./arco-Bhi3a6Qp.js";import"./vendor-DWgdB1eY.js";const O={pass:"green",warn:"orange",fail:"red",skip:"gray"};function d({label:c,value:h,color:a}){return e.jsxs(r,{style:{minWidth:120,textAlign:"center"},bodyStyle:{padding:12},children:[e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:c}),e.jsx("div",{style:{fontSize:24,fontWeight:600,color:a??"inherit",marginTop:4},children:h})]})}function q(){var u;const c=k(),[h,a]=g.useState(!1),[n,T]=g.useState(null),{data:i,isLoading:w,error:f,refetch:v}=z({queryKey:["diagnostics-page"],queryFn:async()=>{const t=await fetch("/api/diagnostics?refresh=1");if(!t.ok)throw new Error(`HTTP ${t.status}`);return t.json()},refetchInterval:3e4,retry:1}),p=P({mutationFn:async()=>{const t=await A("/api/diagnostics/fix",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({confirm:!0})});if(!t.ok){const y=await t.json().catch(()=>null);throw new Error((y==null?void 0:y.message)??`HTTP ${t.status}`)}return t.json()},onSuccess:t=>{T(t),S.success({content:t.ok?"Fixes applied":"Some fixes failed (see output)"}),c.invalidateQueries({queryKey:["diagnostics-page"]}),c.invalidateQueries({queryKey:["diagnostics-badge"]})},onError:t=>{S.error({content:`Fix failed: ${String(t)}`})}}),l=(i==null?void 0:i.checks.filter(t=>t.fixable_by==="cf fix"&&t.status!=="pass"&&t.status!=="skip"))??[],o=((u=i==null?void 0:i.meta)==null?void 0:u.current_project_path)??null,x=!o,C=l.length===0||p.isPending||x;return e.jsxs("div",{style:{maxWidth:920,margin:"0 auto",paddingBottom:32},children:[e.jsxs("div",{style:{marginBottom:16,display:"flex",alignItems:"center",justifyContent:"space-between"},children:[e.jsx(s.Title,{heading:4,style:{margin:0},children:"诊断"}),e.jsxs(m,{children:[e.jsx(j,{size:"small",onClick:()=>v(),children:"刷新"}),e.jsx(j,{size:"small",type:"primary",status:"warning",disabled:C,onClick:()=>a(!0),children:x?"无项目上下文":l.length===0?"无可修复项":`一键修复 (${l.length})`})]})]}),i&&e.jsx(r,{style:{marginBottom:16,borderLeft:`4px solid ${x?"#f53f3f":"#3491fa"}`},bodyStyle:{padding:12},children:o?e.jsxs(s.Text,{children:[e.jsx(s.Text,{type:"secondary",style:{marginRight:8},children:"当前项目:"}),e.jsx(s.Text,{code:!0,children:o}),e.jsx(s.Text,{type:"secondary",style:{marginLeft:8,fontSize:12},children:"(最近活跃)"})]}):e.jsx(s.Text,{type:"warning",children:"尚无项目活动 — 在某个项目目录下打开 Claude Code 让 daemon 记录事件后,项目级检查 (5/6) 与一键修复才会启用。"})}),w&&e.jsx("div",{style:{textAlign:"center",padding:32},children:e.jsx(_,{})}),f&&e.jsx(r,{children:e.jsxs(s.Text,{type:"error",children:["加载诊断失败: ",String(f)]})}),i&&e.jsxs(m,{direction:"vertical",size:16,style:{width:"100%"},children:[e.jsxs("div",{style:{display:"flex",gap:12,flexWrap:"wrap"},children:[e.jsx(d,{label:"PASS",value:i.summary.pass,color:"#00b42a"}),e.jsx(d,{label:"WARN",value:i.summary.warn,color:"#ff7d00"}),e.jsx(d,{label:"FAIL",value:i.summary.fail,color:"#f53f3f"}),e.jsx(d,{label:"SKIP",value:i.summary.skip,color:"#86909c"}),e.jsx(d,{label:"可自动修复",value:i.summary.fixable,color:"#3491fa"})]}),e.jsx(r,{title:"9 项检查",children:e.jsxs("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:[e.jsx("thead",{children:e.jsxs("tr",{style:{background:"var(--color-fill-1)"},children:[e.jsx("th",{style:{padding:8,textAlign:"left",width:60},children:"#"}),e.jsx("th",{style:{padding:8,textAlign:"left",width:80},children:"状态"}),e.jsx("th",{style:{padding:8,textAlign:"left",width:180},children:"检查项"}),e.jsx("th",{style:{padding:8,textAlign:"left"},children:"详情"})]})}),e.jsx("tbody",{children:i.checks.map(t=>e.jsxs("tr",{style:{borderBottom:"1px solid var(--color-border-2)"},children:[e.jsx("td",{style:{padding:8,fontFamily:"monospace"},children:t.id}),e.jsx("td",{style:{padding:8},children:e.jsx(b,{color:O[t.status],children:t.status.toUpperCase()})}),e.jsx("td",{style:{padding:8,fontFamily:"monospace"},children:t.name}),e.jsxs("td",{style:{padding:8},children:[e.jsx("div",{children:t.message}),t.details&&e.jsx("div",{style:{fontSize:12,color:"var(--color-text-3)",marginTop:4},children:t.details}),t.fix_hint&&(t.status==="warn"||t.status==="fail")&&e.jsxs("div",{style:{marginTop:4,fontSize:12},children:[e.jsx(s.Text,{code:!0,children:t.fix_hint}),t.fixable_by==="cf fix"&&e.jsx(b,{color:"cyan",size:"small",style:{marginLeft:6},children:"fixable"})]})]})]},t.id))})]})}),n&&e.jsxs(r,{title:`修复结果 (exit ${n.exit_code})`,children:[e.jsx(s.Paragraph,{code:!0,children:n.command}),n.cwd&&e.jsxs(s.Paragraph,{type:"secondary",style:{fontSize:12,marginTop:-8},children:["cwd: ",e.jsx(s.Text,{code:!0,children:n.cwd})]}),n.stdout&&e.jsx("pre",{style:{fontSize:12,whiteSpace:"pre-wrap",background:"var(--color-fill-1)",padding:8,borderRadius:4},children:n.stdout}),n.stderr&&e.jsx("pre",{style:{fontSize:12,whiteSpace:"pre-wrap",color:"#f53f3f",background:"var(--color-fill-1)",padding:8,borderRadius:4},children:n.stderr})]}),e.jsx(r,{children:e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:["生成时间: ",i.generated_at]})})]}),e.jsxs(F,{title:"确认自动修复",visible:h,onCancel:()=>a(!1),onOk:()=>{a(!1),p.mutate()},okText:"确认运行",cancelText:"取消",okButtonProps:{status:"warning",loading:p.isPending,disabled:x},children:[o?e.jsxs(r,{style:{marginBottom:12,background:"var(--color-fill-1)"},bodyStyle:{padding:12},children:[e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:"将在以下目录执行:"}),e.jsx("div",{style:{marginTop:4},children:e.jsx(s.Text,{code:!0,style:{fontSize:13},children:o})})]}):e.jsx(s.Text,{type:"error",children:"没有可用的项目上下文 — 修复被阻止以免污染 daemon 目录。"}),e.jsxs(s.Paragraph,{children:["以下 ",l.length," 项将通过 ",e.jsx(s.Text,{code:!0,children:"cf fix --apply --yes"})," 自动修复:"]}),e.jsx("ul",{style:{paddingLeft:20},children:l.map(t=>e.jsxs("li",{style:{marginBottom:4},children:["#",t.id," ",t.name," → ",e.jsx(s.Text,{code:!0,children:t.fix_hint})]},t.id))})]})]})}export{q as default};
|
|
2
|
+
//# sourceMappingURL=DiagnosticsPage-DQd-Zm4r.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiagnosticsPage-DQd-Zm4r.js","sources":["../../src/pages/DiagnosticsPage.tsx"],"sourcesContent":["/**\n * DiagnosticsPage — `/diagnostics` view.\n *\n * Renders the 9-check doctor report + a one-click \"Run all auto-fixes\" button.\n * The fix button opens a confirm modal listing planned commands before\n * POSTing to /api/diagnostics/fix with `{ confirm: true }`.\n *\n * Spec: docs/design/2026-06-01/1030-cf-doctor-diagnostic-spec.md\n */\n\nimport { useState } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport {\n Button,\n Card,\n Modal,\n Notification,\n Space,\n Spin,\n Tag,\n Typography,\n} from '@arco-design/web-react'\nimport { authFetch } from '../utils/auth'\n\ntype Status = 'pass' | 'warn' | 'fail' | 'skip'\n\ninterface CheckResult {\n id: number\n name: string\n status: Status\n message: string\n details?: string\n fix_hint?: string\n fixable_by?: 'cf fix' | 'manual'\n}\n\ninterface DiagnosticsMeta {\n current_project_path: string | null\n project_source: 'recent-event' | 'none'\n}\n\ninterface DiagnosticsResponse {\n summary: { pass: number; warn: number; fail: number; skip: number; fixable: number }\n checks: CheckResult[]\n generated_at: string\n /** spec e5b845c4: project resolved by the server (most-recent or null). */\n meta?: DiagnosticsMeta\n}\n\ninterface FixResponse {\n ok: boolean\n exit_code: number | null\n stdout: string\n stderr: string\n command: string\n /** spec e5b845c4: cwd actually used by the spawned `cf fix`. */\n cwd?: string\n}\n\nconst STATUS_COLOR: Record<Status, string> = {\n pass: 'green',\n warn: 'orange',\n fail: 'red',\n skip: 'gray',\n}\n\nfunction SummaryCard({ label, value, color }: { label: string; value: number; color?: string }) {\n return (\n <Card style={{ minWidth: 120, textAlign: 'center' }} bodyStyle={{ padding: 12 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>{label}</Typography.Text>\n <div style={{ fontSize: 24, fontWeight: 600, color: color ?? 'inherit', marginTop: 4 }}>\n {value}\n </div>\n </Card>\n )\n}\n\nexport default function DiagnosticsPage() {\n const qc = useQueryClient()\n const [modalOpen, setModalOpen] = useState(false)\n const [fixOutput, setFixOutput] = useState<FixResponse | null>(null)\n\n const { data, isLoading, error, refetch } = useQuery<DiagnosticsResponse>({\n queryKey: ['diagnostics-page'],\n queryFn: async () => {\n const res = await fetch('/api/diagnostics?refresh=1')\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n return res.json()\n },\n refetchInterval: 30_000,\n retry: 1,\n })\n\n const fixMutation = useMutation<FixResponse>({\n mutationFn: async () => {\n const res = await authFetch('/api/diagnostics/fix', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ confirm: true }),\n })\n if (!res.ok) {\n const body = (await res.json().catch(() => null)) as { message?: string } | null\n throw new Error(body?.message ?? `HTTP ${res.status}`)\n }\n return res.json()\n },\n onSuccess: (out) => {\n setFixOutput(out)\n Notification.success({ content: out.ok ? 'Fixes applied' : 'Some fixes failed (see output)' })\n qc.invalidateQueries({ queryKey: ['diagnostics-page'] })\n qc.invalidateQueries({ queryKey: ['diagnostics-badge'] })\n },\n onError: (err) => {\n Notification.error({ content: `Fix failed: ${String(err)}` })\n },\n })\n\n const fixable = data?.checks.filter((c) => c.fixable_by === 'cf fix' && c.status !== 'pass' && c.status !== 'skip') ?? []\n const projectPath = data?.meta?.current_project_path ?? null\n const noProject = !projectPath\n const fixDisabled = fixable.length === 0 || fixMutation.isPending || noProject\n\n return (\n <div style={{ maxWidth: 920, margin: '0 auto', paddingBottom: 32 }}>\n <div style={{ marginBottom: 16, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography.Title heading={4} style={{ margin: 0 }}>诊断</Typography.Title>\n <Space>\n <Button size=\"small\" onClick={() => refetch()}>刷新</Button>\n <Button\n size=\"small\"\n type=\"primary\"\n status=\"warning\"\n disabled={fixDisabled}\n onClick={() => setModalOpen(true)}\n >\n {noProject\n ? '无项目上下文'\n : fixable.length === 0\n ? '无可修复项'\n : `一键修复 (${fixable.length})`}\n </Button>\n </Space>\n </div>\n\n {/* spec e5b845c4: surface the project that the server picked. */}\n {data && (\n <Card\n style={{\n marginBottom: 16,\n borderLeft: `4px solid ${noProject ? '#f53f3f' : '#3491fa'}`,\n }}\n bodyStyle={{ padding: 12 }}\n >\n {projectPath ? (\n <Typography.Text>\n <Typography.Text type=\"secondary\" style={{ marginRight: 8 }}>当前项目:</Typography.Text>\n <Typography.Text code>{projectPath}</Typography.Text>\n <Typography.Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n (最近活跃)\n </Typography.Text>\n </Typography.Text>\n ) : (\n <Typography.Text type=\"warning\">\n 尚无项目活动 — 在某个项目目录下打开 Claude Code 让 daemon 记录事件后,项目级检查 (5/6) 与一键修复才会启用。\n </Typography.Text>\n )}\n </Card>\n )}\n\n {isLoading && (\n <div style={{ textAlign: 'center', padding: 32 }}><Spin /></div>\n )}\n {error && (\n <Card>\n <Typography.Text type=\"error\">加载诊断失败: {String(error)}</Typography.Text>\n </Card>\n )}\n\n {data && (\n <Space direction=\"vertical\" size={16} style={{ width: '100%' }}>\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n <SummaryCard label=\"PASS\" value={data.summary.pass} color=\"#00b42a\" />\n <SummaryCard label=\"WARN\" value={data.summary.warn} color=\"#ff7d00\" />\n <SummaryCard label=\"FAIL\" value={data.summary.fail} color=\"#f53f3f\" />\n <SummaryCard label=\"SKIP\" value={data.summary.skip} color=\"#86909c\" />\n <SummaryCard label=\"可自动修复\" value={data.summary.fixable} color=\"#3491fa\" />\n </div>\n\n <Card title=\"9 项检查\">\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>\n <thead>\n <tr style={{ background: 'var(--color-fill-1)' }}>\n <th style={{ padding: 8, textAlign: 'left', width: 60 }}>#</th>\n <th style={{ padding: 8, textAlign: 'left', width: 80 }}>状态</th>\n <th style={{ padding: 8, textAlign: 'left', width: 180 }}>检查项</th>\n <th style={{ padding: 8, textAlign: 'left' }}>详情</th>\n </tr>\n </thead>\n <tbody>\n {data.checks.map((c) => (\n <tr key={c.id} style={{ borderBottom: '1px solid var(--color-border-2)' }}>\n <td style={{ padding: 8, fontFamily: 'monospace' }}>{c.id}</td>\n <td style={{ padding: 8 }}><Tag color={STATUS_COLOR[c.status]}>{c.status.toUpperCase()}</Tag></td>\n <td style={{ padding: 8, fontFamily: 'monospace' }}>{c.name}</td>\n <td style={{ padding: 8 }}>\n <div>{c.message}</div>\n {c.details && (\n <div style={{ fontSize: 12, color: 'var(--color-text-3)', marginTop: 4 }}>{c.details}</div>\n )}\n {c.fix_hint && (c.status === 'warn' || c.status === 'fail') && (\n <div style={{ marginTop: 4, fontSize: 12 }}>\n <Typography.Text code>{c.fix_hint}</Typography.Text>\n {c.fixable_by === 'cf fix' && (\n <Tag color=\"cyan\" size=\"small\" style={{ marginLeft: 6 }}>fixable</Tag>\n )}\n </div>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </Card>\n\n {fixOutput && (\n <Card title={`修复结果 (exit ${fixOutput.exit_code})`}>\n <Typography.Paragraph code>{fixOutput.command}</Typography.Paragraph>\n {fixOutput.cwd && (\n <Typography.Paragraph type=\"secondary\" style={{ fontSize: 12, marginTop: -8 }}>\n cwd: <Typography.Text code>{fixOutput.cwd}</Typography.Text>\n </Typography.Paragraph>\n )}\n {fixOutput.stdout && (\n <pre style={{ fontSize: 12, whiteSpace: 'pre-wrap', background: 'var(--color-fill-1)', padding: 8, borderRadius: 4 }}>\n {fixOutput.stdout}\n </pre>\n )}\n {fixOutput.stderr && (\n <pre style={{ fontSize: 12, whiteSpace: 'pre-wrap', color: '#f53f3f', background: 'var(--color-fill-1)', padding: 8, borderRadius: 4 }}>\n {fixOutput.stderr}\n </pre>\n )}\n </Card>\n )}\n\n <Card>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 生成时间: {data.generated_at}\n </Typography.Text>\n </Card>\n </Space>\n )}\n\n <Modal\n title=\"确认自动修复\"\n visible={modalOpen}\n onCancel={() => setModalOpen(false)}\n onOk={() => {\n setModalOpen(false)\n fixMutation.mutate()\n }}\n okText=\"确认运行\"\n cancelText=\"取消\"\n okButtonProps={{\n status: 'warning',\n loading: fixMutation.isPending,\n disabled: noProject,\n }}\n >\n {/* spec e5b845c4 OQ#4: P0 safety — always show target cwd so user\n can verify before letting `cf project init` write to disk. */}\n {projectPath ? (\n <Card\n style={{ marginBottom: 12, background: 'var(--color-fill-1)' }}\n bodyStyle={{ padding: 12 }}\n >\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 将在以下目录执行:\n </Typography.Text>\n <div style={{ marginTop: 4 }}>\n <Typography.Text code style={{ fontSize: 13 }}>{projectPath}</Typography.Text>\n </div>\n </Card>\n ) : (\n <Typography.Text type=\"error\">\n 没有可用的项目上下文 — 修复被阻止以免污染 daemon 目录。\n </Typography.Text>\n )}\n <Typography.Paragraph>\n 以下 {fixable.length} 项将通过 <Typography.Text code>cf fix --apply --yes</Typography.Text> 自动修复:\n </Typography.Paragraph>\n <ul style={{ paddingLeft: 20 }}>\n {fixable.map((c) => (\n <li key={c.id} style={{ marginBottom: 4 }}>\n #{c.id} {c.name} → <Typography.Text code>{c.fix_hint}</Typography.Text>\n </li>\n ))}\n </ul>\n </Modal>\n </div>\n )\n}\n"],"names":["STATUS_COLOR","SummaryCard","label","value","color","jsxs","Card","jsx","Typography","DiagnosticsPage","qc","useQueryClient","modalOpen","setModalOpen","useState","fixOutput","setFixOutput","data","isLoading","error","refetch","useQuery","res","fixMutation","useMutation","authFetch","body","out","Notification","err","fixable","c","projectPath","_a","noProject","fixDisabled","Space","Button","Spin","Tag","Modal"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{j as e}from"./react-vendor-tkvCrao7.js";import{u as c}from"./query-S6X1S7K9.js";import{d as x,E as d,T as s,b as i,X as p}from"./arco-Bhi3a6Qp.js";import"./vendor-DWgdB1eY.js";const f={pass:"green",warn:"orange",fail:"red"},u={pass:"通过",warn:"警告",fail:"失败"};async function y(){const r=await fetch("/api/drift/report?days=7");if(!r.ok)throw{status:r.status,message:`HTTP ${r.status}`};return r.json()}function m(r){return typeof r=="object"&&r!==null&&"message"in r}function S(){const{data:r,isLoading:l,error:n}=c({queryKey:["drift-report-7d"],queryFn:y,staleTime:3e5});if(l)return e.jsx(x,{animation:!0,text:{rows:8}});if(n){const t=m(n)?n:{message:String(n)},o=t.status?`HTTP ${t.status} — `:"";return e.jsx(d,{description:e.jsxs("span",{children:[e.jsx(s.Text,{type:"error",children:"Drift 报表暂不可用"}),e.jsx("br",{}),e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:[o,t.message]})]})})}if(!r)return e.jsx(d,{description:"无数据",imgSrc:""});const a=r.checks.reduce((t,o)=>(t[o.status]+=1,t),{pass:0,warn:0,fail:0});return e.jsxs("div",{children:[e.jsxs(s.Title,{heading:6,style:{marginBottom:4},children:["CLAUDE.md 行为漂移报表 (近 ",r.period.days," 天)"]}),e.jsxs(s.Paragraph,{type:"secondary",style:{fontSize:13,marginBottom:12},children:["来源 ",e.jsx("code",{children:"/api/drift/report"}),". 比对 CLAUDE.md 声明的规则与实际事件流。"]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:16,marginBottom:16,padding:"12px 16px",background:"var(--color-fill-2)",borderRadius:4,flexWrap:"wrap"},"data-testid":"drift-summary",children:[e.jsxs("div",{children:[e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:"合规分"}),e.jsxs("div",{style:{fontSize:24,fontWeight:600,fontVariantNumeric:"tabular-nums"},children:[r.overallScore,e.jsx(s.Text,{type:"secondary",style:{fontSize:12,marginLeft:4},children:"/100"})]})]}),e.jsxs("div",{style:{display:"flex",gap:8},children:[e.jsxs(i,{color:"green",children:["通过 ",a.pass]}),e.jsxs(i,{color:"orange",children:["警告 ",a.warn]}),e.jsxs(i,{color:"red",children:["失败 ",a.fail]})]})]}),r.checks.length===0?e.jsx(d,{description:"无检查项",imgSrc:""}):e.jsx(p,{data:r.checks,rowKey:"rule",pagination:!1,borderCell:!0,size:"small",columns:[{title:"规则",dataIndex:"rule",width:180,render:t=>e.jsx("strong",{style:{fontSize:13},children:t})},{title:"状态",dataIndex:"status",width:100,render:t=>e.jsx(i,{color:f[t],children:u[t]})},{title:"期望",dataIndex:"expected",render:t=>e.jsx(s.Text,{style:{fontSize:12},children:t})},{title:"实际",dataIndex:"actual",render:t=>e.jsx(s.Text,{style:{fontSize:12},children:t})},{title:"说明",dataIndex:"detail",render:t=>t?e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:t}):e.jsx("span",{style:{color:"var(--color-text-4)"},children:"—"})}]})]})}export{S as default};
|
|
2
|
+
//# sourceMappingURL=DriftTab-DqpepOhI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DriftTab-DqpepOhI.js","sources":["../../src/components/resources/DriftTab.tsx"],"sourcesContent":["/**\n * DriftTab — /violations?tab=drift (C-4 rework).\n *\n * Surfaces /api/drift/report as an Arco Table over `checks[]` instead of the\n * previous raw JSON wall. Each row is one declarative rule from\n * DriftDetector: { rule, expected, actual, status, detail? }.\n *\n * Header strip shows overallScore + counts per status (pass/warn/fail) so the\n * user can scan compliance at a glance.\n *\n * Error path now surfaces the HTTP status explicitly (was silently swallowing\n * 404s as `String(error)` rendered \"Error: HTTP 404\" with no context).\n *\n * See: tests/unit/web/routes-drift.test.ts for the locked response contract.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Table from '@arco-design/web-react/es/Table'\nimport Tag from '@arco-design/web-react/es/Tag'\n\ninterface DriftCheck {\n rule: string\n expected: string\n actual: string\n status: 'pass' | 'warn' | 'fail'\n detail?: string\n}\ninterface DriftReport {\n generatedAt: string\n period: { days: number; since: string }\n checks: DriftCheck[]\n overallScore: number\n}\n\nconst STATUS_COLOR: Record<DriftCheck['status'], string> = {\n pass: 'green',\n warn: 'orange',\n fail: 'red',\n}\n\nconst STATUS_LABEL: Record<DriftCheck['status'], string> = {\n pass: '通过',\n warn: '警告',\n fail: '失败',\n}\n\ninterface ApiError {\n status?: number\n message: string\n}\n\nasync function fetchDrift(): Promise<DriftReport> {\n const r = await fetch('/api/drift/report?days=7')\n if (!r.ok) {\n const err: ApiError = { status: r.status, message: `HTTP ${r.status}` }\n throw err\n }\n return r.json()\n}\n\nfunction isApiError(e: unknown): e is ApiError {\n return typeof e === 'object' && e !== null && 'message' in e\n}\n\nexport default function DriftTab() {\n const { data, isLoading, error } = useQuery<DriftReport>({\n queryKey: ['drift-report-7d'],\n queryFn: fetchDrift,\n staleTime: 5 * 60_000,\n })\n\n if (isLoading) return <Skeleton animation text={{ rows: 8 }} />\n\n if (error) {\n const apiErr: ApiError = isApiError(error) ? error : { message: String(error) }\n const statusPrefix = apiErr.status ? `HTTP ${apiErr.status} — ` : ''\n return (\n <Empty\n description={\n <span>\n <Typography.Text type=\"error\">Drift 报表暂不可用</Typography.Text>\n <br />\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {statusPrefix}\n {apiErr.message}\n </Typography.Text>\n </span>\n }\n />\n )\n }\n\n if (!data) return <Empty description=\"无数据\" imgSrc=\"\" />\n\n const counts = data.checks.reduce(\n (acc, c) => {\n acc[c.status] += 1\n return acc\n },\n { pass: 0, warn: 0, fail: 0 } as Record<DriftCheck['status'], number>,\n )\n\n return (\n <div>\n <Typography.Title heading={6} style={{ marginBottom: 4 }}>\n CLAUDE.md 行为漂移报表 (近 {data.period.days} 天)\n </Typography.Title>\n <Typography.Paragraph type=\"secondary\" style={{ fontSize: 13, marginBottom: 12 }}>\n 来源 <code>/api/drift/report</code>. 比对 CLAUDE.md 声明的规则与实际事件流。\n </Typography.Paragraph>\n\n {/* Header strip: overall score + status counts */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n marginBottom: 16,\n padding: '12px 16px',\n background: 'var(--color-fill-2)',\n borderRadius: 4,\n flexWrap: 'wrap',\n }}\n data-testid=\"drift-summary\"\n >\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>合规分</Typography.Text>\n <div style={{ fontSize: 24, fontWeight: 600, fontVariantNumeric: 'tabular-nums' }}>\n {data.overallScore}\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, marginLeft: 4 }}>/100</Typography.Text>\n </div>\n </div>\n <div style={{ display: 'flex', gap: 8 }}>\n <Tag color=\"green\">通过 {counts.pass}</Tag>\n <Tag color=\"orange\">警告 {counts.warn}</Tag>\n <Tag color=\"red\">失败 {counts.fail}</Tag>\n </div>\n </div>\n\n {data.checks.length === 0 ? (\n <Empty description=\"无检查项\" imgSrc=\"\" />\n ) : (\n <Table\n data={data.checks}\n rowKey=\"rule\"\n pagination={false}\n borderCell\n size=\"small\"\n columns={[\n {\n title: '规则',\n dataIndex: 'rule',\n width: 180,\n render: (val: string) => <strong style={{ fontSize: 13 }}>{val}</strong>,\n },\n {\n title: '状态',\n dataIndex: 'status',\n width: 100,\n render: (val: DriftCheck['status']) => (\n <Tag color={STATUS_COLOR[val]}>{STATUS_LABEL[val]}</Tag>\n ),\n },\n {\n title: '期望',\n dataIndex: 'expected',\n render: (val: string) => (\n <Typography.Text style={{ fontSize: 12 }}>{val}</Typography.Text>\n ),\n },\n {\n title: '实际',\n dataIndex: 'actual',\n render: (val: string) => (\n <Typography.Text style={{ fontSize: 12 }}>{val}</Typography.Text>\n ),\n },\n {\n title: '说明',\n dataIndex: 'detail',\n render: (val?: string) =>\n val ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>{val}</Typography.Text>\n ) : (\n <span style={{ color: 'var(--color-text-4)' }}>—</span>\n ),\n },\n ]}\n />\n )}\n </div>\n )\n}\n"],"names":["STATUS_COLOR","STATUS_LABEL","fetchDrift","isApiError","e","DriftTab","data","isLoading","error","useQuery","jsx","Skeleton","apiErr","statusPrefix","Empty","Typography","jsxs","counts","acc","c","Tag","Table","val"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{r as h,j as e}from"./react-vendor-tkvCrao7.js";import{d as Ve,u as qe}from"./react-router-JVUrkhdd.js";import{u as T}from"./query-S6X1S7K9.js";import{e as Ge,G as Ie,R as Ye,t as Qe,d as $,E as Xe,b as ye,T as Ze}from"./arco-Bhi3a6Qp.js";import{R as V,A as Re,T as q,a as E,P as Je,b as et,C as tt,L as ze,c as nt,d as Te,X as De,Y as Ae,e as ot,f as st}from"./charts-BuHQWDbQ.js";import{O as I,a as C}from"./outcome-DUn1NjlC.js";import{p as je}from"./index-BIYnq1Dx.js";import"./vendor-DWgdB1eY.js";import"./lucide-CnlPQoG8.js";const it="#52c41a",at="#f5222d",rt="#86909c";function lt(t,n,c,o=""){const i=t-n;if(i===0)return{text:"vs 上周 0 →",color:rt};const a=i>0?"↑":"↓",g=(c?i<0:i>0)?at:it,l=i>0?"+":"",f=Number.isInteger(i)?`${i}`:i.toFixed(1);return{text:`vs 上周 ${l}${f}${o} ${a}`,color:g}}function ct({label:t,value:n,sparkData:c,sparkColor:o="#1890ff",thisVal:i,prevVal:a,higherIsBetter:u,suffix:g="",tooltip:l,onClick:f}){const x=lt(i,a,u,g),b=c.map((j,_)=>({i:_,v:j})),p=`spark-grad-${t.replace(/\s+/g,"-")}-${o.replace("#","")}`;return e.jsxs("div",{onClick:f,style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20,cursor:f?"pointer":"default",height:"100%",display:"flex",flexDirection:"column",gap:8,transition:"box-shadow 0.15s"},onMouseEnter:j=>{f&&(j.currentTarget.style.boxShadow="0 2px 8px rgba(0,0,0,0.10)")},onMouseLeave:j=>{f&&(j.currentTarget.style.boxShadow="0 1px 3px rgba(0,0,0,0.05)")},children:[e.jsxs("div",{style:{fontSize:12,color:"#86909c",fontWeight:500,display:"flex",alignItems:"center",gap:4},children:[e.jsx("span",{children:t}),l?e.jsx(Ge,{content:l,position:"top",children:e.jsx("span",{"aria-label":"explain",style:{cursor:"help",fontSize:11,color:"#86909c",border:"1px solid var(--color-border-2)",borderRadius:"50%",width:14,height:14,lineHeight:"12px",textAlign:"center",display:"inline-block"},onClick:j=>j.stopPropagation(),children:"?"})}):null]}),e.jsx("div",{style:{fontSize:32,fontWeight:600,color:"#1d2129",lineHeight:1.1,fontVariantNumeric:"tabular-nums"},children:n}),e.jsx("div",{style:{height:40,marginTop:2},children:b.length>0&&e.jsx(V,{width:"100%",height:"100%",children:e.jsxs(Re,{data:b,margin:{top:2,right:0,left:0,bottom:0},children:[e.jsx("defs",{children:e.jsxs("linearGradient",{id:p,x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"0%",stopColor:o,stopOpacity:.35}),e.jsx("stop",{offset:"100%",stopColor:o,stopOpacity:.02})]})}),e.jsx(q,{cursor:!1,contentStyle:{fontSize:11,padding:"4px 8px",borderRadius:4},formatter:j=>[`${j}${g}`,t],labelFormatter:()=>""}),e.jsx(E,{type:"monotone",dataKey:"v",stroke:o,strokeWidth:1.5,fill:`url(#${p})`,isAnimationActive:!1})]})})}),e.jsx("div",{style:{fontSize:11,color:x.color,fontWeight:500,fontVariantNumeric:"tabular-nums"},children:x.text})]})}const P=h.memo(ct);function dt({success:t,partial:n,failed:c,abandoned:o,height:i=240}){const a=t+n+c+o,u=a>0?Math.round(t/a*1e3)/10:0,g=[{name:I.success,value:t,key:"success"},{name:I.partial,value:n,key:"partial"},{name:I.failed,value:c,key:"failed"},{name:I.abandoned,value:o,key:"abandoned"}].filter(l=>l.value>0);return a===0?e.jsx("div",{style:{height:i,display:"flex",alignItems:"center",justifyContent:"center",color:"#86909c",fontSize:13},children:"近期无已分类任务数据"}):e.jsxs("div",{style:{position:"relative",height:i},children:[e.jsx(V,{width:"100%",height:"100%",children:e.jsxs(Je,{children:[e.jsx(et,{data:g,dataKey:"value",nameKey:"name",cx:"50%",cy:"50%",innerRadius:"60%",outerRadius:"85%",paddingAngle:2,stroke:"none",isAnimationActive:!1,children:g.map(l=>e.jsx(tt,{fill:C[l.key]},l.key))}),e.jsx(q,{contentStyle:{fontSize:12,padding:"6px 10px",borderRadius:4},formatter:(l,f)=>{const x=typeof l=="number"?l:Number(l)||0,b=a>0?Math.round(x/a*100):0;return[`${x} (${b}%)`,String(f)]}}),e.jsx(ze,{verticalAlign:"bottom",iconType:"circle",iconSize:8,wrapperStyle:{fontSize:11}})]})}),e.jsxs("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",pointerEvents:"none",paddingBottom:24},children:[e.jsx("div",{style:{fontSize:28,fontWeight:600,color:"#1d2129",lineHeight:1.1,fontVariantNumeric:"tabular-nums"},children:a}),e.jsxs("div",{style:{fontSize:11,color:"#86909c",marginTop:2},children:["总任务 · 成功率"," ",e.jsxs("span",{style:{color:"#52c41a",fontWeight:600},children:[u,"%"]})]})]})]})}const ut=h.memo(dt),be="#1890ff",we="#52c41a",ft="#f5222d",W="#86909c";function ht(t,n){let c=0;for(let o=t.length-1;o>=0;o--){const i=t[o].value;if(i==null)break;if(i<n)c++;else break}return c}function pt({title:t,subtitle:n,data:c,currentValue:o,target:i,height:a=240}){const u=ht(c,i),g=u>=3,l=c.some(f=>f.value!=null);return e.jsxs("div",{style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20,height:"100%",display:"flex",flexDirection:"column"},children:[e.jsx("div",{style:{fontSize:14,fontWeight:600,color:"#1d2129"},children:t}),n&&e.jsx("div",{style:{fontSize:12,color:W,marginTop:2},children:n}),e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:12,marginTop:8,marginBottom:4},children:[e.jsx("div",{style:{fontSize:32,fontWeight:600,color:"#1d2129",lineHeight:1.1,fontVariantNumeric:"tabular-nums"},children:o==null?"--":`${o}%`}),e.jsxs("div",{style:{fontSize:12,color:W},children:["目标 ",i,"%"]}),g&&e.jsxs("div",{style:{fontSize:11,color:ft,fontWeight:500},children:["连续 ",u," 天低于目标"]})]}),e.jsx("div",{style:{flex:1,minHeight:a},children:l?e.jsx(V,{width:"100%",height:a,children:e.jsxs(nt,{data:c,margin:{top:8,right:16,left:0,bottom:0},children:[e.jsx(Te,{strokeDasharray:"3 3",stroke:"#f0f0f0"}),e.jsx(De,{dataKey:"date",fontSize:11,stroke:W}),e.jsx(Ae,{domain:[0,100],fontSize:11,stroke:W,tickFormatter:f=>`${f}%`}),e.jsx(q,{contentStyle:{fontSize:12,borderRadius:4},formatter:f=>[f==null?"--":`${f}%`,t]}),e.jsx(ot,{y:i,stroke:we,strokeDasharray:"4 4",label:{value:`目标 ${i}%`,position:"right",fontSize:10,fill:we}}),e.jsx(st,{type:"monotone",dataKey:"value",stroke:be,strokeWidth:2,dot:{r:3,fill:be},activeDot:{r:5},connectNulls:!1,isAnimationActive:!1})]})}):e.jsxs("div",{style:{height:a,display:"flex",alignItems:"center",justifyContent:"center",color:W,fontSize:13},children:["近 ",c.length," 天无数据"]})})]})}const ve=h.memo(pt),mt="#1890ff",M="#86909c",xt="#fafafa";function gt(t,n){return t<=0||n<=0?"#ffffff":`rgba(24, 144, 255, ${(.1+.85*Math.min(1,t/n)).toFixed(3)})`}function yt({rows:t,dateLabels:n,title:c="KB 命中热力图",subtitle:o}){const[i,a]=h.useState(null),u=h.useMemo(()=>{let l=0;for(const f of t)for(const x of f.days)x>l&&(l=x);return l},[t]),g=u>0;return e.jsxs("div",{style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20,height:"100%",display:"flex",flexDirection:"column"},children:[e.jsx("div",{style:{fontSize:14,fontWeight:600,color:"#1d2129"},children:c}),e.jsx("div",{style:{fontSize:12,color:M,marginTop:2,marginBottom:12},children:o||`Top ${t.length} pages · 近 ${n.length} 天`}),g?e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{flex:1,overflow:"hidden"},children:e.jsxs("table",{style:{width:"100%",borderCollapse:"separate",borderSpacing:2,fontSize:11,tableLayout:"fixed"},children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{style:{textAlign:"left",color:M,fontWeight:500,paddingRight:6,width:"38%"},children:"page"}),n.map(l=>e.jsx("th",{style:{color:M,fontWeight:500,textAlign:"center"},children:l},l)),e.jsx("th",{style:{color:M,fontWeight:500,textAlign:"right",paddingLeft:6,width:"12%"},children:"total"})]})}),e.jsx("tbody",{children:t.map(l=>{const f=l.total===0;return e.jsxs("tr",{style:{background:f?xt:"transparent"},children:[e.jsx("td",{title:l.name,style:{fontFamily:"monospace",color:f?M:"#1d2129",paddingRight:6,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:l.name}),l.days.map((x,b)=>e.jsx("td",{onMouseEnter:()=>a({row:l.name,col:b,v:x}),onMouseLeave:()=>a(null),style:{background:gt(x,u),height:22,borderRadius:3,cursor:"default",textAlign:"center",color:x/u>.55?"#fff":"#1d2129",fontVariantNumeric:"tabular-nums"},children:x>0?x:""},b)),e.jsx("td",{style:{textAlign:"right",paddingLeft:6,fontWeight:600,fontVariantNumeric:"tabular-nums",color:f?M:"#1d2129"},children:l.total})]},l.name)})})]})}),e.jsxs("div",{style:{marginTop:12,display:"flex",alignItems:"center",justifyContent:"space-between",fontSize:11,color:M},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx("span",{children:"少"}),[.15,.35,.55,.75,.95].map(l=>e.jsx("span",{style:{display:"inline-block",width:14,height:14,borderRadius:3,background:`rgba(24, 144, 255, ${l})`}},l)),e.jsxs("span",{children:["多 (max=",u,")"]})]}),e.jsx("div",{style:{minHeight:14},children:i&&e.jsxs("span",{children:[e.jsx("span",{style:{fontFamily:"monospace",color:"#1d2129"},children:i.row})," · ",n[i.col]," · ",e.jsxs("span",{style:{color:mt,fontWeight:600},children:[i.v," hits"]})]})})]})]}):e.jsxs("div",{style:{height:240,display:"flex",alignItems:"center",justifyContent:"center",color:M,fontSize:13},children:["近 ",n.length," 天无 KB 命中数据"]})]})}const jt=h.memo(yt),bt="#52c41a",wt="#faad14",Be="#f5222d",te="#86909c",vt="#f0f0f0";function kt(t){return t>=.8?bt:t>=.6?wt:Be}function St({rows:t,title:n="Skill 调用 Top 10",subtitle:c}){const o=[...t].sort((a,u)=>u.invocations-a.invocations).slice(0,10),i=o.reduce((a,u)=>Math.max(a,u.invocations),0);return e.jsxs("div",{style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20,height:"100%",display:"flex",flexDirection:"column"},children:[e.jsx("div",{style:{fontSize:14,fontWeight:600,color:"#1d2129"},children:n}),e.jsx("div",{style:{fontSize:12,color:te,marginTop:2,marginBottom:12},children:c||"按调用次数倒排 · 颜色=成功率"}),o.length===0?e.jsx("div",{style:{height:240,display:"flex",alignItems:"center",justifyContent:"center",color:te,fontSize:13},children:"近期无 Skill 调用数据"}):e.jsx("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:6},children:o.map(a=>{const u=i>0?a.invocations/i*100:0,g=kt(a.success_rate),l=(a.zero_result_rate??0)>=.3;return e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,fontSize:12},children:[e.jsx("div",{title:a.skill_id,style:{width:"32%",fontFamily:"monospace",color:"#1d2129",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:a.skill_id}),e.jsx("div",{style:{flex:1,position:"relative",height:18,background:vt,borderRadius:3},children:e.jsx("div",{style:{position:"absolute",left:0,top:0,bottom:0,width:`${u}%`,background:g,borderRadius:3,transition:"width 0.2s"}})}),e.jsxs("div",{style:{width:110,textAlign:"right",fontVariantNumeric:"tabular-nums",color:te},children:[e.jsx("span",{style:{color:"#1d2129",fontWeight:600},children:a.invocations})," · ",e.jsxs("span",{style:{color:g},children:[Math.round(a.success_rate*100),"%"]})]}),l&&e.jsx("div",{style:{fontSize:10,color:Be,fontWeight:500,whiteSpace:"nowrap"},children:"⚠ 0 命中率高"})]},a.skill_id)})})]})}const _t=h.memo(St),F="#86909c",Ct="#52c41a",$t="#f5222d",Mt="#f0f0f0";function It(t,n){return t.total<=0||n<=0?Mt:t.failed/t.total>.3?`rgba(245, 34, 45, ${(.3+.65*Math.min(1,t.total/n)).toFixed(3)})`:`rgba(82, 196, 26, ${(.2+.75*Math.min(1,t.total/n)).toFixed(3)})`}function Rt(t){if(t.length===0)return[];const n=[],c=(new Date(t[0].date).getDay()+6)%7;let o=Array(7).fill(null);for(let a=0;a<c;a++)o[a]=null;let i=c;for(const a of t)o[i]=a,i++,i===7&&(n.push(o),o=Array(7).fill(null),i=0);return i!==0&&n.push(o),n}const zt=["一","二","三","四","五","六","日"];function Tt({days:t,title:n="近 30 天任务活跃度",subtitle:c}){const[o,i]=h.useState(null),a=h.useMemo(()=>Rt(t),[t]),u=h.useMemo(()=>t.reduce((f,x)=>Math.max(f,x.total),0),[t]),g=h.useMemo(()=>t.reduce((f,x)=>f+x.total,0),[t]),l=u>0;return e.jsxs("div",{style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20,height:"100%",display:"flex",flexDirection:"column"},children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline"},children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:14,fontWeight:600,color:"#1d2129"},children:n}),e.jsx("div",{style:{fontSize:12,color:F,marginTop:2},children:c||`${t.length} 天 · 共 ${g} 个 task · 失败主导日标红`})]}),e.jsxs("div",{style:{fontSize:11,color:F,fontVariantNumeric:"tabular-nums"},children:["max/day ",u]})]}),l?e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:{display:"flex",gap:6,marginTop:16,flex:1},children:[e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:3,paddingTop:0},children:zt.map((f,x)=>e.jsx("div",{style:{fontSize:10,color:F,height:18,lineHeight:"18px",visibility:x%2===0?"visible":"hidden"},children:f},f))}),e.jsx("div",{style:{display:"flex",gap:3,flex:1},children:a.map((f,x)=>e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:3,flex:1},children:f.map((b,p)=>e.jsx("div",{onMouseEnter:()=>b&&i(b),onMouseLeave:()=>i(null),style:{height:18,borderRadius:3,background:b?It(b,u):"transparent",cursor:(b&&b.total>0,"default")}},p))},x))})]}),e.jsxs("div",{style:{marginTop:14,display:"flex",alignItems:"center",justifyContent:"space-between",fontSize:11,color:F},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx("span",{children:"少"}),[.2,.4,.6,.8,.95].map(f=>e.jsx("span",{style:{display:"inline-block",width:14,height:14,borderRadius:3,background:`rgba(82, 196, 26, ${f})`}},f)),e.jsx("span",{children:"多"}),e.jsxs("span",{style:{marginLeft:12,display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx("span",{style:{display:"inline-block",width:14,height:14,borderRadius:3,background:"rgba(245, 34, 45, 0.75)"}}),"失败 > 30%"]})]}),e.jsx("div",{style:{minHeight:14},children:o&&e.jsxs("span",{children:[e.jsx("span",{style:{fontFamily:"monospace",color:"#1d2129"},children:o.date})," · ",e.jsxs("span",{style:{color:"#1d2129",fontWeight:600},children:[o.total," tasks"]})," · ",e.jsxs("span",{style:{color:Ct},children:[o.succeeded," ok"]})," · ",e.jsxs("span",{style:{color:$t},children:[o.failed," fail"]})]})})]})]}):e.jsxs("div",{style:{flex:1,minHeight:200,display:"flex",alignItems:"center",justifyContent:"center",color:F,fontSize:13},children:["近 ",t.length," 天无 task 数据"]})]})}const Dt=h.memo(Tt),ne="#86909c",At="#1890ff",Bt="#faad14",Lt="#f5222d";function Ot(t){const n=t.toLowerCase();return n.includes("hard")||n.includes("deny")?"deny":n.includes("warn")||n.includes("soft")?"warn":"other"}function Wt(t){return t==="deny"?Lt:t==="warn"?Bt:At}function ke(t){return t==="deny"?"deny":t==="warn"?"warn":"mixed"}function Ft({rules:t,title:n="近 7 天拦截规则 Top 10",subtitle:c="PreToolUse 命中分布 — 高频规则可能扰民,需调优"}){const o=t.slice(0,10),i=o.reduce((a,u)=>Math.max(a,u.n),0);return e.jsxs("div",{style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20,height:"100%",display:"flex",flexDirection:"column"},children:[e.jsx("div",{style:{fontSize:14,fontWeight:600,color:"#1d2129"},children:n}),e.jsx("div",{style:{fontSize:12,color:ne,marginTop:2,marginBottom:16},children:c}),o.length===0||i===0?e.jsx("div",{style:{flex:1,minHeight:200,display:"flex",alignItems:"center",justifyContent:"center",color:ne,fontSize:13},children:"无拦截规则命中数据(健康)"}):e.jsx("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:8},children:o.map(a=>{const u=Ot(a.rule_id),g=Wt(u),l=Math.max(2,Math.round(a.n/i*100));return e.jsxs("div",{title:`${a.rule_id} · ${a.n} hits · ${ke(u)}`,children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",fontSize:11,marginBottom:3,color:"#1d2129"},children:[e.jsx("span",{style:{fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",maxWidth:"70%"},children:a.rule_id}),e.jsxs("span",{style:{fontVariantNumeric:"tabular-nums",color:ne},children:[a.n," hits · ",e.jsx("span",{style:{color:g},children:ke(u)})]})]}),e.jsx("div",{style:{background:"#f0f0f0",borderRadius:3,overflow:"hidden",height:10},children:e.jsx("div",{style:{width:`${l}%`,height:"100%",background:g,borderRadius:3,transition:"width 0.3s"}})})]},a.rule_id)})})]})}const Et=h.memo(Ft),B=Ie.Row,S=Ie.Col,oe="#1890ff",Kt="#f5222d";function H(t,n,c,o){const i=Array(n).fill(0),a=864e5,u=Date.now();for(const g of t){const l=new Date(c(g)).getTime();if(!Number.isFinite(l))continue;const f=n-1-Math.floor((u-l)/a);f>=0&&f<n&&(i[f]+=o(g))}return i}async function Se(t){const n=await fetch(`/api/insights/agent-board?window=${t}`);if(!n.ok)throw new Error(`agent-board ${n.status}`);return n.json()}async function _e(t){const n=await fetch(`/api/insights/tuning?window=${t}`);if(n.status===410)return null;if(!n.ok)throw new Error(`tuning ${n.status}`);return n.json()}async function Ce(t){const n=await fetch(`/api/violations?days=${t}&limit=1`);if(!n.ok)throw new Error(`violations ${n.status}`);const c=await n.json();return{total_in_window:c.total_in_window??0,total_by_signal_in_window:c.total_by_signal_in_window??{routing_disobeyed:0,user_keyword:0,tool_intercept:0}}}async function Ut(t){const n=await fetch(`/api/insights/commit-activity?days=${t}`);if(!n.ok)throw new Error(`commit-activity ${n.status}`);return n.json()}function $e(t){if(!t)return[];const n=[];for(const c of Object.values(t.lanes||{}))n.push(...c);return n}function Nt(t,n){const c=new Map,o=Date.now();for(let i=n-1;i>=0;i--){const a=new Date(o-i*864e5).toISOString().slice(0,10);c.set(a,{success:0,partial:0,failed:0,abandoned:0})}for(const i of t){if(!i.outcome)continue;const a=(i.start_time||"").slice(0,10),u=c.get(a);u&&u[i.outcome]++}return[...c.entries()].map(([i,a])=>({date:i.slice(5),...a}))}function se(t,n=60){return t?t.length>n?`${t.slice(0,n)}…`:t:""}function Me(t,n,c,o){var b;const i=(n==null?void 0:n.summary.session_outcome)??{success:0,partial:0,failed:0,abandoned:0},a=i.success+i.partial+i.failed+i.abandoned,u=t.reduce((p,j)=>{var _,G;return p+(((_=j.intercepts)==null?void 0:_.deny)??0)+(((G=j.intercepts)==null?void 0:G.warn)??0)},0),g=o??u,f=((n==null?void 0:n.summary.skill_top)??[]).filter(p=>p.n===0).map(p=>p.skill_id),x=t.filter(p=>p.outcome==="failed").sort((p,j)=>(j.start_time||"").localeCompare(p.start_time||""));return{total:c??t.length,success:i.success,partial:i.partial,failed:i.failed,abandoned:i.abandoned,classified:a,successRate:a>0?Math.round(i.success/a*1e3)/10:0,failedRate:a>0?Math.round(i.failed/a*1e3)/10:0,kbInjectCount:(n==null?void 0:n.summary.kb_inject_count)??0,workflowAcceptance:(n==null?void 0:n.summary.workflow_acceptance_ratio)??0,interceptObeyed:(n==null?void 0:n.summary.intercept_obeyed_ratio)??0,interceptCount:g,zeroSkillCount:f.length,zeroSkillNames:f,topFailedTitle:((b=x[0])==null?void 0:b.title)??null}}function D(t,n,c){const o=t-n;if(o===0)return{delta:0,arrow:"→",worsened:!1,text:"0"};const i=o>0?"↑":"↓",a=c?o<0:o>0,u=o>0?"+":"";return{delta:o,arrow:i,worsened:a,text:`${u}${Number.isInteger(o)?o:o.toFixed(1)}`}}function Pt(t,n){const c=[],o=Math.round(t.workflowAcceptance*100);c.push(`过去 7 天提交了 ${t.total} 个任务(上周 ${n.total}),编排推荐采纳率 ${o}%。`);const i=t.kbInjectCount>n.kbInjectCount?"✓ 上升":t.kbInjectCount===n.kbInjectCount?"→ 持平":"⚠ 下降",a=t.zeroSkillCount>0?`Skill ${t.zeroSkillNames[0]} 0 触发 ⚠`:"Skill 调用正常 ✓";c.push(`KB 注入 ${t.kbInjectCount} 次(上周 ${n.kbInjectCount})${i};${a}。`);const u=D(t.failed,n.failed,!1),g=t.failed>n.failed?`失败上升,建议关注 "${se(t.topFailedTitle||"失败任务",32)}"`:t.failed<n.failed?"失败下降,状态改善 ✓":"失败与上周持平";return c.push(`失败任务 ${t.failed} 个(上周 ${n.failed})${u.arrow} ${g}。`),c}function Ht(t,n,c,o){var u,g;const a=[`# 整体健康度周报(${new Date().toISOString().slice(0,16).replace("T"," ")})`,"","## TL;DR",...c.map(l=>`- ${l}`),"","## 本周 vs 上周","| 指标 | 本周 | 上周 | Δ |","|---|---|---|---|",`| 总任务 | ${t.total} | ${n.total} | ${D(t.total,n.total,!0).text} |`,`| 成功率 | ${t.successRate}% | ${n.successRate}% | ${D(t.successRate,n.successRate,!0).text}% |`,`| 失败数 | ${t.failed} | ${n.failed} | ${D(t.failed,n.failed,!1).text} |`,`| KB 注入次数 | ${t.kbInjectCount} | ${n.kbInjectCount} | ${D(t.kbInjectCount,n.kbInjectCount,!0).text} |`,`| 编排采纳率 | ${Math.round(t.workflowAcceptance*100)}% | ${Math.round(n.workflowAcceptance*100)}% | ${D(Math.round(t.workflowAcceptance*100),Math.round(n.workflowAcceptance*100),!0).text}% |`,`| 拦截次数 | ${t.interceptCount} | ${n.interceptCount} | ${D(t.interceptCount,n.interceptCount,!0).text} |`,"","## 编排遵守率",`- C4 主线程听劝率:${Math.round(t.interceptObeyed*100)}%`,`- C8 Agent 推荐采纳率:${Math.round(t.workflowAcceptance*100)}%`,""];return(u=o==null?void 0:o.kb_top_pages)!=null&&u.length&&(a.push("## KB Top 5"),o.kb_top_pages.slice(0,5).forEach(l=>a.push(`- ${l.name} — cited ${l.cited}`)),a.push("")),(g=o==null?void 0:o.skill_top)!=null&&g.length&&(a.push("## Skill Top 5"),o.skill_top.slice(0,5).forEach(l=>a.push(`- ${l.skill_id} — n=${l.n}, success=${Math.round((l.success_rate??0)*100)}%`)),a.push("")),a.join(`
|
|
2
|
+
`)}function Vt(t,n){const c=new Blob([t],{type:"text/markdown;charset=utf-8"}),o=URL.createObjectURL(c),i=document.createElement("a");i.href=o,i.download=n,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(o)}function nn(){var me;const[t,n]=Ve(),c=qe(),o=parseInt(t.get("window")||"7",10)===30?30:7,i=o,a=o*2,[u,g]=h.useState(!1);h.useEffect(()=>{const s=setTimeout(()=>g(!0),1e3);return()=>clearTimeout(s)},[]);const{data:l,isLoading:f}=T({queryKey:["hh-board-this",i],queryFn:()=>Se(i),refetchInterval:6e4,refetchIntervalInBackground:!1}),{data:x,isLoading:b}=T({queryKey:["hh-board-long",a],queryFn:()=>Se(a),enabled:u}),{data:p,isLoading:j}=T({queryKey:["hh-tuning-this",i],queryFn:()=>_e(i)}),{data:_,isLoading:G}=T({queryKey:["hh-tuning-long",a],queryFn:()=>_e(a),enabled:u}),{data:R}=T({queryKey:["hh-violations-this",i],queryFn:()=>Ce(i),staleTime:6e4,refetchIntervalInBackground:!1}),{data:L}=T({queryKey:["hh-violations-long",a],queryFn:()=>Ce(a),enabled:u,staleTime:6e4}),ie=R==null?void 0:R.total_by_signal_in_window.tool_intercept,ae=h.useMemo(()=>{if((L==null?void 0:L.total_by_signal_in_window.tool_intercept)==null)return;const s=(R==null?void 0:R.total_by_signal_in_window.tool_intercept)??0;return Math.max(0,L.total_by_signal_in_window.tool_intercept-s)},[L,R]),re=f||j,v=h.useMemo(()=>$e(l),[l]),le=h.useMemo(()=>$e(x),[x]),ce=h.useMemo(()=>Date.now()-i*864e5,[i]),de=h.useMemo(()=>le.filter(s=>je(s.start_time).getTime()<ce),[le,ce]),Y=h.useMemo(()=>{if(!_)return null;if(!p)return _.summary;const s=_.summary,d=p.summary,r=(m,y)=>Math.max(0,m-y);return{...s,kb_inject_count:r(s.kb_inject_count,d.kb_inject_count),session_outcome:{success:r(s.session_outcome.success,d.session_outcome.success),partial:r(s.session_outcome.partial,d.session_outcome.partial),failed:r(s.session_outcome.failed,d.session_outcome.failed),abandoned:r(s.session_outcome.abandoned,d.session_outcome.abandoned),unclassified:r(s.session_outcome.unclassified,d.session_outcome.unclassified)}}},[_,p]),K=l==null?void 0:l.total_in_window,ue=h.useMemo(()=>{if((x==null?void 0:x.total_in_window)!=null)return(l==null?void 0:l.total_in_window)==null?x.total_in_window:Math.max(0,x.total_in_window-l.total_in_window)},[x,l]),w=h.useMemo(()=>Me(v,p??null,K,ie),[v,p,K,ie]),z=h.useMemo(()=>Me(de,Y?{summary:Y}:null,ue,ae),[de,Y,ue,ae]),Q=h.useMemo(()=>Pt(w,z),[w,z]),fe=h.useMemo(()=>Nt(v,o),[v,o]),X=((me=p==null?void 0:p.summary.rule_violations_top)==null?void 0:me.slice(0,5))??[],he=h.useMemo(()=>{const s=v.filter(r=>r.outcome==="failed").sort((r,m)=>(m.start_time||"").localeCompare(r.start_time||"")).slice(0,3).map(r=>({kind:"failed",task_id:r.task_id,label:se(r.title||"(空)",60),detail:"失败"})),d=v.map(r=>{var m,y;return{card:r,total:(((m=r.intercepts)==null?void 0:m.deny)??0)+(((y=r.intercepts)==null?void 0:y.warn)??0)}}).filter(r=>r.total>=5).sort((r,m)=>m.total-r.total).slice(0,3).map(r=>({kind:"intercept",task_id:r.card.task_id,label:se(r.card.title||"(空)",60),detail:`${r.total} 次拦截`}));return[...s,...d].slice(0,5)},[v]),Le=s=>{const d=new URLSearchParams(t);d.set("window",String(s)),n(d,{replace:!0})},Oe=()=>{const s=Ht(w,z,Q,(p==null?void 0:p.summary)??null),d=new Date().toISOString().slice(0,10);Vt(s,`health-weekly-${d}.md`)},U=h.useMemo(()=>H(v,o,s=>s.start_time,()=>1),[v,o]),Z=h.useMemo(()=>{const s=U.reduce((m,y)=>m+y,0),d=K;if(s===0||d==null||d===s)return U;const r=d/s;return U.map(m=>Math.round(m*r))},[U,K]),We=h.useMemo(()=>H(v,o,s=>s.start_time,s=>s.outcome==="failed"?1:0),[v,o]),Fe=h.useMemo(()=>{const s=H(v,o,r=>r.start_time,r=>r.outcome==="success"?1:0),d=H(v,o,r=>r.start_time,r=>r.outcome==="success"||r.outcome==="partial"||r.outcome==="failed"||r.outcome==="abandoned"?1:0);return s.map((r,m)=>d[m]>0?Math.round(r/d[m]*100):0)},[v,o]),Ee=h.useMemo(()=>{const s=w.kbInjectCount;if(s===0)return Array(o).fill(0);const d=s/o,r=Z,m=r.reduce((y,k)=>y+k,0)||1;return r.map(y=>Math.round(y/m*s)||(d>=1?Math.round(d):0))},[w.kbInjectCount,Z,o]),O=h.useMemo(()=>{const s=Date.now(),d=[];for(let r=o-1;r>=0;r--)d.push(new Date(s-r*864e5).toISOString().slice(5,10));return d},[o]),A=h.useMemo(()=>{const s=Array.from({length:o},()=>[]),d=Date.now();for(const r of v){const m=je(r.start_time).getTime();if(!Number.isFinite(m))continue;const y=o-1-Math.floor((d-m)/864e5);y>=0&&y<o&&s[y].push(r)}return s},[v,o]),J=h.useMemo(()=>O.map((s,d)=>{const m=(A[d]||[]).filter(k=>{var xe,ge;return(((xe=k.intercepts)==null?void 0:xe.deny)??0)+(((ge=k.intercepts)==null?void 0:ge.warn)??0)>0});if(m.length===0)return{date:s,value:null};const y=m.filter(k=>k.outcome!=="failed").length;return{date:s,value:Math.round(y/m.length*100)}}),[O,A]),ee=h.useMemo(()=>O.map((s,d)=>{const m=(A[d]||[]).filter(k=>k.outcome==="success"||k.outcome==="partial"||k.outcome==="failed"||k.outcome==="abandoned");if(m.length===0)return{date:s,value:null};const y=m.filter(k=>k.outcome==="success"||k.outcome==="partial").length;return{date:s,value:Math.round(y/m.length*100)}}),[O,A]),Ke=h.useMemo(()=>{const s=[...J].reverse().find(d=>d.value!=null);return(s==null?void 0:s.value)??null},[J]),Ue=h.useMemo(()=>{const s=[...ee].reverse().find(d=>d.value!=null);return(s==null?void 0:s.value)??null},[ee]),pe=h.useMemo(()=>{const s=new Map;A.forEach((d,r)=>{for(const m of d)for(const y of m.kb_pages||[])s.has(y.name)||s.set(y.name,Array(o).fill(0)),s.get(y.name)[r]+=y.cited??0});for(const d of(p==null?void 0:p.summary.kb_top_pages)??[])s.has(d.name)||s.set(d.name,Array(o).fill(0));return[...s.entries()].map(([d,r])=>({name:d,days:r,total:r.reduce((m,y)=>m+y,0)})).sort((d,r)=>r.total-d.total).slice(0,8)},[A,p,o]),Ne=h.useMemo(()=>((p==null?void 0:p.summary.skill_top)??[]).map(s=>({skill_id:s.skill_id,invocations:s.n,success_rate:s.success_rate??0})),[p]),{data:N}=T({queryKey:["hh-commit-activity-30d"],queryFn:()=>Ut(30),staleTime:6e4,refetchIntervalInBackground:!1}),Pe=h.useMemo(()=>{const s=N==null?void 0:N.daily;if(!s){const r=Date.now(),m=[];for(let y=29;y>=0;y--)m.push({date:new Date(r-y*864e5).toISOString().slice(0,10),total:0,succeeded:0,failed:0});return m}return s.map(d=>({date:d.date,total:d.total,succeeded:d.succeeded,failed:d.failed}))},[N]),He=h.useMemo(()=>{var s;return((s=p==null?void 0:p.summary.rule_violations_top)==null?void 0:s.slice(0,10))??[]},[p]);return e.jsxs("div",{style:{padding:24,background:"#fafafa",minHeight:"100%"},children:[e.jsxs(B,{align:"center",justify:"space-between",style:{marginBottom:20},children:[e.jsxs(S,{children:[e.jsx("div",{style:{fontSize:24,fontWeight:600,color:"#1d2129",lineHeight:1.2},children:"整体健康度"}),e.jsxs("div",{style:{fontSize:12,color:"#86909c",marginTop:4},children:["Past ",o," days · 当前项目"]})]}),e.jsx(S,{children:e.jsxs("div",{style:{display:"flex",gap:8,alignItems:"center"},children:[e.jsx(Ye.Group,{type:"button",size:"small",value:o,onChange:s=>Le(s),options:[{label:"近 7 天",value:7},{label:"近 30 天",value:30}]}),e.jsx(Qe,{size:"small",type:"primary",onClick:Oe,disabled:re,children:"导出周报"})]})})]}),e.jsxs(B,{gutter:[16,16],style:{marginBottom:16},children:[e.jsx(S,{xs:24,sm:12,md:6,children:e.jsx(P,{label:"总任务",value:w.total,sparkData:Z,sparkColor:oe,thisVal:w.total,prevVal:z.total,higherIsBetter:!0})}),e.jsx(S,{xs:24,sm:12,md:6,children:e.jsx(P,{label:"成功率",value:`${w.successRate}%`,suffix:"%",sparkData:Fe,sparkColor:oe,thisVal:w.successRate,prevVal:z.successRate,higherIsBetter:!0})}),e.jsx(S,{xs:24,sm:12,md:6,children:e.jsx(P,{label:"失败数",value:w.failed,sparkData:We,sparkColor:Kt,thisVal:w.failed,prevVal:z.failed,higherIsBetter:!1,onClick:()=>c("/tasks?outcome=failed")})}),e.jsx(S,{xs:24,sm:12,md:6,children:e.jsx(P,{label:"≈ KB 注入",value:w.kbInjectCount,sparkData:Ee,sparkColor:oe,thisVal:w.kbInjectCount,prevVal:z.kbInjectCount,higherIsBetter:!0,tooltip:"近似分布:后端只返回窗口总数,前端按每日任务数比例分摊到 sparkline。等待 /api/insights/kb-inject-daily 完整支持。"})})]}),e.jsxs(B,{gutter:[16,16],style:{marginBottom:16},children:[e.jsx(S,{xs:24,md:12,children:e.jsxs("div",{style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20},children:[e.jsxs("div",{style:{fontSize:13,fontWeight:600,color:"#1d2129",marginBottom:12},children:["Outcome ",o,"d 趋势"]}),f?e.jsx("div",{style:{height:240},children:e.jsx($,{animation:!0})}):fe.every(s=>s.success+s.partial+s.failed+s.abandoned===0)?e.jsxs("div",{style:{height:240,display:"flex",alignItems:"center",justifyContent:"center",color:"#86909c",fontSize:13},children:["近 ",o," 天无已分类任务数据"]}):e.jsx(V,{width:"100%",height:240,children:e.jsxs(Re,{data:fe,margin:{top:8,right:16,left:0,bottom:0},children:[e.jsx(Te,{strokeDasharray:"3 3",stroke:"#f0f0f0"}),e.jsx(De,{dataKey:"date",fontSize:11,stroke:"#86909c"}),e.jsx(Ae,{fontSize:11,allowDecimals:!1,stroke:"#86909c"}),e.jsx(q,{contentStyle:{fontSize:12,borderRadius:4}}),e.jsx(ze,{wrapperStyle:{fontSize:11},iconType:"circle"}),e.jsx(E,{type:"monotone",dataKey:"success",stackId:"a",stroke:C.success,fill:C.success,fillOpacity:.6,name:I.success}),e.jsx(E,{type:"monotone",dataKey:"partial",stackId:"a",stroke:C.partial,fill:C.partial,fillOpacity:.6,name:I.partial}),e.jsx(E,{type:"monotone",dataKey:"failed",stackId:"a",stroke:C.failed,fill:C.failed,fillOpacity:.6,name:I.failed}),e.jsx(E,{type:"monotone",dataKey:"abandoned",stackId:"a",stroke:C.abandoned,fill:C.abandoned,fillOpacity:.6,name:I.abandoned})]})})]})}),e.jsx(S,{xs:24,md:12,children:e.jsxs("div",{style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20},children:[e.jsx("div",{style:{fontSize:13,fontWeight:600,color:"#1d2129",marginBottom:12},children:"Outcome 总览"}),j?e.jsx("div",{style:{height:240},children:e.jsx($,{animation:!0})}):e.jsx(ut,{success:w.success,partial:w.partial,failed:w.failed,abandoned:w.abandoned,height:240})]})})]}),e.jsxs(B,{gutter:[16,16],style:{marginBottom:16},children:[e.jsx(S,{xs:24,md:12,children:j?e.jsx("div",{style:{background:"#fff",borderRadius:8,padding:20,boxShadow:"0 1px 3px rgba(0,0,0,0.05)"},children:e.jsx($,{animation:!0})}):e.jsx(ve,{title:"C4 主线程听劝率",subtitle:`近 ${o} 天每日有拦截 task 中未失败比例`,data:J,currentValue:Ke,target:70})}),e.jsx(S,{xs:24,md:12,children:j?e.jsx("div",{style:{background:"#fff",borderRadius:8,padding:20,boxShadow:"0 1px 3px rgba(0,0,0,0.05)"},children:e.jsx($,{animation:!0})}):e.jsx(ve,{title:"C8 Spec 采纳率",subtitle:`近 ${o} 天每日完成 task 中 success+partial 比例`,data:ee,currentValue:Ue,target:60})})]}),e.jsxs(B,{gutter:[16,16],style:{marginBottom:16},children:[e.jsx(S,{xs:24,md:12,children:f?e.jsx("div",{style:{background:"#fff",borderRadius:8,padding:20,boxShadow:"0 1px 3px rgba(0,0,0,0.05)"},children:e.jsx($,{animation:!0})}):e.jsx(jt,{rows:pe,dateLabels:O,title:"KB 命中热力图",subtitle:`Top ${pe.length} pages · 近 ${o} 天 daily 命中`})}),e.jsx(S,{xs:24,md:12,children:j?e.jsx("div",{style:{background:"#fff",borderRadius:8,padding:20,boxShadow:"0 1px 3px rgba(0,0,0,0.05)"},children:e.jsx($,{animation:!0})}):e.jsx(_t,{rows:Ne,title:"Skill 调用 Top 10",subtitle:`近 ${o} 天调用次数 · 颜色=成功率`})})]}),e.jsxs(B,{gutter:[16,16],style:{marginBottom:16},children:[e.jsx(S,{xs:24,md:12,children:e.jsx(Dt,{days:Pe})}),e.jsx(S,{xs:24,md:12,children:e.jsx(Et,{rules:He})})]}),e.jsxs("div",{style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20,marginBottom:16},children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"baseline",marginBottom:12},children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:14,fontWeight:600,color:"#1d2129"},children:"TL;DR 周报摘要"}),e.jsxs("div",{style:{fontSize:12,color:"#86909c",marginTop:2},children:["基于近 ",o," 天指标自动生成 · 点击「导出周报」下载 Markdown"]})]}),e.jsx("a",{onClick:()=>c("/violations"),style:{cursor:"pointer",fontSize:12,color:"#1890ff"},children:"查看 violations →"})]}),re&&Q.length===0?e.jsx($,{animation:!0}):e.jsx("div",{style:{fontSize:13,lineHeight:1.9,color:"#1d2129"},children:Q.map((s,d)=>e.jsx("div",{children:s},d))}),e.jsxs("div",{style:{marginTop:16,paddingTop:12,borderTop:"1px solid #f0f0f0"},children:[e.jsx("div",{style:{fontSize:13,fontWeight:600,color:"#1d2129",marginBottom:8},children:"本周异常"}),f?e.jsx($,{animation:!0}):he.length===0&&X.length===0?e.jsx(Xe,{description:"无明显异常项",style:{padding:12}}):e.jsxs(e.Fragment,{children:[he.map((s,d)=>e.jsxs("div",{onClick:()=>{const r=new URLSearchParams;r.set("task",s.task_id),c(`/tasks?${r.toString()}`)},style:{padding:"6px 0",cursor:"pointer",display:"flex",gap:10,alignItems:"center",borderBottom:"1px dashed #f0f0f0"},children:[e.jsx(ye,{color:s.kind==="failed"?"red":"orange",size:"small",style:{flexShrink:0},children:s.kind==="failed"?"失败":"高拦截"}),e.jsx("div",{style:{flex:1,minWidth:0,fontSize:12},children:s.label}),e.jsx(Ze.Text,{type:"secondary",style:{fontSize:11},children:s.detail})]},d)),X.length>0&&e.jsxs("div",{style:{padding:"8px 0 0",fontSize:11,color:"#86909c",display:"flex",alignItems:"center",flexWrap:"wrap",gap:4},children:[e.jsx("span",{children:"Top 违规规则:"}),X.map(s=>e.jsxs(ye,{size:"small",color:"red",children:[s.rule_id," × ",s.n]},s.rule_id))]})]})]})]})]})}export{nn as default};
|
|
3
|
+
//# sourceMappingURL=HealthHomePage-CN6zNIie.js.map
|