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,311 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import { posix } from "node:path";
|
|
3
|
+
import { DomainError, failure, success } from "./errors.js";
|
|
4
|
+
import { DEFAULT_NIX_PACKAGE_ATTRIBUTES, materializeNixRuntimeClosure, } from "./nix-runtime-closure.js";
|
|
5
|
+
import { projectSessionRuntimeProjection, runtimeMaterializationMissingError, STRICT_RUNTIME_POLICY, } from "./runtime-projection.js";
|
|
6
|
+
/** Versioned identity for the concrete #309 backend-materialization boundary. */
|
|
7
|
+
export const PNPM_MIDDLEWARE_BACKEND_MATERIALIZATION_CONTRACT_ID = "nawabari.pnpm-middleware-backend-materialization.v1";
|
|
8
|
+
export const PNPM_MIDDLEWARE_BACKEND_MATERIALIZATION_SCHEMA_VERSION = 1;
|
|
9
|
+
/** Stable backend targets consumed by #306; its public executable alias is separate. */
|
|
10
|
+
export const PNPM_MIDDLEWARE_RTK_TARGET = "/runtime/pnpm-middleware/rtk";
|
|
11
|
+
export const PNPM_MIDDLEWARE_REAL_PNPM_TARGET = "/runtime/pnpm-middleware/pnpm/bin/pnpm.mjs";
|
|
12
|
+
export 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 const RTK_BACKEND_REQUIREMENT = Object.freeze({
|
|
18
|
+
id: "rtk-pnpm-middleware",
|
|
19
|
+
kind: "package",
|
|
20
|
+
name: "rtk",
|
|
21
|
+
version: "0.45.0",
|
|
22
|
+
});
|
|
23
|
+
export const REAL_PNPM_BACKEND_REQUIREMENT = Object.freeze({
|
|
24
|
+
id: "pnpm-pinned-backend",
|
|
25
|
+
kind: "package",
|
|
26
|
+
name: "pnpm",
|
|
27
|
+
version: "11.18.0",
|
|
28
|
+
});
|
|
29
|
+
export const RTK_NIXPKGS_REF = "github:NixOS/nixpkgs/bb92730f6e97ca1c19e285a872cdd62a1a25c467";
|
|
30
|
+
export const RTK_NIX_PACKAGE_ATTRIBUTE = "rtk";
|
|
31
|
+
export const RTK_NIX_INSTALLABLE = `${RTK_NIXPKGS_REF}#${RTK_NIX_PACKAGE_ATTRIBUTE}`;
|
|
32
|
+
export const RTK_EXECUTABLE_RELATIVE_PATH = "bin/rtk";
|
|
33
|
+
export const PNPM_NIXPKGS_REF = "github:NixOS/nixpkgs/44cc5cdbf88deb1d20243d1d5e3b46ad008b6139";
|
|
34
|
+
export const PNPM_NIX_PACKAGE_ATTRIBUTE = "pnpm";
|
|
35
|
+
export const PNPM_NIX_INSTALLABLE = `${PNPM_NIXPKGS_REF}#${PNPM_NIX_PACKAGE_ATTRIBUTE}`;
|
|
36
|
+
/** `bin/pnpm` is a symlink; this is the exact regular executable in the Nix output. */
|
|
37
|
+
export const PNPM_EXECUTABLE_RELATIVE_PATH = "libexec/pnpm/bin/pnpm.mjs";
|
|
38
|
+
export const PNPM_BUNDLE_RELATIVE_PATH = "libexec/pnpm/dist/pnpm.mjs";
|
|
39
|
+
/** Immutable source pins obtained from the selected Nixpkgs expressions. */
|
|
40
|
+
export const RTK_NIX_SOURCE = Object.freeze({
|
|
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 const PNPM_NIX_SOURCE = Object.freeze({
|
|
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 const RTK_BACKEND_PROVIDER = Object.freeze({
|
|
57
|
+
id: "rtk-pnpm",
|
|
58
|
+
requirement_id: RTK_BACKEND_REQUIREMENT.id,
|
|
59
|
+
});
|
|
60
|
+
export const REAL_PNPM_BACKEND_PROVIDER = Object.freeze({
|
|
61
|
+
id: "pnpm-real-backend",
|
|
62
|
+
requirement_id: REAL_PNPM_BACKEND_REQUIREMENT.id,
|
|
63
|
+
});
|
|
64
|
+
/** Bounded observations recorded from the exact resolved Nix output files. */
|
|
65
|
+
export const RTK_BACKEND_EVIDENCE = Object.freeze({
|
|
66
|
+
executable_sha256: "44ef7ff8063d5ddc2ea68b1662c346129322cd2ce922440e53ca1486d1aa7ee0",
|
|
67
|
+
version: "rtk 0.45.0\n",
|
|
68
|
+
version_bytes: 11,
|
|
69
|
+
version_sha256: "9755282c9fbe0070d4f117d607f93a2b8a881ecfe373886e1ddec350cb2d920b",
|
|
70
|
+
proxy_help_bytes: 382,
|
|
71
|
+
proxy_help_sha256: "268105667cee57d4b742de30183bd4d780459c893ea942402f2f32d133c273d7",
|
|
72
|
+
});
|
|
73
|
+
export const PNPM_BACKEND_EVIDENCE = Object.freeze({
|
|
74
|
+
executable_sha256: "81c9d9b2d59db7fa00bb3456a6bacbc6c58b7aeb5c744727c4e167cdadd957e8",
|
|
75
|
+
version: "11.18.0\n",
|
|
76
|
+
version_bytes: 8,
|
|
77
|
+
version_sha256: "324f52ea836cd47edb7932f3992fa50b67fc7fec13a6950e1a1ddf720afab6d2",
|
|
78
|
+
help_bytes: 2_305,
|
|
79
|
+
help_sha256: "015f07d56a341088941fffca78f148ff6a9eb17af5246b80aa729a8028f4cb36",
|
|
80
|
+
bundle_bytes: 12_904_703,
|
|
81
|
+
bundle_sha256: "d34a7b439643e7b8680a817387ec3692c7097ae7a85865c2c15ad6211143d506",
|
|
82
|
+
});
|
|
83
|
+
function isRecord(value) {
|
|
84
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
85
|
+
}
|
|
86
|
+
function materializationFailure(requirement, reason, details = {}) {
|
|
87
|
+
const canonical = runtimeMaterializationMissingError(requirement.id, requirement.kind);
|
|
88
|
+
return failure(new DomainError(canonical.code, `${canonical.message.slice(0, -1)}: ${reason}.`, { ...(canonical.details ?? {}), reason, ...details }, canonical.exitCode));
|
|
89
|
+
}
|
|
90
|
+
function validatePinnedOptions(options) {
|
|
91
|
+
if (!isRecord(options))
|
|
92
|
+
return materializationFailure(RTK_BACKEND_REQUIREMENT, "the materializer options are invalid");
|
|
93
|
+
if (options.policy !== undefined && (!isRecord(options.policy) || options.policy.mode !== "strict")) {
|
|
94
|
+
return materializationFailure(RTK_BACKEND_REQUIREMENT, "the backend requires the strict runtime policy");
|
|
95
|
+
}
|
|
96
|
+
if ("nixpkgs" in options || "nixpkgs_ref" in options || "package_attributes" in options) {
|
|
97
|
+
return materializationFailure(RTK_BACKEND_REQUIREMENT, "the RTK and pnpm Nix sources and attributes are pinned by contract");
|
|
98
|
+
}
|
|
99
|
+
return success(null);
|
|
100
|
+
}
|
|
101
|
+
function declaredRequirements(profile) {
|
|
102
|
+
if (!isRecord(profile) || !Array.isArray(profile.requirements)) {
|
|
103
|
+
return materializationFailure(RTK_BACKEND_REQUIREMENT, "the resolved profile has no logical requirements");
|
|
104
|
+
}
|
|
105
|
+
const selected = [];
|
|
106
|
+
for (const requirement of [RTK_BACKEND_REQUIREMENT, REAL_PNPM_BACKEND_REQUIREMENT]) {
|
|
107
|
+
const candidate = profile.requirements.find((value) => isRecord(value) && value.id === requirement.id);
|
|
108
|
+
if (!isRecord(candidate)) {
|
|
109
|
+
return materializationFailure(requirement, "the backend requirement was not explicitly selected");
|
|
110
|
+
}
|
|
111
|
+
if (candidate.kind !== requirement.kind ||
|
|
112
|
+
candidate.name !== requirement.name ||
|
|
113
|
+
candidate.version !== requirement.version) {
|
|
114
|
+
return materializationFailure(requirement, "the selected requirement does not match the pinned backend contract", {
|
|
115
|
+
requirement_id: requirement.id,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
selected.push(requirement);
|
|
119
|
+
}
|
|
120
|
+
return success(Object.freeze(selected));
|
|
121
|
+
}
|
|
122
|
+
function profileForRequirement(profile, requirement) {
|
|
123
|
+
return Object.freeze({
|
|
124
|
+
contract_id: profile.contract_id,
|
|
125
|
+
schema_version: profile.schema_version,
|
|
126
|
+
profile: profile.profile,
|
|
127
|
+
selected_profiles: profile.selected_profiles,
|
|
128
|
+
requirements: Object.freeze([requirement]),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function canonicalExecutable(closure, requirement, packageAttribute, installable, relativePath, target) {
|
|
132
|
+
const packageResolution = closure.packages.find((candidate) => candidate.requirement_id === requirement.id);
|
|
133
|
+
if (packageResolution === undefined) {
|
|
134
|
+
return materializationFailure(requirement, "the Nix closure did not resolve the pinned package");
|
|
135
|
+
}
|
|
136
|
+
if (packageResolution.installable !== installable) {
|
|
137
|
+
return materializationFailure(requirement, "the Nix closure returned a non-pinned installable", {
|
|
138
|
+
installable: packageResolution.installable,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const root = packageResolution.root;
|
|
142
|
+
if (!posix.isAbsolute(root) ||
|
|
143
|
+
posix.normalize(root) !== root ||
|
|
144
|
+
!posix.basename(root).endsWith(`-${packageAttribute}-${requirement.version}`)) {
|
|
145
|
+
return materializationFailure(requirement, "the Nix output root does not match the pinned package version", {
|
|
146
|
+
root,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
if (!closure.projection.filesystem.some((entry) => entry.source === root && entry.target === root)) {
|
|
150
|
+
return materializationFailure(requirement, "the package root is not present in the strict closure projection", {
|
|
151
|
+
root,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const source = posix.join(root, relativePath);
|
|
155
|
+
try {
|
|
156
|
+
const stat = fs.lstatSync(source);
|
|
157
|
+
if (!stat.isFile() || stat.isSymbolicLink() || (stat.mode & 0o111) === 0) {
|
|
158
|
+
return materializationFailure(requirement, "the pinned executable is not a regular executable file", { source });
|
|
159
|
+
}
|
|
160
|
+
if (fs.realpathSync.native(source) !== source) {
|
|
161
|
+
return materializationFailure(requirement, "the pinned executable resolves through a symlink", { source });
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return materializationFailure(requirement, "the pinned executable is unavailable", { source });
|
|
166
|
+
}
|
|
167
|
+
return success({ source, target, root });
|
|
168
|
+
}
|
|
169
|
+
function canonicalAuxiliaryFile(closure, requirement, root, relativePath, target) {
|
|
170
|
+
const source = posix.join(root, relativePath);
|
|
171
|
+
try {
|
|
172
|
+
const stat = fs.lstatSync(source);
|
|
173
|
+
if (!stat.isFile() || stat.isSymbolicLink()) {
|
|
174
|
+
return materializationFailure(requirement, "the pinned runtime auxiliary is not a regular file", { source });
|
|
175
|
+
}
|
|
176
|
+
if (fs.realpathSync.native(source) !== source) {
|
|
177
|
+
return materializationFailure(requirement, "the pinned runtime auxiliary resolves through a symlink", { source });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return materializationFailure(requirement, "the pinned runtime auxiliary is unavailable", { source });
|
|
182
|
+
}
|
|
183
|
+
if (!closure.projection.filesystem.some((entry) => entry.source === root && entry.target === root)) {
|
|
184
|
+
return materializationFailure(requirement, "the package root is not present for the pinned runtime auxiliary", {
|
|
185
|
+
root,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
return success({ source, target, access_mode: "read-only", provenance: "package" });
|
|
189
|
+
}
|
|
190
|
+
function addExactFileProjections(projections, exact, requirement) {
|
|
191
|
+
const byTarget = new Map();
|
|
192
|
+
for (const entry of [...projections, ...exact]) {
|
|
193
|
+
const previous = byTarget.get(entry.target);
|
|
194
|
+
if (previous !== undefined) {
|
|
195
|
+
if (previous.source !== entry.source ||
|
|
196
|
+
previous.access_mode !== entry.access_mode ||
|
|
197
|
+
previous.provenance !== entry.provenance) {
|
|
198
|
+
return materializationFailure(requirement, "the combined backend projection has a conflicting target", {
|
|
199
|
+
target: entry.target,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
byTarget.set(entry.target, entry);
|
|
205
|
+
}
|
|
206
|
+
return success(Object.freeze([...byTarget.values()]));
|
|
207
|
+
}
|
|
208
|
+
function backendClosure(profile, requirement, nixpkgsRef, packageAttribute, options) {
|
|
209
|
+
return materializeNixRuntimeClosure(profileForRequirement(profile, requirement), {
|
|
210
|
+
...options,
|
|
211
|
+
policy: STRICT_RUNTIME_POLICY,
|
|
212
|
+
nixpkgs_ref: nixpkgsRef,
|
|
213
|
+
package_attributes: Object.freeze({
|
|
214
|
+
...DEFAULT_NIX_PACKAGE_ATTRIBUTES,
|
|
215
|
+
[requirement.id]: packageAttribute,
|
|
216
|
+
}),
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Materialize both concrete middleware backends through #291's offline Nix
|
|
221
|
+
* path-info authority. Each backend uses its own immutable Nixpkgs revision;
|
|
222
|
+
* no build, substitute, PATH lookup, home lookup, or store crawl occurs here.
|
|
223
|
+
*/
|
|
224
|
+
export function materializePnpmMiddlewareBackends(profile, options = {}) {
|
|
225
|
+
const optionsCheck = validatePinnedOptions(options);
|
|
226
|
+
if (!optionsCheck.ok)
|
|
227
|
+
return optionsCheck;
|
|
228
|
+
const requirements = declaredRequirements(profile);
|
|
229
|
+
if (!requirements.ok)
|
|
230
|
+
return requirements;
|
|
231
|
+
const rtkClosure = backendClosure(profile, requirements.value[0], RTK_NIXPKGS_REF, RTK_NIX_PACKAGE_ATTRIBUTE, options);
|
|
232
|
+
if (!rtkClosure.ok)
|
|
233
|
+
return rtkClosure;
|
|
234
|
+
const rtkExecutable = canonicalExecutable(rtkClosure.value, requirements.value[0], RTK_NIX_PACKAGE_ATTRIBUTE, RTK_NIX_INSTALLABLE, RTK_EXECUTABLE_RELATIVE_PATH, PNPM_MIDDLEWARE_RTK_TARGET);
|
|
235
|
+
if (!rtkExecutable.ok)
|
|
236
|
+
return rtkExecutable;
|
|
237
|
+
const realPnpmClosure = backendClosure(profile, requirements.value[1], PNPM_NIXPKGS_REF, PNPM_NIX_PACKAGE_ATTRIBUTE, options);
|
|
238
|
+
if (!realPnpmClosure.ok)
|
|
239
|
+
return realPnpmClosure;
|
|
240
|
+
const realPnpmExecutable = canonicalExecutable(realPnpmClosure.value, requirements.value[1], PNPM_NIX_PACKAGE_ATTRIBUTE, PNPM_NIX_INSTALLABLE, PNPM_EXECUTABLE_RELATIVE_PATH, PNPM_MIDDLEWARE_REAL_PNPM_TARGET);
|
|
241
|
+
if (!realPnpmExecutable.ok)
|
|
242
|
+
return realPnpmExecutable;
|
|
243
|
+
const pnpmBundle = canonicalAuxiliaryFile(realPnpmClosure.value, requirements.value[1], realPnpmExecutable.value.root, PNPM_BUNDLE_RELATIVE_PATH, PNPM_MIDDLEWARE_PNPM_BUNDLE_TARGET);
|
|
244
|
+
if (!pnpmBundle.ok)
|
|
245
|
+
return pnpmBundle;
|
|
246
|
+
const filesystem = addExactFileProjections([...rtkClosure.value.projection.filesystem, ...realPnpmClosure.value.projection.filesystem], [
|
|
247
|
+
{
|
|
248
|
+
source: rtkExecutable.value.source,
|
|
249
|
+
target: PNPM_MIDDLEWARE_RTK_TARGET,
|
|
250
|
+
access_mode: "read-only",
|
|
251
|
+
provenance: "package",
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
source: realPnpmExecutable.value.source,
|
|
255
|
+
target: PNPM_MIDDLEWARE_REAL_PNPM_TARGET,
|
|
256
|
+
access_mode: "read-only",
|
|
257
|
+
provenance: "package",
|
|
258
|
+
},
|
|
259
|
+
pnpmBundle.value,
|
|
260
|
+
], requirements.value[0]);
|
|
261
|
+
if (!filesystem.ok)
|
|
262
|
+
return filesystem;
|
|
263
|
+
const projection = projectSessionRuntimeProjection({
|
|
264
|
+
policy: STRICT_RUNTIME_POLICY,
|
|
265
|
+
profile: profile.profile,
|
|
266
|
+
requirements: requirements.value,
|
|
267
|
+
filesystem: filesystem.value,
|
|
268
|
+
executables: [],
|
|
269
|
+
});
|
|
270
|
+
if (!projection.ok)
|
|
271
|
+
return projection;
|
|
272
|
+
const rtkProviderMaterialization = Object.freeze({
|
|
273
|
+
provider: RTK_BACKEND_PROVIDER,
|
|
274
|
+
source: rtkExecutable.value.source,
|
|
275
|
+
});
|
|
276
|
+
const realPnpmProviderMaterialization = Object.freeze({
|
|
277
|
+
provider: REAL_PNPM_BACKEND_PROVIDER,
|
|
278
|
+
source: realPnpmExecutable.value.source,
|
|
279
|
+
});
|
|
280
|
+
return success(Object.freeze({
|
|
281
|
+
contract_id: PNPM_MIDDLEWARE_BACKEND_MATERIALIZATION_CONTRACT_ID,
|
|
282
|
+
schema_version: PNPM_MIDDLEWARE_BACKEND_MATERIALIZATION_SCHEMA_VERSION,
|
|
283
|
+
profile: profile.profile,
|
|
284
|
+
requirements: requirements.value,
|
|
285
|
+
rtk: Object.freeze({
|
|
286
|
+
path: rtkExecutable.value.target,
|
|
287
|
+
source: rtkExecutable.value.source,
|
|
288
|
+
provider: RTK_BACKEND_PROVIDER,
|
|
289
|
+
}),
|
|
290
|
+
real_pnpm: Object.freeze({
|
|
291
|
+
path: realPnpmExecutable.value.target,
|
|
292
|
+
source: realPnpmExecutable.value.source,
|
|
293
|
+
provider: REAL_PNPM_BACKEND_PROVIDER,
|
|
294
|
+
}),
|
|
295
|
+
projection: projection.value,
|
|
296
|
+
rtk_closure: rtkClosure.value,
|
|
297
|
+
real_pnpm_closure: realPnpmClosure.value,
|
|
298
|
+
rtk_provider_materialization: rtkProviderMaterialization,
|
|
299
|
+
real_pnpm_provider_materialization: realPnpmProviderMaterialization,
|
|
300
|
+
evidence: Object.freeze({ rtk: RTK_BACKEND_EVIDENCE, real_pnpm: PNPM_BACKEND_EVIDENCE }),
|
|
301
|
+
}));
|
|
302
|
+
}
|
|
303
|
+
/** #292 accepts only a host path; it cannot prove these pinned package artifacts. */
|
|
304
|
+
export function materializePnpmMiddlewareFhsRuntime(_input) {
|
|
305
|
+
return materializationFailure(REAL_PNPM_BACKEND_REQUIREMENT, "the explicit #292 FHS declaration lacks the immutable source, version, and provenance binding required by this backend", {
|
|
306
|
+
authority: "nawabari.fhs-runtime-materialization.v1",
|
|
307
|
+
missing_primitive: "immutable package source/version/provenance binding",
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
export const materializePnpmMiddlewareBackendMaterialization = materializePnpmMiddlewareBackends;
|
|
311
|
+
//# sourceMappingURL=pnpm-middleware-backend-materialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pnpm-middleware-backend-materialization.js","sourceRoot":"","sources":["../../src/domain/pnpm-middleware-backend-materialization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type DomainResult } from "./errors.js";
|
|
2
|
+
import { type RuntimeExecutableProvider, type RuntimeFilesystemProjection, type SessionRuntimeProjection } from "./runtime-projection.js";
|
|
3
|
+
/** The only command-discovery surface exposed by a strict runtime. */
|
|
4
|
+
export declare const CANONICAL_EXECUTABLE_ROOT: "/nawabari/bin";
|
|
5
|
+
/** A provider result supplied by a selected runtime materializer. */
|
|
6
|
+
export type RuntimeExecutableProviderMaterialization = Readonly<{
|
|
7
|
+
readonly provider: RuntimeExecutableProvider;
|
|
8
|
+
/** Exact host path; this is never resolved through PATH. */
|
|
9
|
+
readonly source: string;
|
|
10
|
+
}>;
|
|
11
|
+
export type RuntimeExecutableMaterializationMap = ReadonlyMap<string, RuntimeExecutableProviderMaterialization>;
|
|
12
|
+
/** One pinned file bind in the canonical executable surface. */
|
|
13
|
+
export type RuntimeExecutableProjectionEntry = Readonly<{
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly source: string;
|
|
16
|
+
readonly target: string;
|
|
17
|
+
/** The declared namespace path from which the source was materialized. */
|
|
18
|
+
readonly backing_target: string;
|
|
19
|
+
readonly provider: RuntimeExecutableProvider;
|
|
20
|
+
readonly provenance: RuntimeFilesystemProjection["provenance"];
|
|
21
|
+
readonly source_kind: "file";
|
|
22
|
+
}>;
|
|
23
|
+
/** Stable map identity for a provider and its declared requirement. */
|
|
24
|
+
export declare function runtimeExecutableProviderKey(provider: RuntimeExecutableProvider): string;
|
|
25
|
+
/**
|
|
26
|
+
* Compile the validated runtime declaration into pinned executable file
|
|
27
|
+
* projections. The default map is derived only from explicit filesystem
|
|
28
|
+
* materialization; callers may supply the same map when an adapter has
|
|
29
|
+
* already resolved provider identities.
|
|
30
|
+
*/
|
|
31
|
+
export declare function compileRuntimeExecutableProjection(projection: SessionRuntimeProjection, suppliedMaterializations?: RuntimeExecutableMaterializationMap): DomainResult<readonly RuntimeExecutableProjectionEntry[]>;
|
|
32
|
+
/** Naming alias for callers that treat the result as a projected surface. */
|
|
33
|
+
export declare const projectRuntimeExecutableSurface: typeof compileRuntimeExecutableProjection;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { DomainError, failure, success } from "./errors.js";
|
|
4
|
+
import { runtimeMaterializationMissingError, runtimeProviderMissingError, } from "./runtime-projection.js";
|
|
5
|
+
/** The only command-discovery surface exposed by a strict runtime. */
|
|
6
|
+
export const CANONICAL_EXECUTABLE_ROOT = "/nawabari/bin";
|
|
7
|
+
/** Stable map identity for a provider and its declared requirement. */
|
|
8
|
+
export function runtimeExecutableProviderKey(provider) {
|
|
9
|
+
return `${provider.id}\u0000${provider.requirement_id}`;
|
|
10
|
+
}
|
|
11
|
+
function projectionInvalid(field, reason, value) {
|
|
12
|
+
return failure(new DomainError("RUNTIME_PROJECTION_INVALID", `Runtime executable field '${field}' is invalid: ${reason}.`, {
|
|
13
|
+
field,
|
|
14
|
+
...(value === undefined ? {} : { value }),
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
function projectionAmbiguous(field, reason, value) {
|
|
18
|
+
return failure(new DomainError("RUNTIME_PROJECTION_AMBIGUOUS", `Runtime executable field '${field}' is ambiguous: ${reason}.`, {
|
|
19
|
+
field,
|
|
20
|
+
value,
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
function isWithin(parent, candidate) {
|
|
24
|
+
return candidate === parent || candidate.startsWith(`${parent}/`);
|
|
25
|
+
}
|
|
26
|
+
function isCanonicalAbsolute(value) {
|
|
27
|
+
return (value.length > 0 &&
|
|
28
|
+
path.posix.isAbsolute(value) &&
|
|
29
|
+
!value.includes("\0") &&
|
|
30
|
+
path.posix.normalize(value) === value &&
|
|
31
|
+
value !== "/");
|
|
32
|
+
}
|
|
33
|
+
function canonicalExecutableTarget(name) {
|
|
34
|
+
return `${CANONICAL_EXECUTABLE_ROOT}/${name}`;
|
|
35
|
+
}
|
|
36
|
+
function requirementKind(projection, requirementId) {
|
|
37
|
+
return projection.requirements.find((requirement) => requirement.id === requirementId)?.kind ?? "package";
|
|
38
|
+
}
|
|
39
|
+
function missingProvider(entrypoint) {
|
|
40
|
+
return failure(runtimeProviderMissingError(entrypoint.provider.id, entrypoint.name, entrypoint.provider.requirement_id));
|
|
41
|
+
}
|
|
42
|
+
function materializationMissing(projection, entrypoint, reason, source) {
|
|
43
|
+
const requirement = runtimeMaterializationMissingError(entrypoint.provider.requirement_id, requirementKind(projection, entrypoint.provider.requirement_id));
|
|
44
|
+
return failure(new DomainError(requirement.code, requirement.message, {
|
|
45
|
+
...(requirement.details ?? {}),
|
|
46
|
+
entrypoint: entrypoint.name,
|
|
47
|
+
provider_id: entrypoint.provider.id,
|
|
48
|
+
reason,
|
|
49
|
+
...(source === undefined ? {} : { source }),
|
|
50
|
+
}, requirement.exitCode));
|
|
51
|
+
}
|
|
52
|
+
function filesystemCandidates(entrypoint, filesystem) {
|
|
53
|
+
return filesystem.filter((projection) => entrypoint.target === projection.target || entrypoint.target.startsWith(`${projection.target}/`));
|
|
54
|
+
}
|
|
55
|
+
function sourceForEntrypoint(projection, entrypoint) {
|
|
56
|
+
if (isWithin(CANONICAL_EXECUTABLE_ROOT, entrypoint.target)) {
|
|
57
|
+
return projectionInvalid("executables.target", "the canonical executable surface cannot be used as a provider target", entrypoint.target);
|
|
58
|
+
}
|
|
59
|
+
const candidates = filesystemCandidates(entrypoint, projection.filesystem);
|
|
60
|
+
if (candidates.length === 0)
|
|
61
|
+
return missingProvider(entrypoint);
|
|
62
|
+
if (candidates.length !== 1) {
|
|
63
|
+
return projectionAmbiguous("executables.target", "the entrypoint is backed by multiple materialized projections", entrypoint.target);
|
|
64
|
+
}
|
|
65
|
+
const backing = candidates[0];
|
|
66
|
+
const relative = path.posix.relative(backing.target, entrypoint.target);
|
|
67
|
+
if (backing.target === entrypoint.target && relative !== "") {
|
|
68
|
+
return projectionInvalid("executables.target", "the materialized backing path is inconsistent", entrypoint.target);
|
|
69
|
+
}
|
|
70
|
+
if (relative.startsWith("../") || path.posix.isAbsolute(relative)) {
|
|
71
|
+
return projectionInvalid("executables.target", "the backing path escaped its materialized projection", entrypoint.target);
|
|
72
|
+
}
|
|
73
|
+
const source = relative === "" ? backing.source : path.posix.join(backing.source, relative);
|
|
74
|
+
if (!isCanonicalAbsolute(source) || isWithin(CANONICAL_EXECUTABLE_ROOT, source)) {
|
|
75
|
+
return projectionInvalid("executables.source", "the backing path is not a canonical non-recursive path", source);
|
|
76
|
+
}
|
|
77
|
+
return success({ source, backing_target: backing.target });
|
|
78
|
+
}
|
|
79
|
+
function validateExecutableSource(projection, entrypoint, source) {
|
|
80
|
+
if (!isCanonicalAbsolute(source)) {
|
|
81
|
+
return projectionInvalid("executables.source", "expected an absolute canonical path", source);
|
|
82
|
+
}
|
|
83
|
+
if (isWithin(CANONICAL_EXECUTABLE_ROOT, source) || source === CANONICAL_EXECUTABLE_ROOT) {
|
|
84
|
+
return projectionInvalid("executables.source", "the canonical executable surface cannot back itself", source);
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const stat = fs.lstatSync(source);
|
|
88
|
+
if (stat.isSymbolicLink()) {
|
|
89
|
+
return projectionInvalid("executables.source", "the backing executable must not be a symlink", source);
|
|
90
|
+
}
|
|
91
|
+
if (!stat.isFile()) {
|
|
92
|
+
return materializationMissing(projection, entrypoint, "the provider result is not a regular file", source);
|
|
93
|
+
}
|
|
94
|
+
if ((stat.mode & 0o111) === 0) {
|
|
95
|
+
return materializationMissing(projection, entrypoint, "the provider result is not executable", source);
|
|
96
|
+
}
|
|
97
|
+
if (fs.realpathSync.native(source) !== source) {
|
|
98
|
+
return projectionInvalid("executables.source", "the backing executable resolves through a symlink", source);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return materializationMissing(projection, entrypoint, "the provider result is missing", source);
|
|
103
|
+
}
|
|
104
|
+
return success(null);
|
|
105
|
+
}
|
|
106
|
+
function validateProviderMaterialization(projection, entrypoint, materialization, expectedSource) {
|
|
107
|
+
const expectedKey = runtimeExecutableProviderKey(entrypoint.provider);
|
|
108
|
+
if (!materialization ||
|
|
109
|
+
typeof materialization !== "object" ||
|
|
110
|
+
typeof materialization.source !== "string" ||
|
|
111
|
+
materialization.provider === null ||
|
|
112
|
+
typeof materialization.provider !== "object" ||
|
|
113
|
+
typeof materialization.provider.id !== "string" ||
|
|
114
|
+
typeof materialization.provider.requirement_id !== "string") {
|
|
115
|
+
return projectionInvalid("executables.provider", "expected one materialization result", expectedKey);
|
|
116
|
+
}
|
|
117
|
+
if (materialization.provider.id !== entrypoint.provider.id ||
|
|
118
|
+
materialization.provider.requirement_id !== entrypoint.provider.requirement_id) {
|
|
119
|
+
return projectionInvalid("executables.provider", "the provider materialization does not match the declared provider and requirement", expectedKey);
|
|
120
|
+
}
|
|
121
|
+
if (materialization.source !== expectedSource) {
|
|
122
|
+
return projectionAmbiguous("executables.source", "the provider result conflicts with the materialized target", materialization.source);
|
|
123
|
+
}
|
|
124
|
+
return validateExecutableSource(projection, entrypoint, materialization.source);
|
|
125
|
+
}
|
|
126
|
+
function deriveMaterializations(projection) {
|
|
127
|
+
const materializations = new Map();
|
|
128
|
+
for (const entrypoint of projection.executables) {
|
|
129
|
+
const resolved = sourceForEntrypoint(projection, entrypoint);
|
|
130
|
+
if (!resolved.ok)
|
|
131
|
+
return resolved;
|
|
132
|
+
const key = runtimeExecutableProviderKey(entrypoint.provider);
|
|
133
|
+
const materialization = Object.freeze({ provider: entrypoint.provider, source: resolved.value.source });
|
|
134
|
+
const previous = materializations.get(key);
|
|
135
|
+
if (previous !== undefined && previous.source !== materialization.source) {
|
|
136
|
+
return projectionAmbiguous("executables.provider", "one provider identity resolves to conflicting backing paths", key);
|
|
137
|
+
}
|
|
138
|
+
materializations.set(key, materialization);
|
|
139
|
+
}
|
|
140
|
+
return success(materializations);
|
|
141
|
+
}
|
|
142
|
+
function validateMaterializationMap(projection, materializations) {
|
|
143
|
+
const declared = new Set(projection.executables.map((entrypoint) => runtimeExecutableProviderKey(entrypoint.provider)));
|
|
144
|
+
for (const [key, materialization] of materializations) {
|
|
145
|
+
if (!declared.has(key)) {
|
|
146
|
+
return projectionInvalid("executables.provider", "an undeclared provider materialization was supplied", key);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
for (const entrypoint of projection.executables) {
|
|
150
|
+
const key = runtimeExecutableProviderKey(entrypoint.provider);
|
|
151
|
+
const materialization = materializations.get(key);
|
|
152
|
+
if (materialization === undefined)
|
|
153
|
+
return missingProvider(entrypoint);
|
|
154
|
+
const resolved = sourceForEntrypoint(projection, entrypoint);
|
|
155
|
+
if (!resolved.ok)
|
|
156
|
+
return resolved;
|
|
157
|
+
const valid = validateProviderMaterialization(projection, entrypoint, materialization, resolved.value.source);
|
|
158
|
+
if (!valid.ok)
|
|
159
|
+
return valid;
|
|
160
|
+
}
|
|
161
|
+
return success(null);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Compile the validated runtime declaration into pinned executable file
|
|
165
|
+
* projections. The default map is derived only from explicit filesystem
|
|
166
|
+
* materialization; callers may supply the same map when an adapter has
|
|
167
|
+
* already resolved provider identities.
|
|
168
|
+
*/
|
|
169
|
+
export function compileRuntimeExecutableProjection(projection, suppliedMaterializations) {
|
|
170
|
+
const materializations = suppliedMaterializations === undefined ? deriveMaterializations(projection) : success(suppliedMaterializations);
|
|
171
|
+
if (!materializations.ok)
|
|
172
|
+
return materializations;
|
|
173
|
+
const validMap = validateMaterializationMap(projection, materializations.value);
|
|
174
|
+
if (!validMap.ok)
|
|
175
|
+
return validMap;
|
|
176
|
+
const entries = [];
|
|
177
|
+
const targets = new Set();
|
|
178
|
+
for (const entrypoint of projection.executables) {
|
|
179
|
+
const key = runtimeExecutableProviderKey(entrypoint.provider);
|
|
180
|
+
const materialization = materializations.value.get(key);
|
|
181
|
+
const backing = sourceForEntrypoint(projection, entrypoint);
|
|
182
|
+
if (!backing.ok)
|
|
183
|
+
return backing;
|
|
184
|
+
const target = canonicalExecutableTarget(entrypoint.name);
|
|
185
|
+
if (targets.has(target)) {
|
|
186
|
+
return projectionAmbiguous("executables.name", "duplicate canonical executable target", target);
|
|
187
|
+
}
|
|
188
|
+
targets.add(target);
|
|
189
|
+
entries.push(Object.freeze({
|
|
190
|
+
name: entrypoint.name,
|
|
191
|
+
source: materialization.source,
|
|
192
|
+
target,
|
|
193
|
+
backing_target: backing.value.backing_target,
|
|
194
|
+
provider: entrypoint.provider,
|
|
195
|
+
provenance: entrypoint.provenance,
|
|
196
|
+
source_kind: "file",
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
entries.sort((left, right) => (left.target < right.target ? -1 : left.target > right.target ? 1 : 0));
|
|
200
|
+
return success(Object.freeze(entries));
|
|
201
|
+
}
|
|
202
|
+
/** Naming alias for callers that treat the result as a projected surface. */
|
|
203
|
+
export const projectRuntimeExecutableSurface = compileRuntimeExecutableProjection;
|
|
204
|
+
//# sourceMappingURL=runtime-executable-projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-executable-projection.js","sourceRoot":"","sources":["../../src/domain/runtime-executable-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
export type RuntimeFileIdentity = Readonly<{
|
|
3
|
+
readonly dev: bigint;
|
|
4
|
+
readonly ino: bigint;
|
|
5
|
+
}>;
|
|
6
|
+
export type RuntimeFileIdentityTestHooks = Readonly<{
|
|
7
|
+
readonly beforeExclusiveCreate?: (path: string) => void;
|
|
8
|
+
readonly beforeFinalIdentityCheck?: (path: string, identity: RuntimeFileIdentity) => void;
|
|
9
|
+
}>;
|
|
10
|
+
export type RuntimeFileInspection<T> = Readonly<{
|
|
11
|
+
readonly source: string;
|
|
12
|
+
readonly identity: RuntimeFileIdentity;
|
|
13
|
+
readonly value: T;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Open and inspect one regular file through one descriptor, then prove that
|
|
17
|
+
* its canonical pathname still names the descriptor's Linux file identity.
|
|
18
|
+
*/
|
|
19
|
+
export declare function inspectRuntimeFile<T>(candidate: string, inspect: (descriptor: number, stat: fs.BigIntStats) => T, options?: Readonly<{
|
|
20
|
+
readonly requireCanonicalPath?: boolean;
|
|
21
|
+
}>): RuntimeFileInspection<T>;
|
|
22
|
+
/** Read a bounded file through an already inspected descriptor. */
|
|
23
|
+
export declare function readRuntimeFile(descriptor: number, size: bigint, maximum: number): Buffer;
|
|
24
|
+
/**
|
|
25
|
+
* Exclusively create, write, chmod, and identity-check one file. On failure,
|
|
26
|
+
* the invocation-owned partial artifact is left in place rather than removed
|
|
27
|
+
* by pathname: a pathname-based unlink after the identity check would race
|
|
28
|
+
* against a replacement at that path and could delete a competing file. The
|
|
29
|
+
* next materialization attempt fails closed on the existing destination.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createRuntimeFile<T>(destination: string, write: (descriptor: number, stat: fs.BigIntStats) => T): T;
|
|
32
|
+
/**
|
|
33
|
+
* Test-only seam for deterministic replacement and exclusive-create races.
|
|
34
|
+
* It is intentionally private to the runtime/domain implementation and is
|
|
35
|
+
* never re-exported by Nawabari's public API.
|
|
36
|
+
*/
|
|
37
|
+
export declare function withRuntimeFileIdentityTestHooks<T>(hooks: RuntimeFileIdentityTestHooks, action: () => T): T;
|