volute 0.9.0 → 0.10.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/dist/{agent-MB3OTRRK.js → agent-ECRX44DB.js} +5 -5
- package/dist/{agent-manager-CMMH5KQQ.js → agent-manager-MRHHKAB6.js} +2 -2
- package/dist/{chunk-YNNK4QN2.js → chunk-FYQGANL6.js} +40 -2
- package/dist/chunk-R3VB7NF5.js +205 -0
- package/dist/cli.js +14 -14
- package/dist/create-VBZZNJOG.js +38 -0
- package/dist/daemon-restart-QCLR6ZZV.js +61 -0
- package/dist/daemon.js +1492 -170
- package/dist/delete-BOTVU4YO.js +35 -0
- package/dist/{down-4DGRZRJU.js → down-4LIQG3CE.js} +3 -1
- package/dist/import-2BZUWT23.js +21 -0
- package/dist/{package-WPX6LCYE.js → package-ERGXEDAF.js} +1 -1
- package/dist/{up-J7AHQHIM.js → up-MNNPCMFF.js} +1 -1
- package/dist/upgrade-RSE4CZNE.js +55 -0
- package/dist/variant-7IZF6OWO.js +215 -0
- package/package.json +1 -1
- package/dist/chunk-ECPQXRLB.js +0 -264
- package/dist/chunk-NETNFBA5.js +0 -28
- package/dist/chunk-XUA3JUFK.js +0 -121
- package/dist/create-HGJHLABX.js +0 -96
- package/dist/daemon-restart-EKDXXHKH.js +0 -28
- package/dist/delete-WKQKE3FT.js +0 -70
- package/dist/import-CNEDF3TD.js +0 -532
- package/dist/upgrade-BRNMSQBX.js +0 -233
- package/dist/variant-AQRAN6FR.js +0 -493
- package/dist/{channel-G5D4VBXY.js → channel-2WHBRDTD.js} +3 -3
- package/dist/{chunk-AWHQZDB4.js → chunk-4NAGJV3I.js} +0 -0
- package/dist/{chunk-W6TMWYU3.js → chunk-WV4W7BAT.js} +3 -3
- package/dist/{connector-PK7D5GTN.js → connector-L2HBLZBW.js} +3 -3
- package/dist/{env-HZMZSWWD.js → env-CGORIKVF.js} +3 -3
- package/dist/{history-SH25BAA5.js → history-NI5QP27M.js} +3 -3
- package/dist/{logs-V54B6QSG.js → logs-APWVWGNX.js} +3 -3
- package/dist/{schedule-XGBUF7NU.js → schedule-E4MFGYSA.js} +3 -3
- package/dist/{send-TFZ62XPZ.js → send-X6OQGSD6.js} +4 -4
- package/dist/{service-56CY4S6Z.js → service-OW35VZ5G.js} +3 -3
- package/dist/{setup-7SPMWF2O.js → setup-ABMZK6LS.js} +3 -3
package/dist/variant-AQRAN6FR.js
DELETED
|
@@ -1,493 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
resolveAgentName
|
|
4
|
-
} from "./chunk-AZEL2IEK.js";
|
|
5
|
-
import {
|
|
6
|
-
daemonFetch
|
|
7
|
-
} from "./chunk-STOEJOJO.js";
|
|
8
|
-
import {
|
|
9
|
-
parseArgs
|
|
10
|
-
} from "./chunk-D424ZQGI.js";
|
|
11
|
-
import {
|
|
12
|
-
exec,
|
|
13
|
-
execInherit
|
|
14
|
-
} from "./chunk-5C5JWR2L.js";
|
|
15
|
-
import {
|
|
16
|
-
addVariant,
|
|
17
|
-
checkHealth,
|
|
18
|
-
findVariant,
|
|
19
|
-
nextPort,
|
|
20
|
-
readVariants,
|
|
21
|
-
removeVariant,
|
|
22
|
-
resolveAgent,
|
|
23
|
-
validateBranchName,
|
|
24
|
-
writeVariants
|
|
25
|
-
} from "./chunk-DP2DX4WV.js";
|
|
26
|
-
import {
|
|
27
|
-
getClient,
|
|
28
|
-
urlOf
|
|
29
|
-
} from "./chunk-4RQBJWQX.js";
|
|
30
|
-
import "./chunk-K3NQKI34.js";
|
|
31
|
-
|
|
32
|
-
// src/commands/variant.ts
|
|
33
|
-
import { existsSync, mkdirSync as mkdirSync2, writeFileSync } from "fs";
|
|
34
|
-
import { resolve as resolve2 } from "path";
|
|
35
|
-
|
|
36
|
-
// src/lib/spawn-server.ts
|
|
37
|
-
import { spawn } from "child_process";
|
|
38
|
-
import { closeSync, mkdirSync, openSync, readFileSync } from "fs";
|
|
39
|
-
import { resolve } from "path";
|
|
40
|
-
function tsxBin(cwd) {
|
|
41
|
-
return resolve(cwd, "node_modules", ".bin", "tsx");
|
|
42
|
-
}
|
|
43
|
-
function spawnServer(cwd, port, options) {
|
|
44
|
-
if (options?.detached) {
|
|
45
|
-
return spawnDetached(cwd, port, options.logDir);
|
|
46
|
-
}
|
|
47
|
-
return spawnAttached(cwd, port);
|
|
48
|
-
}
|
|
49
|
-
function spawnAttached(cwd, port) {
|
|
50
|
-
const child = spawn(tsxBin(cwd), ["src/server.ts", "--port", String(port)], {
|
|
51
|
-
cwd,
|
|
52
|
-
stdio: ["ignore", "pipe", "pipe"]
|
|
53
|
-
});
|
|
54
|
-
return new Promise((resolve3) => {
|
|
55
|
-
const timeout = setTimeout(() => resolve3(null), 3e4);
|
|
56
|
-
function checkOutput(data) {
|
|
57
|
-
const match = data.toString().match(/listening on :(\d+)/);
|
|
58
|
-
if (match) {
|
|
59
|
-
clearTimeout(timeout);
|
|
60
|
-
resolve3({ child, actualPort: parseInt(match[1], 10) });
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
child.stdout?.on("data", checkOutput);
|
|
64
|
-
child.stderr?.on("data", checkOutput);
|
|
65
|
-
child.on("error", () => {
|
|
66
|
-
clearTimeout(timeout);
|
|
67
|
-
resolve3(null);
|
|
68
|
-
});
|
|
69
|
-
child.on("exit", () => {
|
|
70
|
-
clearTimeout(timeout);
|
|
71
|
-
resolve3(null);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
function spawnDetached(cwd, port, logDir) {
|
|
76
|
-
const logsDir = logDir ?? resolve(cwd, ".volute", "logs");
|
|
77
|
-
mkdirSync(logsDir, { recursive: true });
|
|
78
|
-
const logPath = resolve(logsDir, "agent.log");
|
|
79
|
-
const logFd = openSync(logPath, "a");
|
|
80
|
-
const child = spawn(tsxBin(cwd), ["src/server.ts", "--port", String(port)], {
|
|
81
|
-
cwd,
|
|
82
|
-
stdio: ["ignore", logFd, logFd],
|
|
83
|
-
detached: true
|
|
84
|
-
});
|
|
85
|
-
child.unref();
|
|
86
|
-
closeSync(logFd);
|
|
87
|
-
return new Promise((res) => {
|
|
88
|
-
let done = false;
|
|
89
|
-
function finish(result) {
|
|
90
|
-
if (done) return;
|
|
91
|
-
done = true;
|
|
92
|
-
clearInterval(interval);
|
|
93
|
-
clearTimeout(timeout);
|
|
94
|
-
res(result);
|
|
95
|
-
}
|
|
96
|
-
const interval = setInterval(() => {
|
|
97
|
-
try {
|
|
98
|
-
const content = readFileSync(logPath, "utf-8");
|
|
99
|
-
const match = content.match(/listening on :(\d+)/);
|
|
100
|
-
if (match) {
|
|
101
|
-
finish({ child, actualPort: parseInt(match[1], 10) });
|
|
102
|
-
}
|
|
103
|
-
} catch {
|
|
104
|
-
}
|
|
105
|
-
}, 100);
|
|
106
|
-
const timeout = setTimeout(() => finish(null), 3e4);
|
|
107
|
-
child.on("error", () => finish(null));
|
|
108
|
-
child.on("exit", () => finish(null));
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// src/lib/verify.ts
|
|
113
|
-
async function verify(port) {
|
|
114
|
-
const health = await checkHealth(port);
|
|
115
|
-
if (!health.ok) {
|
|
116
|
-
console.error(" Health check: failed");
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
console.log(" Health check: OK");
|
|
120
|
-
try {
|
|
121
|
-
const res = await fetch(`http://127.0.0.1:${port}/message`, {
|
|
122
|
-
method: "POST",
|
|
123
|
-
headers: { "Content-Type": "application/json" },
|
|
124
|
-
body: JSON.stringify({
|
|
125
|
-
content: [{ type: "text", text: "ping" }],
|
|
126
|
-
channel: "system"
|
|
127
|
-
}),
|
|
128
|
-
signal: AbortSignal.timeout(6e4)
|
|
129
|
-
});
|
|
130
|
-
if (!res.ok) {
|
|
131
|
-
console.error(" Test message: failed to send");
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
const result = await res.json();
|
|
135
|
-
if (result.ok) {
|
|
136
|
-
console.log(" Test message: OK");
|
|
137
|
-
return true;
|
|
138
|
-
} else {
|
|
139
|
-
console.error(" Test message: unexpected response");
|
|
140
|
-
return false;
|
|
141
|
-
}
|
|
142
|
-
} catch (e) {
|
|
143
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
144
|
-
console.error(` Test message: ${msg}`);
|
|
145
|
-
return false;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// src/commands/variant.ts
|
|
150
|
-
async function run(args) {
|
|
151
|
-
const subcommand = args[0];
|
|
152
|
-
switch (subcommand) {
|
|
153
|
-
case "create":
|
|
154
|
-
await createVariant(args.slice(1));
|
|
155
|
-
break;
|
|
156
|
-
case "list":
|
|
157
|
-
await listVariants(args.slice(1));
|
|
158
|
-
break;
|
|
159
|
-
case "merge":
|
|
160
|
-
await mergeVariant(args.slice(1));
|
|
161
|
-
break;
|
|
162
|
-
case "delete":
|
|
163
|
-
await deleteVariant(args.slice(1));
|
|
164
|
-
break;
|
|
165
|
-
case "--help":
|
|
166
|
-
case "-h":
|
|
167
|
-
case void 0:
|
|
168
|
-
printUsage();
|
|
169
|
-
break;
|
|
170
|
-
default:
|
|
171
|
-
printUsage();
|
|
172
|
-
process.exit(1);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
function printUsage() {
|
|
176
|
-
console.log(`Usage:
|
|
177
|
-
volute variant create <variant> [--agent <name>] [--soul "..."] [--port N] [--no-start] [--json]
|
|
178
|
-
volute variant list [--agent <name>] [--json]
|
|
179
|
-
volute variant merge <variant> [--agent <name>] [--summary "..." --memory "..."] [--skip-verify]
|
|
180
|
-
volute variant delete <variant> [--agent <name>]`);
|
|
181
|
-
}
|
|
182
|
-
async function createVariant(args) {
|
|
183
|
-
const { positional, flags } = parseArgs(args, {
|
|
184
|
-
agent: { type: "string" },
|
|
185
|
-
soul: { type: "string" },
|
|
186
|
-
port: { type: "number" },
|
|
187
|
-
"no-start": { type: "boolean" },
|
|
188
|
-
json: { type: "boolean" }
|
|
189
|
-
});
|
|
190
|
-
const agentName = resolveAgentName(flags);
|
|
191
|
-
const variantName = positional[0];
|
|
192
|
-
const { soul, port, json } = flags;
|
|
193
|
-
const noStart = flags["no-start"];
|
|
194
|
-
if (!variantName) {
|
|
195
|
-
console.error(
|
|
196
|
-
'Usage: volute variant create <variant> [--agent <name>] [--soul "..."] [--port N] [--no-start] [--json]'
|
|
197
|
-
);
|
|
198
|
-
process.exit(1);
|
|
199
|
-
}
|
|
200
|
-
const err = validateBranchName(variantName);
|
|
201
|
-
if (err) {
|
|
202
|
-
console.error(err);
|
|
203
|
-
process.exit(1);
|
|
204
|
-
}
|
|
205
|
-
const { dir: projectRoot } = resolveAgent(agentName);
|
|
206
|
-
const variantDir = resolve2(projectRoot, ".variants", variantName);
|
|
207
|
-
if (existsSync(variantDir)) {
|
|
208
|
-
console.error(`Variant directory already exists: ${variantDir}`);
|
|
209
|
-
process.exit(1);
|
|
210
|
-
}
|
|
211
|
-
mkdirSync2(resolve2(projectRoot, ".variants"), { recursive: true });
|
|
212
|
-
try {
|
|
213
|
-
await exec("git", ["worktree", "add", "-b", variantName, variantDir], { cwd: projectRoot });
|
|
214
|
-
} catch (e) {
|
|
215
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
216
|
-
console.error(`Failed to create worktree: ${msg}`);
|
|
217
|
-
process.exit(1);
|
|
218
|
-
}
|
|
219
|
-
if (!json) console.log("Installing dependencies...");
|
|
220
|
-
try {
|
|
221
|
-
if (json) {
|
|
222
|
-
await exec("npm", ["install"], { cwd: variantDir });
|
|
223
|
-
} else {
|
|
224
|
-
await execInherit("npm", ["install"], { cwd: variantDir });
|
|
225
|
-
}
|
|
226
|
-
} catch (e) {
|
|
227
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
228
|
-
console.error(`npm install failed: ${msg}`);
|
|
229
|
-
process.exit(1);
|
|
230
|
-
}
|
|
231
|
-
if (soul) {
|
|
232
|
-
writeFileSync(resolve2(variantDir, "home/SOUL.md"), soul);
|
|
233
|
-
}
|
|
234
|
-
const variantPort = port ?? nextPort();
|
|
235
|
-
const variant = {
|
|
236
|
-
name: variantName,
|
|
237
|
-
branch: variantName,
|
|
238
|
-
path: variantDir,
|
|
239
|
-
port: variantPort,
|
|
240
|
-
created: (/* @__PURE__ */ new Date()).toISOString()
|
|
241
|
-
};
|
|
242
|
-
addVariant(agentName, variant);
|
|
243
|
-
if (!noStart) {
|
|
244
|
-
if (!json) console.log("Starting variant via daemon...");
|
|
245
|
-
try {
|
|
246
|
-
const client = getClient();
|
|
247
|
-
const res = await daemonFetch(
|
|
248
|
-
urlOf(
|
|
249
|
-
client.api.agents[":name"].start.$url({
|
|
250
|
-
param: { name: `${agentName}@${variantName}` }
|
|
251
|
-
})
|
|
252
|
-
),
|
|
253
|
-
{ method: "POST" }
|
|
254
|
-
);
|
|
255
|
-
if (!res.ok) {
|
|
256
|
-
const data = await res.json();
|
|
257
|
-
console.error(data.error ?? "Failed to start variant");
|
|
258
|
-
process.exit(1);
|
|
259
|
-
}
|
|
260
|
-
} catch {
|
|
261
|
-
console.error("Failed to start variant. Is the daemon running? (volute up)");
|
|
262
|
-
console.error(
|
|
263
|
-
`The variant was created but not started. Use: volute agent start ${agentName}@${variantName}`
|
|
264
|
-
);
|
|
265
|
-
process.exit(1);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
if (json) {
|
|
269
|
-
console.log(JSON.stringify(variant, null, 2));
|
|
270
|
-
} else {
|
|
271
|
-
console.log(`
|
|
272
|
-
Variant created: ${variantName}`);
|
|
273
|
-
console.log(` Branch: ${variant.branch}`);
|
|
274
|
-
console.log(` Path: ${variant.path}`);
|
|
275
|
-
console.log(` Port: ${variantPort}`);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
async function listVariants(args) {
|
|
279
|
-
const { flags } = parseArgs(args, {
|
|
280
|
-
agent: { type: "string" },
|
|
281
|
-
json: { type: "boolean" }
|
|
282
|
-
});
|
|
283
|
-
const agentName = resolveAgentName(flags);
|
|
284
|
-
const { json } = flags;
|
|
285
|
-
resolveAgent(agentName);
|
|
286
|
-
const variants = readVariants(agentName);
|
|
287
|
-
if (variants.length === 0) {
|
|
288
|
-
if (json) {
|
|
289
|
-
console.log("[]");
|
|
290
|
-
} else {
|
|
291
|
-
console.log("No variants.");
|
|
292
|
-
}
|
|
293
|
-
return;
|
|
294
|
-
}
|
|
295
|
-
const results = await Promise.all(
|
|
296
|
-
variants.map(async (v) => {
|
|
297
|
-
if (!v.port) return { ...v, status: "no-server" };
|
|
298
|
-
const health = await checkHealth(v.port);
|
|
299
|
-
return { ...v, status: health.ok ? "running" : "dead" };
|
|
300
|
-
})
|
|
301
|
-
);
|
|
302
|
-
const updated = results.map(({ status, ...v }) => ({
|
|
303
|
-
...v,
|
|
304
|
-
running: status === "running"
|
|
305
|
-
}));
|
|
306
|
-
writeVariants(agentName, updated);
|
|
307
|
-
if (json) {
|
|
308
|
-
console.log(JSON.stringify(results, null, 2));
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
const nameW = Math.max(4, ...results.map((r) => r.name.length));
|
|
312
|
-
const portW = Math.max(4, ...results.map((r) => String(r.port || "-").length));
|
|
313
|
-
console.log(`${"NAME".padEnd(nameW)} ${"PORT".padEnd(portW)} ${"STATUS".padEnd(10)} BRANCH`);
|
|
314
|
-
for (const r of results) {
|
|
315
|
-
console.log(
|
|
316
|
-
`${r.name.padEnd(nameW)} ${String(r.port || "-").padEnd(portW)} ${r.status.padEnd(10)} ${r.branch}`
|
|
317
|
-
);
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
async function mergeVariant(args) {
|
|
321
|
-
const { positional, flags } = parseArgs(args, {
|
|
322
|
-
agent: { type: "string" },
|
|
323
|
-
summary: { type: "string" },
|
|
324
|
-
justification: { type: "string" },
|
|
325
|
-
memory: { type: "string" },
|
|
326
|
-
"skip-verify": { type: "boolean" }
|
|
327
|
-
});
|
|
328
|
-
const agentName = resolveAgentName(flags);
|
|
329
|
-
const variantName = positional[0];
|
|
330
|
-
if (!variantName) {
|
|
331
|
-
console.error(
|
|
332
|
-
"Usage: volute variant merge <variant> [--agent <name>] [--summary '...'] [--justification '...'] [--memory '...'] [--skip-verify]"
|
|
333
|
-
);
|
|
334
|
-
process.exit(1);
|
|
335
|
-
}
|
|
336
|
-
const { dir: projectRoot } = resolveAgent(agentName);
|
|
337
|
-
const variant = findVariant(agentName, variantName);
|
|
338
|
-
if (!variant) {
|
|
339
|
-
console.error(`Unknown variant: ${variantName}`);
|
|
340
|
-
process.exit(1);
|
|
341
|
-
}
|
|
342
|
-
const branchErr = validateBranchName(variant.branch);
|
|
343
|
-
if (branchErr) {
|
|
344
|
-
console.error(branchErr);
|
|
345
|
-
process.exit(1);
|
|
346
|
-
}
|
|
347
|
-
if (existsSync(variant.path)) {
|
|
348
|
-
const status = (await exec("git", ["status", "--porcelain"], { cwd: variant.path })).trim();
|
|
349
|
-
if (status) {
|
|
350
|
-
console.log("Committing uncommitted changes in variant...");
|
|
351
|
-
try {
|
|
352
|
-
await exec("git", ["add", "-A"], { cwd: variant.path });
|
|
353
|
-
await exec("git", ["commit", "-m", "Auto-commit uncommitted changes before merge"], {
|
|
354
|
-
cwd: variant.path
|
|
355
|
-
});
|
|
356
|
-
} catch (err) {
|
|
357
|
-
console.error("Failed to auto-commit variant changes:", err);
|
|
358
|
-
console.error("Please commit or stash changes in the variant manually before merging.");
|
|
359
|
-
process.exit(1);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
if (!flags["skip-verify"]) {
|
|
364
|
-
console.log("Verifying variant...");
|
|
365
|
-
console.log("Starting temporary server for verification...");
|
|
366
|
-
const result = await spawnServer(variant.path, 0, { detached: true });
|
|
367
|
-
if (!result) {
|
|
368
|
-
console.error("Failed to start server for verification. Use --skip-verify to skip.");
|
|
369
|
-
process.exit(1);
|
|
370
|
-
}
|
|
371
|
-
const verified = await verify(result.actualPort);
|
|
372
|
-
try {
|
|
373
|
-
process.kill(result.child.pid);
|
|
374
|
-
} catch {
|
|
375
|
-
}
|
|
376
|
-
if (!verified) {
|
|
377
|
-
console.error("Verification failed. Fix issues or use --skip-verify to proceed anyway.");
|
|
378
|
-
process.exit(1);
|
|
379
|
-
}
|
|
380
|
-
console.log("Verification passed.");
|
|
381
|
-
}
|
|
382
|
-
const mainStatus = (await exec("git", ["status", "--porcelain"], { cwd: projectRoot })).trim();
|
|
383
|
-
if (mainStatus) {
|
|
384
|
-
console.log("Committing uncommitted changes in main...");
|
|
385
|
-
try {
|
|
386
|
-
await exec("git", ["add", "-A"], { cwd: projectRoot });
|
|
387
|
-
await exec("git", ["commit", "-m", "Auto-commit uncommitted changes before merge"], {
|
|
388
|
-
cwd: projectRoot
|
|
389
|
-
});
|
|
390
|
-
} catch (err) {
|
|
391
|
-
console.error("Failed to auto-commit main changes:", err);
|
|
392
|
-
console.error("Please commit or stash your changes manually before merging.");
|
|
393
|
-
process.exit(1);
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
console.log(`Merging branch: ${variant.branch}`);
|
|
397
|
-
try {
|
|
398
|
-
await execInherit("git", ["merge", variant.branch], { cwd: projectRoot });
|
|
399
|
-
} catch (e) {
|
|
400
|
-
console.error("Merge failed:", e);
|
|
401
|
-
process.exit(1);
|
|
402
|
-
}
|
|
403
|
-
if (existsSync(variant.path)) {
|
|
404
|
-
try {
|
|
405
|
-
await exec("git", ["worktree", "remove", "--force", variant.path], { cwd: projectRoot });
|
|
406
|
-
} catch {
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
try {
|
|
410
|
-
await exec("git", ["branch", "-D", variant.branch], { cwd: projectRoot });
|
|
411
|
-
} catch {
|
|
412
|
-
}
|
|
413
|
-
removeVariant(agentName, variantName);
|
|
414
|
-
console.log("Reinstalling dependencies...");
|
|
415
|
-
try {
|
|
416
|
-
await execInherit("npm", ["install"], { cwd: projectRoot });
|
|
417
|
-
} catch (e) {
|
|
418
|
-
console.error("npm install failed:", e);
|
|
419
|
-
}
|
|
420
|
-
console.log(`Variant ${variantName} merged and cleaned up.`);
|
|
421
|
-
if (process.env.VOLUTE_SUPERVISOR) return;
|
|
422
|
-
const context = {
|
|
423
|
-
type: "merged",
|
|
424
|
-
name: variantName,
|
|
425
|
-
...flags.summary && { summary: flags.summary },
|
|
426
|
-
...flags.justification && { justification: flags.justification },
|
|
427
|
-
...flags.memory && { memory: flags.memory }
|
|
428
|
-
};
|
|
429
|
-
try {
|
|
430
|
-
console.log("Restarting agent via daemon...");
|
|
431
|
-
const client = getClient();
|
|
432
|
-
const res = await daemonFetch(
|
|
433
|
-
urlOf(client.api.agents[":name"].restart.$url({ param: { name: agentName } })),
|
|
434
|
-
{
|
|
435
|
-
method: "POST",
|
|
436
|
-
headers: { "Content-Type": "application/json" },
|
|
437
|
-
body: JSON.stringify({ context })
|
|
438
|
-
}
|
|
439
|
-
);
|
|
440
|
-
if (res.ok) {
|
|
441
|
-
console.log(`${agentName} restarted.`);
|
|
442
|
-
} else {
|
|
443
|
-
const data = await res.json();
|
|
444
|
-
console.error(`Failed to restart: ${data.error ?? "unknown error"}`);
|
|
445
|
-
}
|
|
446
|
-
} catch {
|
|
447
|
-
console.log(`Daemon not running. Start the agent manually: volute agent start ${agentName}`);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
async function deleteVariant(args) {
|
|
451
|
-
const { positional, flags } = parseArgs(args, {
|
|
452
|
-
agent: { type: "string" }
|
|
453
|
-
});
|
|
454
|
-
const agentName = resolveAgentName(flags);
|
|
455
|
-
const variantName = positional[0];
|
|
456
|
-
if (!variantName) {
|
|
457
|
-
console.error("Usage: volute variant delete <variant> [--agent <name>]");
|
|
458
|
-
process.exit(1);
|
|
459
|
-
}
|
|
460
|
-
const { dir: projectRoot } = resolveAgent(agentName);
|
|
461
|
-
const variant = findVariant(agentName, variantName);
|
|
462
|
-
if (!variant) {
|
|
463
|
-
console.error(`Unknown variant: ${variantName}`);
|
|
464
|
-
process.exit(1);
|
|
465
|
-
}
|
|
466
|
-
try {
|
|
467
|
-
const client = getClient();
|
|
468
|
-
await daemonFetch(
|
|
469
|
-
urlOf(
|
|
470
|
-
client.api.agents[":name"].stop.$url({
|
|
471
|
-
param: { name: `${agentName}@${variantName}` }
|
|
472
|
-
})
|
|
473
|
-
),
|
|
474
|
-
{ method: "POST" }
|
|
475
|
-
);
|
|
476
|
-
} catch {
|
|
477
|
-
}
|
|
478
|
-
if (existsSync(variant.path)) {
|
|
479
|
-
try {
|
|
480
|
-
await exec("git", ["worktree", "remove", "--force", variant.path], { cwd: projectRoot });
|
|
481
|
-
} catch {
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
try {
|
|
485
|
-
await exec("git", ["branch", "-D", variant.branch], { cwd: projectRoot });
|
|
486
|
-
} catch {
|
|
487
|
-
}
|
|
488
|
-
removeVariant(agentName, variantName);
|
|
489
|
-
console.log(`Variant ${variantName} deleted.`);
|
|
490
|
-
}
|
|
491
|
-
export {
|
|
492
|
-
run
|
|
493
|
-
};
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
resolveAgentName
|
|
4
4
|
} from "./chunk-AZEL2IEK.js";
|
|
5
|
-
import {
|
|
6
|
-
daemonFetch
|
|
7
|
-
} from "./chunk-STOEJOJO.js";
|
|
8
5
|
import {
|
|
9
6
|
parseArgs
|
|
10
7
|
} from "./chunk-D424ZQGI.js";
|
|
8
|
+
import {
|
|
9
|
+
daemonFetch
|
|
10
|
+
} from "./chunk-STOEJOJO.js";
|
|
11
11
|
import "./chunk-DP2DX4WV.js";
|
|
12
12
|
import {
|
|
13
13
|
getClient,
|
|
File without changes
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
resolveAgentName
|
|
4
4
|
} from "./chunk-AZEL2IEK.js";
|
|
5
|
-
import {
|
|
6
|
-
daemonFetch
|
|
7
|
-
} from "./chunk-STOEJOJO.js";
|
|
8
5
|
import {
|
|
9
6
|
parseArgs
|
|
10
7
|
} from "./chunk-D424ZQGI.js";
|
|
8
|
+
import {
|
|
9
|
+
daemonFetch
|
|
10
|
+
} from "./chunk-STOEJOJO.js";
|
|
11
11
|
import "./chunk-DP2DX4WV.js";
|
|
12
12
|
import {
|
|
13
13
|
getClient,
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
resolveAgentName
|
|
4
4
|
} from "./chunk-AZEL2IEK.js";
|
|
5
|
-
import {
|
|
6
|
-
daemonFetch
|
|
7
|
-
} from "./chunk-STOEJOJO.js";
|
|
8
5
|
import {
|
|
9
6
|
parseArgs
|
|
10
7
|
} from "./chunk-D424ZQGI.js";
|
|
8
|
+
import {
|
|
9
|
+
daemonFetch
|
|
10
|
+
} from "./chunk-STOEJOJO.js";
|
|
11
11
|
import "./chunk-DP2DX4WV.js";
|
|
12
12
|
import {
|
|
13
13
|
getClient,
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
resolveAgentName
|
|
4
4
|
} from "./chunk-AZEL2IEK.js";
|
|
5
|
-
import {
|
|
6
|
-
daemonFetch
|
|
7
|
-
} from "./chunk-STOEJOJO.js";
|
|
8
5
|
import {
|
|
9
6
|
parseArgs
|
|
10
7
|
} from "./chunk-D424ZQGI.js";
|
|
8
|
+
import {
|
|
9
|
+
daemonFetch
|
|
10
|
+
} from "./chunk-STOEJOJO.js";
|
|
11
11
|
import "./chunk-DP2DX4WV.js";
|
|
12
12
|
import {
|
|
13
13
|
getClient,
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
import {
|
|
3
3
|
resolveAgentName
|
|
4
4
|
} from "./chunk-AZEL2IEK.js";
|
|
5
|
-
import {
|
|
6
|
-
daemonFetch
|
|
7
|
-
} from "./chunk-STOEJOJO.js";
|
|
8
5
|
import {
|
|
9
6
|
parseArgs
|
|
10
7
|
} from "./chunk-D424ZQGI.js";
|
|
8
|
+
import {
|
|
9
|
+
daemonFetch
|
|
10
|
+
} from "./chunk-STOEJOJO.js";
|
|
11
11
|
import "./chunk-DP2DX4WV.js";
|
|
12
12
|
import {
|
|
13
13
|
getClient,
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
import {
|
|
3
3
|
resolveAgentName
|
|
4
4
|
} from "./chunk-AZEL2IEK.js";
|
|
5
|
-
import {
|
|
6
|
-
daemonFetch
|
|
7
|
-
} from "./chunk-STOEJOJO.js";
|
|
8
5
|
import {
|
|
9
6
|
getChannelDriver
|
|
10
7
|
} from "./chunk-LIPPXNIE.js";
|
|
11
|
-
import "./chunk-N6MLQ26B.js";
|
|
12
8
|
import {
|
|
13
9
|
parseArgs
|
|
14
10
|
} from "./chunk-D424ZQGI.js";
|
|
11
|
+
import "./chunk-N6MLQ26B.js";
|
|
12
|
+
import {
|
|
13
|
+
daemonFetch
|
|
14
|
+
} from "./chunk-STOEJOJO.js";
|
|
15
15
|
import "./chunk-DP2DX4WV.js";
|
|
16
16
|
import {
|
|
17
17
|
getClient,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
parseArgs
|
|
4
|
-
} from "./chunk-D424ZQGI.js";
|
|
5
2
|
import {
|
|
6
3
|
resolveVoluteBin
|
|
7
4
|
} from "./chunk-5C5JWR2L.js";
|
|
5
|
+
import {
|
|
6
|
+
parseArgs
|
|
7
|
+
} from "./chunk-D424ZQGI.js";
|
|
8
8
|
import "./chunk-K3NQKI34.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/service.ts
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
parseArgs
|
|
4
|
-
} from "./chunk-D424ZQGI.js";
|
|
5
2
|
import {
|
|
6
3
|
ensureVoluteGroup
|
|
7
4
|
} from "./chunk-IQXBMFZG.js";
|
|
8
5
|
import {
|
|
9
6
|
resolveVoluteBin
|
|
10
7
|
} from "./chunk-5C5JWR2L.js";
|
|
8
|
+
import {
|
|
9
|
+
parseArgs
|
|
10
|
+
} from "./chunk-D424ZQGI.js";
|
|
11
11
|
import "./chunk-DP2DX4WV.js";
|
|
12
12
|
import "./chunk-K3NQKI34.js";
|
|
13
13
|
|