@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,613 @@
|
|
|
1
|
+
import {
|
|
2
|
+
doctorVerifiedArtifactRuntime,
|
|
3
|
+
loadVerifiedArtifactKernelRuntime,
|
|
4
|
+
probeVerifiedArtifactSkillFacade,
|
|
5
|
+
resolveCurrentArtifactRuntimeTarget,
|
|
6
|
+
runArtifactRuntimeCli
|
|
7
|
+
} from "./chunk-ZCJYRJGB.js";
|
|
8
|
+
import {
|
|
9
|
+
ARTIFACT_RUNTIME_ENVIRONMENT,
|
|
10
|
+
ARTIFACT_RUNTIME_TARGETS,
|
|
11
|
+
ArtifactRuntimeError,
|
|
12
|
+
artifactRuntimeTarget,
|
|
13
|
+
loadArtifactKernelRuntime,
|
|
14
|
+
validateArtifactKernelPackageManifest
|
|
15
|
+
} from "./chunk-N2IHNWBS.js";
|
|
16
|
+
|
|
17
|
+
// src/runtime-development.ts
|
|
18
|
+
import { createHash } from "crypto";
|
|
19
|
+
import { open, realpath, stat } from "fs/promises";
|
|
20
|
+
import { isAbsolute, relative, resolve } from "path";
|
|
21
|
+
import { pathToFileURL } from "url";
|
|
22
|
+
|
|
23
|
+
// src/runtime-receipt.ts
|
|
24
|
+
var NATIVE_ASSET = "opengeni_artifact_kernel.node";
|
|
25
|
+
var WASM_RUNTIME_FILES = [
|
|
26
|
+
"artifact_kernel.js",
|
|
27
|
+
"artifact_kernel_bg.wasm",
|
|
28
|
+
"artifact_kernel_document.js",
|
|
29
|
+
"artifact_kernel_document_bg.wasm",
|
|
30
|
+
"artifact_kernel_presentation.js",
|
|
31
|
+
"artifact_kernel_presentation_bg.wasm",
|
|
32
|
+
"artifact_kernel_spreadsheet.js",
|
|
33
|
+
"artifact_kernel_spreadsheet_bg.wasm"
|
|
34
|
+
];
|
|
35
|
+
var MAX_CAPABILITIES_BYTES = 1024 * 1024;
|
|
36
|
+
function validateArtifactKernelBuildReceipt(value, expectedTarget) {
|
|
37
|
+
const record = exactRecord(
|
|
38
|
+
value,
|
|
39
|
+
[
|
|
40
|
+
"schemaVersion",
|
|
41
|
+
"producer",
|
|
42
|
+
"target",
|
|
43
|
+
"kind",
|
|
44
|
+
"buildIdentity",
|
|
45
|
+
"capabilities",
|
|
46
|
+
"runtimeFiles"
|
|
47
|
+
],
|
|
48
|
+
"target build receipt"
|
|
49
|
+
);
|
|
50
|
+
if (record.schemaVersion !== 1 || record.producer !== "opengeni-artifact-kernel-smoke-v1") {
|
|
51
|
+
invalid("target build receipt schema/producer is invalid");
|
|
52
|
+
}
|
|
53
|
+
if (typeof record.target !== "string" || !ARTIFACT_RUNTIME_TARGETS.includes(record.target)) {
|
|
54
|
+
invalid("target build receipt target is invalid");
|
|
55
|
+
}
|
|
56
|
+
const descriptor = artifactRuntimeTarget(record.target);
|
|
57
|
+
if (expectedTarget !== void 0 && descriptor.target !== expectedTarget) {
|
|
58
|
+
invalid(`target build receipt ${descriptor.target} does not match ${expectedTarget}`);
|
|
59
|
+
}
|
|
60
|
+
if (record.kind !== descriptor.kind) invalid("target build receipt kind is invalid");
|
|
61
|
+
if (typeof record.buildIdentity !== "string" || record.buildIdentity.length === 0 || record.buildIdentity.length > 512) {
|
|
62
|
+
invalid("target build receipt identity is invalid");
|
|
63
|
+
}
|
|
64
|
+
const capabilities = fileProof(record.capabilities, "target build capabilities", false);
|
|
65
|
+
if (capabilities.bytes > MAX_CAPABILITIES_BYTES) {
|
|
66
|
+
invalid("target build capabilities exceed their maximum size");
|
|
67
|
+
}
|
|
68
|
+
if (!Array.isArray(record.runtimeFiles) || record.runtimeFiles.length === 0 || record.runtimeFiles.length > 8) {
|
|
69
|
+
invalid("target build receipt runtimeFiles is invalid");
|
|
70
|
+
}
|
|
71
|
+
const runtimeFiles = record.runtimeFiles.map(
|
|
72
|
+
(entry, index) => fileProof(entry, `target build runtime file ${index}`, true)
|
|
73
|
+
);
|
|
74
|
+
if (!runtimeFiles.every((entry, index) => index === 0 || runtimeFiles[index - 1].path < entry.path)) {
|
|
75
|
+
invalid("target build receipt runtimeFiles must be strictly sorted");
|
|
76
|
+
}
|
|
77
|
+
const expectedPaths = descriptor.kind === "native" ? [NATIVE_ASSET] : WASM_RUNTIME_FILES;
|
|
78
|
+
if (JSON.stringify(runtimeFiles.map(({ path }) => path)) !== JSON.stringify(expectedPaths)) {
|
|
79
|
+
invalid("target build receipt runtimeFiles do not match the target package");
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
schemaVersion: 1,
|
|
83
|
+
producer: "opengeni-artifact-kernel-smoke-v1",
|
|
84
|
+
target: descriptor.target,
|
|
85
|
+
kind: descriptor.kind,
|
|
86
|
+
buildIdentity: record.buildIdentity,
|
|
87
|
+
capabilities: { bytes: capabilities.bytes, sha256: capabilities.sha256 },
|
|
88
|
+
runtimeFiles
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function canonicalArtifactKernelBuildReceiptBytes(value) {
|
|
92
|
+
const receipt = validateArtifactKernelBuildReceipt(value);
|
|
93
|
+
return new TextEncoder().encode(`${JSON.stringify(receipt, null, 2)}
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
96
|
+
function fileProof(value, name, includePath) {
|
|
97
|
+
const record = exactRecord(
|
|
98
|
+
value,
|
|
99
|
+
includePath ? ["path", "bytes", "sha256"] : ["bytes", "sha256"],
|
|
100
|
+
name
|
|
101
|
+
);
|
|
102
|
+
const bytes = record.bytes;
|
|
103
|
+
const digest2 = record.sha256;
|
|
104
|
+
if (!Number.isSafeInteger(bytes) || bytes <= 0) invalid(`${name} bytes is invalid`);
|
|
105
|
+
if (typeof digest2 !== "string" || !/^sha256:[0-9a-f]{64}$/u.test(digest2)) {
|
|
106
|
+
invalid(`${name} digest is invalid`);
|
|
107
|
+
}
|
|
108
|
+
if (!includePath) return { bytes, sha256: digest2 };
|
|
109
|
+
const path = record.path;
|
|
110
|
+
if (typeof path !== "string" || path.length === 0 || path.includes("/") || path.includes("\\") || path === "." || path === "..") {
|
|
111
|
+
invalid(`${name} path is invalid`);
|
|
112
|
+
}
|
|
113
|
+
return { path, bytes, sha256: digest2 };
|
|
114
|
+
}
|
|
115
|
+
function exactRecord(value, keys, name) {
|
|
116
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
117
|
+
invalid(`${name} is invalid`);
|
|
118
|
+
}
|
|
119
|
+
const record = value;
|
|
120
|
+
if (JSON.stringify(Object.keys(record).sort()) !== JSON.stringify([...keys].sort())) {
|
|
121
|
+
invalid(`${name} has unexpected fields`);
|
|
122
|
+
}
|
|
123
|
+
return record;
|
|
124
|
+
}
|
|
125
|
+
function invalid(message) {
|
|
126
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_MANIFEST_INVALID", message);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// src/runtime-development.ts
|
|
130
|
+
var DEVELOPMENT_ARTIFACT_RUNTIME_ENVIRONMENT = {
|
|
131
|
+
manifest: "OPENGENI_ARTIFACT_DEVELOPMENT_RUNTIME_MANIFEST"
|
|
132
|
+
};
|
|
133
|
+
var MAX_MANIFEST_BYTES = 256 * 1024;
|
|
134
|
+
var MAX_IDENTITY_BYTES = 64 * 1024;
|
|
135
|
+
var MAX_RECEIPT_BYTES = 256 * 1024;
|
|
136
|
+
var MAX_JAVASCRIPT_BYTES = 32 * 1024 * 1024;
|
|
137
|
+
var MAX_KERNEL_ASSET_BYTES = 512 * 1024 * 1024;
|
|
138
|
+
var MAX_MATERIALIZER_EXECUTABLE_BYTES = 512 * 1024 * 1024;
|
|
139
|
+
function isArtifactRuntimeConfigured(environment = process.env) {
|
|
140
|
+
return [
|
|
141
|
+
ARTIFACT_RUNTIME_ENVIRONMENT.manifest,
|
|
142
|
+
ARTIFACT_RUNTIME_ENVIRONMENT.toolEntrypoint,
|
|
143
|
+
DEVELOPMENT_ARTIFACT_RUNTIME_ENVIRONMENT.manifest
|
|
144
|
+
].some((name) => typeof environment[name] === "string");
|
|
145
|
+
}
|
|
146
|
+
function validateDevelopmentArtifactRuntimeManifest(value, expectedTarget) {
|
|
147
|
+
const record = exactRecord2(
|
|
148
|
+
value,
|
|
149
|
+
[
|
|
150
|
+
"schemaVersion",
|
|
151
|
+
"mode",
|
|
152
|
+
"target",
|
|
153
|
+
"sourceFingerprint",
|
|
154
|
+
"artifactTool",
|
|
155
|
+
"artifactToolIdentity",
|
|
156
|
+
"receipt",
|
|
157
|
+
"skillFacadeEntrypoint",
|
|
158
|
+
"materializerExecutable",
|
|
159
|
+
"kernelPackageRoot",
|
|
160
|
+
"kernel"
|
|
161
|
+
],
|
|
162
|
+
"development runtime manifest"
|
|
163
|
+
);
|
|
164
|
+
if (record.schemaVersion !== 1 || record.mode !== "development-current-host") {
|
|
165
|
+
invalid2("development runtime schema/mode is invalid");
|
|
166
|
+
}
|
|
167
|
+
if (record.target === "wasm-web") invalid2("development server runtime must be native");
|
|
168
|
+
const kernel = validateArtifactKernelPackageManifest(record.kernel);
|
|
169
|
+
if (kernel.kind !== "native" || kernel.target !== record.target) {
|
|
170
|
+
invalid2("development runtime target differs from its native kernel");
|
|
171
|
+
}
|
|
172
|
+
if (expectedTarget && kernel.target !== expectedTarget) {
|
|
173
|
+
invalid2(`development runtime target ${kernel.target} does not match ${expectedTarget}`);
|
|
174
|
+
}
|
|
175
|
+
const artifactTool = exactRecord2(
|
|
176
|
+
record.artifactTool,
|
|
177
|
+
["packageName", "packageVersion"],
|
|
178
|
+
"development artifact-tool identity"
|
|
179
|
+
);
|
|
180
|
+
if (artifactTool.packageName !== "@opengeni/artifact-tool" || artifactTool.packageVersion !== kernel.artifactToolVersion) {
|
|
181
|
+
invalid2("development artifact-tool identity differs from its kernel");
|
|
182
|
+
}
|
|
183
|
+
return Object.freeze({
|
|
184
|
+
schemaVersion: 1,
|
|
185
|
+
mode: "development-current-host",
|
|
186
|
+
target: kernel.target,
|
|
187
|
+
sourceFingerprint: digest(record.sourceFingerprint, "development source fingerprint"),
|
|
188
|
+
artifactTool: Object.freeze({
|
|
189
|
+
packageName: "@opengeni/artifact-tool",
|
|
190
|
+
packageVersion: kernel.artifactToolVersion
|
|
191
|
+
}),
|
|
192
|
+
artifactToolIdentity: fileDescriptor(
|
|
193
|
+
record.artifactToolIdentity,
|
|
194
|
+
"development artifact-tool identity file"
|
|
195
|
+
),
|
|
196
|
+
receipt: fileDescriptor(record.receipt, "development build receipt"),
|
|
197
|
+
skillFacadeEntrypoint: fileDescriptor(record.skillFacadeEntrypoint, "development skill facade"),
|
|
198
|
+
materializerExecutable: fileDescriptor(
|
|
199
|
+
record.materializerExecutable,
|
|
200
|
+
"development materializer executable"
|
|
201
|
+
),
|
|
202
|
+
kernelPackageRoot: safeRelativePath(record.kernelPackageRoot, "development kernel root"),
|
|
203
|
+
kernel
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
function canonicalDevelopmentArtifactRuntimeManifestBytes(value) {
|
|
207
|
+
const manifest = validateDevelopmentArtifactRuntimeManifest(value);
|
|
208
|
+
return new TextEncoder().encode(`${JSON.stringify(manifest, null, 2)}
|
|
209
|
+
`);
|
|
210
|
+
}
|
|
211
|
+
function canonicalDevelopmentArtifactToolIdentityBytes(artifactTool) {
|
|
212
|
+
if (artifactTool.packageName !== "@opengeni/artifact-tool" || !stableVersion(artifactTool.packageVersion)) {
|
|
213
|
+
invalid2("development artifact-tool identity is invalid");
|
|
214
|
+
}
|
|
215
|
+
return new TextEncoder().encode(`${JSON.stringify(artifactTool, null, 2)}
|
|
216
|
+
`);
|
|
217
|
+
}
|
|
218
|
+
async function locateVerifiedDevelopmentArtifactRuntime(options = {}) {
|
|
219
|
+
const environment = options.environment ?? process.env;
|
|
220
|
+
assertDevelopmentEnvironment(environment);
|
|
221
|
+
const expectedTarget = options.expectedTarget ?? currentNativeTarget();
|
|
222
|
+
const manifestInput = requiredPath(
|
|
223
|
+
environment,
|
|
224
|
+
DEVELOPMENT_ARTIFACT_RUNTIME_ENVIRONMENT.manifest
|
|
225
|
+
);
|
|
226
|
+
const facadeInput = requiredPath(environment, ARTIFACT_RUNTIME_ENVIRONMENT.toolEntrypoint);
|
|
227
|
+
const manifestPath = await canonicalFile(manifestInput, "development runtime manifest");
|
|
228
|
+
const manifestBytes = await readBoundedFile(
|
|
229
|
+
manifestPath,
|
|
230
|
+
MAX_MANIFEST_BYTES,
|
|
231
|
+
"development runtime manifest"
|
|
232
|
+
);
|
|
233
|
+
const manifest = validateDevelopmentArtifactRuntimeManifest(
|
|
234
|
+
parseJson(manifestBytes, "development runtime manifest"),
|
|
235
|
+
expectedTarget
|
|
236
|
+
);
|
|
237
|
+
if (!sameBytes(manifestBytes, canonicalDevelopmentArtifactRuntimeManifestBytes(manifest))) {
|
|
238
|
+
integrity("Development runtime manifest is not canonical");
|
|
239
|
+
}
|
|
240
|
+
const root = await realpath(resolve(manifestPath, ".."));
|
|
241
|
+
const identityPath = await confinedFile(
|
|
242
|
+
root,
|
|
243
|
+
manifest.artifactToolIdentity.path,
|
|
244
|
+
"artifact-tool identity"
|
|
245
|
+
);
|
|
246
|
+
const receiptPath = await confinedFile(root, manifest.receipt.path, "kernel build receipt");
|
|
247
|
+
const skillFacadeEntrypoint = await confinedFile(
|
|
248
|
+
root,
|
|
249
|
+
manifest.skillFacadeEntrypoint.path,
|
|
250
|
+
"development skill facade"
|
|
251
|
+
);
|
|
252
|
+
const materializerExecutable = await confinedFile(
|
|
253
|
+
root,
|
|
254
|
+
manifest.materializerExecutable.path,
|
|
255
|
+
"development materializer executable"
|
|
256
|
+
);
|
|
257
|
+
const configuredFacade = await canonicalFile(facadeInput, "configured development skill facade");
|
|
258
|
+
if (configuredFacade !== skillFacadeEntrypoint) {
|
|
259
|
+
integrity(
|
|
260
|
+
`${ARTIFACT_RUNTIME_ENVIRONMENT.toolEntrypoint} differs from the development manifest`
|
|
261
|
+
);
|
|
262
|
+
}
|
|
263
|
+
const kernelRoot = await confinedDirectory(
|
|
264
|
+
root,
|
|
265
|
+
manifest.kernelPackageRoot,
|
|
266
|
+
"kernel package root"
|
|
267
|
+
);
|
|
268
|
+
const kernelEntrypoint = await confinedFile(
|
|
269
|
+
kernelRoot,
|
|
270
|
+
manifest.kernel.entrypoint.path,
|
|
271
|
+
"kernel entrypoint"
|
|
272
|
+
);
|
|
273
|
+
const kernelAsset = await confinedFile(kernelRoot, manifest.kernel.asset.path, "kernel asset");
|
|
274
|
+
const kernelSupportFiles = await Promise.all(
|
|
275
|
+
manifest.kernel.supportFiles.map(
|
|
276
|
+
(file, index) => confinedFile(kernelRoot, file.path, `kernel support file ${index}`)
|
|
277
|
+
)
|
|
278
|
+
);
|
|
279
|
+
const identityBytes = await readAndVerify(
|
|
280
|
+
identityPath,
|
|
281
|
+
manifest.artifactToolIdentity,
|
|
282
|
+
MAX_IDENTITY_BYTES,
|
|
283
|
+
"artifact-tool identity"
|
|
284
|
+
);
|
|
285
|
+
if (!sameBytes(identityBytes, canonicalDevelopmentArtifactToolIdentityBytes(manifest.artifactTool))) {
|
|
286
|
+
integrity("Development artifact-tool identity bytes differ from the manifest");
|
|
287
|
+
}
|
|
288
|
+
const receiptBytes = await readAndVerify(
|
|
289
|
+
receiptPath,
|
|
290
|
+
manifest.receipt,
|
|
291
|
+
MAX_RECEIPT_BYTES,
|
|
292
|
+
"kernel build receipt"
|
|
293
|
+
);
|
|
294
|
+
const receipt = validateArtifactKernelBuildReceipt(
|
|
295
|
+
parseJson(receiptBytes, "kernel build receipt"),
|
|
296
|
+
manifest.target
|
|
297
|
+
);
|
|
298
|
+
if (!sameBytes(receiptBytes, canonicalArtifactKernelBuildReceiptBytes(receipt))) {
|
|
299
|
+
integrity("Development kernel receipt is not canonical");
|
|
300
|
+
}
|
|
301
|
+
assertReceiptMatchesKernel(receipt, manifest.kernel);
|
|
302
|
+
await verifyFile(
|
|
303
|
+
skillFacadeEntrypoint,
|
|
304
|
+
manifest.skillFacadeEntrypoint,
|
|
305
|
+
MAX_JAVASCRIPT_BYTES,
|
|
306
|
+
"development skill facade"
|
|
307
|
+
);
|
|
308
|
+
await verifyFile(
|
|
309
|
+
materializerExecutable,
|
|
310
|
+
manifest.materializerExecutable,
|
|
311
|
+
MAX_MATERIALIZER_EXECUTABLE_BYTES,
|
|
312
|
+
"development materializer executable"
|
|
313
|
+
);
|
|
314
|
+
await verifyFile(
|
|
315
|
+
kernelEntrypoint,
|
|
316
|
+
manifest.kernel.entrypoint,
|
|
317
|
+
MAX_JAVASCRIPT_BYTES,
|
|
318
|
+
"kernel entrypoint"
|
|
319
|
+
);
|
|
320
|
+
await verifyFile(kernelAsset, manifest.kernel.asset, MAX_KERNEL_ASSET_BYTES, "kernel asset");
|
|
321
|
+
for (const [index, path] of kernelSupportFiles.entries()) {
|
|
322
|
+
await verifyFile(
|
|
323
|
+
path,
|
|
324
|
+
manifest.kernel.supportFiles[index],
|
|
325
|
+
MAX_JAVASCRIPT_BYTES,
|
|
326
|
+
`kernel support file ${index}`
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
return Object.freeze({
|
|
330
|
+
schemaVersion: 1,
|
|
331
|
+
mode: "development-current-host",
|
|
332
|
+
target: manifest.target,
|
|
333
|
+
manifestPath,
|
|
334
|
+
receiptPath,
|
|
335
|
+
artifactTool: Object.freeze({ ...manifest.artifactTool }),
|
|
336
|
+
skillFacadeEntrypoint,
|
|
337
|
+
materializerExecutable,
|
|
338
|
+
kernel: Object.freeze({
|
|
339
|
+
packageName: manifest.kernel.packageName,
|
|
340
|
+
packageVersion: manifest.kernel.packageVersion,
|
|
341
|
+
entrypoint: kernelEntrypoint,
|
|
342
|
+
asset: kernelAsset,
|
|
343
|
+
supportFiles: Object.freeze(kernelSupportFiles),
|
|
344
|
+
buildIdentity: manifest.kernel.buildIdentity
|
|
345
|
+
})
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
async function doctorVerifiedDevelopmentArtifactRuntime(options = {}) {
|
|
349
|
+
const location = await locateVerifiedDevelopmentArtifactRuntime(options);
|
|
350
|
+
let imported;
|
|
351
|
+
try {
|
|
352
|
+
imported = await (options.importer ?? defaultImporter)(
|
|
353
|
+
pathToFileURL(location.skillFacadeEntrypoint).href
|
|
354
|
+
);
|
|
355
|
+
} catch (cause) {
|
|
356
|
+
throw new ArtifactRuntimeError(
|
|
357
|
+
"ARTIFACT_RUNTIME_UNAVAILABLE",
|
|
358
|
+
"Verified development skill facade could not be evaluated",
|
|
359
|
+
{ cause }
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
if (!isRecord(imported)) incompatible("development skill facade returned an invalid module");
|
|
363
|
+
if (options.probe) await options.probe(imported);
|
|
364
|
+
else probeVerifiedArtifactSkillFacade(imported, location);
|
|
365
|
+
return location;
|
|
366
|
+
}
|
|
367
|
+
async function loadVerifiedDevelopmentArtifactKernelRuntime(options = {}) {
|
|
368
|
+
const environment = options.environment ?? process.env;
|
|
369
|
+
const expectedTarget = options.expectedTarget ?? currentNativeTarget();
|
|
370
|
+
const before = await locateVerifiedDevelopmentArtifactRuntime({ environment, expectedTarget });
|
|
371
|
+
const manifest = validateDevelopmentArtifactRuntimeManifest(
|
|
372
|
+
parseJson(
|
|
373
|
+
await readBoundedFile(
|
|
374
|
+
before.manifestPath,
|
|
375
|
+
MAX_MANIFEST_BYTES,
|
|
376
|
+
"development runtime manifest"
|
|
377
|
+
),
|
|
378
|
+
"development runtime manifest"
|
|
379
|
+
),
|
|
380
|
+
expectedTarget
|
|
381
|
+
);
|
|
382
|
+
const kernelRoot = pathToFileURL(
|
|
383
|
+
`${resolve(before.manifestPath, "..", manifest.kernelPackageRoot)}/`
|
|
384
|
+
);
|
|
385
|
+
const dependencies = {
|
|
386
|
+
target: {
|
|
387
|
+
target: manifest.target,
|
|
388
|
+
kind: "native",
|
|
389
|
+
packageName: manifest.kernel.packageName,
|
|
390
|
+
platform: manifest.target.startsWith("darwin-") ? "darwin" : manifest.target.startsWith("linux-") ? "linux" : "win32",
|
|
391
|
+
arch: manifest.target.includes("arm64") ? "arm64" : "x64",
|
|
392
|
+
...manifest.target.includes("-gnu") ? { libc: "gnu" } : manifest.target.includes("-musl") ? { libc: "musl" } : {}
|
|
393
|
+
},
|
|
394
|
+
kernelEntrypoint: new URL(manifest.kernel.entrypoint.path, kernelRoot),
|
|
395
|
+
manifest: {
|
|
396
|
+
kernel: manifest.kernel
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
const runtime = await loadArtifactKernelRuntime(dependencies);
|
|
400
|
+
const after = await locateVerifiedDevelopmentArtifactRuntime({ environment, expectedTarget });
|
|
401
|
+
if (!sameJson(before, after) || runtime.kind !== "native" || runtime.target !== after.target || runtime.buildIdentity !== after.kernel.buildIdentity) {
|
|
402
|
+
integrity("Loaded development kernel differs from its verified installation");
|
|
403
|
+
}
|
|
404
|
+
return Object.freeze({ location: after, runtime });
|
|
405
|
+
}
|
|
406
|
+
async function doctorConfiguredArtifactRuntime(environment = process.env) {
|
|
407
|
+
return usesDevelopmentRuntime(environment) ? await doctorVerifiedDevelopmentArtifactRuntime({ environment }) : await doctorVerifiedArtifactRuntime({ environment });
|
|
408
|
+
}
|
|
409
|
+
async function loadConfiguredArtifactKernelRuntime(environment = process.env) {
|
|
410
|
+
return usesDevelopmentRuntime(environment) ? await loadVerifiedDevelopmentArtifactKernelRuntime({ environment }) : await loadVerifiedArtifactKernelRuntime({ environment });
|
|
411
|
+
}
|
|
412
|
+
async function runConfiguredArtifactRuntimeCli(args, environment = process.env) {
|
|
413
|
+
if (!usesDevelopmentRuntime(environment)) return await runArtifactRuntimeCli(args, environment);
|
|
414
|
+
const [command, format, ...rest] = args;
|
|
415
|
+
if (command !== "locate" && command !== "doctor" || format !== "--json" || rest.length > 0) {
|
|
416
|
+
invalid2("Usage: opengeni-artifact-runtime <locate|doctor> --json");
|
|
417
|
+
}
|
|
418
|
+
const location = command === "doctor" ? await doctorVerifiedDevelopmentArtifactRuntime({ environment }) : await locateVerifiedDevelopmentArtifactRuntime({ environment });
|
|
419
|
+
return `${JSON.stringify(location)}
|
|
420
|
+
`;
|
|
421
|
+
}
|
|
422
|
+
function usesDevelopmentRuntime(environment) {
|
|
423
|
+
return Boolean(environment[DEVELOPMENT_ARTIFACT_RUNTIME_ENVIRONMENT.manifest]);
|
|
424
|
+
}
|
|
425
|
+
function assertDevelopmentEnvironment(environment) {
|
|
426
|
+
if (environment.NODE_ENV === "production") {
|
|
427
|
+
throw new ArtifactRuntimeError(
|
|
428
|
+
"ARTIFACT_RUNTIME_UNAVAILABLE",
|
|
429
|
+
"Development artifact runtime is forbidden when NODE_ENV=production"
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
if (environment[ARTIFACT_RUNTIME_ENVIRONMENT.manifest]) {
|
|
433
|
+
invalid2("Production and development artifact runtime manifests cannot both be configured");
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
function currentNativeTarget() {
|
|
437
|
+
const target = resolveCurrentArtifactRuntimeTarget();
|
|
438
|
+
if (target === "wasm-web") {
|
|
439
|
+
throw new ArtifactRuntimeError(
|
|
440
|
+
"ARTIFACT_RUNTIME_UNSUPPORTED_TARGET",
|
|
441
|
+
"Development server runtime requires a native host"
|
|
442
|
+
);
|
|
443
|
+
}
|
|
444
|
+
return target;
|
|
445
|
+
}
|
|
446
|
+
function assertReceiptMatchesKernel(receipt, kernel) {
|
|
447
|
+
const runtimeFiles = [kernel.asset, ...kernel.supportFiles].sort(
|
|
448
|
+
(left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0
|
|
449
|
+
);
|
|
450
|
+
if (receipt.buildIdentity !== kernel.buildIdentity || !sameJson(receipt.runtimeFiles, runtimeFiles)) {
|
|
451
|
+
integrity("Development build receipt differs from its kernel manifest");
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
async function confinedFile(root, path, name) {
|
|
455
|
+
return await confined(root, path, name, "file");
|
|
456
|
+
}
|
|
457
|
+
async function confinedDirectory(root, path, name) {
|
|
458
|
+
return await confined(root, path, name, "directory");
|
|
459
|
+
}
|
|
460
|
+
async function confined(root, path, name, kind) {
|
|
461
|
+
const candidate = await realpath(resolve(root, path)).catch((cause) => {
|
|
462
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", `${name} is unavailable`, {
|
|
463
|
+
cause
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
const fromRoot = relative(root, candidate);
|
|
467
|
+
if (fromRoot === ".." || fromRoot.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) || isAbsolute(fromRoot)) {
|
|
468
|
+
invalid2(`${name} resolves outside the development installation`);
|
|
469
|
+
}
|
|
470
|
+
const metadata = await stat(candidate);
|
|
471
|
+
if (kind === "file" && !metadata.isFile() || kind === "directory" && !metadata.isDirectory()) {
|
|
472
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", `${name} is not a ${kind}`);
|
|
473
|
+
}
|
|
474
|
+
return candidate;
|
|
475
|
+
}
|
|
476
|
+
async function canonicalFile(input, name) {
|
|
477
|
+
if (!isAbsolute(input)) invalid2(`${name} path must be absolute`);
|
|
478
|
+
try {
|
|
479
|
+
const path = await realpath(input);
|
|
480
|
+
if (!(await stat(path)).isFile()) throw new Error("not a file");
|
|
481
|
+
return path;
|
|
482
|
+
} catch (cause) {
|
|
483
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", `${name} is unavailable`, {
|
|
484
|
+
cause
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
async function readAndVerify(path, expected, maximumBytes, name) {
|
|
489
|
+
const bytes = await readBoundedFile(path, maximumBytes, name);
|
|
490
|
+
if (bytes.byteLength !== expected.bytes || sha256(bytes) !== expected.sha256) {
|
|
491
|
+
integrity(`${name} differs from the development manifest`);
|
|
492
|
+
}
|
|
493
|
+
return bytes;
|
|
494
|
+
}
|
|
495
|
+
async function verifyFile(path, expected, maximumBytes, name) {
|
|
496
|
+
await readAndVerify(path, expected, maximumBytes, name);
|
|
497
|
+
}
|
|
498
|
+
async function readBoundedFile(path, maximumBytes, name) {
|
|
499
|
+
let handle;
|
|
500
|
+
try {
|
|
501
|
+
handle = await open(path, "r");
|
|
502
|
+
const before = await handle.stat();
|
|
503
|
+
if (!before.isFile() || before.size <= 0 || before.size > maximumBytes) {
|
|
504
|
+
integrity(`${name} size is invalid`);
|
|
505
|
+
}
|
|
506
|
+
const bytes = new Uint8Array(await handle.readFile());
|
|
507
|
+
const after = await handle.stat();
|
|
508
|
+
if (after.size !== before.size || bytes.byteLength !== before.size) {
|
|
509
|
+
integrity(`${name} changed while reading`);
|
|
510
|
+
}
|
|
511
|
+
return bytes;
|
|
512
|
+
} catch (cause) {
|
|
513
|
+
if (cause instanceof ArtifactRuntimeError) throw cause;
|
|
514
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", `Could not read ${name}`, {
|
|
515
|
+
cause
|
|
516
|
+
});
|
|
517
|
+
} finally {
|
|
518
|
+
await handle?.close();
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
function fileDescriptor(value, name) {
|
|
522
|
+
const record = exactRecord2(value, ["path", "bytes", "sha256"], name);
|
|
523
|
+
if (!Number.isSafeInteger(record.bytes) || record.bytes <= 0) {
|
|
524
|
+
invalid2(`${name} byte size is invalid`);
|
|
525
|
+
}
|
|
526
|
+
return Object.freeze({
|
|
527
|
+
path: safeRelativePath(record.path, `${name} path`),
|
|
528
|
+
bytes: record.bytes,
|
|
529
|
+
sha256: digest(record.sha256, `${name} digest`)
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
function safeRelativePath(value, name) {
|
|
533
|
+
if (typeof value !== "string" || value.length === 0 || value.length > 1024 || value.startsWith("/") || value.startsWith("\\") || value.includes("\\") || value.split("/").some((part) => part === "" || part === "." || part === "..") || /[%?#\0]/u.test(value)) {
|
|
534
|
+
invalid2(`${name} must be a normalized relative path`);
|
|
535
|
+
}
|
|
536
|
+
return value;
|
|
537
|
+
}
|
|
538
|
+
function digest(value, name) {
|
|
539
|
+
if (typeof value !== "string" || !/^sha256:[0-9a-f]{64}$/u.test(value)) {
|
|
540
|
+
invalid2(`${name} is invalid`);
|
|
541
|
+
}
|
|
542
|
+
return value;
|
|
543
|
+
}
|
|
544
|
+
function stableVersion(value) {
|
|
545
|
+
return typeof value === "string" && /^(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)\.(?:0|[1-9]\d*)$/u.test(value);
|
|
546
|
+
}
|
|
547
|
+
function requiredPath(environment, name) {
|
|
548
|
+
const value = environment[name];
|
|
549
|
+
if (!value) {
|
|
550
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_UNAVAILABLE", `${name} is required`);
|
|
551
|
+
}
|
|
552
|
+
return value;
|
|
553
|
+
}
|
|
554
|
+
function parseJson(bytes, name) {
|
|
555
|
+
try {
|
|
556
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
557
|
+
} catch (cause) {
|
|
558
|
+
throw new ArtifactRuntimeError(
|
|
559
|
+
"ARTIFACT_RUNTIME_MANIFEST_INVALID",
|
|
560
|
+
`${name} is not strict UTF-8 JSON`,
|
|
561
|
+
{ cause }
|
|
562
|
+
);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
function exactRecord2(value, keys, name) {
|
|
566
|
+
if (!isRecord(value)) invalid2(`${name} is invalid`);
|
|
567
|
+
if (JSON.stringify(Object.keys(value).sort()) !== JSON.stringify([...keys].sort())) {
|
|
568
|
+
invalid2(`${name} has unexpected fields`);
|
|
569
|
+
}
|
|
570
|
+
return value;
|
|
571
|
+
}
|
|
572
|
+
function isRecord(value) {
|
|
573
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
574
|
+
}
|
|
575
|
+
function sha256(value) {
|
|
576
|
+
return `sha256:${createHash("sha256").update(value).digest("hex")}`;
|
|
577
|
+
}
|
|
578
|
+
function sameJson(left, right) {
|
|
579
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
580
|
+
}
|
|
581
|
+
function sameBytes(left, right) {
|
|
582
|
+
return left.byteLength === right.byteLength && left.every((byte, index) => byte === right[index]);
|
|
583
|
+
}
|
|
584
|
+
function defaultImporter(specifier) {
|
|
585
|
+
return import(
|
|
586
|
+
/* @vite-ignore */
|
|
587
|
+
specifier
|
|
588
|
+
);
|
|
589
|
+
}
|
|
590
|
+
function invalid2(message) {
|
|
591
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_MANIFEST_INVALID", message);
|
|
592
|
+
}
|
|
593
|
+
function integrity(message) {
|
|
594
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_INTEGRITY", message);
|
|
595
|
+
}
|
|
596
|
+
function incompatible(message) {
|
|
597
|
+
throw new ArtifactRuntimeError("ARTIFACT_RUNTIME_INCOMPATIBLE", message);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
export {
|
|
601
|
+
DEVELOPMENT_ARTIFACT_RUNTIME_ENVIRONMENT,
|
|
602
|
+
isArtifactRuntimeConfigured,
|
|
603
|
+
validateDevelopmentArtifactRuntimeManifest,
|
|
604
|
+
canonicalDevelopmentArtifactRuntimeManifestBytes,
|
|
605
|
+
canonicalDevelopmentArtifactToolIdentityBytes,
|
|
606
|
+
locateVerifiedDevelopmentArtifactRuntime,
|
|
607
|
+
doctorVerifiedDevelopmentArtifactRuntime,
|
|
608
|
+
loadVerifiedDevelopmentArtifactKernelRuntime,
|
|
609
|
+
doctorConfiguredArtifactRuntime,
|
|
610
|
+
loadConfiguredArtifactKernelRuntime,
|
|
611
|
+
runConfiguredArtifactRuntimeCli
|
|
612
|
+
};
|
|
613
|
+
//# sourceMappingURL=chunk-U5G2BKM2.js.map
|