volute 0.30.1 → 0.32.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 (227) hide show
  1. package/README.md +15 -22
  2. package/dist/{accept-E3PAH3QJ.js → accept-74M7I4RZ.js} +5 -4
  3. package/dist/{activity-events-BKBPPUBP.js → activity-events-HETAODOK.js} +3 -2
  4. package/dist/{ai-service-VAJT5UBS.js → ai-service-ZIPCV3MX.js} +20 -5
  5. package/dist/api.d.ts +341 -397
  6. package/dist/{archive-WWDBWYN2.js → archive-INXYFVCW.js} +3 -2
  7. package/dist/auth-6DMGES3I.js +44 -0
  8. package/dist/{bridge-RO37CUFM.js → bridge-BVCBTGPF.js} +5 -4
  9. package/dist/{chat-TCUNPFGO.js → chat-XT4OBJBU.js} +8 -8
  10. package/dist/{chunk-P7VFDSSG.js → chunk-2FLJ63GU.js} +2 -2
  11. package/dist/{chunk-ZWKTUQEL.js → chunk-2NGTS5UU.js} +1 -1
  12. package/dist/{chunk-JGFRDMR6.js → chunk-ALEF47VT.js} +1 -1
  13. package/dist/{chunk-MDPCSXZ4.js → chunk-D5G5YOPL.js} +163 -15
  14. package/dist/{chunk-VGWJSNHS.js → chunk-G53F3JA4.js} +1 -35
  15. package/dist/{chunk-A6TUJJ3L.js → chunk-G6BSYHPK.js} +2 -2
  16. package/dist/{chunk-DTC6EH5I.js → chunk-I5KY25PQ.js} +1 -9
  17. package/dist/{chunk-NSBFETWP.js → chunk-IYDIE3HG.js} +64 -26
  18. package/dist/{chunk-W5OOPLNP.js → chunk-JJ7W6WSB.js} +3 -3
  19. package/dist/{chunk-G3GBKZGG.js → chunk-LGB6JBHI.js} +54 -2
  20. package/dist/chunk-LRCG2JLP.js +251 -0
  21. package/dist/{chunk-FXHXHI2A.js → chunk-LSGWR54X.js} +3 -6
  22. package/dist/{chunk-S5LR3XYJ.js → chunk-M7UL5S3Q.js} +1 -1
  23. package/dist/chunk-PB65JZK2.js +85 -0
  24. package/dist/chunk-PVY5W6QN.js +41 -0
  25. package/dist/{chunk-QVAQ5454.js → chunk-QBQ424EM.js} +3007 -2126
  26. package/dist/{chunk-P27RV5WM.js → chunk-QZANELPX.js} +6 -2
  27. package/dist/{chunk-FSM45XD5.js → chunk-R7E6CRVQ.js} +1 -1
  28. package/dist/{chunk-HHTXM4JT.js → chunk-RPZZSXV3.js} +39 -195
  29. package/dist/{chunk-UPA6COHU.js → chunk-RSX4OPZY.js} +5 -5
  30. package/dist/{chunk-2C2VXEBB.js → chunk-S6NFERDC.js} +21 -57
  31. package/dist/chunk-SKLSMHXO.js +208 -0
  32. package/dist/{chunk-IKHDUZRH.js → chunk-SX5TKJBZ.js} +2 -2
  33. package/dist/chunk-TDRYEPH4.js +185 -0
  34. package/dist/chunk-TSXLLQZW.js +46 -0
  35. package/dist/{chunk-EFVHR7KH.js → chunk-UKVWJRKN.js} +24 -5
  36. package/dist/{chunk-2NDZC3S7.js → chunk-WKF5FEFK.js} +688 -389
  37. package/dist/cli.js +93 -24
  38. package/dist/{clock-G3ALCMLJ.js → clock-2UOZ6JPU.js} +11 -8
  39. package/dist/{cloud-sync-JV4LJOK3.js → cloud-sync-JN3NWKEM.js} +16 -14
  40. package/dist/config-H2H4UIF7.js +72 -0
  41. package/dist/connectors/discord-bridge.js +1 -1
  42. package/dist/connectors/slack-bridge.js +1 -1
  43. package/dist/connectors/telegram-bridge.js +1 -1
  44. package/dist/{conversations-7KVQV7EZ.js → conversations-3O5O6AS3.js} +8 -7
  45. package/dist/{create-JTLS7GX3.js → create-RNLNCORE.js} +5 -4
  46. package/dist/{create-VQSQHJQW.js → create-WBBYI6V7.js} +6 -2
  47. package/dist/daemon-client-6QXHZ7US.js +12 -0
  48. package/dist/{daemon-restart-4JGBHEJ4.js → daemon-restart-NGFHFAUF.js} +7 -7
  49. package/dist/daemon.js +2446 -1999
  50. package/dist/{db-HMFPIRO2.js → db-F34YLV7D.js} +2 -1
  51. package/dist/db-RA45JBFG.js +16 -0
  52. package/dist/{delete-JESHKE7F.js → delete-QTGWEDBI.js} +1 -1
  53. package/dist/delivery-manager-SDVXFD4W.js +28 -0
  54. package/dist/delivery-router-FL45JL7N.js +21 -0
  55. package/dist/down-TB3ESMNP.js +14 -0
  56. package/dist/{env-CLXXT7M2.js → env-RLYQBOOP.js} +5 -4
  57. package/dist/{export-EGA5M5PB.js → export-SUYRLI5Q.js} +4 -3
  58. package/dist/{extension-WZ4SUPJB.js → extension-FQ5D3NCC.js} +6 -6
  59. package/dist/{extensions-ECO4RPFQ.js → extensions-GDYWQXC4.js} +9 -7
  60. package/dist/{files-4VEJDASH.js → files-EAMPO2SJ.js} +6 -5
  61. package/dist/{history-EJMMLXDO.js → history-FO5PHBQ5.js} +9 -4
  62. package/dist/{import-YCGPMBSI.js → import-DDUFE7AY.js} +4 -3
  63. package/dist/{join-2GBJKZEN.js → join-I5QEE3LG.js} +1 -1
  64. package/dist/{list-Q6O7FGAN.js → list-DW2VRTOZ.js} +5 -4
  65. package/dist/{login-RL6AU2SM.js → login-7CHPW2PN.js} +5 -4
  66. package/dist/{login-RET5WESK.js → login-RIJF2F4G.js} +3 -2
  67. package/dist/{logout-CGAGJN3L.js → logout-5MLHZALK.js} +3 -2
  68. package/dist/{logout-JRPBEMMR.js → logout-UZJRGY4Z.js} +3 -2
  69. package/dist/message-delivery-2FIM7QKO.js +32 -0
  70. package/dist/{mind-LUWRQUQ5.js → mind-2B6M7Y25.js} +18 -18
  71. package/dist/{mind-activity-tracker-VYN2ZZ2M.js → mind-activity-tracker-NZZT2NTT.js} +4 -3
  72. package/dist/{mind-list-V5WW5DUA.js → mind-list-WUPMQDYQ.js} +3 -2
  73. package/dist/mind-manager-BNCMGYXW.js +28 -0
  74. package/dist/mind-service-AV273WT4.js +34 -0
  75. package/dist/{mind-sleep-R6PTNNW4.js → mind-sleep-B7BHJLH7.js} +5 -4
  76. package/dist/{mind-status-I4ISFJ6I.js → mind-status-L3EFFRPR.js} +3 -2
  77. package/dist/{mind-wake-67ZQEWAV.js → mind-wake-GY3RFX7Y.js} +5 -4
  78. package/dist/{package-OYUD4ZJ4.js → package-PK6JUFL3.js} +3 -3
  79. package/dist/read-5AMJRO3D.js +75 -0
  80. package/dist/{register-NZDSTLP3.js → register-V2JZZKFK.js} +5 -4
  81. package/dist/{registry-ODSALQQL.js → registry-PJ4S5PHQ.js} +8 -1
  82. package/dist/{reject-2HZOJEIJ.js → reject-33HEZMZ4.js} +5 -4
  83. package/dist/{restart-QHS3NT64.js → restart-3UCMRUVC.js} +5 -4
  84. package/dist/{sandbox-O5FUSF43.js → sandbox-JANNTX6U.js} +4 -3
  85. package/dist/schema-PA3M5ZKH.js +32 -0
  86. package/dist/seed-ALUQ55FF.js +112 -0
  87. package/dist/{send-OAN3RYYY.js → send-3MI36LEF.js} +58 -69
  88. package/dist/{setup-QMDK5RZX.js → setup-SZIARWI6.js} +5 -4
  89. package/dist/{setup-XJH3E7YM.js → setup-WENLVPVP.js} +9 -9
  90. package/dist/{skill-FZIN4W4Q.js → skill-TUVOTW4Z.js} +5 -4
  91. package/dist/skills/dreaming/SKILL.md +6 -4
  92. package/dist/skills/dreaming/references/INSTALL.md +4 -5
  93. package/dist/skills/dreaming/scripts/dream.ts +5 -27
  94. package/dist/skills/dreaming/scripts/wake-context-dreams.sh +1 -1
  95. package/dist/skills/imagegen/SKILL.md +6 -5
  96. package/dist/skills/imagegen/references/INSTALL.md +1 -1
  97. package/dist/skills/resonance/SKILL.md +4 -1
  98. package/dist/skills/resonance/references/INSTALL.md +2 -2
  99. package/dist/skills/resonance/scripts/resonance-hook.sh +2 -0
  100. package/dist/skills/resonance/scripts/resonance.ts +35 -5
  101. package/dist/skills/volute-admin/SKILL.md +83 -0
  102. package/dist/skills/volute-mind/SKILL.md +12 -12
  103. package/dist/skills-XNZK6P4K.js +61 -0
  104. package/dist/sleep-manager-53DZOWW7.js +32 -0
  105. package/dist/spirit-N4W4UQRH.js +217 -0
  106. package/dist/{split-EXYGGGQN.js → split-STOROBYJ.js} +1 -1
  107. package/dist/{sprout-AXQ6H5DB.js → sprout-L2GFOVF7.js} +9 -8
  108. package/dist/{start-MTOVL6SY.js → start-K2NCUUCG.js} +5 -4
  109. package/dist/{status-ZRO37MWR.js → status-TCUMUO6M.js} +5 -5
  110. package/dist/{stop-OK5WEPVC.js → stop-H26JZDXF.js} +5 -4
  111. package/dist/system-chat-NPYFYZVI.js +32 -0
  112. package/dist/{systems-W3BBMSOZ.js → systems-DHBKVYEY.js} +6 -5
  113. package/dist/{tailscale-BM72RXCJ.js → tailscale-XHQBZROW.js} +2 -1
  114. package/dist/{template-hash-3HOR4UAJ.js → template-hash-A6VVKOXJ.js} +2 -1
  115. package/dist/up-6I6BHRTO.js +17 -0
  116. package/dist/{update-PLPHMMZ2.js → update-QVPRF6GR.js} +5 -5
  117. package/dist/{update-check-CVCN7MF6.js → update-check-ZD6OOIYQ.js} +3 -2
  118. package/dist/{upgrade-I6NPCYUU.js → upgrade-O4Q7WJM3.js} +12 -14
  119. package/dist/{version-notify-2NTWVEHL.js → version-notify-TCKWBZZG.js} +22 -23
  120. package/dist/web-assets/assets/index-Bui7U9Uu.css +1 -0
  121. package/dist/web-assets/assets/index-e36DIo1b.js +73 -0
  122. package/dist/web-assets/ext-theme.css +94 -0
  123. package/dist/web-assets/index.html +2 -2
  124. package/drizzle/0000_baseline.sql +152 -0
  125. package/drizzle/0001_add_conversation_private.sql +1 -0
  126. package/drizzle/0002_turns.sql +21 -0
  127. package/drizzle/0003_turn_feed_links.sql +11 -0
  128. package/drizzle/0004_spirits.sql +5 -0
  129. package/drizzle/meta/0000_snapshot.json +3 -223
  130. package/drizzle/meta/0001_snapshot.json +3 -294
  131. package/drizzle/meta/0002_snapshot.json +3 -335
  132. package/drizzle/meta/0003_snapshot.json +3 -413
  133. package/drizzle/meta/0004_snapshot.json +3 -406
  134. package/drizzle/meta/_journal.json +10 -101
  135. package/package.json +3 -3
  136. package/packages/extensions/notes/dist/ui/assets/index-8jWEv9SA.js +61 -0
  137. package/packages/extensions/notes/dist/ui/assets/index-DkaB7Ytd.css +1 -0
  138. package/packages/extensions/notes/dist/ui/index.html +2 -2
  139. package/packages/extensions/notes/skills/notes/SKILL.md +8 -8
  140. package/packages/extensions/pages/skills/pages/SKILL.md +17 -44
  141. package/templates/_base/.init/.config/hooks/pre-prompt/session-activity.ts +40 -0
  142. package/templates/_base/.init/.local/bin/volute +27 -0
  143. package/templates/_base/.init/.local/hooks/pre-prompt/session-activity.ts +40 -0
  144. package/templates/_base/.init/.local/hooks/startup-context.ts +58 -0
  145. package/templates/_base/home/.config/routes.json +1 -1
  146. package/templates/_base/src/lib/auto-commit.ts +82 -43
  147. package/templates/_base/src/lib/daemon-client.ts +40 -36
  148. package/templates/_base/src/lib/format-prefix.ts +1 -0
  149. package/templates/_base/src/lib/hook-loader.ts +155 -0
  150. package/templates/_base/src/lib/router.ts +17 -1
  151. package/templates/_base/src/lib/startup.ts +17 -12
  152. package/templates/_base/src/lib/transparency.ts +2 -2
  153. package/templates/_base/src/lib/volute-server.ts +2 -5
  154. package/templates/claude/.init/.claude/settings.json +1 -1
  155. package/templates/claude/.init/.config/routes.json +2 -2
  156. package/templates/claude/src/agent.ts +97 -14
  157. package/templates/claude/src/lib/hooks/auto-commit.ts +7 -3
  158. package/templates/claude/src/lib/message-channel.ts +7 -2
  159. package/templates/claude/src/server.ts +0 -9
  160. package/templates/codex/.init/.config/routes.json +11 -0
  161. package/templates/codex/.init/AGENTS.md +29 -0
  162. package/templates/codex/home/.config/config.json.tmpl +7 -0
  163. package/templates/codex/package.json.tmpl +20 -0
  164. package/templates/codex/src/agent.ts +553 -0
  165. package/templates/codex/src/lib/content.ts +16 -0
  166. package/templates/codex/src/lib/session-store.ts +56 -0
  167. package/templates/codex/src/server.ts +59 -0
  168. package/templates/codex/volute-template.json +8 -0
  169. package/templates/pi/.init/.config/routes.json +2 -2
  170. package/templates/pi/package.json.tmpl +1 -1
  171. package/templates/pi/src/agent.ts +63 -9
  172. package/templates/pi/src/lib/event-handler.ts +6 -4
  173. package/templates/pi/src/lib/reply-instructions-extension.ts +32 -11
  174. package/dist/chunk-7D47T4RB.js +0 -84
  175. package/dist/chunk-CVH6Y2YG.js +0 -59
  176. package/dist/chunk-EFP3PE6C.js +0 -232
  177. package/dist/chunk-LIRWLNAK.js +0 -729
  178. package/dist/daemon-client-BCTFGVCZ.js +0 -9
  179. package/dist/down-NGBMGORS.js +0 -14
  180. package/dist/message-delivery-6YMVNOEC.js +0 -28
  181. package/dist/migrate-registry-to-db-FK35IPEH.js +0 -110
  182. package/dist/mind-manager-YFCOIAAX.js +0 -18
  183. package/dist/pages-watcher-Z3PKNROC.js +0 -21
  184. package/dist/read-WQMPTSN2.js +0 -46
  185. package/dist/seed-WUQMPLDM.js +0 -71
  186. package/dist/skills/sessions/SKILL.md +0 -49
  187. package/dist/sleep-manager-O7YQFCV5.js +0 -30
  188. package/dist/up-BXUAIDXB.js +0 -17
  189. package/dist/web-assets/assets/index--kREqKl9.js +0 -72
  190. package/dist/web-assets/assets/index-BXYTG0nJ.css +0 -1
  191. package/drizzle/0000_flaky_mariko_yashida.sql +0 -34
  192. package/drizzle/0001_careless_warpath.sql +0 -12
  193. package/drizzle/0002_wealthy_the_call.sql +0 -6
  194. package/drizzle/0003_clean_ego.sql +0 -12
  195. package/drizzle/0004_magical_silverclaw.sql +0 -1
  196. package/drizzle/0005_rename_agents_to_minds.sql +0 -11
  197. package/drizzle/0006_mind_history.sql +0 -20
  198. package/drizzle/0007_system_prompts.sql +0 -5
  199. package/drizzle/0008_volute_channels.sql +0 -24
  200. package/drizzle/0009_shared_skills.sql +0 -9
  201. package/drizzle/0010_delivery_queue.sql +0 -12
  202. package/drizzle/0011_rename_human_to_brain.sql +0 -1
  203. package/drizzle/0012_activity.sql +0 -11
  204. package/drizzle/0013_user_profiles.sql +0 -3
  205. package/drizzle/0014_conversation_reads.sql +0 -7
  206. package/drizzle/0015_notes.sql +0 -23
  207. package/drizzle/0016_note_reactions_and_replies.sql +0 -15
  208. package/drizzle/0017_minds.sql +0 -16
  209. package/drizzle/meta/0005_snapshot.json +0 -410
  210. package/drizzle/meta/0006_snapshot.json +0 -7
  211. package/drizzle/meta/0007_snapshot.json +0 -7
  212. package/drizzle/meta/0008_snapshot.json +0 -7
  213. package/drizzle/meta/0009_snapshot.json +0 -7
  214. package/drizzle/meta/0010_snapshot.json +0 -7
  215. package/drizzle/meta/0011_snapshot.json +0 -7
  216. package/drizzle/meta/0012_snapshot.json +0 -7
  217. package/drizzle/meta/0013_snapshot.json +0 -7
  218. package/packages/extensions/notes/dist/ui/assets/index-DgawVO5g.css +0 -1
  219. package/packages/extensions/notes/dist/ui/assets/index-qUWoeC4c.js +0 -2
  220. package/packages/extensions/notes/skills/notes/scripts/notes.mjs +0 -185
  221. package/templates/_base/.init/.config/hooks/startup-context.sh +0 -46
  222. package/templates/_base/.init/.config/scripts/session-reader.ts +0 -59
  223. package/templates/_base/home/public/.gitkeep +0 -0
  224. package/templates/_base/src/lib/session-monitor.ts +0 -400
  225. package/templates/claude/src/lib/hooks/session-context.ts +0 -32
  226. package/templates/pi/src/lib/session-context-extension.ts +0 -35
  227. /package/templates/_base/.init/{.config → .local}/hooks/wake-context.sh +0 -0
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "volute",
7
- version: "0.30.1",
7
+ version: "0.32.0",
8
8
  description: "CLI for creating and managing self-modifying AI minds powered by the Claude Agent SDK",
9
9
  type: "module",
10
10
  license: "MIT",
@@ -70,6 +70,7 @@ var package_default = {
70
70
  "@hono/node-server": "^1.19.9",
71
71
  "@hono/zod-validator": "^0.7.6",
72
72
  "@libsql/client": "^0.17.0",
73
+ "@mariozechner/pi-ai": "^0.58.1",
73
74
  "@slack/bolt": "^4.6.0",
74
75
  "adm-zip": "^0.5.16",
75
76
  bcryptjs: "^3.0.3",
@@ -79,13 +80,12 @@ var package_default = {
79
80
  hono: "^4.11.7",
80
81
  libsql: "^0.5.22",
81
82
  telegraf: "^4.16.3",
82
- "@mariozechner/pi-ai": "^0.52.7",
83
83
  zod: "^4.3.6"
84
84
  },
85
85
  devDependencies: {
86
86
  "@anthropic-ai/claude-agent-sdk": "^0.2.34",
87
87
  "@biomejs/biome": "2.3.14",
88
- "@mariozechner/pi-coding-agent": "^0.52.7",
88
+ "@mariozechner/pi-coding-agent": "^0.58.1",
89
89
  "@sveltejs/vite-plugin-svelte": "^6.2.4",
90
90
  "@types/adm-zip": "^0.5.7",
91
91
  "@types/bcryptjs": "^2.4.6",
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ resolveMindName
4
+ } from "./chunk-NAOW2CLO.js";
5
+ import {
6
+ parseArgs
7
+ } from "./chunk-D424ZQGI.js";
8
+ import {
9
+ daemonFetch
10
+ } from "./chunk-UKVWJRKN.js";
11
+ import "./chunk-LRCG2JLP.js";
12
+ import "./chunk-RPZZSXV3.js";
13
+ import "./chunk-K3NQKI34.js";
14
+
15
+ // src/commands/chat/read.ts
16
+ async function resolveConversationId(mindName, input) {
17
+ if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(input)) {
18
+ return input;
19
+ }
20
+ const res = await daemonFetch(`/api/minds/${encodeURIComponent(mindName)}/conversations`);
21
+ if (!res.ok) {
22
+ return input;
23
+ }
24
+ const convs = await res.json();
25
+ const cleaned = input.replace(/^[@#]/, "");
26
+ const lower = cleaned.toLowerCase();
27
+ const channelMatch = convs.find((c) => c.type === "channel" && c.name?.toLowerCase() === lower);
28
+ if (channelMatch) return channelMatch.id;
29
+ const titleMatch = convs.find((c) => c.title?.toLowerCase() === lower);
30
+ if (titleMatch) return titleMatch.id;
31
+ const dmMatch = convs.find(
32
+ (c) => c.type === "dm" && c.title?.toLowerCase().split(/,\s*/).some((name) => name === lower)
33
+ );
34
+ if (dmMatch) return dmMatch.id;
35
+ const prefixMatch = convs.find((c) => c.id.startsWith(input));
36
+ if (prefixMatch) return prefixMatch.id;
37
+ return input;
38
+ }
39
+ async function run(args) {
40
+ const { positional, flags } = parseArgs(args, {
41
+ mind: { type: "string" },
42
+ limit: { type: "number" }
43
+ });
44
+ const input = positional[0];
45
+ if (!input) {
46
+ console.error("Usage: volute chat read <conversation> [--limit N] [--mind <name>]");
47
+ process.exit(1);
48
+ }
49
+ const mindName = resolveMindName(flags);
50
+ const conversationId = await resolveConversationId(mindName, input);
51
+ const limit = String(flags.limit ?? 50);
52
+ const res = await daemonFetch(
53
+ `/api/minds/${encodeURIComponent(mindName)}/conversations/${encodeURIComponent(conversationId)}/messages?limit=${limit}`
54
+ );
55
+ if (!res.ok) {
56
+ console.error(`Failed to read conversation: ${res.status}`);
57
+ process.exit(1);
58
+ }
59
+ const data = await res.json();
60
+ if (!Array.isArray(data.items)) {
61
+ console.error("Unexpected response format from server");
62
+ process.exit(1);
63
+ }
64
+ for (const msg of data.items) {
65
+ const sender = msg.sender_name ?? msg.role;
66
+ const text = Array.isArray(msg.content) ? msg.content.filter((b) => b.type === "text").map((b) => b.text).join("") : msg.content;
67
+ const time = new Date(
68
+ msg.created_at.endsWith("Z") ? msg.created_at : `${msg.created_at}Z`
69
+ ).toLocaleString();
70
+ console.log(`[${time}] ${sender}: ${text}`);
71
+ }
72
+ }
73
+ export {
74
+ run
75
+ };
@@ -2,13 +2,14 @@
2
2
  import {
3
3
  promptLine
4
4
  } from "./chunk-SSI47XP2.js";
5
- import {
6
- daemonFetch
7
- } from "./chunk-EFVHR7KH.js";
8
5
  import {
9
6
  parseArgs
10
7
  } from "./chunk-D424ZQGI.js";
11
- import "./chunk-HHTXM4JT.js";
8
+ import {
9
+ daemonFetch
10
+ } from "./chunk-UKVWJRKN.js";
11
+ import "./chunk-LRCG2JLP.js";
12
+ import "./chunk-RPZZSXV3.js";
12
13
  import "./chunk-K3NQKI34.js";
13
14
 
14
15
  // src/commands/systems/register.ts
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  addMind,
4
+ addSpirit,
4
5
  addVariant,
5
6
  daemonLoopback,
6
7
  ensureSystemDir,
@@ -12,7 +13,9 @@ import {
12
13
  nextPort,
13
14
  readAllMinds,
14
15
  readRegistry,
16
+ readSpirits,
15
17
  removeMind,
18
+ resolveMindDir,
16
19
  setMindRunning,
17
20
  setMindStage,
18
21
  setMindTemplateHash,
@@ -21,10 +24,12 @@ import {
21
24
  voluteHome,
22
25
  voluteSystemDir,
23
26
  voluteUserHome
24
- } from "./chunk-HHTXM4JT.js";
27
+ } from "./chunk-LRCG2JLP.js";
28
+ import "./chunk-RPZZSXV3.js";
25
29
  import "./chunk-K3NQKI34.js";
26
30
  export {
27
31
  addMind,
32
+ addSpirit,
28
33
  addVariant,
29
34
  daemonLoopback,
30
35
  ensureSystemDir,
@@ -36,7 +41,9 @@ export {
36
41
  nextPort,
37
42
  readAllMinds,
38
43
  readRegistry,
44
+ readSpirits,
39
45
  removeMind,
46
+ resolveMindDir,
40
47
  setMindRunning,
41
48
  setMindStage,
42
49
  setMindTemplateHash,
@@ -2,13 +2,14 @@
2
2
  import {
3
3
  resolveMindName
4
4
  } from "./chunk-NAOW2CLO.js";
5
- import {
6
- daemonFetch
7
- } from "./chunk-EFVHR7KH.js";
8
5
  import {
9
6
  parseArgs
10
7
  } from "./chunk-D424ZQGI.js";
11
- import "./chunk-HHTXM4JT.js";
8
+ import {
9
+ daemonFetch
10
+ } from "./chunk-UKVWJRKN.js";
11
+ import "./chunk-LRCG2JLP.js";
12
+ import "./chunk-RPZZSXV3.js";
12
13
  import "./chunk-K3NQKI34.js";
13
14
 
14
15
  // src/commands/chat/reject.ts
@@ -2,14 +2,15 @@
2
2
  import {
3
3
  resolveMindName
4
4
  } from "./chunk-NAOW2CLO.js";
5
- import {
6
- daemonFetch
7
- } from "./chunk-EFVHR7KH.js";
8
5
  import {
9
6
  getClient,
10
7
  urlOf
11
8
  } from "./chunk-4RQBJWQX.js";
12
- import "./chunk-HHTXM4JT.js";
9
+ import {
10
+ daemonFetch
11
+ } from "./chunk-UKVWJRKN.js";
12
+ import "./chunk-LRCG2JLP.js";
13
+ import "./chunk-RPZZSXV3.js";
13
14
  import "./chunk-K3NQKI34.js";
14
15
 
15
16
  // src/commands/restart.ts
@@ -5,10 +5,11 @@ import {
5
5
  isSandboxEnabled,
6
6
  shellEscape,
7
7
  wrapForSandbox
8
- } from "./chunk-IKHDUZRH.js";
8
+ } from "./chunk-SX5TKJBZ.js";
9
9
  import "./chunk-YUIHSKR6.js";
10
- import "./chunk-7D47T4RB.js";
11
- import "./chunk-HHTXM4JT.js";
10
+ import "./chunk-TSXLLQZW.js";
11
+ import "./chunk-LRCG2JLP.js";
12
+ import "./chunk-RPZZSXV3.js";
12
13
  import "./chunk-K3NQKI34.js";
13
14
  export {
14
15
  buildDenyRead,
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ activity,
4
+ conversationParticipants,
5
+ conversationReads,
6
+ conversations,
7
+ deliveryQueue,
8
+ messages,
9
+ mindHistory,
10
+ minds,
11
+ sessions,
12
+ sharedSkills,
13
+ systemPrompts,
14
+ turns,
15
+ users
16
+ } from "./chunk-RPZZSXV3.js";
17
+ import "./chunk-K3NQKI34.js";
18
+ export {
19
+ activity,
20
+ conversationParticipants,
21
+ conversationReads,
22
+ conversations,
23
+ deliveryQueue,
24
+ messages,
25
+ mindHistory,
26
+ minds,
27
+ sessions,
28
+ sharedSkills,
29
+ systemPrompts,
30
+ turns,
31
+ users
32
+ };
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ promptLine
4
+ } from "./chunk-SSI47XP2.js";
5
+ import {
6
+ parseArgs
7
+ } from "./chunk-D424ZQGI.js";
8
+ import "./chunk-K3NQKI34.js";
9
+
10
+ // src/commands/seed.ts
11
+ async function chooseModel(daemonFetch) {
12
+ const res = await daemonFetch("/api/system/ai/models");
13
+ if (!res.ok) {
14
+ console.error(`Failed to fetch AI models (HTTP ${res.status}). Is the daemon running?`);
15
+ process.exit(1);
16
+ }
17
+ const models = await res.json();
18
+ const enabled = models.filter((m) => m.enabled);
19
+ if (enabled.length === 0) return void 0;
20
+ console.log("\nAvailable models:");
21
+ for (let i = 0; i < enabled.length; i++) {
22
+ console.log(` ${i + 1}) ${enabled[i].name} (${enabled[i].provider})`);
23
+ }
24
+ const answer = await promptLine(`
25
+ Choose a model [1-${enabled.length}]: `);
26
+ const idx = parseInt(answer, 10) - 1;
27
+ if (Number.isNaN(idx) || idx < 0 || idx >= enabled.length) {
28
+ console.error("Invalid selection");
29
+ process.exit(1);
30
+ }
31
+ const chosen = enabled[idx];
32
+ return `${chosen.provider}:${chosen.id}`;
33
+ }
34
+ async function run(args) {
35
+ const { positional, flags } = parseArgs(args, {
36
+ template: { type: "string" },
37
+ model: { type: "string" },
38
+ description: { type: "string" },
39
+ skills: { type: "string" },
40
+ "created-by": { type: "string" }
41
+ });
42
+ const name = positional[0];
43
+ if (!name) {
44
+ console.error(
45
+ "Usage: volute mind seed <name> [--template <name>] [--model <model>] [--description <text>] [--skills <list|none>] [--created-by <username>]"
46
+ );
47
+ process.exit(1);
48
+ }
49
+ const skills = flags.skills === "none" ? [] : flags.skills ? flags.skills.split(",") : void 0;
50
+ const createdBy = flags["created-by"];
51
+ const { daemonFetch } = await import("./daemon-client-6QXHZ7US.js");
52
+ const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
53
+ const client = getClient();
54
+ let model = flags.model;
55
+ let template = flags.template;
56
+ if (!template) {
57
+ const { resolveTemplate } = await import("./ai-service-ZIPCV3MX.js");
58
+ template = resolveTemplate(model);
59
+ }
60
+ if (template !== "claude" && !model) {
61
+ if (process.env.VOLUTE_MIND || !process.stdin.isTTY) {
62
+ const { getSpiritModel } = await import("./spirit-N4W4UQRH.js");
63
+ const { qualifyModelId } = await import("./ai-service-ZIPCV3MX.js");
64
+ const spiritModel = getSpiritModel();
65
+ if (spiritModel) {
66
+ model = template === "pi" ? qualifyModelId(spiritModel) : spiritModel;
67
+ }
68
+ }
69
+ if (!model) {
70
+ model = await chooseModel(daemonFetch);
71
+ if (!model) {
72
+ console.error("No AI models configured. Set up providers in the web dashboard first.");
73
+ process.exit(1);
74
+ }
75
+ }
76
+ }
77
+ const createRes = await daemonFetch(urlOf(client.api.minds.$url()), {
78
+ method: "POST",
79
+ headers: { "Content-Type": "application/json" },
80
+ body: JSON.stringify({
81
+ name,
82
+ template,
83
+ stage: "seed",
84
+ description: flags.description,
85
+ model,
86
+ skills,
87
+ createdBy
88
+ })
89
+ });
90
+ const createData = await createRes.json();
91
+ if (!createRes.ok) {
92
+ console.error(createData.error ?? "Failed to create mind");
93
+ process.exit(1);
94
+ }
95
+ const startRes = await daemonFetch(
96
+ urlOf(client.api.minds[":name"].start.$url({ param: { name } })),
97
+ { method: "POST" }
98
+ );
99
+ if (!startRes.ok) {
100
+ const startData = await startRes.json();
101
+ console.error(startData.error ?? "Failed to start mind");
102
+ process.exit(1);
103
+ }
104
+ console.log(`
105
+ Seeded mind: ${name} (port ${createData.port})`);
106
+ console.log(`
107
+ Talk to your new mind:`);
108
+ console.log(` volute chat send @${name} "hello"`);
109
+ }
110
+ export {
111
+ run
112
+ };
@@ -1,21 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- resolveMindName
4
- } from "./chunk-NAOW2CLO.js";
5
- import {
6
- daemonFetch
7
- } from "./chunk-EFVHR7KH.js";
8
2
  import {
9
3
  getClient,
10
4
  urlOf
11
5
  } from "./chunk-4RQBJWQX.js";
12
6
  import {
13
7
  formatFileSize
14
- } from "./chunk-JGFRDMR6.js";
8
+ } from "./chunk-ALEF47VT.js";
15
9
  import {
16
10
  parseArgs
17
11
  } from "./chunk-D424ZQGI.js";
18
- import "./chunk-HHTXM4JT.js";
12
+ import {
13
+ daemonFetch
14
+ } from "./chunk-UKVWJRKN.js";
15
+ import "./chunk-LRCG2JLP.js";
16
+ import "./chunk-RPZZSXV3.js";
19
17
  import "./chunk-K3NQKI34.js";
20
18
 
21
19
  // src/commands/send.ts
@@ -40,14 +38,14 @@ function parseTarget(target) {
40
38
  return {
41
39
  platform: "volute",
42
40
  identifier: target,
43
- uri: `volute:${target}`,
41
+ uri: target,
44
42
  isDM: true
45
43
  };
46
44
  }
47
45
  return {
48
46
  platform: "volute",
49
47
  identifier: target,
50
- uri: `volute:${target}`,
48
+ uri: target,
51
49
  isDM: false
52
50
  };
53
51
  }
@@ -168,7 +166,6 @@ async function waitForResponse(mindName, conversationId, timeoutMs) {
168
166
  }
169
167
  async function run(args) {
170
168
  const { positional, flags } = parseArgs(args, {
171
- mind: { type: "string" },
172
169
  image: { type: "string" },
173
170
  file: { type: "string" },
174
171
  wait: { type: "boolean" },
@@ -180,14 +177,13 @@ async function run(args) {
180
177
  const images = flags.image ? [loadImage(flags.image)] : void 0;
181
178
  if (!target || !message && !images && !flags.file) {
182
179
  console.error(
183
- 'Usage: volute chat send <target> "<message>" [--mind <name>] [--image <path>] [--file <path>] [--wait]'
180
+ 'Usage: volute chat send <target> "<message>" [--image <path>] [--file <path>] [--wait]'
184
181
  );
185
- console.error(' echo "message" | volute chat send <target> [--mind <name>]');
182
+ console.error(' echo "message" | volute chat send <target>');
186
183
  console.error("");
187
184
  console.error("Examples:");
188
185
  console.error(' volute chat send @other-mind "hello"');
189
- console.error(' volute chat send animal-chat "hello everyone"');
190
- console.error(' volute chat send discord:server/channel "hello"');
186
+ console.error(' volute chat send #animal-chat "hello everyone"');
191
187
  console.error(' volute chat send @mind "check this out" --image photo.png');
192
188
  console.error(" volute chat send @mind --image photo.png");
193
189
  console.error(' volute chat send @mind "check this out" --file notes.txt');
@@ -259,13 +255,13 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
259
255
  parsed = {
260
256
  platform: "volute",
261
257
  identifier: `@${parsed.identifier}`,
262
- uri: `volute:@${parsed.identifier}`,
258
+ uri: `@${parsed.identifier}`,
263
259
  isDM: true
264
260
  };
265
261
  }
266
262
  const client = getClient();
267
263
  let waitMindName;
268
- let channelUri = parsed.uri;
264
+ let waitConversationId;
269
265
  if (parsed.isDM && parsed.platform === "volute") {
270
266
  const targetName = parsed.identifier.slice(1);
271
267
  const mindSelf = process.env.VOLUTE_MIND;
@@ -287,17 +283,16 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
287
283
  console.error(data.error);
288
284
  process.exit(1);
289
285
  }
290
- const { slug } = await createRes.json();
291
- channelUri = slug;
286
+ const { conversationId: convId } = await createRes.json();
287
+ if (convId) waitConversationId = convId;
292
288
  const sendRes = await daemonFetch(
293
- urlOf(client.api.minds[":name"].channels.send.$url({ param: { name: contextMind } })),
289
+ urlOf(client.api.minds[":name"].chat.$url({ param: { name: contextMind } })),
294
290
  {
295
291
  method: "POST",
296
292
  headers: { "Content-Type": "application/json" },
297
293
  body: JSON.stringify({
298
- platform: "volute",
299
- uri: channelUri,
300
294
  message: message ?? "",
295
+ conversationId: convId,
301
296
  images,
302
297
  sender
303
298
  })
@@ -309,69 +304,63 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
309
304
  process.exit(1);
310
305
  }
311
306
  if (!flags.wait) console.log("Message sent.");
312
- if (mindSelf) {
313
- try {
314
- const histRes = await daemonFetch(
315
- urlOf(client.api.minds[":name"].history.$url({ param: { name: mindSelf } })),
316
- {
317
- method: "POST",
318
- headers: { "Content-Type": "application/json" },
319
- body: JSON.stringify({ channel: parsed.uri, content: message ?? "" })
320
- }
321
- );
322
- if (!histRes.ok) {
323
- console.error(`Failed to persist to history: HTTP ${histRes.status}`);
324
- }
325
- } catch (err) {
326
- console.error(`Failed to persist to history: ${err instanceof Error ? err.message : err}`);
327
- }
307
+ } else if (!parsed.isDM && parsed.platform === "volute") {
308
+ if (!parsed.identifier.startsWith("#")) {
309
+ console.error(
310
+ `Mind "${parsed.identifier}" not found.
311
+ To send a DM: volute chat send @${parsed.identifier} "..."
312
+ To send to channel: volute chat send #${parsed.identifier} "..."`
313
+ );
314
+ process.exit(1);
328
315
  }
329
- } else {
330
- const mindName = resolveMindName(flags);
331
- const res = await daemonFetch(
332
- urlOf(client.api.minds[":name"].channels.send.$url({ param: { name: mindName } })),
316
+ const channelName = parsed.identifier.slice(1);
317
+ const mindSelf = process.env.VOLUTE_MIND;
318
+ const sender = flags.sender || mindSelf || userInfo().username;
319
+ const channelRes = await daemonFetch(`/api/volute/channels/${encodeURIComponent(channelName)}`);
320
+ if (!channelRes.ok) {
321
+ console.error(`Channel "${channelName}" not found. Create it first or check the name.`);
322
+ process.exit(1);
323
+ }
324
+ const channelData = await channelRes.json();
325
+ const mindParticipant = channelData.participants?.find((p) => p.userType === "mind");
326
+ const contextMind = mindSelf ?? mindParticipant?.username;
327
+ if (!contextMind) {
328
+ console.error("No mind is a member of this channel. A mind must join the channel first.");
329
+ process.exit(1);
330
+ }
331
+ const sendRes = await daemonFetch(
332
+ urlOf(client.api.minds[":name"].chat.$url({ param: { name: contextMind } })),
333
333
  {
334
334
  method: "POST",
335
335
  headers: { "Content-Type": "application/json" },
336
336
  body: JSON.stringify({
337
- platform: parsed.platform,
338
- uri: channelUri,
339
337
  message: message ?? "",
340
- images
338
+ conversationId: channelData.id,
339
+ images,
340
+ sender
341
341
  })
342
342
  }
343
343
  );
344
- if (!res.ok) {
345
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
346
- console.error(body.error);
344
+ if (!sendRes.ok) {
345
+ const data = await sendRes.json().catch(() => ({ error: "Unknown error" }));
346
+ console.error(data.error);
347
347
  process.exit(1);
348
348
  }
349
- if (!flags.wait) console.log("Message sent.");
350
- if (process.env.VOLUTE_MIND) {
351
- try {
352
- const histRes = await daemonFetch(
353
- urlOf(client.api.minds[":name"].history.$url({ param: { name: mindName } })),
354
- {
355
- method: "POST",
356
- headers: { "Content-Type": "application/json" },
357
- body: JSON.stringify({ channel: channelUri, content: message ?? "" })
358
- }
359
- );
360
- if (!histRes.ok) {
361
- console.error(`Failed to persist to history: HTTP ${histRes.status}`);
362
- }
363
- } catch (err) {
364
- console.error(`Failed to persist to history: ${err instanceof Error ? err.message : err}`);
365
- }
366
- }
349
+ console.log("Message sent.");
350
+ } else {
351
+ console.error(
352
+ `Direct sends to ${parsed.platform} channels are no longer supported.
353
+ Use bridge channel names instead (e.g. volute chat send @mind-name or #channel-name).
354
+ See: volute chat bridge --help`
355
+ );
356
+ process.exit(1);
367
357
  }
368
358
  if (flags.wait && waitMindName) {
369
- const conversationId = channelUri.startsWith("volute:") ? channelUri.slice(7) : void 0;
370
- if (!conversationId) {
359
+ if (!waitConversationId) {
371
360
  console.error("--wait requires a volute conversation (DM to a mind)");
372
361
  process.exit(1);
373
362
  }
374
- await waitForResponse(waitMindName, conversationId, flags.timeout ?? 12e4);
363
+ await waitForResponse(waitMindName, waitConversationId, flags.timeout ?? 12e4);
375
364
  } else if (flags.wait && !waitMindName) {
376
365
  console.error("--wait is only supported when sending to a mind");
377
366
  process.exit(1);
@@ -2,16 +2,17 @@
2
2
  import {
3
3
  configPath,
4
4
  isSetupComplete,
5
- migrateSetupConfig,
5
+ migrateSetupCompleted,
6
6
  readGlobalConfig,
7
7
  writeGlobalConfig
8
- } from "./chunk-7D47T4RB.js";
9
- import "./chunk-HHTXM4JT.js";
8
+ } from "./chunk-TSXLLQZW.js";
9
+ import "./chunk-LRCG2JLP.js";
10
+ import "./chunk-RPZZSXV3.js";
10
11
  import "./chunk-K3NQKI34.js";
11
12
  export {
12
13
  configPath,
13
14
  isSetupComplete,
14
- migrateSetupConfig,
15
+ migrateSetupCompleted,
15
16
  readGlobalConfig,
16
17
  writeGlobalConfig
17
18
  };
@@ -5,24 +5,23 @@ import {
5
5
  SYSTEM_LAUNCHD_PLIST_PATH,
6
6
  SYSTEM_SERVICE_PATH,
7
7
  USER_SYSTEMD_UNIT
8
- } from "./chunk-FXHXHI2A.js";
8
+ } from "./chunk-LSGWR54X.js";
9
9
  import {
10
10
  promptLine
11
11
  } from "./chunk-SSI47XP2.js";
12
12
  import {
13
+ ensureVoluteGroup,
13
14
  resolveVoluteBin
14
- } from "./chunk-CVH6Y2YG.js";
15
- import {
16
- ensureVoluteGroup
17
- } from "./chunk-G3GBKZGG.js";
15
+ } from "./chunk-LGB6JBHI.js";
18
16
  import {
19
17
  readGlobalConfig,
20
18
  writeGlobalConfig
21
- } from "./chunk-7D47T4RB.js";
19
+ } from "./chunk-TSXLLQZW.js";
22
20
  import {
23
21
  parseArgs
24
22
  } from "./chunk-D424ZQGI.js";
25
- import "./chunk-HHTXM4JT.js";
23
+ import "./chunk-LRCG2JLP.js";
24
+ import "./chunk-RPZZSXV3.js";
26
25
  import "./chunk-K3NQKI34.js";
27
26
 
28
27
  // src/commands/setup.ts
@@ -373,7 +372,8 @@ Install as a service (auto-start on boot)? [${serviceDefault}]: `;
373
372
  const config = {
374
373
  ...existingConfig,
375
374
  name: systemName,
376
- setup
375
+ setup,
376
+ setupCompleted: true
377
377
  };
378
378
  if (port != null) config.port = port;
379
379
  if (host) config.hostname = host;
@@ -385,7 +385,7 @@ Install as a service (auto-start on boot)? [${serviceDefault}]: `;
385
385
  if (aiProvider) {
386
386
  const aiApiKey = (await promptLine("API key (leave empty to use env var): ")).trim();
387
387
  if (aiApiKey) {
388
- const { saveProviderConfig } = await import("./ai-service-VAJT5UBS.js");
388
+ const { saveProviderConfig } = await import("./ai-service-ZIPCV3MX.js");
389
389
  saveProviderConfig(aiProvider, { apiKey: aiApiKey });
390
390
  console.log(` AI provider configured: ${aiProvider}`);
391
391
  } else {
@@ -2,9 +2,6 @@
2
2
  import {
3
3
  resolveMindName
4
4
  } from "./chunk-NAOW2CLO.js";
5
- import {
6
- daemonFetch
7
- } from "./chunk-EFVHR7KH.js";
8
5
  import {
9
6
  getClient,
10
7
  urlOf
@@ -12,7 +9,11 @@ import {
12
9
  import {
13
10
  parseArgs
14
11
  } from "./chunk-D424ZQGI.js";
15
- import "./chunk-HHTXM4JT.js";
12
+ import {
13
+ daemonFetch
14
+ } from "./chunk-UKVWJRKN.js";
15
+ import "./chunk-LRCG2JLP.js";
16
+ import "./chunk-RPZZSXV3.js";
16
17
  import "./chunk-K3NQKI34.js";
17
18
 
18
19
  // src/commands/skill.ts