volute 0.13.2 → 0.14.1
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/dist/{channel-JZJJRRWT.js → channel-SLURLIRV.js} +28 -28
- package/dist/{chunk-KRJ6KCBI.js → chunk-2Y77MCFG.js} +3 -3
- package/dist/{chunk-AA5TDLXB.js → chunk-3FC42ZBM.js} +24 -24
- package/dist/{chunk-YYUSXARD.js → chunk-6BDNWYKG.js} +2 -2
- package/dist/{chunk-KN4WBLH2.js → chunk-BEFIBW5B.js} +2 -2
- package/dist/{chunk-FE5O5RSL.js → chunk-GSPWIM5E.js} +25 -25
- package/dist/{chunk-QRRXD2V7.js → chunk-J52CJCVI.js} +71 -69
- package/dist/{chunk-LGSW7T7K.js → chunk-M77QBTEH.js} +60 -57
- package/dist/{chunk-KXOFPDO6.js → chunk-MVSXRMJJ.js} +1 -1
- package/dist/chunk-NAOW2CLO.js +15 -0
- package/dist/{chunk-VQIJUR43.js → chunk-OJQ47SCA.js} +1 -1
- package/dist/{chunk-O4BN3ZIY.js → chunk-OYSZNX5I.js} +7 -7
- package/dist/{chunk-AOSGW3MX.js → chunk-PDLAZJGC.js} +28 -28
- package/dist/{chunk-XUA3JUFK.js → chunk-PO5Q2AYN.js} +2 -2
- package/dist/{chunk-6BQHEIDO.js → chunk-QJIIHU32.js} +2 -2
- package/dist/{chunk-NXT67PPK.js → chunk-ZCEYUUID.js} +19 -19
- package/dist/cli.js +42 -42
- package/dist/{connector-WFT5KK67.js → connector-JFAHYFQX.js} +21 -21
- package/dist/connectors/discord.js +7 -7
- package/dist/connectors/slack.js +7 -7
- package/dist/connectors/telegram.js +9 -9
- package/dist/{create-HT47ZH5T.js → create-ZWHCRT5F.js} +7 -7
- package/dist/{daemon-client-DEF7IFEJ.js → daemon-client-ODKDUYDE.js} +2 -2
- package/dist/{daemon-restart-P3FEE3QJ.js → daemon-restart-IZGEF4NA.js} +6 -6
- package/dist/daemon.js +2313 -1997
- package/dist/{delete-YG3RVURA.js → delete-6G6WEX4F.js} +8 -8
- package/dist/down-A56B5JLK.js +14 -0
- package/dist/{env-BQYYF4YL.js → env-6LXDUZDA.js} +25 -25
- package/dist/{history-I4KIKIUX.js → history-LKCJJMUV.js} +7 -7
- package/dist/{import-UHCK6PRC.js → import-EDGRLIGO.js} +3 -3
- package/dist/{logs-2DWFES6A.js → logs-GYOR3L2L.js} +8 -8
- package/dist/mind-OJN6RBZW.js +79 -0
- package/dist/mind-manager-PN5SUDJ4.js +15 -0
- package/dist/{package-MMTPOMUN.js → package-I7Z6G44Y.js} +4 -4
- package/dist/{restart-6PE3GWYZ.js → restart-YFAWFS5T.js} +9 -9
- package/dist/{schedule-5AYTQM3N.js → schedule-AGYLDMNS.js} +17 -17
- package/dist/{seed-3QQVFMBU.js → seed-AP4Q7RZ7.js} +9 -9
- package/dist/{send-FPFW7J5Q.js → send-SV4K2TDE.js} +32 -24
- package/dist/{service-5X5EKPVM.js → service-U7MZ2H7F.js} +4 -4
- package/dist/{setup-5NXV25ZS.js → setup-DJKIZKGW.js} +21 -16
- package/dist/{sprout-VOUJ4Y3I.js → sprout-TJ3BHVOG.js} +25 -18
- package/dist/{start-ICPSQ2ZK.js → start-3YYRXBKP.js} +7 -7
- package/dist/{status-JBT7ENQN.js → status-VSFZYX7S.js} +14 -14
- package/dist/{stop-IXJGAG4T.js → stop-AA5K5LYG.js} +9 -9
- package/dist/{up-ROC7LJ7G.js → up-C4MV6EXV.js} +5 -5
- package/dist/{update-GU6JYDSN.js → update-YAGN5ODG.js} +5 -5
- package/dist/{update-check-MUPZYTW4.js → update-check-APLTH4IN.js} +2 -2
- package/dist/{upgrade-275LKIEG.js → upgrade-KXZCQSZN.js} +8 -10
- package/dist/{variant-RE45F2IY.js → variant-X5QFG6KK.js} +30 -30
- package/dist/web-assets/assets/index-CeFLp8DZ.js +307 -0
- package/dist/web-assets/index.html +1 -1
- package/drizzle/0005_rename_agents_to_minds.sql +11 -0
- package/drizzle/meta/0005_snapshot.json +410 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +4 -4
- package/templates/_base/.init/.config/scripts/session-reader.ts +1 -1
- package/templates/_base/.init/SOUL.md +1 -1
- package/templates/_base/_skills/memory/SKILL.md +1 -1
- package/templates/_base/_skills/orientation/SKILL.md +6 -6
- package/templates/_base/_skills/sessions/SKILL.md +1 -1
- package/templates/_base/_skills/{volute-agent → volute-mind}/SKILL.md +21 -21
- package/templates/_base/home/VOLUTE.md +7 -7
- package/templates/_base/src/lib/auto-commit.ts +1 -1
- package/templates/_base/src/lib/auto-reply.ts +1 -1
- package/templates/_base/src/lib/daemon-client.ts +8 -8
- package/templates/_base/src/lib/router.ts +6 -6
- package/templates/_base/src/lib/routing.ts +9 -6
- package/templates/_base/src/lib/startup.ts +1 -1
- package/templates/_base/src/lib/volute-server.ts +1 -1
- package/templates/{agent-sdk → claude}/.init/CLAUDE.md +3 -3
- package/templates/{agent-sdk → claude}/src/agent.ts +10 -10
- package/templates/{agent-sdk → claude}/src/lib/hooks/pre-compact.ts +2 -2
- package/templates/{agent-sdk → claude}/src/lib/session-store.ts +2 -2
- package/templates/{agent-sdk → claude}/src/lib/stream-consumer.ts +1 -1
- package/templates/{agent-sdk → claude}/src/server.ts +4 -4
- package/templates/pi/.init/{AGENTS.md → MINDS.md} +3 -3
- package/templates/pi/home/.config/config.json.tmpl +1 -1
- package/templates/pi/src/agent.ts +12 -12
- package/templates/pi/src/lib/event-handler.ts +39 -4
- package/templates/pi/src/server.ts +3 -3
- package/dist/agent-IUSETOXJ.js +0 -79
- package/dist/agent-manager-4O4AC2S6.js +0 -15
- package/dist/chunk-AZEL2IEK.js +0 -15
- package/dist/down-36YCOZ7V.js +0 -14
- package/dist/web-assets/assets/index-TqXd1QOX.js +0 -307
- /package/templates/{agent-sdk → claude}/.init/.claude/settings.json +0 -0
- /package/templates/{agent-sdk → claude}/.init/.config/routes.json +0 -0
- /package/templates/{agent-sdk → claude}/package.json.tmpl +0 -0
- /package/templates/{agent-sdk → claude}/src/lib/content.ts +0 -0
- /package/templates/{agent-sdk → claude}/src/lib/hooks/auto-commit.ts +0 -0
- /package/templates/{agent-sdk → claude}/src/lib/hooks/identity-reload.ts +0 -0
- /package/templates/{agent-sdk → claude}/src/lib/hooks/session-context.ts +0 -0
- /package/templates/{agent-sdk → claude}/src/lib/message-channel.ts +0 -0
- /package/templates/{agent-sdk → claude}/volute-template.json +0 -0
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
resolveMindName
|
|
4
|
+
} from "./chunk-NAOW2CLO.js";
|
|
5
5
|
import {
|
|
6
6
|
getChannelDriver
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-PDLAZJGC.js";
|
|
8
8
|
import {
|
|
9
9
|
parseArgs
|
|
10
10
|
} from "./chunk-D424ZQGI.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-3FC42ZBM.js";
|
|
12
12
|
import {
|
|
13
13
|
daemonFetch
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-OJQ47SCA.js";
|
|
15
15
|
import {
|
|
16
|
-
|
|
17
|
-
} from "./chunk-
|
|
16
|
+
findMind
|
|
17
|
+
} from "./chunk-M77QBTEH.js";
|
|
18
18
|
import {
|
|
19
19
|
getClient,
|
|
20
20
|
urlOf
|
|
@@ -73,16 +73,16 @@ async function readStdin() {
|
|
|
73
73
|
// src/commands/send.ts
|
|
74
74
|
async function run(args) {
|
|
75
75
|
const { positional, flags } = parseArgs(args, {
|
|
76
|
-
|
|
76
|
+
mind: { type: "string" }
|
|
77
77
|
});
|
|
78
78
|
const target = positional[0];
|
|
79
79
|
const message = positional[1] ?? await readStdin();
|
|
80
80
|
if (!target || !message) {
|
|
81
|
-
console.error('Usage: volute send <target> "<message>" [--
|
|
82
|
-
console.error(' echo "message" | volute send <target> [--
|
|
81
|
+
console.error('Usage: volute send <target> "<message>" [--mind <name>]');
|
|
82
|
+
console.error(' echo "message" | volute send <target> [--mind <name>]');
|
|
83
83
|
console.error("");
|
|
84
84
|
console.error("Examples:");
|
|
85
|
-
console.error(' volute send @other-
|
|
85
|
+
console.error(' volute send @other-mind "hello"');
|
|
86
86
|
console.error(' volute send animal-chat "hello everyone"');
|
|
87
87
|
console.error(' volute send discord:server/channel "hello"');
|
|
88
88
|
process.exit(1);
|
|
@@ -94,7 +94,15 @@ To reply to a person, use their username from the message prefix (e.g. volute se
|
|
|
94
94
|
);
|
|
95
95
|
process.exit(1);
|
|
96
96
|
}
|
|
97
|
-
|
|
97
|
+
let parsed = parseTarget(target);
|
|
98
|
+
if (!parsed.isDM && parsed.platform === "volute" && findMind(parsed.identifier)) {
|
|
99
|
+
parsed = {
|
|
100
|
+
platform: "volute",
|
|
101
|
+
identifier: `@${parsed.identifier}`,
|
|
102
|
+
uri: `volute:@${parsed.identifier}`,
|
|
103
|
+
isDM: true
|
|
104
|
+
};
|
|
105
|
+
}
|
|
98
106
|
const driver = getChannelDriver(parsed.platform);
|
|
99
107
|
if (!driver) {
|
|
100
108
|
console.error(`No driver for platform: ${parsed.platform}`);
|
|
@@ -103,17 +111,17 @@ To reply to a person, use their username from the message prefix (e.g. volute se
|
|
|
103
111
|
let channelUri = parsed.uri;
|
|
104
112
|
if (parsed.isDM && parsed.platform === "volute") {
|
|
105
113
|
const targetName = parsed.identifier.slice(1);
|
|
106
|
-
const
|
|
107
|
-
const sender =
|
|
114
|
+
const mindSelf = process.env.VOLUTE_MIND;
|
|
115
|
+
const sender = mindSelf || userInfo().username;
|
|
108
116
|
if (!driver.createConversation) {
|
|
109
117
|
console.error("Volute driver does not support creating conversations");
|
|
110
118
|
process.exit(1);
|
|
111
119
|
}
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const participants =
|
|
120
|
+
const targetIsMind = !!findMind(targetName);
|
|
121
|
+
const contextMind = mindSelf && !targetIsMind ? mindSelf : targetName;
|
|
122
|
+
const participants = mindSelf && !targetIsMind ? [targetName] : [sender];
|
|
115
123
|
const env = {
|
|
116
|
-
|
|
124
|
+
VOLUTE_MIND: contextMind,
|
|
117
125
|
VOLUTE_SENDER: sender
|
|
118
126
|
};
|
|
119
127
|
try {
|
|
@@ -129,11 +137,11 @@ To reply to a person, use their username from the message prefix (e.g. volute se
|
|
|
129
137
|
console.error(err instanceof Error ? err.message : String(err));
|
|
130
138
|
process.exit(1);
|
|
131
139
|
}
|
|
132
|
-
if (
|
|
140
|
+
if (mindSelf) {
|
|
133
141
|
try {
|
|
134
142
|
const client = getClient();
|
|
135
143
|
await daemonFetch(
|
|
136
|
-
urlOf(client.api.
|
|
144
|
+
urlOf(client.api.minds[":name"].history.$url({ param: { name: mindSelf } })),
|
|
137
145
|
{
|
|
138
146
|
method: "POST",
|
|
139
147
|
headers: { "Content-Type": "application/json" },
|
|
@@ -145,10 +153,10 @@ To reply to a person, use their username from the message prefix (e.g. volute se
|
|
|
145
153
|
}
|
|
146
154
|
}
|
|
147
155
|
} else {
|
|
148
|
-
const
|
|
156
|
+
const mindName = resolveMindName(flags);
|
|
149
157
|
const client = getClient();
|
|
150
158
|
const res = await daemonFetch(
|
|
151
|
-
urlOf(client.api.
|
|
159
|
+
urlOf(client.api.minds[":name"].channels.send.$url({ param: { name: mindName } })),
|
|
152
160
|
{
|
|
153
161
|
method: "POST",
|
|
154
162
|
headers: { "Content-Type": "application/json" },
|
|
@@ -161,10 +169,10 @@ To reply to a person, use their username from the message prefix (e.g. volute se
|
|
|
161
169
|
process.exit(1);
|
|
162
170
|
}
|
|
163
171
|
console.log("Message sent.");
|
|
164
|
-
if (process.env.
|
|
172
|
+
if (process.env.VOLUTE_MIND) {
|
|
165
173
|
try {
|
|
166
174
|
await daemonFetch(
|
|
167
|
-
urlOf(client.api.
|
|
175
|
+
urlOf(client.api.minds[":name"].history.$url({ param: { name: mindName } })),
|
|
168
176
|
{
|
|
169
177
|
method: "POST",
|
|
170
178
|
headers: { "Content-Type": "application/json" },
|
|
@@ -4,15 +4,15 @@ import {
|
|
|
4
4
|
LAUNCHD_PLIST_PATH,
|
|
5
5
|
SYSTEM_SERVICE_PATH,
|
|
6
6
|
USER_SYSTEMD_UNIT
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6BDNWYKG.js";
|
|
8
8
|
import {
|
|
9
9
|
resolveVoluteBin
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-2Y77MCFG.js";
|
|
11
|
+
import "./chunk-ZCEYUUID.js";
|
|
12
12
|
import {
|
|
13
13
|
parseArgs
|
|
14
14
|
} from "./chunk-D424ZQGI.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-M77QBTEH.js";
|
|
16
16
|
import "./chunk-K3NQKI34.js";
|
|
17
17
|
|
|
18
18
|
// src/commands/service.ts
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
SYSTEM_SERVICE_PATH
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6BDNWYKG.js";
|
|
5
5
|
import {
|
|
6
6
|
resolveVoluteBin
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-2Y77MCFG.js";
|
|
8
8
|
import {
|
|
9
9
|
ensureVoluteGroup
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ZCEYUUID.js";
|
|
11
11
|
import {
|
|
12
12
|
parseArgs
|
|
13
13
|
} from "./chunk-D424ZQGI.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-M77QBTEH.js";
|
|
15
15
|
import "./chunk-K3NQKI34.js";
|
|
16
16
|
|
|
17
17
|
// src/commands/setup.ts
|
|
@@ -23,7 +23,8 @@ var SERVICE_NAME = "volute.service";
|
|
|
23
23
|
var PROFILE_PATH = "/etc/profile.d/volute.sh";
|
|
24
24
|
var WRAPPER_PATH = "/usr/local/bin/volute";
|
|
25
25
|
var DATA_DIR = "/var/lib/volute";
|
|
26
|
-
var
|
|
26
|
+
var MINDS_DIR = "/minds";
|
|
27
|
+
var LEGACY_AGENTS_DIR = "/agents";
|
|
27
28
|
var HOST_RE = /^[a-zA-Z0-9.:_-]+$/;
|
|
28
29
|
function validateHost(host) {
|
|
29
30
|
if (!HOST_RE.test(host)) {
|
|
@@ -51,7 +52,7 @@ function generateUnit(voluteBin, port, host) {
|
|
|
51
52
|
const binUnderHome = voluteBin.startsWith(`${home}/`);
|
|
52
53
|
const lines = [
|
|
53
54
|
"[Unit]",
|
|
54
|
-
"Description=Volute
|
|
55
|
+
"Description=Volute Mind Manager",
|
|
55
56
|
"After=network.target",
|
|
56
57
|
"",
|
|
57
58
|
"[Service]",
|
|
@@ -59,12 +60,12 @@ function generateUnit(voluteBin, port, host) {
|
|
|
59
60
|
`ExecStart=${voluteBin} ${args.join(" ")}`,
|
|
60
61
|
`Environment=PATH=${buildServicePath(voluteBin)}`,
|
|
61
62
|
`Environment=VOLUTE_HOME=${DATA_DIR}`,
|
|
62
|
-
`Environment=
|
|
63
|
+
`Environment=VOLUTE_MINDS_DIR=${MINDS_DIR}`,
|
|
63
64
|
"Environment=VOLUTE_ISOLATION=user",
|
|
64
65
|
"Restart=on-failure",
|
|
65
66
|
"RestartSec=5",
|
|
66
67
|
"ProtectSystem=true",
|
|
67
|
-
`ReadWritePaths=${DATA_DIR} ${
|
|
68
|
+
`ReadWritePaths=${DATA_DIR} ${MINDS_DIR}`,
|
|
68
69
|
"PrivateTmp=yes"
|
|
69
70
|
];
|
|
70
71
|
if (!binUnderHome) {
|
|
@@ -90,17 +91,17 @@ function install(port, host) {
|
|
|
90
91
|
const voluteBin = resolveVoluteBin();
|
|
91
92
|
mkdirSync(DATA_DIR, { recursive: true });
|
|
92
93
|
console.log(`Created ${DATA_DIR}`);
|
|
93
|
-
mkdirSync(
|
|
94
|
-
console.log(`Created ${
|
|
94
|
+
mkdirSync(MINDS_DIR, { recursive: true });
|
|
95
|
+
console.log(`Created ${MINDS_DIR}`);
|
|
95
96
|
ensureVoluteGroup({ force: true });
|
|
96
97
|
console.log("Ensured volute group exists");
|
|
97
98
|
execFileSync("chmod", ["755", DATA_DIR]);
|
|
98
|
-
execFileSync("chmod", ["755",
|
|
99
|
+
execFileSync("chmod", ["755", MINDS_DIR]);
|
|
99
100
|
console.log("Set permissions on directories");
|
|
100
101
|
writeFileSync(
|
|
101
102
|
PROFILE_PATH,
|
|
102
103
|
`export VOLUTE_HOME=${DATA_DIR}
|
|
103
|
-
export
|
|
104
|
+
export VOLUTE_MINDS_DIR=${MINDS_DIR}
|
|
104
105
|
`
|
|
105
106
|
);
|
|
106
107
|
console.log(`Wrote ${PROFILE_PATH}`);
|
|
@@ -109,7 +110,7 @@ export VOLUTE_AGENTS_DIR=${AGENTS_DIR}
|
|
|
109
110
|
const wrapper = `#!/bin/sh
|
|
110
111
|
export PATH="${binDir}:$PATH"
|
|
111
112
|
export VOLUTE_HOME="${DATA_DIR}"
|
|
112
|
-
export
|
|
113
|
+
export VOLUTE_MINDS_DIR="${MINDS_DIR}"
|
|
113
114
|
exec "${voluteBin}" "$@"
|
|
114
115
|
`;
|
|
115
116
|
writeFileSync(WRAPPER_PATH, wrapper, { mode: 493 });
|
|
@@ -192,9 +193,13 @@ function uninstall(force) {
|
|
|
192
193
|
rmSync(DATA_DIR, { recursive: true, force: true });
|
|
193
194
|
console.log(`Deleted ${DATA_DIR}`);
|
|
194
195
|
}
|
|
195
|
-
if (existsSync(
|
|
196
|
-
rmSync(
|
|
197
|
-
console.log(`Deleted ${
|
|
196
|
+
if (existsSync(MINDS_DIR)) {
|
|
197
|
+
rmSync(MINDS_DIR, { recursive: true, force: true });
|
|
198
|
+
console.log(`Deleted ${MINDS_DIR}`);
|
|
199
|
+
}
|
|
200
|
+
if (existsSync(LEGACY_AGENTS_DIR)) {
|
|
201
|
+
rmSync(LEGACY_AGENTS_DIR, { recursive: true, force: true });
|
|
202
|
+
console.log(`Deleted ${LEGACY_AGENTS_DIR} (legacy)`);
|
|
198
203
|
}
|
|
199
204
|
try {
|
|
200
205
|
execFileSync("groupdel", ["volute"], { stdio: "ignore" });
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
import {
|
|
3
3
|
composeTemplate,
|
|
4
4
|
findTemplatesRoot
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-PO5Q2AYN.js";
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
} from "./chunk-LGSW7T7K.js";
|
|
7
|
+
findMind,
|
|
8
|
+
mindDir
|
|
9
|
+
} from "./chunk-M77QBTEH.js";
|
|
11
10
|
import "./chunk-K3NQKI34.js";
|
|
12
11
|
|
|
13
12
|
// src/commands/sprout.ts
|
|
@@ -15,21 +14,21 @@ import { cpSync, existsSync, readFileSync, rmSync } from "fs";
|
|
|
15
14
|
import { resolve } from "path";
|
|
16
15
|
var ORIENTATION_MARKER = "You don't have a soul yet";
|
|
17
16
|
async function run(_args) {
|
|
18
|
-
const
|
|
19
|
-
if (!
|
|
20
|
-
console.error("volute sprout must be run by
|
|
17
|
+
const mindName = process.env.VOLUTE_MIND;
|
|
18
|
+
if (!mindName) {
|
|
19
|
+
console.error("volute sprout must be run by a mind (VOLUTE_MIND not set)");
|
|
21
20
|
process.exit(1);
|
|
22
21
|
}
|
|
23
|
-
const entry =
|
|
22
|
+
const entry = findMind(mindName);
|
|
24
23
|
if (!entry) {
|
|
25
|
-
console.error(`Unknown
|
|
24
|
+
console.error(`Unknown mind: ${mindName}`);
|
|
26
25
|
process.exit(1);
|
|
27
26
|
}
|
|
28
27
|
if (entry.stage !== "seed") {
|
|
29
|
-
console.error(`${
|
|
28
|
+
console.error(`${mindName} is not a seed \u2014 already at stage "${entry.stage}"`);
|
|
30
29
|
process.exit(1);
|
|
31
30
|
}
|
|
32
|
-
const dir =
|
|
31
|
+
const dir = mindDir(mindName);
|
|
33
32
|
const soulPath = resolve(dir, "home/SOUL.md");
|
|
34
33
|
const memoryPath = resolve(dir, "home/MEMORY.md");
|
|
35
34
|
if (!existsSync(soulPath)) {
|
|
@@ -48,11 +47,11 @@ async function run(_args) {
|
|
|
48
47
|
process.exit(1);
|
|
49
48
|
}
|
|
50
49
|
const templatesRoot = findTemplatesRoot();
|
|
51
|
-
const { composedDir, manifest } = composeTemplate(templatesRoot, "
|
|
50
|
+
const { composedDir, manifest } = composeTemplate(templatesRoot, "claude");
|
|
52
51
|
try {
|
|
53
52
|
const skillsDir = resolve(dir, manifest.skillsDir);
|
|
54
53
|
const composedSkillsDir = resolve(composedDir, manifest.skillsDir);
|
|
55
|
-
for (const skill of ["volute-
|
|
54
|
+
for (const skill of ["volute-mind", "memory", "sessions"]) {
|
|
56
55
|
const src = resolve(composedSkillsDir, skill);
|
|
57
56
|
if (existsSync(src)) {
|
|
58
57
|
cpSync(src, resolve(skillsDir, skill), { recursive: true });
|
|
@@ -65,12 +64,20 @@ async function run(_args) {
|
|
|
65
64
|
} finally {
|
|
66
65
|
rmSync(composedDir, { recursive: true, force: true });
|
|
67
66
|
}
|
|
68
|
-
|
|
69
|
-
const { daemonFetch } = await import("./daemon-client-DEF7IFEJ.js");
|
|
67
|
+
const { daemonFetch } = await import("./daemon-client-ODKDUYDE.js");
|
|
70
68
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
71
69
|
const client = getClient();
|
|
70
|
+
const sproutRes = await daemonFetch(
|
|
71
|
+
urlOf(client.api.minds[":name"].sprout.$url({ param: { name: mindName } })),
|
|
72
|
+
{ method: "POST" }
|
|
73
|
+
);
|
|
74
|
+
if (!sproutRes.ok) {
|
|
75
|
+
const data = await sproutRes.json();
|
|
76
|
+
console.error(data.error ?? "Failed to update stage");
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
72
79
|
const res = await daemonFetch(
|
|
73
|
-
urlOf(client.api.
|
|
80
|
+
urlOf(client.api.minds[":name"].restart.$url({ param: { name: mindName } })),
|
|
74
81
|
{
|
|
75
82
|
method: "POST",
|
|
76
83
|
headers: { "Content-Type": "application/json" },
|
|
@@ -82,7 +89,7 @@ async function run(_args) {
|
|
|
82
89
|
console.error(data.error ?? "Failed to restart after sprouting");
|
|
83
90
|
process.exit(1);
|
|
84
91
|
}
|
|
85
|
-
console.log("Sprouted! You now have full
|
|
92
|
+
console.log("Sprouted! You now have full mind capabilities.");
|
|
86
93
|
}
|
|
87
94
|
export {
|
|
88
95
|
run
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
daemonFetch
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-OJQ47SCA.js";
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
} from "./chunk-
|
|
6
|
+
resolveMind
|
|
7
|
+
} from "./chunk-M77QBTEH.js";
|
|
8
8
|
import {
|
|
9
9
|
getClient,
|
|
10
10
|
urlOf
|
|
@@ -15,17 +15,17 @@ import "./chunk-K3NQKI34.js";
|
|
|
15
15
|
async function run(args) {
|
|
16
16
|
const name = args[0];
|
|
17
17
|
if (!name) {
|
|
18
|
-
console.error("Usage: volute
|
|
18
|
+
console.error("Usage: volute mind start <name>");
|
|
19
19
|
process.exit(1);
|
|
20
20
|
}
|
|
21
|
-
const { entry } =
|
|
21
|
+
const { entry } = resolveMind(name);
|
|
22
22
|
const client = getClient();
|
|
23
|
-
const res = await daemonFetch(urlOf(client.api.
|
|
23
|
+
const res = await daemonFetch(urlOf(client.api.minds[":name"].start.$url({ param: { name } })), {
|
|
24
24
|
method: "POST"
|
|
25
25
|
});
|
|
26
26
|
const data = await res.json();
|
|
27
27
|
if (!res.ok) {
|
|
28
|
-
console.error(data.error || "Failed to start
|
|
28
|
+
console.error(data.error || "Failed to start mind");
|
|
29
29
|
process.exit(1);
|
|
30
30
|
}
|
|
31
31
|
console.log(`${name} started on port ${entry.port}`);
|
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
getServiceMode,
|
|
5
5
|
modeLabel,
|
|
6
6
|
readDaemonConfig
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-6BDNWYKG.js";
|
|
8
|
+
import "./chunk-2Y77MCFG.js";
|
|
9
|
+
import "./chunk-ZCEYUUID.js";
|
|
10
10
|
import {
|
|
11
11
|
checkForUpdate
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-MVSXRMJJ.js";
|
|
13
|
+
import "./chunk-M77QBTEH.js";
|
|
14
14
|
import "./chunk-K3NQKI34.js";
|
|
15
15
|
|
|
16
16
|
// src/commands/status.ts
|
|
@@ -46,19 +46,19 @@ async function run(_args) {
|
|
|
46
46
|
if (token) headers.Authorization = `Bearer ${token}`;
|
|
47
47
|
headers.Origin = baseUrl;
|
|
48
48
|
try {
|
|
49
|
-
const res = await fetch(`${baseUrl}/api/
|
|
49
|
+
const res = await fetch(`${baseUrl}/api/minds`, { headers });
|
|
50
50
|
if (res.ok) {
|
|
51
|
-
const
|
|
52
|
-
if (
|
|
51
|
+
const minds = await res.json();
|
|
52
|
+
if (minds.length > 0) {
|
|
53
53
|
console.log(`
|
|
54
|
-
|
|
55
|
-
for (const
|
|
56
|
-
const status =
|
|
57
|
-
const label =
|
|
58
|
-
console.log(` ${
|
|
54
|
+
Minds (${minds.length}):`);
|
|
55
|
+
for (const mind of minds) {
|
|
56
|
+
const status = mind.running ? "running" : "stopped";
|
|
57
|
+
const label = mind.stage === "seed" ? " (seed)" : "";
|
|
58
|
+
console.log(` ${mind.name}: ${status}${label}`);
|
|
59
59
|
}
|
|
60
60
|
} else {
|
|
61
|
-
console.log("\nNo
|
|
61
|
+
console.log("\nNo minds configured.");
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
64
|
} catch {
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
resolveMindName
|
|
4
|
+
} from "./chunk-NAOW2CLO.js";
|
|
5
5
|
import {
|
|
6
6
|
daemonFetch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-OJQ47SCA.js";
|
|
8
8
|
import {
|
|
9
|
-
|
|
10
|
-
} from "./chunk-
|
|
9
|
+
resolveMind
|
|
10
|
+
} from "./chunk-M77QBTEH.js";
|
|
11
11
|
import {
|
|
12
12
|
getClient,
|
|
13
13
|
urlOf
|
|
@@ -16,15 +16,15 @@ import "./chunk-K3NQKI34.js";
|
|
|
16
16
|
|
|
17
17
|
// src/commands/stop.ts
|
|
18
18
|
async function run(args) {
|
|
19
|
-
const name =
|
|
20
|
-
|
|
19
|
+
const name = resolveMindName({ mind: args[0] });
|
|
20
|
+
resolveMind(name);
|
|
21
21
|
const client = getClient();
|
|
22
|
-
const res = await daemonFetch(urlOf(client.api.
|
|
22
|
+
const res = await daemonFetch(urlOf(client.api.minds[":name"].stop.$url({ param: { name } })), {
|
|
23
23
|
method: "POST"
|
|
24
24
|
});
|
|
25
25
|
const data = await res.json();
|
|
26
26
|
if (!res.ok) {
|
|
27
|
-
console.error(data.error || "Failed to stop
|
|
27
|
+
console.error(data.error || "Failed to stop mind");
|
|
28
28
|
process.exit(1);
|
|
29
29
|
}
|
|
30
30
|
console.log(`${name} stopped.`);
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
readGlobalConfig,
|
|
4
4
|
run
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-BEFIBW5B.js";
|
|
6
|
+
import "./chunk-6BDNWYKG.js";
|
|
7
|
+
import "./chunk-2Y77MCFG.js";
|
|
8
|
+
import "./chunk-ZCEYUUID.js";
|
|
9
9
|
import "./chunk-D424ZQGI.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-M77QBTEH.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-
|
|
8
|
+
} from "./chunk-6BDNWYKG.js";
|
|
9
9
|
import {
|
|
10
10
|
exec,
|
|
11
11
|
execInherit,
|
|
12
12
|
resolveVoluteBin
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-2Y77MCFG.js";
|
|
14
|
+
import "./chunk-ZCEYUUID.js";
|
|
15
15
|
import {
|
|
16
16
|
checkForUpdate
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-MVSXRMJJ.js";
|
|
18
18
|
import {
|
|
19
19
|
voluteHome
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-M77QBTEH.js";
|
|
21
21
|
import "./chunk-K3NQKI34.js";
|
|
22
22
|
|
|
23
23
|
// src/commands/update.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
resolveMindName
|
|
4
|
+
} from "./chunk-NAOW2CLO.js";
|
|
5
5
|
import {
|
|
6
6
|
parseArgs
|
|
7
7
|
} from "./chunk-D424ZQGI.js";
|
|
@@ -13,12 +13,12 @@ async function run(args) {
|
|
|
13
13
|
template: { type: "string" },
|
|
14
14
|
continue: { type: "boolean" }
|
|
15
15
|
});
|
|
16
|
-
const
|
|
17
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
16
|
+
const mindName = resolveMindName({ mind: positional[0] });
|
|
17
|
+
const { daemonFetch } = await import("./daemon-client-ODKDUYDE.js");
|
|
18
18
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
19
19
|
const client = getClient();
|
|
20
20
|
const res = await daemonFetch(
|
|
21
|
-
urlOf(client.api.
|
|
21
|
+
urlOf(client.api.minds[":name"].upgrade.$url({ param: { name: mindName } })),
|
|
22
22
|
{
|
|
23
23
|
method: "POST",
|
|
24
24
|
headers: { "Content-Type": "application/json" },
|
|
@@ -30,7 +30,7 @@ async function run(args) {
|
|
|
30
30
|
);
|
|
31
31
|
const data = await res.json();
|
|
32
32
|
if (!res.ok && !data.conflicts) {
|
|
33
|
-
console.error(data.error ?? "Failed to upgrade
|
|
33
|
+
console.error(data.error ?? "Failed to upgrade mind");
|
|
34
34
|
process.exit(1);
|
|
35
35
|
}
|
|
36
36
|
if (data.conflicts) {
|
|
@@ -38,16 +38,14 @@ async function run(args) {
|
|
|
38
38
|
console.log(` ${data.worktreeDir}`);
|
|
39
39
|
console.log(`
|
|
40
40
|
Then run:`);
|
|
41
|
-
console.log(` volute
|
|
41
|
+
console.log(` volute mind upgrade ${mindName} --continue`);
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
44
|
console.log(`
|
|
45
45
|
Upgrade variant running on port ${data.port}`);
|
|
46
46
|
console.log(`
|
|
47
47
|
Next steps:`);
|
|
48
|
-
console.log(
|
|
49
|
-
` volute send @${agentName}@${data.variant} "hello" # chat with upgraded variant`
|
|
50
|
-
);
|
|
48
|
+
console.log(` volute send @${mindName}@${data.variant} "hello" # chat with upgraded variant`);
|
|
51
49
|
console.log(` volute variant merge ${data.variant} # merge back when satisfied`);
|
|
52
50
|
}
|
|
53
51
|
export {
|