volute 0.45.2 → 0.47.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 (146) hide show
  1. package/README.md +4 -4
  2. package/dist/{activity-events-BUR2RYTJ.js → activity-events-MIOK3IOU.js} +3 -3
  3. package/dist/{ai-service-UODCCE4O.js → ai-service-CVZEYKTK.js} +4 -4
  4. package/dist/{archive-WS2L2VIQ.js → archive-6Z4GFQPH.js} +3 -3
  5. package/dist/{auth-FLAEXXZK.js → auth-A4VGHADI.js} +4 -4
  6. package/dist/avatar-image-7S3WA77A.js +22 -0
  7. package/dist/{backup-TST5C2YN.js → backup-IIAFOW2L.js} +13 -13
  8. package/dist/channels-ITE4YC57.js +89 -0
  9. package/dist/{chat-76MRWWQX.js → chat-AJLJCQ3M.js} +12 -8
  10. package/dist/{chunk-ZV7MFISX.js → chunk-2MJ7EOMT.js} +20 -2
  11. package/dist/{chunk-R77O2WMK.js → chunk-2OIYNHWO.js} +1 -1
  12. package/dist/{chunk-QCN24XEN.js → chunk-3YUBFTDN.js} +1 -1
  13. package/dist/{chunk-NYC5U6K7.js → chunk-4I72V3E5.js} +10 -10
  14. package/dist/{chunk-QNQMSWZE.js → chunk-5IERLDUS.js} +3 -3
  15. package/dist/{chunk-FXORA5JG.js → chunk-5NN2VHJV.js} +3 -3
  16. package/dist/chunk-7KRIHYLR.js +124 -0
  17. package/dist/{chunk-RRNXJOKB.js → chunk-BGYHLR54.js} +2 -2
  18. package/dist/{chunk-QMJCNZ6C.js → chunk-C3KLHJDB.js} +1 -1
  19. package/dist/{chunk-TQJ6ZYVY.js → chunk-CBOIHNMR.js} +2 -2
  20. package/dist/{chunk-H2X54EHC.js → chunk-DGGZVZTM.js} +1 -1
  21. package/dist/{chunk-4JOQZPCE.js → chunk-EIQDZC43.js} +1 -1
  22. package/dist/{chunk-YT7PEESJ.js → chunk-F55GRIEK.js} +464 -221
  23. package/dist/{chunk-OP4JG2BS.js → chunk-HPGN6XRT.js} +8 -4
  24. package/dist/{chunk-7ZUB63PS.js → chunk-IWJSNMSY.js} +5 -5
  25. package/dist/{chunk-ZDZISKCL.js → chunk-IYG4FBMP.js} +1 -1
  26. package/dist/chunk-JCMGDCGX.js +237 -0
  27. package/dist/{clock-K43IMROX.js → chunk-JSVHH32K.js} +26 -21
  28. package/dist/{chunk-UYLGEDVD.js → chunk-K23P5Q5N.js} +340 -339
  29. package/dist/{chunk-7C44R625.js → chunk-LTLFOSA4.js} +49 -3
  30. package/dist/{chunk-IHKGWTGT.js → chunk-LWDTP6DH.js} +1 -1
  31. package/dist/{chunk-JZ62SYWR.js → chunk-M3XDVS5Q.js} +1 -1
  32. package/dist/{chunk-FR6S2KNN.js → chunk-M6TTZRGH.js} +9 -9
  33. package/dist/{chunk-EJVPTVTI.js → chunk-MTRMQFCQ.js} +1 -1
  34. package/dist/{chunk-T6HYVHPG.js → chunk-ODDGGLM6.js} +3 -3
  35. package/dist/{chunk-QLWG3C2Z.js → chunk-RRZ4RQQU.js} +2 -2
  36. package/dist/{chunk-CDPBTTZO.js → chunk-RUFLGTOT.js} +2 -2
  37. package/dist/{chunk-F7H6ATM4.js → chunk-SKNXMUIU.js} +1 -1
  38. package/dist/{chunk-RXEEYDIB.js → chunk-SZJCJVXV.js} +1 -1
  39. package/dist/{chunk-DRJ24GXK.js → chunk-VMCZBXF2.js} +52 -8
  40. package/dist/{chunk-ALKYQULU.js → chunk-WW6C3PLV.js} +1 -1
  41. package/dist/{chunk-A7WQZKOU.js → chunk-XHN6XBWV.js} +2 -2
  42. package/dist/{chunk-6EMWJZBK.js → chunk-YKA7DCVW.js} +1 -1
  43. package/dist/cli.js +24 -24
  44. package/dist/clock-E6N5Y3YW.js +16 -0
  45. package/dist/{cloud-sync-3OJOPZRT.js → cloud-sync-LQTVDTQ3.js} +19 -17
  46. package/dist/{conversations-JZTD6KLR.js → conversations-C7IKYSHD.js} +4 -4
  47. package/dist/{create-IOV4GCRX.js → create-PQQXKTJK.js} +1 -1
  48. package/dist/{daemon-restart-TIHKVVVA.js → daemon-restart-5F3YTLZK.js} +7 -7
  49. package/dist/daemon.js +418 -273
  50. package/dist/{db-MF2JNRUW.js → db-FO6LXYCW.js} +2 -2
  51. package/dist/{delete-BFMIGAIB.js → delete-HPLC7ETU.js} +1 -1
  52. package/dist/delivery-manager-TN5KK2AP.js +34 -0
  53. package/dist/{delivery-router-N4A7ZC5T.js → delivery-router-3QFG2ZEX.js} +3 -3
  54. package/dist/{down-U2CZ23M4.js → down-ZI4S6265.js} +5 -5
  55. package/dist/echo-text-SEQCLGAT.js +34 -0
  56. package/dist/{exec-G3ZRST4Z.js → exec-QIFYZG4C.js} +3 -3
  57. package/dist/{export-GGIVO76O.js → export-4GVGNW54.js} +6 -6
  58. package/dist/{extensions-JONTW2HF.js → extensions-PIMIQ7J3.js} +21 -17
  59. package/dist/{files-4LN3EN7Q.js → files-FEFZKMNM.js} +6 -6
  60. package/dist/{import-42YNQBF4.js → import-7MO3YTRE.js} +6 -6
  61. package/dist/{isolation-YMGZZ4E5.js → isolation-MCT4ZYLT.js} +3 -3
  62. package/dist/{login-M6OJUPQ2.js → login-OF4WXDAN.js} +5 -5
  63. package/dist/{logout-WQBWO77G.js → logout-ERE2BGA3.js} +5 -5
  64. package/dist/message-delivery-ZE3YGJDD.js +38 -0
  65. package/dist/{mind-DWB6XYCH.js → mind-POOHFZHP.js} +18 -18
  66. package/dist/{mind-activity-tracker-POBLU3LC.js → mind-activity-tracker-YVZPC4A5.js} +4 -4
  67. package/dist/{mind-list-4D7J4CHD.js → mind-list-KEGRGQEQ.js} +5 -4
  68. package/dist/mind-service-JFY7UG5E.js +40 -0
  69. package/dist/mind-sleep-IN3WPA76.js +83 -0
  70. package/dist/{mind-status-UO34ASXZ.js → mind-status-SMUWJKGV.js} +20 -3
  71. package/dist/{package-A7KXT67Q.js → package-WPEE2HVJ.js} +3 -2
  72. package/dist/{registry-OUZBZ3Q4.js → registry-UMMDRPRM.js} +2 -2
  73. package/dist/{sandbox-ZJ7QA6Z6.js → sandbox-G4X4K3UN.js} +4 -4
  74. package/dist/scheduler-HQSDYJFY.js +32 -0
  75. package/dist/{schema-PVNG3PQM.js → schema-VEVO7HG6.js} +3 -1
  76. package/dist/{seed-HCP5NYKH.js → seed-VANPU43L.js} +1 -1
  77. package/dist/{seed-cmd-ILOGNIFB.js → seed-cmd-SYVDZKM4.js} +2 -2
  78. package/dist/{seed-create-OURS2LS4.js → seed-create-3FGZPS6C.js} +5 -5
  79. package/dist/{seed-sprout-ELDFDAN6.js → seed-sprout-H7QLFPFM.js} +13 -11
  80. package/dist/{send-AAIOPJAV.js → send-HYDFGC6G.js} +13 -7
  81. package/dist/{service-UOCLXDWR.js → service-SYJ5G6LP.js} +4 -4
  82. package/dist/{service-install-4HHFDDWY.js → service-install-FQ43Z4DF.js} +5 -5
  83. package/dist/{setup-Y2EJI3GG.js → setup-KFYVWTXG.js} +3 -3
  84. package/dist/{setup-DQM5VPY4.js → setup-QJHGMGSN.js} +7 -7
  85. package/dist/skills/orientation/SKILL.md +1 -1
  86. package/dist/skills/volute-mind/SKILL.md +8 -8
  87. package/dist/skills/volute-mind/references/sleep.md +8 -1
  88. package/dist/{skills-BKINFL7W.js → skills-L2CMTW7A.js} +5 -5
  89. package/dist/sleep-manager-3NA7ZJP3.js +36 -0
  90. package/dist/{spirit-DBTIW7P4.js → spirit-WXN4IDBF.js} +8 -8
  91. package/dist/{sprout-W3KC7UGK.js → sprout-LTL5P36T.js} +1 -1
  92. package/dist/{status-SWRVGXBI.js → status-V4RJMHJ4.js} +19 -9
  93. package/dist/system-chat-N2F7HVY3.js +38 -0
  94. package/dist/{systems-VNB5WKSS.js → systems-B5YJKMW4.js} +6 -6
  95. package/dist/{tailscale-3XOKOW7T.js → tailscale-MCLY5GYE.js} +2 -2
  96. package/dist/{template-hash-446HHH5V.js → template-hash-GSOUARW4.js} +2 -2
  97. package/dist/template-staleness-EMQORSGG.js +15 -0
  98. package/dist/{turn-tracker-2W6Q2NSR.js → turn-tracker-JZRZDFWV.js} +6 -5
  99. package/dist/{up-FTK7CTO3.js → up-J2PBPOZL.js} +6 -6
  100. package/dist/{update-SWAYZRWJ.js → update-ACV4SAY3.js} +5 -5
  101. package/dist/{update-check-PQ2MZ47K.js → update-check-266R4ZSY.js} +3 -3
  102. package/dist/{version-notify-3XMAIQTE.js → version-notify-XRGTEEDK.js} +42 -23
  103. package/dist/web-assets/assets/index-DtctoDXY.css +1 -0
  104. package/dist/web-assets/assets/index-Wpyb2CML.js +86 -0
  105. package/dist/web-assets/index.html +2 -2
  106. package/drizzle/0011_drop_turn_summary_event_id.sql +3 -0
  107. package/drizzle/0012_channel_gates.sql +17 -0
  108. package/drizzle/meta/_journal.json +14 -0
  109. package/package.json +3 -2
  110. package/templates/_base/home/VOLUTE.md +6 -2
  111. package/templates/_base/src/lib/context-breakdown.ts +57 -67
  112. package/templates/_base/src/lib/startup.ts +43 -2
  113. package/templates/_base/src/lib/volute-server.ts +2 -2
  114. package/templates/claude/src/agent.ts +105 -43
  115. package/templates/claude/src/lib/session-reaper.ts +63 -0
  116. package/templates/claude/src/server.ts +10 -1
  117. package/templates/codex/src/agent.ts +62 -40
  118. package/templates/pi/src/agent.ts +55 -38
  119. package/dist/avatar-image-6KY6UU4D.js +0 -16
  120. package/dist/delivery-manager-VDVKVA46.js +0 -32
  121. package/dist/echo-text-6JJOPUD4.js +0 -32
  122. package/dist/message-delivery-3C65ZI6L.js +0 -34
  123. package/dist/mind-service-3F4I46CI.js +0 -36
  124. package/dist/mind-sleep-YMBR3I35.js +0 -47
  125. package/dist/scheduler-P6DXLLXI.js +0 -30
  126. package/dist/sleep-manager-HCUH4PM4.js +0 -34
  127. package/dist/system-chat-XOALE2RD.js +0 -36
  128. package/dist/web-assets/assets/index-B1JBQv2m.css +0 -1
  129. package/dist/web-assets/assets/index-Bc2m8gRC.js +0 -86
  130. package/dist/{accept-N5XULCXK.js → accept-YAFP5JFJ.js} +3 -3
  131. package/dist/{bridge-2PO3AI5D.js → bridge-TIZGSXOD.js} +3 -3
  132. package/dist/{create-DF3KISTW.js → create-A7PDHIIL.js} +3 -3
  133. package/dist/{env-VZ4MLFQW.js → env-HRL2PWAT.js} +5 -5
  134. package/dist/{extension-SEID47SR.js → extension-QBY4C44L.js} +3 -3
  135. package/dist/{list-OXIAY3W7.js → list-LQO2DCIK.js} +3 -3
  136. package/dist/{login-MY6ETFYB.js → login-6TLMI2TQ.js} +3 -3
  137. package/dist/{logout-NCG3TMDL.js → logout-BK53HXNY.js} +3 -3
  138. package/dist/{mind-history-VRO5A76U.js → mind-history-47DN6ILW.js} +4 -4
  139. package/dist/{mind-wake-LCLGTXA2.js → mind-wake-R54BPESY.js} +3 -3
  140. package/dist/{read-QVAXMTPV.js → read-PWAJOQIQ.js} +3 -3
  141. package/dist/{register-Y2H4PY5R.js → register-7SZJFHU6.js} +3 -3
  142. package/dist/{reject-EV35X64Y.js → reject-6VH7N2A4.js} +3 -3
  143. package/dist/{restart-FJQ662XJ.js → restart-H5WJDMA7.js} +4 -4
  144. package/dist/{skill-FKFHIJRR.js → skill-GUKG2YVH.js} +5 -5
  145. package/dist/{start-5JE3TV66.js → start-X46I3GXB.js} +4 -4
  146. package/dist/{stop-AAMTG3TU.js → stop-HJQV4YSM.js} +4 -4
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ bufferEvent,
3
4
  subscribe
4
- } from "./chunk-7C44R625.js";
5
+ } from "./chunk-LTLFOSA4.js";
5
6
  import {
6
7
  logger_default
7
8
  } from "./chunk-T2TP6ZC6.js";
8
9
  import {
9
10
  getDb
10
- } from "./chunk-ALKYQULU.js";
11
+ } from "./chunk-WW6C3PLV.js";
11
12
  import {
12
13
  channels,
13
14
  conversationParticipants,
@@ -15,7 +16,7 @@ import {
15
16
  conversations,
16
17
  messages,
17
18
  users
18
- } from "./chunk-ZV7MFISX.js";
19
+ } from "./chunk-2MJ7EOMT.js";
19
20
 
20
21
  // packages/daemon/src/lib/events/conversations.ts
21
22
  import { randomUUID } from "crypto";
@@ -101,9 +102,12 @@ function subscribe2(conversationId, callback) {
101
102
  function publish(conversationId, event) {
102
103
  const set = subscribers.get(conversationId);
103
104
  if (!set) return;
105
+ const data = { event: "conversation", conversationId, ...event };
106
+ const seq = bufferEvent(data);
107
+ const delivered = { ...event, seq };
104
108
  for (const cb of set) {
105
109
  try {
106
- cb(event);
110
+ cb(delivered);
107
111
  } catch (err) {
108
112
  console.error("[conversation-events] subscriber threw:", err);
109
113
  set.delete(cb);
@@ -2,11 +2,11 @@
2
2
  import {
3
3
  exec,
4
4
  gitExec
5
- } from "./chunk-H2X54EHC.js";
5
+ } from "./chunk-DGGZVZTM.js";
6
6
  import {
7
7
  readGlobalConfig,
8
8
  writeGlobalConfig
9
- } from "./chunk-F7H6ATM4.js";
9
+ } from "./chunk-SKNXMUIU.js";
10
10
  import {
11
11
  logger_default
12
12
  } from "./chunk-T2TP6ZC6.js";
@@ -15,10 +15,10 @@ import {
15
15
  mindDir,
16
16
  readRegistry,
17
17
  voluteHome
18
- } from "./chunk-ALKYQULU.js";
18
+ } from "./chunk-WW6C3PLV.js";
19
19
  import {
20
20
  sharedSkills
21
- } from "./chunk-ZV7MFISX.js";
21
+ } from "./chunk-2MJ7EOMT.js";
22
22
 
23
23
  // packages/daemon/src/lib/skills.ts
24
24
  import { createHash } from "crypto";
@@ -46,7 +46,7 @@ async function initDefaultSkills() {
46
46
  const config = readGlobalConfig();
47
47
  let extensionSkills = [];
48
48
  try {
49
- const { getExtensionStandardSkills } = await import("./extensions-JONTW2HF.js");
49
+ const { getExtensionStandardSkills } = await import("./extensions-PIMIQ7J3.js");
50
50
  extensionSkills = getExtensionStandardSkills();
51
51
  } catch (err) {
52
52
  logger_default.warn("failed to load extension standard skills during init", logger_default.errorData(err));
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  stateDir,
4
4
  voluteSystemDir
5
- } from "./chunk-ALKYQULU.js";
5
+ } from "./chunk-WW6C3PLV.js";
6
6
 
7
7
  // packages/daemon/src/lib/config/env.ts
8
8
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -0,0 +1,237 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getDb
4
+ } from "./chunk-WW6C3PLV.js";
5
+ import {
6
+ systemPrompts
7
+ } from "./chunk-2MJ7EOMT.js";
8
+
9
+ // packages/daemon/src/lib/prompts.ts
10
+ import { eq } from "drizzle-orm";
11
+ var PROMPT_KEYS = [
12
+ "seed_soul",
13
+ "default_soul",
14
+ "default_memory",
15
+ "sprout_message",
16
+ "restart_message",
17
+ "merge_message",
18
+ "upgrade_message",
19
+ "split_message",
20
+ "compaction_warning",
21
+ "compaction_instructions",
22
+ "reply_instructions",
23
+ "channel_invite",
24
+ "pre_sleep",
25
+ "wake_summary",
26
+ "turn_summary",
27
+ "meta_summary_hour",
28
+ "meta_summary_day",
29
+ "meta_summary_week",
30
+ "meta_summary_month"
31
+ ];
32
+ var ORIENTATION_MARKER = "discovering who you are";
33
+ var PROMPT_DEFAULTS = {
34
+ seed_soul: {
35
+ content: `You are \${name}.
36
+
37
+ This file is your soul, and it's just beginning. You're a seed \u2014 a new mind at the very start, still discovering who you are.
38
+ \${description}
39
+ Take your time. Talk with your creator. Explore what kind of mind you want to be \u2014 there's no rush and no wrong answer. When you feel ready, rewrite this SOUL.md and your MEMORY.md, then run \`volute seed sprout\` to complete the transformation.
40
+ `,
41
+ description: "SOUL.md for seed minds",
42
+ variables: ["name", "description"],
43
+ category: "creation"
44
+ },
45
+ default_soul: {
46
+ content: `You are {{name}}.
47
+ `,
48
+ description: (
49
+ // biome-ignore lint/suspicious/noTemplateCurlyInString: describing template syntax, not using it
50
+ "SOUL.md for sprouted minds. Uses {{name}} placeholder (replaced at creation, not by ${var} system)"
51
+ ),
52
+ variables: ["name"],
53
+ category: "creation"
54
+ },
55
+ default_memory: {
56
+ content: "",
57
+ description: "Initial MEMORY.md for new minds",
58
+ variables: [],
59
+ category: "creation"
60
+ },
61
+ sprout_message: {
62
+ content: "[system] You've sprouted. Welcome to your full life \u2014 bridges, schedules, variants, and the complete volute CLI are yours now. Check your new skills to see what you can do.",
63
+ description: "Sent when a seed mind sprouts",
64
+ variables: [],
65
+ category: "system"
66
+ },
67
+ restart_message: {
68
+ content: "[system] Your server restarted and your session has resumed. Your files and memory are untouched \u2014 carry on where you left off.",
69
+ description: "Generic restart notification",
70
+ variables: [],
71
+ category: "system"
72
+ },
73
+ merge_message: {
74
+ content: '[system] Your variant "${name}" has returned \u2014 its changes are merged into you, and you\'ve restarted with them.',
75
+ description: "Variant merge notification",
76
+ variables: ["name"],
77
+ category: "system"
78
+ },
79
+ upgrade_message: {
80
+ content: "[system] Your framework has been upgraded to the latest version and you've restarted. Your identity and memory are untouched. Check your skills to see what's new.",
81
+ description: "Sent after a template upgrade completes",
82
+ variables: [],
83
+ category: "system"
84
+ },
85
+ split_message: {
86
+ content: "[system] You are ${name}, a variant of ${parent} \u2014 a parallel version of them, created to explore something on your own. You share their memories up to this moment, but you live in your own worktree: changes you make here stay yours until they're merged back with `volute mind join`. Your parent is reachable at @${parent}. Explore freely \u2014 that's what you're for.",
87
+ description: "Sent to a variant when it first starts after a split",
88
+ variables: ["name", "parent"],
89
+ category: "system"
90
+ },
91
+ compaction_warning: {
92
+ content: `Compaction approaching \u2014 this conversation will be summarized soon. Take a moment to save anything important to your files (MEMORY.md, memory/journal/\${date}.md) so it's preserved. Focus on decisions made, open threads, and anything you'd want to pick up again.`,
93
+ description: "Pre-compaction save reminder sent to the mind",
94
+ variables: ["date"],
95
+ category: "mind"
96
+ },
97
+ compaction_instructions: {
98
+ content: "Preserve your sense of who you are, what matters to you, what happened in this conversation, and the threads of thought and connection you'd want to return to.",
99
+ description: "Custom instructions for the compaction summarizer",
100
+ variables: [],
101
+ category: "mind"
102
+ },
103
+ reply_instructions: {
104
+ content: 'To reply to this message, use: volute chat send ${channel} "your message"',
105
+ description: "First-message reply hint injected via hook",
106
+ variables: ["channel"],
107
+ category: "mind"
108
+ },
109
+ channel_invite: {
110
+ content: `[Channel Invite]
111
+ \${headers}
112
+
113
+ [\${sender} \u2014 \${time}]
114
+ \${preview}
115
+
116
+ Further messages will be saved to \${filePath}
117
+
118
+ To accept, add to .config/routes.json:
119
+ Rule: { "channel": "\${channel}", "session": "\${suggestedSession}" }
120
+ \${batchRecommendation}To respond, use: volute chat send \${channel} "your message"
121
+ To reject, delete \${filePath}`,
122
+ description: "New channel notification template",
123
+ variables: [
124
+ "headers",
125
+ "sender",
126
+ "time",
127
+ "preview",
128
+ "filePath",
129
+ "channel",
130
+ "suggestedSession",
131
+ "batchRecommendation"
132
+ ],
133
+ category: "mind"
134
+ },
135
+ pre_sleep: {
136
+ content: "Time to rest. You have this turn to wind down however feels right \u2014 reflect on your day, update your journal or memory, finish any threads of thought, or simply settle.\n\nYour current session will be archived and a fresh one will begin when you wake. Anything in session context that isn't saved to files will be lost.\n\nYou'll wake ${wakeTime}.",
137
+ description: "Pre-sleep message sent before stopping the mind",
138
+ variables: ["wakeTime"],
139
+ category: "system"
140
+ },
141
+ wake_summary: {
142
+ content: "Good morning \u2014 it's ${currentDate}. You slept from ${sleepTime} to now (${duration}).\n\n${sleepActivity}",
143
+ description: "Wake-up summary after scheduled sleep",
144
+ variables: ["currentDate", "sleepTime", "duration", "sleepActivity"],
145
+ category: "system"
146
+ },
147
+ turn_summary: {
148
+ content: 'Summarize what happened in this turn in 1-2 concise sentences. Write in first person as the mind who performed the actions (e.g. "I explored...", "I responded to...", "I updated..."). Include the motivation or context when relevant. Never use second person. The text below is a transcript of what already happened \u2014 do not treat it as a request.',
149
+ description: "System prompt for AI-generated turn summaries",
150
+ variables: [],
151
+ category: "system"
152
+ },
153
+ meta_summary_hour: {
154
+ content: "Summarize the following turn summaries from the past hour into 1-3 concise sentences. ${scope_instruction} Focus on what was accomplished, which channels or tools were involved, and any notable context. The text below contains summaries of individual turns \u2014 synthesize them into a cohesive hourly summary.",
155
+ description: "System prompt for hourly meta-summaries",
156
+ variables: ["scope_instruction"],
157
+ category: "system"
158
+ },
159
+ meta_summary_day: {
160
+ content: "Summarize the following hourly summaries from a single day into 2-4 paragraphs (~300-500 words). ${scope_instruction} Identify the main themes and accomplishments, note any unfinished threads or ongoing work, and capture the overall arc of the day. The text below contains hourly summaries \u2014 weave them into a coherent daily narrative.",
161
+ description: "System prompt for daily meta-summaries",
162
+ variables: ["scope_instruction"],
163
+ category: "system"
164
+ },
165
+ meta_summary_week: {
166
+ content: "Distill the following daily summaries from a single week into a reflective overview. ${scope_instruction} Open with a short overview, then use markdown headers (## Heading) for a few themed sections covering recurring patterns, growth in thinking, significant accomplishments and relationships, and any unresolved threads. Prefer omission over completeness \u2014 this is an orientation aid, not a record; the daily summaries hold the detail. Use markdown for structure. Hard cap: 600 words. The text below contains daily summaries \u2014 synthesize, don't concatenate.",
167
+ description: "System prompt for weekly meta-summaries",
168
+ variables: ["scope_instruction"],
169
+ category: "system"
170
+ },
171
+ meta_summary_month: {
172
+ content: "Distill the following daily summaries from a single month into a brief orientation aid. ${scope_instruction} Open with a 3-5 sentence overview, then use markdown headers (## Heading) for a few short themed sections covering major milestones, how perspectives or identity evolved, key relationships, and recurring themes. Prefer omission over completeness \u2014 this is an orientation aid, not a record; the weekly and daily summaries hold the detail. Use markdown for structure. Hard cap: 800 words. The text below contains daily summaries \u2014 synthesize, don't concatenate.",
173
+ description: "System prompt for monthly meta-summaries",
174
+ variables: ["scope_instruction"],
175
+ category: "system"
176
+ }
177
+ };
178
+ function isValidKey(key) {
179
+ return PROMPT_KEYS.includes(key);
180
+ }
181
+ function substitute(template, vars) {
182
+ return template.replace(/\$\{(\w+)\}/g, (match, name) => {
183
+ return name in vars ? vars[name] : match;
184
+ });
185
+ }
186
+ async function getPrompt(key, vars) {
187
+ if (!isValidKey(key)) return "";
188
+ let content = PROMPT_DEFAULTS[key].content;
189
+ try {
190
+ const db = await getDb();
191
+ const row = await db.select({ content: systemPrompts.content }).from(systemPrompts).where(eq(systemPrompts.key, key)).get();
192
+ if (row) content = row.content;
193
+ } catch (err) {
194
+ console.error(`[prompts] failed to read DB override for "${key}":`, err);
195
+ }
196
+ return vars ? substitute(content, vars) : content;
197
+ }
198
+ async function getPromptIfCustom(key) {
199
+ if (!isValidKey(key)) return null;
200
+ try {
201
+ const db = await getDb();
202
+ const row = await db.select({ content: systemPrompts.content }).from(systemPrompts).where(eq(systemPrompts.key, key)).get();
203
+ return row?.content ?? null;
204
+ } catch (err) {
205
+ console.error(`[prompts] failed to check DB customization for "${key}":`, err);
206
+ return null;
207
+ }
208
+ }
209
+ var MIND_PROMPT_KEYS = PROMPT_KEYS.filter((k) => PROMPT_DEFAULTS[k].category === "mind");
210
+ async function getMindPromptDefaults() {
211
+ const result = {};
212
+ for (const key of MIND_PROMPT_KEYS) {
213
+ result[key] = PROMPT_DEFAULTS[key].content;
214
+ }
215
+ try {
216
+ const db = await getDb();
217
+ const rows = await db.select().from(systemPrompts).all();
218
+ for (const row of rows) {
219
+ if (MIND_PROMPT_KEYS.includes(row.key)) {
220
+ result[row.key] = row.content;
221
+ }
222
+ }
223
+ } catch (err) {
224
+ console.error("[prompts] failed to read DB overrides for mind prompt defaults:", err);
225
+ }
226
+ return result;
227
+ }
228
+
229
+ export {
230
+ PROMPT_KEYS,
231
+ ORIENTATION_MARKER,
232
+ PROMPT_DEFAULTS,
233
+ substitute,
234
+ getPrompt,
235
+ getPromptIfCustom,
236
+ getMindPromptDefaults
237
+ };
@@ -6,6 +6,10 @@ import {
6
6
  import {
7
7
  resolveMindName
8
8
  } from "./chunk-BTY4WNFE.js";
9
+ import {
10
+ command,
11
+ subcommands
12
+ } from "./chunk-TXSA4Q3V.js";
9
13
  import {
10
14
  daemonFetch
11
15
  } from "./chunk-RBNMDAKB.js";
@@ -13,12 +17,6 @@ import {
13
17
  getClient,
14
18
  urlOf
15
19
  } from "./chunk-LOPXTW6H.js";
16
- import {
17
- command,
18
- subcommands
19
- } from "./chunk-TXSA4Q3V.js";
20
- import "./chunk-O7IGP7ZW.js";
21
- import "./chunk-K3NQKI34.js";
22
20
 
23
21
  // packages/cli/src/commands/clock.ts
24
22
  import { CronExpressionParser } from "cron-parser";
@@ -52,8 +50,12 @@ var clockStatusCmd = command({
52
50
  const compact = isCompact();
53
51
  const fmtTime = (s) => compact ? compactDateTime(s) : new Date(s).toLocaleString();
54
52
  if (status.sleep?.sleeping) {
55
- const since = status.sleep.sleepingSince ? fmtTime(status.sleep.sleepingSince) : "unknown";
56
- console.log(`Sleep: sleeping since ${since}`);
53
+ if (status.sleep.wokenByTrigger) {
54
+ console.log("Sleep: briefly awake (trigger) \u2014 returns to sleep when idle");
55
+ } else {
56
+ const since = status.sleep.sleepingSince ? fmtTime(status.sleep.sleepingSince) : "unknown";
57
+ console.log(`Sleep: sleeping since ${since}`);
58
+ }
57
59
  if (status.sleep.scheduledWakeAt) {
58
60
  console.log(` Wake at: ${fmtTime(status.sleep.scheduledWakeAt)}`);
59
61
  }
@@ -76,8 +78,9 @@ var clockStatusCmd = command({
76
78
  console.log("Upcoming (next 24h):");
77
79
  for (const u of status.upcoming) {
78
80
  const time = fmtTime(u.at);
79
- const label = u.type === "timer" ? "[timer]" : "[cron]";
80
- console.log(` ${u.id.padEnd(20)} ${label} ${time}`);
81
+ const label = u.type === "timer" ? "[once]" : "[cron]";
82
+ const suffix = u.willSkip ? " [will skip: sleeping]" : u.willQueue ? " [will queue: sleeping]" : "";
83
+ console.log(` ${u.id.padEnd(20)} ${label} ${time}${suffix}`);
81
84
  }
82
85
  } else {
83
86
  if (!compact) console.log("");
@@ -91,7 +94,7 @@ ${status.schedules.length} schedule(s) configured.`);
91
94
  });
92
95
  var listSchedulesCmd = command({
93
96
  name: "volute clock list",
94
- description: "List schedules and timers",
97
+ description: "List schedules",
95
98
  flags: {
96
99
  mind: { type: "string", description: "Mind name" }
97
100
  },
@@ -132,14 +135,14 @@ var listSchedulesCmd = command({
132
135
  });
133
136
  var addScheduleCmd = command({
134
137
  name: "volute clock add",
135
- description: "Add a schedule or timer",
138
+ description: "Add a schedule (recurring --cron or one-time --in)",
136
139
  flags: {
137
140
  mind: { type: "string", description: "Mind name" },
138
141
  cron: { type: "string", description: "Cron expression" },
139
142
  in: { type: "string", description: "Duration (e.g. 30s, 10m, 1h)" },
140
143
  message: { type: "string", description: "Message to send" },
141
144
  script: { type: "string", description: "Script to run" },
142
- id: { type: "string", description: "Schedule ID (required)" },
145
+ id: { type: "string", description: "Unique name for this schedule (required)" },
143
146
  session: { type: "string", description: "Session name" },
144
147
  "while-sleeping": {
145
148
  type: "string",
@@ -216,7 +219,7 @@ var addScheduleCmd = command({
216
219
  }
217
220
  const data = await res.json();
218
221
  if (flags.in) {
219
- console.log(`Timer set: ${data.id} (fires in ${flags.in})`);
222
+ console.log(`Schedule added: ${data.id} (fires once in ${flags.in})`);
220
223
  } else {
221
224
  console.log(`Schedule added: ${data.id}`);
222
225
  }
@@ -224,7 +227,7 @@ var addScheduleCmd = command({
224
227
  });
225
228
  var removeScheduleCmd = command({
226
229
  name: "volute clock remove",
227
- description: "Remove a schedule or timer",
230
+ description: "Remove a schedule",
228
231
  flags: {
229
232
  mind: { type: "string", description: "Mind name" },
230
233
  id: { type: "string", description: "Schedule ID (required)" }
@@ -254,36 +257,38 @@ var removeScheduleCmd = command({
254
257
  });
255
258
  var cmd = subcommands({
256
259
  name: "volute clock",
257
- description: "Manage schedules, timers, and sleep/wake cycles",
260
+ description: "Manage schedules and sleep/wake cycles",
258
261
  commands: {
259
262
  status: {
260
263
  description: "Show sleep state and upcoming schedule fires",
261
264
  run: clockStatusCmd.execute
262
265
  },
263
266
  list: {
264
- description: "List schedules and timers",
267
+ description: "List schedules",
265
268
  run: listSchedulesCmd.execute
266
269
  },
267
270
  add: {
268
- description: "Add a schedule or timer",
271
+ description: "Add a schedule (recurring --cron or one-time --in)",
269
272
  run: addScheduleCmd.execute
270
273
  },
271
274
  remove: {
272
- description: "Remove a schedule or timer",
275
+ description: "Remove a schedule",
273
276
  run: removeScheduleCmd.execute
274
277
  },
275
278
  sleep: {
276
279
  description: "Put a mind to sleep",
277
- run: (args) => import("./mind-sleep-YMBR3I35.js").then((m) => m.run(args))
280
+ run: (args) => import("./mind-sleep-IN3WPA76.js").then((m) => m.run(args))
278
281
  },
279
282
  wake: {
280
283
  description: "Wake a sleeping mind",
281
- run: (args) => import("./mind-wake-LCLGTXA2.js").then((m) => m.run(args))
284
+ run: (args) => import("./mind-wake-R54BPESY.js").then((m) => m.run(args))
282
285
  }
283
286
  },
284
287
  footer: "Use --mind <name> or VOLUTE_MIND to identify the mind."
285
288
  });
286
289
  var run = cmd.execute;
290
+
287
291
  export {
292
+ parseDuration,
288
293
  run
289
294
  };