@winspan/claude-forge 8.54.4 → 9.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPMENT.md +723 -46
- package/README.md +166 -21
- package/dist/catalogs/agents.json +67 -0
- package/dist/catalogs/skills.json +306 -0
- package/dist/claudemd/claudemd-generator.d.ts +45 -45
- package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
- package/dist/claudemd/claudemd-generator.js +128 -449
- package/dist/claudemd/claudemd-generator.js.map +1 -1
- package/dist/claudemd/index.d.ts +14 -4
- package/dist/claudemd/index.d.ts.map +1 -1
- package/dist/claudemd/index.js +15 -4
- package/dist/claudemd/index.js.map +1 -1
- package/dist/claudemd/resume-manager.d.ts.map +1 -1
- package/dist/claudemd/resume-manager.js +37 -9
- package/dist/claudemd/resume-manager.js.map +1 -1
- package/dist/claudemd/templates/swarm-protocol.md +35 -186
- package/dist/claudemd/violations-manager.d.ts +40 -0
- package/dist/claudemd/violations-manager.d.ts.map +1 -0
- package/dist/claudemd/violations-manager.js +106 -0
- package/dist/claudemd/violations-manager.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +15 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +177 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +169 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +690 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +18 -0
- package/dist/cli/commands/agents.d.ts.map +1 -0
- package/dist/cli/commands/agents.js +160 -0
- package/dist/cli/commands/agents.js.map +1 -0
- package/dist/cli/commands/bypass.d.ts +18 -0
- package/dist/cli/commands/bypass.d.ts.map +1 -0
- package/dist/cli/commands/bypass.js +87 -0
- package/dist/cli/commands/bypass.js.map +1 -0
- package/dist/cli/commands/claudemd.d.ts +60 -0
- package/dist/cli/commands/claudemd.d.ts.map +1 -1
- package/dist/cli/commands/claudemd.js +174 -37
- package/dist/cli/commands/claudemd.js.map +1 -1
- package/dist/cli/commands/codegraph.d.ts +17 -0
- package/dist/cli/commands/codegraph.d.ts.map +1 -0
- package/dist/cli/commands/codegraph.js +263 -0
- package/dist/cli/commands/codegraph.js.map +1 -0
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +94 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/daemon.d.ts +39 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +167 -20
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/commands/decisions.d.ts +129 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +706 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +124 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/entropy.d.ts +35 -0
- package/dist/cli/commands/entropy.d.ts.map +1 -0
- package/dist/cli/commands/entropy.js +121 -0
- package/dist/cli/commands/entropy.js.map +1 -0
- package/dist/cli/commands/executions.d.ts +1 -0
- package/dist/cli/commands/executions.d.ts.map +1 -1
- package/dist/cli/commands/executions.js +12 -2
- package/dist/cli/commands/executions.js.map +1 -1
- package/dist/cli/commands/fix.d.ts +31 -0
- package/dist/cli/commands/fix.d.ts.map +1 -0
- package/dist/cli/commands/fix.js +108 -0
- package/dist/cli/commands/fix.js.map +1 -0
- package/dist/cli/commands/governance.d.ts +21 -0
- package/dist/cli/commands/governance.d.ts.map +1 -0
- package/dist/cli/commands/governance.js +60 -0
- package/dist/cli/commands/governance.js.map +1 -0
- package/dist/cli/commands/init.d.ts +27 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +158 -146
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/insights-goal-check.d.ts +54 -0
- package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
- package/dist/cli/commands/insights-goal-check.js +318 -0
- package/dist/cli/commands/insights-goal-check.js.map +1 -0
- package/dist/cli/commands/insights.d.ts +15 -0
- package/dist/cli/commands/insights.d.ts.map +1 -0
- package/dist/cli/commands/insights.js +127 -0
- package/dist/cli/commands/insights.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +117 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +1070 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/loop.d.ts +95 -0
- package/dist/cli/commands/loop.d.ts.map +1 -0
- package/dist/cli/commands/loop.js +408 -0
- package/dist/cli/commands/loop.js.map +1 -0
- package/dist/cli/commands/maintenance.d.ts +33 -0
- package/dist/cli/commands/maintenance.d.ts.map +1 -0
- package/dist/cli/commands/maintenance.js +75 -0
- package/dist/cli/commands/maintenance.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +22 -11
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +93 -5
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/menu.d.ts.map +1 -1
- package/dist/cli/commands/menu.js +10 -184
- package/dist/cli/commands/menu.js.map +1 -1
- package/dist/cli/commands/project.d.ts +98 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +382 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +131 -0
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +404 -118
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +40 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +49 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +11 -3
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +17 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/trace.d.ts.map +1 -1
- package/dist/cli/commands/trace.js +4 -9
- package/dist/cli/commands/trace.js.map +1 -1
- package/dist/cli/commands/violations.d.ts +14 -0
- package/dist/cli/commands/violations.d.ts.map +1 -0
- package/dist/cli/commands/violations.js +43 -0
- package/dist/cli/commands/violations.js.map +1 -0
- package/dist/cli/index.js +34 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/hook-manager.d.ts +1 -1
- package/dist/cli/init/hook-manager.d.ts.map +1 -1
- package/dist/cli/init/hook-manager.js +6 -0
- package/dist/cli/init/hook-manager.js.map +1 -1
- package/dist/cli/utils/resolve-session.d.ts +32 -0
- package/dist/cli/utils/resolve-session.d.ts.map +1 -0
- package/dist/cli/utils/resolve-session.js +39 -0
- package/dist/cli/utils/resolve-session.js.map +1 -0
- package/dist/core/config.d.ts +4 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +11 -23
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.d.ts +51 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +63 -13
- package/dist/core/constants.js.map +1 -1
- package/dist/core/diagnostics/checks.d.ts +151 -0
- package/dist/core/diagnostics/checks.d.ts.map +1 -0
- package/dist/core/diagnostics/checks.js +766 -0
- package/dist/core/diagnostics/checks.js.map +1 -0
- package/dist/core/diagnostics/daemon-status.d.ts +77 -0
- package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
- package/dist/core/diagnostics/daemon-status.js +113 -0
- package/dist/core/diagnostics/daemon-status.js.map +1 -0
- package/dist/core/diagnostics/entropy-checks.d.ts +83 -0
- package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
- package/dist/core/diagnostics/entropy-checks.js +400 -0
- package/dist/core/diagnostics/entropy-checks.js.map +1 -0
- package/dist/core/diagnostics/fix-runner.d.ts +54 -0
- package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/fix-runner.js +90 -0
- package/dist/core/diagnostics/fix-runner.js.map +1 -0
- package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
- package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/diagnostics/heartbeat-reader.js +50 -0
- package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
- package/dist/core/diagnostics/knip-runner.d.ts +49 -0
- package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
- package/dist/core/diagnostics/knip-runner.js +100 -0
- package/dist/core/diagnostics/knip-runner.js.map +1 -0
- package/dist/core/diagnostics/markers.d.ts +96 -0
- package/dist/core/diagnostics/markers.d.ts.map +1 -0
- package/dist/core/diagnostics/markers.js +153 -0
- package/dist/core/diagnostics/markers.js.map +1 -0
- package/dist/core/event-fields.d.ts +27 -0
- package/dist/core/event-fields.d.ts.map +1 -1
- package/dist/core/event-fields.js +43 -0
- package/dist/core/event-fields.js.map +1 -1
- package/dist/core/governance/global-inject.d.ts +90 -0
- package/dist/core/governance/global-inject.d.ts.map +1 -0
- package/dist/core/governance/global-inject.js +184 -0
- package/dist/core/governance/global-inject.js.map +1 -0
- package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
- package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
- package/dist/core/insights/agent-anchor-guard.js +119 -0
- package/dist/core/insights/agent-anchor-guard.js.map +1 -0
- package/dist/core/insights/agent-distill-context.d.ts +55 -0
- package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-context.js +146 -0
- package/dist/core/insights/agent-distill-context.js.map +1 -0
- package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
- package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
- package/dist/core/insights/agent-distill-spawn.js +179 -0
- package/dist/core/insights/agent-distill-spawn.js.map +1 -0
- package/dist/core/insights/agent-drift.d.ts +66 -0
- package/dist/core/insights/agent-drift.d.ts.map +1 -0
- package/dist/core/insights/agent-drift.js +109 -0
- package/dist/core/insights/agent-drift.js.map +1 -0
- package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
- package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
- package/dist/core/insights/agent-evolution-sources.js +36 -0
- package/dist/core/insights/agent-evolution-sources.js.map +1 -0
- package/dist/core/insights/agent-health.d.ts +142 -0
- package/dist/core/insights/agent-health.d.ts.map +1 -0
- package/dist/core/insights/agent-health.js +296 -0
- package/dist/core/insights/agent-health.js.map +1 -0
- package/dist/core/insights/agent-patch-apply.d.ts +45 -0
- package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
- package/dist/core/insights/agent-patch-apply.js +165 -0
- package/dist/core/insights/agent-patch-apply.js.map +1 -0
- package/dist/core/insights/agent-suggest.d.ts +128 -0
- package/dist/core/insights/agent-suggest.d.ts.map +1 -0
- package/dist/core/insights/agent-suggest.js +284 -0
- package/dist/core/insights/agent-suggest.js.map +1 -0
- package/dist/core/insights/coverage-tiers.d.ts +46 -0
- package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
- package/dist/core/insights/coverage-tiers.js +95 -0
- package/dist/core/insights/coverage-tiers.js.map +1 -0
- package/dist/core/insights/experience-extractor.d.ts +60 -0
- package/dist/core/insights/experience-extractor.d.ts.map +1 -0
- package/dist/core/insights/experience-extractor.js +319 -0
- package/dist/core/insights/experience-extractor.js.map +1 -0
- package/dist/core/insights/violation-reporter.d.ts +149 -0
- package/dist/core/insights/violation-reporter.d.ts.map +1 -0
- package/dist/core/insights/violation-reporter.js +391 -0
- package/dist/core/insights/violation-reporter.js.map +1 -0
- package/dist/core/loop/loop-engine.d.ts +140 -0
- package/dist/core/loop/loop-engine.d.ts.map +1 -0
- package/dist/core/loop/loop-engine.js +266 -0
- package/dist/core/loop/loop-engine.js.map +1 -0
- package/dist/core/queue/index.d.ts +16 -3
- package/dist/core/queue/index.d.ts.map +1 -1
- package/dist/core/queue/index.js +16 -4
- package/dist/core/queue/index.js.map +1 -1
- package/dist/core/storage/base.d.ts +317 -0
- package/dist/core/storage/base.d.ts.map +1 -1
- package/dist/core/storage/base.js +1093 -0
- package/dist/core/storage/base.js.map +1 -1
- package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
- package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
- package/dist/core/storage/codec/tool-input-codec.js +159 -0
- package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
- package/dist/core/storage/codegraph-types.d.ts +79 -0
- package/dist/core/storage/codegraph-types.d.ts.map +1 -0
- package/dist/core/storage/codegraph-types.js +14 -0
- package/dist/core/storage/codegraph-types.js.map +1 -0
- package/dist/core/storage/codegraph.d.ts +186 -0
- package/dist/core/storage/codegraph.d.ts.map +1 -0
- package/dist/core/storage/codegraph.js +452 -0
- package/dist/core/storage/codegraph.js.map +1 -0
- package/dist/core/storage/decisions.d.ts +387 -0
- package/dist/core/storage/decisions.d.ts.map +1 -0
- package/dist/core/storage/decisions.js +534 -0
- package/dist/core/storage/decisions.js.map +1 -0
- package/dist/core/storage/events.d.ts +239 -8
- package/dist/core/storage/events.d.ts.map +1 -1
- package/dist/core/storage/events.js +705 -39
- package/dist/core/storage/events.js.map +1 -1
- package/dist/core/storage/feedback.d.ts +111 -0
- package/dist/core/storage/feedback.d.ts.map +1 -0
- package/dist/core/storage/feedback.js +186 -0
- package/dist/core/storage/feedback.js.map +1 -0
- package/dist/core/storage/forge-config.d.ts +40 -0
- package/dist/core/storage/forge-config.d.ts.map +1 -0
- package/dist/core/storage/forge-config.js +65 -0
- package/dist/core/storage/forge-config.js.map +1 -0
- package/dist/core/storage/injections.d.ts +68 -0
- package/dist/core/storage/injections.d.ts.map +1 -1
- package/dist/core/storage/injections.js +131 -5
- package/dist/core/storage/injections.js.map +1 -1
- package/dist/core/storage/knowledge.d.ts +332 -0
- package/dist/core/storage/knowledge.d.ts.map +1 -0
- package/dist/core/storage/knowledge.js +589 -0
- package/dist/core/storage/knowledge.js.map +1 -0
- package/dist/core/storage/maintenance.d.ts +36 -9
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +56 -24
- package/dist/core/storage/maintenance.js.map +1 -1
- package/dist/core/storage/pipeline-rollup.d.ts +111 -0
- package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
- package/dist/core/storage/pipeline-rollup.js +432 -0
- package/dist/core/storage/pipeline-rollup.js.map +1 -0
- package/dist/core/storage/routing.d.ts +50 -3
- package/dist/core/storage/routing.d.ts.map +1 -1
- package/dist/core/storage/routing.js +131 -10
- package/dist/core/storage/routing.js.map +1 -1
- package/dist/core/storage/rows.d.ts +31 -8
- package/dist/core/storage/rows.d.ts.map +1 -1
- package/dist/core/storage/schema.sql +367 -23
- package/dist/core/storage/sessions.d.ts +136 -0
- package/dist/core/storage/sessions.d.ts.map +1 -1
- package/dist/core/storage/sessions.js +352 -15
- package/dist/core/storage/sessions.js.map +1 -1
- package/dist/core/storage/skills.d.ts +160 -0
- package/dist/core/storage/skills.d.ts.map +1 -1
- package/dist/core/storage/skills.js +368 -7
- package/dist/core/storage/skills.js.map +1 -1
- package/dist/core/storage/sqlite.d.ts +309 -20
- package/dist/core/storage/sqlite.d.ts.map +1 -1
- package/dist/core/storage/sqlite.js +523 -16
- package/dist/core/storage/sqlite.js.map +1 -1
- package/dist/core/storage/tasks.d.ts +744 -2
- package/dist/core/storage/tasks.d.ts.map +1 -1
- package/dist/core/storage/tasks.js +1691 -17
- package/dist/core/storage/tasks.js.map +1 -1
- package/dist/core/storage/tool-intercepts.d.ts +69 -0
- package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
- package/dist/core/storage/tool-intercepts.js +116 -0
- package/dist/core/storage/tool-intercepts.js.map +1 -0
- package/dist/core/types.d.ts +136 -18
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +10 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/backup.d.ts +81 -0
- package/dist/core/utils/backup.d.ts.map +1 -0
- package/dist/core/utils/backup.js +98 -0
- package/dist/core/utils/backup.js.map +1 -0
- package/dist/core/utils/binary-paths.d.ts +124 -0
- package/dist/core/utils/binary-paths.d.ts.map +1 -0
- package/dist/core/utils/binary-paths.js +218 -0
- package/dist/core/utils/binary-paths.js.map +1 -0
- package/dist/core/utils/bypass-token.d.ts +75 -0
- package/dist/core/utils/bypass-token.d.ts.map +1 -0
- package/dist/core/utils/bypass-token.js +133 -0
- package/dist/core/utils/bypass-token.js.map +1 -0
- package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
- package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
- package/dist/core/utils/cc-builtin-agents.js +29 -0
- package/dist/core/utils/cc-builtin-agents.js.map +1 -0
- package/dist/core/utils/claude-cli-resolver.d.ts +26 -0
- package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
- package/dist/core/utils/claude-cli-resolver.js +115 -0
- package/dist/core/utils/claude-cli-resolver.js.map +1 -0
- package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
- package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
- package/dist/core/utils/claude-cli-spawn.js +219 -0
- package/dist/core/utils/claude-cli-spawn.js.map +1 -0
- package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
- package/dist/core/utils/forge-resume-block.js +3 -2
- package/dist/core/utils/forge-resume-block.js.map +1 -1
- package/dist/core/utils/logger.d.ts +15 -3
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +20 -2
- package/dist/core/utils/logger.js.map +1 -1
- package/dist/core/utils/noise-prompt.d.ts +97 -0
- package/dist/core/utils/noise-prompt.d.ts.map +1 -0
- package/dist/core/utils/noise-prompt.js +127 -0
- package/dist/core/utils/noise-prompt.js.map +1 -0
- package/dist/core/utils/path.d.ts +0 -4
- package/dist/core/utils/path.d.ts.map +1 -1
- package/dist/core/utils/path.js +0 -7
- package/dist/core/utils/path.js.map +1 -1
- package/dist/core/utils/time.d.ts +67 -0
- package/dist/core/utils/time.d.ts.map +1 -1
- package/dist/core/utils/time.js +147 -0
- package/dist/core/utils/time.js.map +1 -1
- package/dist/daemon/agent-sync.d.ts +24 -0
- package/dist/daemon/agent-sync.d.ts.map +1 -0
- package/dist/daemon/agent-sync.js +114 -0
- package/dist/daemon/agent-sync.js.map +1 -0
- package/dist/daemon/config-store.d.ts +55 -0
- package/dist/daemon/config-store.d.ts.map +1 -0
- package/dist/daemon/config-store.js +146 -0
- package/dist/daemon/config-store.js.map +1 -0
- package/dist/daemon/event-parser.d.ts +22 -0
- package/dist/daemon/event-parser.d.ts.map +1 -1
- package/dist/daemon/event-parser.js +54 -3
- package/dist/daemon/event-parser.js.map +1 -1
- package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
- package/dist/daemon/handlers/history-exporter.js +9 -8
- package/dist/daemon/handlers/history-exporter.js.map +1 -1
- package/dist/daemon/handlers/post-tool-use.d.ts +66 -4
- package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
- package/dist/daemon/handlers/post-tool-use.js +221 -8
- package/dist/daemon/handlers/post-tool-use.js.map +1 -1
- package/dist/daemon/handlers/pre-tool-use.d.ts +181 -0
- package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
- package/dist/daemon/handlers/pre-tool-use.js +618 -0
- package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
- package/dist/daemon/handlers/stop.d.ts +55 -7
- package/dist/daemon/handlers/stop.d.ts.map +1 -1
- package/dist/daemon/handlers/stop.js +245 -8
- package/dist/daemon/handlers/stop.js.map +1 -1
- package/dist/daemon/handlers/user-prompt.d.ts +51 -14
- package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
- package/dist/daemon/handlers/user-prompt.js +223 -95
- package/dist/daemon/handlers/user-prompt.js.map +1 -1
- package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
- package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
- package/dist/daemon/handlers/violation-content-backfill.js +167 -0
- package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
- package/dist/daemon/hook-sync.d.ts.map +1 -1
- package/dist/daemon/hook-sync.js +2 -1
- package/dist/daemon/hook-sync.js.map +1 -1
- package/dist/daemon/index.d.ts +19 -0
- package/dist/daemon/index.d.ts.map +1 -1
- package/dist/daemon/index.js +439 -86
- package/dist/daemon/index.js.map +1 -1
- package/dist/daemon/lifecycle.d.ts +48 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +98 -2
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/router.d.ts +4 -1
- package/dist/daemon/router.d.ts.map +1 -1
- package/dist/daemon/router.js +4 -2
- package/dist/daemon/router.js.map +1 -1
- package/dist/daemon/rules/defaults.d.ts +20 -0
- package/dist/daemon/rules/defaults.d.ts.map +1 -0
- package/dist/daemon/rules/defaults.js +779 -0
- package/dist/daemon/rules/defaults.js.map +1 -0
- package/dist/daemon/rules/registry.d.ts +47 -0
- package/dist/daemon/rules/registry.d.ts.map +1 -0
- package/dist/daemon/rules/registry.js +84 -0
- package/dist/daemon/rules/registry.js.map +1 -0
- package/dist/daemon/rules/types.d.ts +176 -0
- package/dist/daemon/rules/types.d.ts.map +1 -0
- package/dist/daemon/rules/types.js +15 -0
- package/dist/daemon/rules/types.js.map +1 -0
- package/dist/daemon/rules/whitelist.d.ts +101 -0
- package/dist/daemon/rules/whitelist.d.ts.map +1 -0
- package/dist/daemon/rules/whitelist.js +210 -0
- package/dist/daemon/rules/whitelist.js.map +1 -0
- package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
- package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
- package/dist/daemon/rules/workflow-defaults.js +521 -0
- package/dist/daemon/rules/workflow-defaults.js.map +1 -0
- package/dist/daemon/server.d.ts +11 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +7 -1
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/services/codegraph-sync.d.ts +94 -0
- package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
- package/dist/daemon/services/codegraph-sync.js +159 -0
- package/dist/daemon/services/codegraph-sync.js.map +1 -0
- package/dist/daemon/services/context-injector.d.ts +34 -0
- package/dist/daemon/services/context-injector.d.ts.map +1 -0
- package/dist/daemon/services/context-injector.js +61 -0
- package/dist/daemon/services/context-injector.js.map +1 -0
- package/dist/daemon/services/decision-hint.d.ts +240 -0
- package/dist/daemon/services/decision-hint.d.ts.map +1 -0
- package/dist/daemon/services/decision-hint.js +562 -0
- package/dist/daemon/services/decision-hint.js.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
- package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
- package/dist/daemon/services/event-ttl-sweep.js +124 -0
- package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
- package/dist/daemon/services/feedback-aggregator.d.ts +167 -0
- package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
- package/dist/daemon/services/feedback-aggregator.js +415 -0
- package/dist/daemon/services/feedback-aggregator.js.map +1 -0
- package/dist/daemon/services/heartbeat-writer.d.ts +46 -0
- package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
- package/dist/daemon/services/heartbeat-writer.js +82 -0
- package/dist/daemon/services/heartbeat-writer.js.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
- package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/idle-session-sweeper.js +94 -0
- package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
- package/dist/daemon/services/idle-task-budget.d.ts +50 -0
- package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
- package/dist/daemon/services/idle-task-budget.js +72 -0
- package/dist/daemon/services/idle-task-budget.js.map +1 -0
- package/dist/daemon/services/intercept-revive.d.ts +60 -0
- package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
- package/dist/daemon/services/intercept-revive.js +86 -0
- package/dist/daemon/services/intercept-revive.js.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
- package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
- package/dist/daemon/services/intercept-rollback-guard.js +152 -0
- package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
- package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
- package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
- package/dist/daemon/services/kb-injector.d.ts +57 -0
- package/dist/daemon/services/kb-injector.d.ts.map +1 -0
- package/dist/daemon/services/kb-injector.js +148 -0
- package/dist/daemon/services/kb-injector.js.map +1 -0
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
- package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
- package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
- package/dist/daemon/services/loop-hint.d.ts +139 -0
- package/dist/daemon/services/loop-hint.d.ts.map +1 -0
- package/dist/daemon/services/loop-hint.js +272 -0
- package/dist/daemon/services/loop-hint.js.map +1 -0
- package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
- package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classification-service.js +214 -0
- package/dist/daemon/services/outcome-classification-service.js.map +1 -0
- package/dist/daemon/services/outcome-classifier.d.ts +136 -0
- package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
- package/dist/daemon/services/outcome-classifier.js +178 -0
- package/dist/daemon/services/outcome-classifier.js.map +1 -0
- package/dist/daemon/services/outcome-nudge.d.ts +107 -0
- package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
- package/dist/daemon/services/outcome-nudge.js +242 -0
- package/dist/daemon/services/outcome-nudge.js.map +1 -0
- package/dist/daemon/services/spec-approval.d.ts +127 -0
- package/dist/daemon/services/spec-approval.d.ts.map +1 -0
- package/dist/daemon/services/spec-approval.js +216 -0
- package/dist/daemon/services/spec-approval.js.map +1 -0
- package/dist/daemon/services/spec-gate.d.ts +54 -0
- package/dist/daemon/services/spec-gate.d.ts.map +1 -0
- package/dist/daemon/services/spec-gate.js +113 -0
- package/dist/daemon/services/spec-gate.js.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
- package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
- package/dist/daemon/services/task-boundary-classifier.js +202 -0
- package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
- package/dist/daemon/services/task-segmenter.d.ts +230 -1
- package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
- package/dist/daemon/services/task-segmenter.js +527 -17
- package/dist/daemon/services/task-segmenter.js.map +1 -1
- package/dist/daemon/skill-sync.d.ts +7 -2
- package/dist/daemon/skill-sync.d.ts.map +1 -1
- package/dist/daemon/skill-sync.js +114 -9
- package/dist/daemon/skill-sync.js.map +1 -1
- package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
- package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
- package/dist/daemon/startup/maintenance-schedulers.js +294 -0
- package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
- package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
- package/dist/daemon/templates/agents/claudemd-writer.md +102 -0
- package/dist/daemon/templates/agents/coder.md +262 -0
- package/dist/daemon/templates/agents/decision-maker.md +546 -0
- package/dist/daemon/templates/agents/doc-reviewer.md +118 -0
- package/dist/daemon/templates/agents/harness-debug-full.md +196 -0
- package/dist/daemon/templates/agents/knowledge-builder.md +120 -0
- package/dist/daemon/templates/agents/patch-applier.md +145 -0
- package/dist/daemon/templates/agents/planner.md +217 -0
- package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
- package/dist/daemon/templates/agents/skill-distiller.md +114 -0
- package/dist/daemon/templates/agents/task-boundary-classifier.md +65 -0
- package/dist/daemon/templates/agents/verify-agent.md +259 -0
- package/dist/daemon/utils/inject-block.d.ts +39 -0
- package/dist/daemon/utils/inject-block.d.ts.map +1 -0
- package/dist/daemon/utils/inject-block.js +25 -0
- package/dist/daemon/utils/inject-block.js.map +1 -0
- package/dist/hooks/hook-lib.sh +8 -0
- package/dist/hooks/notification.sh +19 -8
- package/dist/hooks/post-tool-use.sh +41 -23
- package/dist/hooks/pre-tool-use.sh +54 -23
- package/dist/hooks/session-start.sh +68 -0
- package/dist/hooks/stop.sh +31 -11
- package/dist/hooks/user-prompt-submit.sh +37 -21
- package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
- package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/go-adapter.js +294 -0
- package/dist/knowledge/adapters/go-adapter.js.map +1 -0
- package/dist/knowledge/adapters/index.d.ts +41 -0
- package/dist/knowledge/adapters/index.d.ts.map +1 -0
- package/dist/knowledge/adapters/index.js +71 -0
- package/dist/knowledge/adapters/index.js.map +1 -0
- package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
- package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/java-adapter.js +260 -0
- package/dist/knowledge/adapters/java-adapter.js.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
- package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
- package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
- package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
- package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
- package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
- package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
- package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
- package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/python-adapter.js +358 -0
- package/dist/knowledge/adapters/python-adapter.js.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
- package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/rust-adapter.js +329 -0
- package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
- package/dist/knowledge/adapters/types.d.ts +99 -0
- package/dist/knowledge/adapters/types.d.ts.map +1 -0
- package/dist/knowledge/adapters/types.js +17 -0
- package/dist/knowledge/adapters/types.js.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
- package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
- package/dist/knowledge/adapters/typescript-adapter.js +171 -0
- package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
- package/dist/knowledge/audit-applier.d.ts +70 -0
- package/dist/knowledge/audit-applier.d.ts.map +1 -0
- package/dist/knowledge/audit-applier.js +251 -0
- package/dist/knowledge/audit-applier.js.map +1 -0
- package/dist/knowledge/builder.d.ts +261 -0
- package/dist/knowledge/builder.d.ts.map +1 -0
- package/dist/knowledge/builder.js +966 -0
- package/dist/knowledge/builder.js.map +1 -0
- package/dist/knowledge/cli-provider.d.ts +151 -0
- package/dist/knowledge/cli-provider.d.ts.map +1 -0
- package/dist/knowledge/cli-provider.js +313 -0
- package/dist/knowledge/cli-provider.js.map +1 -0
- package/dist/knowledge/constants.d.ts +78 -0
- package/dist/knowledge/constants.d.ts.map +1 -0
- package/dist/knowledge/constants.js +98 -0
- package/dist/knowledge/constants.js.map +1 -0
- package/dist/knowledge/cross-module.d.ts +139 -0
- package/dist/knowledge/cross-module.d.ts.map +1 -0
- package/dist/knowledge/cross-module.js +370 -0
- package/dist/knowledge/cross-module.js.map +1 -0
- package/dist/knowledge/git-hooks.d.ts +67 -0
- package/dist/knowledge/git-hooks.d.ts.map +1 -0
- package/dist/knowledge/git-hooks.js +258 -0
- package/dist/knowledge/git-hooks.js.map +1 -0
- package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
- package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
- package/dist/knowledge/graph/edge-extractor.js +242 -0
- package/dist/knowledge/graph/edge-extractor.js.map +1 -0
- package/dist/knowledge/graph/impact.d.ts +73 -0
- package/dist/knowledge/graph/impact.d.ts.map +1 -0
- package/dist/knowledge/graph/impact.js +94 -0
- package/dist/knowledge/graph/impact.js.map +1 -0
- package/dist/knowledge/graph/types.d.ts +22 -0
- package/dist/knowledge/graph/types.d.ts.map +1 -0
- package/dist/knowledge/graph/types.js +13 -0
- package/dist/knowledge/graph/types.js.map +1 -0
- package/dist/knowledge/module-hash.d.ts +88 -0
- package/dist/knowledge/module-hash.d.ts.map +1 -0
- package/dist/knowledge/module-hash.js +162 -0
- package/dist/knowledge/module-hash.js.map +1 -0
- package/dist/knowledge/project-detector.d.ts +101 -0
- package/dist/knowledge/project-detector.d.ts.map +1 -0
- package/dist/knowledge/project-detector.js +223 -0
- package/dist/knowledge/project-detector.js.map +1 -0
- package/dist/knowledge/prompt.d.ts +237 -0
- package/dist/knowledge/prompt.d.ts.map +1 -0
- package/dist/knowledge/prompt.js +416 -0
- package/dist/knowledge/prompt.js.map +1 -0
- package/dist/knowledge/query.d.ts +118 -0
- package/dist/knowledge/query.d.ts.map +1 -0
- package/dist/knowledge/query.js +438 -0
- package/dist/knowledge/query.js.map +1 -0
- package/dist/knowledge/repo-map.d.ts +97 -0
- package/dist/knowledge/repo-map.d.ts.map +1 -0
- package/dist/knowledge/repo-map.js +447 -0
- package/dist/knowledge/repo-map.js.map +1 -0
- package/dist/knowledge/tools/index.d.ts +14 -0
- package/dist/knowledge/tools/index.d.ts.map +1 -0
- package/dist/knowledge/tools/index.js +11 -0
- package/dist/knowledge/tools/index.js.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
- package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-get-page.js +101 -0
- package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
- package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
- package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
- package/dist/knowledge/tools/knowledge-query.js +104 -0
- package/dist/knowledge/tools/knowledge-query.js.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
- package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
- package/dist/knowledge/tools/repo-map-lookup.js +82 -0
- package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
- package/dist/knowledge/types.d.ts +269 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +10 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/knowledge/validator.d.ts +90 -0
- package/dist/knowledge/validator.d.ts.map +1 -0
- package/dist/knowledge/validator.js +355 -0
- package/dist/knowledge/validator.js.map +1 -0
- package/dist/mcp/server.d.ts +64 -8
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +448 -12
- package/dist/mcp/server.js.map +1 -1
- package/dist/skills/builtin-skills.d.ts +35 -0
- package/dist/skills/builtin-skills.d.ts.map +1 -0
- package/dist/skills/builtin-skills.js +68 -0
- package/dist/skills/builtin-skills.js.map +1 -0
- package/dist/skills/distill/attribution.d.ts +59 -0
- package/dist/skills/distill/attribution.d.ts.map +1 -0
- package/dist/skills/distill/attribution.js +101 -0
- package/dist/skills/distill/attribution.js.map +1 -0
- package/dist/skills/distill/distiller.d.ts +161 -0
- package/dist/skills/distill/distiller.d.ts.map +1 -0
- package/dist/skills/distill/distiller.js +461 -0
- package/dist/skills/distill/distiller.js.map +1 -0
- package/dist/skills/distill/index.d.ts +223 -0
- package/dist/skills/distill/index.d.ts.map +1 -0
- package/dist/skills/distill/index.js +466 -0
- package/dist/skills/distill/index.js.map +1 -0
- package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
- package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
- package/dist/skills/distill/project-anchor-guard.js +334 -0
- package/dist/skills/distill/project-anchor-guard.js.map +1 -0
- package/dist/skills/distill/topic-deduper.d.ts +77 -0
- package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
- package/dist/skills/distill/topic-deduper.js +119 -0
- package/dist/skills/distill/topic-deduper.js.map +1 -0
- package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
- package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
- package/dist/skills/distill/upstream-fetcher.js +202 -0
- package/dist/skills/distill/upstream-fetcher.js.map +1 -0
- package/dist/skills/distilled/distilled-api-design.md +495 -0
- package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
- package/dist/skills/distilled/distilled-brainstorming.md +79 -0
- package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
- package/dist/skills/distilled/distilled-canvas-design.md +128 -0
- package/dist/skills/distilled/distilled-claude-api.md +185 -0
- package/dist/skills/distilled/distilled-creator.md +181 -0
- package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
- package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
- package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
- package/dist/skills/distilled/distilled-docx.md +231 -0
- package/dist/skills/distilled/distilled-executing-plans.md +148 -0
- package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
- package/dist/skills/distilled/distilled-frontend-design.md +118 -0
- package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
- package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
- package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
- package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
- package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
- package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
- package/dist/skills/distilled/distilled-systematic-debugging.md +154 -0
- package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
- package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
- package/dist/skills/distilled/distilled-verification-before-completion.md +213 -0
- package/dist/skills/distilled/distilled-writing-skills.md +175 -0
- package/dist/skills/registry.d.ts +55 -51
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +82 -196
- package/dist/skills/registry.js.map +1 -1
- package/dist/skills/tools/pipeline-suggest.js +14 -14
- package/dist/skills/tools/pipeline-suggest.js.map +1 -1
- package/dist/skills/tools/skill-invoke.d.ts +3 -2
- package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
- package/dist/skills/tools/skill-invoke.js +4 -2
- package/dist/skills/tools/skill-invoke.js.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
- package/dist/web/analytics/anti-pattern-detector.js +6 -1
- package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
- package/dist/web/analytics/drift-detector.d.ts +6 -0
- package/dist/web/analytics/drift-detector.d.ts.map +1 -1
- package/dist/web/analytics/drift-detector.js +15 -8
- package/dist/web/analytics/drift-detector.js.map +1 -1
- package/dist/web/analytics/weekly-report.d.ts +13 -0
- package/dist/web/analytics/weekly-report.d.ts.map +1 -1
- package/dist/web/analytics/weekly-report.js +17 -3
- package/dist/web/analytics/weekly-report.js.map +1 -1
- package/dist/web/routes/_helpers.d.ts +31 -0
- package/dist/web/routes/_helpers.d.ts.map +1 -1
- package/dist/web/routes/_helpers.js +33 -0
- package/dist/web/routes/_helpers.js.map +1 -1
- package/dist/web/routes/agent-content.d.ts +30 -0
- package/dist/web/routes/agent-content.d.ts.map +1 -0
- package/dist/web/routes/agent-content.js +139 -0
- package/dist/web/routes/agent-content.js.map +1 -0
- package/dist/web/routes/agent-distill.d.ts +49 -0
- package/dist/web/routes/agent-distill.d.ts.map +1 -0
- package/dist/web/routes/agent-distill.js +526 -0
- package/dist/web/routes/agent-distill.js.map +1 -0
- package/dist/web/routes/config.d.ts +56 -0
- package/dist/web/routes/config.d.ts.map +1 -0
- package/dist/web/routes/config.js +243 -0
- package/dist/web/routes/config.js.map +1 -0
- package/dist/web/routes/decisions.d.ts +15 -0
- package/dist/web/routes/decisions.d.ts.map +1 -0
- package/dist/web/routes/decisions.js +181 -0
- package/dist/web/routes/decisions.js.map +1 -0
- package/dist/web/routes/diagnostics.d.ts +61 -0
- package/dist/web/routes/diagnostics.d.ts.map +1 -0
- package/dist/web/routes/diagnostics.js +203 -0
- package/dist/web/routes/diagnostics.js.map +1 -0
- package/dist/web/routes/error-handler.d.ts +0 -4
- package/dist/web/routes/error-handler.d.ts.map +1 -1
- package/dist/web/routes/error-handler.js +0 -8
- package/dist/web/routes/error-handler.js.map +1 -1
- package/dist/web/routes/events.d.ts.map +1 -1
- package/dist/web/routes/events.js +26 -1
- package/dist/web/routes/events.js.map +1 -1
- package/dist/web/routes/health.d.ts +33 -0
- package/dist/web/routes/health.d.ts.map +1 -0
- package/dist/web/routes/health.js +37 -0
- package/dist/web/routes/health.js.map +1 -0
- package/dist/web/routes/insights.d.ts +0 -5
- package/dist/web/routes/insights.d.ts.map +1 -1
- package/dist/web/routes/insights.js +0 -0
- package/dist/web/routes/insights.js.map +1 -1
- package/dist/web/routes/knowledge.d.ts +57 -0
- package/dist/web/routes/knowledge.d.ts.map +1 -0
- package/dist/web/routes/knowledge.js +772 -0
- package/dist/web/routes/knowledge.js.map +1 -0
- package/dist/web/routes/patch.d.ts +60 -1
- package/dist/web/routes/patch.d.ts.map +1 -1
- package/dist/web/routes/patch.js +170 -64
- package/dist/web/routes/patch.js.map +1 -1
- package/dist/web/routes/pipeline.d.ts +28 -0
- package/dist/web/routes/pipeline.d.ts.map +1 -0
- package/dist/web/routes/pipeline.js +145 -0
- package/dist/web/routes/pipeline.js.map +1 -0
- package/dist/web/routes/rules.d.ts.map +1 -1
- package/dist/web/routes/rules.js +26 -7
- package/dist/web/routes/rules.js.map +1 -1
- package/dist/web/routes/sessions.d.ts.map +1 -1
- package/dist/web/routes/sessions.js +17 -8
- package/dist/web/routes/sessions.js.map +1 -1
- package/dist/web/routes/skill-content.d.ts +30 -0
- package/dist/web/routes/skill-content.d.ts.map +1 -0
- package/dist/web/routes/skill-content.js +117 -0
- package/dist/web/routes/skill-content.js.map +1 -0
- package/dist/web/routes/skill-stats.d.ts.map +1 -1
- package/dist/web/routes/skill-stats.js +153 -16
- package/dist/web/routes/skill-stats.js.map +1 -1
- package/dist/web/routes/skills-distill.d.ts +29 -0
- package/dist/web/routes/skills-distill.d.ts.map +1 -0
- package/dist/web/routes/skills-distill.js +552 -0
- package/dist/web/routes/skills-distill.js.map +1 -0
- package/dist/web/routes/skills.js +7 -7
- package/dist/web/routes/skills.js.map +1 -1
- package/dist/web/routes/stats.d.ts.map +1 -1
- package/dist/web/routes/stats.js +2 -1
- package/dist/web/routes/stats.js.map +1 -1
- package/dist/web/routes/task-timeline.d.ts +178 -0
- package/dist/web/routes/task-timeline.d.ts.map +1 -0
- package/dist/web/routes/task-timeline.js +530 -0
- package/dist/web/routes/task-timeline.js.map +1 -0
- package/dist/web/routes/tasks.d.ts.map +1 -1
- package/dist/web/routes/tasks.js +377 -8
- package/dist/web/routes/tasks.js.map +1 -1
- package/dist/web/routes/trace.d.ts.map +1 -1
- package/dist/web/routes/trace.js +3 -2
- package/dist/web/routes/trace.js.map +1 -1
- package/dist/web/routes/types.d.ts +0 -4
- package/dist/web/routes/types.d.ts.map +1 -1
- package/dist/web/routes/types.js +1 -1
- package/dist/web/routes/types.js.map +1 -1
- package/dist/web/routes/violations.d.ts +14 -0
- package/dist/web/routes/violations.d.ts.map +1 -0
- package/dist/web/routes/violations.js +112 -0
- package/dist/web/routes/violations.js.map +1 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +99 -19
- package/dist/web/server.js.map +1 -1
- package/dist/web/services/agent-distill-manager.d.ts +122 -0
- package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
- package/dist/web/services/agent-distill-manager.js +397 -0
- package/dist/web/services/agent-distill-manager.js.map +1 -0
- package/dist/web/services/build-manager.d.ts +72 -0
- package/dist/web/services/build-manager.d.ts.map +1 -0
- package/dist/web/services/build-manager.js +189 -0
- package/dist/web/services/build-manager.js.map +1 -0
- package/dist/web/services/distill-manager.d.ts +172 -0
- package/dist/web/services/distill-manager.d.ts.map +1 -0
- package/dist/web/services/distill-manager.js +411 -0
- package/dist/web/services/distill-manager.js.map +1 -0
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
- package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
- package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
- package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
- package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
- package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
- package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
- package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
- package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
- package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
- package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
- package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
- package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
- package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
- package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
- package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
- package/dist/web/static/assets/MarkdownRenderer-DlDQNihj.js +3 -0
- package/dist/web/static/assets/MarkdownRenderer-DlDQNihj.js.map +1 -0
- package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
- package/dist/web/static/assets/NotFound-LMzbP51V.js.map +1 -0
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
- package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
- package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
- package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
- package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
- package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
- package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
- package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
- package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
- package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
- package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
- package/dist/web/static/assets/index-B_v_MKlb.css +1 -0
- package/dist/web/static/assets/index-DileOOE4.js +4 -0
- package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
- package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
- package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
- package/dist/web/static/assets/outcome-BKGy9azt.js +2 -0
- package/dist/web/static/assets/outcome-BKGy9azt.js.map +1 -0
- package/dist/web/static/assets/query-CgCOpYWf.js +2 -0
- package/dist/web/static/assets/{query-C99w429o.js.map → query-CgCOpYWf.js.map} +1 -1
- package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-Cxmg8RuL.js} +3 -3
- package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-Cxmg8RuL.js.map} +1 -1
- package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
- package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
- package/dist/web/static/assets/syntax-highlighter-BDYycNja.js +6 -0
- package/dist/web/static/assets/syntax-highlighter-BDYycNja.js.map +1 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
- package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
- package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
- package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
- package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
- package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
- package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
- package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
- package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
- package/dist/web/static/index.html +12 -8
- package/package.json +18 -5
- package/dist/core/ai/provider.d.ts +0 -63
- package/dist/core/ai/provider.d.ts.map +0 -1
- package/dist/core/ai/provider.js +0 -241
- package/dist/core/ai/provider.js.map +0 -1
- package/dist/core/ai/types.d.ts +0 -43
- package/dist/core/ai/types.d.ts.map +0 -1
- package/dist/core/ai/types.js +0 -5
- package/dist/core/ai/types.js.map +0 -1
- package/dist/core/storage/token-usage.d.ts +0 -36
- package/dist/core/storage/token-usage.d.ts.map +0 -1
- package/dist/core/storage/token-usage.js +0 -59
- package/dist/core/storage/token-usage.js.map +0 -1
- package/dist/core/utils/token-tracker.d.ts +0 -39
- package/dist/core/utils/token-tracker.d.ts.map +0 -1
- package/dist/core/utils/token-tracker.js +0 -69
- package/dist/core/utils/token-tracker.js.map +0 -1
- package/dist/skills/index.d.ts +0 -3
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -3
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/matcher.d.ts +0 -26
- package/dist/skills/matcher.d.ts.map +0 -1
- package/dist/skills/matcher.js +0 -113
- package/dist/skills/matcher.js.map +0 -1
- package/dist/skills/official/code-simplifier.md +0 -52
- package/dist/skills/official/find-skills.md +0 -142
- package/dist/skills/official/official-api-design.md +0 -30
- package/dist/skills/official/official-architecture-decision.md +0 -41
- package/dist/skills/official/official-bmad.md +0 -118
- package/dist/skills/official/official-db-schema-design.md +0 -34
- package/dist/skills/official/official-debug.md +0 -25
- package/dist/skills/official/official-doc-driven.md +0 -31
- package/dist/skills/official/official-harness-engineering.md +0 -108
- package/dist/skills/official/official-openspec.md +0 -89
- package/dist/skills/official/official-performance-optimization.md +0 -30
- package/dist/skills/official/official-pr-review.md +0 -35
- package/dist/skills/official/official-release-checklist.md +0 -30
- package/dist/skills/official/official-security-hardening.md +0 -32
- package/dist/skills/official/official-spec-driven-design.md +0 -31
- package/dist/skills/official/planning-with-files.md +0 -241
- package/dist/skills/official/ui-ux-pro-max.md +0 -105
- package/dist/skills/official/webapp-testing.md +0 -96
- package/dist/skills/official-skills.d.ts +0 -26
- package/dist/skills/official-skills.d.ts.map +0 -1
- package/dist/skills/official-skills.js +0 -74
- package/dist/skills/official-skills.js.map +0 -1
- package/dist/skills/semantic-matcher.d.ts +0 -60
- package/dist/skills/semantic-matcher.d.ts.map +0 -1
- package/dist/skills/semantic-matcher.js +0 -192
- package/dist/skills/semantic-matcher.js.map +0 -1
- package/dist/skills/upgrade-engine.d.ts +0 -93
- package/dist/skills/upgrade-engine.d.ts.map +0 -1
- package/dist/skills/upgrade-engine.js +0 -447
- package/dist/skills/upgrade-engine.js.map +0 -1
- package/dist/skills/upgrade-prompt.d.ts +0 -20
- package/dist/skills/upgrade-prompt.d.ts.map +0 -1
- package/dist/skills/upgrade-prompt.js +0 -75
- package/dist/skills/upgrade-prompt.js.map +0 -1
- package/dist/web/routes/ai.d.ts +0 -10
- package/dist/web/routes/ai.d.ts.map +0 -1
- package/dist/web/routes/ai.js +0 -186
- package/dist/web/routes/ai.js.map +0 -1
- package/dist/web/routes/token-usage.d.ts +0 -7
- package/dist/web/routes/token-usage.d.ts.map +0 -1
- package/dist/web/routes/token-usage.js +0 -18
- package/dist/web/routes/token-usage.js.map +0 -1
- package/dist/web/ssrf-guard.d.ts +0 -35
- package/dist/web/ssrf-guard.d.ts.map +0 -1
- package/dist/web/ssrf-guard.js +0 -93
- package/dist/web/ssrf-guard.js.map +0 -1
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
- package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
- package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
- package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
- package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
- package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
- package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
- package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
- package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
- package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
- package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
- package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
- package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
- package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
- package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
- package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
- package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
- package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
- package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
- package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
- package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
- package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
- package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
- package/dist/web/static/assets/index-CBX47X8l.js +0 -3
- package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
- package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
- package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
- package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
- package/dist/web/static/assets/query-C99w429o.js +0 -2
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
- package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
- package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
- package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
- package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
- package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
- package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksHubPage-C2PLh3eg.js","sources":["../../src/components/ai-summary/TierBanner.tsx","../../src/components/ai-summary/DecisionCard.tsx","../../src/components/ai-summary/helpers.ts","../../src/components/ai-summary/IntentCard.tsx","../../src/components/ai-summary/SystemDecisionCard.tsx","../../src/components/ai-summary/ExecutionCard.tsx","../../src/components/ai-summary/OutcomeCard.tsx","../../src/utils/taskActions.ts","../../src/components/ai-summary/ActionRail.tsx","../../src/components/ai-summary/TrivialCard.tsx","../../src/components/ai-summary/DebugDrawer.tsx","../../src/components/ai-summary/TaskTimelineView.tsx","../../src/components/ai-summary/types.ts","../../src/components/ai-summary/TierContainer.tsx","../../src/components/insights/DaemonObserverBadge.tsx","../../src/components/TaskDetailContent.tsx","../../src/components/SessionDetailContent.tsx","../../src/components/pipeline/DetailDrawer.tsx","../../src/components/tasks/OutcomeFilterChips.tsx","../../src/pages/TasksHubPage.tsx"],"sourcesContent":["/**\n * Tier 0 banner — 一句话答 \"成功了吗 / 走了什么路径 / 改了多少 / 用了多久\".\n *\n * Renders a single-line card above the 4 Tier-1 decision cards.\n */\nimport Card from '@arco-design/web-react/es/Card'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport {\n IconCheckCircle,\n IconCloseCircle,\n IconExclamationCircle,\n IconLoading,\n IconPauseCircle,\n} from '@arco-design/web-react/icon'\nimport type { BannerComputed } from './helpers'\n\nfunction outcomeIcon(o: BannerComputed['outcome']) {\n switch (o) {\n case 'success': return <IconCheckCircle style={{ color: 'var(--cf-tag-green)' }} />\n case 'partial': return <IconExclamationCircle style={{ color: 'var(--cf-tag-orange)' }} />\n case 'failed': return <IconCloseCircle style={{ color: 'var(--cf-tag-red)' }} />\n case 'abandoned': return <IconPauseCircle style={{ color: 'var(--color-text-3)' }} />\n default: return <IconLoading style={{ color: 'var(--cf-tag-blue)' }} spin />\n }\n}\n\nfunction outcomeTone(o: BannerComputed['outcome']): 'green' | 'orange' | 'red' | 'gray' | 'arcoblue' {\n switch (o) {\n case 'success': return 'green'\n case 'partial': return 'orange'\n case 'failed': return 'red'\n case 'abandoned': return 'gray'\n default: return 'arcoblue'\n }\n}\n\ninterface Props {\n banner: BannerComputed\n taskId: string\n startedAt: string\n}\n\nexport default function TierBanner({ banner, taskId, startedAt }: Props) {\n const tone = outcomeTone(banner.outcome)\n return (\n <Card\n bordered\n data-testid=\"tier-banner\"\n style={{\n marginBottom: 10,\n background: 'var(--cf-kpi-wash-purple, #FAF5FF)',\n borderColor: 'var(--cf-tag-purple, #B37FEB)',\n }}\n bodyStyle={{ padding: '10px 14px' }}\n >\n <div style={{\n display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap', fontSize: 13,\n }}>\n <span style={{ fontSize: 18, lineHeight: 1, display: 'inline-flex', alignItems: 'center' }}>\n {outcomeIcon(banner.outcome)}\n </span>\n <Tag color={tone} size=\"default\" data-testid=\"tier-banner-outcome\">\n {banner.outcomeLabel}\n </Tag>\n <Typography.Text style={{ fontSize: 12, color: 'var(--color-text-2)' }}>\n {banner.pathLabel}\n </Typography.Text>\n <Typography.Text style={{ fontSize: 12, color: 'var(--color-text-3)' }}>·</Typography.Text>\n <Typography.Text style={{ fontSize: 12 }}>\n {banner.fileCount} 文件\n </Typography.Text>\n <Typography.Text style={{ fontSize: 12, color: 'var(--color-text-3)' }}>·</Typography.Text>\n <Typography.Text style={{ fontSize: 12 }}>\n {banner.commitCount} commit\n </Typography.Text>\n <Typography.Text style={{ fontSize: 12, color: 'var(--color-text-3)' }}>·</Typography.Text>\n <Typography.Text style={{ fontSize: 12 }}>\n {banner.durationLabel}\n </Typography.Text>\n {banner.agentSpawnCount > 0 && (\n <>\n <Typography.Text style={{ fontSize: 12, color: 'var(--color-text-3)' }}>·</Typography.Text>\n <Typography.Text style={{ fontSize: 12 }}>\n {banner.agentSpawnCount} agent spawn\n </Typography.Text>\n </>\n )}\n <span style={{ flex: 1 }} />\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }} title={taskId}>\n {taskId.slice(0, 8)} · {startedAt.slice(0, 19).replace('T', ' ')}\n </Typography.Text>\n </div>\n </Card>\n )\n}\n","/**\n * Tier 1 expandable decision card.\n *\n * Renders one of the 4 cards (intent / decision / execution / outcome).\n * Header shows: idx, title, one-line summary, optional right chip.\n * Body is `detail` ReactNode rendered only when expanded.\n *\n * Expansion is controlled by parent (TierContainer) which persists state to\n * the URL `?expand=...` query param.\n */\nimport type { ReactNode } from 'react'\nimport Card from '@arco-design/web-react/es/Card'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { IconDown, IconRight } from '@arco-design/web-react/icon'\nimport type { TierCard } from './types'\n\ninterface Props {\n cardId: TierCard\n idx: 1 | 2 | 3 | 4\n title: string\n oneLine: string\n rightChip?: ReactNode\n expanded: boolean\n onToggle: () => void\n detail: ReactNode\n}\n\nexport default function DecisionCard({\n cardId, idx, title, oneLine, rightChip, expanded, onToggle, detail,\n}: Props) {\n return (\n <Card\n bordered\n data-testid={`decision-card-${cardId}`}\n data-expanded={expanded ? '1' : '0'}\n style={{ marginBottom: 8 }}\n bodyStyle={{ padding: 0 }}\n >\n <div\n role=\"button\"\n tabIndex={0}\n aria-expanded={expanded}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onToggle()\n }\n }}\n style={{\n cursor: 'pointer',\n padding: '10px 14px',\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n userSelect: 'none',\n }}\n >\n <span style={{ color: 'var(--color-text-3)', fontSize: 14, lineHeight: 1, display: 'inline-flex' }}>\n {expanded ? <IconDown /> : <IconRight />}\n </span>\n <Typography.Text style={{ fontSize: 12, color: 'var(--color-text-3)', minWidth: 14 }}>\n {idx}\n </Typography.Text>\n <Typography.Text style={{ fontSize: 13, fontWeight: 600, minWidth: 92 }}>\n {title}\n </Typography.Text>\n <Typography.Text\n type=\"secondary\"\n style={{\n fontSize: 12,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n color: 'var(--color-text-1)',\n }}\n title={oneLine}\n >\n {oneLine}\n </Typography.Text>\n {rightChip && (\n <span style={{ flexShrink: 0 }}>{rightChip}</span>\n )}\n </div>\n {expanded && (\n <div\n data-testid={`decision-card-detail-${cardId}`}\n style={{\n padding: '8px 14px 14px',\n borderTop: '1px solid var(--color-border-2)',\n background: 'var(--color-fill-1)',\n }}\n >\n {detail}\n </div>\n )}\n </Card>\n )\n}\n","/**\n * Pure helpers for v5 Tier UI — extracted verbatim from TaskDetailContent v4\n * (so v5 can keep the same decision-summary aggregation logic without\n * touching the legacy file's exports).\n */\nimport { parseUTC } from '../../utils/time'\nimport type {\n DecisionSummary,\n Injection,\n PendingSpec,\n TaskDetailData,\n} from './types'\n\nexport function safeJSONParse(s?: string | null): unknown {\n if (!s) return null\n try { return JSON.parse(s) } catch { return null }\n}\n\nexport function summarizeDecisions(data: TaskDetailData): DecisionSummary {\n const prompt = data.userPrompts[0]?.content?.trim() || null\n const promptTimestamp = data.userPrompts[0]?.timestamp ?? null\n\n const intentInj = data.injections.find(i => i.source_handler.includes(':intent')) ?? null\n const intentMeta = safeJSONParse(intentInj?.metadata_json) as Record<string, unknown> | null\n const intent = intentMeta\n ? {\n workflow_type: intentMeta.workflow_type as string | undefined,\n confidence: intentMeta.confidence as number | undefined,\n suggested_agent: intentMeta.suggested_agent as string | undefined,\n layer: intentMeta.layer as string | undefined,\n reasoning: intentMeta.reasoning as string | undefined,\n }\n : null\n\n const kbInjs = data.injections.filter(i => i.source_handler === 'UserPromptSubmitHandler:kb')\n const kbMap = new Map<string, { score: number; matched?: string[] }>()\n for (const inj of kbInjs) {\n const arr = safeJSONParse(inj.metadata_json)\n if (Array.isArray(arr)) {\n for (const h of arr) {\n if (h && typeof h.name === 'string') {\n const prev = kbMap.get(h.name)?.score ?? 0\n const score = typeof h.score === 'number' ? h.score : 0\n kbMap.set(h.name, {\n score: Math.max(prev, score),\n matched: Array.isArray(h.matched_keywords) ? h.matched_keywords : undefined,\n })\n }\n }\n }\n }\n const kbHits = Array.from(kbMap.entries())\n .sort((a, b) => b[1].score - a[1].score)\n .slice(0, 8)\n .map(([name, m]) => ({ name, score: m.score || undefined, matched: m.matched }))\n\n const skills = data.skillInvocations.slice(0, 16).map(s => ({\n skill_id: s.skill_id,\n reason: s.reason ?? '',\n }))\n\n const spawned = data.timeline\n .filter(e => e.is_agent_call && e.agent_detail?.subagent_type)\n .map(e => ({\n subagent_type: e.agent_detail?.subagent_type,\n name: e.agent_detail?.name,\n promptPreview: e.agent_detail?.prompt?.slice(0, 200),\n }))\n\n const fileCounter = new Map<string, number>()\n for (const e of data.timeline) {\n if ((e.tool_name === 'Edit' || e.tool_name === 'Write') &&\n (e.input as { file_path?: string } | null)?.file_path) {\n const p = (e.input as { file_path: string }).file_path\n fileCounter.set(p, (fileCounter.get(p) ?? 0) + 1)\n }\n }\n const fileList = Array.from(fileCounter.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([path, count]) => ({ path, count }))\n const filesChanged = fileList.length\n\n const commits: string[] = []\n for (const e of data.timeline) {\n if (e.tool_name !== 'Bash') continue\n const cmd = (e.input as { command?: string } | null)?.command\n if (!cmd) continue\n if (/\\bgit\\s+commit\\b/.test(cmd)) {\n const out = e.output as unknown\n const text =\n typeof out === 'string' ? out :\n (out as { stdout?: string; output?: string } | null)?.stdout ??\n (out as { output?: string } | null)?.output ??\n JSON.stringify(out ?? {})\n const m = String(text).match(/\\b[a-f0-9]{7,40}\\b/)\n if (m) commits.push(m[0])\n else commits.push(`(commit @ ${e.timestamp.slice(11, 19)})`)\n }\n }\n\n const outcome = data.outcome\n ? {\n label: data.outcome,\n reason: data.outcome_reason,\n commit_count: data.commit_count,\n }\n : null\n\n return {\n prompt, promptTimestamp,\n intent, intentInj,\n kbHits, kbInjs,\n skills,\n spawned,\n filesChanged, fileList,\n commits,\n outcome,\n specs: data.pendingSpecs ?? [],\n }\n}\n\n/**\n * v6 trivial-path detector (spec 1750 Batch 1, B1-1).\n *\n * \"Trivial\" = all 3 daemon-intervention sections empty:\n * - § 1 (intent): no intent injection AND no KB hits\n * - § 2 (decision): no spec generated AND no skill match\n * - § 3 (execution): no agent spawned AND no file changes\n *\n * Commits and outcome are deliberately NOT considered daemon-intervention\n * signals — a 1-commit \"提交并推送\" task with zero daemon involvement is the\n * canonical trivial case (草图 1/2 in spec 1750 附录).\n *\n * Returns true when TierContainer should collapse into a single-line TrivialCard\n * instead of rendering the 4-card Tier framework.\n */\nexport function isTrivialPath(s: DecisionSummary): boolean {\n const intentEmpty = !s.intent && s.kbHits.length === 0\n const decisionEmpty = s.specs.length === 0 && s.skills.length === 0\n const executionEmpty = s.spawned.length === 0 && s.filesChanged === 0\n return intentEmpty && decisionEmpty && executionEmpty\n}\n\n/** Banner one-line / counts. */\nexport interface BannerComputed {\n outcome: 'success' | 'partial' | 'failed' | 'abandoned' | 'active'\n outcomeLabel: string\n pathLabel: string\n fileCount: number\n commitCount: number\n durationLabel: string\n agentSpawnCount: number\n}\n\nexport function computeBanner(s: DecisionSummary, data: TaskDetailData): BannerComputed {\n const hasSpec = s.specs.length > 0\n // Workflow recommendations retired (decision fe6f98cd): the path label is\n // either the BMAD spec token or the autonomous-spawn composer.\n let pathLabel: string\n if (hasSpec) {\n pathLabel = `BMAD Spec (token=${s.specs[0].token})`\n } else {\n const firstSpawn = data.agentSpawns[0]?.subagent_type ?? null\n pathLabel = pathLabelFromRec(null, firstSpawn)\n }\n\n const outcome: BannerComputed['outcome'] = s.outcome?.label ?? 'active'\n const outcomeLabel =\n outcome === 'success' ? '成功' :\n outcome === 'partial' ? '部分' :\n outcome === 'failed' ? '失败' :\n outcome === 'abandoned' ? '放弃' : '进行中'\n\n const fileCount = s.filesChanged\n const commitCount = (s.outcome?.commit_count ?? 0) || s.commits.length\n\n let durationLabel = '-'\n if (data.start_time) {\n const end = data.end_time\n ? parseUTC(data.end_time).getTime()\n : Date.now()\n const start = parseUTC(data.start_time).getTime()\n const secs = Math.max(0, Math.round((end - start) / 1000))\n if (secs < 60) durationLabel = `${secs}s`\n else if (secs < 3600) durationLabel = `${Math.floor(secs / 60)}m${secs % 60}s`\n else durationLabel = `${Math.floor(secs / 3600)}h${Math.floor((secs % 3600) / 60)}m`\n }\n\n return {\n outcome,\n outcomeLabel,\n pathLabel,\n fileCount,\n commitCount,\n durationLabel,\n agentSpawnCount: data.agentSpawns.length,\n }\n}\n\n/** Per-card one-line summaries. ≤ ~80 chars each, used in Tier 1 collapsed header. */\nexport interface CardOneLines {\n intent: string\n decision: string\n execution: string\n outcome: string\n}\n\nexport function computeOneLines(s: DecisionSummary, data: TaskDetailData): CardOneLines {\n // Intent\n const wf = s.intent?.workflow_type ?? '?'\n const layer = s.intent?.layer ?? '-'\n const conf = typeof s.intent?.confidence === 'number'\n ? ` conf=${s.intent.confidence.toFixed(2)}`\n : ''\n const promptSnip = s.prompt\n ? (s.prompt.length > 30 ? s.prompt.slice(0, 30) + '…' : s.prompt).replace(/\\n/g, ' ')\n : ''\n const intent = `${wf} · ${layer}${conf}${promptSnip ? ` · \"${promptSnip}\"` : ''}`\n\n // Decision\n const specN = s.specs.length\n const skillN = s.skills.length\n const decisionParts: string[] = []\n if (specN) decisionParts.push(`spec×${specN}`)\n if (skillN) decisionParts.push(`skill×${skillN}`)\n // v6 Batch 2 (painpoint E): \"无 daemon 推荐\" was ambiguous — clarify intent\n // with the 3-state phrasing from pathLabelFromRec semantics.\n const decision = decisionParts.length === 0 ? '自主决策(未走 daemon 推荐)' : decisionParts.join(' · ')\n\n // Execution\n const spawnN = data.agentSpawns.length\n const fileN = s.filesChanged\n const types = Array.from(new Set(data.agentSpawns.map(sp => sp.subagent_type ?? '?')))\n let exec: string\n if (spawnN === 0) {\n exec = fileN > 0 ? `主线程直改 ${fileN} 文件 (0 spawn)` : '未触发'\n } else {\n exec = `spawn×${spawnN} (${types.slice(0, 2).join(', ')}${types.length > 2 ? '…' : ''}) · file×${fileN}`\n }\n\n // Outcome\n const oLabel =\n s.outcome?.label === 'success' ? '成功' :\n s.outcome?.label === 'partial' ? '部分' :\n s.outcome?.label === 'failed' ? '失败' :\n s.outcome?.label === 'abandoned' ? '放弃' : '进行中'\n const commitN = s.outcome?.commit_count ?? s.commits.length\n const reverted = data.reverted_commits ?? 0\n const violation = data.user_violation_count ?? 0\n const outParts: string[] = [oLabel]\n if (commitN > 0) outParts.push(`commit×${commitN}`)\n if (reverted > 0) outParts.push(`reverted×${reverted}`)\n if (violation > 0) outParts.push(`violation×${violation}`)\n const outcome = outParts.join(' · ')\n\n return { intent, decision, execution: exec, outcome }\n}\n\nexport function specStatusText(s: PendingSpec): { label: string; color: string } {\n if (s.status === 'approved') return { label: '已 approve', color: 'green' }\n if (s.status === 'skipped') return { label: '已 skip', color: 'gray' }\n if (s.status === 'modified') return { label: '已修改', color: 'orange' }\n if (s.status === 'expired') return { label: '已过期', color: 'gray' }\n return { label: '待 approve', color: 'arcoblue' }\n}\n\n/** Shared pre/code styles used across detail panels. */\nexport const preBox: React.CSSProperties = {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: 11,\n lineHeight: 1.55,\n color: 'var(--color-text-2)',\n background: 'var(--color-fill-1)',\n border: '1px solid var(--color-border-2)',\n borderRadius: 4,\n padding: 10,\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n maxHeight: 280,\n overflowY: 'auto',\n}\n\n/** Re-export Injection for callsites that import via this module. */\nexport type { Injection }\n\n// ─────────────────────────────────────────────────────────────────────────────\n// v6 Batch 2 — reasonLabel dict (spec 1750 § B2-4, decision OQ Q3)\n//\n// Maps machine-readable enum values (routing_events.reason / refusal_reason /\n// tool_intercepts.rule_id) to user-friendly\n// 中文 labels. Frontend-only dict — no backend schema change required.\n// Historical workflow_recommendations rule ids are kept so old intercept rows\n// still resolve to friendly labels.\n//\n// Painpoint B (matching daemon recommendation vs main-thread autonomous spawn):\n// uses `pathLabelFromRec()` 3-state helper below, which composes a reasonLabel\n// with the actual spawned subagent type. See SystemDecisionCard / TierBanner.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst REASON_LABELS: Record<string, string> = {\n // ── workflow_recommendations / routing_events.refusal_reason ──────────────\n 'bmad-question-default': 'BMAD 默认路径(疑问句)',\n 'bmad-default': 'BMAD 默认路径',\n 'task-question-needs-bmad': '任务问题需走 BMAD',\n 'decision-hint-pending': '待 decision-maker 介入',\n 'no-spawn': '主线程直接处理',\n 'harness-debug-full': 'Harness 调试流程(未知 bug)',\n 'harness-hotfix': 'Harness hotfix(已知 bug)',\n 'refactor-low-coverage': '重构低覆盖代码',\n 'hybrid-feature-with-safety': '新功能 + 改老代码(低覆盖)',\n 'workflow-recommendation-mismatch': '主线程未按推荐 spawn',\n 'workflow-rec': 'Workflow 推荐命中',\n 'kb-injection': '知识库(KB)注入',\n 'spec-gate-block-mutation': 'Spec gate 拦截 mutation',\n // ── tool_intercepts.rule_id ──────────────────────────────────────────────\n 'edit-multi-file-hard': '多文件 Edit 硬阈值',\n 'write-multi-file-hard': '多文件 Write 硬阈值',\n 'edit-multi-file-no-agent': '多文件 Edit 但未 spawn agent',\n 'write-multi-file-no-agent': '多文件 Write 但未 spawn agent',\n 'edit-hook-script-from-main': '主线程改 hook 脚本',\n 'write-hook-script-from-main': '主线程写 hook 脚本',\n 'bash-grep-multi-file': '主线程 bash grep 多文件',\n 'bash-find-source': '主线程 bash find 源码',\n 'bash-git-log-diff-no-file': '主线程 git log/diff 无文件',\n 'task-spawn-general-purpose-misuse': 'spawn general-purpose(应用专门 agent)',\n 'inline-edit-no-spawn': '单文件 inline Edit 未 spawn',\n 'inline-write-no-spawn': '单文件 inline Write 未 spawn',\n}\n\n/**\n * Map a routing reason / rule_id enum to a user-friendly 中文 label.\n *\n * Fallback strategy (per decision OQ Q3): if the input doesn't match a known\n * key, return the raw value so users always see *something*, and emit a\n * `console.warn` so unknown enums surface in dev tools (Batch 2.5 will wire\n * this into a telemetry endpoint).\n */\nexport function reasonLabel(reason: string | null | undefined): string {\n if (!reason) return '未知'\n const hit = REASON_LABELS[reason]\n if (hit) return hit\n // Telemetry hook: log unknown enums so the dict can be expanded.\n // eslint-disable-next-line no-console\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[reasonLabel] unknown enum: \"${reason}\"`)\n }\n return reason\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Polish-2 (2026-05-29) — extract `<!-- decision-id: XXXXXXXX -->` magic markers\n// out of agent-spawn prompts so the prompt preview shown in TaskTimelineView\n// doesn't carry the literal comment as user-visible text. The markers are\n// promoted to a separate \"📋 决策 <id>\" tag with a link to /decisions/:id.\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst DECISION_ID_COMMENT_RE = /<!--\\s*decision-id:\\s*([a-f0-9]{4,40})\\s*-->/gi;\n\nexport interface ExtractDecisionIdsResult {\n /** Hex ids found inside `<!-- decision-id: ... -->` comments. */\n ids: string[];\n /** Original prompt with the comment line(s) and surrounding whitespace removed. */\n cleanedPrompt: string;\n}\n\n/**\n * Pull every `<!-- decision-id: hex -->` out of `prompt` and return the cleaned\n * text + the captured ids. Empty input → empty result; idempotent on already\n * cleaned text. Used by TaskTimelineView so the agent_spawn prompt preview\n * doesn't show the literal comment (which truncates badly in a 500-char\n * preview window).\n */\nexport function extractDecisionIds(prompt: string | null | undefined): ExtractDecisionIdsResult {\n if (!prompt) return { ids: [], cleanedPrompt: '' };\n const ids: string[] = [];\n let cleaned = prompt;\n // Use a fresh regex per call so the global state isn't shared across calls.\n const re = new RegExp(DECISION_ID_COMMENT_RE.source, 'gi');\n let m: RegExpExecArray | null;\n while ((m = re.exec(prompt)) !== null) {\n if (m[1] && !ids.includes(m[1])) ids.push(m[1]);\n }\n // Strip the comments. Run after collection so the regex above doesn't depend\n // on consumed state.\n cleaned = cleaned.replace(new RegExp(DECISION_ID_COMMENT_RE.source, 'gi'), '');\n // Tidy: collapse any leading whitespace-only lines we just produced.\n cleaned = cleaned.replace(/^[ \\t]*\\n+/, '').replace(/\\n{3,}/g, '\\n\\n').trimStart();\n return { ids, cleanedPrompt: cleaned };\n}\n\n/**\n * Painpoint B/E 3-state composer for the \"daemon recommended vs main-thread\n * autonomous spawn\" path label.\n *\n * Old: \"主线程自由 (无 daemon 推荐)\" / \"无 daemon 推荐\"\n * New 3 states:\n * 1. recommended=null, spawned=null → \"自主决策(未走 daemon 推荐)\"\n * 2. recommended=X, spawned=X → \"daemon 推荐: X\"\n * 3. recommended=X, spawned=Y (Y≠X) → \"daemon 推荐 X(主线程选 Y)\"\n * 4. recommended=X, spawned=null → \"daemon 推荐: X(未 spawn)\"\n * 5. recommended=null, spawned=Y → \"自主决策: spawn Y(无 daemon 推荐)\"\n */\nexport function pathLabelFromRec(\n recommended: string | null | undefined,\n spawned: string | null | undefined,\n): string {\n const rec = recommended || null\n const spw = spawned || null\n if (!rec && !spw) return '自主决策(未走 daemon 推荐)'\n if (rec && spw && rec === spw) return `daemon 推荐: ${rec}`\n if (rec && spw && rec !== spw) return `daemon 推荐 ${rec}(主线程选 ${spw})`\n if (rec && !spw) return `daemon 推荐: ${rec}(未 spawn)`\n // !rec && spw\n return `自主决策: spawn ${spw}(无 daemon 推荐)`\n}\n","/**\n * ① 用户意图 detail panel.\n *\n * Surfaces (from v4 mapping):\n * - 1 用户提问 (full prompt + timestamp)\n * - 2 识别意图 (intent injection full content + metadata fields)\n * - 4 命中知识库 (top KB hits + full inject text up to 800 char each)\n *\n * Spec § \"9 stages → 4 cards mapping\": stages 1 / 2 / 4 → ①.\n */\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { preBox } from './helpers'\nimport type { DecisionSummary } from './types'\nimport { formatLocalDisplay } from '../../utils/time'\n\ninterface Props {\n s: DecisionSummary\n}\n\nexport default function IntentCard({ s }: Props) {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {/* 提问 */}\n <section>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 4 }}>\n 用户提问\n {s.prompt && (\n <Tag size=\"small\" color=\"gray\" style={{ marginLeft: 6 }}>\n {s.prompt.length} chars\n </Tag>\n )}\n </Typography.Text>\n {s.prompt ? (\n <>\n {s.promptTimestamp && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginBottom: 4 }}>\n timestamp: <Typography.Text code style={{ fontSize: 11 }}>{formatLocalDisplay(s.promptTimestamp, { includeSeconds: true })}</Typography.Text>\n </Typography.Text>\n )}\n <pre style={preBox}>{s.prompt}</pre>\n </>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>未触发</Typography.Text>\n )}\n </section>\n\n {/* 意图识别 */}\n <section>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 4 }}>\n 意图识别\n {s.intentInj && <Tag size=\"small\" color=\"arcoblue\" style={{ marginLeft: 6 }}>已注入</Tag>}\n </Typography.Text>\n {s.intent ? (\n <div style={{ marginBottom: 6, fontSize: 12 }}>\n <Typography.Text code style={{ fontSize: 11 }}>\n workflow_type={s.intent.workflow_type ?? '-'}\n </Typography.Text>\n {typeof s.intent.confidence === 'number' && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, marginLeft: 6 }}>\n · confidence={(s.intent.confidence * 100).toFixed(0)}%\n </Typography.Text>\n )}\n {s.intent.layer && (\n <Tag size=\"small\" color=\"gray\" style={{ marginLeft: 6, fontSize: 10 }}>\n layer={s.intent.layer}\n </Tag>\n )}\n {s.intent.suggested_agent && (\n <Tag size=\"small\" color=\"purple\" style={{ marginLeft: 6, fontSize: 10 }}>\n → {s.intent.suggested_agent}\n </Tag>\n )}\n {s.intent.reasoning && (\n <div style={{ marginTop: 4, fontSize: 11, color: 'var(--color-text-2)' }}>\n {s.intent.reasoning}\n </div>\n )}\n </div>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>未触发</Typography.Text>\n )}\n {s.intentInj && (\n <>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginTop: 4, marginBottom: 4 }}>\n 注入原文 (source: <Typography.Text code style={{ fontSize: 11 }}>{s.intentInj.source_handler}</Typography.Text>):\n </Typography.Text>\n <pre style={preBox}>{s.intentInj.content}</pre>\n </>\n )}\n </section>\n\n {/* 命中知识库 */}\n <section>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 4 }}>\n 命中知识库\n {s.kbHits.length > 0 && (\n <Tag size=\"small\" color=\"purple\" style={{ marginLeft: 6 }}>\n {s.kbHits.length} 命中\n </Tag>\n )}\n </Typography.Text>\n {s.kbHits.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>未触发</Typography.Text>\n ) : (\n <>\n <div style={{ display: 'inline-flex', flexWrap: 'wrap', gap: 4, marginBottom: 6 }}>\n {s.kbHits.map(h => (\n <Tag key={h.name} size=\"small\" color=\"purple\" style={{ fontSize: 10 }}>\n {h.name}\n {typeof h.score === 'number' && ` · score ${Math.round(h.score)}`}\n {h.matched && h.matched.length > 0 && ` · [${h.matched.slice(0, 3).join(', ')}]`}\n </Tag>\n ))}\n </div>\n {s.kbInjs.map((inj, i) => (\n <div key={inj.id} style={{ marginTop: 6 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginBottom: 4 }}>\n 注入 #{i + 1} ({inj.content.length} chars):\n </Typography.Text>\n <pre style={preBox}>\n {inj.content.slice(0, 800)}{inj.content.length > 800 && '\\n…(truncated)'}\n </pre>\n </div>\n ))}\n </>\n )}\n </section>\n </div>\n )\n}\n","/**\n * ② 系统决策 detail panel.\n *\n * Surfaces (from v4 mapping):\n * - 3.5 Spec 生成 (pendingSpecs with token/path/status)\n * - 5 匹配技能 (skillInvocations)\n *\n * (推荐方法论 / workflowRecommendations section retired 2026-06-10 —\n * decision fe6f98cd.)\n */\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { specStatusText } from './helpers'\nimport type { DecisionSummary } from './types'\n\ninterface Props {\n s: DecisionSummary\n}\n\nexport default function SystemDecisionCard({ s }: Props) {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {/* Spec 生成 (pendingSpecs) */}\n <section>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 4 }}>\n Spec 生成 (Phase 2b)\n {s.specs.length > 0 && (\n <Tag size=\"small\" color=\"purple\" style={{ marginLeft: 6 }}>\n {s.specs.length} 条\n </Tag>\n )}\n </Typography.Text>\n {s.specs.length === 0 ? (\n // v6 Batch 1 (spec 1750 § B1-6): removed the \"可能原因: …\" string\n // — it leaked implementation detail (intent engine / config flag).\n // Batch 2 will surface this via the DebugDrawer instead.\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>未触发</Typography.Text>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {s.specs.map(sp => {\n const st = specStatusText(sp)\n return (\n <div key={sp.id} style={{\n padding: '6px 10px', background: 'var(--color-bg-1)',\n border: '1px solid var(--color-border-2)', borderRadius: 4, fontSize: 11,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n <Typography.Text code style={{ fontSize: 11, color: 'var(--cf-tag-purple)' }}>\n token={sp.token}\n </Typography.Text>\n <Tag size=\"small\" color={st.color as 'green' | 'gray' | 'orange' | 'arcoblue'}>\n {st.label}\n </Tag>\n {sp.intent?.workflow_type && (\n <Tag size=\"small\" color=\"gray\" style={{ fontSize: 10 }}>\n {sp.intent.workflow_type}\n {sp.intent.suggested_agent ? ` → ${sp.intent.suggested_agent}` : ''}\n </Tag>\n )}\n <Typography.Text type=\"secondary\" style={{ fontSize: 10 }}>\n {sp.created_at.slice(11, 19)}\n </Typography.Text>\n </div>\n <div style={{ marginTop: 4 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>spec_path: </Typography.Text>\n <Typography.Text code style={{ fontSize: 10, wordBreak: 'break-all' }}>{sp.spec_path}</Typography.Text>\n </div>\n {sp.approved_at && (\n <div style={{ marginTop: 2, color: 'var(--color-text-2)' }}>\n approved_at: <Typography.Text code style={{ fontSize: 10 }}>{sp.approved_at}</Typography.Text>\n </div>\n )}\n </div>\n )\n })}\n </div>\n )}\n </section>\n\n {/* 匹配技能 (skillInvocations) */}\n <section>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 4 }}>\n 匹配技能\n {s.skills.length > 0 && (\n <Tag size=\"small\" color=\"arcoblue\" style={{ marginLeft: 6 }}>\n {s.skills.length} 个\n </Tag>\n )}\n </Typography.Text>\n {s.skills.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>未触发</Typography.Text>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {s.skills.map((sk, i) => (\n <div key={`${sk.skill_id}-${i}`} style={{\n padding: '6px 10px', background: 'var(--color-bg-1)',\n border: '1px solid var(--color-border-2)', borderRadius: 4, fontSize: 11,\n }}>\n <Typography.Text code style={{ fontSize: 11, color: 'var(--cf-tag-purple)' }}>\n {sk.skill_id}\n </Typography.Text>\n {sk.reason && (\n <div style={{ marginTop: 4, color: 'var(--color-text-2)' }}>{sk.reason}</div>\n )}\n </div>\n ))}\n </div>\n )}\n </section>\n </div>\n )\n}\n","/**\n * ③ 执行 detail panel.\n *\n * Surfaces (from v4 mapping):\n * - 6 spawn Agent (full prompt/output, duration, per-spawn 期间产物 files)\n * - 7 改文件 (file list with by-spawn attribution)\n *\n * Spec § \"9 stages → 4 cards mapping\": stages 6 / 7 → ③.\n */\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { IconFile } from '@arco-design/web-react/icon'\nimport { parseUTC } from '../../utils/time'\nimport { preBox } from './helpers'\nimport type { DecisionSummary, TaskDetailData } from './types'\n\ninterface Props {\n s: DecisionSummary\n data: TaskDetailData\n}\n\nexport default function ExecutionCard({ s, data }: Props) {\n const totalFileOps = s.fileList.reduce((sum, f) => sum + f.count, 0)\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {/* spawn Agent — full execution traces */}\n <section>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 4 }}>\n spawn Agent\n {data.agentSpawns.length > 0 && (\n <Tag size=\"small\" color=\"arcoblue\" style={{ marginLeft: 6 }}>\n {data.agentSpawns.length} 次\n </Tag>\n )}\n </Typography.Text>\n {data.agentSpawns.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>未 spawn</Typography.Text>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {data.agentSpawns.map((sp, i) => {\n const dur = sp.end_timestamp\n ? Math.max(0, Math.round((parseUTC(sp.end_timestamp).getTime() - parseUTC(sp.timestamp).getTime()) / 1000))\n : null\n const durLabel = dur === null\n ? 'running'\n : dur < 60 ? `${dur}s`\n : `${Math.floor(dur / 60)}m${dur % 60}s`\n const winFrom = sp.timestamp\n const nextSp = data.agentSpawns[i + 1]\n const winTo = nextSp?.timestamp ?? sp.end_timestamp ?? new Date().toISOString()\n const fileMap = new Map<string, number>()\n for (const e of data.timeline) {\n if (e.tool_name !== 'Edit' && e.tool_name !== 'Write') continue\n if (e.timestamp < winFrom || e.timestamp > winTo) continue\n const fp = (e.input as { file_path?: string } | null)?.file_path\n if (typeof fp === 'string') fileMap.set(fp, (fileMap.get(fp) ?? 0) + 1)\n }\n const filesInWindow = Array.from(fileMap.entries())\n return (\n <div key={i} style={{\n padding: '8px 10px', background: 'var(--color-bg-1)',\n border: '1px solid var(--color-border-2)', borderRadius: 4, fontSize: 11,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 4, flexWrap: 'wrap' }}>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, color: 'var(--cf-tag-blue)' }}>\n Spawn #{i + 1}\n </Typography.Text>\n <Typography.Text code style={{ fontSize: 11, color: 'var(--cf-tag-blue)' }}>\n {sp.subagent_type ?? '(no type)'}\n </Typography.Text>\n {sp.status === 'completed'\n ? <Tag size=\"small\" color=\"green\">completed</Tag>\n : <Tag size=\"small\" color=\"arcoblue\">running</Tag>}\n <Typography.Text type=\"secondary\" style={{ fontSize: 10 }}>\n {sp.timestamp.slice(11, 19)} · {durLabel}\n </Typography.Text>\n </div>\n {sp.description && (\n <div style={{ marginTop: 2 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>描述: </Typography.Text>\n <Typography.Text style={{ fontSize: 11 }}>{sp.description}</Typography.Text>\n </div>\n )}\n {sp.prompt && (\n <details style={{ marginTop: 4 }}>\n <summary style={{ fontSize: 11, color: 'var(--color-text-3)', cursor: 'pointer' }}>\n 完整 prompt ({sp.prompt_length} chars)\n </summary>\n <pre style={preBox}>{sp.prompt}</pre>\n </details>\n )}\n {sp.output && (\n <details style={{ marginTop: 4 }}>\n <summary style={{ fontSize: 11, color: 'var(--color-text-3)', cursor: 'pointer' }}>\n 输出预览 ({sp.output_length} chars)\n </summary>\n <pre style={{ ...preBox, maxHeight: 160 }}>\n {sp.output.slice(0, 1200)}{sp.output.length > 1200 && '\\n…(fold)'}\n </pre>\n </details>\n )}\n <div style={{ marginTop: 6 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n 期间产物 ({filesInWindow.length} 文件):\n </Typography.Text>\n {filesInWindow.length > 0 ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, marginTop: 4 }}>\n {filesInWindow.map(([fp, cnt]) => (\n <div key={fp} style={{ display: 'flex', gap: 6, alignItems: 'center', fontSize: 11 }}>\n <IconFile style={{ color: 'var(--cf-tag-green)', flexShrink: 0 }} />\n <Typography.Text code style={{ fontSize: 10, wordBreak: 'break-all' }}>{fp}</Typography.Text>\n <Tag size=\"small\" color=\"gray\" style={{ fontSize: 10 }}>×{cnt}</Tag>\n </div>\n ))}\n </div>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, marginLeft: 4 }}>(无)</Typography.Text>\n )}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </section>\n\n {/* 改文件 — global view (attribution to spawn or 主线程) */}\n <section>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 4 }}>\n 改文件总览\n {s.filesChanged > 0 && (\n <Tag size=\"small\" color=\"green\" style={{ marginLeft: 6 }}>\n {s.filesChanged} 文件 / {totalFileOps} 操作\n </Tag>\n )}\n </Typography.Text>\n {s.fileList.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>未触发</Typography.Text>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {s.fileList.map(f => {\n let attrIdx = -1\n for (const e of data.timeline) {\n if ((e.tool_name !== 'Edit' && e.tool_name !== 'Write')) continue\n if ((e.input as { file_path?: string } | null)?.file_path !== f.path) continue\n for (let i = 0; i < data.agentSpawns.length; i++) {\n const sp = data.agentSpawns[i]\n const next = data.agentSpawns[i + 1]?.timestamp ?? sp.end_timestamp ?? '9999'\n if (e.timestamp >= sp.timestamp && e.timestamp <= next) {\n attrIdx = i\n break\n }\n }\n if (attrIdx >= 0) break\n }\n const attrTag = attrIdx >= 0\n ? <Tag size=\"small\" color=\"cyan\" style={{ fontSize: 10 }}>by Spawn #{attrIdx + 1}</Tag>\n : <Tag size=\"small\" color=\"gray\" style={{ fontSize: 10 }}>by 主线程</Tag>\n return (\n <div key={f.path} style={{\n display: 'flex', alignItems: 'center', gap: 8, padding: '4px 8px',\n background: 'var(--color-bg-1)', border: '1px solid var(--color-border-2)', borderRadius: 4,\n }}>\n <IconFile style={{ color: 'var(--cf-tag-green)', flexShrink: 0 }} />\n <Typography.Text code style={{ fontSize: 11, flex: 1, wordBreak: 'break-all' }} title={f.path}>\n {f.path}\n </Typography.Text>\n {attrTag}\n <Tag size=\"small\" color=\"gray\" style={{ flexShrink: 0, fontSize: 10 }}>×{f.count}</Tag>\n </div>\n )\n })}\n </div>\n )}\n </section>\n </div>\n )\n}\n","/**\n * ④ 结果 detail panel.\n *\n * Surfaces (from v4 mapping):\n * - 8 结果 (outcome / outcome_reason / commit_count / commits grep / event_count)\n * - + reverted_commits / user_violation_count (v9.x outcome instrumentation)\n *\n * Spec § \"9 stages → 4 cards mapping\": stage 8 → ④.\n */\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport type { DecisionSummary, TaskDetailData, TaskOutcome } from './types'\n\ninterface Props {\n s: DecisionSummary\n data: TaskDetailData\n}\n\nfunction outcomeTag(label: TaskOutcome) {\n if (label === 'success') return <Tag color=\"green\" size=\"small\">成功</Tag>\n if (label === 'partial') return <Tag color=\"orange\" size=\"small\">部分</Tag>\n if (label === 'failed') return <Tag color=\"red\" size=\"small\">失败</Tag>\n if (label === 'abandoned') return <Tag color=\"gray\" size=\"small\">放弃</Tag>\n return <Tag size=\"small\">{label}</Tag>\n}\n\nexport default function OutcomeCard({ s, data }: Props) {\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8, fontSize: 12 }}>\n {!s.outcome && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 未分类 / 进行中\n </Typography.Text>\n )}\n {s.outcome && (\n <>\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>outcome: </Typography.Text>\n {outcomeTag(s.outcome.label)}\n </div>\n {s.outcome.reason && (\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>outcome_reason: </Typography.Text>\n <Typography.Text code style={{ fontSize: 11 }}>{s.outcome.reason}</Typography.Text>\n </div>\n )}\n {typeof s.outcome.commit_count === 'number' && (\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>commit_count: </Typography.Text>\n <Typography.Text style={{ fontSize: 11 }}>{s.outcome.commit_count}</Typography.Text>\n </div>\n )}\n </>\n )}\n {typeof data.reverted_commits === 'number' && data.reverted_commits > 0 && (\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>reverted_commits: </Typography.Text>\n <Tag color=\"red\" size=\"small\">{data.reverted_commits}</Tag>\n </div>\n )}\n {typeof data.user_violation_count === 'number' && data.user_violation_count > 0 && (\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>user_violation_count: </Typography.Text>\n <Tag color=\"orange\" size=\"small\">{data.user_violation_count}</Tag>\n </div>\n )}\n {s.commits.length > 0 && (\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginBottom: 4 }}>\n commits (best-effort grep from Bash):\n </Typography.Text>\n <div style={{ display: 'inline-flex', flexWrap: 'wrap', gap: 4 }}>\n {s.commits.map((c, i) => (\n <Tag key={`${c}-${i}`} size=\"small\" color=\"green\" style={{ fontSize: 10, fontFamily: 'monospace' }}>{c}</Tag>\n ))}\n </div>\n </div>\n )}\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>event_count: </Typography.Text>\n <Typography.Text style={{ fontSize: 11 }}>{data.event_count}</Typography.Text>\n </div>\n </div>\n )\n}\n","/**\n * Mutation helpers for Tier 3 action rail (v6 task-detail; was \"v5 AI 决策摘要\").\n *\n * Wraps POST /api/tasks/:id/{approve-spec, mark-abandoned, rerun} into\n * tiny async functions that ActionRail composes via react-query useMutation.\n */\nimport { authFetch } from './auth'\n\nexport interface ApproveSpecBody {\n taskId: string\n}\n\nexport interface MarkAbandonedBody {\n taskId: string\n reason?: string\n}\n\nexport interface RerunBody {\n taskId: string\n}\n\nexport interface RerunResponse {\n taskId: string\n prompt: string | null\n workflow_type?: string | null\n suggested_agent?: string | null\n}\n\nasync function postJson<T>(url: string, body?: unknown): Promise<T> {\n const res = await authFetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: body ? JSON.stringify(body) : undefined,\n })\n if (!res.ok) {\n let detail: string | undefined\n try {\n const j = await res.json()\n detail = j?.error || j?.message\n } catch { /* ignore */ }\n throw new Error(`${res.status} ${detail ?? res.statusText}`)\n }\n return res.json() as Promise<T>\n}\n\nexport async function approveTaskSpec(b: ApproveSpecBody): Promise<{ ok: true; approved: number }> {\n return postJson(`/api/tasks/${encodeURIComponent(b.taskId)}/approve-spec`)\n}\n\nexport async function markTaskAbandoned(b: MarkAbandonedBody): Promise<{ ok: true }> {\n return postJson(`/api/tasks/${encodeURIComponent(b.taskId)}/mark-abandoned`, {\n reason: b.reason ?? null,\n })\n}\n\nexport async function rerunTask(b: RerunBody): Promise<RerunResponse> {\n return postJson(`/api/tasks/${encodeURIComponent(b.taskId)}/rerun`)\n}\n","/**\n * Tier 3 action rail.\n *\n * Four buttons (Q9 MVP):\n * ① Approve spec — POST /api/tasks/:id/approve-spec (only if pending spec)\n * ② Mark abandoned — POST /api/tasks/:id/mark-abandoned\n * ③ Re-run (open prompt)\n * — GET prompt via POST /api/tasks/:id/rerun, then\n * show a modal with \"Copy to clipboard\" + \"Done\"\n * ④ Compare last week — disabled-but-visible (MVP 后续)\n *\n * Confirmation handled via useConfirm() (red dialog for abandoned).\n */\nimport { useState } from 'react'\nimport Button from '@arco-design/web-react/es/Button'\nimport Modal from '@arco-design/web-react/es/Modal'\nimport Message from '@arco-design/web-react/es/Message'\nimport Tooltip from '@arco-design/web-react/es/Tooltip'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport {\n IconCheckCircle,\n IconCloseCircle,\n IconRefresh,\n IconDashboard,\n IconCopy,\n} from '@arco-design/web-react/icon'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useConfirm } from '../Confirm'\nimport {\n approveTaskSpec,\n markTaskAbandoned,\n rerunTask,\n type RerunResponse,\n} from '../../utils/taskActions'\nimport type { PendingSpec, TaskOutcome } from './types'\n\ninterface Props {\n taskId: string\n outcome: TaskOutcome | null | undefined\n pendingSpecs: PendingSpec[]\n}\n\nexport default function ActionRail({ taskId, outcome, pendingSpecs }: Props) {\n const confirm = useConfirm()\n const queryClient = useQueryClient()\n const [rerunPayload, setRerunPayload] = useState<RerunResponse | null>(null)\n\n const approvable = pendingSpecs.some(sp => sp.status === 'generated')\n const isFinalised = outcome === 'abandoned'\n\n const approveMut = useMutation({\n mutationFn: () => approveTaskSpec({ taskId }),\n onSuccess: (data) => {\n Message.success(`已 approve ${data.approved} spec`)\n queryClient.invalidateQueries({ queryKey: ['task-detail', taskId] })\n },\n onError: (err: Error) => {\n Message.error(`Approve 失败:${err.message}`)\n },\n })\n\n const abandonMut = useMutation({\n mutationFn: (reason?: string) => markTaskAbandoned({ taskId, reason }),\n onSuccess: () => {\n Message.success('已标记 abandoned')\n queryClient.invalidateQueries({ queryKey: ['task-detail', taskId] })\n },\n onError: (err: Error) => {\n Message.error(`标记失败:${err.message}`)\n },\n })\n\n const rerunMut = useMutation({\n mutationFn: () => rerunTask({ taskId }),\n onSuccess: (data) => {\n setRerunPayload(data)\n },\n onError: (err: Error) => {\n Message.error(`Re-run 取 prompt 失败:${err.message}`)\n },\n })\n\n const handleAbandon = async () => {\n const ok = await confirm({\n title: '标记任务为 abandoned',\n message: '此操作会把该任务的 outcome 置为 abandoned。可以稍后再点击 Re-run 用同意图重跑。是否继续?',\n confirmText: '标记 abandoned',\n variant: 'warning',\n })\n if (ok) abandonMut.mutate(undefined)\n }\n\n const handleCopyPrompt = async () => {\n if (!rerunPayload?.prompt) return\n try {\n await navigator.clipboard.writeText(rerunPayload.prompt)\n Message.success('已复制到剪贴板')\n } catch {\n Message.warning('复制失败(请手动选取文本)')\n }\n }\n\n return (\n <>\n <div\n data-testid=\"action-rail\"\n style={{\n display: 'flex', flexWrap: 'wrap', gap: 8, padding: '10px 14px',\n border: '1px dashed var(--color-border-2)',\n borderRadius: 4, marginTop: 4, marginBottom: 16,\n background: 'var(--color-bg-1)',\n }}\n >\n <Tooltip content={approvable ? '把待审 spec 标记为 approved(不重启 daemon)' : '该任务没有 pending spec'}>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<IconCheckCircle />}\n disabled={!approvable || approveMut.isPending}\n loading={approveMut.isPending}\n onClick={() => approveMut.mutate()}\n data-testid=\"action-approve-spec\"\n >\n Approve spec{pendingSpecs.length > 0 && ` (${pendingSpecs.filter(s => s.status === 'generated').length})`}\n </Button>\n </Tooltip>\n\n <Tooltip content={isFinalised ? '该任务已是 abandoned' : '把任务标记为 abandoned(不影响已写文件)'}>\n <Button\n status=\"warning\"\n size=\"small\"\n icon={<IconCloseCircle />}\n disabled={isFinalised || abandonMut.isPending}\n loading={abandonMut.isPending}\n onClick={handleAbandon}\n data-testid=\"action-mark-abandoned\"\n >\n 标记 abandoned\n </Button>\n </Tooltip>\n\n <Tooltip content='打开原 prompt 文本,复制后粘贴到 Claude Code 继续'>\n <Button\n size=\"small\"\n icon={<IconRefresh />}\n loading={rerunMut.isPending}\n onClick={() => rerunMut.mutate()}\n data-testid=\"action-rerun\"\n >\n Re-run (复制原 prompt)\n </Button>\n </Tooltip>\n\n <Tooltip content='MVP 后续(需要 cross-task 相似性查询)'>\n <Button\n size=\"small\"\n icon={<IconDashboard />}\n disabled\n data-testid=\"action-compare\"\n >\n 对比上周同类任务\n </Button>\n </Tooltip>\n </div>\n\n <Modal\n title='Re-run — 复制原 prompt'\n visible={!!rerunPayload}\n onCancel={() => setRerunPayload(null)}\n footer={\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>\n <Button onClick={() => setRerunPayload(null)} size=\"small\">完成</Button>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<IconCopy />}\n onClick={handleCopyPrompt}\n disabled={!rerunPayload?.prompt}\n >\n 复制到剪贴板\n </Button>\n </div>\n }\n style={{ width: 720 }}\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {rerunPayload?.workflow_type && (\n <div style={{ fontSize: 12 }}>\n <Typography.Text type=\"secondary\">workflow_type:</Typography.Text>{' '}\n <Typography.Text code>{rerunPayload.workflow_type}</Typography.Text>\n {rerunPayload.suggested_agent && (\n <>\n {' '}<Typography.Text type=\"secondary\">→</Typography.Text>{' '}\n <Typography.Text code>{rerunPayload.suggested_agent}</Typography.Text>\n </>\n )}\n </div>\n )}\n {rerunPayload?.prompt ? (\n <pre\n data-testid=\"rerun-prompt-text\"\n style={{\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: 12, lineHeight: 1.55,\n background: 'var(--color-fill-1)',\n border: '1px solid var(--color-border-2)',\n borderRadius: 4, padding: 12,\n maxHeight: 360, overflowY: 'auto',\n whiteSpace: 'pre-wrap', wordBreak: 'break-word', margin: 0,\n }}\n >\n {rerunPayload.prompt}\n </pre>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 该任务没有可恢复的原 prompt(events 表未记录 UserPromptSubmit)。\n </Typography.Text>\n )}\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n MVP 工作流:复制后回到 Claude Code 中粘贴提交。后续会有 daemon-driven spawn-same-agent 模式。\n </Typography.Text>\n </div>\n </Modal>\n </>\n )\n}\n","/**\n * TrivialCard — v6 single-line collapse for tasks where daemon never intervened.\n *\n * Spec ref: docs/design/2026-05-29/1750-ai-summary-v6-timeline-ui-spec.md § B1-2.\n * Renders when helpers.isTrivialPath(summary) === true. Replaces the 4-card\n * Tier framework's \"satellite of 未触发 placeholders\" for the ≥70% of tasks\n * where the user's prompt was a 5-char \"提交并推送\" -style request.\n *\n * Layout (草图 1 / 草图 2 in spec 附录):\n * ┌─────────────────────────────────────────────────────────────────┐\n * │ ✓ \"prompt\" · N commits · Xm · daemon 未介入 [展开] │\n * └─────────────────────────────────────────────────────────────────┘\n * Expanded:\n * ┌─────────────────────────────────────────────────────────────────┐\n * │ ✓ \"prompt\" · N commits · Xm · daemon 未介入 [收起] │\n * │ 时间 17:30:42 │\n * │ Task 8c807879 │\n * │ Commit a66fbbfc │\n * │ [Re-run] [查看 timeline]│\n * └─────────────────────────────────────────────────────────────────┘\n */\nimport { useState } from 'react'\nimport Card from '@arco-design/web-react/es/Card'\nimport Button from '@arco-design/web-react/es/Button'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Message from '@arco-design/web-react/es/Message'\nimport Modal from '@arco-design/web-react/es/Modal'\nimport {\n IconCheckCircle,\n IconDown,\n IconUp,\n IconRefresh,\n IconCopy,\n} from '@arco-design/web-react/icon'\nimport { useMutation } from '@tanstack/react-query'\nimport { rerunTask, type RerunResponse } from '../../utils/taskActions'\nimport { parseUTC } from '../../utils/time'\nimport { format } from 'date-fns'\nimport type { DecisionSummary, TaskDetailData } from './types'\n\ninterface Props {\n data: TaskDetailData\n summary: DecisionSummary\n}\n\nfunction formatDuration(start: string, end?: string): string {\n const startMs = parseUTC(start).getTime()\n const endMs = end ? parseUTC(end).getTime() : Date.now()\n const secs = Math.max(0, Math.round((endMs - startMs) / 1000))\n if (secs < 60) return `${secs}s`\n if (secs < 3600) return `${Math.floor(secs / 60)}m${secs % 60}s`\n return `${Math.floor(secs / 3600)}h${Math.floor((secs % 3600) / 60)}m`\n}\n\nfunction promptSnip(s: string | null, max: number = 32): string {\n if (!s) return '(无 prompt)'\n const flat = s.replace(/\\n/g, ' ').trim()\n return flat.length > max ? flat.slice(0, max) + '…' : flat\n}\n\nexport default function TrivialCard({ data, summary }: Props) {\n const [open, setOpen] = useState(false)\n const [rerunPayload, setRerunPayload] = useState<RerunResponse | null>(null)\n\n const commitCount = summary.outcome?.commit_count ?? summary.commits.length\n const duration = formatDuration(data.start_time, data.end_time)\n const prompt = promptSnip(summary.prompt)\n\n const rerunMut = useMutation({\n mutationFn: () => rerunTask({ taskId: data.id }),\n onSuccess: (payload) => setRerunPayload(payload),\n onError: (err: Error) => Message.error(`Re-run 取 prompt 失败:${err.message}`),\n })\n\n const handleCopyPrompt = async () => {\n if (!rerunPayload?.prompt) return\n try {\n await navigator.clipboard.writeText(rerunPayload.prompt)\n Message.success('已复制到剪贴板')\n } catch {\n Message.warning('复制失败(请手动选取文本)')\n }\n }\n\n return (\n <Card\n bordered\n style={{ marginBottom: 16, background: 'var(--cf-kpi-wash-blue, #F2F9FF)' }}\n data-testid=\"trivial-card\"\n >\n {/* Single-line header — always visible */}\n <div\n style={{\n display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap',\n cursor: 'pointer',\n }}\n onClick={() => setOpen(o => !o)}\n data-testid=\"trivial-card-header\"\n >\n <IconCheckCircle style={{ color: 'var(--cf-tag-green, #00B42A)', fontSize: 16 }} />\n <Typography.Text style={{ fontSize: 13, fontWeight: 500 }}>\n “{prompt}”\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>·</Typography.Text>\n <Typography.Text style={{ fontSize: 12 }}>\n {commitCount} commit{commitCount === 1 ? '' : 's'}\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>·</Typography.Text>\n <Typography.Text style={{ fontSize: 12 }}>{duration}</Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>·</Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n daemon 未介入\n </Typography.Text>\n <span style={{ flex: 1 }} />\n <Button\n size=\"mini\"\n type=\"text\"\n icon={open ? <IconUp /> : <IconDown />}\n onClick={(e) => { e.stopPropagation(); setOpen(o => !o) }}\n data-testid=\"trivial-card-toggle\"\n >\n {open ? '收起' : '展开'}\n </Button>\n </div>\n\n {open && (\n <div\n style={{\n marginTop: 12, paddingTop: 12,\n borderTop: '1px solid var(--color-border-2)',\n display: 'flex', flexDirection: 'column', gap: 6,\n }}\n data-testid=\"trivial-card-detail\"\n >\n <div style={{ display: 'flex', gap: 12, fontSize: 12, flexWrap: 'wrap' }}>\n <Typography.Text type=\"secondary\">时间</Typography.Text>\n <Typography.Text code>\n {format(parseUTC(data.start_time), 'yyyy-MM-dd HH:mm:ss')}\n </Typography.Text>\n </div>\n <div style={{ display: 'flex', gap: 12, fontSize: 12, flexWrap: 'wrap' }}>\n <Typography.Text type=\"secondary\">Task ID</Typography.Text>\n <Typography.Text code>{data.id.slice(0, 12)}</Typography.Text>\n </div>\n {summary.commits.length > 0 && (\n <div style={{ display: 'flex', gap: 12, fontSize: 12, flexWrap: 'wrap' }}>\n <Typography.Text type=\"secondary\">Commit</Typography.Text>\n <Typography.Text code>{summary.commits.join(', ')}</Typography.Text>\n </div>\n )}\n <div style={{ display: 'flex', gap: 8, marginTop: 4 }}>\n <Button\n size=\"small\"\n icon={<IconRefresh />}\n loading={rerunMut.isPending}\n onClick={() => rerunMut.mutate()}\n data-testid=\"trivial-card-rerun\"\n >\n Re-run\n </Button>\n </div>\n </div>\n )}\n\n {/* Re-run modal — reuses ActionRail's RerunResponse shape so the daemon\n contract stays single-source. */}\n <Modal\n title='Re-run — 复制原 prompt'\n visible={!!rerunPayload}\n onCancel={() => setRerunPayload(null)}\n footer={\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>\n <Button onClick={() => setRerunPayload(null)} size=\"small\">完成</Button>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<IconCopy />}\n onClick={handleCopyPrompt}\n disabled={!rerunPayload?.prompt}\n >\n 复制到剪贴板\n </Button>\n </div>\n }\n style={{ width: 720 }}\n >\n {rerunPayload?.prompt ? (\n <pre\n style={{\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: 12, lineHeight: 1.55,\n background: 'var(--color-fill-1)',\n border: '1px solid var(--color-border-2)',\n borderRadius: 4, padding: 12,\n maxHeight: 360, overflowY: 'auto',\n whiteSpace: 'pre-wrap', wordBreak: 'break-word', margin: 0,\n }}\n >\n {rerunPayload.prompt}\n </pre>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 该任务没有可恢复的原 prompt(events 表未记录 UserPromptSubmit)。\n </Typography.Text>\n )}\n </Modal>\n </Card>\n )\n}\n","/**\n * DebugDrawer — v6 Batch 2 advanced debug drawer for task detail.\n *\n * Spec ref: docs/design/2026-05-29/1750-ai-summary-v6-timeline-ui-spec.md\n * § B2-3 + decision OQ Q3.\n *\n * Purpose: hide intent_engine / auto_spec_gen / trivial_filter / raw\n * routing/intercept rows from the main timeline view (painpoint C — users\n * found \"完整 prompt 5388 chars · 输出预览 5866 chars · 期间产物 0 文件\"\n * too engineering-flavoured). DebugDrawer surfaces them only when the user\n * explicitly opens it (\"仅故障排查时使用\").\n *\n * Sections (4):\n * 1. intent_engine 输出 (kind / complexity / raw JSON)\n * 2. config flags placeholder (auto_spec_gen / dedup_guard / active_pending)\n * 3. trivial_filter 决策 (isTrivialPath input/output)\n * 4. 原始事件 (raw timeline events + agent_spawn long prompt/output)\n *\n * Anything we'd otherwise have to surface in the timeline event itself can\n * live here — the contract is \"user can ignore the gear icon and miss nothing\n * about what happened, only about how it happened internally\".\n */\nimport Drawer from '@arco-design/web-react/es/Drawer'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Divider from '@arco-design/web-react/es/Divider'\nimport { isTrivialPath, summarizeDecisions } from './helpers'\nimport type { TaskDetailData } from './types'\nimport type { TimelineResponse } from './TaskTimelineView'\n\ninterface Props {\n data: TaskDetailData\n timeline: TimelineResponse | null\n visible: boolean\n onClose: () => void\n}\n\nconst preStyle: React.CSSProperties = {\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n fontSize: 11,\n lineHeight: 1.55,\n color: 'var(--color-text-2)',\n background: 'var(--color-fill-1)',\n border: '1px solid var(--color-border-2)',\n borderRadius: 4,\n padding: 10,\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n maxHeight: 240,\n overflowY: 'auto',\n}\n\nfunction Section({\n title,\n children,\n testId,\n}: {\n title: string\n children: React.ReactNode\n testId: string\n}) {\n return (\n <div data-testid={testId} style={{ marginBottom: 16 }}>\n <Typography.Text\n style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 6 }}\n >\n {title}\n </Typography.Text>\n {children}\n </div>\n )\n}\n\nexport default function DebugDrawer({ data, timeline, visible, onClose }: Props) {\n const summary = summarizeDecisions(data)\n const isTrivial = isTrivialPath(summary)\n\n const intentInj = data.injections.find((i) => i.source_handler.includes(':intent'))\n let intentMeta: Record<string, unknown> | null = null\n try {\n intentMeta = intentInj?.metadata_json ? JSON.parse(intentInj.metadata_json) : null\n } catch {\n intentMeta = null\n }\n\n return (\n <Drawer\n visible={visible}\n onCancel={onClose}\n onOk={onClose}\n title=\"高级调试信息(仅故障排查时使用)\"\n width={560}\n placement=\"right\"\n data-testid=\"debug-drawer\"\n footer={null}\n >\n {/* §1 intent_engine 输出 */}\n <Section title=\"① intent_engine 输出\" testId=\"debug-section-intent\">\n {intentMeta ? (\n <>\n <div style={{ display: 'flex', gap: 6, marginBottom: 6, flexWrap: 'wrap' }}>\n {typeof intentMeta.workflow_type === 'string' && (\n <Tag size=\"small\" color=\"arcoblue\">\n workflow_type={intentMeta.workflow_type}\n </Tag>\n )}\n {typeof intentMeta.confidence === 'number' && (\n <Tag size=\"small\" color=\"gray\">\n conf={intentMeta.confidence.toFixed(2)}\n </Tag>\n )}\n {typeof intentMeta.layer === 'string' && (\n <Tag size=\"small\" color=\"gray\">\n layer={intentMeta.layer}\n </Tag>\n )}\n {typeof intentMeta.suggested_agent === 'string' && (\n <Tag size=\"small\" color=\"purple\">\n agent={intentMeta.suggested_agent}\n </Tag>\n )}\n </div>\n <pre style={preStyle}>{JSON.stringify(intentMeta, null, 2)}</pre>\n </>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 未触发 intent injection\n </Typography.Text>\n )}\n </Section>\n\n <Divider style={{ margin: '12px 0' }} />\n\n {/* §2 config flags (placeholder — config-store wire-up is future work) */}\n <Section title=\"② daemon config flags(最新值)\" testId=\"debug-section-config\">\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n 下列标志通过 daemon `config-store` 控制(实时值需后端补 endpoint;\n 目前显示最近一次注入的快照):\n </Typography.Text>\n <pre style={preStyle}>\n {JSON.stringify(\n {\n 'auto_spec_generation.enabled': '(see /api/health for live value)',\n 'dedup_guard.enabled': '(see /api/health for live value)',\n 'active_pending.window_min': '(see /api/health for live value)',\n 'feedback_loop.enabled': '(see /api/health for live value)',\n },\n null,\n 2,\n )}\n </pre>\n </Section>\n\n <Divider style={{ margin: '12px 0' }} />\n\n {/* §3 trivial filter 决策 */}\n <Section title=\"③ trivial_filter 决策\" testId=\"debug-section-trivial\">\n <div style={{ display: 'flex', gap: 6, marginBottom: 6, flexWrap: 'wrap' }}>\n <Tag size=\"small\" color={isTrivial ? 'green' : 'orange'}>\n isTrivialPath={String(isTrivial)}\n </Tag>\n </div>\n <pre style={preStyle}>\n {JSON.stringify(\n {\n intentEmpty: !summary.intent && summary.kbHits.length === 0,\n decisionEmpty:\n summary.specs.length === 0 &&\n summary.skills.length === 0,\n executionEmpty: summary.spawned.length === 0 && summary.filesChanged === 0,\n counters: {\n specs: summary.specs.length,\n skills: summary.skills.length,\n spawned: summary.spawned.length,\n filesChanged: summary.filesChanged,\n kbHits: summary.kbHits.length,\n commits: summary.commits.length,\n },\n },\n null,\n 2,\n )}\n </pre>\n </Section>\n\n <Divider style={{ margin: '12px 0' }} />\n\n {/* §4 raw timeline + raw spawn full prompts */}\n <Section title=\"④ 原始事件(timeline 端点返回)\" testId=\"debug-section-raw\">\n {timeline ? (\n <>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n events: {timeline.events.length} · artifacts: spec=\n {timeline.artifacts.spec.length} archive={timeline.artifacts.archive.length}{' '}\n changelog={timeline.artifacts.changelog.length} template=\n {timeline.artifacts.template.length} code={timeline.artifacts.code.length}\n </Typography.Text>\n <pre style={preStyle}>{JSON.stringify(timeline, null, 2)}</pre>\n </>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n timeline 端点未返回(loading 或 error)\n </Typography.Text>\n )}\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 11, display: 'block', marginTop: 8 }}\n >\n {data.agentSpawns.length > 0\n ? `agent_spawn 共 ${data.agentSpawns.length} 个,prompt/output 全文见 task detail JSON: GET /api/tasks/${data.id}`\n : '无 agent spawn'}\n </Typography.Text>\n </Section>\n\n <Divider style={{ margin: '12px 0' }} />\n\n {/* §5 daemon injections (Polish-5 2026-05-29): hook additionalContext /\n systemMessage payloads. Moved here from TaskDetailContent 区域 3 —\n the bottom-of-page \"注入内容\" card duplicated information that\n power-users wanted in a debug surface, not the main flow. */}\n <Section title=\"⑤ daemon 注入(additionalContext / systemMessage)\" testId=\"debug-section-injections\">\n {data.injections.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 本任务无注入事件\n </Typography.Text>\n ) : (\n <>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginBottom: 6 }}>\n 共 {data.injections.length} 条注入\n </Typography.Text>\n {data.injections.map((inj) => (\n <div key={inj.id} style={{ marginBottom: 8 }}>\n <div style={{ display: 'flex', gap: 6, alignItems: 'center', marginBottom: 4, flexWrap: 'wrap' }}>\n <Tag size=\"small\" color={inj.injection_type === 'systemMessage' ? 'arcoblue' : 'orange'}>\n {inj.injection_type}\n </Tag>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n {inj.source_handler}\n </Typography.Text>\n </div>\n <pre style={preStyle}>{inj.content}</pre>\n </div>\n ))}\n </>\n )}\n </Section>\n </Drawer>\n )\n}\n","/**\n * TaskTimelineView — v6 Batch 2 chronological task detail.\n *\n * Spec ref: docs/design/2026-05-29/1750-ai-summary-v6-timeline-ui-spec.md\n * § B2-2 + 附录 ASCII 草图 3 (timeline view).\n *\n * Replaces the v5 4-card Tier framework for non-trivial tasks (TierContainer\n * dispatches based on isTrivialPath; see § B2-5). Fetches from the new\n * GET /api/tasks/:id/timeline endpoint (§ B2-1), renders chronologically\n * with event icon kinds:\n *\n * 👤 user_prompt (gray)\n * 🚫 daemon_enforce (red)\n * 🤝 agent_spawn (blue)\n * 💾 commit (green)\n * ✅ decision_resolved (green)\n *\n * ('daemon_hint' retired 2026-06-10 — decision fe6f98cd.)\n *\n * Bottom panel: 产物总览 table classifies file artifacts into spec / archive /\n * changelog / template / code buckets (painpoint D — list was buried at the\n * very bottom of v5 SystemDecisionCard).\n *\n * Fallback: on fetch error the parent (TierContainer) keeps a 4-card render\n * path so the page is never empty.\n */\nimport { useState } from 'react'\nimport { Link } from 'react-router-dom'\nimport { useQuery } from '@tanstack/react-query'\nimport Card from '@arco-design/web-react/es/Card'\nimport Button from '@arco-design/web-react/es/Button'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Table from '@arco-design/web-react/es/Table'\nimport { IconRobot, IconSettings } from '@arco-design/web-react/icon'\nimport { format } from 'date-fns'\nimport { parseUTC } from '../../utils/time'\nimport { reasonLabel, extractDecisionIds } from './helpers'\nimport DebugDrawer from './DebugDrawer'\nimport type { TaskDetailData } from './types'\n\n// ── Shared types (mirror src/web/routes/task-timeline.ts) ───────────────────\n\nexport type TimelineEvent =\n | { kind: 'user_prompt'; at: string; text: string; event_id?: string }\n | {\n kind: 'daemon_enforce'\n at: string\n rule_id: string\n tool: string\n decision: 'deny' | 'warn' | 'bypass' | 'dry_run'\n hint: string | null\n }\n | {\n kind: 'agent_spawn'\n at: string\n subagent_type: string | null\n name: string | null\n duration_ms: number | null\n /** Polish-1 (2026-05-29): how duration_ms was derived. */\n duration_source?: 'paired' | 'task_end' | 'unknown'\n prompt_preview: string\n prompt_length: number\n output_preview: string\n output_length: number\n }\n | {\n kind: 'commit'\n at: string\n hash: string\n message_preview: string\n /** 完整 commit message(additive,decision 638e2ebd);inline 行只用 preview。 */\n message_full?: string\n message_truncated?: boolean\n }\n | {\n kind: 'decision_resolved'\n at: string\n decision_id: string\n status: 'pending' | 'resolved' | 'bypassed' | 'expired'\n }\n\nexport interface TimelineResponse {\n task_id: string\n events: TimelineEvent[]\n artifacts: {\n spec: string[]\n archive: string[]\n changelog: string[]\n template: string[]\n code: string[]\n }\n}\n\ninterface Props {\n data: TaskDetailData\n}\n\nasync function fetchTimeline(taskId: string): Promise<TimelineResponse> {\n const res = await fetch(`/api/tasks/${encodeURIComponent(taskId)}/timeline`)\n if (!res.ok) throw new Error(`timeline HTTP ${res.status}`)\n return res.json()\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction formatTime(at: string): string {\n try {\n return format(parseUTC(at), 'HH:mm:ss')\n } catch {\n return at.slice(11, 19)\n }\n}\n\nfunction formatDuration(ms: number | null, source?: 'paired' | 'task_end' | 'unknown'): string {\n // Polish-1 (2026-05-29):\n // - unknown / null → \"未知\"\n // - task_end fallback → \"进行中 (≈Xm)\" (agent likely still running, Post lost)\n // - paired → exact \"Xms\" / \"Xs\" / \"XmYs\"\n if (ms === null || ms < 0) {\n if (source === 'task_end') return '进行中'\n return '未知'\n }\n // Same-tick 0ms with task_end fallback would still display oddly — guard.\n if (ms === 0 && source !== 'paired') return '未知'\n const label = (() => {\n if (ms < 1000) return `${ms}ms`\n const s = Math.round(ms / 1000)\n if (s < 60) return `${s}s`\n return `${Math.floor(s / 60)}m${s % 60}s`\n })()\n if (source === 'task_end') return `进行中 (≈${label})`\n return label\n}\n\n// Polish-3 (2026-05-29): explicit emoji font stack so 🤝 doesn't get rendered\n// with a glyph fallback that resembles 🥋 on some Linux/CJK font cascades.\nconst EMOJI_FONT_STACK =\n '\"Apple Color Emoji\", \"Segoe UI Emoji\", \"Noto Color Emoji\", \"Twemoji Mozilla\", sans-serif'\n\n// Icon + color per kind\nconst KIND_META: Record<\n TimelineEvent['kind'],\n { icon: string; color: string; label: string }\n> = {\n user_prompt: { icon: '👤', color: 'gray', label: '用户' },\n daemon_enforce: { icon: '🚫', color: 'red', label: 'daemon 拦截' },\n agent_spawn: { icon: '🤝', color: 'arcoblue', label: 'agent spawn' },\n commit: { icon: '💾', color: 'green', label: 'commit' },\n decision_resolved: { icon: '✅', color: 'green', label: '决策闭环' },\n}\n\n// ── Single event row ────────────────────────────────────────────────────────\n\nfunction TimelineRow({ ev }: { ev: TimelineEvent }) {\n const meta = KIND_META[ev.kind]\n return (\n <div\n data-testid={`timeline-event-${ev.kind}`}\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: 12,\n padding: '8px 4px',\n borderBottom: '1px solid var(--color-border-2)',\n }}\n >\n <Typography.Text\n code\n type=\"secondary\"\n style={{\n fontSize: 11,\n minWidth: 70,\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n }}\n >\n {formatTime(ev.at)}\n </Typography.Text>\n <span\n style={{\n fontSize: 14,\n minWidth: 24,\n fontFamily: EMOJI_FONT_STACK,\n fontVariantEmoji: 'emoji',\n } as React.CSSProperties}\n >\n {meta.icon}\n </span>\n <div style={{ flex: 1, minWidth: 0 }}>\n <EventBody ev={ev} />\n </div>\n </div>\n )\n}\n\nfunction EventBody({ ev }: { ev: TimelineEvent }) {\n switch (ev.kind) {\n case 'user_prompt':\n return (\n <div>\n <Typography.Text style={{ fontSize: 12, fontWeight: 500 }}>用户</Typography.Text>\n <Typography.Paragraph\n style={{ fontSize: 12, color: 'var(--color-text-2)', margin: '4px 0 0', whiteSpace: 'pre-wrap' }}\n ellipsis={{ rows: 3, expandable: true }}\n >\n \"{ev.text}\"\n </Typography.Paragraph>\n </div>\n )\n case 'daemon_enforce':\n return (\n <div>\n <div style={{ display: 'flex', gap: 6, alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography.Text style={{ fontSize: 12, fontWeight: 500 }}>\n {ev.decision === 'deny' ? 'daemon 拒绝' : 'daemon 警告'} {ev.tool}\n </Typography.Text>\n <Tag size=\"small\" color={ev.decision === 'deny' ? 'red' : 'orange'}>\n {reasonLabel(ev.rule_id)}\n </Tag>\n </div>\n {ev.hint && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginTop: 2 }}>\n {ev.hint.slice(0, 200)}\n </Typography.Text>\n )}\n </div>\n )\n case 'agent_spawn': {\n // Polish-2 (2026-05-29): pull `<!-- decision-id: XXXX -->` magic out of\n // the prompt preview into a separate clickable tag, so the literal\n // comment doesn't get truncated mid-comment in the 500-char preview.\n const { ids: decisionIds, cleanedPrompt } = extractDecisionIds(ev.prompt_preview)\n return (\n <div>\n <div style={{ display: 'flex', gap: 6, alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography.Text style={{ fontSize: 12, fontWeight: 500 }}>\n 主线程 spawn {ev.subagent_type ?? '?'}\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n ({formatDuration(ev.duration_ms, ev.duration_source)})\n </Typography.Text>\n {decisionIds.map((id) => (\n <Link\n key={id}\n to={`/decisions/${id}`}\n style={{ textDecoration: 'none' }}\n title={`查看决策 ${id}`}\n >\n <Tag size=\"small\" color=\"purple\" style={{ cursor: 'pointer' }}>\n <span style={{ fontFamily: EMOJI_FONT_STACK } as React.CSSProperties}>📋</span>{' '}\n 决策 {id.slice(0, 8)}\n </Tag>\n </Link>\n ))}\n </div>\n <div style={{ marginTop: 4, marginLeft: 12, fontSize: 11, color: 'var(--color-text-3)' }}>\n <span>└─ </span>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n prompt {ev.prompt_length} chars · output {ev.output_length} chars\n </Typography.Text>\n </div>\n {cleanedPrompt && (\n <Typography.Paragraph\n style={{\n fontSize: 11,\n color: 'var(--color-text-3)',\n margin: '4px 0 0 24px',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',\n whiteSpace: 'pre-wrap',\n }}\n ellipsis={{ rows: 2, expandable: true }}\n >\n {cleanedPrompt}\n </Typography.Paragraph>\n )}\n </div>\n )\n }\n case 'commit':\n return (\n <div>\n <div style={{ display: 'flex', gap: 6, alignItems: 'center', flexWrap: 'wrap' }}>\n <Typography.Text style={{ fontSize: 12, fontWeight: 500 }}>提交</Typography.Text>\n <Typography.Text code style={{ fontSize: 11, color: 'var(--cf-tag-green)' }}>\n {ev.hash}\n </Typography.Text>\n </div>\n {ev.message_preview && (\n <Typography.Text style={{ fontSize: 11, display: 'block', marginTop: 2 }}>\n {ev.message_preview}\n </Typography.Text>\n )}\n </div>\n )\n case 'decision_resolved':\n return (\n <div>\n <Typography.Text style={{ fontSize: 12, fontWeight: 500 }}>\n 决策闭环{' '}\n <Typography.Text code style={{ fontSize: 11 }}>\n {ev.decision_id}\n </Typography.Text>\n </Typography.Text>\n </div>\n )\n default:\n return null\n }\n}\n\n// ── Artifacts table ─────────────────────────────────────────────────────────\n\nfunction ArtifactsTable({ artifacts }: { artifacts: TimelineResponse['artifacts'] }) {\n // Polish-4 (2026-05-29): drop empty rows entirely instead of \"0 -\" lines\n // that read as broken. If every bucket is empty, render a soft empty state.\n const rows = (Object.keys(artifacts) as Array<keyof TimelineResponse['artifacts']>)\n .map((key) => ({\n key,\n label:\n key === 'spec'\n ? '📄 spec'\n : key === 'archive'\n ? '📦 归档'\n : key === 'changelog'\n ? '📝 changelog'\n : key === 'template'\n ? '🧱 模板'\n : '⚙ 代码',\n count: artifacts[key].length,\n example: artifacts[key][0] ?? '-',\n }))\n .filter((r) => r.count > 0)\n\n return (\n <div data-testid=\"artifacts-table\" style={{ marginTop: 16 }}>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, display: 'block', marginBottom: 6 }}>\n 产物总览\n </Typography.Text>\n {rows.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n (本任务无产物)\n </Typography.Text>\n ) : (\n <Table\n size=\"small\"\n pagination={false}\n data={rows}\n columns={[\n { title: '类型', dataIndex: 'label', width: 120 },\n { title: '数量', dataIndex: 'count', width: 80 },\n {\n title: '示例路径',\n dataIndex: 'example',\n render: (val: string) => (\n <Typography.Text code style={{ fontSize: 11, wordBreak: 'break-all' }}>\n {val}\n </Typography.Text>\n ),\n },\n ]}\n />\n )}\n </div>\n )\n}\n\n// ── Main view ───────────────────────────────────────────────────────────────\n\nexport default function TaskTimelineView({ data }: Props) {\n const [debugOpen, setDebugOpen] = useState(false)\n\n const { data: timeline, isLoading, isError } = useQuery({\n queryKey: ['task-timeline', data.id],\n queryFn: () => fetchTimeline(data.id),\n staleTime: 30_000,\n retry: 1,\n })\n\n if (isError) {\n // Caller (TierContainer) will fall back to 4-card view when this component\n // throws. Render nothing here — TierContainer's catch path handles UI.\n throw new Error('timeline fetch failed')\n }\n\n return (\n <Card\n bordered\n style={{ marginBottom: 16, background: 'var(--cf-kpi-wash-blue, #F2F9FF)' }}\n data-testid=\"task-timeline-view\"\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 8,\n }}\n >\n <Typography.Text\n style={{\n fontSize: 13,\n fontWeight: 600,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <IconRobot style={{ color: 'var(--cf-tag-blue)' }} />\n 任务详情 · 时间线\n </Typography.Text>\n <Button\n size=\"mini\"\n type=\"text\"\n icon={<IconSettings />}\n onClick={() => setDebugOpen(true)}\n data-testid=\"debug-drawer-toggle\"\n title=\"高级调试信息(仅故障排查时使用)\"\n >\n 调试\n </Button>\n </div>\n\n {isLoading && (\n <div data-testid=\"task-timeline-loading\">\n <Skeleton animation text={{ rows: 6 }} />\n </div>\n )}\n\n {timeline && (\n <>\n <div data-testid=\"task-timeline-events\">\n {timeline.events.length === 0 ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n (时间线无事件)\n </Typography.Text>\n ) : (\n timeline.events.map((ev, i) => <TimelineRow key={`${ev.at}-${ev.kind}-${i}`} ev={ev} />)\n )}\n </div>\n <ArtifactsTable artifacts={timeline.artifacts} />\n </>\n )}\n\n <DebugDrawer\n data={data}\n timeline={timeline ?? null}\n visible={debugOpen}\n onClose={() => setDebugOpen(false)}\n />\n </Card>\n )\n}\n","/**\n * Shared types for the task-detail view (v6 2026-05-29, was \"AI 决策摘要 v5\").\n *\n * Re-exports the v4 data shapes from TaskDetailContent so card components can\n * be authored in isolation without circular imports. Wire keeps the shape\n * unchanged — see backend src/web/routes/tasks.ts GET /api/tasks/:taskId.\n */\n\nexport interface Injection {\n id: string\n injection_type: 'systemMessage' | 'additionalContext'\n source_handler: string\n content: string\n timestamp: string\n metadata_json?: string | null\n}\n\nexport interface TimelineEvent {\n id: string\n timestamp: string\n /** 'tool' for Pre/PostToolUse entries, 'notification' for Notification. */\n kind: 'tool' | 'notification'\n tool_name: string | null\n hook_type: string\n input: unknown\n output: unknown\n is_agent_call: boolean\n agent_detail?: {\n subagent_type?: string\n name?: string\n prompt?: string\n /** Enriched from the matching agentSpawn (spec 1520-followup). */\n status?: 'completed' | 'running'\n /** Files Edit/Write'd inside this agent's spawn window. */\n changed_files?: string[]\n description?: string\n }\n /** Present only when kind==='notification' (decision 24cce083). */\n notification?: {\n message: string | null\n notification_type: string | null\n }\n}\n\nexport interface SkillInvocation {\n id: string\n skill_id: string\n reason: string\n workflow?: string\n phase?: string\n timestamp: string\n}\n\nexport interface UserPrompt {\n timestamp: string\n content: string\n}\n\nexport interface PendingSpec {\n id: number\n token: string\n status: 'generated' | 'approved' | 'modified' | 'skipped' | 'expired'\n spec_path: string\n created_at: string\n approved_at: string | null\n expires_at: string\n intent: { workflow_type?: string; suggested_agent?: string; confidence?: number } | null\n}\n\nexport interface AgentSpawn {\n timestamp: string\n end_timestamp: string | null\n subagent_type: string | null\n name: string | null\n description: string | null\n prompt: string | null\n prompt_length: number\n output: string | null\n output_length: number\n status: 'completed' | 'running'\n /** Files Edit/Write'd inside this spawn's [timestamp, end_timestamp] window. */\n changed_files: string[]\n /**\n * 1 = 严格归属本任务(task_events 臂);0 = 时间窗兜底(session+window 臂,疑似\n * 邻接任务 / 漏 link 孤儿)。由 src/web/routes/tasks.ts 透传。旧响应缺字段时按 1 处理。\n */\n linked?: 0 | 1\n}\n\nexport type TaskOutcome = 'success' | 'partial' | 'failed' | 'abandoned'\n\n/**\n * Agent 主动 pull 的 KB(decision 93b3075b)—— /api/tasks/:id additive 字段\n * kbPulls[]。该任务执行窗内 agent 真实拉取的 KB page(reason `<wf>/kb-precedent`,\n * usefulness 为 pull 后自评)。旧后端缺此字段 → 前端优雅显「无主动 pull」。\n */\nexport interface TaskKbPull {\n /** KB page/topic(query 列明文,NOT gzip)。 */\n page: string\n /** verbatim reason,形如 `safetynet/kb-precedent`。 */\n reason: string | null\n workflow: string | null\n phase: string | null\n /** pull 后自评:'helped' | 'partial' | 'not-actionable';未评 → null。 */\n usefulness: string | null\n usefulness_note: string | null\n result_count: number\n /** epoch ms。 */\n ts: number\n}\n\nexport interface TaskDetailData {\n id: string\n title: string\n status: 'active' | 'completed' | 'abandoned'\n start_time: string\n end_time?: string\n event_count: number\n session_id: string\n outcome?: TaskOutcome | null\n outcome_reason?: string | null\n commit_count?: number | null\n reverted_commits?: number | null\n user_violation_count?: number | null\n userPrompts: UserPrompt[]\n injections: Injection[]\n timeline: TimelineEvent[]\n skillInvocations: SkillInvocation[]\n /** Agent 主动 pull 的 KB(decision 93b3075b)。旧后端缺 → []。 */\n kbPulls: TaskKbPull[]\n artifacts: string[]\n pendingSpecs: PendingSpec[]\n agentSpawns: AgentSpawn[]\n}\n\n/** Card identifiers used by URL ?expand=... and adaptive expansion. */\nexport type TierCard = 'intent' | 'decision' | 'execution' | 'outcome'\n\n/** Decision summary computed from TaskDetailData (subset reused from v4). */\nexport interface DecisionSummary {\n prompt: string | null\n promptTimestamp: string | null\n intent: {\n workflow_type?: string\n confidence?: number\n suggested_agent?: string\n layer?: string\n reasoning?: string\n } | null\n intentInj: Injection | null\n kbHits: Array<{ name: string; score?: number; matched?: string[] }>\n kbInjs: Injection[]\n skills: Array<{ skill_id: string; reason: string }>\n spawned: Array<{ subagent_type?: string; name?: string; promptPreview?: string }>\n filesChanged: number\n fileList: Array<{ path: string; count: number }>\n commits: string[]\n outcome: {\n label: TaskOutcome\n reason?: string | null\n commit_count?: number | null\n } | null\n specs: PendingSpec[]\n}\n\n/** Returns the set of cards to default-expand for an outcome (Q8 spec). */\nexport function defaultExpanded(outcome: TaskOutcome | null | undefined): Set<TierCard> {\n if (!outcome || outcome === 'success') return new Set()\n if (outcome === 'failed' || outcome === 'partial') return new Set(['execution'])\n if (outcome === 'abandoned') return new Set(['outcome'])\n return new Set()\n}\n\n/** Parse ?expand=execution,outcome from URLSearchParams. */\nexport function parseExpandedFromQuery(qs: URLSearchParams): Set<TierCard> {\n const raw = qs.get('expand')\n if (!raw) return new Set()\n const out = new Set<TierCard>()\n for (const part of raw.split(',')) {\n const v = part.trim() as TierCard\n if (v === 'intent' || v === 'decision' || v === 'execution' || v === 'outcome') {\n out.add(v)\n }\n }\n return out\n}\n\n/** Serialize set of cards back into a stable comma-separated string. */\nexport function serializeExpanded(set: Set<TierCard>): string {\n const order: TierCard[] = ['intent', 'decision', 'execution', 'outcome']\n return order.filter(c => set.has(c)).join(',')\n}\n","/**\n * TierContainer — task detail root (v6 2026-05-29, was \"AI 决策摘要 v5\").\n *\n * v6 二态布局 (spec 1750 Batch 1 + Batch 2):\n * - Trivial path (helpers.isTrivialPath === true) → <TrivialCard>\n * - Non-trivial → <TaskTimelineView> (Batch 2)\n * fallback to v5 4-card on TaskTimelineView fetch error so the page is\n * never empty (spec § B2-5).\n *\n * Non-trivial layout:\n * - <TaskTimelineView> v6 timeline (default)\n * - fallback: <TierBanner> + <DecisionCard>×4 + <ActionRail>\n *\n * Expansion state (4-card fallback only):\n * - Initial: defaultExpanded(outcome) ∪ parseExpandedFromQuery(?expand=...)\n * - Toggle: syncs back to URL via useSearchParams (replaces history entry)\n *\n * URL contract: ?expand=intent/decision/execution/outcome still parsed but\n * silently ignored on trivial / timeline paths (decision OQ Q5 user-approved).\n */\nimport { useMemo, useCallback, Component } from 'react'\nimport type { ErrorInfo, ReactNode } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport Card from '@arco-design/web-react/es/Card'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { IconRobot } from '@arco-design/web-react/icon'\n\nimport TierBanner from './TierBanner'\nimport DecisionCard from './DecisionCard'\nimport IntentCard from './IntentCard'\nimport SystemDecisionCard from './SystemDecisionCard'\nimport ExecutionCard from './ExecutionCard'\nimport OutcomeCard from './OutcomeCard'\nimport ActionRail from './ActionRail'\nimport TrivialCard from './TrivialCard'\nimport TaskTimelineView from './TaskTimelineView'\n\nimport {\n computeBanner,\n computeOneLines,\n isTrivialPath,\n summarizeDecisions,\n} from './helpers'\nimport {\n defaultExpanded,\n parseExpandedFromQuery,\n serializeExpanded,\n type TaskDetailData,\n type TierCard,\n} from './types'\n\ninterface Props {\n data: TaskDetailData\n}\n\n/**\n * Tiny ErrorBoundary that swaps in a fallback ReactNode when its child\n * throws. Scoped to TaskTimelineView so a transient `/api/tasks/:id/timeline`\n * outage degrades to the v5 4-card view rather than crashing the page.\n *\n * Spec § B2-5 contract: \"non-trivial 分支从渲染 4-card → 渲染 TaskTimelineView;\n * 保留 v5 4-card 作为 fallback\".\n */\nclass TimelineErrorBoundary extends Component<\n { fallback: ReactNode; children: ReactNode },\n { errored: boolean }\n> {\n state = { errored: false }\n static getDerivedStateFromError(): { errored: boolean } {\n return { errored: true }\n }\n componentDidCatch(error: Error, info: ErrorInfo): void {\n // eslint-disable-next-line no-console\n console.warn('[TaskTimelineView] fallback to 4-card; error:', error.message, info)\n }\n render(): ReactNode {\n if (this.state.errored) return this.props.fallback\n return this.props.children\n }\n}\n\nexport default function TierContainer({ data }: Props) {\n const [searchParams, setSearchParams] = useSearchParams()\n\n // Compute expansion: URL ?expand=... wins; fallback to outcome-based default.\n const expanded: Set<TierCard> = useMemo(() => {\n const fromUrl = parseExpandedFromQuery(searchParams)\n if (fromUrl.size > 0) return fromUrl\n return defaultExpanded(data.outcome)\n }, [searchParams, data.outcome])\n\n const toggle = useCallback((card: TierCard) => {\n const next = new Set(expanded)\n if (next.has(card)) next.delete(card)\n else next.add(card)\n const serialized = serializeExpanded(next)\n const params = new URLSearchParams(searchParams)\n if (serialized) params.set('expand', serialized)\n else params.delete('expand')\n setSearchParams(params, { replace: true })\n }, [expanded, searchParams, setSearchParams])\n\n const summary = useMemo(() => summarizeDecisions(data), [data])\n const banner = useMemo(() => computeBanner(summary, data), [summary, data])\n const oneLines = useMemo(() => computeOneLines(summary, data), [summary, data])\n\n // v6 Batch 1: trivial path → single-line TrivialCard (草图 1/2).\n // Decision 3fcde556 + spec 1750 § B1-4.\n const trivial = useMemo(() => isTrivialPath(summary), [summary])\n if (trivial) {\n return <TrivialCard data={data} summary={summary} />\n }\n\n // v5 4-card layout — kept as ErrorBoundary fallback for non-trivial path\n // when TaskTimelineView fails (spec § B2-5: \"保留 v5 4-card 作为 fallback\").\n const fourCardFallback = (\n <Card\n bordered\n style={{ marginBottom: 16, background: 'var(--cf-kpi-wash-blue, #F2F9FF)' }}\n data-testid=\"tier-container\"\n >\n <Typography.Text style={{\n fontSize: 13, fontWeight: 600,\n display: 'inline-flex', alignItems: 'center', gap: 6, marginBottom: 8,\n }}>\n <IconRobot style={{ color: 'var(--cf-tag-blue)' }} />\n 任务详情\n </Typography.Text>\n\n <TierBanner banner={banner} taskId={data.id} startedAt={data.start_time} />\n\n <DecisionCard\n cardId=\"intent\"\n idx={1}\n title=\"用户意图\"\n oneLine={oneLines.intent}\n expanded={expanded.has('intent')}\n onToggle={() => toggle('intent')}\n detail={<IntentCard s={summary} />}\n />\n <DecisionCard\n cardId=\"decision\"\n idx={2}\n title=\"系统决策\"\n oneLine={oneLines.decision}\n expanded={expanded.has('decision')}\n onToggle={() => toggle('decision')}\n detail={<SystemDecisionCard s={summary} />}\n />\n <DecisionCard\n cardId=\"execution\"\n idx={3}\n title=\"执行\"\n oneLine={oneLines.execution}\n expanded={expanded.has('execution')}\n onToggle={() => toggle('execution')}\n detail={<ExecutionCard s={summary} data={data} />}\n />\n <DecisionCard\n cardId=\"outcome\"\n idx={4}\n title=\"结果\"\n oneLine={oneLines.outcome}\n expanded={expanded.has('outcome')}\n onToggle={() => toggle('outcome')}\n detail={<OutcomeCard s={summary} data={data} />}\n />\n\n <ActionRail\n taskId={data.id}\n outcome={data.outcome ?? null}\n pendingSpecs={data.pendingSpecs}\n />\n </Card>\n )\n\n // v6 Batch 2 (spec 1750 § B2-5): non-trivial path → TaskTimelineView.\n // Wrapped in ErrorBoundary so a timeline-endpoint outage falls back to\n // the v5 4-card layout (page never empty).\n return (\n <TimelineErrorBoundary fallback={fourCardFallback}>\n <TaskTimelineView data={data} />\n </TimelineErrorBoundary>\n )\n}\n","/**\n * DaemonObserverBadge — surfaces \"this week, daemon did N things\" as a single\n * chip row above task lists / task detail.\n *\n * Spec ref: docs/design/2026-05-29/1750-ai-summary-v6-timeline-ui-spec.md § B1-3.\n * Decision OQ Q4 (user-approved): reuse /api/insights/badge with 3 new fields\n * (denied_7d / hinted_7d / trivial_passed_7d) instead of standing up a new\n * /api/daemon/enforce-stats endpoint — the existing 30s cache covers our needs.\n *\n * Layout (草图 4):\n * ┌─ 本周 daemon: 🚫 拒 N · ⚡ hint M · ✓ 通过 K 个 trivial ────┐\n *\n * Filter chips (placeholder) — Batch 2 hooks them up to TasksHubPage query.\n */\nimport { useQuery } from '@tanstack/react-query'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\n\ninterface BadgePayload {\n hasUnread?: boolean\n criticalCount?: number\n warnCount?: number\n infoCount?: number\n total?: number\n windowDays?: number\n cached?: boolean\n generatedAt?: string\n // v6 Batch 1 fields (decision OQ Q4):\n denied_7d?: number\n hinted_7d?: number\n trivial_passed_7d?: number\n}\n\nasync function fetchObserverStats(): Promise<BadgePayload> {\n const res = await fetch('/api/insights/badge?days=7')\n if (!res.ok) throw new Error(`badge HTTP ${res.status}`)\n return res.json()\n}\n\ninterface Props {\n /**\n * Hint where the badge is rendered. Currently informational only — Batch 2\n * may render filter chips differently for task list vs task detail.\n */\n slot?: 'task-detail' | 'task-list'\n}\n\nexport default function DaemonObserverBadge({ slot: _slot }: Props = {}) {\n const { data, isLoading, isError } = useQuery({\n queryKey: ['daemon-observer-badge'],\n queryFn: fetchObserverStats,\n refetchInterval: 60_000,\n // Don't spam errors if the badge endpoint is briefly unavailable.\n retry: 1,\n })\n\n if (isLoading) {\n return (\n <div data-testid=\"daemon-observer-badge-loading\" style={{ marginBottom: 12 }}>\n <Skeleton animation text={{ rows: 1, width: 360 }} />\n </div>\n )\n }\n\n if (isError || !data) {\n // Soft-fail: badge is informational; absence should never block the page.\n return null\n }\n\n const denied = data.denied_7d ?? 0\n const hinted = data.hinted_7d ?? 0\n const trivial = data.trivial_passed_7d ?? 0\n\n return (\n <div\n data-testid=\"daemon-observer-badge\"\n style={{\n display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap',\n padding: '6px 10px', marginBottom: 12,\n border: '1px solid var(--color-border-2)', borderRadius: 4,\n background: 'var(--color-bg-1)',\n fontSize: 12,\n }}\n >\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 本周 daemon:\n </Typography.Text>\n <Tag\n size=\"small\"\n color=\"red\"\n data-testid=\"daemon-observer-denied\"\n >\n 🚫 拒 {denied} 次\n </Tag>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>·</Typography.Text>\n <Tag\n size=\"small\"\n color=\"orange\"\n data-testid=\"daemon-observer-hinted\"\n >\n ⚡ hint {hinted} 次\n </Tag>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>·</Typography.Text>\n <Tag\n size=\"small\"\n color=\"green\"\n data-testid=\"daemon-observer-trivial\"\n >\n ✓ 通过 {trivial} 个 trivial\n </Tag>\n {/* TODO(Batch 2): wire filter chips to TasksHubPage query params\n (?lane=daemon-intervened / ?lane=denied / ?lane=trivial). */}\n </div>\n )\n}\n","/**\n * TaskDetailContent — content-only version of legacy TaskDetail (PR3-arco-3),\n * extracted so it can be embedded in DetailDrawer (Phase E UI rescue P1).\n *\n * v5 (2026-05-26): 4-narrative deleted, replaced by <TierContainer> (Tier 0\n * banner + 4 decision cards + Tier 3 action rail).\n * v6 (2026-05-29 spec 1750 Batch 1): TierContainer auto-collapses to\n * TrivialCard on the trivial path; DaemonObserverBadge surfaces 7d enforce\n * counters above the body. Visible \"AI 决策摘要 v5\" label removed.\n *\n * Differences vs the former legacy TaskDetail page (deleted Phase 4c):\n * - Receives taskId via prop, not useParams (no router dependency)\n * - Removes back-link / page wrapper; only the content sections\n * - Re-uses the same /api/tasks/:id payload + render helpers\n */\nimport { useQuery } from '@tanstack/react-query'\nimport { useState } from 'react'\nimport { format } from 'date-fns'\nimport { parseUTC } from '../utils/time'\n\nimport Card from '@arco-design/web-react/es/Card'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Descriptions from '@arco-design/web-react/es/Descriptions'\nimport Timeline from '@arco-design/web-react/es/Timeline'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport List from '@arco-design/web-react/es/List'\nimport {\n IconClockCircle,\n IconCheckCircle,\n IconLoading,\n IconFile,\n IconCode,\n IconEdit,\n IconRobot,\n IconBook,\n IconFolder,\n IconEye,\n IconSearch,\n IconCloud,\n IconCodeBlock,\n IconInfoCircle,\n} from '@arco-design/web-react/icon'\nimport { normalizeTaskTitle } from '../utils/task-title'\nimport TierContainer from './ai-summary/TierContainer'\nimport DaemonObserverBadge from './insights/DaemonObserverBadge'\nimport type { TaskDetailData } from './ai-summary/types'\n\nasync function fetchTaskDetail(taskId: string): Promise<TaskDetailData> {\n const res = await fetch(`/api/tasks/${taskId}`)\n if (!res.ok) throw new Error('Failed to fetch task detail')\n const raw = await res.json()\n return {\n ...raw.task,\n userPrompts: raw.userPrompts ?? [],\n injections: (raw.injections ?? []).map((i: Record<string, unknown>) => ({\n id: i.id as string,\n timestamp: i.timestamp as string,\n source_handler: i.source_handler as string,\n injection_type: i.injection_type as 'systemMessage' | 'additionalContext',\n content: i.content as string,\n metadata_json: (i.metadata_json as string | null) ?? null,\n })),\n timeline: (raw.timeline ?? []).map((e: Record<string, unknown>, idx: number) => ({\n id: `${e.timestamp as string}-${(e.tool_name as string) ?? (e.kind as string)}-${idx}`,\n timestamp: e.timestamp as string,\n kind: (e.kind as 'tool' | 'notification') ?? 'tool',\n tool_name: (e.tool_name as string | null) ?? null,\n hook_type: e.hook_type as string,\n input: e.input,\n output: e.output,\n is_agent_call: e.is_agent_call as boolean,\n agent_detail: e.agent_detail as {\n subagent_type?: string\n name?: string\n prompt?: string\n status?: 'completed' | 'running'\n changed_files?: string[]\n description?: string\n } | undefined,\n notification: e.notification as { message: string | null; notification_type: string | null } | undefined,\n })),\n skillInvocations: raw.skillInvocations ?? [],\n artifacts: raw.artifacts ?? [],\n pendingSpecs: raw.pendingSpecs ?? [],\n agentSpawns: raw.agentSpawns ?? [],\n }\n}\n\nfunction getToolIcon(toolName: string | null) {\n switch (toolName) {\n case 'Read': return <IconEye style={{ color: 'var(--color-text-3)' }} />\n case 'Edit': return <IconEdit style={{ color: 'var(--cf-tag-orange)' }} />\n case 'Write': return <IconFile style={{ color: 'var(--cf-tag-green)' }} />\n case 'Bash': return <IconCodeBlock style={{ color: 'var(--cf-tag-orange)' }} />\n case 'Agent':\n case 'Task': return <IconRobot style={{ color: 'var(--cf-tag-blue)' }} />\n case 'Grep':\n case 'Glob': return <IconSearch style={{ color: 'var(--cf-tag-purple)' }} />\n case 'WebSearch':\n case 'WebFetch': return <IconCloud style={{ color: '#14C9C9' }} />\n default: return <IconCode style={{ color: 'var(--color-text-3)' }} />\n }\n}\n\nfunction getRelativeTime(eventTime: string, startTime: string): string {\n const diff = parseUTC(eventTime).getTime() - parseUTC(startTime).getTime()\n if (diff < 1000) return '+0s'\n if (diff < 60000) return `+${Math.floor(diff / 1000)}s`\n if (diff < 3600000) return `+${Math.floor(diff / 60000)}m${Math.floor((diff % 60000) / 1000)}s`\n return `+${Math.floor(diff / 3600000)}h${Math.floor((diff % 3600000) / 60000)}m`\n}\n\nfunction statusTag(status: string) {\n if (status === 'completed') return <Tag color=\"green\" icon={<IconCheckCircle />}>已完成</Tag>\n if (status === 'active') return <Tag color=\"arcoblue\" icon={<IconLoading spin />}>进行中</Tag>\n if (status === 'abandoned') return <Tag color=\"gray\">已放弃</Tag>\n return <Tag color=\"gray\">{status}</Tag>\n}\n\nfunction outcomeTag(label: string) {\n if (label === 'success') return <Tag color=\"green\" size=\"small\">成功</Tag>\n if (label === 'partial') return <Tag color=\"orange\" size=\"small\">部分</Tag>\n if (label === 'failed') return <Tag color=\"red\" size=\"small\">失败</Tag>\n if (label === 'abandoned') return <Tag color=\"gray\" size=\"small\">放弃</Tag>\n return <Tag size=\"small\">{label}</Tag>\n}\n\ninterface Props {\n taskId: string\n}\n\nexport default function TaskDetailContent({ taskId }: Props) {\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set())\n const { data, isLoading, error } = useQuery({\n queryKey: ['task-detail', taskId],\n queryFn: () => fetchTaskDetail(taskId),\n enabled: !!taskId,\n refetchInterval: 10000,\n })\n\n if (isLoading) {\n return (\n <Card bordered>\n <Skeleton animation text={{ rows: 6 }} />\n </Card>\n )\n }\n\n if (error || !data) {\n return (\n <Card bordered>\n <Typography.Text type=\"error\">\n 加载失败: {(error as Error)?.message || '未知错误'}\n </Typography.Text>\n </Card>\n )\n }\n\n const toggleEvent = (idx: number) => {\n setExpandedEvents(prev => {\n const next = new Set(prev)\n if (next.has(idx)) next.delete(idx)\n else next.add(idx)\n return next\n })\n }\n\n const duration = data.end_time\n ? `${Math.round((parseUTC(data.end_time).getTime() - parseUTC(data.start_time).getTime()) / 1000)}s`\n : '进行中'\n\n const allEmpty =\n data.userPrompts.length === 0 &&\n data.injections.length === 0 &&\n data.timeline.length === 0 &&\n data.skillInvocations.length === 0 &&\n data.artifacts.length === 0\n\n return (\n <div>\n {/* 区域 1:任务概览 */}\n <Card bordered style={{ marginBottom: 16 }}>\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 12, marginBottom: 16 }}>\n <Typography.Title heading={6} style={{ margin: 0 }}>\n {normalizeTaskTitle(data.title, data.userPrompts[0]?.content)}\n </Typography.Title>\n <span style={{ display: 'inline-flex', gap: 6 }}>\n {statusTag(data.status)}\n {data.outcome && outcomeTag(data.outcome)}\n </span>\n </div>\n <Descriptions\n colon=\" :\"\n size=\"small\"\n column={2}\n data={[\n { label: '开始时间', value: format(parseUTC(data.start_time), 'MM-dd HH:mm:ss') },\n { label: '结束时间', value: data.end_time ? format(parseUTC(data.end_time), 'MM-dd HH:mm:ss') : '-' },\n { label: '持续时间', value: duration },\n { label: '事件数', value: data.event_count },\n ...(data.outcome ? [{\n label: '结果',\n value: (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n {outcomeTag(data.outcome)}\n {data.outcome_reason && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n {data.outcome_reason}\n </Typography.Text>\n )}\n </span>\n ),\n }] : []),\n ...(typeof data.commit_count === 'number' ? [{\n label: '提交数',\n value: (\n <span>\n {data.commit_count}\n {typeof data.reverted_commits === 'number' && data.reverted_commits > 0 && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, marginLeft: 4 }}>\n ({data.reverted_commits} reverted)\n </Typography.Text>\n )}\n </span>\n ),\n }] : []),\n ]}\n />\n </Card>\n\n {/* 区域 1.5:任务详情 (v6 2026-05-29, spec 1750 Batch 1).\n DaemonObserverBadge surfaces 7d enforce counts above the task body;\n TierContainer auto-collapses to TrivialCard when daemon never\n intervened (≥70% of tasks). */}\n <DaemonObserverBadge slot=\"task-detail\" />\n <TierContainer data={data} />\n\n {allEmpty && (\n <Card bordered>\n <Empty\n icon={<IconClockCircle style={{ fontSize: 32, color: 'var(--color-text-4)' }} />}\n description={\n <div>\n <div style={{ fontWeight: 500 }}>该任务暂无可展示的执行内容</div>\n <div style={{ fontSize: 12, color: 'var(--color-text-3)', marginTop: 4 }}>\n 事件可能仍在记录中,稍后刷新查看\n </div>\n </div>\n }\n />\n </Card>\n )}\n\n {/* Polish-5 (2026-05-29): 区域 2 (用户消息) + 区域 3 (注入内容) removed\n from the main view. The TaskTimelineView (non-trivial) now renders\n user_prompt events inline, and the DebugDrawer surfaces injection\n (additionalContext / systemMessage) content under \"原始事件\". The\n TrivialCard (trivial path) shows the prompt snippet in its single-\n line header. Keeping the duplicate cards at the bottom of the page\n confused users reading the timeline (用户截图 showed \"用户消息 2 +\n 注入内容 2\" repeating the timeline header).\n See task brief Polish 5 + Batch 3 plan for `IntentCard.tsx` cleanup. */}\n\n {/* 区域 4:执行时间线 */}\n {data.timeline.length > 0 && (\n <Card bordered style={{ marginBottom: 16 }}>\n <Typography.Text style={{ fontSize: 13, fontWeight: 600, display: 'inline-flex', alignItems: 'center', gap: 6, marginBottom: 16 }}>\n <IconClockCircle style={{ color: 'var(--color-text-3)' }} />\n 执行时间线\n <Tag size=\"small\" color=\"gray\">{data.timeline.length}</Tag>\n </Typography.Text>\n <Timeline>\n {data.timeline.map((event, idx) => {\n // Notification entries (decision 24cce083): distinct dot + label,\n // no expand/collapse — just show message + type tag.\n if (event.kind === 'notification') {\n const msg = event.notification?.message ?? '通知'\n const ntype = event.notification?.notification_type ?? null\n return (\n <Timeline.Item\n key={event.id || idx}\n dot={<IconInfoCircle style={{ color: 'var(--cf-tag-orange)' }} />}\n label={getRelativeTime(event.timestamp, data.start_time)}\n labelPosition=\"relative\"\n dotType=\"hollow\"\n >\n <div style={{ padding: 4 }} data-testid=\"timeline-notification\">\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n <Typography.Text style={{ fontSize: 13, fontWeight: 500, color: 'var(--cf-tag-orange)' }}>\n 通知\n </Typography.Text>\n {ntype && (\n <Tag size=\"small\" color=\"orange\">{ntype}</Tag>\n )}\n </div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginTop: 2 }}>\n {msg}\n </Typography.Text>\n </div>\n </Timeline.Item>\n )\n }\n const isAgent = event.is_agent_call\n const isFileOp = event.tool_name === 'Edit' || event.tool_name === 'Write'\n const isExpanded = expandedEvents.has(idx)\n const input = event.input as Record<string, unknown> | null\n const filePath = input?.file_path as string | undefined\n const description = (input?.description || input?.command) as string | undefined\n // Sub-agent completion (spec 1520-followup): the enriched agent_detail\n // carries status + changed_files; the full report text lives in the\n // matching agentSpawn (timeline output is truncated to ~300 chars).\n const agentStatus = event.agent_detail?.status\n const agentChanged = event.agent_detail?.changed_files ?? []\n const matchedSpawn = isAgent\n ? data.agentSpawns.find(\n s => s.timestamp === event.timestamp &&\n (s.subagent_type ?? undefined) === event.agent_detail?.subagent_type,\n ) ?? data.agentSpawns.find(s => s.timestamp === event.timestamp)\n : undefined\n const agentDot = isAgent\n ? (agentStatus === 'running'\n ? <IconLoading spin style={{ color: 'var(--cf-tag-orange)' }} />\n : <IconCheckCircle style={{ color: 'var(--cf-tag-green)' }} />)\n : getToolIcon(event.tool_name)\n return (\n <Timeline.Item\n key={event.id || idx}\n dot={agentDot}\n label={getRelativeTime(event.timestamp, data.start_time)}\n labelPosition=\"relative\"\n dotType=\"hollow\"\n >\n <div onClick={() => toggleEvent(idx)} style={{ cursor: 'pointer', padding: 4, borderRadius: 4 }} data-testid={isAgent ? 'timeline-agent-call' : undefined}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n {isAgent ? (\n <Typography.Text style={{ fontSize: 13, fontWeight: 600, color: agentStatus === 'running' ? 'var(--cf-tag-orange)' : 'var(--cf-tag-green)' }}>\n {agentStatus === 'running'\n ? `⏳ ${event.agent_detail?.subagent_type ?? '子 agent'} 进行中`\n : `✅ ${event.agent_detail?.subagent_type ?? '子 agent'} 完成`}\n </Typography.Text>\n ) : (\n <Typography.Text style={{ fontSize: 13, fontWeight: 500, color: 'var(--color-text-1)' }}>\n {event.tool_name}\n </Typography.Text>\n )}\n {isAgent && agentChanged.length > 0 && (\n <Tag size=\"small\" color=\"green\">{agentChanged.length} 文件</Tag>\n )}\n {!isAgent && event.agent_detail?.subagent_type && (\n <Tag size=\"small\" color=\"arcoblue\">{event.agent_detail.subagent_type}</Tag>\n )}\n {event.agent_detail?.name && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>{event.agent_detail.name}</Typography.Text>\n )}\n </div>\n {isAgent && !isExpanded && event.agent_detail?.description && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginTop: 2, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {event.agent_detail.description}\n </Typography.Text>\n )}\n {!isExpanded && isFileOp && filePath && (\n <Typography.Text style={{ fontSize: 11, fontFamily: 'monospace', color: 'var(--cf-tag-green)', display: 'block', marginTop: 2 }} title={filePath}>\n {filePath}\n </Typography.Text>\n )}\n {!isExpanded && !isFileOp && description && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginTop: 2, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {description}\n </Typography.Text>\n )}\n {isExpanded && (\n <div onClick={(e) => e.stopPropagation()} style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 8 }}>\n {isAgent && event.agent_detail && (\n <Card size=\"small\" bordered style={{ background: 'var(--cf-kpi-wash-blue, #E8F3FF)' }}>\n {event.agent_detail.subagent_type && (\n <div style={{ fontSize: 12, marginBottom: 4 }}>\n <Typography.Text type=\"secondary\">subagent_type:</Typography.Text>{' '}\n <Typography.Text code>{event.agent_detail.subagent_type}</Typography.Text>\n </div>\n )}\n {event.agent_detail.name && (\n <div style={{ fontSize: 12, marginBottom: 4 }}>\n <Typography.Text type=\"secondary\">name:</Typography.Text>{' '}\n <Typography.Text code>{event.agent_detail.name}</Typography.Text>\n </div>\n )}\n {event.agent_detail.prompt && (\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>prompt:</Typography.Text>\n <pre style={{ fontSize: 11, background: '#fff', border: '1px solid var(--color-border-2)', borderRadius: 4, padding: 8, marginTop: 4, maxHeight: 200, overflow: 'auto', whiteSpace: 'pre-wrap' }}>\n {event.agent_detail.prompt}\n </pre>\n </div>\n )}\n {/* Changed files (spec 1520-followup): per-agent attribution. */}\n {agentChanged.length > 0 && (\n <div style={{ marginTop: 8 }} data-testid=\"agent-changed-files\">\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 改动文件 ({agentChanged.length}):\n </Typography.Text>\n <div style={{ marginTop: 4, display: 'flex', flexDirection: 'column', gap: 2 }}>\n {agentChanged.map((fp) => (\n <span key={fp} style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <IconFile style={{ color: 'var(--cf-tag-green)' }} />\n <Typography.Text code style={{ fontSize: 11 }} title={fp}>{fp}</Typography.Text>\n </span>\n ))}\n </div>\n </div>\n )}\n {/* Full report text (untruncated, from agentSpawns). */}\n {matchedSpawn?.output && (\n <div style={{ marginTop: 8 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>报告全文:</Typography.Text>\n <pre style={{ fontSize: 11, background: '#fff', border: '1px solid var(--color-border-2)', borderRadius: 4, padding: 8, marginTop: 4, maxHeight: 320, overflow: 'auto', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {matchedSpawn.output}\n </pre>\n </div>\n )}\n {agentStatus === 'running' && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginTop: 8 }}>\n ⏳ 子 agent 仍在执行,报告尚未返回\n </Typography.Text>\n )}\n </Card>\n )}\n {isFileOp && filePath && (\n <Card size=\"small\" bordered>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>file:</Typography.Text>{' '}\n <Typography.Text code style={{ color: 'var(--cf-tag-green)' }}>{filePath}</Typography.Text>\n </Card>\n )}\n {!isAgent && description && (\n <Card size=\"small\" bordered>\n <pre style={{ fontSize: 11, color: 'var(--color-text-2)', margin: 0, whiteSpace: 'pre-wrap', wordBreak: 'break-word', maxHeight: 160, overflow: 'auto' }}>\n {description}\n </pre>\n </Card>\n )}\n </div>\n )}\n </div>\n </Timeline.Item>\n )\n })}\n </Timeline>\n </Card>\n )}\n\n {/* 区域 5:Skill 调用 */}\n {data.skillInvocations.length > 0 && (\n <Card bordered style={{ marginBottom: 16 }}>\n <Typography.Text style={{ fontSize: 13, fontWeight: 600, display: 'inline-flex', alignItems: 'center', gap: 6, marginBottom: 12 }}>\n <IconBook style={{ color: 'var(--cf-tag-purple)' }} />\n Skill 调用\n <Tag size=\"small\" color=\"gray\">{data.skillInvocations.length}</Tag>\n </Typography.Text>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {data.skillInvocations.map((skill) => (\n <Card key={skill.id} size=\"small\" bordered style={{ borderColor: 'var(--cf-tag-purple)', background: 'var(--cf-kpi-wash-purple, #F5E8FF)' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', marginBottom: 4 }}>\n <Typography.Text style={{ fontFamily: 'monospace', fontSize: 13, fontWeight: 500, color: 'var(--cf-tag-purple)' }}>\n {skill.skill_id}\n </Typography.Text>\n {skill.workflow && <Tag size=\"small\" color=\"purple\">{skill.workflow}</Tag>}\n {skill.phase && <Tag size=\"small\" color=\"purple\">phase: {skill.phase}</Tag>}\n </div>\n <Typography.Text style={{ fontSize: 12, color: 'var(--color-text-2)' }}>{skill.reason}</Typography.Text>\n </Card>\n ))}\n </div>\n </Card>\n )}\n\n {/* 区域 6:产物 */}\n {data.artifacts.length > 0 && (\n <Card bordered>\n <Typography.Text style={{ fontSize: 13, fontWeight: 600, display: 'inline-flex', alignItems: 'center', gap: 6, marginBottom: 12 }}>\n <IconFolder style={{ color: 'var(--cf-tag-green)' }} />\n 产物\n <Tag size=\"small\" color=\"gray\">{data.artifacts.length} 个文件</Tag>\n </Typography.Text>\n <List\n size=\"small\"\n dataSource={data.artifacts}\n render={(filePath: string) => (\n <List.Item key={filePath} style={{ padding: '6px 12px' }}>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>\n <IconFile style={{ color: 'var(--cf-tag-green)' }} />\n <Typography.Text code style={{ fontSize: 12 }} title={filePath}>{filePath}</Typography.Text>\n </span>\n </List.Item>\n )}\n />\n </Card>\n )}\n </div>\n )\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { format } from 'date-fns'\nimport { parseUTC } from '../utils/time'\nimport { MessageSquare, FileEdit, Terminal, GitCommit } from 'lucide-react'\nimport clsx from 'clsx'\n\ninterface TaskDetail {\n id: string\n title: string\n start_time: string\n end_time?: string\n status: string\n event_count: number\n prompts: Array<{ timestamp: string; content: string }>\n events: Array<any>\n injections: Array<any>\n summary: {\n toolUsage: Record<string, number>\n filesChanged: string[]\n commits: Array<{ timestamp: string; message: string }>\n }\n}\n\ninterface SessionDetailData {\n session: {\n session_id: string\n first_prompt: string\n event_count: number\n start_time: string\n end_time: string\n }\n tasks: TaskDetail[]\n}\n\nasync function fetchSessionDetail(id: string): Promise<SessionDetailData> {\n const res = await fetch(`/api/sessions/${id}/detail`)\n if (!res.ok) throw new Error('Failed to fetch session detail')\n return res.json()\n}\n\ninterface Props {\n sessionId: string\n}\n\nexport default function SessionDetailContent({ sessionId }: Props) {\n const { data, isLoading, error } = useQuery({\n queryKey: ['session-detail', sessionId],\n queryFn: () => fetchSessionDetail(sessionId),\n enabled: !!sessionId,\n })\n\n if (isLoading) {\n return <div className=\"p-6 text-gray-500\">加载中...</div>\n }\n\n if (error || !data) {\n return <div className=\"p-6 text-red-600\">加载失败</div>\n }\n\n return (\n <div className=\"space-y-4\">\n <div>\n <div className=\"text-xs text-gray-500 mb-1\">Session ID</div>\n <div className=\"text-sm font-mono text-gray-900 break-all\">{data.session.session_id}</div>\n </div>\n\n <div className=\"grid grid-cols-3 gap-4 pb-4 border-b border-gray-200\">\n <div>\n <div className=\"text-xs text-gray-500\">事件数</div>\n <div className=\"text-lg font-semibold\">{data.session.event_count}</div>\n </div>\n <div>\n <div className=\"text-xs text-gray-500\">任务数</div>\n <div className=\"text-lg font-semibold\">{data.tasks.length}</div>\n </div>\n <div>\n <div className=\"text-xs text-gray-500\">开始时间</div>\n <div className=\"text-sm\">\n {data.session.start_time ? format(parseUTC(data.session.start_time), 'MM-dd HH:mm:ss') : '-'}\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-semibold text-gray-700 mb-3\">任务列表</h3>\n <div className=\"space-y-3\">\n {data.tasks.map((task) => (\n <div key={task.id} className=\"border border-gray-200 rounded-lg p-4\">\n <div className=\"flex items-center justify-between mb-3\">\n <h4 className=\"text-sm font-semibold text-gray-900 flex-1 mr-2\">{task.title}</h4>\n <span className={clsx(\n 'px-2 py-0.5 text-xs font-medium rounded-full whitespace-nowrap',\n task.status === 'completed' && 'bg-green-100 text-green-700',\n task.status === 'active' && 'bg-blue-100 text-blue-700',\n task.status === 'abandoned' && 'bg-gray-100 text-gray-600'\n )}>\n {task.status}\n </span>\n </div>\n\n <div className=\"grid grid-cols-3 gap-3 mb-3 text-xs\">\n <div>\n <div className=\"text-gray-500 mb-1 flex items-center gap-1\">\n <Terminal className=\"h-3 w-3\" />工具使用\n </div>\n <div className=\"space-y-0.5\">\n {Object.entries(task.summary.toolUsage).slice(0, 4).map(([tool, count]) => (\n <div key={tool} className=\"flex justify-between\">\n <span className=\"text-gray-600\">{tool}</span>\n <span className=\"font-mono text-gray-900\">{count}</span>\n </div>\n ))}\n </div>\n </div>\n <div>\n <div className=\"text-gray-500 mb-1 flex items-center gap-1\">\n <FileEdit className=\"h-3 w-3\" />文件变更\n </div>\n <div className=\"text-gray-700\">{task.summary.filesChanged.length} 个</div>\n {task.summary.filesChanged.slice(0, 3).map(f => (\n <div key={f} className=\"text-gray-500 truncate text-[10px]\" title={f}>\n {f.split('/').pop()}\n </div>\n ))}\n </div>\n <div>\n <div className=\"text-gray-500 mb-1 flex items-center gap-1\">\n <GitCommit className=\"h-3 w-3\" />提交\n </div>\n <div className=\"text-gray-700\">{task.summary.commits.length} 次</div>\n </div>\n </div>\n\n {task.prompts.length > 0 && (\n <div className=\"border-t border-gray-100 pt-3\">\n <div className=\"text-xs text-gray-500 mb-2 flex items-center gap-1\">\n <MessageSquare className=\"h-3 w-3\" />用户提示 ({task.prompts.length})\n </div>\n <div className=\"space-y-1.5\">\n {task.prompts.slice(0, 3).map((p, i) => (\n <div key={i} className=\"text-xs bg-gray-50 rounded p-2\">\n <p className=\"text-gray-700 line-clamp-2\">{p.content}</p>\n </div>\n ))}\n {task.prompts.length > 3 && (\n <div className=\"text-xs text-gray-400\">还有 {task.prompts.length - 3} 条...</div>\n )}\n </div>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n </div>\n )\n}\n","/**\n * DetailDrawer — right-side 720px Arco Drawer for session/task detail.\n *\n * Phase E UI refactor (Step 5): open state is driven by query params so it's\n * deep-linkable / shareable. Closing the drawer just removes the relevant\n * param without changing `view=`, preserving the user's list scroll position.\n *\n * ?session=<id> → session detail (uses /api/sessions/:id/detail)\n * ?task=<id> → task detail (uses /api/tasks/:taskId)\n *\n * decision 7ed8aaae (2026-06-08): the legacy ?prompt=<event_id> branch (a\n *未完成占位 that只 dumped the pipeline summary JSON) was removed as dead code.\n * Prompt rows in TasksHubPage now open the task 富抽屉 (?task=<group_id>) — the\n * same rich TaskDetailContent (执行时间线 + 改动文件 + 产物总览) used by the\n * group sub-header. The pipeline summary backend route stays mounted (other\n * consumers); only this drawer no longer uses it.\n *\n * If both task & session params are present, priority is task > session.\n * task & session each render their own self-fetching content component.\n */\nimport { useMemo } from 'react'\nimport { useSearchParams } from 'react-router-dom'\nimport Drawer from '@arco-design/web-react/es/Drawer'\nimport TaskDetailContent from '../TaskDetailContent'\nimport SessionDetailContent from '../SessionDetailContent'\n\nconst DRAWER_WIDTH = 720\n\ninterface DrawerTarget {\n kind: 'session' | 'task'\n id: string\n paramKey: 'session' | 'task'\n}\n\nfunction resolveTarget(params: URLSearchParams): DrawerTarget | null {\n const task = params.get('task')\n if (task) return { kind: 'task', id: task, paramKey: 'task' }\n const session = params.get('session')\n if (session) return { kind: 'session', id: session, paramKey: 'session' }\n return null\n}\n\nfunction titleFor(t: DrawerTarget): string {\n switch (t.kind) {\n case 'session': return `会话: ${t.id.slice(0, 8)}...`\n case 'task': return `任务: ${t.id.slice(0, 8)}...`\n }\n}\n\nexport default function DetailDrawer() {\n const [searchParams, setSearchParams] = useSearchParams()\n const target = useMemo(() => resolveTarget(searchParams), [searchParams])\n\n const close = () => {\n if (!target) return\n const next = new URLSearchParams(searchParams)\n next.delete(target.paramKey)\n setSearchParams(next, { replace: false })\n }\n\n const visible = !!target\n\n return (\n <Drawer\n title={target ? titleFor(target) : ''}\n width={DRAWER_WIDTH}\n placement=\"right\"\n visible={visible}\n onCancel={close}\n footer={null}\n maskClosable\n unmountOnExit\n >\n {!target ? null : <DetailBody target={target} />}\n </Drawer>\n )\n}\n\nfunction DetailBody({ target }: { target: DrawerTarget }) {\n if (target.kind === 'session') {\n return <SessionDetailContent sessionId={target.id} />\n }\n // task\n return <TaskDetailContent taskId={target.id} />\n}\n","/**\n * OutcomeFilterChips — Toolbar chip group for task outcome filter.\n *\n * URL: ?outcome=all|success|partial|failed|abandoned|none|answered (default: all).\n * Each chip shows label + live count (from props.counts) so user knows\n * \"how many failed tasks are there\" before clicking.\n *\n * Used by /tasks (TasksHubPage). Pure presentational; outcome state is\n * owned by parent via URLSearchParams. Filtering is pushed to the backend\n * (decision 0c1549ec, 2026-06-11) so a chip filters the WHOLE window, not\n * just the current page.\n *\n * The chip set now covers all six window-aggregate buckets so the counts\n * SUM TO 全部 (task_total): 成功 + 部分 + 失败 + 放弃 + 已答复 + 进行中 = 全部.\n * '进行中' (none) is the in-progress / no-terminal-outcome residual bucket;\n * '已答复' (answered) is the spec-1100 fifth outcome. Both are rendered only\n * when their count > 0 so an empty bucket doesn't clutter the toolbar.\n */\nimport Tag from '@arco-design/web-react/es/Tag'\n\nexport type OutcomeKey =\n | 'all'\n | 'success'\n | 'partial'\n | 'failed'\n | 'abandoned'\n | 'answered'\n | 'none'\n\nexport interface OutcomeCounts {\n all: number\n success: number\n partial: number\n failed: number\n abandoned: number\n answered: number\n none: number\n}\n\ninterface ChipDef {\n key: OutcomeKey\n label: string\n color: string // arco Tag color when active\n /** Hide the chip when its count is 0 (keeps the toolbar clean for residual\n * buckets that may not exist in every window). 'all' is always shown. */\n hideWhenZero?: boolean\n}\n\nconst CHIPS: ChipDef[] = [\n { key: 'all', label: '全部', color: 'gray' },\n { key: 'success', label: '✅ 成功', color: 'green' },\n { key: 'partial', label: '⚠️ 部分', color: 'orange' },\n { key: 'failed', label: '❌ 失败', color: 'red' },\n { key: 'abandoned', label: '🛑 放弃', color: 'gray' },\n { key: 'none', label: '🔄 进行中', color: 'arcoblue', hideWhenZero: true },\n { key: 'answered', label: '💬 已答复', color: 'cyan', hideWhenZero: true },\n]\n\ninterface Props {\n active: OutcomeKey\n counts: OutcomeCounts\n onChange: (next: OutcomeKey) => void\n}\n\nexport default function OutcomeFilterChips({ active, counts, onChange }: Props) {\n return (\n <div style={{ display: 'inline-flex', gap: 6, flexWrap: 'wrap', alignItems: 'center' }}>\n {CHIPS.map(c => {\n const isActive = c.key === active\n const count = counts[c.key] ?? 0\n // Hide residual buckets (进行中 / 已答复) when empty — unless the user\n // is currently filtering by it (so the active chip never vanishes).\n if (c.hideWhenZero && count === 0 && !isActive) return null\n return (\n <Tag\n key={c.key}\n checkable\n checked={isActive}\n onCheck={() => onChange(c.key)}\n color={isActive ? c.color : undefined}\n style={{\n cursor: 'pointer',\n fontSize: 12,\n fontWeight: isActive ? 600 : 400,\n borderColor: isActive ? undefined : 'var(--color-border-2)',\n }}\n >\n {c.label} <span style={{ opacity: 0.7, marginLeft: 2 }}>({count})</span>\n </Tag>\n )\n })}\n </div>\n )\n}\n","/**\n * /tasks — 我的任务 (v4 IA 核心实体).\n *\n * Step 2 实现: outcome filter chips + List ↔ Kanban toggle + 紧凑 KPI Row\n * + 整张 Card click → DetailDrawer (?task=<id>).\n *\n * 数据源: GET /api/insights/agent-board?window=7 (task-centric cards 含\n * outcome + top_tools + kb_pages + files_changed + intercepts). 不动后端.\n * Kanban 5 lane = backend 4 lane (pending/active/abandoned/completed) +\n * 前端把 completed 里 outcome=failed 的 task 拆到 failed lane.\n *\n * 覆盖场景: A (刚跑完任务) / B (失败 task 定位) / G (KB/Skill 使用看一眼).\n */\nimport { useMemo, useState, useEffect, useRef } from 'react'\nimport { useSearchParams, useNavigate, Link } from 'react-router-dom'\nimport { useQuery, keepPreviousData, useQueryClient } from '@tanstack/react-query'\nimport { format } from 'date-fns'\nimport Card from '@arco-design/web-react/es/Card'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Input from '@arco-design/web-react/es/Input'\nimport Button from '@arco-design/web-react/es/Button'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Tooltip from '@arco-design/web-react/es/Tooltip'\nimport Radio from '@arco-design/web-react/es/Radio'\nimport Statistic from '@arco-design/web-react/es/Statistic'\nimport Pagination from '@arco-design/web-react/es/Pagination'\nimport {\n IconRefresh,\n IconList,\n IconApps,\n} from '@arco-design/web-react/icon'\nimport { parseUTC } from '../utils/time'\nimport { useTimeWindow } from '../lib/time-window'\nimport { useProject } from '../lib/project'\nimport { resolveEffectiveProject } from '../lib/project-resolve'\nimport { listKbProjects } from '../utils/kbApi'\nimport { kbProjectsKey } from '../utils/kbProject'\nimport DetailDrawer from '../components/pipeline/DetailDrawer'\nimport OutcomeFilterChips, { type OutcomeKey, type OutcomeCounts } from '../components/tasks/OutcomeFilterChips'\nimport { outcomeBorderColor, OutcomeTag } from '../utils/outcome'\n\n// ─── Types (mirror /api/insights/agent-board) ─────────────────────────────\ntype TaskKind = 'user' | 'agent-callback' | 'image' | 'system'\ninterface ToolEntry { tool: string; n: number }\ninterface KbEntry { name: string; cited: number }\ninterface AgentEntry { type: string; n: number }\ninterface TaskCard {\n task_id: string\n session_id: string\n project_path: string | null\n title: string\n start_time: string\n end_time: string | null\n status: 'active' | 'completed' | 'abandoned'\n duration_sec: number | null\n event_count: number\n outcome: 'success' | 'partial' | 'failed' | 'abandoned' | null\n outcome_reason: string | null\n top_tools: ToolEntry[]\n spawned_agents: AgentEntry[]\n kb_pages: KbEntry[]\n files_changed: number\n last_file: string | null\n intercepts: { deny: number; warn: number }\n commit_count: number\n reverted_commits: number\n user_violation_count: number\n /** spec b1480935 (2026-06-01): per-task classification chip source. */\n task_kind: TaskKind\n}\ninterface BoardResponse {\n generated_at: string\n window_days: number\n project: string | null\n /** Unbounded task count in the window (post-noise-filter, post-project-filter).\n * Distinct from summary.total which is capped by the lane LIMIT. KPI \"总任务数 (7d)\"\n * must bind here, not to flattened lane length. Added 2026-05-26. */\n total_in_window?: number\n /** Echoed pagination params (added 2026-05-26). */\n limit?: number\n offset?: number\n lanes: { pending: TaskCard[]; active: TaskCard[]; abandoned: TaskCard[]; completed: TaskCard[] }\n summary: { total: number; by_lane: Record<string, number>; by_outcome: Record<string, number> }\n}\n\n// ─── Prompt-rows mode (decision b509fd91, 2026-06-08 — P1 方案 B) ───────────\n// list view renders \"一行 = 一条 user prompt + 按 task 分组\". group_id = task_id.\ntype GroupLane = 'pending' | 'active' | 'abandoned' | 'completed'\ninterface PromptRow {\n event_id: string\n prompt_text: string\n prompt_ts: string\n session_id: string\n project_path: string | null\n group_id: string\n}\ninterface GroupMeta {\n title: string\n status: 'active' | 'completed' | 'abandoned'\n outcome: 'success' | 'partial' | 'failed' | 'abandoned' | null\n lane: GroupLane\n task_kind: TaskKind\n start_time: string\n end_time: string | null\n duration_sec: number | null\n prompt_count: number\n}\n/**\n * Window-level DISTINCT-TASK aggregates (2026-06-10 KPI 分页假象 fix) — computed\n * server-side over the WHOLE window (same WHERE 口径 as total_in_window), so the\n * KPI bar / outcome tabs no longer read page-local `groups` (LIMIT-clipped).\n * `abandoned` folds in (outcome IS NULL AND status='abandoned') — chip semantics.\n * `answered` is the spec-1100 fifth outcome (no tab today); `none` is the\n * residual catch-all (NULL outcome with non-abandoned status + unknown values).\n */\ninterface WindowAggregates {\n task_total: number\n by_outcome: { success: number; partial: number; failed: number; abandoned: number; answered: number; none: number }\n avg_duration_sec: number | null\n}\ninterface PromptBoardResponse {\n generated_at: string\n window_days: number\n project: string | null\n mode: 'prompt'\n total_in_window: number\n limit: number\n offset: number\n /** Optional for rolling-deploy safety (older daemon won't send it). */\n window_aggregates?: WindowAggregates\n rows: PromptRow[]\n groups: Record<string, GroupMeta>\n summary: { total_groups: number; total_rows: number; by_lane: Record<string, number>; by_outcome: Record<string, number> }\n}\n\n// ─── API ──────────────────────────────────────────────────────────────────\n// Pagination (2026-05-26): list view drives `limit` + `offset`. Kanban view\n// passes a high `limit` (covers all lanes) and offset=0. Server caps limit at\n// 300 already; we pass 300 from kanban to maximize coverage for the lane bins.\nasync function fetchBoard(\n project: string,\n opts: { limit?: number; offset?: number; includeSystem?: boolean; windowDays?: number } = {},\n): Promise<BoardResponse> {\n const params = new URLSearchParams()\n // OQ4 (decision b509fd91): window is now adjustable (default 30, was hard 7).\n params.set('window', String(opts.windowDays ?? 30))\n if (project) params.set('project', project)\n if (opts.limit != null) params.set('limit', String(opts.limit))\n if (opts.offset != null) params.set('offset', String(opts.offset))\n // spec b1480935 (2026-06-01 Option A): chip toggle. Default = user-only;\n // when ON, ask backend for the full kind whitelist so callback / image /\n // system rows show up muted (rendered grey + 'kind' tag) in the lanes.\n if (opts.includeSystem) {\n params.set('include_kinds', 'user,agent-callback,image,system')\n }\n const res = await fetch(`/api/insights/agent-board?${params.toString()}`)\n if (!res.ok) throw new Error(`API ${res.status}`)\n return res.json()\n}\n\n// decision b509fd91 (2026-06-08): prompt-rows fetch for the list view. Same\n// endpoint with ?rows=prompt — backend returns逐条 prompt 行 + group map.\nasync function fetchPromptBoard(\n project: string,\n opts: { limit?: number; offset?: number; includeSystem?: boolean; windowDays?: number; outcome?: OutcomeKey; search?: string } = {},\n): Promise<PromptBoardResponse> {\n const params = new URLSearchParams()\n params.set('window', String(opts.windowDays ?? 30))\n params.set('rows', 'prompt')\n if (project) params.set('project', project)\n if (opts.limit != null) params.set('limit', String(opts.limit))\n if (opts.offset != null) params.set('offset', String(opts.offset))\n if (opts.includeSystem) {\n params.set('include_kinds', 'user,agent-callback,image,system')\n }\n // decision 0c1549ec (2026-06-11): push outcome chip filter to the backend so\n // it filters the WHOLE window, not just the current page. 'all' = omit (no\n // filter) → backward-compatible / unchanged response.\n if (opts.outcome && opts.outcome !== 'all') {\n params.set('outcome', opts.outcome)\n }\n // decision 540ed063 (2026-06-11): push the free-text search term to the\n // backend (prompt + title plaintext columns) so it filters the WHOLE window,\n // not just the current page. Blank → omit → no filter (backward compatible).\n const searchTerm = (opts.search ?? '').trim()\n if (searchTerm) {\n params.set('search', searchTerm)\n }\n const res = await fetch(`/api/insights/agent-board?${params.toString()}`)\n if (!res.ok) throw new Error(`API ${res.status}`)\n return res.json()\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────\nfunction tsLabel(iso: string): string {\n try { return format(parseUTC(iso), 'MM-dd HH:mm') } catch { return iso }\n}\nfunction durationLabel(sec: number | null): string {\n if (sec === null || sec === undefined) return '—'\n if (sec < 60) return `${sec}s`\n if (sec < 3600) return `${Math.round(sec / 60)}m`\n const h = Math.floor(sec / 3600)\n const m = Math.round((sec % 3600) / 60)\n return m > 0 ? `${h}h ${m}m` : `${h}h`\n}\nfunction relativeAge(iso: string): string {\n const ms = Date.now() - parseUTC(iso).getTime()\n if (ms < 60_000) return '刚刚'\n if (ms < 3600_000) return `${Math.round(ms / 60_000)}m 前`\n if (ms < 86_400_000) return `${Math.round(ms / 3600_000)}h 前`\n return `${Math.round(ms / 86_400_000)}d 前`\n}\n// outcomeBorderColor / outcome tag rendering imported from '../utils/outcome'\n// (consolidated 2026-05-26 — was drifting between Material and Arco palettes).\n\n// spec b1480935 (2026-06-01 Option A): per-kind chip label + colour. Used by\n// both list and kanban renderers when the \"含系统任务\" toggle is ON so the\n// user can immediately tell a callback row from a real user row.\nfunction kindLabel(kind: TaskKind): string {\n switch (kind) {\n case 'agent-callback': return '回调'\n case 'image': return '图片'\n case 'system': return '系统'\n case 'user':\n default: return ''\n }\n}\nfunction isMutedKind(kind: TaskKind): boolean {\n return kind !== 'user'\n}\n\n// ─── Prompt row (decision b509fd91, P1 方案 B) ─────────────────────────────\n// One row = one user prompt. onClick opens the task 富抽屉 (?task=<group_id>) —\n// same rich drawer as the group sub-header (decision 7ed8aaae, 2026-06-08):\n// 执行时间线 + 改动文件 + 产物总览. group_id === task_id. Grouped under a\n// group sub-header by the caller.\nconst GROUP_LANE_LABEL: Record<GroupLane, { text: string; color: string }> = {\n pending: { text: '待处理', color: 'gray' },\n active: { text: '进行中', color: 'arcoblue' },\n abandoned: { text: '中断', color: 'orange' },\n completed: { text: '完成', color: 'green' },\n}\n\nfunction PromptListItem({ row, group, onOpen }: { row: PromptRow; group: GroupMeta | undefined; onOpen: (taskId: string) => void }) {\n const text = row.prompt_text || '(空 prompt)'\n const display = text.length > 160 ? `${text.slice(0, 160)}…` : text\n const lane = group?.lane ?? 'active'\n const laneTag = GROUP_LANE_LABEL[lane]\n return (\n <Card\n bordered\n hoverable\n onClick={() => onOpen(row.group_id)}\n data-prompt-row={row.event_id}\n data-group-id={row.group_id}\n style={{\n marginBottom: 8,\n background: 'var(--color-bg-1)',\n borderLeft: '3px solid var(--color-border-2)',\n cursor: 'pointer',\n }}\n bodyStyle={{ padding: '10px 14px' }}\n >\n <div style={{ display: 'flex', alignItems: 'flex-start', gap: 12 }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <Tooltip content={text}>\n <Typography.Text style={{ fontSize: 13, color: 'var(--color-text-1)' }}>\n 💬 {display}\n </Typography.Text>\n </Tooltip>\n <div style={{ display: 'flex', gap: 8, fontSize: 11, color: 'var(--color-text-3)', flexWrap: 'wrap', alignItems: 'center', marginTop: 4 }}>\n <span style={{ fontFamily: 'monospace' }}>{row.event_id.slice(0, 8)}</span>\n <span>·</span>\n <span>{relativeAge(row.prompt_ts)}</span>\n <span>·</span>\n <span>{tsLabel(row.prompt_ts)}</span>\n </div>\n </div>\n <div style={{ flexShrink: 0 }}>\n {group?.outcome ? <OutcomeTag value={group.outcome} /> : (\n <Tag color={laneTag.color} size=\"small\">{laneTag.text}</Tag>\n )}\n </div>\n </div>\n </Card>\n )\n}\n\n// ─── Kanban Lane ──────────────────────────────────────────────────────────\ninterface LaneDef { key: string; emoji: string; title: string; bg: string; border: string }\nconst KANBAN_LANES: LaneDef[] = [\n { key: 'pending', emoji: '🆕', title: '待处理', bg: '#f5f6f7', border: '#dadce0' },\n { key: 'active', emoji: '🔄', title: '进行中', bg: '#eaf2ff', border: '#bcd2ff' },\n { key: 'abandoned', emoji: '⏸', title: '中断', bg: '#fff5e8', border: '#ffd591' },\n { key: 'failed', emoji: '❌', title: '失败', bg: '#fff1f0', border: '#ffccc7' },\n { key: 'done', emoji: '✅', title: '完成', bg: '#e8faef', border: '#b8e8ca' },\n]\n\nfunction KanbanLane({ def, cards, onOpen, limit, onLoadMore }: { def: LaneDef; cards: TaskCard[]; onOpen: (id: string) => void; limit: number; onLoadMore: () => void }) {\n const visible = cards.slice(0, limit)\n const remaining = Math.max(0, cards.length - visible.length)\n return (\n <div\n data-lane={def.key}\n style={{\n flex: 1,\n minWidth: 240,\n background: def.bg,\n border: `1px solid ${def.border}`,\n borderRadius: 8,\n padding: 12,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, marginBottom: 8 }}>\n <span style={{ fontSize: 16 }}>{def.emoji}</span>\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }}>{def.title}</Typography.Text>\n <Tag size=\"small\" style={{ marginLeft: 'auto' }}>{cards.length}</Tag>\n </div>\n <div style={{ flex: 1, maxHeight: 'calc(100vh - 300px)', overflowY: 'auto', paddingRight: 4 }}>\n {cards.length === 0 ? (\n <div style={{ padding: '16px 0', display: 'flex', justifyContent: 'center', opacity: 0.6 }}>\n <Empty description=\"无任务\" />\n </div>\n ) : visible.map(card => {\n const muted = isMutedKind(card.task_kind)\n const leftBorderColor = muted\n ? 'var(--color-fill-4)'\n : (card.status === 'completed' ? outcomeBorderColor(card.outcome) : 'var(--color-border-2)')\n return (\n <Card\n key={card.task_id}\n bordered\n size=\"small\"\n hoverable\n onClick={() => onOpen(card.task_id)}\n data-task-kind={card.task_kind}\n style={{\n marginBottom: 8,\n background: muted ? 'var(--color-fill-1)' : 'var(--color-bg-1)',\n borderLeft: `4px solid ${leftBorderColor}`,\n cursor: 'pointer',\n opacity: muted ? 0.78 : 1,\n }}\n bodyStyle={{ padding: '8px 10px' }}\n >\n {muted && (\n <div style={{ marginBottom: 4 }}>\n <Tag color=\"gray\" size=\"small\" style={{ fontSize: 10 }}>{kindLabel(card.task_kind)}</Tag>\n </div>\n )}\n <Typography.Paragraph\n style={{ margin: 0, marginBottom: 4, fontSize: 12, fontWeight: 600, lineHeight: 1.35, wordBreak: 'break-word', color: muted ? 'var(--color-text-3)' : undefined }}\n >\n {card.title ? (card.title.length > 80 ? card.title.slice(0, 80) + '…' : card.title) : '(空 title)'}\n </Typography.Paragraph>\n <div style={{ display: 'flex', gap: 4, fontSize: 10.5, color: 'var(--color-text-3)', flexWrap: 'wrap' }}>\n <span>{relativeAge(card.start_time)}</span>\n {card.duration_sec !== null && <span>· {durationLabel(card.duration_sec)}</span>}\n {card.files_changed > 0 && <span>· {card.files_changed} files</span>}\n {card.kb_pages.length > 0 && <span>· {card.kb_pages.length} KB</span>}\n </div>\n </Card>\n )\n })}\n {remaining > 0 && (\n <div style={{ paddingTop: 4 }}>\n <Button\n size=\"mini\"\n long\n type=\"text\"\n onClick={onLoadMore}\n style={{ fontSize: 11, color: 'var(--color-text-3)' }}\n >\n 再看 30 条(剩 {remaining})\n </Button>\n </div>\n )}\n </div>\n </div>\n )\n}\n\n// ─── Page ─────────────────────────────────────────────────────────────────\ntype ViewMode = 'list' | 'kanban'\n\nexport default function TasksHubPage() {\n const [searchParams, setSearchParams] = useSearchParams()\n const navigate = useNavigate()\n\n // Resolve the effective project filter passed to the backend. The\n // AUTHORITATIVE source is the global ProjectContext (localStorage-persisted),\n // not the URL — so the selection survives left-nav `navigate(key)` which\n // drops search params (Bug 1, decision 39839e30). Semantics unchanged\n // (decision c4200ef6 / 76a7241a):\n // - ALL_PROJECTS → '' (no filter → all projects, user's explicit choice)\n // - concrete path → that path (scoped)\n // - default ('') → fall back to the current daemon project (scoped-to-current).\n const { data: kbProjects } = useQuery({\n queryKey: kbProjectsKey(),\n queryFn: listKbProjects,\n staleTime: 30_000,\n })\n const { project: projectSelection } = useProject()\n const currentDaemonProject = kbProjects?.current ?? ''\n const project = resolveEffectiveProject(projectSelection, currentDaemonProject)\n const outcomeParam = (searchParams.get('outcome') ?? 'all') as OutcomeKey\n const viewParam = (searchParams.get('view') === 'kanban' ? 'kanban' : 'list') as ViewMode\n const search = searchParams.get('q') ?? ''\n // 时间窗去重 (decision 76a7241a, 2026-06-13): 任务页不再维护本地 ?window= 选择器\n // ——改消费全局顶栏 TimeWindowContext(与 WorkplacePage 同口径)。切顶栏 7d/30d/90d\n // 即驱动下方所有 ['tasks-hub', ..., windowDays] queryKey 重取。OQ4 (b509fd91) 的\n // 本地 URL window 选择器在本去重中退役;持久化由 context 的 localStorage 接管。\n const { window: windowDays } = useTimeWindow()\n // spec b1480935 (2026-06-01): \"含系统任务\" chip — URL-persistent so refresh\n // restores user intent. Default off (clean user-only view).\n const includeSystem = searchParams.get('sys') === '1'\n\n // ── Pagination state (2026-05-26) ───────────────────────────────────────\n // List view: real paginator driven by ?page=N&pageSize=M. URL-persistent so\n // refresh restores user's position. Kanban: paginator hidden; fetch all lanes\n // with a high limit (300 = server max) and offset=0.\n const PAGE_SIZE_OPTIONS = [20, 40, 80] as const\n const DEFAULT_PAGE_SIZE = 40\n const KANBAN_FETCH_LIMIT = 300\n\n const pageParam = parseInt(searchParams.get('page') ?? '1', 10)\n const pageSizeRaw = parseInt(searchParams.get('pageSize') ?? String(DEFAULT_PAGE_SIZE), 10)\n const page = Number.isFinite(pageParam) && pageParam > 0 ? pageParam : 1\n const pageSize = PAGE_SIZE_OPTIONS.includes(pageSizeRaw as 20 | 40 | 80) ? pageSizeRaw : DEFAULT_PAGE_SIZE\n\n // Kanban view still keeps its \"再看 30 条\" per-lane load-more behaviour. Reset\n // local state on filter changes so user doesn't see stale paging.\n const KANBAN_PAGE_SIZE = 30\n const [kanbanLimit, setKanbanLimit] = useState(KANBAN_PAGE_SIZE)\n useEffect(() => {\n setKanbanLimit(KANBAN_PAGE_SIZE)\n }, [outcomeParam, search, windowDays])\n\n // 时间窗去重 (decision 76a7241a): window 现来自全局 context(不再过 clearPaging)。\n // 当 window 收窄时当前 page 可能越界 → 切窗后把 list-view 分页归位到第 1 页,\n // 避免落在空页(前一个本地 setWindow 走 clearPaging 已隐含此行为,迁全局后补回)。\n const prevWindowRef = useRef(windowDays)\n useEffect(() => {\n if (prevWindowRef.current !== windowDays) {\n prevWindowRef.current = windowDays\n if (searchParams.get('page') || searchParams.get('pageSize')) {\n const next = new URLSearchParams(searchParams)\n next.delete('page')\n next.delete('pageSize')\n setSearchParams(next, { replace: true })\n }\n }\n }, [windowDays, searchParams, setSearchParams])\n\n // Server-side pagination params depend on viewMode. Kanban needs a large\n // single page (covers all lanes); list view drives `offset` = (page-1)*pageSize.\n const fetchLimit = viewParam === 'list' ? pageSize : KANBAN_FETCH_LIMIT\n const fetchOffset = viewParam === 'list' ? (page - 1) * pageSize : 0\n\n const queryClient = useQueryClient()\n\n // Kanban view → task-row board (lanes). List view → prompt-row board\n // (decision b509fd91). Only the active view's query runs (enabled flag) so we\n // don't double-fetch on every render.\n const isListView = viewParam === 'list'\n\n const { data, isLoading, isError, refetch, isFetching } = useQuery({\n queryKey: ['tasks-hub', project, 'kanban', fetchLimit, fetchOffset, includeSystem, windowDays],\n queryFn: () => fetchBoard(project, { limit: fetchLimit, offset: fetchOffset, includeSystem, windowDays }),\n enabled: !isListView,\n refetchInterval: 30_000,\n refetchIntervalInBackground: false,\n placeholderData: keepPreviousData,\n })\n\n const {\n data: promptData,\n isLoading: promptLoading,\n isError: promptError,\n refetch: promptRefetch,\n isFetching: promptFetching,\n } = useQuery({\n // decision 0c1549ec (2026-06-11): outcomeParam IS now part of the queryKey\n // — this is the core fix. Previously switching a chip only changed the URL\n // (not the key), so react-query never refetched and filtering happened only\n // over the page-local ~120 rows via a client `.filter`. Now a chip switch\n // changes the key → refetch with the backend window-level filter.\n // decision 540ed063 (2026-06-11): `search` IS now part of the queryKey too —\n // typing in the box changes the key → refetch with the backend window-level\n // search predicate. Previously search was a page-local client `.filter` (the\n // OQ3 follow-up of 0c1549ec), so cross-page matches were invisible.\n queryKey: ['tasks-hub', project, 'prompt', fetchLimit, fetchOffset, includeSystem, windowDays, outcomeParam, search],\n queryFn: () => fetchPromptBoard(project, { limit: fetchLimit, offset: fetchOffset, includeSystem, windowDays, outcome: outcomeParam, search }),\n enabled: isListView,\n refetchInterval: 30_000,\n refetchIntervalInBackground: false,\n placeholderData: keepPreviousData,\n })\n\n // ── SSE real-time refresh (decision 24cce083) ──────────────────────────────\n // Subscribe to the existing /api/events/stream. We don't consume event payload\n // contents — any new event for the active project signals that the agent-board\n // SQL may have changed, so we invalidate the ['tasks-hub'] queries to refetch.\n // Debounced (700ms) so a burst of tool events coalesces into one refetch.\n // Fallback: refetchInterval above still polls if the stream is unavailable;\n // EventSource's built-in auto-reconnect handles transient drops.\n const [isLive, setIsLive] = useState(false)\n useEffect(() => {\n // EventSource isn't present in some test/SSR environments — guard it.\n if (typeof EventSource === 'undefined') return\n\n const url = project\n ? `/api/events/stream?project=${encodeURIComponent(project)}`\n : '/api/events/stream'\n const es = new EventSource(url)\n let debounceTimer: ReturnType<typeof setTimeout> | null = null\n\n const scheduleRefresh = () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => {\n queryClient.invalidateQueries({ queryKey: ['tasks-hub'] })\n }, 700)\n }\n\n es.onopen = () => setIsLive(true)\n es.onmessage = (msg: MessageEvent) => {\n // The first frame is {\"type\":\"connected\"} — treat it as a liveness ping\n // but still harmless to schedule (debounced) a refresh on it.\n try {\n const data = JSON.parse(msg.data || '{}')\n if (data?.type === 'connected') {\n setIsLive(true)\n return\n }\n } catch {\n // ignore malformed payloads — still schedule a refresh below\n }\n scheduleRefresh()\n }\n es.onerror = () => {\n // Browser auto-reconnects; mark offline so the badge reflects degraded\n // state. The 30s poll keeps data fresh meanwhile.\n setIsLive(false)\n }\n\n return () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n es.close()\n }\n }, [project, queryClient])\n\n // Flatten all lanes → single task list (for list view + outcome filter).\n const allTasks = useMemo<TaskCard[]>(() => {\n if (!data) return []\n return [...data.lanes.pending, ...data.lanes.active, ...data.lanes.abandoned, ...data.lanes.completed]\n }, [data])\n\n // Outcome counts (all = total user task count, others = match count).\n // spec b1480935 (2026-06-01): outcome KPIs only reflect user tasks (callbacks\n // do not have meaningful outcomes — they're execution products of agents).\n const outcomeCounts: OutcomeCounts = useMemo(() => {\n // List view (decision b509fd91): chip counts dedupe by group so a multi-prompt\n // task counts once. Kanban view: per-task as before.\n if (isListView) {\n // 2026-06-10 KPI 分页假象 fix: bind to server-side window_aggregates\n // (whole-window distinct-task counts) instead of the page-local groups\n // map — the latter is LIMIT-clipped so tabs showed \"全部 (34)\" when the\n // 30d window really held ~700 tasks.\n const agg = promptData?.window_aggregates\n if (agg) {\n // decision 0c1549ec (2026-06-11): surface ALL six buckets (incl. the\n // residual `none` = 进行中 and `answered`) so the chip counts SUM to\n // 全部 (task_total): success+partial+failed+abandoned+answered+none.\n return {\n all: agg.task_total,\n success: agg.by_outcome.success,\n partial: agg.by_outcome.partial,\n failed: agg.by_outcome.failed,\n abandoned: agg.by_outcome.abandoned,\n answered: agg.by_outcome.answered,\n none: agg.by_outcome.none,\n }\n }\n // Fallback (older daemon without window_aggregates): page-local groups.\n // No `none`/`answered` server buckets available; derive `none` as the\n // residual so chips still roughly reconcile to 全部 on this old path.\n const groups = promptData ? Object.values(promptData.groups).filter(g => g.task_kind === 'user') : []\n const c: OutcomeCounts = { all: groups.length, success: 0, partial: 0, failed: 0, abandoned: 0, answered: 0, none: 0 }\n for (const g of groups) {\n if (g.outcome === 'success' || g.outcome === 'partial' || g.outcome === 'failed' || g.outcome === 'abandoned') c[g.outcome]++\n else if (g.status === 'abandoned') c.abandoned++\n else c.none++\n }\n return c\n }\n const userTasks = allTasks.filter(t => t.task_kind === 'user')\n const c: OutcomeCounts = { all: userTasks.length, success: 0, partial: 0, failed: 0, abandoned: 0, answered: 0, none: 0 }\n for (const t of userTasks) {\n if (t.outcome === 'success' || t.outcome === 'partial' || t.outcome === 'failed' || t.outcome === 'abandoned') c[t.outcome]++\n else if (t.status === 'abandoned') c.abandoned++\n else c.none++\n }\n return c\n }, [isListView, promptData, allTasks])\n\n // Filtered for list view (outcome + search).\n // Kanban: 5 lane = backend's 4 lanes + frontend split (failed extracted from completed).\n const kanbanLanes = useMemo<Record<string, TaskCard[]>>(() => {\n if (!data) return { pending: [], active: [], abandoned: [], failed: [], done: [] }\n const q = search.trim().toLowerCase()\n const filt = (cards: TaskCard[]): TaskCard[] => {\n if (!q) return cards\n return cards.filter(c => {\n const hay = [c.title, ...c.top_tools.map(x => x.tool), ...c.kb_pages.map(x => x.name)].join(' ').toLowerCase()\n return hay.includes(q)\n })\n }\n const completedAll = filt(data.lanes.completed)\n const failed = completedAll.filter(c => c.outcome === 'failed')\n const done = completedAll.filter(c => c.outcome !== 'failed')\n return {\n pending: filt(data.lanes.pending),\n active: filt(data.lanes.active),\n abandoned: filt(data.lanes.abandoned),\n failed,\n done,\n }\n }, [data, search])\n\n // KPI numbers (近 7d). avgDuration in minutes.\n //\n // 2026-05-26 fix: `total` now binds to server's `total_in_window` (unbounded\n // task count in the window) rather than `allTasks.length` — the latter is\n // capped at the lane LIMIT (default 40) so \"总任务数 (7d)\" was stuck at 40\n // even when real 7d task count was ~370. `failed`/`intercepted`/`avgSec`\n // still compute from the returned cards (out of scope of this fix; they\n // remain a sample over the cap, which is acceptable since the cards are\n // the most-recent-N and the chips are explicitly \"of what's shown\").\n const kpis = useMemo(() => {\n // List view (prompt-rows, decision b509fd91): KPIs bind to the server-side\n // window_aggregates (2026-06-10 fix) — whole-window DISTINCT-task numbers,\n // not the LIMIT-clipped page groups (\"总任务数\" showed 34 instead of ~700).\n if (isListView) {\n const agg = promptData?.window_aggregates\n // intercepts not available per-prompt (group-level aggregate skipped for\n // perf in prompt mode) — surface the prompt-row total instead.\n const promptTotal = promptData?.total_in_window ?? 0\n if (agg) {\n const total = agg.task_total\n return { total, failed: agg.by_outcome.failed, intercepted: 0, avgSec: agg.avg_duration_sec ?? 0, promptTotal, groupCount: total }\n }\n // Fallback (older daemon without window_aggregates): page-local groups\n // (OQ3 — dedupe by group so N prompts of one task don't inflate \"总任务数\").\n const groups = promptData ? Object.values(promptData.groups) : []\n const userGroups = groups.filter(g => g.task_kind === 'user')\n const total = userGroups.length\n const failed = userGroups.filter(g => g.outcome === 'failed').length\n const durations = userGroups.map(g => g.duration_sec).filter((s): s is number => typeof s === 'number' && s > 0)\n const avgSec = durations.length > 0 ? Math.round(durations.reduce((a, b) => a + b, 0) / durations.length) : 0\n return { total, failed, intercepted: 0, avgSec, promptTotal, groupCount: total }\n }\n // Kanban view (task-rows): spec b1480935 KPIs are user-task only.\n const userTasks = allTasks.filter(t => t.task_kind === 'user')\n const total = data?.total_in_window ?? userTasks.length\n const failed = userTasks.filter(t => t.outcome === 'failed').length\n const intercepted = userTasks.filter(t => (t.intercepts.deny + t.intercepts.warn) > 0).length\n const durations = userTasks.map(t => t.duration_sec).filter((s): s is number => typeof s === 'number' && s > 0)\n const avgSec = durations.length > 0 ? Math.round(durations.reduce((a, b) => a + b, 0) / durations.length) : 0\n return { total, failed, intercepted, avgSec, promptTotal: 0, groupCount: total }\n }, [isListView, promptData, allTasks, data])\n\n // Prompt rows for the list view — decision b509fd91. BOTH the outcome filter\n // (decision 0c1549ec) AND the free-text search (decision 540ed063, 2026-06-11)\n // are now applied server-side over the WHOLE window, so `promptData.rows`\n // already contains only the rows of the selected outcome bucket that match the\n // search term. The former page-local `.filter` over prompt_text + title was\n // the root cause of \"search finds nothing across pages\"; the backend is now\n // the single source of truth and we render the rows verbatim.\n const filteredPromptRows = useMemo<PromptRow[]>(() => {\n return promptData ? promptData.rows : []\n }, [promptData])\n\n // Order group ids by their first appearance in the (ts DESC) filtered rows, so\n // sub-headers段落 follow the same recency order as the rows.\n const orderedGroupIds = useMemo<string[]>(() => {\n const seen: string[] = []\n const set = new Set<string>()\n for (const r of filteredPromptRows) {\n if (!set.has(r.group_id)) { set.add(r.group_id); seen.push(r.group_id) }\n }\n return seen\n }, [filteredPromptRows])\n\n // URL setters\n const setUrl = (next: URLSearchParams) => setSearchParams(next, { replace: false })\n /** Helper: drop page/pageSize params (call when a filter/search/view change\n * should reset paging to page 1, default size). */\n const clearPaging = (next: URLSearchParams) => {\n next.delete('page')\n next.delete('pageSize')\n }\n const setOutcome = (key: OutcomeKey) => {\n const next = new URLSearchParams(searchParams)\n if (key === 'all') next.delete('outcome')\n else next.set('outcome', key)\n // Filter change → snap back to page 1 so user doesn't land on an empty page.\n clearPaging(next)\n setUrl(next)\n }\n const setView = (v: ViewMode) => {\n const next = new URLSearchParams(searchParams)\n if (v === 'list') next.delete('view')\n else next.set('view', v)\n // View toggle clears paging (kanban doesn't paginate; list starts fresh).\n clearPaging(next)\n setUrl(next)\n }\n const setSearchText = (v: string) => {\n const next = new URLSearchParams(searchParams)\n if (v) next.set('q', v); else next.delete('q')\n clearPaging(next)\n setUrl(next)\n }\n // spec b1480935 (2026-06-01): \"含系统任务\" chip toggle.\n const setIncludeSystem = (on: boolean) => {\n const next = new URLSearchParams(searchParams)\n if (on) next.set('sys', '1')\n else next.delete('sys')\n clearPaging(next)\n setUrl(next)\n }\n // Phase 2a (decision 29688066): 任务详情整页化——行/卡片点击从「开富抽屉」\n // (?task=<id>) 改为「跳整页路由」/tasks/:taskId(替换原 DetailDrawer 触发,\n // 见 spec「删 Drawer 触发,改路由跳转」)。DetailDrawer 保留仅供 ?session=\n // 深链兜底。decision 7ed8aaae 的 ?task= 富抽屉链路在本 Phase 退役。\n const openTaskDrawer = (taskId: string) => {\n navigate(`/tasks/${taskId}`)\n }\n // Pagination setters — persist page + pageSize in URL so refresh restores state.\n const setPage = (p: number) => {\n const next = new URLSearchParams(searchParams)\n if (p <= 1) next.delete('page')\n else next.set('page', String(p))\n setUrl(next)\n }\n const setPageSize = (size: number) => {\n const next = new URLSearchParams(searchParams)\n if (size === DEFAULT_PAGE_SIZE) next.delete('pageSize')\n else next.set('pageSize', String(size))\n // Changing page size jumps back to page 1 so user doesn't overshoot.\n next.delete('page')\n setUrl(next)\n }\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 12, height: '100%' }}>\n {/* Toolbar */}\n <Card bordered={false} bodyStyle={{ padding: '12px 16px' }} style={{ background: 'var(--color-bg-1)' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap', marginBottom: 12 }}>\n <Typography.Title heading={5} style={{ margin: 0 }}>我的任务</Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 近 {windowDays}d · {isListView ? '每行 = 1 条 user prompt(按任务分组)· 点行看执行链路' : '看板按任务卡 · 点卡片看详情'}\n </Typography.Text>\n <div style={{ marginLeft: 'auto', display: 'flex', gap: 8, alignItems: 'center' }}>\n <Tooltip content={isLive ? '实时已连接(SSE)' : '离线 · 30s 轮询兜底'}>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4, fontSize: 12, color: 'var(--color-text-3)' }}>\n <span\n style={{\n width: 8, height: 8, borderRadius: '50%',\n background: isLive ? 'var(--cf-tag-green, #00B42A)' : 'var(--color-text-4, #C9CDD4)',\n display: 'inline-block',\n }}\n />\n {isLive ? '实时' : '离线'}\n </span>\n </Tooltip>\n {/* 项目选择器 + 时间窗 (7d/30d/90d) 已去重 — 由全局顶栏权威驱动\n (decision 76a7241a)。任务页只保留任务特有控件:列表/看板切换、刷新。 */}\n <Radio.Group\n type=\"button\"\n size=\"small\"\n value={viewParam}\n onChange={(v: ViewMode) => setView(v)}\n >\n <Radio value=\"list\"><IconList /> 列表</Radio>\n <Radio value=\"kanban\"><IconApps /> 看板</Radio>\n </Radio.Group>\n <Button\n size=\"small\"\n icon={<IconRefresh />}\n loading={isListView ? promptFetching : isFetching}\n onClick={() => (isListView ? promptRefetch() : refetch())}\n >\n 刷新\n </Button>\n </div>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <OutcomeFilterChips active={outcomeParam} counts={outcomeCounts} onChange={setOutcome} />\n {/* spec b1480935 (2026-06-01): \"含系统任务\" chip. Clickable Tag toggles\n the URL ?sys=1 flag; refetch is automatic via queryKey. Default off\n so the dashboard stays clean of callback / image / system rows. */}\n <Tag\n checkable\n checked={includeSystem}\n onCheck={(checked: boolean) => setIncludeSystem(checked)}\n size=\"small\"\n color={includeSystem ? 'arcoblue' : undefined}\n data-testid=\"sys-toggle\"\n >\n 含系统任务\n </Tag>\n <Input.Search\n size=\"small\"\n placeholder=\"搜索 title / tool / KB / file...\"\n style={{ width: 280, marginLeft: 'auto' }}\n value={search}\n onChange={(v: string) => setSearchText(v)}\n allowClear\n />\n </div>\n </Card>\n\n {/* Compact KPI Row */}\n <Card bordered bodyStyle={{ padding: '12px 16px' }}>\n <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>\n <Statistic title={<span style={{ fontSize: 12, color: 'var(--color-text-3)' }}>总任务数 ({windowDays}d)</span>} value={kpis.total} groupSeparator />\n {isListView && (\n <Statistic title={<span style={{ fontSize: 12, color: 'var(--color-text-3)' }}>prompt 数 ({windowDays}d)</span>} value={kpis.promptTotal} groupSeparator />\n )}\n <div style={{ cursor: 'pointer' }} onClick={() => setOutcome('failed')} title=\"点击筛选失败任务\">\n <Statistic\n title={<span style={{ fontSize: 12, color: '#f44336' }}>失败 (可点击 →)</span>}\n value={kpis.failed}\n styleValue={{ color: kpis.failed > 0 ? '#f44336' : undefined }}\n />\n </div>\n {!isListView && (\n <Statistic title={<span style={{ fontSize: 12, color: 'var(--color-text-3)' }}>被拦截</span>} value={kpis.intercepted} styleValue={{ color: kpis.intercepted > 0 ? '#ff9800' : undefined }} />\n )}\n <Statistic title={<span style={{ fontSize: 12, color: 'var(--color-text-3)' }}>平均时长</span>} value={durationLabel(kpis.avgSec)} />\n </div>\n </Card>\n\n {/* Main content */}\n {isListView ? (\n // ── List view: prompt-rows grouped by task (decision b509fd91) ──────\n promptError ? (\n <Card bordered><Empty description=\"加载失败\" /></Card>\n ) : promptLoading || !promptData ? (\n <Card bordered><Skeleton animation text={{ rows: 6 }} /></Card>\n ) : (\n <div style={{ flex: 1, minHeight: 0, overflowY: 'auto', display: 'flex', flexDirection: 'column' }}>\n {filteredPromptRows.length === 0 ? (\n <Card bordered>\n <Empty\n description={\n search.length > 0\n ? `近 ${windowDays}d 无匹配「${search}」的 prompt(整窗)`\n : outcomeParam !== 'all'\n ? `近 ${windowDays}d 无 ${outcomeParam} 任务`\n : `近 ${windowDays}d 无 prompt(或被过滤掉)`\n }\n />\n {(outcomeParam !== 'all' || search.length > 0) && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', textAlign: 'center', padding: 12 }}>\n 整窗无匹配;清空筛选/搜索 (<Link to=\"?\">重置</Link>)\n </Typography.Text>\n )}\n </Card>\n ) : (\n <div style={{ flex: 1 }}>\n {/* OQ2: group sub-header分段 — each task is a段, its prompts平铺其下 */}\n {orderedGroupIds.map(gid => {\n const g = promptData.groups[gid]\n const rowsForGroup = filteredPromptRows.filter(r => r.group_id === gid)\n const laneTag = GROUP_LANE_LABEL[g?.lane ?? 'active']\n return (\n <div key={gid} style={{ marginBottom: 14 }} data-group-section={gid}>\n <div\n style={{\n position: 'sticky', top: 0, zIndex: 1,\n display: 'flex', alignItems: 'center', gap: 8,\n padding: '6px 10px', marginBottom: 6,\n background: 'var(--color-fill-1)', borderRadius: 6,\n flexWrap: 'wrap',\n }}\n >\n <Typography.Text\n style={{ fontSize: 12, fontWeight: 600, cursor: 'pointer' }}\n onClick={() => openTaskDrawer(gid)}\n >\n 🎯 {g?.title || '(空 title)'}\n </Typography.Text>\n <Tag size=\"small\" color={laneTag.color}>{laneTag.text}</Tag>\n <Tag size=\"small\" style={{ fontFamily: 'monospace' }}>{gid.slice(0, 8)}</Tag>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n {g?.prompt_count ?? rowsForGroup.length} 条 prompt\n </Typography.Text>\n </div>\n {rowsForGroup.map(r => (\n <PromptListItem key={r.event_id} row={r} group={g} onOpen={openTaskDrawer} />\n ))}\n </div>\n )\n })}\n </div>\n )}\n\n {/* Paginator — total binds to prompt-row total_in_window. */}\n {(promptData?.total_in_window ?? 0) > 0 && (\n <div\n style={{\n display: 'flex', justifyContent: 'space-between', alignItems: 'center',\n padding: '12px 4px', gap: 12, flexWrap: 'wrap',\n borderTop: '1px solid var(--color-border-2)', marginTop: 8,\n }}\n >\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n 近 {windowDays}d 共 {promptData?.total_in_window ?? 0} 条 prompt({promptData?.summary.total_groups ?? 0} 个分组)·\n 第 {page} / {Math.max(1, Math.ceil((promptData?.total_in_window ?? 0) / pageSize))} 页\n {outcomeParam !== 'all' && (\n <span style={{ marginLeft: 8 }}>· 已筛选「{outcomeParam}」(整窗)</span>\n )}\n {search.length > 0 && (\n <span style={{ marginLeft: 8 }}>· 已搜索「{search}」(整窗)</span>\n )}\n </Typography.Text>\n <Pagination\n current={page}\n total={promptData?.total_in_window ?? 0}\n pageSize={pageSize}\n sizeOptions={[...PAGE_SIZE_OPTIONS]}\n sizeCanChange\n showJumper\n size=\"small\"\n onChange={(p: number, ps: number) => {\n if (ps !== pageSize) setPageSize(ps)\n else setPage(p)\n }}\n onPageSizeChange={(ps: number) => setPageSize(ps)}\n />\n </div>\n )}\n </div>\n )\n ) : isError ? (\n <Card bordered><Empty description=\"加载失败\" /></Card>\n ) : isLoading || !data ? (\n <Card bordered><Skeleton animation text={{ rows: 6 }} /></Card>\n ) : (\n // ── Kanban view: task cards (OQ5 — kanban维持 task 卡) ──────────────\n <div style={{ display: 'flex', gap: 12, flex: 1, minHeight: 0, overflowX: 'auto' }}>\n {KANBAN_LANES.map(def => (\n <KanbanLane\n key={def.key}\n def={def}\n cards={kanbanLanes[def.key] ?? []}\n onOpen={openTaskDrawer}\n limit={kanbanLimit}\n onLoadMore={() => setKanbanLimit(n => n + KANBAN_PAGE_SIZE)}\n />\n ))}\n </div>\n )}\n\n {/* Drawer (driven by ?task= / ?session= in URL) */}\n <DetailDrawer />\n </div>\n )\n}\n"],"names":["outcomeIcon","o","IconCheckCircle","IconExclamationCircle","IconCloseCircle","IconPauseCircle","jsx","IconLoading","outcomeTone","TierBanner","banner","taskId","startedAt","tone","Card","jsxs","Tag","Typography","Fragment","DecisionCard","cardId","idx","title","oneLine","rightChip","expanded","onToggle","detail","e","IconDown","IconRight","safeJSONParse","s","summarizeDecisions","data","prompt","_b","_a","promptTimestamp","_c","intentInj","i","intentMeta","intent","kbInjs","kbMap","inj","arr","h","prev","_d","score","kbHits","a","b","name","m","skills","spawned","fileCounter","_e","p","fileList","path","count","filesChanged","commits","cmd","_f","out","text","outcome","isTrivialPath","intentEmpty","decisionEmpty","executionEmpty","computeBanner","hasSpec","pathLabel","firstSpawn","pathLabelFromRec","outcomeLabel","fileCount","commitCount","durationLabel","end","parseUTC","start","secs","computeOneLines","wf","layer","conf","promptSnip","specN","skillN","decisionParts","decision","spawnN","fileN","types","sp","exec","oLabel","_g","commitN","_h","reverted","violation","outParts","specStatusText","preBox","REASON_LABELS","reasonLabel","reason","hit","DECISION_ID_COMMENT_RE","extractDecisionIds","ids","cleaned","re","recommended","spw","IntentCard","SystemDecisionCard","st","sk","ExecutionCard","totalFileOps","sum","f","dur","durLabel","winFrom","nextSp","winTo","fileMap","fp","filesInWindow","cnt","IconFile","attrIdx","next","attrTag","outcomeTag","label","OutcomeCard","c","postJson","url","body","res","authFetch","j","approveTaskSpec","markTaskAbandoned","rerunTask","ActionRail","pendingSpecs","confirm","useConfirm","queryClient","useQueryClient","rerunPayload","setRerunPayload","useState","approvable","isFinalised","approveMut","useMutation","Message","err","abandonMut","rerunMut","handleAbandon","handleCopyPrompt","Tooltip","Button","IconRefresh","IconDashboard","Modal","IconCopy","formatDuration","startMs","endMs","max","flat","TrivialCard","summary","open","setOpen","duration","payload","IconUp","format","preStyle","Section","children","testId","DebugDrawer","timeline","visible","onClose","isTrivial","Drawer","Divider","fetchTimeline","formatTime","at","ms","source","EMOJI_FONT_STACK","KIND_META","TimelineRow","ev","meta","EventBody","decisionIds","cleanedPrompt","id","Link","ArtifactsTable","artifacts","rows","key","r","Table","val","TaskTimelineView","debugOpen","setDebugOpen","isLoading","isError","useQuery","IconRobot","IconSettings","Skeleton","defaultExpanded","parseExpandedFromQuery","qs","raw","part","v","serializeExpanded","set","TimelineErrorBoundary","Component","__publicField","error","info","TierContainer","searchParams","setSearchParams","useSearchParams","useMemo","fromUrl","toggle","useCallback","card","serialized","params","oneLines","fourCardFallback","fetchObserverStats","DaemonObserverBadge","_slot","denied","hinted","trivial","fetchTaskDetail","getToolIcon","toolName","IconEye","IconEdit","IconCodeBlock","IconSearch","IconCloud","IconCode","getRelativeTime","eventTime","startTime","diff","statusTag","status","TaskDetailContent","expandedEvents","setExpandedEvents","toggleEvent","allEmpty","normalizeTaskTitle","Descriptions","Empty","IconClockCircle","Timeline","event","msg","ntype","IconInfoCircle","isAgent","isFileOp","isExpanded","input","filePath","description","agentStatus","agentChanged","matchedSpawn","agentDot","_i","IconBook","skill","IconFolder","List","fetchSessionDetail","SessionDetailContent","sessionId","task","clsx","Terminal","tool","FileEdit","GitCommit","MessageSquare","DRAWER_WIDTH","resolveTarget","session","titleFor","DetailDrawer","target","close","DetailBody","CHIPS","OutcomeFilterChips","active","counts","onChange","isActive","fetchBoard","project","opts","fetchPromptBoard","searchTerm","tsLabel","iso","sec","relativeAge","kindLabel","kind","isMutedKind","GROUP_LANE_LABEL","PromptListItem","row","group","onOpen","display","lane","laneTag","OutcomeTag","KANBAN_LANES","KanbanLane","def","cards","limit","onLoadMore","remaining","muted","leftBorderColor","outcomeBorderColor","TasksHubPage","navigate","useNavigate","kbProjects","kbProjectsKey","listKbProjects","projectSelection","useProject","currentDaemonProject","resolveEffectiveProject","outcomeParam","viewParam","search","windowDays","useTimeWindow","includeSystem","PAGE_SIZE_OPTIONS","DEFAULT_PAGE_SIZE","KANBAN_FETCH_LIMIT","pageParam","pageSizeRaw","page","pageSize","KANBAN_PAGE_SIZE","kanbanLimit","setKanbanLimit","useEffect","prevWindowRef","useRef","fetchLimit","fetchOffset","isListView","refetch","isFetching","keepPreviousData","promptData","promptLoading","promptError","promptRefetch","promptFetching","isLive","setIsLive","es","debounceTimer","scheduleRefresh","allTasks","outcomeCounts","agg","groups","g","userTasks","t","kanbanLanes","q","filt","x","completedAll","failed","done","kpis","promptTotal","total","userGroups","durations","avgSec","intercepted","filteredPromptRows","orderedGroupIds","seen","setUrl","clearPaging","setOutcome","setView","setSearchText","setIncludeSystem","on","openTaskDrawer","setPage","setPageSize","size","Radio","IconList","IconApps","checked","Input","Statistic","gid","rowsForGroup","Pagination","ps","n"],"mappings":"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"}
|