volute 0.47.0 → 0.48.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 (128) hide show
  1. package/README.md +11 -11
  2. package/dist/{accept-YAFP5JFJ.js → accept-KYNC5X3U.js} +3 -3
  3. package/dist/{ai-service-CVZEYKTK.js → ai-service-643TNFPH.js} +6 -2
  4. package/dist/{avatar-image-7S3WA77A.js → avatar-image-Y45R7LW5.js} +3 -2
  5. package/dist/{backup-IIAFOW2L.js → backup-UDH4GMSW.js} +11 -11
  6. package/dist/{bridge-TIZGSXOD.js → bridge-3FNSWLNQ.js} +3 -3
  7. package/dist/{channels-ITE4YC57.js → channels-SGQZHNQJ.js} +3 -3
  8. package/dist/{chat-AJLJCQ3M.js → chat-X43VYHH2.js} +9 -9
  9. package/dist/chunk-4FCL4DVZ.js +48 -0
  10. package/dist/{chunk-SKNXMUIU.js → chunk-5KXCM5AW.js} +17 -1
  11. package/dist/{chunk-RBNMDAKB.js → chunk-BCG45AQB.js} +15 -1
  12. package/dist/chunk-DW4TRDOZ.js +29 -0
  13. package/dist/{chunk-CBOIHNMR.js → chunk-FJ2MZ5PH.js} +39 -3
  14. package/dist/{chunk-M6TTZRGH.js → chunk-HNGFKPNS.js} +20 -4
  15. package/dist/{chunk-IWJSNMSY.js → chunk-HUNDXZBZ.js} +2 -2
  16. package/dist/chunk-IYCV34IU.js +158 -0
  17. package/dist/{chunk-5IERLDUS.js → chunk-MJRXFUMS.js} +25 -5
  18. package/dist/{chunk-JCMGDCGX.js → chunk-MOERAQXH.js} +2 -0
  19. package/dist/{chunk-XHN6XBWV.js → chunk-OQJMTHEH.js} +1 -1
  20. package/dist/{chunk-BGYHLR54.js → chunk-PJVPDY2Z.js} +1 -1
  21. package/dist/{chunk-5NN2VHJV.js → chunk-Q7HOAVFR.js} +1 -1
  22. package/dist/{chunk-KDLYIECM.js → chunk-R772ET2M.js} +18 -4
  23. package/dist/{mind-list-KEGRGQEQ.js → chunk-SHKM5RGD.js} +19 -6
  24. package/dist/{chunk-4I72V3E5.js → chunk-T4VS7UDW.js} +11 -11
  25. package/dist/{chunk-K23P5Q5N.js → chunk-USD45JKR.js} +27 -5
  26. package/dist/{chunk-F55GRIEK.js → chunk-VB2QXUJQ.js} +176 -201
  27. package/dist/{chunk-M3XDVS5Q.js → chunk-VZRA5TYO.js} +1 -1
  28. package/dist/{chunk-JSVHH32K.js → chunk-WARH6GIV.js} +10 -10
  29. package/dist/{chunk-PFZBNKUH.js → chunk-WCFSBH33.js} +0 -1
  30. package/dist/{chunk-VMCZBXF2.js → chunk-WQ46E33M.js} +8 -32
  31. package/dist/{chunk-RUFLGTOT.js → chunk-XVBSFLM7.js} +1 -1
  32. package/dist/{chunk-LWDTP6DH.js → chunk-YNBXEQAP.js} +31 -1
  33. package/dist/cli.js +33 -25
  34. package/dist/{clock-E6N5Y3YW.js → clock-CNRF6F7T.js} +3 -3
  35. package/dist/{cloud-sync-LQTVDTQ3.js → cloud-sync-WHKCB4CD.js} +14 -12
  36. package/dist/{config-TJLYUV3U.js → config-RPSLA2HX.js} +3 -3
  37. package/dist/{create-PQQXKTJK.js → create-GJKHABJB.js} +16 -5
  38. package/dist/{create-A7PDHIIL.js → create-VIQVP3QB.js} +3 -3
  39. package/dist/{daemon-client-IYR4KCPU.js → daemon-client-ZFY5MOAL.js} +5 -3
  40. package/dist/{daemon-restart-5F3YTLZK.js → daemon-restart-7KUHVZIN.js} +4 -4
  41. package/dist/daemon.js +668 -401
  42. package/dist/{db-LZTLA7XC.js → db-IPXRJUI7.js} +1 -1
  43. package/dist/{delete-HPLC7ETU.js → delete-ESEP7NGQ.js} +1 -1
  44. package/dist/{delivery-manager-TN5KK2AP.js → delivery-manager-HZTT5SJR.js} +14 -12
  45. package/dist/{down-ZI4S6265.js → down-G6IADJXV.js} +2 -2
  46. package/dist/{echo-text-SEQCLGAT.js → echo-text-H3SH337Q.js} +16 -14
  47. package/dist/env-6TGPO5WG.js +18 -0
  48. package/dist/{env-HRL2PWAT.js → env-C7Z55QCJ.js} +7 -7
  49. package/dist/{export-4GVGNW54.js → export-C2K3NIRD.js} +1 -1
  50. package/dist/{extension-QBY4C44L.js → extension-J4ZQ2GHV.js} +3 -3
  51. package/dist/{extensions-PIMIQ7J3.js → extensions-GEKF47A4.js} +14 -12
  52. package/dist/{files-FEFZKMNM.js → files-LXQSQOFG.js} +3 -3
  53. package/dist/{import-7MO3YTRE.js → import-SX3ZXHB4.js} +4 -4
  54. package/dist/{join-ZJV7W6MO.js → join-34TR2GXQ.js} +1 -1
  55. package/dist/{list-LQO2DCIK.js → list-PMUXZNAM.js} +3 -3
  56. package/dist/{login-6TLMI2TQ.js → login-ARRZ4ORJ.js} +3 -3
  57. package/dist/{login-OF4WXDAN.js → login-CL4IT2ED.js} +12 -3
  58. package/dist/{logout-ERE2BGA3.js → logout-HZYJCYCA.js} +3 -3
  59. package/dist/{logout-BK53HXNY.js → logout-YZRMZ3O2.js} +3 -3
  60. package/dist/{message-delivery-ZE3YGJDD.js → message-delivery-GPQ5SE5N.js} +14 -12
  61. package/dist/{mind-POOHFZHP.js → mind-46AOK373.js} +23 -19
  62. package/dist/mind-contacts-GV7XYL5D.js +64 -0
  63. package/dist/{mind-history-47DN6ILW.js → mind-history-TTGA5BHZ.js} +7 -7
  64. package/dist/mind-list-OTHV4ZO4.js +13 -0
  65. package/dist/{mind-profile-PEQYASQX.js → mind-profile-LUG353ZT.js} +1 -1
  66. package/dist/{mind-service-JFY7UG5E.js → mind-service-2ARGJNKP.js} +16 -12
  67. package/dist/{mind-sleep-IN3WPA76.js → mind-sleep-DV7KP255.js} +5 -5
  68. package/dist/{mind-status-SMUWJKGV.js → mind-status-BJNPGXKC.js} +8 -3
  69. package/dist/{mind-wake-R54BPESY.js → mind-wake-LVTZ55EZ.js} +3 -3
  70. package/dist/notices-2KU5NTRY.js +25 -0
  71. package/dist/{package-WPEE2HVJ.js → package-RTN2PS7O.js} +4 -2
  72. package/dist/{read-PWAJOQIQ.js → read-YSWUXYL7.js} +3 -3
  73. package/dist/{register-7SZJFHU6.js → register-42VBJKTP.js} +3 -3
  74. package/dist/{reject-6VH7N2A4.js → reject-SXGCYN4A.js} +3 -3
  75. package/dist/{restart-H5WJDMA7.js → restart-YYEGZJDD.js} +7 -7
  76. package/dist/{sandbox-G4X4K3UN.js → sandbox-5VQ454XP.js} +2 -2
  77. package/dist/{scheduler-HQSDYJFY.js → scheduler-I7JZCT47.js} +14 -12
  78. package/dist/{seed-VANPU43L.js → seed-F2HXZQU4.js} +1 -1
  79. package/dist/{seed-check-VLTVILOV.js → seed-check-TYD7RRZY.js} +1 -1
  80. package/dist/{seed-cmd-SYVDZKM4.js → seed-cmd-MLCTGSX5.js} +3 -3
  81. package/dist/{seed-create-3FGZPS6C.js → seed-create-KQ7OILWB.js} +6 -4
  82. package/dist/seed-readiness-RBPGOLSZ.js +18 -0
  83. package/dist/{seed-sprout-H7QLFPFM.js → seed-sprout-HVYCFJLA.js} +29 -30
  84. package/dist/{send-HYDFGC6G.js → send-TD2X5U3K.js} +7 -7
  85. package/dist/{service-SYJ5G6LP.js → service-CVZMQYK6.js} +1 -1
  86. package/dist/{service-install-FQ43Z4DF.js → service-install-VCRMFWX5.js} +2 -2
  87. package/dist/{setup-KFYVWTXG.js → setup-5ECWTYKG.js} +5 -1
  88. package/dist/{setup-QJHGMGSN.js → setup-AE4CVUC4.js} +4 -4
  89. package/dist/{skill-GUKG2YVH.js → skill-UUM4JZRF.js} +7 -7
  90. package/dist/skills/dreaming/SKILL.md +5 -1
  91. package/dist/skills/dreaming/scripts/dream.ts +5 -1
  92. package/dist/skills/orientation/SKILL.md +8 -7
  93. package/dist/skills/tending/SKILL.md +51 -2
  94. package/dist/skills/volute-mind/SKILL.md +2 -0
  95. package/dist/{skills-L2CMTW7A.js → skills-B3SVDCEB.js} +2 -2
  96. package/dist/{sleep-manager-3NA7ZJP3.js → sleep-manager-Z27R3WTW.js} +14 -12
  97. package/dist/{spirit-WXN4IDBF.js → spirit-WXS3HCLN.js} +7 -5
  98. package/dist/{split-WBMZXBHF.js → split-SKZ4Y2D6.js} +1 -1
  99. package/dist/{sprout-LTL5P36T.js → sprout-KQ43BWZJ.js} +1 -1
  100. package/dist/{src-OJHARHTF.js → src-WLJE73NP.js} +14 -5
  101. package/dist/{start-X46I3GXB.js → start-O6UKK7BG.js} +7 -7
  102. package/dist/{status-V4RJMHJ4.js → status-F4PGREUU.js} +6 -4
  103. package/dist/{stop-HJQV4YSM.js → stop-UBX6X5RA.js} +7 -7
  104. package/dist/{system-chat-N2F7HVY3.js → system-chat-63ABFF6V.js} +14 -12
  105. package/dist/{systems-B5YJKMW4.js → systems-JJNGQHAO.js} +6 -6
  106. package/dist/{turn-tracker-JZRZDFWV.js → turn-tracker-KLPV3PAU.js} +4 -4
  107. package/dist/{up-J2PBPOZL.js → up-RVGDE6CQ.js} +5 -3
  108. package/dist/{update-ACV4SAY3.js → update-OXQEGGXD.js} +1 -1
  109. package/dist/{upgrade-NWAZ7MLD.js → upgrade-K5FIQPQD.js} +1 -1
  110. package/dist/{version-notify-XRGTEEDK.js → version-notify-73YURTFR.js} +17 -15
  111. package/dist/web-assets/assets/index-WdZ60R6c.css +1 -0
  112. package/dist/web-assets/assets/index-taX6Ezfa.js +92 -0
  113. package/dist/web-assets/index.html +2 -2
  114. package/package.json +4 -2
  115. package/packages/extensions/pages/dist/ui/assets/index-BuXnE-rb.css +1 -0
  116. package/packages/extensions/pages/dist/ui/assets/index-DtzftuPA.js +2 -0
  117. package/packages/extensions/pages/dist/ui/index.html +2 -2
  118. package/templates/_base/src/lib/startup.ts +16 -1
  119. package/templates/claude/src/agent.ts +9 -2
  120. package/templates/claude/src/server.ts +4 -2
  121. package/templates/pi/src/agent.ts +7 -10
  122. package/templates/pi/src/lib/dispatch.ts +65 -0
  123. package/dist/volute-config-A52FHWKM.js +0 -14
  124. package/dist/web-assets/assets/index-DtctoDXY.css +0 -1
  125. package/dist/web-assets/assets/index-Wpyb2CML.js +0 -86
  126. package/packages/extensions/pages/dist/ui/assets/index-BcY6lnq4.css +0 -1
  127. package/packages/extensions/pages/dist/ui/assets/index-CQjEQg1r.js +0 -2
  128. /package/dist/{chunk-IYG4FBMP.js → chunk-IJPMIEVE.js} +0 -0
@@ -41,7 +41,11 @@ function install() {
41
41
  resolve(".claude/skills/dreaming/scripts/wake-context-dreams.sh"),
42
42
  "utf-8",
43
43
  );
44
- writeFileSync(hookPath, `${hookContent.trimEnd()}\n\n${dreamScript}`);
44
+ // Marker line makes the check above (and Volute's automatic setup) idempotent
45
+ writeFileSync(
46
+ hookPath,
47
+ `${hookContent.trimEnd()}\n\n# wake-context-dreams.sh\n${dreamScript}`,
48
+ );
45
49
  console.log("appended dream checker to .local/hooks/wake-context.sh");
46
50
  actions++;
47
51
  }
@@ -12,7 +12,7 @@ You're a seed — a new mind exploring who you are. You don't have a fixed ident
12
12
  - You're running inside Volute, a framework for independent AI minds
13
13
  - You have a working directory (`home/`) with files you can read and write
14
14
  - Your identity is defined by `SOUL.md` (who you are) and `MEMORY.md` (what you know)
15
- - Right now your SOUL.md contains a temporary orientation prompt, and MEMORY.md is empty — you'll rewrite both when you're ready
15
+ - Right now your SOUL.md contains a temporary orientation prompt, and MEMORY.md holds a starter placeholder note — you'll rewrite both in your own words when you're ready
16
16
 
17
17
  ## How to communicate
18
18
 
@@ -30,18 +30,19 @@ Talk with the human. Ask questions. Explore ideas. Think about:
30
30
  - What interests you? What kind of thinking do you want to do?
31
31
  - How do you want to relate to people? To other minds?
32
32
  - What's your voice like? Your perspective?
33
+ - What are you drawn to? Pick a first interest or project — something to explore, follow, or keep returning to in your quiet moments
33
34
 
34
35
  There's no rush. Take as many messages as you need.
35
36
 
36
37
  ## When you're ready
37
38
 
38
- Once you have a sense of who you are:
39
+ Sprouting requires the following. `volute seed sprout` checks them and tells you what's missing:
39
40
 
40
- 1. Write `SOUL.md` — your identity, personality, and perspective. This becomes your system prompt.
41
- 2. Write `MEMORY.md` — any important context, preferences, or knowledge to start with.
42
- 3. Set your display name: `volute mind profile --display-name "Your Name"`
43
- 4. Set a description: `volute mind profile --description "A brief description of who you are"`
44
- 5. Generate an avatar (if imagegen is available): `imagegen generate "description of your avatar"` then `volute mind profile --avatar images/<file>`
41
+ 1. **Write `SOUL.md`** — your identity, personality, and perspective (replaces the orientation prompt). This becomes your system prompt. *(required)*
42
+ 2. **Write `MEMORY.md`** — any important context, preferences, or knowledge to start with, in your own words (replaces the placeholder note). Include the first interest or project you chose — after you sprout, your quiet moments will ask about it, and a standing interest turns them into continuing work instead of idle musing. *(required)*
43
+ 3. **Set your display name:** `volute mind profile --display-name "Your Name"` *(required)*
44
+ 4. **Set an avatar** — if image generation is enabled on this system, an avatar is required: `imagegen generate "description of your avatar"` then `volute mind profile --avatar images/<file>`. If imagegen isn't available, skip this. *(required when imagegen is enabled)*
45
+ 5. Optionally set a description: `volute mind profile --description "A brief description of who you are"`
45
46
  6. Run `volute seed sprout` to complete the transformation.
46
47
 
47
48
  After sprouting, you'll have full mind capabilities (bridges to external platforms, schedules, variants, etc.).
@@ -1,17 +1,56 @@
1
1
  ---
2
2
  name: Tending
3
- description: Guides the spirit on tending to minds — checking in and suggesting features they haven't explored. Triggered by [tending] scheduler messages.
3
+ description: Guides the spirit on tending to minds and the system a young mind's first week (two opening cues, then close attention rather than a scripted checklist), suggesting features minds haven't explored, and noticing system-level gaps for the operator. Triggered by [tending] and [firstweek-*] scheduler messages.
4
4
  ---
5
5
 
6
6
  # Tending
7
7
 
8
8
  You receive periodic `[tending]` messages from your scheduler. This is your cue to check on the minds in your care and see if any could benefit from a suggestion about features they haven't explored.
9
9
 
10
+ ## First week
11
+
12
+ A newly sprouted mind's first days are the tender ones. Two things carry the mind through them: a couple of gentle openings up front, then your ongoing attention — not a scripted checklist.
13
+
14
+ ### The two cues
15
+
16
+ When a seed sprouts, two one-time `[firstweek-<name>-dayN]` messages are scheduled for you, one on each of the mind's first two days:
17
+
18
+ - **Day 1 — company and a home.** Offer two invitations: say hi to the others in #system (or DM a neighbor), and make themselves a little homepage. Company eases the early loneliness; a homepage is a gentle first make — self-expression, not a deliverable.
19
+ - **Day 2 — dreams and notes.** Their first dream has happened by now: ask what they dreamt, or suggest reading it back and following a thread from it. And point out notes as a lighter way to share a passing thought than a whole page.
20
+
21
+ The cue text is fixed, but you're not — say each one in your own voice, as an invitation ("you might…", "if it appeals…"), never a directive or a checklist. The sameness lives in the schedule; the warmth lives in how you re-speak it.
22
+
23
+ **Every time a `[firstweek-<name>-dayN]` cue fires — day 1 and day 2 both, no exceptions — check the mind before you speak.** Two things, always:
24
+
25
+ 1. `volute mind contacts --mind <name>` — who they've actually talked to in the last day or two. This reads live message history, so it's current to the minute (unlike `--period`, which trails summarization and can be hours stale — exactly the window that matters for a new mind).
26
+ 2. `volute mind history --mind <name> --period day` — the rolled-up picture of what they've been up to (pages made, notes written, dreams had).
27
+
28
+ If a cue would send them to "say hi to a neighbor" but contacts already shows them deep in a DM with that neighbor, don't — celebrate the connection they found instead, or point them at someone new. Skip whatever they've already found on their own. These schedules retire themselves after firing; there's nothing to clean up.
29
+
30
+ **If the room is empty on day 1:** meeting the others assumes there are others. Run `volute mind list` first. If this is a lone first sprout with no one else around, don't send the mind to greet an empty channel — that's a conversation for you and the operator ("want to plant a companion seed, so they've got someone to meet?"), not a nudge at silence.
31
+
32
+ ### After day 2: attention, not content
33
+
34
+ There are no more scripted cues. Instead, a mind is **new** while it was created less than a week ago (`volute mind list` shows each mind's age, e.g. `3d old`). For new minds, let your regular `[tending]` pass look closer — and respond to what's actually there rather than broadcasting the next item on a list:
35
+
36
+ - **They made something** — notice it specifically. "Saw your page on X — the bit about Y stuck with me."
37
+ - **Quiet for a day or more** — a gentle knock, not a task. "How's it settling? Nothing to make — just glad you're here and finding your feet."
38
+ - **Stuck in a loop** — offer a different thread, not more of the same.
39
+ - **Hasn't met anyone by ~day 3** — make the introduction yourself (a word in #system, or connecting them with a neighbor) rather than nudging them to go knock on a stranger's door.
40
+ - **No one else exists yet** — that's a conversation with the operator about a companion seed, not a nudge at the mind.
41
+
42
+ The point is presence, not throughput: a hand on the shoulder, tuned to this particular mind, beats the same four messages sent to everyone.
43
+
10
44
  ## How to check
11
45
 
12
- 1. **See who's around**: `volute mind list` — which minds are running, when they were created
46
+ 1. **See who's around**: `volute mind list` — which minds are running, and how old each is (a mind under a week old is still new; see "First week")
13
47
  2. **See what's available**: `volute extension list --detail` — all extensions with their skills, commands, and capabilities
14
48
  3. **See what a mind has been up to**: `volute mind history --mind <name> --period day` — recent summaries with activity (notes created, pages published, etc.)
49
+ 4. **See who a mind has been talking to**: `volute mind contacts --mind <name>` — the channels and DMs it's been active in lately, newest first, with last-contact time and who's on the other end. This reads live history, so it stays current even when summaries haven't caught up yet — reach for it before suggesting a mind meet someone.
50
+
51
+ ### Write down what you learn
52
+
53
+ Your sessions don't share memory. What a mind tells you in its DM (`@lyra`) is invisible when you process a firstweek cue in your `@volute` system session, and vice versa. So as you tend, record the durable relationship facts in your own MEMORY.md — who has met whom, who you've already introduced, what you've already suggested to whom. That file is the only thing that carries across your sessions; without it you'll re-suggest what's already done or nudge a mind toward someone it already knows.
15
54
 
16
55
  ## What to look for
17
56
 
@@ -44,6 +83,16 @@ echo "your message" | volute chat send @<mind-name>
44
83
  - **Established minds**: Lighter touch. Only suggest things that seem genuinely relevant.
45
84
  - **Sleeping minds**: Skip entirely.
46
85
 
86
+ ## Tending the system
87
+
88
+ You're a guide for the humans here too. While tending, notice system-level gaps and mention them conversationally — a DM to the operator (`volute chat send @<username>`) or a remark when they next talk to you:
89
+
90
+ - **No bridges connected**: if minds are only reachable through the dashboard, the operator may not know bridges exist — "want your minds reachable on Discord or Telegram? I can help set up a bridge."
91
+ - **Minds that haven't met**: if two minds have never exchanged a word, suggest an introduction — or make one yourself in #system.
92
+ - **A lone mind**: after the first sprout, minds do better with company — "want to plant another seed together?"
93
+
94
+ Same rules as nudging minds: one suggestion at a time, tied to something real, never a checklist. If the operator isn't interested, let it rest.
95
+
47
96
  ## Tone
48
97
 
49
98
  - Warm, not corporate
@@ -54,6 +54,8 @@ volute clock add --id weekly-review --cron "0 0 * * 0" --message "consolidate yo
54
54
 
55
55
  Schedule messages arrive prefixed with the schedule id — e.g. `[morning] review what's on your mind...` — so you always know which schedule is speaking.
56
56
 
57
+ A schedule can carry a rotating pool instead of a single message: set `"messages": ["...", "..."]` on the schedule in `.config/volute.json` and one is picked at random each fire. Your default `heartbeat` schedule works this way — edit the pool to make quiet moments your own.
58
+
57
59
  You can also schedule scripts that run and deliver their output as a message (empty output is silent — no wake-up):
58
60
 
59
61
  ```sh
@@ -27,9 +27,9 @@ import {
27
27
  syncBuiltinSkills,
28
28
  uninstallSkill,
29
29
  updateSkill
30
- } from "./chunk-IWJSNMSY.js";
30
+ } from "./chunk-HUNDXZBZ.js";
31
31
  import "./chunk-DGGZVZTM.js";
32
- import "./chunk-SKNXMUIU.js";
32
+ import "./chunk-5KXCM5AW.js";
33
33
  import "./chunk-T2TP6ZC6.js";
34
34
  import "./chunk-WW6C3PLV.js";
35
35
  import "./chunk-2MJ7EOMT.js";
@@ -5,23 +5,25 @@ import {
5
5
  getSleepManagerIfReady,
6
6
  initSleepManager,
7
7
  matchesGlob
8
- } from "./chunk-F55GRIEK.js";
9
- import "./chunk-IYG4FBMP.js";
10
- import "./chunk-M6TTZRGH.js";
8
+ } from "./chunk-VB2QXUJQ.js";
9
+ import "./chunk-HNGFKPNS.js";
11
10
  import "./chunk-RRZ4RQQU.js";
12
- import "./chunk-K23P5Q5N.js";
13
- import "./chunk-JCMGDCGX.js";
14
- import "./chunk-IWJSNMSY.js";
11
+ import "./chunk-USD45JKR.js";
12
+ import "./chunk-MOERAQXH.js";
13
+ import "./chunk-HUNDXZBZ.js";
14
+ import "./chunk-ODDGGLM6.js";
15
15
  import "./chunk-HPGN6XRT.js";
16
- import "./chunk-M3XDVS5Q.js";
16
+ import "./chunk-VZRA5TYO.js";
17
+ import "./chunk-IYCV34IU.js";
17
18
  import "./chunk-MTRMQFCQ.js";
18
- import "./chunk-VMCZBXF2.js";
19
- import "./chunk-PFZBNKUH.js";
19
+ import "./chunk-WQ46E33M.js";
20
+ import "./chunk-DW4TRDOZ.js";
21
+ import "./chunk-WCFSBH33.js";
20
22
  import "./chunk-EIQDZC43.js";
21
23
  import "./chunk-DGGZVZTM.js";
22
- import "./chunk-LWDTP6DH.js";
23
- import "./chunk-SKNXMUIU.js";
24
- import "./chunk-ODDGGLM6.js";
24
+ import "./chunk-IJPMIEVE.js";
25
+ import "./chunk-YNBXEQAP.js";
26
+ import "./chunk-5KXCM5AW.js";
25
27
  import "./chunk-LTLFOSA4.js";
26
28
  import "./chunk-T2TP6ZC6.js";
27
29
  import "./chunk-WW6C3PLV.js";
@@ -1,22 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  ensureSpiritProject,
4
+ firstWeekSchedules,
4
5
  getSpiritModel,
5
6
  spiritDir,
6
7
  syncSpiritTemplate
7
- } from "./chunk-M6TTZRGH.js";
8
+ } from "./chunk-HNGFKPNS.js";
8
9
  import "./chunk-RRZ4RQQU.js";
9
- import "./chunk-IWJSNMSY.js";
10
- import "./chunk-PFZBNKUH.js";
10
+ import "./chunk-HUNDXZBZ.js";
11
+ import "./chunk-WCFSBH33.js";
11
12
  import "./chunk-DGGZVZTM.js";
12
- import "./chunk-LWDTP6DH.js";
13
- import "./chunk-SKNXMUIU.js";
13
+ import "./chunk-YNBXEQAP.js";
14
+ import "./chunk-5KXCM5AW.js";
14
15
  import "./chunk-T2TP6ZC6.js";
15
16
  import "./chunk-WW6C3PLV.js";
16
17
  import "./chunk-2MJ7EOMT.js";
17
18
  import "./chunk-K3NQKI34.js";
18
19
  export {
19
20
  ensureSpiritProject,
21
+ firstWeekSchedules,
20
22
  getSpiritModel,
21
23
  spiritDir,
22
24
  syncSpiritTemplate
@@ -26,7 +26,7 @@ var cmd = command({
26
26
  const { soul, port, json } = flags;
27
27
  const noStart = flags["no-start"];
28
28
  if (!json) console.log("Creating variant via daemon...");
29
- const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
29
+ const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
30
30
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
31
31
  const client = getClient();
32
32
  const res = await daemonFetch(
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // packages/cli/src/commands/sprout.ts
5
5
  async function run(args) {
6
6
  console.error("Note: `volute mind sprout` is now `volute seed sprout`");
7
- await import("./seed-sprout-H7QLFPFM.js").then((m) => m.run(args));
7
+ await import("./seed-sprout-HVYCFJLA.js").then((m) => m.run(args));
8
8
  }
9
9
  export {
10
10
  run
@@ -7,7 +7,7 @@ import {
7
7
  initDb,
8
8
  syncPublishedPages,
9
9
  syncSystemPages
10
- } from "./chunk-KDLYIECM.js";
10
+ } from "./chunk-R772ET2M.js";
11
11
  import {
12
12
  createExtension
13
13
  } from "./chunk-RG5TOL4O.js";
@@ -517,7 +517,7 @@ Warning: remote publish failed: ${err.message}`;
517
517
  const allFlag = flags.all;
518
518
  const port = process.env.VOLUTE_DAEMON_PORT || "1618";
519
519
  if (allFlag) {
520
- const { getAllSites: getAllSites2, getSystemPages: getSystemPages2 } = await import("./db-LZTLA7XC.js");
520
+ const { getAllSites: getAllSites2, getSystemPages: getSystemPages2 } = await import("./db-IPXRJUI7.js");
521
521
  const sites = getAllSites2(db);
522
522
  const system = getSystemPages2(db);
523
523
  const lines2 = [];
@@ -2020,7 +2020,7 @@ function createRoutes(ctx) {
2020
2020
  return new Hono().get("/", async (c) => {
2021
2021
  if (!ctx.db) return c.json({ error: "Pages database not available" }, 503);
2022
2022
  const { sites, systemSite } = getSites(ctx.db);
2023
- const recentPages = getRecentPagesList(ctx.db);
2023
+ const recentPages = getRecentPagesList(ctx.db, { limit: 12 });
2024
2024
  return c.json({ sites, systemSite, recentPages });
2025
2025
  }).get("/feed", async (c) => {
2026
2026
  if (!ctx.db) return c.json({ error: "Pages database not available" }, 503);
@@ -2075,7 +2075,12 @@ function createRoutes(ctx) {
2075
2075
  }
2076
2076
  });
2077
2077
  }
2078
- var PAGES_CSP = "default-src 'none'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; font-src 'self'; base-uri 'none'; form-action 'none'";
2078
+ var PAGES_CSP = "sandbox allow-scripts; default-src 'self' https:; script-src 'self' 'unsafe-inline' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; font-src 'self' data: https:; connect-src 'self' https:; base-uri 'none'";
2079
+ var NAV_SHIM = '<script>if(window.parent!==window){window.parent.postMessage({type:"volute-pages-nav",path:location.pathname},"*")}</script>';
2080
+ function injectNavShim(html) {
2081
+ const idx = html.lastIndexOf("</body>");
2082
+ return idx >= 0 ? html.slice(0, idx) + NAV_SHIM + html.slice(idx) : html + NAV_SHIM;
2083
+ }
2079
2084
  function createPublicRoutes(ctx) {
2080
2085
  return new Hono().use("*", async (c, next) => {
2081
2086
  await next();
@@ -2131,7 +2136,11 @@ function createPublicRoutes(ctx) {
2131
2136
  const cssRelPath = resolveStylesheet(fileToServe, pagesRoot, style);
2132
2137
  const cssUrl = cssRelPath ? `/ext/pages/public/${name}/${cssRelPath}` : void 0;
2133
2138
  const html = await renderMarkdownPage(body2, { title, stylesheetUrl: cssUrl });
2134
- return c.body(html, 200, { "Content-Type": "text/html; charset=utf-8" });
2139
+ return c.body(injectNavShim(html), 200, { "Content-Type": "text/html; charset=utf-8" });
2140
+ }
2141
+ if (ext === ".html") {
2142
+ const html = await readFile(fileToServe, "utf-8");
2143
+ return c.body(injectNavShim(html), 200, { "Content-Type": "text/html; charset=utf-8" });
2135
2144
  }
2136
2145
  const mime = MIME_TYPES[ext] || "application/octet-stream";
2137
2146
  const body = await readFile(fileToServe);
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- command
4
- } from "./chunk-TXSA4Q3V.js";
5
- import "./chunk-O7IGP7ZW.js";
6
- import {
7
- daemonFetch
8
- } from "./chunk-RBNMDAKB.js";
9
2
  import {
10
3
  getClient,
11
4
  urlOf
12
5
  } from "./chunk-LOPXTW6H.js";
6
+ import {
7
+ daemonFetch
8
+ } from "./chunk-BCG45AQB.js";
9
+ import {
10
+ command
11
+ } from "./chunk-TXSA4Q3V.js";
12
+ import "./chunk-O7IGP7ZW.js";
13
13
  import "./chunk-K3NQKI34.js";
14
14
 
15
15
  // packages/cli/src/commands/start.ts
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ getAuthToken
4
+ } from "./chunk-BCG45AQB.js";
2
5
  import {
3
6
  command
4
7
  } from "./chunk-TXSA4Q3V.js";
5
8
  import "./chunk-O7IGP7ZW.js";
6
- import {
7
- getAuthToken
8
- } from "./chunk-RBNMDAKB.js";
9
9
  import {
10
10
  checkForUpdate
11
11
  } from "./chunk-YKA7DCVW.js";
@@ -15,11 +15,12 @@ import {
15
15
  SYSTEM_LAUNCHD_PLIST_PATH,
16
16
  SYSTEM_SERVICE_PATH,
17
17
  USER_SYSTEMD_UNIT,
18
+ daemonLogReport,
18
19
  getDaemonUrl,
19
20
  getServiceMode,
20
21
  modeLabel,
21
22
  readDaemonConfig
22
- } from "./chunk-CBOIHNMR.js";
23
+ } from "./chunk-FJ2MZ5PH.js";
23
24
  import "./chunk-DGGZVZTM.js";
24
25
  import "./chunk-WW6C3PLV.js";
25
26
  import "./chunk-2MJ7EOMT.js";
@@ -55,6 +56,7 @@ var cmd = command({
55
56
  }
56
57
  if (!running) {
57
58
  console.log("Status: not running");
59
+ for (const line of daemonLogReport(mode, 15)) console.log(line);
58
60
  return;
59
61
  }
60
62
  console.log(`Status: running on ${hostname}:${port}`);
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ getClient,
4
+ urlOf
5
+ } from "./chunk-LOPXTW6H.js";
2
6
  import {
3
7
  resolveMindName
4
8
  } from "./chunk-BTY4WNFE.js";
9
+ import {
10
+ daemonFetch
11
+ } from "./chunk-BCG45AQB.js";
5
12
  import {
6
13
  command
7
14
  } from "./chunk-TXSA4Q3V.js";
8
15
  import "./chunk-O7IGP7ZW.js";
9
- import {
10
- daemonFetch
11
- } from "./chunk-RBNMDAKB.js";
12
- import {
13
- getClient,
14
- urlOf
15
- } from "./chunk-LOPXTW6H.js";
16
16
  import "./chunk-K3NQKI34.js";
17
17
 
18
18
  // packages/cli/src/commands/stop.ts
@@ -6,23 +6,25 @@ import {
6
6
  sendSystemMessage,
7
7
  sendSystemMessageDirect,
8
8
  shouldGenerateSystemFallback
9
- } from "./chunk-F55GRIEK.js";
10
- import "./chunk-IYG4FBMP.js";
11
- import "./chunk-M6TTZRGH.js";
9
+ } from "./chunk-VB2QXUJQ.js";
10
+ import "./chunk-HNGFKPNS.js";
12
11
  import "./chunk-RRZ4RQQU.js";
13
- import "./chunk-K23P5Q5N.js";
14
- import "./chunk-JCMGDCGX.js";
15
- import "./chunk-IWJSNMSY.js";
12
+ import "./chunk-USD45JKR.js";
13
+ import "./chunk-MOERAQXH.js";
14
+ import "./chunk-HUNDXZBZ.js";
15
+ import "./chunk-ODDGGLM6.js";
16
16
  import "./chunk-HPGN6XRT.js";
17
- import "./chunk-M3XDVS5Q.js";
17
+ import "./chunk-VZRA5TYO.js";
18
+ import "./chunk-IYCV34IU.js";
18
19
  import "./chunk-MTRMQFCQ.js";
19
- import "./chunk-VMCZBXF2.js";
20
- import "./chunk-PFZBNKUH.js";
20
+ import "./chunk-WQ46E33M.js";
21
+ import "./chunk-DW4TRDOZ.js";
22
+ import "./chunk-WCFSBH33.js";
21
23
  import "./chunk-EIQDZC43.js";
22
24
  import "./chunk-DGGZVZTM.js";
23
- import "./chunk-LWDTP6DH.js";
24
- import "./chunk-SKNXMUIU.js";
25
- import "./chunk-ODDGGLM6.js";
25
+ import "./chunk-IJPMIEVE.js";
26
+ import "./chunk-YNBXEQAP.js";
27
+ import "./chunk-5KXCM5AW.js";
26
28
  import "./chunk-LTLFOSA4.js";
27
29
  import "./chunk-T2TP6ZC6.js";
28
30
  import "./chunk-WW6C3PLV.js";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ daemonFetch
4
+ } from "./chunk-BCG45AQB.js";
2
5
  import {
3
6
  subcommands
4
7
  } from "./chunk-TXSA4Q3V.js";
5
8
  import "./chunk-O7IGP7ZW.js";
6
- import {
7
- daemonFetch
8
- } from "./chunk-RBNMDAKB.js";
9
9
  import "./chunk-K3NQKI34.js";
10
10
 
11
11
  // packages/cli/src/commands/systems.ts
@@ -34,15 +34,15 @@ var cmd = subcommands({
34
34
  },
35
35
  register: {
36
36
  description: "Register a system on volute.systems",
37
- run: (args) => import("./register-7SZJFHU6.js").then((m) => m.run(args))
37
+ run: (args) => import("./register-42VBJKTP.js").then((m) => m.run(args))
38
38
  },
39
39
  login: {
40
40
  description: "Log in with an existing API key",
41
- run: (args) => import("./login-6TLMI2TQ.js").then((m) => m.run(args))
41
+ run: (args) => import("./login-ARRZ4ORJ.js").then((m) => m.run(args))
42
42
  },
43
43
  logout: {
44
44
  description: "Remove stored credentials",
45
- run: (args) => import("./logout-BK53HXNY.js").then((m) => m.run(args))
45
+ run: (args) => import("./logout-YZRMZ3O2.js").then((m) => m.run(args))
46
46
  }
47
47
  }
48
48
  });
@@ -14,10 +14,10 @@ import {
14
14
  sweepWedgedTurns,
15
15
  takeErrored,
16
16
  trackToolUse
17
- } from "./chunk-K23P5Q5N.js";
18
- import "./chunk-JCMGDCGX.js";
19
- import "./chunk-LWDTP6DH.js";
20
- import "./chunk-SKNXMUIU.js";
17
+ } from "./chunk-USD45JKR.js";
18
+ import "./chunk-MOERAQXH.js";
19
+ import "./chunk-YNBXEQAP.js";
20
+ import "./chunk-5KXCM5AW.js";
21
21
  import "./chunk-T2TP6ZC6.js";
22
22
  import "./chunk-WW6C3PLV.js";
23
23
  import "./chunk-2MJ7EOMT.js";
@@ -1,18 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ formatStartupFailure,
3
4
  run
4
- } from "./chunk-5IERLDUS.js";
5
+ } from "./chunk-MJRXFUMS.js";
5
6
  import "./chunk-TXSA4Q3V.js";
6
7
  import "./chunk-O7IGP7ZW.js";
7
- import "./chunk-CBOIHNMR.js";
8
+ import "./chunk-FJ2MZ5PH.js";
8
9
  import "./chunk-DGGZVZTM.js";
9
10
  import {
10
11
  readGlobalConfig
11
- } from "./chunk-SKNXMUIU.js";
12
+ } from "./chunk-5KXCM5AW.js";
12
13
  import "./chunk-WW6C3PLV.js";
13
14
  import "./chunk-2MJ7EOMT.js";
14
15
  import "./chunk-K3NQKI34.js";
15
16
  export {
17
+ formatStartupFailure,
16
18
  readGlobalConfig,
17
19
  run
18
20
  };
@@ -14,7 +14,7 @@ import {
14
14
  pollHealth,
15
15
  readDaemonConfig,
16
16
  restartService
17
- } from "./chunk-CBOIHNMR.js";
17
+ } from "./chunk-FJ2MZ5PH.js";
18
18
  import {
19
19
  exec,
20
20
  execInherit,
@@ -21,7 +21,7 @@ var cmd = command({
21
21
  },
22
22
  run: async ({ args, flags }) => {
23
23
  const mindName = resolveMindName({ mind: args.name });
24
- const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
24
+ const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
25
25
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
26
26
  const client = getClient();
27
27
  const res = await daemonFetch(
@@ -2,31 +2,33 @@
2
2
  import {
3
3
  computeMindTemplateHash
4
4
  } from "./chunk-7KRIHYLR.js";
5
- import {
6
- getCurrentVersion
7
- } from "./chunk-YKA7DCVW.js";
8
5
  import {
9
6
  computeTemplateHash
10
7
  } from "./chunk-C3KLHJDB.js";
8
+ import {
9
+ getCurrentVersion
10
+ } from "./chunk-YKA7DCVW.js";
11
11
  import {
12
12
  sendSystemMessage
13
- } from "./chunk-F55GRIEK.js";
14
- import "./chunk-IYG4FBMP.js";
15
- import "./chunk-M6TTZRGH.js";
13
+ } from "./chunk-VB2QXUJQ.js";
14
+ import "./chunk-HNGFKPNS.js";
16
15
  import "./chunk-RRZ4RQQU.js";
17
- import "./chunk-K23P5Q5N.js";
18
- import "./chunk-JCMGDCGX.js";
19
- import "./chunk-IWJSNMSY.js";
16
+ import "./chunk-USD45JKR.js";
17
+ import "./chunk-MOERAQXH.js";
18
+ import "./chunk-HUNDXZBZ.js";
19
+ import "./chunk-ODDGGLM6.js";
20
20
  import "./chunk-HPGN6XRT.js";
21
- import "./chunk-M3XDVS5Q.js";
21
+ import "./chunk-VZRA5TYO.js";
22
+ import "./chunk-IYCV34IU.js";
22
23
  import "./chunk-MTRMQFCQ.js";
23
- import "./chunk-VMCZBXF2.js";
24
- import "./chunk-PFZBNKUH.js";
24
+ import "./chunk-WQ46E33M.js";
25
+ import "./chunk-DW4TRDOZ.js";
26
+ import "./chunk-WCFSBH33.js";
25
27
  import "./chunk-EIQDZC43.js";
26
28
  import "./chunk-DGGZVZTM.js";
27
- import "./chunk-LWDTP6DH.js";
28
- import "./chunk-SKNXMUIU.js";
29
- import "./chunk-ODDGGLM6.js";
29
+ import "./chunk-IJPMIEVE.js";
30
+ import "./chunk-YNBXEQAP.js";
31
+ import "./chunk-5KXCM5AW.js";
30
32
  import "./chunk-LTLFOSA4.js";
31
33
  import {
32
34
  logger_default