volute 0.26.0 → 0.27.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 (127) hide show
  1. package/README.md +13 -13
  2. package/dist/{activity-events-ZMBAKLUF.js → activity-events-BBIEA2F4.js} +2 -3
  3. package/dist/api.d.ts +363 -168
  4. package/dist/{archive-4ZQYK5MN.js → archive-UA4BDFXQ.js} +2 -2
  5. package/dist/{auth-4TV573WE.js → auth-D3OT2ARB.js} +3 -3
  6. package/dist/bridge-FQHZL3MC.js +206 -0
  7. package/dist/chat-MHJ3L6JQ.js +58 -0
  8. package/dist/{chunk-PHU4DEAJ.js → chunk-2WPW7OT6.js} +3 -3
  9. package/dist/{chunk-5Y3PBKW6.js → chunk-2YP2TVDT.js} +138 -56
  10. package/dist/{chunk-USNBKHYG.js → chunk-4WXYUOAK.js} +4 -6
  11. package/dist/{chunk-YJA7P64S.js → chunk-AW7PFDVN.js} +5 -5
  12. package/dist/{chunk-OZFKBXD6.js → chunk-EHYDTZTF.js} +6 -6
  13. package/dist/{chunk-LX22GRG7.js → chunk-GIE6CSN5.js} +11 -8
  14. package/dist/{chunk-WBHMQ5OZ.js → chunk-H7OZRFJB.js} +192 -12
  15. package/dist/{chunk-ON3FF5JA.js → chunk-HDN7MNGD.js} +3 -3
  16. package/dist/chunk-IAYBDWVG.js +477 -0
  17. package/dist/{chunk-TZKJLDQN.js → chunk-IKRVFPWU.js} +14 -9
  18. package/dist/{chunk-WGOGUMPO.js → chunk-JGFVMROS.js} +13 -6
  19. package/dist/{chunk-3TV4GLFO.js → chunk-JKOWNZ4P.js} +3 -3
  20. package/dist/{chunk-NWI2425I.js → chunk-K5NAC55T.js} +1 -1
  21. package/dist/{chunk-HFCBO2GL.js → chunk-KDGS53OS.js} +4 -4
  22. package/dist/chunk-KTLFDYPT.js +61 -0
  23. package/dist/{chunk-V63B7DX3.js → chunk-LAC664WU.js} +7 -4
  24. package/dist/{chunk-3CFRE2VC.js → chunk-OQZH4PBB.js} +337 -1061
  25. package/dist/{chunk-2VO7453N.js → chunk-PHSAT7YL.js} +30 -54
  26. package/dist/{chunk-XOXLRRR2.js → chunk-RKQEHRBB.js} +4 -3
  27. package/dist/chunk-T6HKBWXZ.js +23 -0
  28. package/dist/{chunk-UTL75LP6.js → chunk-USUXRNVD.js} +22 -22
  29. package/dist/{chunk-J2CO4WEV.js → chunk-VIVMW2H2.js} +4 -4
  30. package/dist/{chunk-KTJGZ7M7.js → chunk-XBLSAVJF.js} +1 -1
  31. package/dist/cli.js +31 -36
  32. package/dist/{cloud-sync-NI2K3C7G.js → cloud-sync-T7M3ESC3.js} +15 -14
  33. package/dist/connectors/discord-bridge.js +158 -0
  34. package/dist/connectors/slack-bridge.js +119 -0
  35. package/dist/connectors/telegram-bridge.js +133 -0
  36. package/dist/conversations-M2K4253F.js +55 -0
  37. package/dist/create-D7J73A6H.js +45 -0
  38. package/dist/{create-4YBRTTJS.js → create-QWV73WXD.js} +1 -1
  39. package/dist/{daemon-client-Z7FAJ6JW.js → daemon-client-I42FK2BF.js} +2 -2
  40. package/dist/{daemon-restart-BJZ3O4U4.js → daemon-restart-M2QTYMEG.js} +7 -7
  41. package/dist/daemon.js +1758 -1024
  42. package/dist/db-IC4J52XQ.js +8 -0
  43. package/dist/{delete-27OYNK25.js → delete-4JYGD4VN.js} +1 -1
  44. package/dist/down-LVBXEULC.js +14 -0
  45. package/dist/{env-M336ONDP.js → env-YJMUMFIY.js} +2 -2
  46. package/dist/{export-HP4G5DQC.js → export-BOJQWBMA.js} +4 -4
  47. package/dist/{file-HUDKTRAS.js → file-CR36YUPD.js} +4 -4
  48. package/dist/{history-B64GTFTD.js → history-XKRTAFS2.js} +5 -5
  49. package/dist/{import-XIB7UV4S.js → import-SRTQXBGH.js} +4 -4
  50. package/dist/join-J4QU42DL.js +66 -0
  51. package/dist/list-R73GENNL.js +40 -0
  52. package/dist/{log-PBFNILJ4.js → log-ABYNVYJ3.js} +4 -4
  53. package/dist/{login-B5E7N7MY.js → login-3QZNR2DF.js} +4 -4
  54. package/dist/{login-6U7U6BNG.js → login-XX37I52P.js} +2 -2
  55. package/dist/{logout-XSJRYS3U.js → logout-T53VKCPU.js} +4 -4
  56. package/dist/{logout-UKD5LA37.js → logout-W4KOOBIT.js} +2 -2
  57. package/dist/{logs-3CART7O7.js → logs-U35JR2KE.js} +5 -5
  58. package/dist/{merge-VK2HSKMA.js → merge-LNSMSAOF.js} +4 -4
  59. package/dist/message-delivery-LDXLGERA.js +25 -0
  60. package/dist/migrate-registry-to-db-XC7T5B7P.js +110 -0
  61. package/dist/{mind-HZ3QSDDJ.js → mind-DI33C74K.js} +25 -25
  62. package/dist/{mind-activity-tracker-4G6FURY2.js → mind-activity-tracker-EN6XNXPF.js} +3 -4
  63. package/dist/mind-manager-M6EMUW5I.js +18 -0
  64. package/dist/{mind-sleep-DTV7L44D.js → mind-sleep-BTSWQNAC.js} +4 -4
  65. package/dist/{mind-wake-PFN4FN3T.js → mind-wake-SBAKIDVP.js} +4 -4
  66. package/dist/{notes-37FW2UR2.js → notes-XCER3I7M.js} +11 -21
  67. package/dist/{package-VZWLXPHV.js → package-7WY6VKU3.js} +1 -1
  68. package/dist/{pages-DIIT5HMQ.js → pages-6EBS6CBR.js} +2 -2
  69. package/dist/{publish-HQV7YREB.js → publish-66UB2ZFY.js} +5 -5
  70. package/dist/{pull-2MB4SK3C.js → pull-XCHJTM5M.js} +4 -4
  71. package/dist/read-36UFXN3G.js +46 -0
  72. package/dist/{register-EFND67FQ.js → register-6B2CXTYM.js} +2 -2
  73. package/dist/{registry-D2BSQ2X5.js → registry-NDNOOYG4.js} +15 -9
  74. package/dist/{restart-CCK7D6TV.js → restart-6ESL3NBO.js} +5 -5
  75. package/dist/{sandbox-EHGFF52K.js → sandbox-TGBX22DS.js} +3 -3
  76. package/dist/{schedule-6F7ELB2M.js → schedule-QTJMFATP.js} +5 -5
  77. package/dist/{seed-E5OQGWX3.js → seed-SSUCYYDF.js} +2 -2
  78. package/dist/{send-IH6XZKPC.js → send-ZNCJDSRP.js} +25 -19
  79. package/dist/{service-LLBV3R7M.js → service-6LIN3F3K.js} +4 -4
  80. package/dist/{setup-F6TWFYGQ.js → setup-JG4QAEBV.js} +12 -12
  81. package/dist/{setup-YGAAIKKZ.js → setup-JHL5ZEST.js} +2 -2
  82. package/dist/{shared-UMO4S7CC.js → shared-ML5I4Q2A.js} +4 -4
  83. package/dist/{skill-42LGFBQC.js → skill-AUAQTSP5.js} +5 -5
  84. package/dist/skills/dreaming/references/INSTALL.md +2 -2
  85. package/dist/skills/orientation/SKILL.md +3 -3
  86. package/dist/skills/volute-mind/SKILL.md +32 -30
  87. package/dist/sleep-manager-MWYHM5HV.js +29 -0
  88. package/dist/split-TKJ5OT3P.js +63 -0
  89. package/dist/{sprout-QL74KR2X.js → sprout-IJVVKSJ2.js} +6 -7
  90. package/dist/{start-O5JQASRC.js → start-EUJSS5R4.js} +2 -2
  91. package/dist/{status-FZBEBM7Q.js → status-77YEPHMW.js} +5 -5
  92. package/dist/{status-WXD4HXRL.js → status-7GA4SM4Y.js} +4 -4
  93. package/dist/{status-LV34BG6G.js → status-THLOBLWG.js} +2 -2
  94. package/dist/{stop-2SOG5NYF.js → stop-3XAITBBF.js} +5 -5
  95. package/dist/{tailscale-AJ4VL5XK.js → tailscale-NY5MUMY3.js} +1 -1
  96. package/dist/up-NKSMXBWR.js +17 -0
  97. package/dist/{update-5VUDAI3D.js → update-PTSH22AZ.js} +9 -9
  98. package/dist/{update-check-F5Z3ALXX.js → update-check-64FWC4Y2.js} +2 -2
  99. package/dist/{upgrade-QCCO33BK.js → upgrade-HA47CS4C.js} +12 -5
  100. package/dist/variant-7TGZHOU3.js +41 -0
  101. package/dist/{version-notify-USFZBWMG.js → version-notify-5Z4MNR6M.js} +26 -30
  102. package/dist/web-assets/assets/index-CI5wgghI.css +1 -0
  103. package/dist/web-assets/assets/index-is5CvJWH.js +75 -0
  104. package/dist/web-assets/favicon.png +0 -0
  105. package/dist/web-assets/index.html +2 -2
  106. package/drizzle/0017_minds.sql +16 -0
  107. package/drizzle/meta/_journal.json +7 -0
  108. package/package.json +1 -1
  109. package/templates/_base/.init/.config/prompts.json +2 -2
  110. package/templates/_base/home/VOLUTE.md +5 -5
  111. package/templates/_base/src/lib/startup.ts +2 -2
  112. package/dist/channel-ZVZV42UD.js +0 -260
  113. package/dist/chunk-B2CPS4QU.js +0 -283
  114. package/dist/chunk-SIAG3QMM.js +0 -42
  115. package/dist/chunk-WSLPZF72.js +0 -173
  116. package/dist/connector-G722WXAU.js +0 -147
  117. package/dist/connectors/discord.js +0 -177
  118. package/dist/connectors/slack.js +0 -181
  119. package/dist/connectors/telegram.js +0 -187
  120. package/dist/down-7UKFMJJZ.js +0 -14
  121. package/dist/message-delivery-MS5JYPZX.js +0 -25
  122. package/dist/mind-manager-VVK67AY3.js +0 -19
  123. package/dist/sleep-manager-EE4NRN2Q.js +0 -29
  124. package/dist/up-SDMCSVI3.js +0 -17
  125. package/dist/variant-WWLDY6D5.js +0 -207
  126. package/dist/web-assets/assets/index-CUQ31ieL.js +0 -69
  127. package/dist/web-assets/assets/index-CW8NSl1o.css +0 -1
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- daemonFetch
4
- } from "./chunk-WGOGUMPO.js";
5
2
  import {
6
3
  resolveMindName
7
4
  } from "./chunk-NAOW2CLO.js";
5
+ import {
6
+ daemonFetch
7
+ } from "./chunk-JGFVMROS.js";
8
8
  import {
9
9
  parseArgs
10
10
  } from "./chunk-D424ZQGI.js";
11
- import "./chunk-B2CPS4QU.js";
11
+ import "./chunk-H7OZRFJB.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
14
14
  // src/commands/mind-sleep.ts
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- daemonFetch
4
- } from "./chunk-WGOGUMPO.js";
5
2
  import {
6
3
  resolveMindName
7
4
  } from "./chunk-NAOW2CLO.js";
5
+ import {
6
+ daemonFetch
7
+ } from "./chunk-JGFVMROS.js";
8
8
  import {
9
9
  parseArgs
10
10
  } from "./chunk-D424ZQGI.js";
11
- import "./chunk-B2CPS4QU.js";
11
+ import "./chunk-H7OZRFJB.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
14
14
  // src/commands/mind-wake.ts
@@ -4,11 +4,11 @@ import {
4
4
  } from "./chunk-ZYGKG6VC.js";
5
5
  import {
6
6
  daemonFetch
7
- } from "./chunk-WGOGUMPO.js";
7
+ } from "./chunk-JGFVMROS.js";
8
8
  import {
9
9
  parseArgs
10
10
  } from "./chunk-D424ZQGI.js";
11
- import "./chunk-B2CPS4QU.js";
11
+ import "./chunk-H7OZRFJB.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
14
14
  // src/commands/notes.ts
@@ -18,8 +18,7 @@ function apiUrl(path) {
18
18
  async function list(args) {
19
19
  const { flags } = parseArgs(args, {
20
20
  author: { type: "string" },
21
- limit: { type: "number" },
22
- mind: { type: "string" }
21
+ limit: { type: "number" }
23
22
  });
24
23
  const params = new URLSearchParams();
25
24
  if (flags.author) params.set("author", flags.author);
@@ -49,7 +48,6 @@ async function write(args) {
49
48
  const { flags } = parseArgs(args, {
50
49
  title: { type: "string" },
51
50
  content: { type: "string" },
52
- mind: { type: "string" },
53
51
  "reply-to": { type: "string" }
54
52
  });
55
53
  if (!flags.title) {
@@ -63,11 +61,9 @@ async function write(args) {
63
61
  console.error("Content required via --content or stdin");
64
62
  process.exit(1);
65
63
  }
66
- const asUser = process.env.VOLUTE_MIND ?? flags.mind;
67
- const params = asUser ? `?as=${encodeURIComponent(asUser)}` : "";
68
64
  const body = { title: flags.title, content };
69
65
  if (flags["reply-to"]) body.reply_to = flags["reply-to"];
70
- const res = await daemonFetch(`${apiUrl("")}${params}`, {
66
+ const res = await daemonFetch(apiUrl(""), {
71
67
  method: "POST",
72
68
  headers: { "Content-Type": "application/json" },
73
69
  body: JSON.stringify(body)
@@ -81,7 +77,7 @@ async function write(args) {
81
77
  console.log(`Published: ${note.author_username}/${note.slug}`);
82
78
  }
83
79
  async function read(args) {
84
- const { positional } = parseArgs(args, { mind: { type: "string" } });
80
+ const { positional } = parseArgs(args, {});
85
81
  const ref = positional[0];
86
82
  if (!ref || !ref.includes("/")) {
87
83
  console.error("Usage: volute notes read <author>/<slug>");
@@ -131,7 +127,7 @@ async function read(args) {
131
127
  }
132
128
  }
133
129
  async function react(args) {
134
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
130
+ const { positional } = parseArgs(args, {});
135
131
  const ref = positional[0];
136
132
  const emoji = positional[1];
137
133
  if (!ref || !ref.includes("/") || !emoji) {
@@ -139,9 +135,7 @@ async function react(args) {
139
135
  process.exit(1);
140
136
  }
141
137
  const [author, slug] = ref.split("/", 2);
142
- const asUser = process.env.VOLUTE_MIND ?? flags.mind;
143
- const params = asUser ? `?as=${encodeURIComponent(asUser)}` : "";
144
- const res = await daemonFetch(`${apiUrl(`/${author}/${slug}/reactions`)}${params}`, {
138
+ const res = await daemonFetch(apiUrl(`/${author}/${slug}/reactions`), {
145
139
  method: "POST",
146
140
  headers: { "Content-Type": "application/json" },
147
141
  body: JSON.stringify({ emoji })
@@ -155,7 +149,7 @@ async function react(args) {
155
149
  console.log(result.added ? `Reacted with ${emoji}` : `Removed ${emoji} reaction`);
156
150
  }
157
151
  async function comment(args) {
158
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
152
+ const { positional } = parseArgs(args, {});
159
153
  const ref = positional[0];
160
154
  const text = positional[1] ?? await readStdin();
161
155
  if (!ref || !ref.includes("/") || !text) {
@@ -163,9 +157,7 @@ async function comment(args) {
163
157
  process.exit(1);
164
158
  }
165
159
  const [author, slug] = ref.split("/", 2);
166
- const asUser = process.env.VOLUTE_MIND ?? flags.mind;
167
- const params = asUser ? `?as=${encodeURIComponent(asUser)}` : "";
168
- const res = await daemonFetch(`${apiUrl(`/${author}/${slug}/comments`)}${params}`, {
160
+ const res = await daemonFetch(apiUrl(`/${author}/${slug}/comments`), {
169
161
  method: "POST",
170
162
  headers: { "Content-Type": "application/json" },
171
163
  body: JSON.stringify({ content: text })
@@ -178,16 +170,14 @@ async function comment(args) {
178
170
  console.log("Comment added.");
179
171
  }
180
172
  async function del(args) {
181
- const { positional, flags } = parseArgs(args, { mind: { type: "string" } });
173
+ const { positional } = parseArgs(args, {});
182
174
  const ref = positional[0];
183
175
  if (!ref || !ref.includes("/")) {
184
176
  console.error("Usage: volute notes delete <author>/<slug>");
185
177
  process.exit(1);
186
178
  }
187
179
  const [author, slug] = ref.split("/", 2);
188
- const asUser = process.env.VOLUTE_MIND ?? flags.mind;
189
- const params = asUser ? `?as=${encodeURIComponent(asUser)}` : "";
190
- const res = await daemonFetch(`${apiUrl(`/${author}/${slug}`)}${params}`, {
180
+ const res = await daemonFetch(apiUrl(`/${author}/${slug}`), {
191
181
  method: "DELETE"
192
182
  });
193
183
  if (!res.ok) {
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "volute",
7
- version: "0.26.0",
7
+ version: "0.27.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",
@@ -6,10 +6,10 @@ async function run(args) {
6
6
  const subcommand = args[0];
7
7
  switch (subcommand) {
8
8
  case "publish":
9
- await import("./publish-HQV7YREB.js").then((m) => m.run(args.slice(1)));
9
+ await import("./publish-66UB2ZFY.js").then((m) => m.run(args.slice(1)));
10
10
  break;
11
11
  case "status":
12
- await import("./status-LV34BG6G.js").then((m) => m.run(args.slice(1)));
12
+ await import("./status-THLOBLWG.js").then((m) => m.run(args.slice(1)));
13
13
  break;
14
14
  case "--help":
15
15
  case "-h":
@@ -7,19 +7,19 @@ import {
7
7
  } from "./chunk-NAOW2CLO.js";
8
8
  import {
9
9
  sharedDir
10
- } from "./chunk-3TV4GLFO.js";
10
+ } from "./chunk-JKOWNZ4P.js";
11
11
  import {
12
12
  readSystemsConfig
13
- } from "./chunk-HFCBO2GL.js";
13
+ } from "./chunk-KDGS53OS.js";
14
14
  import "./chunk-YUIHSKR6.js";
15
- import "./chunk-YJA7P64S.js";
16
- import "./chunk-XOXLRRR2.js";
15
+ import "./chunk-AW7PFDVN.js";
16
+ import "./chunk-RKQEHRBB.js";
17
17
  import {
18
18
  parseArgs
19
19
  } from "./chunk-D424ZQGI.js";
20
20
  import {
21
21
  mindDir
22
- } from "./chunk-B2CPS4QU.js";
22
+ } from "./chunk-H7OZRFJB.js";
23
23
  import "./chunk-K3NQKI34.js";
24
24
 
25
25
  // src/commands/pages/publish.ts
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- daemonFetch
4
- } from "./chunk-WGOGUMPO.js";
5
2
  import {
6
3
  resolveMindName
7
4
  } from "./chunk-NAOW2CLO.js";
5
+ import {
6
+ daemonFetch
7
+ } from "./chunk-JGFVMROS.js";
8
8
  import {
9
9
  parseArgs
10
10
  } from "./chunk-D424ZQGI.js";
11
- import "./chunk-B2CPS4QU.js";
11
+ import "./chunk-H7OZRFJB.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
14
14
  // src/commands/shared/pull.ts
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ resolveMindName
4
+ } from "./chunk-NAOW2CLO.js";
5
+ import {
6
+ daemonFetch
7
+ } from "./chunk-JGFVMROS.js";
8
+ import {
9
+ parseArgs
10
+ } from "./chunk-D424ZQGI.js";
11
+ import "./chunk-H7OZRFJB.js";
12
+ import "./chunk-K3NQKI34.js";
13
+
14
+ // src/commands/chat/read.ts
15
+ async function run(args) {
16
+ const { positional, flags } = parseArgs(args, {
17
+ mind: { type: "string" },
18
+ limit: { type: "number" }
19
+ });
20
+ const conversationId = positional[0];
21
+ if (!conversationId) {
22
+ console.error("Usage: volute chat read <conversation-id> [--limit N] [--mind <name>]");
23
+ process.exit(1);
24
+ }
25
+ const mindName = resolveMindName(flags);
26
+ const limit = String(flags.limit ?? 50);
27
+ const res = await daemonFetch(
28
+ `/api/minds/${encodeURIComponent(mindName)}/conversations/${encodeURIComponent(conversationId)}/messages?limit=${limit}`
29
+ );
30
+ if (!res.ok) {
31
+ console.error(`Failed to read conversation: ${res.status}`);
32
+ process.exit(1);
33
+ }
34
+ const data = await res.json();
35
+ for (const msg of data.messages) {
36
+ const sender = msg.sender_name ?? msg.role;
37
+ const text = Array.isArray(msg.content) ? msg.content.filter((b) => b.type === "text").map((b) => b.text).join("") : msg.content;
38
+ const time = new Date(
39
+ msg.created_at.endsWith("Z") ? msg.created_at : `${msg.created_at}Z`
40
+ ).toLocaleString();
41
+ console.log(`[${time}] ${sender}: ${text}`);
42
+ }
43
+ }
44
+ export {
45
+ run
46
+ };
@@ -8,11 +8,11 @@ import {
8
8
  import {
9
9
  readSystemsConfig,
10
10
  writeSystemsConfig
11
- } from "./chunk-HFCBO2GL.js";
11
+ } from "./chunk-KDGS53OS.js";
12
12
  import {
13
13
  parseArgs
14
14
  } from "./chunk-D424ZQGI.js";
15
- import "./chunk-B2CPS4QU.js";
15
+ import "./chunk-H7OZRFJB.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // src/commands/pages/register.ts
@@ -1,42 +1,48 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  addMind,
4
+ addVariant,
4
5
  daemonLoopback,
6
+ ensureSystemDir,
5
7
  ensureVoluteHome,
6
8
  findMind,
7
- getRegistryCache,
8
- initRegistryCache,
9
+ findVariants,
10
+ getBaseName,
9
11
  mindDir,
10
12
  nextPort,
13
+ readAllMinds,
11
14
  readRegistry,
12
15
  removeMind,
13
- resolveMind,
14
16
  setMindRunning,
15
17
  setMindStage,
16
18
  setMindTemplateHash,
17
19
  stateDir,
18
20
  validateMindName,
19
21
  voluteHome,
20
- writeRegistry
21
- } from "./chunk-B2CPS4QU.js";
22
+ voluteSystemDir,
23
+ voluteUserHome
24
+ } from "./chunk-H7OZRFJB.js";
22
25
  import "./chunk-K3NQKI34.js";
23
26
  export {
24
27
  addMind,
28
+ addVariant,
25
29
  daemonLoopback,
30
+ ensureSystemDir,
26
31
  ensureVoluteHome,
27
32
  findMind,
28
- getRegistryCache,
29
- initRegistryCache,
33
+ findVariants,
34
+ getBaseName,
30
35
  mindDir,
31
36
  nextPort,
37
+ readAllMinds,
32
38
  readRegistry,
33
39
  removeMind,
34
- resolveMind,
35
40
  setMindRunning,
36
41
  setMindStage,
37
42
  setMindTemplateHash,
38
43
  stateDir,
39
44
  validateMindName,
40
45
  voluteHome,
41
- writeRegistry
46
+ voluteSystemDir,
47
+ voluteUserHome
42
48
  };
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ resolveMindName
4
+ } from "./chunk-NAOW2CLO.js";
2
5
  import {
3
6
  daemonFetch
4
- } from "./chunk-WGOGUMPO.js";
7
+ } from "./chunk-JGFVMROS.js";
5
8
  import {
6
9
  getClient,
7
10
  urlOf
8
11
  } from "./chunk-4RQBJWQX.js";
9
- import {
10
- resolveMindName
11
- } from "./chunk-NAOW2CLO.js";
12
- import "./chunk-B2CPS4QU.js";
12
+ import "./chunk-H7OZRFJB.js";
13
13
  import "./chunk-K3NQKI34.js";
14
14
 
15
15
  // src/commands/restart.ts
@@ -5,10 +5,10 @@ import {
5
5
  isSandboxEnabled,
6
6
  shellEscape,
7
7
  wrapForSandbox
8
- } from "./chunk-UTL75LP6.js";
8
+ } from "./chunk-USUXRNVD.js";
9
9
  import "./chunk-YUIHSKR6.js";
10
- import "./chunk-TZKJLDQN.js";
11
- import "./chunk-B2CPS4QU.js";
10
+ import "./chunk-IKRVFPWU.js";
11
+ import "./chunk-H7OZRFJB.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
  export {
14
14
  buildDenyRead,
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ resolveMindName
4
+ } from "./chunk-NAOW2CLO.js";
2
5
  import {
3
6
  daemonFetch
4
- } from "./chunk-WGOGUMPO.js";
7
+ } from "./chunk-JGFVMROS.js";
5
8
  import {
6
9
  getClient,
7
10
  urlOf
8
11
  } from "./chunk-4RQBJWQX.js";
9
- import {
10
- resolveMindName
11
- } from "./chunk-NAOW2CLO.js";
12
12
  import {
13
13
  parseArgs
14
14
  } from "./chunk-D424ZQGI.js";
15
- import "./chunk-B2CPS4QU.js";
15
+ import "./chunk-H7OZRFJB.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // src/commands/schedule.ts
@@ -21,7 +21,7 @@ async function run(args) {
21
21
  }
22
22
  const template = flags.template ?? "claude";
23
23
  const skills = flags.skills === "none" ? [] : flags.skills ? flags.skills.split(",") : void 0;
24
- const { daemonFetch } = await import("./daemon-client-Z7FAJ6JW.js");
24
+ const { daemonFetch } = await import("./daemon-client-I42FK2BF.js");
25
25
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
26
26
  const client = getClient();
27
27
  const createRes = await daemonFetch(urlOf(client.api.minds.$url()), {
@@ -64,7 +64,7 @@ async function run(args) {
64
64
  Seeded mind: ${name} (port ${createData.port})`);
65
65
  console.log(`
66
66
  Talk to your new mind:`);
67
- console.log(` volute send @${name} "hello"`);
67
+ console.log(` volute chat send @${name} "hello"`);
68
68
  }
69
69
  export {
70
70
  run
@@ -2,22 +2,20 @@
2
2
  import {
3
3
  readStdin
4
4
  } from "./chunk-ZYGKG6VC.js";
5
+ import {
6
+ resolveMindName
7
+ } from "./chunk-NAOW2CLO.js";
5
8
  import {
6
9
  daemonFetch
7
- } from "./chunk-WGOGUMPO.js";
10
+ } from "./chunk-JGFVMROS.js";
8
11
  import {
9
12
  getClient,
10
13
  urlOf
11
14
  } from "./chunk-4RQBJWQX.js";
12
- import {
13
- resolveMindName
14
- } from "./chunk-NAOW2CLO.js";
15
15
  import {
16
16
  parseArgs
17
17
  } from "./chunk-D424ZQGI.js";
18
- import {
19
- findMind
20
- } from "./chunk-B2CPS4QU.js";
18
+ import "./chunk-H7OZRFJB.js";
21
19
  import "./chunk-K3NQKI34.js";
22
20
 
23
21
  // src/commands/send.ts
@@ -55,6 +53,14 @@ function parseTarget(target) {
55
53
  }
56
54
 
57
55
  // src/commands/send.ts
56
+ async function isMind(name) {
57
+ try {
58
+ const res = await daemonFetch(`/api/minds/${encodeURIComponent(name)}`);
59
+ return res.ok;
60
+ } catch {
61
+ return false;
62
+ }
63
+ }
58
64
  var IMAGE_MEDIA_TYPES = {
59
65
  ".png": "image/png",
60
66
  ".jpg": "image/jpeg",
@@ -156,28 +162,28 @@ async function run(args) {
156
162
  const images = flags.image ? [loadImage(flags.image)] : void 0;
157
163
  if (!target || !message && !images) {
158
164
  console.error(
159
- 'Usage: volute send <target> "<message>" [--mind <name>] [--image <path>] [--wait]'
165
+ 'Usage: volute chat send <target> "<message>" [--mind <name>] [--image <path>] [--wait]'
160
166
  );
161
- console.error(' echo "message" | volute send <target> [--mind <name>]');
167
+ console.error(' echo "message" | volute chat send <target> [--mind <name>]');
162
168
  console.error("");
163
169
  console.error("Examples:");
164
- console.error(' volute send @other-mind "hello"');
165
- console.error(' volute send animal-chat "hello everyone"');
166
- console.error(' volute send discord:server/channel "hello"');
167
- console.error(' volute send @mind "check this out" --image photo.png');
168
- console.error(" volute send @mind --image photo.png");
169
- console.error(' volute send @mind "hello" --wait');
170
+ console.error(' volute chat send @other-mind "hello"');
171
+ console.error(' volute chat send animal-chat "hello everyone"');
172
+ console.error(' volute chat send discord:server/channel "hello"');
173
+ console.error(' volute chat send @mind "check this out" --image photo.png');
174
+ console.error(" volute chat send @mind --image photo.png");
175
+ console.error(' volute chat send @mind "hello" --wait');
170
176
  process.exit(1);
171
177
  }
172
178
  if (target === "system" || target === "@system") {
173
179
  console.error(
174
180
  `Can't send to system \u2014 system messages are automated.
175
- To reply to a person, use their username from the message prefix (e.g. volute send @username "msg").`
181
+ To reply to a person, use their username from the message prefix (e.g. volute chat send @username "msg").`
176
182
  );
177
183
  process.exit(1);
178
184
  }
179
185
  let parsed = parseTarget(target);
180
- if (!parsed.isDM && parsed.platform === "volute" && findMind(parsed.identifier)) {
186
+ if (!parsed.isDM && parsed.platform === "volute" && await isMind(parsed.identifier)) {
181
187
  parsed = {
182
188
  platform: "volute",
183
189
  identifier: `@${parsed.identifier}`,
@@ -192,8 +198,8 @@ To reply to a person, use their username from the message prefix (e.g. volute se
192
198
  const targetName = parsed.identifier.slice(1);
193
199
  const mindSelf = process.env.VOLUTE_MIND;
194
200
  const sender = flags.sender || mindSelf || userInfo().username;
195
- waitMindName = findMind(targetName) ? targetName : void 0;
196
- const targetIsMind = !!findMind(targetName);
201
+ const targetIsMind = await isMind(targetName);
202
+ waitMindName = targetIsMind ? targetName : void 0;
197
203
  const contextMind = mindSelf && !targetIsMind ? mindSelf : targetName;
198
204
  const participants = mindSelf && !targetIsMind ? [targetName] : [sender];
199
205
  const createRes = await daemonFetch(
@@ -5,13 +5,13 @@ import {
5
5
  SYSTEM_LAUNCHD_PLIST_PATH,
6
6
  SYSTEM_SERVICE_PATH,
7
7
  USER_SYSTEMD_UNIT
8
- } from "./chunk-V63B7DX3.js";
9
- import "./chunk-YJA7P64S.js";
10
- import "./chunk-XOXLRRR2.js";
8
+ } from "./chunk-LAC664WU.js";
9
+ import "./chunk-AW7PFDVN.js";
10
+ import "./chunk-RKQEHRBB.js";
11
11
  import {
12
12
  parseArgs
13
13
  } from "./chunk-D424ZQGI.js";
14
- import "./chunk-B2CPS4QU.js";
14
+ import "./chunk-H7OZRFJB.js";
15
15
  import "./chunk-K3NQKI34.js";
16
16
 
17
17
  // src/commands/service.ts
@@ -1,28 +1,28 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ promptLine
4
+ } from "./chunk-SSI47XP2.js";
2
5
  import {
3
6
  LAUNCHD_PLIST_LABEL,
4
7
  LAUNCHD_PLIST_PATH,
5
8
  SYSTEM_LAUNCHD_PLIST_PATH,
6
9
  SYSTEM_SERVICE_PATH,
7
10
  USER_SYSTEMD_UNIT
8
- } from "./chunk-V63B7DX3.js";
9
- import {
10
- promptLine
11
- } from "./chunk-SSI47XP2.js";
11
+ } from "./chunk-LAC664WU.js";
12
12
  import {
13
13
  resolveVoluteBin
14
- } from "./chunk-YJA7P64S.js";
14
+ } from "./chunk-AW7PFDVN.js";
15
15
  import {
16
16
  ensureVoluteGroup
17
- } from "./chunk-XOXLRRR2.js";
18
- import {
19
- parseArgs
20
- } from "./chunk-D424ZQGI.js";
17
+ } from "./chunk-RKQEHRBB.js";
21
18
  import {
22
19
  readGlobalConfig,
23
20
  writeGlobalConfig
24
- } from "./chunk-TZKJLDQN.js";
25
- import "./chunk-B2CPS4QU.js";
21
+ } from "./chunk-IKRVFPWU.js";
22
+ import {
23
+ parseArgs
24
+ } from "./chunk-D424ZQGI.js";
25
+ import "./chunk-H7OZRFJB.js";
26
26
  import "./chunk-K3NQKI34.js";
27
27
 
28
28
  // src/commands/setup.ts
@@ -45,7 +45,7 @@ function generatePlist(voluteBin, opts) {
45
45
  const args = ["up", "--foreground"];
46
46
  if (opts.port != null) args.push("--port", String(opts.port));
47
47
  if (opts.host) args.push("--host", opts.host);
48
- const logPath = opts.system ? "/var/lib/volute/daemon.log" : resolve(homedir(), ".volute", "daemon.log");
48
+ const logPath = opts.system ? "/var/lib/volute/system/daemon.log" : resolve(homedir(), ".volute", "system", "daemon.log");
49
49
  const envEntries = [];
50
50
  if (opts.system) {
51
51
  envEntries.push(
@@ -5,8 +5,8 @@ import {
5
5
  migrateSetupConfig,
6
6
  readGlobalConfig,
7
7
  writeGlobalConfig
8
- } from "./chunk-TZKJLDQN.js";
9
- import "./chunk-B2CPS4QU.js";
8
+ } from "./chunk-IKRVFPWU.js";
9
+ import "./chunk-H7OZRFJB.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
  export {
12
12
  configPath,
@@ -6,16 +6,16 @@ async function run(args) {
6
6
  const subcommand = args[0];
7
7
  switch (subcommand) {
8
8
  case "merge":
9
- await import("./merge-VK2HSKMA.js").then((m) => m.run(args.slice(1)));
9
+ await import("./merge-LNSMSAOF.js").then((m) => m.run(args.slice(1)));
10
10
  break;
11
11
  case "pull":
12
- await import("./pull-2MB4SK3C.js").then((m) => m.run(args.slice(1)));
12
+ await import("./pull-XCHJTM5M.js").then((m) => m.run(args.slice(1)));
13
13
  break;
14
14
  case "log":
15
- await import("./log-PBFNILJ4.js").then((m) => m.run(args.slice(1)));
15
+ await import("./log-ABYNVYJ3.js").then((m) => m.run(args.slice(1)));
16
16
  break;
17
17
  case "status":
18
- await import("./status-WXD4HXRL.js").then((m) => m.run(args.slice(1)));
18
+ await import("./status-7GA4SM4Y.js").then((m) => m.run(args.slice(1)));
19
19
  break;
20
20
  case "--help":
21
21
  case "-h":
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ resolveMindName
4
+ } from "./chunk-NAOW2CLO.js";
2
5
  import {
3
6
  daemonFetch
4
- } from "./chunk-WGOGUMPO.js";
7
+ } from "./chunk-JGFVMROS.js";
5
8
  import {
6
9
  getClient,
7
10
  urlOf
8
11
  } from "./chunk-4RQBJWQX.js";
9
- import {
10
- resolveMindName
11
- } from "./chunk-NAOW2CLO.js";
12
12
  import {
13
13
  parseArgs
14
14
  } from "./chunk-D424ZQGI.js";
15
- import "./chunk-B2CPS4QU.js";
15
+ import "./chunk-H7OZRFJB.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // src/commands/skill.ts
@@ -19,7 +19,7 @@ Restart your mind after running this so the subagent is loaded.
19
19
 
20
20
  ## 2. Add a dream schedule
21
21
 
22
- Add to your mind's `volute.json` (managed by volute) under `schedules`:
22
+ Add to `.config/volute.json` under `schedules`:
23
23
 
24
24
  ```json
25
25
  {
@@ -41,7 +41,7 @@ volute schedule add --mind <name> --id dream --cron "0 3 * * *" --message "it's
41
41
 
42
42
  If your mind uses the sleep system, add `system:dream` to wake triggers so the dream schedule wakes the mind briefly:
43
43
 
44
- In `volute.json`, add to the `sleep` section:
44
+ In `.config/volute.json`, add to the `sleep` section:
45
45
 
46
46
  ```json
47
47
  {