volute 0.52.0 → 0.53.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 (105) hide show
  1. package/dist/{accept-5NK5XJB5.js → accept-I4GVGWA3.js} +6 -3
  2. package/dist/{chat-VAZ25KVT.js → chat-WK2BLM7B.js} +9 -9
  3. package/dist/{chunk-724DVYHU.js → chunk-23UJGVYP.js} +9 -9
  4. package/dist/{chunk-K2F237KS.js → chunk-5DBGQBQR.js} +138 -13
  5. package/dist/chunk-5RBEEAKW.js +58 -0
  6. package/dist/{chunk-XRWUQPCA.js → chunk-7ARONCZW.js} +24 -2
  7. package/dist/{chunk-FXWBFDQR.js → chunk-AP2KQMMW.js} +48 -9
  8. package/dist/{chunk-DMK5ASKV.js → chunk-F6D766VQ.js} +6 -2
  9. package/dist/{chunk-ZEZQNP2G.js → chunk-HASADR3E.js} +46 -9
  10. package/dist/{chunk-AXFLY5GU.js → chunk-IQ7VNWH6.js} +16 -1
  11. package/dist/{chunk-G7A5LEVI.js → chunk-LN7XJ56R.js} +6 -6
  12. package/dist/{chunk-CW7BQKF6.js → chunk-P2TBUKLW.js} +3 -3
  13. package/dist/{chunk-SW2U6HRB.js → chunk-PIZDPY4G.js} +20 -3
  14. package/dist/{chunk-JHKBALS2.js → chunk-RMADJFA7.js} +1 -1
  15. package/dist/{chunk-RU74YG46.js → chunk-RQRO6PC7.js} +40 -6
  16. package/dist/{chunk-RPPTGPYF.js → chunk-TAWRJ24T.js} +1 -1
  17. package/dist/{chunk-ITK6HV47.js → chunk-UO4MZQNO.js} +1 -1
  18. package/dist/chunk-UTKUO2KY.js +102 -0
  19. package/dist/{chunk-YVR6EHWL.js → chunk-VDZ4I4ZP.js} +160 -18
  20. package/dist/cli.js +16 -16
  21. package/dist/{clock-ZT5YT6HA.js → clock-SH4NQC2F.js} +3 -3
  22. package/dist/{cloud-sync-H7EWZASD.js → cloud-sync-MJVJ33LD.js} +10 -9
  23. package/dist/{daemon-restart-4FWUA5JF.js → daemon-restart-BIGU4OKS.js} +1 -1
  24. package/dist/daemon.js +261 -89
  25. package/dist/{delivery-manager-VYXVKUMP.js → delivery-manager-FDHCZ7PU.js} +7 -5
  26. package/dist/delivery-notices-65TB3CBX.js +18 -0
  27. package/dist/{echo-text-PEEV7FQU.js → echo-text-KU6G4Z7V.js} +11 -10
  28. package/dist/{extensions-N6L5NYTK.js → extensions-VACUKFA5.js} +10 -9
  29. package/dist/{files-BRY5RRIM.js → files-CHPNEQXN.js} +5 -4
  30. package/dist/{message-delivery-7URC52ME.js → message-delivery-TUXM3AAE.js} +14 -11
  31. package/dist/{mind-NEXGT3KE.js → mind-IX5AWUST.js} +11 -11
  32. package/dist/{mind-contacts-QYU4TPEA.js → mind-contacts-BKUOUJPV.js} +5 -5
  33. package/dist/{mind-history-OGNR4L7W.js → mind-history-RVF6KJ7K.js} +83 -11
  34. package/dist/{mind-list-SYRA7CH5.js → mind-list-KNU34SUD.js} +2 -2
  35. package/dist/{mind-service-E26ZQXDS.js → mind-service-WHFBUKZE.js} +10 -9
  36. package/dist/{mind-sleep-LZAFBDZD.js → mind-sleep-D3DEYAWG.js} +5 -5
  37. package/dist/{mind-status-Z2LQFA6F.js → mind-status-BPTLQ5Z6.js} +15 -3
  38. package/dist/{package-2W2XKSIP.js → package-BN5KMU54.js} +1 -1
  39. package/dist/{prompts-NBO3HRK3.js → prompts-HNKGCAEY.js} +1 -1
  40. package/dist/{reject-TWB4QJHG.js → reject-K2A4UK2Y.js} +9 -5
  41. package/dist/{scheduler-JTTWZDYU.js → scheduler-5X5UIQOQ.js} +7 -5
  42. package/dist/{seed-64XEHRUP.js → seed-LHZ33UB4.js} +1 -1
  43. package/dist/{seed-cmd-UEL2QB3Q.js → seed-cmd-U4RVJ3UA.js} +2 -2
  44. package/dist/{seed-create-4JRQDPGA.js → seed-create-OQU4KNCB.js} +1 -1
  45. package/dist/{seed-readiness-DYOVCYHN.js → seed-readiness-WJYYRRCK.js} +2 -2
  46. package/dist/{seed-sprout-NIDIOJXT.js → seed-sprout-SFUYH2RG.js} +7 -7
  47. package/dist/{send-2YKOZJJ5.js → send-FWZAMDBN.js} +35 -20
  48. package/dist/{setup-4IX6PCD3.js → setup-RVSGCIF3.js} +1 -1
  49. package/dist/skills/memory/SKILL.md +47 -43
  50. package/dist/{skills-MPUALV3S.js → skills-QRPU6BWY.js} +1 -1
  51. package/dist/{sleep-manager-OFP2GFXF.js → sleep-manager-NWUCRBZB.js} +10 -9
  52. package/dist/{spirit-4ECYIVGE.js → spirit-I5ECLGRI.js} +16 -2
  53. package/dist/{spirit-availability-Y54Y3675.js → spirit-availability-NIUUYKU2.js} +11 -10
  54. package/dist/{sprout-GJMZFRGZ.js → sprout-A2PMEF7Z.js} +1 -1
  55. package/dist/{system-events-V43HDA3T.js → system-events-YTOU66QI.js} +5 -1
  56. package/dist/{systems-VDRUZXNF.js → systems-2DIJY4RF.js} +6 -6
  57. package/dist/{turn-tracker-C5PVIC3B.js → turn-tracker-NNHS6MAR.js} +4 -2
  58. package/dist/{up-H6LJZDRK.js → up-UGBHH743.js} +1 -1
  59. package/dist/{variant-cleanup-STC6B5HR.js → variant-cleanup-CZDLIY3F.js} +7 -5
  60. package/dist/{version-notify-LBVHH5YV.js → version-notify-SJVAQLZI.js} +4 -4
  61. package/dist/web-assets/assets/index-BHSU9r-4.css +1 -0
  62. package/dist/web-assets/assets/{index-B_eYTa3R.js → index-b7G7ZsVk.js} +13 -13
  63. package/dist/web-assets/index.html +2 -2
  64. package/package.json +1 -1
  65. package/templates/_base/.init/.config/prompts.json +1 -1
  66. package/templates/_base/src/lib/codex-session-seed.ts +463 -0
  67. package/templates/_base/src/lib/daemon-client.ts +35 -0
  68. package/templates/_base/src/lib/pi-session-seed.ts +434 -0
  69. package/templates/_base/src/lib/seed-note.ts +78 -0
  70. package/templates/_base/src/lib/session-seed.ts +375 -0
  71. package/templates/_base/src/lib/startup.ts +108 -4
  72. package/templates/claude/.init/CLAUDE.md +3 -3
  73. package/templates/claude/src/agent.ts +267 -89
  74. package/templates/claude/src/lib/hooks/pre-compact.ts +30 -5
  75. package/templates/claude/src/lib/stream-consumer.ts +13 -0
  76. package/templates/claude/src/server.ts +2 -1
  77. package/templates/codex/.init/AGENTS.md +3 -3
  78. package/templates/codex/src/agent.ts +256 -39
  79. package/templates/codex/src/server.ts +2 -1
  80. package/templates/pi/.init/MINDS.md +3 -3
  81. package/templates/pi/src/agent.ts +269 -43
  82. package/templates/pi/src/lib/event-handler.ts +11 -0
  83. package/templates/pi/src/server.ts +3 -1
  84. package/dist/web-assets/assets/index-DhZrzddW.css +0 -1
  85. package/dist/{backup-YVGV2ZNM.js → backup-WWXVIMYQ.js} +5 -5
  86. package/dist/{bridge-YK7NTRU5.js → bridge-KU2IKSH3.js} +3 -3
  87. package/dist/{channels-FSAHOQWI.js → channels-LW5ZLMSQ.js} +3 -3
  88. package/dist/{chunk-VPOMJMV6.js → chunk-BDHKCLWK.js} +0 -0
  89. package/dist/{chunk-EEOMA4DX.js → chunk-HTB7KDRU.js} +3 -3
  90. package/dist/{create-M727VUDF.js → create-C3XZACTV.js} +3 -3
  91. package/dist/{env-IBW2QI6K.js → env-BJGM6FBA.js} +5 -5
  92. package/dist/{extension-MRYJWSMV.js → extension-B2W52WZY.js} +3 -3
  93. package/dist/{list-UQGIW7OF.js → list-R2GDWOEE.js} +3 -3
  94. package/dist/{login-RJJTCVR3.js → login-EZ4RRDQX.js} +3 -3
  95. package/dist/{login-SB5OENMV.js → login-JDOAK465.js} +4 -4
  96. package/dist/{logout-YFZAJRPY.js → logout-K6ZGAJY5.js} +3 -3
  97. package/dist/{logout-BYV433X6.js → logout-MWSIUOQU.js} +3 -3
  98. package/dist/{mind-wake-LDGPRA42.js → mind-wake-DCDFFQKX.js} +3 -3
  99. package/dist/{read-RJ5NAW5J.js → read-J5RM674N.js} +3 -3
  100. package/dist/{register-OX4HRSGC.js → register-53LBGSDC.js} +3 -3
  101. package/dist/{restart-AGEGNSYQ.js → restart-R2WFNF5K.js} +4 -4
  102. package/dist/{skill-B5OJEQUA.js → skill-DXLLSUHB.js} +5 -5
  103. package/dist/{start-MUMNFR52.js → start-XDOUAWN3.js} +4 -4
  104. package/dist/{status-MWLE3RVC.js → status-EYG4A3OK.js} +3 -3
  105. package/dist/{stop-EKERNYTX.js → stop-O62RTEMD.js} +4 -4
@@ -1,10 +1,13 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ getUserByUsername
4
+ } from "./chunk-7LT3YZUR.js";
2
5
  import {
3
6
  publish
4
7
  } from "./chunk-LNNI3MS4.js";
5
8
  import {
6
9
  getPrompt
7
- } from "./chunk-FXWBFDQR.js";
10
+ } from "./chunk-AP2KQMMW.js";
8
11
  import {
9
12
  aiCompleteUtility
10
13
  } from "./chunk-EGV6R6UF.js";
@@ -12,7 +15,8 @@ import {
12
15
  logger_default
13
16
  } from "./chunk-QUSMYGNQ.js";
14
17
  import {
15
- getDb
18
+ getDb,
19
+ resolveMindDir
16
20
  } from "./chunk-H6X6CKDN.js";
17
21
  import {
18
22
  messages,
@@ -26,6 +30,8 @@ import { randomUUID } from "crypto";
26
30
  import { and as and2, eq as eq2, inArray as inArray2, sql as sql2 } from "drizzle-orm";
27
31
 
28
32
  // packages/daemon/src/lib/daemon/summarizer.ts
33
+ import { readFile } from "fs/promises";
34
+ import { join } from "path";
29
35
  import { and, desc, eq, gte, inArray, like, lt, sql } from "drizzle-orm";
30
36
 
31
37
  // packages/daemon/src/lib/util/format-tool.ts
@@ -181,6 +187,12 @@ function getTimeRange(periodKey, period) {
181
187
  }
182
188
  }
183
189
 
190
+ // packages/daemon/src/lib/util/time.ts
191
+ function parseDbTimestamp(ts) {
192
+ if (/[zZ]$|[+-]\d\d:?\d\d$/.test(ts)) return new Date(ts);
193
+ return /* @__PURE__ */ new Date(`${ts.replace(" ", "T")}Z`);
194
+ }
195
+
184
196
  // packages/daemon/src/lib/daemon/summarizer.ts
185
197
  var sLog = logger_default.child("summarizer");
186
198
  var SYSTEM_MIND = "_system";
@@ -205,6 +217,7 @@ async function gatherTurnEvents(mind, session, doneId) {
205
217
  type: mindHistory.type,
206
218
  channel: mindHistory.channel,
207
219
  session: mindHistory.thread,
220
+ sender: mindHistory.sender,
208
221
  content: mindHistory.content,
209
222
  metadata: mindHistory.metadata,
210
223
  turn_id: mindHistory.turn_id,
@@ -223,6 +236,7 @@ async function gatherTurnEventsByTurnId(turnId) {
223
236
  type: mindHistory.type,
224
237
  channel: mindHistory.channel,
225
238
  session: mindHistory.thread,
239
+ sender: mindHistory.sender,
226
240
  content: mindHistory.content,
227
241
  metadata: mindHistory.metadata,
228
242
  turn_id: mindHistory.turn_id,
@@ -289,13 +303,19 @@ function buildTurnDeterministicSummary(events, parsedMeta) {
289
303
  }
290
304
  return parts.length > 0 ? `${parts.join(". ")}.` : "Turn completed.";
291
305
  }
292
- function buildTranscript(events, parsedMeta) {
306
+ function buildTranscript(events, parsedMeta, mind) {
293
307
  const lines = [];
294
308
  for (const ev of events) {
295
309
  switch (ev.type) {
296
- case "inbound":
297
- lines.push(`[inbound${ev.channel ? ` ${ev.channel}` : ""}] ${ev.content ?? ""}`);
310
+ // Inbound messages come from *other* people. Attribute them to the sender by name (and
311
+ // channel) so the summarizer never absorbs someone else's first-person statements into
312
+ // the mind's own "I" in a multi-party channel.
313
+ case "inbound": {
314
+ const on = ev.channel ? ` on ${ev.channel}` : "";
315
+ const from = ev.sender ? ` from ${ev.sender}` : "";
316
+ lines.push(`[inbound${on}${from}] ${ev.content ?? ""}`);
298
317
  break;
318
+ }
299
319
  // A system event is what triggered the turn — the summarizer needs to see it, or a
300
320
  // schedule/orientation/wake turn gets summarized from its tool calls alone, with no
301
321
  // idea what prompted them. Framed as an event, not an inbound message: it has no
@@ -306,9 +326,12 @@ function buildTranscript(events, parsedMeta) {
306
326
  lines.push(`[system event${named}] ${ev.content ?? ""}`);
307
327
  break;
308
328
  }
329
+ // The mind's own output/thoughts, labeled with its name so the "I" is unambiguous. Never
330
+ // truncated — a mid-sentence fragment is worse than a long line, because the model
331
+ // interpolates over the cut and invents a false memory.
309
332
  case "outbound":
310
333
  case "text":
311
- lines.push(`[response] ${(ev.content ?? "").slice(0, 500)}`);
334
+ lines.push(`[${mind} replied] ${ev.content ?? ""}`);
312
335
  break;
313
336
  case "tool_use": {
314
337
  const meta = parsedMeta.get(ev.id);
@@ -329,12 +352,26 @@ function buildTranscript(events, parsedMeta) {
329
352
  break;
330
353
  }
331
354
  case "thinking":
332
- lines.push(`[thinking] ${(ev.content ?? "").slice(0, 300)}`);
355
+ lines.push(`[${mind} thinking] ${ev.content ?? ""}`);
333
356
  break;
334
357
  }
335
358
  }
336
359
  return lines.join("\n");
337
360
  }
361
+ async function getMindIdentityLine(mind) {
362
+ try {
363
+ const user = await getUserByUsername(mind);
364
+ if (!user) return "";
365
+ const name = user.display_name?.trim();
366
+ const desc2 = user.description?.trim();
367
+ if (!name && !desc2) return "";
368
+ const who = name ? `${mind} (${name})` : mind;
369
+ return `[about the mind] ${who}${desc2 ? `: ${desc2}` : ""}`;
370
+ } catch (err) {
371
+ sLog.debug(`failed to load identity for ${mind}`, logger_default.errorData(err));
372
+ return "";
373
+ }
374
+ }
338
375
  async function summarizeTurn(mind, session, channel, doneId, turnId) {
339
376
  const { events, fromId, toId } = turnId ? await gatherTurnEventsByTurnId(turnId) : await gatherTurnEvents(mind, session, doneId);
340
377
  if (events.length === 0) return;
@@ -377,10 +414,14 @@ async function summarizeTurn(mind, session, channel, doneId, turnId) {
377
414
  const toTime = events[events.length - 1].created_at;
378
415
  let summaryText;
379
416
  let deterministic;
380
- const transcript = buildTranscript(events, parsedMeta);
417
+ const transcript = buildTranscript(events, parsedMeta, mind);
381
418
  if (transcript.trim()) {
382
- const summaryPrompt = await getPrompt("turn_summary");
383
- const aiResult = await aiCompleteUtility(summaryPrompt, transcript);
419
+ const summaryPrompt = await getPrompt("turn_summary", { mind });
420
+ const identity = await getMindIdentityLine(mind);
421
+ const input = identity ? `${identity}
422
+
423
+ ${transcript}` : transcript;
424
+ const aiResult = await aiCompleteUtility(summaryPrompt, input);
384
425
  if (aiResult) {
385
426
  summaryText = aiResult;
386
427
  deterministic = false;
@@ -449,6 +490,62 @@ async function setSummaryId(turnId, summaryId) {
449
490
  const db = await getDb();
450
491
  await db.update(turns).set({ summary_id: summaryId }).where(eq(turns.id, turnId));
451
492
  }
493
+ var MIND_TURN_SUMMARY_MAX_CHARS = 4e3;
494
+ async function supersedeTurnSummary(mind, turnId, content) {
495
+ const text = content.trim();
496
+ if (!text) return { status: "invalid", error: "content is required" };
497
+ if (text.length > MIND_TURN_SUMMARY_MAX_CHARS) {
498
+ return {
499
+ status: "invalid",
500
+ error: `content exceeds ${MIND_TURN_SUMMARY_MAX_CHARS} characters`
501
+ };
502
+ }
503
+ const db = await getDb();
504
+ const turn = await db.select().from(turns).where(eq(turns.id, turnId)).get();
505
+ if (!turn) return { status: "not_found" };
506
+ if (turn.mind !== mind) return { status: "forbidden" };
507
+ const existing = await db.select({ id: summaries.id, content: summaries.content, metadata: summaries.metadata }).from(summaries).where(
508
+ and(eq(summaries.mind, mind), eq(summaries.period, "turn"), eq(summaries.period_key, turnId))
509
+ ).get();
510
+ const authoredAt = utcDateTimeStr(/* @__PURE__ */ new Date());
511
+ let created;
512
+ if (existing) {
513
+ const prevMeta = parseMeta(existing.metadata);
514
+ let superseded = prevMeta.superseded;
515
+ if (superseded === void 0) {
516
+ const captured = { content: existing.content };
517
+ if (typeof prevMeta.deterministic === "boolean")
518
+ captured.deterministic = prevMeta.deterministic;
519
+ superseded = captured;
520
+ }
521
+ const metadata = { ...prevMeta, author: "mind", authored_at: authoredAt, superseded };
522
+ await db.update(summaries).set({ content: text, metadata: JSON.stringify(metadata) }).where(eq(summaries.id, existing.id));
523
+ created = false;
524
+ } else {
525
+ const metadata = { author: "mind", authored_at: authoredAt };
526
+ const result = await db.insert(summaries).values({
527
+ mind,
528
+ period: "turn",
529
+ period_key: turnId,
530
+ content: text,
531
+ metadata: JSON.stringify(metadata)
532
+ }).returning({ id: summaries.id });
533
+ const summaryId = result[0]?.id;
534
+ if (summaryId != null && turn.summary_id == null) {
535
+ await setSummaryId(turnId, summaryId);
536
+ }
537
+ created = true;
538
+ }
539
+ publish(mind, {
540
+ mind,
541
+ type: "summary",
542
+ session: turn.thread ?? void 0,
543
+ content: text,
544
+ metadata: { author: "mind", authored_at: authoredAt },
545
+ turnId
546
+ });
547
+ return { status: "ok", created };
548
+ }
452
549
  function getChildPeriod(period) {
453
550
  switch (period) {
454
551
  case "hour":
@@ -561,12 +658,32 @@ function trackProvisionalAttempt(metadata, prev) {
561
658
  metadata.first_attempt_at = prev && typeof prev.first_attempt_at === "string" ? prev.first_attempt_at : (/* @__PURE__ */ new Date()).toISOString();
562
659
  metadata.last_attempt_at = (/* @__PURE__ */ new Date()).toISOString();
563
660
  }
661
+ function childLabel(period, key2, createdAt) {
662
+ switch (period) {
663
+ case "hour": {
664
+ const d = parseDbTimestamp(createdAt);
665
+ const hh = String(d.getHours()).padStart(2, "0");
666
+ const mm = String(d.getMinutes()).padStart(2, "0");
667
+ return `${hh}:${mm}`;
668
+ }
669
+ case "day":
670
+ return `${key2.slice(11)}:00`;
671
+ case "week":
672
+ case "month":
673
+ return key2;
674
+ }
675
+ }
564
676
  async function gatherChildSummaries(mind, period, periodKey) {
565
677
  const db = await getDb();
566
678
  const childPeriod = getChildPeriod(period);
567
679
  if (period === "hour") {
568
680
  const { start: start2, end: end2 } = getTimeRange(periodKey, "hour");
569
- const rows2 = await db.select({ id: summaries.id, content: summaries.content, key: summaries.period_key }).from(summaries).where(
681
+ const rows2 = await db.select({
682
+ id: summaries.id,
683
+ content: summaries.content,
684
+ key: summaries.period_key,
685
+ created_at: summaries.created_at
686
+ }).from(summaries).where(
570
687
  and(
571
688
  eq(summaries.mind, mind),
572
689
  eq(summaries.period, childPeriod),
@@ -577,7 +694,8 @@ async function gatherChildSummaries(mind, period, periodKey) {
577
694
  return {
578
695
  texts: rows2.map((r) => r.content),
579
696
  sourceIds: rows2.map((r) => r.id),
580
- keys: rows2.map((r) => r.key)
697
+ keys: rows2.map((r) => r.key),
698
+ labels: rows2.map((r) => childLabel(period, r.key, r.created_at))
581
699
  };
582
700
  }
583
701
  if (period === "day") {
@@ -591,7 +709,8 @@ async function gatherChildSummaries(mind, period, periodKey) {
591
709
  return {
592
710
  texts: rows2.map((r) => r.content),
593
711
  sourceIds: rows2.map((r) => r.id),
594
- keys: rows2.map((r) => r.key)
712
+ keys: rows2.map((r) => r.key),
713
+ labels: rows2.map((r) => childLabel(period, r.key, ""))
595
714
  };
596
715
  }
597
716
  const { start, end } = getTimeRange(periodKey, period);
@@ -608,9 +727,20 @@ async function gatherChildSummaries(mind, period, periodKey) {
608
727
  return {
609
728
  texts: rows.map((r) => r.content),
610
729
  sourceIds: rows.map((r) => r.id),
611
- keys: rows.map((r) => r.key)
730
+ keys: rows.map((r) => r.key),
731
+ labels: rows.map((r) => childLabel(period, r.key, ""))
612
732
  };
613
733
  }
734
+ var SOUL_MAX_CHARS = 8e3;
735
+ async function readMindSoul(mind) {
736
+ try {
737
+ const dir = await resolveMindDir(mind);
738
+ const soul = await readFile(join(dir, "home", "SOUL.md"), "utf8");
739
+ return soul.length > SOUL_MAX_CHARS ? soul.slice(0, SOUL_MAX_CHARS) : soul;
740
+ } catch {
741
+ return "";
742
+ }
743
+ }
614
744
  async function summarizePeriod(mind, period, periodKey, complete = aiCompleteUtility) {
615
745
  const db = await getDb();
616
746
  const existing = await db.select({ id: summaries.id, metadata: summaries.metadata }).from(summaries).where(
@@ -651,8 +781,18 @@ async function summarizePeriod(mind, period, periodKey, complete = aiCompleteUti
651
781
  const entries = sources.texts.map((text, i) => ({ key: sources.keys[i], text }));
652
782
  const promptKey = `meta_summary_${period}`;
653
783
  const scopeInstruction = getScopeInstruction(mind);
654
- const systemPrompt = await getPrompt(promptKey, { scope_instruction: scopeInstruction });
655
- const userMessage = sources.texts.join("\n\n---\n\n");
784
+ let systemPrompt = await getPrompt(promptKey, { scope_instruction: scopeInstruction });
785
+ if (period === "week" || period === "month") {
786
+ const soul = await readMindSoul(mind);
787
+ if (soul.trim()) {
788
+ systemPrompt = `${systemPrompt}
789
+
790
+ For voice and perspective, this is the mind's own self-description (SOUL.md):
791
+
792
+ ${soul.trim()}`;
793
+ }
794
+ }
795
+ const userMessage = sources.texts.map((text, i) => `[${sources.labels[i]}] ${text}`).join("\n\n---\n\n");
656
796
  let content;
657
797
  let deterministic;
658
798
  const metadata = {
@@ -1060,11 +1200,11 @@ var Summarizer = class {
1060
1200
  }
1061
1201
  };
1062
1202
  async function reconcileWedgedTurns(idleMs) {
1063
- const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-C5PVIC3B.js");
1203
+ const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-NNHS6MAR.js");
1064
1204
  const wedged = await sweepWedgedTurns2(idleMs);
1065
1205
  if (wedged.length === 0) return;
1066
1206
  summarizeOrphanedTurns2(wedged);
1067
- const { tryGetDeliveryManager } = await import("./delivery-manager-VYXVKUMP.js");
1207
+ const { tryGetDeliveryManager } = await import("./delivery-manager-FDHCZ7PU.js");
1068
1208
  const dm = tryGetDeliveryManager();
1069
1209
  if (!dm) return;
1070
1210
  for (const t of wedged) {
@@ -1268,8 +1408,10 @@ export {
1268
1408
  utcDateTimeStr,
1269
1409
  parseUtcDateTime,
1270
1410
  getUtcTimeRange,
1411
+ parseDbTimestamp,
1271
1412
  SYSTEM_MIND,
1272
1413
  summarizeTurn,
1414
+ supersedeTurnSummary,
1273
1415
  initSummarizer,
1274
1416
  markErrored,
1275
1417
  takeErrored,
package/dist/cli.js CHANGED
@@ -10,7 +10,7 @@ if (!process.env.VOLUTE_HOME) {
10
10
  var command = process.argv[2];
11
11
  var args = process.argv.slice(3);
12
12
  if (command === "--version" || command === "-v") {
13
- const { default: pkg } = await import("./package-2W2XKSIP.js");
13
+ const { default: pkg } = await import("./package-BN5KMU54.js");
14
14
  console.log(pkg.version);
15
15
  process.exit(0);
16
16
  }
@@ -56,61 +56,61 @@ if (!isMind && !ungatedCommands.has(command)) {
56
56
  }
57
57
  switch (command) {
58
58
  case "setup":
59
- await import("./setup-4IX6PCD3.js").then((m) => m.run(args));
59
+ await import("./setup-RVSGCIF3.js").then((m) => m.run(args));
60
60
  break;
61
61
  case "mind":
62
- await import("./mind-NEXGT3KE.js").then((m) => m.run(args));
62
+ await import("./mind-IX5AWUST.js").then((m) => m.run(args));
63
63
  break;
64
64
  case "seed":
65
- await import("./seed-cmd-UEL2QB3Q.js").then((m) => m.run(args));
65
+ await import("./seed-cmd-U4RVJ3UA.js").then((m) => m.run(args));
66
66
  break;
67
67
  case "chat":
68
- await import("./chat-VAZ25KVT.js").then((m) => m.run(args));
68
+ await import("./chat-WK2BLM7B.js").then((m) => m.run(args));
69
69
  break;
70
70
  case "variant":
71
71
  await import("./variant-HHDTW74J.js").then((m) => m.run(args));
72
72
  break;
73
73
  case "clock":
74
- await import("./clock-ZT5YT6HA.js").then((m) => m.run(args));
74
+ await import("./clock-SH4NQC2F.js").then((m) => m.run(args));
75
75
  break;
76
76
  case "skill":
77
- await import("./skill-B5OJEQUA.js").then((m) => m.run(args));
77
+ await import("./skill-DXLLSUHB.js").then((m) => m.run(args));
78
78
  break;
79
79
  case "env":
80
- await import("./env-IBW2QI6K.js").then((m) => m.run(args));
80
+ await import("./env-BJGM6FBA.js").then((m) => m.run(args));
81
81
  break;
82
82
  case "config":
83
83
  await import("./config-UGJS57VT.js").then((m) => m.run(args));
84
84
  break;
85
85
  case "up":
86
- await import("./up-H6LJZDRK.js").then((m) => m.run(args));
86
+ await import("./up-UGBHH743.js").then((m) => m.run(args));
87
87
  break;
88
88
  case "backup":
89
- await import("./backup-YVGV2ZNM.js").then((m) => m.run(args));
89
+ await import("./backup-WWXVIMYQ.js").then((m) => m.run(args));
90
90
  break;
91
91
  case "down":
92
92
  await import("./down-QSNEMTTX.js").then((m) => m.run(args));
93
93
  break;
94
94
  case "restart":
95
- await import("./daemon-restart-4FWUA5JF.js").then((m) => m.run(args));
95
+ await import("./daemon-restart-BIGU4OKS.js").then((m) => m.run(args));
96
96
  break;
97
97
  case "update":
98
98
  await import("./update-CIWI2JYA.js").then((m) => m.run(args));
99
99
  break;
100
100
  case "status":
101
- await import("./status-MWLE3RVC.js").then((m) => m.run(args));
101
+ await import("./status-EYG4A3OK.js").then((m) => m.run(args));
102
102
  break;
103
103
  case "extension":
104
- await import("./extension-MRYJWSMV.js").then((m) => m.run(args));
104
+ await import("./extension-B2W52WZY.js").then((m) => m.run(args));
105
105
  break;
106
106
  case "systems":
107
- await import("./systems-VDRUZXNF.js").then((m) => m.run(args));
107
+ await import("./systems-2DIJY4RF.js").then((m) => m.run(args));
108
108
  break;
109
109
  case "login":
110
- await import("./login-SB5OENMV.js").then((m) => m.run(args));
110
+ await import("./login-JDOAK465.js").then((m) => m.run(args));
111
111
  break;
112
112
  case "logout":
113
- await import("./logout-YFZAJRPY.js").then((m) => m.run(args));
113
+ await import("./logout-K6ZGAJY5.js").then((m) => m.run(args));
114
114
  break;
115
115
  case "service":
116
116
  await import("./service-XQPMZAGI.js").then((m) => m.run(args));
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  parseDuration,
4
4
  run
5
- } from "./chunk-G7A5LEVI.js";
5
+ } from "./chunk-LN7XJ56R.js";
6
6
  import "./chunk-7YJY3F2R.js";
7
7
  import "./chunk-BTY4WNFE.js";
8
- import "./chunk-M74I3HHF.js";
9
- import "./chunk-LOPXTW6H.js";
10
8
  import "./chunk-TXSA4Q3V.js";
11
9
  import "./chunk-O7IGP7ZW.js";
10
+ import "./chunk-M74I3HHF.js";
11
+ import "./chunk-LOPXTW6H.js";
12
12
  import "./chunk-FNJCBRD3.js";
13
13
  import "./chunk-K3NQKI34.js";
14
14
  export {
@@ -1,19 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deliverMessage
4
- } from "./chunk-ZEZQNP2G.js";
5
- import "./chunk-K2F237KS.js";
4
+ } from "./chunk-HASADR3E.js";
5
+ import "./chunk-5DBGQBQR.js";
6
6
  import "./chunk-X67BDDZR.js";
7
- import "./chunk-SW2U6HRB.js";
8
- import "./chunk-RU74YG46.js";
9
- import "./chunk-724DVYHU.js";
7
+ import "./chunk-PIZDPY4G.js";
8
+ import "./chunk-RQRO6PC7.js";
9
+ import "./chunk-23UJGVYP.js";
10
10
  import "./chunk-UDZLPR34.js";
11
- import "./chunk-YVR6EHWL.js";
12
- import "./chunk-RPPTGPYF.js";
11
+ import "./chunk-VDZ4I4ZP.js";
12
+ import "./chunk-TAWRJ24T.js";
13
13
  import "./chunk-7LT3YZUR.js";
14
- import "./chunk-AXFLY5GU.js";
14
+ import "./chunk-IQ7VNWH6.js";
15
15
  import "./chunk-LNNI3MS4.js";
16
- import "./chunk-FXWBFDQR.js";
16
+ import "./chunk-AP2KQMMW.js";
17
17
  import "./chunk-5Y54AE3L.js";
18
18
  import {
19
19
  getAuthHeaders,
@@ -30,6 +30,7 @@ import "./chunk-EGV6R6UF.js";
30
30
  import {
31
31
  logger_default
32
32
  } from "./chunk-QUSMYGNQ.js";
33
+ import "./chunk-LGNUFVMR.js";
33
34
  import "./chunk-H6X6CKDN.js";
34
35
  import "./chunk-2RNMBXD2.js";
35
36
  import "./chunk-K3NQKI34.js";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-5N32EN4O.js";
5
5
  import {
6
6
  run
7
- } from "./chunk-VPOMJMV6.js";
7
+ } from "./chunk-BDHKCLWK.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";