@dsh-enhanced/assistant-isolation 0.1.48 → 0.1.53
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 +57 -5
- package/lib/audit-archive.d.ts +1 -1
- package/lib/audit-archive.d.ts.map +1 -1
- package/lib/audit-archive.js +5 -5
- package/lib/audit-archive.js.map +1 -1
- package/lib/cleanup-receipt.d.ts +2 -0
- package/lib/cleanup-receipt.d.ts.map +1 -1
- package/lib/cleanup-receipt.js +13 -7
- package/lib/cleanup-receipt.js.map +1 -1
- package/lib/cli.d.ts +2 -2
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +21 -14
- package/lib/cli.js.map +1 -1
- package/lib/config.d.ts +1 -0
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +6 -3
- package/lib/config.js.map +1 -1
- package/lib/diagnostics.js +2 -2
- package/lib/docker-socket.d.ts +10 -0
- package/lib/docker-socket.d.ts.map +1 -0
- package/lib/docker-socket.js +43 -0
- package/lib/docker-socket.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/ledger.d.ts +8 -0
- package/lib/ledger.d.ts.map +1 -1
- package/lib/ledger.js +64 -9
- package/lib/ledger.js.map +1 -1
- package/lib/native-macos.d.ts +37 -0
- package/lib/native-macos.d.ts.map +1 -0
- package/lib/native-macos.js +229 -0
- package/lib/native-macos.js.map +1 -0
- package/lib/native-runtime.d.ts +28 -0
- package/lib/native-runtime.d.ts.map +1 -0
- package/lib/native-runtime.js +121 -0
- package/lib/native-runtime.js.map +1 -0
- package/lib/native-verifier-runner.d.ts +23 -0
- package/lib/native-verifier-runner.d.ts.map +1 -0
- package/lib/native-verifier-runner.js +379 -0
- package/lib/native-verifier-runner.js.map +1 -0
- package/lib/probe.d.ts +1 -1
- package/lib/probe.d.ts.map +1 -1
- package/lib/probe.js +7 -5
- package/lib/probe.js.map +1 -1
- package/lib/reconcile.d.ts +1 -1
- package/lib/reconcile.d.ts.map +1 -1
- package/lib/reconcile.js +4 -2
- package/lib/reconcile.js.map +1 -1
- package/lib/runner.d.ts.map +1 -1
- package/lib/runner.js +31 -5
- package/lib/runner.js.map +1 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +6 -4
- package/lib/service.js.map +1 -1
- package/lib/state-socket-binding.d.ts +4 -0
- package/lib/state-socket-binding.d.ts.map +1 -0
- package/lib/state-socket-binding.js +64 -0
- package/lib/state-socket-binding.js.map +1 -0
- package/lib/types.d.ts +5 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/verifier-runner.d.ts +1 -0
- package/lib/verifier-runner.d.ts.map +1 -1
- package/lib/verifier-runner.js +6 -3
- package/lib/verifier-runner.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +19 -19
- package/runtime/native-macos-supervisor.mjs +51 -0
- package/runtime/supervisor.mjs +14 -4
package/lib/cli.js
CHANGED
|
@@ -10,6 +10,8 @@ import { removeIsolatedContainer } from './runner.js';
|
|
|
10
10
|
import { defaultStoragePolicy, validateStoragePolicy } from './storage-policy.js';
|
|
11
11
|
import { maintainIsolationStorage } from './storage.js';
|
|
12
12
|
import { archiveIsolationAudit, verifyIsolationAuditArchive } from './audit-archive.js';
|
|
13
|
+
import { configuredDockerSocketPath } from './docker-socket.js';
|
|
14
|
+
import { stateSocketBindingMatches } from './state-socket-binding.js';
|
|
13
15
|
function privateLedger(stateRoot, dockerPath) {
|
|
14
16
|
if (!isAbsolute(stateRoot) || realpathSync(stateRoot) !== stateRoot)
|
|
15
17
|
throw new Error('canonical state root required');
|
|
@@ -24,12 +26,14 @@ function privateLedger(stateRoot, dockerPath) {
|
|
|
24
26
|
return file;
|
|
25
27
|
}
|
|
26
28
|
/** Operator entry point, separate from the model's tool registry. */
|
|
27
|
-
export async function revokeIsolationGrant(stateRoot, grantId, revision, dockerPath = '/usr/bin/docker') {
|
|
29
|
+
export async function revokeIsolationGrant(stateRoot, grantId, revision, dockerPath = process.platform === 'darwin' ? '/usr/local/bin/docker' : '/usr/bin/docker', socketPath) {
|
|
28
30
|
const file = privateLedger(stateRoot, dockerPath);
|
|
31
|
+
const boundSocket = configuredDockerSocketPath(socketPath);
|
|
29
32
|
const ledger = new IsolationLedger(file);
|
|
30
33
|
try {
|
|
31
34
|
ledger.revoke(grantId, revision, 'external-operator-revoke');
|
|
32
|
-
|
|
35
|
+
const bindingMatches = stateSocketBindingMatches(stateRoot, boundSocket);
|
|
36
|
+
let containersRemoved = bindingMatches;
|
|
33
37
|
let cursor = '';
|
|
34
38
|
for (;;) {
|
|
35
39
|
const page = ledger.recoverable(cursor);
|
|
@@ -37,7 +41,8 @@ export async function revokeIsolationGrant(stateRoot, grantId, revision, dockerP
|
|
|
37
41
|
break;
|
|
38
42
|
cursor = page.at(-1).id;
|
|
39
43
|
for (const job of page)
|
|
40
|
-
if (job.grantId === grantId &&
|
|
44
|
+
if (job.grantId === grantId && bindingMatches
|
|
45
|
+
&& !await removeIsolatedContainer(dockerPath, job.containerName, { socketPath: boundSocket }))
|
|
41
46
|
containersRemoved = false;
|
|
42
47
|
}
|
|
43
48
|
// Revocation is durable. A running controller also polls it and prevents any
|
|
@@ -49,7 +54,8 @@ export async function revokeIsolationGrant(stateRoot, grantId, revision, dockerP
|
|
|
49
54
|
}
|
|
50
55
|
}
|
|
51
56
|
/** Reconcile only settled requests; a live Host owns its own background sweep. */
|
|
52
|
-
export async function reconcileIsolation(stateRoot, dockerPath = '/usr/bin/docker', signal = new AbortController().signal) {
|
|
57
|
+
export async function reconcileIsolation(stateRoot, dockerPath = process.platform === 'darwin' ? '/usr/local/bin/docker' : '/usr/bin/docker', signal = new AbortController().signal, socketPath) {
|
|
58
|
+
const boundSocket = configuredDockerSocketPath(socketPath);
|
|
53
59
|
const ledger = new IsolationLedger(privateLedger(stateRoot, dockerPath));
|
|
54
60
|
const abort = new AbortController();
|
|
55
61
|
let timer;
|
|
@@ -77,7 +83,8 @@ export async function reconcileIsolation(stateRoot, dockerPath = '/usr/bin/docke
|
|
|
77
83
|
abort.signal.throwIfAborted();
|
|
78
84
|
counts.checked++;
|
|
79
85
|
const combined = AbortSignal.any([signal, abort.signal, AbortSignal.timeout(30_000)]);
|
|
80
|
-
if (
|
|
86
|
+
if (stateSocketBindingMatches(stateRoot, boundSocket)
|
|
87
|
+
&& await reconcileUnknownJob(ledger, controller, job, dockerPath, combined, boundSocket))
|
|
81
88
|
counts.released++;
|
|
82
89
|
else
|
|
83
90
|
counts.retained++;
|
|
@@ -129,9 +136,9 @@ if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.a
|
|
|
129
136
|
const [command, stateRoot, grantId, revision, dockerPath, ...extra] = process.argv.slice(2);
|
|
130
137
|
try {
|
|
131
138
|
if (command === 'probe') {
|
|
132
|
-
if (!stateRoot ||
|
|
133
|
-
throw new Error('usage: dsh-isolation probe sha256:image-id [/absolute/docker]');
|
|
134
|
-
process.stdout.write(`${JSON.stringify(await probeIsolationRuntime(stateRoot, grantId))}\n`);
|
|
139
|
+
if (!stateRoot || dockerPath !== undefined || extra.length > 0)
|
|
140
|
+
throw new Error('usage: dsh-isolation probe sha256:image-id [/absolute/docker [/absolute/docker.sock]]');
|
|
141
|
+
process.stdout.write(`${JSON.stringify(await probeIsolationRuntime(stateRoot, grantId, revision))}\n`);
|
|
135
142
|
}
|
|
136
143
|
else if (command === 'maintain') {
|
|
137
144
|
if (stateRoot === undefined || dockerPath !== undefined || (grantId !== undefined && !/^(0|[1-9][0-9]*)$/.test(grantId)))
|
|
@@ -139,14 +146,14 @@ if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.a
|
|
|
139
146
|
process.stdout.write(`${JSON.stringify(await maintainIsolation(stateRoot, grantId === undefined ? 0 : Number(grantId), revision))}\n`);
|
|
140
147
|
}
|
|
141
148
|
else if (command === 'reconcile') {
|
|
142
|
-
if (stateRoot === undefined ||
|
|
143
|
-
throw new Error('usage: dsh-isolation reconcile /absolute/private/state-root [/absolute/docker]');
|
|
149
|
+
if (stateRoot === undefined || dockerPath !== undefined || extra.length > 0)
|
|
150
|
+
throw new Error('usage: dsh-isolation reconcile /absolute/private/state-root [/absolute/docker [/absolute/docker.sock]]');
|
|
144
151
|
const abort = new AbortController();
|
|
145
152
|
const cancel = () => abort.abort();
|
|
146
153
|
process.once('SIGINT', cancel);
|
|
147
154
|
process.once('SIGTERM', cancel);
|
|
148
155
|
try {
|
|
149
|
-
process.stdout.write(`${JSON.stringify(await reconcileIsolation(stateRoot, grantId, abort.signal))}\n`);
|
|
156
|
+
process.stdout.write(`${JSON.stringify(await reconcileIsolation(stateRoot, grantId, abort.signal, revision))}\n`);
|
|
150
157
|
}
|
|
151
158
|
finally {
|
|
152
159
|
process.removeListener('SIGINT', cancel);
|
|
@@ -167,9 +174,9 @@ if (process.argv[1] !== undefined && import.meta.url === pathToFileURL(process.a
|
|
|
167
174
|
process.stdout.write(`${JSON.stringify(verifyIsolationAuditArchive(stateRoot))}\n`);
|
|
168
175
|
}
|
|
169
176
|
else {
|
|
170
|
-
if (command !== 'revoke' || stateRoot === undefined || grantId === undefined || revision === undefined || extra.length >
|
|
171
|
-
throw new Error('usage: dsh-isolation revoke /absolute/private/state-root grant-id revision [/absolute/docker]');
|
|
172
|
-
const result = await revokeIsolationGrant(stateRoot, grantId, Number(revision), dockerPath);
|
|
177
|
+
if (command !== 'revoke' || stateRoot === undefined || grantId === undefined || revision === undefined || extra.length > 1 || !/^[1-9][0-9]*$/.test(revision))
|
|
178
|
+
throw new Error('usage: dsh-isolation revoke /absolute/private/state-root grant-id revision [/absolute/docker [/absolute/docker.sock]]');
|
|
179
|
+
const result = await revokeIsolationGrant(stateRoot, grantId, Number(revision), dockerPath, extra[0]);
|
|
173
180
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
174
181
|
if (!result.containersRemoved)
|
|
175
182
|
process.exitCode = 2;
|
package/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AACjF,OAAO,EAAE,wBAAwB,EAAoC,MAAM,cAAc,CAAA;AACzF,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
CHANGED
package/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAK7C,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAEzF,MAAM,WAAW,MAAM;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,0BAA0B,CAAC,EAAE,MAAM,CAAA;CACpC;AACD,eAAO,MAAM,aAAa,EAAE,eACwH,CAAA;AAEpJ,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,CAkBhC,CAAA;AACF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,sBAAsB,CAAA;CAAE,CA2B7H"}
|
package/lib/config.js
CHANGED
|
@@ -2,12 +2,14 @@ import Schema from '@deepseek-ai/schemastery';
|
|
|
2
2
|
import { homedir } from 'node:os';
|
|
3
3
|
import { isAbsolute, join, resolve } from 'node:path';
|
|
4
4
|
import { defaultStoragePolicy, plannedStorageBytes, validateStoragePolicy } from './storage-policy.js';
|
|
5
|
+
import { configuredDockerSocketPath } from './docker-socket.js';
|
|
5
6
|
export const defaultLimits = { maxDurationMs: 60_000, maxInputBytes: 1_048_576,
|
|
6
7
|
maxOutputBytes: 65_536, maxArtifactBytes: 262_144, maxFiles: 32, memoryMiB: 256, workspaceMiB: 64, workspaceInodes: 4096, pidsLimit: 64, cpus: 1 };
|
|
7
8
|
const integer = (max) => Schema.number().step(1).min(1).max(max);
|
|
8
9
|
export const Config = Schema.object({
|
|
9
10
|
stateRoot: Schema.string().default(join(homedir(), '.dsh', 'assistant-isolation')),
|
|
10
|
-
image: Schema.string(), dockerPath: Schema.string().default('/usr/bin/docker'),
|
|
11
|
+
image: Schema.string(), dockerPath: Schema.string().default(process.platform === 'darwin' ? '/usr/local/bin/docker' : '/usr/bin/docker'),
|
|
12
|
+
socketPath: Schema.string(),
|
|
11
13
|
grants: Schema.array(Schema.object({
|
|
12
14
|
id: Schema.string().required(), revision: integer(Number.MAX_SAFE_INTEGER).required(),
|
|
13
15
|
principalDigest: Schema.string().required(), principalRecordId: Schema.string().required(),
|
|
@@ -25,7 +27,8 @@ export const Config = Schema.object({
|
|
|
25
27
|
});
|
|
26
28
|
export function validateConfig(input) {
|
|
27
29
|
const stateRoot = input.stateRoot ?? join(homedir(), '.dsh', 'assistant-isolation');
|
|
28
|
-
const dockerPath = input.dockerPath ?? '/usr/bin/docker';
|
|
30
|
+
const dockerPath = input.dockerPath ?? (process.platform === 'darwin' ? '/usr/local/bin/docker' : '/usr/bin/docker');
|
|
31
|
+
const socketPath = configuredDockerSocketPath(input.socketPath);
|
|
29
32
|
const grants = structuredClone(input.grants ?? []);
|
|
30
33
|
const image = input.image ?? '';
|
|
31
34
|
if (!isAbsolute(stateRoot) || resolve(stateRoot) !== stateRoot || stateRoot === '/' || /[\p{Cc},]/u.test(stateRoot)
|
|
@@ -56,6 +59,6 @@ export function validateConfig(input) {
|
|
|
56
59
|
throw new Error('assistant-isolation: invalid grant scope');
|
|
57
60
|
if (storage.maxStateBytes < plannedStorageBytes(limits))
|
|
58
61
|
throw new Error('assistant-isolation: storage budget below planned job allocation');
|
|
59
|
-
return { stateRoot, dockerPath, image, grants, limits, storage, maxConcurrentJobs, maxReservedMemoryMiB, maxReservedWorkspaceInodes };
|
|
62
|
+
return { stateRoot, dockerPath, socketPath, image, grants, limits, storage, maxConcurrentJobs, maxReservedMemoryMiB, maxReservedWorkspaceInodes };
|
|
60
63
|
}
|
|
61
64
|
//# sourceMappingURL=config.js.map
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,0BAA0B,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/lib/diagnostics.js
CHANGED
|
@@ -59,10 +59,10 @@ export function inspectIsolationGrant(input) {
|
|
|
59
59
|
database.exec('PRAGMA query_only=ON; PRAGMA busy_timeout=250; BEGIN;');
|
|
60
60
|
transaction = true;
|
|
61
61
|
const version = database.prepare('PRAGMA user_version').get().user_version;
|
|
62
|
-
if (version !==
|
|
62
|
+
if (version !== 7)
|
|
63
63
|
return unavailable('schema-unsupported');
|
|
64
64
|
const schema = database.prepare("SELECT value FROM schema_meta WHERE key='schema-version'").get();
|
|
65
|
-
if (schema?.value !== '
|
|
65
|
+
if (schema?.value !== '7')
|
|
66
66
|
return unavailable('schema-unsupported');
|
|
67
67
|
const row = database.prepare('SELECT revision, expires_at, max_runs, max_total_duration_ms, revoked, principal_digest, principal_record_id, principal_version, workspace, agent_preset FROM isolation_grants WHERE id=?').get(grant.id);
|
|
68
68
|
if (row !== undefined) {
|
|
@@ -0,0 +1,10 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker-socket.js","sourceRoot":"","sources":["../src/docker-socket.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -4,6 +4,9 @@ import { AssistantIsolationService, Config } from './service.js';
|
|
|
4
4
|
export declare const name = "dsh-enhanced-assistant-isolation";
|
|
5
5
|
export { version, AssistantIsolationService, Config };
|
|
6
6
|
export { IsolatedVerifierRunner, type IsolatedVerifierRunnerConfig } from './verifier-runner.js';
|
|
7
|
+
export { runNativeMacProcess, type NativeMacProcessInput, type NativeMacProcessResult, type NativeMacReadRoot } from './native-macos.js';
|
|
8
|
+
export { validateNativeMacRuntime, verifyNativeMacRuntime, hashNativeMacRuntimeTree, nativeMacRuntimeDigest, type NativeMacRuntime } from './native-runtime.js';
|
|
9
|
+
export { NativeMacVerifierRunner, type NativeMacVerifierRunnerConfig } from './native-verifier-runner.js';
|
|
7
10
|
export { inspectIsolationGrant, type IsolationGrantDiagnostic, type IsolationGrantDiagnosticReason } from './diagnostics.js';
|
|
8
11
|
export { probeIsolationRuntime } from './probe.js';
|
|
9
12
|
export * from './audit-archive.js';
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAEhE,eAAO,MAAM,IAAI,qCAAqC,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAChG,OAAO,EAAE,qBAAqB,EAAE,KAAK,wBAAwB,EAAE,KAAK,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AAC5H,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AACvD,mBAAmB,YAAY,CAAA;AAE/B,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAA2D;;;;;;AAExI,wBAAsC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAEhE,eAAO,MAAM,IAAI,qCAAqC,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,KAAK,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAChG,OAAO,EAAE,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACxI,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC/J,OAAO,EAAE,uBAAuB,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAA;AACzG,OAAO,EAAE,qBAAqB,EAAE,KAAK,wBAAwB,EAAE,KAAK,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AAC5H,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AACvD,mBAAmB,YAAY,CAAA;AAE/B,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAA2D;;;;;;AAExI,wBAAsC"}
|
package/lib/index.js
CHANGED
|
@@ -3,6 +3,9 @@ import { AssistantIsolationService, Config } from './service.js';
|
|
|
3
3
|
export const name = 'dsh-enhanced-assistant-isolation';
|
|
4
4
|
export { version, AssistantIsolationService, Config };
|
|
5
5
|
export { IsolatedVerifierRunner } from './verifier-runner.js';
|
|
6
|
+
export { runNativeMacProcess } from './native-macos.js';
|
|
7
|
+
export { validateNativeMacRuntime, verifyNativeMacRuntime, hashNativeMacRuntimeTree, nativeMacRuntimeDigest } from './native-runtime.js';
|
|
8
|
+
export { NativeMacVerifierRunner } from './native-verifier-runner.js';
|
|
6
9
|
export { inspectIsolationGrant } from './diagnostics.js';
|
|
7
10
|
export { probeIsolationRuntime } from './probe.js';
|
|
8
11
|
export * from './audit-archive.js';
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAEhE,MAAM,CAAC,MAAM,IAAI,GAAG,kCAAkC,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAqC,MAAM,sBAAsB,CAAA;AAChG,OAAO,EAAE,qBAAqB,EAAsE,MAAM,kBAAkB,CAAA;AAC5H,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAGvD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,SAAiB,EAAE,IAAmB,MAAM,IAAI,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CAAA,CAAC,CAAC;AACxI,iFAAiF;AACjF,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAEhE,MAAM,CAAC,MAAM,IAAI,GAAG,kCAAkC,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAqC,MAAM,sBAAsB,CAAA;AAChG,OAAO,EAAE,mBAAmB,EAAmF,MAAM,mBAAmB,CAAA;AACxI,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,sBAAsB,EAAyB,MAAM,qBAAqB,CAAA;AAC/J,OAAO,EAAE,uBAAuB,EAAsC,MAAM,6BAA6B,CAAA;AACzG,OAAO,EAAE,qBAAqB,EAAsE,MAAM,kBAAkB,CAAA;AAC5H,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAClD,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAGvD,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,GAAY,EAAE,SAAiB,EAAE,IAAmB,MAAM,IAAI,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CAAA,CAAC,CAAC;AACxI,iFAAiF;AACjF,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA"}
|
package/lib/ledger.d.ts
CHANGED
|
@@ -36,6 +36,7 @@ export declare class IsolationLedger {
|
|
|
36
36
|
resourceReservation?: ResourceReservation;
|
|
37
37
|
storageBudget?: IsolationStorageBudget;
|
|
38
38
|
artifactBinding?: IsolationArtifactBinding;
|
|
39
|
+
backend?: 'docker' | 'macos-seatbelt';
|
|
39
40
|
}): {
|
|
40
41
|
job: IsolationJob;
|
|
41
42
|
created: boolean;
|
|
@@ -44,6 +45,13 @@ export declare class IsolationLedger {
|
|
|
44
45
|
markDispatched(jobId: string, expectedVersion: number, authority: IsolationControllerAuthority): IsolationJob;
|
|
45
46
|
start(jobId: string, expectedVersion: number, authority?: IsolationControllerAuthority): IsolationJob;
|
|
46
47
|
settle(jobId: string, expectedVersion: number, input: IsolationResult, authority?: IsolationControllerAuthority, creationWitness?: CreationWitness): IsolationJob;
|
|
48
|
+
/** A Host-verified durable supervisor receipt is the only native dispatch settlement proof. */
|
|
49
|
+
settleNativeReceipt(jobId: string, expectedVersion: number, binding: {
|
|
50
|
+
requestDigest: string;
|
|
51
|
+
nonce: string;
|
|
52
|
+
nativeResourceId: string;
|
|
53
|
+
}, input: IsolationResult, authority: IsolationControllerAuthority): IsolationJob;
|
|
54
|
+
findNativeVerifierJob(principalDigest: string, stateRoot: string, key: string): IsolationJob | undefined;
|
|
47
55
|
/** Host-only release after exact cleanup; outcome and origin evidence remain immutable. */
|
|
48
56
|
settleReconciledUnknown(jobId: string, expectedVersion: number, proof: {
|
|
49
57
|
original: CreationWitness;
|
package/lib/ledger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AAKA,OAAO,EAA6D,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC1I,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAe,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAEhF,OAAO,KAAK,EAAE,wBAAwB,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAmB,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAErK,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,QAAQ,GAAG,gBAAgB,GAAG,cAAc,CAAA;AAEnK,qBAAa,oBAAqB,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,wBAAwB;gBAA9B,IAAI,EAAE,wBAAwB,EAAE,OAAO,GAAE,MAAa;CAC5E;AACD,MAAM,WAAW,4BAA4B;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAmDhF,KAAK,mBAAmB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AAKA,OAAO,EAA6D,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC1I,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAe,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAEhF,OAAO,KAAK,EAAE,wBAAwB,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAmB,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAErK,MAAM,MAAM,wBAAwB,GAAG,UAAU,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,GAAG,WAAW,GAAG,QAAQ,GAAG,gBAAgB,GAAG,cAAc,CAAA;AAEnK,qBAAa,oBAAqB,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,wBAAwB;gBAA9B,IAAI,EAAE,wBAAwB,EAAE,OAAO,GAAE,MAAa;CAC5E;AACD,MAAM,WAAW,4BAA4B;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAmDhF,KAAK,mBAAmB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,CAAA;AAuD3H,iGAAiG;AACjG,qBAAa,eAAe;;gBAGd,IAAI,EAAE,MAAM,EAAE,EAAE,GAAc,EAAE,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAO;IAkCzE,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,SAAS,CAAC,EAAE,4BAA4B,GAAG,IAAI;IAcpF,OAAO,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,iBAAiB,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,4BAA4B,CAAC;QAAC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;QAAC,aAAa,CAAC,EAAE,sBAAsB,CAAC;QAAC,eAAe,CAAC,EAAE,wBAAwB,CAAC;QAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,gBAAgB,CAAA;KAAE,GAAG;QAAE,GAAG,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAiDva,kFAAkF;IAClF,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,4BAA4B,GAAG,YAAY;IAiB7G,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,4BAA4B,GAAG,YAAY;IAUrG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,4BAA4B,EAAE,eAAe,CAAC,EAAE,eAAe,GAAG,YAAY;IAyBjK,+FAA+F;IAC/F,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,4BAA4B,GAAG,YAAY;IAqBvN,qBAAqB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAKxG,2FAA2F;IAC3F,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE;QACrE,QAAQ,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,aAAa,CAAC;QAAC,cAAc,CAAC,EAAE,cAAc,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,uBAAuB,CAAA;KACxI,EAAE,SAAS,EAAE,4BAA4B,GAAG,YAAY;IAmCzD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAM/D,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,4BAA4B;IAY7E,eAAe,CAAC,SAAS,EAAE,4BAA4B,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhF,iBAAiB,CAAC,SAAS,EAAE,4BAA4B,GAAG,IAAI;IAIhE,aAAa,CAAC,SAAS,EAAE,4BAA4B,GAAG,OAAO;IAC/D,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAC5C,WAAW,CAAC,OAAO,SAAK,GAAG,YAAY,EAAE;IACzC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,SAAK,EAAE,KAAK,SAAK,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAMrG,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,4BAA4B,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAqBvJ,YAAY,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE;IAOpH,eAAe,CAAC,SAAS,EAAE,4BAA4B,GAAG;QAAE,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC;QAAC,WAAW,EAAE,aAAa,GAAG,YAAY,CAAA;KAAE;IAmBxI,4FAA4F;IAC5F,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IASvG,gFAAgF;IAChF,YAAY,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAQhE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAC9B,KAAK,IAAI,IAAI;CACd"}
|
package/lib/ledger.js
CHANGED
|
@@ -14,7 +14,7 @@ export class IsolationLedgerError extends Error {
|
|
|
14
14
|
this.name = 'IsolationLedgerError';
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
const schemaVersion =
|
|
17
|
+
const schemaVersion = 7;
|
|
18
18
|
const outputMaximum = 1_048_576;
|
|
19
19
|
const artifactMaximum = 128;
|
|
20
20
|
const textMaximum = 16_384;
|
|
@@ -112,8 +112,20 @@ function open(path) {
|
|
|
112
112
|
database.exec(`BEGIN IMMEDIATE; ALTER TABLE isolation_jobs ADD COLUMN reserved_storage_bytes INTEGER NOT NULL DEFAULT 0; UPDATE schema_meta SET value='5' WHERE key='schema-version'; PRAGMA user_version=5; COMMIT;`);
|
|
113
113
|
if ([1, 2, 3, 4, 5].includes(version))
|
|
114
114
|
database.exec(`BEGIN IMMEDIATE; ALTER TABLE isolation_jobs ADD COLUMN artifact_binding_json TEXT; UPDATE schema_meta SET value='6' WHERE key='schema-version'; PRAGMA user_version=6; COMMIT;`);
|
|
115
|
+
if ([0, 1, 2, 3, 4, 5, 6].includes(version))
|
|
116
|
+
database.exec(`BEGIN IMMEDIATE;
|
|
117
|
+
CREATE TABLE isolation_jobs_v7 (id TEXT PRIMARY KEY, grant_id TEXT NOT NULL, grant_revision INTEGER NOT NULL, principal_digest TEXT NOT NULL, principal_record_id TEXT NOT NULL, principal_version INTEGER NOT NULL, workspace TEXT NOT NULL, agent_preset TEXT NOT NULL, session_id TEXT NOT NULL, idempotency_key TEXT NOT NULL, request_digest TEXT NOT NULL, container_name TEXT UNIQUE, backend_kind TEXT NOT NULL CHECK(backend_kind IN ('docker','macos-seatbelt')), native_resource_id TEXT UNIQUE, native_nonce TEXT, deadline INTEGER NOT NULL, reserved_duration_ms INTEGER NOT NULL, reserved_memory_mib INTEGER NOT NULL DEFAULT 0, reserved_workspace_inodes INTEGER NOT NULL DEFAULT 0, reserved_storage_bytes INTEGER NOT NULL DEFAULT 0, status TEXT NOT NULL CHECK(status IN ('prepared','running','succeeded','failed','cancelled','timed-out','unknown')), version INTEGER NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, result_json TEXT, dispatch_attempted INTEGER NOT NULL DEFAULT 0 CHECK(dispatch_attempted IN (0,1)), creation_witness_json TEXT, artifact_binding_json TEXT, CHECK((backend_kind='docker' AND container_name IS NOT NULL AND native_resource_id IS NULL AND native_nonce IS NULL) OR (backend_kind='macos-seatbelt' AND container_name IS NULL AND native_resource_id IS NOT NULL AND native_nonce IS NOT NULL AND reserved_memory_mib=0 AND reserved_workspace_inodes=0)), UNIQUE(principal_digest, principal_record_id, principal_version, workspace, agent_preset, session_id, grant_id, idempotency_key)) STRICT;
|
|
118
|
+
INSERT INTO isolation_jobs_v7 (id,grant_id,grant_revision,principal_digest,principal_record_id,principal_version,workspace,agent_preset,session_id,idempotency_key,request_digest,container_name,backend_kind,deadline,reserved_duration_ms,reserved_memory_mib,reserved_workspace_inodes,reserved_storage_bytes,status,version,created_at,updated_at,result_json,dispatch_attempted,creation_witness_json,artifact_binding_json)
|
|
119
|
+
SELECT id,grant_id,grant_revision,principal_digest,principal_record_id,principal_version,workspace,agent_preset,session_id,idempotency_key,request_digest,container_name,'docker',deadline,reserved_duration_ms,reserved_memory_mib,reserved_workspace_inodes,reserved_storage_bytes,status,version,created_at,updated_at,result_json,dispatch_attempted,creation_witness_json,artifact_binding_json FROM isolation_jobs;
|
|
120
|
+
DROP TABLE isolation_jobs; ALTER TABLE isolation_jobs_v7 RENAME TO isolation_jobs;
|
|
121
|
+
CREATE INDEX isolation_jobs_grant ON isolation_jobs(grant_id);
|
|
122
|
+
CREATE INDEX isolation_jobs_recoverable ON isolation_jobs(status, updated_at);
|
|
123
|
+
UPDATE schema_meta SET value='7' WHERE key='schema-version'; PRAGMA user_version=7; COMMIT;`);
|
|
115
124
|
database.exec("CREATE INDEX IF NOT EXISTS isolation_artifact_contract ON isolation_jobs(json_extract(artifact_binding_json, '$.admission.contractId')) WHERE artifact_binding_json IS NOT NULL");
|
|
116
|
-
if (
|
|
125
|
+
if (![0, 1, 2, 3, 4, 5, 6, schemaVersion].includes(version))
|
|
126
|
+
fail('schema');
|
|
127
|
+
const marker = database.prepare("SELECT value FROM schema_meta WHERE key='schema-version'").get();
|
|
128
|
+
if (marker?.value !== '7' || database.prepare('PRAGMA user_version').get().user_version !== 7)
|
|
117
129
|
fail('schema');
|
|
118
130
|
if (path !== ':memory:')
|
|
119
131
|
chmodSync(path, 0o600);
|
|
@@ -163,7 +175,10 @@ export class IsolationLedger {
|
|
|
163
175
|
}
|
|
164
176
|
#decodeJob(row) {
|
|
165
177
|
const jobIdentity = identity({ principalDigest: row.principal_digest, principalRecordId: row.principal_record_id, principalVersion: row.principal_version, workspace: row.workspace, agentPreset: row.agent_preset });
|
|
166
|
-
if (!text(row.id) || !text(row.grant_id) || !safePositive(row.grant_revision) || !text(row.session_id) || !text(row.idempotency_key) || !text(row.request_digest) || !
|
|
178
|
+
if (!text(row.id) || !text(row.grant_id) || !safePositive(row.grant_revision) || !text(row.session_id) || !text(row.idempotency_key) || !text(row.request_digest) || !positiveTime(row.deadline) || !safePositive(row.reserved_duration_ms) || !safeTime(row.reserved_memory_mib) || !safeTime(row.reserved_workspace_inodes) || !safeTime(row.reserved_storage_bytes) || !safePositive(row.version) || !safeTime(row.created_at) || !safeTime(row.updated_at) || row.updated_at < row.created_at || !['prepared', 'running', 'succeeded', 'failed', 'cancelled', 'timed-out', 'unknown'].includes(row.status))
|
|
179
|
+
fail('schema');
|
|
180
|
+
if (!((row.backend_kind === 'docker' && text(row.container_name) && row.native_resource_id === null && row.native_nonce === null)
|
|
181
|
+
|| (row.backend_kind === 'macos-seatbelt' && row.container_name === null && text(row.native_resource_id) && text(row.native_nonce) && row.reserved_memory_mib === 0 && row.reserved_workspace_inodes === 0)))
|
|
167
182
|
fail('schema');
|
|
168
183
|
if (![0, 1].includes(row.dispatch_attempted))
|
|
169
184
|
fail('schema');
|
|
@@ -201,7 +216,7 @@ export class IsolationLedger {
|
|
|
201
216
|
}
|
|
202
217
|
else if (row.status !== 'prepared' && row.status !== 'running')
|
|
203
218
|
fail('schema');
|
|
204
|
-
return frozen({ ...(binding ? { artifactBinding: binding } : {}), id: row.id, grantId: row.grant_id, grantRevision: row.grant_revision, identity: jobIdentity, sessionId: row.session_id, idempotencyKey: row.idempotency_key, requestDigest: row.request_digest, containerName: row.container_name, deadline: row.deadline, reservedDurationMs: row.reserved_duration_ms, reservedMemoryMiB: row.reserved_memory_mib, reservedWorkspaceInodes: row.reserved_workspace_inodes, reservedStorageBytes: row.reserved_storage_bytes, dispatchAttempted: row.dispatch_attempted === 1, ...(witness ? { creationWitness: witness } : {}), status: row.status, version: row.version, createdAt: row.created_at, updatedAt: row.updated_at, ...(parsed ? { result: parsed } : {}) });
|
|
219
|
+
return frozen({ ...(binding ? { artifactBinding: binding } : {}), id: row.id, grantId: row.grant_id, grantRevision: row.grant_revision, identity: jobIdentity, sessionId: row.session_id, idempotencyKey: row.idempotency_key, requestDigest: row.request_digest, containerName: row.container_name ?? '', backend: row.backend_kind, ...(row.native_resource_id ? { nativeResourceId: row.native_resource_id } : {}), ...(row.native_nonce ? { nativeNonce: row.native_nonce } : {}), deadline: row.deadline, reservedDurationMs: row.reserved_duration_ms, reservedMemoryMiB: row.reserved_memory_mib, reservedWorkspaceInodes: row.reserved_workspace_inodes, reservedStorageBytes: row.reserved_storage_bytes, dispatchAttempted: row.dispatch_attempted === 1, ...(witness ? { creationWitness: witness } : {}), status: row.status, version: row.version, createdAt: row.created_at, updatedAt: row.updated_at, ...(parsed ? { result: parsed } : {}) });
|
|
205
220
|
}
|
|
206
221
|
syncGrants(grants, authority) {
|
|
207
222
|
if (!Array.isArray(grants))
|
|
@@ -239,7 +254,7 @@ export class IsolationLedger {
|
|
|
239
254
|
});
|
|
240
255
|
}
|
|
241
256
|
prepare(input) {
|
|
242
|
-
if (!input || typeof input !== 'object' || ![6, 7, 8, 9, 10, 11].includes(Object.keys(input).length) || !onlyKeys(input, ['identity', 'sessionId', 'grantId', 'idempotencyKey', 'requestDigest', 'durationMs', 'maxActiveJobs', 'authority', 'resourceReservation', 'storageBudget', 'artifactBinding']) || !text(input.sessionId) || !text(input.grantId) || !text(input.idempotencyKey) || !text(input.requestDigest) || !safePositive(input.durationMs) || (input.maxActiveJobs !== undefined && !safePositive(input.maxActiveJobs)))
|
|
257
|
+
if (!input || typeof input !== 'object' || ![6, 7, 8, 9, 10, 11, 12].includes(Object.keys(input).length) || !onlyKeys(input, ['identity', 'sessionId', 'grantId', 'idempotencyKey', 'requestDigest', 'durationMs', 'maxActiveJobs', 'authority', 'resourceReservation', 'storageBudget', 'artifactBinding', 'backend']) || !text(input.sessionId) || !text(input.grantId) || !text(input.idempotencyKey) || !text(input.requestDigest) || !safePositive(input.durationMs) || (input.maxActiveJobs !== undefined && !safePositive(input.maxActiveJobs)) || (input.backend !== undefined && input.backend !== 'docker' && input.backend !== 'macos-seatbelt') || (input.backend === 'macos-seatbelt' && input.resourceReservation !== undefined))
|
|
243
258
|
fail('invalid-input');
|
|
244
259
|
const binding = input.artifactBinding === undefined ? undefined : artifactBinding(input.artifactBinding);
|
|
245
260
|
const reservation = input.resourceReservation === undefined ? undefined : input.resourceReservation;
|
|
@@ -256,8 +271,8 @@ export class IsolationLedger {
|
|
|
256
271
|
const existing = this.#database.prepare('SELECT * FROM isolation_jobs WHERE principal_digest=? AND principal_record_id=? AND principal_version=? AND workspace=? AND agent_preset=? AND session_id=? AND grant_id=? AND idempotency_key=?').get(who.principalDigest, who.principalRecordId, who.principalVersion, who.workspace, who.agentPreset, input.sessionId, input.grantId, input.idempotencyKey);
|
|
257
272
|
if (existing) {
|
|
258
273
|
const job = this.#decodeJob(existing);
|
|
259
|
-
if (job.requestDigest !== input.requestDigest)
|
|
260
|
-
fail('conflict', 'idempotency key has a different request
|
|
274
|
+
if (job.requestDigest !== input.requestDigest || job.backend !== (input.backend ?? 'docker'))
|
|
275
|
+
fail('conflict', 'idempotency key has a different request or backend');
|
|
261
276
|
return { job, created: false };
|
|
262
277
|
}
|
|
263
278
|
const current = this.#grant(input.grantId);
|
|
@@ -304,7 +319,8 @@ export class IsolationLedger {
|
|
|
304
319
|
}
|
|
305
320
|
const id = randomUUID();
|
|
306
321
|
const deadline = Math.min(now + input.durationMs, current.expires_at);
|
|
307
|
-
|
|
322
|
+
const native = input.backend === 'macos-seatbelt';
|
|
323
|
+
this.#database.prepare("INSERT INTO isolation_jobs(id,grant_id,grant_revision,principal_digest,principal_record_id,principal_version,workspace,agent_preset,session_id,idempotency_key,request_digest,container_name,backend_kind,native_resource_id,native_nonce,deadline,reserved_duration_ms,reserved_memory_mib,reserved_workspace_inodes,reserved_storage_bytes,dispatch_attempted,status,version,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0, 'prepared',1,?,?)").run(id, input.grantId, current.revision, who.principalDigest, who.principalRecordId, who.principalVersion, who.workspace, who.agentPreset, input.sessionId, input.idempotencyKey, input.requestDigest, native ? null : `dsh-isolation-${id}`, native ? 'macos-seatbelt' : 'docker', native ? `native-${id}` : null, native ? randomUUID() : null, deadline, input.durationMs, reservation?.memoryMiB ?? 0, reservation?.workspaceInodes ?? 0, storage?.reservedBytes ?? 0, now, now);
|
|
308
324
|
if (binding)
|
|
309
325
|
this.#database.prepare('UPDATE isolation_jobs SET artifact_binding_json=? WHERE id=?').run(JSON.stringify(binding), id);
|
|
310
326
|
this.#audit(now, 'job-prepared', id, input.grantId, `revision:${current.revision}${reservation ? `;reservation:memoryMiB:${reservation.memoryMiB},workspaceInodes:${reservation.workspaceInodes}` : ''}${storage ? `;storageBytes:${storage.reservedBytes}` : ''}`);
|
|
@@ -389,6 +405,8 @@ export class IsolationLedger {
|
|
|
389
405
|
fail('conflict', 'job version differs');
|
|
390
406
|
if (witness && !job.dispatchAttempted)
|
|
391
407
|
fail('invalid-state');
|
|
408
|
+
if (job.backend === 'macos-seatbelt' && job.dispatchAttempted && value.status !== 'unknown')
|
|
409
|
+
fail('invalid-state', 'native dispatch requires a durable receipt');
|
|
392
410
|
if (job.dispatchAttempted && value.status === 'unknown' && value.quiescent)
|
|
393
411
|
fail('invalid-state', 'dispatch requires independent quiescence evidence');
|
|
394
412
|
if (job.status !== 'prepared' && job.status !== 'running') {
|
|
@@ -411,6 +429,43 @@ export class IsolationLedger {
|
|
|
411
429
|
return this.#job(jobId);
|
|
412
430
|
});
|
|
413
431
|
}
|
|
432
|
+
/** A Host-verified durable supervisor receipt is the only native dispatch settlement proof. */
|
|
433
|
+
settleNativeReceipt(jobId, expectedVersion, binding, input, authority) {
|
|
434
|
+
const value = result(input);
|
|
435
|
+
if (!text(jobId) || !safePositive(expectedVersion) || value.jobId !== jobId || value.status === 'unknown' || !value.quiescent
|
|
436
|
+
|| !binding || !text(binding.requestDigest) || !text(binding.nonce) || !text(binding.nativeResourceId))
|
|
437
|
+
fail('invalid-input');
|
|
438
|
+
const controller = this.#authority(authority);
|
|
439
|
+
if (!controller)
|
|
440
|
+
fail('invalid-input');
|
|
441
|
+
return this.#transaction(() => {
|
|
442
|
+
const now = this.#nowValue();
|
|
443
|
+
this.#requireController(controller, now);
|
|
444
|
+
const job = this.#job(jobId);
|
|
445
|
+
if (!job)
|
|
446
|
+
fail('not-found');
|
|
447
|
+
if (job.version !== expectedVersion)
|
|
448
|
+
fail('conflict');
|
|
449
|
+
if (job.backend !== 'macos-seatbelt' || !job.dispatchAttempted || job.requestDigest !== binding.requestDigest
|
|
450
|
+
|| job.nativeNonce !== binding.nonce || job.nativeResourceId !== binding.nativeResourceId)
|
|
451
|
+
fail('invalid-state');
|
|
452
|
+
if (job.result?.quiescent && equal(job.result, value))
|
|
453
|
+
return job;
|
|
454
|
+
if (!['prepared', 'running', 'unknown'].includes(job.status))
|
|
455
|
+
fail('invalid-state');
|
|
456
|
+
const changed = this.#database.prepare("UPDATE isolation_jobs SET status=?, result_json=?, version=version+1, updated_at=? WHERE id=? AND version=? AND status IN ('prepared','running','unknown')").run(value.status, JSON.stringify(value), now, jobId, expectedVersion);
|
|
457
|
+
if (changed.changes !== 1)
|
|
458
|
+
fail('conflict');
|
|
459
|
+
this.#audit(now, 'native-receipt-settled', jobId, job.grantId, value.status);
|
|
460
|
+
return this.#job(jobId);
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
findNativeVerifierJob(principalDigest, stateRoot, key) {
|
|
464
|
+
if (!text(principalDigest) || !text(stateRoot) || !text(key))
|
|
465
|
+
fail('invalid-input');
|
|
466
|
+
const row = this.#database.prepare("SELECT * FROM isolation_jobs WHERE backend_kind='macos-seatbelt' AND principal_digest=? AND workspace=? AND idempotency_key=? AND grant_id='verification' AND agent_preset='verification'").get(principalDigest, stateRoot, key);
|
|
467
|
+
return row ? this.#decodeJob(row) : undefined;
|
|
468
|
+
}
|
|
414
469
|
/** Host-only release after exact cleanup; outcome and origin evidence remain immutable. */
|
|
415
470
|
settleReconciledUnknown(jobId, expectedVersion, proof, authority) {
|
|
416
471
|
if (!text(jobId) || !safePositive(expectedVersion) || !proof || !safeTime(proof.checkedAt))
|
|
@@ -438,7 +493,7 @@ export class IsolationLedger {
|
|
|
438
493
|
fail('not-found');
|
|
439
494
|
if (job.version !== expectedVersion || !equal(job.creationWitness, original))
|
|
440
495
|
fail('conflict');
|
|
441
|
-
if (!job.dispatchAttempted || job.status !== 'unknown' || !job.result || job.result.quiescent
|
|
496
|
+
if (job.backend !== 'docker' || !job.dispatchAttempted || job.status !== 'unknown' || !job.result || job.result.quiescent
|
|
442
497
|
|| original.requestsSettled !== true || !processExited(original.supervisor))
|
|
443
498
|
fail('invalid-state');
|
|
444
499
|
if (original.daemon.engineId !== current.engineId || original.daemon.dockerPath !== current.dockerPath
|