mstro-app 0.4.2 → 0.4.4

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 (342) hide show
  1. package/bin/mstro.js +119 -40
  2. package/dist/server/cli/headless/claude-invoker-process.d.ts +11 -0
  3. package/dist/server/cli/headless/claude-invoker-process.d.ts.map +1 -0
  4. package/dist/server/cli/headless/claude-invoker-process.js +140 -0
  5. package/dist/server/cli/headless/claude-invoker-process.js.map +1 -0
  6. package/dist/server/cli/headless/claude-invoker-stall.d.ts +40 -0
  7. package/dist/server/cli/headless/claude-invoker-stall.d.ts.map +1 -0
  8. package/dist/server/cli/headless/claude-invoker-stall.js +98 -0
  9. package/dist/server/cli/headless/claude-invoker-stall.js.map +1 -0
  10. package/dist/server/cli/headless/claude-invoker-stream.d.ts +44 -0
  11. package/dist/server/cli/headless/claude-invoker-stream.d.ts.map +1 -0
  12. package/dist/server/cli/headless/claude-invoker-stream.js +276 -0
  13. package/dist/server/cli/headless/claude-invoker-stream.js.map +1 -0
  14. package/dist/server/cli/headless/claude-invoker-tools.d.ts +21 -0
  15. package/dist/server/cli/headless/claude-invoker-tools.d.ts.map +1 -0
  16. package/dist/server/cli/headless/claude-invoker-tools.js +137 -0
  17. package/dist/server/cli/headless/claude-invoker-tools.js.map +1 -0
  18. package/dist/server/cli/headless/claude-invoker.d.ts +6 -4
  19. package/dist/server/cli/headless/claude-invoker.d.ts.map +1 -1
  20. package/dist/server/cli/headless/claude-invoker.js +10 -804
  21. package/dist/server/cli/headless/claude-invoker.js.map +1 -1
  22. package/dist/server/cli/headless/haiku-assessments.d.ts +62 -0
  23. package/dist/server/cli/headless/haiku-assessments.d.ts.map +1 -0
  24. package/dist/server/cli/headless/haiku-assessments.js +281 -0
  25. package/dist/server/cli/headless/haiku-assessments.js.map +1 -0
  26. package/dist/server/cli/headless/headless-logger.d.ts +3 -2
  27. package/dist/server/cli/headless/headless-logger.d.ts.map +1 -1
  28. package/dist/server/cli/headless/headless-logger.js +28 -5
  29. package/dist/server/cli/headless/headless-logger.js.map +1 -1
  30. package/dist/server/cli/headless/native-timeout-detector.d.ts +44 -0
  31. package/dist/server/cli/headless/native-timeout-detector.d.ts.map +1 -0
  32. package/dist/server/cli/headless/native-timeout-detector.js +99 -0
  33. package/dist/server/cli/headless/native-timeout-detector.js.map +1 -0
  34. package/dist/server/cli/headless/stall-assessor.d.ts +2 -110
  35. package/dist/server/cli/headless/stall-assessor.d.ts.map +1 -1
  36. package/dist/server/cli/headless/stall-assessor.js +65 -457
  37. package/dist/server/cli/headless/stall-assessor.js.map +1 -1
  38. package/dist/server/cli/headless/types.d.ts +4 -1
  39. package/dist/server/cli/headless/types.d.ts.map +1 -1
  40. package/dist/server/cli/improvisation-attachments.d.ts +21 -0
  41. package/dist/server/cli/improvisation-attachments.d.ts.map +1 -0
  42. package/dist/server/cli/improvisation-attachments.js +116 -0
  43. package/dist/server/cli/improvisation-attachments.js.map +1 -0
  44. package/dist/server/cli/improvisation-retry.d.ts +52 -0
  45. package/dist/server/cli/improvisation-retry.d.ts.map +1 -0
  46. package/dist/server/cli/improvisation-retry.js +434 -0
  47. package/dist/server/cli/improvisation-retry.js.map +1 -0
  48. package/dist/server/cli/improvisation-session-manager.d.ts +10 -266
  49. package/dist/server/cli/improvisation-session-manager.d.ts.map +1 -1
  50. package/dist/server/cli/improvisation-session-manager.js +117 -1079
  51. package/dist/server/cli/improvisation-session-manager.js.map +1 -1
  52. package/dist/server/cli/improvisation-types.d.ts +86 -0
  53. package/dist/server/cli/improvisation-types.d.ts.map +1 -0
  54. package/dist/server/cli/improvisation-types.js +10 -0
  55. package/dist/server/cli/improvisation-types.js.map +1 -0
  56. package/dist/server/cli/prompt-builders.d.ts +68 -0
  57. package/dist/server/cli/prompt-builders.d.ts.map +1 -0
  58. package/dist/server/cli/prompt-builders.js +312 -0
  59. package/dist/server/cli/prompt-builders.js.map +1 -0
  60. package/dist/server/index.js +33 -212
  61. package/dist/server/index.js.map +1 -1
  62. package/dist/server/mcp/bouncer-haiku.d.ts +10 -0
  63. package/dist/server/mcp/bouncer-haiku.d.ts.map +1 -0
  64. package/dist/server/mcp/bouncer-haiku.js +152 -0
  65. package/dist/server/mcp/bouncer-haiku.js.map +1 -0
  66. package/dist/server/mcp/bouncer-integration.d.ts +3 -4
  67. package/dist/server/mcp/bouncer-integration.d.ts.map +1 -1
  68. package/dist/server/mcp/bouncer-integration.js +50 -196
  69. package/dist/server/mcp/bouncer-integration.js.map +1 -1
  70. package/dist/server/mcp/security-analysis.d.ts +38 -0
  71. package/dist/server/mcp/security-analysis.d.ts.map +1 -0
  72. package/dist/server/mcp/security-analysis.js +183 -0
  73. package/dist/server/mcp/security-analysis.js.map +1 -0
  74. package/dist/server/mcp/security-audit.d.ts +1 -1
  75. package/dist/server/mcp/security-audit.d.ts.map +1 -1
  76. package/dist/server/mcp/security-patterns.d.ts +1 -25
  77. package/dist/server/mcp/security-patterns.d.ts.map +1 -1
  78. package/dist/server/mcp/security-patterns.js +55 -260
  79. package/dist/server/mcp/security-patterns.js.map +1 -1
  80. package/dist/server/server-setup.d.ts +22 -0
  81. package/dist/server/server-setup.d.ts.map +1 -0
  82. package/dist/server/server-setup.js +101 -0
  83. package/dist/server/server-setup.js.map +1 -0
  84. package/dist/server/services/file-explorer-ops.d.ts +24 -0
  85. package/dist/server/services/file-explorer-ops.d.ts.map +1 -0
  86. package/dist/server/services/file-explorer-ops.js +211 -0
  87. package/dist/server/services/file-explorer-ops.js.map +1 -0
  88. package/dist/server/services/files.d.ts +2 -85
  89. package/dist/server/services/files.d.ts.map +1 -1
  90. package/dist/server/services/files.js +7 -427
  91. package/dist/server/services/files.js.map +1 -1
  92. package/dist/server/services/plan/composer.d.ts +1 -1
  93. package/dist/server/services/plan/composer.d.ts.map +1 -1
  94. package/dist/server/services/plan/composer.js +118 -32
  95. package/dist/server/services/plan/composer.js.map +1 -1
  96. package/dist/server/services/plan/config-installer.d.ts +25 -0
  97. package/dist/server/services/plan/config-installer.d.ts.map +1 -0
  98. package/dist/server/services/plan/config-installer.js +182 -0
  99. package/dist/server/services/plan/config-installer.js.map +1 -0
  100. package/dist/server/services/plan/dependency-resolver.d.ts +1 -1
  101. package/dist/server/services/plan/dependency-resolver.d.ts.map +1 -1
  102. package/dist/server/services/plan/dependency-resolver.js +4 -1
  103. package/dist/server/services/plan/dependency-resolver.js.map +1 -1
  104. package/dist/server/services/plan/executor.d.ts +38 -74
  105. package/dist/server/services/plan/executor.d.ts.map +1 -1
  106. package/dist/server/services/plan/executor.js +274 -460
  107. package/dist/server/services/plan/executor.js.map +1 -1
  108. package/dist/server/services/plan/front-matter.d.ts +18 -0
  109. package/dist/server/services/plan/front-matter.d.ts.map +1 -0
  110. package/dist/server/services/plan/front-matter.js +44 -0
  111. package/dist/server/services/plan/front-matter.js.map +1 -0
  112. package/dist/server/services/plan/output-manager.d.ts +22 -0
  113. package/dist/server/services/plan/output-manager.d.ts.map +1 -0
  114. package/dist/server/services/plan/output-manager.js +97 -0
  115. package/dist/server/services/plan/output-manager.js.map +1 -0
  116. package/dist/server/services/plan/parser-core.d.ts +20 -0
  117. package/dist/server/services/plan/parser-core.d.ts.map +1 -0
  118. package/dist/server/services/plan/parser-core.js +350 -0
  119. package/dist/server/services/plan/parser-core.js.map +1 -0
  120. package/dist/server/services/plan/parser-migration.d.ts +5 -0
  121. package/dist/server/services/plan/parser-migration.d.ts.map +1 -0
  122. package/dist/server/services/plan/parser-migration.js +124 -0
  123. package/dist/server/services/plan/parser-migration.js.map +1 -0
  124. package/dist/server/services/plan/parser.d.ts +11 -3
  125. package/dist/server/services/plan/parser.d.ts.map +1 -1
  126. package/dist/server/services/plan/parser.js +184 -369
  127. package/dist/server/services/plan/parser.js.map +1 -1
  128. package/dist/server/services/plan/prompt-builder.d.ts +17 -0
  129. package/dist/server/services/plan/prompt-builder.d.ts.map +1 -0
  130. package/dist/server/services/plan/prompt-builder.js +137 -0
  131. package/dist/server/services/plan/prompt-builder.js.map +1 -0
  132. package/dist/server/services/plan/review-gate.d.ts +28 -0
  133. package/dist/server/services/plan/review-gate.d.ts.map +1 -0
  134. package/dist/server/services/plan/review-gate.js +191 -0
  135. package/dist/server/services/plan/review-gate.js.map +1 -0
  136. package/dist/server/services/plan/state-reconciler.d.ts +1 -1
  137. package/dist/server/services/plan/state-reconciler.d.ts.map +1 -1
  138. package/dist/server/services/plan/state-reconciler.js +59 -7
  139. package/dist/server/services/plan/state-reconciler.js.map +1 -1
  140. package/dist/server/services/plan/types.d.ts +68 -0
  141. package/dist/server/services/plan/types.d.ts.map +1 -1
  142. package/dist/server/services/platform-credentials.d.ts +24 -0
  143. package/dist/server/services/platform-credentials.d.ts.map +1 -0
  144. package/dist/server/services/platform-credentials.js +68 -0
  145. package/dist/server/services/platform-credentials.js.map +1 -0
  146. package/dist/server/services/platform.d.ts +1 -31
  147. package/dist/server/services/platform.d.ts.map +1 -1
  148. package/dist/server/services/platform.js +11 -109
  149. package/dist/server/services/platform.js.map +1 -1
  150. package/dist/server/services/terminal/pty-manager.d.ts +7 -97
  151. package/dist/server/services/terminal/pty-manager.d.ts.map +1 -1
  152. package/dist/server/services/terminal/pty-manager.js +53 -266
  153. package/dist/server/services/terminal/pty-manager.js.map +1 -1
  154. package/dist/server/services/terminal/pty-utils.d.ts +57 -0
  155. package/dist/server/services/terminal/pty-utils.d.ts.map +1 -0
  156. package/dist/server/services/terminal/pty-utils.js +141 -0
  157. package/dist/server/services/terminal/pty-utils.js.map +1 -0
  158. package/dist/server/services/websocket/file-definition-handlers.d.ts +4 -0
  159. package/dist/server/services/websocket/file-definition-handlers.d.ts.map +1 -0
  160. package/dist/server/services/websocket/file-definition-handlers.js +153 -0
  161. package/dist/server/services/websocket/file-definition-handlers.js.map +1 -0
  162. package/dist/server/services/websocket/file-explorer-handlers.d.ts.map +1 -1
  163. package/dist/server/services/websocket/file-explorer-handlers.js +52 -391
  164. package/dist/server/services/websocket/file-explorer-handlers.js.map +1 -1
  165. package/dist/server/services/websocket/file-search-handlers.d.ts +5 -0
  166. package/dist/server/services/websocket/file-search-handlers.d.ts.map +1 -0
  167. package/dist/server/services/websocket/file-search-handlers.js +238 -0
  168. package/dist/server/services/websocket/file-search-handlers.js.map +1 -0
  169. package/dist/server/services/websocket/file-utils.js +3 -3
  170. package/dist/server/services/websocket/file-utils.js.map +1 -1
  171. package/dist/server/services/websocket/git-branch-handlers.d.ts +7 -0
  172. package/dist/server/services/websocket/git-branch-handlers.d.ts.map +1 -0
  173. package/dist/server/services/websocket/git-branch-handlers.js +110 -0
  174. package/dist/server/services/websocket/git-branch-handlers.js.map +1 -0
  175. package/dist/server/services/websocket/git-diff-handlers.d.ts +6 -0
  176. package/dist/server/services/websocket/git-diff-handlers.d.ts.map +1 -0
  177. package/dist/server/services/websocket/git-diff-handlers.js +123 -0
  178. package/dist/server/services/websocket/git-diff-handlers.js.map +1 -0
  179. package/dist/server/services/websocket/git-handlers.d.ts +2 -31
  180. package/dist/server/services/websocket/git-handlers.d.ts.map +1 -1
  181. package/dist/server/services/websocket/git-handlers.js +35 -541
  182. package/dist/server/services/websocket/git-handlers.js.map +1 -1
  183. package/dist/server/services/websocket/git-log-handlers.d.ts +6 -0
  184. package/dist/server/services/websocket/git-log-handlers.d.ts.map +1 -0
  185. package/dist/server/services/websocket/git-log-handlers.js +128 -0
  186. package/dist/server/services/websocket/git-log-handlers.js.map +1 -0
  187. package/dist/server/services/websocket/git-pr-handlers.d.ts.map +1 -1
  188. package/dist/server/services/websocket/git-pr-handlers.js +13 -53
  189. package/dist/server/services/websocket/git-pr-handlers.js.map +1 -1
  190. package/dist/server/services/websocket/git-tag-handlers.d.ts +6 -0
  191. package/dist/server/services/websocket/git-tag-handlers.d.ts.map +1 -0
  192. package/dist/server/services/websocket/git-tag-handlers.js +76 -0
  193. package/dist/server/services/websocket/git-tag-handlers.js.map +1 -0
  194. package/dist/server/services/websocket/git-utils.d.ts +43 -0
  195. package/dist/server/services/websocket/git-utils.d.ts.map +1 -0
  196. package/dist/server/services/websocket/git-utils.js +201 -0
  197. package/dist/server/services/websocket/git-utils.js.map +1 -0
  198. package/dist/server/services/websocket/handler.d.ts +2 -0
  199. package/dist/server/services/websocket/handler.d.ts.map +1 -1
  200. package/dist/server/services/websocket/handler.js +37 -112
  201. package/dist/server/services/websocket/handler.js.map +1 -1
  202. package/dist/server/services/websocket/plan-board-handlers.d.ts +11 -0
  203. package/dist/server/services/websocket/plan-board-handlers.d.ts.map +1 -0
  204. package/dist/server/services/websocket/plan-board-handlers.js +218 -0
  205. package/dist/server/services/websocket/plan-board-handlers.js.map +1 -0
  206. package/dist/server/services/websocket/plan-execution-handlers.d.ts +9 -0
  207. package/dist/server/services/websocket/plan-execution-handlers.d.ts.map +1 -0
  208. package/dist/server/services/websocket/plan-execution-handlers.js +142 -0
  209. package/dist/server/services/websocket/plan-execution-handlers.js.map +1 -0
  210. package/dist/server/services/websocket/plan-handlers.d.ts +7 -2
  211. package/dist/server/services/websocket/plan-handlers.d.ts.map +1 -1
  212. package/dist/server/services/websocket/plan-handlers.js +21 -462
  213. package/dist/server/services/websocket/plan-handlers.js.map +1 -1
  214. package/dist/server/services/websocket/plan-helpers.d.ts +19 -0
  215. package/dist/server/services/websocket/plan-helpers.d.ts.map +1 -0
  216. package/dist/server/services/websocket/plan-helpers.js +199 -0
  217. package/dist/server/services/websocket/plan-helpers.js.map +1 -0
  218. package/dist/server/services/websocket/plan-issue-handlers.d.ts +12 -0
  219. package/dist/server/services/websocket/plan-issue-handlers.d.ts.map +1 -0
  220. package/dist/server/services/websocket/plan-issue-handlers.js +162 -0
  221. package/dist/server/services/websocket/plan-issue-handlers.js.map +1 -0
  222. package/dist/server/services/websocket/plan-sprint-handlers.d.ts +7 -0
  223. package/dist/server/services/websocket/plan-sprint-handlers.d.ts.map +1 -0
  224. package/dist/server/services/websocket/plan-sprint-handlers.js +206 -0
  225. package/dist/server/services/websocket/plan-sprint-handlers.js.map +1 -0
  226. package/dist/server/services/websocket/quality-complexity.d.ts +14 -0
  227. package/dist/server/services/websocket/quality-complexity.d.ts.map +1 -0
  228. package/dist/server/services/websocket/quality-complexity.js +262 -0
  229. package/dist/server/services/websocket/quality-complexity.js.map +1 -0
  230. package/dist/server/services/websocket/quality-fix-agent.d.ts +16 -0
  231. package/dist/server/services/websocket/quality-fix-agent.d.ts.map +1 -0
  232. package/dist/server/services/websocket/quality-fix-agent.js +140 -0
  233. package/dist/server/services/websocket/quality-fix-agent.js.map +1 -0
  234. package/dist/server/services/websocket/quality-handlers.d.ts.map +1 -1
  235. package/dist/server/services/websocket/quality-handlers.js +34 -346
  236. package/dist/server/services/websocket/quality-handlers.js.map +1 -1
  237. package/dist/server/services/websocket/quality-linting.d.ts +9 -0
  238. package/dist/server/services/websocket/quality-linting.d.ts.map +1 -0
  239. package/dist/server/services/websocket/quality-linting.js +178 -0
  240. package/dist/server/services/websocket/quality-linting.js.map +1 -0
  241. package/dist/server/services/websocket/quality-review-agent.d.ts +19 -0
  242. package/dist/server/services/websocket/quality-review-agent.d.ts.map +1 -0
  243. package/dist/server/services/websocket/quality-review-agent.js +206 -0
  244. package/dist/server/services/websocket/quality-review-agent.js.map +1 -0
  245. package/dist/server/services/websocket/quality-service.d.ts +3 -51
  246. package/dist/server/services/websocket/quality-service.d.ts.map +1 -1
  247. package/dist/server/services/websocket/quality-service.js +9 -651
  248. package/dist/server/services/websocket/quality-service.js.map +1 -1
  249. package/dist/server/services/websocket/quality-tools.d.ts +23 -0
  250. package/dist/server/services/websocket/quality-tools.d.ts.map +1 -0
  251. package/dist/server/services/websocket/quality-tools.js +208 -0
  252. package/dist/server/services/websocket/quality-tools.js.map +1 -0
  253. package/dist/server/services/websocket/quality-types.d.ts +59 -0
  254. package/dist/server/services/websocket/quality-types.d.ts.map +1 -0
  255. package/dist/server/services/websocket/quality-types.js +101 -0
  256. package/dist/server/services/websocket/quality-types.js.map +1 -0
  257. package/dist/server/services/websocket/session-handlers.d.ts +3 -4
  258. package/dist/server/services/websocket/session-handlers.d.ts.map +1 -1
  259. package/dist/server/services/websocket/session-handlers.js +3 -378
  260. package/dist/server/services/websocket/session-handlers.js.map +1 -1
  261. package/dist/server/services/websocket/session-history.d.ts +4 -0
  262. package/dist/server/services/websocket/session-history.d.ts.map +1 -0
  263. package/dist/server/services/websocket/session-history.js +208 -0
  264. package/dist/server/services/websocket/session-history.js.map +1 -0
  265. package/dist/server/services/websocket/session-initialization.d.ts +5 -0
  266. package/dist/server/services/websocket/session-initialization.d.ts.map +1 -0
  267. package/dist/server/services/websocket/session-initialization.js +163 -0
  268. package/dist/server/services/websocket/session-initialization.js.map +1 -0
  269. package/dist/server/services/websocket/types.d.ts +12 -2
  270. package/dist/server/services/websocket/types.d.ts.map +1 -1
  271. package/package.json +1 -2
  272. package/server/cli/headless/claude-invoker-process.ts +204 -0
  273. package/server/cli/headless/claude-invoker-stall.ts +164 -0
  274. package/server/cli/headless/claude-invoker-stream.ts +353 -0
  275. package/server/cli/headless/claude-invoker-tools.ts +187 -0
  276. package/server/cli/headless/claude-invoker.ts +15 -1092
  277. package/server/cli/headless/haiku-assessments.ts +365 -0
  278. package/server/cli/headless/headless-logger.ts +26 -5
  279. package/server/cli/headless/native-timeout-detector.ts +117 -0
  280. package/server/cli/headless/stall-assessor.ts +65 -618
  281. package/server/cli/headless/types.ts +4 -1
  282. package/server/cli/improvisation-attachments.ts +148 -0
  283. package/server/cli/improvisation-retry.ts +602 -0
  284. package/server/cli/improvisation-session-manager.ts +140 -1349
  285. package/server/cli/improvisation-types.ts +98 -0
  286. package/server/cli/prompt-builders.ts +370 -0
  287. package/server/index.ts +35 -246
  288. package/server/mcp/bouncer-haiku.ts +182 -0
  289. package/server/mcp/bouncer-integration.ts +87 -248
  290. package/server/mcp/security-analysis.ts +217 -0
  291. package/server/mcp/security-audit.ts +1 -1
  292. package/server/mcp/security-patterns.ts +60 -283
  293. package/server/server-setup.ts +114 -0
  294. package/server/services/file-explorer-ops.ts +293 -0
  295. package/server/services/files.ts +20 -532
  296. package/server/services/plan/composer.ts +140 -35
  297. package/server/services/plan/config-installer.ts +187 -0
  298. package/server/services/plan/dependency-resolver.ts +4 -1
  299. package/server/services/plan/executor.ts +281 -488
  300. package/server/services/plan/front-matter.ts +48 -0
  301. package/server/services/plan/output-manager.ts +113 -0
  302. package/server/services/plan/parser-core.ts +406 -0
  303. package/server/services/plan/parser-migration.ts +128 -0
  304. package/server/services/plan/parser.ts +188 -394
  305. package/server/services/plan/prompt-builder.ts +161 -0
  306. package/server/services/plan/review-gate.ts +212 -0
  307. package/server/services/plan/state-reconciler.ts +68 -7
  308. package/server/services/plan/types.ts +101 -1
  309. package/server/services/platform-credentials.ts +83 -0
  310. package/server/services/platform.ts +16 -131
  311. package/server/services/terminal/pty-manager.ts +66 -313
  312. package/server/services/terminal/pty-utils.ts +176 -0
  313. package/server/services/websocket/file-definition-handlers.ts +165 -0
  314. package/server/services/websocket/file-explorer-handlers.ts +37 -452
  315. package/server/services/websocket/file-search-handlers.ts +291 -0
  316. package/server/services/websocket/file-utils.ts +3 -3
  317. package/server/services/websocket/git-branch-handlers.ts +130 -0
  318. package/server/services/websocket/git-diff-handlers.ts +140 -0
  319. package/server/services/websocket/git-handlers.ts +40 -625
  320. package/server/services/websocket/git-log-handlers.ts +149 -0
  321. package/server/services/websocket/git-pr-handlers.ts +17 -62
  322. package/server/services/websocket/git-tag-handlers.ts +91 -0
  323. package/server/services/websocket/git-utils.ts +230 -0
  324. package/server/services/websocket/handler.ts +39 -112
  325. package/server/services/websocket/plan-board-handlers.ts +277 -0
  326. package/server/services/websocket/plan-execution-handlers.ts +184 -0
  327. package/server/services/websocket/plan-handlers.ts +23 -544
  328. package/server/services/websocket/plan-helpers.ts +215 -0
  329. package/server/services/websocket/plan-issue-handlers.ts +204 -0
  330. package/server/services/websocket/plan-sprint-handlers.ts +252 -0
  331. package/server/services/websocket/quality-complexity.ts +294 -0
  332. package/server/services/websocket/quality-fix-agent.ts +181 -0
  333. package/server/services/websocket/quality-handlers.ts +36 -404
  334. package/server/services/websocket/quality-linting.ts +187 -0
  335. package/server/services/websocket/quality-review-agent.ts +246 -0
  336. package/server/services/websocket/quality-service.ts +11 -762
  337. package/server/services/websocket/quality-tools.ts +209 -0
  338. package/server/services/websocket/quality-types.ts +169 -0
  339. package/server/services/websocket/session-handlers.ts +5 -437
  340. package/server/services/websocket/session-history.ts +222 -0
  341. package/server/services/websocket/session-initialization.ts +209 -0
  342. package/server/services/websocket/types.ts +46 -2
@@ -0,0 +1,276 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ import { hlog } from './headless-logger.js';
4
+ import { classifyError } from './stall-assessor.js';
5
+ /** Log messages when verbose mode is enabled */
6
+ export function verboseLog(verbose, ...msgs) {
7
+ if (verbose) {
8
+ for (const msg of msgs)
9
+ hlog(msg);
10
+ }
11
+ }
12
+ // ========== Stream Event Handlers ==========
13
+ function handleSessionCapture(parsed, captured) {
14
+ if (parsed.type === 'system' && parsed.subtype === 'init' && parsed.session_id) {
15
+ captured.claudeSessionId = parsed.session_id;
16
+ }
17
+ if (parsed.type === 'result' && parsed.session_id && !captured.claudeSessionId) {
18
+ captured.claudeSessionId = parsed.session_id;
19
+ }
20
+ }
21
+ function handleThinkingDelta(event, ctx) {
22
+ if (event.type !== 'content_block_delta' ||
23
+ event.delta?.type !== 'thinking_delta' ||
24
+ !event.delta?.thinking) {
25
+ return ctx.accumulatedThinking;
26
+ }
27
+ if (ctx.resumeAssessmentActive) {
28
+ ctx.resumeAssessmentActive = false;
29
+ if (ctx.resumeAssessmentBuffer) {
30
+ ctx.config.outputCallback?.(ctx.resumeAssessmentBuffer);
31
+ ctx.resumeAssessmentBuffer = '';
32
+ }
33
+ }
34
+ const thinking = event.delta.thinking;
35
+ const updated = ctx.accumulatedThinking + thinking;
36
+ if (ctx.config.thinkingCallback) {
37
+ ctx.config.thinkingCallback(thinking);
38
+ }
39
+ else if (ctx.config.outputCallback) {
40
+ ctx.config.outputCallback(thinking);
41
+ }
42
+ else {
43
+ process.stdout.write(thinking);
44
+ }
45
+ return updated;
46
+ }
47
+ function handleTextDelta(event, ctx) {
48
+ if (event.type !== 'content_block_delta' ||
49
+ event.delta?.type !== 'text_delta' ||
50
+ !event.delta?.text) {
51
+ return ctx.accumulatedAssistantResponse;
52
+ }
53
+ const text = event.delta.text;
54
+ const updated = ctx.accumulatedAssistantResponse + text;
55
+ const { passthrough, timeouts } = ctx.nativeTimeoutDetector.processChunk(text);
56
+ for (const timeout of timeouts) {
57
+ ctx.config.outputCallback?.(`\n[[MSTRO_NATIVE_TIMEOUT]] ${timeout.toolName} timed out \u2014 ${timeout.action} with ${timeout.preservedCount} results preserved\n`);
58
+ }
59
+ if (ctx.resumeAssessmentActive) {
60
+ if (passthrough) {
61
+ ctx.resumeAssessmentBuffer += passthrough;
62
+ }
63
+ return updated;
64
+ }
65
+ if (passthrough && ctx.config.outputCallback) {
66
+ ctx.config.outputCallback(passthrough);
67
+ }
68
+ return updated;
69
+ }
70
+ /** Accumulate input tokens from a message_start event */
71
+ function handleMessageStartTokens(event, ctx) {
72
+ if (event.type !== 'message_start' || !event.message?.usage)
73
+ return false;
74
+ const usage = event.message.usage;
75
+ ctx.currentStepOutputTokens = 0;
76
+ let changed = false;
77
+ if (typeof usage.input_tokens === 'number') {
78
+ ctx.apiTokenUsage.inputTokens += usage.input_tokens;
79
+ changed = true;
80
+ }
81
+ if (typeof usage.cache_creation_input_tokens === 'number') {
82
+ ctx.apiTokenUsage.inputTokens += usage.cache_creation_input_tokens;
83
+ changed = true;
84
+ }
85
+ if (typeof usage.cache_read_input_tokens === 'number') {
86
+ ctx.apiTokenUsage.inputTokens += usage.cache_read_input_tokens;
87
+ changed = true;
88
+ }
89
+ verboseLog(ctx.config.verbose, `[TOKENS] message_start: input=${usage.input_tokens ?? 0} cache_create=${usage.cache_creation_input_tokens ?? 0} cache_read=${usage.cache_read_input_tokens ?? 0} → total_input=${ctx.apiTokenUsage.inputTokens}`);
90
+ return changed;
91
+ }
92
+ /** Accumulate output tokens from a message_delta event (cumulative tracking) */
93
+ function handleMessageDeltaTokens(event, ctx) {
94
+ if (event.type !== 'message_delta' || !event.usage)
95
+ return false;
96
+ if (typeof event.usage.output_tokens !== 'number')
97
+ return false;
98
+ const increment = event.usage.output_tokens - ctx.currentStepOutputTokens;
99
+ verboseLog(ctx.config.verbose, `[TOKENS] message_delta: output=${event.usage.output_tokens} (step_prev=${ctx.currentStepOutputTokens} increment=${increment}) → total_output=${ctx.apiTokenUsage.outputTokens + Math.max(increment, 0)}`);
100
+ if (increment <= 0)
101
+ return false;
102
+ ctx.apiTokenUsage.outputTokens += increment;
103
+ ctx.currentStepOutputTokens = event.usage.output_tokens;
104
+ return true;
105
+ }
106
+ function handleTokenUsage(event, ctx) {
107
+ const changed = handleMessageStartTokens(event, ctx) || handleMessageDeltaTokens(event, ctx);
108
+ if (changed) {
109
+ ctx.lastTokenActivityTime = Date.now();
110
+ ctx.config.tokenUsageCallback?.({ ...ctx.apiTokenUsage });
111
+ }
112
+ }
113
+ /** Extract definitive token usage from the result event */
114
+ function handleResultTokenUsage(parsed, ctx) {
115
+ if (!parsed.usage)
116
+ return;
117
+ const u = parsed.usage;
118
+ const input = (typeof u.input_tokens === 'number' ? u.input_tokens : 0)
119
+ + (typeof u.cache_creation_input_tokens === 'number' ? u.cache_creation_input_tokens : 0)
120
+ + (typeof u.cache_read_input_tokens === 'number' ? u.cache_read_input_tokens : 0);
121
+ const output = typeof u.output_tokens === 'number' ? u.output_tokens : 0;
122
+ if (input > 0 || output > 0) {
123
+ verboseLog(ctx.config.verbose, `[TOKENS] Result event usage: input=${input} output=${output} ` +
124
+ `(stream accumulated: input=${ctx.apiTokenUsage.inputTokens} output=${ctx.apiTokenUsage.outputTokens})`);
125
+ ctx.apiTokenUsage = { inputTokens: input, outputTokens: output };
126
+ ctx.lastTokenActivityTime = Date.now();
127
+ ctx.config.tokenUsageCallback?.({ ...ctx.apiTokenUsage });
128
+ }
129
+ }
130
+ function handleToolResult(parsed, ctx) {
131
+ if (parsed.type !== 'user' || !parsed.message?.content) {
132
+ return;
133
+ }
134
+ for (const content of parsed.message.content) {
135
+ if (content.type !== 'tool_result') {
136
+ continue;
137
+ }
138
+ const toolId = content.tool_use_id;
139
+ const result = content.content;
140
+ const isError = content.is_error || false;
141
+ const resultStr = typeof result === 'string' ? result : JSON.stringify(result);
142
+ const toolEntry = ctx.accumulatedToolUse.find(t => t.toolId === toolId);
143
+ if (toolEntry) {
144
+ toolEntry.result = resultStr;
145
+ toolEntry.isError = isError;
146
+ toolEntry.duration = Date.now() - toolEntry.startTime;
147
+ }
148
+ if (ctx.config.toolUseCallback) {
149
+ ctx.config.toolUseCallback({ type: 'tool_result', toolId, result: resultStr, isError });
150
+ }
151
+ }
152
+ }
153
+ // ========== Stream Processing ==========
154
+ export function processStreamEvent(parsed, ctx) {
155
+ if (parsed.type === 'error') {
156
+ const errorMessage = parsed.error?.message || parsed.message || JSON.stringify(parsed);
157
+ ctx.config.outputCallback?.(`\n[[MSTRO_ERROR:CLAUDE_ERROR]] ${errorMessage}\n`);
158
+ return;
159
+ }
160
+ if (parsed.type === 'result') {
161
+ handleResultTokenUsage(parsed, ctx);
162
+ if (parsed.stop_reason) {
163
+ ctx.stopReason = parsed.stop_reason;
164
+ }
165
+ if (parsed.is_error) {
166
+ const errorMessage = parsed.error || parsed.result || 'Unknown error in result';
167
+ ctx.config.outputCallback?.(`\n[[MSTRO_ERROR:CLAUDE_RESULT_ERROR]] ${errorMessage}\n`);
168
+ return;
169
+ }
170
+ }
171
+ if (parsed.type === 'stream_event' && parsed.event) {
172
+ const event = parsed.event;
173
+ ctx.accumulatedThinking = handleThinkingDelta(event, ctx);
174
+ ctx.accumulatedAssistantResponse = handleTextDelta(event, ctx);
175
+ handleToolStreamEvents(event, ctx);
176
+ handleTokenUsage(event, ctx);
177
+ }
178
+ handleToolResult(parsed, ctx);
179
+ }
180
+ /** Handle tool_use content_block_start */
181
+ function handleToolStart(event, ctx) {
182
+ if (event.type !== 'content_block_start' || event.content_block?.type !== 'tool_use')
183
+ return;
184
+ if (ctx.resumeAssessmentActive) {
185
+ ctx.resumeAssessmentActive = false;
186
+ if (ctx.resumeAssessmentBuffer) {
187
+ ctx.config.outputCallback?.(ctx.resumeAssessmentBuffer);
188
+ ctx.resumeAssessmentBuffer = '';
189
+ }
190
+ }
191
+ const toolName = event.content_block.name;
192
+ const toolId = event.content_block.id;
193
+ const index = event.index;
194
+ ctx.toolInputBuffers.set(index, { name: toolName, id: toolId, inputJson: '', startTime: Date.now() });
195
+ ctx.config.toolUseCallback?.({ type: 'tool_start', toolName, toolId, index });
196
+ }
197
+ /** Handle input_json_delta for tool input streaming */
198
+ function handleToolInputDelta(event, ctx) {
199
+ if (event.type !== 'content_block_delta' || event.delta?.type !== 'input_json_delta')
200
+ return;
201
+ const index = event.index;
202
+ const partialJson = event.delta.partial_json;
203
+ const toolBuffer = ctx.toolInputBuffers.get(index);
204
+ if (toolBuffer)
205
+ toolBuffer.inputJson += partialJson;
206
+ ctx.config.toolUseCallback?.({ type: 'tool_input_delta', partialJson, index });
207
+ }
208
+ /** Handle content_block_stop — finalize tool input and emit tool_complete */
209
+ function handleToolComplete(event, ctx) {
210
+ if (event.type !== 'content_block_stop')
211
+ return;
212
+ const index = event.index;
213
+ const toolBuffer = ctx.toolInputBuffers.get(index);
214
+ if (!toolBuffer)
215
+ return;
216
+ let completeInput = {};
217
+ try {
218
+ completeInput = JSON.parse(toolBuffer.inputJson);
219
+ }
220
+ catch { /* incomplete JSON */ }
221
+ ctx.accumulatedToolUse.push({
222
+ toolName: toolBuffer.name, toolId: toolBuffer.id,
223
+ toolInput: completeInput, startTime: toolBuffer.startTime
224
+ });
225
+ ctx.toolInputBuffers.delete(index);
226
+ ctx.config.toolUseCallback?.({
227
+ type: 'tool_complete', toolName: toolBuffer.name, toolId: toolBuffer.id,
228
+ index, completeInput
229
+ });
230
+ }
231
+ /** Handle tool-specific stream events (start, input delta, complete) */
232
+ function handleToolStreamEvents(event, ctx) {
233
+ handleToolStart(event, ctx);
234
+ handleToolInputDelta(event, ctx);
235
+ handleToolComplete(event, ctx);
236
+ }
237
+ export function processStreamLines(buffer, sessionCapture, ctx) {
238
+ const lines = buffer.split('\n');
239
+ const remainder = lines.pop() || '';
240
+ for (const line of lines) {
241
+ if (!line.trim())
242
+ continue;
243
+ try {
244
+ const parsed = JSON.parse(line);
245
+ handleSessionCapture(parsed, sessionCapture);
246
+ processStreamEvent(parsed, ctx);
247
+ }
248
+ catch { /* Ignore parse errors */ }
249
+ }
250
+ return remainder;
251
+ }
252
+ /** Flush native timeout detector buffers and return post-timeout output if any */
253
+ export function flushNativeTimeoutBuffers(ctx) {
254
+ const remaining = ctx.nativeTimeoutDetector.flush();
255
+ const buffered = ctx.nativeTimeoutDetector.bufferedPostTimeoutOutput;
256
+ const postTimeout = (buffered + remaining) || undefined;
257
+ if (!postTimeout && remaining) {
258
+ ctx.config.outputCallback?.(remaining);
259
+ }
260
+ return postTimeout;
261
+ }
262
+ /** Classify unmatched stderr via Haiku when process exits with error */
263
+ export async function classifyUnmatchedStderr(stderr, errorAlreadySurfaced, code, config) {
264
+ if (!stderr || errorAlreadySurfaced || code === 0)
265
+ return;
266
+ try {
267
+ const classified = await classifyError(stderr, config.claudeCommand, config.verbose);
268
+ if (classified) {
269
+ config.outputCallback?.(`\n[[MSTRO_ERROR:${classified.errorCode}]] ${classified.message}\n`);
270
+ }
271
+ }
272
+ catch {
273
+ // Haiku classification failed — proceed without it
274
+ }
275
+ }
276
+ //# sourceMappingURL=claude-invoker-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-invoker-stream.js","sourceRoot":"","sources":["../../../../server/cli/headless/claude-invoker-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ChildProcess } from 'node:child_process';
2
+ import type { StallState } from './claude-invoker-stall.js';
3
+ import type { StreamHandlerContext } from './claude-invoker-stream.js';
4
+ import { ToolWatchdog } from './tool-watchdog.js';
5
+ import type { ResolvedHeadlessConfig } from './types.js';
6
+ export interface ToolTrackingResult {
7
+ pendingTools: Map<string, string>;
8
+ watchdog: ToolWatchdog | null;
9
+ toolWatchdogActive: boolean;
10
+ counters: {
11
+ lastToolInputSummary: string | undefined;
12
+ totalToolCalls: number;
13
+ };
14
+ /** Must be called after stallCheckInterval is created, to wire up the kill handler */
15
+ setKillContext: (claudeProcess: ChildProcess, stallCheckInterval: ReturnType<typeof setInterval>) => void;
16
+ }
17
+ /** Set up tool activity tracking and watchdog */
18
+ export declare function setupToolTracking(config: ResolvedHeadlessConfig, stallState: StallState, ctx: StreamHandlerContext, sessionCapture: {
19
+ claudeSessionId?: string;
20
+ }, prompt: string, perfStart: number): ToolTrackingResult;
21
+ //# sourceMappingURL=claude-invoker-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-invoker-tools.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/claude-invoker-tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAIvE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,sBAAsB,EAAgB,MAAM,YAAY,CAAC;AA6BvE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE;QAAE,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,sFAAsF;IACtF,cAAc,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,KAAK,IAAI,CAAC;CAC3G;AAkFD,iDAAiD;AACjD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,sBAAsB,EAC9B,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,oBAAoB,EACzB,cAAc,EAAE;IAAE,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,EAC5C,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,kBAAkB,CAkDpB"}
@@ -0,0 +1,137 @@
1
+ // Copyright (c) 2025-present Mstro, Inc. All rights reserved.
2
+ // Licensed under the MIT License. See LICENSE file for details.
3
+ import { verboseLog } from './claude-invoker-stream.js';
4
+ import { killProcessGroup } from './runner.js';
5
+ import { assessToolTimeout } from './stall-assessor.js';
6
+ import { ToolWatchdog } from './tool-watchdog.js';
7
+ // ========== Tool Tracking ==========
8
+ /** Summarize a tool's input for stall assessment context */
9
+ function summarizeToolInput(input) {
10
+ try {
11
+ if (input.description)
12
+ return String(input.description).slice(0, 200);
13
+ if (input.prompt)
14
+ return String(input.prompt).slice(0, 200);
15
+ if (input.command)
16
+ return String(input.command).slice(0, 200);
17
+ if (input.pattern)
18
+ return `pattern: ${String(input.pattern).slice(0, 100)}`;
19
+ return JSON.stringify(input).slice(0, 200);
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ }
25
+ function onToolStart(event, s) {
26
+ const id = event.toolId;
27
+ s.pendingTools.set(id, event.toolName);
28
+ s.counters.totalToolCalls++;
29
+ s.toolIdToName.set(id, event.toolName);
30
+ if (s.watchdog) {
31
+ s.watchdog.startWatch(id, event.toolName, {}, () => { s.onTimeout(id); });
32
+ }
33
+ }
34
+ function onToolComplete(event, s) {
35
+ const id = event.toolId;
36
+ const input = event.completeInput ?? {};
37
+ s.counters.lastToolInputSummary = summarizeToolInput(input);
38
+ s.toolIdToInput.set(id, input);
39
+ if (!s.watchdog)
40
+ return;
41
+ const toolName = s.toolIdToName.get(id);
42
+ if (toolName) {
43
+ s.watchdog.startWatch(id, toolName, input, () => { s.onTimeout(id); });
44
+ }
45
+ }
46
+ function onToolResult(event, s) {
47
+ const id = event.toolId;
48
+ s.pendingTools.delete(id);
49
+ s.stallState.stallWarningEmitted = false;
50
+ s.stallState.lastActivityTime = Date.now();
51
+ const toolEntry = s.ctx.accumulatedToolUse.find(t => t.toolId === id);
52
+ if (!s.watchdog || !toolEntry)
53
+ return;
54
+ const toolName = s.toolIdToName.get(id);
55
+ if (toolName && toolEntry.duration) {
56
+ s.watchdog.recordCompletion(toolName, toolEntry.duration);
57
+ }
58
+ s.watchdog.clearWatch(id);
59
+ }
60
+ /** Resolve a display URL from tool input for timeout messages */
61
+ function resolveToolUrl(toolInput) {
62
+ if (toolInput.url)
63
+ return String(toolInput.url);
64
+ if (toolInput.query)
65
+ return String(toolInput.query);
66
+ return undefined;
67
+ }
68
+ /** Handle a tool timeout by building a checkpoint and killing the process */
69
+ function executeToolTimeout(hungToolId, watchdog, killCtx, s, config, prompt, sessionCapture, perfStart) {
70
+ const checkpoint = watchdog.buildCheckpoint(prompt, s.ctx.accumulatedAssistantResponse, s.ctx.accumulatedThinking, s.ctx.accumulatedToolUse, hungToolId, sessionCapture.claudeSessionId, perfStart);
71
+ const toolName = s.toolIdToName.get(hungToolId) || 'unknown';
72
+ const toolInput = s.toolIdToInput.get(hungToolId) || {};
73
+ const timeoutMs = watchdog.getTimeout(toolName);
74
+ const url = resolveToolUrl(toolInput);
75
+ config.outputCallback?.(`\n[[MSTRO_TOOL_TIMEOUT]] ${toolName} timed out after ${Math.round(timeoutMs / 1000)}s${url ? ` fetching: ${url.slice(0, 100)}` : ''}. ${s.ctx.accumulatedToolUse.filter(t => t.result !== undefined).length} completed results preserved.\n`);
76
+ if (checkpoint) {
77
+ config.onToolTimeout?.(checkpoint);
78
+ }
79
+ verboseLog(config.verbose, `[WATCHDOG] Killing process due to ${toolName} timeout`);
80
+ watchdog.clearAll();
81
+ clearInterval(killCtx.stallCheckInterval);
82
+ if (killCtx.claudeProcess.pid)
83
+ killProcessGroup(killCtx.claudeProcess.pid, 'SIGTERM');
84
+ const proc = killCtx.claudeProcess;
85
+ setTimeout(() => { if (!proc.killed && proc.pid)
86
+ killProcessGroup(proc.pid, 'SIGKILL'); }, 5000);
87
+ }
88
+ /** Set up tool activity tracking and watchdog */
89
+ export function setupToolTracking(config, stallState, ctx, sessionCapture, prompt, perfStart) {
90
+ const pendingTools = new Map();
91
+ const counters = { lastToolInputSummary: undefined, totalToolCalls: 0 };
92
+ const toolWatchdogActive = config.enableToolWatchdog !== false;
93
+ const watchdog = toolWatchdogActive
94
+ ? new ToolWatchdog({
95
+ profiles: config.toolTimeoutProfiles,
96
+ verbose: config.verbose,
97
+ onTiebreaker: async (toolName, toolInput, elapsedMs, tokenSilenceMs) => {
98
+ return assessToolTimeout(toolName, toolInput, elapsedMs, config.claudeCommand, config.verbose, tokenSilenceMs);
99
+ },
100
+ getTokenSilenceMs: () => {
101
+ const last = ctx.lastTokenActivityTime;
102
+ return last > 0 ? Date.now() - last : undefined;
103
+ },
104
+ })
105
+ : null;
106
+ let killCtx = null;
107
+ const trackingState = {
108
+ pendingTools, counters,
109
+ toolIdToName: new Map(), toolIdToInput: new Map(),
110
+ watchdog, stallState, ctx,
111
+ onTimeout: (hungToolId) => {
112
+ if (!watchdog || !killCtx)
113
+ return;
114
+ executeToolTimeout(hungToolId, watchdog, killCtx, trackingState, config, prompt, sessionCapture, perfStart);
115
+ },
116
+ };
117
+ const origToolUseCallback = config.toolUseCallback;
118
+ config.toolUseCallback = (event) => {
119
+ if (event.type === 'tool_start' && event.toolName && event.toolId) {
120
+ onToolStart(event, trackingState);
121
+ }
122
+ else if (event.type === 'tool_complete' && event.completeInput && event.toolId) {
123
+ onToolComplete(event, trackingState);
124
+ }
125
+ else if (event.type === 'tool_result' && event.toolId) {
126
+ onToolResult(event, trackingState);
127
+ }
128
+ origToolUseCallback?.(event);
129
+ };
130
+ return {
131
+ pendingTools, watchdog, toolWatchdogActive, counters,
132
+ setKillContext: (claudeProcess, stallCheckInterval) => {
133
+ killCtx = { claudeProcess, stallCheckInterval };
134
+ },
135
+ };
136
+ }
137
+ //# sourceMappingURL=claude-invoker-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-invoker-tools.js","sourceRoot":"","sources":["../../../../server/cli/headless/claude-invoker-tools.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,19 @@
1
1
  /**
2
2
  * Claude Invoker
3
3
  *
4
- * Handles spawning and managing Claude CLI processes.
4
+ * Orchestrates spawning and managing Claude CLI processes.
5
+ * Stream handling, stall detection, tool tracking, and process management
6
+ * are delegated to focused sub-modules.
5
7
  */
6
- import { type ChildProcess } from 'node:child_process';
8
+ import type { ChildProcess } from 'node:child_process';
7
9
  import type { ExecutionResult, ResolvedHeadlessConfig } from './types.js';
8
10
  export interface ClaudeInvokerOptions {
9
11
  config: ResolvedHeadlessConfig;
10
12
  runningProcesses: Map<number, ChildProcess>;
11
13
  }
12
14
  /**
13
- * Execute a Claude CLI command for a single movement
14
- * Supports multimodal prompts via --input-format stream-json when image attachments are present
15
+ * Execute a Claude CLI command for a single movement.
16
+ * Supports multimodal prompts via --input-format stream-json when image attachments are present.
15
17
  */
16
18
  export declare function executeClaudeCommand(prompt: string, _movementId: string, _sessionNumber: number, options: ClaudeInvokerOptions): Promise<ExecutionResult>;
17
19
  //# sourceMappingURL=claude-invoker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-invoker.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/claude-invoker.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAS9D,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EAGvB,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7C;AA0gCD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CA0H1B"}
1
+ {"version":3,"file":"claude-invoker.d.ts","sourceRoot":"","sources":["../../../../server/cli/headless/claude-invoker.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOvD,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,sBAAsB,CAAC;IAC/B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAmH1B"}