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,26 +1,26 @@
1
- import { i as isClaudeSessionId, h as extractCompleteLines, j as decideBackfill, k as parseTerminalHookPayload, m as decideMirrorBinding, M as MIRROR_BACKFILL_LINES_DEFAULT, n as mirrorLineKey, o as mirrorLocalId, q as initializeOwnedWorktree, f as summarizeSpawnSessionForLog, t as startAgentVersionChecks, W as WORKTREE_CAPABILITY_VERSION, u as currentWorktreeService } from './mirrorProtocol-BLhArCS9.mjs';
1
+ import { i as isClaudeSessionId, h as extractCompleteLines, j as decideBackfill, k as parseTerminalHookPayload, m as decideMirrorBinding, M as MIRROR_BACKFILL_LINES_DEFAULT, n as mirrorLineKey, o as mirrorLocalId, q as initializeOwnedWorktree, f as summarizeSpawnSessionForLog, t as startAgentVersionChecks, W as WORKTREE_CAPABILITY_VERSION, u as currentWorktreeService } from './mirrorProtocol-DFQLXDBI.mjs';
2
2
  import { F as FS_MKDIR_CAPABILITY_VERSION } from './fsMkdir-DumgLTzR.mjs';
3
- import { P as PI_ADAPTER_INSTALL_HINT, s as sanitizeSpawnModel } from './piRunnerArgs-DwcAwwzm.mjs';
3
+ import { P as PI_ADAPTER_INSTALL_HINT, s as sanitizeSpawnModel } from './piRunnerArgs-Bdj0sjAT.mjs';
4
4
  import fs from 'fs/promises';
5
5
  import os from 'os';
6
6
  import * as tmp from 'tmp';
7
7
  import axios from 'axios';
8
8
  import { readFileSync, openSync, fsyncSync, closeSync, renameSync, existsSync, readdirSync, statSync, unlinkSync, readSync, writeSync, ftruncateSync, utimesSync, realpathSync, promises, constants as constants$1, writeFileSync, mkdirSync, accessSync, rmdirSync } from 'node:fs';
9
9
  import { join, isAbsolute, resolve, dirname, sep, basename, relative } from 'node:path';
10
- import { f as ensurePrivateDirectorySync, w as writePrivateFileSync, c as configuration } from './configuration-JBFF7432.mjs';
11
- import { T as TurnActivityTracker, A as ApiClient } from './api-oceym3w6.mjs';
12
- import { S as SPAWN_AGENTS, i as isSpawnAgent, s as sanitizeSpawnPermissionMode, r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta, j as joinProject } from './spawnAgents-DEBfpoPZ.mjs';
13
- import { l as logger } from './logger-BHfBDOsy.mjs';
14
- import { p as pruneStaleCompileCaches } from './index-CZpFhEmE.mjs';
15
- import { a as authAndSetupMachineIfNeeded } from './auth-BIkCWkRV.mjs';
10
+ import { f as ensurePrivateDirectorySync, w as writePrivateFileSync, c as configuration } from './configuration-4pG95tsq.mjs';
11
+ import { T as TurnActivityTracker, A as ApiClient } from './api-DCUiAds-.mjs';
12
+ import { S as SPAWN_AGENTS, i as isSpawnAgent, s as sanitizeSpawnPermissionMode, r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta, j as joinProject } from './spawnAgents-XObVj6zN.mjs';
13
+ import { l as logger } from './logger-BLMi8oJK.mjs';
14
+ import { p as pruneStaleCompileCaches } from './index-Sdvy1Lsf.mjs';
15
+ import { a as authAndSetupMachineIfNeeded } from './auth-8jKFCZOX.mjs';
16
16
  import { spawn, execSync } from 'child_process';
17
- import { p as packageJson } from './package-BGZo2vAj.mjs';
18
- import { a as globalPrefixForPackage, N as NPM_SAFE_ARG, g as getEnvironmentInfo } from './doctor-jrvm-tl3.mjs';
19
- import { s as spawnHappyCLI } from './spawnHappyCLI-CUfe8n_m.mjs';
20
- import { c as readPersistedSessions, r as readSettings, l as latchKeepAwake, s as reportSignature, t as decideDaemonHibernation, v as nextCheckDelay, x as persistSession, d as readDaemonState, y as acquireDaemonLock, a as resolveCheckMs, z as resolveIdleMs, A as deletePersistedSessions, B as writeDaemonState, C as writeSettings, D as settingIdleMs, u as updateSettings, E as rewriteCredentialsForRelay, g as readCredentials, F as releaseDaemonLock } from './persistence-DvD-irLh.mjs';
21
- import { i as isDaemonRunningCurrentlyInstalledHappyVersion, s as stopDaemon, w as cleanupDaemonState } from './controlClient-D5BYm3PU.mjs';
22
- import { e as sendUserMessage, f as readSessionMetadata, r as readSessionTranscript, l as listAccountSessions, a as listSessions, M as MAX_READ_LIMIT, s as sessionWebUrl, n as lineageOf, g as waitForSessionKey, d as archiveSession, h as analyzeLatestTurn, i as readSessionLog, j as TURN_WINDOW, p as userPromptText } from './sessionOps-D-SDNs-D.mjs';
23
- import { Q as AgentProfilesStateSchema, aa as ServerMigrateNoticeSchema, ab as isHarnessInstallId, ac as agentProfileUnavailableReason, ad as MODEL_INTENT_CONFIG, j as AUTOMATION_SUMMARY_MAX_CHARS, ae as AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS, af as AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS, d as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, ag as AUTOMATION_CLAIM_MAX_RUNS, ah as AUTOMATION_DAEMON_CAPABILITY_PRECHECK, ai as AUTOMATION_DEFAULT_LEASE_MS, i as isAutomationRunTerminal, v as resolveLaunchAgentProfile, aj as HARNESS_INSTALL_CAPABILITY_VERSION } from './index-CxiisoO1.mjs';
17
+ import { p as packageJson } from './package-DbGqY8Ej.mjs';
18
+ import { a as globalPrefixForPackage, N as NPM_SAFE_ARG, g as getEnvironmentInfo } from './doctor-Dy7z3qvy.mjs';
19
+ import { s as spawnHappyCLI } from './spawnHappyCLI-Cc9kKpcq.mjs';
20
+ import { c as readPersistedSessions, r as readSettings, l as latchKeepAwake, s as reportSignature, t as decideDaemonHibernation, v as nextCheckDelay, x as persistSession, d as readDaemonState, y as acquireDaemonLock, a as resolveCheckMs, z as resolveIdleMs, A as deletePersistedSessions, B as writeDaemonState, C as writeSettings, D as settingIdleMs, u as updateSettings, E as rewriteCredentialsForRelay, g as readCredentials, F as releaseDaemonLock } from './persistence-DbOKjdUD.mjs';
21
+ import { i as isDaemonRunningCurrentlyInstalledHappyVersion, s as stopDaemon, w as cleanupDaemonState } from './controlClient-bqCKl9Nv.mjs';
22
+ import { e as sendUserMessage, f as readSessionMetadata, r as readSessionTranscript, l as listAccountSessions, a as listSessions, M as MAX_READ_LIMIT, s as sessionWebUrl, n as lineageOf, g as waitForSessionKey, d as archiveSession, h as analyzeLatestTurn, i as readSessionLog, j as TURN_WINDOW, p as userPromptText } from './sessionOps-D-uFSTHk.mjs';
23
+ import { a1 as AgentProfilesStateSchema, am as ServerMigrateNoticeSchema, an as isHarnessInstallId, ao as agentProfileUnavailableReason, ap as MODEL_INTENT_CONFIG, q as AUTOMATION_SUMMARY_MAX_CHARS, aq as AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS, ar as AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS, d as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, as as AUTOMATION_CLAIM_MAX_RUNS, at as AUTOMATION_DAEMON_CAPABILITY_PRECHECK, au as AUTOMATION_DEFAULT_LEASE_MS, i as isAutomationRunTerminal, D as resolveLaunchAgentProfile, av as ISSUE_SENT_FROM, aw as ISSUE_DISPATCH_LOCAL_ID_PREFIX, f as ISSUE_ASSIGNABLE_AGENTS, ax as HARNESS_INSTALL_CAPABILITY_VERSION } from './index-kwsivEs-.mjs';
24
24
  import fastify from 'fastify';
25
25
  import { z } from 'zod';
26
26
  import { validatorCompiler, serializerCompiler } from 'fastify-type-provider-zod';
@@ -28,68 +28,69 @@ import { d as decodeBase64, s as sameRelay, e as encodeBase64, h as decrypt } fr
28
28
  import { randomBytes, createHash, timingSafeEqual, randomUUID } from 'node:crypto';
29
29
  import { c as checkPreviewPath } from './previewPath-CXN4Vag0.mjs';
30
30
  import { a as BACKGROUND_TASKS_MAX, d as BACKGROUND_TASK_DESCRIPTION_MAX, e as BackgroundTaskTracker } from './backgroundTaskActivity-8PdPxrvy.mjs';
31
- import { b as sanitizeRateLimitReport } from './rateLimitWindows-DzXv6p_W.mjs';
32
- import { f as formatEditConflictNotice, b as SESSION_PEER_SENT_FROM, s as sendPeerMessage, l as listPeerSessions, C as CLI_PEER_SENDER_ID } from './peerTools-BO-H0wNj.mjs';
31
+ import { b as sanitizeRateLimitReport } from './rateLimitWindows-DZVrafmm.mjs';
32
+ import { f as formatEditConflictNotice, b as SESSION_PEER_SENT_FROM, s as sendPeerMessage, l as listPeerSessions, C as CLI_PEER_SENDER_ID } from './peerTools-4GYKxr8J.mjs';
33
33
  import os$1, { hostname, homedir, tmpdir } from 'node:os';
34
- import { c as RemoteCallBudget, e as REMOTE_WRITE_CALLS_PER_MINUTE, d as deliverToSession, g as guardRemoteSessionOpsRequest, h as remoteError, i as REMOTE_OP_DEADLINE_MS, j as formatRemoteAuditLine, k as REMOTE_SEND_COMMIT_DEADLINE_MS, m as REMOTE_RESUME_WAIT_MS, n as capRemoteTranscript, o as capRemoteText, p as REMOTE_ANSWER_MAX_BYTES, q as REMOTE_TITLE_MAX_BYTES } from './remoteSessionClient-CFNM8UEh.mjs';
35
- import { assistantHome, bootstrapAssistantHome } from './bootstrap-D8DYLUId.mjs';
36
- import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-CofTgtQ3.mjs';
34
+ import { c as RemoteCallBudget, e as REMOTE_WRITE_CALLS_PER_MINUTE, d as deliverToSession, g as guardRemoteSessionOpsRequest, h as remoteError, i as REMOTE_OP_DEADLINE_MS, j as formatRemoteAuditLine, k as REMOTE_SEND_COMMIT_DEADLINE_MS, m as REMOTE_RESUME_WAIT_MS, n as capRemoteTranscript, o as capRemoteText, p as REMOTE_ANSWER_MAX_BYTES, q as REMOTE_TITLE_MAX_BYTES } from './remoteSessionClient-BFd_D9ka.mjs';
35
+ import { assistantHome, bootstrapAssistantHome } from './bootstrap-BkLFgEGF.mjs';
36
+ import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-XP-qcJQ3.mjs';
37
37
  import require$$0, { existsSync as existsSync$1, statSync as statSync$1, mkdtempSync, rmSync } from 'fs';
38
38
  import require$$1, { join as join$1 } from 'path';
39
39
  import { spawn as spawn$1, execFile, spawnSync } from 'node:child_process';
40
40
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
41
41
  import { d as daemonEndpointsMatch, r as resolveClaudeCredentialReadiness } from './doctorReadiness-C208SMN9.mjs';
42
- import { o as ownerRetryPending, c as consumeOwnerRetry, s as spawnGate, a as afterStartupFailure, b as startupFailureMessage, T as TEAM_SPAWN_MAX_ATTEMPTS, d as TEAM_CLEANUP_RETRY_MS, g as getInitialMachineMetadata, e as getStartupCliAvailability, f as TEAM_RETRY_CAPABILITY_VERSION, w as withRunningCliFacts } from './machineMetadata-Ekniv5o4.mjs';
42
+ import { o as ownerRetryPending, c as consumeOwnerRetry, s as spawnGate, a as afterStartupFailure, b as startupFailureMessage, T as TEAM_SPAWN_MAX_ATTEMPTS, d as TEAM_CLEANUP_RETRY_MS, g as getInitialMachineMetadata, e as getStartupCliAvailability, f as TEAM_RETRY_CAPABILITY_VERSION, w as withRunningCliFacts } from './machineMetadata-D8OWVD4l.mjs';
43
43
  import { M as ModelConfigError, B as BackupStore, r as readConfigFile, s as sha256, a as atomicWriteFile } from './fileStore-5qpetZS0.mjs';
44
44
  import { c as collectSecretValues, a as parseJsonObject, b as childObject, s as setOrDelete, d as changedPaths, e as stringifyLike, f as fail, n as normalizeModelList, g as normalizeModelId, h as normalizeSecret, i as normalizeBaseUrl, u as uniq, j as baseUrlWarnings, m as maskSecret, k as getPath$1, l as normalizeProviderId, o as piAdapter, r as redactText } from './pi-CqyoZMjI.mjs';
45
- import { p as parse } from './codexAccount-CnbDfCOM.mjs';
45
+ import { p as parse } from './codexAccount-BAezf1fY.mjs';
46
46
  import require$$3 from 'crypto';
47
47
  import { c as commandOnPath } from './detectCLI-CSGMlV51.mjs';
48
- import { buildResumeLaunch } from './handleResumeCommand-CFupxyHT.mjs';
48
+ import { buildResumeLaunch } from './handleResumeCommand-Dz4Aw_aZ.mjs';
49
49
  import { n as normalizeWebPanels } from './webPanels-B2_C2-3g.mjs';
50
50
  import { access, symlink, readFile, rm, unlink, readlink, lstat, constants, rename, mkdir, copyFile, readdir, stat, open } from 'node:fs/promises';
51
51
  import { p as parseExactVersion, c as compareExactVersions, f as fetchCliUpdateState, r as resolveCliUpdateCheckInterval, D as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS } from './cliUpdate-Y34VGe9Y.mjs';
52
- import { P as ProjectsUnsupportedError, c as createProjectsClient } from './client-BRuFIwki.mjs';
53
- import { d as wrapperReportsIdle, f as decideAutoRestart, s as statusFromVerdict, g as autoRestartNextCheck, h as wrapperStaleness, r as recordAttempt, i as AUTO_RESTART_MAX_ATTEMPTS, j as AUTO_RESTART_MIN_GAP_MS, p as processIdentityFields, k as readSessionLock, l as AUTO_RESTARTED_ENV, n as encodeAutoRestarted, o as pendingUpgradeVersion, q as resolveQuietMs, u as AUTO_RESTART_RECHECK_CAP_MS } from './sessionLock-DqFKSW8u.mjs';
54
- import { c as createAutomationsClient, i as isAutomationsUnavailable, d as AutomationsRequestError } from './client-CISkP897.mjs';
52
+ import { P as ProjectsUnsupportedError, c as createProjectsClient } from './client-BXwIqRha.mjs';
53
+ import { d as wrapperReportsIdle, f as decideAutoRestart, s as statusFromVerdict, g as autoRestartNextCheck, h as wrapperStaleness, r as recordAttempt, i as AUTO_RESTART_MAX_ATTEMPTS, j as AUTO_RESTART_MIN_GAP_MS, p as processIdentityFields, k as readSessionLock, l as AUTO_RESTARTED_ENV, n as encodeAutoRestarted, o as pendingUpgradeVersion, q as resolveQuietMs, u as AUTO_RESTART_RECHECK_CAP_MS } from './sessionLock-CphKQyav.mjs';
54
+ import { c as createAutomationsClient, i as isAutomationsUnavailable, d as AutomationsRequestError } from './client-Blpuk2Hr.mjs';
55
55
  import { w as withKeychainOffPath, a as keychainIdentityFor, i as interpretSecurityRead, s as securityReadArgs, b as securityDeleteArgs, c as keychainOffShimDir, d as interpretCredentialsFile, C as CREDENTIALS_REJECTED_DETAIL, e as buildClaudeAuthState, f as claudeAuthStateChanged, r as resolveSdkClaudeBinary, g as classifyAuthStatus, h as diagnoseStores, p as parseLaunchctlPid, H as HAPPY_DAEMON_LAUNCHD_LABEL, j as classifyLineage, l as probeLaunchdJob, m as detectDaemonSupervisor, n as daemonLineage, o as probeSystemdKillMode, q as wrappersSurviveHandover, t as handoverWaitsForSessions } from './daemonSupervisor-BxohggqN.mjs';
56
- import { A as AccountService } from './accountService-D7NZrnQd.mjs';
57
- import { spawnSetupTokenPty, watchAccountFiles } from './daemonAccounts-asWvoPKG.mjs';
56
+ import { A as AccountService } from './accountService-ELazcp3V.mjs';
57
+ import { spawnSetupTokenPty, watchAccountFiles } from './daemonAccounts-B8xnkprW.mjs';
58
58
  import { g as getProjectPath } from './path-D2wdaNSk.mjs';
59
59
  import { b as extractClaudeEditPaths } from './editPaths-BVfS_FFL.mjs';
60
- import { s as startFileWatcher } from './startFileWatcher-JdO3v65I.mjs';
61
- import { I as InvalidateSync } from './sync-BLGrIKN9.mjs';
60
+ import { s as startFileWatcher } from './startFileWatcher-t3K1y9kY.mjs';
61
+ import { I as InvalidateSync } from './sync-s1pUqWGm.mjs';
62
62
  import { R as RawJSONLinesSchema } from './types-CkqAACXx.mjs';
63
63
  import { t as tmuxArgs, a as scrubTmuxClientEnv, s as shellescape } from './tmuxSocket-BmZyixRM.mjs';
64
64
  import { i as isProcessAlive, t as terminateProcessTree } from './processTermination-ChJG5SLW.mjs';
65
65
  import { findAllHappyProcesses } from './doctor-GN5mPOn5.mjs';
66
66
  import { T as TEAM_SKILL, a as TEAM_LEAD_PLAYBOOK, b as TEAM_MEMBER_RULES } from './resources-CLP_MpK4.mjs';
67
67
  import { promisify } from 'node:util';
68
- import { b as clipText, r as renderAction, c as clipAutomationReport, e as renderTemplate } from './template-BGlDAjbM.mjs';
68
+ import { b as clipText, r as renderAction, c as clipAutomationReport, e as renderTemplate } from './template-oBrR0saD.mjs';
69
+ import { I as IssuesUnsupportedError, a as IssueRequestError, c as createIssuesClient } from './client-BgxQ9aej.mjs';
69
70
  import { d as describeAgentHome } from './loginShellEnv-Dw8M7tkI.mjs';
70
- import { S as SPAWN_ACCOUNT_ENV } from './store-DEhdblkI.mjs';
71
- import './acpSessionResume-D6YgeofW.mjs';
72
- import './pushNotifications-D2UZnoTB.mjs';
71
+ import { S as SPAWN_ACCOUNT_ENV } from './store-CqNAE-0v.mjs';
72
+ import './acpSessionResume-De_sTG30.mjs';
73
+ import './pushNotifications-CrCTpDiN.mjs';
73
74
  import './contentLogMetadata-BlWI0egu.mjs';
74
- import './reconnectGate-CxLgZCBh.mjs';
75
+ import './reconnectGate-COxAZTv8.mjs';
75
76
  import 'node:events';
76
77
  import 'socket.io-client';
77
78
  import './limits-DIo7rEBR.mjs';
78
- import './time-DZE0879N.mjs';
79
- import './registerCommonHandlers-ChdVwZW6.mjs';
79
+ import './time-qd46L189.mjs';
80
+ import './registerCommonHandlers-Cfl_dEWs.mjs';
80
81
  import 'util';
81
82
  import 'cross-spawn';
82
83
  import '@paralleldrive/cuid2';
83
84
  import 'chalk';
84
85
  import 'node:module';
85
86
  import 'tweetnacl';
86
- import './browser-C-H3QYV2.mjs';
87
+ import './browser-BAlw0rns.mjs';
87
88
  import 'open';
88
89
  import './specialCommands-MXUN0wfI.mjs';
89
90
  import './ids-DU6sLx4C.mjs';
90
91
  import 'url';
91
- import './localHappyAgentAuth-BiIyMoiG.mjs';
92
- import './claudeAccountEnv-DmVbGhZb.mjs';
92
+ import './localHappyAgentAuth-DeDQjw24.mjs';
93
+ import './claudeAccountEnv-CI8RlIB9.mjs';
93
94
  import 'node:readline';
94
95
  import 'node-pty';
95
96
  import './processTreeSnapshot-fuwxC0fr.mjs';
@@ -7007,6 +7008,337 @@ ${action.prompt}`, { localId: `automation-${run.id}`, ...meta });
7007
7008
  };
7008
7009
  }
7009
7010
 
7011
+ const ID = /^[A-Za-z0-9_-]{1,128}$/;
7012
+ const ISSUE_RECEIPT_TTL_MS = 7 * 24 * 36e5;
7013
+ function dir(home) {
7014
+ return join(home, "issues", "receipts");
7015
+ }
7016
+ function readIssueReceipt(home, dispatchId) {
7017
+ if (!ID.test(dispatchId)) return null;
7018
+ try {
7019
+ return JSON.parse(readFileSync(join(dir(home), `${dispatchId}.json`), "utf8"));
7020
+ } catch {
7021
+ return null;
7022
+ }
7023
+ }
7024
+ function writeIssueReceipt(home, receipt) {
7025
+ if (!ID.test(receipt.dispatchId)) throw new Error("Invalid dispatch id");
7026
+ ensurePrivateDirectorySync(dir(home));
7027
+ writePrivateFileSync(join(dir(home), `${receipt.dispatchId}.json`), JSON.stringify({ ...receipt, updatedAt: Date.now() }));
7028
+ }
7029
+ function listIssueReceipts(home, now = Date.now()) {
7030
+ let files;
7031
+ try {
7032
+ files = readdirSync(dir(home));
7033
+ } catch {
7034
+ return [];
7035
+ }
7036
+ const out = [];
7037
+ for (const file of files) {
7038
+ if (!file.endsWith(".json")) continue;
7039
+ const path = join(dir(home), file);
7040
+ try {
7041
+ const receipt = JSON.parse(readFileSync(path, "utf8"));
7042
+ const at = typeof receipt.updatedAt === "number" ? receipt.updatedAt : statSync(path).mtimeMs;
7043
+ if (now - at > ISSUE_RECEIPT_TTL_MS) {
7044
+ unlinkSync(path);
7045
+ continue;
7046
+ }
7047
+ out.push(receipt);
7048
+ } catch {
7049
+ }
7050
+ }
7051
+ return out;
7052
+ }
7053
+
7054
+ const ISSUE_POLL_MS = 5e3;
7055
+ const ISSUE_SPAWNED_BY = "issue";
7056
+ const FIRST_MESSAGE_KEY_WAIT_MS = 1e4;
7057
+ function issueKeyFromPrompt(prompt) {
7058
+ return /^You are assigned issue ([A-Z]+-\d{1,9}):/.exec(prompt)?.[1] ?? null;
7059
+ }
7060
+ function issueSpawnAccount(spawn) {
7061
+ if (spawn.agentProfile === void 0) return void 0;
7062
+ return spawn.agentProfile === null ? null : spawn.agentProfile.id;
7063
+ }
7064
+ function issueAccountRefusal(resolve, agent, requested) {
7065
+ if (!resolve) return null;
7066
+ if (agent !== "claude" && agent !== "codex") return typeof requested === "string" ? `Account unavailable (agent-mismatch): accounts are not supported for ${agent} yet` : null;
7067
+ try {
7068
+ resolve(agent, requested);
7069
+ return null;
7070
+ } catch (error) {
7071
+ const message = error instanceof Error ? error.message : String(error);
7072
+ return accountUnavailableError(message, "issue");
7073
+ }
7074
+ }
7075
+ function issueExitEvent(exit) {
7076
+ if (!exit) return "exited";
7077
+ if (exit.signal) return ["SIGTERM", "SIGINT", "SIGHUP"].includes(exit.signal) ? "exited" : "crashed";
7078
+ return exit.code === 0 || exit.code === null || exit.code === 130 || exit.code === 143 ? "exited" : "crashed";
7079
+ }
7080
+ function persistedRunSessions(runId) {
7081
+ return Object.entries(readPersistedSessions()).filter(([, entry]) => entry.metadata?.issue?.runId === runId).map(([sessionId]) => sessionId);
7082
+ }
7083
+ function httpCode(error) {
7084
+ return error instanceof IssueRequestError ? error.code : null;
7085
+ }
7086
+ function createIssueWorker(deps) {
7087
+ const home = deps.home ?? configuration.happyHomeDir;
7088
+ const client = deps.client;
7089
+ const send = deps.send ?? (async (sessionId, text, options) => {
7090
+ const key = await waitForSessionKey(sessionId, FIRST_MESSAGE_KEY_WAIT_MS);
7091
+ await sendUserMessage(sessionId, key, text, "issue", options);
7092
+ });
7093
+ const capabilities = deps.capabilities ?? ((sessionId) => readPersistedSessions()[sessionId]?.metadata?.capabilities ?? null);
7094
+ let running = false;
7095
+ let closed = false;
7096
+ let retryAt = 0;
7097
+ const runBySession = /* @__PURE__ */ new Map();
7098
+ const lastEvent = /* @__PURE__ */ new Map();
7099
+ const events = [];
7100
+ for (const r of listIssueReceipts(home)) {
7101
+ if (r.kind === "spawn" && r.sessionId && !r.ended && (r.phase === "delivered" || r.phase === "completed")) runBySession.set(r.sessionId, r.runId);
7102
+ }
7103
+ const save = (receipt) => {
7104
+ writeIssueReceipt(home, receipt);
7105
+ return receipt;
7106
+ };
7107
+ async function fail(receipt, error, unknown = false) {
7108
+ await client.fail(receipt.dispatchId, { machineId: deps.machineId, claimId: receipt.claimId, error: error.slice(0, 4e3), ...unknown ? { unknown: true } : {} });
7109
+ save({ ...receipt, phase: unknown ? receipt.phase : "failed" });
7110
+ deps.log(`Issue dispatch ${receipt.dispatchId} ${unknown ? "outcome unknown" : "failed"}`);
7111
+ }
7112
+ async function complete(receipt) {
7113
+ let lastError;
7114
+ for (let attempt = 0; attempt < 3; attempt++) {
7115
+ try {
7116
+ await client.complete(receipt.dispatchId, { machineId: deps.machineId, claimId: receipt.claimId, sessionId: receipt.sessionId });
7117
+ save({ ...receipt, phase: "completed" });
7118
+ return;
7119
+ } catch (error) {
7120
+ lastError = error;
7121
+ if (httpCode(error) === "issue_dispatch_claim_mismatch" || error instanceof IssuesUnsupportedError) break;
7122
+ await new Promise((resolve) => setTimeout(resolve, 500 * (attempt + 1)));
7123
+ }
7124
+ }
7125
+ throw lastError;
7126
+ }
7127
+ async function runSpawn(view, receipt) {
7128
+ const spawn = view.spawn;
7129
+ if (receipt.phase === "failed") {
7130
+ await fail(receipt, "This dispatch already failed on this machine");
7131
+ return;
7132
+ }
7133
+ if (!spawn) {
7134
+ await fail(receipt, "Dispatch has no spawn payload");
7135
+ return;
7136
+ }
7137
+ const agent = spawn.agent;
7138
+ if (receipt.phase === "claimed") {
7139
+ if (!ISSUE_ASSIGNABLE_AGENTS.includes(agent)) {
7140
+ await fail(receipt, `Agent "${agent}" cannot run issues on this machine`);
7141
+ return;
7142
+ }
7143
+ if (!isAbsolute(spawn.directory)) {
7144
+ await fail(receipt, `Directory must be absolute: ${spawn.directory}`);
7145
+ return;
7146
+ }
7147
+ const account = issueSpawnAccount(spawn);
7148
+ const refusal = issueAccountRefusal(deps.resolveAccount, agent, account);
7149
+ if (refusal) {
7150
+ await fail(receipt, refusal);
7151
+ return;
7152
+ }
7153
+ const mode = sanitizeSpawnPermissionMode(spawn.permissionMode ?? void 0);
7154
+ const permissionMode = resolveSpawnPermissionMode(agent, mode ?? void 0);
7155
+ const key = issueKeyFromPrompt(spawn.prompt);
7156
+ receipt = save({ ...receipt, phase: "spawning" });
7157
+ const spawned = await deps.spawn({
7158
+ directory: spawn.directory,
7159
+ agent,
7160
+ permissionMode,
7161
+ spawnedBy: ISSUE_SPAWNED_BY,
7162
+ environmentVariables: { VH_ISSUE_ID: view.issueId, VH_ISSUE_RUN_ID: view.runId, ...key ? { VH_ISSUE_KEY: key } : {} },
7163
+ ...account !== void 0 ? { agentProfileId: account } : {}
7164
+ });
7165
+ if (spawned.type === "error" && agentProfileUnavailableReason(spawned.errorMessage)) {
7166
+ await fail({ ...receipt, phase: "claimed" }, accountUnavailableError(spawned.errorMessage, "issue") ?? spawned.errorMessage);
7167
+ return;
7168
+ }
7169
+ if (spawned.type === "error" && spawned.startupExit?.exited) {
7170
+ await fail(receipt, `Session failed to start: ${spawned.errorMessage}`);
7171
+ return;
7172
+ }
7173
+ if (spawned.type === "requestToApproveDirectoryCreation") {
7174
+ await fail(receipt, `Directory does not exist on this machine: ${spawn.directory}`);
7175
+ return;
7176
+ }
7177
+ if (spawned.type !== "success") {
7178
+ const matches = persistedRunSessions(view.runId);
7179
+ if (matches.length !== 1) {
7180
+ await fail(receipt, `Spawn outcome unknown: ${spawned.errorMessage}`, true);
7181
+ return;
7182
+ }
7183
+ receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
7184
+ } else {
7185
+ receipt = save({ ...receipt, sessionId: spawned.sessionId, phase: "spawned" });
7186
+ }
7187
+ runBySession.set(receipt.sessionId, view.runId);
7188
+ if (spawn.projectId && deps.joinProject) await deps.joinProject(receipt.sessionId, spawn.projectId).catch(() => void 0);
7189
+ }
7190
+ if (receipt.phase === "spawning") {
7191
+ const matches = persistedRunSessions(view.runId);
7192
+ if (matches.length !== 1) {
7193
+ await fail(receipt, "Spawn outcome unknown; verify the old process before retrying", true);
7194
+ return;
7195
+ }
7196
+ receipt = save({ ...receipt, sessionId: matches[0], phase: "spawned" });
7197
+ runBySession.set(receipt.sessionId, view.runId);
7198
+ }
7199
+ if (receipt.phase === "spawned") {
7200
+ const sessionId = receipt.sessionId;
7201
+ const mode = sanitizeSpawnPermissionMode(spawn.permissionMode ?? void 0);
7202
+ const permissionMode = resolveSpawnPermissionMode(agent, mode ?? void 0);
7203
+ const meta = resolveFirstMessageMeta({ agent, permissionMode, explicitModel: spawn.model ?? void 0, capabilities: capabilities(sessionId) });
7204
+ try {
7205
+ await send(sessionId, spawn.prompt, { localId: `${ISSUE_DISPATCH_LOCAL_ID_PREFIX}${view.id}`, sentFrom: ISSUE_SENT_FROM, ...meta });
7206
+ } catch (error) {
7207
+ await fail(receipt, `First message failed: ${error instanceof Error ? error.message : String(error)}`);
7208
+ return;
7209
+ }
7210
+ receipt = save({ ...receipt, phase: "delivered" });
7211
+ }
7212
+ if (receipt.phase === "delivered" || receipt.phase === "completed") {
7213
+ await complete(receipt);
7214
+ lastEvent.set(receipt.sessionId, "running");
7215
+ }
7216
+ }
7217
+ async function runMessage(view, receipt) {
7218
+ const message = view.message;
7219
+ if (receipt.phase === "failed") {
7220
+ await fail(receipt, "Session is not running on this machine");
7221
+ return;
7222
+ }
7223
+ if (!message) {
7224
+ await fail(receipt, "Dispatch has no message payload");
7225
+ return;
7226
+ }
7227
+ if (receipt.phase === "claimed") {
7228
+ if (!deps.live(message.sessionId)) {
7229
+ await fail(receipt, "Session is not running on this machine");
7230
+ return;
7231
+ }
7232
+ try {
7233
+ await send(message.sessionId, message.text, { localId: `${ISSUE_DISPATCH_LOCAL_ID_PREFIX}${view.id}`, sentFrom: ISSUE_SENT_FROM });
7234
+ } catch (error) {
7235
+ await fail(receipt, `Message delivery failed: ${error instanceof Error ? error.message : String(error)}`);
7236
+ return;
7237
+ }
7238
+ receipt = save({ ...receipt, sessionId: message.sessionId, phase: "delivered" });
7239
+ }
7240
+ await complete({ ...receipt, sessionId: receipt.sessionId ?? message.sessionId });
7241
+ }
7242
+ async function execute(polled) {
7243
+ let claimed;
7244
+ try {
7245
+ claimed = (await client.claim(polled.id, deps.machineId)).dispatch;
7246
+ } catch (error) {
7247
+ const code = httpCode(error);
7248
+ if (code === "issue_dispatch_claim_mismatch" || code === "issue_run_not_current" || code === "issue_dispatch_not_found") return;
7249
+ throw error;
7250
+ }
7251
+ if (!claimed.claimId) throw new Error("Dispatch claim did not return a claim id");
7252
+ const prior = readIssueReceipt(home, claimed.id);
7253
+ 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() });
7254
+ if (claimed.kind === "message") await runMessage(claimed, receipt);
7255
+ else if (claimed.kind === "spawn") await runSpawn(claimed, receipt);
7256
+ else await fail(receipt, `Unknown dispatch kind "${claimed.kind}"`);
7257
+ }
7258
+ let flushing = false;
7259
+ async function flushEvents() {
7260
+ if (flushing) return;
7261
+ flushing = true;
7262
+ try {
7263
+ await drainEvents();
7264
+ } finally {
7265
+ flushing = false;
7266
+ }
7267
+ }
7268
+ async function drainEvents() {
7269
+ while (events.length && !closed) {
7270
+ const next = events[0];
7271
+ try {
7272
+ await client.sessionEvent(next.runId, { machineId: deps.machineId, sessionId: next.sessionId, event: next.event });
7273
+ } catch (error) {
7274
+ const code = httpCode(error);
7275
+ if (!(error instanceof IssuesUnsupportedError) && code !== "issue_run_not_found" && !(error instanceof IssueRequestError && error.status < 500 && error.status !== 429)) return;
7276
+ }
7277
+ events.shift();
7278
+ if (next.event === "exited" || next.event === "crashed") {
7279
+ runBySession.delete(next.sessionId);
7280
+ lastEvent.delete(next.sessionId);
7281
+ for (const r of listIssueReceipts(home)) if (r.sessionId === next.sessionId && r.kind === "spawn") save({ ...r, ended: true });
7282
+ }
7283
+ }
7284
+ }
7285
+ async function tick() {
7286
+ if (running || closed || Date.now() < retryAt) return;
7287
+ running = true;
7288
+ try {
7289
+ let dispatches;
7290
+ try {
7291
+ dispatches = (await client.poll(deps.machineId)).dispatches ?? [];
7292
+ } catch (error) {
7293
+ if (!(error instanceof IssuesUnsupportedError)) {
7294
+ retryAt = Date.now() + 3e4;
7295
+ deps.log(`Issue dispatch poll unavailable${error instanceof IssueRequestError ? ` (${error.status}${error.code ? ` ${error.code}` : ""})` : ""}`);
7296
+ }
7297
+ return;
7298
+ }
7299
+ for (const dispatch of dispatches) {
7300
+ if (closed) break;
7301
+ try {
7302
+ await execute(dispatch);
7303
+ } catch (error) {
7304
+ deps.log(`Issue dispatch ${dispatch.id} remains pending${error instanceof IssueRequestError && error.code ? ` (${error.code})` : ""}`);
7305
+ }
7306
+ }
7307
+ await flushEvents();
7308
+ } finally {
7309
+ running = false;
7310
+ }
7311
+ }
7312
+ let timer;
7313
+ if (deps.autoStart !== false) {
7314
+ timer = setInterval(() => {
7315
+ void tick();
7316
+ }, ISSUE_POLL_MS);
7317
+ timer.unref();
7318
+ void tick();
7319
+ }
7320
+ return {
7321
+ tick,
7322
+ hasSession: (sessionId) => runBySession.has(sessionId),
7323
+ /** Daemon hooks (turn start/end, wrapper exit) → run session event; deduplicated per session. */
7324
+ report(sessionId, event) {
7325
+ const runId = runBySession.get(sessionId);
7326
+ if (!runId || closed || lastEvent.get(sessionId) === event) return;
7327
+ lastEvent.set(sessionId, event);
7328
+ events.push({ sessionId, runId, event });
7329
+ if (events.length > 500) events.splice(0, events.length - 500);
7330
+ void flushEvents();
7331
+ },
7332
+ get busy() {
7333
+ return running;
7334
+ },
7335
+ stop: () => {
7336
+ closed = true;
7337
+ if (timer) clearInterval(timer);
7338
+ }
7339
+ };
7340
+ }
7341
+
7010
7342
  function daemonExitCode(source) {
7011
7343
  return source === "exception" ? 1 : 0;
7012
7344
  }
@@ -7162,6 +7494,7 @@ async function startDaemon() {
7162
7494
  logger.debug("[DAEMON RUN] Auth and machine setup complete");
7163
7495
  const pidToTrackedSession = /* @__PURE__ */ new Map();
7164
7496
  const turnActivity = new TurnActivityTracker();
7497
+ turnActivity.onEvent((sessionId, event) => issueWorker?.report(sessionId, event === "turn_started" ? "running" : "idle"));
7165
7498
  const backgroundTasks = new BackgroundTaskTracker();
7166
7499
  const peerCoordinator = createPeerCoordinator({ getChildren: () => Array.from(pidToTrackedSession.values()) });
7167
7500
  const hibernationAutomations = createAutomationsClient({ serverUrl: configuration.serverUrl, token: credentials.token, client: "daemon-hibernate" });
@@ -7197,6 +7530,7 @@ async function startDaemon() {
7197
7530
  let autoRestart;
7198
7531
  let bundleReplacedSeen = false;
7199
7532
  let automationRunner;
7533
+ let issueWorker;
7200
7534
  let projectPresence;
7201
7535
  const persisted = readPersistedSessions();
7202
7536
  const liveHappyProcesses = await findAllHappyProcesses();
@@ -7718,7 +8052,7 @@ async function startDaemon() {
7718
8052
  happyProcess.on("exit", (code, signal) => {
7719
8053
  logger.debug(`[DAEMON RUN] Child PID ${happyProcess.pid} exited with code ${code}, signal ${signal}`);
7720
8054
  if (happyProcess.pid) {
7721
- onChildExited(happyProcess.pid);
8055
+ onChildExited(happyProcess.pid, { code, signal });
7722
8056
  }
7723
8057
  });
7724
8058
  happyProcess.on("error", (error) => {
@@ -8109,8 +8443,11 @@ async function startDaemon() {
8109
8443
  logger.debug(`[DAEMON RUN] Session ${sessionId} not found`);
8110
8444
  return false;
8111
8445
  };
8112
- const onChildExited = (pid) => {
8446
+ const onChildExited = (pid, exit) => {
8113
8447
  const session = pidToTrackedSession.get(pid);
8448
+ if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && issueWorker?.hasSession(session.happySessionId)) {
8449
+ issueWorker.report(session.happySessionId, daemonHibernation.pendingExit(session.happySessionId) ? "idle" : issueExitEvent(exit));
8450
+ }
8114
8451
  if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
8115
8452
  if (session?.happySessionId && automationRunner?.hasSession(session.happySessionId)) automationRunner.report(session.happySessionId, "exited");
8116
8453
  if (session?.happySessionId) turnActivity.forget(session.happySessionId);
@@ -8640,6 +8977,7 @@ async function startDaemon() {
8640
8977
  const sessionsHold = () => handoverWaitsForSessions({ bundleReplaced, relayMove: !!relayMove, sparesWrappers: handoverSparesWrappers }) && (turnActivity.hasActiveTurn() || backgroundTasks.hasAny());
8641
8978
  if ((bundleReplaced || relayMove) && !teamWorker?.busy && !automationRunner?.busy && !updateController.isRunning() && !harnessInstaller?.isRunning() && !sessionsHold()) {
8642
8979
  const preflight = bundleReplaced ? await preflightNewBundle(bundlePath) : { action: "proceed" };
8980
+ if (issueWorker?.busy) return;
8643
8981
  if (preflight.action === "hold") {
8644
8982
  if (lastHandoverHold !== preflight.reason) {
8645
8983
  lastHandoverHold = preflight.reason;
@@ -8653,6 +8991,7 @@ async function startDaemon() {
8653
8991
  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");
8654
8992
  teamWorker?.stop();
8655
8993
  automationRunner?.stop();
8994
+ issueWorker?.stop();
8656
8995
  projectPresence?.stop();
8657
8996
  clearInterval(restartOnStaleVersionAndHeartbeat);
8658
8997
  clearInterval(cliUpdateInterval);
@@ -8749,6 +9088,15 @@ async function startDaemon() {
8749
9088
  } : {},
8750
9089
  log: (message) => logger.debug(`[DAEMON RUN] ${message}`)
8751
9090
  });
9091
+ issueWorker = createIssueWorker({
9092
+ machineId,
9093
+ client: createIssuesClient({ token: async () => credentials.token }),
9094
+ spawn: spawnSession,
9095
+ live: (id) => [...pidToTrackedSession.values()].some((s) => s.happySessionId === id && isPidAlive(s.pid)),
9096
+ ...accountServiceRef ? { resolveAccount: (agent, requested) => accountServiceRef.resolveSpawnAccount(agent, requested) } : {},
9097
+ joinProject: (sessionId, projectId) => joinProject(projectsClient, sessionId, { kind: "explicit", projectId }, { via: "issue" }),
9098
+ log: (message) => logger.debug(`[DAEMON RUN] ${message}`)
9099
+ });
8752
9100
  projectPresence = createProjectPresenceReporter({
8753
9101
  machineId,
8754
9102
  client: projectsClient,
@@ -8782,6 +9130,7 @@ async function startDaemon() {
8782
9130
  const scrollbackFlush = apiMachine.flushTerminalScrollback();
8783
9131
  teamWorker?.stop();
8784
9132
  automationRunner?.stop({ killScripts: true });
9133
+ issueWorker?.stop();
8785
9134
  projectPresence?.stop();
8786
9135
  currentWorktreeService()?.stopAll();
8787
9136
  if (restartOnStaleVersionAndHeartbeat) {