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.
- package/README.md +13 -13
- package/dist/{activity-events-ZMBAKLUF.js → activity-events-BBIEA2F4.js} +2 -3
- package/dist/api.d.ts +363 -168
- package/dist/{archive-4ZQYK5MN.js → archive-UA4BDFXQ.js} +2 -2
- package/dist/{auth-4TV573WE.js → auth-D3OT2ARB.js} +3 -3
- package/dist/bridge-FQHZL3MC.js +206 -0
- package/dist/chat-MHJ3L6JQ.js +58 -0
- package/dist/{chunk-PHU4DEAJ.js → chunk-2WPW7OT6.js} +3 -3
- package/dist/{chunk-5Y3PBKW6.js → chunk-2YP2TVDT.js} +138 -56
- package/dist/{chunk-USNBKHYG.js → chunk-4WXYUOAK.js} +4 -6
- package/dist/{chunk-YJA7P64S.js → chunk-AW7PFDVN.js} +5 -5
- package/dist/{chunk-OZFKBXD6.js → chunk-EHYDTZTF.js} +6 -6
- package/dist/{chunk-LX22GRG7.js → chunk-GIE6CSN5.js} +11 -8
- package/dist/{chunk-WBHMQ5OZ.js → chunk-H7OZRFJB.js} +192 -12
- package/dist/{chunk-ON3FF5JA.js → chunk-HDN7MNGD.js} +3 -3
- package/dist/chunk-IAYBDWVG.js +477 -0
- package/dist/{chunk-TZKJLDQN.js → chunk-IKRVFPWU.js} +14 -9
- package/dist/{chunk-WGOGUMPO.js → chunk-JGFVMROS.js} +13 -6
- package/dist/{chunk-3TV4GLFO.js → chunk-JKOWNZ4P.js} +3 -3
- package/dist/{chunk-NWI2425I.js → chunk-K5NAC55T.js} +1 -1
- package/dist/{chunk-HFCBO2GL.js → chunk-KDGS53OS.js} +4 -4
- package/dist/chunk-KTLFDYPT.js +61 -0
- package/dist/{chunk-V63B7DX3.js → chunk-LAC664WU.js} +7 -4
- package/dist/{chunk-3CFRE2VC.js → chunk-OQZH4PBB.js} +337 -1061
- package/dist/{chunk-2VO7453N.js → chunk-PHSAT7YL.js} +30 -54
- package/dist/{chunk-XOXLRRR2.js → chunk-RKQEHRBB.js} +4 -3
- package/dist/chunk-T6HKBWXZ.js +23 -0
- package/dist/{chunk-UTL75LP6.js → chunk-USUXRNVD.js} +22 -22
- package/dist/{chunk-J2CO4WEV.js → chunk-VIVMW2H2.js} +4 -4
- package/dist/{chunk-KTJGZ7M7.js → chunk-XBLSAVJF.js} +1 -1
- package/dist/cli.js +31 -36
- package/dist/{cloud-sync-NI2K3C7G.js → cloud-sync-T7M3ESC3.js} +15 -14
- package/dist/connectors/discord-bridge.js +158 -0
- package/dist/connectors/slack-bridge.js +119 -0
- package/dist/connectors/telegram-bridge.js +133 -0
- package/dist/conversations-M2K4253F.js +55 -0
- package/dist/create-D7J73A6H.js +45 -0
- package/dist/{create-4YBRTTJS.js → create-QWV73WXD.js} +1 -1
- package/dist/{daemon-client-Z7FAJ6JW.js → daemon-client-I42FK2BF.js} +2 -2
- package/dist/{daemon-restart-BJZ3O4U4.js → daemon-restart-M2QTYMEG.js} +7 -7
- package/dist/daemon.js +1758 -1024
- package/dist/db-IC4J52XQ.js +8 -0
- package/dist/{delete-27OYNK25.js → delete-4JYGD4VN.js} +1 -1
- package/dist/down-LVBXEULC.js +14 -0
- package/dist/{env-M336ONDP.js → env-YJMUMFIY.js} +2 -2
- package/dist/{export-HP4G5DQC.js → export-BOJQWBMA.js} +4 -4
- package/dist/{file-HUDKTRAS.js → file-CR36YUPD.js} +4 -4
- package/dist/{history-B64GTFTD.js → history-XKRTAFS2.js} +5 -5
- package/dist/{import-XIB7UV4S.js → import-SRTQXBGH.js} +4 -4
- package/dist/join-J4QU42DL.js +66 -0
- package/dist/list-R73GENNL.js +40 -0
- package/dist/{log-PBFNILJ4.js → log-ABYNVYJ3.js} +4 -4
- package/dist/{login-B5E7N7MY.js → login-3QZNR2DF.js} +4 -4
- package/dist/{login-6U7U6BNG.js → login-XX37I52P.js} +2 -2
- package/dist/{logout-XSJRYS3U.js → logout-T53VKCPU.js} +4 -4
- package/dist/{logout-UKD5LA37.js → logout-W4KOOBIT.js} +2 -2
- package/dist/{logs-3CART7O7.js → logs-U35JR2KE.js} +5 -5
- package/dist/{merge-VK2HSKMA.js → merge-LNSMSAOF.js} +4 -4
- package/dist/message-delivery-LDXLGERA.js +25 -0
- package/dist/migrate-registry-to-db-XC7T5B7P.js +110 -0
- package/dist/{mind-HZ3QSDDJ.js → mind-DI33C74K.js} +25 -25
- package/dist/{mind-activity-tracker-4G6FURY2.js → mind-activity-tracker-EN6XNXPF.js} +3 -4
- package/dist/mind-manager-M6EMUW5I.js +18 -0
- package/dist/{mind-sleep-DTV7L44D.js → mind-sleep-BTSWQNAC.js} +4 -4
- package/dist/{mind-wake-PFN4FN3T.js → mind-wake-SBAKIDVP.js} +4 -4
- package/dist/{notes-37FW2UR2.js → notes-XCER3I7M.js} +11 -21
- package/dist/{package-VZWLXPHV.js → package-7WY6VKU3.js} +1 -1
- package/dist/{pages-DIIT5HMQ.js → pages-6EBS6CBR.js} +2 -2
- package/dist/{publish-HQV7YREB.js → publish-66UB2ZFY.js} +5 -5
- package/dist/{pull-2MB4SK3C.js → pull-XCHJTM5M.js} +4 -4
- package/dist/read-36UFXN3G.js +46 -0
- package/dist/{register-EFND67FQ.js → register-6B2CXTYM.js} +2 -2
- package/dist/{registry-D2BSQ2X5.js → registry-NDNOOYG4.js} +15 -9
- package/dist/{restart-CCK7D6TV.js → restart-6ESL3NBO.js} +5 -5
- package/dist/{sandbox-EHGFF52K.js → sandbox-TGBX22DS.js} +3 -3
- package/dist/{schedule-6F7ELB2M.js → schedule-QTJMFATP.js} +5 -5
- package/dist/{seed-E5OQGWX3.js → seed-SSUCYYDF.js} +2 -2
- package/dist/{send-IH6XZKPC.js → send-ZNCJDSRP.js} +25 -19
- package/dist/{service-LLBV3R7M.js → service-6LIN3F3K.js} +4 -4
- package/dist/{setup-F6TWFYGQ.js → setup-JG4QAEBV.js} +12 -12
- package/dist/{setup-YGAAIKKZ.js → setup-JHL5ZEST.js} +2 -2
- package/dist/{shared-UMO4S7CC.js → shared-ML5I4Q2A.js} +4 -4
- package/dist/{skill-42LGFBQC.js → skill-AUAQTSP5.js} +5 -5
- package/dist/skills/dreaming/references/INSTALL.md +2 -2
- package/dist/skills/orientation/SKILL.md +3 -3
- package/dist/skills/volute-mind/SKILL.md +32 -30
- package/dist/sleep-manager-MWYHM5HV.js +29 -0
- package/dist/split-TKJ5OT3P.js +63 -0
- package/dist/{sprout-QL74KR2X.js → sprout-IJVVKSJ2.js} +6 -7
- package/dist/{start-O5JQASRC.js → start-EUJSS5R4.js} +2 -2
- package/dist/{status-FZBEBM7Q.js → status-77YEPHMW.js} +5 -5
- package/dist/{status-WXD4HXRL.js → status-7GA4SM4Y.js} +4 -4
- package/dist/{status-LV34BG6G.js → status-THLOBLWG.js} +2 -2
- package/dist/{stop-2SOG5NYF.js → stop-3XAITBBF.js} +5 -5
- package/dist/{tailscale-AJ4VL5XK.js → tailscale-NY5MUMY3.js} +1 -1
- package/dist/up-NKSMXBWR.js +17 -0
- package/dist/{update-5VUDAI3D.js → update-PTSH22AZ.js} +9 -9
- package/dist/{update-check-F5Z3ALXX.js → update-check-64FWC4Y2.js} +2 -2
- package/dist/{upgrade-QCCO33BK.js → upgrade-HA47CS4C.js} +12 -5
- package/dist/variant-7TGZHOU3.js +41 -0
- package/dist/{version-notify-USFZBWMG.js → version-notify-5Z4MNR6M.js} +26 -30
- package/dist/web-assets/assets/index-CI5wgghI.css +1 -0
- package/dist/web-assets/assets/index-is5CvJWH.js +75 -0
- package/dist/web-assets/favicon.png +0 -0
- package/dist/web-assets/index.html +2 -2
- package/drizzle/0017_minds.sql +16 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +1 -1
- package/templates/_base/.init/.config/prompts.json +2 -2
- package/templates/_base/home/VOLUTE.md +5 -5
- package/templates/_base/src/lib/startup.ts +2 -2
- package/dist/channel-ZVZV42UD.js +0 -260
- package/dist/chunk-B2CPS4QU.js +0 -283
- package/dist/chunk-SIAG3QMM.js +0 -42
- package/dist/chunk-WSLPZF72.js +0 -173
- package/dist/connector-G722WXAU.js +0 -147
- package/dist/connectors/discord.js +0 -177
- package/dist/connectors/slack.js +0 -181
- package/dist/connectors/telegram.js +0 -187
- package/dist/down-7UKFMJJZ.js +0 -14
- package/dist/message-delivery-MS5JYPZX.js +0 -25
- package/dist/mind-manager-VVK67AY3.js +0 -19
- package/dist/sleep-manager-EE4NRN2Q.js +0 -29
- package/dist/up-SDMCSVI3.js +0 -17
- package/dist/variant-WWLDY6D5.js +0 -207
- package/dist/web-assets/assets/index-CUQ31ieL.js +0 -69
- 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 "
|
|
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
|
|
19
|
-
| `volute send
|
|
20
|
-
| `volute
|
|
21
|
-
| `volute
|
|
22
|
-
| `volute
|
|
23
|
-
| `volute
|
|
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
|
|
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
|
|
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
|
|
198
|
-
4. `volute
|
|
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
|
|
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
|
|
214
|
-
4. `volute
|
|
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
|
-
##
|
|
343
|
+
## Chat Commands
|
|
342
344
|
|
|
343
|
-
|
|
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"
|
|
347
|
-
volute
|
|
348
|
-
volute
|
|
349
|
-
volute channel
|
|
350
|
-
volute
|
|
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
|
-
|
|
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-
|
|
5
|
-
import "./chunk-WBHMQ5OZ.js";
|
|
4
|
+
} from "./chunk-4WXYUOAK.js";
|
|
6
5
|
import "./chunk-YUIHSKR6.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-AW7PFDVN.js";
|
|
7
|
+
import "./chunk-RKQEHRBB.js";
|
|
9
8
|
import {
|
|
10
9
|
findMind,
|
|
11
10
|
mindDir
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
4
|
+
} from "./chunk-JGFVMROS.js";
|
|
5
5
|
import {
|
|
6
6
|
getClient,
|
|
7
7
|
urlOf
|
|
8
8
|
} from "./chunk-4RQBJWQX.js";
|
|
9
|
-
import "./chunk-
|
|
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-
|
|
7
|
+
} from "./chunk-LAC664WU.js";
|
|
8
8
|
import {
|
|
9
9
|
checkForUpdate
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
10
|
+
} from "./chunk-KDGS53OS.js";
|
|
11
11
|
import {
|
|
12
12
|
parseArgs
|
|
13
13
|
} from "./chunk-D424ZQGI.js";
|
|
14
|
-
import "./chunk-
|
|
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-
|
|
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
|
|
@@ -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-
|
|
8
|
+
} from "./chunk-LAC664WU.js";
|
|
9
9
|
import {
|
|
10
10
|
checkForUpdate
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-HDN7MNGD.js";
|
|
12
12
|
import {
|
|
13
13
|
exec,
|
|
14
14
|
execInherit,
|
|
15
15
|
resolveVoluteBin
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-AW7PFDVN.js";
|
|
17
|
+
import "./chunk-RKQEHRBB.js";
|
|
18
18
|
import {
|
|
19
|
-
|
|
20
|
-
} from "./chunk-
|
|
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
|
|
106
|
-
const pidPath = resolve(
|
|
107
|
-
const configPath = resolve(
|
|
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";
|
|
@@ -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-
|
|
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 @${
|
|
58
|
-
console.log(` volute
|
|
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
|
-
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
import "./chunk-
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
} from "./chunk-
|
|
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(
|
|
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
|
-
|
|
109
|
-
|
|
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,
|
|
171
|
+
A template update is available for you. To upgrade, run:
|
|
176
172
|
volute mind upgrade ${mindName}`;
|
|
177
173
|
}
|
|
178
174
|
return message;
|