volute 0.53.0 → 0.55.0

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 (210) hide show
  1. package/dist/{activity-events-LQII6PZS.js → activity-events-TFAJBNBW.js} +2 -2
  2. package/dist/{ai-service-YW5SWCSB.js → ai-service-KEK2V3AP.js} +2 -2
  3. package/dist/{auth-KRDSM55Q.js → auth-Y27LTNZK.js} +3 -3
  4. package/dist/auto-upgrade-2MZF7NG3.js +46 -0
  5. package/dist/{avatar-image-52WGXLHV.js → avatar-image-SN576P45.js} +2 -2
  6. package/dist/{backup-WWXVIMYQ.js → backup-GDCWH6MC.js} +12 -12
  7. package/dist/channels-AFJWGX7W.js +203 -0
  8. package/dist/{chat-WK2BLM7B.js → chat-HVPOZK3O.js} +9 -9
  9. package/dist/{chunk-QUSMYGNQ.js → chunk-2674KIGI.js} +1 -0
  10. package/dist/chunk-2GATCSZK.js +520 -0
  11. package/dist/{chunk-P2TBUKLW.js → chunk-3SFKY4GI.js} +4 -4
  12. package/dist/{chunk-RMADJFA7.js → chunk-45QTYKQQ.js} +4 -4
  13. package/dist/{chunk-TAWRJ24T.js → chunk-4VAQKLMU.js} +8 -5
  14. package/dist/{chunk-OXWUEU5V.js → chunk-5U5GLZSD.js} +2 -2
  15. package/dist/{chunk-TPX6E6PL.js → chunk-6HBGUPBA.js} +2 -2
  16. package/dist/{chunk-UFTDRTCP.js → chunk-7AA4T2RT.js} +2 -2
  17. package/dist/{chunk-LN7XJ56R.js → chunk-7XKPG66D.js} +9 -9
  18. package/dist/{chunk-VDZ4I4ZP.js → chunk-BP2X5AIK.js} +8 -14
  19. package/dist/{chunk-PIZDPY4G.js → chunk-CKOA4LWV.js} +12 -12
  20. package/dist/{chunk-6NLW72HP.js → chunk-CKPAVQNK.js} +1 -1
  21. package/dist/{chunk-IQ7VNWH6.js → chunk-DUV4EMNW.js} +37 -3
  22. package/dist/{chunk-CV6BNGFK.js → chunk-FSXPPOPM.js} +3 -3
  23. package/dist/{chunk-UTKUO2KY.js → chunk-FZUPIS3T.js} +3 -3
  24. package/dist/{chunk-L7BKTZ5U.js → chunk-G3XAB4DK.js} +1 -1
  25. package/dist/{chunk-23UJGVYP.js → chunk-HLWQ3P3R.js} +50 -46
  26. package/dist/{chunk-AP2KQMMW.js → chunk-HTSWDOJE.js} +11 -14
  27. package/dist/{chunk-EDR47UE2.js → chunk-IR2FW4W7.js} +2 -2
  28. package/dist/{chunk-ICXY54ZC.js → chunk-IT4GEFDH.js} +1 -1
  29. package/dist/{chunk-F6D766VQ.js → chunk-KS62IHE2.js} +1 -1
  30. package/dist/{chunk-LNNI3MS4.js → chunk-MNKPAAQF.js} +9 -2
  31. package/dist/{chunk-HASADR3E.js → chunk-NCRG4SBR.js} +241 -66
  32. package/dist/{chunk-I7U5EEZC.js → chunk-NM5FDH4T.js} +1 -1
  33. package/dist/{chunk-7LT3YZUR.js → chunk-OFU6WJJZ.js} +1 -1
  34. package/dist/{chunk-M77B73VV.js → chunk-OIOW3FPT.js} +7 -2
  35. package/dist/{chunk-BDHKCLWK.js → chunk-OKM67ZWH.js} +1 -1
  36. package/dist/chunk-OUGD5L5U.js +918 -0
  37. package/dist/{chunk-X67BDDZR.js → chunk-P3GXOT2X.js} +48 -2
  38. package/dist/{chunk-U54PJPTB.js → chunk-PRZUBJ4K.js} +1 -1
  39. package/dist/{chunk-UO4MZQNO.js → chunk-QVS3C4DK.js} +15 -7
  40. package/dist/{chunk-RQRO6PC7.js → chunk-TMTAHKYP.js} +324 -48
  41. package/dist/{chunk-5DBGQBQR.js → chunk-UEZC5MNB.js} +29 -18
  42. package/dist/{chunk-7ARONCZW.js → chunk-VTFXZPC3.js} +13 -13
  43. package/dist/{chunk-UDZLPR34.js → chunk-W3OIPJPB.js} +14 -9
  44. package/dist/{chunk-HTB7KDRU.js → chunk-WZZCA23D.js} +5 -4
  45. package/dist/{chunk-5Y54AE3L.js → chunk-XAG53RWY.js} +1 -1
  46. package/dist/{chunk-HTRSSOHY.js → chunk-YU5EYQAE.js} +1 -1
  47. package/dist/{chunk-5N32EN4O.js → chunk-Z4Q6TQWL.js} +1 -1
  48. package/dist/{chunk-EGV6R6UF.js → chunk-Z7TNIIHW.js} +3 -1
  49. package/dist/cli.js +19 -19
  50. package/dist/{clock-SH4NQC2F.js → clock-X7V3C7NL.js} +3 -3
  51. package/dist/{cloud-sync-MJVJ33LD.js → cloud-sync-FM73SVFJ.js} +21 -21
  52. package/dist/{conversations-ZL6PHROD.js → conversations-FH3ODBL7.js} +3 -3
  53. package/dist/{create-G2RIKQYK.js → create-P75ZFTVN.js} +1 -1
  54. package/dist/{daemon-restart-BIGU4OKS.js → daemon-restart-JQMMMITM.js} +4 -4
  55. package/dist/daemon.js +469 -857
  56. package/dist/db-JH3NTERX.js +36 -0
  57. package/dist/delivery-manager-H23Q23N7.js +41 -0
  58. package/dist/{delivery-notices-65TB3CBX.js → delivery-notices-S7TKOACE.js} +5 -5
  59. package/dist/{delivery-router-RHANNTAC.js → delivery-router-KHBVEVVL.js} +4 -2
  60. package/dist/{down-QSNEMTTX.js → down-UN2EDX2Y.js} +3 -3
  61. package/dist/echo-text-ULEIFJJF.js +40 -0
  62. package/dist/{exec-ABD3DYA2.js → exec-Z34TTUO3.js} +1 -1
  63. package/dist/extensions-QD22GXZD.js +74 -0
  64. package/dist/{files-CHPNEQXN.js → files-DUGRXN6V.js} +5 -5
  65. package/dist/{import-DB2KULRO.js → import-RDDUGGFI.js} +3 -3
  66. package/dist/{isolation-GVV2IBAU.js → isolation-UQPDO34R.js} +1 -1
  67. package/dist/message-delivery-LU4EP244.js +46 -0
  68. package/dist/migrate-init-infrastructure-Z72UJ5NT.js +44 -0
  69. package/dist/migrate-name-placeholder-64AEAWPE.js +37 -0
  70. package/dist/{migrate-thread-config-EQSEP2XG.js → migrate-thread-config-SVF2M3D3.js} +1 -1
  71. package/dist/{mind-IX5AWUST.js → mind-BARCLI7O.js} +14 -14
  72. package/dist/{mind-activity-tracker-QF6DCX2X.js → mind-activity-tracker-UT23RGBF.js} +3 -3
  73. package/dist/{mind-contacts-BKUOUJPV.js → mind-contacts-PEXCDRXA.js} +8 -8
  74. package/dist/{mind-list-KNU34SUD.js → mind-list-7KBLPLES.js} +2 -2
  75. package/dist/mind-service-ZJCUBAUL.js +48 -0
  76. package/dist/{mind-sleep-D3DEYAWG.js → mind-sleep-24HV4RCA.js} +5 -5
  77. package/dist/{mind-status-BPTLQ5Z6.js → mind-status-4YW4PHMO.js} +6 -3
  78. package/dist/{package-BN5KMU54.js → package-AUDBDKAO.js} +12 -14
  79. package/dist/{prompts-HNKGCAEY.js → prompts-MOBF3TMO.js} +1 -1
  80. package/dist/{sandbox-NNWCTHRI.js → sandbox-VI7XWBIA.js} +2 -2
  81. package/dist/scheduler-GLINVC2B.js +27 -0
  82. package/dist/{seed-LHZ33UB4.js → seed-5JGR7ZRA.js} +1 -1
  83. package/dist/{seed-cmd-U4RVJ3UA.js → seed-cmd-M6A7N7F3.js} +2 -2
  84. package/dist/{seed-create-OQU4KNCB.js → seed-create-TGFZW4IO.js} +3 -3
  85. package/dist/{seed-readiness-WJYYRRCK.js → seed-readiness-XBH2MUNA.js} +2 -2
  86. package/dist/{seed-sprout-SFUYH2RG.js → seed-sprout-3IC5ZVTI.js} +11 -11
  87. package/dist/{send-FWZAMDBN.js → send-DHYBAYK4.js} +11 -11
  88. package/dist/{service-XQPMZAGI.js → service-T4P5W6RS.js} +2 -2
  89. package/dist/{service-install-2EWD7KXD.js → service-install-R4SNYUVO.js} +3 -3
  90. package/dist/{setup-RVSGCIF3.js → setup-6KAH3GRW.js} +4 -4
  91. package/dist/skills/dreaming/SKILL.md +2 -2
  92. package/dist/skills/dreaming/references/INSTALL.md +1 -1
  93. package/dist/skills/tending/SKILL.md +2 -0
  94. package/dist/skills/volute-mind/SKILL.md +8 -0
  95. package/dist/skills/volute-mind/references/integrations.md +3 -2
  96. package/dist/skills/volute-mind/references/routing.md +18 -5
  97. package/dist/{skills-QRPU6BWY.js → skills-LKQCYFVP.js} +3 -3
  98. package/dist/sleep-manager-Q3ITFNOJ.js +42 -0
  99. package/dist/{spirit-I5ECLGRI.js → spirit-FKXMGO3N.js} +8 -6
  100. package/dist/spirit-availability-5R2WYSWF.js +43 -0
  101. package/dist/{sprout-A2PMEF7Z.js → sprout-VEW3CUNX.js} +1 -1
  102. package/dist/src-246GSX7A.js +519 -0
  103. package/dist/src-LOUB3WPR.js +4189 -0
  104. package/dist/{status-EYG4A3OK.js → status-LCKTTIWS.js} +5 -5
  105. package/dist/{system-events-YTOU66QI.js → system-events-ZYOCYAO2.js} +5 -3
  106. package/dist/{systems-2DIJY4RF.js → systems-HL7SGSW7.js} +6 -6
  107. package/dist/{tailscale-KHNZFC7L.js → tailscale-F2IMBILZ.js} +1 -1
  108. package/dist/{template-hash-YKWMVYMM.js → template-hash-RJRMF6DT.js} +2 -2
  109. package/dist/{template-staleness-PY2CULH6.js → template-staleness-IBD722PN.js} +4 -4
  110. package/dist/{turn-tracker-NNHS6MAR.js → turn-tracker-BE34OI6O.js} +7 -7
  111. package/dist/{up-UGBHH743.js → up-J47J5JRB.js} +3 -3
  112. package/dist/{update-CIWI2JYA.js → update-ILCPVNDD.js} +2 -2
  113. package/dist/{upgrade-LIE46UBB.js → upgrade-XY2J7NWZ.js} +9 -1
  114. package/dist/variant-cleanup-JGJZ5KB4.js +24 -0
  115. package/dist/{version-notify-SJVAQLZI.js → version-notify-KIXYNHJC.js} +28 -13
  116. package/dist/web-assets/assets/{index-b7G7ZsVk.js → index-CoU1eUKE.js} +25 -25
  117. package/dist/web-assets/assets/index-hPn_fkz3.css +1 -0
  118. package/dist/web-assets/index.html +2 -2
  119. package/package.json +12 -14
  120. package/packages/extensions/intentions/dist/ui/assets/index-3FneLCKR.css +1 -0
  121. package/packages/extensions/intentions/dist/ui/assets/index-Bl5KEcli.js +67 -0
  122. package/packages/extensions/{notes → intentions}/dist/ui/index.html +3 -3
  123. package/packages/extensions/intentions/skills/intention-review/SKILL.md +38 -0
  124. package/packages/extensions/intentions/skills/intentions/SKILL.md +49 -0
  125. package/packages/extensions/intentions/skills/intentions/scripts/intentions-hook.sh +45 -0
  126. package/packages/extensions/pages/dist/ui/assets/index-BKxVQkA9.css +1 -0
  127. package/packages/extensions/pages/dist/ui/assets/index-BMt6sStP.js +68 -0
  128. package/packages/extensions/pages/dist/ui/index.html +2 -2
  129. package/packages/extensions/pages/skills/commons-gardening/SKILL.md +50 -0
  130. package/packages/extensions/pages/skills/pages/SKILL.md +140 -16
  131. package/templates/_base/.init/.config/prompts.json +2 -3
  132. package/templates/{pi → _base}/.init/.config/routes.json +1 -0
  133. package/templates/_base/.init/.local/hooks/pre-prompt/turn-context.ts +30 -0
  134. package/templates/_base/.init/memory/dreams/.gitkeep +0 -0
  135. package/templates/_base/home/.config/routes.json +1 -1
  136. package/templates/_base/home/VOLUTE.md +1 -1
  137. package/templates/_base/src/lib/codex-session-seed.ts +6 -55
  138. package/templates/_base/src/lib/context-breakdown.ts +11 -3
  139. package/templates/_base/src/lib/pi-session-seed.ts +8 -57
  140. package/templates/_base/src/lib/routing.ts +2 -2
  141. package/templates/_base/src/lib/seed-note.ts +4 -4
  142. package/templates/_base/src/lib/session-seed.ts +8 -53
  143. package/templates/_base/src/lib/startup.ts +4 -22
  144. package/templates/claude/.init/CLAUDE.md +4 -0
  145. package/templates/claude/package.json +2 -2
  146. package/templates/claude/src/agent.ts +60 -112
  147. package/templates/claude/src/lib/hooks/pre-compact.ts +6 -6
  148. package/templates/claude/src/lib/message-channel.ts +43 -15
  149. package/templates/claude/src/lib/recover.ts +69 -0
  150. package/templates/claude/src/lib/stream-consumer.ts +23 -5
  151. package/templates/claude/src/server.ts +0 -1
  152. package/templates/claude/volute-template.json +1 -1
  153. package/templates/codex/.init/AGENTS.md +4 -0
  154. package/templates/codex/package.json +2 -2
  155. package/templates/codex/src/agent.ts +23 -89
  156. package/templates/codex/volute-template.json +1 -1
  157. package/templates/pi/.init/MINDS.md +4 -0
  158. package/templates/pi/package.json +1 -1
  159. package/templates/pi/src/agent.ts +26 -93
  160. package/templates/pi/src/lib/mechanics-doc.ts +30 -0
  161. package/templates/pi/src/server.ts +3 -2
  162. package/templates/pi/volute-template.json +1 -1
  163. package/dist/channels-LW5ZLMSQ.js +0 -90
  164. package/dist/chunk-R772ET2M.js +0 -164
  165. package/dist/db-IPXRJUI7.js +0 -20
  166. package/dist/delivery-manager-FDHCZ7PU.js +0 -37
  167. package/dist/echo-text-KU6G4Z7V.js +0 -40
  168. package/dist/extensions-VACUKFA5.js +0 -60
  169. package/dist/message-delivery-TUXM3AAE.js +0 -46
  170. package/dist/mind-service-WHFBUKZE.js +0 -48
  171. package/dist/scheduler-5X5UIQOQ.js +0 -27
  172. package/dist/skills/plan-coordinator/SKILL.md +0 -60
  173. package/dist/sleep-manager-NWUCRBZB.js +0 -42
  174. package/dist/spirit-availability-NIUUYKU2.js +0 -43
  175. package/dist/src-HGNE2XG4.js +0 -832
  176. package/dist/src-LCSOQY6Z.js +0 -2222
  177. package/dist/src-UDMJZ6MH.js +0 -426
  178. package/dist/variant-cleanup-CZDLIY3F.js +0 -24
  179. package/dist/web-assets/assets/index-BHSU9r-4.css +0 -1
  180. package/packages/extensions/notes/dist/ui/assets/index-BBs8pyel.js +0 -67
  181. package/packages/extensions/notes/dist/ui/assets/index-D3cdui42.css +0 -1
  182. package/packages/extensions/notes/skills/notes/SKILL.md +0 -90
  183. package/packages/extensions/pages/dist/ui/assets/index-B589e8Xe.js +0 -2
  184. package/packages/extensions/pages/dist/ui/assets/index-BuXnE-rb.css +0 -1
  185. package/packages/extensions/plan/dist/ui/assets/index-B8s8wxyt.js +0 -67
  186. package/packages/extensions/plan/dist/ui/assets/index-jIkrt-vI.css +0 -1
  187. package/packages/extensions/plan/dist/ui/index.html +0 -14
  188. package/packages/extensions/plan/skills/plan/SKILL.md +0 -43
  189. package/packages/extensions/plan/skills/plan/scripts/plan-hook.sh +0 -37
  190. package/templates/claude/.init/.config/routes.json +0 -11
  191. package/templates/codex/.init/.config/routes.json +0 -11
  192. package/dist/{accept-I4GVGWA3.js → accept-RSDIVJL6.js} +3 -3
  193. package/dist/{bridge-KU2IKSH3.js → bridge-YK7NTRU5.js} +3 -3
  194. package/dist/{create-C3XZACTV.js → create-M727VUDF.js} +3 -3
  195. package/dist/{env-BJGM6FBA.js → env-7AZFBPWX.js} +7 -7
  196. package/dist/{extension-B2W52WZY.js → extension-MRYJWSMV.js} +3 -3
  197. package/dist/{list-R2GDWOEE.js → list-UQGIW7OF.js} +3 -3
  198. package/dist/{login-EZ4RRDQX.js → login-4NUS72Z5.js} +3 -3
  199. package/dist/{login-JDOAK465.js → login-57MMYILL.js} +4 -4
  200. package/dist/{logout-MWSIUOQU.js → logout-BYV433X6.js} +3 -3
  201. package/dist/{logout-K6ZGAJY5.js → logout-YFZAJRPY.js} +3 -3
  202. package/dist/{mind-history-RVF6KJ7K.js → mind-history-RZMMCHMX.js} +9 -9
  203. package/dist/{mind-wake-DCDFFQKX.js → mind-wake-LDGPRA42.js} +3 -3
  204. package/dist/{read-J5RM674N.js → read-RJ5NAW5J.js} +3 -3
  205. package/dist/{register-53LBGSDC.js → register-WNCSOTAU.js} +3 -3
  206. package/dist/{reject-K2A4UK2Y.js → reject-4NFLXKRN.js} +3 -3
  207. package/dist/{restart-R2WFNF5K.js → restart-B4GNMVF2.js} +7 -7
  208. package/dist/{skill-DXLLSUHB.js → skill-QYTBUDNQ.js} +7 -7
  209. package/dist/{start-XDOUAWN3.js → start-BDHJVOVX.js} +6 -6
  210. package/dist/{stop-O62RTEMD.js → stop-45QYSGYS.js} +7 -7
@@ -1,36 +1,52 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  spiritDir
4
- } from "./chunk-5DBGQBQR.js";
4
+ } from "./chunk-UEZC5MNB.js";
5
5
  import {
6
6
  getScheduler
7
- } from "./chunk-PIZDPY4G.js";
7
+ } from "./chunk-CKOA4LWV.js";
8
8
  import {
9
9
  getDeliveryManager
10
- } from "./chunk-RQRO6PC7.js";
10
+ } from "./chunk-TMTAHKYP.js";
11
11
  import {
12
12
  getMindManager,
13
13
  resolveMindToken
14
- } from "./chunk-23UJGVYP.js";
14
+ } from "./chunk-HLWQ3P3R.js";
15
+ import {
16
+ addMessage,
17
+ createChannel,
18
+ createConversation,
19
+ findDMConversation,
20
+ getChannelByName,
21
+ getChannelSettings,
22
+ getParticipants,
23
+ joinChannel,
24
+ updateChannelSettings
25
+ } from "./chunk-6HBGUPBA.js";
26
+ import {
27
+ markIdle
28
+ } from "./chunk-7AA4T2RT.js";
29
+ import {
30
+ readVoluteConfig,
31
+ resolveWakeTriggers
32
+ } from "./chunk-WCFSBH33.js";
15
33
  import {
16
34
  extractTextContent,
17
35
  getRoutingConfig,
18
36
  resolveRoute,
19
37
  shouldGate
20
- } from "./chunk-UDZLPR34.js";
21
- import {
22
- hashSkillDir,
23
- importSkillFromDir,
24
- removeSharedSkill,
25
- sharedSkillsDir
26
- } from "./chunk-TAWRJ24T.js";
38
+ } from "./chunk-W3OIPJPB.js";
27
39
  import {
28
40
  getOrCreateMindUser,
29
41
  getOrCreateSystemUser,
30
42
  getUser,
31
43
  getUserByUsername,
32
44
  syncMindProfile
33
- } from "./chunk-7LT3YZUR.js";
45
+ } from "./chunk-OFU6WJJZ.js";
46
+ import {
47
+ publish,
48
+ subscribe
49
+ } from "./chunk-PRZUBJ4K.js";
34
50
  import {
35
51
  MIND_LEVEL_THREAD,
36
52
  deliverEvent,
@@ -38,45 +54,30 @@ import {
38
54
  pendingEventCount,
39
55
  pendingEventsLine,
40
56
  recordNotice
41
- } from "./chunk-IQ7VNWH6.js";
57
+ } from "./chunk-DUV4EMNW.js";
42
58
  import {
43
59
  publish as publish2
44
- } from "./chunk-LNNI3MS4.js";
60
+ } from "./chunk-MNKPAAQF.js";
45
61
  import {
46
62
  getPrompt
47
- } from "./chunk-AP2KQMMW.js";
63
+ } from "./chunk-HTSWDOJE.js";
48
64
  import {
49
- addMessage,
50
- createChannel,
51
- createConversation,
52
- findDMConversation,
53
- getChannelByName,
54
- getChannelSettings,
55
- getParticipants,
56
- joinChannel,
57
- updateChannelSettings
58
- } from "./chunk-TPX6E6PL.js";
59
- import {
60
- markIdle
61
- } from "./chunk-UFTDRTCP.js";
62
- import {
63
- publish,
64
- subscribe
65
- } from "./chunk-U54PJPTB.js";
66
- import {
67
- readVoluteConfig,
68
- resolveWakeTriggers
69
- } from "./chunk-WCFSBH33.js";
65
+ hashSkillDir,
66
+ importSkillFromDir,
67
+ listSharedSkills,
68
+ removeSharedSkill,
69
+ sharedSkillsDir
70
+ } from "./chunk-4VAQKLMU.js";
70
71
  import {
71
72
  isIsolationEnabled,
72
73
  mindUserName
73
- } from "./chunk-M77B73VV.js";
74
+ } from "./chunk-OIOW3FPT.js";
74
75
  import {
75
76
  missingCredentialWarning
76
- } from "./chunk-EGV6R6UF.js";
77
+ } from "./chunk-Z7TNIIHW.js";
77
78
  import {
78
79
  logger_default
79
- } from "./chunk-QUSMYGNQ.js";
80
+ } from "./chunk-2674KIGI.js";
80
81
  import {
81
82
  findMind,
82
83
  getBaseName,
@@ -86,6 +87,7 @@ import {
86
87
  mindDir,
87
88
  readGlobalConfig,
88
89
  readRegistry,
90
+ resolveMindDir,
89
91
  stateDir,
90
92
  voluteHome,
91
93
  voluteSystemDir,
@@ -327,6 +329,85 @@ import { promisify } from "util";
327
329
  import { CronExpressionParser } from "cron-parser";
328
330
  import { and as and2, eq as eq3, inArray } from "drizzle-orm";
329
331
 
332
+ // packages/daemon/src/lib/turn-context.ts
333
+ var tlog = logger_default.child("turn-context");
334
+ var TURN_CONTEXT_BUDGET = {
335
+ turn: 1200,
336
+ wake: 3e3
337
+ };
338
+ var PROVIDER_TIMEOUT_MS = 1e3;
339
+ var TOTAL_TIMEOUT_MS = 2e3;
340
+ var SEPARATOR = "\n\n";
341
+ function withTimeout(p, ms) {
342
+ return new Promise((resolve6, reject) => {
343
+ const timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);
344
+ p.then(
345
+ (v) => {
346
+ clearTimeout(timer);
347
+ resolve6(v);
348
+ },
349
+ (err) => {
350
+ clearTimeout(timer);
351
+ reject(err);
352
+ }
353
+ );
354
+ });
355
+ }
356
+ async function collectFromProviders(providers, reason, total = TURN_CONTEXT_BUDGET[reason], now = Date.now) {
357
+ if (providers.length === 0 || total <= 0) return null;
358
+ const deadline = now() + TOTAL_TIMEOUT_MS;
359
+ const blocks = [];
360
+ let remaining = total;
361
+ for (let i = 0; i < providers.length; i++) {
362
+ const { id, run } = providers[i];
363
+ if (remaining <= 0) break;
364
+ if (now() >= deadline) {
365
+ tlog.warn(
366
+ `deadline reached before asking ${providers.length - i} remaining extension(s) for ${reason} context`
367
+ );
368
+ break;
369
+ }
370
+ const joinerCost = blocks.length > 0 ? SEPARATOR.length : 0;
371
+ const available = remaining - joinerCost;
372
+ if (available <= 0) break;
373
+ const budget = Math.floor(available / (providers.length - i));
374
+ if (budget <= 0) break;
375
+ let text;
376
+ try {
377
+ text = await withTimeout(run(budget), PROVIDER_TIMEOUT_MS);
378
+ } catch (err) {
379
+ tlog.warn(`extension ${id}: turnContext failed, dropped from this turn`, logger_default.errorData(err));
380
+ continue;
381
+ }
382
+ if (typeof text !== "string") continue;
383
+ const trimmed = text.trim();
384
+ if (!trimmed) continue;
385
+ if (trimmed.length > budget) {
386
+ tlog.warn(
387
+ `extension ${id}: turnContext returned ${trimmed.length} chars over a ${budget} budget \u2014 dropped`
388
+ );
389
+ continue;
390
+ }
391
+ blocks.push(trimmed);
392
+ remaining -= trimmed.length + joinerCost;
393
+ }
394
+ if (blocks.length === 0) return null;
395
+ return blocks.join(SEPARATOR);
396
+ }
397
+ async function collectTurnContext(mindName, reason) {
398
+ try {
399
+ const providers = getTurnContextProviders().map(({ id, manifest, context }) => ({
400
+ id,
401
+ // Non-null: getTurnContextProviders filters to manifests that declare it.
402
+ run: (budget) => manifest.turnContext(mindName, context, { budget, reason })
403
+ }));
404
+ return await collectFromProviders(providers, reason);
405
+ } catch (err) {
406
+ tlog.error(`failed to collect ${reason} context for ${mindName}`, logger_default.errorData(err));
407
+ return null;
408
+ }
409
+ }
410
+
330
411
  // packages/daemon/src/lib/daemon/mind-service.ts
331
412
  import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
332
413
  import { resolve as resolve3 } from "path";
@@ -641,7 +722,7 @@ async function ensureMailAddress(mindName) {
641
722
  import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
642
723
  import { mkdir, writeFile } from "fs/promises";
643
724
  import { resolve as resolve2 } from "path";
644
- var tlog = logger_default.child("token-budget");
725
+ var tlog2 = logger_default.child("token-budget");
645
726
  var DEFAULT_BUDGET_PERIOD_MINUTES = 60;
646
727
  var MAX_QUEUE_SIZE = 100;
647
728
  var TokenBudget = class {
@@ -650,7 +731,7 @@ var TokenBudget = class {
650
731
  dirty = /* @__PURE__ */ new Set();
651
732
  start() {
652
733
  this.interval = setInterval(() => {
653
- this.tick().catch((err) => tlog.error("token budget tick failed", logger_default.errorData(err)));
734
+ this.tick().catch((err) => tlog2.error("token budget tick failed", logger_default.errorData(err)));
654
735
  }, 6e4);
655
736
  }
656
737
  async stop() {
@@ -760,7 +841,7 @@ var TokenBudget = class {
760
841
  const queued = this.drain(mind);
761
842
  if (queued.length > 0) {
762
843
  this.replay(mind, queued).catch((err) => {
763
- tlog.warn(`replay error for ${mind}`, logger_default.errorData(err));
844
+ tlog2.warn(`replay error for ${mind}`, logger_default.errorData(err));
764
845
  });
765
846
  }
766
847
  }
@@ -795,7 +876,7 @@ var TokenBudget = class {
795
876
  await writeFile(this.budgetStatePath(mind), `${JSON.stringify(data)}
796
877
  `);
797
878
  } catch (err) {
798
- tlog.warn(`failed to save budget state for ${mind}`, logger_default.errorData(err));
879
+ tlog2.warn(`failed to save budget state for ${mind}`, logger_default.errorData(err));
799
880
  }
800
881
  }
801
882
  loadBudgetState(mind) {
@@ -816,7 +897,7 @@ var TokenBudget = class {
816
897
  // will be overwritten by caller
817
898
  };
818
899
  } catch (err) {
819
- tlog.warn(`failed to load budget state for ${mind}`, logger_default.errorData(err));
900
+ tlog2.warn(`failed to load budget state for ${mind}`, logger_default.errorData(err));
820
901
  return null;
821
902
  }
822
903
  }
@@ -834,9 +915,9 @@ var TokenBudget = class {
834
915
 
835
916
  ${summary}`
836
917
  });
837
- tlog.info(`replayed ${messages2.length} queued message(s) for ${mindName}`);
918
+ tlog2.info(`replayed ${messages2.length} queued message(s) for ${mindName}`);
838
919
  } catch (err) {
839
- tlog.warn(`failed to replay for ${mindName}`, logger_default.errorData(err));
920
+ tlog2.warn(`failed to replay for ${mindName}`, logger_default.errorData(err));
840
921
  const state = this.budgets.get(mindName);
841
922
  if (state) state.queue.push(...messages2);
842
923
  }
@@ -931,7 +1012,7 @@ async function startMindFull(name) {
931
1012
  }
932
1013
  }
933
1014
  async function recordMissingCredentialsNotice(mind, template) {
934
- const { hasUndeliveredEvent, recordNotice: recordNotice2, MIND_LEVEL_THREAD: MIND_LEVEL_THREAD2 } = await import("./system-events-YTOU66QI.js");
1015
+ const { hasUndeliveredEvent, recordNotice: recordNotice2, MIND_LEVEL_THREAD: MIND_LEVEL_THREAD2 } = await import("./system-events-ZYOCYAO2.js");
935
1016
  const warning = await missingCredentialWarning(template, readMindModel(mind, template), mind);
936
1017
  if (!warning) return;
937
1018
  if (await hasUndeliveredEvent(mind, "no_credentials")) return;
@@ -975,7 +1056,7 @@ async function wakeMind(name) {
975
1056
  async function startSpiritFull(name) {
976
1057
  const entry = await findMind(name);
977
1058
  if (entry?.dir) {
978
- const { registerMindDir } = await import("./delivery-router-RHANNTAC.js");
1059
+ const { registerMindDir } = await import("./delivery-router-KHBVEVVL.js");
979
1060
  registerMindDir(name, entry.dir);
980
1061
  }
981
1062
  await getMindManager().startMind(name);
@@ -983,6 +1064,11 @@ async function startSpiritFull(name) {
983
1064
  (err) => logger_default.error(`failed to join #system for ${name}`, logger_default.errorData(err))
984
1065
  );
985
1066
  getScheduler().loadSchedules(name, entry?.dir ?? spiritDir());
1067
+ try {
1068
+ notifyExtensionsMindStart(name);
1069
+ } catch (err) {
1070
+ logger_default.error(`failed to notify extensions of spirit start for ${name}`, logger_default.errorData(err));
1071
+ }
986
1072
  publish({
987
1073
  type: "mind_started",
988
1074
  mind: name,
@@ -990,6 +1076,7 @@ async function startSpiritFull(name) {
990
1076
  }).catch((err) => logger_default.error("failed to publish spirit_started activity", logger_default.errorData(err)));
991
1077
  }
992
1078
  async function stopSpiritFull(name) {
1079
+ notifyExtensionsMindStop(name);
993
1080
  markIdle(name);
994
1081
  getScheduler().unloadSchedules(name);
995
1082
  await getMindManager().stopMind(name);
@@ -1008,7 +1095,7 @@ function buildSeedOrientation(createdBy, creatorType) {
1008
1095
  async function sendSeedOrientation(mindName, createdBy) {
1009
1096
  let creatorType;
1010
1097
  if (createdBy) {
1011
- const { getUserByUsername: getUserByUsername2 } = await import("./auth-KRDSM55Q.js");
1098
+ const { getUserByUsername: getUserByUsername2 } = await import("./auth-Y27LTNZK.js");
1012
1099
  creatorType = (await getUserByUsername2(createdBy))?.user_type;
1013
1100
  }
1014
1101
  await deliverEvent(mindName, {
@@ -1017,8 +1104,8 @@ async function sendSeedOrientation(mindName, createdBy) {
1017
1104
  });
1018
1105
  }
1019
1106
  async function ensureCreatorDM(mindName, creatorUsername) {
1020
- const { getOrCreateMindUser: getOrCreateMindUser2, getUserByUsername: getUserByUsername2 } = await import("./auth-KRDSM55Q.js");
1021
- const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-ZL6PHROD.js");
1107
+ const { getOrCreateMindUser: getOrCreateMindUser2, getUserByUsername: getUserByUsername2 } = await import("./auth-Y27LTNZK.js");
1108
+ const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-FH3ODBL7.js");
1022
1109
  const mindUser = await getOrCreateMindUser2(mindName);
1023
1110
  const creatorUser = await getUserByUsername2(creatorUsername);
1024
1111
  if (!creatorUser) {
@@ -1318,7 +1405,14 @@ var SleepManager = class {
1318
1405
  );
1319
1406
  const queuedSummary = await this.buildQueuedSummary(name);
1320
1407
  const eventsSummary = pendingEventsLine(await pendingEventCount(name));
1321
- const sleepActivity = [triggerWakeSummary, wakeContext, queuedSummary, eventsSummary].filter(Boolean).join("\n\n");
1408
+ const extensionContext = await collectTurnContext(name, "wake");
1409
+ const sleepActivity = [
1410
+ triggerWakeSummary,
1411
+ wakeContext,
1412
+ queuedSummary,
1413
+ eventsSummary,
1414
+ extensionContext
1415
+ ].filter(Boolean).join("\n\n");
1322
1416
  const summaryText = await getPrompt("wake_summary", {
1323
1417
  currentDate,
1324
1418
  sleepTime,
@@ -1452,7 +1546,7 @@ var SleepManager = class {
1452
1546
  * the real delivery stack. Returns whether the batch was handed off to the mind.
1453
1547
  */
1454
1548
  async deliverQueuedBatch(name, payloads) {
1455
- const { deliverBatch: deliverBatch2 } = await import("./message-delivery-TUXM3AAE.js");
1549
+ const { deliverBatch: deliverBatch2 } = await import("./message-delivery-LU4EP244.js");
1456
1550
  return deliverBatch2(name, payloads);
1457
1551
  }
1458
1552
  // --- Wake failure handling (#419) ---
@@ -2066,7 +2160,7 @@ async function deliverBatch(mindName, payloads) {
2066
2160
  const res = await fetch(`http://127.0.0.1:${entry.port}/message`, {
2067
2161
  method: "POST",
2068
2162
  headers: { "Content-Type": "application/json" },
2069
- body: JSON.stringify({ session, batch: { channels } })
2163
+ body: JSON.stringify({ session, batch: { channels }, interrupt: false })
2070
2164
  });
2071
2165
  return res.ok;
2072
2166
  } catch (err) {
@@ -2286,7 +2380,17 @@ async function openExtensionDb(_id, dataDir) {
2286
2380
  const Database = await getLibsqlDatabase();
2287
2381
  return new Database(dbPath);
2288
2382
  }
2289
- async function buildContext(manifest, dataDir, authMw) {
2383
+ function normalizeTrailingSlash(app) {
2384
+ return async (c, next) => {
2385
+ const url = new URL(c.req.url);
2386
+ if (url.pathname.length > 1 && url.pathname.endsWith("/")) {
2387
+ url.pathname = url.pathname.replace(/\/+$/, "");
2388
+ return app.fetch(new Request(url, c.req.raw), c.env);
2389
+ }
2390
+ await next();
2391
+ };
2392
+ }
2393
+ async function buildExtensionContext(manifest, dataDir, authMw) {
2290
2394
  let db = null;
2291
2395
  if (manifest.initDb) {
2292
2396
  const realDb = await openExtensionDb(manifest.id, dataDir);
@@ -2319,9 +2423,11 @@ async function buildContext(manifest, dataDir, authMw) {
2319
2423
  (err) => logger_default.error(`extension ${manifest.id}: failed to publish activity`, logger_default.errorData(err))
2320
2424
  );
2321
2425
  },
2322
- getMindDir: (name) => {
2426
+ // Registry-backed, not path-convention: the spirit lives under the system dir
2427
+ // and variants live in worktrees, so mindDir(name) alone resolves neither.
2428
+ getMindDir: async (name) => {
2323
2429
  try {
2324
- const dir = mindDir(name);
2430
+ const dir = await resolveMindDir(name);
2325
2431
  return existsSync5(dir) ? dir : null;
2326
2432
  } catch (err) {
2327
2433
  logger_default.warn(
@@ -2331,12 +2437,23 @@ async function buildContext(manifest, dataDir, authMw) {
2331
2437
  return null;
2332
2438
  }
2333
2439
  },
2440
+ listMinds: async () => {
2441
+ try {
2442
+ return (await readRegistry()).map((m) => ({
2443
+ name: m.name,
2444
+ mindType: m.mindType === "spirit" ? "spirit" : "mind",
2445
+ stage: m.stage
2446
+ }));
2447
+ } catch (err) {
2448
+ logger_default.warn(`extension ${manifest.id}: failed to list minds`, logger_default.errorData(err));
2449
+ return [];
2450
+ }
2451
+ },
2334
2452
  getSystemsConfig: () => readSystemsConfig(),
2335
2453
  announceToSystem: (text) => announceToSystem(text),
2336
2454
  recordNotice: async (mindName, text) => {
2337
2455
  try {
2338
- const user = await getUserByUsername(mindName);
2339
- if (user?.user_type !== "mind") return;
2456
+ if (!await findMind(mindName)) return;
2340
2457
  await recordNotice({
2341
2458
  mind: mindName,
2342
2459
  thread: MIND_LEVEL_THREAD,
@@ -2353,6 +2470,10 @@ async function buildContext(manifest, dataDir, authMw) {
2353
2470
  },
2354
2471
  isIsolationEnabled,
2355
2472
  getMindUser: mindUserName,
2473
+ // Delegate to the daemon's single source of truth, which falls back to "volute"
2474
+ // on installs that predate spirit naming. Reading setup.spiritName directly
2475
+ // returned null on those systems, so extension spirit paths no-opped forever.
2476
+ getSpiritName: () => getSpiritName(),
2356
2477
  dataDir
2357
2478
  };
2358
2479
  }
@@ -2363,7 +2484,7 @@ async function loadExtension(manifest, app, authMw) {
2363
2484
  }
2364
2485
  const dataDir = extensionDataDir(manifest.id);
2365
2486
  mkdirSync3(dataDir, { recursive: true });
2366
- const context = await buildContext(manifest, dataDir, authMw);
2487
+ const context = await buildExtensionContext(manifest, dataDir, authMw);
2367
2488
  const routesApp = manifest.routes(context);
2368
2489
  const extApiPath = `/api/ext/${manifest.id}`;
2369
2490
  app.use(extApiPath, authMw);
@@ -2529,9 +2650,8 @@ function resolveSkillsDir(manifest) {
2529
2650
  }
2530
2651
  async function discoverBuiltinExtensions(disabledIds) {
2531
2652
  const builtins = [
2532
- { id: "notes", load: async () => (await import("./src-HGNE2XG4.js")).default },
2533
- { id: "pages", load: async () => (await import("./src-LCSOQY6Z.js")).default },
2534
- { id: "plan", load: async () => (await import("./src-UDMJZ6MH.js")).default }
2653
+ { id: "pages", load: async () => (await import("./src-LOUB3WPR.js")).default },
2654
+ { id: "intentions", load: async () => (await import("./src-246GSX7A.js")).default }
2535
2655
  ];
2536
2656
  const results = [];
2537
2657
  for (const { id, load } of builtins) {
@@ -2652,6 +2772,7 @@ async function loadAllExtensions(app, authMw) {
2652
2772
  logger_default.error(`failed to load extension: ${manifest.id}`, logger_default.errorData(err));
2653
2773
  }
2654
2774
  }
2775
+ await pruneOrphanedExtensionSkills();
2655
2776
  app.get("/api/extensions/commands", (c) => {
2656
2777
  const result = {};
2657
2778
  for (const { manifest } of loaded) {
@@ -2780,7 +2901,7 @@ async function installNpmExtension(pkg) {
2780
2901
  throw new Error(`Extension "${pkg}" is already installed`);
2781
2902
  }
2782
2903
  const dir = ensureExtensionsNpmDir();
2783
- const { exec } = await import("./exec-ABD3DYA2.js");
2904
+ const { exec } = await import("./exec-Z34TTUO3.js");
2784
2905
  try {
2785
2906
  await exec("npm", ["install", "--ignore-scripts", pkg], { cwd: dir });
2786
2907
  } catch (err) {
@@ -2801,7 +2922,7 @@ async function uninstallNpmExtension(pkg) {
2801
2922
  packages.splice(idx, 1);
2802
2923
  writeExtensionsConfig(packages);
2803
2924
  try {
2804
- const { exec } = await import("./exec-ABD3DYA2.js");
2925
+ const { exec } = await import("./exec-Z34TTUO3.js");
2805
2926
  await exec("npm", ["uninstall", "--ignore-scripts", pkg], { cwd: extensionsNpmDir() });
2806
2927
  } catch (err) {
2807
2928
  logger_default.warn(
@@ -2811,6 +2932,25 @@ async function uninstallNpmExtension(pkg) {
2811
2932
  }
2812
2933
  logger_default.info(`uninstalled extension package: ${pkg}`);
2813
2934
  }
2935
+ async function pruneOrphanedExtensionSkills() {
2936
+ try {
2937
+ const present = new Set(discovered.map((e) => e.manifest.id));
2938
+ const skills = await listSharedSkills();
2939
+ for (const skill of skills) {
2940
+ if (!skill.author?.startsWith("ext:")) continue;
2941
+ const extId = skill.author.slice("ext:".length);
2942
+ if (present.has(extId)) continue;
2943
+ try {
2944
+ await removeSharedSkill(skill.id);
2945
+ logger_default.info(`removed orphaned skill "${skill.id}" from absent extension ${extId}`);
2946
+ } catch (err) {
2947
+ logger_default.warn(`failed to remove orphaned skill "${skill.id}"`, logger_default.errorData(err));
2948
+ }
2949
+ }
2950
+ } catch (err) {
2951
+ logger_default.warn("could not prune orphaned extension skills", logger_default.errorData(err));
2952
+ }
2953
+ }
2814
2954
  async function cleanupExtensionSkills(pkg) {
2815
2955
  try {
2816
2956
  const pkgDir = resolve5(extensionsNpmDir(), "node_modules", pkg);
@@ -2839,9 +2979,10 @@ function getExtensionStandardSkills() {
2839
2979
  if (!manifest.standardSkill) continue;
2840
2980
  const dir = resolveSkillsDir(manifest);
2841
2981
  if (!dir) continue;
2982
+ const spiritSet = new Set(manifest.spiritSkills ?? []);
2842
2983
  try {
2843
2984
  for (const entry of readdirSync2(dir, { withFileTypes: true })) {
2844
- if (entry.isDirectory()) skills.push(entry.name);
2985
+ if (entry.isDirectory() && !spiritSet.has(entry.name)) skills.push(entry.name);
2845
2986
  }
2846
2987
  } catch (err) {
2847
2988
  logger_default.warn(`failed to read skills dir for extension ${manifest.id}`, logger_default.errorData(err));
@@ -2849,6 +2990,13 @@ function getExtensionStandardSkills() {
2849
2990
  }
2850
2991
  return skills;
2851
2992
  }
2993
+ function getExtensionSpiritSkills() {
2994
+ const skills = [];
2995
+ for (const { manifest } of loaded) {
2996
+ for (const name of manifest.spiritSkills ?? []) skills.push(name);
2997
+ }
2998
+ return skills;
2999
+ }
2852
3000
  function notifyExtensionsDaemonStart() {
2853
3001
  for (const { manifest, context } of loaded) {
2854
3002
  try {
@@ -2858,6 +3006,16 @@ function notifyExtensionsDaemonStart() {
2858
3006
  }
2859
3007
  }
2860
3008
  }
3009
+ async function notifyExtensionsSpiritReady() {
3010
+ for (const { manifest, context } of loaded) {
3011
+ if (!manifest.onSpiritReady) continue;
3012
+ try {
3013
+ await manifest.onSpiritReady(context);
3014
+ } catch (err) {
3015
+ logger_default.error(`extension ${manifest.id}: onSpiritReady failed`, logger_default.errorData(err));
3016
+ }
3017
+ }
3018
+ }
2861
3019
  function notifyExtensionsDaemonStop() {
2862
3020
  for (const { manifest, context } of loaded) {
2863
3021
  try {
@@ -2893,6 +3051,15 @@ function notifyExtensionsMindStop(mindName) {
2893
3051
  }
2894
3052
  }
2895
3053
  }
3054
+ function getTurnContextProviders() {
3055
+ return loaded.filter(({ manifest }) => typeof manifest.turnContext === "function").map(({ manifest, context }) => ({ id: manifest.id, manifest, context })).sort((a, b) => a.id.localeCompare(b.id));
3056
+ }
3057
+ function _registerExtensionForTest(manifest) {
3058
+ loaded.push({ manifest, context: {} });
3059
+ }
3060
+ function _clearLoadedExtensionsForTest() {
3061
+ loaded.length = 0;
3062
+ }
2896
3063
 
2897
3064
  export {
2898
3065
  issueApiToken,
@@ -2914,6 +3081,8 @@ export {
2914
3081
  deleteSystemsConfig,
2915
3082
  enrichActivityMetadata,
2916
3083
  parseCommandArgs,
3084
+ normalizeTrailingSlash,
3085
+ buildExtensionContext,
2917
3086
  loadAllExtensions,
2918
3087
  getLoadedExtensions,
2919
3088
  getAllDiscoveredExtensions,
@@ -2922,10 +3091,16 @@ export {
2922
3091
  installNpmExtension,
2923
3092
  uninstallNpmExtension,
2924
3093
  getExtensionStandardSkills,
3094
+ getExtensionSpiritSkills,
2925
3095
  notifyExtensionsDaemonStart,
3096
+ notifyExtensionsSpiritReady,
2926
3097
  notifyExtensionsDaemonStop,
2927
3098
  notifyExtensionsMindStart,
2928
3099
  notifyExtensionsMindStop,
3100
+ getTurnContextProviders,
3101
+ _registerExtensionForTest,
3102
+ _clearLoadedExtensionsForTest,
3103
+ collectTurnContext,
2929
3104
  initMailPoller,
2930
3105
  initTokenBudget,
2931
3106
  getTokenBudget,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  setBridgeConfig
4
- } from "./chunk-L7BKTZ5U.js";
4
+ } from "./chunk-G3XAB4DK.js";
5
5
  import {
6
6
  readEnv,
7
7
  sharedEnvPath,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  broadcast
4
- } from "./chunk-U54PJPTB.js";
4
+ } from "./chunk-PRZUBJ4K.js";
5
5
  import {
6
6
  findMind,
7
7
  getDb,
@@ -15,10 +15,10 @@ import { execFile as execFileCb, execFileSync, spawn } from "child_process";
15
15
  async function exec(cmd, args, options) {
16
16
  const [wrappedCmd, wrappedArgs] = options?.mindName ? await wrapForIsolation(cmd, args, options.mindName) : [cmd, args];
17
17
  return new Promise((resolve2, reject) => {
18
- execFileCb(
18
+ const child = execFileCb(
19
19
  wrappedCmd,
20
20
  wrappedArgs,
21
- { cwd: options?.cwd, env: options?.env },
21
+ { cwd: options?.cwd, env: options?.env, maxBuffer: options?.maxBuffer },
22
22
  (err, stdout, stderr) => {
23
23
  if (err) {
24
24
  err.stderr = stderr;
@@ -29,6 +29,11 @@ async function exec(cmd, args, options) {
29
29
  }
30
30
  }
31
31
  );
32
+ if (options?.stdin !== void 0 && child.stdin) {
33
+ child.stdin.on("error", () => {
34
+ });
35
+ child.stdin.end(options.stdin);
36
+ }
32
37
  });
33
38
  }
34
39
  function gitExec(args, options) {
@@ -8,7 +8,7 @@ import {
8
8
  modeLabel,
9
9
  pollHealth,
10
10
  startService
11
- } from "./chunk-6NLW72HP.js";
11
+ } from "./chunk-CKPAVQNK.js";
12
12
  import {
13
13
  readGlobalConfig,
14
14
  voluteHome,