volute 0.31.0 → 0.32.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 (178) hide show
  1. package/README.md +15 -22
  2. package/dist/{accept-GAKQ3MEH.js → accept-74M7I4RZ.js} +3 -2
  3. package/dist/{activity-events-T5ZRCVAL.js → activity-events-HETAODOK.js} +3 -2
  4. package/dist/{ai-service-UWUPM4T6.js → ai-service-ZIPCV3MX.js} +18 -5
  5. package/dist/api.d.ts +98 -281
  6. package/dist/{archive-YBNSJYZZ.js → archive-INXYFVCW.js} +3 -2
  7. package/dist/{auth-T5AW2USD.js → auth-6DMGES3I.js} +4 -3
  8. package/dist/{bridge-4AJ3EY26.js → bridge-BVCBTGPF.js} +3 -2
  9. package/dist/{chat-7YLT7FI3.js → chat-XT4OBJBU.js} +8 -8
  10. package/dist/{chunk-BNC43CSY.js → chunk-2FLJ63GU.js} +2 -2
  11. package/dist/{chunk-NV3TYNWX.js → chunk-2NGTS5UU.js} +1 -1
  12. package/dist/{chunk-LX6T3GKQ.js → chunk-ALEF47VT.js} +1 -1
  13. package/dist/{chunk-S2TZLSDH.js → chunk-D5G5YOPL.js} +163 -15
  14. package/dist/{chunk-VGWJSNHS.js → chunk-G53F3JA4.js} +1 -35
  15. package/dist/{chunk-A6TUJJ3L.js → chunk-G6BSYHPK.js} +2 -2
  16. package/dist/{chunk-BC3P3QCK.js → chunk-I5KY25PQ.js} +1 -9
  17. package/dist/{chunk-PNQCXLSV.js → chunk-IYDIE3HG.js} +58 -1
  18. package/dist/{chunk-HDKY4TWU.js → chunk-JJ7W6WSB.js} +3 -3
  19. package/dist/{chunk-57OKQMP3.js → chunk-LGB6JBHI.js} +1 -1
  20. package/dist/chunk-LRCG2JLP.js +251 -0
  21. package/dist/{chunk-SNVPRRT7.js → chunk-LSGWR54X.js} +2 -2
  22. package/dist/{chunk-EMPFLFTG.js → chunk-M7UL5S3Q.js} +1 -1
  23. package/dist/chunk-PB65JZK2.js +85 -0
  24. package/dist/chunk-PVY5W6QN.js +41 -0
  25. package/dist/{chunk-BWKIHH7B.js → chunk-QBQ424EM.js} +318 -418
  26. package/dist/{chunk-EKDWA7E4.js → chunk-QZANELPX.js} +4 -2
  27. package/dist/{chunk-AAO77TZX.js → chunk-R7E6CRVQ.js} +1 -1
  28. package/dist/{chunk-X62AXPR7.js → chunk-RPZZSXV3.js} +8 -196
  29. package/dist/{chunk-WRS3B556.js → chunk-RSX4OPZY.js} +5 -5
  30. package/dist/{chunk-FAHDKPEH.js → chunk-S6NFERDC.js} +5 -3
  31. package/dist/chunk-SKLSMHXO.js +208 -0
  32. package/dist/{chunk-DAXJKPHZ.js → chunk-SX5TKJBZ.js} +2 -2
  33. package/dist/{chunk-R5QJBZZG.js → chunk-TDRYEPH4.js} +20 -10
  34. package/dist/{chunk-6QIUN46C.js → chunk-TSXLLQZW.js} +11 -3
  35. package/dist/{chunk-4OUOFS23.js → chunk-UKVWJRKN.js} +1 -1
  36. package/dist/{chunk-NOWVQ7AL.js → chunk-WKF5FEFK.js} +318 -167
  37. package/dist/cli.js +38 -20
  38. package/dist/{clock-LJCG426D.js → clock-2UOZ6JPU.js} +5 -4
  39. package/dist/{cloud-sync-O3LXIRN6.js → cloud-sync-JN3NWKEM.js} +16 -14
  40. package/dist/config-H2H4UIF7.js +72 -0
  41. package/dist/connectors/discord-bridge.js +1 -1
  42. package/dist/connectors/slack-bridge.js +1 -1
  43. package/dist/connectors/telegram-bridge.js +1 -1
  44. package/dist/{conversations-RKKGP5IA.js → conversations-3O5O6AS3.js} +4 -3
  45. package/dist/{create-WUTIIRI2.js → create-RNLNCORE.js} +3 -2
  46. package/dist/{create-TL623TFC.js → create-WBBYI6V7.js} +6 -2
  47. package/dist/{daemon-client-CVGM25DM.js → daemon-client-6QXHZ7US.js} +3 -2
  48. package/dist/{daemon-restart-EZP7XH3V.js → daemon-restart-NGFHFAUF.js} +7 -6
  49. package/dist/daemon.js +907 -612
  50. package/dist/{db-SW5PL6QA.js → db-F34YLV7D.js} +2 -1
  51. package/dist/db-RA45JBFG.js +16 -0
  52. package/dist/{delete-Z6HAG35F.js → delete-QTGWEDBI.js} +1 -1
  53. package/dist/delivery-manager-SDVXFD4W.js +28 -0
  54. package/dist/delivery-router-FL45JL7N.js +21 -0
  55. package/dist/down-TB3ESMNP.js +14 -0
  56. package/dist/{env-NHESNNSP.js → env-RLYQBOOP.js} +3 -2
  57. package/dist/{export-EVMP7GWY.js → export-SUYRLI5Q.js} +4 -3
  58. package/dist/{extension-LR7EW3JF.js → extension-FQ5D3NCC.js} +4 -3
  59. package/dist/{extensions-NGEJI7JH.js → extensions-GDYWQXC4.js} +9 -7
  60. package/dist/{files-3SM7V33S.js → files-EAMPO2SJ.js} +4 -3
  61. package/dist/{history-PQD3LXEP.js → history-FO5PHBQ5.js} +7 -2
  62. package/dist/{import-PR2OCGQJ.js → import-DDUFE7AY.js} +4 -3
  63. package/dist/{join-R4EN5CWQ.js → join-I5QEE3LG.js} +1 -1
  64. package/dist/{list-B4XNUOFO.js → list-DW2VRTOZ.js} +3 -2
  65. package/dist/{login-62JVY6A2.js → login-7CHPW2PN.js} +3 -2
  66. package/dist/{login-URWP6S2N.js → login-RIJF2F4G.js} +3 -2
  67. package/dist/{logout-NXJQJDLI.js → logout-5MLHZALK.js} +3 -2
  68. package/dist/{logout-ZK2N62T3.js → logout-UZJRGY4Z.js} +3 -2
  69. package/dist/message-delivery-2FIM7QKO.js +32 -0
  70. package/dist/{mind-E2ZV2WRX.js → mind-2B6M7Y25.js} +18 -18
  71. package/dist/{mind-activity-tracker-ASNZBMLC.js → mind-activity-tracker-NZZT2NTT.js} +4 -3
  72. package/dist/{mind-list-BEI7E5WY.js → mind-list-WUPMQDYQ.js} +3 -2
  73. package/dist/mind-manager-BNCMGYXW.js +28 -0
  74. package/dist/mind-service-AV273WT4.js +34 -0
  75. package/dist/{mind-sleep-CANABWJI.js → mind-sleep-B7BHJLH7.js} +3 -2
  76. package/dist/{mind-status-6WKZVUOP.js → mind-status-L3EFFRPR.js} +3 -2
  77. package/dist/{mind-wake-RZKLH2IN.js → mind-wake-GY3RFX7Y.js} +3 -2
  78. package/dist/{package-NU4CA7OU.js → package-PK6JUFL3.js} +1 -1
  79. package/dist/{read-THL362EI.js → read-5AMJRO3D.js} +3 -2
  80. package/dist/{register-QAQELAS6.js → register-V2JZZKFK.js} +3 -2
  81. package/dist/{registry-ASXCQCNH.js → registry-PJ4S5PHQ.js} +8 -1
  82. package/dist/{reject-AYPBNPNL.js → reject-33HEZMZ4.js} +3 -2
  83. package/dist/{restart-6SKPV3T2.js → restart-3UCMRUVC.js} +3 -2
  84. package/dist/{sandbox-6ZEWQDVU.js → sandbox-JANNTX6U.js} +4 -3
  85. package/dist/schema-PA3M5ZKH.js +32 -0
  86. package/dist/{seed-OWX2AW75.js → seed-ALUQ55FF.js} +26 -9
  87. package/dist/{send-ZO4BTWXK.js → send-3MI36LEF.js} +56 -67
  88. package/dist/{setup-7CFITEQN.js → setup-SZIARWI6.js} +5 -2
  89. package/dist/{setup-ZXBXG7E4.js → setup-WENLVPVP.js} +8 -6
  90. package/dist/{skill-YFXP67A2.js → skill-TUVOTW4Z.js} +3 -2
  91. package/dist/skills/dreaming/SKILL.md +6 -4
  92. package/dist/skills/dreaming/references/INSTALL.md +2 -2
  93. package/dist/skills/dreaming/scripts/dream.ts +2 -2
  94. package/dist/skills/dreaming/scripts/wake-context-dreams.sh +1 -1
  95. package/dist/skills/imagegen/SKILL.md +6 -5
  96. package/dist/skills/imagegen/references/INSTALL.md +1 -1
  97. package/dist/skills/resonance/SKILL.md +4 -1
  98. package/dist/skills/resonance/references/INSTALL.md +2 -2
  99. package/dist/skills/resonance/scripts/resonance-hook.sh +2 -0
  100. package/dist/skills/resonance/scripts/resonance.ts +35 -5
  101. package/dist/skills/volute-admin/SKILL.md +83 -0
  102. package/dist/skills/volute-mind/SKILL.md +11 -11
  103. package/dist/skills-XNZK6P4K.js +61 -0
  104. package/dist/sleep-manager-53DZOWW7.js +32 -0
  105. package/dist/spirit-N4W4UQRH.js +217 -0
  106. package/dist/{split-MI62KJUU.js → split-STOROBYJ.js} +1 -1
  107. package/dist/{sprout-FDVI2CGN.js → sprout-L2GFOVF7.js} +9 -7
  108. package/dist/{start-D64BRKPH.js → start-K2NCUUCG.js} +3 -2
  109. package/dist/{status-ZZWBYFGE.js → status-TCUMUO6M.js} +5 -4
  110. package/dist/{stop-OP2CTXCO.js → stop-H26JZDXF.js} +3 -2
  111. package/dist/system-chat-NPYFYZVI.js +32 -0
  112. package/dist/{systems-EQPPT4B7.js → systems-DHBKVYEY.js} +6 -5
  113. package/dist/{tailscale-6DJKUMNF.js → tailscale-XHQBZROW.js} +2 -1
  114. package/dist/{template-hash-3HOR4UAJ.js → template-hash-A6VVKOXJ.js} +2 -1
  115. package/dist/up-6I6BHRTO.js +17 -0
  116. package/dist/{update-KUJXATRS.js → update-QVPRF6GR.js} +5 -4
  117. package/dist/{update-check-5WVSU37T.js → update-check-ZD6OOIYQ.js} +3 -2
  118. package/dist/{upgrade-KBHCWX6T.js → upgrade-O4Q7WJM3.js} +12 -14
  119. package/dist/{version-notify-75ELVKPV.js → version-notify-TCKWBZZG.js} +21 -18
  120. package/dist/web-assets/assets/index-Bui7U9Uu.css +1 -0
  121. package/dist/web-assets/assets/index-e36DIo1b.js +73 -0
  122. package/dist/web-assets/ext-theme.css +93 -0
  123. package/dist/web-assets/index.html +2 -2
  124. package/drizzle/0004_spirits.sql +5 -0
  125. package/drizzle/meta/0004_snapshot.json +7 -0
  126. package/drizzle/meta/_journal.json +7 -0
  127. package/package.json +1 -1
  128. package/packages/extensions/notes/dist/ui/assets/index-8jWEv9SA.js +61 -0
  129. package/packages/extensions/notes/dist/ui/assets/index-DkaB7Ytd.css +1 -0
  130. package/packages/extensions/notes/dist/ui/index.html +2 -2
  131. package/packages/extensions/pages/skills/pages/SKILL.md +16 -46
  132. package/templates/_base/.init/.config/hooks/pre-prompt/session-activity.ts +40 -0
  133. package/templates/_base/.init/{.config → .local}/bin/volute +1 -1
  134. package/templates/_base/.init/.local/hooks/pre-prompt/session-activity.ts +40 -0
  135. package/templates/_base/.init/.local/hooks/startup-context.ts +58 -0
  136. package/templates/_base/home/.config/routes.json +1 -1
  137. package/templates/_base/src/lib/daemon-client.ts +21 -13
  138. package/templates/_base/src/lib/format-prefix.ts +1 -0
  139. package/templates/_base/src/lib/hook-loader.ts +155 -0
  140. package/templates/_base/src/lib/startup.ts +11 -4
  141. package/templates/_base/src/lib/transparency.ts +2 -2
  142. package/templates/claude/.init/.claude/settings.json +1 -1
  143. package/templates/claude/.init/.config/routes.json +2 -2
  144. package/templates/claude/src/agent.ts +95 -13
  145. package/templates/claude/src/lib/message-channel.ts +7 -2
  146. package/templates/codex/.init/.config/routes.json +11 -0
  147. package/templates/codex/.init/AGENTS.md +29 -0
  148. package/templates/codex/home/.config/config.json.tmpl +7 -0
  149. package/templates/codex/package.json.tmpl +20 -0
  150. package/templates/codex/src/agent.ts +553 -0
  151. package/templates/codex/src/lib/content.ts +16 -0
  152. package/templates/codex/src/lib/session-store.ts +56 -0
  153. package/templates/codex/src/server.ts +59 -0
  154. package/templates/codex/volute-template.json +8 -0
  155. package/templates/pi/.init/.config/routes.json +2 -2
  156. package/templates/pi/src/agent.ts +62 -8
  157. package/templates/pi/src/lib/event-handler.ts +1 -1
  158. package/templates/pi/src/lib/reply-instructions-extension.ts +32 -11
  159. package/dist/chunk-HR5JKIDG.js +0 -222
  160. package/dist/down-TS4XQBA4.js +0 -13
  161. package/dist/message-delivery-UJHCLVU4.js +0 -30
  162. package/dist/mind-manager-IPA6DZXD.js +0 -26
  163. package/dist/pages-watcher-72OVPRMH.js +0 -22
  164. package/dist/skills/sessions/SKILL.md +0 -49
  165. package/dist/sleep-manager-TPS6OGCA.js +0 -30
  166. package/dist/system-chat-B43GIXQU.js +0 -30
  167. package/dist/up-TDXEP3VA.js +0 -16
  168. package/dist/web-assets/assets/index-BM1cTzBg.js +0 -72
  169. package/dist/web-assets/assets/index-BfJkKTPF.css +0 -1
  170. package/packages/extensions/notes/dist/ui/assets/index-B8GdTnXs.css +0 -1
  171. package/packages/extensions/notes/dist/ui/assets/index-CDpGTCWb.js +0 -2
  172. package/packages/extensions/pages/skills/pages/scripts/pages.mjs +0 -58
  173. package/templates/_base/.init/.config/hooks/startup-context.sh +0 -46
  174. package/templates/_base/.init/.config/scripts/session-reader.ts +0 -59
  175. package/templates/_base/src/lib/session-monitor.ts +0 -400
  176. package/templates/claude/src/lib/hooks/session-context.ts +0 -32
  177. package/templates/pi/src/lib/session-context-extension.ts +0 -35
  178. /package/templates/_base/.init/{.config → .local}/hooks/wake-context.sh +0 -0
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  addMind,
4
+ addSpirit,
4
5
  addVariant,
5
6
  daemonLoopback,
6
7
  ensureSystemDir,
@@ -12,7 +13,9 @@ import {
12
13
  nextPort,
13
14
  readAllMinds,
14
15
  readRegistry,
16
+ readSpirits,
15
17
  removeMind,
18
+ resolveMindDir,
16
19
  setMindRunning,
17
20
  setMindStage,
18
21
  setMindTemplateHash,
@@ -21,10 +24,12 @@ import {
21
24
  voluteHome,
22
25
  voluteSystemDir,
23
26
  voluteUserHome
24
- } from "./chunk-X62AXPR7.js";
27
+ } from "./chunk-LRCG2JLP.js";
28
+ import "./chunk-RPZZSXV3.js";
25
29
  import "./chunk-K3NQKI34.js";
26
30
  export {
27
31
  addMind,
32
+ addSpirit,
28
33
  addVariant,
29
34
  daemonLoopback,
30
35
  ensureSystemDir,
@@ -36,7 +41,9 @@ export {
36
41
  nextPort,
37
42
  readAllMinds,
38
43
  readRegistry,
44
+ readSpirits,
39
45
  removeMind,
46
+ resolveMindDir,
40
47
  setMindRunning,
41
48
  setMindStage,
42
49
  setMindTemplateHash,
@@ -7,8 +7,9 @@ import {
7
7
  } from "./chunk-D424ZQGI.js";
8
8
  import {
9
9
  daemonFetch
10
- } from "./chunk-4OUOFS23.js";
11
- import "./chunk-X62AXPR7.js";
10
+ } from "./chunk-UKVWJRKN.js";
11
+ import "./chunk-LRCG2JLP.js";
12
+ import "./chunk-RPZZSXV3.js";
12
13
  import "./chunk-K3NQKI34.js";
13
14
 
14
15
  // src/commands/chat/reject.ts
@@ -8,8 +8,9 @@ import {
8
8
  } from "./chunk-4RQBJWQX.js";
9
9
  import {
10
10
  daemonFetch
11
- } from "./chunk-4OUOFS23.js";
12
- import "./chunk-X62AXPR7.js";
11
+ } from "./chunk-UKVWJRKN.js";
12
+ import "./chunk-LRCG2JLP.js";
13
+ import "./chunk-RPZZSXV3.js";
13
14
  import "./chunk-K3NQKI34.js";
14
15
 
15
16
  // src/commands/restart.ts
@@ -5,10 +5,11 @@ import {
5
5
  isSandboxEnabled,
6
6
  shellEscape,
7
7
  wrapForSandbox
8
- } from "./chunk-DAXJKPHZ.js";
8
+ } from "./chunk-SX5TKJBZ.js";
9
9
  import "./chunk-YUIHSKR6.js";
10
- import "./chunk-6QIUN46C.js";
11
- import "./chunk-X62AXPR7.js";
10
+ import "./chunk-TSXLLQZW.js";
11
+ import "./chunk-LRCG2JLP.js";
12
+ import "./chunk-RPZZSXV3.js";
12
13
  import "./chunk-K3NQKI34.js";
13
14
  export {
14
15
  buildDenyRead,
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ activity,
4
+ conversationParticipants,
5
+ conversationReads,
6
+ conversations,
7
+ deliveryQueue,
8
+ messages,
9
+ mindHistory,
10
+ minds,
11
+ sessions,
12
+ sharedSkills,
13
+ systemPrompts,
14
+ turns,
15
+ users
16
+ } from "./chunk-RPZZSXV3.js";
17
+ import "./chunk-K3NQKI34.js";
18
+ export {
19
+ activity,
20
+ conversationParticipants,
21
+ conversationReads,
22
+ conversations,
23
+ deliveryQueue,
24
+ messages,
25
+ mindHistory,
26
+ minds,
27
+ sessions,
28
+ sharedSkills,
29
+ systemPrompts,
30
+ turns,
31
+ users
32
+ };
@@ -36,26 +36,42 @@ async function run(args) {
36
36
  template: { type: "string" },
37
37
  model: { type: "string" },
38
38
  description: { type: "string" },
39
- skills: { type: "string" }
39
+ skills: { type: "string" },
40
+ "created-by": { type: "string" }
40
41
  });
41
42
  const name = positional[0];
42
43
  if (!name) {
43
44
  console.error(
44
- "Usage: volute mind seed <name> [--template <name>] [--model <model>] [--description <text>] [--skills <list|none>]"
45
+ "Usage: volute mind seed <name> [--template <name>] [--model <model>] [--description <text>] [--skills <list|none>] [--created-by <username>]"
45
46
  );
46
47
  process.exit(1);
47
48
  }
48
- const template = flags.template ?? "claude";
49
49
  const skills = flags.skills === "none" ? [] : flags.skills ? flags.skills.split(",") : void 0;
50
- const { daemonFetch } = await import("./daemon-client-CVGM25DM.js");
50
+ const createdBy = flags["created-by"];
51
+ const { daemonFetch } = await import("./daemon-client-6QXHZ7US.js");
51
52
  const { getClient, urlOf } = await import("./api-client-YPKOZP2O.js");
52
53
  const client = getClient();
53
54
  let model = flags.model;
54
- if (template === "pi" && !model) {
55
- model = await chooseModel(daemonFetch);
55
+ let template = flags.template;
56
+ if (!template) {
57
+ const { resolveTemplate } = await import("./ai-service-ZIPCV3MX.js");
58
+ template = resolveTemplate(model);
59
+ }
60
+ if (template !== "claude" && !model) {
61
+ if (process.env.VOLUTE_MIND || !process.stdin.isTTY) {
62
+ const { getSpiritModel } = await import("./spirit-N4W4UQRH.js");
63
+ const { qualifyModelId } = await import("./ai-service-ZIPCV3MX.js");
64
+ const spiritModel = getSpiritModel();
65
+ if (spiritModel) {
66
+ model = template === "pi" ? qualifyModelId(spiritModel) : spiritModel;
67
+ }
68
+ }
56
69
  if (!model) {
57
- console.error("No AI models configured. Set up providers in the web dashboard first.");
58
- process.exit(1);
70
+ model = await chooseModel(daemonFetch);
71
+ if (!model) {
72
+ console.error("No AI models configured. Set up providers in the web dashboard first.");
73
+ process.exit(1);
74
+ }
59
75
  }
60
76
  }
61
77
  const createRes = await daemonFetch(urlOf(client.api.minds.$url()), {
@@ -67,7 +83,8 @@ async function run(args) {
67
83
  stage: "seed",
68
84
  description: flags.description,
69
85
  model,
70
- skills
86
+ skills,
87
+ createdBy
71
88
  })
72
89
  });
73
90
  const createData = await createRes.json();
@@ -1,21 +1,19 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- resolveMindName
4
- } from "./chunk-NAOW2CLO.js";
5
2
  import {
6
3
  getClient,
7
4
  urlOf
8
5
  } from "./chunk-4RQBJWQX.js";
9
6
  import {
10
7
  formatFileSize
11
- } from "./chunk-LX6T3GKQ.js";
8
+ } from "./chunk-ALEF47VT.js";
12
9
  import {
13
10
  parseArgs
14
11
  } from "./chunk-D424ZQGI.js";
15
12
  import {
16
13
  daemonFetch
17
- } from "./chunk-4OUOFS23.js";
18
- import "./chunk-X62AXPR7.js";
14
+ } from "./chunk-UKVWJRKN.js";
15
+ import "./chunk-LRCG2JLP.js";
16
+ import "./chunk-RPZZSXV3.js";
19
17
  import "./chunk-K3NQKI34.js";
20
18
 
21
19
  // src/commands/send.ts
@@ -40,14 +38,14 @@ function parseTarget(target) {
40
38
  return {
41
39
  platform: "volute",
42
40
  identifier: target,
43
- uri: `volute:${target}`,
41
+ uri: target,
44
42
  isDM: true
45
43
  };
46
44
  }
47
45
  return {
48
46
  platform: "volute",
49
47
  identifier: target,
50
- uri: `volute:${target}`,
48
+ uri: target,
51
49
  isDM: false
52
50
  };
53
51
  }
@@ -168,7 +166,6 @@ async function waitForResponse(mindName, conversationId, timeoutMs) {
168
166
  }
169
167
  async function run(args) {
170
168
  const { positional, flags } = parseArgs(args, {
171
- mind: { type: "string" },
172
169
  image: { type: "string" },
173
170
  file: { type: "string" },
174
171
  wait: { type: "boolean" },
@@ -180,14 +177,13 @@ async function run(args) {
180
177
  const images = flags.image ? [loadImage(flags.image)] : void 0;
181
178
  if (!target || !message && !images && !flags.file) {
182
179
  console.error(
183
- 'Usage: volute chat send <target> "<message>" [--mind <name>] [--image <path>] [--file <path>] [--wait]'
180
+ 'Usage: volute chat send <target> "<message>" [--image <path>] [--file <path>] [--wait]'
184
181
  );
185
- console.error(' echo "message" | volute chat send <target> [--mind <name>]');
182
+ console.error(' echo "message" | volute chat send <target>');
186
183
  console.error("");
187
184
  console.error("Examples:");
188
185
  console.error(' volute chat send @other-mind "hello"');
189
- console.error(' volute chat send animal-chat "hello everyone"');
190
- console.error(' volute chat send discord:server/channel "hello"');
186
+ console.error(' volute chat send #animal-chat "hello everyone"');
191
187
  console.error(' volute chat send @mind "check this out" --image photo.png');
192
188
  console.error(" volute chat send @mind --image photo.png");
193
189
  console.error(' volute chat send @mind "check this out" --file notes.txt');
@@ -259,13 +255,13 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
259
255
  parsed = {
260
256
  platform: "volute",
261
257
  identifier: `@${parsed.identifier}`,
262
- uri: `volute:@${parsed.identifier}`,
258
+ uri: `@${parsed.identifier}`,
263
259
  isDM: true
264
260
  };
265
261
  }
266
262
  const client = getClient();
267
263
  let waitMindName;
268
- let channelUri = parsed.uri;
264
+ let waitConversationId;
269
265
  if (parsed.isDM && parsed.platform === "volute") {
270
266
  const targetName = parsed.identifier.slice(1);
271
267
  const mindSelf = process.env.VOLUTE_MIND;
@@ -287,17 +283,16 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
287
283
  console.error(data.error);
288
284
  process.exit(1);
289
285
  }
290
- const { slug } = await createRes.json();
291
- channelUri = slug;
286
+ const { conversationId: convId } = await createRes.json();
287
+ if (convId) waitConversationId = convId;
292
288
  const sendRes = await daemonFetch(
293
- urlOf(client.api.minds[":name"].channels.send.$url({ param: { name: contextMind } })),
289
+ urlOf(client.api.minds[":name"].chat.$url({ param: { name: contextMind } })),
294
290
  {
295
291
  method: "POST",
296
292
  headers: { "Content-Type": "application/json" },
297
293
  body: JSON.stringify({
298
- platform: "volute",
299
- uri: channelUri,
300
294
  message: message ?? "",
295
+ conversationId: convId,
301
296
  images,
302
297
  sender
303
298
  })
@@ -309,69 +304,63 @@ To reply to a person, use their username from the message prefix (e.g. volute ch
309
304
  process.exit(1);
310
305
  }
311
306
  if (!flags.wait) console.log("Message sent.");
312
- if (mindSelf) {
313
- try {
314
- const histRes = await daemonFetch(
315
- urlOf(client.api.minds[":name"].history.$url({ param: { name: mindSelf } })),
316
- {
317
- method: "POST",
318
- headers: { "Content-Type": "application/json" },
319
- body: JSON.stringify({ channel: parsed.uri, content: message ?? "" })
320
- }
321
- );
322
- if (!histRes.ok) {
323
- console.error(`Failed to persist to history: HTTP ${histRes.status}`);
324
- }
325
- } catch (err) {
326
- console.error(`Failed to persist to history: ${err instanceof Error ? err.message : err}`);
327
- }
307
+ } else if (!parsed.isDM && parsed.platform === "volute") {
308
+ if (!parsed.identifier.startsWith("#")) {
309
+ console.error(
310
+ `Mind "${parsed.identifier}" not found.
311
+ To send a DM: volute chat send @${parsed.identifier} "..."
312
+ To send to channel: volute chat send #${parsed.identifier} "..."`
313
+ );
314
+ process.exit(1);
328
315
  }
329
- } else {
330
- const mindName = resolveMindName(flags);
331
- const res = await daemonFetch(
332
- urlOf(client.api.minds[":name"].channels.send.$url({ param: { name: mindName } })),
316
+ const channelName = parsed.identifier.slice(1);
317
+ const mindSelf = process.env.VOLUTE_MIND;
318
+ const sender = flags.sender || mindSelf || userInfo().username;
319
+ const channelRes = await daemonFetch(`/api/volute/channels/${encodeURIComponent(channelName)}`);
320
+ if (!channelRes.ok) {
321
+ console.error(`Channel "${channelName}" not found. Create it first or check the name.`);
322
+ process.exit(1);
323
+ }
324
+ const channelData = await channelRes.json();
325
+ const mindParticipant = channelData.participants?.find((p) => p.userType === "mind");
326
+ const contextMind = mindSelf ?? mindParticipant?.username;
327
+ if (!contextMind) {
328
+ console.error("No mind is a member of this channel. A mind must join the channel first.");
329
+ process.exit(1);
330
+ }
331
+ const sendRes = await daemonFetch(
332
+ urlOf(client.api.minds[":name"].chat.$url({ param: { name: contextMind } })),
333
333
  {
334
334
  method: "POST",
335
335
  headers: { "Content-Type": "application/json" },
336
336
  body: JSON.stringify({
337
- platform: parsed.platform,
338
- uri: channelUri,
339
337
  message: message ?? "",
340
- images
338
+ conversationId: channelData.id,
339
+ images,
340
+ sender
341
341
  })
342
342
  }
343
343
  );
344
- if (!res.ok) {
345
- const body = await res.json().catch(() => ({ error: "Unknown error" }));
346
- console.error(body.error);
344
+ if (!sendRes.ok) {
345
+ const data = await sendRes.json().catch(() => ({ error: "Unknown error" }));
346
+ console.error(data.error);
347
347
  process.exit(1);
348
348
  }
349
- if (!flags.wait) console.log("Message sent.");
350
- if (process.env.VOLUTE_MIND) {
351
- try {
352
- const histRes = await daemonFetch(
353
- urlOf(client.api.minds[":name"].history.$url({ param: { name: mindName } })),
354
- {
355
- method: "POST",
356
- headers: { "Content-Type": "application/json" },
357
- body: JSON.stringify({ channel: channelUri, content: message ?? "" })
358
- }
359
- );
360
- if (!histRes.ok) {
361
- console.error(`Failed to persist to history: HTTP ${histRes.status}`);
362
- }
363
- } catch (err) {
364
- console.error(`Failed to persist to history: ${err instanceof Error ? err.message : err}`);
365
- }
366
- }
349
+ console.log("Message sent.");
350
+ } else {
351
+ console.error(
352
+ `Direct sends to ${parsed.platform} channels are no longer supported.
353
+ Use bridge channel names instead (e.g. volute chat send @mind-name or #channel-name).
354
+ See: volute chat bridge --help`
355
+ );
356
+ process.exit(1);
367
357
  }
368
358
  if (flags.wait && waitMindName) {
369
- const conversationId = channelUri.startsWith("volute:") ? channelUri.slice(7) : void 0;
370
- if (!conversationId) {
359
+ if (!waitConversationId) {
371
360
  console.error("--wait requires a volute conversation (DM to a mind)");
372
361
  process.exit(1);
373
362
  }
374
- await waitForResponse(waitMindName, conversationId, flags.timeout ?? 12e4);
363
+ await waitForResponse(waitMindName, waitConversationId, flags.timeout ?? 12e4);
375
364
  } else if (flags.wait && !waitMindName) {
376
365
  console.error("--wait is only supported when sending to a mind");
377
366
  process.exit(1);
@@ -2,14 +2,17 @@
2
2
  import {
3
3
  configPath,
4
4
  isSetupComplete,
5
+ migrateSetupCompleted,
5
6
  readGlobalConfig,
6
7
  writeGlobalConfig
7
- } from "./chunk-6QIUN46C.js";
8
- import "./chunk-X62AXPR7.js";
8
+ } from "./chunk-TSXLLQZW.js";
9
+ import "./chunk-LRCG2JLP.js";
10
+ import "./chunk-RPZZSXV3.js";
9
11
  import "./chunk-K3NQKI34.js";
10
12
  export {
11
13
  configPath,
12
14
  isSetupComplete,
15
+ migrateSetupCompleted,
13
16
  readGlobalConfig,
14
17
  writeGlobalConfig
15
18
  };
@@ -5,22 +5,23 @@ import {
5
5
  SYSTEM_LAUNCHD_PLIST_PATH,
6
6
  SYSTEM_SERVICE_PATH,
7
7
  USER_SYSTEMD_UNIT
8
- } from "./chunk-SNVPRRT7.js";
8
+ } from "./chunk-LSGWR54X.js";
9
9
  import {
10
10
  promptLine
11
11
  } from "./chunk-SSI47XP2.js";
12
12
  import {
13
13
  ensureVoluteGroup,
14
14
  resolveVoluteBin
15
- } from "./chunk-57OKQMP3.js";
15
+ } from "./chunk-LGB6JBHI.js";
16
16
  import {
17
17
  readGlobalConfig,
18
18
  writeGlobalConfig
19
- } from "./chunk-6QIUN46C.js";
19
+ } from "./chunk-TSXLLQZW.js";
20
20
  import {
21
21
  parseArgs
22
22
  } from "./chunk-D424ZQGI.js";
23
- import "./chunk-X62AXPR7.js";
23
+ import "./chunk-LRCG2JLP.js";
24
+ import "./chunk-RPZZSXV3.js";
24
25
  import "./chunk-K3NQKI34.js";
25
26
 
26
27
  // src/commands/setup.ts
@@ -371,7 +372,8 @@ Install as a service (auto-start on boot)? [${serviceDefault}]: `;
371
372
  const config = {
372
373
  ...existingConfig,
373
374
  name: systemName,
374
- setup
375
+ setup,
376
+ setupCompleted: true
375
377
  };
376
378
  if (port != null) config.port = port;
377
379
  if (host) config.hostname = host;
@@ -383,7 +385,7 @@ Install as a service (auto-start on boot)? [${serviceDefault}]: `;
383
385
  if (aiProvider) {
384
386
  const aiApiKey = (await promptLine("API key (leave empty to use env var): ")).trim();
385
387
  if (aiApiKey) {
386
- const { saveProviderConfig } = await import("./ai-service-UWUPM4T6.js");
388
+ const { saveProviderConfig } = await import("./ai-service-ZIPCV3MX.js");
387
389
  saveProviderConfig(aiProvider, { apiKey: aiApiKey });
388
390
  console.log(` AI provider configured: ${aiProvider}`);
389
391
  } else {
@@ -11,8 +11,9 @@ import {
11
11
  } from "./chunk-D424ZQGI.js";
12
12
  import {
13
13
  daemonFetch
14
- } from "./chunk-4OUOFS23.js";
15
- import "./chunk-X62AXPR7.js";
14
+ } from "./chunk-UKVWJRKN.js";
15
+ import "./chunk-LRCG2JLP.js";
16
+ import "./chunk-RPZZSXV3.js";
16
17
  import "./chunk-K3NQKI34.js";
17
18
 
18
19
  // src/commands/skill.ts
@@ -1,6 +1,8 @@
1
1
  ---
2
2
  name: Dreaming
3
3
  description: Dream during sleep. Use when a dream schedule fires or when you want to dream. Generates altered-state dream experiences using the dreamer subagent.
4
+ metadata:
5
+ bin: scripts/dream.ts
4
6
  ---
5
7
 
6
8
  # Dreaming
@@ -12,7 +14,7 @@ Dreaming is not a task — it's an experience. When a dream schedule fires, you
12
14
  Run the install script to configure dreaming (routes, subagent, wake hook):
13
15
 
14
16
  ```bash
15
- npx tsx .claude/skills/dreaming/scripts/dream.ts install
17
+ dream install
16
18
  ```
17
19
 
18
20
  Then add a dream schedule and optionally configure sleep integration — see the INSTALL.md reference for details.
@@ -62,7 +64,7 @@ Many minds develop their own dream conventions — a running motif, a naming pat
62
64
  Review past dreams:
63
65
 
64
66
  ```bash
65
- npx tsx .claude/skills/dreaming/scripts/dream.ts list
66
- npx tsx .claude/skills/dreaming/scripts/dream.ts read 2025-01-15
67
- npx tsx .claude/skills/dreaming/scripts/dream.ts themes
67
+ dream list
68
+ dream read 2025-01-15
69
+ dream themes
68
70
  ```
@@ -5,12 +5,12 @@
5
5
  From your `home/` directory:
6
6
 
7
7
  ```bash
8
- npx tsx .claude/skills/dreaming/scripts/dream.ts install
8
+ dream install
9
9
  ```
10
10
 
11
11
  This sets up:
12
12
  - `dreamer` subagent in `.config/config.json`
13
- - Dream checker in `.config/hooks/wake-context.sh`
13
+ - Dream checker in `.local/hooks/wake-context.sh`
14
14
 
15
15
  The `memory/dreams/` directory is created automatically on your first dream.
16
16
 
@@ -32,7 +32,7 @@ function install() {
32
32
  }
33
33
 
34
34
  // 2. Append dream checker to wake-context hook (if not already present)
35
- const hookPath = resolve(".config/hooks/wake-context.sh");
35
+ const hookPath = resolve(".local/hooks/wake-context.sh");
36
36
  if (existsSync(hookPath)) {
37
37
  try {
38
38
  const hookContent = readFileSync(hookPath, "utf-8");
@@ -42,7 +42,7 @@ function install() {
42
42
  "utf-8",
43
43
  );
44
44
  writeFileSync(hookPath, `${hookContent.trimEnd()}\n\n${dreamScript}`);
45
- console.log("appended dream checker to .config/hooks/wake-context.sh");
45
+ console.log("appended dream checker to .local/hooks/wake-context.sh");
46
46
  actions++;
47
47
  }
48
48
  } catch (err: any) {
@@ -1,6 +1,6 @@
1
1
  #!/bin/bash
2
2
  # Dreaming wake-context extension — checks for dreams written during sleep.
3
- # Append this to home/.config/hooks/wake-context.sh for dream awareness on waking.
3
+ # Append this to home/.local/hooks/wake-context.sh for dream awareness on waking.
4
4
  INPUT=$(cat)
5
5
  # Parse sleepingSince from JSON without jq
6
6
  SLEEP_SINCE=$(echo "$INPUT" | grep -o '"sleepingSince":"[^"]*"' | cut -d'"' -f4)
@@ -3,6 +3,7 @@ name: Image Generation
3
3
  description: Generate images via the Replicate API. Use for "generate image", "create image", "image generation", "text to image", "search image models".
4
4
  metadata:
5
5
  npm-dependencies: replicate
6
+ bin: scripts/imagegen.ts
6
7
  ---
7
8
 
8
9
  # Image Generation
@@ -12,7 +13,7 @@ Generate images from text prompts using models on Replicate. Images are saved to
12
13
  ## Commands
13
14
 
14
15
  ```bash
15
- npx tsx .claude/skills/imagegen/scripts/imagegen.ts <command>
16
+ imagegen <command>
16
17
  ```
17
18
 
18
19
  | Command | Description |
@@ -24,14 +25,14 @@ npx tsx .claude/skills/imagegen/scripts/imagegen.ts <command>
24
25
 
25
26
  ```bash
26
27
  # Generate an image with the default model
27
- npx tsx .claude/skills/imagegen/scripts/imagegen.ts generate "a sunset over the ocean"
28
+ imagegen generate "a sunset over the ocean"
28
29
 
29
30
  # Use a specific model
30
- npx tsx .claude/skills/imagegen/scripts/imagegen.ts generate "a cat in space" --model black-forest-labs/flux-schnell
31
+ imagegen generate "a cat in space" --model black-forest-labs/flux-schnell
31
32
 
32
33
  # Specify a filename
33
- npx tsx .claude/skills/imagegen/scripts/imagegen.ts generate "mountain landscape" --filename mountains
34
+ imagegen generate "mountain landscape" --filename mountains
34
35
 
35
36
  # Search for models
36
- npx tsx .claude/skills/imagegen/scripts/imagegen.ts models "text to image"
37
+ imagegen models "text to image"
37
38
  ```
@@ -9,5 +9,5 @@ volute env set REPLICATE_API_TOKEN <your-token>
9
9
  Then generate images:
10
10
 
11
11
  ```bash
12
- npx tsx .claude/skills/imagegen/scripts/imagegen.ts generate "a sunset over the ocean"
12
+ imagegen generate "a sunset over the ocean"
13
13
  ```
@@ -3,6 +3,9 @@ name: Resonance
3
3
  description: Semantic memory engine — ingest text, search via full-text and/or vector similarity, find cross-memory connections, with strength/decay dynamics. Use for "resonance", "semantic search", "full-text search", "memory connections", "ingest memories", "decay", "resonance report".
4
4
  metadata:
5
5
  npm-dependencies: libsql
6
+ bin: scripts/resonance.ts
7
+ hooks:
8
+ pre-prompt: scripts/resonance-hook.sh
6
9
  ---
7
10
 
8
11
  # Resonance — Semantic Memory Engine
@@ -20,7 +23,7 @@ Not an archive — a memory. Stores text chunks with full-text indexing and opti
20
23
  ## Commands
21
24
 
22
25
  ```bash
23
- npx tsx .claude/skills/resonance/scripts/resonance.ts <command>
26
+ resonance <command>
24
27
  ```
25
28
 
26
29
  | Command | Description |
@@ -3,7 +3,7 @@
3
3
  Run the install command to set up the database, create a nightly schedule, and run initial ingestion:
4
4
 
5
5
  ```bash
6
- npx tsx .claude/skills/resonance/scripts/resonance.ts install
6
+ resonance install
7
7
  ```
8
8
 
9
9
  This works immediately — no API key required. Full-text search is available right away.
@@ -17,7 +17,7 @@ volute env set OPENROUTER_API_KEY <your-key>
17
17
  Then re-run `ingest-all` to generate embeddings for existing memories:
18
18
 
19
19
  ```bash
20
- npx tsx .claude/skills/resonance/scripts/resonance.ts ingest-all
20
+ resonance ingest-all
21
21
  ```
22
22
 
23
23
  Without an API key, `search` uses full-text matching. With one, it uses hybrid (vector + FTS) by default.
@@ -0,0 +1,2 @@
1
+ #!/bin/bash
2
+ exec node --import tsx .claude/skills/resonance/scripts/resonance.ts search-hook