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.
Files changed (141) hide show
  1. package/README.md +18 -18
  2. package/dist/accept-666DIZX2.js +41 -0
  3. package/dist/{activity-events-ZMBAKLUF.js → activity-events-BBIEA2F4.js} +2 -3
  4. package/dist/api.d.ts +510 -299
  5. package/dist/{archive-4ZQYK5MN.js → archive-UA4BDFXQ.js} +2 -2
  6. package/dist/bridge-FQHZL3MC.js +206 -0
  7. package/dist/chat-M4SX42JD.js +68 -0
  8. package/dist/{chunk-PHU4DEAJ.js → chunk-2WPW7OT6.js} +3 -3
  9. package/dist/{chunk-5Y3PBKW6.js → chunk-2YP2TVDT.js} +138 -56
  10. package/dist/{chunk-3CFRE2VC.js → chunk-AAPXKR5V.js} +435 -1090
  11. package/dist/{chunk-YJA7P64S.js → chunk-AW7PFDVN.js} +5 -5
  12. package/dist/{chunk-OZFKBXD6.js → chunk-EHYDTZTF.js} +6 -6
  13. package/dist/{chunk-WBHMQ5OZ.js → chunk-H7OZRFJB.js} +192 -12
  14. package/dist/{chunk-ON3FF5JA.js → chunk-HDN7MNGD.js} +3 -3
  15. package/dist/chunk-IAYBDWVG.js +477 -0
  16. package/dist/{chunk-TZKJLDQN.js → chunk-IKRVFPWU.js} +14 -9
  17. package/dist/{chunk-UTL75LP6.js → chunk-J4IBNXGJ.js} +20 -22
  18. package/dist/{chunk-WGOGUMPO.js → chunk-JGFVMROS.js} +13 -6
  19. package/dist/{chunk-NWI2425I.js → chunk-K5NAC55T.js} +1 -1
  20. package/dist/chunk-KTLFDYPT.js +61 -0
  21. package/dist/{chunk-V63B7DX3.js → chunk-LAC664WU.js} +7 -4
  22. package/dist/chunk-MD4C26II.js +128 -0
  23. package/dist/{chunk-USNBKHYG.js → chunk-NI5FFCCS.js} +12 -7
  24. package/dist/{chunk-3TV4GLFO.js → chunk-P72MVS4R.js} +4 -43
  25. package/dist/{chunk-2VO7453N.js → chunk-POSXWWTA.js} +30 -54
  26. package/dist/{chunk-XOXLRRR2.js → chunk-RKQEHRBB.js} +4 -3
  27. package/dist/{chunk-LX22GRG7.js → chunk-SGVNFZHW.js} +11 -8
  28. package/dist/chunk-T6HKBWXZ.js +23 -0
  29. package/dist/{chunk-J2CO4WEV.js → chunk-VIVMW2H2.js} +4 -4
  30. package/dist/{chunk-KTJGZ7M7.js → chunk-XBLSAVJF.js} +1 -1
  31. package/dist/cli.js +32 -49
  32. package/dist/{cloud-sync-NI2K3C7G.js → cloud-sync-HDL6PHZI.js} +14 -14
  33. package/dist/connectors/discord-bridge.js +158 -0
  34. package/dist/connectors/slack-bridge.js +119 -0
  35. package/dist/connectors/telegram-bridge.js +133 -0
  36. package/dist/conversations-M2K4253F.js +55 -0
  37. package/dist/create-D7J73A6H.js +45 -0
  38. package/dist/{create-4YBRTTJS.js → create-QWV73WXD.js} +1 -1
  39. package/dist/{daemon-client-Z7FAJ6JW.js → daemon-client-I42FK2BF.js} +2 -2
  40. package/dist/{daemon-restart-BJZ3O4U4.js → daemon-restart-G4B2OYAB.js} +7 -7
  41. package/dist/daemon.js +1889 -1216
  42. package/dist/db-IC4J52XQ.js +8 -0
  43. package/dist/{delete-27OYNK25.js → delete-4JYGD4VN.js} +1 -1
  44. package/dist/down-LVBXEULC.js +14 -0
  45. package/dist/{env-M336ONDP.js → env-YJMUMFIY.js} +2 -2
  46. package/dist/{export-HP4G5DQC.js → export-BOJQWBMA.js} +4 -4
  47. package/dist/files-M546TKVN.js +46 -0
  48. package/dist/{history-B64GTFTD.js → history-ALPTNB3I.js} +5 -5
  49. package/dist/{import-XIB7UV4S.js → import-SRTQXBGH.js} +4 -4
  50. package/dist/join-J4QU42DL.js +66 -0
  51. package/dist/list-R73GENNL.js +40 -0
  52. package/dist/{login-B5E7N7MY.js → login-3QZNR2DF.js} +4 -4
  53. package/dist/{login-6U7U6BNG.js → login-BKP3AFWN.js} +8 -18
  54. package/dist/logout-IQK7FNEK.js +20 -0
  55. package/dist/{logout-XSJRYS3U.js → logout-T53VKCPU.js} +4 -4
  56. package/dist/message-delivery-HV3S6HZV.js +24 -0
  57. package/dist/migrate-registry-to-db-XC7T5B7P.js +110 -0
  58. package/dist/{mind-HZ3QSDDJ.js → mind-S5V6CK5W.js} +29 -34
  59. package/dist/{mind-activity-tracker-4G6FURY2.js → mind-activity-tracker-EN6XNXPF.js} +3 -4
  60. package/dist/mind-list-UPJ75GPI.js +29 -0
  61. package/dist/mind-manager-S6ILZVX3.js +18 -0
  62. package/dist/{mind-sleep-DTV7L44D.js → mind-sleep-BTSWQNAC.js} +4 -4
  63. package/dist/mind-status-TK5AETEM.js +55 -0
  64. package/dist/{mind-wake-PFN4FN3T.js → mind-wake-SBAKIDVP.js} +4 -4
  65. package/dist/{notes-37FW2UR2.js → notes-XCER3I7M.js} +11 -21
  66. package/dist/{package-VZWLXPHV.js → package-CG4RWUGP.js} +1 -1
  67. package/dist/{pages-DIIT5HMQ.js → pages-KJDJX4TA.js} +5 -5
  68. package/dist/{publish-HQV7YREB.js → publish-ZZB33WP4.js} +9 -20
  69. package/dist/read-36UFXN3G.js +46 -0
  70. package/dist/{register-EFND67FQ.js → register-CHREOMJ3.js} +6 -25
  71. package/dist/{registry-D2BSQ2X5.js → registry-NDNOOYG4.js} +15 -9
  72. package/dist/reject-LXIZFJ4Q.js +39 -0
  73. package/dist/{restart-CCK7D6TV.js → restart-6ESL3NBO.js} +5 -5
  74. package/dist/{sandbox-EHGFF52K.js → sandbox-5BW5HPXM.js} +3 -3
  75. package/dist/{schedule-6F7ELB2M.js → schedule-QTJMFATP.js} +5 -5
  76. package/dist/{seed-E5OQGWX3.js → seed-SSUCYYDF.js} +2 -2
  77. package/dist/{send-IH6XZKPC.js → send-TAOEZ4NH.js} +87 -23
  78. package/dist/{setup-YGAAIKKZ.js → setup-JHL5ZEST.js} +2 -2
  79. package/dist/{setup-F6TWFYGQ.js → setup-RXYVGGT7.js} +9 -9
  80. package/dist/{skill-42LGFBQC.js → skill-AUAQTSP5.js} +5 -5
  81. package/dist/skills/dreaming/references/INSTALL.md +2 -2
  82. package/dist/skills/orientation/SKILL.md +3 -3
  83. package/dist/skills/shared-files/SKILL.md +44 -0
  84. package/dist/skills/shared-files/scripts/merge.ts +72 -0
  85. package/dist/skills/shared-files/scripts/pull.ts +52 -0
  86. package/dist/skills/volute-mind/SKILL.md +35 -34
  87. package/dist/sleep-manager-WMVG2VCL.js +28 -0
  88. package/dist/split-TKJ5OT3P.js +63 -0
  89. package/dist/{sprout-QL74KR2X.js → sprout-UNT7LKKE.js} +6 -7
  90. package/dist/{start-O5JQASRC.js → start-EUJSS5R4.js} +2 -2
  91. package/dist/status-NQJYR4BG.js +114 -0
  92. package/dist/{status-LV34BG6G.js → status-S7UUPNRW.js} +4 -14
  93. package/dist/{stop-2SOG5NYF.js → stop-3XAITBBF.js} +5 -5
  94. package/dist/systems-SMEFSHTA.js +60 -0
  95. package/dist/{tailscale-AJ4VL5XK.js → tailscale-NY5MUMY3.js} +1 -1
  96. package/dist/up-GM2JOH2Y.js +17 -0
  97. package/dist/{update-5VUDAI3D.js → update-PTSH22AZ.js} +9 -9
  98. package/dist/{update-check-F5Z3ALXX.js → update-check-64FWC4Y2.js} +2 -2
  99. package/dist/{upgrade-QCCO33BK.js → upgrade-HA47CS4C.js} +12 -5
  100. package/dist/variant-7TGZHOU3.js +41 -0
  101. package/dist/{version-notify-USFZBWMG.js → version-notify-JDUF4HQJ.js} +24 -29
  102. package/dist/web-assets/assets/index-BZGvToHi.css +1 -0
  103. package/dist/web-assets/assets/index-Cz4TrpzB.js +75 -0
  104. package/dist/web-assets/favicon.png +0 -0
  105. package/dist/web-assets/index.html +2 -2
  106. package/drizzle/0017_minds.sql +16 -0
  107. package/drizzle/meta/_journal.json +7 -0
  108. package/package.json +1 -1
  109. package/templates/_base/.init/.config/prompts.json +2 -2
  110. package/templates/_base/home/VOLUTE.md +5 -5
  111. package/templates/_base/src/lib/logger.ts +0 -4
  112. package/templates/_base/src/lib/startup.ts +2 -2
  113. package/dist/auth-4TV573WE.js +0 -37
  114. package/dist/channel-ZVZV42UD.js +0 -260
  115. package/dist/chunk-B2CPS4QU.js +0 -283
  116. package/dist/chunk-HFCBO2GL.js +0 -50
  117. package/dist/chunk-RWKVSSLY.js +0 -26
  118. package/dist/chunk-SIAG3QMM.js +0 -42
  119. package/dist/chunk-WSLPZF72.js +0 -173
  120. package/dist/connector-G722WXAU.js +0 -147
  121. package/dist/connectors/discord.js +0 -177
  122. package/dist/connectors/slack.js +0 -181
  123. package/dist/connectors/telegram.js +0 -187
  124. package/dist/down-7UKFMJJZ.js +0 -14
  125. package/dist/file-HUDKTRAS.js +0 -204
  126. package/dist/log-PBFNILJ4.js +0 -39
  127. package/dist/logout-UKD5LA37.js +0 -18
  128. package/dist/logs-3CART7O7.js +0 -77
  129. package/dist/merge-VK2HSKMA.js +0 -46
  130. package/dist/message-delivery-MS5JYPZX.js +0 -25
  131. package/dist/mind-manager-VVK67AY3.js +0 -19
  132. package/dist/pull-2MB4SK3C.js +0 -39
  133. package/dist/service-LLBV3R7M.js +0 -122
  134. package/dist/shared-UMO4S7CC.js +0 -39
  135. package/dist/sleep-manager-EE4NRN2Q.js +0 -29
  136. package/dist/status-FZBEBM7Q.js +0 -70
  137. package/dist/status-WXD4HXRL.js +0 -35
  138. package/dist/up-SDMCSVI3.js +0 -17
  139. package/dist/variant-WWLDY6D5.js +0 -207
  140. package/dist/web-assets/assets/index-CUQ31ieL.js +0 -69
  141. package/dist/web-assets/assets/index-CW8NSl1o.css +0 -1
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getDb
4
+ } from "./chunk-H7OZRFJB.js";
5
+ import "./chunk-K3NQKI34.js";
6
+ export {
7
+ getDb
8
+ };
@@ -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-Z7FAJ6JW.js");
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-WGOGUMPO.js";
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-B2CPS4QU.js";
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-KTJGZ7M7.js";
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-B2CPS4QU.js";
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-Z7FAJ6JW.js");
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-WGOGUMPO.js";
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-B2CPS4QU.js";
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-5Y3PBKW6.js";
10
- import "./chunk-SIAG3QMM.js";
11
- import "./chunk-PHU4DEAJ.js";
9
+ } from "./chunk-2YP2TVDT.js";
10
+ import "./chunk-2WPW7OT6.js";
11
+ import "./chunk-YUIHSKR6.js";
12
12
  import "./chunk-D424ZQGI.js";
13
- import "./chunk-B2CPS4QU.js";
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-WGOGUMPO.js";
8
+ } from "./chunk-JGFVMROS.js";
9
9
  import {
10
- voluteHome
11
- } from "./chunk-B2CPS4QU.js";
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(voluteHome(), "cli-session.json");
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
- readSystemsConfig,
10
- writeSystemsConfig
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-B2CPS4QU.js";
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 auth login --key <api-key>");
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 apiUrl = process.env.VOLUTE_SYSTEMS_URL || DEFAULT_API_URL;
42
- const res = await systemsFetch(`${apiUrl}/api/whoami`, {
43
- headers: { Authorization: `Bearer ${key}` }
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-WGOGUMPO.js";
4
+ } from "./chunk-JGFVMROS.js";
5
5
  import {
6
- voluteHome
7
- } from "./chunk-B2CPS4QU.js";
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(voluteHome(), "cli-session.json");
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-4YBRTTJS.js").then((m) => m.run(args.slice(1)));
9
+ await import("./create-QWV73WXD.js").then((m) => m.run(args.slice(1)));
10
10
  break;
11
11
  case "start":
12
- await import("./start-O5JQASRC.js").then((m) => m.run(args.slice(1)));
12
+ await import("./start-EUJSS5R4.js").then((m) => m.run(args.slice(1)));
13
13
  break;
14
14
  case "stop":
15
- await import("./stop-2SOG5NYF.js").then((m) => m.run(args.slice(1)));
15
+ await import("./stop-3XAITBBF.js").then((m) => m.run(args.slice(1)));
16
16
  break;
17
17
  case "restart":
18
- await import("./restart-CCK7D6TV.js").then((m) => m.run(args.slice(1)));
18
+ await import("./restart-6ESL3NBO.js").then((m) => m.run(args.slice(1)));
19
19
  break;
20
20
  case "delete":
21
- await import("./delete-27OYNK25.js").then((m) => m.run(args.slice(1)));
21
+ await import("./delete-4JYGD4VN.js").then((m) => m.run(args.slice(1)));
22
22
  break;
23
23
  case "list":
24
- await import("./status-FZBEBM7Q.js").then((m) => m.run(args.slice(1)));
24
+ await import("./mind-list-UPJ75GPI.js").then((m) => m.run(args.slice(1)));
25
25
  break;
26
- case "status": {
27
- const rest = args.slice(1);
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 logsArgs = transformMindFlag(rest);
37
- await import("./logs-3CART7O7.js").then((m) => m.run(logsArgs));
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-QCCO33BK.js").then((m) => m.run(args.slice(1)));
36
+ await import("./upgrade-HA47CS4C.js").then((m) => m.run(args.slice(1)));
42
37
  break;
43
38
  case "import":
44
- await import("./import-XIB7UV4S.js").then((m) => m.run(args.slice(1)));
39
+ await import("./import-SRTQXBGH.js").then((m) => m.run(args.slice(1)));
45
40
  break;
46
41
  case "export":
47
- await import("./export-HP4G5DQC.js").then((m) => m.run(args.slice(1)));
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-E5OQGWX3.js").then((m) => m.run(args.slice(1)));
45
+ await import("./seed-SSUCYYDF.js").then((m) => m.run(args.slice(1)));
57
46
  break;
58
47
  case "sprout":
59
- await import("./sprout-QL74KR2X.js").then((m) => m.run(args.slice(1)));
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-DTV7L44D.js").then((m) => m.run(args.slice(1)));
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-PFN4FN3T.js").then((m) => m.run(args.slice(1)));
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 logs [name] [--follow] [-n N]
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 upgrade [name] [--template <name>] [--continue]
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-connectors] [--include-history] [--include-sessions] [--all] [--output <path>]
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-NWI2425I.js";
8
- import "./chunk-J2CO4WEV.js";
9
- import "./chunk-WBHMQ5OZ.js";
7
+ } from "./chunk-K5NAC55T.js";
8
+ import "./chunk-VIVMW2H2.js";
10
9
  import "./chunk-YUIHSKR6.js";
11
- import "./chunk-B2CPS4QU.js";
10
+ import "./chunk-H7OZRFJB.js";
12
11
  import "./chunk-K3NQKI34.js";
13
12
  export {
14
13
  getActiveMinds,