volute 0.33.0 → 0.35.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 (255) hide show
  1. package/README.md +7 -6
  2. package/dist/accept-ZBDVVCEU.js +42 -0
  3. package/dist/activity-events-ZW4SDL2C.js +15 -0
  4. package/dist/{ai-service-SBY2WG7O.js → ai-service-LURBEDDB.js} +6 -6
  5. package/dist/{api-client-YPKOZP2O.js → api-client-3A77HMH7.js} +2 -2
  6. package/dist/api.d.ts +1 -5195
  7. package/dist/{archive-INXYFVCW.js → archive-ESU2FUN4.js} +4 -4
  8. package/dist/{auth-GKCDSO4T.js → auth-WX4TESEI.js} +6 -6
  9. package/dist/bridge-PXIO6PS2.js +206 -0
  10. package/dist/chat-QXAJF3FU.js +51 -0
  11. package/dist/{chunk-NNB4WIG7.js → chunk-2TGZJFAT.js} +3 -3
  12. package/dist/{chunk-6LXAAQ43.js → chunk-33ODGMFZ.js} +1 -1
  13. package/dist/{chunk-RPZZSXV3.js → chunk-5N7Y5WAM.js} +21 -2
  14. package/dist/chunk-5T5YMX6S.js +23 -0
  15. package/dist/{chunk-7J3HEVR7.js → chunk-5XJYUFZH.js} +28 -16
  16. package/dist/chunk-7KJOFUNN.js +22 -0
  17. package/dist/{chunk-2NGTS5UU.js → chunk-A2ZLHBHG.js} +2 -2
  18. package/dist/{chunk-KIEPMIM5.js → chunk-AN2W47GW.js} +2 -2
  19. package/dist/{chunk-G53F3JA4.js → chunk-AOB6GVRM.js} +1 -1
  20. package/dist/{chunk-LRCG2JLP.js → chunk-BDYXIWA5.js} +9 -5
  21. package/dist/{chunk-YUIHSKR6.js → chunk-BKF4WQCY.js} +2 -2
  22. package/dist/{chunk-N432I7QH.js → chunk-BMZQYACC.js} +2 -2
  23. package/dist/{chunk-NAOW2CLO.js → chunk-BTY4WNFE.js} +1 -1
  24. package/dist/{chunk-ALEF47VT.js → chunk-BV65KRHM.js} +2 -2
  25. package/dist/{chunk-KVK2DLWI.js → chunk-CORXD635.js} +4 -4
  26. package/dist/{chunk-PVY5W6QN.js → chunk-F7ZNLYKZ.js} +2 -2
  27. package/dist/{chunk-QTUVYI7W.js → chunk-FT5KETXZ.js} +3 -3
  28. package/dist/{chunk-C7I35G4R.js → chunk-IJHIXLVN.js} +44 -8
  29. package/dist/{chunk-JUKK7FPS.js → chunk-J6CJQDWI.js} +37 -28
  30. package/dist/{chunk-4RQBJWQX.js → chunk-LOPXTW6H.js} +1 -1
  31. package/dist/{chunk-RSX4OPZY.js → chunk-MDJGMOSD.js} +8 -137
  32. package/dist/{chunk-LOEJ4HPQ.js → chunk-N446KRP7.js} +3 -3
  33. package/dist/{chunk-I5KY25PQ.js → chunk-N5LMGYXX.js} +2 -2
  34. package/dist/{chunk-G6BSYHPK.js → chunk-NJK5SDGR.js} +1 -1
  35. package/dist/{chunk-D424ZQGI.js → chunk-O7IGP7ZW.js} +11 -3
  36. package/dist/{chunk-M7UL5S3Q.js → chunk-OTC67N2Z.js} +2 -2
  37. package/dist/{chunk-GY5HBI7A.js → chunk-PWQ2ITYG.js} +4 -4
  38. package/dist/{chunk-KTLFDYPT.js → chunk-QCH6K235.js} +1 -1
  39. package/dist/chunk-QHG4OMZL.js +145 -0
  40. package/dist/{chunk-SKLSMHXO.js → chunk-QWTR6AWZ.js} +3 -3
  41. package/dist/chunk-TXSA4Q3V.js +116 -0
  42. package/dist/{chunk-VH33ZWMW.js → chunk-VHJRZM2S.js} +2 -2
  43. package/dist/{chunk-SSI47XP2.js → chunk-VHWGEJ4V.js} +1 -1
  44. package/dist/chunk-VY3RB2V7.js +164 -0
  45. package/dist/chunk-WJPROOU5.js +8314 -0
  46. package/dist/{chunk-RVGLDGMI.js → chunk-WZRZFFCL.js} +25 -27
  47. package/dist/{chunk-JYVGHWEJ.js → chunk-XRQSAMX2.js} +4 -4
  48. package/dist/{chunk-OYAKCAVY.js → chunk-ZSR72JB3.js} +1 -1
  49. package/dist/{chunk-UKVWJRKN.js → chunk-ZX7EAV5J.js} +17 -7
  50. package/dist/cli.js +90 -29
  51. package/dist/clock-HSEKS5AR.js +289 -0
  52. package/dist/{cloud-sync-4NWLMFVH.js → cloud-sync-6JL4C24T.js} +22 -23
  53. package/dist/config-UTS7QULS.js +76 -0
  54. package/dist/connectors/discord-bridge.js +4 -4
  55. package/dist/connectors/slack-bridge.js +4 -4
  56. package/dist/connectors/telegram-bridge.js +4 -4
  57. package/dist/{conversations-AWI5SZW2.js → conversations-2PW57WO2.js} +6 -6
  58. package/dist/create-5BPOOJAN.js +75 -0
  59. package/dist/create-UVCK2CS6.js +50 -0
  60. package/dist/daemon-client-RVIKXGFQ.js +12 -0
  61. package/dist/daemon-restart-HSZ3BCX5.js +65 -0
  62. package/dist/daemon.js +1349 -1211
  63. package/dist/db-BDMH4SZ2.js +20 -0
  64. package/dist/db-BVBJ57TU.js +9 -0
  65. package/dist/delete-L5PAVDGQ.js +42 -0
  66. package/dist/delivery-manager-H5ZVBMCQ.js +31 -0
  67. package/dist/{delivery-router-FL45JL7N.js → delivery-router-HEJSJAHQ.js} +5 -5
  68. package/dist/down-74VXM45A.js +17 -0
  69. package/dist/env-E4XHO2BI.js +223 -0
  70. package/dist/exec-PY7THYH4.js +17 -0
  71. package/dist/export-OAS6QVBN.js +113 -0
  72. package/dist/extension-D74CNM7G.js +89 -0
  73. package/dist/extensions-XDDFY72A.js +49 -0
  74. package/dist/files-CWTK6V3H.js +53 -0
  75. package/dist/import-5A3T7QV4.js +143 -0
  76. package/dist/{isolation-LLAYQYDY.js → isolation-TK5RX2WM.js} +4 -4
  77. package/dist/join-DF5XSJAC.js +67 -0
  78. package/dist/lib-DYEZMGW7.js +6588 -0
  79. package/dist/list-PDMQM7ZV.js +53 -0
  80. package/dist/login-7TE6CIZF.js +60 -0
  81. package/dist/login-GOTAYLXP.js +51 -0
  82. package/dist/logout-6KIA74EV.js +29 -0
  83. package/dist/logout-T4XS6LRU.js +50 -0
  84. package/dist/message-delivery-GRC4W6P7.js +41 -0
  85. package/dist/mind-5IEYKV7I.js +97 -0
  86. package/dist/mind-activity-tracker-QBLIV7ZJ.js +18 -0
  87. package/dist/mind-history-IE2QH7U5.js +275 -0
  88. package/dist/mind-list-GEWHWAL4.js +38 -0
  89. package/dist/mind-manager-HFLB5653.js +31 -0
  90. package/dist/mind-profile-DCBDVF5B.js +53 -0
  91. package/dist/mind-service-X2CAA6W6.js +37 -0
  92. package/dist/mind-sleep-ITCF6OQA.js +47 -0
  93. package/dist/mind-status-X4SX3YUG.js +65 -0
  94. package/dist/mind-wake-KXMKMGWX.js +42 -0
  95. package/dist/{package-U3VFO273.js → package-D2FSVFAX.js} +11 -8
  96. package/dist/read-67VRP2DO.js +91 -0
  97. package/dist/{read-stdin-HQJ7774D.js → read-stdin-3X5VYKNS.js} +2 -2
  98. package/dist/register-SB7NXCOE.js +51 -0
  99. package/dist/{registry-PJ4S5PHQ.js → registry-GBSNW3HG.js} +3 -3
  100. package/dist/reject-MUR2KWJ4.js +40 -0
  101. package/dist/restart-5EGG4JXU.js +42 -0
  102. package/dist/{sandbox-GJOK4QLQ.js → sandbox-R37VIU36.js} +6 -6
  103. package/dist/scheduler-Y7O4CJXL.js +31 -0
  104. package/dist/{schema-PA3M5ZKH.js → schema-XVZ2CLKW.js} +4 -2
  105. package/dist/{seed-QDYVLG74.js → seed-EQORWX77.js} +3 -3
  106. package/dist/seed-check-KJNTL72M.js +35 -0
  107. package/dist/seed-cmd-ZM2XGVU2.js +30 -0
  108. package/dist/seed-create-DRWGGHEI.js +113 -0
  109. package/dist/seed-sprout-JYXGXOP3.js +148 -0
  110. package/dist/send-JBJJQ7CA.js +409 -0
  111. package/dist/service-WNPCNHOX.js +121 -0
  112. package/dist/{setup-XMCBE3LF.js → setup-BJ4YAY26.js} +155 -129
  113. package/dist/{setup-TISPCO22.js → setup-RHJRFURI.js} +4 -4
  114. package/dist/skill-TAAKEYBV.js +389 -0
  115. package/dist/skills/plan-coordinator/SKILL.md +60 -0
  116. package/dist/skills/volute-mind/SKILL.md +9 -227
  117. package/dist/skills/volute-mind/references/extensions.md +34 -0
  118. package/dist/skills/volute-mind/references/integrations.md +48 -0
  119. package/dist/skills/volute-mind/references/routing.md +86 -0
  120. package/dist/skills/volute-mind/references/sleep.md +33 -0
  121. package/dist/skills/volute-mind/references/variants.md +31 -0
  122. package/dist/{skills-7FV7EJTE.js → skills-EKMCQ46K.js} +12 -8
  123. package/dist/sleep-manager-7KFK3USC.js +35 -0
  124. package/dist/spirit-ZFRDXMG7.js +23 -0
  125. package/dist/split-AWVOYOPZ.js +64 -0
  126. package/dist/{sprout-WKLZXUIQ.js → sprout-HE4TITMK.js} +3 -3
  127. package/dist/start-3UXOPXQG.js +39 -0
  128. package/dist/status-ZK34WYIM.js +125 -0
  129. package/dist/stop-3XYIBGFM.js +41 -0
  130. package/dist/system-chat-IDPHYHY4.js +35 -0
  131. package/dist/systems-O43WGQY6.js +52 -0
  132. package/dist/{tailscale-XHQBZROW.js → tailscale-ZIZ2HWJ5.js} +5 -5
  133. package/dist/template-hash-A7FNHTB7.js +9 -0
  134. package/dist/up-77ICEDEW.js +19 -0
  135. package/dist/update-ANE5ZM7F.js +225 -0
  136. package/dist/{update-check-ZD6OOIYQ.js → update-check-UV55CBEP.js} +4 -4
  137. package/dist/upgrade-ZMDGC7M2.js +74 -0
  138. package/dist/variant-QWL2WSRI.js +62 -0
  139. package/dist/{version-notify-NBI2MTJO.js → version-notify-FXSEMXWW.js} +29 -28
  140. package/dist/{volute-config-HD7WWUQC.js → volute-config-D2XVS2YI.js} +2 -2
  141. package/dist/web-assets/assets/index-BhxWKvbB.css +1 -0
  142. package/dist/web-assets/assets/index-CHVKJ9II.js +75 -0
  143. package/dist/web-assets/ext-theme.css +48 -9
  144. package/dist/web-assets/index.html +2 -2
  145. package/dist/web-assets/sw.js +117 -0
  146. package/drizzle/0005_meta_summaries.sql +15 -0
  147. package/drizzle/meta/0005_snapshot.json +7 -0
  148. package/drizzle/meta/_journal.json +7 -0
  149. package/package.json +10 -7
  150. package/packages/extensions/pages/dist/ui/assets/index-DKZLNMED.js +2 -0
  151. package/packages/extensions/pages/dist/ui/index.html +1 -1
  152. package/packages/extensions/pages/skills/pages/SKILL.md +84 -9
  153. package/packages/extensions/plan/dist/ui/assets/index-CJj2gZnZ.css +1 -0
  154. package/packages/extensions/plan/dist/ui/assets/index-FMEJmvQz.js +61 -0
  155. package/packages/extensions/plan/dist/ui/index.html +14 -0
  156. package/packages/extensions/plan/skills/plan/SKILL.md +43 -0
  157. package/packages/extensions/plan/skills/plan/scripts/plan-hook.sh +37 -0
  158. package/templates/_base/home/VOLUTE.md +12 -19
  159. package/templates/_base/src/lib/auto-commit.ts +8 -8
  160. package/templates/_base/src/lib/context-breakdown.ts +450 -0
  161. package/templates/_base/src/lib/format-prefix.ts +17 -0
  162. package/templates/_base/src/lib/hook-loader.ts +8 -2
  163. package/templates/_base/src/lib/router.ts +75 -33
  164. package/templates/_base/src/lib/routing.ts +4 -1
  165. package/templates/_base/src/lib/startup.ts +16 -8
  166. package/templates/_base/src/lib/types.ts +2 -1
  167. package/templates/_base/src/lib/volute-server.ts +75 -8
  168. package/templates/claude/.init/CLAUDE.md +4 -10
  169. package/templates/claude/package.json.tmpl +1 -0
  170. package/templates/claude/src/agent.ts +108 -33
  171. package/templates/claude/src/lib/hooks/reply-instructions.ts +27 -7
  172. package/templates/claude/src/lib/stream-consumer.ts +2 -2
  173. package/templates/claude/src/server.ts +1 -0
  174. package/templates/codex/package.json.tmpl +1 -0
  175. package/templates/codex/src/agent.ts +80 -8
  176. package/templates/codex/src/server.ts +1 -4
  177. package/templates/pi/package.json.tmpl +1 -0
  178. package/templates/pi/src/agent.ts +115 -36
  179. package/templates/pi/src/lib/event-handler.ts +22 -7
  180. package/templates/pi/src/lib/reply-instructions-extension.ts +23 -4
  181. package/templates/pi/src/lib/subagents.ts +20 -17
  182. package/templates/pi/src/server.ts +2 -5
  183. package/dist/accept-D5VBM7JW.js +0 -42
  184. package/dist/activity-events-XJO3P4RR.js +0 -15
  185. package/dist/bridge-TXWWPPOJ.js +0 -207
  186. package/dist/chat-U5ZOME3O.js +0 -68
  187. package/dist/chunk-3Z2DPESO.js +0 -3634
  188. package/dist/chunk-A2A4KLFE.js +0 -1528
  189. package/dist/chunk-K3NQKI34.js +0 -10
  190. package/dist/chunk-NPKSDYA2.js +0 -156
  191. package/dist/chunk-PB65JZK2.js +0 -85
  192. package/dist/clock-BVH3V6E3.js +0 -266
  193. package/dist/config-H2H4UIF7.js +0 -72
  194. package/dist/create-2FK7Z46Y.js +0 -44
  195. package/dist/create-YWD2TIP4.js +0 -71
  196. package/dist/daemon-client-6QXHZ7US.js +0 -12
  197. package/dist/daemon-restart-GOBUKLX7.js +0 -52
  198. package/dist/db-F34YLV7D.js +0 -9
  199. package/dist/db-RA45JBFG.js +0 -16
  200. package/dist/delete-QTGWEDBI.js +0 -35
  201. package/dist/delivery-manager-PFAKEJTC.js +0 -32
  202. package/dist/down-FWWTEKXM.js +0 -15
  203. package/dist/env-JCOF2222.js +0 -191
  204. package/dist/export-SUYRLI5Q.js +0 -112
  205. package/dist/extension-OBTGKQQD.js +0 -175
  206. package/dist/extensions-KYNTVTMO.js +0 -30
  207. package/dist/files-65PMW5IK.js +0 -47
  208. package/dist/history-DKCDI3JO.js +0 -128
  209. package/dist/import-DDUFE7AY.js +0 -23
  210. package/dist/join-I5QEE3LG.js +0 -66
  211. package/dist/list-JQ463EDA.js +0 -41
  212. package/dist/login-D7ETSU4R.js +0 -47
  213. package/dist/login-RIJF2F4G.js +0 -47
  214. package/dist/logout-5MLHZALK.js +0 -40
  215. package/dist/logout-UZJRGY4Z.js +0 -21
  216. package/dist/message-delivery-DFF5SJRM.js +0 -42
  217. package/dist/mind-IOJFLEM5.js +0 -108
  218. package/dist/mind-activity-tracker-F6O4Q2SL.js +0 -18
  219. package/dist/mind-list-WUPMQDYQ.js +0 -30
  220. package/dist/mind-manager-NBJF5D26.js +0 -32
  221. package/dist/mind-profile-P67FEHOY.js +0 -47
  222. package/dist/mind-service-2MQ6UK5N.js +0 -38
  223. package/dist/mind-sleep-WW2IX7JT.js +0 -42
  224. package/dist/mind-status-L3EFFRPR.js +0 -56
  225. package/dist/mind-wake-VSSGW465.js +0 -37
  226. package/dist/read-EBY56C33.js +0 -75
  227. package/dist/register-HD74C4TT.js +0 -47
  228. package/dist/reject-UJKFBHRO.js +0 -40
  229. package/dist/restart-3UCMRUVC.js +0 -33
  230. package/dist/scheduler-ZZ7XGQG6.js +0 -32
  231. package/dist/seed-check-S2IX25RL.js +0 -32
  232. package/dist/seed-cmd-DKOUFEAU.js +0 -36
  233. package/dist/seed-create-4XBBOLRH.js +0 -112
  234. package/dist/seed-sprout-GQEIIQRT.js +0 -132
  235. package/dist/send-QIV2INHB.js +0 -373
  236. package/dist/skill-PSQGRRJX.js +0 -358
  237. package/dist/skills/shared-files/SKILL.md +0 -44
  238. package/dist/skills/shared-files/scripts/merge.ts +0 -72
  239. package/dist/skills/shared-files/scripts/pull.ts +0 -52
  240. package/dist/sleep-manager-JTXSN7NV.js +0 -36
  241. package/dist/spirit-VRONKFMF.js +0 -23
  242. package/dist/split-STOROBYJ.js +0 -63
  243. package/dist/start-K2NCUUCG.js +0 -33
  244. package/dist/status-3JBTFSMI.js +0 -115
  245. package/dist/stop-H26JZDXF.js +0 -32
  246. package/dist/system-chat-JAPOJ3KE.js +0 -36
  247. package/dist/systems-XRI52VCH.js +0 -61
  248. package/dist/template-hash-A6VVKOXJ.js +0 -9
  249. package/dist/up-M5AS6SBV.js +0 -18
  250. package/dist/update-UD543CXX.js +0 -215
  251. package/dist/upgrade-O4Q7WJM3.js +0 -67
  252. package/dist/variant-7TGZHOU3.js +0 -41
  253. package/dist/web-assets/assets/index-CWJrVveV.css +0 -1
  254. package/dist/web-assets/assets/index-DJt14FRI.js +0 -75
  255. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +0 -2
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-YUIHSKR6.js";
4
+ } from "./chunk-BKF4WQCY.js";
5
5
  import {
6
6
  getDb
7
- } from "./chunk-LRCG2JLP.js";
7
+ } from "./chunk-BDYXIWA5.js";
8
8
  import {
9
9
  activity
10
- } from "./chunk-RPZZSXV3.js";
10
+ } from "./chunk-5N7Y5WAM.js";
11
11
 
12
- // src/lib/events/activity-events.ts
12
+ // packages/daemon/src/lib/events/activity-events.ts
13
13
  var subscribers = /* @__PURE__ */ new Set();
14
14
  function subscribe(callback) {
15
15
  subscribers.add(callback);
@@ -3,9 +3,9 @@ import {
3
3
  composeTemplate,
4
4
  findTemplatesRoot,
5
5
  listFiles
6
- } from "./chunk-G53F3JA4.js";
6
+ } from "./chunk-AOB6GVRM.js";
7
7
 
8
- // src/lib/template-hash.ts
8
+ // packages/daemon/src/lib/template-hash.ts
9
9
  import { createHash } from "crypto";
10
10
  import { existsSync, readFileSync, rmSync } from "fs";
11
11
  import { resolve } from "path";
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-YUIHSKR6.js";
4
+ } from "./chunk-BKF4WQCY.js";
5
5
  import {
6
6
  readGlobalConfig,
7
7
  writeGlobalConfig
8
- } from "./chunk-N432I7QH.js";
8
+ } from "./chunk-BMZQYACC.js";
9
9
 
10
- // src/lib/ai-service.ts
10
+ // packages/daemon/src/lib/ai-service.ts
11
11
  import { complete, getEnvApiKey, getModel, getModels, getProviders } from "@mariozechner/pi-ai";
12
12
  import { getOAuthApiKey } from "@mariozechner/pi-ai/oauth";
13
13
  var aiLog = logger_default.child("ai-service");
@@ -1,24 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-YUIHSKR6.js";
4
+ } from "./chunk-BKF4WQCY.js";
5
5
  import {
6
6
  exec,
7
7
  gitExec
8
- } from "./chunk-KIEPMIM5.js";
8
+ } from "./chunk-AN2W47GW.js";
9
9
  import {
10
10
  readGlobalConfig,
11
11
  writeGlobalConfig
12
- } from "./chunk-N432I7QH.js";
12
+ } from "./chunk-BMZQYACC.js";
13
13
  import {
14
14
  getDb,
15
+ mindDir,
16
+ readRegistry,
15
17
  voluteHome
16
- } from "./chunk-LRCG2JLP.js";
18
+ } from "./chunk-BDYXIWA5.js";
17
19
  import {
18
20
  sharedSkills
19
- } from "./chunk-RPZZSXV3.js";
21
+ } from "./chunk-5N7Y5WAM.js";
20
22
 
21
- // src/lib/skills.ts
23
+ // packages/daemon/src/lib/skills.ts
22
24
  import { createHash } from "crypto";
23
25
  import {
24
26
  cpSync,
@@ -34,7 +36,7 @@ import { basename, dirname, join, resolve } from "path";
34
36
  import { eq, sql } from "drizzle-orm";
35
37
  var VALID_SKILL_ID = /^[a-zA-Z0-9_-]+$/;
36
38
  var SEED_SKILLS = ["orientation", "memory"];
37
- var STANDARD_SKILLS = ["volute-mind", "memory", "dreaming", "shared-files"];
39
+ var STANDARD_SKILLS = ["volute-mind", "memory", "dreaming"];
38
40
  function getStandardSkillsWithExtensions() {
39
41
  const config = readGlobalConfig();
40
42
  if (config.defaultSkills) return [...config.defaultSkills];
@@ -44,7 +46,7 @@ async function initDefaultSkills() {
44
46
  const config = readGlobalConfig();
45
47
  let extensionSkills = [];
46
48
  try {
47
- const { getExtensionStandardSkills } = await import("./extensions-KYNTVTMO.js");
49
+ const { getExtensionStandardSkills } = await import("./extensions-XDDFY72A.js");
48
50
  extensionSkills = getExtensionStandardSkills();
49
51
  } catch (err) {
50
52
  logger_default.warn("failed to load extension standard skills during init", logger_default.errorData(err));
@@ -527,6 +529,38 @@ function hashSkillDir(dir) {
527
529
  }
528
530
  return hash.digest("hex");
529
531
  }
532
+ function isAutoUpdateSkillsEnabled() {
533
+ return readGlobalConfig().autoUpdateSkills !== false;
534
+ }
535
+ async function autoUpdateMindSkills() {
536
+ const baseMinds = await readRegistry();
537
+ const shared = await listSharedSkills();
538
+ const sharedMap = new Map(shared.map((s) => [s.id, s]));
539
+ for (const mind of baseMinds) {
540
+ const dir = mind.dir ?? mindDir(mind.name);
541
+ const skillsDir = mindSkillsDir(dir);
542
+ if (!existsSync(skillsDir)) continue;
543
+ const entries = readdirSync(skillsDir, { withFileTypes: true }).filter((e) => e.isDirectory());
544
+ for (const entry of entries) {
545
+ const upstream = readUpstream(join(skillsDir, entry.name));
546
+ if (!upstream) continue;
547
+ const sharedSkill = sharedMap.get(upstream.source);
548
+ if (!sharedSkill || sharedSkill.version <= upstream.version) continue;
549
+ try {
550
+ const result = await updateSkill(mind.name, dir, entry.name);
551
+ if (result.status === "updated") {
552
+ logger_default.info(`auto-updated skill ${entry.name} for ${mind.name} (v${sharedSkill.version})`);
553
+ } else if (result.status === "conflict") {
554
+ logger_default.warn(
555
+ `auto-update conflict for skill ${entry.name} in ${mind.name}: ${result.conflictFiles.join(", ")}`
556
+ );
557
+ }
558
+ } catch (err) {
559
+ logger_default.error(`failed to auto-update skill ${entry.name} for ${mind.name}`, logger_default.errorData(err));
560
+ }
561
+ }
562
+ }
563
+ }
530
564
  async function syncBuiltinSkills() {
531
565
  let skillsRoot;
532
566
  try {
@@ -579,5 +613,7 @@ export {
579
613
  listFilesRecursive,
580
614
  findSkillsRoot,
581
615
  hashSkillDir,
616
+ isAutoUpdateSkillsEnabled,
617
+ autoUpdateMindSkills,
582
618
  syncBuiltinSkills
583
619
  };
@@ -5,10 +5,13 @@ import {
5
5
  pollHealthDown,
6
6
  readDaemonConfig,
7
7
  stopService
8
- } from "./chunk-NNB4WIG7.js";
8
+ } from "./chunk-2TGZJFAT.js";
9
+ import {
10
+ command
11
+ } from "./chunk-TXSA4Q3V.js";
9
12
  import {
10
13
  voluteSystemDir
11
- } from "./chunk-LRCG2JLP.js";
14
+ } from "./chunk-BDYXIWA5.js";
12
15
 
13
16
  // src/commands/down.ts
14
17
  import { existsSync, readFileSync, unlinkSync } from "fs";
@@ -103,36 +106,42 @@ async function stopDaemon() {
103
106
  console.error("Daemon did not exit cleanly, sent SIGKILL.");
104
107
  return { stopped: true, clean: false };
105
108
  }
106
- async function run(_args) {
107
- const mode = getServiceMode();
108
- if (mode !== "manual") {
109
- console.log(`Stopping volute (${modeLabel(mode)})...`);
110
- try {
111
- await stopService(mode);
112
- } catch (err) {
113
- console.error(`Failed to stop service: ${err instanceof Error ? err.message : err}`);
114
- process.exit(1);
109
+ var cmd = command({
110
+ name: "volute down",
111
+ description: "Stop the daemon",
112
+ flags: {},
113
+ run: async () => {
114
+ const mode = getServiceMode();
115
+ if (mode !== "manual") {
116
+ console.log(`Stopping volute (${modeLabel(mode)})...`);
117
+ try {
118
+ await stopService(mode);
119
+ } catch (err) {
120
+ console.error(`Failed to stop service: ${err instanceof Error ? err.message : err}`);
121
+ process.exit(1);
122
+ }
123
+ const config = readDaemonConfig();
124
+ if (await pollHealthDown("127.0.0.1", config.internalPort ?? config.port)) {
125
+ console.log("Daemon stopped.");
126
+ } else {
127
+ console.error("Service stopped but daemon may still be responding.");
128
+ process.exit(1);
129
+ }
130
+ return;
115
131
  }
116
- const config = readDaemonConfig();
117
- if (await pollHealthDown("127.0.0.1", config.internalPort ?? config.port)) {
118
- console.log("Daemon stopped.");
119
- } else {
120
- console.error("Service stopped but daemon may still be responding.");
132
+ const result = await stopDaemon();
133
+ if (result.stopped) return;
134
+ if (result.reason === "orphan") {
135
+ console.error(`Daemon appears to be running on port ${result.port} but PID file is missing.`);
136
+ console.error(`Kill the process manually: lsof -ti :${result.port} | xargs kill`);
137
+ process.exit(1);
138
+ } else if (result.reason === "kill-failed") {
121
139
  process.exit(1);
122
140
  }
123
- return;
141
+ console.log("Daemon is not running.");
124
142
  }
125
- const result = await stopDaemon();
126
- if (result.stopped) return;
127
- if (result.reason === "orphan") {
128
- console.error(`Daemon appears to be running on port ${result.port} but PID file is missing.`);
129
- console.error(`Kill the process manually: lsof -ti :${result.port} | xargs kill`);
130
- process.exit(1);
131
- } else if (result.reason === "kill-failed") {
132
- process.exit(1);
133
- }
134
- console.log("Daemon is not running.");
135
- }
143
+ });
144
+ var run = cmd.execute;
136
145
 
137
146
  export {
138
147
  stopDaemon,
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/lib/api-client.ts
3
+ // packages/cli/src/lib/api-client.ts
4
4
  import { hc } from "hono/client";
5
5
  var _client;
6
6
  function getClient() {
@@ -3,34 +3,20 @@ import {
3
3
  readEnv,
4
4
  sharedEnvPath,
5
5
  writeEnv
6
- } from "./chunk-2NGTS5UU.js";
6
+ } from "./chunk-A2ZLHBHG.js";
7
7
  import {
8
8
  logger_default
9
- } from "./chunk-YUIHSKR6.js";
10
- import {
11
- parseArgs
12
- } from "./chunk-D424ZQGI.js";
9
+ } from "./chunk-BKF4WQCY.js";
13
10
  import {
14
11
  voluteSystemDir
15
- } from "./chunk-LRCG2JLP.js";
12
+ } from "./chunk-BDYXIWA5.js";
16
13
 
17
- // src/commands/import.ts
18
- import {
19
- closeSync,
20
- existsSync as existsSync2,
21
- mkdirSync,
22
- openSync,
23
- readdirSync,
24
- readFileSync as readFileSync2,
25
- readSync,
26
- rmSync,
27
- statSync,
28
- writeFileSync as writeFileSync2
29
- } from "fs";
30
- import { homedir, tmpdir } from "os";
14
+ // packages/daemon/src/lib/import-utils.ts
15
+ import { existsSync as existsSync2, mkdirSync, readdirSync, readFileSync as readFileSync2, statSync, writeFileSync as writeFileSync2 } from "fs";
16
+ import { homedir } from "os";
31
17
  import { basename, resolve as resolve2 } from "path";
32
18
 
33
- // src/lib/bridges.ts
19
+ // packages/daemon/src/lib/bridges.ts
34
20
  import { existsSync, readFileSync, writeFileSync } from "fs";
35
21
  import { resolve } from "path";
36
22
  function bridgesPath() {
@@ -99,121 +85,7 @@ function findBridgeForChannel(voluteChannelName) {
99
85
  return null;
100
86
  }
101
87
 
102
- // src/commands/import.ts
103
- async function run(args) {
104
- const { positional, flags } = parseArgs(args, {
105
- name: { type: "string" },
106
- session: { type: "string" },
107
- template: { type: "string" }
108
- });
109
- const inputPath = positional[0];
110
- if (inputPath && (inputPath.endsWith(".volute") || isZipFile(inputPath))) {
111
- await importArchive(resolve2(inputPath), flags.name);
112
- return;
113
- }
114
- const wsDir = resolveWorkspace(inputPath);
115
- const { daemonFetch } = await import("./daemon-client-6QXHZ7US.js");
116
- const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
117
- const client = getClient();
118
- const res = await daemonFetch(urlOf(client.api.minds.import.$url()), {
119
- method: "POST",
120
- headers: { "Content-Type": "application/json" },
121
- body: JSON.stringify({
122
- workspacePath: wsDir,
123
- name: flags.name,
124
- template: flags.template,
125
- sessionPath: flags.session
126
- })
127
- });
128
- const data = await res.json();
129
- if (!res.ok) {
130
- console.error(data.error ?? "Failed to import mind");
131
- process.exit(1);
132
- }
133
- console.log(`
134
- ${data.message ?? `Imported mind: ${data.name} (port ${data.port})`}`);
135
- console.log(`
136
- volute mind start ${data.name}`);
137
- }
138
- function isZipFile(path) {
139
- const resolved = resolve2(path);
140
- if (!existsSync2(resolved)) return false;
141
- const fd = openSync(resolved, "r");
142
- try {
143
- const buf = Buffer.alloc(4);
144
- const bytesRead = readSync(fd, buf, 0, 4, 0);
145
- return bytesRead === 4 && buf[0] === 80 && buf[1] === 75 && buf[2] === 3 && buf[3] === 4;
146
- } finally {
147
- closeSync(fd);
148
- }
149
- }
150
- async function importArchive(archivePath, nameOverride) {
151
- if (!existsSync2(archivePath)) {
152
- console.error(`File not found: ${archivePath}`);
153
- process.exit(1);
154
- }
155
- const { extractArchive } = await import("./archive-INXYFVCW.js");
156
- const tempDir = resolve2(tmpdir(), `volute-import-${Date.now()}`);
157
- mkdirSync(tempDir, { recursive: true });
158
- let extracted;
159
- try {
160
- extracted = extractArchive(archivePath, tempDir);
161
- } catch (err) {
162
- rmSync(tempDir, { recursive: true, force: true });
163
- console.error(`Failed to extract archive: ${err.message}`);
164
- process.exit(1);
165
- }
166
- try {
167
- const { daemonFetch } = await import("./daemon-client-6QXHZ7US.js");
168
- const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
169
- const client = getClient();
170
- const res = await daemonFetch(urlOf(client.api.minds.import.$url()), {
171
- method: "POST",
172
- headers: { "Content-Type": "application/json" },
173
- body: JSON.stringify({
174
- archivePath: tempDir,
175
- name: nameOverride,
176
- manifest: extracted.manifest
177
- })
178
- });
179
- const data = await res.json();
180
- if (!res.ok) {
181
- console.error(data.error ?? "Failed to import mind");
182
- process.exit(1);
183
- }
184
- console.log(`
185
- ${data.message ?? `Imported mind: ${data.name} (port ${data.port})`}`);
186
- console.log(`
187
- volute mind start ${data.name}`);
188
- } catch (err) {
189
- rmSync(tempDir, { recursive: true, force: true });
190
- throw err;
191
- }
192
- }
193
- function resolveWorkspace(explicitPath) {
194
- if (explicitPath) {
195
- const wsDir = resolve2(explicitPath);
196
- if (!existsSync2(resolve2(wsDir, "SOUL.md")) || !existsSync2(resolve2(wsDir, "IDENTITY.md"))) {
197
- console.error("Not a valid OpenClaw workspace: missing SOUL.md or IDENTITY.md");
198
- process.exit(1);
199
- }
200
- return wsDir;
201
- }
202
- const cwd = process.cwd();
203
- if (existsSync2(resolve2(cwd, "SOUL.md")) && existsSync2(resolve2(cwd, "IDENTITY.md"))) {
204
- console.log(`Using workspace: ${cwd}`);
205
- return cwd;
206
- }
207
- const openclawWs = resolve2(homedir(), ".openclaw/workspace");
208
- if (existsSync2(resolve2(openclawWs, "SOUL.md")) && existsSync2(resolve2(openclawWs, "IDENTITY.md"))) {
209
- console.log(`Using workspace: ${openclawWs}`);
210
- return openclawWs;
211
- }
212
- console.error(
213
- "Usage: volute mind import [<workspace-path>] [--name <name>] [--session <path>] [--template <name>]\n\nNo OpenClaw workspace found. Provide a path, run from a workspace, or ensure ~/.openclaw/workspace exists."
214
- );
215
- process.exit(1);
216
- }
88
+ // packages/daemon/src/lib/import-utils.ts
217
89
  function findOpenClawSession(workspaceDir) {
218
90
  const ocAgentsDir = resolve2(homedir(), ".openclaw/agents");
219
91
  if (!existsSync2(ocAgentsDir)) return void 0;
@@ -327,7 +199,6 @@ export {
327
199
  removeChannelMapping,
328
200
  resolveChannelMapping,
329
201
  findBridgeForChannel,
330
- run,
331
202
  findOpenClawSession,
332
203
  sessionMatchesWorkspace,
333
204
  importPiSession,
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  publish
4
- } from "./chunk-KVK2DLWI.js";
4
+ } from "./chunk-CORXD635.js";
5
5
  import {
6
6
  logger_default
7
- } from "./chunk-YUIHSKR6.js";
7
+ } from "./chunk-BKF4WQCY.js";
8
8
 
9
- // src/lib/events/mind-activity-tracker.ts
9
+ // packages/daemon/src/lib/events/mind-activity-tracker.ts
10
10
  var IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
11
11
  var minds = /* @__PURE__ */ new Map();
12
12
  function getState(mind) {
@@ -2,9 +2,9 @@
2
2
  import {
3
3
  mindDir,
4
4
  stateDir
5
- } from "./chunk-LRCG2JLP.js";
5
+ } from "./chunk-BDYXIWA5.js";
6
6
 
7
- // src/lib/archive.ts
7
+ // packages/daemon/src/lib/archive.ts
8
8
  import { execFileSync } from "child_process";
9
9
  import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "fs";
10
10
  import { join, relative, resolve } from "path";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/lib/slugify.ts
3
+ // packages/daemon/src/lib/slugify.ts
4
4
  function slugify(text) {
5
5
  return text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
6
6
  }
@@ -1,18 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/lib/parse-args.ts
3
+ // packages/cli/src/lib/parse-args.ts
4
4
  function parseArgs(args, flags) {
5
5
  const positional = [];
6
6
  const result = {};
7
+ let help = false;
7
8
  for (const [key, def] of Object.entries(flags)) {
8
9
  result[key] = def.type === "boolean" ? false : void 0;
9
10
  }
10
11
  for (let i = 0; i < args.length; i++) {
11
12
  const arg = args[i];
13
+ if (arg === "--help" || arg === "-h") {
14
+ help = true;
15
+ continue;
16
+ }
12
17
  if (arg.startsWith("--")) {
13
18
  const name = arg.slice(2);
14
19
  const def = flags[name];
15
- if (!def) continue;
20
+ if (!def) {
21
+ console.error(`Warning: unknown flag --${name}`);
22
+ continue;
23
+ }
16
24
  if (def.type === "boolean") {
17
25
  result[name] = true;
18
26
  } else if (i + 1 < args.length) {
@@ -23,7 +31,7 @@ function parseArgs(args, flags) {
23
31
  positional.push(arg);
24
32
  }
25
33
  }
26
- return { positional, flags: result };
34
+ return { positional, flags: result, help };
27
35
  }
28
36
 
29
37
  export {
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  voluteSystemDir
4
- } from "./chunk-LRCG2JLP.js";
4
+ } from "./chunk-BDYXIWA5.js";
5
5
 
6
- // src/lib/update-check.ts
6
+ // packages/daemon/src/lib/update-check.ts
7
7
  import { existsSync, readFileSync, writeFileSync } from "fs";
8
8
  import { resolve } from "path";
9
9
  var CACHE_TTL = 60 * 60 * 1e3;
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-YUIHSKR6.js";
4
+ } from "./chunk-BKF4WQCY.js";
5
5
  import {
6
6
  readGlobalConfig
7
- } from "./chunk-N432I7QH.js";
7
+ } from "./chunk-BMZQYACC.js";
8
8
  import {
9
9
  getBaseName,
10
10
  readRegistry,
11
11
  voluteHome,
12
12
  voluteSystemDir,
13
13
  voluteUserHome
14
- } from "./chunk-LRCG2JLP.js";
14
+ } from "./chunk-BDYXIWA5.js";
15
15
 
16
- // src/lib/sandbox.ts
16
+ // packages/daemon/src/lib/sandbox.ts
17
17
  import { resolve } from "path";
18
18
  var slog = logger_default.child("sandbox");
19
19
  var sandboxManager = null;
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/connectors/bridge-sdk.ts
3
+ // packages/daemon/src/connectors/bridge-sdk.ts
4
4
  function loadBridgeEnv() {
5
5
  const daemonUrl = process.env.VOLUTE_DAEMON_URL;
6
6
  const daemonToken = process.env.VOLUTE_DAEMON_TOKEN;