volute 0.9.0 → 0.10.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/{agent-MB3OTRRK.js → agent-ECRX44DB.js} +5 -5
- package/dist/{agent-manager-CMMH5KQQ.js → agent-manager-4OCID725.js} +2 -2
- package/dist/{chunk-IQXBMFZG.js → chunk-46S7YHUB.js} +18 -6
- package/dist/{chunk-YNNK4QN2.js → chunk-FYQGANL6.js} +40 -2
- package/dist/{chunk-W6TMWYU3.js → chunk-KR6WRAJ4.js} +3 -3
- package/dist/chunk-R3VB7NF5.js +205 -0
- package/dist/cli.js +14 -14
- package/dist/create-VBZZNJOG.js +38 -0
- package/dist/daemon-restart-7X72OXOW.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-TNE337RE.js} +1 -1
- package/dist/{setup-7SPMWF2O.js → setup-6QFIHXSH.js} +5 -5
- package/dist/{up-J7AHQHIM.js → up-FCYL2IPZ.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-M5AEQLB3.js} +0 -0
- 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/upgrade-BRNMSQBX.js
DELETED
|
@@ -1,233 +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
|
-
composeTemplate,
|
|
10
|
-
copyTemplateToDir,
|
|
11
|
-
findTemplatesRoot
|
|
12
|
-
} from "./chunk-XUA3JUFK.js";
|
|
13
|
-
import {
|
|
14
|
-
parseArgs
|
|
15
|
-
} from "./chunk-D424ZQGI.js";
|
|
16
|
-
import {
|
|
17
|
-
exec,
|
|
18
|
-
execInherit
|
|
19
|
-
} from "./chunk-5C5JWR2L.js";
|
|
20
|
-
import {
|
|
21
|
-
addVariant,
|
|
22
|
-
nextPort,
|
|
23
|
-
resolveAgent
|
|
24
|
-
} from "./chunk-DP2DX4WV.js";
|
|
25
|
-
import {
|
|
26
|
-
getClient,
|
|
27
|
-
urlOf
|
|
28
|
-
} from "./chunk-4RQBJWQX.js";
|
|
29
|
-
import "./chunk-K3NQKI34.js";
|
|
30
|
-
|
|
31
|
-
// src/commands/upgrade.ts
|
|
32
|
-
import { existsSync, mkdirSync, rmSync } from "fs";
|
|
33
|
-
import { resolve } from "path";
|
|
34
|
-
var TEMPLATE_BRANCH = "volute/template";
|
|
35
|
-
var VARIANT_NAME = "upgrade";
|
|
36
|
-
async function run(args) {
|
|
37
|
-
const { positional, flags } = parseArgs(args, {
|
|
38
|
-
template: { type: "string" },
|
|
39
|
-
continue: { type: "boolean" }
|
|
40
|
-
});
|
|
41
|
-
const agentName = resolveAgentName({ agent: positional[0] });
|
|
42
|
-
const { dir: projectRoot } = resolveAgent(agentName);
|
|
43
|
-
const template = flags.template ?? "agent-sdk";
|
|
44
|
-
if (flags.continue) {
|
|
45
|
-
await continueUpgrade(agentName, projectRoot);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const worktreeDir = resolve(projectRoot, ".variants", VARIANT_NAME);
|
|
49
|
-
if (existsSync(worktreeDir)) {
|
|
50
|
-
console.error(
|
|
51
|
-
`Upgrade variant already exists: ${worktreeDir}
|
|
52
|
-
If a previous upgrade is in progress, use --continue to finish it.
|
|
53
|
-
Otherwise, remove it with: volute variant delete ${VARIANT_NAME} --agent ${agentName}`
|
|
54
|
-
);
|
|
55
|
-
process.exit(1);
|
|
56
|
-
}
|
|
57
|
-
await exec("git", ["worktree", "prune"], { cwd: projectRoot });
|
|
58
|
-
try {
|
|
59
|
-
await exec("git", ["branch", "-D", VARIANT_NAME], { cwd: projectRoot });
|
|
60
|
-
} catch {
|
|
61
|
-
}
|
|
62
|
-
console.log("Updating template branch...");
|
|
63
|
-
await updateTemplateBranch(projectRoot, template, agentName);
|
|
64
|
-
console.log("Creating upgrade variant...");
|
|
65
|
-
const parentDir = resolve(projectRoot, ".variants");
|
|
66
|
-
if (!existsSync(parentDir)) {
|
|
67
|
-
mkdirSync(parentDir, { recursive: true });
|
|
68
|
-
}
|
|
69
|
-
await exec("git", ["worktree", "add", "-b", VARIANT_NAME, worktreeDir], {
|
|
70
|
-
cwd: projectRoot
|
|
71
|
-
});
|
|
72
|
-
console.log("Merging template changes...");
|
|
73
|
-
const hasConflicts = await mergeTemplateBranch(worktreeDir);
|
|
74
|
-
if (hasConflicts) {
|
|
75
|
-
console.log("\nMerge conflicts detected. Resolve them in:");
|
|
76
|
-
console.log(` ${worktreeDir}`);
|
|
77
|
-
console.log(`
|
|
78
|
-
Then run:`);
|
|
79
|
-
console.log(` volute agent upgrade ${agentName} --continue`);
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
await installAndVerify(agentName, worktreeDir);
|
|
83
|
-
}
|
|
84
|
-
async function updateTemplateBranch(projectRoot, template, agentName) {
|
|
85
|
-
const tempWorktree = resolve(projectRoot, ".variants", "_template_update");
|
|
86
|
-
let branchExists = false;
|
|
87
|
-
try {
|
|
88
|
-
await exec("git", ["rev-parse", "--verify", TEMPLATE_BRANCH], {
|
|
89
|
-
cwd: projectRoot
|
|
90
|
-
});
|
|
91
|
-
branchExists = true;
|
|
92
|
-
} catch {
|
|
93
|
-
}
|
|
94
|
-
try {
|
|
95
|
-
await exec("git", ["worktree", "remove", "--force", tempWorktree], { cwd: projectRoot });
|
|
96
|
-
} catch {
|
|
97
|
-
}
|
|
98
|
-
if (existsSync(tempWorktree)) {
|
|
99
|
-
rmSync(tempWorktree, { recursive: true, force: true });
|
|
100
|
-
}
|
|
101
|
-
const templatesRoot = findTemplatesRoot();
|
|
102
|
-
const { composedDir, manifest } = composeTemplate(templatesRoot, template);
|
|
103
|
-
try {
|
|
104
|
-
if (branchExists) {
|
|
105
|
-
await exec("git", ["worktree", "add", tempWorktree, TEMPLATE_BRANCH], {
|
|
106
|
-
cwd: projectRoot
|
|
107
|
-
});
|
|
108
|
-
} else {
|
|
109
|
-
await exec("git", ["worktree", "add", "--detach", tempWorktree], {
|
|
110
|
-
cwd: projectRoot
|
|
111
|
-
});
|
|
112
|
-
await exec("git", ["checkout", "--orphan", TEMPLATE_BRANCH], {
|
|
113
|
-
cwd: tempWorktree
|
|
114
|
-
});
|
|
115
|
-
await exec("git", ["rm", "-rf", "--cached", "."], { cwd: tempWorktree });
|
|
116
|
-
await exec("git", ["clean", "-fd"], { cwd: tempWorktree });
|
|
117
|
-
}
|
|
118
|
-
if (branchExists) {
|
|
119
|
-
await exec("git", ["rm", "-rf", "."], { cwd: tempWorktree }).catch(() => {
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
copyTemplateToDir(composedDir, tempWorktree, agentName, manifest);
|
|
123
|
-
const initDir = resolve(tempWorktree, ".init");
|
|
124
|
-
if (existsSync(initDir)) {
|
|
125
|
-
rmSync(initDir, { recursive: true, force: true });
|
|
126
|
-
}
|
|
127
|
-
await exec("git", ["add", "-A"], { cwd: tempWorktree });
|
|
128
|
-
try {
|
|
129
|
-
await exec("git", ["diff", "--cached", "--quiet"], { cwd: tempWorktree });
|
|
130
|
-
console.log("Template branch is already up to date.");
|
|
131
|
-
} catch {
|
|
132
|
-
await exec("git", ["commit", "-m", "template update"], {
|
|
133
|
-
cwd: tempWorktree
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
} finally {
|
|
137
|
-
try {
|
|
138
|
-
await exec("git", ["worktree", "remove", "--force", tempWorktree], { cwd: projectRoot });
|
|
139
|
-
} catch {
|
|
140
|
-
}
|
|
141
|
-
if (existsSync(tempWorktree)) {
|
|
142
|
-
rmSync(tempWorktree, { recursive: true, force: true });
|
|
143
|
-
}
|
|
144
|
-
rmSync(composedDir, { recursive: true, force: true });
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
async function mergeTemplateBranch(worktreeDir) {
|
|
148
|
-
try {
|
|
149
|
-
await exec(
|
|
150
|
-
"git",
|
|
151
|
-
["merge", TEMPLATE_BRANCH, "--allow-unrelated-histories", "-m", "merge template update"],
|
|
152
|
-
{ cwd: worktreeDir }
|
|
153
|
-
);
|
|
154
|
-
return false;
|
|
155
|
-
} catch (e) {
|
|
156
|
-
try {
|
|
157
|
-
const status = await exec("git", ["status", "--porcelain"], {
|
|
158
|
-
cwd: worktreeDir
|
|
159
|
-
});
|
|
160
|
-
const hasConflictMarkers = status.split("\n").some((line) => line.startsWith("UU") || line.startsWith("AA"));
|
|
161
|
-
if (hasConflictMarkers) return true;
|
|
162
|
-
} catch {
|
|
163
|
-
}
|
|
164
|
-
throw e;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
async function continueUpgrade(agentName, projectRoot) {
|
|
168
|
-
const worktreeDir = resolve(projectRoot, ".variants", VARIANT_NAME);
|
|
169
|
-
if (!existsSync(worktreeDir)) {
|
|
170
|
-
console.error("No upgrade in progress. Run `volute agent upgrade` first.");
|
|
171
|
-
process.exit(1);
|
|
172
|
-
}
|
|
173
|
-
const status = await exec("git", ["status", "--porcelain"], {
|
|
174
|
-
cwd: worktreeDir
|
|
175
|
-
});
|
|
176
|
-
const hasConflicts = status.split("\n").some((line) => line.startsWith("UU") || line.startsWith("AA"));
|
|
177
|
-
if (hasConflicts) {
|
|
178
|
-
console.error("There are still unresolved conflicts. Resolve them first.");
|
|
179
|
-
process.exit(1);
|
|
180
|
-
}
|
|
181
|
-
try {
|
|
182
|
-
await exec("git", ["add", "-A"], { cwd: worktreeDir });
|
|
183
|
-
await exec("git", ["commit", "--no-edit"], { cwd: worktreeDir });
|
|
184
|
-
} catch {
|
|
185
|
-
}
|
|
186
|
-
await installAndVerify(agentName, worktreeDir);
|
|
187
|
-
}
|
|
188
|
-
async function installAndVerify(agentName, worktreeDir) {
|
|
189
|
-
console.log("Installing dependencies...");
|
|
190
|
-
await execInherit("npm", ["install"], { cwd: worktreeDir });
|
|
191
|
-
const variantPort = nextPort();
|
|
192
|
-
addVariant(agentName, {
|
|
193
|
-
name: VARIANT_NAME,
|
|
194
|
-
branch: VARIANT_NAME,
|
|
195
|
-
path: worktreeDir,
|
|
196
|
-
port: variantPort,
|
|
197
|
-
created: (/* @__PURE__ */ new Date()).toISOString()
|
|
198
|
-
});
|
|
199
|
-
console.log("Starting upgrade variant...");
|
|
200
|
-
try {
|
|
201
|
-
const client = getClient();
|
|
202
|
-
const res = await daemonFetch(
|
|
203
|
-
urlOf(
|
|
204
|
-
client.api.agents[":name"].start.$url({
|
|
205
|
-
param: { name: `${agentName}@${VARIANT_NAME}` }
|
|
206
|
-
})
|
|
207
|
-
),
|
|
208
|
-
{ method: "POST" }
|
|
209
|
-
);
|
|
210
|
-
if (!res.ok) {
|
|
211
|
-
const data = await res.json();
|
|
212
|
-
console.error(data.error ?? "Failed to start variant");
|
|
213
|
-
process.exit(1);
|
|
214
|
-
}
|
|
215
|
-
} catch {
|
|
216
|
-
console.error("Failed to start variant. Is the daemon running? (volute up)");
|
|
217
|
-
console.error(
|
|
218
|
-
`The variant was created but not started. Use: volute agent start ${agentName}@${VARIANT_NAME}`
|
|
219
|
-
);
|
|
220
|
-
process.exit(1);
|
|
221
|
-
}
|
|
222
|
-
console.log(`
|
|
223
|
-
Upgrade variant running on port ${variantPort}`);
|
|
224
|
-
console.log(`
|
|
225
|
-
Next steps:`);
|
|
226
|
-
console.log(
|
|
227
|
-
` volute send @${agentName}@${VARIANT_NAME} "hello" # chat with upgraded variant`
|
|
228
|
-
);
|
|
229
|
-
console.log(` volute variant merge ${VARIANT_NAME} # merge back when satisfied`);
|
|
230
|
-
}
|
|
231
|
-
export {
|
|
232
|
-
run
|
|
233
|
-
};
|