very-happy-cli 0.2.200 → 0.2.202

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 (216) hide show
  1. package/dist/{AcpBackend-CwSShYPI.cjs → AcpBackend-BRcPXur6.cjs} +3 -3
  2. package/dist/{AcpBackend-Cnp6WNn8.mjs → AcpBackend-Z51picBa.mjs} +3 -3
  3. package/dist/{AcpSessionManager-C4O3jhT_.mjs → AcpSessionManager-BCGqL1Em.mjs} +2 -2
  4. package/dist/{AcpSessionManager-DqW99tOL.cjs → AcpSessionManager-BckOYH3I.cjs} +2 -2
  5. package/dist/{BasePermissionHandler-CgqjIUyG.cjs → BasePermissionHandler-BYIY3kxs.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-8Msj0Z8j.mjs → BasePermissionHandler-BhJjr-wB.mjs} +1 -1
  7. package/dist/{account-BIxPuBEs.mjs → account-B-HTHZKw.mjs} +11 -11
  8. package/dist/{account-DcNh2_SN.cjs → account-B0Wu7rJR.cjs} +11 -11
  9. package/dist/{accountService-BDJo14mY.cjs → accountService-Cns8UYGI.cjs} +4 -4
  10. package/dist/{accountService-ELazcp3V.mjs → accountService-DEpIq6CF.mjs} +4 -4
  11. package/dist/{acpSessionResume-De_sTG30.mjs → acpSessionResume-BKjQRT4V.mjs} +1 -1
  12. package/dist/{acpSessionResume-B_W8uTI6.cjs → acpSessionResume-C8Kd8eK6.cjs} +1 -1
  13. package/dist/{agentHome-C-900jC1.mjs → agentHome-BXiCouR4.mjs} +4 -4
  14. package/dist/{agentHome-C-usjJwB.cjs → agentHome-DnxSf1ox.cjs} +4 -4
  15. package/dist/{api-BPWRzeNF.cjs → api-B-FB-s4z.cjs} +10 -10
  16. package/dist/{api-DCUiAds-.mjs → api-Cu1OFHDM.mjs} +10 -10
  17. package/dist/{apiMachine-DjhbA1rL.cjs → apiMachine-DCWgI1l_.cjs} +28 -18
  18. package/dist/{apiMachine-CJl4m3V3.mjs → apiMachine-DYGPILVb.mjs} +28 -18
  19. package/dist/{attachmentContent-BKIq6EXR.mjs → attachmentContent-Dq8P5ODq.mjs} +2 -2
  20. package/dist/{attachmentContent-C2f1UEP9.cjs → attachmentContent-dXwHB_3C.cjs} +2 -2
  21. package/dist/{auth-h6oU63Ni.cjs → auth-BVNBE4B1.cjs} +8 -8
  22. package/dist/{auth-8jKFCZOX.mjs → auth-CgdE-j7z.mjs} +5 -5
  23. package/dist/{auth-uLRHXOGY.mjs → auth-D11uvx2P.mjs} +8 -8
  24. package/dist/{auth-oAnLi4Tl.cjs → auth-DpIHm7Lb.cjs} +5 -5
  25. package/dist/{auto-Bpa5iA1A.cjs → auto-Ba2b-il4.cjs} +17 -17
  26. package/dist/{auto-A5arQ-bI.mjs → auto-WdjHKP9R.mjs} +17 -17
  27. package/dist/{bootstrap-BkLFgEGF.mjs → bootstrap-BTYJf2w8.mjs} +2 -2
  28. package/dist/{bootstrap-DUKAKxrJ.cjs → bootstrap-CsZO_jkL.cjs} +2 -2
  29. package/dist/{browser-Ds-N-Dup.cjs → browser-DgufCq1K.cjs} +1 -1
  30. package/dist/{browser-BAlw0rns.mjs → browser-Dx3UOVPP.mjs} +1 -1
  31. package/dist/{claudeAccountEnv-D33xXRE7.cjs → claudeAccountEnv-Btp39mfa.cjs} +1 -1
  32. package/dist/{claudeAccountEnv-CI8RlIB9.mjs → claudeAccountEnv-DowsOlDB.mjs} +1 -1
  33. package/dist/{claudeLocal-BbsOT-EF.cjs → claudeLocal-Q0FgzhTu.cjs} +5 -5
  34. package/dist/{claudeLocal-X48n0RhP.mjs → claudeLocal-ylDKcvX0.mjs} +5 -5
  35. package/dist/{claudeLocalLauncher-D18gRtxz.mjs → claudeLocalLauncher-CtybsaR8.mjs} +10 -10
  36. package/dist/{claudeLocalLauncher-D1jS3iK4.cjs → claudeLocalLauncher-D2rZvuaW.cjs} +10 -10
  37. package/dist/{claudeSessionFork-Bkxn40Y8.cjs → claudeSessionFork-BrstQPE4.cjs} +1 -1
  38. package/dist/{claudeSessionFork-n1vMiFcP.mjs → claudeSessionFork-DRLxmv9j.mjs} +1 -1
  39. package/dist/{client-BnoN4P4t.cjs → client-CNWx72ZT.cjs} +2 -2
  40. package/dist/{client-C8BTmcrh.cjs → client-Ch4Azlny.cjs} +4 -4
  41. package/dist/{client-BgxQ9aej.mjs → client-Cj7D61by.mjs} +3 -3
  42. package/dist/{client-Blpuk2Hr.mjs → client-D0oBXuEe.mjs} +2 -2
  43. package/dist/{client-C0qjAgZ_.mjs → client-DJsXNJWO.mjs} +4 -4
  44. package/dist/{client-BXwIqRha.mjs → client-DfT_CRwl.mjs} +2 -2
  45. package/dist/{client-D0_UOmC1.cjs → client-Dq7jaxb2.cjs} +2 -2
  46. package/dist/{client-1zIbVVX5.cjs → client-xV99weGP.cjs} +3 -3
  47. package/dist/codex/happyMcpStdioBridge.cjs +18 -18
  48. package/dist/codex/happyMcpStdioBridge.mjs +18 -18
  49. package/dist/{codexAccount-BAezf1fY.mjs → codexAccount-CieIQLOX.mjs} +1 -1
  50. package/dist/{codexAccount-DfeCHUOU.cjs → codexAccount-D-OBY29W.cjs} +1 -1
  51. package/dist/{codexAppServerClient-xBeqblCj.cjs → codexAppServerClient-BwBPZonh.cjs} +3 -3
  52. package/dist/{codexAppServerClient-By4ntTIr.mjs → codexAppServerClient-DtdCZ7_b.mjs} +3 -3
  53. package/dist/{codexCommand-CgzJe-Ti.cjs → codexCommand-CsY9YFiG.cjs} +53 -52
  54. package/dist/{codexCommand-C7BVsmPu.mjs → codexCommand-D92AQCLU.mjs} +49 -48
  55. package/dist/{codexTermination-DVrdQx3Q.cjs → codexTermination-BbXG2oFT.cjs} +1 -1
  56. package/dist/{codexTermination-BS0sLBKS.mjs → codexTermination-rhIxjRMJ.mjs} +1 -1
  57. package/dist/{config-D3jidXDu.mjs → config-BnN1yFyi.mjs} +3 -3
  58. package/dist/{config-4R0rnthZ.cjs → config-Zhkmfb3O.cjs} +3 -3
  59. package/dist/{configuration-4pG95tsq.mjs → configuration-CQaLZMa-.mjs} +1 -1
  60. package/dist/{configuration-ClUt7pqs.cjs → configuration-DZUnfWp2.cjs} +1 -1
  61. package/dist/{connect-Da2NQJ3K.cjs → connect-BToTf3Gy.cjs} +13 -13
  62. package/dist/{connect-Do5qcqmg.mjs → connect-DY5QLfbI.mjs} +13 -13
  63. package/dist/{context-wMsIGwBw.cjs → context-BHydzPZw.cjs} +1 -1
  64. package/dist/{context-Cf05DtNM.mjs → context-ByTvtMXZ.mjs} +1 -1
  65. package/dist/{controlClient-SYDFcIkk.cjs → controlClient-Bfwe0Xpt.cjs} +3 -3
  66. package/dist/{controlClient-bqCKl9Nv.mjs → controlClient-Cqhd8ynk.mjs} +3 -3
  67. package/dist/{createSessionMetadata-msQTEvvn.cjs → createSessionMetadata-D_qa01wq.cjs} +2 -2
  68. package/dist/{createSessionMetadata-CQkxe_4T.mjs → createSessionMetadata-tmhDzhJZ.mjs} +2 -2
  69. package/dist/{daemonAccounts-B8xnkprW.mjs → daemonAccounts-D5shoCLt.mjs} +3 -3
  70. package/dist/{daemonAccounts-Ch_rSTSX.cjs → daemonAccounts-ciidbU2h.cjs} +2 -2
  71. package/dist/{defaultPermissionMode-BETWd5Lf.cjs → defaultPermissionMode-Cs_Tv83b.cjs} +1 -1
  72. package/dist/{defaultPermissionMode-Cl3OvdHp.mjs → defaultPermissionMode-DgeiMMqy.mjs} +1 -1
  73. package/dist/{deterministicJson-CQ8jkArF.cjs → deterministicJson-CbUdClvO.cjs} +67 -20
  74. package/dist/{deterministicJson-BRAeReBK.mjs → deterministicJson-DRL1Gs_c.mjs} +68 -21
  75. package/dist/{doctor-C9D-t20z.cjs → doctor-DHCmWcwR.cjs} +7 -7
  76. package/dist/{doctor-Dy7z3qvy.mjs → doctor-Wu0yZ80l.mjs} +7 -7
  77. package/dist/{downloadTarget-DfoOSrYi.cjs → downloadTarget-BoJrjpEe.cjs} +6 -6
  78. package/dist/{downloadTarget-Diq-GBu4.mjs → downloadTarget-G72yKQcM.mjs} +6 -6
  79. package/dist/{ensureDaemonRunning-LqrgqVG3.mjs → ensureDaemonRunning-BKGybp3s.mjs} +5 -5
  80. package/dist/{ensureDaemonRunning-Df76EtKd.cjs → ensureDaemonRunning-CnkyGd9x.cjs} +5 -5
  81. package/dist/{format-CbliQN8V.mjs → format-BSx-Nv2p.mjs} +2 -1
  82. package/dist/{format-P9_M_7ga.cjs → format-DePME4uu.cjs} +2 -1
  83. package/dist/{handleResumeCommand-Dz4Aw_aZ.mjs → handleResumeCommand-DrJdhjLD.mjs} +5 -5
  84. package/dist/{handleResumeCommand-CjCtwrrm.cjs → handleResumeCommand-uKzhaOVC.cjs} +5 -5
  85. package/dist/{index-BiutHOAO.cjs → index-44o_qMvE.cjs} +14 -4
  86. package/dist/{index-CdOnhx2X.cjs → index-BKXqaux4.cjs} +4 -4
  87. package/dist/{index-Sdvy1Lsf.mjs → index-BcYJJV-f.mjs} +3 -3
  88. package/dist/{index-ByBOdEvG.cjs → index-Bi7Lmykl.cjs} +47 -46
  89. package/dist/{index-BNBXrqRE.mjs → index-C-eSUhXW.mjs} +4 -4
  90. package/dist/{index-kwsivEs-.mjs → index-CiRMvS73.mjs} +14 -5
  91. package/dist/{index-DUwOmhnq.cjs → index-CoBaGAA4.cjs} +3 -3
  92. package/dist/{index-CjMA70-R.mjs → index-CowtCbZ_.mjs} +46 -45
  93. package/dist/{index-CbzettaI.cjs → index-DDOCSeEj.cjs} +4 -4
  94. package/dist/{index-XP-qcJQ3.mjs → index-fNsf-8K-.mjs} +4 -4
  95. package/dist/index.cjs +2 -2
  96. package/dist/index.mjs +2 -2
  97. package/dist/{install-DMXd8Z4c.mjs → install-0TkucJrC.mjs} +3 -3
  98. package/dist/{install-C4dKrmxR.cjs → install-Ddc8TlWE.cjs} +3 -3
  99. package/dist/{issue-BijeNKIT.cjs → issue-CIfzJuaS.cjs} +8 -8
  100. package/dist/{issue-COytLvGE.mjs → issue-CML2xa46.mjs} +8 -8
  101. package/dist/lib.cjs +12 -12
  102. package/dist/lib.d.cts +4 -0
  103. package/dist/lib.d.mts +4 -0
  104. package/dist/lib.mjs +12 -12
  105. package/dist/{localHappyAgentAuth-DeDQjw24.mjs → localHappyAgentAuth-BUX4E1ug.mjs} +1 -1
  106. package/dist/{localHappyAgentAuth-CjtNcaI0.cjs → localHappyAgentAuth-WLqXQbc6.cjs} +1 -1
  107. package/dist/{logger-BLMi8oJK.mjs → logger-BEVIGYKL.mjs} +17 -3
  108. package/dist/{logger-D28MY1Bv.cjs → logger-Dhc0l3xH.cjs} +17 -2
  109. package/dist/{machineMetadata-D8OWVD4l.mjs → machineMetadata-BQdp_ihk.mjs} +3 -3
  110. package/dist/{machineMetadata-BzjrIn_N.cjs → machineMetadata-ixKckJ7k.cjs} +3 -3
  111. package/dist/{main-DoJIcSOh.cjs → main-BNBYOcQb.cjs} +49 -49
  112. package/dist/{main-c0fCuBON.mjs → main-BzQSe4Zu.mjs} +49 -49
  113. package/dist/{mcp-DKkBFGUa.mjs → mcp-BueI4Bel.mjs} +18 -18
  114. package/dist/{mcp-CEtvR6tG.cjs → mcp-BwskAxOK.cjs} +18 -18
  115. package/dist/{mirrorProtocol-DFQLXDBI.mjs → mirrorProtocol-5aFYsCCe.mjs} +3 -3
  116. package/dist/{mirrorProtocol-CCl9dtzh.cjs → mirrorProtocol-DGMmhArw.cjs} +3 -3
  117. package/dist/{package-BFSsS_dl.cjs → package-CAmlKYcH.cjs} +7 -7
  118. package/dist/{package-DbGqY8Ej.mjs → package-aOUtHYRZ.mjs} +7 -7
  119. package/dist/{panels-2yIO9FxQ.mjs → panels-BeVMgmRW.mjs} +5 -5
  120. package/dist/{panels-BqLXIQif.cjs → panels-By2IDfXv.cjs} +5 -5
  121. package/dist/{peerTools-4GYKxr8J.mjs → peerTools-BkRgJomj.mjs} +5 -5
  122. package/dist/{peerTools-Z8V2E0AF.cjs → peerTools-dgllF1wT.cjs} +5 -5
  123. package/dist/{persistence-TpVFA5-I.cjs → persistence-05BAS4Ou.cjs} +12 -2
  124. package/dist/{persistence-DbOKjdUD.mjs → persistence-EuUaQKL7.mjs} +12 -3
  125. package/dist/{piRunnerArgs-Bdj0sjAT.mjs → piRunnerArgs-CygWrAwY.mjs} +1 -1
  126. package/dist/{piRunnerArgs-DOEJJymf.cjs → piRunnerArgs-DkjCRPYn.cjs} +1 -1
  127. package/dist/{piRuntime-B0QZykV7.mjs → piRuntime-LRW_t6ME.mjs} +1 -1
  128. package/dist/{piRuntime-DiRayy91.cjs → piRuntime-zY2jIQod.cjs} +1 -1
  129. package/dist/{piTerminal-DciFqPEi.cjs → piTerminal-BfZshXGh.cjs} +20 -20
  130. package/dist/{piTerminal-DGF4X7C-.mjs → piTerminal-BhlPA1HR.mjs} +20 -20
  131. package/dist/{pushNotifications-CrCTpDiN.mjs → pushNotifications-B7Ga8Zyf.mjs} +3 -3
  132. package/dist/{pushNotifications-C1i2W1GQ.cjs → pushNotifications-DaVlLe7N.cjs} +3 -3
  133. package/dist/{query-CrSvcV32.mjs → query-BQLtwpr9.mjs} +1 -1
  134. package/dist/{query-BkOpCpRo.cjs → query-CX0Of89i.cjs} +1 -1
  135. package/dist/{rateLimitWindows-BREA7OZj.cjs → rateLimitWindows-CpSOlXBt.cjs} +1 -1
  136. package/dist/{rateLimitWindows-DZVrafmm.mjs → rateLimitWindows-hv2zLYid.mjs} +1 -1
  137. package/dist/{reconnectGate-YQ5jXJfY.cjs → reconnectGate-B_aJrehH.cjs} +1 -1
  138. package/dist/{reconnectGate-COxAZTv8.mjs → reconnectGate-DO_ZQmJE.mjs} +1 -1
  139. package/dist/{registerCommonHandlers-Cfl_dEWs.mjs → registerCommonHandlers-BEpK4WD2.mjs} +2 -2
  140. package/dist/{registerCommonHandlers-D95IxqDN.cjs → registerCommonHandlers-em2elV3l.cjs} +2 -2
  141. package/dist/{registerKillSessionHandler-DoE6xgH3.mjs → registerKillSessionHandler-D-dDzI2n.mjs} +6 -6
  142. package/dist/{registerKillSessionHandler-DJJXtc_L.cjs → registerKillSessionHandler-D4ZQvsH2.cjs} +6 -6
  143. package/dist/{registerSideQuestionHandler-DsRz-aD9.cjs → registerSideQuestionHandler-BIOLUe2U.cjs} +4 -4
  144. package/dist/{registerSideQuestionHandler-Dv00rqcy.mjs → registerSideQuestionHandler-okUy9Q_-.mjs} +4 -4
  145. package/dist/{remoteSessionClient-DleOeQlN.cjs → remoteSessionClient-BLWFXMBo.cjs} +5 -5
  146. package/dist/{remoteSessionClient-BFd_D9ka.mjs → remoteSessionClient-CzjLyL9c.mjs} +5 -5
  147. package/dist/{reportProgressTool-D4xKY9Ur.mjs → reportProgressTool-CNi0Vqqm.mjs} +5 -5
  148. package/dist/{reportProgressTool-DtEpDqv3.cjs → reportProgressTool-DcNBXBw8.cjs} +5 -5
  149. package/dist/{run-iDEMW4js.mjs → run-D59Gb4SQ.mjs} +272 -73
  150. package/dist/{run-CVAIFpsp.cjs → run-bzlz4DI1.cjs} +272 -73
  151. package/dist/{runClaude-DvHdLJaV.mjs → runClaude-DZtdmcXK.mjs} +26 -25
  152. package/dist/{runClaude-gucCQBma.cjs → runClaude-kVp1PKab.cjs} +29 -28
  153. package/dist/{runClaudeDeps-CQ8vvqUQ.cjs → runClaudeDeps-BHv9FkVz.cjs} +43 -42
  154. package/dist/{runClaudeDeps-DkFWFwVc.mjs → runClaudeDeps-D83tR1KP.mjs} +49 -48
  155. package/dist/{runGemini-B2lXQDru.mjs → runGemini-DLc_bL4E.mjs} +36 -35
  156. package/dist/{runGemini-C0vqJYtS.cjs → runGemini-W-0t7skM.cjs} +36 -35
  157. package/dist/{runOpenClaw-DNV7GX73.cjs → runOpenClaw-BsqbOw8R.cjs} +18 -18
  158. package/dist/{runOpenClaw-Ddb6sOkY.mjs → runOpenClaw-mm-hKxMC.mjs} +18 -18
  159. package/dist/{sandbox-Cw0cPDDh.mjs → sandbox-DXbKl-Os.mjs} +4 -4
  160. package/dist/{sandbox-FA0RlaZg.cjs → sandbox-DrWJss7J.cjs} +4 -4
  161. package/dist/selfCheck-B1XdrEbN.mjs +89 -0
  162. package/dist/{selfCheck-DFC8fzhF.cjs → selfCheck-CVXucSXR.cjs} +40 -40
  163. package/dist/{send-CwgqPftE.mjs → send-Cdda78Iw.mjs} +8 -8
  164. package/dist/{send-BFd-5b_Q.cjs → send-D7pRBaht.cjs} +8 -8
  165. package/dist/{server-DwOdMGAP.cjs → server-BI6defPs.cjs} +6 -6
  166. package/dist/{server-C_4Fk45r.mjs → server-CNilQcJK.mjs} +4 -4
  167. package/dist/{sessionLock-DglhFHzB.cjs → sessionLock-Bjsy90aM.cjs} +3 -3
  168. package/dist/{sessionLock-CphKQyav.mjs → sessionLock-CVjlaRSL.mjs} +3 -3
  169. package/dist/sessionMetadata-B44cL4Xj.cjs +29 -0
  170. package/dist/sessionMetadata-C1eoAi89.mjs +25 -0
  171. package/dist/{sessionOps-D-uFSTHk.mjs → sessionOps-CV5RUpwG.mjs} +4 -4
  172. package/dist/{sessionOps-CIFvoFPA.cjs → sessionOps-CvmOHwGP.cjs} +4 -4
  173. package/dist/{sessionProvider-B0daO-Ln.cjs → sessionProvider-4sWr0Myr.cjs} +10 -10
  174. package/dist/{sessionProvider-D8y7K8bK.mjs → sessionProvider-BmO4ahnt.mjs} +10 -10
  175. package/dist/{sessionScanner-DQAOP6pU.mjs → sessionScanner-34Q0vTR3.mjs} +3 -3
  176. package/dist/{sessionScanner-CWflbWoH.cjs → sessionScanner-DZBiEOyb.cjs} +3 -3
  177. package/dist/{sessions-CaO_-AI7.mjs → sessions-Cl435KQT.mjs} +10 -10
  178. package/dist/{sessions-CzpI76qj.cjs → sessions-DjAXZWTX.cjs} +10 -10
  179. package/dist/{setupOfflineReconnection-Ck-p0YPb.mjs → setupOfflineReconnection-BC5FJTkc.mjs} +2 -2
  180. package/dist/{setupOfflineReconnection-BZHRoKDx.cjs → setupOfflineReconnection-zebrb6U_.cjs} +2 -2
  181. package/dist/{spawn-DyjOa4nf.cjs → spawn-C8cJK9-m.cjs} +14 -14
  182. package/dist/{spawn-BEJxfj60.mjs → spawn-DqWdgMt_.mjs} +14 -14
  183. package/dist/{spawnAgents-XObVj6zN.mjs → spawnAgents-BclZYkov.mjs} +1 -1
  184. package/dist/{spawnAgents-IiuqX0S5.cjs → spawnAgents-DvbEDCIq.cjs} +1 -1
  185. package/dist/{spawnHappyCLI-Cc9kKpcq.mjs → spawnHappyCLI-BckHSjR0.mjs} +1 -1
  186. package/dist/{spawnHappyCLI-C3XuIB2N.cjs → spawnHappyCLI-CeWgULMt.cjs} +1 -1
  187. package/dist/{startFileWatcher-t3K1y9kY.mjs → startFileWatcher-BXiBlfVr.mjs} +1 -1
  188. package/dist/{startFileWatcher-CeDJl9mN.cjs → startFileWatcher-CXZYt0y9.cjs} +1 -1
  189. package/dist/{sessionMetadata-DyTJ0Ki5.cjs → startupSessionCreate-CycB-kwu.cjs} +3 -14
  190. package/dist/{sessionMetadata-V7Z7F-cj.mjs → startupSessionCreate-D8hODW7I.mjs} +4 -14
  191. package/dist/{store-DOZAMV4W.cjs → store-Cpb1LMNW.cjs} +1 -1
  192. package/dist/{store-CqNAE-0v.mjs → store-DWmjM4Ex.mjs} +1 -1
  193. package/dist/{streamRelay-Dyp4x44P.cjs → streamRelay-4XiiNB3N.cjs} +1 -1
  194. package/dist/{streamRelay-7D7v0hvk.mjs → streamRelay-DdGOsW8v.mjs} +1 -1
  195. package/dist/{sync-s1pUqWGm.mjs → sync-BfM5OKSS.mjs} +1 -1
  196. package/dist/{sync-BvxhuW9R.cjs → sync-CyUWevwD.cjs} +1 -1
  197. package/dist/{systemPrompt-CCdSrtn3.cjs → systemPrompt-BUZQDf4k.cjs} +2 -2
  198. package/dist/{systemPrompt-CLYTbBhV.mjs → systemPrompt-Tu_2ixE3.mjs} +2 -2
  199. package/dist/{teams-BVp5F_xN.mjs → teams-Cpdqvfe3.mjs} +7 -7
  200. package/dist/{teams-D2q1DQWz.cjs → teams-KjHee0Vg.cjs} +7 -7
  201. package/dist/{template-M1YGFYUT.cjs → template-3fV9bi0X.cjs} +1 -1
  202. package/dist/{template-oBrR0saD.mjs → template-CtRLg2PG.mjs} +1 -1
  203. package/dist/{time-qd46L189.mjs → time-BQWf06hA.mjs} +1 -1
  204. package/dist/{time-D-v2Cd9e.cjs → time-CbOTVtAt.cjs} +1 -1
  205. package/dist/{titleGenerator-CSYqcorn.cjs → titleGenerator-CpiQkf_r.cjs} +3 -3
  206. package/dist/{titleGenerator-BdeHi3IY.mjs → titleGenerator-DYnqd0oI.mjs} +2 -2
  207. package/dist/{todo-Dq_YuJvj.cjs → todo-Cp6bRp62.cjs} +26 -18
  208. package/dist/{todo-DiEhLgUZ.mjs → todo-DVrsXyKn.mjs} +26 -18
  209. package/dist/{tools-CY2zrdd5.cjs → tools-BFQm7xny.cjs} +1 -1
  210. package/dist/{tools-DR7GWBBV.mjs → tools-XGAJepvT.mjs} +1 -1
  211. package/dist/{uninstall-BvwDZVU9.mjs → uninstall-C2LF0vtR.mjs} +3 -3
  212. package/dist/{uninstall-BHhHjbzE.cjs → uninstall-Cyqq90JW.cjs} +3 -3
  213. package/dist/{wrapperAccount-ejUjAQaM.cjs → wrapperAccount-nGGMJDBF.cjs} +2 -2
  214. package/dist/{wrapperAccount-CpDsQL15.mjs → wrapperAccount-z8Swrd08.mjs} +2 -2
  215. package/package.json +7 -7
  216. package/dist/selfCheck-B-hKig8I.mjs +0 -89
@@ -1,28 +1,29 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-CCl9dtzh.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-DGMmhArw.cjs');
4
4
  var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
5
- var piRunnerArgs = require('./piRunnerArgs-DOEJJymf.cjs');
5
+ var piRunnerArgs = require('./piRunnerArgs-DkjCRPYn.cjs');
6
6
  var fs = require('fs/promises');
7
7
  var os$1 = require('os');
8
8
  var tmp = require('tmp');
9
9
  var axios = require('axios');
10
+ var sessionMetadata = require('./sessionMetadata-B44cL4Xj.cjs');
10
11
  var node_fs = require('node:fs');
11
12
  var path = require('node:path');
12
- var configuration = require('./configuration-ClUt7pqs.cjs');
13
- var api = require('./api-BPWRzeNF.cjs');
14
- var spawnAgents = require('./spawnAgents-IiuqX0S5.cjs');
15
- var logger = require('./logger-D28MY1Bv.cjs');
16
- var index$2 = require('./index-DUwOmhnq.cjs');
17
- var auth = require('./auth-oAnLi4Tl.cjs');
13
+ var configuration = require('./configuration-DZUnfWp2.cjs');
14
+ var api = require('./api-B-FB-s4z.cjs');
15
+ var spawnAgents = require('./spawnAgents-DvbEDCIq.cjs');
16
+ var logger = require('./logger-Dhc0l3xH.cjs');
17
+ var index$2 = require('./index-CoBaGAA4.cjs');
18
+ var auth = require('./auth-DpIHm7Lb.cjs');
18
19
  var child_process = require('child_process');
19
- var _package = require('./package-BFSsS_dl.cjs');
20
- var doctor = require('./doctor-C9D-t20z.cjs');
21
- var spawnHappyCLI = require('./spawnHappyCLI-C3XuIB2N.cjs');
22
- var persistence = require('./persistence-TpVFA5-I.cjs');
23
- var controlClient = require('./controlClient-SYDFcIkk.cjs');
24
- var sessionOps = require('./sessionOps-CIFvoFPA.cjs');
25
- var index = require('./index-BiutHOAO.cjs');
20
+ var _package = require('./package-CAmlKYcH.cjs');
21
+ var doctor = require('./doctor-DHCmWcwR.cjs');
22
+ var spawnHappyCLI = require('./spawnHappyCLI-CeWgULMt.cjs');
23
+ var persistence = require('./persistence-05BAS4Ou.cjs');
24
+ var controlClient = require('./controlClient-Bfwe0Xpt.cjs');
25
+ var sessionOps = require('./sessionOps-CvmOHwGP.cjs');
26
+ var index = require('./index-44o_qMvE.cjs');
26
27
  var fastify = require('fastify');
27
28
  var z = require('zod');
28
29
  var fastifyTypeProviderZod = require('fastify-type-provider-zod');
@@ -30,69 +31,69 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
30
31
  var node_crypto = require('node:crypto');
31
32
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
32
33
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
33
- var rateLimitWindows = require('./rateLimitWindows-BREA7OZj.cjs');
34
- var peerTools = require('./peerTools-Z8V2E0AF.cjs');
34
+ var rateLimitWindows = require('./rateLimitWindows-CpSOlXBt.cjs');
35
+ var peerTools = require('./peerTools-dgllF1wT.cjs');
35
36
  var os = require('node:os');
36
- var remoteSessionClient = require('./remoteSessionClient-DleOeQlN.cjs');
37
- var bootstrap = require('./bootstrap-DUKAKxrJ.cjs');
38
- var index$1 = require('./index-CbzettaI.cjs');
37
+ var remoteSessionClient = require('./remoteSessionClient-BLWFXMBo.cjs');
38
+ var bootstrap = require('./bootstrap-CsZO_jkL.cjs');
39
+ var index$1 = require('./index-DDOCSeEj.cjs');
39
40
  var require$$0 = require('fs');
40
41
  var require$$1 = require('path');
41
42
  var node_child_process = require('node:child_process');
42
43
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
43
44
  var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
44
- var machineMetadata = require('./machineMetadata-BzjrIn_N.cjs');
45
+ var machineMetadata = require('./machineMetadata-ixKckJ7k.cjs');
45
46
  var fileStore = require('./fileStore-7qhnbs6N.cjs');
46
47
  var pi = require('./pi-DlsrPCTa.cjs');
47
- var codexAccount = require('./codexAccount-DfeCHUOU.cjs');
48
+ var codexAccount = require('./codexAccount-D-OBY29W.cjs');
48
49
  var require$$3 = require('crypto');
49
50
  var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
50
- var handleResumeCommand = require('./handleResumeCommand-CjCtwrrm.cjs');
51
+ var handleResumeCommand = require('./handleResumeCommand-uKzhaOVC.cjs');
51
52
  var webPanels = require('./webPanels-FCgFKvVe.cjs');
52
53
  var promises = require('node:fs/promises');
53
54
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
54
- var client = require('./client-BnoN4P4t.cjs');
55
- var sessionLock = require('./sessionLock-DglhFHzB.cjs');
56
- var client$1 = require('./client-D0_UOmC1.cjs');
55
+ var client = require('./client-CNWx72ZT.cjs');
56
+ var sessionLock = require('./sessionLock-Bjsy90aM.cjs');
57
+ var client$1 = require('./client-Dq7jaxb2.cjs');
57
58
  var daemonSupervisor = require('./daemonSupervisor-alqGPANc.cjs');
58
- var accountService = require('./accountService-BDJo14mY.cjs');
59
- var daemonAccounts = require('./daemonAccounts-Ch_rSTSX.cjs');
59
+ var accountService = require('./accountService-Cns8UYGI.cjs');
60
+ var daemonAccounts = require('./daemonAccounts-ciidbU2h.cjs');
60
61
  var path$1 = require('./path-B7zW-WwE.cjs');
61
62
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
62
- var startFileWatcher = require('./startFileWatcher-CeDJl9mN.cjs');
63
- var sync = require('./sync-BvxhuW9R.cjs');
63
+ var startFileWatcher = require('./startFileWatcher-CXZYt0y9.cjs');
64
+ var sync = require('./sync-CyUWevwD.cjs');
64
65
  var types = require('./types-CRS-srZK.cjs');
65
66
  var tmuxSocket = require('./tmuxSocket-Dg11Olx0.cjs');
66
67
  var processTermination = require('./processTermination-f17wxlMb.cjs');
67
68
  var doctor$1 = require('./doctor-CJpFhHoK.cjs');
68
69
  var resources = require('./resources-BZ_Be0qM.cjs');
69
70
  var node_util = require('node:util');
70
- var template = require('./template-M1YGFYUT.cjs');
71
- var client$2 = require('./client-1zIbVVX5.cjs');
71
+ var template = require('./template-3fV9bi0X.cjs');
72
+ var client$2 = require('./client-xV99weGP.cjs');
72
73
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
73
- var store = require('./store-DOZAMV4W.cjs');
74
- require('./acpSessionResume-B_W8uTI6.cjs');
75
- require('./pushNotifications-C1i2W1GQ.cjs');
74
+ var store = require('./store-Cpb1LMNW.cjs');
75
+ require('./acpSessionResume-C8Kd8eK6.cjs');
76
+ require('./pushNotifications-DaVlLe7N.cjs');
76
77
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
77
- require('./reconnectGate-YQ5jXJfY.cjs');
78
+ require('./reconnectGate-B_aJrehH.cjs');
78
79
  require('node:events');
79
80
  require('socket.io-client');
80
81
  require('./limits-C-a7gr04.cjs');
81
- require('./time-D-v2Cd9e.cjs');
82
- require('./registerCommonHandlers-D95IxqDN.cjs');
82
+ require('./time-CbOTVtAt.cjs');
83
+ require('./registerCommonHandlers-em2elV3l.cjs');
83
84
  require('util');
84
85
  require('cross-spawn');
85
86
  require('@paralleldrive/cuid2');
86
87
  require('chalk');
87
88
  require('node:module');
88
89
  require('tweetnacl');
89
- require('./browser-Ds-N-Dup.cjs');
90
+ require('./browser-DgufCq1K.cjs');
90
91
  require('open');
91
92
  require('./specialCommands-J3JFOq0J.cjs');
92
93
  require('./ids-B6ZC0HGt.cjs');
93
94
  require('url');
94
- require('./localHappyAgentAuth-CjtNcaI0.cjs');
95
- require('./claudeAccountEnv-D33xXRE7.cjs');
95
+ require('./localHappyAgentAuth-WLqXQbc6.cjs');
96
+ require('./claudeAccountEnv-Btp39mfa.cjs');
96
97
  require('node:readline');
97
98
  require('node-pty');
98
99
  require('./processTreeSnapshot-D5iNblp6.cjs');
@@ -3914,8 +3915,9 @@ function createUpdateController(deps) {
3914
3915
  outcome = { state, version, detail, at: now(), ...manualVersion ? { source: "manual" } : {} };
3915
3916
  deps.publish(snapshot());
3916
3917
  }
3918
+ const superseded = () => !!deps.owned && !deps.owned();
3917
3919
  async function evaluate() {
3918
- if (!policy || running) return;
3920
+ if (!policy || running || superseded()) return;
3919
3921
  const target = manualVersion ?? policy.autoUpdateVersion ?? null;
3920
3922
  if (outcome?.version === target && ["failed", "installed", "manual_required"].includes(outcome.state)) {
3921
3923
  const fingerprint = JSON.stringify([policy.checkedAt, outcome.state, outcome.version, outcome.detail, manualVersion, autoUpdateEnabled]);
@@ -4007,19 +4009,23 @@ function createUpdateController(deps) {
4007
4009
  }
4008
4010
  }
4009
4011
  async function refresh() {
4010
- if (operation || blocked) return;
4012
+ if (superseded()) return "superseded";
4013
+ if (blocked) return "blocked";
4014
+ if (operation) return "busy";
4011
4015
  operation = "refresh";
4012
4016
  try {
4013
4017
  const next = await deps.policy();
4014
- if (!next) return;
4018
+ if (!next) return "unavailable";
4015
4019
  if (manualVersion && !validManualTarget(next, manualVersion)) manualVersion = null;
4016
4020
  policy = next;
4017
4021
  await evaluate();
4022
+ return policyStale() ? "stale" : "ok";
4018
4023
  } finally {
4019
4024
  operation = null;
4020
4025
  }
4021
4026
  }
4022
4027
  async function retry(version) {
4028
+ if (superseded()) return { error: "daemon_superseded" };
4023
4029
  if (operation || blocked) return { error: blocked ? "manual_recovery_required" : "update_in_progress" };
4024
4030
  if (typeof version !== "string" || outcome?.state !== "failed" || outcome.version !== version) {
4025
4031
  return { error: "no_matching_failed_update" };
@@ -4044,6 +4050,7 @@ function createUpdateController(deps) {
4044
4050
  }
4045
4051
  }
4046
4052
  async function request(version) {
4053
+ if (superseded()) return { error: "daemon_superseded" };
4047
4054
  if (operation || blocked) return { error: blocked ? "manual_recovery_required" : "update_in_progress" };
4048
4055
  operation = "request";
4049
4056
  try {
@@ -4087,7 +4094,8 @@ function createUpdateController(deps) {
4087
4094
  handoverHold = { reason, at: now() };
4088
4095
  publish("failed", manualVersion ?? policy?.autoUpdateVersion ?? null, "handover_preflight_failed");
4089
4096
  }
4090
- return { refresh, retry, request, tick, withHandover, holdHandover, isRunning: () => running, currentTarget: () => policy?.autoUpdateVersion ?? null };
4097
+ const policyStale = () => !policy || now() - policy.checkedAt > 65 * 6e4;
4098
+ return { refresh, retry, request, tick, withHandover, holdHandover, policyStale, isRunning: () => running, currentTarget: () => policy?.autoUpdateVersion ?? null };
4091
4099
  }
4092
4100
 
4093
4101
  const defaults = {
@@ -4296,6 +4304,132 @@ function createPolicyAnnouncementHandler(deps) {
4296
4304
  };
4297
4305
  }
4298
4306
 
4307
+ const POLICY_REFRESH_MIN_INTERVAL_MS = 5 * 6e4;
4308
+ const POLICY_REFRESH_RETRY_MS = 3e4;
4309
+ const POLICY_REFRESH_MAX_BACKOFF_MS = 30 * 6e4;
4310
+ const WAKE_GAP_SLACK_MS = 2 * 6e4;
4311
+ function createPolicyRefreshTrigger(deps) {
4312
+ const now = deps.now ?? Date.now;
4313
+ const minIntervalMs = deps.minIntervalMs ?? POLICY_REFRESH_MIN_INTERVAL_MS;
4314
+ const retryMs = deps.retryMs ?? POLICY_REFRESH_RETRY_MS;
4315
+ const maxBackoffMs = deps.maxBackoffMs ?? POLICY_REFRESH_MAX_BACKOFF_MS;
4316
+ const setTimer = deps.setTimer ?? ((fn, ms) => {
4317
+ const t = setTimeout(fn, ms);
4318
+ t.unref?.();
4319
+ return t;
4320
+ });
4321
+ const clearTimer = deps.clearTimer ?? ((handle) => clearTimeout(handle));
4322
+ const log = (message, level) => deps.log?.(message, level);
4323
+ let lastSuccessAt = null;
4324
+ let lastAttemptAt = null;
4325
+ let lastBypassAt = null;
4326
+ let failures = 0;
4327
+ let inFlight = false;
4328
+ let timer = null;
4329
+ let stopped = false;
4330
+ const backoff = (n) => n <= 0 ? retryMs : Math.min(retryMs * 2 ** (n - 1), maxBackoffMs);
4331
+ function earliestRun(reason) {
4332
+ const windowEnd = lastSuccessAt === null ? 0 : lastSuccessAt + minIntervalMs;
4333
+ const retryAt = lastAttemptAt === null ? 0 : lastAttemptAt + backoff(failures);
4334
+ if (retryAt <= Math.max(windowEnd, now())) return { at: windowEnd, bypass: false };
4335
+ const mayBypass = (reason === "connect" || reason === "wake") && (lastBypassAt === null || now() - lastBypassAt >= minIntervalMs);
4336
+ return mayBypass ? { at: windowEnd, bypass: true } : { at: retryAt, bypass: false };
4337
+ }
4338
+ function defer(ms) {
4339
+ if (timer !== null) return;
4340
+ timer = setTimer(() => {
4341
+ timer = null;
4342
+ request("scheduled");
4343
+ }, Math.max(0, ms));
4344
+ }
4345
+ function run(reason) {
4346
+ inFlight = true;
4347
+ lastAttemptAt = now();
4348
+ log(`CLI update policy refresh (${reason})`, failures === 0 ? "warn" : "debug");
4349
+ void deps.refresh().catch(() => "unavailable").then((result) => {
4350
+ inFlight = false;
4351
+ if (result === "superseded") {
4352
+ stop();
4353
+ return;
4354
+ }
4355
+ if (result === "ok") {
4356
+ if (failures > 0) log(`CLI update policy refresh recovered after ${failures} failed attempt(s)`, "warn");
4357
+ lastSuccessAt = now();
4358
+ failures = 0;
4359
+ return;
4360
+ }
4361
+ if (result === "busy") lastAttemptAt = now();
4362
+ else {
4363
+ if (result === "stale") lastSuccessAt = now();
4364
+ failures += 1;
4365
+ const stepUp = failures === 1 || backoff(failures) > backoff(failures - 1);
4366
+ const next = result === "blocked" ? "waiting for the next connect / wake / hourly check" : `next try in ${Math.round(backoff(failures) / 1e3)}s`;
4367
+ log(`CLI update policy refresh (${reason}) read no fresh policy (${result}, ${failures} in a row); ${next}`, stepUp ? "warn" : "debug");
4368
+ }
4369
+ if (stopped || result === "blocked") return;
4370
+ defer(earliestRun("scheduled").at - now());
4371
+ });
4372
+ }
4373
+ function request(reason) {
4374
+ if (stopped) return "stopped";
4375
+ if (inFlight) return "in-flight";
4376
+ const { at, bypass } = earliestRun(reason);
4377
+ const wait = at - now();
4378
+ if (wait > 0) {
4379
+ defer(wait);
4380
+ return "deferred";
4381
+ }
4382
+ if (bypass) lastBypassAt = now();
4383
+ if (timer !== null) {
4384
+ clearTimer(timer);
4385
+ timer = null;
4386
+ }
4387
+ run(reason);
4388
+ return "run";
4389
+ }
4390
+ function stop() {
4391
+ stopped = true;
4392
+ if (timer !== null) clearTimer(timer);
4393
+ timer = null;
4394
+ }
4395
+ return {
4396
+ request,
4397
+ /** Any other refresh (startup, hourly, announcement) that read a policy restarts the window (and a fresh one ends the backoff); one that found us superseded stops it. */
4398
+ noteRefreshed(result) {
4399
+ if (result === "ok" || result === "stale") lastSuccessAt = now();
4400
+ if (result === "ok") failures = 0;
4401
+ else if (result === "superseded") stop();
4402
+ },
4403
+ stop
4404
+ };
4405
+ }
4406
+ function createWakeDetector(intervalMs, now = Date.now, slackMs = WAKE_GAP_SLACK_MS) {
4407
+ let last = null;
4408
+ return {
4409
+ /** Call once per heartbeat; true when the process was just suspended. */
4410
+ beat() {
4411
+ const at = now();
4412
+ const woke = last !== null && at - last > intervalMs + slackMs;
4413
+ last = at;
4414
+ return woke;
4415
+ }
4416
+ };
4417
+ }
4418
+
4419
+ function createDaemonOwnership(deps) {
4420
+ let superseded = false;
4421
+ return {
4422
+ owns() {
4423
+ if (superseded) return false;
4424
+ const ownerPid = deps.statePid();
4425
+ if (ownerPid === null || ownerPid === deps.pid) return true;
4426
+ superseded = true;
4427
+ deps.onSuperseded(ownerPid);
4428
+ return false;
4429
+ }
4430
+ };
4431
+ }
4432
+
4299
4433
  const HARNESS_INSTALL_CATALOG = Object.freeze({
4300
4434
  claude: Object.freeze({ packages: [{ name: "@anthropic-ai/claude-code", spec: "latest" }], commands: ["claude"], minNode: "22.0.0", scripts: true }),
4301
4435
  codex: Object.freeze({ packages: [{ name: "@openai/codex", spec: "latest" }], commands: ["codex"], minNode: "16.0.0", scripts: false }),
@@ -7074,6 +7208,7 @@ function listIssueReceipts(home, now = Date.now()) {
7074
7208
 
7075
7209
  const ISSUE_POLL_MS = 5e3;
7076
7210
  const ISSUE_SPAWNED_BY = "issue";
7211
+ const ISSUE_SPAWN_UNKNOWN_GRACE_MS = 6e4;
7077
7212
  const FIRST_MESSAGE_KEY_WAIT_MS = 1e4;
7078
7213
  function issueKeyFromPrompt(prompt) {
7079
7214
  return /^You are assigned issue ([A-Z]+-\d{1,9}):/.exec(prompt)?.[1] ?? null;
@@ -7125,10 +7260,35 @@ function createIssueWorker(deps) {
7125
7260
  writeIssueReceipt(home, receipt);
7126
7261
  return receipt;
7127
7262
  };
7128
- async function fail(receipt, error, unknown = false) {
7129
- await client.fail(receipt.dispatchId, { machineId: deps.machineId, claimId: receipt.claimId, error: error.slice(0, 4e3), ...unknown ? { unknown: true } : {} });
7130
- save({ ...receipt, phase: unknown ? receipt.phase : "failed" });
7131
- deps.log(`Issue dispatch ${receipt.dispatchId} ${unknown ? "outcome unknown" : "failed"}`);
7263
+ const now = deps.now ?? Date.now;
7264
+ const unknownSpawns = /* @__PURE__ */ new Map();
7265
+ async function fail(receipt, error) {
7266
+ await client.fail(receipt.dispatchId, { machineId: deps.machineId, claimId: receipt.claimId, error: error.slice(0, 4e3) });
7267
+ save({ ...receipt, phase: "failed" });
7268
+ deps.log(`Issue dispatch ${receipt.dispatchId} failed`);
7269
+ }
7270
+ function holdUnknown(view, receipt, reason) {
7271
+ const held = unknownSpawns.get(view.id);
7272
+ unknownSpawns.set(view.id, { view, receipt, reason, deadline: held?.deadline ?? now() + ISSUE_SPAWN_UNKNOWN_GRACE_MS });
7273
+ deps.log(`Issue dispatch ${view.id} spawn outcome unknown; re-checking`);
7274
+ }
7275
+ async function recheckUnknown() {
7276
+ for (const [id, held] of [...unknownSpawns]) {
7277
+ if (closed) return;
7278
+ const matches = persistedRunSessions(held.view.runId);
7279
+ try {
7280
+ if (matches.length === 1) {
7281
+ unknownSpawns.delete(id);
7282
+ await afterSpawn(held.view, save({ ...held.receipt, sessionId: matches[0], phase: "spawned" }));
7283
+ } else if (matches.length > 1 || now() >= held.deadline) {
7284
+ unknownSpawns.delete(id);
7285
+ await fail(held.receipt, matches.length > 1 ? `Spawn produced ${matches.length} sessions for this run; stop the extra ones and retry` : `Session did not start within ${Math.round(ISSUE_SPAWN_UNKNOWN_GRACE_MS / 1e3)} s (${held.reason}); check the machine before retrying`);
7286
+ }
7287
+ } catch (error) {
7288
+ if (httpCode(error) === "issue_dispatch_claim_mismatch" || error instanceof client$2.IssuesUnsupportedError) unknownSpawns.delete(id);
7289
+ deps.log(`Issue dispatch ${id} remains pending${error instanceof client$2.IssueRequestError && error.code ? ` (${error.code})` : ""}`);
7290
+ }
7291
+ }
7132
7292
  }
7133
7293
  async function complete(receipt) {
7134
7294
  let lastError;
@@ -7187,7 +7347,7 @@ function createIssueWorker(deps) {
7187
7347
  await fail({ ...receipt, phase: "claimed" }, accountUnavailableError(spawned.errorMessage, "issue") ?? spawned.errorMessage);
7188
7348
  return;
7189
7349
  }
7190
- if (spawned.type === "error" && spawned.startupExit?.exited) {
7350
+ if (spawned.type === "error" && (spawned.startupExit?.exited || spawned.notStarted)) {
7191
7351
  await fail(receipt, `Session failed to start: ${spawned.errorMessage}`);
7192
7352
  return;
7193
7353
  }
@@ -7198,25 +7358,36 @@ function createIssueWorker(deps) {
7198
7358
  if (spawned.type !== "success") {
7199
7359
  const matches = persistedRunSessions(view.runId);
7200
7360
  if (matches.length !== 1) {
7201
- await fail(receipt, `Spawn outcome unknown: ${spawned.errorMessage}`, true);
7361
+ holdUnknown(view, receipt, spawned.errorMessage);
7202
7362
  return;
7203
7363
  }
7204
7364
  receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
7205
7365
  } else {
7206
7366
  receipt = save({ ...receipt, sessionId: spawned.sessionId, phase: "spawned" });
7207
7367
  }
7208
- runBySession.set(receipt.sessionId, view.runId);
7209
- if (spawn.projectId && deps.joinProject) await deps.joinProject(receipt.sessionId, spawn.projectId).catch(() => void 0);
7210
- }
7211
- if (receipt.phase === "spawning") {
7368
+ } else if (receipt.phase === "spawning") {
7212
7369
  const matches = persistedRunSessions(view.runId);
7213
7370
  if (matches.length !== 1) {
7214
- await fail(receipt, "Spawn outcome unknown; verify the old process before retrying", true);
7371
+ holdUnknown(view, receipt, "the spawn was interrupted by a daemon restart");
7215
7372
  return;
7216
7373
  }
7217
7374
  receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
7218
- runBySession.set(receipt.sessionId, view.runId);
7375
+ } else {
7376
+ if (receipt.sessionId && !receipt.ended) runBySession.set(receipt.sessionId, view.runId);
7377
+ await deliverAndComplete(view, receipt);
7378
+ return;
7219
7379
  }
7380
+ await afterSpawn(view, receipt);
7381
+ }
7382
+ async function afterSpawn(view, receipt) {
7383
+ runBySession.set(receipt.sessionId, view.runId);
7384
+ const projectId = view.spawn?.projectId;
7385
+ if (projectId && deps.joinProject) await deps.joinProject(receipt.sessionId, projectId).catch(() => void 0);
7386
+ await deliverAndComplete(view, receipt);
7387
+ }
7388
+ async function deliverAndComplete(view, receipt) {
7389
+ const spawn = view.spawn;
7390
+ const agent = spawn.agent;
7220
7391
  if (receipt.phase === "spawned") {
7221
7392
  const sessionId = receipt.sessionId;
7222
7393
  const mode = spawnAgents.sanitizeSpawnPermissionMode(spawn.permissionMode ?? void 0);
@@ -7307,6 +7478,7 @@ function createIssueWorker(deps) {
7307
7478
  if (running || closed || Date.now() < retryAt) return;
7308
7479
  running = true;
7309
7480
  try {
7481
+ await recheckUnknown();
7310
7482
  let dispatches;
7311
7483
  try {
7312
7484
  dispatches = (await client.poll(deps.machineId)).dispatches ?? [];
@@ -7788,7 +7960,8 @@ async function startDaemon() {
7788
7960
  logger.logger.debug(`[DAEMON RUN] Directory creation failed: ${errorMessage}`);
7789
7961
  return {
7790
7962
  type: "error",
7791
- errorMessage
7963
+ errorMessage,
7964
+ notStarted: true
7792
7965
  };
7793
7966
  }
7794
7967
  }
@@ -7847,11 +8020,11 @@ async function startDaemon() {
7847
8020
  const requested = forkSpawnAccount(options.agentProfileId, options.parentSessionId, (id) => accountServiceRef.sessionAccount(id));
7848
8021
  spawnAccountId = accountServiceRef.resolveSpawnAccount(accountAgent, requested);
7849
8022
  } catch (error) {
7850
- return { type: "error", errorMessage: error instanceof Error ? error.message : String(error) };
8023
+ return { type: "error", errorMessage: error instanceof Error ? error.message : String(error), notStarted: true };
7851
8024
  }
7852
8025
  if (spawnAccountId) extraEnv[store.SPAWN_ACCOUNT_ENV] = spawnAccountId;
7853
8026
  } else if (options.agentProfileId) {
7854
- return { type: "error", errorMessage: `agent-profile-unavailable:agent-mismatch: accounts are not supported for ${options.agent} yet` };
8027
+ return { type: "error", errorMessage: `agent-profile-unavailable:agent-mismatch: accounts are not supported for ${options.agent} yet`, notStarted: true };
7855
8028
  }
7856
8029
  const claudeAuthStatus = claudeAuthServiceRef?.current()?.status;
7857
8030
  if ((options.agent ?? "claude") === "claude" && claudeAuthStatus && !spawnAccountId) {
@@ -7878,7 +8051,8 @@ async function startDaemon() {
7878
8051
  logger.logger.warn(`[DAEMON RUN] ${errorMessage}`);
7879
8052
  return {
7880
8053
  type: "error",
7881
- errorMessage
8054
+ errorMessage,
8055
+ notStarted: true
7882
8056
  };
7883
8057
  }
7884
8058
  let tmuxSessionName = extraEnv.TMUX_SESSION_NAME;
@@ -7899,7 +8073,8 @@ async function startDaemon() {
7899
8073
  if (!spawnAgents.isSpawnAgent(agent)) {
7900
8074
  return {
7901
8075
  type: "error",
7902
- errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version.`
8076
+ errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version.`,
8077
+ notStarted: true
7903
8078
  };
7904
8079
  }
7905
8080
  const resumeId = agent === "claude" ? options.resumeClaudeSessionId : agent === "codex" ? options.resumeCodexThreadId : void 0;
@@ -7985,7 +8160,8 @@ async function startDaemon() {
7985
8160
  default:
7986
8161
  return {
7987
8162
  type: "error",
7988
- errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version.`
8163
+ errorMessage: `Unsupported agent type: '${options.agent}'. Please update your CLI to the latest version.`,
8164
+ notStarted: true
7989
8165
  };
7990
8166
  }
7991
8167
  const args = [
@@ -8055,7 +8231,8 @@ async function startDaemon() {
8055
8231
  logger.logger.debug("[DAEMON RUN] Failed to spawn process - no PID returned");
8056
8232
  return Promise.resolve({
8057
8233
  type: "error",
8058
- errorMessage: "Failed to spawn Happy process - no PID returned"
8234
+ errorMessage: "Failed to spawn Happy process - no PID returned",
8235
+ notStarted: true
8059
8236
  });
8060
8237
  }
8061
8238
  timer?.mark("spawned");
@@ -8281,7 +8458,9 @@ async function startDaemon() {
8281
8458
  HAPPY_RECONNECT_SEQ: String(tracked.encryption.seq),
8282
8459
  HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
8283
8460
  HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
8284
- ...teamEnv
8461
+ ...teamEnv,
8462
+ // B-874c: an issue run's binding rides every relaunch (digest, MCP context).
8463
+ ...sessionMetadata.issueRelaunchEnv(metadata)
8285
8464
  }
8286
8465
  });
8287
8466
  if (result.type === "success") {
@@ -8423,6 +8602,8 @@ async function startDaemon() {
8423
8602
  HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
8424
8603
  HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
8425
8604
  ...teamEnv,
8605
+ // B-874c: see resumeSessionImpl.
8606
+ ...sessionMetadata.issueRelaunchEnv(metadata),
8426
8607
  ...options?.auto ? { [sessionLock.AUTO_RESTARTED_ENV]: sessionLock.encodeAutoRestarted(options.auto.kind, options.auto.target) } : {}
8427
8608
  }
8428
8609
  });
@@ -8871,6 +9052,14 @@ async function startDaemon() {
8871
9052
  host: initialMachineMetadata.host
8872
9053
  })).then(() => logger.logger.debug(`[DAEMON RUN] claimed the machine record for host ${initialMachineMetadata.host}`)).catch((error) => logger.logger.debug("[DAEMON RUN] could not refresh the recorded host:", error));
8873
9054
  }
9055
+ const daemonOwnership = createDaemonOwnership({
9056
+ pid: process.pid,
9057
+ statePid: persistence.readDaemonStatePidSync,
9058
+ onSuperseded: (ownerPid) => {
9059
+ logger.logger.debug(`[DAEMON RUN] Somehow a different daemon (pid ${ownerPid}) was started without killing us. We should kill ourselves.`);
9060
+ requestShutdown("exception", "A different daemon was started without killing us. We should kill ourselves.");
9061
+ }
9062
+ });
8874
9063
  let lastUpdateLog = "";
8875
9064
  let harnessInstaller = null;
8876
9065
  let handoverInFlight = false;
@@ -8893,7 +9082,9 @@ async function startDaemon() {
8893
9082
  installFenced: () => !!harnessInstaller?.isRunning(),
8894
9083
  busyGraceMs: resolveBusyInstallGrace(process.env.HAPPY_CLI_UPDATE_BUSY_GRACE_MS),
8895
9084
  lastInstall: lastInstallStore(configuration.configuration.happyHomeDir),
9085
+ owned: daemonOwnership.owns,
8896
9086
  publish: (state) => {
9087
+ if (!daemonOwnership.owns()) return;
8897
9088
  cliUpdateStateRef = state;
8898
9089
  fileState = { ...fileState, cliUpdate: state };
8899
9090
  persistence.writeDaemonState(fileState);
@@ -8930,10 +9121,17 @@ async function startDaemon() {
8930
9121
  relayMoveInFlight = null;
8931
9122
  });
8932
9123
  });
8933
- const refreshCliUpdate = () => updateController.refresh().catch((error) => {
9124
+ const policyRefresh = createPolicyRefreshTrigger({
9125
+ refresh: () => updateController.refresh(),
9126
+ log: (message, level) => level === "warn" ? logger.logger.warn(`[DAEMON RUN] ${message}`) : logger.logger.debug(`[DAEMON RUN] ${message}`)
9127
+ });
9128
+ const refreshCliUpdate = () => updateController.refresh().then(policyRefresh.noteRefreshed).catch((error) => {
8934
9129
  logger.logger.debug("[DAEMON RUN] CLI update policy check failed:", error);
8935
9130
  });
8936
- void refreshCliUpdate();
9131
+ apiMachine.setControlConnectedHandler(() => {
9132
+ policyRefresh.request("connect");
9133
+ });
9134
+ policyRefresh.request("startup");
8937
9135
  const cliUpdateIntervalMs = cliUpdate.resolveCliUpdateCheckInterval(process.env.HAPPY_CLI_UPDATE_CHECK_INTERVAL);
8938
9136
  if (process.env.HAPPY_CLI_UPDATE_CHECK_INTERVAL && cliUpdateIntervalMs === cliUpdate.DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS && process.env.HAPPY_CLI_UPDATE_CHECK_INTERVAL.trim() !== String(cliUpdate.DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS)) {
8939
9137
  logger.logger.warn(`[DAEMON RUN] Ignoring invalid HAPPY_CLI_UPDATE_CHECK_INTERVAL; using ${cliUpdate.DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS}ms`);
@@ -8970,6 +9168,7 @@ async function startDaemon() {
8970
9168
  });
8971
9169
  apiMachine.setHarnessInstallHandler((params) => harnessInstaller.request(params));
8972
9170
  const heartbeatIntervalMs = parseInt(process.env.HAPPY_DAEMON_HEARTBEAT_INTERVAL || "60000");
9171
+ const wakeDetector = createWakeDetector(heartbeatIntervalMs);
8973
9172
  const restartOnStaleVersionAndHeartbeat = setInterval(serialTask(async () => {
8974
9173
  try {
8975
9174
  if (process.env.DEBUG) {
@@ -8981,6 +9180,7 @@ async function startDaemon() {
8981
9180
  onChildExited(pid);
8982
9181
  }
8983
9182
  }
9183
+ if (!daemonOwnership.owns()) return;
8984
9184
  await updateController.tick();
8985
9185
  await updateController.withHandover(async () => {
8986
9186
  handoverInFlight = true;
@@ -9017,6 +9217,7 @@ async function startDaemon() {
9017
9217
  clearInterval(restartOnStaleVersionAndHeartbeat);
9018
9218
  clearInterval(cliUpdateInterval);
9019
9219
  policyAnnouncements.stop();
9220
+ policyRefresh.stop();
9020
9221
  stopAgentVersionChecks();
9021
9222
  claudeAuthService.stop();
9022
9223
  stopAccountWatch();
@@ -9044,12 +9245,9 @@ async function startDaemon() {
9044
9245
  handoverInFlight = false;
9045
9246
  }
9046
9247
  });
9047
- const daemonState = await persistence.readDaemonState();
9048
- if (daemonState && daemonState.pid !== process.pid) {
9049
- logger.logger.debug("[DAEMON RUN] Somehow a different daemon was started without killing us. We should kill ourselves.");
9050
- requestShutdown("exception", "A different daemon was started without killing us. We should kill ourselves.");
9051
- return;
9052
- }
9248
+ if (!daemonOwnership.owns()) return;
9249
+ const woke = wakeDetector.beat();
9250
+ if (woke || updateController.policyStale()) policyRefresh.request(woke ? "wake" : "stale");
9053
9251
  try {
9054
9252
  fileState = withDaemonHeartbeat(fileState, (/* @__PURE__ */ new Date()).toLocaleString());
9055
9253
  persistence.writeDaemonState(fileState);
@@ -9161,6 +9359,7 @@ async function startDaemon() {
9161
9359
  clearInterval(cliUpdateInterval);
9162
9360
  clearInterval(autoRestartSweep);
9163
9361
  policyAnnouncements.stop();
9362
+ policyRefresh.stop();
9164
9363
  stopAgentVersionChecks();
9165
9364
  await apiMachine.updateDaemonState((state) => ({
9166
9365
  ...state,