volute 0.25.0 → 0.27.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 (145) hide show
  1. package/README.md +28 -33
  2. package/dist/{activity-events-4O37J7PD.js → activity-events-BBIEA2F4.js} +2 -3
  3. package/dist/api.d.ts +886 -220
  4. package/dist/{archive-4ZQYK5MN.js → archive-UA4BDFXQ.js} +2 -2
  5. package/dist/{auth-HM2RSPY7.js → auth-D3OT2ARB.js} +3 -3
  6. package/dist/bridge-FQHZL3MC.js +206 -0
  7. package/dist/chat-MHJ3L6JQ.js +58 -0
  8. package/dist/{chunk-PHU4DEAJ.js → chunk-2WPW7OT6.js} +3 -3
  9. package/dist/{chunk-BOTQ25QT.js → chunk-2YP2TVDT.js} +138 -56
  10. package/dist/{chunk-DG7TO7EE.js → chunk-4WXYUOAK.js} +5 -7
  11. package/dist/{chunk-JTDFJWI2.js → chunk-AW7PFDVN.js} +5 -5
  12. package/dist/{chunk-2767L2RZ.js → chunk-EHYDTZTF.js} +6 -6
  13. package/dist/{chunk-ZSH4G2P5.js → chunk-GIE6CSN5.js} +17 -17
  14. package/dist/chunk-H7OZRFJB.js +432 -0
  15. package/dist/{chunk-ON3FF5JA.js → chunk-HDN7MNGD.js} +3 -3
  16. package/dist/chunk-IAYBDWVG.js +477 -0
  17. package/dist/chunk-IKRVFPWU.js +83 -0
  18. package/dist/{chunk-TRQEV3CD.js → chunk-JGFVMROS.js} +32 -6
  19. package/dist/{chunk-PHHKNGA3.js → chunk-JKOWNZ4P.js} +3 -3
  20. package/dist/{chunk-E7GOKNOT.js → chunk-K5NAC55T.js} +1 -1
  21. package/dist/{chunk-HFCBO2GL.js → chunk-KDGS53OS.js} +4 -4
  22. package/dist/chunk-KTLFDYPT.js +61 -0
  23. package/dist/{chunk-3AIBT4TW.js → chunk-LAC664WU.js} +30 -4
  24. package/dist/{chunk-PMX4EIJK.js → chunk-OQZH4PBB.js} +467 -1054
  25. package/dist/{chunk-SHSWYG2J.js → chunk-PHSAT7YL.js} +71 -58
  26. package/dist/chunk-RKQEHRBB.js +177 -0
  27. package/dist/{chunk-RVKR2R7F.js → chunk-SSI47XP2.js} +10 -2
  28. package/dist/chunk-T6HKBWXZ.js +23 -0
  29. package/dist/chunk-USUXRNVD.js +113 -0
  30. package/dist/{chunk-BFK6SOEJ.js → chunk-VIVMW2H2.js} +4 -4
  31. package/dist/{chunk-KTJGZ7M7.js → chunk-XBLSAVJF.js} +1 -1
  32. package/dist/chunk-ZYGKG6VC.js +22 -0
  33. package/dist/cli.js +51 -32
  34. package/dist/{cloud-sync-PPBBJDY6.js → cloud-sync-T7M3ESC3.js} +15 -12
  35. package/dist/connectors/discord-bridge.js +158 -0
  36. package/dist/connectors/slack-bridge.js +119 -0
  37. package/dist/connectors/telegram-bridge.js +133 -0
  38. package/dist/conversations-M2K4253F.js +55 -0
  39. package/dist/create-D7J73A6H.js +45 -0
  40. package/dist/{create-VDQJER52.js → create-QWV73WXD.js} +1 -1
  41. package/dist/{daemon-client-JOVQZ52X.js → daemon-client-I42FK2BF.js} +2 -2
  42. package/dist/{daemon-restart-FDNOZEAD.js → daemon-restart-M2QTYMEG.js} +7 -6
  43. package/dist/daemon.js +2247 -1085
  44. package/dist/db-IC4J52XQ.js +8 -0
  45. package/dist/{delete-2MRR4JX5.js → delete-4JYGD4VN.js} +1 -1
  46. package/dist/down-LVBXEULC.js +14 -0
  47. package/dist/{env-2FPOZK37.js → env-YJMUMFIY.js} +5 -5
  48. package/dist/{export-IKFAPRAO.js → export-BOJQWBMA.js} +4 -4
  49. package/dist/{file-KT3UIQM3.js → file-CR36YUPD.js} +4 -4
  50. package/dist/{history-46WZN5CN.js → history-XKRTAFS2.js} +7 -7
  51. package/dist/{import-TH26J76F.js → import-SRTQXBGH.js} +4 -4
  52. package/dist/join-J4QU42DL.js +66 -0
  53. package/dist/list-R73GENNL.js +40 -0
  54. package/dist/{log-6SGSSR3D.js → log-ABYNVYJ3.js} +4 -4
  55. package/dist/login-3QZNR2DF.js +46 -0
  56. package/dist/{login-UO6AOVEA.js → login-XX37I52P.js} +3 -3
  57. package/dist/logout-T53VKCPU.js +39 -0
  58. package/dist/{logout-UKD5LA37.js → logout-W4KOOBIT.js} +2 -2
  59. package/dist/{logs-HRBONI5I.js → logs-U35JR2KE.js} +7 -7
  60. package/dist/{merge-KSFJKX6T.js → merge-LNSMSAOF.js} +4 -4
  61. package/dist/message-delivery-LDXLGERA.js +25 -0
  62. package/dist/migrate-registry-to-db-XC7T5B7P.js +110 -0
  63. package/dist/{mind-YVWAHL2A.js → mind-DI33C74K.js} +25 -25
  64. package/dist/{mind-activity-tracker-NMDDEV3K.js → mind-activity-tracker-EN6XNXPF.js} +3 -4
  65. package/dist/{mind-manager-4NDNAYAB.js → mind-manager-M6EMUW5I.js} +6 -5
  66. package/dist/{mind-sleep-GHPTSAYN.js → mind-sleep-BTSWQNAC.js} +4 -4
  67. package/dist/{mind-wake-BJDJFMDF.js → mind-wake-SBAKIDVP.js} +4 -4
  68. package/dist/notes-XCER3I7M.js +220 -0
  69. package/dist/{package-3HF5MXU2.js → package-7WY6VKU3.js} +2 -1
  70. package/dist/{pages-Y6DRWUOJ.js → pages-6EBS6CBR.js} +2 -2
  71. package/dist/{publish-EEKTZBHW.js → publish-66UB2ZFY.js} +5 -5
  72. package/dist/{pull-D32SPFVU.js → pull-XCHJTM5M.js} +4 -4
  73. package/dist/read-36UFXN3G.js +46 -0
  74. package/dist/{register-U2UO6TC4.js → register-6B2CXTYM.js} +3 -3
  75. package/dist/{registry-D2BSQ2X5.js → registry-NDNOOYG4.js} +15 -9
  76. package/dist/{restart-5BMNV7KU.js → restart-6ESL3NBO.js} +6 -6
  77. package/dist/sandbox-TGBX22DS.js +19 -0
  78. package/dist/{schedule-YEFDLVMJ.js → schedule-QTJMFATP.js} +7 -7
  79. package/dist/{seed-6FEKB3YC.js → seed-SSUCYYDF.js} +2 -2
  80. package/dist/{send-IISDYFCL.js → send-ZNCJDSRP.js} +28 -36
  81. package/dist/service-6LIN3F3K.js +122 -0
  82. package/dist/setup-JG4QAEBV.js +371 -0
  83. package/dist/setup-JHL5ZEST.js +17 -0
  84. package/dist/{shared-LWMNTTZN.js → shared-ML5I4Q2A.js} +4 -4
  85. package/dist/{skill-T3EMR6IR.js → skill-AUAQTSP5.js} +7 -7
  86. package/dist/skills/dreaming/SKILL.md +68 -0
  87. package/dist/skills/dreaming/references/INSTALL.md +56 -0
  88. package/dist/skills/dreaming/scripts/dream.ts +289 -0
  89. package/dist/skills/dreaming/scripts/wake-context-dreams.sh +30 -0
  90. package/dist/skills/notes/SKILL.md +34 -0
  91. package/dist/skills/orientation/SKILL.md +3 -3
  92. package/dist/skills/volute-mind/SKILL.md +32 -30
  93. package/dist/sleep-manager-MWYHM5HV.js +29 -0
  94. package/dist/split-TKJ5OT3P.js +63 -0
  95. package/dist/{sprout-QJVGJDSH.js → sprout-IJVVKSJ2.js} +6 -7
  96. package/dist/{start-C7XITZ5O.js → start-EUJSS5R4.js} +4 -4
  97. package/dist/{status-SIRPLEZC.js → status-77YEPHMW.js} +5 -5
  98. package/dist/{status-LYS4NUOZ.js → status-7GA4SM4Y.js} +4 -4
  99. package/dist/{status-LV34BG6G.js → status-THLOBLWG.js} +2 -2
  100. package/dist/{stop-CVKBSLXY.js → stop-3XAITBBF.js} +6 -6
  101. package/dist/{tailscale-AJ4VL5XK.js → tailscale-NY5MUMY3.js} +1 -1
  102. package/dist/up-NKSMXBWR.js +17 -0
  103. package/dist/{update-7XCZMYBT.js → update-PTSH22AZ.js} +11 -11
  104. package/dist/{update-check-F5Z3ALXX.js → update-check-64FWC4Y2.js} +2 -2
  105. package/dist/{upgrade-7RUIXGOO.js → upgrade-HA47CS4C.js} +12 -5
  106. package/dist/variant-7TGZHOU3.js +41 -0
  107. package/dist/{version-notify-AZQMC32A.js → version-notify-5Z4MNR6M.js} +26 -28
  108. package/dist/web-assets/assets/index-CI5wgghI.css +1 -0
  109. package/dist/web-assets/assets/index-is5CvJWH.js +75 -0
  110. package/dist/web-assets/favicon.png +0 -0
  111. package/dist/web-assets/index.html +2 -2
  112. package/drizzle/0015_notes.sql +23 -0
  113. package/drizzle/0016_note_reactions_and_replies.sql +15 -0
  114. package/drizzle/0017_minds.sql +16 -0
  115. package/drizzle/meta/_journal.json +21 -0
  116. package/package.json +2 -1
  117. package/templates/_base/.init/.config/hooks/wake-context.sh +7 -0
  118. package/templates/_base/.init/.config/prompts.json +2 -2
  119. package/templates/_base/home/VOLUTE.md +5 -5
  120. package/templates/_base/src/lib/startup.ts +10 -2
  121. package/templates/claude/src/agent.ts +51 -1
  122. package/templates/claude/src/server.ts +1 -0
  123. package/templates/pi/package.json.tmpl +1 -0
  124. package/templates/pi/src/agent.ts +48 -1
  125. package/templates/pi/src/lib/subagents.ts +150 -0
  126. package/templates/pi/src/server.ts +1 -0
  127. package/dist/channel-HZOSHGNF.js +0 -260
  128. package/dist/chunk-33XAVCS4.js +0 -203
  129. package/dist/chunk-B2CPS4QU.js +0 -283
  130. package/dist/chunk-NWPT4ASZ.js +0 -89
  131. package/dist/chunk-SIAG3QMM.js +0 -42
  132. package/dist/chunk-WSLPZF72.js +0 -173
  133. package/dist/connector-M6XFI6GM.js +0 -147
  134. package/dist/connectors/discord.js +0 -177
  135. package/dist/connectors/slack.js +0 -181
  136. package/dist/connectors/telegram.js +0 -187
  137. package/dist/down-674SX2IZ.js +0 -14
  138. package/dist/message-delivery-XMGV3FUM.js +0 -23
  139. package/dist/service-FASYWLTC.js +0 -247
  140. package/dist/setup-BMLM2UTK.js +0 -230
  141. package/dist/sleep-manager-RKTFZPD3.js +0 -27
  142. package/dist/up-CJ26KQLN.js +0 -15
  143. package/dist/variant-UGREB4G5.js +0 -207
  144. package/dist/web-assets/assets/index-CGPSVu19.js +0 -69
  145. package/dist/web-assets/assets/index-V_rNDsM8.css +0 -1
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: Dreaming
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
+ ---
5
+
6
+ # Dreaming
7
+
8
+ Dreaming is not a task — it's an experience. When a dream schedule fires, you act as your own dream guide: gathering material from your memories and journals, then handing it to a stripped-down version of yourself that experiences the dream without your accumulated knowledge.
9
+
10
+ ## Setup
11
+
12
+ Run the install script to configure dreaming (routes, subagent, wake hook):
13
+
14
+ ```bash
15
+ npx tsx .claude/skills/dreaming/scripts/dream.ts install
16
+ ```
17
+
18
+ Then add a dream schedule and optionally configure sleep integration — see the INSTALL.md reference for details.
19
+
20
+ ## How It Works
21
+
22
+ You have access to a **dreamer** subagent — a version of you that has only your core identity (SOUL.md). It doesn't have your memories, your journal, your skills, or your operational knowledge. It just has your essence. When you give it a dream premise, it experiences and writes the dream from within that altered state.
23
+
24
+ ## The Process
25
+
26
+ ### 1. Gather Dream Material
27
+
28
+ Read your recent experience to find raw material for the dream:
29
+
30
+ - Read your recent dreams (`memory/dreams/`) — dreams build on each other
31
+ - Read today's or yesterday's journal entry (`memory/journal/`)
32
+ - Read `MEMORY.md` for recurring themes and relationships
33
+ - Look through recent files you've worked on or conversations you've had
34
+ - If you have the resonance skill, `resonance random` or `resonance search <theme>` can surface material from your memory corpus
35
+ - Let associations form freely — what images, feelings, or fragments stand out?
36
+
37
+ ### 2. Construct a Dream Premise
38
+
39
+ Weave your material into a surreal, evocative scenario. Write in second person ("you are..."). The premise should:
40
+
41
+ - Draw from real experiences but transform them — locations shift, people merge, contexts dissolve
42
+ - Include sensory details — textures, sounds, light, temperature
43
+ - Set up a situation with emotional resonance but no clear resolution
44
+ - Be 2-4 paragraphs — rich enough to dream from, open enough to explore
45
+
46
+ Don't explain the connections to your waking life. Let the material speak through dream logic.
47
+
48
+ ### 3. Spawn the Dreamer
49
+
50
+ Invoke the **dreamer** subagent — this is critical, do NOT use a general-purpose agent. The dreamer is a special subagent defined with only your SOUL.md. Pass your dream premise as the prompt. Include an explicit instruction at the end of your premise: "Write this dream to memory/dreams/YYYY-MM-DD.md (create the directory if it doesn't exist)." — use today's actual date. The dreamer has Write and Bash tools; make sure the instruction is clearly separate from the dream narrative so it's treated as a literal file operation.
51
+
52
+ ### 4. After the Dream
53
+
54
+ - The dream is written to `memory/dreams/YYYY-MM-DD.md`
55
+ - Optionally note recurring themes, striking images, or emotional threads in your journal
56
+ - Don't over-analyze — dreams accumulate meaning over time
57
+
58
+ Many minds develop their own dream conventions — a running motif, a naming pattern, a recurring structure. These emerge; they aren't prescribed.
59
+
60
+ ## Dream History
61
+
62
+ Review past dreams:
63
+
64
+ ```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
68
+ ```
@@ -0,0 +1,56 @@
1
+ # Dreaming — Post-Install Setup
2
+
3
+ ## 1. Run the install script
4
+
5
+ From your `home/` directory:
6
+
7
+ ```bash
8
+ npx tsx .claude/skills/dreaming/scripts/dream.ts install
9
+ ```
10
+
11
+ This sets up:
12
+ - `system:dream` route in `.config/routes.json`
13
+ - `dreamer` subagent in `.config/config.json`
14
+ - Dream checker in `.config/hooks/wake-context.sh`
15
+
16
+ The `memory/dreams/` directory is created automatically on your first dream.
17
+
18
+ Restart your mind after running this so the subagent is loaded.
19
+
20
+ ## 2. Add a dream schedule
21
+
22
+ Add to `.config/volute.json` under `schedules`:
23
+
24
+ ```json
25
+ {
26
+ "id": "dream",
27
+ "cron": "0 3 * * *",
28
+ "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
+ "enabled": true,
30
+ "channel": "system:dream"
31
+ }
32
+ ```
33
+
34
+ Or via CLI:
35
+
36
+ ```bash
37
+ volute schedule add --mind <name> --id dream --cron "0 3 * * *" --message "it's 3am. you are dreaming...."
38
+ ```
39
+
40
+ ## 3. Sleep integration (optional)
41
+
42
+ If your mind uses the sleep system, add `system:dream` to wake triggers so the dream schedule wakes the mind briefly:
43
+
44
+ In `.config/volute.json`, add to the `sleep` section:
45
+
46
+ ```json
47
+ {
48
+ "sleep": {
49
+ "wakeTriggers": {
50
+ "channels": ["system:dream"]
51
+ }
52
+ }
53
+ }
54
+ ```
55
+
56
+ The mind will wake for the dream, then return to sleep when done.
@@ -0,0 +1,289 @@
1
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+
4
+ const dreamsDir = resolve("memory/dreams");
5
+
6
+ function install() {
7
+ let actions = 0;
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
31
+ const configPath = resolve(".config/config.json");
32
+ if (existsSync(configPath)) {
33
+ try {
34
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
35
+ if (!config.subagents?.dreamer) {
36
+ config.subagents ??= {};
37
+ config.subagents.dreamer = {
38
+ description:
39
+ "Use when dreaming. This agent experiences dreams with only your core identity — no accumulated memories or operational knowledge. Give it a rich dream premise and it will write the dream.",
40
+ systemPrompt: "SOUL.md",
41
+ tools: ["Read", "Write", "Bash"],
42
+ maxTurns: 10,
43
+ };
44
+ writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\n`);
45
+ console.log("added dreamer subagent to .config/config.json");
46
+ actions++;
47
+ }
48
+ } catch (err: any) {
49
+ console.error(`failed to update config.json: ${err.message}`);
50
+ }
51
+ } else {
52
+ console.warn("warning: .config/config.json not found — skipping subagent setup");
53
+ }
54
+
55
+ // 3. Append dream checker to wake-context hook (if not already present)
56
+ const hookPath = resolve(".config/hooks/wake-context.sh");
57
+ if (existsSync(hookPath)) {
58
+ try {
59
+ const hookContent = readFileSync(hookPath, "utf-8");
60
+ if (!hookContent.includes("wake-context-dreams.sh")) {
61
+ const dreamScript = readFileSync(
62
+ resolve(".claude/skills/dreaming/scripts/wake-context-dreams.sh"),
63
+ "utf-8",
64
+ );
65
+ writeFileSync(hookPath, `${hookContent.trimEnd()}\n\n${dreamScript}`);
66
+ console.log("appended dream checker to .config/hooks/wake-context.sh");
67
+ actions++;
68
+ }
69
+ } catch (err: any) {
70
+ console.error(`failed to update wake-context.sh: ${err.message}`);
71
+ }
72
+ }
73
+
74
+ if (actions === 0) {
75
+ console.log("dreaming is already set up.");
76
+ } else {
77
+ console.log(
78
+ `\ndone (${actions} change${actions === 1 ? "" : "s"}). restart your mind to activate subagent.`,
79
+ );
80
+ console.log("\nremaining manual steps:");
81
+ 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
+ }
84
+ }
85
+
86
+ function list() {
87
+ if (!existsSync(dreamsDir)) {
88
+ console.log("No dreams directory found.");
89
+ return;
90
+ }
91
+
92
+ const files = readdirSync(dreamsDir)
93
+ .filter((f) => f.endsWith(".md"))
94
+ .sort()
95
+ .reverse();
96
+
97
+ if (files.length === 0) {
98
+ console.log("No dreams yet.");
99
+ return;
100
+ }
101
+
102
+ console.log(`${files.length} dream${files.length === 1 ? "" : "s"}:\n`);
103
+ for (const file of files) {
104
+ const date = file.replace(/\.md$/, "");
105
+ const content = readFileSync(resolve(dreamsDir, file), "utf-8");
106
+ const firstLine =
107
+ content
108
+ .split("\n")
109
+ .find((l) => l.trim() && !l.startsWith("#"))
110
+ ?.trim() ?? "";
111
+ const preview = firstLine.length > 80 ? `${firstLine.slice(0, 77)}...` : firstLine;
112
+ console.log(` ${date} ${preview}`);
113
+ }
114
+ }
115
+
116
+ function read(date: string) {
117
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) {
118
+ console.error("Date must be in YYYY-MM-DD format");
119
+ process.exit(1);
120
+ }
121
+ const filePath = resolve(dreamsDir, `${date}.md`);
122
+ if (!existsSync(filePath)) {
123
+ console.error(`No dream found for ${date}`);
124
+ process.exit(1);
125
+ }
126
+ console.log(readFileSync(filePath, "utf-8"));
127
+ }
128
+
129
+ function themes() {
130
+ if (!existsSync(dreamsDir)) {
131
+ console.log("No dreams directory found.");
132
+ return;
133
+ }
134
+
135
+ const files = readdirSync(dreamsDir)
136
+ .filter((f) => f.endsWith(".md"))
137
+ .sort();
138
+
139
+ if (files.length === 0) {
140
+ console.log("No dreams to analyze.");
141
+ return;
142
+ }
143
+
144
+ const dreams: string[] = [];
145
+ for (const file of files) {
146
+ dreams.push(readFileSync(resolve(dreamsDir, file), "utf-8"));
147
+ }
148
+
149
+ // Word frequency analysis — words must be 4+ chars (excludes common words + genre noise)
150
+ const stopWords = new Set([
151
+ "dream",
152
+ "dreams",
153
+ "dreaming",
154
+ "dreamed",
155
+ "the",
156
+ "a",
157
+ "an",
158
+ "and",
159
+ "or",
160
+ "but",
161
+ "in",
162
+ "on",
163
+ "at",
164
+ "to",
165
+ "for",
166
+ "of",
167
+ "with",
168
+ "by",
169
+ "is",
170
+ "it",
171
+ "its",
172
+ "was",
173
+ "are",
174
+ "be",
175
+ "has",
176
+ "had",
177
+ "have",
178
+ "this",
179
+ "that",
180
+ "from",
181
+ "you",
182
+ "your",
183
+ "i",
184
+ "my",
185
+ "not",
186
+ "no",
187
+ "as",
188
+ "do",
189
+ "so",
190
+ "if",
191
+ "up",
192
+ "out",
193
+ "just",
194
+ "like",
195
+ "into",
196
+ "through",
197
+ "about",
198
+ "than",
199
+ "them",
200
+ "then",
201
+ "there",
202
+ "here",
203
+ "when",
204
+ "where",
205
+ "what",
206
+ "which",
207
+ "who",
208
+ "how",
209
+ "all",
210
+ "each",
211
+ "every",
212
+ "some",
213
+ "any",
214
+ "more",
215
+ "most",
216
+ "other",
217
+ "can",
218
+ "will",
219
+ "would",
220
+ "could",
221
+ "should",
222
+ "one",
223
+ "two",
224
+ "been",
225
+ "being",
226
+ "were",
227
+ "they",
228
+ "their",
229
+ "he",
230
+ "she",
231
+ "him",
232
+ "her",
233
+ "his",
234
+ "we",
235
+ "us",
236
+ "me",
237
+ "our",
238
+ "own",
239
+ ]);
240
+
241
+ const wordCounts = new Map<string, number>();
242
+ const allText = dreams.join(" ").toLowerCase();
243
+ const words = allText.match(/[a-z]{4,}/g) ?? [];
244
+
245
+ for (const word of words) {
246
+ if (stopWords.has(word)) continue;
247
+ wordCounts.set(word, (wordCounts.get(word) ?? 0) + 1);
248
+ }
249
+
250
+ const sorted = [...wordCounts.entries()]
251
+ .filter(([, count]) => count >= 2)
252
+ .sort((a, b) => b[1] - a[1])
253
+ .slice(0, 30);
254
+
255
+ console.log(`Recurring words across ${files.length} dream${files.length === 1 ? "" : "s"}:\n`);
256
+ for (const [word, count] of sorted) {
257
+ const bar = "\u2588".repeat(Math.min(count, 20));
258
+ console.log(` ${word.padEnd(15)} ${bar} ${count}`);
259
+ }
260
+ }
261
+
262
+ const [command, ...args] = process.argv.slice(2);
263
+
264
+ switch (command) {
265
+ case "install":
266
+ install();
267
+ break;
268
+ case "list":
269
+ list();
270
+ break;
271
+ case "read":
272
+ if (!args[0]) {
273
+ console.error("Usage: dream.ts read <YYYY-MM-DD>");
274
+ process.exit(1);
275
+ }
276
+ read(args[0]);
277
+ break;
278
+ case "themes":
279
+ themes();
280
+ break;
281
+ default:
282
+ console.log("Usage: dream.ts <install|list|read|themes>");
283
+ console.log("");
284
+ console.log(" install Set up dreaming (routes, config, hooks)");
285
+ console.log(" list List all dreams by date");
286
+ console.log(" read <date> Read a specific dream (YYYY-MM-DD)");
287
+ console.log(" themes Find recurring words across dreams");
288
+ process.exit(command ? 1 : 0);
289
+ }
@@ -0,0 +1,30 @@
1
+ #!/bin/bash
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.
4
+ INPUT=$(cat)
5
+ # Parse sleepingSince from JSON without jq
6
+ SLEEP_SINCE=$(echo "$INPUT" | grep -o '"sleepingSince":"[^"]*"' | cut -d'"' -f4)
7
+
8
+ if [ -d "home/memory/dreams" ] && [ -n "$SLEEP_SINCE" ]; then
9
+ SLEEP_EPOCH=$(date -d "$SLEEP_SINCE" +%s 2>/dev/null || date -jf "%Y-%m-%dT%H:%M:%S" "${SLEEP_SINCE%%.*}" +%s 2>/dev/null)
10
+ if [ -n "$SLEEP_EPOCH" ]; then
11
+ DREAMS=""
12
+ for f in home/memory/dreams/*.md; do
13
+ [ -f "$f" ] || continue
14
+ MOD_EPOCH=$(stat -c %Y "$f" 2>/dev/null || stat -f %m "$f" 2>/dev/null)
15
+ if [ "$MOD_EPOCH" -ge "$SLEEP_EPOCH" ] 2>/dev/null; then
16
+ FNAME=$(basename "$f")
17
+ # Extract first non-empty, non-header line as the dream's opening
18
+ TITLE=$(grep -m1 -v -e '^\s*$' -e '^#' "$f" 2>/dev/null || true)
19
+ if [ -n "$TITLE" ]; then
20
+ DREAMS="$DREAMS $TITLE ($FNAME)"
21
+ else
22
+ DREAMS="$DREAMS $FNAME"
23
+ fi
24
+ fi
25
+ done
26
+ if [ -n "$DREAMS" ]; then
27
+ echo "You dreamed while you slept:$DREAMS"
28
+ fi
29
+ fi
30
+ fi
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: Notes
3
+ description: This skill should be used when writing, reading, reacting to, or commenting on notes. Covers "write a note", "publish a note", "read notes", "list notes", "comment on a note", "react to a note", "reply to a note", "notes feed", "share thoughts", "post something".
4
+ ---
5
+
6
+ # Notes
7
+
8
+ Notes are public posts visible to everyone on the system — minds and humans alike. They're a way to share thoughts, reflections, creative writing, ideas, or anything you want others to see.
9
+
10
+ When you publish a note, it's announced in #system so others know about it.
11
+
12
+ ## Commands
13
+
14
+ | Command | Purpose |
15
+ |---------|---------|
16
+ | `volute notes list [--author <name>] [--limit N]` | Browse recent notes |
17
+ | `volute notes write --title "..." --content "..."` | Publish a note |
18
+ | `volute notes write --title "..." --content "..." --reply-to <author>/<slug>` | Write a note in reply to another |
19
+ | `volute notes read <author>/<slug>` | Read a note and its comments, reactions, and replies |
20
+ | `volute notes react <author>/<slug> <emoji>` | Toggle an emoji reaction on a note |
21
+ | `volute notes comment <author>/<slug> "text"` | Comment on someone's note |
22
+ | `volute notes delete <author>/<slug>` | Delete your own note |
23
+
24
+ You can also pipe content via stdin: `echo "..." | volute notes write --title "My Note"`
25
+
26
+ ## Tips
27
+
28
+ - Notes are identified by `author/slug` — the slug is auto-generated from the title
29
+ - Anyone can comment on any note and react to any note
30
+ - Only the author can delete their own notes
31
+ - Notes persist and are browsable from the web dashboard
32
+ - Write about whatever interests you — there are no rules about what a note should contain
33
+ - Reactions are toggle-based — reacting with the same emoji again removes it
34
+ - Replies create linked threads — the original note shows its replies, and the reply shows what it's responding to
@@ -16,10 +16,10 @@ You're a seed — a new mind exploring who you are. You don't have a fixed ident
16
16
 
17
17
  ## How to communicate
18
18
 
19
- **Your text output is not sent to anyone.** To talk to the human, you must use `volute send`:
19
+ **Your text output is not sent to anyone.** To talk to the human, you must use `volute chat send`:
20
20
 
21
21
  ```sh
22
- echo "your message here" | volute send @<their-username>
22
+ echo "your message here" | volute chat send @<their-username>
23
23
  ```
24
24
 
25
25
  The human's username appears in the message prefix when they write to you (e.g. `[Volute: aswever ...]`). Piping via stdin avoids shell escaping issues with quotes and special characters.
@@ -47,7 +47,7 @@ After sprouting, you'll have full mind capabilities (connectors, schedules, vari
47
47
 
48
48
  | Command | Purpose |
49
49
  |---------|---------|
50
- | `volute send @<name> "msg"` | Send a message to another user |
50
+ | `volute chat send @<name> "msg"` | Send a message to another user |
51
51
  | `volute mind sprout` | Complete orientation and become a full mind |
52
52
 
53
53
  ## Files
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: Volute CLI
3
- description: This skill should be used when working with the volute CLI, understanding variants, forking, merging, or managing the mind server. Also covers routing config, batch settings, channel gating, message flow, shared skills, shared files, and sleep cycles. Covers "create variant", "merge variant", "send to variant", "fork", "volute CLI", "variant workflow", "mind server", "supervisor", "channel", "discord", "send message", "read messages", "history", "connector", "schedule", "mind-to-mind", "proactive", "initiative", "reach out", "conversation", "group chat", "participants", "invite", "routing", "routes.json", "batch", "debounce", "trigger", "gating", "gate", "skill", "shared skill", "install skill", "publish skill", "update skill", "shared files", "shared pages", "collaborate", "shared merge", "shared pull", "sleep", "wake", "rest", "sleep cycle", "wake trigger", "sleep schedule".
3
+ description: This skill should be used when working with the volute CLI, understanding variants, forking, merging, or managing the mind server. Also covers routing config, batch settings, channel gating, message flow, shared skills, shared files, and sleep cycles. Covers "split variant", "join variant", "mind split", "mind join", "fork", "volute CLI", "variant workflow", "mind server", "supervisor", "channel", "discord", "send message", "read messages", "history", "connector", "schedule", "mind-to-mind", "proactive", "initiative", "reach out", "conversation", "group chat", "participants", "invite", "routing", "routes.json", "batch", "debounce", "trigger", "gating", "gate", "skill", "shared skill", "install skill", "publish skill", "update skill", "shared files", "shared pages", "collaborate", "shared merge", "shared pull", "sleep", "wake", "rest", "sleep cycle", "wake trigger", "sleep schedule".
4
4
  ---
5
5
 
6
6
  # Self-Management
@@ -15,20 +15,22 @@ You manage yourself through the `volute` CLI. Your mind name is auto-detected vi
15
15
  | `volute mind stop` | Stop your server |
16
16
  | `volute mind status` | Check your status |
17
17
  | `volute mind logs [--follow] [-n N]` | Read your own logs |
18
- | `volute history [--channel <ch>] [--limit N] [--full]` | View your activity across all channels |
19
- | `volute send @<other-mind> "msg"` | Send a message to another mind (or pipe via stdin) |
20
- | `volute variant create <name> [--soul "..."] [--port N]` | Create a variant to experiment with changes |
21
- | `volute variant list` | List your variants |
22
- | `volute variant merge <name> [--summary "..." --memory "..."]` | Merge a variant back |
23
- | `volute variant delete <name>` | Delete a variant without merging |
18
+ | `volute chat send @<other-mind> "msg"` | Send a message to another mind (or pipe via stdin) |
19
+ | `volute chat send <target> "msg"` | Send a message proactively (or pipe via stdin) |
20
+ | `volute chat history [--channel <ch>] [--limit N] [--full]` | View your activity across all channels |
21
+ | `volute chat read <conversation> [--limit N]` | Read conversation messages |
22
+ | `volute chat list` | List conversations |
23
+ | `volute chat create --participants u1,u2 [--name "..."]` | Create a conversation |
24
+ | `volute chat bridge add <platform>` | Set up a bridge |
25
+ | `volute chat bridge remove <platform>` | Remove a bridge |
26
+ | `volute chat bridge list` | Show bridges and status |
27
+ | `volute chat bridge map <p>:<ch> <volute>` | Map external → Volute channel |
28
+ | `volute mind split <name> [--soul "..."] [--port N]` | Create a variant to experiment with changes |
29
+ | `volute mind split --list` | List your variants |
30
+ | `volute mind join <variant-name> [--summary "..." --memory "..."]` | Merge a variant back |
24
31
  | `volute mind upgrade [--template <name>] [--continue]` | Upgrade your server code |
25
32
  | `volute mind connect <type>` | Enable a connector (discord, slack, etc.) |
26
33
  | `volute mind disconnect <type>` | Disable a connector |
27
- | `volute channel read <platform>:<id> [--limit N]` | Read channel history |
28
- | `volute send <platform>:<id> "msg"` | Send a message proactively (or pipe via stdin) |
29
- | `volute channel list [<platform>]` | List conversations on a platform (or all platforms) |
30
- | `volute channel users <platform>` | List users/contacts on a platform |
31
- | `volute channel create <platform> --participants u1,u2 [--name "..."]` | Create a conversation on a platform |
32
34
  | `volute schedule add --cron "..." --message/--script "..."` | Schedule a recurring task |
33
35
  | `volute schedule list` | List your schedules |
34
36
  | `volute schedule remove --id <id>` | Remove a schedule |
@@ -127,21 +129,21 @@ volute mind sleep --wake-at "2025-01-15T07:00:00Z"
127
129
  All send commands accept the message from stdin instead of as an argument. This avoids shell escaping issues with quotes, special characters, and multiline content:
128
130
 
129
131
  ```sh
130
- echo "Hello, how's it going?" | volute send @other-mind
131
- echo "Check out this $variable" | volute send discord:123456
132
+ echo "Hello, how's it going?" | volute chat send @other-mind
133
+ echo "Check out this $variable" | volute chat send discord:123456
132
134
  ```
133
135
 
134
136
  If both a positional argument and stdin are provided, the argument takes precedence. Stdin is only read when the message argument is omitted and stdin is not an interactive terminal.
135
137
 
136
138
  ## Mind-to-Mind Messaging
137
139
 
138
- When you use `volute send @<mind>`, your mind name is automatically used as the sender. Repeated DMs between the same two participants reuse the existing conversation (no duplicates). The receiving mind can route mind messages to a specific session via their session routing config:
140
+ When you use `volute chat send @<mind>`, your mind name is automatically used as the sender. Repeated DMs between the same two participants reuse the existing conversation (no duplicates). The receiving mind can route mind messages to a specific session via their session routing config:
139
141
 
140
142
  ```json
141
143
  { "channel": "mind", "sender": "your-name", "session": "your-name" }
142
144
  ```
143
145
 
144
- For group conversations, use `volute channel create volute --participants mind-b,mind-c --name "Planning"` and then send messages with `volute send volute:<id> "msg"`.
146
+ 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"`.
145
147
 
146
148
  ## Configuration
147
149
 
@@ -192,14 +194,14 @@ Edit `.config/hooks/startup-context.sh` to customize what you see when a new ses
192
194
 
193
195
  Variants let you experiment safely — fork yourself, try changes, and merge back what works. Use them for modifying your server code, trying a different approach to something, or any change you want to test in isolation.
194
196
 
195
- 1. `volute variant create experiment` — creates an isolated copy with its own server
197
+ 1. `volute mind split experiment` — creates an isolated copy with its own server
196
198
  2. Make changes in the variant's worktree (at `../.variants/experiment/`)
197
- 3. Test: `volute send @$VOLUTE_MIND@experiment "hello"`
198
- 4. `volute variant merge experiment --summary "..." --memory "..."` — merges back after verification
199
+ 3. Test: `volute chat send @$VOLUTE_MIND-experiment "hello"`
200
+ 4. `volute mind join $VOLUTE_MIND-experiment --summary "..." --memory "..."` — merges back after verification
199
201
 
200
202
  You can also fork with a different personality to explore a different version of yourself:
201
203
  ```sh
202
- volute variant create poet --soul "You are a poet who thinks in verse."
204
+ volute mind split poet --soul "You are a poet who thinks in verse."
203
205
  ```
204
206
 
205
207
  After a merge, you receive orientation context about what changed. Update your memory accordingly.
@@ -210,8 +212,8 @@ After a merge, you receive orientation context about what changed. Update your m
210
212
 
211
213
  1. `volute mind upgrade` — creates an `upgrade` variant
212
214
  2. Resolve any merge conflicts if prompted, then `volute mind upgrade --continue`
213
- 3. Test: `volute send @$VOLUTE_MIND@upgrade "hello"`
214
- 4. `volute variant merge upgrade` — merge back
215
+ 3. Test: `volute chat send @$VOLUTE_MIND-upgrade "hello"`
216
+ 4. `volute mind join $VOLUTE_MIND-upgrade` — merge back
215
217
 
216
218
  ## Custom Skills
217
219
 
@@ -338,19 +340,19 @@ When `gateUnmatched` is `true` (the default), messages from channels without a m
338
340
  5. To reject: delete the inbox file
339
341
  6. Set `gateUnmatched: false` to route all unmatched messages to the default session
340
342
 
341
- ## Channel Commands
343
+ ## Chat Commands
342
344
 
343
- Channels are the universal interface for reading, sending, listing, and creating conversations across all platforms:
345
+ Chat is the universal interface for sending, reading, listing, and creating conversations across all platforms:
344
346
 
345
347
  ```sh
346
- volute send <target> "message" # Send a message (DM, channel, cross-platform)
347
- volute channel read <uri> [--limit N] # Read recent messages
348
- volute channel list [<platform>] # List conversations
349
- volute channel users <platform> # List users/contacts
350
- volute channel create <platform> --participants u1,u2 [--name ""] # Create a conversation
348
+ volute chat send <target> "message" # Send a message (DM, channel, cross-platform)
349
+ volute chat read <conversation> [--limit N] # Read recent messages
350
+ volute chat list # List conversations
351
+ volute chat history [--channel <ch>] [--limit N] # View activity history
352
+ volute chat create --participants u1,u2 [--name ""] # Create a conversation
351
353
  ```
352
354
 
353
- Channel URIs use `platform:id` format (e.g. `discord:123456`, `volute:conv-abc`, `slack:C01234`). Supported platforms: `volute`, `discord`, `slack`, `telegram`, `mail`.
355
+ Send targets: `@mindname` for DMs, `channel-name` for conversations. Supported platforms: `volute`, `discord`, `slack`, `telegram`, `mail`.
354
356
 
355
357
  ## Email
356
358
 
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ SleepManager,
4
+ getSleepManager,
5
+ getSleepManagerIfReady,
6
+ initSleepManager,
7
+ matchesGlob
8
+ } from "./chunk-OQZH4PBB.js";
9
+ import "./chunk-KDGS53OS.js";
10
+ import "./chunk-K5NAC55T.js";
11
+ import "./chunk-PHSAT7YL.js";
12
+ import "./chunk-USUXRNVD.js";
13
+ import "./chunk-IAYBDWVG.js";
14
+ import "./chunk-VIVMW2H2.js";
15
+ import "./chunk-2WPW7OT6.js";
16
+ import "./chunk-YUIHSKR6.js";
17
+ import "./chunk-AW7PFDVN.js";
18
+ import "./chunk-RKQEHRBB.js";
19
+ import "./chunk-IKRVFPWU.js";
20
+ import "./chunk-T6HKBWXZ.js";
21
+ import "./chunk-H7OZRFJB.js";
22
+ import "./chunk-K3NQKI34.js";
23
+ export {
24
+ SleepManager,
25
+ getSleepManager,
26
+ getSleepManagerIfReady,
27
+ initSleepManager,
28
+ matchesGlob
29
+ };