very-happy-cli 0.2.199 → 0.2.201

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/dist/{AcpBackend-Bo6bOamG.mjs → AcpBackend-BNinFMHZ.mjs} +3 -3
  2. package/dist/{AcpBackend-HhZ8nrIh.cjs → AcpBackend-CMFlng3C.cjs} +3 -3
  3. package/dist/{AcpSessionManager--7nDgA9S.cjs → AcpSessionManager-CPgoICjp.cjs} +2 -2
  4. package/dist/{AcpSessionManager-C-pkJKO2.mjs → AcpSessionManager-Dg6gKavf.mjs} +2 -2
  5. package/dist/{BasePermissionHandler-Ffp54Ntg.mjs → BasePermissionHandler-DwcfWUjr.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-al7UXWRq.cjs → BasePermissionHandler-c-NaRa_E.cjs} +1 -1
  7. package/dist/{account-DCIz-iyL.cjs → account-D23SGj7p.cjs} +11 -11
  8. package/dist/{account-Bnk1yyGS.mjs → account-pzgzyIXW.mjs} +11 -11
  9. package/dist/{accountService-B59oKwa4.cjs → accountService-Cns8UYGI.cjs} +4 -4
  10. package/dist/{accountService-WPnOpkvs.mjs → accountService-DEpIq6CF.mjs} +4 -4
  11. package/dist/{acpSessionResume-CfogEHtT.cjs → acpSessionResume-DklOhwir.cjs} +1 -1
  12. package/dist/{acpSessionResume-BVroOlVN.mjs → acpSessionResume-urFpnGsk.mjs} +1 -1
  13. package/dist/{agentHome-Y3bMEtCp.cjs → agentHome-BTwMaYw1.cjs} +4 -4
  14. package/dist/{agentHome-CHTzSiu4.mjs → agentHome-DyrLqr8b.mjs} +4 -4
  15. package/dist/{api-DibgCucH.mjs → api-1CD4oRSW.mjs} +16 -10
  16. package/dist/{api-CgzfmyYS.cjs → api-KVVs-GkM.cjs} +16 -10
  17. package/dist/{apiMachine-DSI5mKlh.cjs → apiMachine-1sd5IVIB.cjs} +18 -18
  18. package/dist/{apiMachine-BUaFSi27.mjs → apiMachine-BDVE6MOn.mjs} +18 -18
  19. package/dist/{attachmentContent-D9wq3bok.mjs → attachmentContent-CeF54XeO.mjs} +2 -2
  20. package/dist/{attachmentContent-JWUS5uhH.cjs → attachmentContent-f3BbOKqz.cjs} +2 -2
  21. package/dist/{auth-DFMJQDNF.mjs → auth-CV2H-smf.mjs} +8 -8
  22. package/dist/{auth-B6H2wHTy.cjs → auth-CXCX-iJ-.cjs} +5 -5
  23. package/dist/{auth-BjWk9sHU.mjs → auth-WCd2S1zA.mjs} +5 -5
  24. package/dist/{auth-BXav16o0.cjs → auth-eielZ6Sc.cjs} +8 -8
  25. package/dist/{auto-CMO-VQYN.cjs → auto-49cRCADN.cjs} +17 -17
  26. package/dist/{auto-DOhQ2OU5.mjs → auto-BsCE_UHT.mjs} +17 -17
  27. package/dist/{bootstrap-CY7Db_VV.mjs → bootstrap-D_1MskAl.mjs} +2 -2
  28. package/dist/{bootstrap-Brd_jnA2.cjs → bootstrap-N1PY4ypX.cjs} +2 -2
  29. package/dist/{browser-BhncBLE4.cjs → browser-B0SEB6r3.cjs} +1 -1
  30. package/dist/{browser-BpwBEJDU.mjs → browser-DL3QIQLS.mjs} +1 -1
  31. package/dist/{claudeAccountEnv-z_ecsJAP.cjs → claudeAccountEnv-Btp39mfa.cjs} +1 -1
  32. package/dist/{claudeAccountEnv-CYwfvK1u.mjs → claudeAccountEnv-DowsOlDB.mjs} +1 -1
  33. package/dist/{claudeLocal-coKrsYmR.mjs → claudeLocal-DRMWkdCC.mjs} +5 -5
  34. package/dist/{claudeLocal-Co_DyW-D.cjs → claudeLocal-Ix69XJ1t.cjs} +5 -5
  35. package/dist/{claudeLocalLauncher-BFnLc0R-.mjs → claudeLocalLauncher-D4tU6R5n.mjs} +10 -10
  36. package/dist/{claudeLocalLauncher-CNDrO3b6.cjs → claudeLocalLauncher-rDojqNoa.cjs} +10 -10
  37. package/dist/{claudeSessionFork-BuDN5SkN.cjs → claudeSessionFork-C_X08LFh.cjs} +1 -1
  38. package/dist/{claudeSessionFork-dOOc9hpA.mjs → claudeSessionFork-H0ZVQALg.mjs} +1 -1
  39. package/dist/{client-B5uvkdLn.mjs → client-4YWjreN3.mjs} +2 -2
  40. package/dist/{client-DKPLBLvx.mjs → client-BgInTvr6.mjs} +2 -2
  41. package/dist/{client-KbhVRYjy.cjs → client-BoymtYLP.cjs} +2 -2
  42. package/dist/{client-Ng-oAhlX.mjs → client-CK-jvgM1.mjs} +4 -4
  43. package/dist/client-CMUlpYcy.mjs +114 -0
  44. package/dist/{client-CBbUzTcm.cjs → client-DGqnrSg4.cjs} +4 -4
  45. package/dist/client-DI8Rxsbw.cjs +120 -0
  46. package/dist/{client-BKyTA9Hf.cjs → client-P1VkI76z.cjs} +2 -2
  47. package/dist/codex/happyMcpStdioBridge.cjs +25 -16
  48. package/dist/codex/happyMcpStdioBridge.mjs +25 -16
  49. package/dist/{codexAccount-DeFAjaHW.mjs → codexAccount-CieIQLOX.mjs} +1 -1
  50. package/dist/{codexAccount-8Wv5enLR.cjs → codexAccount-D-OBY29W.cjs} +1 -1
  51. package/dist/{codexAppServerClient-6QmZ2Tn5.cjs → codexAppServerClient-BnMR-DRn.cjs} +3 -3
  52. package/dist/{codexAppServerClient-BAcU_XN8.mjs → codexAppServerClient-aDrsSyjS.mjs} +3 -3
  53. package/dist/{codexCommand-CCeaWZ-1.mjs → codexCommand-BCpJzf3q.mjs} +51 -46
  54. package/dist/{codexCommand-hJYa82Af.cjs → codexCommand-C3oEEpOa.cjs} +51 -46
  55. package/dist/{codexTermination-BX0sCNFy.mjs → codexTermination-B5haG5wJ.mjs} +1 -1
  56. package/dist/{codexTermination-DKjQcC3e.cjs → codexTermination-DXhw5Pzi.cjs} +1 -1
  57. package/dist/{config-171VOPLq.cjs → config-CdGiZZKy.cjs} +3 -3
  58. package/dist/{config-9iXYh_zS.mjs → config-D9wjo4oa.mjs} +3 -3
  59. package/dist/{configuration-D9k5yIzV.mjs → configuration-DhEqAYzz.mjs} +1 -1
  60. package/dist/{configuration-CAzuk0Xs.cjs → configuration-LWFmTxty.cjs} +1 -1
  61. package/dist/{connect-MlXU2FE3.cjs → connect-BZLD0aVm.cjs} +13 -13
  62. package/dist/{connect-BEhKtsEn.mjs → connect-CY_EMXQs.mjs} +13 -13
  63. package/dist/{context-CI9LnDu1.cjs → context-BbZ18lX0.cjs} +1 -1
  64. package/dist/{context-WVEuAdf2.mjs → context-UzqWaA7f.mjs} +1 -1
  65. package/dist/{controlClient-DhFAPGHz.mjs → controlClient-PaIiDxM6.mjs} +3 -3
  66. package/dist/{controlClient-Bb188cU0.cjs → controlClient-TVMpETsR.cjs} +3 -3
  67. package/dist/{createSessionMetadata-BIK0Xz31.mjs → createSessionMetadata-BWb81WZg.mjs} +3 -2
  68. package/dist/{createSessionMetadata-C2EQi_od.cjs → createSessionMetadata-hGZeo_nR.cjs} +3 -2
  69. package/dist/{daemonAccounts-DD5YBwku.mjs → daemonAccounts-D5shoCLt.mjs} +3 -3
  70. package/dist/{daemonAccounts-nLyHz8WB.cjs → daemonAccounts-ciidbU2h.cjs} +2 -2
  71. package/dist/{defaultPermissionMode-BA1fgIpW.cjs → defaultPermissionMode-Cs_Tv83b.cjs} +1 -1
  72. package/dist/{defaultPermissionMode-Dmw3lpdN.mjs → defaultPermissionMode-DgeiMMqy.mjs} +1 -1
  73. package/dist/{deterministicJson-DCzFgRiT.cjs → deterministicJson-BpDDS7c9.cjs} +121 -24
  74. package/dist/{deterministicJson-BJ7LY5-S.mjs → deterministicJson-Cg3z7uUX.mjs} +117 -20
  75. package/dist/{doctor-jAPeyoi6.mjs → doctor-BanQ3jQg.mjs} +7 -7
  76. package/dist/{doctor-CH_pTY3Q.cjs → doctor-DOzji0f7.cjs} +7 -7
  77. package/dist/{downloadTarget-BhMm1keb.mjs → downloadTarget-BCSXmPRE.mjs} +6 -6
  78. package/dist/{downloadTarget-CZS0BVu2.cjs → downloadTarget-BhIAhyEV.cjs} +6 -6
  79. package/dist/{ensureDaemonRunning-BjbC8PuJ.mjs → ensureDaemonRunning-BZGBE838.mjs} +5 -5
  80. package/dist/{ensureDaemonRunning-CTKaWMED.cjs → ensureDaemonRunning-DMOCzvQP.cjs} +5 -5
  81. package/dist/format-BxGkJUki.mjs +71 -0
  82. package/dist/format-CgiY6uup.cjs +75 -0
  83. package/dist/{handleResumeCommand-DbFTdwoc.mjs → handleResumeCommand-BRV-9h0o.mjs} +5 -5
  84. package/dist/{handleResumeCommand-DsaEUiax.cjs → handleResumeCommand-ChnR-12l.cjs} +5 -5
  85. package/dist/{index-BnT8yvlF.cjs → index-44o_qMvE.cjs} +72 -3
  86. package/dist/{index-DuoMPw0y.cjs → index-B7HlUXOX.cjs} +4 -4
  87. package/dist/{index-qVJYCmRA.cjs → index-BuOzDU17.cjs} +4 -4
  88. package/dist/{index-DcfbjaVL.mjs → index-C_Y9426m.mjs} +3 -3
  89. package/dist/{index-BQvPYTNM.mjs → index-CiRMvS73.mjs} +59 -4
  90. package/dist/{index-BEKb2cxz.mjs → index-D5abHQNL.mjs} +48 -43
  91. package/dist/{index-DL6ONx6v.cjs → index-DnEgpRo4.cjs} +3 -3
  92. package/dist/{index-DpQ9OLYi.mjs → index-Do1r62PF.mjs} +4 -4
  93. package/dist/{index-DdJRSpLB.cjs → index-DuOthh8V.cjs} +47 -42
  94. package/dist/{index-BAjoMeJi.mjs → index-HJFzeG0B.mjs} +4 -4
  95. package/dist/index.cjs +2 -2
  96. package/dist/index.mjs +2 -2
  97. package/dist/{install-CJcRTQVK.mjs → install-BurTXawL.mjs} +3 -3
  98. package/dist/{install-5nblS8vW.cjs → install-CUAUG3u4.cjs} +3 -3
  99. package/dist/issue-DpMsnOFm.mjs +229 -0
  100. package/dist/issue-feEUrjV0.cjs +237 -0
  101. package/dist/lib.cjs +12 -12
  102. package/dist/lib.d.cts +7 -0
  103. package/dist/lib.d.mts +7 -0
  104. package/dist/lib.mjs +12 -12
  105. package/dist/{localHappyAgentAuth-Bsk_VyUN.cjs → localHappyAgentAuth-DxlQgaer.cjs} +1 -1
  106. package/dist/{localHappyAgentAuth-CD896cy4.mjs → localHappyAgentAuth-kg2RFvOy.mjs} +1 -1
  107. package/dist/{logger-n9NOzHhK.mjs → logger-CFrzcRHD.mjs} +17 -3
  108. package/dist/{logger-LsJ3Cl5o.cjs → logger-Hyhy2boA.cjs} +17 -2
  109. package/dist/{machineMetadata-CUU2NSYl.cjs → machineMetadata-BLymhM03.cjs} +3 -3
  110. package/dist/{machineMetadata-Bc7FwngX.mjs → machineMetadata-DiStbYik.mjs} +3 -3
  111. package/dist/{main-CEu9zJ4x.cjs → main-7G17Noc3.cjs} +58 -48
  112. package/dist/{main-CzItRviV.mjs → main-D1rk-68I.mjs} +58 -48
  113. package/dist/{mcp-yK3ynz_E.mjs → mcp-C0DMPeTt.mjs} +18 -18
  114. package/dist/{mcp-CPW1yQdX.cjs → mcp-DUeAS-D6.cjs} +18 -18
  115. package/dist/{mirrorProtocol-5bgkr1Or.cjs → mirrorProtocol-YUoEuIYO.cjs} +3 -3
  116. package/dist/{mirrorProtocol-CoXxepvL.mjs → mirrorProtocol-dRyartIG.mjs} +3 -3
  117. package/dist/{package-D7V1BX2I.cjs → package-06cGlmeD.cjs} +7 -7
  118. package/dist/{package-CCF6FHr2.mjs → package-DxE8PttX.mjs} +7 -7
  119. package/dist/{panels-CF5n641F.mjs → panels-BUqmsRE0.mjs} +5 -5
  120. package/dist/{panels-9DdVhaxc.cjs → panels-D0GHfIJC.cjs} +5 -5
  121. package/dist/{peerTools-gR_3dwdA.mjs → peerTools-BiFpxXdf.mjs} +5 -5
  122. package/dist/{peerTools-Dv6bgHkW.cjs → peerTools-CTCyRdg2.cjs} +5 -5
  123. package/dist/{persistence-B5U9rC15.mjs → persistence-CF7oV1oH.mjs} +2 -2
  124. package/dist/{persistence-Dl3sBrCF.cjs → persistence-_W9tE-bW.cjs} +2 -2
  125. package/dist/{piRunnerArgs-DOV74xAt.mjs → piRunnerArgs-Cfc-F-FJ.mjs} +1 -1
  126. package/dist/{piRunnerArgs-rygeUdRz.cjs → piRunnerArgs-T2cAiaGW.cjs} +1 -1
  127. package/dist/{piRuntime-BvxCy9qQ.cjs → piRuntime-BzECTca4.cjs} +1 -1
  128. package/dist/{piRuntime-dtlRpOYa.mjs → piRuntime-CzYkZrYV.mjs} +1 -1
  129. package/dist/{piTerminal-Bx6c5Jyd.mjs → piTerminal-0tOAYsFm.mjs} +20 -20
  130. package/dist/{piTerminal-ClaMS-57.cjs → piTerminal-WF--dHaC.cjs} +20 -20
  131. package/dist/{pushNotifications-pHkbUkqT.mjs → pushNotifications-CxX10K6n.mjs} +3 -3
  132. package/dist/{pushNotifications-IZaTtVDG.cjs → pushNotifications-DdzTbrA3.cjs} +3 -3
  133. package/dist/{query-D_3rFFWe.mjs → query-Bkh7d52V.mjs} +1 -1
  134. package/dist/{query-BVqnfxlX.cjs → query-Cwx4pv91.cjs} +1 -1
  135. package/dist/{rateLimitWindows-DnLJ-gve.mjs → rateLimitWindows-DdUMUEoy.mjs} +1 -1
  136. package/dist/{rateLimitWindows-C7xi99Eb.cjs → rateLimitWindows-DjJjgjt4.cjs} +1 -1
  137. package/dist/{reconnectGate-CHI12y0Y.cjs → reconnectGate-DeDhtQJW.cjs} +1 -1
  138. package/dist/{reconnectGate-DPDXEkOX.mjs → reconnectGate-uTLj82tS.mjs} +1 -1
  139. package/dist/{registerCommonHandlers-BrTglZnC.mjs → registerCommonHandlers-BYrmi-A4.mjs} +2 -2
  140. package/dist/{registerCommonHandlers-CUCw-rad.cjs → registerCommonHandlers-BrEtSwNk.cjs} +2 -2
  141. package/dist/{registerKillSessionHandler-Bo697Mt0.cjs → registerKillSessionHandler-Bp3g11wW.cjs} +6 -6
  142. package/dist/{registerKillSessionHandler-BJSVT1iq.mjs → registerKillSessionHandler-Cuzq6ecP.mjs} +6 -6
  143. package/dist/{registerSideQuestionHandler-BFPCMrmC.mjs → registerSideQuestionHandler-BmEWWaZW.mjs} +4 -4
  144. package/dist/{registerSideQuestionHandler-HNpsU_20.cjs → registerSideQuestionHandler-ChIbHl_g.cjs} +4 -4
  145. package/dist/{remoteSessionClient-Blz-z9jM.mjs → remoteSessionClient-Dj2rV8Az.mjs} +5 -5
  146. package/dist/{remoteSessionClient-9NzkfL13.cjs → remoteSessionClient-DoxfnpnK.cjs} +5 -5
  147. package/dist/{reportProgressTool-CW9rSnwQ.cjs → reportProgressTool-DvZhaEiN.cjs} +113 -3
  148. package/dist/{reportProgressTool-B2-RFomn.mjs → reportProgressTool-qo0QIFNd.mjs} +111 -4
  149. package/dist/{run-9aB7U4BF.cjs → run-BqlWdDTL.cjs} +447 -50
  150. package/dist/{run-BXyfDvCk.mjs → run-mHeOSOEt.mjs} +447 -50
  151. package/dist/{runClaude-B4ohp5Dk.cjs → runClaude-MjIrNrxT.cjs} +28 -25
  152. package/dist/{runClaude-BKpWJdCX.mjs → runClaude-Z4BVFEdC.mjs} +28 -25
  153. package/dist/{runClaudeDeps-B0x5BCqC.mjs → runClaudeDeps-8RXtu0Zc.mjs} +49 -46
  154. package/dist/{runClaudeDeps-gqSYeQkl.cjs → runClaudeDeps-tPqwAl_m.cjs} +43 -40
  155. package/dist/{runGemini-BvV5k9b3.mjs → runGemini-DG3jIxWv.mjs} +36 -33
  156. package/dist/{runGemini-BMzDy7hY.cjs → runGemini-uc-fViXY.cjs} +36 -33
  157. package/dist/{runOpenClaw-UcIDMHm7.mjs → runOpenClaw-C4676Sdl.mjs} +18 -18
  158. package/dist/{runOpenClaw-3Cx3C2ww.cjs → runOpenClaw-DZtoCmSG.cjs} +18 -18
  159. package/dist/{sandbox-QJdxjmxr.cjs → sandbox-DS7uZ71y.cjs} +4 -4
  160. package/dist/{sandbox-BC-KbWe7.mjs → sandbox-r29ys6I4.mjs} +4 -4
  161. package/dist/selfCheck-BmT9ihpR.mjs +89 -0
  162. package/dist/{selfCheck-Be_M5coh.cjs → selfCheck-CSZ-wx1W.cjs} +40 -39
  163. package/dist/{send-x789D5ci.mjs → send-BGApHm-z.mjs} +8 -8
  164. package/dist/{send-DhWp8M8B.cjs → send-CrmLy9lW.cjs} +8 -8
  165. package/dist/{server-kPDtS-DX.cjs → server-CjwXsTKP.cjs} +6 -6
  166. package/dist/{server-D-aSnlWI.mjs → server-hutEAAn1.mjs} +4 -4
  167. package/dist/{sessionLock-JWBEd8g_.mjs → sessionLock-Dj9_lShU.mjs} +3 -3
  168. package/dist/{sessionLock-CuPN9xfW.cjs → sessionLock-unMOEniJ.cjs} +3 -3
  169. package/dist/sessionMetadata-B44cL4Xj.cjs +29 -0
  170. package/dist/sessionMetadata-C1eoAi89.mjs +25 -0
  171. package/dist/{sessionOps-VS1baPz_.mjs → sessionOps-BmhqmPPd.mjs} +4 -4
  172. package/dist/{sessionOps-CYNOycqT.cjs → sessionOps-SxZr9veq.cjs} +4 -4
  173. package/dist/{sessionProvider-iRLKuR9V.mjs → sessionProvider-CPlvR0nT.mjs} +10 -10
  174. package/dist/{sessionProvider-DksA6icp.cjs → sessionProvider-DLlqS4y6.cjs} +10 -10
  175. package/dist/{sessionScanner--X2Pzlra.cjs → sessionScanner-B7nZ1i40.cjs} +3 -3
  176. package/dist/{sessionScanner-CAxiFc_3.mjs → sessionScanner-DvVZpLHG.mjs} +3 -3
  177. package/dist/{sessions-Dca1UgiF.mjs → sessions-BIYm43CM.mjs} +10 -10
  178. package/dist/{sessions-BrnP53eO.cjs → sessions-CQQW7u6X.cjs} +10 -10
  179. package/dist/{setupOfflineReconnection-nguxOn4s.mjs → setupOfflineReconnection-BELrtMGG.mjs} +2 -2
  180. package/dist/{setupOfflineReconnection-Dwg6nHnP.cjs → setupOfflineReconnection-D7WJTAi_.cjs} +2 -2
  181. package/dist/{spawn-DDyMxQ7Z.cjs → spawn-CuWcPkkN.cjs} +14 -14
  182. package/dist/{spawn-BJMU9zbZ.mjs → spawn-DnPu7h2o.mjs} +14 -14
  183. package/dist/{spawnAgents-SeUX5gIq.mjs → spawnAgents-BclZYkov.mjs} +1 -1
  184. package/dist/{spawnAgents-B8GT4JQX.cjs → spawnAgents-DvbEDCIq.cjs} +1 -1
  185. package/dist/{spawnHappyCLI-Cvk2ZMYj.cjs → spawnHappyCLI-CI7Ax4mF.cjs} +1 -1
  186. package/dist/{spawnHappyCLI-DnT_QEdn.mjs → spawnHappyCLI-D6OcgFDR.mjs} +1 -1
  187. package/dist/{startFileWatcher-Djf0SdmK.mjs → startFileWatcher-BiWGhlGW.mjs} +1 -1
  188. package/dist/{startFileWatcher-DLfkP-IW.cjs → startFileWatcher-DBW14aP2.cjs} +1 -1
  189. package/dist/{startupSessionCreate-CxwJb5m9.cjs → startupSessionCreate-DFl54ozj.cjs} +3 -3
  190. package/dist/{startupSessionCreate-f1g6pp6E.mjs → startupSessionCreate-DbBpGQo9.mjs} +3 -3
  191. package/dist/{store-D41VdZcL.cjs → store-Cpb1LMNW.cjs} +1 -1
  192. package/dist/{store-DnaIrYLA.mjs → store-DWmjM4Ex.mjs} +1 -1
  193. package/dist/{streamRelay-BT9ew0Mk.cjs → streamRelay-4XiiNB3N.cjs} +1 -1
  194. package/dist/{streamRelay-DEBIU6Ak.mjs → streamRelay-DdGOsW8v.mjs} +1 -1
  195. package/dist/{sync-B-B5mc8Z.cjs → sync-C764ZzE6.cjs} +1 -1
  196. package/dist/{sync-Dfr1zgLx.mjs → sync-CcBrziWp.mjs} +1 -1
  197. package/dist/{systemPrompt-DAQq-bKB.mjs → systemPrompt-9i7bQypR.mjs} +2 -2
  198. package/dist/{systemPrompt-pxNDR5u8.cjs → systemPrompt-Xy3Dfj1l.cjs} +2 -2
  199. package/dist/{teams-BuXDbvzq.mjs → teams-BAWOVbdF.mjs} +7 -7
  200. package/dist/{teams-CBMB5SvT.cjs → teams-VlmzLDSs.cjs} +7 -7
  201. package/dist/{template-CB4gXtUX.cjs → template-3fV9bi0X.cjs} +1 -1
  202. package/dist/{template-DE9JMShn.mjs → template-CtRLg2PG.mjs} +1 -1
  203. package/dist/{time-DTaj0RVK.cjs → time-CDBZWYDb.cjs} +1 -1
  204. package/dist/{time-PqfO1O58.mjs → time-DJF2csbV.mjs} +1 -1
  205. package/dist/{titleGenerator-BP5gqicG.cjs → titleGenerator-BYP3fNFo.cjs} +3 -3
  206. package/dist/{titleGenerator-DVnEGxoB.mjs → titleGenerator-DR9evHBh.mjs} +2 -2
  207. package/dist/todo-BkFvwx_z.cjs +210 -0
  208. package/dist/{todo-DaJPxDVT.mjs → todo-DDDQdB-G.mjs} +103 -12
  209. package/dist/{tools-G3_fMSjb.cjs → tools-BjiRW_Rg.cjs} +1 -1
  210. package/dist/{tools-B4W8kWU8.mjs → tools-CDktvjWL.mjs} +1 -1
  211. package/dist/{uninstall-ByWgUWHg.mjs → uninstall-BcMGkwJ0.mjs} +3 -3
  212. package/dist/{uninstall-C0pua8G4.cjs → uninstall-D5INt3TC.cjs} +3 -3
  213. package/dist/{wrapperAccount-CsxMfnCK.cjs → wrapperAccount-nGGMJDBF.cjs} +2 -2
  214. package/dist/{wrapperAccount-BDeMsgbw.mjs → wrapperAccount-z8Swrd08.mjs} +2 -2
  215. package/package.json +7 -7
  216. package/dist/selfCheck-NWjxjpSx.mjs +0 -88
  217. package/dist/todo-BXsQ5-iD.cjs +0 -119
@@ -0,0 +1,71 @@
1
+ import { I as IssuesUnsupportedError, a as IssueRequestError } from './client-CMUlpYcy.mjs';
2
+
3
+ const MESSAGES = {
4
+ issue_status_forbidden: "Agents may only set in_progress, in_review or blocked. Only the owner sets done or cancelled; move it to in_review with a summary instead.",
5
+ issue_closed: "This issue is closed (done or cancelled). Its status cannot be changed by an agent; you can still comment.",
6
+ issue_comment_required: "in_review and blocked need a comment: say what you delivered and how it was verified, or exactly what you need.",
7
+ issue_not_bound: "This session is not working on an issue (it was not started from one).",
8
+ issue_run_not_current: "This issue has moved to a newer run; stop changing it.",
9
+ issue_comment_quota_exceeded: "Too many issue comments from this run in the last hour; wait before commenting again.",
10
+ issue_not_found: "No such issue (it may have been deleted).",
11
+ issue_todo_deleted: "This todo id belongs to a deleted todo and cannot be reused; add with a new UUID.",
12
+ issue_version_conflict: "The issue changed since you read it; read it again before deciding what to change.",
13
+ issue_assignee_unsupported: "That assignee is not supported.",
14
+ issue_agent_unsupported: "That agent cannot be assigned an issue (Claude, Codex or pi only).",
15
+ issue_no_directory: "No folder for this agent on that machine: pass a directory or put the issue in a project with a folder there.",
16
+ issue_machine_not_found: "No such machine on this account.",
17
+ issue_project_not_found: "No such project.",
18
+ issue_parent_cycle: "That parent would create a cycle.",
19
+ issue_count_quota_exceeded: "This account has reached the issue limit.",
20
+ transaction_conflict: "The server was busy; retry.",
21
+ rate_limited: "Rate limited; retry later.",
22
+ not_signed_in: "Sign in to Very Happy with `very-happy auth login` first."
23
+ };
24
+ const ISSUES_UNSUPPORTED_TEXT = "issues_unsupported: This Very Happy server does not support Issues (or they are turned off).";
25
+ function describeIssueError(error) {
26
+ if (error instanceof IssuesUnsupportedError) return ISSUES_UNSUPPORTED_TEXT;
27
+ if (error instanceof IssueRequestError) {
28
+ const code = error.code ?? (error.status === 429 ? "rate_limited" : null);
29
+ if (code) {
30
+ const server = typeof error.details.message === "string" ? error.details.message : null;
31
+ return `${code}: ${server ?? MESSAGES[code] ?? "Issue request failed."}`;
32
+ }
33
+ return `Issue request failed (HTTP ${error.status})`;
34
+ }
35
+ return error instanceof Error && error.message ? error.message : "Issue request failed";
36
+ }
37
+ function assigneeLabel(issue) {
38
+ const a = issue.assignee;
39
+ if (a.kind === "agent") return `${a.agent ?? "agent"}@${(a.machineId ?? "").slice(0, 8)}`;
40
+ return a.kind;
41
+ }
42
+ function when(ms) {
43
+ return ms ? new Date(ms).toISOString().replace("T", " ").slice(0, 16) + "Z" : "";
44
+ }
45
+ function formatIssueLine(issue) {
46
+ const extra = [issue.priority !== "none" ? issue.priority : null, issue.labels.length ? issue.labels.join(",") : null].filter(Boolean).join(" \xB7 ");
47
+ return `${issue.key} [${issue.status}] ${issue.title} (${assigneeLabel(issue)}${extra ? ` \xB7 ${extra}` : ""})`;
48
+ }
49
+ function commentLine(c) {
50
+ const who = c.author.kind === "agent" ? "agent" : c.author.kind === "user" ? "owner" : c.author.kind;
51
+ const body = c.kind === "comment" ? c.body : `(${c.kind}) ${c.body}`;
52
+ return `- ${when(c.createdAt)} [${who}] ${body.replace(/\s+/g, " ").slice(0, 600)}`;
53
+ }
54
+ function runLine(r) {
55
+ return `- run #${r.seq} ${r.trigger} \xB7 ${r.agent} \xB7 ${r.status}${r.sessionId ? ` \xB7 session ${r.sessionId}` : ""}${r.error ? ` \xB7 ${r.error.slice(0, 200)}` : ""}`;
56
+ }
57
+ function formatIssueDetail(input) {
58
+ const { issue } = input;
59
+ const meta = [`status: ${issue.status}`, `priority: ${issue.priority}`, `assignee: ${assigneeLabel(issue)}`];
60
+ if (issue.labels.length) meta.push(`labels: ${issue.labels.join(", ")}`);
61
+ if (issue.dueAt) meta.push(`due: ${new Date(issue.dueAt).toISOString().slice(0, 10)}`);
62
+ const lines = [`${issue.key}: ${issue.title}`, meta.join(" \xB7 ")];
63
+ if (input.bound) lines.push(input.current ? "This session is the issue's current run (issue_update / issue_comment allowed)." : "This session's run is no longer current: do not change this issue.");
64
+ lines.push("", issue.description.trim() || "(no description)");
65
+ const comments = input.comments.slice(-10);
66
+ if (comments.length) lines.push("", "Timeline (oldest first):", ...comments.map(commentLine));
67
+ if (input.runs?.length) lines.push("", "Runs:", ...input.runs.map(runLine));
68
+ return lines.join("\n");
69
+ }
70
+
71
+ export { formatIssueDetail as a, describeIssueError as d, formatIssueLine as f };
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ var client = require('./client-DI8Rxsbw.cjs');
4
+
5
+ const MESSAGES = {
6
+ issue_status_forbidden: "Agents may only set in_progress, in_review or blocked. Only the owner sets done or cancelled; move it to in_review with a summary instead.",
7
+ issue_closed: "This issue is closed (done or cancelled). Its status cannot be changed by an agent; you can still comment.",
8
+ issue_comment_required: "in_review and blocked need a comment: say what you delivered and how it was verified, or exactly what you need.",
9
+ issue_not_bound: "This session is not working on an issue (it was not started from one).",
10
+ issue_run_not_current: "This issue has moved to a newer run; stop changing it.",
11
+ issue_comment_quota_exceeded: "Too many issue comments from this run in the last hour; wait before commenting again.",
12
+ issue_not_found: "No such issue (it may have been deleted).",
13
+ issue_todo_deleted: "This todo id belongs to a deleted todo and cannot be reused; add with a new UUID.",
14
+ issue_version_conflict: "The issue changed since you read it; read it again before deciding what to change.",
15
+ issue_assignee_unsupported: "That assignee is not supported.",
16
+ issue_agent_unsupported: "That agent cannot be assigned an issue (Claude, Codex or pi only).",
17
+ issue_no_directory: "No folder for this agent on that machine: pass a directory or put the issue in a project with a folder there.",
18
+ issue_machine_not_found: "No such machine on this account.",
19
+ issue_project_not_found: "No such project.",
20
+ issue_parent_cycle: "That parent would create a cycle.",
21
+ issue_count_quota_exceeded: "This account has reached the issue limit.",
22
+ transaction_conflict: "The server was busy; retry.",
23
+ rate_limited: "Rate limited; retry later.",
24
+ not_signed_in: "Sign in to Very Happy with `very-happy auth login` first."
25
+ };
26
+ const ISSUES_UNSUPPORTED_TEXT = "issues_unsupported: This Very Happy server does not support Issues (or they are turned off).";
27
+ function describeIssueError(error) {
28
+ if (error instanceof client.IssuesUnsupportedError) return ISSUES_UNSUPPORTED_TEXT;
29
+ if (error instanceof client.IssueRequestError) {
30
+ const code = error.code ?? (error.status === 429 ? "rate_limited" : null);
31
+ if (code) {
32
+ const server = typeof error.details.message === "string" ? error.details.message : null;
33
+ return `${code}: ${server ?? MESSAGES[code] ?? "Issue request failed."}`;
34
+ }
35
+ return `Issue request failed (HTTP ${error.status})`;
36
+ }
37
+ return error instanceof Error && error.message ? error.message : "Issue request failed";
38
+ }
39
+ function assigneeLabel(issue) {
40
+ const a = issue.assignee;
41
+ if (a.kind === "agent") return `${a.agent ?? "agent"}@${(a.machineId ?? "").slice(0, 8)}`;
42
+ return a.kind;
43
+ }
44
+ function when(ms) {
45
+ return ms ? new Date(ms).toISOString().replace("T", " ").slice(0, 16) + "Z" : "";
46
+ }
47
+ function formatIssueLine(issue) {
48
+ const extra = [issue.priority !== "none" ? issue.priority : null, issue.labels.length ? issue.labels.join(",") : null].filter(Boolean).join(" \xB7 ");
49
+ return `${issue.key} [${issue.status}] ${issue.title} (${assigneeLabel(issue)}${extra ? ` \xB7 ${extra}` : ""})`;
50
+ }
51
+ function commentLine(c) {
52
+ const who = c.author.kind === "agent" ? "agent" : c.author.kind === "user" ? "owner" : c.author.kind;
53
+ const body = c.kind === "comment" ? c.body : `(${c.kind}) ${c.body}`;
54
+ return `- ${when(c.createdAt)} [${who}] ${body.replace(/\s+/g, " ").slice(0, 600)}`;
55
+ }
56
+ function runLine(r) {
57
+ return `- run #${r.seq} ${r.trigger} \xB7 ${r.agent} \xB7 ${r.status}${r.sessionId ? ` \xB7 session ${r.sessionId}` : ""}${r.error ? ` \xB7 ${r.error.slice(0, 200)}` : ""}`;
58
+ }
59
+ function formatIssueDetail(input) {
60
+ const { issue } = input;
61
+ const meta = [`status: ${issue.status}`, `priority: ${issue.priority}`, `assignee: ${assigneeLabel(issue)}`];
62
+ if (issue.labels.length) meta.push(`labels: ${issue.labels.join(", ")}`);
63
+ if (issue.dueAt) meta.push(`due: ${new Date(issue.dueAt).toISOString().slice(0, 10)}`);
64
+ const lines = [`${issue.key}: ${issue.title}`, meta.join(" \xB7 ")];
65
+ if (input.bound) lines.push(input.current ? "This session is the issue's current run (issue_update / issue_comment allowed)." : "This session's run is no longer current: do not change this issue.");
66
+ lines.push("", issue.description.trim() || "(no description)");
67
+ const comments = input.comments.slice(-10);
68
+ if (comments.length) lines.push("", "Timeline (oldest first):", ...comments.map(commentLine));
69
+ if (input.runs?.length) lines.push("", "Runs:", ...input.runs.map(runLine));
70
+ return lines.join("\n");
71
+ }
72
+
73
+ exports.describeIssueError = describeIssueError;
74
+ exports.formatIssueDetail = formatIssueDetail;
75
+ exports.formatIssueLine = formatIssueLine;
@@ -1,22 +1,22 @@
1
1
  import { existsSync } from 'node:fs';
2
- import { s as spawnHappyCLI } from './spawnHappyCLI-DnT_QEdn.mjs';
2
+ import { s as spawnHappyCLI } from './spawnHappyCLI-D6OcgFDR.mjs';
3
3
  import axios, { AxiosError } from 'axios';
4
4
  import tweetnacl from 'tweetnacl';
5
5
  import { z } from 'zod';
6
6
  import { d as decodeBase64, a as decryptWithDataKey, b as decryptLegacy } from './authRelay-DhQhkBvX.mjs';
7
- import { c as configuration } from './configuration-D9k5yIzV.mjs';
8
- import { g as getLocalHappyAgentCredentialPath, r as readLocalHappyAgentCredentials } from './localHappyAgentAuth-CD896cy4.mjs';
7
+ import { c as configuration } from './configuration-DhEqAYzz.mjs';
8
+ import { g as getLocalHappyAgentCredentialPath, r as readLocalHappyAgentCredentials } from './localHappyAgentAuth-kg2RFvOy.mjs';
9
9
  import 'cross-spawn';
10
10
  import 'node:path';
11
11
  import './projectPath-BTBIMB57.mjs';
12
12
  import 'path';
13
13
  import 'url';
14
- import './logger-n9NOzHhK.mjs';
14
+ import './logger-CFrzcRHD.mjs';
15
15
  import 'chalk';
16
16
  import 'node:util';
17
17
  import 'node:crypto';
18
18
  import 'node:os';
19
- import './package-CCF6FHr2.mjs';
19
+ import './package-DxE8PttX.mjs';
20
20
  import 'node:fs/promises';
21
21
 
22
22
  const ResumableMetadataSchema = z.object({
@@ -1,24 +1,24 @@
1
1
  'use strict';
2
2
 
3
3
  var node_fs = require('node:fs');
4
- var spawnHappyCLI = require('./spawnHappyCLI-Cvk2ZMYj.cjs');
4
+ var spawnHappyCLI = require('./spawnHappyCLI-CI7Ax4mF.cjs');
5
5
  var axios = require('axios');
6
6
  var tweetnacl = require('tweetnacl');
7
7
  var z = require('zod');
8
8
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
9
- var configuration = require('./configuration-CAzuk0Xs.cjs');
10
- var localHappyAgentAuth = require('./localHappyAgentAuth-Bsk_VyUN.cjs');
9
+ var configuration = require('./configuration-LWFmTxty.cjs');
10
+ var localHappyAgentAuth = require('./localHappyAgentAuth-DxlQgaer.cjs');
11
11
  require('cross-spawn');
12
12
  require('node:path');
13
13
  require('./projectPath-C3ioB4Bu.cjs');
14
14
  require('path');
15
15
  require('url');
16
- require('./logger-LsJ3Cl5o.cjs');
16
+ require('./logger-Hyhy2boA.cjs');
17
17
  require('chalk');
18
18
  require('node:util');
19
19
  require('node:crypto');
20
20
  require('node:os');
21
- require('./package-D7V1BX2I.cjs');
21
+ require('./package-06cGlmeD.cjs');
22
22
  require('node:fs/promises');
23
23
 
24
24
  const ResumableMetadataSchema = z.z.object({
@@ -1238,7 +1238,7 @@ This skill operates the user's account-synced My todos. External providers and a
1238
1238
 
1239
1239
  Commands return JSON with serverUrl. A nonzero exit is an error; do not infer success from text generated by the agent.
1240
1240
 
1241
- - \`very-happy todo list\`: read tasks including their id and version. Respect truncated/invalidCount; a partial or invalid list is not a complete account inventory.
1241
+ - \`very-happy todo list\`: read open and completed tasks (status open/done) including their id and version. Respect truncated/invalidCount; a partial or invalid list is not a complete account inventory.
1242
1242
  - \`very-happy todo get ID\`: read the current task before editing or resolving a conflict.
1243
1243
  - \`very-happy todo add --id UUID --title "Task" --note "Optional note"\`: generate one fresh UUID for this intended creation and retain it until the outcome is known. For example, Node can generate it with \`node -e "console.log(require('node:crypto').randomUUID())"\`.
1244
1244
  - \`very-happy todo edit ID --version N --title "New title" --note "New note"\`: use the version you read; omit fields that should remain unchanged.
@@ -1253,9 +1253,13 @@ For add, retry with the same UUID and identical title/note after a timeout; do n
1253
1253
 
1254
1254
  For edit/status/delete, a conflict means the version changed. Read the task and compare the new state with the user's request before deciding what to do; never automatically overwrite with a freshly fetched version. A timeout may have committed: read to reconcile, then report the confirmed result. Do not claim a delete succeeded merely because a request was sent.
1255
1255
 
1256
+ ## Issues
1257
+
1258
+ On a server with Issues, My todos are issues without an assignee: the todo commands keep working on them (an ID may also be an issue key such as VH-12). Run \`very-happy issue --help\` for the full Issues interface (assign to an agent, comments). Without Issues the todo commands use the classic store; their output is the same.
1259
+
1256
1260
  Restricted team workers cannot use account-wide Todo credentials. Ask the user or supervising session to perform the account operation; do not clear scope variables or seek another credential to bypass that boundary.
1257
1261
  `;
1258
- const BUILTIN_TODO_DISCOVERY = "For the user\u2019s Very Happy My todos, run `very-happy todo skill` to read the official skill, then use its CLI commands. Do not confuse account todos with your execution plan; restricted team workers must not bypass their scope.";
1262
+ const BUILTIN_TODO_DISCOVERY = "For the user\u2019s Very Happy My todos (and Issues: `very-happy issue --help`), run `very-happy todo skill` to read the official skill, then use its CLI commands. Do not confuse account todos with your execution plan; restricted team workers must not bypass their scope.";
1259
1263
  z.z.object({
1260
1264
  source: z.z.literal("pi"),
1261
1265
  tokens: z.z.number().finite().nonnegative().nullable(),
@@ -1822,6 +1826,12 @@ function ownerBoardPostToRest(sessionId, input, anchor) {
1822
1826
  inferred: false
1823
1827
  };
1824
1828
  }
1829
+ const ISSUE_SESSION_CAPABILITY = "issue-v1";
1830
+ const ISSUES_DISABLED_ERROR = "issues_disabled";
1831
+ const ISSUE_WORKER_VERSION = 1;
1832
+ const ISSUE_KEY_PREFIX = "VH";
1833
+ const ISSUE_DISPATCH_LOCAL_ID_PREFIX = "issue-";
1834
+ const ISSUE_SENT_FROM = "issue";
1825
1835
  const ISSUE_LIMITS = {
1826
1836
  titleChars: 300,
1827
1837
  descriptionBytes: 32 * 1024,
@@ -1834,8 +1844,23 @@ const ISSUE_LIMITS = {
1834
1844
  const ISSUE_STATUSES = ["backlog", "todo", "in_progress", "in_review", "blocked", "done", "cancelled"];
1835
1845
  const ISSUE_PRIORITIES = ["urgent", "high", "medium", "low", "none"];
1836
1846
  const ISSUE_AGENT_STATUSES = ["in_progress", "in_review", "blocked"];
1847
+ const ISSUE_CLOSED_STATUSES = ["done", "cancelled"];
1837
1848
  const ISSUE_ASSIGNABLE_AGENTS = ["claude", "codex", "pi"];
1838
1849
  const ISSUE_ASSIGNEE_KINDS = ["none", "self", "agent", "team"];
1850
+ function isIssueClosed(status) {
1851
+ return ISSUE_CLOSED_STATUSES.includes(status);
1852
+ }
1853
+ const ISSUE_KEY_PATTERN = new RegExp(`^${ISSUE_KEY_PREFIX}-(\\d{1,9})$`, "i");
1854
+ const UUIDISH = /^[A-Za-z0-9_-]{8,128}$/;
1855
+ function parseIssueRef(input) {
1856
+ const value = input.trim();
1857
+ const key2 = ISSUE_KEY_PATTERN.exec(value) ?? /^#?(\d{1,9})$/.exec(value);
1858
+ if (key2) {
1859
+ const n = Number(key2[1]);
1860
+ return n > 0 ? { number: n } : null;
1861
+ }
1862
+ return UUIDISH.test(value) ? { id: value } : null;
1863
+ }
1839
1864
  const id = z.z.string().min(1).max(128);
1840
1865
  const requestId = z.z.string().min(1).max(128);
1841
1866
  const utf8Bytes = (value) => new TextEncoder().encode(value).length;
@@ -1882,7 +1907,14 @@ z.z.object({
1882
1907
  dueAt: epochMs.nullable().optional(),
1883
1908
  parentId: id.nullable().optional(),
1884
1909
  /** Idempotency: the same requestId returns the issue it created. */
1885
- requestId: requestId.optional()
1910
+ requestId: requestId.optional(),
1911
+ /**
1912
+ * B-874d: the caller's todo id (`very-happy todo add --id U`). Stored as
1913
+ * `legacyTodoId`, so U keeps resolving wherever an issue id is accepted and
1914
+ * a second create with the same U returns that issue (404 `issue_todo_deleted`
1915
+ * once that issue is soft-deleted). Older servers strip it.
1916
+ */
1917
+ legacyTodoId: id.optional()
1886
1918
  });
1887
1919
  z.z.object({
1888
1920
  title: title.optional(),
@@ -1989,6 +2021,29 @@ z.z.object({
1989
2021
  t: z.z.literal("issue-run"),
1990
2022
  run: z.z.object({ id: z.z.string(), issueId: z.z.string(), status: z.z.string() }).passthrough()
1991
2023
  });
2024
+ const ISSUE_ERROR_CODES = [
2025
+ "issues_disabled",
2026
+ "issue_not_found",
2027
+ "issue_version_conflict",
2028
+ "issue_count_quota_exceeded",
2029
+ "issue_status_forbidden",
2030
+ "issue_closed",
2031
+ "issue_comment_required",
2032
+ "issue_not_bound",
2033
+ "issue_run_not_current",
2034
+ "issue_assignee_unsupported",
2035
+ "issue_agent_unsupported",
2036
+ "issue_no_directory",
2037
+ "issue_machine_not_found",
2038
+ "issue_parent_cycle",
2039
+ "issue_project_not_found",
2040
+ "issue_comment_quota_exceeded",
2041
+ "issue_run_not_found",
2042
+ "issue_dispatch_claim_mismatch",
2043
+ "transaction_conflict",
2044
+ /** B-874d: create with the `legacyTodoId` of a soft-deleted issue (a deleted todo id is never reused). */
2045
+ "issue_todo_deleted"
2046
+ ];
1992
2047
  const SYNC_HELLO_MAX_REQUEST_SUBS = 64;
1993
2048
  const sessionIdSchema = z__namespace.string().min(1).max(128);
1994
2049
  const afterSeqSchema = z__namespace.number().int().min(0).nullable();
@@ -2123,6 +2178,17 @@ exports.CODEX_LIVE_PERMISSION_CAPABILITY = CODEX_LIVE_PERMISSION_CAPABILITY;
2123
2178
  exports.CODEX_STEER_CAPABILITY = CODEX_STEER_CAPABILITY;
2124
2179
  exports.EFFORT_INTENT_AUTO = EFFORT_INTENT_AUTO;
2125
2180
  exports.HARNESS_INSTALL_CAPABILITY_VERSION = HARNESS_INSTALL_CAPABILITY_VERSION;
2181
+ exports.ISSUES_DISABLED_ERROR = ISSUES_DISABLED_ERROR;
2182
+ exports.ISSUE_AGENT_STATUSES = ISSUE_AGENT_STATUSES;
2183
+ exports.ISSUE_ASSIGNABLE_AGENTS = ISSUE_ASSIGNABLE_AGENTS;
2184
+ exports.ISSUE_DISPATCH_LOCAL_ID_PREFIX = ISSUE_DISPATCH_LOCAL_ID_PREFIX;
2185
+ exports.ISSUE_ERROR_CODES = ISSUE_ERROR_CODES;
2186
+ exports.ISSUE_LIMITS = ISSUE_LIMITS;
2187
+ exports.ISSUE_PRIORITIES = ISSUE_PRIORITIES;
2188
+ exports.ISSUE_SENT_FROM = ISSUE_SENT_FROM;
2189
+ exports.ISSUE_SESSION_CAPABILITY = ISSUE_SESSION_CAPABILITY;
2190
+ exports.ISSUE_STATUSES = ISSUE_STATUSES;
2191
+ exports.ISSUE_WORKER_VERSION = ISSUE_WORKER_VERSION;
2126
2192
  exports.LATEST_MODEL_MODE = LATEST_MODEL_MODE;
2127
2193
  exports.MODEL_INTENT_CONFIG = MODEL_INTENT_CONFIG;
2128
2194
  exports.OwnerBoardListInputSchema = OwnerBoardListInputSchema;
@@ -2148,10 +2214,12 @@ exports.isAttentionBoardLocalId = isAttentionBoardLocalId;
2148
2214
  exports.isAutomationRunTerminal = isAutomationRunTerminal;
2149
2215
  exports.isHarnessInstallId = isHarnessInstallId;
2150
2216
  exports.isInsideTeamWorktree = isInsideTeamWorktree;
2217
+ exports.isIssueClosed = isIssueClosed;
2151
2218
  exports.isLatestModelMode = isLatestModelMode;
2152
2219
  exports.nextRunIntents = nextRunIntents;
2153
2220
  exports.normalizeAgentKey = normalizeAgentKey;
2154
2221
  exports.ownerBoardPostToRest = ownerBoardPostToRest;
2222
+ exports.parseIssueRef = parseIssueRef;
2155
2223
  exports.parseLatestModelTable = parseLatestModelTable;
2156
2224
  exports.readEffortIntent = readEffortIntent;
2157
2225
  exports.readModelIntent = readModelIntent;
@@ -2160,4 +2228,5 @@ exports.resolveLatestModel = resolveLatestModel;
2160
2228
  exports.resolveLaunchAgentProfile = resolveLaunchAgentProfile;
2161
2229
  exports.restoredEffort = restoredEffort;
2162
2230
  exports.restoredModel = restoredModel;
2231
+ exports.sortBuiltinTodos = sortBuiltinTodos;
2163
2232
  exports.streamKeyOf = streamKeyOf;
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var query = require('./query-BVqnfxlX.cjs');
3
+ var query = require('./query-Cwx4pv91.cjs');
4
4
  var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
5
5
  require('./promptCacheTtl-B8PCzE6k.cjs');
6
6
  require('node:fs');
7
7
  require('node:os');
8
8
  require('node:path');
9
- require('./logger-LsJ3Cl5o.cjs');
9
+ require('./logger-Hyhy2boA.cjs');
10
10
  require('chalk');
11
11
  require('node:util');
12
- require('./configuration-CAzuk0Xs.cjs');
13
- require('./package-D7V1BX2I.cjs');
12
+ require('./configuration-LWFmTxty.cjs');
13
+ require('./package-06cGlmeD.cjs');
14
14
  require('node:fs/promises');
15
15
  require('./processTreeSnapshot-D5iNblp6.cjs');
16
16
  require('node:child_process');
@@ -2,14 +2,14 @@
2
2
 
3
3
  var node_fs = require('node:fs');
4
4
  var os = require('node:os');
5
- var logger = require('./logger-LsJ3Cl5o.cjs');
6
- var persistence = require('./persistence-Dl3sBrCF.cjs');
5
+ var logger = require('./logger-Hyhy2boA.cjs');
6
+ var persistence = require('./persistence-_W9tE-bW.cjs');
7
7
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
8
8
  require('chalk');
9
9
  require('node:util');
10
- require('./configuration-CAzuk0Xs.cjs');
10
+ require('./configuration-LWFmTxty.cjs');
11
11
  require('node:path');
12
- require('./package-D7V1BX2I.cjs');
12
+ require('./package-06cGlmeD.cjs');
13
13
  require('node:fs/promises');
14
14
  require('zod');
15
15
  require('./authRelay-Dy1qU9td.cjs');
@@ -1,4 +1,4 @@
1
- import { p as packageJson } from './package-CCF6FHr2.mjs';
1
+ import { p as packageJson } from './package-DxE8PttX.mjs';
2
2
  import module$1 from 'node:module';
3
3
  import { existsSync } from 'node:fs';
4
4
  import { readdir, rm } from 'node:fs/promises';
@@ -57,10 +57,10 @@ async function pruneStaleCompileCaches(happyHomeDir, cliVersion) {
57
57
  async function run(args) {
58
58
  enableCompileCacheIfPossible(packageJson.version);
59
59
  if (isStandaloneVersionRequest(args) || isSelfCheckRequest(args)) {
60
- const { selfCheckMain } = await import('./selfCheck-NWjxjpSx.mjs');
60
+ const { selfCheckMain } = await import('./selfCheck-BmT9ihpR.mjs');
61
61
  process.exit(await selfCheckMain({ verbose: isSelfCheckRequest(args) }));
62
62
  }
63
- const { main } = await import('./main-CzItRviV.mjs');
63
+ const { main } = await import('./main-D1rk-68I.mjs');
64
64
  await main();
65
65
  }
66
66
  void run(process.argv.slice(2));
@@ -1218,7 +1218,7 @@ This skill operates the user's account-synced My todos. External providers and a
1218
1218
 
1219
1219
  Commands return JSON with serverUrl. A nonzero exit is an error; do not infer success from text generated by the agent.
1220
1220
 
1221
- - \`very-happy todo list\`: read tasks including their id and version. Respect truncated/invalidCount; a partial or invalid list is not a complete account inventory.
1221
+ - \`very-happy todo list\`: read open and completed tasks (status open/done) including their id and version. Respect truncated/invalidCount; a partial or invalid list is not a complete account inventory.
1222
1222
  - \`very-happy todo get ID\`: read the current task before editing or resolving a conflict.
1223
1223
  - \`very-happy todo add --id UUID --title "Task" --note "Optional note"\`: generate one fresh UUID for this intended creation and retain it until the outcome is known. For example, Node can generate it with \`node -e "console.log(require('node:crypto').randomUUID())"\`.
1224
1224
  - \`very-happy todo edit ID --version N --title "New title" --note "New note"\`: use the version you read; omit fields that should remain unchanged.
@@ -1233,9 +1233,13 @@ For add, retry with the same UUID and identical title/note after a timeout; do n
1233
1233
 
1234
1234
  For edit/status/delete, a conflict means the version changed. Read the task and compare the new state with the user's request before deciding what to do; never automatically overwrite with a freshly fetched version. A timeout may have committed: read to reconcile, then report the confirmed result. Do not claim a delete succeeded merely because a request was sent.
1235
1235
 
1236
+ ## Issues
1237
+
1238
+ On a server with Issues, My todos are issues without an assignee: the todo commands keep working on them (an ID may also be an issue key such as VH-12). Run \`very-happy issue --help\` for the full Issues interface (assign to an agent, comments). Without Issues the todo commands use the classic store; their output is the same.
1239
+
1236
1240
  Restricted team workers cannot use account-wide Todo credentials. Ask the user or supervising session to perform the account operation; do not clear scope variables or seek another credential to bypass that boundary.
1237
1241
  `;
1238
- const BUILTIN_TODO_DISCOVERY = "For the user\u2019s Very Happy My todos, run `very-happy todo skill` to read the official skill, then use its CLI commands. Do not confuse account todos with your execution plan; restricted team workers must not bypass their scope.";
1242
+ const BUILTIN_TODO_DISCOVERY = "For the user\u2019s Very Happy My todos (and Issues: `very-happy issue --help`), run `very-happy todo skill` to read the official skill, then use its CLI commands. Do not confuse account todos with your execution plan; restricted team workers must not bypass their scope.";
1239
1243
  z$1.object({
1240
1244
  source: z$1.literal("pi"),
1241
1245
  tokens: z$1.number().finite().nonnegative().nullable(),
@@ -1802,6 +1806,12 @@ function ownerBoardPostToRest(sessionId, input, anchor) {
1802
1806
  inferred: false
1803
1807
  };
1804
1808
  }
1809
+ const ISSUE_SESSION_CAPABILITY = "issue-v1";
1810
+ const ISSUES_DISABLED_ERROR = "issues_disabled";
1811
+ const ISSUE_WORKER_VERSION = 1;
1812
+ const ISSUE_KEY_PREFIX = "VH";
1813
+ const ISSUE_DISPATCH_LOCAL_ID_PREFIX = "issue-";
1814
+ const ISSUE_SENT_FROM = "issue";
1805
1815
  const ISSUE_LIMITS = {
1806
1816
  titleChars: 300,
1807
1817
  descriptionBytes: 32 * 1024,
@@ -1814,8 +1824,23 @@ const ISSUE_LIMITS = {
1814
1824
  const ISSUE_STATUSES = ["backlog", "todo", "in_progress", "in_review", "blocked", "done", "cancelled"];
1815
1825
  const ISSUE_PRIORITIES = ["urgent", "high", "medium", "low", "none"];
1816
1826
  const ISSUE_AGENT_STATUSES = ["in_progress", "in_review", "blocked"];
1827
+ const ISSUE_CLOSED_STATUSES = ["done", "cancelled"];
1817
1828
  const ISSUE_ASSIGNABLE_AGENTS = ["claude", "codex", "pi"];
1818
1829
  const ISSUE_ASSIGNEE_KINDS = ["none", "self", "agent", "team"];
1830
+ function isIssueClosed(status) {
1831
+ return ISSUE_CLOSED_STATUSES.includes(status);
1832
+ }
1833
+ const ISSUE_KEY_PATTERN = new RegExp(`^${ISSUE_KEY_PREFIX}-(\\d{1,9})$`, "i");
1834
+ const UUIDISH = /^[A-Za-z0-9_-]{8,128}$/;
1835
+ function parseIssueRef(input) {
1836
+ const value = input.trim();
1837
+ const key2 = ISSUE_KEY_PATTERN.exec(value) ?? /^#?(\d{1,9})$/.exec(value);
1838
+ if (key2) {
1839
+ const n = Number(key2[1]);
1840
+ return n > 0 ? { number: n } : null;
1841
+ }
1842
+ return UUIDISH.test(value) ? { id: value } : null;
1843
+ }
1819
1844
  const id = z$1.string().min(1).max(128);
1820
1845
  const requestId = z$1.string().min(1).max(128);
1821
1846
  const utf8Bytes = (value) => new TextEncoder().encode(value).length;
@@ -1862,7 +1887,14 @@ z$1.object({
1862
1887
  dueAt: epochMs.nullable().optional(),
1863
1888
  parentId: id.nullable().optional(),
1864
1889
  /** Idempotency: the same requestId returns the issue it created. */
1865
- requestId: requestId.optional()
1890
+ requestId: requestId.optional(),
1891
+ /**
1892
+ * B-874d: the caller's todo id (`very-happy todo add --id U`). Stored as
1893
+ * `legacyTodoId`, so U keeps resolving wherever an issue id is accepted and
1894
+ * a second create with the same U returns that issue (404 `issue_todo_deleted`
1895
+ * once that issue is soft-deleted). Older servers strip it.
1896
+ */
1897
+ legacyTodoId: id.optional()
1866
1898
  });
1867
1899
  z$1.object({
1868
1900
  title: title.optional(),
@@ -1969,6 +2001,29 @@ z$1.object({
1969
2001
  t: z$1.literal("issue-run"),
1970
2002
  run: z$1.object({ id: z$1.string(), issueId: z$1.string(), status: z$1.string() }).passthrough()
1971
2003
  });
2004
+ const ISSUE_ERROR_CODES = [
2005
+ "issues_disabled",
2006
+ "issue_not_found",
2007
+ "issue_version_conflict",
2008
+ "issue_count_quota_exceeded",
2009
+ "issue_status_forbidden",
2010
+ "issue_closed",
2011
+ "issue_comment_required",
2012
+ "issue_not_bound",
2013
+ "issue_run_not_current",
2014
+ "issue_assignee_unsupported",
2015
+ "issue_agent_unsupported",
2016
+ "issue_no_directory",
2017
+ "issue_machine_not_found",
2018
+ "issue_parent_cycle",
2019
+ "issue_project_not_found",
2020
+ "issue_comment_quota_exceeded",
2021
+ "issue_run_not_found",
2022
+ "issue_dispatch_claim_mismatch",
2023
+ "transaction_conflict",
2024
+ /** B-874d: create with the `legacyTodoId` of a soft-deleted issue (a deleted todo id is never reused). */
2025
+ "issue_todo_deleted"
2026
+ ];
1972
2027
  const SYNC_HELLO_MAX_REQUEST_SUBS = 64;
1973
2028
  const sessionIdSchema = z.string().min(1).max(128);
1974
2029
  const afterSeqSchema = z.number().int().min(0).nullable();
@@ -2066,4 +2121,4 @@ z.object({
2066
2121
  reason: z.string()
2067
2122
  });
2068
2123
 
2069
- export { OwnerBoardResolveInputSchema as $, AGENT_PROFILE_SESSION_CAPABILITY as A, BUILTIN_TODO_SKILL as B, CLAUDE_CONFIG_MODEL_CAPABILITY as C, AutomationTriggerSchema as D, AGENT_PROFILE_FEATURE_LAUNCH as E, AgentProfileAddRequestSchema as F, AgentProfileLoginStartRequestSchema as G, AgentProfileLoginSubmitRequestSchema as H, AgentProfileBindRequestSchema as I, getAgentCodeDefaults as J, isLatestModelMode as K, resolveLatestModel as L, LATEST_MODEL_MODE as M, EFFORT_INTENT_AUTO as N, normalizeAgentKey as O, PROMPT_QUEUE_CAPABILITY as P, AgentProfilesStateSchema as Q, RUN_INTENT_CAPABILITY as R, STREAM_DELTA_MAX_CHARS as S, AgentVersionsSchema as T, AGENT_VERSION_SOURCES as U, ATTENTION_DISABLED_ERROR as V, ATTENTION_LIMITS as W, ownerBoardPostToRest as X, isAttentionBoardLocalId as Y, OwnerBoardPostInputSchema as Z, OwnerBoardUpdateInputSchema as _, PROJECT_SESSION_CAPABILITY as a, OwnerBoardListInputSchema as a0, ATTENTION_SESSION_CAPABILITY as a1, PI_STEER_CAPABILITY as a2, ReleaseDrainNoticeSchema as a3, RelayAssignmentResponseSchema as a4, CODEX_STEER_CAPABILITY as a5, CODEX_COMPACT_CAPABILITY as a6, CODEX_BTW_CAPABILITY as a7, CODEX_LIVE_PERMISSION_CAPABILITY as a8, AGENT_PROFILE_RPC as a9, RelayCandidatesResponseSchema as aa, ServerMigrateNoticeSchema as ab, isHarnessInstallId as ac, agentProfileUnavailableReason as ad, MODEL_INTENT_CONFIG as ae, AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS as af, AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS as ag, AUTOMATION_CLAIM_MAX_RUNS as ah, AUTOMATION_DAEMON_CAPABILITY_PRECHECK as ai, AUTOMATION_DEFAULT_LEASE_MS as aj, HARNESS_INSTALL_CAPABILITY_VERSION as ak, restoredModel as b, AUTOMATION_NAME_PATTERN as c, AUTOMATION_PRECHECK_MAX_TIMEOUT_MS as d, AutomationPrecheckSchema as e, isInsideTeamWorktree as f, rebaseTeamWorktreePath as g, AUTOMATION_ATTENTION_REASON_MAX_CHARS as h, isAutomationRunTerminal as i, AUTOMATION_SUMMARY_MAX_CHARS as j, createEnvelope as k, RUN_INTENT_RPC as l, RunIntentRequestSchema as m, nextRunIntents as n, readEffortIntent as o, readModelIntent as p, createBuiltinTodoClient as q, restoredEffort as r, streamKeyOf as s, AGENT_PROFILE_KINDS as t, parseLatestModelTable as u, resolveLaunchAgentProfile as v, BUILTIN_TODO_DISCOVERY as w, AutomationNameSchema as x, AutomationConcurrencySchema as y, AutomationActionSchema as z };
2124
+ export { AutomationActionSchema as $, AGENT_PROFILE_SESSION_CAPABILITY as A, parseLatestModelTable as B, CLAUDE_CONFIG_MODEL_CAPABILITY as C, resolveLaunchAgentProfile as D, createBuiltinTodoClient as E, ISSUE_LIMITS as F, sortBuiltinTodos as G, isIssueClosed as H, ISSUE_SESSION_CAPABILITY as I, BUILTIN_TODO_SKILL as J, BUILTIN_TODO_DISCOVERY as K, AGENT_PROFILE_FEATURE_LAUNCH as L, AgentProfileAddRequestSchema as M, AgentProfileLoginStartRequestSchema as N, AgentProfileLoginSubmitRequestSchema as O, PROMPT_QUEUE_CAPABILITY as P, AgentProfileBindRequestSchema as Q, RUN_INTENT_CAPABILITY as R, STREAM_DELTA_MAX_CHARS as S, getAgentCodeDefaults as T, isLatestModelMode as U, resolveLatestModel as V, LATEST_MODEL_MODE as W, EFFORT_INTENT_AUTO as X, normalizeAgentKey as Y, AutomationNameSchema as Z, AutomationConcurrencySchema as _, PROJECT_SESSION_CAPABILITY as a, AutomationTriggerSchema as a0, ISSUE_AGENT_STATUSES as a1, AgentProfilesStateSchema as a2, AgentVersionsSchema as a3, AGENT_VERSION_SOURCES as a4, PI_STEER_CAPABILITY as a5, ATTENTION_DISABLED_ERROR as a6, ATTENTION_LIMITS as a7, ownerBoardPostToRest as a8, isAttentionBoardLocalId as a9, OwnerBoardPostInputSchema as aa, OwnerBoardUpdateInputSchema as ab, OwnerBoardResolveInputSchema as ac, OwnerBoardListInputSchema as ad, ATTENTION_SESSION_CAPABILITY as ae, ReleaseDrainNoticeSchema as af, RelayAssignmentResponseSchema as ag, CODEX_STEER_CAPABILITY as ah, CODEX_COMPACT_CAPABILITY as ai, CODEX_BTW_CAPABILITY as aj, CODEX_LIVE_PERMISSION_CAPABILITY as ak, AGENT_PROFILE_RPC as al, RelayCandidatesResponseSchema as am, ServerMigrateNoticeSchema as an, isHarnessInstallId as ao, agentProfileUnavailableReason as ap, MODEL_INTENT_CONFIG as aq, AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS as ar, AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS as as, AUTOMATION_CLAIM_MAX_RUNS as at, AUTOMATION_DAEMON_CAPABILITY_PRECHECK as au, AUTOMATION_DEFAULT_LEASE_MS as av, ISSUE_SENT_FROM as aw, ISSUE_DISPATCH_LOCAL_ID_PREFIX as ax, HARNESS_INSTALL_CAPABILITY_VERSION as ay, restoredModel as b, AUTOMATION_NAME_PATTERN as c, AUTOMATION_PRECHECK_MAX_TIMEOUT_MS as d, AutomationPrecheckSchema as e, ISSUE_ASSIGNABLE_AGENTS as f, ISSUE_STATUSES as g, ISSUE_PRIORITIES as h, isAutomationRunTerminal as i, isInsideTeamWorktree as j, rebaseTeamWorktreePath as k, ISSUE_ERROR_CODES as l, ISSUES_DISABLED_ERROR as m, ISSUE_WORKER_VERSION as n, AUTOMATION_ATTENTION_REASON_MAX_CHARS as o, parseIssueRef as p, AUTOMATION_SUMMARY_MAX_CHARS as q, restoredEffort as r, streamKeyOf as s, createEnvelope as t, RUN_INTENT_RPC as u, RunIntentRequestSchema as v, nextRunIntents as w, readEffortIntent as x, readModelIntent as y, AGENT_PROFILE_KINDS as z };