volute 0.46.0 → 0.47.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{activity-events-NF6VWTJQ.js → activity-events-MIOK3IOU.js} +3 -3
- package/dist/{ai-service-UODCCE4O.js → ai-service-CVZEYKTK.js} +4 -4
- package/dist/{archive-WS2L2VIQ.js → archive-6Z4GFQPH.js} +3 -3
- package/dist/{auth-CCFAU4GQ.js → auth-A4VGHADI.js} +4 -4
- package/dist/avatar-image-7S3WA77A.js +22 -0
- package/dist/{backup-TST5C2YN.js → backup-IIAFOW2L.js} +13 -13
- package/dist/channels-ITE4YC57.js +89 -0
- package/dist/{chat-ZIQQS25U.js → chat-AJLJCQ3M.js} +12 -8
- package/dist/{chunk-ZV7MFISX.js → chunk-2MJ7EOMT.js} +20 -2
- package/dist/{chunk-R77O2WMK.js → chunk-2OIYNHWO.js} +1 -1
- package/dist/{chunk-QCN24XEN.js → chunk-3YUBFTDN.js} +1 -1
- package/dist/{chunk-E3DA4HYV.js → chunk-4I72V3E5.js} +10 -10
- package/dist/{chunk-K6T43YBD.js → chunk-5IERLDUS.js} +3 -3
- package/dist/{chunk-FXORA5JG.js → chunk-5NN2VHJV.js} +3 -3
- package/dist/chunk-7KRIHYLR.js +124 -0
- package/dist/{chunk-RRNXJOKB.js → chunk-BGYHLR54.js} +2 -2
- package/dist/{chunk-QMJCNZ6C.js → chunk-C3KLHJDB.js} +1 -1
- package/dist/{chunk-TQJ6ZYVY.js → chunk-CBOIHNMR.js} +2 -2
- package/dist/{chunk-H2X54EHC.js → chunk-DGGZVZTM.js} +1 -1
- package/dist/{chunk-4JOQZPCE.js → chunk-EIQDZC43.js} +1 -1
- package/dist/{chunk-JO5IO4FH.js → chunk-F55GRIEK.js} +243 -121
- package/dist/{chunk-5ZQZDDIK.js → chunk-HPGN6XRT.js} +3 -3
- package/dist/{chunk-KGIXX4NM.js → chunk-IWJSNMSY.js} +5 -5
- package/dist/{chunk-ZDZISKCL.js → chunk-IYG4FBMP.js} +1 -1
- package/dist/{chunk-4YU7HF4L.js → chunk-JCMGDCGX.js} +4 -4
- package/dist/{chunk-PJ45FQPT.js → chunk-JSVHH32K.js} +6 -6
- package/dist/{chunk-YXSUMLTC.js → chunk-K23P5Q5N.js} +301 -77
- package/dist/{chunk-ZNMCCHCP.js → chunk-LTLFOSA4.js} +2 -2
- package/dist/{chunk-IHKGWTGT.js → chunk-LWDTP6DH.js} +1 -1
- package/dist/{chunk-JZ62SYWR.js → chunk-M3XDVS5Q.js} +1 -1
- package/dist/{chunk-BJZ4PV7R.js → chunk-M6TTZRGH.js} +9 -9
- package/dist/{chunk-KQSFTPIM.js → chunk-MTRMQFCQ.js} +1 -1
- package/dist/{chunk-OV7ZQ2GH.js → chunk-ODDGGLM6.js} +3 -3
- package/dist/{chunk-QLWG3C2Z.js → chunk-RRZ4RQQU.js} +2 -2
- package/dist/{chunk-CDPBTTZO.js → chunk-RUFLGTOT.js} +2 -2
- package/dist/{chunk-F7H6ATM4.js → chunk-SKNXMUIU.js} +1 -1
- package/dist/{chunk-RXEEYDIB.js → chunk-SZJCJVXV.js} +1 -1
- package/dist/{chunk-DRJ24GXK.js → chunk-VMCZBXF2.js} +52 -8
- package/dist/{chunk-ALKYQULU.js → chunk-WW6C3PLV.js} +1 -1
- package/dist/{chunk-A7WQZKOU.js → chunk-XHN6XBWV.js} +2 -2
- package/dist/{chunk-6EMWJZBK.js → chunk-YKA7DCVW.js} +1 -1
- package/dist/cli.js +21 -21
- package/dist/{clock-RHS2JEDL.js → clock-E6N5Y3YW.js} +3 -3
- package/dist/{cloud-sync-46RS4SDA.js → cloud-sync-LQTVDTQ3.js} +19 -18
- package/dist/{conversations-CJOOCGNW.js → conversations-C7IKYSHD.js} +4 -4
- package/dist/{create-IOV4GCRX.js → create-PQQXKTJK.js} +1 -1
- package/dist/{daemon-restart-VFEI57UO.js → daemon-restart-5F3YTLZK.js} +7 -7
- package/dist/daemon.js +217 -151
- package/dist/{db-MF2JNRUW.js → db-FO6LXYCW.js} +2 -2
- package/dist/delivery-manager-TN5KK2AP.js +34 -0
- package/dist/{delivery-router-N4A7ZC5T.js → delivery-router-3QFG2ZEX.js} +3 -3
- package/dist/{down-U2CZ23M4.js → down-ZI4S6265.js} +5 -5
- package/dist/echo-text-SEQCLGAT.js +34 -0
- package/dist/{exec-G3ZRST4Z.js → exec-QIFYZG4C.js} +3 -3
- package/dist/{export-LY723I3Z.js → export-4GVGNW54.js} +3 -3
- package/dist/{extensions-ZELQLTSR.js → extensions-PIMIQ7J3.js} +21 -18
- package/dist/{files-4LN3EN7Q.js → files-FEFZKMNM.js} +6 -6
- package/dist/{import-42YNQBF4.js → import-7MO3YTRE.js} +6 -6
- package/dist/{isolation-YMGZZ4E5.js → isolation-MCT4ZYLT.js} +3 -3
- package/dist/{login-M6OJUPQ2.js → login-OF4WXDAN.js} +5 -5
- package/dist/{logout-WQBWO77G.js → logout-ERE2BGA3.js} +5 -5
- package/dist/message-delivery-ZE3YGJDD.js +38 -0
- package/dist/{mind-LHKS55DI.js → mind-POOHFZHP.js} +13 -13
- package/dist/{mind-activity-tracker-3QRNJVR4.js → mind-activity-tracker-YVZPC4A5.js} +4 -4
- package/dist/{mind-list-4D7J4CHD.js → mind-list-KEGRGQEQ.js} +5 -4
- package/dist/mind-service-JFY7UG5E.js +40 -0
- package/dist/{mind-sleep-74TGOQBC.js → mind-sleep-IN3WPA76.js} +5 -5
- package/dist/{mind-status-UO34ASXZ.js → mind-status-SMUWJKGV.js} +20 -3
- package/dist/{package-DOD6CPO6.js → package-WPEE2HVJ.js} +2 -2
- package/dist/{registry-OUZBZ3Q4.js → registry-UMMDRPRM.js} +2 -2
- package/dist/{sandbox-ZJ7QA6Z6.js → sandbox-G4X4K3UN.js} +4 -4
- package/dist/scheduler-HQSDYJFY.js +32 -0
- package/dist/{schema-PVNG3PQM.js → schema-VEVO7HG6.js} +3 -1
- package/dist/{seed-CNYIHPOH.js → seed-VANPU43L.js} +1 -1
- package/dist/{seed-cmd-AVNUNLZV.js → seed-cmd-SYVDZKM4.js} +2 -2
- package/dist/{seed-create-ANXGYSCC.js → seed-create-3FGZPS6C.js} +3 -3
- package/dist/{seed-sprout-NIUFTX32.js → seed-sprout-H7QLFPFM.js} +12 -12
- package/dist/{send-SPE6DVNJ.js → send-HYDFGC6G.js} +7 -7
- package/dist/{service-UOCLXDWR.js → service-SYJ5G6LP.js} +4 -4
- package/dist/{service-install-4HHFDDWY.js → service-install-FQ43Z4DF.js} +5 -5
- package/dist/{setup-Y2EJI3GG.js → setup-KFYVWTXG.js} +3 -3
- package/dist/{setup-QT2A25SY.js → setup-QJHGMGSN.js} +7 -7
- package/dist/{skills-AKCFA7BN.js → skills-L2CMTW7A.js} +5 -5
- package/dist/sleep-manager-3NA7ZJP3.js +36 -0
- package/dist/{spirit-RPBLLUQ5.js → spirit-WXN4IDBF.js} +8 -8
- package/dist/{sprout-SMX42ZBP.js → sprout-LTL5P36T.js} +1 -1
- package/dist/{status-SWRVGXBI.js → status-V4RJMHJ4.js} +19 -9
- package/dist/system-chat-N2F7HVY3.js +38 -0
- package/dist/{systems-VNB5WKSS.js → systems-B5YJKMW4.js} +6 -6
- package/dist/{tailscale-3XOKOW7T.js → tailscale-MCLY5GYE.js} +2 -2
- package/dist/{template-hash-446HHH5V.js → template-hash-GSOUARW4.js} +2 -2
- package/dist/template-staleness-EMQORSGG.js +15 -0
- package/dist/{turn-tracker-FOIBNUUA.js → turn-tracker-JZRZDFWV.js} +6 -6
- package/dist/{up-PS6PFS75.js → up-J2PBPOZL.js} +6 -6
- package/dist/{update-SWAYZRWJ.js → update-ACV4SAY3.js} +5 -5
- package/dist/{update-check-PQ2MZ47K.js → update-check-266R4ZSY.js} +3 -3
- package/dist/{version-notify-C5CH7CVP.js → version-notify-XRGTEEDK.js} +37 -23
- package/dist/web-assets/assets/index-DtctoDXY.css +1 -0
- package/dist/web-assets/assets/index-Wpyb2CML.js +86 -0
- package/dist/web-assets/index.html +2 -2
- package/drizzle/0011_drop_turn_summary_event_id.sql +3 -0
- package/drizzle/0012_channel_gates.sql +17 -0
- package/drizzle/meta/_journal.json +14 -0
- package/package.json +2 -2
- package/templates/_base/src/lib/startup.ts +43 -2
- package/templates/claude/src/agent.ts +28 -2
- package/templates/claude/src/lib/session-reaper.ts +32 -0
- package/templates/claude/src/server.ts +10 -1
- package/dist/avatar-image-6KY6UU4D.js +0 -16
- package/dist/delivery-manager-JINZRG2W.js +0 -33
- package/dist/echo-text-VQPB5L2X.js +0 -33
- package/dist/message-delivery-R7JSQGYX.js +0 -37
- package/dist/mind-service-NB2JMWQZ.js +0 -39
- package/dist/scheduler-WVKII3LA.js +0 -31
- package/dist/sleep-manager-G6TXSDP7.js +0 -35
- package/dist/system-chat-NDAW6YP7.js +0 -37
- package/dist/web-assets/assets/index-B1JBQv2m.css +0 -1
- package/dist/web-assets/assets/index-CU6XWICM.js +0 -86
- package/dist/{accept-N5XULCXK.js → accept-YAFP5JFJ.js} +3 -3
- package/dist/{bridge-2PO3AI5D.js → bridge-TIZGSXOD.js} +3 -3
- package/dist/{create-DF3KISTW.js → create-A7PDHIIL.js} +3 -3
- package/dist/{env-VZ4MLFQW.js → env-HRL2PWAT.js} +5 -5
- package/dist/{extension-SEID47SR.js → extension-QBY4C44L.js} +3 -3
- package/dist/{list-OXIAY3W7.js → list-LQO2DCIK.js} +3 -3
- package/dist/{login-MY6ETFYB.js → login-6TLMI2TQ.js} +3 -3
- package/dist/{logout-NCG3TMDL.js → logout-BK53HXNY.js} +3 -3
- package/dist/{mind-history-VRO5A76U.js → mind-history-47DN6ILW.js} +4 -4
- package/dist/{mind-wake-LCLGTXA2.js → mind-wake-R54BPESY.js} +3 -3
- package/dist/{read-QVAXMTPV.js → read-PWAJOQIQ.js} +3 -3
- package/dist/{register-Y2H4PY5R.js → register-7SZJFHU6.js} +3 -3
- package/dist/{reject-EV35X64Y.js → reject-6VH7N2A4.js} +3 -3
- package/dist/{restart-FJQ662XJ.js → restart-H5WJDMA7.js} +4 -4
- package/dist/{skill-FKFHIJRR.js → skill-GUKG2YVH.js} +5 -5
- package/dist/{start-5JE3TV66.js → start-X46I3GXB.js} +4 -4
- package/dist/{stop-AAMTG3TU.js → stop-HJQV4YSM.js} +4 -4
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Averia+Serif+Libre:wght@300;400;700&family=Fira+Code:wght@300;400;500;600&family=Averia+Sans+Libre:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-Wpyb2CML.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DtctoDXY.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="root"></div>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- Per-(mind, channel) gate state so a mind can explicitly decline an unrouted
|
|
2
|
+
-- channel. Absence of a row means "pending" (undecided); the only stored state
|
|
3
|
+
-- is "declined". Declined channels are never released and never re-notify.
|
|
4
|
+
CREATE TABLE `channel_gates` (
|
|
5
|
+
`mind` text NOT NULL,
|
|
6
|
+
`channel` text NOT NULL,
|
|
7
|
+
`state` text NOT NULL,
|
|
8
|
+
`updated_at` text DEFAULT (datetime('now')) NOT NULL,
|
|
9
|
+
PRIMARY KEY(`mind`, `channel`)
|
|
10
|
+
);
|
|
11
|
+
--> statement-breakpoint
|
|
12
|
+
-- Backfill: archive stale gated rows so the first routes.json edit on an existing
|
|
13
|
+
-- mind with a months-old backlog can't release hundreds of messages at once. The
|
|
14
|
+
-- bounded release only ever promotes the newest N per channel anyway; anything
|
|
15
|
+
-- older than a week is treated as history and made inert here.
|
|
16
|
+
UPDATE `delivery_queue` SET `status` = 'archived'
|
|
17
|
+
WHERE `status` = 'gated' AND `created_at` < datetime('now', '-7 days');
|
|
@@ -78,6 +78,20 @@
|
|
|
78
78
|
"when": 1775500000000,
|
|
79
79
|
"tag": "0010_delivery_queue_redrive",
|
|
80
80
|
"breakpoints": true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"idx": 11,
|
|
84
|
+
"version": "6",
|
|
85
|
+
"when": 1775600000000,
|
|
86
|
+
"tag": "0011_drop_turn_summary_event_id",
|
|
87
|
+
"breakpoints": true
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"idx": 12,
|
|
91
|
+
"version": "6",
|
|
92
|
+
"when": 1775700000000,
|
|
93
|
+
"tag": "0012_channel_gates",
|
|
94
|
+
"breakpoints": true
|
|
81
95
|
}
|
|
82
96
|
]
|
|
83
97
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "volute",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.47.0",
|
|
4
4
|
"description": "CLI for creating and managing self-modifying AI minds powered by the Claude Agent SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -79,6 +79,7 @@
|
|
|
79
79
|
"isomorphic-dompurify": "^2.36.0",
|
|
80
80
|
"libsql": "^0.5.29",
|
|
81
81
|
"replicate": "^1.4.0",
|
|
82
|
+
"sharp": "^0.35.2",
|
|
82
83
|
"telegraf": "^4.16.3",
|
|
83
84
|
"undici": "^6.24.1",
|
|
84
85
|
"zod": "^4.4.3"
|
|
@@ -94,7 +95,6 @@
|
|
|
94
95
|
"drizzle-kit": "^0.31.10",
|
|
95
96
|
"lefthook": "^2.1.9",
|
|
96
97
|
"marked": "^18.0.5",
|
|
97
|
-
"sharp": "^0.35.2",
|
|
98
98
|
"svelte": "^5.56.3",
|
|
99
99
|
"svelte-check": "4.7.1",
|
|
100
100
|
"tsup": "^8.5.1",
|
|
@@ -179,9 +179,50 @@ export function loadPrompts(): MindPrompts {
|
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
181
|
|
|
182
|
-
|
|
183
|
-
|
|
182
|
+
/**
|
|
183
|
+
* Run the optional teardown before exit, bounded by a timeout so a wedged child
|
|
184
|
+
* (e.g. an SDK subprocess that won't exit) can't block shutdown forever. Teardown
|
|
185
|
+
* errors are logged, never thrown, so a failing hook still lets the process exit.
|
|
186
|
+
*/
|
|
187
|
+
export async function runShutdown(
|
|
188
|
+
onShutdown: (() => Promise<void>) | undefined,
|
|
189
|
+
timeoutMs: number,
|
|
190
|
+
): Promise<void> {
|
|
191
|
+
if (!onShutdown) return;
|
|
192
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
193
|
+
const timeout = new Promise<void>((resolve) => {
|
|
194
|
+
timer = setTimeout(() => {
|
|
195
|
+
log("server", `shutdown teardown timed out after ${timeoutMs}ms — exiting anyway`);
|
|
196
|
+
resolve();
|
|
197
|
+
}, timeoutMs);
|
|
198
|
+
});
|
|
199
|
+
try {
|
|
200
|
+
await Promise.race([
|
|
201
|
+
// Normalize a synchronous throw into the logged/swallowed path so it can't
|
|
202
|
+
// escape runShutdown and prevent the caller's process.exit.
|
|
203
|
+
Promise.resolve()
|
|
204
|
+
.then(() => onShutdown())
|
|
205
|
+
.catch((err) => log("server", "shutdown teardown failed:", err)),
|
|
206
|
+
timeout,
|
|
207
|
+
]);
|
|
208
|
+
} finally {
|
|
209
|
+
if (timer) clearTimeout(timer);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Wire SIGINT/SIGTERM to a graceful shutdown. Without `onShutdown` this exits
|
|
215
|
+
* immediately (as before); pass a teardown to reap live SDK subprocesses before
|
|
216
|
+
* exit so they aren't orphaned to PID 1 as `<defunct>` zombies. The handler is
|
|
217
|
+
* idempotent so a second signal during teardown doesn't double-run it.
|
|
218
|
+
*/
|
|
219
|
+
export function setupShutdown(onShutdown?: () => Promise<void>, timeoutMs = 10_000): void {
|
|
220
|
+
let shuttingDown = false;
|
|
221
|
+
async function shutdown() {
|
|
222
|
+
if (shuttingDown) return;
|
|
223
|
+
shuttingDown = true;
|
|
184
224
|
log("server", "shutdown signal received");
|
|
225
|
+
await runShutdown(onShutdown, timeoutMs);
|
|
185
226
|
process.exit(0);
|
|
186
227
|
}
|
|
187
228
|
process.on("SIGINT", shutdown);
|
|
@@ -22,7 +22,11 @@ import { createPreCompactHook } from "./lib/hooks/pre-compact.js";
|
|
|
22
22
|
import { createReplyInstructionsHook } from "./lib/hooks/reply-instructions.js";
|
|
23
23
|
import { log } from "./lib/logger.js";
|
|
24
24
|
import { createMessageChannel } from "./lib/message-channel.js";
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
isSessionReapable,
|
|
27
|
+
reapSessionQuery,
|
|
28
|
+
reapSessionsForShutdown,
|
|
29
|
+
} from "./lib/session-reaper.js";
|
|
26
30
|
import { createSessionStore } from "./lib/session-store.js";
|
|
27
31
|
import { loadPrompts, type SubagentConfig } from "./lib/startup.js";
|
|
28
32
|
import { consumeStream } from "./lib/stream-consumer.js";
|
|
@@ -69,6 +73,7 @@ export function createMind(options: {
|
|
|
69
73
|
waitForCommits: () => Promise<void>;
|
|
70
74
|
getContextInfo: () => Promise<ContextInfo>;
|
|
71
75
|
getContextMessages: () => Promise<ContextMessages>;
|
|
76
|
+
reapAllSessions: () => Promise<void>;
|
|
72
77
|
} {
|
|
73
78
|
const autoCommit = createAutoCommitHook(options.cwd);
|
|
74
79
|
const identityReload = createIdentityReloadHook(options.cwd);
|
|
@@ -569,6 +574,21 @@ export function createMind(options: {
|
|
|
569
574
|
}
|
|
570
575
|
}
|
|
571
576
|
|
|
577
|
+
/**
|
|
578
|
+
* Reap every live session's SDK subprocess on shutdown so `mind stop`/restart
|
|
579
|
+
* don't orphan `<defunct>` claude children to PID 1. Delegates the teardown to
|
|
580
|
+
* reapSessionsForShutdown; bounded externally by setupShutdown's timeout.
|
|
581
|
+
*/
|
|
582
|
+
async function reapAllSessions(): Promise<void> {
|
|
583
|
+
const live = [...sessions.values()];
|
|
584
|
+
if (live.length === 0) return;
|
|
585
|
+
log("mind", `shutdown: reaping ${live.length} live SDK subprocess(es)`);
|
|
586
|
+
for (const s of live) sessions.delete(s.name);
|
|
587
|
+
await reapSessionsForShutdown(live, (name, err) =>
|
|
588
|
+
log("mind", `session "${name}": shutdown reap failed:`, err),
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
|
|
572
592
|
if (idleTimeoutMs > 0) {
|
|
573
593
|
log("mind", `idle session reaper: ${idleTimeoutMs / 60_000} min timeout`);
|
|
574
594
|
const checkMs = Math.min(60_000, idleTimeoutMs);
|
|
@@ -746,5 +766,11 @@ export function createMind(options: {
|
|
|
746
766
|
// instead of waiting for the first message (which adds minutes of latency).
|
|
747
767
|
getOrCreateSession("main");
|
|
748
768
|
|
|
749
|
-
return {
|
|
769
|
+
return {
|
|
770
|
+
resolve,
|
|
771
|
+
waitForCommits: autoCommit.waitForCommits,
|
|
772
|
+
getContextInfo,
|
|
773
|
+
getContextMessages,
|
|
774
|
+
reapAllSessions,
|
|
775
|
+
};
|
|
750
776
|
}
|
|
@@ -66,3 +66,35 @@ export async function reapSessionQuery(
|
|
|
66
66
|
onError(err);
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
+
|
|
70
|
+
/** Minimal view of a live session needed to tear it down on shutdown. */
|
|
71
|
+
export interface ShutdownReapable {
|
|
72
|
+
name: string;
|
|
73
|
+
/** Input iterable — closing it unwinds the stream consumer. */
|
|
74
|
+
channel: { close(): void };
|
|
75
|
+
/** The session's live SDK query, if it has one. */
|
|
76
|
+
currentQuery?: ReapableQuery;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Reap every live session's SDK subprocess on shutdown (SIGTERM/SIGINT).
|
|
81
|
+
*
|
|
82
|
+
* Unlike the idle reaper this ignores idle/reapable state — on the way out we
|
|
83
|
+
* want *all* children gone. For each session it closes the input channel so the
|
|
84
|
+
* stream consumer unwinds, then awaits `query.return()` so the CLI subprocess
|
|
85
|
+
* exits and its status is reaped, rather than being orphaned to PID 1 (the
|
|
86
|
+
* daemon, which doesn't reap reparented children) as a `<defunct>` zombie.
|
|
87
|
+
* Reaps run in parallel; a per-session failure is reported via `onError` and
|
|
88
|
+
* never rejects the batch, so one wedged child can't block the others.
|
|
89
|
+
*/
|
|
90
|
+
export async function reapSessionsForShutdown(
|
|
91
|
+
sessions: Iterable<ShutdownReapable>,
|
|
92
|
+
onError: (name: string, err: unknown) => void,
|
|
93
|
+
): Promise<void> {
|
|
94
|
+
await Promise.all(
|
|
95
|
+
[...sessions].map(async (s) => {
|
|
96
|
+
s.channel.close();
|
|
97
|
+
await reapSessionQuery(s.currentQuery, (err) => onError(s.name, err));
|
|
98
|
+
}),
|
|
99
|
+
);
|
|
100
|
+
}
|
|
@@ -63,4 +63,13 @@ server.listen(port, () => {
|
|
|
63
63
|
log("server", `listening on :${actualPort}`);
|
|
64
64
|
});
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
// Reap live SDK subprocesses on SIGTERM/SIGINT so `mind stop`/restart don't
|
|
67
|
+
// orphan `<defunct>` claude children to PID 1 (the daemon, which isn't a
|
|
68
|
+
// reaping init). Bounded so a wedged child can't block shutdown forever.
|
|
69
|
+
// Stop accepting new messages first so a late request can't spawn a fresh
|
|
70
|
+
// subprocess after reapAllSessions has snapshotted the live set (which would
|
|
71
|
+
// re-orphan the very child we're reaping).
|
|
72
|
+
setupShutdown(async () => {
|
|
73
|
+
server.close();
|
|
74
|
+
await mind.reapAllSessions();
|
|
75
|
+
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
AVATAR_DIM,
|
|
4
|
-
migrateAvatarSizes,
|
|
5
|
-
normalizeAvatar
|
|
6
|
-
} from "./chunk-DRJ24GXK.js";
|
|
7
|
-
import "./chunk-PFZBNKUH.js";
|
|
8
|
-
import "./chunk-T2TP6ZC6.js";
|
|
9
|
-
import "./chunk-ALKYQULU.js";
|
|
10
|
-
import "./chunk-ZV7MFISX.js";
|
|
11
|
-
import "./chunk-K3NQKI34.js";
|
|
12
|
-
export {
|
|
13
|
-
AVATAR_DIM,
|
|
14
|
-
migrateAvatarSizes,
|
|
15
|
-
normalizeAvatar
|
|
16
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
DeliveryManager,
|
|
4
|
-
getDeliveryManager,
|
|
5
|
-
initDeliveryManager,
|
|
6
|
-
tryGetDeliveryManager
|
|
7
|
-
} from "./chunk-JO5IO4FH.js";
|
|
8
|
-
import "./chunk-ZDZISKCL.js";
|
|
9
|
-
import "./chunk-BJZ4PV7R.js";
|
|
10
|
-
import "./chunk-QLWG3C2Z.js";
|
|
11
|
-
import "./chunk-KGIXX4NM.js";
|
|
12
|
-
import "./chunk-5ZQZDDIK.js";
|
|
13
|
-
import "./chunk-PFZBNKUH.js";
|
|
14
|
-
import "./chunk-JZ62SYWR.js";
|
|
15
|
-
import "./chunk-KQSFTPIM.js";
|
|
16
|
-
import "./chunk-4JOQZPCE.js";
|
|
17
|
-
import "./chunk-YXSUMLTC.js";
|
|
18
|
-
import "./chunk-4YU7HF4L.js";
|
|
19
|
-
import "./chunk-H2X54EHC.js";
|
|
20
|
-
import "./chunk-IHKGWTGT.js";
|
|
21
|
-
import "./chunk-F7H6ATM4.js";
|
|
22
|
-
import "./chunk-OV7ZQ2GH.js";
|
|
23
|
-
import "./chunk-ZNMCCHCP.js";
|
|
24
|
-
import "./chunk-T2TP6ZC6.js";
|
|
25
|
-
import "./chunk-ALKYQULU.js";
|
|
26
|
-
import "./chunk-ZV7MFISX.js";
|
|
27
|
-
import "./chunk-K3NQKI34.js";
|
|
28
|
-
export {
|
|
29
|
-
DeliveryManager,
|
|
30
|
-
getDeliveryManager,
|
|
31
|
-
initDeliveryManager,
|
|
32
|
-
tryGetDeliveryManager
|
|
33
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
clearEchoTextCache,
|
|
4
|
-
echoTextToChannel
|
|
5
|
-
} from "./chunk-E3DA4HYV.js";
|
|
6
|
-
import "./chunk-RXEEYDIB.js";
|
|
7
|
-
import "./chunk-JO5IO4FH.js";
|
|
8
|
-
import "./chunk-ZDZISKCL.js";
|
|
9
|
-
import "./chunk-BJZ4PV7R.js";
|
|
10
|
-
import "./chunk-QLWG3C2Z.js";
|
|
11
|
-
import "./chunk-KGIXX4NM.js";
|
|
12
|
-
import "./chunk-5ZQZDDIK.js";
|
|
13
|
-
import "./chunk-PFZBNKUH.js";
|
|
14
|
-
import "./chunk-JZ62SYWR.js";
|
|
15
|
-
import "./chunk-KQSFTPIM.js";
|
|
16
|
-
import "./chunk-4JOQZPCE.js";
|
|
17
|
-
import "./chunk-YXSUMLTC.js";
|
|
18
|
-
import "./chunk-4YU7HF4L.js";
|
|
19
|
-
import "./chunk-TQJ6ZYVY.js";
|
|
20
|
-
import "./chunk-H2X54EHC.js";
|
|
21
|
-
import "./chunk-IHKGWTGT.js";
|
|
22
|
-
import "./chunk-F7H6ATM4.js";
|
|
23
|
-
import "./chunk-OV7ZQ2GH.js";
|
|
24
|
-
import "./chunk-ZNMCCHCP.js";
|
|
25
|
-
import "./chunk-T2TP6ZC6.js";
|
|
26
|
-
import "./chunk-LGNUFVMR.js";
|
|
27
|
-
import "./chunk-ALKYQULU.js";
|
|
28
|
-
import "./chunk-ZV7MFISX.js";
|
|
29
|
-
import "./chunk-K3NQKI34.js";
|
|
30
|
-
export {
|
|
31
|
-
clearEchoTextCache,
|
|
32
|
-
echoTextToChannel
|
|
33
|
-
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
deliverBatch,
|
|
4
|
-
deliverMessage,
|
|
5
|
-
linkToolResultToTurn,
|
|
6
|
-
recordInbound,
|
|
7
|
-
recordOutbound,
|
|
8
|
-
resolveSleepAction
|
|
9
|
-
} from "./chunk-JO5IO4FH.js";
|
|
10
|
-
import "./chunk-ZDZISKCL.js";
|
|
11
|
-
import "./chunk-BJZ4PV7R.js";
|
|
12
|
-
import "./chunk-QLWG3C2Z.js";
|
|
13
|
-
import "./chunk-KGIXX4NM.js";
|
|
14
|
-
import "./chunk-5ZQZDDIK.js";
|
|
15
|
-
import "./chunk-PFZBNKUH.js";
|
|
16
|
-
import "./chunk-JZ62SYWR.js";
|
|
17
|
-
import "./chunk-KQSFTPIM.js";
|
|
18
|
-
import "./chunk-4JOQZPCE.js";
|
|
19
|
-
import "./chunk-YXSUMLTC.js";
|
|
20
|
-
import "./chunk-4YU7HF4L.js";
|
|
21
|
-
import "./chunk-H2X54EHC.js";
|
|
22
|
-
import "./chunk-IHKGWTGT.js";
|
|
23
|
-
import "./chunk-F7H6ATM4.js";
|
|
24
|
-
import "./chunk-OV7ZQ2GH.js";
|
|
25
|
-
import "./chunk-ZNMCCHCP.js";
|
|
26
|
-
import "./chunk-T2TP6ZC6.js";
|
|
27
|
-
import "./chunk-ALKYQULU.js";
|
|
28
|
-
import "./chunk-ZV7MFISX.js";
|
|
29
|
-
import "./chunk-K3NQKI34.js";
|
|
30
|
-
export {
|
|
31
|
-
deliverBatch,
|
|
32
|
-
deliverMessage,
|
|
33
|
-
linkToolResultToTurn,
|
|
34
|
-
recordInbound,
|
|
35
|
-
recordOutbound,
|
|
36
|
-
resolveSleepAction
|
|
37
|
-
};
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
buildSeedOrientation,
|
|
4
|
-
sleepMind,
|
|
5
|
-
startMindFull,
|
|
6
|
-
startSpiritFull,
|
|
7
|
-
stopMindFull,
|
|
8
|
-
stopSpiritFull,
|
|
9
|
-
wakeMind
|
|
10
|
-
} from "./chunk-JO5IO4FH.js";
|
|
11
|
-
import "./chunk-ZDZISKCL.js";
|
|
12
|
-
import "./chunk-BJZ4PV7R.js";
|
|
13
|
-
import "./chunk-QLWG3C2Z.js";
|
|
14
|
-
import "./chunk-KGIXX4NM.js";
|
|
15
|
-
import "./chunk-5ZQZDDIK.js";
|
|
16
|
-
import "./chunk-PFZBNKUH.js";
|
|
17
|
-
import "./chunk-JZ62SYWR.js";
|
|
18
|
-
import "./chunk-KQSFTPIM.js";
|
|
19
|
-
import "./chunk-4JOQZPCE.js";
|
|
20
|
-
import "./chunk-YXSUMLTC.js";
|
|
21
|
-
import "./chunk-4YU7HF4L.js";
|
|
22
|
-
import "./chunk-H2X54EHC.js";
|
|
23
|
-
import "./chunk-IHKGWTGT.js";
|
|
24
|
-
import "./chunk-F7H6ATM4.js";
|
|
25
|
-
import "./chunk-OV7ZQ2GH.js";
|
|
26
|
-
import "./chunk-ZNMCCHCP.js";
|
|
27
|
-
import "./chunk-T2TP6ZC6.js";
|
|
28
|
-
import "./chunk-ALKYQULU.js";
|
|
29
|
-
import "./chunk-ZV7MFISX.js";
|
|
30
|
-
import "./chunk-K3NQKI34.js";
|
|
31
|
-
export {
|
|
32
|
-
buildSeedOrientation,
|
|
33
|
-
sleepMind,
|
|
34
|
-
startMindFull,
|
|
35
|
-
startSpiritFull,
|
|
36
|
-
stopMindFull,
|
|
37
|
-
stopSpiritFull,
|
|
38
|
-
wakeMind
|
|
39
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
Scheduler,
|
|
4
|
-
getScheduler,
|
|
5
|
-
initScheduler
|
|
6
|
-
} from "./chunk-JO5IO4FH.js";
|
|
7
|
-
import "./chunk-ZDZISKCL.js";
|
|
8
|
-
import "./chunk-BJZ4PV7R.js";
|
|
9
|
-
import "./chunk-QLWG3C2Z.js";
|
|
10
|
-
import "./chunk-KGIXX4NM.js";
|
|
11
|
-
import "./chunk-5ZQZDDIK.js";
|
|
12
|
-
import "./chunk-PFZBNKUH.js";
|
|
13
|
-
import "./chunk-JZ62SYWR.js";
|
|
14
|
-
import "./chunk-KQSFTPIM.js";
|
|
15
|
-
import "./chunk-4JOQZPCE.js";
|
|
16
|
-
import "./chunk-YXSUMLTC.js";
|
|
17
|
-
import "./chunk-4YU7HF4L.js";
|
|
18
|
-
import "./chunk-H2X54EHC.js";
|
|
19
|
-
import "./chunk-IHKGWTGT.js";
|
|
20
|
-
import "./chunk-F7H6ATM4.js";
|
|
21
|
-
import "./chunk-OV7ZQ2GH.js";
|
|
22
|
-
import "./chunk-ZNMCCHCP.js";
|
|
23
|
-
import "./chunk-T2TP6ZC6.js";
|
|
24
|
-
import "./chunk-ALKYQULU.js";
|
|
25
|
-
import "./chunk-ZV7MFISX.js";
|
|
26
|
-
import "./chunk-K3NQKI34.js";
|
|
27
|
-
export {
|
|
28
|
-
Scheduler,
|
|
29
|
-
getScheduler,
|
|
30
|
-
initScheduler
|
|
31
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
SleepManager,
|
|
4
|
-
getSleepManager,
|
|
5
|
-
getSleepManagerIfReady,
|
|
6
|
-
initSleepManager,
|
|
7
|
-
matchesGlob
|
|
8
|
-
} from "./chunk-JO5IO4FH.js";
|
|
9
|
-
import "./chunk-ZDZISKCL.js";
|
|
10
|
-
import "./chunk-BJZ4PV7R.js";
|
|
11
|
-
import "./chunk-QLWG3C2Z.js";
|
|
12
|
-
import "./chunk-KGIXX4NM.js";
|
|
13
|
-
import "./chunk-5ZQZDDIK.js";
|
|
14
|
-
import "./chunk-PFZBNKUH.js";
|
|
15
|
-
import "./chunk-JZ62SYWR.js";
|
|
16
|
-
import "./chunk-KQSFTPIM.js";
|
|
17
|
-
import "./chunk-4JOQZPCE.js";
|
|
18
|
-
import "./chunk-YXSUMLTC.js";
|
|
19
|
-
import "./chunk-4YU7HF4L.js";
|
|
20
|
-
import "./chunk-H2X54EHC.js";
|
|
21
|
-
import "./chunk-IHKGWTGT.js";
|
|
22
|
-
import "./chunk-F7H6ATM4.js";
|
|
23
|
-
import "./chunk-OV7ZQ2GH.js";
|
|
24
|
-
import "./chunk-ZNMCCHCP.js";
|
|
25
|
-
import "./chunk-T2TP6ZC6.js";
|
|
26
|
-
import "./chunk-ALKYQULU.js";
|
|
27
|
-
import "./chunk-ZV7MFISX.js";
|
|
28
|
-
import "./chunk-K3NQKI34.js";
|
|
29
|
-
export {
|
|
30
|
-
SleepManager,
|
|
31
|
-
getSleepManager,
|
|
32
|
-
getSleepManagerIfReady,
|
|
33
|
-
initSleepManager,
|
|
34
|
-
matchesGlob
|
|
35
|
-
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
ensureSystemDM,
|
|
4
|
-
generateSystemFallbackReply,
|
|
5
|
-
resetSystemDMCache,
|
|
6
|
-
sendSystemMessage,
|
|
7
|
-
sendSystemMessageDirect,
|
|
8
|
-
shouldGenerateSystemFallback
|
|
9
|
-
} from "./chunk-JO5IO4FH.js";
|
|
10
|
-
import "./chunk-ZDZISKCL.js";
|
|
11
|
-
import "./chunk-BJZ4PV7R.js";
|
|
12
|
-
import "./chunk-QLWG3C2Z.js";
|
|
13
|
-
import "./chunk-KGIXX4NM.js";
|
|
14
|
-
import "./chunk-5ZQZDDIK.js";
|
|
15
|
-
import "./chunk-PFZBNKUH.js";
|
|
16
|
-
import "./chunk-JZ62SYWR.js";
|
|
17
|
-
import "./chunk-KQSFTPIM.js";
|
|
18
|
-
import "./chunk-4JOQZPCE.js";
|
|
19
|
-
import "./chunk-YXSUMLTC.js";
|
|
20
|
-
import "./chunk-4YU7HF4L.js";
|
|
21
|
-
import "./chunk-H2X54EHC.js";
|
|
22
|
-
import "./chunk-IHKGWTGT.js";
|
|
23
|
-
import "./chunk-F7H6ATM4.js";
|
|
24
|
-
import "./chunk-OV7ZQ2GH.js";
|
|
25
|
-
import "./chunk-ZNMCCHCP.js";
|
|
26
|
-
import "./chunk-T2TP6ZC6.js";
|
|
27
|
-
import "./chunk-ALKYQULU.js";
|
|
28
|
-
import "./chunk-ZV7MFISX.js";
|
|
29
|
-
import "./chunk-K3NQKI34.js";
|
|
30
|
-
export {
|
|
31
|
-
ensureSystemDM,
|
|
32
|
-
generateSystemFallbackReply,
|
|
33
|
-
resetSystemDMCache,
|
|
34
|
-
sendSystemMessage,
|
|
35
|
-
sendSystemMessageDirect,
|
|
36
|
-
shouldGenerateSystemFallback
|
|
37
|
-
};
|