@dharma-ai-labs/agent-fabric 0.2.134 → 0.2.136

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 (34) hide show
  1. package/README.md +49 -0
  2. package/dist/containerDockerInit.test.d.ts +2 -0
  3. package/dist/containerDockerInit.test.d.ts.map +1 -0
  4. package/dist/containerDockerInit.test.js +187 -0
  5. package/dist/containerDockerInit.test.js.map +1 -0
  6. package/dist/containerRelayLifecycle.d.ts +68 -0
  7. package/dist/containerRelayLifecycle.d.ts.map +1 -0
  8. package/dist/containerRelayLifecycle.js +534 -0
  9. package/dist/containerRelayLifecycle.js.map +1 -0
  10. package/dist/containerRelayLifecycle.test.d.ts +2 -0
  11. package/dist/containerRelayLifecycle.test.d.ts.map +1 -0
  12. package/dist/containerRelayLifecycle.test.js +502 -0
  13. package/dist/containerRelayLifecycle.test.js.map +1 -0
  14. package/dist/containerRelayPublicCommand.test.d.ts +2 -0
  15. package/dist/containerRelayPublicCommand.test.d.ts.map +1 -0
  16. package/dist/containerRelayPublicCommand.test.js +28 -0
  17. package/dist/containerRelayPublicCommand.test.js.map +1 -0
  18. package/dist/containerRelaySchema.test.d.ts +2 -0
  19. package/dist/containerRelaySchema.test.d.ts.map +1 -0
  20. package/dist/containerRelaySchema.test.js +44 -0
  21. package/dist/containerRelaySchema.test.js.map +1 -0
  22. package/dist/demoWatchControl.d.ts +3 -3
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +43 -10
  25. package/dist/index.js.map +1 -1
  26. package/dist/relayAutostart.d.ts +10 -3
  27. package/dist/relayAutostart.d.ts.map +1 -1
  28. package/dist/relayAutostart.js +57 -16
  29. package/dist/relayAutostart.js.map +1 -1
  30. package/dist/schemas/container-relay-lifecycle.v1.schema.json +226 -0
  31. package/dist/schemas/relay-autostart.v3.schema.json +52 -0
  32. package/dist/usage.js +1 -1
  33. package/dist/usage.js.map +1 -1
  34. package/package.json +1 -1
@@ -0,0 +1,534 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { execFile, spawn } from 'node:child_process';
3
+ import { constants } from 'node:fs';
4
+ import { lstat, mkdir, open, readFile, realpath, rename, rm, stat, writeFile } from 'node:fs/promises';
5
+ import { dirname, isAbsolute, join, resolve } from 'node:path';
6
+ import { promisify } from 'node:util';
7
+ import { fileURLToPath } from 'node:url';
8
+ const unavailable = () => new Error('container_startup_unavailable: an owned live container entrypoint is required.');
9
+ const privatePath = (home, name) => join(home, 'relay', name);
10
+ const ownUid = (options) => options.uid ?? process.getuid?.() ?? -1;
11
+ async function privateDirectory(options) {
12
+ if (!isAbsolute(options.home) || resolve(options.home) !== options.home || ownUid(options) <= 0)
13
+ throw unavailable();
14
+ for (const path of [options.home, join(options.home, 'relay')]) {
15
+ const stat = await lstat(path);
16
+ if (!stat.isDirectory() || stat.isSymbolicLink() || stat.uid !== ownUid(options) || (stat.mode & 0o077) !== 0)
17
+ throw unavailable();
18
+ }
19
+ }
20
+ async function privateJson(options, name) {
21
+ try {
22
+ const path = privatePath(options.home, name);
23
+ // Validate the opened descriptor, not two different path snapshots. An
24
+ // owned atomic rename can legitimately replace the path between lstat/open.
25
+ // O_NOFOLLOW and fstat still reject symlinks, foreign owners and unsafe modes.
26
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
27
+ try {
28
+ await privateDirectory(options);
29
+ const current = await file.stat();
30
+ if (!current.isFile() || current.uid !== ownUid(options) || (current.mode & 0o077) !== 0
31
+ || current.size > 32_768)
32
+ throw unavailable();
33
+ const text = await file.readFile('utf8');
34
+ if (Buffer.byteLength(text) > 32_768)
35
+ throw unavailable();
36
+ return JSON.parse(text);
37
+ }
38
+ finally {
39
+ await file.close();
40
+ }
41
+ }
42
+ catch (error) {
43
+ if (error.code === 'ENOENT')
44
+ return null;
45
+ throw unavailable();
46
+ }
47
+ }
48
+ function exactObject(value, keys) {
49
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value)
50
+ && Object.keys(value).length === keys.length && keys.every(key => Object.hasOwn(value, key)));
51
+ }
52
+ export async function readContainerPid1Identity() {
53
+ return readContainerProcessIdentity(1);
54
+ }
55
+ export async function readContainerProcessIdentity(pid) {
56
+ if (!Number.isSafeInteger(pid) || pid < 1)
57
+ throw unavailable();
58
+ const [stat, command, owner] = await Promise.all([
59
+ readFile(`/proc/${pid}/stat`, 'utf8'), readFile(`/proc/${pid}/cmdline`), lstat(`/proc/${pid}`),
60
+ ]);
61
+ if (stat.length > 8192 || command.length > 8192 || Number(stat.slice(0, stat.indexOf(' '))) !== pid)
62
+ throw unavailable();
63
+ const fields = stat.slice(stat.lastIndexOf(')') + 2).trim().split(/\s+/);
64
+ if (fields[0] === 'Z' || fields[0] === 'X')
65
+ throw unavailable();
66
+ return { pid, uid: owner.uid, parentPid: Number(fields[1]), processGroupId: Number(fields[2]), sessionId: Number(fields[3]), startTicks: fields[19] || '',
67
+ argv: command.toString('utf8').split('\0').filter(Boolean) };
68
+ }
69
+ async function dockerInitMainChild() {
70
+ // Tini forks its main child first. Linux appends subsequently forked and
71
+ // adopted children to this kernel list; PPID 1 alone also admits orphans.
72
+ // Retain the first entry even if it is a zombie: never promote an adoptee.
73
+ const file = await open('/proc/1/task/1/children', constants.O_RDONLY);
74
+ try {
75
+ const bytes = Buffer.alloc(4097);
76
+ const { bytesRead } = await file.read(bytes, 0, bytes.length, 0);
77
+ if (bytesRead === 0 || bytesRead > 4096)
78
+ throw unavailable();
79
+ const text = bytes.subarray(0, bytesRead).toString('ascii').trim();
80
+ if (!/^[1-9]\d*(?:\s+[1-9]\d*)*$/.test(text))
81
+ throw unavailable();
82
+ const children = text.split(/\s+/).map(Number);
83
+ if (children.length > 256 || children.some(pid => !Number.isSafeInteger(pid) || pid <= 1)
84
+ || new Set(children).size !== children.length)
85
+ throw unavailable();
86
+ return children[0];
87
+ }
88
+ finally {
89
+ await file.close();
90
+ }
91
+ }
92
+ async function verifiedDockerInit() {
93
+ // Docker's --init executable is supplied by the daemon, root-owned and not
94
+ // writable by the client UID. Names or argv alone cannot establish this.
95
+ try {
96
+ const canonical = await realpath('/sbin/docker-init');
97
+ if (canonical !== '/usr/sbin/docker-init' && canonical !== '/sbin/docker-init')
98
+ return false;
99
+ if (await realpath('/proc/1/exe') !== canonical)
100
+ return false;
101
+ const [file, running] = await Promise.all([lstat(canonical), stat('/proc/1/exe')]);
102
+ return file.isFile() && file.uid === 0 && (file.mode & 0o022) === 0
103
+ && file.dev === running.dev && file.ino === running.ino;
104
+ }
105
+ catch {
106
+ return false;
107
+ }
108
+ }
109
+ async function verifiedControllerExecutable(identity) {
110
+ try {
111
+ const candidate = identity.argv[0];
112
+ if (!candidate || !isAbsolute(candidate))
113
+ return false;
114
+ const canonical = await realpath(candidate);
115
+ if (await realpath(`/proc/${identity.pid}/exe`) !== canonical)
116
+ return false;
117
+ const [file, running] = await Promise.all([lstat(canonical), stat(`/proc/${identity.pid}/exe`)]);
118
+ return file.isFile() && file.uid === 0 && (file.mode & 0o022) === 0
119
+ && file.dev === running.dev && file.ino === running.ino;
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ }
125
+ async function publicRuntimeBytes(path, limit, executingCaller = false) {
126
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
127
+ try {
128
+ const stat = await file.stat();
129
+ if (!stat.isFile() || !executingCaller && (stat.mode & 0o022) !== 0 || stat.size > limit)
130
+ throw unavailable();
131
+ const bytes = await file.readFile();
132
+ if (bytes.length > limit)
133
+ throw unavailable();
134
+ return bytes;
135
+ }
136
+ finally {
137
+ await file.close();
138
+ }
139
+ }
140
+ async function canonicalEntrypoint(options, identity) {
141
+ if (options.containerRuntime?.canonicalEntrypoint)
142
+ return options.containerRuntime.canonicalEntrypoint;
143
+ try {
144
+ const current = await realpath(fileURLToPath(new URL('./bin.js', import.meta.url)));
145
+ const candidate = identity.argv[1];
146
+ if (!candidate || !isAbsolute(candidate) || candidate.length > 4096 || /[\r\n\0]/.test(candidate)
147
+ || await realpath(candidate) !== candidate || !candidate.endsWith('/dist/bin.js'))
148
+ throw unavailable();
149
+ const manifest = JSON.parse((await publicRuntimeBytes(join(dirname(dirname(candidate)), 'package.json'), 65_536)).toString('utf8'));
150
+ const own = JSON.parse((await publicRuntimeBytes(join(dirname(dirname(current)), 'package.json'), 65_536, true)).toString('utf8'));
151
+ if (manifest.name !== '@dharma-ai-labs/agent-fabric' || manifest.name !== own.name || manifest.version !== own.version)
152
+ throw unavailable();
153
+ // Image and npm execution prefixes can differ. Verify the entrypoint and
154
+ // bootstrap/lifecycle executable bytes, not an arbitrary path alias.
155
+ for (const name of ['bin.js', 'index.js', 'containerRelayLifecycle.js']) {
156
+ const [installed, caller] = await Promise.all([
157
+ publicRuntimeBytes(join(dirname(candidate), name), 2_097_152), publicRuntimeBytes(join(dirname(current), name), 2_097_152, true),
158
+ ]);
159
+ if (!installed.equals(caller))
160
+ throw unavailable();
161
+ }
162
+ return candidate;
163
+ }
164
+ catch {
165
+ throw unavailable();
166
+ }
167
+ }
168
+ function ownedIdentity(identity, uid, entrypoint) {
169
+ return Number.isSafeInteger(identity.pid) && identity.pid >= 1 && identity.uid === uid && Number.isSafeInteger(uid) && uid > 0 && /^\d{1,20}$/.test(identity.startTicks)
170
+ && identity.argv.length === 4 && identity.argv[2] === 'relay' && identity.argv[3] === 'container-entrypoint'
171
+ && identity.argv[1] === entrypoint && isAbsolute(entrypoint);
172
+ }
173
+ function validMarker(value) {
174
+ const init = Boolean(value && typeof value === 'object' && value.schema === 'dharma.container-entrypoint/v2');
175
+ return exactObject(value, ['schema', 'home', 'pid', 'uid', 'startTicks', ...(init ? ['initStartTicks'] : [])])
176
+ && (init ? value.schema === 'dharma.container-entrypoint/v2' && Number.isSafeInteger(value.pid) && Number(value.pid) > 1
177
+ && typeof value.initStartTicks === 'string' && /^\d{1,20}$/.test(value.initStartTicks)
178
+ : value.schema === 'dharma.container-entrypoint/v1' && value.pid === 1)
179
+ && typeof value.home === 'string' && Number.isSafeInteger(value.uid) && Number(value.uid) > 0
180
+ && typeof value.startTicks === 'string' && /^\d{1,20}$/.test(value.startTicks);
181
+ }
182
+ async function ownedController(options, pid) {
183
+ const init = await (options.containerRuntime?.identity || readContainerPid1Identity)();
184
+ if (init.pid !== 1 || init.uid !== ownUid(options) || !/^\d{1,20}$/.test(init.startTicks))
185
+ throw unavailable();
186
+ if (init.argv[2] === 'relay' && init.argv[3] === 'container-entrypoint') {
187
+ if (pid !== undefined && pid !== 1 || !ownedIdentity(init, ownUid(options), await canonicalEntrypoint(options, init)))
188
+ throw unavailable();
189
+ return { identity: init, initStartTicks: undefined };
190
+ }
191
+ // Bounded migration of the existing official Node-image startup. Neither an
192
+ // arbitrary init/wrapper nor a foreground exec can claim this lifecycle.
193
+ if (init.parentPid !== 0 || init.argv.length !== 5 || init.argv[0] !== '/sbin/docker-init' || init.argv[1] !== '--'
194
+ || init.argv[2] !== 'docker-entrypoint.sh' || init.argv[3] !== 'sleep' || init.argv[4] !== 'infinity'
195
+ || !await (options.containerRuntime?.dockerInitVerified || verifiedDockerInit)())
196
+ throw unavailable();
197
+ const controller = await (options.containerRuntime?.controllerIdentity || readContainerProcessIdentity)(pid ?? options.containerRuntime?.currentControllerPid ?? process.pid);
198
+ if (controller.pid <= 1 || controller.parentPid !== 1
199
+ || !Number.isSafeInteger(init.sessionId) || Number(init.sessionId) <= 0
200
+ || controller.sessionId !== init.sessionId || controller.processGroupId !== controller.pid
201
+ || await (options.containerRuntime?.dockerInitMainChild || dockerInitMainChild)() !== controller.pid
202
+ || !ownedIdentity(controller, ownUid(options), await canonicalEntrypoint(options, controller))
203
+ || !await (options.containerRuntime?.controllerExecutableVerified || verifiedControllerExecutable)(controller))
204
+ throw unavailable();
205
+ const [freshInit, freshController, freshMainChild] = await Promise.all([
206
+ (options.containerRuntime?.identity || readContainerPid1Identity)(),
207
+ (options.containerRuntime?.controllerIdentity || readContainerProcessIdentity)(controller.pid),
208
+ (options.containerRuntime?.dockerInitMainChild || dockerInitMainChild)(),
209
+ ]);
210
+ if (freshInit.pid !== init.pid || freshInit.uid !== init.uid || freshInit.startTicks !== init.startTicks
211
+ || JSON.stringify(freshInit.argv) !== JSON.stringify(init.argv)
212
+ || freshInit.sessionId !== init.sessionId || freshInit.processGroupId !== init.processGroupId
213
+ || freshController.pid !== controller.pid || freshController.uid !== controller.uid
214
+ || freshController.parentPid !== 1 || freshController.startTicks !== controller.startTicks
215
+ || freshMainChild !== controller.pid || freshController.sessionId !== init.sessionId
216
+ || freshController.processGroupId !== controller.pid
217
+ || JSON.stringify(freshController.argv) !== JSON.stringify(controller.argv))
218
+ throw unavailable();
219
+ return { identity: controller, initStartTicks: init.startTicks };
220
+ }
221
+ async function liveMarker(options) {
222
+ const marker = await privateJson(options, 'container-entrypoint.json');
223
+ if (!validMarker(marker) || marker.home !== options.home || marker.uid !== ownUid(options))
224
+ throw unavailable();
225
+ const live = await ownedController(options, marker.pid);
226
+ if (live.identity.startTicks !== marker.startTicks || live.initStartTicks !== marker.initStartTicks)
227
+ throw unavailable();
228
+ return marker;
229
+ }
230
+ export async function readContainerChildIdentity(pid) {
231
+ if (!Number.isSafeInteger(pid) || pid <= 1)
232
+ throw unavailable();
233
+ const [stat, owner] = await Promise.all([readFile(`/proc/${pid}/stat`, 'utf8'), lstat(`/proc/${pid}`)]);
234
+ if (stat.length > 8192 || Number(stat.slice(0, stat.indexOf(' '))) !== pid)
235
+ throw unavailable();
236
+ const fields = stat.slice(stat.lastIndexOf(')') + 2).trim().split(/\s+/);
237
+ if (fields[0] === 'Z' || fields[0] === 'X' || !/^\d{1,20}$/.test(fields[19] || ''))
238
+ throw unavailable();
239
+ return { pid, uid: owner.uid, parentPid: Number(fields[1]), startTicks: fields[19] };
240
+ }
241
+ async function ownedChild(options, pid, startTicks, controller) {
242
+ const parent = controller || await liveMarker(options);
243
+ if (controller) {
244
+ const live = await ownedController(options, controller.pid);
245
+ if (live.identity.startTicks !== controller.startTicks || live.initStartTicks !== controller.initStartTicks)
246
+ throw unavailable();
247
+ }
248
+ const identity = await (options.containerRuntime?.childIdentity || readContainerChildIdentity)(pid);
249
+ if (identity.pid !== pid || identity.uid !== ownUid(options) || identity.parentPid !== parent.pid
250
+ || !/^\d{1,20}$/.test(identity.startTicks) || startTicks !== undefined && identity.startTicks !== startTicks)
251
+ throw unavailable();
252
+ return identity;
253
+ }
254
+ export async function containerEntrypointAvailable(options) {
255
+ const value = await privateJson(options, 'container-entrypoint.json');
256
+ if (value === null)
257
+ return false;
258
+ await liveMarker(options);
259
+ return true;
260
+ }
261
+ function registrationHash(home, registration) {
262
+ return createHash('sha256').update(JSON.stringify([home, registration.schema, registration.backend,
263
+ registration.launcher, registration.workspace, registration.policy, registration.version, registration.taskName])).digest('hex');
264
+ }
265
+ async function writePrivateJson(options, name, value) {
266
+ await privateDirectory(options);
267
+ // Refuse a substituted/symlink/world-accessible receipt before replacing it.
268
+ await privateJson(options, name);
269
+ const destination = privatePath(options.home, name);
270
+ const temporary = `${destination}.${randomUUID()}.tmp`;
271
+ try {
272
+ await writeFile(temporary, JSON.stringify(value) + '\n', { mode: 0o600, flag: 'wx' });
273
+ await rename(temporary, destination);
274
+ }
275
+ finally {
276
+ await rm(temporary, { force: true });
277
+ }
278
+ }
279
+ export async function containerStartupControl(options, registration, running) {
280
+ if (!await containerEntrypointAvailable(options))
281
+ throw unavailable();
282
+ await writePrivateJson(options, 'container-control.json', {
283
+ schema: 'dharma.container-relay-control/v1', home: options.home,
284
+ registrationHash: registrationHash(options.home, registration), running,
285
+ });
286
+ }
287
+ export async function containerStartupState(options, registration) {
288
+ if (!await containerEntrypointAvailable(options))
289
+ throw unavailable();
290
+ const value = await privateJson(options, 'container-control.json');
291
+ if (!exactObject(value, ['schema', 'home', 'registrationHash', 'running'])
292
+ || value.schema !== 'dharma.container-relay-control/v1' || value.home !== options.home
293
+ || value.registrationHash !== registrationHash(options.home, registration) || typeof value.running !== 'boolean')
294
+ throw unavailable();
295
+ // Stop pauses the owned relay; it does not unregister its persistent lifecycle.
296
+ const heartbeat = await privateJson(options, 'container-heartbeat.json');
297
+ const marker = await privateJson(options, 'container-entrypoint.json');
298
+ let lifecycle = 'configured';
299
+ if (heartbeat !== null) {
300
+ if (!exactObject(heartbeat, ['schema', 'home', 'startTicks', 'polledAt', 'lifecycle', 'reason', 'registrationHash', 'childPid', 'childStartTicks'])
301
+ || heartbeat.schema !== 'dharma.container-relay-heartbeat/v1' || heartbeat.home !== options.home
302
+ || heartbeat.startTicks !== marker.startTicks || typeof heartbeat.polledAt !== 'number' || !Number.isSafeInteger(heartbeat.polledAt)
303
+ || heartbeat.polledAt > Date.now() + 1000 || Date.now() - heartbeat.polledAt > 10_000
304
+ || !['unconfigured', 'paused', 'blocked', 'starting', 'running'].includes(String(heartbeat.lifecycle))
305
+ || heartbeat.reason !== null && heartbeat.reason !== 'consumer_store_locked_or_unavailable' && heartbeat.reason !== 'relay_runtime_upgrade_required'
306
+ || heartbeat.registrationHash !== null && !/^[a-f0-9]{64}$/.test(String(heartbeat.registrationHash)))
307
+ throw unavailable();
308
+ if (heartbeat.lifecycle === 'running') {
309
+ if (!value.running || !Number.isSafeInteger(heartbeat.childPid) || Number(heartbeat.childPid) <= 1
310
+ || typeof heartbeat.childStartTicks !== 'string')
311
+ throw unavailable();
312
+ await ownedChild(options, Number(heartbeat.childPid), heartbeat.childStartTicks);
313
+ }
314
+ else if (heartbeat.childPid !== null || heartbeat.childStartTicks !== null)
315
+ throw unavailable();
316
+ if (heartbeat.registrationHash === registrationHash(options.home, registration))
317
+ lifecycle = heartbeat.lifecycle;
318
+ }
319
+ return { state: 'enabled', backend: 'container-entrypoint', version: registration.version,
320
+ lifecycle, restartCoverage: 'container-entrypoint-only' };
321
+ }
322
+ export async function ownsContainerStartup(options, registration) {
323
+ // Stop/disable authority comes from the private matching configuration, not a
324
+ // transient child heartbeat. A child may be exiting when control is paused.
325
+ try {
326
+ if (!await containerEntrypointAvailable(options))
327
+ return false;
328
+ const value = await privateJson(options, 'container-control.json');
329
+ return exactObject(value, ['schema', 'home', 'registrationHash', 'running'])
330
+ && value.schema === 'dharma.container-relay-control/v1' && value.home === options.home
331
+ && value.registrationHash === registrationHash(options.home, registration) && typeof value.running === 'boolean';
332
+ }
333
+ catch {
334
+ return false;
335
+ }
336
+ }
337
+ export async function writeContainerRegistration(options, registration) {
338
+ await writePrivateJson(options, 'autostart.json', registration);
339
+ }
340
+ function validRegistration(value) {
341
+ return exactObject(value, ['schema', 'backend', 'launcher', 'workspace', 'policy', 'version', 'taskName'])
342
+ && value.schema === 'dharma.relay-autostart/v3' && value.backend === 'container-entrypoint'
343
+ && typeof value.launcher === 'string' && value.launcher.length <= 4096 && isAbsolute(value.launcher) && !/[\r\n\0]/.test(value.launcher)
344
+ && typeof value.workspace === 'string' && value.workspace.length <= 4096 && isAbsolute(value.workspace) && !/[\r\n\0]/.test(value.workspace)
345
+ && value.policy === join(value.workspace, '.dharma', 'approved-policy.json')
346
+ && typeof value.version === 'string' && /^(?=.{1,64}$)\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/.test(value.version)
347
+ && value.taskName === null;
348
+ }
349
+ export async function readContainerRegistration(options) {
350
+ const value = await privateJson(options, 'autostart.json');
351
+ if (value === null)
352
+ return null;
353
+ if (!validRegistration(value))
354
+ throw unavailable();
355
+ return value;
356
+ }
357
+ async function readConfiguration(options) {
358
+ const value = await privateJson(options, 'autostart.json');
359
+ if (value === null)
360
+ return null;
361
+ if (!validRegistration(value))
362
+ throw unavailable();
363
+ const control = await privateJson(options, 'container-control.json');
364
+ if (control === null)
365
+ return null; // atomic registration precedes its control receipt
366
+ if (!exactObject(control, ['schema', 'home', 'registrationHash', 'running'])
367
+ || control.schema !== 'dharma.container-relay-control/v1' || control.home !== options.home
368
+ || typeof control.running !== 'boolean' || typeof control.registrationHash !== 'string')
369
+ throw unavailable();
370
+ if (control.registrationHash !== registrationHash(options.home, value))
371
+ return null; // fail closed during an owned update
372
+ return { registration: value, running: control.running };
373
+ }
374
+ async function wait(milliseconds, signal) {
375
+ if (signal.aborted)
376
+ return;
377
+ await new Promise(resolveWait => {
378
+ const finish = () => { clearTimeout(timer); signal.removeEventListener('abort', finish); resolveWait(); };
379
+ const timer = setTimeout(finish, milliseconds);
380
+ signal.addEventListener('abort', finish, { once: true });
381
+ if (signal.aborted)
382
+ finish();
383
+ });
384
+ }
385
+ const execFileAsync = promisify(execFile);
386
+ export async function containerConsumerStoreReady() {
387
+ // Metadata only: no Secret Service lookup/get/store and no credential values.
388
+ try {
389
+ const alias = await execFileAsync('dbus-send', ['--session', '--print-reply', '--dest=org.freedesktop.secrets',
390
+ '/org/freedesktop/secrets', 'org.freedesktop.Secret.Service.ReadAlias', 'string:default'], { timeout: 5000, maxBuffer: 8192 });
391
+ const paths = [...alias.stdout.matchAll(/object path "([/a-zA-Z0-9_]+)"/g)];
392
+ if (paths.length !== 1 || !paths[0][1].startsWith('/org/freedesktop/secrets/collection/'))
393
+ return false;
394
+ const locked = await execFileAsync('dbus-send', ['--session', '--print-reply', '--dest=org.freedesktop.secrets',
395
+ paths[0][1], 'org.freedesktop.DBus.Properties.Get', 'string:org.freedesktop.Secret.Collection', 'string:Locked'], { timeout: 5000, maxBuffer: 8192 });
396
+ return /variant\s+boolean false\s*$/.test(locked.stdout);
397
+ }
398
+ catch {
399
+ return false;
400
+ }
401
+ }
402
+ async function stopOwnedChild(child, options, identity, controller) {
403
+ if (child.exitCode !== null || child.signalCode !== null || !child.pid)
404
+ return;
405
+ // Never signal a recycled PID or a process outside this owned parent/UID.
406
+ if (identity && !await ownedChild(options, child.pid, identity.startTicks, controller).catch(() => null))
407
+ return;
408
+ // On an initial /proc failure, the freshly spawned ChildProcess handle is
409
+ // still ours. Drain it immediately; never leave unverified work running.
410
+ // This function accepts no raw PID and only receives this loop's own spawn.
411
+ const exited = new Promise(resolveWait => {
412
+ child.once('exit', () => resolveWait());
413
+ child.once('error', () => resolveWait());
414
+ });
415
+ child.kill('SIGTERM');
416
+ let timer;
417
+ await Promise.race([exited, new Promise(resolveWait => { timer = setTimeout(resolveWait, 10_000); })]);
418
+ if (timer)
419
+ clearTimeout(timer);
420
+ if (child.exitCode === null && child.signalCode === null
421
+ && (!identity || await ownedChild(options, child.pid, identity.startTicks, controller).catch(() => null))) {
422
+ child.kill('SIGKILL');
423
+ await exited;
424
+ }
425
+ }
426
+ export async function runOwnedContainerEntrypoint(options) {
427
+ const live = await ownedController(options);
428
+ const identity = live.identity;
429
+ const bin = await canonicalEntrypoint(options, identity);
430
+ const runtimeVersion = options.containerRuntime?.runtimeVersion
431
+ ?? JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')).version;
432
+ if (typeof runtimeVersion !== 'string' || !/^(?=.{1,64}$)\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/.test(runtimeVersion))
433
+ throw unavailable();
434
+ if (!ownedIdentity(identity, ownUid(options), bin))
435
+ throw unavailable();
436
+ await mkdir(join(options.home, 'relay'), { recursive: true, mode: 0o700 });
437
+ await privateDirectory(options);
438
+ const marker = { schema: live.initStartTicks === undefined ? 'dharma.container-entrypoint/v1' : 'dharma.container-entrypoint/v2', home: options.home,
439
+ pid: identity.pid, uid: identity.uid, startTicks: identity.startTicks,
440
+ ...(live.initStartTicks === undefined ? {} : { initStartTicks: live.initStartTicks }) };
441
+ const previous = await privateJson(options, 'container-entrypoint.json');
442
+ if (previous !== null && (!validMarker(previous) || previous.schema !== marker.schema
443
+ || previous.home !== marker.home || previous.uid !== marker.uid))
444
+ throw unavailable();
445
+ const lockPath = privatePath(options.home, 'container-entrypoint.lock');
446
+ const oldLock = await privateJson(options, 'container-entrypoint.lock');
447
+ if (oldLock !== null) {
448
+ if (!validMarker(oldLock) || oldLock.schema !== marker.schema || oldLock.home !== marker.home || oldLock.uid !== marker.uid)
449
+ throw unavailable();
450
+ if (marker.initStartTicks === undefined ? oldLock.startTicks === marker.startTicks : oldLock.initStartTicks === marker.initStartTicks)
451
+ throw new Error('container_entrypoint_busy: an owned entrypoint is already active.');
452
+ await rm(lockPath); // an earlier boot's private lock; actual PID1 identity was verified
453
+ }
454
+ try {
455
+ await writeFile(lockPath, JSON.stringify(marker), { mode: 0o600, flag: 'wx' });
456
+ }
457
+ catch {
458
+ throw new Error('container_entrypoint_busy: an owned entrypoint is already active.');
459
+ }
460
+ let child = null;
461
+ let childHash = null;
462
+ let childIdentity = null;
463
+ let childFailed = false;
464
+ let restarts = 0;
465
+ let retryAt = 0;
466
+ const pollMs = options.pollMs ?? 1000;
467
+ const restartDelayMs = options.restartDelayMs ?? 5000;
468
+ const spawnRelay = options.spawnRelay || ((registration) => spawn(process.execPath, [bin, 'relay', 'supervise', '--policy', registration.policy], { cwd: registration.workspace, stdio: 'ignore',
469
+ env: { ...process.env, DHARMA_HOME: options.home } }));
470
+ try {
471
+ await writePrivateJson(options, 'container-entrypoint.json', marker);
472
+ while (!options.signal.aborted) {
473
+ if (!await containerEntrypointAvailable(options))
474
+ throw unavailable();
475
+ const configuration = await readConfiguration(options);
476
+ const hash = configuration ? registrationHash(options.home, configuration.registration) : null;
477
+ const compatibleRuntime = configuration?.registration.version === runtimeVersion;
478
+ const protectedConsumer = configuration?.running && compatibleRuntime
479
+ ? await (options.consumerStoreReady || containerConsumerStoreReady)().catch(() => false) : false;
480
+ if (options.signal.aborted)
481
+ break; // no new child after interrupted preflight
482
+ const shouldRun = Boolean(configuration?.running && protectedConsumer);
483
+ if (child && (childFailed || child.exitCode !== null || child.signalCode !== null)) {
484
+ child = null;
485
+ childIdentity = null;
486
+ childHash = null;
487
+ childFailed = false;
488
+ restarts++;
489
+ retryAt = Date.now() + restartDelayMs;
490
+ }
491
+ if (child && (!shouldRun || hash !== childHash)) {
492
+ await stopOwnedChild(child, options, childIdentity, marker);
493
+ child = null;
494
+ childIdentity = null;
495
+ childHash = null;
496
+ }
497
+ if (shouldRun && !child && Date.now() >= retryAt) {
498
+ child = spawnRelay(configuration.registration);
499
+ childHash = hash;
500
+ child.on('error', () => { childFailed = true; });
501
+ childIdentity = child.pid ? await ownedChild(options, child.pid, undefined, marker).catch(() => null) : null;
502
+ if (child.pid && !childIdentity && child.exitCode === null && child.signalCode === null)
503
+ throw unavailable();
504
+ }
505
+ const running = Boolean(child?.pid && childIdentity && !childFailed && child.exitCode === null && child.signalCode === null);
506
+ const heartbeat = { schema: 'dharma.container-relay-heartbeat/v1', home: options.home,
507
+ startTicks: marker.startTicks, polledAt: Date.now(), registrationHash: hash, childPid: running ? child.pid : null,
508
+ childStartTicks: running ? childIdentity.startTicks : null,
509
+ lifecycle: !configuration ? 'unconfigured' : !configuration.running ? 'paused'
510
+ : !protectedConsumer ? 'blocked' : running ? 'running' : 'starting',
511
+ reason: configuration?.running && !compatibleRuntime ? 'relay_runtime_upgrade_required'
512
+ : configuration?.running && !protectedConsumer ? 'consumer_store_locked_or_unavailable' : null };
513
+ await writePrivateJson(options, 'container-heartbeat.json', heartbeat);
514
+ await wait(pollMs, options.signal);
515
+ }
516
+ return { stopped: true, restarts };
517
+ }
518
+ catch {
519
+ throw unavailable();
520
+ }
521
+ finally {
522
+ if (child)
523
+ await stopOwnedChild(child, options, childIdentity, marker);
524
+ const current = await privateJson(options, 'container-entrypoint.json').catch(() => null);
525
+ if (current?.startTicks === marker.startTicks && current.home === marker.home && current.pid === marker.pid && current.initStartTicks === marker.initStartTicks) {
526
+ await rm(privatePath(options.home, 'container-entrypoint.json'), { force: true });
527
+ await rm(privatePath(options.home, 'container-heartbeat.json'), { force: true });
528
+ }
529
+ const lock = await privateJson(options, 'container-entrypoint.lock').catch(() => null);
530
+ if (lock?.startTicks === marker.startTicks && lock.home === marker.home && lock.pid === marker.pid && lock.initStartTicks === marker.initStartTicks)
531
+ await rm(lockPath, { force: true });
532
+ }
533
+ }
534
+ //# sourceMappingURL=containerRelayLifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerRelayLifecycle.js","sourceRoot":"","sources":["../src/containerRelayLifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=containerRelayLifecycle.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerRelayLifecycle.test.d.ts","sourceRoot":"","sources":["../src/containerRelayLifecycle.test.ts"],"names":[],"mappings":""}