@winspan/claude-forge 8.54.4 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (880) hide show
  1. package/DEVELOPMENT.md +649 -33
  2. package/README.md +154 -16
  3. package/dist/catalogs/agents.json +72 -0
  4. package/dist/catalogs/skills.json +194 -0
  5. package/dist/claudemd/claudemd-generator.d.ts +45 -45
  6. package/dist/claudemd/claudemd-generator.d.ts.map +1 -1
  7. package/dist/claudemd/claudemd-generator.js +128 -449
  8. package/dist/claudemd/claudemd-generator.js.map +1 -1
  9. package/dist/claudemd/index.d.ts +14 -4
  10. package/dist/claudemd/index.d.ts.map +1 -1
  11. package/dist/claudemd/index.js +15 -4
  12. package/dist/claudemd/index.js.map +1 -1
  13. package/dist/claudemd/resume-manager.d.ts.map +1 -1
  14. package/dist/claudemd/resume-manager.js +37 -9
  15. package/dist/claudemd/resume-manager.js.map +1 -1
  16. package/dist/claudemd/templates/swarm-protocol.md +35 -186
  17. package/dist/claudemd/violations-manager.d.ts +40 -0
  18. package/dist/claudemd/violations-manager.d.ts.map +1 -0
  19. package/dist/claudemd/violations-manager.js +106 -0
  20. package/dist/claudemd/violations-manager.js.map +1 -0
  21. package/dist/cli/commands/admin.d.ts +15 -0
  22. package/dist/cli/commands/admin.d.ts.map +1 -0
  23. package/dist/cli/commands/admin.js +177 -0
  24. package/dist/cli/commands/admin.js.map +1 -0
  25. package/dist/cli/commands/agents.d.ts +18 -0
  26. package/dist/cli/commands/agents.d.ts.map +1 -0
  27. package/dist/cli/commands/agents.js +160 -0
  28. package/dist/cli/commands/agents.js.map +1 -0
  29. package/dist/cli/commands/bypass.d.ts +18 -0
  30. package/dist/cli/commands/bypass.d.ts.map +1 -0
  31. package/dist/cli/commands/bypass.js +87 -0
  32. package/dist/cli/commands/bypass.js.map +1 -0
  33. package/dist/cli/commands/claudemd.d.ts +60 -0
  34. package/dist/cli/commands/claudemd.d.ts.map +1 -1
  35. package/dist/cli/commands/claudemd.js +174 -37
  36. package/dist/cli/commands/claudemd.js.map +1 -1
  37. package/dist/cli/commands/config.d.ts.map +1 -1
  38. package/dist/cli/commands/config.js +94 -1
  39. package/dist/cli/commands/config.js.map +1 -1
  40. package/dist/cli/commands/daemon.d.ts +39 -0
  41. package/dist/cli/commands/daemon.d.ts.map +1 -1
  42. package/dist/cli/commands/daemon.js +167 -20
  43. package/dist/cli/commands/daemon.js.map +1 -1
  44. package/dist/cli/commands/decisions.d.ts +129 -0
  45. package/dist/cli/commands/decisions.d.ts.map +1 -0
  46. package/dist/cli/commands/decisions.js +669 -0
  47. package/dist/cli/commands/decisions.js.map +1 -0
  48. package/dist/cli/commands/doctor.d.ts +29 -0
  49. package/dist/cli/commands/doctor.d.ts.map +1 -0
  50. package/dist/cli/commands/doctor.js +124 -0
  51. package/dist/cli/commands/doctor.js.map +1 -0
  52. package/dist/cli/commands/entropy.d.ts +35 -0
  53. package/dist/cli/commands/entropy.d.ts.map +1 -0
  54. package/dist/cli/commands/entropy.js +121 -0
  55. package/dist/cli/commands/entropy.js.map +1 -0
  56. package/dist/cli/commands/executions.d.ts +1 -0
  57. package/dist/cli/commands/executions.d.ts.map +1 -1
  58. package/dist/cli/commands/executions.js +10 -1
  59. package/dist/cli/commands/executions.js.map +1 -1
  60. package/dist/cli/commands/fix.d.ts +31 -0
  61. package/dist/cli/commands/fix.d.ts.map +1 -0
  62. package/dist/cli/commands/fix.js +108 -0
  63. package/dist/cli/commands/fix.js.map +1 -0
  64. package/dist/cli/commands/governance.d.ts +21 -0
  65. package/dist/cli/commands/governance.d.ts.map +1 -0
  66. package/dist/cli/commands/governance.js +60 -0
  67. package/dist/cli/commands/governance.js.map +1 -0
  68. package/dist/cli/commands/init.d.ts +27 -0
  69. package/dist/cli/commands/init.d.ts.map +1 -1
  70. package/dist/cli/commands/init.js +158 -146
  71. package/dist/cli/commands/init.js.map +1 -1
  72. package/dist/cli/commands/insights-goal-check.d.ts +50 -0
  73. package/dist/cli/commands/insights-goal-check.d.ts.map +1 -0
  74. package/dist/cli/commands/insights-goal-check.js +318 -0
  75. package/dist/cli/commands/insights-goal-check.js.map +1 -0
  76. package/dist/cli/commands/insights.d.ts +15 -0
  77. package/dist/cli/commands/insights.d.ts.map +1 -0
  78. package/dist/cli/commands/insights.js +127 -0
  79. package/dist/cli/commands/insights.js.map +1 -0
  80. package/dist/cli/commands/knowledge.d.ts +66 -0
  81. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  82. package/dist/cli/commands/knowledge.js +897 -0
  83. package/dist/cli/commands/knowledge.js.map +1 -0
  84. package/dist/cli/commands/mcp.d.ts +0 -12
  85. package/dist/cli/commands/mcp.d.ts.map +1 -1
  86. package/dist/cli/commands/mcp.js +11 -5
  87. package/dist/cli/commands/mcp.js.map +1 -1
  88. package/dist/cli/commands/menu.d.ts.map +1 -1
  89. package/dist/cli/commands/menu.js +10 -184
  90. package/dist/cli/commands/menu.js.map +1 -1
  91. package/dist/cli/commands/project.d.ts +98 -0
  92. package/dist/cli/commands/project.d.ts.map +1 -0
  93. package/dist/cli/commands/project.js +382 -0
  94. package/dist/cli/commands/project.js.map +1 -0
  95. package/dist/cli/commands/skills.d.ts.map +1 -1
  96. package/dist/cli/commands/skills.js +14 -128
  97. package/dist/cli/commands/skills.js.map +1 -1
  98. package/dist/cli/commands/spec.d.ts +40 -0
  99. package/dist/cli/commands/spec.d.ts.map +1 -0
  100. package/dist/cli/commands/spec.js +49 -0
  101. package/dist/cli/commands/spec.js.map +1 -0
  102. package/dist/cli/commands/stats.d.ts.map +1 -1
  103. package/dist/cli/commands/stats.js +3 -2
  104. package/dist/cli/commands/stats.js.map +1 -1
  105. package/dist/cli/commands/status.d.ts.map +1 -1
  106. package/dist/cli/commands/status.js +17 -2
  107. package/dist/cli/commands/status.js.map +1 -1
  108. package/dist/cli/commands/trace.d.ts.map +1 -1
  109. package/dist/cli/commands/trace.js +4 -9
  110. package/dist/cli/commands/trace.js.map +1 -1
  111. package/dist/cli/commands/violations.d.ts +14 -0
  112. package/dist/cli/commands/violations.d.ts.map +1 -0
  113. package/dist/cli/commands/violations.js +43 -0
  114. package/dist/cli/commands/violations.js.map +1 -0
  115. package/dist/cli/index.js +26 -0
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/init/hook-manager.d.ts +1 -1
  118. package/dist/cli/init/hook-manager.d.ts.map +1 -1
  119. package/dist/cli/init/hook-manager.js +6 -0
  120. package/dist/cli/init/hook-manager.js.map +1 -1
  121. package/dist/cli/utils/resolve-session.d.ts +32 -0
  122. package/dist/cli/utils/resolve-session.d.ts.map +1 -0
  123. package/dist/cli/utils/resolve-session.js +39 -0
  124. package/dist/cli/utils/resolve-session.js.map +1 -0
  125. package/dist/core/config.d.ts +4 -1
  126. package/dist/core/config.d.ts.map +1 -1
  127. package/dist/core/config.js +11 -23
  128. package/dist/core/config.js.map +1 -1
  129. package/dist/core/constants.d.ts +14 -13
  130. package/dist/core/constants.d.ts.map +1 -1
  131. package/dist/core/constants.js +20 -13
  132. package/dist/core/constants.js.map +1 -1
  133. package/dist/core/diagnostics/checks.d.ts +151 -0
  134. package/dist/core/diagnostics/checks.d.ts.map +1 -0
  135. package/dist/core/diagnostics/checks.js +765 -0
  136. package/dist/core/diagnostics/checks.js.map +1 -0
  137. package/dist/core/diagnostics/daemon-status.d.ts +77 -0
  138. package/dist/core/diagnostics/daemon-status.d.ts.map +1 -0
  139. package/dist/core/diagnostics/daemon-status.js +113 -0
  140. package/dist/core/diagnostics/daemon-status.js.map +1 -0
  141. package/dist/core/diagnostics/entropy-checks.d.ts +82 -0
  142. package/dist/core/diagnostics/entropy-checks.d.ts.map +1 -0
  143. package/dist/core/diagnostics/entropy-checks.js +395 -0
  144. package/dist/core/diagnostics/entropy-checks.js.map +1 -0
  145. package/dist/core/diagnostics/fix-runner.d.ts +54 -0
  146. package/dist/core/diagnostics/fix-runner.d.ts.map +1 -0
  147. package/dist/core/diagnostics/fix-runner.js +90 -0
  148. package/dist/core/diagnostics/fix-runner.js.map +1 -0
  149. package/dist/core/diagnostics/knip-runner.d.ts +49 -0
  150. package/dist/core/diagnostics/knip-runner.d.ts.map +1 -0
  151. package/dist/core/diagnostics/knip-runner.js +100 -0
  152. package/dist/core/diagnostics/knip-runner.js.map +1 -0
  153. package/dist/core/diagnostics/markers.d.ts +96 -0
  154. package/dist/core/diagnostics/markers.d.ts.map +1 -0
  155. package/dist/core/diagnostics/markers.js +153 -0
  156. package/dist/core/diagnostics/markers.js.map +1 -0
  157. package/dist/core/governance/global-inject.d.ts +60 -0
  158. package/dist/core/governance/global-inject.d.ts.map +1 -0
  159. package/dist/core/governance/global-inject.js +129 -0
  160. package/dist/core/governance/global-inject.js.map +1 -0
  161. package/dist/core/queue/index.d.ts +16 -3
  162. package/dist/core/queue/index.d.ts.map +1 -1
  163. package/dist/core/queue/index.js +14 -3
  164. package/dist/core/queue/index.js.map +1 -1
  165. package/dist/core/storage/base.d.ts +158 -0
  166. package/dist/core/storage/base.d.ts.map +1 -1
  167. package/dist/core/storage/base.js +570 -0
  168. package/dist/core/storage/base.js.map +1 -1
  169. package/dist/core/storage/codec/tool-input-codec.d.ts +93 -0
  170. package/dist/core/storage/codec/tool-input-codec.d.ts.map +1 -0
  171. package/dist/core/storage/codec/tool-input-codec.js +159 -0
  172. package/dist/core/storage/codec/tool-input-codec.js.map +1 -0
  173. package/dist/core/storage/decisions.d.ts +362 -0
  174. package/dist/core/storage/decisions.d.ts.map +1 -0
  175. package/dist/core/storage/decisions.js +502 -0
  176. package/dist/core/storage/decisions.js.map +1 -0
  177. package/dist/core/storage/events.d.ts +112 -8
  178. package/dist/core/storage/events.d.ts.map +1 -1
  179. package/dist/core/storage/events.js +390 -39
  180. package/dist/core/storage/events.js.map +1 -1
  181. package/dist/core/storage/feedback.d.ts +131 -0
  182. package/dist/core/storage/feedback.d.ts.map +1 -0
  183. package/dist/core/storage/feedback.js +187 -0
  184. package/dist/core/storage/feedback.js.map +1 -0
  185. package/dist/core/storage/forge-config.d.ts +40 -0
  186. package/dist/core/storage/forge-config.d.ts.map +1 -0
  187. package/dist/core/storage/forge-config.js +65 -0
  188. package/dist/core/storage/forge-config.js.map +1 -0
  189. package/dist/core/storage/injections.d.ts +28 -0
  190. package/dist/core/storage/injections.d.ts.map +1 -1
  191. package/dist/core/storage/injections.js +62 -5
  192. package/dist/core/storage/injections.js.map +1 -1
  193. package/dist/core/storage/knowledge.d.ts +106 -0
  194. package/dist/core/storage/knowledge.d.ts.map +1 -0
  195. package/dist/core/storage/knowledge.js +202 -0
  196. package/dist/core/storage/knowledge.js.map +1 -0
  197. package/dist/core/storage/maintenance.d.ts +36 -9
  198. package/dist/core/storage/maintenance.d.ts.map +1 -1
  199. package/dist/core/storage/maintenance.js +56 -24
  200. package/dist/core/storage/maintenance.js.map +1 -1
  201. package/dist/core/storage/pipeline-rollup.d.ts +117 -0
  202. package/dist/core/storage/pipeline-rollup.d.ts.map +1 -0
  203. package/dist/core/storage/pipeline-rollup.js +471 -0
  204. package/dist/core/storage/pipeline-rollup.js.map +1 -0
  205. package/dist/core/storage/routing.d.ts +16 -3
  206. package/dist/core/storage/routing.d.ts.map +1 -1
  207. package/dist/core/storage/routing.js +39 -8
  208. package/dist/core/storage/routing.js.map +1 -1
  209. package/dist/core/storage/rows.d.ts +50 -7
  210. package/dist/core/storage/rows.d.ts.map +1 -1
  211. package/dist/core/storage/schema.sql +302 -23
  212. package/dist/core/storage/sessions.d.ts +136 -0
  213. package/dist/core/storage/sessions.d.ts.map +1 -1
  214. package/dist/core/storage/sessions.js +351 -15
  215. package/dist/core/storage/sessions.js.map +1 -1
  216. package/dist/core/storage/skills.d.ts +1 -0
  217. package/dist/core/storage/skills.d.ts.map +1 -1
  218. package/dist/core/storage/skills.js +21 -6
  219. package/dist/core/storage/skills.js.map +1 -1
  220. package/dist/core/storage/sqlite.d.ts +253 -20
  221. package/dist/core/storage/sqlite.d.ts.map +1 -1
  222. package/dist/core/storage/sqlite.js +425 -16
  223. package/dist/core/storage/sqlite.js.map +1 -1
  224. package/dist/core/storage/tasks.d.ts +474 -2
  225. package/dist/core/storage/tasks.d.ts.map +1 -1
  226. package/dist/core/storage/tasks.js +1213 -18
  227. package/dist/core/storage/tasks.js.map +1 -1
  228. package/dist/core/storage/tool-intercepts.d.ts +69 -0
  229. package/dist/core/storage/tool-intercepts.d.ts.map +1 -0
  230. package/dist/core/storage/tool-intercepts.js +116 -0
  231. package/dist/core/storage/tool-intercepts.js.map +1 -0
  232. package/dist/core/storage/workflow-recommendations.d.ts +124 -0
  233. package/dist/core/storage/workflow-recommendations.d.ts.map +1 -0
  234. package/dist/core/storage/workflow-recommendations.js +274 -0
  235. package/dist/core/storage/workflow-recommendations.js.map +1 -0
  236. package/dist/core/types.d.ts +112 -17
  237. package/dist/core/types.d.ts.map +1 -1
  238. package/dist/core/types.js +12 -0
  239. package/dist/core/types.js.map +1 -1
  240. package/dist/core/utils/backup.d.ts +81 -0
  241. package/dist/core/utils/backup.d.ts.map +1 -0
  242. package/dist/core/utils/backup.js +98 -0
  243. package/dist/core/utils/backup.js.map +1 -0
  244. package/dist/core/utils/binary-paths.d.ts +92 -0
  245. package/dist/core/utils/binary-paths.d.ts.map +1 -0
  246. package/dist/core/utils/binary-paths.js +166 -0
  247. package/dist/core/utils/binary-paths.js.map +1 -0
  248. package/dist/core/utils/bypass-token.d.ts +75 -0
  249. package/dist/core/utils/bypass-token.d.ts.map +1 -0
  250. package/dist/core/utils/bypass-token.js +133 -0
  251. package/dist/core/utils/bypass-token.js.map +1 -0
  252. package/dist/core/utils/cc-builtin-agents.d.ts +3 -0
  253. package/dist/core/utils/cc-builtin-agents.d.ts.map +1 -0
  254. package/dist/core/utils/cc-builtin-agents.js +29 -0
  255. package/dist/core/utils/cc-builtin-agents.js.map +1 -0
  256. package/dist/core/utils/claude-cli-spawn.d.ts +106 -0
  257. package/dist/core/utils/claude-cli-spawn.d.ts.map +1 -0
  258. package/dist/core/utils/claude-cli-spawn.js +219 -0
  259. package/dist/core/utils/claude-cli-spawn.js.map +1 -0
  260. package/dist/core/utils/forge-resume-block.d.ts.map +1 -1
  261. package/dist/core/utils/forge-resume-block.js +3 -2
  262. package/dist/core/utils/forge-resume-block.js.map +1 -1
  263. package/dist/core/utils/logger.d.ts +15 -3
  264. package/dist/core/utils/logger.d.ts.map +1 -1
  265. package/dist/core/utils/logger.js +20 -2
  266. package/dist/core/utils/logger.js.map +1 -1
  267. package/dist/core/utils/noise-prompt.d.ts +97 -0
  268. package/dist/core/utils/noise-prompt.d.ts.map +1 -0
  269. package/dist/core/utils/noise-prompt.js +127 -0
  270. package/dist/core/utils/noise-prompt.js.map +1 -0
  271. package/dist/core/utils/path.d.ts +0 -4
  272. package/dist/core/utils/path.d.ts.map +1 -1
  273. package/dist/core/utils/path.js +0 -7
  274. package/dist/core/utils/path.js.map +1 -1
  275. package/dist/core/utils/time.d.ts +41 -0
  276. package/dist/core/utils/time.d.ts.map +1 -1
  277. package/dist/core/utils/time.js +114 -0
  278. package/dist/core/utils/time.js.map +1 -1
  279. package/dist/daemon/agent-sync.d.ts +24 -0
  280. package/dist/daemon/agent-sync.d.ts.map +1 -0
  281. package/dist/daemon/agent-sync.js +114 -0
  282. package/dist/daemon/agent-sync.js.map +1 -0
  283. package/dist/daemon/config-store.d.ts +55 -0
  284. package/dist/daemon/config-store.d.ts.map +1 -0
  285. package/dist/daemon/config-store.js +137 -0
  286. package/dist/daemon/config-store.js.map +1 -0
  287. package/dist/daemon/event-parser.d.ts +22 -0
  288. package/dist/daemon/event-parser.d.ts.map +1 -1
  289. package/dist/daemon/event-parser.js +49 -3
  290. package/dist/daemon/event-parser.js.map +1 -1
  291. package/dist/daemon/handlers/history-exporter.d.ts.map +1 -1
  292. package/dist/daemon/handlers/history-exporter.js +9 -8
  293. package/dist/daemon/handlers/history-exporter.js.map +1 -1
  294. package/dist/daemon/handlers/post-tool-use.d.ts +58 -4
  295. package/dist/daemon/handlers/post-tool-use.d.ts.map +1 -1
  296. package/dist/daemon/handlers/post-tool-use.js +261 -8
  297. package/dist/daemon/handlers/post-tool-use.js.map +1 -1
  298. package/dist/daemon/handlers/pre-tool-use.d.ts +156 -0
  299. package/dist/daemon/handlers/pre-tool-use.d.ts.map +1 -0
  300. package/dist/daemon/handlers/pre-tool-use.js +585 -0
  301. package/dist/daemon/handlers/pre-tool-use.js.map +1 -0
  302. package/dist/daemon/handlers/stop.d.ts +35 -7
  303. package/dist/daemon/handlers/stop.d.ts.map +1 -1
  304. package/dist/daemon/handlers/stop.js +157 -8
  305. package/dist/daemon/handlers/stop.js.map +1 -1
  306. package/dist/daemon/handlers/user-prompt.d.ts +36 -14
  307. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  308. package/dist/daemon/handlers/user-prompt.js +135 -48
  309. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  310. package/dist/daemon/hook-sync.d.ts.map +1 -1
  311. package/dist/daemon/hook-sync.js +2 -1
  312. package/dist/daemon/hook-sync.js.map +1 -1
  313. package/dist/daemon/index.d.ts.map +1 -1
  314. package/dist/daemon/index.js +471 -43
  315. package/dist/daemon/index.js.map +1 -1
  316. package/dist/daemon/lifecycle.d.ts +48 -1
  317. package/dist/daemon/lifecycle.d.ts.map +1 -1
  318. package/dist/daemon/lifecycle.js +98 -2
  319. package/dist/daemon/lifecycle.js.map +1 -1
  320. package/dist/daemon/router.d.ts +4 -1
  321. package/dist/daemon/router.d.ts.map +1 -1
  322. package/dist/daemon/router.js +4 -2
  323. package/dist/daemon/router.js.map +1 -1
  324. package/dist/daemon/rules/defaults.d.ts +20 -0
  325. package/dist/daemon/rules/defaults.d.ts.map +1 -0
  326. package/dist/daemon/rules/defaults.js +692 -0
  327. package/dist/daemon/rules/defaults.js.map +1 -0
  328. package/dist/daemon/rules/registry.d.ts +47 -0
  329. package/dist/daemon/rules/registry.d.ts.map +1 -0
  330. package/dist/daemon/rules/registry.js +84 -0
  331. package/dist/daemon/rules/registry.js.map +1 -0
  332. package/dist/daemon/rules/types.d.ts +170 -0
  333. package/dist/daemon/rules/types.d.ts.map +1 -0
  334. package/dist/daemon/rules/types.js +15 -0
  335. package/dist/daemon/rules/types.js.map +1 -0
  336. package/dist/daemon/rules/whitelist.d.ts +101 -0
  337. package/dist/daemon/rules/whitelist.d.ts.map +1 -0
  338. package/dist/daemon/rules/whitelist.js +210 -0
  339. package/dist/daemon/rules/whitelist.js.map +1 -0
  340. package/dist/daemon/rules/workflow-defaults.d.ts +52 -0
  341. package/dist/daemon/rules/workflow-defaults.d.ts.map +1 -0
  342. package/dist/daemon/rules/workflow-defaults.js +521 -0
  343. package/dist/daemon/rules/workflow-defaults.js.map +1 -0
  344. package/dist/daemon/server.d.ts +11 -1
  345. package/dist/daemon/server.d.ts.map +1 -1
  346. package/dist/daemon/server.js +7 -1
  347. package/dist/daemon/server.js.map +1 -1
  348. package/dist/daemon/services/context-injector.d.ts +34 -0
  349. package/dist/daemon/services/context-injector.d.ts.map +1 -0
  350. package/dist/daemon/services/context-injector.js +61 -0
  351. package/dist/daemon/services/context-injector.js.map +1 -0
  352. package/dist/daemon/services/decision-hint.d.ts +203 -0
  353. package/dist/daemon/services/decision-hint.d.ts.map +1 -0
  354. package/dist/daemon/services/decision-hint.js +487 -0
  355. package/dist/daemon/services/decision-hint.js.map +1 -0
  356. package/dist/daemon/services/event-ttl-sweep.d.ts +86 -0
  357. package/dist/daemon/services/event-ttl-sweep.d.ts.map +1 -0
  358. package/dist/daemon/services/event-ttl-sweep.js +123 -0
  359. package/dist/daemon/services/event-ttl-sweep.js.map +1 -0
  360. package/dist/daemon/services/experience-extractor.d.ts +67 -0
  361. package/dist/daemon/services/experience-extractor.d.ts.map +1 -0
  362. package/dist/daemon/services/experience-extractor.js +323 -0
  363. package/dist/daemon/services/experience-extractor.js.map +1 -0
  364. package/dist/daemon/services/feedback-aggregator.d.ts +179 -0
  365. package/dist/daemon/services/feedback-aggregator.d.ts.map +1 -0
  366. package/dist/daemon/services/feedback-aggregator.js +455 -0
  367. package/dist/daemon/services/feedback-aggregator.js.map +1 -0
  368. package/dist/daemon/services/heartbeat-writer.d.ts +55 -0
  369. package/dist/daemon/services/heartbeat-writer.d.ts.map +1 -0
  370. package/dist/daemon/services/heartbeat-writer.js +111 -0
  371. package/dist/daemon/services/heartbeat-writer.js.map +1 -0
  372. package/dist/daemon/services/idle-session-sweeper.d.ts +61 -0
  373. package/dist/daemon/services/idle-session-sweeper.d.ts.map +1 -0
  374. package/dist/daemon/services/idle-session-sweeper.js +94 -0
  375. package/dist/daemon/services/idle-session-sweeper.js.map +1 -0
  376. package/dist/daemon/services/idle-task-budget.d.ts +50 -0
  377. package/dist/daemon/services/idle-task-budget.d.ts.map +1 -0
  378. package/dist/daemon/services/idle-task-budget.js +72 -0
  379. package/dist/daemon/services/idle-task-budget.js.map +1 -0
  380. package/dist/daemon/services/intercept-revive.d.ts +60 -0
  381. package/dist/daemon/services/intercept-revive.d.ts.map +1 -0
  382. package/dist/daemon/services/intercept-revive.js +86 -0
  383. package/dist/daemon/services/intercept-revive.js.map +1 -0
  384. package/dist/daemon/services/intercept-rollback-guard.d.ts +105 -0
  385. package/dist/daemon/services/intercept-rollback-guard.d.ts.map +1 -0
  386. package/dist/daemon/services/intercept-rollback-guard.js +152 -0
  387. package/dist/daemon/services/intercept-rollback-guard.js.map +1 -0
  388. package/dist/daemon/services/intercept-timeout-sweeper.d.ts +58 -0
  389. package/dist/daemon/services/intercept-timeout-sweeper.d.ts.map +1 -0
  390. package/dist/daemon/services/intercept-timeout-sweeper.js +83 -0
  391. package/dist/daemon/services/intercept-timeout-sweeper.js.map +1 -0
  392. package/dist/daemon/services/kb-injector.d.ts +57 -0
  393. package/dist/daemon/services/kb-injector.d.ts.map +1 -0
  394. package/dist/daemon/services/kb-injector.js +140 -0
  395. package/dist/daemon/services/kb-injector.js.map +1 -0
  396. package/dist/daemon/services/outcome-classification-service.d.ts +49 -0
  397. package/dist/daemon/services/outcome-classification-service.d.ts.map +1 -0
  398. package/dist/daemon/services/outcome-classification-service.js +214 -0
  399. package/dist/daemon/services/outcome-classification-service.js.map +1 -0
  400. package/dist/daemon/services/outcome-classifier.d.ts +136 -0
  401. package/dist/daemon/services/outcome-classifier.d.ts.map +1 -0
  402. package/dist/daemon/services/outcome-classifier.js +178 -0
  403. package/dist/daemon/services/outcome-classifier.js.map +1 -0
  404. package/dist/daemon/services/outcome-nudge.d.ts +107 -0
  405. package/dist/daemon/services/outcome-nudge.d.ts.map +1 -0
  406. package/dist/daemon/services/outcome-nudge.js +242 -0
  407. package/dist/daemon/services/outcome-nudge.js.map +1 -0
  408. package/dist/daemon/services/spec-approval.d.ts +127 -0
  409. package/dist/daemon/services/spec-approval.d.ts.map +1 -0
  410. package/dist/daemon/services/spec-approval.js +216 -0
  411. package/dist/daemon/services/spec-approval.js.map +1 -0
  412. package/dist/daemon/services/spec-gate.d.ts +54 -0
  413. package/dist/daemon/services/spec-gate.d.ts.map +1 -0
  414. package/dist/daemon/services/spec-gate.js +113 -0
  415. package/dist/daemon/services/spec-gate.js.map +1 -0
  416. package/dist/daemon/services/task-boundary-classifier.d.ts +78 -0
  417. package/dist/daemon/services/task-boundary-classifier.d.ts.map +1 -0
  418. package/dist/daemon/services/task-boundary-classifier.js +202 -0
  419. package/dist/daemon/services/task-boundary-classifier.js.map +1 -0
  420. package/dist/daemon/services/task-segmenter.d.ts +219 -1
  421. package/dist/daemon/services/task-segmenter.d.ts.map +1 -1
  422. package/dist/daemon/services/task-segmenter.js +481 -17
  423. package/dist/daemon/services/task-segmenter.js.map +1 -1
  424. package/dist/daemon/services/violation-reporter.d.ts +130 -0
  425. package/dist/daemon/services/violation-reporter.d.ts.map +1 -0
  426. package/dist/daemon/services/violation-reporter.js +339 -0
  427. package/dist/daemon/services/violation-reporter.js.map +1 -0
  428. package/dist/daemon/skill-sync.d.ts +7 -2
  429. package/dist/daemon/skill-sync.d.ts.map +1 -1
  430. package/dist/daemon/skill-sync.js +114 -9
  431. package/dist/daemon/skill-sync.js.map +1 -1
  432. package/dist/daemon/templates/agents/claudemd-writer.md +101 -0
  433. package/dist/daemon/templates/agents/coder.md +105 -0
  434. package/dist/daemon/templates/agents/decision-maker.md +460 -0
  435. package/dist/daemon/templates/agents/doc-reviewer.md +115 -0
  436. package/dist/daemon/templates/agents/harness-debug-full.md +114 -0
  437. package/dist/daemon/templates/agents/harness-hotfix.md +99 -0
  438. package/dist/daemon/templates/agents/hybrid-feature-with-safety.md +104 -0
  439. package/dist/daemon/templates/agents/knowledge-builder.md +119 -0
  440. package/dist/daemon/templates/agents/patch-applier.md +144 -0
  441. package/dist/daemon/templates/agents/planner.md +165 -0
  442. package/dist/daemon/templates/agents/refactor-specialist.md +98 -0
  443. package/dist/daemon/templates/agents/skill-distiller.md +113 -0
  444. package/dist/daemon/templates/agents/task-boundary-classifier.md +64 -0
  445. package/dist/daemon/templates/agents/verify-agent.md +136 -0
  446. package/dist/daemon/utils/inject-block.d.ts +39 -0
  447. package/dist/daemon/utils/inject-block.d.ts.map +1 -0
  448. package/dist/daemon/utils/inject-block.js +25 -0
  449. package/dist/daemon/utils/inject-block.js.map +1 -0
  450. package/dist/hooks/hook-lib.sh +8 -0
  451. package/dist/hooks/notification.sh +19 -8
  452. package/dist/hooks/post-tool-use.sh +41 -23
  453. package/dist/hooks/pre-tool-use.sh +54 -23
  454. package/dist/hooks/session-start.sh +68 -0
  455. package/dist/hooks/stop.sh +24 -10
  456. package/dist/hooks/user-prompt-submit.sh +37 -21
  457. package/dist/knowledge/adapters/go-adapter.d.ts +65 -0
  458. package/dist/knowledge/adapters/go-adapter.d.ts.map +1 -0
  459. package/dist/knowledge/adapters/go-adapter.js +294 -0
  460. package/dist/knowledge/adapters/go-adapter.js.map +1 -0
  461. package/dist/knowledge/adapters/index.d.ts +41 -0
  462. package/dist/knowledge/adapters/index.d.ts.map +1 -0
  463. package/dist/knowledge/adapters/index.js +71 -0
  464. package/dist/knowledge/adapters/index.js.map +1 -0
  465. package/dist/knowledge/adapters/java-adapter.d.ts +66 -0
  466. package/dist/knowledge/adapters/java-adapter.d.ts.map +1 -0
  467. package/dist/knowledge/adapters/java-adapter.js +260 -0
  468. package/dist/knowledge/adapters/java-adapter.js.map +1 -0
  469. package/dist/knowledge/adapters/js-vue-adapter.d.ts +56 -0
  470. package/dist/knowledge/adapters/js-vue-adapter.d.ts.map +1 -0
  471. package/dist/knowledge/adapters/js-vue-adapter.js +203 -0
  472. package/dist/knowledge/adapters/js-vue-adapter.js.map +1 -0
  473. package/dist/knowledge/adapters/kotlin-adapter.d.ts +55 -0
  474. package/dist/knowledge/adapters/kotlin-adapter.d.ts.map +1 -0
  475. package/dist/knowledge/adapters/kotlin-adapter.js +209 -0
  476. package/dist/knowledge/adapters/kotlin-adapter.js.map +1 -0
  477. package/dist/knowledge/adapters/monorepo-adapter.d.ts +77 -0
  478. package/dist/knowledge/adapters/monorepo-adapter.d.ts.map +1 -0
  479. package/dist/knowledge/adapters/monorepo-adapter.js +170 -0
  480. package/dist/knowledge/adapters/monorepo-adapter.js.map +1 -0
  481. package/dist/knowledge/adapters/python-adapter.d.ts +89 -0
  482. package/dist/knowledge/adapters/python-adapter.d.ts.map +1 -0
  483. package/dist/knowledge/adapters/python-adapter.js +358 -0
  484. package/dist/knowledge/adapters/python-adapter.js.map +1 -0
  485. package/dist/knowledge/adapters/rust-adapter.d.ts +73 -0
  486. package/dist/knowledge/adapters/rust-adapter.d.ts.map +1 -0
  487. package/dist/knowledge/adapters/rust-adapter.js +329 -0
  488. package/dist/knowledge/adapters/rust-adapter.js.map +1 -0
  489. package/dist/knowledge/adapters/types.d.ts +99 -0
  490. package/dist/knowledge/adapters/types.d.ts.map +1 -0
  491. package/dist/knowledge/adapters/types.js +17 -0
  492. package/dist/knowledge/adapters/types.js.map +1 -0
  493. package/dist/knowledge/adapters/typescript-adapter.d.ts +57 -0
  494. package/dist/knowledge/adapters/typescript-adapter.d.ts.map +1 -0
  495. package/dist/knowledge/adapters/typescript-adapter.js +171 -0
  496. package/dist/knowledge/adapters/typescript-adapter.js.map +1 -0
  497. package/dist/knowledge/audit-applier.d.ts +70 -0
  498. package/dist/knowledge/audit-applier.d.ts.map +1 -0
  499. package/dist/knowledge/audit-applier.js +251 -0
  500. package/dist/knowledge/audit-applier.js.map +1 -0
  501. package/dist/knowledge/builder.d.ts +261 -0
  502. package/dist/knowledge/builder.d.ts.map +1 -0
  503. package/dist/knowledge/builder.js +937 -0
  504. package/dist/knowledge/builder.js.map +1 -0
  505. package/dist/knowledge/cli-provider.d.ts +151 -0
  506. package/dist/knowledge/cli-provider.d.ts.map +1 -0
  507. package/dist/knowledge/cli-provider.js +313 -0
  508. package/dist/knowledge/cli-provider.js.map +1 -0
  509. package/dist/knowledge/constants.d.ts +73 -0
  510. package/dist/knowledge/constants.d.ts.map +1 -0
  511. package/dist/knowledge/constants.js +93 -0
  512. package/dist/knowledge/constants.js.map +1 -0
  513. package/dist/knowledge/cross-module.d.ts +139 -0
  514. package/dist/knowledge/cross-module.d.ts.map +1 -0
  515. package/dist/knowledge/cross-module.js +370 -0
  516. package/dist/knowledge/cross-module.js.map +1 -0
  517. package/dist/knowledge/git-hooks.d.ts +67 -0
  518. package/dist/knowledge/git-hooks.d.ts.map +1 -0
  519. package/dist/knowledge/git-hooks.js +258 -0
  520. package/dist/knowledge/git-hooks.js.map +1 -0
  521. package/dist/knowledge/module-hash.d.ts +88 -0
  522. package/dist/knowledge/module-hash.d.ts.map +1 -0
  523. package/dist/knowledge/module-hash.js +162 -0
  524. package/dist/knowledge/module-hash.js.map +1 -0
  525. package/dist/knowledge/project-detector.d.ts +101 -0
  526. package/dist/knowledge/project-detector.d.ts.map +1 -0
  527. package/dist/knowledge/project-detector.js +223 -0
  528. package/dist/knowledge/project-detector.js.map +1 -0
  529. package/dist/knowledge/prompt.d.ts +228 -0
  530. package/dist/knowledge/prompt.d.ts.map +1 -0
  531. package/dist/knowledge/prompt.js +404 -0
  532. package/dist/knowledge/prompt.js.map +1 -0
  533. package/dist/knowledge/query.d.ts +105 -0
  534. package/dist/knowledge/query.d.ts.map +1 -0
  535. package/dist/knowledge/query.js +341 -0
  536. package/dist/knowledge/query.js.map +1 -0
  537. package/dist/knowledge/repo-map.d.ts +91 -0
  538. package/dist/knowledge/repo-map.d.ts.map +1 -0
  539. package/dist/knowledge/repo-map.js +408 -0
  540. package/dist/knowledge/repo-map.js.map +1 -0
  541. package/dist/knowledge/tools/index.d.ts +14 -0
  542. package/dist/knowledge/tools/index.d.ts.map +1 -0
  543. package/dist/knowledge/tools/index.js +11 -0
  544. package/dist/knowledge/tools/index.js.map +1 -0
  545. package/dist/knowledge/tools/knowledge-get-page.d.ts +46 -0
  546. package/dist/knowledge/tools/knowledge-get-page.d.ts.map +1 -0
  547. package/dist/knowledge/tools/knowledge-get-page.js +101 -0
  548. package/dist/knowledge/tools/knowledge-get-page.js.map +1 -0
  549. package/dist/knowledge/tools/knowledge-query.d.ts +77 -0
  550. package/dist/knowledge/tools/knowledge-query.d.ts.map +1 -0
  551. package/dist/knowledge/tools/knowledge-query.js +104 -0
  552. package/dist/knowledge/tools/knowledge-query.js.map +1 -0
  553. package/dist/knowledge/tools/repo-map-lookup.d.ts +45 -0
  554. package/dist/knowledge/tools/repo-map-lookup.d.ts.map +1 -0
  555. package/dist/knowledge/tools/repo-map-lookup.js +82 -0
  556. package/dist/knowledge/tools/repo-map-lookup.js.map +1 -0
  557. package/dist/knowledge/types.d.ts +269 -0
  558. package/dist/knowledge/types.d.ts.map +1 -0
  559. package/dist/knowledge/types.js +10 -0
  560. package/dist/knowledge/types.js.map +1 -0
  561. package/dist/knowledge/validator.d.ts +90 -0
  562. package/dist/knowledge/validator.d.ts.map +1 -0
  563. package/dist/knowledge/validator.js +288 -0
  564. package/dist/knowledge/validator.js.map +1 -0
  565. package/dist/mcp/server.d.ts.map +1 -1
  566. package/dist/mcp/server.js +222 -1
  567. package/dist/mcp/server.js.map +1 -1
  568. package/dist/skills/builtin-skills.d.ts +35 -0
  569. package/dist/skills/builtin-skills.d.ts.map +1 -0
  570. package/dist/skills/builtin-skills.js +68 -0
  571. package/dist/skills/builtin-skills.js.map +1 -0
  572. package/dist/skills/distill/attribution.d.ts +59 -0
  573. package/dist/skills/distill/attribution.d.ts.map +1 -0
  574. package/dist/skills/distill/attribution.js +101 -0
  575. package/dist/skills/distill/attribution.js.map +1 -0
  576. package/dist/skills/distill/claude-cli-resolver.d.ts +26 -0
  577. package/dist/skills/distill/claude-cli-resolver.d.ts.map +1 -0
  578. package/dist/skills/distill/claude-cli-resolver.js +115 -0
  579. package/dist/skills/distill/claude-cli-resolver.js.map +1 -0
  580. package/dist/skills/distill/distiller.d.ts +161 -0
  581. package/dist/skills/distill/distiller.d.ts.map +1 -0
  582. package/dist/skills/distill/distiller.js +461 -0
  583. package/dist/skills/distill/distiller.js.map +1 -0
  584. package/dist/skills/distill/index.d.ts +223 -0
  585. package/dist/skills/distill/index.d.ts.map +1 -0
  586. package/dist/skills/distill/index.js +466 -0
  587. package/dist/skills/distill/index.js.map +1 -0
  588. package/dist/skills/distill/project-anchor-guard.d.ts +116 -0
  589. package/dist/skills/distill/project-anchor-guard.d.ts.map +1 -0
  590. package/dist/skills/distill/project-anchor-guard.js +334 -0
  591. package/dist/skills/distill/project-anchor-guard.js.map +1 -0
  592. package/dist/skills/distill/topic-deduper.d.ts +77 -0
  593. package/dist/skills/distill/topic-deduper.d.ts.map +1 -0
  594. package/dist/skills/distill/topic-deduper.js +119 -0
  595. package/dist/skills/distill/topic-deduper.js.map +1 -0
  596. package/dist/skills/distill/upstream-fetcher.d.ts +71 -0
  597. package/dist/skills/distill/upstream-fetcher.d.ts.map +1 -0
  598. package/dist/skills/distill/upstream-fetcher.js +202 -0
  599. package/dist/skills/distill/upstream-fetcher.js.map +1 -0
  600. package/dist/skills/distilled/distilled-api-design.md +491 -0
  601. package/dist/skills/distilled/distilled-architecture-decision.md +173 -0
  602. package/dist/skills/distilled/distilled-creator.md +178 -0
  603. package/dist/skills/distilled/distilled-db-schema-design.md +245 -0
  604. package/dist/skills/distilled/distilled-defi-amm-security.md +293 -0
  605. package/dist/skills/distilled/distilled-executing-plans.md +113 -0
  606. package/dist/skills/distilled/distilled-harness-engineering.md +242 -0
  607. package/dist/skills/distilled/distilled-karpathy-guidelines.md +104 -0
  608. package/dist/skills/distilled/distilled-performance-optimization.md +175 -0
  609. package/dist/skills/distilled/distilled-spec-driven-design.md +193 -0
  610. package/dist/skills/distilled/distilled-systematic-debugging.md +306 -0
  611. package/dist/skills/distilled/distilled-verification-before-completion.md +203 -0
  612. package/dist/skills/keyword-score.d.ts +29 -0
  613. package/dist/skills/keyword-score.d.ts.map +1 -0
  614. package/dist/skills/keyword-score.js +54 -0
  615. package/dist/skills/keyword-score.js.map +1 -0
  616. package/dist/skills/registry.d.ts +64 -20
  617. package/dist/skills/registry.d.ts.map +1 -1
  618. package/dist/skills/registry.js +102 -105
  619. package/dist/skills/registry.js.map +1 -1
  620. package/dist/skills/tools/pipeline-suggest.js +14 -14
  621. package/dist/skills/tools/skill-invoke.d.ts +1 -1
  622. package/dist/skills/tools/skill-invoke.js +1 -1
  623. package/dist/web/routes/agent-content.d.ts +30 -0
  624. package/dist/web/routes/agent-content.d.ts.map +1 -0
  625. package/dist/web/routes/agent-content.js +139 -0
  626. package/dist/web/routes/agent-content.js.map +1 -0
  627. package/dist/web/routes/decisions.d.ts +15 -0
  628. package/dist/web/routes/decisions.d.ts.map +1 -0
  629. package/dist/web/routes/decisions.js +181 -0
  630. package/dist/web/routes/decisions.js.map +1 -0
  631. package/dist/web/routes/diagnostics.d.ts +61 -0
  632. package/dist/web/routes/diagnostics.d.ts.map +1 -0
  633. package/dist/web/routes/diagnostics.js +203 -0
  634. package/dist/web/routes/diagnostics.js.map +1 -0
  635. package/dist/web/routes/events.d.ts.map +1 -1
  636. package/dist/web/routes/events.js +24 -0
  637. package/dist/web/routes/events.js.map +1 -1
  638. package/dist/web/routes/health.d.ts +33 -0
  639. package/dist/web/routes/health.d.ts.map +1 -0
  640. package/dist/web/routes/health.js +37 -0
  641. package/dist/web/routes/health.js.map +1 -0
  642. package/dist/web/routes/insights.d.ts +0 -5
  643. package/dist/web/routes/insights.d.ts.map +1 -1
  644. package/dist/web/routes/insights.js +783 -2
  645. package/dist/web/routes/insights.js.map +1 -1
  646. package/dist/web/routes/knowledge.d.ts +16 -0
  647. package/dist/web/routes/knowledge.d.ts.map +1 -0
  648. package/dist/web/routes/knowledge.js +661 -0
  649. package/dist/web/routes/knowledge.js.map +1 -0
  650. package/dist/web/routes/patch.d.ts +60 -1
  651. package/dist/web/routes/patch.d.ts.map +1 -1
  652. package/dist/web/routes/patch.js +170 -64
  653. package/dist/web/routes/patch.js.map +1 -1
  654. package/dist/web/routes/pipeline.d.ts +37 -0
  655. package/dist/web/routes/pipeline.d.ts.map +1 -0
  656. package/dist/web/routes/pipeline.js +149 -0
  657. package/dist/web/routes/pipeline.js.map +1 -0
  658. package/dist/web/routes/rules.d.ts.map +1 -1
  659. package/dist/web/routes/rules.js +6 -1
  660. package/dist/web/routes/rules.js.map +1 -1
  661. package/dist/web/routes/sessions.d.ts.map +1 -1
  662. package/dist/web/routes/sessions.js +9 -1
  663. package/dist/web/routes/sessions.js.map +1 -1
  664. package/dist/web/routes/skill-content.d.ts +30 -0
  665. package/dist/web/routes/skill-content.d.ts.map +1 -0
  666. package/dist/web/routes/skill-content.js +117 -0
  667. package/dist/web/routes/skill-content.js.map +1 -0
  668. package/dist/web/routes/skills-distill.d.ts +29 -0
  669. package/dist/web/routes/skills-distill.d.ts.map +1 -0
  670. package/dist/web/routes/skills-distill.js +552 -0
  671. package/dist/web/routes/skills-distill.js.map +1 -0
  672. package/dist/web/routes/skills.js +7 -7
  673. package/dist/web/routes/skills.js.map +1 -1
  674. package/dist/web/routes/task-timeline.d.ts +102 -0
  675. package/dist/web/routes/task-timeline.d.ts.map +1 -0
  676. package/dist/web/routes/task-timeline.js +274 -0
  677. package/dist/web/routes/task-timeline.js.map +1 -0
  678. package/dist/web/routes/tasks.d.ts.map +1 -1
  679. package/dist/web/routes/tasks.js +355 -8
  680. package/dist/web/routes/tasks.js.map +1 -1
  681. package/dist/web/routes/trace.d.ts.map +1 -1
  682. package/dist/web/routes/trace.js +3 -2
  683. package/dist/web/routes/trace.js.map +1 -1
  684. package/dist/web/routes/types.d.ts +0 -4
  685. package/dist/web/routes/types.d.ts.map +1 -1
  686. package/dist/web/routes/types.js +1 -1
  687. package/dist/web/routes/types.js.map +1 -1
  688. package/dist/web/routes/violations.d.ts +14 -0
  689. package/dist/web/routes/violations.d.ts.map +1 -0
  690. package/dist/web/routes/violations.js +111 -0
  691. package/dist/web/routes/violations.js.map +1 -0
  692. package/dist/web/server.d.ts.map +1 -1
  693. package/dist/web/server.js +79 -19
  694. package/dist/web/server.js.map +1 -1
  695. package/dist/web/services/build-manager.d.ts +72 -0
  696. package/dist/web/services/build-manager.d.ts.map +1 -0
  697. package/dist/web/services/build-manager.js +189 -0
  698. package/dist/web/services/build-manager.js.map +1 -0
  699. package/dist/web/services/distill-manager.d.ts +125 -0
  700. package/dist/web/services/distill-manager.d.ts.map +1 -0
  701. package/dist/web/services/distill-manager.js +308 -0
  702. package/dist/web/services/distill-manager.js.map +1 -0
  703. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js +2 -0
  704. package/dist/web/static/assets/AgentContentPage-DkeRNxok.js.map +1 -0
  705. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js +2 -0
  706. package/dist/web/static/assets/AgentDelegationTable-ByBa0x1l.js.map +1 -0
  707. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js +3 -0
  708. package/dist/web/static/assets/ContextInsightsPage-oUk7_I8u.js.map +1 -0
  709. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js +2 -0
  710. package/dist/web/static/assets/DaemonHealthPage-DG2fyOP7.js.map +1 -0
  711. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js +2 -0
  712. package/dist/web/static/assets/DecisionsPage-CMAPEnKb.js.map +1 -0
  713. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js +2 -0
  714. package/dist/web/static/assets/DiagnosticsPage-DQd-Zm4r.js.map +1 -0
  715. package/dist/web/static/assets/DriftTab-DqpepOhI.js +2 -0
  716. package/dist/web/static/assets/DriftTab-DqpepOhI.js.map +1 -0
  717. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js +3 -0
  718. package/dist/web/static/assets/HealthHomePage-CN6zNIie.js.map +1 -0
  719. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js +2 -0
  720. package/dist/web/static/assets/KbHitRateTable-ByEIWujF.js.map +1 -0
  721. package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js +3 -0
  722. package/dist/web/static/assets/MarkdownRenderer-DZmTl-8J.js.map +1 -0
  723. package/dist/web/static/assets/NotFound-BQPh0vaF.js +2 -0
  724. package/dist/web/static/assets/NotFound-BQPh0vaF.js.map +1 -0
  725. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js +2 -0
  726. package/dist/web/static/assets/ProjectSwitcher-D3lZMFd3.js.map +1 -0
  727. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js +2 -0
  728. package/dist/web/static/assets/SettingsPage-oLJBNzQj.js.map +1 -0
  729. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js +2 -0
  730. package/dist/web/static/assets/SkillContentPage-DK5rgfgw.js.map +1 -0
  731. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js +2 -0
  732. package/dist/web/static/assets/SkillStatsTable-DYMzjEUV.js.map +1 -0
  733. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js +2 -0
  734. package/dist/web/static/assets/SkillsDistillTab-C7qaG8q3.js.map +1 -0
  735. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js +6 -0
  736. package/dist/web/static/assets/TasksHubPage-03wsRRsJ.js.map +1 -0
  737. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js +3 -0
  738. package/dist/web/static/assets/ViolationsPage-DSiLr-9O.js.map +1 -0
  739. package/dist/web/static/assets/arco-Bhi3a6Qp.js +14 -0
  740. package/dist/web/static/assets/arco-Bhi3a6Qp.js.map +1 -0
  741. package/dist/web/static/assets/arco-DFQA6dO_.css +1 -0
  742. package/dist/web/static/assets/charts-BuHQWDbQ.js +37 -0
  743. package/dist/web/static/assets/charts-BuHQWDbQ.js.map +1 -0
  744. package/dist/web/static/assets/date-fns-sbWH3_uq.js +2 -0
  745. package/dist/web/static/assets/date-fns-sbWH3_uq.js.map +1 -0
  746. package/dist/web/static/assets/index-7bl3kbcx.css +1 -0
  747. package/dist/web/static/assets/index-BIYnq1Dx.js +4 -0
  748. package/dist/web/static/assets/index-BIYnq1Dx.js.map +1 -0
  749. package/dist/web/static/assets/lucide-CnlPQoG8.js +72 -0
  750. package/dist/web/static/assets/lucide-CnlPQoG8.js.map +1 -0
  751. package/dist/web/static/assets/outcome-DUn1NjlC.js +2 -0
  752. package/dist/web/static/assets/outcome-DUn1NjlC.js.map +1 -0
  753. package/dist/web/static/assets/query-S6X1S7K9.js +2 -0
  754. package/dist/web/static/assets/{query-C99w429o.js.map → query-S6X1S7K9.js.map} +1 -1
  755. package/dist/web/static/assets/{react-router-r79dBVy4.js → react-router-JVUrkhdd.js} +3 -3
  756. package/dist/web/static/assets/{react-router-r79dBVy4.js.map → react-router-JVUrkhdd.js.map} +1 -1
  757. package/dist/web/static/assets/react-vendor-tkvCrao7.js +57 -0
  758. package/dist/web/static/assets/react-vendor-tkvCrao7.js.map +1 -0
  759. package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js +6 -0
  760. package/dist/web/static/assets/syntax-highlighter-BkZfCDsz.js.map +1 -0
  761. package/dist/web/static/assets/useTabsParam-k8qte_0C.js +2 -0
  762. package/dist/web/static/assets/useTabsParam-k8qte_0C.js.map +1 -0
  763. package/dist/web/static/assets/vendor-DWgdB1eY.js +65 -0
  764. package/dist/web/static/assets/vendor-DWgdB1eY.js.map +1 -0
  765. package/dist/web/static/index.html +12 -8
  766. package/package.json +14 -3
  767. package/dist/core/ai/provider.d.ts +0 -63
  768. package/dist/core/ai/provider.d.ts.map +0 -1
  769. package/dist/core/ai/provider.js +0 -241
  770. package/dist/core/ai/provider.js.map +0 -1
  771. package/dist/core/ai/types.d.ts +0 -43
  772. package/dist/core/ai/types.d.ts.map +0 -1
  773. package/dist/core/ai/types.js +0 -5
  774. package/dist/core/ai/types.js.map +0 -1
  775. package/dist/core/storage/token-usage.d.ts +0 -36
  776. package/dist/core/storage/token-usage.d.ts.map +0 -1
  777. package/dist/core/storage/token-usage.js +0 -59
  778. package/dist/core/storage/token-usage.js.map +0 -1
  779. package/dist/core/utils/token-tracker.d.ts +0 -39
  780. package/dist/core/utils/token-tracker.d.ts.map +0 -1
  781. package/dist/core/utils/token-tracker.js +0 -69
  782. package/dist/core/utils/token-tracker.js.map +0 -1
  783. package/dist/skills/index.d.ts +0 -3
  784. package/dist/skills/index.d.ts.map +0 -1
  785. package/dist/skills/index.js +0 -3
  786. package/dist/skills/index.js.map +0 -1
  787. package/dist/skills/matcher.d.ts +0 -26
  788. package/dist/skills/matcher.d.ts.map +0 -1
  789. package/dist/skills/matcher.js +0 -113
  790. package/dist/skills/matcher.js.map +0 -1
  791. package/dist/skills/official/code-simplifier.md +0 -52
  792. package/dist/skills/official/find-skills.md +0 -142
  793. package/dist/skills/official/official-api-design.md +0 -30
  794. package/dist/skills/official/official-architecture-decision.md +0 -41
  795. package/dist/skills/official/official-bmad.md +0 -118
  796. package/dist/skills/official/official-db-schema-design.md +0 -34
  797. package/dist/skills/official/official-debug.md +0 -25
  798. package/dist/skills/official/official-doc-driven.md +0 -31
  799. package/dist/skills/official/official-harness-engineering.md +0 -108
  800. package/dist/skills/official/official-openspec.md +0 -89
  801. package/dist/skills/official/official-performance-optimization.md +0 -30
  802. package/dist/skills/official/official-pr-review.md +0 -35
  803. package/dist/skills/official/official-release-checklist.md +0 -30
  804. package/dist/skills/official/official-security-hardening.md +0 -32
  805. package/dist/skills/official/official-spec-driven-design.md +0 -31
  806. package/dist/skills/official/planning-with-files.md +0 -241
  807. package/dist/skills/official/ui-ux-pro-max.md +0 -105
  808. package/dist/skills/official/webapp-testing.md +0 -96
  809. package/dist/skills/official-skills.d.ts +0 -26
  810. package/dist/skills/official-skills.d.ts.map +0 -1
  811. package/dist/skills/official-skills.js +0 -74
  812. package/dist/skills/official-skills.js.map +0 -1
  813. package/dist/skills/semantic-matcher.d.ts +0 -60
  814. package/dist/skills/semantic-matcher.d.ts.map +0 -1
  815. package/dist/skills/semantic-matcher.js +0 -192
  816. package/dist/skills/semantic-matcher.js.map +0 -1
  817. package/dist/skills/upgrade-engine.d.ts +0 -93
  818. package/dist/skills/upgrade-engine.d.ts.map +0 -1
  819. package/dist/skills/upgrade-engine.js +0 -447
  820. package/dist/skills/upgrade-engine.js.map +0 -1
  821. package/dist/skills/upgrade-prompt.d.ts +0 -20
  822. package/dist/skills/upgrade-prompt.d.ts.map +0 -1
  823. package/dist/skills/upgrade-prompt.js +0 -75
  824. package/dist/skills/upgrade-prompt.js.map +0 -1
  825. package/dist/web/routes/ai.d.ts +0 -10
  826. package/dist/web/routes/ai.d.ts.map +0 -1
  827. package/dist/web/routes/ai.js +0 -186
  828. package/dist/web/routes/ai.js.map +0 -1
  829. package/dist/web/routes/token-usage.d.ts +0 -7
  830. package/dist/web/routes/token-usage.d.ts.map +0 -1
  831. package/dist/web/routes/token-usage.js +0 -18
  832. package/dist/web/routes/token-usage.js.map +0 -1
  833. package/dist/web/ssrf-guard.d.ts +0 -35
  834. package/dist/web/ssrf-guard.d.ts.map +0 -1
  835. package/dist/web/ssrf-guard.js +0 -93
  836. package/dist/web/ssrf-guard.js.map +0 -1
  837. package/dist/web/static/assets/AIConfig-CdDWzJyO.js +0 -2
  838. package/dist/web/static/assets/AIConfig-CdDWzJyO.js.map +0 -1
  839. package/dist/web/static/assets/Dashboard-CoEmmIDt.js +0 -2
  840. package/dist/web/static/assets/Dashboard-CoEmmIDt.js.map +0 -1
  841. package/dist/web/static/assets/Drawer-DdRTzlLB.js +0 -2
  842. package/dist/web/static/assets/Drawer-DdRTzlLB.js.map +0 -1
  843. package/dist/web/static/assets/Events-DrIq1SUS.js +0 -2
  844. package/dist/web/static/assets/Events-DrIq1SUS.js.map +0 -1
  845. package/dist/web/static/assets/Reports-DFBM3MDK.js +0 -2
  846. package/dist/web/static/assets/Reports-DFBM3MDK.js.map +0 -1
  847. package/dist/web/static/assets/SearchInput-qCj_jAcf.js +0 -2
  848. package/dist/web/static/assets/SearchInput-qCj_jAcf.js.map +0 -1
  849. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js +0 -2
  850. package/dist/web/static/assets/SessionDetail-CCzwdoT7.js.map +0 -1
  851. package/dist/web/static/assets/Sessions-FfLYkAw9.js +0 -2
  852. package/dist/web/static/assets/Sessions-FfLYkAw9.js.map +0 -1
  853. package/dist/web/static/assets/Skills-C8Gvs3Qa.js +0 -2
  854. package/dist/web/static/assets/Skills-C8Gvs3Qa.js.map +0 -1
  855. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js +0 -2
  856. package/dist/web/static/assets/TaskDetail-BS8pYhaR.js.map +0 -1
  857. package/dist/web/static/assets/Tasks-CyuhizG8.js +0 -2
  858. package/dist/web/static/assets/Tasks-CyuhizG8.js.map +0 -1
  859. package/dist/web/static/assets/charts-CLrM0_uM.js +0 -37
  860. package/dist/web/static/assets/charts-CLrM0_uM.js.map +0 -1
  861. package/dist/web/static/assets/date-fns-CZ_bHujz.js +0 -2
  862. package/dist/web/static/assets/date-fns-CZ_bHujz.js.map +0 -1
  863. package/dist/web/static/assets/export-L_VBD2p1.js +0 -4
  864. package/dist/web/static/assets/export-L_VBD2p1.js.map +0 -1
  865. package/dist/web/static/assets/index-CBX47X8l.js +0 -3
  866. package/dist/web/static/assets/index-CBX47X8l.js.map +0 -1
  867. package/dist/web/static/assets/index-DjIoMdoR.css +0 -1
  868. package/dist/web/static/assets/lucide-Bs_edTLa.js +0 -232
  869. package/dist/web/static/assets/lucide-Bs_edTLa.js.map +0 -1
  870. package/dist/web/static/assets/query-C99w429o.js +0 -2
  871. package/dist/web/static/assets/react-vendor-CSp-GLFF.js +0 -49
  872. package/dist/web/static/assets/react-vendor-CSp-GLFF.js.map +0 -1
  873. package/dist/web/static/assets/syntax-highlighter-44FakypI.js +0 -9
  874. package/dist/web/static/assets/syntax-highlighter-44FakypI.js.map +0 -1
  875. package/dist/web/static/assets/task-title-BhOcemuR.js +0 -2
  876. package/dist/web/static/assets/task-title-BhOcemuR.js.map +0 -1
  877. package/dist/web/static/assets/time-Bxuk0M-C.js +0 -2
  878. package/dist/web/static/assets/time-Bxuk0M-C.js.map +0 -1
  879. package/dist/web/static/assets/vendor-CMMjVdZs.js +0 -64
  880. package/dist/web/static/assets/vendor-CMMjVdZs.js.map +0 -1
@@ -0,0 +1,127 @@
1
+ /**
2
+ * SpecApproval — v9.x Phase 2b approve-token verifier.
3
+ *
4
+ * Companion service to `SpecGenerator`. Called by `UserPromptHandler.step 2.7`
5
+ * when the user types `approve <token>` exactly. The handler:
6
+ * 1. Detects the 'approve <8-hex>' pattern
7
+ * 2. Asks `SpecApproval.verify(token, session_id)` for the outcome
8
+ * 3. Surfaces a systemMessage based on the outcome
9
+ * 4. Short-circuits if outcome === 'ok' (skips KB / Skill / workflow rec)
10
+ *
11
+ * Why a separate service: keeps the handler thin and makes the verifier
12
+ * trivially testable without spinning up the whole UserPromptHandler graph.
13
+ *
14
+ * P0 safety (doc-reviewer Sub-2 report): verify() MUST filter by session_id.
15
+ * A token leaked across sessions must NOT be approve-able. The underlying
16
+ * facade method `findSpecByTokenAndSession` enforces this.
17
+ *
18
+ * No 'modify' code path is implemented in Phase 2b (spec § 3.4 mentions it
19
+ * in the systemMessage hint but § 3.5 leaves it un-implemented). The
20
+ * handler-side messages have been adjusted to advertise only `approve` and
21
+ * `skip`. See changelog "modify path simplification" decision.
22
+ */
23
+ import type { SQLiteStorage } from '../../core/storage/sqlite.js';
24
+ import type { SpecLikeRow } from '../../core/storage/decisions.js';
25
+ import type { SpecApprovalOutcome, SpecApprovalResult, SpecApprovalRowLike } from '../../core/types.js';
26
+ /**
27
+ * Regex matching exactly `approve <8-hex>` with no surrounding text.
28
+ *
29
+ * Kept for backward compatibility — `extractToken` still uses it for the
30
+ * pure-token path. Bug 1 (2026-05-27 spec § 3.1) extends approval semantics
31
+ * to CJK / token-less variants via {@link APPROVAL_KEYWORD_REGEX} + the new
32
+ * {@link SpecApproval.extractApprovalIntent} method.
33
+ */
34
+ export declare const APPROVE_REGEX: RegExp;
35
+ /**
36
+ * Regex matching the WHOLE prompt as a bare approval keyword
37
+ * (Chinese / English) OPTIONALLY followed by an 8-hex token. Used by
38
+ * {@link SpecApproval.extractApprovalIntent} so any of the following short-
39
+ * circuit into spec-approval pipeline (Bug 1 spec § 3.1):
40
+ *
41
+ * '批准' → hasIntent=true, token=undefined → fallback search
42
+ * '同意' → ditto (Chinese formal)
43
+ * 'approve' → ditto (English bare; legacy regex required token)
44
+ * '批准 a1b2c3d4' → hasIntent=true, token='a1b2c3d4'
45
+ * '批准 A1B2C3D4 ' → tolerates whitespace + case
46
+ *
47
+ * Strict anchoring (`^…$`) prevents '我同意,但是...' from matching — a
48
+ * complex sentence containing the keyword is NOT an approval signal.
49
+ */
50
+ export declare const APPROVAL_KEYWORD_REGEX: RegExp;
51
+ /**
52
+ * Result of {@link SpecApproval.extractApprovalIntent}. `hasIntent` is the
53
+ * caller's short-circuit gate; `token` is set ONLY when the prompt carried
54
+ * an explicit 8-hex (otherwise the caller must fallback to listSessionPending).
55
+ */
56
+ export interface ApprovalIntent {
57
+ hasIntent: boolean;
58
+ token?: string;
59
+ }
60
+ export declare class SpecApproval {
61
+ private readonly storage;
62
+ constructor(storage: SQLiteStorage);
63
+ /**
64
+ * Try to extract a token from a raw user prompt. Returns the 8-hex string
65
+ * (lowercase) when the WHOLE prompt is exactly `approve <token>`. Returns
66
+ * null otherwise — that's the signal for the handler to NOT short-circuit.
67
+ *
68
+ * Strict-format requirement (spec § 3.5 risk note): if the user mixes
69
+ * 'approve abc12345' with additional text, we let the prompt proceed
70
+ * through the normal pipeline to avoid losing their new request.
71
+ */
72
+ extractToken(prompt: string): string | null;
73
+ /**
74
+ * Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval detector.
75
+ * Returns:
76
+ * - `{ hasIntent: false }` when prompt is NOT an approval signal
77
+ * - `{ hasIntent: true, token }` when prompt is e.g. '批准 a1b2c3d4'
78
+ * - `{ hasIntent: true }` (no token) when prompt is bare '批准' / 'approve'
79
+ *
80
+ * Caller (`SpecGate.handleApproval`) uses `hasIntent` as the short-circuit
81
+ * gate and `token` to decide whether to call `verify` directly or fall back
82
+ * to `listSessionPending` to pick the latest pending row.
83
+ *
84
+ * Strict-format anchoring prevents complex sentences like '我同意,但是…'
85
+ * from triggering approval — the keyword must be the WHOLE prompt.
86
+ */
87
+ extractApprovalIntent(prompt: string): ApprovalIntent;
88
+ /**
89
+ * Verify a token. C1 (spec 0854): look up the decisions table (kind='spec'),
90
+ * scoped by session_id (P0 safety — a leaked cross-session token must never
91
+ * approve someone else's spec). The legacy pending_specs table is gone.
92
+ *
93
+ * Outcomes (see SpecApprovalResult in src/core/types.ts):
94
+ * • 'ok' — found, status='generated', flipped to 'approved'
95
+ * • 'not_found' — token unknown OR session mismatch (P0 safety)
96
+ * • 'expired' — found but status='expired'
97
+ * • 'already_approved' — found but status='approved'
98
+ *
99
+ * The function COMMITS the status flip when outcome === 'ok' via
100
+ * markSpecApproved (decisions). Idempotent.
101
+ */
102
+ verify(token: string, sessionId: string, nowIso?: string): SpecApprovalResult;
103
+ /**
104
+ * List still-pending specs for a session (for the "unknown token" hint).
105
+ *
106
+ * C1 (spec 0854): reads decisions kind='spec' pending rows only. Returns the
107
+ * SpecLikeRow shape consumed by spec-gate / formatApprovalMessage.
108
+ */
109
+ listSessionPending(sessionId: string, limit?: number): SpecLikeRow[];
110
+ private classifyAndCommit;
111
+ }
112
+ /**
113
+ * Render the systemMessage shown to the main thread for each outcome.
114
+ *
115
+ * Centralized here so SpecGenerator / SpecApproval / the handler all agree
116
+ * on the wording. Format is intentionally short to keep the system message
117
+ * cheap (KB inject + intent + KB block already accumulate).
118
+ */
119
+ export declare function formatApprovalMessage(outcome: SpecApprovalOutcome, args: {
120
+ token: string;
121
+ row?: SpecApprovalRowLike;
122
+ pendingList?: Array<{
123
+ token: string;
124
+ spec_path: string;
125
+ }>;
126
+ }): string;
127
+ //# sourceMappingURL=spec-approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-approval.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/spec-approval.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAG7B;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAqC,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,QACc,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAEnD;;;;;;;;OAQG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM3C;;;;;;;;;;;;;OAaG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc;IAQrD;;;;;;;;;;;;;OAaG;IACH,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,kBAAkB;IAcrB;;;;;OAKG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,WAAW,EAAE;IAS/D,OAAO,CAAC,iBAAiB;CAkC1B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE;IACJ,KAAK,EAAE,MAAM,CAAC;IAId,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3D,GACA,MAAM,CAmCR"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * SpecApproval — v9.x Phase 2b approve-token verifier.
3
+ *
4
+ * Companion service to `SpecGenerator`. Called by `UserPromptHandler.step 2.7`
5
+ * when the user types `approve <token>` exactly. The handler:
6
+ * 1. Detects the 'approve <8-hex>' pattern
7
+ * 2. Asks `SpecApproval.verify(token, session_id)` for the outcome
8
+ * 3. Surfaces a systemMessage based on the outcome
9
+ * 4. Short-circuits if outcome === 'ok' (skips KB / Skill / workflow rec)
10
+ *
11
+ * Why a separate service: keeps the handler thin and makes the verifier
12
+ * trivially testable without spinning up the whole UserPromptHandler graph.
13
+ *
14
+ * P0 safety (doc-reviewer Sub-2 report): verify() MUST filter by session_id.
15
+ * A token leaked across sessions must NOT be approve-able. The underlying
16
+ * facade method `findSpecByTokenAndSession` enforces this.
17
+ *
18
+ * No 'modify' code path is implemented in Phase 2b (spec § 3.4 mentions it
19
+ * in the systemMessage hint but § 3.5 leaves it un-implemented). The
20
+ * handler-side messages have been adjusted to advertise only `approve` and
21
+ * `skip`. See changelog "modify path simplification" decision.
22
+ */
23
+ import { toSpecLikeRow } from '../../core/storage/decisions.js';
24
+ import { logger } from '../../core/utils/logger.js';
25
+ /**
26
+ * Regex matching exactly `approve <8-hex>` with no surrounding text.
27
+ *
28
+ * Kept for backward compatibility — `extractToken` still uses it for the
29
+ * pure-token path. Bug 1 (2026-05-27 spec § 3.1) extends approval semantics
30
+ * to CJK / token-less variants via {@link APPROVAL_KEYWORD_REGEX} + the new
31
+ * {@link SpecApproval.extractApprovalIntent} method.
32
+ */
33
+ export const APPROVE_REGEX = /^\s*approve\s+([a-f0-9]{8})\s*$/i;
34
+ /**
35
+ * Regex matching the WHOLE prompt as a bare approval keyword
36
+ * (Chinese / English) OPTIONALLY followed by an 8-hex token. Used by
37
+ * {@link SpecApproval.extractApprovalIntent} so any of the following short-
38
+ * circuit into spec-approval pipeline (Bug 1 spec § 3.1):
39
+ *
40
+ * '批准' → hasIntent=true, token=undefined → fallback search
41
+ * '同意' → ditto (Chinese formal)
42
+ * 'approve' → ditto (English bare; legacy regex required token)
43
+ * '批准 a1b2c3d4' → hasIntent=true, token='a1b2c3d4'
44
+ * '批准 A1B2C3D4 ' → tolerates whitespace + case
45
+ *
46
+ * Strict anchoring (`^…$`) prevents '我同意,但是...' from matching — a
47
+ * complex sentence containing the keyword is NOT an approval signal.
48
+ */
49
+ export const APPROVAL_KEYWORD_REGEX = /^\s*(批准|同意|approve)(?:\s+([a-f0-9]{8}))?\s*$/i;
50
+ export class SpecApproval {
51
+ storage;
52
+ constructor(storage) {
53
+ this.storage = storage;
54
+ }
55
+ /**
56
+ * Try to extract a token from a raw user prompt. Returns the 8-hex string
57
+ * (lowercase) when the WHOLE prompt is exactly `approve <token>`. Returns
58
+ * null otherwise — that's the signal for the handler to NOT short-circuit.
59
+ *
60
+ * Strict-format requirement (spec § 3.5 risk note): if the user mixes
61
+ * 'approve abc12345' with additional text, we let the prompt proceed
62
+ * through the normal pipeline to avoid losing their new request.
63
+ */
64
+ extractToken(prompt) {
65
+ if (!prompt)
66
+ return null;
67
+ const m = prompt.match(APPROVE_REGEX);
68
+ return m ? m[1].toLowerCase() : null;
69
+ }
70
+ /**
71
+ * Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval detector.
72
+ * Returns:
73
+ * - `{ hasIntent: false }` when prompt is NOT an approval signal
74
+ * - `{ hasIntent: true, token }` when prompt is e.g. '批准 a1b2c3d4'
75
+ * - `{ hasIntent: true }` (no token) when prompt is bare '批准' / 'approve'
76
+ *
77
+ * Caller (`SpecGate.handleApproval`) uses `hasIntent` as the short-circuit
78
+ * gate and `token` to decide whether to call `verify` directly or fall back
79
+ * to `listSessionPending` to pick the latest pending row.
80
+ *
81
+ * Strict-format anchoring prevents complex sentences like '我同意,但是…'
82
+ * from triggering approval — the keyword must be the WHOLE prompt.
83
+ */
84
+ extractApprovalIntent(prompt) {
85
+ if (!prompt)
86
+ return { hasIntent: false };
87
+ const m = prompt.match(APPROVAL_KEYWORD_REGEX);
88
+ if (!m)
89
+ return { hasIntent: false };
90
+ const token = m[2] ? m[2].toLowerCase() : undefined;
91
+ return { hasIntent: true, token };
92
+ }
93
+ /**
94
+ * Verify a token. C1 (spec 0854): look up the decisions table (kind='spec'),
95
+ * scoped by session_id (P0 safety — a leaked cross-session token must never
96
+ * approve someone else's spec). The legacy pending_specs table is gone.
97
+ *
98
+ * Outcomes (see SpecApprovalResult in src/core/types.ts):
99
+ * • 'ok' — found, status='generated', flipped to 'approved'
100
+ * • 'not_found' — token unknown OR session mismatch (P0 safety)
101
+ * • 'expired' — found but status='expired'
102
+ * • 'already_approved' — found but status='approved'
103
+ *
104
+ * The function COMMITS the status flip when outcome === 'ok' via
105
+ * markSpecApproved (decisions). Idempotent.
106
+ */
107
+ verify(token, sessionId, nowIso) {
108
+ if (!token || !sessionId) {
109
+ return { outcome: 'not_found' };
110
+ }
111
+ const tok = token.toLowerCase();
112
+ const decisionRow = this.storage.findSpecByTokenAndSession(tok, sessionId);
113
+ if (decisionRow) {
114
+ return this.classifyAndCommit(toSpecLikeRow(decisionRow), decisionRow.id, nowIso);
115
+ }
116
+ return { outcome: 'not_found' };
117
+ }
118
+ /**
119
+ * List still-pending specs for a session (for the "unknown token" hint).
120
+ *
121
+ * C1 (spec 0854): reads decisions kind='spec' pending rows only. Returns the
122
+ * SpecLikeRow shape consumed by spec-gate / formatApprovalMessage.
123
+ */
124
+ listSessionPending(sessionId, limit = 5) {
125
+ return this.storage
126
+ .listSpecsBySessionPending(sessionId, limit)
127
+ .map((d) => toSpecLikeRow(d))
128
+ .slice(0, limit);
129
+ }
130
+ // ── Internals ─────────────────────────────────────────────────────────
131
+ classifyAndCommit(row, rowId, nowIso) {
132
+ switch (row.status) {
133
+ case 'expired':
134
+ return { outcome: 'expired', row };
135
+ case 'approved':
136
+ return { outcome: 'already_approved', row };
137
+ case 'skipped':
138
+ case 'modified':
139
+ // Treat anything non-'generated' that isn't expired/approved as
140
+ // already-approved for UX simplicity. Surface row so the caller
141
+ // can format a useful systemMessage.
142
+ return { outcome: 'already_approved', row };
143
+ case 'generated':
144
+ try {
145
+ this.storage.markSpecApproved(rowId, nowIso);
146
+ }
147
+ catch (err) {
148
+ logger.warn(`[SpecApproval] markApproved failed for id=${rowId}: ${err}`);
149
+ }
150
+ return {
151
+ outcome: 'ok',
152
+ row: {
153
+ ...row,
154
+ status: 'approved',
155
+ approved_at: nowIso ?? new Date().toISOString(),
156
+ },
157
+ };
158
+ default:
159
+ return { outcome: 'not_found', row };
160
+ }
161
+ }
162
+ }
163
+ /**
164
+ * Render the systemMessage shown to the main thread for each outcome.
165
+ *
166
+ * Centralized here so SpecGenerator / SpecApproval / the handler all agree
167
+ * on the wording. Format is intentionally short to keep the system message
168
+ * cheap (KB inject + intent + KB block already accumulate).
169
+ */
170
+ export function formatApprovalMessage(outcome, args) {
171
+ const { token, row, pendingList } = args;
172
+ switch (outcome) {
173
+ case 'ok': {
174
+ const spec = row?.spec_path ?? '(unknown spec)';
175
+ const intent = safeParseIntent(row?.intent_json);
176
+ const agent = intent?.suggested_agent ?? 'planner';
177
+ return [
178
+ '[AUTO-SPEC APPROVED]',
179
+ '',
180
+ `Spec 已批准: ${spec}`,
181
+ `推荐 agent: ${agent}`,
182
+ '',
183
+ `主线程请用 Task tool spawn subagent_type='${agent}'`,
184
+ `Task prompt 必须以 "Read ${spec} 然后..." 开头。`,
185
+ ].join('\n');
186
+ }
187
+ case 'not_found': {
188
+ const hint = pendingList && pendingList.length > 0
189
+ ? '\n当前 pending tokens:\n' +
190
+ pendingList
191
+ .map((r) => ` • ${r.token} → ${r.spec_path}`)
192
+ .join('\n')
193
+ : '\n本 session 没有 pending spec。';
194
+ return `[AUTO-SPEC] 未找到 token "${token}"。可能已过期,或不属于本 session。${hint}`;
195
+ }
196
+ case 'expired':
197
+ return `[AUTO-SPEC] token "${token}" 已过期。请重新发起原 prompt 让 daemon 生成新 spec。`;
198
+ case 'already_approved':
199
+ return `[AUTO-SPEC] token "${token}" 已被 approve 过。请按 spec 执行;无需再次回复 approve。`;
200
+ case 'wrong_session':
201
+ return `[AUTO-SPEC] token "${token}" 不属于本 session。`;
202
+ default:
203
+ return `[AUTO-SPEC] 未识别的状态。`;
204
+ }
205
+ }
206
+ function safeParseIntent(json) {
207
+ if (!json)
208
+ return null;
209
+ try {
210
+ return JSON.parse(json);
211
+ }
212
+ catch {
213
+ return null;
214
+ }
215
+ }
216
+ //# sourceMappingURL=spec-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-approval.js","sourceRoot":"","sources":["../../../src/daemon/services/spec-approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * SpecGate — orchestrates the approve-token short-circuit (step 0) inside
3
+ * `UserPromptHandler`.
4
+ *
5
+ * Extracted from `UserPromptHandler` (D-3 step 0). Stateless wrapper around
6
+ * `SpecApproval` so the handler can stay thin.
7
+ *
8
+ * The method is fail-silent unless documented otherwise — the prompt pipeline
9
+ * must keep running even if persistence hiccups.
10
+ *
11
+ * 2026-05-27 Spec 1702: `tryAutoGenerate` + `SpecGenerator` integration
12
+ * removed entirely (0% real-world acceptance rate → dead code).
13
+ * `SpecApproval` + `handleApproval` + `handleApproveToken` are preserved for
14
+ * the hand-written spec register path (planner agent calls `cf spec register`
15
+ * then user replies "批准").
16
+ */
17
+ import type { UserPromptSubmitEvent } from '../../core/types.js';
18
+ import type { SpecApproval } from './spec-approval.js';
19
+ export declare class SpecGate {
20
+ private readonly specApproval;
21
+ constructor(specApproval?: SpecApproval | null);
22
+ /**
23
+ * Step 0 short-circuit: if the prompt is exactly `approve <8-hex>`,
24
+ * verify the token and return a system message. Returns `null` when the
25
+ * prompt is not an approve command (caller continues the regular pipeline).
26
+ *
27
+ * @deprecated Bug 1 (2026-05-27 spec § 3.1) — use {@link handleApproval}
28
+ * instead, which also handles bare CJK keywords ('批准' / '同意') and
29
+ * falls back to the latest pending row when no token is supplied. Kept
30
+ * for backwards compatibility / unit tests that already cover the
31
+ * token-only path.
32
+ */
33
+ handleApproveToken(event: UserPromptSubmitEvent, prompt: string): string | null;
34
+ /**
35
+ * Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval handler.
36
+ *
37
+ * Recognises:
38
+ * - 'approve <8-hex>' → verify token directly
39
+ * - '批准 <8-hex>' / '同意 <8-hex>' → verify token directly
40
+ * - bare '批准' / '同意' / 'approve' → fallback to latest pending row in
41
+ * the session, verify its token
42
+ *
43
+ * Returns:
44
+ * - systemMessage string → caller short-circuits (skip KB / Skill / wf rec)
45
+ * - null → not an approval signal; caller runs normal pipe
46
+ *
47
+ * Per spec Q6 (user-approved): even when fallback finds NO pending row,
48
+ * we STILL short-circuit with a [AUTO-SPEC] '本 session 没有 pending spec'
49
+ * systemMessage. Letting bare '批准' fall through to normal pipeline would
50
+ * eat the prompt as a no-op task title (Bug 1 root cause).
51
+ */
52
+ handleApproval(event: UserPromptSubmitEvent, prompt: string): string | null;
53
+ }
54
+ //# sourceMappingURL=spec-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-gate.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/spec-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,qBAAa,QAAQ;IAEjB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,GAAE,YAAY,GAAG,IAAW;IAG3D;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkB/E;;;;;;;;;;;;;;;;;OAiBG;IACH,cAAc,CAAC,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAkD5E"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * SpecGate — orchestrates the approve-token short-circuit (step 0) inside
3
+ * `UserPromptHandler`.
4
+ *
5
+ * Extracted from `UserPromptHandler` (D-3 step 0). Stateless wrapper around
6
+ * `SpecApproval` so the handler can stay thin.
7
+ *
8
+ * The method is fail-silent unless documented otherwise — the prompt pipeline
9
+ * must keep running even if persistence hiccups.
10
+ *
11
+ * 2026-05-27 Spec 1702: `tryAutoGenerate` + `SpecGenerator` integration
12
+ * removed entirely (0% real-world acceptance rate → dead code).
13
+ * `SpecApproval` + `handleApproval` + `handleApproveToken` are preserved for
14
+ * the hand-written spec register path (planner agent calls `cf spec register`
15
+ * then user replies "批准").
16
+ */
17
+ import { formatApprovalMessage } from './spec-approval.js';
18
+ import { logger } from '../../core/utils/logger.js';
19
+ export class SpecGate {
20
+ specApproval;
21
+ constructor(specApproval = null) {
22
+ this.specApproval = specApproval;
23
+ }
24
+ /**
25
+ * Step 0 short-circuit: if the prompt is exactly `approve <8-hex>`,
26
+ * verify the token and return a system message. Returns `null` when the
27
+ * prompt is not an approve command (caller continues the regular pipeline).
28
+ *
29
+ * @deprecated Bug 1 (2026-05-27 spec § 3.1) — use {@link handleApproval}
30
+ * instead, which also handles bare CJK keywords ('批准' / '同意') and
31
+ * falls back to the latest pending row when no token is supplied. Kept
32
+ * for backwards compatibility / unit tests that already cover the
33
+ * token-only path.
34
+ */
35
+ handleApproveToken(event, prompt) {
36
+ if (!this.specApproval)
37
+ return null;
38
+ const token = this.specApproval.extractToken(prompt);
39
+ if (!token)
40
+ return null;
41
+ const result = this.specApproval.verify(token, event.session_id, event.timestamp);
42
+ const pendingList = result.outcome === 'not_found'
43
+ ? this.specApproval.listSessionPending(event.session_id)
44
+ : undefined;
45
+ const msg = formatApprovalMessage(result.outcome, {
46
+ token,
47
+ row: result.row,
48
+ pendingList,
49
+ });
50
+ logger.info(`[SpecGate] Approve short-circuit: ${result.outcome} token=${token}`);
51
+ return msg;
52
+ }
53
+ /**
54
+ * Bug 1 fix (2026-05-27 spec § 3.1) — generalised approval handler.
55
+ *
56
+ * Recognises:
57
+ * - 'approve <8-hex>' → verify token directly
58
+ * - '批准 <8-hex>' / '同意 <8-hex>' → verify token directly
59
+ * - bare '批准' / '同意' / 'approve' → fallback to latest pending row in
60
+ * the session, verify its token
61
+ *
62
+ * Returns:
63
+ * - systemMessage string → caller short-circuits (skip KB / Skill / wf rec)
64
+ * - null → not an approval signal; caller runs normal pipe
65
+ *
66
+ * Per spec Q6 (user-approved): even when fallback finds NO pending row,
67
+ * we STILL short-circuit with a [AUTO-SPEC] '本 session 没有 pending spec'
68
+ * systemMessage. Letting bare '批准' fall through to normal pipeline would
69
+ * eat the prompt as a no-op task title (Bug 1 root cause).
70
+ */
71
+ handleApproval(event, prompt) {
72
+ if (!this.specApproval)
73
+ return null;
74
+ const intent = this.specApproval.extractApprovalIntent(prompt);
75
+ if (!intent.hasIntent)
76
+ return null;
77
+ // Path A: caller supplied explicit token → direct verify (legacy behavior).
78
+ if (intent.token) {
79
+ const result = this.specApproval.verify(intent.token, event.session_id, event.timestamp);
80
+ const pendingList = result.outcome === 'not_found'
81
+ ? this.specApproval.listSessionPending(event.session_id)
82
+ : undefined;
83
+ const msg = formatApprovalMessage(result.outcome, {
84
+ token: intent.token,
85
+ row: result.row,
86
+ pendingList,
87
+ });
88
+ logger.info(`[SpecGate] Approval short-circuit (with-token): ${result.outcome} token=${intent.token}`);
89
+ return msg;
90
+ }
91
+ // Path B: bare keyword → fallback to the latest pending row for this
92
+ // session. listSessionPending already filters status='generated' DESC by
93
+ // created_at, so LIMIT 1 gives us the most recent unapproved spec.
94
+ const recent = this.specApproval.listSessionPending(event.session_id, 1);
95
+ if (recent.length === 0) {
96
+ // Spec Q6: no pending → return systemMessage saying so (DON'T fallthrough).
97
+ logger.info('[SpecGate] Approval short-circuit (no-token): no pending spec found');
98
+ return formatApprovalMessage('not_found', {
99
+ token: '(无 token)',
100
+ pendingList: [],
101
+ });
102
+ }
103
+ const candidate = recent[0];
104
+ const result = this.specApproval.verify(candidate.token, event.session_id, event.timestamp);
105
+ logger.info(`[SpecGate] Approval short-circuit (no-token fallback): ${result.outcome} ` +
106
+ `token=${candidate.token} spec=${candidate.spec_path}`);
107
+ return formatApprovalMessage(result.outcome, {
108
+ token: candidate.token,
109
+ row: result.row ?? candidate,
110
+ });
111
+ }
112
+ }
113
+ //# sourceMappingURL=spec-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-gate.js","sourceRoot":"","sources":["../../../src/daemon/services/spec-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * TaskBoundaryClassifier — async LLM "new task vs continuation" re-attribution.
3
+ *
4
+ * decision 265f59d5 (Option A, 2026-06-08). Solves the residual case the
5
+ * synchronous lexical segmenter cannot: a SHORT, ambiguous follow-up prompt
6
+ * that is neither a clear ack ("继续"/"好的") nor carries a NEW_TASK_KEYWORD,
7
+ * e.g. "现在全链路是不是都顺了" vs "文件也看下" — lexically indistinguishable,
8
+ * yet one is a new task and the other a continuation.
9
+ *
10
+ * ── Hot-path contract (NEVER block UserPromptSubmit) ──────────────────────
11
+ * The synchronous segmenter ALWAYS runs first and gives the prompt a
12
+ * best-effort task (zero latency). THIS service runs entirely in the
13
+ * background, fire-and-forget. It spawns `claude` (haiku) only for the ~30%
14
+ * of prompts the segmenter flagged ambiguous, then LAZILY re-attributes:
15
+ * • LLM says NEW_TASK → move the prompt's event onto a brand-new task row
16
+ * (only `task_events.task_id` FK is touched — no event delete, no content
17
+ * mutation). See SQLiteStorage.reattributePromptToNewTask.
18
+ * • LLM says CONTINUATION → leave the sync best-effort merge untouched, just
19
+ * stamp `llm_classified_at` so a replay never re-spawns.
20
+ *
21
+ * Failure mode: ANY spawn / timeout / parse error → give up, keep the sync
22
+ * result, never throw. Mirrors OutcomeClassificationService's fire-and-forget
23
+ * discipline.
24
+ */
25
+ import type { SQLiteStorage } from '../../core/storage/sqlite.js';
26
+ /** Verdict the agent must return (exactly one of these tokens). */
27
+ export type BoundaryVerdict = 'NEW_TASK' | 'CONTINUATION';
28
+ /**
29
+ * Pluggable spawn function — production binds {@link spawnClaudeCli}; tests
30
+ * inject a stub that returns a canned verdict WITHOUT touching claude.
31
+ */
32
+ export type BoundarySpawnFn = (prompt: string) => Promise<string>;
33
+ /** A unit of work enqueued by the segmenter for the ambiguous prompt. */
34
+ export interface BoundaryClassifyJob {
35
+ sessionId: string;
36
+ /** The task the sync path best-effort merged this prompt into. */
37
+ mergedTaskId: string;
38
+ /** The UserPromptSubmit event that should move if the verdict is NEW_TASK. */
39
+ eventId: string;
40
+ /** The ambiguous prompt text itself. */
41
+ prompt: string;
42
+ /** Event timestamp (ISO) — used as the new task's start_time. */
43
+ timestamp: string;
44
+ }
45
+ export declare class TaskBoundaryClassifier {
46
+ private readonly spawnFn;
47
+ /**
48
+ * @param spawnFn optional spawn override (tests). Default spawns the
49
+ * `task-boundary-classifier` agent via claude haiku.
50
+ */
51
+ constructor(opts?: {
52
+ spawnFn?: BoundarySpawnFn;
53
+ timeoutMs?: number;
54
+ claudeBin?: string;
55
+ });
56
+ /**
57
+ * Classify one ambiguous prompt and, if NEW_TASK, re-attribute it.
58
+ * Fire-and-forget: never throws. Returns the new task id when it split,
59
+ * else null (CONTINUATION, idempotent skip, or any failure).
60
+ */
61
+ classify(job: BoundaryClassifyJob, storage: SQLiteStorage): Promise<string | null>;
62
+ private safePriorPrompts;
63
+ }
64
+ /**
65
+ * Build the bare classification prompt handed to the agent. The agent body
66
+ * (.claude/agents/task-boundary-classifier.md) instructs it to answer with a
67
+ * single token; we still keep the contract inline so a bare-prompt spawn
68
+ * (no agent template synced yet) also works.
69
+ */
70
+ export declare function buildBoundaryPrompt(priorPrompts: string[], current: string): string;
71
+ /**
72
+ * Extract the agent's single-token verdict from raw stdout. Tolerant: the
73
+ * model may wrap the token in punctuation / markdown / a sentence. We scan for
74
+ * the first NEW_TASK / CONTINUATION occurrence (case-insensitive). Returns null
75
+ * when neither token is present (caller keeps the sync merge).
76
+ */
77
+ export declare function parseVerdict(raw: string): BoundaryVerdict | null;
78
+ //# sourceMappingURL=task-boundary-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-boundary-classifier.d.ts","sourceRoot":"","sources":["../../../src/daemon/services/task-boundary-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAOlE,mEAAmE;AACnE,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,cAAc,CAAC;AAE1D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAElE,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAE1C;;;OAGG;gBACS,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,eAAe,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAe5F;;;;OAIG;IACG,QAAQ,CAAC,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgGxF,OAAO,CAAC,gBAAgB;CAQzB;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAcnF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAUhE"}