@dharma-ai-labs/agent-fabric 0.2.171 → 0.2.173
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/bootstrapProcessCaller.test.js +2 -1
- package/dist/bootstrapProcessCaller.test.js.map +1 -1
- package/dist/codexSetupDiagnostic.d.ts.map +1 -1
- package/dist/codexSetupDiagnostic.js +4 -0
- package/dist/codexSetupDiagnostic.js.map +1 -1
- package/dist/codexSetupSessionCaller.test.js +80 -66
- package/dist/codexSetupSessionCaller.test.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -33
- package/dist/index.js.map +1 -1
- package/dist/namedSessionStartup.d.ts +2 -0
- package/dist/namedSessionStartup.d.ts.map +1 -1
- package/dist/namedSessionStartup.js +12 -2
- package/dist/namedSessionStartup.js.map +1 -1
- package/dist/namedSessionStartup.test.js +27 -0
- package/dist/namedSessionStartup.test.js.map +1 -1
- package/dist/namedSessionStartupChild.d.ts +19 -0
- package/dist/namedSessionStartupChild.d.ts.map +1 -0
- package/dist/namedSessionStartupChild.js +62 -0
- package/dist/namedSessionStartupChild.js.map +1 -0
- package/dist/namedSessionStartupChild.test.d.ts +2 -0
- package/dist/namedSessionStartupChild.test.d.ts.map +1 -0
- package/dist/namedSessionStartupChild.test.js +80 -0
- package/dist/namedSessionStartupChild.test.js.map +1 -0
- package/dist/repositoryOnboardingCaller.test.js +36 -0
- package/dist/repositoryOnboardingCaller.test.js.map +1 -1
- package/dist/repositorySourceSync.d.ts +5 -0
- package/dist/repositorySourceSync.d.ts.map +1 -1
- package/dist/repositorySourceSync.js +9 -0
- package/dist/repositorySourceSync.js.map +1 -1
- package/dist/repositorySourceSync.test.js +87 -1
- package/dist/repositorySourceSync.test.js.map +1 -1
- package/dist/schemas/codex-setup-failure-diagnostic.schema.json +9 -0
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type NamedSessionStartupFailure } from './namedSessionStartupChild.js';
|
|
1
2
|
export declare function waitForNamedSessionStartup<T>(input: {
|
|
2
3
|
step<R>(operation: () => Promise<R>): Promise<R>;
|
|
3
4
|
assertActive(): Promise<void>;
|
|
@@ -5,5 +6,6 @@ export declare function waitForNamedSessionStartup<T>(input: {
|
|
|
5
6
|
maximumWaitMs?: number;
|
|
6
7
|
now?: () => number;
|
|
7
8
|
sleep?: (milliseconds: number) => Promise<void>;
|
|
9
|
+
readFailure?: () => NamedSessionStartupFailure | undefined;
|
|
8
10
|
}): Promise<T>;
|
|
9
11
|
//# sourceMappingURL=namedSessionStartup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namedSessionStartup.d.ts","sourceRoot":"","sources":["../src/namedSessionStartup.ts"],"names":[],"mappings":"AAAA,wBAAsB,0BAA0B,CAAC,CAAC,EAAE,KAAK,EAAE;IACzD,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"namedSessionStartup.d.ts","sourceRoot":"","sources":["../src/namedSessionStartup.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,0BAA0B,EAAC,MAAM,+BAA+B,CAAC;AAE5G,wBAAsB,0BAA0B,CAAC,CAAC,EAAE,KAAK,EAAE;IACzD,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACjD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,0BAA0B,GAAG,SAAS,CAAC;CAC5D,GAAG,OAAO,CAAC,CAAC,CAAC,CA+Bb"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isNamedSessionStartupFailure } from './namedSessionStartupChild.js';
|
|
1
2
|
export async function waitForNamedSessionStartup(input) {
|
|
2
3
|
const maximumWaitMs = input.maximumWaitMs ?? 120_000;
|
|
3
4
|
if (!Number.isSafeInteger(maximumWaitMs) || maximumWaitMs < 1 || maximumWaitMs > 120_000) {
|
|
@@ -17,12 +18,21 @@ export async function waitForNamedSessionStartup(input) {
|
|
|
17
18
|
const result = await input.step(async () => {
|
|
18
19
|
if (now() >= deadline)
|
|
19
20
|
return { available: false };
|
|
21
|
+
const refuseFailedChild = () => {
|
|
22
|
+
const failure = input.readFailure?.();
|
|
23
|
+
if (failure !== undefined)
|
|
24
|
+
throw new Error(isNamedSessionStartupFailure(failure) ? failure : 'named_session_startup_failed');
|
|
25
|
+
};
|
|
26
|
+
refuseFailedChild();
|
|
27
|
+
let observation;
|
|
20
28
|
try {
|
|
21
|
-
|
|
29
|
+
observation = { available: true, value: await input.observe() };
|
|
22
30
|
}
|
|
23
31
|
catch {
|
|
24
|
-
|
|
32
|
+
observation = { available: false };
|
|
25
33
|
}
|
|
34
|
+
refuseFailedChild();
|
|
35
|
+
return observation;
|
|
26
36
|
});
|
|
27
37
|
if (now() >= deadline)
|
|
28
38
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namedSessionStartup.js","sourceRoot":"","sources":["../src/namedSessionStartup.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAI,
|
|
1
|
+
{"version":3,"file":"namedSessionStartup.js","sourceRoot":"","sources":["../src/namedSessionStartup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,4BAA4B,EAAkC,MAAM,+BAA+B,CAAC;AAE5G,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAI,KAQnD;IACC,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,OAAO,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,IAAI,aAAa,GAAG,OAAO,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,OAAO,CAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,aAAa,CAAC;IACvC,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,GAAG,EAAE,IAAI,QAAQ;YAAE,MAAM;QAC7B,MAAM,KAAK,CAAC,YAAY,EAAE,CAAC;QAC3B,IAAI,GAAG,EAAE,IAAI,QAAQ;YAAE,MAAM;QAC7B,oFAAoF;QACpF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzC,IAAI,GAAG,EAAE,IAAI,QAAQ;gBAAE,OAAO,EAAC,SAAS,EAAE,KAAc,EAAC,CAAC;YAC1D,MAAM,iBAAiB,GAAG,GAAG,EAAE;gBAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACtC,IAAI,OAAO,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC/H,CAAC,CAAC;YACF,iBAAiB,EAAE,CAAC;YACpB,IAAI,WAA6D,CAAC;YAClE,IAAI,CAAC;gBAAA,WAAW,GAAG,EAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,OAAO,EAAE,EAAC,CAAC;YAAA,CAAC;YACpE,MAAM,CAAC;gBAAA,WAAW,GAAG,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC;YAAA,CAAC;YACzC,iBAAiB,EAAE,CAAC;YACpB,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,IAAI,GAAG,EAAE,IAAI,QAAQ;YAAE,MAAM;QAC7B,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAC5C,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -92,4 +92,31 @@ test('deadline reached in step preauthorization admits no observation', async ()
|
|
|
92
92
|
await assert.rejects(waitForNamedSessionStartup(f.input), /named_session_startup_failed/);
|
|
93
93
|
assert.equal(f.effects(), 0);
|
|
94
94
|
});
|
|
95
|
+
test('an owned child failure is preserved rather than hidden behind a full startup timeout', async () => {
|
|
96
|
+
const f = fixture(Infinity, 1000);
|
|
97
|
+
const input = Object.assign(f.input, { readFailure: () => 'named_session_startup_setup_child_unavailable' });
|
|
98
|
+
await assert.rejects(waitForNamedSessionStartup(input), /^Error: named_session_startup_setup_child_unavailable$/);
|
|
99
|
+
assert.equal(f.time(), 250);
|
|
100
|
+
assert.equal(f.effects(), 0);
|
|
101
|
+
});
|
|
102
|
+
test('scope refusal takes priority over inspecting child diagnostics', async () => {
|
|
103
|
+
const f = fixture(Infinity, 1000);
|
|
104
|
+
let diagnosticReads = 0;
|
|
105
|
+
f.input.step = async () => { throw new Error('setup_session_scope_unavailable'); };
|
|
106
|
+
const input = Object.assign(f.input, { readFailure: () => { diagnosticReads++; return 'named_session_startup_child_exited'; } });
|
|
107
|
+
await assert.rejects(waitForNamedSessionStartup(input), /setup_session_scope_unavailable/);
|
|
108
|
+
assert.equal(diagnosticReads, 0);
|
|
109
|
+
});
|
|
110
|
+
test('a child that closes during socket observation cannot produce ready status', async () => {
|
|
111
|
+
const f = fixture(0, 1000);
|
|
112
|
+
let failed = false;
|
|
113
|
+
f.input.observe = async () => { failed = true; return { ok: true }; };
|
|
114
|
+
const input = Object.assign(f.input, { readFailure: () => failed ? 'named_session_startup_child_exited' : undefined });
|
|
115
|
+
await assert.rejects(waitForNamedSessionStartup(input), /named_session_startup_child_exited/);
|
|
116
|
+
});
|
|
117
|
+
test('an unexpected diagnostic value cannot become a secret-bearing error', async () => {
|
|
118
|
+
const f = fixture(0, 1000);
|
|
119
|
+
const input = Object.assign(f.input, { readFailure: () => 'private-secret-placeholder' });
|
|
120
|
+
await assert.rejects(waitForNamedSessionStartup(input), /^Error: named_session_startup_failed$/);
|
|
121
|
+
});
|
|
95
122
|
//# sourceMappingURL=namedSessionStartup.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namedSessionStartup.test.js","sourceRoot":"","sources":["../src/namedSessionStartup.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"namedSessionStartup.test.js","sourceRoot":"","sources":["../src/namedSessionStartup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
declare const classifications: {
|
|
3
|
+
readonly setup_child_unavailable: "named_session_startup_setup_child_unavailable";
|
|
4
|
+
readonly named_session_registration_invalid: "named_session_startup_registration_invalid";
|
|
5
|
+
readonly named_session_provider_authentication_required: "named_session_startup_provider_authentication_required";
|
|
6
|
+
readonly named_session_workspace_write_not_authorized: "named_session_startup_workspace_write_not_authorized";
|
|
7
|
+
readonly named_session_trust_scope_mismatch: "named_session_startup_trust_scope_mismatch";
|
|
8
|
+
readonly codex_session_sandbox_unqualified: "named_session_startup_sandbox_unqualified";
|
|
9
|
+
};
|
|
10
|
+
export type NamedSessionStartupFailure = typeof classifications[keyof typeof classifications] | 'named_session_startup_child_spawn_failed' | 'named_session_startup_child_exited' | 'named_session_startup_child_failed';
|
|
11
|
+
export declare function isNamedSessionStartupFailure(value: unknown): value is NamedSessionStartupFailure;
|
|
12
|
+
/** Observe only the freshly spawned handle. Raw stderr stays bounded in memory,
|
|
13
|
+
* never reaches logs/receipts, and is discarded when startup observation ends. */
|
|
14
|
+
export declare function observeNamedSessionStartupChild(child: ChildProcess): Readonly<{
|
|
15
|
+
readFailure: () => NamedSessionStartupFailure | undefined;
|
|
16
|
+
dispose(): void;
|
|
17
|
+
}>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=namedSessionStartupChild.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionStartupChild.d.ts","sourceRoot":"","sources":["../src/namedSessionStartupChild.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAGrD,QAAA,MAAM,eAAe;;;;;;;CAOX,CAAC;AACX,MAAM,MAAM,0BAA0B,GAAG,OAAO,eAAe,CAAC,MAAM,OAAO,eAAe,CAAC,GACzF,0CAA0C,GAAG,oCAAoC,GACjF,oCAAoC,CAAC;AAGzC,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,0BAA0B,CAEhG;AAED;kFACkF;AAClF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,YAAY;;;GA4BlE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const classifications = {
|
|
2
|
+
setup_child_unavailable: 'named_session_startup_setup_child_unavailable',
|
|
3
|
+
named_session_registration_invalid: 'named_session_startup_registration_invalid',
|
|
4
|
+
named_session_provider_authentication_required: 'named_session_startup_provider_authentication_required',
|
|
5
|
+
named_session_workspace_write_not_authorized: 'named_session_startup_workspace_write_not_authorized',
|
|
6
|
+
named_session_trust_scope_mismatch: 'named_session_startup_trust_scope_mismatch',
|
|
7
|
+
codex_session_sandbox_unqualified: 'named_session_startup_sandbox_unqualified',
|
|
8
|
+
};
|
|
9
|
+
const codes = new Set([...Object.values(classifications), 'named_session_startup_child_spawn_failed',
|
|
10
|
+
'named_session_startup_child_exited', 'named_session_startup_child_failed']);
|
|
11
|
+
export function isNamedSessionStartupFailure(value) {
|
|
12
|
+
return typeof value === 'string' && codes.has(value);
|
|
13
|
+
}
|
|
14
|
+
/** Observe only the freshly spawned handle. Raw stderr stays bounded in memory,
|
|
15
|
+
* never reaches logs/receipts, and is discarded when startup observation ends. */
|
|
16
|
+
export function observeNamedSessionStartupChild(child) {
|
|
17
|
+
const buffer = Buffer.alloc(4096);
|
|
18
|
+
let length = 0, overflow = false, disposed = false, failure;
|
|
19
|
+
const data = (chunk) => {
|
|
20
|
+
if (disposed || overflow)
|
|
21
|
+
return;
|
|
22
|
+
const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
23
|
+
if (length + bytes.length > buffer.length) {
|
|
24
|
+
overflow = true;
|
|
25
|
+
buffer.fill(0);
|
|
26
|
+
length = 0;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
bytes.copy(buffer, length);
|
|
30
|
+
length += bytes.length;
|
|
31
|
+
};
|
|
32
|
+
const error = () => { failure = 'named_session_startup_child_spawn_failed'; };
|
|
33
|
+
const close = (exit) => {
|
|
34
|
+
if (failure)
|
|
35
|
+
return;
|
|
36
|
+
failure = exit === 0 || exit === null ? 'named_session_startup_child_exited' : 'named_session_startup_child_failed';
|
|
37
|
+
if (!overflow && exit !== 0 && exit !== null) {
|
|
38
|
+
const last = buffer.subarray(0, length).toString('utf8').trim().split(/\r?\n/).at(-1);
|
|
39
|
+
if (last && Object.hasOwn(classifications, last))
|
|
40
|
+
failure = classifications[last];
|
|
41
|
+
}
|
|
42
|
+
buffer.fill(0);
|
|
43
|
+
length = 0;
|
|
44
|
+
};
|
|
45
|
+
child.stderr?.on('data', data);
|
|
46
|
+
child.on('error', error);
|
|
47
|
+
child.on('close', close);
|
|
48
|
+
return Object.freeze({ readFailure: () => failure, dispose() {
|
|
49
|
+
if (disposed)
|
|
50
|
+
return;
|
|
51
|
+
disposed = true;
|
|
52
|
+
buffer.fill(0);
|
|
53
|
+
length = 0;
|
|
54
|
+
child.stderr?.removeListener('data', data);
|
|
55
|
+
child.removeListener('error', error);
|
|
56
|
+
child.removeListener('close', close);
|
|
57
|
+
child.stderr?.resume();
|
|
58
|
+
// A detached worker's diagnostic pipe must not keep its launcher alive.
|
|
59
|
+
child.stderr?.unref?.();
|
|
60
|
+
} });
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=namedSessionStartupChild.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionStartupChild.js","sourceRoot":"","sources":["../src/namedSessionStartupChild.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionStartupChild.test.d.ts","sourceRoot":"","sources":["../src/namedSessionStartupChild.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { execFile, spawn } from 'node:child_process';
|
|
3
|
+
import { EventEmitter, once } from 'node:events';
|
|
4
|
+
import { PassThrough } from 'node:stream';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
import { isNamedSessionStartupFailure, observeNamedSessionStartupChild } from './namedSessionStartupChild.js';
|
|
8
|
+
function fixture() {
|
|
9
|
+
const child = Object.assign(new EventEmitter(), { stderr: new PassThrough() });
|
|
10
|
+
return { child, observed: observeNamedSessionStartupChild(child) };
|
|
11
|
+
}
|
|
12
|
+
test('real owned subprocess classifies an exact fixed startup error without exposing raw stderr', async () => {
|
|
13
|
+
const child = spawn(process.execPath, ['-e', 'process.stderr.write("setup_child_unavailable\\n");process.exitCode=2'], { stdio: ['ignore', 'ignore', 'pipe'] });
|
|
14
|
+
const observed = observeNamedSessionStartupChild(child);
|
|
15
|
+
try {
|
|
16
|
+
await once(child, 'close');
|
|
17
|
+
assert.equal(observed.readFailure(), 'named_session_startup_setup_child_unavailable');
|
|
18
|
+
assert.deepEqual(Object.keys(observed).sort(), ['dispose', 'readFailure']);
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
observed.dispose();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
for (const content of ['password=secret-placeholder', 'setup_child_unavailable secret-placeholder',
|
|
25
|
+
'x'.repeat(4097) + '\nsetup_child_unavailable', '\u0000setup_child_unavailable']) {
|
|
26
|
+
test(`private or oversized stderr is withheld (${content.length} bytes)`, () => {
|
|
27
|
+
const f = fixture();
|
|
28
|
+
f.child.stderr.write(content);
|
|
29
|
+
f.child.emit('close', 2);
|
|
30
|
+
assert.equal(f.observed.readFailure(), 'named_session_startup_child_failed');
|
|
31
|
+
assert.equal(JSON.stringify(f.observed).includes('secret-placeholder'), false);
|
|
32
|
+
f.observed.dispose();
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
test('a live child is never declared stopped from stderr alone', () => {
|
|
36
|
+
const f = fixture();
|
|
37
|
+
f.child.stderr.write('setup_child_unavailable\n');
|
|
38
|
+
assert.equal(f.observed.readFailure(), undefined);
|
|
39
|
+
f.observed.dispose();
|
|
40
|
+
});
|
|
41
|
+
test('clean exit before readiness and spawn error have distinct fixed categories', () => {
|
|
42
|
+
const a = fixture();
|
|
43
|
+
a.child.emit('close', 0);
|
|
44
|
+
assert.equal(a.observed.readFailure(), 'named_session_startup_child_exited');
|
|
45
|
+
a.observed.dispose();
|
|
46
|
+
const b = fixture();
|
|
47
|
+
b.child.emit('error', new Error('secret-placeholder'));
|
|
48
|
+
b.child.emit('close', -1);
|
|
49
|
+
assert.equal(b.observed.readFailure(), 'named_session_startup_child_spawn_failed');
|
|
50
|
+
b.observed.dispose();
|
|
51
|
+
});
|
|
52
|
+
test('disposal removes only these listeners and drains without collecting subsequent output', () => {
|
|
53
|
+
const f = fixture();
|
|
54
|
+
const sibling = () => { };
|
|
55
|
+
f.child.on('close', sibling);
|
|
56
|
+
f.observed.dispose();
|
|
57
|
+
f.observed.dispose();
|
|
58
|
+
f.child.stderr.write('setup_child_unavailable\n');
|
|
59
|
+
f.child.emit('close', 2);
|
|
60
|
+
assert.equal(f.observed.readFailure(), undefined);
|
|
61
|
+
assert.deepEqual(f.child.listeners('close'), [sibling]);
|
|
62
|
+
assert.equal(f.child.stderr.listenerCount('data'), 0);
|
|
63
|
+
});
|
|
64
|
+
test('only exact fixed diagnostic codes qualify; private strings are rejected', () => {
|
|
65
|
+
assert.equal(isNamedSessionStartupFailure('named_session_startup_child_failed'), true);
|
|
66
|
+
for (const value of ['secret-placeholder', 'named_session_startup_child_failed\nsecret', {}, null])
|
|
67
|
+
assert.equal(isNamedSessionStartupFailure(value), false);
|
|
68
|
+
});
|
|
69
|
+
test('disposing a live detached worker pipe lets the original launcher exit normally', async () => {
|
|
70
|
+
const moduleUrl = new URL('./namedSessionStartupChild.js', import.meta.url).href;
|
|
71
|
+
const source = `import {spawn} from 'node:child_process';
|
|
72
|
+
import {observeNamedSessionStartupChild} from ${JSON.stringify(moduleUrl)};
|
|
73
|
+
const child=spawn(process.execPath,['-e','setTimeout(()=>{},5000)'],{detached:true,stdio:['ignore','ignore','pipe']});
|
|
74
|
+
process.once('SIGTERM',()=>{child.kill('SIGTERM');process.exitCode=1;});
|
|
75
|
+
const observed=observeNamedSessionStartupChild(child);observed.dispose();child.unref();
|
|
76
|
+
console.log('startup_observation_disposed');`;
|
|
77
|
+
const result = await promisify(execFile)(process.execPath, ['--input-type=module', '-e', source], { timeout: 2000 });
|
|
78
|
+
assert.equal(result.stdout.trim(), 'startup_observation_disposed');
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=namedSessionStartupChild.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionStartupChild.test.js","sourceRoot":"","sources":["../src/namedSessionStartupChild.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -405,6 +405,42 @@ function bootstrapFlags(complete = false) {
|
|
|
405
405
|
flags.set('complete', true);
|
|
406
406
|
return flags;
|
|
407
407
|
}
|
|
408
|
+
test('public claim approval prints the validated device fingerprint rather than decoding challenge fields', async () => {
|
|
409
|
+
for (const noBrowser of [false, true]) {
|
|
410
|
+
const f = bootstrapDependencies({});
|
|
411
|
+
const messages = [];
|
|
412
|
+
f.dependencies.process = { platform: 'linux', env: { USER: 'fixture' },
|
|
413
|
+
stderr: { write: (message) => { messages.push(message); return true; } } };
|
|
414
|
+
const approval = {
|
|
415
|
+
url: 'https://fixture.invalid/portal/agent-fabric/setup-claim-approval#request=public_fixture',
|
|
416
|
+
expiresAt: '2026-10-07T20:12:27.938Z',
|
|
417
|
+
fingerprint: `sha256:${'b'.repeat(64)}`,
|
|
418
|
+
repositoryFingerprint: `sha256:${'e'.repeat(64)}`,
|
|
419
|
+
};
|
|
420
|
+
f.dependencies.claimSetupReference = async (input) => {
|
|
421
|
+
await input.onRecipientApprovalRequired(approval);
|
|
422
|
+
throw new Error('approval_fixture_stop_before_enrollment');
|
|
423
|
+
};
|
|
424
|
+
const flags = bootstrapFlags(true);
|
|
425
|
+
flags.delete('grant');
|
|
426
|
+
flags.set('setup-reference', '11111111-1111-4111-8111-111111111111');
|
|
427
|
+
flags.set('setup-recipient-membership-id', '22222222-2222-4222-8222-222222222222');
|
|
428
|
+
flags.set('setup-scope-digest', `sha256:${'d'.repeat(64)}`);
|
|
429
|
+
flags.set('setup-contract-digest', `sha256:${'a'.repeat(64)}`);
|
|
430
|
+
if (noBrowser)
|
|
431
|
+
flags.set('no-browser', true);
|
|
432
|
+
await assert.rejects((await caller('bootstrap', f.dependencies))(flags), /approval_fixture_stop_before_enrollment/);
|
|
433
|
+
const output = messages.join('');
|
|
434
|
+
assert.ok(output.includes(`Device fingerprint: ${approval.fingerprint}`));
|
|
435
|
+
assert.ok(output.includes(`Repository fingerprint: ${approval.repositoryFingerprint}`));
|
|
436
|
+
assert.ok(output.includes(approval.expiresAt));
|
|
437
|
+
assert.ok(output.includes(approval.url));
|
|
438
|
+
assert.doesNotMatch(output, /fixture_token|fixture_private_grant|privateJwk|authenticator/);
|
|
439
|
+
assert.equal(f.calls.filter(name => name === 'open_approval').length, noBrowser ? 0 : 1);
|
|
440
|
+
assert.equal(f.calls.includes('save_token'), false);
|
|
441
|
+
assert.equal(f.calls.includes('onboard'), false);
|
|
442
|
+
}
|
|
443
|
+
});
|
|
408
444
|
test('private grant entry follows preflight, uses the unchanged redemption scope and stays out of onboard flags', async () => {
|
|
409
445
|
const f = bootstrapDependencies({ ok: true, stage: 'ready', localStage: 'ready', sharedRepositoryReady: true });
|
|
410
446
|
const flags = bootstrapFlags();
|