@xioflow/kernel 0.1.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -0
  3. package/dist/domain.d.ts +56 -0
  4. package/dist/domain.d.ts.map +1 -0
  5. package/dist/domain.js +322 -0
  6. package/dist/domain.js.map +1 -0
  7. package/dist/driver/node-driver.d.ts +29 -0
  8. package/dist/driver/node-driver.d.ts.map +1 -0
  9. package/dist/driver/node-driver.js +404 -0
  10. package/dist/driver/node-driver.js.map +1 -0
  11. package/dist/driver/types.d.ts +60 -0
  12. package/dist/driver/types.d.ts.map +1 -0
  13. package/dist/driver/types.js +2 -0
  14. package/dist/driver/types.js.map +1 -0
  15. package/dist/index.d.ts +9 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +9 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/recovery/engine.d.ts +19 -0
  20. package/dist/recovery/engine.d.ts.map +1 -0
  21. package/dist/recovery/engine.js +129 -0
  22. package/dist/recovery/engine.js.map +1 -0
  23. package/dist/store/schema.d.ts +5 -0
  24. package/dist/store/schema.d.ts.map +1 -0
  25. package/dist/store/schema.js +78 -0
  26. package/dist/store/schema.js.map +1 -0
  27. package/dist/store/sqlite.d.ts +53 -0
  28. package/dist/store/sqlite.d.ts.map +1 -0
  29. package/dist/store/sqlite.js +466 -0
  30. package/dist/store/sqlite.js.map +1 -0
  31. package/dist/supervisor/supervisor.d.ts +36 -0
  32. package/dist/supervisor/supervisor.d.ts.map +1 -0
  33. package/dist/supervisor/supervisor.js +421 -0
  34. package/dist/supervisor/supervisor.js.map +1 -0
  35. package/dist/testing/contract-suite.d.ts +11 -0
  36. package/dist/testing/contract-suite.d.ts.map +1 -0
  37. package/dist/testing/contract-suite.js +582 -0
  38. package/dist/testing/contract-suite.js.map +1 -0
  39. package/dist/types.d.ts +190 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +90 -0
  42. package/dist/types.js.map +1 -0
  43. package/package.json +68 -0
@@ -0,0 +1,421 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import crypto from 'node:crypto';
4
+ import { UnsupportedCapabilityError, } from '../types.js';
5
+ export class ProcessSupervisor {
6
+ domain;
7
+ driver;
8
+ activeOperations = new Map();
9
+ constructor(domain, driver) {
10
+ this.domain = domain;
11
+ this.driver = driver;
12
+ }
13
+ getDomain() {
14
+ return this.domain;
15
+ }
16
+ getDriver() {
17
+ return this.driver;
18
+ }
19
+ /**
20
+ * 启动协议:准入检查 -> 先持久化意图 -> 请求驱动启动 -> 登记身份并转 active -> 监督运行 -> 记录结果
21
+ */
22
+ async executeProcess(options) {
23
+ const startTime = Date.now();
24
+ const maxBytes = options.maxOutputBytes ?? 10 * 1024 * 1024; // 默认 10MB
25
+ const drainTimeoutMs = options.drainTimeoutMs ?? 2000; // 默认 2000ms
26
+ // 0. [准入期强校验 Pre-admission Capability Check]
27
+ if (options.resourceBudget?.enforcement === 'hard') {
28
+ if (options.resourceBudget.maxMemoryBytes && !this.driver.capabilities.memoryHardLimit) {
29
+ throw new UnsupportedCapabilityError('memoryHardLimit', this.driver.name, 'hard');
30
+ }
31
+ if (options.resourceBudget.maxPids && !this.driver.capabilities.pidsLimit) {
32
+ throw new UnsupportedCapabilityError('pidsLimit', this.driver.name, 'hard');
33
+ }
34
+ if (options.resourceBudget.maxCpuTimeMs && !this.driver.capabilities.cpuLimit) {
35
+ throw new UnsupportedCapabilityError('cpuLimit', this.driver.name, 'hard');
36
+ }
37
+ }
38
+ const op = {
39
+ id: options.opId,
40
+ runId: options.runId,
41
+ kind: 'process',
42
+ name: options.name,
43
+ inputFingerprint: options.inputFingerprint || `${options.command.execPath}:${options.command.args.join(' ')}`,
44
+ requiredResources: options.requiredResources,
45
+ timeoutMs: options.timeoutMs,
46
+ resourceBudget: options.resourceBudget,
47
+ status: 'pending',
48
+ };
49
+ // 1. [资源分配与排队等待]
50
+ await this.domain.allocateResourcesWithWait(options.opId, options.requiredResources, options.waitTimeoutMs ?? 0, options.resourceBudget);
51
+ // 2. [启动协议步骤 1] 写入 SQLite (status: intent_registered)
52
+ try {
53
+ this.domain.getStore().registerOperationIntent(op, this.domain.domainId);
54
+ }
55
+ catch (err) {
56
+ this.domain.releaseResources(options.opId, options.requiredResources);
57
+ throw err;
58
+ }
59
+ let handle;
60
+ try {
61
+ // 3. [启动协议步骤 2] 请求平台驱动启动
62
+ handle = await this.driver.spawn(options.command);
63
+ }
64
+ catch (spawnError) {
65
+ // 启动失败(如可执行文件不存在),不产生假运行状态,直接失败收尾并释放资源
66
+ const failResult = {
67
+ kind: 'process',
68
+ status: 'failed',
69
+ exitCode: 127,
70
+ signal: null,
71
+ stdout: '',
72
+ stderr: spawnError?.message || String(spawnError),
73
+ isTruncated: false,
74
+ identityVerification: 'not_original_process',
75
+ durationMs: Date.now() - startTime,
76
+ completedAt: new Date().toISOString(),
77
+ };
78
+ this.domain.getStore().recordOperationResult(options.opId, failResult, true);
79
+ this.domain.releaseResources(options.opId, options.requiredResources);
80
+ return failResult;
81
+ }
82
+ // 4. [启动协议步骤 3] 登记执行身份,状态推进为 active
83
+ this.domain.getStore().updateOperationStatus(options.opId, 'active', handle.identity);
84
+ const opState = {
85
+ handle,
86
+ command: options.command,
87
+ cancelRequested: false,
88
+ timedOut: false,
89
+ terminationReason: undefined,
90
+ stopPromise: undefined,
91
+ };
92
+ this.activeOperations.set(options.opId, opState);
93
+ // 准备 artifacts 溢出转储目录
94
+ const artifactsDir = options.artifactsDir || path.join(this.domain.domainPath, 'artifacts');
95
+ if (!fs.existsSync(artifactsDir)) {
96
+ try {
97
+ fs.mkdirSync(artifactsDir, { recursive: true });
98
+ }
99
+ catch { }
100
+ }
101
+ const stdoutSpillPath = path.join(artifactsDir, `${options.opId}-stdout.log`);
102
+ const stderrSpillPath = path.join(artifactsDir, `${options.opId}-stderr.log`);
103
+ // 5. [正常监督、有界排空与流式转储 (Spill to Artifacts)]
104
+ let totalOutputBytes = 0;
105
+ const onChunk = (bytes) => {
106
+ totalOutputBytes += bytes;
107
+ if (options.resourceBudget?.enforcement === 'soft' &&
108
+ options.resourceBudget.maxOutputBytes &&
109
+ totalOutputBytes > options.resourceBudget.maxOutputBytes &&
110
+ !opState.terminationReason) {
111
+ opState.terminationReason = 'output_exceeded';
112
+ this.handleStopPipeline(options.opId, 'output_exceeded', 1000).catch(() => { });
113
+ }
114
+ };
115
+ const stdoutDrainer = this.setupStreamDrainer(handle.stdout, maxBytes, stdoutSpillPath, onChunk);
116
+ const stderrDrainer = this.setupStreamDrainer(handle.stderr, maxBytes, stderrSpillPath, onChunk);
117
+ let timeoutTimer = null;
118
+ const timeoutPromise = options.timeoutMs && options.timeoutMs > 0
119
+ ? new Promise((resolve) => {
120
+ timeoutTimer = setTimeout(() => resolve('timeout'), options.timeoutMs);
121
+ })
122
+ : new Promise(() => { });
123
+ // Soft / Observe 模式资源采样治理
124
+ let peakMemoryBytes = 0;
125
+ let peakCpuTimeMs = 0;
126
+ let samplingInterval = null;
127
+ if (this.driver.sampleMetrics &&
128
+ options.resourceBudget &&
129
+ (options.resourceBudget.enforcement === 'soft' || options.resourceBudget.enforcement === 'observe')) {
130
+ samplingInterval = setInterval(async () => {
131
+ try {
132
+ const metrics = await this.driver.sampleMetrics(handle.identity);
133
+ peakMemoryBytes = Math.max(peakMemoryBytes, metrics.rssBytes);
134
+ peakCpuTimeMs = Math.max(peakCpuTimeMs, metrics.cpuTimeMs);
135
+ if (options.resourceBudget?.enforcement === 'soft') {
136
+ if (options.resourceBudget.maxMemoryBytes && metrics.rssBytes > options.resourceBudget.maxMemoryBytes) {
137
+ opState.terminationReason = 'memory_exceeded';
138
+ if (samplingInterval)
139
+ clearInterval(samplingInterval);
140
+ await this.handleStopPipeline(options.opId, 'memory_exceeded', 1000);
141
+ }
142
+ else if (options.resourceBudget.maxCpuTimeMs && metrics.cpuTimeMs > options.resourceBudget.maxCpuTimeMs) {
143
+ opState.terminationReason = 'cpu_exceeded';
144
+ if (samplingInterval)
145
+ clearInterval(samplingInterval);
146
+ await this.handleStopPipeline(options.opId, 'cpu_exceeded', 1000);
147
+ }
148
+ else if (options.resourceBudget.maxPids && metrics.pidsCount > options.resourceBudget.maxPids) {
149
+ opState.terminationReason = 'pids_exceeded';
150
+ if (samplingInterval)
151
+ clearInterval(samplingInterval);
152
+ await this.handleStopPipeline(options.opId, 'pids_exceeded', 1000);
153
+ }
154
+ }
155
+ }
156
+ catch { }
157
+ }, 100);
158
+ }
159
+ try {
160
+ // 等待底层退出或超时触发
161
+ const exitOrTimeout = await Promise.race([
162
+ handle.onExit.then((res) => ({ type: 'exit', res })),
163
+ timeoutPromise.then((type) => ({ type, res: null })),
164
+ ]);
165
+ if (timeoutTimer)
166
+ clearTimeout(timeoutTimer);
167
+ if (samplingInterval)
168
+ clearInterval(samplingInterval);
169
+ let exitResult;
170
+ if (exitOrTimeout.type === 'timeout') {
171
+ opState.timedOut = true;
172
+ opState.terminationReason = 'timed_out';
173
+ await this.handleStopPipeline(options.opId, 'timed_out', 1500);
174
+ exitResult = await handle.onExit;
175
+ }
176
+ else {
177
+ exitResult = exitOrTimeout.res;
178
+ }
179
+ // 有界等待流排空
180
+ const drainPromise = Promise.all([stdoutDrainer.finishPromise, stderrDrainer.finishPromise]);
181
+ const drainTimeoutPromise = new Promise((resolve) => setTimeout(resolve, drainTimeoutMs));
182
+ const drained = await Promise.race([
183
+ drainPromise.then(() => true),
184
+ drainTimeoutPromise.then(() => false),
185
+ ]);
186
+ if (!drained) {
187
+ // 排空超时路径强制调用 fsyncSync + closeSync 结清刷盘
188
+ stdoutDrainer.forceFinalize();
189
+ stderrDrainer.forceFinalize();
190
+ }
191
+ const stdoutData = stdoutDrainer.getResult();
192
+ const stderrData = stderrDrainer.getResult();
193
+ const isTruncated = stdoutData.isTruncated || stderrData.isTruncated;
194
+ const outputRef = stdoutData.outputRef || stderrData.outputRef;
195
+ const outputHash = stdoutData.outputHash || stderrData.outputHash;
196
+ // 校验进程身份
197
+ const idVerify = await this.driver.verifyIdentity(handle.identity);
198
+ const isResourceOrTimeoutStopped = opState.timedOut ||
199
+ opState.terminationReason === 'memory_exceeded' ||
200
+ opState.terminationReason === 'cpu_exceeded' ||
201
+ opState.terminationReason === 'pids_exceeded' ||
202
+ opState.terminationReason === 'output_exceeded';
203
+ const isSucceeded = exitResult.exitCode === 0 &&
204
+ !isResourceOrTimeoutStopped &&
205
+ !opState.cancelRequested;
206
+ const finalStatus = isResourceOrTimeoutStopped
207
+ ? 'failed'
208
+ : opState.cancelRequested
209
+ ? 'cancelled'
210
+ : isSucceeded
211
+ ? 'succeeded'
212
+ : 'failed';
213
+ const terminationReason = opState.terminationReason || (finalStatus === 'succeeded' ? 'completed' : undefined);
214
+ const result = {
215
+ kind: 'process',
216
+ status: finalStatus,
217
+ exitCode: exitResult.exitCode,
218
+ signal: exitResult.signal,
219
+ stdout: stdoutData.content,
220
+ stderr: stderrData.content,
221
+ isTruncated,
222
+ stdoutTruncated: stdoutData.isTruncated,
223
+ stderrTruncated: stderrData.isTruncated,
224
+ stdoutRef: stdoutData.outputRef,
225
+ stderrRef: stderrData.outputRef,
226
+ stdoutBytes: stdoutData.bytesSeen,
227
+ stderrBytes: stderrData.bytesSeen,
228
+ stdoutHash: stdoutData.outputHash,
229
+ stderrHash: stderrData.outputHash,
230
+ outputRef,
231
+ outputHash,
232
+ terminationReason,
233
+ peakMemoryBytes,
234
+ cpuTimeMs: peakCpuTimeMs,
235
+ identityVerification: idVerify,
236
+ durationMs: Date.now() - startTime,
237
+ completedAt: new Date().toISOString(),
238
+ };
239
+ if (opState.stopPromise) {
240
+ await opState.stopPromise;
241
+ }
242
+ const existingOp = this.domain.getStore().getOperation(options.opId);
243
+ if (existingOp && existingOp.status === 'done') {
244
+ return existingOp.result;
245
+ }
246
+ // 6. [事务提交结果与释放资源]
247
+ this.domain.getStore().recordOperationResult(options.opId, result, true);
248
+ this.domain.releaseResources(options.opId, options.requiredResources);
249
+ if (terminationReason && terminationReason !== 'completed') {
250
+ this.domain.getStore().updateRunStatus(options.runId, finalStatus === 'cancelled' ? 'cancelled' : 'failed', terminationReason);
251
+ }
252
+ return result;
253
+ }
254
+ finally {
255
+ if (timeoutTimer)
256
+ clearTimeout(timeoutTimer);
257
+ if (samplingInterval)
258
+ clearInterval(samplingInterval);
259
+ this.activeOperations.delete(options.opId);
260
+ }
261
+ }
262
+ /**
263
+ * 停止确认流水线 (Stopping Pipeline)
264
+ */
265
+ async cancelOperation(opId, graceMs = 2000) {
266
+ return this.handleStopPipeline(opId, 'user_cancelled', graceMs);
267
+ }
268
+ async handleStopPipeline(opId, reason, graceMs) {
269
+ const active = this.activeOperations.get(opId);
270
+ if (!active) {
271
+ return { stopped: true, scope: 'direct_child' };
272
+ }
273
+ if (active.stopPromise) {
274
+ return active.stopPromise;
275
+ }
276
+ active.stopPromise = (async () => {
277
+ if (this.domain.isClosed()) {
278
+ return { stopped: true, scope: 'direct_child' };
279
+ }
280
+ if (reason === 'user_cancelled') {
281
+ active.cancelRequested = true;
282
+ }
283
+ active.terminationReason = reason;
284
+ // 1. 进入 stopping 中间态(保持排他资源锁定,阻断新操作)
285
+ this.domain.getStore().updateOperationStatus(opId, 'stopping');
286
+ // 2. 调用驱动停止流水线 (SIGINT -> grace -> SIGTERM -> SIGKILL)
287
+ const stopResult = await this.driver.terminate(active.handle.identity, graceMs);
288
+ if (stopResult.stopped) {
289
+ // 3a. 驱动确认停止 -> 记录终态并安全释放资源
290
+ const op = this.domain.getStore().getOperation(opId);
291
+ if (op && op.status !== 'done') {
292
+ const cancelResult = {
293
+ kind: 'process',
294
+ status: reason === 'user_cancelled' ? 'cancelled' : 'failed',
295
+ exitCode: null,
296
+ signal: 'SIGKILL',
297
+ stdout: '',
298
+ stderr: `Operation stopped via stopping pipeline (${reason})`,
299
+ isTruncated: false,
300
+ terminationReason: reason,
301
+ identityVerification: 'not_original_process',
302
+ durationMs: 0,
303
+ completedAt: new Date().toISOString(),
304
+ };
305
+ this.domain.getStore().recordOperationResult(opId, cancelResult, true);
306
+ this.domain.releaseResources(opId, op.requiredResources);
307
+ this.domain.getStore().updateRunStatus(op.runId, reason === 'user_cancelled' ? 'cancelled' : 'failed', reason);
308
+ }
309
+ }
310
+ else {
311
+ // 3b. 驱动无法确认完全停止 -> 转入 indeterminate,绝对保留隔离屏障与锁!
312
+ const op = this.domain.getStore().getOperation(opId);
313
+ if (op && op.status !== 'done') {
314
+ const indetResult = {
315
+ kind: 'indeterminate',
316
+ status: 'indeterminate',
317
+ reason: `Process ${active.handle.identity.pid} could not be confirmed stopped: ${stopResult.errorDetails}`,
318
+ recoveryGuidance: 'Residual PID detected. Inspect system processes manually before releasing resources.',
319
+ durationMs: 0,
320
+ completedAt: new Date().toISOString(),
321
+ };
322
+ // 传递 releaseResources = false,绝对不释放锁
323
+ this.domain.getStore().recordOperationResult(opId, indetResult, false);
324
+ this.domain.getStore().updateRunStatus(op.runId, 'indeterminate', 'crash_detected');
325
+ }
326
+ }
327
+ return stopResult;
328
+ })();
329
+ return active.stopPromise;
330
+ }
331
+ setupStreamDrainer(stream, maxBytes, spillFilePath, onChunk) {
332
+ const chunks = [];
333
+ let currentBytes = 0;
334
+ let bytesSeen = 0;
335
+ let isTruncated = false;
336
+ let spillFd = null;
337
+ const hash = crypto.createHash('sha256');
338
+ let isFinalized = false;
339
+ let outputHash = undefined;
340
+ if (spillFilePath) {
341
+ try {
342
+ spillFd = fs.openSync(spillFilePath, 'w');
343
+ }
344
+ catch { }
345
+ }
346
+ const doFinalize = () => {
347
+ if (isFinalized)
348
+ return;
349
+ isFinalized = true;
350
+ if (spillFd !== null) {
351
+ try {
352
+ fs.fsyncSync(spillFd);
353
+ fs.closeSync(spillFd);
354
+ }
355
+ catch { }
356
+ spillFd = null;
357
+ }
358
+ try {
359
+ outputHash = hash.digest('hex');
360
+ }
361
+ catch { }
362
+ };
363
+ const finishPromise = new Promise((resolve) => {
364
+ const finalize = () => {
365
+ doFinalize();
366
+ resolve();
367
+ };
368
+ stream.on('data', (chunk) => {
369
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
370
+ bytesSeen += buf.length;
371
+ if (onChunk) {
372
+ try {
373
+ onChunk(buf.length);
374
+ }
375
+ catch { }
376
+ }
377
+ hash.update(buf);
378
+ // 持续落盘转储全部流
379
+ if (spillFd !== null) {
380
+ try {
381
+ fs.writeSync(spillFd, buf);
382
+ }
383
+ catch { }
384
+ }
385
+ // 内存有界保留
386
+ if (currentBytes + buf.length <= maxBytes) {
387
+ chunks.push(buf);
388
+ currentBytes += buf.length;
389
+ }
390
+ else {
391
+ if (!isTruncated) {
392
+ const remaining = maxBytes - currentBytes;
393
+ if (remaining > 0) {
394
+ chunks.push(buf.subarray(0, remaining));
395
+ currentBytes += remaining;
396
+ }
397
+ isTruncated = true;
398
+ }
399
+ }
400
+ });
401
+ stream.on('end', finalize);
402
+ stream.on('close', finalize);
403
+ stream.on('error', finalize);
404
+ });
405
+ return {
406
+ getResult: () => {
407
+ doFinalize();
408
+ return {
409
+ content: Buffer.concat(chunks).toString('utf8'),
410
+ isTruncated,
411
+ outputRef: isTruncated && spillFilePath ? spillFilePath : undefined,
412
+ outputHash,
413
+ bytesSeen,
414
+ };
415
+ },
416
+ finishPromise,
417
+ forceFinalize: doFinalize,
418
+ };
419
+ }
420
+ }
421
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/supervisor/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ExecutionDomain, PlatformDriver, ProcessSupervisor } from '../index.js';
2
+ export interface ConsumerContext {
3
+ domain: ExecutionDomain;
4
+ driver: PlatformDriver;
5
+ supervisor: ProcessSupervisor;
6
+ tempDir: string;
7
+ workflowType: 'headless' | 'three_piece' | 'memory';
8
+ cleanup: () => Promise<void>;
9
+ }
10
+ export declare function defineContractTestSuite(consumerName: string, createContext: () => Promise<ConsumerContext>): void;
11
+ //# sourceMappingURL=contract-suite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-suite.d.ts","sourceRoot":"","sources":["../../src/testing/contract-suite.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EAEf,cAAc,EACd,iBAAiB,EAKlB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,UAAU,GAAG,aAAa,GAAG,QAAQ,CAAC;IACpD,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAwBD,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,QAmpB9C"}