very-happy-cli 0.2.198 → 0.2.200

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 (214) hide show
  1. package/dist/{AcpBackend-Bm3EodAb.mjs → AcpBackend-Cnp6WNn8.mjs} +3 -3
  2. package/dist/{AcpBackend-DOuWeCAx.cjs → AcpBackend-CwSShYPI.cjs} +3 -3
  3. package/dist/{AcpSessionManager-BiwuXpbx.mjs → AcpSessionManager-C4O3jhT_.mjs} +2 -2
  4. package/dist/{AcpSessionManager-DvsZWTXp.cjs → AcpSessionManager-DqW99tOL.cjs} +2 -2
  5. package/dist/{BasePermissionHandler-1QcavYFn.mjs → BasePermissionHandler-8Msj0Z8j.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-25RmI4dK.cjs → BasePermissionHandler-CgqjIUyG.cjs} +1 -1
  7. package/dist/{account-DA4mbX3-.mjs → account-BIxPuBEs.mjs} +11 -11
  8. package/dist/{account-ChUtFYld.cjs → account-DcNh2_SN.cjs} +11 -11
  9. package/dist/{accountService-BWUjgHl0.cjs → accountService-BDJo14mY.cjs} +4 -4
  10. package/dist/{accountService-D7NZrnQd.mjs → accountService-ELazcp3V.mjs} +4 -4
  11. package/dist/{acpSessionResume-CeQu84Ol.cjs → acpSessionResume-B_W8uTI6.cjs} +1 -1
  12. package/dist/{acpSessionResume-D6YgeofW.mjs → acpSessionResume-De_sTG30.mjs} +1 -1
  13. package/dist/{agentHome-DM6mC64c.mjs → agentHome-C-900jC1.mjs} +4 -4
  14. package/dist/{agentHome-DevJCRG9.cjs → agentHome-C-usjJwB.cjs} +4 -4
  15. package/dist/{api-te19Pzi3.cjs → api-BPWRzeNF.cjs} +16 -10
  16. package/dist/{api-oceym3w6.mjs → api-DCUiAds-.mjs} +16 -10
  17. package/dist/{apiMachine-DCHsqtFQ.mjs → apiMachine-CJl4m3V3.mjs} +18 -18
  18. package/dist/{apiMachine-BjhCXg6C.cjs → apiMachine-DjhbA1rL.cjs} +18 -18
  19. package/dist/{attachmentContent-Dl29U1v1.mjs → attachmentContent-BKIq6EXR.mjs} +2 -2
  20. package/dist/{attachmentContent-BfCEgPTP.cjs → attachmentContent-C2f1UEP9.cjs} +2 -2
  21. package/dist/{auth-BIkCWkRV.mjs → auth-8jKFCZOX.mjs} +5 -5
  22. package/dist/{auth-SshU0tNW.cjs → auth-h6oU63Ni.cjs} +8 -8
  23. package/dist/{auth-SH0o7ue7.cjs → auth-oAnLi4Tl.cjs} +5 -5
  24. package/dist/{auth-BJ8Tej9L.mjs → auth-uLRHXOGY.mjs} +8 -8
  25. package/dist/{auto-Bdr4sSJk.mjs → auto-A5arQ-bI.mjs} +17 -17
  26. package/dist/{auto-t1B1Yzb3.cjs → auto-Bpa5iA1A.cjs} +17 -17
  27. package/dist/{bootstrap-D8DYLUId.mjs → bootstrap-BkLFgEGF.mjs} +2 -2
  28. package/dist/{bootstrap-GZDknvPy.cjs → bootstrap-DUKAKxrJ.cjs} +2 -2
  29. package/dist/{browser-C-H3QYV2.mjs → browser-BAlw0rns.mjs} +1 -1
  30. package/dist/{browser-DwCi-9Ya.cjs → browser-Ds-N-Dup.cjs} +1 -1
  31. package/dist/{claudeAccountEnv-DmVbGhZb.mjs → claudeAccountEnv-CI8RlIB9.mjs} +1 -1
  32. package/dist/{claudeAccountEnv-DSaFKajJ.cjs → claudeAccountEnv-D33xXRE7.cjs} +1 -1
  33. package/dist/{claudeLocal-Ck1jTve1.cjs → claudeLocal-BbsOT-EF.cjs} +5 -5
  34. package/dist/{claudeLocal-BiM2x9DJ.mjs → claudeLocal-X48n0RhP.mjs} +5 -5
  35. package/dist/{claudeLocalLauncher-DzvM0jBo.mjs → claudeLocalLauncher-D18gRtxz.mjs} +10 -10
  36. package/dist/{claudeLocalLauncher-Jsupvl4V.cjs → claudeLocalLauncher-D1jS3iK4.cjs} +10 -10
  37. package/dist/{claudeSessionFork-CDTbQmYi.cjs → claudeSessionFork-Bkxn40Y8.cjs} +1 -1
  38. package/dist/{claudeSessionFork-D-BhXkRa.mjs → claudeSessionFork-n1vMiFcP.mjs} +1 -1
  39. package/dist/client-1zIbVVX5.cjs +120 -0
  40. package/dist/{client-BRuFIwki.mjs → client-BXwIqRha.mjs} +2 -2
  41. package/dist/client-BgxQ9aej.mjs +114 -0
  42. package/dist/{client-CISkP897.mjs → client-Blpuk2Hr.mjs} +2 -2
  43. package/dist/{client-D-HEr922.cjs → client-BnoN4P4t.cjs} +2 -2
  44. package/dist/{client-E4kW5qjR.mjs → client-C0qjAgZ_.mjs} +4 -4
  45. package/dist/{client-v6rdLsBH.cjs → client-C8BTmcrh.cjs} +4 -4
  46. package/dist/{client-oqSAKwmy.cjs → client-D0_UOmC1.cjs} +2 -2
  47. package/dist/codex/happyMcpStdioBridge.cjs +25 -16
  48. package/dist/codex/happyMcpStdioBridge.mjs +25 -16
  49. package/dist/{codexAccount-CnbDfCOM.mjs → codexAccount-BAezf1fY.mjs} +1 -1
  50. package/dist/{codexAccount-CQ4W1Ax8.cjs → codexAccount-DfeCHUOU.cjs} +1 -1
  51. package/dist/{codexAppServerClient-BLasFGTm.mjs → codexAppServerClient-By4ntTIr.mjs} +3 -3
  52. package/dist/{codexAppServerClient--K-ILfqM.cjs → codexAppServerClient-xBeqblCj.cjs} +3 -3
  53. package/dist/{codexCommand-Wv1WVNtM.mjs → codexCommand-C7BVsmPu.mjs} +58 -47
  54. package/dist/{codexCommand-M1uNblJx.cjs → codexCommand-CgzJe-Ti.cjs} +62 -51
  55. package/dist/{codexTermination-DigTBSJE.mjs → codexTermination-BS0sLBKS.mjs} +1 -1
  56. package/dist/{codexTermination-BumRIUqm.cjs → codexTermination-DVrdQx3Q.cjs} +1 -1
  57. package/dist/{config-Czs0Tucv.cjs → config-4R0rnthZ.cjs} +3 -3
  58. package/dist/{config-Br2fCFwB.mjs → config-D3jidXDu.mjs} +3 -3
  59. package/dist/{configuration-JBFF7432.mjs → configuration-4pG95tsq.mjs} +1 -1
  60. package/dist/{configuration-DfRs3WLd.cjs → configuration-ClUt7pqs.cjs} +1 -1
  61. package/dist/{connect-Cr--b0yl.cjs → connect-Da2NQJ3K.cjs} +13 -13
  62. package/dist/{connect-CbCqv-MV.mjs → connect-Do5qcqmg.mjs} +13 -13
  63. package/dist/{context-DLIjT5qU.mjs → context-Cf05DtNM.mjs} +1 -1
  64. package/dist/{context-C5WWlHOl.cjs → context-wMsIGwBw.cjs} +1 -1
  65. package/dist/{controlClient-B61crTpk.cjs → controlClient-SYDFcIkk.cjs} +3 -3
  66. package/dist/{controlClient-D5BYm3PU.mjs → controlClient-bqCKl9Nv.mjs} +3 -3
  67. package/dist/{createSessionMetadata-OMKj3e48.mjs → createSessionMetadata-CQkxe_4T.mjs} +3 -2
  68. package/dist/{createSessionMetadata-BwYysMTH.cjs → createSessionMetadata-msQTEvvn.cjs} +3 -2
  69. package/dist/{daemonAccounts-asWvoPKG.mjs → daemonAccounts-B8xnkprW.mjs} +3 -3
  70. package/dist/{daemonAccounts-CqAnPXDJ.cjs → daemonAccounts-Ch_rSTSX.cjs} +2 -2
  71. package/dist/{defaultPermissionMode-BItpIZML.cjs → defaultPermissionMode-BETWd5Lf.cjs} +1 -1
  72. package/dist/{defaultPermissionMode-4KYZA4WF.mjs → defaultPermissionMode-Cl3OvdHp.mjs} +1 -1
  73. package/dist/{deterministicJson-DnTSkEgb.mjs → deterministicJson-BRAeReBK.mjs} +67 -17
  74. package/dist/{deterministicJson-DIzyb1dQ.cjs → deterministicJson-CQ8jkArF.cjs} +72 -22
  75. package/dist/{doctor-Dn1G6QhF.cjs → doctor-C9D-t20z.cjs} +7 -7
  76. package/dist/{doctor-jrvm-tl3.mjs → doctor-Dy7z3qvy.mjs} +7 -7
  77. package/dist/{downloadTarget-DGnCGrDZ.cjs → downloadTarget-DfoOSrYi.cjs} +6 -6
  78. package/dist/{downloadTarget-BtsN_-LN.mjs → downloadTarget-Diq-GBu4.mjs} +6 -6
  79. package/dist/{ensureDaemonRunning-DsvcjXb4.cjs → ensureDaemonRunning-Df76EtKd.cjs} +5 -5
  80. package/dist/{ensureDaemonRunning-DCmXUwNi.mjs → ensureDaemonRunning-LqrgqVG3.mjs} +5 -5
  81. package/dist/format-CbliQN8V.mjs +70 -0
  82. package/dist/format-P9_M_7ga.cjs +74 -0
  83. package/dist/{handleResumeCommand-hzho-lp7.cjs → handleResumeCommand-CjCtwrrm.cjs} +5 -5
  84. package/dist/{handleResumeCommand-CFupxyHT.mjs → handleResumeCommand-Dz4Aw_aZ.mjs} +5 -5
  85. package/dist/{index-BMFLwBCd.mjs → index-BNBXrqRE.mjs} +4 -4
  86. package/dist/{index-BknTkVnR.cjs → index-BiutHOAO.cjs} +62 -1
  87. package/dist/{index-CRI-_-YH.cjs → index-ByBOdEvG.cjs} +48 -44
  88. package/dist/{index-DCfEzudP.cjs → index-CbzettaI.cjs} +4 -4
  89. package/dist/{index-5TDKOvkU.cjs → index-CdOnhx2X.cjs} +4 -4
  90. package/dist/{index-CHk8F9OY.mjs → index-CjMA70-R.mjs} +47 -43
  91. package/dist/{index-EGwuuFdL.cjs → index-DUwOmhnq.cjs} +3 -3
  92. package/dist/{index-CZpFhEmE.mjs → index-Sdvy1Lsf.mjs} +3 -3
  93. package/dist/{index-CofTgtQ3.mjs → index-XP-qcJQ3.mjs} +4 -4
  94. package/dist/{index-CxiisoO1.mjs → index-kwsivEs-.mjs} +49 -2
  95. package/dist/index.cjs +2 -2
  96. package/dist/index.mjs +2 -2
  97. package/dist/{install-CB5eTmzm.cjs → install-C4dKrmxR.cjs} +3 -3
  98. package/dist/{install-CeDqNGxI.mjs → install-DMXd8Z4c.mjs} +3 -3
  99. package/dist/issue-BijeNKIT.cjs +237 -0
  100. package/dist/issue-COytLvGE.mjs +229 -0
  101. package/dist/lib.cjs +12 -12
  102. package/dist/lib.d.cts +6 -0
  103. package/dist/lib.d.mts +6 -0
  104. package/dist/lib.mjs +12 -12
  105. package/dist/{localHappyAgentAuth-B6xdH-Fr.cjs → localHappyAgentAuth-CjtNcaI0.cjs} +1 -1
  106. package/dist/{localHappyAgentAuth-BiIyMoiG.mjs → localHappyAgentAuth-DeDQjw24.mjs} +1 -1
  107. package/dist/{logger-BHfBDOsy.mjs → logger-BLMi8oJK.mjs} +2 -2
  108. package/dist/{logger-BrAF4iuT.cjs → logger-D28MY1Bv.cjs} +2 -2
  109. package/dist/{machineMetadata-D5PO2ylb.cjs → machineMetadata-BzjrIn_N.cjs} +3 -3
  110. package/dist/{machineMetadata-Ekniv5o4.mjs → machineMetadata-D8OWVD4l.mjs} +3 -3
  111. package/dist/{main-C8lsRSYS.cjs → main-DoJIcSOh.cjs} +57 -47
  112. package/dist/{main-HXdcnexS.mjs → main-c0fCuBON.mjs} +57 -47
  113. package/dist/{mcp-D9sglL02.cjs → mcp-CEtvR6tG.cjs} +18 -18
  114. package/dist/{mcp-C2YD6mq4.mjs → mcp-DKkBFGUa.mjs} +18 -18
  115. package/dist/{mirrorProtocol-CNF1eHsm.cjs → mirrorProtocol-CCl9dtzh.cjs} +3 -3
  116. package/dist/{mirrorProtocol-BLhArCS9.mjs → mirrorProtocol-DFQLXDBI.mjs} +3 -3
  117. package/dist/{package-CStJrLG3.cjs → package-BFSsS_dl.cjs} +7 -7
  118. package/dist/{package-BGZo2vAj.mjs → package-DbGqY8Ej.mjs} +7 -7
  119. package/dist/{panels-GVnnEsow.mjs → panels-2yIO9FxQ.mjs} +5 -5
  120. package/dist/{panels-D4_yGw4n.cjs → panels-BqLXIQif.cjs} +5 -5
  121. package/dist/{peerTools-BO-H0wNj.mjs → peerTools-4GYKxr8J.mjs} +5 -5
  122. package/dist/{peerTools-Drow2-P4.cjs → peerTools-Z8V2E0AF.cjs} +5 -5
  123. package/dist/{persistence-DvD-irLh.mjs → persistence-DbOKjdUD.mjs} +3 -3
  124. package/dist/{persistence-DGfEdbA5.cjs → persistence-TpVFA5-I.cjs} +2 -2
  125. package/dist/{piRunnerArgs-DwcAwwzm.mjs → piRunnerArgs-Bdj0sjAT.mjs} +1 -1
  126. package/dist/{piRunnerArgs-C1dLsoXF.cjs → piRunnerArgs-DOEJJymf.cjs} +1 -1
  127. package/dist/{piRuntime-_yRSPgnR.mjs → piRuntime-B0QZykV7.mjs} +1 -1
  128. package/dist/{piRuntime-d2h0Cska.cjs → piRuntime-DiRayy91.cjs} +1 -1
  129. package/dist/{piTerminal-WN0AMv9u.mjs → piTerminal-DGF4X7C-.mjs} +20 -20
  130. package/dist/{piTerminal-CVB4fa5R.cjs → piTerminal-DciFqPEi.cjs} +20 -20
  131. package/dist/{pushNotifications-3YsyCEfY.cjs → pushNotifications-C1i2W1GQ.cjs} +3 -3
  132. package/dist/{pushNotifications-D2UZnoTB.mjs → pushNotifications-CrCTpDiN.mjs} +3 -3
  133. package/dist/{query-Ba7UXc_y.cjs → query-BkOpCpRo.cjs} +1 -1
  134. package/dist/{query-_sw0hG6A.mjs → query-CrSvcV32.mjs} +1 -1
  135. package/dist/{rateLimitWindows-DiiGHS9r.cjs → rateLimitWindows-BREA7OZj.cjs} +1 -1
  136. package/dist/{rateLimitWindows-DzXv6p_W.mjs → rateLimitWindows-DZVrafmm.mjs} +1 -1
  137. package/dist/{reconnectGate-CxLgZCBh.mjs → reconnectGate-COxAZTv8.mjs} +1 -1
  138. package/dist/{reconnectGate-BpePVLPu.cjs → reconnectGate-YQ5jXJfY.cjs} +1 -1
  139. package/dist/{registerCommonHandlers-ChdVwZW6.mjs → registerCommonHandlers-Cfl_dEWs.mjs} +2 -2
  140. package/dist/{registerCommonHandlers-6iKpECuR.cjs → registerCommonHandlers-D95IxqDN.cjs} +2 -2
  141. package/dist/{registerKillSessionHandler-BDTgrstx.cjs → registerKillSessionHandler-DJJXtc_L.cjs} +6 -6
  142. package/dist/{registerKillSessionHandler-D6wYbAIt.mjs → registerKillSessionHandler-DoE6xgH3.mjs} +6 -6
  143. package/dist/{registerSideQuestionHandler-U4LGga_Z.cjs → registerSideQuestionHandler-DsRz-aD9.cjs} +4 -4
  144. package/dist/{registerSideQuestionHandler-C3K_qKwA.mjs → registerSideQuestionHandler-Dv00rqcy.mjs} +4 -4
  145. package/dist/{remoteSessionClient-CFNM8UEh.mjs → remoteSessionClient-BFd_D9ka.mjs} +5 -5
  146. package/dist/{remoteSessionClient-DSC5Cj21.cjs → remoteSessionClient-DleOeQlN.cjs} +5 -5
  147. package/dist/{reportProgressTool-CFmDK8ag.mjs → reportProgressTool-D4xKY9Ur.mjs} +111 -4
  148. package/dist/{reportProgressTool-Cr25LWeW.cjs → reportProgressTool-DtEpDqv3.cjs} +113 -3
  149. package/dist/{run-Be0yicft.cjs → run-CVAIFpsp.cjs} +391 -42
  150. package/dist/{run-D0D73Dam.mjs → run-iDEMW4js.mjs} +391 -42
  151. package/dist/{runClaude-1NP467UM.mjs → runClaude-DvHdLJaV.mjs} +27 -25
  152. package/dist/{runClaude-BOxvKK4H.cjs → runClaude-gucCQBma.cjs} +30 -28
  153. package/dist/{runClaudeDeps-CkRlQx2Y.cjs → runClaudeDeps-CQ8vvqUQ.cjs} +42 -40
  154. package/dist/{runClaudeDeps-BPzLoWyT.mjs → runClaudeDeps-DkFWFwVc.mjs} +48 -46
  155. package/dist/{runGemini-j2n5ZlOL.mjs → runGemini-B2lXQDru.mjs} +35 -33
  156. package/dist/{runGemini-BowXJRXb.cjs → runGemini-C0vqJYtS.cjs} +35 -33
  157. package/dist/{runOpenClaw-DLsnZnFM.cjs → runOpenClaw-DNV7GX73.cjs} +18 -18
  158. package/dist/{runOpenClaw-6zrT8dPO.mjs → runOpenClaw-Ddb6sOkY.mjs} +18 -18
  159. package/dist/{sandbox-BFbT6HDl.mjs → sandbox-Cw0cPDDh.mjs} +4 -4
  160. package/dist/{sandbox-DLijcRKk.cjs → sandbox-FA0RlaZg.cjs} +4 -4
  161. package/dist/selfCheck-B-hKig8I.mjs +89 -0
  162. package/dist/{selfCheck-U-A1DCi9.cjs → selfCheck-DFC8fzhF.cjs} +40 -39
  163. package/dist/{send-CGxo_QUR.cjs → send-BFd-5b_Q.cjs} +8 -8
  164. package/dist/{send-CQGKb3Kb.mjs → send-CwgqPftE.mjs} +8 -8
  165. package/dist/{server-DR5bQzTq.mjs → server-C_4Fk45r.mjs} +4 -4
  166. package/dist/{server-CWbcDBjV.cjs → server-DwOdMGAP.cjs} +6 -6
  167. package/dist/{sessionLock-DqFKSW8u.mjs → sessionLock-CphKQyav.mjs} +3 -3
  168. package/dist/{sessionLock-CJiayMcZ.cjs → sessionLock-DglhFHzB.cjs} +3 -3
  169. package/dist/{startupSessionCreate-s1ekIs2Z.cjs → sessionMetadata-DyTJ0Ki5.cjs} +14 -3
  170. package/dist/{startupSessionCreate-CfBajt2k.mjs → sessionMetadata-V7Z7F-cj.mjs} +14 -4
  171. package/dist/{sessionOps-Cw_JivR2.cjs → sessionOps-CIFvoFPA.cjs} +4 -4
  172. package/dist/{sessionOps-D-SDNs-D.mjs → sessionOps-D-uFSTHk.mjs} +4 -4
  173. package/dist/{sessionProvider-JEAWxBF6.cjs → sessionProvider-B0daO-Ln.cjs} +10 -10
  174. package/dist/{sessionProvider-Cb-LtbFQ.mjs → sessionProvider-D8y7K8bK.mjs} +10 -10
  175. package/dist/{sessionScanner-zJrc_Oe0.cjs → sessionScanner-CWflbWoH.cjs} +3 -3
  176. package/dist/{sessionScanner-C2M697xz.mjs → sessionScanner-DQAOP6pU.mjs} +3 -3
  177. package/dist/{sessions-CIxnjpCM.mjs → sessions-CaO_-AI7.mjs} +10 -10
  178. package/dist/{sessions-D2yLkE5R.cjs → sessions-CzpI76qj.cjs} +10 -10
  179. package/dist/{setupOfflineReconnection-Uu3tqISz.cjs → setupOfflineReconnection-BZHRoKDx.cjs} +2 -2
  180. package/dist/{setupOfflineReconnection-DzV1wB4y.mjs → setupOfflineReconnection-Ck-p0YPb.mjs} +2 -2
  181. package/dist/{spawn-CeeM-Piz.mjs → spawn-BEJxfj60.mjs} +14 -14
  182. package/dist/{spawn-DD1Sv8Ri.cjs → spawn-DyjOa4nf.cjs} +14 -14
  183. package/dist/{spawnAgents-CrHgpAzU.cjs → spawnAgents-IiuqX0S5.cjs} +1 -1
  184. package/dist/{spawnAgents-DEBfpoPZ.mjs → spawnAgents-XObVj6zN.mjs} +1 -1
  185. package/dist/{spawnHappyCLI-CYzlz9Sl.cjs → spawnHappyCLI-C3XuIB2N.cjs} +1 -1
  186. package/dist/{spawnHappyCLI-CUfe8n_m.mjs → spawnHappyCLI-Cc9kKpcq.mjs} +1 -1
  187. package/dist/{startFileWatcher-C0u3J6Bj.cjs → startFileWatcher-CeDJl9mN.cjs} +1 -1
  188. package/dist/{startFileWatcher-JdO3v65I.mjs → startFileWatcher-t3K1y9kY.mjs} +1 -1
  189. package/dist/{store-DEhdblkI.mjs → store-CqNAE-0v.mjs} +1 -1
  190. package/dist/{store-QBBJB5Ox.cjs → store-DOZAMV4W.cjs} +1 -1
  191. package/dist/{streamRelay-DymKR1Rk.mjs → streamRelay-7D7v0hvk.mjs} +1 -1
  192. package/dist/{streamRelay-BVrCYh2G.cjs → streamRelay-Dyp4x44P.cjs} +1 -1
  193. package/dist/{sync-BO4DRSub.cjs → sync-BvxhuW9R.cjs} +1 -1
  194. package/dist/{sync-BLGrIKN9.mjs → sync-s1pUqWGm.mjs} +1 -1
  195. package/dist/{systemPrompt-DTUJZOn6.cjs → systemPrompt-CCdSrtn3.cjs} +2 -2
  196. package/dist/{systemPrompt-YylizkJs.mjs → systemPrompt-CLYTbBhV.mjs} +2 -2
  197. package/dist/{teams-zkGFcwsG.mjs → teams-BVp5F_xN.mjs} +7 -7
  198. package/dist/{teams-DnLPBPKx.cjs → teams-D2q1DQWz.cjs} +7 -7
  199. package/dist/{template-uSKZ53Sv.cjs → template-M1YGFYUT.cjs} +1 -1
  200. package/dist/{template-BGlDAjbM.mjs → template-oBrR0saD.mjs} +1 -1
  201. package/dist/{time-Cv4hbCLT.cjs → time-D-v2Cd9e.cjs} +1 -1
  202. package/dist/{time-DZE0879N.mjs → time-qd46L189.mjs} +1 -1
  203. package/dist/{titleGenerator-B2BbmJuc.mjs → titleGenerator-BdeHi3IY.mjs} +2 -2
  204. package/dist/{titleGenerator-D2ehxbvK.cjs → titleGenerator-CSYqcorn.cjs} +3 -3
  205. package/dist/{todo-DUpW9d8p.mjs → todo-DiEhLgUZ.mjs} +95 -12
  206. package/dist/{todo-9kn_9N-H.cjs → todo-Dq_YuJvj.cjs} +101 -18
  207. package/dist/{tools-rMr-wPIc.cjs → tools-CY2zrdd5.cjs} +1 -1
  208. package/dist/{tools-gIDXwAzk.mjs → tools-DR7GWBBV.mjs} +1 -1
  209. package/dist/{uninstall-CHx5TOHi.cjs → uninstall-BHhHjbzE.cjs} +3 -3
  210. package/dist/{uninstall-CBlRzvNa.mjs → uninstall-BvwDZVU9.mjs} +3 -3
  211. package/dist/{wrapperAccount-Ce78kKMo.mjs → wrapperAccount-CpDsQL15.mjs} +2 -2
  212. package/dist/{wrapperAccount-EkmR4V-v.cjs → wrapperAccount-ejUjAQaM.cjs} +2 -2
  213. package/package.json +7 -7
  214. package/dist/selfCheck-DCIqaiMu.mjs +0 -88
@@ -1,28 +1,28 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-CNF1eHsm.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-CCl9dtzh.cjs');
4
4
  var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
5
- var piRunnerArgs = require('./piRunnerArgs-C1dLsoXF.cjs');
5
+ var piRunnerArgs = require('./piRunnerArgs-DOEJJymf.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
10
  var node_fs = require('node:fs');
11
11
  var path = require('node:path');
12
- var configuration = require('./configuration-DfRs3WLd.cjs');
13
- var api = require('./api-te19Pzi3.cjs');
14
- var spawnAgents = require('./spawnAgents-CrHgpAzU.cjs');
15
- var logger = require('./logger-BrAF4iuT.cjs');
16
- var index$2 = require('./index-EGwuuFdL.cjs');
17
- var auth = require('./auth-SH0o7ue7.cjs');
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');
18
18
  var child_process = require('child_process');
19
- var _package = require('./package-CStJrLG3.cjs');
20
- var doctor = require('./doctor-Dn1G6QhF.cjs');
21
- var spawnHappyCLI = require('./spawnHappyCLI-CYzlz9Sl.cjs');
22
- var persistence = require('./persistence-DGfEdbA5.cjs');
23
- var controlClient = require('./controlClient-B61crTpk.cjs');
24
- var sessionOps = require('./sessionOps-Cw_JivR2.cjs');
25
- var index = require('./index-BknTkVnR.cjs');
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');
26
26
  var fastify = require('fastify');
27
27
  var z = require('zod');
28
28
  var fastifyTypeProviderZod = require('fastify-type-provider-zod');
@@ -30,68 +30,69 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
30
30
  var node_crypto = require('node:crypto');
31
31
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
32
32
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
33
- var rateLimitWindows = require('./rateLimitWindows-DiiGHS9r.cjs');
34
- var peerTools = require('./peerTools-Drow2-P4.cjs');
33
+ var rateLimitWindows = require('./rateLimitWindows-BREA7OZj.cjs');
34
+ var peerTools = require('./peerTools-Z8V2E0AF.cjs');
35
35
  var os = require('node:os');
36
- var remoteSessionClient = require('./remoteSessionClient-DSC5Cj21.cjs');
37
- var bootstrap = require('./bootstrap-GZDknvPy.cjs');
38
- var index$1 = require('./index-DCfEzudP.cjs');
36
+ var remoteSessionClient = require('./remoteSessionClient-DleOeQlN.cjs');
37
+ var bootstrap = require('./bootstrap-DUKAKxrJ.cjs');
38
+ var index$1 = require('./index-CbzettaI.cjs');
39
39
  var require$$0 = require('fs');
40
40
  var require$$1 = require('path');
41
41
  var node_child_process = require('node:child_process');
42
42
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
43
43
  var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
44
- var machineMetadata = require('./machineMetadata-D5PO2ylb.cjs');
44
+ var machineMetadata = require('./machineMetadata-BzjrIn_N.cjs');
45
45
  var fileStore = require('./fileStore-7qhnbs6N.cjs');
46
46
  var pi = require('./pi-DlsrPCTa.cjs');
47
- var codexAccount = require('./codexAccount-CQ4W1Ax8.cjs');
47
+ var codexAccount = require('./codexAccount-DfeCHUOU.cjs');
48
48
  var require$$3 = require('crypto');
49
49
  var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
50
- var handleResumeCommand = require('./handleResumeCommand-hzho-lp7.cjs');
50
+ var handleResumeCommand = require('./handleResumeCommand-CjCtwrrm.cjs');
51
51
  var webPanels = require('./webPanels-FCgFKvVe.cjs');
52
52
  var promises = require('node:fs/promises');
53
53
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
54
- var client = require('./client-D-HEr922.cjs');
55
- var sessionLock = require('./sessionLock-CJiayMcZ.cjs');
56
- var client$1 = require('./client-oqSAKwmy.cjs');
54
+ var client = require('./client-BnoN4P4t.cjs');
55
+ var sessionLock = require('./sessionLock-DglhFHzB.cjs');
56
+ var client$1 = require('./client-D0_UOmC1.cjs');
57
57
  var daemonSupervisor = require('./daemonSupervisor-alqGPANc.cjs');
58
- var accountService = require('./accountService-BWUjgHl0.cjs');
59
- var daemonAccounts = require('./daemonAccounts-CqAnPXDJ.cjs');
58
+ var accountService = require('./accountService-BDJo14mY.cjs');
59
+ var daemonAccounts = require('./daemonAccounts-Ch_rSTSX.cjs');
60
60
  var path$1 = require('./path-B7zW-WwE.cjs');
61
61
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
62
- var startFileWatcher = require('./startFileWatcher-C0u3J6Bj.cjs');
63
- var sync = require('./sync-BO4DRSub.cjs');
62
+ var startFileWatcher = require('./startFileWatcher-CeDJl9mN.cjs');
63
+ var sync = require('./sync-BvxhuW9R.cjs');
64
64
  var types = require('./types-CRS-srZK.cjs');
65
65
  var tmuxSocket = require('./tmuxSocket-Dg11Olx0.cjs');
66
66
  var processTermination = require('./processTermination-f17wxlMb.cjs');
67
67
  var doctor$1 = require('./doctor-CJpFhHoK.cjs');
68
68
  var resources = require('./resources-BZ_Be0qM.cjs');
69
69
  var node_util = require('node:util');
70
- var template = require('./template-uSKZ53Sv.cjs');
70
+ var template = require('./template-M1YGFYUT.cjs');
71
+ var client$2 = require('./client-1zIbVVX5.cjs');
71
72
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
72
- var store = require('./store-QBBJB5Ox.cjs');
73
- require('./acpSessionResume-CeQu84Ol.cjs');
74
- require('./pushNotifications-3YsyCEfY.cjs');
73
+ var store = require('./store-DOZAMV4W.cjs');
74
+ require('./acpSessionResume-B_W8uTI6.cjs');
75
+ require('./pushNotifications-C1i2W1GQ.cjs');
75
76
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
76
- require('./reconnectGate-BpePVLPu.cjs');
77
+ require('./reconnectGate-YQ5jXJfY.cjs');
77
78
  require('node:events');
78
79
  require('socket.io-client');
79
80
  require('./limits-C-a7gr04.cjs');
80
- require('./time-Cv4hbCLT.cjs');
81
- require('./registerCommonHandlers-6iKpECuR.cjs');
81
+ require('./time-D-v2Cd9e.cjs');
82
+ require('./registerCommonHandlers-D95IxqDN.cjs');
82
83
  require('util');
83
84
  require('cross-spawn');
84
85
  require('@paralleldrive/cuid2');
85
86
  require('chalk');
86
87
  require('node:module');
87
88
  require('tweetnacl');
88
- require('./browser-DwCi-9Ya.cjs');
89
+ require('./browser-Ds-N-Dup.cjs');
89
90
  require('open');
90
91
  require('./specialCommands-J3JFOq0J.cjs');
91
92
  require('./ids-B6ZC0HGt.cjs');
92
93
  require('url');
93
- require('./localHappyAgentAuth-B6xdH-Fr.cjs');
94
- require('./claudeAccountEnv-DSaFKajJ.cjs');
94
+ require('./localHappyAgentAuth-CjtNcaI0.cjs');
95
+ require('./claudeAccountEnv-D33xXRE7.cjs');
95
96
  require('node:readline');
96
97
  require('node-pty');
97
98
  require('./processTreeSnapshot-D5iNblp6.cjs');
@@ -7028,6 +7029,337 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
7028
7029
  };
7029
7030
  }
7030
7031
 
7032
+ const ID = /^[A-Za-z0-9_-]{1,128}$/;
7033
+ const ISSUE_RECEIPT_TTL_MS = 7 * 24 * 36e5;
7034
+ function dir(home) {
7035
+ return path.join(home, "issues", "receipts");
7036
+ }
7037
+ function readIssueReceipt(home, dispatchId) {
7038
+ if (!ID.test(dispatchId)) return null;
7039
+ try {
7040
+ return JSON.parse(node_fs.readFileSync(path.join(dir(home), `${dispatchId}.json`), "utf8"));
7041
+ } catch {
7042
+ return null;
7043
+ }
7044
+ }
7045
+ function writeIssueReceipt(home, receipt) {
7046
+ if (!ID.test(receipt.dispatchId)) throw new Error("Invalid dispatch id");
7047
+ configuration.ensurePrivateDirectorySync(dir(home));
7048
+ configuration.writePrivateFileSync(path.join(dir(home), `${receipt.dispatchId}.json`), JSON.stringify({ ...receipt, updatedAt: Date.now() }));
7049
+ }
7050
+ function listIssueReceipts(home, now = Date.now()) {
7051
+ let files;
7052
+ try {
7053
+ files = node_fs.readdirSync(dir(home));
7054
+ } catch {
7055
+ return [];
7056
+ }
7057
+ const out = [];
7058
+ for (const file of files) {
7059
+ if (!file.endsWith(".json")) continue;
7060
+ const path$1 = path.join(dir(home), file);
7061
+ try {
7062
+ const receipt = JSON.parse(node_fs.readFileSync(path$1, "utf8"));
7063
+ const at = typeof receipt.updatedAt === "number" ? receipt.updatedAt : node_fs.statSync(path$1).mtimeMs;
7064
+ if (now - at > ISSUE_RECEIPT_TTL_MS) {
7065
+ node_fs.unlinkSync(path$1);
7066
+ continue;
7067
+ }
7068
+ out.push(receipt);
7069
+ } catch {
7070
+ }
7071
+ }
7072
+ return out;
7073
+ }
7074
+
7075
+ const ISSUE_POLL_MS = 5e3;
7076
+ const ISSUE_SPAWNED_BY = "issue";
7077
+ const FIRST_MESSAGE_KEY_WAIT_MS = 1e4;
7078
+ function issueKeyFromPrompt(prompt) {
7079
+ return /^You are assigned issue ([A-Z]+-\d{1,9}):/.exec(prompt)?.[1] ?? null;
7080
+ }
7081
+ function issueSpawnAccount(spawn) {
7082
+ if (spawn.agentProfile === void 0) return void 0;
7083
+ return spawn.agentProfile === null ? null : spawn.agentProfile.id;
7084
+ }
7085
+ function issueAccountRefusal(resolve, agent, requested) {
7086
+ if (!resolve) return null;
7087
+ if (agent !== "claude" && agent !== "codex") return typeof requested === "string" ? `Account unavailable (agent-mismatch): accounts are not supported for ${agent} yet` : null;
7088
+ try {
7089
+ resolve(agent, requested);
7090
+ return null;
7091
+ } catch (error) {
7092
+ const message = error instanceof Error ? error.message : String(error);
7093
+ return accountUnavailableError(message, "issue");
7094
+ }
7095
+ }
7096
+ function issueExitEvent(exit) {
7097
+ if (!exit) return "exited";
7098
+ if (exit.signal) return ["SIGTERM", "SIGINT", "SIGHUP"].includes(exit.signal) ? "exited" : "crashed";
7099
+ return exit.code === 0 || exit.code === null || exit.code === 130 || exit.code === 143 ? "exited" : "crashed";
7100
+ }
7101
+ function persistedRunSessions(runId) {
7102
+ return Object.entries(persistence.readPersistedSessions()).filter(([, entry]) => entry.metadata?.issue?.runId === runId).map(([sessionId]) => sessionId);
7103
+ }
7104
+ function httpCode(error) {
7105
+ return error instanceof client$2.IssueRequestError ? error.code : null;
7106
+ }
7107
+ function createIssueWorker(deps) {
7108
+ const home = deps.home ?? configuration.configuration.happyHomeDir;
7109
+ const client = deps.client;
7110
+ const send = deps.send ?? (async (sessionId, text, options) => {
7111
+ const key = await sessionOps.waitForSessionKey(sessionId, FIRST_MESSAGE_KEY_WAIT_MS);
7112
+ await sessionOps.sendUserMessage(sessionId, key, text, "issue", options);
7113
+ });
7114
+ const capabilities = deps.capabilities ?? ((sessionId) => persistence.readPersistedSessions()[sessionId]?.metadata?.capabilities ?? null);
7115
+ let running = false;
7116
+ let closed = false;
7117
+ let retryAt = 0;
7118
+ const runBySession = /* @__PURE__ */ new Map();
7119
+ const lastEvent = /* @__PURE__ */ new Map();
7120
+ const events = [];
7121
+ for (const r of listIssueReceipts(home)) {
7122
+ if (r.kind === "spawn" && r.sessionId && !r.ended && (r.phase === "delivered" || r.phase === "completed")) runBySession.set(r.sessionId, r.runId);
7123
+ }
7124
+ const save = (receipt) => {
7125
+ writeIssueReceipt(home, receipt);
7126
+ return receipt;
7127
+ };
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"}`);
7132
+ }
7133
+ async function complete(receipt) {
7134
+ let lastError;
7135
+ for (let attempt = 0; attempt < 3; attempt++) {
7136
+ try {
7137
+ await client.complete(receipt.dispatchId, { machineId: deps.machineId, claimId: receipt.claimId, sessionId: receipt.sessionId });
7138
+ save({ ...receipt, phase: "completed" });
7139
+ return;
7140
+ } catch (error) {
7141
+ lastError = error;
7142
+ if (httpCode(error) === "issue_dispatch_claim_mismatch" || error instanceof client$2.IssuesUnsupportedError) break;
7143
+ await new Promise((resolve) => setTimeout(resolve, 500 * (attempt + 1)));
7144
+ }
7145
+ }
7146
+ throw lastError;
7147
+ }
7148
+ async function runSpawn(view, receipt) {
7149
+ const spawn = view.spawn;
7150
+ if (receipt.phase === "failed") {
7151
+ await fail(receipt, "This dispatch already failed on this machine");
7152
+ return;
7153
+ }
7154
+ if (!spawn) {
7155
+ await fail(receipt, "Dispatch has no spawn payload");
7156
+ return;
7157
+ }
7158
+ const agent = spawn.agent;
7159
+ if (receipt.phase === "claimed") {
7160
+ if (!index.ISSUE_ASSIGNABLE_AGENTS.includes(agent)) {
7161
+ await fail(receipt, `Agent "${agent}" cannot run issues on this machine`);
7162
+ return;
7163
+ }
7164
+ if (!path.isAbsolute(spawn.directory)) {
7165
+ await fail(receipt, `Directory must be absolute: ${spawn.directory}`);
7166
+ return;
7167
+ }
7168
+ const account = issueSpawnAccount(spawn);
7169
+ const refusal = issueAccountRefusal(deps.resolveAccount, agent, account);
7170
+ if (refusal) {
7171
+ await fail(receipt, refusal);
7172
+ return;
7173
+ }
7174
+ const mode = spawnAgents.sanitizeSpawnPermissionMode(spawn.permissionMode ?? void 0);
7175
+ const permissionMode = spawnAgents.resolveSpawnPermissionMode(agent, mode ?? void 0);
7176
+ const key = issueKeyFromPrompt(spawn.prompt);
7177
+ receipt = save({ ...receipt, phase: "spawning" });
7178
+ const spawned = await deps.spawn({
7179
+ directory: spawn.directory,
7180
+ agent,
7181
+ permissionMode,
7182
+ spawnedBy: ISSUE_SPAWNED_BY,
7183
+ environmentVariables: { VH_ISSUE_ID: view.issueId, VH_ISSUE_RUN_ID: view.runId, ...key ? { VH_ISSUE_KEY: key } : {} },
7184
+ ...account !== void 0 ? { agentProfileId: account } : {}
7185
+ });
7186
+ if (spawned.type === "error" && index.agentProfileUnavailableReason(spawned.errorMessage)) {
7187
+ await fail({ ...receipt, phase: "claimed" }, accountUnavailableError(spawned.errorMessage, "issue") ?? spawned.errorMessage);
7188
+ return;
7189
+ }
7190
+ if (spawned.type === "error" && spawned.startupExit?.exited) {
7191
+ await fail(receipt, `Session failed to start: ${spawned.errorMessage}`);
7192
+ return;
7193
+ }
7194
+ if (spawned.type === "requestToApproveDirectoryCreation") {
7195
+ await fail(receipt, `Directory does not exist on this machine: ${spawn.directory}`);
7196
+ return;
7197
+ }
7198
+ if (spawned.type !== "success") {
7199
+ const matches = persistedRunSessions(view.runId);
7200
+ if (matches.length !== 1) {
7201
+ await fail(receipt, `Spawn outcome unknown: ${spawned.errorMessage}`, true);
7202
+ return;
7203
+ }
7204
+ receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
7205
+ } else {
7206
+ receipt = save({ ...receipt, sessionId: spawned.sessionId, phase: "spawned" });
7207
+ }
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") {
7212
+ const matches = persistedRunSessions(view.runId);
7213
+ if (matches.length !== 1) {
7214
+ await fail(receipt, "Spawn outcome unknown; verify the old process before retrying", true);
7215
+ return;
7216
+ }
7217
+ receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
7218
+ runBySession.set(receipt.sessionId, view.runId);
7219
+ }
7220
+ if (receipt.phase === "spawned") {
7221
+ const sessionId = receipt.sessionId;
7222
+ const mode = spawnAgents.sanitizeSpawnPermissionMode(spawn.permissionMode ?? void 0);
7223
+ const permissionMode = spawnAgents.resolveSpawnPermissionMode(agent, mode ?? void 0);
7224
+ const meta = spawnAgents.resolveFirstMessageMeta({ agent, permissionMode, explicitModel: spawn.model ?? void 0, capabilities: capabilities(sessionId) });
7225
+ try {
7226
+ await send(sessionId, spawn.prompt, { localId: `${index.ISSUE_DISPATCH_LOCAL_ID_PREFIX}${view.id}`, sentFrom: index.ISSUE_SENT_FROM, ...meta });
7227
+ } catch (error) {
7228
+ await fail(receipt, `First message failed: ${error instanceof Error ? error.message : String(error)}`);
7229
+ return;
7230
+ }
7231
+ receipt = save({ ...receipt, phase: "delivered" });
7232
+ }
7233
+ if (receipt.phase === "delivered" || receipt.phase === "completed") {
7234
+ await complete(receipt);
7235
+ lastEvent.set(receipt.sessionId, "running");
7236
+ }
7237
+ }
7238
+ async function runMessage(view, receipt) {
7239
+ const message = view.message;
7240
+ if (receipt.phase === "failed") {
7241
+ await fail(receipt, "Session is not running on this machine");
7242
+ return;
7243
+ }
7244
+ if (!message) {
7245
+ await fail(receipt, "Dispatch has no message payload");
7246
+ return;
7247
+ }
7248
+ if (receipt.phase === "claimed") {
7249
+ if (!deps.live(message.sessionId)) {
7250
+ await fail(receipt, "Session is not running on this machine");
7251
+ return;
7252
+ }
7253
+ try {
7254
+ await send(message.sessionId, message.text, { localId: `${index.ISSUE_DISPATCH_LOCAL_ID_PREFIX}${view.id}`, sentFrom: index.ISSUE_SENT_FROM });
7255
+ } catch (error) {
7256
+ await fail(receipt, `Message delivery failed: ${error instanceof Error ? error.message : String(error)}`);
7257
+ return;
7258
+ }
7259
+ receipt = save({ ...receipt, sessionId: message.sessionId, phase: "delivered" });
7260
+ }
7261
+ await complete({ ...receipt, sessionId: receipt.sessionId ?? message.sessionId });
7262
+ }
7263
+ async function execute(polled) {
7264
+ let claimed;
7265
+ try {
7266
+ claimed = (await client.claim(polled.id, deps.machineId)).dispatch;
7267
+ } catch (error) {
7268
+ const code = httpCode(error);
7269
+ if (code === "issue_dispatch_claim_mismatch" || code === "issue_run_not_current" || code === "issue_dispatch_not_found") return;
7270
+ throw error;
7271
+ }
7272
+ if (!claimed.claimId) throw new Error("Dispatch claim did not return a claim id");
7273
+ const prior = readIssueReceipt(home, claimed.id);
7274
+ const receipt = save(prior ? { ...prior, claimId: claimed.claimId } : { dispatchId: claimed.id, kind: claimed.kind === "message" ? "message" : "spawn", runId: claimed.runId, issueId: claimed.issueId, claimId: claimed.claimId, phase: "claimed", updatedAt: Date.now() });
7275
+ if (claimed.kind === "message") await runMessage(claimed, receipt);
7276
+ else if (claimed.kind === "spawn") await runSpawn(claimed, receipt);
7277
+ else await fail(receipt, `Unknown dispatch kind "${claimed.kind}"`);
7278
+ }
7279
+ let flushing = false;
7280
+ async function flushEvents() {
7281
+ if (flushing) return;
7282
+ flushing = true;
7283
+ try {
7284
+ await drainEvents();
7285
+ } finally {
7286
+ flushing = false;
7287
+ }
7288
+ }
7289
+ async function drainEvents() {
7290
+ while (events.length && !closed) {
7291
+ const next = events[0];
7292
+ try {
7293
+ await client.sessionEvent(next.runId, { machineId: deps.machineId, sessionId: next.sessionId, event: next.event });
7294
+ } catch (error) {
7295
+ const code = httpCode(error);
7296
+ if (!(error instanceof client$2.IssuesUnsupportedError) && code !== "issue_run_not_found" && !(error instanceof client$2.IssueRequestError && error.status < 500 && error.status !== 429)) return;
7297
+ }
7298
+ events.shift();
7299
+ if (next.event === "exited" || next.event === "crashed") {
7300
+ runBySession.delete(next.sessionId);
7301
+ lastEvent.delete(next.sessionId);
7302
+ for (const r of listIssueReceipts(home)) if (r.sessionId === next.sessionId && r.kind === "spawn") save({ ...r, ended: true });
7303
+ }
7304
+ }
7305
+ }
7306
+ async function tick() {
7307
+ if (running || closed || Date.now() < retryAt) return;
7308
+ running = true;
7309
+ try {
7310
+ let dispatches;
7311
+ try {
7312
+ dispatches = (await client.poll(deps.machineId)).dispatches ?? [];
7313
+ } catch (error) {
7314
+ if (!(error instanceof client$2.IssuesUnsupportedError)) {
7315
+ retryAt = Date.now() + 3e4;
7316
+ deps.log(`Issue dispatch poll unavailable${error instanceof client$2.IssueRequestError ? ` (${error.status}${error.code ? ` ${error.code}` : ""})` : ""}`);
7317
+ }
7318
+ return;
7319
+ }
7320
+ for (const dispatch of dispatches) {
7321
+ if (closed) break;
7322
+ try {
7323
+ await execute(dispatch);
7324
+ } catch (error) {
7325
+ deps.log(`Issue dispatch ${dispatch.id} remains pending${error instanceof client$2.IssueRequestError && error.code ? ` (${error.code})` : ""}`);
7326
+ }
7327
+ }
7328
+ await flushEvents();
7329
+ } finally {
7330
+ running = false;
7331
+ }
7332
+ }
7333
+ let timer;
7334
+ if (deps.autoStart !== false) {
7335
+ timer = setInterval(() => {
7336
+ void tick();
7337
+ }, ISSUE_POLL_MS);
7338
+ timer.unref();
7339
+ void tick();
7340
+ }
7341
+ return {
7342
+ tick,
7343
+ hasSession: (sessionId) => runBySession.has(sessionId),
7344
+ /** Daemon hooks (turn start/end, wrapper exit) → run session event; deduplicated per session. */
7345
+ report(sessionId, event) {
7346
+ const runId = runBySession.get(sessionId);
7347
+ if (!runId || closed || lastEvent.get(sessionId) === event) return;
7348
+ lastEvent.set(sessionId, event);
7349
+ events.push({ sessionId, runId, event });
7350
+ if (events.length > 500) events.splice(0, events.length - 500);
7351
+ void flushEvents();
7352
+ },
7353
+ get busy() {
7354
+ return running;
7355
+ },
7356
+ stop: () => {
7357
+ closed = true;
7358
+ if (timer) clearInterval(timer);
7359
+ }
7360
+ };
7361
+ }
7362
+
7031
7363
  function daemonExitCode(source) {
7032
7364
  return source === "exception" ? 1 : 0;
7033
7365
  }
@@ -7183,6 +7515,7 @@ async function startDaemon() {
7183
7515
  logger.logger.debug("[DAEMON RUN] Auth and machine setup complete");
7184
7516
  const pidToTrackedSession = /* @__PURE__ */ new Map();
7185
7517
  const turnActivity = new api.TurnActivityTracker();
7518
+ turnActivity.onEvent((sessionId, event) => issueWorker?.report(sessionId, event === "turn_started" ? "running" : "idle"));
7186
7519
  const backgroundTasks = new backgroundTaskActivity.BackgroundTaskTracker();
7187
7520
  const peerCoordinator = createPeerCoordinator({ getChildren: () => Array.from(pidToTrackedSession.values()) });
7188
7521
  const hibernationAutomations = client$1.createAutomationsClient({ serverUrl: configuration.configuration.serverUrl, token: credentials.token, client: "daemon-hibernate" });
@@ -7218,6 +7551,7 @@ async function startDaemon() {
7218
7551
  let autoRestart;
7219
7552
  let bundleReplacedSeen = false;
7220
7553
  let automationRunner;
7554
+ let issueWorker;
7221
7555
  let projectPresence;
7222
7556
  const persisted = persistence.readPersistedSessions();
7223
7557
  const liveHappyProcesses = await doctor$1.findAllHappyProcesses();
@@ -7739,7 +8073,7 @@ async function startDaemon() {
7739
8073
  happyProcess.on("exit", (code, signal) => {
7740
8074
  logger.logger.debug(`[DAEMON RUN] Child PID ${happyProcess.pid} exited with code ${code}, signal ${signal}`);
7741
8075
  if (happyProcess.pid) {
7742
- onChildExited(happyProcess.pid);
8076
+ onChildExited(happyProcess.pid, { code, signal });
7743
8077
  }
7744
8078
  });
7745
8079
  happyProcess.on("error", (error) => {
@@ -8130,8 +8464,11 @@ async function startDaemon() {
8130
8464
  logger.logger.debug(`[DAEMON RUN] Session ${sessionId} not found`);
8131
8465
  return false;
8132
8466
  };
8133
- const onChildExited = (pid) => {
8467
+ const onChildExited = (pid, exit) => {
8134
8468
  const session = pidToTrackedSession.get(pid);
8469
+ if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && issueWorker?.hasSession(session.happySessionId)) {
8470
+ issueWorker.report(session.happySessionId, daemonHibernation.pendingExit(session.happySessionId) ? "idle" : issueExitEvent(exit));
8471
+ }
8135
8472
  if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
8136
8473
  if (session?.happySessionId && automationRunner?.hasSession(session.happySessionId)) automationRunner.report(session.happySessionId, "exited");
8137
8474
  if (session?.happySessionId) turnActivity.forget(session.happySessionId);
@@ -8661,6 +8998,7 @@ async function startDaemon() {
8661
8998
  const sessionsHold = () => daemonSupervisor.handoverWaitsForSessions({ bundleReplaced, relayMove: !!relayMove, sparesWrappers: handoverSparesWrappers }) && (turnActivity.hasActiveTurn() || backgroundTasks.hasAny());
8662
8999
  if ((bundleReplaced || relayMove) && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !harnessInstaller?.isRunning() && !sessionsHold()) {
8663
9000
  const preflight = bundleReplaced ? await preflightNewBundle(bundlePath) : { action: "proceed" };
9001
+ if (issueWorker?.busy) return;
8664
9002
  if (preflight.action === "hold") {
8665
9003
  if (lastHandoverHold !== preflight.reason) {
8666
9004
  lastHandoverHold = preflight.reason;
@@ -8674,6 +9012,7 @@ async function startDaemon() {
8674
9012
  logger.logger.debug(relayMove ? `[DAEMON RUN] Relay moved to ${relayMove.serverUrl}; handing off to a new daemon on the new settings` : "[DAEMON RUN] Daemon bundle replaced on disk and verified, handing off to new daemon");
8675
9013
  teamWorker?.stop();
8676
9014
  automationRunner?.stop();
9015
+ issueWorker?.stop();
8677
9016
  projectPresence?.stop();
8678
9017
  clearInterval(restartOnStaleVersionAndHeartbeat);
8679
9018
  clearInterval(cliUpdateInterval);
@@ -8770,6 +9109,15 @@ async function startDaemon() {
8770
9109
  } : {},
8771
9110
  log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
8772
9111
  });
9112
+ issueWorker = createIssueWorker({
9113
+ machineId,
9114
+ client: client$2.createIssuesClient({ token: async () => credentials.token }),
9115
+ spawn: spawnSession,
9116
+ live: (id) => [...pidToTrackedSession.values()].some((s) => s.happySessionId === id && isPidAlive(s.pid)),
9117
+ ...accountServiceRef ? { resolveAccount: (agent, requested) => accountServiceRef.resolveSpawnAccount(agent, requested) } : {},
9118
+ joinProject: (sessionId, projectId) => spawnAgents.joinProject(projectsClient, sessionId, { kind: "explicit", projectId }, { via: "issue" }),
9119
+ log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
9120
+ });
8773
9121
  projectPresence = createProjectPresenceReporter({
8774
9122
  machineId,
8775
9123
  client: projectsClient,
@@ -8803,6 +9151,7 @@ async function startDaemon() {
8803
9151
  const scrollbackFlush = apiMachine.flushTerminalScrollback();
8804
9152
  teamWorker?.stop();
8805
9153
  automationRunner?.stop({ killScripts: true });
9154
+ issueWorker?.stop();
8806
9155
  projectPresence?.stop();
8807
9156
  mirrorProtocol.currentWorktreeService()?.stopAll();
8808
9157
  if (restartOnStaleVersionAndHeartbeat) {