@winspan/claude-forge 8.54.4 → 9.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1053) hide show
  1. package/DEVELOPMENT.md +723 -46
  2. package/README.md +166 -21
  3. package/dist/catalogs/agents.json +67 -0
  4. package/dist/catalogs/skills.json +306 -0
  5. package/dist/claudemd/claudemd-generator.d.ts +45 -45
  6. package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
  7. package/dist/claudemd/claudemd-generator.js +128 -449
  8. package/dist/claudemd/claudemd-generator.js.map +1 -1
  9. package/dist/claudemd/index.d.ts +14 -4
  10. package/dist/claudemd/index.d.ts.map +1 -1
  11. package/dist/claudemd/index.js +15 -4
  12. package/dist/claudemd/index.js.map +1 -1
  13. package/dist/claudemd/resume-manager.d.ts.map +1 -1
  14. package/dist/claudemd/resume-manager.js +37 -9
  15. package/dist/claudemd/resume-manager.js.map +1 -1
  16. package/dist/claudemd/templates/swarm-protocol.md +35 -186
  17. package/dist/claudemd/violations-manager.d.ts +40 -0
  18. package/dist/claudemd/violations-manager.d.ts.map +1 -0
  19. package/dist/claudemd/violations-manager.js +106 -0
  20. package/dist/claudemd/violations-manager.js.map +1 -0
  21. package/dist/cli/commands/admin.d.ts +15 -0
  22. package/dist/cli/commands/admin.d.ts.map +1 -0
  23. package/dist/cli/commands/admin.js +177 -0
  24. package/dist/cli/commands/admin.js.map +1 -0
  25. package/dist/cli/commands/agent.d.ts +169 -0
  26. package/dist/cli/commands/agent.d.ts.map +1 -0
  27. package/dist/cli/commands/agent.js +690 -0
  28. package/dist/cli/commands/agent.js.map +1 -0
  29. package/dist/cli/commands/agents.d.ts +18 -0
  30. package/dist/cli/commands/agents.d.ts.map +1 -0
  31. package/dist/cli/commands/agents.js +160 -0
  32. package/dist/cli/commands/agents.js.map +1 -0
  33. package/dist/cli/commands/bypass.d.ts +18 -0
  34. package/dist/cli/commands/bypass.d.ts.map +1 -0
  35. package/dist/cli/commands/bypass.js +87 -0
  36. package/dist/cli/commands/bypass.js.map +1 -0
  37. package/dist/cli/commands/claudemd.d.ts +60 -0
  38. package/dist/cli/commands/claudemd.d.ts.map +1 -1
  39. package/dist/cli/commands/claudemd.js +174 -37
  40. package/dist/cli/commands/claudemd.js.map +1 -1
  41. package/dist/cli/commands/codegraph.d.ts +17 -0
  42. package/dist/cli/commands/codegraph.d.ts.map +1 -0
  43. package/dist/cli/commands/codegraph.js +263 -0
  44. package/dist/cli/commands/codegraph.js.map +1 -0
  45. package/dist/cli/commands/config.d.ts.map +1 -1
  46. package/dist/cli/commands/config.js +94 -1
  47. package/dist/cli/commands/config.js.map +1 -1
  48. package/dist/cli/commands/daemon.d.ts +39 -0
  49. package/dist/cli/commands/daemon.d.ts.map +1 -1
  50. package/dist/cli/commands/daemon.js +167 -20
  51. package/dist/cli/commands/daemon.js.map +1 -1
  52. package/dist/cli/commands/decisions.d.ts +129 -0
  53. package/dist/cli/commands/decisions.d.ts.map +1 -0
  54. package/dist/cli/commands/decisions.js +706 -0
  55. package/dist/cli/commands/decisions.js.map +1 -0
  56. package/dist/cli/commands/doctor.d.ts +29 -0
  57. package/dist/cli/commands/doctor.d.ts.map +1 -0
  58. package/dist/cli/commands/doctor.js +124 -0
  59. package/dist/cli/commands/doctor.js.map +1 -0
  60. package/dist/cli/commands/entropy.d.ts +35 -0
  61. package/dist/cli/commands/entropy.d.ts.map +1 -0
  62. package/dist/cli/commands/entropy.js +121 -0
  63. package/dist/cli/commands/entropy.js.map +1 -0
  64. package/dist/cli/commands/executions.d.ts +1 -0
  65. package/dist/cli/commands/executions.d.ts.map +1 -1
  66. package/dist/cli/commands/executions.js +12 -2
  67. package/dist/cli/commands/executions.js.map +1 -1
  68. package/dist/cli/commands/fix.d.ts +31 -0
  69. package/dist/cli/commands/fix.d.ts.map +1 -0
  70. package/dist/cli/commands/fix.js +108 -0
  71. package/dist/cli/commands/fix.js.map +1 -0
  72. package/dist/cli/commands/governance.d.ts +21 -0
  73. package/dist/cli/commands/governance.d.ts.map +1 -0
  74. package/dist/cli/commands/governance.js +60 -0
  75. package/dist/cli/commands/governance.js.map +1 -0
  76. package/dist/cli/commands/init.d.ts +27 -0
  77. package/dist/cli/commands/init.d.ts.map +1 -1
  78. package/dist/cli/commands/init.js +158 -146
  79. package/dist/cli/commands/init.js.map +1 -1
  80. package/dist/cli/commands/insights-goal-check.d.ts +54 -0
  81. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
  82. package/dist/cli/commands/insights-goal-check.js +318 -0
  83. package/dist/cli/commands/insights-goal-check.js.map +1 -0
  84. package/dist/cli/commands/insights.d.ts +15 -0
  85. package/dist/cli/commands/insights.d.ts.map +1 -0
  86. package/dist/cli/commands/insights.js +127 -0
  87. package/dist/cli/commands/insights.js.map +1 -0
  88. package/dist/cli/commands/knowledge.d.ts +117 -0
  89. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  90. package/dist/cli/commands/knowledge.js +1070 -0
  91. package/dist/cli/commands/knowledge.js.map +1 -0
  92. package/dist/cli/commands/loop.d.ts +95 -0
  93. package/dist/cli/commands/loop.d.ts.map +1 -0
  94. package/dist/cli/commands/loop.js +408 -0
  95. package/dist/cli/commands/loop.js.map +1 -0
  96. package/dist/cli/commands/maintenance.d.ts +33 -0
  97. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  98. package/dist/cli/commands/maintenance.js +75 -0
  99. package/dist/cli/commands/maintenance.js.map +1 -0
  100. package/dist/cli/commands/mcp.d.ts +22 -11
  101. package/dist/cli/commands/mcp.d.ts.map +1 -1
  102. package/dist/cli/commands/mcp.js +93 -5
  103. package/dist/cli/commands/mcp.js.map +1 -1
  104. package/dist/cli/commands/menu.d.ts.map +1 -1
  105. package/dist/cli/commands/menu.js +10 -184
  106. package/dist/cli/commands/menu.js.map +1 -1
  107. package/dist/cli/commands/project.d.ts +98 -0
  108. package/dist/cli/commands/project.d.ts.map +1 -0
  109. package/dist/cli/commands/project.js +382 -0
  110. package/dist/cli/commands/project.js.map +1 -0
  111. package/dist/cli/commands/skills.d.ts +131 -0
  112. package/dist/cli/commands/skills.d.ts.map +1 -1
  113. package/dist/cli/commands/skills.js +404 -118
  114. package/dist/cli/commands/skills.js.map +1 -1
  115. package/dist/cli/commands/spec.d.ts +40 -0
  116. package/dist/cli/commands/spec.d.ts.map +1 -0
  117. package/dist/cli/commands/spec.js +49 -0
  118. package/dist/cli/commands/spec.js.map +1 -0
  119. package/dist/cli/commands/stats.d.ts.map +1 -1
  120. package/dist/cli/commands/stats.js +11 -3
  121. package/dist/cli/commands/stats.js.map +1 -1
  122. package/dist/cli/commands/status.d.ts.map +1 -1
  123. package/dist/cli/commands/status.js +17 -2
  124. package/dist/cli/commands/status.js.map +1 -1
  125. package/dist/cli/commands/trace.d.ts.map +1 -1
  126. package/dist/cli/commands/trace.js +4 -9
  127. package/dist/cli/commands/trace.js.map +1 -1
  128. package/dist/cli/commands/violations.d.ts +14 -0
  129. package/dist/cli/commands/violations.d.ts.map +1 -0
  130. package/dist/cli/commands/violations.js +43 -0
  131. package/dist/cli/commands/violations.js.map +1 -0
  132. package/dist/cli/index.js +34 -0
  133. package/dist/cli/index.js.map +1 -1
  134. package/dist/cli/init/hook-manager.d.ts +1 -1
  135. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  136. package/dist/cli/init/hook-manager.js +6 -0
  137. package/dist/cli/init/hook-manager.js.map +1 -1
  138. package/dist/cli/utils/resolve-session.d.ts +32 -0
  139. package/dist/cli/utils/resolve-session.d.ts.map +1 -0
  140. package/dist/cli/utils/resolve-session.js +39 -0
  141. package/dist/cli/utils/resolve-session.js.map +1 -0
  142. package/dist/core/config.d.ts +4 -1
  143. package/dist/core/config.d.ts.map +1 -1
  144. package/dist/core/config.js +11 -23
  145. package/dist/core/config.js.map +1 -1
  146. package/dist/core/constants.d.ts +51 -13
  147. package/dist/core/constants.d.ts.map +1 -1
  148. package/dist/core/constants.js +63 -13
  149. package/dist/core/constants.js.map +1 -1
  150. package/dist/core/diagnostics/checks.d.ts +151 -0
  151. package/dist/core/diagnostics/checks.d.ts.map +1 -0
  152. package/dist/core/diagnostics/checks.js +766 -0
  153. package/dist/core/diagnostics/checks.js.map +1 -0
  154. package/dist/core/diagnostics/daemon-status.d.ts +77 -0
  155. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
  156. package/dist/core/diagnostics/daemon-status.js +113 -0
  157. package/dist/core/diagnostics/daemon-status.js.map +1 -0
  158. package/dist/core/diagnostics/entropy-checks.d.ts +83 -0
  159. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
  160. package/dist/core/diagnostics/entropy-checks.js +400 -0
  161. package/dist/core/diagnostics/entropy-checks.js.map +1 -0
  162. package/dist/core/diagnostics/fix-runner.d.ts +54 -0
  163. package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
  164. package/dist/core/diagnostics/fix-runner.js +90 -0
  165. package/dist/core/diagnostics/fix-runner.js.map +1 -0
  166. package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
  167. package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
  168. package/dist/core/diagnostics/heartbeat-reader.js +50 -0
  169. package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
  170. package/dist/core/diagnostics/knip-runner.d.ts +49 -0
  171. package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
  172. package/dist/core/diagnostics/knip-runner.js +100 -0
  173. package/dist/core/diagnostics/knip-runner.js.map +1 -0
  174. package/dist/core/diagnostics/markers.d.ts +96 -0
  175. package/dist/core/diagnostics/markers.d.ts.map +1 -0
  176. package/dist/core/diagnostics/markers.js +153 -0
  177. package/dist/core/diagnostics/markers.js.map +1 -0
  178. package/dist/core/event-fields.d.ts +27 -0
  179. package/dist/core/event-fields.d.ts.map +1 -1
  180. package/dist/core/event-fields.js +43 -0
  181. package/dist/core/event-fields.js.map +1 -1
  182. package/dist/core/governance/global-inject.d.ts +90 -0
  183. package/dist/core/governance/global-inject.d.ts.map +1 -0
  184. package/dist/core/governance/global-inject.js +184 -0
  185. package/dist/core/governance/global-inject.js.map +1 -0
  186. package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
  187. package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
  188. package/dist/core/insights/agent-anchor-guard.js +119 -0
  189. package/dist/core/insights/agent-anchor-guard.js.map +1 -0
  190. package/dist/core/insights/agent-distill-context.d.ts +55 -0
  191. package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
  192. package/dist/core/insights/agent-distill-context.js +146 -0
  193. package/dist/core/insights/agent-distill-context.js.map +1 -0
  194. package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
  195. package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
  196. package/dist/core/insights/agent-distill-spawn.js +179 -0
  197. package/dist/core/insights/agent-distill-spawn.js.map +1 -0
  198. package/dist/core/insights/agent-drift.d.ts +66 -0
  199. package/dist/core/insights/agent-drift.d.ts.map +1 -0
  200. package/dist/core/insights/agent-drift.js +109 -0
  201. package/dist/core/insights/agent-drift.js.map +1 -0
  202. package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
  203. package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
  204. package/dist/core/insights/agent-evolution-sources.js +36 -0
  205. package/dist/core/insights/agent-evolution-sources.js.map +1 -0
  206. package/dist/core/insights/agent-health.d.ts +142 -0
  207. package/dist/core/insights/agent-health.d.ts.map +1 -0
  208. package/dist/core/insights/agent-health.js +296 -0
  209. package/dist/core/insights/agent-health.js.map +1 -0
  210. package/dist/core/insights/agent-patch-apply.d.ts +45 -0
  211. package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
  212. package/dist/core/insights/agent-patch-apply.js +165 -0
  213. package/dist/core/insights/agent-patch-apply.js.map +1 -0
  214. package/dist/core/insights/agent-suggest.d.ts +128 -0
  215. package/dist/core/insights/agent-suggest.d.ts.map +1 -0
  216. package/dist/core/insights/agent-suggest.js +284 -0
  217. package/dist/core/insights/agent-suggest.js.map +1 -0
  218. package/dist/core/insights/coverage-tiers.d.ts +46 -0
  219. package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
  220. package/dist/core/insights/coverage-tiers.js +95 -0
  221. package/dist/core/insights/coverage-tiers.js.map +1 -0
  222. package/dist/core/insights/experience-extractor.d.ts +60 -0
  223. package/dist/core/insights/experience-extractor.d.ts.map +1 -0
  224. package/dist/core/insights/experience-extractor.js +319 -0
  225. package/dist/core/insights/experience-extractor.js.map +1 -0
  226. package/dist/core/insights/violation-reporter.d.ts +149 -0
  227. package/dist/core/insights/violation-reporter.d.ts.map +1 -0
  228. package/dist/core/insights/violation-reporter.js +391 -0
  229. package/dist/core/insights/violation-reporter.js.map +1 -0
  230. package/dist/core/loop/loop-engine.d.ts +140 -0
  231. package/dist/core/loop/loop-engine.d.ts.map +1 -0
  232. package/dist/core/loop/loop-engine.js +266 -0
  233. package/dist/core/loop/loop-engine.js.map +1 -0
  234. package/dist/core/queue/index.d.ts +16 -3
  235. package/dist/core/queue/index.d.ts.map +1 -1
  236. package/dist/core/queue/index.js +16 -4
  237. package/dist/core/queue/index.js.map +1 -1
  238. package/dist/core/storage/base.d.ts +317 -0
  239. package/dist/core/storage/base.d.ts.map +1 -1
  240. package/dist/core/storage/base.js +1093 -0
  241. package/dist/core/storage/base.js.map +1 -1
  242. package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
  243. package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
  244. package/dist/core/storage/codec/tool-input-codec.js +159 -0
  245. package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
  246. package/dist/core/storage/codegraph-types.d.ts +79 -0
  247. package/dist/core/storage/codegraph-types.d.ts.map +1 -0
  248. package/dist/core/storage/codegraph-types.js +14 -0
  249. package/dist/core/storage/codegraph-types.js.map +1 -0
  250. package/dist/core/storage/codegraph.d.ts +186 -0
  251. package/dist/core/storage/codegraph.d.ts.map +1 -0
  252. package/dist/core/storage/codegraph.js +452 -0
  253. package/dist/core/storage/codegraph.js.map +1 -0
  254. package/dist/core/storage/decisions.d.ts +387 -0
  255. package/dist/core/storage/decisions.d.ts.map +1 -0
  256. package/dist/core/storage/decisions.js +534 -0
  257. package/dist/core/storage/decisions.js.map +1 -0
  258. package/dist/core/storage/events.d.ts +239 -8
  259. package/dist/core/storage/events.d.ts.map +1 -1
  260. package/dist/core/storage/events.js +705 -39
  261. package/dist/core/storage/events.js.map +1 -1
  262. package/dist/core/storage/feedback.d.ts +111 -0
  263. package/dist/core/storage/feedback.d.ts.map +1 -0
  264. package/dist/core/storage/feedback.js +186 -0
  265. package/dist/core/storage/feedback.js.map +1 -0
  266. package/dist/core/storage/forge-config.d.ts +40 -0
  267. package/dist/core/storage/forge-config.d.ts.map +1 -0
  268. package/dist/core/storage/forge-config.js +65 -0
  269. package/dist/core/storage/forge-config.js.map +1 -0
  270. package/dist/core/storage/injections.d.ts +68 -0
  271. package/dist/core/storage/injections.d.ts.map +1 -1
  272. package/dist/core/storage/injections.js +131 -5
  273. package/dist/core/storage/injections.js.map +1 -1
  274. package/dist/core/storage/knowledge.d.ts +332 -0
  275. package/dist/core/storage/knowledge.d.ts.map +1 -0
  276. package/dist/core/storage/knowledge.js +589 -0
  277. package/dist/core/storage/knowledge.js.map +1 -0
  278. package/dist/core/storage/maintenance.d.ts +36 -9
  279. package/dist/core/storage/maintenance.d.ts.map +1 -1
  280. package/dist/core/storage/maintenance.js +56 -24
  281. package/dist/core/storage/maintenance.js.map +1 -1
  282. package/dist/core/storage/pipeline-rollup.d.ts +111 -0
  283. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
  284. package/dist/core/storage/pipeline-rollup.js +432 -0
  285. package/dist/core/storage/pipeline-rollup.js.map +1 -0
  286. package/dist/core/storage/routing.d.ts +50 -3
  287. package/dist/core/storage/routing.d.ts.map +1 -1
  288. package/dist/core/storage/routing.js +131 -10
  289. package/dist/core/storage/routing.js.map +1 -1
  290. package/dist/core/storage/rows.d.ts +31 -8
  291. package/dist/core/storage/rows.d.ts.map +1 -1
  292. package/dist/core/storage/schema.sql +367 -23
  293. package/dist/core/storage/sessions.d.ts +136 -0
  294. package/dist/core/storage/sessions.d.ts.map +1 -1
  295. package/dist/core/storage/sessions.js +352 -15
  296. package/dist/core/storage/sessions.js.map +1 -1
  297. package/dist/core/storage/skills.d.ts +160 -0
  298. package/dist/core/storage/skills.d.ts.map +1 -1
  299. package/dist/core/storage/skills.js +368 -7
  300. package/dist/core/storage/skills.js.map +1 -1
  301. package/dist/core/storage/sqlite.d.ts +309 -20
  302. package/dist/core/storage/sqlite.d.ts.map +1 -1
  303. package/dist/core/storage/sqlite.js +523 -16
  304. package/dist/core/storage/sqlite.js.map +1 -1
  305. package/dist/core/storage/tasks.d.ts +744 -2
  306. package/dist/core/storage/tasks.d.ts.map +1 -1
  307. package/dist/core/storage/tasks.js +1691 -17
  308. package/dist/core/storage/tasks.js.map +1 -1
  309. package/dist/core/storage/tool-intercepts.d.ts +69 -0
  310. package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
  311. package/dist/core/storage/tool-intercepts.js +116 -0
  312. package/dist/core/storage/tool-intercepts.js.map +1 -0
  313. package/dist/core/types.d.ts +136 -18
  314. package/dist/core/types.d.ts.map +1 -1
  315. package/dist/core/types.js +10 -0
  316. package/dist/core/types.js.map +1 -1
  317. package/dist/core/utils/backup.d.ts +81 -0
  318. package/dist/core/utils/backup.d.ts.map +1 -0
  319. package/dist/core/utils/backup.js +98 -0
  320. package/dist/core/utils/backup.js.map +1 -0
  321. package/dist/core/utils/binary-paths.d.ts +124 -0
  322. package/dist/core/utils/binary-paths.d.ts.map +1 -0
  323. package/dist/core/utils/binary-paths.js +218 -0
  324. package/dist/core/utils/binary-paths.js.map +1 -0
  325. package/dist/core/utils/bypass-token.d.ts +75 -0
  326. package/dist/core/utils/bypass-token.d.ts.map +1 -0
  327. package/dist/core/utils/bypass-token.js +133 -0
  328. package/dist/core/utils/bypass-token.js.map +1 -0
  329. package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
  330. package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
  331. package/dist/core/utils/cc-builtin-agents.js +29 -0
  332. package/dist/core/utils/cc-builtin-agents.js.map +1 -0
  333. package/dist/core/utils/claude-cli-resolver.d.ts +26 -0
  334. package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
  335. package/dist/core/utils/claude-cli-resolver.js +115 -0
  336. package/dist/core/utils/claude-cli-resolver.js.map +1 -0
  337. package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
  338. package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
  339. package/dist/core/utils/claude-cli-spawn.js +219 -0
  340. package/dist/core/utils/claude-cli-spawn.js.map +1 -0
  341. package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
  342. package/dist/core/utils/forge-resume-block.js +3 -2
  343. package/dist/core/utils/forge-resume-block.js.map +1 -1
  344. package/dist/core/utils/logger.d.ts +15 -3
  345. package/dist/core/utils/logger.d.ts.map +1 -1
  346. package/dist/core/utils/logger.js +20 -2
  347. package/dist/core/utils/logger.js.map +1 -1
  348. package/dist/core/utils/noise-prompt.d.ts +97 -0
  349. package/dist/core/utils/noise-prompt.d.ts.map +1 -0
  350. package/dist/core/utils/noise-prompt.js +127 -0
  351. package/dist/core/utils/noise-prompt.js.map +1 -0
  352. package/dist/core/utils/path.d.ts +0 -4
  353. package/dist/core/utils/path.d.ts.map +1 -1
  354. package/dist/core/utils/path.js +0 -7
  355. package/dist/core/utils/path.js.map +1 -1
  356. package/dist/core/utils/time.d.ts +67 -0
  357. package/dist/core/utils/time.d.ts.map +1 -1
  358. package/dist/core/utils/time.js +147 -0
  359. package/dist/core/utils/time.js.map +1 -1
  360. package/dist/daemon/agent-sync.d.ts +24 -0
  361. package/dist/daemon/agent-sync.d.ts.map +1 -0
  362. package/dist/daemon/agent-sync.js +114 -0
  363. package/dist/daemon/agent-sync.js.map +1 -0
  364. package/dist/daemon/config-store.d.ts +55 -0
  365. package/dist/daemon/config-store.d.ts.map +1 -0
  366. package/dist/daemon/config-store.js +146 -0
  367. package/dist/daemon/config-store.js.map +1 -0
  368. package/dist/daemon/event-parser.d.ts +22 -0
  369. package/dist/daemon/event-parser.d.ts.map +1 -1
  370. package/dist/daemon/event-parser.js +54 -3
  371. package/dist/daemon/event-parser.js.map +1 -1
  372. package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
  373. package/dist/daemon/handlers/history-exporter.js +9 -8
  374. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  375. package/dist/daemon/handlers/post-tool-use.d.ts +66 -4
  376. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  377. package/dist/daemon/handlers/post-tool-use.js +221 -8
  378. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  379. package/dist/daemon/handlers/pre-tool-use.d.ts +181 -0
  380. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
  381. package/dist/daemon/handlers/pre-tool-use.js +618 -0
  382. package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
  383. package/dist/daemon/handlers/stop.d.ts +55 -7
  384. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  385. package/dist/daemon/handlers/stop.js +245 -8
  386. package/dist/daemon/handlers/stop.js.map +1 -1
  387. package/dist/daemon/handlers/user-prompt.d.ts +51 -14
  388. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  389. package/dist/daemon/handlers/user-prompt.js +223 -95
  390. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  391. package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
  392. package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
  393. package/dist/daemon/handlers/violation-content-backfill.js +167 -0
  394. package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
  395. package/dist/daemon/hook-sync.d.ts.map +1 -1
  396. package/dist/daemon/hook-sync.js +2 -1
  397. package/dist/daemon/hook-sync.js.map +1 -1
  398. package/dist/daemon/index.d.ts +19 -0
  399. package/dist/daemon/index.d.ts.map +1 -1
  400. package/dist/daemon/index.js +439 -86
  401. package/dist/daemon/index.js.map +1 -1
  402. package/dist/daemon/lifecycle.d.ts +48 -1
  403. package/dist/daemon/lifecycle.d.ts.map +1 -1
  404. package/dist/daemon/lifecycle.js +98 -2
  405. package/dist/daemon/lifecycle.js.map +1 -1
  406. package/dist/daemon/router.d.ts +4 -1
  407. package/dist/daemon/router.d.ts.map +1 -1
  408. package/dist/daemon/router.js +4 -2
  409. package/dist/daemon/router.js.map +1 -1
  410. package/dist/daemon/rules/defaults.d.ts +20 -0
  411. package/dist/daemon/rules/defaults.d.ts.map +1 -0
  412. package/dist/daemon/rules/defaults.js +779 -0
  413. package/dist/daemon/rules/defaults.js.map +1 -0
  414. package/dist/daemon/rules/registry.d.ts +47 -0
  415. package/dist/daemon/rules/registry.d.ts.map +1 -0
  416. package/dist/daemon/rules/registry.js +84 -0
  417. package/dist/daemon/rules/registry.js.map +1 -0
  418. package/dist/daemon/rules/types.d.ts +176 -0
  419. package/dist/daemon/rules/types.d.ts.map +1 -0
  420. package/dist/daemon/rules/types.js +15 -0
  421. package/dist/daemon/rules/types.js.map +1 -0
  422. package/dist/daemon/rules/whitelist.d.ts +101 -0
  423. package/dist/daemon/rules/whitelist.d.ts.map +1 -0
  424. package/dist/daemon/rules/whitelist.js +210 -0
  425. package/dist/daemon/rules/whitelist.js.map +1 -0
  426. package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
  427. package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
  428. package/dist/daemon/rules/workflow-defaults.js +521 -0
  429. package/dist/daemon/rules/workflow-defaults.js.map +1 -0
  430. package/dist/daemon/server.d.ts +11 -1
  431. package/dist/daemon/server.d.ts.map +1 -1
  432. package/dist/daemon/server.js +7 -1
  433. package/dist/daemon/server.js.map +1 -1
  434. package/dist/daemon/services/codegraph-sync.d.ts +94 -0
  435. package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
  436. package/dist/daemon/services/codegraph-sync.js +159 -0
  437. package/dist/daemon/services/codegraph-sync.js.map +1 -0
  438. package/dist/daemon/services/context-injector.d.ts +34 -0
  439. package/dist/daemon/services/context-injector.d.ts.map +1 -0
  440. package/dist/daemon/services/context-injector.js +61 -0
  441. package/dist/daemon/services/context-injector.js.map +1 -0
  442. package/dist/daemon/services/decision-hint.d.ts +240 -0
  443. package/dist/daemon/services/decision-hint.d.ts.map +1 -0
  444. package/dist/daemon/services/decision-hint.js +562 -0
  445. package/dist/daemon/services/decision-hint.js.map +1 -0
  446. package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
  447. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
  448. package/dist/daemon/services/event-ttl-sweep.js +124 -0
  449. package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
  450. package/dist/daemon/services/feedback-aggregator.d.ts +167 -0
  451. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
  452. package/dist/daemon/services/feedback-aggregator.js +415 -0
  453. package/dist/daemon/services/feedback-aggregator.js.map +1 -0
  454. package/dist/daemon/services/heartbeat-writer.d.ts +46 -0
  455. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
  456. package/dist/daemon/services/heartbeat-writer.js +82 -0
  457. package/dist/daemon/services/heartbeat-writer.js.map +1 -0
  458. package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
  459. package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
  460. package/dist/daemon/services/idle-session-sweeper.js +94 -0
  461. package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
  462. package/dist/daemon/services/idle-task-budget.d.ts +50 -0
  463. package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
  464. package/dist/daemon/services/idle-task-budget.js +72 -0
  465. package/dist/daemon/services/idle-task-budget.js.map +1 -0
  466. package/dist/daemon/services/intercept-revive.d.ts +60 -0
  467. package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
  468. package/dist/daemon/services/intercept-revive.js +86 -0
  469. package/dist/daemon/services/intercept-revive.js.map +1 -0
  470. package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
  471. package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
  472. package/dist/daemon/services/intercept-rollback-guard.js +152 -0
  473. package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
  474. package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
  475. package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
  476. package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
  477. package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
  478. package/dist/daemon/services/kb-injector.d.ts +57 -0
  479. package/dist/daemon/services/kb-injector.d.ts.map +1 -0
  480. package/dist/daemon/services/kb-injector.js +148 -0
  481. package/dist/daemon/services/kb-injector.js.map +1 -0
  482. package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
  483. package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
  484. package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
  485. package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
  486. package/dist/daemon/services/loop-hint.d.ts +139 -0
  487. package/dist/daemon/services/loop-hint.d.ts.map +1 -0
  488. package/dist/daemon/services/loop-hint.js +272 -0
  489. package/dist/daemon/services/loop-hint.js.map +1 -0
  490. package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
  491. package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
  492. package/dist/daemon/services/outcome-classification-service.js +214 -0
  493. package/dist/daemon/services/outcome-classification-service.js.map +1 -0
  494. package/dist/daemon/services/outcome-classifier.d.ts +136 -0
  495. package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
  496. package/dist/daemon/services/outcome-classifier.js +178 -0
  497. package/dist/daemon/services/outcome-classifier.js.map +1 -0
  498. package/dist/daemon/services/outcome-nudge.d.ts +107 -0
  499. package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
  500. package/dist/daemon/services/outcome-nudge.js +242 -0
  501. package/dist/daemon/services/outcome-nudge.js.map +1 -0
  502. package/dist/daemon/services/spec-approval.d.ts +127 -0
  503. package/dist/daemon/services/spec-approval.d.ts.map +1 -0
  504. package/dist/daemon/services/spec-approval.js +216 -0
  505. package/dist/daemon/services/spec-approval.js.map +1 -0
  506. package/dist/daemon/services/spec-gate.d.ts +54 -0
  507. package/dist/daemon/services/spec-gate.d.ts.map +1 -0
  508. package/dist/daemon/services/spec-gate.js +113 -0
  509. package/dist/daemon/services/spec-gate.js.map +1 -0
  510. package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
  511. package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
  512. package/dist/daemon/services/task-boundary-classifier.js +202 -0
  513. package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
  514. package/dist/daemon/services/task-segmenter.d.ts +230 -1
  515. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  516. package/dist/daemon/services/task-segmenter.js +527 -17
  517. package/dist/daemon/services/task-segmenter.js.map +1 -1
  518. package/dist/daemon/skill-sync.d.ts +7 -2
  519. package/dist/daemon/skill-sync.d.ts.map +1 -1
  520. package/dist/daemon/skill-sync.js +114 -9
  521. package/dist/daemon/skill-sync.js.map +1 -1
  522. package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
  523. package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
  524. package/dist/daemon/startup/maintenance-schedulers.js +294 -0
  525. package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
  526. package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
  527. package/dist/daemon/templates/agents/claudemd-writer.md +102 -0
  528. package/dist/daemon/templates/agents/coder.md +262 -0
  529. package/dist/daemon/templates/agents/decision-maker.md +546 -0
  530. package/dist/daemon/templates/agents/doc-reviewer.md +118 -0
  531. package/dist/daemon/templates/agents/harness-debug-full.md +196 -0
  532. package/dist/daemon/templates/agents/knowledge-builder.md +120 -0
  533. package/dist/daemon/templates/agents/patch-applier.md +145 -0
  534. package/dist/daemon/templates/agents/planner.md +217 -0
  535. package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
  536. package/dist/daemon/templates/agents/skill-distiller.md +114 -0
  537. package/dist/daemon/templates/agents/task-boundary-classifier.md +65 -0
  538. package/dist/daemon/templates/agents/verify-agent.md +259 -0
  539. package/dist/daemon/utils/inject-block.d.ts +39 -0
  540. package/dist/daemon/utils/inject-block.d.ts.map +1 -0
  541. package/dist/daemon/utils/inject-block.js +25 -0
  542. package/dist/daemon/utils/inject-block.js.map +1 -0
  543. package/dist/hooks/hook-lib.sh +8 -0
  544. package/dist/hooks/notification.sh +19 -8
  545. package/dist/hooks/post-tool-use.sh +41 -23
  546. package/dist/hooks/pre-tool-use.sh +54 -23
  547. package/dist/hooks/session-start.sh +68 -0
  548. package/dist/hooks/stop.sh +31 -11
  549. package/dist/hooks/user-prompt-submit.sh +37 -21
  550. package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
  551. package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
  552. package/dist/knowledge/adapters/go-adapter.js +294 -0
  553. package/dist/knowledge/adapters/go-adapter.js.map +1 -0
  554. package/dist/knowledge/adapters/index.d.ts +41 -0
  555. package/dist/knowledge/adapters/index.d.ts.map +1 -0
  556. package/dist/knowledge/adapters/index.js +71 -0
  557. package/dist/knowledge/adapters/index.js.map +1 -0
  558. package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
  559. package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
  560. package/dist/knowledge/adapters/java-adapter.js +260 -0
  561. package/dist/knowledge/adapters/java-adapter.js.map +1 -0
  562. package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
  563. package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
  564. package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
  565. package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
  566. package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
  567. package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
  568. package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
  569. package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
  570. package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
  571. package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
  572. package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
  573. package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
  574. package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
  575. package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
  576. package/dist/knowledge/adapters/python-adapter.js +358 -0
  577. package/dist/knowledge/adapters/python-adapter.js.map +1 -0
  578. package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
  579. package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
  580. package/dist/knowledge/adapters/rust-adapter.js +329 -0
  581. package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
  582. package/dist/knowledge/adapters/types.d.ts +99 -0
  583. package/dist/knowledge/adapters/types.d.ts.map +1 -0
  584. package/dist/knowledge/adapters/types.js +17 -0
  585. package/dist/knowledge/adapters/types.js.map +1 -0
  586. package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
  587. package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
  588. package/dist/knowledge/adapters/typescript-adapter.js +171 -0
  589. package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
  590. package/dist/knowledge/audit-applier.d.ts +70 -0
  591. package/dist/knowledge/audit-applier.d.ts.map +1 -0
  592. package/dist/knowledge/audit-applier.js +251 -0
  593. package/dist/knowledge/audit-applier.js.map +1 -0
  594. package/dist/knowledge/builder.d.ts +261 -0
  595. package/dist/knowledge/builder.d.ts.map +1 -0
  596. package/dist/knowledge/builder.js +966 -0
  597. package/dist/knowledge/builder.js.map +1 -0
  598. package/dist/knowledge/cli-provider.d.ts +151 -0
  599. package/dist/knowledge/cli-provider.d.ts.map +1 -0
  600. package/dist/knowledge/cli-provider.js +313 -0
  601. package/dist/knowledge/cli-provider.js.map +1 -0
  602. package/dist/knowledge/constants.d.ts +78 -0
  603. package/dist/knowledge/constants.d.ts.map +1 -0
  604. package/dist/knowledge/constants.js +98 -0
  605. package/dist/knowledge/constants.js.map +1 -0
  606. package/dist/knowledge/cross-module.d.ts +139 -0
  607. package/dist/knowledge/cross-module.d.ts.map +1 -0
  608. package/dist/knowledge/cross-module.js +370 -0
  609. package/dist/knowledge/cross-module.js.map +1 -0
  610. package/dist/knowledge/git-hooks.d.ts +67 -0
  611. package/dist/knowledge/git-hooks.d.ts.map +1 -0
  612. package/dist/knowledge/git-hooks.js +258 -0
  613. package/dist/knowledge/git-hooks.js.map +1 -0
  614. package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
  615. package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
  616. package/dist/knowledge/graph/edge-extractor.js +242 -0
  617. package/dist/knowledge/graph/edge-extractor.js.map +1 -0
  618. package/dist/knowledge/graph/impact.d.ts +73 -0
  619. package/dist/knowledge/graph/impact.d.ts.map +1 -0
  620. package/dist/knowledge/graph/impact.js +94 -0
  621. package/dist/knowledge/graph/impact.js.map +1 -0
  622. package/dist/knowledge/graph/types.d.ts +22 -0
  623. package/dist/knowledge/graph/types.d.ts.map +1 -0
  624. package/dist/knowledge/graph/types.js +13 -0
  625. package/dist/knowledge/graph/types.js.map +1 -0
  626. package/dist/knowledge/module-hash.d.ts +88 -0
  627. package/dist/knowledge/module-hash.d.ts.map +1 -0
  628. package/dist/knowledge/module-hash.js +162 -0
  629. package/dist/knowledge/module-hash.js.map +1 -0
  630. package/dist/knowledge/project-detector.d.ts +101 -0
  631. package/dist/knowledge/project-detector.d.ts.map +1 -0
  632. package/dist/knowledge/project-detector.js +223 -0
  633. package/dist/knowledge/project-detector.js.map +1 -0
  634. package/dist/knowledge/prompt.d.ts +237 -0
  635. package/dist/knowledge/prompt.d.ts.map +1 -0
  636. package/dist/knowledge/prompt.js +416 -0
  637. package/dist/knowledge/prompt.js.map +1 -0
  638. package/dist/knowledge/query.d.ts +118 -0
  639. package/dist/knowledge/query.d.ts.map +1 -0
  640. package/dist/knowledge/query.js +438 -0
  641. package/dist/knowledge/query.js.map +1 -0
  642. package/dist/knowledge/repo-map.d.ts +97 -0
  643. package/dist/knowledge/repo-map.d.ts.map +1 -0
  644. package/dist/knowledge/repo-map.js +447 -0
  645. package/dist/knowledge/repo-map.js.map +1 -0
  646. package/dist/knowledge/tools/index.d.ts +14 -0
  647. package/dist/knowledge/tools/index.d.ts.map +1 -0
  648. package/dist/knowledge/tools/index.js +11 -0
  649. package/dist/knowledge/tools/index.js.map +1 -0
  650. package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
  651. package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
  652. package/dist/knowledge/tools/knowledge-get-page.js +101 -0
  653. package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
  654. package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
  655. package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
  656. package/dist/knowledge/tools/knowledge-query.js +104 -0
  657. package/dist/knowledge/tools/knowledge-query.js.map +1 -0
  658. package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
  659. package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
  660. package/dist/knowledge/tools/repo-map-lookup.js +82 -0
  661. package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
  662. package/dist/knowledge/types.d.ts +269 -0
  663. package/dist/knowledge/types.d.ts.map +1 -0
  664. package/dist/knowledge/types.js +10 -0
  665. package/dist/knowledge/types.js.map +1 -0
  666. package/dist/knowledge/validator.d.ts +90 -0
  667. package/dist/knowledge/validator.d.ts.map +1 -0
  668. package/dist/knowledge/validator.js +355 -0
  669. package/dist/knowledge/validator.js.map +1 -0
  670. package/dist/mcp/server.d.ts +64 -8
  671. package/dist/mcp/server.d.ts.map +1 -1
  672. package/dist/mcp/server.js +448 -12
  673. package/dist/mcp/server.js.map +1 -1
  674. package/dist/skills/builtin-skills.d.ts +35 -0
  675. package/dist/skills/builtin-skills.d.ts.map +1 -0
  676. package/dist/skills/builtin-skills.js +68 -0
  677. package/dist/skills/builtin-skills.js.map +1 -0
  678. package/dist/skills/distill/attribution.d.ts +59 -0
  679. package/dist/skills/distill/attribution.d.ts.map +1 -0
  680. package/dist/skills/distill/attribution.js +101 -0
  681. package/dist/skills/distill/attribution.js.map +1 -0
  682. package/dist/skills/distill/distiller.d.ts +161 -0
  683. package/dist/skills/distill/distiller.d.ts.map +1 -0
  684. package/dist/skills/distill/distiller.js +461 -0
  685. package/dist/skills/distill/distiller.js.map +1 -0
  686. package/dist/skills/distill/index.d.ts +223 -0
  687. package/dist/skills/distill/index.d.ts.map +1 -0
  688. package/dist/skills/distill/index.js +466 -0
  689. package/dist/skills/distill/index.js.map +1 -0
  690. package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
  691. package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
  692. package/dist/skills/distill/project-anchor-guard.js +334 -0
  693. package/dist/skills/distill/project-anchor-guard.js.map +1 -0
  694. package/dist/skills/distill/topic-deduper.d.ts +77 -0
  695. package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
  696. package/dist/skills/distill/topic-deduper.js +119 -0
  697. package/dist/skills/distill/topic-deduper.js.map +1 -0
  698. package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
  699. package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
  700. package/dist/skills/distill/upstream-fetcher.js +202 -0
  701. package/dist/skills/distill/upstream-fetcher.js.map +1 -0
  702. package/dist/skills/distilled/distilled-api-design.md +495 -0
  703. package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
  704. package/dist/skills/distilled/distilled-brainstorming.md +79 -0
  705. package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
  706. package/dist/skills/distilled/distilled-canvas-design.md +128 -0
  707. package/dist/skills/distilled/distilled-claude-api.md +185 -0
  708. package/dist/skills/distilled/distilled-creator.md +181 -0
  709. package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
  710. package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
  711. package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
  712. package/dist/skills/distilled/distilled-docx.md +231 -0
  713. package/dist/skills/distilled/distilled-executing-plans.md +148 -0
  714. package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
  715. package/dist/skills/distilled/distilled-frontend-design.md +118 -0
  716. package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
  717. package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
  718. package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
  719. package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
  720. package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
  721. package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
  722. package/dist/skills/distilled/distilled-systematic-debugging.md +154 -0
  723. package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
  724. package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
  725. package/dist/skills/distilled/distilled-verification-before-completion.md +213 -0
  726. package/dist/skills/distilled/distilled-writing-skills.md +175 -0
  727. package/dist/skills/registry.d.ts +55 -51
  728. package/dist/skills/registry.d.ts.map +1 -1
  729. package/dist/skills/registry.js +82 -196
  730. package/dist/skills/registry.js.map +1 -1
  731. package/dist/skills/tools/pipeline-suggest.js +14 -14
  732. package/dist/skills/tools/pipeline-suggest.js.map +1 -1
  733. package/dist/skills/tools/skill-invoke.d.ts +3 -2
  734. package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
  735. package/dist/skills/tools/skill-invoke.js +4 -2
  736. package/dist/skills/tools/skill-invoke.js.map +1 -1
  737. package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
  738. package/dist/web/analytics/anti-pattern-detector.js +6 -1
  739. package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
  740. package/dist/web/analytics/drift-detector.d.ts +6 -0
  741. package/dist/web/analytics/drift-detector.d.ts.map +1 -1
  742. package/dist/web/analytics/drift-detector.js +15 -8
  743. package/dist/web/analytics/drift-detector.js.map +1 -1
  744. package/dist/web/analytics/weekly-report.d.ts +13 -0
  745. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  746. package/dist/web/analytics/weekly-report.js +17 -3
  747. package/dist/web/analytics/weekly-report.js.map +1 -1
  748. package/dist/web/routes/_helpers.d.ts +31 -0
  749. package/dist/web/routes/_helpers.d.ts.map +1 -1
  750. package/dist/web/routes/_helpers.js +33 -0
  751. package/dist/web/routes/_helpers.js.map +1 -1
  752. package/dist/web/routes/agent-content.d.ts +30 -0
  753. package/dist/web/routes/agent-content.d.ts.map +1 -0
  754. package/dist/web/routes/agent-content.js +139 -0
  755. package/dist/web/routes/agent-content.js.map +1 -0
  756. package/dist/web/routes/agent-distill.d.ts +49 -0
  757. package/dist/web/routes/agent-distill.d.ts.map +1 -0
  758. package/dist/web/routes/agent-distill.js +526 -0
  759. package/dist/web/routes/agent-distill.js.map +1 -0
  760. package/dist/web/routes/config.d.ts +56 -0
  761. package/dist/web/routes/config.d.ts.map +1 -0
  762. package/dist/web/routes/config.js +243 -0
  763. package/dist/web/routes/config.js.map +1 -0
  764. package/dist/web/routes/decisions.d.ts +15 -0
  765. package/dist/web/routes/decisions.d.ts.map +1 -0
  766. package/dist/web/routes/decisions.js +181 -0
  767. package/dist/web/routes/decisions.js.map +1 -0
  768. package/dist/web/routes/diagnostics.d.ts +61 -0
  769. package/dist/web/routes/diagnostics.d.ts.map +1 -0
  770. package/dist/web/routes/diagnostics.js +203 -0
  771. package/dist/web/routes/diagnostics.js.map +1 -0
  772. package/dist/web/routes/error-handler.d.ts +0 -4
  773. package/dist/web/routes/error-handler.d.ts.map +1 -1
  774. package/dist/web/routes/error-handler.js +0 -8
  775. package/dist/web/routes/error-handler.js.map +1 -1
  776. package/dist/web/routes/events.d.ts.map +1 -1
  777. package/dist/web/routes/events.js +26 -1
  778. package/dist/web/routes/events.js.map +1 -1
  779. package/dist/web/routes/health.d.ts +33 -0
  780. package/dist/web/routes/health.d.ts.map +1 -0
  781. package/dist/web/routes/health.js +37 -0
  782. package/dist/web/routes/health.js.map +1 -0
  783. package/dist/web/routes/insights.d.ts +0 -5
  784. package/dist/web/routes/insights.d.ts.map +1 -1
  785. package/dist/web/routes/insights.js +0 -0
  786. package/dist/web/routes/insights.js.map +1 -1
  787. package/dist/web/routes/knowledge.d.ts +57 -0
  788. package/dist/web/routes/knowledge.d.ts.map +1 -0
  789. package/dist/web/routes/knowledge.js +772 -0
  790. package/dist/web/routes/knowledge.js.map +1 -0
  791. package/dist/web/routes/patch.d.ts +60 -1
  792. package/dist/web/routes/patch.d.ts.map +1 -1
  793. package/dist/web/routes/patch.js +170 -64
  794. package/dist/web/routes/patch.js.map +1 -1
  795. package/dist/web/routes/pipeline.d.ts +28 -0
  796. package/dist/web/routes/pipeline.d.ts.map +1 -0
  797. package/dist/web/routes/pipeline.js +145 -0
  798. package/dist/web/routes/pipeline.js.map +1 -0
  799. package/dist/web/routes/rules.d.ts.map +1 -1
  800. package/dist/web/routes/rules.js +26 -7
  801. package/dist/web/routes/rules.js.map +1 -1
  802. package/dist/web/routes/sessions.d.ts.map +1 -1
  803. package/dist/web/routes/sessions.js +17 -8
  804. package/dist/web/routes/sessions.js.map +1 -1
  805. package/dist/web/routes/skill-content.d.ts +30 -0
  806. package/dist/web/routes/skill-content.d.ts.map +1 -0
  807. package/dist/web/routes/skill-content.js +117 -0
  808. package/dist/web/routes/skill-content.js.map +1 -0
  809. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  810. package/dist/web/routes/skill-stats.js +153 -16
  811. package/dist/web/routes/skill-stats.js.map +1 -1
  812. package/dist/web/routes/skills-distill.d.ts +29 -0
  813. package/dist/web/routes/skills-distill.d.ts.map +1 -0
  814. package/dist/web/routes/skills-distill.js +552 -0
  815. package/dist/web/routes/skills-distill.js.map +1 -0
  816. package/dist/web/routes/skills.js +7 -7
  817. package/dist/web/routes/skills.js.map +1 -1
  818. package/dist/web/routes/stats.d.ts.map +1 -1
  819. package/dist/web/routes/stats.js +2 -1
  820. package/dist/web/routes/stats.js.map +1 -1
  821. package/dist/web/routes/task-timeline.d.ts +178 -0
  822. package/dist/web/routes/task-timeline.d.ts.map +1 -0
  823. package/dist/web/routes/task-timeline.js +530 -0
  824. package/dist/web/routes/task-timeline.js.map +1 -0
  825. package/dist/web/routes/tasks.d.ts.map +1 -1
  826. package/dist/web/routes/tasks.js +377 -8
  827. package/dist/web/routes/tasks.js.map +1 -1
  828. package/dist/web/routes/trace.d.ts.map +1 -1
  829. package/dist/web/routes/trace.js +3 -2
  830. package/dist/web/routes/trace.js.map +1 -1
  831. package/dist/web/routes/types.d.ts +0 -4
  832. package/dist/web/routes/types.d.ts.map +1 -1
  833. package/dist/web/routes/types.js +1 -1
  834. package/dist/web/routes/types.js.map +1 -1
  835. package/dist/web/routes/violations.d.ts +14 -0
  836. package/dist/web/routes/violations.d.ts.map +1 -0
  837. package/dist/web/routes/violations.js +112 -0
  838. package/dist/web/routes/violations.js.map +1 -0
  839. package/dist/web/server.d.ts.map +1 -1
  840. package/dist/web/server.js +99 -19
  841. package/dist/web/server.js.map +1 -1
  842. package/dist/web/services/agent-distill-manager.d.ts +122 -0
  843. package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
  844. package/dist/web/services/agent-distill-manager.js +397 -0
  845. package/dist/web/services/agent-distill-manager.js.map +1 -0
  846. package/dist/web/services/build-manager.d.ts +72 -0
  847. package/dist/web/services/build-manager.d.ts.map +1 -0
  848. package/dist/web/services/build-manager.js +189 -0
  849. package/dist/web/services/build-manager.js.map +1 -0
  850. package/dist/web/services/distill-manager.d.ts +172 -0
  851. package/dist/web/services/distill-manager.d.ts.map +1 -0
  852. package/dist/web/services/distill-manager.js +411 -0
  853. package/dist/web/services/distill-manager.js.map +1 -0
  854. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
  855. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
  856. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
  857. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
  858. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
  859. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
  860. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
  861. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
  862. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
  863. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
  864. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
  865. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
  866. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
  867. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
  868. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
  869. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
  870. package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
  871. package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
  872. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
  873. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
  874. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
  875. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
  876. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
  877. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
  878. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
  879. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
  880. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
  881. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
  882. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
  883. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
  884. package/dist/web/static/assets/MarkdownRenderer-DlDQNihj.js +3 -0
  885. package/dist/web/static/assets/MarkdownRenderer-DlDQNihj.js.map +1 -0
  886. package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
  887. package/dist/web/static/assets/NotFound-LMzbP51V.js.map +1 -0
  888. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
  889. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
  890. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
  891. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
  892. package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
  893. package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
  894. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
  895. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
  896. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
  897. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
  898. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
  899. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
  900. package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
  901. package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
  902. package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
  903. package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
  904. package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
  905. package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
  906. package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
  907. package/dist/web/static/assets/index-B_v_MKlb.css +1 -0
  908. package/dist/web/static/assets/index-DileOOE4.js +4 -0
  909. package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
  910. package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
  911. package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
  912. package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
  913. package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
  914. package/dist/web/static/assets/outcome-BKGy9azt.js +2 -0
  915. package/dist/web/static/assets/outcome-BKGy9azt.js.map +1 -0
  916. package/dist/web/static/assets/query-CgCOpYWf.js +2 -0
  917. package/dist/web/static/assets/{query-C99w429o.js.map → query-CgCOpYWf.js.map} +1 -1
  918. package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-Cxmg8RuL.js} +3 -3
  919. package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-Cxmg8RuL.js.map} +1 -1
  920. package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
  921. package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
  922. package/dist/web/static/assets/syntax-highlighter-BDYycNja.js +6 -0
  923. package/dist/web/static/assets/syntax-highlighter-BDYycNja.js.map +1 -0
  924. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
  925. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
  926. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
  927. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
  928. package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
  929. package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
  930. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
  931. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
  932. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
  933. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
  934. package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
  935. package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
  936. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
  937. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
  938. package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
  939. package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
  940. package/dist/web/static/index.html +12 -8
  941. package/package.json +18 -5
  942. package/dist/core/ai/provider.d.ts +0 -63
  943. package/dist/core/ai/provider.d.ts.map +0 -1
  944. package/dist/core/ai/provider.js +0 -241
  945. package/dist/core/ai/provider.js.map +0 -1
  946. package/dist/core/ai/types.d.ts +0 -43
  947. package/dist/core/ai/types.d.ts.map +0 -1
  948. package/dist/core/ai/types.js +0 -5
  949. package/dist/core/ai/types.js.map +0 -1
  950. package/dist/core/storage/token-usage.d.ts +0 -36
  951. package/dist/core/storage/token-usage.d.ts.map +0 -1
  952. package/dist/core/storage/token-usage.js +0 -59
  953. package/dist/core/storage/token-usage.js.map +0 -1
  954. package/dist/core/utils/token-tracker.d.ts +0 -39
  955. package/dist/core/utils/token-tracker.d.ts.map +0 -1
  956. package/dist/core/utils/token-tracker.js +0 -69
  957. package/dist/core/utils/token-tracker.js.map +0 -1
  958. package/dist/skills/index.d.ts +0 -3
  959. package/dist/skills/index.d.ts.map +0 -1
  960. package/dist/skills/index.js +0 -3
  961. package/dist/skills/index.js.map +0 -1
  962. package/dist/skills/matcher.d.ts +0 -26
  963. package/dist/skills/matcher.d.ts.map +0 -1
  964. package/dist/skills/matcher.js +0 -113
  965. package/dist/skills/matcher.js.map +0 -1
  966. package/dist/skills/official/code-simplifier.md +0 -52
  967. package/dist/skills/official/find-skills.md +0 -142
  968. package/dist/skills/official/official-api-design.md +0 -30
  969. package/dist/skills/official/official-architecture-decision.md +0 -41
  970. package/dist/skills/official/official-bmad.md +0 -118
  971. package/dist/skills/official/official-db-schema-design.md +0 -34
  972. package/dist/skills/official/official-debug.md +0 -25
  973. package/dist/skills/official/official-doc-driven.md +0 -31
  974. package/dist/skills/official/official-harness-engineering.md +0 -108
  975. package/dist/skills/official/official-openspec.md +0 -89
  976. package/dist/skills/official/official-performance-optimization.md +0 -30
  977. package/dist/skills/official/official-pr-review.md +0 -35
  978. package/dist/skills/official/official-release-checklist.md +0 -30
  979. package/dist/skills/official/official-security-hardening.md +0 -32
  980. package/dist/skills/official/official-spec-driven-design.md +0 -31
  981. package/dist/skills/official/planning-with-files.md +0 -241
  982. package/dist/skills/official/ui-ux-pro-max.md +0 -105
  983. package/dist/skills/official/webapp-testing.md +0 -96
  984. package/dist/skills/official-skills.d.ts +0 -26
  985. package/dist/skills/official-skills.d.ts.map +0 -1
  986. package/dist/skills/official-skills.js +0 -74
  987. package/dist/skills/official-skills.js.map +0 -1
  988. package/dist/skills/semantic-matcher.d.ts +0 -60
  989. package/dist/skills/semantic-matcher.d.ts.map +0 -1
  990. package/dist/skills/semantic-matcher.js +0 -192
  991. package/dist/skills/semantic-matcher.js.map +0 -1
  992. package/dist/skills/upgrade-engine.d.ts +0 -93
  993. package/dist/skills/upgrade-engine.d.ts.map +0 -1
  994. package/dist/skills/upgrade-engine.js +0 -447
  995. package/dist/skills/upgrade-engine.js.map +0 -1
  996. package/dist/skills/upgrade-prompt.d.ts +0 -20
  997. package/dist/skills/upgrade-prompt.d.ts.map +0 -1
  998. package/dist/skills/upgrade-prompt.js +0 -75
  999. package/dist/skills/upgrade-prompt.js.map +0 -1
  1000. package/dist/web/routes/ai.d.ts +0 -10
  1001. package/dist/web/routes/ai.d.ts.map +0 -1
  1002. package/dist/web/routes/ai.js +0 -186
  1003. package/dist/web/routes/ai.js.map +0 -1
  1004. package/dist/web/routes/token-usage.d.ts +0 -7
  1005. package/dist/web/routes/token-usage.d.ts.map +0 -1
  1006. package/dist/web/routes/token-usage.js +0 -18
  1007. package/dist/web/routes/token-usage.js.map +0 -1
  1008. package/dist/web/ssrf-guard.d.ts +0 -35
  1009. package/dist/web/ssrf-guard.d.ts.map +0 -1
  1010. package/dist/web/ssrf-guard.js +0 -93
  1011. package/dist/web/ssrf-guard.js.map +0 -1
  1012. package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
  1013. package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
  1014. package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
  1015. package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
  1016. package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
  1017. package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
  1018. package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
  1019. package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
  1020. package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
  1021. package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
  1022. package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
  1023. package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
  1024. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
  1025. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
  1026. package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
  1027. package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
  1028. package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
  1029. package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
  1030. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
  1031. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
  1032. package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
  1033. package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
  1034. package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
  1035. package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
  1036. package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
  1037. package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
  1038. package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
  1039. package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
  1040. package/dist/web/static/assets/index-CBX47X8l.js +0 -3
  1041. package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
  1042. package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
  1043. package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
  1044. package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
  1045. package/dist/web/static/assets/query-C99w429o.js +0 -2
  1046. package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
  1047. package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
  1048. package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
  1049. package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
  1050. package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
  1051. package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
  1052. package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
  1053. package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticsPage-DIVdiIQG.js","sources":["../../src/pages/DiagnosticsPage.tsx"],"sourcesContent":["/**\n * /system/diagnostics — 系统 · 诊断。\n *\n * Arco Phase 4b(decision 29688066):视觉对齐新 Arco shell(全宽容器 + 头部 Card +\n * Arco Table + Grid 统计卡),与其它系统页观感一致。**纯视觉对齐**——数据端点\n * (`/api/diagnostics` + `POST /api/diagnostics/fix`)、查询/mutation 逻辑、确认 Modal、\n * 字段口径全部不变。原页用 maxWidth 居中 + 裸 <table> 渲染检查项,对齐后改用\n * 全宽 padding 容器 + 头部 Card + Arco Table,统计卡用 Grid.Row 排布。\n *\n * 渲染 doctor 报告 + 一键修复(确认 Modal 列出计划命令再 POST\n * /api/diagnostics/fix `{ confirm: true }`)。检查项数量动态取 `data.checks.length`\n * (后端现发 12 项,不再写死数字 — Phase 4c 标签动态化)。\n *\n * Spec: docs/design/2026-06-12/0941-arco-redesign-rollout-spec.md Phase 4\n * (上游:docs/design/2026-06-01/1030-cf-doctor-diagnostic-spec.md)\n */\n\nimport { useState } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport {\n Alert,\n Button,\n Card,\n Grid,\n Modal,\n Notification,\n Space,\n Spin,\n Table,\n Tag,\n Typography,\n} from '@arco-design/web-react'\nimport { IconRefresh, IconCheck } from '@arco-design/web-react/icon'\nimport { authFetch } from '../utils/auth'\n\nconst Row = Grid.Row\nconst Col = Grid.Col\n\ntype Status = 'pass' | 'warn' | 'fail' | 'skip'\n\ninterface CheckResult {\n id: number\n name: string\n status: Status\n message: string\n details?: string\n fix_hint?: string\n fixable_by?: 'cf fix' | 'manual'\n}\n\ninterface DiagnosticsMeta {\n current_project_path: string | null\n project_source: 'recent-event' | 'none'\n}\n\ninterface DiagnosticsResponse {\n summary: { pass: number; warn: number; fail: number; skip: number; fixable: number }\n checks: CheckResult[]\n generated_at: string\n /** spec e5b845c4: project resolved by the server (most-recent or null). */\n meta?: DiagnosticsMeta\n}\n\ninterface FixResponse {\n ok: boolean\n exit_code: number | null\n stdout: string\n stderr: string\n command: string\n /** spec e5b845c4: cwd actually used by the spawned `cf fix`. */\n cwd?: string\n}\n\nconst STATUS_COLOR: Record<Status, string> = {\n pass: 'green',\n warn: 'orange',\n fail: 'red',\n skip: 'gray',\n}\n\n/** 统计卡:复用语义配色,排进 Grid.Row(替原裸 flex)。 */\nfunction SummaryCard({ label, value, color }: { label: string; value: number; color?: string }) {\n return (\n <Card bordered bodyStyle={{ padding: 12, textAlign: 'center' }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>{label}</Typography.Text>\n <div style={{ fontSize: 24, fontWeight: 600, color: color ?? 'inherit', marginTop: 4 }}>\n {value}\n </div>\n </Card>\n )\n}\n\nexport default function DiagnosticsPage() {\n const qc = useQueryClient()\n const [modalOpen, setModalOpen] = useState(false)\n const [fixOutput, setFixOutput] = useState<FixResponse | null>(null)\n\n const { data, isLoading, error, refetch } = useQuery<DiagnosticsResponse>({\n queryKey: ['diagnostics-page'],\n queryFn: async () => {\n const res = await fetch('/api/diagnostics?refresh=1')\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n return res.json()\n },\n refetchInterval: 30_000,\n retry: 1,\n })\n\n const fixMutation = useMutation<FixResponse>({\n mutationFn: async () => {\n const res = await authFetch('/api/diagnostics/fix', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ confirm: true }),\n })\n if (!res.ok) {\n const body = (await res.json().catch(() => null)) as { message?: string } | null\n throw new Error(body?.message ?? `HTTP ${res.status}`)\n }\n return res.json()\n },\n onSuccess: (out) => {\n setFixOutput(out)\n Notification.success({ content: out.ok ? 'Fixes applied' : 'Some fixes failed (see output)' })\n qc.invalidateQueries({ queryKey: ['diagnostics-page'] })\n qc.invalidateQueries({ queryKey: ['diagnostics-badge'] })\n },\n onError: (err) => {\n Notification.error({ content: `Fix failed: ${String(err)}` })\n },\n })\n\n const fixable = data?.checks.filter((c) => c.fixable_by === 'cf fix' && c.status !== 'pass' && c.status !== 'skip') ?? []\n const projectPath = data?.meta?.current_project_path ?? null\n const noProject = !projectPath\n const fixDisabled = fixable.length === 0 || fixMutation.isPending || noProject\n\n const checkColumns = [\n { title: '#', dataIndex: 'id', width: 56, render: (v: number) => <span style={{ fontFamily: 'monospace' }}>{v}</span> },\n {\n title: '状态',\n dataIndex: 'status',\n width: 88,\n render: (s: Status) => <Tag color={STATUS_COLOR[s]}>{s.toUpperCase()}</Tag>,\n },\n {\n title: '检查项',\n dataIndex: 'name',\n width: 200,\n render: (v: string) => <span style={{ fontFamily: 'monospace' }}>{v}</span>,\n },\n {\n title: '详情',\n dataIndex: 'message',\n render: (_: unknown, c: CheckResult) => (\n <div>\n <div>{c.message}</div>\n {c.details && (\n <div style={{ fontSize: 12, color: 'var(--color-text-3)', marginTop: 4 }}>{c.details}</div>\n )}\n {c.fix_hint && (c.status === 'warn' || c.status === 'fail') && (\n <div style={{ marginTop: 4, fontSize: 12 }}>\n <Typography.Text code>{c.fix_hint}</Typography.Text>\n {c.fixable_by === 'cf fix' && (\n <Tag color=\"cyan\" size=\"small\" style={{ marginLeft: 6 }}>fixable</Tag>\n )}\n </div>\n )}\n </div>\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 <Typography.Title heading={6} style={{ margin: 0 }}>诊断</Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n SQLite 主库自检与健康检查{data ? ` · ${data.checks.length} 项 doctor 检查` : ''}\n </Typography.Text>\n <div style={{ flex: 1 }} />\n <Button size=\"small\" icon={<IconRefresh />} onClick={() => refetch()}>刷新</Button>\n <Button\n size=\"small\"\n type=\"primary\"\n status=\"warning\"\n icon={<IconCheck />}\n disabled={fixDisabled}\n onClick={() => setModalOpen(true)}\n >\n {noProject\n ? '无项目上下文'\n : fixable.length === 0\n ? '无可修复项'\n : `一键修复 (${fixable.length})`}\n </Button>\n </div>\n </Card>\n\n {/* spec e5b845c4: surface the project that the server picked. */}\n {data && (\n <Card\n bordered\n style={{ borderLeft: `4px solid ${noProject ? 'rgb(var(--red-6))' : 'rgb(var(--arcoblue-6))'}` }}\n bodyStyle={{ padding: 12 }}\n >\n {projectPath ? (\n <Typography.Text>\n <Typography.Text type=\"secondary\" style={{ marginRight: 8 }}>当前项目:</Typography.Text>\n <Typography.Text code>{projectPath}</Typography.Text>\n <Typography.Text type=\"secondary\" style={{ marginLeft: 8, fontSize: 12 }}>\n (最近活跃)\n </Typography.Text>\n </Typography.Text>\n ) : (\n <Typography.Text type=\"warning\">\n 尚无项目活动 — 在某个项目目录下打开 Claude Code 让 daemon 记录事件后,项目级检查 (5/6) 与一键修复才会启用。\n </Typography.Text>\n )}\n </Card>\n )}\n\n {isLoading && (\n <Card bordered>\n <div style={{ textAlign: 'center', padding: 32 }}><Spin /></div>\n </Card>\n )}\n {error && (\n <Card bordered>\n <Typography.Text type=\"error\">加载诊断失败: {String(error)}</Typography.Text>\n </Card>\n )}\n\n {data && (\n <>\n <Row gutter={[12, 12]}>\n <Col xs={12} sm={8} md={4}><SummaryCard label=\"PASS\" value={data.summary.pass} color=\"rgb(var(--green-6))\" /></Col>\n <Col xs={12} sm={8} md={4}><SummaryCard label=\"WARN\" value={data.summary.warn} color=\"rgb(var(--orange-6))\" /></Col>\n <Col xs={12} sm={8} md={4}><SummaryCard label=\"FAIL\" value={data.summary.fail} color=\"rgb(var(--red-6))\" /></Col>\n <Col xs={12} sm={8} md={4}><SummaryCard label=\"SKIP\" value={data.summary.skip} color=\"rgb(var(--gray-6))\" /></Col>\n <Col xs={12} sm={8} md={4}><SummaryCard label=\"可自动修复\" value={data.summary.fixable} color=\"rgb(var(--arcoblue-6))\" /></Col>\n </Row>\n\n <Card bordered title={`${data.checks.length} 项检查`} bodyStyle={{ padding: 0 }}>\n <Table\n rowKey=\"id\"\n data={data.checks}\n columns={checkColumns}\n pagination={false}\n border={false}\n size=\"small\"\n />\n </Card>\n\n {fixOutput && (\n <Card bordered title={`修复结果 (exit ${fixOutput.exit_code})`}>\n <Typography.Paragraph code>{fixOutput.command}</Typography.Paragraph>\n {fixOutput.cwd && (\n <Typography.Paragraph type=\"secondary\" style={{ fontSize: 12, marginTop: -8 }}>\n cwd: <Typography.Text code>{fixOutput.cwd}</Typography.Text>\n </Typography.Paragraph>\n )}\n {fixOutput.stdout && (\n <pre style={{ fontSize: 12, whiteSpace: 'pre-wrap', background: 'var(--color-fill-1)', padding: 8, borderRadius: 4 }}>\n {fixOutput.stdout}\n </pre>\n )}\n {fixOutput.stderr && (\n <pre style={{ fontSize: 12, whiteSpace: 'pre-wrap', color: 'rgb(var(--red-6))', background: 'var(--color-fill-1)', padding: 8, borderRadius: 4 }}>\n {fixOutput.stderr}\n </pre>\n )}\n </Card>\n )}\n\n <Card bordered bodyStyle={{ padding: 12 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 生成时间: {data.generated_at}\n </Typography.Text>\n </Card>\n </>\n )}\n\n <Modal\n title=\"确认自动修复\"\n visible={modalOpen}\n onCancel={() => setModalOpen(false)}\n onOk={() => {\n setModalOpen(false)\n fixMutation.mutate()\n }}\n okText=\"确认运行\"\n cancelText=\"取消\"\n okButtonProps={{\n status: 'warning',\n loading: fixMutation.isPending,\n disabled: noProject,\n }}\n >\n {/* spec e5b845c4 OQ#4: P0 safety — always show target cwd so user\n can verify before letting `cf project init` write to disk. */}\n {projectPath ? (\n <Alert\n type=\"info\"\n style={{ marginBottom: 12 }}\n content={\n <Space direction=\"vertical\" size={2}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>将在以下目录执行:</Typography.Text>\n <Typography.Text code style={{ fontSize: 13 }}>{projectPath}</Typography.Text>\n </Space>\n }\n />\n ) : (\n <Typography.Text type=\"error\">\n 没有可用的项目上下文 — 修复被阻止以免污染 daemon 目录。\n </Typography.Text>\n )}\n <Typography.Paragraph>\n 以下 {fixable.length} 项将通过 <Typography.Text code>cf fix --apply --yes</Typography.Text> 自动修复:\n </Typography.Paragraph>\n <ul style={{ paddingLeft: 20 }}>\n {fixable.map((c) => (\n <li key={c.id} style={{ marginBottom: 4 }}>\n #{c.id} {c.name} → <Typography.Text code>{c.fix_hint}</Typography.Text>\n </li>\n ))}\n </ul>\n </Modal>\n </div>\n )\n}\n"],"names":["Row","Grid","Col","STATUS_COLOR","SummaryCard","label","value","color","jsxs","Card","jsx","Typography","DiagnosticsPage","qc","useQueryClient","modalOpen","setModalOpen","useState","fixOutput","setFixOutput","data","isLoading","error","refetch","useQuery","res","fixMutation","useMutation","authFetch","body","out","Notification","err","fixable","c","projectPath","_a","noProject","fixDisabled","checkColumns","v","s","Tag","_","Button","IconRefresh","IconCheck","Spin","Fragment","Table","Modal","Alert","Space"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import{j as e}from"./react-vendor-tkvCrao7.js";import{J as r,d as v,D as S,F as x,X as z,ab as T,T as l,b as a,f,K as j,E as n,$ as I,N as k,O as w,a9 as C,aa as R,a5 as D}from"./arco-DV6xCLhr.js";import{M as L}from"./MarkdownRenderer-DlDQNihj.js";import{b as W,f as p,c as m,a as B,d as $}from"./useDistill-21dZkXlT.js";import{d as M,u as P}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./syntax-highlighter-BDYycNja.js";import"./markdown-CA7ePUts.js";import"./query-CgCOpYWf.js";const E=j.Row,h=j.Col;function y(t){const s=$(t),i=s.icon==="check"?e.jsx(w,{}):s.icon==="minus"?e.jsx(C,{}):e.jsx(R,{});return e.jsx(a,{color:s.color,size:"small",icon:i,children:s.label})}function F(t){const s=Math.round(t.value*100),i=t.value>=1?"rgb(var(--green-6))":t.value>0?"rgb(var(--orange-6))":"rgb(var(--gray-4))";return e.jsxs("div",{children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",marginBottom:4},children:[e.jsx(l.Text,{style:{fontSize:13},children:t.label}),e.jsxs(l.Text,{type:"secondary",style:{fontSize:12},children:[t.value.toFixed(1)," / 1"]})]}),e.jsx(D,{percent:s,showText:!1,color:i,size:"small"})]},t.key)}function K(t){return e.jsxs("div",{style:{padding:"10px 0",borderBottom:"1px solid var(--color-border-1)"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[e.jsx(f,{style:{color:"var(--color-text-3)"}}),e.jsx(l.Text,{style:{fontSize:13,fontWeight:600},title:t.url,children:t.repo}),t.license&&e.jsx(a,{size:"small",color:"arcoblue",children:t.license}),t.commit&&e.jsx(l.Text,{code:!0,style:{fontSize:11},children:t.commit})]}),t.paths.length>0&&e.jsx("div",{style:{marginTop:4,paddingLeft:22},children:t.paths.map(s=>e.jsx(l.Text,{type:"secondary",style:{fontSize:11,display:"block",fontFamily:"monospace"},children:s},s))})]},`${t.url}-${t.paths.join(",")}`)}function q(){const{topicId:t}=M(),s=P(),{view:i,loading:u,isError:g,error:d}=W(t);if(u)return e.jsx("div",{style:{padding:16},children:e.jsx(r,{bordered:!0,children:e.jsx(v,{animation:!0,text:{rows:8}})})});if(g||!i)return e.jsx("div",{style:{padding:16},children:e.jsx(S,{status:"error",title:"加载蒸馏详情失败",subTitle:(d==null?void 0:d.message)||"该 topic 不存在或端点不可用(本地回环)",extra:e.jsx(x,{type:"primary",onClick:()=>s("/ai/distill"),children:"返回蒸馏"})})});const c=i.decision==="distilled",b=i.id.startsWith("distilled-")?i.id:`distilled-${i.id}`;return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsxs(r,{bordered:!0,children:[e.jsx(x,{type:"text",size:"small",icon:e.jsx(z,{}),style:{marginBottom:8,paddingLeft:0},onClick:()=>s("/ai/distill"),children:"返回蒸馏"}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,flexWrap:"wrap"},children:[e.jsx(T,{style:{color:"rgb(var(--arcoblue-6))"}}),e.jsx(l.Title,{heading:5,style:{margin:0,fontFamily:"monospace"},children:i.id}),i.score!==null&&e.jsx(a,{color:i.score>=3?"green":"orange",size:"small",children:p(i.score)}),y(i.decision)]}),i.description&&e.jsx(l.Text,{type:"secondary",style:{fontSize:12,display:"block",marginTop:6},children:i.description}),i.attributions.length>0&&e.jsxs("div",{style:{display:"flex",gap:10,flexWrap:"wrap",marginTop:8},children:[e.jsx(l.Text,{type:"secondary",style:{fontSize:12},children:"上游归属:"}),i.attributions.map(o=>e.jsxs(a,{size:"small",icon:e.jsx(f,{}),children:[o.repo,o.commit?` @${o.commit}`:""]},`${o.url}-${o.paths.join(",")}`))]})]}),e.jsxs(E,{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(r,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"📐 5 维 IT 通用评分"}),extra:i.score!==null?e.jsxs(l.Text,{style:{fontSize:13,fontWeight:600},children:["合计 ",p(i.score)]}):null,children:c?e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:12},children:i.dims.map(F)}),i.rationale&&e.jsxs("div",{style:{marginTop:16,padding:"10px 14px",background:"var(--color-fill-1)",borderRadius:4},children:[e.jsx(l.Text,{type:"secondary",style:{fontSize:12},children:"评分依据"}),e.jsx(l.Paragraph,{style:{margin:"4px 0 0",fontSize:13},children:i.rationale})]})]}):i.decision==="skipped"?e.jsx(n,{description:"该 topic 被跳过(IT 通用分 <3,未蒸馏成 SKILL)"}):e.jsx(n,{description:"该 topic 因正文含项目锚点被拒(ProjectAnchorRejection),未产出可移植 SKILL"})}),c&&e.jsxs(r,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"📦 SKILL 封装预览"}),children:[m(i.frontmatter)&&e.jsx("pre",{style:{margin:"0 0 12px",padding:"12px 14px",background:"var(--color-fill-2)",borderRadius:4,fontSize:12,lineHeight:1.6,overflow:"auto",whiteSpace:"pre-wrap"},children:`---
2
+ ${m(i.frontmatter)}
3
+ ---`}),i.body?e.jsx("div",{style:{border:"1px solid var(--color-border-2)",borderRadius:4,background:"var(--color-fill-1)",padding:"12px 16px",maxHeight:520,overflow:"auto"},children:e.jsx(L,{content:i.body})}):e.jsx(n,{description:"封装正文为空(diff 端点未返回 distilledMarkdown)"})]})]})}),e.jsx(h,{xs:24,xl:8,style:{marginBottom:16},children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e.jsx(r,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"概要"}),children:e.jsx(I,{colon:" :",size:"small",column:1,labelStyle:{width:92,color:"var(--color-text-3)"},data:[{label:"name",value:e.jsx(l.Text,{code:!0,style:{fontSize:11},children:i.name})},{label:"version",value:i.version??"—"},{label:"IT 通用分",value:p(i.score)},{label:"决定",value:y(i.decision)},{label:"distilled_by",value:i.distilledBy??"—"},{label:"distilled_at",value:B(i.distilledAt)},{label:"spawn_agent",value:i.spawnAgent??"—"}]})}),e.jsx(r,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"上游归属"}),children:i.attributions.length>0?e.jsx("div",{style:{display:"flex",flexDirection:"column"},children:i.attributions.map(K)}):e.jsx(n,{description:"无上游归属信息(distilled_from 缺省)"})}),c&&e.jsxs(r,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"后续调用"}),children:[e.jsx(l.Text,{type:"secondary",style:{fontSize:12,display:"block",marginBottom:10},children:"此蒸馏 SKILL 在 agent 调用与有用性自评的明细,见 Skill 调用页。"}),e.jsxs(x,{type:"outline",long:!0,onClick:()=>s(`/ai/skills/${encodeURIComponent(b)}`),children:["查看 Skill 调用明细 ",e.jsx(k,{})]})]})]})})]})]})}export{q as default};
4
+ //# sourceMappingURL=DistillDetailPage-U6a3l2iP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DistillDetailPage-U6a3l2iP.js","sources":["../../src/pages/ai/DistillDetailPage.tsx"],"sourcesContent":["/**\n * DistillDetailPage — AI 资源 · 蒸馏详情整页 (Phase 2e, decision 29688066).\n *\n * 替换 `/ai/distill/:topicId` 的占位组件。整页(非抽屉)布局,翻译原型\n * 「蒸馏详情」成真 Arco 组件(**严禁直搬原型 Tailwind CSS**):\n * A. 页头横条:输出 id + score Tag + 决定 Tag + 上游归属(repo/commit/paths)\n * B. 左右双栏:\n * 左 = 5 维 D1-D5 评分条(各 0/0.5/1)+ 每维归在 rationale + SKILL 封装预览\n * (frontmatter + body);skip 展示 SKIP 形状、rejected 展示被拒锚点\n * 右 360 = 概要 Descriptions(name/version/score/decision/distilled_by/\n * distilled_at/spawn_agent)+ distilled_from 上游归属 + 后续调用链到\n * 对应 Skill 页 /ai/skills/:id\n *\n * 数据接真实只读端点(GET /api/skills/distill/review/:topicId/diff + /status),\n * 取数 + 派生在 useDistillDetail / distill-derive,本组件只渲染。\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 Progress from '@arco-design/web-react/es/Progress'\nimport {\n IconLeft,\n IconExperiment,\n IconStorage,\n IconRight,\n IconCheckCircle,\n IconMinusCircle,\n IconCloseCircle,\n} from '@arco-design/web-react/icon'\n\nimport MarkdownRenderer from '../../components/MarkdownRenderer'\nimport { useDistillDetail } from '../../hooks/useDistill'\nimport {\n formatScore,\n formatIso,\n decisionMeta,\n frontmatterPreview,\n type DimBar,\n type DistillDecision,\n type UpstreamAttribution,\n} from '../../hooks/distill-derive'\n\nconst Row = Grid.Row\nconst Col = Grid.Col\n\nfunction decisionTag(d: DistillDecision) {\n const m = decisionMeta(d)\n const icon =\n m.icon === 'check' ? (\n <IconCheckCircle />\n ) : m.icon === 'minus' ? (\n <IconMinusCircle />\n ) : (\n <IconCloseCircle />\n )\n return (\n <Tag color={m.color} size=\"small\" icon={icon}>\n {m.label}\n </Tag>\n )\n}\n\n/** 5 维评分条(各 0/0.5/1 → 0/50/100%)。 */\nfunction dimBar(d: DimBar) {\n const pct = Math.round(d.value * 100)\n const color =\n d.value >= 1\n ? 'rgb(var(--green-6))'\n : d.value > 0\n ? 'rgb(var(--orange-6))'\n : 'rgb(var(--gray-4))'\n return (\n <div key={d.key}>\n <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 4 }}>\n <Typography.Text style={{ fontSize: 13 }}>{d.label}</Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {d.value.toFixed(1)} / 1\n </Typography.Text>\n </div>\n <Progress percent={pct} showText={false} color={color} size=\"small\" />\n </div>\n )\n}\n\nfunction attributionItem(a: UpstreamAttribution) {\n return (\n <div\n key={`${a.url}-${a.paths.join(',')}`}\n style={{\n padding: '10px 0',\n borderBottom: '1px solid var(--color-border-1)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n <IconStorage style={{ color: 'var(--color-text-3)' }} />\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }} title={a.url}>\n {a.repo}\n </Typography.Text>\n {a.license && (\n <Tag size=\"small\" color=\"arcoblue\">\n {a.license}\n </Tag>\n )}\n {a.commit && (\n <Typography.Text code style={{ fontSize: 11 }}>\n {a.commit}\n </Typography.Text>\n )}\n </div>\n {a.paths.length > 0 && (\n <div style={{ marginTop: 4, paddingLeft: 22 }}>\n {a.paths.map((p) => (\n <Typography.Text\n key={p}\n type=\"secondary\"\n style={{ fontSize: 11, display: 'block', fontFamily: 'monospace' }}\n >\n {p}\n </Typography.Text>\n ))}\n </div>\n )}\n </div>\n )\n}\n\nexport default function DistillDetailPage() {\n const { topicId } = useParams<{ topicId: string }>()\n const navigate = useNavigate()\n const { view, loading, isError, error } = useDistillDetail(topicId)\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=\"加载蒸馏详情失败\"\n subTitle={error?.message || '该 topic 不存在或端点不可用(本地回环)'}\n extra={\n <Button type=\"primary\" onClick={() => navigate('/ai/distill')}>\n 返回蒸馏\n </Button>\n }\n />\n </div>\n )\n }\n\n const isDistilled = view.decision === 'distilled'\n // 对应 Skill 页 id:distilled-xxx 直接用;否则补前缀(详情页后续调用链到 /ai/skills/:id)。\n const skillId = view.id.startsWith('distilled-') ? view.id : `distilled-${view.id}`\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('/ai/distill')}\n >\n 返回蒸馏\n </Button>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }}>\n <IconExperiment style={{ color: 'rgb(var(--arcoblue-6))' }} />\n <Typography.Title heading={5} style={{ margin: 0, fontFamily: 'monospace' }}>\n {view.id}\n </Typography.Title>\n {view.score !== null && (\n <Tag color={view.score >= 3 ? 'green' : 'orange'} size=\"small\">\n {formatScore(view.score)}\n </Tag>\n )}\n {decisionTag(view.decision)}\n </div>\n {view.description && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginTop: 6 }}>\n {view.description}\n </Typography.Text>\n )}\n {view.attributions.length > 0 && (\n <div style={{ display: 'flex', gap: 10, flexWrap: 'wrap', marginTop: 8 }}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 上游归属:\n </Typography.Text>\n {view.attributions.map((a) => (\n <Tag key={`${a.url}-${a.paths.join(',')}`} size=\"small\" icon={<IconStorage />}>\n {a.repo}\n {a.commit ? ` @${a.commit}` : ''}\n </Tag>\n ))}\n </div>\n )}\n </Card>\n\n {/* ── B. 左右双栏 ─────────────────────────────────────────────── */}\n <Row gutter={16} align=\"start\">\n {/* 左主栏:5 维评分 + rationale + SKILL 封装预览 */}\n <Col xs={24} xl={16} style={{ marginBottom: 16 }}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <Card\n bordered\n title={<span style={{ fontSize: 14, fontWeight: 600 }}>📐 5 维 IT 通用评分</span>}\n extra={\n view.score !== null ? (\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }}>\n 合计 {formatScore(view.score)}\n </Typography.Text>\n ) : null\n }\n >\n {isDistilled ? (\n <>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {view.dims.map(dimBar)}\n </div>\n {view.rationale && (\n <div\n style={{\n marginTop: 16,\n padding: '10px 14px',\n background: 'var(--color-fill-1)',\n borderRadius: 4,\n }}\n >\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 评分依据\n </Typography.Text>\n <Typography.Paragraph style={{ margin: '4px 0 0', fontSize: 13 }}>\n {view.rationale}\n </Typography.Paragraph>\n </div>\n )}\n </>\n ) : view.decision === 'skipped' ? (\n <Empty description={`该 topic 被跳过(IT 通用分 <3,未蒸馏成 SKILL)`} />\n ) : (\n <Empty description=\"该 topic 因正文含项目锚点被拒(ProjectAnchorRejection),未产出可移植 SKILL\" />\n )}\n </Card>\n\n {isDistilled && (\n <Card\n bordered\n title={<span style={{ fontSize: 14, fontWeight: 600 }}>📦 SKILL 封装预览</span>}\n >\n {frontmatterPreview(view.frontmatter) && (\n <pre\n style={{\n margin: '0 0 12px',\n padding: '12px 14px',\n background: 'var(--color-fill-2)',\n borderRadius: 4,\n fontSize: 12,\n lineHeight: 1.6,\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n }}\n >\n {`---\\n${frontmatterPreview(view.frontmatter)}\\n---`}\n </pre>\n )}\n {view.body ? (\n <div\n style={{\n border: '1px solid var(--color-border-2)',\n borderRadius: 4,\n background: 'var(--color-fill-1)',\n padding: '12px 16px',\n maxHeight: 520,\n overflow: 'auto',\n }}\n >\n <MarkdownRenderer content={view.body} />\n </div>\n ) : (\n <Empty description=\"封装正文为空(diff 端点未返回 distilledMarkdown)\" />\n )}\n </Card>\n )}\n </div>\n </Col>\n\n {/* 右侧栏:概要 + 上游归属 + 后续调用 */}\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: 92, color: 'var(--color-text-3)' }}\n data={[\n { label: 'name', value: <Typography.Text code style={{ fontSize: 11 }}>{view.name}</Typography.Text> },\n { label: 'version', value: view.version ?? '—' },\n { label: 'IT 通用分', value: formatScore(view.score) },\n { label: '决定', value: decisionTag(view.decision) },\n { label: 'distilled_by', value: view.distilledBy ?? '—' },\n { label: 'distilled_at', value: formatIso(view.distilledAt) },\n { label: 'spawn_agent', value: view.spawnAgent ?? '—' },\n ]}\n />\n </Card>\n\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>上游归属</span>}>\n {view.attributions.length > 0 ? (\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n {view.attributions.map(attributionItem)}\n </div>\n ) : (\n <Empty description=\"无上游归属信息(distilled_from 缺省)\" />\n )}\n </Card>\n\n {isDistilled && (\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>后续调用</span>}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginBottom: 10 }}>\n 此蒸馏 SKILL 在 agent 调用与有用性自评的明细,见 Skill 调用页。\n </Typography.Text>\n <Button\n type=\"outline\"\n long\n onClick={() => navigate(`/ai/skills/${encodeURIComponent(skillId)}`)}\n >\n 查看 Skill 调用明细 <IconRight />\n </Button>\n </Card>\n )}\n </div>\n </Col>\n </Row>\n </div>\n )\n}\n"],"names":["Row","Grid","Col","decisionTag","d","m","decisionMeta","icon","IconCheckCircle","jsx","IconMinusCircle","IconCloseCircle","Tag","dimBar","pct","color","jsxs","Typography","Progress","attributionItem","a","IconStorage","p","DistillDetailPage","topicId","useParams","navigate","useNavigate","view","loading","isError","error","useDistillDetail","Card","Skeleton","Result","Button","isDistilled","skillId","IconLeft","IconExperiment","formatScore","Fragment","Empty","frontmatterPreview","MarkdownRenderer","Descriptions","formatIso","IconRight"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./react-vendor-tkvCrao7.js";import{D as y,J as a,T as i,F as c,w as g,b as d,a1 as m,N as f,f as j,O as u,a9 as T,aa as C}from"./arco-DV6xCLhr.js";import{u as I,f as b,a as S,d as v}from"./useDistill-21dZkXlT.js";import{u as z}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./query-CgCOpYWf.js";function k(s){const t=v(s.decision),o=t.icon==="check"?e.jsx(u,{}):t.icon==="minus"?e.jsx(T,{}):e.jsx(C,{});return e.jsx(d,{color:t.color,size:"small",icon:o,children:t.label})}function w(s){return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:2,padding:"8px 12px",border:"1px solid var(--color-border-2)",borderRadius:6,minWidth:150,background:s.isSkipSource?"var(--color-fill-1)":"transparent"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx(j,{style:{color:"var(--color-text-3)",fontSize:13}}),e.jsx(i.Text,{style:{fontSize:13,fontWeight:600},children:s.label}),s.isSkipSource&&e.jsx(d,{size:"small",color:"gray",style:{marginLeft:2},children:"skip"})]}),e.jsxs(i.Text,{type:"secondary",style:{fontSize:11},children:["commit"," ",s.commit?e.jsx(i.Text,{code:!0,style:{fontSize:11},children:s.commit}):"未知"]})]},s.key)}function K(){const s=z(),{view:t,loading:o,isError:x,error:l}=I();if(x)return e.jsx("div",{style:{padding:16},children:e.jsx(y,{status:"error",title:"加载蒸馏状态失败",subTitle:(l==null?void 0:l.message)||"/api/skills/distill/status 端点不可用(本地回环)"})});const p=[{title:"输出 id",dataIndex:"id",render:(n,r)=>e.jsx(i.Text,{code:!0,style:{fontSize:13},children:r.id})},{title:"IT 通用分",dataIndex:"score",width:130,sorter:(n,r)=>(n.score??-1)-(r.score??-1),render:(n,r)=>r.score===null?e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:"—"}):e.jsx(i.Text,{style:{fontWeight:600,color:r.score>=3?"rgb(var(--green-6))":"rgb(var(--orange-6))"},children:b(r.score)})},{title:"决定",dataIndex:"decision",width:110,render:(n,r)=>k(r)},{title:"时间",dataIndex:"time",width:150,render:()=>e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:S(t.lastRunAt)})},{title:"操作",dataIndex:"op",width:76,align:"right",render:(n,r)=>e.jsxs(c,{type:"text",size:"mini",onClick:h=>{h.stopPropagation(),s(`/ai/distill/${encodeURIComponent(r.id)}`)},children:["详情 ",e.jsx(f,{})]})}];return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsx(a,{bordered:!0,children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(i.Title,{heading:6,style:{margin:0},children:"蒸馏"}),e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:"上游 SKILL → IT 通用方法论蒸馏 · 5 维评分(<3 跳过、≥3 蒸馏、含项目锚点拒)"}),e.jsx("div",{style:{flex:1}}),e.jsxs(i.Text,{type:"secondary",style:{fontSize:12},children:["蒸馏"," ",e.jsx(i.Text,{style:{fontWeight:600,color:"rgb(var(--green-6))"},children:t.distilledCount})," · ","跳过"," ",e.jsx(i.Text,{style:{fontWeight:600},children:t.skippedCount})," · ","锚点拒"," ",e.jsx(i.Text,{style:{fontWeight:600,color:"rgb(var(--red-6))"},children:t.rejectedCount})]}),e.jsx(c,{type:"primary",icon:e.jsx(g,{}),onClick:()=>s("/ai/distill/run"),children:"执行蒸馏"})]})}),e.jsx(a,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"上游源"}),extra:e.jsxs(d,{color:t.cacheReady?"green":"gray",size:"small",children:["cache ",t.cacheReady?"就绪":"未就绪"," · ",t.phase]}),children:e.jsx("div",{style:{display:"flex",gap:12,flexWrap:"wrap"},children:t.upstreams.map(w)})}),e.jsx(a,{bordered:!0,style:{padding:0},children:e.jsx(m,{rowKey:"id",loading:o,data:t.rows,columns:p,pagination:t.rows.length>20?{pageSize:20,showTotal:!0}:!1,border:{wrapper:!1,cell:!1},noDataElement:e.jsx(i.Text,{type:"secondary",children:"暂无蒸馏产出记录"}),onRow:n=>({onClick:()=>s(`/ai/distill/${encodeURIComponent(n.id)}`),style:{cursor:"pointer"}})})})]})}export{K as default};
2
+ //# sourceMappingURL=DistillPage-O7BHtRN8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DistillPage-O7BHtRN8.js","sources":["../../src/pages/ai/DistillPage.tsx"],"sourcesContent":["/**\n * DistillPage — AI 资源 · 蒸馏列表 (Phase 2e, decision 29688066).\n *\n * 替换 `/ai/distill` 的占位组件。把原型「蒸馏」列表翻译成真 Arco 组件\n * (**严禁直搬原型 Tailwind CSS**):\n * - 顶部上游源状态条(3 蒸馏源 + karpathy skip 源 + commit 短哈希 + cache 状态)\n * - Arco Table:输出 id / it_universal_score(0-5) / 决定(蒸馏✓/跳过⊘/锚点拒✗)/\n * 上游源(统一在顶部条,行内标注主源)/ 时间(lastRunAt)\n * - 右上「执行蒸馏」按钮链到 /ai/distill/run(Phase 2f 已落地为真实向导)\n *\n * 数据接真实只读端点(GET /api/skills/distill/status + /review),见 useDistill。\n * 蒸馏不随时间窗变化(state 文件快照),故不受全局窗驱动。\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 {\n IconRight,\n IconCheckCircle,\n IconMinusCircle,\n IconCloseCircle,\n IconStorage,\n IconThunderbolt,\n} from '@arco-design/web-react/icon'\n\nimport { useDistill } from '../../hooks/useDistill'\nimport {\n formatScore,\n formatIso,\n decisionMeta,\n type DistillRow,\n type UpstreamSourceStatus,\n} from '../../hooks/distill-derive'\n\nfunction decisionTag(row: DistillRow) {\n const m = decisionMeta(row.decision)\n const icon =\n m.icon === 'check' ? (\n <IconCheckCircle />\n ) : m.icon === 'minus' ? (\n <IconMinusCircle />\n ) : (\n <IconCloseCircle />\n )\n return (\n <Tag color={m.color} size=\"small\" icon={icon}>\n {m.label}\n </Tag>\n )\n}\n\nfunction upstreamChip(u: UpstreamSourceStatus) {\n return (\n <div\n key={u.key}\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: '8px 12px',\n border: '1px solid var(--color-border-2)',\n borderRadius: 6,\n minWidth: 150,\n background: u.isSkipSource ? 'var(--color-fill-1)' : 'transparent',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <IconStorage style={{ color: 'var(--color-text-3)', fontSize: 13 }} />\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }}>\n {u.label}\n </Typography.Text>\n {u.isSkipSource && (\n <Tag size=\"small\" color=\"gray\" style={{ marginLeft: 2 }}>\n skip\n </Tag>\n )}\n </div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n commit{' '}\n {u.commit ? (\n <Typography.Text code style={{ fontSize: 11 }}>\n {u.commit}\n </Typography.Text>\n ) : (\n '未知'\n )}\n </Typography.Text>\n </div>\n )\n}\n\nexport default function DistillPage() {\n const navigate = useNavigate()\n const { view, loading, isError, error } = useDistill()\n\n if (isError) {\n return (\n <div style={{ padding: 16 }}>\n <Result\n status=\"error\"\n title=\"加载蒸馏状态失败\"\n subTitle={error?.message || '/api/skills/distill/status 端点不可用(本地回环)'}\n />\n </div>\n )\n }\n\n const columns = [\n {\n title: '输出 id',\n dataIndex: 'id',\n render: (_: unknown, row: DistillRow) => (\n <Typography.Text code style={{ fontSize: 13 }}>\n {row.id}\n </Typography.Text>\n ),\n },\n {\n title: 'IT 通用分',\n dataIndex: 'score',\n width: 130,\n sorter: (a: DistillRow, b: DistillRow) => (a.score ?? -1) - (b.score ?? -1),\n render: (_: unknown, row: DistillRow) =>\n row.score === null ? (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n —\n </Typography.Text>\n ) : (\n <Typography.Text\n style={{\n fontWeight: 600,\n color:\n row.score >= 3\n ? 'rgb(var(--green-6))'\n : 'rgb(var(--orange-6))',\n }}\n >\n {formatScore(row.score)}\n </Typography.Text>\n ),\n },\n {\n title: '决定',\n dataIndex: 'decision',\n width: 110,\n render: (_: unknown, row: DistillRow) => decisionTag(row),\n },\n {\n title: '时间',\n dataIndex: 'time',\n width: 150,\n render: () => (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {formatIso(view.lastRunAt)}\n </Typography.Text>\n ),\n },\n {\n title: '操作',\n dataIndex: 'op',\n width: 76,\n align: 'right' as const,\n render: (_: unknown, row: DistillRow) => (\n <Button\n type=\"text\"\n size=\"mini\"\n onClick={(e) => {\n e.stopPropagation()\n navigate(`/ai/distill/${encodeURIComponent(row.id)}`)\n }}\n >\n 详情 <IconRight />\n </Button>\n ),\n },\n ]\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 16 }}>\n {/* ── 页头 + 执行蒸馏入口 ───────────────────────────────────────── */}\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <Typography.Title heading={6} style={{ margin: 0 }}>\n 蒸馏\n </Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 上游 SKILL → IT 通用方法论蒸馏 · 5 维评分(&lt;3 跳过、≥3 蒸馏、含项目锚点拒)\n </Typography.Text>\n <div style={{ flex: 1 }} />\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 蒸馏{' '}\n <Typography.Text style={{ fontWeight: 600, color: 'rgb(var(--green-6))' }}>\n {view.distilledCount}\n </Typography.Text>\n {' · '}跳过{' '}\n <Typography.Text style={{ fontWeight: 600 }}>{view.skippedCount}</Typography.Text>\n {' · '}锚点拒{' '}\n <Typography.Text style={{ fontWeight: 600, color: 'rgb(var(--red-6))' }}>\n {view.rejectedCount}\n </Typography.Text>\n </Typography.Text>\n <Button\n type=\"primary\"\n icon={<IconThunderbolt />}\n onClick={() => navigate('/ai/distill/run')}\n >\n 执行蒸馏\n </Button>\n </div>\n </Card>\n\n {/* ── 上游源状态条 ─────────────────────────────────────────────── */}\n <Card\n bordered\n title={<span style={{ fontSize: 14, fontWeight: 600 }}>上游源</span>}\n extra={\n <Tag color={view.cacheReady ? 'green' : 'gray'} size=\"small\">\n cache {view.cacheReady ? '就绪' : '未就绪'} · {view.phase}\n </Tag>\n }\n >\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {view.upstreams.map(upstreamChip)}\n </div>\n </Card>\n\n {/* ── 蒸馏产出列表 ─────────────────────────────────────────────── */}\n <Card bordered style={{ padding: 0 }}>\n <Table<DistillRow>\n rowKey=\"id\"\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\">暂无蒸馏产出记录</Typography.Text>\n }\n onRow={(row) => ({\n onClick: () => navigate(`/ai/distill/${encodeURIComponent(row.id)}`),\n style: { cursor: 'pointer' },\n })}\n />\n </Card>\n </div>\n )\n}\n"],"names":["decisionTag","row","m","decisionMeta","icon","IconCheckCircle","jsx","IconMinusCircle","IconCloseCircle","Tag","upstreamChip","u","jsxs","IconStorage","Typography","DistillPage","navigate","useNavigate","view","loading","isError","error","useDistill","Result","columns","_","a","b","formatScore","formatIso","Button","e","IconRight","Card","IconThunderbolt","Table"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as p,j as e}from"./react-vendor-tkvCrao7.js";import{J as E,F as b,X as K,T as u,b as m,V as F,ac as T,S as P,ad as Q,i as M,ae as Y,af as W,ag as H,w as V,O as U,D as L,f as X,aa as G}from"./arco-DV6xCLhr.js";import{a as B,u as Z,c as ee}from"./query-CgCOpYWf.js";import{a as N}from"./auth-Bnf8ZcqN.js";import{u as te}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";const ne=["connected","start","progress","phase-changed","skill-distilled","done","cancelled","error"],O={"obra-superpowers":"obra/superpowers","anthropics-skills":"anthropics/skills","affaan-m-ecc":"affaan-m/ECC","multica-karpathy":"multica/karpathy"},_=new Set(["multica-karpathy"]);function D(t){if(!t||typeof t!="string")return null;const n=t.trim();return!n||n==="unknown"?null:n.slice(0,7)}function se(t,n){var c;const r=(t==null?void 0:t.fetchResults)??[];if(r.length>0)return r.map(d=>{var x,f;const h=((x=d.upstream)==null?void 0:x.id)??"unknown";return{key:h,label:O[h]??h,status:d.status??null,commit:D(d.commit),isSkipSource:((f=d.upstream)==null?void 0:f.skip)===!0||_.has(h),error:d.error??null}});const i=((c=n==null?void 0:n.state)==null?void 0:c.upstreamCommits)??{};return(Object.keys(i).length>0?Object.keys(i):Object.keys(O)).map(d=>({key:d,label:O[d]??d,status:null,commit:D(i[d]),isSkipSource:_.has(d),error:null}))}function re(t){if(t.length===0)return!1;const n=t.filter(r=>!r.isSkipSource);return n.length===0?!1:n.every(r=>r.error===null&&(r.commit!==null||r.status!==null))}function ie(t){return typeof t!="number"||!Number.isFinite(t)?5:Math.min(50,Math.max(1,Math.floor(t)))}const le=/^[a-z0-9][a-z0-9-]*$/;function oe(t){if(!Array.isArray(t))return[];const n=new Set,r=[];for(const i of t)typeof i=="string"&&le.test(i)&&(n.has(i)||(n.add(i),r.push(i)));return r}function J(t){const n=oe(t.topicIds),r={};return n.length>0?r.topicIds=n:r.topicCap=ie(t.topicCap),t.force&&(r.force=!0),r}function ce(t){return JSON.stringify(J(t),null,2)}function ae(t){if(!t)return null;const n=t.match(/chars=(\d+)/);return n?parseInt(n[1],10):null}const de=new Set(["done","cancelled","error"]);function ue(t){const n=new Map,r=[];let i=!1,a="idle",c=null,d=null,h=null,x=null,f=null,g=null,s=!1;const S=o=>{let C=n.get(o);return C||(C={topicId:o,charCount:null,distilled:!1},n.set(o,C),r.push(o)),C};for(const o of t){switch(o.type){case"connected":i=!0,a==="idle"&&(a="connecting");break;case"start":case"phase-changed":s||(a="running");break;case"progress":{if(s||(a="running"),o.topicId){const C=S(o.topicId),w=ae(o.message);w!=null&&(C.charCount=w),c=o.topicId}break}case"skill-distilled":{s||(a="running"),o.topicId&&(S(o.topicId).distilled=!0);break}case"done":a="done",s=!0,d=o.completed??null,h=o.skipped??null,x=o.distilledCount??null,f=o.message??null,c=null;break;case"cancelled":a="cancelled",s=!0,d=o.completed??null,x=o.distilledCount??null,f=o.message??"已取消",c=null;break;case"error":a="error",s=!0,g=o.errorMessage??o.message??"未知错误",f=g,c=null;break}de.has(o.type)&&(s=!0)}return{phase:a,connected:i,topics:r.map(o=>n.get(o)),currentTopicId:c,completed:d,skipped:h,distilledCount:x,terminalMessage:f,isTerminal:s,errorMessage:g,log:t}}function pe(t){if(!t||t.isBusy!==!0)return null;const n=t.currentRunId;return typeof n!="string"||n.length===0?null:n}const q=2;function fe(t){switch(t){case"connected":return{color:"gray",label:"建连"};case"start":return{color:"arcoblue",label:"启动"};case"progress":return{color:"gray",label:"进度"};case"phase-changed":return{color:"blue",label:"阶段"};case"skill-distilled":return{color:"green",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)}}}function A(t){if(!t)return"蒸馏失败,未知错误";const n=t.trim();return n==="distill_in_progress"||n.includes("409")?"已有蒸馏在进行中,请稍后再试":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}async function he(){const t=await fetch("/api/skills/distill/status");if(!t.ok)throw new Error(`status → ${t.status}`);return t.json()}async function ye(t){const n=await N("/api/skills/distill/init",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({skipFetch:t})});if(!n.ok)throw new Error(`init → ${n.status}`);return n.json()}async function xe(t){const n=await N("/api/skills/distill/run",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(J(t))});if(n.status===409)throw new Error("distill_in_progress");if(!n.ok)throw new Error(`run → ${n.status}`);return n.json()}async function me(t){const n=await N(`/api/skills/distill/cancel/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(!n.ok)throw new Error(`cancel → ${n.status}`)}function ge(){const t=B(),n=Z({queryKey:["distill-status"],queryFn:he,refetchInterval:i=>{var a;return(a=i.state.data)!=null&&a.isBusy?5e3:6e4}}),r=ee({mutationFn:i=>ye(i),onSuccess:()=>{t.invalidateQueries({queryKey:["distill-status"]})}});return{status:n.data,loading:n.isLoading,isError:n.isError,refetch:()=>void n.refetch(),initResult:r.data,initPending:r.isPending,initError:r.error??null,runInit:(i=!1)=>r.mutate(i)}}function je(){const t=B(),[n,r]=p.useState([]),[i,a]=p.useState(null),[c,d]=p.useState(!1),[h,x]=p.useState(null),f=p.useRef(null),g=p.useCallback(()=>{f.current&&(f.current.close(),f.current=null)},[]);p.useEffect(()=>g,[g]);const s=p.useCallback(v=>{g();const j=new EventSource(`/api/skills/distill/run/${encodeURIComponent(v)}/stream`);f.current=j;const z=y=>k=>{let l={};try{l=JSON.parse(k.data||"{}")}catch{}const I={...l,type:y};r(R=>[...R,I]),(y==="done"||y==="error"||y==="cancelled")&&(j.close(),f.current=null,t.invalidateQueries({queryKey:["distill-status"]}),t.invalidateQueries({queryKey:["distill-review"]}))};for(const y of ne)j.addEventListener(y,z(y));j.onerror=()=>{r(y=>{const k=y[y.length-1];return k&&(k.type==="done"||k.type==="error"||k.type==="cancelled")?y:[...y,{type:"error",errorMessage:"SSE 连接中断(daemon 不可达或已断流)"}]})}},[g,t]),S=p.useCallback(async v=>{x(null),d(!0),r([]);try{const{runId:j}=await xe(v);a(j),s(j)}catch(j){x(j)}finally{d(!1)}},[s]),o=p.useCallback(v=>{i===v&&f.current||(x(null),r([]),a(v),s(v))},[i,s]),C=p.useCallback(async()=>{if(i)try{await me(i)}catch{}},[i]),w=p.useCallback(()=>{g(),r([]),a(null),x(null)},[g]);return{view:ue(n),runId:i,submitting:c,submitError:h,start:S,reconnect:o,cancel:C,reset:w}}const $=F.Step;function be(t){return t.error?e.jsx(m,{color:"red",size:"small",icon:e.jsx(G,{}),children:"失败"}):t.status==="cloned"||t.status==="updated"?e.jsx(m,{color:"green",size:"small",icon:e.jsx(U,{}),children:t.status==="cloned"?"已克隆":"已更新"}):t.status==="cached"?e.jsx(m,{color:"cyan",size:"small",children:"cache"}):t.status==="skipped"||t.isSkipSource?e.jsx(m,{color:"gray",size:"small",children:"skip"}):e.jsx(m,{color:"gray",size:"small",children:t.commit?"就绪":"未拉取"})}function Se({row:t}){return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:4,padding:"10px 14px",border:"1px solid var(--color-border-2)",borderRadius:6,minWidth:170,background:t.isSkipSource?"var(--color-fill-1)":"transparent"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6},children:[e.jsx(X,{style:{color:"var(--color-text-3)",fontSize:13}}),e.jsx(u.Text,{style:{fontSize:13,fontWeight:600},children:t.label}),e.jsx("div",{style:{flex:1}}),be(t)]}),e.jsxs(u.Text,{type:"secondary",style:{fontSize:11},children:["commit"," ",t.commit?e.jsx(u.Text,{code:!0,style:{fontSize:11},children:t.commit}):"未知"]}),t.error&&e.jsx(u.Text,{type:"error",style:{fontSize:11},children:t.error})]})}function ze(){var k;const t=te(),[n,r]=p.useState(0),[i,a]=p.useState({topicCap:5,topicIds:[],force:!1}),{status:c,loading:d,initResult:h,initPending:x,initError:f,runInit:g}=ge(),s=je(),S=pe(c),o=p.useRef(!1);p.useEffect(()=>{o.current||S&&(s.runId||(o.current=!0,r(q),s.reconnect(S)))},[S,s]);const C=p.useMemo(()=>se(h,c),[h,c]),w=re(C),v=(c==null?void 0:c.isBusy)===!0,j=(c==null?void 0:c.claudeCliAvailable)!==!1,z=((k=c==null?void 0:c.state)==null?void 0:k.completed)??[],y=p.useMemo(()=>ce(i),[i]);return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsxs(E,{bordered:!0,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(b,{type:"text",icon:e.jsx(K,{}),onClick:()=>t("/ai/distill"),style:{paddingLeft:0},children:"返回蒸馏列表"}),e.jsx(u.Title,{heading:6,style:{margin:0},children:"执行蒸馏向导"}),e.jsx(u.Text,{type:"secondary",style:{fontSize:12},children:"上游 SKILL → IT 通用方法论蒸馏(spawn claude -p · 每 topic ~10min 真烧 LLM)"}),e.jsx("div",{style:{flex:1}}),v&&S&&e.jsx(m,{color:"arcoblue",size:"small",style:{cursor:"pointer"},onClick:()=>{o.current=!0,r(q),s.reconnect(S)},title:"点击重连查看进度",children:"另有蒸馏进行中 · 点击查看进度"}),v&&!S&&e.jsx(m,{color:"arcoblue",size:"small",children:"另有蒸馏进行中"})]}),e.jsxs(F,{current:n,style:{marginTop:16},size:"small",children:[e.jsx($,{title:"上游就绪",description:"拉取/克隆 3 上游到 cache"}),e.jsx($,{title:"选范围",description:"topicCap / topicIds / force"}),e.jsx($,{title:"运行与产出",description:"连 SSE 逐 topic 揭示"})]})]}),!j&&e.jsx(T,{type:"warning",content:"未检测到 claude CLI(status.claudeCliAvailable=false)——蒸馏需要本机已登录的 claude CLI,请先安装/登录后再执行。"}),n===0&&e.jsx(E,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"① 上游就绪"}),extra:e.jsx(b,{type:"outline",size:"small",icon:e.jsx(Q,{}),loading:x,onClick:()=>g(!1),children:"拉取上游 (init)"}),children:d?e.jsx(P,{}):e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{display:"flex",gap:12,flexWrap:"wrap"},children:C.map(l=>e.jsx(Se,{row:l},l.key))}),f&&e.jsx(T,{style:{marginTop:12},type:"error",content:`拉取上游失败:${f.message}`}),h&&e.jsx(T,{style:{marginTop:12},type:"success",content:`上游已就绪(NOTICE ${h.noticeWritten?"已写":"未写"} · catalog ${h.catalogWritten?"已写":"未写"})。`}),e.jsx("div",{style:{marginTop:16,display:"flex",justifyContent:"flex-end"},children:e.jsx(b,{type:"primary",disabled:!w,onClick:()=>r(1),children:"下一步:选范围"})}),!w&&e.jsx(u.Text,{type:"secondary",style:{fontSize:12},children:"先点「拉取上游 (init)」把 3 上游克隆/更新到 cache,就绪后才能进入下一步。"})]})}),n===1&&e.jsx(E,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"② 选 topic 范围"}),children:e.jsxs(M,{direction:"vertical",size:"large",style:{width:"100%"},children:[e.jsxs("div",{children:[e.jsx(u.Text,{style:{fontSize:13,fontWeight:600},children:"topicCap(1-50,默认 5)"}),e.jsxs("div",{style:{marginTop:6,display:"flex",alignItems:"center",gap:8},children:[e.jsx(Y,{min:1,max:50,value:i.topicCap,onChange:l=>a(I=>({...I,topicCap:typeof l=="number"?l:5})),style:{width:120},disabled:i.topicIds.length>0}),e.jsx(u.Text,{type:"secondary",style:{fontSize:12},children:"最多蒸馏 N 个 topic(勾选具体 topicIds 时此项被忽略)。建议自测设 1。"})]})]}),e.jsxs("div",{children:[e.jsx(u.Text,{style:{fontSize:13,fontWeight:600},children:"指定 topicIds(可选;勾选后只跑这些)"}),z.length>0?e.jsx("div",{style:{marginTop:6},children:e.jsx(W.Group,{value:i.topicIds,onChange:l=>a(I=>({...I,topicIds:l})),children:e.jsx("div",{style:{display:"flex",gap:12,flexWrap:"wrap"},children:z.map(l=>e.jsx(W,{value:l,children:e.jsx(u.Text,{code:!0,style:{fontSize:12},children:l})},l))})})}):e.jsx(u.Text,{type:"secondary",style:{fontSize:12,display:"block",marginTop:6},children:"暂无已知 topic(state.completed 为空)——按 topicCap 自动选候选。"})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx(H,{checked:i.force,onChange:l=>a(I=>({...I,force:l}))}),e.jsx(u.Text,{style:{fontSize:13},children:"force —— 强制重蒸(无视 completedSet / topicCap 跳过已完成)"})]}),e.jsxs("div",{children:[e.jsx(u.Text,{type:"secondary",style:{fontSize:12},children:"将发起的 POST /api/skills/distill/run 请求体:"}),e.jsx("pre",{style:{marginTop:6,padding:12,background:"var(--color-fill-1)",borderRadius:4,fontSize:12,fontFamily:"monospace",overflowX:"auto"},children:y})]}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between"},children:[e.jsx(b,{onClick:()=>r(0),children:"上一步"}),e.jsx(b,{type:"primary",onClick:()=>r(2),children:"下一步:运行"})]})]})}),n===2&&e.jsxs(E,{bordered:!0,title:e.jsx("span",{style:{fontSize:14,fontWeight:600},children:"③ 运行与产出"}),children:[!s.runId&&e.jsxs(M,{direction:"vertical",size:"medium",style:{width:"100%"},children:[e.jsx(T,{type:"warning",content:"点「执行蒸馏」将真 spawn claude -p,每 topic ~10min 真烧 LLM。确认范围(见上一步 JSON 预览)后再执行。"}),s.submitError&&e.jsx(T,{type:"error",content:A(s.submitError.message)}),e.jsxs("div",{style:{display:"flex",justifyContent:"space-between"},children:[e.jsx(b,{onClick:()=>r(1),children:"上一步"}),e.jsx(b,{type:"primary",icon:e.jsx(V,{}),loading:s.submitting,disabled:v||!j,onClick:()=>void s.start(i),children:"执行蒸馏"})]})]}),s.runId&&e.jsxs(M,{direction:"vertical",size:"medium",style:{width:"100%"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(m,{size:"small",style:{fontFamily:"monospace"},children:s.runId}),e.jsx(m,{color:s.view.phase==="done"?"green":s.view.phase==="error"?"red":s.view.phase==="cancelled"?"orange":"arcoblue",size:"small",children:s.view.phase}),s.view.currentTopicId&&e.jsxs(m,{color:"arcoblue",size:"small",children:["当前: ",s.view.currentTopicId]}),e.jsx("div",{style:{flex:1}}),!s.view.isTerminal&&e.jsx(b,{size:"small",status:"danger",onClick:()=>void s.cancel(),children:"取消"})]}),!s.view.isTerminal&&!s.view.connected&&e.jsx(P,{tip:"连接 SSE 流…"}),s.view.topics.length>0&&e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:s.view.topics.map(l=>e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:10,padding:"6px 10px",border:"1px solid var(--color-border-2)",borderRadius:4},children:[e.jsx(u.Text,{code:!0,style:{fontSize:12},children:l.topicId}),e.jsx("div",{style:{flex:1}}),l.charCount!=null&&e.jsxs(u.Text,{type:"secondary",style:{fontSize:11},children:[l.charCount.toLocaleString()," chars"]}),l.distilled?e.jsx(m,{color:"green",size:"small",icon:e.jsx(U,{}),children:"蒸馏✓"}):e.jsx(m,{color:"arcoblue",size:"small",children:"运行中"})]},l.topicId))}),s.view.phase==="done"&&e.jsx(L,{status:"success",title:"蒸馏完成",subTitle:s.view.terminalMessage??`完成 ${s.view.completed??"?"} · 蒸馏 ${s.view.distilledCount??"?"} · 跳过 ${s.view.skipped??"?"}`,extra:[e.jsx(b,{type:"primary",onClick:()=>t("/ai/distill"),children:"查看产出(带 D1-D5)"},"list"),e.jsx(b,{onClick:s.reset,children:"再跑一次"},"again")]}),s.view.phase==="cancelled"&&e.jsx(L,{status:"warning",title:"已取消",subTitle:s.view.terminalMessage??"蒸馏已被取消",extra:[e.jsx(b,{type:"primary",onClick:s.reset,children:"重新执行"},"again")]}),s.view.phase==="error"&&e.jsx(L,{status:"error",title:"蒸馏出错",subTitle:A(s.view.errorMessage??void 0),extra:[e.jsx(b,{type:"primary",onClick:s.reset,children:"重试"},"again")]}),e.jsxs("div",{children:[e.jsxs(u.Text,{type:"secondary",style:{fontSize:12},children:["SSE 事件流(",s.view.log.length,"):"]}),e.jsxs("div",{style:{marginTop:6,maxHeight:220,overflowY:"auto",fontSize:12,fontFamily:"monospace",background:"var(--color-fill-1)",padding:8,borderRadius:4},children:[s.view.log.length===0&&e.jsx(u.Text,{type:"secondary",children:"等待第一个 SSE 事件…"}),s.view.log.map((l,I)=>{const R=fe(l.type);return e.jsxs("div",{style:{display:"flex",gap:8,lineHeight:"20px"},children:[e.jsx(m,{color:R.color,size:"small",style:{minWidth:56,textAlign:"center"},children:R.label}),e.jsxs("span",{style:{flex:1},children:[l.topicId?`${l.topicId} `:"",l.message??"",l.errorMessage?` — ${l.errorMessage}`:"",l.completed!=null?` (completed=${l.completed})`:""]})]},I)})]})]})]})]})]})}export{ze as default};
2
+ //# sourceMappingURL=DistillRunPage-D1JuRWWr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DistillRunPage-D1JuRWWr.js","sources":["../../src/hooks/distill-run-derive.ts","../../src/hooks/useDistillRun.ts","../../src/pages/ai/DistillRunPage.tsx"],"sourcesContent":["/**\n * distill-run-derive — 执行蒸馏向导 (Phase 2f, decision 29688066) 纯派生层。\n *\n * 项目前端单测跑在 environment:'node'(无 jsdom / RTL,见 workplace-data.test.ts\n * 注解),故所有「SSE 事件流 → 向导视图模型」「向导参数 → run 请求体」「init 结果 →\n * 上游就绪条」的计算都抽进本纯函数模块,页面组件 / hook 只渲染派生结果。这样 SSE\n * 解析逻辑可喂模拟事件流单测,无需真正触发 10min 全量蒸馏。\n *\n * ⚠️ 真实端点契约(对 localhost:3721 实抓 + 读 src/web/services/distill-manager.ts\n * 源码确认,严禁造服务端不发的字段):\n *\n * POST /api/skills/distill/init\n * body { skipFetch?: boolean }\n * → { fetchResults: [{ upstream:{id,url,license,skip?},\n * status:'cloned'|'updated'|'cached'|'skipped'|'error',\n * path, commit?, error? }],\n * noticeWritten: boolean, catalogWritten: boolean }\n *\n * POST /api/skills/distill/run\n * body { topicCap?:1-50, topicIds?:string[], outputIds?:string[],\n * skip?:string[], force?:boolean, regenerateAll?:boolean }\n * → 202 { runId, streamUrl } | 409 { error:'distill_in_progress' }\n *\n * GET /api/skills/distill/run/:runId/stream (SSE,每条 `event: <type>\\ndata:<JSON>\\n\\n`)\n * 真实事件类型(distill-manager.ts DistillEventType)+ payload 字段:\n * connected data: {} (SSE 建连)\n * start { type, at, message, runId }\n * phase-changed { type, at, phase:'running', message, runId }\n * progress { type, at, topicId?, message:\"chars=N\"?, runId } ← 逐 topic 字符进度\n * skill-distilled{ type, at, topicId, runId } ← 该 topic 蒸馏成 SKILL\n * done { type, at, message, phase, completed, skipped,\n * distilledCount, pausedAtGate:false, runId }\n * cancelled { type, at, message, phase?, completed?, distilledCount?, runId }\n * error { type, at, errorMessage, runId }\n *\n * ⚠️ 重要口径:SSE 流里**没有** per-topic 的 D1-D5 评分 / 三态决定事件——\n * distill-manager 只发粗粒度进度(progress/skill-distilled)。D1-D5 五维分 + 三态\n * 决定(蒸馏≥3 / 跳过<3 / 锚点拒)是 run **完成后**从 GET /review + /review/:id/diff\n * 端点读出(见 distill-derive.ts)。故向导 Step 3 的「逐 topic 出 D1-D5 + 封装预览」\n * 是:SSE 实时揭示 spawn / 进度 / 蒸馏完成,done 后回列表(Phase 2e /ai/distill)即可\n * 看到带 D1-D5 的新记录;本向导在 done 态把 completed/distilled/skipped 计数 +「查看\n * 产出」链接呈现,不在流里伪造服务端从不发的 D1-D5 事件(避免 Phase 2b 血泪坑)。\n */\n\n// ─── endpoint response shapes (严格按真实 payload) ──────────────────────────────\n\n/** POST /api/skills/distill/init 的 fetchResult.upstream。 */\nexport interface InitUpstream {\n id: string\n url?: string\n license?: string\n skip?: boolean\n sparsePaths?: string[]\n}\n\n/** POST /api/skills/distill/init 的单条 fetchResult。 */\nexport interface InitFetchResult {\n upstream: InitUpstream\n status: 'cloned' | 'updated' | 'cached' | 'skipped' | 'error' | string\n path?: string\n commit?: string\n error?: string\n}\n\n/** POST /api/skills/distill/init 完整响应。 */\nexport interface InitResp {\n fetchResults?: InitFetchResult[]\n noticeWritten?: boolean\n catalogWritten?: boolean\n}\n\n/** GET /api/skills/distill/status 完整响应(向导只读 isBusy / state / claudeCli)。 */\nexport interface RunStatusResp {\n stateFileExists?: boolean\n state?: {\n phase?: string\n upstreamCommits?: Record<string, string>\n completed?: string[]\n skipped?: string[]\n rejected?: string[]\n } | null\n isBusy?: boolean\n currentRunId?: string | null\n lastRunId?: string | null\n claudeCliAvailable?: boolean\n claudeCliPath?: string | null\n}\n\n/** SSE 事件类型(与 distill-manager.ts DistillEventType 严格一致)。 */\nexport type DistillRunEventType =\n | 'connected'\n | 'start'\n | 'progress'\n | 'phase-changed'\n | 'skill-distilled'\n | 'done'\n | 'cancelled'\n | 'error'\n\n/** 单条 SSE 事件(data JSON 解析后 + type)。 */\nexport interface DistillRunEvent {\n type: DistillRunEventType\n at?: string\n message?: string\n phase?: string\n completed?: number\n pending?: number\n skipped?: number\n topicId?: string\n distilledCount?: number\n pausedAtGate?: boolean\n errorMessage?: string\n runId?: string\n}\n\nexport const DISTILL_RUN_EVENT_TYPES: DistillRunEventType[] = [\n 'connected',\n 'start',\n 'progress',\n 'phase-changed',\n 'skill-distilled',\n 'done',\n 'cancelled',\n 'error',\n]\n\n// ─── Step 1:上游就绪 ────────────────────────────────────────────────────────\n\n/** 已知 3 蒸馏源 + 1 skip 源(与 distill-derive UPSTREAM_LABELS 对齐)。 */\nconst UPSTREAM_LABELS: Record<string, string> = {\n 'obra-superpowers': 'obra/superpowers',\n 'anthropics-skills': 'anthropics/skills',\n 'affaan-m-ecc': 'affaan-m/ECC',\n 'multica-karpathy': 'multica/karpathy',\n}\n\nconst SKIP_SOURCE_KEYS = new Set(['multica-karpathy'])\n\n/** 上游就绪条单条(init 结果 / status.upstreamCommits 派生)。 */\nexport interface UpstreamReadyRow {\n key: string\n label: string\n /** init 后的 fetch 状态;仅 status 时为 null。 */\n status: InitFetchResult['status'] | null\n /** 短哈希;unknown / 缺省 → null。 */\n commit: string | null\n isSkipSource: boolean\n error: string | null\n}\n\n/** \"unknown\" / 空 / 非字符串 → null;否则截短到 7 位短哈希。 */\nexport function shortCommit(commit: string | null | undefined): string | null {\n if (!commit || typeof commit !== 'string') return null\n const c = commit.trim()\n if (!c || c === 'unknown') return null\n return c.slice(0, 7)\n}\n\n/**\n * 装配上游就绪条。优先用 init 的 fetchResults(含 status + commit),缺则回退\n * status.upstreamCommits(只有 commit)。两者都缺时用已知 4 源占位(status=null)。\n */\nexport function buildUpstreamReadyRows(\n init: InitResp | undefined,\n status: RunStatusResp | undefined,\n): UpstreamReadyRow[] {\n const results = init?.fetchResults ?? []\n if (results.length > 0) {\n return results.map((r) => {\n const key = r.upstream?.id ?? 'unknown'\n return {\n key,\n label: UPSTREAM_LABELS[key] ?? key,\n status: r.status ?? null,\n commit: shortCommit(r.commit),\n isSkipSource: r.upstream?.skip === true || SKIP_SOURCE_KEYS.has(key),\n error: r.error ?? null,\n }\n })\n }\n\n const commits = status?.state?.upstreamCommits ?? {}\n const keys =\n Object.keys(commits).length > 0 ? Object.keys(commits) : Object.keys(UPSTREAM_LABELS)\n return keys.map((key) => ({\n key,\n label: UPSTREAM_LABELS[key] ?? key,\n status: null,\n commit: shortCommit(commits[key]),\n isSkipSource: SKIP_SOURCE_KEYS.has(key),\n error: null,\n }))\n}\n\n/** init 结果是否「就绪」(至少一条非 error,且 NOTICE/catalog 已写 或 已有 commit)。 */\nexport function isUpstreamReady(rows: UpstreamReadyRow[]): boolean {\n if (rows.length === 0) return false\n const nonSkip = rows.filter((r) => !r.isSkipSource)\n if (nonSkip.length === 0) return false\n // 全部非 skip 源要么有 commit、要么 fetch 状态非 error。\n return nonSkip.every((r) => r.error === null && (r.commit !== null || r.status !== null))\n}\n\n// ─── Step 2:run 请求预览 ────────────────────────────────────────────────────\n\n/** 向导 Step 2 表单状态。 */\nexport interface RunFormState {\n topicCap: number\n topicIds: string[]\n force: boolean\n}\n\n/** POST /run 请求体(只放服务端真实接受的字段)。 */\nexport interface RunRequestBody {\n topicCap?: number\n topicIds?: string[]\n force?: boolean\n}\n\n/** topicCap 夹到 [1,50],非数值回退 5(与后端 parseInt 兜底一致)。 */\nexport function clampTopicCap(n: number | null | undefined): number {\n if (typeof n !== 'number' || !Number.isFinite(n)) return 5\n return Math.min(50, Math.max(1, Math.floor(n)))\n}\n\n/** topicId 白名单正则(与后端 TOPIC_ID_RE 一致:小写字母数字 + 连字符,首字符非连字符)。 */\nconst TOPIC_ID_RE = /^[a-z0-9][a-z0-9-]*$/\n\n/** 过滤非法 topicId(与后端 filter 一致),去重。 */\nexport function sanitizeTopicIds(ids: string[] | null | undefined): string[] {\n if (!Array.isArray(ids)) return []\n const seen = new Set<string>()\n const out: string[] = []\n for (const id of ids) {\n if (typeof id !== 'string') continue\n if (!TOPIC_ID_RE.test(id)) continue\n if (seen.has(id)) continue\n seen.add(id)\n out.push(id)\n }\n return out\n}\n\n/**\n * 表单 → run 请求体。topicIds 非空时省略 topicCap(后端按 topicIds 跑),否则带 topicCap。\n * force 仅在 true 时带(避免无意义字段)。这是 Step 2「实时 JSON 预览」的数据源。\n */\nexport function buildRunRequest(form: RunFormState): RunRequestBody {\n const topicIds = sanitizeTopicIds(form.topicIds)\n const body: RunRequestBody = {}\n if (topicIds.length > 0) {\n body.topicIds = topicIds\n } else {\n body.topicCap = clampTopicCap(form.topicCap)\n }\n if (form.force) body.force = true\n return body\n}\n\n/** run 请求体 → 美化 JSON 字符串(Step 2 预览块)。 */\nexport function previewRunRequest(form: RunFormState): string {\n return JSON.stringify(buildRunRequest(form), null, 2)\n}\n\n// ─── Step 3:SSE 事件流 → 向导运行视图 ───────────────────────────────────────\n\nexport type RunPhase = 'idle' | 'connecting' | 'running' | 'done' | 'cancelled' | 'error'\n\n/** 单 topic 的运行态(从 progress / skill-distilled 事件累积)。 */\nexport interface TopicProgressRow {\n topicId: string\n /** 最近一次 progress 的字符数(spawn claude -p 流式产出)。 */\n charCount: number | null\n /** 已收到 skill-distilled 事件 → 蒸馏完成。 */\n distilled: boolean\n}\n\n/** Step 3 运行视图模型(喂模拟事件流可单测)。 */\nexport interface RunView {\n phase: RunPhase\n /** 已建 SSE 连接(收到 connected 事件)。 */\n connected: boolean\n /** 逐 topic 进度行(按首次出现顺序稳定)。 */\n topics: TopicProgressRow[]\n /** 当前正在处理的 topicId(最近 progress 事件)。 */\n currentTopicId: string | null\n /** done 事件携带的计数。 */\n completed: number | null\n skipped: number | null\n distilledCount: number | null\n /** 终态消息(done.message / cancelled.message / error.errorMessage)。 */\n terminalMessage: string | null\n /** 是否处于终态(done / cancelled / error)。 */\n isTerminal: boolean\n /** error 态详情。 */\n errorMessage: string | null\n /** 原始事件日志(UI 滚动日志区)。 */\n log: DistillRunEvent[]\n}\n\n/** 解析 progress.message 的 \"chars=N\"。 */\nexport function parseCharCount(message: string | undefined): number | null {\n if (!message) return null\n const m = message.match(/chars=(\\d+)/)\n return m ? parseInt(m[1], 10) : null\n}\n\nconst TERMINAL_TYPES = new Set<DistillRunEventType>(['done', 'cancelled', 'error'])\n\n/**\n * 把一串 SSE 事件 reduce 成 Step 3 运行视图。**这是本 Phase 的核心纯函数**,\n * 喂模拟事件流即可断言向导渲染,无需真正触发 10min 全量蒸馏。\n *\n * 状态机:\n * [] → idle\n * [connected] → connecting(已建连,等 start)\n * [...,start|phase-changed] → running\n * progress(topicId) → 累积 topic.charCount + currentTopicId\n * skill-distilled(topicId) → 标记该 topic.distilled\n * done → done(含 completed/skipped/distilledCount)\n * cancelled → cancelled\n * error → error(errorMessage)\n */\nexport function reduceDistillRunEvents(events: DistillRunEvent[]): RunView {\n const topicMap = new Map<string, TopicProgressRow>()\n const order: string[] = []\n let connected = false\n let phase: RunPhase = 'idle'\n let currentTopicId: string | null = null\n let completed: number | null = null\n let skipped: number | null = null\n let distilledCount: number | null = null\n let terminalMessage: string | null = null\n let errorMessage: string | null = null\n let isTerminal = false\n\n const ensureTopic = (id: string): TopicProgressRow => {\n let row = topicMap.get(id)\n if (!row) {\n row = { topicId: id, charCount: null, distilled: false }\n topicMap.set(id, row)\n order.push(id)\n }\n return row\n }\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 'progress': {\n if (!isTerminal) phase = 'running'\n if (ev.topicId) {\n const row = ensureTopic(ev.topicId)\n const cc = parseCharCount(ev.message)\n if (cc != null) row.charCount = cc\n currentTopicId = ev.topicId\n }\n break\n }\n case 'skill-distilled': {\n if (!isTerminal) phase = 'running'\n if (ev.topicId) ensureTopic(ev.topicId).distilled = true\n break\n }\n case 'done':\n phase = 'done'\n isTerminal = true\n completed = ev.completed ?? null\n skipped = ev.skipped ?? null\n distilledCount = ev.distilledCount ?? null\n terminalMessage = ev.message ?? null\n currentTopicId = null\n break\n case 'cancelled':\n phase = 'cancelled'\n isTerminal = true\n completed = ev.completed ?? null\n distilledCount = ev.distilledCount ?? null\n terminalMessage = ev.message ?? '已取消'\n currentTopicId = null\n break\n case 'error':\n phase = 'error'\n isTerminal = true\n errorMessage = ev.errorMessage ?? ev.message ?? '未知错误'\n terminalMessage = errorMessage\n currentTopicId = null\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 topics: order.map((id) => topicMap.get(id)!),\n currentTopicId,\n completed,\n skipped,\n distilledCount,\n terminalMessage,\n isTerminal,\n errorMessage,\n log: events,\n }\n}\n\n// ─── 刷新重连:status → 应否重连进行中的 run(decision 6c92809c) ──────────────\n\n/**\n * 决定挂载时(或刷新后)是否要重连一个进行中的 run。\n *\n * 背景:蒸馏向导进度只活在 React 本地 state;刷新即丢、向导回 Step 1。但\n * `status` 端点知道有 run 在跑(`isBusy` + `currentRunId`)。本纯函数把\n * 「该不该重连 + 重连哪个 runId」从组件里抽出来,便于喂 status fixture 单测。\n *\n * 仅当后端确实在跑(`isBusy === true`)且给了一个非空 `currentRunId` 时才重连。\n * run 已结束(`isBusy` 落回 false / `currentRunId` 为 null)时返回 null —— 避免\n * 「run 结束后刷新却卡在 Step 3 假装还在跑」。\n *\n * @returns 要重连的 runId;不需重连时为 null。\n */\nexport function reconnectableRunId(\n status: RunStatusResp | undefined | null,\n): string | null {\n if (!status) return null\n if (status.isBusy !== true) return null\n const id = status.currentRunId\n if (typeof id !== 'string' || id.length === 0) return null\n return id\n}\n\n/** 向导步骤序号(与 DistillRunPage 的 Steps 对齐:0 上游 / 1 选范围 / 2 运行)。 */\nexport const WIZARD_STEP_UPSTREAM = 0\nexport const WIZARD_STEP_SCOPE = 1\nexport const WIZARD_STEP_RUN = 2\n\n/**\n * 挂载时由 status 决定向导初始落在哪一步。\n *\n * - 有进行中的 run(reconnectableRunId 非空)→ 直接跳 Step 3「运行与产出」,\n * 组件据此重连该 run 的 SSE 流恢复进度。\n * - 否则维持 Step 1(上游就绪),走正常新建流程。\n *\n * 注意:这只决定「初始」步骤;用户手动前进/后退由组件自身的 setCurrent 接管,\n * 本函数不强制覆盖用户已切走的步骤(组件用「只在首次、且尚未重连过」守卫调用)。\n */\nexport function initialWizardStep(\n status: RunStatusResp | undefined | null,\n): number {\n return reconnectableRunId(status) !== null ? WIZARD_STEP_RUN : WIZARD_STEP_UPSTREAM\n}\n\n/** SSE 事件 type → 中文 badge(Step 3 日志区)。 */\nexport function runEventBadge(\n type: DistillRunEventType,\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 'progress':\n return { color: 'gray', label: '进度' }\n case 'phase-changed':\n return { color: 'blue', label: '阶段' }\n case 'skill-distilled':\n return { color: 'green', 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/** 友好化 run 提交错误(与 distillApi.friendlyDistillError 对齐)。 */\nexport function friendlyRunError(message: string | undefined): string {\n if (!message) return '蒸馏失败,未知错误'\n const m = message.trim()\n if (m === 'distill_in_progress') return '已有蒸馏在进行中,请稍后再试'\n if (m.includes('409')) 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 * useDistillRun — 执行蒸馏向导 (Phase 2f, decision 29688066) 取数 + 副作用 hook。\n *\n * 封装向导三步的真实端点对接(**不 mock**):\n * Step1 useDistillRunStatus() — GET /status(上游 commit + isBusy + claudeCli)\n * + initMutation — POST /init(拉取/克隆 3 上游到 cache)\n * Step2 (纯表单,预览走 distill-run-derive.previewRunRequest,无副作用)\n * Step3 startRun() — POST /run 拿 runId → EventSource 连 SSE 流,\n * 逐事件 reduce 成 RunView(distill-run-derive.reduceDistillRunEvents)。\n *\n * SSE 解析逻辑全在纯函数 distill-run-derive.ts,本 hook 只负责 EventSource 生命周期 +\n * 把累积事件交给纯 reducer。故「SSE 解析」可喂模拟事件流单测,无需真触发 10min 全量跑。\n *\n * 真实成本警示:POST /run 真正会 spawn `claude -p --agent skill-distiller`,每 topic\n * ~10min 真烧 LLM。向导默认 topicCap=5;自测请用 topicCap=1 或 topicIds 限定单条。\n */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\n\nimport { authFetch } from '../utils/auth'\nimport {\n reduceDistillRunEvents,\n buildRunRequest,\n DISTILL_RUN_EVENT_TYPES,\n type DistillRunEvent,\n type DistillRunEventType,\n type InitResp,\n type RunStatusResp,\n type RunFormState,\n type RunView,\n} from './distill-run-derive'\n\n// ─── fetch helpers ───────────────────────────────────────────────────────────\n\nasync function fetchRunStatus(): Promise<RunStatusResp> {\n const r = await fetch('/api/skills/distill/status')\n if (!r.ok) throw new Error(`status → ${r.status}`)\n return r.json() as Promise<RunStatusResp>\n}\n\nasync function postInit(skipFetch: boolean): Promise<InitResp> {\n const r = await authFetch('/api/skills/distill/init', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ skipFetch }),\n })\n if (!r.ok) throw new Error(`init → ${r.status}`)\n return r.json() as Promise<InitResp>\n}\n\nasync function postRun(form: RunFormState): Promise<{ runId: string; streamUrl: string }> {\n const r = await authFetch('/api/skills/distill/run', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(buildRunRequest(form)),\n })\n if (r.status === 409) throw new Error('distill_in_progress')\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/skills/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// ─── Step 1:status + init ───────────────────────────────────────────────────\n\nexport interface DistillRunStatusResult {\n status: RunStatusResp | undefined\n loading: boolean\n isError: boolean\n refetch: () => void\n /** init 结果(拉取上游后填充)。 */\n initResult: InitResp | undefined\n initPending: boolean\n initError: Error | null\n runInit: (skipFetch?: boolean) => void\n}\n\nexport function useDistillRunStatus(): DistillRunStatusResult {\n const qc = useQueryClient()\n const statusQ = useQuery({\n queryKey: ['distill-status'],\n queryFn: fetchRunStatus,\n refetchInterval: (q) =>\n (q.state.data as RunStatusResp | undefined)?.isBusy ? 5_000 : 60_000,\n })\n const initM = useMutation({\n mutationFn: (skipFetch: boolean) => postInit(skipFetch),\n onSuccess: () => {\n void qc.invalidateQueries({ queryKey: ['distill-status'] })\n },\n })\n\n return {\n status: statusQ.data,\n loading: statusQ.isLoading,\n isError: statusQ.isError,\n refetch: () => void statusQ.refetch(),\n initResult: initM.data,\n initPending: initM.isPending,\n initError: (initM.error as Error) ?? null,\n runInit: (skipFetch = false) => initM.mutate(skipFetch),\n }\n}\n\n// ─── Step 3:run + SSE ───────────────────────────────────────────────────────\n\nexport interface DistillRunController {\n /** 当前 SSE reduce 出的运行视图。 */\n view: RunView\n /** 已发起的 runId(null = 未启动)。 */\n runId: string | null\n /** POST /run 提交中。 */\n submitting: boolean\n /** POST /run 提交错误(非 SSE 内错误)。 */\n submitError: Error | null\n /** 发起一次蒸馏(POST /run → 连 SSE)。 */\n start: (form: RunFormState) => Promise<void>\n /**\n * 重连一个已在跑的 run(刷新后恢复进度,decision 6c92809c):不 POST /run,\n * 直接连该 runId 的 SSE 流。后端 SSE 在(重)连时先回放 session.events 累积\n * 进度(distill-manager.ts),故重连即可看到「跑到哪了」并续推后续事件。\n * 幂等:已重连/已在连同一个 runId 时不重复建流。\n */\n reconnect: (runId: string) => void\n /** 取消当前运行(POST /cancel;SSE 收到 cancelled 终结)。 */\n cancel: () => Promise<void>\n /** 复位(回到 Step 2 重新选范围)。 */\n reset: () => void\n}\n\nexport function useDistillRunController(): DistillRunController {\n const qc = useQueryClient()\n const [events, setEvents] = useState<DistillRunEvent[]>([])\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(\n `/api/skills/distill/run/${encodeURIComponent(id)}/stream`,\n )\n esRef.current = es\n const dispatch = (type: DistillRunEventType) => (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 DistillRunEvent\n setEvents((prev) => [...prev, ev])\n if (type === 'done' || type === 'error' || type === 'cancelled') {\n es.close()\n esRef.current = null\n // run 终结后刷新列表/状态,使 /ai/distill 出现新记录。\n void qc.invalidateQueries({ queryKey: ['distill-status'] })\n void qc.invalidateQueries({ queryKey: ['distill-review'] })\n }\n }\n for (const t of DISTILL_RUN_EVENT_TYPES) {\n es.addEventListener(t, dispatch(t) as EventListener)\n }\n es.onerror = () => {\n // 浏览器会自动重连;只有在尚未终结时把它表达成一条 error 事件供 UI 兜底。\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 [\n ...prev,\n { type: 'error', errorMessage: 'SSE 连接中断(daemon 不可达或已断流)' },\n ]\n })\n }\n },\n [closeStream, qc],\n )\n\n const start = useCallback(\n async (form: RunFormState) => {\n setSubmitError(null)\n setSubmitting(true)\n setEvents([])\n try {\n const { runId: id } = await postRun(form)\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 // 幂等:已在连同一个 runId(state 已是它且流还开着)→ 不重复建流,避免\n // 同一 run 开两条 SSE 泄漏。换 runId 时 subscribe 会先 closeStream 旧流。\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; SSE cancelled/closed will terminate */\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: reduceDistillRunEvents(events),\n runId,\n submitting,\n submitError,\n start,\n reconnect,\n cancel,\n reset,\n }\n}\n","/**\n * DistillRunPage — AI 资源 · 执行蒸馏向导 /ai/distill/run (Phase 2f, decision 29688066).\n *\n * 替换 App.tsx 里 `/ai/distill/run` 的占位组件。把原型「执行蒸馏整页三步向导」\n * 翻译成真 Arco 组件(**严禁直搬原型 Tailwind CSS**):\n * ① 上游就绪:显示 3 上游 cache/commit 状态 + 「拉取上游(init)」按钮(POST init)。\n * ② 选 topic 范围:topicCap(1-50 默认 5) + 可选 topicIds 勾选 + force 开关;\n * 实时 JSON 预览将发的 run 请求体。\n * ③ 运行:点执行 → POST run 拿 runId → 连 SSE 流,逐 topic 实时渲染进度/蒸馏完成;\n * 完成后可回列表(/ai/distill)看带 D1-D5 的新记录。\n *\n * 真实端点 + SSE(不 mock)见 useDistillRun.ts / distill-run-derive.ts。\n *\n * ⚠️ 成本:点 Step3「执行蒸馏」会真 spawn `claude -p`,每 topic ~10min 真烧 LLM。\n * 向导默认 topicCap=5;自测请把 topicCap 调到 1 或用 topicIds 限定单条再执行。\n */\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { 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 InputNumber from '@arco-design/web-react/es/InputNumber'\nimport Switch from '@arco-design/web-react/es/Switch'\nimport Checkbox from '@arco-design/web-react/es/Checkbox'\nimport Alert from '@arco-design/web-react/es/Alert'\nimport Spin from '@arco-design/web-react/es/Spin'\nimport Result from '@arco-design/web-react/es/Result'\nimport Space from '@arco-design/web-react/es/Space'\nimport {\n IconLeft,\n IconStorage,\n IconCheckCircle,\n IconCloseCircle,\n IconThunderbolt,\n IconRefresh,\n} from '@arco-design/web-react/icon'\n\nimport {\n useDistillRunStatus,\n useDistillRunController,\n} from '../../hooks/useDistillRun'\nimport {\n buildUpstreamReadyRows,\n isUpstreamReady,\n previewRunRequest,\n runEventBadge,\n friendlyRunError,\n reconnectableRunId,\n WIZARD_STEP_RUN,\n type RunFormState,\n type UpstreamReadyRow,\n} from '../../hooks/distill-run-derive'\n\nconst Step = Steps.Step\n\n// ── 已知可勾选 topic(status.completed 派生 + 已知 4 源);用户也可不选跑 topicCap。 ──\n\nfunction upstreamStatusTag(row: UpstreamReadyRow) {\n if (row.error) {\n return (\n <Tag color=\"red\" size=\"small\" icon={<IconCloseCircle />}>\n 失败\n </Tag>\n )\n }\n if (row.status === 'cloned' || row.status === 'updated') {\n return (\n <Tag color=\"green\" size=\"small\" icon={<IconCheckCircle />}>\n {row.status === 'cloned' ? '已克隆' : '已更新'}\n </Tag>\n )\n }\n if (row.status === 'cached') {\n return (\n <Tag color=\"cyan\" size=\"small\">\n cache\n </Tag>\n )\n }\n if (row.status === 'skipped' || row.isSkipSource) {\n return (\n <Tag color=\"gray\" size=\"small\">\n skip\n </Tag>\n )\n }\n return (\n <Tag color=\"gray\" size=\"small\">\n {row.commit ? '就绪' : '未拉取'}\n </Tag>\n )\n}\n\nfunction UpstreamCard({ row }: { row: UpstreamReadyRow }) {\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n padding: '10px 14px',\n border: '1px solid var(--color-border-2)',\n borderRadius: 6,\n minWidth: 170,\n background: row.isSkipSource ? 'var(--color-fill-1)' : 'transparent',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <IconStorage style={{ color: 'var(--color-text-3)', fontSize: 13 }} />\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }}>{row.label}</Typography.Text>\n <div style={{ flex: 1 }} />\n {upstreamStatusTag(row)}\n </div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n commit{' '}\n {row.commit ? (\n <Typography.Text code style={{ fontSize: 11 }}>\n {row.commit}\n </Typography.Text>\n ) : (\n '未知'\n )}\n </Typography.Text>\n {row.error && (\n <Typography.Text type=\"error\" style={{ fontSize: 11 }}>\n {row.error}\n </Typography.Text>\n )}\n </div>\n )\n}\n\nexport default function DistillRunPage() {\n const navigate = useNavigate()\n const [current, setCurrent] = useState(0)\n\n // Step 2 表单\n const [form, setForm] = useState<RunFormState>({ topicCap: 5, topicIds: [], force: false })\n\n const { status, loading, initResult, initPending, initError, runInit } = useDistillRunStatus()\n const run = useDistillRunController()\n\n // ── 刷新重连(decision 6c92809c)─────────────────────────────────────────────\n // 进度只活在 React 本地 state,刷新即丢、向导回 Step 1。但 status 知道有 run\n // 在跑(isBusy + currentRunId)。挂载/status 到位后:若有进行中的 run 且本地尚\n // 未连任何 run → 跳 Step 3 + 重连该 run 的 SSE(后端回放 session.events 累积\n // 进度),恢复显示「跑到哪了」并续推后续事件。\n //\n // 守卫:autoReconnectedRef 确保只在「本次进入页面、用户尚未手动启动/重连」时\n // 自动重连一次——不抢用户手动新建的 run,run 结束(isBusy→false)后刷新也不会\n // 误跳 Step 3。\n const busyRunId = reconnectableRunId(status)\n const autoReconnectedRef = useRef(false)\n useEffect(() => {\n if (autoReconnectedRef.current) return\n if (!busyRunId) return\n if (run.runId) return // 用户已手动启动/重连,别覆盖\n autoReconnectedRef.current = true\n setCurrent(WIZARD_STEP_RUN)\n run.reconnect(busyRunId)\n }, [busyRunId, run])\n\n const rows = useMemo(\n () => buildUpstreamReadyRows(initResult, status),\n [initResult, status],\n )\n const ready = isUpstreamReady(rows)\n const isBusy = status?.isBusy === true\n const claudeOk = status?.claudeCliAvailable !== false\n\n // 可勾选 topic 来自 status.state.completed(已蒸馏过的 topic 名,可强制重蒸)。\n const selectableTopics = status?.state?.completed ?? []\n\n const runReqPreview = useMemo(() => previewRunRequest(form), [form])\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 16 }}>\n {/* ── 页头 ─────────────────────────────────────────────────────── */}\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <Button\n type=\"text\"\n icon={<IconLeft />}\n onClick={() => navigate('/ai/distill')}\n style={{ paddingLeft: 0 }}\n >\n 返回蒸馏列表\n </Button>\n <Typography.Title heading={6} style={{ margin: 0 }}>\n 执行蒸馏向导\n </Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 上游 SKILL → IT 通用方法论蒸馏(spawn claude -p · 每 topic ~10min 真烧 LLM)\n </Typography.Text>\n <div style={{ flex: 1 }} />\n {isBusy && busyRunId && (\n <Tag\n color=\"arcoblue\"\n size=\"small\"\n style={{ cursor: 'pointer' }}\n onClick={() => {\n autoReconnectedRef.current = true\n setCurrent(WIZARD_STEP_RUN)\n run.reconnect(busyRunId)\n }}\n title=\"点击重连查看进度\"\n >\n 另有蒸馏进行中 · 点击查看进度\n </Tag>\n )}\n {isBusy && !busyRunId && (\n <Tag color=\"arcoblue\" size=\"small\">\n 另有蒸馏进行中\n </Tag>\n )}\n </div>\n <Steps current={current} style={{ marginTop: 16 }} size=\"small\">\n <Step title=\"上游就绪\" description=\"拉取/克隆 3 上游到 cache\" />\n <Step title=\"选范围\" description=\"topicCap / topicIds / force\" />\n <Step title=\"运行与产出\" description=\"连 SSE 逐 topic 揭示\" />\n </Steps>\n </Card>\n\n {!claudeOk && (\n <Alert\n type=\"warning\"\n content=\"未检测到 claude CLI(status.claudeCliAvailable=false)——蒸馏需要本机已登录的 claude CLI,请先安装/登录后再执行。\"\n />\n )}\n\n {/* ── Step 1:上游就绪 ─────────────────────────────────────────── */}\n {current === 0 && (\n <Card\n bordered\n title={<span style={{ fontSize: 14, fontWeight: 600 }}>① 上游就绪</span>}\n extra={\n <Button\n type=\"outline\"\n size=\"small\"\n icon={<IconRefresh />}\n loading={initPending}\n onClick={() => runInit(false)}\n >\n 拉取上游 (init)\n </Button>\n }\n >\n {loading ? (\n <Spin />\n ) : (\n <>\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {rows.map((r) => (\n <UpstreamCard key={r.key} row={r} />\n ))}\n </div>\n {initError && (\n <Alert\n style={{ marginTop: 12 }}\n type=\"error\"\n content={`拉取上游失败:${initError.message}`}\n />\n )}\n {initResult && (\n <Alert\n style={{ marginTop: 12 }}\n type=\"success\"\n content={`上游已就绪(NOTICE ${initResult.noticeWritten ? '已写' : '未写'} · catalog ${initResult.catalogWritten ? '已写' : '未写'})。`}\n />\n )}\n <div style={{ marginTop: 16, display: 'flex', justifyContent: 'flex-end' }}>\n <Button\n type=\"primary\"\n disabled={!ready}\n onClick={() => setCurrent(1)}\n >\n 下一步:选范围\n </Button>\n </div>\n {!ready && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 先点「拉取上游 (init)」把 3 上游克隆/更新到 cache,就绪后才能进入下一步。\n </Typography.Text>\n )}\n </>\n )}\n </Card>\n )}\n\n {/* ── Step 2:选 topic 范围 ───────────────────────────────────── */}\n {current === 1 && (\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>② 选 topic 范围</span>}>\n <Space direction=\"vertical\" size=\"large\" style={{ width: '100%' }}>\n <div>\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }}>topicCap(1-50,默认 5)</Typography.Text>\n <div style={{ marginTop: 6, display: 'flex', alignItems: 'center', gap: 8 }}>\n <InputNumber\n min={1}\n max={50}\n value={form.topicCap}\n onChange={(v) => setForm((f) => ({ ...f, topicCap: typeof v === 'number' ? v : 5 }))}\n style={{ width: 120 }}\n disabled={form.topicIds.length > 0}\n />\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 最多蒸馏 N 个 topic(勾选具体 topicIds 时此项被忽略)。建议自测设 1。\n </Typography.Text>\n </div>\n </div>\n\n <div>\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }}>\n 指定 topicIds(可选;勾选后只跑这些)\n </Typography.Text>\n {selectableTopics.length > 0 ? (\n <div style={{ marginTop: 6 }}>\n <Checkbox.Group\n value={form.topicIds}\n onChange={(v) => setForm((f) => ({ ...f, topicIds: v as string[] }))}\n >\n <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>\n {selectableTopics.map((t) => (\n <Checkbox key={t} value={t}>\n <Typography.Text code style={{ fontSize: 12 }}>\n {t}\n </Typography.Text>\n </Checkbox>\n ))}\n </div>\n </Checkbox.Group>\n </div>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginTop: 6 }}>\n 暂无已知 topic(state.completed 为空)——按 topicCap 自动选候选。\n </Typography.Text>\n )}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <Switch\n checked={form.force}\n onChange={(v) => setForm((f) => ({ ...f, force: v }))}\n />\n <Typography.Text style={{ fontSize: 13 }}>\n force —— 强制重蒸(无视 completedSet / topicCap 跳过已完成)\n </Typography.Text>\n </div>\n\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 将发起的 POST /api/skills/distill/run 请求体:\n </Typography.Text>\n <pre\n style={{\n marginTop: 6,\n padding: 12,\n background: 'var(--color-fill-1)',\n borderRadius: 4,\n fontSize: 12,\n fontFamily: 'monospace',\n overflowX: 'auto',\n }}\n >\n {runReqPreview}\n </pre>\n </div>\n\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <Button onClick={() => setCurrent(0)}>上一步</Button>\n <Button type=\"primary\" onClick={() => setCurrent(2)}>\n 下一步:运行\n </Button>\n </div>\n </Space>\n </Card>\n )}\n\n {/* ── Step 3:运行与产出 ───────────────────────────────────────── */}\n {current === 2 && (\n <Card bordered title={<span style={{ fontSize: 14, fontWeight: 600 }}>③ 运行与产出</span>}>\n {!run.runId && (\n <Space direction=\"vertical\" size=\"medium\" style={{ width: '100%' }}>\n <Alert\n type=\"warning\"\n content=\"点「执行蒸馏」将真 spawn claude -p,每 topic ~10min 真烧 LLM。确认范围(见上一步 JSON 预览)后再执行。\"\n />\n {run.submitError && (\n <Alert type=\"error\" content={friendlyRunError(run.submitError.message)} />\n )}\n <div style={{ display: 'flex', justifyContent: 'space-between' }}>\n <Button onClick={() => setCurrent(1)}>上一步</Button>\n <Button\n type=\"primary\"\n icon={<IconThunderbolt />}\n loading={run.submitting}\n disabled={isBusy || !claudeOk}\n onClick={() => void run.start(form)}\n >\n 执行蒸馏\n </Button>\n </div>\n </Space>\n )}\n\n {run.runId && (\n <Space direction=\"vertical\" size=\"medium\" style={{ width: '100%' }}>\n {/* 运行态横条 */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <Tag size=\"small\" style={{ fontFamily: 'monospace' }}>\n {run.runId}\n </Tag>\n <Tag\n color={\n run.view.phase === 'done'\n ? 'green'\n : run.view.phase === 'error'\n ? 'red'\n : run.view.phase === 'cancelled'\n ? 'orange'\n : 'arcoblue'\n }\n size=\"small\"\n >\n {run.view.phase}\n </Tag>\n {run.view.currentTopicId && (\n <Tag color=\"arcoblue\" size=\"small\">\n 当前: {run.view.currentTopicId}\n </Tag>\n )}\n <div style={{ flex: 1 }} />\n {!run.view.isTerminal && (\n <Button size=\"small\" status=\"danger\" onClick={() => void run.cancel()}>\n 取消\n </Button>\n )}\n </div>\n\n {!run.view.isTerminal && !run.view.connected && <Spin tip=\"连接 SSE 流…\" />}\n\n {/* 逐 topic 进度行 */}\n {run.view.topics.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {run.view.topics.map((t) => (\n <div\n key={t.topicId}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '6px 10px',\n border: '1px solid var(--color-border-2)',\n borderRadius: 4,\n }}\n >\n <Typography.Text code style={{ fontSize: 12 }}>\n {t.topicId}\n </Typography.Text>\n <div style={{ flex: 1 }} />\n {t.charCount != null && (\n <Typography.Text type=\"secondary\" style={{ fontSize: 11 }}>\n {t.charCount.toLocaleString()} chars\n </Typography.Text>\n )}\n {t.distilled ? (\n <Tag color=\"green\" size=\"small\" icon={<IconCheckCircle />}>\n 蒸馏✓\n </Tag>\n ) : (\n <Tag color=\"arcoblue\" size=\"small\">\n 运行中\n </Tag>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* 终态结果 */}\n {run.view.phase === 'done' && (\n <Result\n status=\"success\"\n title=\"蒸馏完成\"\n subTitle={\n run.view.terminalMessage ??\n `完成 ${run.view.completed ?? '?'} · 蒸馏 ${run.view.distilledCount ?? '?'} · 跳过 ${run.view.skipped ?? '?'}`\n }\n extra={[\n <Button key=\"list\" type=\"primary\" onClick={() => navigate('/ai/distill')}>\n 查看产出(带 D1-D5)\n </Button>,\n <Button key=\"again\" onClick={run.reset}>\n 再跑一次\n </Button>,\n ]}\n />\n )}\n {run.view.phase === 'cancelled' && (\n <Result\n status=\"warning\"\n title=\"已取消\"\n subTitle={run.view.terminalMessage ?? '蒸馏已被取消'}\n extra={[\n <Button key=\"again\" type=\"primary\" onClick={run.reset}>\n 重新执行\n </Button>,\n ]}\n />\n )}\n {run.view.phase === 'error' && (\n <Result\n status=\"error\"\n title=\"蒸馏出错\"\n subTitle={friendlyRunError(run.view.errorMessage ?? undefined)}\n extra={[\n <Button key=\"again\" type=\"primary\" onClick={run.reset}>\n 重试\n </Button>,\n ]}\n />\n )}\n\n {/* SSE 事件日志 */}\n <div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n SSE 事件流({run.view.log.length}):\n </Typography.Text>\n <div\n style={{\n marginTop: 6,\n maxHeight: 220,\n overflowY: 'auto',\n fontSize: 12,\n fontFamily: 'monospace',\n background: 'var(--color-fill-1)',\n padding: 8,\n borderRadius: 4,\n }}\n >\n {run.view.log.length === 0 && (\n <Typography.Text type=\"secondary\">等待第一个 SSE 事件…</Typography.Text>\n )}\n {run.view.log.map((ev, i) => {\n const badge = runEventBadge(ev.type)\n return (\n <div key={i} style={{ display: 'flex', gap: 8, lineHeight: '20px' }}>\n <Tag color={badge.color} size=\"small\" style={{ minWidth: 56, textAlign: 'center' }}>\n {badge.label}\n </Tag>\n <span style={{ flex: 1 }}>\n {ev.topicId ? `${ev.topicId} ` : ''}\n {ev.message ?? ''}\n {ev.errorMessage ? ` — ${ev.errorMessage}` : ''}\n {ev.completed != null ? ` (completed=${ev.completed})` : ''}\n </span>\n </div>\n )\n })}\n </div>\n </div>\n </Space>\n )}\n </Card>\n )}\n </div>\n )\n}\n"],"names":["DISTILL_RUN_EVENT_TYPES","UPSTREAM_LABELS","SKIP_SOURCE_KEYS","shortCommit","commit","c","buildUpstreamReadyRows","init","status","results","r","key","_a","_b","commits","isUpstreamReady","rows","nonSkip","clampTopicCap","n","TOPIC_ID_RE","sanitizeTopicIds","ids","seen","out","id","buildRunRequest","form","topicIds","body","previewRunRequest","parseCharCount","message","m","TERMINAL_TYPES","reduceDistillRunEvents","events","topicMap","order","connected","phase","currentTopicId","completed","skipped","distilledCount","terminalMessage","errorMessage","isTerminal","ensureTopic","row","ev","cc","reconnectableRunId","WIZARD_STEP_RUN","runEventBadge","type","friendlyRunError","fetchRunStatus","postInit","skipFetch","authFetch","postRun","postCancel","runId","useDistillRunStatus","qc","useQueryClient","statusQ","useQuery","q","initM","useMutation","useDistillRunController","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","upstreamStatusTag","jsx","Tag","IconCloseCircle","IconCheckCircle","UpstreamCard","jsxs","IconStorage","Typography","DistillRunPage","navigate","useNavigate","current","setCurrent","setForm","loading","initResult","initPending","initError","runInit","run","busyRunId","autoReconnectedRef","useMemo","ready","isBusy","claudeOk","selectableTopics","runReqPreview","Card","Button","IconLeft","Alert","IconRefresh","Spin","Fragment","Space","InputNumber","v","f","Checkbox","Switch","IconThunderbolt","Result","i","badge"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as r}from"./react-vendor-tkvCrao7.js";import{b as t,T as i,a8 as a}from"./arco-DV6xCLhr.js";function l(e){if(!e)return"";const n=e.replace(/\/+$/,""),o=n.lastIndexOf("/");return o>=0?n.slice(o+1):n}function u({project:e,isAllProjects:n,usageLabel:o="使用统计"}){if(n||!e)return null;const s=l(e)||e;return r.jsx(t,{color:"arcoblue",size:"small",icon:r.jsx(a,{}),style:{borderRadius:4},children:r.jsxs(i.Text,{style:{fontSize:12},children:["定义全局 · ",o,"按当前项目(",s,")"]})})}export{u as G};
2
+ //# sourceMappingURL=GlobalScopeHint-Q3wTJx3F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlobalScopeHint-Q3wTJx3F.js","sources":["../../src/components/ai/GlobalScopeHint.tsx"],"sourcesContent":["/**\n * GlobalScopeHint — 「定义全局 · 使用统计按当前项目」提示 (decision dd79010a).\n *\n * Skill / Agent 定义(catalog / 模板 / 蒸馏正文)是全局一套库——不随全局项目\n * 选择器变空。但这些页的 usage 维度(调用次数 / 有用性 / 委托 / 体检)已按当前\n * 项目过滤。当用户选了一个具体项目(非全部项目)时,渲染这条小提示,避免误读\n * 为「选了项目就没数据」。选「全部项目」时不渲染(无歧义)。\n */\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { IconInfoCircle } from '@arco-design/web-react/icon'\n\n/** Trailing basename of an absolute project path (display only). */\nfunction projectBasename(path: string): string {\n if (!path) return ''\n const trimmed = path.replace(/\\/+$/, '')\n const idx = trimmed.lastIndexOf('/')\n return idx >= 0 ? trimmed.slice(idx + 1) : trimmed\n}\n\nexport interface GlobalScopeHintProps {\n /** Effective project path the usage stats are scoped to ('' = all projects). */\n project: string\n /** True when the explicit all-projects view is selected. */\n isAllProjects: boolean\n /** What the usage dimension is, for the hint copy (e.g. '使用统计' / '委托统计'). */\n usageLabel?: string\n}\n\n/**\n * Render the global-definition hint. Returns null for the all-projects view or\n * when no concrete project is resolved (nothing is being filtered → no hint).\n */\nexport default function GlobalScopeHint({\n project,\n isAllProjects,\n usageLabel = '使用统计',\n}: GlobalScopeHintProps) {\n if (isAllProjects || !project) return null\n const name = projectBasename(project) || project\n return (\n <Tag\n color=\"arcoblue\"\n size=\"small\"\n icon={<IconInfoCircle />}\n style={{ borderRadius: 4 }}\n >\n <Typography.Text style={{ fontSize: 12 }}>\n 定义全局 · {usageLabel}按当前项目({name})\n </Typography.Text>\n </Tag>\n )\n}\n"],"names":["projectBasename","path","trimmed","idx","GlobalScopeHint","project","isAllProjects","usageLabel","name","jsx","Tag","IconInfoCircle","jsxs","Typography"],"mappings":"qGAaA,SAASA,EAAgBC,EAAsB,CAC7C,GAAI,CAACA,EAAM,MAAO,GAClB,MAAMC,EAAUD,EAAK,QAAQ,OAAQ,EAAE,EACjCE,EAAMD,EAAQ,YAAY,GAAG,EACnC,OAAOC,GAAO,EAAID,EAAQ,MAAMC,EAAM,CAAC,EAAID,CAC7C,CAeA,SAAwBE,EAAgB,CACtC,QAAAC,EACA,cAAAC,EACA,WAAAC,EAAa,MACf,EAAyB,CACvB,GAAID,GAAiB,CAACD,EAAS,OAAO,KACtC,MAAMG,EAAOR,EAAgBK,CAAO,GAAKA,EACzC,OACEI,EAAAA,IAACC,EAAA,CACC,MAAM,WACN,KAAK,QACL,WAAOC,EAAA,EAAe,EACtB,MAAO,CAAE,aAAc,CAAA,EAEvB,SAAAC,EAAAA,KAACC,EAAW,KAAX,CAAgB,MAAO,CAAE,SAAU,IAAM,SAAA,CAAA,UAChCN,EAAW,SAAOC,EAAK,GAAA,CAAA,CACjC,CAAA,CAAA,CAGN"}
@@ -0,0 +1,2 @@
1
+ import{r as f,j as e}from"./react-vendor-tkvCrao7.js";import{J as l,d as R,D as W,F as c,X as F,t as $,T as t,N as j,a2 as D,K as T,ai as E,a8 as L,aj as H,$ as M,a3 as P,b as z}from"./arco-DV6xCLhr.js";import{u as N,e as U,g as X,f as m,t as h,c as S,a as G,d as J}from"./useIssuesFeed-CFiyQkAL.js";import{d as K,u as q}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./query-CgCOpYWf.js";import"./index-DileOOE4.js";import"./lucide-CnlPQoG8.js";const u=T.Row,o=T.Col;function v(i){return e.jsx(z,{color:G(i),size:"small",children:h(i)})}function b(i){return e.jsx(z,{color:J(i),size:"small",children:S(i)})}function y({icon:i,title:n,children:r}){return e.jsxs(l,{bordered:!0,children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:10},children:[i,e.jsx(t.Text,{style:{fontSize:15,fontWeight:600},children:n})]}),r]})}function se(){const{id:i}=K(),n=q(),{issues:r,loading:I,isError:k,error:p}=N(),s=f.useMemo(()=>U(r,i),[r,i]),a=f.useMemo(()=>s?X(r,s):0,[r,s]);if(I)return e.jsx("div",{style:{padding:16},children:e.jsx(l,{bordered:!0,children:e.jsx(R,{animation:!0,text:{rows:10}})})});if(k||!s)return e.jsx("div",{style:{padding:16},children:e.jsx(W,{status:"error",title:"加载问题详情失败",subTitle:(p==null?void 0:p.message)||"问题不存在(id 可能已不在当前时间窗内)或端点不可用",extra:e.jsx(c,{type:"primary",onClick:()=>n("/issues"),children:"返回问题"})})});const C=()=>{var g;try{(g=navigator.clipboard)==null||g.writeText(s.rule),P.success(`已复制规则 ${s.rule}`)}catch{}},d=s.type==="failure",x=s.type==="drift",w=!d&&!x?e.jsx("pre",{style:{margin:0,padding:"12px 14px",background:"#1D2129",color:"#E5E6EB",borderRadius:6,fontSize:12,lineHeight:1.6,whiteSpace:"pre-wrap",wordBreak:"break-word",overflowX:"auto"},children:s.what}):e.jsx("div",{style:{borderLeft:`3px solid ${d?"rgb(var(--red-5))":"rgb(var(--gold-5))"}`,background:"var(--color-fill-1)",borderRadius:"0 6px 6px 0",padding:"12px 14px",fontSize:13,lineHeight:1.6},children:s.what}),B=d?"verify-agent verdict / 失败摘要":x?"漂移实测 vs 期望":`被 ${s.rule} 拦下的${s.action==="Bash"?"命令":"动作"}(端点未返回原文,下为摘要兜底)`;return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:16},children:[e.jsxs(l,{bordered:!0,children:[e.jsx(c,{type:"text",size:"small",icon:e.jsx(F,{}),style:{marginBottom:8,paddingLeft:0},onClick:()=>n("/issues"),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($,{style:{color:"rgb(var(--red-6))"}}),e.jsx(t.Title,{heading:5,style:{margin:0},children:s.title}),v(s.type),b(s.severity)]}),e.jsxs("div",{style:{display:"flex",gap:12,flexWrap:"wrap",marginTop:8,alignItems:"center"},children:[e.jsxs(t.Text,{type:"secondary",style:{fontSize:12},children:["规则 ",e.jsx(t.Text,{style:{fontFamily:"monospace"},children:s.rule})]}),e.jsxs(t.Text,{type:"secondary",style:{fontSize:12},children:["动作 ",e.jsx(t.Text,{style:{fontWeight:600},children:s.action})]}),e.jsx(t.Text,{type:"secondary",style:{fontSize:12,fontFamily:"monospace"},children:s.session?`${s.session.slice(0,12)}…`:"session 未返回"}),e.jsx(t.Text,{type:"secondary",style:{fontSize:12},children:m(s.time)}),s.relatedTaskId?e.jsxs(c,{type:"text",size:"mini",style:{paddingLeft:0,fontFamily:"monospace",fontSize:12},onClick:()=>n(`/tasks/${encodeURIComponent(s.relatedTaskId)}`),children:["关联任务 ",s.relatedTaskId.slice(0,8),"… ",e.jsx(j,{})]}):e.jsx(t.Text,{type:"secondary",style:{fontSize:12},children:"无关联任务"})]})]}),e.jsx("div",{style:{display:"flex",gap:8,flexShrink:0},children:e.jsx(c,{size:"small",icon:e.jsx(D,{}),onClick:C,children:"复制规则名"})})]})]}),e.jsx(l,{bordered:!0,children:e.jsxs(u,{children:[e.jsxs(o,{span:6,children:[e.jsx(t.Text,{type:"secondary",style:{fontSize:12},children:"类型"}),e.jsx("div",{style:{fontSize:13,fontWeight:500,marginTop:4},children:h(s.type)})]}),e.jsxs(o,{span:6,children:[e.jsx(t.Text,{type:"secondary",style:{fontSize:12},children:"触发动作"}),e.jsx("div",{style:{fontSize:13,fontWeight:500,marginTop:4},children:s.action})]}),e.jsxs(o,{span:6,children:[e.jsx(t.Text,{type:"secondary",style:{fontSize:12},children:"严重度"}),e.jsx("div",{style:{fontSize:13,fontWeight:500,marginTop:4},children:S(s.severity)})]}),e.jsxs(o,{span:6,children:[e.jsx(t.Text,{type:"secondary",style:{fontSize:12},children:"近 7 天同类"}),e.jsxs("div",{style:{fontSize:13,fontWeight:500,marginTop:4},children:[a," 次"]})]})]})}),e.jsxs(u,{gutter:16,children:[e.jsx(o,{xs:24,lg:16,children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e.jsxs(y,{icon:e.jsx(E,{style:{color:"var(--color-text-3)"}}),title:`① ${d?"发生了什么(失败)":x?"发生了什么(漂移)":"发生了什么"}`,children:[e.jsx(t.Text,{type:"secondary",style:{fontSize:12,display:"block",marginBottom:6},children:B}),w]}),e.jsx(y,{icon:e.jsx(L,{style:{color:"rgb(var(--orange-6))"}}),title:`② 为什么${d?"失败":x?"判定漂移":"拦"}`,children:e.jsx("div",{style:{background:"var(--color-warning-light-1)",border:"1px solid var(--color-warning-light-3)",borderRadius:6,padding:14,fontSize:13,lineHeight:1.7},children:s.why})}),e.jsx(y,{icon:e.jsx(H,{style:{color:"rgb(var(--arcoblue-6))"}}),title:"③ 建议怎么做",children:e.jsx("div",{style:{background:"var(--color-primary-light-1)",border:"1px solid var(--color-primary-light-3)",borderRadius:6,padding:14,fontSize:13,lineHeight:1.7},children:s.hint})})]})}),e.jsx(o,{xs:24,lg:8,children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e.jsx(l,{bordered:!0,title:"概要",children:e.jsx(M,{column:1,size:"small",colon:" ",data:[{label:"ID",value:e.jsx("span",{style:{fontFamily:"monospace",fontSize:12},children:s.id})},{label:"规则",value:e.jsx("span",{style:{fontFamily:"monospace",fontSize:12},children:s.rule})},{label:"类型",value:v(s.type)},{label:"严重度",value:b(s.severity)},{label:"触发动作",value:s.action},{label:"session",value:e.jsx("span",{style:{fontFamily:"monospace",fontSize:12},children:s.session??"端点未返回"})},{label:"来源",value:s.source},{label:"时间",value:m(s.time)}]})}),e.jsxs(l,{bordered:!0,title:"同类问题计数",children:[e.jsxs("div",{style:{display:"flex",alignItems:"flex-end",gap:8},children:[e.jsx(t.Text,{style:{fontSize:28,fontWeight:600,lineHeight:1,color:"rgb(var(--red-6))"},children:a}),e.jsx(t.Text,{type:"secondary",style:{fontSize:13,paddingBottom:2},children:"次 / 当前时间窗"})]}),e.jsx(t.Paragraph,{type:"secondary",style:{fontSize:12,marginTop:8,marginBottom:0},children:s.type==="intercept"||s.type==="violation"?e.jsxs(e.Fragment,{children:["规则 ",e.jsx("span",{style:{fontFamily:"monospace"},children:s.rule})," 命中"," ",e.jsx(t.Text,{style:{fontWeight:600},children:a})," 次",a>=4?",已成高频信号,建议从命令写法 / 委托流程规避。":",偶发,注意复盘。"]}):e.jsxs(e.Fragment,{children:["同类「",h(s.type),"」共 ",e.jsx(t.Text,{style:{fontWeight:600},children:a})," 条(当前时间窗内)。"]})})]}),e.jsx(l,{bordered:!0,title:"关联任务",children:s.relatedTaskId?e.jsxs(c,{type:"outline",long:!0,onClick:()=>n(`/tasks/${encodeURIComponent(s.relatedTaskId)}`),children:["查看任务 ",s.relatedTaskId.slice(0,8),"… ",e.jsx(j,{})]}):e.jsx(t.Text,{type:"secondary",style:{fontSize:13},children:s.source==="violations"?"违规拦截源端点未返回关联任务(降级)":"该问题类型无关联任务"})})]})})]})]})}export{se as default};
2
+ //# sourceMappingURL=IssueDetailPage-BDfrtk2C.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IssueDetailPage-BDfrtk2C.js","sources":["../../src/pages/IssueDetailPage.tsx"],"sourcesContent":["/**\n * IssueDetailPage — 治理 · 问题(治理)详情整页 (Phase 3b, decision 29688066).\n *\n * 替换 `/issues/:id` 的占位组件。整页(非抽屉)布局,翻译原型「问题详情」成\n * 真 Arco 组件(**严禁直搬原型 Tailwind CSS**):\n * A. 页头横条:返回 + 标题 + 类型/严重度 Tag + 元信息(规则 / 动作 / session / 时间 /\n * 关联任务)。\n * B. 横向统计条(类型 / 触发动作 / 严重度 / 近 7 天同类)。\n * C. 左主栏:①发生了什么(被拦命令原文 / 失败摘要 / 漂移 actual)②为什么拦(规则说明\n * + 命中阈值)③建议怎么做(hint)。\n * D. 右 360 栏:概要 Descriptions + 同类近 7 天计数(同规则/同类型计数)+ 关联任务链\n * `/tasks/:id`。\n *\n * 数据:复用 useIssuesFeed 的 merge 列表按稳定 id 定位(零新后端,不额外请求单条端点)。\n * 降级口径(端点真实缺字段,勿伪造):\n * - /api/violations 不返回被拦命令原文 / hint / session → ① 用 summary 兜底(标注摘要)、\n * ② / ③ 用规则启发文案、概要 session 显「端点未返回」。\n * - drift 详情主要展示 actual vs expected;失败任务详情链到 /tasks/:id。\n */\nimport { useMemo } from 'react'\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 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 IconExclamationCircle,\n IconCopy,\n IconCodeBlock,\n IconInfoCircle,\n IconBulb,\n IconRight,\n} from '@arco-design/web-react/icon'\n\nimport { useIssuesFeed } from '../hooks/useIssuesFeed'\nimport {\n findIssueById,\n countSimilar,\n typeLabel,\n typeColor,\n severityLabel,\n severityColor,\n fmtTime,\n type Issue,\n} from '../hooks/issues-derive'\n\nconst Row = Grid.Row\nconst Col = Grid.Col\n\nfunction typeTag(t: Issue['type']) {\n return <Tag color={typeColor(t)} size=\"small\">{typeLabel(t)}</Tag>\n}\nfunction sevTag(s: Issue['severity']) {\n return <Tag color={severityColor(s)} size=\"small\">{severityLabel(s)}</Tag>\n}\n\n/** 左栏分节卡(标题 + 图标 + 正文块)。 */\nfunction SectionCard({\n icon,\n title,\n children,\n}: {\n icon: React.ReactNode\n title: string\n children: React.ReactNode\n}) {\n return (\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 10 }}>\n {icon}\n <Typography.Text style={{ fontSize: 15, fontWeight: 600 }}>{title}</Typography.Text>\n </div>\n {children}\n </Card>\n )\n}\n\nexport default function IssueDetailPage() {\n const { id } = useParams<{ id: string }>()\n const navigate = useNavigate()\n const { issues, loading, isError, error } = useIssuesFeed()\n\n const issue = useMemo(() => findIssueById(issues, id), [issues, id])\n const count7d = useMemo(() => (issue ? countSimilar(issues, issue) : 0), [issues, issue])\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 || !issue) {\n return (\n <div style={{ padding: 16 }}>\n <Result\n status=\"error\"\n title=\"加载问题详情失败\"\n subTitle={error?.message || '问题不存在(id 可能已不在当前时间窗内)或端点不可用'}\n extra={\n <Button type=\"primary\" onClick={() => navigate('/issues')}>\n 返回问题\n </Button>\n }\n />\n </div>\n )\n }\n\n const copyRule = () => {\n try {\n void navigator.clipboard?.writeText(issue.rule)\n Message.success(`已复制规则 ${issue.rule}`)\n } catch {\n /* clipboard unavailable */\n }\n }\n\n const isFailure = issue.type === 'failure'\n const isDrift = issue.type === 'drift'\n\n // ① 发生了什么:命令原文用 code 块(深底等宽),失败/漂移用文本块。\n const whatBlock =\n !isFailure && !isDrift ? (\n <pre\n style={{\n margin: 0,\n padding: '12px 14px',\n background: '#1D2129',\n color: '#E5E6EB',\n borderRadius: 6,\n fontSize: 12,\n lineHeight: 1.6,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n overflowX: 'auto',\n }}\n >\n {issue.what}\n </pre>\n ) : (\n <div\n style={{\n borderLeft: `3px solid ${isFailure ? 'rgb(var(--red-5))' : 'rgb(var(--gold-5))'}`,\n background: 'var(--color-fill-1)',\n borderRadius: '0 6px 6px 0',\n padding: '12px 14px',\n fontSize: 13,\n lineHeight: 1.6,\n }}\n >\n {issue.what}\n </div>\n )\n\n const whatLabel = isFailure\n ? 'verify-agent verdict / 失败摘要'\n : isDrift\n ? '漂移实测 vs 期望'\n : `被 ${issue.rule} 拦下的${issue.action === 'Bash' ? '命令' : '动作'}(端点未返回原文,下为摘要兜底)`\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('/issues')}\n >\n 返回问题\n </Button>\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 16,\n flexWrap: 'wrap',\n }}\n >\n <div style={{ minWidth: 0, flex: 1 }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }}>\n <IconExclamationCircle style={{ color: 'rgb(var(--red-6))' }} />\n <Typography.Title heading={5} style={{ margin: 0 }}>\n {issue.title}\n </Typography.Title>\n {typeTag(issue.type)}\n {sevTag(issue.severity)}\n </div>\n <div\n style={{\n display: 'flex',\n gap: 12,\n flexWrap: 'wrap',\n marginTop: 8,\n alignItems: 'center',\n }}\n >\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 规则 <Typography.Text style={{ fontFamily: 'monospace' }}>{issue.rule}</Typography.Text>\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 动作 <Typography.Text style={{ fontWeight: 600 }}>{issue.action}</Typography.Text>\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, fontFamily: 'monospace' }}>\n {issue.session ? `${issue.session.slice(0, 12)}…` : 'session 未返回'}\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {fmtTime(issue.time)}\n </Typography.Text>\n {issue.relatedTaskId ? (\n <Button\n type=\"text\"\n size=\"mini\"\n style={{ paddingLeft: 0, fontFamily: 'monospace', fontSize: 12 }}\n onClick={() => navigate(`/tasks/${encodeURIComponent(issue.relatedTaskId!)}`)}\n >\n 关联任务 {issue.relatedTaskId.slice(0, 8)}… <IconRight />\n </Button>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 无关联任务\n </Typography.Text>\n )}\n </div>\n </div>\n <div style={{ display: 'flex', gap: 8, flexShrink: 0 }}>\n <Button size=\"small\" icon={<IconCopy />} onClick={copyRule}>\n 复制规则名\n </Button>\n </div>\n </div>\n </Card>\n\n {/* ── B. 横向统计条 ───────────────────────────────────────────── */}\n <Card bordered>\n <Row>\n <Col span={6}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>类型</Typography.Text>\n <div style={{ fontSize: 13, fontWeight: 500, marginTop: 4 }}>{typeLabel(issue.type)}</div>\n </Col>\n <Col span={6}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>触发动作</Typography.Text>\n <div style={{ fontSize: 13, fontWeight: 500, marginTop: 4 }}>{issue.action}</div>\n </Col>\n <Col span={6}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>严重度</Typography.Text>\n <div style={{ fontSize: 13, fontWeight: 500, marginTop: 4 }}>{severityLabel(issue.severity)}</div>\n </Col>\n <Col span={6}>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>近 7 天同类</Typography.Text>\n <div style={{ fontSize: 13, fontWeight: 500, marginTop: 4 }}>{count7d} 次</div>\n </Col>\n </Row>\n </Card>\n\n <Row gutter={16}>\n {/* ── C. 左主栏 ─────────────────────────────────────────────── */}\n <Col xs={24} lg={16}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <SectionCard\n icon={<IconCodeBlock style={{ color: 'var(--color-text-3)' }} />}\n title={`① ${isFailure ? '发生了什么(失败)' : isDrift ? '发生了什么(漂移)' : '发生了什么'}`}\n >\n <Typography.Text type=\"secondary\" style={{ fontSize: 12, display: 'block', marginBottom: 6 }}>\n {whatLabel}\n </Typography.Text>\n {whatBlock}\n </SectionCard>\n\n <SectionCard\n icon={<IconInfoCircle style={{ color: 'rgb(var(--orange-6))' }} />}\n title={`② 为什么${isFailure ? '失败' : isDrift ? '判定漂移' : '拦'}`}\n >\n <div\n style={{\n background: 'var(--color-warning-light-1)',\n border: '1px solid var(--color-warning-light-3)',\n borderRadius: 6,\n padding: 14,\n fontSize: 13,\n lineHeight: 1.7,\n }}\n >\n {issue.why}\n </div>\n </SectionCard>\n\n <SectionCard\n icon={<IconBulb style={{ color: 'rgb(var(--arcoblue-6))' }} />}\n title=\"③ 建议怎么做\"\n >\n <div\n style={{\n background: 'var(--color-primary-light-1)',\n border: '1px solid var(--color-primary-light-3)',\n borderRadius: 6,\n padding: 14,\n fontSize: 13,\n lineHeight: 1.7,\n }}\n >\n {issue.hint}\n </div>\n </SectionCard>\n </div>\n </Col>\n\n {/* ── D. 右 360 栏 ──────────────────────────────────────────── */}\n <Col xs={24} lg={8}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n <Card bordered title=\"概要\">\n <Descriptions\n column={1}\n size=\"small\"\n colon=\" \"\n data={[\n { label: 'ID', value: <span style={{ fontFamily: 'monospace', fontSize: 12 }}>{issue.id}</span> },\n { label: '规则', value: <span style={{ fontFamily: 'monospace', fontSize: 12 }}>{issue.rule}</span> },\n { label: '类型', value: typeTag(issue.type) },\n { label: '严重度', value: sevTag(issue.severity) },\n { label: '触发动作', value: issue.action },\n { label: 'session', value: <span style={{ fontFamily: 'monospace', fontSize: 12 }}>{issue.session ?? '端点未返回'}</span> },\n { label: '来源', value: issue.source },\n { label: '时间', value: fmtTime(issue.time) },\n ]}\n />\n </Card>\n\n <Card bordered title=\"同类问题计数\">\n <div style={{ display: 'flex', alignItems: 'flex-end', gap: 8 }}>\n <Typography.Text style={{ fontSize: 28, fontWeight: 600, lineHeight: 1, color: 'rgb(var(--red-6))' }}>\n {count7d}\n </Typography.Text>\n <Typography.Text type=\"secondary\" style={{ fontSize: 13, paddingBottom: 2 }}>\n 次 / 当前时间窗\n </Typography.Text>\n </div>\n <Typography.Paragraph type=\"secondary\" style={{ fontSize: 12, marginTop: 8, marginBottom: 0 }}>\n {issue.type === 'intercept' || issue.type === 'violation' ? (\n <>\n 规则 <span style={{ fontFamily: 'monospace' }}>{issue.rule}</span> 命中{' '}\n <Typography.Text style={{ fontWeight: 600 }}>{count7d}</Typography.Text> 次\n {count7d >= 4 ? ',已成高频信号,建议从命令写法 / 委托流程规避。' : ',偶发,注意复盘。'}\n </>\n ) : (\n <>同类「{typeLabel(issue.type)}」共 <Typography.Text style={{ fontWeight: 600 }}>{count7d}</Typography.Text> 条(当前时间窗内)。</>\n )}\n </Typography.Paragraph>\n </Card>\n\n <Card bordered title=\"关联任务\">\n {issue.relatedTaskId ? (\n <Button\n type=\"outline\"\n long\n onClick={() => navigate(`/tasks/${encodeURIComponent(issue.relatedTaskId!)}`)}\n >\n 查看任务 {issue.relatedTaskId.slice(0, 8)}… <IconRight />\n </Button>\n ) : (\n <Typography.Text type=\"secondary\" style={{ fontSize: 13 }}>\n {issue.source === 'violations'\n ? '违规拦截源端点未返回关联任务(降级)'\n : '该问题类型无关联任务'}\n </Typography.Text>\n )}\n </Card>\n </div>\n </Col>\n </Row>\n </div>\n )\n}\n"],"names":["Row","Grid","Col","typeTag","t","jsx","Tag","typeColor","typeLabel","sevTag","s","severityColor","severityLabel","SectionCard","icon","title","children","jsxs","Card","Typography","IssueDetailPage","id","useParams","navigate","useNavigate","issues","loading","isError","error","useIssuesFeed","issue","useMemo","findIssueById","count7d","countSimilar","Skeleton","Result","Button","copyRule","_a","Message","isFailure","isDrift","whatBlock","whatLabel","IconLeft","IconExclamationCircle","fmtTime","IconRight","IconCopy","IconCodeBlock","IconInfoCircle","IconBulb","Descriptions","Fragment"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as h,j as e}from"./react-vendor-tkvCrao7.js";import{D as W,J as a,T as i,ac as j,c as T,a1 as P,E as _,K as v,F as m,N as b,t as F,b as z}from"./arco-DV6xCLhr.js";import{u as D,s as $,b as L,f as K,t as M,a as N,c as U,d as A}from"./useIssuesFeed-CFiyQkAL.js";import{u as B}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./query-CgCOpYWf.js";import"./index-DileOOE4.js";import"./lucide-CnlPQoG8.js";const u=T.TabPane,G=v.Row,J=v.Col;function q(r){return e.jsx(z,{color:N(r),size:"small",children:M(r)})}function C(r){return e.jsx(z,{color:A(r),size:"small",children:U(r)})}function H({issue:r}){return e.jsxs(a,{bordered:!0,style:{height:"100%"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,flexWrap:"wrap"},children:[e.jsx(F,{style:{color:"rgb(var(--gold-6))"}}),e.jsx(i.Text,{style:{fontSize:14,fontWeight:600},children:r.rule}),C(r.severity)]}),e.jsx(i.Paragraph,{style:{margin:"8px 0 0",fontSize:13},children:r.what}),e.jsx("div",{style:{marginTop:10,paddingTop:8,borderTop:"1px solid var(--color-border-1)",display:"flex",justifyContent:"flex-end"},children:e.jsxs(m,{type:"text",size:"mini",children:["查看详情 ",e.jsx(b,{})]})})]})}function se(){const r=B(),{issues:n,loading:I,isError:S,error:l,violationsError:f,tasksError:g,driftError:d,tasksTruncated:w}=D(),[k,E]=h.useState("primary"),{primary:c,drift:p}=h.useMemo(()=>$(n),[n]),o=h.useMemo(()=>L(n),[n]);if(S)return e.jsx("div",{style:{padding:16},children:e.jsx(W,{status:"error",title:"加载问题失败",subTitle:(l==null?void 0:l.message)||"三源端点均不可用"})});const x=s=>r(`/issues/${encodeURIComponent(s)}`),R=[{title:"类型",dataIndex:"type",width:84,render:(s,t)=>q(t.type)},{title:"严重度",dataIndex:"severity",width:76,render:(s,t)=>C(t.severity)},{title:"问题 · 规则",dataIndex:"title",render:(s,t)=>e.jsxs("div",{style:{minWidth:0},children:[e.jsx(i.Paragraph,{style:{margin:0,fontSize:13},ellipsis:{rows:1,showTooltip:!0},children:t.title}),e.jsx(i.Text,{type:"secondary",style:{fontSize:12,fontFamily:"monospace"},children:t.rule})]})},{title:"动作 / 来源",dataIndex:"action",width:110,render:(s,t)=>e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:t.action})},{title:"session / 任务",dataIndex:"session",width:130,render:(s,t)=>t.relatedTaskId?e.jsxs(m,{type:"text",size:"mini",style:{paddingLeft:0,fontFamily:"monospace",fontSize:12},onClick:y=>{y.stopPropagation(),r(`/tasks/${encodeURIComponent(t.relatedTaskId)}`)},children:[t.relatedTaskId.slice(0,8),"…"]}):t.session?e.jsxs(i.Text,{type:"secondary",style:{fontSize:12,fontFamily:"monospace"},children:[t.session.slice(0,8),"…"]}):e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:"—"})},{title:"时间",dataIndex:"time",width:120,sorter:(s,t)=>s.time<t.time?-1:s.time>t.time?1:0,render:(s,t)=>e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:K(t.time)})},{title:"操作",dataIndex:"op",width:72,align:"right",render:(s,t)=>e.jsxs(m,{type:"text",size:"mini",onClick:y=>{y.stopPropagation(),x(t.id)},children:["详情 ",e.jsx(b,{})]})}];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",gap:12,flexWrap:"wrap"},children:[e.jsx(i.Title,{heading:6,style:{margin:0},children:"问题"}),e.jsx(i.Text,{type:"secondary",style:{fontSize:12},children:"前端 merge 三源 · 拦截 / 违规 / 失败任务 / 漂移(零新后端)"}),e.jsx("div",{style:{flex:1}}),e.jsxs(i.Text,{type:"secondary",style:{fontSize:12},children:["拦截 ",e.jsx(i.Text,{style:{fontWeight:600,color:"rgb(var(--red-6))"},children:o.intercept})]}),e.jsxs(i.Text,{type:"secondary",style:{fontSize:12},children:["违规 ",e.jsx(i.Text,{style:{fontWeight:600,color:"rgb(var(--orange-6))"},children:o.violation})]}),e.jsxs(i.Text,{type:"secondary",style:{fontSize:12},children:["失败 ",e.jsx(i.Text,{style:{fontWeight:600,color:"rgb(var(--red-6))"},children:o.failure})]}),e.jsxs(i.Text,{type:"secondary",style:{fontSize:12},children:["漂移 ",e.jsx(i.Text,{style:{fontWeight:600,color:"rgb(var(--gold-6))"},children:o.drift})]})]}),(f||g||d)&&e.jsx(j,{type:"warning",style:{marginTop:12},content:e.jsxs("span",{style:{fontSize:12},children:["部分源降级:",f&&"违规拦截源不可用;",g&&"失败任务源不可用;",d&&"漂移源不可用(/api/drift/report 报错,已降级跳过漂移项);","其余源照常合并。"]})}),w&&e.jsx(j,{type:"warning",style:{marginTop:12},content:e.jsx("span",{style:{fontSize:12},children:"失败任务可能因超出扫描上限少报:当前时间窗任务数超过分页扫描安全上限, 未扫描到的部分失败任务不在列表内。可缩短时间窗以覆盖更近期的任务。"})})]}),e.jsxs(T,{activeTab:k,onChange:s=>E(s),children:[e.jsx(u,{title:`拦截 / 违规 / 失败 ${c.length}`,children:e.jsx(a,{bordered:!0,style:{padding:0},children:e.jsx(P,{rowKey:"id",loading:I,data:c,columns:R,pagination:c.length>20?{pageSize:20,showTotal:!0}:!1,border:{wrapper:!1,cell:!1},onRow:s=>({onClick:()=>x(s.id),style:{cursor:"pointer"}})})})},"primary"),e.jsx(u,{title:`漂移 ${p.length}`,children:p.length===0?e.jsx(a,{bordered:!0,children:e.jsx(_,{description:d?"漂移源不可用(/api/drift/report 报错,已降级)":"近窗口内无合规漂移(所有 drift check 通过)"})}):e.jsx(G,{gutter:[16,16],children:p.map(s=>e.jsx(J,{xs:24,md:12,xl:8,children:e.jsx("div",{style:{cursor:"pointer"},onClick:()=>x(s.id),children:e.jsx(H,{issue:s})})},s.id))})},"drift")]})]})}export{se as default};
2
+ //# sourceMappingURL=IssuesPage-SKmhlCrw.js.map