hammoc 1.8.3 → 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-B0EHAvjx.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-BFQeQmwm.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-DVju7SBc.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-BX7y_Qt3.css +0 -32
  303. package/packages/client/dist/assets/index-Bav7AMMy.js +0 -2
  304. package/packages/client/dist/assets/index-DgRQoBIg.js +0 -1657
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Post-turn background-task wait loop, shared by the browser chat path
3
+ * (websocket.ts) and the queue runner (queueService.ts).
4
+ *
5
+ * The engine returns from a turn at end_turn while background tasks may still
6
+ * be running. The engine process itself stays alive: when a task completes it
7
+ * injects a `<task-notification>` user message into the session JSONL and
8
+ * AUTO-RESUMES generation (a follow-up response, which can itself launch or
9
+ * re-engage background tasks — e.g. SendMessage re-running an idle agent).
10
+ * None of that reaches the closed stream, so we watch the session JSONL tail:
11
+ *
12
+ * - user `<task-notification>` messages → resolve a pending task
13
+ * - user tool_result blocks → launch acks register a new
14
+ * pending (SendMessage resume, nested launches); any other result for a
15
+ * tracked id resolves it
16
+ * - assistant tool_use blocks with
17
+ * `run_in_background: true` → register a new pending
18
+ * - assistant records → follow-up generation
19
+ * progress; `stop_reason: "end_turn"` with no pending tasks ends the wait
20
+ *
21
+ * The wait ends when every pending task is resolved AND the auto-resume
22
+ * follow-up (if any) reached end_turn — or on abort/timeout.
23
+ */
24
+ import { closeSync, existsSync, openSync, readSync, statSync } from 'fs';
25
+ import { parseTaskNotification } from '../services/historyParser.js';
26
+ import { createLogger } from './logger.js';
27
+ const log = createLogger('backgroundTaskPoller');
28
+ export const BG_POLL_INTERVAL_MS = 500;
29
+ /** Hard cap. Generous: a verifier agent + follow-up repair + re-verify chain
30
+ * has been observed to take 13+ minutes. The user always has the Stop button. */
31
+ export const BG_WAIT_TIMEOUT_MS = 1_800_000; // 30 minutes
32
+ /** How long to wait for an auto-resume follow-up to BEGIN after the last
33
+ * pending task resolved. Completed notifications usually trigger generation
34
+ * within ~2s; stopped/failed ones may produce none at all. */
35
+ export const BG_FOLLOWUP_GRACE_MS = 8_000;
36
+ /** How far back the startup reconcile scans the existing JSONL for
37
+ * already-recorded notifications. Covers hours of heavy turns; a pending
38
+ * task's notification is always within its own turn's bytes. */
39
+ export const RECONCILE_SCAN_BYTES = 4 * 1024 * 1024;
40
+ function blockText(content) {
41
+ if (typeof content === 'string')
42
+ return content;
43
+ if (Array.isArray(content)) {
44
+ return content
45
+ .filter((b) => b.type === 'text')
46
+ .map((b) => b.text ?? '')
47
+ .join(' ');
48
+ }
49
+ return '';
50
+ }
51
+ /** Extract task-notification text from any record shape that can carry it:
52
+ * queue-operation (enqueue), attachment (queued-command display), user (injected). */
53
+ function notificationTextFrom(raw) {
54
+ if (raw.type === 'queue-operation' || raw.type === 'attachment') {
55
+ return raw.content ?? raw.attachment?.prompt ?? '';
56
+ }
57
+ if (raw.type === 'user')
58
+ return blockText(raw.message?.content);
59
+ return '';
60
+ }
61
+ /**
62
+ * Resolve pending ids whose completion notification is ALREADY in the file.
63
+ *
64
+ * A notification can be enqueued (queue-operation record) yet never injected
65
+ * into the conversation before the engine closes the stream — observed
66
+ * 2026-07-05 (TicaDice 36c5b1ea: 9 parallel agents, one notification enqueued
67
+ * at 09:09Z but never injected → the turn ended with a ghost pending). The
68
+ * tail poll only reads bytes written AFTER its snapshot, so without this pass
69
+ * a ghost pending waits the full timeout for bytes that already exist.
70
+ */
71
+ function reconcileExistingNotifications(filePath, tracker, logPrefix) {
72
+ try {
73
+ if (!existsSync(filePath) || tracker.pending === 0)
74
+ return;
75
+ const size = statSync(filePath).size;
76
+ const start = Math.max(0, size - RECONCILE_SCAN_BYTES);
77
+ const fd = openSync(filePath, 'r');
78
+ const buf = Buffer.alloc(size - start);
79
+ readSync(fd, buf, 0, size - start, start);
80
+ closeSync(fd);
81
+ const pendingIds = [...tracker.pendingToolUseIds];
82
+ for (const line of buf.toString('utf8').split('\n')) {
83
+ if (tracker.pending === 0)
84
+ break;
85
+ // Cheap pre-filter: skip lines that reference no pending id.
86
+ if (!pendingIds.some((id) => line.includes(id)))
87
+ continue;
88
+ let raw;
89
+ try {
90
+ raw = JSON.parse(line);
91
+ }
92
+ catch {
93
+ continue; // partial first line of the bounded read, or mid-write junk
94
+ }
95
+ if (raw.isSidechain === true)
96
+ continue;
97
+ const text = notificationTextFrom(raw);
98
+ if (!text)
99
+ continue;
100
+ const notif = parseTaskNotification(text);
101
+ if (notif?.toolUseId && tracker.hasPending(notif.toolUseId)) {
102
+ tracker.trackTaskDone(notif.toolUseId);
103
+ log.info(`${logPrefix} reconcile: notification for ${notif.toolUseId.slice(-8)} already recorded (${raw.type}) — resolved without waiting, remaining=${tracker.pending}`);
104
+ }
105
+ }
106
+ }
107
+ catch {
108
+ /* reconcile is best-effort; the poll loop remains the authority */
109
+ }
110
+ }
111
+ /**
112
+ * Wait until all tracked background tasks complete and any auto-resume
113
+ * follow-up generation finishes.
114
+ *
115
+ * @returns true when the session reached a settled state; false on
116
+ * abort/stop/timeout (caller proceeds with turn finalization anyway —
117
+ * the JSONL reload picks up whatever was written).
118
+ */
119
+ export async function waitForBackgroundTasksAndFollowUp(opts) {
120
+ const { filePath, tracker, abortSignal, keepRunning, logPrefix = '[BG-WAIT]', timeoutMs = BG_WAIT_TIMEOUT_MS, pollIntervalMs = BG_POLL_INTERVAL_MS, followUpGraceMs = BG_FOLLOWUP_GRACE_MS, callbacks, } = opts;
121
+ if (!tracker.isWaiting)
122
+ return true;
123
+ // A pending task's notification may ALREADY be in the file (enqueued but
124
+ // never injected before the stream closed) — resolve those before waiting
125
+ // for new bytes, otherwise they would wait out the full timeout.
126
+ reconcileExistingNotifications(filePath, tracker, logPrefix);
127
+ const startedAt = Date.now();
128
+ const deadline = startedAt + timeoutMs;
129
+ log.info(`${logPrefix} waiting for ${tracker.pending} background task(s): file=${filePath}, ids=[${[...tracker.pendingToolUseIds].map((id) => id.slice(-8)).join(',')}]`);
130
+ let lastSize = 0;
131
+ try {
132
+ lastSize = existsSync(filePath) ? statSync(filePath).size : 0;
133
+ }
134
+ catch {
135
+ /* file may not exist yet */
136
+ }
137
+ // Follow-up state: set when the last pending task resolves; cleared when a
138
+ // new pending registers (e.g. the follow-up re-engaged an agent).
139
+ let fullyDoneAt = tracker.isFullyDone ? Date.now() : null;
140
+ let followUpActive = false;
141
+ // stop_reason of the most recent assistant record seen in the tail.
142
+ let lastAssistantStop = null;
143
+ // Guard against re-broadcasting pre-end_turn records that were already
144
+ // delivered by the live delta stream. The JSONL write of the first turn's
145
+ // assistant record can race with polling start (SDK writes to JSONL slightly
146
+ // after closing the stream), so we must not emit assistant/tool blocks until
147
+ // we've confirmed we're past at least one task-notification (= in follow-up
148
+ // territory). Records before the first notification were already streamed live.
149
+ let seenFirstNotification = false;
150
+ while (Date.now() < deadline) {
151
+ if (abortSignal?.aborted || (keepRunning && !keepRunning())) {
152
+ log.info(`${logPrefix} background wait interrupted: pending=${tracker.pending}`);
153
+ return false;
154
+ }
155
+ await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
156
+ try {
157
+ // Only read when the file grew — skip expensive I/O when nothing changed.
158
+ const currentSize = existsSync(filePath) ? statSync(filePath).size : 0;
159
+ if (currentSize > lastSize) {
160
+ const tailSize = currentSize - lastSize;
161
+ const fd = openSync(filePath, 'r');
162
+ const buf = Buffer.alloc(tailSize);
163
+ readSync(fd, buf, 0, tailSize, lastSize);
164
+ closeSync(fd);
165
+ lastSize = currentSize;
166
+ const lines = buf.toString('utf8').split('\n').filter((l) => l.trim());
167
+ for (const line of lines) {
168
+ let raw;
169
+ try {
170
+ raw = JSON.parse(line);
171
+ }
172
+ catch {
173
+ continue;
174
+ }
175
+ // Subagent sidechain records must not drive main-turn state.
176
+ if (raw.isSidechain === true)
177
+ continue;
178
+ if (raw.type === 'assistant') {
179
+ const content = raw.message?.content;
180
+ if (Array.isArray(content)) {
181
+ let textIdx = 0;
182
+ for (const block of content) {
183
+ if (block.type === 'tool_use' && block.id) {
184
+ tracker.trackToolUse(block.id, block.input, block.name);
185
+ // Only re-broadcast after the first task-notification — records
186
+ // before that were already delivered by the live delta stream.
187
+ if (seenFirstNotification) {
188
+ callbacks?.onToolUse?.({
189
+ id: block.id,
190
+ name: block.name ?? 'Tool',
191
+ input: block.input ?? {},
192
+ status: 'pending',
193
+ });
194
+ }
195
+ }
196
+ else if (block.type === 'text' && block.text?.trim()) {
197
+ const idx = textIdx++;
198
+ if (seenFirstNotification) {
199
+ callbacks?.onTextChunk?.({
200
+ sessionId: '',
201
+ messageId: `${raw.uuid ?? 'bg'}-t${idx}`,
202
+ content: block.text,
203
+ done: false,
204
+ });
205
+ }
206
+ }
207
+ else if (block.type === 'thinking' && block.thinking?.trim()) {
208
+ if (seenFirstNotification) {
209
+ callbacks?.onThinking?.(block.thinking);
210
+ }
211
+ }
212
+ }
213
+ }
214
+ lastAssistantStop = raw.message?.stop_reason ?? null;
215
+ // Live check (not fullyDoneAt): the resolving notification and the
216
+ // first follow-up record often land in the same read batch.
217
+ // `seenFirstNotification` anchors the detection AFTER a notification
218
+ // line: the SDK's transcript batcher can flush the PREVIOUS
219
+ // generation's records (with their end_turn) into the tail read, and
220
+ // without the anchor those late flushes masquerade as the follow-up
221
+ // (observed 2026-07-12: the net declared "follow-up complete" in
222
+ // 506ms while the real follow-up's first record was 95s away).
223
+ // Accepted tradeoff: a reconcile-resolved pending whose REAL
224
+ // follow-up lands in the tail without any notification line settles
225
+ // at the grace instead of waiting for its end_turn — that shape
226
+ // requires a live engine post-turn, which the dual-gate + expiry-
227
+ // eviction main path no longer leaves behind.
228
+ if (tracker.isFullyDone && !followUpActive && seenFirstNotification) {
229
+ followUpActive = true;
230
+ log.info(`${logPrefix} auto-resume follow-up generation detected`);
231
+ }
232
+ continue;
233
+ }
234
+ // Task-notification resolution: SDK writes the notification in
235
+ // multiple record types — `type: "user"` (streamed input),
236
+ // `type: "queue-operation"`, and `type: "attachment"` (Hammoc's
237
+ // chain/queue injection). Check ALL of them for notification text.
238
+ if (raw.type === 'queue-operation' || raw.type === 'attachment') {
239
+ const notifText = notificationTextFrom(raw);
240
+ if (notifText) {
241
+ const notif = parseTaskNotification(notifText);
242
+ if (notif) {
243
+ seenFirstNotification = true;
244
+ // A notification sighting restarts the no-follow-up grace: the
245
+ // follow-up it may trigger measures from HERE, not from an
246
+ // earlier reconcile-time resolution.
247
+ if (tracker.isFullyDone)
248
+ fullyDoneAt = Date.now();
249
+ if (notif.toolUseId) {
250
+ if (tracker.hasPending(notif.toolUseId)) {
251
+ tracker.trackTaskDone(notif.toolUseId);
252
+ log.info(`${logPrefix} task-notification (${raw.type}): toolUseId=${notif.toolUseId.slice(-8)}, remaining=${tracker.pending}`);
253
+ }
254
+ callbacks?.onTaskNotification?.({
255
+ taskId: notif.taskId,
256
+ status: notif.status,
257
+ summary: notif.summary,
258
+ toolUseId: notif.toolUseId,
259
+ });
260
+ }
261
+ else if (tracker.pending > 0) {
262
+ tracker.trackTaskDone();
263
+ log.info(`${logPrefix} task-notification (${raw.type}) without id, remaining=${tracker.pending}`);
264
+ }
265
+ }
266
+ }
267
+ continue;
268
+ }
269
+ if (raw.type !== 'user')
270
+ continue;
271
+ // Task-notification user messages resolve their pending task.
272
+ const text = blockText(raw.message?.content);
273
+ if (text) {
274
+ const notif = parseTaskNotification(text);
275
+ if (notif) {
276
+ seenFirstNotification = true;
277
+ // Same grace restart as the queue-operation/attachment branch.
278
+ if (tracker.isFullyDone)
279
+ fullyDoneAt = Date.now();
280
+ if (notif.toolUseId) {
281
+ if (tracker.hasPending(notif.toolUseId)) {
282
+ tracker.trackTaskDone(notif.toolUseId);
283
+ log.info(`${logPrefix} task-notification: toolUseId=${notif.toolUseId.slice(-8)}, remaining=${tracker.pending}`);
284
+ }
285
+ // Emit AFTER the poller's own resolution — the callback's
286
+ // internal trackTaskDone(id) is then an idempotent no-op.
287
+ // (No-id legacy notifications are NOT emitted: the callback's
288
+ // no-id fallback would arbitrarily remove a second entry.)
289
+ callbacks?.onTaskNotification?.({
290
+ taskId: notif.taskId,
291
+ status: notif.status,
292
+ summary: notif.summary,
293
+ toolUseId: notif.toolUseId,
294
+ });
295
+ }
296
+ else if (tracker.pending > 0) {
297
+ tracker.trackTaskDone(); // legacy: notification without tool-use-id
298
+ log.info(`${logPrefix} task-notification without id, remaining=${tracker.pending}`);
299
+ }
300
+ }
301
+ }
302
+ // tool_result blocks: launch acks register (SendMessage resume,
303
+ // nested launches); non-ack results for tracked ids resolve them.
304
+ const content = raw.message?.content;
305
+ if (Array.isArray(content)) {
306
+ for (const block of content) {
307
+ if (block.type === 'tool_result' && block.tool_use_id) {
308
+ const before = tracker.pending;
309
+ const resultText = blockText(block.content);
310
+ tracker.trackToolResult(block.tool_use_id, resultText);
311
+ if (tracker.pending !== before) {
312
+ log.info(`${logPrefix} tool_result ${tracker.pending > before ? 'registered' : 'resolved'}: toolUseId=${block.tool_use_id.slice(-8)}, pending=${tracker.pending}`);
313
+ }
314
+ const isError = block.is_error ?? false;
315
+ if (seenFirstNotification) {
316
+ callbacks?.onToolResult?.(block.tool_use_id, {
317
+ success: !isError,
318
+ output: isError ? undefined : resultText,
319
+ error: isError ? resultText : undefined,
320
+ });
321
+ }
322
+ }
323
+ }
324
+ }
325
+ }
326
+ }
327
+ }
328
+ catch {
329
+ // JSONL may be mid-write; retry on next tick
330
+ }
331
+ // Maintain follow-up bookkeeping AFTER processing the batch.
332
+ if (tracker.isFullyDone) {
333
+ if (fullyDoneAt === null)
334
+ fullyDoneAt = Date.now();
335
+ }
336
+ else {
337
+ fullyDoneAt = null;
338
+ followUpActive = false;
339
+ }
340
+ if (tracker.isFullyDone && fullyDoneAt !== null) {
341
+ if (followUpActive) {
342
+ if (lastAssistantStop === 'end_turn') {
343
+ log.info(`${logPrefix} background tasks + follow-up complete, elapsed=${Date.now() - startedAt}ms`);
344
+ return true;
345
+ }
346
+ }
347
+ else if (Date.now() - fullyDoneAt >= followUpGraceMs) {
348
+ log.info(`${logPrefix} background tasks done, no follow-up generation, elapsed=${Date.now() - startedAt}ms`);
349
+ return true;
350
+ }
351
+ }
352
+ }
353
+ log.warn(`${logPrefix} timed out: pending=${tracker.pending}, followUpActive=${followUpActive}, elapsed=${Date.now() - startedAt}ms`);
354
+ return false;
355
+ }
356
+ //# sourceMappingURL=backgroundTaskPoller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundTaskPoller.js","sourceRoot":"","sources":["../../src/utils/backgroundTaskPoller.ts"],"names":[],"mappings":"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"}
@@ -3,18 +3,66 @@ export interface BackgroundTaskState {
3
3
  waiting: boolean;
4
4
  }
5
5
  export type BackgroundTaskChangeCallback = (state: BackgroundTaskState) => void;
6
+ /**
7
+ * Launch acknowledgements the engine writes into a tool_result when the call
8
+ * turned into a background task. The request-side `run_in_background` flag is
9
+ * NOT a reliable signal: the engine may decide on its own to background a
10
+ * subagent (feature-gated async-by-default agents, auto-background after a
11
+ * timeout, SendMessage resuming an idle agent). The tool RESULT is the single
12
+ * source of truth for "this call is now running in the background".
13
+ *
14
+ * Strings verified against the bundled CLI 0.3.191 and real session JSONL.
15
+ */
16
+ export declare const BACKGROUND_LAUNCH_MARKERS: readonly string[];
17
+ /**
18
+ * Tools whose results can legitimately BE a background-launch ack. Every other
19
+ * tool can only QUOTE the marker text — e.g. Read/Grep over this very file, or
20
+ * a test fixture — never produce it as a real launch confirmation. 'Task' is
21
+ * the pre-rename name of the 'Agent' tool (older bundled CLIs).
22
+ */
23
+ export declare const BACKGROUND_CAPABLE_TOOLS: ReadonlySet<string>;
24
+ /**
25
+ * A real launch ack carries its marker on the FIRST line of the result
26
+ * (verified against real session JSONL: agent/bash acks start with the marker;
27
+ * the SendMessage resume ack is single-line JSON). A file-read or grep result
28
+ * that merely CONTAINS the marker has it buried mid-content.
29
+ */
30
+ export declare function isBackgroundLaunchAck(content: string): boolean;
6
31
  export declare class BackgroundTaskTracker {
7
- private pendingCount;
32
+ private pendingIds;
33
+ /** tool_use_id → tool name, recorded for every call — consulted on the
34
+ * result side to reject ack lookalikes from tools that cannot background. */
35
+ private toolNames;
8
36
  private _mainResponseEnded;
9
37
  private onChange?;
10
38
  constructor(onChange?: BackgroundTaskChangeCallback);
11
- trackToolUse(input: unknown): void;
12
- trackTaskDone(): void;
39
+ /** Request-side registration: the model explicitly asked for background. */
40
+ trackToolUse(toolUseId: string, input: unknown, toolName?: string): void;
41
+ /**
42
+ * Response-side registration/resolution — the authoritative signal.
43
+ *
44
+ * - Result carries a background-launch ack → the call IS a background task,
45
+ * regardless of what the request said. Register (idempotent). Only tools
46
+ * that can actually background are eligible — a Read/Grep result quoting
47
+ * the marker text (source files, test fixtures, docs) must not register.
48
+ * Unknown names stay eligible (fail-open): tool_use always precedes
49
+ * tool_result on every feed, so a miss means a real ack, not a quote.
50
+ * - Result carries anything else for an id we thought was backgrounded →
51
+ * the call resolved synchronously after all (launch failure, foreground
52
+ * completion). Unregister so the turn does not wait for a notification
53
+ * that will never come.
54
+ */
55
+ trackToolResult(toolUseId: string, content: string): void;
56
+ /** SDK-engine stream signal: system/task_started announces every background launch. */
57
+ trackTaskStarted(toolUseId?: string): void;
58
+ trackTaskDone(toolUseId?: string): void;
59
+ hasPending(toolUseId: string): boolean;
13
60
  markMainEnded(): void;
14
61
  get mainResponseEnded(): boolean;
15
62
  get isWaiting(): boolean;
16
63
  get isFullyDone(): boolean;
17
64
  get pending(): number;
65
+ get pendingToolUseIds(): ReadonlySet<string>;
18
66
  private notify;
19
67
  }
20
68
  //# sourceMappingURL=backgroundTaskTracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundTaskTracker.d.ts","sourceRoot":"","sources":["../../src/utils/backgroundTaskTracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,4BAA4B,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAEhF,qBAAa,qBAAqB;IAChC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,CAA+B;gBAEpC,QAAQ,CAAC,EAAE,4BAA4B;IAInD,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAWlC,aAAa,IAAI,IAAI;IAKrB,aAAa,IAAI,IAAI;IAKrB,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,OAAO,CAAC,MAAM;CAGf"}
1
+ {"version":3,"file":"backgroundTaskTracker.d.ts","sourceRoot":"","sources":["../../src/utils/backgroundTaskTracker.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,4BAA4B,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAEhF;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAatD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAMvD,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAK9D;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,UAAU,CAAqB;IACvC;kFAC8E;IAC9E,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,CAA+B;gBAEpC,QAAQ,CAAC,EAAE,4BAA4B;IAInD,4EAA4E;IAC5E,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAcxE;;;;;;;;;;;;;OAaG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAczD,uFAAuF;IACvF,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ1C,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAWvC,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,aAAa,IAAI,IAAI;IAKrB,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,iBAAiB,IAAI,WAAW,CAAC,MAAM,CAAC,CAE3C;IAED,OAAO,CAAC,MAAM;CAGf"}
@@ -1,22 +1,127 @@
1
+ /**
2
+ * Launch acknowledgements the engine writes into a tool_result when the call
3
+ * turned into a background task. The request-side `run_in_background` flag is
4
+ * NOT a reliable signal: the engine may decide on its own to background a
5
+ * subagent (feature-gated async-by-default agents, auto-background after a
6
+ * timeout, SendMessage resuming an idle agent). The tool RESULT is the single
7
+ * source of truth for "this call is now running in the background".
8
+ *
9
+ * Strings verified against the bundled CLI 0.3.191 and real session JSONL.
10
+ */
11
+ export const BACKGROUND_LAUNCH_MARKERS = [
12
+ // Bash / PowerShell run_in_background launch ack
13
+ 'Command running in background with ID:',
14
+ // Interactive TUI: user pressed the background keybind mid-command (CLI engine mirror)
15
+ 'Command was manually backgrounded by user with ID:',
16
+ // Agent tool async launch — explicit flag, `background: true` frontmatter,
17
+ // or the engine's async-by-default feature gate
18
+ 'Async agent launched successfully',
19
+ // Agent tool with isolation: 'remote'
20
+ 'Cloud agent launched.',
21
+ // SendMessage re-engaging an idle background agent (produces a NEW
22
+ // task-notification bound to the SendMessage call's tool_use_id)
23
+ 'resumed from transcript in the background with your message',
24
+ ];
25
+ /**
26
+ * Tools whose results can legitimately BE a background-launch ack. Every other
27
+ * tool can only QUOTE the marker text — e.g. Read/Grep over this very file, or
28
+ * a test fixture — never produce it as a real launch confirmation. 'Task' is
29
+ * the pre-rename name of the 'Agent' tool (older bundled CLIs).
30
+ */
31
+ export const BACKGROUND_CAPABLE_TOOLS = new Set([
32
+ 'Bash',
33
+ 'PowerShell',
34
+ 'Agent',
35
+ 'Task',
36
+ 'SendMessage',
37
+ ]);
38
+ /**
39
+ * A real launch ack carries its marker on the FIRST line of the result
40
+ * (verified against real session JSONL: agent/bash acks start with the marker;
41
+ * the SendMessage resume ack is single-line JSON). A file-read or grep result
42
+ * that merely CONTAINS the marker has it buried mid-content.
43
+ */
44
+ export function isBackgroundLaunchAck(content) {
45
+ const trimmed = content.trimStart();
46
+ const nl = trimmed.indexOf('\n');
47
+ const firstLine = nl === -1 ? trimmed : trimmed.slice(0, nl);
48
+ return BACKGROUND_LAUNCH_MARKERS.some((m) => firstLine.includes(m));
49
+ }
1
50
  export class BackgroundTaskTracker {
2
- pendingCount = 0;
51
+ pendingIds = new Set();
52
+ /** tool_use_id → tool name, recorded for every call — consulted on the
53
+ * result side to reject ack lookalikes from tools that cannot background. */
54
+ toolNames = new Map();
3
55
  _mainResponseEnded = false;
4
56
  onChange;
5
57
  constructor(onChange) {
6
58
  this.onChange = onChange;
7
59
  }
8
- trackToolUse(input) {
60
+ /** Request-side registration: the model explicitly asked for background. */
61
+ trackToolUse(toolUseId, input, toolName) {
62
+ if (toolName)
63
+ this.toolNames.set(toolUseId, toolName);
9
64
  if (typeof input === 'object' &&
10
65
  input !== null &&
11
66
  input.run_in_background === true) {
12
- this.pendingCount++;
67
+ if (!this.pendingIds.has(toolUseId)) {
68
+ this.pendingIds.add(toolUseId);
69
+ this.notify();
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * Response-side registration/resolution — the authoritative signal.
75
+ *
76
+ * - Result carries a background-launch ack → the call IS a background task,
77
+ * regardless of what the request said. Register (idempotent). Only tools
78
+ * that can actually background are eligible — a Read/Grep result quoting
79
+ * the marker text (source files, test fixtures, docs) must not register.
80
+ * Unknown names stay eligible (fail-open): tool_use always precedes
81
+ * tool_result on every feed, so a miss means a real ack, not a quote.
82
+ * - Result carries anything else for an id we thought was backgrounded →
83
+ * the call resolved synchronously after all (launch failure, foreground
84
+ * completion). Unregister so the turn does not wait for a notification
85
+ * that will never come.
86
+ */
87
+ trackToolResult(toolUseId, content) {
88
+ const name = this.toolNames.get(toolUseId);
89
+ const ackEligible = name === undefined || BACKGROUND_CAPABLE_TOOLS.has(name);
90
+ if (ackEligible && isBackgroundLaunchAck(content)) {
91
+ if (!this.pendingIds.has(toolUseId)) {
92
+ this.pendingIds.add(toolUseId);
93
+ this.notify();
94
+ }
95
+ }
96
+ else if (this.pendingIds.has(toolUseId)) {
97
+ this.pendingIds.delete(toolUseId);
13
98
  this.notify();
14
99
  }
15
100
  }
16
- trackTaskDone() {
17
- this.pendingCount = Math.max(0, this.pendingCount - 1);
101
+ /** SDK-engine stream signal: system/task_started announces every background launch. */
102
+ trackTaskStarted(toolUseId) {
103
+ if (!toolUseId)
104
+ return;
105
+ if (!this.pendingIds.has(toolUseId)) {
106
+ this.pendingIds.add(toolUseId);
107
+ this.notify();
108
+ }
109
+ }
110
+ trackTaskDone(toolUseId) {
111
+ if (toolUseId) {
112
+ this.pendingIds.delete(toolUseId);
113
+ }
114
+ else if (this.pendingIds.size > 0) {
115
+ // Fallback: no id provided — remove one arbitrary entry (legacy compat)
116
+ const first = this.pendingIds.values().next().value;
117
+ if (first)
118
+ this.pendingIds.delete(first);
119
+ }
18
120
  this.notify();
19
121
  }
122
+ hasPending(toolUseId) {
123
+ return this.pendingIds.has(toolUseId);
124
+ }
20
125
  markMainEnded() {
21
126
  this._mainResponseEnded = true;
22
127
  this.notify();
@@ -25,16 +130,19 @@ export class BackgroundTaskTracker {
25
130
  return this._mainResponseEnded;
26
131
  }
27
132
  get isWaiting() {
28
- return this._mainResponseEnded && this.pendingCount > 0;
133
+ return this._mainResponseEnded && this.pendingIds.size > 0;
29
134
  }
30
135
  get isFullyDone() {
31
- return this._mainResponseEnded && this.pendingCount === 0;
136
+ return this._mainResponseEnded && this.pendingIds.size === 0;
32
137
  }
33
138
  get pending() {
34
- return this.pendingCount;
139
+ return this.pendingIds.size;
140
+ }
141
+ get pendingToolUseIds() {
142
+ return this.pendingIds;
35
143
  }
36
144
  notify() {
37
- this.onChange?.({ pending: this.pendingCount, waiting: this.isWaiting });
145
+ this.onChange?.({ pending: this.pendingIds.size, waiting: this.isWaiting });
38
146
  }
39
147
  }
40
148
  //# sourceMappingURL=backgroundTaskTracker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backgroundTaskTracker.js","sourceRoot":"","sources":["../../src/utils/backgroundTaskTracker.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,qBAAqB;IACxB,YAAY,GAAG,CAAC,CAAC;IACjB,kBAAkB,GAAG,KAAK,CAAC;IAC3B,QAAQ,CAAgC;IAEhD,YAAY,QAAuC;QACjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,YAAY,CAAC,KAAc;QACzB,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACb,KAAyC,CAAC,iBAAiB,KAAK,IAAI,EACrE,CAAC;YACD,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,aAAa;QACX,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,aAAa;QACX,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;CACF"}
1
+ {"version":3,"file":"backgroundTaskTracker.js","sourceRoot":"","sources":["../../src/utils/backgroundTaskTracker.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAsB;IAC1D,iDAAiD;IACjD,wCAAwC;IACxC,uFAAuF;IACvF,oDAAoD;IACpD,2EAA2E;IAC3E,gDAAgD;IAChD,mCAAmC;IACnC,sCAAsC;IACtC,uBAAuB;IACvB,mEAAmE;IACnE,iEAAiE;IACjE,6DAA6D;CAC9D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC;IACnE,MAAM;IACN,YAAY;IACZ,OAAO;IACP,MAAM;IACN,aAAa;CACd,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACpC,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,OAAO,qBAAqB;IACxB,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC;kFAC8E;IACtE,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,kBAAkB,GAAG,KAAK,CAAC;IAC3B,QAAQ,CAAgC;IAEhD,YAAY,QAAuC;QACjD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,4EAA4E;IAC5E,YAAY,CAAC,SAAiB,EAAE,KAAc,EAAE,QAAiB;QAC/D,IAAI,QAAQ;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtD,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,KAAK,IAAI;YACb,KAAyC,CAAC,iBAAiB,KAAK,IAAI,EACrE,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,eAAe,CAAC,SAAiB,EAAE,OAAe;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAI,KAAK,SAAS,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAI,WAAW,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,gBAAgB,CAAC,SAAkB;QACjC,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,aAAa,CAAC,SAAkB;QAC9B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpC,wEAAwE;YACxE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACpD,IAAI,KAAK;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,aAAa;QACX,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { PermissionResult } from '@anthropic-ai/claude-agent-sdk';
2
+ /**
3
+ * Hammoc invariant: an `end_turn` signal must mean "every piece of work this turn
4
+ * started is finished". A tool-level `run_in_background: true` Bash call breaks
5
+ * that — the shell detaches, the turn ends while the process is still running, and
6
+ * the eventual completion notification has no open turn to land in. The fallout is
7
+ * the same in every engine: queue/chain advance to the next item too early, the
8
+ * session shows "done" while work is still live, and "완료" notifications fire
9
+ * prematurely. SDK and CLI engines diverge on how (or whether) they cope, so rather
10
+ * than rely on per-engine grace timers we forbid the background flag outright at the
11
+ * shared permission gate — keeping `end_turn = done` true for both engines.
12
+ *
13
+ * Long-lived processes (dev servers, test launchers) are still possible: detach them
14
+ * at the OS level (`Start-Process` on Windows, `nohup … &` elsewhere) so the shell
15
+ * call returns immediately and is never tracked as a pending turn task, then manage
16
+ * them by PID. That path does NOT set the tool flag, so it falls through this guard.
17
+ *
18
+ * Returns a deny `PermissionResult` when the call must be blocked, or `null` to let
19
+ * the normal permission flow continue. Intentionally narrow: only the `Bash` tool's
20
+ * background flag is blocked — background sub-agents (Task/Agent) are out of scope.
21
+ *
22
+ * Placed at the very TOP of every `canUseTool` (before bypass auto-approve branches)
23
+ * so the block holds across all permission modes that route through the callback.
24
+ */
25
+ export declare function denyBackgroundBash(toolName: string, input: unknown): PermissionResult | null;
26
+ //# sourceMappingURL=backgroundToolGuard.d.ts.map