@dharma-ai-labs/agent-fabric 0.2.206 → 0.2.207
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/bootstrapHostScope.test.js +2 -1
- package/dist/bootstrapHostScope.test.js.map +1 -1
- package/dist/bootstrapVaultScope.test.js +32 -1
- package/dist/bootstrapVaultScope.test.js.map +1 -1
- package/dist/codexInboxSession.d.ts +1 -1
- package/dist/cooperativeInboxSession.d.ts +1 -1
- package/dist/demoPeer.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -3
- package/dist/index.js.map +1 -1
- package/dist/namedSessionAdmission.d.ts +23 -0
- package/dist/namedSessionAdmission.d.ts.map +1 -0
- package/dist/namedSessionAdmission.js +120 -0
- package/dist/namedSessionAdmission.js.map +1 -0
- package/dist/namedSessionAdmission.test.d.ts +2 -0
- package/dist/namedSessionAdmission.test.d.ts.map +1 -0
- package/dist/namedSessionAdmission.test.js +151 -0
- package/dist/namedSessionAdmission.test.js.map +1 -0
- package/dist/namedSessionMaintenance.d.ts +49 -0
- package/dist/namedSessionMaintenance.d.ts.map +1 -0
- package/dist/namedSessionMaintenance.js +79 -0
- package/dist/namedSessionMaintenance.js.map +1 -0
- package/dist/namedSessionMaintenance.test.d.ts +2 -0
- package/dist/namedSessionMaintenance.test.d.ts.map +1 -0
- package/dist/namedSessionMaintenance.test.js +141 -0
- package/dist/namedSessionMaintenance.test.js.map +1 -0
- package/dist/namedSessionService.d.ts +5 -0
- package/dist/namedSessionService.d.ts.map +1 -1
- package/dist/namedSessionService.js +106 -32
- package/dist/namedSessionService.js.map +1 -1
- package/dist/namedSessionService.test.js +58 -3
- package/dist/namedSessionService.test.js.map +1 -1
- package/dist/providerSessionReplyRecovery.d.ts +1 -1
- package/dist/schemas/named-session-maintenance.schema.json +38 -0
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { NamedSessionRegistration } from './namedSessionService.js';
|
|
2
|
+
export declare function assertNamedSessionStartupRegistration(expected: NamedSessionRegistration | null, current: NamedSessionRegistration | null): void;
|
|
3
|
+
export declare class NamedSessionAdmission {
|
|
4
|
+
#private;
|
|
5
|
+
snapshot(): {
|
|
6
|
+
generation: `${string}-${string}-${string}-${string}-${string}`;
|
|
7
|
+
fenceId: string | null;
|
|
8
|
+
state: "draining" | "quiescing" | "resuming" | "stopping" | "quiesced" | "open";
|
|
9
|
+
pending: number;
|
|
10
|
+
};
|
|
11
|
+
enqueue<T>(operation: () => Promise<T>, settled?: () => Promise<void>): Promise<T>;
|
|
12
|
+
quiesce(fenceId: string, generation: string, persist?: () => Promise<void>): Promise<{
|
|
13
|
+
generation: `${string}-${string}-${string}-${string}-${string}`;
|
|
14
|
+
fenceId: string;
|
|
15
|
+
state: "quiesced";
|
|
16
|
+
pending: number;
|
|
17
|
+
}>;
|
|
18
|
+
resume(fenceId: string, generation: string, persist?: () => Promise<void>): Promise<void>;
|
|
19
|
+
stopDrained(fenceId: string, generation: string, verifyDurablePause?: () => Promise<void>): Promise<void>;
|
|
20
|
+
stop(): void;
|
|
21
|
+
settled(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=namedSessionAdmission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionAdmission.d.ts","sourceRoot":"","sources":["../src/namedSessionAdmission.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,0BAA0B,CAAC;AAIvE,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,EAC7F,OAAO,EAAE,wBAAwB,GAAG,IAAI,QASzC;AAID,qBAAa,qBAAqB;;IAShC,QAAQ;;;;;;IAKR,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,MAAM,OAAO,CAAC,IAAI,CAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAyB5F,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,OAAO,CAAC,IAAI,CAAkB;;;;;;IAsB1F,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,OAAO,CAAC,IAAI,CAAkB;IAUzF,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,GAAE,MAAM,OAAO,CAAC,IAAI,CAAkB;IAS/G,IAAI;IAKJ,OAAO;CACR"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$(?![\s\S])/i;
|
|
3
|
+
export function assertNamedSessionStartupRegistration(expected, current) {
|
|
4
|
+
if (current?.maintenanceFence)
|
|
5
|
+
throw new Error('named_session_quiesced');
|
|
6
|
+
if (current && !current.enabled)
|
|
7
|
+
throw new Error('named_session_disabled');
|
|
8
|
+
if (!expected && !current)
|
|
9
|
+
return;
|
|
10
|
+
const keys = ['schema', 'name', 'bindingId', 'maximumCostCents', 'maximumTurnCostCents', 'enabled'];
|
|
11
|
+
if (!expected || !current || keys.some(key => current[key] !== expected[key])
|
|
12
|
+
|| Object.entries(expected.identity).some(([key, value]) => current.identity[key] !== value)) {
|
|
13
|
+
throw new Error('named_session_startup_scope_changed');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// The fence is checked in the same event-loop turn that admits local work or an inbox poll.
|
|
17
|
+
// It never expires automatically: only its owner can resume it, or stop the drained service.
|
|
18
|
+
export class NamedSessionAdmission {
|
|
19
|
+
#generation = randomUUID();
|
|
20
|
+
#fenceId = null;
|
|
21
|
+
#drained = false;
|
|
22
|
+
#stopped = false;
|
|
23
|
+
#transition = null;
|
|
24
|
+
#pending = 0;
|
|
25
|
+
#serial = Promise.resolve();
|
|
26
|
+
snapshot() {
|
|
27
|
+
const state = this.#transition ?? (this.#fenceId ? this.#drained ? 'quiesced' : 'draining' : 'open');
|
|
28
|
+
return { generation: this.#generation, fenceId: this.#fenceId, state, pending: this.#pending };
|
|
29
|
+
}
|
|
30
|
+
enqueue(operation, settled = async () => { }) {
|
|
31
|
+
if (this.#stopped)
|
|
32
|
+
return Promise.reject(new Error('named_session_stopped'));
|
|
33
|
+
if (this.#fenceId)
|
|
34
|
+
return Promise.reject(new Error('named_session_quiesced'));
|
|
35
|
+
if (this.#pending >= 8)
|
|
36
|
+
return Promise.reject(new Error('named_session_busy'));
|
|
37
|
+
this.#pending++;
|
|
38
|
+
const result = this.#serial.then(async () => {
|
|
39
|
+
try {
|
|
40
|
+
if (this.#stopped)
|
|
41
|
+
throw new Error('named_session_stopped');
|
|
42
|
+
return await operation();
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
this.#pending--;
|
|
46
|
+
await settled();
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
this.#serial = result.then(() => undefined, () => undefined);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
#check(fenceId, generation) {
|
|
53
|
+
if (!uuid.test(fenceId))
|
|
54
|
+
throw new Error('named_session_fence_invalid');
|
|
55
|
+
if (generation !== this.#generation)
|
|
56
|
+
throw new Error('named_session_generation_changed');
|
|
57
|
+
if (this.#stopped)
|
|
58
|
+
throw new Error('named_session_stopped');
|
|
59
|
+
if (this.#transition)
|
|
60
|
+
throw new Error('named_session_maintenance_busy');
|
|
61
|
+
}
|
|
62
|
+
async quiesce(fenceId, generation, persist = async () => { }) {
|
|
63
|
+
this.#check(fenceId, generation);
|
|
64
|
+
if (this.#fenceId && this.#fenceId !== fenceId)
|
|
65
|
+
throw new Error('named_session_fence_conflict');
|
|
66
|
+
this.#fenceId = fenceId;
|
|
67
|
+
await this.#serial;
|
|
68
|
+
this.#check(fenceId, generation);
|
|
69
|
+
if (this.#fenceId !== fenceId)
|
|
70
|
+
throw new Error('named_session_fence_conflict');
|
|
71
|
+
if (this.#pending !== 0)
|
|
72
|
+
throw new Error('named_session_not_drained');
|
|
73
|
+
this.#drained = true;
|
|
74
|
+
this.#transition = 'quiescing';
|
|
75
|
+
try {
|
|
76
|
+
await persist();
|
|
77
|
+
return { generation: this.#generation, fenceId, state: 'quiesced', pending: 0 };
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
this.#transition = null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
#checkDrained(fenceId, generation) {
|
|
84
|
+
this.#check(fenceId, generation);
|
|
85
|
+
if (this.#fenceId !== fenceId)
|
|
86
|
+
throw new Error('named_session_fence_conflict');
|
|
87
|
+
if (!this.#drained || this.#pending !== 0)
|
|
88
|
+
throw new Error('named_session_not_drained');
|
|
89
|
+
}
|
|
90
|
+
async resume(fenceId, generation, persist = async () => { }) {
|
|
91
|
+
this.#checkDrained(fenceId, generation);
|
|
92
|
+
this.#transition = 'resuming';
|
|
93
|
+
try {
|
|
94
|
+
await persist();
|
|
95
|
+
this.#fenceId = null;
|
|
96
|
+
this.#drained = false;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
this.#transition = null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async stopDrained(fenceId, generation, verifyDurablePause = async () => { }) {
|
|
103
|
+
this.#checkDrained(fenceId, generation);
|
|
104
|
+
this.#transition = 'stopping';
|
|
105
|
+
try {
|
|
106
|
+
await verifyDurablePause();
|
|
107
|
+
this.#stopped = true;
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
this.#transition = null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
stop() {
|
|
114
|
+
if (this.#fenceId)
|
|
115
|
+
throw new Error('named_session_fence_required');
|
|
116
|
+
this.#stopped = true;
|
|
117
|
+
}
|
|
118
|
+
settled() { return this.#serial; }
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=namedSessionAdmission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionAdmission.js","sourceRoot":"","sources":["../src/namedSessionAdmission.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionAdmission.test.d.ts","sourceRoot":"","sources":["../src/namedSessionAdmission.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import test from 'node:test';
|
|
4
|
+
import { assertNamedSessionStartupRegistration, NamedSessionAdmission } from './namedSessionAdmission.js';
|
|
5
|
+
function deferred() {
|
|
6
|
+
let resolve;
|
|
7
|
+
const promise = new Promise(done => { resolve = done; });
|
|
8
|
+
return { promise, resolve };
|
|
9
|
+
}
|
|
10
|
+
test('quiesce fences new local and peer work synchronously and drains admitted work without cancellation', async () => {
|
|
11
|
+
const admission = new NamedSessionAdmission(), started = deferred(), finish = deferred();
|
|
12
|
+
let completed = false, lateRuns = 0;
|
|
13
|
+
const work = admission.enqueue(async () => { started.resolve(); await finish.promise; completed = true; });
|
|
14
|
+
await started.promise;
|
|
15
|
+
const fenceId = randomUUID(), generation = admission.snapshot().generation;
|
|
16
|
+
let drained = false;
|
|
17
|
+
const quiesce = admission.quiesce(fenceId, generation).then(receipt => { drained = true; return receipt; });
|
|
18
|
+
assert.equal(admission.snapshot().state, 'draining');
|
|
19
|
+
await assert.rejects(admission.enqueue(async () => { lateRuns++; }), /named_session_quiesced/);
|
|
20
|
+
await assert.rejects(admission.enqueue(async () => { lateRuns++; }), /named_session_quiesced/);
|
|
21
|
+
assert.equal(drained, false);
|
|
22
|
+
assert.equal(completed, false);
|
|
23
|
+
assert.equal(lateRuns, 0);
|
|
24
|
+
await assert.rejects(admission.stopDrained(fenceId, generation), /named_session_not_drained/);
|
|
25
|
+
await assert.rejects(admission.resume(fenceId, generation), /named_session_not_drained/);
|
|
26
|
+
finish.resolve();
|
|
27
|
+
await work;
|
|
28
|
+
assert.deepEqual(await quiesce, { generation, fenceId, state: 'quiesced', pending: 0 });
|
|
29
|
+
assert.equal(completed, true);
|
|
30
|
+
assert.equal(lateRuns, 0);
|
|
31
|
+
await admission.stopDrained(fenceId, generation);
|
|
32
|
+
await assert.rejects(admission.enqueue(async () => { lateRuns++; }), /named_session_stopped/);
|
|
33
|
+
assert.equal(lateRuns, 0);
|
|
34
|
+
});
|
|
35
|
+
test('quiesce drains queued admitted work and preserves a failed operation without replay', async () => {
|
|
36
|
+
const admission = new NamedSessionAdmission(), first = deferred(), started = deferred();
|
|
37
|
+
const runs = [];
|
|
38
|
+
const work = admission.enqueue(async () => { runs.push('first'); started.resolve(); await first.promise; });
|
|
39
|
+
await started.promise;
|
|
40
|
+
const failed = admission.enqueue(async () => { runs.push('failed'); throw Error('expected-failure'); });
|
|
41
|
+
const failure = assert.rejects(failed, /expected-failure/);
|
|
42
|
+
const final = admission.enqueue(async () => { runs.push('final'); });
|
|
43
|
+
const fenceId = randomUUID(), generation = admission.snapshot().generation;
|
|
44
|
+
const quiesce = admission.quiesce(fenceId, generation);
|
|
45
|
+
first.resolve();
|
|
46
|
+
await Promise.all([work, failure, final, quiesce]);
|
|
47
|
+
assert.deepEqual(runs, ['first', 'failed', 'final']);
|
|
48
|
+
assert.equal(admission.snapshot().pending, 0);
|
|
49
|
+
await admission.resume(fenceId, generation);
|
|
50
|
+
await admission.enqueue(async () => { runs.push('resumed'); });
|
|
51
|
+
assert.deepEqual(runs, ['first', 'failed', 'final', 'resumed']);
|
|
52
|
+
});
|
|
53
|
+
test('fences are generation-bound, idempotent and cannot be displaced or silently expired', async () => {
|
|
54
|
+
const admission = new NamedSessionAdmission(), fenceId = randomUUID(), generation = admission.snapshot().generation;
|
|
55
|
+
const first = await admission.quiesce(fenceId, generation);
|
|
56
|
+
assert.deepEqual(await admission.quiesce(fenceId, generation), first);
|
|
57
|
+
await assert.rejects(admission.quiesce(randomUUID(), generation), /named_session_fence_conflict/);
|
|
58
|
+
await assert.rejects(admission.quiesce(fenceId, randomUUID()), /named_session_generation_changed/);
|
|
59
|
+
await assert.rejects(admission.resume(randomUUID(), generation), /named_session_fence_conflict/);
|
|
60
|
+
await assert.rejects(admission.stopDrained(fenceId, randomUUID()), /named_session_generation_changed/);
|
|
61
|
+
assert.throws(() => admission.stop(), /named_session_fence_required/);
|
|
62
|
+
assert.equal(admission.snapshot().state, 'quiesced');
|
|
63
|
+
await admission.resume(fenceId, generation);
|
|
64
|
+
assert.equal(admission.snapshot().state, 'open');
|
|
65
|
+
await assert.rejects(admission.stopDrained(fenceId, generation), /named_session_fence_conflict/);
|
|
66
|
+
const replacement = new NamedSessionAdmission();
|
|
67
|
+
assert.notEqual(replacement.snapshot().generation, generation);
|
|
68
|
+
await assert.rejects(replacement.stopDrained(fenceId, generation), /named_session_generation_changed/);
|
|
69
|
+
});
|
|
70
|
+
test('invalid fence input and queue overflow have no admission effect', async () => {
|
|
71
|
+
const admission = new NamedSessionAdmission(), hold = deferred();
|
|
72
|
+
const generation = admission.snapshot().generation;
|
|
73
|
+
for (const value of ['', '../foreign', 'private-fixture', randomUUID() + '\n']) {
|
|
74
|
+
await assert.rejects(admission.quiesce(value, generation), /named_session_fence_invalid/);
|
|
75
|
+
assert.equal(admission.snapshot().state, 'open');
|
|
76
|
+
}
|
|
77
|
+
const pending = Array.from({ length: 8 }, () => admission.enqueue(() => hold.promise));
|
|
78
|
+
await assert.rejects(admission.enqueue(async () => { }), /named_session_busy/);
|
|
79
|
+
assert.equal(admission.snapshot().pending, 8);
|
|
80
|
+
hold.resolve();
|
|
81
|
+
await Promise.all(pending);
|
|
82
|
+
assert.equal(admission.snapshot().pending, 0);
|
|
83
|
+
});
|
|
84
|
+
test('the drained receipt waits for final evidence/health settlement, not merely provider return', async () => {
|
|
85
|
+
const admission = new NamedSessionAdmission(), settlement = deferred(), settling = deferred();
|
|
86
|
+
const work = admission.enqueue(async () => 'completed', async () => { settling.resolve(); await settlement.promise; });
|
|
87
|
+
await settling.promise;
|
|
88
|
+
const fenceId = randomUUID(), generation = admission.snapshot().generation;
|
|
89
|
+
let drained = false;
|
|
90
|
+
const quiesce = admission.quiesce(fenceId, generation).then(value => { drained = true; return value; });
|
|
91
|
+
await Promise.resolve();
|
|
92
|
+
assert.equal(drained, false);
|
|
93
|
+
await assert.rejects(admission.stopDrained(fenceId, generation), /named_session_not_drained/);
|
|
94
|
+
settlement.resolve();
|
|
95
|
+
assert.equal(await work, 'completed');
|
|
96
|
+
await quiesce;
|
|
97
|
+
await admission.stopDrained(fenceId, generation);
|
|
98
|
+
});
|
|
99
|
+
test('failed durable stop leaves the drained owner recoverable instead of permanently stopped', async () => {
|
|
100
|
+
const admission = new NamedSessionAdmission(), fenceId = randomUUID(), generation = admission.snapshot().generation;
|
|
101
|
+
await admission.quiesce(fenceId, generation);
|
|
102
|
+
let writes = 0;
|
|
103
|
+
await assert.rejects(admission.stopDrained(fenceId, generation, async () => {
|
|
104
|
+
writes++;
|
|
105
|
+
throw Error('durable-disable-failed');
|
|
106
|
+
}), /durable-disable-failed/);
|
|
107
|
+
assert.equal(writes, 1);
|
|
108
|
+
assert.equal(admission.snapshot().state, 'quiesced');
|
|
109
|
+
await assert.rejects(admission.enqueue(async () => { }), /named_session_quiesced/);
|
|
110
|
+
await admission.resume(fenceId, generation, async () => { writes++; });
|
|
111
|
+
await admission.enqueue(async () => { writes++; });
|
|
112
|
+
assert.equal(writes, 3);
|
|
113
|
+
});
|
|
114
|
+
test('durable maintenance transitions reject concurrent resume or stop until readback completes', async () => {
|
|
115
|
+
const admission = new NamedSessionAdmission(), fenceId = randomUUID(), generation = admission.snapshot().generation;
|
|
116
|
+
await admission.quiesce(fenceId, generation);
|
|
117
|
+
const persist = deferred(), started = deferred();
|
|
118
|
+
const stop = admission.stopDrained(fenceId, generation, async () => { started.resolve(); await persist.promise; });
|
|
119
|
+
await started.promise;
|
|
120
|
+
await assert.rejects(admission.resume(fenceId, generation), /named_session_maintenance_busy/);
|
|
121
|
+
await assert.rejects(admission.stopDrained(fenceId, generation), /named_session_maintenance_busy/);
|
|
122
|
+
await assert.rejects(admission.enqueue(async () => { }), /named_session_quiesced/);
|
|
123
|
+
persist.resolve();
|
|
124
|
+
await stop;
|
|
125
|
+
await assert.rejects(admission.enqueue(async () => { }), /named_session_stopped/);
|
|
126
|
+
});
|
|
127
|
+
test('a stale enabled startup snapshot cannot reopen a durably paused generation', () => {
|
|
128
|
+
const registration = { schema: 'dharma.named-session/v1', name: 'reviewer',
|
|
129
|
+
bindingId: randomUUID(), enabled: true, maximumCostCents: 100, maximumTurnCostCents: 25,
|
|
130
|
+
identity: { organizationId: 'org_test', repositoryBindingId: randomUUID(), workspaceId: randomUUID(),
|
|
131
|
+
endpointId: randomUUID(), membershipId: randomUUID(), deviceId: randomUUID(), provider: 'codex' } };
|
|
132
|
+
assertNamedSessionStartupRegistration(registration, { ...registration });
|
|
133
|
+
assertNamedSessionStartupRegistration(null, null);
|
|
134
|
+
let providerOpens = 0;
|
|
135
|
+
assert.throws(() => {
|
|
136
|
+
assertNamedSessionStartupRegistration(registration, { ...registration, enabled: false });
|
|
137
|
+
providerOpens++;
|
|
138
|
+
}, /named_session_disabled/);
|
|
139
|
+
assert.equal(providerOpens, 0);
|
|
140
|
+
for (const ownerStatus of ['unavailable', 'crashed']) {
|
|
141
|
+
const paused = { ...registration, enabled: false, maintenanceFence: { fenceId: randomUUID(), generation: randomUUID() } };
|
|
142
|
+
assert.throws(() => assertNamedSessionStartupRegistration(registration, paused), { message: 'named_session_quiesced' }, ownerStatus);
|
|
143
|
+
}
|
|
144
|
+
for (const current of [null, { ...registration, bindingId: randomUUID() },
|
|
145
|
+
{ ...registration, identity: { ...registration.identity, deviceId: randomUUID() } },
|
|
146
|
+
{ ...registration, maximumCostCents: 200 }]) {
|
|
147
|
+
assert.throws(() => assertNamedSessionStartupRegistration(registration, current), /named_session_startup_scope_changed/);
|
|
148
|
+
}
|
|
149
|
+
assert.throws(() => assertNamedSessionStartupRegistration(null, registration), /named_session_startup_scope_changed/);
|
|
150
|
+
});
|
|
151
|
+
//# sourceMappingURL=namedSessionAdmission.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionAdmission.test.js","sourceRoot":"","sources":["../src/namedSessionAdmission.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { NamedSessionRegistration } from './namedSessionService.js';
|
|
2
|
+
import type { LocalProviderSessionBinding } from '@dharma-ai-labs/agent-fabric-local-vault';
|
|
3
|
+
export declare function maintainNamedSession(input: {
|
|
4
|
+
action: 'quiesce' | 'resume' | 'stop-drained';
|
|
5
|
+
fenceId: string;
|
|
6
|
+
registration: NamedSessionRegistration;
|
|
7
|
+
request(body: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
8
|
+
}): Promise<Record<string, unknown>>;
|
|
9
|
+
export declare function recoverStoppedNamedSession(input: {
|
|
10
|
+
registration: NamedSessionRegistration;
|
|
11
|
+
fenceId: string;
|
|
12
|
+
workspace: string;
|
|
13
|
+
processState(): Promise<'running' | 'stopped' | 'unknown'>;
|
|
14
|
+
readRegistration(): Promise<NamedSessionRegistration | null>;
|
|
15
|
+
readBinding(): Promise<LocalProviderSessionBinding | null>;
|
|
16
|
+
saveRegistration(value: NamedSessionRegistration): Promise<void>;
|
|
17
|
+
now?: () => Date;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
action: string;
|
|
20
|
+
fenceId: string;
|
|
21
|
+
generation: string;
|
|
22
|
+
mode: string;
|
|
23
|
+
state: string;
|
|
24
|
+
pending: number;
|
|
25
|
+
automaticRestartEnabled: boolean;
|
|
26
|
+
interruptedWorkDisposition: string;
|
|
27
|
+
observedAt: string;
|
|
28
|
+
organizationId: string;
|
|
29
|
+
deviceId: string;
|
|
30
|
+
workspaceId: string;
|
|
31
|
+
provider: import("@dharma-ai-labs/agent-fabric-contracts").ProviderId;
|
|
32
|
+
repositoryBindingId: string;
|
|
33
|
+
endpointId: string;
|
|
34
|
+
membershipId: string;
|
|
35
|
+
ok: boolean;
|
|
36
|
+
schema: string;
|
|
37
|
+
receiptId: `${string}-${string}-${string}-${string}-${string}`;
|
|
38
|
+
name: string;
|
|
39
|
+
bindingId: string;
|
|
40
|
+
sessionId: string;
|
|
41
|
+
}>;
|
|
42
|
+
export declare function activateMaintenanceRestart(input: {
|
|
43
|
+
registration: NamedSessionRegistration;
|
|
44
|
+
fenceId: string;
|
|
45
|
+
processState(): Promise<'running' | 'stopped' | 'unknown'>;
|
|
46
|
+
readRegistration(): Promise<NamedSessionRegistration | null>;
|
|
47
|
+
saveRegistration(value: NamedSessionRegistration): Promise<void>;
|
|
48
|
+
}): Promise<void>;
|
|
49
|
+
//# sourceMappingURL=namedSessionMaintenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionMaintenance.d.ts","sourceRoot":"","sources":["../src/namedSessionMaintenance.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AAI1F,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAChD,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,wBAAwB,CAAC;IACvG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1E,oCAqBA;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,YAAY,EAAE,wBAAwB,CAAC;IAAC,OAAO,EAAC,MAAM,CAAC;IAAC,SAAS,EAAC,MAAM,CAAC;IACzE,YAAY,IAAI,OAAO,CAAC,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC;IAC3D,gBAAgB,IAAI,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC;IAC7D,WAAW,IAAI,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CAAC;IAC3D,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;;;;;;;;;;;;;;;;;;;;;;;GA6BA;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,YAAY,EAAC,wBAAwB,CAAC;IAAC,OAAO,EAAC,MAAM,CAAC;IACtD,YAAY,IAAG,OAAO,CAAC,SAAS,GAAC,SAAS,GAAC,SAAS,CAAC,CAAC;IACtD,gBAAgB,IAAG,OAAO,CAAC,wBAAwB,GAAC,IAAI,CAAC,CAAC;IAC1D,gBAAgB,CAAC,KAAK,EAAC,wBAAwB,GAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE,iBAaA"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { canonicalize, validateContract } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
4
|
+
const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$(?![\s\S])/i;
|
|
5
|
+
export async function maintainNamedSession(input) {
|
|
6
|
+
if (!uuid.test(input.fenceId))
|
|
7
|
+
throw new Error('named_session_fence_invalid');
|
|
8
|
+
const current = await input.request({ action: 'status' });
|
|
9
|
+
const admission = current.admission;
|
|
10
|
+
if (!admission || typeof admission.generation !== 'string' || !uuid.test(admission.generation)) {
|
|
11
|
+
throw new Error('named_session_quiescence_not_supported');
|
|
12
|
+
}
|
|
13
|
+
const registration = input.registration;
|
|
14
|
+
if (current.bindingId !== registration.bindingId || current.name !== registration.name
|
|
15
|
+
|| Object.entries(registration.identity).some(([key, value]) => current[key] !== value)) {
|
|
16
|
+
throw new Error('named_session_scope_mismatch');
|
|
17
|
+
}
|
|
18
|
+
const result = await input.request({ action: input.action, fenceId: input.fenceId, generation: admission.generation });
|
|
19
|
+
if (!(await validateContract(fileURLToPath(new URL('./schemas/', import.meta.url)), 'https://schemas.dharma-ai.io/named-session-maintenance/v1', result)).ok
|
|
20
|
+
|| result.mode !== 'live' || result.action !== input.action || result.fenceId !== input.fenceId || result.generation !== admission.generation
|
|
21
|
+
|| result.name !== registration.name || result.bindingId !== registration.bindingId || result.sessionId !== current.sessionId
|
|
22
|
+
|| Object.entries(registration.identity).some(([key, value]) => result[key] !== value)) {
|
|
23
|
+
throw new Error('named_session_maintenance_scope_mismatch');
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
export async function recoverStoppedNamedSession(input) {
|
|
28
|
+
const registration = input.registration, fence = registration.maintenanceFence;
|
|
29
|
+
if (!fence || registration.enabled || !uuid.test(input.fenceId) || !uuid.test(fence.generation) || fence.fenceId !== input.fenceId) {
|
|
30
|
+
throw new Error('named_session_maintenance_recovery_unavailable');
|
|
31
|
+
}
|
|
32
|
+
if (await input.processState() !== 'stopped')
|
|
33
|
+
throw new Error('named_session_owner_not_stopped');
|
|
34
|
+
const binding = await input.readBinding(), now = (input.now ?? (() => new Date()))();
|
|
35
|
+
if (!binding || binding.owner !== 'dharma_bridge' || binding.bindingId !== registration.bindingId
|
|
36
|
+
|| binding.workspaceRoot !== input.workspace || !/^[A-Za-z0-9_-]{1,128}$(?![\s\S])/.test(binding.sessionId) || !Number.isFinite(now.getTime())
|
|
37
|
+
|| !Number.isFinite(Date.parse(binding.expiresAt)) || Date.parse(binding.expiresAt) <= now.getTime()
|
|
38
|
+
|| Object.entries(registration.identity).some(([key, value]) => binding[key] !== value)) {
|
|
39
|
+
throw new Error('named_session_maintenance_binding_unavailable');
|
|
40
|
+
}
|
|
41
|
+
const current = await input.readRegistration();
|
|
42
|
+
if (!current || canonicalize(current) !== canonicalize(registration))
|
|
43
|
+
throw new Error('named_session_maintenance_scope_mismatch');
|
|
44
|
+
if (await input.processState() !== 'stopped')
|
|
45
|
+
throw new Error('named_session_owner_not_stopped');
|
|
46
|
+
const commitTime = (input.now ?? (() => new Date()))();
|
|
47
|
+
if (!Number.isFinite(commitTime.getTime()) || Date.parse(binding.expiresAt) <= commitTime.getTime()) {
|
|
48
|
+
throw new Error('named_session_maintenance_binding_unavailable');
|
|
49
|
+
}
|
|
50
|
+
const next = { ...registration, enabled: false, maintenanceFence: { ...fence, restartPermitted: true } };
|
|
51
|
+
await input.saveRegistration(next);
|
|
52
|
+
const readback = await input.readRegistration();
|
|
53
|
+
if (!readback || canonicalize(readback) !== canonicalize(next))
|
|
54
|
+
throw new Error('named_session_maintenance_persistence_unconfirmed');
|
|
55
|
+
return { ok: true, schema: 'dharma.named-session-maintenance/v1', receiptId: randomUUID(), name: registration.name,
|
|
56
|
+
bindingId: registration.bindingId, sessionId: binding.sessionId, ...registration.identity,
|
|
57
|
+
action: 'resume', fenceId: input.fenceId, generation: fence.generation, mode: 'stopped_recovery',
|
|
58
|
+
state: 'restart_permitted', pending: 0, automaticRestartEnabled: false,
|
|
59
|
+
interruptedWorkDisposition: 'preserved_for_verified_start', observedAt: commitTime.toISOString() };
|
|
60
|
+
}
|
|
61
|
+
export async function activateMaintenanceRestart(input) {
|
|
62
|
+
const registration = input.registration, fence = registration.maintenanceFence;
|
|
63
|
+
if (!fence?.restartPermitted || registration.enabled || !uuid.test(input.fenceId) || input.fenceId !== fence.fenceId) {
|
|
64
|
+
throw new Error('named_session_maintenance_start_unavailable');
|
|
65
|
+
}
|
|
66
|
+
if (await input.processState() !== 'stopped')
|
|
67
|
+
throw new Error('named_session_owner_not_stopped');
|
|
68
|
+
const current = await input.readRegistration();
|
|
69
|
+
if (!current || canonicalize(current) !== canonicalize(registration))
|
|
70
|
+
throw new Error('named_session_maintenance_scope_mismatch');
|
|
71
|
+
if (await input.processState() !== 'stopped')
|
|
72
|
+
throw new Error('named_session_owner_not_stopped');
|
|
73
|
+
const { maintenanceFence: _fence, ...base } = registration, next = { ...base, enabled: true };
|
|
74
|
+
await input.saveRegistration(next);
|
|
75
|
+
const observed = await input.readRegistration();
|
|
76
|
+
if (!observed || canonicalize(observed) !== canonicalize(next))
|
|
77
|
+
throw new Error('named_session_maintenance_persistence_unconfirmed');
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=namedSessionMaintenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionMaintenance.js","sourceRoot":"","sources":["../src/namedSessionMaintenance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namedSessionMaintenance.test.d.ts","sourceRoot":"","sources":["../src/namedSessionMaintenance.test.ts"],"names":[],"mappings":""}
|