@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,128 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { readDemoWatchHealth } from './demoWatchHealth.js';
4
+ import { demoWatchRegistrationKey, listDemoWatchRegistrations, registerDemoWatch, unregisterDemoWatch } from './demoWatchRegistry.js';
5
+ function fail(code, stage, cause) {
6
+ throw Object.assign(new Error(`${code}: ${stage}; preserve enrollment and resume with the same scope.`, { cause }), { code, stage });
7
+ }
8
+ async function verify(deps) {
9
+ try {
10
+ await deps.verify();
11
+ }
12
+ catch (error) {
13
+ const code = error?.code;
14
+ fail(typeof code === 'string' && /^[a-z0-9_]{1,80}$/.test(code) ? code : 'demo_watch_scope_unverified', 'signed_device_verification', error);
15
+ }
16
+ }
17
+ function key(input) {
18
+ if (!/^(?=.{1,64}$)\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/.test(input.version)) {
19
+ fail('demo_watch_version_invalid', 'local_registration_validation');
20
+ }
21
+ return demoWatchRegistrationKey(input.registration);
22
+ }
23
+ async function registered(input) {
24
+ const selected = (await listDemoWatchRegistrations(input.home))
25
+ .find(row => demoWatchRegistrationKey(row) === key(input));
26
+ if (selected && Object.keys(selected)
27
+ .some(field => selected[field] !== input.registration[field])) {
28
+ fail('demo_watch_registration_conflict', 'local_registration_validation');
29
+ }
30
+ return Boolean(selected);
31
+ }
32
+ export async function inspectDemoWatchSupervisor(home, version, processState) {
33
+ try {
34
+ const state = await processState();
35
+ if (state !== 'running')
36
+ return { state, pid: null };
37
+ const pid = Number((await readFile(join(home, 'relay', 'supervisor.pid'), 'utf8')).trim());
38
+ const binding = JSON.parse(await readFile(join(home, 'relay', 'supervisor-workspace.json'), 'utf8'));
39
+ if (!Number.isSafeInteger(pid) || pid < 1 || binding?.pid !== pid)
40
+ return { state: 'unknown', pid: null };
41
+ if (binding.version !== version)
42
+ return { state: 'version_mismatch', pid };
43
+ if (binding.demoWatches !== true)
44
+ return { state: 'legacy', pid };
45
+ return { state: 'running', pid };
46
+ }
47
+ catch {
48
+ return { state: 'unknown', pid: null };
49
+ }
50
+ }
51
+ async function snapshot(input, deps, stage) {
52
+ const registrationKey = key(input);
53
+ const isRegistered = await registered(input);
54
+ const supervisor = await deps.supervisor();
55
+ let observation = null;
56
+ let invalidHealth = false;
57
+ if (isRegistered && supervisor.state === 'running' && supervisor.pid !== null) {
58
+ try {
59
+ observation = await readDemoWatchHealth(input.home, registrationKey, { pid: supervisor.pid, version: input.version });
60
+ }
61
+ catch {
62
+ invalidHealth = true;
63
+ }
64
+ }
65
+ return { schema: 'dharma.demo-watch-control/v1', ok: true, version: input.version,
66
+ stage: stage ?? (!isRegistered ? 'demo_watch_unregistered'
67
+ : supervisor.state !== 'running' ? `demo_watch_${supervisor.state}`
68
+ : invalidHealth ? 'demo_watch_health_invalid'
69
+ : !observation ? 'demo_watch_pending'
70
+ : observation.state === 'completed' ? 'demo_watch_cycle_observed' : 'demo_watch_failed'),
71
+ key: registrationKey, registered: isRegistered, supervisor: supervisor.state,
72
+ autostart: await deps.autostart(), observation, fullWorkflowReady: false };
73
+ }
74
+ export async function demoWatchStatus(input, deps) {
75
+ key(input);
76
+ await verify(deps);
77
+ return snapshot(input, deps);
78
+ }
79
+ export async function enableDemoWatch(input, deps) {
80
+ key(input);
81
+ if (input.dryRun)
82
+ return snapshot(input, deps, 'demo_watch_plan');
83
+ await verify(deps);
84
+ return deps.exclusive(async () => {
85
+ await registered(input);
86
+ const previous = await deps.supervisor();
87
+ if (previous.state !== 'stopped' && previous.state !== 'running') {
88
+ fail('demo_watch_supervisor_conflict', previous.state);
89
+ }
90
+ await registerDemoWatch(input.home, input.registration);
91
+ try {
92
+ await deps.prepareStartup();
93
+ }
94
+ catch (error) {
95
+ fail('demo_watch_startup_failed', 'startup_registration', error);
96
+ }
97
+ if (previous.state === 'stopped') {
98
+ try {
99
+ await deps.start();
100
+ }
101
+ catch (error) {
102
+ fail('demo_watch_start_failed', 'startup_dispatch', error);
103
+ }
104
+ for (let attempt = 0; attempt < 40; attempt += 1) {
105
+ const current = await deps.supervisor();
106
+ if (current.state === 'running')
107
+ break;
108
+ if (current.state !== 'stopped')
109
+ fail('demo_watch_supervisor_conflict', current.state);
110
+ if (attempt < 39)
111
+ await (deps.wait ?? (() => new Promise(resolve => setTimeout(resolve, 250))))();
112
+ }
113
+ }
114
+ return snapshot(input, deps);
115
+ });
116
+ }
117
+ export async function disableDemoWatch(input, deps) {
118
+ key(input);
119
+ if (input.dryRun)
120
+ return snapshot(input, deps, 'demo_watch_plan');
121
+ // Local removal must remain possible with a revoked or offline server identity.
122
+ return deps.exclusive(async () => {
123
+ await registered(input);
124
+ await unregisterDemoWatch(input.home, input.registration);
125
+ return snapshot(input, deps, 'demo_watch_disabled');
126
+ });
127
+ }
128
+ //# sourceMappingURL=demoWatchControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoWatchControl.js","sourceRoot":"","sources":["../src/demoWatchControl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAwB,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,iBAAiB,EAC9E,mBAAmB,EAA8B,MAAM,wBAAwB,CAAC;AAclF,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa,EAAE,KAAe;IACxD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,KAAK,uDAAuD,EAAE,EAAE,KAAK,EAAE,CAAC,EAChH,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAkC;IACtD,IAAI,CAAC;QAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IAAC,CAAC;IAC5B,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,KAAmC,EAAE,IAAI,CAAC;QACxD,IAAI,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B,EACpG,4BAA4B,EAAE,KAAK,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,GAAG,CAAC,KAAY;IACvB,IAAI,CAAC,iDAAiD,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,4BAA4B,EAAE,+BAA+B,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,wBAAwB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,KAAY;IACpC,MAAM,QAAQ,GAAG,CAAC,MAAM,0BAA0B,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC5D,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,IAAI,QAAQ,IAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAqC;SACvE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,CAAC,kCAAkC,EAAE,+BAA+B,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAAY,EAAE,OAAe,EAC5E,YAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3F,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,2BAA2B,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACrG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,GAAG,KAAK,GAAG;YAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC1G,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC;QAC3E,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAClE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,KAAY,EAAE,IAAkC,EAAE,KAAc;IACtF,MAAM,eAAe,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3C,IAAI,WAAW,GAA2B,IAAI,CAAC;IAC/C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,YAAY,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QAC9E,IAAI,CAAC;YAAC,WAAW,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,EACvE,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAAC,CAAC;QACrD,MAAM,CAAC;YAAC,aAAa,GAAG,IAAI,CAAC;QAAC,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,8BAAuC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO;QACxF,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,yBAAyB;YACxD,CAAC,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,UAAU,CAAC,KAAK,EAAE;gBACjE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,2BAA2B;oBAC3C,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB;wBACnC,CAAC,CAAC,WAAW,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,mBAAmB,CAAC;QAChG,GAAG,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK;QAC5E,SAAS,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,KAAc,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAY,EAAE,IAAkC;IACpF,GAAG,CAAC,KAAK,CAAC,CAAC;IACX,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAY,EAAE,IAAkC;IACpF,GAAG,CAAC,KAAK,CAAC,CAAC;IACX,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAClE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QAC/B,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACjE,IAAI,CAAC,gCAAgC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC;YAAC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAAC,CAAC;QACpC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,2BAA2B,EAAE,sBAAsB,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QACnF,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAC3B,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAI,CAAC,yBAAyB,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;YAAC,CAAC;YAC7E,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;gBACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;oBAAE,MAAM;gBACvC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;oBAAE,IAAI,CAAC,gCAAgC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;gBACvF,IAAI,OAAO,GAAG,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1G,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAY,EAAE,IAAkC;IACrF,GAAG,CAAC,KAAK,CAAC,CAAC;IACX,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAClE,gFAAgF;IAChF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QAC/B,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=demoWatchControl.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoWatchControl.test.d.ts","sourceRoot":"","sources":["../src/demoWatchControl.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,184 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdir, mkdtemp, readFile, realpath, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import test from 'node:test';
6
+ import { disableDemoWatch, enableDemoWatch, demoWatchStatus, inspectDemoWatchSupervisor } from './demoWatchControl.js';
7
+ import { demoWatchRegistrationKey, listDemoWatchRegistrations, registerDemoWatch } from './demoWatchRegistry.js';
8
+ import { writeDemoWatchHealth } from './demoWatchHealth.js';
9
+ async function fixture() {
10
+ const home = await realpath(await mkdtemp(join(tmpdir(), 'dharma-watch-control-')));
11
+ const workspace = join(home, 'workspace');
12
+ await mkdir(workspace);
13
+ const registration = { schema: 'dharma.demo-watch/v1', hqUrl: 'https://example.com',
14
+ organizationId: 'org_test', repositoryId: '00000000-0000-4000-8000-000000000001',
15
+ normalizedRepository: 'github.com/example/repo', provider: 'codex', workspace };
16
+ const input = { home, registration, version: '0.2.103' };
17
+ let state = { state: 'stopped', pid: null };
18
+ const calls = [];
19
+ let tail = Promise.resolve();
20
+ const deps = {
21
+ verify: async () => { calls.push('verify'); },
22
+ prepareStartup: async () => { calls.push('prepare'); },
23
+ start: async () => { calls.push('start'); state = { state: 'running', pid: 123 }; },
24
+ supervisor: async () => state,
25
+ autostart: async () => 'enabled', wait: async () => { },
26
+ exclusive: operation => {
27
+ const result = tail.then(operation);
28
+ tail = result.catch(() => { });
29
+ return result;
30
+ },
31
+ };
32
+ return { input, deps, calls, setSupervisor: (value) => { state = value; },
33
+ cleanup: () => rm(home, { recursive: true, force: true }) };
34
+ }
35
+ test('enable verifies enrollment, registers one scope and starts only one shared supervisor', async () => {
36
+ const f = await fixture();
37
+ try {
38
+ const first = await enableDemoWatch(f.input, f.deps);
39
+ assert.equal(first.registered, true);
40
+ assert.equal(first.supervisor, 'running');
41
+ assert.equal(first.stage, 'demo_watch_pending');
42
+ assert.equal(first.fullWorkflowReady, false);
43
+ await enableDemoWatch(f.input, f.deps);
44
+ assert.equal(f.calls.filter(value => value === 'start').length, 1);
45
+ assert.equal((await listDemoWatchRegistrations(f.input.home)).length, 1);
46
+ assert.deepEqual(f.calls.slice(0, 3), ['verify', 'prepare', 'start']);
47
+ assert.doesNotMatch(JSON.stringify(first), /workspace|grant|credential|email|configPath/);
48
+ }
49
+ finally {
50
+ await f.cleanup();
51
+ }
52
+ });
53
+ test('dry-run and rejected authorization do not create a registry or startup entry', async () => {
54
+ const f = await fixture();
55
+ try {
56
+ assert.equal((await enableDemoWatch({ ...f.input, dryRun: true }, f.deps)).stage, 'demo_watch_plan');
57
+ assert.deepEqual(f.calls, []);
58
+ f.deps.verify = async () => { throw Object.assign(new Error('private secret'), { code: 'demo_fabric_device_revoked' }); };
59
+ await assert.rejects(enableDemoWatch(f.input, f.deps), /demo_fabric_device_revoked/);
60
+ assert.deepEqual(await listDemoWatchRegistrations(f.input.home), []);
61
+ assert.deepEqual(f.calls, []);
62
+ }
63
+ finally {
64
+ await f.cleanup();
65
+ }
66
+ });
67
+ test('ten concurrent enable requests converge without ten service starts', async () => {
68
+ const f = await fixture();
69
+ try {
70
+ await Promise.all(Array.from({ length: 10 }, () => enableDemoWatch(f.input, f.deps)));
71
+ assert.equal((await listDemoWatchRegistrations(f.input.home)).length, 1);
72
+ assert.equal(f.calls.filter(value => value === 'start').length, 1);
73
+ }
74
+ finally {
75
+ await f.cleanup();
76
+ }
77
+ });
78
+ test('startup failure preserves the registered scope for a grant-free retry', async () => {
79
+ const f = await fixture();
80
+ try {
81
+ const start = f.deps.start;
82
+ f.deps.start = async () => { throw new Error('private service details'); };
83
+ await assert.rejects(enableDemoWatch(f.input, f.deps), /^Error: demo_watch_start_failed:/);
84
+ assert.equal((await listDemoWatchRegistrations(f.input.home)).length, 1);
85
+ f.deps.start = start;
86
+ assert.equal((await enableDemoWatch(f.input, f.deps)).supervisor, 'running');
87
+ }
88
+ finally {
89
+ await f.cleanup();
90
+ }
91
+ });
92
+ test('an incompatible or unknown active supervisor is not killed or replaced', async () => {
93
+ const f = await fixture();
94
+ try {
95
+ for (const state of ['version_mismatch', 'legacy', 'unknown']) {
96
+ f.setSupervisor({ state, pid: 123 });
97
+ await assert.rejects(enableDemoWatch(f.input, f.deps), /demo_watch_supervisor_conflict/);
98
+ assert.equal((await listDemoWatchRegistrations(f.input.home)).length, 0);
99
+ assert.equal(f.calls.includes('prepare'), false);
100
+ assert.equal(f.calls.includes('start'), false);
101
+ }
102
+ }
103
+ finally {
104
+ await f.cleanup();
105
+ }
106
+ });
107
+ test('status uses only a current scoped observation and never equates a cycle with full readiness', async () => {
108
+ const f = await fixture();
109
+ try {
110
+ await enableDemoWatch(f.input, f.deps);
111
+ await writeFile(join(f.input.home, 'relay', 'supervisor.pid'), '123\n');
112
+ await writeDemoWatchHealth(f.input.home, { schema: 'dharma.demo-watch-health/v1',
113
+ key: demoWatchRegistrationKey(f.input.registration), pid: 123, version: f.input.version,
114
+ observedAt: new Date().toISOString(), state: 'completed', stage: 'demo_repository_package_installed',
115
+ sourceState: 'unchanged', code: null });
116
+ const observed = await demoWatchStatus(f.input, f.deps);
117
+ assert.equal(observed.stage, 'demo_watch_cycle_observed');
118
+ assert.equal(observed.fullWorkflowReady, false);
119
+ f.setSupervisor({ state: 'stopped', pid: null });
120
+ assert.equal((await demoWatchStatus(f.input, f.deps)).observation, null);
121
+ f.setSupervisor({ state: 'running', pid: 124 });
122
+ assert.equal((await demoWatchStatus(f.input, f.deps)).stage, 'demo_watch_pending');
123
+ }
124
+ finally {
125
+ await f.cleanup();
126
+ }
127
+ });
128
+ test('disable works after authorization revocation and preserves another scope and shared startup', async () => {
129
+ const f = await fixture();
130
+ try {
131
+ await enableDemoWatch(f.input, f.deps);
132
+ const other = { ...f.input.registration, repositoryId: '00000000-0000-4000-8000-000000000002' };
133
+ await registerDemoWatch(f.input.home, other);
134
+ f.deps.verify = async () => { throw new Error('revoked'); };
135
+ const calls = [...f.calls];
136
+ const result = await disableDemoWatch(f.input, f.deps);
137
+ assert.equal(result.stage, 'demo_watch_disabled');
138
+ assert.equal(result.registered, false);
139
+ assert.equal(result.autostart, 'enabled');
140
+ assert.deepEqual(await listDemoWatchRegistrations(f.input.home), [other]);
141
+ assert.deepEqual(f.calls, calls);
142
+ assert.equal((await readFile(join(f.input.home, 'relay', 'demo-watches', `${demoWatchRegistrationKey(other)}.json`), 'utf8')).includes('grant'), false);
143
+ }
144
+ finally {
145
+ await f.cleanup();
146
+ }
147
+ });
148
+ test('a foreign checkout cannot inspect or remove an existing scope', async () => {
149
+ const f = await fixture();
150
+ try {
151
+ await enableDemoWatch(f.input, f.deps);
152
+ const other = { ...f.input, registration: { ...f.input.registration, workspace: join(f.input.home, 'elsewhere') } };
153
+ await assert.rejects(demoWatchStatus(other, f.deps), /demo_watch_registration_conflict/);
154
+ await assert.rejects(disableDemoWatch(other, f.deps), /demo_watch_registration_conflict/);
155
+ assert.equal((await listDemoWatchRegistrations(f.input.home)).length, 1);
156
+ }
157
+ finally {
158
+ await f.cleanup();
159
+ }
160
+ });
161
+ test('supervisor inspection rejects stale bindings, invalid PID and legacy/version mismatch', async () => {
162
+ const f = await fixture();
163
+ try {
164
+ await mkdir(join(f.input.home, 'relay'));
165
+ const pidPath = join(f.input.home, 'relay', 'supervisor.pid');
166
+ const bindingPath = join(f.input.home, 'relay', 'supervisor-workspace.json');
167
+ await writeFile(pidPath, '123\n');
168
+ await writeFile(bindingPath, JSON.stringify({ pid: 124, version: '0.2.103', demoWatches: true }));
169
+ const inspect = () => inspectDemoWatchSupervisor(f.input.home, f.input.version, async () => 'running');
170
+ assert.equal((await inspect()).state, 'unknown');
171
+ await writeFile(bindingPath, JSON.stringify({ pid: 123, version: '0.2.102', demoWatches: true }));
172
+ assert.equal((await inspect()).state, 'version_mismatch');
173
+ await writeFile(bindingPath, JSON.stringify({ pid: 123, version: '0.2.103' }));
174
+ assert.equal((await inspect()).state, 'legacy');
175
+ await writeFile(bindingPath, JSON.stringify({ pid: 123, version: '0.2.103', demoWatches: true }));
176
+ assert.deepEqual(await inspect(), { state: 'running', pid: 123 });
177
+ await writeFile(pidPath, 'invalid');
178
+ assert.equal((await inspect()).state, 'unknown');
179
+ }
180
+ finally {
181
+ await f.cleanup();
182
+ }
183
+ });
184
+ //# sourceMappingURL=demoWatchControl.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoWatchControl.test.js","sourceRoot":"","sources":["../src/demoWatchControl.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,0BAA0B,EACxB,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,iBAAiB,EAClD,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,KAAK,UAAU,OAAO;IACpB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC1C,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;IACvB,MAAM,YAAY,GAA0B,EAAE,MAAM,EAAE,sBAAsB,EAAE,KAAK,EAAE,qBAAqB;QACxG,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,sCAAsC;QAChF,oBAAoB,EAAE,yBAAyB,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAClF,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACzD,IAAI,KAAK,GAAwB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAqB,OAAO,CAAC,OAAO,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAiC;QACzC,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7C,cAAc,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACnF,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;QAC7B,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtD,SAAS,EAAE,SAAS,CAAC,EAAE;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAAC,OAAO,MAAM,CAAC;QACpF,CAAC;KACF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,KAA0B,EAAE,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QAC5F,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;IACvG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,6CAA6C,CAAC,CAAC;IAC5F,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;IAC9F,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,eAAe,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QACrG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1H,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,4BAA4B,CAAC,CAAC;QACrF,MAAM,CAAC,SAAS,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;IACpF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;IACvF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAC3B,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,kCAAkC,CAAC,CAAC;QAC3F,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC/E,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;IACxF,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,CAAC,kBAAkB,EAAE,QAAQ,EAAE,SAAS,CAAU,EAAE,CAAC;YACvE,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACrC,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,gCAAgC,CAAC,CAAC;YACzF,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;IAC7G,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,6BAA6B;YAC9E,GAAG,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO;YACvF,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,mCAAmC;YACpG,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,2BAA2B,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzE,CAAC,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC;IACrF,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;IAC7G,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,sCAAsC,EAAE,CAAC;QAChG,MAAM,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1J,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC/E,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC;QACpH,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,kCAAkC,CAAC,CAAC;QACzF,MAAM,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,kCAAkC,CAAC,CAAC;QAC1F,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;IACvG,MAAM,CAAC,GAAG,MAAM,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,2BAA2B,CAAC,CAAC;QAC7E,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClG,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC;QACvG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACjD,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QAC1D,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAClG,MAAM,CAAC,SAAS,CAAC,MAAM,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAClE,MAAM,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAClC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { DemoWatchObservation } from './demoSupervisor.js';
2
+ export type DemoWatchHealth = Omit<DemoWatchObservation, 'key'> & {
3
+ schema: 'dharma.demo-watch-health/v1';
4
+ key: string;
5
+ pid: number;
6
+ version: string;
7
+ observedAt: string;
8
+ };
9
+ export declare function writeDemoWatchHealth(home: string, value: DemoWatchHealth): Promise<void>;
10
+ export declare function readDemoWatchHealth(home: string, key: string, expected: {
11
+ pid: number;
12
+ version: string;
13
+ now?: number;
14
+ }): Promise<DemoWatchHealth | null>;
15
+ export declare function createDemoWatchHealthRecorder(input: {
16
+ home: string;
17
+ pid: number;
18
+ version: string;
19
+ now?: () => number;
20
+ write?: typeof writeDemoWatchHealth;
21
+ }): {
22
+ available: (key?: string) => boolean;
23
+ record(observation: DemoWatchObservation): void;
24
+ drain(): Promise<void>;
25
+ };
26
+ //# sourceMappingURL=demoWatchHealth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoWatchHealth.d.ts","sourceRoot":"","sources":["../src/demoWatchHealth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,GAAG;IAChE,MAAM,EAAE,6BAA6B,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IACnD,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;CAClD,CAAC;AAwDF,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,iBAqB9E;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EACjE,QAAQ,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAsB3F;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/D,KAAK,CAAC,EAAE,OAAO,oBAAoB,CAAC;CACrC;sBAwBqB,MAAM;wBACJ,oBAAoB;;EAc3C"}
@@ -0,0 +1,177 @@
1
+ import { constants } from 'node:fs';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { lstat, mkdir, open, readFile, rename, unlink } from 'node:fs/promises';
4
+ import { join, resolve } from 'node:path';
5
+ function assertKey(key) {
6
+ if (!/^[a-f0-9]{64}$/.test(key))
7
+ throw new Error('Demo watch health key is invalid.');
8
+ }
9
+ function validate(value, key) {
10
+ const row = value;
11
+ const keys = ['schema', 'key', 'pid', 'version', 'observedAt', 'state', 'stage', 'sourceState', 'code'];
12
+ const bounded = (value) => typeof value === 'string' && /^[a-z0-9_]{1,80}$/.test(value);
13
+ if (!row || typeof row !== 'object' || Array.isArray(row)
14
+ || Object.keys(row).length !== keys.length || keys.some(field => !Object.hasOwn(row, field))
15
+ || row.schema !== 'dharma.demo-watch-health/v1' || row.key !== key
16
+ || !Number.isSafeInteger(row.pid) || row.pid < 1
17
+ || typeof row.version !== 'string' || !/^(?=.{1,64}$)\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/.test(row.version)
18
+ || typeof row.observedAt !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(row.observedAt)
19
+ || !Number.isFinite(Date.parse(row.observedAt)) || new Date(row.observedAt).toISOString() !== row.observedAt
20
+ || !['completed', 'failed', 'timed_out'].includes(row.state)
21
+ || (row.stage !== null && !bounded(row.stage))
22
+ || (row.sourceState !== null && !bounded(row.sourceState))
23
+ || (row.state === 'completed' ? !bounded(row.stage) || row.code !== null
24
+ : row.stage !== null || row.sourceState !== null || !bounded(row.code))) {
25
+ throw new Error('Demo watch health receipt is invalid.');
26
+ }
27
+ assertKey(row.key);
28
+ return row;
29
+ }
30
+ async function directory(home, create) {
31
+ let path = resolve(home);
32
+ for (const segment of ['', 'relay', 'demo-watch-health']) {
33
+ if (segment)
34
+ path = join(path, segment);
35
+ if (create && segment)
36
+ await mkdir(path, { mode: 0o700 }).catch((error) => {
37
+ if (error.code !== 'EEXIST')
38
+ throw error;
39
+ });
40
+ const entry = await lstat(path).catch((error) => {
41
+ if (!create && error.code === 'ENOENT')
42
+ return null;
43
+ throw error;
44
+ });
45
+ if (!entry)
46
+ return null;
47
+ if (!entry.isDirectory() || entry.isSymbolicLink())
48
+ throw new Error('Demo watch health directory or symlink is invalid.');
49
+ }
50
+ return path;
51
+ }
52
+ async function fileEntry(path) {
53
+ const entry = await lstat(path).catch((error) => {
54
+ if (error.code === 'ENOENT')
55
+ return null;
56
+ throw error;
57
+ });
58
+ if (entry && (!entry.isFile() || entry.isSymbolicLink() || entry.size > 8192)) {
59
+ throw new Error('Demo watch health file or symlink is invalid.');
60
+ }
61
+ return entry;
62
+ }
63
+ export async function writeDemoWatchHealth(home, value) {
64
+ const row = validate(value, value?.key);
65
+ const root = (await directory(home, true));
66
+ const target = join(root, `${row.key}.json`);
67
+ await fileEntry(target);
68
+ const supervisor = Number((await readFile(join(home, 'relay', 'supervisor.pid'), 'utf8')).trim());
69
+ if (supervisor !== row.pid)
70
+ throw new Error('Demo watch health supervisor changed before publication.');
71
+ const temporary = join(root, `.${row.key}.${randomUUID()}.tmp`);
72
+ try {
73
+ const handle = await open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | (constants.O_NOFOLLOW || 0), 0o600);
74
+ try {
75
+ await handle.writeFile(`${JSON.stringify(row)}\n`);
76
+ await handle.sync();
77
+ }
78
+ finally {
79
+ await handle.close();
80
+ }
81
+ // The caller retains the singleton lease until its serialized receipt writes finish.
82
+ if (Number((await readFile(join(home, 'relay', 'supervisor.pid'), 'utf8')).trim()) !== row.pid) {
83
+ throw new Error('Demo watch health supervisor changed before publication.');
84
+ }
85
+ await rename(temporary, target);
86
+ }
87
+ finally {
88
+ await unlink(temporary).catch((error) => { if (error.code !== 'ENOENT')
89
+ throw error; });
90
+ }
91
+ }
92
+ export async function readDemoWatchHealth(home, key, expected) {
93
+ assertKey(key);
94
+ const root = await directory(home, false);
95
+ if (!root)
96
+ return null;
97
+ const path = join(root, `${key}.json`);
98
+ const entry = await fileEntry(path);
99
+ if (!entry)
100
+ return null;
101
+ const handle = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW || 0));
102
+ let row;
103
+ try {
104
+ const actual = await handle.stat();
105
+ if (!actual.isFile() || actual.size > 8192 || (entry.ino !== 0 && actual.ino !== entry.ino)) {
106
+ throw new Error('Demo watch health file changed during validation.');
107
+ }
108
+ let parsed;
109
+ try {
110
+ parsed = JSON.parse(await handle.readFile({ encoding: 'utf8' }));
111
+ }
112
+ catch {
113
+ throw new Error('Demo watch health receipt is invalid.');
114
+ }
115
+ row = validate(parsed, key);
116
+ }
117
+ finally {
118
+ await handle.close();
119
+ }
120
+ const age = (expected.now ?? Date.now()) - Date.parse(row.observedAt);
121
+ if (row.pid !== expected.pid || row.version !== expected.version || age < -5_000 || age > 180_000)
122
+ return null;
123
+ return row;
124
+ }
125
+ export function createDemoWatchHealthRecorder(input) {
126
+ const pending = new Map();
127
+ const write = input.write ?? writeDemoWatchHealth;
128
+ let worker = null;
129
+ const failedScopes = new Set();
130
+ let invalid = false;
131
+ const flush = async () => {
132
+ while (pending.size) {
133
+ const [key, row] = pending.entries().next().value;
134
+ pending.delete(key);
135
+ try {
136
+ await write(input.home, row);
137
+ failedScopes.delete(key);
138
+ }
139
+ catch {
140
+ if (failedScopes.has(key) || failedScopes.size < 32)
141
+ failedScopes.add(key);
142
+ else
143
+ invalid = true;
144
+ }
145
+ }
146
+ };
147
+ const schedule = () => {
148
+ worker ??= Promise.resolve().then(flush).finally(() => {
149
+ worker = null;
150
+ if (pending.size)
151
+ schedule();
152
+ });
153
+ };
154
+ return {
155
+ available: (key) => !invalid && (key ? !failedScopes.has(key) : failedScopes.size === 0),
156
+ record(observation) {
157
+ if (observation.key === null)
158
+ return;
159
+ try {
160
+ const row = validate({ schema: 'dharma.demo-watch-health/v1', key: observation.key,
161
+ pid: input.pid, version: input.version, observedAt: new Date((input.now ?? Date.now)()).toISOString(),
162
+ state: observation.state, stage: observation.stage, sourceState: observation.sourceState,
163
+ code: observation.code }, observation.key);
164
+ if (!pending.has(row.key) && pending.size >= 32)
165
+ throw new Error('Health queue is full.');
166
+ pending.set(row.key, row);
167
+ schedule();
168
+ }
169
+ catch {
170
+ invalid = true;
171
+ }
172
+ },
173
+ async drain() { while (worker)
174
+ await worker; },
175
+ };
176
+ }
177
+ //# sourceMappingURL=demoWatchHealth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoWatchHealth.js","sourceRoot":"","sources":["../src/demoWatchHealth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=demoWatchHealth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demoWatchHealth.test.d.ts","sourceRoot":"","sources":["../src/demoWatchHealth.test.ts"],"names":[],"mappings":""}