@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.
- package/README.md +49 -0
- package/dist/containerDockerInit.test.d.ts +2 -0
- package/dist/containerDockerInit.test.d.ts.map +1 -0
- package/dist/containerDockerInit.test.js +187 -0
- package/dist/containerDockerInit.test.js.map +1 -0
- package/dist/containerRelayLifecycle.d.ts +68 -0
- package/dist/containerRelayLifecycle.d.ts.map +1 -0
- package/dist/containerRelayLifecycle.js +534 -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 +28 -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 +44 -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 +226 -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 +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 @@
|
|
|
1
|
+
{"version":3,"file":"containerRelayLifecycle.test.d.ts","sourceRoot":"","sources":["../src/containerRelayLifecycle.test.ts"],"names":[],"mappings":""}
|