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
@@ -5,7 +5,10 @@
5
5
  * accumulates its `claudeAiOauth` credential block here keyed by account email (or an
6
6
  * `account:<hash>` fallback when the email is unavailable — AC1a). Switching writes the
7
7
  * chosen account's credential back to the single-account `~/.claude/.credentials.json`
8
- * the CLI binary reads (it has no `--profile` flag — see Dev Notes › CLI Credential Path).
8
+ * the CLI binary reads (it has no `--profile` flag — see Dev Notes › CLI Credential Path),
9
+ * AND swaps the CLI's on-disk identity cache (`oauthAccount` in `~/.claude.json`) — the CLI
10
+ * reports the logged-in identity from that cache, not from the credential file, so a
11
+ * credential-only swap leaves every identity readout on the previous login.
9
12
  *
10
13
  * Follows the `preferencesService` JSON-file pattern (`~/.hammoc/*.json`) and the
11
14
  * `rateLimitProbeService` credential-read path. Token material never leaves this layer:
@@ -27,6 +30,7 @@ declare class AccountStorageService {
27
30
  private getDataDir;
28
31
  private getStorePath;
29
32
  private getCredentialsPath;
33
+ private getClaudeConfigPath;
30
34
  /** Read the store, returning an empty store when the file is absent/unreadable. */
31
35
  private readStore;
32
36
  /** Write the store as pretty JSON, then harden file permissions (AC13). */
@@ -80,14 +84,10 @@ declare class AccountStorageService {
80
84
  account: StoredAccount;
81
85
  } | null>;
82
86
  /**
83
- * Switch the active account (AC9, AC10, AC11, AC12). Writes the stored credential to
84
- * `~/.claude/.credentials.json` atomically (temp + rename) so concurrent CLI readers never
85
- * see a partial file, then updates the active marker and `lastUsedAt`. Running CLI sessions
86
- * are untouched only NEW sessions pick up the switched credential (AC11).
87
- *
88
- * Expiry (AC12) is detected by `expiresAt < Date.now()` — NO custom OAuth refresh call in
89
- * Phase 1 (Dev Notes › Token Refresh). When expired, the switch still completes and
90
- * `reauthRequired` is true so the client can offer the BS-7 re-login flow.
87
+ * Switch the active account (AC9, AC10, AC11, AC12). If the stored access token is expired
88
+ * but a refresh token is available, automatically obtains a fresh access token via the OAuth
89
+ * token endpoint before writing the credential file. Falls back to reauthRequired when the
90
+ * refresh itself fails (e.g., refresh token revoked).
91
91
  */
92
92
  switchAccount(key: string): Promise<{
93
93
  switched: true;
@@ -105,6 +105,52 @@ declare class AccountStorageService {
105
105
  * email or no active account exists. Returns the (possibly new) active key.
106
106
  */
107
107
  backfillActiveEmail(email: string): Promise<string | null>;
108
+ /**
109
+ * Re-read the credential file and update the CURRENT active account's stored entry.
110
+ * The CLI binary refreshes the active token continuously (accessToken + possibly rotated
111
+ * refreshToken), but accounts.json still holds the snapshot from original login. This
112
+ * method syncs the store with the live file so the stored copy is always up-to-date
113
+ * before the credential file is overwritten by a switch or a new login.
114
+ */
115
+ private resnapshotActiveCredentialInStore;
116
+ /**
117
+ * Public convenience: re-snapshot the active credential AND persist immediately.
118
+ * Called before a login PTY overwrites the credential file with a new account.
119
+ */
120
+ resnapshotAndSave(): Promise<void>;
121
+ /**
122
+ * Exchange a refresh token for a fresh access token via the Claude OAuth endpoint.
123
+ * Returns the updated credential on success, or null on failure (caller falls back to
124
+ * reauthRequired). The returned credential preserves all original fields and only updates
125
+ * accessToken, expiresAt, and (if rotated) refreshToken — matching the CLI's own refresh logic.
126
+ */
127
+ private refreshCredential;
128
+ /**
129
+ * Read the CLI's cached identity block, or null when absent/unreadable. This is the value the
130
+ * CLI reports as the logged-in account (email/organization) on every launch — it is written at
131
+ * login (and on profile re-fetch), NOT derived from the credential file per launch.
132
+ */
133
+ readCliIdentity(): Promise<Record<string, unknown> | null>;
134
+ /**
135
+ * Patch ONLY the `oauthAccount` field of `~/.claude.json` (set when `identity` is given,
136
+ * delete when null), preserving every other field byte-for-value. Atomic write (temp +
137
+ * rename) so a concurrently launching CLI never reads a partial config. Best-effort:
138
+ * failures are logged and never block the credential switch itself. The config file is
139
+ * never CREATED here — a missing/corrupt file carries per-project state (trust prompts
140
+ * etc.) we must not fabricate, and the CLI regenerates identity on its own anyway.
141
+ */
142
+ writeCliIdentity(identity: Record<string, unknown> | null): Promise<boolean>;
143
+ /** Drop the CLI identity cache (logout: no login should be reported afterwards). */
144
+ clearCliIdentity(): Promise<void>;
145
+ /**
146
+ * Re-assert the ACTIVE account's identity into the CLI cache. Used as self-healing when a
147
+ * stale identity readout is detected (e.g. a CLI child that outlived a switch flushed its
148
+ * in-memory config back over our patch). Falls back to dropping the cache when the active
149
+ * account has no captured identity, so the CLI regenerates it from the live token.
150
+ */
151
+ reassertActiveCliIdentity(): Promise<void>;
152
+ /** Whether an active credential file with a usable token exists on disk. */
153
+ hasActiveCredential(): Promise<boolean>;
108
154
  /** Read & parse `~/.claude/.credentials.json` into a credential block, or null. */
109
155
  private readActiveCredential;
110
156
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"accountStorageService.d.ts","sourceRoot":"","sources":["../../src/services/accountStorageService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAKxB,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAID,cAAM,qBAAqB;IACzB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,kBAAkB;IAI1B,mFAAmF;YACrE,SAAS;IAcvB,2EAA2E;YAC7D,UAAU;IAQxB;;;;;OAKG;YACW,qBAAqB;IAYnC,mFAAmF;IACnF,OAAO,CAAC,gBAAgB;IA2BxB,iFAAiF;IACjF,OAAO,CAAC,WAAW;IAMnB,2EAA2E;IAC3E,OAAO,CAAC,SAAS;IAajB,2EAA2E;IACrE,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAO/C,2FAA2F;IACrF,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI5C,uFAAuF;IACjF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;;;;OAKG;IACG,aAAa,CACjB,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC;IAmBnD;;;OAGG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;KAAE,CAAC;IAShG;;;;;;OAMG;IACG,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GAAG,IAAI,CAAC;IAa5G;;;;;;;;;OASG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACrC;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GACnE;QAAE,QAAQ,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAC3C;IAiBD;;;;;;OAMG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsBhE,mFAAmF;YACrE,oBAAoB;IAYlC;;;;OAIG;YACW,yBAAyB;CAgBxC;AAED,eAAO,MAAM,qBAAqB,uBAA8B,CAAC"}
1
+ {"version":3,"file":"accountStorageService.d.ts","sourceRoot":"","sources":["../../src/services/accountStorageService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,KAAK,EAEV,aAAa,EACb,cAAc,EACd,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AAUxB,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4EAA4E;IAC5E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAID,cAAM,qBAAqB;IACzB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,mBAAmB;IAI3B,mFAAmF;YACrE,SAAS;IAcvB,2EAA2E;YAC7D,UAAU;IAQxB;;;;;OAKG;YACW,qBAAqB;IAYnC,mFAAmF;IACnF,OAAO,CAAC,gBAAgB;IA+BxB,iFAAiF;IACjF,OAAO,CAAC,WAAW;IAMnB,2EAA2E;IAC3E,OAAO,CAAC,SAAS;IAajB,2EAA2E;IACrE,YAAY,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAO/C,2FAA2F;IACrF,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI5C,uFAAuF;IACjF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD;;;;;OAKG;IACG,aAAa,CACjB,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,CAAC;IAmBnD;;;OAGG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAA;KAAE,CAAC;IAShG;;;;;;OAMG;IACG,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GAAG,IAAI,CAAC;IA+B5G;;;;;OAKG;IACG,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CACrC;QAAE,QAAQ,EAAE,IAAI,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,aAAa,CAAA;KAAE,GACnE;QAAE,QAAQ,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE,CAC3C;IAgDD;;;;;;OAMG;IACG,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAoBhE;;;;;;OAMG;YACW,iCAAiC;IAwB/C;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQxC;;;;;OAKG;YACW,iBAAiB;IA2D/B;;;;OAIG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAchE;;;;;;;OAOG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BlF,oFAAoF;IAC9E,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvC;;;;;OAKG;IACG,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhD,4EAA4E;IACtE,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC;IAM7C,mFAAmF;YACrE,oBAAoB;IAYlC;;;;OAIG;YACW,yBAAyB;CAgBxC;AAED,eAAO,MAAM,qBAAqB,uBAA8B,CAAC"}
@@ -5,7 +5,10 @@
5
5
  * accumulates its `claudeAiOauth` credential block here keyed by account email (or an
6
6
  * `account:<hash>` fallback when the email is unavailable — AC1a). Switching writes the
7
7
  * chosen account's credential back to the single-account `~/.claude/.credentials.json`
8
- * the CLI binary reads (it has no `--profile` flag — see Dev Notes › CLI Credential Path).
8
+ * the CLI binary reads (it has no `--profile` flag — see Dev Notes › CLI Credential Path),
9
+ * AND swaps the CLI's on-disk identity cache (`oauthAccount` in `~/.claude.json`) — the CLI
10
+ * reports the logged-in identity from that cache, not from the credential file, so a
11
+ * credential-only swap leaves every identity readout on the previous login.
9
12
  *
10
13
  * Follows the `preferencesService` JSON-file pattern (`~/.hammoc/*.json`) and the
11
14
  * `rateLimitProbeService` credential-read path. Token material never leaves this layer:
@@ -22,6 +25,10 @@ import { createHash } from 'node:crypto';
22
25
  import { spawn } from 'node:child_process';
23
26
  import { createLogger } from '../utils/logger.js';
24
27
  const log = createLogger('accountStorageService');
28
+ // Claude Code OAuth constants (extracted from the bundled SDK binary).
29
+ const OAUTH_TOKEN_URL = 'https://platform.claude.com/v1/oauth/token';
30
+ const OAUTH_CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
31
+ const OAUTH_REFRESH_TIMEOUT_MS = 10_000;
25
32
  const EMPTY_STORE = { activeKey: null, accounts: {} };
26
33
  class AccountStorageService {
27
34
  getDataDir() {
@@ -33,6 +40,9 @@ class AccountStorageService {
33
40
  getCredentialsPath() {
34
41
  return path.join(os.homedir(), '.claude', '.credentials.json');
35
42
  }
43
+ getClaudeConfigPath() {
44
+ return path.join(os.homedir(), '.claude.json');
45
+ }
36
46
  /** Read the store, returning an empty store when the file is absent/unreadable. */
37
47
  async readStore() {
38
48
  try {
@@ -84,7 +94,11 @@ class AccountStorageService {
84
94
  return;
85
95
  }
86
96
  try {
87
- const child = spawn('icacls', [filePath, '/inheritance:r', '/grant:r', `${user}:F`], {
97
+ // Use the absolute path: the server's PATH may not include System32, so a bare `icacls`
98
+ // spawn fails with ENOENT and silently skips the hardening (observed on this host).
99
+ const systemRoot = process.env.SystemRoot || process.env.windir || 'C:\\Windows';
100
+ const icaclsPath = path.join(systemRoot, 'System32', 'icacls.exe');
101
+ const child = spawn(icaclsPath, [filePath, '/inheritance:r', '/grant:r', `${user}:F`], {
88
102
  windowsHide: true,
89
103
  });
90
104
  child.on('error', (err) => {
@@ -189,30 +203,74 @@ class AccountStorageService {
189
203
  const tier = credential.claudeAiOauth?.subscriptionType ?? null;
190
204
  const result = await this.upsertAccount(credential, { email, tier });
191
205
  await this.setActiveKey(result.key);
206
+ // The login PTY also rewrote the CLI's identity cache (`oauthAccount` in `~/.claude.json`).
207
+ // Capture it alongside the credential — a later switch back to this account must restore it,
208
+ // or the CLI keeps reporting the identity of whoever logged in last. Only attach when the
209
+ // cached identity provably belongs to this login (emailAddress match): the config write and
210
+ // the credential write are separate steps in the CLI, so an unmatched value could still be
211
+ // the previous account's.
212
+ if (email) {
213
+ const identity = await this.readCliIdentity();
214
+ if (identity && identity.emailAddress === email) {
215
+ const store = await this.readStore();
216
+ const entry = store.accounts[result.key];
217
+ if (entry) {
218
+ entry.identity = identity;
219
+ await this.writeStore(store);
220
+ result.account.identity = identity;
221
+ }
222
+ }
223
+ }
192
224
  log.info(`captured credential for account key=${result.key} (tier=${tier ?? 'unknown'})`);
193
225
  return result;
194
226
  }
195
227
  /**
196
- * Switch the active account (AC9, AC10, AC11, AC12). Writes the stored credential to
197
- * `~/.claude/.credentials.json` atomically (temp + rename) so concurrent CLI readers never
198
- * see a partial file, then updates the active marker and `lastUsedAt`. Running CLI sessions
199
- * are untouched only NEW sessions pick up the switched credential (AC11).
200
- *
201
- * Expiry (AC12) is detected by `expiresAt < Date.now()` — NO custom OAuth refresh call in
202
- * Phase 1 (Dev Notes › Token Refresh). When expired, the switch still completes and
203
- * `reauthRequired` is true so the client can offer the BS-7 re-login flow.
228
+ * Switch the active account (AC9, AC10, AC11, AC12). If the stored access token is expired
229
+ * but a refresh token is available, automatically obtains a fresh access token via the OAuth
230
+ * token endpoint before writing the credential file. Falls back to reauthRequired when the
231
+ * refresh itself fails (e.g., refresh token revoked).
204
232
  */
205
233
  async switchAccount(key) {
206
234
  const store = await this.readStore();
207
235
  const account = store.accounts[key];
208
236
  if (!account)
209
237
  return { switched: false, reason: 'not-found' };
238
+ // Before overwriting the credential file, snapshot the CURRENT active credential back into
239
+ // the store. The CLI binary continuously refreshes the active token (new accessToken +
240
+ // potentially rotated refreshToken), but accounts.json still holds the copy from the
241
+ // original login. Without this, switching away from A and then back writes the stale original
242
+ // token — whose refreshToken may have been rotated and revoked.
243
+ await this.resnapshotActiveCredentialInStore(store);
244
+ const expiresAt = account.credential.claudeAiOauth?.expiresAt;
245
+ const expired = typeof expiresAt === 'number' && expiresAt < Date.now();
246
+ let reauthRequired = false;
247
+ if (expired) {
248
+ const refreshed = await this.refreshCredential(account.credential);
249
+ if (refreshed) {
250
+ account.credential = refreshed;
251
+ account.tier = refreshed.claudeAiOauth?.subscriptionType ?? account.tier;
252
+ log.info(`refreshed expired token for account key=${key}`);
253
+ }
254
+ else {
255
+ reauthRequired = true;
256
+ }
257
+ }
210
258
  await this.writeCredentialFileAtomic(account.credential);
259
+ // Swap the CLI's identity cache together with the credential. The CLI reports "who is
260
+ // logged in" from `oauthAccount` in `~/.claude.json` (verified: a fresh bootstrap after a
261
+ // credential-only swap still returns the previous login), so leaving it behind makes every
262
+ // subsequent identity readout — settings card refresh, session-context email — show the old
263
+ // account. With no captured identity, drop the field: the CLI re-fetches the profile from
264
+ // the API on its next launch and rewrites the cache for the live token (verified).
265
+ if (account.identity) {
266
+ await this.writeCliIdentity(account.identity);
267
+ }
268
+ else {
269
+ await this.writeCliIdentity(null);
270
+ }
211
271
  account.lastUsedAt = Date.now();
212
272
  store.activeKey = key;
213
273
  await this.writeStore(store);
214
- const expiresAt = account.credential.claudeAiOauth?.expiresAt;
215
- const reauthRequired = typeof expiresAt === 'number' && expiresAt < Date.now();
216
274
  return { switched: true, reauthRequired, account };
217
275
  }
218
276
  /**
@@ -243,6 +301,180 @@ class AccountStorageService {
243
301
  log.info(`back-filled email for account: ${oldKey} → ${email}`);
244
302
  return store.activeKey;
245
303
  }
304
+ /**
305
+ * Re-read the credential file and update the CURRENT active account's stored entry.
306
+ * The CLI binary refreshes the active token continuously (accessToken + possibly rotated
307
+ * refreshToken), but accounts.json still holds the snapshot from original login. This
308
+ * method syncs the store with the live file so the stored copy is always up-to-date
309
+ * before the credential file is overwritten by a switch or a new login.
310
+ */
311
+ async resnapshotActiveCredentialInStore(store) {
312
+ const currentKey = store.activeKey;
313
+ if (!currentKey)
314
+ return;
315
+ const currentAccount = store.accounts[currentKey];
316
+ if (!currentAccount)
317
+ return;
318
+ const live = await this.readActiveCredential();
319
+ if (!live)
320
+ return;
321
+ currentAccount.credential = live;
322
+ const tier = live.claudeAiOauth?.subscriptionType;
323
+ if (tier)
324
+ currentAccount.tier = tier;
325
+ // Also re-snapshot the CLI identity cache when it belongs to this account. This is how
326
+ // legacy entries (captured before the identity field existed) converge: once the CLI has
327
+ // regenerated `oauthAccount` for this account, switching away stores it, and every later
328
+ // switch back can restore it directly instead of relying on regeneration.
329
+ const identity = await this.readCliIdentity();
330
+ if (identity && currentAccount.email && identity.emailAddress === currentAccount.email) {
331
+ currentAccount.identity = identity;
332
+ }
333
+ // No writeStore here — the caller (switchAccount) writes after updating the target too.
334
+ }
335
+ /**
336
+ * Public convenience: re-snapshot the active credential AND persist immediately.
337
+ * Called before a login PTY overwrites the credential file with a new account.
338
+ */
339
+ async resnapshotAndSave() {
340
+ const store = await this.readStore();
341
+ await this.resnapshotActiveCredentialInStore(store);
342
+ await this.writeStore(store);
343
+ }
344
+ // ── OAuth token refresh ──
345
+ /**
346
+ * Exchange a refresh token for a fresh access token via the Claude OAuth endpoint.
347
+ * Returns the updated credential on success, or null on failure (caller falls back to
348
+ * reauthRequired). The returned credential preserves all original fields and only updates
349
+ * accessToken, expiresAt, and (if rotated) refreshToken — matching the CLI's own refresh logic.
350
+ */
351
+ async refreshCredential(credential) {
352
+ const oauth = credential.claudeAiOauth;
353
+ const refreshToken = oauth?.refreshToken;
354
+ if (!refreshToken) {
355
+ log.warn('refreshCredential: no refresh_token available');
356
+ return null;
357
+ }
358
+ try {
359
+ const res = await fetch(OAUTH_TOKEN_URL, {
360
+ method: 'POST',
361
+ headers: {
362
+ 'Content-Type': 'application/json',
363
+ 'anthropic-beta': 'oauth-2025-04-20',
364
+ },
365
+ body: JSON.stringify({
366
+ grant_type: 'refresh_token',
367
+ refresh_token: refreshToken,
368
+ client_id: OAUTH_CLIENT_ID,
369
+ }),
370
+ signal: AbortSignal.timeout(OAUTH_REFRESH_TIMEOUT_MS),
371
+ });
372
+ if (!res.ok) {
373
+ const body = await res.text().catch(() => '');
374
+ log.warn(`refreshCredential: token endpoint returned ${res.status}: ${body.slice(0, 200)}`);
375
+ return null;
376
+ }
377
+ const data = await res.json();
378
+ if (!data.access_token) {
379
+ log.warn('refreshCredential: response missing access_token');
380
+ return null;
381
+ }
382
+ const expiresAt = typeof data.expires_in === 'number'
383
+ ? Date.now() + data.expires_in * 1000
384
+ : undefined;
385
+ return {
386
+ claudeAiOauth: {
387
+ ...oauth,
388
+ accessToken: data.access_token,
389
+ refreshToken: data.refresh_token || refreshToken,
390
+ ...(expiresAt !== undefined ? { expiresAt } : {}),
391
+ },
392
+ };
393
+ }
394
+ catch (err) {
395
+ log.warn(`refreshCredential: ${err instanceof Error ? err.message : String(err)}`);
396
+ return null;
397
+ }
398
+ }
399
+ // ── CLI identity cache I/O (`oauthAccount` in `~/.claude.json`) ──
400
+ /**
401
+ * Read the CLI's cached identity block, or null when absent/unreadable. This is the value the
402
+ * CLI reports as the logged-in account (email/organization) on every launch — it is written at
403
+ * login (and on profile re-fetch), NOT derived from the credential file per launch.
404
+ */
405
+ async readCliIdentity() {
406
+ try {
407
+ const raw = await fs.readFile(this.getClaudeConfigPath(), 'utf-8');
408
+ const config = JSON.parse(raw);
409
+ const identity = config.oauthAccount;
410
+ if (identity && typeof identity === 'object' && !Array.isArray(identity)) {
411
+ return identity;
412
+ }
413
+ return null;
414
+ }
415
+ catch {
416
+ return null;
417
+ }
418
+ }
419
+ /**
420
+ * Patch ONLY the `oauthAccount` field of `~/.claude.json` (set when `identity` is given,
421
+ * delete when null), preserving every other field byte-for-value. Atomic write (temp +
422
+ * rename) so a concurrently launching CLI never reads a partial config. Best-effort:
423
+ * failures are logged and never block the credential switch itself. The config file is
424
+ * never CREATED here — a missing/corrupt file carries per-project state (trust prompts
425
+ * etc.) we must not fabricate, and the CLI regenerates identity on its own anyway.
426
+ */
427
+ async writeCliIdentity(identity) {
428
+ const configPath = this.getClaudeConfigPath();
429
+ try {
430
+ const raw = await fs.readFile(configPath, 'utf-8');
431
+ const config = JSON.parse(raw);
432
+ if (identity) {
433
+ config.oauthAccount = identity;
434
+ }
435
+ else {
436
+ delete config.oauthAccount;
437
+ }
438
+ const tmp = `${configPath}.tmp-${process.pid}`;
439
+ await fs.writeFile(tmp, JSON.stringify(config, null, 2), 'utf-8');
440
+ try {
441
+ await fs.rename(tmp, configPath);
442
+ }
443
+ catch (err) {
444
+ await fs.rm(tmp, { force: true }).catch(() => { });
445
+ throw err;
446
+ }
447
+ log.info(identity
448
+ ? `CLI identity cache set to ${String(identity.emailAddress ?? '(no email)')}`
449
+ : 'CLI identity cache dropped (CLI will re-derive from the live token)');
450
+ return true;
451
+ }
452
+ catch (err) {
453
+ log.warn(`writeCliIdentity failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
454
+ return false;
455
+ }
456
+ }
457
+ /** Drop the CLI identity cache (logout: no login should be reported afterwards). */
458
+ async clearCliIdentity() {
459
+ await this.writeCliIdentity(null);
460
+ }
461
+ /**
462
+ * Re-assert the ACTIVE account's identity into the CLI cache. Used as self-healing when a
463
+ * stale identity readout is detected (e.g. a CLI child that outlived a switch flushed its
464
+ * in-memory config back over our patch). Falls back to dropping the cache when the active
465
+ * account has no captured identity, so the CLI regenerates it from the live token.
466
+ */
467
+ async reassertActiveCliIdentity() {
468
+ const store = await this.readStore();
469
+ const active = store.activeKey ? store.accounts[store.activeKey] : null;
470
+ if (!active)
471
+ return;
472
+ await this.writeCliIdentity(active.identity ?? null);
473
+ }
474
+ /** Whether an active credential file with a usable token exists on disk. */
475
+ async hasActiveCredential() {
476
+ return (await this.readActiveCredential()) !== null;
477
+ }
246
478
  // ── Credential file I/O ──
247
479
  /** Read & parse `~/.claude/.credentials.json` into a credential block, or null. */
248
480
  async readActiveCredential() {
@@ -1 +1 @@
1
- {"version":3,"file":"accountStorageService.js","sourceRoot":"","sources":["../../src/services/accountStorageService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accountStorageService.js","sourceRoot":"","sources":["../../src/services/accountStorageService.ts"],"names":[],"mappings":"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"}
@@ -12,9 +12,14 @@ import type { BackgroundTaskTracker } from '../utils/backgroundTaskTracker.js';
12
12
  *
13
13
  * This interface intentionally contains only the members the two call sites actually
14
14
  * invoke on the engine instance (verified by grep, see Story 32.2 "외부 표면
15
- * enumeration"). Abort is *not* a member: cancellation flows through
16
- * `ChatOptions.abortController` (an engine-independent signal), so no `interrupt()`
17
- * is needed here.
15
+ * enumeration"). A hard *abort* (kill the whole turn/process) flows through
16
+ * `ChatOptions.abortController` (an engine-independent signal) the CLI engine wires
17
+ * it to a PTY Ctrl+C. Story 38.3 adds an OPTIONAL, engine-specific `interrupt()`
18
+ * (stop only the current turn's generation, keep the persistent session alive) and
19
+ * `close()` (explicit session teardown). These are OPTIONAL: only the SDK engine — whose
20
+ * persistent stream (Epic 38) keeps a control channel open across the result — exposes
21
+ * them; the CLI engine cancels via the abortController signal instead, so it does not
22
+ * implement them and callers must feature-detect (`engine.interrupt?.()`).
18
23
  *
19
24
  * It lives server-side (not in `@hammoc/shared`) because `canUseTool` is typed with
20
25
  * the SDK's `CanUseTool`; shared must stay SDK-independent. The server already
@@ -26,6 +31,16 @@ import type { BackgroundTaskTracker } from '../utils/backgroundTaskTracker.js';
26
31
  export interface ChatEngine {
27
32
  /** Warning message from a non-fatal rewind failure; read by the caller after a send. */
28
33
  rewindWarning: string | null;
34
+ /**
35
+ * Whether the LAST turn ended via tracker-hold grace EXPIRY (SDK engine's
36
+ * dual-gate turn boundary, 2026-07-12). The expiry path abandons a parked read
37
+ * on the engine's shared session iterator — a resident engine kept alive past
38
+ * that would deliver the NEXT turn's first message to the dead read (message
39
+ * theft) and could run a late follow-up invisibly. The residency
40
+ * reconciliation reads this after a send and evicts the engine when set.
41
+ * Optional: the CLI engine never sets it (no shared-iterator turns).
42
+ */
43
+ lastTurnTrackerHoldExpired?: boolean;
29
44
  /**
30
45
  * Send a message and stream events back through the provided callbacks.
31
46
  * Cancellation is delivered via `options.abortController`.
@@ -61,10 +76,51 @@ export interface ChatEngine {
61
76
  backgroundTracker?: BackgroundTaskTracker,
62
77
  /** Notification when CLI engine syncs permission mode (EnterPlanMode in sync mode). */
63
78
  onPermissionModeSync?: (mode: PermissionMode) => void): Promise<ChatResponse>;
79
+ /**
80
+ * Story 38.3 — turn-only interrupt: stop the CURRENT turn's generation but keep
81
+ * the persistent session/generator alive (a subsequent send resumes on the same
82
+ * stream). SDK engine only; the CLI engine omits this and cancels via the
83
+ * abortController signal, so callers MUST feature-detect (`engine.interrupt?.()`).
84
+ * The interrupted turn ends with an error result rather than a thrown abort.
85
+ */
86
+ interrupt?(): Promise<void>;
87
+ /**
88
+ * Story 38.3 — explicit session teardown (the "abort" verb): end the prompt queue
89
+ * and close the persistent query. SDK engine only; idempotent. The CLI engine omits
90
+ * this (its teardown runs off the abortController signal). Higher-level session
91
+ * lifecycle (idle residency, resume/fork) is Story 38.5.
92
+ */
93
+ close?(): Promise<void>;
64
94
  /** Update the permission mode mid-conversation (propagates to the live query). */
65
95
  setPermissionMode(mode: PermissionMode): Promise<void>;
96
+ /**
97
+ * Story 38.4 — runtime model switch: change the model used for subsequent
98
+ * responses on the LIVE persistent query, without recreating it (no ~3s
99
+ * process restart). OPTIONAL, same pattern as `interrupt?()`/`close?()`: only
100
+ * the SDK engine — whose persistent stream keeps the control channel open —
101
+ * implements it (probe-confirmed GO: the next turn answers with the new
102
+ * model). The CLI engine omits it (model changes ride the next spawn payload),
103
+ * so callers MUST feature-detect (`engine.setModel?.()`). No-op before the
104
+ * first send (the model is then picked up from the creation options instead).
105
+ */
106
+ setModel?(model: string | undefined): Promise<void>;
66
107
  /** Read the current permission mode (used by permission-gating call-site logic). */
67
108
  getPermissionMode(): PermissionMode;
109
+ /**
110
+ * Story 38.5 (Task 2) — opt this engine into cross-turn process residency. When
111
+ * set, the engine does NOT tear its persistent stream down at turn end; the
112
+ * residency registry owns its lifecycle (idle timeout / LRU eviction / crash
113
+ * cleanup). OPTIONAL, SDK-engine-only (same feature-detect pattern as
114
+ * `interrupt?()`/`close?()`/`setModel?()`); the CLI engine omits it.
115
+ */
116
+ setResident?(resident: boolean): void;
117
+ /**
118
+ * Story 38.5 (Task 2) — whether a persistent query is currently live. The
119
+ * residency registry reads this to detect an engine that was torn down out of
120
+ * band (crash / external close) so it can evict the dead entry and let the next
121
+ * send resume from JSONL. OPTIONAL, SDK-engine-only.
122
+ */
123
+ isLive?(): boolean;
68
124
  /**
69
125
  * Standalone file rewind (no message send): rewind project files to the
70
126
  * checkpoint at `messageUuid` for `sessionId`. `dryRun` previews without writing.
@@ -1 +1 @@
1
- {"version":3,"file":"chatEngine.d.ts","sourceRoot":"","sources":["../../src/services/chatEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,UAAU;IACzB,wFAAwF;IACxF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B;;;;;;;;;OASG;IACH,wBAAwB,CACtB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE,WAAW,EACrB,UAAU,CAAC,EAAE,UAAU,EACvB,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,EAC5C,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI;IACzG;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,IAAI,KAAK,IAAI;IACxE;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IACvC,qGAAqG;IACrG,qBAAqB,CAAC,EAAE,MAAM;IAC9B,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,qBAAqB;IACzC,uFAAuF;IACvF,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GACpD,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB,kFAAkF;IAClF,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD,oFAAoF;IACpF,iBAAiB,IAAI,cAAc,CAAC;IAEpC;;;;;;OAMG;IACH,WAAW,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/G"}
1
+ {"version":3,"file":"chatEngine.d.ts","sourceRoot":"","sources":["../../src/services/chatEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,UAAU;IACzB,wFAAwF;IACxF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B;;;;;;;;OAQG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAErC;;;;;;;;;OASG;IACH,wBAAwB,CACtB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE,WAAW,EACrB,UAAU,CAAC,EAAE,UAAU,EACvB,YAAY,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,EAC5C,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI;IACzG;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,IAAI,KAAK,IAAI;IACxE;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI;IACvC,qGAAqG;IACrG,qBAAqB,CAAC,EAAE,MAAM;IAC9B,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,qBAAqB;IACzC,uFAAuF;IACvF,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GACpD,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAExB,kFAAkF;IAClF,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;;;;;;OASG;IACH,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,oFAAoF;IACpF,iBAAiB,IAAI,cAAc,CAAC;IAEpC;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAEtC;;;;;OAKG;IACH,MAAM,CAAC,IAAI,OAAO,CAAC;IAEnB;;;;;;OAMG;IACH,WAAW,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC/G"}