hammoc 1.8.4 → 1.9.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 (304) hide show
  1. package/README.md +9 -6
  2. package/package.json +1 -1
  3. package/packages/client/dist/assets/MermaidViewer-B-LwclIl.js +7 -0
  4. package/packages/client/dist/assets/PdfViewer-C3Nymwn3.js +12 -0
  5. package/packages/client/dist/assets/PdfViewer-QCQEGvBO.css +1 -0
  6. package/packages/client/dist/assets/abnfDiagram-VRR7QNED-GfhY_hnV.js +1 -0
  7. package/packages/client/dist/assets/{agentExampleHighlight-Dws80em9.js → agentExampleHighlight-CyhVLy0_.js} +1 -1
  8. package/packages/client/dist/assets/arc-8nyjXGC3.js +1 -0
  9. package/packages/client/dist/assets/architectureDiagram-ZJ3FMSHR-B4onXLm4.js +36 -0
  10. package/packages/client/dist/assets/blockDiagram-677ZJIJ3-D0D6ncaN.js +132 -0
  11. package/packages/client/dist/assets/c4Diagram-LMCZKHZV-CE7Tip-_.js +10 -0
  12. package/packages/client/dist/assets/channel-CPjlbdOo.js +1 -0
  13. package/packages/client/dist/assets/chunk-2Q5K7J3B-4rW1da1Z.js +1 -0
  14. package/packages/client/dist/assets/chunk-32BRIVSS-JuzxS4QA.js +1 -0
  15. package/packages/client/dist/assets/chunk-5VM5RSS4-WRNf-xsi.js +15 -0
  16. package/packages/client/dist/assets/chunk-EX3LRPZG-BDWPlBKO.js +231 -0
  17. package/packages/client/dist/assets/chunk-JWPE2WC7-B8nCyQAc.js +1 -0
  18. package/packages/client/dist/assets/chunk-MOJQB5TN-7c-yriHe.js +88 -0
  19. package/packages/client/dist/assets/chunk-RYQCIY6F-LTDywRs7.js +1 -0
  20. package/packages/client/dist/assets/chunk-V7JOEXUC-DjVgQpjl.js +206 -0
  21. package/packages/client/dist/assets/chunk-VR4S4FIN-7jDdkUpx.js +1 -0
  22. package/packages/client/dist/assets/chunk-XXDRQBXY-ENKV2O8a.js +1 -0
  23. package/packages/client/dist/assets/classDiagram-OUVF2IWQ-C0PbC7Pi.js +1 -0
  24. package/packages/client/dist/assets/classDiagram-v2-EOCWNBFH-C0PbC7Pi.js +1 -0
  25. package/packages/client/dist/assets/{commandTokenHighlight-aR071CNy.js → commandTokenHighlight-DGP0RKx0.js} +1 -1
  26. package/packages/client/dist/assets/cose-bilkent-JH36ORCC-CQTNdQ-g.js +1 -0
  27. package/packages/client/dist/assets/cynefin-VYW2F7L2-BYlAJRcO.js +178 -0
  28. package/packages/client/dist/assets/cynefinDiagram-TSTJHNR4-7zyUTflT.js +62 -0
  29. package/packages/client/dist/assets/cytoscape.esm-DTSO7Bv0.js +331 -0
  30. package/packages/client/dist/assets/dagre-VKFMJZFB-DyZir42W.js +4 -0
  31. package/packages/client/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  32. package/packages/client/dist/assets/diagram-FQU43EPY-CmNAU8Nw.js +3 -0
  33. package/packages/client/dist/assets/diagram-G47NLZAW-B0EIk03o.js +24 -0
  34. package/packages/client/dist/assets/diagram-NH7WQ7WH-Dulv0f1N.js +24 -0
  35. package/packages/client/dist/assets/diagram-OA4YK3LP-DEEcMLgi.js +30 -0
  36. package/packages/client/dist/assets/diagram-WEI45ONY-ZYebAZ93.js +41 -0
  37. package/packages/client/dist/assets/ebnfDiagram-CCIWWBDH-DCHpt3qn.js +1 -0
  38. package/packages/client/dist/assets/erDiagram-Q63AITRT-B6T87-48.js +85 -0
  39. package/packages/client/dist/assets/flowDiagram-23GEKE2U-DAcW6mKJ.js +156 -0
  40. package/packages/client/dist/assets/ganttDiagram-NO4QXBWP-Ct_eFFcM.js +292 -0
  41. package/packages/client/dist/assets/gitGraphDiagram-IHSO6WYX-BGi8Fdm2.js +106 -0
  42. package/packages/client/dist/assets/graph-C9eacEi8.js +1 -0
  43. package/packages/client/dist/assets/index-CtMiUbMJ.js +1671 -0
  44. package/packages/client/dist/assets/index-hTu6ZG2N.js +2 -0
  45. package/packages/client/dist/assets/index-oBa2uNlv.css +32 -0
  46. package/packages/client/dist/assets/infoDiagram-FWYZ7A6U-CqvwbXJn.js +2 -0
  47. package/packages/client/dist/assets/init-Gi6I4Gst.js +1 -0
  48. package/packages/client/dist/assets/ishikawaDiagram-FXEZZL3T-CHhr5ioQ.js +70 -0
  49. package/packages/client/dist/assets/journeyDiagram-5HDEW3XC-d20NzZAd.js +139 -0
  50. package/packages/client/dist/assets/kanban-definition-HUTT4EX6-CHx3wOer.js +89 -0
  51. package/packages/client/dist/assets/katex-C5jXJg4s.js +257 -0
  52. package/packages/client/dist/assets/layout-DEXfKzaS.js +1 -0
  53. package/packages/client/dist/assets/linear-Cnp1E9M4.js +1 -0
  54. package/packages/client/dist/assets/map-Czzmt4hB.js +1 -0
  55. package/packages/client/dist/assets/mermaid.core-jAhLhPYr.js +314 -0
  56. package/packages/client/dist/assets/mindmap-definition-LN4V7U3C-zi30RPoJ.js +96 -0
  57. package/packages/client/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  58. package/packages/client/dist/assets/pdf.worker.min-qwK7q_zL.mjs +28 -0
  59. package/packages/client/dist/assets/pegDiagram-2B236MQR-4gKLzTqu.js +1 -0
  60. package/packages/client/dist/assets/pieDiagram-ENE6RG2P-DRDhpjxP.js +39 -0
  61. package/packages/client/dist/assets/quadrantDiagram-ABIIQ3AL-FmTxRIlW.js +7 -0
  62. package/packages/client/dist/assets/railroadDiagram-RFXS5EU6-Bc-Q7iPs.js +1 -0
  63. package/packages/client/dist/assets/requirementDiagram-TGXJPOKE-D209tlqv.js +84 -0
  64. package/packages/client/dist/assets/sankeyDiagram-HTMAVEWB--I_lSbCV.js +40 -0
  65. package/packages/client/dist/assets/sequenceDiagram-DBY2YBRQ-Da5YJcDJ.js +162 -0
  66. package/packages/client/dist/assets/sizeCapture-X5ZJPWSS-DYuc-rzB.js +1 -0
  67. package/packages/client/dist/assets/{snippetTokenHighlight-ot6u3hW4.js → snippetTokenHighlight-qXHxvlCE.js} +1 -1
  68. package/packages/client/dist/assets/stateDiagram-2N3HPSRC-DoOeZoRP.js +1 -0
  69. package/packages/client/dist/assets/stateDiagram-v2-6OUMAXLB-DLkUyWs6.js +1 -0
  70. package/packages/client/dist/assets/swimlanes-5IMT3BWC-BcR7uCTf.js +2 -0
  71. package/packages/client/dist/assets/swimlanesDiagram-G3AALYLV-C0FDo-hf.js +8 -0
  72. package/packages/client/dist/assets/timeline-definition-FHXFAJF6-CLzKR6_i.js +120 -0
  73. package/packages/client/dist/assets/vennDiagram-L72KCM5P-TajEacPR.js +34 -0
  74. package/packages/client/dist/assets/wardleyDiagram-EHGQE667-DKvVEb3V.js +78 -0
  75. package/packages/client/dist/assets/xychartDiagram-FW5EYKEG-CaJG8r0j.js +7 -0
  76. package/packages/client/dist/index.html +2 -2
  77. package/packages/client/dist/sw.js +2 -2
  78. package/packages/server/dist/controllers/accountController.d.ts.map +1 -1
  79. package/packages/server/dist/controllers/accountController.js +31 -11
  80. package/packages/server/dist/controllers/accountController.js.map +1 -1
  81. package/packages/server/dist/controllers/fileSystemController.d.ts +6 -0
  82. package/packages/server/dist/controllers/fileSystemController.d.ts.map +1 -1
  83. package/packages/server/dist/controllers/fileSystemController.js +34 -0
  84. package/packages/server/dist/controllers/fileSystemController.js.map +1 -1
  85. package/packages/server/dist/controllers/projectController.d.ts.map +1 -1
  86. package/packages/server/dist/controllers/projectController.js +4 -2
  87. package/packages/server/dist/controllers/projectController.js.map +1 -1
  88. package/packages/server/dist/controllers/sessionController.d.ts +5 -0
  89. package/packages/server/dist/controllers/sessionController.d.ts.map +1 -1
  90. package/packages/server/dist/controllers/sessionController.js +95 -3
  91. package/packages/server/dist/controllers/sessionController.js.map +1 -1
  92. package/packages/server/dist/handlers/hookBridge.d.ts +131 -0
  93. package/packages/server/dist/handlers/hookBridge.d.ts.map +1 -0
  94. package/packages/server/dist/handlers/hookBridge.js +178 -0
  95. package/packages/server/dist/handlers/hookBridge.js.map +1 -0
  96. package/packages/server/dist/handlers/streamCallbacks.d.ts.map +1 -1
  97. package/packages/server/dist/handlers/streamCallbacks.js +30 -4
  98. package/packages/server/dist/handlers/streamCallbacks.js.map +1 -1
  99. package/packages/server/dist/handlers/websocket.d.ts +44 -2
  100. package/packages/server/dist/handlers/websocket.d.ts.map +1 -1
  101. package/packages/server/dist/handlers/websocket.js +666 -64
  102. package/packages/server/dist/handlers/websocket.js.map +1 -1
  103. package/packages/server/dist/index.js +4 -1
  104. package/packages/server/dist/index.js.map +1 -1
  105. package/packages/server/dist/locales/en/server.json +9 -3
  106. package/packages/server/dist/locales/es/server.json +9 -3
  107. package/packages/server/dist/locales/ja/server.json +9 -3
  108. package/packages/server/dist/locales/ko/server.json +9 -3
  109. package/packages/server/dist/locales/pt/server.json +9 -3
  110. package/packages/server/dist/locales/zh-CN/server.json +9 -3
  111. package/packages/server/dist/routes/account.d.ts.map +1 -1
  112. package/packages/server/dist/routes/account.js +4 -2
  113. package/packages/server/dist/routes/account.js.map +1 -1
  114. package/packages/server/dist/routes/fileSystem.d.ts.map +1 -1
  115. package/packages/server/dist/routes/fileSystem.js +2 -0
  116. package/packages/server/dist/routes/fileSystem.js.map +1 -1
  117. package/packages/server/dist/routes/sessions.d.ts.map +1 -1
  118. package/packages/server/dist/routes/sessions.js +2 -0
  119. package/packages/server/dist/routes/sessions.js.map +1 -1
  120. package/packages/server/dist/services/accountInfoService.d.ts +36 -1
  121. package/packages/server/dist/services/accountInfoService.d.ts.map +1 -1
  122. package/packages/server/dist/services/accountInfoService.js +90 -4
  123. package/packages/server/dist/services/accountInfoService.js.map +1 -1
  124. package/packages/server/dist/services/accountStorageService.d.ts +55 -9
  125. package/packages/server/dist/services/accountStorageService.d.ts.map +1 -1
  126. package/packages/server/dist/services/accountStorageService.js +244 -12
  127. package/packages/server/dist/services/accountStorageService.js.map +1 -1
  128. package/packages/server/dist/services/chatEngine.d.ts +59 -3
  129. package/packages/server/dist/services/chatEngine.d.ts.map +1 -1
  130. package/packages/server/dist/services/chatService.d.ts +112 -3
  131. package/packages/server/dist/services/chatService.d.ts.map +1 -1
  132. package/packages/server/dist/services/chatService.js +353 -98
  133. package/packages/server/dist/services/chatService.js.map +1 -1
  134. package/packages/server/dist/services/claudeLoginService.d.ts +14 -3
  135. package/packages/server/dist/services/claudeLoginService.d.ts.map +1 -1
  136. package/packages/server/dist/services/claudeLoginService.js +18 -4
  137. package/packages/server/dist/services/claudeLoginService.js.map +1 -1
  138. package/packages/server/dist/services/cliChatEngine.d.ts.map +1 -1
  139. package/packages/server/dist/services/cliChatEngine.js +124 -22
  140. package/packages/server/dist/services/cliChatEngine.js.map +1 -1
  141. package/packages/server/dist/services/cliModalDetect.d.ts +14 -0
  142. package/packages/server/dist/services/cliModalDetect.d.ts.map +1 -1
  143. package/packages/server/dist/services/cliModalDetect.js +12 -3
  144. package/packages/server/dist/services/cliModalDetect.js.map +1 -1
  145. package/packages/server/dist/services/cliSessionPool.js +1 -1
  146. package/packages/server/dist/services/cliSessionPool.js.map +1 -1
  147. package/packages/server/dist/services/commandService.d.ts.map +1 -1
  148. package/packages/server/dist/services/commandService.js +19 -9
  149. package/packages/server/dist/services/commandService.js.map +1 -1
  150. package/packages/server/dist/services/engineResidencyRegistry.d.ts +112 -0
  151. package/packages/server/dist/services/engineResidencyRegistry.d.ts.map +1 -0
  152. package/packages/server/dist/services/engineResidencyRegistry.js +195 -0
  153. package/packages/server/dist/services/engineResidencyRegistry.js.map +1 -0
  154. package/packages/server/dist/services/harnessAgentService.d.ts.map +1 -1
  155. package/packages/server/dist/services/harnessAgentService.js +12 -2
  156. package/packages/server/dist/services/harnessAgentService.js.map +1 -1
  157. package/packages/server/dist/services/harnessLintService.d.ts.map +1 -1
  158. package/packages/server/dist/services/harnessLintService.js +25 -114
  159. package/packages/server/dist/services/harnessLintService.js.map +1 -1
  160. package/packages/server/dist/services/historyParser.d.ts.map +1 -1
  161. package/packages/server/dist/services/historyParser.js +23 -6
  162. package/packages/server/dist/services/historyParser.js.map +1 -1
  163. package/packages/server/dist/services/imageStorageService.d.ts.map +1 -1
  164. package/packages/server/dist/services/imageStorageService.js +7 -0
  165. package/packages/server/dist/services/imageStorageService.js.map +1 -1
  166. package/packages/server/dist/services/projectService.d.ts +4 -1
  167. package/packages/server/dist/services/projectService.d.ts.map +1 -1
  168. package/packages/server/dist/services/projectService.js +14 -1
  169. package/packages/server/dist/services/projectService.js.map +1 -1
  170. package/packages/server/dist/services/promptQueue.d.ts +34 -0
  171. package/packages/server/dist/services/promptQueue.d.ts.map +1 -0
  172. package/packages/server/dist/services/promptQueue.js +80 -0
  173. package/packages/server/dist/services/promptQueue.js.map +1 -0
  174. package/packages/server/dist/services/ptyService.d.ts.map +1 -1
  175. package/packages/server/dist/services/ptyService.js +4 -1
  176. package/packages/server/dist/services/ptyService.js.map +1 -1
  177. package/packages/server/dist/services/queueService.d.ts.map +1 -1
  178. package/packages/server/dist/services/queueService.js +62 -4
  179. package/packages/server/dist/services/queueService.js.map +1 -1
  180. package/packages/server/dist/services/rateLimitProbeService.d.ts +73 -3
  181. package/packages/server/dist/services/rateLimitProbeService.d.ts.map +1 -1
  182. package/packages/server/dist/services/rateLimitProbeService.js +397 -30
  183. package/packages/server/dist/services/rateLimitProbeService.js.map +1 -1
  184. package/packages/server/dist/services/sessionBufferManager.d.ts.map +1 -1
  185. package/packages/server/dist/services/sessionBufferManager.js +22 -4
  186. package/packages/server/dist/services/sessionBufferManager.js.map +1 -1
  187. package/packages/server/dist/services/sessionExportService.d.ts +34 -0
  188. package/packages/server/dist/services/sessionExportService.d.ts.map +1 -0
  189. package/packages/server/dist/services/sessionExportService.js +269 -0
  190. package/packages/server/dist/services/sessionExportService.js.map +1 -0
  191. package/packages/server/dist/services/sessionService.d.ts +6 -0
  192. package/packages/server/dist/services/sessionService.d.ts.map +1 -1
  193. package/packages/server/dist/services/sessionService.js +30 -9
  194. package/packages/server/dist/services/sessionService.js.map +1 -1
  195. package/packages/server/dist/services/streamHandler.d.ts +177 -1
  196. package/packages/server/dist/services/streamHandler.d.ts.map +1 -1
  197. package/packages/server/dist/services/streamHandler.js +425 -39
  198. package/packages/server/dist/services/streamHandler.js.map +1 -1
  199. package/packages/server/dist/services/workspaceContext.d.ts.map +1 -1
  200. package/packages/server/dist/services/workspaceContext.js +6 -0
  201. package/packages/server/dist/services/workspaceContext.js.map +1 -1
  202. package/packages/server/dist/snippets/fix-lint-command-not-on-path +13 -0
  203. package/packages/server/dist/snippets/fix-lint-duplicate-name +12 -0
  204. package/packages/server/dist/snippets/fix-lint-env-var-undefined +13 -0
  205. package/packages/server/dist/snippets/fix-lint-regex-invalid +14 -0
  206. package/packages/server/dist/snippets/fix-lint-tools-non-standard +14 -0
  207. package/packages/server/dist/snippets/fix-lint-url-invalid +13 -0
  208. package/packages/server/dist/snippets/fix-lint-yaml-parse-error +14 -0
  209. package/packages/server/dist/snippets/fix-malformed-skill +17 -0
  210. package/packages/server/dist/utils/backgroundHookSettings.d.ts +31 -0
  211. package/packages/server/dist/utils/backgroundHookSettings.d.ts.map +1 -0
  212. package/packages/server/dist/utils/backgroundHookSettings.js +41 -0
  213. package/packages/server/dist/utils/backgroundHookSettings.js.map +1 -0
  214. package/packages/server/dist/utils/backgroundTaskPoller.d.ts +69 -0
  215. package/packages/server/dist/utils/backgroundTaskPoller.d.ts.map +1 -0
  216. package/packages/server/dist/utils/backgroundTaskPoller.js +356 -0
  217. package/packages/server/dist/utils/backgroundTaskPoller.js.map +1 -0
  218. package/packages/server/dist/utils/backgroundTaskTracker.d.ts +51 -3
  219. package/packages/server/dist/utils/backgroundTaskTracker.d.ts.map +1 -1
  220. package/packages/server/dist/utils/backgroundTaskTracker.js +117 -9
  221. package/packages/server/dist/utils/backgroundTaskTracker.js.map +1 -1
  222. package/packages/server/dist/utils/backgroundToolGuard.d.ts +26 -0
  223. package/packages/server/dist/utils/backgroundToolGuard.d.ts.map +1 -0
  224. package/packages/server/dist/utils/backgroundToolGuard.js +40 -0
  225. package/packages/server/dist/utils/backgroundToolGuard.js.map +1 -0
  226. package/packages/server/dist/utils/boundedRing.d.ts +44 -0
  227. package/packages/server/dist/utils/boundedRing.d.ts.map +1 -0
  228. package/packages/server/dist/utils/boundedRing.js +77 -0
  229. package/packages/server/dist/utils/boundedRing.js.map +1 -0
  230. package/packages/server/dist/utils/effortUtils.d.ts +7 -6
  231. package/packages/server/dist/utils/effortUtils.d.ts.map +1 -1
  232. package/packages/server/dist/utils/effortUtils.js +10 -9
  233. package/packages/server/dist/utils/effortUtils.js.map +1 -1
  234. package/packages/server/dist/utils/messageTree.d.ts +25 -0
  235. package/packages/server/dist/utils/messageTree.d.ts.map +1 -1
  236. package/packages/server/dist/utils/messageTree.js +167 -3
  237. package/packages/server/dist/utils/messageTree.js.map +1 -1
  238. package/packages/server/dist/utils/pathUtils.d.ts.map +1 -1
  239. package/packages/server/dist/utils/pathUtils.js +1 -0
  240. package/packages/server/dist/utils/pathUtils.js.map +1 -1
  241. package/packages/server/dist/utils/residencyActivation.d.ts +61 -0
  242. package/packages/server/dist/utils/residencyActivation.d.ts.map +1 -0
  243. package/packages/server/dist/utils/residencyActivation.js +60 -0
  244. package/packages/server/dist/utils/residencyActivation.js.map +1 -0
  245. package/packages/server/dist/utils/residencyPolicy.d.ts +62 -0
  246. package/packages/server/dist/utils/residencyPolicy.d.ts.map +1 -0
  247. package/packages/server/dist/utils/residencyPolicy.js +82 -0
  248. package/packages/server/dist/utils/residencyPolicy.js.map +1 -0
  249. package/packages/server/dist/utils/runtimeParamStrategy.d.ts +51 -0
  250. package/packages/server/dist/utils/runtimeParamStrategy.d.ts.map +1 -0
  251. package/packages/server/dist/utils/runtimeParamStrategy.js +60 -0
  252. package/packages/server/dist/utils/runtimeParamStrategy.js.map +1 -0
  253. package/packages/server/dist/utils/stopStrategy.d.ts +62 -0
  254. package/packages/server/dist/utils/stopStrategy.d.ts.map +1 -0
  255. package/packages/server/dist/utils/stopStrategy.js +65 -0
  256. package/packages/server/dist/utils/stopStrategy.js.map +1 -0
  257. package/packages/server/resources/internals/INDEX.md +1 -1
  258. package/packages/server/resources/internals/image-storage.md +14 -2
  259. package/packages/server/resources/manual/02-chat.md +30 -13
  260. package/packages/server/resources/manual/03-sessions.md +22 -1
  261. package/packages/server/resources/manual/04-slash-commands-favorites.md +2 -1
  262. package/packages/server/resources/manual/05-projects.md +1 -0
  263. package/packages/server/resources/manual/06-file-explorer-editor.md +21 -2
  264. package/packages/server/resources/manual/07-git.md +1 -1
  265. package/packages/server/resources/manual/08-terminal.md +1 -1
  266. package/packages/server/resources/manual/12-harness-workbench.md +21 -16
  267. package/packages/server/resources/manual/13-settings.md +22 -6
  268. package/packages/server/resources/manual/14-keyboard-shortcuts.md +8 -1
  269. package/packages/shared/dist/constants/messageTree.d.ts +2 -0
  270. package/packages/shared/dist/constants/messageTree.d.ts.map +1 -1
  271. package/packages/shared/dist/constants/messageTree.js +6 -0
  272. package/packages/shared/dist/constants/messageTree.js.map +1 -1
  273. package/packages/shared/dist/index.d.ts +1 -1
  274. package/packages/shared/dist/index.d.ts.map +1 -1
  275. package/packages/shared/dist/index.js.map +1 -1
  276. package/packages/shared/dist/types/accounts.d.ts +13 -0
  277. package/packages/shared/dist/types/accounts.d.ts.map +1 -1
  278. package/packages/shared/dist/types/history.d.ts +14 -1
  279. package/packages/shared/dist/types/history.d.ts.map +1 -1
  280. package/packages/shared/dist/types/message.d.ts +26 -3
  281. package/packages/shared/dist/types/message.d.ts.map +1 -1
  282. package/packages/shared/dist/types/message.js +21 -1
  283. package/packages/shared/dist/types/message.js.map +1 -1
  284. package/packages/shared/dist/types/preferences.d.ts +5 -1
  285. package/packages/shared/dist/types/preferences.d.ts.map +1 -1
  286. package/packages/shared/dist/types/preferences.js +3 -0
  287. package/packages/shared/dist/types/preferences.js.map +1 -1
  288. package/packages/shared/dist/types/sdk.d.ts +68 -10
  289. package/packages/shared/dist/types/sdk.d.ts.map +1 -1
  290. package/packages/shared/dist/types/sdk.js +56 -16
  291. package/packages/shared/dist/types/sdk.js.map +1 -1
  292. package/packages/shared/dist/types/session.d.ts +6 -0
  293. package/packages/shared/dist/types/session.d.ts.map +1 -1
  294. package/packages/shared/dist/types/session.js +6 -0
  295. package/packages/shared/dist/types/session.js.map +1 -1
  296. package/packages/shared/dist/types/streaming.d.ts +32 -2
  297. package/packages/shared/dist/types/streaming.d.ts.map +1 -1
  298. package/packages/shared/dist/types/streaming.js.map +1 -1
  299. package/packages/shared/dist/types/websocket.d.ts +4 -0
  300. package/packages/shared/dist/types/websocket.d.ts.map +1 -1
  301. package/scripts/probe-persistent-hooks.mjs +795 -0
  302. package/packages/client/dist/assets/index-BHbx57gc.js +0 -2
  303. package/packages/client/dist/assets/index-BX7y_Qt3.css +0 -32
  304. package/packages/client/dist/assets/index-DWIOf7rA.js +0 -1657
@@ -7,6 +7,8 @@ import { StreamHandler } from './streamHandler.js';
7
7
  import { SessionService } from './sessionService.js';
8
8
  import { rewindSessionFiles } from './fileRewind.js';
9
9
  import { buildSystemPrompt, resolveTemplateVariables } from './workspaceContext.js';
10
+ import { PromptQueue } from './promptQueue.js';
11
+ import { HookEventBridge } from '../handlers/hookBridge.js';
10
12
  import { createLogger } from '../utils/logger.js';
11
13
  const log = createLogger('chatService');
12
14
  // Intentionally duplicated in streamHandler.ts for file independence
@@ -27,9 +29,43 @@ export class ChatService {
27
29
  disallowedTools;
28
30
  /** Auto-compaction master switch (both engines). Mirrors the autoCompactEnabled preference; default true. */
29
31
  autoCompactEnabled;
32
+ /**
33
+ * The persistent SDK query. Epic 38: created ONCE (lazily on the first send)
34
+ * and kept alive for the session — NOT recreated per turn — so the control
35
+ * channel stays open for post-result hooks. `null` before the first send and
36
+ * after `close()`; `interrupt()`/`setPermissionMode()` reach it between turns.
37
+ */
30
38
  currentQuery = null;
39
+ /** Single iterator over the persistent query — each turn consumes one slice of it. */
40
+ sessionIterator = null;
41
+ /** Manually-driven prompt input; each turn pushes its user message here. */
42
+ promptQueue = null;
43
+ /** SDK hook → internal-event bridge (observe-only in 38.1; 38.2 consumes the ledger). */
44
+ hookBridge = null;
45
+ /**
46
+ * Story 38.5 (Task 2) — process-residency flag. When `true`, the callback path
47
+ * does NOT close the persistent stream at turn end: the engine is retained across
48
+ * turns and its lifecycle (idle timeout / LRU eviction / crash cleanup) is owned
49
+ * by the higher-level residency registry, not by the turn. Default `false` keeps
50
+ * the Story 38.1 behavior (one turn per instance, close at turn end) for any
51
+ * caller that has not opted into residency. SDK-engine-only concept.
52
+ */
53
+ resident = false;
54
+ /**
55
+ * The CURRENT turn's permission callback. The SDK's `canUseTool` is a query-
56
+ * CREATION option (fixed for the persistent query's lifetime), but each turn's
57
+ * handler is bound to that turn's live stream (its event buffer, pending-
58
+ * permission map, sockets). A resident engine is reused across turns, so the
59
+ * query registers a stable delegator that reads this field — refreshed on every
60
+ * send — instead of capturing the first turn's handler. Without this, an
61
+ * AskUserQuestion/permission prompt on a reuse turn lands on the dead
62
+ * creation-turn stream: invisible after refresh and unanswerable.
63
+ */
64
+ activeCanUseTool;
31
65
  /** Warning message from rewindFiles failure (non-fatal, streaming continues) */
32
66
  rewindWarning = null;
67
+ /** Last turn ended via tracker-hold grace expiry → residency must evict (see ChatEngine docs). */
68
+ lastTurnTrackerHoldExpired = false;
33
69
  constructor(config = {}) {
34
70
  this.workingDirectory = config.workingDirectory;
35
71
  this.permissionMode = config.permissionMode ?? 'default';
@@ -79,9 +115,85 @@ export class ChatService {
79
115
  return this.workingDirectory;
80
116
  }
81
117
  /**
82
- * Send a message and receive responses through an async generator
118
+ * Send a message and receive responses through an async generator.
119
+ *
120
+ * Epic 38 (Story 38.1): the underlying `query()` is a PERSISTENT stream —
121
+ * created lazily on the first send and reused for every subsequent turn (no
122
+ * per-turn process re-spawn, control channel stays open for post-result hooks).
123
+ * Each call pushes its user message onto the shared prompt queue and consumes
124
+ * the stream up to THIS turn's `result`, WITHOUT draining the generator: the
125
+ * stream never ends on its own (the prompt queue keeps it open), so the turn
126
+ * boundary is the `result` message and the consumer (processStream) decides
127
+ * when to stop. Teardown is `close()`, not turn end.
128
+ *
129
+ * In production the callback path (`sendMessageWithCallbacks`) still closes the
130
+ * stream at turn end (one turn per engine instance today — websocket recreates
131
+ * the engine per send), so behavior is unchanged. The multi-turn capability is
132
+ * exercised by calling this generator repeatedly on one instance; cross-turn
133
+ * process residency wiring is Story 38.5.
83
134
  */
84
135
  async *sendMessage(content, options = {}, canUseTool) {
136
+ // Re-point the persistent query's permission delegator at THIS turn's handler
137
+ // (see activeCanUseTool — a resident engine reuses one query across turns).
138
+ this.activeCanUseTool = canUseTool;
139
+ // Whether this request runs at 1M — drives the contextWindow meter correction
140
+ // at the result. (Query options are fixed at stream creation; per-turn model
141
+ // changes are Story 38.5.)
142
+ const is1M = effectiveModelIs1M(options.model);
143
+ // Lazily create the persistent query on the first send of the session.
144
+ if (!this.currentQuery) {
145
+ await this.createPersistentQuery(options, canUseTool);
146
+ // Story 25.7: rewind files to the checkpoint before streaming. Only
147
+ // meaningful at stream creation (it configures the resumed session).
148
+ this.rewindWarning = null;
149
+ if (options.rewindToMessageUuid) {
150
+ await this.applyInlineRewind(options.rewindToMessageUuid);
151
+ }
152
+ }
153
+ // Align the Stop-hook completion cursor before this turn generates anything:
154
+ // an unconsumed main Stop left by a previous turn's ERROR result (which ends
155
+ // its turn without consuming) must not be readable as THIS turn's snapshot.
156
+ this.hookBridge?.discardStaleMainStops();
157
+ // Push this turn's user message onto the persistent input queue — plain text,
158
+ // or text + inline base64 image blocks (Story 5.5), same SDKUserMessage shape.
159
+ this.promptQueue.push(buildUserMessage(content, options.images));
160
+ let finalResponse = {
161
+ id: '',
162
+ sessionId: '',
163
+ content: '',
164
+ done: false,
165
+ isError: false,
166
+ };
167
+ try {
168
+ // Consume the shared session iterator. It does NOT end at a `result` (the
169
+ // prompt queue holds the stream open), so we must not drain it — the
170
+ // consumer stops pumping at the turn-ending result. A `done` step only
171
+ // happens when close() ends the session.
172
+ for (;;) {
173
+ const step = await this.sessionIterator.next();
174
+ if (step.done)
175
+ break;
176
+ const message = step.value;
177
+ yield message;
178
+ // Process result message
179
+ if (message.type === 'result') {
180
+ finalResponse = buildFinalResponse(message, is1M);
181
+ }
182
+ }
183
+ }
184
+ catch (error) {
185
+ throw parseSDKError(error);
186
+ }
187
+ // NOTE: no `finally { this.currentQuery = null }` here — the query is
188
+ // persistent (Epic 38). It is torn down in close(); the callback path closes
189
+ // it at turn end, and Story 38.5 owns cross-turn residency.
190
+ return finalResponse;
191
+ }
192
+ /**
193
+ * Build the queryOptions and create the persistent `query()` with the manually
194
+ * driven prompt queue + SDK hooks. Called once per session (first send).
195
+ */
196
+ async createPersistentQuery(options, canUseTool) {
85
197
  const resolvedAllowed = options.allowedTools ?? this.allowedTools;
86
198
  const resolvedDisallowed = options.disallowedTools ?? this.disallowedTools;
87
199
  const systemPrompt = (() => {
@@ -95,9 +207,17 @@ export class ChatService {
95
207
  append,
96
208
  };
97
209
  })();
98
- // Whether this request actually runs at 1M — drives both the `[1m]` suffix
99
- // applied below and the contextWindow meter correction at the result message.
100
- const is1M = effectiveModelIs1M(options.model);
210
+ this.promptQueue = new PromptQueue();
211
+ this.hookBridge = new HookEventBridge();
212
+ // Permission prompts must reach the CURRENT turn's handler, not the one
213
+ // captured at query creation: a resident engine reuses this query across
214
+ // turns while each turn's handler is bound to its own live stream.
215
+ // sendMessage refreshes activeCanUseTool every turn; this stable delegator
216
+ // routes through it. Registered only when the creation turn provided a
217
+ // handler (no handler → key removed below → SDK default behavior, unchanged).
218
+ const delegatingCanUseTool = canUseTool
219
+ ? (toolName, input, opts) => (this.activeCanUseTool ?? canUseTool)(toolName, input, opts)
220
+ : undefined;
101
221
  const queryOptions = {
102
222
  cwd: this.workingDirectory,
103
223
  permissionMode: this.permissionMode,
@@ -130,7 +250,11 @@ export class ChatService {
130
250
  resumeSessionAt: options.resumeSessionAt,
131
251
  forkSession: options.forkSession,
132
252
  enableFileCheckpointing: options.enableFileCheckpointing,
133
- canUseTool,
253
+ // Epic 38: register first-class SDK hooks over the persistent control
254
+ // channel. Observe-only in 38.1 — the bridge records to an in-memory ledger
255
+ // + logs; the completion verdict (Stop background_tasks[]) is Story 38.2.
256
+ hooks: this.hookBridge.buildHooks(),
257
+ canUseTool: delegatingCanUseTool,
134
258
  // Capture CLI stderr for debugging process exit errors
135
259
  stderr: (data) => {
136
260
  log.error(`CLI stderr: ${data.trimEnd()}`);
@@ -163,93 +287,102 @@ export class ChatService {
163
287
  log.warn(`cleanRewindDirty failed: ${err instanceof Error ? err.message : String(err)}`);
164
288
  }
165
289
  }
166
- // Use AsyncIterable prompt when images are present (Story 5.5)
167
- const { images } = options;
168
- if (images && images.length > 0) {
169
- this.currentQuery = query({
170
- prompt: createMessageWithImages(content, images),
171
- options: queryOptions,
172
- });
173
- }
174
- else {
175
- this.currentQuery = query({
176
- prompt: content,
177
- options: queryOptions,
178
- });
179
- }
180
- // Story 25.7: rewind files to the specified user message checkpoint before streaming
181
- this.rewindWarning = null;
182
- if (options.rewindToMessageUuid && !this.currentQuery) {
290
+ this.currentQuery = query({
291
+ prompt: this.promptQueue,
292
+ options: queryOptions,
293
+ });
294
+ this.sessionIterator = this.currentQuery[Symbol.asyncIterator]();
295
+ }
296
+ /** Inline rewind-before-send (Story 25.7): rewind project files to `messageUuid`. */
297
+ async applyInlineRewind(messageUuid) {
298
+ if (!this.currentQuery) {
183
299
  log.error('rewindFiles requested but currentQuery is null');
184
300
  this.rewindWarning = 'File rewind failed: query not initialized';
301
+ return;
185
302
  }
186
- else if (options.rewindToMessageUuid && this.currentQuery) {
187
- try {
188
- const rewindResult = await this.currentQuery.rewindFiles(options.rewindToMessageUuid);
189
- log.info(`rewindFiles result: canRewind=${rewindResult.canRewind}, filesChanged=${rewindResult.filesChanged?.length ?? 0}, insertions=${rewindResult.insertions ?? 0}, deletions=${rewindResult.deletions ?? 0}`);
190
- if (!rewindResult.canRewind) {
191
- const reason = rewindResult.error ?? 'unknown reason';
192
- log.warn(`rewindFiles failed: ${reason}`);
193
- this.rewindWarning = `File rewind failed: ${reason}`;
194
- }
195
- }
196
- catch (err) {
197
- const msg = err instanceof Error ? err.message : String(err);
198
- log.error(`rewindFiles threw: ${msg}`);
199
- this.rewindWarning = `File rewind error: ${msg}`;
200
- }
201
- }
202
- let finalResponse = {
203
- id: '',
204
- sessionId: '',
205
- content: '',
206
- done: false,
207
- isError: false,
208
- };
209
303
  try {
210
- for await (const message of this.currentQuery) {
211
- yield message;
212
- // Process result message
213
- if (message.type === 'result') {
214
- const msg = message;
215
- finalResponse = {
216
- id: msg.uuid,
217
- sessionId: msg.session_id,
218
- content: msg.subtype === 'success' ? msg.result : '',
219
- done: true,
220
- isError: msg.is_error,
221
- usage: {
222
- inputTokens: msg.usage.input_tokens,
223
- outputTokens: msg.usage.output_tokens,
224
- cacheReadInputTokens: msg.usage.cache_read_input_tokens ?? 0,
225
- cacheCreationInputTokens: msg.usage.cache_creation_input_tokens ?? 0,
226
- totalCostUSD: msg.total_cost_usd,
227
- contextWindow: correctContextWindow(extractContextWindow(msg.modelUsage), is1M),
228
- },
229
- };
230
- }
304
+ const rewindResult = await this.currentQuery.rewindFiles(messageUuid);
305
+ log.info(`rewindFiles result: canRewind=${rewindResult.canRewind}, filesChanged=${rewindResult.filesChanged?.length ?? 0}, insertions=${rewindResult.insertions ?? 0}, deletions=${rewindResult.deletions ?? 0}`);
306
+ if (!rewindResult.canRewind) {
307
+ const reason = rewindResult.error ?? 'unknown reason';
308
+ log.warn(`rewindFiles failed: ${reason}`);
309
+ this.rewindWarning = `File rewind failed: ${reason}`;
231
310
  }
232
311
  }
233
- catch (error) {
234
- throw parseSDKError(error);
312
+ catch (err) {
313
+ const msg = err instanceof Error ? err.message : String(err);
314
+ log.error(`rewindFiles threw: ${msg}`);
315
+ this.rewindWarning = `File rewind error: ${msg}`;
235
316
  }
236
- finally {
237
- this.currentQuery = null;
317
+ }
318
+ /**
319
+ * Tear down the persistent stream (session end / abort). Ends the prompt queue
320
+ * so a parked `next()` unblocks, closes the query, and clears references.
321
+ * Idempotent. Story 38.3/38.5 own the higher-level abort/lifecycle wiring.
322
+ */
323
+ async close() {
324
+ const q = this.currentQuery;
325
+ this.promptQueue?.close();
326
+ this.currentQuery = null;
327
+ this.sessionIterator = null;
328
+ this.promptQueue = null;
329
+ this.hookBridge = null;
330
+ if (q && typeof q.close === 'function') {
331
+ try {
332
+ q.close();
333
+ }
334
+ catch (err) {
335
+ log.warn(`query close failed: ${err instanceof Error ? err.message : String(err)}`);
336
+ }
238
337
  }
239
- return finalResponse;
338
+ }
339
+ /** The hook→event bridge for the active persistent query (Story 38.2 consumes its ledger). */
340
+ getHookBridge() {
341
+ return this.hookBridge;
240
342
  }
241
343
  /**
242
- * Send a message and collect all responses (non-streaming)
344
+ * Story 38.5 (Task 2) opt this engine into cross-turn residency. Set by the
345
+ * residency registry when it takes ownership of the engine's lifecycle: while
346
+ * resident, the callback path skips the turn-end `close()` so the persistent
347
+ * query survives into the next turn (no ~3s re-spawn — probe-confirmed). The
348
+ * registry then closes it on idle timeout / LRU eviction / crash. Idempotent.
349
+ */
350
+ setResident(resident) {
351
+ this.resident = resident;
352
+ }
353
+ /** Whether a persistent query is currently live (used by the registry to detect a torn-down engine). */
354
+ isLive() {
355
+ return this.currentQuery !== null;
356
+ }
357
+ /**
358
+ * Send a message and collect the final response (non-streaming).
359
+ *
360
+ * Story 38.5 (Task 6d) — latent-hang guard. The persistent `sendMessage`
361
+ * generator does NOT return after a turn's `result`: it loops back to a parked
362
+ * `sessionIterator.next()` awaiting the NEXT prompt (or `close()`), so a naive
363
+ * "pull until done" would block forever the moment the first result is yielded —
364
+ * a latent infinite wait that only the streaming/callback path (which stops
365
+ * pulling at the result) avoided. This helper therefore STOPS consuming at this
366
+ * turn's result and builds the response from it. It handles one turn (the first
367
+ * result); background-task follow-ups are the streaming path's concern, not this
368
+ * sync helper's. Not on the production path — kept for tests/manual verification.
243
369
  */
244
370
  async sendMessageSync(content, options = {}) {
245
- const messages = [];
371
+ const is1M = effectiveModelIs1M(options.model);
246
372
  const generator = this.sendMessage(content, options);
247
- let result = await generator.next();
248
- while (!result.done) {
249
- messages.push(result.value);
250
- result = await generator.next();
373
+ for (;;) {
374
+ const step = await generator.next();
375
+ // A `done` step means the generator was drained (e.g. close() ended the
376
+ // session) its return value is the authoritative final response.
377
+ if (step.done)
378
+ return step.value;
379
+ const message = step.value;
380
+ if (message.type === 'result') {
381
+ // Turn boundary: build from this result and stop pulling so the parked
382
+ // iterator can't block us (the generator won't return on its own).
383
+ return buildFinalResponse(message, is1M);
384
+ }
251
385
  }
252
- return result.value;
253
386
  }
254
387
  /**
255
388
  * Interrupt the current query
@@ -274,6 +407,22 @@ export class ChatService {
274
407
  await this.currentQuery.setPermissionMode(mode);
275
408
  }
276
409
  }
410
+ /**
411
+ * Story 38.4 — runtime model switch. Change the model used for subsequent
412
+ * responses on the LIVE persistent query, without recreating it (no ~3s
413
+ * restart). `resolveEffectiveModel` resolves the `[1m]` suffix identically to
414
+ * the creation path (`createPersistentQuery` model option), so a runtime
415
+ * switch and a fresh-query model land on the exact same effective id. No-op
416
+ * when no query exists yet — the next `createPersistentQuery` reads the model
417
+ * from the send options instead. Probe-confirmed GO (setModel reflects on the
418
+ * next turn's response model meta); SDK-mode only (CLI omits this, callers
419
+ * feature-detect).
420
+ */
421
+ async setModel(model) {
422
+ if (this.currentQuery) {
423
+ await this.currentQuery.setModel(resolveEffectiveModel(model) || undefined);
424
+ }
425
+ }
277
426
  /**
278
427
  * Send a message with callback-based event handling
279
428
  * Uses StreamHandler internally to process the async generator
@@ -289,9 +438,28 @@ export class ChatService {
289
438
  */
290
439
  _onGenerationProgress,
291
440
  /** Story 36.2: CLI phase callback — accepted for the ChatEngine interface, UNUSED in SDK mode. */
292
- _onPhase, _onScreenFrame, _screenFrameThrottleMs, _backgroundTracker, _onPermissionModeSync) {
441
+ _onPhase, _onScreenFrame, _screenFrameThrottleMs,
442
+ /**
443
+ * Turn-boundary gate 2 (2026-07-12 fix). Story 38.2 made the engine's Stop
444
+ * hook (via {@link StopSnapshotSource} below) the boundary source and retired
445
+ * this tracker from the judgment — but the Stop ledger has a deterministic
446
+ * blind spot: a task that COMPLETES while a generation is still running has
447
+ * already left `background_tasks[]` at that generation's Stop, while its
448
+ * queued `<task-notification>` guarantees an auto-resume follow-up. The
449
+ * tracker (task_started/acks minus notifications) still holds such a task,
450
+ * so streamHandler now gates the turn on BOTH sources. Also remains the
451
+ * crash-safety-net poller's pending set (websocket owns `stream.backgroundTracker`).
452
+ */
453
+ backgroundTracker, _onPermissionModeSync) {
293
454
  const streamHandler = new StreamHandler(effectiveModelIs1M(options.model));
294
455
  const generator = this.sendMessage(content, options, canUseTool);
456
+ // Turn-completion source (Story 38.2): resolve the active persistent query's
457
+ // hook bridge lazily at each result. The bridge is created when the stream
458
+ // first starts (createPersistentQuery), so it is present by the time
459
+ // processStream consumes a result and asks for this turn's Stop snapshot.
460
+ const stopSource = {
461
+ consumeMainStopSnapshot: () => this.getHookBridge()?.consumeMainStopSnapshot(),
462
+ };
295
463
  // Wrapper generator: calls onRawMessage for every SDK message,
296
464
  // and emits heartbeat while waiting for generator.next() to confirm SDK is alive.
297
465
  async function* wrapGenerator() {
@@ -299,20 +467,50 @@ export class ChatService {
299
467
  while (!result.done) {
300
468
  onRawMessage?.(result.value.type ?? 'unknown');
301
469
  yield result.value;
302
- // Wait for next message with 30s heartbeat to confirm SDK is alive
470
+ // Wait for next message with 30s heartbeat to confirm SDK is alive.
471
+ // The clear must run even when next() REJECTS (hard abort, SDK crash,
472
+ // resume failure) — an active interval is a GC root, so skipping it
473
+ // leaked one permanent 30s timer + this turn's closure graph per error.
303
474
  const nextPromise = generator.next();
304
- let heartbeatId = setInterval(() => {
475
+ const heartbeatId = setInterval(() => {
305
476
  log.verbose('heartbeat: generator.next() still pending — SDK is alive');
306
477
  onRawMessage?.('heartbeat');
307
478
  }, 30000);
308
- result = await nextPromise;
309
- if (heartbeatId) {
479
+ try {
480
+ result = await nextPromise;
481
+ }
482
+ finally {
310
483
  clearInterval(heartbeatId);
311
- heartbeatId = null;
312
484
  }
313
485
  }
314
486
  }
315
- return streamHandler.processStream(wrapGenerator(), callbacks);
487
+ this.lastTurnTrackerHoldExpired = false;
488
+ try {
489
+ const response = await streamHandler.processStream(wrapGenerator(), callbacks, {
490
+ stopSource,
491
+ // Gate 2: tracked background tasks not yet resolved by a notification —
492
+ // covers the queued-notification window the Stop ledger cannot see.
493
+ pendingSource: backgroundTracker,
494
+ });
495
+ // Grace-expiry turns abandon a parked read on the shared session iterator —
496
+ // surface it so the residency reconciliation evicts this engine (see
497
+ // ChatEngine.lastTurnTrackerHoldExpired). Error/throw paths stay false:
498
+ // they already evict via the !turnSucceeded branch.
499
+ this.lastTurnTrackerHoldExpired = streamHandler.trackerHoldExpired;
500
+ return response;
501
+ }
502
+ finally {
503
+ // Epic 38: the persistent stream stays open past the result. In the
504
+ // non-resident (Story 38.1) mode the callback path closes it at turn end to
505
+ // avoid leaking an idle engine process (one turn per instance — websocket
506
+ // recreated the engine per send). Story 38.5 (Task 2): when this engine is
507
+ // resident, the turn-end close is SKIPPED — the residency registry owns the
508
+ // engine's lifecycle (idle timeout / LRU eviction / crash cleanup) so the
509
+ // query survives into the next turn without a ~3s re-spawn.
510
+ if (!this.resident) {
511
+ await this.close();
512
+ }
513
+ }
316
514
  }
317
515
  /**
318
516
  * Standalone file rewind (no message send) — backs the `session:rewind-files`
@@ -325,30 +523,87 @@ export class ChatService {
325
523
  * `rewindWarning`) — do not conflate the two.
326
524
  */
327
525
  async rewindFiles(params) {
526
+ // Story 38.7: when this engine is RESIDENT with a live persistent query for the
527
+ // session, rewind INLINE on that query (`currentQuery.rewindFiles`) — the same
528
+ // control-channel operation the inline rewind-before-send uses. This avoids
529
+ // spinning up a SECOND live `query({ resume })` on the same session's JSONL, and
530
+ // needs no `markRewindDirty` (the inline path leaves no empty user message, unlike
531
+ // the throwaway `query({ prompt: '' })`). A non-resident / fresh engine
532
+ // (currentQuery === null — e.g. the standalone handler's throwaway) falls through to
533
+ // the shared standalone path. If the inline call throws, fall back too (never worse
534
+ // than the standalone behavior).
535
+ if (this.currentQuery) {
536
+ try {
537
+ return await this.currentQuery.rewindFiles(params.messageUuid, { dryRun: !!params.dryRun });
538
+ }
539
+ catch (err) {
540
+ log.warn(`inline rewindFiles failed, falling back to standalone: ${err instanceof Error ? err.message : String(err)}`);
541
+ }
542
+ }
328
543
  return rewindSessionFiles(params, this.workingDirectory);
329
544
  }
330
545
  }
331
546
  /**
332
- * Create an AsyncIterable prompt with text and image content for SDK query()
333
- * Story 5.5: Image Attachment
547
+ * Map an SDK `result` message to the engine-facing {@link ChatResponse}. Shared by
548
+ * the streaming (`sendMessage`) and non-streaming (`sendMessageSync`) paths so both
549
+ * derive an identical response from the same result (Story 38.5 Task 6d — the sync
550
+ * path breaks at the result to avoid the parked-iterator hang, so it needs this too).
334
551
  */
335
- async function* createMessageWithImages(text, images) {
336
- yield {
337
- type: 'user',
338
- session_id: '',
339
- message: {
340
- role: 'user',
341
- content: [
342
- { type: 'text', text },
343
- ...images.map((img) => ({
552
+ function buildFinalResponse(message, is1M) {
553
+ const msg = message;
554
+ return {
555
+ id: msg.uuid,
556
+ sessionId: msg.session_id,
557
+ content: msg.subtype === 'success' ? msg.result : '',
558
+ done: true,
559
+ isError: msg.is_error,
560
+ usage: {
561
+ inputTokens: msg.usage.input_tokens,
562
+ outputTokens: msg.usage.output_tokens,
563
+ cacheReadInputTokens: msg.usage.cache_read_input_tokens ?? 0,
564
+ cacheCreationInputTokens: msg.usage.cache_creation_input_tokens ?? 0,
565
+ totalCostUSD: msg.total_cost_usd,
566
+ contextWindow: correctContextWindow(extractContextWindow(msg.modelUsage), is1M),
567
+ },
568
+ };
569
+ }
570
+ /**
571
+ * Build one SDKUserMessage for the persistent prompt queue (Epic 38). Plain text,
572
+ * or text + inline base64 image/document blocks when attachments are present
573
+ * (Story 5.5, PDF documents: Story BS-11 — `images` param name kept for Stage 1
574
+ * compatibility; PDFs ride the same array distinguished by mimeType).
575
+ */
576
+ function buildUserMessage(text, images) {
577
+ const content = images && images.length > 0
578
+ ? [
579
+ { type: 'text', text },
580
+ ...images.map((img) => img.mimeType === 'application/pdf'
581
+ ? {
582
+ type: 'document',
583
+ source: {
584
+ type: 'base64',
585
+ media_type: 'application/pdf',
586
+ data: img.data,
587
+ },
588
+ // Original filename lets Claude tell multiple documents apart
589
+ title: img.name,
590
+ }
591
+ : {
344
592
  type: 'image',
345
593
  source: {
346
594
  type: 'base64',
347
595
  media_type: img.mimeType,
348
596
  data: img.data,
349
597
  },
350
- })),
351
- ],
598
+ }),
599
+ ]
600
+ : text;
601
+ return {
602
+ type: 'user',
603
+ session_id: '',
604
+ message: {
605
+ role: 'user',
606
+ content,
352
607
  },
353
608
  parent_tool_use_id: null,
354
609
  };
@@ -1 +1 @@
1
- {"version":3,"file":"chatService.js","sourceRoot":"","sources":["../../src/services/chatService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chatService.js","sourceRoot":"","sources":["../../src/services/chatService.ts"],"names":[],"mappings":"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"}
@@ -99,6 +99,14 @@ export declare class ClaudeLoginSession {
99
99
  private credPollTimer;
100
100
  private credWatcher;
101
101
  private readonly timeoutMs;
102
+ /**
103
+ * The credential token already on disk when this login session started (null when logged out).
104
+ * Completion is detected by the token CHANGING away from this snapshot — NOT by a token merely
105
+ * existing. Adding a second account leaves the previous account's credential on disk, so an
106
+ * existence check would complete instantly on the stale token and tear the session down before
107
+ * the new account's credential is ever written (Story BS-8 multi-account regression).
108
+ */
109
+ private priorToken;
102
110
  constructor(cb: ClaudeLoginCallbacks, timeoutMs?: number);
103
111
  /** Spawn the disposable login PTY and begin the boot → /login sequence. */
104
112
  start(binaryPathOverride?: string): void;
@@ -112,9 +120,12 @@ export declare class ClaudeLoginSession {
112
120
  private afterBootSettle;
113
121
  private consumeGrid;
114
122
  /**
115
- * Watch the credentials file for a token (fs.watch as the low-latency trigger + a poll loop as
116
- * the deterministic fallback — the file may not exist yet, and fs.watch reliability varies by
117
- * platform). On a token appearing, refresh account info and complete.
123
+ * Watch the credentials file for a NEW token (fs.watch as the low-latency trigger + a poll loop
124
+ * as the deterministic fallback — the file may not exist yet, and fs.watch reliability varies by
125
+ * platform). Completion fires only when the token differs from the pre-login snapshot
126
+ * ({@link priorToken}), so a credential already on disk (the "add account" case) doesn't
127
+ * complete the session before the new account's credential is written. On a fresh token, refresh
128
+ * account info and complete.
118
129
  */
119
130
  private watchCredentials;
120
131
  private complete;