@winspan/claude-forge 8.54.4 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (880) hide show
  1. package/DEVELOPMENT.md +649 -33
  2. package/README.md +154 -16
  3. package/dist/catalogs/agents.json +72 -0
  4. package/dist/catalogs/skills.json +194 -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/agents.d.ts +18 -0
  26. package/dist/cli/commands/agents.d.ts.map +1 -0
  27. package/dist/cli/commands/agents.js +160 -0
  28. package/dist/cli/commands/agents.js.map +1 -0
  29. package/dist/cli/commands/bypass.d.ts +18 -0
  30. package/dist/cli/commands/bypass.d.ts.map +1 -0
  31. package/dist/cli/commands/bypass.js +87 -0
  32. package/dist/cli/commands/bypass.js.map +1 -0
  33. package/dist/cli/commands/claudemd.d.ts +60 -0
  34. package/dist/cli/commands/claudemd.d.ts.map +1 -1
  35. package/dist/cli/commands/claudemd.js +174 -37
  36. package/dist/cli/commands/claudemd.js.map +1 -1
  37. package/dist/cli/commands/config.d.ts.map +1 -1
  38. package/dist/cli/commands/config.js +94 -1
  39. package/dist/cli/commands/config.js.map +1 -1
  40. package/dist/cli/commands/daemon.d.ts +39 -0
  41. package/dist/cli/commands/daemon.d.ts.map +1 -1
  42. package/dist/cli/commands/daemon.js +167 -20
  43. package/dist/cli/commands/daemon.js.map +1 -1
  44. package/dist/cli/commands/decisions.d.ts +129 -0
  45. package/dist/cli/commands/decisions.d.ts.map +1 -0
  46. package/dist/cli/commands/decisions.js +669 -0
  47. package/dist/cli/commands/decisions.js.map +1 -0
  48. package/dist/cli/commands/doctor.d.ts +29 -0
  49. package/dist/cli/commands/doctor.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor.js +124 -0
  51. package/dist/cli/commands/doctor.js.map +1 -0
  52. package/dist/cli/commands/entropy.d.ts +35 -0
  53. package/dist/cli/commands/entropy.d.ts.map +1 -0
  54. package/dist/cli/commands/entropy.js +121 -0
  55. package/dist/cli/commands/entropy.js.map +1 -0
  56. package/dist/cli/commands/executions.d.ts +1 -0
  57. package/dist/cli/commands/executions.d.ts.map +1 -1
  58. package/dist/cli/commands/executions.js +10 -1
  59. package/dist/cli/commands/executions.js.map +1 -1
  60. package/dist/cli/commands/fix.d.ts +31 -0
  61. package/dist/cli/commands/fix.d.ts.map +1 -0
  62. package/dist/cli/commands/fix.js +108 -0
  63. package/dist/cli/commands/fix.js.map +1 -0
  64. package/dist/cli/commands/governance.d.ts +21 -0
  65. package/dist/cli/commands/governance.d.ts.map +1 -0
  66. package/dist/cli/commands/governance.js +60 -0
  67. package/dist/cli/commands/governance.js.map +1 -0
  68. package/dist/cli/commands/init.d.ts +27 -0
  69. package/dist/cli/commands/init.d.ts.map +1 -1
  70. package/dist/cli/commands/init.js +158 -146
  71. package/dist/cli/commands/init.js.map +1 -1
  72. package/dist/cli/commands/insights-goal-check.d.ts +50 -0
  73. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
  74. package/dist/cli/commands/insights-goal-check.js +318 -0
  75. package/dist/cli/commands/insights-goal-check.js.map +1 -0
  76. package/dist/cli/commands/insights.d.ts +15 -0
  77. package/dist/cli/commands/insights.d.ts.map +1 -0
  78. package/dist/cli/commands/insights.js +127 -0
  79. package/dist/cli/commands/insights.js.map +1 -0
  80. package/dist/cli/commands/knowledge.d.ts +66 -0
  81. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  82. package/dist/cli/commands/knowledge.js +897 -0
  83. package/dist/cli/commands/knowledge.js.map +1 -0
  84. package/dist/cli/commands/mcp.d.ts +0 -12
  85. package/dist/cli/commands/mcp.d.ts.map +1 -1
  86. package/dist/cli/commands/mcp.js +11 -5
  87. package/dist/cli/commands/mcp.js.map +1 -1
  88. package/dist/cli/commands/menu.d.ts.map +1 -1
  89. package/dist/cli/commands/menu.js +10 -184
  90. package/dist/cli/commands/menu.js.map +1 -1
  91. package/dist/cli/commands/project.d.ts +98 -0
  92. package/dist/cli/commands/project.d.ts.map +1 -0
  93. package/dist/cli/commands/project.js +382 -0
  94. package/dist/cli/commands/project.js.map +1 -0
  95. package/dist/cli/commands/skills.d.ts.map +1 -1
  96. package/dist/cli/commands/skills.js +14 -128
  97. package/dist/cli/commands/skills.js.map +1 -1
  98. package/dist/cli/commands/spec.d.ts +40 -0
  99. package/dist/cli/commands/spec.d.ts.map +1 -0
  100. package/dist/cli/commands/spec.js +49 -0
  101. package/dist/cli/commands/spec.js.map +1 -0
  102. package/dist/cli/commands/stats.d.ts.map +1 -1
  103. package/dist/cli/commands/stats.js +3 -2
  104. package/dist/cli/commands/stats.js.map +1 -1
  105. package/dist/cli/commands/status.d.ts.map +1 -1
  106. package/dist/cli/commands/status.js +17 -2
  107. package/dist/cli/commands/status.js.map +1 -1
  108. package/dist/cli/commands/trace.d.ts.map +1 -1
  109. package/dist/cli/commands/trace.js +4 -9
  110. package/dist/cli/commands/trace.js.map +1 -1
  111. package/dist/cli/commands/violations.d.ts +14 -0
  112. package/dist/cli/commands/violations.d.ts.map +1 -0
  113. package/dist/cli/commands/violations.js +43 -0
  114. package/dist/cli/commands/violations.js.map +1 -0
  115. package/dist/cli/index.js +26 -0
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/init/hook-manager.d.ts +1 -1
  118. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  119. package/dist/cli/init/hook-manager.js +6 -0
  120. package/dist/cli/init/hook-manager.js.map +1 -1
  121. package/dist/cli/utils/resolve-session.d.ts +32 -0
  122. package/dist/cli/utils/resolve-session.d.ts.map +1 -0
  123. package/dist/cli/utils/resolve-session.js +39 -0
  124. package/dist/cli/utils/resolve-session.js.map +1 -0
  125. package/dist/core/config.d.ts +4 -1
  126. package/dist/core/config.d.ts.map +1 -1
  127. package/dist/core/config.js +11 -23
  128. package/dist/core/config.js.map +1 -1
  129. package/dist/core/constants.d.ts +14 -13
  130. package/dist/core/constants.d.ts.map +1 -1
  131. package/dist/core/constants.js +20 -13
  132. package/dist/core/constants.js.map +1 -1
  133. package/dist/core/diagnostics/checks.d.ts +151 -0
  134. package/dist/core/diagnostics/checks.d.ts.map +1 -0
  135. package/dist/core/diagnostics/checks.js +765 -0
  136. package/dist/core/diagnostics/checks.js.map +1 -0
  137. package/dist/core/diagnostics/daemon-status.d.ts +77 -0
  138. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
  139. package/dist/core/diagnostics/daemon-status.js +113 -0
  140. package/dist/core/diagnostics/daemon-status.js.map +1 -0
  141. package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
  142. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
  143. package/dist/core/diagnostics/entropy-checks.js +395 -0
  144. package/dist/core/diagnostics/entropy-checks.js.map +1 -0
  145. package/dist/core/diagnostics/fix-runner.d.ts +54 -0
  146. package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
  147. package/dist/core/diagnostics/fix-runner.js +90 -0
  148. package/dist/core/diagnostics/fix-runner.js.map +1 -0
  149. package/dist/core/diagnostics/knip-runner.d.ts +49 -0
  150. package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
  151. package/dist/core/diagnostics/knip-runner.js +100 -0
  152. package/dist/core/diagnostics/knip-runner.js.map +1 -0
  153. package/dist/core/diagnostics/markers.d.ts +96 -0
  154. package/dist/core/diagnostics/markers.d.ts.map +1 -0
  155. package/dist/core/diagnostics/markers.js +153 -0
  156. package/dist/core/diagnostics/markers.js.map +1 -0
  157. package/dist/core/governance/global-inject.d.ts +60 -0
  158. package/dist/core/governance/global-inject.d.ts.map +1 -0
  159. package/dist/core/governance/global-inject.js +129 -0
  160. package/dist/core/governance/global-inject.js.map +1 -0
  161. package/dist/core/queue/index.d.ts +16 -3
  162. package/dist/core/queue/index.d.ts.map +1 -1
  163. package/dist/core/queue/index.js +14 -3
  164. package/dist/core/queue/index.js.map +1 -1
  165. package/dist/core/storage/base.d.ts +158 -0
  166. package/dist/core/storage/base.d.ts.map +1 -1
  167. package/dist/core/storage/base.js +570 -0
  168. package/dist/core/storage/base.js.map +1 -1
  169. package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
  170. package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
  171. package/dist/core/storage/codec/tool-input-codec.js +159 -0
  172. package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
  173. package/dist/core/storage/decisions.d.ts +362 -0
  174. package/dist/core/storage/decisions.d.ts.map +1 -0
  175. package/dist/core/storage/decisions.js +502 -0
  176. package/dist/core/storage/decisions.js.map +1 -0
  177. package/dist/core/storage/events.d.ts +112 -8
  178. package/dist/core/storage/events.d.ts.map +1 -1
  179. package/dist/core/storage/events.js +390 -39
  180. package/dist/core/storage/events.js.map +1 -1
  181. package/dist/core/storage/feedback.d.ts +131 -0
  182. package/dist/core/storage/feedback.d.ts.map +1 -0
  183. package/dist/core/storage/feedback.js +187 -0
  184. package/dist/core/storage/feedback.js.map +1 -0
  185. package/dist/core/storage/forge-config.d.ts +40 -0
  186. package/dist/core/storage/forge-config.d.ts.map +1 -0
  187. package/dist/core/storage/forge-config.js +65 -0
  188. package/dist/core/storage/forge-config.js.map +1 -0
  189. package/dist/core/storage/injections.d.ts +28 -0
  190. package/dist/core/storage/injections.d.ts.map +1 -1
  191. package/dist/core/storage/injections.js +62 -5
  192. package/dist/core/storage/injections.js.map +1 -1
  193. package/dist/core/storage/knowledge.d.ts +106 -0
  194. package/dist/core/storage/knowledge.d.ts.map +1 -0
  195. package/dist/core/storage/knowledge.js +202 -0
  196. package/dist/core/storage/knowledge.js.map +1 -0
  197. package/dist/core/storage/maintenance.d.ts +36 -9
  198. package/dist/core/storage/maintenance.d.ts.map +1 -1
  199. package/dist/core/storage/maintenance.js +56 -24
  200. package/dist/core/storage/maintenance.js.map +1 -1
  201. package/dist/core/storage/pipeline-rollup.d.ts +117 -0
  202. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
  203. package/dist/core/storage/pipeline-rollup.js +471 -0
  204. package/dist/core/storage/pipeline-rollup.js.map +1 -0
  205. package/dist/core/storage/routing.d.ts +16 -3
  206. package/dist/core/storage/routing.d.ts.map +1 -1
  207. package/dist/core/storage/routing.js +39 -8
  208. package/dist/core/storage/routing.js.map +1 -1
  209. package/dist/core/storage/rows.d.ts +50 -7
  210. package/dist/core/storage/rows.d.ts.map +1 -1
  211. package/dist/core/storage/schema.sql +302 -23
  212. package/dist/core/storage/sessions.d.ts +136 -0
  213. package/dist/core/storage/sessions.d.ts.map +1 -1
  214. package/dist/core/storage/sessions.js +351 -15
  215. package/dist/core/storage/sessions.js.map +1 -1
  216. package/dist/core/storage/skills.d.ts +1 -0
  217. package/dist/core/storage/skills.d.ts.map +1 -1
  218. package/dist/core/storage/skills.js +21 -6
  219. package/dist/core/storage/skills.js.map +1 -1
  220. package/dist/core/storage/sqlite.d.ts +253 -20
  221. package/dist/core/storage/sqlite.d.ts.map +1 -1
  222. package/dist/core/storage/sqlite.js +425 -16
  223. package/dist/core/storage/sqlite.js.map +1 -1
  224. package/dist/core/storage/tasks.d.ts +474 -2
  225. package/dist/core/storage/tasks.d.ts.map +1 -1
  226. package/dist/core/storage/tasks.js +1213 -18
  227. package/dist/core/storage/tasks.js.map +1 -1
  228. package/dist/core/storage/tool-intercepts.d.ts +69 -0
  229. package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
  230. package/dist/core/storage/tool-intercepts.js +116 -0
  231. package/dist/core/storage/tool-intercepts.js.map +1 -0
  232. package/dist/core/storage/workflow-recommendations.d.ts +124 -0
  233. package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
  234. package/dist/core/storage/workflow-recommendations.js +274 -0
  235. package/dist/core/storage/workflow-recommendations.js.map +1 -0
  236. package/dist/core/types.d.ts +112 -17
  237. package/dist/core/types.d.ts.map +1 -1
  238. package/dist/core/types.js +12 -0
  239. package/dist/core/types.js.map +1 -1
  240. package/dist/core/utils/backup.d.ts +81 -0
  241. package/dist/core/utils/backup.d.ts.map +1 -0
  242. package/dist/core/utils/backup.js +98 -0
  243. package/dist/core/utils/backup.js.map +1 -0
  244. package/dist/core/utils/binary-paths.d.ts +92 -0
  245. package/dist/core/utils/binary-paths.d.ts.map +1 -0
  246. package/dist/core/utils/binary-paths.js +166 -0
  247. package/dist/core/utils/binary-paths.js.map +1 -0
  248. package/dist/core/utils/bypass-token.d.ts +75 -0
  249. package/dist/core/utils/bypass-token.d.ts.map +1 -0
  250. package/dist/core/utils/bypass-token.js +133 -0
  251. package/dist/core/utils/bypass-token.js.map +1 -0
  252. package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
  253. package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
  254. package/dist/core/utils/cc-builtin-agents.js +29 -0
  255. package/dist/core/utils/cc-builtin-agents.js.map +1 -0
  256. package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
  257. package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
  258. package/dist/core/utils/claude-cli-spawn.js +219 -0
  259. package/dist/core/utils/claude-cli-spawn.js.map +1 -0
  260. package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
  261. package/dist/core/utils/forge-resume-block.js +3 -2
  262. package/dist/core/utils/forge-resume-block.js.map +1 -1
  263. package/dist/core/utils/logger.d.ts +15 -3
  264. package/dist/core/utils/logger.d.ts.map +1 -1
  265. package/dist/core/utils/logger.js +20 -2
  266. package/dist/core/utils/logger.js.map +1 -1
  267. package/dist/core/utils/noise-prompt.d.ts +97 -0
  268. package/dist/core/utils/noise-prompt.d.ts.map +1 -0
  269. package/dist/core/utils/noise-prompt.js +127 -0
  270. package/dist/core/utils/noise-prompt.js.map +1 -0
  271. package/dist/core/utils/path.d.ts +0 -4
  272. package/dist/core/utils/path.d.ts.map +1 -1
  273. package/dist/core/utils/path.js +0 -7
  274. package/dist/core/utils/path.js.map +1 -1
  275. package/dist/core/utils/time.d.ts +41 -0
  276. package/dist/core/utils/time.d.ts.map +1 -1
  277. package/dist/core/utils/time.js +114 -0
  278. package/dist/core/utils/time.js.map +1 -1
  279. package/dist/daemon/agent-sync.d.ts +24 -0
  280. package/dist/daemon/agent-sync.d.ts.map +1 -0
  281. package/dist/daemon/agent-sync.js +114 -0
  282. package/dist/daemon/agent-sync.js.map +1 -0
  283. package/dist/daemon/config-store.d.ts +55 -0
  284. package/dist/daemon/config-store.d.ts.map +1 -0
  285. package/dist/daemon/config-store.js +137 -0
  286. package/dist/daemon/config-store.js.map +1 -0
  287. package/dist/daemon/event-parser.d.ts +22 -0
  288. package/dist/daemon/event-parser.d.ts.map +1 -1
  289. package/dist/daemon/event-parser.js +49 -3
  290. package/dist/daemon/event-parser.js.map +1 -1
  291. package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
  292. package/dist/daemon/handlers/history-exporter.js +9 -8
  293. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  294. package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
  295. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  296. package/dist/daemon/handlers/post-tool-use.js +261 -8
  297. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  298. package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
  299. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
  300. package/dist/daemon/handlers/pre-tool-use.js +585 -0
  301. package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
  302. package/dist/daemon/handlers/stop.d.ts +35 -7
  303. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  304. package/dist/daemon/handlers/stop.js +157 -8
  305. package/dist/daemon/handlers/stop.js.map +1 -1
  306. package/dist/daemon/handlers/user-prompt.d.ts +36 -14
  307. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  308. package/dist/daemon/handlers/user-prompt.js +135 -48
  309. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  310. package/dist/daemon/hook-sync.d.ts.map +1 -1
  311. package/dist/daemon/hook-sync.js +2 -1
  312. package/dist/daemon/hook-sync.js.map +1 -1
  313. package/dist/daemon/index.d.ts.map +1 -1
  314. package/dist/daemon/index.js +471 -43
  315. package/dist/daemon/index.js.map +1 -1
  316. package/dist/daemon/lifecycle.d.ts +48 -1
  317. package/dist/daemon/lifecycle.d.ts.map +1 -1
  318. package/dist/daemon/lifecycle.js +98 -2
  319. package/dist/daemon/lifecycle.js.map +1 -1
  320. package/dist/daemon/router.d.ts +4 -1
  321. package/dist/daemon/router.d.ts.map +1 -1
  322. package/dist/daemon/router.js +4 -2
  323. package/dist/daemon/router.js.map +1 -1
  324. package/dist/daemon/rules/defaults.d.ts +20 -0
  325. package/dist/daemon/rules/defaults.d.ts.map +1 -0
  326. package/dist/daemon/rules/defaults.js +692 -0
  327. package/dist/daemon/rules/defaults.js.map +1 -0
  328. package/dist/daemon/rules/registry.d.ts +47 -0
  329. package/dist/daemon/rules/registry.d.ts.map +1 -0
  330. package/dist/daemon/rules/registry.js +84 -0
  331. package/dist/daemon/rules/registry.js.map +1 -0
  332. package/dist/daemon/rules/types.d.ts +170 -0
  333. package/dist/daemon/rules/types.d.ts.map +1 -0
  334. package/dist/daemon/rules/types.js +15 -0
  335. package/dist/daemon/rules/types.js.map +1 -0
  336. package/dist/daemon/rules/whitelist.d.ts +101 -0
  337. package/dist/daemon/rules/whitelist.d.ts.map +1 -0
  338. package/dist/daemon/rules/whitelist.js +210 -0
  339. package/dist/daemon/rules/whitelist.js.map +1 -0
  340. package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
  341. package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
  342. package/dist/daemon/rules/workflow-defaults.js +521 -0
  343. package/dist/daemon/rules/workflow-defaults.js.map +1 -0
  344. package/dist/daemon/server.d.ts +11 -1
  345. package/dist/daemon/server.d.ts.map +1 -1
  346. package/dist/daemon/server.js +7 -1
  347. package/dist/daemon/server.js.map +1 -1
  348. package/dist/daemon/services/context-injector.d.ts +34 -0
  349. package/dist/daemon/services/context-injector.d.ts.map +1 -0
  350. package/dist/daemon/services/context-injector.js +61 -0
  351. package/dist/daemon/services/context-injector.js.map +1 -0
  352. package/dist/daemon/services/decision-hint.d.ts +203 -0
  353. package/dist/daemon/services/decision-hint.d.ts.map +1 -0
  354. package/dist/daemon/services/decision-hint.js +487 -0
  355. package/dist/daemon/services/decision-hint.js.map +1 -0
  356. package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
  357. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
  358. package/dist/daemon/services/event-ttl-sweep.js +123 -0
  359. package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
  360. package/dist/daemon/services/experience-extractor.d.ts +67 -0
  361. package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
  362. package/dist/daemon/services/experience-extractor.js +323 -0
  363. package/dist/daemon/services/experience-extractor.js.map +1 -0
  364. package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
  365. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
  366. package/dist/daemon/services/feedback-aggregator.js +455 -0
  367. package/dist/daemon/services/feedback-aggregator.js.map +1 -0
  368. package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
  369. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
  370. package/dist/daemon/services/heartbeat-writer.js +111 -0
  371. package/dist/daemon/services/heartbeat-writer.js.map +1 -0
  372. package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
  373. package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
  374. package/dist/daemon/services/idle-session-sweeper.js +94 -0
  375. package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
  376. package/dist/daemon/services/idle-task-budget.d.ts +50 -0
  377. package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
  378. package/dist/daemon/services/idle-task-budget.js +72 -0
  379. package/dist/daemon/services/idle-task-budget.js.map +1 -0
  380. package/dist/daemon/services/intercept-revive.d.ts +60 -0
  381. package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
  382. package/dist/daemon/services/intercept-revive.js +86 -0
  383. package/dist/daemon/services/intercept-revive.js.map +1 -0
  384. package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
  385. package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
  386. package/dist/daemon/services/intercept-rollback-guard.js +152 -0
  387. package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
  388. package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
  389. package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
  390. package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
  391. package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
  392. package/dist/daemon/services/kb-injector.d.ts +57 -0
  393. package/dist/daemon/services/kb-injector.d.ts.map +1 -0
  394. package/dist/daemon/services/kb-injector.js +140 -0
  395. package/dist/daemon/services/kb-injector.js.map +1 -0
  396. package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
  397. package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
  398. package/dist/daemon/services/outcome-classification-service.js +214 -0
  399. package/dist/daemon/services/outcome-classification-service.js.map +1 -0
  400. package/dist/daemon/services/outcome-classifier.d.ts +136 -0
  401. package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
  402. package/dist/daemon/services/outcome-classifier.js +178 -0
  403. package/dist/daemon/services/outcome-classifier.js.map +1 -0
  404. package/dist/daemon/services/outcome-nudge.d.ts +107 -0
  405. package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
  406. package/dist/daemon/services/outcome-nudge.js +242 -0
  407. package/dist/daemon/services/outcome-nudge.js.map +1 -0
  408. package/dist/daemon/services/spec-approval.d.ts +127 -0
  409. package/dist/daemon/services/spec-approval.d.ts.map +1 -0
  410. package/dist/daemon/services/spec-approval.js +216 -0
  411. package/dist/daemon/services/spec-approval.js.map +1 -0
  412. package/dist/daemon/services/spec-gate.d.ts +54 -0
  413. package/dist/daemon/services/spec-gate.d.ts.map +1 -0
  414. package/dist/daemon/services/spec-gate.js +113 -0
  415. package/dist/daemon/services/spec-gate.js.map +1 -0
  416. package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
  417. package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
  418. package/dist/daemon/services/task-boundary-classifier.js +202 -0
  419. package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
  420. package/dist/daemon/services/task-segmenter.d.ts +219 -1
  421. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  422. package/dist/daemon/services/task-segmenter.js +481 -17
  423. package/dist/daemon/services/task-segmenter.js.map +1 -1
  424. package/dist/daemon/services/violation-reporter.d.ts +130 -0
  425. package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
  426. package/dist/daemon/services/violation-reporter.js +339 -0
  427. package/dist/daemon/services/violation-reporter.js.map +1 -0
  428. package/dist/daemon/skill-sync.d.ts +7 -2
  429. package/dist/daemon/skill-sync.d.ts.map +1 -1
  430. package/dist/daemon/skill-sync.js +114 -9
  431. package/dist/daemon/skill-sync.js.map +1 -1
  432. package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
  433. package/dist/daemon/templates/agents/coder.md +105 -0
  434. package/dist/daemon/templates/agents/decision-maker.md +460 -0
  435. package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
  436. package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
  437. package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
  438. package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
  439. package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
  440. package/dist/daemon/templates/agents/patch-applier.md +144 -0
  441. package/dist/daemon/templates/agents/planner.md +165 -0
  442. package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
  443. package/dist/daemon/templates/agents/skill-distiller.md +113 -0
  444. package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
  445. package/dist/daemon/templates/agents/verify-agent.md +136 -0
  446. package/dist/daemon/utils/inject-block.d.ts +39 -0
  447. package/dist/daemon/utils/inject-block.d.ts.map +1 -0
  448. package/dist/daemon/utils/inject-block.js +25 -0
  449. package/dist/daemon/utils/inject-block.js.map +1 -0
  450. package/dist/hooks/hook-lib.sh +8 -0
  451. package/dist/hooks/notification.sh +19 -8
  452. package/dist/hooks/post-tool-use.sh +41 -23
  453. package/dist/hooks/pre-tool-use.sh +54 -23
  454. package/dist/hooks/session-start.sh +68 -0
  455. package/dist/hooks/stop.sh +24 -10
  456. package/dist/hooks/user-prompt-submit.sh +37 -21
  457. package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
  458. package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
  459. package/dist/knowledge/adapters/go-adapter.js +294 -0
  460. package/dist/knowledge/adapters/go-adapter.js.map +1 -0
  461. package/dist/knowledge/adapters/index.d.ts +41 -0
  462. package/dist/knowledge/adapters/index.d.ts.map +1 -0
  463. package/dist/knowledge/adapters/index.js +71 -0
  464. package/dist/knowledge/adapters/index.js.map +1 -0
  465. package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
  466. package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
  467. package/dist/knowledge/adapters/java-adapter.js +260 -0
  468. package/dist/knowledge/adapters/java-adapter.js.map +1 -0
  469. package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
  470. package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
  471. package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
  472. package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
  473. package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
  474. package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
  475. package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
  476. package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
  477. package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
  478. package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
  479. package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
  480. package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
  481. package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
  482. package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
  483. package/dist/knowledge/adapters/python-adapter.js +358 -0
  484. package/dist/knowledge/adapters/python-adapter.js.map +1 -0
  485. package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
  486. package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
  487. package/dist/knowledge/adapters/rust-adapter.js +329 -0
  488. package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
  489. package/dist/knowledge/adapters/types.d.ts +99 -0
  490. package/dist/knowledge/adapters/types.d.ts.map +1 -0
  491. package/dist/knowledge/adapters/types.js +17 -0
  492. package/dist/knowledge/adapters/types.js.map +1 -0
  493. package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
  494. package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
  495. package/dist/knowledge/adapters/typescript-adapter.js +171 -0
  496. package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
  497. package/dist/knowledge/audit-applier.d.ts +70 -0
  498. package/dist/knowledge/audit-applier.d.ts.map +1 -0
  499. package/dist/knowledge/audit-applier.js +251 -0
  500. package/dist/knowledge/audit-applier.js.map +1 -0
  501. package/dist/knowledge/builder.d.ts +261 -0
  502. package/dist/knowledge/builder.d.ts.map +1 -0
  503. package/dist/knowledge/builder.js +937 -0
  504. package/dist/knowledge/builder.js.map +1 -0
  505. package/dist/knowledge/cli-provider.d.ts +151 -0
  506. package/dist/knowledge/cli-provider.d.ts.map +1 -0
  507. package/dist/knowledge/cli-provider.js +313 -0
  508. package/dist/knowledge/cli-provider.js.map +1 -0
  509. package/dist/knowledge/constants.d.ts +73 -0
  510. package/dist/knowledge/constants.d.ts.map +1 -0
  511. package/dist/knowledge/constants.js +93 -0
  512. package/dist/knowledge/constants.js.map +1 -0
  513. package/dist/knowledge/cross-module.d.ts +139 -0
  514. package/dist/knowledge/cross-module.d.ts.map +1 -0
  515. package/dist/knowledge/cross-module.js +370 -0
  516. package/dist/knowledge/cross-module.js.map +1 -0
  517. package/dist/knowledge/git-hooks.d.ts +67 -0
  518. package/dist/knowledge/git-hooks.d.ts.map +1 -0
  519. package/dist/knowledge/git-hooks.js +258 -0
  520. package/dist/knowledge/git-hooks.js.map +1 -0
  521. package/dist/knowledge/module-hash.d.ts +88 -0
  522. package/dist/knowledge/module-hash.d.ts.map +1 -0
  523. package/dist/knowledge/module-hash.js +162 -0
  524. package/dist/knowledge/module-hash.js.map +1 -0
  525. package/dist/knowledge/project-detector.d.ts +101 -0
  526. package/dist/knowledge/project-detector.d.ts.map +1 -0
  527. package/dist/knowledge/project-detector.js +223 -0
  528. package/dist/knowledge/project-detector.js.map +1 -0
  529. package/dist/knowledge/prompt.d.ts +228 -0
  530. package/dist/knowledge/prompt.d.ts.map +1 -0
  531. package/dist/knowledge/prompt.js +404 -0
  532. package/dist/knowledge/prompt.js.map +1 -0
  533. package/dist/knowledge/query.d.ts +105 -0
  534. package/dist/knowledge/query.d.ts.map +1 -0
  535. package/dist/knowledge/query.js +341 -0
  536. package/dist/knowledge/query.js.map +1 -0
  537. package/dist/knowledge/repo-map.d.ts +91 -0
  538. package/dist/knowledge/repo-map.d.ts.map +1 -0
  539. package/dist/knowledge/repo-map.js +408 -0
  540. package/dist/knowledge/repo-map.js.map +1 -0
  541. package/dist/knowledge/tools/index.d.ts +14 -0
  542. package/dist/knowledge/tools/index.d.ts.map +1 -0
  543. package/dist/knowledge/tools/index.js +11 -0
  544. package/dist/knowledge/tools/index.js.map +1 -0
  545. package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
  546. package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
  547. package/dist/knowledge/tools/knowledge-get-page.js +101 -0
  548. package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
  549. package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
  550. package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
  551. package/dist/knowledge/tools/knowledge-query.js +104 -0
  552. package/dist/knowledge/tools/knowledge-query.js.map +1 -0
  553. package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
  554. package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
  555. package/dist/knowledge/tools/repo-map-lookup.js +82 -0
  556. package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
  557. package/dist/knowledge/types.d.ts +269 -0
  558. package/dist/knowledge/types.d.ts.map +1 -0
  559. package/dist/knowledge/types.js +10 -0
  560. package/dist/knowledge/types.js.map +1 -0
  561. package/dist/knowledge/validator.d.ts +90 -0
  562. package/dist/knowledge/validator.d.ts.map +1 -0
  563. package/dist/knowledge/validator.js +288 -0
  564. package/dist/knowledge/validator.js.map +1 -0
  565. package/dist/mcp/server.d.ts.map +1 -1
  566. package/dist/mcp/server.js +222 -1
  567. package/dist/mcp/server.js.map +1 -1
  568. package/dist/skills/builtin-skills.d.ts +35 -0
  569. package/dist/skills/builtin-skills.d.ts.map +1 -0
  570. package/dist/skills/builtin-skills.js +68 -0
  571. package/dist/skills/builtin-skills.js.map +1 -0
  572. package/dist/skills/distill/attribution.d.ts +59 -0
  573. package/dist/skills/distill/attribution.d.ts.map +1 -0
  574. package/dist/skills/distill/attribution.js +101 -0
  575. package/dist/skills/distill/attribution.js.map +1 -0
  576. package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
  577. package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
  578. package/dist/skills/distill/claude-cli-resolver.js +115 -0
  579. package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
  580. package/dist/skills/distill/distiller.d.ts +161 -0
  581. package/dist/skills/distill/distiller.d.ts.map +1 -0
  582. package/dist/skills/distill/distiller.js +461 -0
  583. package/dist/skills/distill/distiller.js.map +1 -0
  584. package/dist/skills/distill/index.d.ts +223 -0
  585. package/dist/skills/distill/index.d.ts.map +1 -0
  586. package/dist/skills/distill/index.js +466 -0
  587. package/dist/skills/distill/index.js.map +1 -0
  588. package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
  589. package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
  590. package/dist/skills/distill/project-anchor-guard.js +334 -0
  591. package/dist/skills/distill/project-anchor-guard.js.map +1 -0
  592. package/dist/skills/distill/topic-deduper.d.ts +77 -0
  593. package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
  594. package/dist/skills/distill/topic-deduper.js +119 -0
  595. package/dist/skills/distill/topic-deduper.js.map +1 -0
  596. package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
  597. package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
  598. package/dist/skills/distill/upstream-fetcher.js +202 -0
  599. package/dist/skills/distill/upstream-fetcher.js.map +1 -0
  600. package/dist/skills/distilled/distilled-api-design.md +491 -0
  601. package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
  602. package/dist/skills/distilled/distilled-creator.md +178 -0
  603. package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
  604. package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
  605. package/dist/skills/distilled/distilled-executing-plans.md +113 -0
  606. package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
  607. package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
  608. package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
  609. package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
  610. package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
  611. package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
  612. package/dist/skills/keyword-score.d.ts +29 -0
  613. package/dist/skills/keyword-score.d.ts.map +1 -0
  614. package/dist/skills/keyword-score.js +54 -0
  615. package/dist/skills/keyword-score.js.map +1 -0
  616. package/dist/skills/registry.d.ts +64 -20
  617. package/dist/skills/registry.d.ts.map +1 -1
  618. package/dist/skills/registry.js +102 -105
  619. package/dist/skills/registry.js.map +1 -1
  620. package/dist/skills/tools/pipeline-suggest.js +14 -14
  621. package/dist/skills/tools/skill-invoke.d.ts +1 -1
  622. package/dist/skills/tools/skill-invoke.js +1 -1
  623. package/dist/web/routes/agent-content.d.ts +30 -0
  624. package/dist/web/routes/agent-content.d.ts.map +1 -0
  625. package/dist/web/routes/agent-content.js +139 -0
  626. package/dist/web/routes/agent-content.js.map +1 -0
  627. package/dist/web/routes/decisions.d.ts +15 -0
  628. package/dist/web/routes/decisions.d.ts.map +1 -0
  629. package/dist/web/routes/decisions.js +181 -0
  630. package/dist/web/routes/decisions.js.map +1 -0
  631. package/dist/web/routes/diagnostics.d.ts +61 -0
  632. package/dist/web/routes/diagnostics.d.ts.map +1 -0
  633. package/dist/web/routes/diagnostics.js +203 -0
  634. package/dist/web/routes/diagnostics.js.map +1 -0
  635. package/dist/web/routes/events.d.ts.map +1 -1
  636. package/dist/web/routes/events.js +24 -0
  637. package/dist/web/routes/events.js.map +1 -1
  638. package/dist/web/routes/health.d.ts +33 -0
  639. package/dist/web/routes/health.d.ts.map +1 -0
  640. package/dist/web/routes/health.js +37 -0
  641. package/dist/web/routes/health.js.map +1 -0
  642. package/dist/web/routes/insights.d.ts +0 -5
  643. package/dist/web/routes/insights.d.ts.map +1 -1
  644. package/dist/web/routes/insights.js +783 -2
  645. package/dist/web/routes/insights.js.map +1 -1
  646. package/dist/web/routes/knowledge.d.ts +16 -0
  647. package/dist/web/routes/knowledge.d.ts.map +1 -0
  648. package/dist/web/routes/knowledge.js +661 -0
  649. package/dist/web/routes/knowledge.js.map +1 -0
  650. package/dist/web/routes/patch.d.ts +60 -1
  651. package/dist/web/routes/patch.d.ts.map +1 -1
  652. package/dist/web/routes/patch.js +170 -64
  653. package/dist/web/routes/patch.js.map +1 -1
  654. package/dist/web/routes/pipeline.d.ts +37 -0
  655. package/dist/web/routes/pipeline.d.ts.map +1 -0
  656. package/dist/web/routes/pipeline.js +149 -0
  657. package/dist/web/routes/pipeline.js.map +1 -0
  658. package/dist/web/routes/rules.d.ts.map +1 -1
  659. package/dist/web/routes/rules.js +6 -1
  660. package/dist/web/routes/rules.js.map +1 -1
  661. package/dist/web/routes/sessions.d.ts.map +1 -1
  662. package/dist/web/routes/sessions.js +9 -1
  663. package/dist/web/routes/sessions.js.map +1 -1
  664. package/dist/web/routes/skill-content.d.ts +30 -0
  665. package/dist/web/routes/skill-content.d.ts.map +1 -0
  666. package/dist/web/routes/skill-content.js +117 -0
  667. package/dist/web/routes/skill-content.js.map +1 -0
  668. package/dist/web/routes/skills-distill.d.ts +29 -0
  669. package/dist/web/routes/skills-distill.d.ts.map +1 -0
  670. package/dist/web/routes/skills-distill.js +552 -0
  671. package/dist/web/routes/skills-distill.js.map +1 -0
  672. package/dist/web/routes/skills.js +7 -7
  673. package/dist/web/routes/skills.js.map +1 -1
  674. package/dist/web/routes/task-timeline.d.ts +102 -0
  675. package/dist/web/routes/task-timeline.d.ts.map +1 -0
  676. package/dist/web/routes/task-timeline.js +274 -0
  677. package/dist/web/routes/task-timeline.js.map +1 -0
  678. package/dist/web/routes/tasks.d.ts.map +1 -1
  679. package/dist/web/routes/tasks.js +355 -8
  680. package/dist/web/routes/tasks.js.map +1 -1
  681. package/dist/web/routes/trace.d.ts.map +1 -1
  682. package/dist/web/routes/trace.js +3 -2
  683. package/dist/web/routes/trace.js.map +1 -1
  684. package/dist/web/routes/types.d.ts +0 -4
  685. package/dist/web/routes/types.d.ts.map +1 -1
  686. package/dist/web/routes/types.js +1 -1
  687. package/dist/web/routes/types.js.map +1 -1
  688. package/dist/web/routes/violations.d.ts +14 -0
  689. package/dist/web/routes/violations.d.ts.map +1 -0
  690. package/dist/web/routes/violations.js +111 -0
  691. package/dist/web/routes/violations.js.map +1 -0
  692. package/dist/web/server.d.ts.map +1 -1
  693. package/dist/web/server.js +79 -19
  694. package/dist/web/server.js.map +1 -1
  695. package/dist/web/services/build-manager.d.ts +72 -0
  696. package/dist/web/services/build-manager.d.ts.map +1 -0
  697. package/dist/web/services/build-manager.js +189 -0
  698. package/dist/web/services/build-manager.js.map +1 -0
  699. package/dist/web/services/distill-manager.d.ts +125 -0
  700. package/dist/web/services/distill-manager.d.ts.map +1 -0
  701. package/dist/web/services/distill-manager.js +308 -0
  702. package/dist/web/services/distill-manager.js.map +1 -0
  703. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
  704. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
  705. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
  706. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
  707. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
  708. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
  709. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
  710. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
  711. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
  712. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
  713. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
  714. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
  715. package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
  716. package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
  717. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
  718. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
  719. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
  720. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
  721. package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
  722. package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
  723. package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
  724. package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
  725. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
  726. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
  727. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
  728. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
  729. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
  730. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
  731. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
  732. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
  733. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
  734. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
  735. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
  736. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
  737. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
  738. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
  739. package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
  740. package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
  741. package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
  742. package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
  743. package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
  744. package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
  745. package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
  746. package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
  747. package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
  748. package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
  749. package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
  750. package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
  751. package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
  752. package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
  753. package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
  754. package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
  755. package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
  756. package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
  757. package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
  758. package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
  759. package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
  760. package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
  761. package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
  762. package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
  763. package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
  764. package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
  765. package/dist/web/static/index.html +12 -8
  766. package/package.json +14 -3
  767. package/dist/core/ai/provider.d.ts +0 -63
  768. package/dist/core/ai/provider.d.ts.map +0 -1
  769. package/dist/core/ai/provider.js +0 -241
  770. package/dist/core/ai/provider.js.map +0 -1
  771. package/dist/core/ai/types.d.ts +0 -43
  772. package/dist/core/ai/types.d.ts.map +0 -1
  773. package/dist/core/ai/types.js +0 -5
  774. package/dist/core/ai/types.js.map +0 -1
  775. package/dist/core/storage/token-usage.d.ts +0 -36
  776. package/dist/core/storage/token-usage.d.ts.map +0 -1
  777. package/dist/core/storage/token-usage.js +0 -59
  778. package/dist/core/storage/token-usage.js.map +0 -1
  779. package/dist/core/utils/token-tracker.d.ts +0 -39
  780. package/dist/core/utils/token-tracker.d.ts.map +0 -1
  781. package/dist/core/utils/token-tracker.js +0 -69
  782. package/dist/core/utils/token-tracker.js.map +0 -1
  783. package/dist/skills/index.d.ts +0 -3
  784. package/dist/skills/index.d.ts.map +0 -1
  785. package/dist/skills/index.js +0 -3
  786. package/dist/skills/index.js.map +0 -1
  787. package/dist/skills/matcher.d.ts +0 -26
  788. package/dist/skills/matcher.d.ts.map +0 -1
  789. package/dist/skills/matcher.js +0 -113
  790. package/dist/skills/matcher.js.map +0 -1
  791. package/dist/skills/official/code-simplifier.md +0 -52
  792. package/dist/skills/official/find-skills.md +0 -142
  793. package/dist/skills/official/official-api-design.md +0 -30
  794. package/dist/skills/official/official-architecture-decision.md +0 -41
  795. package/dist/skills/official/official-bmad.md +0 -118
  796. package/dist/skills/official/official-db-schema-design.md +0 -34
  797. package/dist/skills/official/official-debug.md +0 -25
  798. package/dist/skills/official/official-doc-driven.md +0 -31
  799. package/dist/skills/official/official-harness-engineering.md +0 -108
  800. package/dist/skills/official/official-openspec.md +0 -89
  801. package/dist/skills/official/official-performance-optimization.md +0 -30
  802. package/dist/skills/official/official-pr-review.md +0 -35
  803. package/dist/skills/official/official-release-checklist.md +0 -30
  804. package/dist/skills/official/official-security-hardening.md +0 -32
  805. package/dist/skills/official/official-spec-driven-design.md +0 -31
  806. package/dist/skills/official/planning-with-files.md +0 -241
  807. package/dist/skills/official/ui-ux-pro-max.md +0 -105
  808. package/dist/skills/official/webapp-testing.md +0 -96
  809. package/dist/skills/official-skills.d.ts +0 -26
  810. package/dist/skills/official-skills.d.ts.map +0 -1
  811. package/dist/skills/official-skills.js +0 -74
  812. package/dist/skills/official-skills.js.map +0 -1
  813. package/dist/skills/semantic-matcher.d.ts +0 -60
  814. package/dist/skills/semantic-matcher.d.ts.map +0 -1
  815. package/dist/skills/semantic-matcher.js +0 -192
  816. package/dist/skills/semantic-matcher.js.map +0 -1
  817. package/dist/skills/upgrade-engine.d.ts +0 -93
  818. package/dist/skills/upgrade-engine.d.ts.map +0 -1
  819. package/dist/skills/upgrade-engine.js +0 -447
  820. package/dist/skills/upgrade-engine.js.map +0 -1
  821. package/dist/skills/upgrade-prompt.d.ts +0 -20
  822. package/dist/skills/upgrade-prompt.d.ts.map +0 -1
  823. package/dist/skills/upgrade-prompt.js +0 -75
  824. package/dist/skills/upgrade-prompt.js.map +0 -1
  825. package/dist/web/routes/ai.d.ts +0 -10
  826. package/dist/web/routes/ai.d.ts.map +0 -1
  827. package/dist/web/routes/ai.js +0 -186
  828. package/dist/web/routes/ai.js.map +0 -1
  829. package/dist/web/routes/token-usage.d.ts +0 -7
  830. package/dist/web/routes/token-usage.d.ts.map +0 -1
  831. package/dist/web/routes/token-usage.js +0 -18
  832. package/dist/web/routes/token-usage.js.map +0 -1
  833. package/dist/web/ssrf-guard.d.ts +0 -35
  834. package/dist/web/ssrf-guard.d.ts.map +0 -1
  835. package/dist/web/ssrf-guard.js +0 -93
  836. package/dist/web/ssrf-guard.js.map +0 -1
  837. package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
  838. package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
  839. package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
  840. package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
  841. package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
  842. package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
  843. package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
  844. package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
  845. package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
  846. package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
  847. package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
  848. package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
  849. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
  850. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
  851. package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
  852. package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
  853. package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
  854. package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
  855. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
  856. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
  857. package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
  858. package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
  859. package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
  860. package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
  861. package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
  862. package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
  863. package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
  864. package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
  865. package/dist/web/static/assets/index-CBX47X8l.js +0 -3
  866. package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
  867. package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
  868. package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
  869. package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
  870. package/dist/web/static/assets/query-C99w429o.js +0 -2
  871. package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
  872. package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
  873. package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
  874. package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
  875. package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
  876. package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
  877. package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
  878. package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
  879. package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
  880. package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Skills distillation job manager — single-instance concurrency control and
3
+ * SSE event broadcast for `cf skills distill run` invocations issued via the
4
+ * web API.
5
+ *
6
+ * Design (v9.7, BMAD Phase 2 of "Skill 蒸馏 Web UI"):
7
+ * - Only one distill job can run at a time (global singleton, lock by `current`).
8
+ * - Events accumulate in `session.events[]` so SSE clients can replay history
9
+ * after reconnect (mirrors build-manager.ts).
10
+ * - Finished sessions live 5 minutes (SESSION_TTL_MS) then are GC'd.
11
+ * - State machine source-of-truth is the JSON file at
12
+ * `~/.claude-forge/skills-distill-state.json` (shared with CLI). This class
13
+ * only owns event delivery + the in-flight lock; the JSON file owns
14
+ * `phase`/`pending`/`completed`.
15
+ * - The `distillRun` function in `src/skills/distill/index.ts` does NOT
16
+ * accept an onEvent callback today, so we synthesize a coarse-grained
17
+ * event stream around it: `start` → ... → `done | cancelled | error`
18
+ * (the legacy `gate-paused` terminal was removed by R-D, spec 1851).
19
+ * Per-skill progress events are emitted from inside this wrapper by
20
+ * polling the state file as `completed.length` advances. Acceptable
21
+ * granularity given the slow LLM calls (~30-60s per skill).
22
+ *
23
+ * Critical constraints honoured:
24
+ * - DOES NOT modify any `src/skills/distill/*` module.
25
+ * - DOES NOT change the state file schema or CLI semantics.
26
+ * - Lock check is in-process; CLI + Web in parallel may still race on the
27
+ * JSON file (writeFile is atomic on POSIX — acceptable, documented in spec).
28
+ */
29
+ import { DEFAULT_STATE_PATH, type DistillState, type RunOptions, type RunResult } from '../../skills/distill/index.js';
30
+ /**
31
+ * Event types emitted to SSE subscribers.
32
+ * R-D: `gate-paused` removed (no sample-approve gate in R-B; never emitted).
33
+ */
34
+ export type DistillEventType = 'connected' | 'start' | 'progress' | 'phase-changed' | 'skill-distilled' | 'done' | 'cancelled' | 'error';
35
+ export interface DistillEvent {
36
+ type: DistillEventType;
37
+ /** ISO timestamp the event was emitted. */
38
+ at: string;
39
+ /** Optional human-readable message for the UI. */
40
+ message?: string;
41
+ /** Snapshot of state file phase at emit time. */
42
+ phase?: DistillState['phase'];
43
+ /** Counts of completed / pending / skipped at emit time. */
44
+ completed?: number;
45
+ pending?: number;
46
+ skipped?: number;
47
+ /** Per-skill payload when applicable. */
48
+ topicId?: string;
49
+ /** Distill result fields when the run terminates. */
50
+ distilledCount?: number;
51
+ pausedAtGate?: boolean;
52
+ /** Error detail. */
53
+ errorMessage?: string;
54
+ /** runId echoed for downstream filtering. */
55
+ runId?: string;
56
+ }
57
+ export interface DistillSession {
58
+ runId: string;
59
+ startedAt: number;
60
+ doneAt: number | null;
61
+ events: DistillEvent[];
62
+ /** Snapshot of caller options. R-A: no providers field; R-B may add abortSignal. */
63
+ options: RunOptions;
64
+ /** Last RunResult if the job finished naturally. */
65
+ lastResult: RunResult | null;
66
+ /** Set by cancel(); the runner observes and short-circuits. */
67
+ cancelRequested: boolean;
68
+ }
69
+ export declare class DistillConflictError extends Error {
70
+ status: number;
71
+ constructor(msg: string);
72
+ }
73
+ export declare class DistillManager {
74
+ private current;
75
+ private sessions;
76
+ private listeners;
77
+ private lastFinished;
78
+ /** True when a distill job is currently running. */
79
+ isBusy(): boolean;
80
+ getCurrent(): DistillSession | null;
81
+ getSession(id: string): DistillSession | null;
82
+ getLastFinished(): DistillSession | null;
83
+ /**
84
+ * Kick off a new distill run. Throws DistillConflictError if one is already
85
+ * running. Returns immediately; the actual distillRun() executes in the
86
+ * background. Subscribers receive events via subscribe().
87
+ */
88
+ start(options: RunOptions): {
89
+ runId: string;
90
+ };
91
+ /**
92
+ * Subscribe to future events for this run. Returns an unsubscribe fn.
93
+ * Does NOT replay history — the SSE handler replays session.events directly
94
+ * before subscribing.
95
+ */
96
+ subscribe(runId: string, listener: (e: DistillEvent) => void): () => void;
97
+ /**
98
+ * Request cancellation of the running job. The job loop checks this flag
99
+ * between skills. Already-in-flight LLM calls are not aborted (their cost
100
+ * is sunk by the time cancel is requested).
101
+ */
102
+ cancel(runId: string): boolean;
103
+ private pushEvent;
104
+ /**
105
+ * R-B: run distillRun() with an onProgress callback bridging claude CLI
106
+ * stream-json events into our SSE event stream. No state-file polling
107
+ * anymore — events come directly from the child process. Terminates with
108
+ * one of: `done`, `cancelled`, `error`.
109
+ */
110
+ private runWithChildProcess;
111
+ /**
112
+ * Test-only: reset internal state.
113
+ * @internal
114
+ */
115
+ _reset(): void;
116
+ }
117
+ /** Module-level singleton (one distill job per daemon). */
118
+ export declare const distillManager: DistillManager;
119
+ /** Path of the state file (re-export for routes / tests). */
120
+ export { DEFAULT_STATE_PATH };
121
+ /** Read the state file (re-export). */
122
+ export declare function readDistillState(statePath?: string): Promise<DistillState | null>;
123
+ /** Check if the state file exists on disk. */
124
+ export declare function distillStateExists(statePath?: string): Promise<boolean>;
125
+ //# sourceMappingURL=distill-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distill-manager.d.ts","sourceRoot":"","sources":["../../../src/web/services/distill-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,EAGL,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,SAAS,EACf,MAAM,+BAA+B,CAAC;AAmBvC;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,OAAO,GACP,UAAU,GACV,eAAe,GACf,iBAAiB,GACjB,MAAM,GACN,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,oFAAoF;IACpF,OAAO,EAAE,UAAU,CAAC;IACpB,oDAAoD;IACpD,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,+DAA+D;IAC/D,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,MAAM,SAAO;gBACD,GAAG,EAAE,MAAM;CAIxB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,SAAS,CAAqD;IACtE,OAAO,CAAC,YAAY,CAA+B;IACnD,oDAAoD;IACpD,MAAM,IAAI,OAAO;IAIjB,UAAU,IAAI,cAAc,GAAG,IAAI;IAInC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAI7C,eAAe,IAAI,cAAc,GAAG,IAAI;IAIxC;;;;OAIG;IACH,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE;IAyD7C;;;;OAIG;IACH,SAAS,CACP,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,GAClC,MAAM,IAAI;IAab;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAO9B,OAAO,CAAC,SAAS;IAgBjB;;;;;OAKG;YACW,mBAAmB;IA8GjC;;;OAGG;IACH,MAAM,IAAI,IAAI;CAMf;AAED,2DAA2D;AAC3D,eAAO,MAAM,cAAc,gBAAuB,CAAC;AAEnD,6DAA6D;AAC7D,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,uCAAuC;AACvC,wBAAsB,gBAAgB,CACpC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAE9B;AAED,8CAA8C;AAC9C,wBAAsB,kBAAkB,CACtC,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAOlB"}
@@ -0,0 +1,308 @@
1
+ /**
2
+ * Skills distillation job manager — single-instance concurrency control and
3
+ * SSE event broadcast for `cf skills distill run` invocations issued via the
4
+ * web API.
5
+ *
6
+ * Design (v9.7, BMAD Phase 2 of "Skill 蒸馏 Web UI"):
7
+ * - Only one distill job can run at a time (global singleton, lock by `current`).
8
+ * - Events accumulate in `session.events[]` so SSE clients can replay history
9
+ * after reconnect (mirrors build-manager.ts).
10
+ * - Finished sessions live 5 minutes (SESSION_TTL_MS) then are GC'd.
11
+ * - State machine source-of-truth is the JSON file at
12
+ * `~/.claude-forge/skills-distill-state.json` (shared with CLI). This class
13
+ * only owns event delivery + the in-flight lock; the JSON file owns
14
+ * `phase`/`pending`/`completed`.
15
+ * - The `distillRun` function in `src/skills/distill/index.ts` does NOT
16
+ * accept an onEvent callback today, so we synthesize a coarse-grained
17
+ * event stream around it: `start` → ... → `done | cancelled | error`
18
+ * (the legacy `gate-paused` terminal was removed by R-D, spec 1851).
19
+ * Per-skill progress events are emitted from inside this wrapper by
20
+ * polling the state file as `completed.length` advances. Acceptable
21
+ * granularity given the slow LLM calls (~30-60s per skill).
22
+ *
23
+ * Critical constraints honoured:
24
+ * - DOES NOT modify any `src/skills/distill/*` module.
25
+ * - DOES NOT change the state file schema or CLI semantics.
26
+ * - Lock check is in-process; CLI + Web in parallel may still race on the
27
+ * JSON file (writeFile is atomic on POSIX — acceptable, documented in spec).
28
+ */
29
+ import { randomBytes } from 'node:crypto';
30
+ import { promises as fsp } from 'node:fs';
31
+ import { logger } from '../../core/utils/logger.js';
32
+ import { distillRun, readState, DEFAULT_STATE_PATH, } from '../../skills/distill/index.js';
33
+ // R-A (spec 1851): ClaudeProvider import dropped — distill no longer takes
34
+ // a provider. R-B will replace `runWithPolling` with a child_process spawn.
35
+ const SESSION_TTL_MS = 5 * 60 * 1000;
36
+ // R-D: DEFAULT_POLL_INTERVAL_MS removed — R-B's runWithChildProcess no
37
+ // longer polls the state file; cancel handling is via AbortController.
38
+ /** Human-readable status for the phase-changed event message field. */
39
+ function phaseLabel(phase) {
40
+ switch (phase) {
41
+ case 'idle': return '空闲';
42
+ case 'running': return '正在蒸馏 (R-A stub; R-B 接 claude CLI)…';
43
+ case 'done': return '完成';
44
+ case 'error': return '出错';
45
+ default: return String(phase);
46
+ }
47
+ }
48
+ export class DistillConflictError extends Error {
49
+ status = 409;
50
+ constructor(msg) {
51
+ super(msg);
52
+ this.name = 'DistillConflictError';
53
+ }
54
+ }
55
+ export class DistillManager {
56
+ current = null;
57
+ sessions = new Map();
58
+ listeners = new Map();
59
+ lastFinished = null;
60
+ /** True when a distill job is currently running. */
61
+ isBusy() {
62
+ return this.current !== null && this.current.doneAt === null;
63
+ }
64
+ getCurrent() {
65
+ return this.current;
66
+ }
67
+ getSession(id) {
68
+ return this.sessions.get(id) ?? null;
69
+ }
70
+ getLastFinished() {
71
+ return this.lastFinished;
72
+ }
73
+ /**
74
+ * Kick off a new distill run. Throws DistillConflictError if one is already
75
+ * running. Returns immediately; the actual distillRun() executes in the
76
+ * background. Subscribers receive events via subscribe().
77
+ */
78
+ start(options) {
79
+ if (this.isBusy()) {
80
+ throw new DistillConflictError(`Distill job already running: ${this.current.runId}`);
81
+ }
82
+ const runId = `distill-${randomBytes(6).toString('hex')}`;
83
+ const session = {
84
+ runId,
85
+ startedAt: Date.now(),
86
+ doneAt: null,
87
+ events: [],
88
+ options,
89
+ lastResult: null,
90
+ cancelRequested: false,
91
+ };
92
+ this.current = session;
93
+ this.sessions.set(runId, session);
94
+ // Spec 0930 / 1641: log targeted re-distill invocations for observability
95
+ // (topicIds, outputIds, and/or force imply user explicitly bypassed
96
+ // topicCap / completedSet — record so operators can correlate with API
97
+ // spend).
98
+ if ((options.topicIds && options.topicIds.length > 0) ||
99
+ (options.outputIds && options.outputIds.length > 0) ||
100
+ options.force === true) {
101
+ logger.info(`[DistillManager] ${runId} targeted run: topicIds=${JSON.stringify(options.topicIds ?? [])} outputIds=${JSON.stringify(options.outputIds ?? [])} force=${options.force === true}`);
102
+ }
103
+ // Emit synthetic 'start' event so subscribers know the job is live.
104
+ this.pushEvent(runId, {
105
+ type: 'start',
106
+ at: new Date().toISOString(),
107
+ message: 'Distillation started',
108
+ runId,
109
+ });
110
+ // R-B: run claude CLI shell-out, listen for stream-json events via callback.
111
+ void this.runWithChildProcess(session, options).finally(() => {
112
+ session.doneAt = Date.now();
113
+ this.lastFinished = session;
114
+ if (this.current === session)
115
+ this.current = null;
116
+ setTimeout(() => {
117
+ this.sessions.delete(runId);
118
+ this.listeners.delete(runId);
119
+ }, SESSION_TTL_MS).unref?.();
120
+ });
121
+ return { runId };
122
+ }
123
+ /**
124
+ * Subscribe to future events for this run. Returns an unsubscribe fn.
125
+ * Does NOT replay history — the SSE handler replays session.events directly
126
+ * before subscribing.
127
+ */
128
+ subscribe(runId, listener) {
129
+ let set = this.listeners.get(runId);
130
+ if (!set) {
131
+ set = new Set();
132
+ this.listeners.set(runId, set);
133
+ }
134
+ set.add(listener);
135
+ return () => {
136
+ const s = this.listeners.get(runId);
137
+ if (s)
138
+ s.delete(listener);
139
+ };
140
+ }
141
+ /**
142
+ * Request cancellation of the running job. The job loop checks this flag
143
+ * between skills. Already-in-flight LLM calls are not aborted (their cost
144
+ * is sunk by the time cancel is requested).
145
+ */
146
+ cancel(runId) {
147
+ const session = this.sessions.get(runId);
148
+ if (!session || session.doneAt !== null)
149
+ return false;
150
+ session.cancelRequested = true;
151
+ return true;
152
+ }
153
+ pushEvent(runId, ev) {
154
+ const session = this.sessions.get(runId);
155
+ if (!session)
156
+ return;
157
+ session.events.push(ev);
158
+ const subs = this.listeners.get(runId);
159
+ if (subs) {
160
+ for (const fn of subs) {
161
+ try {
162
+ fn(ev);
163
+ }
164
+ catch (err) {
165
+ logger.warn(`[DistillManager] listener error: ${err}`);
166
+ }
167
+ }
168
+ }
169
+ }
170
+ /**
171
+ * R-B: run distillRun() with an onProgress callback bridging claude CLI
172
+ * stream-json events into our SSE event stream. No state-file polling
173
+ * anymore — events come directly from the child process. Terminates with
174
+ * one of: `done`, `cancelled`, `error`.
175
+ */
176
+ async runWithChildProcess(session, opts) {
177
+ const statePath = opts.statePath ?? DEFAULT_STATE_PATH;
178
+ // AbortController bridges DistillSession.cancelRequested → child.kill in
179
+ // the distiller. We poll the flag every 100ms (cheaper than rewriting
180
+ // cancel() to be Promise-based).
181
+ const abort = new AbortController();
182
+ const cancelPoll = setInterval(() => {
183
+ if (session.cancelRequested && !abort.signal.aborted) {
184
+ abort.abort();
185
+ }
186
+ }, 100).unref?.();
187
+ // Track which topics we've already emitted skill-distilled for, so the
188
+ // last-skill final event isn't duplicated in the terminal block.
189
+ const seenTopics = new Set();
190
+ // Push a phase-changed=running event so the UI knows scoring/distilling
191
+ // has actually kicked off (mirrors the R-A "正在 …" prompt).
192
+ this.pushEvent(session.runId, {
193
+ type: 'phase-changed',
194
+ at: new Date().toISOString(),
195
+ phase: 'running',
196
+ message: phaseLabel('running'),
197
+ runId: session.runId,
198
+ });
199
+ try {
200
+ if (session.cancelRequested) {
201
+ this.pushEvent(session.runId, {
202
+ type: 'cancelled',
203
+ at: new Date().toISOString(),
204
+ message: 'Cancelled before start',
205
+ runId: session.runId,
206
+ });
207
+ return;
208
+ }
209
+ const result = await distillRun({
210
+ ...opts,
211
+ cancelSignal: abort.signal,
212
+ onProgress: (ev) => {
213
+ // Forward partial-message char counts as `progress` events; emit
214
+ // `skill-distilled` once we see a clear terminal event per topic.
215
+ this.pushEvent(session.runId, {
216
+ type: 'progress',
217
+ at: new Date().toISOString(),
218
+ topicId: ev.topicId,
219
+ message: ev.charCount != null ? `chars=${ev.charCount}` : undefined,
220
+ runId: session.runId,
221
+ });
222
+ },
223
+ });
224
+ session.lastResult = result;
225
+ if (cancelPoll)
226
+ clearInterval(cancelPoll);
227
+ // Emit skill-distilled for each topic that produced a file. distillRun
228
+ // returns DistillResult[] only for successful (non-skipped) entries.
229
+ for (const r of result.distilled) {
230
+ if (seenTopics.has(r.topicId))
231
+ continue;
232
+ seenTopics.add(r.topicId);
233
+ this.pushEvent(session.runId, {
234
+ type: 'skill-distilled',
235
+ at: new Date().toISOString(),
236
+ topicId: r.topicId,
237
+ runId: session.runId,
238
+ });
239
+ }
240
+ const finalState = await readState(statePath);
241
+ if (session.cancelRequested) {
242
+ this.pushEvent(session.runId, {
243
+ type: 'cancelled',
244
+ at: new Date().toISOString(),
245
+ message: 'Cancelled by user',
246
+ phase: finalState?.phase,
247
+ completed: finalState?.completed.length,
248
+ distilledCount: result.distilled.length,
249
+ runId: session.runId,
250
+ });
251
+ }
252
+ else {
253
+ this.pushEvent(session.runId, {
254
+ type: 'done',
255
+ at: new Date().toISOString(),
256
+ message: result.message,
257
+ phase: finalState?.phase ?? 'done',
258
+ completed: finalState?.completed.length ?? result.distilled.length,
259
+ skipped: finalState?.skipped.length ?? 0,
260
+ distilledCount: result.distilled.length,
261
+ pausedAtGate: false,
262
+ runId: session.runId,
263
+ });
264
+ }
265
+ }
266
+ catch (err) {
267
+ if (cancelPoll)
268
+ clearInterval(cancelPoll);
269
+ const msg = err instanceof Error ? err.message : String(err);
270
+ this.pushEvent(session.runId, {
271
+ type: 'error',
272
+ at: new Date().toISOString(),
273
+ errorMessage: msg,
274
+ runId: session.runId,
275
+ });
276
+ logger.warn(`[DistillManager] run failed: ${msg}`);
277
+ }
278
+ }
279
+ /**
280
+ * Test-only: reset internal state.
281
+ * @internal
282
+ */
283
+ _reset() {
284
+ this.current = null;
285
+ this.sessions.clear();
286
+ this.listeners.clear();
287
+ this.lastFinished = null;
288
+ }
289
+ }
290
+ /** Module-level singleton (one distill job per daemon). */
291
+ export const distillManager = new DistillManager();
292
+ /** Path of the state file (re-export for routes / tests). */
293
+ export { DEFAULT_STATE_PATH };
294
+ /** Read the state file (re-export). */
295
+ export async function readDistillState(statePath) {
296
+ return readState(statePath ?? DEFAULT_STATE_PATH);
297
+ }
298
+ /** Check if the state file exists on disk. */
299
+ export async function distillStateExists(statePath) {
300
+ try {
301
+ await fsp.access(statePath ?? DEFAULT_STATE_PATH);
302
+ return true;
303
+ }
304
+ catch {
305
+ return false;
306
+ }
307
+ }
308
+ //# sourceMappingURL=distill-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distill-manager.js","sourceRoot":"","sources":["../../../src/web/services/distill-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./react-vendor-tkvCrao7.js";import{b as m,L as c}from"./react-router-JVUrkhdd.js";import{u as p}from"./query-S6X1S7K9.js";import{m as s,u as x,T as o,d as y,E as a,Y as u}from"./arco-Bhi3a6Qp.js";import{M as g}from"./MarkdownRenderer-DZmTl-8J.js";import"./vendor-DWgdB1eY.js";import"./syntax-highlighter-BkZfCDsz.js";const j=["name","description","tools","model","version","spawn_agent","tags"];function f(t){if(t==null)return"-";if(Array.isArray(t))return t.join(", ");if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);try{return JSON.stringify(t)}catch{return String(t)}}function I(){const{name:t}=m(),{data:n,isLoading:i,isError:l,error:d}=p({queryKey:["agent-content-page",t],enabled:!!t,queryFn:async()=>{const r=await fetch(`/api/agents/${encodeURIComponent(t)}/content`);if(!r.ok)throw new Error(`HTTP ${r.status}`);return r.json()},staleTime:5*6e4});return e.jsxs("div",{style:{padding:16,display:"flex",flexDirection:"column",gap:12},children:[e.jsxs(s,{children:[e.jsx(s.Item,{children:e.jsx(c,{to:"/context?tab=agents",children:"/context"})}),e.jsx(s.Item,{children:"agent"}),e.jsx(s.Item,{children:e.jsx("span",{style:{fontFamily:"monospace"},children:t})})]}),e.jsxs(x,{bordered:!0,children:[e.jsx("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:12},children:e.jsx(o.Title,{heading:5,style:{margin:0,fontFamily:"monospace"},children:t})}),i&&e.jsx(y,{animation:!0,text:{rows:10}}),l&&e.jsx(a,{description:e.jsxs(o.Text,{type:"error",children:["加载失败: ",String(d)]})}),n&&!n.exists&&e.jsx(a,{description:e.jsxs("span",{children:["未找到 ",e.jsxs("code",{style:{fontFamily:"monospace"},children:[".claude/agents/",t,".md"]}),"。",e.jsx("br",{}),"这通常是 Claude Code 内置的虚拟 subagent_type(如 ",e.jsx("code",{children:"general-purpose"}),"),无对应的 markdown 文件。"]})}),n&&n.exists&&e.jsxs(e.Fragment,{children:[e.jsx(u,{colon:" :",size:"small",column:2,title:e.jsx(o.Text,{style:{fontSize:13},children:"Frontmatter"}),data:j.map(r=>({label:r,value:f(n.frontmatter[r])})),style:{marginBottom:16}}),e.jsxs(o.Text,{type:"secondary",style:{fontSize:12},children:["path: ",n.path," · ",n.bytes," bytes"]}),e.jsx("div",{style:{marginTop:12},children:e.jsx(g,{content:n.body})})]})]})]})}export{I as default};
2
+ //# sourceMappingURL=AgentContentPage-DkeRNxok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentContentPage-DkeRNxok.js","sources":["../../src/pages/AgentContentPage.tsx"],"sourcesContent":["/**\n * /context/agent/:name — full-page view of an agent's .claude/agents/<name>.md.\n *\n * Standalone fallback for long agent definitions where the 760px drawer is\n * cramped. Linked from AgentContentDrawer's \"Open in full page\" anchor.\n *\n * Breadcrumb: /context → /context/agent/:name\n */\nimport { useParams, Link } from 'react-router-dom'\nimport { useQuery } from '@tanstack/react-query'\nimport Breadcrumb from '@arco-design/web-react/es/Breadcrumb'\nimport Card from '@arco-design/web-react/es/Card'\nimport Descriptions from '@arco-design/web-react/es/Descriptions'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport MarkdownRenderer from '../components/MarkdownRenderer'\n\ninterface AgentContentResponse {\n name: string\n exists: boolean\n path: string | null\n bytes: number\n body: string\n frontmatter: Record<string, unknown>\n tools: string | null\n model: string | null\n}\n\nconst WHITELIST: ReadonlyArray<string> = [\n 'name',\n 'description',\n 'tools',\n 'model',\n 'version',\n 'spawn_agent',\n 'tags',\n]\n\nfunction renderFmValue(v: unknown): string {\n if (v == null) return '-'\n if (Array.isArray(v)) return v.join(', ')\n if (typeof v === 'string') return v\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n\nexport default function AgentContentPage() {\n const { name } = useParams<{ name: string }>()\n const { data, isLoading, isError, error } = useQuery<AgentContentResponse>({\n queryKey: ['agent-content-page', name],\n enabled: !!name,\n queryFn: async () => {\n const r = await fetch(`/api/agents/${encodeURIComponent(name!)}/content`)\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n return r.json()\n },\n staleTime: 5 * 60_000,\n })\n\n return (\n <div style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 12 }}>\n <Breadcrumb>\n <Breadcrumb.Item>\n <Link to=\"/context?tab=agents\">/context</Link>\n </Breadcrumb.Item>\n <Breadcrumb.Item>agent</Breadcrumb.Item>\n <Breadcrumb.Item>\n <span style={{ fontFamily: 'monospace' }}>{name}</span>\n </Breadcrumb.Item>\n </Breadcrumb>\n\n <Card bordered>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 }}>\n <Typography.Title heading={5} style={{ margin: 0, fontFamily: 'monospace' }}>{name}</Typography.Title>\n </div>\n\n {isLoading && <Skeleton animation text={{ rows: 10 }} />}\n {isError && (\n <Empty description={<Typography.Text type=\"error\">加载失败: {String(error)}</Typography.Text>} />\n )}\n {data && !data.exists && (\n <Empty\n description={\n <span>\n 未找到 <code style={{ fontFamily: 'monospace' }}>.claude/agents/{name}.md</code>。\n <br />\n 这通常是 Claude Code 内置的虚拟 subagent_type(如 <code>general-purpose</code>),无对应的 markdown 文件。\n </span>\n }\n />\n )}\n {data && data.exists && (\n <>\n <Descriptions\n colon=\" :\"\n size=\"small\"\n column={2}\n title={<Typography.Text style={{ fontSize: 13 }}>Frontmatter</Typography.Text>}\n data={WHITELIST.map((key) => ({\n label: key,\n value: renderFmValue(data.frontmatter[key]),\n }))}\n style={{ marginBottom: 16 }}\n />\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n path: {data.path} · {data.bytes} bytes\n </Typography.Text>\n <div style={{ marginTop: 12 }}>\n <MarkdownRenderer content={data.body} />\n </div>\n </>\n )}\n </Card>\n </div>\n )\n}\n"],"names":["WHITELIST","renderFmValue","v","AgentContentPage","name","useParams","data","isLoading","isError","error","useQuery","jsxs","Breadcrumb","jsx","Link","Card","Typography","Skeleton","Empty","Fragment","Descriptions","key","MarkdownRenderer"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e,r as x}from"./react-vendor-tkvCrao7.js";import{u as y}from"./query-S6X1S7K9.js";import{U as h,Y as g,d as f,E as l,T as i,ai as j,X as b,b as u}from"./arco-Bhi3a6Qp.js";import{M as w}from"./MarkdownRenderer-DZmTl-8J.js";import"./vendor-DWgdB1eY.js";import"./syntax-highlighter-BkZfCDsz.js";const T=["name","description","tools","model","version","spawn_agent","tags"];function S(n){if(n==null)return"-";if(Array.isArray(n))return n.join(", ");if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);try{return JSON.stringify(n)}catch{return String(n)}}function z({open:n,agentName:a,stats:o,onClose:c}){const{data:r,isLoading:p,isError:d,error:m}=y({queryKey:["agent-content",a],enabled:!!a&&n,queryFn:async()=>{const s=await fetch(`/api/agents/${encodeURIComponent(a)}/content`);if(!s.ok)throw new Error(`HTTP ${s.status}`);return s.json()},staleTime:3e5}),t=e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx("span",{style:{fontFamily:"monospace",fontSize:13},children:a??"-"}),a&&e.jsxs("a",{href:`/context/agent/${encodeURIComponent(a)}`,target:"_blank",rel:"noopener noreferrer",style:{marginLeft:"auto",fontSize:12,display:"inline-flex",alignItems:"center",gap:4},children:[e.jsx(j,{})," Open in full page"]})]});return e.jsxs(h,{visible:n,onCancel:c,onOk:c,title:t,width:760,footer:null,unmountOnExit:!0,children:[o&&e.jsx(g,{colon:" :",size:"small",column:3,data:[{label:"delegations (7d)",value:o.count},{label:"rate",value:o.rate},{label:"subagent_type",value:o.agent}],style:{marginBottom:12}}),p&&e.jsx(f,{animation:!0,text:{rows:6}}),d&&e.jsx(l,{description:e.jsxs(i.Text,{type:"error",children:["加载失败: ",String(m)]})}),r&&!r.exists&&r.source==="builtin"&&e.jsx(l,{description:e.jsxs("span",{children:[e.jsx("code",{style:{fontFamily:"monospace"},children:a})," 是 Claude Code 内置的虚拟 subagent_type,无项目级 markdown 文件。",e.jsx("br",{}),r.message??"Claude Code built-in agent; no project-level details available"]})}),r&&!r.exists&&r.source!=="builtin"&&e.jsx(l,{description:e.jsxs("span",{children:["未找到 ",e.jsxs("code",{style:{fontFamily:"monospace"},children:[".claude/agents/",a,".md"]}),"。",e.jsx("br",{}),"若这是新建 agent,请在 TUI 重启(Cmd+R)后再触发。"]})}),r&&r.exists&&e.jsxs(e.Fragment,{children:[e.jsx(g,{colon:" :",size:"mini",column:2,title:e.jsx(i.Text,{style:{fontSize:13},children:"Frontmatter"}),data:T.map(s=>({label:s,value:S(r.frontmatter[s])})),style:{marginBottom:16}}),e.jsx(i.Text,{style:{fontSize:13,fontWeight:600},children:"Body"}),e.jsx("div",{style:{marginTop:8,maxHeight:"calc(100vh - 360px)",overflow:"auto",border:"1px solid var(--color-border-2)",borderRadius:4,padding:12},children:e.jsx(w,{content:r.body})})]})]})}function R(){const[n,a]=x.useState(null),{data:o,isLoading:c,isError:r,error:p}=y({queryKey:["ctx-agent-hit-rate"],queryFn:async()=>{const t=await fetch("/api/rules/hit-rate?days=7");if(!t.ok)throw new Error(`HTTP ${t.status}`);return t.json()},staleTime:6e4}),d=x.useMemo(()=>o?o.agents.map(t=>({...t})).sort((t,s)=>s.count-t.count):[],[o]);if(r)return e.jsx(l,{description:e.jsxs(i.Text,{type:"error",children:["加载失败: ",String(p)]})});if(c||!o)return e.jsx(f,{animation:!0,text:{rows:8}});const m=[{title:"agent (subagent_type)",dataIndex:"agent",render:(t,s)=>e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:6},children:[e.jsx("span",{style:{fontFamily:"monospace",fontSize:12},children:t}),s.source==="builtin"&&e.jsx(u,{color:"gray",size:"small",children:"built-in"})]})},{title:"delegations (7d)",dataIndex:"count",width:160,sorter:(t,s)=>t.count-s.count,render:t=>e.jsx("span",{style:{fontFamily:"monospace",fontWeight:600},children:t})},{title:"rate (vs 全部 prompt)",dataIndex:"rate",width:160,render:t=>e.jsx(i.Text,{style:{fontSize:12},children:t})},{title:"热度",dataIndex:"count",key:"tier",width:100,render:t=>t>=50?e.jsx(u,{color:"green",size:"small",children:"heavy"}):t>=5?e.jsx(u,{color:"arcoblue",size:"small",children:"used"}):e.jsx(u,{color:"orange",size:"small",children:"rare"})}];return e.jsxs("div",{children:[e.jsx("div",{style:{marginBottom:12},children:e.jsxs(i.Text,{style:{fontSize:13,color:"var(--color-text-3)"},children:["近 7d · 总 delegation ",o.summary.agentDelegations," / ",o.summary.totalPrompts," prompts · agent rate ",o.summary.agentRate," · 共 ",d.length," 个 agent"]})}),e.jsx(b,{rowKey:"agent",data:d,columns:m,pagination:{pageSize:20,showTotal:!0},size:"small",border:{wrapper:!0,cell:!0},onRow:t=>({onClick:()=>a(t),style:{cursor:"pointer"}}),noDataElement:e.jsx(l,{description:"无 agent 委托记录"})}),e.jsx(z,{open:n!==null,agentName:(n==null?void 0:n.agent)??null,stats:n,onClose:()=>a(null)})]})}export{R as default};
2
+ //# sourceMappingURL=AgentDelegationTable-ByBa0x1l.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentDelegationTable-ByBa0x1l.js","sources":["../../src/components/context/AgentContentDrawer.tsx","../../src/components/context/AgentDelegationTable.tsx"],"sourcesContent":["/**\n * AgentContentDrawer — right-side Arco Drawer that shows an agent's full\n * markdown (frontmatter + body) when a row in AgentDelegationTable is clicked.\n *\n * Mirrors SkillContentDrawer but reads .claude/agents/<name>.md via\n * /api/agents/:name/content.\n *\n * Empty case: virtual subagents (`general-purpose`, etc.) have no .md file —\n * the endpoint returns exists:false; UI renders a friendly Empty rather than\n * disabling the row click (spec Q6 = default Empty).\n */\nimport { useQuery } from '@tanstack/react-query'\nimport Drawer from '@arco-design/web-react/es/Drawer'\nimport Descriptions from '@arco-design/web-react/es/Descriptions'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { IconLaunch } from '@arco-design/web-react/icon'\nimport MarkdownRenderer from '../MarkdownRenderer'\n\nexport interface AgentRowStats {\n agent: string\n count: number\n rate: string\n source?: 'project' | 'builtin'\n}\n\ninterface AgentContentResponse {\n name: string\n source?: 'project' | 'builtin'\n exists: boolean\n path: string | null\n bytes: number\n body: string\n frontmatter: Record<string, unknown>\n tools: string | null\n model: string | null\n message?: string\n}\n\ninterface Props {\n open: boolean\n agentName: string | null\n stats?: AgentRowStats | null\n onClose: () => void\n}\n\nconst WHITELIST: ReadonlyArray<string> = [\n 'name',\n 'description',\n 'tools',\n 'model',\n 'version',\n 'spawn_agent',\n 'tags',\n]\n\nfunction renderFmValue(v: unknown): string {\n if (v == null) return '-'\n if (Array.isArray(v)) return v.join(', ')\n if (typeof v === 'string') return v\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n\nexport default function AgentContentDrawer({ open, agentName, stats, onClose }: Props) {\n const { data, isLoading, isError, error } = useQuery<AgentContentResponse>({\n queryKey: ['agent-content', agentName],\n enabled: !!agentName && open,\n queryFn: async () => {\n const r = await fetch(`/api/agents/${encodeURIComponent(agentName!)}/content`)\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n return r.json()\n },\n staleTime: 5 * 60_000,\n })\n\n const title = (\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <span style={{ fontFamily: 'monospace', fontSize: 13 }}>{agentName ?? '-'}</span>\n {agentName && (\n <a\n href={`/context/agent/${encodeURIComponent(agentName)}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ marginLeft: 'auto', fontSize: 12, display: 'inline-flex', alignItems: 'center', gap: 4 }}\n >\n <IconLaunch /> Open in full page\n </a>\n )}\n </div>\n )\n\n return (\n <Drawer\n visible={open}\n onCancel={onClose}\n onOk={onClose}\n title={title}\n width={760}\n footer={null}\n unmountOnExit\n >\n {stats && (\n <Descriptions\n colon=\" :\"\n size=\"small\"\n column={3}\n data={[\n { label: 'delegations (7d)', value: stats.count },\n { label: 'rate', value: stats.rate },\n { label: 'subagent_type', value: stats.agent },\n ]}\n style={{ marginBottom: 12 }}\n />\n )}\n\n {isLoading && <Skeleton animation text={{ rows: 6 }} />}\n {isError && (\n <Empty description={<Typography.Text type=\"error\">加载失败: {String(error)}</Typography.Text>} />\n )}\n\n {data && !data.exists && data.source === 'builtin' && (\n <Empty\n description={\n <span>\n <code style={{ fontFamily: 'monospace' }}>{agentName}</code> 是 Claude Code 内置的虚拟 subagent_type,无项目级 markdown 文件。\n <br />\n {data.message ?? 'Claude Code built-in agent; no project-level details available'}\n </span>\n }\n />\n )}\n\n {data && !data.exists && data.source !== 'builtin' && (\n <Empty\n description={\n <span>\n 未找到 <code style={{ fontFamily: 'monospace' }}>.claude/agents/{agentName}.md</code>。\n <br />\n 若这是新建 agent,请在 TUI 重启(Cmd+R)后再触发。\n </span>\n }\n />\n )}\n\n {data && data.exists && (\n <>\n <Descriptions\n colon=\" :\"\n size=\"mini\"\n column={2}\n title={<Typography.Text style={{ fontSize: 13 }}>Frontmatter</Typography.Text>}\n data={WHITELIST.map((key) => ({\n label: key,\n value: renderFmValue(data.frontmatter[key]),\n }))}\n style={{ marginBottom: 16 }}\n />\n <Typography.Text style={{ fontSize: 13, fontWeight: 600 }}>Body</Typography.Text>\n <div\n style={{\n marginTop: 8,\n maxHeight: 'calc(100vh - 360px)',\n overflow: 'auto',\n border: '1px solid var(--color-border-2)',\n borderRadius: 4,\n padding: 12,\n }}\n >\n <MarkdownRenderer content={data.body} />\n </div>\n </>\n )}\n </Drawer>\n )\n}\n","/**\n * AgentDelegationTable — Tab 3 of /context (🤖 Agent 委托).\n *\n * 数据: GET /api/rules/hit-rate?days=7 — 复用同一个 endpoint, 取 agents[].\n * 0 改后端.\n *\n * 列: agent (subagent_type) | delegations_7d | rate (vs 全部 prompt) | 状态 chip.\n */\nimport { useMemo, useState } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport Table from '@arco-design/web-react/es/Table'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport AgentContentDrawer, { type AgentRowStats } from './AgentContentDrawer'\n\ninterface AgentRow {\n agent: string\n count: number\n rate: string\n source?: 'project' | 'builtin'\n}\ninterface HitRateResponse {\n summary: { totalPrompts: number; agentDelegations: number; agentRate: string }\n agents: AgentRow[]\n}\n\nexport default function AgentDelegationTable() {\n const [openAgent, setOpenAgent] = useState<AgentRowStats | null>(null)\n const { data, isLoading, isError, error } = useQuery<HitRateResponse>({\n queryKey: ['ctx-agent-hit-rate'],\n queryFn: async () => {\n const r = await fetch('/api/rules/hit-rate?days=7')\n if (!r.ok) throw new Error(`HTTP ${r.status}`)\n return r.json()\n },\n staleTime: 60_000,\n })\n\n const rows = useMemo(() => {\n if (!data) return []\n return data.agents.map((a) => ({ ...a })).sort((a, b) => b.count - a.count)\n }, [data])\n\n if (isError) return <Empty description={<Typography.Text type=\"error\">加载失败: {String(error)}</Typography.Text>} />\n if (isLoading || !data) return <Skeleton animation text={{ rows: 8 }} />\n\n const columns = [\n {\n title: 'agent (subagent_type)',\n dataIndex: 'agent',\n render: (id: string, record: AgentRow) => (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 6 }}>\n <span style={{ fontFamily: 'monospace', fontSize: 12 }}>{id}</span>\n {record.source === 'builtin' && (\n <Tag color=\"gray\" size=\"small\">built-in</Tag>\n )}\n </span>\n ),\n },\n {\n title: 'delegations (7d)',\n dataIndex: 'count',\n width: 160,\n sorter: (a: { count: number }, b: { count: number }) => a.count - b.count,\n render: (n: number) => <span style={{ fontFamily: 'monospace', fontWeight: 600 }}>{n}</span>,\n },\n {\n title: 'rate (vs 全部 prompt)',\n dataIndex: 'rate',\n width: 160,\n render: (s: string) => <Typography.Text style={{ fontSize: 12 }}>{s}</Typography.Text>,\n },\n {\n title: '热度',\n dataIndex: 'count',\n key: 'tier',\n width: 100,\n render: (n: number) => (\n n >= 50 ? <Tag color=\"green\" size=\"small\">heavy</Tag> :\n n >= 5 ? <Tag color=\"arcoblue\" size=\"small\">used</Tag> :\n <Tag color=\"orange\" size=\"small\">rare</Tag>\n ),\n },\n ]\n\n return (\n <div>\n <div style={{ marginBottom: 12 }}>\n <Typography.Text style={{ fontSize: 13, color: 'var(--color-text-3)' }}>\n 近 7d · 总 delegation {data.summary.agentDelegations} / {data.summary.totalPrompts} prompts ·\n agent rate {data.summary.agentRate} · 共 {rows.length} 个 agent\n </Typography.Text>\n </div>\n <Table\n rowKey=\"agent\"\n data={rows}\n columns={columns}\n pagination={{ pageSize: 20, showTotal: true }}\n size=\"small\"\n border={{ wrapper: true, cell: true }}\n onRow={(record) => ({\n onClick: () => setOpenAgent(record as AgentRowStats),\n style: { cursor: 'pointer' },\n })}\n noDataElement={<Empty description=\"无 agent 委托记录\" />}\n />\n <AgentContentDrawer\n open={openAgent !== null}\n agentName={openAgent?.agent ?? null}\n stats={openAgent}\n onClose={() => setOpenAgent(null)}\n />\n </div>\n )\n}\n"],"names":["WHITELIST","renderFmValue","v","AgentContentDrawer","open","agentName","stats","onClose","data","isLoading","isError","error","useQuery","r","title","jsxs","jsx","IconLaunch","Drawer","Descriptions","Skeleton","Empty","Typography","Fragment","key","MarkdownRenderer","AgentDelegationTable","openAgent","setOpenAgent","useState","rows","useMemo","a","b","columns","id","record","Tag","n","s","Table"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/KbHitRateTable-ByEIWujF.js","assets/react-vendor-tkvCrao7.js","assets/query-S6X1S7K9.js","assets/react-router-JVUrkhdd.js","assets/vendor-DWgdB1eY.js","assets/arco-Bhi3a6Qp.js","assets/arco-DFQA6dO_.css","assets/MarkdownRenderer-DZmTl-8J.js","assets/syntax-highlighter-BkZfCDsz.js","assets/ProjectSwitcher-D3lZMFd3.js","assets/SkillStatsTable-DYMzjEUV.js","assets/AgentDelegationTable-ByBa0x1l.js","assets/SkillsDistillTab-C7qaG8q3.js","assets/auth-Bnf8ZcqN.js","assets/charts-BuHQWDbQ.js"])))=>i.map(i=>d[i]);
2
+ import{_ as l}from"./index-BIYnq1Dx.js";import{j as e,r as s}from"./react-vendor-tkvCrao7.js";import{u as n,T as r,c as o,p,aa as j,W as b,ab as h}from"./arco-Bhi3a6Qp.js";import{P as m}from"./ProjectSwitcher-D3lZMFd3.js";import{u as g}from"./useTabsParam-k8qte_0C.js";import"./react-router-JVUrkhdd.js";import"./vendor-DWgdB1eY.js";import"./query-S6X1S7K9.js";import"./lucide-CnlPQoG8.js";const _=s.lazy(()=>l(()=>import("./KbHitRateTable-ByEIWujF.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))),u=s.lazy(()=>l(()=>import("./SkillStatsTable-DYMzjEUV.js"),__vite__mapDeps([10,1,2,5,4,6,7,8]))),y=s.lazy(()=>l(()=>import("./AgentDelegationTable-ByBa0x1l.js"),__vite__mapDeps([11,1,2,5,4,6,7,8]))),f=s.lazy(()=>l(()=>import("./SkillsDistillTab-C7qaG8q3.js"),__vite__mapDeps([12,1,2,5,4,6,13,14]))),t=o.TabPane,T=["kb","skills","agents","distill"];function a(){return e.jsx("div",{style:{padding:24,color:"var(--color-text-3)",fontSize:13},children:"加载中…"})}function R(){const{tab:i,setTab:d}=g(T,"kb"),c=x=>d(x);return e.jsxs("div",{"data-testid":"context-insights","data-tab":i,style:{padding:16,display:"flex",flexDirection:"column",gap:12},children:[e.jsx(n,{bordered:!1,bodyStyle:{padding:"12px 16px"},style:{background:"var(--color-bg-1)"},children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,flexWrap:"wrap"},children:[e.jsx(r.Title,{heading:5,style:{margin:0},children:"AI 在拿什么"}),e.jsx(r.Text,{type:"secondary",style:{fontSize:12},children:"Claude 写代码时调用了哪些 KB / Skill / Agent · 近 7d"}),e.jsx("div",{style:{marginLeft:"auto"},children:e.jsx(m,{})})]})}),e.jsx(n,{bordered:!0,bodyStyle:{padding:12},children:e.jsxs(o,{activeTab:i,onChange:c,type:"line",children:[e.jsx(t,{title:e.jsxs("span",{children:[e.jsx(p,{})," 📚 KB 命中"]}),children:e.jsx(s.Suspense,{fallback:e.jsx(a,{}),children:e.jsx(_,{})})},"kb"),e.jsx(t,{title:e.jsxs("span",{children:[e.jsx(j,{})," 🔧 Skill 调用"]}),children:e.jsx(s.Suspense,{fallback:e.jsx(a,{}),children:e.jsx(u,{})})},"skills"),e.jsx(t,{title:e.jsxs("span",{children:[e.jsx(b,{})," 🤖 Agent 委托"]}),children:e.jsx(s.Suspense,{fallback:e.jsx(a,{}),children:e.jsx(y,{})})},"agents"),e.jsx(t,{title:e.jsxs("span",{children:[e.jsx(h,{})," 🧪 蒸馏"]}),children:e.jsx(s.Suspense,{fallback:e.jsx(a,{}),children:e.jsx(f,{})})},"distill")]})})]})}export{R as default};
3
+ //# sourceMappingURL=ContextInsightsPage-oUk7_I8u.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":";sYAqBA,MAAMA,EAAiBC,OAAK,IAAAC,EAAA,IAAM,OAAO,8BAAsC,yCAAC,EAC1EC,EAAkBF,OAAK,IAAAC,EAAA,IAAM,OAAO,+BAAuC,sCAAC,EAC5EE,EAAuBH,OAAK,IAAAC,EAAA,IAAM,OAAO,oCAA4C,sCAAC,EACtFG,EAAmBJ,OAAK,IAAAC,EAAA,IAAM,OAAO,gCAAwC,wCAAC,EAE9EI,EAAUC,EAAK,QAGfC,EAA2B,CAAC,KAAM,SAAU,SAAU,SAAS,EAErE,SAASC,GAAe,CACtB,OACEC,MAAC,OAAI,MAAO,CAAE,QAAS,GAAI,MAAO,sBAAuB,SAAU,IAAM,gBAEzE,CAEJ,CAEA,SAAwBC,GAAsB,CAC5C,KAAM,CAAE,IAAAC,EAAK,OAAAC,CAAA,EAAWC,EAAqBN,EAAO,IAAI,EAClDO,EAAgBC,GAAgBH,EAAOG,CAAa,EAE1D,cACG,OAAI,cAAY,mBAAmB,WAAUJ,EAAK,MAAO,CAAE,QAAS,GAAI,QAAS,OAAQ,cAAe,SAAU,IAAK,IAEtH,UAAAF,MAACO,EAAA,CAAK,SAAU,GAAO,UAAW,CAAE,QAAS,aAAe,MAAO,CAAE,WAAY,qBAC/E,SAAAC,OAAC,OAAI,MAAO,CAAE,QAAS,OAAQ,WAAY,SAAU,IAAK,GAAI,SAAU,QACtE,UAAAR,MAACS,EAAW,MAAX,CAAiB,QAAS,EAAG,MAAO,CAAE,OAAQ,GAAK,mBAAO,EAC3DT,MAACS,EAAW,KAAX,CAAgB,KAAK,YAAY,MAAO,CAAE,SAAU,IAAM,sDAE3D,EACAT,MAAC,OAAI,MAAO,CAAE,WAAY,QACxB,SAAAA,MAACU,EAAA,EAAgB,EACnB,GACF,EACF,QAGCH,EAAA,CAAK,SAAQ,GAAC,UAAW,CAAE,QAAS,IACnC,SAAAC,OAACX,GAAK,UAAWK,EAAK,SAAUG,EAAc,KAAK,OACjD,UAAAL,MAACJ,EAAA,CAEC,aAAQ,QAAK,UAAAI,MAACW,EAAA,EAAS,EAAE,aAAS,EAElC,SAAAX,MAACY,YAAS,SAAUZ,MAACD,IAAa,EAChC,SAAAC,MAACV,IAAe,EAClB,GALI,MAONU,MAACJ,EAAA,CAEC,aAAQ,QAAK,UAAAI,MAACa,EAAA,EAAS,EAAE,gBAAY,EAErC,SAAAb,MAACY,YAAS,SAAUZ,MAACD,IAAa,EAChC,SAAAC,MAACP,IAAgB,EACnB,GALI,UAONO,MAACJ,EAAA,CAEC,aAAQ,QAAK,UAAAI,MAACc,EAAA,EAAU,EAAE,gBAAY,EAEtC,SAAAd,MAACY,YAAS,SAAUZ,MAACD,IAAa,EAChC,SAAAC,MAACN,IAAqB,EACxB,GALI,UAONM,MAACJ,EAAA,CAEC,aAAQ,QAAK,UAAAI,MAACe,EAAA,EAAe,EAAE,UAAM,EAErC,SAAAf,MAACY,YAAS,SAAUZ,MAACD,IAAa,EAChC,SAAAC,MAACL,IAAiB,EACpB,GALI,UAMN,EACF,EACF,GACF,CAEJ","names":["KbHitRateTable","lazy","__vitePreload","SkillStatsTable","AgentDelegationTable","SkillsDistillTab","TabPane","Tabs","KNOWN","PaneFallback","jsx","ContextInsightsPage","tab","setTab","useTabsParam","handleChange","key","Card","jsxs","Typography","ProjectSwitcher","IconBook","Suspense","IconTool","IconRobot","IconExperiment"],"ignoreList":[],"sources":["../../src/pages/ContextInsightsPage.tsx"],"sourcesContent":["/**\n * /context — AI 在拿什么 (v4 IA).\n *\n * Step 3 实施: 3 tabs — 📚 KB 命中 / 🔧 Skill 调用 / 🤖 Agent 委托.\n * Active tab 由 ?tab=kb|skills|agents 驱动 (default kb).\n *\n * 数据 100% 复用现有 API (无后端改动):\n * - KB tab: /api/knowledge/list + /api/insights/agent-board (per-page 聚合)\n * - Skill tab: /api/rules/hit-rate (skills[] + neverTriggered[])\n * - Agent tab: /api/rules/hit-rate (agents[])\n *\n * 覆盖场景: D (KB 命中率) / F (Skill 是否被调用) — spec §3.3 §6 Step 3.\n */\nimport { lazy, Suspense } from 'react'\nimport Card from '@arco-design/web-react/es/Card'\nimport Tabs from '@arco-design/web-react/es/Tabs'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport { IconBook, IconTool, IconRobot, IconExperiment } from '@arco-design/web-react/icon'\nimport { ProjectSwitcher } from '../components/ProjectSwitcher'\nimport { useTabsParam } from '../hooks/useTabsParam'\n\nconst KbHitRateTable = lazy(() => import('../components/context/KbHitRateTable'))\nconst SkillStatsTable = lazy(() => import('../components/context/SkillStatsTable'))\nconst AgentDelegationTable = lazy(() => import('../components/context/AgentDelegationTable'))\nconst SkillsDistillTab = lazy(() => import('../components/distill/SkillsDistillTab'))\n\nconst TabPane = Tabs.TabPane\n\ntype CtxTab = 'kb' | 'skills' | 'agents' | 'distill'\nconst KNOWN: readonly CtxTab[] = ['kb', 'skills', 'agents', 'distill'] as const\n\nfunction PaneFallback() {\n return (\n <div style={{ padding: 24, color: 'var(--color-text-3)', fontSize: 13 }}>\n 加载中…\n </div>\n )\n}\n\nexport default function ContextInsightsPage() {\n const { tab, setTab } = useTabsParam<CtxTab>(KNOWN, 'kb')\n const handleChange = (key: string) => setTab(key as CtxTab)\n\n return (\n <div data-testid=\"context-insights\" data-tab={tab} style={{ padding: 16, display: 'flex', flexDirection: 'column', gap: 12 }}>\n {/* Header */}\n <Card bordered={false} bodyStyle={{ padding: '12px 16px' }} style={{ background: 'var(--color-bg-1)' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n <Typography.Title heading={5} style={{ margin: 0 }}>AI 在拿什么</Typography.Title>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n Claude 写代码时调用了哪些 KB / Skill / Agent · 近 7d\n </Typography.Text>\n <div style={{ marginLeft: 'auto' }}>\n <ProjectSwitcher />\n </div>\n </div>\n </Card>\n\n {/* Tabs */}\n <Card bordered bodyStyle={{ padding: 12 }}>\n <Tabs activeTab={tab} onChange={handleChange} type=\"line\">\n <TabPane\n key=\"kb\"\n title={<span><IconBook /> 📚 KB 命中</span>}\n >\n <Suspense fallback={<PaneFallback />}>\n <KbHitRateTable />\n </Suspense>\n </TabPane>\n <TabPane\n key=\"skills\"\n title={<span><IconTool /> 🔧 Skill 调用</span>}\n >\n <Suspense fallback={<PaneFallback />}>\n <SkillStatsTable />\n </Suspense>\n </TabPane>\n <TabPane\n key=\"agents\"\n title={<span><IconRobot /> 🤖 Agent 委托</span>}\n >\n <Suspense fallback={<PaneFallback />}>\n <AgentDelegationTable />\n </Suspense>\n </TabPane>\n <TabPane\n key=\"distill\"\n title={<span><IconExperiment /> 🧪 蒸馏</span>}\n >\n <Suspense fallback={<PaneFallback />}>\n <SkillsDistillTab />\n </Suspense>\n </TabPane>\n </Tabs>\n </Card>\n </div>\n )\n}\n"],"file":"assets/ContextInsightsPage-oUk7_I8u.js"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./react-vendor-tkvCrao7.js";import{u as d}from"./query-S6X1S7K9.js";import{c,f as m}from"./index-BIYnq1Dx.js";import{T as a,t as h,S as p,u as n,f as u}from"./arco-Bhi3a6Qp.js";import"./react-router-JVUrkhdd.js";import"./vendor-DWgdB1eY.js";import"./lucide-CnlPQoG8.js";const x={alive:"var(--color-success)",stale:"var(--color-warning)",dead:"var(--color-danger, #f53f3f)"};function y(t){return t==null?"no heartbeat":c(Date.now()-t)}function f(t){return t==null?"—":m(t,{includeSeconds:!0})}function C(){const{data:t,isLoading:s,error:o,refetch:i}=d({queryKey:["daemon-health-page"],queryFn:async()=>{const r=await fetch("/api/health");if(!r.ok)throw new Error(`HTTP ${r.status}`);return r.json()},refetchInterval:15e3,retry:1});return e.jsxs("div",{style:{maxWidth:640,margin:"0 auto"},children:[e.jsxs("div",{style:{marginBottom:16,display:"flex",alignItems:"center",justifyContent:"space-between"},children:[e.jsx(a.Title,{heading:4,style:{margin:0},children:"Daemon Health"}),e.jsx(h,{size:"small",onClick:()=>i(),children:"Refresh"})]}),s&&e.jsx("div",{style:{textAlign:"center",padding:32},children:e.jsx(p,{})}),o&&e.jsx(n,{children:e.jsxs(a.Text,{type:"error",children:["Failed to load health data: ",String(o)]})}),t&&e.jsxs(u,{direction:"vertical",size:16,style:{width:"100%"},children:[e.jsxs(n,{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:16},children:[e.jsx("span",{style:{width:12,height:12,borderRadius:"50%",background:x[t.daemon.status]??"#999",display:"inline-block"}}),e.jsx(a.Title,{heading:5,style:{margin:0},children:t.daemon.status.toUpperCase()})]}),e.jsx("table",{style:{width:"100%",borderCollapse:"collapse",fontSize:13},children:e.jsx("tbody",{children:[["Status",t.daemon.status],["PID",t.daemon.pid??"—"],["Heartbeat age",y(t.daemon.heartbeat_age_ms)],["Started at",f(t.daemon.started_at)],["Version",t.daemon.version??"—"]].map(([r,l])=>e.jsxs("tr",{style:{borderBottom:"1px solid var(--color-border-2)"},children:[e.jsx("td",{style:{padding:"8px 4px",color:"var(--color-text-3)",width:140},children:r}),e.jsx("td",{style:{padding:"8px 4px",fontFamily:"monospace"},children:String(l)})]},String(r)))})})]}),e.jsx(n,{children:e.jsxs(a.Text,{type:"secondary",style:{fontSize:12},children:["Historical uptime chart — coming in next spec (requires daemon_health table). For now, run ",e.jsx("code",{children:"cf daemon status"})," in your terminal for recent history."]})})]})]})}export{C as default};
2
+ //# sourceMappingURL=DaemonHealthPage-DG2fyOP7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DaemonHealthPage-DG2fyOP7.js","sources":["../../src/pages/DaemonHealthPage.tsx"],"sourcesContent":["/**\n * DaemonHealthPage — placeholder page for /daemon-health.\n *\n * Displays current daemon health JSON and provides a link back.\n * Historical uptime chart is deferred to the next spec (daemon_health table).\n *\n * Spec: docs/design/2026-05-28/0843-daemon-watchdog-spec.md §5 Commit 3 Q4\n */\n\nimport { useQuery } from '@tanstack/react-query'\nimport { Card, Typography, Space, Button, Spin } from '@arco-design/web-react'\nimport { formatLocalDisplay, formatRelative } from '../utils/time'\n\ninterface HealthResponse {\n daemon: {\n status: 'alive' | 'stale' | 'dead'\n pid: number | null\n heartbeat_age_ms: number | null\n started_at: number | null\n version: string | null\n }\n}\n\nconst STATUS_COLORS = {\n alive: 'var(--color-success)',\n stale: 'var(--color-warning)',\n dead: 'var(--color-danger, #f53f3f)',\n}\n\nfunction formatAge(ms: number | null): string {\n if (ms == null) return 'no heartbeat'\n // Convert age-in-ms to a past timestamp, then format relative\n return formatRelative(Date.now() - ms)\n}\n\nfunction formatTs(ts: number | null): string {\n if (ts == null) return '—'\n return formatLocalDisplay(ts, { includeSeconds: true })\n}\n\nexport default function DaemonHealthPage() {\n const { data, isLoading, error, refetch } = useQuery<HealthResponse>({\n queryKey: ['daemon-health-page'],\n queryFn: async () => {\n const res = await fetch('/api/health')\n if (!res.ok) throw new Error(`HTTP ${res.status}`)\n return res.json()\n },\n refetchInterval: 15_000,\n retry: 1,\n })\n\n return (\n <div style={{ maxWidth: 640, margin: '0 auto' }}>\n <div style={{ marginBottom: 16, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography.Title heading={4} style={{ margin: 0 }}>\n Daemon Health\n </Typography.Title>\n <Button size=\"small\" onClick={() => refetch()}>\n Refresh\n </Button>\n </div>\n\n {isLoading && (\n <div style={{ textAlign: 'center', padding: 32 }}>\n <Spin />\n </div>\n )}\n\n {error && (\n <Card>\n <Typography.Text type=\"error\">\n Failed to load health data: {String(error)}\n </Typography.Text>\n </Card>\n )}\n\n {data && (\n <Space direction=\"vertical\" size={16} style={{ width: '100%' }}>\n <Card>\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 16 }}>\n <span\n style={{\n width: 12,\n height: 12,\n borderRadius: '50%',\n background: STATUS_COLORS[data.daemon.status] ?? '#999',\n display: 'inline-block',\n }}\n />\n <Typography.Title heading={5} style={{ margin: 0 }}>\n {data.daemon.status.toUpperCase()}\n </Typography.Title>\n </div>\n\n <table style={{ width: '100%', borderCollapse: 'collapse', fontSize: 13 }}>\n <tbody>\n {[\n ['Status', data.daemon.status],\n ['PID', data.daemon.pid ?? '—'],\n ['Heartbeat age', formatAge(data.daemon.heartbeat_age_ms)],\n ['Started at', formatTs(data.daemon.started_at)],\n ['Version', data.daemon.version ?? '—'],\n ].map(([label, value]) => (\n <tr key={String(label)} style={{ borderBottom: '1px solid var(--color-border-2)' }}>\n <td style={{ padding: '8px 4px', color: 'var(--color-text-3)', width: 140 }}>\n {label}\n </td>\n <td style={{ padding: '8px 4px', fontFamily: 'monospace' }}>\n {String(value)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </Card>\n\n <Card>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n Historical uptime chart — coming in next spec (requires daemon_health table).\n For now, run <code>cf daemon status</code> in your terminal for recent history.\n </Typography.Text>\n </Card>\n </Space>\n )}\n </div>\n )\n}\n"],"names":["STATUS_COLORS","formatAge","ms","formatRelative","formatTs","ts","formatLocalDisplay","DaemonHealthPage","data","isLoading","error","refetch","useQuery","res","jsxs","jsx","Typography","Button","Spin","Card","Space","label","value"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as x,j as e}from"./react-vendor-tkvCrao7.js";import{b,u as f,c as S,k as C}from"./query-S6X1S7K9.js";import{T as i,b as l,f as g,t as y,u as I,d as w,X as F,E as v,R as c,U as L,O as _}from"./arco-Bhi3a6Qp.js";import"./vendor-DWgdB1eY.js";async function D(s){const t=new URLSearchParams({limit:"50"});s!=="all"&&t.set("status",s);const a=await fetch(`/api/decisions?${t.toString()}`);if(!a.ok)throw new Error(`API ${a.status}`);return a.json()}async function P(s){const t=await fetch(`/api/decisions/${s}`);if(!t.ok)throw new Error(`API ${t.status}`);return t.json()}async function $(s){const t=await fetch(`/api/decisions/${s}/approve`,{method:"POST"});if(!t.ok)throw new Error(`API ${t.status}`);return t.json()}function T(s){return s==="pending"?e.jsx(l,{color:"orange",size:"small",children:"pending"}):s==="resolved"?e.jsx(l,{color:"green",size:"small",children:"resolved"}):s==="bypassed"?e.jsx(l,{color:"gray",size:"small",children:"bypassed"}):e.jsx(l,{color:"red",size:"small",children:"expired"})}function j(s){if(!s)return[];try{const t=JSON.parse(s);return Array.isArray(t)?t:[]}catch{return[]}}function O(s){try{return new Date(s.includes("T")?s:s.replace(" ","T")+"Z").toISOString().slice(0,16).replace("T"," ")}catch{return s}}function Q(){const[s,t]=x.useState("all"),[a,d]=x.useState(null),h=b(),{data:n,isLoading:o}=f({queryKey:["decisions-list",s],queryFn:()=>D(s),placeholderData:C,refetchInterval:3e4}),{data:p,isLoading:k}=f({queryKey:["decisions-detail",a],queryFn:()=>P(a),enabled:!!a}),m=S({mutationFn:r=>$(r),onSuccess:()=>{_.success("决策已批准"),h.invalidateQueries({queryKey:["decisions-list"]}),h.invalidateQueries({queryKey:["decisions-detail"]})},onError:r=>_.error(`批准失败: ${r.message}`)}),z=x.useMemo(()=>[{title:"id",dataIndex:"id",width:110,render:r=>e.jsx(i.Text,{style:{fontFamily:"monospace",fontSize:12},children:r})},{title:"状态",dataIndex:"status",width:100,render:r=>T(r)},{title:"workflow",dataIndex:"workflow_type",width:110,render:r=>e.jsx(l,{size:"small",children:r})},{title:"trigger_prompt",dataIndex:"trigger_prompt",ellipsis:!0,render:r=>r.length>80?e.jsxs("span",{title:r,children:[r.slice(0,80),e.jsx("span",{style:{color:"var(--color-text-3)"},children:"…"})]}):r},{title:"推荐 agents",dataIndex:"recommended_agents",width:200,render:r=>r?r.split(",").map(u=>e.jsx(l,{size:"small",color:"arcoblue",children:u.trim()},u.trim())):e.jsx("span",{style:{color:"var(--color-text-3)"},children:"—"})},{title:"创建时间",dataIndex:"created_at",width:150,render:r=>e.jsx("span",{style:{fontSize:12},children:O(r)})},{title:"操作",dataIndex:"id",width:200,render:(r,u)=>e.jsxs(g,{size:"small",children:[e.jsx(y,{size:"mini",onClick:()=>d(r),children:"查看"}),u.status==="pending"&&e.jsx(y,{type:"primary",size:"mini",loading:m.isPending&&m.variables===r,onClick:()=>m.mutate(r),children:"批准"})]})}],[m]);return e.jsxs("div",{style:{padding:0},children:[e.jsx(I,{bordered:!0,title:"决策记录",extra:e.jsxs(c.Group,{type:"button",size:"small",value:s,onChange:r=>t(r),children:[e.jsx(c,{value:"all",children:"全部"}),e.jsx(c,{value:"pending",children:"待批准"}),e.jsx(c,{value:"resolved",children:"已批准"}),e.jsx(c,{value:"bypassed",children:"已 bypass"}),e.jsx(c,{value:"expired",children:"过期"})]}),style:{marginBottom:16},children:o?e.jsx(w,{animation:!0}):n&&n.length>0?e.jsx(F,{data:n,columns:z,rowKey:"id",pagination:{pageSize:20,showTotal:!0},size:"small"}):e.jsx(v,{description:"暂无决策"})}),e.jsx(L,{title:p?`决策 #${p.id}`:"决策详情",visible:!!a,onCancel:()=>d(null),onOk:()=>d(null),width:640,footer:null,children:k?e.jsx(w,{animation:!0}):p?e.jsx(q,{detail:p,onApprove:()=>m.mutate(p.id)}):e.jsx(v,{description:"未找到决策"})})]})}function q({detail:s,onApprove:t}){const a=j(s.options_json),d=j(s.risks_json),h=j(s.open_questions_json);return e.jsxs("div",{children:[e.jsx("div",{style:{marginBottom:12},children:e.jsxs(g,{size:"small",children:[T(s.status),e.jsx(l,{size:"small",children:s.workflow_type}),s.status==="pending"&&e.jsx(y,{type:"primary",size:"small",onClick:t,children:"批准"})]})}),e.jsx(i.Title,{heading:6,children:"Trigger prompt"}),e.jsx(i.Paragraph,{style:{background:"var(--color-fill-1)",padding:8,borderRadius:4},children:s.trigger_prompt}),s.recommendation&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"推荐"}),e.jsx(i.Paragraph,{children:s.recommendation})]}),a.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"Options"}),e.jsx("ul",{style:{paddingLeft:18},children:a.map((n,o)=>e.jsxs("li",{children:[e.jsx("strong",{children:n.name??`Option ${o+1}`}),n.loc?` — LOC ${n.loc}`:"",n.risk?` — risk ${n.risk}`:""]},o))})]}),d.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"Risks"}),e.jsx("ul",{style:{paddingLeft:18},children:d.map((n,o)=>e.jsx("li",{children:n},o))})]}),h.length>0&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"Open Questions"}),e.jsx("ul",{style:{paddingLeft:18},children:h.map((n,o)=>e.jsx("li",{children:n},o))})]}),s.recommended_agents&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,children:"推荐 agents"}),e.jsx(g,{size:"small",wrap:!0,children:s.recommended_agents.split(",").map(n=>e.jsx(l,{color:"arcoblue",children:n.trim()},n.trim()))})]}),s.recommended_skills&&e.jsxs(e.Fragment,{children:[e.jsx(i.Title,{heading:6,style:{marginTop:12},children:"推荐 skills"}),e.jsx(g,{size:"small",wrap:!0,children:s.recommended_skills.split(",").map(n=>e.jsx(l,{color:"cyan",children:n.trim()},n.trim()))})]}),s.related_spawns.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs(i.Title,{heading:6,style:{marginTop:12},children:["关联 spawn (",s.related_spawns.length,")"]}),e.jsx("ul",{style:{paddingLeft:18},children:s.related_spawns.map(n=>e.jsxs("li",{children:[n.routed_to_name??"(unknown)"," — ts=",new Date(n.ts).toISOString().slice(0,19),n.obeyed===1?" ✅":n.obeyed===0?" ❌":" ⏳"]},n.id))})]}),(s.related_changelogs??[]).length>0&&e.jsxs(e.Fragment,{children:[e.jsxs(i.Title,{heading:6,style:{marginTop:12},children:["关联 changelog (",(s.related_changelogs??[]).length,")"]}),e.jsx("ul",{style:{paddingLeft:18,fontFamily:"monospace",fontSize:12},children:(s.related_changelogs??[]).map(n=>e.jsx("li",{children:n},n))})]}),s.decision_doc_path&&e.jsxs(i.Paragraph,{style:{marginTop:12,fontSize:12,color:"var(--color-text-3)"},children:["Decision doc: ",e.jsx("code",{children:s.decision_doc_path})]})]})}export{Q as default};
2
+ //# sourceMappingURL=DecisionsPage-CMAPEnKb.js.map