very-happy-cli 0.2.177 → 0.2.179

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 (203) hide show
  1. package/dist/{AcpBackend-B0K0WrtW.mjs → AcpBackend-CHp3y7cb.mjs} +135 -16
  2. package/dist/{AcpBackend-B-ny68XM.cjs → AcpBackend-DFipFF7-.cjs} +135 -16
  3. package/dist/{AcpSessionManager-CjdJLofq.cjs → AcpSessionManager-0zpvRJXc.cjs} +38 -4
  4. package/dist/{AcpSessionManager-DykjzBM4.mjs → AcpSessionManager-d2-rKWWa.mjs} +38 -4
  5. package/dist/{BasePermissionHandler-DR6nxuEn.cjs → BasePermissionHandler-CH3zuEkA.cjs} +5 -2
  6. package/dist/{BasePermissionHandler-hdY7kTqX.mjs → BasePermissionHandler-DdZBYIR4.mjs} +5 -2
  7. package/dist/acpSessionResume-DTGmAPLt.mjs +67 -0
  8. package/dist/acpSessionResume-oiCBnAVA.cjs +74 -0
  9. package/dist/{agentHome-BdTXEUPe.cjs → agentHome-BWcz8mz0.cjs} +5 -5
  10. package/dist/{agentHome-GRN2VfHv.mjs → agentHome-CghLvL_1.mjs} +5 -5
  11. package/dist/{api-BWX10o97.cjs → api-Cmjfr8Z7.cjs} +29 -261
  12. package/dist/{api-CKBViqI3.mjs → api-CzwFpJQc.mjs} +22 -254
  13. package/dist/{apiMachine-DttO4UFj.mjs → apiMachine-DJkTEiqy.mjs} +53 -16
  14. package/dist/{apiMachine-BYYFGgFs.cjs → apiMachine-G6OogT08.cjs} +53 -16
  15. package/dist/{attachmentContent-cPVF463_.mjs → attachmentContent-B2os4HbA.mjs} +2 -2
  16. package/dist/{attachmentContent-kJKXpkMX.cjs → attachmentContent-Bo0UAsSu.cjs} +4 -4
  17. package/dist/{auth-BmESeKuM.mjs → auth-BS6PaOOG.mjs} +6 -6
  18. package/dist/{auth-CTECt2Oz.cjs → auth-D6bBUwZa.cjs} +6 -6
  19. package/dist/{auth-CKdXb9zp.mjs → auth-DMX0xPNK.mjs} +9 -9
  20. package/dist/{auth-DNxVmVbn.cjs → auth-HEhRaNgL.cjs} +9 -9
  21. package/dist/{authRelay-DSAvg1uv.mjs → authRelay-DhQhkBvX.mjs} +1 -1
  22. package/dist/{authRelay-BdYkC1Po.cjs → authRelay-Dy1qU9td.cjs} +1 -0
  23. package/dist/{auto-D1ypjjfx.cjs → auto-C6I55iOh.cjs} +19 -18
  24. package/dist/{auto-Ch3203qd.mjs → auto-Cl1SEDcD.mjs} +19 -18
  25. package/dist/{bootstrap-6OI698q9.cjs → bootstrap-exVucYav.cjs} +2 -2
  26. package/dist/{bootstrap-C0s2bPFQ.mjs → bootstrap-iuyufnp3.mjs} +2 -2
  27. package/dist/{browser-DG6Uof5O.cjs → browser-BohJK12g.cjs} +1 -1
  28. package/dist/{browser-BlLWZUMx.mjs → browser-CSYum7xH.mjs} +1 -1
  29. package/dist/{claudeLocal-CcWcKnoo.mjs → claudeLocal-Dq_R3Ax_.mjs} +6 -5
  30. package/dist/{claudeLocal-CemsIArT.cjs → claudeLocal-re4yjSTx.cjs} +6 -5
  31. package/dist/{claudeLocalLauncher-A4VuevIi.cjs → claudeLocalLauncher-B4hJHpCA.cjs} +11 -10
  32. package/dist/{claudeLocalLauncher-7p6y88nj.mjs → claudeLocalLauncher-CN67lN7-.mjs} +11 -10
  33. package/dist/{claudeSessionFork-BtROOjqf.mjs → claudeSessionFork-BihfD0Ik.mjs} +1 -1
  34. package/dist/{claudeSessionFork-CbDfm8Fz.cjs → claudeSessionFork-DiSMYerV.cjs} +1 -1
  35. package/dist/{client-DyvBTYee.cjs → client-BKcK1Bi-.cjs} +3 -3
  36. package/dist/client-BhoEBnuN.mjs +71 -0
  37. package/dist/{client-COmgDDy0.cjs → client-CuVdN6PP.cjs} +2 -2
  38. package/dist/{client-BPMWutfs.mjs → client-DuTDwWSQ.mjs} +3 -3
  39. package/dist/client-ZjOsn6nZ.cjs +76 -0
  40. package/dist/{client-DG5ndWLw.mjs → client-wo9nbxuf.mjs} +2 -2
  41. package/dist/codex/happyMcpStdioBridge.cjs +25 -16
  42. package/dist/codex/happyMcpStdioBridge.mjs +25 -16
  43. package/dist/{codexAppServerClient-D-Z8qSfI.mjs → codexAppServerClient-BK3zra_1.mjs} +3 -3
  44. package/dist/{codexAppServerClient-R24WZZfg.cjs → codexAppServerClient-Dt5zxrun.cjs} +3 -3
  45. package/dist/{codexCommand-CVTkZJ1o.mjs → codexCommand-B6pY7CMh.mjs} +66 -61
  46. package/dist/{codexCommand-6hW19gsq.cjs → codexCommand-CAZ1SLjg.cjs} +89 -84
  47. package/dist/{codexTermination-CCIfwzcx.mjs → codexTermination-Cd1Eon_4.mjs} +1 -1
  48. package/dist/{codexTermination-BBU7e92y.cjs → codexTermination-DmGbHxcD.cjs} +1 -1
  49. package/dist/{config-CvsNChKX.mjs → config-2oMG_fEI.mjs} +3 -3
  50. package/dist/{config-DhdrvOLV.cjs → config-B0uK6K7n.cjs} +3 -3
  51. package/dist/{configuration-DZPy0T9Z.cjs → configuration-CMHZnp6G.cjs} +1 -1
  52. package/dist/{configuration-D55F0t16.mjs → configuration-WMi4idBB.mjs} +1 -1
  53. package/dist/{connect-CwCXMRmD.mjs → connect-BLVHhHzA.mjs} +15 -15
  54. package/dist/{connect-Wz-XZYXW.cjs → connect-uaglGrde.cjs} +15 -15
  55. package/dist/{context-BKbrZ55r.cjs → context-DXzU5bFM.cjs} +1 -1
  56. package/dist/{context-CCRpVXFo.mjs → context-DploEcoN.mjs} +1 -1
  57. package/dist/{controlClient-C4xB5J6O.mjs → controlClient-BWUJrj3t.mjs} +3 -3
  58. package/dist/{controlClient-SX8gSza2.cjs → controlClient-C-5qCt8W.cjs} +3 -3
  59. package/dist/{createSessionMetadata-Bi-m0Y_O.mjs → createSessionMetadata-3uXrJgOW.mjs} +2 -2
  60. package/dist/{createSessionMetadata-BCFmYlBo.cjs → createSessionMetadata-BkIzHALd.cjs} +2 -2
  61. package/dist/{defaultPermissionMode-wBcbBezm.mjs → defaultPermissionMode-BzxLh20a.mjs} +2 -2
  62. package/dist/{defaultPermissionMode-DMBEnXll.cjs → defaultPermissionMode-pS3vmiSg.cjs} +2 -2
  63. package/dist/{deterministicJson-ChGfQEF6.cjs → deterministicJson-B8z2GPi9.cjs} +220 -14
  64. package/dist/{deterministicJson-BkQETt8_.mjs → deterministicJson-D_whDMFd.mjs} +217 -12
  65. package/dist/{doctor-BsN3JZJn.cjs → doctor-Br1Kcy2J.cjs} +8 -8
  66. package/dist/{doctor-B9c2C9dF.mjs → doctor-CmtSsR2-.mjs} +8 -8
  67. package/dist/{downloadTarget-Dj3WoVJa.cjs → downloadTarget-BQJK_6oH.cjs} +6 -6
  68. package/dist/{downloadTarget-ByXzbDK4.mjs → downloadTarget-BoNwTIH_.mjs} +6 -6
  69. package/dist/{ensureDaemonRunning-7Wb8M7Lv.cjs → ensureDaemonRunning-BRUmsq6J.cjs} +5 -5
  70. package/dist/{ensureDaemonRunning--HYzs5Ce.mjs → ensureDaemonRunning-Czo9IHJQ.mjs} +5 -5
  71. package/dist/{handleResumeCommand-DHddBkNJ.mjs → handleResumeCommand-C8thKjqf.mjs} +22 -6
  72. package/dist/{handleResumeCommand-OmuUGYjQ.cjs → handleResumeCommand-tKD_Hpxc.cjs} +22 -6
  73. package/dist/{index-CrR4JISa.cjs → index-B0UjHlAe.cjs} +5 -5
  74. package/dist/{index-BzJNDsJq.mjs → index-BTxHphpV.mjs} +254 -49
  75. package/dist/index-BiyC7cZ3.mjs +18 -0
  76. package/dist/{index-De8L5lFK.cjs → index-C6O2vVjm.cjs} +156 -34
  77. package/dist/index-CUuc6iCn.cjs +24 -0
  78. package/dist/{index-Dhl6_bw7.mjs → index-CdQI0C9p.mjs} +5 -5
  79. package/dist/{index-D9NoYc5I.cjs → index-D09T1m8Y.cjs} +3 -3
  80. package/dist/{index-CEm0MYiS.mjs → index-D3bidoG8.mjs} +3 -3
  81. package/dist/{index-BRJzH4sc.cjs → index-DMqDMT1Q.cjs} +257 -52
  82. package/dist/{index-DMy3OCBe.mjs → index-DPOa4NhL.mjs} +154 -35
  83. package/dist/index.cjs +2 -2
  84. package/dist/index.mjs +2 -2
  85. package/dist/{install-BdvKiOQw.mjs → install-BX3lv3NO.mjs} +1 -1
  86. package/dist/{install-Cf6AFSWC.cjs → install-BXvf2E3o.cjs} +1 -1
  87. package/dist/{install-1qn-D9FS.cjs → install-CYRZxS87.cjs} +3 -3
  88. package/dist/{install-BDIUtPXi.mjs → install-hnve_9vq.mjs} +3 -3
  89. package/dist/lib.cjs +14 -14
  90. package/dist/lib.d.cts +65 -1
  91. package/dist/lib.d.mts +65 -1
  92. package/dist/lib.mjs +14 -14
  93. package/dist/{lidState-BqVsw7H1.mjs → lidState-Bb8fgXg3.mjs} +2 -2
  94. package/dist/{lidState-DxbK0qfu.cjs → lidState-Dv2wwFTj.cjs} +2 -2
  95. package/dist/{localHappyAgentAuth-D5tANdRD.cjs → localHappyAgentAuth-DjYvkXvV.cjs} +2 -2
  96. package/dist/{localHappyAgentAuth-Ce8kO2yc.mjs → localHappyAgentAuth-NEU7fax7.mjs} +2 -2
  97. package/dist/{logger-13cBr_ew.mjs → logger-BtVhHnD8.mjs} +2 -2
  98. package/dist/{logger-LvwVeATU.cjs → logger-C1GWx3gi.cjs} +2 -2
  99. package/dist/{machineMetadata-29h7vgf4.cjs → machineMetadata-CLHS9sv_.cjs} +3 -3
  100. package/dist/{machineMetadata-dMida2qq.mjs → machineMetadata-D-g--oU_.mjs} +3 -3
  101. package/dist/{main-x4nAhdH5.mjs → main-B2LWV8DI.mjs} +59 -46
  102. package/dist/{main-DpM5jaFH.cjs → main-CWhSsbtU.cjs} +59 -46
  103. package/dist/{mcp-DQv3caXs.cjs → mcp-CARUsXHV.cjs} +15 -15
  104. package/dist/{mcp-DMiFGYMT.mjs → mcp-ext92q3Y.mjs} +15 -15
  105. package/dist/{mirrorProtocol-Bz8tEabR.mjs → mirrorProtocol-BwYibqry.mjs} +3 -3
  106. package/dist/{mirrorProtocol-BfrERW7Z.cjs → mirrorProtocol-DEy2g1CB.cjs} +3 -3
  107. package/dist/{package-CjlsAaRe.mjs → package-BPPebGQF.mjs} +7 -7
  108. package/dist/{package-Ch9WGDV_.cjs → package-SgqTYsjn.cjs} +7 -7
  109. package/dist/panels-BZ0_Tt7B.mjs +137 -0
  110. package/dist/panels-D1c7q2dD.cjs +142 -0
  111. package/dist/{peerTools-CxmrKnfV.mjs → peerTools-CWKzcQ7u.mjs} +60 -10
  112. package/dist/{peerTools-DtGKWli5.cjs → peerTools-DRQETXaz.cjs} +60 -9
  113. package/dist/{persistence-DXbKOHxl.cjs → persistence-BegE7NPa.cjs} +14 -3
  114. package/dist/{persistence-C_tYtOqK.mjs → persistence-Cr-wutZ4.mjs} +14 -4
  115. package/dist/{piRunnerArgs-BVRZe2AR.cjs → piRunnerArgs-Cs-378Vz.cjs} +8 -2
  116. package/dist/{piRunnerArgs-BpHc-JZl.mjs → piRunnerArgs-DwvM_yWA.mjs} +7 -1
  117. package/dist/{piRuntime-D7eio8Ix.cjs → piRuntime-BG-1td_n.cjs} +2 -2
  118. package/dist/{piRuntime-DOdGF395.mjs → piRuntime-Bue5mnlc.mjs} +2 -2
  119. package/dist/{piTerminal-dpxz4Q8D.mjs → piTerminal-B5x9X5yV.mjs} +18 -18
  120. package/dist/{piTerminal-y_PRo2NY.cjs → piTerminal-G4z-xVyy.cjs} +18 -18
  121. package/dist/processTreeSnapshot-CuLJDNC-.mjs +101 -0
  122. package/dist/processTreeSnapshot-mDbnuojn.cjs +105 -0
  123. package/dist/prompt-BOouDaTM.mjs +99 -0
  124. package/dist/prompt-lgF9IE82.cjs +105 -0
  125. package/dist/{attachmentLimits-Di1Z93lN.mjs → pushNotifications-BdFjDjQe.mjs} +303 -3
  126. package/dist/{attachmentLimits-DtFqqiwR.cjs → pushNotifications-DaLQUyi0.cjs} +304 -2
  127. package/dist/{index-DFPT4HOO.cjs → query-Ctfg-5gy.cjs} +25 -5
  128. package/dist/{index-CEjJnq05.mjs → query-DYP_W1wp.mjs} +26 -3
  129. package/dist/{rateLimitWindows-DYHDGuzQ.mjs → rateLimitWindows-CuEqk_0g.mjs} +1 -1
  130. package/dist/{rateLimitWindows-DFnMU2Vt.cjs → rateLimitWindows-Dj_8voBK.cjs} +1 -1
  131. package/dist/{registerCommonHandlers-D8OMpBbQ.mjs → registerCommonHandlers-BAlP7SGc.mjs} +2 -2
  132. package/dist/{registerCommonHandlers-60VuTkdg.cjs → registerCommonHandlers-Cj084Sg7.cjs} +2 -2
  133. package/dist/{registerKillSessionHandler-Drhf7-Vz.mjs → registerKillSessionHandler-PD0jWtQo.mjs} +6 -6
  134. package/dist/{registerKillSessionHandler-pqChBKwO.cjs → registerKillSessionHandler-qMju0ZfF.cjs} +6 -6
  135. package/dist/{remoteSessionClient-B7NvjHD3.cjs → remoteSessionClient-B7i7MkYV.cjs} +5 -5
  136. package/dist/{remoteSessionClient-D01Hso2-.mjs → remoteSessionClient-Bn2qu5C5.mjs} +5 -5
  137. package/dist/{reportProgressTool-Du_zAK4h.cjs → reportProgressTool-CM1JFAHg.cjs} +84 -2
  138. package/dist/{reportProgressTool-B203EZCR.mjs → reportProgressTool-gHItlSzz.mjs} +82 -3
  139. package/dist/{resources-JDPugcDq.cjs → resources-CvIlkzpP.cjs} +30 -0
  140. package/dist/{resources-BdFBQi8r.mjs → resources-y9jfyO-_.mjs} +30 -0
  141. package/dist/{run-DX4Zs3Ug.mjs → run-BM4TxiyN.mjs} +249 -45
  142. package/dist/{run-DZ5jU53c.cjs → run-CNXwIe0A.cjs} +263 -59
  143. package/dist/{runClaude-ClRhHpwR.cjs → runClaude-CWhj2V4Q.cjs} +37 -41
  144. package/dist/{runClaude-CgPHXP0L.mjs → runClaude-C_3I8hvR.mjs} +37 -41
  145. package/dist/{runClaudeDeps-D2v_WDSL.cjs → runClaudeDeps-B81cOKnH.cjs} +295 -157
  146. package/dist/{runClaudeDeps-Dz2iydq4.mjs → runClaudeDeps-QGrOeDe2.mjs} +295 -160
  147. package/dist/{runGemini-DBXxpoY8.mjs → runGemini-BEdWEZLR.mjs} +61 -55
  148. package/dist/{runGemini-BtZqGFkp.cjs → runGemini-CgRLYbt5.cjs} +61 -55
  149. package/dist/{runOpenClaw-D8q8G57u.cjs → runOpenClaw-C1NVmzOL.cjs} +19 -19
  150. package/dist/{runOpenClaw-BOHpzCEU.mjs → runOpenClaw-DdQZAYj1.mjs} +19 -19
  151. package/dist/{sandbox-C452Vrsc.mjs → sandbox-DjQUdCMG.mjs} +5 -5
  152. package/dist/{sandbox-Cu9mMzjx.cjs → sandbox-nocIjliq.cjs} +5 -5
  153. package/dist/selfCheck-CjCF4C3v.mjs +85 -0
  154. package/dist/{selfCheck-gKa3uVr1.cjs → selfCheck-DCt4Uzbq.cjs} +36 -35
  155. package/dist/{send-B8HARi7x.mjs → send-Ct7X4pPU.mjs} +9 -9
  156. package/dist/{send-2Vb5eppI.cjs → send-Dydf_hwZ.cjs} +9 -9
  157. package/dist/{server-Db9Wuam3.cjs → server-CosABFbd.cjs} +7 -7
  158. package/dist/{server-BBWCIZyS.mjs → server-DTQGZMxh.mjs} +5 -5
  159. package/dist/{sessionLock-6qL_N6Rn.cjs → sessionLock-DokGab2R.cjs} +16 -3
  160. package/dist/{sessionLock-ZfvFVdUi.mjs → sessionLock-WYIyaVO4.mjs} +16 -4
  161. package/dist/{sessionOps-CdgbEJgf.mjs → sessionOps-BIGgRube.mjs} +11 -6
  162. package/dist/{sessionOps-Dmt7WUUs.cjs → sessionOps-S-qPBLFf.cjs} +11 -6
  163. package/dist/{sessionScanner-CQL_WSaC.cjs → sessionScanner-CIMM2hvZ.cjs} +3 -3
  164. package/dist/{sessionScanner-CNVaSNOn.mjs → sessionScanner-o5hnMi5e.mjs} +3 -3
  165. package/dist/{sessions-DTomHfFg.mjs → sessions-BJHEZpi2.mjs} +40 -18
  166. package/dist/{sessions-BJblG_Hx.cjs → sessions-JchI1w3z.cjs} +40 -17
  167. package/dist/{setupOfflineReconnection-DVA0VpQL.cjs → setupOfflineReconnection-CNiAt5ZP.cjs} +2 -2
  168. package/dist/{setupOfflineReconnection-C5trsV-j.mjs → setupOfflineReconnection-DMiBO2y9.mjs} +2 -2
  169. package/dist/{spawn-DRyNAqD8.cjs → spawn-6PD7nnoC.cjs} +49 -18
  170. package/dist/{spawn-CQJFgoOq.mjs → spawn-DgvUNYEo.mjs} +49 -18
  171. package/dist/{spawnAgents-CCjJifAW.cjs → spawnAgents-DsXgegHM.cjs} +37 -1
  172. package/dist/spawnAgents-P006Hqio.mjs +79 -0
  173. package/dist/{spawnHappyCLI-B_0RWxD4.mjs → spawnHappyCLI-CCOrEtf9.mjs} +1 -1
  174. package/dist/{spawnHappyCLI-ChniczJ5.cjs → spawnHappyCLI-Dywezwk6.cjs} +1 -1
  175. package/dist/{specialCommands-DkdFJi4N.mjs → specialCommands-DPcd9edP.mjs} +3 -3
  176. package/dist/{specialCommands-DbntVs0d.cjs → specialCommands-QxPpkGKf.cjs} +3 -3
  177. package/dist/{startFileWatcher-UQyTSRAP.mjs → startFileWatcher-DghDOCO4.mjs} +1 -1
  178. package/dist/{startFileWatcher-C292fhra.cjs → startFileWatcher-RECH5qY8.cjs} +1 -1
  179. package/dist/{streamRelay-_qCd873P.mjs → streamRelay-DMV_TXfS.mjs} +1 -1
  180. package/dist/{streamRelay-Cx01enfe.cjs → streamRelay-DlUWKUpo.cjs} +1 -1
  181. package/dist/{sync-C3p7-KLn.mjs → sync-CSe0Rf45.mjs} +1 -1
  182. package/dist/{sync-C7sxoUYG.cjs → sync-D23jbqVa.cjs} +1 -1
  183. package/dist/{systemPrompt-DtibzbRU.cjs → systemPrompt-BOy4kU4P.cjs} +4 -3
  184. package/dist/{systemPrompt-CdHOlyVW.mjs → systemPrompt-CFNKnh65.mjs} +4 -3
  185. package/dist/{teams-ujXr3AFn.mjs → teams-DyY669f0.mjs} +9 -9
  186. package/dist/{teams-D7O7TpVU.cjs → teams-Ov2BDT-A.cjs} +9 -9
  187. package/dist/{time-yEL6wHUF.mjs → time-65DcU6Jx.mjs} +1 -1
  188. package/dist/{time-Dg5tVB8S.cjs → time-CrwIMHta.cjs} +1 -1
  189. package/dist/{titleGenerator-BMEaDTwU.cjs → titleGenerator-CS_rh2_J.cjs} +9 -8
  190. package/dist/{titleGenerator-Dr-BtjzO.mjs → titleGenerator-CiAMxf7s.mjs} +9 -8
  191. package/dist/{todo-CvJe4M2C.mjs → todo-BDONw0sK.mjs} +7 -7
  192. package/dist/{todo-CUcFamGs.cjs → todo-KY-okGii.cjs} +7 -7
  193. package/dist/{tools-BrM3bZW5.mjs → tools-D8-PnZEG.mjs} +1 -1
  194. package/dist/{tools-DDKTB5aQ.cjs → tools-_w52DZG6.cjs} +1 -1
  195. package/dist/{uninstall-7oLuhYIu.cjs → uninstall-8vnLN-IE.cjs} +3 -3
  196. package/dist/{uninstall-CEcMMQGz.mjs → uninstall-_fjGRP9b.mjs} +3 -3
  197. package/dist/webPanels-B2_C2-3g.mjs +49 -0
  198. package/dist/webPanels-FCgFKvVe.cjs +53 -0
  199. package/package.json +7 -7
  200. package/dist/selfCheck-BAvqBwBR.mjs +0 -84
  201. package/dist/sessionModeFile-CWVq8AT9.mjs +0 -32
  202. package/dist/sessionModeFile-CsLtn_PL.cjs +0 -36
  203. package/dist/spawnAgents-BjtmjBvP.mjs +0 -45
@@ -1,83 +1,87 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-LvwVeATU.cjs');
4
- var controlClient = require('./controlClient-SX8gSza2.cjs');
3
+ var logger = require('./logger-C1GWx3gi.cjs');
4
+ var controlClient = require('./controlClient-C-5qCt8W.cjs');
5
5
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
6
+ var deterministicJson = require('./deterministicJson-B8z2GPi9.cjs');
7
+ var client = require('./client-ZjOsn6nZ.cjs');
6
8
  var node_crypto = require('node:crypto');
7
9
  var messageBuffer = require('./messageBuffer-fJMH6uY8.cjs');
8
- var index = require('./index-DFPT4HOO.cjs');
10
+ var query = require('./query-Ctfg-5gy.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-DtibzbRU.cjs');
13
+ var systemPrompt = require('./systemPrompt-BOy4kU4P.cjs');
12
14
  var path$1 = require('node:path');
13
- var specialCommands = require('./specialCommands-DbntVs0d.cjs');
15
+ var specialCommands = require('./specialCommands-QxPpkGKf.cjs');
14
16
  require('axios');
15
17
  require('node:events');
16
18
  require('socket.io-client');
17
- var attachmentLimits = require('./attachmentLimits-DtFqqiwR.cjs');
19
+ var pushNotifications = require('./pushNotifications-DaLQUyi0.cjs');
18
20
  require('tweetnacl');
19
- var configuration = require('./configuration-DZPy0T9Z.cjs');
20
- require('./index-De8L5lFK.cjs');
21
- require('./registerCommonHandlers-60VuTkdg.cjs');
21
+ var configuration = require('./configuration-CMHZnp6G.cjs');
22
+ require('./index-C6O2vVjm.cjs');
23
+ require('./registerCommonHandlers-Cj084Sg7.cjs');
22
24
  require('os');
23
25
  require('child_process');
24
26
  require('@paralleldrive/cuid2');
25
- require('./persistence-DXbKOHxl.cjs');
27
+ require('./persistence-BegE7NPa.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-Dg5tVB8S.cjs');
33
+ var time = require('./time-CrwIMHta.cjs');
32
34
  var node_fs = require('node:fs');
33
- var deterministicJson = require('./deterministicJson-ChGfQEF6.cjs');
34
- var sessionScanner = require('./sessionScanner-CQL_WSaC.cjs');
35
+ var sessionScanner = require('./sessionScanner-CIMM2hvZ.cjs');
35
36
  var node_child_process = require('node:child_process');
36
- var streamRelay = require('./streamRelay-Cx01enfe.cjs');
37
- var attachmentContent = require('./attachmentContent-kJKXpkMX.cjs');
37
+ var streamRelay = require('./streamRelay-DlUWKUpo.cjs');
38
+ var attachmentContent = require('./attachmentContent-Bo0UAsSu.cjs');
38
39
  var promises = require('node:fs/promises');
39
- var claudeSessionFork = require('./claudeSessionFork-CbDfm8Fz.cjs');
40
- var registerKillSessionHandler = require('./registerKillSessionHandler-pqChBKwO.cjs');
41
- var doctor = require('./doctor-BsN3JZJn.cjs');
40
+ var claudeSessionFork = require('./claudeSessionFork-DiSMYerV.cjs');
41
+ var registerKillSessionHandler = require('./registerKillSessionHandler-qMju0ZfF.cjs');
42
+ var doctor = require('./doctor-Br1Kcy2J.cjs');
42
43
  var node_http = require('node:http');
43
44
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
44
45
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
45
- var titleGenerator = require('./titleGenerator-BMEaDTwU.cjs');
46
+ var processTreeSnapshot = require('./processTreeSnapshot-mDbnuojn.cjs');
47
+ var titleGenerator = require('./titleGenerator-CS_rh2_J.cjs');
46
48
  var oneShotPrompts = require('./oneShotPrompts-CL0dip9C.cjs');
47
- var reportProgressTool = require('./reportProgressTool-Du_zAK4h.cjs');
49
+ var reportProgressTool = require('./reportProgressTool-CM1JFAHg.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-DFnMU2Vt.cjs');
51
+ require('./prompt-lgF9IE82.cjs');
54
52
  require('zod');
55
- require('./package-Ch9WGDV_.cjs');
56
- require('util');
57
- require('crypto');
58
- require('path');
59
- require('cross-spawn');
60
- require('./authRelay-BdYkC1Po.cjs');
61
- require('./client-DyvBTYee.cjs');
62
- require('./context-BKbrZ55r.cjs');
63
- require('./sessionOps-Dmt7WUUs.cjs');
64
- require('./resources-JDPugcDq.cjs');
65
- require('./tools-DDKTB5aQ.cjs');
66
- require('./peerTools-DtGKWli5.cjs');
53
+ require('./client-BKcK1Bi-.cjs');
54
+ require('./context-DXzU5bFM.cjs');
55
+ require('./sessionOps-S-qPBLFf.cjs');
56
+ require('./authRelay-Dy1qU9td.cjs');
57
+ require('./resources-CvIlkzpP.cjs');
58
+ require('./tools-_w52DZG6.cjs');
59
+ require('./peerTools-DRQETXaz.cjs');
60
+ require('node:os');
67
61
  require('./ids-B6ZC0HGt.cjs');
68
- require('./remoteSessionClient-B7NvjHD3.cjs');
62
+ require('./remoteSessionClient-B7i7MkYV.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-Dj3WoVJa.cjs');
66
+ require('./downloadTarget-BQJK_6oH.cjs');
73
67
  require('./terminals-B_bfC9c2.cjs');
74
68
  require('./terminalTitleSuggest-DhvRFX3H.cjs');
75
69
  require('./tmuxSocket-D-Xt6Vn-.cjs');
76
- require('./bootstrap-6OI698q9.cjs');
70
+ require('./bootstrap-exVucYav.cjs');
71
+ require('./package-SgqTYsjn.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-C7sxoUYG.cjs');
76
+ require('crypto');
77
+ require('./smallFastModel-D_uxGMo3.cjs');
78
+ require('./rateLimitWindows-Dj_8voBK.cjs');
79
+ require('util');
80
+ require('path');
81
+ require('cross-spawn');
82
+ require('./sync-D23jbqVa.cjs');
79
83
  require('./transcriptCursor-DcXGLeSc.cjs');
80
- require('./startFileWatcher-C292fhra.cjs');
84
+ require('./startFileWatcher-RECH5qY8.cjs');
81
85
  require('node:readline');
82
86
  require('./doctor-u46qYYKX.cjs');
83
87
  require('ps-list');
@@ -85,11 +89,11 @@ require('./doctorReadiness-BCZGcN0a.cjs');
85
89
  require('./detectCLI-DR9ZaN6B.cjs');
86
90
  require('fs');
87
91
  require('./cliUpdate-DsKXPFYp.cjs');
88
- require('./piRunnerArgs-BVRZe2AR.cjs');
89
- require('./sessionModeFile-CsLtn_PL.cjs');
92
+ require('./piRunnerArgs-Cs-378Vz.cjs');
93
+ require('./acpSessionResume-oiCBnAVA.cjs');
90
94
  require('url');
91
95
  require('node:module');
92
- require('./client-COmgDDy0.cjs');
96
+ require('./client-CuVdN6PP.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
  /**
@@ -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)),
@@ -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");
@@ -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-A4VuevIi.cjs'); });
4382
+ const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-B4hJHpCA.cjs'); });
4267
4383
  const result = await claudeLocalLauncher(session);
4268
4384
  switch (result.type) {
4269
4385
  case "switch":
@@ -4669,7 +4785,7 @@ function registerSideQuestionHandler(rpc, deps) {
4669
4785
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
4670
4786
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
4671
4787
  const fork = deps.run ?? (async (input) => {
4672
- const { query } = await Promise.resolve().then(function () { return require('./index-DFPT4HOO.cjs'); });
4788
+ const { query } = await Promise.resolve().then(function () { return require('./index-CUuc6iCn.cjs'); });
4673
4789
  return runSideQuestion(query, input);
4674
4790
  });
4675
4791
  const run = async (input, live) => {
@@ -4783,6 +4899,25 @@ function registerSideQuestionHandler(rpc, deps) {
4783
4899
  };
4784
4900
  }
4785
4901
 
4902
+ function replayClaudeForkJsonl(file, sink) {
4903
+ let replayed = 0;
4904
+ for (const line of file.split("\n")) {
4905
+ if (line.trim().length === 0) continue;
4906
+ let parsed;
4907
+ try {
4908
+ parsed = JSON.parse(line);
4909
+ } catch {
4910
+ continue;
4911
+ }
4912
+ const result = types.RawJSONLinesSchema.safeParse(parsed);
4913
+ if (!result.success) continue;
4914
+ sink.send(result.data);
4915
+ replayed += 1;
4916
+ }
4917
+ if (replayed > 0) sink.closeTurn();
4918
+ return replayed;
4919
+ }
4920
+
4786
4921
  const ANALYZE_MIN_INTERVAL_MS = 5 * 60 * 1e3;
4787
4922
  const HOURLY_LIMIT = 30;
4788
4923
  const HOURLY_WINDOW_MS = 60 * 60 * 1e3;
@@ -5072,18 +5207,20 @@ function resolveMessageMode(current, meta, ctx) {
5072
5207
  }
5073
5208
 
5074
5209
  exports.reportSessionEditToDaemon = controlClient.reportSessionEditToDaemon;
5210
+ exports.startHappyServer = deterministicJson.startHappyServer;
5075
5211
  exports.claudeCheckSession = systemPrompt.claudeCheckSession;
5076
5212
  exports.parseSpecialCommand = specialCommands.parseSpecialCommand;
5077
5213
  exports.contentLogMetadata = contentLogMetadata.contentLogMetadata;
5078
5214
  exports.RawJSONLinesSchema = types.RawJSONLinesSchema;
5079
5215
  exports.getProjectPath = path.getProjectPath;
5080
- exports.startHappyServer = deterministicJson.startHappyServer;
5081
5216
  exports.createSessionScanner = sessionScanner.createSessionScanner;
5082
5217
  exports.MessageQueue2 = registerKillSessionHandler.MessageQueue2;
5083
5218
  exports.registerKillSessionHandler = registerKillSessionHandler.registerKillSessionHandler;
5084
5219
  exports.getEnvironmentInfo = doctor.getEnvironmentInfo;
5085
5220
  exports.EditReportThrottle = editPaths.EditReportThrottle;
5086
5221
  exports.extractClaudeEditPaths = editPaths.extractClaudeEditPaths;
5222
+ exports.snapshotTree = processTreeSnapshot.snapshotTree;
5223
+ exports.terminateSurvivors = processTreeSnapshot.terminateSurvivors;
5087
5224
  exports.TitleGenerator = titleGenerator.TitleGenerator;
5088
5225
  exports.createSelfReportState = reportProgressTool.createSelfReportState;
5089
5226
  exports.BoardAnalyzer = BoardAnalyzer;
@@ -5107,6 +5244,7 @@ exports.prewarmPredictionMeta = prewarmPredictionMeta;
5107
5244
  exports.prewarmSlotDir = prewarmSlotDir;
5108
5245
  exports.readPrewarmCache = readPrewarmCache;
5109
5246
  exports.registerSideQuestionHandler = registerSideQuestionHandler;
5247
+ exports.replayClaudeForkJsonl = replayClaudeForkJsonl;
5110
5248
  exports.resolveMessageMode = resolveMessageMode;
5111
5249
  exports.settleSessionOnExit = settleSessionOnExit;
5112
5250
  exports.startHookServer = startHookServer;