volute 0.2.1 → 0.3.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.
Files changed (62) hide show
  1. package/README.md +46 -0
  2. package/dist/agent-manager-AUCKMGPR.js +15 -0
  3. package/dist/{channel-2WJRM7PE.js → channel-7FZ6D25H.js} +7 -7
  4. package/dist/{chunk-6UCG6MIX.js → chunk-3C2XR4IY.js} +2 -7
  5. package/dist/{chunk-XZN4WPNC.js → chunk-5SKQ6J7T.js} +9 -1
  6. package/dist/{chunk-KFNNHQK7.js → chunk-DNOXHLE5.js} +1 -1
  7. package/dist/{chunk-L3BQEZ4Z.js → chunk-I6OHXCMV.js} +75 -14
  8. package/dist/chunk-K3NQKI34.js +10 -0
  9. package/dist/chunk-NETNFBA5.js +28 -0
  10. package/dist/chunk-SOZA2TLP.js +81 -0
  11. package/dist/chunk-VRVVQIYY.js +15 -0
  12. package/dist/{chunk-4YXYAMFT.js → chunk-YGFIWIOF.js} +7 -6
  13. package/dist/cli.js +57 -51
  14. package/dist/connector-TVJULIRT.js +96 -0
  15. package/dist/connectors/discord.js +27 -3
  16. package/dist/{create-23AM7H5B.js → create-BRG2DBWI.js} +22 -5
  17. package/dist/daemon-client-XR24PUJF.js +9 -0
  18. package/dist/daemon.js +168 -138
  19. package/dist/{delete-GDMSOW3U.js → delete-GQ7JEK2S.js} +7 -2
  20. package/dist/{down-WTF73FE7.js → down-3OB6UVAJ.js} +10 -3
  21. package/dist/{env-YKUJOFHE.js → env-JB27UAC3.js} +3 -2
  22. package/dist/{history-7WVVKMUY.js → history-3VRUBGGV.js} +9 -8
  23. package/dist/{import-42DOLBDT.js → import-K4MP2GX7.js} +143 -36
  24. package/dist/{logs-SYRQOL6B.js → logs-NXFFGUKY.js} +8 -7
  25. package/dist/{schedule-J37XQM6E.js → schedule-4I5TYHFH.js} +41 -41
  26. package/dist/{send-PLOYEYER.js → send-UK3JBZIB.js} +3 -2
  27. package/dist/service-SA4TTMDU.js +195 -0
  28. package/dist/setup-SRS7AUAA.js +148 -0
  29. package/dist/{start-AG7QLULK.js → start-LDPMCMYT.js} +3 -2
  30. package/dist/{status-GCNU4M3K.js → status-MVSQG54T.js} +3 -2
  31. package/dist/{stop-IL5Q6NER.js → stop-5PZTZCLL.js} +3 -2
  32. package/dist/{up-ZC6G6K4K.js → up-UT3IMKCA.js} +5 -3
  33. package/dist/{upgrade-DD5TNJWU.js → upgrade-CDKECCGN.js} +35 -21
  34. package/dist/variant-CVYM3EQG.js +497 -0
  35. package/dist/web-assets/assets/index-BC5eSqbY.js +296 -0
  36. package/dist/web-assets/index.html +1 -1
  37. package/drizzle/0002_wealthy_the_call.sql +6 -0
  38. package/drizzle/meta/0002_snapshot.json +339 -0
  39. package/drizzle/meta/_journal.json +7 -0
  40. package/package.json +4 -1
  41. package/templates/_base/.init/SOUL.md +5 -1
  42. package/templates/_base/_skills/memory/SKILL.md +2 -2
  43. package/templates/_base/_skills/volute-agent/SKILL.md +30 -12
  44. package/templates/_base/home/VOLUTE.md +4 -2
  45. package/templates/_base/src/lib/auto-commit.ts +8 -3
  46. package/templates/_base/src/lib/types.ts +6 -2
  47. package/templates/_base/src/lib/volute-server.ts +5 -0
  48. package/templates/agent-sdk/.init/CLAUDE.md +15 -13
  49. package/templates/agent-sdk/src/agent.ts +12 -1
  50. package/templates/agent-sdk/src/lib/agent-sessions.ts +28 -4
  51. package/templates/pi/.init/AGENTS.md +11 -9
  52. package/templates/pi/src/agent.ts +16 -3
  53. package/templates/pi/src/lib/agent-sessions.ts +26 -4
  54. package/dist/agent-manager-SSJUZWOV.js +0 -13
  55. package/dist/chunk-MY74SUOL.js +0 -81
  56. package/dist/connect-X5V5IMRW.js +0 -48
  57. package/dist/daemon-client-VN24HM5T.js +0 -10
  58. package/dist/disconnect-5JWFZ6RV.js +0 -30
  59. package/dist/fork-GRSVMBKI.js +0 -119
  60. package/dist/merge-CSAVLSLY.js +0 -216
  61. package/dist/variants-QQIEKT6M.js +0 -60
  62. package/dist/web-assets/assets/index-DNNPoxMn.js +0 -158
@@ -1,216 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- spawnServer
4
- } from "./chunk-MY74SUOL.js";
5
- import {
6
- exec,
7
- execInherit
8
- } from "./chunk-XZN4WPNC.js";
9
- import {
10
- parseArgs
11
- } from "./chunk-D424ZQGI.js";
12
- import {
13
- checkHealth,
14
- findVariant,
15
- removeVariant,
16
- resolveAgent,
17
- validateBranchName
18
- } from "./chunk-6UCG6MIX.js";
19
-
20
- // src/commands/merge.ts
21
- import { existsSync, mkdirSync, writeFileSync } from "fs";
22
- import { resolve } from "path";
23
-
24
- // src/lib/verify.ts
25
- async function verify(port) {
26
- const health = await checkHealth(port);
27
- if (!health.ok) {
28
- console.error(" Health check: failed");
29
- return false;
30
- }
31
- console.log(" Health check: OK");
32
- try {
33
- const res = await fetch(`http://localhost:${port}/message`, {
34
- method: "POST",
35
- headers: { "Content-Type": "application/json" },
36
- body: JSON.stringify({
37
- content: [{ type: "text", text: "ping" }],
38
- channel: "system"
39
- }),
40
- signal: AbortSignal.timeout(6e4)
41
- });
42
- if (!res.ok || !res.body) {
43
- console.error(" Test message: failed to send");
44
- return false;
45
- }
46
- const reader = res.body.getReader();
47
- const decoder = new TextDecoder();
48
- let buffer = "";
49
- let gotDone = false;
50
- while (true) {
51
- const { done, value } = await reader.read();
52
- if (done) break;
53
- buffer += decoder.decode(value, { stream: true });
54
- const lines = buffer.split("\n");
55
- buffer = lines.pop() || "";
56
- for (const line of lines) {
57
- if (!line.trim()) continue;
58
- try {
59
- const event = JSON.parse(line);
60
- if (event.type === "done") {
61
- gotDone = true;
62
- }
63
- } catch {
64
- }
65
- }
66
- if (gotDone) {
67
- reader.cancel();
68
- break;
69
- }
70
- }
71
- if (gotDone) {
72
- console.log(" Test message: OK");
73
- return true;
74
- } else {
75
- console.error(" Test message: no done event received");
76
- return false;
77
- }
78
- } catch (e) {
79
- const msg = e instanceof Error ? e.message : String(e);
80
- console.error(` Test message: ${msg}`);
81
- return false;
82
- }
83
- }
84
-
85
- // src/commands/merge.ts
86
- async function run(args) {
87
- const { positional, flags } = parseArgs(args, {
88
- summary: { type: "string" },
89
- justification: { type: "string" },
90
- memory: { type: "string" },
91
- "skip-verify": { type: "boolean" }
92
- });
93
- const agentName = positional[0];
94
- const variantName = positional[1];
95
- if (!agentName || !variantName) {
96
- console.error(
97
- "Usage: volute merge <agent> <variant> [--summary '...'] [--justification '...'] [--memory '...'] [--skip-verify]"
98
- );
99
- process.exit(1);
100
- }
101
- const { dir: projectRoot } = resolveAgent(agentName);
102
- const variant = findVariant(agentName, variantName);
103
- if (!variant) {
104
- console.error(`Unknown variant: ${variantName}`);
105
- process.exit(1);
106
- }
107
- const branchErr = validateBranchName(variant.branch);
108
- if (branchErr) {
109
- console.error(branchErr);
110
- process.exit(1);
111
- }
112
- if (existsSync(variant.path)) {
113
- const status = (await exec("git", ["status", "--porcelain"], { cwd: variant.path })).trim();
114
- if (status) {
115
- console.log("Committing uncommitted changes in variant...");
116
- try {
117
- await exec("git", ["add", "-A"], { cwd: variant.path });
118
- await exec("git", ["commit", "-m", "Auto-commit uncommitted changes before merge"], {
119
- cwd: variant.path
120
- });
121
- } catch (err) {
122
- console.error("Failed to auto-commit variant changes:", err);
123
- console.error("Please commit or stash changes in the variant manually before merging.");
124
- process.exit(1);
125
- }
126
- }
127
- }
128
- if (!flags["skip-verify"]) {
129
- console.log("Verifying variant...");
130
- console.log("Starting temporary server for verification...");
131
- const result = await spawnServer(variant.path, 0, { detached: true });
132
- if (!result) {
133
- console.error("Failed to start server for verification. Use --skip-verify to skip.");
134
- process.exit(1);
135
- }
136
- const verified = await verify(result.actualPort);
137
- try {
138
- process.kill(result.child.pid);
139
- } catch {
140
- }
141
- if (!verified) {
142
- console.error("Verification failed. Fix issues or use --skip-verify to proceed anyway.");
143
- process.exit(1);
144
- }
145
- console.log("Verification passed.");
146
- }
147
- const mainStatus = (await exec("git", ["status", "--porcelain"], { cwd: projectRoot })).trim();
148
- if (mainStatus) {
149
- console.log("Committing uncommitted changes in main...");
150
- try {
151
- await exec("git", ["add", "-A"], { cwd: projectRoot });
152
- await exec("git", ["commit", "-m", "Auto-commit uncommitted changes before merge"], {
153
- cwd: projectRoot
154
- });
155
- } catch (err) {
156
- console.error("Failed to auto-commit main changes:", err);
157
- console.error("Please commit or stash your changes manually before merging.");
158
- process.exit(1);
159
- }
160
- }
161
- console.log(`Merging branch: ${variant.branch}`);
162
- try {
163
- await execInherit("git", ["merge", variant.branch], { cwd: projectRoot });
164
- } catch (e) {
165
- console.error("Merge failed:", e);
166
- process.exit(1);
167
- }
168
- if (existsSync(variant.path)) {
169
- try {
170
- await exec("git", ["worktree", "remove", "--force", variant.path], { cwd: projectRoot });
171
- } catch {
172
- }
173
- }
174
- try {
175
- await exec("git", ["branch", "-D", variant.branch], { cwd: projectRoot });
176
- } catch {
177
- }
178
- removeVariant(agentName, variantName);
179
- console.log("Reinstalling dependencies...");
180
- try {
181
- await execInherit("npm", ["install"], { cwd: projectRoot });
182
- } catch (e) {
183
- console.error("npm install failed:", e);
184
- }
185
- console.log(`Variant ${variantName} merged and cleaned up.`);
186
- const voluteDir = resolve(projectRoot, ".volute");
187
- if (!existsSync(voluteDir)) mkdirSync(voluteDir, { recursive: true });
188
- writeFileSync(
189
- resolve(voluteDir, "merged.json"),
190
- JSON.stringify({
191
- name: variantName,
192
- ...flags.summary && { summary: flags.summary },
193
- ...flags.justification && { justification: flags.justification },
194
- ...flags.memory && { memory: flags.memory }
195
- })
196
- );
197
- if (process.env.VOLUTE_SUPERVISOR) return;
198
- try {
199
- const { daemonFetch } = await import("./daemon-client-VN24HM5T.js");
200
- console.log("Restarting agent via daemon...");
201
- const res = await daemonFetch(`/api/agents/${encodeURIComponent(agentName)}/restart`, {
202
- method: "POST"
203
- });
204
- if (res.ok) {
205
- console.log(`${agentName} restarted.`);
206
- } else {
207
- const data = await res.json();
208
- console.error(`Failed to restart: ${data.error ?? "unknown error"}`);
209
- }
210
- } catch {
211
- console.log(`Daemon not running. Start the agent manually: volute start ${agentName}`);
212
- }
213
- }
214
- export {
215
- run
216
- };
@@ -1,60 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- parseArgs
4
- } from "./chunk-D424ZQGI.js";
5
- import {
6
- checkHealth,
7
- readVariants,
8
- resolveAgent,
9
- writeVariants
10
- } from "./chunk-6UCG6MIX.js";
11
-
12
- // src/commands/variants.ts
13
- async function run(args) {
14
- const { positional, flags } = parseArgs(args, {
15
- json: { type: "boolean" }
16
- });
17
- const name = positional[0];
18
- if (!name) {
19
- console.error("Usage: volute variants <name>");
20
- process.exit(1);
21
- }
22
- const { json } = flags;
23
- resolveAgent(name);
24
- const variants = readVariants(name);
25
- if (variants.length === 0) {
26
- if (json) {
27
- console.log("[]");
28
- } else {
29
- console.log("No variants.");
30
- }
31
- return;
32
- }
33
- const results = await Promise.all(
34
- variants.map(async (v) => {
35
- if (!v.port) return { ...v, status: "no-server" };
36
- const health = await checkHealth(v.port);
37
- return { ...v, status: health.ok ? "running" : "dead" };
38
- })
39
- );
40
- const updated = results.map(({ status, ...v }) => ({
41
- ...v,
42
- running: status === "running"
43
- }));
44
- writeVariants(name, updated);
45
- if (json) {
46
- console.log(JSON.stringify(results, null, 2));
47
- return;
48
- }
49
- const nameW = Math.max(4, ...results.map((r) => r.name.length));
50
- const portW = Math.max(4, ...results.map((r) => String(r.port || "-").length));
51
- console.log(`${"NAME".padEnd(nameW)} ${"PORT".padEnd(portW)} ${"STATUS".padEnd(10)} BRANCH`);
52
- for (const r of results) {
53
- console.log(
54
- `${r.name.padEnd(nameW)} ${String(r.port || "-").padEnd(portW)} ${r.status.padEnd(10)} ${r.branch}`
55
- );
56
- }
57
- }
58
- export {
59
- run
60
- };