@winspan/claude-forge 9.2.0 → 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.
Files changed (591) hide show
  1. package/DEVELOPMENT.md +80 -19
  2. package/README.md +13 -6
  3. package/dist/catalogs/agents.json +19 -24
  4. package/dist/catalogs/skills.json +139 -27
  5. package/dist/claudemd/templates/swarm-protocol.md +1 -1
  6. package/dist/cli/commands/agent.d.ts +169 -0
  7. package/dist/cli/commands/agent.d.ts.map +1 -0
  8. package/dist/cli/commands/agent.js +690 -0
  9. package/dist/cli/commands/agent.js.map +1 -0
  10. package/dist/cli/commands/codegraph.d.ts +17 -0
  11. package/dist/cli/commands/codegraph.d.ts.map +1 -0
  12. package/dist/cli/commands/codegraph.js +263 -0
  13. package/dist/cli/commands/codegraph.js.map +1 -0
  14. package/dist/cli/commands/decisions.d.ts.map +1 -1
  15. package/dist/cli/commands/decisions.js +46 -9
  16. package/dist/cli/commands/decisions.js.map +1 -1
  17. package/dist/cli/commands/executions.d.ts.map +1 -1
  18. package/dist/cli/commands/executions.js +2 -1
  19. package/dist/cli/commands/executions.js.map +1 -1
  20. package/dist/cli/commands/insights-goal-check.d.ts +5 -1
  21. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -1
  22. package/dist/cli/commands/insights-goal-check.js +15 -15
  23. package/dist/cli/commands/insights-goal-check.js.map +1 -1
  24. package/dist/cli/commands/knowledge.d.ts +51 -0
  25. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  26. package/dist/cli/commands/knowledge.js +202 -29
  27. package/dist/cli/commands/knowledge.js.map +1 -1
  28. package/dist/cli/commands/loop.d.ts +95 -0
  29. package/dist/cli/commands/loop.d.ts.map +1 -0
  30. package/dist/cli/commands/loop.js +408 -0
  31. package/dist/cli/commands/loop.js.map +1 -0
  32. package/dist/cli/commands/maintenance.d.ts +33 -0
  33. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  34. package/dist/cli/commands/maintenance.js +75 -0
  35. package/dist/cli/commands/maintenance.js.map +1 -0
  36. package/dist/cli/commands/mcp.d.ts +23 -0
  37. package/dist/cli/commands/mcp.d.ts.map +1 -1
  38. package/dist/cli/commands/mcp.js +82 -0
  39. package/dist/cli/commands/mcp.js.map +1 -1
  40. package/dist/cli/commands/skills.d.ts +131 -0
  41. package/dist/cli/commands/skills.d.ts.map +1 -1
  42. package/dist/cli/commands/skills.js +409 -9
  43. package/dist/cli/commands/skills.js.map +1 -1
  44. package/dist/cli/commands/stats.d.ts.map +1 -1
  45. package/dist/cli/commands/stats.js +9 -2
  46. package/dist/cli/commands/stats.js.map +1 -1
  47. package/dist/cli/index.js +8 -0
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/core/constants.d.ts +37 -0
  50. package/dist/core/constants.d.ts.map +1 -1
  51. package/dist/core/constants.js +43 -0
  52. package/dist/core/constants.js.map +1 -1
  53. package/dist/core/diagnostics/checks.d.ts.map +1 -1
  54. package/dist/core/diagnostics/checks.js +2 -1
  55. package/dist/core/diagnostics/checks.js.map +1 -1
  56. package/dist/core/diagnostics/daemon-status.d.ts +1 -1
  57. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -1
  58. package/dist/core/diagnostics/daemon-status.js +1 -1
  59. package/dist/core/diagnostics/daemon-status.js.map +1 -1
  60. package/dist/core/diagnostics/entropy-checks.d.ts +3 -2
  61. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -1
  62. package/dist/core/diagnostics/entropy-checks.js +10 -5
  63. package/dist/core/diagnostics/entropy-checks.js.map +1 -1
  64. package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
  65. package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
  66. package/dist/core/diagnostics/heartbeat-reader.js +50 -0
  67. package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
  68. package/dist/core/event-fields.d.ts +27 -0
  69. package/dist/core/event-fields.d.ts.map +1 -1
  70. package/dist/core/event-fields.js +43 -0
  71. package/dist/core/event-fields.js.map +1 -1
  72. package/dist/core/governance/global-inject.d.ts +34 -4
  73. package/dist/core/governance/global-inject.d.ts.map +1 -1
  74. package/dist/core/governance/global-inject.js +80 -25
  75. package/dist/core/governance/global-inject.js.map +1 -1
  76. package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
  77. package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
  78. package/dist/core/insights/agent-anchor-guard.js +119 -0
  79. package/dist/core/insights/agent-anchor-guard.js.map +1 -0
  80. package/dist/core/insights/agent-distill-context.d.ts +55 -0
  81. package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
  82. package/dist/core/insights/agent-distill-context.js +146 -0
  83. package/dist/core/insights/agent-distill-context.js.map +1 -0
  84. package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
  85. package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
  86. package/dist/core/insights/agent-distill-spawn.js +179 -0
  87. package/dist/core/insights/agent-distill-spawn.js.map +1 -0
  88. package/dist/core/insights/agent-drift.d.ts +66 -0
  89. package/dist/core/insights/agent-drift.d.ts.map +1 -0
  90. package/dist/core/insights/agent-drift.js +109 -0
  91. package/dist/core/insights/agent-drift.js.map +1 -0
  92. package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
  93. package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
  94. package/dist/core/insights/agent-evolution-sources.js +36 -0
  95. package/dist/core/insights/agent-evolution-sources.js.map +1 -0
  96. package/dist/core/insights/agent-health.d.ts +142 -0
  97. package/dist/core/insights/agent-health.d.ts.map +1 -0
  98. package/dist/core/insights/agent-health.js +296 -0
  99. package/dist/core/insights/agent-health.js.map +1 -0
  100. package/dist/core/insights/agent-patch-apply.d.ts +45 -0
  101. package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
  102. package/dist/core/insights/agent-patch-apply.js +165 -0
  103. package/dist/core/insights/agent-patch-apply.js.map +1 -0
  104. package/dist/core/insights/agent-suggest.d.ts +128 -0
  105. package/dist/core/insights/agent-suggest.d.ts.map +1 -0
  106. package/dist/core/insights/agent-suggest.js +284 -0
  107. package/dist/core/insights/agent-suggest.js.map +1 -0
  108. package/dist/core/insights/coverage-tiers.d.ts +46 -0
  109. package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
  110. package/dist/core/insights/coverage-tiers.js +95 -0
  111. package/dist/core/insights/coverage-tiers.js.map +1 -0
  112. package/dist/{daemon/services → core/insights}/experience-extractor.d.ts +0 -7
  113. package/dist/core/insights/experience-extractor.d.ts.map +1 -0
  114. package/dist/{daemon/services → core/insights}/experience-extractor.js +5 -9
  115. package/dist/core/insights/experience-extractor.js.map +1 -0
  116. package/dist/{daemon/services → core/insights}/violation-reporter.d.ts +20 -1
  117. package/dist/core/insights/violation-reporter.d.ts.map +1 -0
  118. package/dist/{daemon/services → core/insights}/violation-reporter.js +56 -4
  119. package/dist/core/insights/violation-reporter.js.map +1 -0
  120. package/dist/core/loop/loop-engine.d.ts +140 -0
  121. package/dist/core/loop/loop-engine.d.ts.map +1 -0
  122. package/dist/core/loop/loop-engine.js +266 -0
  123. package/dist/core/loop/loop-engine.js.map +1 -0
  124. package/dist/core/queue/index.d.ts.map +1 -1
  125. package/dist/core/queue/index.js +2 -1
  126. package/dist/core/queue/index.js.map +1 -1
  127. package/dist/core/storage/base.d.ts +159 -0
  128. package/dist/core/storage/base.d.ts.map +1 -1
  129. package/dist/core/storage/base.js +523 -0
  130. package/dist/core/storage/base.js.map +1 -1
  131. package/dist/core/storage/codegraph-types.d.ts +79 -0
  132. package/dist/core/storage/codegraph-types.d.ts.map +1 -0
  133. package/dist/core/storage/codegraph-types.js +14 -0
  134. package/dist/core/storage/codegraph-types.js.map +1 -0
  135. package/dist/core/storage/codegraph.d.ts +186 -0
  136. package/dist/core/storage/codegraph.d.ts.map +1 -0
  137. package/dist/core/storage/codegraph.js +452 -0
  138. package/dist/core/storage/codegraph.js.map +1 -0
  139. package/dist/core/storage/decisions.d.ts +30 -5
  140. package/dist/core/storage/decisions.d.ts.map +1 -1
  141. package/dist/core/storage/decisions.js +45 -13
  142. package/dist/core/storage/decisions.js.map +1 -1
  143. package/dist/core/storage/events.d.ts +127 -0
  144. package/dist/core/storage/events.d.ts.map +1 -1
  145. package/dist/core/storage/events.js +318 -3
  146. package/dist/core/storage/events.js.map +1 -1
  147. package/dist/core/storage/feedback.d.ts +3 -23
  148. package/dist/core/storage/feedback.d.ts.map +1 -1
  149. package/dist/core/storage/feedback.js +37 -38
  150. package/dist/core/storage/feedback.js.map +1 -1
  151. package/dist/core/storage/injections.d.ts +40 -0
  152. package/dist/core/storage/injections.d.ts.map +1 -1
  153. package/dist/core/storage/injections.js +69 -0
  154. package/dist/core/storage/injections.js.map +1 -1
  155. package/dist/core/storage/knowledge.d.ts +226 -0
  156. package/dist/core/storage/knowledge.d.ts.map +1 -1
  157. package/dist/core/storage/knowledge.js +391 -4
  158. package/dist/core/storage/knowledge.js.map +1 -1
  159. package/dist/core/storage/pipeline-rollup.d.ts +1 -7
  160. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -1
  161. package/dist/core/storage/pipeline-rollup.js +18 -57
  162. package/dist/core/storage/pipeline-rollup.js.map +1 -1
  163. package/dist/core/storage/routing.d.ts +34 -0
  164. package/dist/core/storage/routing.d.ts.map +1 -1
  165. package/dist/core/storage/routing.js +92 -2
  166. package/dist/core/storage/routing.js.map +1 -1
  167. package/dist/core/storage/rows.d.ts +5 -25
  168. package/dist/core/storage/rows.d.ts.map +1 -1
  169. package/dist/core/storage/schema.sql +92 -27
  170. package/dist/core/storage/sessions.d.ts.map +1 -1
  171. package/dist/core/storage/sessions.js +2 -1
  172. package/dist/core/storage/sessions.js.map +1 -1
  173. package/dist/core/storage/skills.d.ts +159 -0
  174. package/dist/core/storage/skills.d.ts.map +1 -1
  175. package/dist/core/storage/skills.js +350 -4
  176. package/dist/core/storage/skills.js.map +1 -1
  177. package/dist/core/storage/sqlite.d.ts +81 -25
  178. package/dist/core/storage/sqlite.d.ts.map +1 -1
  179. package/dist/core/storage/sqlite.js +143 -45
  180. package/dist/core/storage/sqlite.js.map +1 -1
  181. package/dist/core/storage/tasks.d.ts +270 -0
  182. package/dist/core/storage/tasks.d.ts.map +1 -1
  183. package/dist/core/storage/tasks.js +495 -16
  184. package/dist/core/storage/tasks.js.map +1 -1
  185. package/dist/core/storage/tool-intercepts.d.ts +1 -1
  186. package/dist/core/storage/tool-intercepts.js +1 -1
  187. package/dist/core/types.d.ts +26 -3
  188. package/dist/core/types.d.ts.map +1 -1
  189. package/dist/core/types.js +1 -3
  190. package/dist/core/types.js.map +1 -1
  191. package/dist/core/utils/binary-paths.d.ts +32 -0
  192. package/dist/core/utils/binary-paths.d.ts.map +1 -1
  193. package/dist/core/utils/binary-paths.js +52 -0
  194. package/dist/core/utils/binary-paths.js.map +1 -1
  195. package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
  196. package/dist/{skills/distill → core/utils}/claude-cli-resolver.js +1 -1
  197. package/dist/core/utils/claude-cli-resolver.js.map +1 -0
  198. package/dist/core/utils/claude-cli-spawn.d.ts +1 -1
  199. package/dist/core/utils/claude-cli-spawn.js +2 -2
  200. package/dist/core/utils/claude-cli-spawn.js.map +1 -1
  201. package/dist/core/utils/noise-prompt.d.ts +1 -1
  202. package/dist/core/utils/noise-prompt.js +1 -1
  203. package/dist/core/utils/time.d.ts +26 -0
  204. package/dist/core/utils/time.d.ts.map +1 -1
  205. package/dist/core/utils/time.js +33 -0
  206. package/dist/core/utils/time.js.map +1 -1
  207. package/dist/daemon/config-store.d.ts.map +1 -1
  208. package/dist/daemon/config-store.js +14 -5
  209. package/dist/daemon/config-store.js.map +1 -1
  210. package/dist/daemon/event-parser.d.ts.map +1 -1
  211. package/dist/daemon/event-parser.js +5 -0
  212. package/dist/daemon/event-parser.js.map +1 -1
  213. package/dist/daemon/handlers/post-tool-use.d.ts +24 -16
  214. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  215. package/dist/daemon/handlers/post-tool-use.js +76 -116
  216. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  217. package/dist/daemon/handlers/pre-tool-use.d.ts +35 -10
  218. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
  219. package/dist/daemon/handlers/pre-tool-use.js +71 -38
  220. package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
  221. package/dist/daemon/handlers/stop.d.ts +20 -0
  222. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  223. package/dist/daemon/handlers/stop.js +96 -8
  224. package/dist/daemon/handlers/stop.js.map +1 -1
  225. package/dist/daemon/handlers/user-prompt.d.ts +16 -1
  226. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  227. package/dist/daemon/handlers/user-prompt.js +97 -56
  228. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  229. package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
  230. package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
  231. package/dist/daemon/handlers/violation-content-backfill.js +167 -0
  232. package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
  233. package/dist/daemon/index.d.ts +19 -0
  234. package/dist/daemon/index.d.ts.map +1 -1
  235. package/dist/daemon/index.js +125 -200
  236. package/dist/daemon/index.js.map +1 -1
  237. package/dist/daemon/rules/defaults.d.ts.map +1 -1
  238. package/dist/daemon/rules/defaults.js +151 -64
  239. package/dist/daemon/rules/defaults.js.map +1 -1
  240. package/dist/daemon/rules/types.d.ts +28 -22
  241. package/dist/daemon/rules/types.d.ts.map +1 -1
  242. package/dist/daemon/rules/workflow-defaults.js +9 -9
  243. package/dist/daemon/rules/workflow-defaults.js.map +1 -1
  244. package/dist/daemon/services/codegraph-sync.d.ts +94 -0
  245. package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
  246. package/dist/daemon/services/codegraph-sync.js +159 -0
  247. package/dist/daemon/services/codegraph-sync.js.map +1 -0
  248. package/dist/daemon/services/decision-hint.d.ts +47 -10
  249. package/dist/daemon/services/decision-hint.d.ts.map +1 -1
  250. package/dist/daemon/services/decision-hint.js +99 -24
  251. package/dist/daemon/services/decision-hint.js.map +1 -1
  252. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -1
  253. package/dist/daemon/services/event-ttl-sweep.js +3 -2
  254. package/dist/daemon/services/event-ttl-sweep.js.map +1 -1
  255. package/dist/daemon/services/feedback-aggregator.d.ts +14 -26
  256. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -1
  257. package/dist/daemon/services/feedback-aggregator.js +23 -63
  258. package/dist/daemon/services/feedback-aggregator.js.map +1 -1
  259. package/dist/daemon/services/heartbeat-writer.d.ts +6 -15
  260. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -1
  261. package/dist/daemon/services/heartbeat-writer.js +7 -36
  262. package/dist/daemon/services/heartbeat-writer.js.map +1 -1
  263. package/dist/daemon/services/kb-injector.d.ts +1 -1
  264. package/dist/daemon/services/kb-injector.d.ts.map +1 -1
  265. package/dist/daemon/services/kb-injector.js +10 -2
  266. package/dist/daemon/services/kb-injector.js.map +1 -1
  267. package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
  268. package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
  269. package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
  270. package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
  271. package/dist/daemon/services/loop-hint.d.ts +139 -0
  272. package/dist/daemon/services/loop-hint.d.ts.map +1 -0
  273. package/dist/daemon/services/loop-hint.js +272 -0
  274. package/dist/daemon/services/loop-hint.js.map +1 -0
  275. package/dist/daemon/services/outcome-classification-service.js +1 -1
  276. package/dist/daemon/services/outcome-classification-service.js.map +1 -1
  277. package/dist/daemon/services/task-segmenter.d.ts +11 -0
  278. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  279. package/dist/daemon/services/task-segmenter.js +48 -2
  280. package/dist/daemon/services/task-segmenter.js.map +1 -1
  281. package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
  282. package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
  283. package/dist/daemon/startup/maintenance-schedulers.js +294 -0
  284. package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
  285. package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
  286. package/dist/daemon/templates/agents/claudemd-writer.md +1 -0
  287. package/dist/daemon/templates/agents/coder.md +165 -8
  288. package/dist/daemon/templates/agents/decision-maker.md +107 -21
  289. package/dist/daemon/templates/agents/doc-reviewer.md +4 -1
  290. package/dist/daemon/templates/agents/harness-debug-full.md +85 -3
  291. package/dist/daemon/templates/agents/knowledge-builder.md +1 -0
  292. package/dist/daemon/templates/agents/patch-applier.md +1 -0
  293. package/dist/daemon/templates/agents/planner.md +55 -3
  294. package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
  295. package/dist/daemon/templates/agents/skill-distiller.md +1 -0
  296. package/dist/daemon/templates/agents/task-boundary-classifier.md +1 -0
  297. package/dist/daemon/templates/agents/verify-agent.md +128 -5
  298. package/dist/hooks/stop.sh +7 -1
  299. package/dist/knowledge/builder.js +36 -7
  300. package/dist/knowledge/builder.js.map +1 -1
  301. package/dist/knowledge/constants.d.ts +10 -5
  302. package/dist/knowledge/constants.d.ts.map +1 -1
  303. package/dist/knowledge/constants.js +10 -5
  304. package/dist/knowledge/constants.js.map +1 -1
  305. package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
  306. package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
  307. package/dist/knowledge/graph/edge-extractor.js +242 -0
  308. package/dist/knowledge/graph/edge-extractor.js.map +1 -0
  309. package/dist/knowledge/graph/impact.d.ts +73 -0
  310. package/dist/knowledge/graph/impact.d.ts.map +1 -0
  311. package/dist/knowledge/graph/impact.js +94 -0
  312. package/dist/knowledge/graph/impact.js.map +1 -0
  313. package/dist/knowledge/graph/types.d.ts +22 -0
  314. package/dist/knowledge/graph/types.d.ts.map +1 -0
  315. package/dist/knowledge/graph/types.js +13 -0
  316. package/dist/knowledge/graph/types.js.map +1 -0
  317. package/dist/knowledge/prompt.d.ts +9 -0
  318. package/dist/knowledge/prompt.d.ts.map +1 -1
  319. package/dist/knowledge/prompt.js +17 -5
  320. package/dist/knowledge/prompt.js.map +1 -1
  321. package/dist/knowledge/query.d.ts +13 -0
  322. package/dist/knowledge/query.d.ts.map +1 -1
  323. package/dist/knowledge/query.js +107 -10
  324. package/dist/knowledge/query.js.map +1 -1
  325. package/dist/knowledge/repo-map.d.ts +11 -5
  326. package/dist/knowledge/repo-map.d.ts.map +1 -1
  327. package/dist/knowledge/repo-map.js +42 -3
  328. package/dist/knowledge/repo-map.js.map +1 -1
  329. package/dist/knowledge/validator.d.ts.map +1 -1
  330. package/dist/knowledge/validator.js +69 -2
  331. package/dist/knowledge/validator.js.map +1 -1
  332. package/dist/mcp/server.d.ts +64 -8
  333. package/dist/mcp/server.d.ts.map +1 -1
  334. package/dist/mcp/server.js +233 -18
  335. package/dist/mcp/server.js.map +1 -1
  336. package/dist/skills/distill/distiller.js +1 -1
  337. package/dist/skills/distill/distiller.js.map +1 -1
  338. package/dist/skills/distilled/distilled-api-design.md +4 -0
  339. package/dist/skills/distilled/distilled-brainstorming.md +79 -0
  340. package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
  341. package/dist/skills/distilled/distilled-canvas-design.md +128 -0
  342. package/dist/skills/distilled/distilled-claude-api.md +185 -0
  343. package/dist/skills/distilled/distilled-creator.md +5 -2
  344. package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
  345. package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
  346. package/dist/skills/distilled/distilled-docx.md +231 -0
  347. package/dist/skills/distilled/distilled-executing-plans.md +85 -50
  348. package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
  349. package/dist/skills/distilled/distilled-frontend-design.md +118 -0
  350. package/dist/skills/distilled/distilled-harness-engineering.md +1 -1
  351. package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
  352. package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
  353. package/dist/skills/distilled/distilled-systematic-debugging.md +108 -260
  354. package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
  355. package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
  356. package/dist/skills/distilled/distilled-verification-before-completion.md +88 -78
  357. package/dist/skills/distilled/distilled-writing-skills.md +175 -0
  358. package/dist/skills/registry.d.ts +10 -50
  359. package/dist/skills/registry.d.ts.map +1 -1
  360. package/dist/skills/registry.js +7 -118
  361. package/dist/skills/registry.js.map +1 -1
  362. package/dist/skills/tools/pipeline-suggest.js +2 -2
  363. package/dist/skills/tools/pipeline-suggest.js.map +1 -1
  364. package/dist/skills/tools/skill-invoke.d.ts +2 -1
  365. package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
  366. package/dist/skills/tools/skill-invoke.js +3 -1
  367. package/dist/skills/tools/skill-invoke.js.map +1 -1
  368. package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
  369. package/dist/web/analytics/anti-pattern-detector.js +6 -1
  370. package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
  371. package/dist/web/analytics/drift-detector.d.ts +6 -0
  372. package/dist/web/analytics/drift-detector.d.ts.map +1 -1
  373. package/dist/web/analytics/drift-detector.js +15 -8
  374. package/dist/web/analytics/drift-detector.js.map +1 -1
  375. package/dist/web/analytics/weekly-report.d.ts +13 -0
  376. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  377. package/dist/web/analytics/weekly-report.js +17 -3
  378. package/dist/web/analytics/weekly-report.js.map +1 -1
  379. package/dist/web/routes/_helpers.d.ts +31 -0
  380. package/dist/web/routes/_helpers.d.ts.map +1 -1
  381. package/dist/web/routes/_helpers.js +33 -0
  382. package/dist/web/routes/_helpers.js.map +1 -1
  383. package/dist/web/routes/agent-distill.d.ts +49 -0
  384. package/dist/web/routes/agent-distill.d.ts.map +1 -0
  385. package/dist/web/routes/agent-distill.js +526 -0
  386. package/dist/web/routes/agent-distill.js.map +1 -0
  387. package/dist/web/routes/config.d.ts +56 -0
  388. package/dist/web/routes/config.d.ts.map +1 -0
  389. package/dist/web/routes/config.js +243 -0
  390. package/dist/web/routes/config.js.map +1 -0
  391. package/dist/web/routes/decisions.js +1 -1
  392. package/dist/web/routes/decisions.js.map +1 -1
  393. package/dist/web/routes/error-handler.d.ts +0 -4
  394. package/dist/web/routes/error-handler.d.ts.map +1 -1
  395. package/dist/web/routes/error-handler.js +0 -8
  396. package/dist/web/routes/error-handler.js.map +1 -1
  397. package/dist/web/routes/events.d.ts.map +1 -1
  398. package/dist/web/routes/events.js +2 -1
  399. package/dist/web/routes/events.js.map +1 -1
  400. package/dist/web/routes/insights.d.ts.map +1 -1
  401. package/dist/web/routes/insights.js +0 -0
  402. package/dist/web/routes/insights.js.map +1 -1
  403. package/dist/web/routes/knowledge.d.ts +43 -2
  404. package/dist/web/routes/knowledge.d.ts.map +1 -1
  405. package/dist/web/routes/knowledge.js +117 -6
  406. package/dist/web/routes/knowledge.js.map +1 -1
  407. package/dist/web/routes/pipeline.d.ts +0 -9
  408. package/dist/web/routes/pipeline.d.ts.map +1 -1
  409. package/dist/web/routes/pipeline.js +0 -4
  410. package/dist/web/routes/pipeline.js.map +1 -1
  411. package/dist/web/routes/rules.d.ts.map +1 -1
  412. package/dist/web/routes/rules.js +20 -6
  413. package/dist/web/routes/rules.js.map +1 -1
  414. package/dist/web/routes/sessions.d.ts.map +1 -1
  415. package/dist/web/routes/sessions.js +8 -7
  416. package/dist/web/routes/sessions.js.map +1 -1
  417. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  418. package/dist/web/routes/skill-stats.js +153 -16
  419. package/dist/web/routes/skill-stats.js.map +1 -1
  420. package/dist/web/routes/skills-distill.js +1 -1
  421. package/dist/web/routes/skills-distill.js.map +1 -1
  422. package/dist/web/routes/stats.d.ts.map +1 -1
  423. package/dist/web/routes/stats.js +2 -1
  424. package/dist/web/routes/stats.js.map +1 -1
  425. package/dist/web/routes/task-timeline.d.ts +95 -19
  426. package/dist/web/routes/task-timeline.d.ts.map +1 -1
  427. package/dist/web/routes/task-timeline.js +344 -88
  428. package/dist/web/routes/task-timeline.js.map +1 -1
  429. package/dist/web/routes/tasks.d.ts.map +1 -1
  430. package/dist/web/routes/tasks.js +52 -30
  431. package/dist/web/routes/tasks.js.map +1 -1
  432. package/dist/web/routes/violations.d.ts +1 -1
  433. package/dist/web/routes/violations.d.ts.map +1 -1
  434. package/dist/web/routes/violations.js +3 -2
  435. package/dist/web/routes/violations.js.map +1 -1
  436. package/dist/web/server.d.ts.map +1 -1
  437. package/dist/web/server.js +20 -0
  438. package/dist/web/server.js.map +1 -1
  439. package/dist/web/services/agent-distill-manager.d.ts +122 -0
  440. package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
  441. package/dist/web/services/agent-distill-manager.js +397 -0
  442. package/dist/web/services/agent-distill-manager.js.map +1 -0
  443. package/dist/web/services/distill-manager.d.ts +47 -0
  444. package/dist/web/services/distill-manager.d.ts.map +1 -1
  445. package/dist/web/services/distill-manager.js +103 -0
  446. package/dist/web/services/distill-manager.js.map +1 -1
  447. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
  448. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
  449. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
  450. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
  451. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
  452. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
  453. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
  454. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
  455. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
  456. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
  457. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
  458. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
  459. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
  460. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
  461. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
  462. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
  463. package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
  464. package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
  465. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
  466. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
  467. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
  468. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
  469. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
  470. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
  471. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
  472. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
  473. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
  474. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
  475. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
  476. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
  477. package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js → MarkdownRenderer-DlDQNihj.js} +2 -2
  478. package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js.map → MarkdownRenderer-DlDQNihj.js.map} +1 -1
  479. package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
  480. package/dist/web/static/assets/{NotFound-BQPh0vaF.js.map → NotFound-LMzbP51V.js.map} +1 -1
  481. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
  482. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
  483. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
  484. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
  485. package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
  486. package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
  487. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
  488. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
  489. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
  490. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
  491. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
  492. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
  493. package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
  494. package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
  495. package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
  496. package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
  497. package/dist/web/static/assets/{index-7bl3kbcx.css → index-B_v_MKlb.css} +1 -1
  498. package/dist/web/static/assets/index-DileOOE4.js +4 -0
  499. package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
  500. package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
  501. package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
  502. package/dist/web/static/assets/{outcome-DUn1NjlC.js → outcome-BKGy9azt.js} +2 -2
  503. package/dist/web/static/assets/{outcome-DUn1NjlC.js.map → outcome-BKGy9azt.js.map} +1 -1
  504. package/dist/web/static/assets/{query-S6X1S7K9.js → query-CgCOpYWf.js} +2 -2
  505. package/dist/web/static/assets/{query-S6X1S7K9.js.map → query-CgCOpYWf.js.map} +1 -1
  506. package/dist/web/static/assets/{react-router-JVUrkhdd.js → react-router-Cxmg8RuL.js} +3 -3
  507. package/dist/web/static/assets/{react-router-JVUrkhdd.js.map → react-router-Cxmg8RuL.js.map} +1 -1
  508. package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js → syntax-highlighter-BDYycNja.js} +3 -3
  509. package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js.map → syntax-highlighter-BDYycNja.js.map} +1 -1
  510. package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
  511. package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
  512. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
  513. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
  514. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
  515. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
  516. package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
  517. package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
  518. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
  519. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
  520. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
  521. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
  522. package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
  523. package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
  524. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
  525. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
  526. package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
  527. package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
  528. package/dist/web/static/index.html +6 -6
  529. package/package.json +5 -3
  530. package/dist/core/storage/workflow-recommendations.d.ts +0 -124
  531. package/dist/core/storage/workflow-recommendations.d.ts.map +0 -1
  532. package/dist/core/storage/workflow-recommendations.js +0 -274
  533. package/dist/core/storage/workflow-recommendations.js.map +0 -1
  534. package/dist/daemon/services/experience-extractor.d.ts.map +0 -1
  535. package/dist/daemon/services/experience-extractor.js.map +0 -1
  536. package/dist/daemon/services/violation-reporter.d.ts.map +0 -1
  537. package/dist/daemon/services/violation-reporter.js.map +0 -1
  538. package/dist/daemon/templates/agents/harness-hotfix.md +0 -99
  539. package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +0 -104
  540. package/dist/daemon/templates/agents/refactor-specialist.md +0 -98
  541. package/dist/skills/distill/claude-cli-resolver.d.ts.map +0 -1
  542. package/dist/skills/distill/claude-cli-resolver.js.map +0 -1
  543. package/dist/skills/distilled/distilled-defi-amm-security.md +0 -293
  544. package/dist/skills/keyword-score.d.ts +0 -29
  545. package/dist/skills/keyword-score.d.ts.map +0 -1
  546. package/dist/skills/keyword-score.js +0 -54
  547. package/dist/skills/keyword-score.js.map +0 -1
  548. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +0 -2
  549. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +0 -1
  550. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +0 -2
  551. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +0 -1
  552. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +0 -3
  553. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +0 -1
  554. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +0 -2
  555. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +0 -1
  556. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +0 -2
  557. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +0 -1
  558. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +0 -2
  559. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +0 -1
  560. package/dist/web/static/assets/DriftTab-DqpepOhI.js +0 -2
  561. package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +0 -1
  562. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +0 -3
  563. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +0 -1
  564. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +0 -2
  565. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +0 -1
  566. package/dist/web/static/assets/NotFound-BQPh0vaF.js +0 -2
  567. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +0 -2
  568. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +0 -1
  569. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +0 -2
  570. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +0 -1
  571. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +0 -2
  572. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +0 -1
  573. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +0 -2
  574. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +0 -1
  575. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +0 -2
  576. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +0 -1
  577. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +0 -6
  578. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +0 -1
  579. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +0 -3
  580. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +0 -1
  581. package/dist/web/static/assets/arco-Bhi3a6Qp.js +0 -14
  582. package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +0 -1
  583. package/dist/web/static/assets/charts-BuHQWDbQ.js +0 -37
  584. package/dist/web/static/assets/charts-BuHQWDbQ.js.map +0 -1
  585. package/dist/web/static/assets/index-BIYnq1Dx.js +0 -4
  586. package/dist/web/static/assets/index-BIYnq1Dx.js.map +0 -1
  587. package/dist/web/static/assets/useTabsParam-k8qte_0C.js +0 -2
  588. package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +0 -1
  589. package/dist/web/static/assets/vendor-DWgdB1eY.js +0 -65
  590. package/dist/web/static/assets/vendor-DWgdB1eY.js.map +0 -1
  591. /package/dist/{skills/distill → core/utils}/claude-cli-resolver.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"distill-manager.js","sourceRoot":"","sources":["../../../src/web/services/distill-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"distill-manager.js","sourceRoot":"","sources":["../../../src/web/services/distill-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./react-vendor-tkvCrao7.js";import{J as a,d as T,D as S,F as d,X as k,w as C,a6 as w,T as s,b as r,Y as I,E as x,K as j,$ as R,N as p,a7 as B}from"./arco-DV6xCLhr.js";import{c as D,f as y,a as g,b as f,o as W}from"./useAgentStats-B-uTgqBd.js";import{G as A}from"./GlobalScopeHint-Q3wTJx3F.js";import{d as $,u as E}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./query-CgCOpYWf.js";import"./index-DileOOE4.js";import"./lucide-CnlPQoG8.js";import"./useEffectiveProject-DQiyX54y.js";const L=j.Row,h=j.Col;function G(t){if(t.rated===0)return e.jsx(r,{size:"small",color:"gray",children:"未评分"});const i=t.successRate??0,l=i>=.8?"green":i>=.5?"orange":"red";return e.jsxs(r,{size:"small",color:l,children:["成功率 ",f(t.successRate)]})}function M(t){const i=[{label:"success",n:t.success,color:"rgb(var(--green-6))"},{label:"partial",n:t.partial,color:"rgb(var(--orange-6))"},{label:"failed",n:t.failed,color:"rgb(var(--red-6))"},{label:"未结局",n:t.unrated,color:"rgb(var(--gray-4))"}],l=t.total||1;return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[e.jsx("div",{style:{display:"flex",height:14,borderRadius:7,overflow:"hidden",background:"var(--color-fill-2)"},children:i.map(n=>n.n>0?e.jsx("div",{title:`${n.label} ${n.n}`,style:{width:`${n.n/l*100}%`,background:n.color}},n.label):null)}),e.jsx("div",{style:{display:"flex",gap:16,flexWrap:"wrap"},children:i.map(n=>e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6,fontSize:12},children:[e.jsx("span",{style:{width:10,height:10,borderRadius:2,background:n.color,display:"inline-block"}}),e.jsx(s.Text,{style:{fontSize:12},children:n.label}),e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:[n.n," · ",t.total>0?Math.round(n.n/l*100):0,"%"]})]},n.label))})]})}function P(t,i){const l=W(t.outcome);return e.jsx("div",{style:{padding:"10px 0",borderBottom:"1px solid var(--color-border-1)"},children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[t.taskId?e.jsxs(B,{style:{fontSize:13,padding:0},onClick:()=>i(t.taskId),children:[t.title,e.jsx(p,{style:{marginLeft:2}})]}):e.jsx(s.Text,{style:{fontSize:13},children:t.title}),e.jsx("div",{style:{flex:1}}),e.jsx(r,{size:"small",color:l.color,children:l.label}),e.jsx(s.Text,{type:"secondary",style:{fontSize:12,width:70,textAlign:"right"},children:y(t.durationMs)}),e.jsx(s.Text,{type:"secondary",style:{fontSize:12,width:92,textAlign:"right"},children:g(t.ts)})]})},`${t.taskId??t.sessionId}-${t.ts}`)}function q(){const{name:t}=$(),i=E(),{view:l,loading:n,isError:m,error:c,project:u,isAllProjects:b}=D(t);if(n)return e.jsx("div",{style:{padding:16},children:e.jsx(a,{bordered:!0,children:e.jsx(T,{animation:!0,text:{rows:8}})})});if(m||!l)return e.jsx("div",{style:{padding:16},children:e.jsx(S,{status:"error",title:"加载 Agent 详情失败",subTitle:(c==null?void 0:c.message)||"agent 不存在或端点不可用",extra:e.jsx(d,{type:"primary",onClick:()=>i("/ai/agents"),children:"返回 Agent 委托"})})});const o=l.breakdown;return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsxs(a,{bordered:!0,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:8},children:[e.jsx(d,{type:"text",size:"small",icon:e.jsx(k,{}),style:{paddingLeft:0},onClick:()=>i("/ai/agents"),children:"返回 Agent 委托"}),!l.isBuiltin&&e.jsx(d,{type:"primary",size:"small",icon:e.jsx(C,{}),onClick:()=>i(`/ai/agents/${encodeURIComponent(l.agent)}/distill`),children:"进化(dry-run → 草案 → 采纳)"})]}),e.jsx("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:16,flexWrap:"wrap"},children:e.jsxs("div",{style:{minWidth:0,flex:1},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[e.jsx(w,{style:{color:"rgb(var(--arcoblue-6))"}}),e.jsx(s.Title,{heading:5,style:{margin:0,fontFamily:"monospace"},children:l.agent}),l.isBuiltin&&e.jsx(r,{color:"gray",size:"small",children:"built-in"}),e.jsxs(r,{size:"small",color:"arcoblue",children:["委托 ",l.delegations]}),G(o),e.jsx(A,{project:u,isAllProjects:b,usageLabel:"委托统计"})]}),l.role&&e.jsx(s.Text,{type:"secondary",style:{fontSize:12,display:"block",marginTop:6},children:l.role}),e.jsxs("div",{style:{display:"flex",gap:12,flexWrap:"wrap",marginTop:8,alignItems:"center"},children:[e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:["平均耗时 ",e.jsx("b",{children:y(l.avgDurationMs)})]}),e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:["已结局 ",e.jsx("b",{children:o.rated}),"/",o.total]}),l.lastTs>0&&e.jsxs(s.Text,{type:"secondary",style:{fontSize:12,display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(I,{})," ",g(l.lastTs)]})]})]})})]}),e.jsx(a,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"结局占比"}),children:o.total>0?M(o):e.jsx(x,{description:"窗口内无委托记录"})}),e.jsxs(L,{gutter:16,align:"start",children:[e.jsx(h,{xs:24,xl:16,style:{marginBottom:16},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e.jsx(a,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"🎯 角色与适用场景"}),children:l.role?e.jsx(s.Paragraph,{style:{margin:0,fontSize:13},children:l.role}):e.jsx(x,{description:"无角色简介(未在 AGENT_ROLES 常量 / agent 文件 description 中定义)"})}),e.jsx(a,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"🧾 最近委托任务"}),extra:e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:["最新 ",l.recent.length," 条"]}),children:l.recent.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column"},children:l.recent.map(v=>P(v,z=>i(`/tasks/${encodeURIComponent(z)}`)))}):e.jsx(x,{description:"窗口内无委托记录"})})]})}),e.jsx(h,{xs:24,xl:8,style:{marginBottom:16},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e.jsxs(a,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"概要"}),children:[e.jsx(R,{colon:" :",size:"small",column:1,labelStyle:{width:88,color:"var(--color-text-3)"},data:[{label:"类型",value:l.isBuiltin?e.jsx(r,{size:"small",color:"gray",children:"Claude Code 内置"}):e.jsx(r,{size:"small",color:"arcoblue",children:"项目 agent"})},{label:"委托数",value:e.jsx(s.Text,{style:{fontWeight:600},children:l.delegations})},{label:"成功率",value:f(o.successRate)},{label:"平均耗时",value:y(l.avgDurationMs)},{label:"可用工具",value:l.tools?e.jsx(s.Text,{style:{fontSize:12},children:l.tools}):l.isBuiltin?"内置(无 .md 详情)":"继承全部"},{label:"默认 model",value:l.model?e.jsx(s.Text,{code:!0,style:{fontSize:11},children:l.model}):"—"},{label:"最近",value:g(l.lastTs)}]}),!l.contentExists&&!l.isBuiltin&&e.jsxs(s.Text,{type:"secondary",style:{fontSize:11,display:"block",marginTop:8},children:["未读到 .claude/agents/",l.agent,".md(概要降级,仅显委托聚合)"]})]}),e.jsx(a,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"配合 skill / KB"}),children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:8},children:[e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:"该 agent 在实施时会主动 pull 方法论 skill 与 KB precedent(reason 前缀 以 agent 类型归因)。"}),e.jsxs("div",{style:{display:"flex",gap:8,flexWrap:"wrap"},children:[e.jsxs(d,{size:"small",onClick:()=>i("/ai/skills"),children:["查看 Skill 调用 ",e.jsx(p,{})]}),e.jsxs(d,{size:"small",onClick:()=>i("/ai/kb"),children:["查看 KB 命中 ",e.jsx(p,{})]})]})]})})]})})]})]})}export{q as default};
2
+ //# sourceMappingURL=AgentDetailPage-DlUeA1sX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentDetailPage-DlUeA1sX.js","sources":["../../src/pages/ai/AgentDetailPage.tsx"],"sourcesContent":["/**\n * AgentDetailPage — AI 资源 · Agent 委托详情整页 (Phase 2d, decision 29688066).\n *\n * 替换 `/ai/agents/:name` 的占位组件。整页(非抽屉)布局,翻译原型「Agent\n * 委托详情」成真 Arco 组件(**严禁直搬原型 Tailwind CSS**):\n * A. 页头横条:agent 名 + built-in 标 + 委托数/成功率 Tag + 最近 + 返回\n * B. 横向 outcome 占比条(success/partial/failed/未结局)\n * C. 左右双栏:\n * 左 = 角色与适用场景(AGENT_ROLES / content frontmatter)+ 最近委托任务列表\n * (可链 /tasks/:id)\n * 右 360 = 概要 Descriptions(类型/可用工具/默认 model)+ 配合 skill/KB(导航)\n *\n * 数据接真实端点(GET /api/insights/agent-stats 同窗命中 :name 一行 +\n * GET /api/agents/:name/content),取数 + 派生在 useAgentDetail / agent-derive,\n * 本组件只渲染。\n */\nimport { useParams, useNavigate } from 'react-router-dom'\n\nimport Card from '@arco-design/web-react/es/Card'\nimport Grid from '@arco-design/web-react/es/Grid'\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 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 Result from '@arco-design/web-react/es/Result'\nimport Link from '@arco-design/web-react/es/Link'\nimport {\n IconLeft,\n IconUserGroup,\n IconClockCircle,\n IconRight,\n IconThunderbolt,\n} from '@arco-design/web-react/icon'\n\nimport { useAgentDetail } from '../../hooks/useAgentStats'\nimport GlobalScopeHint from '../../components/ai/GlobalScopeHint'\nimport {\n formatPct,\n formatTs,\n formatDuration,\n outcomeMeta,\n type OutcomeBreakdown,\n type RecentTaskRow,\n} from '../../hooks/agent-derive'\n\nconst Row = Grid.Row\nconst Col = Grid.Col\n\nfunction successTag(b: OutcomeBreakdown) {\n if (b.rated === 0) {\n return (\n <Tag size=\"small\" color=\"gray\">\n 未评分\n </Tag>\n )\n }\n const rate = b.successRate ?? 0\n const color = rate >= 0.8 ? 'green' : rate >= 0.5 ? 'orange' : 'red'\n return (\n <Tag size=\"small\" color={color}>\n 成功率 {formatPct(b.successRate)}\n </Tag>\n )\n}\n\n/** 横向 outcome 占比条(手搓段条,按 delegation 总数为分母)。 */\nfunction outcomeBar(b: OutcomeBreakdown) {\n const segs: Array<{ label: string; n: number; color: string }> = [\n { label: 'success', n: b.success, color: 'rgb(var(--green-6))' },\n { label: 'partial', n: b.partial, color: 'rgb(var(--orange-6))' },\n { label: 'failed', n: b.failed, color: 'rgb(var(--red-6))' },\n { label: '未结局', n: b.unrated, color: 'rgb(var(--gray-4))' },\n ]\n const denom = b.total || 1\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n <div\n style={{\n display: 'flex',\n height: 14,\n borderRadius: 7,\n overflow: 'hidden',\n background: 'var(--color-fill-2)',\n }}\n >\n {segs.map((s) =>\n s.n > 0 ? (\n <div\n key={s.label}\n title={`${s.label} ${s.n}`}\n style={{ width: `${(s.n / denom) * 100}%`, background: s.color }}\n />\n ) : null,\n )}\n </div>\n <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap' }}>\n {segs.map((s) => (\n <span\n key={s.label}\n style={{ display: 'inline-flex', alignItems: 'center', gap: 6, fontSize: 12 }}\n >\n <span\n style={{ width: 10, height: 10, borderRadius: 2, background: s.color, display: 'inline-block' }}\n />\n <Typography.Text style={{ fontSize: 12 }}>{s.label}</Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {s.n} · {b.total > 0 ? Math.round((s.n / denom) * 100) : 0}%\n </Typography.Text>\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction recentItem(r: RecentTaskRow, onOpen: (taskId: string) => void) {\n const meta = outcomeMeta(r.outcome)\n return (\n <div\n key={`${r.taskId ?? r.sessionId}-${r.ts}`}\n style={{\n padding: '10px 0',\n borderBottom: '1px solid var(--color-border-1)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }}>\n {r.taskId ? (\n <Link\n style={{ fontSize: 13, padding: 0 }}\n onClick={() => onOpen(r.taskId!)}\n >\n {r.title}\n <IconRight style={{ marginLeft: 2 }} />\n </Link>\n ) : (\n <Typography.Text style={{ fontSize: 13 }}>{r.title}</Typography.Text>\n )}\n <div style={{ flex: 1 }} />\n <Tag size=\"small\" color={meta.color}>\n {meta.label}\n </Tag>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, width: 70, textAlign: 'right' }}>\n {formatDuration(r.durationMs)}\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, width: 92, textAlign: 'right' }}>\n {formatTs(r.ts)}\n </Typography.Text>\n </div>\n </div>\n )\n}\n\nexport default function AgentDetailPage() {\n const { name } = useParams<{ name: string }>()\n const navigate = useNavigate()\n const { view, loading, isError, error, project, isAllProjects } = useAgentDetail(name)\n\n if (loading) {\n return (\n <div style={{ padding: 16 }}>\n <Card bordered>\n <Skeleton animation text={{ rows: 8 }} />\n </Card>\n </div>\n )\n }\n\n if (isError || !view) {\n return (\n <div style={{ padding: 16 }}>\n <Result\n status=\"error\"\n title=\"加载 Agent 详情失败\"\n subTitle={error?.message || 'agent 不存在或端点不可用'}\n extra={\n <Button type=\"primary\" onClick={() => navigate('/ai/agents')}>\n 返回 Agent 委托\n </Button>\n }\n />\n </div>\n )\n }\n\n const b = view.breakdown\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 16 }}>\n {/* ── A. 页头横条 ─────────────────────────────────────────────── */}\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginBottom: 8 }}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<IconLeft />}\n style={{ paddingLeft: 0 }}\n onClick={() => navigate('/ai/agents')}\n >\n 返回 Agent 委托\n </Button>\n {/* Q1 进化入口 (decision 568a8c53):仅项目 agent;人点击 → 进化向导。 */}\n {!view.isBuiltin && (\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<IconThunderbolt />}\n onClick={() => navigate(`/ai/agents/${encodeURIComponent(view.agent)}/distill`)}\n >\n 进化(dry-run → 草案 → 采纳)\n </Button>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 16, flexWrap: 'wrap' }}>\n <div style={{ minWidth: 0, flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }}>\n <IconUserGroup style={{ color: 'rgb(var(--arcoblue-6))' }} />\n <Typography.Title heading={5} style={{ margin: 0, fontFamily: 'monospace' }}>\n {view.agent}\n </Typography.Title>\n {view.isBuiltin && (\n <Tag color=\"gray\" size=\"small\">\n built-in\n </Tag>\n )}\n <Tag size=\"small\" color=\"arcoblue\">\n 委托 {view.delegations}\n </Tag>\n {successTag(b)}\n <GlobalScopeHint project={project} isAllProjects={isAllProjects} usageLabel=\"委托统计\" />\n </div>\n {view.role && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginTop: 6 }}>\n {view.role}\n </Typography.Text>\n )}\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', marginTop: 8, alignItems: 'center' }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 平均耗时 <b>{formatDuration(view.avgDurationMs)}</b>\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 已结局 <b>{b.rated}</b>/{b.total}\n </Typography.Text>\n {view.lastTs > 0 && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <IconClockCircle /> {formatTs(view.lastTs)}\n </Typography.Text>\n )}\n </div>\n </div>\n </div>\n </Card>\n\n {/* ── B. 横向 outcome 占比条 ──────────────────────────────────── */}\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>结局占比</span>}>\n {b.total > 0 ? (\n outcomeBar(b)\n ) : (\n <Empty description=\"窗口内无委托记录\" />\n )}\n </Card>\n\n {/* ── C. 左右双栏 ─────────────────────────────────────────────── */}\n <Row gutter={16} align=\"start\">\n {/* 左主栏:角色与适用场景 + 最近委托任务 */}\n <Col xs={24} xl={16} style={{ marginBottom: 16 }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>🎯 角色与适用场景</span>}>\n {view.role ? (\n <Typography.Paragraph style={{ margin: 0, fontSize: 13 }}>\n {view.role}\n </Typography.Paragraph>\n ) : (\n <Empty description=\"无角色简介(未在 AGENT_ROLES 常量 / agent 文件 description 中定义)\" />\n )}\n </Card>\n\n <Card\n bordered\n title={<span style={{ fontSize: 14, fontWeight: 600 }}>🧾 最近委托任务</span>}\n extra={\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 最新 {view.recent.length} 条\n </Typography.Text>\n }\n >\n {view.recent.length > 0 ? (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n {view.recent.map((r) =>\n recentItem(r, (taskId) => navigate(`/tasks/${encodeURIComponent(taskId)}`)),\n )}\n </div>\n ) : (\n <Empty description=\"窗口内无委托记录\" />\n )}\n </Card>\n </div>\n </Col>\n\n {/* 右侧栏:概要 + 配合 skill/KB */}\n <Col xs={24} xl={8} style={{ marginBottom: 16 }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>概要</span>}>\n <Descriptions\n colon=\" :\"\n size=\"small\"\n column={1}\n labelStyle={{ width: 88, color: 'var(--color-text-3)' }}\n data={[\n {\n label: '类型',\n value: view.isBuiltin ? (\n <Tag size=\"small\" color=\"gray\">\n Claude Code 内置\n </Tag>\n ) : (\n <Tag size=\"small\" color=\"arcoblue\">\n 项目 agent\n </Tag>\n ),\n },\n { label: '委托数', value: <Typography.Text style={{ fontWeight: 600 }}>{view.delegations}</Typography.Text> },\n { label: '成功率', value: formatPct(b.successRate) },\n { label: '平均耗时', value: formatDuration(view.avgDurationMs) },\n {\n label: '可用工具',\n value: view.tools ? (\n <Typography.Text style={{ fontSize: 12 }}>{view.tools}</Typography.Text>\n ) : view.isBuiltin ? (\n '内置(无 .md 详情)'\n ) : (\n '继承全部'\n ),\n },\n {\n label: '默认 model',\n value: view.model ? (\n <Typography.Text code style={{ fontSize: 11 }}>\n {view.model}\n </Typography.Text>\n ) : (\n '—'\n ),\n },\n { label: '最近', value: formatTs(view.lastTs) },\n ]}\n />\n {!view.contentExists && !view.isBuiltin && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, display: 'block', marginTop: 8 }}>\n 未读到 .claude/agents/{view.agent}.md(概要降级,仅显委托聚合)\n </Typography.Text>\n )}\n </Card>\n\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>配合 skill / KB</span>}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 该 agent 在实施时会主动 pull 方法论 skill 与 KB precedent(reason 前缀\n 以 agent 类型归因)。\n </Typography.Text>\n <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap' }}>\n <Button size=\"small\" onClick={() => navigate('/ai/skills')}>\n 查看 Skill 调用 <IconRight />\n </Button>\n <Button size=\"small\" onClick={() => navigate('/ai/kb')}>\n 查看 KB 命中 <IconRight />\n </Button>\n </div>\n </div>\n </Card>\n </div>\n </Col>\n </Row>\n </div>\n )\n}\n"],"names":["Row","Grid","Col","successTag","b","Tag","rate","color","jsxs","formatPct","outcomeBar","segs","denom","jsx","s","Typography","recentItem","r","onOpen","meta","outcomeMeta","Link","IconRight","formatDuration","formatTs","AgentDetailPage","name","useParams","navigate","useNavigate","view","loading","isError","error","project","isAllProjects","useAgentDetail","Card","Skeleton","Result","Button","IconLeft","IconThunderbolt","IconUserGroup","GlobalScopeHint","IconClockCircle","Empty","taskId","Descriptions"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{r as d,j as e}from"./react-vendor-tkvCrao7.js";import{J as R,F as k,X as N,T as h,V as Q,S as V,ac as S,i as $,b as C,w as z,O as F,ah as D,a3 as I,ad as K}from"./arco-DV6xCLhr.js";import{u as M,a as O,c as B}from"./query-CgCOpYWf.js";import{a as A}from"./auth-Bnf8ZcqN.js";import{d as W,u as J}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";const U=["connected","start","phase-changed","distiller-spawned","draft-written","anchor-rejected","done","cancelled","error"],H=new Set(["done","cancelled","error"]);function Y(t){let n=!1,a=!1,r="idle",g=null,j=null,m=null,w=null,p=[],u=null,c=null,s=!1;for(const i of t){switch(i.type){case"connected":n=!0,r==="idle"&&(r="connecting");break;case"start":case"phase-changed":s||(r="running");break;case"distiller-spawned":s||(r="running"),a=!0,i.maturity!=null&&(w=i.maturity);break;case"draft-written":s||(r="running"),g=i.draftPath??g,j=i.targetVersion??j,m=i.currentVersion??m,i.maturity!=null&&(w=i.maturity);break;case"anchor-rejected":i.violations&&(p=i.violations);break;case"done":r="done",s=!0,g=i.draftPath??g,j=i.targetVersion??j,m=i.currentVersion??m,i.maturity!=null&&(w=i.maturity),u=i.message??null;break;case"cancelled":r="cancelled",s=!0,u=i.message??"已取消";break;case"error":r="error",s=!0,c=i.errorMessage??i.message??"未知错误",u=c;break}H.has(i.type)&&(s=!0)}return{phase:r,connected:n,spawned:a,draftPath:g,targetVersion:j,currentVersion:m,maturity:w,violations:p,terminalMessage:u,isTerminal:s,errorMessage:c,log:t}}function G(t){if(!t||!t.isBusy)return null;const n=t.lastRunId;return typeof n!="string"||n.length===0?null:n}function X(t){if(!t)return"生成草案失败,未知错误";const n=t.trim();return n.includes("agent_distill_in_progress")||n.includes("409")?"该 agent 已有进化在进行中,请稍后再试":n.includes("agent_distill_capacity")?"同时进行的进化任务过多,请稍后再试":n.includes("403")?"无权限触发进化(403,loopback only)":n.includes("401")||n==="unauthorized"?"未授权:请检查 daemon token":n.includes("500")?"后端出错(500),请查看 daemon 日志":n.toLowerCase().includes("failed to fetch")?"无法连接 daemon,请确认服务已启动":n}function Z(t){switch(t){case"connected":return{color:"gray",label:"建连"};case"start":return{color:"arcoblue",label:"启动"};case"phase-changed":return{color:"blue",label:"阶段"};case"distiller-spawned":return{color:"purple",label:"spawn"};case"draft-written":return{color:"green",label:"草案✓"};case"anchor-rejected":return{color:"red",label:"越界拒"};case"done":return{color:"green",label:"完成"};case"cancelled":return{color:"orange",label:"取消"};case"error":return{color:"red",label:"错误"};default:return{color:"gray",label:String(t)}}}async function ee(t){const n=await fetch(`/api/agent/distill/preview/${encodeURIComponent(t)}`);if(!n.ok)throw new Error(`preview → ${n.status}`);return n.json()}async function te(t){const n=await fetch(`/api/agent/distill/cost-estimate/${encodeURIComponent(t)}`);if(!n.ok)throw new Error(`cost → ${n.status}`);return n.json()}async function ne(){const t=await fetch("/api/agent/distill/status");if(!t.ok)throw new Error(`status → ${t.status}`);return t.json()}async function re(t,n){const a=n?`?targetVersion=${n}`:"",r=await fetch(`/api/agent/distill/draft/${encodeURIComponent(t)}${a}`);if(!r.ok)throw new Error(`draft → ${r.status}`);return r.json()}async function se(t){const n=await A("/api/agent/distill/run",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({agent:t})});if(n.status===409){const a=await n.json().catch(()=>({}));throw new Error(a.error||"agent_distill_in_progress")}if(!n.ok)throw new Error(`run → ${n.status}`);return n.json()}async function ae(t){const n=await A(`/api/agent/distill/cancel/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(!n.ok)throw new Error(`cancel → ${n.status}`)}function ie(t){return M({queryKey:["agent-distill-preview",t],queryFn:()=>ee(t),enabled:!!t})}function oe(t,n=!0){return M({queryKey:["agent-distill-cost",t],queryFn:()=>te(t),enabled:n&&!!t})}function le(){return M({queryKey:["agent-distill-status"],queryFn:ne,refetchInterval:t=>{var n;return(n=t.state.data)!=null&&n.isBusy?5e3:6e4}})}function ce(t,n,a=!0){return M({queryKey:["agent-distill-draft",t,n??null],queryFn:()=>re(t,n),enabled:a&&!!t,retry:!1})}function de(){const t=O();return B({mutationFn:async n=>{const a=await A("/api/agent/adopt",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),r=await a.json().catch(()=>({}));if(!a.ok)throw new Error(r.error||`adopt → ${a.status}`);return r},onSuccess:(n,a)=>{t.invalidateQueries({queryKey:["agent-distill-preview",a.agent]}),t.invalidateQueries({queryKey:["agent-distill-status"]})}})}function ue(){const t=O();return B({mutationFn:async n=>{const a=await A("/api/agent/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),r=await a.json().catch(()=>({}));if(!a.ok)throw new Error(r.error||`rollback → ${a.status}`);return r},onSuccess:(n,a)=>{t.invalidateQueries({queryKey:["agent-distill-preview",a.agent]})}})}function fe(){const t=O(),[n,a]=d.useState([]),[r,g]=d.useState(null),[j,m]=d.useState(!1),[w,p]=d.useState(null),u=d.useRef(null),c=d.useCallback(()=>{u.current&&(u.current.close(),u.current=null)},[]);d.useEffect(()=>c,[c]);const s=d.useCallback(l=>{c();const x=new EventSource(`/api/agent/distill/run/${encodeURIComponent(l)}/stream`);u.current=x;const P=f=>b=>{let T={};try{T=JSON.parse(b.data||"{}")}catch{}const o={...T,type:f};a(y=>[...y,o]),(f==="done"||f==="error"||f==="cancelled")&&(x.close(),u.current=null,t.invalidateQueries({queryKey:["agent-distill-status"]}),t.invalidateQueries({queryKey:["agent-distill-draft"]}))};for(const f of U)x.addEventListener(f,P(f));x.onerror=()=>{a(f=>{const b=f[f.length-1];return b&&(b.type==="done"||b.type==="error"||b.type==="cancelled")?f:[...f,{type:"error",errorMessage:"SSE 连接中断(daemon 不可达或已断流)"}]})}},[c,t]),i=d.useCallback(async l=>{p(null),m(!0),a([]);try{const{runId:x}=await se(l);g(x),s(x)}catch(x){p(x)}finally{m(!1)}},[s]),v=d.useCallback(l=>{r===l&&u.current||(p(null),a([]),g(l),s(l))},[r,s]),E=d.useCallback(async()=>{if(r)try{await ae(r)}catch{}},[r]),L=d.useCallback(()=>{c(),a([]),g(null),p(null)},[c]);return{view:Y(n),runId:r,submitting:j,submitError:w,start:i,reconnect:v,cancel:E,reset:L}}const q=Q.Step;function ge({patch:t}){return e.jsx("pre",{style:{margin:0,padding:12,background:"var(--color-fill-1)",borderRadius:4,fontSize:12,lineHeight:1.6,overflowX:"auto",whiteSpace:"pre"},children:t.split(`
2
+ `).map((n,a)=>{let r;return n.startsWith("+")&&!n.startsWith("+++")?r="rgb(var(--green-6))":n.startsWith("-")&&!n.startsWith("---")?r="rgb(var(--red-6))":n.startsWith("@@")&&(r="rgb(var(--arcoblue-6))"),e.jsx("div",{style:{color:r},children:n||" "},a)})})}function we(){var f,b,T;const{name:t=""}=W(),n=J(),[a,r]=d.useState(0),[g,j]=d.useState(!1),m=d.useRef(!1),w=ie(t),p=oe(t),u=le(),c=fe(),s=c.view,i=s.targetVersion??void 0,v=ce(t,i,s.isTerminal&&s.phase==="done"),E=de(),L=ue();d.useEffect(()=>{if(m.current)return;const o=G(u.data);o&&(m.current=!0,r(2),c.reconnect(o))},[u.data,c]),d.useEffect(()=>{s.isTerminal&&a<2&&r(2)},[s.isTerminal,a]);const l=w.data,x=()=>{D.confirm({title:"生成进化草案(真烧 LLM)",content:e.jsxs("div",{children:[e.jsxs(h.Paragraph,{children:["将 spawn ",e.jsx("code",{children:"claude -p --agent agent-retro-distiller"})," 据真实使用信号起草模板改进。",e.jsx("strong",{children:"这会真实消耗 LLM 额度。"})]}),p.data&&e.jsxs(h.Text,{type:"secondary",style:{fontSize:12},children:["成本量级估算:约 input ",p.data.inputTokens," + output ",p.data.outputTokens," tokens(",p.data.note,")"]})]}),okText:"确认生成",cancelText:"取消",onOk:async()=>{r(2),await c.start(t)}})},P=()=>{i&&D.confirm({title:"采纳草案(写模板)",content:e.jsxs(h.Paragraph,{children:["将把 patch 应用到 ",e.jsxs("code",{children:["src/daemon/templates/agents/",t,".md"]}),", version 机械递增到 ",e.jsxs("strong",{children:["v",i]}),",并字节同步项目级副本",e.jsxs("code",{children:[".claude/agents/",t,".md"]}),"。anchor-guard 会再校验一次(越界不写)。"]}),okText:"确认采纳",cancelText:"取消",onOk:async()=>{try{const o=await E.mutateAsync({agent:t,targetVersion:i,confirmedDiff:!0});I.success(`已采纳 ${t} → v${o.version??i}(src + 项目级副本字节一致)`)}catch(o){I.error(`采纳失败:${o.message}`)}}})};return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsxs(R,{bordered:!0,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(k,{type:"text",icon:e.jsx(N,{}),onClick:()=>n(`/ai/agents/${encodeURIComponent(t)}`),children:"返回"}),e.jsxs(h.Title,{heading:6,style:{margin:0},children:["Agent 进化向导 · ",e.jsx("code",{children:t})]}),e.jsx(h.Text,{type:"secondary",style:{fontSize:12},children:"人触发 · 已看 diff 才可采纳 · daemon 永不自动改模板(decision 568a8c53)"})]}),e.jsxs(Q,{current:a,style:{marginTop:16},size:"small",children:[e.jsx(q,{title:"预览(免费)",description:"dry-run 信号"}),e.jsx(q,{title:"生成草案",description:"真烧 LLM"}),e.jsx(q,{title:"diff + 采纳/回退",description:"人确认写模板"})]})]}),a===0&&e.jsxs(R,{bordered:!0,title:"① dry-run 预览(免费,不 spawn)",children:[w.isLoading&&e.jsx(V,{}),w.isError&&e.jsx(S,{type:"error",content:"预览加载失败(端点不可用或无此 agent 模板)"}),l&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:12},children:[e.jsxs($,{wrap:!0,children:[e.jsxs(C,{children:["当前 version: ",l.current_version]}),e.jsx(C,{color:l.enough_signal?"green":"orange",children:l.enough_signal?"信号充分":"信号不足"}),e.jsxs(C,{color:"gray",children:["成熟度: ",l.maturity]})]}),!l.enough_signal&&l.insufficient_reason&&e.jsx(S,{type:"warning",content:l.insufficient_reason}),e.jsxs("div",{children:[e.jsx(h.Text,{style:{fontWeight:600,fontSize:13},children:"拟改动类型"}),l.proposed_change_types.length===0?e.jsx("div",{children:e.jsx(h.Text,{type:"secondary",style:{fontSize:12},children:"(无足够信号支撑改动,distiller 预期产 NOOP)"})}):e.jsx("ul",{style:{margin:"4px 0 0",paddingLeft:18},children:l.proposed_change_types.map((o,y)=>e.jsx("li",{children:e.jsx(h.Text,{style:{fontSize:12},children:o})},y))})]}),l.drift.length>0&&e.jsxs("div",{children:[e.jsx(h.Text,{style:{fontWeight:600,fontSize:13},children:"drift"}),e.jsx("ul",{style:{margin:"4px 0 0",paddingLeft:18},children:l.drift.map((o,y)=>e.jsx("li",{children:e.jsxs(h.Text,{style:{fontSize:12},children:["[",o.kind,"] ",o.message]})},y))})]}),e.jsxs("div",{children:[e.jsx(k,{type:"primary",icon:e.jsx(z,{}),disabled:!l.enough_signal||((f=u.data)==null?void 0:f.claudeCliAvailable)===!1,onClick:()=>r(1),children:"下一步:生成草案"}),((b=u.data)==null?void 0:b.claudeCliAvailable)===!1&&e.jsx(h.Text,{type:"error",style:{fontSize:12,marginLeft:8},children:"claude CLI 不可用,无法 spawn"})]})]})]}),a===1&&e.jsxs(R,{bordered:!0,title:"② 生成草案(真烧 LLM)",children:[e.jsx(S,{type:"warning",content:"点击「生成草案」会真实 spawn LLM 并消耗额度。草案落 docs/ 供人审,不自动写模板。",style:{marginBottom:12}}),e.jsxs($,{children:[e.jsx(k,{onClick:()=>r(0),children:"上一步"}),e.jsx(k,{type:"primary",icon:e.jsx(z,{}),onClick:x,loading:c.submitting,children:"生成草案"})]})]}),a===2&&e.jsxs(R,{bordered:!0,title:"③ 运行进度 + 草案 diff + 采纳/回退",children:[c.submitError&&e.jsx(S,{type:"error",content:X(c.submitError.message),style:{marginBottom:12}}),e.jsxs("div",{style:{marginBottom:12},children:[e.jsxs($,{wrap:!0,children:[e.jsx(C,{color:s.phase==="error"?"red":s.phase==="done"?"green":"blue",children:s.phase}),s.maturity&&e.jsxs(C,{color:"gray",children:["成熟度: ",s.maturity]})]}),e.jsx("div",{style:{marginTop:8,maxHeight:200,overflowY:"auto"},children:s.log.map((o,y)=>{const _=Z(o.type);return e.jsxs("div",{style:{fontSize:12,marginBottom:2},children:[e.jsx(C,{color:_.color,size:"small",children:_.label})," ",e.jsx(h.Text,{type:"secondary",children:o.message||o.errorMessage||""})]},y)})})]}),s.violations.length>0&&e.jsx(S,{type:"error",style:{marginBottom:12},content:e.jsxs("div",{children:[e.jsx("div",{children:"anchor-guard 拒绝(patch 触碰保护区,草案未写/不可采纳):"}),e.jsx("ul",{style:{margin:"4px 0 0",paddingLeft:18},children:s.violations.map((o,y)=>e.jsxs("li",{children:["[",o.region,"] line ",o.patchLine,": ",o.line]},y))})]})}),s.phase==="done"&&s.draftPath&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:12},children:[v.isLoading&&e.jsx(V,{}),(T=v.data)!=null&&T.patch?e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsxs(h.Text,{style:{fontWeight:600,fontSize:13},children:["草案 diff(v",v.data.currentVersion," → v",v.data.targetVersion,")"]}),e.jsx(ge,{patch:v.data.patch})]}),e.jsxs($,{children:[e.jsx(k,{onClick:()=>j(!0),type:g?"default":"outline",icon:e.jsx(F,{}),children:g?"已确认看过 diff":"我已看过 diff"}),e.jsx(k,{type:"primary",disabled:!g,loading:E.isPending,onClick:P,children:"采纳(写模板)"}),e.jsx(k,{icon:e.jsx(K,{}),status:"warning",loading:L.isPending,onClick:()=>{var y;const o=((y=v.data)==null?void 0:y.currentVersion)??1;D.confirm({title:"回退到上一版本",content:`将尝试回退 ${t} 到 v${o}(沿用 CLI 的 HEAD blob + version 匹配启发式;不匹配会提示去 checkout)。`,okText:"确认回退",onOk:async()=>{try{await L.mutateAsync({agent:t,toVersion:o,confirmed:!0}),I.success(`已回退 ${t} → v${o}`)}catch(_){I.error(`回退失败:${_.message}`)}}})},children:"回退"})]})]}):s.terminalMessage&&e.jsx(S,{type:"info",content:s.terminalMessage})]}),s.phase!=="done"&&s.isTerminal&&s.terminalMessage&&e.jsx(S,{type:s.phase==="error"?"error":"warning",content:s.terminalMessage}),e.jsx("div",{style:{marginTop:12},children:e.jsx(k,{onClick:()=>{c.reset(),j(!1),r(0)},children:"重新开始"})})]})]})}export{we as default};
3
+ //# sourceMappingURL=AgentDistillRunPage-Cybo4bii.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentDistillRunPage-Cybo4bii.js","sources":["../../src/hooks/agent-distill-run-derive.ts","../../src/hooks/useAgentDistillRun.ts","../../src/pages/ai/AgentDistillRunPage.tsx"],"sourcesContent":["/**\n * agent-distill-run-derive — Agent 进化向导 (decision 568a8c53) 纯派生层。\n *\n * 镜像 distill-run-derive.ts:所有「SSE 事件流 → 向导视图模型」「status →\n * 应否重连」的计算抽进纯函数,页面/hook 只渲染派生结果。故 SSE 解析逻辑可喂\n * 模拟事件流单测,无需真触发 spawn(真烧 LLM)。\n *\n * ⚠️ 真实端点契约(对 src/web/routes/agent-distill.ts +\n * src/web/services/agent-distill-manager.ts 源码确认,严禁造服务端不发的字段):\n *\n * GET /api/agent/distill/status\n * → { isBusy, busyAgent, runningCount, lastRunId, claudeCliAvailable, claudeCliPath }\n * GET /api/agent/distill/preview/:agent[?days=N] (免费,不 spawn)\n * → { agent, current_version, maturity, enough_signal, insufficient_reason,\n * proposed_change_types[], drift[], recommended_skills[], failure_samples[], summary }\n * GET /api/agent/distill/cost-estimate/:agent\n * → { agent, inputTokens, outputTokens, total, note }\n * GET /api/agent/distill/draft/:agent[?targetVersion=N]\n * → { agent, draftPath, currentVersion, targetVersion, patch, currentTemplate, draftMarkdown }\n * POST /api/agent/distill/run body { agent, days?, maxFailures? }\n * → 202 { runId, agent, streamUrl } | 409 { error:'agent_distill_in_progress'|'agent_distill_capacity' }\n * GET /api/agent/distill/run/:runId/stream (SSE)\n * 事件类型(agent-distill-manager.ts AgentDistillEventType):\n * connected | start | phase-changed | distiller-spawned | draft-written\n * | anchor-rejected | done | cancelled | error\n * POST /api/agent/adopt body { agent, targetVersion, confirmedDiff:true }\n * POST /api/agent/rollback body { agent, toVersion, confirmed:true }\n */\n\n// ─── endpoint response shapes ─────────────────────────────────────────────────\n\nexport interface AgentDistillStatusResp {\n isBusy?: boolean\n busyAgent?: string | null\n runningCount?: number\n lastRunId?: string | null\n claudeCliAvailable?: boolean\n claudeCliPath?: string | null\n}\n\nexport interface AgentDistillPreviewResp {\n agent: string\n current_version: number\n maturity: string\n enough_signal: boolean\n insufficient_reason: string | null\n proposed_change_types: string[]\n drift: Array<{ kind?: string; message?: string; skill_id?: string }>\n recommended_skills: Array<{\n skill_id: string\n pulls: number\n actionable_rate: number\n recommendation_health?: string\n }>\n failure_samples: Array<{ title: string; session_id: string; ts: number }>\n summary: string\n}\n\nexport interface AgentDistillCostResp {\n agent: string\n inputTokens: number\n outputTokens: number\n total: number\n note: string\n}\n\nexport interface AgentDistillDraftResp {\n agent: string\n draftPath: string\n currentVersion: number\n targetVersion: number\n patch: string | null\n currentTemplate: string\n draftMarkdown: string\n}\n\n// ─── SSE 事件类型(与 manager AgentDistillEventType 严格一致) ─────────────────\n\nexport type AgentDistillEventType =\n | 'connected'\n | 'start'\n | 'phase-changed'\n | 'distiller-spawned'\n | 'draft-written'\n | 'anchor-rejected'\n | 'done'\n | 'cancelled'\n | 'error'\n\nexport const AGENT_DISTILL_EVENT_TYPES: AgentDistillEventType[] = [\n 'connected',\n 'start',\n 'phase-changed',\n 'distiller-spawned',\n 'draft-written',\n 'anchor-rejected',\n 'done',\n 'cancelled',\n 'error',\n]\n\nexport interface AgentAnchorViolation {\n region: string\n line: string\n patchLine: number\n}\n\nexport interface AgentDistillRunEvent {\n type: AgentDistillEventType\n at?: string\n agent?: string\n message?: string\n runId?: string\n draftPath?: string\n targetVersion?: number\n currentVersion?: number\n maturity?: string\n violations?: AgentAnchorViolation[]\n errorMessage?: string\n}\n\n// ─── SSE 事件流 → 向导运行视图 ────────────────────────────────────────────────\n\nexport type AgentRunPhase =\n | 'idle'\n | 'connecting'\n | 'running'\n | 'done'\n | 'cancelled'\n | 'error'\n\nexport interface AgentRunView {\n phase: AgentRunPhase\n connected: boolean\n /** 是否已 spawn distiller(distiller-spawned 事件)。 */\n spawned: boolean\n /** draft-written / done 携带的草案路径。 */\n draftPath: string | null\n targetVersion: number | null\n currentVersion: number | null\n maturity: string | null\n /** anchor-rejected 携带的越界列表。 */\n violations: AgentAnchorViolation[]\n /** 终态消息(done/cancelled/error)。 */\n terminalMessage: string | null\n isTerminal: boolean\n errorMessage: string | null\n /** 原始事件日志(UI 滚动日志区)。 */\n log: AgentDistillRunEvent[]\n}\n\nconst TERMINAL_TYPES = new Set<AgentDistillEventType>(['done', 'cancelled', 'error'])\n\n/**\n * 把一串 SSE 事件 reduce 成向导运行视图。**核心纯函数**——喂模拟事件流即可断言\n * 向导渲染,无需真触发 spawn(真烧 LLM)。\n */\nexport function reduceAgentDistillRunEvents(events: AgentDistillRunEvent[]): AgentRunView {\n let connected = false\n let spawned = false\n let phase: AgentRunPhase = 'idle'\n let draftPath: string | null = null\n let targetVersion: number | null = null\n let currentVersion: number | null = null\n let maturity: string | null = null\n let violations: AgentAnchorViolation[] = []\n let terminalMessage: string | null = null\n let errorMessage: string | null = null\n let isTerminal = false\n\n for (const ev of events) {\n switch (ev.type) {\n case 'connected':\n connected = true\n if (phase === 'idle') phase = 'connecting'\n break\n case 'start':\n case 'phase-changed':\n if (!isTerminal) phase = 'running'\n break\n case 'distiller-spawned':\n if (!isTerminal) phase = 'running'\n spawned = true\n if (ev.maturity != null) maturity = ev.maturity\n break\n case 'draft-written':\n if (!isTerminal) phase = 'running'\n draftPath = ev.draftPath ?? draftPath\n targetVersion = ev.targetVersion ?? targetVersion\n currentVersion = ev.currentVersion ?? currentVersion\n if (ev.maturity != null) maturity = ev.maturity\n break\n case 'anchor-rejected':\n if (ev.violations) violations = ev.violations\n break\n case 'done':\n phase = 'done'\n isTerminal = true\n draftPath = ev.draftPath ?? draftPath\n targetVersion = ev.targetVersion ?? targetVersion\n currentVersion = ev.currentVersion ?? currentVersion\n if (ev.maturity != null) maturity = ev.maturity\n terminalMessage = ev.message ?? null\n break\n case 'cancelled':\n phase = 'cancelled'\n isTerminal = true\n terminalMessage = ev.message ?? '已取消'\n break\n case 'error':\n phase = 'error'\n isTerminal = true\n errorMessage = ev.errorMessage ?? ev.message ?? '未知错误'\n terminalMessage = errorMessage\n break\n default:\n break\n }\n if (TERMINAL_TYPES.has(ev.type)) isTerminal = true\n }\n\n return {\n phase,\n connected,\n spawned,\n draftPath,\n targetVersion,\n currentVersion,\n maturity,\n violations,\n terminalMessage,\n isTerminal,\n errorMessage,\n log: events,\n }\n}\n\n// ─── 刷新重连:status → 应否重连进行中的 run ──────────────────────────────────\n\n/**\n * 决定刷新后是否要重连一个进行中的 run。仅当后端确实在跑(runningCount>0 且有\n * lastRunId)才重连。注意:agent 侧 status 不直接给 currentRunId(per-agent 多\n * 跑),用 lastRunId 作为「最近一个 run」重连锚点(SSE 会回放 session.events\n * 恢复进度;run 已 GC 则 404,hook 兜底回 idle)。\n */\nexport function reconnectableAgentRunId(\n status: AgentDistillStatusResp | undefined | null,\n): string | null {\n if (!status) return null\n if (!status.isBusy) return null\n const id = status.lastRunId\n if (typeof id !== 'string' || id.length === 0) return null\n return id\n}\n\n// ─── 友好化错误 ───────────────────────────────────────────────────────────────\n\nexport function friendlyAgentRunError(message: string | undefined): string {\n if (!message) return '生成草案失败,未知错误'\n const m = message.trim()\n if (m.includes('agent_distill_in_progress') || m.includes('409')) {\n return '该 agent 已有进化在进行中,请稍后再试'\n }\n if (m.includes('agent_distill_capacity')) return '同时进行的进化任务过多,请稍后再试'\n if (m.includes('403')) return '无权限触发进化(403,loopback only)'\n if (m.includes('401') || m === 'unauthorized') return '未授权:请检查 daemon token'\n if (m.includes('500')) return '后端出错(500),请查看 daemon 日志'\n if (m.toLowerCase().includes('failed to fetch')) return '无法连接 daemon,请确认服务已启动'\n return m\n}\n\n/** SSE 事件 type → 中文 badge。 */\nexport function agentRunEventBadge(\n type: AgentDistillEventType,\n): { color: string; label: string } {\n switch (type) {\n case 'connected':\n return { color: 'gray', label: '建连' }\n case 'start':\n return { color: 'arcoblue', label: '启动' }\n case 'phase-changed':\n return { color: 'blue', label: '阶段' }\n case 'distiller-spawned':\n return { color: 'purple', label: 'spawn' }\n case 'draft-written':\n return { color: 'green', label: '草案✓' }\n case 'anchor-rejected':\n return { color: 'red', label: '越界拒' }\n case 'done':\n return { color: 'green', label: '完成' }\n case 'cancelled':\n return { color: 'orange', label: '取消' }\n case 'error':\n return { color: 'red', label: '错误' }\n default:\n return { color: 'gray', label: String(type) }\n }\n}\n","/**\n * useAgentDistillRun — Agent 进化向导 (decision 568a8c53) 取数 + 副作用 hook。\n *\n * 镜像 useDistillRun.ts:\n * useAgentDistillPreview(name) — GET /preview/:agent(免费 dry-run,不 spawn)\n * useAgentDistillCost(name) — GET /cost-estimate/:agent(二次确认成本预估)\n * useAgentDistillStatus() — GET /status(isBusy + claudeCli)\n * useAgentDistillDraft(name,tv) — GET /draft/:agent(diff 展示 + 采纳数据源)\n * useAgentDistillRunController() — POST /run → EventSource SSE(含刷新重连)\n * adopt / rollback mutations — POST /api/agent/adopt | /api/agent/rollback\n *\n * SSE 解析逻辑全在纯函数 agent-distill-run-derive.ts,本 hook 只管 EventSource\n * 生命周期。故可喂模拟事件流单测,无需真触发 spawn(真烧 LLM)。\n *\n * ⚠️ 成本:POST /run 真 spawn `claude -p --agent agent-retro-distiller`。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { authFetch } from '../utils/auth'\nimport {\n reduceAgentDistillRunEvents,\n AGENT_DISTILL_EVENT_TYPES,\n type AgentDistillRunEvent,\n type AgentDistillEventType,\n type AgentDistillPreviewResp,\n type AgentDistillCostResp,\n type AgentDistillStatusResp,\n type AgentDistillDraftResp,\n type AgentRunView,\n} from './agent-distill-run-derive'\n\n// ─── fetch helpers ───────────────────────────────────────────────────────────\n\nasync function fetchPreview(name: string): Promise<AgentDistillPreviewResp> {\n const r = await fetch(`/api/agent/distill/preview/${encodeURIComponent(name)}`)\n if (!r.ok) throw new Error(`preview → ${r.status}`)\n return r.json() as Promise<AgentDistillPreviewResp>\n}\n\nasync function fetchCost(name: string): Promise<AgentDistillCostResp> {\n const r = await fetch(`/api/agent/distill/cost-estimate/${encodeURIComponent(name)}`)\n if (!r.ok) throw new Error(`cost → ${r.status}`)\n return r.json() as Promise<AgentDistillCostResp>\n}\n\nasync function fetchStatus(): Promise<AgentDistillStatusResp> {\n const r = await fetch('/api/agent/distill/status')\n if (!r.ok) throw new Error(`status → ${r.status}`)\n return r.json() as Promise<AgentDistillStatusResp>\n}\n\nasync function fetchDraft(name: string, targetVersion?: number): Promise<AgentDistillDraftResp> {\n const q = targetVersion ? `?targetVersion=${targetVersion}` : ''\n const r = await fetch(`/api/agent/distill/draft/${encodeURIComponent(name)}${q}`)\n if (!r.ok) throw new Error(`draft → ${r.status}`)\n return r.json() as Promise<AgentDistillDraftResp>\n}\n\nasync function postRun(agent: string): Promise<{ runId: string; streamUrl: string }> {\n const r = await authFetch('/api/agent/distill/run', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ agent }),\n })\n if (r.status === 409) {\n const body = (await r.json().catch(() => ({}))) as { error?: string }\n throw new Error(body.error || 'agent_distill_in_progress')\n }\n if (!r.ok) throw new Error(`run → ${r.status}`)\n return r.json() as Promise<{ runId: string; streamUrl: string }>\n}\n\nasync function postCancel(runId: string): Promise<void> {\n const r = await authFetch(`/api/agent/distill/cancel/${encodeURIComponent(runId)}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n if (!r.ok) throw new Error(`cancel → ${r.status}`)\n}\n\n// ─── 预览 / 成本 / 状态 / 草案 query ──────────────────────────────────────────\n\nexport function useAgentDistillPreview(name: string) {\n return useQuery({\n queryKey: ['agent-distill-preview', name],\n queryFn: () => fetchPreview(name),\n enabled: !!name,\n })\n}\n\nexport function useAgentDistillCost(name: string, enabled = true) {\n return useQuery({\n queryKey: ['agent-distill-cost', name],\n queryFn: () => fetchCost(name),\n enabled: enabled && !!name,\n })\n}\n\nexport function useAgentDistillStatus() {\n return useQuery({\n queryKey: ['agent-distill-status'],\n queryFn: fetchStatus,\n refetchInterval: (q) =>\n (q.state.data as AgentDistillStatusResp | undefined)?.isBusy ? 5_000 : 60_000,\n })\n}\n\nexport function useAgentDistillDraft(name: string, targetVersion?: number, enabled = true) {\n return useQuery({\n queryKey: ['agent-distill-draft', name, targetVersion ?? null],\n queryFn: () => fetchDraft(name, targetVersion),\n enabled: enabled && !!name,\n retry: false,\n })\n}\n\n// ─── adopt / rollback mutations ───────────────────────────────────────────────\n\nexport interface AdoptArgs {\n agent: string\n targetVersion: number\n /** Must be true — proves the human viewed the diff. */\n confirmedDiff: true\n}\n\nexport function useAdoptMutation() {\n const qc = useQueryClient()\n return useMutation({\n mutationFn: async (args: AdoptArgs) => {\n const r = await authFetch('/api/agent/adopt', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(args),\n })\n const body = (await r.json().catch(() => ({}))) as Record<string, unknown>\n if (!r.ok) throw new Error((body.error as string) || `adopt → ${r.status}`)\n return body\n },\n onSuccess: (_d, vars) => {\n void qc.invalidateQueries({ queryKey: ['agent-distill-preview', vars.agent] })\n void qc.invalidateQueries({ queryKey: ['agent-distill-status'] })\n },\n })\n}\n\nexport interface RollbackArgs {\n agent: string\n toVersion: number\n confirmed: true\n}\n\nexport function useRollbackMutation() {\n const qc = useQueryClient()\n return useMutation({\n mutationFn: async (args: RollbackArgs) => {\n const r = await authFetch('/api/agent/rollback', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(args),\n })\n const body = (await r.json().catch(() => ({}))) as Record<string, unknown>\n if (!r.ok) throw new Error((body.error as string) || `rollback → ${r.status}`)\n return body\n },\n onSuccess: (_d, vars) => {\n void qc.invalidateQueries({ queryKey: ['agent-distill-preview', vars.agent] })\n },\n })\n}\n\n// ─── run + SSE controller ─────────────────────────────────────────────────────\n\nexport interface AgentDistillRunController {\n view: AgentRunView\n runId: string | null\n submitting: boolean\n submitError: Error | null\n start: (agent: string) => Promise<void>\n reconnect: (runId: string) => void\n cancel: () => Promise<void>\n reset: () => void\n}\n\nexport function useAgentDistillRunController(): AgentDistillRunController {\n const qc = useQueryClient()\n const [events, setEvents] = useState<AgentDistillRunEvent[]>([])\n const [runId, setRunId] = useState<string | null>(null)\n const [submitting, setSubmitting] = useState(false)\n const [submitError, setSubmitError] = useState<Error | null>(null)\n const esRef = useRef<EventSource | null>(null)\n\n const closeStream = useCallback(() => {\n if (esRef.current) {\n esRef.current.close()\n esRef.current = null\n }\n }, [])\n\n useEffect(() => closeStream, [closeStream])\n\n const subscribe = useCallback(\n (id: string) => {\n closeStream()\n const es = new EventSource(`/api/agent/distill/run/${encodeURIComponent(id)}/stream`)\n esRef.current = es\n const dispatch = (type: AgentDistillEventType) => (msg: MessageEvent) => {\n let data: Record<string, unknown> = {}\n try {\n data = JSON.parse((msg.data as string) || '{}')\n } catch {\n /* malformed — keep type only */\n }\n const ev = { ...data, type } as AgentDistillRunEvent\n setEvents((prev) => [...prev, ev])\n if (type === 'done' || type === 'error' || type === 'cancelled') {\n es.close()\n esRef.current = null\n void qc.invalidateQueries({ queryKey: ['agent-distill-status'] })\n void qc.invalidateQueries({ queryKey: ['agent-distill-draft'] })\n }\n }\n for (const t of AGENT_DISTILL_EVENT_TYPES) {\n es.addEventListener(t, dispatch(t) as EventListener)\n }\n es.onerror = () => {\n setEvents((prev) => {\n const last = prev[prev.length - 1]\n if (last && (last.type === 'done' || last.type === 'error' || last.type === 'cancelled')) {\n return prev\n }\n return [...prev, { type: 'error', errorMessage: 'SSE 连接中断(daemon 不可达或已断流)' }]\n })\n }\n },\n [closeStream, qc],\n )\n\n const start = useCallback(\n async (agent: string) => {\n setSubmitError(null)\n setSubmitting(true)\n setEvents([])\n try {\n const { runId: id } = await postRun(agent)\n setRunId(id)\n subscribe(id)\n } catch (err) {\n setSubmitError(err as Error)\n } finally {\n setSubmitting(false)\n }\n },\n [subscribe],\n )\n\n const reconnect = useCallback(\n (id: string) => {\n if (runId === id && esRef.current) return\n setSubmitError(null)\n setEvents([])\n setRunId(id)\n subscribe(id)\n },\n [runId, subscribe],\n )\n\n const cancel = useCallback(async () => {\n if (!runId) return\n try {\n await postCancel(runId)\n } catch {\n /* best-effort */\n }\n }, [runId])\n\n const reset = useCallback(() => {\n closeStream()\n setEvents([])\n setRunId(null)\n setSubmitError(null)\n }, [closeStream])\n\n return {\n view: reduceAgentDistillRunEvents(events),\n runId,\n submitting,\n submitError,\n start,\n reconnect,\n cancel,\n reset,\n }\n}\n","/**\n * AgentDistillRunPage — Agent 进化向导 /ai/agents/:name/distill\n * (Q1 完整闭环 Option B, decision 568a8c53).\n *\n * 三段式向导(镜像 DistillRunPage 的 SSE 向导):\n * ① 预览(dry-run 卡片,免费不 spawn):maturity / enough_signal /\n * proposed_change_types / drift / 成本预估。\n * ② 生成草案:二次确认弹窗带成本预估 + 「真烧 LLM」警示 → POST /run → SSE 进度。\n * ③ 草案 diff + 采纳(写模板)/ 回退按钮。\n * - 采纳按钮默认 disabled,仅当用户展开看过 diff(hasViewedDiff)才激活;\n * 点击弹二次确认 → POST /api/agent/adopt with confirmedDiff:true。\n *\n * ⚠️ 成本:点「生成草案」会真 spawn `claude -p --agent agent-retro-distiller`。\n * 预览与 diff 展示免费;采纳/回退是纯文件写,不烧 LLM。\n */\nimport { useEffect, useRef, useState } from 'react'\nimport { useParams, useNavigate } from 'react-router-dom'\n\nimport Card from '@arco-design/web-react/es/Card'\nimport Steps from '@arco-design/web-react/es/Steps'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Button from '@arco-design/web-react/es/Button'\nimport Alert from '@arco-design/web-react/es/Alert'\nimport Spin from '@arco-design/web-react/es/Spin'\nimport Space from '@arco-design/web-react/es/Space'\nimport Modal from '@arco-design/web-react/es/Modal'\nimport Message from '@arco-design/web-react/es/Message'\nimport { IconLeft, IconThunderbolt, IconCheckCircle, IconRefresh } from '@arco-design/web-react/icon'\n\nimport {\n useAgentDistillPreview,\n useAgentDistillCost,\n useAgentDistillStatus,\n useAgentDistillDraft,\n useAgentDistillRunController,\n useAdoptMutation,\n useRollbackMutation,\n} from '../../hooks/useAgentDistillRun'\nimport {\n agentRunEventBadge,\n friendlyAgentRunError,\n reconnectableAgentRunId,\n} from '../../hooks/agent-distill-run-derive'\n\nconst Step = Steps.Step\n\nfunction DiffBlock({ patch }: { patch: string }) {\n return (\n <pre\n style={{\n margin: 0,\n padding: 12,\n background: 'var(--color-fill-1)',\n borderRadius: 4,\n fontSize: 12,\n lineHeight: 1.6,\n overflowX: 'auto',\n whiteSpace: 'pre',\n }}\n >\n {patch.split('\\n').map((line, i) => {\n let color: string | undefined\n if (line.startsWith('+') && !line.startsWith('+++')) color = 'rgb(var(--green-6))'\n else if (line.startsWith('-') && !line.startsWith('---')) color = 'rgb(var(--red-6))'\n else if (line.startsWith('@@')) color = 'rgb(var(--arcoblue-6))'\n return (\n <div key={i} style={{ color }}>\n {line || ' '}\n </div>\n )\n })}\n </pre>\n )\n}\n\nexport default function AgentDistillRunPage() {\n const { name = '' } = useParams<{ name: string }>()\n const navigate = useNavigate()\n\n const [current, setCurrent] = useState(0)\n const [hasViewedDiff, setHasViewedDiff] = useState(false)\n const reconnectedRef = useRef(false)\n\n const previewQ = useAgentDistillPreview(name)\n const costQ = useAgentDistillCost(name)\n const statusQ = useAgentDistillStatus()\n const controller = useAgentDistillRunController()\n const view = controller.view\n\n // After a run produces a draft, fetch it for the diff (Step 3).\n const targetVersion = view.targetVersion ?? undefined\n const draftQ = useAgentDistillDraft(name, targetVersion, view.isTerminal && view.phase === 'done')\n\n const adoptM = useAdoptMutation()\n const rollbackM = useRollbackMutation()\n\n // 刷新重连:挂载后若后端有进行中的 run → 跳 Step3 重连 SSE 恢复进度。\n useEffect(() => {\n if (reconnectedRef.current) return\n const id = reconnectableAgentRunId(statusQ.data)\n if (id) {\n reconnectedRef.current = true\n setCurrent(2)\n controller.reconnect(id)\n }\n }, [statusQ.data, controller])\n\n // run 终态进 Step3。\n useEffect(() => {\n if (view.isTerminal && current < 2) setCurrent(2)\n }, [view.isTerminal, current])\n\n const preview = previewQ.data\n\n const onGenerate = () => {\n Modal.confirm({\n title: '生成进化草案(真烧 LLM)',\n content: (\n <div>\n <Typography.Paragraph>\n 将 spawn <code>claude -p --agent agent-retro-distiller</code> 据真实使用信号起草模板改进。\n <strong>这会真实消耗 LLM 额度。</strong>\n </Typography.Paragraph>\n {costQ.data && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 成本量级估算:约 input {costQ.data.inputTokens} + output {costQ.data.outputTokens} tokens({costQ.data.note})\n </Typography.Text>\n )}\n </div>\n ),\n okText: '确认生成',\n cancelText: '取消',\n onOk: async () => {\n setCurrent(2)\n await controller.start(name)\n },\n })\n }\n\n const onAdopt = () => {\n if (!targetVersion) return\n Modal.confirm({\n title: '采纳草案(写模板)',\n content: (\n <Typography.Paragraph>\n 将把 patch 应用到 <code>src/daemon/templates/agents/{name}.md</code>,\n version 机械递增到 <strong>v{targetVersion}</strong>,并字节同步项目级副本\n <code>.claude/agents/{name}.md</code>。anchor-guard 会再校验一次(越界不写)。\n </Typography.Paragraph>\n ),\n okText: '确认采纳',\n cancelText: '取消',\n onOk: async () => {\n try {\n const r = (await adoptM.mutateAsync({ agent: name, targetVersion, confirmedDiff: true })) as {\n version?: number\n }\n Message.success(`已采纳 ${name} → v${r.version ?? targetVersion}(src + 项目级副本字节一致)`)\n } catch (err) {\n Message.error(`采纳失败:${(err as Error).message}`)\n }\n },\n })\n }\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 16 }}>\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <Button type=\"text\" icon={<IconLeft />} onClick={() => navigate(`/ai/agents/${encodeURIComponent(name)}`)}>\n 返回\n </Button>\n <Typography.Title heading={6} style={{ margin: 0 }}>\n Agent 进化向导 · <code>{name}</code>\n </Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 人触发 · 已看 diff 才可采纳 · daemon 永不自动改模板(decision 568a8c53)\n </Typography.Text>\n </div>\n <Steps current={current} style={{ marginTop: 16 }} size=\"small\">\n <Step title=\"预览(免费)\" description=\"dry-run 信号\" />\n <Step title=\"生成草案\" description=\"真烧 LLM\" />\n <Step title=\"diff + 采纳/回退\" description=\"人确认写模板\" />\n </Steps>\n </Card>\n\n {/* Step 1: preview */}\n {current === 0 && (\n <Card bordered title=\"① dry-run 预览(免费,不 spawn)\">\n {previewQ.isLoading && <Spin />}\n {previewQ.isError && <Alert type=\"error\" content=\"预览加载失败(端点不可用或无此 agent 模板)\" />}\n {preview && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <Space wrap>\n <Tag>当前 version: {preview.current_version}</Tag>\n <Tag color={preview.enough_signal ? 'green' : 'orange'}>\n {preview.enough_signal ? '信号充分' : '信号不足'}\n </Tag>\n <Tag color=\"gray\">成熟度: {preview.maturity}</Tag>\n </Space>\n {!preview.enough_signal && preview.insufficient_reason && (\n <Alert type=\"warning\" content={preview.insufficient_reason} />\n )}\n <div>\n <Typography.Text style={{ fontWeight: 600, fontSize: 13 }}>拟改动类型</Typography.Text>\n {preview.proposed_change_types.length === 0 ? (\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n (无足够信号支撑改动,distiller 预期产 NOOP)\n </Typography.Text>\n </div>\n ) : (\n <ul style={{ margin: '4px 0 0', paddingLeft: 18 }}>\n {preview.proposed_change_types.map((t, i) => (\n <li key={i}>\n <Typography.Text style={{ fontSize: 12 }}>{t}</Typography.Text>\n </li>\n ))}\n </ul>\n )}\n </div>\n {preview.drift.length > 0 && (\n <div>\n <Typography.Text style={{ fontWeight: 600, fontSize: 13 }}>drift</Typography.Text>\n <ul style={{ margin: '4px 0 0', paddingLeft: 18 }}>\n {preview.drift.map((d, i) => (\n <li key={i}>\n <Typography.Text style={{ fontSize: 12 }}>\n [{d.kind}] {d.message}\n </Typography.Text>\n </li>\n ))}\n </ul>\n </div>\n )}\n <div>\n <Button\n type=\"primary\"\n icon={<IconThunderbolt />}\n disabled={!preview.enough_signal || statusQ.data?.claudeCliAvailable === false}\n onClick={() => setCurrent(1)}\n >\n 下一步:生成草案\n </Button>\n {statusQ.data?.claudeCliAvailable === false && (\n <Typography.Text type=\"error\" style={{ fontSize: 12, marginLeft: 8 }}>\n claude CLI 不可用,无法 spawn\n </Typography.Text>\n )}\n </div>\n </div>\n )}\n </Card>\n )}\n\n {/* Step 2: generate confirm */}\n {current === 1 && (\n <Card bordered title=\"② 生成草案(真烧 LLM)\">\n <Alert\n type=\"warning\"\n content=\"点击「生成草案」会真实 spawn LLM 并消耗额度。草案落 docs/ 供人审,不自动写模板。\"\n style={{ marginBottom: 12 }}\n />\n <Space>\n <Button onClick={() => setCurrent(0)}>上一步</Button>\n <Button type=\"primary\" icon={<IconThunderbolt />} onClick={onGenerate} loading={controller.submitting}>\n 生成草案\n </Button>\n </Space>\n </Card>\n )}\n\n {/* Step 3: SSE progress + diff + adopt/rollback */}\n {current === 2 && (\n <Card bordered title=\"③ 运行进度 + 草案 diff + 采纳/回退\">\n {controller.submitError && (\n <Alert type=\"error\" content={friendlyAgentRunError(controller.submitError.message)} style={{ marginBottom: 12 }} />\n )}\n {/* SSE log */}\n <div style={{ marginBottom: 12 }}>\n <Space wrap>\n <Tag color={view.phase === 'error' ? 'red' : view.phase === 'done' ? 'green' : 'blue'}>\n {view.phase}\n </Tag>\n {view.maturity && <Tag color=\"gray\">成熟度: {view.maturity}</Tag>}\n </Space>\n <div style={{ marginTop: 8, maxHeight: 200, overflowY: 'auto' }}>\n {view.log.map((ev, i) => {\n const b = agentRunEventBadge(ev.type)\n return (\n <div key={i} style={{ fontSize: 12, marginBottom: 2 }}>\n <Tag color={b.color} size=\"small\">{b.label}</Tag>{' '}\n <Typography.Text type=\"secondary\">{ev.message || ev.errorMessage || ''}</Typography.Text>\n </div>\n )\n })}\n </div>\n </div>\n\n {view.violations.length > 0 && (\n <Alert\n type=\"error\"\n style={{ marginBottom: 12 }}\n content={\n <div>\n <div>anchor-guard 拒绝(patch 触碰保护区,草案未写/不可采纳):</div>\n <ul style={{ margin: '4px 0 0', paddingLeft: 18 }}>\n {view.violations.map((v, i) => (\n <li key={i}>[{v.region}] line {v.patchLine}: {v.line}</li>\n ))}\n </ul>\n </div>\n }\n />\n )}\n\n {/* diff */}\n {view.phase === 'done' && view.draftPath && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {draftQ.isLoading && <Spin />}\n {draftQ.data?.patch ? (\n <>\n <div>\n <Typography.Text style={{ fontWeight: 600, fontSize: 13 }}>\n 草案 diff(v{draftQ.data.currentVersion} → v{draftQ.data.targetVersion})\n </Typography.Text>\n <DiffBlock patch={draftQ.data.patch} />\n </div>\n <Space>\n <Button\n onClick={() => setHasViewedDiff(true)}\n type={hasViewedDiff ? 'default' : 'outline'}\n icon={<IconCheckCircle />}\n >\n {hasViewedDiff ? '已确认看过 diff' : '我已看过 diff'}\n </Button>\n <Button\n type=\"primary\"\n disabled={!hasViewedDiff}\n loading={adoptM.isPending}\n onClick={onAdopt}\n >\n 采纳(写模板)\n </Button>\n <Button\n icon={<IconRefresh />}\n status=\"warning\"\n loading={rollbackM.isPending}\n onClick={() => {\n const to = (draftQ.data?.currentVersion ?? 1)\n Modal.confirm({\n title: '回退到上一版本',\n content: `将尝试回退 ${name} 到 v${to}(沿用 CLI 的 HEAD blob + version 匹配启发式;不匹配会提示去 checkout)。`,\n okText: '确认回退',\n onOk: async () => {\n try {\n await rollbackM.mutateAsync({ agent: name, toVersion: to, confirmed: true })\n Message.success(`已回退 ${name} → v${to}`)\n } catch (err) {\n Message.error(`回退失败:${(err as Error).message}`)\n }\n },\n })\n }}\n >\n 回退\n </Button>\n </Space>\n </>\n ) : (\n view.terminalMessage && <Alert type=\"info\" content={view.terminalMessage} />\n )}\n </div>\n )}\n\n {view.phase !== 'done' && view.isTerminal && view.terminalMessage && (\n <Alert type={view.phase === 'error' ? 'error' : 'warning'} content={view.terminalMessage} />\n )}\n\n <div style={{ marginTop: 12 }}>\n <Button onClick={() => { controller.reset(); setHasViewedDiff(false); setCurrent(0) }}>\n 重新开始\n </Button>\n </div>\n </Card>\n )}\n </div>\n )\n}\n"],"names":["AGENT_DISTILL_EVENT_TYPES","TERMINAL_TYPES","reduceAgentDistillRunEvents","events","connected","spawned","phase","draftPath","targetVersion","currentVersion","maturity","violations","terminalMessage","errorMessage","isTerminal","ev","reconnectableAgentRunId","status","id","friendlyAgentRunError","message","m","agentRunEventBadge","type","fetchPreview","name","r","fetchCost","fetchStatus","fetchDraft","q","postRun","agent","authFetch","body","postCancel","runId","useAgentDistillPreview","useQuery","useAgentDistillCost","enabled","useAgentDistillStatus","_a","useAgentDistillDraft","useAdoptMutation","qc","useQueryClient","useMutation","args","_d","vars","useRollbackMutation","useAgentDistillRunController","setEvents","useState","setRunId","submitting","setSubmitting","submitError","setSubmitError","esRef","useRef","closeStream","useCallback","useEffect","subscribe","es","dispatch","msg","data","prev","t","last","start","err","reconnect","cancel","reset","Step","Steps","DiffBlock","patch","jsx","line","i","color","AgentDistillRunPage","useParams","navigate","useNavigate","current","setCurrent","hasViewedDiff","setHasViewedDiff","reconnectedRef","previewQ","costQ","statusQ","controller","view","draftQ","adoptM","rollbackM","preview","onGenerate","Modal","jsxs","Typography","onAdopt","Message","Card","Button","IconLeft","Spin","Alert","Space","Tag","d","IconThunderbolt","_b","b","v","_c","Fragment","IconCheckCircle","IconRefresh","to"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./react-vendor-tkvCrao7.js";import{D as m,J as f,T as s,a1 as y,a6 as T,b as u,F as v,N as b}from"./arco-DV6xCLhr.js";import{u as S,f as z,a as _,b as I}from"./useAgentStats-B-uTgqBd.js";import{u as w}from"./query-CgCOpYWf.js";import{u as k,b as A}from"./index-DileOOE4.js";import{u as R}from"./useEffectiveProject-DQiyX54y.js";import{G as j}from"./GlobalScopeHint-Q3wTJx3F.js";import{u as W}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./lucide-CnlPQoG8.js";async function C(t){const i=await fetch(t);if(!i.ok)throw new Error(`${t} → ${i.status}`);return i.json()}function D(){const{window:t}=k(),{project:i,isAllProjects:o}=R(),a=w({queryKey:["agent-health",t,i],queryFn:()=>C(A(`/api/insights/agent-health?days=${t}`,i)),refetchInterval:6e4,refetchIntervalInBackground:!1});return{data:a.data,loading:a.isLoading,isError:a.isError,error:a.error??null,project:i,isAllProjects:o,refetch:()=>a.refetch()}}function P(){var n,p;const{data:t,loading:i,isError:o,project:a,isAllProjects:c}=D(),g=[];for(const l of(t==null?void 0:t.agents)??[])for(const d of l.recommended_skills)d.recommendation_health==="dead"&&g.push({agent:l.agent,skill_id:d.skill_id,actionable_rate:d.actionable_rate,pulls:d.pulls});const x=((t==null?void 0:t.agents)??[]).flatMap(l=>l.suggestions),h=((n=t==null?void 0:t.skill_drift)==null?void 0:n.dangling_refs)??[],r=((p=t==null?void 0:t.skill_drift)==null?void 0:p.orphan_skills)??[];return e.jsxs(f,{bordered:!0,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap",marginBottom:12},children:[e.jsx(s.Title,{heading:6,style:{margin:0},children:"Agent 体检"}),e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:"(agent,skill) 推荐健康 · 死推荐 / 弱推荐 / 双向 drift(人点击触发进化,daemon 不自动改模板)"}),e.jsx(j,{project:a,isAllProjects:c,usageLabel:"体检统计"})]}),i&&e.jsx(s.Text,{type:"secondary",children:"加载中…"}),o&&e.jsx(s.Text,{type:"error",children:"体检数据加载失败"}),!i&&!o&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:12},children:[e.jsxs("div",{children:[e.jsx(s.Text,{style:{fontWeight:600,fontSize:13},children:"死推荐 (recommendation_health=dead)"}),g.length===0?e.jsx("div",{children:e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:"无"})}):e.jsx(y,{rowKey:l=>`${l.agent}::${l.skill_id}`,data:g,pagination:!1,border:{wrapper:!1,cell:!1},columns:[{title:"Agent",dataIndex:"agent"},{title:"Skill",dataIndex:"skill_id"},{title:"pull",dataIndex:"pulls"},{title:"actionable",dataIndex:"actionable_rate",render:l=>e.jsxs(u,{color:"red",children:[(l*100).toFixed(1),"%"]})}]})]}),x.length>0&&e.jsxs("div",{children:[e.jsx(s.Text,{style:{fontWeight:600,fontSize:13},children:"建议"}),e.jsx("ul",{style:{margin:"4px 0 0",paddingLeft:18},children:x.map((l,d)=>e.jsx("li",{children:e.jsx(s.Text,{style:{fontSize:12},children:l})},d))})]}),(h.length>0||r.length>0)&&e.jsxs("div",{children:[e.jsx(s.Text,{style:{fontWeight:600,fontSize:13},children:"双向 drift"}),e.jsx("ul",{style:{margin:"4px 0 0",paddingLeft:18},children:[...h,...r].map((l,d)=>e.jsx("li",{children:e.jsxs(s.Text,{style:{fontSize:12},children:["[",l.kind,"] ",l.message]})},d))})]})]})]})}function E(t){if(t.rated===0)return e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:"未评分"});const i=t.successRate??0,o=i>=.8?"rgb(var(--green-6))":i>=.5?"rgb(var(--orange-6))":"rgb(var(--red-6))";return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:2},children:[e.jsx(s.Text,{style:{fontWeight:600,fontSize:13,color:o},children:I(t.successRate)}),e.jsxs(s.Text,{type:"secondary",style:{fontSize:11},children:[t.success," success · ",t.partial," partial · ",t.failed," failed",t.unrated>0?` · ${t.unrated} 未结`:""]})]})}function J(){const t=W(),{view:i,loading:o,isError:a,error:c,project:g,isAllProjects:x}=S();if(a)return e.jsx("div",{style:{padding:16},children:e.jsx(m,{status:"error",title:"加载 Agent 委托失败",subTitle:(c==null?void 0:c.message)||"/api/insights/agent-stats 端点不可用"})});const h=[{title:"Agent",dataIndex:"agent",render:(r,n)=>e.jsxs("div",{style:{minWidth:0},children:[e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e.jsx(s.Text,{code:!0,style:{fontSize:13},children:n.agent}),n.source==="builtin"&&e.jsx(u,{color:"gray",size:"small",children:"built-in"})]}),n.role&&e.jsx("div",{style:{marginTop:2},children:e.jsx(s.Text,{type:"secondary",style:{fontSize:12},ellipsis:{rows:1,showTooltip:!0},children:n.role})})]})},{title:"委托次数",dataIndex:"delegations",width:100,sorter:(r,n)=>r.delegations-n.delegations,render:(r,n)=>e.jsx(s.Text,{style:{fontWeight:600},children:n.delegations})},{title:"成功率",dataIndex:"successRate",width:196,sorter:(r,n)=>(r.successRate??-1)-(n.successRate??-1),render:(r,n)=>E(n)},{title:"平均耗时",dataIndex:"avgDurationMs",width:110,sorter:(r,n)=>(r.avgDurationMs??-1)-(n.avgDurationMs??-1),render:(r,n)=>e.jsx(s.Text,{style:{fontSize:13},children:z(n.avgDurationMs)})},{title:"最近委托",dataIndex:"lastTs",width:124,sorter:(r,n)=>r.lastTs-n.lastTs,render:(r,n)=>e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:_(n.lastTs)})},{title:"操作",dataIndex:"op",width:76,align:"right",render:(r,n)=>e.jsxs(v,{type:"text",size:"mini",onClick:p=>{p.stopPropagation(),t(`/ai/agents/${encodeURIComponent(n.agent)}`)},children:["详情 ",e.jsx(b,{})]})}];return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsx(P,{}),e.jsx(f,{bordered:!0,children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(s.Title,{heading:6,style:{margin:0},children:"Agent 委托"}),e.jsx(s.Text,{type:"secondary",style:{fontSize:12},children:"子 agent 委托与结局 · agent_spawn(按委托次数排序)"}),e.jsx(j,{project:g,isAllProjects:x,usageLabel:"委托统计"}),e.jsx("div",{style:{flex:1}}),e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:["Agent 数"," ",e.jsx(s.Text,{style:{fontWeight:600},children:i.totalAgents})]}),e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:["总委托"," ",e.jsx(s.Text,{style:{fontWeight:600,color:"rgb(var(--arcoblue-6))"},children:i.totalDelegations})]}),e.jsxs(s.Text,{type:"secondary",style:{fontSize:12},children:["已结局"," ",e.jsxs(s.Text,{style:{fontWeight:600},children:[i.totalSuccess,"/",i.totalRated," success"]})]})]})}),e.jsx(f,{bordered:!0,style:{padding:0},children:e.jsx(y,{rowKey:"agent",loading:o,data:i.rows,columns:h,pagination:i.rows.length>20?{pageSize:20,showTotal:!0}:!1,border:{wrapper:!1,cell:!1},noDataElement:e.jsx(s.Text,{type:"secondary",children:"窗口内暂无 agent 委托记录"}),onRow:r=>({onClick:()=>t(`/ai/agents/${encodeURIComponent(r.agent)}`),style:{cursor:"pointer"}})})}),e.jsxs(s.Text,{type:"secondary",style:{fontSize:11,paddingLeft:4},children:[e.jsx(T,{style:{marginRight:4}}),"成功率口径 = success / (success+partial+failed);未结局(active/无 outcome)委托不计入分母。"]})]})}export{J as default};
2
+ //# sourceMappingURL=AgentsPage-Qd9FExLG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentsPage-Qd9FExLG.js","sources":["../../src/hooks/useAgentHealth.ts","../../src/pages/ai/AgentsPage.tsx"],"sourcesContent":["/**\n * useAgentHealth — Agent 体检取数 hook (decision 234f1ad4, Phase 1 / P1-3)。\n *\n * 全局时间窗 `useTimeWindow()` 驱动 queryKey(切换 7d/30d/90d 自动重拉)。\n * 接真实端点:GET /api/insights/agent-health?days= → per-agent 体检 +\n * (agent,skill) 推荐 skill 健康 + 双向 drift + 主线程违规。\n */\nimport { useQuery } from '@tanstack/react-query'\n\nimport { useTimeWindow } from '../lib/time-window'\nimport { useEffectiveProject } from './useEffectiveProject'\nimport { appendProject } from '../utils/kbProject'\n\nexport type RecommendationHealth = 'live' | 'dead' | 'unrated' | 'unused'\n\nexport interface RecommendedSkillHealth {\n skill_id: string\n pulls: number\n helped: number\n partial: number\n not_actionable: number\n total_rated: number\n pending: number\n actionable_rate: number\n recommendation_health: RecommendationHealth\n}\n\nexport interface AgentHealthRow {\n agent: string\n source: 'builtin' | 'project'\n delegations: number\n success: number\n partial: number\n failed: number\n unrated: number\n success_rate: number | null\n success_rate_basis: 'indirect' | 'insufficient_data'\n avg_duration_ms: number | null\n last_ts: number\n weak_skills: Array<{ skill_id: string; actionable_rate: number; total_rated: number; pulls: number }>\n recommended_skills: RecommendedSkillHealth[]\n kb_usage: { pulls: number; total_rated: number; helped: number; actionable_rate: number } | null\n suggestions: string[]\n}\n\nexport interface DriftNudge {\n kind: 'no-pull' | 'dangling-ref' | 'orphan-skill'\n agent?: string\n skill_id?: string\n message: string\n}\n\nexport interface AgentHealthResp {\n generated_at: string\n days: number\n agents: AgentHealthRow[]\n main_thread_violations: {\n total: number\n by_rule: Array<{ rule_id: string; count: number }>\n note: string\n }\n skill_drift: {\n dangling_refs: DriftNudge[]\n orphan_skills: DriftNudge[]\n no_pull: DriftNudge[]\n }\n}\n\nasync function fetchJson<T>(url: string): Promise<T> {\n const r = await fetch(url)\n if (!r.ok) throw new Error(`${url} → ${r.status}`)\n return r.json() as Promise<T>\n}\n\nexport interface AgentHealthResult {\n data: AgentHealthResp | undefined\n loading: boolean\n isError: boolean\n error: Error | null\n /** Effective project filter applied ('' = all). decision dd79010a. */\n project: string\n /** True when the explicit all-projects view is selected. */\n isAllProjects: boolean\n refetch: () => void\n}\n\n/** Agent 体检取数(受全局时间窗 + 全局项目筛选驱动)。 */\nexport function useAgentHealth(): AgentHealthResult {\n const { window: win } = useTimeWindow()\n const { project, isAllProjects } = useEffectiveProject()\n\n const q = useQuery({\n queryKey: ['agent-health', win, project],\n queryFn: () =>\n fetchJson<AgentHealthResp>(\n appendProject(`/api/insights/agent-health?days=${win}`, project),\n ),\n refetchInterval: 60_000,\n refetchIntervalInBackground: false,\n })\n\n return {\n data: q.data,\n loading: q.isLoading,\n isError: q.isError,\n error: (q.error as Error) ?? null,\n project,\n isAllProjects,\n refetch: () => q.refetch(),\n }\n}\n","/**\n * AgentsPage — AI 资源 · Agent 委托列表 (Phase 2d, decision 29688066).\n *\n * 替换 `/ai/agents` 的占位组件。把原型「Agent 委托」列表翻译成真 Arco\n * 组件(**严禁直搬原型 Tailwind CSS**):Card 页头汇总 + Arco Table(按委托次数排序),\n * 列:agent 名(+ built-in 标)/ 角色 / 委托次数 / 成功率 / 平均耗时 / 最近委托 / 操作。\n * 点行进整页详情 `/ai/agents/:name`。数据接真实端点(见 useAgentStats),受全局时间窗驱动。\n *\n * 口径见 agent-derive.ts:委托次数=agents[].delegations;成功率=success/rated\n * (rated=success+partial+failed,全 unrated → 未评分);平均耗时=avg_duration_ms。\n */\nimport { useNavigate } from 'react-router-dom'\n\nimport Card from '@arco-design/web-react/es/Card'\nimport Table from '@arco-design/web-react/es/Table'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Button from '@arco-design/web-react/es/Button'\nimport Result from '@arco-design/web-react/es/Result'\nimport { IconRight, IconUserGroup } from '@arco-design/web-react/icon'\n\nimport { useAgentStats } from '../../hooks/useAgentStats'\nimport { useAgentHealth } from '../../hooks/useAgentHealth'\nimport GlobalScopeHint from '../../components/ai/GlobalScopeHint'\nimport {\n formatPct,\n formatTs,\n formatDuration,\n type AgentRow,\n} from '../../hooks/agent-derive'\n\n/** Agent 体检卡片 (decision 234f1ad4, Phase 1):死推荐 / 建议 / 双向 drift。 */\nfunction AgentHealthCard() {\n const { data, loading, isError, project, isAllProjects } = useAgentHealth()\n\n const deadPairs: Array<{ agent: string; skill_id: string; actionable_rate: number; pulls: number }> = []\n for (const a of data?.agents ?? []) {\n for (const r of a.recommended_skills) {\n if (r.recommendation_health === 'dead') {\n deadPairs.push({ agent: a.agent, skill_id: r.skill_id, actionable_rate: r.actionable_rate, pulls: r.pulls })\n }\n }\n }\n const suggestions = (data?.agents ?? []).flatMap((a) => a.suggestions)\n const dangling = data?.skill_drift?.dangling_refs ?? []\n const orphans = data?.skill_drift?.orphan_skills ?? []\n\n return (\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap', marginBottom: 12 }}>\n <Typography.Title heading={6} style={{ margin: 0 }}>\n Agent 体检\n </Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n (agent,skill) 推荐健康 · 死推荐 / 弱推荐 / 双向 drift(人点击触发进化,daemon 不自动改模板)\n </Typography.Text>\n <GlobalScopeHint project={project} isAllProjects={isAllProjects} usageLabel=\"体检统计\" />\n </div>\n {loading && <Typography.Text type=\"secondary\">加载中…</Typography.Text>}\n {isError && <Typography.Text type=\"error\">体检数据加载失败</Typography.Text>}\n {!loading && !isError && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n <div>\n <Typography.Text style={{ fontWeight: 600, fontSize: 13 }}>\n 死推荐 (recommendation_health=dead)\n </Typography.Text>\n {deadPairs.length === 0 ? (\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>无</Typography.Text>\n </div>\n ) : (\n <Table\n rowKey={(r: { agent: string; skill_id: string }) => `${r.agent}::${r.skill_id}`}\n data={deadPairs}\n pagination={false}\n border={{ wrapper: false, cell: false }}\n columns={[\n { title: 'Agent', dataIndex: 'agent' },\n { title: 'Skill', dataIndex: 'skill_id' },\n {\n title: 'pull',\n dataIndex: 'pulls',\n },\n {\n title: 'actionable',\n dataIndex: 'actionable_rate',\n render: (v: number) => (\n <Tag color=\"red\">{(v * 100).toFixed(1)}%</Tag>\n ),\n },\n ]}\n />\n )}\n </div>\n {suggestions.length > 0 && (\n <div>\n <Typography.Text style={{ fontWeight: 600, fontSize: 13 }}>建议</Typography.Text>\n <ul style={{ margin: '4px 0 0', paddingLeft: 18 }}>\n {suggestions.map((s, i) => (\n <li key={i}>\n <Typography.Text style={{ fontSize: 12 }}>{s}</Typography.Text>\n </li>\n ))}\n </ul>\n </div>\n )}\n {(dangling.length > 0 || orphans.length > 0) && (\n <div>\n <Typography.Text style={{ fontWeight: 600, fontSize: 13 }}>双向 drift</Typography.Text>\n <ul style={{ margin: '4px 0 0', paddingLeft: 18 }}>\n {[...dangling, ...orphans].map((d, i) => (\n <li key={i}>\n <Typography.Text style={{ fontSize: 12 }}>\n [{d.kind}] {d.message}\n </Typography.Text>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </Card>\n )\n}\n\nfunction successCell(row: AgentRow) {\n if (row.rated === 0) {\n return (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 未评分\n </Typography.Text>\n )\n }\n const rate = row.successRate ?? 0\n const color =\n rate >= 0.8 ? 'rgb(var(--green-6))' : rate >= 0.5 ? 'rgb(var(--orange-6))' : 'rgb(var(--red-6))'\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n <Typography.Text style={{ fontWeight: 600, fontSize: 13, color }}>\n {formatPct(row.successRate)}\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n {row.success} success · {row.partial} partial · {row.failed} failed\n {row.unrated > 0 ? ` · ${row.unrated} 未结` : ''}\n </Typography.Text>\n </div>\n )\n}\n\nexport default function AgentsPage() {\n const navigate = useNavigate()\n const { view, loading, isError, error, project, isAllProjects } = useAgentStats()\n\n if (isError) {\n return (\n <div style={{ padding: 16 }}>\n <Result\n status=\"error\"\n title=\"加载 Agent 委托失败\"\n subTitle={error?.message || '/api/insights/agent-stats 端点不可用'}\n />\n </div>\n )\n }\n\n const columns = [\n {\n title: 'Agent',\n dataIndex: 'agent',\n render: (_: unknown, row: AgentRow) => (\n <div style={{ minWidth: 0 }}>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <Typography.Text code style={{ fontSize: 13 }}>\n {row.agent}\n </Typography.Text>\n {row.source === 'builtin' && (\n <Tag color=\"gray\" size=\"small\">\n built-in\n </Tag>\n )}\n </span>\n {row.role && (\n <div style={{ marginTop: 2 }}>\n <Typography.Text\n type=\"secondary\"\n style={{ fontSize: 12 }}\n ellipsis={{ rows: 1, showTooltip: true }}\n >\n {row.role}\n </Typography.Text>\n </div>\n )}\n </div>\n ),\n },\n {\n title: '委托次数',\n dataIndex: 'delegations',\n width: 100,\n sorter: (a: AgentRow, b: AgentRow) => a.delegations - b.delegations,\n render: (_: unknown, row: AgentRow) => (\n <Typography.Text style={{ fontWeight: 600 }}>{row.delegations}</Typography.Text>\n ),\n },\n {\n title: '成功率',\n dataIndex: 'successRate',\n width: 196,\n sorter: (a: AgentRow, b: AgentRow) => (a.successRate ?? -1) - (b.successRate ?? -1),\n render: (_: unknown, row: AgentRow) => successCell(row),\n },\n {\n title: '平均耗时',\n dataIndex: 'avgDurationMs',\n width: 110,\n sorter: (a: AgentRow, b: AgentRow) => (a.avgDurationMs ?? -1) - (b.avgDurationMs ?? -1),\n render: (_: unknown, row: AgentRow) => (\n <Typography.Text style={{ fontSize: 13 }}>\n {formatDuration(row.avgDurationMs)}\n </Typography.Text>\n ),\n },\n {\n title: '最近委托',\n dataIndex: 'lastTs',\n width: 124,\n sorter: (a: AgentRow, b: AgentRow) => a.lastTs - b.lastTs,\n render: (_: unknown, row: AgentRow) => (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {formatTs(row.lastTs)}\n </Typography.Text>\n ),\n },\n {\n title: '操作',\n dataIndex: 'op',\n width: 76,\n align: 'right' as const,\n render: (_: unknown, row: AgentRow) => (\n <Button\n type=\"text\"\n size=\"mini\"\n onClick={(e) => {\n e.stopPropagation()\n navigate(`/ai/agents/${encodeURIComponent(row.agent)}`)\n }}\n >\n 详情 <IconRight />\n </Button>\n ),\n },\n ]\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 16 }}>\n <AgentHealthCard />\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <Typography.Title heading={6} style={{ margin: 0 }}>\n Agent 委托\n </Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 子 agent 委托与结局 · agent_spawn(按委托次数排序)\n </Typography.Text>\n <GlobalScopeHint project={project} isAllProjects={isAllProjects} usageLabel=\"委托统计\" />\n <div style={{ flex: 1 }} />\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n Agent 数{' '}\n <Typography.Text style={{ fontWeight: 600 }}>{view.totalAgents}</Typography.Text>\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 总委托{' '}\n <Typography.Text style={{ fontWeight: 600, color: 'rgb(var(--arcoblue-6))' }}>\n {view.totalDelegations}\n </Typography.Text>\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 已结局{' '}\n <Typography.Text style={{ fontWeight: 600 }}>\n {view.totalSuccess}/{view.totalRated} success\n </Typography.Text>\n </Typography.Text>\n </div>\n </Card>\n\n <Card bordered style={{ padding: 0 }}>\n <Table<AgentRow>\n rowKey=\"agent\"\n loading={loading}\n data={view.rows}\n columns={columns}\n pagination={view.rows.length > 20 ? { pageSize: 20, showTotal: true } : false}\n border={{ wrapper: false, cell: false }}\n noDataElement={\n <Typography.Text type=\"secondary\">窗口内暂无 agent 委托记录</Typography.Text>\n }\n onRow={(row) => ({\n onClick: () => navigate(`/ai/agents/${encodeURIComponent(row.agent)}`),\n style: { cursor: 'pointer' },\n })}\n />\n </Card>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11, paddingLeft: 4 }}>\n <IconUserGroup style={{ marginRight: 4 }} />\n 成功率口径 = success / (success+partial+failed);未结局(active/无 outcome)委托不计入分母。\n </Typography.Text>\n </div>\n )\n}\n"],"names":["fetchJson","url","r","useAgentHealth","win","useTimeWindow","project","isAllProjects","useEffectiveProject","q","useQuery","appendProject","AgentHealthCard","data","loading","isError","deadPairs","a","suggestions","dangling","_a","orphans","_b","jsxs","Card","jsx","Typography","GlobalScopeHint","Table","v","Tag","s","i","d","successCell","row","rate","color","formatPct","AgentsPage","navigate","useNavigate","view","error","useAgentStats","Result","columns","_","b","formatDuration","formatTs","Button","e","IconRight","IconUserGroup"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./react-vendor-tkvCrao7.js";import{u}from"./query-CgCOpYWf.js";import{d as m,f as p}from"./index-DileOOE4.js";import{J as l,T as o,b as i,F as x,ad as h,S as f,$ as y}from"./arco-DV6xCLhr.js";import"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./lucide-CnlPQoG8.js";const j={alive:{color:"green",label:"运行中"},stale:{color:"orange",label:"心跳过期"},dead:{color:"red",label:"已停止"}};function g(r){return r==null?"无心跳":m(Date.now()-r)}function b(r){return r==null?"—":p(r,{includeSeconds:!0})}function I(){const{data:r,isLoading:d,error:n,refetch:c}=u({queryKey:["daemon-health-page"],queryFn:async()=>{const a=await fetch("/api/health");if(!a.ok)throw new Error(`HTTP ${a.status}`);return a.json()},refetchInterval:15e3,retry:1}),s=r==null?void 0:r.daemon.status,t=s?j[s]:null;return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsx(l,{bordered:!0,children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(o.Title,{heading:6,style:{margin:0},children:"Daemon 健康"}),e.jsx(o.Text,{type:"secondary",style:{fontSize:12},children:"后台守护进程在线状态 · 心跳 / PID / LaunchAgent"}),e.jsx("div",{style:{flex:1}}),t&&e.jsx(i,{color:t.color,children:t.label}),e.jsx(x,{size:"small",icon:e.jsx(h,{}),onClick:()=>c(),children:"刷新"})]})}),d&&e.jsx(l,{bordered:!0,children:e.jsx("div",{style:{textAlign:"center",padding:32},children:e.jsx(f,{})})}),n&&e.jsx(l,{bordered:!0,children:e.jsxs(o.Text,{type:"error",children:["加载健康数据失败: ",String(n)]})}),r&&e.jsx(l,{bordered:!0,title:"守护进程状态",children:e.jsx(y,{column:1,colon:" :",labelStyle:{width:140,color:"var(--color-text-3)"},valueStyle:{fontFamily:"monospace"},data:[{label:"状态",value:t?e.jsx(i,{color:t.color,children:t.label}):"—"},{label:"PID",value:r.daemon.pid??"—"},{label:"心跳",value:g(r.daemon.heartbeat_age_ms)},{label:"启动于",value:b(r.daemon.started_at)},{label:"版本",value:r.daemon.version??"—"}]})}),e.jsx(l,{bordered:!0,children:e.jsxs(o.Text,{type:"secondary",style:{fontSize:12},children:["历史趋势(心跳趋势 / 事件吞吐 / 重启记录)将在下个 spec 落地(需 daemon_health 历史表)。当前可在终端运行 ",e.jsx(o.Text,{code:!0,children:"cf daemon status"})," 查看近期历史。"]})})]})}export{I as default};
2
+ //# sourceMappingURL=DaemonHealthPage-DTSVqtrI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DaemonHealthPage-DTSVqtrI.js","sources":["../../src/pages/DaemonHealthPage.tsx"],"sourcesContent":["/**\n * /system/daemon — Daemon Health.\n *\n * Arco Phase 4b(decision 29688066):视觉对齐新 Arco shell(与 Phase 0-4a 其它\n * 系统页一致的全宽容器 + 头部 Card + Descriptions + Tag)。**纯视觉对齐**——数据\n * 端点(`/api/health`)、查询逻辑、刷新间隔、字段口径全部不变;不新增数据源、不\n * 编造原型里有但端点未提供的展示块(心跳趋势 / 事件吞吐 / 重启记录均依赖后端尚未\n * 提供的 daemon_health 历史表,超出「不重写」范围,故仍保留「待下个 spec」说明卡)。\n *\n * 原页:maxWidth 居中 + 裸 <table> + heading={4}。对齐后:全宽 padding 容器 +\n * 头部 Card(heading={6} + 副标题 + 右侧状态 Tag)+ Arco Descriptions 替裸 table。\n *\n * Spec: docs/design/2026-06-12/0941-arco-redesign-rollout-spec.md Phase 4\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport {\n Button,\n Card,\n Descriptions,\n Spin,\n Tag,\n Typography,\n} from '@arco-design/web-react'\nimport { IconRefresh } from '@arco-design/web-react/icon'\nimport { formatLocalDisplay, formatRelative } from '../utils/time'\n\ninterface HealthResponse {\n daemon: {\n status: 'alive' | 'stale' | 'dead'\n pid: number | null\n heartbeat_age_ms: number | null\n started_at: number | null\n version: string | null\n }\n}\n\ntype DaemonStatus = HealthResponse['daemon']['status']\n\n/** status → Arco Tag color(与诊断页同一套语义配色)。 */\nconst STATUS_TAG: Record<DaemonStatus, { color: string; label: string }> = {\n alive: { color: 'green', label: '运行中' },\n stale: { color: 'orange', label: '心跳过期' },\n dead: { color: 'red', label: '已停止' },\n}\n\nfunction formatAge(ms: number | null): string {\n if (ms == null) return '无心跳'\n // Convert age-in-ms to a past timestamp, then format relative.\n return formatRelative(Date.now() - ms)\n}\n\nfunction formatTs(ts: number | null): string {\n if (ts == null) return '—'\n return formatLocalDisplay(ts, { includeSeconds: true })\n}\n\nexport default function DaemonHealthPage() {\n const { data, isLoading, error, refetch } = useQuery<HealthResponse>({\n queryKey: ['daemon-health-page'],\n queryFn: async () => {\n const res = await fetch('/api/health')\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n return res.json()\n },\n refetchInterval: 15_000,\n retry: 1,\n })\n\n const status = data?.daemon.status\n const tag = status ? STATUS_TAG[status] : null\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 16 }}>\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <Typography.Title heading={6} style={{ margin: 0 }}>\n Daemon 健康\n </Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 后台守护进程在线状态 · 心跳 / PID / LaunchAgent\n </Typography.Text>\n <div style={{ flex: 1 }} />\n {tag && <Tag color={tag.color}>{tag.label}</Tag>}\n <Button size=\"small\" icon={<IconRefresh />} onClick={() => refetch()}>\n 刷新\n </Button>\n </div>\n </Card>\n\n {isLoading && (\n <Card bordered>\n <div style={{ textAlign: 'center', padding: 32 }}>\n <Spin />\n </div>\n </Card>\n )}\n\n {error && (\n <Card bordered>\n <Typography.Text type=\"error\">加载健康数据失败: {String(error)}</Typography.Text>\n </Card>\n )}\n\n {data && (\n <Card bordered title=\"守护进程状态\">\n <Descriptions\n column={1}\n colon=\" :\"\n labelStyle={{ width: 140, color: 'var(--color-text-3)' }}\n valueStyle={{ fontFamily: 'monospace' }}\n data={[\n {\n label: '状态',\n value: tag ? <Tag color={tag.color}>{tag.label}</Tag> : '—',\n },\n { label: 'PID', value: data.daemon.pid ?? '—' },\n { label: '心跳', value: formatAge(data.daemon.heartbeat_age_ms) },\n { label: '启动于', value: formatTs(data.daemon.started_at) },\n { label: '版本', value: data.daemon.version ?? '—' },\n ]}\n />\n </Card>\n )}\n\n <Card bordered>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 历史趋势(心跳趋势 / 事件吞吐 / 重启记录)将在下个 spec 落地(需 daemon_health\n 历史表)。当前可在终端运行 <Typography.Text code>cf daemon status</Typography.Text> 查看近期历史。\n </Typography.Text>\n </Card>\n </div>\n )\n}\n"],"names":["STATUS_TAG","formatAge","ms","formatRelative","formatTs","ts","formatLocalDisplay","DaemonHealthPage","data","isLoading","error","refetch","useQuery","res","status","tag","jsxs","jsx","Card","Typography","Tag","Button","IconRefresh","Spin","Descriptions"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./react-vendor-tkvCrao7.js";import{J as n,d as k,D as w,F as h,X as W,u as C,T as i,g as R,a2 as I,a8 as u,K as S,E as p,$ as A,b as a,_ as D,a3 as y,y as L}from"./arco-DV6xCLhr.js";import{c as $,f as j,s as B,a as H,o as F,b as O,k as E}from"./useDecisions-D-G2Ft5T.js";import{d as Q,u as M}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./query-CgCOpYWf.js";const m=S.Row,d=S.Col;function v(t){return e.jsx(a,{color:H(t),size:"small",children:B(t)})}function b(t){return e.jsx(a,{color:O(t),size:"small",bordered:!t,children:F(t)})}function f(t){return e.jsx(a,{color:t==="spec"?"purple":"arcoblue",size:"small",children:E(t)})}function P(t){if(!t||!Number.isFinite(t))return"—";try{const l=new Date(t),r=o=>String(o).padStart(2,"0");return`${r(l.getMonth()+1)}-${r(l.getDate())} ${r(l.getHours())}:${r(l.getMinutes())}`}catch{return"—"}}function _({opt:t}){const l=t.recommended,r=!!t.rejectedReason;return e.jsxs("div",{style:{border:`1px solid ${l?"rgb(var(--arcoblue-3))":"var(--color-border-2)"}`,background:l?"rgb(var(--arcoblue-1))":"transparent",borderRadius:6,padding:14,opacity:r&&!l?.78:1},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:8,flexWrap:"wrap"},children:[e.jsx("span",{style:{width:24,height:24,borderRadius:"50%",display:"inline-flex",alignItems:"center",justifyContent:"center",fontSize:12,fontWeight:600,flexShrink:0,background:l?"rgb(var(--arcoblue-6))":"var(--color-fill-3)",color:l?"#fff":"var(--color-text-3)"},children:t.key}),e.jsx(i.Text,{style:{fontSize:13,fontWeight:l?600:500,flex:1,minWidth:0},children:t.title}),l&&e.jsx(a,{color:"arcoblue",size:"small",children:"推荐"}),r&&e.jsx(a,{color:"gray",size:"small",children:"已否决"})]}),t.what.length>0&&e.jsx("ul",{style:{margin:"0 0 8px",paddingLeft:18},children:t.what.map((o,c)=>e.jsx("li",{style:{fontSize:12,color:"var(--color-text-2)",lineHeight:1.7},children:o},c))}),e.jsxs(m,{gutter:16,children:[e.jsxs(d,{span:12,children:[e.jsx(i.Text,{style:{fontSize:12,fontWeight:600,color:"rgb(var(--green-6))"},children:"Pros"}),e.jsx("ul",{style:{margin:"4px 0 0",paddingLeft:16},children:t.pros.length>0?t.pros.map((o,c)=>e.jsx("li",{style:{fontSize:12,color:"var(--color-text-2)",lineHeight:1.6},children:o},c)):e.jsx("li",{style:{fontSize:12,color:"var(--color-text-3)",listStyle:"none"},children:"—"})})]}),e.jsxs(d,{span:12,children:[e.jsx(i.Text,{style:{fontSize:12,fontWeight:600,color:"rgb(var(--red-6))"},children:"Cons"}),e.jsx("ul",{style:{margin:"4px 0 0",paddingLeft:16},children:t.cons.length>0?t.cons.map((o,c)=>e.jsx("li",{style:{fontSize:12,color:"var(--color-text-2)",lineHeight:1.6},children:o},c)):e.jsx("li",{style:{fontSize:12,color:"var(--color-text-3)",listStyle:"none"},children:"—"})})]})]}),e.jsxs("div",{style:{display:"flex",gap:20,flexWrap:"wrap",marginTop:10,paddingTop:10,borderTop:"1px solid var(--color-border-1)",fontSize:12,color:"var(--color-text-3)"},children:[e.jsxs("span",{children:["发生概率 ",e.jsx("b",{style:{color:"var(--color-text-2)"},children:t.probability})]}),e.jsxs("span",{children:["可逆性 ",e.jsx("b",{style:{color:"var(--color-text-2)"},children:t.reversibility})]}),r&&e.jsxs("span",{style:{color:"rgb(var(--red-6))"},children:["否决理由:",t.rejectedReason]})]})]})}function N({s:t}){return e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"8px 0",borderBottom:"1px solid var(--color-border-1)"},children:[e.jsx(L,{style:{color:"var(--color-text-3)",flexShrink:0}}),e.jsx(i.Text,{style:{fontSize:13,flex:1,minWidth:0},ellipsis:!0,children:t.routed_to_name||"(未命名)"}),t.obeyed===1&&e.jsx(a,{color:"green",size:"small",children:"遵从"}),t.obeyed===0&&e.jsx(a,{color:"orange",size:"small",children:"未遵从"}),e.jsx(i.Text,{type:"secondary",style:{fontSize:12,width:90,textAlign:"right"},children:P(t.ts)})]})}function V(){const{id:t}=Q(),l=M(),{view:r,loading:o,isError:c,error:g}=$(t);if(o)return e.jsx("div",{style:{padding:16},children:e.jsx(n,{bordered:!0,children:e.jsx(k,{animation:!0,text:{rows:10}})})});if(c||!r)return e.jsx("div",{style:{padding:16},children:e.jsx(w,{status:"error",title:"加载决策详情失败",subTitle:(g==null?void 0:g.message)||"决策不存在或端点不可用",extra:e.jsx(h,{type:"primary",onClick:()=>l("/decisions"),children:"返回决策"})})});const z=()=>{var x;const s=`批准 / approve ${r.id}`;try{(x=navigator.clipboard)==null||x.writeText(s),y.success(`已复制「${s}」到剪贴板(在主线程对话粘贴以批准,避免误触)`)}catch{y.info(`在主线程对话回复「批准」或「approve ${r.id}」以批准`)}},T=()=>{var s;try{(s=navigator.clipboard)==null||s.writeText(r.id),y.success(`已复制 #${r.id}`)}catch{}};return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsxs(n,{bordered:!0,children:[e.jsx(h,{type:"text",size:"small",icon:e.jsx(W,{}),style:{marginBottom:8,paddingLeft:0},onClick:()=>l("/decisions"),children:"返回决策"}),e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:16,flexWrap:"wrap"},children:[e.jsxs("div",{style:{minWidth:0,flex:1},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[e.jsx(C,{style:{color:"rgb(var(--arcoblue-6))"}}),e.jsx(i.Title,{heading:5,style:{margin:0},children:r.intent}),v(r.status),b(r.outcome)]}),e.jsxs("div",{style:{display:"flex",gap:12,flexWrap:"wrap",marginTop:8,alignItems:"center"},children:[e.jsxs(i.Text,{type:"secondary",style:{fontSize:12,fontFamily:"monospace"},children:["#",r.id]}),f(r.kind),e.jsxs(i.Text,{type:"secondary",style:{fontSize:12},children:["source ",r.source]}),e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:j(r.createdAt)})]})]}),e.jsxs("div",{style:{display:"flex",gap:8,flexShrink:0,flexWrap:"wrap"},children:[r.canApprove&&e.jsx(h,{size:"small",status:"success",icon:e.jsx(R,{}),onClick:z,children:"复制批准指令"}),e.jsx(h,{size:"small",icon:e.jsx(I,{}),onClick:T,children:"复制 ID"})]})]}),r.canApprove&&e.jsxs("div",{style:{marginTop:12,padding:"8px 12px",borderRadius:4,background:"rgb(var(--orange-1))",border:"1px solid rgb(var(--orange-3))",fontSize:12,color:"var(--color-text-2)",display:"flex",alignItems:"center",gap:6},children:[e.jsx(u,{style:{color:"rgb(var(--orange-6))"}}),"待批准决策。为防误触,此页不直接触发 approve——请在主线程对话回复「批准」或「approve ",r.id,"」。"]})]}),e.jsx(n,{bordered:!0,children:e.jsxs(m,{children:[e.jsxs(d,{xs:12,sm:6,style:{padding:"4px 12px"},children:[e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:"kind"}),e.jsx("div",{style:{marginTop:4},children:f(r.kind)})]}),e.jsxs(d,{xs:12,sm:6,style:{padding:"4px 12px"},children:[e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:"source"}),e.jsx("div",{style:{marginTop:4,fontSize:13,fontWeight:500},children:r.source})]}),e.jsxs(d,{xs:12,sm:6,style:{padding:"4px 12px"},children:[e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:"选项数"}),e.jsxs("div",{style:{marginTop:4,fontSize:13,fontWeight:500},children:[r.options.length," 个"]})]}),e.jsxs(d,{xs:12,sm:6,style:{padding:"4px 12px"},children:[e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:"关联 spawn"}),e.jsxs("div",{style:{marginTop:4,fontSize:13,fontWeight:500},children:[r.spawnCount," 个"]})]})]})}),e.jsxs(m,{gutter:16,align:"start",children:[e.jsx(d,{xs:24,xl:16,style:{marginBottom:16},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[r.isAdvisory&&e.jsx(n,{bordered:!0,children:e.jsxs("div",{style:{display:"flex",gap:12,padding:"14px 16px",borderRadius:6,background:"rgb(var(--arcoblue-1))",border:"1px solid rgb(var(--arcoblue-2))"},children:[e.jsx(u,{style:{color:"rgb(var(--arcoblue-6))",fontSize:18,flexShrink:0,marginTop:2}}),e.jsxs("div",{style:{minWidth:0},children:[e.jsx(i.Text,{style:{fontSize:14,fontWeight:600,display:"block",marginBottom:4},children:"advisory / 直接记录决策"}),e.jsx(i.Text,{style:{fontSize:13,color:"var(--color-text-2)",lineHeight:1.8},children:"本决策由 daemon 自动记录(advisory),主线程未经 decision-maker 做结构化分析 (bypass / skip decision),因此**不产出** Options / Recommendation / Open Questions / Risks——仅记录触发上下文与结果。这是有意为之,并非缺内容。 下方 Context 即触发该决策的原始 prompt;右侧概要含状态、outcome、批准人与时间。"})]})]})}),e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"Context 背景"}),children:e.jsx("div",{style:{borderLeft:"3px solid rgb(var(--arcoblue-6))",borderRadius:"0 4px 4px 0",background:"var(--color-fill-1)",padding:"12px 16px",fontSize:13,color:"var(--color-text-2)",lineHeight:1.8,whiteSpace:"pre-wrap"},children:r.context||"(无背景描述)"})}),!r.isAdvisory&&e.jsxs(e.Fragment,{children:[e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"Options 选项"}),children:r.options.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:12},children:r.options.map(s=>e.jsx(_,{opt:s},s.key))}):e.jsx(p,{description:"该决策未产出结构化选项"})}),e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"Recommendation 推荐"}),children:r.recommendation?e.jsx("div",{style:{borderRadius:6,background:"rgb(var(--arcoblue-1))",border:"1px solid rgb(var(--arcoblue-2))",padding:14,fontSize:13,color:"var(--color-text-1)",lineHeight:1.8,whiteSpace:"pre-wrap"},children:r.recommendation}):e.jsx(p,{description:"无推荐结论"})}),r.risks.length>0&&e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"Risks 风险"}),children:e.jsx("ul",{style:{margin:0,paddingLeft:18},children:r.risks.map((s,x)=>e.jsx("li",{style:{fontSize:13,color:"var(--color-text-2)",lineHeight:1.8},children:s},x))})}),e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"Open Questions 待澄清"}),children:r.openQuestions.length>0?e.jsx("ul",{style:{margin:0,paddingLeft:18},children:r.openQuestions.map((s,x)=>e.jsx("li",{style:{fontSize:13,color:"var(--color-text-2)",lineHeight:1.8},children:s},x))}):e.jsx(p,{description:"无待澄清问题"})})]})]})}),e.jsx(d,{xs:24,xl:8,style:{marginBottom:16},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"概要"}),children:e.jsx(A,{colon:" :",size:"small",column:1,labelStyle:{width:96,color:"var(--color-text-3)"},data:[{label:"decision-id",value:e.jsxs(i.Text,{code:!0,style:{fontSize:11},children:["#",r.id]})},{label:"kind",value:f(r.kind)},{label:"source",value:r.source},{label:"agent",value:r.suggestedAgent||"—"},{label:"状态",value:v(r.status)},{label:"outcome",value:b(r.outcome)},{label:"创建",value:j(r.createdAt)},{label:"解决",value:r.resolvedAt?j(r.resolvedAt):"—"},{label:"批准人",value:r.approvedBy||"—"},{label:"推荐 agent",value:r.recommendedAgents.length?r.recommendedAgents.map(s=>e.jsx(a,{size:"small",style:{marginRight:4},children:s},s)):"—"},{label:"推荐 skill",value:r.recommendedSkills.length?r.recommendedSkills.map(s=>e.jsx(a,{size:"small",color:"purple",style:{marginRight:4},children:s},s)):"—"}]})}),!r.isAdvisory&&e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"被引决策(precedent)"}),children:e.jsx(p,{description:"端点未返回 outcome-weighted 被引先例"})}),(!r.isAdvisory||r.relatedSpawns.length>0)&&e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"关联 Spawns"}),children:r.relatedSpawns.length>0?e.jsx("div",{children:r.relatedSpawns.map(s=>e.jsx(N,{s},s.id))}):e.jsx(p,{description:"尚未 spawn 关联 agent"})}),e.jsx(n,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"关联 changelog"}),children:r.relatedChangelogs.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:r.relatedChangelogs.map(s=>e.jsxs(i.Text,{style:{fontSize:12,fontFamily:"monospace",display:"inline-flex",alignItems:"center",gap:6},ellipsis:{showTooltip:!0},children:[e.jsx(D,{style:{color:"var(--color-text-3)",flexShrink:0}}),s]},s))}):e.jsx(p,{description:"无关联 changelog"})})]})})]})]})}export{V as default};
2
+ //# sourceMappingURL=DecisionDetailPage-b4BA8dhc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DecisionDetailPage-b4BA8dhc.js","sources":["../../src/pages/DecisionDetailPage.tsx"],"sourcesContent":["/**\n * DecisionDetailPage — 治理 · 决策详情整页 (Phase 3a, decision 29688066).\n *\n * 替换 `/decisions/:id` 的占位组件。整页(非抽屉)布局,翻译原型「决策详情」\n * 成真 Arco 组件(**严禁直搬原型 Tailwind CSS**):\n * A. 页头横条:返回 + intent 标题 + status Tag + outcome Tag + 元信息\n * (#id / kind / source / 日期 / 关联 changelog 链接)+ 复制 ID。\n * B. 概要统计条:可逆性/影响/路径在端点未返回 → 降级为「kind/source/选项数/\n * spawn 数」概要统计(不伪造 triage 文案,见 decisions-derive 降级口径)。\n * C. 左主栏:Context(=trigger_prompt)/ Options(A·B·0 卡,每卡 What/Pros/Cons/\n * 概率/可逆性,推荐高亮)/ Recommendation / Risks / Open Questions。\n * 端点不返回 Next Steps → 不渲染该块(不伪造)。\n * D. 右 360 栏:概要 Descriptions + 被引决策(precedent,**端点未返回 → 空态**)+\n * 关联 spawns(routing_events)+ 关联 changelog(链文件路径)。\n *\n * 数据接真实端点 GET /api/decisions/:id,取数 + 派生在 useDecisionDetail /\n * decisions-derive,本组件只渲染。\n *\n * 批准动作:端点有 POST /api/decisions/:id/approve,但为防误批准,此处仅渲染\n * **降级提示按钮**(复制 `批准`/`approve <id>` 文案到剪贴板,不真触发 approve)。\n */\nimport { useParams, useNavigate } from 'react-router-dom'\n\nimport Card from '@arco-design/web-react/es/Card'\nimport Grid from '@arco-design/web-react/es/Grid'\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 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 Result from '@arco-design/web-react/es/Result'\nimport Message from '@arco-design/web-react/es/Message'\nimport {\n IconLeft,\n IconBranch,\n IconCopy,\n IconCheck,\n IconInfoCircle,\n IconFile,\n IconRobot,\n} from '@arco-design/web-react/icon'\n\nimport { useDecisionDetail } from '../hooks/useDecisions'\nimport {\n statusLabel,\n statusColor,\n outcomeLabel,\n outcomeColor,\n kindLabel,\n fmtCreated,\n type DecisionOption,\n type DecisionOutcome,\n type RelatedSpawn,\n} from '../hooks/decisions-derive'\n\nconst Row = Grid.Row\nconst Col = Grid.Col\n\nfunction statusTag(status: string) {\n return <Tag color={statusColor(status)} size=\"small\">{statusLabel(status)}</Tag>\n}\n\nfunction outcomeTag(outcome: DecisionOutcome) {\n return (\n <Tag color={outcomeColor(outcome)} size=\"small\" bordered={!outcome}>\n {outcomeLabel(outcome)}\n </Tag>\n )\n}\n\nfunction kindTag(kind: string) {\n return <Tag color={kind === 'spec' ? 'purple' : 'arcoblue'} size=\"small\">{kindLabel(kind)}</Tag>\n}\n\nfunction fmtSpawnTs(ts: number): string {\n if (!ts || !Number.isFinite(ts)) return '—'\n try {\n const d = new Date(ts)\n const pad = (n: number) => String(n).padStart(2, '0')\n return `${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`\n } catch {\n return '—'\n }\n}\n\n/** 单个选项卡(推荐高亮 / 被否决标注)。 */\nfunction OptionCard({ opt }: { opt: DecisionOption }) {\n const rec = opt.recommended\n const rejected = !!opt.rejectedReason\n return (\n <div\n style={{\n border: `1px solid ${rec ? 'rgb(var(--arcoblue-3))' : 'var(--color-border-2)'}`,\n background: rec ? 'rgb(var(--arcoblue-1))' : 'transparent',\n borderRadius: 6,\n padding: 14,\n opacity: rejected && !rec ? 0.78 : 1,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 8, flexWrap: 'wrap' }}>\n <span\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 12,\n fontWeight: 600,\n flexShrink: 0,\n background: rec ? 'rgb(var(--arcoblue-6))' : 'var(--color-fill-3)',\n color: rec ? '#fff' : 'var(--color-text-3)',\n }}\n >\n {opt.key}\n </span>\n <Typography.Text style={{ fontSize: 13, fontWeight: rec ? 600 : 500, flex: 1, minWidth: 0 }}>\n {opt.title}\n </Typography.Text>\n {rec && <Tag color=\"arcoblue\" size=\"small\">推荐</Tag>}\n {rejected && <Tag color=\"gray\" size=\"small\">已否决</Tag>}\n </div>\n\n {opt.what.length > 0 && (\n <ul style={{ margin: '0 0 8px', paddingLeft: 18 }}>\n {opt.what.map((w, i) => (\n <li key={i} style={{ fontSize: 12, color: 'var(--color-text-2)', lineHeight: 1.7 }}>{w}</li>\n ))}\n </ul>\n )}\n\n <Row gutter={16}>\n <Col span={12}>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, color: 'rgb(var(--green-6))' }}>Pros</Typography.Text>\n <ul style={{ margin: '4px 0 0', paddingLeft: 16 }}>\n {opt.pros.length > 0\n ? opt.pros.map((p, i) => (\n <li key={i} style={{ fontSize: 12, color: 'var(--color-text-2)', lineHeight: 1.6 }}>{p}</li>\n ))\n : <li style={{ fontSize: 12, color: 'var(--color-text-3)', listStyle: 'none' }}>—</li>}\n </ul>\n </Col>\n <Col span={12}>\n <Typography.Text style={{ fontSize: 12, fontWeight: 600, color: 'rgb(var(--red-6))' }}>Cons</Typography.Text>\n <ul style={{ margin: '4px 0 0', paddingLeft: 16 }}>\n {opt.cons.length > 0\n ? opt.cons.map((c, i) => (\n <li key={i} style={{ fontSize: 12, color: 'var(--color-text-2)', lineHeight: 1.6 }}>{c}</li>\n ))\n : <li style={{ fontSize: 12, color: 'var(--color-text-3)', listStyle: 'none' }}>—</li>}\n </ul>\n </Col>\n </Row>\n\n <div\n style={{\n display: 'flex',\n gap: 20,\n flexWrap: 'wrap',\n marginTop: 10,\n paddingTop: 10,\n borderTop: '1px solid var(--color-border-1)',\n fontSize: 12,\n color: 'var(--color-text-3)',\n }}\n >\n <span>发生概率 <b style={{ color: 'var(--color-text-2)' }}>{opt.probability}</b></span>\n <span>可逆性 <b style={{ color: 'var(--color-text-2)' }}>{opt.reversibility}</b></span>\n {rejected && (\n <span style={{ color: 'rgb(var(--red-6))' }}>否决理由:{opt.rejectedReason}</span>\n )}\n </div>\n </div>\n )\n}\n\nfunction SpawnRow({ s }: { s: RelatedSpawn }) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '8px 0',\n borderBottom: '1px solid var(--color-border-1)',\n }}\n >\n <IconRobot style={{ color: 'var(--color-text-3)', flexShrink: 0 }} />\n <Typography.Text style={{ fontSize: 13, flex: 1, minWidth: 0 }} ellipsis>\n {s.routed_to_name || '(未命名)'}\n </Typography.Text>\n {s.obeyed === 1 && <Tag color=\"green\" size=\"small\">遵从</Tag>}\n {s.obeyed === 0 && <Tag color=\"orange\" size=\"small\">未遵从</Tag>}\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, width: 90, textAlign: 'right' }}>\n {fmtSpawnTs(s.ts)}\n </Typography.Text>\n </div>\n )\n}\n\nexport default function DecisionDetailPage() {\n const { id } = useParams<{ id: string }>()\n const navigate = useNavigate()\n const { view, loading, isError, error } = useDecisionDetail(id)\n\n if (loading) {\n return (\n <div style={{ padding: 16 }}>\n <Card bordered>\n <Skeleton animation text={{ rows: 10 }} />\n </Card>\n </div>\n )\n }\n\n if (isError || !view) {\n return (\n <div style={{ padding: 16 }}>\n <Result\n status=\"error\"\n title=\"加载决策详情失败\"\n subTitle={error?.message || '决策不存在或端点不可用'}\n extra={\n <Button type=\"primary\" onClick={() => navigate('/decisions')}>\n 返回决策\n </Button>\n }\n />\n </div>\n )\n }\n\n const copyApprove = () => {\n const cmd = `批准 / approve ${view.id}`\n try {\n void navigator.clipboard?.writeText(cmd)\n Message.success(`已复制「${cmd}」到剪贴板(在主线程对话粘贴以批准,避免误触)`)\n } catch {\n Message.info(`在主线程对话回复「批准」或「approve ${view.id}」以批准`)\n }\n }\n\n const copyId = () => {\n try {\n void navigator.clipboard?.writeText(view.id)\n Message.success(`已复制 #${view.id}`)\n } catch {\n /* clipboard unavailable */\n }\n }\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 16 }}>\n {/* ── A. 页头横条 ─────────────────────────────────────────────── */}\n <Card bordered>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<IconLeft />}\n style={{ marginBottom: 8, paddingLeft: 0 }}\n onClick={() => navigate('/decisions')}\n >\n 返回决策\n </Button>\n <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 16, flexWrap: 'wrap' }}>\n <div style={{ minWidth: 0, flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }}>\n <IconBranch style={{ color: 'rgb(var(--arcoblue-6))' }} />\n <Typography.Title heading={5} style={{ margin: 0 }}>\n {view.intent}\n </Typography.Title>\n {statusTag(view.status)}\n {outcomeTag(view.outcome)}\n </div>\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', marginTop: 8, alignItems: 'center' }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, fontFamily: 'monospace' }}>#{view.id}</Typography.Text>\n {kindTag(view.kind)}\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>source {view.source}</Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>{fmtCreated(view.createdAt)}</Typography.Text>\n </div>\n </div>\n <div style={{ display: 'flex', gap: 8, flexShrink: 0, flexWrap: 'wrap' }}>\n {view.canApprove && (\n <Button size=\"small\" status=\"success\" icon={<IconCheck />} onClick={copyApprove}>\n 复制批准指令\n </Button>\n )}\n <Button size=\"small\" icon={<IconCopy />} onClick={copyId}>复制 ID</Button>\n </div>\n </div>\n {view.canApprove && (\n <div\n style={{\n marginTop: 12,\n padding: '8px 12px',\n borderRadius: 4,\n background: 'rgb(var(--orange-1))',\n border: '1px solid rgb(var(--orange-3))',\n fontSize: 12,\n color: 'var(--color-text-2)',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <IconInfoCircle style={{ color: 'rgb(var(--orange-6))' }} />\n 待批准决策。为防误触,此页不直接触发 approve——请在主线程对话回复「批准」或「approve {view.id}」。\n </div>\n )}\n </Card>\n\n {/* ── B. 概要统计条(triage 降级)─────────────────────────────── */}\n <Card bordered>\n <Row>\n <Col xs={12} sm={6} style={{ padding: '4px 12px' }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>kind</Typography.Text>\n <div style={{ marginTop: 4 }}>{kindTag(view.kind)}</div>\n </Col>\n <Col xs={12} sm={6} style={{ padding: '4px 12px' }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>source</Typography.Text>\n <div style={{ marginTop: 4, fontSize: 13, fontWeight: 500 }}>{view.source}</div>\n </Col>\n <Col xs={12} sm={6} style={{ padding: '4px 12px' }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>选项数</Typography.Text>\n <div style={{ marginTop: 4, fontSize: 13, fontWeight: 500 }}>{view.options.length} 个</div>\n </Col>\n <Col xs={12} sm={6} style={{ padding: '4px 12px' }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>关联 spawn</Typography.Text>\n <div style={{ marginTop: 4, fontSize: 13, fontWeight: 500 }}>{view.spawnCount} 个</div>\n </Col>\n </Row>\n </Card>\n\n {/* ── C/D. 左右双栏 ───────────────────────────────────────────── */}\n <Row gutter={16} align=\"start\">\n {/* 左主栏:Context + (结构化) Options/Recommendation/Risks/Open Questions\n 或 (advisory) 一张正向说明卡 */}\n <Col xs={24} xl={16} style={{ marginBottom: 16 }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {view.isAdvisory && (\n <Card bordered>\n <div\n style={{\n display: 'flex',\n gap: 12,\n padding: '14px 16px',\n borderRadius: 6,\n background: 'rgb(var(--arcoblue-1))',\n border: '1px solid rgb(var(--arcoblue-2))',\n }}\n >\n <IconInfoCircle\n style={{ color: 'rgb(var(--arcoblue-6))', fontSize: 18, flexShrink: 0, marginTop: 2 }}\n />\n <div style={{ minWidth: 0 }}>\n <Typography.Text style={{ fontSize: 14, fontWeight: 600, display: 'block', marginBottom: 4 }}>\n advisory / 直接记录决策\n </Typography.Text>\n <Typography.Text style={{ fontSize: 13, color: 'var(--color-text-2)', lineHeight: 1.8 }}>\n 本决策由 daemon 自动记录(advisory),主线程未经 decision-maker 做结构化分析\n (bypass / skip decision),因此**不产出** Options / Recommendation /\n Open Questions / Risks——仅记录触发上下文与结果。这是有意为之,并非缺内容。\n 下方 Context 即触发该决策的原始 prompt;右侧概要含状态、outcome、批准人与时间。\n </Typography.Text>\n </div>\n </div>\n </Card>\n )}\n\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>Context 背景</span>}>\n <div\n style={{\n borderLeft: '3px solid rgb(var(--arcoblue-6))',\n borderRadius: '0 4px 4px 0',\n background: 'var(--color-fill-1)',\n padding: '12px 16px',\n fontSize: 13,\n color: 'var(--color-text-2)',\n lineHeight: 1.8,\n whiteSpace: 'pre-wrap',\n }}\n >\n {view.context || '(无背景描述)'}\n </div>\n </Card>\n\n {!view.isAdvisory && (\n <>\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>Options 选项</span>}>\n {view.options.length > 0 ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {view.options.map((o) => (\n <OptionCard key={o.key} opt={o} />\n ))}\n </div>\n ) : (\n <Empty description=\"该决策未产出结构化选项\" />\n )}\n </Card>\n\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>Recommendation 推荐</span>}>\n {view.recommendation ? (\n <div\n style={{\n borderRadius: 6,\n background: 'rgb(var(--arcoblue-1))',\n border: '1px solid rgb(var(--arcoblue-2))',\n padding: 14,\n fontSize: 13,\n color: 'var(--color-text-1)',\n lineHeight: 1.8,\n whiteSpace: 'pre-wrap',\n }}\n >\n {view.recommendation}\n </div>\n ) : (\n <Empty description=\"无推荐结论\" />\n )}\n </Card>\n\n {view.risks.length > 0 && (\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>Risks 风险</span>}>\n <ul style={{ margin: 0, paddingLeft: 18 }}>\n {view.risks.map((r, i) => (\n <li key={i} style={{ fontSize: 13, color: 'var(--color-text-2)', lineHeight: 1.8 }}>{r}</li>\n ))}\n </ul>\n </Card>\n )}\n\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>Open Questions 待澄清</span>}>\n {view.openQuestions.length > 0 ? (\n <ul style={{ margin: 0, paddingLeft: 18 }}>\n {view.openQuestions.map((q, i) => (\n <li key={i} style={{ fontSize: 13, color: 'var(--color-text-2)', lineHeight: 1.8 }}>{q}</li>\n ))}\n </ul>\n ) : (\n <Empty description=\"无待澄清问题\" />\n )}\n </Card>\n </>\n )}\n </div>\n </Col>\n\n {/* 右侧栏:概要 + 被引决策 + 关联 spawns + 关联 changelog */}\n <Col xs={24} xl={8} style={{ marginBottom: 16 }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>概要</span>}>\n <Descriptions\n colon=\" :\"\n size=\"small\"\n column={1}\n labelStyle={{ width: 96, color: 'var(--color-text-3)' }}\n data={[\n { label: 'decision-id', value: <Typography.Text code style={{ fontSize: 11 }}>#{view.id}</Typography.Text> },\n { label: 'kind', value: kindTag(view.kind) },\n { label: 'source', value: view.source },\n { label: 'agent', value: view.suggestedAgent || '—' },\n { label: '状态', value: statusTag(view.status) },\n { label: 'outcome', value: outcomeTag(view.outcome) },\n { label: '创建', value: fmtCreated(view.createdAt) },\n { label: '解决', value: view.resolvedAt ? fmtCreated(view.resolvedAt) : '—' },\n { label: '批准人', value: view.approvedBy || '—' },\n {\n label: '推荐 agent',\n value: view.recommendedAgents.length\n ? view.recommendedAgents.map((a) => <Tag key={a} size=\"small\" style={{ marginRight: 4 }}>{a}</Tag>)\n : '—',\n },\n {\n label: '推荐 skill',\n value: view.recommendedSkills.length\n ? view.recommendedSkills.map((s) => <Tag key={s} size=\"small\" color=\"purple\" style={{ marginRight: 4 }}>{s}</Tag>)\n : '—',\n },\n ]}\n />\n </Card>\n\n {/*\n precedent / 关联 Spawns 对 advisory 决策无意义(decision-maker 未跑,\n 且端点本就不返回 precedent)→ advisory 下收起空卡,避免满屏空占位。\n 结构化决策(!isAdvisory)保持现状:precedent 空态 + spawns 列表/空态。\n */}\n {!view.isAdvisory && (\n <Card\n bordered\n title={<span style={{ fontSize: 14, fontWeight: 600 }}>被引决策(precedent)</span>}\n >\n {/*\n 端点 GET /api/decisions/:id 当前不返回 outcome-weighted 被引决策\n (decision-maker Step 1.5 的 precedent 未持久化为可查询字段)。\n 按 spec「缺字段降级」处理:空态提示,不 mock。后端补 precedent\n 字段后可挂链到对应 /decisions/:id。\n */}\n <Empty description=\"端点未返回 outcome-weighted 被引先例\" />\n </Card>\n )}\n\n {/* 关联 Spawns:有内容总是展示;advisory 且无 spawn 时收起空卡。 */}\n {(!view.isAdvisory || view.relatedSpawns.length > 0) && (\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>关联 Spawns</span>}>\n {view.relatedSpawns.length > 0 ? (\n <div>\n {view.relatedSpawns.map((s) => (\n <SpawnRow key={s.id} s={s} />\n ))}\n </div>\n ) : (\n <Empty description=\"尚未 spawn 关联 agent\" />\n )}\n </Card>\n )}\n\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>关联 changelog</span>}>\n {view.relatedChangelogs.length > 0 ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {view.relatedChangelogs.map((c) => (\n <Typography.Text\n key={c}\n style={{ fontSize: 12, fontFamily: 'monospace', display: 'inline-flex', alignItems: 'center', gap: 6 }}\n ellipsis={{ showTooltip: true }}\n >\n <IconFile style={{ color: 'var(--color-text-3)', flexShrink: 0 }} />\n {c}\n </Typography.Text>\n ))}\n </div>\n ) : (\n <Empty description=\"无关联 changelog\" />\n )}\n </Card>\n </div>\n </Col>\n </Row>\n </div>\n )\n}\n"],"names":["Row","Grid","Col","statusTag","status","jsx","Tag","statusColor","statusLabel","outcomeTag","outcome","outcomeColor","outcomeLabel","kindTag","kind","kindLabel","fmtSpawnTs","ts","d","pad","n","OptionCard","opt","rec","rejected","jsxs","Typography","w","i","p","c","SpawnRow","s","IconRobot","DecisionDetailPage","id","useParams","navigate","useNavigate","view","loading","isError","error","useDecisionDetail","Card","Skeleton","Result","Button","copyApprove","cmd","_a","Message","copyId","IconLeft","IconBranch","fmtCreated","IconCheck","IconCopy","IconInfoCircle","Fragment","o","Empty","r","q","Descriptions","a","IconFile"],"mappings":"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"}