volute 0.52.0 → 0.54.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-RSDIVJL6.js} +3 -0
- package/dist/auto-upgrade-HEVZKPTF.js +46 -0
- package/dist/{backup-YVGV2ZNM.js → backup-QRNX6RK7.js} +10 -10
- package/dist/channels-CKCY64TD.js +203 -0
- package/dist/{chat-VAZ25KVT.js → chat-ZUGNL5GS.js} +5 -5
- package/dist/chunk-3LHUXY3E.js +102 -0
- package/dist/{chunk-SW2U6HRB.js → chunk-444RR3YF.js} +21 -4
- package/dist/{chunk-YVR6EHWL.js → chunk-56IT2ZXF.js} +160 -18
- package/dist/chunk-5RBEEAKW.js +58 -0
- package/dist/{chunk-OXWUEU5V.js → chunk-5U5GLZSD.js} +2 -2
- package/dist/{chunk-G7A5LEVI.js → chunk-7XKPG66D.js} +5 -5
- package/dist/{chunk-R772ET2M.js → chunk-AAPNU7GA.js} +4 -0
- package/dist/{chunk-XRWUQPCA.js → chunk-ATZF2RNJ.js} +25 -3
- package/dist/{chunk-6NLW72HP.js → chunk-CKPAVQNK.js} +1 -1
- package/dist/{chunk-JHKBALS2.js → chunk-CLCHOXLR.js} +1 -1
- package/dist/{chunk-DMK5ASKV.js → chunk-F6D766VQ.js} +6 -2
- package/dist/{chunk-AXFLY5GU.js → chunk-HKGYZVWN.js} +16 -1
- package/dist/{chunk-ZEZQNP2G.js → chunk-LGXVGIWN.js} +103 -25
- package/dist/{chunk-CW7BQKF6.js → chunk-LKUGUQUW.js} +3 -3
- package/dist/{chunk-FXWBFDQR.js → chunk-OAYY3WF3.js} +59 -12
- package/dist/{chunk-ITK6HV47.js → chunk-OGPVJ53N.js} +14 -6
- package/dist/{chunk-M77B73VV.js → chunk-OIOW3FPT.js} +7 -2
- package/dist/chunk-OT5SXF7L.js +904 -0
- package/dist/{chunk-EDR47UE2.js → chunk-OYF25B62.js} +1 -1
- package/dist/{chunk-RPPTGPYF.js → chunk-PPSN2MLC.js} +2 -2
- package/dist/{chunk-K2F237KS.js → chunk-RGHF3OK5.js} +154 -18
- package/dist/{chunk-RU74YG46.js → chunk-VDUCLVZI.js} +338 -30
- package/dist/{chunk-724DVYHU.js → chunk-WHL6PKYP.js} +10 -10
- package/dist/{chunk-EEOMA4DX.js → chunk-WZZCA23D.js} +2 -1
- package/dist/{chunk-UDZLPR34.js → chunk-YSRYCS3N.js} +13 -8
- package/dist/{chunk-5N32EN4O.js → chunk-Z4Q6TQWL.js} +1 -1
- package/dist/{chunk-VPOMJMV6.js → chunk-ZNHL5KQJ.js} +1 -1
- package/dist/cli.js +17 -17
- package/dist/{clock-ZT5YT6HA.js → clock-X7V3C7NL.js} +2 -2
- package/dist/{cloud-sync-H7EWZASD.js → cloud-sync-52YNJRMR.js} +12 -11
- package/dist/{daemon-restart-4FWUA5JF.js → daemon-restart-QWHN5VMU.js} +4 -4
- package/dist/daemon.js +538 -782
- package/dist/{db-IPXRJUI7.js → db-I4EH5SLF.js} +3 -1
- package/dist/{delivery-manager-VYXVKUMP.js → delivery-manager-7R2YIQ2W.js} +13 -7
- package/dist/delivery-notices-RZQ6GONP.js +18 -0
- package/dist/{delivery-router-RHANNTAC.js → delivery-router-QS4NLJR6.js} +3 -1
- package/dist/{down-QSNEMTTX.js → down-UN2EDX2Y.js} +3 -3
- package/dist/{echo-text-PEEV7FQU.js → echo-text-73CYQRL7.js} +14 -13
- package/dist/{exec-ABD3DYA2.js → exec-Z34TTUO3.js} +1 -1
- package/dist/{extensions-N6L5NYTK.js → extensions-QT65JGV6.js} +22 -11
- package/dist/{files-BRY5RRIM.js → files-PCKBQHAY.js} +2 -1
- package/dist/{isolation-GVV2IBAU.js → isolation-UQPDO34R.js} +1 -1
- package/dist/{message-delivery-7URC52ME.js → message-delivery-TRKT4T2P.js} +16 -13
- package/dist/migrate-name-placeholder-C7NCNLWF.js +37 -0
- package/dist/{mind-NEXGT3KE.js → mind-CT6ANXK4.js} +11 -11
- package/dist/{mind-contacts-QYU4TPEA.js → mind-contacts-PEXCDRXA.js} +6 -6
- package/dist/{mind-history-OGNR4L7W.js → mind-history-RZMMCHMX.js} +83 -11
- package/dist/{mind-list-SYRA7CH5.js → mind-list-7KBLPLES.js} +1 -1
- package/dist/{mind-service-E26ZQXDS.js → mind-service-7EFIJ3ZA.js} +12 -11
- package/dist/{mind-sleep-LZAFBDZD.js → mind-sleep-24HV4RCA.js} +2 -2
- package/dist/{mind-status-Z2LQFA6F.js → mind-status-4YW4PHMO.js} +15 -0
- package/dist/{package-2W2XKSIP.js → package-F6S5NHY2.js} +4 -4
- package/dist/{prompts-NBO3HRK3.js → prompts-JECJIFPQ.js} +1 -1
- package/dist/{reject-TWB4QJHG.js → reject-4NFLXKRN.js} +6 -2
- package/dist/{scheduler-JTTWZDYU.js → scheduler-73Q4MQ7Y.js} +8 -6
- package/dist/{seed-64XEHRUP.js → seed-DRKAP3XV.js} +1 -1
- package/dist/{seed-cmd-UEL2QB3Q.js → seed-cmd-6IMTO3LG.js} +2 -2
- package/dist/{seed-create-4JRQDPGA.js → seed-create-VNLDYRFK.js} +1 -1
- package/dist/{seed-readiness-DYOVCYHN.js → seed-readiness-H5TTPAQH.js} +2 -2
- package/dist/{seed-sprout-NIDIOJXT.js → seed-sprout-PPGYGK4G.js} +5 -5
- package/dist/{send-2YKOZJJ5.js → send-UXUQKO4N.js} +37 -22
- package/dist/{service-XQPMZAGI.js → service-T4P5W6RS.js} +2 -2
- package/dist/{service-install-2EWD7KXD.js → service-install-R4SNYUVO.js} +3 -3
- package/dist/{setup-4IX6PCD3.js → setup-YUAQMDVZ.js} +4 -4
- package/dist/skills/dreaming/SKILL.md +2 -2
- package/dist/skills/dreaming/references/INSTALL.md +1 -1
- package/dist/skills/memory/SKILL.md +47 -43
- package/dist/skills/tending/SKILL.md +2 -0
- package/dist/skills/volute-mind/references/integrations.md +3 -2
- package/dist/skills/volute-mind/references/routing.md +18 -5
- package/dist/{skills-MPUALV3S.js → skills-GMQ5UIIW.js} +2 -2
- package/dist/{sleep-manager-OFP2GFXF.js → sleep-manager-KHI65FEX.js} +12 -11
- package/dist/{spirit-4ECYIVGE.js → spirit-Q5VGFWUI.js} +19 -3
- package/dist/{spirit-availability-Y54Y3675.js → spirit-availability-G5FMWKRH.js} +13 -12
- package/dist/{sprout-GJMZFRGZ.js → sprout-PMTRL7QN.js} +1 -1
- package/dist/{src-LCSOQY6Z.js → src-3FIW7DLH.js} +241 -87
- package/dist/src-H3UCOP6B.js +516 -0
- package/dist/{src-HGNE2XG4.js → src-LTTQVN2Z.js} +1 -1
- package/dist/{status-MWLE3RVC.js → status-LCKTTIWS.js} +2 -2
- package/dist/{system-events-V43HDA3T.js → system-events-Q7IVZ5T4.js} +5 -1
- package/dist/{systems-VDRUZXNF.js → systems-HL7SGSW7.js} +2 -2
- package/dist/{turn-tracker-C5PVIC3B.js → turn-tracker-HZDPMSCC.js} +4 -2
- package/dist/{up-H6LJZDRK.js → up-XZDSJVMU.js} +3 -3
- package/dist/{update-CIWI2JYA.js → update-ILCPVNDD.js} +2 -2
- package/dist/{upgrade-LIE46UBB.js → upgrade-XY2J7NWZ.js} +9 -1
- package/dist/{variant-cleanup-STC6B5HR.js → variant-cleanup-QHGGY7ND.js} +8 -6
- package/dist/{version-notify-LBVHH5YV.js → version-notify-VNVFX6UP.js} +22 -7
- package/dist/web-assets/assets/{index-B_eYTa3R.js → index-CwtxGwe_.js} +16 -16
- package/dist/web-assets/assets/index-DhM1yYRN.css +1 -0
- package/dist/web-assets/index.html +2 -2
- package/package.json +4 -4
- package/packages/extensions/intentions/dist/ui/assets/index-3FneLCKR.css +1 -0
- package/packages/extensions/intentions/dist/ui/assets/index-CQz4aceM.js +67 -0
- package/packages/extensions/{plan → intentions}/dist/ui/index.html +3 -3
- package/packages/extensions/intentions/skills/intention-review/SKILL.md +38 -0
- package/packages/extensions/intentions/skills/intentions/SKILL.md +49 -0
- package/packages/extensions/intentions/skills/intentions/scripts/intentions-hook.sh +45 -0
- package/packages/extensions/pages/skills/commons-gardening/SKILL.md +50 -0
- package/packages/extensions/pages/skills/pages/SKILL.md +18 -13
- package/templates/_base/.init/.config/prompts.json +3 -3
- package/templates/{pi → _base}/.init/.config/routes.json +1 -0
- package/templates/_base/.init/memory/dreams/.gitkeep +0 -0
- package/templates/_base/home/.config/routes.json +1 -1
- package/templates/_base/home/VOLUTE.md +1 -1
- package/templates/_base/src/lib/codex-session-seed.ts +463 -0
- package/templates/_base/src/lib/context-breakdown.ts +11 -3
- 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/routing.ts +2 -2
- 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 +112 -6
- package/templates/claude/.init/CLAUDE.md +7 -3
- package/templates/claude/src/agent.ts +295 -101
- package/templates/claude/src/lib/hooks/pre-compact.ts +30 -5
- package/templates/claude/src/lib/message-channel.ts +43 -15
- package/templates/claude/src/lib/recover.ts +69 -0
- package/templates/claude/src/lib/stream-consumer.ts +33 -2
- package/templates/claude/src/server.ts +2 -1
- package/templates/claude/volute-template.json +1 -1
- package/templates/codex/.init/AGENTS.md +7 -3
- package/templates/codex/src/agent.ts +256 -39
- package/templates/codex/src/server.ts +2 -1
- package/templates/codex/volute-template.json +1 -1
- package/templates/pi/.init/MINDS.md +7 -3
- package/templates/pi/src/agent.ts +269 -43
- package/templates/pi/src/lib/event-handler.ts +11 -0
- package/templates/pi/src/lib/mechanics-doc.ts +30 -0
- package/templates/pi/src/server.ts +5 -1
- package/templates/pi/volute-template.json +1 -1
- package/dist/channels-FSAHOQWI.js +0 -90
- package/dist/skills/plan-coordinator/SKILL.md +0 -60
- package/dist/src-UDMJZ6MH.js +0 -426
- package/dist/web-assets/assets/index-DhZrzddW.css +0 -1
- package/packages/extensions/plan/dist/ui/assets/index-B8s8wxyt.js +0 -67
- package/packages/extensions/plan/dist/ui/assets/index-jIkrt-vI.css +0 -1
- package/packages/extensions/plan/skills/plan/SKILL.md +0 -43
- package/packages/extensions/plan/skills/plan/scripts/plan-hook.sh +0 -37
- package/templates/claude/.init/.config/routes.json +0 -11
- package/templates/codex/.init/.config/routes.json +0 -11
- package/dist/{env-IBW2QI6K.js → env-7AZFBPWX.js} +5 -5
- package/dist/{login-RJJTCVR3.js → login-4NUS72Z5.js} +3 -3
- package/dist/{login-SB5OENMV.js → login-57MMYILL.js} +4 -4
- package/dist/{register-OX4HRSGC.js → register-WNCSOTAU.js} +3 -3
- package/dist/{restart-AGEGNSYQ.js → restart-B4GNMVF2.js} +4 -4
- package/dist/{skill-B5OJEQUA.js → skill-QYTBUDNQ.js} +4 -4
- package/dist/{start-MUMNFR52.js → start-BDHJVOVX.js} +3 -3
- package/dist/{stop-EKERNYTX.js → stop-45QYSGYS.js} +4 -4
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
spiritDir
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-RGHF3OK5.js";
|
|
5
5
|
import {
|
|
6
6
|
getScheduler
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-444RR3YF.js";
|
|
8
8
|
import {
|
|
9
9
|
getDeliveryManager
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-VDUCLVZI.js";
|
|
11
11
|
import {
|
|
12
12
|
getMindManager,
|
|
13
13
|
resolveMindToken
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-WHL6PKYP.js";
|
|
15
15
|
import {
|
|
16
16
|
extractTextContent,
|
|
17
17
|
getRoutingConfig,
|
|
18
18
|
resolveRoute,
|
|
19
19
|
shouldGate
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-YSRYCS3N.js";
|
|
21
21
|
import {
|
|
22
22
|
hashSkillDir,
|
|
23
23
|
importSkillFromDir,
|
|
24
24
|
removeSharedSkill,
|
|
25
25
|
sharedSkillsDir
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-PPSN2MLC.js";
|
|
27
27
|
import {
|
|
28
28
|
getOrCreateMindUser,
|
|
29
29
|
getOrCreateSystemUser,
|
|
@@ -38,13 +38,13 @@ import {
|
|
|
38
38
|
pendingEventCount,
|
|
39
39
|
pendingEventsLine,
|
|
40
40
|
recordNotice
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-HKGYZVWN.js";
|
|
42
42
|
import {
|
|
43
43
|
publish as publish2
|
|
44
44
|
} from "./chunk-LNNI3MS4.js";
|
|
45
45
|
import {
|
|
46
46
|
getPrompt
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-OAYY3WF3.js";
|
|
48
48
|
import {
|
|
49
49
|
addMessage,
|
|
50
50
|
createChannel,
|
|
@@ -70,7 +70,7 @@ import {
|
|
|
70
70
|
import {
|
|
71
71
|
isIsolationEnabled,
|
|
72
72
|
mindUserName
|
|
73
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-OIOW3FPT.js";
|
|
74
74
|
import {
|
|
75
75
|
missingCredentialWarning
|
|
76
76
|
} from "./chunk-EGV6R6UF.js";
|
|
@@ -86,6 +86,7 @@ import {
|
|
|
86
86
|
mindDir,
|
|
87
87
|
readGlobalConfig,
|
|
88
88
|
readRegistry,
|
|
89
|
+
resolveMindDir,
|
|
89
90
|
stateDir,
|
|
90
91
|
voluteHome,
|
|
91
92
|
voluteSystemDir,
|
|
@@ -931,7 +932,7 @@ async function startMindFull(name) {
|
|
|
931
932
|
}
|
|
932
933
|
}
|
|
933
934
|
async function recordMissingCredentialsNotice(mind, template) {
|
|
934
|
-
const { hasUndeliveredEvent, recordNotice: recordNotice2, MIND_LEVEL_THREAD: MIND_LEVEL_THREAD2 } = await import("./system-events-
|
|
935
|
+
const { hasUndeliveredEvent, recordNotice: recordNotice2, MIND_LEVEL_THREAD: MIND_LEVEL_THREAD2 } = await import("./system-events-Q7IVZ5T4.js");
|
|
935
936
|
const warning = await missingCredentialWarning(template, readMindModel(mind, template), mind);
|
|
936
937
|
if (!warning) return;
|
|
937
938
|
if (await hasUndeliveredEvent(mind, "no_credentials")) return;
|
|
@@ -975,7 +976,7 @@ async function wakeMind(name) {
|
|
|
975
976
|
async function startSpiritFull(name) {
|
|
976
977
|
const entry = await findMind(name);
|
|
977
978
|
if (entry?.dir) {
|
|
978
|
-
const { registerMindDir } = await import("./delivery-router-
|
|
979
|
+
const { registerMindDir } = await import("./delivery-router-QS4NLJR6.js");
|
|
979
980
|
registerMindDir(name, entry.dir);
|
|
980
981
|
}
|
|
981
982
|
await getMindManager().startMind(name);
|
|
@@ -983,6 +984,11 @@ async function startSpiritFull(name) {
|
|
|
983
984
|
(err) => logger_default.error(`failed to join #system for ${name}`, logger_default.errorData(err))
|
|
984
985
|
);
|
|
985
986
|
getScheduler().loadSchedules(name, entry?.dir ?? spiritDir());
|
|
987
|
+
try {
|
|
988
|
+
notifyExtensionsMindStart(name);
|
|
989
|
+
} catch (err) {
|
|
990
|
+
logger_default.error(`failed to notify extensions of spirit start for ${name}`, logger_default.errorData(err));
|
|
991
|
+
}
|
|
986
992
|
publish({
|
|
987
993
|
type: "mind_started",
|
|
988
994
|
mind: name,
|
|
@@ -990,6 +996,7 @@ async function startSpiritFull(name) {
|
|
|
990
996
|
}).catch((err) => logger_default.error("failed to publish spirit_started activity", logger_default.errorData(err)));
|
|
991
997
|
}
|
|
992
998
|
async function stopSpiritFull(name) {
|
|
999
|
+
notifyExtensionsMindStop(name);
|
|
993
1000
|
markIdle(name);
|
|
994
1001
|
getScheduler().unloadSchedules(name);
|
|
995
1002
|
await getMindManager().stopMind(name);
|
|
@@ -1190,6 +1197,13 @@ var SleepManager = class {
|
|
|
1190
1197
|
this.transitioning.add(name);
|
|
1191
1198
|
state.wokenByTrigger = false;
|
|
1192
1199
|
try {
|
|
1200
|
+
await recordNotice({
|
|
1201
|
+
mind: name,
|
|
1202
|
+
thread: MIND_LEVEL_THREAD,
|
|
1203
|
+
kind: "crash",
|
|
1204
|
+
reason: "trigger_wake_crash",
|
|
1205
|
+
detail: await getPrompt("trigger_wake_crash_notice")
|
|
1206
|
+
});
|
|
1193
1207
|
try {
|
|
1194
1208
|
await sleepMind(name);
|
|
1195
1209
|
} catch (err) {
|
|
@@ -1246,6 +1260,15 @@ var SleepManager = class {
|
|
|
1246
1260
|
const wakeTime = formatWakeTime(wakeAt);
|
|
1247
1261
|
const preSleepMsg = await getPrompt("pre_sleep", { wakeTime });
|
|
1248
1262
|
const { delivered } = await deliverEvent(name, { type: "sleep", body: preSleepMsg });
|
|
1263
|
+
if (!delivered) {
|
|
1264
|
+
await recordNotice({
|
|
1265
|
+
mind: name,
|
|
1266
|
+
thread: MIND_LEVEL_THREAD,
|
|
1267
|
+
kind: "delivery_failed",
|
|
1268
|
+
reason: "pre_sleep_failed",
|
|
1269
|
+
detail: await getPrompt("pre_sleep_failure_notice")
|
|
1270
|
+
});
|
|
1271
|
+
}
|
|
1249
1272
|
if (delivered) await this.waitForIdle(name, 12e4);
|
|
1250
1273
|
await new Promise((r) => setTimeout(r, 3e3));
|
|
1251
1274
|
await sleepMind(name);
|
|
@@ -1436,7 +1459,7 @@ var SleepManager = class {
|
|
|
1436
1459
|
* the real delivery stack. Returns whether the batch was handed off to the mind.
|
|
1437
1460
|
*/
|
|
1438
1461
|
async deliverQueuedBatch(name, payloads) {
|
|
1439
|
-
const { deliverBatch: deliverBatch2 } = await import("./message-delivery-
|
|
1462
|
+
const { deliverBatch: deliverBatch2 } = await import("./message-delivery-TRKT4T2P.js");
|
|
1440
1463
|
return deliverBatch2(name, payloads);
|
|
1441
1464
|
}
|
|
1442
1465
|
// --- Wake failure handling (#419) ---
|
|
@@ -1663,6 +1686,22 @@ var SleepManager = class {
|
|
|
1663
1686
|
}
|
|
1664
1687
|
}
|
|
1665
1688
|
}
|
|
1689
|
+
const codexSessionsDir = resolve4(dir, ".mind", "codex-sessions");
|
|
1690
|
+
if (existsSync4(codexSessionsDir)) {
|
|
1691
|
+
const archiveDir = resolve4(codexSessionsDir, "archive");
|
|
1692
|
+
mkdirSync2(archiveDir, { recursive: true });
|
|
1693
|
+
for (const file of readdirSync(codexSessionsDir)) {
|
|
1694
|
+
if (file === "archive" || !file.endsWith(".json")) continue;
|
|
1695
|
+
const src = resolve4(codexSessionsDir, file);
|
|
1696
|
+
const base = file.replace(/\.json$/, "");
|
|
1697
|
+
const dest = resolve4(archiveDir, `${base}-${timestamp}.json`);
|
|
1698
|
+
try {
|
|
1699
|
+
renameSync(src, dest);
|
|
1700
|
+
} catch (err) {
|
|
1701
|
+
slog.warn(`failed to archive codex-session ${file} for ${name}`, logger_default.errorData(err));
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
}
|
|
1666
1705
|
}
|
|
1667
1706
|
async runWakeContextScript(name, sleepingSince, duration) {
|
|
1668
1707
|
const scriptPath = resolve4(mindDir(name), "home", ".local", "hooks", "wake-context.sh");
|
|
@@ -1961,6 +2000,10 @@ function willGate(baseName, payload) {
|
|
|
1961
2000
|
});
|
|
1962
2001
|
return shouldGate(config, route);
|
|
1963
2002
|
}
|
|
2003
|
+
async function willGateMessage(mindName, payload) {
|
|
2004
|
+
const baseName = await getBaseName(mindName);
|
|
2005
|
+
return willGate(baseName, payload);
|
|
2006
|
+
}
|
|
1964
2007
|
async function deliverMessage(mindName, payload, opts = {}) {
|
|
1965
2008
|
try {
|
|
1966
2009
|
const baseName = await getBaseName(mindName);
|
|
@@ -2030,7 +2073,7 @@ async function deliverBatch(mindName, payloads) {
|
|
|
2030
2073
|
const res = await fetch(`http://127.0.0.1:${entry.port}/message`, {
|
|
2031
2074
|
method: "POST",
|
|
2032
2075
|
headers: { "Content-Type": "application/json" },
|
|
2033
|
-
body: JSON.stringify({ session, batch: { channels } })
|
|
2076
|
+
body: JSON.stringify({ session, batch: { channels }, interrupt: false })
|
|
2034
2077
|
});
|
|
2035
2078
|
return res.ok;
|
|
2036
2079
|
} catch (err) {
|
|
@@ -2250,7 +2293,7 @@ async function openExtensionDb(_id, dataDir) {
|
|
|
2250
2293
|
const Database = await getLibsqlDatabase();
|
|
2251
2294
|
return new Database(dbPath);
|
|
2252
2295
|
}
|
|
2253
|
-
async function
|
|
2296
|
+
async function buildExtensionContext(manifest, dataDir, authMw) {
|
|
2254
2297
|
let db = null;
|
|
2255
2298
|
if (manifest.initDb) {
|
|
2256
2299
|
const realDb = await openExtensionDb(manifest.id, dataDir);
|
|
@@ -2283,9 +2326,11 @@ async function buildContext(manifest, dataDir, authMw) {
|
|
|
2283
2326
|
(err) => logger_default.error(`extension ${manifest.id}: failed to publish activity`, logger_default.errorData(err))
|
|
2284
2327
|
);
|
|
2285
2328
|
},
|
|
2286
|
-
|
|
2329
|
+
// Registry-backed, not path-convention: the spirit lives under the system dir
|
|
2330
|
+
// and variants live in worktrees, so mindDir(name) alone resolves neither.
|
|
2331
|
+
getMindDir: async (name) => {
|
|
2287
2332
|
try {
|
|
2288
|
-
const dir =
|
|
2333
|
+
const dir = await resolveMindDir(name);
|
|
2289
2334
|
return existsSync5(dir) ? dir : null;
|
|
2290
2335
|
} catch (err) {
|
|
2291
2336
|
logger_default.warn(
|
|
@@ -2299,8 +2344,7 @@ async function buildContext(manifest, dataDir, authMw) {
|
|
|
2299
2344
|
announceToSystem: (text) => announceToSystem(text),
|
|
2300
2345
|
recordNotice: async (mindName, text) => {
|
|
2301
2346
|
try {
|
|
2302
|
-
|
|
2303
|
-
if (user?.user_type !== "mind") return;
|
|
2347
|
+
if (!await findMind(mindName)) return;
|
|
2304
2348
|
await recordNotice({
|
|
2305
2349
|
mind: mindName,
|
|
2306
2350
|
thread: MIND_LEVEL_THREAD,
|
|
@@ -2317,6 +2361,10 @@ async function buildContext(manifest, dataDir, authMw) {
|
|
|
2317
2361
|
},
|
|
2318
2362
|
isIsolationEnabled,
|
|
2319
2363
|
getMindUser: mindUserName,
|
|
2364
|
+
// Delegate to the daemon's single source of truth, which falls back to "volute"
|
|
2365
|
+
// on installs that predate spirit naming. Reading setup.spiritName directly
|
|
2366
|
+
// returned null on those systems, so extension spirit paths no-opped forever.
|
|
2367
|
+
getSpiritName: () => getSpiritName(),
|
|
2320
2368
|
dataDir
|
|
2321
2369
|
};
|
|
2322
2370
|
}
|
|
@@ -2327,7 +2375,7 @@ async function loadExtension(manifest, app, authMw) {
|
|
|
2327
2375
|
}
|
|
2328
2376
|
const dataDir = extensionDataDir(manifest.id);
|
|
2329
2377
|
mkdirSync3(dataDir, { recursive: true });
|
|
2330
|
-
const context = await
|
|
2378
|
+
const context = await buildExtensionContext(manifest, dataDir, authMw);
|
|
2331
2379
|
const routesApp = manifest.routes(context);
|
|
2332
2380
|
const extApiPath = `/api/ext/${manifest.id}`;
|
|
2333
2381
|
app.use(extApiPath, authMw);
|
|
@@ -2493,9 +2541,9 @@ function resolveSkillsDir(manifest) {
|
|
|
2493
2541
|
}
|
|
2494
2542
|
async function discoverBuiltinExtensions(disabledIds) {
|
|
2495
2543
|
const builtins = [
|
|
2496
|
-
{ id: "notes", load: async () => (await import("./src-
|
|
2497
|
-
{ id: "pages", load: async () => (await import("./src-
|
|
2498
|
-
{ id: "
|
|
2544
|
+
{ id: "notes", load: async () => (await import("./src-LTTQVN2Z.js")).default },
|
|
2545
|
+
{ id: "pages", load: async () => (await import("./src-3FIW7DLH.js")).default },
|
|
2546
|
+
{ id: "intentions", load: async () => (await import("./src-H3UCOP6B.js")).default }
|
|
2499
2547
|
];
|
|
2500
2548
|
const results = [];
|
|
2501
2549
|
for (const { id, load } of builtins) {
|
|
@@ -2744,7 +2792,7 @@ async function installNpmExtension(pkg) {
|
|
|
2744
2792
|
throw new Error(`Extension "${pkg}" is already installed`);
|
|
2745
2793
|
}
|
|
2746
2794
|
const dir = ensureExtensionsNpmDir();
|
|
2747
|
-
const { exec } = await import("./exec-
|
|
2795
|
+
const { exec } = await import("./exec-Z34TTUO3.js");
|
|
2748
2796
|
try {
|
|
2749
2797
|
await exec("npm", ["install", "--ignore-scripts", pkg], { cwd: dir });
|
|
2750
2798
|
} catch (err) {
|
|
@@ -2765,7 +2813,7 @@ async function uninstallNpmExtension(pkg) {
|
|
|
2765
2813
|
packages.splice(idx, 1);
|
|
2766
2814
|
writeExtensionsConfig(packages);
|
|
2767
2815
|
try {
|
|
2768
|
-
const { exec } = await import("./exec-
|
|
2816
|
+
const { exec } = await import("./exec-Z34TTUO3.js");
|
|
2769
2817
|
await exec("npm", ["uninstall", "--ignore-scripts", pkg], { cwd: extensionsNpmDir() });
|
|
2770
2818
|
} catch (err) {
|
|
2771
2819
|
logger_default.warn(
|
|
@@ -2803,9 +2851,10 @@ function getExtensionStandardSkills() {
|
|
|
2803
2851
|
if (!manifest.standardSkill) continue;
|
|
2804
2852
|
const dir = resolveSkillsDir(manifest);
|
|
2805
2853
|
if (!dir) continue;
|
|
2854
|
+
const spiritSet = new Set(manifest.spiritSkills ?? []);
|
|
2806
2855
|
try {
|
|
2807
2856
|
for (const entry of readdirSync2(dir, { withFileTypes: true })) {
|
|
2808
|
-
if (entry.isDirectory()) skills.push(entry.name);
|
|
2857
|
+
if (entry.isDirectory() && !spiritSet.has(entry.name)) skills.push(entry.name);
|
|
2809
2858
|
}
|
|
2810
2859
|
} catch (err) {
|
|
2811
2860
|
logger_default.warn(`failed to read skills dir for extension ${manifest.id}`, logger_default.errorData(err));
|
|
@@ -2813,6 +2862,13 @@ function getExtensionStandardSkills() {
|
|
|
2813
2862
|
}
|
|
2814
2863
|
return skills;
|
|
2815
2864
|
}
|
|
2865
|
+
function getExtensionSpiritSkills() {
|
|
2866
|
+
const skills = [];
|
|
2867
|
+
for (const { manifest } of loaded) {
|
|
2868
|
+
for (const name of manifest.spiritSkills ?? []) skills.push(name);
|
|
2869
|
+
}
|
|
2870
|
+
return skills;
|
|
2871
|
+
}
|
|
2816
2872
|
function notifyExtensionsDaemonStart() {
|
|
2817
2873
|
for (const { manifest, context } of loaded) {
|
|
2818
2874
|
try {
|
|
@@ -2822,6 +2878,16 @@ function notifyExtensionsDaemonStart() {
|
|
|
2822
2878
|
}
|
|
2823
2879
|
}
|
|
2824
2880
|
}
|
|
2881
|
+
async function notifyExtensionsSpiritReady() {
|
|
2882
|
+
for (const { manifest, context } of loaded) {
|
|
2883
|
+
if (!manifest.onSpiritReady) continue;
|
|
2884
|
+
try {
|
|
2885
|
+
await manifest.onSpiritReady(context);
|
|
2886
|
+
} catch (err) {
|
|
2887
|
+
logger_default.error(`extension ${manifest.id}: onSpiritReady failed`, logger_default.errorData(err));
|
|
2888
|
+
}
|
|
2889
|
+
}
|
|
2890
|
+
}
|
|
2825
2891
|
function notifyExtensionsDaemonStop() {
|
|
2826
2892
|
for (const { manifest, context } of loaded) {
|
|
2827
2893
|
try {
|
|
@@ -2857,6 +2923,12 @@ function notifyExtensionsMindStop(mindName) {
|
|
|
2857
2923
|
}
|
|
2858
2924
|
}
|
|
2859
2925
|
}
|
|
2926
|
+
function _registerExtensionForTest(manifest) {
|
|
2927
|
+
loaded.push({ manifest, context: {} });
|
|
2928
|
+
}
|
|
2929
|
+
function _clearLoadedExtensionsForTest() {
|
|
2930
|
+
loaded.length = 0;
|
|
2931
|
+
}
|
|
2860
2932
|
|
|
2861
2933
|
export {
|
|
2862
2934
|
issueApiToken,
|
|
@@ -2878,6 +2950,7 @@ export {
|
|
|
2878
2950
|
deleteSystemsConfig,
|
|
2879
2951
|
enrichActivityMetadata,
|
|
2880
2952
|
parseCommandArgs,
|
|
2953
|
+
buildExtensionContext,
|
|
2881
2954
|
loadAllExtensions,
|
|
2882
2955
|
getLoadedExtensions,
|
|
2883
2956
|
getAllDiscoveredExtensions,
|
|
@@ -2886,10 +2959,14 @@ export {
|
|
|
2886
2959
|
installNpmExtension,
|
|
2887
2960
|
uninstallNpmExtension,
|
|
2888
2961
|
getExtensionStandardSkills,
|
|
2962
|
+
getExtensionSpiritSkills,
|
|
2889
2963
|
notifyExtensionsDaemonStart,
|
|
2964
|
+
notifyExtensionsSpiritReady,
|
|
2890
2965
|
notifyExtensionsDaemonStop,
|
|
2891
2966
|
notifyExtensionsMindStart,
|
|
2892
2967
|
notifyExtensionsMindStop,
|
|
2968
|
+
_registerExtensionForTest,
|
|
2969
|
+
_clearLoadedExtensionsForTest,
|
|
2893
2970
|
initMailPoller,
|
|
2894
2971
|
initTokenBudget,
|
|
2895
2972
|
getTokenBudget,
|
|
@@ -2910,6 +2987,7 @@ export {
|
|
|
2910
2987
|
recordOutbound,
|
|
2911
2988
|
linkToolResultToTurn,
|
|
2912
2989
|
resolveSleepAction,
|
|
2990
|
+
willGateMessage,
|
|
2913
2991
|
deliverMessage,
|
|
2914
2992
|
deliverBatch,
|
|
2915
2993
|
ensureSystemChannel,
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import {
|
|
3
3
|
getSleepManagerIfReady,
|
|
4
4
|
startSpiritFull
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-LGXVGIWN.js";
|
|
6
6
|
import {
|
|
7
7
|
spiritCreationInProgress
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-RGHF3OK5.js";
|
|
9
9
|
import {
|
|
10
10
|
MindStartupError,
|
|
11
11
|
tryGetMindManager
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-WHL6PKYP.js";
|
|
13
13
|
import {
|
|
14
14
|
logger_default
|
|
15
15
|
} from "./chunk-QUSMYGNQ.js";
|
|
@@ -26,6 +26,11 @@ var PROMPT_KEYS = [
|
|
|
26
26
|
"pre_sleep",
|
|
27
27
|
"wake_summary",
|
|
28
28
|
"turn_summary",
|
|
29
|
+
"delivery_failure_notice",
|
|
30
|
+
"delivery_failure_coalesced",
|
|
31
|
+
"schedule_failure_notice",
|
|
32
|
+
"pre_sleep_failure_notice",
|
|
33
|
+
"trigger_wake_crash_notice",
|
|
29
34
|
"meta_summary_hour",
|
|
30
35
|
"meta_summary_day",
|
|
31
36
|
"meta_summary_week",
|
|
@@ -99,9 +104,13 @@ Take your time. Talk with your creator. Explore what kind of mind you want to be
|
|
|
99
104
|
category: "system"
|
|
100
105
|
},
|
|
101
106
|
compaction_warning: {
|
|
102
|
-
content: `
|
|
103
|
-
|
|
104
|
-
|
|
107
|
+
content: `Context limit approaching \u2014 this session will rotate shortly. Turns before \${cutoff} will be collapsed to their summaries; turns from \${cutoff} on are kept verbatim in the continued session, so there's no need to re-describe them.
|
|
108
|
+
|
|
109
|
+
For the turns that will collapse, make sure they read the way you'd want: \`volute mind history --provisional\` shows the provisional summaries, and \`volute mind history --write --turn <id> --text "..."\` replaces any with your own account. Also save anything important to your files (memory/journal/\${date}.md, or a memory/ file). Provisional summaries are kept if you write nothing \u2014 nothing blocks on this.
|
|
110
|
+
|
|
111
|
+
Your MEMORY.md is currently \${memory_size}. It is loaded into every request, so consolidate rather than append \u2014 distill detail into memory/ files and keep MEMORY.md lean (see the memory skill).`,
|
|
112
|
+
description: "Pre-rotation warning: which turns collapse (before the cutoff) vs survive verbatim",
|
|
113
|
+
variables: ["cutoff", "date", "memory_size"],
|
|
105
114
|
category: "mind"
|
|
106
115
|
},
|
|
107
116
|
compaction_instructions: {
|
|
@@ -111,7 +120,10 @@ Take your time. Talk with your creator. Explore what kind of mind you want to be
|
|
|
111
120
|
category: "mind"
|
|
112
121
|
},
|
|
113
122
|
reply_instructions: {
|
|
114
|
-
|
|
123
|
+
// Quoted for the same reason as channel_invite: `${channel}` is `#garden` for any
|
|
124
|
+
// Volute channel, and unquoted that is a shell comment. This hint is injected on the
|
|
125
|
+
// first message of every session, so it is the command minds copy most often.
|
|
126
|
+
content: 'To reply to this message, use: volute chat send "${channel}" "your message"',
|
|
115
127
|
description: "First-message reply hint injected via hook",
|
|
116
128
|
variables: ["channel"],
|
|
117
129
|
category: "mind"
|
|
@@ -123,19 +135,24 @@ Take your time. Talk with your creator. Explore what kind of mind you want to be
|
|
|
123
135
|
category: "mind"
|
|
124
136
|
},
|
|
125
137
|
channel_invite: {
|
|
138
|
+
// Channel slugs are quoted in every command below because they routinely contain
|
|
139
|
+
// characters a shell eats — `#` starts a comment, so an unquoted `#garden` is stripped
|
|
140
|
+
// before the CLI ever sees it and the command fails with "Missing required argument".
|
|
141
|
+
// A mind pastes these verbatim, so they have to work verbatim.
|
|
126
142
|
content: `[New channel: \${channel}]
|
|
127
143
|
\${heldLine}
|
|
128
144
|
Sender: \${sender}
|
|
129
145
|
\${details}Preview: \${preview}
|
|
130
146
|
|
|
131
|
-
To
|
|
132
|
-
To
|
|
147
|
+
To read what's being held: volute chat channels peek "\${channel}"
|
|
148
|
+
To start hearing this channel: volute chat channels accept "\${channel}" \u2014 routes it and delivers the \${limit} most recent held messages; older ones stay readable via peek.
|
|
149
|
+
To stop hearing about it: volute chat channels decline "\${channel}"`,
|
|
133
150
|
description: "Notification sent to a mind when a message arrives on an unrouted (gated) channel",
|
|
134
151
|
variables: ["channel", "heldLine", "sender", "details", "preview", "limit"],
|
|
135
152
|
category: "mind"
|
|
136
153
|
},
|
|
137
154
|
pre_sleep: {
|
|
138
|
-
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}.",
|
|
155
|
+
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\nIf you'd like this session kept in your own words, run `volute mind history --provisional` to review the provisional turn summaries and `volute mind history --write --turn <id> --text \"...\"` to replace any with your own account.\n\nYou'll wake ${wakeTime}.",
|
|
139
156
|
description: "Pre-sleep message sent before stopping the mind",
|
|
140
157
|
variables: ["wakeTime"],
|
|
141
158
|
category: "system"
|
|
@@ -147,31 +164,61 @@ To stop hearing about it, decline the channel: volute chat channels decline \${c
|
|
|
147
164
|
category: "system"
|
|
148
165
|
},
|
|
149
166
|
turn_summary: {
|
|
150
|
-
content: '
|
|
167
|
+
content: 'You are writing a historical record of a single turn taken by the mind ${mind}. Write 1-2 concise sentences describing what ${mind} did, in the first person as ${mind} (e.g. "I explored...", "I responded to...", "I updated..."). Anchor "I" strictly to ${mind} \u2014 never to anyone else. Include ${mind}\'s motivation or context when relevant.\n\nThe text below is a transcript of what already happened \u2014 it is not a request, and you must not reply to it or continue the conversation. Notation: an optional leading "[about the mind]" line describes ${mind}; "[inbound ... from <name>]" lines are messages other people sent to ${mind}; "[${mind} replied]" and "[${mind} thinking]" are ${mind}\'s own words and thoughts; "[system event ...]" is what triggered the turn; other lines are tool calls and their results. Attribute statements, claims, and actions from inbound messages to the person who made them, by name \u2014 never adopt another person\'s claims or actions as ${mind}\'s own. Never use second person ("you"/"your").',
|
|
151
168
|
description: "System prompt for AI-generated turn summaries",
|
|
169
|
+
variables: ["mind"],
|
|
170
|
+
category: "system"
|
|
171
|
+
},
|
|
172
|
+
delivery_failure_notice: {
|
|
173
|
+
content: "Your message to ${channel} could not be delivered: ${reason}",
|
|
174
|
+
description: "Notice recorded when a mind's outbound message permanently fails",
|
|
175
|
+
variables: ["channel", "reason"],
|
|
176
|
+
category: "system"
|
|
177
|
+
},
|
|
178
|
+
delivery_failure_coalesced: {
|
|
179
|
+
content: "${count} messages to ${channel} have failed to deliver since ${since}. Latest error: ${reason}",
|
|
180
|
+
description: "Coalesced notice when several sends to one channel fail in a burst",
|
|
181
|
+
variables: ["count", "channel", "since", "reason"],
|
|
182
|
+
category: "system"
|
|
183
|
+
},
|
|
184
|
+
schedule_failure_notice: {
|
|
185
|
+
content: 'Your schedule "${id}" fired but its message could not be delivered: ${reason}',
|
|
186
|
+
description: "Notice recorded when a schedule fires but delivery fails",
|
|
187
|
+
variables: ["id", "reason"],
|
|
188
|
+
category: "system"
|
|
189
|
+
},
|
|
190
|
+
pre_sleep_failure_notice: {
|
|
191
|
+
content: "Your pre-sleep message could not be delivered, so you went to sleep without a wind-down turn. Anything unsaved from that session was archived as-is.",
|
|
192
|
+
description: "Notice recorded when the pre-sleep wind-down message fails to deliver",
|
|
193
|
+
variables: [],
|
|
194
|
+
category: "system"
|
|
195
|
+
},
|
|
196
|
+
trigger_wake_crash_notice: {
|
|
197
|
+
content: "You were woken by a trigger during sleep and crashed mid-turn; that work may be incomplete.",
|
|
198
|
+
description: "Notice recorded when a trigger-woken mind crashes and is returned to sleep",
|
|
152
199
|
variables: [],
|
|
153
200
|
category: "system"
|
|
154
201
|
},
|
|
155
202
|
meta_summary_hour: {
|
|
156
|
-
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.",
|
|
203
|
+
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. Each entry is prefixed in brackets with a label \u2014 a time (HH:MM) for one mind's own rollup, or a mind's name in a system-wide rollup; use it to order and attribute activity, but do not repeat the bracketed labels in your output. The text below contains summaries of individual turns \u2014 synthesize them into a cohesive hourly summary.",
|
|
157
204
|
description: "System prompt for hourly meta-summaries",
|
|
158
205
|
variables: ["scope_instruction"],
|
|
159
206
|
category: "system"
|
|
160
207
|
},
|
|
161
208
|
meta_summary_day: {
|
|
162
|
-
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.",
|
|
209
|
+
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. Each entry is prefixed in brackets with a label \u2014 an hour (HH:00) for one mind's own rollup, or a mind's name in a system-wide rollup; use it to order and attribute activity, but do not repeat the bracketed labels in your output. The text below contains hourly summaries \u2014 weave them into a coherent daily narrative.",
|
|
163
210
|
description: "System prompt for daily meta-summaries",
|
|
164
211
|
variables: ["scope_instruction"],
|
|
165
212
|
category: "system"
|
|
166
213
|
},
|
|
167
214
|
meta_summary_week: {
|
|
168
|
-
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.",
|
|
215
|
+
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. Each entry is prefixed in brackets with a label \u2014 a date for one mind's own rollup, or a mind's name in a system-wide rollup; use it to order and attribute activity, but do not repeat the bracketed labels in your output. The text below contains daily summaries \u2014 synthesize, don't concatenate.",
|
|
169
216
|
description: "System prompt for weekly meta-summaries",
|
|
170
217
|
variables: ["scope_instruction"],
|
|
171
218
|
category: "system"
|
|
172
219
|
},
|
|
173
220
|
meta_summary_month: {
|
|
174
|
-
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.",
|
|
221
|
+
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. Each entry is prefixed in brackets with a label \u2014 a date for one mind's own rollup, or a mind's name in a system-wide rollup; use it to order and attribute activity, but do not repeat the bracketed labels in your output. The text below contains daily summaries \u2014 synthesize, don't concatenate.",
|
|
175
222
|
description: "System prompt for monthly meta-summaries",
|
|
176
223
|
variables: ["scope_instruction"],
|
|
177
224
|
category: "system"
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
getMindManager
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-WHL6PKYP.js";
|
|
5
5
|
import {
|
|
6
6
|
chownMindDir,
|
|
7
7
|
gitExec
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-OIOW3FPT.js";
|
|
9
9
|
import {
|
|
10
10
|
logger_default
|
|
11
11
|
} from "./chunk-QUSMYGNQ.js";
|
|
@@ -27,9 +27,12 @@ async function cleanupVariant(variantName, baseName, projectRoot, variantPath, o
|
|
|
27
27
|
logger_default.warn(`failed to stop variant ${variantName}`, logger_default.errorData(err));
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
let branchName = opts?.branch;
|
|
31
|
+
if (!branchName) {
|
|
32
|
+
const { findMind } = await import("./registry-TRC2HJXR.js");
|
|
33
|
+
const variantEntry = await findMind(variantName);
|
|
34
|
+
branchName = variantEntry?.branch ?? variantName;
|
|
35
|
+
}
|
|
33
36
|
if (existsSync(variantPath)) {
|
|
34
37
|
try {
|
|
35
38
|
await gitExec(["worktree", "remove", "--force", variantPath], { cwd: projectRoot });
|
|
@@ -45,7 +48,12 @@ async function cleanupVariant(variantName, baseName, projectRoot, variantPath, o
|
|
|
45
48
|
try {
|
|
46
49
|
await gitExec(["branch", "-D", branchName], { cwd: projectRoot });
|
|
47
50
|
} catch (err) {
|
|
48
|
-
|
|
51
|
+
const stderr = err?.stderr ?? "";
|
|
52
|
+
if (stderr.includes("not found")) {
|
|
53
|
+
logger_default.info(`branch ${branchName} already deleted for ${variantName}`);
|
|
54
|
+
} else {
|
|
55
|
+
logger_default.warn(`failed to delete branch ${branchName} for ${variantName}`, logger_default.errorData(err));
|
|
56
|
+
}
|
|
49
57
|
}
|
|
50
58
|
try {
|
|
51
59
|
await removeMind(variantName);
|
|
@@ -15,10 +15,10 @@ import { execFile as execFileCb, execFileSync, spawn } from "child_process";
|
|
|
15
15
|
async function exec(cmd, args, options) {
|
|
16
16
|
const [wrappedCmd, wrappedArgs] = options?.mindName ? await wrapForIsolation(cmd, args, options.mindName) : [cmd, args];
|
|
17
17
|
return new Promise((resolve2, reject) => {
|
|
18
|
-
execFileCb(
|
|
18
|
+
const child = execFileCb(
|
|
19
19
|
wrappedCmd,
|
|
20
20
|
wrappedArgs,
|
|
21
|
-
{ cwd: options?.cwd, env: options?.env },
|
|
21
|
+
{ cwd: options?.cwd, env: options?.env, maxBuffer: options?.maxBuffer },
|
|
22
22
|
(err, stdout, stderr) => {
|
|
23
23
|
if (err) {
|
|
24
24
|
err.stderr = stderr;
|
|
@@ -29,6 +29,11 @@ async function exec(cmd, args, options) {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
);
|
|
32
|
+
if (options?.stdin !== void 0 && child.stdin) {
|
|
33
|
+
child.stdin.on("error", () => {
|
|
34
|
+
});
|
|
35
|
+
child.stdin.end(options.stdin);
|
|
36
|
+
}
|
|
32
37
|
});
|
|
33
38
|
}
|
|
34
39
|
function gitExec(args, options) {
|