volute 0.26.0 → 0.28.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 +18 -18
- package/dist/accept-666DIZX2.js +41 -0
- package/dist/{activity-events-ZMBAKLUF.js → activity-events-BBIEA2F4.js} +2 -3
- package/dist/api.d.ts +510 -299
- package/dist/{archive-4ZQYK5MN.js → archive-UA4BDFXQ.js} +2 -2
- package/dist/bridge-FQHZL3MC.js +206 -0
- package/dist/chat-M4SX42JD.js +68 -0
- package/dist/{chunk-PHU4DEAJ.js → chunk-2WPW7OT6.js} +3 -3
- package/dist/{chunk-5Y3PBKW6.js → chunk-2YP2TVDT.js} +138 -56
- package/dist/{chunk-3CFRE2VC.js → chunk-AAPXKR5V.js} +435 -1090
- package/dist/{chunk-YJA7P64S.js → chunk-AW7PFDVN.js} +5 -5
- package/dist/{chunk-OZFKBXD6.js → chunk-EHYDTZTF.js} +6 -6
- 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-UTL75LP6.js → chunk-J4IBNXGJ.js} +20 -22
- package/dist/{chunk-WGOGUMPO.js → chunk-JGFVMROS.js} +13 -6
- package/dist/{chunk-NWI2425I.js → chunk-K5NAC55T.js} +1 -1
- package/dist/chunk-KTLFDYPT.js +61 -0
- package/dist/{chunk-V63B7DX3.js → chunk-LAC664WU.js} +7 -4
- package/dist/chunk-MD4C26II.js +128 -0
- package/dist/{chunk-USNBKHYG.js → chunk-NI5FFCCS.js} +12 -7
- package/dist/{chunk-3TV4GLFO.js → chunk-P72MVS4R.js} +4 -43
- package/dist/{chunk-2VO7453N.js → chunk-POSXWWTA.js} +30 -54
- package/dist/{chunk-XOXLRRR2.js → chunk-RKQEHRBB.js} +4 -3
- package/dist/{chunk-LX22GRG7.js → chunk-SGVNFZHW.js} +11 -8
- package/dist/chunk-T6HKBWXZ.js +23 -0
- package/dist/{chunk-J2CO4WEV.js → chunk-VIVMW2H2.js} +4 -4
- package/dist/{chunk-KTJGZ7M7.js → chunk-XBLSAVJF.js} +1 -1
- package/dist/cli.js +32 -49
- package/dist/{cloud-sync-NI2K3C7G.js → cloud-sync-HDL6PHZI.js} +14 -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-G4B2OYAB.js} +7 -7
- package/dist/daemon.js +1889 -1216
- 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/files-M546TKVN.js +46 -0
- package/dist/{history-B64GTFTD.js → history-ALPTNB3I.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/{login-B5E7N7MY.js → login-3QZNR2DF.js} +4 -4
- package/dist/{login-6U7U6BNG.js → login-BKP3AFWN.js} +8 -18
- package/dist/logout-IQK7FNEK.js +20 -0
- package/dist/{logout-XSJRYS3U.js → logout-T53VKCPU.js} +4 -4
- package/dist/message-delivery-HV3S6HZV.js +24 -0
- package/dist/migrate-registry-to-db-XC7T5B7P.js +110 -0
- package/dist/{mind-HZ3QSDDJ.js → mind-S5V6CK5W.js} +29 -34
- package/dist/{mind-activity-tracker-4G6FURY2.js → mind-activity-tracker-EN6XNXPF.js} +3 -4
- package/dist/mind-list-UPJ75GPI.js +29 -0
- package/dist/mind-manager-S6ILZVX3.js +18 -0
- package/dist/{mind-sleep-DTV7L44D.js → mind-sleep-BTSWQNAC.js} +4 -4
- package/dist/mind-status-TK5AETEM.js +55 -0
- 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-CG4RWUGP.js} +1 -1
- package/dist/{pages-DIIT5HMQ.js → pages-KJDJX4TA.js} +5 -5
- package/dist/{publish-HQV7YREB.js → publish-ZZB33WP4.js} +9 -20
- package/dist/read-36UFXN3G.js +46 -0
- package/dist/{register-EFND67FQ.js → register-CHREOMJ3.js} +6 -25
- package/dist/{registry-D2BSQ2X5.js → registry-NDNOOYG4.js} +15 -9
- package/dist/reject-LXIZFJ4Q.js +39 -0
- package/dist/{restart-CCK7D6TV.js → restart-6ESL3NBO.js} +5 -5
- package/dist/{sandbox-EHGFF52K.js → sandbox-5BW5HPXM.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-TAOEZ4NH.js} +87 -23
- package/dist/{setup-YGAAIKKZ.js → setup-JHL5ZEST.js} +2 -2
- package/dist/{setup-F6TWFYGQ.js → setup-RXYVGGT7.js} +9 -9
- 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/shared-files/SKILL.md +44 -0
- package/dist/skills/shared-files/scripts/merge.ts +72 -0
- package/dist/skills/shared-files/scripts/pull.ts +52 -0
- package/dist/skills/volute-mind/SKILL.md +35 -34
- package/dist/sleep-manager-WMVG2VCL.js +28 -0
- package/dist/split-TKJ5OT3P.js +63 -0
- package/dist/{sprout-QL74KR2X.js → sprout-UNT7LKKE.js} +6 -7
- package/dist/{start-O5JQASRC.js → start-EUJSS5R4.js} +2 -2
- package/dist/status-NQJYR4BG.js +114 -0
- package/dist/{status-LV34BG6G.js → status-S7UUPNRW.js} +4 -14
- package/dist/{stop-2SOG5NYF.js → stop-3XAITBBF.js} +5 -5
- package/dist/systems-SMEFSHTA.js +60 -0
- package/dist/{tailscale-AJ4VL5XK.js → tailscale-NY5MUMY3.js} +1 -1
- package/dist/up-GM2JOH2Y.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-JDUF4HQJ.js} +24 -29
- package/dist/web-assets/assets/index-BZGvToHi.css +1 -0
- package/dist/web-assets/assets/index-Cz4TrpzB.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/logger.ts +0 -4
- package/templates/_base/src/lib/startup.ts +2 -2
- package/dist/auth-4TV573WE.js +0 -37
- package/dist/channel-ZVZV42UD.js +0 -260
- package/dist/chunk-B2CPS4QU.js +0 -283
- package/dist/chunk-HFCBO2GL.js +0 -50
- package/dist/chunk-RWKVSSLY.js +0 -26
- 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/file-HUDKTRAS.js +0 -204
- package/dist/log-PBFNILJ4.js +0 -39
- package/dist/logout-UKD5LA37.js +0 -18
- package/dist/logs-3CART7O7.js +0 -77
- package/dist/merge-VK2HSKMA.js +0 -46
- package/dist/message-delivery-MS5JYPZX.js +0 -25
- package/dist/mind-manager-VVK67AY3.js +0 -19
- package/dist/pull-2MB4SK3C.js +0 -39
- package/dist/service-LLBV3R7M.js +0 -122
- package/dist/shared-UMO4S7CC.js +0 -39
- package/dist/sleep-manager-EE4NRN2Q.js +0 -29
- package/dist/status-FZBEBM7Q.js +0 -70
- package/dist/status-WXD4HXRL.js +0 -35
- 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
|
@@ -13,7 +13,7 @@ async function run(args) {
|
|
|
13
13
|
force: { type: "boolean" }
|
|
14
14
|
});
|
|
15
15
|
const name = resolveMindName({ mind: positional[0] });
|
|
16
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
16
|
+
const { daemonFetch } = await import("./daemon-client-I42FK2BF.js");
|
|
17
17
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
18
18
|
const client = getClient();
|
|
19
19
|
const url = urlOf(client.api.minds[":name"].$url({ param: { name } })) + (flags.force ? "?force=true" : "");
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
run,
|
|
4
|
+
stopDaemon
|
|
5
|
+
} from "./chunk-EHYDTZTF.js";
|
|
6
|
+
import "./chunk-LAC664WU.js";
|
|
7
|
+
import "./chunk-AW7PFDVN.js";
|
|
8
|
+
import "./chunk-RKQEHRBB.js";
|
|
9
|
+
import "./chunk-H7OZRFJB.js";
|
|
10
|
+
import "./chunk-K3NQKI34.js";
|
|
11
|
+
export {
|
|
12
|
+
run,
|
|
13
|
+
stopDaemon
|
|
14
|
+
};
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
} from "./chunk-SSI47XP2.js";
|
|
5
5
|
import {
|
|
6
6
|
daemonFetch
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-JGFVMROS.js";
|
|
8
8
|
import {
|
|
9
9
|
getClient,
|
|
10
10
|
urlOf
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import {
|
|
13
13
|
parseArgs
|
|
14
14
|
} from "./chunk-D424ZQGI.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-H7OZRFJB.js";
|
|
16
16
|
import "./chunk-K3NQKI34.js";
|
|
17
17
|
|
|
18
18
|
// src/commands/env.ts
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import {
|
|
3
3
|
addHistoryToArchive,
|
|
4
4
|
createExportArchive
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-XBLSAVJF.js";
|
|
6
6
|
import {
|
|
7
7
|
parseArgs
|
|
8
8
|
} from "./chunk-D424ZQGI.js";
|
|
9
9
|
import {
|
|
10
10
|
findMind,
|
|
11
11
|
mindDir
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-H7OZRFJB.js";
|
|
13
13
|
import "./chunk-K3NQKI34.js";
|
|
14
14
|
|
|
15
15
|
// src/commands/export.ts
|
|
@@ -33,7 +33,7 @@ async function run(args) {
|
|
|
33
33
|
);
|
|
34
34
|
process.exit(1);
|
|
35
35
|
}
|
|
36
|
-
const entry = findMind(name);
|
|
36
|
+
const entry = await findMind(name);
|
|
37
37
|
if (!entry) {
|
|
38
38
|
console.error(`Unknown mind: ${name}`);
|
|
39
39
|
process.exit(1);
|
|
@@ -63,7 +63,7 @@ async function run(args) {
|
|
|
63
63
|
});
|
|
64
64
|
if (includeHistory) {
|
|
65
65
|
try {
|
|
66
|
-
const { daemonFetch } = await import("./daemon-client-
|
|
66
|
+
const { daemonFetch } = await import("./daemon-client-I42FK2BF.js");
|
|
67
67
|
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
68
68
|
const client = getClient();
|
|
69
69
|
const res = await daemonFetch(
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolveMindName
|
|
4
|
+
} from "./chunk-NAOW2CLO.js";
|
|
5
|
+
import {
|
|
6
|
+
daemonFetch
|
|
7
|
+
} from "./chunk-JGFVMROS.js";
|
|
8
|
+
import {
|
|
9
|
+
formatFileSize
|
|
10
|
+
} from "./chunk-MD4C26II.js";
|
|
11
|
+
import {
|
|
12
|
+
parseArgs
|
|
13
|
+
} from "./chunk-D424ZQGI.js";
|
|
14
|
+
import "./chunk-H7OZRFJB.js";
|
|
15
|
+
import "./chunk-K3NQKI34.js";
|
|
16
|
+
|
|
17
|
+
// src/commands/chat/files.ts
|
|
18
|
+
async function run(args) {
|
|
19
|
+
const { flags } = parseArgs(args, {
|
|
20
|
+
mind: { type: "string" }
|
|
21
|
+
});
|
|
22
|
+
const mind = resolveMindName(flags);
|
|
23
|
+
const res = await daemonFetch(`/api/minds/${encodeURIComponent(mind)}/files/pending`);
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
const data = await res.json();
|
|
26
|
+
console.error(data.error ?? `Failed to list pending files: ${res.status}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const pending = await res.json();
|
|
30
|
+
if (pending.length === 0) {
|
|
31
|
+
console.log("No pending files.");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const idW = Math.max(2, ...pending.map((p) => p.id.length));
|
|
35
|
+
const senderW = Math.max(6, ...pending.map((p) => p.sender.length));
|
|
36
|
+
const fileW = Math.max(4, ...pending.map((p) => p.filename.length));
|
|
37
|
+
console.log(`${"ID".padEnd(idW)} ${"SENDER".padEnd(senderW)} ${"FILE".padEnd(fileW)} SIZE`);
|
|
38
|
+
for (const p of pending) {
|
|
39
|
+
console.log(
|
|
40
|
+
`${p.id.padEnd(idW)} ${p.sender.padEnd(senderW)} ${p.filename.padEnd(fileW)} ${formatFileSize(p.size)}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
run
|
|
46
|
+
};
|
|
@@ -1,18 +1,18 @@
|
|
|
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
12
|
import {
|
|
13
13
|
parseArgs
|
|
14
14
|
} from "./chunk-D424ZQGI.js";
|
|
15
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-H7OZRFJB.js";
|
|
16
16
|
import "./chunk-K3NQKI34.js";
|
|
17
17
|
|
|
18
18
|
// src/commands/history.ts
|
|
@@ -6,11 +6,11 @@ import {
|
|
|
6
6
|
parseNameFromIdentity,
|
|
7
7
|
run,
|
|
8
8
|
sessionMatchesWorkspace
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-2YP2TVDT.js";
|
|
10
|
+
import "./chunk-2WPW7OT6.js";
|
|
11
|
+
import "./chunk-YUIHSKR6.js";
|
|
12
12
|
import "./chunk-D424ZQGI.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-H7OZRFJB.js";
|
|
14
14
|
import "./chunk-K3NQKI34.js";
|
|
15
15
|
export {
|
|
16
16
|
findOpenClawSession,
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
parseArgs
|
|
4
|
+
} from "./chunk-D424ZQGI.js";
|
|
5
|
+
import "./chunk-K3NQKI34.js";
|
|
6
|
+
|
|
7
|
+
// src/commands/join.ts
|
|
8
|
+
async function run(args) {
|
|
9
|
+
const { positional, flags } = parseArgs(args, {
|
|
10
|
+
summary: { type: "string" },
|
|
11
|
+
justification: { type: "string" },
|
|
12
|
+
memory: { type: "string" },
|
|
13
|
+
"skip-verify": { type: "boolean" }
|
|
14
|
+
});
|
|
15
|
+
const variantName = positional[0];
|
|
16
|
+
if (!variantName) {
|
|
17
|
+
console.error(
|
|
18
|
+
"Usage: volute mind join <variant-name> [--summary '...'] [--justification '...'] [--memory '...'] [--skip-verify]"
|
|
19
|
+
);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
console.log(`Joining variant ${variantName}...`);
|
|
23
|
+
const { daemonFetch } = await import("./daemon-client-I42FK2BF.js");
|
|
24
|
+
const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
|
|
25
|
+
const client = getClient();
|
|
26
|
+
const statusRes = await daemonFetch(
|
|
27
|
+
urlOf(client.api.minds[":name"].$url({ param: { name: variantName } }))
|
|
28
|
+
);
|
|
29
|
+
if (!statusRes.ok) {
|
|
30
|
+
const data2 = await statusRes.json().catch(() => ({}));
|
|
31
|
+
console.error(data2.error ?? `Variant '${variantName}' not found (HTTP ${statusRes.status})`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const statusData = await statusRes.json();
|
|
35
|
+
const parentName = statusData.parent;
|
|
36
|
+
if (!parentName) {
|
|
37
|
+
console.error(`'${variantName}' is not a variant \u2014 it has no parent mind`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const res = await daemonFetch(
|
|
41
|
+
urlOf(
|
|
42
|
+
client.api.minds[":name"].variants[":variant"].merge.$url({
|
|
43
|
+
param: { name: parentName, variant: variantName }
|
|
44
|
+
})
|
|
45
|
+
),
|
|
46
|
+
{
|
|
47
|
+
method: "POST",
|
|
48
|
+
headers: { "Content-Type": "application/json" },
|
|
49
|
+
body: JSON.stringify({
|
|
50
|
+
...flags.summary && { summary: flags.summary },
|
|
51
|
+
...flags.justification && { justification: flags.justification },
|
|
52
|
+
...flags.memory && { memory: flags.memory },
|
|
53
|
+
...flags["skip-verify"] && { skipVerify: true }
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
const data = await res.json();
|
|
58
|
+
if (!res.ok) {
|
|
59
|
+
console.error(data.error ?? "Failed to join variant");
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
console.log(`Variant ${variantName} joined and cleaned up.`);
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
run
|
|
66
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolveMindName
|
|
4
|
+
} from "./chunk-NAOW2CLO.js";
|
|
5
|
+
import {
|
|
6
|
+
daemonFetch
|
|
7
|
+
} from "./chunk-JGFVMROS.js";
|
|
8
|
+
import {
|
|
9
|
+
parseArgs
|
|
10
|
+
} from "./chunk-D424ZQGI.js";
|
|
11
|
+
import "./chunk-H7OZRFJB.js";
|
|
12
|
+
import "./chunk-K3NQKI34.js";
|
|
13
|
+
|
|
14
|
+
// src/commands/chat/list.ts
|
|
15
|
+
async function run(args) {
|
|
16
|
+
const { flags } = parseArgs(args, {
|
|
17
|
+
mind: { type: "string" }
|
|
18
|
+
});
|
|
19
|
+
const mindName = resolveMindName(flags);
|
|
20
|
+
const res = await daemonFetch(`/api/minds/${encodeURIComponent(mindName)}/conversations`);
|
|
21
|
+
if (!res.ok) {
|
|
22
|
+
console.error(`Failed to list conversations: ${res.status}`);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const convs = await res.json();
|
|
26
|
+
if (convs.length === 0) {
|
|
27
|
+
console.log("No conversations.");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
for (const conv of convs) {
|
|
31
|
+
const label = conv.type === "channel" ? `#${conv.name}` : conv.title ?? conv.id.slice(0, 8);
|
|
32
|
+
const time = new Date(
|
|
33
|
+
conv.updated_at.endsWith("Z") ? conv.updated_at : `${conv.updated_at}Z`
|
|
34
|
+
).toLocaleString();
|
|
35
|
+
console.log(` ${label} (${conv.type}) ${time}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
run
|
|
40
|
+
};
|
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
} from "./chunk-SSI47XP2.js";
|
|
6
6
|
import {
|
|
7
7
|
daemonFetch
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-JGFVMROS.js";
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
} from "./chunk-
|
|
10
|
+
voluteUserHome
|
|
11
|
+
} from "./chunk-H7OZRFJB.js";
|
|
12
12
|
import "./chunk-K3NQKI34.js";
|
|
13
13
|
|
|
14
14
|
// src/commands/login.ts
|
|
@@ -32,7 +32,7 @@ async function run(_args) {
|
|
|
32
32
|
role,
|
|
33
33
|
sessionId
|
|
34
34
|
} = await res.json();
|
|
35
|
-
const sessionPath = resolve(
|
|
35
|
+
const sessionPath = resolve(voluteUserHome(), "cli-session.json");
|
|
36
36
|
try {
|
|
37
37
|
writeFileSync(sessionPath, JSON.stringify({ sessionId, username: name }), { mode: 384 });
|
|
38
38
|
} catch (err) {
|
|
@@ -1,35 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
systemsFetch
|
|
4
|
-
} from "./chunk-RWKVSSLY.js";
|
|
5
2
|
import {
|
|
6
3
|
promptLine
|
|
7
4
|
} from "./chunk-SSI47XP2.js";
|
|
8
5
|
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from "./chunk-HFCBO2GL.js";
|
|
6
|
+
daemonFetch
|
|
7
|
+
} from "./chunk-JGFVMROS.js";
|
|
12
8
|
import {
|
|
13
9
|
parseArgs
|
|
14
10
|
} from "./chunk-D424ZQGI.js";
|
|
15
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-H7OZRFJB.js";
|
|
16
12
|
import "./chunk-K3NQKI34.js";
|
|
17
13
|
|
|
18
14
|
// src/commands/pages/login.ts
|
|
19
|
-
var DEFAULT_API_URL = "https://volute.systems";
|
|
20
15
|
async function run(args) {
|
|
21
16
|
const { flags } = parseArgs(args, {
|
|
22
17
|
key: { type: "string" }
|
|
23
18
|
});
|
|
24
|
-
const existing = readSystemsConfig();
|
|
25
|
-
if (existing) {
|
|
26
|
-
console.error(`Already logged in as "${existing.system}". Run "volute auth logout" first.`);
|
|
27
|
-
process.exit(1);
|
|
28
|
-
}
|
|
29
19
|
let key = flags.key;
|
|
30
20
|
if (!key) {
|
|
31
21
|
if (!process.stdin.isTTY) {
|
|
32
|
-
console.error("Usage: volute
|
|
22
|
+
console.error("Usage: volute systems login --key <api-key>");
|
|
33
23
|
process.exit(1);
|
|
34
24
|
}
|
|
35
25
|
key = await promptLine("API key: ");
|
|
@@ -38,9 +28,10 @@ async function run(args) {
|
|
|
38
28
|
process.exit(1);
|
|
39
29
|
}
|
|
40
30
|
}
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
headers: {
|
|
31
|
+
const res = await daemonFetch("/api/system/login", {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: { "Content-Type": "application/json" },
|
|
34
|
+
body: JSON.stringify({ key })
|
|
44
35
|
});
|
|
45
36
|
if (!res.ok) {
|
|
46
37
|
const body = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
|
|
@@ -48,7 +39,6 @@ async function run(args) {
|
|
|
48
39
|
process.exit(1);
|
|
49
40
|
}
|
|
50
41
|
const { system } = await res.json();
|
|
51
|
-
writeSystemsConfig({ apiKey: key, system, apiUrl });
|
|
52
42
|
console.log(`Logged in as "${system}". Credentials saved.`);
|
|
53
43
|
}
|
|
54
44
|
export {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
daemonFetch
|
|
4
|
+
} from "./chunk-JGFVMROS.js";
|
|
5
|
+
import "./chunk-H7OZRFJB.js";
|
|
6
|
+
import "./chunk-K3NQKI34.js";
|
|
7
|
+
|
|
8
|
+
// src/commands/pages/logout.ts
|
|
9
|
+
async function run() {
|
|
10
|
+
const res = await daemonFetch("/api/system/logout", { method: "POST" });
|
|
11
|
+
if (!res.ok) {
|
|
12
|
+
const body = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
|
|
13
|
+
console.error(`Logout failed: ${body.error}`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
console.log("Logged out. Credentials removed.");
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
run
|
|
20
|
+
};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
daemonFetch
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-JGFVMROS.js";
|
|
5
5
|
import {
|
|
6
|
-
|
|
7
|
-
} from "./chunk-
|
|
6
|
+
voluteUserHome
|
|
7
|
+
} from "./chunk-H7OZRFJB.js";
|
|
8
8
|
import "./chunk-K3NQKI34.js";
|
|
9
9
|
|
|
10
10
|
// src/commands/logout.ts
|
|
11
11
|
import { existsSync, readFileSync, unlinkSync } from "fs";
|
|
12
12
|
import { resolve } from "path";
|
|
13
13
|
async function run(_args) {
|
|
14
|
-
const sessionPath = resolve(
|
|
14
|
+
const sessionPath = resolve(voluteUserHome(), "cli-session.json");
|
|
15
15
|
if (!existsSync(sessionPath)) {
|
|
16
16
|
console.log("Not logged in");
|
|
17
17
|
return;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
deliverMessage,
|
|
4
|
+
extractTextContent,
|
|
5
|
+
recordInbound
|
|
6
|
+
} from "./chunk-AAPXKR5V.js";
|
|
7
|
+
import "./chunk-IAYBDWVG.js";
|
|
8
|
+
import "./chunk-K5NAC55T.js";
|
|
9
|
+
import "./chunk-VIVMW2H2.js";
|
|
10
|
+
import "./chunk-POSXWWTA.js";
|
|
11
|
+
import "./chunk-J4IBNXGJ.js";
|
|
12
|
+
import "./chunk-2WPW7OT6.js";
|
|
13
|
+
import "./chunk-YUIHSKR6.js";
|
|
14
|
+
import "./chunk-AW7PFDVN.js";
|
|
15
|
+
import "./chunk-RKQEHRBB.js";
|
|
16
|
+
import "./chunk-IKRVFPWU.js";
|
|
17
|
+
import "./chunk-T6HKBWXZ.js";
|
|
18
|
+
import "./chunk-H7OZRFJB.js";
|
|
19
|
+
import "./chunk-K3NQKI34.js";
|
|
20
|
+
export {
|
|
21
|
+
deliverMessage,
|
|
22
|
+
extractTextContent,
|
|
23
|
+
recordInbound
|
|
24
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
logger_default
|
|
4
|
+
} from "./chunk-YUIHSKR6.js";
|
|
5
|
+
import {
|
|
6
|
+
getDb,
|
|
7
|
+
minds,
|
|
8
|
+
voluteSystemDir
|
|
9
|
+
} from "./chunk-H7OZRFJB.js";
|
|
10
|
+
import "./chunk-K3NQKI34.js";
|
|
11
|
+
|
|
12
|
+
// src/lib/migrate-registry-to-db.ts
|
|
13
|
+
import { existsSync, readFileSync, renameSync } from "fs";
|
|
14
|
+
import { resolve } from "path";
|
|
15
|
+
async function migrateRegistryToDb() {
|
|
16
|
+
const systemDir = voluteSystemDir();
|
|
17
|
+
const mindsJsonPath = resolve(systemDir, "minds.json");
|
|
18
|
+
const variantsJsonPath = resolve(systemDir, "variants.json");
|
|
19
|
+
if (!existsSync(mindsJsonPath) && !existsSync(variantsJsonPath)) return;
|
|
20
|
+
const db = await getDb();
|
|
21
|
+
let mindEntries = [];
|
|
22
|
+
let mindsParseOk = true;
|
|
23
|
+
if (existsSync(mindsJsonPath)) {
|
|
24
|
+
try {
|
|
25
|
+
mindEntries = JSON.parse(readFileSync(mindsJsonPath, "utf-8"));
|
|
26
|
+
} catch (err) {
|
|
27
|
+
mindsParseOk = false;
|
|
28
|
+
logger_default.error("failed to parse minds.json during migration", { error: err });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let allVariants = {};
|
|
32
|
+
let variantsParseOk = true;
|
|
33
|
+
if (existsSync(variantsJsonPath)) {
|
|
34
|
+
try {
|
|
35
|
+
allVariants = JSON.parse(readFileSync(variantsJsonPath, "utf-8"));
|
|
36
|
+
} catch (err) {
|
|
37
|
+
variantsParseOk = false;
|
|
38
|
+
logger_default.error("failed to parse variants.json during migration", { error: err });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
let mindFailCount = 0;
|
|
42
|
+
for (const entry of mindEntries) {
|
|
43
|
+
try {
|
|
44
|
+
await db.insert(minds).values({
|
|
45
|
+
name: entry.name,
|
|
46
|
+
port: entry.port,
|
|
47
|
+
stage: entry.stage ?? "sprouted",
|
|
48
|
+
template: entry.template ?? null,
|
|
49
|
+
template_hash: entry.templateHash ?? null,
|
|
50
|
+
running: entry.running ? 1 : 0,
|
|
51
|
+
created_at: entry.created
|
|
52
|
+
}).onConflictDoNothing();
|
|
53
|
+
} catch (err) {
|
|
54
|
+
mindFailCount++;
|
|
55
|
+
logger_default.warn(`failed to migrate mind ${entry.name} to DB`, { error: err });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
let variantFailCount = 0;
|
|
59
|
+
for (const [mindName, variants] of Object.entries(allVariants)) {
|
|
60
|
+
for (const v of variants) {
|
|
61
|
+
try {
|
|
62
|
+
await db.insert(minds).values({
|
|
63
|
+
name: `${mindName}@${v.name}`,
|
|
64
|
+
port: v.port,
|
|
65
|
+
parent: mindName,
|
|
66
|
+
dir: v.path,
|
|
67
|
+
branch: v.branch,
|
|
68
|
+
running: v.running ? 1 : 0,
|
|
69
|
+
created_at: v.created
|
|
70
|
+
}).onConflictDoNothing();
|
|
71
|
+
} catch (err) {
|
|
72
|
+
variantFailCount++;
|
|
73
|
+
logger_default.warn(`failed to migrate variant ${mindName}@${v.name} to DB`, { error: err });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (mindFailCount > 0) {
|
|
78
|
+
logger_default.error(`${mindFailCount} mind(s) failed to migrate \u2014 minds.json will not be renamed`);
|
|
79
|
+
}
|
|
80
|
+
if (variantFailCount > 0) {
|
|
81
|
+
logger_default.error(
|
|
82
|
+
`${variantFailCount} variant(s) failed to migrate \u2014 variants.json will not be renamed`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
if (mindsParseOk && mindFailCount === 0) {
|
|
86
|
+
try {
|
|
87
|
+
if (existsSync(mindsJsonPath)) {
|
|
88
|
+
renameSync(mindsJsonPath, `${mindsJsonPath}.bak`);
|
|
89
|
+
}
|
|
90
|
+
} catch (err) {
|
|
91
|
+
logger_default.warn("failed to rename minds.json to .bak", { error: err });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (variantsParseOk && variantFailCount === 0) {
|
|
95
|
+
try {
|
|
96
|
+
if (existsSync(variantsJsonPath)) {
|
|
97
|
+
renameSync(variantsJsonPath, `${variantsJsonPath}.bak`);
|
|
98
|
+
}
|
|
99
|
+
} catch (err) {
|
|
100
|
+
logger_default.warn("failed to rename variants.json to .bak", { error: err });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const count = mindEntries.length + Object.values(allVariants).flat().length;
|
|
104
|
+
if (count > 0) {
|
|
105
|
+
logger_default.info(`migrated ${count} entries from JSON to DB`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export {
|
|
109
|
+
migrateRegistryToDb
|
|
110
|
+
};
|
|
@@ -6,63 +6,58 @@ async function run(args) {
|
|
|
6
6
|
const subcommand = args[0];
|
|
7
7
|
switch (subcommand) {
|
|
8
8
|
case "create":
|
|
9
|
-
await import("./create-
|
|
9
|
+
await import("./create-QWV73WXD.js").then((m) => m.run(args.slice(1)));
|
|
10
10
|
break;
|
|
11
11
|
case "start":
|
|
12
|
-
await import("./start-
|
|
12
|
+
await import("./start-EUJSS5R4.js").then((m) => m.run(args.slice(1)));
|
|
13
13
|
break;
|
|
14
14
|
case "stop":
|
|
15
|
-
await import("./stop-
|
|
15
|
+
await import("./stop-3XAITBBF.js").then((m) => m.run(args.slice(1)));
|
|
16
16
|
break;
|
|
17
17
|
case "restart":
|
|
18
|
-
await import("./restart-
|
|
18
|
+
await import("./restart-6ESL3NBO.js").then((m) => m.run(args.slice(1)));
|
|
19
19
|
break;
|
|
20
20
|
case "delete":
|
|
21
|
-
await import("./delete-
|
|
21
|
+
await import("./delete-4JYGD4VN.js").then((m) => m.run(args.slice(1)));
|
|
22
22
|
break;
|
|
23
23
|
case "list":
|
|
24
|
-
await import("./
|
|
24
|
+
await import("./mind-list-UPJ75GPI.js").then((m) => m.run(args.slice(1)));
|
|
25
25
|
break;
|
|
26
|
-
case "status":
|
|
27
|
-
|
|
28
|
-
if (!rest[0] && process.env.VOLUTE_MIND) {
|
|
29
|
-
rest.unshift(process.env.VOLUTE_MIND);
|
|
30
|
-
}
|
|
31
|
-
await import("./status-FZBEBM7Q.js").then((m) => m.run(rest));
|
|
26
|
+
case "status":
|
|
27
|
+
await import("./mind-status-TK5AETEM.js").then((m) => m.run(args.slice(1)));
|
|
32
28
|
break;
|
|
33
|
-
|
|
34
|
-
case "logs": {
|
|
29
|
+
case "history": {
|
|
35
30
|
const rest = args.slice(1);
|
|
36
|
-
const
|
|
37
|
-
await import("./
|
|
31
|
+
const historyArgs = transformMindFlag(rest);
|
|
32
|
+
await import("./history-ALPTNB3I.js").then((m) => m.run(historyArgs));
|
|
38
33
|
break;
|
|
39
34
|
}
|
|
40
35
|
case "upgrade":
|
|
41
|
-
await import("./upgrade-
|
|
36
|
+
await import("./upgrade-HA47CS4C.js").then((m) => m.run(args.slice(1)));
|
|
42
37
|
break;
|
|
43
38
|
case "import":
|
|
44
|
-
await import("./import-
|
|
39
|
+
await import("./import-SRTQXBGH.js").then((m) => m.run(args.slice(1)));
|
|
45
40
|
break;
|
|
46
41
|
case "export":
|
|
47
|
-
await import("./export-
|
|
48
|
-
break;
|
|
49
|
-
case "connect":
|
|
50
|
-
await import("./connector-G722WXAU.js").then((m) => m.run(["connect", ...args.slice(1)]));
|
|
51
|
-
break;
|
|
52
|
-
case "disconnect":
|
|
53
|
-
await import("./connector-G722WXAU.js").then((m) => m.run(["disconnect", ...args.slice(1)]));
|
|
42
|
+
await import("./export-BOJQWBMA.js").then((m) => m.run(args.slice(1)));
|
|
54
43
|
break;
|
|
55
44
|
case "seed":
|
|
56
|
-
await import("./seed-
|
|
45
|
+
await import("./seed-SSUCYYDF.js").then((m) => m.run(args.slice(1)));
|
|
57
46
|
break;
|
|
58
47
|
case "sprout":
|
|
59
|
-
await import("./sprout-
|
|
48
|
+
await import("./sprout-UNT7LKKE.js").then((m) => m.run(args.slice(1)));
|
|
60
49
|
break;
|
|
61
50
|
case "sleep":
|
|
62
|
-
await import("./mind-sleep-
|
|
51
|
+
await import("./mind-sleep-BTSWQNAC.js").then((m) => m.run(args.slice(1)));
|
|
63
52
|
break;
|
|
64
53
|
case "wake":
|
|
65
|
-
await import("./mind-wake-
|
|
54
|
+
await import("./mind-wake-SBAKIDVP.js").then((m) => m.run(args.slice(1)));
|
|
55
|
+
break;
|
|
56
|
+
case "split":
|
|
57
|
+
await import("./split-TKJ5OT3P.js").then((m) => m.run(args.slice(1)));
|
|
58
|
+
break;
|
|
59
|
+
case "join":
|
|
60
|
+
await import("./join-J4QU42DL.js").then((m) => m.run(args.slice(1)));
|
|
66
61
|
break;
|
|
67
62
|
case "--help":
|
|
68
63
|
case "-h":
|
|
@@ -90,15 +85,15 @@ function printUsage() {
|
|
|
90
85
|
volute mind delete [name] [--force]
|
|
91
86
|
volute mind list
|
|
92
87
|
volute mind status [name]
|
|
93
|
-
volute mind
|
|
94
|
-
volute mind connect <type> [--mind <name>]
|
|
95
|
-
volute mind disconnect <type> [--mind <name>]
|
|
88
|
+
volute mind history [name] [--channel <ch>] [--limit N] [--full]
|
|
96
89
|
volute mind sprout
|
|
97
90
|
volute mind sleep [name] [--wake-at <time>]
|
|
98
91
|
volute mind wake [name]
|
|
99
|
-
volute mind
|
|
92
|
+
volute mind split <name> [--from <mind>] [--soul "..."] [--port N] [--no-start] [--json]
|
|
93
|
+
volute mind join <variant-name> [--summary "..." --justification "..." --memory "..."] [--skip-verify]
|
|
94
|
+
volute mind upgrade [name] [--template <name>] [--continue] [--accept]
|
|
100
95
|
volute mind import <path> [--name <name>] [--session <path>] [--template <name>]
|
|
101
|
-
volute mind export <name> [--include-env] [--include-identity] [--include-
|
|
96
|
+
volute mind export <name> [--include-env] [--include-identity] [--include-history] [--include-sessions] [--all] [--output <path>]
|
|
102
97
|
|
|
103
98
|
Mind name can be omitted (where shown as [name]) if VOLUTE_MIND is set.`);
|
|
104
99
|
}
|
|
@@ -4,11 +4,10 @@ import {
|
|
|
4
4
|
markIdle,
|
|
5
5
|
onMindEvent,
|
|
6
6
|
stopAll
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-WBHMQ5OZ.js";
|
|
7
|
+
} from "./chunk-K5NAC55T.js";
|
|
8
|
+
import "./chunk-VIVMW2H2.js";
|
|
10
9
|
import "./chunk-YUIHSKR6.js";
|
|
11
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-H7OZRFJB.js";
|
|
12
11
|
import "./chunk-K3NQKI34.js";
|
|
13
12
|
export {
|
|
14
13
|
getActiveMinds,
|