@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,582 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import crypto from 'node:crypto';
5
+ import { ExecutionDomain, SqliteStore, ProcessSupervisor, RecoveryEngine, ResourceConflictError, UnsupportedCapabilityError, EpochFencedError, } from '../index.js';
6
+ function ensureTaskAndRun(domain, taskId, runId) {
7
+ const store = domain.getStore();
8
+ if (!store.getTask(taskId)) {
9
+ store.saveTask({
10
+ id: taskId,
11
+ domainId: domain.domainId,
12
+ name: `Task for ${taskId}`,
13
+ createdAt: new Date().toISOString(),
14
+ });
15
+ }
16
+ if (!store.getRun(runId)) {
17
+ store.saveRun({
18
+ id: runId,
19
+ taskId,
20
+ domainId: domain.domainId,
21
+ owner: 'test-runner',
22
+ status: 'running',
23
+ startedAt: new Date().toISOString(),
24
+ });
25
+ }
26
+ }
27
+ export function defineContractTestSuite(consumerName, createContext) {
28
+ describe(`15-Item Consistency Contract Suite: [${consumerName}]`, () => {
29
+ let ctx;
30
+ beforeEach(async () => {
31
+ ctx = await createContext();
32
+ });
33
+ afterEach(async () => {
34
+ await ctx.cleanup();
35
+ });
36
+ it('契约 1: 错误命令启动立即显式失败,绝不产生假 running 状态', async () => {
37
+ const { supervisor, domain, tempDir } = ctx;
38
+ ensureTaskAndRun(domain, 'task-c1', 'run-c1');
39
+ const result = await supervisor.executeProcess({
40
+ runId: 'run-c1',
41
+ opId: 'op-c1-bogus',
42
+ name: 'bogus-cmd',
43
+ command: {
44
+ execPath: '/path/to/definitely/non_existent_binary_xyz',
45
+ args: [],
46
+ cwd: tempDir,
47
+ },
48
+ requiredResources: ['res:c1'],
49
+ });
50
+ expect(result.status).toBe('failed');
51
+ expect(result.exitCode).toBe(127);
52
+ expect(domain.isResourceLocked('res:c1')).toBe(false);
53
+ // 验证未产生假 active 状态
54
+ const events = domain.getStore().getJournalEvents(domain.domainId);
55
+ const fakeActive = events.some((e) => e.type === 'OPERATION_STATUS_TRANSITION' && e.payload.status === 'active');
56
+ expect(fakeActive).toBe(false);
57
+ });
58
+ it('契约 2: 大输出有界排空,超限顺畅退出并标记 isTruncated = true', async () => {
59
+ const { supervisor, domain, tempDir } = ctx;
60
+ ensureTaskAndRun(domain, 'task-c2', 'run-c2');
61
+ const printScript = `process.stdout.write('X'.repeat(1024 * 1024 * 12));`;
62
+ const result = await supervisor.executeProcess({
63
+ runId: 'run-c2',
64
+ opId: 'op-c2-heavy',
65
+ name: 'heavy-output',
66
+ command: {
67
+ execPath: process.execPath,
68
+ args: ['-e', printScript],
69
+ cwd: tempDir,
70
+ },
71
+ requiredResources: ['res:c2'],
72
+ maxOutputBytes: 10 * 1024 * 1024,
73
+ });
74
+ expect(result.status).toBe('succeeded');
75
+ expect(result.exitCode).toBe(0);
76
+ expect(result.isTruncated).toBe(true);
77
+ expect(result.stdoutTruncated).toBe(true);
78
+ expect(result.stderrTruncated).toBe(false);
79
+ expect(result.stdoutBytes).toBeGreaterThanOrEqual(12 * 1024 * 1024);
80
+ expect(result.stdoutRef).toBeTruthy();
81
+ expect(result.stdoutHash).toMatch(/^[0-9a-f]{64}$/);
82
+ expect(result.stdout.length).toBeLessThanOrEqual(10 * 1024 * 1024);
83
+ expect(domain.isResourceLocked('res:c2')).toBe(false);
84
+ });
85
+ it('契约 3: 超时未确认停止保护,未确认退出前排他资源锁绝对不释放', async () => {
86
+ const { domain, tempDir } = ctx;
87
+ ensureTaskAndRun(domain, 'task-c3', 'run-c3');
88
+ const mockUnconfirmedDriver = {
89
+ name: 'stubborn-driver',
90
+ capabilities: {
91
+ processGroupKill: false,
92
+ accurateStartTime: false,
93
+ memoryHardLimit: false,
94
+ pidsLimit: false,
95
+ cpuLimit: false,
96
+ descendantEnumeration: 'none',
97
+ },
98
+ async spawn(cmd) {
99
+ return ctx.driver.spawn(cmd);
100
+ },
101
+ async verifyIdentity() {
102
+ return 'cannot_determine';
103
+ },
104
+ async terminate() {
105
+ return { stopped: false, scope: 'unknown', errorDetails: 'Cannot confirm exit' };
106
+ },
107
+ };
108
+ const customSupervisor = new ProcessSupervisor(domain, mockUnconfirmedDriver);
109
+ const runPromise = customSupervisor.executeProcess({
110
+ runId: 'run-c3',
111
+ opId: 'op-c3-stubborn',
112
+ name: 'stubborn-op',
113
+ command: {
114
+ execPath: process.execPath,
115
+ args: ['-e', 'setTimeout(() => {}, 5000);'],
116
+ cwd: tempDir,
117
+ },
118
+ requiredResources: ['res:c3-lock'],
119
+ });
120
+ await new Promise((r) => setTimeout(r, 100));
121
+ const cancelRes = await customSupervisor.cancelOperation('op-c3-stubborn');
122
+ expect(cancelRes.stopped).toBe(false);
123
+ // 核心断言:未确认停止前,排他锁绝不释放!
124
+ expect(domain.isResourceLocked('res:c3-lock')).toBe(true);
125
+ const op = domain.getStore().getOperation('op-c3-stubborn');
126
+ expect(op?.result?.status).toBe('indeterminate');
127
+ const active = customSupervisor.activeOperations.get('op-c3-stubborn');
128
+ if (active?.handle?.rawProcess) {
129
+ active.handle.rawProcess.kill('SIGKILL');
130
+ }
131
+ await runPromise;
132
+ });
133
+ it('契约 4: 受管资源冲突可诊断与排队等待放行', async () => {
134
+ const { domain } = ctx;
135
+ domain.allocateResources('op-owner-A', ['res:exclusive-port']);
136
+ // 1. 无等待时立即抛出冲突异常并携带诊断
137
+ expect(() => {
138
+ domain.allocateResources('op-requester-B', ['res:exclusive-port']);
139
+ }).toThrowError(ResourceConflictError);
140
+ try {
141
+ domain.allocateResources('op-requester-B', ['res:exclusive-port'], 150);
142
+ }
143
+ catch (err) {
144
+ expect(err.message).toContain('res:exclusive-port');
145
+ expect(err.message).toContain('op-owner-A');
146
+ expect(err.message).toContain('op-requester-B');
147
+ }
148
+ // 2. 带排队等待异步放行
149
+ setTimeout(() => {
150
+ domain.releaseResources('op-owner-A', ['res:exclusive-port']);
151
+ }, 50);
152
+ await domain.allocateResourcesWithWait('op-requester-B', ['res:exclusive-port'], 300);
153
+ expect(domain.getResourceOwner('res:exclusive-port')).toBe('op-requester-B');
154
+ domain.releaseResources('op-requester-B');
155
+ });
156
+ it('契约 5: 不确定副作用防重放,重启恢复时阻断自动重试并保留隔离', async () => {
157
+ const { domain, driver } = ctx;
158
+ ensureTaskAndRun(domain, 'task-c5', 'run-c5');
159
+ // 登记并记录一个 indeterminate 状态操作
160
+ domain.registerOperationIntent({
161
+ id: 'op-c5-indeterminate',
162
+ runId: 'run-c5',
163
+ kind: 'process',
164
+ name: 'dangerous-db-mutation',
165
+ inputFingerprint: 'fp-c5',
166
+ requiredResources: ['db:primary:write'],
167
+ status: 'pending',
168
+ });
169
+ domain.getStore().recordOperationResult('op-c5-indeterminate', {
170
+ kind: 'indeterminate',
171
+ status: 'indeterminate',
172
+ reason: 'Network cut off during commit',
173
+ recoveryGuidance: 'Check primary DB log before retry',
174
+ durationMs: 0,
175
+ completedAt: new Date().toISOString(),
176
+ }, false);
177
+ // 运行恢复引擎
178
+ const engine = new RecoveryEngine(domain, driver);
179
+ const report = await engine.recover();
180
+ // 不确定状态不自动重试
181
+ const recoveredItem = report.recoveredOperations.find((r) => r.opId === 'op-c5-indeterminate');
182
+ expect(recoveredItem).toBeUndefined(); // 已是 done 终态不重复恢复
183
+ // 隔离保持锁定
184
+ expect(domain.isResourceLocked('db:primary:write')).toBe(true);
185
+ // 试图再次申请冲突资源被严格阻断
186
+ expect(() => {
187
+ domain.allocateResources('op-c5-retry', ['db:primary:write']);
188
+ }).toThrowError(ResourceConflictError);
189
+ });
190
+ it('契约 6: 崩溃可靠恢复,已提交事务的事实与 Epoch 在重启后 100% 完整重现', () => {
191
+ const { domain, tempDir } = ctx;
192
+ const store = domain.getStore();
193
+ const initialEpoch = domain.getEpoch();
194
+ store.saveTask({
195
+ id: 'task-c6',
196
+ domainId: domain.domainId,
197
+ name: 'Crash Recovery Task',
198
+ createdAt: new Date().toISOString(),
199
+ meta: { priority: 'high' },
200
+ });
201
+ store.saveRun({
202
+ id: 'run-c6',
203
+ taskId: 'task-c6',
204
+ domainId: domain.domainId,
205
+ owner: 'user-c6',
206
+ status: 'running',
207
+ startedAt: new Date().toISOString(),
208
+ configSnapshotWhiteList: { model: 'gemini-pro' },
209
+ });
210
+ const seq = store.recordEventAndTransitionState({
211
+ domainId: domain.domainId,
212
+ runId: 'run-c6',
213
+ type: 'COMMITTED_CHECKPOINT',
214
+ payload: { step: 42 },
215
+ timestamp: new Date().toISOString(),
216
+ });
217
+ // 模拟断开 / 重启
218
+ domain.close();
219
+ const newDomain = ExecutionDomain.acquire(tempDir, domain.domainId);
220
+ const newStore = newDomain.getStore();
221
+ const restoredTask = newStore.getTask('task-c6');
222
+ const restoredRun = newStore.getRun('run-c6');
223
+ const restoredEvents = newStore.getJournalEvents(domain.domainId);
224
+ expect(restoredTask?.name).toBe('Crash Recovery Task');
225
+ expect(restoredTask?.meta?.priority).toBe('high');
226
+ expect(restoredRun?.owner).toBe('user-c6');
227
+ expect(restoredRun?.configSnapshotWhiteList?.model).toBe('gemini-pro');
228
+ expect(restoredEvents.some((e) => e.seq === seq && e.type === 'COMMITTED_CHECKPOINT')).toBe(true);
229
+ // 验证代际自增
230
+ expect(newDomain.getEpoch()).toBeGreaterThan(initialEpoch);
231
+ newDomain.close();
232
+ });
233
+ it('契约 7: 平台驱动能力缺失内核准入拒绝,绝不静默降级或伪造成功', async () => {
234
+ const { domain, tempDir, driver } = ctx;
235
+ ensureTaskAndRun(domain, 'task-c7', 'run-c7');
236
+ // 使用真实驱动(其 memoryHardLimit 为 false)
237
+ const realSupervisor = new ProcessSupervisor(domain, driver);
238
+ // 申请 hard 内存限制,内核必须在准入期显式抛出 UnsupportedCapabilityError
239
+ await expect(realSupervisor.executeProcess({
240
+ runId: 'run-c7',
241
+ opId: 'op-c7-hard',
242
+ name: 'require-cgroup',
243
+ command: { execPath: 'echo', args: ['hi'], cwd: tempDir },
244
+ requiredResources: ['res:c7'],
245
+ resourceBudget: {
246
+ maxMemoryBytes: 100 * 1024 * 1024,
247
+ enforcement: 'hard',
248
+ },
249
+ })).rejects.toThrowError(UnsupportedCapabilityError);
250
+ expect(domain.isResourceLocked('res:c7')).toBe(false);
251
+ });
252
+ it('契约 8: 工作流无感替换,无论三件套还是纯内存工作流,内核状态与事件时序完全一致', async () => {
253
+ const { domain, supervisor, tempDir } = ctx;
254
+ const store = domain.getStore();
255
+ const taskId = `task-c8-${ctx.workflowType}`;
256
+ const runId = `run-c8-${ctx.workflowType}`;
257
+ store.saveTask({
258
+ id: taskId,
259
+ domainId: domain.domainId,
260
+ name: 'Workflow Replace Test',
261
+ createdAt: new Date().toISOString(),
262
+ });
263
+ store.saveRun({
264
+ id: runId,
265
+ taskId,
266
+ domainId: domain.domainId,
267
+ owner: 'tester',
268
+ status: 'starting',
269
+ startedAt: new Date().toISOString(),
270
+ });
271
+ // 执行一个成功的 Operation
272
+ const opResult = await supervisor.executeProcess({
273
+ runId,
274
+ opId: `op-c8-${ctx.workflowType}`,
275
+ name: 'echo-step',
276
+ command: {
277
+ execPath: process.execPath,
278
+ args: ['-e', 'console.log("Kernel execution invariant holds");'],
279
+ cwd: tempDir,
280
+ },
281
+ requiredResources: [`res:c8:${ctx.workflowType}`],
282
+ });
283
+ expect(opResult.status).toBe('succeeded');
284
+ store.reportRunSucceeded(runId);
285
+ const finalRun = store.getRun(runId);
286
+ expect(finalRun?.status).toBe('succeeded');
287
+ expect(finalRun?.terminationReason).toBe('completed');
288
+ const events = store.getJournalEvents(domain.domainId);
289
+ const runEvents = events.filter((e) => e.runId === runId);
290
+ const eventTypes = runEvents.map((e) => e.type);
291
+ // 验证精准状态机时序链路:必须完全严格数组相等,杜绝模糊 toContain
292
+ expect(eventTypes).toEqual([
293
+ 'OPERATION_INTENT_REGISTERED',
294
+ 'OPERATION_STATUS_TRANSITION',
295
+ 'OPERATION_RESULT_RECORDED',
296
+ 'RUN_STATUS_TRANSITION',
297
+ ]);
298
+ // 验证事件载荷确定性
299
+ expect(runEvents[0].payload.name).toBe('echo-step');
300
+ expect(runEvents[1].payload.status).toBe('active');
301
+ expect(runEvents[2].payload.result.status).toBe('succeeded');
302
+ expect(runEvents[3].payload.status).toBe('succeeded');
303
+ expect(runEvents[3].payload.terminationReason).toBe('completed');
304
+ });
305
+ it('契约 9: 整组终止可靠收敛,整组信号与组空确认确保无残留后代', async () => {
306
+ const { supervisor, domain, tempDir } = ctx;
307
+ ensureTaskAndRun(domain, 'task-c9', 'run-c9');
308
+ const grandchildPidFile = path.join(tempDir, 'grandchild.pid');
309
+ // 启动一个派生后代的常驻进程(孙进程在同进程组中运行,无 detached: true)
310
+ const groupScript = `
311
+ const fs = require('node:fs');
312
+ const { spawn } = require('node:child_process');
313
+ const sub = spawn(process.execPath, ['-e', 'setInterval(() => {}, 1000);'], { stdio: 'ignore' });
314
+ fs.writeFileSync(${JSON.stringify(grandchildPidFile)}, String(sub.pid), 'utf8');
315
+ setInterval(() => {}, 1000);
316
+ `;
317
+ const executePromise = supervisor.executeProcess({
318
+ runId: 'run-c9',
319
+ opId: 'op-c9-group',
320
+ name: 'group-proc',
321
+ command: {
322
+ execPath: process.execPath,
323
+ args: ['-e', groupScript],
324
+ cwd: tempDir,
325
+ },
326
+ requiredResources: ['res:c9-group'],
327
+ timeoutMs: 10000,
328
+ });
329
+ // 等待孙进程完成创建并写出 PID
330
+ let grandchildPid = 0;
331
+ for (let i = 0; i < 40; i++) {
332
+ if (fs.existsSync(grandchildPidFile)) {
333
+ try {
334
+ const content = fs.readFileSync(grandchildPidFile, 'utf8').trim();
335
+ if (content) {
336
+ grandchildPid = parseInt(content, 10);
337
+ break;
338
+ }
339
+ }
340
+ catch { }
341
+ }
342
+ await new Promise((r) => setTimeout(r, 50));
343
+ }
344
+ expect(grandchildPid).toBeGreaterThan(0);
345
+ // 核验取消前孙进程确实存活
346
+ let grandchildAliveBefore = false;
347
+ try {
348
+ process.kill(grandchildPid, 0);
349
+ grandchildAliveBefore = true;
350
+ }
351
+ catch { }
352
+ expect(grandchildAliveBefore).toBe(true);
353
+ // 执行整组停止流水线
354
+ const stopRes = await supervisor.cancelOperation('op-c9-group', 1500);
355
+ expect(stopRes.stopped).toBe(true);
356
+ expect(domain.isResourceLocked('res:c9-group')).toBe(false);
357
+ // 核心真实断言:整组 kill(-pgid) 广播后,同组孙进程必须确定性死亡,绝不泄漏为 PID 1 孤儿!
358
+ let grandchildAliveAfter = true;
359
+ try {
360
+ process.kill(grandchildPid, 0);
361
+ }
362
+ catch (err) {
363
+ if (err.code === 'ESRCH') {
364
+ grandchildAliveAfter = false;
365
+ }
366
+ }
367
+ expect(grandchildAliveAfter).toBe(false);
368
+ await executePromise;
369
+ });
370
+ it('契约 10: 逃逸后代诚实上报,驱动无法确认停止时如实标记 cannot_determine', async () => {
371
+ const { supervisor, domain, tempDir } = ctx;
372
+ ensureTaskAndRun(domain, 'task-c10', 'run-c10');
373
+ const escapedPidFile = path.join(tempDir, 'escaped.pid');
374
+ // 使用真实驱动:孙进程显式使用 detached: true 模拟调用 setsid() 脱离原有父组恶意逃逸
375
+ const escapeScript = `
376
+ const fs = require('node:fs');
377
+ const { spawn } = require('node:child_process');
378
+ const sub = spawn(process.execPath, ['-e', 'setInterval(() => {}, 1000);'], {
379
+ detached: true,
380
+ stdio: 'ignore'
381
+ });
382
+ fs.writeFileSync(${JSON.stringify(escapedPidFile)}, String(sub.pid), 'utf8');
383
+ setInterval(() => {}, 1000);
384
+ `;
385
+ let escapedPid = 0;
386
+ try {
387
+ const executePromise = supervisor.executeProcess({
388
+ runId: 'run-c10',
389
+ opId: 'op-c10-escape',
390
+ name: 'escape-proc',
391
+ command: {
392
+ execPath: process.execPath,
393
+ args: ['-e', escapeScript],
394
+ cwd: tempDir,
395
+ },
396
+ requiredResources: ['res:c10-lock'],
397
+ timeoutMs: 10000,
398
+ });
399
+ // 等待逃逸孙进程完成创建并记录 PID
400
+ for (let i = 0; i < 40; i++) {
401
+ if (fs.existsSync(escapedPidFile)) {
402
+ try {
403
+ const content = fs.readFileSync(escapedPidFile, 'utf8').trim();
404
+ if (content) {
405
+ escapedPid = parseInt(content, 10);
406
+ break;
407
+ }
408
+ }
409
+ catch { }
410
+ }
411
+ await new Promise((r) => setTimeout(r, 50));
412
+ }
413
+ expect(escapedPid).toBeGreaterThan(0);
414
+ // 验证逃逸孙进程确实正在运行
415
+ let escapedAliveBefore = false;
416
+ try {
417
+ process.kill(escapedPid, 0);
418
+ escapedAliveBefore = true;
419
+ }
420
+ catch { }
421
+ expect(escapedAliveBefore).toBe(true);
422
+ // 调用停止流水线:NodePlatformDriver 真实后代树扫描探测到逃逸残留
423
+ const cancelRes = await supervisor.cancelOperation('op-c10-escape', 1000);
424
+ // 真实上报 stopped: false,且 residualPids 包含逃逸孤儿 PID
425
+ expect(cancelRes.stopped).toBe(false);
426
+ expect(cancelRes.residualPids).toBeDefined();
427
+ expect(cancelRes.residualPids).toContain(escapedPid);
428
+ // 核心架构红线:驱动无法确认停止时,必须转入 indeterminate,绝对保留隔离屏障与排他锁!
429
+ expect(domain.isResourceLocked('res:c10-lock')).toBe(true);
430
+ const opRecord = domain.getStore().getOperation('op-c10-escape');
431
+ expect(opRecord?.result?.status).toBe('indeterminate');
432
+ // 主动杀掉主进程等待 promise 返回
433
+ const active = supervisor.activeOperations.get('op-c10-escape');
434
+ if (active?.handle?.rawProcess) {
435
+ try {
436
+ active.handle.rawProcess.kill('SIGKILL');
437
+ }
438
+ catch { }
439
+ }
440
+ await executePromise;
441
+ }
442
+ finally {
443
+ // 测试收尾:主动向逃逸孤儿发送 SIGKILL 清理,确保不污染宿主机
444
+ if (escapedPid > 0) {
445
+ try {
446
+ process.kill(escapedPid, 'SIGKILL');
447
+ }
448
+ catch { }
449
+ }
450
+ }
451
+ });
452
+ it('契约 11: Epoch Fencing 代际栅栏,旧所有者复活写入被强制拒绝 (防脑裂)', () => {
453
+ const { domain, tempDir } = ctx;
454
+ const store = domain.getStore();
455
+ const initialEpoch = domain.getEpoch();
456
+ // 模拟代际推进:另一进程接管租约导致 epoch 跃迁
457
+ const newOwner = store.acquireOwnerLease(domain.domainId, 'resurrected-competitor', 'other-host', 30000, true);
458
+ expect(newOwner.epoch).toBeGreaterThan(initialEpoch);
459
+ // 模拟旧所有者僵尸进程(持有旧代际 initialEpoch)尝试写入
460
+ const zombieStore = new SqliteStore(path.join(tempDir, 'domain.db'));
461
+ zombieStore.unsafeSetCurrentEpochForTesting(initialEpoch);
462
+ expect(() => {
463
+ zombieStore.saveTask({
464
+ id: 'task-stale-write',
465
+ domainId: domain.domainId,
466
+ name: 'Zombie Write',
467
+ createdAt: new Date().toISOString(),
468
+ });
469
+ }).toThrowError(EpochFencedError);
470
+ zombieStore.close();
471
+ });
472
+ it('契约 12: 运行完成协议,未完成或不确定操作阻断 Run 终结', () => {
473
+ const { domain } = ctx;
474
+ const store = domain.getStore();
475
+ ensureTaskAndRun(domain, 'task-c12', 'run-c12');
476
+ // 登记一个未完成操作
477
+ store.registerOperationIntent({
478
+ id: 'op-c12-running',
479
+ runId: 'run-c12',
480
+ kind: 'process',
481
+ name: 'unfinished-work',
482
+ inputFingerprint: 'fp-12',
483
+ requiredResources: ['res:c12'],
484
+ status: 'pending',
485
+ }, domain.domainId);
486
+ // 有未完成操作时 reportRunSucceeded 必须抛出异常阻止
487
+ expect(() => {
488
+ store.reportRunSucceeded('run-c12');
489
+ }).toThrowError(/Cannot complete run 'run-c12'/);
490
+ // 将该操作收尾
491
+ store.recordOperationResult('op-c12-running', {
492
+ kind: 'process',
493
+ status: 'succeeded',
494
+ exitCode: 0,
495
+ signal: null,
496
+ stdout: '',
497
+ stderr: '',
498
+ isTruncated: false,
499
+ identityVerification: 'is_original_process',
500
+ durationMs: 10,
501
+ completedAt: new Date().toISOString(),
502
+ }, true);
503
+ // 现在 reportRunSucceeded 正常完成并标记 succeeded
504
+ store.reportRunSucceeded('run-c12');
505
+ const run = store.getRun('run-c12');
506
+ expect(run?.status).toBe('succeeded');
507
+ expect(run?.terminationReason).toBe('completed');
508
+ });
509
+ it('契约 13: 多维 Hard 请求遇不支持平台准入拒绝', async () => {
510
+ const { supervisor, tempDir } = ctx;
511
+ // 验证 pidsLimit hard 准入拒绝
512
+ await expect(supervisor.executeProcess({
513
+ runId: 'run-c13',
514
+ opId: 'op-c13-pids',
515
+ name: 'pids-test',
516
+ command: { execPath: 'echo', args: ['1'], cwd: tempDir },
517
+ requiredResources: ['res:c13:pids'],
518
+ resourceBudget: { maxPids: 20, enforcement: 'hard' },
519
+ })).rejects.toThrowError(UnsupportedCapabilityError);
520
+ // 验证 cpuLimit hard 准入拒绝
521
+ await expect(supervisor.executeProcess({
522
+ runId: 'run-c13',
523
+ opId: 'op-c13-cpu',
524
+ name: 'cpu-test',
525
+ command: { execPath: 'echo', args: ['1'], cwd: tempDir },
526
+ requiredResources: ['res:c13:cpu'],
527
+ resourceBudget: { maxCpuTimeMs: 1000, enforcement: 'hard' },
528
+ })).rejects.toThrowError(UnsupportedCapabilityError);
529
+ });
530
+ it('契约 14: 域级总额度与并发排队,超标等待释放后自动放行', async () => {
531
+ const { domain } = ctx;
532
+ // 设置域级最大并发操作数为 1
533
+ domain.setDomainBudget({ maxConcurrentOps: 1 });
534
+ domain.allocateResources('op-first', ['res:op1']);
535
+ // 第二个操作因超过并发数抛出冲突并排队
536
+ expect(() => {
537
+ domain.allocateResources('op-second', ['res:op2']);
538
+ }).toThrowError(ResourceConflictError);
539
+ setTimeout(() => {
540
+ domain.releaseResources('op-first');
541
+ }, 60);
542
+ await domain.allocateResourcesWithWait('op-second', ['res:op2'], 300);
543
+ expect(domain.getResourceOwner('res:op2')).toBe('op-second');
544
+ domain.releaseResources('op-second');
545
+ });
546
+ it('契约 15: 大输出流式落盘转储与 fsync 校验 (Spill to Artifacts)', async () => {
547
+ const { supervisor, domain, tempDir } = ctx;
548
+ ensureTaskAndRun(domain, 'task-c15', 'run-c15');
549
+ const artifactsDir = path.join(tempDir, 'custom-artifacts');
550
+ // 产生 6MB 日志,内存限制 1MB,触发 spill 落盘转储
551
+ const heavyLogScript = `process.stdout.write('A'.repeat(1024 * 1024 * 6));`;
552
+ const result = await supervisor.executeProcess({
553
+ runId: 'run-c15',
554
+ opId: 'op-c15-spill',
555
+ name: 'spill-test',
556
+ command: {
557
+ execPath: process.execPath,
558
+ args: ['-e', heavyLogScript],
559
+ cwd: tempDir,
560
+ },
561
+ requiredResources: ['res:c15'],
562
+ maxOutputBytes: 1 * 1024 * 1024,
563
+ artifactsDir,
564
+ });
565
+ expect(result.status).toBe('succeeded');
566
+ expect(result.isTruncated).toBe(true);
567
+ expect(result.outputRef).toBeDefined();
568
+ expect(result.outputHash).toBeDefined();
569
+ // 1. 内存中严格截断至 1MB 上限
570
+ expect(result.stdout.length).toBeLessThanOrEqual(1 * 1024 * 1024);
571
+ // 2. 验证磁盘上的落盘文件存在且包含完整的 6MB 输出
572
+ expect(fs.existsSync(result.outputRef)).toBe(true);
573
+ const stat = fs.statSync(result.outputRef);
574
+ expect(stat.size).toBeGreaterThanOrEqual(1024 * 1024 * 6);
575
+ // 3. 独立读取物理落盘文件并计算 SHA-256 哈希,比对与流式计算哈希 100% 一致
576
+ const fileBuffer = fs.readFileSync(result.outputRef);
577
+ const expectedHash = crypto.createHash('sha256').update(fileBuffer).digest('hex');
578
+ expect(result.outputHash).toBe(expectedHash);
579
+ });
580
+ });
581
+ }
582
+ //# sourceMappingURL=contract-suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-suite.js","sourceRoot":"","sources":["../../src/testing/contract-suite.ts"],"names":[],"mappings":"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"}