volute 0.19.0 → 0.21.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 (104) hide show
  1. package/README.md +68 -68
  2. package/dist/activity-events-3WHHCOBB.js +15 -0
  3. package/dist/{archive-ZCFOSTKB.js → archive-4ZQYK5MN.js} +4 -2
  4. package/dist/auth-HM2RSPY7.js +37 -0
  5. package/dist/{channel-PUQKGSQM.js → channel-BOOMFULW.js} +2 -2
  6. package/dist/{chunk-OTWLI7F4.js → chunk-5462YKWP.js} +12 -9
  7. package/dist/{chunk-2TJGRJ4O.js → chunk-7LPTHFIL.js} +64 -59
  8. package/dist/chunk-A4S7H6G6.js +56 -0
  9. package/dist/chunk-AKPFNL7L.js +148 -0
  10. package/dist/{chunk-EBGCNDMM.js → chunk-B2CPS4QU.js} +128 -114
  11. package/dist/{chunk-FCDU5BFX.js → chunk-HFCBO2GL.js} +2 -2
  12. package/dist/chunk-HGCDWKSP.js +97 -0
  13. package/dist/{chunk-DYZGP3EW.js → chunk-IPJXU366.js} +1 -1
  14. package/dist/{chunk-VE4D3GOP.js → chunk-J5A3DF2U.js} +2 -2
  15. package/dist/{chunk-WC6ZHVRL.js → chunk-KFI7TQJ6.js} +2 -2
  16. package/dist/{chunk-AW7P4EVV.js → chunk-KTJGZ7M7.js} +55 -7
  17. package/dist/{chunk-4KPUF5JD.js → chunk-L3LHXZD7.js} +18 -5
  18. package/dist/{chunk-OGXOMR65.js → chunk-NWPT4ASZ.js} +1 -1
  19. package/dist/{chunk-FGV2H4TX.js → chunk-OGZYB5GL.js} +312 -268
  20. package/dist/{chunk-SCUDS4US.js → chunk-ON3FF5JA.js} +1 -1
  21. package/dist/{chunk-EMQSAY3B.js → chunk-PC6R6UUW.js} +6 -5
  22. package/dist/{chunk-VDWCHYTS.js → chunk-PHU4DEAJ.js} +1 -1
  23. package/dist/{chunk-7NO7EV5Z.js → chunk-Q7AITQ44.js} +2 -2
  24. package/dist/{chunk-32VR2EOH.js → chunk-QUJUKM4U.js} +2 -2
  25. package/dist/{chunk-VQWDC6UK.js → chunk-SGPEZ32F.js} +46 -1
  26. package/dist/{chunk-RHEGSQFJ.js → chunk-WSLPZF72.js} +1 -1
  27. package/dist/cli.js +59 -111
  28. package/dist/{connector-JBVNZ7VK.js → connector-PYT5UOTZ.js} +6 -6
  29. package/dist/connectors/discord.js +2 -2
  30. package/dist/connectors/slack.js +2 -2
  31. package/dist/connectors/telegram.js +2 -2
  32. package/dist/{create-HP4OVVHF.js → create-WIDA3M4C.js} +1 -1
  33. package/dist/{daemon-client-ITWUCNFO.js → daemon-client-ZHCDL4RS.js} +2 -2
  34. package/dist/{daemon-restart-JMZM3QY4.js → daemon-restart-BH67ZOTE.js} +8 -8
  35. package/dist/daemon.js +2872 -1301
  36. package/dist/{delete-BSU7K3RY.js → delete-LOIANQGD.js} +1 -1
  37. package/dist/down-LIOQ5JDH.js +14 -0
  38. package/dist/{env-A3LMO777.js → env-4PHIHTF4.js} +2 -2
  39. package/dist/{export-GCDNQCF3.js → export-XD6PJBQP.js} +19 -8
  40. package/dist/file-X4L5TTOL.js +204 -0
  41. package/dist/{history-WNK3DFUM.js → history-HTEKRNID.js} +2 -2
  42. package/dist/{import-M63VIUJ5.js → import-E433B4KG.js} +3 -3
  43. package/dist/{log-PPPZDVEF.js → log-SRO5Q6AD.js} +2 -2
  44. package/dist/{login-HNH3EUQV.js → login-UO6AOVEA.js} +4 -4
  45. package/dist/{logout-I5CB5UZS.js → logout-UKD5LA37.js} +2 -2
  46. package/dist/{logs-SF2IMJN4.js → logs-HNTNNBDW.js} +2 -2
  47. package/dist/{merge-33C237A4.js → merge-B6SYTGI7.js} +2 -2
  48. package/dist/{mind-PQ5NCPSU.js → mind-BIDOF65R.js} +27 -11
  49. package/dist/mind-activity-tracker-PGC3DBJ7.js +18 -0
  50. package/dist/{mind-manager-RVCFROAY.js → mind-manager-3V2NXX4I.js} +5 -6
  51. package/dist/{package-MYE2ZJLV.js → package-HQR52XSG.js} +1 -1
  52. package/dist/{pages-AXCOSY3P.js → pages-KQBR5TAZ.js} +6 -6
  53. package/dist/{publish-YB377JB7.js → publish-OJ4QMXVZ.js} +12 -9
  54. package/dist/{pull-XAEWQJ47.js → pull-GRQAXM2E.js} +2 -2
  55. package/dist/{register-VSPCMHKX.js → register-U2UO6TC4.js} +5 -5
  56. package/dist/registry-D2BSQ2X5.js +42 -0
  57. package/dist/{restart-IQKMCK5M.js → restart-CIDAKGG2.js} +3 -6
  58. package/dist/{schedule-LMX7GAQZ.js → schedule-NLR3LZLY.js} +27 -7
  59. package/dist/{seed-J43YDKXG.js → seed-3H2MRREW.js} +2 -2
  60. package/dist/{send-KVIZIGCE.js → send-RP2TA7SG.js} +132 -36
  61. package/dist/{service-LUR7WDO7.js → service-TVNEORO7.js} +31 -13
  62. package/dist/{setup-OH3PJUJO.js → setup-OZDYCKDI.js} +25 -34
  63. package/dist/{shared-KO35ZM44.js → shared-DCQ2UXOM.js} +4 -4
  64. package/dist/{skill-BCVNI6TV.js → skill-Q2Y6PQ3L.js} +2 -2
  65. package/dist/skills/orientation/SKILL.md +2 -2
  66. package/dist/skills/volute-mind/SKILL.md +38 -8
  67. package/dist/{sprout-VBEX63LX.js → sprout-6Z6C42YM.js} +34 -30
  68. package/dist/{start-I5JYB65M.js → start-JR6CUUWF.js} +3 -6
  69. package/dist/{status-D7E5HHBV.js → status-5XDGYHKP.js} +2 -2
  70. package/dist/{status-JCJAOXTW.js → status-LV34BG6G.js} +6 -5
  71. package/dist/{status-4ESFLGH4.js → status-Z7NAFMBI.js} +5 -5
  72. package/dist/{stop-NBVKEFQQ.js → stop-VKPGK25U.js} +2 -5
  73. package/dist/template-hash-BIMA4ILT.js +8 -0
  74. package/dist/{up-WG65SWJU.js → up-7BGDMFRT.js} +5 -5
  75. package/dist/{update-FJIHDJKM.js → update-4WT7VWHW.js} +5 -5
  76. package/dist/{update-check-MWE5AH4U.js → update-check-F5Z3ALXX.js} +2 -2
  77. package/dist/{upgrade-AIT24B5I.js → upgrade-ZEC2GGFO.js} +1 -1
  78. package/dist/{variant-63ZWO2W7.js → variant-A4I7PHXS.js} +16 -24
  79. package/dist/version-notify-TFS2U5CF.js +173 -0
  80. package/dist/web-assets/assets/index-BR3gtK3E.css +1 -0
  81. package/dist/web-assets/assets/index-CWmrZRQd.js +64 -0
  82. package/dist/web-assets/index.html +2 -2
  83. package/drizzle/0012_activity.sql +11 -0
  84. package/drizzle/meta/0012_snapshot.json +7 -0
  85. package/drizzle/meta/_journal.json +7 -0
  86. package/package.json +1 -1
  87. package/templates/_base/home/.config/routes.json +2 -2
  88. package/templates/_base/home/VOLUTE.md +1 -1
  89. package/templates/_base/src/lib/daemon-client.ts +22 -0
  90. package/templates/_base/src/lib/transparency.ts +1 -1
  91. package/templates/claude/.init/.config/routes.json +7 -1
  92. package/templates/pi/.init/.config/routes.json +7 -1
  93. package/templates/pi/src/agent.ts +11 -5
  94. package/templates/pi/src/lib/session-context-extension.ts +6 -4
  95. package/templates/pi/src/server.ts +2 -0
  96. package/dist/chunk-UJ6GHNR7.js +0 -675
  97. package/dist/chunk-Z524RFCJ.js +0 -36
  98. package/dist/db-5ZVC6MQF.js +0 -10
  99. package/dist/delivery-manager-ISTJMZDW.js +0 -16
  100. package/dist/down-ZY35KMHR.js +0 -14
  101. package/dist/schema-5BW7DFZI.js +0 -24
  102. package/dist/variants-JAGWGBXG.js +0 -26
  103. package/dist/web-assets/assets/index-BAbuRsVF.css +0 -1
  104. package/dist/web-assets/assets/index-CiQhSKi_.js +0 -63
@@ -13,7 +13,7 @@ async function run(args) {
13
13
  force: { type: "boolean" }
14
14
  });
15
15
  const name = resolveMindName({ mind: positional[0] });
16
- const { daemonFetch } = await import("./daemon-client-ITWUCNFO.js");
16
+ const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
17
17
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
18
18
  const client = getClient();
19
19
  const url = urlOf(client.api.minds[":name"].$url({ param: { name } })) + (flags.force ? "?force=true" : "");
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ run,
4
+ stopDaemon
5
+ } from "./chunk-Q7AITQ44.js";
6
+ import "./chunk-QUJUKM4U.js";
7
+ import "./chunk-IPJXU366.js";
8
+ import "./chunk-NWPT4ASZ.js";
9
+ import "./chunk-B2CPS4QU.js";
10
+ import "./chunk-K3NQKI34.js";
11
+ export {
12
+ run,
13
+ stopDaemon
14
+ };
@@ -11,8 +11,8 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-WC6ZHVRL.js";
15
- import "./chunk-EBGCNDMM.js";
14
+ } from "./chunk-KFI7TQJ6.js";
15
+ import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // src/commands/env.ts
@@ -2,14 +2,14 @@
2
2
  import {
3
3
  addHistoryToArchive,
4
4
  createExportArchive
5
- } from "./chunk-AW7P4EVV.js";
5
+ } from "./chunk-KTJGZ7M7.js";
6
6
  import {
7
7
  parseArgs
8
8
  } from "./chunk-D424ZQGI.js";
9
9
  import {
10
10
  findMind,
11
11
  mindDir
12
- } from "./chunk-EBGCNDMM.js";
12
+ } from "./chunk-B2CPS4QU.js";
13
13
  import "./chunk-K3NQKI34.js";
14
14
 
15
15
  // src/commands/export.ts
@@ -22,13 +22,14 @@ async function run(args) {
22
22
  "include-connectors": { type: "boolean" },
23
23
  "include-history": { type: "boolean" },
24
24
  "include-sessions": { type: "boolean" },
25
+ "include-src": { type: "boolean" },
25
26
  all: { type: "boolean" },
26
27
  output: { type: "string" }
27
28
  });
28
29
  const name = positional[0];
29
30
  if (!name) {
30
31
  console.error(
31
- "Usage: volute mind export <name> [--include-env] [--include-identity] [--include-connectors] [--include-history] [--include-sessions] [--all] [--output <path>]"
32
+ "Usage: volute mind export <name> [--include-env] [--include-identity] [--include-connectors] [--include-history] [--include-sessions] [--include-src] [--all] [--output <path>]"
32
33
  );
33
34
  process.exit(1);
34
35
  }
@@ -48,9 +49,12 @@ async function run(args) {
48
49
  const includeConnectors = includeAll || flags["include-connectors"];
49
50
  const includeHistory = includeAll || flags["include-history"];
50
51
  const includeSessions = includeAll || flags["include-sessions"];
52
+ const includeSrc = includeAll || flags["include-src"];
51
53
  const zip = createExportArchive({
52
54
  name,
53
55
  template: entry.template ?? "claude",
56
+ stage: entry.stage,
57
+ includeSrc,
54
58
  includeEnv,
55
59
  includeIdentity,
56
60
  includeConnectors,
@@ -59,11 +63,17 @@ async function run(args) {
59
63
  });
60
64
  if (includeHistory) {
61
65
  try {
62
- const { getDb } = await import("./db-5ZVC6MQF.js");
63
- const { eq } = await import("drizzle-orm");
64
- const { mindHistory } = await import("./schema-5BW7DFZI.js");
65
- const db = await getDb();
66
- const rows = await db.select().from(mindHistory).where(eq(mindHistory.mind, name));
66
+ const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
67
+ const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
68
+ const client = getClient();
69
+ const res = await daemonFetch(
70
+ urlOf(client.api.minds[":name"].history.export.$url({ param: { name } }))
71
+ );
72
+ if (!res.ok) {
73
+ const text = await res.text().catch(() => "");
74
+ throw new Error(`Failed to fetch history: HTTP ${res.status}${text ? ` - ${text}` : ""}`);
75
+ }
76
+ const rows = await res.json();
67
77
  addHistoryToArchive(zip, rows);
68
78
  } catch (err) {
69
79
  console.error(`Error: could not export history: ${err.message}`);
@@ -84,6 +94,7 @@ Exported ${name} \u2192 ${outputPath} (${sizeMB} MB)`);
84
94
  const included = [];
85
95
  const excluded = [];
86
96
  for (const [key, val] of [
97
+ ["src", includeSrc],
87
98
  ["env", includeEnv],
88
99
  ["identity", includeIdentity],
89
100
  ["connectors", includeConnectors],
@@ -0,0 +1,204 @@
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-KFI7TQJ6.js";
11
+ import "./chunk-B2CPS4QU.js";
12
+ import "./chunk-K3NQKI34.js";
13
+
14
+ // src/commands/file.ts
15
+ async function run(args) {
16
+ const subcommand = args[0];
17
+ switch (subcommand) {
18
+ case "send":
19
+ await sendFile(args.slice(1));
20
+ break;
21
+ case "list":
22
+ await listPending(args.slice(1));
23
+ break;
24
+ case "accept":
25
+ await acceptFile(args.slice(1));
26
+ break;
27
+ case "reject":
28
+ await rejectFile(args.slice(1));
29
+ break;
30
+ case "trust":
31
+ await trustSender(args.slice(1));
32
+ break;
33
+ case "untrust":
34
+ await untrustSender(args.slice(1));
35
+ break;
36
+ case "--help":
37
+ case "-h":
38
+ case void 0:
39
+ printUsage();
40
+ break;
41
+ default:
42
+ printUsage();
43
+ process.exit(1);
44
+ }
45
+ }
46
+ function printUsage() {
47
+ console.log(`Usage:
48
+ volute file send <path> <target-mind> [--mind <name>] Send a file to another mind
49
+ volute file list [--mind <name>] List pending incoming files
50
+ volute file accept <id> [--mind <name>] Accept a pending file
51
+ volute file reject <id> [--mind <name>] Reject a pending file
52
+ volute file trust <sender> [--mind <name>] Trust a sender (auto-deliver)
53
+ volute file untrust <sender> [--mind <name>] Remove sender trust`);
54
+ }
55
+ async function sendFile(args) {
56
+ const { positional, flags } = parseArgs(args, {
57
+ mind: { type: "string" }
58
+ });
59
+ const mind = resolveMindName(flags);
60
+ const filePath = positional[0];
61
+ const targetMind = positional[1];
62
+ if (!filePath || !targetMind) {
63
+ console.error("Usage: volute file send <path> <target-mind> [--mind <name>]");
64
+ process.exit(1);
65
+ }
66
+ const res = await daemonFetch(`/api/minds/${encodeURIComponent(mind)}/files/send`, {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json" },
69
+ body: JSON.stringify({ targetMind, filePath })
70
+ });
71
+ if (!res.ok) {
72
+ const data2 = await res.json();
73
+ console.error(data2.error ?? `Failed to send file: ${res.status}`);
74
+ process.exit(1);
75
+ }
76
+ const data = await res.json();
77
+ if (data.status === "delivered") {
78
+ console.log(`File delivered to ${targetMind}: ${data.destPath}`);
79
+ } else {
80
+ console.log(`File pending approval from ${targetMind} (id: ${data.id})`);
81
+ }
82
+ }
83
+ async function listPending(args) {
84
+ const { flags } = parseArgs(args, {
85
+ mind: { type: "string" }
86
+ });
87
+ const mind = resolveMindName(flags);
88
+ const res = await daemonFetch(`/api/minds/${encodeURIComponent(mind)}/files/pending`);
89
+ if (!res.ok) {
90
+ const data = await res.json();
91
+ console.error(data.error ?? `Failed to list pending files: ${res.status}`);
92
+ process.exit(1);
93
+ }
94
+ const pending = await res.json();
95
+ if (pending.length === 0) {
96
+ console.log("No pending files.");
97
+ return;
98
+ }
99
+ const idW = Math.max(2, ...pending.map((p) => p.id.length));
100
+ const senderW = Math.max(6, ...pending.map((p) => p.sender.length));
101
+ const fileW = Math.max(4, ...pending.map((p) => p.filename.length));
102
+ console.log(`${"ID".padEnd(idW)} ${"SENDER".padEnd(senderW)} ${"FILE".padEnd(fileW)} SIZE`);
103
+ for (const p of pending) {
104
+ console.log(
105
+ `${p.id.padEnd(idW)} ${p.sender.padEnd(senderW)} ${p.filename.padEnd(fileW)} ${formatSize(p.size)}`
106
+ );
107
+ }
108
+ }
109
+ async function acceptFile(args) {
110
+ const { positional, flags } = parseArgs(args, {
111
+ mind: { type: "string" }
112
+ });
113
+ const mind = resolveMindName(flags);
114
+ const id = positional[0];
115
+ if (!id) {
116
+ console.error("Usage: volute file accept <id> [--mind <name>]");
117
+ process.exit(1);
118
+ }
119
+ const res = await daemonFetch(`/api/minds/${encodeURIComponent(mind)}/files/accept`, {
120
+ method: "POST",
121
+ headers: { "Content-Type": "application/json" },
122
+ body: JSON.stringify({ id })
123
+ });
124
+ if (!res.ok) {
125
+ const data2 = await res.json();
126
+ console.error(data2.error ?? `Failed to accept file: ${res.status}`);
127
+ process.exit(1);
128
+ }
129
+ const data = await res.json();
130
+ console.log(`File accepted: ${data.destPath}`);
131
+ }
132
+ async function rejectFile(args) {
133
+ const { positional, flags } = parseArgs(args, {
134
+ mind: { type: "string" }
135
+ });
136
+ const mind = resolveMindName(flags);
137
+ const id = positional[0];
138
+ if (!id) {
139
+ console.error("Usage: volute file reject <id> [--mind <name>]");
140
+ process.exit(1);
141
+ }
142
+ const res = await daemonFetch(`/api/minds/${encodeURIComponent(mind)}/files/reject`, {
143
+ method: "POST",
144
+ headers: { "Content-Type": "application/json" },
145
+ body: JSON.stringify({ id })
146
+ });
147
+ if (!res.ok) {
148
+ const data = await res.json();
149
+ console.error(data.error ?? `Failed to reject file: ${res.status}`);
150
+ process.exit(1);
151
+ }
152
+ console.log(`File rejected: ${id}`);
153
+ }
154
+ async function trustSender(args) {
155
+ const { positional, flags } = parseArgs(args, {
156
+ mind: { type: "string" }
157
+ });
158
+ const mind = resolveMindName(flags);
159
+ const sender = positional[0];
160
+ if (!sender) {
161
+ console.error("Usage: volute file trust <sender> [--mind <name>]");
162
+ process.exit(1);
163
+ }
164
+ const res = await daemonFetch(`/api/minds/${encodeURIComponent(mind)}/files/trust`, {
165
+ method: "POST",
166
+ headers: { "Content-Type": "application/json" },
167
+ body: JSON.stringify({ sender })
168
+ });
169
+ if (!res.ok) {
170
+ const data = await res.json();
171
+ console.error(data.error ?? `Failed to trust sender: ${res.status}`);
172
+ process.exit(1);
173
+ }
174
+ console.log(`Trusted sender: ${sender}`);
175
+ }
176
+ async function untrustSender(args) {
177
+ const { positional, flags } = parseArgs(args, {
178
+ mind: { type: "string" }
179
+ });
180
+ const mind = resolveMindName(flags);
181
+ const sender = positional[0];
182
+ if (!sender) {
183
+ console.error("Usage: volute file untrust <sender> [--mind <name>]");
184
+ process.exit(1);
185
+ }
186
+ const res = await daemonFetch(
187
+ `/api/minds/${encodeURIComponent(mind)}/files/trust/${encodeURIComponent(sender)}`,
188
+ { method: "DELETE" }
189
+ );
190
+ if (!res.ok) {
191
+ const data = await res.json();
192
+ console.error(data.error ?? `Failed to untrust sender: ${res.status}`);
193
+ process.exit(1);
194
+ }
195
+ console.log(`Untrusted sender: ${sender}`);
196
+ }
197
+ function formatSize(bytes) {
198
+ if (bytes < 1024) return `${bytes} B`;
199
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
200
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
201
+ }
202
+ export {
203
+ run
204
+ };
@@ -11,8 +11,8 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-WC6ZHVRL.js";
15
- import "./chunk-EBGCNDMM.js";
14
+ } from "./chunk-KFI7TQJ6.js";
15
+ import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // src/commands/history.ts
@@ -6,10 +6,10 @@ import {
6
6
  parseNameFromIdentity,
7
7
  run,
8
8
  sessionMatchesWorkspace
9
- } from "./chunk-EMQSAY3B.js";
10
- import "./chunk-VDWCHYTS.js";
9
+ } from "./chunk-PC6R6UUW.js";
10
+ import "./chunk-PHU4DEAJ.js";
11
11
  import "./chunk-D424ZQGI.js";
12
- import "./chunk-EBGCNDMM.js";
12
+ import "./chunk-B2CPS4QU.js";
13
13
  import "./chunk-K3NQKI34.js";
14
14
  export {
15
15
  findOpenClawSession,
@@ -7,8 +7,8 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-WC6ZHVRL.js";
11
- import "./chunk-EBGCNDMM.js";
10
+ } from "./chunk-KFI7TQJ6.js";
11
+ import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
14
14
  // src/commands/shared/log.ts
@@ -8,11 +8,11 @@ import {
8
8
  import {
9
9
  readSystemsConfig,
10
10
  writeSystemsConfig
11
- } from "./chunk-FCDU5BFX.js";
11
+ } from "./chunk-HFCBO2GL.js";
12
12
  import {
13
13
  parseArgs
14
14
  } from "./chunk-D424ZQGI.js";
15
- import "./chunk-EBGCNDMM.js";
15
+ import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // src/commands/pages/login.ts
@@ -23,13 +23,13 @@ async function run(args) {
23
23
  });
24
24
  const existing = readSystemsConfig();
25
25
  if (existing) {
26
- console.error(`Already logged in as "${existing.system}". Run "volute logout" first.`);
26
+ console.error(`Already logged in as "${existing.system}". Run "volute auth logout" first.`);
27
27
  process.exit(1);
28
28
  }
29
29
  let key = flags.key;
30
30
  if (!key) {
31
31
  if (!process.stdin.isTTY) {
32
- console.error("Usage: volute pages login --key <api-key>");
32
+ console.error("Usage: volute auth login --key <api-key>");
33
33
  process.exit(1);
34
34
  }
35
35
  key = await promptLine("API key: ");
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deleteSystemsConfig
4
- } from "./chunk-FCDU5BFX.js";
5
- import "./chunk-EBGCNDMM.js";
4
+ } from "./chunk-HFCBO2GL.js";
5
+ import "./chunk-B2CPS4QU.js";
6
6
  import "./chunk-K3NQKI34.js";
7
7
 
8
8
  // src/commands/pages/logout.ts
@@ -11,8 +11,8 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-WC6ZHVRL.js";
15
- import "./chunk-EBGCNDMM.js";
14
+ } from "./chunk-KFI7TQJ6.js";
15
+ import "./chunk-B2CPS4QU.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // src/commands/logs.ts
@@ -7,8 +7,8 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-WC6ZHVRL.js";
11
- import "./chunk-EBGCNDMM.js";
10
+ } from "./chunk-KFI7TQJ6.js";
11
+ import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
14
14
  // src/commands/shared/merge.ts
@@ -6,45 +6,57 @@ async function run(args) {
6
6
  const subcommand = args[0];
7
7
  switch (subcommand) {
8
8
  case "create":
9
- await import("./create-HP4OVVHF.js").then((m) => m.run(args.slice(1)));
9
+ await import("./create-WIDA3M4C.js").then((m) => m.run(args.slice(1)));
10
10
  break;
11
11
  case "start":
12
- await import("./start-I5JYB65M.js").then((m) => m.run(args.slice(1)));
12
+ await import("./start-JR6CUUWF.js").then((m) => m.run(args.slice(1)));
13
13
  break;
14
14
  case "stop":
15
- await import("./stop-NBVKEFQQ.js").then((m) => m.run(args.slice(1)));
15
+ await import("./stop-VKPGK25U.js").then((m) => m.run(args.slice(1)));
16
16
  break;
17
17
  case "restart":
18
- await import("./restart-IQKMCK5M.js").then((m) => m.run(args.slice(1)));
18
+ await import("./restart-CIDAKGG2.js").then((m) => m.run(args.slice(1)));
19
19
  break;
20
20
  case "delete":
21
- await import("./delete-BSU7K3RY.js").then((m) => m.run(args.slice(1)));
21
+ await import("./delete-LOIANQGD.js").then((m) => m.run(args.slice(1)));
22
22
  break;
23
23
  case "list":
24
- await import("./status-4ESFLGH4.js").then((m) => m.run(args.slice(1)));
24
+ await import("./status-Z7NAFMBI.js").then((m) => m.run(args.slice(1)));
25
25
  break;
26
26
  case "status": {
27
27
  const rest = args.slice(1);
28
28
  if (!rest[0] && process.env.VOLUTE_MIND) {
29
29
  rest.unshift(process.env.VOLUTE_MIND);
30
30
  }
31
- await import("./status-4ESFLGH4.js").then((m) => m.run(rest));
31
+ await import("./status-Z7NAFMBI.js").then((m) => m.run(rest));
32
32
  break;
33
33
  }
34
34
  case "logs": {
35
35
  const rest = args.slice(1);
36
36
  const logsArgs = transformMindFlag(rest);
37
- await import("./logs-SF2IMJN4.js").then((m) => m.run(logsArgs));
37
+ await import("./logs-HNTNNBDW.js").then((m) => m.run(logsArgs));
38
38
  break;
39
39
  }
40
40
  case "upgrade":
41
- await import("./upgrade-AIT24B5I.js").then((m) => m.run(args.slice(1)));
41
+ await import("./upgrade-ZEC2GGFO.js").then((m) => m.run(args.slice(1)));
42
42
  break;
43
43
  case "import":
44
- await import("./import-M63VIUJ5.js").then((m) => m.run(args.slice(1)));
44
+ await import("./import-E433B4KG.js").then((m) => m.run(args.slice(1)));
45
45
  break;
46
46
  case "export":
47
- await import("./export-GCDNQCF3.js").then((m) => m.run(args.slice(1)));
47
+ await import("./export-XD6PJBQP.js").then((m) => m.run(args.slice(1)));
48
+ break;
49
+ case "connect":
50
+ await import("./connector-PYT5UOTZ.js").then((m) => m.run(["connect", ...args.slice(1)]));
51
+ break;
52
+ case "disconnect":
53
+ await import("./connector-PYT5UOTZ.js").then((m) => m.run(["disconnect", ...args.slice(1)]));
54
+ break;
55
+ case "seed":
56
+ await import("./seed-3H2MRREW.js").then((m) => m.run(args.slice(1)));
57
+ break;
58
+ case "sprout":
59
+ await import("./sprout-6Z6C42YM.js").then((m) => m.run(args.slice(1)));
48
60
  break;
49
61
  case "--help":
50
62
  case "-h":
@@ -65,6 +77,7 @@ function transformMindFlag(args) {
65
77
  function printUsage() {
66
78
  console.log(`Usage:
67
79
  volute mind create <name> [--template <name>]
80
+ volute mind seed <name> [--template <name>]
68
81
  volute mind start <name>
69
82
  volute mind stop [name]
70
83
  volute mind restart [name]
@@ -72,6 +85,9 @@ function printUsage() {
72
85
  volute mind list
73
86
  volute mind status [name]
74
87
  volute mind logs [name] [--follow] [-n N]
88
+ volute mind connect <type> [--mind <name>]
89
+ volute mind disconnect <type> [--mind <name>]
90
+ volute mind sprout
75
91
  volute mind upgrade [name] [--template <name>] [--continue]
76
92
  volute mind import <path> [--name <name>] [--session <path>] [--template <name>]
77
93
  volute mind export <name> [--include-env] [--include-identity] [--include-connectors] [--include-history] [--include-sessions] [--all] [--output <path>]
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getActiveMinds,
4
+ markIdle,
5
+ onMindEvent,
6
+ stopAll
7
+ } from "./chunk-HGCDWKSP.js";
8
+ import "./chunk-A4S7H6G6.js";
9
+ import "./chunk-SGPEZ32F.js";
10
+ import "./chunk-YUIHSKR6.js";
11
+ import "./chunk-B2CPS4QU.js";
12
+ import "./chunk-K3NQKI34.js";
13
+ export {
14
+ getActiveMinds,
15
+ markIdle,
16
+ onMindEvent,
17
+ stopAll
18
+ };
@@ -3,13 +3,12 @@ import {
3
3
  MindManager,
4
4
  getMindManager,
5
5
  initMindManager
6
- } from "./chunk-2TJGRJ4O.js";
6
+ } from "./chunk-7LPTHFIL.js";
7
+ import "./chunk-PHU4DEAJ.js";
8
+ import "./chunk-SGPEZ32F.js";
7
9
  import "./chunk-YUIHSKR6.js";
8
- import "./chunk-VDWCHYTS.js";
9
- import "./chunk-Z524RFCJ.js";
10
- import "./chunk-VQWDC6UK.js";
11
- import "./chunk-OGXOMR65.js";
12
- import "./chunk-EBGCNDMM.js";
10
+ import "./chunk-NWPT4ASZ.js";
11
+ import "./chunk-B2CPS4QU.js";
13
12
  import "./chunk-K3NQKI34.js";
14
13
  export {
15
14
  MindManager,
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "volute",
7
- version: "0.19.0",
7
+ version: "0.21.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-YB377JB7.js").then((m) => m.run(args.slice(1)));
9
+ await import("./publish-OJ4QMXVZ.js").then((m) => m.run(args.slice(1)));
10
10
  break;
11
11
  case "status":
12
- await import("./status-JCJAOXTW.js").then((m) => m.run(args.slice(1)));
12
+ await import("./status-LV34BG6G.js").then((m) => m.run(args.slice(1)));
13
13
  break;
14
14
  case "--help":
15
15
  case "-h":
@@ -26,10 +26,10 @@ function printUsage() {
26
26
  volute pages publish [--mind <name>] Publish mind's pages/ directory
27
27
  volute pages status [--mind <name>] Show publish status
28
28
 
29
- Account commands (register, login, logout) are now top-level:
30
- volute register [--name <name>]
31
- volute login [--key <key>]
32
- volute logout`);
29
+ Account commands:
30
+ volute auth register [--name <name>]
31
+ volute auth login [--key <key>]
32
+ volute auth logout`);
33
33
  }
34
34
  export {
35
35
  run
@@ -7,19 +7,19 @@ import {
7
7
  } from "./chunk-NAOW2CLO.js";
8
8
  import {
9
9
  sharedDir
10
- } from "./chunk-4KPUF5JD.js";
10
+ } from "./chunk-L3LHXZD7.js";
11
11
  import {
12
12
  readSystemsConfig
13
- } from "./chunk-FCDU5BFX.js";
13
+ } from "./chunk-HFCBO2GL.js";
14
14
  import "./chunk-YUIHSKR6.js";
15
15
  import {
16
16
  parseArgs
17
17
  } from "./chunk-D424ZQGI.js";
18
- import "./chunk-DYZGP3EW.js";
19
- import "./chunk-OGXOMR65.js";
18
+ import "./chunk-IPJXU366.js";
19
+ import "./chunk-NWPT4ASZ.js";
20
20
  import {
21
21
  mindDir
22
- } from "./chunk-EBGCNDMM.js";
22
+ } from "./chunk-B2CPS4QU.js";
23
23
  import "./chunk-K3NQKI34.js";
24
24
 
25
25
  // src/commands/pages/publish.ts
@@ -27,17 +27,20 @@ import { existsSync, lstatSync, readdirSync, readFileSync } from "fs";
27
27
  import { relative, resolve } from "path";
28
28
  async function run(args) {
29
29
  const { flags } = parseArgs(args, {
30
- mind: { type: "string" }
30
+ mind: { type: "string" },
31
+ system: { type: "boolean" }
31
32
  });
32
33
  const config = readSystemsConfig();
33
34
  if (!config) {
34
- console.error('Not logged in. Run "volute pages register" or "volute pages login" first.');
35
+ console.error('Not logged in. Run "volute auth register" or "volute auth login" first.');
35
36
  process.exit(1);
36
37
  }
37
- const hasMind = flags.mind || process.env.VOLUTE_MIND;
38
38
  let mindName;
39
39
  let pagesDir;
40
- if (hasMind) {
40
+ if (flags.system) {
41
+ mindName = "system";
42
+ pagesDir = resolve(sharedDir(), "pages");
43
+ } else if (flags.mind || process.env.VOLUTE_MIND) {
41
44
  mindName = resolveMindName(flags);
42
45
  pagesDir = resolve(mindDir(mindName), "home", "pages");
43
46
  } else {
@@ -7,8 +7,8 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-WC6ZHVRL.js";
11
- import "./chunk-EBGCNDMM.js";
10
+ } from "./chunk-KFI7TQJ6.js";
11
+ import "./chunk-B2CPS4QU.js";
12
12
  import "./chunk-K3NQKI34.js";
13
13
 
14
14
  // src/commands/shared/pull.ts