@dharma-ai-labs/agent-fabric 0.2.103 → 0.2.105

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 (61) hide show
  1. package/dist/demoSupervisor.d.ts +34 -0
  2. package/dist/demoSupervisor.d.ts.map +1 -0
  3. package/dist/demoSupervisor.js +164 -0
  4. package/dist/demoSupervisor.js.map +1 -0
  5. package/dist/demoSupervisor.test.d.ts +2 -0
  6. package/dist/demoSupervisor.test.d.ts.map +1 -0
  7. package/dist/demoSupervisor.test.js +249 -0
  8. package/dist/demoSupervisor.test.js.map +1 -0
  9. package/dist/demoWatchControl.d.ts +60 -0
  10. package/dist/demoWatchControl.d.ts.map +1 -0
  11. package/dist/demoWatchControl.js +128 -0
  12. package/dist/demoWatchControl.js.map +1 -0
  13. package/dist/demoWatchControl.test.d.ts +2 -0
  14. package/dist/demoWatchControl.test.d.ts.map +1 -0
  15. package/dist/demoWatchControl.test.js +184 -0
  16. package/dist/demoWatchControl.test.js.map +1 -0
  17. package/dist/demoWatchHealth.d.ts +26 -0
  18. package/dist/demoWatchHealth.d.ts.map +1 -0
  19. package/dist/demoWatchHealth.js +177 -0
  20. package/dist/demoWatchHealth.js.map +1 -0
  21. package/dist/demoWatchHealth.test.d.ts +2 -0
  22. package/dist/demoWatchHealth.test.d.ts.map +1 -0
  23. package/dist/demoWatchHealth.test.js +175 -0
  24. package/dist/demoWatchHealth.test.js.map +1 -0
  25. package/dist/demoWatchRegistry.d.ts +17 -0
  26. package/dist/demoWatchRegistry.d.ts.map +1 -0
  27. package/dist/demoWatchRegistry.js +170 -0
  28. package/dist/demoWatchRegistry.js.map +1 -0
  29. package/dist/demoWatchRegistry.test.d.ts +2 -0
  30. package/dist/demoWatchRegistry.test.d.ts.map +1 -0
  31. package/dist/demoWatchRegistry.test.js +146 -0
  32. package/dist/demoWatchRegistry.test.js.map +1 -0
  33. package/dist/index.d.ts +5 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +236 -71
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.test.js +68 -4
  38. package/dist/index.test.js.map +1 -1
  39. package/dist/pidLock.test.d.ts +2 -0
  40. package/dist/pidLock.test.d.ts.map +1 -0
  41. package/dist/pidLock.test.js +172 -0
  42. package/dist/pidLock.test.js.map +1 -0
  43. package/dist/relayAutostart.d.ts +17 -6
  44. package/dist/relayAutostart.d.ts.map +1 -1
  45. package/dist/relayAutostart.js +138 -21
  46. package/dist/relayAutostart.js.map +1 -1
  47. package/dist/relayAutostart.test.js +204 -5
  48. package/dist/relayAutostart.test.js.map +1 -1
  49. package/dist/relaySupervisor.test.js +75 -1
  50. package/dist/relaySupervisor.test.js.map +1 -1
  51. package/dist/repositoryOnboardingCaller.test.js +21 -0
  52. package/dist/repositoryOnboardingCaller.test.js.map +1 -1
  53. package/dist/schemas/demo-watch-control.v1.schema.json +27 -0
  54. package/dist/schemas/demo-watch-health.v1.schema.json +24 -0
  55. package/dist/schemas/demo-watch-registration.v1.schema.json +18 -0
  56. package/dist/schemas/relay-autostart.v2.schema.json +23 -0
  57. package/dist/usage.d.ts +1 -1
  58. package/dist/usage.d.ts.map +1 -1
  59. package/dist/usage.js +1 -1
  60. package/dist/usage.js.map +1 -1
  61. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ import { type DemoWatchRegistration } from './demoWatchRegistry.js';
2
+ export type DemoWatchObservation = {
3
+ key: string | null;
4
+ state: 'completed' | 'failed' | 'timed_out';
5
+ stage: string | null;
6
+ sourceState: string | null;
7
+ code: string | null;
8
+ };
9
+ type CycleResult = {
10
+ stage: string;
11
+ sourceSync?: {
12
+ state: string;
13
+ };
14
+ };
15
+ export declare function runDemoSupervisor(input: {
16
+ list: () => Promise<DemoWatchRegistration[]>;
17
+ cycle: (registration: DemoWatchRegistration, signal: AbortSignal) => Promise<CycleResult>;
18
+ intervalMs?: number;
19
+ cycleTimeoutMs?: number;
20
+ concurrency?: number;
21
+ once?: boolean;
22
+ signal?: AbortSignal;
23
+ now?: () => number;
24
+ wait?: (durationMs: number, signal?: AbortSignal) => Promise<void>;
25
+ onObservation?: (observation: DemoWatchObservation) => void;
26
+ }): Promise<{
27
+ ok: boolean;
28
+ stage: string;
29
+ polls: number;
30
+ completed: number;
31
+ failures: number;
32
+ }>;
33
+ export {};
34
+ //# sourceMappingURL=demoSupervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoSupervisor.d.ts","sourceRoot":"","sources":["../src/demoSupervisor.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE9F,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC5C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB,CAAC;AAEF,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAWrE,wBAAsB,iBAAiB,CAAC,KAAK,EAAE;IAC7C,IAAI,EAAE,MAAM,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC,YAAY,EAAE,qBAAqB,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,oBAAoB,KAAK,IAAI,CAAC;CAC7D;;;;;;GAiIA"}
@@ -0,0 +1,164 @@
1
+ import { setTimeout as delay } from 'node:timers/promises';
2
+ import { demoWatchRegistrationKey } from './demoWatchRegistry.js';
3
+ function bounded(value) {
4
+ return typeof value === 'string' && /^[a-z0-9_]{1,80}$/.test(value) ? value : null;
5
+ }
6
+ function sameRegistration(a, b) {
7
+ return Object.keys(a).every(key => a[key] === b[key]);
8
+ }
9
+ export async function runDemoSupervisor(input) {
10
+ const intervalMs = input.intervalMs ?? 60_000;
11
+ const timeoutMs = input.cycleTimeoutMs ?? 30_000;
12
+ const concurrency = input.concurrency ?? 4;
13
+ if (!Number.isSafeInteger(intervalMs) || intervalMs < 15_000 || intervalMs > 300_000) {
14
+ throw new Error('Demo supervisor interval must be between 15 and 300 seconds.');
15
+ }
16
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 300_000) {
17
+ throw new Error('Demo supervisor timeout must be positive and at most 300 seconds.');
18
+ }
19
+ if (!Number.isSafeInteger(concurrency) || concurrency < 1 || concurrency > 32) {
20
+ throw new Error('Demo supervisor concurrency must be between 1 and 32.');
21
+ }
22
+ const wait = input.wait ?? ((durationMs, signal) => delay(durationMs, undefined, { signal }));
23
+ const now = input.now ?? (() => performance.now());
24
+ const pollIntervalMs = Math.min(intervalMs, 2_000);
25
+ const flights = new Map();
26
+ const nextEligible = new Map();
27
+ let lastTime = 0;
28
+ let cursor = 0;
29
+ let completed = 0;
30
+ let failures = 0;
31
+ let polls = 0;
32
+ let observationFailed = false;
33
+ const cancel = () => { for (const flight of flights.values())
34
+ flight.controller.abort(); };
35
+ input.signal?.addEventListener('abort', cancel, { once: true });
36
+ const observe = (observation) => {
37
+ try {
38
+ input.onObservation?.(observation);
39
+ }
40
+ catch {
41
+ observationFailed = true;
42
+ cancel();
43
+ }
44
+ };
45
+ const start = (key, registration) => {
46
+ const controller = new AbortController();
47
+ let decide;
48
+ const flight = { registration, controller,
49
+ decision: new Promise(resolve => { decide = resolve; }) };
50
+ flights.set(key, flight);
51
+ let decided = false;
52
+ const finish = (observation) => {
53
+ if (decided)
54
+ return;
55
+ decided = true;
56
+ clearTimeout(timer);
57
+ controller.signal.removeEventListener('abort', abort);
58
+ decide();
59
+ if (observation)
60
+ observe(observation);
61
+ };
62
+ const abort = () => finish();
63
+ const timer = setTimeout(() => {
64
+ failures += 1;
65
+ finish({ key, state: 'timed_out', stage: null, sourceState: null, code: 'demo_watch_cycle_timeout' });
66
+ controller.abort();
67
+ }, timeoutMs);
68
+ controller.signal.addEventListener('abort', abort, { once: true });
69
+ // Keep the slot until the operation actually settles, even after its deadline or revocation.
70
+ const operation = (async () => input.cycle(registration, controller.signal))();
71
+ void operation.then(result => {
72
+ if (decided || controller.signal.aborted || input.signal?.aborted)
73
+ return;
74
+ const stage = bounded(result?.stage);
75
+ const sourceState = bounded(result?.sourceSync?.state);
76
+ if (!stage || (result?.sourceSync && !sourceState)) {
77
+ failures += 1;
78
+ finish({ key, state: 'failed', stage: null, sourceState: null, code: 'demo_watch_receipt_invalid' });
79
+ return;
80
+ }
81
+ completed += 1;
82
+ finish({ key, state: 'completed', stage, sourceState, code: null });
83
+ }, error => {
84
+ if (decided || controller.signal.aborted || input.signal?.aborted)
85
+ return;
86
+ failures += 1;
87
+ finish({ key, state: 'failed', stage: null, sourceState: null,
88
+ code: bounded(error?.code) ?? 'demo_watch_cycle_failed' });
89
+ }).finally(() => { if (flights.get(key) === flight)
90
+ flights.delete(key); });
91
+ return flight;
92
+ };
93
+ try {
94
+ while (!input.signal?.aborted && !observationFailed) {
95
+ polls += 1;
96
+ let registrations = new Map();
97
+ try {
98
+ const rows = await input.list();
99
+ if (rows.length > 32)
100
+ throw new Error('Demo watch registration limit exceeded.');
101
+ for (const row of rows) {
102
+ const key = demoWatchRegistrationKey(row);
103
+ if (registrations.has(key))
104
+ throw new Error('Duplicate Demo watch scope.');
105
+ registrations.set(key, row);
106
+ }
107
+ }
108
+ catch {
109
+ registrations = new Map();
110
+ failures += 1;
111
+ observe({ key: null, state: 'failed', stage: null,
112
+ sourceState: null, code: 'demo_watch_registry_invalid' });
113
+ }
114
+ if (input.signal?.aborted || observationFailed)
115
+ break;
116
+ const currentTime = now();
117
+ if (!Number.isFinite(currentTime) || currentTime < lastTime
118
+ || currentTime > Number.MAX_SAFE_INTEGER - intervalMs) {
119
+ throw new Error('Demo supervisor clock must be finite and monotonic.');
120
+ }
121
+ lastTime = currentTime;
122
+ for (const key of nextEligible.keys()) {
123
+ if (!registrations.has(key))
124
+ nextEligible.delete(key);
125
+ }
126
+ for (const [key, flight] of flights) {
127
+ const row = registrations.get(key);
128
+ if (!row || !sameRegistration(row, flight.registration))
129
+ flight.controller.abort();
130
+ }
131
+ const rows = [...registrations.entries()];
132
+ const launched = [];
133
+ const startAt = rows.length ? cursor % rows.length : 0;
134
+ for (let offset = 0; offset < rows.length && flights.size < concurrency; offset += 1) {
135
+ const index = (startAt + offset) % rows.length;
136
+ const [key, row] = rows[index];
137
+ if (!flights.has(key) && currentTime >= (nextEligible.get(key) ?? 0)) {
138
+ nextEligible.set(key, currentTime + intervalMs);
139
+ launched.push(start(key, row));
140
+ cursor = index + 1;
141
+ }
142
+ }
143
+ if (input.once) {
144
+ await Promise.all(launched.map(flight => flight.decision));
145
+ break;
146
+ }
147
+ try {
148
+ await wait(pollIntervalMs, input.signal);
149
+ }
150
+ catch (error) {
151
+ if (!input.signal?.aborted)
152
+ throw error;
153
+ }
154
+ }
155
+ if (observationFailed)
156
+ throw new Error('Demo supervisor observation sink failed.');
157
+ return { ok: failures === 0, stage: 'demo_supervisor_stopped', polls, completed, failures };
158
+ }
159
+ finally {
160
+ input.signal?.removeEventListener('abort', cancel);
161
+ cancel();
162
+ }
163
+ }
164
+ //# sourceMappingURL=demoSupervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoSupervisor.js","sourceRoot":"","sources":["../src/demoSupervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=demoSupervisor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoSupervisor.test.d.ts","sourceRoot":"","sources":["../src/demoSupervisor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,249 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { setTimeout as delay } from 'node:timers/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { resolve } from 'node:path';
6
+ import { runDemoSupervisor } from './demoSupervisor.js';
7
+ function registration(index = 0) {
8
+ return { schema: 'dharma.demo-watch/v1', hqUrl: 'https://example.com',
9
+ organizationId: 'org_test', repositoryId: `00000000-0000-4000-8000-${String(index).padStart(12, '0')}`,
10
+ normalizedRepository: `github.com/example/repo${index}`, provider: 'codex', workspace: resolve(tmpdir(), `repo${index}`) };
11
+ }
12
+ test('supervisor records bounded package observations without private payloads', async () => {
13
+ const observations = [];
14
+ const result = await runDemoSupervisor({ once: true, list: async () => [registration()],
15
+ cycle: async () => ({ stage: 'installed', sourceSync: { state: 'unchanged' }, secret: 'private' }),
16
+ onObservation: value => observations.push(value) });
17
+ assert.equal(result.completed, 1);
18
+ assert.equal(result.failures, 0);
19
+ assert.equal(observations[0].state, 'completed');
20
+ assert.equal(observations[0].sourceState, 'unchanged');
21
+ assert.equal(JSON.stringify(observations).includes('private'), false);
22
+ });
23
+ test('concurrency is bounded and later scopes are not starved', async () => {
24
+ const controller = new AbortController();
25
+ const started = [];
26
+ let active = 0;
27
+ let maximum = 0;
28
+ let pulses = 0;
29
+ await runDemoSupervisor({ signal: controller.signal, concurrency: 2,
30
+ list: async () => Array.from({ length: 5 }, (_, index) => registration(index)),
31
+ cycle: async (row) => {
32
+ started.push(Number(row.repositoryId.slice(-12)));
33
+ active += 1;
34
+ maximum = Math.max(maximum, active);
35
+ await delay(1);
36
+ active -= 1;
37
+ return { stage: 'installed' };
38
+ },
39
+ wait: async () => { await delay(5); if (++pulses === 3)
40
+ controller.abort(); } });
41
+ assert.equal(maximum, 2);
42
+ assert.deepEqual(started.slice(0, 5), [0, 1, 2, 3, 4]);
43
+ });
44
+ test('timeout aborts the cycle and late completion cannot erase its receipt or overlap', async () => {
45
+ const controller = new AbortController();
46
+ const observations = [];
47
+ let finish;
48
+ let cycleSignal;
49
+ let starts = 0;
50
+ let pulses = 0;
51
+ const result = await runDemoSupervisor({ signal: controller.signal, cycleTimeoutMs: 5,
52
+ list: async () => [registration()], cycle: async (_row, signal) => {
53
+ starts += 1;
54
+ cycleSignal = signal;
55
+ return new Promise(resolve => { finish = resolve; });
56
+ }, onObservation: value => observations.push(value),
57
+ wait: async () => {
58
+ await delay(15);
59
+ if (++pulses === 2) {
60
+ finish({ stage: 'late_success' });
61
+ controller.abort();
62
+ }
63
+ } });
64
+ await delay(0);
65
+ assert.equal(starts, 1);
66
+ assert.equal(cycleSignal.aborted, true);
67
+ assert.equal(result.failures, 1);
68
+ assert.deepEqual(observations.map(value => value.state), ['timed_out']);
69
+ assert.equal(JSON.stringify(observations).includes('late_success'), false);
70
+ });
71
+ test('removal cancels an in-flight cycle without publishing its late result', async () => {
72
+ const controller = new AbortController();
73
+ const observations = [];
74
+ let lists = 0;
75
+ let finish;
76
+ let cycleSignal;
77
+ await runDemoSupervisor({ signal: controller.signal,
78
+ list: async () => ++lists === 1 ? [registration()] : [],
79
+ cycle: async (_row, signal) => { cycleSignal = signal; return new Promise(resolve => { finish = resolve; }); },
80
+ onObservation: value => observations.push(value),
81
+ wait: async () => {
82
+ if (lists === 2) {
83
+ finish({ stage: 'removed_success' });
84
+ controller.abort();
85
+ }
86
+ await delay(0);
87
+ } });
88
+ assert.equal(cycleSignal.aborted, true);
89
+ assert.deepEqual(observations, []);
90
+ });
91
+ test('a changed registration cancels old work and does not overlap it', async () => {
92
+ const controller = new AbortController();
93
+ let lists = 0;
94
+ let starts = 0;
95
+ let oldSignal;
96
+ await runDemoSupervisor({ signal: controller.signal,
97
+ list: async () => [{ ...registration(), workspace: resolve(tmpdir(), ++lists === 1 ? 'repo0' : 'other') }],
98
+ cycle: async (_row, signal) => { starts += 1; oldSignal = signal; return new Promise(() => { }); },
99
+ wait: async () => { if (lists === 2)
100
+ controller.abort(); await delay(0); } });
101
+ assert.equal(oldSignal.aborted, true);
102
+ assert.equal(starts, 1);
103
+ });
104
+ test('corrupted registry cancels work and reports no raw error', async () => {
105
+ const controller = new AbortController();
106
+ const observations = [];
107
+ let lists = 0;
108
+ let cycleSignal;
109
+ const result = await runDemoSupervisor({ signal: controller.signal,
110
+ list: async () => { if (++lists === 2)
111
+ throw new Error('private registry contents'); return [registration()]; },
112
+ cycle: async (_row, signal) => { cycleSignal = signal; return new Promise(() => { }); },
113
+ onObservation: value => observations.push(value),
114
+ wait: async () => { if (lists === 2)
115
+ controller.abort(); await delay(0); } });
116
+ assert.equal(cycleSignal.aborted, true);
117
+ assert.equal(result.failures, 1);
118
+ assert.equal(observations[0].code, 'demo_watch_registry_invalid');
119
+ assert.equal(JSON.stringify(observations).includes('private'), false);
120
+ });
121
+ test('shutdown does not wait forever for a non-cooperative provider', async () => {
122
+ const controller = new AbortController();
123
+ let cycleSignal;
124
+ await runDemoSupervisor({ signal: controller.signal, list: async () => [registration()],
125
+ cycle: async (_row, signal) => { cycleSignal = signal; return new Promise(() => { }); },
126
+ wait: async () => { controller.abort(); } });
127
+ assert.equal(cycleSignal.aborted, true);
128
+ });
129
+ test('invalid options and duplicate scopes fail before dispatch', async () => {
130
+ let starts = 0;
131
+ const input = { once: true, list: async () => [registration(), registration()],
132
+ cycle: async () => { starts += 1; return { stage: 'unused' }; } };
133
+ const result = await runDemoSupervisor(input);
134
+ assert.equal(result.failures, 1);
135
+ assert.equal(starts, 0);
136
+ await assert.rejects(runDemoSupervisor({ ...input, concurrency: 33 }), /concurrency/);
137
+ await assert.rejects(runDemoSupervisor({ ...input, intervalMs: 0 }), /interval/);
138
+ await assert.rejects(runDemoSupervisor({ ...input, cycleTimeoutMs: 0 }), /timeout/);
139
+ });
140
+ test('an invalid cycle receipt cannot count as a completed package check', async () => {
141
+ const observations = [];
142
+ const result = await runDemoSupervisor({ once: true, list: async () => [registration()],
143
+ cycle: async () => ({ stage: 'private payload with credentials' }),
144
+ onObservation: value => observations.push(value) });
145
+ assert.equal(result.completed, 0);
146
+ assert.equal(result.failures, 1);
147
+ assert.equal(observations[0].code, 'demo_watch_receipt_invalid');
148
+ assert.equal(JSON.stringify(observations).includes('credentials'), false);
149
+ });
150
+ test('a failed status sink cancels work and rejects without an unhandled private exception', async () => {
151
+ await assert.rejects(runDemoSupervisor({ once: true, list: async () => [registration()],
152
+ cycle: async () => ({ stage: 'installed' }),
153
+ onObservation: () => { throw new Error('private logging details'); } }), /^Error: Demo supervisor observation sink failed\.$/);
154
+ });
155
+ test('32 responsive scopes observe a publication within five minutes at bounded concurrency', async (t) => {
156
+ const controller = new AbortController();
157
+ let clock = 0;
158
+ let maximum = 0;
159
+ let pulses = 0;
160
+ const publicationAt = 1;
161
+ const pending = new Map();
162
+ const observed = new Map();
163
+ const input = {
164
+ signal: controller.signal, now: () => clock,
165
+ list: async () => Array.from({ length: 32 }, (_, index) => registration(index)),
166
+ cycle: async (row) => {
167
+ const key = row.repositoryId;
168
+ const stage = clock >= publicationAt ? 'generation_2' : 'generation_1';
169
+ const operation = new Promise(resolve => {
170
+ pending.set(key, { finishAt: clock + 29_500, finish: () => resolve({ stage }) });
171
+ });
172
+ maximum = Math.max(maximum, pending.size);
173
+ return operation;
174
+ },
175
+ onObservation: (value) => {
176
+ if (value.stage === 'generation_2' && value.key)
177
+ observed.set(value.key, clock);
178
+ if (observed.size === 32)
179
+ controller.abort();
180
+ },
181
+ wait: async (duration) => {
182
+ clock += duration;
183
+ for (const [key, operation] of pending) {
184
+ if (operation.finishAt <= clock) {
185
+ pending.delete(key);
186
+ operation.finish();
187
+ }
188
+ }
189
+ await delay(0);
190
+ if (++pulses > 200 || clock > 660_000)
191
+ controller.abort();
192
+ },
193
+ };
194
+ await runDemoSupervisor(input);
195
+ assert.equal(maximum, 4);
196
+ assert.equal(observed.size, 32);
197
+ assert.ok(Math.max(...observed.values()) - publicationAt <= 300_000, `Last scope observed after ${Math.max(...observed.values()) - publicationAt}ms`);
198
+ t.diagnostic(`All 32 scopes observed after ${Math.max(...observed.values()) - publicationAt}ms; maximum concurrency ${maximum}.`);
199
+ });
200
+ test('fast registry polling does not retry a failed scope before its interval', async () => {
201
+ const controller = new AbortController();
202
+ let clock = 0;
203
+ let starts = 0;
204
+ const input = { signal: controller.signal, now: () => clock,
205
+ list: async () => [registration()], cycle: async () => {
206
+ starts += 1;
207
+ throw Object.assign(new Error('private'), { code: 'provider_unavailable' });
208
+ }, wait: async (duration) => {
209
+ clock += duration;
210
+ await delay(0);
211
+ if (clock >= 24_000)
212
+ controller.abort();
213
+ } };
214
+ await runDemoSupervisor(input);
215
+ assert.equal(starts, 1);
216
+ assert.ok(clock < 60_000);
217
+ });
218
+ test('a failed scope retries at its configured interval without duplicate in-flight work', async () => {
219
+ const controller = new AbortController();
220
+ let clock = 0;
221
+ const starts = [];
222
+ await runDemoSupervisor({ signal: controller.signal, now: () => clock,
223
+ list: async () => [registration()], cycle: async () => {
224
+ starts.push(clock);
225
+ throw new Error('private failure');
226
+ }, wait: async (duration) => {
227
+ clock += duration;
228
+ await delay(0);
229
+ if (starts.length === 2)
230
+ controller.abort();
231
+ } });
232
+ assert.deepEqual(starts, [0, 60_000]);
233
+ });
234
+ test('an invalid or backwards scheduling clock fails closed', async () => {
235
+ for (const invalid of [NaN, Infinity, -1, Number.MAX_SAFE_INTEGER]) {
236
+ let starts = 0;
237
+ await assert.rejects(runDemoSupervisor({ once: true, now: () => invalid,
238
+ list: async () => [registration()], cycle: async () => {
239
+ starts += 1;
240
+ return { stage: 'installed' };
241
+ } }), /clock must be finite and monotonic/);
242
+ assert.equal(starts, 0);
243
+ }
244
+ let clock = 10;
245
+ await assert.rejects(runDemoSupervisor({ now: () => clock,
246
+ list: async () => [registration()], cycle: async () => ({ stage: 'installed' }),
247
+ wait: async () => { clock -= 1; await delay(0); } }), /clock must be finite and monotonic/);
248
+ });
249
+ //# sourceMappingURL=demoSupervisor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoSupervisor.test.js","sourceRoot":"","sources":["../src/demoSupervisor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { type DemoWatchHealth } from './demoWatchHealth.js';
2
+ import { type DemoWatchRegistration } from './demoWatchRegistry.js';
3
+ export type DemoWatchSupervisor = {
4
+ state: 'running' | 'stopped' | 'unknown' | 'legacy' | 'version_mismatch';
5
+ pid: number | null;
6
+ };
7
+ type Input = {
8
+ home: string;
9
+ registration: DemoWatchRegistration;
10
+ version: string;
11
+ dryRun?: boolean;
12
+ };
13
+ export type DemoWatchControlDependencies = {
14
+ verify: () => Promise<void>;
15
+ prepareStartup: () => Promise<void>;
16
+ start: () => Promise<void>;
17
+ supervisor: () => Promise<DemoWatchSupervisor>;
18
+ autostart: () => Promise<'enabled' | 'disabled' | 'unavailable' | 'unsupported'>;
19
+ exclusive: <T>(operation: () => Promise<T>) => Promise<T>;
20
+ wait?: () => Promise<void>;
21
+ };
22
+ export declare function inspectDemoWatchSupervisor(home: string, version: string, processState: () => Promise<'running' | 'stopped' | 'unknown'>): Promise<DemoWatchSupervisor>;
23
+ export declare function demoWatchStatus(input: Input, deps: DemoWatchControlDependencies): Promise<{
24
+ schema: "dharma.demo-watch-control/v1";
25
+ ok: boolean;
26
+ version: string;
27
+ stage: string;
28
+ key: string;
29
+ registered: boolean;
30
+ supervisor: "unknown" | "running" | "stopped" | "legacy" | "version_mismatch";
31
+ autostart: "enabled" | "disabled" | "unavailable" | "unsupported";
32
+ observation: DemoWatchHealth | null;
33
+ fullWorkflowReady: false;
34
+ }>;
35
+ export declare function enableDemoWatch(input: Input, deps: DemoWatchControlDependencies): Promise<{
36
+ schema: "dharma.demo-watch-control/v1";
37
+ ok: boolean;
38
+ version: string;
39
+ stage: string;
40
+ key: string;
41
+ registered: boolean;
42
+ supervisor: "unknown" | "running" | "stopped" | "legacy" | "version_mismatch";
43
+ autostart: "enabled" | "disabled" | "unavailable" | "unsupported";
44
+ observation: DemoWatchHealth | null;
45
+ fullWorkflowReady: false;
46
+ }>;
47
+ export declare function disableDemoWatch(input: Input, deps: DemoWatchControlDependencies): Promise<{
48
+ schema: "dharma.demo-watch-control/v1";
49
+ ok: boolean;
50
+ version: string;
51
+ stage: string;
52
+ key: string;
53
+ registered: boolean;
54
+ supervisor: "unknown" | "running" | "stopped" | "legacy" | "version_mismatch";
55
+ autostart: "enabled" | "disabled" | "unavailable" | "unsupported";
56
+ observation: DemoWatchHealth | null;
57
+ fullWorkflowReady: false;
58
+ }>;
59
+ export {};
60
+ //# sourceMappingURL=demoWatchControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoWatchControl.d.ts","sourceRoot":"","sources":["../src/demoWatchControl.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EACgB,KAAK,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAElF,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,kBAAkB,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AACnI,KAAK,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AACtG,MAAM,MAAM,4BAA4B,GAAG;IACzC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,UAAU,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC/C,SAAS,EAAE,MAAM,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,CAAC,CAAC;IACjF,SAAS,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAiCF,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAC5E,YAAY,EAAE,MAAM,OAAO,CAAC,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAW9F;AAuBD,wBAAsB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B;;;;;;;;;;;GAIrF;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B;;;;;;;;;;;GAyBrF;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,4BAA4B;;;;;;;;;;;GAStF"}