@opengeni/artifact-tool 0.2.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/LICENSE +190 -0
- package/README.md +104 -0
- package/dist/bounded-zip.d.ts +28 -0
- package/dist/chunk-4BSENMAE.js +39 -0
- package/dist/chunk-4BSENMAE.js.map +1 -0
- package/dist/chunk-4FRFNNBM.js +276 -0
- package/dist/chunk-4FRFNNBM.js.map +1 -0
- package/dist/chunk-5XIA6KHZ.js +49 -0
- package/dist/chunk-5XIA6KHZ.js.map +1 -0
- package/dist/chunk-66CT2ZRP.js +2229 -0
- package/dist/chunk-66CT2ZRP.js.map +1 -0
- package/dist/chunk-72SYDU4O.js +319 -0
- package/dist/chunk-72SYDU4O.js.map +1 -0
- package/dist/chunk-B2ZJRZDA.js +279 -0
- package/dist/chunk-B2ZJRZDA.js.map +1 -0
- package/dist/chunk-DCTLTNPW.js +2458 -0
- package/dist/chunk-DCTLTNPW.js.map +1 -0
- package/dist/chunk-FGZM4FQ6.js +473 -0
- package/dist/chunk-FGZM4FQ6.js.map +1 -0
- package/dist/chunk-HTJBLBDE.js +591 -0
- package/dist/chunk-HTJBLBDE.js.map +1 -0
- package/dist/chunk-IYFXZQ34.js +5306 -0
- package/dist/chunk-IYFXZQ34.js.map +1 -0
- package/dist/chunk-J6N7IR44.js +172 -0
- package/dist/chunk-J6N7IR44.js.map +1 -0
- package/dist/chunk-N2IHNWBS.js +1002 -0
- package/dist/chunk-N2IHNWBS.js.map +1 -0
- package/dist/chunk-NAG44K67.js +549 -0
- package/dist/chunk-NAG44K67.js.map +1 -0
- package/dist/chunk-O24KTEGP.js +33 -0
- package/dist/chunk-O24KTEGP.js.map +1 -0
- package/dist/chunk-PI2AZVGK.js +2074 -0
- package/dist/chunk-PI2AZVGK.js.map +1 -0
- package/dist/chunk-Q2FFHEY7.js +40 -0
- package/dist/chunk-Q2FFHEY7.js.map +1 -0
- package/dist/chunk-RBGQADXA.js +57 -0
- package/dist/chunk-RBGQADXA.js.map +1 -0
- package/dist/chunk-U5G2BKM2.js +613 -0
- package/dist/chunk-U5G2BKM2.js.map +1 -0
- package/dist/chunk-VOJHMSM3.js +39 -0
- package/dist/chunk-VOJHMSM3.js.map +1 -0
- package/dist/chunk-VUNV25KB.js +16 -0
- package/dist/chunk-VUNV25KB.js.map +1 -0
- package/dist/chunk-XIFUNVBO.js +101 -0
- package/dist/chunk-XIFUNVBO.js.map +1 -0
- package/dist/chunk-ZCJYRJGB.js +489 -0
- package/dist/chunk-ZCJYRJGB.js.map +1 -0
- package/dist/chunk-ZZXPEE4S.js +2260 -0
- package/dist/chunk-ZZXPEE4S.js.map +1 -0
- package/dist/document-docx-api.d.ts +49 -0
- package/dist/document-docx-codec.d.ts +9 -0
- package/dist/document-docx-codec.js +4765 -0
- package/dist/document-docx-codec.js.map +1 -0
- package/dist/document-docx-import.d.ts +261 -0
- package/dist/document-docx-packer.d.ts +18 -0
- package/dist/document-docx-state.d.ts +12 -0
- package/dist/document-render.d.ts +3 -0
- package/dist/document-render.js +492 -0
- package/dist/document-render.js.map +1 -0
- package/dist/document.d.ts +432 -0
- package/dist/document.js +37 -0
- package/dist/document.js.map +1 -0
- package/dist/errors.d.ts +23 -0
- package/dist/file-blob.d.ts +11 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/inspection.d.ts +12 -0
- package/dist/kernel.d.ts +101 -0
- package/dist/lib-GQLPACFK.js +9746 -0
- package/dist/lib-GQLPACFK.js.map +1 -0
- package/dist/materializer-cli-entry.d.ts +2 -0
- package/dist/materializer-cli-entry.js +29 -0
- package/dist/materializer-cli-entry.js.map +1 -0
- package/dist/materializer-cli.d.ts +24 -0
- package/dist/materializer-cli.js +24 -0
- package/dist/materializer-cli.js.map +1 -0
- package/dist/native-raster.d.ts +10 -0
- package/dist/native.d.ts +129 -0
- package/dist/native.js +31 -0
- package/dist/native.js.map +1 -0
- package/dist/office-import.d.ts +48 -0
- package/dist/office-import.js +154 -0
- package/dist/office-import.js.map +1 -0
- package/dist/presentation-pptx-api.d.ts +60 -0
- package/dist/presentation-pptx-import.d.ts +5 -0
- package/dist/presentation-pptx-state-digest-765CZZED.js +10 -0
- package/dist/presentation-pptx-state-digest-765CZZED.js.map +1 -0
- package/dist/presentation-pptx-state-digest.d.ts +3 -0
- package/dist/presentation-pptx-state.d.ts +4 -0
- package/dist/presentation-pptx-xml.d.ts +29 -0
- package/dist/presentation-pptx.d.ts +5 -0
- package/dist/presentation-pptx.js +2365 -0
- package/dist/presentation-pptx.js.map +1 -0
- package/dist/presentation-render.d.ts +29 -0
- package/dist/presentation-render.js +375 -0
- package/dist/presentation-render.js.map +1 -0
- package/dist/presentation.d.ts +565 -0
- package/dist/presentation.js +71 -0
- package/dist/presentation.js.map +1 -0
- package/dist/production-composite.d.ts +68 -0
- package/dist/production-document.d.ts +2 -0
- package/dist/production-document.js +176 -0
- package/dist/production-document.js.map +1 -0
- package/dist/production-native-codecs.d.ts +94 -0
- package/dist/production-presentation.d.ts +2 -0
- package/dist/production-presentation.js +176 -0
- package/dist/production-presentation.js.map +1 -0
- package/dist/production-sha256.d.ts +2 -0
- package/dist/production-spreadsheet-native.d.ts +12 -0
- package/dist/production-spreadsheet.d.ts +2 -0
- package/dist/production-spreadsheet.js +176 -0
- package/dist/production-spreadsheet.js.map +1 -0
- package/dist/production.d.ts +96 -0
- package/dist/raster-image.d.ts +34 -0
- package/dist/reference.d.ts +17 -0
- package/dist/reference.js +574 -0
- package/dist/reference.js.map +1 -0
- package/dist/runtime-cli-entry.d.ts +2 -0
- package/dist/runtime-cli-entry.js +21 -0
- package/dist/runtime-cli-entry.js.map +1 -0
- package/dist/runtime-cli.d.ts +76 -0
- package/dist/runtime-cli.js +26 -0
- package/dist/runtime-cli.js.map +1 -0
- package/dist/runtime-development.d.ts +73 -0
- package/dist/runtime-development.js +30 -0
- package/dist/runtime-development.js.map +1 -0
- package/dist/runtime-receipt.d.ts +19 -0
- package/dist/runtime.d.ts +355 -0
- package/dist/runtime.js +42 -0
- package/dist/runtime.js.map +1 -0
- package/dist/snapshot.d.ts +26 -0
- package/dist/snapshot.js +61 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/spreadsheet-address.d.ts +18 -0
- package/dist/spreadsheet-file.d.ts +17 -0
- package/dist/spreadsheet-formula.d.ts +67 -0
- package/dist/spreadsheet-image.d.ts +17 -0
- package/dist/spreadsheet-render.d.ts +5 -0
- package/dist/spreadsheet-render.js +752 -0
- package/dist/spreadsheet-render.js.map +1 -0
- package/dist/spreadsheet-types.d.ts +155 -0
- package/dist/spreadsheet-xlsx-api.d.ts +88 -0
- package/dist/spreadsheet-xlsx-codec.d.ts +16 -0
- package/dist/spreadsheet-xlsx-codec.js +16 -0
- package/dist/spreadsheet-xlsx-codec.js.map +1 -0
- package/dist/spreadsheet-xlsx-state.d.ts +16 -0
- package/dist/spreadsheet.d.ts +724 -0
- package/dist/spreadsheet.js +67 -0
- package/dist/spreadsheet.js.map +1 -0
- package/package.json +129 -0
- package/src/bounded-zip.ts +450 -0
- package/src/document-docx-api.ts +64 -0
- package/src/document-docx-codec.ts +2253 -0
- package/src/document-docx-import.ts +3814 -0
- package/src/document-docx-packer.ts +72 -0
- package/src/document-docx-state.ts +59 -0
- package/src/document-render.ts +615 -0
- package/src/document.ts +2800 -0
- package/src/errors.ts +45 -0
- package/src/file-blob.ts +43 -0
- package/src/index.ts +4 -0
- package/src/inspection.ts +50 -0
- package/src/kernel.ts +525 -0
- package/src/materializer-cli-entry.ts +11 -0
- package/src/materializer-cli.ts +743 -0
- package/src/native-raster.ts +141 -0
- package/src/native.ts +390 -0
- package/src/office-import.ts +243 -0
- package/src/presentation-pptx-api.ts +107 -0
- package/src/presentation-pptx-import.ts +2065 -0
- package/src/presentation-pptx-state-digest.ts +46 -0
- package/src/presentation-pptx-state.ts +18 -0
- package/src/presentation-pptx-xml.ts +473 -0
- package/src/presentation-pptx.ts +447 -0
- package/src/presentation-render.ts +532 -0
- package/src/presentation.ts +2599 -0
- package/src/production-composite.ts +805 -0
- package/src/production-document.ts +2 -0
- package/src/production-native-codecs.ts +1141 -0
- package/src/production-presentation.ts +2 -0
- package/src/production-sha256.ts +150 -0
- package/src/production-spreadsheet-native.ts +686 -0
- package/src/production-spreadsheet.ts +2 -0
- package/src/production.ts +1022 -0
- package/src/raster-image.ts +586 -0
- package/src/reference.ts +17 -0
- package/src/runtime-cli-entry.ts +13 -0
- package/src/runtime-cli.ts +670 -0
- package/src/runtime-development.ts +689 -0
- package/src/runtime-receipt.ts +169 -0
- package/src/runtime.ts +1463 -0
- package/src/snapshot.ts +88 -0
- package/src/spreadsheet-address.ts +90 -0
- package/src/spreadsheet-file.ts +71 -0
- package/src/spreadsheet-formula.ts +1212 -0
- package/src/spreadsheet-image.ts +242 -0
- package/src/spreadsheet-render.ts +985 -0
- package/src/spreadsheet-types.ts +171 -0
- package/src/spreadsheet-xlsx-api.ts +123 -0
- package/src/spreadsheet-xlsx-codec.ts +3063 -0
- package/src/spreadsheet-xlsx-state.ts +191 -0
- package/src/spreadsheet.ts +5195 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ARTIFACT_RUNTIME_ENVIRONMENT,
|
|
3
|
+
ArtifactRuntimeError,
|
|
4
|
+
loadArtifactKernelRuntime,
|
|
5
|
+
locateArtifactRuntimeDependencies,
|
|
6
|
+
resolveArtifactRuntimeTarget,
|
|
7
|
+
validateArtifactRuntimeInstallationManifest,
|
|
8
|
+
validateCompleteArtifactRuntimeReleaseManifest
|
|
9
|
+
} from "./chunk-N2IHNWBS.js";
|
|
10
|
+
|
|
11
|
+
// src/runtime-cli.ts
|
|
12
|
+
import { createHash } from "crypto";
|
|
13
|
+
import { open, realpath, stat } from "fs/promises";
|
|
14
|
+
import { isAbsolute, relative, resolve } from "path";
|
|
15
|
+
import { fileURLToPath, pathToFileURL } from "url";
|
|
16
|
+
var MAX_INSTALLATION_MANIFEST_BYTES = 256 * 1024;
|
|
17
|
+
var MAX_RELEASE_MANIFEST_BYTES = 1024 * 1024;
|
|
18
|
+
var MAX_ARTIFACT_TOOL_ARCHIVE_BYTES = 256 * 1024 * 1024;
|
|
19
|
+
var MAX_JAVASCRIPT_ENTRYPOINT_BYTES = 32 * 1024 * 1024;
|
|
20
|
+
var MAX_SKILL_FACADE_SUPPORT_FILE_BYTES = 128 * 1024 * 1024;
|
|
21
|
+
var MAX_KERNEL_ASSET_BYTES = 512 * 1024 * 1024;
|
|
22
|
+
async function locateVerifiedArtifactRuntime(options = {}) {
|
|
23
|
+
const environment = options.environment ?? process.env;
|
|
24
|
+
const manifestInput = requiredEnvironmentPath(environment, ARTIFACT_RUNTIME_ENVIRONMENT.manifest);
|
|
25
|
+
const facadeInput = requiredEnvironmentPath(
|
|
26
|
+
environment,
|
|
27
|
+
ARTIFACT_RUNTIME_ENVIRONMENT.toolEntrypoint
|
|
28
|
+
);
|
|
29
|
+
const expectedTarget = options.expectedTarget ?? resolveCurrentArtifactRuntimeTarget();
|
|
30
|
+
const manifestPath = await canonicalFile(manifestInput, "installation manifest");
|
|
31
|
+
const installationFile = await readInstallationManifest(manifestPath);
|
|
32
|
+
const installation = installationFile.manifest;
|
|
33
|
+
const dependencies = locateArtifactRuntimeDependencies(
|
|
34
|
+
installation,
|
|
35
|
+
pathToFileURL(manifestPath),
|
|
36
|
+
expectedTarget
|
|
37
|
+
);
|
|
38
|
+
assertCanonicalInstallationManifest(installationFile.bytes, dependencies.manifest);
|
|
39
|
+
const installationRoot = await realpath(resolve(manifestPath, ".."));
|
|
40
|
+
const releaseManifestPath = await confinedCanonicalFile(
|
|
41
|
+
dependencies.releaseManifestUrl,
|
|
42
|
+
installationRoot,
|
|
43
|
+
"release manifest"
|
|
44
|
+
);
|
|
45
|
+
const artifactToolArchive = dependencies.artifactToolArchiveUrl ? await confinedCanonicalFile(
|
|
46
|
+
dependencies.artifactToolArchiveUrl,
|
|
47
|
+
installationRoot,
|
|
48
|
+
"artifact-tool archive"
|
|
49
|
+
) : void 0;
|
|
50
|
+
const skillFacadeEntrypoint = await confinedCanonicalFile(
|
|
51
|
+
dependencies.skillFacadeEntrypoint,
|
|
52
|
+
installationRoot,
|
|
53
|
+
"skill facade entrypoint"
|
|
54
|
+
);
|
|
55
|
+
const skillFacadeSupportFiles = await Promise.all(
|
|
56
|
+
dependencies.skillFacadeSupportFiles.map(
|
|
57
|
+
(url, index) => confinedCanonicalFile(url, installationRoot, `skill facade support file ${index}`)
|
|
58
|
+
)
|
|
59
|
+
);
|
|
60
|
+
const kernelEntrypoint = await confinedCanonicalFile(
|
|
61
|
+
dependencies.kernelEntrypoint,
|
|
62
|
+
installationRoot,
|
|
63
|
+
"kernel entrypoint"
|
|
64
|
+
);
|
|
65
|
+
const kernelAsset = await confinedCanonicalFile(
|
|
66
|
+
dependencies.kernelAsset,
|
|
67
|
+
installationRoot,
|
|
68
|
+
"kernel asset"
|
|
69
|
+
);
|
|
70
|
+
const kernelSupportFiles = await Promise.all(
|
|
71
|
+
dependencies.kernelSupportFiles.map(
|
|
72
|
+
(url, index) => confinedCanonicalFile(url, installationRoot, `kernel support file ${index}`)
|
|
73
|
+
)
|
|
74
|
+
);
|
|
75
|
+
const configuredFacade = await canonicalFile(facadeInput, "configured skill facade entrypoint");
|
|
76
|
+
if (configuredFacade !== skillFacadeEntrypoint) {
|
|
77
|
+
integrity(
|
|
78
|
+
`${ARTIFACT_RUNTIME_ENVIRONMENT.toolEntrypoint} does not name the manifest-pinned skill facade entrypoint`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
const releaseBytes = await readAndVerifyFile(
|
|
82
|
+
releaseManifestPath,
|
|
83
|
+
installation.releaseManifest,
|
|
84
|
+
MAX_RELEASE_MANIFEST_BYTES,
|
|
85
|
+
"release manifest"
|
|
86
|
+
);
|
|
87
|
+
const release = parseReleaseManifest(releaseBytes);
|
|
88
|
+
assertCanonicalReleaseManifest(releaseBytes, release);
|
|
89
|
+
if (!sameJson(release.artifactTool, installation.artifactTool)) {
|
|
90
|
+
integrity("Installed artifact-tool identity does not match the complete release manifest");
|
|
91
|
+
}
|
|
92
|
+
if (artifactToolArchive && installation.artifactToolArchive) {
|
|
93
|
+
const archiveBytes = await readAndVerifyFile(
|
|
94
|
+
artifactToolArchive,
|
|
95
|
+
installation.artifactToolArchive,
|
|
96
|
+
MAX_ARTIFACT_TOOL_ARCHIVE_BYTES,
|
|
97
|
+
"artifact-tool archive"
|
|
98
|
+
);
|
|
99
|
+
const archiveIntegrity = `sha512-${createHash("sha512").update(archiveBytes).digest("base64")}`;
|
|
100
|
+
if (archiveIntegrity !== installation.artifactTool.integrity) {
|
|
101
|
+
integrity("Packed artifact-tool archive differs from its installation identity");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const releasedKernel = release.targets.find((entry) => entry.target === installation.target);
|
|
105
|
+
if (!releasedKernel || !sameJson(releasedKernel, installation.kernel)) {
|
|
106
|
+
integrity("Installed kernel package does not match its exact release target manifest");
|
|
107
|
+
}
|
|
108
|
+
await verifyFile(
|
|
109
|
+
skillFacadeEntrypoint,
|
|
110
|
+
installation.skillFacadeEntrypoint,
|
|
111
|
+
MAX_JAVASCRIPT_ENTRYPOINT_BYTES,
|
|
112
|
+
"skill facade entrypoint"
|
|
113
|
+
);
|
|
114
|
+
for (const [index, path] of skillFacadeSupportFiles.entries()) {
|
|
115
|
+
await verifyFile(
|
|
116
|
+
path,
|
|
117
|
+
installation.skillFacadeSupportFiles[index],
|
|
118
|
+
MAX_SKILL_FACADE_SUPPORT_FILE_BYTES,
|
|
119
|
+
`skill facade support file ${index}`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
await verifyFile(
|
|
123
|
+
kernelEntrypoint,
|
|
124
|
+
installation.kernel.entrypoint,
|
|
125
|
+
MAX_JAVASCRIPT_ENTRYPOINT_BYTES,
|
|
126
|
+
"kernel entrypoint"
|
|
127
|
+
);
|
|
128
|
+
await verifyFile(kernelAsset, installation.kernel.asset, MAX_KERNEL_ASSET_BYTES, "kernel asset");
|
|
129
|
+
for (const [index, path] of kernelSupportFiles.entries()) {
|
|
130
|
+
await verifyFile(
|
|
131
|
+
path,
|
|
132
|
+
installation.kernel.supportFiles[index],
|
|
133
|
+
MAX_JAVASCRIPT_ENTRYPOINT_BYTES,
|
|
134
|
+
`kernel support file ${index}`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
return Object.freeze({
|
|
138
|
+
schemaVersion: 1,
|
|
139
|
+
target: installation.target,
|
|
140
|
+
manifestPath,
|
|
141
|
+
releaseManifestPath,
|
|
142
|
+
artifactTool: Object.freeze({ ...installation.artifactTool }),
|
|
143
|
+
...artifactToolArchive ? { artifactToolArchive } : {},
|
|
144
|
+
skillFacadeEntrypoint,
|
|
145
|
+
...skillFacadeSupportFiles.length > 0 ? { skillFacadeSupportFiles: Object.freeze([...skillFacadeSupportFiles]) } : {},
|
|
146
|
+
kernel: Object.freeze({
|
|
147
|
+
packageName: installation.kernel.packageName,
|
|
148
|
+
packageVersion: installation.kernel.packageVersion,
|
|
149
|
+
entrypoint: kernelEntrypoint,
|
|
150
|
+
asset: kernelAsset,
|
|
151
|
+
supportFiles: Object.freeze([...kernelSupportFiles]),
|
|
152
|
+
buildIdentity: installation.kernel.buildIdentity
|
|
153
|
+
})
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
async function doctorVerifiedArtifactRuntime(options = {}) {
|
|
157
|
+
const location = await locateVerifiedArtifactRuntime(options);
|
|
158
|
+
const importer = options.importer ?? defaultImporter;
|
|
159
|
+
let imported;
|
|
160
|
+
try {
|
|
161
|
+
imported = await importer(pathToFileURL(location.skillFacadeEntrypoint).href);
|
|
162
|
+
} catch (cause) {
|
|
163
|
+
throw new ArtifactRuntimeError(
|
|
164
|
+
"ARTIFACT_RUNTIME_UNAVAILABLE",
|
|
165
|
+
"Verified skill facade bootstrap could not be evaluated",
|
|
166
|
+
{ cause }
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
if (typeof imported !== "object" || imported === null || Array.isArray(imported)) {
|
|
170
|
+
incompatible("skill facade bootstrap did not export a module namespace");
|
|
171
|
+
}
|
|
172
|
+
const module = imported;
|
|
173
|
+
if (options.probe) {
|
|
174
|
+
await options.probe(module);
|
|
175
|
+
} else {
|
|
176
|
+
probeVerifiedArtifactSkillFacade(module, location);
|
|
177
|
+
}
|
|
178
|
+
return location;
|
|
179
|
+
}
|
|
180
|
+
async function loadVerifiedArtifactKernelRuntime(options = {}) {
|
|
181
|
+
const environment = options.environment ?? process.env;
|
|
182
|
+
const expectedTarget = options.expectedTarget ?? resolveCurrentArtifactRuntimeTarget();
|
|
183
|
+
const before = await locateVerifiedArtifactRuntime({ environment, expectedTarget });
|
|
184
|
+
const installation = (await readInstallationManifest(before.manifestPath)).manifest;
|
|
185
|
+
const dependencies = locateArtifactRuntimeDependencies(
|
|
186
|
+
installation,
|
|
187
|
+
pathToFileURL(before.manifestPath),
|
|
188
|
+
expectedTarget
|
|
189
|
+
);
|
|
190
|
+
const runtime = await loadArtifactKernelRuntime(dependencies);
|
|
191
|
+
const after = await locateVerifiedArtifactRuntime({ environment, expectedTarget });
|
|
192
|
+
if (!sameJson(before, after) || runtime.kind !== "native" || runtime.target !== before.target || runtime.buildIdentity !== before.kernel.buildIdentity) {
|
|
193
|
+
integrity("Loaded kernel runtime does not match the verified installation");
|
|
194
|
+
}
|
|
195
|
+
return Object.freeze({ location: after, runtime });
|
|
196
|
+
}
|
|
197
|
+
function canonicalArtifactRuntimeReleaseManifestBytes(value) {
|
|
198
|
+
const manifest = validateCompleteArtifactRuntimeReleaseManifest(value);
|
|
199
|
+
return new TextEncoder().encode(`${JSON.stringify(manifest, null, 2)}
|
|
200
|
+
`);
|
|
201
|
+
}
|
|
202
|
+
function canonicalArtifactRuntimeInstallationManifestBytes(value) {
|
|
203
|
+
const manifest = validateArtifactRuntimeInstallationManifest(value);
|
|
204
|
+
return new TextEncoder().encode(`${JSON.stringify(manifest, null, 2)}
|
|
205
|
+
`);
|
|
206
|
+
}
|
|
207
|
+
function resolveCurrentArtifactRuntimeTarget() {
|
|
208
|
+
const platform = process.platform;
|
|
209
|
+
const arch = process.arch;
|
|
210
|
+
if (platform !== "linux") {
|
|
211
|
+
return resolveArtifactRuntimeTarget({ platform, arch }).target;
|
|
212
|
+
}
|
|
213
|
+
return resolveArtifactRuntimeTarget({ platform, arch, libc: detectLinuxLibc() }).target;
|
|
214
|
+
}
|
|
215
|
+
async function runArtifactRuntimeCli(args, environment = process.env) {
|
|
216
|
+
const [command, format, ...rest] = args;
|
|
217
|
+
if (command !== "locate" && command !== "doctor" || format !== "--json" || rest.length > 0) {
|
|
218
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_MANIFEST_INVALID", artifactRuntimeCliUsage());
|
|
219
|
+
}
|
|
220
|
+
const location = command === "doctor" ? await doctorVerifiedArtifactRuntime({ environment }) : await locateVerifiedArtifactRuntime({ environment });
|
|
221
|
+
return `${JSON.stringify(location)}
|
|
222
|
+
`;
|
|
223
|
+
}
|
|
224
|
+
function artifactRuntimeCliUsage() {
|
|
225
|
+
return "Usage: opengeni-artifact-runtime <locate|doctor> --json";
|
|
226
|
+
}
|
|
227
|
+
async function readInstallationManifest(path) {
|
|
228
|
+
const bytes = await readBoundedFile(
|
|
229
|
+
path,
|
|
230
|
+
MAX_INSTALLATION_MANIFEST_BYTES,
|
|
231
|
+
"installation manifest"
|
|
232
|
+
);
|
|
233
|
+
let parsed;
|
|
234
|
+
try {
|
|
235
|
+
parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
236
|
+
} catch (cause) {
|
|
237
|
+
throw new ArtifactRuntimeError(
|
|
238
|
+
"ARTIFACT_RUNTIME_MANIFEST_INVALID",
|
|
239
|
+
"Installation manifest is not strict UTF-8 JSON",
|
|
240
|
+
{ cause }
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
return Object.freeze({
|
|
244
|
+
manifest: parsed,
|
|
245
|
+
bytes
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
function parseReleaseManifest(bytes) {
|
|
249
|
+
let parsed;
|
|
250
|
+
try {
|
|
251
|
+
parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
252
|
+
} catch (cause) {
|
|
253
|
+
throw new ArtifactRuntimeError(
|
|
254
|
+
"ARTIFACT_RUNTIME_MANIFEST_INVALID",
|
|
255
|
+
"Release manifest is not strict UTF-8 JSON",
|
|
256
|
+
{ cause }
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
return validateCompleteArtifactRuntimeReleaseManifest(parsed);
|
|
260
|
+
}
|
|
261
|
+
function assertCanonicalReleaseManifest(actual, manifest) {
|
|
262
|
+
const canonical = canonicalArtifactRuntimeReleaseManifestBytes(manifest);
|
|
263
|
+
if (!sameBytes(actual, canonical)) {
|
|
264
|
+
integrity("Release manifest bytes are not in the canonical deterministic form");
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function assertCanonicalInstallationManifest(actual, manifest) {
|
|
268
|
+
const canonical = canonicalArtifactRuntimeInstallationManifestBytes(manifest);
|
|
269
|
+
if (!sameBytes(actual, canonical)) {
|
|
270
|
+
integrity("Installation manifest bytes are not in the canonical deterministic form");
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
async function confinedCanonicalFile(url, root, name) {
|
|
274
|
+
const path = await canonicalFile(fileURLToPath(url), name);
|
|
275
|
+
const fromRoot = relative(root, path);
|
|
276
|
+
if (fromRoot === ".." || fromRoot.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) || isAbsolute(fromRoot)) {
|
|
277
|
+
throw new ArtifactRuntimeError(
|
|
278
|
+
"ARTIFACT_RUNTIME_MANIFEST_INVALID",
|
|
279
|
+
`${name} resolves outside the installation root`
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
return path;
|
|
283
|
+
}
|
|
284
|
+
async function canonicalFile(input, name) {
|
|
285
|
+
if (!isAbsolute(input)) {
|
|
286
|
+
throw new ArtifactRuntimeError(
|
|
287
|
+
"ARTIFACT_RUNTIME_MANIFEST_INVALID",
|
|
288
|
+
`${name} path must be absolute`
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
try {
|
|
292
|
+
const path = await realpath(input);
|
|
293
|
+
const metadata = await stat(path);
|
|
294
|
+
if (!metadata.isFile()) unavailable(`${name} is not a regular file`);
|
|
295
|
+
return path;
|
|
296
|
+
} catch (cause) {
|
|
297
|
+
if (cause instanceof ArtifactRuntimeError) throw cause;
|
|
298
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", `${name} is not available`, {
|
|
299
|
+
cause
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
async function readBoundedFile(path, maximumBytes, name) {
|
|
304
|
+
let handle;
|
|
305
|
+
try {
|
|
306
|
+
handle = await open(path, "r");
|
|
307
|
+
const before = await handle.stat();
|
|
308
|
+
if (!before.isFile()) unavailable(`${name} is not a regular file`);
|
|
309
|
+
if (before.size <= 0 || before.size > maximumBytes) {
|
|
310
|
+
integrity(`${name} size is outside its allowed bound`);
|
|
311
|
+
}
|
|
312
|
+
const bytes = new Uint8Array(await handle.readFile());
|
|
313
|
+
const after = await handle.stat();
|
|
314
|
+
if (after.size !== before.size || bytes.byteLength !== before.size) {
|
|
315
|
+
integrity(`${name} changed while it was being read`);
|
|
316
|
+
}
|
|
317
|
+
return bytes;
|
|
318
|
+
} catch (cause) {
|
|
319
|
+
if (cause instanceof ArtifactRuntimeError) throw cause;
|
|
320
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", `Could not read ${name}`, {
|
|
321
|
+
cause
|
|
322
|
+
});
|
|
323
|
+
} finally {
|
|
324
|
+
await handle?.close();
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async function readAndVerifyFile(path, expected, maximumBytes, name) {
|
|
328
|
+
if (expected.bytes > maximumBytes) integrity(`${name} exceeds its allowed bound`);
|
|
329
|
+
const bytes = await readBoundedFile(path, maximumBytes, name);
|
|
330
|
+
if (bytes.byteLength !== expected.bytes)
|
|
331
|
+
integrity(`${name} byte count does not match its manifest`);
|
|
332
|
+
const digest = `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
|
|
333
|
+
if (digest !== expected.sha256) integrity(`${name} digest does not match its manifest`);
|
|
334
|
+
return bytes;
|
|
335
|
+
}
|
|
336
|
+
async function verifyFile(path, expected, maximumBytes, name) {
|
|
337
|
+
if (expected.bytes > maximumBytes) integrity(`${name} exceeds its allowed bound`);
|
|
338
|
+
let handle;
|
|
339
|
+
try {
|
|
340
|
+
handle = await open(path, "r");
|
|
341
|
+
const before = await handle.stat();
|
|
342
|
+
if (!before.isFile()) unavailable(`${name} is not a regular file`);
|
|
343
|
+
if (before.size !== expected.bytes) integrity(`${name} byte count does not match its manifest`);
|
|
344
|
+
const hash = createHash("sha256");
|
|
345
|
+
let bytes = 0;
|
|
346
|
+
for await (const chunk of handle.createReadStream({ autoClose: false })) {
|
|
347
|
+
const buffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk;
|
|
348
|
+
bytes += buffer.byteLength;
|
|
349
|
+
if (bytes > maximumBytes || bytes > expected.bytes) integrity(`${name} exceeds its manifest`);
|
|
350
|
+
hash.update(buffer);
|
|
351
|
+
}
|
|
352
|
+
const after = await handle.stat();
|
|
353
|
+
if (after.size !== before.size || bytes !== before.size)
|
|
354
|
+
integrity(`${name} changed while hashing`);
|
|
355
|
+
const digest = `sha256:${hash.digest("hex")}`;
|
|
356
|
+
if (digest !== expected.sha256) integrity(`${name} digest does not match its manifest`);
|
|
357
|
+
} catch (cause) {
|
|
358
|
+
if (cause instanceof ArtifactRuntimeError) throw cause;
|
|
359
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", `Could not verify ${name}`, {
|
|
360
|
+
cause
|
|
361
|
+
});
|
|
362
|
+
} finally {
|
|
363
|
+
await handle?.close();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
function requiredEnvironmentPath(environment, name) {
|
|
367
|
+
const value = environment[name];
|
|
368
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
369
|
+
unavailable(`${name} is required; runtime discovery never downloads or guesses an asset`);
|
|
370
|
+
}
|
|
371
|
+
return value;
|
|
372
|
+
}
|
|
373
|
+
function resolveLinuxLibcFromRuntimeEvidence(evidence) {
|
|
374
|
+
const candidates = /* @__PURE__ */ new Set();
|
|
375
|
+
if (nonempty(evidence.versions.musl)) candidates.add("musl");
|
|
376
|
+
if (nonempty(evidence.report?.header?.glibcVersionRuntime)) candidates.add("gnu");
|
|
377
|
+
if (Array.isArray(evidence.report?.sharedObjects) && evidence.report.sharedObjects.some(
|
|
378
|
+
(entry) => typeof entry === "string" && /(?:^|[\\/])ld-musl-(?:aarch64|x86_64)\.so(?:\.\d+)?$/u.test(entry)
|
|
379
|
+
)) {
|
|
380
|
+
candidates.add("musl");
|
|
381
|
+
}
|
|
382
|
+
const bunArchiveLibc = libcFromOfficialBunRelease(
|
|
383
|
+
evidence.report?.header?.release?.sourceUrl,
|
|
384
|
+
evidence.versions.bun,
|
|
385
|
+
evidence.arch
|
|
386
|
+
);
|
|
387
|
+
if (bunArchiveLibc) candidates.add(bunArchiveLibc);
|
|
388
|
+
if (candidates.size === 1) return [...candidates][0];
|
|
389
|
+
throw new ArtifactRuntimeError(
|
|
390
|
+
"ARTIFACT_RUNTIME_UNSUPPORTED_TARGET",
|
|
391
|
+
"Could not prove whether this Linux host uses glibc or musl"
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
function detectLinuxLibc() {
|
|
395
|
+
const report = process.report?.getReport();
|
|
396
|
+
return resolveLinuxLibcFromRuntimeEvidence({
|
|
397
|
+
arch: process.arch,
|
|
398
|
+
versions: process.versions,
|
|
399
|
+
...report ? { report } : {}
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
function libcFromOfficialBunRelease(sourceUrl, bunVersion, arch) {
|
|
403
|
+
if (!nonempty(sourceUrl) || !nonempty(bunVersion)) return void 0;
|
|
404
|
+
let url;
|
|
405
|
+
try {
|
|
406
|
+
url = new URL(sourceUrl);
|
|
407
|
+
} catch {
|
|
408
|
+
return void 0;
|
|
409
|
+
}
|
|
410
|
+
if (url.protocol !== "https:" || url.hostname !== "github.com" || url.username || url.password || url.search || url.hash) {
|
|
411
|
+
return void 0;
|
|
412
|
+
}
|
|
413
|
+
const match = /^\/oven-sh\/bun\/releases\/download\/bun-v([^/]+)\/bun-linux-([^/]+)\.zip$/u.exec(
|
|
414
|
+
url.pathname
|
|
415
|
+
);
|
|
416
|
+
if (!match || match[1] !== bunVersion) return void 0;
|
|
417
|
+
const archiveTarget = match[2];
|
|
418
|
+
const validTarget = arch === "arm64" ? /^aarch64(?:-musl)?(?:-profile)?$/u.test(archiveTarget) : arch === "x64" ? /^x64(?:-musl)?(?:-baseline)?(?:-profile)?$/u.test(archiveTarget) : false;
|
|
419
|
+
if (!validTarget) return void 0;
|
|
420
|
+
return archiveTarget.split("-").includes("musl") ? "musl" : "gnu";
|
|
421
|
+
}
|
|
422
|
+
function nonempty(value) {
|
|
423
|
+
return typeof value === "string" && value.length > 0;
|
|
424
|
+
}
|
|
425
|
+
function probeVerifiedArtifactSkillFacade(module, location) {
|
|
426
|
+
const getRuntime = module.getConfiguredArtifactRuntime;
|
|
427
|
+
if (typeof getRuntime !== "function") {
|
|
428
|
+
incompatible("skill facade bootstrap does not expose getConfiguredArtifactRuntime()");
|
|
429
|
+
}
|
|
430
|
+
const runtime = getRuntime();
|
|
431
|
+
if (typeof runtime !== "object" || runtime === null) {
|
|
432
|
+
incompatible("skill facade bootstrap did not configure its exact native runtime");
|
|
433
|
+
}
|
|
434
|
+
const record = runtime;
|
|
435
|
+
if (record.kind !== "native" || record.target !== location.target || record.buildIdentity !== location.kernel.buildIdentity || typeof record.capabilities !== "object" || record.capabilities === null) {
|
|
436
|
+
incompatible("skill facade bootstrap configured an incompatible runtime");
|
|
437
|
+
}
|
|
438
|
+
const workbookFactory = module.Workbook;
|
|
439
|
+
const diagnostics = module.getArtifactCompositeDiagnostics;
|
|
440
|
+
const snapshot = module.createArtifactSnapshot;
|
|
441
|
+
const dispose = module.disposeArtifact;
|
|
442
|
+
if (typeof workbookFactory?.create !== "function" || typeof diagnostics !== "function" || typeof snapshot !== "function" || typeof dispose !== "function") {
|
|
443
|
+
incompatible("skill facade bootstrap is missing its native workbook health surface");
|
|
444
|
+
}
|
|
445
|
+
const workbook = workbookFactory.create();
|
|
446
|
+
try {
|
|
447
|
+
const proof = diagnostics(workbook);
|
|
448
|
+
if (proof.runtimeTarget !== location.target || proof.runtimeBuildIdentity !== location.kernel.buildIdentity || typeof proof.nativeStateHash !== "string") {
|
|
449
|
+
incompatible("skill facade workbook health proof does not match the pinned runtime");
|
|
450
|
+
}
|
|
451
|
+
} finally {
|
|
452
|
+
dispose(workbook);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
function defaultImporter(specifier) {
|
|
456
|
+
return import(
|
|
457
|
+
/* @vite-ignore */
|
|
458
|
+
specifier
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
function sameJson(left, right) {
|
|
462
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
463
|
+
}
|
|
464
|
+
function sameBytes(left, right) {
|
|
465
|
+
if (left.byteLength !== right.byteLength) return false;
|
|
466
|
+
return left.every((value, index) => value === right[index]);
|
|
467
|
+
}
|
|
468
|
+
function integrity(message) {
|
|
469
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_INTEGRITY", message);
|
|
470
|
+
}
|
|
471
|
+
function unavailable(message) {
|
|
472
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", message);
|
|
473
|
+
}
|
|
474
|
+
function incompatible(message) {
|
|
475
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_INCOMPATIBLE", message);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
export {
|
|
479
|
+
locateVerifiedArtifactRuntime,
|
|
480
|
+
doctorVerifiedArtifactRuntime,
|
|
481
|
+
loadVerifiedArtifactKernelRuntime,
|
|
482
|
+
canonicalArtifactRuntimeReleaseManifestBytes,
|
|
483
|
+
canonicalArtifactRuntimeInstallationManifestBytes,
|
|
484
|
+
resolveCurrentArtifactRuntimeTarget,
|
|
485
|
+
runArtifactRuntimeCli,
|
|
486
|
+
resolveLinuxLibcFromRuntimeEvidence,
|
|
487
|
+
probeVerifiedArtifactSkillFacade
|
|
488
|
+
};
|
|
489
|
+
//# sourceMappingURL=chunk-ZCJYRJGB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/runtime-cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { createHash } from \"node:crypto\";\nimport { open, realpath, stat } from \"node:fs/promises\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport {\n ARTIFACT_RUNTIME_ENVIRONMENT,\n ArtifactRuntimeError,\n loadArtifactKernelRuntime,\n locateArtifactRuntimeDependencies,\n resolveArtifactRuntimeTarget,\n validateArtifactRuntimeInstallationManifest,\n validateCompleteArtifactRuntimeReleaseManifest,\n type ArtifactKernelRuntime,\n type ArtifactRuntimeInstallationManifest,\n type ArtifactRuntimeTarget,\n} from \"./runtime\";\n\nconst MAX_INSTALLATION_MANIFEST_BYTES = 256 * 1024;\nconst MAX_RELEASE_MANIFEST_BYTES = 1024 * 1024;\nconst MAX_ARTIFACT_TOOL_ARCHIVE_BYTES = 256 * 1024 * 1024;\nconst MAX_JAVASCRIPT_ENTRYPOINT_BYTES = 32 * 1024 * 1024;\nconst MAX_SKILL_FACADE_SUPPORT_FILE_BYTES = 128 * 1024 * 1024;\nconst MAX_KERNEL_ASSET_BYTES = 512 * 1024 * 1024;\n\ntype RuntimeEnvironment = Readonly<Record<string, string | undefined>>;\n\nexport type VerifiedArtifactRuntimeLocation = Readonly<{\n schemaVersion: 1;\n target: ArtifactRuntimeTarget;\n manifestPath: string;\n releaseManifestPath: string;\n artifactTool: Readonly<{\n packageName: \"@opengeni/artifact-tool\";\n packageVersion: string;\n integrity: `sha512-${string}`;\n }>;\n artifactToolArchive?: string;\n skillFacadeEntrypoint: string;\n skillFacadeSupportFiles?: readonly string[];\n kernel: Readonly<{\n packageName: string;\n packageVersion: string;\n entrypoint: string;\n asset: string;\n supportFiles: readonly string[];\n buildIdentity: string;\n }>;\n}>;\n\nexport type LocateArtifactRuntimeOptions = Readonly<{\n environment?: RuntimeEnvironment;\n /** Test/build override. The executable always derives the current host target. */\n expectedTarget?: ArtifactRuntimeTarget;\n}>;\n\nexport type DoctorArtifactRuntimeOptions = LocateArtifactRuntimeOptions &\n Readonly<{\n importer?: (specifier: string) => unknown | Promise<unknown>;\n probe?: (module: Record<string, unknown>) => void | Promise<void>;\n }>;\n\nexport type VerifiedArtifactKernelRuntime = Readonly<{\n location: VerifiedArtifactRuntimeLocation;\n runtime: ArtifactKernelRuntime;\n}>;\n\n/**\n * Verifies the complete local release/install chain without evaluating any\n * package code. All reads are local, bounded, streamed where large, and pinned\n * to exact byte counts plus SHA-256 digests.\n */\nexport async function locateVerifiedArtifactRuntime(\n options: LocateArtifactRuntimeOptions = {},\n): Promise<VerifiedArtifactRuntimeLocation> {\n const environment = options.environment ?? process.env;\n const manifestInput = requiredEnvironmentPath(environment, ARTIFACT_RUNTIME_ENVIRONMENT.manifest);\n const facadeInput = requiredEnvironmentPath(\n environment,\n ARTIFACT_RUNTIME_ENVIRONMENT.toolEntrypoint,\n );\n const expectedTarget = options.expectedTarget ?? resolveCurrentArtifactRuntimeTarget();\n\n const manifestPath = await canonicalFile(manifestInput, \"installation manifest\");\n const installationFile = await readInstallationManifest(manifestPath);\n const installation = installationFile.manifest;\n const dependencies = locateArtifactRuntimeDependencies(\n installation,\n pathToFileURL(manifestPath),\n expectedTarget,\n );\n assertCanonicalInstallationManifest(installationFile.bytes, dependencies.manifest);\n const installationRoot = await realpath(resolve(manifestPath, \"..\"));\n\n const releaseManifestPath = await confinedCanonicalFile(\n dependencies.releaseManifestUrl,\n installationRoot,\n \"release manifest\",\n );\n const artifactToolArchive = dependencies.artifactToolArchiveUrl\n ? await confinedCanonicalFile(\n dependencies.artifactToolArchiveUrl,\n installationRoot,\n \"artifact-tool archive\",\n )\n : undefined;\n const skillFacadeEntrypoint = await confinedCanonicalFile(\n dependencies.skillFacadeEntrypoint,\n installationRoot,\n \"skill facade entrypoint\",\n );\n const skillFacadeSupportFiles = await Promise.all(\n dependencies.skillFacadeSupportFiles.map((url, index) =>\n confinedCanonicalFile(url, installationRoot, `skill facade support file ${index}`),\n ),\n );\n const kernelEntrypoint = await confinedCanonicalFile(\n dependencies.kernelEntrypoint,\n installationRoot,\n \"kernel entrypoint\",\n );\n const kernelAsset = await confinedCanonicalFile(\n dependencies.kernelAsset,\n installationRoot,\n \"kernel asset\",\n );\n const kernelSupportFiles = await Promise.all(\n dependencies.kernelSupportFiles.map((url, index) =>\n confinedCanonicalFile(url, installationRoot, `kernel support file ${index}`),\n ),\n );\n const configuredFacade = await canonicalFile(facadeInput, \"configured skill facade entrypoint\");\n if (configuredFacade !== skillFacadeEntrypoint) {\n integrity(\n `${ARTIFACT_RUNTIME_ENVIRONMENT.toolEntrypoint} does not name the manifest-pinned skill facade entrypoint`,\n );\n }\n\n const releaseBytes = await readAndVerifyFile(\n releaseManifestPath,\n installation.releaseManifest,\n MAX_RELEASE_MANIFEST_BYTES,\n \"release manifest\",\n );\n const release = parseReleaseManifest(releaseBytes);\n assertCanonicalReleaseManifest(releaseBytes, release);\n if (!sameJson(release.artifactTool, installation.artifactTool)) {\n integrity(\"Installed artifact-tool identity does not match the complete release manifest\");\n }\n if (artifactToolArchive && installation.artifactToolArchive) {\n const archiveBytes = await readAndVerifyFile(\n artifactToolArchive,\n installation.artifactToolArchive,\n MAX_ARTIFACT_TOOL_ARCHIVE_BYTES,\n \"artifact-tool archive\",\n );\n const archiveIntegrity = `sha512-${createHash(\"sha512\").update(archiveBytes).digest(\"base64\")}`;\n if (archiveIntegrity !== installation.artifactTool.integrity) {\n integrity(\"Packed artifact-tool archive differs from its installation identity\");\n }\n }\n const releasedKernel = release.targets.find((entry) => entry.target === installation.target);\n if (!releasedKernel || !sameJson(releasedKernel, installation.kernel)) {\n integrity(\"Installed kernel package does not match its exact release target manifest\");\n }\n\n // Do not evaluate the facade or kernel package until every executable/data\n // file in the chain has independently passed its byte proof.\n await verifyFile(\n skillFacadeEntrypoint,\n installation.skillFacadeEntrypoint,\n MAX_JAVASCRIPT_ENTRYPOINT_BYTES,\n \"skill facade entrypoint\",\n );\n for (const [index, path] of skillFacadeSupportFiles.entries()) {\n await verifyFile(\n path,\n installation.skillFacadeSupportFiles![index]!,\n MAX_SKILL_FACADE_SUPPORT_FILE_BYTES,\n `skill facade support file ${index}`,\n );\n }\n await verifyFile(\n kernelEntrypoint,\n installation.kernel.entrypoint,\n MAX_JAVASCRIPT_ENTRYPOINT_BYTES,\n \"kernel entrypoint\",\n );\n await verifyFile(kernelAsset, installation.kernel.asset, MAX_KERNEL_ASSET_BYTES, \"kernel asset\");\n for (const [index, path] of kernelSupportFiles.entries()) {\n await verifyFile(\n path,\n installation.kernel.supportFiles[index]!,\n MAX_JAVASCRIPT_ENTRYPOINT_BYTES,\n `kernel support file ${index}`,\n );\n }\n\n return Object.freeze({\n schemaVersion: 1,\n target: installation.target,\n manifestPath,\n releaseManifestPath,\n artifactTool: Object.freeze({ ...installation.artifactTool }),\n ...(artifactToolArchive ? { artifactToolArchive } : {}),\n skillFacadeEntrypoint,\n ...(skillFacadeSupportFiles.length > 0\n ? { skillFacadeSupportFiles: Object.freeze([...skillFacadeSupportFiles]) }\n : {}),\n kernel: Object.freeze({\n packageName: installation.kernel.packageName,\n packageVersion: installation.kernel.packageVersion,\n entrypoint: kernelEntrypoint,\n asset: kernelAsset,\n supportFiles: Object.freeze([...kernelSupportFiles]),\n buildIdentity: installation.kernel.buildIdentity,\n }),\n });\n}\n\n/** Verify first, then evaluate the one pinned bootstrap and probe its facade. */\nexport async function doctorVerifiedArtifactRuntime(\n options: DoctorArtifactRuntimeOptions = {},\n): Promise<VerifiedArtifactRuntimeLocation> {\n const location = await locateVerifiedArtifactRuntime(options);\n const importer = options.importer ?? defaultImporter;\n let imported: unknown;\n try {\n imported = await importer(pathToFileURL(location.skillFacadeEntrypoint).href);\n } catch (cause) {\n throw new ArtifactRuntimeError(\n \"ARTIFACT_RUNTIME_UNAVAILABLE\",\n \"Verified skill facade bootstrap could not be evaluated\",\n { cause },\n );\n }\n if (typeof imported !== \"object\" || imported === null || Array.isArray(imported)) {\n incompatible(\"skill facade bootstrap did not export a module namespace\");\n }\n const module = imported as Record<string, unknown>;\n if (options.probe) {\n await options.probe(module);\n } else {\n probeVerifiedArtifactSkillFacade(module, location);\n }\n return location;\n}\n\n/**\n * Loads only the manifest-pinned native kernel package after verifying every\n * selected runtime byte. A second complete verification after evaluation\n * closes ordinary replacement races; production additionally mounts this\n * installation read-only inside the materializer sandbox.\n */\nexport async function loadVerifiedArtifactKernelRuntime(\n options: LocateArtifactRuntimeOptions = {},\n): Promise<VerifiedArtifactKernelRuntime> {\n const environment = options.environment ?? process.env;\n const expectedTarget = options.expectedTarget ?? resolveCurrentArtifactRuntimeTarget();\n const before = await locateVerifiedArtifactRuntime({ environment, expectedTarget });\n const installation = (await readInstallationManifest(before.manifestPath)).manifest;\n const dependencies = locateArtifactRuntimeDependencies(\n installation,\n pathToFileURL(before.manifestPath),\n expectedTarget,\n );\n const runtime = await loadArtifactKernelRuntime(dependencies);\n const after = await locateVerifiedArtifactRuntime({ environment, expectedTarget });\n if (\n !sameJson(before, after) ||\n runtime.kind !== \"native\" ||\n runtime.target !== before.target ||\n runtime.buildIdentity !== before.kernel.buildIdentity\n ) {\n integrity(\"Loaded kernel runtime does not match the verified installation\");\n }\n return Object.freeze({ location: after, runtime });\n}\n\n/** Deterministic bytes used by release tooling and verified by the locator. */\nexport function canonicalArtifactRuntimeReleaseManifestBytes(value: unknown): Uint8Array {\n const manifest = validateCompleteArtifactRuntimeReleaseManifest(value);\n return new TextEncoder().encode(`${JSON.stringify(manifest, null, 2)}\\n`);\n}\n\n/** Deterministic installation bytes; the strict locator rejects other encodings. */\nexport function canonicalArtifactRuntimeInstallationManifestBytes(value: unknown): Uint8Array {\n const manifest = validateArtifactRuntimeInstallationManifest(value);\n return new TextEncoder().encode(`${JSON.stringify(manifest, null, 2)}\\n`);\n}\n\nexport function resolveCurrentArtifactRuntimeTarget(): ArtifactRuntimeTarget {\n const platform = process.platform;\n const arch = process.arch;\n if (platform !== \"linux\") {\n return resolveArtifactRuntimeTarget({ platform, arch }).target;\n }\n return resolveArtifactRuntimeTarget({ platform, arch, libc: detectLinuxLibc() }).target;\n}\n\nexport async function runArtifactRuntimeCli(\n args: readonly string[],\n environment: RuntimeEnvironment = process.env,\n): Promise<string> {\n const [command, format, ...rest] = args;\n if ((command !== \"locate\" && command !== \"doctor\") || format !== \"--json\" || rest.length > 0) {\n throw new ArtifactRuntimeError(\"ARTIFACT_RUNTIME_MANIFEST_INVALID\", artifactRuntimeCliUsage());\n }\n const location =\n command === \"doctor\"\n ? await doctorVerifiedArtifactRuntime({ environment })\n : await locateVerifiedArtifactRuntime({ environment });\n return `${JSON.stringify(location)}\\n`;\n}\n\nfunction artifactRuntimeCliUsage(): string {\n return \"Usage: opengeni-artifact-runtime <locate|doctor> --json\";\n}\n\nasync function readInstallationManifest(\n path: string,\n): Promise<Readonly<{ manifest: ArtifactRuntimeInstallationManifest; bytes: Uint8Array }>> {\n const bytes = await readBoundedFile(\n path,\n MAX_INSTALLATION_MANIFEST_BYTES,\n \"installation manifest\",\n );\n let parsed: unknown;\n try {\n parsed = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes));\n } catch (cause) {\n throw new ArtifactRuntimeError(\n \"ARTIFACT_RUNTIME_MANIFEST_INVALID\",\n \"Installation manifest is not strict UTF-8 JSON\",\n { cause },\n );\n }\n // locateArtifactRuntimeDependencies performs the exact schema validation.\n return Object.freeze({\n manifest: parsed as ArtifactRuntimeInstallationManifest,\n bytes,\n });\n}\n\nfunction parseReleaseManifest(\n bytes: Uint8Array,\n): ReturnType<typeof validateCompleteArtifactRuntimeReleaseManifest> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes));\n } catch (cause) {\n throw new ArtifactRuntimeError(\n \"ARTIFACT_RUNTIME_MANIFEST_INVALID\",\n \"Release manifest is not strict UTF-8 JSON\",\n { cause },\n );\n }\n return validateCompleteArtifactRuntimeReleaseManifest(parsed);\n}\n\nfunction assertCanonicalReleaseManifest(\n actual: Uint8Array,\n manifest: ReturnType<typeof validateCompleteArtifactRuntimeReleaseManifest>,\n): void {\n const canonical = canonicalArtifactRuntimeReleaseManifestBytes(manifest);\n if (!sameBytes(actual, canonical)) {\n integrity(\"Release manifest bytes are not in the canonical deterministic form\");\n }\n}\n\nfunction assertCanonicalInstallationManifest(\n actual: Uint8Array,\n manifest: ArtifactRuntimeInstallationManifest,\n): void {\n const canonical = canonicalArtifactRuntimeInstallationManifestBytes(manifest);\n if (!sameBytes(actual, canonical)) {\n integrity(\"Installation manifest bytes are not in the canonical deterministic form\");\n }\n}\n\nasync function confinedCanonicalFile(url: URL, root: string, name: string): Promise<string> {\n const path = await canonicalFile(fileURLToPath(url), name);\n const fromRoot = relative(root, path);\n if (\n fromRoot === \"..\" ||\n fromRoot.startsWith(`..${process.platform === \"win32\" ? \"\\\\\" : \"/\"}`) ||\n isAbsolute(fromRoot)\n ) {\n throw new ArtifactRuntimeError(\n \"ARTIFACT_RUNTIME_MANIFEST_INVALID\",\n `${name} resolves outside the installation root`,\n );\n }\n return path;\n}\n\nasync function canonicalFile(input: string, name: string): Promise<string> {\n if (!isAbsolute(input)) {\n throw new ArtifactRuntimeError(\n \"ARTIFACT_RUNTIME_MANIFEST_INVALID\",\n `${name} path must be absolute`,\n );\n }\n try {\n const path = await realpath(input);\n const metadata = await stat(path);\n if (!metadata.isFile()) unavailable(`${name} is not a regular file`);\n return path;\n } catch (cause) {\n if (cause instanceof ArtifactRuntimeError) throw cause;\n throw new ArtifactRuntimeError(\"ARTIFACT_RUNTIME_UNAVAILABLE\", `${name} is not available`, {\n cause,\n });\n }\n}\n\nasync function readBoundedFile(\n path: string,\n maximumBytes: number,\n name: string,\n): Promise<Uint8Array> {\n let handle;\n try {\n handle = await open(path, \"r\");\n const before = await handle.stat();\n if (!before.isFile()) unavailable(`${name} is not a regular file`);\n if (before.size <= 0 || before.size > maximumBytes) {\n integrity(`${name} size is outside its allowed bound`);\n }\n const bytes = new Uint8Array(await handle.readFile());\n const after = await handle.stat();\n if (after.size !== before.size || bytes.byteLength !== before.size) {\n integrity(`${name} changed while it was being read`);\n }\n return bytes;\n } catch (cause) {\n if (cause instanceof ArtifactRuntimeError) throw cause;\n throw new ArtifactRuntimeError(\"ARTIFACT_RUNTIME_UNAVAILABLE\", `Could not read ${name}`, {\n cause,\n });\n } finally {\n await handle?.close();\n }\n}\n\nasync function readAndVerifyFile(\n path: string,\n expected: Readonly<{ bytes: number; sha256: `sha256:${string}` }>,\n maximumBytes: number,\n name: string,\n): Promise<Uint8Array> {\n if (expected.bytes > maximumBytes) integrity(`${name} exceeds its allowed bound`);\n const bytes = await readBoundedFile(path, maximumBytes, name);\n if (bytes.byteLength !== expected.bytes)\n integrity(`${name} byte count does not match its manifest`);\n const digest = `sha256:${createHash(\"sha256\").update(bytes).digest(\"hex\")}`;\n if (digest !== expected.sha256) integrity(`${name} digest does not match its manifest`);\n return bytes;\n}\n\nasync function verifyFile(\n path: string,\n expected: Readonly<{ bytes: number; sha256: `sha256:${string}` }>,\n maximumBytes: number,\n name: string,\n): Promise<void> {\n if (expected.bytes > maximumBytes) integrity(`${name} exceeds its allowed bound`);\n let handle;\n try {\n handle = await open(path, \"r\");\n const before = await handle.stat();\n if (!before.isFile()) unavailable(`${name} is not a regular file`);\n if (before.size !== expected.bytes) integrity(`${name} byte count does not match its manifest`);\n const hash = createHash(\"sha256\");\n let bytes = 0;\n for await (const chunk of handle.createReadStream({ autoClose: false })) {\n const buffer = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\n bytes += buffer.byteLength;\n if (bytes > maximumBytes || bytes > expected.bytes) integrity(`${name} exceeds its manifest`);\n hash.update(buffer);\n }\n const after = await handle.stat();\n if (after.size !== before.size || bytes !== before.size)\n integrity(`${name} changed while hashing`);\n const digest = `sha256:${hash.digest(\"hex\")}`;\n if (digest !== expected.sha256) integrity(`${name} digest does not match its manifest`);\n } catch (cause) {\n if (cause instanceof ArtifactRuntimeError) throw cause;\n throw new ArtifactRuntimeError(\"ARTIFACT_RUNTIME_UNAVAILABLE\", `Could not verify ${name}`, {\n cause,\n });\n } finally {\n await handle?.close();\n }\n}\n\nfunction requiredEnvironmentPath(environment: RuntimeEnvironment, name: string): string {\n const value = environment[name];\n if (typeof value !== \"string\" || value.length === 0) {\n unavailable(`${name} is required; runtime discovery never downloads or guesses an asset`);\n }\n return value;\n}\n\nexport type LinuxLibcRuntimeEvidence = Readonly<{\n arch: string;\n versions: Readonly<Record<string, string | undefined>>;\n report?: Readonly<{\n header?: Readonly<{\n glibcVersionRuntime?: unknown;\n release?: Readonly<{ sourceUrl?: unknown }>;\n }>;\n sharedObjects?: unknown;\n }>;\n}>;\n\n/** Resolves only mutually consistent evidence about the running Linux binary. */\nexport function resolveLinuxLibcFromRuntimeEvidence(\n evidence: LinuxLibcRuntimeEvidence,\n): \"gnu\" | \"musl\" {\n const candidates = new Set<\"gnu\" | \"musl\">();\n if (nonempty(evidence.versions.musl)) candidates.add(\"musl\");\n if (nonempty(evidence.report?.header?.glibcVersionRuntime)) candidates.add(\"gnu\");\n if (\n Array.isArray(evidence.report?.sharedObjects) &&\n evidence.report.sharedObjects.some(\n (entry) =>\n typeof entry === \"string\" &&\n /(?:^|[\\\\/])ld-musl-(?:aarch64|x86_64)\\.so(?:\\.\\d+)?$/u.test(entry),\n )\n ) {\n candidates.add(\"musl\");\n }\n const bunArchiveLibc = libcFromOfficialBunRelease(\n evidence.report?.header?.release?.sourceUrl,\n evidence.versions.bun,\n evidence.arch,\n );\n if (bunArchiveLibc) candidates.add(bunArchiveLibc);\n if (candidates.size === 1) return [...candidates][0]!;\n throw new ArtifactRuntimeError(\n \"ARTIFACT_RUNTIME_UNSUPPORTED_TARGET\",\n \"Could not prove whether this Linux host uses glibc or musl\",\n );\n}\n\nfunction detectLinuxLibc(): \"gnu\" | \"musl\" {\n const report = process.report?.getReport() as LinuxLibcRuntimeEvidence[\"report\"];\n return resolveLinuxLibcFromRuntimeEvidence({\n arch: process.arch,\n versions: process.versions as Record<string, string | undefined>,\n ...(report ? { report } : {}),\n });\n}\n\nfunction libcFromOfficialBunRelease(\n sourceUrl: unknown,\n bunVersion: string | undefined,\n arch: string,\n): \"gnu\" | \"musl\" | undefined {\n if (!nonempty(sourceUrl) || !nonempty(bunVersion)) return undefined;\n let url: URL;\n try {\n url = new URL(sourceUrl);\n } catch {\n return undefined;\n }\n if (\n url.protocol !== \"https:\" ||\n url.hostname !== \"github.com\" ||\n url.username ||\n url.password ||\n url.search ||\n url.hash\n ) {\n return undefined;\n }\n const match = /^\\/oven-sh\\/bun\\/releases\\/download\\/bun-v([^/]+)\\/bun-linux-([^/]+)\\.zip$/u.exec(\n url.pathname,\n );\n if (!match || match[1] !== bunVersion) return undefined;\n const archiveTarget = match[2]!;\n const validTarget =\n arch === \"arm64\"\n ? /^aarch64(?:-musl)?(?:-profile)?$/u.test(archiveTarget)\n : arch === \"x64\"\n ? /^x64(?:-musl)?(?:-baseline)?(?:-profile)?$/u.test(archiveTarget)\n : false;\n if (!validTarget) return undefined;\n return archiveTarget.split(\"-\").includes(\"musl\") ? \"musl\" : \"gnu\";\n}\n\nfunction nonempty(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nexport function probeVerifiedArtifactSkillFacade(\n module: Record<string, unknown>,\n location: Pick<VerifiedArtifactRuntimeLocation, \"target\" | \"kernel\">,\n): void {\n const getRuntime = module.getConfiguredArtifactRuntime;\n if (typeof getRuntime !== \"function\") {\n incompatible(\"skill facade bootstrap does not expose getConfiguredArtifactRuntime()\");\n }\n const runtime = getRuntime();\n if (typeof runtime !== \"object\" || runtime === null) {\n incompatible(\"skill facade bootstrap did not configure its exact native runtime\");\n }\n const record = runtime as Record<string, unknown>;\n if (\n record.kind !== \"native\" ||\n record.target !== location.target ||\n record.buildIdentity !== location.kernel.buildIdentity ||\n typeof record.capabilities !== \"object\" ||\n record.capabilities === null\n ) {\n incompatible(\"skill facade bootstrap configured an incompatible runtime\");\n }\n const workbookFactory = module.Workbook as { create?: () => unknown } | undefined;\n const diagnostics = module.getArtifactCompositeDiagnostics;\n const snapshot = module.createArtifactSnapshot;\n const dispose = module.disposeArtifact;\n if (\n typeof workbookFactory?.create !== \"function\" ||\n typeof diagnostics !== \"function\" ||\n typeof snapshot !== \"function\" ||\n typeof dispose !== \"function\"\n ) {\n incompatible(\"skill facade bootstrap is missing its native workbook health surface\");\n }\n const workbook = workbookFactory.create();\n try {\n const proof = diagnostics(workbook) as Record<string, unknown>;\n if (\n proof.runtimeTarget !== location.target ||\n proof.runtimeBuildIdentity !== location.kernel.buildIdentity ||\n typeof proof.nativeStateHash !== \"string\"\n ) {\n incompatible(\"skill facade workbook health proof does not match the pinned runtime\");\n }\n } finally {\n dispose(workbook);\n }\n}\n\nfunction defaultImporter(specifier: string): Promise<unknown> {\n return import(/* @vite-ignore */ specifier);\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction sameBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.byteLength !== right.byteLength) return false;\n return left.every((value, index) => value === right[index]);\n}\n\nfunction integrity(message: string): never {\n throw new ArtifactRuntimeError(\"ARTIFACT_RUNTIME_INTEGRITY\", message);\n}\n\nfunction unavailable(message: string): never {\n throw new ArtifactRuntimeError(\"ARTIFACT_RUNTIME_UNAVAILABLE\", message);\n}\n\nfunction incompatible(message: string): never {\n throw new ArtifactRuntimeError(\"ARTIFACT_RUNTIME_INCOMPATIBLE\", message);\n}\n"],"mappings":"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","names":[]}
|