@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 +38 -0
- package/dist/containerRelayLifecycle.d.ts +59 -0
- package/dist/containerRelayLifecycle.d.ts.map +1 -0
- package/dist/containerRelayLifecycle.js +415 -0
- package/dist/containerRelayLifecycle.js.map +1 -0
- package/dist/containerRelayLifecycle.test.d.ts +2 -0
- package/dist/containerRelayLifecycle.test.d.ts.map +1 -0
- package/dist/containerRelayLifecycle.test.js +502 -0
- package/dist/containerRelayLifecycle.test.js.map +1 -0
- package/dist/containerRelayPublicCommand.test.d.ts +2 -0
- package/dist/containerRelayPublicCommand.test.d.ts.map +1 -0
- package/dist/containerRelayPublicCommand.test.js +25 -0
- package/dist/containerRelayPublicCommand.test.js.map +1 -0
- package/dist/containerRelaySchema.test.d.ts +2 -0
- package/dist/containerRelaySchema.test.d.ts.map +1 -0
- package/dist/containerRelaySchema.test.js +35 -0
- package/dist/containerRelaySchema.test.js.map +1 -0
- package/dist/demoWatchControl.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -10
- package/dist/index.js.map +1 -1
- package/dist/relayAutostart.d.ts +10 -3
- package/dist/relayAutostart.d.ts.map +1 -1
- package/dist/relayAutostart.js +57 -16
- package/dist/relayAutostart.js.map +1 -1
- package/dist/schemas/container-relay-lifecycle.v1.schema.json +187 -0
- package/dist/schemas/relay-autostart.v3.schema.json +52 -0
- package/dist/usage.js +1 -1
- package/dist/usage.js.map +1 -1
- package/package.json +4 -4
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 @@
|
|
|
1
|
+
{"version":3,"file":"containerRelayLifecycle.test.d.ts","sourceRoot":"","sources":["../src/containerRelayLifecycle.test.ts"],"names":[],"mappings":""}
|