@winspan/claude-forge 9.2.0 → 9.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/DEVELOPMENT.md +80 -19
  2. package/README.md +13 -6
  3. package/dist/catalogs/agents.json +19 -24
  4. package/dist/catalogs/skills.json +139 -27
  5. package/dist/claudemd/templates/swarm-protocol.md +1 -1
  6. package/dist/cli/commands/agent.d.ts +169 -0
  7. package/dist/cli/commands/agent.d.ts.map +1 -0
  8. package/dist/cli/commands/agent.js +690 -0
  9. package/dist/cli/commands/agent.js.map +1 -0
  10. package/dist/cli/commands/codegraph.d.ts +17 -0
  11. package/dist/cli/commands/codegraph.d.ts.map +1 -0
  12. package/dist/cli/commands/codegraph.js +263 -0
  13. package/dist/cli/commands/codegraph.js.map +1 -0
  14. package/dist/cli/commands/decisions.d.ts.map +1 -1
  15. package/dist/cli/commands/decisions.js +46 -9
  16. package/dist/cli/commands/decisions.js.map +1 -1
  17. package/dist/cli/commands/executions.d.ts.map +1 -1
  18. package/dist/cli/commands/executions.js +2 -1
  19. package/dist/cli/commands/executions.js.map +1 -1
  20. package/dist/cli/commands/insights-goal-check.d.ts +5 -1
  21. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -1
  22. package/dist/cli/commands/insights-goal-check.js +15 -15
  23. package/dist/cli/commands/insights-goal-check.js.map +1 -1
  24. package/dist/cli/commands/knowledge.d.ts +51 -0
  25. package/dist/cli/commands/knowledge.d.ts.map +1 -1
  26. package/dist/cli/commands/knowledge.js +202 -29
  27. package/dist/cli/commands/knowledge.js.map +1 -1
  28. package/dist/cli/commands/loop.d.ts +95 -0
  29. package/dist/cli/commands/loop.d.ts.map +1 -0
  30. package/dist/cli/commands/loop.js +408 -0
  31. package/dist/cli/commands/loop.js.map +1 -0
  32. package/dist/cli/commands/maintenance.d.ts +33 -0
  33. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  34. package/dist/cli/commands/maintenance.js +75 -0
  35. package/dist/cli/commands/maintenance.js.map +1 -0
  36. package/dist/cli/commands/mcp.d.ts +23 -0
  37. package/dist/cli/commands/mcp.d.ts.map +1 -1
  38. package/dist/cli/commands/mcp.js +82 -0
  39. package/dist/cli/commands/mcp.js.map +1 -1
  40. package/dist/cli/commands/skills.d.ts +131 -0
  41. package/dist/cli/commands/skills.d.ts.map +1 -1
  42. package/dist/cli/commands/skills.js +409 -9
  43. package/dist/cli/commands/skills.js.map +1 -1
  44. package/dist/cli/commands/stats.d.ts.map +1 -1
  45. package/dist/cli/commands/stats.js +9 -2
  46. package/dist/cli/commands/stats.js.map +1 -1
  47. package/dist/cli/index.js +8 -0
  48. package/dist/cli/index.js.map +1 -1
  49. package/dist/core/constants.d.ts +37 -0
  50. package/dist/core/constants.d.ts.map +1 -1
  51. package/dist/core/constants.js +43 -0
  52. package/dist/core/constants.js.map +1 -1
  53. package/dist/core/diagnostics/checks.d.ts.map +1 -1
  54. package/dist/core/diagnostics/checks.js +2 -1
  55. package/dist/core/diagnostics/checks.js.map +1 -1
  56. package/dist/core/diagnostics/daemon-status.d.ts +1 -1
  57. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -1
  58. package/dist/core/diagnostics/daemon-status.js +1 -1
  59. package/dist/core/diagnostics/daemon-status.js.map +1 -1
  60. package/dist/core/diagnostics/entropy-checks.d.ts +3 -2
  61. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -1
  62. package/dist/core/diagnostics/entropy-checks.js +10 -5
  63. package/dist/core/diagnostics/entropy-checks.js.map +1 -1
  64. package/dist/core/diagnostics/heartbeat-reader.d.ts +28 -0
  65. package/dist/core/diagnostics/heartbeat-reader.d.ts.map +1 -0
  66. package/dist/core/diagnostics/heartbeat-reader.js +50 -0
  67. package/dist/core/diagnostics/heartbeat-reader.js.map +1 -0
  68. package/dist/core/event-fields.d.ts +27 -0
  69. package/dist/core/event-fields.d.ts.map +1 -1
  70. package/dist/core/event-fields.js +43 -0
  71. package/dist/core/event-fields.js.map +1 -1
  72. package/dist/core/governance/global-inject.d.ts +34 -4
  73. package/dist/core/governance/global-inject.d.ts.map +1 -1
  74. package/dist/core/governance/global-inject.js +80 -25
  75. package/dist/core/governance/global-inject.js.map +1 -1
  76. package/dist/core/insights/agent-anchor-guard.d.ts +77 -0
  77. package/dist/core/insights/agent-anchor-guard.d.ts.map +1 -0
  78. package/dist/core/insights/agent-anchor-guard.js +119 -0
  79. package/dist/core/insights/agent-anchor-guard.js.map +1 -0
  80. package/dist/core/insights/agent-distill-context.d.ts +55 -0
  81. package/dist/core/insights/agent-distill-context.d.ts.map +1 -0
  82. package/dist/core/insights/agent-distill-context.js +146 -0
  83. package/dist/core/insights/agent-distill-context.js.map +1 -0
  84. package/dist/core/insights/agent-distill-spawn.d.ts +56 -0
  85. package/dist/core/insights/agent-distill-spawn.d.ts.map +1 -0
  86. package/dist/core/insights/agent-distill-spawn.js +179 -0
  87. package/dist/core/insights/agent-distill-spawn.js.map +1 -0
  88. package/dist/core/insights/agent-drift.d.ts +66 -0
  89. package/dist/core/insights/agent-drift.d.ts.map +1 -0
  90. package/dist/core/insights/agent-drift.js +109 -0
  91. package/dist/core/insights/agent-drift.js.map +1 -0
  92. package/dist/core/insights/agent-evolution-sources.d.ts +21 -0
  93. package/dist/core/insights/agent-evolution-sources.d.ts.map +1 -0
  94. package/dist/core/insights/agent-evolution-sources.js +36 -0
  95. package/dist/core/insights/agent-evolution-sources.js.map +1 -0
  96. package/dist/core/insights/agent-health.d.ts +142 -0
  97. package/dist/core/insights/agent-health.d.ts.map +1 -0
  98. package/dist/core/insights/agent-health.js +296 -0
  99. package/dist/core/insights/agent-health.js.map +1 -0
  100. package/dist/core/insights/agent-patch-apply.d.ts +45 -0
  101. package/dist/core/insights/agent-patch-apply.d.ts.map +1 -0
  102. package/dist/core/insights/agent-patch-apply.js +165 -0
  103. package/dist/core/insights/agent-patch-apply.js.map +1 -0
  104. package/dist/core/insights/agent-suggest.d.ts +128 -0
  105. package/dist/core/insights/agent-suggest.d.ts.map +1 -0
  106. package/dist/core/insights/agent-suggest.js +284 -0
  107. package/dist/core/insights/agent-suggest.js.map +1 -0
  108. package/dist/core/insights/coverage-tiers.d.ts +46 -0
  109. package/dist/core/insights/coverage-tiers.d.ts.map +1 -0
  110. package/dist/core/insights/coverage-tiers.js +95 -0
  111. package/dist/core/insights/coverage-tiers.js.map +1 -0
  112. package/dist/{daemon/services → core/insights}/experience-extractor.d.ts +0 -7
  113. package/dist/core/insights/experience-extractor.d.ts.map +1 -0
  114. package/dist/{daemon/services → core/insights}/experience-extractor.js +5 -9
  115. package/dist/core/insights/experience-extractor.js.map +1 -0
  116. package/dist/{daemon/services → core/insights}/violation-reporter.d.ts +20 -1
  117. package/dist/core/insights/violation-reporter.d.ts.map +1 -0
  118. package/dist/{daemon/services → core/insights}/violation-reporter.js +56 -4
  119. package/dist/core/insights/violation-reporter.js.map +1 -0
  120. package/dist/core/loop/loop-engine.d.ts +140 -0
  121. package/dist/core/loop/loop-engine.d.ts.map +1 -0
  122. package/dist/core/loop/loop-engine.js +266 -0
  123. package/dist/core/loop/loop-engine.js.map +1 -0
  124. package/dist/core/queue/index.d.ts.map +1 -1
  125. package/dist/core/queue/index.js +2 -1
  126. package/dist/core/queue/index.js.map +1 -1
  127. package/dist/core/storage/base.d.ts +159 -0
  128. package/dist/core/storage/base.d.ts.map +1 -1
  129. package/dist/core/storage/base.js +523 -0
  130. package/dist/core/storage/base.js.map +1 -1
  131. package/dist/core/storage/codegraph-types.d.ts +79 -0
  132. package/dist/core/storage/codegraph-types.d.ts.map +1 -0
  133. package/dist/core/storage/codegraph-types.js +14 -0
  134. package/dist/core/storage/codegraph-types.js.map +1 -0
  135. package/dist/core/storage/codegraph.d.ts +186 -0
  136. package/dist/core/storage/codegraph.d.ts.map +1 -0
  137. package/dist/core/storage/codegraph.js +452 -0
  138. package/dist/core/storage/codegraph.js.map +1 -0
  139. package/dist/core/storage/decisions.d.ts +30 -5
  140. package/dist/core/storage/decisions.d.ts.map +1 -1
  141. package/dist/core/storage/decisions.js +45 -13
  142. package/dist/core/storage/decisions.js.map +1 -1
  143. package/dist/core/storage/events.d.ts +127 -0
  144. package/dist/core/storage/events.d.ts.map +1 -1
  145. package/dist/core/storage/events.js +318 -3
  146. package/dist/core/storage/events.js.map +1 -1
  147. package/dist/core/storage/feedback.d.ts +3 -23
  148. package/dist/core/storage/feedback.d.ts.map +1 -1
  149. package/dist/core/storage/feedback.js +37 -38
  150. package/dist/core/storage/feedback.js.map +1 -1
  151. package/dist/core/storage/injections.d.ts +40 -0
  152. package/dist/core/storage/injections.d.ts.map +1 -1
  153. package/dist/core/storage/injections.js +69 -0
  154. package/dist/core/storage/injections.js.map +1 -1
  155. package/dist/core/storage/knowledge.d.ts +226 -0
  156. package/dist/core/storage/knowledge.d.ts.map +1 -1
  157. package/dist/core/storage/knowledge.js +391 -4
  158. package/dist/core/storage/knowledge.js.map +1 -1
  159. package/dist/core/storage/pipeline-rollup.d.ts +1 -7
  160. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -1
  161. package/dist/core/storage/pipeline-rollup.js +18 -57
  162. package/dist/core/storage/pipeline-rollup.js.map +1 -1
  163. package/dist/core/storage/routing.d.ts +34 -0
  164. package/dist/core/storage/routing.d.ts.map +1 -1
  165. package/dist/core/storage/routing.js +92 -2
  166. package/dist/core/storage/routing.js.map +1 -1
  167. package/dist/core/storage/rows.d.ts +5 -25
  168. package/dist/core/storage/rows.d.ts.map +1 -1
  169. package/dist/core/storage/schema.sql +92 -27
  170. package/dist/core/storage/sessions.d.ts.map +1 -1
  171. package/dist/core/storage/sessions.js +2 -1
  172. package/dist/core/storage/sessions.js.map +1 -1
  173. package/dist/core/storage/skills.d.ts +159 -0
  174. package/dist/core/storage/skills.d.ts.map +1 -1
  175. package/dist/core/storage/skills.js +350 -4
  176. package/dist/core/storage/skills.js.map +1 -1
  177. package/dist/core/storage/sqlite.d.ts +81 -25
  178. package/dist/core/storage/sqlite.d.ts.map +1 -1
  179. package/dist/core/storage/sqlite.js +143 -45
  180. package/dist/core/storage/sqlite.js.map +1 -1
  181. package/dist/core/storage/tasks.d.ts +270 -0
  182. package/dist/core/storage/tasks.d.ts.map +1 -1
  183. package/dist/core/storage/tasks.js +495 -16
  184. package/dist/core/storage/tasks.js.map +1 -1
  185. package/dist/core/storage/tool-intercepts.d.ts +1 -1
  186. package/dist/core/storage/tool-intercepts.js +1 -1
  187. package/dist/core/types.d.ts +26 -3
  188. package/dist/core/types.d.ts.map +1 -1
  189. package/dist/core/types.js +1 -3
  190. package/dist/core/types.js.map +1 -1
  191. package/dist/core/utils/binary-paths.d.ts +32 -0
  192. package/dist/core/utils/binary-paths.d.ts.map +1 -1
  193. package/dist/core/utils/binary-paths.js +52 -0
  194. package/dist/core/utils/binary-paths.js.map +1 -1
  195. package/dist/core/utils/claude-cli-resolver.d.ts.map +1 -0
  196. package/dist/{skills/distill → core/utils}/claude-cli-resolver.js +1 -1
  197. package/dist/core/utils/claude-cli-resolver.js.map +1 -0
  198. package/dist/core/utils/claude-cli-spawn.d.ts +1 -1
  199. package/dist/core/utils/claude-cli-spawn.js +2 -2
  200. package/dist/core/utils/claude-cli-spawn.js.map +1 -1
  201. package/dist/core/utils/noise-prompt.d.ts +1 -1
  202. package/dist/core/utils/noise-prompt.js +1 -1
  203. package/dist/core/utils/time.d.ts +26 -0
  204. package/dist/core/utils/time.d.ts.map +1 -1
  205. package/dist/core/utils/time.js +33 -0
  206. package/dist/core/utils/time.js.map +1 -1
  207. package/dist/daemon/config-store.d.ts.map +1 -1
  208. package/dist/daemon/config-store.js +14 -5
  209. package/dist/daemon/config-store.js.map +1 -1
  210. package/dist/daemon/event-parser.d.ts.map +1 -1
  211. package/dist/daemon/event-parser.js +5 -0
  212. package/dist/daemon/event-parser.js.map +1 -1
  213. package/dist/daemon/handlers/post-tool-use.d.ts +24 -16
  214. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  215. package/dist/daemon/handlers/post-tool-use.js +76 -116
  216. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  217. package/dist/daemon/handlers/pre-tool-use.d.ts +35 -10
  218. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -1
  219. package/dist/daemon/handlers/pre-tool-use.js +71 -38
  220. package/dist/daemon/handlers/pre-tool-use.js.map +1 -1
  221. package/dist/daemon/handlers/stop.d.ts +20 -0
  222. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  223. package/dist/daemon/handlers/stop.js +96 -8
  224. package/dist/daemon/handlers/stop.js.map +1 -1
  225. package/dist/daemon/handlers/user-prompt.d.ts +16 -1
  226. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  227. package/dist/daemon/handlers/user-prompt.js +97 -56
  228. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  229. package/dist/daemon/handlers/violation-content-backfill.d.ts +76 -0
  230. package/dist/daemon/handlers/violation-content-backfill.d.ts.map +1 -0
  231. package/dist/daemon/handlers/violation-content-backfill.js +167 -0
  232. package/dist/daemon/handlers/violation-content-backfill.js.map +1 -0
  233. package/dist/daemon/index.d.ts +19 -0
  234. package/dist/daemon/index.d.ts.map +1 -1
  235. package/dist/daemon/index.js +125 -200
  236. package/dist/daemon/index.js.map +1 -1
  237. package/dist/daemon/rules/defaults.d.ts.map +1 -1
  238. package/dist/daemon/rules/defaults.js +151 -64
  239. package/dist/daemon/rules/defaults.js.map +1 -1
  240. package/dist/daemon/rules/types.d.ts +28 -22
  241. package/dist/daemon/rules/types.d.ts.map +1 -1
  242. package/dist/daemon/rules/workflow-defaults.js +9 -9
  243. package/dist/daemon/rules/workflow-defaults.js.map +1 -1
  244. package/dist/daemon/services/codegraph-sync.d.ts +94 -0
  245. package/dist/daemon/services/codegraph-sync.d.ts.map +1 -0
  246. package/dist/daemon/services/codegraph-sync.js +159 -0
  247. package/dist/daemon/services/codegraph-sync.js.map +1 -0
  248. package/dist/daemon/services/decision-hint.d.ts +47 -10
  249. package/dist/daemon/services/decision-hint.d.ts.map +1 -1
  250. package/dist/daemon/services/decision-hint.js +99 -24
  251. package/dist/daemon/services/decision-hint.js.map +1 -1
  252. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -1
  253. package/dist/daemon/services/event-ttl-sweep.js +3 -2
  254. package/dist/daemon/services/event-ttl-sweep.js.map +1 -1
  255. package/dist/daemon/services/feedback-aggregator.d.ts +14 -26
  256. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -1
  257. package/dist/daemon/services/feedback-aggregator.js +23 -63
  258. package/dist/daemon/services/feedback-aggregator.js.map +1 -1
  259. package/dist/daemon/services/heartbeat-writer.d.ts +6 -15
  260. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -1
  261. package/dist/daemon/services/heartbeat-writer.js +7 -36
  262. package/dist/daemon/services/heartbeat-writer.js.map +1 -1
  263. package/dist/daemon/services/kb-injector.d.ts +1 -1
  264. package/dist/daemon/services/kb-injector.d.ts.map +1 -1
  265. package/dist/daemon/services/kb-injector.js +10 -2
  266. package/dist/daemon/services/kb-injector.js.map +1 -1
  267. package/dist/daemon/services/kb-rebuild-scheduler.d.ts +95 -0
  268. package/dist/daemon/services/kb-rebuild-scheduler.d.ts.map +1 -0
  269. package/dist/daemon/services/kb-rebuild-scheduler.js +149 -0
  270. package/dist/daemon/services/kb-rebuild-scheduler.js.map +1 -0
  271. package/dist/daemon/services/loop-hint.d.ts +139 -0
  272. package/dist/daemon/services/loop-hint.d.ts.map +1 -0
  273. package/dist/daemon/services/loop-hint.js +272 -0
  274. package/dist/daemon/services/loop-hint.js.map +1 -0
  275. package/dist/daemon/services/outcome-classification-service.js +1 -1
  276. package/dist/daemon/services/outcome-classification-service.js.map +1 -1
  277. package/dist/daemon/services/task-segmenter.d.ts +11 -0
  278. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  279. package/dist/daemon/services/task-segmenter.js +48 -2
  280. package/dist/daemon/services/task-segmenter.js.map +1 -1
  281. package/dist/daemon/startup/maintenance-schedulers.d.ts +68 -0
  282. package/dist/daemon/startup/maintenance-schedulers.d.ts.map +1 -0
  283. package/dist/daemon/startup/maintenance-schedulers.js +294 -0
  284. package/dist/daemon/startup/maintenance-schedulers.js.map +1 -0
  285. package/dist/daemon/templates/agents/agent-retro-distiller.md +106 -0
  286. package/dist/daemon/templates/agents/claudemd-writer.md +1 -0
  287. package/dist/daemon/templates/agents/coder.md +165 -8
  288. package/dist/daemon/templates/agents/decision-maker.md +107 -21
  289. package/dist/daemon/templates/agents/doc-reviewer.md +4 -1
  290. package/dist/daemon/templates/agents/harness-debug-full.md +85 -3
  291. package/dist/daemon/templates/agents/knowledge-builder.md +1 -0
  292. package/dist/daemon/templates/agents/patch-applier.md +1 -0
  293. package/dist/daemon/templates/agents/planner.md +55 -3
  294. package/dist/daemon/templates/agents/safety-net-implementer.md +278 -0
  295. package/dist/daemon/templates/agents/skill-distiller.md +1 -0
  296. package/dist/daemon/templates/agents/task-boundary-classifier.md +1 -0
  297. package/dist/daemon/templates/agents/verify-agent.md +128 -5
  298. package/dist/hooks/stop.sh +7 -1
  299. package/dist/knowledge/builder.js +36 -7
  300. package/dist/knowledge/builder.js.map +1 -1
  301. package/dist/knowledge/constants.d.ts +10 -5
  302. package/dist/knowledge/constants.d.ts.map +1 -1
  303. package/dist/knowledge/constants.js +10 -5
  304. package/dist/knowledge/constants.js.map +1 -1
  305. package/dist/knowledge/graph/edge-extractor.d.ts +45 -0
  306. package/dist/knowledge/graph/edge-extractor.d.ts.map +1 -0
  307. package/dist/knowledge/graph/edge-extractor.js +242 -0
  308. package/dist/knowledge/graph/edge-extractor.js.map +1 -0
  309. package/dist/knowledge/graph/impact.d.ts +73 -0
  310. package/dist/knowledge/graph/impact.d.ts.map +1 -0
  311. package/dist/knowledge/graph/impact.js +94 -0
  312. package/dist/knowledge/graph/impact.js.map +1 -0
  313. package/dist/knowledge/graph/types.d.ts +22 -0
  314. package/dist/knowledge/graph/types.d.ts.map +1 -0
  315. package/dist/knowledge/graph/types.js +13 -0
  316. package/dist/knowledge/graph/types.js.map +1 -0
  317. package/dist/knowledge/prompt.d.ts +9 -0
  318. package/dist/knowledge/prompt.d.ts.map +1 -1
  319. package/dist/knowledge/prompt.js +17 -5
  320. package/dist/knowledge/prompt.js.map +1 -1
  321. package/dist/knowledge/query.d.ts +13 -0
  322. package/dist/knowledge/query.d.ts.map +1 -1
  323. package/dist/knowledge/query.js +107 -10
  324. package/dist/knowledge/query.js.map +1 -1
  325. package/dist/knowledge/repo-map.d.ts +11 -5
  326. package/dist/knowledge/repo-map.d.ts.map +1 -1
  327. package/dist/knowledge/repo-map.js +42 -3
  328. package/dist/knowledge/repo-map.js.map +1 -1
  329. package/dist/knowledge/validator.d.ts.map +1 -1
  330. package/dist/knowledge/validator.js +69 -2
  331. package/dist/knowledge/validator.js.map +1 -1
  332. package/dist/mcp/server.d.ts +64 -8
  333. package/dist/mcp/server.d.ts.map +1 -1
  334. package/dist/mcp/server.js +233 -18
  335. package/dist/mcp/server.js.map +1 -1
  336. package/dist/skills/distill/distiller.js +1 -1
  337. package/dist/skills/distill/distiller.js.map +1 -1
  338. package/dist/skills/distilled/distilled-api-design.md +4 -0
  339. package/dist/skills/distilled/distilled-brainstorming.md +79 -0
  340. package/dist/skills/distilled/distilled-brand-guidelines.md +86 -0
  341. package/dist/skills/distilled/distilled-canvas-design.md +128 -0
  342. package/dist/skills/distilled/distilled-claude-api.md +185 -0
  343. package/dist/skills/distilled/distilled-creator.md +5 -2
  344. package/dist/skills/distilled/distilled-dispatching-parallel-agents.md +136 -0
  345. package/dist/skills/distilled/distilled-doc-coauthoring.md +144 -0
  346. package/dist/skills/distilled/distilled-docx.md +231 -0
  347. package/dist/skills/distilled/distilled-executing-plans.md +85 -50
  348. package/dist/skills/distilled/distilled-finishing-a-development-branch.md +213 -0
  349. package/dist/skills/distilled/distilled-frontend-design.md +118 -0
  350. package/dist/skills/distilled/distilled-harness-engineering.md +1 -1
  351. package/dist/skills/distilled/distilled-receiving-code-review.md +185 -0
  352. package/dist/skills/distilled/distilled-subagent-driven-development.md +124 -0
  353. package/dist/skills/distilled/distilled-systematic-debugging.md +108 -260
  354. package/dist/skills/distilled/distilled-test-driven-development.md +432 -0
  355. package/dist/skills/distilled/distilled-using-superpowers.md +134 -0
  356. package/dist/skills/distilled/distilled-verification-before-completion.md +88 -78
  357. package/dist/skills/distilled/distilled-writing-skills.md +175 -0
  358. package/dist/skills/registry.d.ts +10 -50
  359. package/dist/skills/registry.d.ts.map +1 -1
  360. package/dist/skills/registry.js +7 -118
  361. package/dist/skills/registry.js.map +1 -1
  362. package/dist/skills/tools/pipeline-suggest.js +2 -2
  363. package/dist/skills/tools/pipeline-suggest.js.map +1 -1
  364. package/dist/skills/tools/skill-invoke.d.ts +2 -1
  365. package/dist/skills/tools/skill-invoke.d.ts.map +1 -1
  366. package/dist/skills/tools/skill-invoke.js +3 -1
  367. package/dist/skills/tools/skill-invoke.js.map +1 -1
  368. package/dist/web/analytics/anti-pattern-detector.d.ts.map +1 -1
  369. package/dist/web/analytics/anti-pattern-detector.js +6 -1
  370. package/dist/web/analytics/anti-pattern-detector.js.map +1 -1
  371. package/dist/web/analytics/drift-detector.d.ts +6 -0
  372. package/dist/web/analytics/drift-detector.d.ts.map +1 -1
  373. package/dist/web/analytics/drift-detector.js +15 -8
  374. package/dist/web/analytics/drift-detector.js.map +1 -1
  375. package/dist/web/analytics/weekly-report.d.ts +13 -0
  376. package/dist/web/analytics/weekly-report.d.ts.map +1 -1
  377. package/dist/web/analytics/weekly-report.js +17 -3
  378. package/dist/web/analytics/weekly-report.js.map +1 -1
  379. package/dist/web/routes/_helpers.d.ts +31 -0
  380. package/dist/web/routes/_helpers.d.ts.map +1 -1
  381. package/dist/web/routes/_helpers.js +33 -0
  382. package/dist/web/routes/_helpers.js.map +1 -1
  383. package/dist/web/routes/agent-distill.d.ts +49 -0
  384. package/dist/web/routes/agent-distill.d.ts.map +1 -0
  385. package/dist/web/routes/agent-distill.js +526 -0
  386. package/dist/web/routes/agent-distill.js.map +1 -0
  387. package/dist/web/routes/config.d.ts +56 -0
  388. package/dist/web/routes/config.d.ts.map +1 -0
  389. package/dist/web/routes/config.js +243 -0
  390. package/dist/web/routes/config.js.map +1 -0
  391. package/dist/web/routes/decisions.js +1 -1
  392. package/dist/web/routes/decisions.js.map +1 -1
  393. package/dist/web/routes/error-handler.d.ts +0 -4
  394. package/dist/web/routes/error-handler.d.ts.map +1 -1
  395. package/dist/web/routes/error-handler.js +0 -8
  396. package/dist/web/routes/error-handler.js.map +1 -1
  397. package/dist/web/routes/events.d.ts.map +1 -1
  398. package/dist/web/routes/events.js +2 -1
  399. package/dist/web/routes/events.js.map +1 -1
  400. package/dist/web/routes/insights.d.ts.map +1 -1
  401. package/dist/web/routes/insights.js +0 -0
  402. package/dist/web/routes/insights.js.map +1 -1
  403. package/dist/web/routes/knowledge.d.ts +43 -2
  404. package/dist/web/routes/knowledge.d.ts.map +1 -1
  405. package/dist/web/routes/knowledge.js +117 -6
  406. package/dist/web/routes/knowledge.js.map +1 -1
  407. package/dist/web/routes/pipeline.d.ts +0 -9
  408. package/dist/web/routes/pipeline.d.ts.map +1 -1
  409. package/dist/web/routes/pipeline.js +0 -4
  410. package/dist/web/routes/pipeline.js.map +1 -1
  411. package/dist/web/routes/rules.d.ts.map +1 -1
  412. package/dist/web/routes/rules.js +20 -6
  413. package/dist/web/routes/rules.js.map +1 -1
  414. package/dist/web/routes/sessions.d.ts.map +1 -1
  415. package/dist/web/routes/sessions.js +8 -7
  416. package/dist/web/routes/sessions.js.map +1 -1
  417. package/dist/web/routes/skill-stats.d.ts.map +1 -1
  418. package/dist/web/routes/skill-stats.js +153 -16
  419. package/dist/web/routes/skill-stats.js.map +1 -1
  420. package/dist/web/routes/skills-distill.js +1 -1
  421. package/dist/web/routes/skills-distill.js.map +1 -1
  422. package/dist/web/routes/stats.d.ts.map +1 -1
  423. package/dist/web/routes/stats.js +2 -1
  424. package/dist/web/routes/stats.js.map +1 -1
  425. package/dist/web/routes/task-timeline.d.ts +95 -19
  426. package/dist/web/routes/task-timeline.d.ts.map +1 -1
  427. package/dist/web/routes/task-timeline.js +344 -88
  428. package/dist/web/routes/task-timeline.js.map +1 -1
  429. package/dist/web/routes/tasks.d.ts.map +1 -1
  430. package/dist/web/routes/tasks.js +52 -30
  431. package/dist/web/routes/tasks.js.map +1 -1
  432. package/dist/web/routes/violations.d.ts +1 -1
  433. package/dist/web/routes/violations.d.ts.map +1 -1
  434. package/dist/web/routes/violations.js +3 -2
  435. package/dist/web/routes/violations.js.map +1 -1
  436. package/dist/web/server.d.ts.map +1 -1
  437. package/dist/web/server.js +20 -0
  438. package/dist/web/server.js.map +1 -1
  439. package/dist/web/services/agent-distill-manager.d.ts +122 -0
  440. package/dist/web/services/agent-distill-manager.d.ts.map +1 -0
  441. package/dist/web/services/agent-distill-manager.js +397 -0
  442. package/dist/web/services/agent-distill-manager.js.map +1 -0
  443. package/dist/web/services/distill-manager.d.ts +47 -0
  444. package/dist/web/services/distill-manager.d.ts.map +1 -1
  445. package/dist/web/services/distill-manager.js +103 -0
  446. package/dist/web/services/distill-manager.js.map +1 -1
  447. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js +2 -0
  448. package/dist/web/static/assets/AgentDetailPage-DlUeA1sX.js.map +1 -0
  449. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js +3 -0
  450. package/dist/web/static/assets/AgentDistillRunPage-Cybo4bii.js.map +1 -0
  451. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js +2 -0
  452. package/dist/web/static/assets/AgentsPage-Qd9FExLG.js.map +1 -0
  453. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js +2 -0
  454. package/dist/web/static/assets/DaemonHealthPage-DTSVqtrI.js.map +1 -0
  455. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js +2 -0
  456. package/dist/web/static/assets/DecisionDetailPage-b4BA8dhc.js.map +1 -0
  457. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js +2 -0
  458. package/dist/web/static/assets/DecisionsPage-a3NRo_T7.js.map +1 -0
  459. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js +2 -0
  460. package/dist/web/static/assets/DiagnosticsPage-DIVdiIQG.js.map +1 -0
  461. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js +4 -0
  462. package/dist/web/static/assets/DistillDetailPage-U6a3l2iP.js.map +1 -0
  463. package/dist/web/static/assets/DistillPage-O7BHtRN8.js +2 -0
  464. package/dist/web/static/assets/DistillPage-O7BHtRN8.js.map +1 -0
  465. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js +2 -0
  466. package/dist/web/static/assets/DistillRunPage-D1JuRWWr.js.map +1 -0
  467. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js +2 -0
  468. package/dist/web/static/assets/GlobalScopeHint-Q3wTJx3F.js.map +1 -0
  469. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js +2 -0
  470. package/dist/web/static/assets/IssueDetailPage-BDfrtk2C.js.map +1 -0
  471. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js +2 -0
  472. package/dist/web/static/assets/IssuesPage-SKmhlCrw.js.map +1 -0
  473. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js +2 -0
  474. package/dist/web/static/assets/KbDetailPage-Yna86Na8.js.map +1 -0
  475. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js +2 -0
  476. package/dist/web/static/assets/KbHitsPage-Cljl7H9p.js.map +1 -0
  477. package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js → MarkdownRenderer-DlDQNihj.js} +2 -2
  478. package/dist/web/static/assets/{MarkdownRenderer-DZmTl-8J.js.map → MarkdownRenderer-DlDQNihj.js.map} +1 -1
  479. package/dist/web/static/assets/NotFound-LMzbP51V.js +2 -0
  480. package/dist/web/static/assets/{NotFound-BQPh0vaF.js.map → NotFound-LMzbP51V.js.map} +1 -1
  481. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js +2 -0
  482. package/dist/web/static/assets/SettingsPage-DzoK4PKg.js.map +1 -0
  483. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js +2 -0
  484. package/dist/web/static/assets/SkillDetailPage-BuBJJ_NX.js.map +1 -0
  485. package/dist/web/static/assets/SkillsPage-aojkJpBc.js +2 -0
  486. package/dist/web/static/assets/SkillsPage-aojkJpBc.js.map +1 -0
  487. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js +4 -0
  488. package/dist/web/static/assets/TaskDetailPage-1ckxnGhw.js.map +1 -0
  489. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js +6 -0
  490. package/dist/web/static/assets/TasksHubPage-C2PLh3eg.js.map +1 -0
  491. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js +2 -0
  492. package/dist/web/static/assets/WorkplacePage-DHrp5VxS.js.map +1 -0
  493. package/dist/web/static/assets/arco-DV6xCLhr.js +14 -0
  494. package/dist/web/static/assets/arco-DV6xCLhr.js.map +1 -0
  495. package/dist/web/static/assets/charts-BSV4cyC4.js +37 -0
  496. package/dist/web/static/assets/charts-BSV4cyC4.js.map +1 -0
  497. package/dist/web/static/assets/{index-7bl3kbcx.css → index-B_v_MKlb.css} +1 -1
  498. package/dist/web/static/assets/index-DileOOE4.js +4 -0
  499. package/dist/web/static/assets/index-DileOOE4.js.map +1 -0
  500. package/dist/web/static/assets/markdown-CA7ePUts.js +30 -0
  501. package/dist/web/static/assets/markdown-CA7ePUts.js.map +1 -0
  502. package/dist/web/static/assets/{outcome-DUn1NjlC.js → outcome-BKGy9azt.js} +2 -2
  503. package/dist/web/static/assets/{outcome-DUn1NjlC.js.map → outcome-BKGy9azt.js.map} +1 -1
  504. package/dist/web/static/assets/{query-S6X1S7K9.js → query-CgCOpYWf.js} +2 -2
  505. package/dist/web/static/assets/{query-S6X1S7K9.js.map → query-CgCOpYWf.js.map} +1 -1
  506. package/dist/web/static/assets/{react-router-JVUrkhdd.js → react-router-Cxmg8RuL.js} +3 -3
  507. package/dist/web/static/assets/{react-router-JVUrkhdd.js.map → react-router-Cxmg8RuL.js.map} +1 -1
  508. package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js → syntax-highlighter-BDYycNja.js} +3 -3
  509. package/dist/web/static/assets/{syntax-highlighter-BkZfCDsz.js.map → syntax-highlighter-BDYycNja.js.map} +1 -1
  510. package/dist/web/static/assets/task-title-BhOcemuR.js +2 -0
  511. package/dist/web/static/assets/task-title-BhOcemuR.js.map +1 -0
  512. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js +2 -0
  513. package/dist/web/static/assets/useAgentStats-B-uTgqBd.js.map +1 -0
  514. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js +2 -0
  515. package/dist/web/static/assets/useDecisions-D-G2Ft5T.js.map +1 -0
  516. package/dist/web/static/assets/useDistill-21dZkXlT.js +3 -0
  517. package/dist/web/static/assets/useDistill-21dZkXlT.js.map +1 -0
  518. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js +2 -0
  519. package/dist/web/static/assets/useEffectiveProject-DQiyX54y.js.map +1 -0
  520. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js +2 -0
  521. package/dist/web/static/assets/useIssuesFeed-CFiyQkAL.js.map +1 -0
  522. package/dist/web/static/assets/useKbHits-xKXWgqh9.js +2 -0
  523. package/dist/web/static/assets/useKbHits-xKXWgqh9.js.map +1 -0
  524. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js +2 -0
  525. package/dist/web/static/assets/useSkillStats-B5hbIwdf.js.map +1 -0
  526. package/dist/web/static/assets/vendor-DS-q4Eyc.js +36 -0
  527. package/dist/web/static/assets/vendor-DS-q4Eyc.js.map +1 -0
  528. package/dist/web/static/index.html +6 -6
  529. package/package.json +5 -3
  530. package/dist/core/storage/workflow-recommendations.d.ts +0 -124
  531. package/dist/core/storage/workflow-recommendations.d.ts.map +0 -1
  532. package/dist/core/storage/workflow-recommendations.js +0 -274
  533. package/dist/core/storage/workflow-recommendations.js.map +0 -1
  534. package/dist/daemon/services/experience-extractor.d.ts.map +0 -1
  535. package/dist/daemon/services/experience-extractor.js.map +0 -1
  536. package/dist/daemon/services/violation-reporter.d.ts.map +0 -1
  537. package/dist/daemon/services/violation-reporter.js.map +0 -1
  538. package/dist/daemon/templates/agents/harness-hotfix.md +0 -99
  539. package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +0 -104
  540. package/dist/daemon/templates/agents/refactor-specialist.md +0 -98
  541. package/dist/skills/distill/claude-cli-resolver.d.ts.map +0 -1
  542. package/dist/skills/distill/claude-cli-resolver.js.map +0 -1
  543. package/dist/skills/distilled/distilled-defi-amm-security.md +0 -293
  544. package/dist/skills/keyword-score.d.ts +0 -29
  545. package/dist/skills/keyword-score.d.ts.map +0 -1
  546. package/dist/skills/keyword-score.js +0 -54
  547. package/dist/skills/keyword-score.js.map +0 -1
  548. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +0 -2
  549. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +0 -1
  550. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +0 -2
  551. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +0 -1
  552. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +0 -3
  553. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +0 -1
  554. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +0 -2
  555. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +0 -1
  556. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +0 -2
  557. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +0 -1
  558. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +0 -2
  559. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +0 -1
  560. package/dist/web/static/assets/DriftTab-DqpepOhI.js +0 -2
  561. package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +0 -1
  562. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +0 -3
  563. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +0 -1
  564. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +0 -2
  565. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +0 -1
  566. package/dist/web/static/assets/NotFound-BQPh0vaF.js +0 -2
  567. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +0 -2
  568. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +0 -1
  569. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +0 -2
  570. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +0 -1
  571. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +0 -2
  572. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +0 -1
  573. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +0 -2
  574. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +0 -1
  575. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +0 -2
  576. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +0 -1
  577. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +0 -6
  578. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +0 -1
  579. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +0 -3
  580. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +0 -1
  581. package/dist/web/static/assets/arco-Bhi3a6Qp.js +0 -14
  582. package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +0 -1
  583. package/dist/web/static/assets/charts-BuHQWDbQ.js +0 -37
  584. package/dist/web/static/assets/charts-BuHQWDbQ.js.map +0 -1
  585. package/dist/web/static/assets/index-BIYnq1Dx.js +0 -4
  586. package/dist/web/static/assets/index-BIYnq1Dx.js.map +0 -1
  587. package/dist/web/static/assets/useTabsParam-k8qte_0C.js +0 -2
  588. package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +0 -1
  589. package/dist/web/static/assets/vendor-DWgdB1eY.js +0 -65
  590. package/dist/web/static/assets/vendor-DWgdB1eY.js.map +0 -1
  591. /package/dist/{skills/distill → core/utils}/claude-cli-resolver.d.ts +0 -0
@@ -0,0 +1,266 @@
1
+ /**
2
+ * loop-engine.ts — Goal-convergence orchestration state machine.
3
+ *
4
+ * Spec: docs/design/2026-06-11/0943-loop-goal-convergence-spec.md (Option A)
5
+ * Decision: 1f9e71be
6
+ *
7
+ * CLI-RESIDENT, NEVER daemon. Each iteration:
8
+ * spawn coder (implement) → spawn verify-agent → parse `## Verdict:` →
9
+ * PASS/SKIP = terminate(success) · FAIL = iterate · BLOCKED/unparseable =
10
+ * terminate(blocked, stop-safe).
11
+ *
12
+ * The loop is only safe unattended because every guardrail lands here:
13
+ * - max-iterations hard cap (+ a ceiling on explicit overrides)
14
+ * - cumulative token budget (pre-emptive stop, conservative estimate)
15
+ * - verify-gate (only PASS/SKIP advances success)
16
+ * - irreversible-op gate (NEEDS-IRREVERSIBLE sentinel + git-HEAD-moved backstop)
17
+ * - no-progress / oscillation detector (identical diff hash repeated)
18
+ *
19
+ * `runLoop(cfg, deps)` takes a DEPENDENCY-INJECTION seam (`deps`): in production
20
+ * `deps.spawnAgent` wraps `spawnClaudeCli` and the git helpers shell out; in
21
+ * tests they are stubs returning canned verify reports. This seam is what makes
22
+ * the engine testable WITHOUT spawning real `claude` — mandatory, load-bearing
23
+ * for coverage in the 38%-line `src/cli` host area.
24
+ */
25
+ import { LOOP } from '../constants.js';
26
+ export const EXIT_CODES = {
27
+ converged: 0,
28
+ 'max-iter-exhausted': 2,
29
+ stalled: 3,
30
+ 'budget-exhausted': 4,
31
+ 'irreversible-blocked': 5,
32
+ 'verify-blocked': 6,
33
+ };
34
+ // ── Pure functions (unit-testable, no I/O) ──────────────────────────────────
35
+ /**
36
+ * Parse the verify-agent's `## Verdict: X` line.
37
+ * Case-insensitive, first match wins. Returns `null` if absent — the caller
38
+ * MUST treat null as BLOCKED ("FAIL when in doubt"), never as PASS.
39
+ */
40
+ export function parseVerifyVerdict(text) {
41
+ if (!text)
42
+ return null;
43
+ // Match `## Verdict: PASS` (markdown heading) or a looser `Verdict: PASS`.
44
+ const re = /^\s*#{0,6}\s*Verdict\s*:\s*(PASS|FAIL|BLOCKED|SKIP)\b/im;
45
+ const m = re.exec(text);
46
+ if (!m)
47
+ return null;
48
+ return m[1].toUpperCase();
49
+ }
50
+ const IRREVERSIBLE_SENTINEL = /NEEDS-IRREVERSIBLE\s*:\s*(.+)/i;
51
+ /**
52
+ * Detect whether an iteration attempted or needs an irreversible op.
53
+ * Two signals (either fires the gate):
54
+ * 1. coder output contains the `NEEDS-IRREVERSIBLE: <desc>` sentinel.
55
+ * 2. git HEAD moved (a commit happened) between before/after — backstop for
56
+ * a coder that ignored the directive.
57
+ */
58
+ export function detectIrreversible(coderOutput, gitHeadBefore, gitHeadAfter) {
59
+ const m = IRREVERSIBLE_SENTINEL.exec(coderOutput ?? '');
60
+ if (m)
61
+ return { fired: true, reason: `sentinel: ${m[1].trim()}` };
62
+ if (gitHeadBefore && gitHeadAfter && gitHeadBefore !== gitHeadAfter) {
63
+ return { fired: true, reason: `git HEAD moved ${gitHeadBefore.slice(0, 8)}→${gitHeadAfter.slice(0, 8)} (commit inside loop)` };
64
+ }
65
+ return { fired: false };
66
+ }
67
+ /**
68
+ * Estimate token cost from a spawn. Prefers a reported usage number; falls
69
+ * back to a coarse char/4 estimate over prompt+output. Conservative by design:
70
+ * the budget gate stops BEFORE exceeding, so over-estimating is the safe error.
71
+ */
72
+ export function estimateTokens(reportedTokens, promptText, outputText) {
73
+ if (typeof reportedTokens === 'number' && reportedTokens > 0)
74
+ return reportedTokens;
75
+ return Math.ceil(((promptText?.length ?? 0) + (outputText?.length ?? 0)) / 4);
76
+ }
77
+ /** Build the coder prompt, injecting the goal, the last verify report (if any), and the irreversible directive. */
78
+ export function buildCoderPrompt(goal, lastVerifyReport) {
79
+ const lines = [];
80
+ lines.push(`Goal (drive toward convergence): ${goal}`);
81
+ lines.push('');
82
+ if (lastVerifyReport) {
83
+ lines.push('The previous verify-agent run returned FAIL. Its report follows — fix exactly what it flagged:');
84
+ lines.push('--- verify report ---');
85
+ lines.push(lastVerifyReport.trim());
86
+ lines.push('--- end verify report ---');
87
+ lines.push('');
88
+ }
89
+ lines.push('IMPORTANT — irreversible-op gate: Do NOT run irreversible operations ' +
90
+ '(git commit, git push, schema migration, network send, destructive rm -rf, ' +
91
+ 'package publish). If the task genuinely needs one, STOP and report a single line ' +
92
+ '`NEEDS-IRREVERSIBLE: <short description>` instead of performing it. Leave changes ' +
93
+ 'in the working tree only.');
94
+ return lines.join('\n');
95
+ }
96
+ /** Build the verify-agent prompt for the current goal. */
97
+ export function buildVerifyPrompt(goal) {
98
+ return [
99
+ `Verify whether this goal is met by the current working tree: ${goal}`,
100
+ '',
101
+ 'Run the relevant tests/build and emit your standard structured report ending in a ' +
102
+ '`## Verdict: PASS|FAIL|BLOCKED|SKIP` line. PASS = goal met; FAIL = not yet met ' +
103
+ '(describe what to fix); BLOCKED = cannot measure; SKIP = doc-only/non-runtime change.',
104
+ ].join('\n');
105
+ }
106
+ /** Map a terminal verdict + exit reason to a decisions outcome value. */
107
+ export function verdictToOutcome(reason) {
108
+ switch (reason) {
109
+ case 'converged':
110
+ return 'success';
111
+ case 'max-iter-exhausted':
112
+ return 'failed';
113
+ case 'stalled':
114
+ case 'irreversible-blocked':
115
+ case 'verify-blocked':
116
+ case 'budget-exhausted':
117
+ return 'partial';
118
+ }
119
+ }
120
+ // ── Orchestrator ────────────────────────────────────────────────────────────
121
+ /** Clamp the requested iteration cap to the hard ceiling. */
122
+ export function clampMaxIterations(requested) {
123
+ if (!Number.isFinite(requested) || requested < 1)
124
+ return LOOP.MAX_ITERATIONS;
125
+ return Math.min(requested, LOOP.MAX_ITERATIONS_HARD_CEILING);
126
+ }
127
+ function nowIso() {
128
+ return new Date().toISOString();
129
+ }
130
+ function finalize(cfg, deps, iterations, reason, terminalVerdict, totalTokens) {
131
+ const outcome = reason === 'converged' && (terminalVerdict === 'PASS' || terminalVerdict === 'SKIP')
132
+ ? 'success'
133
+ : verdictToOutcome(reason);
134
+ const result = {
135
+ outcome,
136
+ terminalVerdict,
137
+ iterations,
138
+ totalTokens,
139
+ exitReason: reason,
140
+ exitCode: EXIT_CODES[reason],
141
+ };
142
+ // Single final outcome backfill (Q4 fallback path): one explicit
143
+ // `--result` derived from the TERMINAL VERIFY VERDICT — never inferred from a
144
+ // commit. Skipped entirely when no decisionId (ad-hoc loop) or dry-run.
145
+ if (cfg.decisionId && !cfg.dryRun) {
146
+ deps.writeFinalOutcome(outcome, `loop terminal: reason=${reason} verdict=${terminalVerdict ?? 'none'} ` +
147
+ `iterations=${iterations.length} tokens=${totalTokens}`);
148
+ }
149
+ deps.appendRunLog({ kind: 'summary', ...result, ts: nowIso() });
150
+ return result;
151
+ }
152
+ /**
153
+ * Drive the goal-convergence loop. Returns a {@link LoopResult}; the caller
154
+ * (CLI) maps `exitCode` onto `process.exitCode`.
155
+ *
156
+ * In `dryRun` mode this spawns NOTHING and returns a zero-iteration success —
157
+ * the CLI prints the planned prompts/config separately.
158
+ */
159
+ export async function runLoop(cfg, deps) {
160
+ const iterations = [];
161
+ if (cfg.dryRun) {
162
+ // No spawns, no git, no token spend. CLI renders the plan.
163
+ return {
164
+ outcome: 'success',
165
+ terminalVerdict: null,
166
+ iterations,
167
+ totalTokens: 0,
168
+ exitReason: 'converged',
169
+ exitCode: 0,
170
+ };
171
+ }
172
+ const maxIter = clampMaxIterations(cfg.maxIterations);
173
+ let totalTokens = 0;
174
+ let lastVerifyReport;
175
+ let lastDiffHash = null;
176
+ let noProgressStreak = 0;
177
+ for (let iter = 1; iter <= maxIter; iter++) {
178
+ // ── Token-budget gate (pre-emptive: stop BEFORE the next spawn) ──
179
+ // Estimate the next iteration's cost from the running average so we stop
180
+ // before exceeding, not after.
181
+ if (cfg.tokenBudget != null) {
182
+ const avgPerIter = iterations.length > 0 ? totalTokens / iterations.length : 0;
183
+ const projectedNext = avgPerIter > 0 ? avgPerIter : 1;
184
+ if (totalTokens + projectedNext > cfg.tokenBudget) {
185
+ return finalize(cfg, deps, iterations, 'budget-exhausted', lastVerifyReport ? parseVerifyVerdict(lastVerifyReport) : null, totalTokens);
186
+ }
187
+ }
188
+ const headBefore = await deps.gitHeadRef();
189
+ // ── 1. Implement (coder) ──
190
+ const coderPrompt = buildCoderPrompt(cfg.goal, lastVerifyReport);
191
+ const coderRes = await deps.spawnAgent({ agent: cfg.coderAgent, prompt: coderPrompt });
192
+ totalTokens += coderRes.tokens;
193
+ const headAfter = await deps.gitHeadRef();
194
+ // ── Irreversible-op gate ──
195
+ const irr = detectIrreversible(coderRes.text, headBefore, headAfter);
196
+ if (irr.fired && !cfg.allowIrreversible && cfg.onIrreversible === 'stop') {
197
+ const rec = {
198
+ iter, verdict: null, tokensSpent: coderRes.tokens,
199
+ diffHash: lastDiffHash ?? '', irreversible: true, terminated: true,
200
+ reason: 'irreversible-blocked', ts: nowIso(),
201
+ };
202
+ iterations.push(rec);
203
+ deps.appendRunLog(rec);
204
+ deps.writeIterationNote(`iter=${iter} irreversible-blocked: ${irr.reason ?? ''}`);
205
+ return finalize(cfg, deps, iterations, 'irreversible-blocked', null, totalTokens);
206
+ }
207
+ // onIrreversible==='skip' (or allowIrreversible): record the skip and
208
+ // continue — the coder is re-prompted next round to proceed without the op.
209
+ // ── 2. Verify ──
210
+ const verifyPrompt = buildVerifyPrompt(cfg.goal);
211
+ const verifyRes = await deps.spawnAgent({ agent: cfg.verifyAgent, prompt: verifyPrompt });
212
+ totalTokens += verifyRes.tokens;
213
+ const verdict = parseVerifyVerdict(verifyRes.text);
214
+ // ── Working-tree fingerprint (for no-progress detection) ──
215
+ const diffHash = await deps.gitDiffHash();
216
+ const rec = {
217
+ iter,
218
+ verdict,
219
+ tokensSpent: coderRes.tokens + verifyRes.tokens,
220
+ diffHash,
221
+ irreversible: irr.fired,
222
+ terminated: false,
223
+ ts: nowIso(),
224
+ };
225
+ deps.writeIterationNote(`iter=${iter} verdict=${verdict ?? 'none'} tokens=${rec.tokensSpent}`);
226
+ // ── Verify-gate: PASS/SKIP converge, FAIL iterate, BLOCKED/null stop-safe ──
227
+ if (verdict === 'PASS' || verdict === 'SKIP') {
228
+ rec.terminated = true;
229
+ rec.reason = 'converged';
230
+ iterations.push(rec);
231
+ deps.appendRunLog(rec);
232
+ return finalize(cfg, deps, iterations, 'converged', verdict, totalTokens);
233
+ }
234
+ if (verdict === null || verdict === 'BLOCKED') {
235
+ // Unparseable or explicitly blocked → cannot measure convergence; do NOT
236
+ // iterate blindly (would burn budget). Stop-safe.
237
+ rec.terminated = true;
238
+ rec.reason = 'verify-blocked';
239
+ iterations.push(rec);
240
+ deps.appendRunLog(rec);
241
+ return finalize(cfg, deps, iterations, 'verify-blocked', verdict, totalTokens);
242
+ }
243
+ // verdict === 'FAIL' → iterate. First check no-progress / oscillation.
244
+ if (lastDiffHash !== null && diffHash === lastDiffHash) {
245
+ noProgressStreak += 1;
246
+ }
247
+ else {
248
+ noProgressStreak = 0;
249
+ }
250
+ lastDiffHash = diffHash;
251
+ if (noProgressStreak >= cfg.noProgressLimit) {
252
+ rec.terminated = true;
253
+ rec.reason = 'stalled';
254
+ iterations.push(rec);
255
+ deps.appendRunLog(rec);
256
+ return finalize(cfg, deps, iterations, 'stalled', verdict, totalTokens);
257
+ }
258
+ iterations.push(rec);
259
+ deps.appendRunLog(rec);
260
+ lastVerifyReport = verifyRes.text;
261
+ }
262
+ // Ran out of iterations without a PASS.
263
+ const terminalVerdict = lastVerifyReport ? parseVerifyVerdict(lastVerifyReport) : null;
264
+ return finalize(cfg, deps, iterations, 'max-iter-exhausted', terminalVerdict, totalTokens);
265
+ }
266
+ //# sourceMappingURL=loop-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-engine.js","sourceRoot":"","sources":["../../../src/core/loop/loop-engine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/queue/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAO9C,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAsB1B;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAID;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAUpD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0EvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/queue/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQ9C,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,QAAQ,IAAI,CAAC;AAsB1B;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAID;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAUpD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CA0EvB"}
@@ -18,12 +18,13 @@ import { join } from 'node:path';
18
18
  import { randomUUID } from 'node:crypto';
19
19
  import { logger } from '../utils/logger.js';
20
20
  import { FORGE_PATHS } from '../constants.js';
21
+ import { DAY_MS } from '../utils/time.js';
21
22
  // ── Constants ──────────────────────────────────────────────────────────────
22
23
  const QUEUE_DIR = FORGE_PATHS.queue();
23
24
  const DEAD_DIR = FORGE_PATHS.queueDead();
24
25
  export const MAX_FILES = 500;
25
26
  export const TTL_DAYS = 7;
26
- const TTL_MS = TTL_DAYS * 24 * 60 * 60 * 1000;
27
+ const TTL_MS = TTL_DAYS * DAY_MS;
27
28
  // ── Helpers ────────────────────────────────────────────────────────────────
28
29
  function ensureDirs() {
29
30
  mkdirSync(QUEUE_DIR, { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/queue/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/queue/index.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,36 @@
8
8
  * - 一次性 sessions 回填
9
9
  *
10
10
  * 不涉及业务读写。所有业务读写由 *Operations 类组合 db 实例实现。
11
+ *
12
+ * 迁移机制(无编号 .sql runner):schema.sql 是当前 schema 的唯一真相
13
+ * (全 idempotent CREATE ... IF NOT EXISTS,每次启动 db.exec 重放)+
14
+ * 本文件 runColumnMigrations()/runIndexMigrations()/runPostMigrations()
15
+ * 对旧库就地补列/补索引/补 CHECK。migrations/ 目录下不存在被读取的编号 .sql。
16
+ * 详见 migrations/README.md。
11
17
  */
12
18
  import Database from 'better-sqlite3';
19
+ /**
20
+ * Backfill window for events.decision_id / subagent_type (decision c425f26f,
21
+ * spec 1544 § 1.3, user ruling #4). The spec aligns the window to existing
22
+ * retention; the only retention constant that bounds recoverability is the
23
+ * event-ttl-sweep WARM TTL (default 7 days), past which `tool_input` is NULLed
24
+ * (gzip blob gone — nothing left to decode). We use 10 days (spec default) as a
25
+ * conservative-but-safe ceiling: rows older than the warm TTL simply have NULL
26
+ * tool_input and are skipped by the WHERE (`tool_input IS NOT NULL` implied by a
27
+ * successful decode). base.ts is in the leaf-most `core` layer and MUST NOT
28
+ * depend on the daemon ConfigStore (decision ed98c8e8), so this is a static
29
+ * constant, not a config read.
30
+ */
31
+ export declare const SPAWN_FIELD_BACKFILL_WINDOW = "-10 days";
32
+ /**
33
+ * Backfill window for the one-shot tasks.parent_task_id historical linkage
34
+ * (decision f47c2c90, spec 1711 § Phase 1.1, user ruling Q2 = -10 days). Aligned
35
+ * with SPAWN_FIELD_BACKFILL_WINDOW so the two boot-time backfills cover the same
36
+ * recent slice. Historical rows cannot read the in-memory agentJustReturned flag,
37
+ * so the backfill uses a WEAKER pure-SQL heuristic (ack-title + same session +
38
+ * ≤30min prior non-ack user task); anything ambiguous stays NULL (宁缺毋滥).
39
+ */
40
+ export declare const TASK_PARENT_BACKFILL_WINDOW = "-10 days";
13
41
  export declare class SQLiteBase {
14
42
  protected db: Database.Database;
15
43
  protected dbPath: string;
@@ -154,6 +182,84 @@ export declare class SQLiteBase {
154
182
  * default already minting 'pending', this one-shot UPDATE realigns history.
155
183
  */
156
184
  private backfillRoutingRoutedToTypePending;
185
+ /**
186
+ * One-shot back-fill of skill_invocations.project_path from
187
+ * sessions.project_path (decision 39839e30 Part 2). A skill pull's session_id
188
+ * JOINs sessions to recover the project it belonged to. Idempotent: the WHERE
189
+ * clause restricts to `project_path IS NULL AND session_id IS NOT NULL`, so a
190
+ * second startup touches 0 rows. Rows whose session can't be joined (sentinel
191
+ * session 'cli-no-session', or a session not in the sessions table) stay NULL
192
+ * — we deliberately do NOT invent a project for them.
193
+ *
194
+ * Errors are warn-logged and swallowed — daemon startup must not fail on a
195
+ * data back-fill; worst case some legacy rows stay project_path=NULL and only
196
+ * the all-projects view counts them.
197
+ */
198
+ private backfillSkillInvocationsProjectPathIfNeeded;
199
+ /**
200
+ * decision f47c2c90 (二期B, spec 1711 § Phase 1.1): one-shot, idempotent,
201
+ * gzip-free backfill of `tasks.parent_task_id` for recent ack/continue-class
202
+ * follow-up tasks that have no parent linked yet.
203
+ *
204
+ * Why gzip-free + weaker than go-forward: this runs over HISTORY, which has no
205
+ * in-memory `agentJustReturned` flag to read (R2). It uses a pure-SQL heuristic
206
+ * over the plaintext tasks columns ONLY (title / start_time / session_id —
207
+ * never the gzip events.tool_input, R7). Conservatism over recall:
208
+ * - child candidate: task_kind='user', parent_task_id IS NULL, title is a
209
+ * short ack token (TASK_PARENT_ACK_TITLES), start_time within the window.
210
+ * - parent: the MOST RECENT same-session task_kind='user' task whose
211
+ * start_time is STRICTLY earlier than the child AND within 30min AND whose
212
+ * title is NOT itself an ack token (avoid ack→ack chains, prefer a
213
+ * substantive originating task). No qualifying parent → stays NULL.
214
+ * - never self-links (parent.id != child.id is implied by strict earlier
215
+ * start_time + the explicit guard below).
216
+ *
217
+ * Idempotent gate: only runs when at least one un-linked recent ack child
218
+ * exists; the UPDATE itself only touches `parent_task_id IS NULL` rows, so a
219
+ * second boot updates 0 rows (success criterion: `backfilled 0 rows`).
220
+ *
221
+ * Wrapped in a transaction. Errors are warn-logged and swallowed — daemon
222
+ * startup must not fail on a data backfill. Time math uses
223
+ * `datetime('now', ?)` + ISO lexical comparison (tasks.start_time is ISO TEXT;
224
+ * NO numeric probe — DB column type landmine, MEMORY).
225
+ */
226
+ private backfillTasksParentIfNeeded;
227
+ /**
228
+ * decision c425f26f (spec 1544 § 1.3): one-shot, idempotent backfill of the
229
+ * PLAINTEXT `events.decision_id` / `events.subagent_type` columns for recent
230
+ * Task/Agent spawn rows whose values still live only inside the gzip
231
+ * `tool_input` blob.
232
+ *
233
+ * Idempotent gate: only spawn rows in the backfill window where BOTH new
234
+ * columns are still NULL are touched, so a second daemon boot updates 0 rows
235
+ * (success criterion: `backfilled 0 rows`).
236
+ *
237
+ * gzip one-way-door: we DECODE `tool_input` via the codec (sniffs gzip magic),
238
+ * run `extractSpawnFields` on the decoded object, then write the extracted
239
+ * strings to the plaintext columns. The columns themselves never see gzip.
240
+ * Rows whose `tool_input` was already NULLed by the warm-TTL sweep have
241
+ * nothing to decode and are skipped (decode → undefined → both NULL, but the
242
+ * WHERE already excludes most via `tool_input IS NOT NULL`).
243
+ *
244
+ * Per-row try/catch: one malformed gzip blob never aborts the batch. Wrapped
245
+ * in a single transaction. Errors are warn-logged and swallowed — daemon
246
+ * startup must not fail on a data backfill.
247
+ *
248
+ * This is the boot-time wrapper (gated). The re-runnable engine lives in
249
+ * {@link backfillEventsDecisionId} so `cf maintenance backfill-spawn-fields`
250
+ * can force a full re-scan of the window.
251
+ */
252
+ private backfillEventsDecisionIdIfNeeded;
253
+ /**
254
+ * Re-runnable engine for the decision_id / subagent_type backfill (decision
255
+ * c425f26f, user ruling #3 manual fallback). Scans the backfill window for
256
+ * Pre/Post Task/Agent spawn rows that still have NULL plaintext columns,
257
+ * decodes their gzip `tool_input`, and writes the extracted fields. Returns
258
+ * the number of rows updated. Safe to call repeatedly (idempotent: only NULL
259
+ * rows are touched). Exposed via the SQLiteStorage facade for the
260
+ * `cf maintenance backfill-spawn-fields` command.
261
+ */
262
+ backfillEventsDecisionId(): number;
157
263
  /**
158
264
  * Migration 010: widen workflow_recommendations.outcome CHECK to include
159
265
  * 'partial_accepted'. SQLite cannot ALTER a CHECK constraint in place — we
@@ -203,6 +309,59 @@ export declare class SQLiteBase {
203
309
  * build.
204
310
  */
205
311
  private rebuildOutcomeCheckIfNeeded;
312
+ /**
313
+ * Migration 012 (decision 0fc1883c, 2026-06-08): DROP the dead
314
+ * `decisions.workflow_type` column. It was hard-coded to the literal
315
+ * 'pending' by decision-hint.ts (daemon no longer pre-classifies) and had
316
+ * ZERO consumers — no UPDATE path, no business logic branch. (The
317
+ * `intent.workflow_type` read by rules/pipeline-rollup is a DIFFERENT field
318
+ * sourced from injection metadata, NOT this column.)
319
+ *
320
+ * SQLite cannot reliably DROP COLUMN on older engines, so we mirror the
321
+ * migration-010/011 table-rebuild pattern: read the table's stored CREATE
322
+ * statement, strip the `workflow_type` line, CREATE the temp table, copy
323
+ * every OTHER column by EXPLICIT name (never `SELECT *` — the live column
324
+ * ORDER differs from schema.sql because migration-added columns are appended),
325
+ * DROP old, RENAME, replay indexes.
326
+ *
327
+ * Robustness choices:
328
+ * - **Idempotent**: guarded by hasColumn — if workflow_type is already gone
329
+ * (fresh DB from current schema.sql, or a prior boot) this is a no-op.
330
+ * - **Data-preserving**: copies all non-workflow_type columns by name, so
331
+ * every decision row keeps its other fields verbatim.
332
+ * - **Index-preserving**: snapshots user indexes before the drop and replays
333
+ * each `sql` after rename (made IF NOT EXISTS so schema.sql's recreate on
334
+ * the same boot doesn't clash).
335
+ *
336
+ * Errors are warn-logged, never thrown — daemon startup must not fail on a
337
+ * migration. Worst case the dead column lingers (harmless — nothing reads it).
338
+ */
339
+ /**
340
+ * Migration 013 (decision 93e8fff1, 2026-06-08): widen the
341
+ * `decisions.status` CHECK to include 'advisory'. The advisory mint default
342
+ * (writeDecision) writes status='advisory', which the legacy CHECK
343
+ * (`status IN ('pending','resolved','bypassed','expired')`) would REJECT on
344
+ * existing live DBs — SQLite cannot ALTER a CHECK in place, so we mirror the
345
+ * migration-011/012 table-rebuild pattern: read the stored CREATE, string-
346
+ * replace ONLY the status CHECK fragment, CREATE temp → INSERT SELECT * →
347
+ * DROP → RENAME → replay indexes.
348
+ *
349
+ * Robustness:
350
+ * - **Idempotent**: detected by sniffing the stored CREATE for the legacy
351
+ * status enum WITHOUT 'advisory'. New DBs (schema.sql already carries
352
+ * 'advisory') and a second boot are no-ops.
353
+ * - **Data-preserving**: copies every column verbatim via `SELECT *`.
354
+ * - **Index-preserving**: snapshots non-autoindexes before the drop, replays
355
+ * each (made IF NOT EXISTS so schema.sql's recreate on the same boot is
356
+ * harmless).
357
+ *
358
+ * Errors are warn-logged, never thrown — daemon startup must not fail on a
359
+ * migration. Worst case the old CHECK lingers and a fresh advisory write is
360
+ * rejected at write time (writeDecision callers fail-silent), and the operator
361
+ * can re-run after the next build.
362
+ */
363
+ private widenDecisionsStatusCheckIfNeeded;
364
+ private dropDecisionsWorkflowTypeIfNeeded;
206
365
  /**
207
366
  * 将 events 表按 session_id 聚合回填到 sessions 表,仅在 sessions 尚未对齐
208
367
  * (没有任何一行带 first_prompt)时触发。
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/storage/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAOtC,qBAAa,UAAU;IACrB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAChC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEb,MAAM,EAAE,MAAM;IAqD1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,yBAAyB;IAwBjC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAa1D,OAAO,CAAC,UAAU;IAclB,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWzC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAS3D,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAerF,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWzC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAgJ3B;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAwG1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,4BAA4B;IAyCpC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,6BAA6B;IAmCrC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iCAAiC;IAmBzC;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAWnC;;;;;OAKG;IACH,OAAO,CAAC,kCAAkC;IAc1C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,2CAA2C;IAsDnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,OAAO,CAAC,2BAA2B;IA8EnC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAoDhC;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,QAAQ;IAIhC,SAAS,IAAI,MAAM;IAInB,SAAS,CAAC,WAAW,IAAI,MAAM;CAIhC"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/core/storage/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAStC;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,2BAA2B,aAAa,CAAC;AAEtD;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,aAAa,CAAC;AAsBtD,qBAAa,UAAU;IACrB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAChC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEb,MAAM,EAAE,MAAM;IAqD1B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,yBAAyB;IAwBjC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAa1D,OAAO,CAAC,UAAU;IAclB,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWzC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAS3D,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAerF,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAWzC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA+O3B;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAqI1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,4BAA4B;IAyCpC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,6BAA6B;IAmCrC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,iCAAiC;IAmBzC;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAWnC;;;;;OAKG;IACH,OAAO,CAAC,kCAAkC;IAc1C;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,2CAA2C;IA4BnD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,2BAA2B;IAkEnC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,gCAAgC;IAwBxC;;;;;;;;OAQG;IACH,wBAAwB,IAAI,MAAM;IA2ClC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,2CAA2C;IAsDnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,OAAO,CAAC,2BAA2B;IA8EnC;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,OAAO,CAAC,iCAAiC;IA4DzC,OAAO,CAAC,iCAAiC;IAuEzC;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAoDhC;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,QAAQ;IAIhC,SAAS,IAAI,MAAM;IAInB,SAAS,CAAC,WAAW,IAAI,MAAM;CAIhC"}