@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
package/README.md CHANGED
@@ -27,6 +27,55 @@ 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 an arbitrary init shim as PID1 does not qualify. A narrowly verified
41
+ Docker `--init` route also supports the canonical CLI as the non-root direct
42
+ child of Docker's root-owned, non-writable `/sbin/docker-init` executable. This
43
+ route retains the existing official Node-image command
44
+ `docker-entrypoint.sh sleep infinity`; an explicitly approved public entrypoint
45
+ migration must exec the canonical Node/CLI command as that init's main child.
46
+ The CLI checks the executable inode, UID, both process start times and the
47
+ kernel's first init-child identity, retaining zombies rather than promoting
48
+ adopted processes. The controller must also retain init's session and its own
49
+ process group. The main-child and process identities are checked again before
50
+ control is admitted; a foreground or orphaned `docker exec` or a fabricated
51
+ marker cannot claim startup.
52
+
53
+ The image/operator must provide its own protected Secret Service, private
54
+ session bus and durable private home. Never mount a host bus or copy another
55
+ client's credentials. Genuine provider login and private USER keyring unlock
56
+ remain recipient actions. The entrypoint waits without enrollment or provider
57
+ work until normal signed onboarding installs its canonical startup registration.
58
+ It then launches the exact installed CLI supervisor, retaining all device,
59
+ repository, policy and task checks. A locked or absent protected collection
60
+ blocks launch; it does not select a plaintext store or request a model turn.
61
+
62
+ The entrypoint owns one relay for that container OS user. It never creates a
63
+ second host service or changes an existing systemd user unit. Owned start/stop
64
+ controls use atomic private receipts; disable removes the registration. It
65
+ reaps its child on normal shutdown and retries an exited child with a bounded
66
+ delay. A new container boot renews only its own entrypoint lease while retaining its
67
+ configuration and encrypted state. Runtime-version mismatch blocks restart;
68
+ upgrade the reviewed image/runtime together through the normal release path.
69
+
70
+ `relay autostart status` distinguishes saved configuration, blocked storage,
71
+ paused work and a freshly observed live child with matching UID, parent and
72
+ process start time. This is container-entrypoint restart coverage only. The
73
+ CLI does not install Docker restart policy or prove host sign-in/reboot recovery.
74
+ A real container restart, protected-store unlock, unchanged device/session
75
+ identity, current signed relay polling and independent operator rehearsal must
76
+ be observed before claiming readiness. Container creation, entrypoint changes
77
+ and persistent startup installation remain explicit operator decisions.
78
+
30
79
  ## Recover a committed legacy bootstrap
31
80
 
32
81
  Older repositories may contain an unsigned installer marker committed for a
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=containerDockerInit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerDockerInit.test.d.ts","sourceRoot":"","sources":["../src/containerDockerInit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,187 @@
1
+ import assert from 'node:assert/strict';
2
+ import { spawn } from 'node:child_process';
3
+ import { mkdtemp, mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import test from 'node:test';
7
+ import * as lifecycle from './containerRelayLifecycle.js';
8
+ import { enableRelayAutostart, relayAutostartStatus } from './relayAutostart.js';
9
+ const linux = { skip: process.platform !== 'linux' };
10
+ async function fixture() {
11
+ const root = await mkdtemp(join(tmpdir(), 'dharma-docker-init-'));
12
+ const home = join(root, 'device');
13
+ const workspace = join(root, 'checkout');
14
+ await mkdir(join(home, 'relay'), { recursive: true, mode: 0o700 });
15
+ await mkdir(join(workspace, '.dharma'), { recursive: true, mode: 0o700 });
16
+ const uid = process.getuid();
17
+ const init = { pid: 1, parentPid: 0, processGroupId: 1, sessionId: 1, uid, startTicks: '123', argv: ['/sbin/docker-init', '--', 'docker-entrypoint.sh', 'sleep', 'infinity'] };
18
+ const controller = { pid: 42, parentPid: 1, processGroupId: 42, sessionId: 1, uid, startTicks: '124',
19
+ argv: ['/usr/local/bin/node', '/fixture/cli/dist/bin.js', 'relay', 'container-entrypoint'] };
20
+ const marker = { schema: 'dharma.container-entrypoint/v2', home, pid: controller.pid, uid,
21
+ startTicks: controller.startTicks, initStartTicks: init.startTicks };
22
+ await writeFile(join(home, 'relay', 'container-entrypoint.json'), JSON.stringify(marker), { mode: 0o600 });
23
+ let verifiedInit = true;
24
+ let verifiedNode = true;
25
+ let mainChild = controller.pid;
26
+ const runtime = { identity: async () => init, canonicalEntrypoint: controller.argv[1], runtimeVersion: '0.2.135',
27
+ controllerIdentity: async (pid) => { assert.equal(pid, controller.pid); return controller; },
28
+ dockerInitVerified: async () => verifiedInit,
29
+ dockerInitMainChild: async () => mainChild,
30
+ controllerExecutableVerified: async () => verifiedNode,
31
+ childIdentity: async (pid) => ({ ...await lifecycle.readContainerChildIdentity(pid), parentPid: controller.pid }) };
32
+ const options = { platform: 'linux', home, uid, userHome: root, workspace,
33
+ launcher: join(workspace, '.dharma', 'bin', 'dharma'), policy: join(workspace, '.dharma', 'approved-policy.json'),
34
+ version: '0.2.135', containerRuntime: runtime,
35
+ run: async () => { throw new Error('must never use systemd for the owned init child'); } };
36
+ return { root, home, init, controller, marker, runtime, options,
37
+ untrustInit: () => { verifiedInit = false; }, untrustNode: () => { verifiedNode = false; },
38
+ setMainChild: (pid) => { mainChild = pid; } };
39
+ }
40
+ async function until(check) {
41
+ const deadline = Date.now() + 3000;
42
+ while (!check()) {
43
+ if (Date.now() > deadline)
44
+ throw new Error('fixture did not progress');
45
+ await new Promise(r => setTimeout(r, 10));
46
+ }
47
+ }
48
+ test('canonical direct child of verified Docker init can own persistent container startup', linux, async () => {
49
+ const f = await fixture();
50
+ assert.equal((await enableRelayAutostart(f.options)).backend, 'container-entrypoint');
51
+ assert.equal((await relayAutostartStatus(f.options)).state, 'enabled');
52
+ });
53
+ test('adopted canonical exec child cannot replace the Docker init main startup child', linux, async () => {
54
+ for (const kind of ['different-main-child', 'foreign-session', 'foreign-process-group', 'missing-main-child']) {
55
+ const f = await fixture();
56
+ if (kind === 'different-main-child')
57
+ f.setMainChild(7);
58
+ if (kind === 'missing-main-child')
59
+ f.setMainChild(0);
60
+ if (kind === 'foreign-session')
61
+ f.controller.sessionId = 99;
62
+ if (kind === 'foreign-process-group')
63
+ f.controller.processGroupId = 99;
64
+ await assert.rejects(enableRelayAutostart(f.options), /container_startup_unavailable/, kind);
65
+ }
66
+ });
67
+ test('Docker init main-child identity is checked again before control is admitted', linux, async () => {
68
+ const f = await fixture();
69
+ let reads = 0;
70
+ f.runtime.dockerInitMainChild = async () => ++reads === 1 ? f.controller.pid : 7;
71
+ await assert.rejects(enableRelayAutostart(f.options), /container_startup_unavailable/);
72
+ });
73
+ test('Docker init session and controller process group cannot change during attribution', linux, async () => {
74
+ for (const kind of ['init-session', 'init-group', 'controller-session', 'controller-group']) {
75
+ const f = await fixture();
76
+ let reads = 0;
77
+ if (kind.startsWith('init-'))
78
+ f.runtime.identity = async () => {
79
+ reads++;
80
+ return { ...f.init, ...(reads > 1 ? kind === 'init-session' ? { sessionId: 99 } : { processGroupId: 99 } : {}) };
81
+ };
82
+ else
83
+ f.runtime.controllerIdentity = async () => {
84
+ reads++;
85
+ return { ...f.controller, ...(reads > 1 ? kind === 'controller-session' ? { sessionId: 99 } : { processGroupId: 99 } : {}) };
86
+ };
87
+ await assert.rejects(enableRelayAutostart(f.options), /container_startup_unavailable/, kind);
88
+ }
89
+ });
90
+ test('Docker init route rejects foreign parent owner argv executable boot and controller ticks', linux, async () => {
91
+ for (const kind of ['parent', 'uid', 'argv', 'executable', 'node-executable', 'init-parent', 'init-argv', 'init-boot', 'controller-boot', 'extra-argument']) {
92
+ const f = await fixture();
93
+ if (kind === 'parent')
94
+ f.controller.parentPid = 9;
95
+ if (kind === 'uid')
96
+ f.controller.uid++;
97
+ if (kind === 'argv')
98
+ f.controller.argv[1] = '/foreign/cli/dist/bin.js';
99
+ if (kind === 'executable')
100
+ f.untrustInit();
101
+ if (kind === 'node-executable')
102
+ f.untrustNode();
103
+ if (kind === 'init-parent')
104
+ f.init.parentPid = 3;
105
+ if (kind === 'init-argv')
106
+ f.init.argv[3] = 'foreign-command';
107
+ if (kind === 'init-boot')
108
+ f.init.startTicks = '999';
109
+ if (kind === 'controller-boot')
110
+ f.controller.startTicks = '999';
111
+ if (kind === 'extra-argument')
112
+ f.controller.argv.push('--grant');
113
+ await assert.rejects(enableRelayAutostart(f.options), /container_startup_unavailable/, kind);
114
+ }
115
+ });
116
+ test('init marker cannot omit the Docker boot identity or promote an ordinary exec child to the entrypoint', linux, async () => {
117
+ const f = await fixture();
118
+ await writeFile(join(f.home, 'relay', 'container-entrypoint.json'), JSON.stringify({ ...f.marker, initStartTicks: undefined }));
119
+ await assert.rejects(enableRelayAutostart(f.options), /container_startup_unavailable/);
120
+ });
121
+ test('controller identity changes during executable verification are rejected before startup control', linux, async () => {
122
+ const f = await fixture();
123
+ let reads = 0;
124
+ f.runtime.controllerIdentity = async (pid) => {
125
+ assert.equal(pid, f.controller.pid);
126
+ reads++;
127
+ return { ...f.controller, startTicks: reads > 1 ? 'CANARY_REUSED_PROCESS' : f.controller.startTicks };
128
+ };
129
+ await assert.rejects(enableRelayAutostart(f.options), error => {
130
+ assert.match(String(error), /container_startup_unavailable/);
131
+ assert.doesNotMatch(String(error), /CANARY_REUSED_PROCESS/);
132
+ return true;
133
+ });
134
+ });
135
+ test('same Docker-init boot cannot take over another controller lease', linux, async () => {
136
+ const f = await fixture();
137
+ await writeFile(join(f.home, 'relay', 'container-entrypoint.lock'), JSON.stringify({ ...f.marker, pid: 77, startTicks: '99' }), { mode: 0o600 });
138
+ const abort = new AbortController();
139
+ await assert.rejects(lifecycle.runOwnedContainerEntrypoint({ home: f.home, uid: f.options.uid, signal: abort.signal,
140
+ containerRuntime: { ...f.runtime, currentControllerPid: f.controller.pid } }), /container_entrypoint_busy/);
141
+ });
142
+ test('different verified Docker-init boot renews only its own previous lifecycle metadata', linux, async () => {
143
+ const f = await fixture();
144
+ await writeFile(join(f.home, 'relay', 'container-entrypoint.lock'), JSON.stringify(f.marker), { mode: 0o600 });
145
+ f.init.startTicks = '223';
146
+ f.controller.startTicks = '224';
147
+ const abort = new AbortController();
148
+ const result = lifecycle.runOwnedContainerEntrypoint({ home: f.home, uid: f.options.uid, signal: abort.signal,
149
+ containerRuntime: { ...f.runtime, currentControllerPid: f.controller.pid }, pollMs: 10,
150
+ spawnRelay: () => { throw new Error('unconfigured controller cannot launch'); } });
151
+ try {
152
+ await new Promise(resolve => setTimeout(resolve, 50));
153
+ const marker = JSON.parse(await readFile(join(f.home, 'relay', 'container-entrypoint.json'), 'utf8'));
154
+ assert.equal(marker.initStartTicks, '223');
155
+ assert.equal(marker.startTicks, '224');
156
+ }
157
+ finally {
158
+ abort.abort();
159
+ }
160
+ await result;
161
+ });
162
+ test('Docker init controller fences its own supervisor and remains blocked while the consumer is locked', linux, async () => {
163
+ const f = await fixture();
164
+ await enableRelayAutostart(f.options);
165
+ const abort = new AbortController();
166
+ let ready = false;
167
+ const children = [];
168
+ const result = lifecycle.runOwnedContainerEntrypoint({ home: f.home, uid: f.options.uid, signal: abort.signal,
169
+ containerRuntime: { ...f.runtime, currentControllerPid: f.controller.pid }, pollMs: 10,
170
+ consumerStoreReady: async () => ready,
171
+ spawnRelay: () => { const child = spawn(process.execPath, ['-e', 'setInterval(() => {}, 1000)'], { stdio: 'ignore' }); children.push(child); return child; } });
172
+ try {
173
+ await new Promise(resolve => setTimeout(resolve, 50));
174
+ const heartbeat = JSON.parse(await readFile(join(f.home, 'relay', 'container-heartbeat.json'), 'utf8'));
175
+ assert.equal(heartbeat.lifecycle, 'blocked');
176
+ assert.equal(children.length, 0);
177
+ ready = true;
178
+ await until(() => children.length === 1);
179
+ assert.equal((await relayAutostartStatus(f.options)).lifecycle, 'running');
180
+ }
181
+ finally {
182
+ abort.abort();
183
+ }
184
+ await result;
185
+ assert.equal(children.every(child => child.exitCode !== null || child.signalCode !== null), true);
186
+ });
187
+ //# sourceMappingURL=containerDockerInit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerDockerInit.test.js","sourceRoot":"","sources":["../src/containerDockerInit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
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
+ parentPid?: number;
8
+ processGroupId?: number;
9
+ sessionId?: number;
10
+ }
11
+ export interface ContainerChildIdentity {
12
+ pid: number;
13
+ uid: number;
14
+ parentPid: number;
15
+ startTicks: string;
16
+ }
17
+ export interface ContainerRuntime {
18
+ identity?: () => Promise<ContainerProcessIdentity>;
19
+ childIdentity?: (pid: number) => Promise<ContainerChildIdentity>;
20
+ canonicalEntrypoint?: string;
21
+ runtimeVersion?: string;
22
+ controllerIdentity?: (pid: number) => Promise<ContainerProcessIdentity>;
23
+ dockerInitVerified?: () => Promise<boolean>;
24
+ dockerInitMainChild?: () => Promise<number>;
25
+ controllerExecutableVerified?: (identity: ContainerProcessIdentity) => Promise<boolean>;
26
+ currentControllerPid?: number;
27
+ }
28
+ export interface ContainerLifecycleOptions {
29
+ home: string;
30
+ uid?: number;
31
+ containerRuntime?: ContainerRuntime;
32
+ }
33
+ export interface ContainerRelayRegistration {
34
+ schema: 'dharma.relay-autostart/v3';
35
+ backend: 'container-entrypoint';
36
+ launcher: string;
37
+ workspace: string;
38
+ policy: string;
39
+ version: string;
40
+ taskName: null;
41
+ }
42
+ export declare function readContainerPid1Identity(): Promise<ContainerProcessIdentity>;
43
+ export declare function readContainerProcessIdentity(pid: number): Promise<ContainerProcessIdentity>;
44
+ export declare function readContainerChildIdentity(pid: number): Promise<ContainerChildIdentity>;
45
+ export declare function containerEntrypointAvailable(options: ContainerLifecycleOptions): Promise<boolean>;
46
+ export declare function containerStartupControl(options: ContainerLifecycleOptions, registration: ContainerRelayRegistration, running: boolean): Promise<void>;
47
+ export declare function containerStartupState(options: ContainerLifecycleOptions, registration: ContainerRelayRegistration): Promise<{
48
+ state: "enabled";
49
+ backend: "container-entrypoint";
50
+ version: string;
51
+ lifecycle: "unconfigured" | "paused" | "blocked" | "starting" | "running" | "configured";
52
+ restartCoverage: "container-entrypoint-only";
53
+ }>;
54
+ export declare function ownsContainerStartup(options: ContainerLifecycleOptions, registration: ContainerRelayRegistration): Promise<boolean>;
55
+ export declare function writeContainerRegistration(options: ContainerLifecycleOptions, registration: ContainerRelayRegistration): Promise<void>;
56
+ export declare function readContainerRegistration(options: ContainerLifecycleOptions): Promise<ContainerRelayRegistration | null>;
57
+ export declare function containerConsumerStoreReady(): Promise<boolean>;
58
+ export declare function runOwnedContainerEntrypoint(options: ContainerLifecycleOptions & {
59
+ signal: AbortSignal;
60
+ spawnRelay?: (registration: ContainerRelayRegistration) => ChildProcess;
61
+ consumerStoreReady?: () => Promise<boolean>;
62
+ pollMs?: number;
63
+ restartDelayMs?: number;
64
+ }): Promise<{
65
+ stopped: boolean;
66
+ restarts: number;
67
+ }>;
68
+ //# sourceMappingURL=containerRelayLifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerRelayLifecycle.d.ts","sourceRoot":"","sources":["../src/containerRelayLifecycle.ts"],"names":[],"mappings":"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"}