@dharma-ai-labs/agent-fabric 0.2.205 → 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.
Files changed (42) hide show
  1. package/dist/bootstrapHostScope.test.js +2 -1
  2. package/dist/bootstrapHostScope.test.js.map +1 -1
  3. package/dist/bootstrapVaultScope.test.js +32 -1
  4. package/dist/bootstrapVaultScope.test.js.map +1 -1
  5. package/dist/codexInboxSession.d.ts +1 -1
  6. package/dist/cooperativeInboxSession.d.ts +1 -1
  7. package/dist/demoPeer.d.ts +2 -2
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +69 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/namedSessionAdmission.d.ts +23 -0
  12. package/dist/namedSessionAdmission.d.ts.map +1 -0
  13. package/dist/namedSessionAdmission.js +120 -0
  14. package/dist/namedSessionAdmission.js.map +1 -0
  15. package/dist/namedSessionAdmission.test.d.ts +2 -0
  16. package/dist/namedSessionAdmission.test.d.ts.map +1 -0
  17. package/dist/namedSessionAdmission.test.js +151 -0
  18. package/dist/namedSessionAdmission.test.js.map +1 -0
  19. package/dist/namedSessionMaintenance.d.ts +49 -0
  20. package/dist/namedSessionMaintenance.d.ts.map +1 -0
  21. package/dist/namedSessionMaintenance.js +79 -0
  22. package/dist/namedSessionMaintenance.js.map +1 -0
  23. package/dist/namedSessionMaintenance.test.d.ts +2 -0
  24. package/dist/namedSessionMaintenance.test.d.ts.map +1 -0
  25. package/dist/namedSessionMaintenance.test.js +141 -0
  26. package/dist/namedSessionMaintenance.test.js.map +1 -0
  27. package/dist/namedSessionService.d.ts +5 -0
  28. package/dist/namedSessionService.d.ts.map +1 -1
  29. package/dist/namedSessionService.js +106 -32
  30. package/dist/namedSessionService.js.map +1 -1
  31. package/dist/namedSessionService.test.js +58 -3
  32. package/dist/namedSessionService.test.js.map +1 -1
  33. package/dist/providerSessionReplyRecovery.d.ts +1 -1
  34. package/dist/relayRuntimeUpgrade.test.js +2 -1
  35. package/dist/relayRuntimeUpgrade.test.js.map +1 -1
  36. package/dist/repositoryLaunchers.d.ts.map +1 -1
  37. package/dist/repositoryLaunchers.js +10 -4
  38. package/dist/repositoryLaunchers.js.map +1 -1
  39. package/dist/repositoryLaunchers.test.js +57 -0
  40. package/dist/repositoryLaunchers.test.js.map +1 -1
  41. package/dist/schemas/named-session-maintenance.schema.json +38 -0
  42. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=namedSessionAdmission.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=namedSessionMaintenance.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namedSessionMaintenance.test.d.ts","sourceRoot":"","sources":["../src/namedSessionMaintenance.test.ts"],"names":[],"mappings":""}