volute 0.34.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 (209) hide show
  1. package/README.md +7 -6
  2. package/dist/accept-ZBDVVCEU.js +42 -0
  3. package/dist/{activity-events-BN7V6KCC.js → activity-events-ZW4SDL2C.js} +4 -4
  4. package/dist/{ai-service-PSILB5WD.js → ai-service-LURBEDDB.js} +5 -5
  5. package/dist/{api-client-XUXOB7LI.js → api-client-3A77HMH7.js} +1 -1
  6. package/dist/api.d.ts +1 -5618
  7. package/dist/{archive-C2VEMQOR.js → archive-ESU2FUN4.js} +3 -3
  8. package/dist/{auth-ZFZXJZDQ.js → auth-WX4TESEI.js} +5 -5
  9. package/dist/bridge-PXIO6PS2.js +206 -0
  10. package/dist/chat-QXAJF3FU.js +51 -0
  11. package/dist/{chunk-7F2SW2KD.js → chunk-2TGZJFAT.js} +3 -3
  12. package/dist/{chunk-6LXAAQ43.js → chunk-33ODGMFZ.js} +1 -1
  13. package/dist/{chunk-4JSR7YO7.js → chunk-5N7Y5WAM.js} +1 -1
  14. package/dist/{chunk-FYCALD4Q.js → chunk-5T5YMX6S.js} +1 -1
  15. package/dist/{chunk-B2BVAIZ4.js → chunk-5XJYUFZH.js} +21 -15
  16. package/dist/{chunk-M3K5AARV.js → chunk-A2ZLHBHG.js} +2 -2
  17. package/dist/{chunk-U5BTYSAL.js → chunk-AN2W47GW.js} +2 -2
  18. package/dist/{chunk-G53F3JA4.js → chunk-AOB6GVRM.js} +1 -1
  19. package/dist/{chunk-N7BLAHNE.js → chunk-BDYXIWA5.js} +5 -5
  20. package/dist/{chunk-YUIHSKR6.js → chunk-BKF4WQCY.js} +2 -2
  21. package/dist/{chunk-6OWJXUAR.js → chunk-BMZQYACC.js} +2 -2
  22. package/dist/{chunk-NAOW2CLO.js → chunk-BTY4WNFE.js} +1 -1
  23. package/dist/{chunk-MLOQKQNB.js → chunk-BV65KRHM.js} +2 -2
  24. package/dist/{chunk-XWXBJQBE.js → chunk-CORXD635.js} +4 -4
  25. package/dist/{chunk-PVY5W6QN.js → chunk-F7ZNLYKZ.js} +2 -2
  26. package/dist/{chunk-BFWHBQK4.js → chunk-FT5KETXZ.js} +3 -3
  27. package/dist/{chunk-N3DNFPVA.js → chunk-IJHIXLVN.js} +8 -8
  28. package/dist/{chunk-V6ZCNULL.js → chunk-J6CJQDWI.js} +37 -28
  29. package/dist/{chunk-4RQBJWQX.js → chunk-LOPXTW6H.js} +1 -1
  30. package/dist/{chunk-47ZPNLF4.js → chunk-MDJGMOSD.js} +8 -137
  31. package/dist/{chunk-BTWAGDV5.js → chunk-N446KRP7.js} +3 -3
  32. package/dist/{chunk-6WAWMWR5.js → chunk-N5LMGYXX.js} +2 -2
  33. package/dist/{chunk-G6BSYHPK.js → chunk-NJK5SDGR.js} +1 -1
  34. package/dist/{chunk-D424ZQGI.js → chunk-O7IGP7ZW.js} +11 -3
  35. package/dist/{chunk-2IOP6PHB.js → chunk-OTC67N2Z.js} +2 -2
  36. package/dist/{chunk-V45JXOWY.js → chunk-PWQ2ITYG.js} +4 -4
  37. package/dist/{chunk-KTLFDYPT.js → chunk-QCH6K235.js} +1 -1
  38. package/dist/chunk-QHG4OMZL.js +145 -0
  39. package/dist/{chunk-IS7WJ56Q.js → chunk-QWTR6AWZ.js} +3 -3
  40. package/dist/chunk-TXSA4Q3V.js +116 -0
  41. package/dist/{chunk-BDK73LK6.js → chunk-VHJRZM2S.js} +2 -2
  42. package/dist/{chunk-SSI47XP2.js → chunk-VHWGEJ4V.js} +1 -1
  43. package/dist/chunk-VY3RB2V7.js +164 -0
  44. package/dist/chunk-WJPROOU5.js +8314 -0
  45. package/dist/{chunk-E5C7OWZ2.js → chunk-WZRZFFCL.js} +8 -8
  46. package/dist/{chunk-BM474GX6.js → chunk-XRQSAMX2.js} +4 -4
  47. package/dist/{chunk-OYAKCAVY.js → chunk-ZSR72JB3.js} +1 -1
  48. package/dist/{chunk-PLDWHR4D.js → chunk-ZX7EAV5J.js} +17 -7
  49. package/dist/cli.js +90 -29
  50. package/dist/clock-HSEKS5AR.js +289 -0
  51. package/dist/{cloud-sync-TG3TIX5H.js → cloud-sync-6JL4C24T.js} +21 -22
  52. package/dist/config-UTS7QULS.js +76 -0
  53. package/dist/connectors/discord-bridge.js +3 -3
  54. package/dist/connectors/slack-bridge.js +3 -3
  55. package/dist/connectors/telegram-bridge.js +3 -3
  56. package/dist/{conversations-HL2JP5GI.js → conversations-2PW57WO2.js} +5 -5
  57. package/dist/create-5BPOOJAN.js +75 -0
  58. package/dist/create-UVCK2CS6.js +50 -0
  59. package/dist/daemon-client-RVIKXGFQ.js +12 -0
  60. package/dist/daemon-restart-HSZ3BCX5.js +65 -0
  61. package/dist/daemon.js +845 -1766
  62. package/dist/{db-PLEDCBHZ.js → db-BDMH4SZ2.js} +7 -3
  63. package/dist/{db-RYX3SS2W.js → db-BVBJ57TU.js} +2 -2
  64. package/dist/delete-L5PAVDGQ.js +42 -0
  65. package/dist/delivery-manager-H5ZVBMCQ.js +31 -0
  66. package/dist/{delivery-router-D5ELDMS2.js → delivery-router-HEJSJAHQ.js} +4 -4
  67. package/dist/down-74VXM45A.js +17 -0
  68. package/dist/env-E4XHO2BI.js +223 -0
  69. package/dist/{exec-DVLXKRIO.js → exec-PY7THYH4.js} +4 -4
  70. package/dist/export-OAS6QVBN.js +113 -0
  71. package/dist/{extension-PM42QCID.js → extension-D74CNM7G.js} +25 -33
  72. package/dist/{extensions-BBGVL5JC.js → extensions-XDDFY72A.js} +22 -11
  73. package/dist/files-CWTK6V3H.js +53 -0
  74. package/dist/import-5A3T7QV4.js +143 -0
  75. package/dist/{isolation-62MKDZN3.js → isolation-TK5RX2WM.js} +3 -3
  76. package/dist/join-DF5XSJAC.js +67 -0
  77. package/dist/list-PDMQM7ZV.js +53 -0
  78. package/dist/login-7TE6CIZF.js +60 -0
  79. package/dist/login-GOTAYLXP.js +51 -0
  80. package/dist/logout-6KIA74EV.js +29 -0
  81. package/dist/logout-T4XS6LRU.js +50 -0
  82. package/dist/message-delivery-GRC4W6P7.js +41 -0
  83. package/dist/mind-5IEYKV7I.js +97 -0
  84. package/dist/{mind-activity-tracker-2ACNHA7B.js → mind-activity-tracker-QBLIV7ZJ.js} +5 -5
  85. package/dist/{mind-history-WOYFLQAI.js → mind-history-IE2QH7U5.js} +82 -71
  86. package/dist/mind-list-GEWHWAL4.js +38 -0
  87. package/dist/mind-manager-HFLB5653.js +31 -0
  88. package/dist/mind-profile-DCBDVF5B.js +53 -0
  89. package/dist/mind-service-X2CAA6W6.js +37 -0
  90. package/dist/mind-sleep-ITCF6OQA.js +47 -0
  91. package/dist/mind-status-X4SX3YUG.js +65 -0
  92. package/dist/mind-wake-KXMKMGWX.js +42 -0
  93. package/dist/{package-V2WHWVG6.js → package-D2FSVFAX.js} +5 -5
  94. package/dist/read-67VRP2DO.js +91 -0
  95. package/dist/{read-stdin-PIRM6A2Y.js → read-stdin-3X5VYKNS.js} +1 -1
  96. package/dist/register-SB7NXCOE.js +51 -0
  97. package/dist/{registry-UYV5S6QT.js → registry-GBSNW3HG.js} +2 -2
  98. package/dist/reject-MUR2KWJ4.js +40 -0
  99. package/dist/restart-5EGG4JXU.js +42 -0
  100. package/dist/{sandbox-SI5HMBP3.js → sandbox-R37VIU36.js} +5 -5
  101. package/dist/scheduler-Y7O4CJXL.js +31 -0
  102. package/dist/{schema-ETMABTW4.js → schema-XVZ2CLKW.js} +1 -1
  103. package/dist/{seed-WNGI6PNW.js → seed-EQORWX77.js} +2 -2
  104. package/dist/seed-check-KJNTL72M.js +35 -0
  105. package/dist/seed-cmd-ZM2XGVU2.js +30 -0
  106. package/dist/seed-create-DRWGGHEI.js +113 -0
  107. package/dist/seed-sprout-JYXGXOP3.js +148 -0
  108. package/dist/send-JBJJQ7CA.js +409 -0
  109. package/dist/service-WNPCNHOX.js +121 -0
  110. package/dist/{setup-Z3DEVWV7.js → setup-BJ4YAY26.js} +153 -127
  111. package/dist/{setup-GGMKENLN.js → setup-RHJRFURI.js} +3 -3
  112. package/dist/skill-TAAKEYBV.js +389 -0
  113. package/dist/skills/volute-mind/SKILL.md +3 -7
  114. package/dist/skills/volute-mind/references/extensions.md +8 -11
  115. package/dist/{skills-Q6VZ2UGD.js → skills-EKMCQ46K.js} +7 -7
  116. package/dist/sleep-manager-7KFK3USC.js +35 -0
  117. package/dist/spirit-ZFRDXMG7.js +23 -0
  118. package/dist/split-AWVOYOPZ.js +64 -0
  119. package/dist/{sprout-E3HJIV2Z.js → sprout-HE4TITMK.js} +2 -2
  120. package/dist/start-3UXOPXQG.js +39 -0
  121. package/dist/status-ZK34WYIM.js +125 -0
  122. package/dist/stop-3XYIBGFM.js +41 -0
  123. package/dist/system-chat-IDPHYHY4.js +35 -0
  124. package/dist/systems-O43WGQY6.js +52 -0
  125. package/dist/{tailscale-ZEUK7GKZ.js → tailscale-ZIZ2HWJ5.js} +4 -4
  126. package/dist/{template-hash-EJRTKE36.js → template-hash-A7FNHTB7.js} +2 -2
  127. package/dist/up-77ICEDEW.js +19 -0
  128. package/dist/update-ANE5ZM7F.js +225 -0
  129. package/dist/{update-check-X3YG4WVP.js → update-check-UV55CBEP.js} +3 -3
  130. package/dist/upgrade-ZMDGC7M2.js +74 -0
  131. package/dist/variant-QWL2WSRI.js +62 -0
  132. package/dist/{version-notify-YCH4UVQ2.js → version-notify-FXSEMXWW.js} +28 -27
  133. package/dist/{volute-config-WBKYJGYQ.js → volute-config-D2XVS2YI.js} +1 -1
  134. package/dist/web-assets/assets/index-BhxWKvbB.css +1 -0
  135. package/dist/web-assets/assets/index-CHVKJ9II.js +75 -0
  136. package/dist/web-assets/index.html +2 -2
  137. package/dist/web-assets/sw.js +117 -0
  138. package/package.json +5 -5
  139. package/packages/extensions/pages/dist/ui/assets/index-DKZLNMED.js +2 -0
  140. package/packages/extensions/pages/dist/ui/index.html +1 -1
  141. package/packages/extensions/pages/skills/pages/SKILL.md +84 -9
  142. package/templates/_base/src/lib/auto-commit.ts +8 -8
  143. package/templates/_base/src/lib/volute-server.ts +6 -0
  144. package/templates/claude/src/agent.ts +8 -1
  145. package/dist/accept-TW6V4WI4.js +0 -42
  146. package/dist/bridge-O753D5F4.js +0 -207
  147. package/dist/chat-BHYX7DJ4.js +0 -68
  148. package/dist/chunk-47XDEWWV.js +0 -156
  149. package/dist/chunk-CVL5IGIR.js +0 -2084
  150. package/dist/chunk-PB65JZK2.js +0 -85
  151. package/dist/chunk-TAHX36HZ.js +0 -3679
  152. package/dist/clock-3X4DSC2N.js +0 -281
  153. package/dist/config-OROA5DUA.js +0 -72
  154. package/dist/create-3SEKKI6P.js +0 -71
  155. package/dist/create-UOSOQ2HN.js +0 -44
  156. package/dist/daemon-client-WOAQXXBM.js +0 -12
  157. package/dist/daemon-restart-5ABHNXJZ.js +0 -52
  158. package/dist/delete-KYOVWR23.js +0 -35
  159. package/dist/delivery-manager-2BR5NZKF.js +0 -32
  160. package/dist/down-QVFN4UPK.js +0 -15
  161. package/dist/env-R34DT7XL.js +0 -195
  162. package/dist/export-6ZXAXATG.js +0 -112
  163. package/dist/files-VQV2VZQO.js +0 -47
  164. package/dist/import-MK2I2T6F.js +0 -23
  165. package/dist/join-DGYHTJUH.js +0 -66
  166. package/dist/list-C644WTHV.js +0 -49
  167. package/dist/login-IIGEQPHL.js +0 -47
  168. package/dist/login-KZQLMAWE.js +0 -47
  169. package/dist/logout-AGTZVRGP.js +0 -40
  170. package/dist/logout-KD6GXIJJ.js +0 -21
  171. package/dist/message-delivery-V3R6NXJP.js +0 -42
  172. package/dist/mind-BI4EPBVZ.js +0 -108
  173. package/dist/mind-list-6VPM7GUQ.js +0 -30
  174. package/dist/mind-manager-MWW3BTS4.js +0 -32
  175. package/dist/mind-profile-WPG42U5Y.js +0 -47
  176. package/dist/mind-service-VIKZJK2M.js +0 -38
  177. package/dist/mind-sleep-XDISJY74.js +0 -42
  178. package/dist/mind-status-7FTZWPZF.js +0 -56
  179. package/dist/mind-wake-KIIKEI3A.js +0 -37
  180. package/dist/read-H5C26YO7.js +0 -85
  181. package/dist/register-J27WP33N.js +0 -47
  182. package/dist/reject-OEANJYIA.js +0 -40
  183. package/dist/restart-V5EGYBJG.js +0 -33
  184. package/dist/scheduler-AGG3L2FO.js +0 -32
  185. package/dist/seed-check-PXTH7YXS.js +0 -32
  186. package/dist/seed-cmd-VENFTGS3.js +0 -36
  187. package/dist/seed-create-663ALOKH.js +0 -112
  188. package/dist/seed-sprout-EH3AGKAI.js +0 -132
  189. package/dist/send-7FUUUZZH.js +0 -386
  190. package/dist/skill-DKNYJS4P.js +0 -362
  191. package/dist/skills/shared-files/SKILL.md +0 -44
  192. package/dist/skills/shared-files/scripts/merge.ts +0 -72
  193. package/dist/skills/shared-files/scripts/pull.ts +0 -52
  194. package/dist/sleep-manager-BJK2ROPX.js +0 -36
  195. package/dist/spirit-4JP4TY4C.js +0 -23
  196. package/dist/split-3YPMS2CL.js +0 -63
  197. package/dist/start-W3TPKX4D.js +0 -33
  198. package/dist/status-4OVFXFEJ.js +0 -115
  199. package/dist/stop-GTT6YWYO.js +0 -32
  200. package/dist/system-channel-DXD2JBOU.js +0 -36
  201. package/dist/system-chat-TYLOL7SX.js +0 -36
  202. package/dist/systems-AYLO727G.js +0 -61
  203. package/dist/up-PA7F2CXE.js +0 -18
  204. package/dist/update-HG4LCUSG.js +0 -215
  205. package/dist/upgrade-YGNIDICG.js +0 -67
  206. package/dist/variant-MZUMRTQO.js +0 -41
  207. package/dist/web-assets/assets/index-DiiwC-CZ.css +0 -1
  208. package/dist/web-assets/assets/index-d6y5b9Ij.js +0 -75
  209. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +0 -2
@@ -5,9 +5,9 @@ import {
5
5
  extractArchive,
6
6
  isHomeOnlyArchive,
7
7
  readManifest
8
- } from "./chunk-6WAWMWR5.js";
9
- import "./chunk-N7BLAHNE.js";
10
- import "./chunk-4JSR7YO7.js";
8
+ } from "./chunk-N5LMGYXX.js";
9
+ import "./chunk-BDYXIWA5.js";
10
+ import "./chunk-5N7Y5WAM.js";
11
11
  import "./chunk-7KJOFUNN.js";
12
12
  export {
13
13
  addHistoryToArchive,
@@ -17,11 +17,11 @@ import {
17
17
  syncMindProfile,
18
18
  updateUserProfile,
19
19
  verifyUser
20
- } from "./chunk-BM474GX6.js";
21
- import "./chunk-XWXBJQBE.js";
22
- import "./chunk-YUIHSKR6.js";
23
- import "./chunk-N7BLAHNE.js";
24
- import "./chunk-4JSR7YO7.js";
20
+ } from "./chunk-XRQSAMX2.js";
21
+ import "./chunk-CORXD635.js";
22
+ import "./chunk-BKF4WQCY.js";
23
+ import "./chunk-BDYXIWA5.js";
24
+ import "./chunk-5N7Y5WAM.js";
25
25
  import "./chunk-7KJOFUNN.js";
26
26
  export {
27
27
  approveUser,
@@ -0,0 +1,206 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ command,
4
+ subcommands
5
+ } from "./chunk-TXSA4Q3V.js";
6
+ import "./chunk-O7IGP7ZW.js";
7
+ import {
8
+ daemonFetch
9
+ } from "./chunk-ZX7EAV5J.js";
10
+ import "./chunk-7KJOFUNN.js";
11
+
12
+ // packages/cli/src/commands/chat/bridge.ts
13
+ var bridgeAddCmd = command({
14
+ name: "volute chat bridge add",
15
+ description: "Enable a bridge with a default mind",
16
+ args: [
17
+ {
18
+ name: "platform",
19
+ required: true,
20
+ description: "Bridge platform (e.g. discord, slack, telegram)"
21
+ }
22
+ ],
23
+ flags: {
24
+ "default-mind": { type: "string", description: "Mind to route DMs to (required)" }
25
+ },
26
+ run: async ({ args, flags }) => {
27
+ const platform = args.platform;
28
+ const defaultMind = flags["default-mind"];
29
+ if (!defaultMind) {
30
+ console.error("--default-mind is required (mind to route DMs to)");
31
+ process.exit(1);
32
+ }
33
+ const res = await daemonFetch(`/api/bridges/${encodeURIComponent(platform)}`, {
34
+ method: "POST",
35
+ headers: { "Content-Type": "application/json" },
36
+ body: JSON.stringify({ defaultMind })
37
+ });
38
+ if (!res.ok) {
39
+ const data = await res.json().catch(() => ({}));
40
+ if (data.error === "missing_env" && data.missing) {
41
+ console.error(`Missing required environment variables:`);
42
+ for (const v of data.missing) {
43
+ console.error(` ${v.name} \u2014 ${v.description}`);
44
+ }
45
+ console.error(`
46
+ Set them with: volute env set <VAR> <value>`);
47
+ } else {
48
+ console.error(data.error ?? `Failed to add bridge: ${res.status}`);
49
+ }
50
+ process.exit(1);
51
+ }
52
+ console.log(`Bridge ${platform} enabled.`);
53
+ }
54
+ });
55
+ var bridgeRemoveCmd = command({
56
+ name: "volute chat bridge remove",
57
+ description: "Disable a bridge",
58
+ args: [{ name: "platform", required: true, description: "Bridge platform to remove" }],
59
+ flags: {},
60
+ run: async ({ args }) => {
61
+ const platform = args.platform;
62
+ const res = await daemonFetch(`/api/bridges/${encodeURIComponent(platform)}`, {
63
+ method: "DELETE"
64
+ });
65
+ if (!res.ok) {
66
+ console.error(`Failed to remove bridge: ${res.status}`);
67
+ process.exit(1);
68
+ }
69
+ console.log(`Bridge ${platform} removed.`);
70
+ }
71
+ });
72
+ var bridgeListCmd = command({
73
+ name: "volute chat bridge list",
74
+ description: "Show all bridges and their status",
75
+ args: [],
76
+ flags: {},
77
+ run: async () => {
78
+ const res = await daemonFetch("/api/bridges");
79
+ if (!res.ok) {
80
+ console.error(`Failed to list bridges: ${res.status}`);
81
+ process.exit(1);
82
+ }
83
+ const bridges = await res.json();
84
+ if (bridges.length === 0) {
85
+ console.log("No bridges configured. Use 'volute chat bridge add <platform>' to set one up.");
86
+ return;
87
+ }
88
+ for (const b of bridges) {
89
+ const status = b.running ? "running" : b.enabled ? "stopped" : "disabled";
90
+ console.log(` ${b.displayName} (${b.platform}) ${status} default: ${b.defaultMind}`);
91
+ }
92
+ }
93
+ });
94
+ var bridgeMapCmd = command({
95
+ name: "volute chat bridge map",
96
+ description: "Map an external channel to a Volute channel",
97
+ args: [
98
+ { name: "target", required: true, description: "External channel (platform:channel)" },
99
+ { name: "volute-channel", required: true, description: "Volute channel name" }
100
+ ],
101
+ flags: {},
102
+ run: async ({ args }) => {
103
+ const target = args.target;
104
+ const voluteChannel = args["volute-channel"];
105
+ const colonIdx = target.indexOf(":");
106
+ if (colonIdx < 1) {
107
+ console.error("Target must be in format platform:channel (e.g. discord:my-server/general)");
108
+ process.exit(1);
109
+ }
110
+ const platform = target.slice(0, colonIdx);
111
+ const externalChannel = target.slice(colonIdx + 1);
112
+ const res = await daemonFetch(`/api/bridges/${encodeURIComponent(platform)}/mappings`, {
113
+ method: "PUT",
114
+ headers: { "Content-Type": "application/json" },
115
+ body: JSON.stringify({ externalChannel, voluteChannel })
116
+ });
117
+ if (!res.ok) {
118
+ const data = await res.json().catch(() => ({}));
119
+ console.error(data.error ?? `Failed to set mapping: ${res.status}`);
120
+ process.exit(1);
121
+ }
122
+ console.log(`Mapped ${platform}:${externalChannel} \u2192 ${voluteChannel}`);
123
+ }
124
+ });
125
+ var bridgeUnmapCmd = command({
126
+ name: "volute chat bridge unmap",
127
+ description: "Remove a channel mapping",
128
+ args: [{ name: "target", required: true, description: "External channel (platform:channel)" }],
129
+ flags: {},
130
+ run: async ({ args }) => {
131
+ const target = args.target;
132
+ const colonIdx = target.indexOf(":");
133
+ if (colonIdx < 1) {
134
+ console.error("Target must be in format platform:channel");
135
+ process.exit(1);
136
+ }
137
+ const platform = target.slice(0, colonIdx);
138
+ const externalChannel = target.slice(colonIdx + 1);
139
+ const res = await daemonFetch(
140
+ `/api/bridges/${encodeURIComponent(platform)}/mappings/${encodeURIComponent(externalChannel)}`,
141
+ { method: "DELETE" }
142
+ );
143
+ if (!res.ok) {
144
+ console.error(`Failed to remove mapping: ${res.status}`);
145
+ process.exit(1);
146
+ }
147
+ console.log(`Removed mapping for ${platform}:${externalChannel}`);
148
+ }
149
+ });
150
+ var bridgeMappingsCmd = command({
151
+ name: "volute chat bridge mappings",
152
+ description: "List channel mappings",
153
+ args: [{ name: "platform", description: "Filter by platform" }],
154
+ flags: {},
155
+ run: async ({ args }) => {
156
+ const platform = args.platform;
157
+ if (platform) {
158
+ const res = await daemonFetch(`/api/bridges/${encodeURIComponent(platform)}/mappings`);
159
+ if (!res.ok) {
160
+ console.error(`Failed to get mappings: ${res.status}`);
161
+ process.exit(1);
162
+ }
163
+ const mappings = await res.json();
164
+ if (Object.keys(mappings).length === 0) {
165
+ console.log(`No mappings for ${platform}.`);
166
+ return;
167
+ }
168
+ for (const [external, volute] of Object.entries(mappings)) {
169
+ console.log(` ${platform}:${external} \u2192 ${volute}`);
170
+ }
171
+ } else {
172
+ const res = await daemonFetch("/api/bridges");
173
+ if (!res.ok) {
174
+ console.error(`Failed to list bridges: ${res.status}`);
175
+ process.exit(1);
176
+ }
177
+ const bridges = await res.json();
178
+ let found = false;
179
+ for (const b of bridges) {
180
+ for (const [external, volute] of Object.entries(b.channelMappings)) {
181
+ console.log(` ${b.platform}:${external} \u2192 ${volute}`);
182
+ found = true;
183
+ }
184
+ }
185
+ if (!found) {
186
+ console.log("No mappings configured.");
187
+ }
188
+ }
189
+ }
190
+ });
191
+ var cmd = subcommands({
192
+ name: "volute chat bridge",
193
+ description: "Manage platform bridges",
194
+ commands: {
195
+ add: { description: "Enable a bridge with a default mind", run: bridgeAddCmd.execute },
196
+ remove: { description: "Disable a bridge", run: bridgeRemoveCmd.execute },
197
+ list: { description: "Show all bridges and their status", run: bridgeListCmd.execute },
198
+ map: { description: "Map an external channel to a Volute channel", run: bridgeMapCmd.execute },
199
+ unmap: { description: "Remove a channel mapping", run: bridgeUnmapCmd.execute },
200
+ mappings: { description: "List channel mappings", run: bridgeMappingsCmd.execute }
201
+ }
202
+ });
203
+ var run = cmd.execute;
204
+ export {
205
+ run
206
+ };
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ subcommands
4
+ } from "./chunk-TXSA4Q3V.js";
5
+ import "./chunk-O7IGP7ZW.js";
6
+ import "./chunk-7KJOFUNN.js";
7
+
8
+ // packages/cli/src/commands/chat.ts
9
+ var cmd = subcommands({
10
+ name: "volute chat",
11
+ description: "Manage conversations and messages",
12
+ commands: {
13
+ send: {
14
+ description: "Send a message",
15
+ run: (args) => import("./send-JBJJQ7CA.js").then((m) => m.run(args))
16
+ },
17
+ list: {
18
+ description: "List conversations",
19
+ run: (args) => import("./list-PDMQM7ZV.js").then((m) => m.run(args))
20
+ },
21
+ read: {
22
+ description: "Read conversation messages",
23
+ run: (args) => import("./read-67VRP2DO.js").then((m) => m.run(args))
24
+ },
25
+ create: {
26
+ description: "Create a conversation",
27
+ run: (args) => import("./create-5BPOOJAN.js").then((m) => m.run(args))
28
+ },
29
+ bridge: {
30
+ description: "Manage platform bridges",
31
+ run: (args) => import("./bridge-PXIO6PS2.js").then((m) => m.run(args))
32
+ },
33
+ files: {
34
+ description: "List pending incoming files",
35
+ run: (args) => import("./files-CWTK6V3H.js").then((m) => m.run(args))
36
+ },
37
+ accept: {
38
+ description: "Accept a pending file",
39
+ run: (args) => import("./accept-ZBDVVCEU.js").then((m) => m.run(args))
40
+ },
41
+ reject: {
42
+ description: "Reject a pending file",
43
+ run: (args) => import("./reject-MUR2KWJ4.js").then((m) => m.run(args))
44
+ }
45
+ },
46
+ footer: "Use --mind <name> or VOLUTE_MIND to identify the mind."
47
+ });
48
+ var run = cmd.execute;
49
+ export {
50
+ run
51
+ };
@@ -2,12 +2,12 @@
2
2
  import {
3
3
  exec,
4
4
  execInherit
5
- } from "./chunk-U5BTYSAL.js";
5
+ } from "./chunk-AN2W47GW.js";
6
6
  import {
7
7
  voluteSystemDir
8
- } from "./chunk-N7BLAHNE.js";
8
+ } from "./chunk-BDYXIWA5.js";
9
9
 
10
- // src/lib/service-mode.ts
10
+ // packages/daemon/src/lib/service-mode.ts
11
11
  import { execFileSync } from "child_process";
12
12
  import { existsSync, readFileSync } from "fs";
13
13
  import { homedir } from "os";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/lib/read-stdin.ts
3
+ // packages/cli/src/lib/read-stdin.ts
4
4
  import { isatty } from "tty";
5
5
  async function readStdin() {
6
6
  if (isatty(0)) return void 0;
@@ -3,7 +3,7 @@ import {
3
3
  __export
4
4
  } from "./chunk-7KJOFUNN.js";
5
5
 
6
- // src/lib/schema.ts
6
+ // packages/daemon/src/lib/schema.ts
7
7
  var schema_exports = {};
8
8
  __export(schema_exports, {
9
9
  activity: () => activity,
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/lib/format-cli.ts
3
+ // packages/cli/src/lib/format-cli.ts
4
4
  var isCompact = () => !!process.env.VOLUTE_MIND;
5
5
  function compactTime(dateStr) {
6
6
  const d = new Date(dateStr.endsWith("Z") ? dateStr : `${dateStr}Z`);
@@ -4,35 +4,41 @@ import {
4
4
  composeTemplate,
5
5
  copyTemplateToDir,
6
6
  findTemplatesRoot
7
- } from "./chunk-G53F3JA4.js";
7
+ } from "./chunk-AOB6GVRM.js";
8
8
  import {
9
9
  getSharedSkill,
10
10
  installSkill
11
- } from "./chunk-N3DNFPVA.js";
11
+ } from "./chunk-IJHIXLVN.js";
12
12
  import {
13
13
  qualifyModelId,
14
14
  resolveTemplate
15
- } from "./chunk-BFWHBQK4.js";
15
+ } from "./chunk-FT5KETXZ.js";
16
16
  import {
17
17
  logger_default
18
- } from "./chunk-YUIHSKR6.js";
18
+ } from "./chunk-BKF4WQCY.js";
19
19
  import {
20
20
  exec
21
- } from "./chunk-U5BTYSAL.js";
21
+ } from "./chunk-AN2W47GW.js";
22
22
  import {
23
23
  readGlobalConfig
24
- } from "./chunk-6OWJXUAR.js";
24
+ } from "./chunk-BMZQYACC.js";
25
25
  import {
26
26
  addSpirit,
27
27
  findMind,
28
28
  nextPort,
29
29
  voluteSystemDir
30
- } from "./chunk-N7BLAHNE.js";
30
+ } from "./chunk-BDYXIWA5.js";
31
31
 
32
- // src/lib/spirit.ts
32
+ // packages/daemon/src/lib/spirit.ts
33
33
  import { cpSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
34
+ import { homedir } from "os";
34
35
  import { resolve } from "path";
35
36
  var slog = logger_default.child("spirit");
37
+ function npmEnv() {
38
+ const cacheDir = resolve(homedir(), ".npm");
39
+ mkdirSync(cacheDir, { recursive: true });
40
+ return { ...process.env, npm_config_cache: cacheDir };
41
+ }
36
42
  function spiritDir() {
37
43
  return resolve(voluteSystemDir(), "spirit");
38
44
  }
@@ -71,7 +77,7 @@ async function ensureSpiritProject() {
71
77
  writeFileSync(configPath, `${JSON.stringify(mindConfig, null, 2)}
72
78
  `);
73
79
  }
74
- await exec("npm", ["install", "--ignore-scripts"], { cwd: dir });
80
+ await exec("npm", ["install", "--ignore-scripts"], { cwd: dir, env: npmEnv() });
75
81
  try {
76
82
  await exec("git", ["init"], { cwd: dir });
77
83
  await exec("git", ["add", "-A"], { cwd: dir });
@@ -96,7 +102,7 @@ async function ensureSpiritProject() {
96
102
  slog.warn(`failed to install skill ${skillId} for spirit`, logger_default.errorData(err));
97
103
  }
98
104
  }
99
- const { createMindUser, chownMindDir, ensureVoluteGroup } = await import("./isolation-62MKDZN3.js");
105
+ const { createMindUser, chownMindDir, ensureVoluteGroup } = await import("./isolation-TK5RX2WM.js");
100
106
  ensureVoluteGroup();
101
107
  createMindUser("volute", resolve(dir, "home"));
102
108
  chownMindDir(dir, "volute");
@@ -128,10 +134,10 @@ async function syncSpiritTemplate() {
128
134
  const newPkg = resolve(newComposed.composedDir, "package.json");
129
135
  if (existsSync(newPkg)) {
130
136
  cpSync(newPkg, resolve(dir, "package.json"));
131
- await exec("npm", ["install", "--ignore-scripts"], { cwd: dir });
137
+ await exec("npm", ["install", "--ignore-scripts"], { cwd: dir, env: npmEnv() });
132
138
  }
133
- const db = await (await import("./db-RYX3SS2W.js")).getDb();
134
- const { minds } = await import("./schema-ETMABTW4.js");
139
+ const db = await (await import("./db-BVBJ57TU.js")).getDb();
140
+ const { minds } = await import("./schema-XVZ2CLKW.js");
135
141
  const { eq } = await import("drizzle-orm");
136
142
  await db.update(minds).set({ template: expectedTemplate }).where(eq(minds.name, "volute"));
137
143
  }
@@ -176,10 +182,10 @@ async function syncSpiritTemplate() {
176
182
  if (composedContent !== currentContent) {
177
183
  cpSync(composedPkg, currentPkg);
178
184
  }
179
- await exec("npm", ["install", "--ignore-scripts"], { cwd: dir });
185
+ await exec("npm", ["install", "--ignore-scripts"], { cwd: dir, env: npmEnv() });
180
186
  }
181
187
  } else if (nodeModulesMissing) {
182
- await exec("npm", ["install", "--ignore-scripts"], { cwd: dir });
188
+ await exec("npm", ["install", "--ignore-scripts"], { cwd: dir, env: npmEnv() });
183
189
  }
184
190
  for (const [p, content] of preserved) {
185
191
  const full = resolve(dir, p);
@@ -2,9 +2,9 @@
2
2
  import {
3
3
  stateDir,
4
4
  voluteSystemDir
5
- } from "./chunk-N7BLAHNE.js";
5
+ } from "./chunk-BDYXIWA5.js";
6
6
 
7
- // src/lib/env.ts
7
+ // packages/daemon/src/lib/env.ts
8
8
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
9
9
  import { dirname, resolve } from "path";
10
10
  function sharedEnvPath() {
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  wrapForIsolation
4
- } from "./chunk-BDK73LK6.js";
4
+ } from "./chunk-VHJRZM2S.js";
5
5
 
6
- // src/lib/exec.ts
6
+ // packages/daemon/src/lib/exec.ts
7
7
  import { execFile as execFileCb, execFileSync, spawn } from "child_process";
8
8
  async function exec(cmd, args, options) {
9
9
  const [wrappedCmd, wrappedArgs] = options?.mindName ? await wrapForIsolation(cmd, args, options.mindName) : [cmd, args];
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/lib/template.ts
3
+ // packages/daemon/src/lib/template.ts
4
4
  import {
5
5
  cpSync,
6
6
  existsSync,
@@ -2,9 +2,9 @@
2
2
  import {
3
3
  minds,
4
4
  schema_exports
5
- } from "./chunk-4JSR7YO7.js";
5
+ } from "./chunk-5N7Y5WAM.js";
6
6
 
7
- // src/lib/db.ts
7
+ // packages/daemon/src/lib/db.ts
8
8
  import { chmodSync, existsSync } from "fs";
9
9
  import { dirname as dirname2, resolve as resolve2 } from "path";
10
10
  import { fileURLToPath as fileURLToPath2 } from "url";
@@ -12,7 +12,7 @@ import { sql } from "drizzle-orm";
12
12
  import { drizzle } from "drizzle-orm/libsql";
13
13
  import { migrate } from "drizzle-orm/libsql/migrator";
14
14
 
15
- // src/lib/registry.ts
15
+ // packages/daemon/src/lib/registry.ts
16
16
  import { mkdirSync } from "fs";
17
17
  import { homedir } from "os";
18
18
  import { dirname, resolve } from "path";
@@ -192,9 +192,9 @@ function daemonLoopback() {
192
192
  return host;
193
193
  }
194
194
 
195
- // src/lib/db.ts
195
+ // packages/daemon/src/lib/db.ts
196
196
  var __dirname = dirname2(fileURLToPath2(import.meta.url));
197
- var migrationsFolder = existsSync(resolve2(__dirname, "../drizzle")) ? resolve2(__dirname, "../drizzle") : resolve2(__dirname, "../../drizzle");
197
+ var migrationsFolder = existsSync(resolve2(__dirname, "../drizzle")) ? resolve2(__dirname, "../drizzle") : existsSync(resolve2(__dirname, "../../drizzle")) ? resolve2(__dirname, "../../drizzle") : resolve2(__dirname, "../../../../drizzle");
198
198
  var db = null;
199
199
  var dbPromise = null;
200
200
  async function getDb() {
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/lib/log-buffer.ts
3
+ // packages/daemon/src/lib/log-buffer.ts
4
4
  var LogBuffer = class {
5
5
  entries = [];
6
6
  maxSize = 1e3;
@@ -24,7 +24,7 @@ var LogBuffer = class {
24
24
  };
25
25
  var logBuffer = new LogBuffer();
26
26
 
27
- // src/lib/logger.ts
27
+ // packages/daemon/src/lib/logger.ts
28
28
  var LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
29
29
  var minLevel = LEVELS[process.env.VOLUTE_LOG_LEVEL || "info"] ?? LEVELS.info;
30
30
  var output = (line) => process.stderr.write(`${line}
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  voluteSystemDir
4
- } from "./chunk-N7BLAHNE.js";
4
+ } from "./chunk-BDYXIWA5.js";
5
5
 
6
- // src/lib/setup.ts
6
+ // packages/daemon/src/lib/setup.ts
7
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
8
8
  import { resolve } from "path";
9
9
  function configPath() {
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // src/lib/resolve-mind-name.ts
3
+ // packages/cli/src/lib/resolve-mind-name.ts
4
4
  function resolveMindName(flags) {
5
5
  const name = flags.mind || process.env.VOLUTE_MIND;
6
6
  if (!name) {
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  stateDir
4
- } from "./chunk-N7BLAHNE.js";
4
+ } from "./chunk-BDYXIWA5.js";
5
5
 
6
- // src/lib/file-sharing.ts
6
+ // packages/daemon/src/lib/file-sharing.ts
7
7
  import { randomBytes } from "crypto";
8
8
  import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "fs";
9
9
  import { basename, join, normalize, resolve } from "path";
@@ -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-N7BLAHNE.js";
7
+ } from "./chunk-BDYXIWA5.js";
8
8
  import {
9
9
  activity
10
- } from "./chunk-4JSR7YO7.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-6OWJXUAR.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,26 +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-U5BTYSAL.js";
8
+ } from "./chunk-AN2W47GW.js";
9
9
  import {
10
10
  readGlobalConfig,
11
11
  writeGlobalConfig
12
- } from "./chunk-6OWJXUAR.js";
12
+ } from "./chunk-BMZQYACC.js";
13
13
  import {
14
14
  getDb,
15
15
  mindDir,
16
16
  readRegistry,
17
17
  voluteHome
18
- } from "./chunk-N7BLAHNE.js";
18
+ } from "./chunk-BDYXIWA5.js";
19
19
  import {
20
20
  sharedSkills
21
- } from "./chunk-4JSR7YO7.js";
21
+ } from "./chunk-5N7Y5WAM.js";
22
22
 
23
- // src/lib/skills.ts
23
+ // packages/daemon/src/lib/skills.ts
24
24
  import { createHash } from "crypto";
25
25
  import {
26
26
  cpSync,
@@ -36,7 +36,7 @@ import { basename, dirname, join, resolve } from "path";
36
36
  import { eq, sql } from "drizzle-orm";
37
37
  var VALID_SKILL_ID = /^[a-zA-Z0-9_-]+$/;
38
38
  var SEED_SKILLS = ["orientation", "memory"];
39
- var STANDARD_SKILLS = ["volute-mind", "memory", "dreaming", "shared-files"];
39
+ var STANDARD_SKILLS = ["volute-mind", "memory", "dreaming"];
40
40
  function getStandardSkillsWithExtensions() {
41
41
  const config = readGlobalConfig();
42
42
  if (config.defaultSkills) return [...config.defaultSkills];
@@ -46,7 +46,7 @@ async function initDefaultSkills() {
46
46
  const config = readGlobalConfig();
47
47
  let extensionSkills = [];
48
48
  try {
49
- const { getExtensionStandardSkills } = await import("./extensions-BBGVL5JC.js");
49
+ const { getExtensionStandardSkills } = await import("./extensions-XDDFY72A.js");
50
50
  extensionSkills = getExtensionStandardSkills();
51
51
  } catch (err) {
52
52
  logger_default.warn("failed to load extension standard skills during init", logger_default.errorData(err));