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,36 +1,39 @@
1
1
  'use strict';
2
2
 
3
- var AcpBackend = require('./AcpBackend-CDkAQXYf.cjs');
4
- var logger = require('./logger-DXTWlPzP.cjs');
5
- var AcpSessionManager = require('./AcpSessionManager-DckmUZza.cjs');
6
- var index = require('./index-_l1Sdmbi.cjs');
3
+ var AcpBackend = require('./AcpBackend-DfRDtMcG.cjs');
4
+ var logger = require('./logger-CphW5nUE.cjs');
5
+ var AcpSessionManager = require('./AcpSessionManager-CASKOnOj.cjs');
6
+ var index = require('./index-Dv0Q48P3.cjs');
7
7
  var agentAttachments = require('./agentAttachments-Dbw8iMCZ.cjs');
8
- var configuration = require('./configuration-4TGMrjul.cjs');
9
- var attachmentContent = require('./attachmentContent-bpQTBJ0y.cjs');
10
- var piRuntime = require('./piRuntime-BHRT5MKO.cjs');
8
+ var configuration = require('./configuration-CYO-kPOS.cjs');
9
+ var attachmentContent = require('./attachmentContent-CEm13_gF.cjs');
10
+ var piRuntime = require('./piRuntime-CT5xv_3h.cjs');
11
11
  var node_crypto = require('node:crypto');
12
12
  var path = require('node:path');
13
- var api = require('./api-JANhFdZV.cjs');
14
- var registerKillSessionHandler = require('./registerKillSessionHandler-DYl7l4Ts.cjs');
15
- var deterministicJson = require('./deterministicJson-BjNQsAjO.cjs');
16
- var persistence = require('./persistence-BfX72dne.cjs');
17
- var machineMetadata = require('./machineMetadata-DcUupMje.cjs');
18
- var createSessionMetadata = require('./createSessionMetadata-B2NynaWZ.cjs');
19
- var setupOfflineReconnection = require('./setupOfflineReconnection-C2EeYTFH.cjs');
20
- var controlClient = require('./controlClient-BTaZlbC6.cjs');
13
+ var api = require('./api-DM7b1OKj.cjs');
14
+ var deterministicJson = require('./deterministicJson-xqA6DaOm.cjs');
15
+ var client = require('./client-DJplzPjD.cjs');
16
+ var registerKillSessionHandler = require('./registerKillSessionHandler-CIsvBrVe.cjs');
17
+ var persistence = require('./persistence-9BMYspxG.cjs');
18
+ var machineMetadata = require('./machineMetadata-BQm9YTcI.cjs');
19
+ var createSessionMetadata = require('./createSessionMetadata-xz767pcG.cjs');
20
+ var setupOfflineReconnection = require('./setupOfflineReconnection-DvvVX3TB.cjs');
21
+ var startupSessionCreate = require('./startupSessionCreate-kdr3m1uX.cjs');
22
+ var controlClient = require('./controlClient-Bqv5v5OM.cjs');
21
23
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
22
- var streamRelay = require('./streamRelay-9kBPpbvU.cjs');
23
- var projectPath = require('./projectPath-ChLhdOyt.cjs');
24
- var BasePermissionHandler = require('./BasePermissionHandler-DyLmKKtO.cjs');
25
- var titleGenerator = require('./titleGenerator-D26gvNaS.cjs');
26
- var sessionModeFile = require('./sessionModeFile-CLLdidiJ.cjs');
24
+ var sessionLock = require('./sessionLock-DRZUcKHT.cjs');
25
+ var acpSessionResume = require('./acpSessionResume-CR5pmgVo.cjs');
26
+ var streamRelay = require('./streamRelay-Dy6amlzx.cjs');
27
+ var projectPath = require('./projectPath-C3ioB4Bu.cjs');
28
+ var BasePermissionHandler = require('./BasePermissionHandler-BlM_tfej.cjs');
29
+ var titleGenerator = require('./titleGenerator-Cgp5ihFb.cjs');
27
30
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
28
31
  require('node:child_process');
29
32
  require('@agentclientprotocol/sdk');
30
- require('./time-A6zR3Iy6.cjs');
33
+ require('./time-Cjv0zxQO.cjs');
31
34
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
32
35
  require('./processTree-CMHWlVse.cjs');
33
- require('./package-DY4zTbKS.cjs');
36
+ require('./package-KhLqBDX9.cjs');
34
37
  require('chalk');
35
38
  require('node:util');
36
39
  require('node:fs');
@@ -38,49 +41,52 @@ require('@paralleldrive/cuid2');
38
41
  require('zod');
39
42
  require('node:os');
40
43
  require('node:fs/promises');
41
- require('./attachmentLimits-SqeAHrVC.cjs');
42
- require('./resources-JDPugcDq.cjs');
44
+ require('./pushNotifications-DI92havG.cjs');
43
45
  require('axios');
44
- require('./lidState-BeOwj6eW.cjs');
46
+ require('./resources-CvIlkzpP.cjs');
47
+ require('./lidState-DWGnm2H4.cjs');
45
48
  require('os');
46
49
  require('child_process');
47
50
  require('node:events');
48
51
  require('socket.io-client');
49
52
  require('./limits-C-a7gr04.cjs');
50
- require('./registerCommonHandlers-C0_fyBQ0.cjs');
53
+ require('./registerCommonHandlers-C7a_dUWs.cjs');
51
54
  require('util');
52
55
  require('fs/promises');
53
56
  require('crypto');
54
57
  require('path');
55
58
  require('cross-spawn');
56
- require('./sync-Dhmtk66S.cjs');
59
+ require('./sync-Bn-idAoy.cjs');
57
60
  require('./backgroundTaskActivity-CBvUdj39.cjs');
58
- require('tweetnacl');
59
- require('./types-CRS-srZK.cjs');
60
- require('./client-Dnza1hgN.cjs');
61
- require('./context-JoKu0V54.cjs');
62
- require('./sessionOps-BAnr7n8t.cjs');
63
- require('./tools-CxJp4T1T.cjs');
64
- require('./reportProgressTool-B9nCzbkL.cjs');
65
- require('./client-C4zKGjiJ.cjs');
61
+ require('./prompt-lgF9IE82.cjs');
62
+ require('./reportProgressTool-14AXr959.cjs');
63
+ require('./client-BWjaHKtj.cjs');
66
64
  require('./precheckCompat-CWOi5c9L.cjs');
67
65
  require('./agentGuidance-BtBx2xxE.cjs');
68
66
  require('./trimIdent-4gvk9Wk6.cjs');
69
- require('./peerTools-iy3_6Yc5.cjs');
67
+ require('./client-D_loZ9IK.cjs');
68
+ require('./context-6TP-iz_c.cjs');
69
+ require('./sessionOps-BrGiU9-s.cjs');
70
+ require('./tools-BL7Byl_x.cjs');
71
+ require('./peerTools-DQNlrcqM.cjs');
70
72
  require('./ids-B6ZC0HGt.cjs');
71
- require('./remoteSessionClient-BRTIOX5b.cjs');
73
+ require('./remoteSessionClient-D843fkzL.cjs');
72
74
  require('@modelcontextprotocol/sdk/server/mcp.js');
73
75
  require('node:http');
74
76
  require('@modelcontextprotocol/sdk/server/streamableHttp.js');
75
- require('./downloadTarget-BN5vZt3K.cjs');
77
+ require('./downloadTarget-CEb9che-.cjs');
76
78
  require('./terminals-B_bfC9c2.cjs');
77
79
  require('./terminalTitleSuggest-DhvRFX3H.cjs');
78
80
  require('./tmuxSocket-D-Xt6Vn-.cjs');
79
- require('./bootstrap-DCQ87Aan.cjs');
81
+ require('./bootstrap-DoA7okld.cjs');
82
+ require('./webPanels-FCgFKvVe.cjs');
80
83
  require('./previewPath-B0rBdhy1.cjs');
81
- require('./detectCLI-DR9ZaN6B.cjs');
84
+ require('tweetnacl');
85
+ require('./types-CRS-srZK.cjs');
86
+ require('./detectCLI-BuYR_Qxe.cjs');
82
87
  require('fs');
83
- require('./localHappyAgentAuth-Br-mgogg.cjs');
88
+ require('./localHappyAgentAuth-DZHQnIW9.cjs');
89
+ require('./processTreeSnapshot-mDbnuojn.cjs');
84
90
  require('url');
85
91
  require('node:module');
86
92
  require('./oneShotPrompts-CL0dip9C.cjs');
@@ -128,6 +134,113 @@ function describeAcpTurnFailure(agentName, error) {
128
134
  return { message: `${agentName} error: ${oneLine(detailOf(error))}`, exited: false };
129
135
  }
130
136
 
137
+ const OUT_OF_TURN_QUIET_MS = 6e4;
138
+ function isAcpTurnContent(msg) {
139
+ if (msg.type === "model-output") return typeof msg.textDelta === "string" && msg.textDelta.length > 0;
140
+ if (msg.type === "tool-call" || msg.type === "tool-result") return true;
141
+ return msg.type === "event" && msg.name === "thinking";
142
+ }
143
+ function outOfTurnAction(msg, state) {
144
+ if (state.inPromptTurn || !state.backendStarted) return null;
145
+ if (msg.type === "status" && msg.status === "idle") return state.open ? "end" : null;
146
+ if (!isAcpTurnContent(msg)) return null;
147
+ return state.open ? "touch" : "start";
148
+ }
149
+
150
+ function createPiSteerChannel() {
151
+ let nextId = 0;
152
+ const pending = [];
153
+ const waiters = /* @__PURE__ */ new Set();
154
+ const offers = /* @__PURE__ */ new Map();
155
+ let ready = false;
156
+ const readyListeners = [];
157
+ const hand = () => {
158
+ while (pending.length > 0 && waiters.size > 0) {
159
+ const waiter = waiters.values().next().value;
160
+ waiters.delete(waiter);
161
+ const item = pending.shift();
162
+ const offer = offers.get(item.id);
163
+ if (offer) offer.taken = true;
164
+ waiter(item);
165
+ }
166
+ };
167
+ return {
168
+ get ready() {
169
+ return ready;
170
+ },
171
+ /** The extension announced itself (first contact). */
172
+ hello() {
173
+ if (ready) return;
174
+ ready = true;
175
+ for (const listener of readyListeners.splice(0)) listener();
176
+ },
177
+ onReady(listener) {
178
+ if (ready) listener();
179
+ else readyListeners.push(listener);
180
+ },
181
+ /** Wrapper side: hand `text` to the running turn; true = pi took it. */
182
+ offer(text, timeoutMs) {
183
+ const item = { id: ++nextId, text };
184
+ return new Promise((resolve) => {
185
+ const timer = setTimeout(() => {
186
+ const offer = offers.get(item.id);
187
+ offers.delete(item.id);
188
+ const index = pending.findIndex((p) => p.id === item.id);
189
+ if (index >= 0) pending.splice(index, 1);
190
+ resolve(offer?.taken === true);
191
+ }, timeoutMs);
192
+ timer.unref?.();
193
+ offers.set(item.id, {
194
+ taken: false,
195
+ settle: (delivered) => {
196
+ clearTimeout(timer);
197
+ offers.delete(item.id);
198
+ resolve(delivered);
199
+ }
200
+ });
201
+ pending.push(item);
202
+ hand();
203
+ });
204
+ },
205
+ /** Extension side (long poll): the next message, or null after `waitMs`. */
206
+ take(waitMs, signal) {
207
+ return new Promise((resolve) => {
208
+ const done = () => {
209
+ clearTimeout(timer);
210
+ signal?.removeEventListener("abort", onAbort);
211
+ };
212
+ const waiter = (item) => {
213
+ done();
214
+ resolve(item);
215
+ };
216
+ const onAbort = () => {
217
+ waiters.delete(waiter);
218
+ done();
219
+ resolve(null);
220
+ };
221
+ const timer = setTimeout(() => {
222
+ waiters.delete(waiter);
223
+ done();
224
+ resolve(null);
225
+ }, waitMs);
226
+ timer.unref?.();
227
+ if (signal?.aborted) {
228
+ resolve(null);
229
+ clearTimeout(timer);
230
+ return;
231
+ }
232
+ signal?.addEventListener("abort", onAbort, { once: true });
233
+ waiters.add(waiter);
234
+ hand();
235
+ });
236
+ },
237
+ /** Extension side: what happened to a taken message (false: pi was no longer running). */
238
+ ack(id, delivered) {
239
+ offers.get(id)?.settle(delivered);
240
+ }
241
+ };
242
+ }
243
+
131
244
  const SUPPORTED_CATEGORIES = /* @__PURE__ */ new Set(["mode", "model", "thought_level"]);
132
245
  function isRecord$1(value) {
133
246
  return !!value && typeof value === "object";
@@ -637,6 +750,7 @@ class GenericAcpPermissionHandler extends BasePermissionHandler.BasePermissionHa
637
750
  });
638
751
  }
639
752
  }
753
+ const PI_STEER_OFFER_TIMEOUT_MS = 5e3;
640
754
  function resolveSessionFlavor(agentName) {
641
755
  if (agentName === "gemini") {
642
756
  return "gemini";
@@ -665,12 +779,45 @@ async function runAcp(opts) {
665
779
  machineId: settings.machineId,
666
780
  startedBy: opts.startedBy,
667
781
  sandbox: settings.sandboxConfig,
668
- capabilities: [index.PROMPT_QUEUE_CAPABILITY]
782
+ capabilities: [index.PROMPT_QUEUE_CAPABILITY, index.PROJECT_SESSION_CAPABILITY]
669
783
  });
670
784
  metadata.attachmentKinds = [];
671
- const response = await api$1.getOrCreateSession({ tag: sessionTag, metadata, state });
785
+ const reconnect = acpSessionResume.readAcpReconnectEnv(process.env);
786
+ let response;
787
+ if (reconnect) {
788
+ logger.logger.debug(`[acp] Reconnecting to existing session ${reconnect.sessionId}`);
789
+ response = {
790
+ id: reconnect.sessionId,
791
+ seq: reconnect.seq,
792
+ encryptionKey: authRelay.decodeBase64(reconnect.encryptionKey),
793
+ encryptionVariant: reconnect.encryptionVariant,
794
+ metadata,
795
+ metadataVersion: reconnect.metadataVersion,
796
+ agentState: state,
797
+ agentStateVersion: reconnect.agentStateVersion
798
+ };
799
+ } else {
800
+ response = await startupSessionCreate.createSessionForStartup(() => api$1.getOrCreateSession({ tag: sessionTag, metadata, state }), { startedBy: opts.startedBy, log: (m) => logger.logger.debug(m) });
801
+ }
672
802
  if (response) {
673
803
  logAcp("muted", `Happy Session ID: ${response.id}`);
804
+ await sessionLock.claimSessionOrExit(response.id, { takeover: !!reconnect, flavor: resolveSessionFlavor(opts.agentName) });
805
+ }
806
+ if (reconnect && response && !await api$1.reactivateSession(response.id)) {
807
+ throw new Error(`Failed to reactivate archived session ${response.id}`);
808
+ }
809
+ let reconnectSeeded = false;
810
+ let resumedPermissionMode = null;
811
+ if (reconnect && response) {
812
+ const snapshot = await api$1.getSession(response.id, response.encryptionKey, response.encryptionVariant);
813
+ if (snapshot.ok) {
814
+ response = sessionLock.applyServerSnapshot(response, snapshot.session);
815
+ reconnectSeeded = true;
816
+ resumedPermissionMode = acpSessionResume.normalizeAcpPermissionMode(snapshot.session.metadata?.permissionMode) ?? null;
817
+ } else {
818
+ response = sessionLock.withoutServerSnapshot(response);
819
+ logger.logger.debug(`[acp] Reconnect without server snapshot (${snapshot.reason}); skipping existing messages`);
820
+ }
674
821
  }
675
822
  let session;
676
823
  let permissionHandler;
@@ -680,6 +827,7 @@ async function runAcp(opts) {
680
827
  metadata,
681
828
  state,
682
829
  response,
830
+ sessionClientOptions: reconnectSeeded && response ? { initialSeq: response.seq } : void 0,
683
831
  onSessionSwap: (newSession) => {
684
832
  session = newSession;
685
833
  if (permissionHandler) {
@@ -689,6 +837,12 @@ async function runAcp(opts) {
689
837
  }
690
838
  });
691
839
  session = initialSession;
840
+ if (reconnect) {
841
+ session.suppressNextArchiveSignal();
842
+ if (!reconnectSeeded) session.skipExistingMessages();
843
+ void session.cancelUndeliveredQueuedInputs();
844
+ session.updateMetadata((meta) => sessionLock.mergeReconnectMetadata(meta, metadata, Date.now()));
845
+ }
692
846
  if (response) {
693
847
  try {
694
848
  await controlClient.notifyDaemonSessionStarted(response.id, metadata, {
@@ -728,7 +882,7 @@ async function runAcp(opts) {
728
882
  let sawSlashCommands = false;
729
883
  let sawModes = false;
730
884
  let sawModels = false;
731
- const initialPermissionMode = opts.permissionMode ?? "default";
885
+ const initialPermissionMode = opts.permissionMode ?? resumedPermissionMode ?? "default";
732
886
  let fileBackedModeActive = false;
733
887
  const permissionModeIsFileBacked = () => opts.agentName === "pi" || !modeSelector && !legacyModes;
734
888
  let fileBackedPermissionMode = null;
@@ -737,7 +891,7 @@ async function runAcp(opts) {
737
891
  return true;
738
892
  }
739
893
  try {
740
- sessionModeFile.writeSessionModeFile(session.sessionId, mode);
894
+ acpSessionResume.writeSessionModeFile(session.sessionId, mode);
741
895
  } catch (error) {
742
896
  logger.logger.debug(`[${opts.agentName}] Failed to write session mode file:`, error);
743
897
  return false;
@@ -748,8 +902,15 @@ async function runAcp(opts) {
748
902
  return true;
749
903
  };
750
904
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
905
+ const piSteer = opts.agentName === "pi" ? createPiSteerChannel() : null;
906
+ piSteer?.onReady(() => {
907
+ logger.logger.debug(`[${opts.agentName}] pi extension connected to the steer channel`);
908
+ session.updateMetadata((current) => ({ ...current, capabilities: [.../* @__PURE__ */ new Set([...current.capabilities ?? [], index.PI_STEER_CAPABILITY])] }));
909
+ });
751
910
  const happyServer = await deterministicJson.startHappyServer(session, {
752
911
  assistant: isAssistantVariant,
912
+ ...piSteer ? { piSteer } : {},
913
+ push: { sendAttention: (input) => api$1.push().sendAttention(input) },
753
914
  ...opts.agentName === "pi" ? { onContextUsage: (contextUsage) => {
754
915
  session.updateAgentState((state2) => ({ ...state2, contextUsage }));
755
916
  } } : {}
@@ -771,6 +932,7 @@ async function runAcp(opts) {
771
932
  ...teamsPiEnv,
772
933
  HAPPY_MCP_URL: happyServer.url,
773
934
  ...happyServer.contextUsageUrl ? { HAPPY_CONTEXT_USAGE_URL: happyServer.contextUsageUrl } : {},
935
+ ...happyServer.steerUrl ? { HAPPY_PI_STEER_URL: happyServer.steerUrl } : {},
774
936
  HAPPY_SESSION_ID: session.sessionId,
775
937
  // B-497: sender identity for `very-happy sessions message|peers` in this shell.
776
938
  VH_PEER_SESSION_ID: session.sessionId,
@@ -783,6 +945,15 @@ async function runAcp(opts) {
783
945
  });
784
946
  let backend = createBackend();
785
947
  let thinking = false;
948
+ let outOfTurnTimer = null;
949
+ const endOutOfTurn = (reason) => {
950
+ if (!outOfTurnTimer) return;
951
+ clearTimeout(outOfTurnTimer);
952
+ outOfTurnTimer = null;
953
+ logger.logger.debug(`[${opts.agentName}] Out-of-turn output ended (${reason})`);
954
+ sendEnvelopes(sessionManager.endTurn("completed"));
955
+ setThinking(false);
956
+ };
786
957
  const setThinking = (next) => {
787
958
  if (thinking === next) {
788
959
  return;
@@ -797,6 +968,7 @@ async function runAcp(opts) {
797
968
  let backendStarted = false;
798
969
  let backendGone = null;
799
970
  let todoDiscoverySent = false;
971
+ const projectInjector = deterministicJson.createProjectInjector({ client: client.sharedProjectsClient(), sessionId: () => session?.sessionId, metadata: () => session?.getMetadata?.() ?? null, agent: opts.agentName });
800
972
  const stopRunnerFromBackendStatus = (status, detail) => {
801
973
  const reason = detail ? `${opts.agentName} backend ${status}: ${detail}` : `${opts.agentName} backend ${status}`;
802
974
  logger.logger.debug(`[${opts.agentName}] ${reason}; stopping ACP runner`);
@@ -820,7 +992,7 @@ async function runAcp(opts) {
820
992
  return;
821
993
  }
822
994
  if (permissionModeIsFileBacked()) {
823
- const mode = sessionModeFile.normalizeAcpPermissionMode(requestedMode);
995
+ const mode = acpSessionResume.normalizeAcpPermissionMode(requestedMode);
824
996
  if (!mode) {
825
997
  logger.logger.debug(`[${opts.agentName}] Ignoring unknown file-backed permission mode request: ${requestedMode}`);
826
998
  return;
@@ -1094,7 +1266,18 @@ async function runAcp(opts) {
1094
1266
  controlClient.reportSessionEditToDaemon({ sessionId: session.sessionId, path: edit.path, tool: edit.tool, cwd: process.cwd() });
1095
1267
  }
1096
1268
  }
1269
+ const action = outOfTurnAction(msg, { open: outOfTurnTimer !== null, inPromptTurn: thinking && outOfTurnTimer === null, backendStarted });
1270
+ if (action === "start") {
1271
+ sendEnvelopes(sessionManager.startTurn());
1272
+ setThinking(true);
1273
+ }
1274
+ if (action === "start" || action === "touch") {
1275
+ if (outOfTurnTimer) clearTimeout(outOfTurnTimer);
1276
+ outOfTurnTimer = setTimeout(() => endOutOfTurn("quiet"), OUT_OF_TURN_QUIET_MS);
1277
+ outOfTurnTimer.unref?.();
1278
+ }
1097
1279
  sendEnvelopes(sessionManager.mapMessage(msg));
1280
+ if (action === "end") endOutOfTurn("idle");
1098
1281
  };
1099
1282
  backend.onMessage(onBackendMessage);
1100
1283
  const titleGenerator$1 = new titleGenerator.TitleGenerator(session);
@@ -1119,6 +1302,13 @@ async function runAcp(opts) {
1119
1302
  if (message.meta && Object.prototype.hasOwnProperty.call(message.meta, "effort")) {
1120
1303
  currentEffort = message.meta.effort ?? null;
1121
1304
  }
1305
+ if (message.meta?.delivery === "steer" && piSteer?.ready && thinking && !attachments?.length) {
1306
+ if (await piSteer.offer(message.content.text, PI_STEER_OFFER_TIMEOUT_MS)) {
1307
+ logger.logger.debug(`[${opts.agentName}] User message steered into the running turn`);
1308
+ return;
1309
+ }
1310
+ logger.logger.debug(`[${opts.agentName}] Steer not taken; queued for the next turn`);
1311
+ }
1122
1312
  messageQueue.push(message.content.text, {
1123
1313
  permissionMode: currentPermissionMode,
1124
1314
  model: currentModel,
@@ -1155,7 +1345,7 @@ async function runAcp(opts) {
1155
1345
  if (!fileBackedModeActive) {
1156
1346
  throw new Error(`${opts.agentName} does not support live permission mode changes`);
1157
1347
  }
1158
- const mode = typeof request?.mode === "string" ? sessionModeFile.normalizeAcpPermissionMode(request.mode) : null;
1348
+ const mode = typeof request?.mode === "string" ? acpSessionResume.normalizeAcpPermissionMode(request.mode) : null;
1159
1349
  if (!mode) {
1160
1350
  throw new Error("Invalid permission mode");
1161
1351
  }
@@ -1185,6 +1375,12 @@ async function runAcp(opts) {
1185
1375
  publishFileBackedPermissionMode(fileBackedPermissionMode ?? initialPermissionMode);
1186
1376
  }
1187
1377
  };
1378
+ let agentSessionId = opts.resumeAgentSessionId ?? null;
1379
+ const rememberAgentSession = (id) => {
1380
+ if (!id || opts.agentName !== "pi") return;
1381
+ agentSessionId = id;
1382
+ session.updateMetadata((current) => current.piSessionId === id ? current : { ...current, piSessionId: id });
1383
+ };
1188
1384
  const restartBackend = async () => {
1189
1385
  const gone = backendGone;
1190
1386
  backend.offMessage?.(onBackendMessage);
@@ -1196,19 +1392,27 @@ async function runAcp(opts) {
1196
1392
  }
1197
1393
  backend = createBackend();
1198
1394
  backend.onMessage(onBackendMessage);
1199
- const started = await backend.startSession();
1395
+ const started = await backend.startSession(void 0, agentSessionId ? { loadSessionId: agentSessionId } : {});
1200
1396
  acpSessionId = started.sessionId;
1397
+ rememberAgentSession(started.agentSessionId);
1201
1398
  backendGone = null;
1202
1399
  todoDiscoverySent = false;
1400
+ projectInjector.reset();
1203
1401
  await afterSessionStarted(currentModel ?? opts.model);
1204
- logger.logger.debug(`[${opts.agentName}] Restarted the agent after it exited: ${gone?.message ?? "unknown"}`);
1205
- session.sendSessionEvent({ type: "message", message: `${opts.agentName} was restarted after its process exited; it does not remember the earlier conversation (the transcript here is kept).` });
1402
+ logger.logger.debug(`[${opts.agentName}] Restarted the agent after it exited: ${gone?.message ?? "unknown"} (conversation: ${started.resumed ?? "new"}${started.loadFailure ? `, ${started.loadFailure}` : ""})`);
1403
+ session.sendSessionEvent({ type: "message", message: acpSessionResume.piRestartNotice(opts.agentName, "agent-exit", started) });
1206
1404
  };
1207
1405
  try {
1208
- const started = await backend.startSession();
1406
+ const resumeId = opts.resumeAgentSessionId;
1407
+ const started = await backend.startSession(void 0, resumeId ? { loadSessionId: resumeId } : {});
1209
1408
  acpSessionId = started.sessionId;
1409
+ rememberAgentSession(started.agentSessionId);
1210
1410
  backendStarted = true;
1211
1411
  await afterSessionStarted(opts.model);
1412
+ if (resumeId) {
1413
+ logger.logger.debug(`[${opts.agentName}] Resume of agent session ${resumeId}: ${started.resumed ?? "new"}${started.loadFailure ? ` (${started.loadFailure})` : ""}`);
1414
+ if (started.resumed !== "loaded") session.sendSessionEvent({ type: "message", message: acpSessionResume.piRestartNotice(opts.agentName, "resume", started) });
1415
+ }
1212
1416
  if (verbose) {
1213
1417
  if (!sawSlashCommands) {
1214
1418
  logAcp("muted", `Outgoing slash commands from ${opts.agentName}: not reported yet`);
@@ -1233,6 +1437,7 @@ async function runAcp(opts) {
1233
1437
  break;
1234
1438
  }
1235
1439
  logAcp("incoming", `Incoming prompt: ${formatUnknownForConsole(batch.message, ACP_EVENT_PREVIEW_CHARS)}`);
1440
+ endOutOfTurn("prompt");
1236
1441
  sendEnvelopes(sessionManager.startTurn());
1237
1442
  turnCancelled = false;
1238
1443
  setThinking(true);
@@ -1250,7 +1455,8 @@ async function runAcp(opts) {
1250
1455
  if (typeof batch.mode.effort === "string") {
1251
1456
  await switchEffortIfRequested(batch.mode.effort, modelChanged);
1252
1457
  }
1253
- const prompt = todoDiscoverySent ? batch.message : `${batch.message}
1458
+ const projected = await projectInjector.decorate(batch.message);
1459
+ const prompt = todoDiscoverySent ? projected : `${projected}
1254
1460
 
1255
1461
  ${index.BUILTIN_TODO_DISCOVERY}`;
1256
1462
  const attachments = batch.attachments ?? [];
@@ -1310,7 +1516,7 @@ ${index.BUILTIN_TODO_DISCOVERY}`;
1310
1516
  await backend.dispose();
1311
1517
  if (fileBackedPermissionMode) {
1312
1518
  try {
1313
- sessionModeFile.removeSessionModeFile(session.sessionId);
1519
+ acpSessionResume.removeSessionModeFile(session.sessionId);
1314
1520
  } catch (error) {
1315
1521
  logger.logger.debug(`[${opts.agentName}] Failed to remove session mode file:`, error);
1316
1522
  }