@hy-sde-org/dsh-code-runtime-kernels 0.1.0-rc.8
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/LICENSE +32 -0
- package/README.md +85 -0
- package/README.zh.md +85 -0
- package/cordis.patch.yml +34 -0
- package/dist/core/invariant.d.ts +16 -0
- package/dist/core/invariant.d.ts.map +1 -0
- package/dist/core/invariant.js +23 -0
- package/dist/core/invariant.js.map +1 -0
- package/dist/core/kernel.d.ts +133 -0
- package/dist/core/kernel.d.ts.map +1 -0
- package/dist/core/kernel.js +565 -0
- package/dist/core/kernel.js.map +1 -0
- package/dist/core/protocol.d.ts +115 -0
- package/dist/core/protocol.d.ts.map +1 -0
- package/dist/core/protocol.js +12 -0
- package/dist/core/protocol.js.map +1 -0
- package/dist/core/session.d.ts +49 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +153 -0
- package/dist/core/session.js.map +1 -0
- package/dist/index.d.ts +135 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +478 -0
- package/dist/index.js.map +1 -0
- package/dist/nodejs/runner.d.ts +26 -0
- package/dist/nodejs/runner.d.ts.map +1 -0
- package/dist/nodejs/runner.js +298 -0
- package/dist/nodejs/runner.js.map +1 -0
- package/dist/python/runner.d.ts +26 -0
- package/dist/python/runner.d.ts.map +1 -0
- package/dist/python/runner.js +615 -0
- package/dist/python/runner.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host-side driver for ONE persistent kernel subprocess, shared by the Python
|
|
3
|
+
* and JavaScript/SDK runners (a `KernelRuntimeProfile` describes how to spawn
|
|
4
|
+
* each). Owns the NDJSON wire: spawn + handshake, serialized outbound writes,
|
|
5
|
+
* hostile-peer inbound parsing, binding-call dispatch, SIGINT interrupt with
|
|
6
|
+
* SIGTERM/SIGKILL escalation, and shutdown-to-exit. This is process
|
|
7
|
+
* confinement, not a security boundary: model code has bash-equivalent trust,
|
|
8
|
+
* so the driver's job is robustness (a forged frame never crashes the host, an
|
|
9
|
+
* unresponsive kernel is graded up to termination) rather than isolation.
|
|
10
|
+
* @module @hy-sde-org/dsh-code-runtime-kernels/src/core/kernel
|
|
11
|
+
*/
|
|
12
|
+
import { spawn } from 'node:child_process';
|
|
13
|
+
import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
14
|
+
import { tmpdir } from 'node:os';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
import { snapshotJsonValue } from '@deepseek-ai/dsh-session';
|
|
18
|
+
/** The Node.js runner shipped as a package file (raw source in development, compiled ESM in the output). */
|
|
19
|
+
const RUNNER_PATH = fileURLToPath(new URL(new URL(import.meta.url).pathname.endsWith('.ts') ? '../nodejs/runner.ts' : '../nodejs/runner.js', import.meta.url));
|
|
20
|
+
/** Profile for the JavaScript kernel; `command` is the resolved node executable. */
|
|
21
|
+
export function nodejsKernelProfile(command) {
|
|
22
|
+
return {
|
|
23
|
+
key: 'typescript',
|
|
24
|
+
command,
|
|
25
|
+
argvPrefix: ['--no-warnings'],
|
|
26
|
+
runnerPath: RUNNER_PATH,
|
|
27
|
+
prefix: 'dsh-code-runtime-nodejs',
|
|
28
|
+
idPrefix: 'js-',
|
|
29
|
+
label: 'nodejs kernel',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Shared scratch root for staged runner scripts (inside the OS temp dir). */
|
|
33
|
+
const runnerDir = join(tmpdir(), 'dsh-kernels');
|
|
34
|
+
/** Render an unknown thrown value as a string, Error or not. */
|
|
35
|
+
function messageOf(error) {
|
|
36
|
+
return error instanceof Error ? error.message : String(error);
|
|
37
|
+
}
|
|
38
|
+
function tryMessageOf(error) {
|
|
39
|
+
if (typeof error === 'object' && error !== null && 'message' in error) {
|
|
40
|
+
return String(error.message);
|
|
41
|
+
}
|
|
42
|
+
return String(error);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Distill a `done` frame into the failure taxonomy. A clean completion yields
|
|
46
|
+
* `ok`; an invalid completion (not lossless JSON) yields `'invalid-output'`;
|
|
47
|
+
* anything else is a program exception.
|
|
48
|
+
*/
|
|
49
|
+
export function doneFailure(frame) {
|
|
50
|
+
if (frame.status === 'ok')
|
|
51
|
+
return { ok: true };
|
|
52
|
+
if (frame.invalidOutput === true) {
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
error: {
|
|
56
|
+
kind: 'invalid-output',
|
|
57
|
+
message: frame.message ?? 'program completion must be lossless JSON',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return { ok: false, error: { kind: 'exception', message: frame.message ?? 'program failed' } };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse one kernel frame. The peer runs MODEL CODE and can emit anything, so
|
|
65
|
+
* everything is re-validated and rebuilt field by field; junk returns
|
|
66
|
+
* `undefined` and is dropped (a throw here would crash the host).
|
|
67
|
+
*/
|
|
68
|
+
export function parseKernelFrame(raw) {
|
|
69
|
+
if (typeof raw !== 'object' || raw === null)
|
|
70
|
+
return undefined;
|
|
71
|
+
const message = raw;
|
|
72
|
+
switch (message.type) {
|
|
73
|
+
case 'ready': {
|
|
74
|
+
if (typeof message.pid !== 'number')
|
|
75
|
+
return undefined;
|
|
76
|
+
return { type: 'ready', pid: message.pid };
|
|
77
|
+
}
|
|
78
|
+
case 'started': {
|
|
79
|
+
if (typeof message.id !== 'string')
|
|
80
|
+
return undefined;
|
|
81
|
+
return { type: 'started', id: message.id };
|
|
82
|
+
}
|
|
83
|
+
case 'log': {
|
|
84
|
+
if (typeof message.id !== 'string' || typeof message.text !== 'string')
|
|
85
|
+
return undefined;
|
|
86
|
+
return { type: 'log', id: message.id, text: message.text, stream: typeof message.stream === 'string' ? message.stream : 'stdout' };
|
|
87
|
+
}
|
|
88
|
+
case 'call': {
|
|
89
|
+
if (typeof message.id !== 'string' || typeof message.seq !== 'number'
|
|
90
|
+
|| typeof message.global !== 'string' || typeof message.name !== 'string')
|
|
91
|
+
return undefined;
|
|
92
|
+
return {
|
|
93
|
+
type: 'call', id: message.id, seq: message.seq, global: message.global, name: message.name,
|
|
94
|
+
args: message.args,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
case 'error': {
|
|
98
|
+
if (typeof message.id !== 'string' || typeof message.ename !== 'string' || typeof message.evalue !== 'string')
|
|
99
|
+
return undefined;
|
|
100
|
+
const traceback = Array.isArray(message.traceback)
|
|
101
|
+
? message.traceback.filter((entry) => typeof entry === 'string')
|
|
102
|
+
: [];
|
|
103
|
+
return { type: 'error', id: message.id, ename: message.ename, evalue: message.evalue, traceback };
|
|
104
|
+
}
|
|
105
|
+
case 'done': {
|
|
106
|
+
if (typeof message.id !== 'string')
|
|
107
|
+
return undefined;
|
|
108
|
+
const frame = { type: 'done', id: message.id, status: message.status === 'ok' ? 'ok' : 'error' };
|
|
109
|
+
if (message.status === 'ok' && message.value !== undefined)
|
|
110
|
+
frame.value = message.value;
|
|
111
|
+
if (typeof message.executionCount === 'number')
|
|
112
|
+
frame.executionCount = message.executionCount;
|
|
113
|
+
if (message.cancelled === true)
|
|
114
|
+
frame.cancelled = true;
|
|
115
|
+
if (message.invalidOutput === true)
|
|
116
|
+
frame.invalidOutput = true;
|
|
117
|
+
if (typeof message.message === 'string')
|
|
118
|
+
frame.message = message.message;
|
|
119
|
+
return frame;
|
|
120
|
+
}
|
|
121
|
+
default: return undefined;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** One kernel subprocess, session-agnostic (the registry adds sessions). */
|
|
125
|
+
export class KernelHost {
|
|
126
|
+
id;
|
|
127
|
+
pid;
|
|
128
|
+
profile;
|
|
129
|
+
#proc;
|
|
130
|
+
#stagedPath;
|
|
131
|
+
#writeChain = Promise.resolve();
|
|
132
|
+
#readBuffer = '';
|
|
133
|
+
#runs = new Map();
|
|
134
|
+
#ready;
|
|
135
|
+
#settleReady;
|
|
136
|
+
#exited;
|
|
137
|
+
#alive = true;
|
|
138
|
+
#disposed = false;
|
|
139
|
+
#interruptEscalationMs;
|
|
140
|
+
#shutdownGraceMs;
|
|
141
|
+
/**
|
|
142
|
+
* Spawn a kernel per the profile and wait for the bootstrap handshake.
|
|
143
|
+
* Rejects on spawn failure, startup timeout, or an early process exit
|
|
144
|
+
* (grading the fresh subprocess up to termination behind us).
|
|
145
|
+
*/
|
|
146
|
+
static async start(profile, config) {
|
|
147
|
+
const argv = [...profile.argvPrefix];
|
|
148
|
+
// A runner may be a shipped file, or embedded source staged to a scratch
|
|
149
|
+
// file per spawn (tempdirs are shared host state; the embedded code may
|
|
150
|
+
// change between versions). Only the staged variant touches the disk.
|
|
151
|
+
let stagedPath;
|
|
152
|
+
if (profile.stagedSource !== undefined) {
|
|
153
|
+
mkdirSync(runnerDir, { recursive: true });
|
|
154
|
+
stagedPath = join(runnerDir, `runner-${process.pid}-${Math.random().toString(36).slice(2, 10)}${profile.stagedSuffix ?? ''}`);
|
|
155
|
+
try {
|
|
156
|
+
writeFileSync(stagedPath, profile.stagedSource, 'utf8');
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
throw new Error(`${profile.prefix}: could not stage runner script: ${tryMessageOf(error)}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const runnerArg = stagedPath ?? profile.runnerPath;
|
|
163
|
+
if (runnerArg !== undefined)
|
|
164
|
+
argv.push(runnerArg);
|
|
165
|
+
// --no-warnings for the Node runner is statically safe: a development
|
|
166
|
+
// spawn of the .ts kernel would otherwise leak the type-stripping
|
|
167
|
+
// ExperimentalWarning into the captured stderr. Python gets unfiltered
|
|
168
|
+
// stdout via -u plus PYTHONUNBUFFERED/PYTHONIOENCODING.
|
|
169
|
+
const proc = spawn(profile.command, argv, {
|
|
170
|
+
cwd: config.cwd,
|
|
171
|
+
env: { ...(config.env ?? process.env), ...profile.env },
|
|
172
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
173
|
+
windowsHide: true,
|
|
174
|
+
});
|
|
175
|
+
if (proc.pid === undefined)
|
|
176
|
+
proc.unref();
|
|
177
|
+
const kernel = new KernelHost(profile, stagedPath, proc, config);
|
|
178
|
+
kernel.id = `${profile.idPrefix}${Math.random().toString(36).slice(2, 10)}`;
|
|
179
|
+
kernel.pid = proc.pid;
|
|
180
|
+
try {
|
|
181
|
+
await Promise.race([
|
|
182
|
+
kernel.#ready,
|
|
183
|
+
new Promise((_resolve, reject) => {
|
|
184
|
+
const timer = setTimeout(() => {
|
|
185
|
+
reject(new Error(`${profile.prefix}: kernel did not become ready within ${config.startupTimeoutMs}ms`));
|
|
186
|
+
}, config.startupTimeoutMs);
|
|
187
|
+
timer.unref();
|
|
188
|
+
}),
|
|
189
|
+
]);
|
|
190
|
+
return kernel;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
// An early exit already settled every in-flight run (none); a start
|
|
194
|
+
// timeout must grade the half-booted subprocess up to termination.
|
|
195
|
+
await kernel.killForFailedStart(typeof error === 'object' && error !== null
|
|
196
|
+
? tryMessageOf(error)
|
|
197
|
+
: `${profile.label} startup failed`);
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
constructor(profile, stagedPath, proc, config) {
|
|
202
|
+
this.profile = profile;
|
|
203
|
+
this.id = '';
|
|
204
|
+
this.#proc = proc;
|
|
205
|
+
this.#stagedPath = stagedPath;
|
|
206
|
+
this.#interruptEscalationMs = config.interruptEscalationMs;
|
|
207
|
+
this.#shutdownGraceMs = config.shutdownGraceMs;
|
|
208
|
+
proc.stdout?.setEncoding('utf8');
|
|
209
|
+
proc.stderr?.setEncoding('utf8');
|
|
210
|
+
proc.stdout?.on('data', (chunk) => { this.#ingest(chunk); });
|
|
211
|
+
proc.stderr?.on('data', (chunk) => { this.#ingestStray(chunk); });
|
|
212
|
+
this.#exited = new Promise((resolve) => { proc.once('exit', (code) => { resolve(code ?? 0); }); });
|
|
213
|
+
void this.#exited.then((code) => { this.#onProcessExit(code); });
|
|
214
|
+
this.#ready = new Promise((resolve) => { this.#settleReady = resolve; });
|
|
215
|
+
}
|
|
216
|
+
/** The process is healthy and accepting runs. */
|
|
217
|
+
isAlive() {
|
|
218
|
+
return this.#alive && !this.#disposed;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Execute one program against the given namespaces. Kernel state persists
|
|
222
|
+
* across calls, and only ONE exec may be in flight per kernel at a time —
|
|
223
|
+
* the session registry serializes; callers must not overlap. Must be called
|
|
224
|
+
* while {@link isAlive}. Resolves with a {@link KernelExecResult} whose
|
|
225
|
+
* flags the provider maps onto the failure kinds.
|
|
226
|
+
*/
|
|
227
|
+
async execute(id, code, namespaces, options = {}) {
|
|
228
|
+
if (!this.isAlive()) {
|
|
229
|
+
return {
|
|
230
|
+
status: 'error', logs: [], cancelled: false, invalidOutput: false,
|
|
231
|
+
message: `${this.profile.label} is not running`, killed: true,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const namespacesById = new Map();
|
|
235
|
+
for (const namespace of namespaces)
|
|
236
|
+
namespacesById.set(namespace.global, namespace);
|
|
237
|
+
const run = {
|
|
238
|
+
id,
|
|
239
|
+
namespaces: namespacesById,
|
|
240
|
+
logs: [],
|
|
241
|
+
status: 'ok',
|
|
242
|
+
cancelled: false,
|
|
243
|
+
invalidOutput: false,
|
|
244
|
+
message: '',
|
|
245
|
+
killed: false,
|
|
246
|
+
done: Promise.resolve(),
|
|
247
|
+
finalize: () => { },
|
|
248
|
+
};
|
|
249
|
+
run.done = new Promise((resolve) => { run.finalize = () => { resolve(); }; });
|
|
250
|
+
this.#runs.set(id, run);
|
|
251
|
+
const onAbort = () => { void this.#interrupt(run); };
|
|
252
|
+
if (options.signal?.aborted)
|
|
253
|
+
onAbort();
|
|
254
|
+
else
|
|
255
|
+
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
256
|
+
try {
|
|
257
|
+
const frame = {
|
|
258
|
+
type: 'exec',
|
|
259
|
+
id,
|
|
260
|
+
code,
|
|
261
|
+
namespaces: namespaces.map(namespace => ({
|
|
262
|
+
global: namespace.global,
|
|
263
|
+
names: Object.keys(namespace.functions),
|
|
264
|
+
...namespace.errorClass ? { errorClass: namespace.errorClass } : {},
|
|
265
|
+
})),
|
|
266
|
+
...options.cwd !== undefined ? { cwd: options.cwd } : {},
|
|
267
|
+
...options.env !== undefined ? { env: options.env } : {},
|
|
268
|
+
};
|
|
269
|
+
await this.#write(frame);
|
|
270
|
+
await run.done;
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
options.signal?.removeEventListener('abort', onAbort);
|
|
274
|
+
this.#runs.delete(id);
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
...this.#collect(run),
|
|
278
|
+
...run.value !== undefined ? { value: run.value } : {},
|
|
279
|
+
...run.executionCount !== undefined ? { executionCount: run.executionCount } : {},
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
#collect(run) {
|
|
283
|
+
return {
|
|
284
|
+
status: run.status,
|
|
285
|
+
logs: run.logs,
|
|
286
|
+
cancelled: run.cancelled,
|
|
287
|
+
invalidOutput: run.invalidOutput,
|
|
288
|
+
message: run.message,
|
|
289
|
+
killed: run.killed,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
/** Request cancellation of the in-flight run via SIGINT, escalating to termination. */
|
|
293
|
+
async interrupt() {
|
|
294
|
+
for (const run of [...this.#runs.values()])
|
|
295
|
+
await this.#interrupt(run);
|
|
296
|
+
}
|
|
297
|
+
#interrupt(run) {
|
|
298
|
+
if (this.#disposed || !this.#alive) {
|
|
299
|
+
run.cancelled = true;
|
|
300
|
+
run.message = 'kernel unavailable';
|
|
301
|
+
run.killed = true;
|
|
302
|
+
run.finalize();
|
|
303
|
+
return run.done;
|
|
304
|
+
}
|
|
305
|
+
run.cancelled = true;
|
|
306
|
+
try {
|
|
307
|
+
this.#proc.kill('SIGINT');
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
/* process may already be gone */
|
|
311
|
+
}
|
|
312
|
+
// Escalate: the kernel may be stuck in code that ignores signals.
|
|
313
|
+
const termTimer = setTimeout(() => {
|
|
314
|
+
if (run.killed || !this.#alive)
|
|
315
|
+
return;
|
|
316
|
+
try {
|
|
317
|
+
this.#proc.kill('SIGTERM');
|
|
318
|
+
}
|
|
319
|
+
catch { /* gone */ }
|
|
320
|
+
const killTimer = setTimeout(() => {
|
|
321
|
+
if (!run.killed)
|
|
322
|
+
run.killed = true;
|
|
323
|
+
try {
|
|
324
|
+
this.#proc.kill('SIGKILL');
|
|
325
|
+
}
|
|
326
|
+
catch { /* gone */ }
|
|
327
|
+
}, this.#interruptEscalationMs);
|
|
328
|
+
killTimer.unref();
|
|
329
|
+
void run.done.then(() => { clearTimeout(killTimer); });
|
|
330
|
+
}, this.#interruptEscalationMs);
|
|
331
|
+
termTimer.unref();
|
|
332
|
+
void run.done.then(() => { clearTimeout(termTimer); });
|
|
333
|
+
return run.done;
|
|
334
|
+
}
|
|
335
|
+
/** Gracefully shut down: `exit` frame, then SIGTERM, then SIGKILL; waits for exit. */
|
|
336
|
+
async shutdown() {
|
|
337
|
+
if (this.#disposed) {
|
|
338
|
+
await this.#whenExited();
|
|
339
|
+
return { confirmed: true };
|
|
340
|
+
}
|
|
341
|
+
this.#alive = false;
|
|
342
|
+
this.#disposed = true;
|
|
343
|
+
for (const run of [...this.#runs.values()]) {
|
|
344
|
+
run.cancelled = true;
|
|
345
|
+
run.killed = true;
|
|
346
|
+
run.message = 'kernel shutting down';
|
|
347
|
+
run.finalize();
|
|
348
|
+
}
|
|
349
|
+
const exited = this.#exited;
|
|
350
|
+
await this.#write({ type: 'exit' }).catch(() => { });
|
|
351
|
+
const grace = () => new Promise((resolve) => {
|
|
352
|
+
const timer = setTimeout(() => { resolve('timeout'); }, this.#shutdownGraceMs);
|
|
353
|
+
timer.unref();
|
|
354
|
+
});
|
|
355
|
+
if (await Promise.race([exited.then(() => 'exited'), grace()]) === 'exited')
|
|
356
|
+
return { confirmed: true };
|
|
357
|
+
try {
|
|
358
|
+
this.#proc.kill('SIGTERM');
|
|
359
|
+
}
|
|
360
|
+
catch { /* gone */ }
|
|
361
|
+
if (await Promise.race([exited.then(() => 'exited'), grace()]) === 'exited')
|
|
362
|
+
return { confirmed: true };
|
|
363
|
+
try {
|
|
364
|
+
this.#proc.kill('SIGKILL');
|
|
365
|
+
}
|
|
366
|
+
catch { /* gone */ }
|
|
367
|
+
await exited.catch(() => { });
|
|
368
|
+
return { confirmed: false };
|
|
369
|
+
}
|
|
370
|
+
/** Termination path for a startup that never completed. */
|
|
371
|
+
async killForFailedStart(_reason) {
|
|
372
|
+
this.#alive = false;
|
|
373
|
+
this.#disposed = true;
|
|
374
|
+
try {
|
|
375
|
+
this.#proc.kill('SIGTERM');
|
|
376
|
+
}
|
|
377
|
+
catch { /* gone */ }
|
|
378
|
+
const timer = setTimeout(() => { try {
|
|
379
|
+
this.#proc.kill('SIGKILL');
|
|
380
|
+
}
|
|
381
|
+
catch { /* gone */ } }, this.#shutdownGraceMs);
|
|
382
|
+
timer.unref();
|
|
383
|
+
await this.#exited.catch(() => { });
|
|
384
|
+
clearTimeout(timer);
|
|
385
|
+
}
|
|
386
|
+
#onProcessExit(code) {
|
|
387
|
+
this.#alive = false;
|
|
388
|
+
// Finalize every still-registered run: an interrupt that had to escalate
|
|
389
|
+
// to SIGKILL lands here, exactly like a spontaneous death. finalize is
|
|
390
|
+
// idempotent, so a race with a `done` frame is harmless (the matching run
|
|
391
|
+
// is removed from the map by execute()'s finally once its promise
|
|
392
|
+
// resolves).
|
|
393
|
+
for (const run of [...this.#runs.values()]) {
|
|
394
|
+
run.status = 'error';
|
|
395
|
+
run.message = `${this.profile.label} exited with code ${code} before completing`;
|
|
396
|
+
run.killed = true;
|
|
397
|
+
run.finalize();
|
|
398
|
+
}
|
|
399
|
+
// The staged scratch script has served its purpose; remove it once the
|
|
400
|
+
// process is gone so the shared tempdir does not accumulate.
|
|
401
|
+
if (this.#stagedPath !== undefined) {
|
|
402
|
+
try {
|
|
403
|
+
rmSync(this.#stagedPath);
|
|
404
|
+
}
|
|
405
|
+
catch { /* best effort */ }
|
|
406
|
+
this.#stagedPath = undefined;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
async #whenExited() {
|
|
410
|
+
await this.#exited.catch(() => { });
|
|
411
|
+
}
|
|
412
|
+
#ingestStray(text) {
|
|
413
|
+
if (text.length === 0)
|
|
414
|
+
return;
|
|
415
|
+
for (const run of [...this.#runs.values()]) {
|
|
416
|
+
if (!run.killed)
|
|
417
|
+
run.logs.push({ text, stream: 'stderr' });
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
#ingest(chunk) {
|
|
421
|
+
this.#readBuffer += chunk;
|
|
422
|
+
for (;;) {
|
|
423
|
+
const nl = this.#readBuffer.indexOf('\n');
|
|
424
|
+
if (nl < 0)
|
|
425
|
+
break;
|
|
426
|
+
const line = this.#readBuffer.slice(0, nl);
|
|
427
|
+
this.#readBuffer = this.#readBuffer.slice(nl + 1);
|
|
428
|
+
if (!line.trim())
|
|
429
|
+
continue;
|
|
430
|
+
let raw;
|
|
431
|
+
try {
|
|
432
|
+
raw = JSON.parse(line);
|
|
433
|
+
}
|
|
434
|
+
catch {
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
const frame = parseKernelFrame(raw);
|
|
438
|
+
if (frame === undefined)
|
|
439
|
+
continue;
|
|
440
|
+
this.#handleFrame(frame);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
#handleFrame(frame) {
|
|
444
|
+
switch (frame.type) {
|
|
445
|
+
case 'ready':
|
|
446
|
+
this.#settleReady();
|
|
447
|
+
return;
|
|
448
|
+
case 'started':
|
|
449
|
+
return;
|
|
450
|
+
case 'log': {
|
|
451
|
+
const run = this.#runs.get(frame.id);
|
|
452
|
+
if (run !== undefined)
|
|
453
|
+
run.logs.push({ text: frame.text, stream: frame.stream ?? 'stdout' });
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
case 'call': {
|
|
457
|
+
this.#dispatchCall(frame);
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
case 'error': {
|
|
461
|
+
const run = this.#runs.get(frame.id);
|
|
462
|
+
if (run !== undefined)
|
|
463
|
+
run.message = `${frame.ename}: ${frame.evalue}`;
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
case 'done': {
|
|
467
|
+
const run = this.#runs.get(frame.id);
|
|
468
|
+
if (run === undefined)
|
|
469
|
+
return;
|
|
470
|
+
run.status = frame.status;
|
|
471
|
+
if (frame.value !== undefined)
|
|
472
|
+
run.value = frame.value;
|
|
473
|
+
if (frame.executionCount !== undefined)
|
|
474
|
+
run.executionCount = frame.executionCount;
|
|
475
|
+
if (frame.cancelled === true)
|
|
476
|
+
run.cancelled = true;
|
|
477
|
+
if (frame.invalidOutput === true)
|
|
478
|
+
run.invalidOutput = true;
|
|
479
|
+
if (frame.message !== undefined)
|
|
480
|
+
run.message = frame.message;
|
|
481
|
+
run.finalize();
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
#dispatchCall(frame) {
|
|
487
|
+
const run = this.#runs.get(frame.id);
|
|
488
|
+
if (run === undefined) {
|
|
489
|
+
void this.#writeReply(frame.id, frame.seq, {
|
|
490
|
+
ok: false,
|
|
491
|
+
message: `no active run for id ${frame.id}`,
|
|
492
|
+
name: frame.name,
|
|
493
|
+
});
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
// Own-property lookup only: a forged name like 'constructor' must not walk
|
|
497
|
+
// the record's prototype chain and reach a callable the consumer never
|
|
498
|
+
// declared. The provider validated namespaces, and the exec request names
|
|
499
|
+
// them, so an unexpected member is a hostile-peer frame, answered, not a crash.
|
|
500
|
+
const record = run.namespaces.get(frame.global)?.functions;
|
|
501
|
+
const fn = record !== undefined && Object.hasOwn(record, frame.name) ? record[frame.name] : undefined;
|
|
502
|
+
if (typeof fn !== 'function') {
|
|
503
|
+
void this.#writeReply(frame.id, frame.seq, {
|
|
504
|
+
ok: false,
|
|
505
|
+
message: `unknown binding ${JSON.stringify(`${frame.global}.${frame.name}`)}`,
|
|
506
|
+
name: frame.name,
|
|
507
|
+
});
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
void (async () => {
|
|
511
|
+
try {
|
|
512
|
+
const resolved = await fn(frame.args);
|
|
513
|
+
let value;
|
|
514
|
+
try {
|
|
515
|
+
value = snapshotJsonValue(resolved);
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
value = undefined;
|
|
519
|
+
}
|
|
520
|
+
if (value === undefined) {
|
|
521
|
+
await this.#writeReply(frame.id, frame.seq, {
|
|
522
|
+
ok: false,
|
|
523
|
+
message: 'binding resolution must be lossless JSON',
|
|
524
|
+
name: frame.name,
|
|
525
|
+
});
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
await this.#writeReply(frame.id, frame.seq, { ok: true, value, name: frame.name });
|
|
529
|
+
}
|
|
530
|
+
catch (error) {
|
|
531
|
+
await this.#writeReply(frame.id, frame.seq, {
|
|
532
|
+
ok: false,
|
|
533
|
+
message: messageOf(error),
|
|
534
|
+
name: frame.name,
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
})();
|
|
538
|
+
}
|
|
539
|
+
#writeReply(id, seq, payload) {
|
|
540
|
+
const message = payload.ok
|
|
541
|
+
? { type: 'reply', id, seq, ok: true, value: payload.value, name: payload.name }
|
|
542
|
+
: { type: 'reply', id, seq, ok: false, message: payload.message, name: payload.name };
|
|
543
|
+
return this.#write(message);
|
|
544
|
+
}
|
|
545
|
+
/** Serialized outbound write: lines never interleave even across await points. */
|
|
546
|
+
#write(message) {
|
|
547
|
+
const next = this.#writeChain.then(() => new Promise((resolve, reject) => {
|
|
548
|
+
if (this.#proc.stdin === null || this.#proc.stdin.destroyed) {
|
|
549
|
+
reject(new Error(`${this.profile.prefix}: kernel stdin closed`));
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
this.#proc.stdin.write(`${JSON.stringify(message)}\n`, (error) => {
|
|
553
|
+
if (error)
|
|
554
|
+
reject(error);
|
|
555
|
+
else
|
|
556
|
+
resolve();
|
|
557
|
+
});
|
|
558
|
+
}));
|
|
559
|
+
// Keep the chain from stalling forever on a single rejected write.
|
|
560
|
+
this.#writeChain = next.catch(() => { });
|
|
561
|
+
return next;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
export { RUNNER_PATH };
|
|
565
|
+
//# sourceMappingURL=kernel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../src/core/kernel.ts"],"names":[],"mappings":"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"}
|