very-happy-cli 0.2.178 → 0.2.180

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 (217) hide show
  1. package/dist/{AcpBackend-DCQXHRzT.mjs → AcpBackend-B8Zi30Zh.mjs} +135 -16
  2. package/dist/{AcpBackend-CDkAQXYf.cjs → AcpBackend-DfRDtMcG.cjs} +135 -16
  3. package/dist/{AcpSessionManager-DckmUZza.cjs → AcpSessionManager-CASKOnOj.cjs} +38 -4
  4. package/dist/{AcpSessionManager-BXrQcqwC.mjs → AcpSessionManager-i8Rab0xT.mjs} +38 -4
  5. package/dist/{BasePermissionHandler-BVlrEhIi.mjs → BasePermissionHandler-26fKbRCm.mjs} +5 -2
  6. package/dist/{BasePermissionHandler-DyLmKKtO.cjs → BasePermissionHandler-BlM_tfej.cjs} +5 -2
  7. package/dist/acpSessionResume-B9l54P-X.mjs +67 -0
  8. package/dist/acpSessionResume-CR5pmgVo.cjs +74 -0
  9. package/dist/{agentHome-CEp9RMyK.cjs → agentHome-C7Sb7-Tz.cjs} +4 -4
  10. package/dist/{agentHome-C1xi37as.mjs → agentHome-CmGy0NWv.mjs} +4 -4
  11. package/dist/{api-JANhFdZV.cjs → api-DM7b1OKj.cjs} +38 -262
  12. package/dist/{api-Dib0dmqC.mjs → api-Hov8p7CA.mjs} +32 -256
  13. package/dist/{apiMachine-DNTJidYH.mjs → apiMachine-CwGEhQDT.mjs} +62 -15
  14. package/dist/{apiMachine-QhK-sKcr.cjs → apiMachine-DkGRj-Ai.cjs} +64 -17
  15. package/dist/{attachmentContent-bpQTBJ0y.cjs → attachmentContent-CEm13_gF.cjs} +4 -4
  16. package/dist/{attachmentContent-DkkdpSSJ.mjs → attachmentContent-CIn4iPEk.mjs} +2 -2
  17. package/dist/{auth-BRjd2esb.mjs → auth-BG1DY0gj.mjs} +5 -5
  18. package/dist/{auth-DgIV0Cvt.cjs → auth-CBXnm-Mj.cjs} +5 -5
  19. package/dist/{auth-omWDtgR8.cjs → auth-Dawj7pP5.cjs} +8 -8
  20. package/dist/{auth-DNct7VUi.mjs → auth-rggxMpEE.mjs} +8 -8
  21. package/dist/{auto-DKGFOJBo.mjs → auto-CXXLXGeL.mjs} +19 -18
  22. package/dist/{auto-CI16FZmX.cjs → auto-CbYOfoPS.cjs} +19 -18
  23. package/dist/{backgroundTaskActivity-BVwJBl02.mjs → backgroundTaskActivity-8PdPxrvy.mjs} +1 -1
  24. package/dist/{bootstrap-DCQ87Aan.cjs → bootstrap-DoA7okld.cjs} +2 -2
  25. package/dist/{bootstrap-BUagGC_-.mjs → bootstrap-Dt5I1SOl.mjs} +2 -2
  26. package/dist/{browser-Dj_DYQEh.mjs → browser-DUNetFT4.mjs} +1 -1
  27. package/dist/{browser-CSKhc0Bl.cjs → browser-DZ6qRtfH.cjs} +1 -1
  28. package/dist/{claudeCliPath-U4HHmV4r.cjs → claudeCliPath-GaP3UUz1.cjs} +1 -1
  29. package/dist/{claudeLocal-CdIVnOZp.cjs → claudeLocal--DNyMOSv.cjs} +8 -7
  30. package/dist/{claudeLocal-CCCvAeMd.mjs → claudeLocal-OHWQigCl.mjs} +6 -5
  31. package/dist/{claudeLocalLauncher-BmrpaRYJ.mjs → claudeLocalLauncher-BStvfa7M.mjs} +11 -10
  32. package/dist/{claudeLocalLauncher-21-xh5gc.cjs → claudeLocalLauncher-BhvPbcyH.cjs} +13 -12
  33. package/dist/{claudeSessionFork-kYCP1IJB.cjs → claudeSessionFork-Be16vzGc.cjs} +1 -1
  34. package/dist/{claudeSessionFork-DvxMKAmY.mjs → claudeSessionFork-GAVWhiKG.mjs} +1 -1
  35. package/dist/{client-C4zKGjiJ.cjs → client-BWjaHKtj.cjs} +2 -2
  36. package/dist/client-Ca5Pcgy_.mjs +71 -0
  37. package/dist/{client-CnlkkrZO.mjs → client-CnB7kRCT.mjs} +2 -2
  38. package/dist/{client-BTX9hsbr.mjs → client-D4uPb1uu.mjs} +3 -3
  39. package/dist/client-DJplzPjD.cjs +76 -0
  40. package/dist/{client-Dnza1hgN.cjs → client-D_loZ9IK.cjs} +3 -3
  41. package/dist/codex/happyMcpStdioBridge.cjs +24 -15
  42. package/dist/codex/happyMcpStdioBridge.mjs +25 -16
  43. package/dist/{codexAppServerClient-DvkpQgyv.mjs → codexAppServerClient-CO4G6OS4.mjs} +3 -3
  44. package/dist/{codexAppServerClient-CRlBWGn3.cjs → codexAppServerClient-PE-12AsW.cjs} +3 -3
  45. package/dist/{codexCommand-DzxIWXIT.cjs → codexCommand-BNoD1t1C.cjs} +127 -116
  46. package/dist/{codexCommand-BxjogBzU.mjs → codexCommand-B_xUH79E.mjs} +77 -66
  47. package/dist/{codexTermination-C28FzlLb.cjs → codexTermination-BmBbizFK.cjs} +7 -2
  48. package/dist/{codexTermination-ySDNMEhd.mjs → codexTermination-Dx48ma6e.mjs} +7 -2
  49. package/dist/{config-BFB5uJ4t.cjs → config-CtwEUxUP.cjs} +26 -26
  50. package/dist/{config-DwfEpFr3.mjs → config-DSu0Blos.mjs} +3 -3
  51. package/dist/{configuration-4TGMrjul.cjs → configuration-CYO-kPOS.cjs} +1 -1
  52. package/dist/{configuration-DVrb61aY.mjs → configuration-PxzEJumr.mjs} +1 -1
  53. package/dist/{connect-C7FPY0PI.mjs → connect-BQrg3TB6.mjs} +15 -15
  54. package/dist/{connect-QH2VJGBG.cjs → connect-Dq7wndzR.cjs} +28 -28
  55. package/dist/{context-JoKu0V54.cjs → context-6TP-iz_c.cjs} +1 -1
  56. package/dist/{context-B3XPVJlj.mjs → context-CJGRRGWW.mjs} +1 -1
  57. package/dist/{controlClient-BTaZlbC6.cjs → controlClient-Bqv5v5OM.cjs} +3 -3
  58. package/dist/{controlClient-BYKyGyxj.mjs → controlClient-DoeYovwP.mjs} +4 -4
  59. package/dist/{createSessionMetadata-8Fuj2-IV.mjs → createSessionMetadata-DDIChCx8.mjs} +2 -2
  60. package/dist/{createSessionMetadata-B2NynaWZ.cjs → createSessionMetadata-xz767pcG.cjs} +3 -3
  61. package/dist/{defaultPermissionMode-BEWCqJU-.cjs → defaultPermissionMode-PkZGsQDk.cjs} +2 -2
  62. package/dist/{defaultPermissionMode-B8kJG9uI.mjs → defaultPermissionMode-i5KzdK09.mjs} +2 -2
  63. package/dist/{detectCLI-DR9ZaN6B.cjs → detectCLI-BuYR_Qxe.cjs} +4 -4
  64. package/dist/{deterministicJson-C5ZwZ7hu.mjs → deterministicJson-CTEJDqtS.mjs} +217 -12
  65. package/dist/{deterministicJson-BjNQsAjO.cjs → deterministicJson-xqA6DaOm.cjs} +222 -16
  66. package/dist/{doctor-BshRnjLi.cjs → doctor-BrgSlfXn.cjs} +9 -9
  67. package/dist/{doctor-0BiGwJXk.mjs → doctor-IctjVh9T.mjs} +8 -8
  68. package/dist/{doctorReadiness-BCZGcN0a.cjs → doctorReadiness-Dl6yRQCy.cjs} +1 -1
  69. package/dist/{downloadTarget-BN5vZt3K.cjs → downloadTarget-CEb9che-.cjs} +6 -6
  70. package/dist/{downloadTarget-DJPwAZlu.mjs → downloadTarget-jbOz1egC.mjs} +6 -6
  71. package/dist/{ensureDaemonRunning-C5QfToCe.cjs → ensureDaemonRunning-D-HyjGIX.cjs} +6 -6
  72. package/dist/{ensureDaemonRunning-CSmb_mqt.mjs → ensureDaemonRunning-b1e8LCSM.mjs} +5 -5
  73. package/dist/{handleResumeCommand-BwnUZmbo.cjs → handleResumeCommand-BvWVuRwH.cjs} +23 -7
  74. package/dist/{handleResumeCommand-CgjpsdDe.mjs → handleResumeCommand-DpaZvm2c.mjs} +22 -6
  75. package/dist/{index-piJPsTsm.cjs → index-B2p2Mut7.cjs} +259 -53
  76. package/dist/{index-BehVbAsA.mjs → index-BUNnpGFF.mjs} +256 -50
  77. package/dist/{index-Bvldtdny.mjs → index-Bsvbgh9e.mjs} +4 -4
  78. package/dist/{index-BYOZ_8WZ.cjs → index-C64Ufj4D.cjs} +4 -4
  79. package/dist/{index-Clqlu17M.mjs → index-C6Vn5Eac.mjs} +155 -34
  80. package/dist/index-CMf5VbzG.mjs +18 -0
  81. package/dist/index-DmTlDRSL.cjs +24 -0
  82. package/dist/{index-_l1Sdmbi.cjs → index-Dv0Q48P3.cjs} +156 -33
  83. package/dist/{index-BRClDe07.cjs → index-F2UejqYs.cjs} +3 -3
  84. package/dist/{index-BYgfern_.mjs → index-wCbtF4BK.mjs} +3 -3
  85. package/dist/index.cjs +2 -2
  86. package/dist/index.mjs +2 -2
  87. package/dist/{install-BdvKiOQw.mjs → install-BX3lv3NO.mjs} +1 -1
  88. package/dist/{install-Cf6AFSWC.cjs → install-BXvf2E3o.cjs} +1 -1
  89. package/dist/{install-TO4taKW7.cjs → install-C0ANcEAW.cjs} +7 -7
  90. package/dist/{install-fYWHrPcC.mjs → install-CdzSV7qO.mjs} +3 -3
  91. package/dist/{installPiTools-BKnXjrVu.cjs → installPiTools-CL_axh_6.cjs} +1 -1
  92. package/dist/{installTerminalHooks-BQZbvxsZ.cjs → installTerminalHooks-BETLKAtd.cjs} +3 -3
  93. package/dist/lib.cjs +14 -14
  94. package/dist/lib.d.cts +239 -2
  95. package/dist/lib.d.mts +239 -2
  96. package/dist/lib.mjs +14 -14
  97. package/dist/{lidState-BeOwj6eW.cjs → lidState-DWGnm2H4.cjs} +1 -1
  98. package/dist/{lidState-DNMlIhX0.mjs → lidState-bBrmaQd2.mjs} +1 -1
  99. package/dist/{localHappyAgentAuth-Br-mgogg.cjs → localHappyAgentAuth-DZHQnIW9.cjs} +1 -1
  100. package/dist/{localHappyAgentAuth-BezKSFDi.mjs → localHappyAgentAuth-Dn1jYDpt.mjs} +1 -1
  101. package/dist/{logger--vAVtXB_.mjs → logger-BUngm5Xg.mjs} +2 -2
  102. package/dist/{logger-DXTWlPzP.cjs → logger-CphW5nUE.cjs} +2 -2
  103. package/dist/machineMetadata-BQm9YTcI.cjs +79 -0
  104. package/dist/machineMetadata-BXN_bKU3.mjs +68 -0
  105. package/dist/{main-DoMFJ2Cl.cjs → main-B2UV51nK.cjs} +112 -132
  106. package/dist/{main-CshDb5-1.mjs → main-DGkdYfEq.mjs} +106 -126
  107. package/dist/{mcp-pNc1EbQf.cjs → mcp-BFvAEIRz.cjs} +15 -15
  108. package/dist/{mcp-DKT_lrvQ.mjs → mcp-CbTtbs0f.mjs} +15 -15
  109. package/dist/{mirrorProtocol-6IFGPpjJ.mjs → mirrorProtocol-BR4luBC0.mjs} +148 -7
  110. package/dist/{mirrorProtocol-qKflWTX_.cjs → mirrorProtocol-HKPivs5o.cjs} +150 -4
  111. package/dist/{package-B7B03ejW.mjs → package-7Ld1YMhh.mjs} +8 -7
  112. package/dist/{package-DY4zTbKS.cjs → package-KhLqBDX9.cjs} +8 -7
  113. package/dist/panels-C7IVqpJk.mjs +137 -0
  114. package/dist/panels-Njf6GelF.cjs +142 -0
  115. package/dist/{peerTools-3R9RUARX.mjs → peerTools-BOlDRyhi.mjs} +60 -10
  116. package/dist/{peerTools-iy3_6Yc5.cjs → peerTools-DQNlrcqM.cjs} +60 -9
  117. package/dist/{persistence-BfX72dne.cjs → persistence-9BMYspxG.cjs} +2 -2
  118. package/dist/{persistence-DTk4sNpd.mjs → persistence-BFUOHW5h.mjs} +3 -3
  119. package/dist/{piRunnerArgs-CRQVR9o-.cjs → piRunnerArgs-DGaq6VYM.cjs} +8 -2
  120. package/dist/{piRunnerArgs-AT8QJY7x.mjs → piRunnerArgs-H2pgpA5z.mjs} +7 -1
  121. package/dist/{piRuntime-BHRT5MKO.cjs → piRuntime-CT5xv_3h.cjs} +2 -2
  122. package/dist/{piRuntime-E44qTVQ4.mjs → piRuntime-CdN0JAsa.mjs} +2 -2
  123. package/dist/{piTerminal-hI4WFdWm.cjs → piTerminal-0FBtXTHK.cjs} +18 -18
  124. package/dist/{piTerminal-De8nbciM.mjs → piTerminal-C4m9YXAV.mjs} +18 -18
  125. package/dist/processTreeSnapshot-CuLJDNC-.mjs +101 -0
  126. package/dist/processTreeSnapshot-mDbnuojn.cjs +105 -0
  127. package/dist/projectPath-C3ioB4Bu.cjs +13 -0
  128. package/dist/prompt-BOouDaTM.mjs +99 -0
  129. package/dist/prompt-lgF9IE82.cjs +105 -0
  130. package/dist/{attachmentLimits-UyFn8fkQ.mjs → pushNotifications-DCiBEVeC.mjs} +307 -3
  131. package/dist/{attachmentLimits-SqeAHrVC.cjs → pushNotifications-DI92havG.cjs} +308 -2
  132. package/dist/{index-DFPT4HOO.cjs → query-BETKBrnz.cjs} +25 -5
  133. package/dist/{index-CEjJnq05.mjs → query-ywZbQUzR.mjs} +26 -3
  134. package/dist/{rateLimitWindows-XrJiiBpU.mjs → rateLimitWindows-BkfuUB1a.mjs} +1 -1
  135. package/dist/{rateLimitWindows-Czb7_7cK.cjs → rateLimitWindows-YRIYVdo4.cjs} +1 -1
  136. package/dist/{registerCommonHandlers-C0_fyBQ0.cjs → registerCommonHandlers-C7a_dUWs.cjs} +30 -30
  137. package/dist/{registerCommonHandlers-CvIedVRf.mjs → registerCommonHandlers-CTkCvjxt.mjs} +2 -2
  138. package/dist/{registerKillSessionHandler-DYl7l4Ts.cjs → registerKillSessionHandler-CIsvBrVe.cjs} +6 -6
  139. package/dist/{registerKillSessionHandler-gwJ5lTf0.mjs → registerKillSessionHandler-CaqqRYq6.mjs} +6 -6
  140. package/dist/{remoteSessionClient-BRTIOX5b.cjs → remoteSessionClient-D843fkzL.cjs} +5 -5
  141. package/dist/{remoteSessionClient-DRb2Jr5s.mjs → remoteSessionClient-PP-mOKmw.mjs} +5 -5
  142. package/dist/{reportProgressTool-B9nCzbkL.cjs → reportProgressTool-14AXr959.cjs} +84 -2
  143. package/dist/{reportProgressTool-D5tEoXMW.mjs → reportProgressTool-ZOCNjWHr.mjs} +82 -3
  144. package/dist/{resources-JDPugcDq.cjs → resources-CvIlkzpP.cjs} +30 -0
  145. package/dist/{resources-BdFBQi8r.mjs → resources-y9jfyO-_.mjs} +30 -0
  146. package/dist/{run-CKe_WeLW.cjs → run-CAOCYYfT.cjs} +2806 -110
  147. package/dist/{run-BQ_FGaOL.mjs → run-Dajw2E5j.mjs} +2787 -91
  148. package/dist/{runClaude-zrrNcQC_.mjs → runClaude-C6oxWYbp.mjs} +49 -47
  149. package/dist/{runClaude-MHI5IKM-.cjs → runClaude-CRRKt-tm.cjs} +50 -48
  150. package/dist/{runClaudeDeps-RRw-Nusc.cjs → runClaudeDeps-B1ysqTvx.cjs} +310 -237
  151. package/dist/{runClaudeDeps-CVBCokOS.mjs → runClaudeDeps-BcZ68cX3.mjs} +297 -226
  152. package/dist/{runGemini-kipag2ag.mjs → runGemini-D7yKc4wD.mjs} +61 -55
  153. package/dist/{runGemini-D7Lg9yCr.cjs → runGemini-DtKFXqf-.cjs} +89 -83
  154. package/dist/{runOpenClaw-C_lRY3Do.mjs → runOpenClaw-C8ilyLP9.mjs} +19 -19
  155. package/dist/{runOpenClaw-DCcQ0L2N.cjs → runOpenClaw-Cq29mryb.cjs} +20 -20
  156. package/dist/{sandbox-BSyXFVFp.mjs → sandbox-CbCutma4.mjs} +4 -4
  157. package/dist/{sandbox-dMwPTmjm.cjs → sandbox-gIj-EuF4.cjs} +4 -4
  158. package/dist/{selfCheck-DkzDDUsE.cjs → selfCheck-BTGBVthv.cjs} +39 -38
  159. package/dist/selfCheck-Smt-5Xiq.mjs +85 -0
  160. package/dist/{send-dxC0miIA.cjs → send-CZf5lLw_.cjs} +8 -8
  161. package/dist/{send-C-k9nsd3.mjs → send-YZRMQvMJ.mjs} +9 -9
  162. package/dist/{server-DxoTYNlw.mjs → server-BqwXRzFZ.mjs} +4 -4
  163. package/dist/{server-B-W6P7Qr.cjs → server-CknFq6xG.cjs} +6 -6
  164. package/dist/sessionExitLifecycle-CzkLIgNZ.mjs +142 -0
  165. package/dist/sessionExitLifecycle-DFltxXU8.cjs +148 -0
  166. package/dist/{sessionLock-DWX6BbiU.cjs → sessionLock-DRZUcKHT.cjs} +38 -5
  167. package/dist/{sessionLock-DBdtZGOL.mjs → sessionLock-nBXdJxJm.mjs} +36 -5
  168. package/dist/{sessionOps-BAnr7n8t.cjs → sessionOps-BrGiU9-s.cjs} +10 -5
  169. package/dist/{sessionOps-BVoXe12O.mjs → sessionOps-C58iDeD5.mjs} +11 -6
  170. package/dist/{sessionScanner-BtxoeluY.mjs → sessionScanner-Bm57LEXe.mjs} +3 -3
  171. package/dist/{sessionScanner-CDOYsEUD.cjs → sessionScanner-CaO8bLaG.cjs} +3 -3
  172. package/dist/{sessions-C3sZJkzI.mjs → sessions-BXyBHo8n.mjs} +40 -18
  173. package/dist/{sessions-hAitoN-m.cjs → sessions-uzqPCc37.cjs} +39 -16
  174. package/dist/{setupOfflineReconnection-_eD4cuUT.mjs → setupOfflineReconnection-1Qlek3wl.mjs} +2 -2
  175. package/dist/{setupOfflineReconnection-C2EeYTFH.cjs → setupOfflineReconnection-DvvVX3TB.cjs} +2 -2
  176. package/dist/{spawn-Bc9v7pIf.cjs → spawn-DBkodJEO.cjs} +49 -18
  177. package/dist/{spawn-qNrB2CD_.mjs → spawn-vn93PhYL.mjs} +49 -18
  178. package/dist/spawnAgents-CgPMWexP.mjs +79 -0
  179. package/dist/{spawnAgents-BVEaz35W.cjs → spawnAgents-DLNMlhWJ.cjs} +37 -1
  180. package/dist/{spawnHappyCLI-C2stUioM.mjs → spawnHappyCLI-BjFZc_7V.mjs} +1 -1
  181. package/dist/{spawnHappyCLI-fzUagkKV.cjs → spawnHappyCLI-DnUZv0X2.cjs} +2 -2
  182. package/dist/{specialCommands-BJ-nqY4s.cjs → specialCommands-BRufxlqe.cjs} +3 -3
  183. package/dist/{specialCommands-C6W-rVyh.mjs → specialCommands-D3ND9bdg.mjs} +3 -3
  184. package/dist/{startFileWatcher-Bqlqjt93.cjs → startFileWatcher-D9cYzZOq.cjs} +1 -1
  185. package/dist/{startFileWatcher-CR09Snmz.mjs → startFileWatcher-DXJ7yB5v.mjs} +1 -1
  186. package/dist/startupSessionCreate-kdr3m1uX.cjs +26 -0
  187. package/dist/startupSessionCreate-uZ6BM0ty.mjs +24 -0
  188. package/dist/{streamRelay-CJoMk_d2.mjs → streamRelay-DnMCMMfV.mjs} +1 -1
  189. package/dist/{streamRelay-9kBPpbvU.cjs → streamRelay-Dy6amlzx.cjs} +1 -1
  190. package/dist/{sync-Dhmtk66S.cjs → sync-Bn-idAoy.cjs} +1 -1
  191. package/dist/{sync-DbW07iQS.mjs → sync-BvVhDO40.mjs} +1 -1
  192. package/dist/{systemPrompt-CQcuUmVp.mjs → systemPrompt-CIZcJuJF.mjs} +4 -3
  193. package/dist/{systemPrompt-3PYi3EUY.cjs → systemPrompt-DlyEk35T.cjs} +4 -3
  194. package/dist/{teams-DpxLcUU_.cjs → teams-BLeRpDxv.cjs} +8 -8
  195. package/dist/{teams-CwF4Z2fA.mjs → teams-DLY3B5yi.mjs} +8 -8
  196. package/dist/{time-A6zR3Iy6.cjs → time-Cjv0zxQO.cjs} +1 -1
  197. package/dist/{time-BuGWTVP6.mjs → time-D3ETL7Jb.mjs} +1 -1
  198. package/dist/{titleGenerator-D26gvNaS.cjs → titleGenerator-Cgp5ihFb.cjs} +10 -9
  199. package/dist/{titleGenerator-BGEzNWC9.mjs → titleGenerator-Uzbd4utr.mjs} +9 -8
  200. package/dist/{todo-DrZc76H5.mjs → todo-C9Ga-oEM.mjs} +6 -6
  201. package/dist/{todo-73g3NCIO.cjs → todo-pOMcEECE.cjs} +6 -6
  202. package/dist/{tools-CxJp4T1T.cjs → tools-BL7Byl_x.cjs} +1 -1
  203. package/dist/{tools-BtsrQnNS.mjs → tools-Cho7iIWf.mjs} +1 -1
  204. package/dist/{uninstall-DWNYvewQ.cjs → uninstall-CbayEVoV.cjs} +6 -6
  205. package/dist/{uninstall-DOb2mTwV.mjs → uninstall-CvZHVY9C.mjs} +3 -3
  206. package/dist/webPanels-B2_C2-3g.mjs +49 -0
  207. package/dist/webPanels-FCgFKvVe.cjs +53 -0
  208. package/package.json +8 -7
  209. package/dist/machineMetadata-B1H9gNbN.mjs +0 -39
  210. package/dist/machineMetadata-DcUupMje.cjs +0 -42
  211. package/dist/messageBuffer-BWlGgR3A.mjs +0 -71
  212. package/dist/messageBuffer-fJMH6uY8.cjs +0 -73
  213. package/dist/projectPath-ChLhdOyt.cjs +0 -13
  214. package/dist/selfCheck-CF7XGJPb.mjs +0 -84
  215. package/dist/sessionModeFile-ByLbXTbg.mjs +0 -32
  216. package/dist/sessionModeFile-CLLdidiJ.cjs +0 -36
  217. package/dist/spawnAgents-Bw6j4tqz.mjs +0 -45
@@ -1,95 +1,99 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-DXTWlPzP.cjs');
4
- var controlClient = require('./controlClient-BTaZlbC6.cjs');
3
+ var logger = require('./logger-CphW5nUE.cjs');
4
+ var controlClient = require('./controlClient-Bqv5v5OM.cjs');
5
5
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
6
+ var deterministicJson = require('./deterministicJson-xqA6DaOm.cjs');
7
+ var client = require('./client-DJplzPjD.cjs');
6
8
  var node_crypto = require('node:crypto');
7
- var messageBuffer = require('./messageBuffer-fJMH6uY8.cjs');
8
- var index = require('./index-DFPT4HOO.cjs');
9
+ var sessionExitLifecycle = require('./sessionExitLifecycle-DFltxXU8.cjs');
10
+ var query = require('./query-BETKBrnz.cjs');
9
11
  var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
10
12
  var permissionMode = require('./permissionMode-CrV-XuMs.cjs');
11
- var systemPrompt = require('./systemPrompt-3PYi3EUY.cjs');
13
+ var systemPrompt = require('./systemPrompt-DlyEk35T.cjs');
12
14
  var path$1 = require('node:path');
13
- var specialCommands = require('./specialCommands-BJ-nqY4s.cjs');
15
+ var specialCommands = require('./specialCommands-BRufxlqe.cjs');
14
16
  require('axios');
15
17
  require('node:events');
16
18
  require('socket.io-client');
17
- var attachmentLimits = require('./attachmentLimits-SqeAHrVC.cjs');
19
+ var pushNotifications = require('./pushNotifications-DI92havG.cjs');
18
20
  require('tweetnacl');
19
- var configuration = require('./configuration-4TGMrjul.cjs');
20
- require('./index-_l1Sdmbi.cjs');
21
- require('./registerCommonHandlers-C0_fyBQ0.cjs');
21
+ var configuration = require('./configuration-CYO-kPOS.cjs');
22
+ require('./index-Dv0Q48P3.cjs');
23
+ require('./registerCommonHandlers-C7a_dUWs.cjs');
22
24
  require('os');
23
25
  require('child_process');
24
26
  require('@paralleldrive/cuid2');
25
- require('./persistence-BfX72dne.cjs');
27
+ require('./persistence-9BMYspxG.cjs');
26
28
  var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
27
29
  require('chalk');
28
30
  var types = require('./types-CRS-srZK.cjs');
29
31
  var path = require('./path-B7zW-WwE.cjs');
30
32
  var fs = require('fs/promises');
31
- var time = require('./time-A6zR3Iy6.cjs');
33
+ var time = require('./time-Cjv0zxQO.cjs');
32
34
  var node_fs = require('node:fs');
33
- var deterministicJson = require('./deterministicJson-BjNQsAjO.cjs');
34
- var sessionScanner = require('./sessionScanner-CDOYsEUD.cjs');
35
+ var sessionScanner = require('./sessionScanner-CaO8bLaG.cjs');
35
36
  var node_child_process = require('node:child_process');
36
- var streamRelay = require('./streamRelay-9kBPpbvU.cjs');
37
- var attachmentContent = require('./attachmentContent-bpQTBJ0y.cjs');
37
+ var streamRelay = require('./streamRelay-Dy6amlzx.cjs');
38
+ var attachmentContent = require('./attachmentContent-CEm13_gF.cjs');
38
39
  var promises = require('node:fs/promises');
39
- var claudeSessionFork = require('./claudeSessionFork-kYCP1IJB.cjs');
40
- var registerKillSessionHandler = require('./registerKillSessionHandler-DYl7l4Ts.cjs');
41
- var doctor = require('./doctor-BshRnjLi.cjs');
40
+ var claudeSessionFork = require('./claudeSessionFork-Be16vzGc.cjs');
41
+ var registerKillSessionHandler = require('./registerKillSessionHandler-CIsvBrVe.cjs');
42
+ var doctor = require('./doctor-BrgSlfXn.cjs');
42
43
  var node_http = require('node:http');
43
44
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
44
- var projectPath = require('./projectPath-ChLhdOyt.cjs');
45
- var titleGenerator = require('./titleGenerator-D26gvNaS.cjs');
45
+ var projectPath = require('./projectPath-C3ioB4Bu.cjs');
46
+ var processTreeSnapshot = require('./processTreeSnapshot-mDbnuojn.cjs');
47
+ var titleGenerator = require('./titleGenerator-Cgp5ihFb.cjs');
46
48
  var oneShotPrompts = require('./oneShotPrompts-CL0dip9C.cjs');
47
- var reportProgressTool = require('./reportProgressTool-B9nCzbkL.cjs');
49
+ var reportProgressTool = require('./reportProgressTool-14AXr959.cjs');
48
50
  require('node:util');
49
- require('./smallFastModel-D_uxGMo3.cjs');
50
- require('./trimIdent-4gvk9Wk6.cjs');
51
- require('node:os');
52
- require('./agentGuidance-BtBx2xxE.cjs');
53
- require('./rateLimitWindows-Czb7_7cK.cjs');
51
+ require('./prompt-lgF9IE82.cjs');
54
52
  require('zod');
55
- require('./package-DY4zTbKS.cjs');
56
- require('util');
57
- require('crypto');
58
- require('path');
59
- require('cross-spawn');
53
+ require('./client-D_loZ9IK.cjs');
54
+ require('./context-6TP-iz_c.cjs');
55
+ require('./sessionOps-BrGiU9-s.cjs');
60
56
  require('./authRelay-Dy1qU9td.cjs');
61
- require('./client-Dnza1hgN.cjs');
62
- require('./context-JoKu0V54.cjs');
63
- require('./sessionOps-BAnr7n8t.cjs');
64
- require('./resources-JDPugcDq.cjs');
65
- require('./tools-CxJp4T1T.cjs');
66
- require('./peerTools-iy3_6Yc5.cjs');
57
+ require('./resources-CvIlkzpP.cjs');
58
+ require('./tools-BL7Byl_x.cjs');
59
+ require('./peerTools-DQNlrcqM.cjs');
60
+ require('node:os');
67
61
  require('./ids-B6ZC0HGt.cjs');
68
- require('./remoteSessionClient-BRTIOX5b.cjs');
62
+ require('./remoteSessionClient-D843fkzL.cjs');
69
63
  require('@modelcontextprotocol/sdk/server/mcp.js');
70
64
  require('@modelcontextprotocol/sdk/server/streamableHttp.js');
71
65
  require('./limits-C-a7gr04.cjs');
72
- require('./downloadTarget-BN5vZt3K.cjs');
66
+ require('./downloadTarget-CEb9che-.cjs');
73
67
  require('./terminals-B_bfC9c2.cjs');
74
68
  require('./terminalTitleSuggest-DhvRFX3H.cjs');
75
69
  require('./tmuxSocket-D-Xt6Vn-.cjs');
76
- require('./bootstrap-DCQ87Aan.cjs');
70
+ require('./bootstrap-DoA7okld.cjs');
71
+ require('./package-KhLqBDX9.cjs');
72
+ require('./agentGuidance-BtBx2xxE.cjs');
73
+ require('./trimIdent-4gvk9Wk6.cjs');
74
+ require('./webPanels-FCgFKvVe.cjs');
77
75
  require('./previewPath-B0rBdhy1.cjs');
78
- require('./sync-Dhmtk66S.cjs');
76
+ require('crypto');
77
+ require('./smallFastModel-D_uxGMo3.cjs');
78
+ require('./rateLimitWindows-YRIYVdo4.cjs');
79
+ require('util');
80
+ require('path');
81
+ require('cross-spawn');
82
+ require('./sync-Bn-idAoy.cjs');
79
83
  require('./transcriptCursor-DcXGLeSc.cjs');
80
- require('./startFileWatcher-Bqlqjt93.cjs');
84
+ require('./startFileWatcher-D9cYzZOq.cjs');
81
85
  require('node:readline');
82
86
  require('./doctor-u46qYYKX.cjs');
83
87
  require('ps-list');
84
- require('./doctorReadiness-BCZGcN0a.cjs');
85
- require('./detectCLI-DR9ZaN6B.cjs');
88
+ require('./doctorReadiness-Dl6yRQCy.cjs');
89
+ require('./detectCLI-BuYR_Qxe.cjs');
86
90
  require('fs');
87
91
  require('./cliUpdate-DsKXPFYp.cjs');
88
- require('./piRunnerArgs-CRQVR9o-.cjs');
89
- require('./sessionModeFile-CLLdidiJ.cjs');
92
+ require('./piRunnerArgs-DGaq6VYM.cjs');
93
+ require('./acpSessionResume-CR5pmgVo.cjs');
90
94
  require('url');
91
95
  require('node:module');
92
- require('./client-C4zKGjiJ.cjs');
96
+ require('./client-BWjaHKtj.cjs');
93
97
  require('./precheckCompat-CWOi5c9L.cjs');
94
98
 
95
99
  const SCHEDULE_WAKEUP_GRACE_MS = 6e4;
@@ -127,6 +131,41 @@ function createScheduledWakeupTracker() {
127
131
  return { observe, pending };
128
132
  }
129
133
 
134
+ function modelTarget(model) {
135
+ return model == null || model === "" ? void 0 : model;
136
+ }
137
+ function needsModelSwitch(current, next) {
138
+ return modelTarget(current) !== modelTarget(next);
139
+ }
140
+ function modelSwitchFailureNotice(model, error) {
141
+ const name = modelTarget(model) ?? "default";
142
+ const detail = error instanceof Error ? error.message : String(error);
143
+ return `\u26A0\uFE0F Could not switch to model "${name}" \u2014 continuing with the previous model. ${detail}`;
144
+ }
145
+
146
+ const CLAUDE_MODEL_NOT_FOUND = "model_not_found";
147
+ function retiredModelFrom(message, runningModel) {
148
+ const m = message;
149
+ if (!m || m.type !== "assistant" || m.error !== CLAUDE_MODEL_NOT_FOUND) return null;
150
+ if ((m.parent_tool_use_id ?? null) !== null) return null;
151
+ return modelTarget(runningModel) ?? null;
152
+ }
153
+ function createRetiredModels() {
154
+ const retired = /* @__PURE__ */ new Set();
155
+ return {
156
+ retire(model) {
157
+ retired.add(model);
158
+ },
159
+ effective(model) {
160
+ const target = modelTarget(model);
161
+ return target !== void 0 && retired.has(target) ? void 0 : target;
162
+ }
163
+ };
164
+ }
165
+ function retiredModelNotice(model) {
166
+ return `\u26A0\uFE0F Model "${model}" is no longer available \u2014 switched this session to the default model. Pick another model to change it, then send your message again.`;
167
+ }
168
+
130
169
  class Session {
131
170
  path;
132
171
  logPath;
@@ -155,6 +194,8 @@ class Session {
155
194
  backgroundTasks = [];
156
195
  /** B-587 review P3-4: CronCreate / ScheduleWakeup pending in this Claude process. */
157
196
  scheduledWakeups = createScheduledWakeupTracker();
197
+ /** B-634 ③: model ids Claude Code reported as model_not_found — session-scoped, survives relaunches. */
198
+ retiredModels = createRetiredModels();
158
199
  /**
159
200
  * Window after a user-initiated abort during which stray promise rejections
160
201
  * from tearing down the SDK query (MCP transports, in-flight tool calls,
@@ -208,6 +249,20 @@ class Session {
208
249
  sessionFoundCallbacks = [];
209
250
  /** Keep alive interval reference for cleanup */
210
251
  keepAliveInterval;
252
+ /**
253
+ * B-645: project context rides in front of real user messages (never the
254
+ * system prompt), so it survives relaunches without touching the mode hash
255
+ * or prewarm key. One per session process; created on first use.
256
+ */
257
+ _projectInjector = null;
258
+ get projectInjector() {
259
+ return this._projectInjector ??= deterministicJson.createProjectInjector({
260
+ client: client.sharedProjectsClient(),
261
+ sessionId: () => this.client.sessionId,
262
+ metadata: () => this.client.getMetadata?.() ?? null,
263
+ agent: "claude"
264
+ });
265
+ }
211
266
  constructor(opts) {
212
267
  this.path = opts.path;
213
268
  this.api = opts.api;
@@ -594,6 +649,112 @@ function createRuntimeControls(isThinking) {
594
649
  return { setQuery, observe, request, stopRunningTasks };
595
650
  }
596
651
 
652
+ const CLAUDE_COMMAND_LIFECYCLE_STATES = ["queued", "started", "completed", "cancelled", "discarded", "refused"];
653
+ function readClaudeCommandLifecycle(frame) {
654
+ const m = frame;
655
+ if (!m) return null;
656
+ const isLifecycle = m.type === "command_lifecycle" || m.type === "system" && m.subtype === "command_lifecycle";
657
+ if (!isLifecycle || typeof m.command_uuid !== "string" || m.command_uuid.length === 0) return null;
658
+ const state = CLAUDE_COMMAND_LIFECYCLE_STATES.find((candidate) => candidate === m.state);
659
+ return state ? { uuid: m.command_uuid, state } : null;
660
+ }
661
+ const uuidList = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.length > 0) : [];
662
+ const INTERRUPT_CANCEL_QUEUED_CAPABILITY = "interrupt_cancel_queued_v1";
663
+ const PENDING_MAX = 256;
664
+ const REPORTED_MAX = 512;
665
+ const MSG_LIFECYCLE_CAPABILITY = "msg_lifecycle_v1";
666
+ function createClaudeCommandTracker() {
667
+ const pending = /* @__PURE__ */ new Map();
668
+ const reported = /* @__PURE__ */ new Set();
669
+ const drop = (uuid) => {
670
+ pending.delete(uuid);
671
+ if (reported.has(uuid)) return null;
672
+ reported.add(uuid);
673
+ if (reported.size > REPORTED_MAX) reported.delete(reported.values().next().value);
674
+ return uuid;
675
+ };
676
+ return {
677
+ /** A uuid-stamped user message (prompt or steer) was handed to the Query. */
678
+ track(uuid, payload) {
679
+ if (!pending.has(uuid) && pending.size >= PENDING_MAX) pending.delete(pending.keys().next().value);
680
+ pending.set(uuid, { started: false, payload });
681
+ },
682
+ isTracked(uuid) {
683
+ return pending.has(uuid);
684
+ },
685
+ /** A lifecycle frame; returns the uuids now known to have never run. */
686
+ observe(lifecycle) {
687
+ const entry = pending.get(lifecycle.uuid);
688
+ if (!entry) return [];
689
+ switch (lifecycle.state) {
690
+ case "queued":
691
+ return [];
692
+ case "started":
693
+ entry.started = true;
694
+ return [];
695
+ case "completed":
696
+ pending.delete(lifecycle.uuid);
697
+ return [];
698
+ default: {
699
+ if (entry.started) {
700
+ pending.delete(lifecycle.uuid);
701
+ return [];
702
+ }
703
+ const dropped = drop(lifecycle.uuid);
704
+ return dropped ? [dropped] : [];
705
+ }
706
+ }
707
+ },
708
+ /**
709
+ * An interrupt's receipt: `cancelled` members we track never ran;
710
+ * `still_queued` members we track are returned for the per-uuid
711
+ * follow-up (`cancel_async_message`) a CLI without cancel_queued needs.
712
+ */
713
+ onInterruptReceipt(receipt) {
714
+ const dropped = [];
715
+ for (const uuid of uuidList(receipt?.cancelled)) {
716
+ if (!pending.has(uuid)) continue;
717
+ const result = drop(uuid);
718
+ if (result) dropped.push(result);
719
+ }
720
+ const stillQueued = uuidList(receipt?.still_queued).filter((uuid) => pending.has(uuid));
721
+ return { dropped, stillQueued };
722
+ },
723
+ /** The answer to `cancel_async_message`: true = withdrawn before it ran; false = already dequeued, its lifecycle frames follow. */
724
+ onCancelResponse(uuid, cancelled) {
725
+ if (!cancelled || !pending.has(uuid)) return [];
726
+ const dropped = drop(uuid);
727
+ return dropped ? [dropped] : [];
728
+ },
729
+ /**
730
+ * B-634 ②: the Query is over — every tracked message that never
731
+ * `started` and was not already reported, in the order it was sent.
732
+ * Untracked afterwards; a later frame for one of them is ignored.
733
+ */
734
+ takeUnconfirmed() {
735
+ const out = [];
736
+ for (const [uuid, entry] of pending) {
737
+ if (entry.started || entry.payload === void 0 || reported.has(uuid)) continue;
738
+ out.push({ uuid, payload: entry.payload });
739
+ }
740
+ for (const { uuid } of out) pending.delete(uuid);
741
+ return out;
742
+ },
743
+ clear() {
744
+ pending.clear();
745
+ }
746
+ };
747
+ }
748
+ function planUnconfirmedCommands(commands, context) {
749
+ if (context.aborted || !context.parkFree) return { redeliver: null, tombstone: commands.map((c) => c.uuid) };
750
+ const index = commands.findIndex((c) => !context.redelivered.has(c.uuid));
751
+ if (index < 0) return { redeliver: null, tombstone: commands.map((c) => c.uuid) };
752
+ return {
753
+ redeliver: commands[index],
754
+ tombstone: commands.filter((_, i) => i !== index).map((c) => c.uuid)
755
+ };
756
+ }
757
+
597
758
  const AUTH_FAILURE_RESULT_TEXT = /Failed to authenticate|OAuth session expired/i;
598
759
  const QUERY_RECYCLE_NOTICE = {
599
760
  authentication_failed: "\u26A0\uFE0F Claude Code could not refresh its OAuth session. This agent process was ended so your next message starts a fresh one that re-reads the credentials on this machine; if it fails again, run `claude` on the machine to log in again."
@@ -747,18 +908,6 @@ async function awaitFileExist(file, timeout = 1e4) {
747
908
  return false;
748
909
  }
749
910
 
750
- function modelTarget(model) {
751
- return model == null || model === "" ? void 0 : model;
752
- }
753
- function needsModelSwitch(current, next) {
754
- return modelTarget(current) !== modelTarget(next);
755
- }
756
- function modelSwitchFailureNotice(model, error) {
757
- const name = modelTarget(model) ?? "default";
758
- const detail = error instanceof Error ? error.message : String(error);
759
- return `\u26A0\uFE0F Could not switch to model "${name}" \u2014 continuing with the previous model. ${detail}`;
760
- }
761
-
762
911
  const SDK_TIMING_FIELDS = ["ttft_ms", "time_to_request_ms", "time_to_request_from_spawn_ms"];
763
912
  function delta(from, to) {
764
913
  if (typeof from !== "number" || typeof to !== "number" || to < from) return "-";
@@ -1093,88 +1242,6 @@ function createClaudeTurnTracker() {
1093
1242
  };
1094
1243
  }
1095
1244
 
1096
- const CLAUDE_COMMAND_LIFECYCLE_STATES = ["queued", "started", "completed", "cancelled", "discarded", "refused"];
1097
- function readClaudeCommandLifecycle(frame) {
1098
- const m = frame;
1099
- if (!m) return null;
1100
- const isLifecycle = m.type === "command_lifecycle" || m.type === "system" && m.subtype === "command_lifecycle";
1101
- if (!isLifecycle || typeof m.command_uuid !== "string" || m.command_uuid.length === 0) return null;
1102
- const state = CLAUDE_COMMAND_LIFECYCLE_STATES.find((candidate) => candidate === m.state);
1103
- return state ? { uuid: m.command_uuid, state } : null;
1104
- }
1105
- const uuidList = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.length > 0) : [];
1106
- const INTERRUPT_CANCEL_QUEUED_CAPABILITY = "interrupt_cancel_queued_v1";
1107
- const PENDING_MAX = 256;
1108
- const REPORTED_MAX = 512;
1109
- function createClaudeCommandTracker() {
1110
- const pending = /* @__PURE__ */ new Map();
1111
- const reported = /* @__PURE__ */ new Set();
1112
- const drop = (uuid) => {
1113
- pending.delete(uuid);
1114
- if (reported.has(uuid)) return null;
1115
- reported.add(uuid);
1116
- if (reported.size > REPORTED_MAX) reported.delete(reported.values().next().value);
1117
- return uuid;
1118
- };
1119
- return {
1120
- /** A uuid-stamped user message (prompt or steer) was handed to the Query. */
1121
- track(uuid) {
1122
- if (!pending.has(uuid) && pending.size >= PENDING_MAX) pending.delete(pending.keys().next().value);
1123
- pending.set(uuid, { started: false });
1124
- },
1125
- isTracked(uuid) {
1126
- return pending.has(uuid);
1127
- },
1128
- /** A lifecycle frame; returns the uuids now known to have never run. */
1129
- observe(lifecycle) {
1130
- const entry = pending.get(lifecycle.uuid);
1131
- if (!entry) return [];
1132
- switch (lifecycle.state) {
1133
- case "queued":
1134
- return [];
1135
- case "started":
1136
- entry.started = true;
1137
- return [];
1138
- case "completed":
1139
- pending.delete(lifecycle.uuid);
1140
- return [];
1141
- default: {
1142
- if (entry.started) {
1143
- pending.delete(lifecycle.uuid);
1144
- return [];
1145
- }
1146
- const dropped = drop(lifecycle.uuid);
1147
- return dropped ? [dropped] : [];
1148
- }
1149
- }
1150
- },
1151
- /**
1152
- * An interrupt's receipt: `cancelled` members we track never ran;
1153
- * `still_queued` members we track are returned for the per-uuid
1154
- * follow-up (`cancel_async_message`) a CLI without cancel_queued needs.
1155
- */
1156
- onInterruptReceipt(receipt) {
1157
- const dropped = [];
1158
- for (const uuid of uuidList(receipt?.cancelled)) {
1159
- if (!pending.has(uuid)) continue;
1160
- const result = drop(uuid);
1161
- if (result) dropped.push(result);
1162
- }
1163
- const stillQueued = uuidList(receipt?.still_queued).filter((uuid) => pending.has(uuid));
1164
- return { dropped, stillQueued };
1165
- },
1166
- /** The answer to `cancel_async_message`: true = withdrawn before it ran; false = already dequeued, its lifecycle frames follow. */
1167
- onCancelResponse(uuid, cancelled) {
1168
- if (!cancelled || !pending.has(uuid)) return [];
1169
- const dropped = drop(uuid);
1170
- return dropped ? [dropped] : [];
1171
- },
1172
- clear() {
1173
- pending.clear();
1174
- }
1175
- };
1176
- }
1177
-
1178
1245
  const SET_MODEL_TIMEOUT_MS = 3e4;
1179
1246
  const PROMPT_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
1180
1247
  function promptUuid(uuid) {
@@ -1300,7 +1367,7 @@ async function claudeRemote(opts) {
1300
1367
  const messages2 = new PushableAsyncIterable();
1301
1368
  const startedAt = Date.now();
1302
1369
  try {
1303
- const response2 = index.query({
1370
+ const response2 = query.query({
1304
1371
  prompt: messages2,
1305
1372
  options: buildSdkOptions(lease.mode, { settingsPath: lease.hookSettingsPath, abort: abort.signal })
1306
1373
  });
@@ -1348,9 +1415,14 @@ async function claudeRemote(opts) {
1348
1415
  const discardWarm = (reason) => {
1349
1416
  warm?.lease.discard(reason);
1350
1417
  };
1418
+ const withoutRetiredModel = (next) => {
1419
+ if (!next || !opts.retiredModels) return next;
1420
+ const model = opts.retiredModels.effective(next.mode.model);
1421
+ return model === next.mode.model ? next : { ...next, mode: { ...next.mode, model } };
1422
+ };
1351
1423
  let initial;
1352
1424
  try {
1353
- initial = await opts.nextMessage();
1425
+ initial = withoutRetiredModel(await opts.nextMessage());
1354
1426
  } catch (error) {
1355
1427
  discardWarm("error");
1356
1428
  throw error;
@@ -1459,7 +1531,7 @@ async function claudeRemote(opts) {
1459
1531
  messages = new PushableAsyncIterable();
1460
1532
  messages.push(initialUserMessage);
1461
1533
  timingMarks.spawnAt = Date.now();
1462
- response = index.query({
1534
+ response = query.query({
1463
1535
  prompt: messages,
1464
1536
  options: buildSdkOptions(initial.mode, { settingsPath: opts.hookSettingsPath, abort: opts.signal })
1465
1537
  });
@@ -1510,7 +1582,7 @@ async function claudeRemote(opts) {
1510
1582
  steer: (message, nextMode, localKey) => {
1511
1583
  mode = { ...nextMode, model: mode.model };
1512
1584
  const uuid = promptUuid(localKey);
1513
- if (uuid.uuid) commandTracker.track(uuid.uuid);
1585
+ if (uuid.uuid) commandTracker.track(uuid.uuid, { message, mode: nextMode });
1514
1586
  messages.push({
1515
1587
  type: "user",
1516
1588
  parent_tool_use_id: null,
@@ -1524,7 +1596,7 @@ async function claudeRemote(opts) {
1524
1596
  }
1525
1597
  let lastAssistantError;
1526
1598
  turn.pushed();
1527
- if (initialUserMessage.uuid) commandTracker.track(initialUserMessage.uuid);
1599
+ if (initialUserMessage.uuid) commandTracker.track(initialUserMessage.uuid, { message: initial.message, mode: initial.mode });
1528
1600
  let modelUnconfirmed = false;
1529
1601
  let pullingNext = false;
1530
1602
  const pullNextMessage = () => {
@@ -1533,8 +1605,10 @@ async function claudeRemote(opts) {
1533
1605
  return;
1534
1606
  }
1535
1607
  pullingNext = true;
1536
- opts.nextMessage().then(async (next) => {
1608
+ opts.nextMessage().then(async (pulled) => {
1609
+ let next = withoutRetiredModel(pulled);
1537
1610
  if (!next) {
1611
+ pullingNext = false;
1538
1612
  messages.end();
1539
1613
  return;
1540
1614
  }
@@ -1554,8 +1628,9 @@ async function claudeRemote(opts) {
1554
1628
  updateThinking(true);
1555
1629
  turn.pushed();
1556
1630
  const uuid = promptUuid(next.uuid);
1557
- if (uuid.uuid) commandTracker.track(uuid.uuid);
1631
+ if (uuid.uuid) commandTracker.track(uuid.uuid, { message: next.message, mode: next.mode });
1558
1632
  timingMarks = { pushedAt: next.enqueuedAt ?? Date.now() };
1633
+ pullingNext = false;
1559
1634
  messages.push({
1560
1635
  type: "user",
1561
1636
  parent_tool_use_id: null,
@@ -1564,9 +1639,8 @@ async function claudeRemote(opts) {
1564
1639
  message: { role: "user", content: next.message }
1565
1640
  });
1566
1641
  }).catch(() => {
1567
- messages.end();
1568
- }).finally(() => {
1569
1642
  pullingNext = false;
1643
+ messages.end();
1570
1644
  });
1571
1645
  };
1572
1646
  const recycleIfPoisoned = (result) => {
@@ -1605,6 +1679,17 @@ async function claudeRemote(opts) {
1605
1679
  if (message.type === "assistant" && message.error) {
1606
1680
  lastAssistantError = message.error;
1607
1681
  }
1682
+ const retired = opts.retiredModels ? retiredModelFrom(message, mode.model) : null;
1683
+ if (retired) {
1684
+ opts.retiredModels.retire(retired);
1685
+ mode = { ...mode, model: void 0 };
1686
+ logger.logger.debug(`[claudeRemote] Model ${retired} reported model_not_found; moving the session to the default model`);
1687
+ opts.onCompletionEvent?.(retiredModelNotice(retired));
1688
+ void withTimeout(response.setModel(void 0), SET_MODEL_TIMEOUT_MS, "set_model").catch((e) => {
1689
+ logger.logger.debug(`[claudeRemote] setModel(default) after model_not_found failed: ${e instanceof Error ? e.message : String(e)}`);
1690
+ modelUnconfirmed = true;
1691
+ });
1692
+ }
1608
1693
  if (message.type === "assistant" && timingMarks.firstAssistantAt === void 0) {
1609
1694
  timingMarks.firstAssistantAt = Date.now();
1610
1695
  } else if (message.type === "system" && message.subtype === "init" && timingMarks.initAt === void 0) {
@@ -1718,6 +1803,13 @@ async function claudeRemote(opts) {
1718
1803
  }
1719
1804
  } finally {
1720
1805
  updateThinking(false);
1806
+ if (cliCapabilities.has(MSG_LIFECYCLE_CAPABILITY)) {
1807
+ const unconfirmed = commandTracker.takeUnconfirmed();
1808
+ if (unconfirmed.length > 0) {
1809
+ logger.logger.debug(`[claudeRemote] Query ended with ${unconfirmed.length} user message(s) never started: ${unconfirmed.map((c) => c.uuid).join(", ")}`);
1810
+ opts.onCommandsUnconfirmed?.(unconfirmed, { aborted: opts.signal?.aborted === true });
1811
+ }
1812
+ }
1721
1813
  }
1722
1814
  }
1723
1815
 
@@ -2688,7 +2780,7 @@ class OutgoingMessageQueue {
2688
2780
  }
2689
2781
  queue = [];
2690
2782
  nextId = 1;
2691
- lock = new attachmentLimits.AsyncLock();
2783
+ lock = new pushNotifications.AsyncLock();
2692
2784
  processTimer;
2693
2785
  delayTimers = /* @__PURE__ */ new Map();
2694
2786
  /**
@@ -3637,7 +3729,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3637
3729
  logger.logger.debug("[claudeRemoteLauncher] Starting remote launcher");
3638
3730
  const hasTTY = process.stdout.isTTY && process.stdin.isTTY;
3639
3731
  logger.logger.debug(`[claudeRemoteLauncher] TTY available: ${hasTTY}`);
3640
- let messageBuffer$1 = new messageBuffer.MessageBuffer();
3732
+ let messageBuffer = new sessionExitLifecycle.MessageBuffer();
3641
3733
  let inkInstance = null;
3642
3734
  if (hasTTY) {
3643
3735
  const [{ render }, { default: React }, { RemoteModeDisplay }] = await Promise.all([
@@ -3647,7 +3739,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3647
3739
  ]);
3648
3740
  console.clear();
3649
3741
  inkInstance = render(React.createElement(RemoteModeDisplay, {
3650
- messageBuffer: messageBuffer$1,
3742
+ messageBuffer,
3651
3743
  logPath: process.env.DEBUG ? session.logPath : void 0,
3652
3744
  onExit: async () => {
3653
3745
  logger.logger.debug("[remote]: Exiting client via Ctrl-C");
@@ -3821,14 +3913,14 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3821
3913
  session.scheduledWakeups.observe(message);
3822
3914
  if (message.type === "system" && message.subtype === "api_retry") {
3823
3915
  const notice = describeClaudeApiRetry(message);
3824
- messageBuffer$1.addMessage(notice, "status");
3916
+ messageBuffer.addMessage(notice, "status");
3825
3917
  if (apiRetryGate.observe(message, Date.now())) {
3826
3918
  session.client.sendSessionEvent({ type: "message", message: notice, kind: "claude-api-retry" });
3827
3919
  }
3828
3920
  } else if (message.type === "system" && message.subtype === "informational") {
3829
3921
  const warning = describeClaudeInformational(message);
3830
3922
  if (warning) {
3831
- messageBuffer$1.addMessage(warning, "status");
3923
+ messageBuffer.addMessage(warning, "status");
3832
3924
  session.client.sendSessionEvent({ type: "message", message: warning, kind: "claude-warning" });
3833
3925
  }
3834
3926
  } else if (message.type === "result") {
@@ -3839,7 +3931,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3839
3931
  sdkToLogConverter.convert(message);
3840
3932
  return;
3841
3933
  }
3842
- formatClaudeMessageForInk(message, messageBuffer$1);
3934
+ formatClaudeMessageForInk(message, messageBuffer);
3843
3935
  if (message.type === "assistant") {
3844
3936
  let umessage = message;
3845
3937
  if (umessage.message.content && Array.isArray(umessage.message.content)) {
@@ -3949,6 +4041,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3949
4041
  }
3950
4042
  try {
3951
4043
  const modeGate = new LaunchModeGate(session.queue.modeHasher);
4044
+ const redeliveredCommands = /* @__PURE__ */ new Set();
3952
4045
  let previousSessionId = null;
3953
4046
  await Promise.race([
3954
4047
  rewindReconciler.startup().catch((error) => logger.logger.debug("[rewind] startup reconcile failed", error)),
@@ -3956,15 +4049,15 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3956
4049
  ]);
3957
4050
  while (!exitReason) {
3958
4051
  logger.logger.debug("[remote]: launch");
3959
- messageBuffer$1.addMessage("\u2550".repeat(40), "status");
4052
+ messageBuffer.addMessage("\u2550".repeat(40), "status");
3960
4053
  const isNewSession = session.sessionId !== previousSessionId;
3961
4054
  if (isNewSession) {
3962
- messageBuffer$1.addMessage("Starting new Claude session...", "status");
4055
+ messageBuffer.addMessage("Starting new Claude session...", "status");
3963
4056
  permissionHandler.reset();
3964
4057
  sdkToLogConverter.resetParentChain();
3965
4058
  logger.logger.debug(`[remote]: New session detected (previous: ${previousSessionId}, current: ${session.sessionId})`);
3966
4059
  } else {
3967
- messageBuffer$1.addMessage("Continuing Claude session...", "status");
4060
+ messageBuffer.addMessage("Continuing Claude session...", "status");
3968
4061
  logger.logger.debug(`[remote]: Continuing existing session: ${session.sessionId}`);
3969
4062
  }
3970
4063
  previousSessionId = session.sessionId;
@@ -4004,10 +4097,15 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
4004
4097
  return permissionHandler.isAborted(toolCallId);
4005
4098
  },
4006
4099
  nextMessage: async () => {
4100
+ const finalize = async (text) => {
4101
+ const out = await session.projectInjector.decorate(text);
4102
+ onPromptFinalized?.(out);
4103
+ return out;
4104
+ };
4007
4105
  const parked = modeGate.takeParked();
4008
4106
  if (parked) {
4009
4107
  permissionHandler.handleModeChange(parked.mode.permissionMode);
4010
- if (typeof parked.message === "string") onPromptFinalized?.(parked.message);
4108
+ if (typeof parked.message === "string") return { ...parked, message: await finalize(parked.message) };
4011
4109
  return parked;
4012
4110
  }
4013
4111
  await rewindReconciler.settled(controller.signal);
@@ -4036,8 +4134,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
4036
4134
  sessionId: session.client.sessionId
4037
4135
  });
4038
4136
  logger.logger.debug(`[remote] Staged ${staged.length} attachment(s) for the coding agent`);
4039
- const withAttachments = attachmentContent.appendStagedAttachmentsToPrompt(msg.message, staged);
4040
- onPromptFinalized?.(withAttachments);
4137
+ const withAttachments = await finalize(attachmentContent.appendStagedAttachmentsToPrompt(msg.message, staged));
4041
4138
  return {
4042
4139
  message: withAttachments,
4043
4140
  mode: msg.mode,
@@ -4045,9 +4142,9 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
4045
4142
  uuid: promptUuidFor(msg.sourceIds)
4046
4143
  };
4047
4144
  }
4048
- onPromptFinalized?.(msg.message);
4145
+ const finalized = await finalize(msg.message);
4049
4146
  return {
4050
- message: msg.message,
4147
+ message: finalized,
4051
4148
  mode: msg.mode,
4052
4149
  enqueuedAt: msg.enqueuedAt,
4053
4150
  uuid: promptUuidFor(msg.sourceIds)
@@ -4121,6 +4218,25 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
4121
4218
  // queued behind a pre-empting steer's turn) before the model
4122
4219
  // read them — the same tombstone a destroyed queue item gets
4123
4220
  // (B-332), so the web shows them as not delivered, not answered.
4221
+ retiredModels: session.retiredModels,
4222
+ // B-634 ②: messages the Query ended without Claude Code ever
4223
+ // starting them — sent once more, or tombstoned (B-332).
4224
+ onCommandsUnconfirmed: (commands, { aborted }) => {
4225
+ const plan = planUnconfirmedCommands(commands, {
4226
+ aborted: aborted || exitReason !== null,
4227
+ parkFree: !modeGate.hasParked,
4228
+ redelivered: redeliveredCommands
4229
+ });
4230
+ if (plan.redeliver) {
4231
+ redeliveredCommands.add(plan.redeliver.uuid);
4232
+ logger.logger.debug(`[remote]: re-sending unconfirmed user message ${plan.redeliver.uuid} into the next launch`);
4233
+ modeGate.park({ message: plan.redeliver.payload.message, mode: plan.redeliver.payload.mode, uuid: plan.redeliver.uuid });
4234
+ }
4235
+ if (plan.tombstone.length > 0) {
4236
+ logger.logger.debug(`[remote]: ${plan.tombstone.length} user message(s) never started before the query ended`);
4237
+ session.client.sendQueueCancelReason(plan.tombstone, "aborted");
4238
+ }
4239
+ },
4124
4240
  onCommandsDropped: (uuids) => {
4125
4241
  logger.logger.debug(`[remote]: ${uuids.length} user message(s) never read before the turn ended`);
4126
4242
  session.client.sendQueueCancelReason(uuids, "aborted");
@@ -4229,7 +4345,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
4229
4345
  }
4230
4346
  });
4231
4347
  logger.logger.debug(`[remote]: cleanup done +${Date.now() - t0}ms rawMode=${process.stdin.isRaw}`);
4232
- messageBuffer$1.clear();
4348
+ messageBuffer.clear();
4233
4349
  if (abortFuture) {
4234
4350
  abortFuture.resolve(void 0);
4235
4351
  }
@@ -4263,7 +4379,7 @@ async function loop(opts) {
4263
4379
  logger.logger.debug(`[loop] Iteration with mode: ${mode}`);
4264
4380
  switch (mode) {
4265
4381
  case "local": {
4266
- const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-21-xh5gc.cjs'); });
4382
+ const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-BhvPbcyH.cjs'); });
4267
4383
  const result = await claudeLocalLauncher(session);
4268
4384
  switch (result.type) {
4269
4385
  case "switch":
@@ -4428,71 +4544,6 @@ function cleanupHookSettingsFile(filepath) {
4428
4544
  }
4429
4545
  }
4430
4546
 
4431
- async function settleSessionOnExit(sessionId, intent, deps) {
4432
- if (intent === "archive") {
4433
- deps.updateMetadata((currentMetadata) => ({
4434
- ...currentMetadata,
4435
- lifecycleState: "archived",
4436
- lifecycleStateSince: Date.now(),
4437
- archivedBy: "cli",
4438
- archiveReason: "User terminated"
4439
- }));
4440
- }
4441
- if (intent === "hibernate" && deps.hibernation) {
4442
- const stamp = deps.hibernation;
4443
- const handler = (currentMetadata) => ({ ...currentMetadata, hibernation: stamp });
4444
- const landed = deps.updateMetadataAndWait ? await deps.updateMetadataAndWait(handler) : (deps.updateMetadata(handler), false);
4445
- if (!landed) deps.log?.("[START] hibernation stamp not confirmed before going offline");
4446
- }
4447
- deps.sendSessionDeath();
4448
- try {
4449
- if (intent === "archive") await deps.archiveSession(sessionId);
4450
- else await deps.deactivateSession(sessionId);
4451
- } catch (error) {
4452
- deps.log?.(`[START] ${intent === "archive" ? "archiveSession" : "deactivateSession"} during cleanup failed:`, error);
4453
- }
4454
- }
4455
- class SessionExitGate {
4456
- decided = null;
4457
- hibernateCommitted = false;
4458
- deferred = null;
4459
- /** Returns the intent to act on, or null when cleanup already started. */
4460
- claim(intent) {
4461
- if (this.decided === "hibernate" && !this.hibernateCommitted && intent !== "hibernate") {
4462
- if (this.deferred !== "archive") this.deferred = intent;
4463
- return null;
4464
- }
4465
- if (this.decided !== null) return null;
4466
- this.decided = intent;
4467
- return intent;
4468
- }
4469
- get current() {
4470
- return this.decided;
4471
- }
4472
- /** B-587: an exit was requested while the hibernation was deciding. */
4473
- get exitRequested() {
4474
- return this.deferred !== null;
4475
- }
4476
- /** B-587: the hibernation passed its last check — no more deferral. */
4477
- commitHibernate() {
4478
- if (this.decided === "hibernate") this.hibernateCommitted = true;
4479
- }
4480
- /**
4481
- * B-587: a hibernation that aborted hands the exit back. Returns the exit
4482
- * deferred meanwhile (the caller must run it now), or null.
4483
- */
4484
- release(intent) {
4485
- if (this.decided !== intent || intent === "hibernate" && this.hibernateCommitted) return null;
4486
- this.decided = null;
4487
- const deferred = this.deferred;
4488
- this.deferred = null;
4489
- return deferred;
4490
- }
4491
- }
4492
- function exitIntentFromArchiveFlag(archive) {
4493
- return archive ?? true ? "archive" : "offline";
4494
- }
4495
-
4496
4547
  function isUnsupportedSideQuestionError(error) {
4497
4548
  const message = error instanceof Error ? error.message : String(error);
4498
4549
  return /unknown|unsupported|not supported|unrecognized|invalid.*subtype/i.test(message);
@@ -4669,7 +4720,7 @@ function registerSideQuestionHandler(rpc, deps) {
4669
4720
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
4670
4721
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
4671
4722
  const fork = deps.run ?? (async (input) => {
4672
- const { query } = await Promise.resolve().then(function () { return require('./index-DFPT4HOO.cjs'); });
4723
+ const { query } = await Promise.resolve().then(function () { return require('./index-DmTlDRSL.cjs'); });
4673
4724
  return runSideQuestion(query, input);
4674
4725
  });
4675
4726
  const run = async (input, live) => {
@@ -4783,6 +4834,25 @@ function registerSideQuestionHandler(rpc, deps) {
4783
4834
  };
4784
4835
  }
4785
4836
 
4837
+ function replayClaudeForkJsonl(file, sink) {
4838
+ let replayed = 0;
4839
+ for (const line of file.split("\n")) {
4840
+ if (line.trim().length === 0) continue;
4841
+ let parsed;
4842
+ try {
4843
+ parsed = JSON.parse(line);
4844
+ } catch {
4845
+ continue;
4846
+ }
4847
+ const result = types.RawJSONLinesSchema.safeParse(parsed);
4848
+ if (!result.success) continue;
4849
+ sink.send(result.data);
4850
+ replayed += 1;
4851
+ }
4852
+ if (replayed > 0) sink.closeTurn();
4853
+ return replayed;
4854
+ }
4855
+
4786
4856
  const ANALYZE_MIN_INTERVAL_MS = 5 * 60 * 1e3;
4787
4857
  const HOURLY_LIMIT = 30;
4788
4858
  const HOURLY_WINDOW_MS = 60 * 60 * 1e3;
@@ -5072,24 +5142,28 @@ function resolveMessageMode(current, meta, ctx) {
5072
5142
  }
5073
5143
 
5074
5144
  exports.reportSessionEditToDaemon = controlClient.reportSessionEditToDaemon;
5145
+ exports.startHappyServer = deterministicJson.startHappyServer;
5146
+ exports.SessionExitGate = sessionExitLifecycle.SessionExitGate;
5147
+ exports.exitIntentFromArchiveFlag = sessionExitLifecycle.exitIntentFromArchiveFlag;
5148
+ exports.settleSessionOnExit = sessionExitLifecycle.settleSessionOnExit;
5075
5149
  exports.claudeCheckSession = systemPrompt.claudeCheckSession;
5076
5150
  exports.parseSpecialCommand = specialCommands.parseSpecialCommand;
5077
5151
  exports.contentLogMetadata = contentLogMetadata.contentLogMetadata;
5078
5152
  exports.RawJSONLinesSchema = types.RawJSONLinesSchema;
5079
5153
  exports.getProjectPath = path.getProjectPath;
5080
- exports.startHappyServer = deterministicJson.startHappyServer;
5081
5154
  exports.createSessionScanner = sessionScanner.createSessionScanner;
5082
5155
  exports.MessageQueue2 = registerKillSessionHandler.MessageQueue2;
5083
5156
  exports.registerKillSessionHandler = registerKillSessionHandler.registerKillSessionHandler;
5084
5157
  exports.getEnvironmentInfo = doctor.getEnvironmentInfo;
5085
5158
  exports.EditReportThrottle = editPaths.EditReportThrottle;
5086
5159
  exports.extractClaudeEditPaths = editPaths.extractClaudeEditPaths;
5160
+ exports.snapshotTree = processTreeSnapshot.snapshotTree;
5161
+ exports.terminateSurvivors = processTreeSnapshot.terminateSurvivors;
5087
5162
  exports.TitleGenerator = titleGenerator.TitleGenerator;
5088
5163
  exports.createSelfReportState = reportProgressTool.createSelfReportState;
5089
5164
  exports.BoardAnalyzer = BoardAnalyzer;
5090
5165
  exports.FileRateLimiter = FileRateLimiter;
5091
5166
  exports.PrewarmHookGate = PrewarmHookGate;
5092
- exports.SessionExitGate = SessionExitGate;
5093
5167
  exports.acquirePrewarmSlot = acquirePrewarmSlot;
5094
5168
  exports.claudeModeHash = claudeModeHash;
5095
5169
  exports.claudePrewarmEligibility = claudePrewarmEligibility;
@@ -5098,7 +5172,6 @@ exports.cleanupHookSettingsFile = cleanupHookSettingsFile;
5098
5172
  exports.createClaudePrewarmLease = createClaudePrewarmLease;
5099
5173
  exports.disposeAllClaudePrewarms = disposeAllClaudePrewarms;
5100
5174
  exports.evaluatePrewarmPrediction = evaluatePrewarmPrediction;
5101
- exports.exitIntentFromArchiveFlag = exitIntentFromArchiveFlag;
5102
5175
  exports.formatPrewarmLine = formatPrewarmLine;
5103
5176
  exports.generateHookSettingsFile = generateHookSettingsFile;
5104
5177
  exports.loop = loop;
@@ -5107,8 +5180,8 @@ exports.prewarmPredictionMeta = prewarmPredictionMeta;
5107
5180
  exports.prewarmSlotDir = prewarmSlotDir;
5108
5181
  exports.readPrewarmCache = readPrewarmCache;
5109
5182
  exports.registerSideQuestionHandler = registerSideQuestionHandler;
5183
+ exports.replayClaudeForkJsonl = replayClaudeForkJsonl;
5110
5184
  exports.resolveMessageMode = resolveMessageMode;
5111
- exports.settleSessionOnExit = settleSessionOnExit;
5112
5185
  exports.startHookServer = startHookServer;
5113
5186
  exports.withAssistantDenylist = withAssistantDenylist;
5114
5187
  exports.writePrewarmCache = writePrewarmCache;