@winspan/claude-forge 8.54.4 → 9.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1053) hide show
  1. package/DEVELOPMENT.md +723 -46
  2. package/README.md +166 -21
  3. package/dist/catalogs/agents.json +67 -0
  4. package/dist/catalogs/skills.json +306 -0
  5. package/dist/claudemd/claudemd-generator.d.ts +45 -45
  6. package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
  7. package/dist/claudemd/claudemd-generator.js +128 -449
  8. package/dist/claudemd/claudemd-generator.js.map +1 -1
  9. package/dist/claudemd/index.d.ts +14 -4
  10. package/dist/claudemd/index.d.ts.map +1 -1
  11. package/dist/claudemd/index.js +15 -4
  12. package/dist/claudemd/index.js.map +1 -1
  13. package/dist/claudemd/resume-manager.d.ts.map +1 -1
  14. package/dist/claudemd/resume-manager.js +37 -9
  15. package/dist/claudemd/resume-manager.js.map +1 -1
  16. package/dist/claudemd/templates/swarm-protocol.md +35 -186
  17. package/dist/claudemd/violations-manager.d.ts +40 -0
  18. package/dist/claudemd/violations-manager.d.ts.map +1 -0
  19. package/dist/claudemd/violations-manager.js +106 -0
  20. package/dist/claudemd/violations-manager.js.map +1 -0
  21. package/dist/cli/commands/admin.d.ts +15 -0
  22. package/dist/cli/commands/admin.d.ts.map +1 -0
  23. package/dist/cli/commands/admin.js +177 -0
  24. package/dist/cli/commands/admin.js.map +1 -0
  25. package/dist/cli/commands/agent.d.ts +169 -0
  26. package/dist/cli/commands/agent.d.ts.map +1 -0
  27. package/dist/cli/commands/agent.js +690 -0
  28. package/dist/cli/commands/agent.js.map +1 -0
  29. package/dist/cli/commands/agents.d.ts +18 -0
  30. package/dist/cli/commands/agents.d.ts.map +1 -0
  31. package/dist/cli/commands/agents.js +160 -0
  32. package/dist/cli/commands/agents.js.map +1 -0
  33. package/dist/cli/commands/bypass.d.ts +18 -0
  34. package/dist/cli/commands/bypass.d.ts.map +1 -0
  35. package/dist/cli/commands/bypass.js +87 -0
  36. package/dist/cli/commands/bypass.js.map +1 -0
  37. package/dist/cli/commands/claudemd.d.ts +60 -0
  38. package/dist/cli/commands/claudemd.d.ts.map +1 -1
  39. package/dist/cli/commands/claudemd.js +174 -37
  40. package/dist/cli/commands/claudemd.js.map +1 -1
  41. package/dist/cli/commands/codegraph.d.ts +17 -0
  42. package/dist/cli/commands/codegraph.d.ts.map +1 -0
  43. package/dist/cli/commands/codegraph.js +263 -0
  44. package/dist/cli/commands/codegraph.js.map +1 -0
  45. package/dist/cli/commands/config.d.ts.map +1 -1
  46. package/dist/cli/commands/config.js +94 -1
  47. package/dist/cli/commands/config.js.map +1 -1
  48. package/dist/cli/commands/daemon.d.ts +39 -0
  49. package/dist/cli/commands/daemon.d.ts.map +1 -1
  50. package/dist/cli/commands/daemon.js +167 -20
  51. package/dist/cli/commands/daemon.js.map +1 -1
  52. package/dist/cli/commands/decisions.d.ts +129 -0
  53. package/dist/cli/commands/decisions.d.ts.map +1 -0
  54. package/dist/cli/commands/decisions.js +706 -0
  55. package/dist/cli/commands/decisions.js.map +1 -0
  56. package/dist/cli/commands/doctor.d.ts +29 -0
  57. package/dist/cli/commands/doctor.d.ts.map +1 -0
  58. package/dist/cli/commands/doctor.js +124 -0
  59. package/dist/cli/commands/doctor.js.map +1 -0
  60. package/dist/cli/commands/entropy.d.ts +35 -0
  61. package/dist/cli/commands/entropy.d.ts.map +1 -0
  62. package/dist/cli/commands/entropy.js +121 -0
  63. package/dist/cli/commands/entropy.js.map +1 -0
  64. package/dist/cli/commands/executions.d.ts +1 -0
  65. package/dist/cli/commands/executions.d.ts.map +1 -1
  66. package/dist/cli/commands/executions.js +12 -2
  67. package/dist/cli/commands/executions.js.map +1 -1
  68. package/dist/cli/commands/fix.d.ts +31 -0
  69. package/dist/cli/commands/fix.d.ts.map +1 -0
  70. package/dist/cli/commands/fix.js +108 -0
  71. package/dist/cli/commands/fix.js.map +1 -0
  72. package/dist/cli/commands/governance.d.ts +21 -0
  73. package/dist/cli/commands/governance.d.ts.map +1 -0
  74. package/dist/cli/commands/governance.js +60 -0
  75. package/dist/cli/commands/governance.js.map +1 -0
  76. package/dist/cli/commands/init.d.ts +27 -0
  77. package/dist/cli/commands/init.d.ts.map +1 -1
  78. package/dist/cli/commands/init.js +158 -146
  79. package/dist/cli/commands/init.js.map +1 -1
  80. package/dist/cli/commands/insights-goal-check.d.ts +54 -0
  81. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
  82. package/dist/cli/commands/insights-goal-check.js +318 -0
  83. package/dist/cli/commands/insights-goal-check.js.map +1 -0
  84. package/dist/cli/commands/insights.d.ts +15 -0
  85. package/dist/cli/commands/insights.d.ts.map +1 -0
  86. package/dist/cli/commands/insights.js +127 -0
  87. package/dist/cli/commands/insights.js.map +1 -0
  88. package/dist/cli/commands/knowledge.d.ts +117 -0
  89. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  90. package/dist/cli/commands/knowledge.js +1070 -0
  91. package/dist/cli/commands/knowledge.js.map +1 -0
  92. package/dist/cli/commands/loop.d.ts +95 -0
  93. package/dist/cli/commands/loop.d.ts.map +1 -0
  94. package/dist/cli/commands/loop.js +408 -0
  95. package/dist/cli/commands/loop.js.map +1 -0
  96. package/dist/cli/commands/maintenance.d.ts +33 -0
  97. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  98. package/dist/cli/commands/maintenance.js +75 -0
  99. package/dist/cli/commands/maintenance.js.map +1 -0
  100. package/dist/cli/commands/mcp.d.ts +22 -11
  101. package/dist/cli/commands/mcp.d.ts.map +1 -1
  102. package/dist/cli/commands/mcp.js +93 -5
  103. package/dist/cli/commands/mcp.js.map +1 -1
  104. package/dist/cli/commands/menu.d.ts.map +1 -1
  105. package/dist/cli/commands/menu.js +10 -184
  106. package/dist/cli/commands/menu.js.map +1 -1
  107. package/dist/cli/commands/project.d.ts +98 -0
  108. package/dist/cli/commands/project.d.ts.map +1 -0
  109. package/dist/cli/commands/project.js +382 -0
  110. package/dist/cli/commands/project.js.map +1 -0
  111. package/dist/cli/commands/skills.d.ts +131 -0
  112. package/dist/cli/commands/skills.d.ts.map +1 -1
  113. package/dist/cli/commands/skills.js +404 -118
  114. package/dist/cli/commands/skills.js.map +1 -1
  115. package/dist/cli/commands/spec.d.ts +40 -0
  116. package/dist/cli/commands/spec.d.ts.map +1 -0
  117. package/dist/cli/commands/spec.js +49 -0
  118. package/dist/cli/commands/spec.js.map +1 -0
  119. package/dist/cli/commands/stats.d.ts.map +1 -1
  120. package/dist/cli/commands/stats.js +11 -3
  121. package/dist/cli/commands/stats.js.map +1 -1
  122. package/dist/cli/commands/status.d.ts.map +1 -1
  123. package/dist/cli/commands/status.js +17 -2
  124. package/dist/cli/commands/status.js.map +1 -1
  125. package/dist/cli/commands/trace.d.ts.map +1 -1
  126. package/dist/cli/commands/trace.js +4 -9
  127. package/dist/cli/commands/trace.js.map +1 -1
  128. package/dist/cli/commands/violations.d.ts +14 -0
  129. package/dist/cli/commands/violations.d.ts.map +1 -0
  130. package/dist/cli/commands/violations.js +43 -0
  131. package/dist/cli/commands/violations.js.map +1 -0
  132. package/dist/cli/index.js +34 -0
  133. package/dist/cli/index.js.map +1 -1
  134. package/dist/cli/init/hook-manager.d.ts +1 -1
  135. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  136. package/dist/cli/init/hook-manager.js +6 -0
  137. package/dist/cli/init/hook-manager.js.map +1 -1
  138. package/dist/cli/utils/resolve-session.d.ts +32 -0
  139. package/dist/cli/utils/resolve-session.d.ts.map +1 -0
  140. package/dist/cli/utils/resolve-session.js +39 -0
  141. package/dist/cli/utils/resolve-session.js.map +1 -0
  142. package/dist/core/config.d.ts +4 -1
  143. package/dist/core/config.d.ts.map +1 -1
  144. package/dist/core/config.js +11 -23
  145. package/dist/core/config.js.map +1 -1
  146. package/dist/core/constants.d.ts +51 -13
  147. package/dist/core/constants.d.ts.map +1 -1
  148. package/dist/core/constants.js +63 -13
  149. package/dist/core/constants.js.map +1 -1
  150. package/dist/core/diagnostics/checks.d.ts +151 -0
  151. package/dist/core/diagnostics/checks.d.ts.map +1 -0
  152. package/dist/core/diagnostics/checks.js +766 -0
  153. package/dist/core/diagnostics/checks.js.map +1 -0
  154. package/dist/core/diagnostics/daemon-status.d.ts +77 -0
  155. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
  156. package/dist/core/diagnostics/daemon-status.js +113 -0
  157. package/dist/core/diagnostics/daemon-status.js.map +1 -0
  158. package/dist/core/diagnostics/entropy-checks.d.ts +83 -0
  159. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
  160. package/dist/core/diagnostics/entropy-checks.js +400 -0
  161. package/dist/core/diagnostics/entropy-checks.js.map +1 -0
  162. package/dist/core/diagnostics/fix-runner.d.ts +54 -0
  163. package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
  164. package/dist/core/diagnostics/fix-runner.js +90 -0
  165. package/dist/core/diagnostics/fix-runner.js.map +1 -0
  166. package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
  167. package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
  168. package/dist/core/diagnostics/heartbeat-reader.js +50 -0
  169. package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
  170. package/dist/core/diagnostics/knip-runner.d.ts +49 -0
  171. package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
  172. package/dist/core/diagnostics/knip-runner.js +100 -0
  173. package/dist/core/diagnostics/knip-runner.js.map +1 -0
  174. package/dist/core/diagnostics/markers.d.ts +96 -0
  175. package/dist/core/diagnostics/markers.d.ts.map +1 -0
  176. package/dist/core/diagnostics/markers.js +153 -0
  177. package/dist/core/diagnostics/markers.js.map +1 -0
  178. package/dist/core/event-fields.d.ts +27 -0
  179. package/dist/core/event-fields.d.ts.map +1 -1
  180. package/dist/core/event-fields.js +43 -0
  181. package/dist/core/event-fields.js.map +1 -1
  182. package/dist/core/governance/global-inject.d.ts +90 -0
  183. package/dist/core/governance/global-inject.d.ts.map +1 -0
  184. package/dist/core/governance/global-inject.js +184 -0
  185. package/dist/core/governance/global-inject.js.map +1 -0
  186. package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
  187. package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
  188. package/dist/core/insights/agent-anchor-guard.js +119 -0
  189. package/dist/core/insights/agent-anchor-guard.js.map +1 -0
  190. package/dist/core/insights/agent-distill-context.d.ts +55 -0
  191. package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
  192. package/dist/core/insights/agent-distill-context.js +146 -0
  193. package/dist/core/insights/agent-distill-context.js.map +1 -0
  194. package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
  195. package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
  196. package/dist/core/insights/agent-distill-spawn.js +179 -0
  197. package/dist/core/insights/agent-distill-spawn.js.map +1 -0
  198. package/dist/core/insights/agent-drift.d.ts +66 -0
  199. package/dist/core/insights/agent-drift.d.ts.map +1 -0
  200. package/dist/core/insights/agent-drift.js +109 -0
  201. package/dist/core/insights/agent-drift.js.map +1 -0
  202. package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
  203. package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
  204. package/dist/core/insights/agent-evolution-sources.js +36 -0
  205. package/dist/core/insights/agent-evolution-sources.js.map +1 -0
  206. package/dist/core/insights/agent-health.d.ts +142 -0
  207. package/dist/core/insights/agent-health.d.ts.map +1 -0
  208. package/dist/core/insights/agent-health.js +296 -0
  209. package/dist/core/insights/agent-health.js.map +1 -0
  210. package/dist/core/insights/agent-patch-apply.d.ts +45 -0
  211. package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
  212. package/dist/core/insights/agent-patch-apply.js +165 -0
  213. package/dist/core/insights/agent-patch-apply.js.map +1 -0
  214. package/dist/core/insights/agent-suggest.d.ts +128 -0
  215. package/dist/core/insights/agent-suggest.d.ts.map +1 -0
  216. package/dist/core/insights/agent-suggest.js +284 -0
  217. package/dist/core/insights/agent-suggest.js.map +1 -0
  218. package/dist/core/insights/coverage-tiers.d.ts +46 -0
  219. package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
  220. package/dist/core/insights/coverage-tiers.js +95 -0
  221. package/dist/core/insights/coverage-tiers.js.map +1 -0
  222. package/dist/core/insights/experience-extractor.d.ts +60 -0
  223. package/dist/core/insights/experience-extractor.d.ts.map +1 -0
  224. package/dist/core/insights/experience-extractor.js +319 -0
  225. package/dist/core/insights/experience-extractor.js.map +1 -0
  226. package/dist/core/insights/violation-reporter.d.ts +149 -0
  227. package/dist/core/insights/violation-reporter.d.ts.map +1 -0
  228. package/dist/core/insights/violation-reporter.js +391 -0
  229. package/dist/core/insights/violation-reporter.js.map +1 -0
  230. package/dist/core/loop/loop-engine.d.ts +140 -0
  231. package/dist/core/loop/loop-engine.d.ts.map +1 -0
  232. package/dist/core/loop/loop-engine.js +266 -0
  233. package/dist/core/loop/loop-engine.js.map +1 -0
  234. package/dist/core/queue/index.d.ts +16 -3
  235. package/dist/core/queue/index.d.ts.map +1 -1
  236. package/dist/core/queue/index.js +16 -4
  237. package/dist/core/queue/index.js.map +1 -1
  238. package/dist/core/storage/base.d.ts +317 -0
  239. package/dist/core/storage/base.d.ts.map +1 -1
  240. package/dist/core/storage/base.js +1093 -0
  241. package/dist/core/storage/base.js.map +1 -1
  242. package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
  243. package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
  244. package/dist/core/storage/codec/tool-input-codec.js +159 -0
  245. package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
  246. package/dist/core/storage/codegraph-types.d.ts +79 -0
  247. package/dist/core/storage/codegraph-types.d.ts.map +1 -0
  248. package/dist/core/storage/codegraph-types.js +14 -0
  249. package/dist/core/storage/codegraph-types.js.map +1 -0
  250. package/dist/core/storage/codegraph.d.ts +186 -0
  251. package/dist/core/storage/codegraph.d.ts.map +1 -0
  252. package/dist/core/storage/codegraph.js +452 -0
  253. package/dist/core/storage/codegraph.js.map +1 -0
  254. package/dist/core/storage/decisions.d.ts +387 -0
  255. package/dist/core/storage/decisions.d.ts.map +1 -0
  256. package/dist/core/storage/decisions.js +534 -0
  257. package/dist/core/storage/decisions.js.map +1 -0
  258. package/dist/core/storage/events.d.ts +239 -8
  259. package/dist/core/storage/events.d.ts.map +1 -1
  260. package/dist/core/storage/events.js +705 -39
  261. package/dist/core/storage/events.js.map +1 -1
  262. package/dist/core/storage/feedback.d.ts +111 -0
  263. package/dist/core/storage/feedback.d.ts.map +1 -0
  264. package/dist/core/storage/feedback.js +186 -0
  265. package/dist/core/storage/feedback.js.map +1 -0
  266. package/dist/core/storage/forge-config.d.ts +40 -0
  267. package/dist/core/storage/forge-config.d.ts.map +1 -0
  268. package/dist/core/storage/forge-config.js +65 -0
  269. package/dist/core/storage/forge-config.js.map +1 -0
  270. package/dist/core/storage/injections.d.ts +68 -0
  271. package/dist/core/storage/injections.d.ts.map +1 -1
  272. package/dist/core/storage/injections.js +131 -5
  273. package/dist/core/storage/injections.js.map +1 -1
  274. package/dist/core/storage/knowledge.d.ts +332 -0
  275. package/dist/core/storage/knowledge.d.ts.map +1 -0
  276. package/dist/core/storage/knowledge.js +589 -0
  277. package/dist/core/storage/knowledge.js.map +1 -0
  278. package/dist/core/storage/maintenance.d.ts +36 -9
  279. package/dist/core/storage/maintenance.d.ts.map +1 -1
  280. package/dist/core/storage/maintenance.js +56 -24
  281. package/dist/core/storage/maintenance.js.map +1 -1
  282. package/dist/core/storage/pipeline-rollup.d.ts +111 -0
  283. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
  284. package/dist/core/storage/pipeline-rollup.js +432 -0
  285. package/dist/core/storage/pipeline-rollup.js.map +1 -0
  286. package/dist/core/storage/routing.d.ts +50 -3
  287. package/dist/core/storage/routing.d.ts.map +1 -1
  288. package/dist/core/storage/routing.js +131 -10
  289. package/dist/core/storage/routing.js.map +1 -1
  290. package/dist/core/storage/rows.d.ts +31 -8
  291. package/dist/core/storage/rows.d.ts.map +1 -1
  292. package/dist/core/storage/schema.sql +367 -23
  293. package/dist/core/storage/sessions.d.ts +136 -0
  294. package/dist/core/storage/sessions.d.ts.map +1 -1
  295. package/dist/core/storage/sessions.js +352 -15
  296. package/dist/core/storage/sessions.js.map +1 -1
  297. package/dist/core/storage/skills.d.ts +160 -0
  298. package/dist/core/storage/skills.d.ts.map +1 -1
  299. package/dist/core/storage/skills.js +368 -7
  300. package/dist/core/storage/skills.js.map +1 -1
  301. package/dist/core/storage/sqlite.d.ts +309 -20
  302. package/dist/core/storage/sqlite.d.ts.map +1 -1
  303. package/dist/core/storage/sqlite.js +523 -16
  304. package/dist/core/storage/sqlite.js.map +1 -1
  305. package/dist/core/storage/tasks.d.ts +744 -2
  306. package/dist/core/storage/tasks.d.ts.map +1 -1
  307. package/dist/core/storage/tasks.js +1691 -17
  308. package/dist/core/storage/tasks.js.map +1 -1
  309. package/dist/core/storage/tool-intercepts.d.ts +69 -0
  310. package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
  311. package/dist/core/storage/tool-intercepts.js +116 -0
  312. package/dist/core/storage/tool-intercepts.js.map +1 -0
  313. package/dist/core/types.d.ts +136 -18
  314. package/dist/core/types.d.ts.map +1 -1
  315. package/dist/core/types.js +10 -0
  316. package/dist/core/types.js.map +1 -1
  317. package/dist/core/utils/backup.d.ts +81 -0
  318. package/dist/core/utils/backup.d.ts.map +1 -0
  319. package/dist/core/utils/backup.js +98 -0
  320. package/dist/core/utils/backup.js.map +1 -0
  321. package/dist/core/utils/binary-paths.d.ts +124 -0
  322. package/dist/core/utils/binary-paths.d.ts.map +1 -0
  323. package/dist/core/utils/binary-paths.js +218 -0
  324. package/dist/core/utils/binary-paths.js.map +1 -0
  325. package/dist/core/utils/bypass-token.d.ts +75 -0
  326. package/dist/core/utils/bypass-token.d.ts.map +1 -0
  327. package/dist/core/utils/bypass-token.js +133 -0
  328. package/dist/core/utils/bypass-token.js.map +1 -0
  329. package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
  330. package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
  331. package/dist/core/utils/cc-builtin-agents.js +29 -0
  332. package/dist/core/utils/cc-builtin-agents.js.map +1 -0
  333. package/dist/core/utils/claude-cli-resolver.d.ts +26 -0
  334. package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
  335. package/dist/core/utils/claude-cli-resolver.js +115 -0
  336. package/dist/core/utils/claude-cli-resolver.js.map +1 -0
  337. package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
  338. package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
  339. package/dist/core/utils/claude-cli-spawn.js +219 -0
  340. package/dist/core/utils/claude-cli-spawn.js.map +1 -0
  341. package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
  342. package/dist/core/utils/forge-resume-block.js +3 -2
  343. package/dist/core/utils/forge-resume-block.js.map +1 -1
  344. package/dist/core/utils/logger.d.ts +15 -3
  345. package/dist/core/utils/logger.d.ts.map +1 -1
  346. package/dist/core/utils/logger.js +20 -2
  347. package/dist/core/utils/logger.js.map +1 -1
  348. package/dist/core/utils/noise-prompt.d.ts +97 -0
  349. package/dist/core/utils/noise-prompt.d.ts.map +1 -0
  350. package/dist/core/utils/noise-prompt.js +127 -0
  351. package/dist/core/utils/noise-prompt.js.map +1 -0
  352. package/dist/core/utils/path.d.ts +0 -4
  353. package/dist/core/utils/path.d.ts.map +1 -1
  354. package/dist/core/utils/path.js +0 -7
  355. package/dist/core/utils/path.js.map +1 -1
  356. package/dist/core/utils/time.d.ts +67 -0
  357. package/dist/core/utils/time.d.ts.map +1 -1
  358. package/dist/core/utils/time.js +147 -0
  359. package/dist/core/utils/time.js.map +1 -1
  360. package/dist/daemon/agent-sync.d.ts +24 -0
  361. package/dist/daemon/agent-sync.d.ts.map +1 -0
  362. package/dist/daemon/agent-sync.js +114 -0
  363. package/dist/daemon/agent-sync.js.map +1 -0
  364. package/dist/daemon/config-store.d.ts +55 -0
  365. package/dist/daemon/config-store.d.ts.map +1 -0
  366. package/dist/daemon/config-store.js +146 -0
  367. package/dist/daemon/config-store.js.map +1 -0
  368. package/dist/daemon/event-parser.d.ts +22 -0
  369. package/dist/daemon/event-parser.d.ts.map +1 -1
  370. package/dist/daemon/event-parser.js +54 -3
  371. package/dist/daemon/event-parser.js.map +1 -1
  372. package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
  373. package/dist/daemon/handlers/history-exporter.js +9 -8
  374. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  375. package/dist/daemon/handlers/post-tool-use.d.ts +66 -4
  376. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  377. package/dist/daemon/handlers/post-tool-use.js +221 -8
  378. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  379. package/dist/daemon/handlers/pre-tool-use.d.ts +181 -0
  380. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
  381. package/dist/daemon/handlers/pre-tool-use.js +618 -0
  382. package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
  383. package/dist/daemon/handlers/stop.d.ts +55 -7
  384. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  385. package/dist/daemon/handlers/stop.js +245 -8
  386. package/dist/daemon/handlers/stop.js.map +1 -1
  387. package/dist/daemon/handlers/user-prompt.d.ts +51 -14
  388. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  389. package/dist/daemon/handlers/user-prompt.js +223 -95
  390. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  391. package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
  392. package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
  393. package/dist/daemon/handlers/violation-content-backfill.js +167 -0
  394. package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
  395. package/dist/daemon/hook-sync.d.ts.map +1 -1
  396. package/dist/daemon/hook-sync.js +2 -1
  397. package/dist/daemon/hook-sync.js.map +1 -1
  398. package/dist/daemon/index.d.ts +19 -0
  399. package/dist/daemon/index.d.ts.map +1 -1
  400. package/dist/daemon/index.js +439 -86
  401. package/dist/daemon/index.js.map +1 -1
  402. package/dist/daemon/lifecycle.d.ts +48 -1
  403. package/dist/daemon/lifecycle.d.ts.map +1 -1
  404. package/dist/daemon/lifecycle.js +98 -2
  405. package/dist/daemon/lifecycle.js.map +1 -1
  406. package/dist/daemon/router.d.ts +4 -1
  407. package/dist/daemon/router.d.ts.map +1 -1
  408. package/dist/daemon/router.js +4 -2
  409. package/dist/daemon/router.js.map +1 -1
  410. package/dist/daemon/rules/defaults.d.ts +20 -0
  411. package/dist/daemon/rules/defaults.d.ts.map +1 -0
  412. package/dist/daemon/rules/defaults.js +779 -0
  413. package/dist/daemon/rules/defaults.js.map +1 -0
  414. package/dist/daemon/rules/registry.d.ts +47 -0
  415. package/dist/daemon/rules/registry.d.ts.map +1 -0
  416. package/dist/daemon/rules/registry.js +84 -0
  417. package/dist/daemon/rules/registry.js.map +1 -0
  418. package/dist/daemon/rules/types.d.ts +176 -0
  419. package/dist/daemon/rules/types.d.ts.map +1 -0
  420. package/dist/daemon/rules/types.js +15 -0
  421. package/dist/daemon/rules/types.js.map +1 -0
  422. package/dist/daemon/rules/whitelist.d.ts +101 -0
  423. package/dist/daemon/rules/whitelist.d.ts.map +1 -0
  424. package/dist/daemon/rules/whitelist.js +210 -0
  425. package/dist/daemon/rules/whitelist.js.map +1 -0
  426. package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
  427. package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
  428. package/dist/daemon/rules/workflow-defaults.js +521 -0
  429. package/dist/daemon/rules/workflow-defaults.js.map +1 -0
  430. package/dist/daemon/server.d.ts +11 -1
  431. package/dist/daemon/server.d.ts.map +1 -1
  432. package/dist/daemon/server.js +7 -1
  433. package/dist/daemon/server.js.map +1 -1
  434. package/dist/daemon/services/codegraph-sync.d.ts +94 -0
  435. package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
  436. package/dist/daemon/services/codegraph-sync.js +159 -0
  437. package/dist/daemon/services/codegraph-sync.js.map +1 -0
  438. package/dist/daemon/services/context-injector.d.ts +34 -0
  439. package/dist/daemon/services/context-injector.d.ts.map +1 -0
  440. package/dist/daemon/services/context-injector.js +61 -0
  441. package/dist/daemon/services/context-injector.js.map +1 -0
  442. package/dist/daemon/services/decision-hint.d.ts +240 -0
  443. package/dist/daemon/services/decision-hint.d.ts.map +1 -0
  444. package/dist/daemon/services/decision-hint.js +562 -0
  445. package/dist/daemon/services/decision-hint.js.map +1 -0
  446. package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
  447. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
  448. package/dist/daemon/services/event-ttl-sweep.js +124 -0
  449. package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
  450. package/dist/daemon/services/feedback-aggregator.d.ts +167 -0
  451. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
  452. package/dist/daemon/services/feedback-aggregator.js +415 -0
  453. package/dist/daemon/services/feedback-aggregator.js.map +1 -0
  454. package/dist/daemon/services/heartbeat-writer.d.ts +46 -0
  455. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
  456. package/dist/daemon/services/heartbeat-writer.js +82 -0
  457. package/dist/daemon/services/heartbeat-writer.js.map +1 -0
  458. package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
  459. package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
  460. package/dist/daemon/services/idle-session-sweeper.js +94 -0
  461. package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
  462. package/dist/daemon/services/idle-task-budget.d.ts +50 -0
  463. package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
  464. package/dist/daemon/services/idle-task-budget.js +72 -0
  465. package/dist/daemon/services/idle-task-budget.js.map +1 -0
  466. package/dist/daemon/services/intercept-revive.d.ts +60 -0
  467. package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
  468. package/dist/daemon/services/intercept-revive.js +86 -0
  469. package/dist/daemon/services/intercept-revive.js.map +1 -0
  470. package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
  471. package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
  472. package/dist/daemon/services/intercept-rollback-guard.js +152 -0
  473. package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
  474. package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
  475. package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
  476. package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
  477. package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
  478. package/dist/daemon/services/kb-injector.d.ts +57 -0
  479. package/dist/daemon/services/kb-injector.d.ts.map +1 -0
  480. package/dist/daemon/services/kb-injector.js +148 -0
  481. package/dist/daemon/services/kb-injector.js.map +1 -0
  482. package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
  483. package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
  484. package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
  485. package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
  486. package/dist/daemon/services/loop-hint.d.ts +139 -0
  487. package/dist/daemon/services/loop-hint.d.ts.map +1 -0
  488. package/dist/daemon/services/loop-hint.js +272 -0
  489. package/dist/daemon/services/loop-hint.js.map +1 -0
  490. package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
  491. package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
  492. package/dist/daemon/services/outcome-classification-service.js +214 -0
  493. package/dist/daemon/services/outcome-classification-service.js.map +1 -0
  494. package/dist/daemon/services/outcome-classifier.d.ts +136 -0
  495. package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
  496. package/dist/daemon/services/outcome-classifier.js +178 -0
  497. package/dist/daemon/services/outcome-classifier.js.map +1 -0
  498. package/dist/daemon/services/outcome-nudge.d.ts +107 -0
  499. package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
  500. package/dist/daemon/services/outcome-nudge.js +242 -0
  501. package/dist/daemon/services/outcome-nudge.js.map +1 -0
  502. package/dist/daemon/services/spec-approval.d.ts +127 -0
  503. package/dist/daemon/services/spec-approval.d.ts.map +1 -0
  504. package/dist/daemon/services/spec-approval.js +216 -0
  505. package/dist/daemon/services/spec-approval.js.map +1 -0
  506. package/dist/daemon/services/spec-gate.d.ts +54 -0
  507. package/dist/daemon/services/spec-gate.d.ts.map +1 -0
  508. package/dist/daemon/services/spec-gate.js +113 -0
  509. package/dist/daemon/services/spec-gate.js.map +1 -0
  510. package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
  511. package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
  512. package/dist/daemon/services/task-boundary-classifier.js +202 -0
  513. package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
  514. package/dist/daemon/services/task-segmenter.d.ts +230 -1
  515. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  516. package/dist/daemon/services/task-segmenter.js +527 -17
  517. package/dist/daemon/services/task-segmenter.js.map +1 -1
  518. package/dist/daemon/skill-sync.d.ts +7 -2
  519. package/dist/daemon/skill-sync.d.ts.map +1 -1
  520. package/dist/daemon/skill-sync.js +114 -9
  521. package/dist/daemon/skill-sync.js.map +1 -1
  522. package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
  523. package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
  524. package/dist/daemon/startup/maintenance-schedulers.js +294 -0
  525. package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
  526. package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
  527. package/dist/daemon/templates/agents/claudemd-writer.md +102 -0
  528. package/dist/daemon/templates/agents/coder.md +262 -0
  529. package/dist/daemon/templates/agents/decision-maker.md +546 -0
  530. package/dist/daemon/templates/agents/doc-reviewer.md +118 -0
  531. package/dist/daemon/templates/agents/harness-debug-full.md +196 -0
  532. package/dist/daemon/templates/agents/knowledge-builder.md +120 -0
  533. package/dist/daemon/templates/agents/patch-applier.md +145 -0
  534. package/dist/daemon/templates/agents/planner.md +217 -0
  535. package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
  536. package/dist/daemon/templates/agents/skill-distiller.md +114 -0
  537. package/dist/daemon/templates/agents/task-boundary-classifier.md +65 -0
  538. package/dist/daemon/templates/agents/verify-agent.md +259 -0
  539. package/dist/daemon/utils/inject-block.d.ts +39 -0
  540. package/dist/daemon/utils/inject-block.d.ts.map +1 -0
  541. package/dist/daemon/utils/inject-block.js +25 -0
  542. package/dist/daemon/utils/inject-block.js.map +1 -0
  543. package/dist/hooks/hook-lib.sh +8 -0
  544. package/dist/hooks/notification.sh +19 -8
  545. package/dist/hooks/post-tool-use.sh +41 -23
  546. package/dist/hooks/pre-tool-use.sh +54 -23
  547. package/dist/hooks/session-start.sh +68 -0
  548. package/dist/hooks/stop.sh +31 -11
  549. package/dist/hooks/user-prompt-submit.sh +37 -21
  550. package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
  551. package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
  552. package/dist/knowledge/adapters/go-adapter.js +294 -0
  553. package/dist/knowledge/adapters/go-adapter.js.map +1 -0
  554. package/dist/knowledge/adapters/index.d.ts +41 -0
  555. package/dist/knowledge/adapters/index.d.ts.map +1 -0
  556. package/dist/knowledge/adapters/index.js +71 -0
  557. package/dist/knowledge/adapters/index.js.map +1 -0
  558. package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
  559. package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
  560. package/dist/knowledge/adapters/java-adapter.js +260 -0
  561. package/dist/knowledge/adapters/java-adapter.js.map +1 -0
  562. package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
  563. package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
  564. package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
  565. package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
  566. package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
  567. package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
  568. package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
  569. package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
  570. package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
  571. package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
  572. package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
  573. package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
  574. package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
  575. package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
  576. package/dist/knowledge/adapters/python-adapter.js +358 -0
  577. package/dist/knowledge/adapters/python-adapter.js.map +1 -0
  578. package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
  579. package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
  580. package/dist/knowledge/adapters/rust-adapter.js +329 -0
  581. package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
  582. package/dist/knowledge/adapters/types.d.ts +99 -0
  583. package/dist/knowledge/adapters/types.d.ts.map +1 -0
  584. package/dist/knowledge/adapters/types.js +17 -0
  585. package/dist/knowledge/adapters/types.js.map +1 -0
  586. package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
  587. package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
  588. package/dist/knowledge/adapters/typescript-adapter.js +171 -0
  589. package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
  590. package/dist/knowledge/audit-applier.d.ts +70 -0
  591. package/dist/knowledge/audit-applier.d.ts.map +1 -0
  592. package/dist/knowledge/audit-applier.js +251 -0
  593. package/dist/knowledge/audit-applier.js.map +1 -0
  594. package/dist/knowledge/builder.d.ts +261 -0
  595. package/dist/knowledge/builder.d.ts.map +1 -0
  596. package/dist/knowledge/builder.js +966 -0
  597. package/dist/knowledge/builder.js.map +1 -0
  598. package/dist/knowledge/cli-provider.d.ts +151 -0
  599. package/dist/knowledge/cli-provider.d.ts.map +1 -0
  600. package/dist/knowledge/cli-provider.js +313 -0
  601. package/dist/knowledge/cli-provider.js.map +1 -0
  602. package/dist/knowledge/constants.d.ts +78 -0
  603. package/dist/knowledge/constants.d.ts.map +1 -0
  604. package/dist/knowledge/constants.js +98 -0
  605. package/dist/knowledge/constants.js.map +1 -0
  606. package/dist/knowledge/cross-module.d.ts +139 -0
  607. package/dist/knowledge/cross-module.d.ts.map +1 -0
  608. package/dist/knowledge/cross-module.js +370 -0
  609. package/dist/knowledge/cross-module.js.map +1 -0
  610. package/dist/knowledge/git-hooks.d.ts +67 -0
  611. package/dist/knowledge/git-hooks.d.ts.map +1 -0
  612. package/dist/knowledge/git-hooks.js +258 -0
  613. package/dist/knowledge/git-hooks.js.map +1 -0
  614. package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
  615. package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
  616. package/dist/knowledge/graph/edge-extractor.js +242 -0
  617. package/dist/knowledge/graph/edge-extractor.js.map +1 -0
  618. package/dist/knowledge/graph/impact.d.ts +73 -0
  619. package/dist/knowledge/graph/impact.d.ts.map +1 -0
  620. package/dist/knowledge/graph/impact.js +94 -0
  621. package/dist/knowledge/graph/impact.js.map +1 -0
  622. package/dist/knowledge/graph/types.d.ts +22 -0
  623. package/dist/knowledge/graph/types.d.ts.map +1 -0
  624. package/dist/knowledge/graph/types.js +13 -0
  625. package/dist/knowledge/graph/types.js.map +1 -0
  626. package/dist/knowledge/module-hash.d.ts +88 -0
  627. package/dist/knowledge/module-hash.d.ts.map +1 -0
  628. package/dist/knowledge/module-hash.js +162 -0
  629. package/dist/knowledge/module-hash.js.map +1 -0
  630. package/dist/knowledge/project-detector.d.ts +101 -0
  631. package/dist/knowledge/project-detector.d.ts.map +1 -0
  632. package/dist/knowledge/project-detector.js +223 -0
  633. package/dist/knowledge/project-detector.js.map +1 -0
  634. package/dist/knowledge/prompt.d.ts +237 -0
  635. package/dist/knowledge/prompt.d.ts.map +1 -0
  636. package/dist/knowledge/prompt.js +416 -0
  637. package/dist/knowledge/prompt.js.map +1 -0
  638. package/dist/knowledge/query.d.ts +118 -0
  639. package/dist/knowledge/query.d.ts.map +1 -0
  640. package/dist/knowledge/query.js +438 -0
  641. package/dist/knowledge/query.js.map +1 -0
  642. package/dist/knowledge/repo-map.d.ts +97 -0
  643. package/dist/knowledge/repo-map.d.ts.map +1 -0
  644. package/dist/knowledge/repo-map.js +447 -0
  645. package/dist/knowledge/repo-map.js.map +1 -0
  646. package/dist/knowledge/tools/index.d.ts +14 -0
  647. package/dist/knowledge/tools/index.d.ts.map +1 -0
  648. package/dist/knowledge/tools/index.js +11 -0
  649. package/dist/knowledge/tools/index.js.map +1 -0
  650. package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
  651. package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
  652. package/dist/knowledge/tools/knowledge-get-page.js +101 -0
  653. package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
  654. package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
  655. package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
  656. package/dist/knowledge/tools/knowledge-query.js +104 -0
  657. package/dist/knowledge/tools/knowledge-query.js.map +1 -0
  658. package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
  659. package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
  660. package/dist/knowledge/tools/repo-map-lookup.js +82 -0
  661. package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
  662. package/dist/knowledge/types.d.ts +269 -0
  663. package/dist/knowledge/types.d.ts.map +1 -0
  664. package/dist/knowledge/types.js +10 -0
  665. package/dist/knowledge/types.js.map +1 -0
  666. package/dist/knowledge/validator.d.ts +90 -0
  667. package/dist/knowledge/validator.d.ts.map +1 -0
  668. package/dist/knowledge/validator.js +355 -0
  669. package/dist/knowledge/validator.js.map +1 -0
  670. package/dist/mcp/server.d.ts +64 -8
  671. package/dist/mcp/server.d.ts.map +1 -1
  672. package/dist/mcp/server.js +448 -12
  673. package/dist/mcp/server.js.map +1 -1
  674. package/dist/skills/builtin-skills.d.ts +35 -0
  675. package/dist/skills/builtin-skills.d.ts.map +1 -0
  676. package/dist/skills/builtin-skills.js +68 -0
  677. package/dist/skills/builtin-skills.js.map +1 -0
  678. package/dist/skills/distill/attribution.d.ts +59 -0
  679. package/dist/skills/distill/attribution.d.ts.map +1 -0
  680. package/dist/skills/distill/attribution.js +101 -0
  681. package/dist/skills/distill/attribution.js.map +1 -0
  682. package/dist/skills/distill/distiller.d.ts +161 -0
  683. package/dist/skills/distill/distiller.d.ts.map +1 -0
  684. package/dist/skills/distill/distiller.js +461 -0
  685. package/dist/skills/distill/distiller.js.map +1 -0
  686. package/dist/skills/distill/index.d.ts +223 -0
  687. package/dist/skills/distill/index.d.ts.map +1 -0
  688. package/dist/skills/distill/index.js +466 -0
  689. package/dist/skills/distill/index.js.map +1 -0
  690. package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
  691. package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
  692. package/dist/skills/distill/project-anchor-guard.js +334 -0
  693. package/dist/skills/distill/project-anchor-guard.js.map +1 -0
  694. package/dist/skills/distill/topic-deduper.d.ts +77 -0
  695. package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
  696. package/dist/skills/distill/topic-deduper.js +119 -0
  697. package/dist/skills/distill/topic-deduper.js.map +1 -0
  698. package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
  699. package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
  700. package/dist/skills/distill/upstream-fetcher.js +202 -0
  701. package/dist/skills/distill/upstream-fetcher.js.map +1 -0
  702. package/dist/skills/distilled/distilled-api-design.md +495 -0
  703. package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
  704. package/dist/skills/distilled/distilled-brainstorming.md +79 -0
  705. package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
  706. package/dist/skills/distilled/distilled-canvas-design.md +128 -0
  707. package/dist/skills/distilled/distilled-claude-api.md +185 -0
  708. package/dist/skills/distilled/distilled-creator.md +181 -0
  709. package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
  710. package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
  711. package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
  712. package/dist/skills/distilled/distilled-docx.md +231 -0
  713. package/dist/skills/distilled/distilled-executing-plans.md +148 -0
  714. package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
  715. package/dist/skills/distilled/distilled-frontend-design.md +118 -0
  716. package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
  717. package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
  718. package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
  719. package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
  720. package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
  721. package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
  722. package/dist/skills/distilled/distilled-systematic-debugging.md +154 -0
  723. package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
  724. package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
  725. package/dist/skills/distilled/distilled-verification-before-completion.md +213 -0
  726. package/dist/skills/distilled/distilled-writing-skills.md +175 -0
  727. package/dist/skills/registry.d.ts +55 -51
  728. package/dist/skills/registry.d.ts.map +1 -1
  729. package/dist/skills/registry.js +82 -196
  730. package/dist/skills/registry.js.map +1 -1
  731. package/dist/skills/tools/pipeline-suggest.js +14 -14
  732. package/dist/skills/tools/pipeline-suggest.js.map +1 -1
  733. package/dist/skills/tools/skill-invoke.d.ts +3 -2
  734. package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
  735. package/dist/skills/tools/skill-invoke.js +4 -2
  736. package/dist/skills/tools/skill-invoke.js.map +1 -1
  737. package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
  738. package/dist/web/analytics/anti-pattern-detector.js +6 -1
  739. package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
  740. package/dist/web/analytics/drift-detector.d.ts +6 -0
  741. package/dist/web/analytics/drift-detector.d.ts.map +1 -1
  742. package/dist/web/analytics/drift-detector.js +15 -8
  743. package/dist/web/analytics/drift-detector.js.map +1 -1
  744. package/dist/web/analytics/weekly-report.d.ts +13 -0
  745. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  746. package/dist/web/analytics/weekly-report.js +17 -3
  747. package/dist/web/analytics/weekly-report.js.map +1 -1
  748. package/dist/web/routes/_helpers.d.ts +31 -0
  749. package/dist/web/routes/_helpers.d.ts.map +1 -1
  750. package/dist/web/routes/_helpers.js +33 -0
  751. package/dist/web/routes/_helpers.js.map +1 -1
  752. package/dist/web/routes/agent-content.d.ts +30 -0
  753. package/dist/web/routes/agent-content.d.ts.map +1 -0
  754. package/dist/web/routes/agent-content.js +139 -0
  755. package/dist/web/routes/agent-content.js.map +1 -0
  756. package/dist/web/routes/agent-distill.d.ts +49 -0
  757. package/dist/web/routes/agent-distill.d.ts.map +1 -0
  758. package/dist/web/routes/agent-distill.js +526 -0
  759. package/dist/web/routes/agent-distill.js.map +1 -0
  760. package/dist/web/routes/config.d.ts +56 -0
  761. package/dist/web/routes/config.d.ts.map +1 -0
  762. package/dist/web/routes/config.js +243 -0
  763. package/dist/web/routes/config.js.map +1 -0
  764. package/dist/web/routes/decisions.d.ts +15 -0
  765. package/dist/web/routes/decisions.d.ts.map +1 -0
  766. package/dist/web/routes/decisions.js +181 -0
  767. package/dist/web/routes/decisions.js.map +1 -0
  768. package/dist/web/routes/diagnostics.d.ts +61 -0
  769. package/dist/web/routes/diagnostics.d.ts.map +1 -0
  770. package/dist/web/routes/diagnostics.js +203 -0
  771. package/dist/web/routes/diagnostics.js.map +1 -0
  772. package/dist/web/routes/error-handler.d.ts +0 -4
  773. package/dist/web/routes/error-handler.d.ts.map +1 -1
  774. package/dist/web/routes/error-handler.js +0 -8
  775. package/dist/web/routes/error-handler.js.map +1 -1
  776. package/dist/web/routes/events.d.ts.map +1 -1
  777. package/dist/web/routes/events.js +26 -1
  778. package/dist/web/routes/events.js.map +1 -1
  779. package/dist/web/routes/health.d.ts +33 -0
  780. package/dist/web/routes/health.d.ts.map +1 -0
  781. package/dist/web/routes/health.js +37 -0
  782. package/dist/web/routes/health.js.map +1 -0
  783. package/dist/web/routes/insights.d.ts +0 -5
  784. package/dist/web/routes/insights.d.ts.map +1 -1
  785. package/dist/web/routes/insights.js +0 -0
  786. package/dist/web/routes/insights.js.map +1 -1
  787. package/dist/web/routes/knowledge.d.ts +57 -0
  788. package/dist/web/routes/knowledge.d.ts.map +1 -0
  789. package/dist/web/routes/knowledge.js +772 -0
  790. package/dist/web/routes/knowledge.js.map +1 -0
  791. package/dist/web/routes/patch.d.ts +60 -1
  792. package/dist/web/routes/patch.d.ts.map +1 -1
  793. package/dist/web/routes/patch.js +170 -64
  794. package/dist/web/routes/patch.js.map +1 -1
  795. package/dist/web/routes/pipeline.d.ts +28 -0
  796. package/dist/web/routes/pipeline.d.ts.map +1 -0
  797. package/dist/web/routes/pipeline.js +145 -0
  798. package/dist/web/routes/pipeline.js.map +1 -0
  799. package/dist/web/routes/rules.d.ts.map +1 -1
  800. package/dist/web/routes/rules.js +26 -7
  801. package/dist/web/routes/rules.js.map +1 -1
  802. package/dist/web/routes/sessions.d.ts.map +1 -1
  803. package/dist/web/routes/sessions.js +17 -8
  804. package/dist/web/routes/sessions.js.map +1 -1
  805. package/dist/web/routes/skill-content.d.ts +30 -0
  806. package/dist/web/routes/skill-content.d.ts.map +1 -0
  807. package/dist/web/routes/skill-content.js +117 -0
  808. package/dist/web/routes/skill-content.js.map +1 -0
  809. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  810. package/dist/web/routes/skill-stats.js +153 -16
  811. package/dist/web/routes/skill-stats.js.map +1 -1
  812. package/dist/web/routes/skills-distill.d.ts +29 -0
  813. package/dist/web/routes/skills-distill.d.ts.map +1 -0
  814. package/dist/web/routes/skills-distill.js +552 -0
  815. package/dist/web/routes/skills-distill.js.map +1 -0
  816. package/dist/web/routes/skills.js +7 -7
  817. package/dist/web/routes/skills.js.map +1 -1
  818. package/dist/web/routes/stats.d.ts.map +1 -1
  819. package/dist/web/routes/stats.js +2 -1
  820. package/dist/web/routes/stats.js.map +1 -1
  821. package/dist/web/routes/task-timeline.d.ts +178 -0
  822. package/dist/web/routes/task-timeline.d.ts.map +1 -0
  823. package/dist/web/routes/task-timeline.js +530 -0
  824. package/dist/web/routes/task-timeline.js.map +1 -0
  825. package/dist/web/routes/tasks.d.ts.map +1 -1
  826. package/dist/web/routes/tasks.js +377 -8
  827. package/dist/web/routes/tasks.js.map +1 -1
  828. package/dist/web/routes/trace.d.ts.map +1 -1
  829. package/dist/web/routes/trace.js +3 -2
  830. package/dist/web/routes/trace.js.map +1 -1
  831. package/dist/web/routes/types.d.ts +0 -4
  832. package/dist/web/routes/types.d.ts.map +1 -1
  833. package/dist/web/routes/types.js +1 -1
  834. package/dist/web/routes/types.js.map +1 -1
  835. package/dist/web/routes/violations.d.ts +14 -0
  836. package/dist/web/routes/violations.d.ts.map +1 -0
  837. package/dist/web/routes/violations.js +112 -0
  838. package/dist/web/routes/violations.js.map +1 -0
  839. package/dist/web/server.d.ts.map +1 -1
  840. package/dist/web/server.js +99 -19
  841. package/dist/web/server.js.map +1 -1
  842. package/dist/web/services/agent-distill-manager.d.ts +122 -0
  843. package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
  844. package/dist/web/services/agent-distill-manager.js +397 -0
  845. package/dist/web/services/agent-distill-manager.js.map +1 -0
  846. package/dist/web/services/build-manager.d.ts +72 -0
  847. package/dist/web/services/build-manager.d.ts.map +1 -0
  848. package/dist/web/services/build-manager.js +189 -0
  849. package/dist/web/services/build-manager.js.map +1 -0
  850. package/dist/web/services/distill-manager.d.ts +172 -0
  851. package/dist/web/services/distill-manager.d.ts.map +1 -0
  852. package/dist/web/services/distill-manager.js +411 -0
  853. package/dist/web/services/distill-manager.js.map +1 -0
  854. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
  855. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
  856. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
  857. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
  858. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
  859. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
  860. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
  861. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
  862. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
  863. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
  864. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
  865. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
  866. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
  867. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
  868. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
  869. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
  870. package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
  871. package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
  872. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
  873. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
  874. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
  875. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
  876. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
  877. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
  878. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
  879. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
  880. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
  881. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
  882. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
  883. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
  884. package/dist/web/static/assets/MarkdownRenderer-DlDQNihj.js +3 -0
  885. package/dist/web/static/assets/MarkdownRenderer-DlDQNihj.js.map +1 -0
  886. package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
  887. package/dist/web/static/assets/NotFound-LMzbP51V.js.map +1 -0
  888. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
  889. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
  890. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
  891. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
  892. package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
  893. package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
  894. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
  895. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
  896. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
  897. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
  898. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
  899. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
  900. package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
  901. package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
  902. package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
  903. package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
  904. package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
  905. package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
  906. package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
  907. package/dist/web/static/assets/index-B_v_MKlb.css +1 -0
  908. package/dist/web/static/assets/index-DileOOE4.js +4 -0
  909. package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
  910. package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
  911. package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
  912. package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
  913. package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
  914. package/dist/web/static/assets/outcome-BKGy9azt.js +2 -0
  915. package/dist/web/static/assets/outcome-BKGy9azt.js.map +1 -0
  916. package/dist/web/static/assets/query-CgCOpYWf.js +2 -0
  917. package/dist/web/static/assets/{query-C99w429o.js.map → query-CgCOpYWf.js.map} +1 -1
  918. package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-Cxmg8RuL.js} +3 -3
  919. package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-Cxmg8RuL.js.map} +1 -1
  920. package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
  921. package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
  922. package/dist/web/static/assets/syntax-highlighter-BDYycNja.js +6 -0
  923. package/dist/web/static/assets/syntax-highlighter-BDYycNja.js.map +1 -0
  924. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
  925. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
  926. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
  927. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
  928. package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
  929. package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
  930. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
  931. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
  932. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
  933. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
  934. package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
  935. package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
  936. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
  937. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
  938. package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
  939. package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
  940. package/dist/web/static/index.html +12 -8
  941. package/package.json +18 -5
  942. package/dist/core/ai/provider.d.ts +0 -63
  943. package/dist/core/ai/provider.d.ts.map +0 -1
  944. package/dist/core/ai/provider.js +0 -241
  945. package/dist/core/ai/provider.js.map +0 -1
  946. package/dist/core/ai/types.d.ts +0 -43
  947. package/dist/core/ai/types.d.ts.map +0 -1
  948. package/dist/core/ai/types.js +0 -5
  949. package/dist/core/ai/types.js.map +0 -1
  950. package/dist/core/storage/token-usage.d.ts +0 -36
  951. package/dist/core/storage/token-usage.d.ts.map +0 -1
  952. package/dist/core/storage/token-usage.js +0 -59
  953. package/dist/core/storage/token-usage.js.map +0 -1
  954. package/dist/core/utils/token-tracker.d.ts +0 -39
  955. package/dist/core/utils/token-tracker.d.ts.map +0 -1
  956. package/dist/core/utils/token-tracker.js +0 -69
  957. package/dist/core/utils/token-tracker.js.map +0 -1
  958. package/dist/skills/index.d.ts +0 -3
  959. package/dist/skills/index.d.ts.map +0 -1
  960. package/dist/skills/index.js +0 -3
  961. package/dist/skills/index.js.map +0 -1
  962. package/dist/skills/matcher.d.ts +0 -26
  963. package/dist/skills/matcher.d.ts.map +0 -1
  964. package/dist/skills/matcher.js +0 -113
  965. package/dist/skills/matcher.js.map +0 -1
  966. package/dist/skills/official/code-simplifier.md +0 -52
  967. package/dist/skills/official/find-skills.md +0 -142
  968. package/dist/skills/official/official-api-design.md +0 -30
  969. package/dist/skills/official/official-architecture-decision.md +0 -41
  970. package/dist/skills/official/official-bmad.md +0 -118
  971. package/dist/skills/official/official-db-schema-design.md +0 -34
  972. package/dist/skills/official/official-debug.md +0 -25
  973. package/dist/skills/official/official-doc-driven.md +0 -31
  974. package/dist/skills/official/official-harness-engineering.md +0 -108
  975. package/dist/skills/official/official-openspec.md +0 -89
  976. package/dist/skills/official/official-performance-optimization.md +0 -30
  977. package/dist/skills/official/official-pr-review.md +0 -35
  978. package/dist/skills/official/official-release-checklist.md +0 -30
  979. package/dist/skills/official/official-security-hardening.md +0 -32
  980. package/dist/skills/official/official-spec-driven-design.md +0 -31
  981. package/dist/skills/official/planning-with-files.md +0 -241
  982. package/dist/skills/official/ui-ux-pro-max.md +0 -105
  983. package/dist/skills/official/webapp-testing.md +0 -96
  984. package/dist/skills/official-skills.d.ts +0 -26
  985. package/dist/skills/official-skills.d.ts.map +0 -1
  986. package/dist/skills/official-skills.js +0 -74
  987. package/dist/skills/official-skills.js.map +0 -1
  988. package/dist/skills/semantic-matcher.d.ts +0 -60
  989. package/dist/skills/semantic-matcher.d.ts.map +0 -1
  990. package/dist/skills/semantic-matcher.js +0 -192
  991. package/dist/skills/semantic-matcher.js.map +0 -1
  992. package/dist/skills/upgrade-engine.d.ts +0 -93
  993. package/dist/skills/upgrade-engine.d.ts.map +0 -1
  994. package/dist/skills/upgrade-engine.js +0 -447
  995. package/dist/skills/upgrade-engine.js.map +0 -1
  996. package/dist/skills/upgrade-prompt.d.ts +0 -20
  997. package/dist/skills/upgrade-prompt.d.ts.map +0 -1
  998. package/dist/skills/upgrade-prompt.js +0 -75
  999. package/dist/skills/upgrade-prompt.js.map +0 -1
  1000. package/dist/web/routes/ai.d.ts +0 -10
  1001. package/dist/web/routes/ai.d.ts.map +0 -1
  1002. package/dist/web/routes/ai.js +0 -186
  1003. package/dist/web/routes/ai.js.map +0 -1
  1004. package/dist/web/routes/token-usage.d.ts +0 -7
  1005. package/dist/web/routes/token-usage.d.ts.map +0 -1
  1006. package/dist/web/routes/token-usage.js +0 -18
  1007. package/dist/web/routes/token-usage.js.map +0 -1
  1008. package/dist/web/ssrf-guard.d.ts +0 -35
  1009. package/dist/web/ssrf-guard.d.ts.map +0 -1
  1010. package/dist/web/ssrf-guard.js +0 -93
  1011. package/dist/web/ssrf-guard.js.map +0 -1
  1012. package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
  1013. package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
  1014. package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
  1015. package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
  1016. package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
  1017. package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
  1018. package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
  1019. package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
  1020. package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
  1021. package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
  1022. package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
  1023. package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
  1024. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
  1025. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
  1026. package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
  1027. package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
  1028. package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
  1029. package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
  1030. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
  1031. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
  1032. package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
  1033. package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
  1034. package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
  1035. package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
  1036. package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
  1037. package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
  1038. package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
  1039. package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
  1040. package/dist/web/static/assets/index-CBX47X8l.js +0 -3
  1041. package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
  1042. package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
  1043. package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
  1044. package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
  1045. package/dist/web/static/assets/query-C99w429o.js +0 -2
  1046. package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
  1047. package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
  1048. package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
  1049. package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
  1050. package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
  1051. package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
  1052. package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
  1053. package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{r as v,j as e}from"./react-vendor-tkvCrao7.js";import{h as ze,J as R,K as xe,A as De,T as b,d as B,E as P,b as Ae,N as Le,O as Oe,Q as We,t as $e,U as Ke}from"./arco-DV6xCLhr.js";import{R as H,A as Be,T as U,a as Ee,P as Me,b as Ne,C as Pe,L as ye,c as qe,d as Fe,X as Ve,Y as Qe,e as q}from"./charts-BSV4cyC4.js";import{O as _,a as T}from"./outcome-BKGy9azt.js";import{u as j}from"./query-CgCOpYWf.js";import{u as He,a as Ue,r as Ge,A as Ye,l as Je,k as Xe,b as N}from"./index-DileOOE4.js";import{u as Ze}from"./react-router-Cxmg8RuL.js";import"./vendor-DS-q4Eyc.js";import"./lucide-CnlPQoG8.js";const et="#52c41a",tt="#f5222d",st="#86909c";function nt(t,s,n,a=""){const i=t-s;if(i===0)return{text:"vs 上周 0 →",color:st};const l=i>0?"↑":"↓",c=(n?i<0:i>0)?tt:et,d=i>0?"+":"",u=Number.isInteger(i)?`${i}`:i.toFixed(1);return{text:`vs 上周 ${d}${u}${a} ${l}`,color:c}}function ot({label:t,value:s,sparkData:n,sparkColor:a="#1890ff",thisVal:i,prevVal:l,higherIsBetter:o,suffix:c="",tooltip:d,onClick:u}){const f=nt(i,l,o,c),m=n.map((x,S)=>({i:S,v:x})),g=`spark-grad-${t.replace(/\s+/g,"-")}-${a.replace("#","")}`;return e.jsxs("div",{onClick:u,style:{background:"#fff",borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",padding:20,cursor:u?"pointer":"default",height:"100%",display:"flex",flexDirection:"column",gap:8,transition:"box-shadow 0.15s"},onMouseEnter:x=>{u&&(x.currentTarget.style.boxShadow="0 2px 8px rgba(0,0,0,0.10)")},onMouseLeave:x=>{u&&(x.currentTarget.style.boxShadow="0 1px 3px rgba(0,0,0,0.05)")},children:[e.jsxs("div",{style:{fontSize:12,color:"#86909c",fontWeight:500,display:"flex",alignItems:"center",gap:4},children:[e.jsx("span",{children:t}),d?e.jsx(ze,{content:d,position:"top",children:e.jsx("span",{"aria-label":"explain",style:{cursor:"help",fontSize:11,color:"#86909c",border:"1px solid var(--color-border-2)",borderRadius:"50%",width:14,height:14,lineHeight:"12px",textAlign:"center",display:"inline-block"},onClick:x=>x.stopPropagation(),children:"?"})}):null]}),e.jsx("div",{style:{fontSize:32,fontWeight:600,color:"#1d2129",lineHeight:1.1,fontVariantNumeric:"tabular-nums"},children:s}),e.jsx("div",{style:{height:40,marginTop:2},children:m.length>0&&e.jsx(H,{width:"100%",height:"100%",children:e.jsxs(Be,{data:m,margin:{top:2,right:0,left:0,bottom:0},children:[e.jsx("defs",{children:e.jsxs("linearGradient",{id:g,x1:"0",y1:"0",x2:"0",y2:"1",children:[e.jsx("stop",{offset:"0%",stopColor:a,stopOpacity:.35}),e.jsx("stop",{offset:"100%",stopColor:a,stopOpacity:.02})]})}),e.jsx(U,{cursor:!1,contentStyle:{fontSize:11,padding:"4px 8px",borderRadius:4},formatter:x=>[`${x}${c}`,t],labelFormatter:()=>""}),e.jsx(Ee,{type:"monotone",dataKey:"v",stroke:a,strokeWidth:1.5,fill:`url(#${g})`,isAnimationActive:!1})]})})}),e.jsx("div",{style:{fontSize:11,color:f.color,fontWeight:500,fontVariantNumeric:"tabular-nums"},children:f.text})]})}const I=v.memo(ot);function at({success:t,partial:s,failed:n,abandoned:a,height:i=240}){const l=t+s+n+a,o=l>0?Math.round(t/l*1e3)/10:0,c=[{name:_.success,value:t,key:"success"},{name:_.partial,value:s,key:"partial"},{name:_.failed,value:n,key:"failed"},{name:_.abandoned,value:a,key:"abandoned"}].filter(d=>d.value>0);return l===0?e.jsx("div",{style:{height:i,display:"flex",alignItems:"center",justifyContent:"center",color:"#86909c",fontSize:13},children:"近期无已分类任务数据"}):e.jsxs("div",{style:{position:"relative",height:i},children:[e.jsx(H,{width:"100%",height:"100%",children:e.jsxs(Me,{children:[e.jsx(Ne,{data:c,dataKey:"value",nameKey:"name",cx:"50%",cy:"50%",innerRadius:"60%",outerRadius:"85%",paddingAngle:2,stroke:"none",isAnimationActive:!1,children:c.map(d=>e.jsx(Pe,{fill:T[d.key]},d.key))}),e.jsx(U,{contentStyle:{fontSize:12,padding:"6px 10px",borderRadius:4},formatter:(d,u)=>{const f=typeof d=="number"?d:Number(d)||0,m=l>0?Math.round(f/l*100):0;return[`${f} (${m}%)`,String(u)]}}),e.jsx(ye,{verticalAlign:"bottom",iconType:"circle",iconSize:8,wrapperStyle:{fontSize:11}})]})}),e.jsxs("div",{style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",pointerEvents:"none",paddingBottom:24},children:[e.jsx("div",{style:{fontSize:28,fontWeight:600,color:"#1d2129",lineHeight:1.1,fontVariantNumeric:"tabular-nums"},children:l}),e.jsxs("div",{style:{fontSize:11,color:"#86909c",marginTop:2},children:["总任务 · 成功率"," ",e.jsxs("span",{style:{color:"#52c41a",fontWeight:600},children:[o,"%"]})]})]})]})}const it=v.memo(at);function re(t){return t===7?7:30}function ce(t){return Math.min(t,30)}function he(t){if(!t)return[];const s=[];for(const n of Object.values(t.lanes||{}))s.push(...n);return s}function z(t,s,n,a=""){const i=Math.round((t-s)*10)/10;if(i===0)return{text:"0",improved:!1,flat:!0};const l=n?i>0:i<0,o=i>0?"+":"",c=Number.isInteger(i)?`${i}`:i.toFixed(1);return{text:`${o}${c}${a}`,improved:l,flat:!1}}function G(t){const s=t.success+t.partial+t.failed+t.abandoned;return s<=0?0:Math.round(t.success/s*1e3)/10}function V(t){if(!t)return 0;if(typeof t.genuineInvoke=="number")return t.genuineInvoke;if(Array.isArray(t.invocations)){const s=t.invocations.reduce((n,a)=>n+(a.genuine??0),0);if(s>0)return s}return typeof t.realCalls=="number"?t.realCalls:0}function lt(t){var a,i,l,o,c,d,u;const s=((a=t.tuning)==null?void 0:a.summary.session_outcome)??{success:0,partial:0,failed:0,abandoned:0},n=(i=t.tuning)==null?void 0:i.summary.intercept_obeyed_ratio;return{totalTasks:((l=t.board)==null?void 0:l.total_in_window)??he(t.board).length,successRate:G(s),failed:s.failed,kbInject:((o=t.tuning)==null?void 0:o.summary.agent_kb_pull_count)??0,kbInjectPassive:((c=t.tuning)==null?void 0:c.summary.kb_inject_count)??0,skillCalls:V(t.skills),violations:((d=t.violations)==null?void 0:d.total_in_window)??0,obeyedRatio:typeof n=="number"?Math.round(n*1e3)/10:null,obeyedBand:((u=t.tuning)==null?void 0:u.summary.intercept_obeyed_band)??"unknown"}}function rt(t,s,n=Date.now()){const a=new Map,i=[];for(let l=s-1;l>=0;l--){const o=new Date(n-l*864e5).toISOString().slice(0,10);a.set(o,{success:0,partial:0,failed:0}),i.push(o)}for(const l of t){if(l.outcome!=="success"&&l.outcome!=="partial"&&l.outcome!=="failed")continue;const o=(l.start_time||"").slice(0,10),c=a.get(o);c&&(c[l.outcome]+=1)}return i.map(l=>({date:l.slice(5),...a.get(l)}))}function ct(t){const s=t??{success:0,partial:0,failed:0,abandoned:0},n=[{key:"success",label:"成功",value:s.success,color:T.success},{key:"partial",label:"部分",value:s.partial,color:T.partial},{key:"failed",label:"失败",value:s.failed,color:T.failed}],a=s.success+s.partial+s.failed;return{parts:n,total:a,successRate:G(s)}}function M(t,s,n,a=Date.now()){const i=Array(s).fill(0);for(const l of t){const o=new Date(l.start_time).getTime();if(!Number.isFinite(o))continue;const c=s-1-Math.floor((a-o)/864e5);c>=0&&c<s&&(i[c]+=n(l))}return i}function dt(t,s,n=Date.now()){const a=M(t,s,l=>l.outcome==="success"?1:0,n),i=M(t,s,l=>l.outcome==="success"||l.outcome==="partial"||l.outcome==="failed"||l.outcome==="abandoned"?1:0,n);return a.map((l,o)=>i[o]>0?Math.round(l/i[o]*100):0)}const ut=5;function ft(t,s=5){const n=t.filter(o=>o.outcome==="failed").sort((o,c)=>(c.start_time||"").localeCompare(o.start_time||"")).slice(0,s).map(o=>({kind:"failed",task_id:o.task_id,title:o.title||"(空)",detail:"失败",ts:o.start_time})),a=t.map(o=>{var c,d;return{card:o,total:(((c=o.intercepts)==null?void 0:c.deny)??0)+(((d=o.intercepts)==null?void 0:d.warn)??0)}}).filter(o=>o.total>=ut).sort((o,c)=>c.total-o.total).slice(0,s).map(o=>({kind:"intercept",task_id:o.card.task_id,title:o.card.title||"(空)",detail:`${o.total} 次拦截`,ts:o.card.start_time})),i=new Set(n.map(o=>o.task_id));return[...n,...a.filter(o=>!i.has(o.task_id))].slice(0,s)}function F(t,s){if(t!=null)return s==null?t:Math.max(0,t-s)}async function K(t,s=!1){const n=await fetch(t);if(s&&n.status===410)return null;if(!n.ok)throw new Error(`${t} → ${n.status}`);return n.json()}const de=(t,s)=>K(N(`/api/insights/agent-board?window=${t}`,s)),ue=(t,s)=>K(N(`/api/violations?days=${t}&limit=1`,s)),fe=(t,s)=>K(N(`/api/insights/tuning?window=${t}`,s),!0),pe=(t,s)=>K(N(`/api/skill-stats/invocations?days=${t}`,s)),pt=()=>K("/api/health");function xt(){var J,X;const{window:t}=He(),{project:s}=Ue(),{data:n}=j({queryKey:Xe(),queryFn:Je,staleTime:3e4}),a=Ge(s,(n==null?void 0:n.current)??""),i=t*2,l=re(t),o=re(t*2>30?30:t*2),c=ce(t),d=ce(t*2),u=j({queryKey:["wp-board",t,a],queryFn:()=>de(t,a),refetchInterval:6e4,refetchIntervalInBackground:!1}),f=j({queryKey:["wp-tuning",l,a],queryFn:()=>fe(l,a)}),m=j({queryKey:["wp-skills",t,a],queryFn:()=>pe(t,a)}),g=j({queryKey:["wp-violations",c,a],queryFn:()=>ue(c,a),staleTime:6e4}),x=j({queryKey:["wp-health"],queryFn:pt,refetchInterval:3e4,refetchIntervalInBackground:!1}),S=j({queryKey:["wp-board-long",i,a],queryFn:()=>de(i,a)}),r=j({queryKey:["wp-tuning-long",o,a],queryFn:()=>fe(o,a)}),y=j({queryKey:["wp-skills-long",i,a],queryFn:()=>pe(i,a)}),Y=j({queryKey:["wp-violations-long",d,a],queryFn:()=>ue(d,a),staleTime:6e4}),w=v.useMemo(()=>he(u.data??void 0),[u.data]),k=v.useMemo(()=>lt({board:u.data??void 0,tuning:f.data??null,skills:m.data??void 0,violations:g.data??void 0}),[u.data,f.data,m.data,g.data]),me=v.useMemo(()=>{var ee,te,se,ne,oe,ae,ie,le;const p=(ee=f.data)==null?void 0:ee.summary.session_outcome,C=(te=r.data)==null?void 0:te.summary.session_outcome,O=(Re,Ie)=>F(Re,Ie)??0,we=F((se=S.data)==null?void 0:se.total_in_window,(ne=u.data)==null?void 0:ne.total_in_window)??0,Z=O(C==null?void 0:C.failed,p==null?void 0:p.failed),Se=O(((oe=r.data)==null?void 0:oe.summary.agent_kb_pull_count)??0,((ae=f.data)==null?void 0:ae.summary.agent_kb_pull_count)??0),Ce=Math.max(0,V(y.data??void 0)-V(m.data??void 0)),_e=F((ie=Y.data)==null?void 0:ie.total_in_window,(le=g.data)==null?void 0:le.total_in_window)??0,Te=C?G({success:O(C.success,p==null?void 0:p.success),partial:O(C.partial,p==null?void 0:p.partial),failed:Z,abandoned:O(C.abandoned,p==null?void 0:p.abandoned)}):k.successRate;return{totalTasks:z(k.totalTasks,we,!0),successRate:z(k.successRate,Te,!0,"%"),failed:z(k.failed,Z,!1),kbInject:z(k.kbInject,Se,!0),skillCalls:z(k.skillCalls,Ce,!0),violations:z(k.violations,_e,!1)}},[k,u.data,S.data,f.data,r.data,m.data,y.data,g.data,Y.data]),ge=v.useMemo(()=>({totalTasks:M(w,t,()=>1),successRate:dt(w,t),failed:M(w,t,p=>p.outcome==="failed"?1:0)}),[w,t]),je=v.useMemo(()=>rt(w,t),[w,t]),ke=v.useMemo(()=>{var p;return ct((p=f.data)==null?void 0:p.summary.session_outcome)},[f.data]),be=v.useMemo(()=>ft(w),[w]),ve=((X=(J=x.data)==null?void 0:J.daemon)==null?void 0:X.status)??"unknown";return{window:t,loading:u.isLoading||f.isLoading,isError:u.isError,kpis:k,trend:me,sparks:ge,outcomeTrend:je,distribution:ke,attention:be,daemon:{status:ve},project:a,isAllProjects:s===Ye,skillScopedGlobal:!1}}const W=xe.Row,h=xe.Col,D="#1890ff",$=T.success,Q=T.partial,E=T.failed,yt={green:$,yellow:Q,red:E,unknown:"#86909c"},A={borderRadius:8,boxShadow:"0 1px 3px rgba(0,0,0,0.05)",border:"none"},ht=[{label:"查看任务",route:"/tasks",icon:e.jsx(Oe,{})},{label:"查看决策",route:"/decisions",icon:e.jsx(We,{})},{label:"治理问题",route:"/issues",icon:e.jsx($e,{})},{label:"Daemon 健康",route:"/system/daemon",icon:e.jsx(Ke,{})}];function Tt(){var g,x,S;const t=Ze(),s=xt(),{kpis:n,trend:a,sparks:i,outcomeTrend:l,distribution:o,attention:c,daemon:d,loading:u}=s,f=d.status==="alive",m=s.isAllProjects?"全部项目":mt(s.project)||"全部项目";return e.jsxs("div",{style:{padding:24,background:"#fafafa",minHeight:"100%"},children:[e.jsx(R,{style:{...A,marginBottom:16},bodyStyle:{padding:"16px 20px"},children:e.jsxs(W,{align:"center",justify:"space-between",gutter:16,children:[e.jsx(h,{flex:"1",children:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:16},children:[e.jsx(De,{style:{backgroundColor:"#e8f3ff",color:D,flexShrink:0},children:"YB"}),e.jsxs("div",{style:{minWidth:0},children:[e.jsx("div",{style:{fontSize:16,fontWeight:600,color:"#1d2129"},children:"工作台"}),e.jsxs(b.Text,{type:"secondary",style:{fontSize:13},children:[m," · 近 ",s.window," 天 ",n.totalTasks," 个任务、成功率 ",n.successRate,"%。"]})]})]})}),e.jsx(h,{flex:"none",children:e.jsxs("div",{style:{display:"flex",gap:24,alignItems:"center"},children:[e.jsxs("div",{style:{textAlign:"center"},children:[e.jsx("div",{style:{fontSize:20,fontWeight:600,color:"#1d2129"},children:n.totalTasks}),e.jsx(b.Text,{type:"secondary",style:{fontSize:12},children:"窗口任务"})]}),e.jsx("div",{style:{width:1,height:32,background:"#e5e6eb"}}),e.jsxs("div",{style:{textAlign:"center"},children:[e.jsx("div",{style:{fontSize:20,fontWeight:600,color:f?$:"#86909c"},children:f?"运行中":d.status==="unknown"?"—":"已停止"}),e.jsx(b.Text,{type:"secondary",style:{fontSize:12},children:"Daemon"})]})]})})]})}),e.jsxs(W,{gutter:[16,16],style:{marginBottom:16},children:[e.jsx(h,{xs:12,sm:8,xl:4,children:e.jsx(I,{label:"总任务",value:n.totalTasks,sparkData:i.totalTasks,sparkColor:D,thisVal:n.totalTasks,prevVal:n.totalTasks-L(a.totalTasks.text),higherIsBetter:!0})}),e.jsx(h,{xs:12,sm:8,xl:4,children:e.jsx(I,{label:"成功率",value:`${n.successRate}%`,suffix:"%",sparkData:i.successRate,sparkColor:$,thisVal:n.successRate,prevVal:n.successRate-L(a.successRate.text),higherIsBetter:!0})}),e.jsx(h,{xs:12,sm:8,xl:4,children:e.jsx(I,{label:"失败任务",value:n.failed,sparkData:i.failed,sparkColor:E,thisVal:n.failed,prevVal:n.failed-L(a.failed.text),higherIsBetter:!1,onClick:()=>t("/tasks?outcome=failed")})}),e.jsx(h,{xs:12,sm:8,xl:4,children:e.jsx(I,{label:"KB 调用",value:n.kbInject,sparkData:i.totalTasks,sparkColor:D,thisVal:n.kbInject,prevVal:n.kbInject-L(a.kbInject.text),higherIsBetter:!0,tooltip:`agent 主动 pull 知识库的次数(真实使用)——cf knowledge query/fetch 带 kb-precedent reason,来自 /api/insights/tuning(窗口聚合,按项目过滤)。其中被动注入 ${n.kbInjectPassive} 次(daemon 自动塞 prompt,门控后≈0)。sparkline 形状近似按每日任务活跃度。`})}),e.jsx(h,{xs:12,sm:8,xl:4,children:e.jsx(I,{label:"Skill 调用",value:n.skillCalls,sparkData:i.totalTasks,sparkColor:Q,thisVal:n.skillCalls,prevVal:n.skillCalls-L(a.skillCalls.text),higherIsBetter:!0,tooltip:"真实调用数来自 /api/skill-stats/invocations(events.tool_name 口径)。"})}),e.jsx(h,{xs:12,sm:8,xl:4,children:e.jsx(I,{label:"治理违规",value:n.violations,sparkData:i.failed,sparkColor:E,thisVal:n.violations,prevVal:n.violations-L(a.violations.text),higherIsBetter:!1,onClick:()=>t("/issues")})})]}),e.jsxs(W,{gutter:[16,16],align:"start",children:[e.jsxs(h,{xs:24,xl:16,children:[e.jsx(R,{style:{...A,marginBottom:16},title:e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:15,fontWeight:600},children:"Outcome 趋势"}),e.jsxs(b.Text,{type:"secondary",style:{fontSize:12},children:["近 ",s.window," 天 · 按天聚合"]})]}),children:u?e.jsx("div",{style:{height:260},children:e.jsx(B,{animation:!0,text:{rows:6}})}):l.every(r=>r.success+r.partial+r.failed===0)?e.jsx(P,{description:`近 ${s.window} 天无已分类任务`,style:{padding:48}}):e.jsx(H,{width:"100%",height:260,children:e.jsxs(qe,{data:l,margin:{top:8,right:16,left:0,bottom:0},children:[e.jsx(Fe,{strokeDasharray:"3 3",stroke:"#f0f0f0"}),e.jsx(Ve,{dataKey:"date",fontSize:11,stroke:"#86909c",minTickGap:24}),e.jsx(Qe,{fontSize:11,allowDecimals:!1,stroke:"#86909c"}),e.jsx(U,{contentStyle:{fontSize:12,borderRadius:4}}),e.jsx(ye,{wrapperStyle:{fontSize:11},iconType:"circle"}),e.jsx(q,{type:"monotone",dataKey:"success",stroke:$,strokeWidth:2,dot:!1,name:_.success}),e.jsx(q,{type:"monotone",dataKey:"partial",stroke:Q,strokeWidth:2,dot:!1,name:_.partial}),e.jsx(q,{type:"monotone",dataKey:"failed",stroke:E,strokeWidth:2,dot:!1,name:_.failed})]})})}),e.jsx(R,{style:A,title:e.jsx("span",{style:{fontSize:15,fontWeight:600},children:"任务结果分布"}),extra:e.jsx(b.Text,{type:"secondary",style:{fontSize:12},children:"本窗口"}),children:u?e.jsx("div",{style:{height:240},children:e.jsx(B,{animation:!0,text:{rows:5}})}):e.jsxs(W,{gutter:24,align:"center",children:[e.jsx(h,{xs:24,sm:14,children:e.jsx(it,{success:((g=o.parts.find(r=>r.key==="success"))==null?void 0:g.value)??0,partial:((x=o.parts.find(r=>r.key==="partial"))==null?void 0:x.value)??0,failed:((S=o.parts.find(r=>r.key==="failed"))==null?void 0:S.value)??0,abandoned:0,height:220})}),e.jsx(h,{xs:24,sm:10,children:e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:12},children:[o.parts.map(r=>e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[e.jsxs("span",{style:{display:"inline-flex",alignItems:"center",gap:8,fontSize:13,color:"#4e5969"},children:[e.jsx("span",{style:{width:10,height:10,borderRadius:2,background:r.color,display:"inline-block"}}),r.label]}),e.jsx("span",{style:{fontWeight:600,color:"#1d2129",fontVariantNumeric:"tabular-nums"},children:r.value})]},r.key)),e.jsxs("div",{style:{borderTop:"1px solid #f0f0f0",paddingTop:10,display:"flex",justifyContent:"space-between",fontSize:13},children:[e.jsx("span",{style:{color:"#4e5969"},children:"成功率"}),e.jsxs("span",{style:{fontWeight:600,color:$},children:[o.successRate,"%"]})]})]})})]})})]}),e.jsxs(h,{xs:24,xl:8,children:[e.jsx(R,{style:{...A,marginBottom:16},title:e.jsx("span",{style:{fontSize:15,fontWeight:600},children:"主线程听劝率"}),extra:e.jsx(b.Text,{type:"secondary",style:{fontSize:12},children:"C4 治理"}),children:u?e.jsx(B,{animation:!0,text:{rows:2}}):n.obeyedRatio==null?e.jsx(P,{description:"反馈循环未启用(cf config set feedback_loop.enabled true)",style:{padding:16}}):e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:12},children:[e.jsxs("div",{style:{fontSize:32,fontWeight:600,lineHeight:1.1,fontVariantNumeric:"tabular-nums",color:yt[n.obeyedBand]??"#1d2129"},children:[n.obeyedRatio,"%"]}),e.jsxs(b.Text,{type:"secondary",style:{fontSize:12},children:["近 ",s.window," 天有拦截 task 中听劝(outcome ≠ failed)比例"]})]})}),e.jsx(R,{style:{...A,marginBottom:16},title:e.jsx("span",{style:{fontSize:15,fontWeight:600},children:"快捷入口"}),children:e.jsx(W,{gutter:[12,12],children:ht.map(r=>e.jsx(h,{span:12,children:e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>t(r.route),onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&t(r.route)},style:{display:"flex",flexDirection:"column",alignItems:"center",gap:6,padding:"14px 0",borderRadius:6,border:"1px solid #e5e6eb",cursor:"pointer",color:"#4e5969",transition:"all 0.15s"},onMouseEnter:y=>{y.currentTarget.style.borderColor=D,y.currentTarget.style.color=D},onMouseLeave:y=>{y.currentTarget.style.borderColor="#e5e6eb",y.currentTarget.style.color="#4e5969"},children:[e.jsx("span",{style:{fontSize:18},children:r.icon}),e.jsx("span",{style:{fontSize:12},children:r.label})]})},r.route))})}),e.jsx(R,{style:A,title:e.jsx("span",{style:{fontSize:15,fontWeight:600},children:"需注意"}),extra:e.jsx(b.Text,{style:{fontSize:12,color:D,cursor:"pointer"},onClick:()=>t("/issues"),children:"查看全部"}),children:u?e.jsx(B,{animation:!0,text:{rows:4}}):c.length===0?e.jsx(P,{description:"无明显异常项",style:{padding:24}}):e.jsx("div",{children:c.map(r=>e.jsxs("div",{role:"button",tabIndex:0,onClick:()=>t(`/tasks?task=${encodeURIComponent(r.task_id)}`),onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&t(`/tasks?task=${encodeURIComponent(r.task_id)}`)},style:{display:"flex",alignItems:"center",gap:12,padding:"10px 0",borderBottom:"1px solid #f7f8fa",cursor:"pointer"},children:[e.jsx(Ae,{color:r.kind==="failed"?"red":"orange",size:"small",style:{flexShrink:0},children:r.kind==="failed"?"失败":"高拦截"}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{fontSize:13,color:"#1d2129",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r.title}),e.jsxs(b.Text,{type:"secondary",style:{fontSize:12},children:[r.task_id.slice(0,8)," · ",r.detail]})]}),e.jsx(Le,{style:{color:"#c9cdd4",flexShrink:0}})]},`${r.kind}-${r.task_id}`))})})]})]})]})}function L(t){const s=t.match(/-?\d+(\.\d+)?/);return s?Number(s[0]):0}function mt(t){if(!t)return"";const s=t.split(/[/\\]/).filter(Boolean);return s[s.length-1]??t}export{Tt as default};
2
+ //# sourceMappingURL=WorkplacePage-DHrp5VxS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkplacePage-DHrp5VxS.js","sources":["../../src/components/health/KpiSparkCard.tsx","../../src/components/health/OutcomeDonutChart.tsx","../../src/hooks/workplace-derive.ts","../../src/hooks/useWorkplaceData.ts","../../src/pages/WorkplacePage.tsx"],"sourcesContent":["/**\n * KpiSparkCard — v6 Datadog/Grafana 风格 KPI 卡。\n *\n * 视觉契约(Step 1 / health v6):\n * - 卡内 padding 20px,背景 #fff,box-shadow 0 1px 3px rgba(0,0,0,0.05)\n * - 大数字 32px tabular-nums,灰色标签 12px\n * - sparkline mini AreaChart 高 40px,色由 sparkColor 控制(默认主色 #1890ff)\n * - trend pill: \"vs 上周 +N ↑\" — 颜色根据 higherIsBetter + delta 计算\n * - onClick 整卡可点\n *\n * 数据由父组件传入;本组件只负责渲染。\n */\n\nimport { memo } from 'react'\nimport { AreaChart, Area, ResponsiveContainer, Tooltip } from 'recharts'\nimport ArcoTooltip from '@arco-design/web-react/es/Tooltip'\n\ninterface KpiSparkCardProps {\n label: string\n /** 大数字(已格式化,如 \"42\" / \"87.5%\" / \"1.2k\") */\n value: string | number\n /** 7d sparkline 数据(每天一个数字) */\n sparkData: number[]\n /** sparkline 颜色,默认主色 #1890ff(失败 KPI 应传 #f5222d) */\n sparkColor?: string\n /** 本周值(用于 trend pill 计算) */\n thisVal: number\n /** 上周值 */\n prevVal: number\n /** 数字越大越好?决定 trend pill 红/绿 */\n higherIsBetter: boolean\n /** 单位后缀,如 \"%\" */\n suffix?: string\n /** 可选 tooltip 文案:传入后 label 旁边出现一个 (?) 图标且 hover 显示说明。\n * C-5: 用于标注 sparkline 是近似分布而非真实 daily 数据。 */\n tooltip?: string\n onClick?: () => void\n}\n\nconst COLOR_UP_GOOD = '#52c41a'\nconst COLOR_DOWN_BAD = '#f5222d'\nconst COLOR_FLAT = '#86909c'\n\nfunction trendPill(thisVal: number, prevVal: number, higherIsBetter: boolean, suffix = ''): {\n text: string\n color: string\n} {\n const delta = thisVal - prevVal\n if (delta === 0) return { text: `vs 上周 0 →`, color: COLOR_FLAT }\n const arrow = delta > 0 ? '↑' : '↓'\n const worsened = higherIsBetter ? delta < 0 : delta > 0\n const color = worsened ? COLOR_DOWN_BAD : COLOR_UP_GOOD\n const sign = delta > 0 ? '+' : ''\n const txt = Number.isInteger(delta) ? `${delta}` : delta.toFixed(1)\n return { text: `vs 上周 ${sign}${txt}${suffix} ${arrow}`, color }\n}\n\nfunction KpiSparkCardInner({\n label,\n value,\n sparkData,\n sparkColor = '#1890ff',\n thisVal,\n prevVal,\n higherIsBetter,\n suffix = '',\n tooltip,\n onClick,\n}: KpiSparkCardProps) {\n const pill = trendPill(thisVal, prevVal, higherIsBetter, suffix)\n const chartData = sparkData.map((v, i) => ({ i, v }))\n const gradId = `spark-grad-${label.replace(/\\s+/g, '-')}-${sparkColor.replace('#', '')}`\n\n return (\n <div\n onClick={onClick}\n style={{\n background: '#fff',\n borderRadius: 8,\n boxShadow: '0 1px 3px rgba(0,0,0,0.05)',\n padding: 20,\n cursor: onClick ? 'pointer' : 'default',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n transition: 'box-shadow 0.15s',\n }}\n onMouseEnter={(e) => {\n if (onClick) (e.currentTarget as HTMLDivElement).style.boxShadow = '0 2px 8px rgba(0,0,0,0.10)'\n }}\n onMouseLeave={(e) => {\n if (onClick) (e.currentTarget as HTMLDivElement).style.boxShadow = '0 1px 3px rgba(0,0,0,0.05)'\n }}\n >\n <div style={{ fontSize: 12, color: '#86909c', fontWeight: 500, display: 'flex', alignItems: 'center', gap: 4 }}>\n <span>{label}</span>\n {tooltip ? (\n <ArcoTooltip content={tooltip} position=\"top\">\n <span\n aria-label=\"explain\"\n style={{\n cursor: 'help',\n fontSize: 11,\n color: '#86909c',\n border: '1px solid var(--color-border-2)',\n borderRadius: '50%',\n width: 14,\n height: 14,\n lineHeight: '12px',\n textAlign: 'center',\n display: 'inline-block',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n ?\n </span>\n </ArcoTooltip>\n ) : null}\n </div>\n <div\n style={{\n fontSize: 32,\n fontWeight: 600,\n color: '#1d2129',\n lineHeight: 1.1,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {value}\n </div>\n <div style={{ height: 40, marginTop: 2 }}>\n {chartData.length > 0 && (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={chartData} margin={{ top: 2, right: 0, left: 0, bottom: 0 }}>\n <defs>\n <linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={sparkColor} stopOpacity={0.35} />\n <stop offset=\"100%\" stopColor={sparkColor} stopOpacity={0.02} />\n </linearGradient>\n </defs>\n <Tooltip\n cursor={false}\n contentStyle={{ fontSize: 11, padding: '4px 8px', borderRadius: 4 }}\n formatter={(v) => [`${v}${suffix}`, label] as [string, string]}\n labelFormatter={() => ''}\n />\n <Area\n type=\"monotone\"\n dataKey=\"v\"\n stroke={sparkColor}\n strokeWidth={1.5}\n fill={`url(#${gradId})`}\n isAnimationActive={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n )}\n </div>\n <div\n style={{\n fontSize: 11,\n color: pill.color,\n fontWeight: 500,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {pill.text}\n </div>\n </div>\n )\n}\n\n// Perf: memo so window switch / refetch doesn't remount recharts (d3 scale work).\nexport default memo(KpiSparkCardInner)\n","/**\n * OutcomeDonutChart — v6 任务结果总览 donut。\n *\n * 中心显示 总数 + 成功率 %。配色统一来自 '../../utils/outcome'(Arco palette canonical)。\n */\n\nimport { memo } from 'react'\nimport { PieChart, Pie, Cell, ResponsiveContainer, Tooltip, Legend } from 'recharts'\nimport { OUTCOME_COLOR as COLOR, OUTCOME_LABEL as LABEL } from '../../utils/outcome'\n\ninterface OutcomeDonutChartProps {\n success: number\n partial: number\n failed: number\n abandoned: number\n /** 图表高度,默认 240 */\n height?: number\n}\n\nfunction OutcomeDonutChartInner({\n success,\n partial,\n failed,\n abandoned,\n height = 240,\n}: OutcomeDonutChartProps) {\n const total = success + partial + failed + abandoned\n const successRate = total > 0 ? Math.round((success / total) * 1000) / 10 : 0\n const data = [\n { name: LABEL.success, value: success, key: 'success' as const },\n { name: LABEL.partial, value: partial, key: 'partial' as const },\n { name: LABEL.failed, value: failed, key: 'failed' as const },\n { name: LABEL.abandoned, value: abandoned, key: 'abandoned' as const },\n ].filter(d => d.value > 0)\n\n if (total === 0) {\n return (\n <div\n style={{\n height,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: '#86909c',\n fontSize: 13,\n }}\n >\n 近期无已分类任务数据\n </div>\n )\n }\n\n return (\n <div style={{ position: 'relative', height }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={data}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius=\"60%\"\n outerRadius=\"85%\"\n paddingAngle={2}\n stroke=\"none\"\n isAnimationActive={false}\n >\n {data.map((d) => (\n <Cell key={d.key} fill={COLOR[d.key]} />\n ))}\n </Pie>\n <Tooltip\n contentStyle={{ fontSize: 12, padding: '6px 10px', borderRadius: 4 }}\n formatter={(v, n) => {\n const num = typeof v === 'number' ? v : Number(v) || 0\n const pct = total > 0 ? Math.round((num / total) * 100) : 0\n return [`${num} (${pct}%)`, String(n)] as [string, string]\n }}\n />\n <Legend\n verticalAlign=\"bottom\"\n iconType=\"circle\"\n iconSize={8}\n wrapperStyle={{ fontSize: 11 }}\n />\n </PieChart>\n </ResponsiveContainer>\n {/* 中心标签 — absolute positioning over donut hole */}\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n paddingBottom: 24, // offset for legend\n }}\n >\n <div\n style={{\n fontSize: 28,\n fontWeight: 600,\n color: '#1d2129',\n lineHeight: 1.1,\n fontVariantNumeric: 'tabular-nums',\n }}\n >\n {total}\n </div>\n <div style={{ fontSize: 11, color: '#86909c', marginTop: 2 }}>\n 总任务 · 成功率\n {' '}\n <span style={{ color: '#52c41a', fontWeight: 600 }}>{successRate}%</span>\n </div>\n </div>\n </div>\n )\n}\n\n// Perf: memo avoids remounting pie + d3 scale when parent re-renders with same props.\nexport default memo(OutcomeDonutChartInner)\n","/**\n * workplace-derive — 工作台 (Phase 1, decision 29688066) 纯数据派生层。\n *\n * 把工作台页所有「从真实端点响应 → 视图数据」的计算抽成纯函数,零 DOM / 零\n * react 依赖,便于在 node 环境下单测(项目无 jsdom / RTL,见 2026-05-27\n * dashboard-shape-contract 注解)。`useWorkplaceData.ts` 负责 react-query 取数 +\n * 调这些纯函数;`WorkplacePage.tsx` 只渲染。\n *\n * 数据源(全部现有端点,零新后端):\n * GET /api/insights/agent-board?window=N → cards(outcome + start_time)+ total_in_window\n * GET /api/insights/tuning?window=N (7|30) → session_outcome / kb_inject_count / skill_top\n * GET /api/skill-stats/invocations?days=N → 真实 skill 调用数\n * GET /api/violations?days=N (clamp ≤30) → total_in_window(治理违规)\n * GET /api/health → daemon 状态横条\n *\n * 时间窗 7|30|90 由全局 `useTimeWindow()` 驱动;趋势 pill 用「上一窗口」减算\n * (long = 2×window)做对比基线,与 HealthHomePage 既有口径一致。\n */\n\nimport { OUTCOME_COLOR } from '../utils/outcome'\n\n// ─── Server response shapes (mirror src/web/routes/*) ───────────────────────\n\nexport interface AgentBoardCard {\n task_id: string\n title: string\n start_time: string\n outcome: 'success' | 'partial' | 'failed' | 'abandoned' | null\n intercepts?: { deny: number; warn: number }\n kb_pages?: Array<{ name: string; cited: number }>\n}\n\nexport interface AgentBoardResp {\n lanes: Record<string, AgentBoardCard[]>\n summary: { total: number }\n total_in_window?: number\n}\n\nexport interface TuningSummary {\n kb_inject_count: number\n /**\n * 「KB 调用」 — genuine agent KB pulls in window (decision 64d37b1d): the\n * REAL-usage number (`cf knowledge query|fetch --reason \"<wf>/kb-precedent\"`),\n * which the workplace KB KPI now shows as its primary value. Optional for\n * backward-compat: pre-64d37b1d backends omit it → falls back to 0.\n */\n agent_kb_pull_count?: number\n /**\n * C4 主线程听劝率 — fraction of intercepts whose outcome is 'obeyed'\n * (0-1). Migrated from the deleted HealthHomePage (Phase 4c, decision\n * 29688066) so the governance KPI survives the legacy-page cutover. Optional\n * for backwards-compat: the feedback-loop flag may be off (410 → tuning null).\n */\n intercept_obeyed_ratio?: number\n intercept_obeyed_band?: 'green' | 'yellow' | 'red' | 'unknown'\n skill_top: Array<{ skill_id: string; n: number; success_rate: number }>\n session_outcome: {\n success: number\n partial: number\n failed: number\n abandoned: number\n unclassified: number\n }\n}\n\nexport interface TuningResp {\n summary: TuningSummary\n}\n\nexport interface SkillInvocationRow {\n skill_id: string\n total: number\n invoked: number\n /**\n * decision 76be4e4a: genuine agent invoke (cli + 非注入) for this skill.\n * Optional — older backend responses omit it.\n */\n genuine?: number\n injected: number\n}\n\nexport interface SkillInvocationsResp {\n /** events.tool_name ground-truth real call count (audit f61b8a0c); decision\n * 76be4e4a 起降为次要参考。 */\n realCalls?: number\n /**\n * decision 76be4e4a: authoritative「Skill 调用」口径——genuine agent invokes\n * (`invocation_type='cli' AND recorded_at_inject IS NULL`)。Workplace KPI\n * 主数字读它(不是 realCalls=2,也不是含 keyword-matcher 的 invoked)。\n */\n genuineInvoke?: number\n invocations?: SkillInvocationRow[]\n}\n\nexport interface ViolationsResp {\n total_in_window?: number\n}\n\n// ─── Window helpers ─────────────────────────────────────────────────────────\n\nexport type WorkplaceWindow = 7 | 30 | 90\n\n/**\n * The /api/insights/tuning endpoint only supports window ∈ {7, 30} (it clamps\n * anything else to 7). Map the global 90d window down to 30 so the tuning call\n * stays valid; 7/30 pass through unchanged.\n */\nexport function tuningWindow(win: WorkplaceWindow): 7 | 30 {\n return win === 7 ? 7 : 30\n}\n\n/**\n * /api/violations clamps `days` to [1, 30] (400 otherwise). Clamp the global\n * window so a 90d selection still returns data (capped at 30d).\n */\nexport function violationsDays(win: WorkplaceWindow): number {\n return Math.min(win, 30)\n}\n\n// ─── Card flattening ────────────────────────────────────────────────────────\n\n/** Flatten the agent-board lanes map into a single card list. */\nexport function flattenCards(resp: AgentBoardResp | undefined): AgentBoardCard[] {\n if (!resp) return []\n const out: AgentBoardCard[] = []\n for (const lane of Object.values(resp.lanes || {})) out.push(...lane)\n return out\n}\n\n// ─── KPI strip ──────────────────────────────────────────────────────────────\n\nexport interface KpiDelta {\n /** Display text e.g. \"+12\" / \"+3.1%\" / \"0\". */\n text: string\n /** True when the metric moved in the *better* direction. */\n improved: boolean\n /** True when value is flat (delta === 0). */\n flat: boolean\n}\n\n/** Compute a signed delta + improvement direction for a trend pill. */\nexport function kpiDelta(\n thisVal: number,\n prevVal: number,\n higherIsBetter: boolean,\n suffix = '',\n): KpiDelta {\n const delta = Math.round((thisVal - prevVal) * 10) / 10\n if (delta === 0) return { text: '0', improved: false, flat: true }\n const improved = higherIsBetter ? delta > 0 : delta < 0\n const sign = delta > 0 ? '+' : ''\n const num = Number.isInteger(delta) ? `${delta}` : delta.toFixed(1)\n return { text: `${sign}${num}${suffix}`, improved, flat: false }\n}\n\nexport interface WorkplaceKpis {\n totalTasks: number\n successRate: number // 0-100, 1 decimal\n failed: number\n /**\n * 「KB 调用」 primary value = genuine agent KB pulls (agent_kb_pull_count,\n * decision 64d37b1d). The KPI label is \"KB 调用\"; this is the REAL-usage\n * number, NOT the passive injection count (which is demoted to the tooltip).\n */\n kbInject: number\n /**\n * Passive KB injection count (kb_inject_count) — demoted to the KPI tooltip\n * as secondary context (gated ≈ 0). Kept so the number is not lost.\n */\n kbInjectPassive: number\n skillCalls: number\n violations: number\n /**\n * C4 主线程听劝率 (0-100, 1 decimal) — migrated from HealthHomePage (Phase 4c).\n * `null` when the feedback-loop flag is off (tuning endpoint returns 410).\n */\n obeyedRatio: number | null\n /** Severity band for the obeyed ratio (drives the KPI tint). */\n obeyedBand: 'green' | 'yellow' | 'red' | 'unknown'\n}\n\n/** Success rate (0-100, one decimal) from a tuning session_outcome block. */\nexport function successRateOf(outcome: TuningSummary['session_outcome']): number {\n const classified =\n outcome.success + outcome.partial + outcome.failed + outcome.abandoned\n if (classified <= 0) return 0\n return Math.round((outcome.success / classified) * 1000) / 10\n}\n\n/**\n * Authoritative \"Skill 调用\" KPI (decision 76be4e4a). The genuine口径 = agent\n * deliberate `cf skill invoke` pulls (`invocation_type='cli' AND\n * recorded_at_inject IS NULL`), surfaced by the backend as `genuineInvoke`\n * (≈140 all-projects / 106 this-project). This REPLACES the previous\n * `realCalls`-first logic (decision 2d6d59b0), which read the events.tool_name\n * MCP/Skill-tool path (=2) and so missed the ~138 real agent cli pulls entirely.\n *\n * Fallbacks (older backend responses only):\n * 1. genuineInvoke (preferred — the real口径)\n * 2. Σ per-skill genuine rows\n * 3. realCalls (legacy events path — kept only as a last resort, demoted)\n * 4. 0\n */\nexport function skillCallCount(resp: SkillInvocationsResp | undefined): number {\n if (!resp) return 0\n if (typeof resp.genuineInvoke === 'number') return resp.genuineInvoke\n if (Array.isArray(resp.invocations)) {\n const genuineSum = resp.invocations.reduce(\n (s, r) => s + (r.genuine ?? 0),\n 0,\n )\n if (genuineSum > 0) return genuineSum\n }\n if (typeof resp.realCalls === 'number') return resp.realCalls\n return 0\n}\n\n/** Assemble the 6 headline KPI values from the four \"this window\" sources. */\nexport function deriveKpis(args: {\n board?: AgentBoardResp\n tuning?: TuningResp | null\n skills?: SkillInvocationsResp\n violations?: ViolationsResp\n}): WorkplaceKpis {\n const outcome =\n args.tuning?.summary.session_outcome ??\n { success: 0, partial: 0, failed: 0, abandoned: 0, unclassified: 0 }\n const obeyedRaw = args.tuning?.summary.intercept_obeyed_ratio\n return {\n totalTasks: args.board?.total_in_window ?? flattenCards(args.board).length,\n successRate: successRateOf(outcome),\n failed: outcome.failed,\n // decision 64d37b1d: KB KPI primary value = genuine agent pulls (REAL usage).\n // The passive injection count is demoted to kbInjectPassive (tooltip).\n kbInject: args.tuning?.summary.agent_kb_pull_count ?? 0,\n kbInjectPassive: args.tuning?.summary.kb_inject_count ?? 0,\n skillCalls: skillCallCount(args.skills),\n violations: args.violations?.total_in_window ?? 0,\n // C4 主线程听劝率 — migrated from HealthHomePage. null when tuning absent\n // (flag off / 410), so the card can render a \"未启用\" state instead of 0%.\n obeyedRatio: typeof obeyedRaw === 'number' ? Math.round(obeyedRaw * 1000) / 10 : null,\n obeyedBand: args.tuning?.summary.intercept_obeyed_band ?? 'unknown',\n }\n}\n\n// ─── Outcome trend (daily stacked line) ─────────────────────────────────────\n\nexport interface OutcomeTrendPoint {\n date: string // 'MM-DD'\n success: number\n partial: number\n failed: number\n}\n\n/**\n * Bucket classified cards by calendar day over the window. idx 0 = earliest,\n * last = today. Cards without an outcome (in-flight) are skipped.\n */\nexport function bucketOutcomeTrend(\n cards: AgentBoardCard[],\n windowDays: number,\n now = Date.now(),\n): OutcomeTrendPoint[] {\n const map = new Map<string, { success: number; partial: number; failed: number }>()\n const order: string[] = []\n for (let i = windowDays - 1; i >= 0; i--) {\n const d = new Date(now - i * 86_400_000).toISOString().slice(0, 10)\n map.set(d, { success: 0, partial: 0, failed: 0 })\n order.push(d)\n }\n for (const c of cards) {\n if (c.outcome !== 'success' && c.outcome !== 'partial' && c.outcome !== 'failed') {\n continue\n }\n const day = (c.start_time || '').slice(0, 10)\n const row = map.get(day)\n if (row) row[c.outcome] += 1\n }\n return order.map(d => ({ date: d.slice(5), ...map.get(d)! }))\n}\n\n// ─── Result distribution (donut) ────────────────────────────────────────────\n\nexport interface DonutPart {\n key: 'success' | 'partial' | 'failed'\n label: string\n value: number\n color: string\n}\n\nexport interface ResultDistribution {\n parts: DonutPart[]\n total: number\n successRate: number // 0-100, one decimal\n}\n\n/** Donut parts + center total + success rate from a tuning session_outcome. */\nexport function deriveDistribution(\n outcome: TuningSummary['session_outcome'] | undefined,\n): ResultDistribution {\n const o = outcome ?? { success: 0, partial: 0, failed: 0, abandoned: 0, unclassified: 0 }\n const parts: DonutPart[] = [\n { key: 'success', label: '成功', value: o.success, color: OUTCOME_COLOR.success },\n { key: 'partial', label: '部分', value: o.partial, color: OUTCOME_COLOR.partial },\n { key: 'failed', label: '失败', value: o.failed, color: OUTCOME_COLOR.failed },\n ]\n const total = o.success + o.partial + o.failed\n return { parts, total, successRate: successRateOf(o) }\n}\n\n// ─── Sparkline series ───────────────────────────────────────────────────────\n\n/**\n * Daily count series for a KPI sparkline (length = windowDays, idx 0 earliest).\n * `accessor` returns the per-card contribution (1 for \"count\", 0/1 for filters).\n */\nexport function dailySeries(\n cards: AgentBoardCard[],\n windowDays: number,\n accessor: (c: AgentBoardCard) => number,\n now = Date.now(),\n): number[] {\n const buckets = Array(windowDays).fill(0) as number[]\n for (const c of cards) {\n const ts = new Date(c.start_time).getTime()\n if (!Number.isFinite(ts)) continue\n const idx = windowDays - 1 - Math.floor((now - ts) / 86_400_000)\n if (idx >= 0 && idx < windowDays) buckets[idx] += accessor(c)\n }\n return buckets\n}\n\n/** Daily success-rate (%) series — success / classified per day, 0 when empty. */\nexport function dailySuccessRate(\n cards: AgentBoardCard[],\n windowDays: number,\n now = Date.now(),\n): number[] {\n const succ = dailySeries(cards, windowDays, c => (c.outcome === 'success' ? 1 : 0), now)\n const classified = dailySeries(\n cards,\n windowDays,\n c =>\n c.outcome === 'success' || c.outcome === 'partial' || c.outcome === 'failed' || c.outcome === 'abandoned'\n ? 1\n : 0,\n now,\n )\n return succ.map((s, i) => (classified[i] > 0 ? Math.round((s / classified[i]) * 100) : 0))\n}\n\n// ─── \"需注意\" attention list (recent failed + high-intercept) ────────────────\n\nexport interface AttentionItem {\n kind: 'failed' | 'intercept'\n task_id: string\n title: string\n detail: string\n ts: string\n}\n\nconst ATTENTION_INTERCEPT_THRESHOLD = 5\n\n/**\n * Merge most-recent failed tasks + high-intercept tasks into a compact \"需注意\"\n * list. Failed first (most recent), then high-intercept; capped at `cap`.\n * Pure — the page renders each item as a clickable row → /tasks?task=<id>.\n */\nexport function deriveAttention(cards: AgentBoardCard[], cap = 5): AttentionItem[] {\n const failed: AttentionItem[] = cards\n .filter(c => c.outcome === 'failed')\n .sort((a, b) => (b.start_time || '').localeCompare(a.start_time || ''))\n .slice(0, cap)\n .map(c => ({\n kind: 'failed' as const,\n task_id: c.task_id,\n title: c.title || '(空)',\n detail: '失败',\n ts: c.start_time,\n }))\n\n const high: AttentionItem[] = cards\n .map(c => ({ card: c, total: (c.intercepts?.deny ?? 0) + (c.intercepts?.warn ?? 0) }))\n .filter(x => x.total >= ATTENTION_INTERCEPT_THRESHOLD)\n .sort((a, b) => b.total - a.total)\n .slice(0, cap)\n .map(x => ({\n kind: 'intercept' as const,\n task_id: x.card.task_id,\n title: x.card.title || '(空)',\n detail: `${x.total} 次拦截`,\n ts: x.card.start_time,\n }))\n\n // De-dup by task_id (a failed task can also be high-intercept) — keep failed.\n const seen = new Set(failed.map(f => f.task_id))\n const merged = [...failed, ...high.filter(h => !seen.has(h.task_id))]\n return merged.slice(0, cap)\n}\n\n/** Subtract the inner window from the outer to approximate the previous window. */\nexport function prevWindowValue(longVal: number | undefined, thisVal: number | undefined): number | undefined {\n if (longVal == null) return undefined\n if (thisVal == null) return longVal\n return Math.max(0, longVal - thisVal)\n}\n","/**\n * useWorkplaceData — 工作台 (Phase 1, decision 29688066) 取数 hook。\n *\n * 并行拉取现有端点(零新后端),用全局时间窗 `useTimeWindow()` 驱动 queryKey,\n * 把响应交给 `workplace-derive.ts` 的纯函数装配成视图模型。趋势 pill 用「上一\n * 窗口 = 2×window 减算」做对比基线,与 HealthHomePage 既有口径一致。\n *\n * Risk R7:所有 query 的 key 都带 window 维度,时间窗切换会自动重新拉数。\n */\n\nimport { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useTimeWindow } from '../lib/time-window'\nimport { useProject } from '../lib/project'\nimport { resolveEffectiveProject } from '../lib/project-resolve'\nimport { appendProject, kbProjectsKey, ALL_PROJECTS } from '../utils/kbProject'\nimport { listKbProjects } from '../utils/kbApi'\nimport {\n type AgentBoardResp,\n type TuningResp,\n type SkillInvocationsResp,\n type ViolationsResp,\n type WorkplaceWindow,\n type WorkplaceKpis,\n type OutcomeTrendPoint,\n type ResultDistribution,\n type AttentionItem,\n type KpiDelta,\n tuningWindow,\n violationsDays,\n flattenCards,\n deriveKpis,\n successRateOf,\n skillCallCount,\n bucketOutcomeTrend,\n deriveDistribution,\n dailySeries,\n dailySuccessRate,\n deriveAttention,\n kpiDelta,\n prevWindowValue,\n} from './workplace-derive'\n\ninterface DaemonHealthResp {\n daemon?: { status?: 'alive' | 'stale' | 'dead'; pid?: number | null }\n}\n\n// ─── Fetchers ───────────────────────────────────────────────────────────────\n\nasync function fetchJson<T>(url: string, allow410 = false): Promise<T | null> {\n const r = await fetch(url)\n if (allow410 && r.status === 410) return null\n if (!r.ok) throw new Error(`${url} → ${r.status}`)\n return r.json() as Promise<T>\n}\n\n// Project-scoped fetchers: board + violations + tuning + skill-stats now ALL\n// support `?project=` (decision 39839e30; skill-stats added in Part 2 once\n// skill_invocations.project_path landed). All 4 workplace KPIs (KB 注入 / 听劝率\n// / 结果分布 / Skill 调用) filter by project → the「全局口径」caveat is fully gone.\nconst fetchBoard = (win: number, project: string) =>\n fetchJson<AgentBoardResp>(appendProject(`/api/insights/agent-board?window=${win}`, project))\nconst fetchViolations = (days: number, project: string) =>\n fetchJson<ViolationsResp>(appendProject(`/api/violations?days=${days}&limit=1`, project))\nconst fetchTuning = (win: 7 | 30, project: string) =>\n fetchJson<TuningResp>(appendProject(`/api/insights/tuning?window=${win}`, project), true)\nconst fetchSkills = (days: number, project: string) =>\n fetchJson<SkillInvocationsResp>(appendProject(`/api/skill-stats/invocations?days=${days}`, project))\nconst fetchHealth = () => fetchJson<DaemonHealthResp>('/api/health')\n\n// ─── Per-KPI trend pill ─────────────────────────────────────────────────────\n\nexport interface WorkplaceTrend {\n totalTasks: KpiDelta\n successRate: KpiDelta\n failed: KpiDelta\n kbInject: KpiDelta\n skillCalls: KpiDelta\n violations: KpiDelta\n}\n\nexport interface WorkplaceData {\n window: WorkplaceWindow\n loading: boolean\n isError: boolean\n kpis: WorkplaceKpis\n trend: WorkplaceTrend\n sparks: {\n totalTasks: number[]\n successRate: number[]\n failed: number[]\n }\n outcomeTrend: OutcomeTrendPoint[]\n distribution: ResultDistribution\n attention: AttentionItem[]\n daemon: { status: 'alive' | 'stale' | 'dead' | 'unknown' }\n /**\n * The effective project filter applied to board + violations (decision\n * 39839e30). '' = all projects (default-with-empty-daemon-current or explicit\n * 全部项目). Used by the page header to show the current scope.\n */\n project: string\n /** True when the all-projects view is selected (no project filter). */\n isAllProjects: boolean\n /**\n * DEPRECATED (decision 39839e30 Part 2): the Skill 调用 (skill-stats) endpoint\n * now supports `?project=` (skill_invocations.project_path landed), so all 4\n * workplace KPIs filter by project and the「全局口径」caveat is retired. Always\n * `false` now; kept only so WorkplacePage's annotation prop still type-checks\n * until it is removed too.\n */\n skillScopedGlobal: boolean\n}\n\n/** Fetch + assemble all workplace view data for the current global time window. */\nexport function useWorkplaceData(): WorkplaceData {\n const { window: win } = useTimeWindow()\n // Project filter (authoritative = ProjectContext, decision 39839e30). Only\n // board + violations consume it (their endpoints support ?project=).\n const { project: projectSelection } = useProject()\n const { data: kbProjects } = useQuery({\n queryKey: kbProjectsKey(),\n queryFn: listKbProjects,\n staleTime: 30_000,\n })\n const project = resolveEffectiveProject(projectSelection, kbProjects?.current ?? '')\n const longWin = (win * 2) as number\n const tWin = tuningWindow(win)\n const tLongWin = tuningWindow((win * 2 > 30 ? 30 : (win * 2 as WorkplaceWindow)))\n const vDays = violationsDays(win)\n const vLongDays = violationsDays((win * 2) as WorkplaceWindow)\n\n // \"this window\" queries drive first paint + headline numbers.\n const boardQ = useQuery({\n queryKey: ['wp-board', win, project],\n queryFn: () => fetchBoard(win, project),\n refetchInterval: 60_000,\n refetchIntervalInBackground: false,\n })\n const tuningQ = useQuery({ queryKey: ['wp-tuning', tWin, project], queryFn: () => fetchTuning(tWin, project) })\n const skillsQ = useQuery({ queryKey: ['wp-skills', win, project], queryFn: () => fetchSkills(win, project) })\n const violationsQ = useQuery({\n queryKey: ['wp-violations', vDays, project],\n queryFn: () => fetchViolations(vDays, project),\n staleTime: 60_000,\n })\n const healthQ = useQuery({\n queryKey: ['wp-health'],\n queryFn: fetchHealth,\n refetchInterval: 30_000,\n refetchIntervalInBackground: false,\n })\n\n // \"previous window\" queries (long = 2×window) — for trend-pill subtraction.\n const boardLongQ = useQuery({ queryKey: ['wp-board-long', longWin, project], queryFn: () => fetchBoard(longWin, project) })\n const tuningLongQ = useQuery({ queryKey: ['wp-tuning-long', tLongWin, project], queryFn: () => fetchTuning(tLongWin, project) })\n const skillsLongQ = useQuery({ queryKey: ['wp-skills-long', longWin, project], queryFn: () => fetchSkills(longWin, project) })\n const violationsLongQ = useQuery({\n queryKey: ['wp-violations-long', vLongDays, project],\n queryFn: () => fetchViolations(vLongDays, project),\n staleTime: 60_000,\n })\n\n const cards = useMemo(() => flattenCards(boardQ.data ?? undefined), [boardQ.data])\n\n const kpis = useMemo(\n () =>\n deriveKpis({\n board: boardQ.data ?? undefined,\n tuning: tuningQ.data ?? null,\n skills: skillsQ.data ?? undefined,\n violations: violationsQ.data ?? undefined,\n }),\n [boardQ.data, tuningQ.data, skillsQ.data, violationsQ.data],\n )\n\n const trend = useMemo<WorkplaceTrend>(() => {\n const thisOutcome = tuningQ.data?.summary.session_outcome\n const longOutcome = tuningLongQ.data?.summary.session_outcome\n // prev = long − this (best-effort), then derive prev KPI scalars.\n const sub = (l?: number, t?: number) => prevWindowValue(l, t) ?? 0\n const prevTotal = prevWindowValue(boardLongQ.data?.total_in_window, boardQ.data?.total_in_window) ?? 0\n const prevFailed = sub(longOutcome?.failed, thisOutcome?.failed)\n // decision 64d37b1d: KB KPI trend tracks genuine agent pulls (agent_kb_pull_count),\n // matching the primary value in deriveKpis. Fall back to 0 for old backends.\n const prevKb = sub(\n tuningLongQ.data?.summary.agent_kb_pull_count ?? 0,\n tuningQ.data?.summary.agent_kb_pull_count ?? 0,\n )\n const prevSkill = Math.max(0, skillCallCount(skillsLongQ.data ?? undefined) - skillCallCount(skillsQ.data ?? undefined))\n const prevViol = prevWindowValue(violationsLongQ.data?.total_in_window, violationsQ.data?.total_in_window) ?? 0\n // success rate \"prev\" derived from the subtracted outcome counts.\n const prevSuccessRate = longOutcome\n ? successRateOf({\n success: sub(longOutcome.success, thisOutcome?.success),\n partial: sub(longOutcome.partial, thisOutcome?.partial),\n failed: prevFailed,\n abandoned: sub(longOutcome.abandoned, thisOutcome?.abandoned),\n unclassified: 0,\n })\n : kpis.successRate\n return {\n totalTasks: kpiDelta(kpis.totalTasks, prevTotal, true),\n successRate: kpiDelta(kpis.successRate, prevSuccessRate, true, '%'),\n failed: kpiDelta(kpis.failed, prevFailed, false),\n kbInject: kpiDelta(kpis.kbInject, prevKb, true),\n skillCalls: kpiDelta(kpis.skillCalls, prevSkill, true),\n violations: kpiDelta(kpis.violations, prevViol, false),\n }\n }, [\n kpis,\n boardQ.data,\n boardLongQ.data,\n tuningQ.data,\n tuningLongQ.data,\n skillsQ.data,\n skillsLongQ.data,\n violationsQ.data,\n violationsLongQ.data,\n ])\n\n const sparks = useMemo(\n () => ({\n totalTasks: dailySeries(cards, win, () => 1),\n successRate: dailySuccessRate(cards, win),\n failed: dailySeries(cards, win, c => (c.outcome === 'failed' ? 1 : 0)),\n }),\n [cards, win],\n )\n\n const outcomeTrend = useMemo(() => bucketOutcomeTrend(cards, win), [cards, win])\n const distribution = useMemo(\n () => deriveDistribution(tuningQ.data?.summary.session_outcome),\n [tuningQ.data],\n )\n const attention = useMemo(() => deriveAttention(cards), [cards])\n\n const daemonStatus = healthQ.data?.daemon?.status ?? 'unknown'\n\n return {\n window: win,\n loading: boardQ.isLoading || tuningQ.isLoading,\n isError: boardQ.isError,\n kpis,\n trend,\n sparks,\n outcomeTrend,\n distribution,\n attention,\n daemon: { status: daemonStatus },\n project,\n isAllProjects: projectSelection === ALL_PROJECTS,\n // decision 39839e30 Part 2: ALL 4 workplace KPIs (KB 注入 / 听劝率 / 结果分布 /\n // Skill 调用) now filter by project — skill-stats gained project scope once\n // skill_invocations.project_path landed. The「全局口径」caveat is retired:\n // always false. Field kept for back-compat with WorkplacePage's annotation\n // (which now never renders) until that prop is removed too.\n skillScopedGlobal: false,\n }\n}\n","/**\n * WorkplacePage — 工作台 (Phase 1, decision 29688066).\n *\n * 替换 `/workplace` 的占位组件为真实工作台页。全部数据接现有端点(零\n * 新后端),由全局时间窗 `useTimeWindow()` 驱动(7d/30d/90d 切换自动重新拉数)。\n *\n * 护栏(spec R2):真 Arco 组件 + Recharts,**不** 直搬原型 Tailwind / 手搓 SVG。\n * - 概览统计卡:复用 health 的 `KpiSparkCard`(Recharts mini AreaChart sparkline)\n * - Outcome 趋势:Recharts `LineChart`(success/partial/failed,按天)\n * - 结果分布 donut:复用 health 的 `OutcomeDonutChart`(Recharts PieChart)\n * - 快捷入口:导航到 /tasks(查看,非新建)/decisions /issues /system/daemon\n * - 需注意:最近 failed task + 高拦截 task,可点跳 /tasks?task=<id>\n * - C4 主线程听劝率:从已删除的 HealthHomePage 迁来的治理 KPI(Phase 4c,\n * decision 29688066),接 /api/insights/tuning 的 intercept_obeyed_ratio。\n */\n\nimport { useNavigate } from 'react-router-dom'\nimport Grid from '@arco-design/web-react/es/Grid'\nimport Card from '@arco-design/web-react/es/Card'\nimport Tag from '@arco-design/web-react/es/Tag'\nimport Typography from '@arco-design/web-react/es/Typography'\nimport Skeleton from '@arco-design/web-react/es/Skeleton'\nimport Empty from '@arco-design/web-react/es/Empty'\nimport Avatar from '@arco-design/web-react/es/Avatar'\nimport {\n IconCheckCircle,\n IconCommon,\n IconExclamationCircle,\n IconHeart,\n IconRight,\n} from '@arco-design/web-react/icon'\nimport {\n LineChart,\n Line,\n ResponsiveContainer,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n CartesianGrid,\n} from 'recharts'\nimport KpiSparkCard from '../components/health/KpiSparkCard'\nimport OutcomeDonutChart from '../components/health/OutcomeDonutChart'\nimport { OUTCOME_COLOR, OUTCOME_LABEL } from '../utils/outcome'\nimport { useWorkplaceData } from '../hooks/useWorkplaceData'\n\nconst Row = Grid.Row\nconst Col = Grid.Col\n\nconst COLOR_PRIMARY = '#1890ff'\nconst COLOR_SUCCESS = OUTCOME_COLOR.success\nconst COLOR_WARN = OUTCOME_COLOR.partial\nconst COLOR_FAIL = OUTCOME_COLOR.failed\n\n/** Severity band → tint for the C4 听劝率 card (migrated from HealthHomePage). */\nconst OBEYED_BAND_COLOR: Record<string, string> = {\n green: COLOR_SUCCESS,\n yellow: COLOR_WARN,\n red: COLOR_FAIL,\n unknown: '#86909c',\n}\n\nconst CARD_STYLE: React.CSSProperties = {\n borderRadius: 8,\n boxShadow: '0 1px 3px rgba(0,0,0,0.05)',\n border: 'none',\n}\n\ninterface QuickLink {\n label: string\n route: string\n icon: React.ReactNode\n}\n\nconst QUICK_LINKS: QuickLink[] = [\n { label: '查看任务', route: '/tasks', icon: <IconCheckCircle /> },\n { label: '查看决策', route: '/decisions', icon: <IconCommon /> },\n { label: '治理问题', route: '/issues', icon: <IconExclamationCircle /> },\n { label: 'Daemon 健康', route: '/system/daemon', icon: <IconHeart /> },\n]\n\nexport default function WorkplacePage() {\n const navigate = useNavigate()\n const data = useWorkplaceData()\n const { kpis, trend, sparks, outcomeTrend, distribution, attention, daemon, loading } = data\n\n const daemonRunning = daemon.status === 'alive'\n\n // Header scope label (decision 39839e30): replaces the hardcoded \"claude-forge\"\n // literal with the actually selected project. '' + all-projects view → 全部项目;\n // '' + a daemon-current path → its basename; a concrete path → its basename.\n const projectLabel = data.isAllProjects\n ? '全部项目'\n : projectBasename(data.project) || '全部项目'\n\n // decision 39839e30 Part 2: ALL 4 workplace KPIs (KB 注入 / 听劝率 / 结果分布 /\n // Skill 调用) now filter by project — skill-stats gained project scope once\n // skill_invocations.project_path landed. The「全局口径」caveat is fully retired\n // (skillScopedGlobal is now always false).\n const skillGlobalNote = data.skillScopedGlobal\n\n return (\n <div style={{ padding: 24, background: '#fafafa', minHeight: '100%' }}>\n {/* ── 欢迎横条 ─────────────────────────────────────────────────────── */}\n <Card style={{ ...CARD_STYLE, marginBottom: 16 }} bodyStyle={{ padding: '16px 20px' }}>\n <Row align=\"center\" justify=\"space-between\" gutter={16}>\n <Col flex=\"1\">\n <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}>\n <Avatar style={{ backgroundColor: '#e8f3ff', color: COLOR_PRIMARY, flexShrink: 0 }}>YB</Avatar>\n <div style={{ minWidth: 0 }}>\n <div style={{ fontSize: 16, fontWeight: 600, color: '#1d2129' }}>工作台</div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 13 }}>\n {projectLabel} · 近 {data.window} 天 {kpis.totalTasks} 个任务、成功率 {kpis.successRate}%。\n </Typography.Text>\n </div>\n </div>\n </Col>\n <Col flex=\"none\">\n <div style={{ display: 'flex', gap: 24, alignItems: 'center' }}>\n <div style={{ textAlign: 'center' }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: '#1d2129' }}>{kpis.totalTasks}</div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>窗口任务</Typography.Text>\n </div>\n <div style={{ width: 1, height: 32, background: '#e5e6eb' }} />\n <div style={{ textAlign: 'center' }}>\n <div\n style={{\n fontSize: 20,\n fontWeight: 600,\n color: daemonRunning ? COLOR_SUCCESS : '#86909c',\n }}\n >\n {daemonRunning ? '运行中' : daemon.status === 'unknown' ? '—' : '已停止'}\n </div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>Daemon</Typography.Text>\n </div>\n </div>\n </Col>\n </Row>\n </Card>\n\n {/* ── 概览统计卡(6 张,Recharts sparkline)────────────────────────── */}\n <Row gutter={[16, 16]} style={{ marginBottom: 16 }}>\n <Col xs={12} sm={8} xl={4}>\n <KpiSparkCard\n label=\"总任务\"\n value={kpis.totalTasks}\n sparkData={sparks.totalTasks}\n sparkColor={COLOR_PRIMARY}\n thisVal={kpis.totalTasks}\n prevVal={kpis.totalTasks - deltaNum(trend.totalTasks.text)}\n higherIsBetter\n />\n </Col>\n <Col xs={12} sm={8} xl={4}>\n <KpiSparkCard\n label=\"成功率\"\n value={`${kpis.successRate}%`}\n suffix=\"%\"\n sparkData={sparks.successRate}\n sparkColor={COLOR_SUCCESS}\n thisVal={kpis.successRate}\n prevVal={kpis.successRate - deltaNum(trend.successRate.text)}\n higherIsBetter\n />\n </Col>\n <Col xs={12} sm={8} xl={4}>\n <KpiSparkCard\n label=\"失败任务\"\n value={kpis.failed}\n sparkData={sparks.failed}\n sparkColor={COLOR_FAIL}\n thisVal={kpis.failed}\n prevVal={kpis.failed - deltaNum(trend.failed.text)}\n higherIsBetter={false}\n onClick={() => navigate('/tasks?outcome=failed')}\n />\n </Col>\n <Col xs={12} sm={8} xl={4}>\n <KpiSparkCard\n label=\"KB 调用\"\n value={kpis.kbInject}\n sparkData={sparks.totalTasks}\n sparkColor={COLOR_PRIMARY}\n thisVal={kpis.kbInject}\n prevVal={kpis.kbInject - deltaNum(trend.kbInject.text)}\n higherIsBetter\n tooltip={\n `agent 主动 pull 知识库的次数(真实使用)——cf knowledge query/fetch ` +\n `带 kb-precedent reason,来自 /api/insights/tuning(窗口聚合,按项目过滤)。` +\n `其中被动注入 ${kpis.kbInjectPassive} 次(daemon 自动塞 prompt,门控后≈0)。` +\n `sparkline 形状近似按每日任务活跃度。`\n }\n />\n </Col>\n <Col xs={12} sm={8} xl={4}>\n <KpiSparkCard\n label=\"Skill 调用\"\n value={kpis.skillCalls}\n sparkData={sparks.totalTasks}\n sparkColor={COLOR_WARN}\n thisVal={kpis.skillCalls}\n prevVal={kpis.skillCalls - deltaNum(trend.skillCalls.text)}\n higherIsBetter\n tooltip={\n '真实调用数来自 /api/skill-stats/invocations(events.tool_name 口径)。' +\n (skillGlobalNote ? ' 注意:该端点暂不支持按项目过滤,此处为全局口径。' : '')\n }\n />\n </Col>\n <Col xs={12} sm={8} xl={4}>\n <KpiSparkCard\n label=\"治理违规\"\n value={kpis.violations}\n sparkData={sparks.failed}\n sparkColor={COLOR_FAIL}\n thisVal={kpis.violations}\n prevVal={kpis.violations - deltaNum(trend.violations.text)}\n higherIsBetter={false}\n onClick={() => navigate('/issues')}\n />\n </Col>\n </Row>\n\n {/* ── 趋势 + donut + 快捷/需注意(左主右副)──────────────────────── */}\n <Row gutter={[16, 16]} align=\"start\">\n <Col xs={24} xl={16}>\n {/* Outcome 趋势折线 */}\n <Card\n style={{ ...CARD_STYLE, marginBottom: 16 }}\n title={\n <div>\n <div style={{ fontSize: 15, fontWeight: 600 }}>Outcome 趋势</div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 近 {data.window} 天 · 按天聚合\n </Typography.Text>\n </div>\n }\n >\n {loading ? (\n <div style={{ height: 260 }}>\n <Skeleton animation text={{ rows: 6 }} />\n </div>\n ) : outcomeTrend.every(d => d.success + d.partial + d.failed === 0) ? (\n <Empty description={`近 ${data.window} 天无已分类任务`} style={{ padding: 48 }} />\n ) : (\n <ResponsiveContainer width=\"100%\" height={260}>\n <LineChart data={outcomeTrend} margin={{ top: 8, right: 16, left: 0, bottom: 0 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke=\"#f0f0f0\" />\n <XAxis dataKey=\"date\" fontSize={11} stroke=\"#86909c\" minTickGap={24} />\n <YAxis fontSize={11} allowDecimals={false} stroke=\"#86909c\" />\n <Tooltip contentStyle={{ fontSize: 12, borderRadius: 4 }} />\n <Legend wrapperStyle={{ fontSize: 11 }} iconType=\"circle\" />\n <Line type=\"monotone\" dataKey=\"success\" stroke={COLOR_SUCCESS} strokeWidth={2} dot={false} name={OUTCOME_LABEL.success} />\n <Line type=\"monotone\" dataKey=\"partial\" stroke={COLOR_WARN} strokeWidth={2} dot={false} name={OUTCOME_LABEL.partial} />\n <Line type=\"monotone\" dataKey=\"failed\" stroke={COLOR_FAIL} strokeWidth={2} dot={false} name={OUTCOME_LABEL.failed} />\n </LineChart>\n </ResponsiveContainer>\n )}\n </Card>\n\n {/* 任务结果分布 donut */}\n <Card\n style={CARD_STYLE}\n title={<span style={{ fontSize: 15, fontWeight: 600 }}>任务结果分布</span>}\n extra={\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 本窗口\n </Typography.Text>\n }\n >\n {loading ? (\n <div style={{ height: 240 }}>\n <Skeleton animation text={{ rows: 5 }} />\n </div>\n ) : (\n <Row gutter={24} align=\"center\">\n <Col xs={24} sm={14}>\n <OutcomeDonutChart\n success={distribution.parts.find(p => p.key === 'success')?.value ?? 0}\n partial={distribution.parts.find(p => p.key === 'partial')?.value ?? 0}\n failed={distribution.parts.find(p => p.key === 'failed')?.value ?? 0}\n abandoned={0}\n height={220}\n />\n </Col>\n <Col xs={24} sm={10}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>\n {distribution.parts.map(p => (\n <div key={p.key} style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8, fontSize: 13, color: '#4e5969' }}>\n <span style={{ width: 10, height: 10, borderRadius: 2, background: p.color, display: 'inline-block' }} />\n {p.label}\n </span>\n <span style={{ fontWeight: 600, color: '#1d2129', fontVariantNumeric: 'tabular-nums' }}>{p.value}</span>\n </div>\n ))}\n <div style={{ borderTop: '1px solid #f0f0f0', paddingTop: 10, display: 'flex', justifyContent: 'space-between', fontSize: 13 }}>\n <span style={{ color: '#4e5969' }}>成功率</span>\n <span style={{ fontWeight: 600, color: COLOR_SUCCESS }}>{distribution.successRate}%</span>\n </div>\n </div>\n </Col>\n </Row>\n )}\n </Card>\n </Col>\n\n {/* 右副:听劝率 + 快捷入口 + 需注意 */}\n <Col xs={24} xl={8}>\n {/* C4 主线程听劝率(治理 KPI,迁自已删除的 HealthHomePage)。 */}\n <Card\n style={{ ...CARD_STYLE, marginBottom: 16 }}\n title={<span style={{ fontSize: 15, fontWeight: 600 }}>主线程听劝率</span>}\n extra={\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n C4 治理\n </Typography.Text>\n }\n >\n {loading ? (\n <Skeleton animation text={{ rows: 2 }} />\n ) : kpis.obeyedRatio == null ? (\n <Empty\n description=\"反馈循环未启用(cf config set feedback_loop.enabled true)\"\n style={{ padding: 16 }}\n />\n ) : (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 12 }}>\n <div\n style={{\n fontSize: 32,\n fontWeight: 600,\n lineHeight: 1.1,\n fontVariantNumeric: 'tabular-nums',\n color: OBEYED_BAND_COLOR[kpis.obeyedBand] ?? '#1d2129',\n }}\n >\n {kpis.obeyedRatio}%\n </div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n 近 {data.window} 天有拦截 task 中听劝(outcome ≠ failed)比例\n </Typography.Text>\n </div>\n )}\n </Card>\n\n <Card\n style={{ ...CARD_STYLE, marginBottom: 16 }}\n title={<span style={{ fontSize: 15, fontWeight: 600 }}>快捷入口</span>}\n >\n <Row gutter={[12, 12]}>\n {QUICK_LINKS.map(q => (\n <Col span={12} key={q.route}>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={() => navigate(q.route)}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') navigate(q.route)\n }}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 6,\n padding: '14px 0',\n borderRadius: 6,\n border: '1px solid #e5e6eb',\n cursor: 'pointer',\n color: '#4e5969',\n transition: 'all 0.15s',\n }}\n onMouseEnter={e => {\n e.currentTarget.style.borderColor = COLOR_PRIMARY\n e.currentTarget.style.color = COLOR_PRIMARY\n }}\n onMouseLeave={e => {\n e.currentTarget.style.borderColor = '#e5e6eb'\n e.currentTarget.style.color = '#4e5969'\n }}\n >\n <span style={{ fontSize: 18 }}>{q.icon}</span>\n <span style={{ fontSize: 12 }}>{q.label}</span>\n </div>\n </Col>\n ))}\n </Row>\n </Card>\n\n <Card\n style={CARD_STYLE}\n title={<span style={{ fontSize: 15, fontWeight: 600 }}>需注意</span>}\n extra={\n <Typography.Text\n style={{ fontSize: 12, color: COLOR_PRIMARY, cursor: 'pointer' }}\n onClick={() => navigate('/issues')}\n >\n 查看全部\n </Typography.Text>\n }\n >\n {loading ? (\n <Skeleton animation text={{ rows: 4 }} />\n ) : attention.length === 0 ? (\n <Empty description=\"无明显异常项\" style={{ padding: 24 }} />\n ) : (\n <div>\n {attention.map(a => (\n <div\n key={`${a.kind}-${a.task_id}`}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigate(`/tasks?task=${encodeURIComponent(a.task_id)}`)}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') navigate(`/tasks?task=${encodeURIComponent(a.task_id)}`)\n }}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: '10px 0',\n borderBottom: '1px solid #f7f8fa',\n cursor: 'pointer',\n }}\n >\n <Tag color={a.kind === 'failed' ? 'red' : 'orange'} size=\"small\" style={{ flexShrink: 0 }}>\n {a.kind === 'failed' ? '失败' : '高拦截'}\n </Tag>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div\n style={{\n fontSize: 13,\n color: '#1d2129',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {a.title}\n </div>\n <Typography.Text type=\"secondary\" style={{ fontSize: 12 }}>\n {a.task_id.slice(0, 8)} · {a.detail}\n </Typography.Text>\n </div>\n <IconRight style={{ color: '#c9cdd4', flexShrink: 0 }} />\n </div>\n ))}\n </div>\n )}\n </Card>\n </Col>\n </Row>\n </div>\n )\n}\n\n/**\n * Parse the leading signed number out of a KpiDelta.text (e.g. \"+12\" → 12,\n * \"-3.1%\" → -3.1, \"0\" → 0). Used only to reconstruct `prevVal` for the shared\n * KpiSparkCard trend pill (which recomputes the delta itself).\n */\nfunction deltaNum(text: string): number {\n const m = text.match(/-?\\d+(\\.\\d+)?/)\n return m ? Number(m[0]) : 0\n}\n\n/** Basename of an absolute project path (e.g. /a/b/claude-forge → claude-forge). */\nfunction projectBasename(path: string): string {\n if (!path) return ''\n const parts = path.split(/[/\\\\]/).filter(Boolean)\n return parts[parts.length - 1] ?? path\n}\n"],"names":["COLOR_UP_GOOD","COLOR_DOWN_BAD","COLOR_FLAT","trendPill","thisVal","prevVal","higherIsBetter","suffix","delta","arrow","color","sign","txt","KpiSparkCardInner","label","value","sparkData","sparkColor","tooltip","onClick","pill","chartData","v","i","gradId","jsxs","e","jsx","ArcoTooltip","ResponsiveContainer","AreaChart","Tooltip","Area","KpiSparkCard","memo","OutcomeDonutChartInner","success","partial","failed","abandoned","height","total","successRate","data","LABEL","PieChart","Pie","Cell","COLOR","n","num","pct","Legend","OutcomeDonutChart","tuningWindow","win","violationsDays","flattenCards","resp","out","lane","kpiDelta","improved","successRateOf","outcome","classified","skillCallCount","genuineSum","s","r","deriveKpis","args","_a","obeyedRaw","_b","_c","_d","_e","_f","_g","bucketOutcomeTrend","cards","windowDays","now","map","order","d","c","day","row","deriveDistribution","o","parts","OUTCOME_COLOR","dailySeries","accessor","buckets","ts","idx","dailySuccessRate","succ","ATTENTION_INTERCEPT_THRESHOLD","deriveAttention","cap","a","b","high","x","seen","f","h","prevWindowValue","longVal","fetchJson","url","allow410","fetchBoard","project","appendProject","fetchViolations","days","fetchTuning","fetchSkills","fetchHealth","useWorkplaceData","useTimeWindow","projectSelection","useProject","kbProjects","useQuery","kbProjectsKey","listKbProjects","resolveEffectiveProject","longWin","tWin","tLongWin","vDays","vLongDays","boardQ","tuningQ","skillsQ","violationsQ","healthQ","boardLongQ","tuningLongQ","skillsLongQ","violationsLongQ","useMemo","kpis","trend","thisOutcome","longOutcome","sub","l","t","prevTotal","prevFailed","prevKb","prevSkill","prevViol","_h","prevSuccessRate","sparks","outcomeTrend","distribution","attention","daemonStatus","ALL_PROJECTS","Row","Grid","Col","COLOR_PRIMARY","COLOR_SUCCESS","COLOR_WARN","COLOR_FAIL","OBEYED_BAND_COLOR","CARD_STYLE","QUICK_LINKS","IconCheckCircle","IconCommon","IconExclamationCircle","IconHeart","WorkplacePage","navigate","useNavigate","daemon","loading","daemonRunning","projectLabel","projectBasename","Card","Avatar","Typography","deltaNum","Skeleton","Empty","LineChart","CartesianGrid","XAxis","YAxis","Line","OUTCOME_LABEL","p","q","Tag","IconRight","text","m","path"],"mappings":"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"}