@winspan/claude-forge 8.54.4 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (880) hide show
  1. package/DEVELOPMENT.md +649 -33
  2. package/README.md +154 -16
  3. package/dist/catalogs/agents.json +72 -0
  4. package/dist/catalogs/skills.json +194 -0
  5. package/dist/claudemd/claudemd-generator.d.ts +45 -45
  6. package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
  7. package/dist/claudemd/claudemd-generator.js +128 -449
  8. package/dist/claudemd/claudemd-generator.js.map +1 -1
  9. package/dist/claudemd/index.d.ts +14 -4
  10. package/dist/claudemd/index.d.ts.map +1 -1
  11. package/dist/claudemd/index.js +15 -4
  12. package/dist/claudemd/index.js.map +1 -1
  13. package/dist/claudemd/resume-manager.d.ts.map +1 -1
  14. package/dist/claudemd/resume-manager.js +37 -9
  15. package/dist/claudemd/resume-manager.js.map +1 -1
  16. package/dist/claudemd/templates/swarm-protocol.md +35 -186
  17. package/dist/claudemd/violations-manager.d.ts +40 -0
  18. package/dist/claudemd/violations-manager.d.ts.map +1 -0
  19. package/dist/claudemd/violations-manager.js +106 -0
  20. package/dist/claudemd/violations-manager.js.map +1 -0
  21. package/dist/cli/commands/admin.d.ts +15 -0
  22. package/dist/cli/commands/admin.d.ts.map +1 -0
  23. package/dist/cli/commands/admin.js +177 -0
  24. package/dist/cli/commands/admin.js.map +1 -0
  25. package/dist/cli/commands/agents.d.ts +18 -0
  26. package/dist/cli/commands/agents.d.ts.map +1 -0
  27. package/dist/cli/commands/agents.js +160 -0
  28. package/dist/cli/commands/agents.js.map +1 -0
  29. package/dist/cli/commands/bypass.d.ts +18 -0
  30. package/dist/cli/commands/bypass.d.ts.map +1 -0
  31. package/dist/cli/commands/bypass.js +87 -0
  32. package/dist/cli/commands/bypass.js.map +1 -0
  33. package/dist/cli/commands/claudemd.d.ts +60 -0
  34. package/dist/cli/commands/claudemd.d.ts.map +1 -1
  35. package/dist/cli/commands/claudemd.js +174 -37
  36. package/dist/cli/commands/claudemd.js.map +1 -1
  37. package/dist/cli/commands/config.d.ts.map +1 -1
  38. package/dist/cli/commands/config.js +94 -1
  39. package/dist/cli/commands/config.js.map +1 -1
  40. package/dist/cli/commands/daemon.d.ts +39 -0
  41. package/dist/cli/commands/daemon.d.ts.map +1 -1
  42. package/dist/cli/commands/daemon.js +167 -20
  43. package/dist/cli/commands/daemon.js.map +1 -1
  44. package/dist/cli/commands/decisions.d.ts +129 -0
  45. package/dist/cli/commands/decisions.d.ts.map +1 -0
  46. package/dist/cli/commands/decisions.js +669 -0
  47. package/dist/cli/commands/decisions.js.map +1 -0
  48. package/dist/cli/commands/doctor.d.ts +29 -0
  49. package/dist/cli/commands/doctor.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor.js +124 -0
  51. package/dist/cli/commands/doctor.js.map +1 -0
  52. package/dist/cli/commands/entropy.d.ts +35 -0
  53. package/dist/cli/commands/entropy.d.ts.map +1 -0
  54. package/dist/cli/commands/entropy.js +121 -0
  55. package/dist/cli/commands/entropy.js.map +1 -0
  56. package/dist/cli/commands/executions.d.ts +1 -0
  57. package/dist/cli/commands/executions.d.ts.map +1 -1
  58. package/dist/cli/commands/executions.js +10 -1
  59. package/dist/cli/commands/executions.js.map +1 -1
  60. package/dist/cli/commands/fix.d.ts +31 -0
  61. package/dist/cli/commands/fix.d.ts.map +1 -0
  62. package/dist/cli/commands/fix.js +108 -0
  63. package/dist/cli/commands/fix.js.map +1 -0
  64. package/dist/cli/commands/governance.d.ts +21 -0
  65. package/dist/cli/commands/governance.d.ts.map +1 -0
  66. package/dist/cli/commands/governance.js +60 -0
  67. package/dist/cli/commands/governance.js.map +1 -0
  68. package/dist/cli/commands/init.d.ts +27 -0
  69. package/dist/cli/commands/init.d.ts.map +1 -1
  70. package/dist/cli/commands/init.js +158 -146
  71. package/dist/cli/commands/init.js.map +1 -1
  72. package/dist/cli/commands/insights-goal-check.d.ts +50 -0
  73. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
  74. package/dist/cli/commands/insights-goal-check.js +318 -0
  75. package/dist/cli/commands/insights-goal-check.js.map +1 -0
  76. package/dist/cli/commands/insights.d.ts +15 -0
  77. package/dist/cli/commands/insights.d.ts.map +1 -0
  78. package/dist/cli/commands/insights.js +127 -0
  79. package/dist/cli/commands/insights.js.map +1 -0
  80. package/dist/cli/commands/knowledge.d.ts +66 -0
  81. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  82. package/dist/cli/commands/knowledge.js +897 -0
  83. package/dist/cli/commands/knowledge.js.map +1 -0
  84. package/dist/cli/commands/mcp.d.ts +0 -12
  85. package/dist/cli/commands/mcp.d.ts.map +1 -1
  86. package/dist/cli/commands/mcp.js +11 -5
  87. package/dist/cli/commands/mcp.js.map +1 -1
  88. package/dist/cli/commands/menu.d.ts.map +1 -1
  89. package/dist/cli/commands/menu.js +10 -184
  90. package/dist/cli/commands/menu.js.map +1 -1
  91. package/dist/cli/commands/project.d.ts +98 -0
  92. package/dist/cli/commands/project.d.ts.map +1 -0
  93. package/dist/cli/commands/project.js +382 -0
  94. package/dist/cli/commands/project.js.map +1 -0
  95. package/dist/cli/commands/skills.d.ts.map +1 -1
  96. package/dist/cli/commands/skills.js +14 -128
  97. package/dist/cli/commands/skills.js.map +1 -1
  98. package/dist/cli/commands/spec.d.ts +40 -0
  99. package/dist/cli/commands/spec.d.ts.map +1 -0
  100. package/dist/cli/commands/spec.js +49 -0
  101. package/dist/cli/commands/spec.js.map +1 -0
  102. package/dist/cli/commands/stats.d.ts.map +1 -1
  103. package/dist/cli/commands/stats.js +3 -2
  104. package/dist/cli/commands/stats.js.map +1 -1
  105. package/dist/cli/commands/status.d.ts.map +1 -1
  106. package/dist/cli/commands/status.js +17 -2
  107. package/dist/cli/commands/status.js.map +1 -1
  108. package/dist/cli/commands/trace.d.ts.map +1 -1
  109. package/dist/cli/commands/trace.js +4 -9
  110. package/dist/cli/commands/trace.js.map +1 -1
  111. package/dist/cli/commands/violations.d.ts +14 -0
  112. package/dist/cli/commands/violations.d.ts.map +1 -0
  113. package/dist/cli/commands/violations.js +43 -0
  114. package/dist/cli/commands/violations.js.map +1 -0
  115. package/dist/cli/index.js +26 -0
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/init/hook-manager.d.ts +1 -1
  118. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  119. package/dist/cli/init/hook-manager.js +6 -0
  120. package/dist/cli/init/hook-manager.js.map +1 -1
  121. package/dist/cli/utils/resolve-session.d.ts +32 -0
  122. package/dist/cli/utils/resolve-session.d.ts.map +1 -0
  123. package/dist/cli/utils/resolve-session.js +39 -0
  124. package/dist/cli/utils/resolve-session.js.map +1 -0
  125. package/dist/core/config.d.ts +4 -1
  126. package/dist/core/config.d.ts.map +1 -1
  127. package/dist/core/config.js +11 -23
  128. package/dist/core/config.js.map +1 -1
  129. package/dist/core/constants.d.ts +14 -13
  130. package/dist/core/constants.d.ts.map +1 -1
  131. package/dist/core/constants.js +20 -13
  132. package/dist/core/constants.js.map +1 -1
  133. package/dist/core/diagnostics/checks.d.ts +151 -0
  134. package/dist/core/diagnostics/checks.d.ts.map +1 -0
  135. package/dist/core/diagnostics/checks.js +765 -0
  136. package/dist/core/diagnostics/checks.js.map +1 -0
  137. package/dist/core/diagnostics/daemon-status.d.ts +77 -0
  138. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
  139. package/dist/core/diagnostics/daemon-status.js +113 -0
  140. package/dist/core/diagnostics/daemon-status.js.map +1 -0
  141. package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
  142. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
  143. package/dist/core/diagnostics/entropy-checks.js +395 -0
  144. package/dist/core/diagnostics/entropy-checks.js.map +1 -0
  145. package/dist/core/diagnostics/fix-runner.d.ts +54 -0
  146. package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
  147. package/dist/core/diagnostics/fix-runner.js +90 -0
  148. package/dist/core/diagnostics/fix-runner.js.map +1 -0
  149. package/dist/core/diagnostics/knip-runner.d.ts +49 -0
  150. package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
  151. package/dist/core/diagnostics/knip-runner.js +100 -0
  152. package/dist/core/diagnostics/knip-runner.js.map +1 -0
  153. package/dist/core/diagnostics/markers.d.ts +96 -0
  154. package/dist/core/diagnostics/markers.d.ts.map +1 -0
  155. package/dist/core/diagnostics/markers.js +153 -0
  156. package/dist/core/diagnostics/markers.js.map +1 -0
  157. package/dist/core/governance/global-inject.d.ts +60 -0
  158. package/dist/core/governance/global-inject.d.ts.map +1 -0
  159. package/dist/core/governance/global-inject.js +129 -0
  160. package/dist/core/governance/global-inject.js.map +1 -0
  161. package/dist/core/queue/index.d.ts +16 -3
  162. package/dist/core/queue/index.d.ts.map +1 -1
  163. package/dist/core/queue/index.js +14 -3
  164. package/dist/core/queue/index.js.map +1 -1
  165. package/dist/core/storage/base.d.ts +158 -0
  166. package/dist/core/storage/base.d.ts.map +1 -1
  167. package/dist/core/storage/base.js +570 -0
  168. package/dist/core/storage/base.js.map +1 -1
  169. package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
  170. package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
  171. package/dist/core/storage/codec/tool-input-codec.js +159 -0
  172. package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
  173. package/dist/core/storage/decisions.d.ts +362 -0
  174. package/dist/core/storage/decisions.d.ts.map +1 -0
  175. package/dist/core/storage/decisions.js +502 -0
  176. package/dist/core/storage/decisions.js.map +1 -0
  177. package/dist/core/storage/events.d.ts +112 -8
  178. package/dist/core/storage/events.d.ts.map +1 -1
  179. package/dist/core/storage/events.js +390 -39
  180. package/dist/core/storage/events.js.map +1 -1
  181. package/dist/core/storage/feedback.d.ts +131 -0
  182. package/dist/core/storage/feedback.d.ts.map +1 -0
  183. package/dist/core/storage/feedback.js +187 -0
  184. package/dist/core/storage/feedback.js.map +1 -0
  185. package/dist/core/storage/forge-config.d.ts +40 -0
  186. package/dist/core/storage/forge-config.d.ts.map +1 -0
  187. package/dist/core/storage/forge-config.js +65 -0
  188. package/dist/core/storage/forge-config.js.map +1 -0
  189. package/dist/core/storage/injections.d.ts +28 -0
  190. package/dist/core/storage/injections.d.ts.map +1 -1
  191. package/dist/core/storage/injections.js +62 -5
  192. package/dist/core/storage/injections.js.map +1 -1
  193. package/dist/core/storage/knowledge.d.ts +106 -0
  194. package/dist/core/storage/knowledge.d.ts.map +1 -0
  195. package/dist/core/storage/knowledge.js +202 -0
  196. package/dist/core/storage/knowledge.js.map +1 -0
  197. package/dist/core/storage/maintenance.d.ts +36 -9
  198. package/dist/core/storage/maintenance.d.ts.map +1 -1
  199. package/dist/core/storage/maintenance.js +56 -24
  200. package/dist/core/storage/maintenance.js.map +1 -1
  201. package/dist/core/storage/pipeline-rollup.d.ts +117 -0
  202. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
  203. package/dist/core/storage/pipeline-rollup.js +471 -0
  204. package/dist/core/storage/pipeline-rollup.js.map +1 -0
  205. package/dist/core/storage/routing.d.ts +16 -3
  206. package/dist/core/storage/routing.d.ts.map +1 -1
  207. package/dist/core/storage/routing.js +39 -8
  208. package/dist/core/storage/routing.js.map +1 -1
  209. package/dist/core/storage/rows.d.ts +50 -7
  210. package/dist/core/storage/rows.d.ts.map +1 -1
  211. package/dist/core/storage/schema.sql +302 -23
  212. package/dist/core/storage/sessions.d.ts +136 -0
  213. package/dist/core/storage/sessions.d.ts.map +1 -1
  214. package/dist/core/storage/sessions.js +351 -15
  215. package/dist/core/storage/sessions.js.map +1 -1
  216. package/dist/core/storage/skills.d.ts +1 -0
  217. package/dist/core/storage/skills.d.ts.map +1 -1
  218. package/dist/core/storage/skills.js +21 -6
  219. package/dist/core/storage/skills.js.map +1 -1
  220. package/dist/core/storage/sqlite.d.ts +253 -20
  221. package/dist/core/storage/sqlite.d.ts.map +1 -1
  222. package/dist/core/storage/sqlite.js +425 -16
  223. package/dist/core/storage/sqlite.js.map +1 -1
  224. package/dist/core/storage/tasks.d.ts +474 -2
  225. package/dist/core/storage/tasks.d.ts.map +1 -1
  226. package/dist/core/storage/tasks.js +1213 -18
  227. package/dist/core/storage/tasks.js.map +1 -1
  228. package/dist/core/storage/tool-intercepts.d.ts +69 -0
  229. package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
  230. package/dist/core/storage/tool-intercepts.js +116 -0
  231. package/dist/core/storage/tool-intercepts.js.map +1 -0
  232. package/dist/core/storage/workflow-recommendations.d.ts +124 -0
  233. package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
  234. package/dist/core/storage/workflow-recommendations.js +274 -0
  235. package/dist/core/storage/workflow-recommendations.js.map +1 -0
  236. package/dist/core/types.d.ts +112 -17
  237. package/dist/core/types.d.ts.map +1 -1
  238. package/dist/core/types.js +12 -0
  239. package/dist/core/types.js.map +1 -1
  240. package/dist/core/utils/backup.d.ts +81 -0
  241. package/dist/core/utils/backup.d.ts.map +1 -0
  242. package/dist/core/utils/backup.js +98 -0
  243. package/dist/core/utils/backup.js.map +1 -0
  244. package/dist/core/utils/binary-paths.d.ts +92 -0
  245. package/dist/core/utils/binary-paths.d.ts.map +1 -0
  246. package/dist/core/utils/binary-paths.js +166 -0
  247. package/dist/core/utils/binary-paths.js.map +1 -0
  248. package/dist/core/utils/bypass-token.d.ts +75 -0
  249. package/dist/core/utils/bypass-token.d.ts.map +1 -0
  250. package/dist/core/utils/bypass-token.js +133 -0
  251. package/dist/core/utils/bypass-token.js.map +1 -0
  252. package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
  253. package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
  254. package/dist/core/utils/cc-builtin-agents.js +29 -0
  255. package/dist/core/utils/cc-builtin-agents.js.map +1 -0
  256. package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
  257. package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
  258. package/dist/core/utils/claude-cli-spawn.js +219 -0
  259. package/dist/core/utils/claude-cli-spawn.js.map +1 -0
  260. package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
  261. package/dist/core/utils/forge-resume-block.js +3 -2
  262. package/dist/core/utils/forge-resume-block.js.map +1 -1
  263. package/dist/core/utils/logger.d.ts +15 -3
  264. package/dist/core/utils/logger.d.ts.map +1 -1
  265. package/dist/core/utils/logger.js +20 -2
  266. package/dist/core/utils/logger.js.map +1 -1
  267. package/dist/core/utils/noise-prompt.d.ts +97 -0
  268. package/dist/core/utils/noise-prompt.d.ts.map +1 -0
  269. package/dist/core/utils/noise-prompt.js +127 -0
  270. package/dist/core/utils/noise-prompt.js.map +1 -0
  271. package/dist/core/utils/path.d.ts +0 -4
  272. package/dist/core/utils/path.d.ts.map +1 -1
  273. package/dist/core/utils/path.js +0 -7
  274. package/dist/core/utils/path.js.map +1 -1
  275. package/dist/core/utils/time.d.ts +41 -0
  276. package/dist/core/utils/time.d.ts.map +1 -1
  277. package/dist/core/utils/time.js +114 -0
  278. package/dist/core/utils/time.js.map +1 -1
  279. package/dist/daemon/agent-sync.d.ts +24 -0
  280. package/dist/daemon/agent-sync.d.ts.map +1 -0
  281. package/dist/daemon/agent-sync.js +114 -0
  282. package/dist/daemon/agent-sync.js.map +1 -0
  283. package/dist/daemon/config-store.d.ts +55 -0
  284. package/dist/daemon/config-store.d.ts.map +1 -0
  285. package/dist/daemon/config-store.js +137 -0
  286. package/dist/daemon/config-store.js.map +1 -0
  287. package/dist/daemon/event-parser.d.ts +22 -0
  288. package/dist/daemon/event-parser.d.ts.map +1 -1
  289. package/dist/daemon/event-parser.js +49 -3
  290. package/dist/daemon/event-parser.js.map +1 -1
  291. package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
  292. package/dist/daemon/handlers/history-exporter.js +9 -8
  293. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  294. package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
  295. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  296. package/dist/daemon/handlers/post-tool-use.js +261 -8
  297. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  298. package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
  299. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
  300. package/dist/daemon/handlers/pre-tool-use.js +585 -0
  301. package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
  302. package/dist/daemon/handlers/stop.d.ts +35 -7
  303. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  304. package/dist/daemon/handlers/stop.js +157 -8
  305. package/dist/daemon/handlers/stop.js.map +1 -1
  306. package/dist/daemon/handlers/user-prompt.d.ts +36 -14
  307. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  308. package/dist/daemon/handlers/user-prompt.js +135 -48
  309. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  310. package/dist/daemon/hook-sync.d.ts.map +1 -1
  311. package/dist/daemon/hook-sync.js +2 -1
  312. package/dist/daemon/hook-sync.js.map +1 -1
  313. package/dist/daemon/index.d.ts.map +1 -1
  314. package/dist/daemon/index.js +471 -43
  315. package/dist/daemon/index.js.map +1 -1
  316. package/dist/daemon/lifecycle.d.ts +48 -1
  317. package/dist/daemon/lifecycle.d.ts.map +1 -1
  318. package/dist/daemon/lifecycle.js +98 -2
  319. package/dist/daemon/lifecycle.js.map +1 -1
  320. package/dist/daemon/router.d.ts +4 -1
  321. package/dist/daemon/router.d.ts.map +1 -1
  322. package/dist/daemon/router.js +4 -2
  323. package/dist/daemon/router.js.map +1 -1
  324. package/dist/daemon/rules/defaults.d.ts +20 -0
  325. package/dist/daemon/rules/defaults.d.ts.map +1 -0
  326. package/dist/daemon/rules/defaults.js +692 -0
  327. package/dist/daemon/rules/defaults.js.map +1 -0
  328. package/dist/daemon/rules/registry.d.ts +47 -0
  329. package/dist/daemon/rules/registry.d.ts.map +1 -0
  330. package/dist/daemon/rules/registry.js +84 -0
  331. package/dist/daemon/rules/registry.js.map +1 -0
  332. package/dist/daemon/rules/types.d.ts +170 -0
  333. package/dist/daemon/rules/types.d.ts.map +1 -0
  334. package/dist/daemon/rules/types.js +15 -0
  335. package/dist/daemon/rules/types.js.map +1 -0
  336. package/dist/daemon/rules/whitelist.d.ts +101 -0
  337. package/dist/daemon/rules/whitelist.d.ts.map +1 -0
  338. package/dist/daemon/rules/whitelist.js +210 -0
  339. package/dist/daemon/rules/whitelist.js.map +1 -0
  340. package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
  341. package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
  342. package/dist/daemon/rules/workflow-defaults.js +521 -0
  343. package/dist/daemon/rules/workflow-defaults.js.map +1 -0
  344. package/dist/daemon/server.d.ts +11 -1
  345. package/dist/daemon/server.d.ts.map +1 -1
  346. package/dist/daemon/server.js +7 -1
  347. package/dist/daemon/server.js.map +1 -1
  348. package/dist/daemon/services/context-injector.d.ts +34 -0
  349. package/dist/daemon/services/context-injector.d.ts.map +1 -0
  350. package/dist/daemon/services/context-injector.js +61 -0
  351. package/dist/daemon/services/context-injector.js.map +1 -0
  352. package/dist/daemon/services/decision-hint.d.ts +203 -0
  353. package/dist/daemon/services/decision-hint.d.ts.map +1 -0
  354. package/dist/daemon/services/decision-hint.js +487 -0
  355. package/dist/daemon/services/decision-hint.js.map +1 -0
  356. package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
  357. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
  358. package/dist/daemon/services/event-ttl-sweep.js +123 -0
  359. package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
  360. package/dist/daemon/services/experience-extractor.d.ts +67 -0
  361. package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
  362. package/dist/daemon/services/experience-extractor.js +323 -0
  363. package/dist/daemon/services/experience-extractor.js.map +1 -0
  364. package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
  365. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
  366. package/dist/daemon/services/feedback-aggregator.js +455 -0
  367. package/dist/daemon/services/feedback-aggregator.js.map +1 -0
  368. package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
  369. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
  370. package/dist/daemon/services/heartbeat-writer.js +111 -0
  371. package/dist/daemon/services/heartbeat-writer.js.map +1 -0
  372. package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
  373. package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
  374. package/dist/daemon/services/idle-session-sweeper.js +94 -0
  375. package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
  376. package/dist/daemon/services/idle-task-budget.d.ts +50 -0
  377. package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
  378. package/dist/daemon/services/idle-task-budget.js +72 -0
  379. package/dist/daemon/services/idle-task-budget.js.map +1 -0
  380. package/dist/daemon/services/intercept-revive.d.ts +60 -0
  381. package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
  382. package/dist/daemon/services/intercept-revive.js +86 -0
  383. package/dist/daemon/services/intercept-revive.js.map +1 -0
  384. package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
  385. package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
  386. package/dist/daemon/services/intercept-rollback-guard.js +152 -0
  387. package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
  388. package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
  389. package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
  390. package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
  391. package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
  392. package/dist/daemon/services/kb-injector.d.ts +57 -0
  393. package/dist/daemon/services/kb-injector.d.ts.map +1 -0
  394. package/dist/daemon/services/kb-injector.js +140 -0
  395. package/dist/daemon/services/kb-injector.js.map +1 -0
  396. package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
  397. package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
  398. package/dist/daemon/services/outcome-classification-service.js +214 -0
  399. package/dist/daemon/services/outcome-classification-service.js.map +1 -0
  400. package/dist/daemon/services/outcome-classifier.d.ts +136 -0
  401. package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
  402. package/dist/daemon/services/outcome-classifier.js +178 -0
  403. package/dist/daemon/services/outcome-classifier.js.map +1 -0
  404. package/dist/daemon/services/outcome-nudge.d.ts +107 -0
  405. package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
  406. package/dist/daemon/services/outcome-nudge.js +242 -0
  407. package/dist/daemon/services/outcome-nudge.js.map +1 -0
  408. package/dist/daemon/services/spec-approval.d.ts +127 -0
  409. package/dist/daemon/services/spec-approval.d.ts.map +1 -0
  410. package/dist/daemon/services/spec-approval.js +216 -0
  411. package/dist/daemon/services/spec-approval.js.map +1 -0
  412. package/dist/daemon/services/spec-gate.d.ts +54 -0
  413. package/dist/daemon/services/spec-gate.d.ts.map +1 -0
  414. package/dist/daemon/services/spec-gate.js +113 -0
  415. package/dist/daemon/services/spec-gate.js.map +1 -0
  416. package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
  417. package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
  418. package/dist/daemon/services/task-boundary-classifier.js +202 -0
  419. package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
  420. package/dist/daemon/services/task-segmenter.d.ts +219 -1
  421. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  422. package/dist/daemon/services/task-segmenter.js +481 -17
  423. package/dist/daemon/services/task-segmenter.js.map +1 -1
  424. package/dist/daemon/services/violation-reporter.d.ts +130 -0
  425. package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
  426. package/dist/daemon/services/violation-reporter.js +339 -0
  427. package/dist/daemon/services/violation-reporter.js.map +1 -0
  428. package/dist/daemon/skill-sync.d.ts +7 -2
  429. package/dist/daemon/skill-sync.d.ts.map +1 -1
  430. package/dist/daemon/skill-sync.js +114 -9
  431. package/dist/daemon/skill-sync.js.map +1 -1
  432. package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
  433. package/dist/daemon/templates/agents/coder.md +105 -0
  434. package/dist/daemon/templates/agents/decision-maker.md +460 -0
  435. package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
  436. package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
  437. package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
  438. package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
  439. package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
  440. package/dist/daemon/templates/agents/patch-applier.md +144 -0
  441. package/dist/daemon/templates/agents/planner.md +165 -0
  442. package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
  443. package/dist/daemon/templates/agents/skill-distiller.md +113 -0
  444. package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
  445. package/dist/daemon/templates/agents/verify-agent.md +136 -0
  446. package/dist/daemon/utils/inject-block.d.ts +39 -0
  447. package/dist/daemon/utils/inject-block.d.ts.map +1 -0
  448. package/dist/daemon/utils/inject-block.js +25 -0
  449. package/dist/daemon/utils/inject-block.js.map +1 -0
  450. package/dist/hooks/hook-lib.sh +8 -0
  451. package/dist/hooks/notification.sh +19 -8
  452. package/dist/hooks/post-tool-use.sh +41 -23
  453. package/dist/hooks/pre-tool-use.sh +54 -23
  454. package/dist/hooks/session-start.sh +68 -0
  455. package/dist/hooks/stop.sh +24 -10
  456. package/dist/hooks/user-prompt-submit.sh +37 -21
  457. package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
  458. package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
  459. package/dist/knowledge/adapters/go-adapter.js +294 -0
  460. package/dist/knowledge/adapters/go-adapter.js.map +1 -0
  461. package/dist/knowledge/adapters/index.d.ts +41 -0
  462. package/dist/knowledge/adapters/index.d.ts.map +1 -0
  463. package/dist/knowledge/adapters/index.js +71 -0
  464. package/dist/knowledge/adapters/index.js.map +1 -0
  465. package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
  466. package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
  467. package/dist/knowledge/adapters/java-adapter.js +260 -0
  468. package/dist/knowledge/adapters/java-adapter.js.map +1 -0
  469. package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
  470. package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
  471. package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
  472. package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
  473. package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
  474. package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
  475. package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
  476. package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
  477. package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
  478. package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
  479. package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
  480. package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
  481. package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
  482. package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
  483. package/dist/knowledge/adapters/python-adapter.js +358 -0
  484. package/dist/knowledge/adapters/python-adapter.js.map +1 -0
  485. package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
  486. package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
  487. package/dist/knowledge/adapters/rust-adapter.js +329 -0
  488. package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
  489. package/dist/knowledge/adapters/types.d.ts +99 -0
  490. package/dist/knowledge/adapters/types.d.ts.map +1 -0
  491. package/dist/knowledge/adapters/types.js +17 -0
  492. package/dist/knowledge/adapters/types.js.map +1 -0
  493. package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
  494. package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
  495. package/dist/knowledge/adapters/typescript-adapter.js +171 -0
  496. package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
  497. package/dist/knowledge/audit-applier.d.ts +70 -0
  498. package/dist/knowledge/audit-applier.d.ts.map +1 -0
  499. package/dist/knowledge/audit-applier.js +251 -0
  500. package/dist/knowledge/audit-applier.js.map +1 -0
  501. package/dist/knowledge/builder.d.ts +261 -0
  502. package/dist/knowledge/builder.d.ts.map +1 -0
  503. package/dist/knowledge/builder.js +937 -0
  504. package/dist/knowledge/builder.js.map +1 -0
  505. package/dist/knowledge/cli-provider.d.ts +151 -0
  506. package/dist/knowledge/cli-provider.d.ts.map +1 -0
  507. package/dist/knowledge/cli-provider.js +313 -0
  508. package/dist/knowledge/cli-provider.js.map +1 -0
  509. package/dist/knowledge/constants.d.ts +73 -0
  510. package/dist/knowledge/constants.d.ts.map +1 -0
  511. package/dist/knowledge/constants.js +93 -0
  512. package/dist/knowledge/constants.js.map +1 -0
  513. package/dist/knowledge/cross-module.d.ts +139 -0
  514. package/dist/knowledge/cross-module.d.ts.map +1 -0
  515. package/dist/knowledge/cross-module.js +370 -0
  516. package/dist/knowledge/cross-module.js.map +1 -0
  517. package/dist/knowledge/git-hooks.d.ts +67 -0
  518. package/dist/knowledge/git-hooks.d.ts.map +1 -0
  519. package/dist/knowledge/git-hooks.js +258 -0
  520. package/dist/knowledge/git-hooks.js.map +1 -0
  521. package/dist/knowledge/module-hash.d.ts +88 -0
  522. package/dist/knowledge/module-hash.d.ts.map +1 -0
  523. package/dist/knowledge/module-hash.js +162 -0
  524. package/dist/knowledge/module-hash.js.map +1 -0
  525. package/dist/knowledge/project-detector.d.ts +101 -0
  526. package/dist/knowledge/project-detector.d.ts.map +1 -0
  527. package/dist/knowledge/project-detector.js +223 -0
  528. package/dist/knowledge/project-detector.js.map +1 -0
  529. package/dist/knowledge/prompt.d.ts +228 -0
  530. package/dist/knowledge/prompt.d.ts.map +1 -0
  531. package/dist/knowledge/prompt.js +404 -0
  532. package/dist/knowledge/prompt.js.map +1 -0
  533. package/dist/knowledge/query.d.ts +105 -0
  534. package/dist/knowledge/query.d.ts.map +1 -0
  535. package/dist/knowledge/query.js +341 -0
  536. package/dist/knowledge/query.js.map +1 -0
  537. package/dist/knowledge/repo-map.d.ts +91 -0
  538. package/dist/knowledge/repo-map.d.ts.map +1 -0
  539. package/dist/knowledge/repo-map.js +408 -0
  540. package/dist/knowledge/repo-map.js.map +1 -0
  541. package/dist/knowledge/tools/index.d.ts +14 -0
  542. package/dist/knowledge/tools/index.d.ts.map +1 -0
  543. package/dist/knowledge/tools/index.js +11 -0
  544. package/dist/knowledge/tools/index.js.map +1 -0
  545. package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
  546. package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
  547. package/dist/knowledge/tools/knowledge-get-page.js +101 -0
  548. package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
  549. package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
  550. package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
  551. package/dist/knowledge/tools/knowledge-query.js +104 -0
  552. package/dist/knowledge/tools/knowledge-query.js.map +1 -0
  553. package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
  554. package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
  555. package/dist/knowledge/tools/repo-map-lookup.js +82 -0
  556. package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
  557. package/dist/knowledge/types.d.ts +269 -0
  558. package/dist/knowledge/types.d.ts.map +1 -0
  559. package/dist/knowledge/types.js +10 -0
  560. package/dist/knowledge/types.js.map +1 -0
  561. package/dist/knowledge/validator.d.ts +90 -0
  562. package/dist/knowledge/validator.d.ts.map +1 -0
  563. package/dist/knowledge/validator.js +288 -0
  564. package/dist/knowledge/validator.js.map +1 -0
  565. package/dist/mcp/server.d.ts.map +1 -1
  566. package/dist/mcp/server.js +222 -1
  567. package/dist/mcp/server.js.map +1 -1
  568. package/dist/skills/builtin-skills.d.ts +35 -0
  569. package/dist/skills/builtin-skills.d.ts.map +1 -0
  570. package/dist/skills/builtin-skills.js +68 -0
  571. package/dist/skills/builtin-skills.js.map +1 -0
  572. package/dist/skills/distill/attribution.d.ts +59 -0
  573. package/dist/skills/distill/attribution.d.ts.map +1 -0
  574. package/dist/skills/distill/attribution.js +101 -0
  575. package/dist/skills/distill/attribution.js.map +1 -0
  576. package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
  577. package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
  578. package/dist/skills/distill/claude-cli-resolver.js +115 -0
  579. package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
  580. package/dist/skills/distill/distiller.d.ts +161 -0
  581. package/dist/skills/distill/distiller.d.ts.map +1 -0
  582. package/dist/skills/distill/distiller.js +461 -0
  583. package/dist/skills/distill/distiller.js.map +1 -0
  584. package/dist/skills/distill/index.d.ts +223 -0
  585. package/dist/skills/distill/index.d.ts.map +1 -0
  586. package/dist/skills/distill/index.js +466 -0
  587. package/dist/skills/distill/index.js.map +1 -0
  588. package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
  589. package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
  590. package/dist/skills/distill/project-anchor-guard.js +334 -0
  591. package/dist/skills/distill/project-anchor-guard.js.map +1 -0
  592. package/dist/skills/distill/topic-deduper.d.ts +77 -0
  593. package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
  594. package/dist/skills/distill/topic-deduper.js +119 -0
  595. package/dist/skills/distill/topic-deduper.js.map +1 -0
  596. package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
  597. package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
  598. package/dist/skills/distill/upstream-fetcher.js +202 -0
  599. package/dist/skills/distill/upstream-fetcher.js.map +1 -0
  600. package/dist/skills/distilled/distilled-api-design.md +491 -0
  601. package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
  602. package/dist/skills/distilled/distilled-creator.md +178 -0
  603. package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
  604. package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
  605. package/dist/skills/distilled/distilled-executing-plans.md +113 -0
  606. package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
  607. package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
  608. package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
  609. package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
  610. package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
  611. package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
  612. package/dist/skills/keyword-score.d.ts +29 -0
  613. package/dist/skills/keyword-score.d.ts.map +1 -0
  614. package/dist/skills/keyword-score.js +54 -0
  615. package/dist/skills/keyword-score.js.map +1 -0
  616. package/dist/skills/registry.d.ts +64 -20
  617. package/dist/skills/registry.d.ts.map +1 -1
  618. package/dist/skills/registry.js +102 -105
  619. package/dist/skills/registry.js.map +1 -1
  620. package/dist/skills/tools/pipeline-suggest.js +14 -14
  621. package/dist/skills/tools/skill-invoke.d.ts +1 -1
  622. package/dist/skills/tools/skill-invoke.js +1 -1
  623. package/dist/web/routes/agent-content.d.ts +30 -0
  624. package/dist/web/routes/agent-content.d.ts.map +1 -0
  625. package/dist/web/routes/agent-content.js +139 -0
  626. package/dist/web/routes/agent-content.js.map +1 -0
  627. package/dist/web/routes/decisions.d.ts +15 -0
  628. package/dist/web/routes/decisions.d.ts.map +1 -0
  629. package/dist/web/routes/decisions.js +181 -0
  630. package/dist/web/routes/decisions.js.map +1 -0
  631. package/dist/web/routes/diagnostics.d.ts +61 -0
  632. package/dist/web/routes/diagnostics.d.ts.map +1 -0
  633. package/dist/web/routes/diagnostics.js +203 -0
  634. package/dist/web/routes/diagnostics.js.map +1 -0
  635. package/dist/web/routes/events.d.ts.map +1 -1
  636. package/dist/web/routes/events.js +24 -0
  637. package/dist/web/routes/events.js.map +1 -1
  638. package/dist/web/routes/health.d.ts +33 -0
  639. package/dist/web/routes/health.d.ts.map +1 -0
  640. package/dist/web/routes/health.js +37 -0
  641. package/dist/web/routes/health.js.map +1 -0
  642. package/dist/web/routes/insights.d.ts +0 -5
  643. package/dist/web/routes/insights.d.ts.map +1 -1
  644. package/dist/web/routes/insights.js +783 -2
  645. package/dist/web/routes/insights.js.map +1 -1
  646. package/dist/web/routes/knowledge.d.ts +16 -0
  647. package/dist/web/routes/knowledge.d.ts.map +1 -0
  648. package/dist/web/routes/knowledge.js +661 -0
  649. package/dist/web/routes/knowledge.js.map +1 -0
  650. package/dist/web/routes/patch.d.ts +60 -1
  651. package/dist/web/routes/patch.d.ts.map +1 -1
  652. package/dist/web/routes/patch.js +170 -64
  653. package/dist/web/routes/patch.js.map +1 -1
  654. package/dist/web/routes/pipeline.d.ts +37 -0
  655. package/dist/web/routes/pipeline.d.ts.map +1 -0
  656. package/dist/web/routes/pipeline.js +149 -0
  657. package/dist/web/routes/pipeline.js.map +1 -0
  658. package/dist/web/routes/rules.d.ts.map +1 -1
  659. package/dist/web/routes/rules.js +6 -1
  660. package/dist/web/routes/rules.js.map +1 -1
  661. package/dist/web/routes/sessions.d.ts.map +1 -1
  662. package/dist/web/routes/sessions.js +9 -1
  663. package/dist/web/routes/sessions.js.map +1 -1
  664. package/dist/web/routes/skill-content.d.ts +30 -0
  665. package/dist/web/routes/skill-content.d.ts.map +1 -0
  666. package/dist/web/routes/skill-content.js +117 -0
  667. package/dist/web/routes/skill-content.js.map +1 -0
  668. package/dist/web/routes/skills-distill.d.ts +29 -0
  669. package/dist/web/routes/skills-distill.d.ts.map +1 -0
  670. package/dist/web/routes/skills-distill.js +552 -0
  671. package/dist/web/routes/skills-distill.js.map +1 -0
  672. package/dist/web/routes/skills.js +7 -7
  673. package/dist/web/routes/skills.js.map +1 -1
  674. package/dist/web/routes/task-timeline.d.ts +102 -0
  675. package/dist/web/routes/task-timeline.d.ts.map +1 -0
  676. package/dist/web/routes/task-timeline.js +274 -0
  677. package/dist/web/routes/task-timeline.js.map +1 -0
  678. package/dist/web/routes/tasks.d.ts.map +1 -1
  679. package/dist/web/routes/tasks.js +355 -8
  680. package/dist/web/routes/tasks.js.map +1 -1
  681. package/dist/web/routes/trace.d.ts.map +1 -1
  682. package/dist/web/routes/trace.js +3 -2
  683. package/dist/web/routes/trace.js.map +1 -1
  684. package/dist/web/routes/types.d.ts +0 -4
  685. package/dist/web/routes/types.d.ts.map +1 -1
  686. package/dist/web/routes/types.js +1 -1
  687. package/dist/web/routes/types.js.map +1 -1
  688. package/dist/web/routes/violations.d.ts +14 -0
  689. package/dist/web/routes/violations.d.ts.map +1 -0
  690. package/dist/web/routes/violations.js +111 -0
  691. package/dist/web/routes/violations.js.map +1 -0
  692. package/dist/web/server.d.ts.map +1 -1
  693. package/dist/web/server.js +79 -19
  694. package/dist/web/server.js.map +1 -1
  695. package/dist/web/services/build-manager.d.ts +72 -0
  696. package/dist/web/services/build-manager.d.ts.map +1 -0
  697. package/dist/web/services/build-manager.js +189 -0
  698. package/dist/web/services/build-manager.js.map +1 -0
  699. package/dist/web/services/distill-manager.d.ts +125 -0
  700. package/dist/web/services/distill-manager.d.ts.map +1 -0
  701. package/dist/web/services/distill-manager.js +308 -0
  702. package/dist/web/services/distill-manager.js.map +1 -0
  703. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
  704. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
  705. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
  706. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
  707. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
  708. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
  709. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
  710. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
  711. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
  712. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
  713. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
  714. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
  715. package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
  716. package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
  717. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
  718. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
  719. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
  720. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
  721. package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
  722. package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
  723. package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
  724. package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
  725. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
  726. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
  727. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
  728. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
  729. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
  730. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
  731. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
  732. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
  733. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
  734. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
  735. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
  736. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
  737. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
  738. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
  739. package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
  740. package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
  741. package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
  742. package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
  743. package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
  744. package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
  745. package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
  746. package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
  747. package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
  748. package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
  749. package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
  750. package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
  751. package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
  752. package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
  753. package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
  754. package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
  755. package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
  756. package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
  757. package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
  758. package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
  759. package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
  760. package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
  761. package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
  762. package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
  763. package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
  764. package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
  765. package/dist/web/static/index.html +12 -8
  766. package/package.json +14 -3
  767. package/dist/core/ai/provider.d.ts +0 -63
  768. package/dist/core/ai/provider.d.ts.map +0 -1
  769. package/dist/core/ai/provider.js +0 -241
  770. package/dist/core/ai/provider.js.map +0 -1
  771. package/dist/core/ai/types.d.ts +0 -43
  772. package/dist/core/ai/types.d.ts.map +0 -1
  773. package/dist/core/ai/types.js +0 -5
  774. package/dist/core/ai/types.js.map +0 -1
  775. package/dist/core/storage/token-usage.d.ts +0 -36
  776. package/dist/core/storage/token-usage.d.ts.map +0 -1
  777. package/dist/core/storage/token-usage.js +0 -59
  778. package/dist/core/storage/token-usage.js.map +0 -1
  779. package/dist/core/utils/token-tracker.d.ts +0 -39
  780. package/dist/core/utils/token-tracker.d.ts.map +0 -1
  781. package/dist/core/utils/token-tracker.js +0 -69
  782. package/dist/core/utils/token-tracker.js.map +0 -1
  783. package/dist/skills/index.d.ts +0 -3
  784. package/dist/skills/index.d.ts.map +0 -1
  785. package/dist/skills/index.js +0 -3
  786. package/dist/skills/index.js.map +0 -1
  787. package/dist/skills/matcher.d.ts +0 -26
  788. package/dist/skills/matcher.d.ts.map +0 -1
  789. package/dist/skills/matcher.js +0 -113
  790. package/dist/skills/matcher.js.map +0 -1
  791. package/dist/skills/official/code-simplifier.md +0 -52
  792. package/dist/skills/official/find-skills.md +0 -142
  793. package/dist/skills/official/official-api-design.md +0 -30
  794. package/dist/skills/official/official-architecture-decision.md +0 -41
  795. package/dist/skills/official/official-bmad.md +0 -118
  796. package/dist/skills/official/official-db-schema-design.md +0 -34
  797. package/dist/skills/official/official-debug.md +0 -25
  798. package/dist/skills/official/official-doc-driven.md +0 -31
  799. package/dist/skills/official/official-harness-engineering.md +0 -108
  800. package/dist/skills/official/official-openspec.md +0 -89
  801. package/dist/skills/official/official-performance-optimization.md +0 -30
  802. package/dist/skills/official/official-pr-review.md +0 -35
  803. package/dist/skills/official/official-release-checklist.md +0 -30
  804. package/dist/skills/official/official-security-hardening.md +0 -32
  805. package/dist/skills/official/official-spec-driven-design.md +0 -31
  806. package/dist/skills/official/planning-with-files.md +0 -241
  807. package/dist/skills/official/ui-ux-pro-max.md +0 -105
  808. package/dist/skills/official/webapp-testing.md +0 -96
  809. package/dist/skills/official-skills.d.ts +0 -26
  810. package/dist/skills/official-skills.d.ts.map +0 -1
  811. package/dist/skills/official-skills.js +0 -74
  812. package/dist/skills/official-skills.js.map +0 -1
  813. package/dist/skills/semantic-matcher.d.ts +0 -60
  814. package/dist/skills/semantic-matcher.d.ts.map +0 -1
  815. package/dist/skills/semantic-matcher.js +0 -192
  816. package/dist/skills/semantic-matcher.js.map +0 -1
  817. package/dist/skills/upgrade-engine.d.ts +0 -93
  818. package/dist/skills/upgrade-engine.d.ts.map +0 -1
  819. package/dist/skills/upgrade-engine.js +0 -447
  820. package/dist/skills/upgrade-engine.js.map +0 -1
  821. package/dist/skills/upgrade-prompt.d.ts +0 -20
  822. package/dist/skills/upgrade-prompt.d.ts.map +0 -1
  823. package/dist/skills/upgrade-prompt.js +0 -75
  824. package/dist/skills/upgrade-prompt.js.map +0 -1
  825. package/dist/web/routes/ai.d.ts +0 -10
  826. package/dist/web/routes/ai.d.ts.map +0 -1
  827. package/dist/web/routes/ai.js +0 -186
  828. package/dist/web/routes/ai.js.map +0 -1
  829. package/dist/web/routes/token-usage.d.ts +0 -7
  830. package/dist/web/routes/token-usage.d.ts.map +0 -1
  831. package/dist/web/routes/token-usage.js +0 -18
  832. package/dist/web/routes/token-usage.js.map +0 -1
  833. package/dist/web/ssrf-guard.d.ts +0 -35
  834. package/dist/web/ssrf-guard.d.ts.map +0 -1
  835. package/dist/web/ssrf-guard.js +0 -93
  836. package/dist/web/ssrf-guard.js.map +0 -1
  837. package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
  838. package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
  839. package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
  840. package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
  841. package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
  842. package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
  843. package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
  844. package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
  845. package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
  846. package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
  847. package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
  848. package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
  849. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
  850. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
  851. package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
  852. package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
  853. package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
  854. package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
  855. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
  856. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
  857. package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
  858. package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
  859. package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
  860. package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
  861. package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
  862. package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
  863. package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
  864. package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
  865. package/dist/web/static/assets/index-CBX47X8l.js +0 -3
  866. package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
  867. package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
  868. package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
  869. package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
  870. package/dist/web/static/assets/query-C99w429o.js +0 -2
  871. package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
  872. package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
  873. package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
  874. package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
  875. package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
  876. package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
  877. package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
  878. package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
  879. package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
  880. package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
@@ -8,29 +8,77 @@
8
8
  * 4. Create event handlers and start socket server
9
9
  * 5. Handle graceful shutdown
10
10
  */
11
+ import { readFileSync } from 'node:fs';
11
12
  import { SocketServer } from './server.js';
12
- import { writePidFile, removePidFile, cleanSocket, getSocketPath, writeAuthToken, syncMcpToken, removeAuthToken, } from './lifecycle.js';
13
+ import { writePidFile, removePidFile, cleanSocket, getSocketPath, writeAuthToken, syncMcpToken, removeAuthToken, isAnotherDaemonListening, } from './lifecycle.js';
13
14
  import { routeEvent } from './router.js';
14
- import { logger } from '../core/utils/logger.js';
15
+ import { logger, enableFileLogging } from '../core/utils/logger.js';
15
16
  import { ConfigManager } from '../core/config.js';
16
17
  import { SQLiteStorage } from '../core/storage/sqlite.js';
17
18
  import { expandPath } from '../core/utils/path.js';
18
- import { ClaudeProvider } from '../core/ai/provider.js';
19
+ // D R-A (2026-05-29): ClaudeProvider import removed — daemon no longer
20
+ // instantiates ClaudeProvider at startup. SkillRegistry is now keyword-only
21
+ // and takes no args. Provider file itself is deleted in D R-D.
22
+ // See master spec 0902 §2.4.4 and src/skills/registry.ts (design rationale).
19
23
  import { TaskSegmenter } from './services/task-segmenter.js';
24
+ import { TaskBoundaryClassifier } from './services/task-boundary-classifier.js';
25
+ import { sweepIdleSessions } from './services/idle-session-sweeper.js';
26
+ import { sweepInterceptTimeouts } from './services/intercept-timeout-sweeper.js';
27
+ import { sweepEventTtl, resolveSweepConfig, DEFAULTS as TTL_DEFAULTS, } from './services/event-ttl-sweep.js';
20
28
  import { SkillRegistry } from '../skills/registry.js';
21
29
  import { InvocationGuard } from '../skills/invocation-guard.js';
22
30
  import { HistoryExporter } from './handlers/history-exporter.js';
23
31
  import { ResumeManager } from '../claudemd/resume-manager.js';
32
+ import { ViolationsManager } from '../claudemd/violations-manager.js';
24
33
  import { ConventionExtractor } from '../claudemd/convention-extractor.js';
25
34
  import { UserPromptHandler } from './handlers/user-prompt.js';
26
35
  import { PostToolUseHandler } from './handlers/post-tool-use.js';
27
36
  import { StopHandler } from './handlers/stop.js';
37
+ import { PreToolUseHandler } from './handlers/pre-tool-use.js';
38
+ import { SpecApproval } from './services/spec-approval.js';
39
+ import { RuleRegistry } from './rules/registry.js';
40
+ import { assertWhitelistInvariants } from './rules/whitelist.js';
28
41
  import { syncHooks } from './hook-sync.js';
29
42
  import { syncSkills } from './skill-sync.js';
43
+ import { syncAgents } from './agent-sync.js';
30
44
  import { replayQueue } from '../core/queue/index.js';
31
- import { DEFAULTS } from '../core/constants.js';
45
+ import { DEFAULTS, FORGE_PATHS } from '../core/constants.js';
32
46
  import { getUserPrompt } from '../core/event-fields.js';
47
+ // D-2: BuildManager is now lazy-loaded inside the `webEnabled` branch (L460-475)
48
+ // so the daemon has zero static edges into `src/web/`. The previous
49
+ // `import { buildManager } from '../web/services/build-manager.js'` lived here.
50
+ import { ConfigStore } from './config-store.js';
51
+ import { reviveInterceptIfStale } from './services/intercept-revive.js';
52
+ import { startHeartbeat } from './services/heartbeat-writer.js';
53
+ import { DECISION_MAKER_COOLDOWN_CONFIG_KEY, DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS, MAX_DECISION_MAKER_COOLDOWN_SECONDS, } from './services/decision-hint.js';
54
+ // F12: module-level mutex shared by all 3 maintenance setInterval handlers.
55
+ // Prevents SQLite "database is locked" when sleep/wake fires multiple cron
56
+ // timers in the same tick. Pure JS flag — single-threaded event loop keeps
57
+ // check-and-set atomic.
58
+ let isMaintenanceRunning = false;
33
59
  export async function startDaemon(foreground = false, options = {}) {
60
+ // ── 0pre. Anti-recursion guard ──────────────────────────────────────────────
61
+ // Refuse to boot a second daemon from inside an internal subprocess marked
62
+ // with CLAUDE_FORGE_INTERNAL=1. Guards against a misconfigured user hook
63
+ // accidentally invoking `cf daemon start` from a spawned child — otherwise
64
+ // we'd have two daemons fighting over the same socket. Defensive: nothing in
65
+ // the current codebase sets this env, but the check is cheap insurance.
66
+ if (process.env.CLAUDE_FORGE_INTERNAL === '1') {
67
+ console.error('[daemon] refusing to start under CLAUDE_FORGE_INTERNAL=1');
68
+ process.exit(0);
69
+ }
70
+ // ── 0a. File logging wire (Stage D, 2026-05-27) ────────────────────────────
71
+ // MUST be the first thing in startDaemon — before any logger.* call AND
72
+ // before the uncaughtException/unhandledRejection handlers (which log via
73
+ // `logger.error`). The default stderr-only sink is swallowed in detached
74
+ // production mode (stdout/stderr → /dev/null) and that's why subsystem
75
+ // startup lines (`[ConfigStore] Seeded N keys`, `[InterceptRevive] ...`,
76
+ // etc.) never landed on disk. The dev-daemon.sh wrapper hides this bug by
77
+ // shell-redirecting `2> daemon-dev.log` but real `cf daemon start` users
78
+ // see nothing. Skip when FORGE_DAEMON_DISABLE_FILE_LOG=1 (tests / CI).
79
+ if (process.env.FORGE_DAEMON_DISABLE_FILE_LOG !== '1') {
80
+ enableFileLogging(FORGE_PATHS.daemonLog());
81
+ }
34
82
  // ── 0. Global Exception Handlers ───────────────────────────────────────────
35
83
  process.on('uncaughtException', (err) => {
36
84
  logger.error(`[Daemon] Uncaught exception: ${err.message}`);
@@ -44,7 +92,55 @@ export async function startDaemon(foreground = false, options = {}) {
44
92
  // Log level is auto-parsed from LOG_LEVEL env var at logger module load time.
45
93
  const config = new ConfigManager().get();
46
94
  logger.info('Claude Forge daemon starting...');
95
+ // ── 1a. Deprecated env detection (spec 1851 R-A User Decisions Q7) ─────────
96
+ // The Phase B `CF_SKILL_DISTILLER_AGENT=1` toggle was removed in R-A; the
97
+ // env is now silently ignored. Warn users so they remove it from their rc
98
+ // / launchd plist before R-D removes the warning altogether.
99
+ if (process.env.CF_SKILL_DISTILLER_AGENT) {
100
+ logger.warn('[daemon] env CF_SKILL_DISTILLER_AGENT detected — this flag is deprecated ' +
101
+ 'and has no effect. Distill now uses claude CLI shell-out unconditionally. ' +
102
+ 'Please unset it from your shell rc / launchd plist.');
103
+ }
104
+ // ── 1.5. Whitelist self-test (Phase 2c safety-net) ────────────────────────
105
+ // Fail-fast at boot if the enforcement whitelist regresses — better than
106
+ // letting the user discover that `cf bypass` itself is denied on first use.
107
+ try {
108
+ assertWhitelistInvariants();
109
+ logger.debug('[Whitelist] self-test passed');
110
+ }
111
+ catch (err) {
112
+ logger.error(`[Whitelist] self-test FAILED: ${err}`);
113
+ throw err;
114
+ }
115
+ // ── 1.6. Global governance protocol injection (decision 7fa0f2ab) ─────────
116
+ // Idempotently write the DECISION HINT protocol contract into the global
117
+ // ~/.claude/CLAUDE.md so Claude in *other* projects knows to spawn
118
+ // decision-maker. Fail-silent: a write error here must never block daemon
119
+ // startup. Skip when FORGE_DAEMON_SKIP_GLOBAL_INJECT=1 (tests / CI).
120
+ if (process.env.FORGE_DAEMON_SKIP_GLOBAL_INJECT !== '1') {
121
+ try {
122
+ const { injectGlobalGovernance } = await import('../core/governance/global-inject.js');
123
+ const res = injectGlobalGovernance();
124
+ logger.debug(`[Governance] global inject ${res.action} (${res.path})`);
125
+ }
126
+ catch (err) {
127
+ logger.warn(`[Governance] global inject failed (continuing): ${err}`);
128
+ }
129
+ }
47
130
  // ── 2. Lifecycle (PID, socket, auth token) ─────────────────────────────────
131
+ // Single-instance guard (task-link orphan fix, 2026-06-02). MUST run BEFORE
132
+ // cleanSocket() — if a healthy daemon is already accepting on the socket, a
133
+ // second instance (typically launchd re-spawn after a prior EADDRINUSE crash)
134
+ // would otherwise unlink + re-bind the live socket, steal it, then die on the
135
+ // web port. That orphaned socket breaks every hook `nc` connect → events get
136
+ // queued instead of delivered and tasks freeze at "0 events". We exit 0
137
+ // (clean) so launchd's KeepAlive.SuccessfulExit=false does NOT immediately
138
+ // re-spawn us, breaking the 10s crash loop.
139
+ if (await isAnotherDaemonListening()) {
140
+ logger.warn('[Daemon] Another daemon is already listening on the socket — aborting ' +
141
+ 'startup to avoid socket theft (single-instance guard). Exiting cleanly.');
142
+ process.exit(0);
143
+ }
48
144
  cleanSocket();
49
145
  writePidFile();
50
146
  const authToken = writeAuthToken();
@@ -54,6 +150,43 @@ export async function startDaemon(foreground = false, options = {}) {
54
150
  const dbPath = expandPath(config.storage.path);
55
151
  const storage = new SQLiteStorage(dbPath);
56
152
  logger.info(`Storage initialized: ${dbPath}`);
153
+ // ── 3.45. Seed feature-flag defaults (v9.x Phase 0) ───────────────────────
154
+ // Insert any missing flags from DEFAULT_FLAGS; user-edited values via
155
+ // `cf config set ...` are preserved (only writes when key is absent).
156
+ // ConfigStore is instantiated once here and shared with handlers that need
157
+ // to probe flags at request time (e.g. PreToolUseHandler).
158
+ const configStore = new ConfigStore(storage);
159
+ try {
160
+ const seeded = configStore.seedDefaults();
161
+ if (seeded > 0) {
162
+ logger.info(`[ConfigStore] Seeded ${seeded} default feature flag(s)`);
163
+ }
164
+ else {
165
+ logger.debug('[ConfigStore] All default feature flags already present');
166
+ }
167
+ }
168
+ catch (err) {
169
+ logger.warn(`[ConfigStore] seedDefaults failed: ${err}`);
170
+ }
171
+ // ── 3.46. Intercept Revive (8-in-1 Phase D, 2026-05-27) ───────────────────
172
+ // If `InterceptRollbackGuard` auto-disabled `pre_tool_intercept.enabled`
173
+ // more than 24h ago and the user never manually re-enabled it, flip it back
174
+ // on. Without this, the rollback guard is a one-way trap — the user has
175
+ // to remember to run `cf config set ...` which (per spec § Problem
176
+ // statement) they never did. Manual disables (no `auto_disabled_at` audit
177
+ // key) are left alone.
178
+ try {
179
+ const outcome = reviveInterceptIfStale(configStore);
180
+ if (outcome.revived) {
181
+ logger.info(`[InterceptRevive] ${outcome.reason}`);
182
+ }
183
+ else {
184
+ logger.debug(`[InterceptRevive] no-op: ${outcome.reason}`);
185
+ }
186
+ }
187
+ catch (err) {
188
+ logger.warn(`[InterceptRevive] startup call failed (non-fatal): ${err}`);
189
+ }
57
190
  // ── 3.5. Auto-sync hooks ────────────────────────────────────────────────
58
191
  // npm upgrade 不会自动更新 ~/.claude-forge/hooks/,每次 daemon 启动
59
192
  // 用 SHA-256 比对源 dist/hooks 与本地副本,不一致则覆盖。
@@ -63,57 +196,195 @@ export async function startDaemon(foreground = false, options = {}) {
63
196
  catch (err) {
64
197
  logger.warn(`[HookSync] unexpected error: ${err}`);
65
198
  }
66
- // ── 3.6. Auto-sync official skills ─────────────────────────────────────
199
+ // ── 3.6. Auto-sync built-in distilled skills ───────────────────────────
67
200
  // npm upgrade 不会自动更新 ~/.claude/skills/,每次 daemon 启动
68
- // 用 SHA-256 比对 dist/skills/official 与本地副本,不一致则覆盖。
201
+ // 用 SHA-256 比对 dist/skills/distilled 与本地副本,不一致则覆盖。
69
202
  try {
70
203
  syncSkills();
71
204
  }
72
205
  catch (err) {
73
206
  logger.warn(`[SkillSync] unexpected error: ${err}`);
74
207
  }
75
- // ── 4. AI Provider ─────────────────────────────────────────────────────────
76
- const apiKey = config.ai.api_key || process.env.ANTHROPIC_API_KEY || '';
77
- if (!apiKey) {
78
- logger.warn('No API key configured AI features disabled');
208
+ // ── 3.7. Auto-sync project-specific agent prompts ───────────────────────
209
+ // npm upgrade / fresh npm install 不会自动填充 ~/.claude/agents/。每次 daemon
210
+ // 启动用 SHA-256 比对 dist/daemon/templates/agents/ 与本地副本,不一致则覆盖。
211
+ // 用户自己加的 my-*.md 不在 source list 始终保留。
212
+ try {
213
+ syncAgents();
79
214
  }
80
- const ai = apiKey
81
- ? new ClaudeProvider(apiKey, config.ai.model, config.ai.base_url)
82
- : null;
83
- // ── 5. Initialize services ─────────────────────────────────────────────────
84
- const skillApiKey = config.skill_matching?.api_key || apiKey;
85
- const skillRegistry = new SkillRegistry(skillApiKey, config.ai.model, config.ai.base_url);
86
- const invocationGuard = new InvocationGuard();
87
- if (skillApiKey) {
88
- logger.info('[Skills] Registry loaded with semantic matching support');
215
+ catch (err) {
216
+ logger.warn(`[AgentSync] unexpected error: ${err}`);
89
217
  }
90
- else {
91
- logger.info('[Skills] Registry loaded (keyword matching)');
218
+ // ── 4. AI Provider (DELETED — D R-A → R-D, 2026-05-29) ────────────────────
219
+ // The daemon used to instantiate a ClaudeProvider here for two reasons:
220
+ // (a) emit `[AI Stats]` on shutdown (dead log — no consumers, removed)
221
+ // (b) hand model/base_url to the (now-deleted) semantic skill matcher
222
+ // Master spec 0902 §2.4.4 (decision f5a5b030 / Option B 彻底) eliminates
223
+ // both: distill / claudemd / knowledge / patch now shell out to the
224
+ // `claude` CLI (sub-specs A/B/C R-B already landed). SkillRegistry is
225
+ // keyword-only. D R-D (this commit) deleted `src/core/ai/provider.ts`
226
+ // outright and the `ai.*` / `skill_matching.*` config schema.
227
+ // Design rationale for the keyword-only switch lives in
228
+ // `src/skills/registry.ts` (single source of truth — decision 3baa0e7c).
229
+ //
230
+ // Migration warn: if the user still has `ai:` or `skill_matching:` in the
231
+ // raw yaml, or `ANTHROPIC_API_KEY` exported, tell them it's deprecated and
232
+ // has no effect. We re-read the raw yaml here (rather than the typed
233
+ // `config`) because the schema no longer holds those fields.
234
+ try {
235
+ const rawCfg = readFileSync(FORGE_PATHS.config(), 'utf-8');
236
+ const legacyAiKey = /^\s*ai\s*:/m.test(rawCfg);
237
+ const legacySkillMatchKey = /^\s*skill_matching\s*:/m.test(rawCfg);
238
+ const legacyApiKeyEnv = !!process.env.ANTHROPIC_API_KEY;
239
+ if (legacyAiKey || legacySkillMatchKey || legacyApiKeyEnv) {
240
+ const sources = [];
241
+ if (legacyAiKey)
242
+ sources.push('config.ai.api_key');
243
+ if (legacySkillMatchKey)
244
+ sources.push('config.skill_matching.api_key');
245
+ if (legacyApiKeyEnv)
246
+ sources.push('ANTHROPIC_API_KEY env');
247
+ logger.warn(`[daemon] ${sources.join(' + ')} detected — these are deprecated ` +
248
+ 'and have no effect after spec 0902 (decision f5a5b030). Distill / ' +
249
+ 'claudemd / knowledge build / patch now use claude CLI shell-out, ' +
250
+ 'and SkillRegistry is keyword-only. Remove from config.yaml + ' +
251
+ 'shell rc to silence this warning.');
252
+ }
253
+ }
254
+ catch {
255
+ // No config.yaml or read error → nothing to warn about.
256
+ }
257
+ // ── 4.7. decision 7aa0ec63 (2026-06-01) — cooldown config validation ────
258
+ // If forge_config.decision_maker_cooldown_seconds is present but holds an
259
+ // out-of-range value (≤ 0 or > MAX_DECISION_MAKER_COOLDOWN_SECONDS) or a
260
+ // non-number, the resolver silently falls back to the default. Warn once at
261
+ // boot so the user notices typos instead of wondering why their override
262
+ // had no effect.
263
+ try {
264
+ const raw = storage.readConfig(DECISION_MAKER_COOLDOWN_CONFIG_KEY);
265
+ if (raw !== undefined && raw !== null) {
266
+ const n = Number(raw);
267
+ const invalid = !Number.isFinite(n) ||
268
+ n <= 0 ||
269
+ n > MAX_DECISION_MAKER_COOLDOWN_SECONDS;
270
+ if (invalid) {
271
+ logger.warn(`[daemon] forge_config.${DECISION_MAKER_COOLDOWN_CONFIG_KEY}=${String(raw)} ` +
272
+ `is out of range (0, ${MAX_DECISION_MAKER_COOLDOWN_SECONDS}]; ` +
273
+ `falling back to default ${DEFAULT_DECISION_MAKER_COOLDOWN_SECONDS}s. ` +
274
+ `Set a valid value via \`cf config set ${DECISION_MAKER_COOLDOWN_CONFIG_KEY} <seconds>\`.`);
275
+ }
276
+ }
92
277
  }
278
+ catch (err) {
279
+ logger.debug(`[daemon] cooldown config probe failed (non-fatal): ${err}`);
280
+ }
281
+ // ── 5. Initialize services ─────────────────────────────────────────────────
282
+ // D R-B (spec 0902): SkillRegistry is keyword-only — no args. The legacy
283
+ // `skill_matching.api_key` field is silently ignored (warned above) and
284
+ // will be removed from the JSON schema in D R-D.
285
+ const skillRegistry = new SkillRegistry();
286
+ const invocationGuard = new InvocationGuard();
287
+ logger.info('[Skills] Registry loaded (keyword matching)');
93
288
  logger.info('[Skills] InvocationGuard ready (idempotent + depth/total limits)');
94
289
  const exporter = new HistoryExporter(storage);
95
290
  const resume = new ResumeManager(storage);
291
+ const violationsManager = new ViolationsManager();
96
292
  const conventionExtractor = new ConventionExtractor();
97
293
  const taskSegmenter = new TaskSegmenter(storage);
98
- logger.info('[Services] Initialized: ResumeManager, TaskSegmenter, SkillRegistry');
294
+ // decision 265f59d5 (2026-06-08): async LLM boundary classifier. Fire-and-
295
+ // forget — NEVER awaited on the UserPromptSubmit hot path. Only spawns claude
296
+ // for prompts the sync segmenter flagged ambiguous (~30%).
297
+ const boundaryClassifier = new TaskBoundaryClassifier();
298
+ // Orphan-event robustness fix (2026-06-01): proactively rebuild the
299
+ // in-memory currentTasks map from the DB so events arriving right after a
300
+ // daemon restart (buffered + replayed) hit the fast currentTasks path
301
+ // instead of relying on per-event lazy recovery. Idempotent + fault-tolerant.
302
+ taskSegmenter.hydrateActiveTasks();
303
+ logger.info('[Services] Initialized: ResumeManager, ViolationsManager, TaskSegmenter, SkillRegistry');
304
+ // ── 5.45. Heartbeat writer (watchdog spec 0843) ───────────────────────────
305
+ // Writes ~/.claude-forge/daemon.heartbeat every 60s via atomic rename.
306
+ // Removed on graceful shutdown so ensure-running detects the gap.
307
+ let daemonVersion = 'unknown';
308
+ try {
309
+ const pkgUrl = new URL('../../package.json', import.meta.url);
310
+ const { createRequire } = await import('node:module');
311
+ const req = createRequire(import.meta.url);
312
+ const pkg = req(pkgUrl.pathname);
313
+ daemonVersion = pkg.version;
314
+ }
315
+ catch { /* version string is nice-to-have, not critical */ }
316
+ const heartbeatHandle = startHeartbeat({ version: daemonVersion });
317
+ logger.info('[Heartbeat] writer started (60s interval)');
99
318
  // ── 5.5. Schedule daily maintenance ────────────────────────────────────────
100
- // Clean old fact-table data every 24 hours (events / routing / skills / tokens).
319
+ // Clean old fact-table data every 24 hours (events / routing / skills).
101
320
  const MAINTENANCE_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
102
321
  const maintenanceInterval = setInterval(() => {
103
- logger.info('[Daemon] Running daily maintenance: cleaning old fact-table data');
322
+ if (isMaintenanceRunning) {
323
+ logger.warn('[Daemon] maintenance already running, skipping daily cron');
324
+ return;
325
+ }
326
+ isMaintenanceRunning = true;
104
327
  try {
105
- const r = storage.cleanOldData(30);
106
- logger.info(`[Daemon] cleanOldData: events=${r.events}, routing=${r.routing}, skills=${r.skills}, tokens=${r.tokens}`);
328
+ logger.info('[Daemon] Running daily maintenance: cleaning old fact-table data');
329
+ try {
330
+ const r = storage.cleanOldData(30);
331
+ logger.info(`[Daemon] cleanOldData: events=${r.events}, taskEvents=${r.taskEvents}, routing=${r.routing}, skills=${r.skills}`);
332
+ }
333
+ catch (err) {
334
+ logger.error(`[Daemon] Maintenance failed: ${err}`);
335
+ }
336
+ // Phase 9.5: sweep idle un-classified sessions (no Stop hook fired).
337
+ // Logs only when something actually moves, so the steady-state daily line
338
+ // stays quiet.
339
+ try {
340
+ const s = sweepIdleSessions(storage);
341
+ if (s.swept > 0 || s.errors > 0) {
342
+ logger.info(`[Daemon] idleSweeper: scanned=${s.scanned} swept=${s.swept} errors=${s.errors}`);
343
+ }
344
+ }
345
+ catch (err) {
346
+ logger.error(`[Daemon] idleSweeper failed: ${err}`);
347
+ }
107
348
  }
108
- catch (err) {
109
- logger.error(`[Daemon] Maintenance failed: ${err}`);
349
+ finally {
350
+ isMaintenanceRunning = false;
110
351
  }
111
352
  }, MAINTENANCE_INTERVAL);
112
353
  logger.info('[Daemon] Scheduled daily maintenance (clean fact-table data older than 30 days)');
354
+ // Run initial cleanup 60s after startup (covers frequent-restart scenarios)
355
+ const initialCleanupTimeout = setTimeout(() => {
356
+ try {
357
+ const r = storage.cleanOldData(30);
358
+ const total = r.events + r.taskEvents + r.routing + r.skills;
359
+ if (total > 0) {
360
+ logger.info(`[Daemon] Initial cleanup: events=${r.events}, taskEvents=${r.taskEvents}, routing=${r.routing}, skills=${r.skills}`);
361
+ }
362
+ }
363
+ catch (err) {
364
+ logger.warn(`[Daemon] Initial cleanup failed: ${err}`);
365
+ }
366
+ // Phase 9.5: also run an initial sweep at startup so frequent daemon
367
+ // restarts don't let abandoned sessions accumulate for a full day.
368
+ try {
369
+ const s = sweepIdleSessions(storage);
370
+ if (s.swept > 0 || s.errors > 0) {
371
+ logger.info(`[Daemon] Initial idleSweeper: scanned=${s.scanned} swept=${s.swept} errors=${s.errors}`);
372
+ }
373
+ }
374
+ catch (err) {
375
+ logger.warn(`[Daemon] Initial idleSweeper failed: ${err}`);
376
+ }
377
+ }, 60_000);
378
+ initialCleanupTimeout.unref?.();
113
379
  // ── 5.5.1. Schedule weekly VACUUM (every 7 days) ───────────────────────────
114
380
  // VACUUM 重写整库,释放页空间。频率 7 天足以应对一般负载。
115
381
  const VACUUM_INTERVAL = 7 * 24 * 60 * 60 * 1000;
116
382
  const vacuumInterval = setInterval(() => {
383
+ if (isMaintenanceRunning) {
384
+ logger.warn('[Daemon] maintenance already running, skipping weekly VACUUM');
385
+ return;
386
+ }
387
+ isMaintenanceRunning = true;
117
388
  try {
118
389
  // 500 MB 阈值:低于此值不 VACUUM(避免空转的 fsync 抖动)。
119
390
  storage.runMaintenance(500);
@@ -121,28 +392,135 @@ export async function startDaemon(foreground = false, options = {}) {
121
392
  catch (err) {
122
393
  logger.error(`[Daemon] VACUUM failed: ${err}`);
123
394
  }
395
+ finally {
396
+ isMaintenanceRunning = false;
397
+ }
124
398
  }, VACUUM_INTERVAL);
125
399
  logger.info('[Daemon] Scheduled weekly VACUUM (threshold: 500MB)');
400
+ // ── 5.5.2. Event TTL sweep (db-size optimization 2026-05-26) ─────────────
401
+ // Two-tier sweep: warm = NULL `tool_input`, cold = DELETE row. Both bounds
402
+ // are configurable via forge_config (events.warm_ttl_days /
403
+ // events.cold_ttl_days / events.sweep_interval_hours). See
404
+ // src/daemon/services/event-ttl-sweep.ts for full design.
405
+ const ttlSweepCfg = resolveSweepConfig(configStore);
406
+ const ttlSweepIntervalHours = (() => {
407
+ const raw = configStore.get('events.sweep_interval_hours');
408
+ const n = raw === undefined ? TTL_DEFAULTS.sweepIntervalHours : Number(raw);
409
+ return Number.isFinite(n) && n > 0 ? n : TTL_DEFAULTS.sweepIntervalHours;
410
+ })();
411
+ const EVENT_TTL_INTERVAL = ttlSweepIntervalHours * 60 * 60 * 1000;
412
+ const eventTtlInterval = setInterval(() => {
413
+ if (isMaintenanceRunning) {
414
+ logger.warn('[Daemon] maintenance already running, skipping event TTL sweep');
415
+ return;
416
+ }
417
+ isMaintenanceRunning = true;
418
+ try {
419
+ const r = sweepEventTtl(storage, configStore);
420
+ if (r.warmedNull > 0 || r.coldDeleted > 0) {
421
+ logger.info(`[EventTTL] sweep: warmedNull=${r.warmedNull} coldDeleted=${r.coldDeleted} taskEventsPruned=${r.taskEventsPruned} morePending=${r.morePending}`);
422
+ }
423
+ }
424
+ catch (err) {
425
+ logger.error(`[EventTTL] sweep failed: ${err}`);
426
+ }
427
+ finally {
428
+ isMaintenanceRunning = false;
429
+ }
430
+ }, EVENT_TTL_INTERVAL);
431
+ logger.info(`[Daemon] Scheduled event TTL sweep every ${ttlSweepIntervalHours}h (warm=${ttlSweepCfg.warmTtlDays}d, cold=${ttlSweepCfg.coldTtlDays}d)`);
432
+ // Initial event TTL sweep ~90s after startup so frequent daemon restarts
433
+ // don't sit on backlog for a full interval. Skipped when isMaintenanceRunning
434
+ // is set (rare in practice but defensive).
435
+ const initialEventTtlTimeout = setTimeout(() => {
436
+ if (isMaintenanceRunning)
437
+ return;
438
+ isMaintenanceRunning = true;
439
+ try {
440
+ const r = sweepEventTtl(storage, configStore);
441
+ if (r.warmedNull > 0 || r.coldDeleted > 0) {
442
+ logger.info(`[EventTTL] initial sweep: warmedNull=${r.warmedNull} coldDeleted=${r.coldDeleted} taskEventsPruned=${r.taskEventsPruned}`);
443
+ }
444
+ }
445
+ catch (err) {
446
+ logger.warn(`[EventTTL] initial sweep failed: ${err}`);
447
+ }
448
+ finally {
449
+ isMaintenanceRunning = false;
450
+ }
451
+ }, 90_000);
452
+ initialEventTtlTimeout.unref?.();
126
453
  // ── 5.6. Stale task GC (every 5 minutes) ──────────────────────────────────
127
454
  const STALE_TASK_GC_INTERVAL = 5 * 60 * 1000; // 5 分钟
128
455
  const STALE_TASK_IDLE_MINUTES = 10; // idle 超 10 分钟视为滞留
129
456
  const staleTaskGcInterval = setInterval(() => {
457
+ if (isMaintenanceRunning) {
458
+ logger.warn('[Maintenance] maintenance already running, skipping stale task GC');
459
+ return;
460
+ }
461
+ isMaintenanceRunning = true;
130
462
  try {
131
463
  const closed = storage.completeStaleActiveTasks(STALE_TASK_IDLE_MINUTES);
132
- if (closed > 0) {
133
- logger.info(`[Maintenance] Auto-completed ${closed} stale active task(s)`);
464
+ if (closed.length > 0) {
465
+ // decision c6613590 P0 缺陷 B: evict GC'd tasks from the segmenter's
466
+ // in-memory currentTasks map so no dangling pointer keeps dragging a
467
+ // closed task's end_time forward (which merged independent prompts).
468
+ const evicted = taskSegmenter.evictTasks(closed);
469
+ logger.info(`[Maintenance] Auto-completed ${closed.length} stale active task(s)` +
470
+ ` (evicted ${evicted} from in-memory map)`);
134
471
  }
135
472
  }
136
473
  catch (err) {
137
474
  logger.error(`[Maintenance] Stale task GC failed: ${err}`);
138
475
  }
476
+ // C4 hotfix (2026-05-26): backfill NULL-outcome deny/dry_run rows that
477
+ // aged past the 1h grace beyond the 30s PostToolUse window. "Passive
478
+ // obey" — main thread saw the hint, stopped to think, never re-invoked
479
+ // any tool inside the classification window. Without this sweep the
480
+ // NULL rows persist forever, pinning the C4 numerator to 0.
481
+ try {
482
+ const s = sweepInterceptTimeouts(storage);
483
+ if (s.swept > 0) {
484
+ logger.info(`[Maintenance] InterceptTimeoutSweeper: swept ${s.swept} NULL → obeyed (passive obey)`);
485
+ }
486
+ }
487
+ catch (err) {
488
+ logger.error(`[Maintenance] InterceptTimeoutSweeper failed: ${err}`);
489
+ }
490
+ finally {
491
+ isMaintenanceRunning = false;
492
+ }
139
493
  }, STALE_TASK_GC_INTERVAL);
140
494
  // ── 6. Create handlers ─────────────────────────────────────────────────────
141
- const userPromptHandler = new UserPromptHandler(resume, conventionExtractor, storage, skillRegistry);
495
+ // Phase 5: shared RuleRegistry so PreToolUse sees the same rule set.
496
+ const ruleRegistry = new RuleRegistry();
497
+ // ── 6.2. v9.x Phase 2b — Spec Approval ─────────────────────────────────
498
+ // SpecGenerator removed (Spec 1702: 0% real-world acceptance → dead code).
499
+ // SpecApproval retained for the hand-written path: planner agent calls
500
+ // `cf spec register`, user replies "批准 <token>" → daemon short-circuits.
501
+ const specApproval = new SpecApproval(storage);
502
+ // Spec 1200 (2026-05-28): IntentEngine + WorkflowRecommender removed.
503
+ // Decision 3baa0e7c Batch 1 (2026-06-01): deprecated `_workflowRecommender`
504
+ // and `_intentEngine` ctor positions cleaned up; specApproval now arg 5.
505
+ const userPromptHandler = new UserPromptHandler(resume, conventionExtractor, storage, skillRegistry, specApproval);
506
+ // Phase 1: PreToolUseHandler runs in dry_run mode unless
507
+ // `pre_tool_intercept.enabled` is flipped on via `cf config set`.
508
+ // Phase 5: same registry is shared so the workflow-recommendation-mismatch
509
+ // deny rule + pending_workflow_rec lookup work end-to-end.
510
+ //
511
+ // Constructed BEFORE StopHandler so the latter can receive it as its 8th
512
+ // arg for the D-1 clearSession wiring (memory-leak fix).
513
+ const preToolUseHandler = new PreToolUseHandler(storage, configStore, ruleRegistry);
142
514
  const handlers = {
143
515
  UserPromptSubmit: userPromptHandler,
144
- PostToolUse: new PostToolUseHandler(storage),
145
- Stop: new StopHandler(exporter, resume, taskSegmenter, storage, invocationGuard, userPromptHandler),
516
+ // Phase 6: configStore wired so agent_writeback.enabled flag is probed
517
+ // on every Write/Edit (default OFF; opt-in via `cf config set`).
518
+ PostToolUse: new PostToolUseHandler(storage, configStore),
519
+ Stop: new StopHandler(exporter, resume, taskSegmenter, storage, invocationGuard, userPromptHandler, violationsManager,
520
+ // D-1: clearSession on PreToolUseHandler.editedFilesCache at Stop time
521
+ // (fixes per-session Set leak across long-running daemons).
522
+ preToolUseHandler),
523
+ PreToolUse: preToolUseHandler,
146
524
  };
147
525
  // ── 7. Event handler ───────────────────────────────────────────────────────
148
526
  const handleEvent = async (event) => {
@@ -165,15 +543,27 @@ export async function startDaemon(foreground = false, options = {}) {
165
543
  // Task segmentation: UserPromptSubmit starts/continues tasks
166
544
  const prompt = getUserPrompt(event);
167
545
  if (event.hook_type === 'UserPromptSubmit' && prompt) {
168
- taskSegmenter.processPrompt(event.session_id, prompt, event.timestamp, event.event_id);
546
+ const decision = taskSegmenter.processPromptWithBoundary(event.session_id, prompt, event.timestamp, event.event_id);
547
+ // decision 265f59d5: ambiguous merge → hand off to the async LLM
548
+ // classifier. fire-and-forget: NOT awaited, never blocks the hook
549
+ // response. The classifier internally re-checks idempotency + the
550
+ // event's current FK before any re-attribution.
551
+ if (decision.ambiguous) {
552
+ void boundaryClassifier.classify(decision.ambiguous, storage);
553
+ }
169
554
  }
170
555
  else if (event.event_id) {
171
- taskSegmenter.linkEvent(event.session_id, event.event_id);
172
- }
173
- // PreToolUse: always allow (governance removed)
174
- if (event.hook_type === 'PreToolUse') {
175
- return { allow: true };
556
+ // Spec 1713 §10.3: forward hookType / toolName so the segmenter can
557
+ // detect sub-agent return (PostToolUse Task/Agent) and arm the
558
+ // "next prompt = new task" flag.
559
+ taskSegmenter.linkEvent(event.session_id, event.event_id, event.timestamp, {
560
+ hookType: event.hook_type,
561
+ toolName: event.tool_name,
562
+ });
176
563
  }
564
+ // PreToolUse / PostToolUse / UserPromptSubmit / Stop all routed via routeEvent.
565
+ // PreToolUse now goes through PreToolUseHandler (Phase 1 rule engine),
566
+ // which honors `pre_tool_intercept.enabled` flag (dry_run when OFF).
177
567
  const result = await routeEvent(event, handlers);
178
568
  if (result) {
179
569
  const handlerName = event.hook_type + 'Handler';
@@ -217,7 +607,21 @@ export async function startDaemon(foreground = false, options = {}) {
217
607
  // setImmediate ensures the event loop has had a chance to process the listen
218
608
  // callback before we touch storage (not strictly required, but defensive).
219
609
  setImmediate(() => {
220
- replayQueue(storage).then(({ replayed, skipped, dead }) => {
610
+ replayQueue(storage, {
611
+ // Mirror handleEvent line 480-484: feed replayed UserPromptSubmit events
612
+ // into TaskSegmenter so the tasks table gets populated. We do NOT route
613
+ // through full handleEvent — KB inject / decision-hint / skill-match
614
+ // would all be stale (no live hook is waiting on the response).
615
+ onReplayed: (event) => {
616
+ const prompt = getUserPrompt(event);
617
+ if (event.hook_type === 'UserPromptSubmit' && prompt) {
618
+ taskSegmenter.processPrompt(event.session_id, prompt, event.timestamp, event.event_id);
619
+ }
620
+ else if (event.event_id) {
621
+ taskSegmenter.linkEvent(event.session_id, event.event_id, event.timestamp);
622
+ }
623
+ },
624
+ }).then(({ replayed, skipped, dead }) => {
221
625
  if (replayed > 0 || skipped > 0 || dead > 0) {
222
626
  logger.info(`[Queue] Replay: ${replayed} replayed, ${skipped} skipped (dup), ${dead} dead-lettered`);
223
627
  }
@@ -230,6 +634,13 @@ export async function startDaemon(foreground = false, options = {}) {
230
634
  const webEnabled = options.web ?? (process.env.FORGE_DAEMON_NO_WEB === '1' ? false : config.web.enabled);
231
635
  let webServer = null;
232
636
  if (webEnabled) {
637
+ // D-2: lazy-load BuildManager + WebServer so the daemon has zero static
638
+ // edges into `src/web/` (matches the documented core ← {daemon, web}
639
+ // peer-layering). BuildManager's storage injection is safe to defer
640
+ // because the only consumer is `web/routes/knowledge.ts`, which runs
641
+ // only after `WebServer.start()` returns (post-setStorage).
642
+ const { buildManager } = await import('../web/services/build-manager.js');
643
+ buildManager.setStorage(storage);
233
644
  const { WebServer } = await import('../web/server.js');
234
645
  webServer = new WebServer({
235
646
  port: config.web.port,
@@ -237,7 +648,19 @@ export async function startDaemon(foreground = false, options = {}) {
237
648
  skillRegistry,
238
649
  invocationGuard,
239
650
  });
240
- await webServer.start();
651
+ // Defense-in-depth (task-link orphan fix, 2026-06-02): a failed web-server
652
+ // start (most commonly EADDRINUSE on port 3721 when another daemon already
653
+ // holds it) MUST NOT propagate to `process.exit(1)`. The core daemon job is
654
+ // the socket event pipeline, which is already listening by now; killing the
655
+ // process here is what previously created the launchd crash loop + socket
656
+ // theft. Log and continue with web disabled.
657
+ try {
658
+ await webServer.start();
659
+ }
660
+ catch (err) {
661
+ logger.error(`[Web] Server failed to start (continuing without web UI): ${err instanceof Error ? err.message : err}`);
662
+ webServer = null;
663
+ }
241
664
  }
242
665
  else {
243
666
  logger.info('[Web] Server disabled (--no-web or config.web.enabled=false)');
@@ -249,11 +672,16 @@ export async function startDaemon(foreground = false, options = {}) {
249
672
  return;
250
673
  shuttingDown = true;
251
674
  logger.info('Shutting down...');
252
- if (ai)
253
- logger.info(`[AI Stats] ${ai.formatStats()}`);
675
+ // D R-A (2026-05-29): removed `[AI Stats]` shutdown line — there was no
676
+ // consumer (dead log), and the only producer (ClaudeProvider instance)
677
+ // was deleted with the §4 block above. Master spec 0902 §2.4.4.
678
+ heartbeatHandle.stop();
254
679
  clearInterval(maintenanceInterval);
255
680
  clearInterval(vacuumInterval);
256
681
  clearInterval(staleTaskGcInterval);
682
+ clearInterval(eventTtlInterval);
683
+ clearTimeout(initialCleanupTimeout);
684
+ clearTimeout(initialEventTtlTimeout);
257
685
  if (webServer)
258
686
  await webServer.stop();
259
687
  await server.close();