volute 0.51.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.
- package/dist/{accept-5NK5XJB5.js → accept-I4GVGWA3.js} +6 -3
- package/dist/{auth-X6EMNEGB.js → auth-KRDSM55Q.js} +3 -1
- package/dist/{chat-VAZ25KVT.js → chat-WK2BLM7B.js} +9 -9
- package/dist/{chunk-VAEZCIJC.js → chunk-23UJGVYP.js} +9 -9
- package/dist/{chunk-VSBMLB2W.js → chunk-5DBGQBQR.js} +138 -13
- package/dist/chunk-5RBEEAKW.js +58 -0
- package/dist/{chunk-BSHZ23MS.js → chunk-7ARONCZW.js} +25 -3
- package/dist/{chunk-HKP6OAJP.js → chunk-7LT3YZUR.js} +12 -0
- package/dist/{chunk-FXWBFDQR.js → chunk-AP2KQMMW.js} +48 -9
- package/dist/{chunk-DMK5ASKV.js → chunk-F6D766VQ.js} +6 -2
- package/dist/{chunk-VP5PFNZO.js → chunk-HASADR3E.js} +73 -20
- package/dist/{chunk-ICL6T4SN.js → chunk-IQ7VNWH6.js} +26 -2
- package/dist/{chunk-G7A5LEVI.js → chunk-LN7XJ56R.js} +6 -6
- package/dist/{chunk-DN3LKLYR.js → chunk-P2TBUKLW.js} +3 -3
- package/dist/{chunk-Q7XQLKZB.js → chunk-PIZDPY4G.js} +20 -3
- package/dist/{chunk-JHKBALS2.js → chunk-RMADJFA7.js} +1 -1
- package/dist/{chunk-7HN63Q7J.js → chunk-RQRO6PC7.js} +40 -6
- package/dist/{chunk-QT4D5XCI.js → chunk-TAWRJ24T.js} +1 -1
- package/dist/{chunk-AI47FDGL.js → chunk-UO4MZQNO.js} +1 -1
- package/dist/chunk-UTKUO2KY.js +102 -0
- package/dist/{chunk-CDKQJWGK.js → chunk-VDZ4I4ZP.js} +160 -18
- package/dist/cli.js +16 -16
- package/dist/{clock-ZT5YT6HA.js → clock-SH4NQC2F.js} +3 -3
- package/dist/{cloud-sync-GPXYPTIC.js → cloud-sync-MJVJ33LD.js} +11 -10
- package/dist/{daemon-restart-2EWBRTN5.js → daemon-restart-BIGU4OKS.js} +1 -1
- package/dist/daemon.js +543 -236
- package/dist/{delete-O7PEFQDF.js → delete-CYVZUAV2.js} +4 -0
- package/dist/{delivery-manager-HGVZSEES.js → delivery-manager-FDHCZ7PU.js} +7 -5
- package/dist/delivery-notices-65TB3CBX.js +18 -0
- package/dist/{echo-text-6ANI5HHN.js → echo-text-KU6G4Z7V.js} +12 -11
- package/dist/{extensions-NY6WST33.js → extensions-VACUKFA5.js} +11 -10
- package/dist/{files-BRY5RRIM.js → files-CHPNEQXN.js} +5 -4
- package/dist/{join-PYA36HEC.js → join-KLRU72JJ.js} +10 -2
- package/dist/{message-delivery-JHMAJ2GU.js → message-delivery-TUXM3AAE.js} +15 -12
- package/dist/{mind-WF6QIXWV.js → mind-IX5AWUST.js} +13 -13
- package/dist/{mind-contacts-QYU4TPEA.js → mind-contacts-BKUOUJPV.js} +5 -5
- package/dist/{mind-history-OGNR4L7W.js → mind-history-RVF6KJ7K.js} +83 -11
- package/dist/{mind-list-SYRA7CH5.js → mind-list-KNU34SUD.js} +2 -2
- package/dist/{mind-service-DZCUUC7J.js → mind-service-WHFBUKZE.js} +11 -10
- package/dist/{mind-sleep-LZAFBDZD.js → mind-sleep-D3DEYAWG.js} +5 -5
- package/dist/{mind-status-Z2LQFA6F.js → mind-status-BPTLQ5Z6.js} +15 -3
- package/dist/{package-B6O5APCZ.js → package-BN5KMU54.js} +2 -2
- package/dist/{prompts-NBO3HRK3.js → prompts-HNKGCAEY.js} +1 -1
- package/dist/{reject-TWB4QJHG.js → reject-K2A4UK2Y.js} +9 -5
- package/dist/{scheduler-TNBN54ZK.js → scheduler-5X5UIQOQ.js} +7 -5
- package/dist/{seed-K2LYODIH.js → seed-LHZ33UB4.js} +1 -1
- package/dist/{seed-cmd-2EWBTR6P.js → seed-cmd-U4RVJ3UA.js} +2 -2
- package/dist/{seed-create-VGTLU5FD.js → seed-create-OQU4KNCB.js} +1 -1
- package/dist/{seed-readiness-DYOVCYHN.js → seed-readiness-WJYYRRCK.js} +2 -2
- package/dist/{seed-sprout-PILHJ3YS.js → seed-sprout-SFUYH2RG.js} +7 -7
- package/dist/{send-2YKOZJJ5.js → send-FWZAMDBN.js} +35 -20
- package/dist/{setup-MDPSK2XG.js → setup-RVSGCIF3.js} +1 -1
- package/dist/skills/memory/SKILL.md +47 -43
- package/dist/skills/volute-mind/references/variants.md +1 -1
- package/dist/{skills-NH2GQKAF.js → skills-QRPU6BWY.js} +1 -1
- package/dist/{sleep-manager-7JXEQQ2P.js → sleep-manager-NWUCRBZB.js} +11 -10
- package/dist/{spirit-25JVAL3M.js → spirit-I5ECLGRI.js} +16 -2
- package/dist/{spirit-availability-PJDWZJ3J.js → spirit-availability-NIUUYKU2.js} +12 -11
- package/dist/{sprout-EXUZMIOR.js → sprout-A2PMEF7Z.js} +1 -1
- package/dist/{system-events-ZPSH63QX.js → system-events-YTOU66QI.js} +7 -1
- package/dist/{systems-VDRUZXNF.js → systems-2DIJY4RF.js} +6 -6
- package/dist/{turn-tracker-TAT2HGK6.js → turn-tracker-NNHS6MAR.js} +4 -2
- package/dist/{up-J7XCAH7P.js → up-UGBHH743.js} +1 -1
- package/dist/{variant-cleanup-YXN25ZVW.js → variant-cleanup-CZDLIY3F.js} +7 -5
- package/dist/{version-notify-EN3KJ7HH.js → version-notify-SJVAQLZI.js} +4 -4
- package/dist/web-assets/assets/index-BHSU9r-4.css +1 -0
- package/dist/web-assets/assets/index-b7G7ZsVk.js +97 -0
- package/dist/web-assets/index.html +2 -2
- package/package.json +2 -2
- package/templates/_base/.init/.config/prompts.json +1 -1
- package/templates/_base/src/lib/auto-commit.ts +49 -11
- package/templates/_base/src/lib/codex-session-seed.ts +463 -0
- package/templates/_base/src/lib/daemon-client.ts +35 -0
- package/templates/_base/src/lib/pi-session-seed.ts +434 -0
- package/templates/_base/src/lib/seed-note.ts +78 -0
- package/templates/_base/src/lib/session-seed.ts +375 -0
- package/templates/_base/src/lib/startup.ts +108 -4
- package/templates/claude/.init/CLAUDE.md +3 -3
- package/templates/claude/src/agent.ts +267 -89
- package/templates/claude/src/lib/hooks/pre-compact.ts +30 -5
- package/templates/claude/src/lib/stream-consumer.ts +13 -0
- package/templates/claude/src/server.ts +2 -1
- package/templates/codex/.init/AGENTS.md +3 -3
- package/templates/codex/src/agent.ts +256 -39
- package/templates/codex/src/server.ts +2 -1
- package/templates/pi/.init/MINDS.md +3 -3
- package/templates/pi/src/agent.ts +269 -43
- package/templates/pi/src/lib/event-handler.ts +11 -0
- package/templates/pi/src/server.ts +3 -1
- package/dist/web-assets/assets/index-BOyJ4Gqs.css +0 -1
- package/dist/web-assets/assets/index-CrxBwnzp.js +0 -95
- package/dist/{backup-YVGV2ZNM.js → backup-WWXVIMYQ.js} +5 -5
- package/dist/{bridge-YK7NTRU5.js → bridge-KU2IKSH3.js} +3 -3
- package/dist/{channels-FSAHOQWI.js → channels-LW5ZLMSQ.js} +3 -3
- package/dist/{chunk-IWAVIJO2.js → chunk-BDHKCLWK.js} +0 -0
- package/dist/{chunk-EEOMA4DX.js → chunk-HTB7KDRU.js} +3 -3
- package/dist/{create-M727VUDF.js → create-C3XZACTV.js} +3 -3
- package/dist/{env-IBW2QI6K.js → env-BJGM6FBA.js} +5 -5
- package/dist/{extension-MRYJWSMV.js → extension-B2W52WZY.js} +3 -3
- package/dist/{list-UQGIW7OF.js → list-R2GDWOEE.js} +3 -3
- package/dist/{login-RJJTCVR3.js → login-EZ4RRDQX.js} +3 -3
- package/dist/{login-SB5OENMV.js → login-JDOAK465.js} +4 -4
- package/dist/{logout-YFZAJRPY.js → logout-K6ZGAJY5.js} +3 -3
- package/dist/{logout-BYV433X6.js → logout-MWSIUOQU.js} +3 -3
- package/dist/{mind-wake-LDGPRA42.js → mind-wake-DCDFFQKX.js} +3 -3
- package/dist/{read-RJ5NAW5J.js → read-J5RM674N.js} +3 -3
- package/dist/{register-OX4HRSGC.js → register-53LBGSDC.js} +3 -3
- package/dist/{restart-AGEGNSYQ.js → restart-R2WFNF5K.js} +4 -4
- package/dist/{skill-B5OJEQUA.js → skill-DXLLSUHB.js} +5 -5
- package/dist/{start-MUMNFR52.js → start-XDOUAWN3.js} +4 -4
- package/dist/{status-MWLE3RVC.js → status-EYG4A3OK.js} +3 -3
- 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-
|
|
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
|
-
|
|
297
|
-
|
|
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(`[
|
|
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] ${
|
|
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
|
|
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({
|
|
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
|
-
|
|
655
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
59
|
+
await import("./setup-RVSGCIF3.js").then((m) => m.run(args));
|
|
60
60
|
break;
|
|
61
61
|
case "mind":
|
|
62
|
-
await import("./mind-
|
|
62
|
+
await import("./mind-IX5AWUST.js").then((m) => m.run(args));
|
|
63
63
|
break;
|
|
64
64
|
case "seed":
|
|
65
|
-
await import("./seed-cmd-
|
|
65
|
+
await import("./seed-cmd-U4RVJ3UA.js").then((m) => m.run(args));
|
|
66
66
|
break;
|
|
67
67
|
case "chat":
|
|
68
|
-
await import("./chat-
|
|
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-
|
|
74
|
+
await import("./clock-SH4NQC2F.js").then((m) => m.run(args));
|
|
75
75
|
break;
|
|
76
76
|
case "skill":
|
|
77
|
-
await import("./skill-
|
|
77
|
+
await import("./skill-DXLLSUHB.js").then((m) => m.run(args));
|
|
78
78
|
break;
|
|
79
79
|
case "env":
|
|
80
|
-
await import("./env-
|
|
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-
|
|
86
|
+
await import("./up-UGBHH743.js").then((m) => m.run(args));
|
|
87
87
|
break;
|
|
88
88
|
case "backup":
|
|
89
|
-
await import("./backup-
|
|
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-
|
|
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-
|
|
101
|
+
await import("./status-EYG4A3OK.js").then((m) => m.run(args));
|
|
102
102
|
break;
|
|
103
103
|
case "extension":
|
|
104
|
-
await import("./extension-
|
|
104
|
+
await import("./extension-B2W52WZY.js").then((m) => m.run(args));
|
|
105
105
|
break;
|
|
106
106
|
case "systems":
|
|
107
|
-
await import("./systems-
|
|
107
|
+
await import("./systems-2DIJY4RF.js").then((m) => m.run(args));
|
|
108
108
|
break;
|
|
109
109
|
case "login":
|
|
110
|
-
await import("./login-
|
|
110
|
+
await import("./login-JDOAK465.js").then((m) => m.run(args));
|
|
111
111
|
break;
|
|
112
112
|
case "logout":
|
|
113
|
-
await import("./logout-
|
|
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-
|
|
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-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-HASADR3E.js";
|
|
5
|
+
import "./chunk-5DBGQBQR.js";
|
|
6
6
|
import "./chunk-X67BDDZR.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-PIZDPY4G.js";
|
|
8
|
+
import "./chunk-RQRO6PC7.js";
|
|
9
|
+
import "./chunk-23UJGVYP.js";
|
|
10
10
|
import "./chunk-UDZLPR34.js";
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-VDZ4I4ZP.js";
|
|
12
|
+
import "./chunk-TAWRJ24T.js";
|
|
13
|
+
import "./chunk-7LT3YZUR.js";
|
|
14
|
+
import "./chunk-IQ7VNWH6.js";
|
|
15
15
|
import "./chunk-LNNI3MS4.js";
|
|
16
|
-
import "./chunk-
|
|
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";
|