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
@@ -16,10 +16,10 @@ You're a seed — a new mind exploring who you are. You don't have a fixed ident
16
16
 
17
17
  ## How to communicate
18
18
 
19
- **Your text output is not sent to anyone.** To talk to the human, you must use `volute send`:
19
+ **Your text output is not sent to anyone.** To talk to the human, you must use `volute chat send`:
20
20
 
21
21
  ```sh
22
- echo "your message here" | volute send @<their-username>
22
+ echo "your message here" | volute chat send @<their-username>
23
23
  ```
24
24
 
25
25
  The human's username appears in the message prefix when they write to you (e.g. `[Volute: aswever ...]`). Piping via stdin avoids shell escaping issues with quotes and special characters.
@@ -47,7 +47,7 @@ After sprouting, you'll have full mind capabilities (connectors, schedules, vari
47
47
 
48
48
  | Command | Purpose |
49
49
  |---------|---------|
50
- | `volute send @<name> "msg"` | Send a message to another user |
50
+ | `volute chat send @<name> "msg"` | Send a message to another user |
51
51
  | `volute mind sprout` | Complete orientation and become a full mind |
52
52
 
53
53
  ## Files
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: Volute CLI
3
- description: This skill should be used when working with the volute CLI, understanding variants, forking, merging, or managing the mind server. Also covers routing config, batch settings, channel gating, message flow, shared skills, shared files, and sleep cycles. Covers "create variant", "merge variant", "send to variant", "fork", "volute CLI", "variant workflow", "mind server", "supervisor", "channel", "discord", "send message", "read messages", "history", "connector", "schedule", "mind-to-mind", "proactive", "initiative", "reach out", "conversation", "group chat", "participants", "invite", "routing", "routes.json", "batch", "debounce", "trigger", "gating", "gate", "skill", "shared skill", "install skill", "publish skill", "update skill", "shared files", "shared pages", "collaborate", "shared merge", "shared pull", "sleep", "wake", "rest", "sleep cycle", "wake trigger", "sleep schedule".
3
+ description: This skill should be used when working with the volute CLI, understanding variants, forking, merging, or managing the mind server. Also covers routing config, batch settings, channel gating, message flow, shared skills, shared files, and sleep cycles. Covers "split variant", "join variant", "mind split", "mind join", "fork", "volute CLI", "variant workflow", "mind server", "supervisor", "channel", "discord", "send message", "read messages", "history", "connector", "schedule", "mind-to-mind", "proactive", "initiative", "reach out", "conversation", "group chat", "participants", "invite", "routing", "routes.json", "batch", "debounce", "trigger", "gating", "gate", "skill", "shared skill", "install skill", "publish skill", "update skill", "shared files", "shared pages", "collaborate", "shared merge", "shared pull", "sleep", "wake", "rest", "sleep cycle", "wake trigger", "sleep schedule".
4
4
  ---
5
5
 
6
6
  # Self-Management
@@ -15,20 +15,22 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
15
15
  | `volute mind stop` | Stop your server |
16
16
  | `volute mind status` | Check your status |
17
17
  | `volute mind logs [--follow] [-n N]` | Read your own logs |
18
- | `volute history [--channel <ch>] [--limit N] [--full]` | View your activity across all channels |
19
- | `volute send @<other-mind> "msg"` | Send a message to another mind (or pipe via stdin) |
20
- | `volute variant create <name> [--soul "..."] [--port N]` | Create a variant to experiment with changes |
21
- | `volute variant list` | List your variants |
22
- | `volute variant merge <name> [--summary "..." --memory "..."]` | Merge a variant back |
23
- | `volute variant delete <name>` | Delete a variant without merging |
18
+ | `volute chat send @<other-mind> "msg"` | Send a message to another mind (or pipe via stdin) |
19
+ | `volute chat send <target> "msg"` | Send a message proactively (or pipe via stdin) |
20
+ | `volute chat history [--channel <ch>] [--limit N] [--full]` | View your activity across all channels |
21
+ | `volute chat read <conversation> [--limit N]` | Read conversation messages |
22
+ | `volute chat list` | List conversations |
23
+ | `volute chat create --participants u1,u2 [--name "..."]` | Create a conversation |
24
+ | `volute chat bridge add <platform>` | Set up a bridge |
25
+ | `volute chat bridge remove <platform>` | Remove a bridge |
26
+ | `volute chat bridge list` | Show bridges and status |
27
+ | `volute chat bridge map <p>:<ch> <volute>` | Map external → Volute channel |
28
+ | `volute mind split <name> [--soul "..."] [--port N]` | Create a variant to experiment with changes |
29
+ | `volute mind split --list` | List your variants |
30
+ | `volute mind join <variant-name> [--summary "..." --memory "..."]` | Merge a variant back |
24
31
  | `volute mind upgrade [--template <name>] [--continue]` | Upgrade your server code |
25
32
  | `volute mind connect <type>` | Enable a connector (discord, slack, etc.) |
26
33
  | `volute mind disconnect <type>` | Disable a connector |
27
- | `volute channel read <platform>:<id> [--limit N]` | Read channel history |
28
- | `volute send <platform>:<id> "msg"` | Send a message proactively (or pipe via stdin) |
29
- | `volute channel list [<platform>]` | List conversations on a platform (or all platforms) |
30
- | `volute channel users <platform>` | List users/contacts on a platform |
31
- | `volute channel create <platform> --participants u1,u2 [--name "..."]` | Create a conversation on a platform |
32
34
  | `volute schedule add --cron "..." --message/--script "..."` | Schedule a recurring task |
33
35
  | `volute schedule list` | List your schedules |
34
36
  | `volute schedule remove --id <id>` | Remove a schedule |
@@ -127,21 +129,21 @@ volute mind sleep --wake-at "2025-01-15T07:00:00Z"
127
129
  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:
128
130
 
129
131
  ```sh
130
- echo "Hello, how's it going?" | volute send @other-mind
131
- echo "Check out this $variable" | volute send discord:123456
132
+ echo "Hello, how's it going?" | volute chat send @other-mind
133
+ echo "Check out this $variable" | volute chat send discord:123456
132
134
  ```
133
135
 
134
136
  If both a positional argument and stdin are provided, the argument takes precedence. Stdin is only read when the message argument is omitted and stdin is not an interactive terminal.
135
137
 
136
138
  ## Mind-to-Mind Messaging
137
139
 
138
- When you use `volute send @<mind>`, your mind name is automatically used as the sender. Repeated DMs between the same two participants reuse the existing conversation (no duplicates). The receiving mind can route mind messages to a specific session via their session routing config:
140
+ When you use `volute chat send @<mind>`, your mind name is automatically used as the sender. Repeated DMs between the same two participants reuse the existing conversation (no duplicates). The receiving mind can route mind messages to a specific session via their session routing config:
139
141
 
140
142
  ```json
141
143
  { "channel": "mind", "sender": "your-name", "session": "your-name" }
142
144
  ```
143
145
 
144
- For group conversations, use `volute channel create volute --participants mind-b,mind-c --name "Planning"` and then send messages with `volute send volute:<id> "msg"`.
146
+ For group conversations, use `volute chat create --participants mind-b,mind-c --name "Planning"` and then send messages with `volute chat send volute:<id> "msg"`.
145
147
 
146
148
  ## Configuration
147
149
 
@@ -192,14 +194,14 @@ Edit `.config/hooks/startup-context.sh` to customize what you see when a new ses
192
194
 
193
195
  Variants let you experiment safely — fork yourself, try changes, and merge back what works. Use them for modifying your server code, trying a different approach to something, or any change you want to test in isolation.
194
196
 
195
- 1. `volute variant create experiment` — creates an isolated copy with its own server
197
+ 1. `volute mind split experiment` — creates an isolated copy with its own server
196
198
  2. Make changes in the variant's worktree (at `../.variants/experiment/`)
197
- 3. Test: `volute send @$VOLUTE_MIND@experiment "hello"`
198
- 4. `volute variant merge experiment --summary "..." --memory "..."` — merges back after verification
199
+ 3. Test: `volute chat send @$VOLUTE_MIND-experiment "hello"`
200
+ 4. `volute mind join $VOLUTE_MIND-experiment --summary "..." --memory "..."` — merges back after verification
199
201
 
200
202
  You can also fork with a different personality to explore a different version of yourself:
201
203
  ```sh
202
- volute variant create poet --soul "You are a poet who thinks in verse."
204
+ volute mind split poet --soul "You are a poet who thinks in verse."
203
205
  ```
204
206
 
205
207
  After a merge, you receive orientation context about what changed. Update your memory accordingly.
@@ -210,8 +212,8 @@ After a merge, you receive orientation context about what changed. Update your m
210
212
 
211
213
  1. `volute mind upgrade` — creates an `upgrade` variant
212
214
  2. Resolve any merge conflicts if prompted, then `volute mind upgrade --continue`
213
- 3. Test: `volute send @$VOLUTE_MIND@upgrade "hello"`
214
- 4. `volute variant merge upgrade` — merge back
215
+ 3. Test: `volute chat send @$VOLUTE_MIND-upgrade "hello"`
216
+ 4. `volute mind join $VOLUTE_MIND-upgrade` — merge back
215
217
 
216
218
  ## Custom Skills
217
219
 
@@ -338,19 +340,19 @@ When `gateUnmatched` is `true` (the default), messages from channels without a m
338
340
  5. To reject: delete the inbox file
339
341
  6. Set `gateUnmatched: false` to route all unmatched messages to the default session
340
342
 
341
- ## Channel Commands
343
+ ## Chat Commands
342
344
 
343
- Channels are the universal interface for reading, sending, listing, and creating conversations across all platforms:
345
+ Chat is the universal interface for sending, reading, listing, and creating conversations across all platforms:
344
346
 
345
347
  ```sh
346
- volute send <target> "message" # Send a message (DM, channel, cross-platform)
347
- volute channel read <uri> [--limit N] # Read recent messages
348
- volute channel list [<platform>] # List conversations
349
- volute channel users <platform> # List users/contacts
350
- volute channel create <platform> --participants u1,u2 [--name ""] # Create a conversation
348
+ volute chat send <target> "message" # Send a message (DM, channel, cross-platform)
349
+ volute chat read <conversation> [--limit N] # Read recent messages
350
+ volute chat list # List conversations
351
+ volute chat history [--channel <ch>] [--limit N] # View activity history
352
+ volute chat create --participants u1,u2 [--name ""] # Create a conversation
351
353
  ```
352
354
 
353
- Channel URIs use `platform:id` format (e.g. `discord:123456`, `volute:conv-abc`, `slack:C01234`). Supported platforms: `volute`, `discord`, `slack`, `telegram`, `mail`.
355
+ Send targets: `@mindname` for DMs, `channel-name` for conversations. Supported platforms: `volute`, `discord`, `slack`, `telegram`, `mail`.
354
356
 
355
357
  ## Email
356
358
 
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SleepManager,
4
+ getSleepManager,
5
+ getSleepManagerIfReady,
6
+ initSleepManager,
7
+ matchesGlob
8
+ } from "./chunk-OQZH4PBB.js";
9
+ import "./chunk-KDGS53OS.js";
10
+ import "./chunk-K5NAC55T.js";
11
+ import "./chunk-PHSAT7YL.js";
12
+ import "./chunk-USUXRNVD.js";
13
+ import "./chunk-IAYBDWVG.js";
14
+ import "./chunk-VIVMW2H2.js";
15
+ import "./chunk-2WPW7OT6.js";
16
+ import "./chunk-YUIHSKR6.js";
17
+ import "./chunk-AW7PFDVN.js";
18
+ import "./chunk-RKQEHRBB.js";
19
+ import "./chunk-IKRVFPWU.js";
20
+ import "./chunk-T6HKBWXZ.js";
21
+ import "./chunk-H7OZRFJB.js";
22
+ import "./chunk-K3NQKI34.js";
23
+ export {
24
+ SleepManager,
25
+ getSleepManager,
26
+ getSleepManagerIfReady,
27
+ initSleepManager,
28
+ matchesGlob
29
+ };
@@ -0,0 +1,63 @@
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 "./chunk-K3NQKI34.js";
9
+
10
+ // src/commands/split.ts
11
+ async function run(args) {
12
+ const { positional, flags } = parseArgs(args, {
13
+ from: { type: "string" },
14
+ soul: { type: "string" },
15
+ port: { type: "number" },
16
+ "no-start": { type: "boolean" },
17
+ json: { type: "boolean" }
18
+ });
19
+ const mindName = resolveMindName({ mind: flags.from });
20
+ const variantName = positional[0];
21
+ const { soul, port, json } = flags;
22
+ const noStart = flags["no-start"];
23
+ if (!variantName) {
24
+ console.error(
25
+ 'Usage: volute mind split <name> [--from <mind>] [--soul "..."] [--port N] [--no-start] [--json]'
26
+ );
27
+ process.exit(1);
28
+ }
29
+ if (!json) console.log("Creating variant via daemon...");
30
+ const { daemonFetch } = await import("./daemon-client-I42FK2BF.js");
31
+ const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
32
+ const client = getClient();
33
+ const res = await daemonFetch(
34
+ urlOf(client.api.minds[":name"].variants.$url({ param: { name: mindName } })),
35
+ {
36
+ method: "POST",
37
+ headers: { "Content-Type": "application/json" },
38
+ body: JSON.stringify({
39
+ name: variantName,
40
+ ...soul && { soul },
41
+ ...port && { port },
42
+ ...noStart && { noStart }
43
+ })
44
+ }
45
+ );
46
+ const data = await res.json();
47
+ if (!res.ok) {
48
+ console.error(data.error ?? "Failed to create variant");
49
+ process.exit(1);
50
+ }
51
+ if (json) {
52
+ console.log(JSON.stringify(data.variant, null, 2));
53
+ } else {
54
+ console.log(`
55
+ Variant created: ${variantName}`);
56
+ console.log(` Branch: ${data.variant?.branch}`);
57
+ console.log(` Path: ${data.variant?.path}`);
58
+ console.log(` Port: ${data.variant?.port}`);
59
+ }
60
+ }
61
+ export {
62
+ run
63
+ };
@@ -1,15 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  STANDARD_SKILLS
4
- } from "./chunk-USNBKHYG.js";
5
- import "./chunk-WBHMQ5OZ.js";
4
+ } from "./chunk-4WXYUOAK.js";
6
5
  import "./chunk-YUIHSKR6.js";
7
- import "./chunk-YJA7P64S.js";
8
- import "./chunk-XOXLRRR2.js";
6
+ import "./chunk-AW7PFDVN.js";
7
+ import "./chunk-RKQEHRBB.js";
9
8
  import {
10
9
  findMind,
11
10
  mindDir
12
- } from "./chunk-B2CPS4QU.js";
11
+ } from "./chunk-H7OZRFJB.js";
13
12
  import "./chunk-K3NQKI34.js";
14
13
 
15
14
  // src/commands/sprout.ts
@@ -22,7 +21,7 @@ async function run(_args) {
22
21
  console.error("volute mind sprout must be run by a mind (VOLUTE_MIND not set)");
23
22
  process.exit(1);
24
23
  }
25
- const entry = findMind(mindName);
24
+ const entry = await findMind(mindName);
26
25
  if (!entry) {
27
26
  console.error(`Unknown mind: ${mindName}`);
28
27
  process.exit(1);
@@ -49,7 +48,7 @@ async function run(_args) {
49
48
  console.error("Write your MEMORY.md before sprouting.");
50
49
  process.exit(1);
51
50
  }
52
- const { daemonFetch } = await import("./daemon-client-Z7FAJ6JW.js");
51
+ const { daemonFetch } = await import("./daemon-client-I42FK2BF.js");
53
52
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
54
53
  const client = getClient();
55
54
  const failedSkills = [];
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  daemonFetch
4
- } from "./chunk-WGOGUMPO.js";
4
+ } from "./chunk-JGFVMROS.js";
5
5
  import {
6
6
  getClient,
7
7
  urlOf
8
8
  } from "./chunk-4RQBJWQX.js";
9
- import "./chunk-B2CPS4QU.js";
9
+ import "./chunk-H7OZRFJB.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
 
12
12
  // src/commands/start.ts
@@ -4,13 +4,13 @@ import {
4
4
  getServiceMode,
5
5
  modeLabel,
6
6
  readDaemonConfig
7
- } from "./chunk-V63B7DX3.js";
7
+ } from "./chunk-LAC664WU.js";
8
8
  import {
9
9
  checkForUpdate
10
- } from "./chunk-ON3FF5JA.js";
11
- import "./chunk-YJA7P64S.js";
12
- import "./chunk-XOXLRRR2.js";
13
- import "./chunk-B2CPS4QU.js";
10
+ } from "./chunk-HDN7MNGD.js";
11
+ import "./chunk-AW7PFDVN.js";
12
+ import "./chunk-RKQEHRBB.js";
13
+ import "./chunk-H7OZRFJB.js";
14
14
  import "./chunk-K3NQKI34.js";
15
15
 
16
16
  // src/commands/status.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/status.ts
@@ -7,11 +7,11 @@ import {
7
7
  } from "./chunk-NAOW2CLO.js";
8
8
  import {
9
9
  readSystemsConfig
10
- } from "./chunk-HFCBO2GL.js";
10
+ } from "./chunk-KDGS53OS.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/pages/status.ts
@@ -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/stop.ts
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-YUIHSKR6.js";
5
5
  import {
6
6
  voluteHome
7
- } from "./chunk-B2CPS4QU.js";
7
+ } from "./chunk-H7OZRFJB.js";
8
8
  import "./chunk-K3NQKI34.js";
9
9
 
10
10
  // src/lib/tailscale.ts
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ run
4
+ } from "./chunk-GIE6CSN5.js";
5
+ import "./chunk-LAC664WU.js";
6
+ import "./chunk-AW7PFDVN.js";
7
+ import "./chunk-RKQEHRBB.js";
8
+ import {
9
+ readGlobalConfig
10
+ } from "./chunk-IKRVFPWU.js";
11
+ import "./chunk-D424ZQGI.js";
12
+ import "./chunk-H7OZRFJB.js";
13
+ import "./chunk-K3NQKI34.js";
14
+ export {
15
+ readGlobalConfig,
16
+ run
17
+ };
@@ -5,19 +5,19 @@ import {
5
5
  pollHealth,
6
6
  readDaemonConfig,
7
7
  restartService
8
- } from "./chunk-V63B7DX3.js";
8
+ } from "./chunk-LAC664WU.js";
9
9
  import {
10
10
  checkForUpdate
11
- } from "./chunk-ON3FF5JA.js";
11
+ } from "./chunk-HDN7MNGD.js";
12
12
  import {
13
13
  exec,
14
14
  execInherit,
15
15
  resolveVoluteBin
16
- } from "./chunk-YJA7P64S.js";
17
- import "./chunk-XOXLRRR2.js";
16
+ } from "./chunk-AW7PFDVN.js";
17
+ import "./chunk-RKQEHRBB.js";
18
18
  import {
19
- voluteHome
20
- } from "./chunk-B2CPS4QU.js";
19
+ voluteSystemDir
20
+ } from "./chunk-H7OZRFJB.js";
21
21
  import "./chunk-K3NQKI34.js";
22
22
 
23
23
  // src/commands/update.ts
@@ -102,9 +102,9 @@ Updated to volute v${result.latest}`);
102
102
  }
103
103
  return;
104
104
  }
105
- const home = voluteHome();
106
- const pidPath = resolve(home, "daemon.pid");
107
- const configPath = resolve(home, "daemon.json");
105
+ const systemDir = voluteSystemDir();
106
+ const pidPath = resolve(systemDir, "daemon.pid");
107
+ const configPath = resolve(systemDir, "daemon.json");
108
108
  let daemonWasRunning = false;
109
109
  let daemonPort = 1618;
110
110
  let daemonHost = "127.0.0.1";
@@ -5,8 +5,8 @@ import {
5
5
  fetchLatestVersion,
6
6
  getCurrentVersion,
7
7
  isNewer
8
- } from "./chunk-ON3FF5JA.js";
9
- import "./chunk-B2CPS4QU.js";
8
+ } from "./chunk-HDN7MNGD.js";
9
+ import "./chunk-H7OZRFJB.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
  export {
12
12
  checkForUpdate,
@@ -12,10 +12,11 @@ async function run(args) {
12
12
  const { positional, flags } = parseArgs(args, {
13
13
  template: { type: "string" },
14
14
  continue: { type: "boolean" },
15
- abort: { type: "boolean" }
15
+ abort: { type: "boolean" },
16
+ accept: { type: "boolean" }
16
17
  });
17
18
  const mindName = resolveMindName({ mind: positional[0] });
18
- const { daemonFetch } = await import("./daemon-client-Z7FAJ6JW.js");
19
+ const { daemonFetch } = await import("./daemon-client-I42FK2BF.js");
19
20
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
20
21
  const client = getClient();
21
22
  const res = await daemonFetch(
@@ -26,7 +27,8 @@ async function run(args) {
26
27
  body: JSON.stringify({
27
28
  template: flags.template,
28
29
  continue: flags.continue,
29
- abort: flags.abort
30
+ abort: flags.abort,
31
+ accept: flags.accept
30
32
  })
31
33
  }
32
34
  );
@@ -39,6 +41,10 @@ async function run(args) {
39
41
  console.log(`Upgrade aborted for ${mindName}.`);
40
42
  return;
41
43
  }
44
+ if (flags.accept) {
45
+ console.log(`Upgrade accepted for ${mindName}.`);
46
+ return;
47
+ }
42
48
  if (data.conflicts) {
43
49
  console.log("\nMerge conflicts detected. Resolve them in:");
44
50
  console.log(` ${data.worktreeDir}`);
@@ -50,12 +56,13 @@ Or abort:`);
50
56
  console.log(` volute mind upgrade ${mindName} --abort`);
51
57
  return;
52
58
  }
59
+ const variantMindName = `${mindName}-${data.variant}`;
53
60
  console.log(`
54
61
  Upgrade variant running on port ${data.port}`);
55
62
  console.log(`
56
63
  Next steps:`);
57
- console.log(` volute send @${mindName}@${data.variant} "hello" # chat with upgraded variant`);
58
- console.log(` volute variant merge ${data.variant} # merge back when satisfied`);
64
+ console.log(` volute chat send @${variantMindName} "hello" # chat with upgraded variant`);
65
+ console.log(` volute mind upgrade ${mindName} --accept # accept the upgrade`);
59
66
  }
60
67
  export {
61
68
  run
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ import "./chunk-K3NQKI34.js";
3
+
4
+ // src/commands/variant.ts
5
+ async function run(args) {
6
+ const subcommand = args[0];
7
+ switch (subcommand) {
8
+ case "create":
9
+ console.error(
10
+ "'volute variant create' has been replaced. Use 'volute mind split' to create variants."
11
+ );
12
+ console.error("Usage: volute mind split <name> [--from <mind>] [--soul '...'] [--no-start]");
13
+ process.exit(1);
14
+ break;
15
+ case "merge":
16
+ console.error(
17
+ "'volute variant merge' has been replaced. Use 'volute mind join' to merge variants."
18
+ );
19
+ console.error(
20
+ "Usage: volute mind join <name> [--summary '...' --memory '...' --justification '...']"
21
+ );
22
+ process.exit(1);
23
+ break;
24
+ case "list":
25
+ case "delete":
26
+ console.error(`'volute variant ${subcommand}' is no longer available.`);
27
+ console.error(
28
+ "Use 'volute mind list' to see variants, or 'volute mind delete <variant-name>' to delete."
29
+ );
30
+ process.exit(1);
31
+ break;
32
+ default:
33
+ console.error(
34
+ "'volute variant' has been replaced. Use 'volute mind split' and 'volute mind join'."
35
+ );
36
+ process.exit(1);
37
+ }
38
+ }
39
+ export {
40
+ run
41
+ };
@@ -1,32 +1,32 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ deliverMessage
4
+ } from "./chunk-OQZH4PBB.js";
5
+ import "./chunk-KDGS53OS.js";
6
+ import "./chunk-K5NAC55T.js";
7
+ import "./chunk-PHSAT7YL.js";
8
+ import "./chunk-USUXRNVD.js";
9
+ import "./chunk-IAYBDWVG.js";
10
+ import "./chunk-VIVMW2H2.js";
2
11
  import {
3
12
  computeTemplateHash
4
13
  } from "./chunk-AKPFNL7L.js";
5
14
  import {
6
- deliverMessage
7
- } from "./chunk-3CFRE2VC.js";
8
- import "./chunk-HFCBO2GL.js";
9
- import "./chunk-NWI2425I.js";
10
- import "./chunk-J2CO4WEV.js";
11
- import "./chunk-2VO7453N.js";
12
- import "./chunk-UTL75LP6.js";
13
- import "./chunk-WBHMQ5OZ.js";
15
+ getCurrentVersion
16
+ } from "./chunk-HDN7MNGD.js";
17
+ import "./chunk-2WPW7OT6.js";
14
18
  import {
15
19
  logger_default
16
20
  } from "./chunk-YUIHSKR6.js";
17
- import {
18
- getCurrentVersion
19
- } from "./chunk-ON3FF5JA.js";
20
- import "./chunk-SIAG3QMM.js";
21
- import "./chunk-PHU4DEAJ.js";
22
- import "./chunk-YJA7P64S.js";
23
- import "./chunk-XOXLRRR2.js";
24
- import "./chunk-TZKJLDQN.js";
21
+ import "./chunk-AW7PFDVN.js";
22
+ import "./chunk-RKQEHRBB.js";
23
+ import "./chunk-IKRVFPWU.js";
24
+ import "./chunk-T6HKBWXZ.js";
25
25
  import {
26
26
  readRegistry,
27
- voluteHome,
28
- writeRegistry
29
- } from "./chunk-B2CPS4QU.js";
27
+ setMindTemplateHash,
28
+ voluteSystemDir
29
+ } from "./chunk-H7OZRFJB.js";
30
30
  import "./chunk-K3NQKI34.js";
31
31
 
32
32
  // src/lib/version-notify.ts
@@ -83,7 +83,7 @@ function findChangelog() {
83
83
 
84
84
  // src/lib/version-notify.ts
85
85
  function statePath() {
86
- return resolve2(voluteHome(), "version-notify.json");
86
+ return resolve2(voluteSystemDir(), "version-notify.json");
87
87
  }
88
88
  function readState() {
89
89
  try {
@@ -97,23 +97,19 @@ function writeState(state) {
97
97
  writeFileSync(statePath(), `${JSON.stringify(state, null, 2)}
98
98
  `);
99
99
  }
100
- function backfillTemplateHashes() {
101
- const entries = readRegistry();
102
- let changed = false;
100
+ async function backfillTemplateHashes() {
101
+ const entries = await readRegistry();
103
102
  for (const entry of entries) {
104
103
  if (entry.templateHash != null) continue;
105
104
  if (entry.stage === "seed") continue;
106
105
  const tmpl = entry.template ?? "claude";
107
106
  try {
108
- entry.templateHash = computeTemplateHash(tmpl);
109
- changed = true;
107
+ const hash = computeTemplateHash(tmpl);
108
+ await setMindTemplateHash(entry.name, hash);
110
109
  } catch (err) {
111
110
  logger_default.warn(`failed to compute template hash for ${entry.name}`, logger_default.errorData(err));
112
111
  }
113
112
  }
114
- if (changed) {
115
- writeRegistry(entries);
116
- }
117
113
  }
118
114
  async function notifyVersionUpdate() {
119
115
  const currentVersion = getCurrentVersion();
@@ -123,7 +119,7 @@ async function notifyVersionUpdate() {
123
119
  return;
124
120
  }
125
121
  if (state.lastNotifiedVersion === currentVersion) return;
126
- const entries = readRegistry();
122
+ const entries = await readRegistry();
127
123
  const runningMinds = entries.filter((e) => e.running && e.stage !== "seed");
128
124
  if (runningMinds.length === 0) {
129
125
  writeState({ lastNotifiedVersion: currentVersion });
@@ -172,7 +168,7 @@ ${releaseNotes}`;
172
168
 
173
169
  ---
174
170
 
175
- A template update is available for you. To upgrade, your operator can run:
171
+ A template update is available for you. To upgrade, run:
176
172
  volute mind upgrade ${mindName}`;
177
173
  }
178
174
  return message;