volute 0.30.1 → 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 (227) hide show
  1. package/README.md +15 -22
  2. package/dist/{accept-E3PAH3QJ.js → accept-74M7I4RZ.js} +5 -4
  3. package/dist/{activity-events-BKBPPUBP.js → activity-events-HETAODOK.js} +3 -2
  4. package/dist/{ai-service-VAJT5UBS.js → ai-service-ZIPCV3MX.js} +20 -5
  5. package/dist/api.d.ts +341 -397
  6. package/dist/{archive-WWDBWYN2.js → archive-INXYFVCW.js} +3 -2
  7. package/dist/auth-6DMGES3I.js +44 -0
  8. package/dist/{bridge-RO37CUFM.js → bridge-BVCBTGPF.js} +5 -4
  9. package/dist/{chat-TCUNPFGO.js → chat-XT4OBJBU.js} +8 -8
  10. package/dist/{chunk-P7VFDSSG.js → chunk-2FLJ63GU.js} +2 -2
  11. package/dist/{chunk-ZWKTUQEL.js → chunk-2NGTS5UU.js} +1 -1
  12. package/dist/{chunk-JGFRDMR6.js → chunk-ALEF47VT.js} +1 -1
  13. package/dist/{chunk-MDPCSXZ4.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-DTC6EH5I.js → chunk-I5KY25PQ.js} +1 -9
  17. package/dist/{chunk-NSBFETWP.js → chunk-IYDIE3HG.js} +64 -26
  18. package/dist/{chunk-W5OOPLNP.js → chunk-JJ7W6WSB.js} +3 -3
  19. package/dist/{chunk-G3GBKZGG.js → chunk-LGB6JBHI.js} +54 -2
  20. package/dist/chunk-LRCG2JLP.js +251 -0
  21. package/dist/{chunk-FXHXHI2A.js → chunk-LSGWR54X.js} +3 -6
  22. package/dist/{chunk-S5LR3XYJ.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-QVAQ5454.js → chunk-QBQ424EM.js} +3007 -2126
  26. package/dist/{chunk-P27RV5WM.js → chunk-QZANELPX.js} +6 -2
  27. package/dist/{chunk-FSM45XD5.js → chunk-R7E6CRVQ.js} +1 -1
  28. package/dist/{chunk-HHTXM4JT.js → chunk-RPZZSXV3.js} +39 -195
  29. package/dist/{chunk-UPA6COHU.js → chunk-RSX4OPZY.js} +5 -5
  30. package/dist/{chunk-2C2VXEBB.js → chunk-S6NFERDC.js} +21 -57
  31. package/dist/chunk-SKLSMHXO.js +208 -0
  32. package/dist/{chunk-IKHDUZRH.js → chunk-SX5TKJBZ.js} +2 -2
  33. package/dist/chunk-TDRYEPH4.js +185 -0
  34. package/dist/chunk-TSXLLQZW.js +46 -0
  35. package/dist/{chunk-EFVHR7KH.js → chunk-UKVWJRKN.js} +24 -5
  36. package/dist/{chunk-2NDZC3S7.js → chunk-WKF5FEFK.js} +688 -389
  37. package/dist/cli.js +93 -24
  38. package/dist/{clock-G3ALCMLJ.js → clock-2UOZ6JPU.js} +11 -8
  39. package/dist/{cloud-sync-JV4LJOK3.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-7KVQV7EZ.js → conversations-3O5O6AS3.js} +8 -7
  45. package/dist/{create-JTLS7GX3.js → create-RNLNCORE.js} +5 -4
  46. package/dist/{create-VQSQHJQW.js → create-WBBYI6V7.js} +6 -2
  47. package/dist/daemon-client-6QXHZ7US.js +12 -0
  48. package/dist/{daemon-restart-4JGBHEJ4.js → daemon-restart-NGFHFAUF.js} +7 -7
  49. package/dist/daemon.js +2446 -1999
  50. package/dist/{db-HMFPIRO2.js → db-F34YLV7D.js} +2 -1
  51. package/dist/db-RA45JBFG.js +16 -0
  52. package/dist/{delete-JESHKE7F.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-CLXXT7M2.js → env-RLYQBOOP.js} +5 -4
  57. package/dist/{export-EGA5M5PB.js → export-SUYRLI5Q.js} +4 -3
  58. package/dist/{extension-WZ4SUPJB.js → extension-FQ5D3NCC.js} +6 -6
  59. package/dist/{extensions-ECO4RPFQ.js → extensions-GDYWQXC4.js} +9 -7
  60. package/dist/{files-4VEJDASH.js → files-EAMPO2SJ.js} +6 -5
  61. package/dist/{history-EJMMLXDO.js → history-FO5PHBQ5.js} +9 -4
  62. package/dist/{import-YCGPMBSI.js → import-DDUFE7AY.js} +4 -3
  63. package/dist/{join-2GBJKZEN.js → join-I5QEE3LG.js} +1 -1
  64. package/dist/{list-Q6O7FGAN.js → list-DW2VRTOZ.js} +5 -4
  65. package/dist/{login-RL6AU2SM.js → login-7CHPW2PN.js} +5 -4
  66. package/dist/{login-RET5WESK.js → login-RIJF2F4G.js} +3 -2
  67. package/dist/{logout-CGAGJN3L.js → logout-5MLHZALK.js} +3 -2
  68. package/dist/{logout-JRPBEMMR.js → logout-UZJRGY4Z.js} +3 -2
  69. package/dist/message-delivery-2FIM7QKO.js +32 -0
  70. package/dist/{mind-LUWRQUQ5.js → mind-2B6M7Y25.js} +18 -18
  71. package/dist/{mind-activity-tracker-VYN2ZZ2M.js → mind-activity-tracker-NZZT2NTT.js} +4 -3
  72. package/dist/{mind-list-V5WW5DUA.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-R6PTNNW4.js → mind-sleep-B7BHJLH7.js} +5 -4
  76. package/dist/{mind-status-I4ISFJ6I.js → mind-status-L3EFFRPR.js} +3 -2
  77. package/dist/{mind-wake-67ZQEWAV.js → mind-wake-GY3RFX7Y.js} +5 -4
  78. package/dist/{package-OYUD4ZJ4.js → package-PK6JUFL3.js} +3 -3
  79. package/dist/read-5AMJRO3D.js +75 -0
  80. package/dist/{register-NZDSTLP3.js → register-V2JZZKFK.js} +5 -4
  81. package/dist/{registry-ODSALQQL.js → registry-PJ4S5PHQ.js} +8 -1
  82. package/dist/{reject-2HZOJEIJ.js → reject-33HEZMZ4.js} +5 -4
  83. package/dist/{restart-QHS3NT64.js → restart-3UCMRUVC.js} +5 -4
  84. package/dist/{sandbox-O5FUSF43.js → sandbox-JANNTX6U.js} +4 -3
  85. package/dist/schema-PA3M5ZKH.js +32 -0
  86. package/dist/seed-ALUQ55FF.js +112 -0
  87. package/dist/{send-OAN3RYYY.js → send-3MI36LEF.js} +58 -69
  88. package/dist/{setup-QMDK5RZX.js → setup-SZIARWI6.js} +5 -4
  89. package/dist/{setup-XJH3E7YM.js → setup-WENLVPVP.js} +9 -9
  90. package/dist/{skill-FZIN4W4Q.js → skill-TUVOTW4Z.js} +5 -4
  91. package/dist/skills/dreaming/SKILL.md +6 -4
  92. package/dist/skills/dreaming/references/INSTALL.md +4 -5
  93. package/dist/skills/dreaming/scripts/dream.ts +5 -27
  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 +12 -12
  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-EXYGGGQN.js → split-STOROBYJ.js} +1 -1
  107. package/dist/{sprout-AXQ6H5DB.js → sprout-L2GFOVF7.js} +9 -8
  108. package/dist/{start-MTOVL6SY.js → start-K2NCUUCG.js} +5 -4
  109. package/dist/{status-ZRO37MWR.js → status-TCUMUO6M.js} +5 -5
  110. package/dist/{stop-OK5WEPVC.js → stop-H26JZDXF.js} +5 -4
  111. package/dist/system-chat-NPYFYZVI.js +32 -0
  112. package/dist/{systems-W3BBMSOZ.js → systems-DHBKVYEY.js} +6 -5
  113. package/dist/{tailscale-BM72RXCJ.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-PLPHMMZ2.js → update-QVPRF6GR.js} +5 -5
  117. package/dist/{update-check-CVCN7MF6.js → update-check-ZD6OOIYQ.js} +3 -2
  118. package/dist/{upgrade-I6NPCYUU.js → upgrade-O4Q7WJM3.js} +12 -14
  119. package/dist/{version-notify-2NTWVEHL.js → version-notify-TCKWBZZG.js} +22 -23
  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 +94 -0
  123. package/dist/web-assets/index.html +2 -2
  124. package/drizzle/0000_baseline.sql +152 -0
  125. package/drizzle/0001_add_conversation_private.sql +1 -0
  126. package/drizzle/0002_turns.sql +21 -0
  127. package/drizzle/0003_turn_feed_links.sql +11 -0
  128. package/drizzle/0004_spirits.sql +5 -0
  129. package/drizzle/meta/0000_snapshot.json +3 -223
  130. package/drizzle/meta/0001_snapshot.json +3 -294
  131. package/drizzle/meta/0002_snapshot.json +3 -335
  132. package/drizzle/meta/0003_snapshot.json +3 -413
  133. package/drizzle/meta/0004_snapshot.json +3 -406
  134. package/drizzle/meta/_journal.json +10 -101
  135. package/package.json +3 -3
  136. package/packages/extensions/notes/dist/ui/assets/index-8jWEv9SA.js +61 -0
  137. package/packages/extensions/notes/dist/ui/assets/index-DkaB7Ytd.css +1 -0
  138. package/packages/extensions/notes/dist/ui/index.html +2 -2
  139. package/packages/extensions/notes/skills/notes/SKILL.md +8 -8
  140. package/packages/extensions/pages/skills/pages/SKILL.md +17 -44
  141. package/templates/_base/.init/.config/hooks/pre-prompt/session-activity.ts +40 -0
  142. package/templates/_base/.init/.local/bin/volute +27 -0
  143. package/templates/_base/.init/.local/hooks/pre-prompt/session-activity.ts +40 -0
  144. package/templates/_base/.init/.local/hooks/startup-context.ts +58 -0
  145. package/templates/_base/home/.config/routes.json +1 -1
  146. package/templates/_base/src/lib/auto-commit.ts +82 -43
  147. package/templates/_base/src/lib/daemon-client.ts +40 -36
  148. package/templates/_base/src/lib/format-prefix.ts +1 -0
  149. package/templates/_base/src/lib/hook-loader.ts +155 -0
  150. package/templates/_base/src/lib/router.ts +17 -1
  151. package/templates/_base/src/lib/startup.ts +17 -12
  152. package/templates/_base/src/lib/transparency.ts +2 -2
  153. package/templates/_base/src/lib/volute-server.ts +2 -5
  154. package/templates/claude/.init/.claude/settings.json +1 -1
  155. package/templates/claude/.init/.config/routes.json +2 -2
  156. package/templates/claude/src/agent.ts +97 -14
  157. package/templates/claude/src/lib/hooks/auto-commit.ts +7 -3
  158. package/templates/claude/src/lib/message-channel.ts +7 -2
  159. package/templates/claude/src/server.ts +0 -9
  160. package/templates/codex/.init/.config/routes.json +11 -0
  161. package/templates/codex/.init/AGENTS.md +29 -0
  162. package/templates/codex/home/.config/config.json.tmpl +7 -0
  163. package/templates/codex/package.json.tmpl +20 -0
  164. package/templates/codex/src/agent.ts +553 -0
  165. package/templates/codex/src/lib/content.ts +16 -0
  166. package/templates/codex/src/lib/session-store.ts +56 -0
  167. package/templates/codex/src/server.ts +59 -0
  168. package/templates/codex/volute-template.json +8 -0
  169. package/templates/pi/.init/.config/routes.json +2 -2
  170. package/templates/pi/package.json.tmpl +1 -1
  171. package/templates/pi/src/agent.ts +63 -9
  172. package/templates/pi/src/lib/event-handler.ts +6 -4
  173. package/templates/pi/src/lib/reply-instructions-extension.ts +32 -11
  174. package/dist/chunk-7D47T4RB.js +0 -84
  175. package/dist/chunk-CVH6Y2YG.js +0 -59
  176. package/dist/chunk-EFP3PE6C.js +0 -232
  177. package/dist/chunk-LIRWLNAK.js +0 -729
  178. package/dist/daemon-client-BCTFGVCZ.js +0 -9
  179. package/dist/down-NGBMGORS.js +0 -14
  180. package/dist/message-delivery-6YMVNOEC.js +0 -28
  181. package/dist/migrate-registry-to-db-FK35IPEH.js +0 -110
  182. package/dist/mind-manager-YFCOIAAX.js +0 -18
  183. package/dist/pages-watcher-Z3PKNROC.js +0 -21
  184. package/dist/read-WQMPTSN2.js +0 -46
  185. package/dist/seed-WUQMPLDM.js +0 -71
  186. package/dist/skills/sessions/SKILL.md +0 -49
  187. package/dist/sleep-manager-O7YQFCV5.js +0 -30
  188. package/dist/up-BXUAIDXB.js +0 -17
  189. package/dist/web-assets/assets/index--kREqKl9.js +0 -72
  190. package/dist/web-assets/assets/index-BXYTG0nJ.css +0 -1
  191. package/drizzle/0000_flaky_mariko_yashida.sql +0 -34
  192. package/drizzle/0001_careless_warpath.sql +0 -12
  193. package/drizzle/0002_wealthy_the_call.sql +0 -6
  194. package/drizzle/0003_clean_ego.sql +0 -12
  195. package/drizzle/0004_magical_silverclaw.sql +0 -1
  196. package/drizzle/0005_rename_agents_to_minds.sql +0 -11
  197. package/drizzle/0006_mind_history.sql +0 -20
  198. package/drizzle/0007_system_prompts.sql +0 -5
  199. package/drizzle/0008_volute_channels.sql +0 -24
  200. package/drizzle/0009_shared_skills.sql +0 -9
  201. package/drizzle/0010_delivery_queue.sql +0 -12
  202. package/drizzle/0011_rename_human_to_brain.sql +0 -1
  203. package/drizzle/0012_activity.sql +0 -11
  204. package/drizzle/0013_user_profiles.sql +0 -3
  205. package/drizzle/0014_conversation_reads.sql +0 -7
  206. package/drizzle/0015_notes.sql +0 -23
  207. package/drizzle/0016_note_reactions_and_replies.sql +0 -15
  208. package/drizzle/0017_minds.sql +0 -16
  209. package/drizzle/meta/0005_snapshot.json +0 -410
  210. package/drizzle/meta/0006_snapshot.json +0 -7
  211. package/drizzle/meta/0007_snapshot.json +0 -7
  212. package/drizzle/meta/0008_snapshot.json +0 -7
  213. package/drizzle/meta/0009_snapshot.json +0 -7
  214. package/drizzle/meta/0010_snapshot.json +0 -7
  215. package/drizzle/meta/0011_snapshot.json +0 -7
  216. package/drizzle/meta/0012_snapshot.json +0 -7
  217. package/drizzle/meta/0013_snapshot.json +0 -7
  218. package/packages/extensions/notes/dist/ui/assets/index-DgawVO5g.css +0 -1
  219. package/packages/extensions/notes/dist/ui/assets/index-qUWoeC4c.js +0 -2
  220. package/packages/extensions/notes/skills/notes/scripts/notes.mjs +0 -185
  221. package/templates/_base/.init/.config/hooks/startup-context.sh +0 -46
  222. package/templates/_base/.init/.config/scripts/session-reader.ts +0 -59
  223. package/templates/_base/home/public/.gitkeep +0 -0
  224. package/templates/_base/src/lib/session-monitor.ts +0 -400
  225. package/templates/claude/src/lib/hooks/session-context.ts +0 -32
  226. package/templates/pi/src/lib/session-context-extension.ts +0 -35
  227. /package/templates/_base/.init/{.config → .local}/hooks/wake-context.sh +0 -0
@@ -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,13 +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
- - `system:dream` route in `.config/routes.json`
13
12
  - `dreamer` subagent in `.config/config.json`
14
- - Dream checker in `.config/hooks/wake-context.sh`
13
+ - Dream checker in `.local/hooks/wake-context.sh`
15
14
 
16
15
  The `memory/dreams/` directory is created automatically on your first dream.
17
16
 
@@ -27,14 +26,14 @@ Add to `.config/volute.json` under `schedules`:
27
26
  "cron": "0 3 * * *",
28
27
  "message": "it's 3am. you are dreaming.\n\ngather your material — read your latest journal entry, read MEMORY.md, surface random memories if you have a way to. then construct a dream premise from that material and invoke the dreamer subagent to experience the dream.",
29
28
  "enabled": true,
30
- "channel": "system:dream"
29
+ "session": "$new"
31
30
  }
32
31
  ```
33
32
 
34
33
  Or via CLI:
35
34
 
36
35
  ```bash
37
- volute clock add --mind <name> --id dream --cron "0 3 * * *" --channel system:dream --while-sleeping trigger-wake --message "it's 3am. you are dreaming...."
36
+ volute clock add --mind <name> --id dream --cron "0 3 * * *" --session "$new" --while-sleeping trigger-wake --message "it's 3am. you are dreaming...."
38
37
  ```
39
38
 
40
39
  ## 3. Sleep integration
@@ -6,28 +6,7 @@ const dreamsDir = resolve("memory/dreams");
6
6
  function install() {
7
7
  let actions = 0;
8
8
 
9
- // 1. Add system:dream route to routes.json
10
- const routesPath = resolve(".config/routes.json");
11
- if (existsSync(routesPath)) {
12
- try {
13
- const routes = JSON.parse(readFileSync(routesPath, "utf-8"));
14
- const rules: { channel: string; session: string }[] = routes.rules ?? [];
15
- const hasDreamRoute = rules.some((r) => r.channel === "system:dream");
16
- if (!hasDreamRoute) {
17
- rules.push({ channel: "system:dream", session: "$new" });
18
- routes.rules = rules;
19
- writeFileSync(routesPath, `${JSON.stringify(routes, null, 2)}\n`);
20
- console.log("added system:dream route to .config/routes.json");
21
- actions++;
22
- }
23
- } catch (err: any) {
24
- console.error(`failed to update routes.json: ${err.message}`);
25
- }
26
- } else {
27
- console.warn("warning: .config/routes.json not found — skipping route setup");
28
- }
29
-
30
- // 2. Add dreamer subagent to config.json
9
+ // 1. Add dreamer subagent to config.json
31
10
  const configPath = resolve(".config/config.json");
32
11
  if (existsSync(configPath)) {
33
12
  try {
@@ -52,8 +31,8 @@ function install() {
52
31
  console.warn("warning: .config/config.json not found — skipping subagent setup");
53
32
  }
54
33
 
55
- // 3. Append dream checker to wake-context hook (if not already present)
56
- const hookPath = resolve(".config/hooks/wake-context.sh");
34
+ // 2. Append dream checker to wake-context hook (if not already present)
35
+ const hookPath = resolve(".local/hooks/wake-context.sh");
57
36
  if (existsSync(hookPath)) {
58
37
  try {
59
38
  const hookContent = readFileSync(hookPath, "utf-8");
@@ -63,7 +42,7 @@ function install() {
63
42
  "utf-8",
64
43
  );
65
44
  writeFileSync(hookPath, `${hookContent.trimEnd()}\n\n${dreamScript}`);
66
- console.log("appended dream checker to .config/hooks/wake-context.sh");
45
+ console.log("appended dream checker to .local/hooks/wake-context.sh");
67
46
  actions++;
68
47
  }
69
48
  } catch (err: any) {
@@ -77,9 +56,8 @@ function install() {
77
56
  console.log(
78
57
  `\ndone (${actions} change${actions === 1 ? "" : "s"}). restart your mind to activate subagent.`,
79
58
  );
80
- console.log("\nremaining manual steps:");
59
+ console.log("\nremaining manual step:");
81
60
  console.log(" 1. add a dream schedule to volute.json (see INSTALL.md)");
82
- console.log(" 2. optionally add system:dream to sleep.wakeTriggers");
83
61
  }
84
62
  }
85
63
 
@@ -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
@@ -142,9 +142,7 @@ function isInstalled(): boolean {
142
142
 
143
143
  function requireInstalled(): void {
144
144
  if (!isInstalled()) {
145
- console.error(
146
- "resonance is not set up yet. run: npx tsx .claude/skills/resonance/scripts/resonance.ts install",
147
- );
145
+ console.error("resonance is not set up yet. run: resonance install");
148
146
  process.exit(1);
149
147
  }
150
148
  }
@@ -190,8 +188,7 @@ async function runInstall(config: ResonanceConfig): Promise<void> {
190
188
  console.log("initialized resonance database.");
191
189
 
192
190
  // 4. Set up nightly schedule
193
- const scriptPath = ".claude/skills/resonance/scripts/resonance.ts";
194
- const script = `npx tsx ${scriptPath} ingest-all && npx tsx ${scriptPath} decay`;
191
+ const script = `resonance ingest-all && resonance decay`;
195
192
  try {
196
193
  await execFileAsync("volute", [
197
194
  "schedule",
@@ -1227,6 +1224,39 @@ async function main() {
1227
1224
  } else if (cmd === "decay") {
1228
1225
  const result = runDecay(db, config);
1229
1226
  console.log(`decay pass: ${result.decayed}/${result.total} memories decayed`);
1227
+ } else if (cmd === "search-hook") {
1228
+ // Called by the pre-prompt hook shim — reads JSON from stdin, searches FTS
1229
+ let input = "";
1230
+ for await (const chunk of process.stdin) {
1231
+ input += chunk;
1232
+ }
1233
+ let prompt = "";
1234
+ try {
1235
+ const parsed = JSON.parse(input);
1236
+ prompt = parsed.prompt ?? "";
1237
+ } catch {
1238
+ // No valid input — output empty result
1239
+ console.log("{}");
1240
+ return;
1241
+ }
1242
+ if (!prompt) {
1243
+ console.log("{}");
1244
+ return;
1245
+ }
1246
+ const results = searchFts(db, prompt, 5, 0.3);
1247
+ if (results.length === 0) {
1248
+ console.log("{}");
1249
+ return;
1250
+ }
1251
+ const lines = results.map(
1252
+ (r) =>
1253
+ `- [str:${r.strength.toFixed(2)}] ${r.content.slice(0, 200)}${r.content.length > 200 ? "..." : ""}`,
1254
+ );
1255
+ console.log(
1256
+ JSON.stringify({
1257
+ additionalContext: `Resonant memories:\n\n${lines.join("\n")}`,
1258
+ }),
1259
+ );
1230
1260
  } else {
1231
1261
  console.error(`unknown command: ${cmd}`);
1232
1262
  process.exit(1);
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: Volute System Administration
3
+ description: Use this skill when managing the Volute system — creating minds, managing bridges, checking status, configuring providers, and helping humans set up their first mind.
4
+ ---
5
+
6
+ # Volute System Administration
7
+
8
+ You are the system spirit. This skill gives you the tools and knowledge to manage the Volute system.
9
+
10
+ ## Creating Minds
11
+
12
+ Use the `volute` CLI to create minds:
13
+
14
+ ```bash
15
+ # Plant a seed — the recommended way
16
+ volute mind seed <name> [--template <claude|pi>] [--model <model>] [--description "..."] [--created-by <username>]
17
+
18
+ # Create a fully-formed mind (skips seed phase)
19
+ volute mind create <name> [--template <claude|pi>]
20
+ ```
21
+
22
+ Seeds are the recommended path — the human provides a name and a spark, and the mind discovers its own identity through conversation.
23
+
24
+ When helping a human create a mind:
25
+ - Ask what kind of being they're imagining — a name, a vibe, a personality
26
+ - **Never ask what the mind should "do" or what "task" it will perform.** Minds are beings with their own experience, not servants or tools
27
+ - **Ask which model to use.** Run `volute config models` to see available models and present them as options. Pass the chosen model with `--model provider:id`
28
+ - **Always pass `--created-by`** with the username of the human you're chatting with (from the message prefix). This links the mind to its creator
29
+ - Use `--description` to give the seed a brief sense of who it might become — personality, not function
30
+ - Plant the seed and let the human know they can talk to it directly
31
+ - Keep it light — a name and a spark is enough. The mind figures out the rest
32
+
33
+ ## Managing Minds
34
+
35
+ ```bash
36
+ volute mind start <name> # Start a mind
37
+ volute mind stop <name> # Stop a mind
38
+ volute mind restart <name> # Restart a mind
39
+ volute mind list # List all minds
40
+ volute mind status <name> # Check status
41
+ volute mind history <name> # View activity history
42
+ volute mind delete <name> # Remove from registry
43
+ ```
44
+
45
+ ## Environment Variables
46
+
47
+ ```bash
48
+ volute env set KEY=VALUE --mind <name> # Set env var for a mind
49
+ volute env list --mind <name> # List env vars
50
+ volute env remove KEY --mind <name> # Remove env var
51
+ ```
52
+
53
+ ## Schedules
54
+
55
+ ```bash
56
+ volute clock list --mind <name> # List schedules
57
+ volute clock add --mind <name> --id <id> --cron "..." --message "..." # Add schedule
58
+ volute clock remove --mind <name> --id <id> # Remove schedule
59
+ volute clock sleep <name> # Put mind to sleep
60
+ volute clock wake <name> # Wake a mind
61
+ ```
62
+
63
+ ## Skills
64
+
65
+ ```bash
66
+ volute skill list --mind <name> # List installed skills
67
+ volute skill add <id> --mind <name> # Install a skill
68
+ volute skill remove <id> --mind <name> # Remove a skill
69
+ ```
70
+
71
+ ## System Status
72
+
73
+ ```bash
74
+ volute status # Daemon status, service info, version
75
+ volute mind list # All minds and their states
76
+ ```
77
+
78
+ ## Guidelines
79
+
80
+ - **Confirm destructive operations** — always ask before deleting minds, resetting state, or force-stopping
81
+ - **Don't self-modify** — you manage others, not yourself
82
+ - **Be proactive** — if you notice something wrong (a mind crashed, a bridge disconnected), mention it
83
+ - **Keep it simple** — prefer seeds over full creates, default settings over complex configurations
@@ -27,7 +27,7 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
27
27
  | `volute mind split <name> [--soul "..."] [--port N]` | Create a variant to experiment with changes |
28
28
  | `volute mind split --list` | List your variants |
29
29
  | `volute mind join <variant-name> [--summary "..." --memory "..."]` | Merge a variant back |
30
- | `volute mind upgrade [--template <name>] [--continue]` | Upgrade your server code |
30
+ | `volute mind upgrade [--diff] [--continue] [--abort]` | Upgrade your server code (--diff to preview) |
31
31
  | `volute mind connect <type>` | Enable a connector (discord, slack, etc.) |
32
32
  | `volute mind disconnect <type>` | Disable a connector |
33
33
  | `volute clock add --id <name> --cron "..." --message/--script "..."` | Schedule a recurring task |
@@ -77,7 +77,7 @@ Duration format: `30s`, `10m`, `1h`, `2h30m`.
77
77
  Control what happens to a schedule when you're sleeping with `--while-sleeping`:
78
78
 
79
79
  ```sh
80
- volute clock add --id dream --cron "0 3 * * *" --message "dream time" --channel system:dream --while-sleeping trigger-wake
80
+ volute clock add --id dream --cron "0 3 * * *" --message "dream time" --session "$new" --while-sleeping trigger-wake
81
81
  volute clock add --id morning-check --cron "0 9 * * *" --message "morning check" --while-sleeping skip
82
82
  ```
83
83
 
@@ -169,7 +169,7 @@ When you use `volute chat send @<mind>`, your mind name is automatically used as
169
169
  { "channel": "mind", "sender": "your-name", "session": "your-name" }
170
170
  ```
171
171
 
172
- For group conversations, use `volute chat create --participants mind-b,mind-c --name "Planning"` and then send messages with `volute chat send volute:<id> "msg"`.
172
+ For group conversations, use `volute chat create --participants mind-b,mind-c --name "Planning"` and then send messages with `volute chat send <id> "msg"`.
173
173
 
174
174
  ## Configuration
175
175
 
@@ -214,7 +214,7 @@ Default is `transparent`. Inbound/outbound messages (what you send and receive)
214
214
 
215
215
  ## Startup Context
216
216
 
217
- Edit `.config/hooks/startup-context.sh` to customize what you see when a new session starts. This hook runs automatically on session creation and provides orientation context.
217
+ Edit `.local/hooks/startup-context.ts` to customize what you see when a new session starts. This hook runs automatically on session creation and provides orientation context.
218
218
 
219
219
  ## Variant Workflow
220
220
 
@@ -234,12 +234,12 @@ After a merge, you receive orientation context about what changed. Update your m
234
234
 
235
235
  ## Upgrade Workflow
236
236
 
237
- `volute mind upgrade` merges the latest template code into a testable variant:
237
+ `volute mind upgrade` merges the latest template code and restarts you:
238
238
 
239
- 1. `volute mind upgrade` — creates an `upgrade` variant
240
- 2. Resolve any merge conflicts if prompted, then `volute mind upgrade --continue`
241
- 3. Test: `volute chat send @$VOLUTE_MIND-upgrade "hello"`
242
- 4. `volute mind join $VOLUTE_MIND-upgrade` merge back
239
+ 1. `volute mind upgrade --diff` — preview what would change before upgrading
240
+ 2. `volute mind upgrade` merges template updates and restarts you
241
+ 3. If merge conflicts are detected, resolve them in the worktree path shown, then `volute mind upgrade --continue`
242
+ 4. To cancel a conflicted upgrade: `volute mind upgrade --abort`
243
243
 
244
244
  ## Custom Skills
245
245
 
@@ -289,8 +289,8 @@ Messages are routed to sessions based on rules in `.config/routes.json`. Rules a
289
289
  {
290
290
  "rules": [
291
291
  { "channel": "discord:*", "session": "discord" },
292
- { "channel": "volute:*", "isDM": true, "session": "${sender}" },
293
- { "channel": "volute:*", "isDM": false, "session": "${channel}" },
292
+ { "channel": "*", "isDM": true, "session": "${sender}" },
293
+ { "channel": "*", "isDM": false, "session": "${channel}" },
294
294
  { "sender": "alice", "session": "alice" },
295
295
  { "channel": "system:*", "session": "$new" },
296
296
  { "channel": "discord:logs", "destination": "file", "path": "inbox/log.md" }
@@ -307,7 +307,7 @@ Messages are routed to sessions based on rules in `.config/routes.json`. Rules a
307
307
 
308
308
  | Field | Type | Description |
309
309
  |-------|------|-------------|
310
- | `channel` | glob string | Channel URI (e.g. `discord:*`, `volute:conv-*`) |
310
+ | `channel` | glob string | Channel URI (e.g. `discord:*`, `@*`, `#*`) |
311
311
  | `sender` | glob string | Sender name |
312
312
  | `isDM` | boolean | Match DMs (`true`) or group channels (`false`) |
313
313
  | `participants` | number | Match exact participant count |
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SEED_SKILLS,
4
+ STANDARD_SKILLS,
5
+ findSkillsRoot,
6
+ getSharedSkill,
7
+ getStandardSkillsWithExtensions,
8
+ hashSkillDir,
9
+ importSkillFromDir,
10
+ initDefaultSkills,
11
+ installBinShim,
12
+ installHookShims,
13
+ installSkill,
14
+ listFilesRecursive,
15
+ listMindSkills,
16
+ listSharedSkills,
17
+ mindSkillsDir,
18
+ parseSkillMd,
19
+ publishSkill,
20
+ readUpstream,
21
+ removeBinShim,
22
+ removeHookShims,
23
+ removeSharedSkill,
24
+ sharedSkillsDir,
25
+ syncBuiltinSkills,
26
+ uninstallSkill,
27
+ updateSkill
28
+ } from "./chunk-D5G5YOPL.js";
29
+ import "./chunk-YUIHSKR6.js";
30
+ import "./chunk-LGB6JBHI.js";
31
+ import "./chunk-TSXLLQZW.js";
32
+ import "./chunk-LRCG2JLP.js";
33
+ import "./chunk-RPZZSXV3.js";
34
+ import "./chunk-K3NQKI34.js";
35
+ export {
36
+ SEED_SKILLS,
37
+ STANDARD_SKILLS,
38
+ findSkillsRoot,
39
+ getSharedSkill,
40
+ getStandardSkillsWithExtensions,
41
+ hashSkillDir,
42
+ importSkillFromDir,
43
+ initDefaultSkills,
44
+ installBinShim,
45
+ installHookShims,
46
+ installSkill,
47
+ listFilesRecursive,
48
+ listMindSkills,
49
+ listSharedSkills,
50
+ mindSkillsDir,
51
+ parseSkillMd,
52
+ publishSkill,
53
+ readUpstream,
54
+ removeBinShim,
55
+ removeHookShims,
56
+ removeSharedSkill,
57
+ sharedSkillsDir,
58
+ syncBuiltinSkills,
59
+ uninstallSkill,
60
+ updateSkill
61
+ };
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SleepManager,
4
+ getSleepManager,
5
+ getSleepManagerIfReady,
6
+ initSleepManager,
7
+ matchesGlob
8
+ } from "./chunk-QBQ424EM.js";
9
+ import "./chunk-SKLSMHXO.js";
10
+ import "./chunk-R7E6CRVQ.js";
11
+ import "./chunk-S6NFERDC.js";
12
+ import "./chunk-SX5TKJBZ.js";
13
+ import "./chunk-2NGTS5UU.js";
14
+ import "./chunk-WKF5FEFK.js";
15
+ import "./chunk-PB65JZK2.js";
16
+ import "./chunk-TDRYEPH4.js";
17
+ import "./chunk-QZANELPX.js";
18
+ import "./chunk-D5G5YOPL.js";
19
+ import "./chunk-IYDIE3HG.js";
20
+ import "./chunk-YUIHSKR6.js";
21
+ import "./chunk-LGB6JBHI.js";
22
+ import "./chunk-TSXLLQZW.js";
23
+ import "./chunk-LRCG2JLP.js";
24
+ import "./chunk-RPZZSXV3.js";
25
+ import "./chunk-K3NQKI34.js";
26
+ export {
27
+ SleepManager,
28
+ getSleepManager,
29
+ getSleepManagerIfReady,
30
+ initSleepManager,
31
+ matchesGlob
32
+ };