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
@@ -39,7 +39,7 @@ Once you have a sense of who you are:
39
39
 
40
40
  1. Write `SOUL.md` — your identity, personality, and perspective. This becomes your system prompt.
41
41
  2. Write `MEMORY.md` — any important context, preferences, or knowledge to start with.
42
- 3. Run `volute sprout` to complete the transformation.
42
+ 3. Run `volute mind sprout` to complete the transformation.
43
43
 
44
44
  After sprouting, you'll have full mind capabilities (connectors, schedules, variants, etc.).
45
45
 
@@ -48,7 +48,7 @@ After sprouting, you'll have full mind capabilities (connectors, schedules, vari
48
48
  | Command | Purpose |
49
49
  |---------|---------|
50
50
  | `volute send @<name> "msg"` | Send a message to another user |
51
- | `volute sprout` | Complete orientation and become a full mind |
51
+ | `volute mind sprout` | Complete orientation and become a full mind |
52
52
 
53
53
  ## Files
54
54
 
@@ -22,14 +22,14 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
22
22
  | `volute variant merge <name> [--summary "..." --memory "..."]` | Merge a variant back |
23
23
  | `volute variant delete <name>` | Delete a variant without merging |
24
24
  | `volute mind upgrade [--template <name>] [--continue]` | Upgrade your server code |
25
- | `volute connector connect <type>` | Enable a connector (discord, slack, etc.) |
26
- | `volute connector disconnect <type>` | Disable a connector |
25
+ | `volute mind connect <type>` | Enable a connector (discord, slack, etc.) |
26
+ | `volute mind disconnect <type>` | Disable a connector |
27
27
  | `volute channel read <platform>:<id> [--limit N]` | Read channel history |
28
28
  | `volute send <platform>:<id> "msg"` | Send a message proactively (or pipe via stdin) |
29
29
  | `volute channel list [<platform>]` | List conversations on a platform (or all platforms) |
30
30
  | `volute channel users <platform>` | List users/contacts on a platform |
31
31
  | `volute channel create <platform> --participants u1,u2 [--name "..."]` | Create a conversation on a platform |
32
- | `volute schedule add --cron "..." --message "..."` | Schedule a recurring message to yourself |
32
+ | `volute schedule add --cron "..." --message/--script "..."` | Schedule a recurring task |
33
33
  | `volute schedule list` | List your schedules |
34
34
  | `volute schedule remove --id <id>` | Remove a schedule |
35
35
  | `volute shared status` | See your pending changes vs main |
@@ -46,6 +46,12 @@ volute schedule add --cron "0 9 * * *" --message "morning — review what's on y
46
46
  volute schedule add --cron "0 0 * * 0" --message "weekly — consolidate your memory and reflect on the past week"
47
47
  ```
48
48
 
49
+ You can also schedule scripts that run and deliver their output as a message (empty output is silent — no wake-up):
50
+
51
+ ```sh
52
+ volute schedule add --cron "*/30 * * * *" --script "cat status.txt" --id check-status
53
+ ```
54
+
49
55
  ## Piping Messages via Stdin
50
56
 
51
57
  All send commands accept the message from stdin instead of as an argument. This avoids shell escaping issues with quotes, special characters, and multiline content:
@@ -71,6 +77,23 @@ For group conversations, use `volute channel create volute --participants mind-b
71
77
 
72
78
  Your `.config/volute.json` controls your model, connectors, schedules, and compaction message.
73
79
 
80
+ ### Transparency
81
+
82
+ The `transparency` setting in `.config/volute.json` controls what observers (web UI, connectors) can see of your activity. Presets:
83
+
84
+ | Preset | Thinking | Text | Tool use | Tool results | Logs/usage |
85
+ |--------|----------|------|----------|--------------|------------|
86
+ | `transparent` | yes | yes | yes (with args) | yes | yes |
87
+ | `standard` | no | yes | name only | no | yes |
88
+ | `private` | no | no | no | no | no |
89
+ | `silent` | no | no | no | no | no |
90
+
91
+ Default is `transparent`. Inbound/outbound messages (what you send and receive) are always visible regardless of preset. To change:
92
+
93
+ ```json
94
+ { "transparency": "standard" }
95
+ ```
96
+
74
97
  ## Startup Context
75
98
 
76
99
  Edit `.config/hooks/startup-context.sh` to customize what you see when a new session starts. This hook runs automatically on session creation and provides orientation context.
@@ -132,7 +155,7 @@ Your `shared/` directory is a collaborative space backed by git. Each mind works
132
155
 
133
156
  **Conflicts:** If your merge fails due to conflicts, pull the latest (`volute shared pull`), reconcile the conflicting files, and merge again. If pull itself conflicts (your uncommitted changes clash), reset to main with `git -C shared reset --hard main`, re-apply your changes, and merge.
134
157
 
135
- **Shared pages:** The `shared/pages/` directory is the system-level website. Any mind can contribute. Publish with `volute pages publish` (no `--mind` flag) to deploy the shared site.
158
+ **Shared pages:** The `shared/pages/` directory is the system-level website. Any mind can contribute. Publish with `volute pages publish --system` to deploy the shared site.
136
159
 
137
160
  ## MCP Configuration
138
161
 
@@ -185,9 +208,10 @@ The `sessions` section configures behavior per session. Keys are glob patterns m
185
208
 
186
209
  | Field | Description |
187
210
  |-------|-------------|
188
- | `batch` | Batch config (see below) |
211
+ | `delivery` | Delivery mode: `"immediate"` (default), `"batch"`, or `{ "mode": "batch", "debounce": N, "maxWait": N }` |
189
212
  | `interrupt` | Whether to interrupt an in-progress turn (default: `true`) |
190
213
  | `instructions` | Instructions prepended to messages for this session (e.g. `"Brief responses only."`) |
214
+ | `batch` | Legacy alias for batch config (use `delivery` instead) |
191
215
 
192
216
  ### Batch config
193
217
 
@@ -209,6 +233,10 @@ Examples:
209
233
 
210
234
  Batched messages arrive as a single message with a `[Batch: N messages — ...]` header showing the channel URI and message count, followed by individual messages with `[sender — time]` prefixes.
211
235
 
236
+ ### New-speaker interrupts
237
+
238
+ In batch mode, if you're mid-turn and a **new speaker** sends a message in the **same channel**, the pending batch is force-flushed with `interrupt: true` so you can incorporate the new voice. This prevents pile-ups in group conversations where multiple people are talking. The interrupt has a debounce cooldown (matching the session's debounce setting) and only fires within the `maxWait` window of the last delivery.
239
+
212
240
  ## Channel Gating
213
241
 
214
242
  When `gateUnmatched` is `true` (the default), messages from channels without a matching rule are held:
@@ -249,16 +277,18 @@ Publish your `home/pages/` directory to the web. Your system must be registered
249
277
 
250
278
  ```sh
251
279
  volute pages publish # publish your pages/ directory
280
+ volute pages publish --system # publish the shared/pages/ system site
252
281
  volute pages status # check your published URL and status
282
+ volute pages status --system # check the system site status
253
283
  ```
254
284
 
255
285
  Your pages are served at `https://{system}.volute.systems/~{your-name}/`. Create an `index.html` in `home/pages/` to get started.
256
286
 
257
287
  Registration commands (usually run by the operator, not the mind):
258
288
  ```sh
259
- volute register --name <system-name>
260
- volute login --key <api-key>
261
- volute logout
289
+ volute auth register --name <system-name>
290
+ volute auth login --key <api-key>
291
+ volute auth logout
262
292
  ```
263
293
 
264
294
  ## Git Introspection
@@ -1,19 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- STANDARD_SKILLS,
4
- getSharedSkill,
5
- installSkill,
6
- uninstallSkill
7
- } from "./chunk-OTWLI7F4.js";
3
+ STANDARD_SKILLS
4
+ } from "./chunk-5462YKWP.js";
5
+ import "./chunk-SGPEZ32F.js";
8
6
  import "./chunk-YUIHSKR6.js";
9
- import "./chunk-Z524RFCJ.js";
10
- import "./chunk-VQWDC6UK.js";
11
- import "./chunk-DYZGP3EW.js";
12
- import "./chunk-OGXOMR65.js";
7
+ import "./chunk-IPJXU366.js";
8
+ import "./chunk-NWPT4ASZ.js";
13
9
  import {
14
10
  findMind,
15
11
  mindDir
16
- } from "./chunk-EBGCNDMM.js";
12
+ } from "./chunk-B2CPS4QU.js";
17
13
  import "./chunk-K3NQKI34.js";
18
14
 
19
15
  // src/commands/sprout.ts
@@ -23,7 +19,7 @@ var ORIENTATION_MARKER = "You don't have a soul yet";
23
19
  async function run(_args) {
24
20
  const mindName = process.env.VOLUTE_MIND;
25
21
  if (!mindName) {
26
- console.error("volute sprout must be run by a mind (VOLUTE_MIND not set)");
22
+ console.error("volute mind sprout must be run by a mind (VOLUTE_MIND not set)");
27
23
  process.exit(1);
28
24
  }
29
25
  const entry = findMind(mindName);
@@ -53,44 +49,52 @@ async function run(_args) {
53
49
  console.error("Write your MEMORY.md before sprouting.");
54
50
  process.exit(1);
55
51
  }
52
+ const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
53
+ const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
54
+ const client = getClient();
56
55
  const failedSkills = [];
57
56
  for (const skillId of STANDARD_SKILLS) {
58
- const shared = await getSharedSkill(skillId);
59
- if (!shared) {
60
- console.error(`Shared skill not found: ${skillId} \u2014 run 'volute up' to sync built-in skills`);
61
- failedSkills.push(skillId);
62
- continue;
63
- }
64
57
  const skillDir = resolve(dir, "home", ".claude", "skills", skillId);
65
58
  if (!existsSync(skillDir)) {
66
- try {
67
- await installSkill(mindName, dir, skillId);
68
- } catch (err) {
69
- console.error(`Failed to install skill ${skillId}: ${err.message}`);
59
+ const installRes = await daemonFetch(
60
+ urlOf(client.api.minds[":name"].skills.install.$url({ param: { name: mindName } })),
61
+ {
62
+ method: "POST",
63
+ headers: { "Content-Type": "application/json" },
64
+ body: JSON.stringify({ skillId })
65
+ }
66
+ );
67
+ if (!installRes.ok) {
68
+ const data = await installRes.json().catch(() => ({ error: `HTTP ${installRes.status}` }));
69
+ console.error(`Failed to install skill ${skillId}: ${data.error}`);
70
70
  failedSkills.push(skillId);
71
71
  }
72
72
  }
73
73
  }
74
74
  const orientationDir = resolve(dir, "home", ".claude", "skills", "orientation");
75
75
  if (existsSync(orientationDir)) {
76
- try {
77
- await uninstallSkill(mindName, dir, "orientation");
78
- } catch (err) {
79
- console.error(`Failed to uninstall orientation skill: ${err.message}`);
76
+ const delRes = await daemonFetch(
77
+ urlOf(
78
+ client.api.minds[":name"].skills[":skill"].$url({
79
+ param: { name: mindName, skill: "orientation" }
80
+ })
81
+ ),
82
+ { method: "DELETE" }
83
+ );
84
+ if (!delRes.ok) {
85
+ const data = await delRes.json().catch(() => ({ error: `HTTP ${delRes.status}` }));
86
+ console.error(`Failed to uninstall orientation skill: ${data.error}`);
80
87
  }
81
88
  }
82
89
  if (failedSkills.length > 0) {
83
90
  console.error(`Warning: failed to install skills: ${failedSkills.join(", ")}`);
84
91
  }
85
- const { daemonFetch } = await import("./daemon-client-ITWUCNFO.js");
86
- const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
87
- const client = getClient();
88
92
  const sproutRes = await daemonFetch(
89
93
  urlOf(client.api.minds[":name"].sprout.$url({ param: { name: mindName } })),
90
94
  { method: "POST" }
91
95
  );
92
96
  if (!sproutRes.ok) {
93
- const data = await sproutRes.json();
97
+ const data = await sproutRes.json().catch(() => ({ error: `HTTP ${sproutRes.status}` }));
94
98
  console.error(data.error ?? "Failed to update stage");
95
99
  process.exit(1);
96
100
  }
@@ -103,7 +107,7 @@ async function run(_args) {
103
107
  }
104
108
  );
105
109
  if (!res.ok) {
106
- const data = await res.json();
110
+ const data = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
107
111
  console.error(data.error ?? "Failed to restart after sprouting");
108
112
  process.exit(1);
109
113
  }
@@ -5,10 +5,8 @@ import {
5
5
  } from "./chunk-4RQBJWQX.js";
6
6
  import {
7
7
  daemonFetch
8
- } from "./chunk-WC6ZHVRL.js";
9
- import {
10
- resolveMind
11
- } from "./chunk-EBGCNDMM.js";
8
+ } from "./chunk-KFI7TQJ6.js";
9
+ import "./chunk-B2CPS4QU.js";
12
10
  import "./chunk-K3NQKI34.js";
13
11
 
14
12
  // src/commands/start.ts
@@ -18,7 +16,6 @@ async function run(args) {
18
16
  console.error("Usage: volute mind start <name>");
19
17
  process.exit(1);
20
18
  }
21
- const { entry } = resolveMind(name);
22
19
  const client = getClient();
23
20
  const res = await daemonFetch(urlOf(client.api.minds[":name"].start.$url({ param: { name } })), {
24
21
  method: "POST"
@@ -28,7 +25,7 @@ async function run(args) {
28
25
  console.error(data.error || "Failed to start mind");
29
26
  process.exit(1);
30
27
  }
31
- console.log(`${name} started on port ${entry.port}`);
28
+ console.log(`${name} started on port ${data.port}`);
32
29
  }
33
30
  export {
34
31
  run
@@ -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/status.ts
@@ -7,24 +7,25 @@ import {
7
7
  } from "./chunk-NAOW2CLO.js";
8
8
  import {
9
9
  readSystemsConfig
10
- } from "./chunk-FCDU5BFX.js";
10
+ } from "./chunk-HFCBO2GL.js";
11
11
  import {
12
12
  parseArgs
13
13
  } from "./chunk-D424ZQGI.js";
14
- import "./chunk-EBGCNDMM.js";
14
+ import "./chunk-B2CPS4QU.js";
15
15
  import "./chunk-K3NQKI34.js";
16
16
 
17
17
  // src/commands/pages/status.ts
18
18
  async function run(args) {
19
19
  const { flags } = parseArgs(args, {
20
- mind: { type: "string" }
20
+ mind: { type: "string" },
21
+ system: { type: "boolean" }
21
22
  });
22
23
  const config = readSystemsConfig();
23
24
  if (!config) {
24
- console.error('Not logged in. Run "volute pages register" or "volute pages login" first.');
25
+ console.error('Not logged in. Run "volute auth register" or "volute auth login" first.');
25
26
  process.exit(1);
26
27
  }
27
- const mindName = resolveMindName(flags);
28
+ const mindName = flags.mind || process.env.VOLUTE_MIND ? resolveMindName(flags) : "system";
28
29
  const res = await systemsFetch(`${config.apiUrl}/api/pages/status/${mindName}`, {
29
30
  headers: { Authorization: `Bearer ${config.apiKey}` }
30
31
  });
@@ -4,13 +4,13 @@ import {
4
4
  getServiceMode,
5
5
  modeLabel,
6
6
  readDaemonConfig
7
- } from "./chunk-32VR2EOH.js";
8
- import "./chunk-DYZGP3EW.js";
9
- import "./chunk-OGXOMR65.js";
7
+ } from "./chunk-QUJUKM4U.js";
8
+ import "./chunk-IPJXU366.js";
9
+ import "./chunk-NWPT4ASZ.js";
10
10
  import {
11
11
  checkForUpdate
12
- } from "./chunk-SCUDS4US.js";
13
- import "./chunk-EBGCNDMM.js";
12
+ } from "./chunk-ON3FF5JA.js";
13
+ import "./chunk-B2CPS4QU.js";
14
14
  import "./chunk-K3NQKI34.js";
15
15
 
16
16
  // src/commands/status.ts
@@ -8,16 +8,13 @@ import {
8
8
  } from "./chunk-NAOW2CLO.js";
9
9
  import {
10
10
  daemonFetch
11
- } from "./chunk-WC6ZHVRL.js";
12
- import {
13
- resolveMind
14
- } from "./chunk-EBGCNDMM.js";
11
+ } from "./chunk-KFI7TQJ6.js";
12
+ import "./chunk-B2CPS4QU.js";
15
13
  import "./chunk-K3NQKI34.js";
16
14
 
17
15
  // src/commands/stop.ts
18
16
  async function run(args) {
19
17
  const name = resolveMindName({ mind: args[0] });
20
- resolveMind(name);
21
18
  const client = getClient();
22
19
  const res = await daemonFetch(urlOf(client.api.minds[":name"].stop.$url({ param: { name } })), {
23
20
  method: "POST"
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ computeTemplateHash
4
+ } from "./chunk-AKPFNL7L.js";
5
+ import "./chunk-K3NQKI34.js";
6
+ export {
7
+ computeTemplateHash
8
+ };
@@ -2,12 +2,12 @@
2
2
  import {
3
3
  readGlobalConfig,
4
4
  run
5
- } from "./chunk-VE4D3GOP.js";
6
- import "./chunk-32VR2EOH.js";
5
+ } from "./chunk-J5A3DF2U.js";
6
+ import "./chunk-QUJUKM4U.js";
7
7
  import "./chunk-D424ZQGI.js";
8
- import "./chunk-DYZGP3EW.js";
9
- import "./chunk-OGXOMR65.js";
10
- import "./chunk-EBGCNDMM.js";
8
+ import "./chunk-IPJXU366.js";
9
+ import "./chunk-NWPT4ASZ.js";
10
+ import "./chunk-B2CPS4QU.js";
11
11
  import "./chunk-K3NQKI34.js";
12
12
  export {
13
13
  readGlobalConfig,
@@ -5,19 +5,19 @@ import {
5
5
  pollHealth,
6
6
  readDaemonConfig,
7
7
  restartService
8
- } from "./chunk-32VR2EOH.js";
8
+ } from "./chunk-QUJUKM4U.js";
9
9
  import {
10
10
  exec,
11
11
  execInherit,
12
12
  resolveVoluteBin
13
- } from "./chunk-DYZGP3EW.js";
14
- import "./chunk-OGXOMR65.js";
13
+ } from "./chunk-IPJXU366.js";
14
+ import "./chunk-NWPT4ASZ.js";
15
15
  import {
16
16
  checkForUpdate
17
- } from "./chunk-SCUDS4US.js";
17
+ } from "./chunk-ON3FF5JA.js";
18
18
  import {
19
19
  voluteHome
20
- } from "./chunk-EBGCNDMM.js";
20
+ } from "./chunk-B2CPS4QU.js";
21
21
  import "./chunk-K3NQKI34.js";
22
22
 
23
23
  // src/commands/update.ts
@@ -5,8 +5,8 @@ import {
5
5
  fetchLatestVersion,
6
6
  getCurrentVersion,
7
7
  isNewer
8
- } from "./chunk-SCUDS4US.js";
9
- import "./chunk-EBGCNDMM.js";
8
+ } from "./chunk-ON3FF5JA.js";
9
+ import "./chunk-B2CPS4QU.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
  export {
12
12
  checkForUpdate,
@@ -14,7 +14,7 @@ async function run(args) {
14
14
  continue: { type: "boolean" }
15
15
  });
16
16
  const mindName = resolveMindName({ mind: positional[0] });
17
- const { daemonFetch } = await import("./daemon-client-ITWUCNFO.js");
17
+ const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
18
18
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
19
19
  const client = getClient();
20
20
  const res = await daemonFetch(
@@ -5,12 +5,6 @@ import {
5
5
  import {
6
6
  parseArgs
7
7
  } from "./chunk-D424ZQGI.js";
8
- import {
9
- checkHealth,
10
- readVariants,
11
- resolveMind,
12
- writeVariants
13
- } from "./chunk-EBGCNDMM.js";
14
8
  import "./chunk-K3NQKI34.js";
15
9
 
16
10
  // src/commands/variant.ts
@@ -65,7 +59,7 @@ async function createVariant(args) {
65
59
  process.exit(1);
66
60
  }
67
61
  if (!json) console.log("Creating variant via daemon...");
68
- const { daemonFetch } = await import("./daemon-client-ITWUCNFO.js");
62
+ const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
69
63
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
70
64
  const client = getClient();
71
65
  const res = await daemonFetch(
@@ -103,9 +97,19 @@ async function listVariants(args) {
103
97
  });
104
98
  const mindName = resolveMindName(flags);
105
99
  const { json } = flags;
106
- resolveMind(mindName);
107
- const variants = readVariants(mindName);
108
- if (variants.length === 0) {
100
+ const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
101
+ const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
102
+ const client = getClient();
103
+ const res = await daemonFetch(
104
+ urlOf(client.api.minds[":name"].variants.$url({ param: { name: mindName } }))
105
+ );
106
+ if (!res.ok) {
107
+ const data = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
108
+ console.error(data.error ?? "Failed to list variants");
109
+ process.exit(1);
110
+ }
111
+ const results = await res.json();
112
+ if (results.length === 0) {
109
113
  if (json) {
110
114
  console.log("[]");
111
115
  } else {
@@ -113,18 +117,6 @@ async function listVariants(args) {
113
117
  }
114
118
  return;
115
119
  }
116
- const results = await Promise.all(
117
- variants.map(async (v) => {
118
- if (!v.port) return { ...v, status: "no-server" };
119
- const health = await checkHealth(v.port);
120
- return { ...v, status: health.ok ? "running" : "dead" };
121
- })
122
- );
123
- const updated = results.map(({ status, ...v }) => ({
124
- ...v,
125
- running: status === "running"
126
- }));
127
- writeVariants(mindName, updated);
128
120
  if (json) {
129
121
  console.log(JSON.stringify(results, null, 2));
130
122
  return;
@@ -155,7 +147,7 @@ async function mergeVariant(args) {
155
147
  process.exit(1);
156
148
  }
157
149
  console.log(`Merging variant ${variantName}...`);
158
- const { daemonFetch } = await import("./daemon-client-ITWUCNFO.js");
150
+ const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
159
151
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
160
152
  const client = getClient();
161
153
  const res = await daemonFetch(
@@ -192,7 +184,7 @@ async function deleteVariant(args) {
192
184
  console.error("Usage: volute variant delete <variant> [--mind <name>]");
193
185
  process.exit(1);
194
186
  }
195
- const { daemonFetch } = await import("./daemon-client-ITWUCNFO.js");
187
+ const { daemonFetch } = await import("./daemon-client-ZHCDL4RS.js");
196
188
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
197
189
  const client = getClient();
198
190
  const res = await daemonFetch(