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,11 +1,11 @@
1
1
  import { spawn } from 'node:child_process';
2
2
  import { ndJsonStream, ClientSideConnection } from '@agentclientprotocol/sdk';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { l as logger } from './logger--vAVtXB_.mjs';
5
- import { d as delay } from './time-BuGWTVP6.mjs';
4
+ import { l as logger } from './logger-BUngm5Xg.mjs';
5
+ import { d as delay } from './time-D3ETL7Jb.mjs';
6
6
  import { c as contentLogMetadata, e as errorLogMetadata } from './contentLogMetadata-BlWI0egu.mjs';
7
7
  import { r as readableStderrTail, a as appendStderrRing, s as stopProcessGracefully, k as killProcessTree } from './processTree-CP5IvQ2Z.mjs';
8
- import { p as packageJson } from './package-B7B03ejW.mjs';
8
+ import { p as packageJson } from './package-7Ld1YMhh.mjs';
9
9
 
10
10
  function acpImageBlocks(attachments, supportsImages) {
11
11
  return attachments.filter((file) => ["image/jpeg", "image/png", "image/gif", "image/webp"].includes(file.mimeType)).map((file) => {
@@ -539,6 +539,51 @@ function handleThinkingUpdate(update, ctx) {
539
539
  return { handled: true };
540
540
  }
541
541
 
542
+ const CHOICE = /^choice-\d+$/;
543
+ function readPiExtensionDialog(params) {
544
+ const toolCall = params.toolCall;
545
+ if (!toolCall || typeof toolCall.toolCallId !== "string" || !toolCall.toolCallId.startsWith("pi-ui-")) return null;
546
+ const method = toolCall.rawInput?.method;
547
+ const options = params.options ?? [];
548
+ if (method === "select" && options.length > 0 && options.every((o) => typeof o.optionId === "string" && CHOICE.test(o.optionId))) {
549
+ const title = typeof toolCall.rawInput?.title === "string" ? toolCall.rawInput.title : toolCall.title;
550
+ return {
551
+ kind: "select",
552
+ question: typeof title === "string" && title.trim() ? title : "pi asks",
553
+ options: options.map((o) => ({ optionId: o.optionId, label: String(o.name ?? o.optionId) }))
554
+ };
555
+ }
556
+ if (method === "confirm" && options.some((o) => o.optionId === "yes") && options.some((o) => o.optionId === "no")) {
557
+ return { kind: "confirm" };
558
+ }
559
+ return null;
560
+ }
561
+ function piSelectQuestionInput(dialog, message) {
562
+ return {
563
+ questions: [{
564
+ question: dialog.question,
565
+ header: dialog.question.length > 30 ? `${dialog.question.slice(0, 29)}\u2026` : dialog.question,
566
+ options: dialog.options.map((o) => ({ label: o.label, description: "" })),
567
+ multiSelect: false
568
+ }],
569
+ ...typeof message === "string" && message.trim() ? { message } : {}
570
+ };
571
+ }
572
+ function piDialogOutcome(dialog, result) {
573
+ const approved = result.decision === "approved" || result.decision === "approved_for_session";
574
+ if (dialog.kind === "confirm") return { outcome: "selected", optionId: approved ? "yes" : "no" };
575
+ if (!approved) return { outcome: "cancelled" };
576
+ const answers = result.updatedInput?.answers;
577
+ const picked = answers && typeof answers === "object" ? answers[dialog.question] : void 0;
578
+ if (typeof picked !== "string") return { outcome: "cancelled" };
579
+ const match = dialog.options.find((o) => o.label === picked);
580
+ return match ? { outcome: "selected", optionId: match.optionId } : { outcome: "cancelled" };
581
+ }
582
+
583
+ const LOAD_SESSION_TIMEOUT_MS = 6e4;
584
+ function isReplayedConversationUpdate(updateType) {
585
+ return updateType === "user_message_chunk" || updateType === "agent_message_chunk" || updateType === "agent_thought_chunk" || updateType === "tool_call" || updateType === "tool_call_update" || updateType === "plan";
586
+ }
542
587
  const RETRY_CONFIG = {
543
588
  /** Maximum number of retry attempts for init/newSession */
544
589
  maxAttempts: 3,
@@ -655,6 +700,13 @@ class AcpBackend {
655
700
  process = null;
656
701
  connection = null;
657
702
  acpSessionId = null;
703
+ /**
704
+ * B-633: true while `session/load` runs. pi-acp replays the whole earlier
705
+ * conversation as user/agent/tool updates before it answers; the web already
706
+ * holds that transcript, so those updates are dropped (config, mode, model
707
+ * and command updates still apply).
708
+ */
709
+ replayingHistory = false;
658
710
  disposed = false;
659
711
  /** Track active tool calls to prevent duplicate events */
660
712
  activeToolCalls = /* @__PURE__ */ new Set();
@@ -730,7 +782,7 @@ class AcpBackend {
730
782
  }
731
783
  }
732
784
  }
733
- async startSession(initialPrompt) {
785
+ async startSession(initialPrompt, options = {}) {
734
786
  if (this.disposed) {
735
787
  throw new Error("Backend has been disposed");
736
788
  }
@@ -906,21 +958,26 @@ class AcpBackend {
906
958
  let toolName = resolved.toolName;
907
959
  const toolCallId = resolved.toolCallId;
908
960
  const permissionId = toolCallId;
909
- const input = resolved.input;
961
+ let input = resolved.input;
962
+ const piDialog = readPiExtensionDialog(extendedParams);
910
963
  const context = {
911
964
  recentPromptHadChangeTitle: this.recentPromptHadChangeTitle,
912
965
  toolCallCountSincePrompt: this.toolCallCountSincePrompt
913
966
  };
914
967
  toolName = this.transport.determineToolName?.(toolName, toolCallId, input, context) ?? toolName;
968
+ if (piDialog?.kind === "select") {
969
+ toolName = "AskUserQuestion";
970
+ input = piSelectQuestionInput(piDialog, resolved.input.message);
971
+ }
915
972
  if (toolName !== (toolCall?.kind || toolCall?.toolName || extendedParams.kind || "Unknown tool")) {
916
973
  logger.debug(`[AcpBackend] Inferred tool name for toolCallId: ${toolCallId}`);
917
974
  }
918
975
  this.toolCallCountSincePrompt++;
919
- const options = extendedParams.options || [];
976
+ const options2 = extendedParams.options || [];
920
977
  logger.debug("[AcpBackend] Permission request metadata:", {
921
978
  hasToolCall: !!toolCall,
922
979
  toolCallId,
923
- optionCount: options.length,
980
+ optionCount: options2.length,
924
981
  input: contentLogMetadata(input)
925
982
  });
926
983
  this.emit({
@@ -933,7 +990,7 @@ class AcpBackend {
933
990
  toolCallId,
934
991
  toolName,
935
992
  input,
936
- options: options.map((opt) => ({
993
+ options: options2.map((opt) => ({
937
994
  id: opt.optionId,
938
995
  name: opt.name,
939
996
  kind: opt.kind
@@ -947,20 +1004,31 @@ class AcpBackend {
947
1004
  toolName,
948
1005
  input
949
1006
  );
1007
+ if (piDialog) {
1008
+ const answer = piDialogOutcome(piDialog, result);
1009
+ const answered = answer.outcome === "selected" && answer.optionId !== "no";
1010
+ this.emit({
1011
+ type: "tool-result",
1012
+ toolName,
1013
+ result: { status: answered ? "approved" : "denied", decision: result.decision },
1014
+ callId: permissionId
1015
+ });
1016
+ return { outcome: answer };
1017
+ }
950
1018
  let optionId = "cancel";
951
1019
  if (result.decision === "approved" || result.decision === "approved_for_session") {
952
- const proceedOnceOption2 = options.find(
1020
+ const proceedOnceOption2 = options2.find(
953
1021
  (opt) => opt.optionId === "proceed_once" || opt.name?.toLowerCase().includes("once")
954
1022
  );
955
- const proceedAlwaysOption = options.find(
1023
+ const proceedAlwaysOption = options2.find(
956
1024
  (opt) => opt.optionId === "proceed_always" || opt.name?.toLowerCase().includes("always")
957
1025
  );
958
1026
  if (result.decision === "approved_for_session" && proceedAlwaysOption) {
959
1027
  optionId = proceedAlwaysOption.optionId || "proceed_always";
960
1028
  } else if (proceedOnceOption2) {
961
1029
  optionId = proceedOnceOption2.optionId || "proceed_once";
962
- } else if (options.length > 0) {
963
- optionId = options[0].optionId || "proceed_once";
1030
+ } else if (options2.length > 0) {
1031
+ optionId = options2[0].optionId || "proceed_once";
964
1032
  }
965
1033
  this.emit({
966
1034
  type: "tool-result",
@@ -969,7 +1037,7 @@ class AcpBackend {
969
1037
  callId: permissionId
970
1038
  });
971
1039
  } else {
972
- const cancelOption = options.find(
1040
+ const cancelOption = options2.find(
973
1041
  (opt) => opt.optionId === "cancel" || opt.name?.toLowerCase().includes("cancel")
974
1042
  );
975
1043
  if (cancelOption) {
@@ -988,10 +1056,10 @@ class AcpBackend {
988
1056
  return { outcome: { outcome: "selected", optionId: "cancel" } };
989
1057
  }
990
1058
  }
991
- const proceedOnceOption = options.find(
1059
+ const proceedOnceOption = options2.find(
992
1060
  (opt) => opt.optionId === "proceed_once" || typeof opt.name === "string" && opt.name.toLowerCase().includes("once")
993
1061
  );
994
- const defaultOptionId = proceedOnceOption?.optionId || (options.length > 0 && options[0].optionId ? options[0].optionId : "proceed_once");
1062
+ const defaultOptionId = proceedOnceOption?.optionId || (options2.length > 0 && options2[0].optionId ? options2[0].optionId : "proceed_once");
995
1063
  return { outcome: { outcome: "selected", optionId: defaultOptionId } };
996
1064
  }
997
1065
  };
@@ -1072,6 +1140,50 @@ class AcpBackend {
1072
1140
  cwd: this.options.cwd,
1073
1141
  mcpServers
1074
1142
  };
1143
+ let resumed;
1144
+ let loadFailure;
1145
+ if (options.loadSessionId) {
1146
+ if (initializeResponse.agentCapabilities?.loadSession !== true) {
1147
+ resumed = "fresh";
1148
+ loadFailure = `${this.transport.agentName} cannot reopen sessions`;
1149
+ } else {
1150
+ const loadRequest = { ...newSessionRequest, sessionId: options.loadSessionId };
1151
+ let timeoutHandle = null;
1152
+ this.replayingHistory = true;
1153
+ try {
1154
+ const loaded = await Promise.race([
1155
+ startupFailurePromise,
1156
+ this.connection.loadSession(loadRequest),
1157
+ new Promise((_, reject) => {
1158
+ timeoutHandle = setTimeout(() => reject(new Error(`Load session timeout after ${LOAD_SESSION_TIMEOUT_MS}ms`)), LOAD_SESSION_TIMEOUT_MS);
1159
+ })
1160
+ ]);
1161
+ this.acpSessionId = options.loadSessionId;
1162
+ resumed = "loaded";
1163
+ logger.debug(`[AcpBackend] Session reopened: ${this.acpSessionId}`);
1164
+ this.emitInitialSessionMetadata(loaded);
1165
+ } catch (error) {
1166
+ if (startupFailure && error === startupFailure) throw error;
1167
+ resumed = "fresh";
1168
+ const message = error?.message;
1169
+ loadFailure = typeof message === "string" ? message : String(error);
1170
+ logger.debug(`[AcpBackend] Reopening session ${options.loadSessionId} failed; starting a new one: ${loadFailure}`);
1171
+ } finally {
1172
+ if (timeoutHandle) clearTimeout(timeoutHandle);
1173
+ this.replayingHistory = false;
1174
+ }
1175
+ }
1176
+ }
1177
+ if (resumed === "loaded") {
1178
+ this.emitIdleStatus();
1179
+ if (initialPrompt) {
1180
+ this.sendPrompt(sessionId, initialPrompt).catch((error) => {
1181
+ logger.debug("[AcpBackend] Error sending initial prompt:", errorLogMetadata(error));
1182
+ this.emit({ type: "status", status: "error", detail: String(error) });
1183
+ });
1184
+ }
1185
+ return { sessionId, agentSessionId: this.acpSessionId, resumed };
1186
+ }
1075
1187
  logger.debug(`[AcpBackend] Creating new session...`);
1076
1188
  const sessionResponse = await withRetry(
1077
1189
  async () => {
@@ -1122,7 +1234,11 @@ class AcpBackend {
1122
1234
  this.emit({ type: "status", status: "error", detail: String(error) });
1123
1235
  });
1124
1236
  }
1125
- return { sessionId };
1237
+ return {
1238
+ sessionId,
1239
+ agentSessionId: this.acpSessionId ?? void 0,
1240
+ ...resumed ? { resumed, ...loadFailure ? { loadFailure } : {} } : {}
1241
+ };
1126
1242
  } catch (error) {
1127
1243
  logger.debug("[AcpBackend] Error starting session:", errorLogMetadata(error));
1128
1244
  if (!startupStatusErrorEmitted) {
@@ -1208,6 +1324,9 @@ class AcpBackend {
1208
1324
  `Incoming session update from ${this.options.agentName}: type=${sessionUpdateType ?? "unknown"} payloadBytes=${String(updateMetadata.payloadBytes ?? "unknown")}`
1209
1325
  );
1210
1326
  }
1327
+ if (this.replayingHistory && isReplayedConversationUpdate(updateType)) {
1328
+ return;
1329
+ }
1211
1330
  const ctx = this.createHandlerContext();
1212
1331
  if (sessionUpdateType === "agent_message_chunk") {
1213
1332
  handleAgentMessageChunk(update, ctx);
@@ -3,11 +3,11 @@
3
3
  var node_child_process = require('node:child_process');
4
4
  var sdk = require('@agentclientprotocol/sdk');
5
5
  var node_crypto = require('node:crypto');
6
- var logger = require('./logger-DXTWlPzP.cjs');
7
- var time = require('./time-A6zR3Iy6.cjs');
6
+ var logger = require('./logger-CphW5nUE.cjs');
7
+ var time = require('./time-Cjv0zxQO.cjs');
8
8
  var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
9
9
  var processTree = require('./processTree-CMHWlVse.cjs');
10
- var _package = require('./package-DY4zTbKS.cjs');
10
+ var _package = require('./package-KhLqBDX9.cjs');
11
11
 
12
12
  function acpImageBlocks(attachments, supportsImages) {
13
13
  return attachments.filter((file) => ["image/jpeg", "image/png", "image/gif", "image/webp"].includes(file.mimeType)).map((file) => {
@@ -541,6 +541,51 @@ function handleThinkingUpdate(update, ctx) {
541
541
  return { handled: true };
542
542
  }
543
543
 
544
+ const CHOICE = /^choice-\d+$/;
545
+ function readPiExtensionDialog(params) {
546
+ const toolCall = params.toolCall;
547
+ if (!toolCall || typeof toolCall.toolCallId !== "string" || !toolCall.toolCallId.startsWith("pi-ui-")) return null;
548
+ const method = toolCall.rawInput?.method;
549
+ const options = params.options ?? [];
550
+ if (method === "select" && options.length > 0 && options.every((o) => typeof o.optionId === "string" && CHOICE.test(o.optionId))) {
551
+ const title = typeof toolCall.rawInput?.title === "string" ? toolCall.rawInput.title : toolCall.title;
552
+ return {
553
+ kind: "select",
554
+ question: typeof title === "string" && title.trim() ? title : "pi asks",
555
+ options: options.map((o) => ({ optionId: o.optionId, label: String(o.name ?? o.optionId) }))
556
+ };
557
+ }
558
+ if (method === "confirm" && options.some((o) => o.optionId === "yes") && options.some((o) => o.optionId === "no")) {
559
+ return { kind: "confirm" };
560
+ }
561
+ return null;
562
+ }
563
+ function piSelectQuestionInput(dialog, message) {
564
+ return {
565
+ questions: [{
566
+ question: dialog.question,
567
+ header: dialog.question.length > 30 ? `${dialog.question.slice(0, 29)}\u2026` : dialog.question,
568
+ options: dialog.options.map((o) => ({ label: o.label, description: "" })),
569
+ multiSelect: false
570
+ }],
571
+ ...typeof message === "string" && message.trim() ? { message } : {}
572
+ };
573
+ }
574
+ function piDialogOutcome(dialog, result) {
575
+ const approved = result.decision === "approved" || result.decision === "approved_for_session";
576
+ if (dialog.kind === "confirm") return { outcome: "selected", optionId: approved ? "yes" : "no" };
577
+ if (!approved) return { outcome: "cancelled" };
578
+ const answers = result.updatedInput?.answers;
579
+ const picked = answers && typeof answers === "object" ? answers[dialog.question] : void 0;
580
+ if (typeof picked !== "string") return { outcome: "cancelled" };
581
+ const match = dialog.options.find((o) => o.label === picked);
582
+ return match ? { outcome: "selected", optionId: match.optionId } : { outcome: "cancelled" };
583
+ }
584
+
585
+ const LOAD_SESSION_TIMEOUT_MS = 6e4;
586
+ function isReplayedConversationUpdate(updateType) {
587
+ return updateType === "user_message_chunk" || updateType === "agent_message_chunk" || updateType === "agent_thought_chunk" || updateType === "tool_call" || updateType === "tool_call_update" || updateType === "plan";
588
+ }
544
589
  const RETRY_CONFIG = {
545
590
  /** Maximum number of retry attempts for init/newSession */
546
591
  maxAttempts: 3,
@@ -657,6 +702,13 @@ class AcpBackend {
657
702
  process = null;
658
703
  connection = null;
659
704
  acpSessionId = null;
705
+ /**
706
+ * B-633: true while `session/load` runs. pi-acp replays the whole earlier
707
+ * conversation as user/agent/tool updates before it answers; the web already
708
+ * holds that transcript, so those updates are dropped (config, mode, model
709
+ * and command updates still apply).
710
+ */
711
+ replayingHistory = false;
660
712
  disposed = false;
661
713
  /** Track active tool calls to prevent duplicate events */
662
714
  activeToolCalls = /* @__PURE__ */ new Set();
@@ -732,7 +784,7 @@ class AcpBackend {
732
784
  }
733
785
  }
734
786
  }
735
- async startSession(initialPrompt) {
787
+ async startSession(initialPrompt, options = {}) {
736
788
  if (this.disposed) {
737
789
  throw new Error("Backend has been disposed");
738
790
  }
@@ -908,21 +960,26 @@ class AcpBackend {
908
960
  let toolName = resolved.toolName;
909
961
  const toolCallId = resolved.toolCallId;
910
962
  const permissionId = toolCallId;
911
- const input = resolved.input;
963
+ let input = resolved.input;
964
+ const piDialog = readPiExtensionDialog(extendedParams);
912
965
  const context = {
913
966
  recentPromptHadChangeTitle: this.recentPromptHadChangeTitle,
914
967
  toolCallCountSincePrompt: this.toolCallCountSincePrompt
915
968
  };
916
969
  toolName = this.transport.determineToolName?.(toolName, toolCallId, input, context) ?? toolName;
970
+ if (piDialog?.kind === "select") {
971
+ toolName = "AskUserQuestion";
972
+ input = piSelectQuestionInput(piDialog, resolved.input.message);
973
+ }
917
974
  if (toolName !== (toolCall?.kind || toolCall?.toolName || extendedParams.kind || "Unknown tool")) {
918
975
  logger.logger.debug(`[AcpBackend] Inferred tool name for toolCallId: ${toolCallId}`);
919
976
  }
920
977
  this.toolCallCountSincePrompt++;
921
- const options = extendedParams.options || [];
978
+ const options2 = extendedParams.options || [];
922
979
  logger.logger.debug("[AcpBackend] Permission request metadata:", {
923
980
  hasToolCall: !!toolCall,
924
981
  toolCallId,
925
- optionCount: options.length,
982
+ optionCount: options2.length,
926
983
  input: contentLogMetadata.contentLogMetadata(input)
927
984
  });
928
985
  this.emit({
@@ -935,7 +992,7 @@ class AcpBackend {
935
992
  toolCallId,
936
993
  toolName,
937
994
  input,
938
- options: options.map((opt) => ({
995
+ options: options2.map((opt) => ({
939
996
  id: opt.optionId,
940
997
  name: opt.name,
941
998
  kind: opt.kind
@@ -949,20 +1006,31 @@ class AcpBackend {
949
1006
  toolName,
950
1007
  input
951
1008
  );
1009
+ if (piDialog) {
1010
+ const answer = piDialogOutcome(piDialog, result);
1011
+ const answered = answer.outcome === "selected" && answer.optionId !== "no";
1012
+ this.emit({
1013
+ type: "tool-result",
1014
+ toolName,
1015
+ result: { status: answered ? "approved" : "denied", decision: result.decision },
1016
+ callId: permissionId
1017
+ });
1018
+ return { outcome: answer };
1019
+ }
952
1020
  let optionId = "cancel";
953
1021
  if (result.decision === "approved" || result.decision === "approved_for_session") {
954
- const proceedOnceOption2 = options.find(
1022
+ const proceedOnceOption2 = options2.find(
955
1023
  (opt) => opt.optionId === "proceed_once" || opt.name?.toLowerCase().includes("once")
956
1024
  );
957
- const proceedAlwaysOption = options.find(
1025
+ const proceedAlwaysOption = options2.find(
958
1026
  (opt) => opt.optionId === "proceed_always" || opt.name?.toLowerCase().includes("always")
959
1027
  );
960
1028
  if (result.decision === "approved_for_session" && proceedAlwaysOption) {
961
1029
  optionId = proceedAlwaysOption.optionId || "proceed_always";
962
1030
  } else if (proceedOnceOption2) {
963
1031
  optionId = proceedOnceOption2.optionId || "proceed_once";
964
- } else if (options.length > 0) {
965
- optionId = options[0].optionId || "proceed_once";
1032
+ } else if (options2.length > 0) {
1033
+ optionId = options2[0].optionId || "proceed_once";
966
1034
  }
967
1035
  this.emit({
968
1036
  type: "tool-result",
@@ -971,7 +1039,7 @@ class AcpBackend {
971
1039
  callId: permissionId
972
1040
  });
973
1041
  } else {
974
- const cancelOption = options.find(
1042
+ const cancelOption = options2.find(
975
1043
  (opt) => opt.optionId === "cancel" || opt.name?.toLowerCase().includes("cancel")
976
1044
  );
977
1045
  if (cancelOption) {
@@ -990,10 +1058,10 @@ class AcpBackend {
990
1058
  return { outcome: { outcome: "selected", optionId: "cancel" } };
991
1059
  }
992
1060
  }
993
- const proceedOnceOption = options.find(
1061
+ const proceedOnceOption = options2.find(
994
1062
  (opt) => opt.optionId === "proceed_once" || typeof opt.name === "string" && opt.name.toLowerCase().includes("once")
995
1063
  );
996
- const defaultOptionId = proceedOnceOption?.optionId || (options.length > 0 && options[0].optionId ? options[0].optionId : "proceed_once");
1064
+ const defaultOptionId = proceedOnceOption?.optionId || (options2.length > 0 && options2[0].optionId ? options2[0].optionId : "proceed_once");
997
1065
  return { outcome: { outcome: "selected", optionId: defaultOptionId } };
998
1066
  }
999
1067
  };
@@ -1074,6 +1142,50 @@ class AcpBackend {
1074
1142
  cwd: this.options.cwd,
1075
1143
  mcpServers
1076
1144
  };
1145
+ let resumed;
1146
+ let loadFailure;
1147
+ if (options.loadSessionId) {
1148
+ if (initializeResponse.agentCapabilities?.loadSession !== true) {
1149
+ resumed = "fresh";
1150
+ loadFailure = `${this.transport.agentName} cannot reopen sessions`;
1151
+ } else {
1152
+ const loadRequest = { ...newSessionRequest, sessionId: options.loadSessionId };
1153
+ let timeoutHandle = null;
1154
+ this.replayingHistory = true;
1155
+ try {
1156
+ const loaded = await Promise.race([
1157
+ startupFailurePromise,
1158
+ this.connection.loadSession(loadRequest),
1159
+ new Promise((_, reject) => {
1160
+ timeoutHandle = setTimeout(() => reject(new Error(`Load session timeout after ${LOAD_SESSION_TIMEOUT_MS}ms`)), LOAD_SESSION_TIMEOUT_MS);
1161
+ })
1162
+ ]);
1163
+ this.acpSessionId = options.loadSessionId;
1164
+ resumed = "loaded";
1165
+ logger.logger.debug(`[AcpBackend] Session reopened: ${this.acpSessionId}`);
1166
+ this.emitInitialSessionMetadata(loaded);
1167
+ } catch (error) {
1168
+ if (startupFailure && error === startupFailure) throw error;
1169
+ resumed = "fresh";
1170
+ const message = error?.message;
1171
+ loadFailure = typeof message === "string" ? message : String(error);
1172
+ logger.logger.debug(`[AcpBackend] Reopening session ${options.loadSessionId} failed; starting a new one: ${loadFailure}`);
1173
+ } finally {
1174
+ if (timeoutHandle) clearTimeout(timeoutHandle);
1175
+ this.replayingHistory = false;
1176
+ }
1177
+ }
1178
+ }
1179
+ if (resumed === "loaded") {
1180
+ this.emitIdleStatus();
1181
+ if (initialPrompt) {
1182
+ this.sendPrompt(sessionId, initialPrompt).catch((error) => {
1183
+ logger.logger.debug("[AcpBackend] Error sending initial prompt:", contentLogMetadata.errorLogMetadata(error));
1184
+ this.emit({ type: "status", status: "error", detail: String(error) });
1185
+ });
1186
+ }
1187
+ return { sessionId, agentSessionId: this.acpSessionId, resumed };
1188
+ }
1077
1189
  logger.logger.debug(`[AcpBackend] Creating new session...`);
1078
1190
  const sessionResponse = await withRetry(
1079
1191
  async () => {
@@ -1124,7 +1236,11 @@ class AcpBackend {
1124
1236
  this.emit({ type: "status", status: "error", detail: String(error) });
1125
1237
  });
1126
1238
  }
1127
- return { sessionId };
1239
+ return {
1240
+ sessionId,
1241
+ agentSessionId: this.acpSessionId ?? void 0,
1242
+ ...resumed ? { resumed, ...loadFailure ? { loadFailure } : {} } : {}
1243
+ };
1128
1244
  } catch (error) {
1129
1245
  logger.logger.debug("[AcpBackend] Error starting session:", contentLogMetadata.errorLogMetadata(error));
1130
1246
  if (!startupStatusErrorEmitted) {
@@ -1210,6 +1326,9 @@ class AcpBackend {
1210
1326
  `Incoming session update from ${this.options.agentName}: type=${sessionUpdateType ?? "unknown"} payloadBytes=${String(updateMetadata.payloadBytes ?? "unknown")}`
1211
1327
  );
1212
1328
  }
1329
+ if (this.replayingHistory && isReplayedConversationUpdate(updateType)) {
1330
+ return;
1331
+ }
1213
1332
  const ctx = this.createHandlerContext();
1214
1333
  if (sessionUpdateType === "agent_message_chunk") {
1215
1334
  handleAgentMessageChunk(update, ctx);
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var cuid2 = require('@paralleldrive/cuid2');
4
- var index = require('./index-_l1Sdmbi.cjs');
4
+ var index = require('./index-Dv0Q48P3.cjs');
5
5
 
6
6
  function turnOptions(turnId, time) {
7
7
  return turnId ? { turn: turnId, time } : { time };
@@ -24,6 +24,26 @@ function toolCallEndResult(result) {
24
24
  ...record.truncated === true ? { truncated: true } : {}
25
25
  };
26
26
  }
27
+ function piSubagentLabel(args) {
28
+ if (args.piTool !== "subagent") return null;
29
+ const raw = args.rawInput && typeof args.rawInput === "object" ? args.rawInput : {};
30
+ const clip = (text) => {
31
+ const flat = text.replace(/\s+/g, " ").trim();
32
+ return flat.length > 120 ? `${flat.slice(0, 119)}\u2026` : flat;
33
+ };
34
+ const agent = typeof raw.agent === "string" ? raw.agent : void 0;
35
+ if (typeof raw.task === "string" && raw.task.trim()) return { description: clip(raw.task), ...agent ? { subagentType: agent } : {} };
36
+ if (Array.isArray(raw.tasks)) return { description: `${raw.tasks.length} parallel task${raw.tasks.length === 1 ? "" : "s"}`, ...agent ? { subagentType: agent } : {} };
37
+ if (Array.isArray(raw.chain)) return { description: `chain of ${raw.chain.length} step${raw.chain.length === 1 ? "" : "s"}` };
38
+ return { description: agent ? `${agent} sub-agent` : "sub-agent", ...agent ? { subagentType: agent } : {} };
39
+ }
40
+ function subagentStopStatus(result) {
41
+ if (!result || typeof result !== "object" || Array.isArray(result)) return "completed";
42
+ const record = result;
43
+ if (record.status === "cancelled" || record.status === "canceled") return "stopped";
44
+ if (record.error !== void 0 || record.status === "failed" || typeof record.exitCode === "number" && record.exitCode !== 0) return "failed";
45
+ return "completed";
46
+ }
27
47
  function parseThinkingPayload(payload) {
28
48
  if (typeof payload === "string") {
29
49
  return { text: payload, streaming: false };
@@ -37,6 +57,8 @@ function parseThinkingPayload(payload) {
37
57
  }
38
58
  class AcpSessionManager {
39
59
  currentTurnId = null;
60
+ /** B-632 ③: ACP call id → sub-agent id of a running pi `subagent` call. */
61
+ subagentByCall = /* @__PURE__ */ new Map();
40
62
  acpCallToSessionCall = /* @__PURE__ */ new Map();
41
63
  stream;
42
64
  /** Monotonic clock: max(lastTime + 1, Date.now()) */
@@ -134,10 +156,13 @@ class AcpSessionManager {
134
156
  return flushed;
135
157
  }
136
158
  const turnId = this.currentTurnId;
159
+ const stops = [...this.subagentByCall.values()].map((subagent) => index.createEnvelope("agent", { t: "stop", status: status === "completed" ? "completed" : "stopped" }, { turn: turnId, time: this.nextTime(), subagent }));
160
+ this.subagentByCall.clear();
137
161
  this.currentTurnId = null;
138
162
  this.acpCallToSessionCall.clear();
139
163
  return [
140
164
  ...flushed,
165
+ ...stops,
141
166
  index.createEnvelope("agent", { t: "turn-end", status }, { turn: turnId, time: this.nextTime() })
142
167
  ];
143
168
  }
@@ -172,6 +197,10 @@ class AcpSessionManager {
172
197
  if (msg.type === "tool-call") {
173
198
  const flushed = this.flush();
174
199
  const call = this.ensureSessionCallId(msg.callId);
200
+ const label = piSubagentLabel(msg.args ?? {});
201
+ const subagent = label ? this.subagentByCall.get(msg.callId) ?? cuid2.createId() : void 0;
202
+ const started = subagent !== void 0 && !this.subagentByCall.has(msg.callId);
203
+ if (subagent) this.subagentByCall.set(msg.callId, subagent);
175
204
  return [
176
205
  ...flushed,
177
206
  index.createEnvelope("agent", {
@@ -180,17 +209,22 @@ class AcpSessionManager {
180
209
  name: msg.toolName,
181
210
  title: buildToolTitle(msg.toolName),
182
211
  description: buildToolDescription(msg.toolName),
183
- args: msg.args
184
- }, turnOptions(this.currentTurnId, this.nextTime()))
212
+ // The web links the call row to the sub-agent card by this id (as for Claude's Agent).
213
+ args: subagent ? { ...msg.args, sessionSubagent: subagent } : msg.args
214
+ }, turnOptions(this.currentTurnId, this.nextTime())),
215
+ ...started && label ? [index.createEnvelope("agent", { t: "start", ...label }, { ...turnOptions(this.currentTurnId, this.nextTime()), subagent })] : []
185
216
  ];
186
217
  }
187
218
  if (msg.type === "tool-result") {
188
219
  const flushed = this.flush();
189
220
  const call = this.ensureSessionCallId(msg.callId);
190
221
  const result = toolCallEndResult(msg.result);
222
+ const subagent = this.subagentByCall.get(msg.callId);
223
+ if (subagent) this.subagentByCall.delete(msg.callId);
191
224
  return [
192
225
  ...flushed,
193
- index.createEnvelope("agent", { t: "tool-call-end", call, ...result ? { result } : {} }, turnOptions(this.currentTurnId, this.nextTime()))
226
+ index.createEnvelope("agent", { t: "tool-call-end", call, ...result ? { result } : {} }, turnOptions(this.currentTurnId, this.nextTime())),
227
+ ...subagent ? [index.createEnvelope("agent", { t: "stop", status: subagentStopStatus(msg.result) }, { ...turnOptions(this.currentTurnId, this.nextTime()), subagent })] : []
194
228
  ];
195
229
  }
196
230
  return [];