eklavya 1.24.1 → 1.24.2
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/cli.js +152 -48
- package/dist/cli.js.map +1 -1
- package/dist/hooks/memory-lib.js +3 -31
- package/dist/hooks/memory-lib.js.map +1 -1
- package/dist/memory/provider.js +102 -21
- package/dist/memory/provider.js.map +1 -1
- package/dist/memory/reservation.js +279 -24
- package/dist/memory/reservation.js.map +1 -1
- package/dist/memory/store.js +86 -0
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/worker.js +161 -7
- package/dist/memory/worker.js.map +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/tools/memory_read_tools.js +1 -1
- package/dist/tools/memory_read_tools.js.map +1 -1
- package/dist/user-skill/eklavya/SKILL.md +3 -1
- package/package.json +1 -1
package/dist/memory/provider.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import os from 'node:os';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { OBSERVER_ENV } from './reservation.js';
|
|
4
|
+
import { groupAlive, OBSERVER_ENV } from './reservation.js';
|
|
5
5
|
export class ProviderError extends Error {
|
|
6
6
|
errorClass;
|
|
7
7
|
constructor(errorClass, message) {
|
|
@@ -142,6 +142,37 @@ const NOT_THE_SUBSCRIPTION = [
|
|
|
142
142
|
'CLAUDE_CODE_USE_BEDROCK',
|
|
143
143
|
'CLAUDE_CODE_USE_VERTEX',
|
|
144
144
|
];
|
|
145
|
+
/**
|
|
146
|
+
* Waits for process group `pgid` to empty: SIGTERM to whatever is left, SIGKILL
|
|
147
|
+
* after `graceMs`, then a short wait for the kernel to finish the job. True once
|
|
148
|
+
* nothing in the group is alive.
|
|
149
|
+
*/
|
|
150
|
+
async function reapGroup(pgid, graceMs) {
|
|
151
|
+
if (process.platform === 'win32')
|
|
152
|
+
return true;
|
|
153
|
+
const settle = async (ms) => {
|
|
154
|
+
const deadline = Date.now() + ms;
|
|
155
|
+
while (groupAlive(pgid) && Date.now() < deadline)
|
|
156
|
+
await new Promise((r) => setTimeout(r, 25));
|
|
157
|
+
};
|
|
158
|
+
const signal = (sig) => {
|
|
159
|
+
try {
|
|
160
|
+
process.kill(-pgid, sig);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
/* Already gone. */
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
if (!groupAlive(pgid))
|
|
167
|
+
return true;
|
|
168
|
+
signal('SIGTERM');
|
|
169
|
+
await settle(graceMs);
|
|
170
|
+
if (groupAlive(pgid)) {
|
|
171
|
+
signal('SIGKILL');
|
|
172
|
+
await settle(2_000);
|
|
173
|
+
}
|
|
174
|
+
return !groupAlive(pgid);
|
|
175
|
+
}
|
|
145
176
|
/**
|
|
146
177
|
* Runs the configured Claude model through Claude Code (`claude -p`), on the
|
|
147
178
|
* developer's own subscription. Every variable that would route it elsewhere —
|
|
@@ -155,10 +186,17 @@ const NOT_THE_SUBSCRIPTION = [
|
|
|
155
186
|
* and 2.1.280 ran the hooks anyway; `--safe-mode` is a second ask, not a
|
|
156
187
|
* guarantee.
|
|
157
188
|
*
|
|
158
|
-
* The child leads its own process group,
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
189
|
+
* The child leads its own process group, and that group is reaped on **every**
|
|
190
|
+
* way out — success included, because `claude` exiting cleanly says nothing
|
|
191
|
+
* about what it started. A timeout, a cancel or an output overflow sends
|
|
192
|
+
* SIGTERM at once; whatever is left when the leader exits gets SIGTERM, then
|
|
193
|
+
* SIGKILL after `graceMs`. The promise settles only after that, and
|
|
194
|
+
* `onSpawn(null)` is called only when the group is confirmed empty — so a
|
|
195
|
+
* caller that keys its release on it never gives up its slot beside a live
|
|
196
|
+
* tree. If this process dies first, an exit handler SIGKILLs the group.
|
|
197
|
+
*
|
|
198
|
+
* `onSpawn` is the caller's code and may throw (it writes to a database). A
|
|
199
|
+
* throw cancels the call rather than escaping with the tree still running.
|
|
162
200
|
*/
|
|
163
201
|
export function runClaude(model, prompt, opts = {}) {
|
|
164
202
|
const env = { ...process.env, [OBSERVER_ENV]: '1' };
|
|
@@ -166,6 +204,7 @@ export function runClaude(model, prompt, opts = {}) {
|
|
|
166
204
|
delete env[name];
|
|
167
205
|
const timeoutMs = opts.timeoutMs ?? TIMEOUT_MS;
|
|
168
206
|
const graceMs = opts.graceMs ?? KILL_GRACE_MS;
|
|
207
|
+
const maxOutput = opts.maxOutput ?? MAX_STDOUT;
|
|
169
208
|
return new Promise((resolve, reject) => {
|
|
170
209
|
if (opts.signal?.aborted)
|
|
171
210
|
return reject(new ProviderError('cancelled', 'cancelled before claude started'));
|
|
@@ -195,22 +234,43 @@ export function runClaude(model, prompt, opts = {}) {
|
|
|
195
234
|
/* Already gone. */
|
|
196
235
|
}
|
|
197
236
|
};
|
|
237
|
+
// The last resort, for a worker that dies with the call running: an
|
|
238
|
+
// uncaught throw or process.exit still runs 'exit' listeners.
|
|
239
|
+
const onExit = () => signalTree('SIGKILL');
|
|
240
|
+
process.once('exit', onExit);
|
|
198
241
|
const end = (why) => {
|
|
199
242
|
if (ended)
|
|
200
243
|
return;
|
|
201
244
|
ended = why;
|
|
245
|
+
// Nothing after this point is ever read: let go of what was buffered.
|
|
246
|
+
stdout = '';
|
|
202
247
|
signalTree('SIGTERM');
|
|
203
248
|
force = setTimeout(() => signalTree('SIGKILL'), graceMs);
|
|
204
249
|
};
|
|
250
|
+
const report = (pid) => {
|
|
251
|
+
try {
|
|
252
|
+
opts.onSpawn?.(pid);
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
205
259
|
const timer = setTimeout(() => end(new ProviderError('transient', `claude -p did not finish in ${timeoutMs / 1000}s`)), timeoutMs);
|
|
206
260
|
const onAbort = () => end(new ProviderError('cancelled', 'memory processing was turned off'));
|
|
207
261
|
opts.signal?.addEventListener('abort', onAbort, { once: true });
|
|
208
|
-
|
|
262
|
+
if (!report(child.pid ?? null))
|
|
263
|
+
end(new ProviderError('cancelled', 'the worker could not record its provider call'));
|
|
209
264
|
child.stdout.setEncoding('utf8');
|
|
210
265
|
child.stdout.on('data', (d) => {
|
|
266
|
+
// Once the call is over — overflow, timeout, cancel — keep draining the
|
|
267
|
+
// pipe so the child is never blocked on a write, but keep none of it.
|
|
268
|
+
if (ended)
|
|
269
|
+
return;
|
|
211
270
|
stdout += d;
|
|
212
|
-
if (stdout.length >
|
|
213
|
-
end(new ProviderError('malformed',
|
|
271
|
+
if (stdout.length > maxOutput) {
|
|
272
|
+
end(new ProviderError('malformed', `claude -p printed more than ${Math.round(maxOutput / 1024 / 1024)} MB`));
|
|
273
|
+
}
|
|
214
274
|
});
|
|
215
275
|
child.stdin.on('error', () => { });
|
|
216
276
|
child.stdin.end(prompt);
|
|
@@ -218,24 +278,45 @@ export function runClaude(model, prompt, opts = {}) {
|
|
|
218
278
|
child.once('error', (err) => {
|
|
219
279
|
spawnError = err;
|
|
220
280
|
});
|
|
281
|
+
// Reaping starts when the leader exits, not when its pipes close: anything
|
|
282
|
+
// it left running may hold stdout open, and 'close' would then wait for it
|
|
283
|
+
// — to the deadline, or for ever. Killing the group closes the pipe.
|
|
284
|
+
let reaping = null;
|
|
285
|
+
let unstick;
|
|
286
|
+
let killedBy = null;
|
|
287
|
+
child.once('exit', (_code, sig) => {
|
|
288
|
+
killedBy = sig;
|
|
289
|
+
reaping = child.pid ? reapGroup(child.pid, ended ? 0 : graceMs) : Promise.resolve(true);
|
|
290
|
+
// A descendant that left the group can still hold the pipe; stop waiting for it.
|
|
291
|
+
unstick = setTimeout(() => child.stdout?.destroy(), graceMs + 3_000);
|
|
292
|
+
});
|
|
221
293
|
child.once('close', () => {
|
|
222
294
|
clearTimeout(timer);
|
|
223
295
|
if (force)
|
|
224
296
|
clearTimeout(force);
|
|
225
297
|
opts.signal?.removeEventListener('abort', onAbort);
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
298
|
+
const reaped = reaping ?? (child.pid ? reapGroup(child.pid, 0) : Promise.resolve(true));
|
|
299
|
+
void reaped.then((clear) => {
|
|
300
|
+
if (unstick)
|
|
301
|
+
clearTimeout(unstick);
|
|
302
|
+
process.removeListener('exit', onExit);
|
|
303
|
+
// Only a confirmed-empty group clears the caller's record of it.
|
|
304
|
+
if (clear)
|
|
305
|
+
report(null);
|
|
306
|
+
if (spawnError?.code === 'ENOENT') {
|
|
307
|
+
return reject(new ProviderError('missing', 'claude is not on the PATH the hooks see'));
|
|
308
|
+
}
|
|
309
|
+
if (ended)
|
|
310
|
+
return reject(ended);
|
|
311
|
+
if (spawnError)
|
|
312
|
+
return reject(new ProviderError('transient', spawnError.message));
|
|
313
|
+
// Killed by somebody else's signal: whatever it printed is cut short,
|
|
314
|
+
// and parsing it would call a stopped run malformed — a permanent fail.
|
|
315
|
+
if (killedBy)
|
|
316
|
+
return reject(new ProviderError('transient', `claude -p was stopped by ${killedBy}`));
|
|
317
|
+
// A failed run still prints its JSON envelope; that says more than the exit code.
|
|
318
|
+
resolve(stdout);
|
|
319
|
+
});
|
|
239
320
|
});
|
|
240
321
|
});
|
|
241
322
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/memory/provider.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/memory/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { execFileSync, spawn } from 'node:child_process';
|
|
1
2
|
import crypto from 'node:crypto';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
2
4
|
/**
|
|
3
5
|
* One background memory worker per installation, and none inside Eklavya's own
|
|
4
6
|
* helpers.
|
|
@@ -15,6 +17,15 @@ import crypto from 'node:crypto';
|
|
|
15
17
|
* work" and then spawning let every seam that closed together spawn its
|
|
16
18
|
* own worker; now the check and the claim are one IMMEDIATE transaction,
|
|
17
19
|
* and only the winner spawns.
|
|
20
|
+
*
|
|
21
|
+
* Who holds the slot is decided by process identity — a pid *and* the time
|
|
22
|
+
* that process started — never by the clock alone. A lease that ran out says
|
|
23
|
+
* the holder stopped renewing, not that it stopped running: taking over beside
|
|
24
|
+
* a live but wedged worker is the overlap this file forbids. So an expired
|
|
25
|
+
* lease whose processes are still alive triggers recovery (they are signalled,
|
|
26
|
+
* TERM then KILL) and the slot is taken only once they are gone. A holder whose
|
|
27
|
+
* processes are dead, or whose pid now belongs to a different process, frees
|
|
28
|
+
* the slot at once, lease or no lease.
|
|
18
29
|
*/
|
|
19
30
|
export const OBSERVER_ENV = 'EKLAVYA_INTERNAL_OBSERVER';
|
|
20
31
|
export function isInternalObserver(env = process.env) {
|
|
@@ -23,19 +34,20 @@ export function isInternalObserver(env = process.env) {
|
|
|
23
34
|
const KEY = 'memory_worker';
|
|
24
35
|
/**
|
|
25
36
|
* Longer than one provider call can live (100s deadline plus the kill grace),
|
|
26
|
-
* and renewed before every job and while a call runs, so a
|
|
27
|
-
* lapses.
|
|
37
|
+
* and renewed before every job and every few seconds while a call runs, so a
|
|
38
|
+
* healthy worker never lapses. It bounds one thing on its own: a launch that
|
|
39
|
+
* reserved the slot and never recorded a process.
|
|
28
40
|
*/
|
|
29
41
|
export const WORKER_LEASE_MS = 180_000;
|
|
42
|
+
/** Past this long expired, recovery stops asking and sends SIGKILL. */
|
|
43
|
+
export const RECOVERY_KILL_MS = 30_000;
|
|
30
44
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* ponytail: pid liveness, not process identity. Compare process start times if
|
|
36
|
-
* a reused pid ever holds a reservation for fifteen minutes.
|
|
45
|
+
* How many workers may hand the slot on, one to the next, from a single launch.
|
|
46
|
+
* Each takes up to four jobs, so one seam can drain a hundred batches without a
|
|
47
|
+
* second seam; the cap is what keeps a queue that somehow refills as fast as it
|
|
48
|
+
* drains from becoming a worker that never ends.
|
|
37
49
|
*/
|
|
38
|
-
const
|
|
50
|
+
export const MAX_GENERATIONS = 25;
|
|
39
51
|
function read(db) {
|
|
40
52
|
const row = db.prepare('SELECT value FROM meta WHERE key = ?').get(KEY);
|
|
41
53
|
if (!row)
|
|
@@ -50,6 +62,7 @@ function read(db) {
|
|
|
50
62
|
function write(db, holder) {
|
|
51
63
|
db.prepare('INSERT OR REPLACE INTO meta (key, value) VALUES (?, ?)').run(KEY, JSON.stringify(holder));
|
|
52
64
|
}
|
|
65
|
+
const posix = process.platform !== 'win32';
|
|
53
66
|
function alive(pid) {
|
|
54
67
|
if (!pid)
|
|
55
68
|
return false;
|
|
@@ -62,33 +75,154 @@ function alive(pid) {
|
|
|
62
75
|
return err.code === 'EPERM';
|
|
63
76
|
}
|
|
64
77
|
}
|
|
65
|
-
/** Whether
|
|
66
|
-
function
|
|
67
|
-
if (!
|
|
78
|
+
/** Whether any process is still in group `pgid`. Windows has no groups: the leader alone. */
|
|
79
|
+
export function groupAlive(pgid) {
|
|
80
|
+
if (!pgid)
|
|
81
|
+
return false;
|
|
82
|
+
if (!posix)
|
|
83
|
+
return alive(pgid);
|
|
84
|
+
try {
|
|
85
|
+
process.kill(-pgid, 0);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return err.code === 'EPERM';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* When `pid` started, as `ps` prints it, or null when no such process is
|
|
94
|
+
* running. Opaque: it is only ever compared with an earlier reading of itself.
|
|
95
|
+
*
|
|
96
|
+
* ponytail: null on Windows, where there is no `ps`; identity there falls back
|
|
97
|
+
* to liveness alone, which never takes over a live pid — `eklavya memory stop`
|
|
98
|
+
* is the way out if a reused one ever holds the slot.
|
|
99
|
+
*/
|
|
100
|
+
export function startStamp(pid) {
|
|
101
|
+
if (!pid || !posix)
|
|
102
|
+
return null;
|
|
103
|
+
try {
|
|
104
|
+
const out = execFileSync('ps', ['-o', 'lstart=', '-p', String(pid)], {
|
|
105
|
+
encoding: 'utf8',
|
|
106
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
107
|
+
env: { ...process.env, LC_ALL: 'C' },
|
|
108
|
+
timeout: 2_000,
|
|
109
|
+
});
|
|
110
|
+
return out.trim() || null;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Whether `pid` is still the process that was recorded, not a stranger that inherited the number. */
|
|
117
|
+
function isSame(pid, start) {
|
|
118
|
+
if (!alive(pid))
|
|
68
119
|
return false;
|
|
69
|
-
|
|
70
|
-
if (until > now)
|
|
120
|
+
if (!start)
|
|
71
121
|
return true;
|
|
72
|
-
|
|
122
|
+
// A live pid `ps` cannot read is ps failing, not proof of reuse: keep it.
|
|
123
|
+
const now = startStamp(pid);
|
|
124
|
+
return now === null || now === start;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Whether the provider tree recorded under `pgid` is still there. The group
|
|
128
|
+
* outlives its leader when `claude` exits before what it started; a pid is
|
|
129
|
+
* never handed out while a group of that number exists, so a live group whose
|
|
130
|
+
* leader is gone is still ours. A live leader has to match its stamp.
|
|
131
|
+
*/
|
|
132
|
+
function ownsGroup(pgid, start) {
|
|
133
|
+
if (!groupAlive(pgid))
|
|
73
134
|
return false;
|
|
74
|
-
|
|
135
|
+
if (!alive(pgid) || !start)
|
|
136
|
+
return true;
|
|
137
|
+
const now = startStamp(pgid);
|
|
138
|
+
return now === null || now === start;
|
|
139
|
+
}
|
|
140
|
+
/** What the recorded processes are doing, which is what decides the slot. */
|
|
141
|
+
function processesAlive(holder) {
|
|
142
|
+
return isSame(holder.pid, holder.pidStart) || ownsGroup(holder.child, holder.childStart);
|
|
143
|
+
}
|
|
144
|
+
function stateOf(holder, now) {
|
|
145
|
+
if (!holder)
|
|
146
|
+
return 'free';
|
|
147
|
+
const current = Date.parse(holder.until) > now;
|
|
148
|
+
// Reserved, not yet adopted: a launch in flight, and the lease is all there is.
|
|
149
|
+
if (!holder.pid && !holder.child)
|
|
150
|
+
return current ? 'live' : 'free';
|
|
151
|
+
if (!processesAlive(holder))
|
|
152
|
+
return 'free';
|
|
153
|
+
return current ? 'live' : 'stale';
|
|
154
|
+
}
|
|
155
|
+
function signalGroup(pgid, sig) {
|
|
156
|
+
try {
|
|
157
|
+
if (posix)
|
|
158
|
+
process.kill(-pgid, sig);
|
|
159
|
+
else
|
|
160
|
+
process.kill(pgid, sig);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
/* Already gone. */
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function signalPid(pid, sig) {
|
|
167
|
+
try {
|
|
168
|
+
process.kill(pid, sig);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
/* Already gone. */
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Signals only what the holder still owns — verified by identity, so a pid the
|
|
176
|
+
* system has since handed to someone else is never touched. The worker is
|
|
177
|
+
* signalled by pid, not group: a manual `memory process` shares its terminal's
|
|
178
|
+
* group.
|
|
179
|
+
*/
|
|
180
|
+
function signalOwned(holder, sig) {
|
|
181
|
+
if (holder.child && ownsGroup(holder.child, holder.childStart))
|
|
182
|
+
signalGroup(holder.child, sig);
|
|
183
|
+
if (holder.pid && holder.pid !== process.pid && isSame(holder.pid, holder.pidStart))
|
|
184
|
+
signalPid(holder.pid, sig);
|
|
185
|
+
}
|
|
186
|
+
/** A stale holder: it stopped renewing while its processes kept running. */
|
|
187
|
+
function recover(holder, now) {
|
|
188
|
+
const overdue = now - Date.parse(holder.until);
|
|
189
|
+
signalOwned(holder, overdue > RECOVERY_KILL_MS ? 'SIGKILL' : 'SIGTERM');
|
|
75
190
|
}
|
|
76
191
|
/**
|
|
77
192
|
* Takes the one worker slot, or returns null when someone holds it. Atomic
|
|
78
|
-
* across processes:
|
|
79
|
-
* callers cannot both
|
|
193
|
+
* across processes: the claim is an IMMEDIATE compare-and-set against what was
|
|
194
|
+
* read, so two callers cannot both take a slot they both saw free.
|
|
195
|
+
*
|
|
196
|
+
* A stale holder is recovered, not replaced: this call signals it and returns
|
|
197
|
+
* null, and a later call takes the slot once it has gone.
|
|
80
198
|
*/
|
|
81
199
|
export function reserveWorker(db, pid = null, now = Date.now()) {
|
|
200
|
+
const pidStart = startStamp(pid);
|
|
201
|
+
// Judged before the write lock: `stateOf` runs `ps`, and a hook holding the
|
|
202
|
+
// lock while it does stalls every other writer. The lock then only confirms
|
|
203
|
+
// that nobody changed the slot in between — if they did, someone else took it.
|
|
204
|
+
const seen = read(db);
|
|
205
|
+
const state = stateOf(seen, now);
|
|
206
|
+
if (state !== 'free') {
|
|
207
|
+
if (state === 'stale')
|
|
208
|
+
recover(seen, now);
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
82
211
|
return db.transaction(() => {
|
|
83
|
-
if (
|
|
212
|
+
if (JSON.stringify(read(db)) !== JSON.stringify(seen))
|
|
84
213
|
return null;
|
|
85
214
|
const token = crypto.randomUUID();
|
|
86
215
|
const stamp = new Date(now).toISOString();
|
|
87
216
|
write(db, {
|
|
88
217
|
token,
|
|
89
218
|
pid,
|
|
219
|
+
pidStart,
|
|
90
220
|
child: null,
|
|
221
|
+
childStart: null,
|
|
91
222
|
job: null,
|
|
223
|
+
jobStarted: null,
|
|
224
|
+
started: stamp,
|
|
225
|
+
generation: 0,
|
|
92
226
|
until: new Date(now + WORKER_LEASE_MS).toISOString(),
|
|
93
227
|
heartbeat: stamp,
|
|
94
228
|
});
|
|
@@ -98,34 +232,155 @@ export function reserveWorker(db, pid = null, now = Date.now()) {
|
|
|
98
232
|
/**
|
|
99
233
|
* Extends the lease and records what the worker is doing. False when the slot
|
|
100
234
|
* is no longer this token's — the caller must stop, not carry on beside the
|
|
101
|
-
* worker that replaced it.
|
|
235
|
+
* worker that replaced it. Throws on a database error: the caller decides.
|
|
102
236
|
*/
|
|
103
237
|
export function renewWorker(db, token, patch = {}, now = Date.now()) {
|
|
238
|
+
const current = read(db);
|
|
239
|
+
// Stamps are read before the write lock, and only when a process changes.
|
|
240
|
+
const pidStart = 'pid' in patch && patch.pid !== current?.pid ? startStamp(patch.pid) : undefined;
|
|
241
|
+
const childStart = 'child' in patch && patch.child !== current?.child ? startStamp(patch.child) : undefined;
|
|
104
242
|
return db.transaction(() => {
|
|
105
243
|
const holder = read(db);
|
|
106
244
|
if (!holder || holder.token !== token)
|
|
107
245
|
return false;
|
|
246
|
+
const stamp = new Date(now).toISOString();
|
|
108
247
|
write(db, {
|
|
109
248
|
...holder,
|
|
110
249
|
...patch,
|
|
250
|
+
...(pidStart !== undefined && { pidStart }),
|
|
251
|
+
...(childStart !== undefined && { childStart }),
|
|
252
|
+
...('job' in patch && patch.job !== holder.job && { jobStarted: patch.job ? stamp : null }),
|
|
111
253
|
until: new Date(now + WORKER_LEASE_MS).toISOString(),
|
|
112
|
-
heartbeat:
|
|
254
|
+
heartbeat: stamp,
|
|
113
255
|
});
|
|
114
256
|
return true;
|
|
115
257
|
}).immediate();
|
|
116
258
|
}
|
|
117
|
-
/**
|
|
259
|
+
/**
|
|
260
|
+
* Gives the slot back. A no-op unless `token` holds it, and never throws: false
|
|
261
|
+
* means the database refused, and the caller may try again. If nobody does,
|
|
262
|
+
* the slot is still held on paper by processes that are about to be gone, and
|
|
263
|
+
* the next `reserveWorker` finds them dead and takes it.
|
|
264
|
+
*/
|
|
118
265
|
export function releaseWorker(db, token) {
|
|
119
266
|
try {
|
|
120
267
|
db.prepare("DELETE FROM meta WHERE key = ? AND json_extract(value, '$.token') = ?").run(KEY, token);
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Passes the slot to a successor instead of releasing it, when `more()` says
|
|
276
|
+
* there is still work. Atomic with the check: a seam that queued a batch and
|
|
277
|
+
* lost the reservation to this worker is either seen here, or finds the slot
|
|
278
|
+
* free a moment later and launches its own. Either way the batch is not left
|
|
279
|
+
* waiting for a seam that may never come.
|
|
280
|
+
*
|
|
281
|
+
* True means the caller must now launch the successor (`launchWorker`) with the
|
|
282
|
+
* same token. The holder is reset to "launch in flight", so a successor that
|
|
283
|
+
* never starts frees the slot when the lease lapses.
|
|
284
|
+
*/
|
|
285
|
+
export function handOffWorker(db, token, more, now = Date.now()) {
|
|
286
|
+
return db.transaction(() => {
|
|
287
|
+
const holder = read(db);
|
|
288
|
+
if (!holder || holder.token !== token)
|
|
289
|
+
return false;
|
|
290
|
+
const generation = (holder.generation ?? 0) + 1;
|
|
291
|
+
if (generation >= MAX_GENERATIONS || !more()) {
|
|
292
|
+
db.prepare('DELETE FROM meta WHERE key = ?').run(KEY);
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
write(db, {
|
|
296
|
+
...holder,
|
|
297
|
+
pid: null,
|
|
298
|
+
pidStart: null,
|
|
299
|
+
child: null,
|
|
300
|
+
childStart: null,
|
|
301
|
+
job: null,
|
|
302
|
+
jobStarted: null,
|
|
303
|
+
generation,
|
|
304
|
+
until: new Date(now + WORKER_LEASE_MS).toISOString(),
|
|
305
|
+
heartbeat: new Date(now).toISOString(),
|
|
306
|
+
});
|
|
307
|
+
return true;
|
|
308
|
+
}).immediate();
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Starts `eklavya memory process --no-resume` detached under `token`, which the
|
|
312
|
+
* child adopts rather than competing for. Releases the slot if it cannot start.
|
|
313
|
+
* `--no-resume` leaves paused jobs paused: un-pausing stays an explicit act.
|
|
314
|
+
*/
|
|
315
|
+
export function launchWorker(db, token) {
|
|
316
|
+
try {
|
|
317
|
+
const cli = fileURLToPath(new URL('../cli.js', import.meta.url));
|
|
318
|
+
const child = spawn(process.execPath, [cli, 'memory', 'process', '--no-resume', '--max', '4', '--worker-token', token], {
|
|
319
|
+
detached: true,
|
|
320
|
+
stdio: 'ignore',
|
|
321
|
+
windowsHide: true,
|
|
322
|
+
});
|
|
323
|
+
child.on('error', () => releaseWorker(db, token));
|
|
324
|
+
if (!child.pid) {
|
|
325
|
+
releaseWorker(db, token);
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
child.unref();
|
|
329
|
+
try {
|
|
330
|
+
renewWorker(db, token, { pid: child.pid });
|
|
331
|
+
}
|
|
332
|
+
catch {
|
|
333
|
+
// The child adopts the slot itself with its own pid; this was the early copy.
|
|
334
|
+
}
|
|
335
|
+
return true;
|
|
121
336
|
}
|
|
122
337
|
catch {
|
|
123
|
-
|
|
338
|
+
releaseWorker(db, token);
|
|
339
|
+
return false;
|
|
124
340
|
}
|
|
125
341
|
}
|
|
126
342
|
/** The current holder, for `memory status` and `doctor`. Null when the slot is free. */
|
|
127
343
|
export function workerStatus(db, now = Date.now()) {
|
|
128
344
|
const holder = read(db);
|
|
129
|
-
|
|
345
|
+
const state = stateOf(holder, now);
|
|
346
|
+
return state === 'free' ? null : { ...holder, stale: state === 'stale' };
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* `eklavya memory stop`: ends the worker that holds the slot and the provider
|
|
350
|
+
* tree under it, and nothing else — every signal goes through the identity
|
|
351
|
+
* check. SIGTERM first, which the worker answers by cancelling its call (the
|
|
352
|
+
* job goes back unspent), reaping the tree and releasing; SIGKILL for whatever
|
|
353
|
+
* is still there after `graceMs`. The slot is released only once nothing it
|
|
354
|
+
* recorded is alive.
|
|
355
|
+
*/
|
|
356
|
+
export async function stopWorker(db, graceMs = 8_000) {
|
|
357
|
+
const holder = read(db);
|
|
358
|
+
if (!holder || stateOf(holder, Date.now()) === 'free') {
|
|
359
|
+
if (holder)
|
|
360
|
+
releaseWorker(db, holder.token);
|
|
361
|
+
return { stopped: false };
|
|
362
|
+
}
|
|
363
|
+
const wait = async (ms) => {
|
|
364
|
+
const deadline = Date.now() + ms;
|
|
365
|
+
while (processesAlive(holder) && Date.now() < deadline)
|
|
366
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
367
|
+
};
|
|
368
|
+
// The worker first, and only the worker: it answers SIGTERM by cancelling
|
|
369
|
+
// its own call, which hands the job back unspent. Signalling the provider
|
|
370
|
+
// behind its back would make the call look like it failed. A worker that is
|
|
371
|
+
// already gone leaves nobody to ask, so its tree is signalled directly.
|
|
372
|
+
const worker = holder.pid && holder.pid !== process.pid && isSame(holder.pid, holder.pidStart);
|
|
373
|
+
if (worker)
|
|
374
|
+
signalPid(holder.pid, 'SIGTERM');
|
|
375
|
+
else
|
|
376
|
+
signalOwned(holder, 'SIGTERM');
|
|
377
|
+
await wait(graceMs);
|
|
378
|
+
const forced = processesAlive(holder);
|
|
379
|
+
if (forced) {
|
|
380
|
+
signalOwned(holder, 'SIGKILL');
|
|
381
|
+
await wait(2_000);
|
|
382
|
+
}
|
|
383
|
+
const released = !processesAlive(holder) && releaseWorker(db, holder.token);
|
|
384
|
+
return { stopped: true, pid: holder.pid, child: holder.child, forced, released };
|
|
130
385
|
}
|
|
131
386
|
//# sourceMappingURL=reservation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reservation.js","sourceRoot":"","sources":["../../src/memory/reservation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reservation.js","sourceRoot":"","sources":["../../src/memory/reservation.ts"],"names":[],"mappings":"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"}
|