nawabari 0.9.2 → 0.10.2
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 +142 -803
- package/dist/cli-command-registry.js +46 -6
- package/dist/cli-command-registry.js.map +1 -1
- package/dist/cli.d.ts +5 -3
- package/dist/cli.js +157 -34
- package/dist/cli.js.map +1 -1
- package/dist/contract.js +11 -3
- package/dist/contract.js.map +1 -1
- package/dist/domain/compatibility-runtime-projection.d.ts +24 -0
- package/dist/domain/compatibility-runtime-projection.js +197 -0
- package/dist/domain/compatibility-runtime-projection.js.map +1 -0
- package/dist/domain/doctor.d.ts +2 -2
- package/dist/domain/doctor.js +72 -51
- package/dist/domain/doctor.js.map +1 -1
- package/dist/domain/errors.d.ts +1 -1
- package/dist/domain/errors.js +5 -1
- package/dist/domain/errors.js.map +1 -1
- package/dist/domain/fhs-development-runtime.d.ts +90 -0
- package/dist/domain/fhs-development-runtime.js +385 -0
- package/dist/domain/fhs-development-runtime.js.map +1 -0
- package/dist/domain/fhs-runtime.d.ts +36 -0
- package/dist/domain/fhs-runtime.js +776 -0
- package/dist/domain/fhs-runtime.js.map +1 -0
- package/dist/domain/landlock.d.ts +11 -4
- package/dist/domain/landlock.js +44 -21
- package/dist/domain/landlock.js.map +1 -1
- package/dist/domain/nix-runtime-closure.d.ts +70 -0
- package/dist/domain/nix-runtime-closure.js +449 -0
- package/dist/domain/nix-runtime-closure.js.map +1 -0
- package/dist/domain/pnpm-middleware-backend-materialization.d.ts +117 -0
- package/dist/domain/pnpm-middleware-backend-materialization.js +311 -0
- package/dist/domain/pnpm-middleware-backend-materialization.js.map +1 -0
- package/dist/domain/runtime-executable-projection.d.ts +33 -0
- package/dist/domain/runtime-executable-projection.js +204 -0
- package/dist/domain/runtime-executable-projection.js.map +1 -0
- package/dist/domain/runtime-file-identity.d.ts +37 -0
- package/dist/domain/runtime-file-identity.js +114 -0
- package/dist/domain/runtime-file-identity.js.map +1 -0
- package/dist/domain/runtime-profile.d.ts +66 -0
- package/dist/domain/runtime-profile.js +356 -0
- package/dist/domain/runtime-profile.js.map +1 -0
- package/dist/domain/runtime-projection.d.ts +101 -0
- package/dist/domain/runtime-projection.js +316 -0
- package/dist/domain/runtime-projection.js.map +1 -0
- package/dist/domain/runtime-provider-pnpm-middleware.d.ts +41 -0
- package/dist/domain/runtime-provider-pnpm-middleware.js +316 -0
- package/dist/domain/runtime-provider-pnpm-middleware.js.map +1 -0
- package/dist/domain/runtime-provider-tgrep.d.ts +60 -0
- package/dist/domain/runtime-provider-tgrep.js +537 -0
- package/dist/domain/runtime-provider-tgrep.js.map +1 -0
- package/dist/domain/runtime-resolution.d.ts +57 -0
- package/dist/domain/runtime-resolution.js +242 -0
- package/dist/domain/runtime-resolution.js.map +1 -0
- package/dist/domain/sandbox-launcher.d.ts +7 -0
- package/dist/domain/sandbox-launcher.js +380 -56
- package/dist/domain/sandbox-launcher.js.map +1 -1
- package/dist/domain/sandbox.d.ts +59 -4
- package/dist/domain/sandbox.js +100 -5
- package/dist/domain/sandbox.js.map +1 -1
- package/dist/domain/session-backend.js +20 -1
- package/dist/domain/session-backend.js.map +1 -1
- package/dist/domain/session.d.ts +3 -2
- package/dist/domain/session.js.map +1 -1
- package/dist/domain/tgrep-runtime-materialization.d.ts +61 -0
- package/dist/domain/tgrep-runtime-materialization.js +172 -0
- package/dist/domain/tgrep-runtime-materialization.js.map +1 -0
- package/dist/operation-authorization.d.ts +10 -0
- package/dist/operation-authorization.js +12 -1
- package/dist/operation-authorization.js.map +1 -1
- package/dist/presentation.js +6 -3
- package/dist/presentation.js.map +1 -1
- package/dist/session-registry.d.ts +11 -3
- package/dist/session-registry.js +61 -45
- package/dist/session-registry.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { DomainError, failure, success } from "./errors.js";
|
|
5
|
+
import { RUNTIME_PROFILE_CONTRACT_ID, RUNTIME_PROFILE_SCHEMA_VERSION, } from "./runtime-profile.js";
|
|
6
|
+
import { DEFAULT_RUNTIME_POLICY, projectSessionRuntimeProjection, runtimeMaterializationMissingError, validateRuntimePolicy, } from "./runtime-projection.js";
|
|
7
|
+
/** Versioned evidence for a bounded Nix closure materialization. */
|
|
8
|
+
export const NIX_RUNTIME_CLOSURE_CONTRACT_ID = "nawabari.nix-runtime-closure.v1";
|
|
9
|
+
export const NIX_RUNTIME_CLOSURE_SCHEMA_VERSION = 1;
|
|
10
|
+
const DEFAULT_NIXPKGS_REF = "nixpkgs";
|
|
11
|
+
const DEFAULT_MAX_REQUIREMENTS = 128;
|
|
12
|
+
const DEFAULT_MAX_PATHS = 4_096;
|
|
13
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 8 * 1_024 * 1_024;
|
|
14
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
15
|
+
/** Nix attributes for the canonical logical requirements in #290. */
|
|
16
|
+
export const DEFAULT_NIX_PACKAGE_ATTRIBUTES = Object.freeze({
|
|
17
|
+
node: "nodejs",
|
|
18
|
+
git: "git",
|
|
19
|
+
pnpm: "pnpm",
|
|
20
|
+
});
|
|
21
|
+
const nativeFileSystem = {
|
|
22
|
+
lstatSync: (candidate) => fs.lstatSync(candidate),
|
|
23
|
+
realpathSync: (candidate) => fs.realpathSync.native(candidate),
|
|
24
|
+
};
|
|
25
|
+
function isRecord(value) {
|
|
26
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
function isNonEmptyText(value) {
|
|
29
|
+
return typeof value === "string" && value.length > 0 && !value.includes("\0");
|
|
30
|
+
}
|
|
31
|
+
function isStableIdentifier(value) {
|
|
32
|
+
return typeof value === "string" && /^[a-z0-9][a-z0-9._-]*$/u.test(value);
|
|
33
|
+
}
|
|
34
|
+
function compareText(left, right) {
|
|
35
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
36
|
+
}
|
|
37
|
+
function byteLength(value) {
|
|
38
|
+
return Buffer.byteLength(value, "utf8");
|
|
39
|
+
}
|
|
40
|
+
function materializationFailure(requirement, reason, details = {}) {
|
|
41
|
+
const fallback = requirement ?? { id: "runtime-profile", kind: "runtime" };
|
|
42
|
+
const canonical = runtimeMaterializationMissingError(fallback.id, fallback.kind);
|
|
43
|
+
return failure(new DomainError(canonical.code, canonical.message, { ...(canonical.details ?? {}), reason, ...details }, canonical.exitCode));
|
|
44
|
+
}
|
|
45
|
+
function validateLimit(value, fallback) {
|
|
46
|
+
if (value === undefined)
|
|
47
|
+
return fallback;
|
|
48
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 1 ? value : null;
|
|
49
|
+
}
|
|
50
|
+
function validateStoreRoot(value) {
|
|
51
|
+
if (!isNonEmptyText(value) || !path.posix.isAbsolute(value))
|
|
52
|
+
return null;
|
|
53
|
+
const normalized = path.posix.normalize(value);
|
|
54
|
+
if (normalized !== value || normalized === "/" || normalized.endsWith("/"))
|
|
55
|
+
return null;
|
|
56
|
+
return normalized;
|
|
57
|
+
}
|
|
58
|
+
function validateProfile(profile, maxRequirements) {
|
|
59
|
+
if (!isRecord(profile) || !isRecord(profile.profile) || !Array.isArray(profile.requirements)) {
|
|
60
|
+
return materializationFailure(null, "the resolved runtime profile is missing its logical material");
|
|
61
|
+
}
|
|
62
|
+
if ("contract_id" in profile && profile.contract_id !== RUNTIME_PROFILE_CONTRACT_ID) {
|
|
63
|
+
return materializationFailure(null, "the runtime profile contract identity is unsupported");
|
|
64
|
+
}
|
|
65
|
+
if ("schema_version" in profile && profile.schema_version !== RUNTIME_PROFILE_SCHEMA_VERSION) {
|
|
66
|
+
return materializationFailure(null, "the runtime profile schema version is unsupported");
|
|
67
|
+
}
|
|
68
|
+
const identity = profile.profile;
|
|
69
|
+
if (!isStableIdentifier(identity.id) || !isNonEmptyText(identity.version)) {
|
|
70
|
+
return materializationFailure(null, "the resolved runtime profile identity is invalid");
|
|
71
|
+
}
|
|
72
|
+
if (profile.requirements.length > maxRequirements) {
|
|
73
|
+
return materializationFailure(null, "the declared requirement set exceeds the bounded resolver limit", {
|
|
74
|
+
max_requirements: maxRequirements,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const requirements = [];
|
|
78
|
+
const ids = new Set();
|
|
79
|
+
for (const value of profile.requirements) {
|
|
80
|
+
if (!isRecord(value) ||
|
|
81
|
+
!isStableIdentifier(value.id) ||
|
|
82
|
+
(value.kind !== "runtime" && value.kind !== "package") ||
|
|
83
|
+
!isNonEmptyText(value.name) ||
|
|
84
|
+
!isNonEmptyText(value.version) ||
|
|
85
|
+
value.name.startsWith("/") ||
|
|
86
|
+
value.name.startsWith("~") ||
|
|
87
|
+
value.name.startsWith("$")) {
|
|
88
|
+
return materializationFailure(null, "a declared runtime requirement is invalid");
|
|
89
|
+
}
|
|
90
|
+
if (ids.has(value.id)) {
|
|
91
|
+
return materializationFailure({ id: value.id, kind: value.kind, name: value.name, version: value.version }, "a declared runtime requirement is duplicated");
|
|
92
|
+
}
|
|
93
|
+
ids.add(value.id);
|
|
94
|
+
requirements.push(Object.freeze({
|
|
95
|
+
id: value.id,
|
|
96
|
+
kind: value.kind,
|
|
97
|
+
name: value.name,
|
|
98
|
+
version: value.version,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
requirements.sort((left, right) => compareText(`${left.kind}:${left.id}`, `${right.kind}:${right.id}`));
|
|
102
|
+
return success({
|
|
103
|
+
profile: Object.freeze({ id: identity.id, version: identity.version }),
|
|
104
|
+
requirements: Object.freeze(requirements),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function validateOptions(options, requirement) {
|
|
108
|
+
const policy = validateRuntimePolicy(options.policy ?? DEFAULT_RUNTIME_POLICY);
|
|
109
|
+
if (!policy.ok)
|
|
110
|
+
return materializationFailure(requirement, "the runtime policy is invalid");
|
|
111
|
+
const nixExecutable = options.nix_executable ?? "nix";
|
|
112
|
+
if (!isNonEmptyText(nixExecutable))
|
|
113
|
+
return materializationFailure(requirement, "the Nix executable is invalid");
|
|
114
|
+
if (options.nixpkgs_ref !== undefined && options.nixpkgs !== undefined && options.nixpkgs_ref !== options.nixpkgs) {
|
|
115
|
+
return materializationFailure(requirement, "the Nixpkgs references are ambiguous");
|
|
116
|
+
}
|
|
117
|
+
const ref = options.nixpkgs_ref ?? options.nixpkgs ?? DEFAULT_NIXPKGS_REF;
|
|
118
|
+
if (!isNonEmptyText(ref) || ref.includes("#") || /\s/u.test(ref)) {
|
|
119
|
+
return materializationFailure(requirement, "the Nixpkgs reference is invalid", { nixpkgs: ref });
|
|
120
|
+
}
|
|
121
|
+
const storeRoot = validateStoreRoot(options.store_root ?? "/nix/store");
|
|
122
|
+
if (storeRoot === null)
|
|
123
|
+
return materializationFailure(requirement, "the Nix store root is invalid");
|
|
124
|
+
const maxRequirements = validateLimit(options.max_requirements, DEFAULT_MAX_REQUIREMENTS);
|
|
125
|
+
const maxPaths = validateLimit(options.max_paths, DEFAULT_MAX_PATHS);
|
|
126
|
+
const maxOutputBytes = validateLimit(options.max_output_bytes, DEFAULT_MAX_OUTPUT_BYTES);
|
|
127
|
+
const timeoutMs = validateLimit(options.timeout_ms, DEFAULT_TIMEOUT_MS);
|
|
128
|
+
if (maxRequirements === null || maxPaths === null || maxOutputBytes === null || timeoutMs === null) {
|
|
129
|
+
return materializationFailure(requirement, "a resolver bound is invalid");
|
|
130
|
+
}
|
|
131
|
+
const attributes = options.package_attributes ?? DEFAULT_NIX_PACKAGE_ATTRIBUTES;
|
|
132
|
+
if (!isRecord(attributes))
|
|
133
|
+
return materializationFailure(requirement, "the Nix attribute map is invalid");
|
|
134
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
135
|
+
if (!isNonEmptyText(key) || !isNonEmptyText(value)) {
|
|
136
|
+
return materializationFailure(requirement, "the Nix attribute map contains an invalid entry");
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return success({
|
|
140
|
+
policy: policy.value,
|
|
141
|
+
nix_executable: nixExecutable,
|
|
142
|
+
nixpkgs: ref,
|
|
143
|
+
package_attributes: attributes,
|
|
144
|
+
command_runner: options.command_runner ?? createDefaultNixCommandRunner(maxOutputBytes, timeoutMs),
|
|
145
|
+
store_root: storeRoot,
|
|
146
|
+
filesystem: options.filesystem ?? nativeFileSystem,
|
|
147
|
+
max_requirements: maxRequirements,
|
|
148
|
+
max_paths: maxPaths,
|
|
149
|
+
max_output_bytes: maxOutputBytes,
|
|
150
|
+
timeout_ms: timeoutMs,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function commandResultText(value) {
|
|
154
|
+
return typeof value === "string" ? value : value instanceof Uint8Array ? Buffer.from(value).toString("utf8") : "";
|
|
155
|
+
}
|
|
156
|
+
function createDefaultNixCommandRunner(maxOutputBytes, timeoutMs) {
|
|
157
|
+
return (executable, args) => {
|
|
158
|
+
try {
|
|
159
|
+
const stdout = execFileSync(executable, [...args], {
|
|
160
|
+
cwd: process.cwd(),
|
|
161
|
+
encoding: "utf8",
|
|
162
|
+
timeout: timeoutMs,
|
|
163
|
+
maxBuffer: maxOutputBytes,
|
|
164
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
165
|
+
});
|
|
166
|
+
return { exit_code: 0, stdout, stderr: "" };
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
const candidate = isRecord(error) ? error : {};
|
|
170
|
+
const status = typeof candidate.status === "number" ? candidate.status : 1;
|
|
171
|
+
return {
|
|
172
|
+
exit_code: status,
|
|
173
|
+
stdout: commandResultText(candidate.stdout),
|
|
174
|
+
stderr: commandResultText(candidate.stderr),
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const NIX_ATTRIBUTE_PATTERN = /^[A-Za-z0-9_][A-Za-z0-9_+-]*(?:\.[A-Za-z0-9_][A-Za-z0-9_+-]*)*$/u;
|
|
180
|
+
function nixAttributeForRequirement(requirement, attributes) {
|
|
181
|
+
const attribute = attributes[requirement.id] ?? attributes[requirement.name] ?? requirement.name;
|
|
182
|
+
return isNonEmptyText(attribute) && NIX_ATTRIBUTE_PATTERN.test(attribute) ? attribute : null;
|
|
183
|
+
}
|
|
184
|
+
function installableForRequirement(requirement, options) {
|
|
185
|
+
const attribute = nixAttributeForRequirement(requirement, options.package_attributes);
|
|
186
|
+
if (attribute === null) {
|
|
187
|
+
return materializationFailure(requirement, "no safe Nix attribute maps the logical requirement");
|
|
188
|
+
}
|
|
189
|
+
const installable = `${options.nixpkgs}#${attribute}`;
|
|
190
|
+
if (byteLength(installable) > 1_024) {
|
|
191
|
+
return materializationFailure(requirement, "the Nix installable exceeds the bounded length");
|
|
192
|
+
}
|
|
193
|
+
return success(installable);
|
|
194
|
+
}
|
|
195
|
+
function isStorePath(value, storeRoot) {
|
|
196
|
+
if (!value.startsWith(`${storeRoot}/`) || value.includes("\0"))
|
|
197
|
+
return false;
|
|
198
|
+
if (path.posix.normalize(value) !== value || path.posix.dirname(value) !== storeRoot)
|
|
199
|
+
return false;
|
|
200
|
+
const name = path.posix.basename(value);
|
|
201
|
+
return name.length > 0 && name !== "." && name !== "..";
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Nix JSON format 1 uses store paths as the result object's top-level keys.
|
|
205
|
+
* Metadata values also contain store paths (derivers and references), but
|
|
206
|
+
* those are not query results and must not be mistaken for materialized
|
|
207
|
+
* closure members. Accept the equivalent array/key shapes for test doubles
|
|
208
|
+
* and older wrappers while never descending into a result's metadata.
|
|
209
|
+
*/
|
|
210
|
+
function collectJsonStorePaths(value, storeRoot, paths) {
|
|
211
|
+
if (Array.isArray(value)) {
|
|
212
|
+
for (const item of value) {
|
|
213
|
+
if (typeof item === "string" && isStorePath(item, storeRoot)) {
|
|
214
|
+
paths.add(item);
|
|
215
|
+
}
|
|
216
|
+
else if (isRecord(item)) {
|
|
217
|
+
for (const key of Object.keys(item)) {
|
|
218
|
+
if (isStorePath(key, storeRoot))
|
|
219
|
+
paths.add(key);
|
|
220
|
+
}
|
|
221
|
+
if (paths.size === 0 && typeof item.path === "string" && isStorePath(item.path, storeRoot)) {
|
|
222
|
+
paths.add(item.path);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (!isRecord(value))
|
|
229
|
+
return;
|
|
230
|
+
for (const key of Object.keys(value)) {
|
|
231
|
+
if (isStorePath(key, storeRoot))
|
|
232
|
+
paths.add(key);
|
|
233
|
+
}
|
|
234
|
+
if (paths.size === 0 && typeof value.path === "string" && isStorePath(value.path, storeRoot)) {
|
|
235
|
+
paths.add(value.path);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function parsePathInfo(output, storeRoot, requirement, maxPaths, maxOutputBytes) {
|
|
239
|
+
if (byteLength(output) > maxOutputBytes) {
|
|
240
|
+
return materializationFailure(requirement, "Nix path-info output exceeded the bounded size");
|
|
241
|
+
}
|
|
242
|
+
let parsed;
|
|
243
|
+
try {
|
|
244
|
+
parsed = JSON.parse(output);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return materializationFailure(requirement, "Nix path-info did not return valid JSON");
|
|
248
|
+
}
|
|
249
|
+
const paths = new Set();
|
|
250
|
+
collectJsonStorePaths(parsed, storeRoot, paths);
|
|
251
|
+
if (paths.size === 0)
|
|
252
|
+
return materializationFailure(requirement, "Nix path-info returned no store paths");
|
|
253
|
+
if (paths.size > maxPaths) {
|
|
254
|
+
return materializationFailure(requirement, "the Nix closure exceeds the bounded path limit", {
|
|
255
|
+
max_paths: maxPaths,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
return success(Object.freeze([...paths].sort(compareText)));
|
|
259
|
+
}
|
|
260
|
+
function queryPathInfo(requirement, installable, recursive, options) {
|
|
261
|
+
const args = [
|
|
262
|
+
"path-info",
|
|
263
|
+
"--json",
|
|
264
|
+
"--json-format",
|
|
265
|
+
"1",
|
|
266
|
+
"--no-pretty",
|
|
267
|
+
...(recursive ? ["--recursive"] : []),
|
|
268
|
+
"--offline",
|
|
269
|
+
installable,
|
|
270
|
+
];
|
|
271
|
+
let result;
|
|
272
|
+
try {
|
|
273
|
+
result = options.command_runner(options.nix_executable, args);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return materializationFailure(requirement, "the Nix path-info command could not be started");
|
|
277
|
+
}
|
|
278
|
+
if (!isRecord(result) ||
|
|
279
|
+
typeof result.exit_code !== "number" ||
|
|
280
|
+
!Number.isSafeInteger(result.exit_code) ||
|
|
281
|
+
typeof result.stdout !== "string" ||
|
|
282
|
+
typeof result.stderr !== "string") {
|
|
283
|
+
return materializationFailure(requirement, "the Nix command returned an invalid result");
|
|
284
|
+
}
|
|
285
|
+
if (result.exit_code !== 0) {
|
|
286
|
+
return materializationFailure(requirement, "the declared material is unavailable from the local Nix store", {
|
|
287
|
+
installable,
|
|
288
|
+
exit_code: result.exit_code,
|
|
289
|
+
stderr: result.stderr.slice(0, 240),
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
return parsePathInfo(result.stdout, options.store_root, requirement, options.max_paths, options.max_output_bytes);
|
|
293
|
+
}
|
|
294
|
+
function verifyStorePath(candidate, requirement, options) {
|
|
295
|
+
if (!isStorePath(candidate, options.store_root)) {
|
|
296
|
+
return materializationFailure(requirement, "Nix returned a path outside the selected store root", {
|
|
297
|
+
path: candidate,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
let stat;
|
|
301
|
+
try {
|
|
302
|
+
stat = options.filesystem.lstatSync(candidate);
|
|
303
|
+
if (stat.isSymbolicLink() || (!stat.isDirectory() && !stat.isFile())) {
|
|
304
|
+
return materializationFailure(requirement, "a resolved store path is not a regular materialized path", {
|
|
305
|
+
path: candidate,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
if (options.filesystem.realpathSync(candidate) !== candidate) {
|
|
309
|
+
return materializationFailure(requirement, "a resolved store path traverses an unproven symlink", {
|
|
310
|
+
path: candidate,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
return materializationFailure(requirement, "a resolved store path is missing or cannot be canonicalized", {
|
|
316
|
+
path: candidate,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
return success(null);
|
|
320
|
+
}
|
|
321
|
+
function freezeProjection(policy, profile, requirements, filesystem) {
|
|
322
|
+
const projection = projectSessionRuntimeProjection({
|
|
323
|
+
policy,
|
|
324
|
+
profile,
|
|
325
|
+
requirements,
|
|
326
|
+
filesystem,
|
|
327
|
+
executables: [],
|
|
328
|
+
});
|
|
329
|
+
return projection.ok ? projection : failure(projection.error);
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Resolve an already-selected #290 profile using Nix's native path-info
|
|
333
|
+
* closure query, then create only exact store-path projections. This function
|
|
334
|
+
* does not build, substitute, crawl the store, or inspect PATH/home state.
|
|
335
|
+
*/
|
|
336
|
+
export function materializeNixRuntimeClosure(profile, options = {}) {
|
|
337
|
+
if (!isRecord(options))
|
|
338
|
+
return materializationFailure(null, "the Nix materializer options are invalid");
|
|
339
|
+
const initialOptions = validateOptions(options, null);
|
|
340
|
+
if (!initialOptions.ok)
|
|
341
|
+
return initialOptions;
|
|
342
|
+
const profileResult = validateProfile(profile, initialOptions.value.max_requirements);
|
|
343
|
+
if (!profileResult.ok)
|
|
344
|
+
return profileResult;
|
|
345
|
+
const requirementForErrors = profileResult.value.requirements[0] ?? null;
|
|
346
|
+
const optionsResult = validateOptions(options, requirementForErrors);
|
|
347
|
+
if (!optionsResult.ok)
|
|
348
|
+
return optionsResult;
|
|
349
|
+
const resolvedOptions = optionsResult.value;
|
|
350
|
+
const packages = [];
|
|
351
|
+
const storePaths = new Set();
|
|
352
|
+
const pathProvenance = new Map();
|
|
353
|
+
for (const requirement of profileResult.value.requirements) {
|
|
354
|
+
const installable = installableForRequirement(requirement, resolvedOptions);
|
|
355
|
+
if (!installable.ok)
|
|
356
|
+
return installable;
|
|
357
|
+
const roots = queryPathInfo(requirement, installable.value, false, resolvedOptions);
|
|
358
|
+
if (!roots.ok)
|
|
359
|
+
return roots;
|
|
360
|
+
if (roots.value.length !== 1) {
|
|
361
|
+
return materializationFailure(requirement, "the declared installable resolved to an ambiguous output set", {
|
|
362
|
+
installable: installable.value,
|
|
363
|
+
output_count: roots.value.length,
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
const root = roots.value[0];
|
|
367
|
+
const closure = queryPathInfo(requirement, installable.value, true, resolvedOptions);
|
|
368
|
+
if (!closure.ok)
|
|
369
|
+
return closure;
|
|
370
|
+
if (!closure.value.includes(root)) {
|
|
371
|
+
return materializationFailure(requirement, "the Nix closure omitted its declared root", {
|
|
372
|
+
root,
|
|
373
|
+
installable: installable.value,
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
for (const storePath of closure.value) {
|
|
377
|
+
const verified = verifyStorePath(storePath, requirement, resolvedOptions);
|
|
378
|
+
if (!verified.ok)
|
|
379
|
+
return verified;
|
|
380
|
+
storePaths.add(storePath);
|
|
381
|
+
const provenance = requirement.kind === "runtime" ? "runtime-profile" : "package";
|
|
382
|
+
const previous = pathProvenance.get(storePath);
|
|
383
|
+
if (previous === undefined || (provenance === "runtime-profile" && previous === "package")) {
|
|
384
|
+
pathProvenance.set(storePath, provenance);
|
|
385
|
+
}
|
|
386
|
+
if (storePaths.size > resolvedOptions.max_paths) {
|
|
387
|
+
return materializationFailure(requirement, "the combined Nix closure exceeds the bounded path limit", {
|
|
388
|
+
max_paths: resolvedOptions.max_paths,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
packages.push(Object.freeze({
|
|
393
|
+
requirement_id: requirement.id,
|
|
394
|
+
installable: installable.value,
|
|
395
|
+
root,
|
|
396
|
+
closure: Object.freeze([...closure.value].sort(compareText)),
|
|
397
|
+
}));
|
|
398
|
+
}
|
|
399
|
+
const sortedStorePaths = Object.freeze([...storePaths].sort(compareText));
|
|
400
|
+
const filesystem = resolvedOptions.policy.mode === "compatibility"
|
|
401
|
+
? [
|
|
402
|
+
Object.freeze({
|
|
403
|
+
source: resolvedOptions.store_root,
|
|
404
|
+
target: resolvedOptions.store_root,
|
|
405
|
+
access_mode: "read-only",
|
|
406
|
+
provenance: "compatibility",
|
|
407
|
+
}),
|
|
408
|
+
]
|
|
409
|
+
: sortedStorePaths.map((storePath) => Object.freeze({
|
|
410
|
+
source: storePath,
|
|
411
|
+
target: storePath,
|
|
412
|
+
access_mode: "read-only",
|
|
413
|
+
provenance: pathProvenance.get(storePath) ?? "package",
|
|
414
|
+
}));
|
|
415
|
+
if (resolvedOptions.policy.mode === "compatibility") {
|
|
416
|
+
try {
|
|
417
|
+
const stat = resolvedOptions.filesystem.lstatSync(resolvedOptions.store_root);
|
|
418
|
+
if (stat.isSymbolicLink() || !stat.isDirectory()) {
|
|
419
|
+
return materializationFailure(requirementForErrors, "the compatibility Nix store root is not a directory");
|
|
420
|
+
}
|
|
421
|
+
if (resolvedOptions.filesystem.realpathSync(resolvedOptions.store_root) !== resolvedOptions.store_root) {
|
|
422
|
+
return materializationFailure(requirementForErrors, "the compatibility Nix store root is not canonical");
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
return materializationFailure(requirementForErrors, "the compatibility Nix store root is unavailable");
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
const projection = freezeProjection(resolvedOptions.policy, profileResult.value.profile, profileResult.value.requirements, filesystem);
|
|
430
|
+
if (!projection.ok)
|
|
431
|
+
return projection;
|
|
432
|
+
return success(Object.freeze({
|
|
433
|
+
contract_id: NIX_RUNTIME_CLOSURE_CONTRACT_ID,
|
|
434
|
+
schema_version: NIX_RUNTIME_CLOSURE_SCHEMA_VERSION,
|
|
435
|
+
policy: resolvedOptions.policy,
|
|
436
|
+
profile: profileResult.value.profile,
|
|
437
|
+
requirements: profileResult.value.requirements,
|
|
438
|
+
packages: Object.freeze(packages.sort((left, right) => compareText(left.requirement_id, right.requirement_id))),
|
|
439
|
+
store_paths: sortedStorePaths,
|
|
440
|
+
projection: projection.value,
|
|
441
|
+
}));
|
|
442
|
+
}
|
|
443
|
+
/** Resolve is the same bounded operation; the alias mirrors profile terminology. */
|
|
444
|
+
export const resolveNixRuntimeClosure = materializeNixRuntimeClosure;
|
|
445
|
+
export const materializeNixRuntimeProfile = materializeNixRuntimeClosure;
|
|
446
|
+
export function isNixRuntimeClosureError(error) {
|
|
447
|
+
return error.code === "RUNTIME_MATERIALIZATION_MISSING";
|
|
448
|
+
}
|
|
449
|
+
//# sourceMappingURL=nix-runtime-closure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nix-runtime-closure.js","sourceRoot":"","sources":["../../src/domain/nix-runtime-closure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { type DomainResult } from "./errors.js";
|
|
2
|
+
import { type NixRuntimeClosure, type NixRuntimeClosureOptions } from "./nix-runtime-closure.js";
|
|
3
|
+
import { type RuntimeExecutableProvider, type RuntimeProfileIdentity, type RuntimeRequirement, type SessionRuntimeProjection } from "./runtime-projection.js";
|
|
4
|
+
import type { ResolvedRuntimeProfile } from "./runtime-profile.js";
|
|
5
|
+
import type { RuntimeExecutableProviderMaterialization } from "./runtime-executable-projection.js";
|
|
6
|
+
/** Versioned identity for the concrete #309 backend-materialization boundary. */
|
|
7
|
+
export declare const PNPM_MIDDLEWARE_BACKEND_MATERIALIZATION_CONTRACT_ID: "nawabari.pnpm-middleware-backend-materialization.v1";
|
|
8
|
+
export declare const PNPM_MIDDLEWARE_BACKEND_MATERIALIZATION_SCHEMA_VERSION: 1;
|
|
9
|
+
/** Stable backend targets consumed by #306; its public executable alias is separate. */
|
|
10
|
+
export declare const PNPM_MIDDLEWARE_RTK_TARGET: "/runtime/pnpm-middleware/rtk";
|
|
11
|
+
export declare const PNPM_MIDDLEWARE_REAL_PNPM_TARGET: "/runtime/pnpm-middleware/pnpm/bin/pnpm.mjs";
|
|
12
|
+
export declare const PNPM_MIDDLEWARE_PNPM_BUNDLE_TARGET: "/runtime/pnpm-middleware/pnpm/dist/pnpm.mjs";
|
|
13
|
+
/**
|
|
14
|
+
* Backend identities owned by #309. The public launcher requirements and
|
|
15
|
+
* provider/entrypoint constants remain owned by #306.
|
|
16
|
+
*/
|
|
17
|
+
export declare const RTK_BACKEND_REQUIREMENT: Readonly<{
|
|
18
|
+
id: "rtk-pnpm-middleware";
|
|
19
|
+
kind: "package";
|
|
20
|
+
name: "rtk";
|
|
21
|
+
version: "0.45.0";
|
|
22
|
+
}>;
|
|
23
|
+
export declare const REAL_PNPM_BACKEND_REQUIREMENT: Readonly<{
|
|
24
|
+
id: "pnpm-pinned-backend";
|
|
25
|
+
kind: "package";
|
|
26
|
+
name: "pnpm";
|
|
27
|
+
version: "11.18.0";
|
|
28
|
+
}>;
|
|
29
|
+
export declare const RTK_NIXPKGS_REF: "github:NixOS/nixpkgs/bb92730f6e97ca1c19e285a872cdd62a1a25c467";
|
|
30
|
+
export declare const RTK_NIX_PACKAGE_ATTRIBUTE: "rtk";
|
|
31
|
+
export declare const RTK_NIX_INSTALLABLE: "github:NixOS/nixpkgs/bb92730f6e97ca1c19e285a872cdd62a1a25c467#rtk";
|
|
32
|
+
export declare const RTK_EXECUTABLE_RELATIVE_PATH: "bin/rtk";
|
|
33
|
+
export declare const PNPM_NIXPKGS_REF: "github:NixOS/nixpkgs/44cc5cdbf88deb1d20243d1d5e3b46ad008b6139";
|
|
34
|
+
export declare const PNPM_NIX_PACKAGE_ATTRIBUTE: "pnpm";
|
|
35
|
+
export declare const PNPM_NIX_INSTALLABLE: "github:NixOS/nixpkgs/44cc5cdbf88deb1d20243d1d5e3b46ad008b6139#pnpm";
|
|
36
|
+
/** `bin/pnpm` is a symlink; this is the exact regular executable in the Nix output. */
|
|
37
|
+
export declare const PNPM_EXECUTABLE_RELATIVE_PATH: "libexec/pnpm/bin/pnpm.mjs";
|
|
38
|
+
export declare const PNPM_BUNDLE_RELATIVE_PATH: "libexec/pnpm/dist/pnpm.mjs";
|
|
39
|
+
/** Immutable source pins obtained from the selected Nixpkgs expressions. */
|
|
40
|
+
export declare const RTK_NIX_SOURCE: Readonly<{
|
|
41
|
+
owner: "rtk-ai";
|
|
42
|
+
repository: "rtk";
|
|
43
|
+
tag: "v0.45.0";
|
|
44
|
+
revision: "refs/tags/v0.45.0";
|
|
45
|
+
url: "https://github.com/rtk-ai/rtk/archive/refs/tags/v0.45.0.tar.gz";
|
|
46
|
+
hash: "sha256-weAyHM0nWLrM8JRbbXIfjUsHtAep3DOFyTO+M3BZ/iU=";
|
|
47
|
+
cargo_hash: "sha256-tgW6il/xLxt/xwhUBJ4MNVnk0JSZ7iFjJaEobj5+H4o=";
|
|
48
|
+
}>;
|
|
49
|
+
export declare const PNPM_NIX_SOURCE: Readonly<{
|
|
50
|
+
registry: "https://registry.npmjs.org/";
|
|
51
|
+
package: "pnpm";
|
|
52
|
+
version: "11.18.0";
|
|
53
|
+
url: "https://registry.npmjs.org/pnpm/-/pnpm-11.18.0.tgz";
|
|
54
|
+
hash: "sha256-KcNcqNKih5iP3uPg824H2bk3g/VntXm3/Vt5ikVj3YE=";
|
|
55
|
+
}>;
|
|
56
|
+
export declare const RTK_BACKEND_PROVIDER: RuntimeExecutableProvider;
|
|
57
|
+
export declare const REAL_PNPM_BACKEND_PROVIDER: RuntimeExecutableProvider;
|
|
58
|
+
/** Bounded observations recorded from the exact resolved Nix output files. */
|
|
59
|
+
export declare const RTK_BACKEND_EVIDENCE: Readonly<{
|
|
60
|
+
executable_sha256: "44ef7ff8063d5ddc2ea68b1662c346129322cd2ce922440e53ca1486d1aa7ee0";
|
|
61
|
+
version: "rtk 0.45.0\n";
|
|
62
|
+
version_bytes: 11;
|
|
63
|
+
version_sha256: "9755282c9fbe0070d4f117d607f93a2b8a881ecfe373886e1ddec350cb2d920b";
|
|
64
|
+
proxy_help_bytes: 382;
|
|
65
|
+
proxy_help_sha256: "268105667cee57d4b742de30183bd4d780459c893ea942402f2f32d133c273d7";
|
|
66
|
+
}>;
|
|
67
|
+
export declare const PNPM_BACKEND_EVIDENCE: Readonly<{
|
|
68
|
+
executable_sha256: "81c9d9b2d59db7fa00bb3456a6bacbc6c58b7aeb5c744727c4e167cdadd957e8";
|
|
69
|
+
version: "11.18.0\n";
|
|
70
|
+
version_bytes: 8;
|
|
71
|
+
version_sha256: "324f52ea836cd47edb7932f3992fa50b67fc7fec13a6950e1a1ddf720afab6d2";
|
|
72
|
+
help_bytes: 2305;
|
|
73
|
+
help_sha256: "015f07d56a341088941fffca78f148ff6a9eb17af5246b80aa729a8028f4cb36";
|
|
74
|
+
bundle_bytes: 12904703;
|
|
75
|
+
bundle_sha256: "d34a7b439643e7b8680a817387ec3692c7097ae7a85865c2c15ad6211143d506";
|
|
76
|
+
}>;
|
|
77
|
+
export type PnpmMiddlewareBackendDescriptor = Readonly<{
|
|
78
|
+
/** Exact path visible inside the sandbox and passed to #306. */
|
|
79
|
+
readonly path: string;
|
|
80
|
+
/** Exact regular executable source in the already-materialized Nix output. */
|
|
81
|
+
readonly source: string;
|
|
82
|
+
readonly provider: RuntimeExecutableProvider;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Structural backend-only handoff consumed by #306's materialize API. This
|
|
86
|
+
* boundary intentionally contains no launcher, entrypoint, or public provider
|
|
87
|
+
* contract so the two Issues have one-way ownership.
|
|
88
|
+
*/
|
|
89
|
+
export type PnpmMiddlewareBackendMaterializationOptions = Omit<NixRuntimeClosureOptions, "nixpkgs" | "nixpkgs_ref" | "package_attributes">;
|
|
90
|
+
export type PnpmMiddlewareBackendMaterialization = Readonly<{
|
|
91
|
+
readonly contract_id: typeof PNPM_MIDDLEWARE_BACKEND_MATERIALIZATION_CONTRACT_ID;
|
|
92
|
+
readonly schema_version: typeof PNPM_MIDDLEWARE_BACKEND_MATERIALIZATION_SCHEMA_VERSION;
|
|
93
|
+
readonly profile: RuntimeProfileIdentity;
|
|
94
|
+
readonly requirements: readonly [RuntimeRequirement, RuntimeRequirement];
|
|
95
|
+
/** Exact descriptors accepted by #306's materializePnpmMiddleware input. */
|
|
96
|
+
readonly rtk: PnpmMiddlewareBackendDescriptor;
|
|
97
|
+
readonly real_pnpm: PnpmMiddlewareBackendDescriptor;
|
|
98
|
+
/** Strict bounded projection containing closure roots and exact executable files. */
|
|
99
|
+
readonly projection: SessionRuntimeProjection;
|
|
100
|
+
readonly rtk_closure: NixRuntimeClosure;
|
|
101
|
+
readonly real_pnpm_closure: NixRuntimeClosure;
|
|
102
|
+
readonly rtk_provider_materialization: RuntimeExecutableProviderMaterialization;
|
|
103
|
+
readonly real_pnpm_provider_materialization: RuntimeExecutableProviderMaterialization;
|
|
104
|
+
readonly evidence: Readonly<{
|
|
105
|
+
readonly rtk: typeof RTK_BACKEND_EVIDENCE;
|
|
106
|
+
readonly real_pnpm: typeof PNPM_BACKEND_EVIDENCE;
|
|
107
|
+
}>;
|
|
108
|
+
}>;
|
|
109
|
+
/**
|
|
110
|
+
* Materialize both concrete middleware backends through #291's offline Nix
|
|
111
|
+
* path-info authority. Each backend uses its own immutable Nixpkgs revision;
|
|
112
|
+
* no build, substitute, PATH lookup, home lookup, or store crawl occurs here.
|
|
113
|
+
*/
|
|
114
|
+
export declare function materializePnpmMiddlewareBackends(profile: ResolvedRuntimeProfile, options?: PnpmMiddlewareBackendMaterializationOptions): DomainResult<PnpmMiddlewareBackendMaterialization>;
|
|
115
|
+
/** #292 accepts only a host path; it cannot prove these pinned package artifacts. */
|
|
116
|
+
export declare function materializePnpmMiddlewareFhsRuntime(_input?: unknown): DomainResult<never>;
|
|
117
|
+
export declare const materializePnpmMiddlewareBackendMaterialization: typeof materializePnpmMiddlewareBackends;
|