@dharma-ai-labs/agent-fabric 0.2.133 → 0.2.135

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -27,6 +27,44 @@ Existing `--grant` integrations remain compatible. New portal instructions use
27
27
  private entry instead. After enrollment, use the exact supported grant-free
28
28
  `bootstrap --resume --complete` command; do not enter or replay the spent grant.
29
29
 
30
+ ## Owned Linux container lifecycle
31
+
32
+ An unprivileged Linux container may use `relay container-entrypoint` as its
33
+ actual non-root PID1 instead of a host systemd user service. Install the exact
34
+ qualified CLI and supported Node runtime in the image, then exec Node with the
35
+ absolute canonical `dist/bin.js` path and `relay container-entrypoint`. The
36
+ command accepts no grant, policy, provider or task arguments. Inspect the
37
+ credential-free plan with `relay container-entrypoint --dry-run` before image
38
+ installation; it makes no local changes. Set an explicit
39
+ private `DHARMA_HOME` before launch. An npm wrapper, shell that does not exec,
40
+ `sleep` or init shim as PID1 does not qualify.
41
+
42
+ The image/operator must provide its own protected Secret Service, private
43
+ session bus and durable private home. Never mount a host bus or copy another
44
+ client's credentials. Genuine provider login and private USER keyring unlock
45
+ remain recipient actions. The entrypoint waits without enrollment or provider
46
+ work until normal signed onboarding installs its canonical startup registration.
47
+ It then launches the exact installed CLI supervisor, retaining all device,
48
+ repository, policy and task checks. A locked or absent protected collection
49
+ blocks launch; it does not select a plaintext store or request a model turn.
50
+
51
+ The entrypoint owns one relay for that container OS user. It never creates a
52
+ second host service or changes an existing systemd user unit. Owned start/stop
53
+ controls use atomic private receipts; disable removes the registration. It
54
+ reaps its child on normal shutdown and retries an exited child with a bounded
55
+ delay. A new container boot renews only its own PID1 lease while retaining its
56
+ configuration and encrypted state. Runtime-version mismatch blocks restart;
57
+ upgrade the reviewed image/runtime together through the normal release path.
58
+
59
+ `relay autostart status` distinguishes saved configuration, blocked storage,
60
+ paused work and a freshly observed live child with matching UID, parent and
61
+ process start time. This is container-entrypoint restart coverage only. The
62
+ CLI does not install Docker restart policy or prove host sign-in/reboot recovery.
63
+ A real container restart, protected-store unlock, unchanged device/session
64
+ identity, current signed relay polling and independent operator rehearsal must
65
+ be observed before claiming readiness. Container creation, entrypoint changes
66
+ and persistent startup installation remain explicit operator decisions.
67
+
30
68
  ## Recover a committed legacy bootstrap
31
69
 
32
70
  Older repositories may contain an unsigned installer marker committed for a
@@ -0,0 +1,59 @@
1
+ import { type ChildProcess } from 'node:child_process';
2
+ export interface ContainerProcessIdentity {
3
+ pid: number;
4
+ uid: number;
5
+ startTicks: string;
6
+ argv: string[];
7
+ }
8
+ export interface ContainerChildIdentity {
9
+ pid: number;
10
+ uid: number;
11
+ parentPid: number;
12
+ startTicks: string;
13
+ }
14
+ export interface ContainerRuntime {
15
+ identity?: () => Promise<ContainerProcessIdentity>;
16
+ childIdentity?: (pid: number) => Promise<ContainerChildIdentity>;
17
+ canonicalEntrypoint?: string;
18
+ runtimeVersion?: string;
19
+ }
20
+ export interface ContainerLifecycleOptions {
21
+ home: string;
22
+ uid?: number;
23
+ containerRuntime?: ContainerRuntime;
24
+ }
25
+ export interface ContainerRelayRegistration {
26
+ schema: 'dharma.relay-autostart/v3';
27
+ backend: 'container-entrypoint';
28
+ launcher: string;
29
+ workspace: string;
30
+ policy: string;
31
+ version: string;
32
+ taskName: null;
33
+ }
34
+ export declare function readContainerPid1Identity(): Promise<ContainerProcessIdentity>;
35
+ export declare function readContainerChildIdentity(pid: number): Promise<ContainerChildIdentity>;
36
+ export declare function containerEntrypointAvailable(options: ContainerLifecycleOptions): Promise<boolean>;
37
+ export declare function containerStartupControl(options: ContainerLifecycleOptions, registration: ContainerRelayRegistration, running: boolean): Promise<void>;
38
+ export declare function containerStartupState(options: ContainerLifecycleOptions, registration: ContainerRelayRegistration): Promise<{
39
+ state: "enabled";
40
+ backend: "container-entrypoint";
41
+ version: string;
42
+ lifecycle: "unconfigured" | "paused" | "blocked" | "starting" | "running" | "configured";
43
+ restartCoverage: "container-entrypoint-only";
44
+ }>;
45
+ export declare function ownsContainerStartup(options: ContainerLifecycleOptions, registration: ContainerRelayRegistration): Promise<boolean>;
46
+ export declare function writeContainerRegistration(options: ContainerLifecycleOptions, registration: ContainerRelayRegistration): Promise<void>;
47
+ export declare function readContainerRegistration(options: ContainerLifecycleOptions): Promise<ContainerRelayRegistration | null>;
48
+ export declare function containerConsumerStoreReady(): Promise<boolean>;
49
+ export declare function runOwnedContainerEntrypoint(options: ContainerLifecycleOptions & {
50
+ signal: AbortSignal;
51
+ spawnRelay?: (registration: ContainerRelayRegistration) => ChildProcess;
52
+ consumerStoreReady?: () => Promise<boolean>;
53
+ pollMs?: number;
54
+ restartDelayMs?: number;
55
+ }): Promise<{
56
+ stopped: boolean;
57
+ restarts: number;
58
+ }>;
59
+ //# sourceMappingURL=containerRelayLifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerRelayLifecycle.d.ts","sourceRoot":"","sources":["../src/containerRelayLifecycle.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAOxE,MAAM,WAAW,wBAAwB;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE;AAC1G,MAAM,WAAW,sBAAsB;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAE3G,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACnD,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACjE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,yBAAyB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CAAE;AAC9G,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,2BAA2B,CAAC;IAAC,OAAO,EAAE,sBAAsB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACvF,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAC;CACpE;AA+CD,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAQnF;AAyCD,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAO7F;AASD,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,CASvG;AAmBD,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,yBAAyB,EAC9E,YAAY,EAAE,0BAA0B,EAAE,OAAO,EAAE,OAAO,iBAM3D;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,0BAA0B;;;;;;GA2BvH;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,0BAA0B,oBAUtH;AAED,wBAAsB,0BAA0B,CAAC,OAAO,EAAE,yBAAyB,EAAE,YAAY,EAAE,0BAA0B,iBAE5H;AAYD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,yBAAyB,8CAKjF;AA0BD,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,OAAO,CAAC,CAapE;AAoBD,wBAAsB,2BAA2B,CAAC,OAAO,EAAE,yBAAyB,GAAG;IACrF,MAAM,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,0BAA0B,KAAK,YAAY,CAAC;IAC7F,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACvF;;;GAoFA"}
@@ -0,0 +1,415 @@
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, 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
+ const [stat, command, owner] = await Promise.all([
54
+ readFile('/proc/1/stat', 'utf8'), readFile('/proc/1/cmdline'), lstat('/proc/1'),
55
+ ]);
56
+ if (stat.length > 8192 || command.length > 8192)
57
+ throw unavailable();
58
+ const fields = stat.slice(stat.lastIndexOf(')') + 2).trim().split(/\s+/);
59
+ return { pid: 1, uid: owner.uid, startTicks: fields[19] || '',
60
+ argv: command.toString('utf8').split('\0').filter(Boolean) };
61
+ }
62
+ async function publicRuntimeBytes(path, limit, executingCaller = false) {
63
+ const file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
64
+ try {
65
+ const stat = await file.stat();
66
+ if (!stat.isFile() || !executingCaller && (stat.mode & 0o022) !== 0 || stat.size > limit)
67
+ throw unavailable();
68
+ const bytes = await file.readFile();
69
+ if (bytes.length > limit)
70
+ throw unavailable();
71
+ return bytes;
72
+ }
73
+ finally {
74
+ await file.close();
75
+ }
76
+ }
77
+ async function canonicalEntrypoint(options, identity) {
78
+ if (options.containerRuntime?.canonicalEntrypoint)
79
+ return options.containerRuntime.canonicalEntrypoint;
80
+ try {
81
+ const current = await realpath(fileURLToPath(new URL('./bin.js', import.meta.url)));
82
+ const candidate = identity.argv[1];
83
+ if (!candidate || !isAbsolute(candidate) || candidate.length > 4096 || /[\r\n\0]/.test(candidate)
84
+ || await realpath(candidate) !== candidate || !candidate.endsWith('/dist/bin.js'))
85
+ throw unavailable();
86
+ const manifest = JSON.parse((await publicRuntimeBytes(join(dirname(dirname(candidate)), 'package.json'), 65_536)).toString('utf8'));
87
+ const own = JSON.parse((await publicRuntimeBytes(join(dirname(dirname(current)), 'package.json'), 65_536, true)).toString('utf8'));
88
+ if (manifest.name !== '@dharma-ai-labs/agent-fabric' || manifest.name !== own.name || manifest.version !== own.version)
89
+ throw unavailable();
90
+ // Image and npm execution prefixes can differ. Verify the entrypoint and
91
+ // bootstrap/lifecycle executable bytes, not an arbitrary path alias.
92
+ for (const name of ['bin.js', 'index.js', 'containerRelayLifecycle.js']) {
93
+ const [installed, caller] = await Promise.all([
94
+ publicRuntimeBytes(join(dirname(candidate), name), 2_097_152), publicRuntimeBytes(join(dirname(current), name), 2_097_152, true),
95
+ ]);
96
+ if (!installed.equals(caller))
97
+ throw unavailable();
98
+ }
99
+ return candidate;
100
+ }
101
+ catch {
102
+ throw unavailable();
103
+ }
104
+ }
105
+ function ownedIdentity(identity, uid, entrypoint) {
106
+ return identity.pid === 1 && identity.uid === uid && Number.isSafeInteger(uid) && uid > 0 && /^\d{1,20}$/.test(identity.startTicks)
107
+ && identity.argv.length === 4 && identity.argv[2] === 'relay' && identity.argv[3] === 'container-entrypoint'
108
+ && identity.argv[1] === entrypoint && isAbsolute(entrypoint);
109
+ }
110
+ export async function readContainerChildIdentity(pid) {
111
+ if (!Number.isSafeInteger(pid) || pid <= 1)
112
+ throw unavailable();
113
+ const [stat, owner] = await Promise.all([readFile(`/proc/${pid}/stat`, 'utf8'), lstat(`/proc/${pid}`)]);
114
+ if (stat.length > 8192 || Number(stat.slice(0, stat.indexOf(' '))) !== pid)
115
+ throw unavailable();
116
+ const fields = stat.slice(stat.lastIndexOf(')') + 2).trim().split(/\s+/);
117
+ if (fields[0] === 'Z' || fields[0] === 'X' || !/^\d{1,20}$/.test(fields[19] || ''))
118
+ throw unavailable();
119
+ return { pid, uid: owner.uid, parentPid: Number(fields[1]), startTicks: fields[19] };
120
+ }
121
+ async function ownedChild(options, pid, startTicks) {
122
+ const identity = await (options.containerRuntime?.childIdentity || readContainerChildIdentity)(pid);
123
+ if (identity.pid !== pid || identity.uid !== ownUid(options) || identity.parentPid !== 1
124
+ || !/^\d{1,20}$/.test(identity.startTicks) || startTicks !== undefined && identity.startTicks !== startTicks)
125
+ throw unavailable();
126
+ return identity;
127
+ }
128
+ export async function containerEntrypointAvailable(options) {
129
+ const value = await privateJson(options, 'container-entrypoint.json');
130
+ if (value === null)
131
+ return false;
132
+ if (!exactObject(value, ['schema', 'home', 'pid', 'uid', 'startTicks']))
133
+ throw unavailable();
134
+ const identity = await (options.containerRuntime?.identity || readContainerPid1Identity)().catch(() => { throw unavailable(); });
135
+ if (value.schema !== 'dharma.container-entrypoint/v1' || value.home !== options.home
136
+ || value.pid !== 1 || value.uid !== ownUid(options) || value.startTicks !== identity.startTicks
137
+ || !ownedIdentity(identity, ownUid(options), await canonicalEntrypoint(options, identity)))
138
+ throw unavailable();
139
+ return true;
140
+ }
141
+ function registrationHash(home, registration) {
142
+ return createHash('sha256').update(JSON.stringify([home, registration.schema, registration.backend,
143
+ registration.launcher, registration.workspace, registration.policy, registration.version, registration.taskName])).digest('hex');
144
+ }
145
+ async function writePrivateJson(options, name, value) {
146
+ await privateDirectory(options);
147
+ // Refuse a substituted/symlink/world-accessible receipt before replacing it.
148
+ await privateJson(options, name);
149
+ const destination = privatePath(options.home, name);
150
+ const temporary = `${destination}.${randomUUID()}.tmp`;
151
+ try {
152
+ await writeFile(temporary, JSON.stringify(value) + '\n', { mode: 0o600, flag: 'wx' });
153
+ await rename(temporary, destination);
154
+ }
155
+ finally {
156
+ await rm(temporary, { force: true });
157
+ }
158
+ }
159
+ export async function containerStartupControl(options, registration, running) {
160
+ if (!await containerEntrypointAvailable(options))
161
+ throw unavailable();
162
+ await writePrivateJson(options, 'container-control.json', {
163
+ schema: 'dharma.container-relay-control/v1', home: options.home,
164
+ registrationHash: registrationHash(options.home, registration), running,
165
+ });
166
+ }
167
+ export async function containerStartupState(options, registration) {
168
+ if (!await containerEntrypointAvailable(options))
169
+ throw unavailable();
170
+ const value = await privateJson(options, 'container-control.json');
171
+ if (!exactObject(value, ['schema', 'home', 'registrationHash', 'running'])
172
+ || value.schema !== 'dharma.container-relay-control/v1' || value.home !== options.home
173
+ || value.registrationHash !== registrationHash(options.home, registration) || typeof value.running !== 'boolean')
174
+ throw unavailable();
175
+ // Stop pauses the owned relay; it does not unregister its persistent lifecycle.
176
+ const heartbeat = await privateJson(options, 'container-heartbeat.json');
177
+ const marker = await privateJson(options, 'container-entrypoint.json');
178
+ let lifecycle = 'configured';
179
+ if (heartbeat !== null) {
180
+ if (!exactObject(heartbeat, ['schema', 'home', 'startTicks', 'polledAt', 'lifecycle', 'reason', 'registrationHash', 'childPid', 'childStartTicks'])
181
+ || heartbeat.schema !== 'dharma.container-relay-heartbeat/v1' || heartbeat.home !== options.home
182
+ || heartbeat.startTicks !== marker.startTicks || typeof heartbeat.polledAt !== 'number' || !Number.isSafeInteger(heartbeat.polledAt)
183
+ || heartbeat.polledAt > Date.now() + 1000 || Date.now() - heartbeat.polledAt > 10_000
184
+ || !['unconfigured', 'paused', 'blocked', 'starting', 'running'].includes(String(heartbeat.lifecycle))
185
+ || heartbeat.reason !== null && heartbeat.reason !== 'consumer_store_locked_or_unavailable' && heartbeat.reason !== 'relay_runtime_upgrade_required'
186
+ || heartbeat.registrationHash !== null && !/^[a-f0-9]{64}$/.test(String(heartbeat.registrationHash)))
187
+ throw unavailable();
188
+ if (heartbeat.lifecycle === 'running') {
189
+ if (!value.running || !Number.isSafeInteger(heartbeat.childPid) || Number(heartbeat.childPid) <= 1
190
+ || typeof heartbeat.childStartTicks !== 'string')
191
+ throw unavailable();
192
+ await ownedChild(options, Number(heartbeat.childPid), heartbeat.childStartTicks);
193
+ }
194
+ else if (heartbeat.childPid !== null || heartbeat.childStartTicks !== null)
195
+ throw unavailable();
196
+ if (heartbeat.registrationHash === registrationHash(options.home, registration))
197
+ lifecycle = heartbeat.lifecycle;
198
+ }
199
+ return { state: 'enabled', backend: 'container-entrypoint', version: registration.version,
200
+ lifecycle, restartCoverage: 'container-entrypoint-only' };
201
+ }
202
+ export async function ownsContainerStartup(options, registration) {
203
+ // Stop/disable authority comes from the private matching configuration, not a
204
+ // transient child heartbeat. A child may be exiting when control is paused.
205
+ try {
206
+ if (!await containerEntrypointAvailable(options))
207
+ return false;
208
+ const value = await privateJson(options, 'container-control.json');
209
+ return exactObject(value, ['schema', 'home', 'registrationHash', 'running'])
210
+ && value.schema === 'dharma.container-relay-control/v1' && value.home === options.home
211
+ && value.registrationHash === registrationHash(options.home, registration) && typeof value.running === 'boolean';
212
+ }
213
+ catch {
214
+ return false;
215
+ }
216
+ }
217
+ export async function writeContainerRegistration(options, registration) {
218
+ await writePrivateJson(options, 'autostart.json', registration);
219
+ }
220
+ function validRegistration(value) {
221
+ return exactObject(value, ['schema', 'backend', 'launcher', 'workspace', 'policy', 'version', 'taskName'])
222
+ && value.schema === 'dharma.relay-autostart/v3' && value.backend === 'container-entrypoint'
223
+ && typeof value.launcher === 'string' && value.launcher.length <= 4096 && isAbsolute(value.launcher) && !/[\r\n\0]/.test(value.launcher)
224
+ && typeof value.workspace === 'string' && value.workspace.length <= 4096 && isAbsolute(value.workspace) && !/[\r\n\0]/.test(value.workspace)
225
+ && value.policy === join(value.workspace, '.dharma', 'approved-policy.json')
226
+ && typeof value.version === 'string' && /^(?=.{1,64}$)\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/.test(value.version)
227
+ && value.taskName === null;
228
+ }
229
+ export async function readContainerRegistration(options) {
230
+ const value = await privateJson(options, 'autostart.json');
231
+ if (value === null)
232
+ return null;
233
+ if (!validRegistration(value))
234
+ throw unavailable();
235
+ return value;
236
+ }
237
+ async function readConfiguration(options) {
238
+ const value = await privateJson(options, 'autostart.json');
239
+ if (value === null)
240
+ return null;
241
+ if (!validRegistration(value))
242
+ throw unavailable();
243
+ const control = await privateJson(options, 'container-control.json');
244
+ if (control === null)
245
+ return null; // atomic registration precedes its control receipt
246
+ if (!exactObject(control, ['schema', 'home', 'registrationHash', 'running'])
247
+ || control.schema !== 'dharma.container-relay-control/v1' || control.home !== options.home
248
+ || typeof control.running !== 'boolean' || typeof control.registrationHash !== 'string')
249
+ throw unavailable();
250
+ if (control.registrationHash !== registrationHash(options.home, value))
251
+ return null; // fail closed during an owned update
252
+ return { registration: value, running: control.running };
253
+ }
254
+ async function wait(milliseconds, signal) {
255
+ if (signal.aborted)
256
+ return;
257
+ await new Promise(resolveWait => {
258
+ const finish = () => { clearTimeout(timer); signal.removeEventListener('abort', finish); resolveWait(); };
259
+ const timer = setTimeout(finish, milliseconds);
260
+ signal.addEventListener('abort', finish, { once: true });
261
+ if (signal.aborted)
262
+ finish();
263
+ });
264
+ }
265
+ const execFileAsync = promisify(execFile);
266
+ export async function containerConsumerStoreReady() {
267
+ // Metadata only: no Secret Service lookup/get/store and no credential values.
268
+ try {
269
+ const alias = await execFileAsync('dbus-send', ['--session', '--print-reply', '--dest=org.freedesktop.secrets',
270
+ '/org/freedesktop/secrets', 'org.freedesktop.Secret.Service.ReadAlias', 'string:default'], { timeout: 5000, maxBuffer: 8192 });
271
+ const paths = [...alias.stdout.matchAll(/object path "([/a-zA-Z0-9_]+)"/g)];
272
+ if (paths.length !== 1 || !paths[0][1].startsWith('/org/freedesktop/secrets/collection/'))
273
+ return false;
274
+ const locked = await execFileAsync('dbus-send', ['--session', '--print-reply', '--dest=org.freedesktop.secrets',
275
+ paths[0][1], 'org.freedesktop.DBus.Properties.Get', 'string:org.freedesktop.Secret.Collection', 'string:Locked'], { timeout: 5000, maxBuffer: 8192 });
276
+ return /variant\s+boolean false\s*$/.test(locked.stdout);
277
+ }
278
+ catch {
279
+ return false;
280
+ }
281
+ }
282
+ async function stopOwnedChild(child, options, identity) {
283
+ if (child.exitCode !== null || child.signalCode !== null || !child.pid)
284
+ return;
285
+ // Never signal a recycled PID or a process outside this owned parent/UID.
286
+ if (identity && !await ownedChild(options, child.pid, identity.startTicks).catch(() => null))
287
+ return;
288
+ // On an initial /proc failure, the freshly spawned ChildProcess handle is
289
+ // still ours. Drain it immediately; never leave unverified work running.
290
+ // This function accepts no raw PID and only receives this loop's own spawn.
291
+ const exited = new Promise(resolveWait => {
292
+ child.once('exit', () => resolveWait());
293
+ child.once('error', () => resolveWait());
294
+ });
295
+ child.kill('SIGTERM');
296
+ let timer;
297
+ await Promise.race([exited, new Promise(resolveWait => { timer = setTimeout(resolveWait, 10_000); })]);
298
+ if (timer)
299
+ clearTimeout(timer);
300
+ if (child.exitCode === null && child.signalCode === null
301
+ && (!identity || await ownedChild(options, child.pid, identity.startTicks).catch(() => null))) {
302
+ child.kill('SIGKILL');
303
+ await exited;
304
+ }
305
+ }
306
+ export async function runOwnedContainerEntrypoint(options) {
307
+ const identity = await (options.containerRuntime?.identity || readContainerPid1Identity)();
308
+ const bin = await canonicalEntrypoint(options, identity);
309
+ const runtimeVersion = options.containerRuntime?.runtimeVersion
310
+ ?? JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8')).version;
311
+ if (typeof runtimeVersion !== 'string' || !/^(?=.{1,64}$)\d+\.\d+\.\d+(?:-[a-zA-Z0-9.-]+)?$/.test(runtimeVersion))
312
+ throw unavailable();
313
+ if (!ownedIdentity(identity, ownUid(options), bin))
314
+ throw unavailable();
315
+ await mkdir(join(options.home, 'relay'), { recursive: true, mode: 0o700 });
316
+ await privateDirectory(options);
317
+ const marker = { schema: 'dharma.container-entrypoint/v1', home: options.home,
318
+ pid: 1, uid: identity.uid, startTicks: identity.startTicks };
319
+ const previous = await privateJson(options, 'container-entrypoint.json');
320
+ if (previous !== null && (!exactObject(previous, ['schema', 'home', 'pid', 'uid', 'startTicks'])
321
+ || previous.schema !== marker.schema || previous.home !== marker.home || previous.uid !== marker.uid || previous.pid !== 1
322
+ || typeof previous.startTicks !== 'string' || !/^\d{1,20}$/.test(previous.startTicks)))
323
+ throw unavailable();
324
+ const lockPath = privatePath(options.home, 'container-entrypoint.lock');
325
+ const oldLock = await privateJson(options, 'container-entrypoint.lock');
326
+ if (oldLock !== null) {
327
+ if (!exactObject(oldLock, ['schema', 'home', 'pid', 'uid', 'startTicks'])
328
+ || oldLock.schema !== marker.schema || oldLock.home !== marker.home || oldLock.uid !== marker.uid || oldLock.pid !== 1
329
+ || typeof oldLock.startTicks !== 'string' || !/^\d{1,20}$/.test(oldLock.startTicks))
330
+ throw unavailable();
331
+ if (oldLock.startTicks === marker.startTicks)
332
+ throw new Error('container_entrypoint_busy: an owned entrypoint is already active.');
333
+ await rm(lockPath); // an earlier boot's private lock; actual PID1 identity was verified
334
+ }
335
+ try {
336
+ await writeFile(lockPath, JSON.stringify(marker), { mode: 0o600, flag: 'wx' });
337
+ }
338
+ catch {
339
+ throw new Error('container_entrypoint_busy: an owned entrypoint is already active.');
340
+ }
341
+ let child = null;
342
+ let childHash = null;
343
+ let childIdentity = null;
344
+ let childFailed = false;
345
+ let restarts = 0;
346
+ let retryAt = 0;
347
+ const pollMs = options.pollMs ?? 1000;
348
+ const restartDelayMs = options.restartDelayMs ?? 5000;
349
+ const spawnRelay = options.spawnRelay || ((registration) => spawn(process.execPath, [bin, 'relay', 'supervise', '--policy', registration.policy], { cwd: registration.workspace, stdio: 'ignore',
350
+ env: { ...process.env, DHARMA_HOME: options.home } }));
351
+ try {
352
+ await writePrivateJson(options, 'container-entrypoint.json', marker);
353
+ while (!options.signal.aborted) {
354
+ if (!await containerEntrypointAvailable(options))
355
+ throw unavailable();
356
+ const configuration = await readConfiguration(options);
357
+ const hash = configuration ? registrationHash(options.home, configuration.registration) : null;
358
+ const compatibleRuntime = configuration?.registration.version === runtimeVersion;
359
+ const protectedConsumer = configuration?.running && compatibleRuntime
360
+ ? await (options.consumerStoreReady || containerConsumerStoreReady)().catch(() => false) : false;
361
+ if (options.signal.aborted)
362
+ break; // no new child after interrupted preflight
363
+ const shouldRun = Boolean(configuration?.running && protectedConsumer);
364
+ if (child && (childFailed || child.exitCode !== null || child.signalCode !== null)) {
365
+ child = null;
366
+ childIdentity = null;
367
+ childHash = null;
368
+ childFailed = false;
369
+ restarts++;
370
+ retryAt = Date.now() + restartDelayMs;
371
+ }
372
+ if (child && (!shouldRun || hash !== childHash)) {
373
+ await stopOwnedChild(child, options, childIdentity);
374
+ child = null;
375
+ childIdentity = null;
376
+ childHash = null;
377
+ }
378
+ if (shouldRun && !child && Date.now() >= retryAt) {
379
+ child = spawnRelay(configuration.registration);
380
+ childHash = hash;
381
+ child.on('error', () => { childFailed = true; });
382
+ childIdentity = child.pid ? await ownedChild(options, child.pid).catch(() => null) : null;
383
+ if (child.pid && !childIdentity && child.exitCode === null && child.signalCode === null)
384
+ throw unavailable();
385
+ }
386
+ const running = Boolean(child?.pid && childIdentity && !childFailed && child.exitCode === null && child.signalCode === null);
387
+ const heartbeat = { schema: 'dharma.container-relay-heartbeat/v1', home: options.home,
388
+ startTicks: marker.startTicks, polledAt: Date.now(), registrationHash: hash, childPid: running ? child.pid : null,
389
+ childStartTicks: running ? childIdentity.startTicks : null,
390
+ lifecycle: !configuration ? 'unconfigured' : !configuration.running ? 'paused'
391
+ : !protectedConsumer ? 'blocked' : running ? 'running' : 'starting',
392
+ reason: configuration?.running && !compatibleRuntime ? 'relay_runtime_upgrade_required'
393
+ : configuration?.running && !protectedConsumer ? 'consumer_store_locked_or_unavailable' : null };
394
+ await writePrivateJson(options, 'container-heartbeat.json', heartbeat);
395
+ await wait(pollMs, options.signal);
396
+ }
397
+ return { stopped: true, restarts };
398
+ }
399
+ catch {
400
+ throw unavailable();
401
+ }
402
+ finally {
403
+ if (child)
404
+ await stopOwnedChild(child, options, childIdentity);
405
+ const current = await privateJson(options, 'container-entrypoint.json').catch(() => null);
406
+ if (current?.startTicks === marker.startTicks && current.home === marker.home) {
407
+ await rm(privatePath(options.home, 'container-entrypoint.json'), { force: true });
408
+ await rm(privatePath(options.home, 'container-heartbeat.json'), { force: true });
409
+ }
410
+ const lock = await privateJson(options, 'container-entrypoint.lock').catch(() => null);
411
+ if (lock?.startTicks === marker.startTicks && lock.home === marker.home)
412
+ await rm(lockPath, { force: true });
413
+ }
414
+ }
415
+ //# 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":""}