@dsh-enhanced/assistant-isolation 0.1.67 → 0.1.70
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 +39 -68
- package/lib/cli.d.ts +2 -4
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +51 -77
- package/lib/cli.js.map +1 -1
- package/lib/config.d.ts +4 -7
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +26 -40
- package/lib/config.js.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/ledger.d.ts +2 -13
- package/lib/ledger.d.ts.map +1 -1
- package/lib/ledger.js +7 -85
- package/lib/ledger.js.map +1 -1
- package/lib/probe.d.ts +0 -3
- package/lib/probe.d.ts.map +1 -1
- package/lib/probe.js +1 -41
- package/lib/probe.js.map +1 -1
- package/lib/service.d.ts +1 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +10 -90
- package/lib/service.js.map +1 -1
- package/lib/types.d.ts +4 -31
- package/lib/types.d.ts.map +1 -1
- package/lib/verifier-runner.d.ts +8 -16
- package/lib/verifier-runner.d.ts.map +1 -1
- package/lib/verifier-runner.js +9 -207
- package/lib/verifier-runner.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +8 -5
- package/lib/cleanup-receipt.d.ts +0 -28
- package/lib/cleanup-receipt.d.ts.map +0 -1
- package/lib/cleanup-receipt.js +0 -137
- package/lib/cleanup-receipt.js.map +0 -1
- package/lib/daemon-binding.d.ts +0 -13
- package/lib/daemon-binding.d.ts.map +0 -1
- package/lib/daemon-binding.js +0 -120
- package/lib/daemon-binding.js.map +0 -1
- package/lib/docker-socket.d.ts +0 -10
- package/lib/docker-socket.d.ts.map +0 -1
- package/lib/docker-socket.js +0 -43
- package/lib/docker-socket.js.map +0 -1
- package/lib/reconcile.d.ts +0 -5
- package/lib/reconcile.d.ts.map +0 -1
- package/lib/reconcile.js +0 -31
- package/lib/reconcile.js.map +0 -1
- package/lib/runner.d.ts +0 -12
- package/lib/runner.d.ts.map +0 -1
- package/lib/runner.js +0 -227
- package/lib/runner.js.map +0 -1
- package/lib/runtime-witness.d.ts +0 -32
- package/lib/runtime-witness.d.ts.map +0 -1
- package/lib/runtime-witness.js +0 -225
- package/lib/runtime-witness.js.map +0 -1
- package/lib/state-socket-binding.d.ts +0 -4
- package/lib/state-socket-binding.d.ts.map +0 -1
- package/lib/state-socket-binding.js +0 -64
- package/lib/state-socket-binding.js.map +0 -1
- package/runtime/supervisor.mjs +0 -300
package/lib/cleanup-receipt.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { chmod, mkdtemp, rm } from 'node:fs/promises';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { sameLocalDockerSocket } from './docker-socket.js';
|
|
6
|
-
const NAME = /^dsh-isolation-[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/;
|
|
7
|
-
const OUTPUT_LIMIT = 4096;
|
|
8
|
-
const COMMAND_TIMEOUT_MS = 10_000;
|
|
9
|
-
const receipts = new WeakMap();
|
|
10
|
-
function validSocket(path) {
|
|
11
|
-
return path.startsWith('/') && !/[\p{Cc}]/u.test(path);
|
|
12
|
-
}
|
|
13
|
-
function environment() {
|
|
14
|
-
return { PATH: process.env.PATH || '/usr/bin:/bin', LANG: 'C', LC_ALL: 'C' };
|
|
15
|
-
}
|
|
16
|
-
async function command(dockerPath, configDirectory, socketPath, args, signal, socket) {
|
|
17
|
-
return await new Promise(resolve => {
|
|
18
|
-
let child;
|
|
19
|
-
let stderr = '';
|
|
20
|
-
let settled = false;
|
|
21
|
-
let timer;
|
|
22
|
-
const finish = (code, timedOut, aborted) => {
|
|
23
|
-
if (settled)
|
|
24
|
-
return;
|
|
25
|
-
settled = true;
|
|
26
|
-
if (timer !== undefined)
|
|
27
|
-
clearTimeout(timer);
|
|
28
|
-
signal?.removeEventListener('abort', abort);
|
|
29
|
-
resolve({ code, stderr, timedOut, aborted });
|
|
30
|
-
};
|
|
31
|
-
const abort = () => { child?.kill('SIGKILL'); finish(null, false, true); };
|
|
32
|
-
if (signal?.aborted) {
|
|
33
|
-
finish(null, false, true);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
if (socket && !sameLocalDockerSocket(socket)) {
|
|
37
|
-
finish(null, false, false);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
signal?.addEventListener('abort', abort, { once: true });
|
|
41
|
-
try {
|
|
42
|
-
child = spawn(dockerPath, ['--config', configDirectory, '-H', `unix://${socketPath}`, ...args], {
|
|
43
|
-
shell: false, env: environment(), stdio: ['ignore', 'ignore', 'pipe'],
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
finish(null, false, false);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
child.stderr?.on('data', (chunk) => {
|
|
51
|
-
const remaining = OUTPUT_LIMIT - Buffer.byteLength(stderr);
|
|
52
|
-
if (remaining <= 0) {
|
|
53
|
-
child?.kill('SIGKILL');
|
|
54
|
-
finish(null, false, false);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const value = Buffer.from(chunk);
|
|
58
|
-
if (value.length > remaining) {
|
|
59
|
-
stderr += value.subarray(0, remaining).toString('utf8');
|
|
60
|
-
child?.kill('SIGKILL');
|
|
61
|
-
finish(null, false, false);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
stderr += value.toString('utf8');
|
|
65
|
-
});
|
|
66
|
-
child.once('error', () => finish(null, false, false));
|
|
67
|
-
child.once('close', (code, signalName) => finish(signalName === null ? code : null, false, false));
|
|
68
|
-
timer = setTimeout(() => { child?.kill('SIGKILL'); finish(null, true, false); }, COMMAND_TIMEOUT_MS);
|
|
69
|
-
timer.unref();
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
function absent(result) {
|
|
73
|
-
return !result.timedOut && !result.aborted && result.code !== null
|
|
74
|
-
&& result.code !== 0 && /no such (object|container|volume)/i.test(result.stderr);
|
|
75
|
-
}
|
|
76
|
-
async function removeOne(dockerPath, configDirectory, socketPath, kind, name, signal, socket) {
|
|
77
|
-
for (let attempt = 0; attempt < 3; attempt++) {
|
|
78
|
-
const removal = await command(dockerPath, configDirectory, socketPath, kind === 'volume' ? ['volume', 'rm', name] : ['rm', '-f', name], signal, socket);
|
|
79
|
-
// A failed or ambiguous remove invalidates this cleanup pass even if a later
|
|
80
|
-
// inspect happens to find the resource absent.
|
|
81
|
-
if (removal.timedOut || removal.aborted || removal.code === null)
|
|
82
|
-
return undefined;
|
|
83
|
-
const inspection = await command(dockerPath, configDirectory, socketPath, ['inspect', '--type', kind, name], signal, socket);
|
|
84
|
-
if (absent(inspection))
|
|
85
|
-
return Object.freeze({ kind, name, removalExitCode: removal.code, inspectionConfirmedAbsent: true });
|
|
86
|
-
if (inspection.timedOut || inspection.aborted || inspection.code === null)
|
|
87
|
-
return undefined;
|
|
88
|
-
if (attempt < 2)
|
|
89
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
90
|
-
}
|
|
91
|
-
return undefined;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Deletes and then independently inspects all three deterministic resources.
|
|
95
|
-
* The returned opaque receipt is evidence of this exact cleanup pass only.
|
|
96
|
-
*/
|
|
97
|
-
export async function cleanupIsolationResources(dockerPath, name, options = {}) {
|
|
98
|
-
const socketPath = options.socketPath ?? '/var/run/docker.sock';
|
|
99
|
-
if (!NAME.test(name) || !dockerPath.startsWith('/') || !validSocket(socketPath) || options.signal?.aborted
|
|
100
|
-
|| (options.socket && (options.socket.path !== socketPath || !sameLocalDockerSocket(options.socket))))
|
|
101
|
-
return undefined;
|
|
102
|
-
let configDirectory;
|
|
103
|
-
try {
|
|
104
|
-
configDirectory = await mkdtemp(join(tmpdir(), 'dsh-isolation-docker-'));
|
|
105
|
-
await chmod(configDirectory, 0o700);
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
return undefined;
|
|
109
|
-
}
|
|
110
|
-
try {
|
|
111
|
-
const targets = [
|
|
112
|
-
['container', name], ['container', `${name}-keeper`], ['volume', `${name}-workspace`],
|
|
113
|
-
];
|
|
114
|
-
const resources = [];
|
|
115
|
-
let complete = true;
|
|
116
|
-
for (const [kind, target] of targets) {
|
|
117
|
-
const receipt = await removeOne(dockerPath, configDirectory, socketPath, kind, target, options.signal, options.socket);
|
|
118
|
-
if (receipt === undefined)
|
|
119
|
-
complete = false;
|
|
120
|
-
else
|
|
121
|
-
resources.push(receipt);
|
|
122
|
-
}
|
|
123
|
-
if (!complete || options.signal?.aborted || (options.socket && !sameLocalDockerSocket(options.socket)))
|
|
124
|
-
return undefined;
|
|
125
|
-
const receipt = Object.freeze({});
|
|
126
|
-
receipts.set(receipt, Object.freeze({ dockerPath, socketPath, containerName: name, checkedAt: Date.now(), resources: Object.freeze(resources) }));
|
|
127
|
-
return receipt;
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
await rm(configDirectory, { recursive: true, force: true }).catch(() => undefined);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/** Returns immutable receipt data only for receipts minted by this module. */
|
|
134
|
-
export function receiptData(receipt) {
|
|
135
|
-
return typeof receipt === 'object' && receipt !== null ? receipts.get(receipt) : undefined;
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=cleanup-receipt.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup-receipt.js","sourceRoot":"","sources":["../src/cleanup-receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,qBAAqB,EAAqB,MAAM,oBAAoB,CAAA;AAE7E,MAAM,IAAI,GAAG,6DAA6D,CAAA;AAC1E,MAAM,YAAY,GAAG,IAAI,CAAA;AACzB,MAAM,kBAAkB,GAAG,MAAM,CAAA;AAmBjC,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA8B,CAAA;AAE1D,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;AAC9E,CAAC;AAID,KAAK,UAAU,OAAO,CAAC,UAAkB,EAAE,eAAuB,EAAE,UAAkB,EAAE,IAAuB,EAAE,MAAoB,EAAE,MAAqB;IAC1J,OAAO,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACjC,IAAI,KAA2C,CAAA;QAC/C,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,KAAiC,CAAA;QACrC,MAAM,MAAM,GAAG,CAAC,IAAmB,EAAE,QAAiB,EAAE,OAAgB,EAAQ,EAAE;YAChF,IAAI,OAAO;gBAAE,OAAM;YACnB,OAAO,GAAG,IAAI,CAAA;YACd,IAAI,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAA;YAC5C,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC3C,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;QAC9C,CAAC,CAAA;QACD,MAAM,KAAK,GAAG,GAAS,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC,CAAA;QAC/E,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QAC1D,IAAI,MAAM,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QACpF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACxD,IAAI,CAAC;YACH,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE;gBAC9F,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;aACtE,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QAC9C,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,MAAM,SAAS,GAAG,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YAC1D,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAAC,OAAM;YAAC,CAAC;YAClF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChC,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAAC,OAAM;YAAC,CAAC;YACrJ,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;QACrD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;QAClG,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAA;QACnG,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,MAAqB;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;WAC7D,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,oCAAoC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AACpF,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,eAAuB,EAAE,UAAkB,EAAE,IAA4B,EAAE,IAAY,EAAE,MAAoB,EAAE,MAAqB;IAC/K,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QACvJ,6EAA6E;QAC7E,+CAA+C;QAC/C,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,SAAS,CAAA;QAClF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5H,IAAI,MAAM,CAAC,UAAU,CAAC;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5H,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,SAAS,CAAA;QAC3F,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,UAAkB,EAAE,IAAY,EAAE,UAAgF,EAAE;IAClK,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,sBAAsB,CAAA;IAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;WACrG,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IACzH,IAAI,eAAmC,CAAA;IACvC,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAA;QACxE,MAAM,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAA;IAAC,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAqD;YAChE,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,YAAY,CAAC;SACtF,CAAA;QACD,MAAM,SAAS,GAA6B,EAAE,CAAA;QAC9C,IAAI,QAAQ,GAAG,IAAI,CAAA;QACnB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;YACtH,IAAI,OAAO,KAAK,SAAS;gBAAE,QAAQ,GAAG,KAAK,CAAA;;gBACtC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC9B,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAAE,OAAO,SAAS,CAAA;QACxH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACjC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;QACjJ,OAAO,OAAO,CAAA;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IACpF,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC5F,CAAC"}
|
package/lib/daemon-binding.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { DaemonWitness } from './runtime-witness.js';
|
|
2
|
-
export interface SystemdBinding {
|
|
3
|
-
kind: 'systemd';
|
|
4
|
-
serviceInvocationId: string;
|
|
5
|
-
socketInvocationId: string;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Attests the systemd configuration chain, not a kernel-level ownership proof
|
|
9
|
-
* for a particular inherited file descriptor. Every missing or changing datum
|
|
10
|
-
* is rejected so callers retain uncertainty rather than freeing work.
|
|
11
|
-
*/
|
|
12
|
-
export declare function captureSystemdBinding(daemon: DaemonWitness): Promise<SystemdBinding | undefined>;
|
|
13
|
-
//# sourceMappingURL=daemon-binding.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-binding.d.ts","sourceRoot":"","sources":["../src/daemon-binding.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,SAAS,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE;AAmE5G;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAUtG"}
|
package/lib/daemon-binding.js
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
import { readFile } from 'node:fs/promises';
|
|
3
|
-
import { basename } from 'node:path';
|
|
4
|
-
import { processWitness } from './runtime-witness.js';
|
|
5
|
-
const systemctl = '/usr/bin/systemctl';
|
|
6
|
-
const outputMaximum = 16_384;
|
|
7
|
-
const invocationId = /^[0-9a-f]{32}$/;
|
|
8
|
-
const pid = /^[1-9][0-9]*$/;
|
|
9
|
-
const properties = ['MainPID', 'InvocationID', 'ActiveState', 'SubState', 'TriggeredBy', 'Triggers', 'Listen', 'ExecStart'];
|
|
10
|
-
const required = {
|
|
11
|
-
'docker.service': ['MainPID', 'InvocationID', 'ActiveState', 'SubState', 'TriggeredBy', 'ExecStart'],
|
|
12
|
-
'docker.socket': ['InvocationID', 'ActiveState', 'SubState', 'Triggers', 'Listen'],
|
|
13
|
-
};
|
|
14
|
-
function equalUnit(left, right) { return properties.every(key => left[key] === right[key]); }
|
|
15
|
-
function includesUnit(value, unit) { return value.split(/\s+/).includes(unit); }
|
|
16
|
-
async function show(unit) {
|
|
17
|
-
return await new Promise(resolve => {
|
|
18
|
-
let stdout = Buffer.alloc(0);
|
|
19
|
-
let stderr = Buffer.alloc(0);
|
|
20
|
-
let complete = false;
|
|
21
|
-
let timeout;
|
|
22
|
-
const finish = (value) => { if (complete)
|
|
23
|
-
return; complete = true; if (timeout !== undefined)
|
|
24
|
-
clearTimeout(timeout); resolve(value); };
|
|
25
|
-
let child;
|
|
26
|
-
try {
|
|
27
|
-
child = spawn(systemctl, ['show', unit, ...properties.map(property => `--property=${property}`)], { shell: false, env: { LANG: 'C', LC_ALL: 'C' }, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
finish(undefined);
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const collect = (target, chunk) => {
|
|
34
|
-
const bytes = stdout.length + stderr.length + chunk.length;
|
|
35
|
-
if (bytes > outputMaximum) {
|
|
36
|
-
child.kill('SIGKILL');
|
|
37
|
-
finish(undefined);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
if (target === 'stdout')
|
|
41
|
-
stdout = Buffer.concat([stdout, chunk]);
|
|
42
|
-
else
|
|
43
|
-
stderr = Buffer.concat([stderr, chunk]);
|
|
44
|
-
};
|
|
45
|
-
child.stdout?.on('data', chunk => collect('stdout', chunk));
|
|
46
|
-
child.stderr?.on('data', chunk => collect('stderr', chunk));
|
|
47
|
-
child.once('error', () => finish(undefined));
|
|
48
|
-
child.once('close', code => {
|
|
49
|
-
if (code !== 0 || stderr.length !== 0) {
|
|
50
|
-
finish(undefined);
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const values = new Map();
|
|
54
|
-
for (const line of stdout.toString('utf8').split('\n').filter(Boolean)) {
|
|
55
|
-
const separator = line.indexOf('=');
|
|
56
|
-
if (separator <= 0) {
|
|
57
|
-
finish(undefined);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const key = line.slice(0, separator);
|
|
61
|
-
const value = line.slice(separator + 1);
|
|
62
|
-
if (!properties.includes(key) || values.has(key)) {
|
|
63
|
-
finish(undefined);
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
values.set(key, value);
|
|
67
|
-
}
|
|
68
|
-
if (required[unit].some(property => !values.has(property))) {
|
|
69
|
-
finish(undefined);
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
finish(Object.fromEntries(properties.map(property => [property, values.get(property) ?? ''])));
|
|
73
|
-
});
|
|
74
|
-
timeout = setTimeout(() => { child.kill('SIGKILL'); finish(undefined); }, 5_000);
|
|
75
|
-
timeout.unref();
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
function matches(daemon, service, socket) {
|
|
79
|
-
if (!pid.test(service.MainPID) || Number(service.MainPID) !== daemon.process.pid || !invocationId.test(service.InvocationID) || !invocationId.test(socket.InvocationID)
|
|
80
|
-
|| service.ActiveState !== 'active' || service.SubState !== 'running' || socket.ActiveState !== 'active' || socket.SubState !== 'running'
|
|
81
|
-
|| !includesUnit(service.TriggeredBy, 'docker.socket') || !includesUnit(socket.Triggers, 'docker.service') || socket.Listen !== `${daemon.socketPath} (Stream)`
|
|
82
|
-
|| !/\bpath=\/usr\/bin\/dockerd\b/.test(service.ExecStart) || !/\bargv\[\]=.*\bdockerd -H fd:\/\//.test(service.ExecStart))
|
|
83
|
-
return undefined;
|
|
84
|
-
return { kind: 'systemd', serviceInvocationId: service.InvocationID, socketInvocationId: socket.InvocationID };
|
|
85
|
-
}
|
|
86
|
-
function sameProcess(left, daemon) {
|
|
87
|
-
return !!left && left.bootId === daemon.process.bootId && left.pid === daemon.process.pid && left.startTicks === daemon.process.startTicks;
|
|
88
|
-
}
|
|
89
|
-
async function dockerdFdCommand(pid) {
|
|
90
|
-
try {
|
|
91
|
-
const arguments_ = (await readFile(`/proc/${pid}/cmdline`)).toString('utf8').split('\0').filter(Boolean);
|
|
92
|
-
return basename(arguments_[0] ?? '') === 'dockerd' && arguments_.some((value, index) => value === '-H' && arguments_[index + 1] === 'fd://');
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Attests the systemd configuration chain, not a kernel-level ownership proof
|
|
100
|
-
* for a particular inherited file descriptor. Every missing or changing datum
|
|
101
|
-
* is rejected so callers retain uncertainty rather than freeing work.
|
|
102
|
-
*/
|
|
103
|
-
export async function captureSystemdBinding(daemon) {
|
|
104
|
-
if (!daemon || typeof daemon !== 'object' || daemon.socketPath !== '/run/docker.sock')
|
|
105
|
-
return undefined;
|
|
106
|
-
if (!sameProcess(await processWitness(daemon.process.pid), daemon))
|
|
107
|
-
return undefined;
|
|
108
|
-
const [firstService, firstSocket] = await Promise.all([show('docker.service'), show('docker.socket')]);
|
|
109
|
-
if (!firstService || !firstSocket || !matches(daemon, firstService, firstSocket) || !await dockerdFdCommand(daemon.process.pid))
|
|
110
|
-
return undefined;
|
|
111
|
-
if (!sameProcess(await processWitness(daemon.process.pid), daemon))
|
|
112
|
-
return undefined;
|
|
113
|
-
const [secondService, secondSocket] = await Promise.all([show('docker.service'), show('docker.socket')]);
|
|
114
|
-
if (!secondService || !secondSocket || !equalUnit(firstService, secondService) || !equalUnit(firstSocket, secondSocket))
|
|
115
|
-
return undefined;
|
|
116
|
-
if (!sameProcess(await processWitness(daemon.process.pid), daemon) || !await dockerdFdCommand(daemon.process.pid))
|
|
117
|
-
return undefined;
|
|
118
|
-
return matches(daemon, secondService, secondSocket);
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=daemon-binding.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-binding.js","sourceRoot":"","sources":["../src/daemon-binding.ts"],"names":[],"mappings":"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"}
|
package/lib/docker-socket.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export interface DockerSocket {
|
|
2
|
-
path: string;
|
|
3
|
-
dev: number;
|
|
4
|
-
ino: number;
|
|
5
|
-
}
|
|
6
|
-
export declare function configuredDockerSocketPath(path: string | undefined, platform?: NodeJS.Platform, home?: string): string;
|
|
7
|
-
/** Resolve once for a job and retain the inode through supervisor and cleanup. */
|
|
8
|
-
export declare function resolveLocalDockerSocket(path: string, platform?: NodeJS.Platform, home?: string): DockerSocket;
|
|
9
|
-
export declare function sameLocalDockerSocket(socket: DockerSocket): boolean;
|
|
10
|
-
//# sourceMappingURL=docker-socket.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker-socket.d.ts","sourceRoot":"","sources":["../src/docker-socket.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAExE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,kBAAmB,EAAE,IAAI,SAAY,GAAG,MAAM,CAU1H;AAED,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,kBAAmB,EAAE,IAAI,SAAY,GAAG,YAAY,CAclH;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAKnE"}
|
package/lib/docker-socket.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { lstatSync, realpathSync, statSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { isAbsolute, join, resolve } from 'node:path';
|
|
4
|
-
export function configuredDockerSocketPath(path, platform = process.platform, home = homedir()) {
|
|
5
|
-
const value = path ?? (platform === 'darwin' ? join(home, '.docker', 'run', 'docker.sock') : '/var/run/docker.sock');
|
|
6
|
-
if (!isAbsolute(value) || resolve(value) !== value || /[\p{Cc},]/u.test(value) || value.includes('://'))
|
|
7
|
-
throw new Error('assistant-isolation: canonical absolute local Docker socket required');
|
|
8
|
-
if (platform === 'darwin') {
|
|
9
|
-
const directory = join(home, '.docker', 'run');
|
|
10
|
-
if (value !== join(directory, 'docker.sock')) {
|
|
11
|
-
throw new Error('assistant-isolation: macOS Docker socket must be in the current user Docker run directory');
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
return value;
|
|
15
|
-
}
|
|
16
|
-
/** Resolve once for a job and retain the inode through supervisor and cleanup. */
|
|
17
|
-
export function resolveLocalDockerSocket(path, platform = process.platform, home = homedir()) {
|
|
18
|
-
configuredDockerSocketPath(path, platform, home);
|
|
19
|
-
const canonical = realpathSync(path);
|
|
20
|
-
if (platform === 'darwin' && canonical !== path)
|
|
21
|
-
throw new Error('assistant-isolation: macOS Docker socket must not be a symlink');
|
|
22
|
-
const info = lstatSync(canonical);
|
|
23
|
-
if (!info.isSocket())
|
|
24
|
-
throw new Error('assistant-isolation: Docker endpoint is not a local Unix socket');
|
|
25
|
-
if (platform === 'darwin') {
|
|
26
|
-
const directory = join(home, '.docker', 'run');
|
|
27
|
-
const parent = statSync(directory);
|
|
28
|
-
if (!parent.isDirectory() || parent.uid !== process.getuid?.() || (parent.mode & 0o022) !== 0 || info.uid !== process.getuid?.()) {
|
|
29
|
-
throw new Error('assistant-isolation: macOS Docker socket must be owned by the current user');
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
return { path: canonical, dev: info.dev, ino: info.ino };
|
|
33
|
-
}
|
|
34
|
-
export function sameLocalDockerSocket(socket) {
|
|
35
|
-
try {
|
|
36
|
-
const info = lstatSync(socket.path);
|
|
37
|
-
return info.isSocket() && info.dev === socket.dev && info.ino === socket.ino;
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=docker-socket.js.map
|
package/lib/docker-socket.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker-socket.js","sourceRoot":"","sources":["../src/docker-socket.ts"],"names":[],"mappings":"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"}
|
package/lib/reconcile.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { IsolationControllerAuthority, IsolationLedger } from './ledger.js';
|
|
2
|
-
import type { IsolationJob } from './types.js';
|
|
3
|
-
/** Host-only reconciliation. Lost mutation receipts never acquire release authority. */
|
|
4
|
-
export declare function reconcileUnknownJob(ledger: IsolationLedger, authority: IsolationControllerAuthority, job: IsolationJob, dockerPath: string, signal: AbortSignal, socketPath?: string): Promise<boolean>;
|
|
5
|
-
//# sourceMappingURL=reconcile.d.ts.map
|
package/lib/reconcile.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAGhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,wFAAwF;AACxF,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,4BAA4B,EACxG,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBnG"}
|
package/lib/reconcile.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { realpath } from 'node:fs/promises';
|
|
2
|
-
import { cleanupIsolationResources } from './cleanup-receipt.js';
|
|
3
|
-
import { captureDaemonWitness, processExited, sameDaemonWitness } from './runtime-witness.js';
|
|
4
|
-
import { configuredDockerSocketPath, resolveLocalDockerSocket } from './docker-socket.js';
|
|
5
|
-
/** Host-only reconciliation. Lost mutation receipts never acquire release authority. */
|
|
6
|
-
export async function reconcileUnknownJob(ledger, authority, job, dockerPath, signal, socketPath) {
|
|
7
|
-
const original = job.creationWitness;
|
|
8
|
-
if (signal.aborted || job.status !== 'unknown' || job.result?.quiescent !== false
|
|
9
|
-
|| original?.requestsSettled !== true || !processExited(original.supervisor))
|
|
10
|
-
return false;
|
|
11
|
-
try {
|
|
12
|
-
if (!ledger.hasController(authority) || await realpath(dockerPath) !== original.daemon.dockerPath
|
|
13
|
-
|| resolveLocalDockerSocket(configuredDockerSocketPath(socketPath)).path !== original.daemon.socketPath)
|
|
14
|
-
return false;
|
|
15
|
-
const before = await captureDaemonWitness(original.daemon);
|
|
16
|
-
if (!before || !sameDaemonWitness(original.daemon, before) || signal.aborted)
|
|
17
|
-
return false;
|
|
18
|
-
const cleanup = await cleanupIsolationResources(before.dockerPath, job.containerName, { socketPath: before.socketPath, signal });
|
|
19
|
-
if (!cleanup || signal.aborted)
|
|
20
|
-
return false;
|
|
21
|
-
const current = await captureDaemonWitness(before);
|
|
22
|
-
if (!current || !sameDaemonWitness(before, current) || signal.aborted)
|
|
23
|
-
return false;
|
|
24
|
-
ledger.settleReconciledUnknown(job.id, job.version, { original, current, checkedAt: Date.now(), cleanup }, authority);
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=reconcile.js.map
|
package/lib/reconcile.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAEhE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7F,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAGzF,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAuB,EAAE,SAAuC,EACxG,GAAiB,EAAE,UAAkB,EAAE,MAAmB,EAAE,UAAmB;IAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAA;IACpC,IAAI,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,KAAK;WAC5E,QAAQ,EAAE,eAAe,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAA;IAC5F,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,UAAU;eAC5F,wBAAwB,CAAC,0BAA0B,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,KAAK,CAAA;QACvH,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAC1D,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QAC1F,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;QAChI,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QAC5C,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAA;QACnF,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;QACrH,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AAC1B,CAAC"}
|
package/lib/runner.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { IsolationProcessResult, IsolationRunInput } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Starts a one-shot supervisor. The supervisor owns Docker after creation so a
|
|
4
|
-
* Host crash closes IPC and causes container cleanup instead of an orphaned job.
|
|
5
|
-
*/
|
|
6
|
-
export declare function runIsolatedProcess(input: IsolationRunInput): Promise<IsolationProcessResult>;
|
|
7
|
-
/** Removes only names generated by this plugin; arbitrary Docker names are rejected. */
|
|
8
|
-
export declare function removeIsolatedContainer(dockerPath: string, name: string, options?: {
|
|
9
|
-
socketPath?: string;
|
|
10
|
-
signal?: AbortSignal;
|
|
11
|
-
}): Promise<boolean>;
|
|
12
|
-
//# sourceMappingURL=runner.d.ts.map
|
package/lib/runner.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAmB,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AA+D5F;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAwHlG;AAED,wFAAwF;AACxF,wBAAsB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAI7J"}
|