@dsh-enhanced/lark-channel 0.1.48 → 0.1.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -8
- package/docs/rsi-setup.md +123 -11
- package/docs/setup.md +27 -14
- package/docs/supervised-growth.md +2 -0
- package/lib/adapter.d.ts +6 -0
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +79 -8
- package/lib/adapter.js.map +1 -1
- package/lib/business-cli-install.d.ts +9 -0
- package/lib/business-cli-install.d.ts.map +1 -0
- package/lib/business-cli-install.js +367 -0
- package/lib/business-cli-install.js.map +1 -0
- package/lib/business-environment.d.ts +2 -0
- package/lib/business-environment.d.ts.map +1 -0
- package/lib/business-environment.js +16 -0
- package/lib/business-environment.js.map +1 -0
- package/lib/business-skill.d.ts +32 -0
- package/lib/business-skill.d.ts.map +1 -0
- package/lib/business-skill.js +202 -0
- package/lib/business-skill.js.map +1 -0
- package/lib/rsi-authority-config.d.ts +29 -0
- package/lib/rsi-authority-config.d.ts.map +1 -0
- package/lib/rsi-authority-config.js +233 -0
- package/lib/rsi-authority-config.js.map +1 -0
- package/lib/rsi-authority-resources.d.ts +36 -0
- package/lib/rsi-authority-resources.d.ts.map +1 -0
- package/lib/rsi-authority-resources.js +139 -0
- package/lib/rsi-authority-resources.js.map +1 -0
- package/lib/rsi-authority-runtime.d.ts +50 -0
- package/lib/rsi-authority-runtime.d.ts.map +1 -0
- package/lib/rsi-authority-runtime.js +393 -0
- package/lib/rsi-authority-runtime.js.map +1 -0
- package/lib/rsi-bootstrap-manifest.d.ts +39 -0
- package/lib/rsi-bootstrap-manifest.d.ts.map +1 -0
- package/lib/rsi-bootstrap-manifest.js +366 -0
- package/lib/rsi-bootstrap-manifest.js.map +1 -0
- package/lib/rsi-bootstrap.d.ts +30 -0
- package/lib/rsi-bootstrap.d.ts.map +1 -0
- package/lib/rsi-bootstrap.js +363 -0
- package/lib/rsi-bootstrap.js.map +1 -0
- package/lib/rsi-build.d.ts +45 -0
- package/lib/rsi-build.d.ts.map +1 -0
- package/lib/rsi-build.js +404 -0
- package/lib/rsi-build.js.map +1 -0
- package/lib/rsi-creation-build.d.ts +47 -0
- package/lib/rsi-creation-build.d.ts.map +1 -0
- package/lib/rsi-creation-build.js +333 -0
- package/lib/rsi-creation-build.js.map +1 -0
- package/lib/rsi-host-authorities.d.ts +18 -0
- package/lib/rsi-host-authorities.d.ts.map +1 -0
- package/lib/rsi-host-authorities.js +129 -0
- package/lib/rsi-host-authorities.js.map +1 -0
- package/lib/rsi-host-update.d.ts +113 -0
- package/lib/rsi-host-update.d.ts.map +1 -0
- package/lib/rsi-host-update.js +316 -0
- package/lib/rsi-host-update.js.map +1 -0
- package/lib/rsi-install-inputs.d.ts +43 -0
- package/lib/rsi-install-inputs.d.ts.map +1 -0
- package/lib/rsi-install-inputs.js +342 -0
- package/lib/rsi-install-inputs.js.map +1 -0
- package/lib/rsi-install.d.ts +54 -0
- package/lib/rsi-install.d.ts.map +1 -0
- package/lib/rsi-install.js +404 -0
- package/lib/rsi-install.js.map +1 -0
- package/lib/rsi-local-activation.d.ts +78 -0
- package/lib/rsi-local-activation.d.ts.map +1 -0
- package/lib/rsi-local-activation.js +485 -0
- package/lib/rsi-local-activation.js.map +1 -0
- package/lib/rsi-local-cohort.d.ts +70 -0
- package/lib/rsi-local-cohort.d.ts.map +1 -0
- package/lib/rsi-local-cohort.js +781 -0
- package/lib/rsi-local-cohort.js.map +1 -0
- package/lib/rsi-local-install.d.ts +40 -0
- package/lib/rsi-local-install.d.ts.map +1 -0
- package/lib/rsi-local-install.js +221 -0
- package/lib/rsi-local-install.js.map +1 -0
- package/lib/rsi-local-pair-install.d.ts +38 -0
- package/lib/rsi-local-pair-install.d.ts.map +1 -0
- package/lib/rsi-local-pair-install.js +200 -0
- package/lib/rsi-local-pair-install.js.map +1 -0
- package/lib/rsi-local-profile-update.d.ts +25 -0
- package/lib/rsi-local-profile-update.d.ts.map +1 -0
- package/lib/rsi-local-profile-update.js +226 -0
- package/lib/rsi-local-profile-update.js.map +1 -0
- package/lib/rsi-local-resources.d.ts +37 -0
- package/lib/rsi-local-resources.d.ts.map +1 -0
- package/lib/rsi-local-resources.js +184 -0
- package/lib/rsi-local-resources.js.map +1 -0
- package/lib/rsi-local-roots-extension.d.ts +11 -0
- package/lib/rsi-local-roots-extension.d.ts.map +1 -0
- package/lib/rsi-local-roots-extension.js +31 -0
- package/lib/rsi-local-roots-extension.js.map +1 -0
- package/lib/rsi-local-update-build.d.ts +18 -0
- package/lib/rsi-local-update-build.d.ts.map +1 -0
- package/lib/rsi-local-update-build.js +37 -0
- package/lib/rsi-local-update-build.js.map +1 -0
- package/lib/rsi-local-update.d.ts +39 -0
- package/lib/rsi-local-update.d.ts.map +1 -0
- package/lib/rsi-local-update.js +205 -0
- package/lib/rsi-local-update.js.map +1 -0
- package/lib/rsi-memory-learning.d.ts +22 -0
- package/lib/rsi-memory-learning.d.ts.map +1 -0
- package/lib/rsi-memory-learning.js +76 -0
- package/lib/rsi-memory-learning.js.map +1 -0
- package/lib/rsi-owner-profile.d.ts +37 -0
- package/lib/rsi-owner-profile.d.ts.map +1 -0
- package/lib/rsi-owner-profile.js +178 -0
- package/lib/rsi-owner-profile.js.map +1 -0
- package/lib/rsi-plugin-creation.d.ts +31 -0
- package/lib/rsi-plugin-creation.d.ts.map +1 -0
- package/lib/rsi-plugin-creation.js +179 -0
- package/lib/rsi-plugin-creation.js.map +1 -0
- package/lib/rsi-profile.d.ts +23 -0
- package/lib/rsi-profile.d.ts.map +1 -1
- package/lib/rsi-profile.js +154 -43
- package/lib/rsi-profile.js.map +1 -1
- package/lib/rsi-release-build.d.ts +41 -0
- package/lib/rsi-release-build.d.ts.map +1 -0
- package/lib/rsi-release-build.js +223 -0
- package/lib/rsi-release-build.js.map +1 -0
- package/lib/rsi-service-environment.d.ts +6 -0
- package/lib/rsi-service-environment.d.ts.map +1 -0
- package/lib/rsi-service-environment.js +113 -0
- package/lib/rsi-service-environment.js.map +1 -0
- package/lib/rsi-service-setup.d.ts +10 -0
- package/lib/rsi-service-setup.d.ts.map +1 -0
- package/lib/rsi-service-setup.js +34 -0
- package/lib/rsi-service-setup.js.map +1 -0
- package/lib/rsi-setup.d.ts +35 -2
- package/lib/rsi-setup.d.ts.map +1 -1
- package/lib/rsi-setup.js +459 -32
- package/lib/rsi-setup.js.map +1 -1
- package/lib/rsi-source-maintenance.d.ts +25 -0
- package/lib/rsi-source-maintenance.d.ts.map +1 -0
- package/lib/rsi-source-maintenance.js +348 -0
- package/lib/rsi-source-maintenance.js.map +1 -0
- package/lib/rsi-source-update.d.ts +26 -0
- package/lib/rsi-source-update.d.ts.map +1 -0
- package/lib/rsi-source-update.js +276 -0
- package/lib/rsi-source-update.js.map +1 -0
- package/lib/rsi-source.d.ts +34 -0
- package/lib/rsi-source.d.ts.map +1 -0
- package/lib/rsi-source.js +375 -0
- package/lib/rsi-source.js.map +1 -0
- package/lib/rsi-systemd-bootstrap.d.ts +46 -0
- package/lib/rsi-systemd-bootstrap.d.ts.map +1 -0
- package/lib/rsi-systemd-bootstrap.js +271 -0
- package/lib/rsi-systemd-bootstrap.js.map +1 -0
- package/lib/sdk.d.ts.map +1 -1
- package/lib/sdk.js +26 -1
- package/lib/sdk.js.map +1 -1
- package/lib/setup-business.d.ts +49 -0
- package/lib/setup-business.d.ts.map +1 -0
- package/lib/setup-business.js +335 -0
- package/lib/setup-business.js.map +1 -0
- package/lib/setup-profile.d.ts +1 -1
- package/lib/setup-profile.d.ts.map +1 -1
- package/lib/setup-profile.js +25 -2
- package/lib/setup-profile.js.map +1 -1
- package/lib/setup.d.ts +12 -1
- package/lib/setup.d.ts.map +1 -1
- package/lib/setup.js +138 -34
- package/lib/setup.js.map +1 -1
- package/lib/systemd.d.ts +10 -0
- package/lib/systemd.d.ts.map +1 -1
- package/lib/systemd.js +23 -6
- package/lib/systemd.js.map +1 -1
- package/lib/types.d.ts +7 -0
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +32 -20
package/lib/rsi-build.js
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { constants } from 'node:fs';
|
|
4
|
+
import { chmod, lstat, mkdir, mkdtemp, open, readdir, realpath, rename, rm, stat } from 'node:fs/promises';
|
|
5
|
+
import { basename, dirname, isAbsolute, join, resolve } from 'node:path';
|
|
6
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
7
|
+
import { readRsiSourceWorkspace } from './rsi-source.js';
|
|
8
|
+
const COMMIT = /^[a-f0-9]{40}$/u;
|
|
9
|
+
const IMAGE = /^sha256:[a-f0-9]{64}$/u;
|
|
10
|
+
const PROFILE = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/u;
|
|
11
|
+
const SECCOMP_SHA = 'b1e4b5b709578785bd2aff4a3a344301997571ad0e8ae5747aec176571ddc342';
|
|
12
|
+
const BUILDER_SHA = '7b7eb0797e1ca543fb1ffa0463eb78b3ecad14f28fe4bfca25651640aac4669b';
|
|
13
|
+
const DOCKERFILE_SHA = 'c936e136517c5bc85603e7187fe74691e32f954f57b5076946dc42fed33c65f5';
|
|
14
|
+
const BASE_IMAGE = 'node:22.23.2-bookworm-slim@sha256:48e4b67d85f87bd551df43704e24d252f56cc5f8e9718841aace50f19948f0f9';
|
|
15
|
+
const PACKAGE_MANAGER = 'pnpm@11.7.0';
|
|
16
|
+
const MAX_OUTPUT = 65_536;
|
|
17
|
+
export class RsiBuildUnavailableError extends Error {
|
|
18
|
+
code = 'rsi-build-unavailable';
|
|
19
|
+
constructor(message) { super(`rsi build unavailable: ${message}`); }
|
|
20
|
+
}
|
|
21
|
+
function fail(message) { throw new Error(`rsi build: ${message}`); }
|
|
22
|
+
function digest(bytes) { return createHash('sha256').update(bytes).digest('hex'); }
|
|
23
|
+
function exactPath(path) { return isAbsolute(path) && resolve(path) === path && !path.includes('\0'); }
|
|
24
|
+
function diagnosticTail(value) {
|
|
25
|
+
const redacted = value.replace(/https?:\/\/[^\s/@]+:[^\s/@]+@/giu, 'https://[redacted]@')
|
|
26
|
+
.replace(/authorization\s*:\s*[^\s]+/giu, 'authorization: [redacted]');
|
|
27
|
+
return Array.from(redacted).map(char => {
|
|
28
|
+
const code = char.codePointAt(0);
|
|
29
|
+
return code < 32 || code === 127 ? ' ' : char;
|
|
30
|
+
}).join('').slice(-2_048).trim();
|
|
31
|
+
}
|
|
32
|
+
async function directory(path, privateMode = true) {
|
|
33
|
+
const item = await lstat(path);
|
|
34
|
+
if (!item.isDirectory() || item.isSymbolicLink() || item.mode & (privateMode ? 0o077 : 0o022)
|
|
35
|
+
|| process.getuid && item.uid !== process.getuid() || await realpath(path) !== path)
|
|
36
|
+
fail(`unsafe directory: ${path}`);
|
|
37
|
+
}
|
|
38
|
+
async function readStable(path, maximum, privateMode = false, allowRoot = false) {
|
|
39
|
+
const fd = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
40
|
+
try {
|
|
41
|
+
const before = await fd.stat();
|
|
42
|
+
if (!before.isFile() || before.size > maximum || privateMode && before.mode & 0o077
|
|
43
|
+
|| process.getuid && before.uid !== process.getuid() && !(allowRoot && before.uid === 0))
|
|
44
|
+
fail(`unsafe file: ${path}`);
|
|
45
|
+
const bytes = await fd.readFile(), after = await fd.stat(), name = await lstat(path);
|
|
46
|
+
if (bytes.length !== before.size || before.dev !== after.dev || before.ino !== after.ino
|
|
47
|
+
|| before.size !== after.size || before.mtimeMs !== after.mtimeMs
|
|
48
|
+
|| name.dev !== before.dev || name.ino !== before.ino || name.isSymbolicLink())
|
|
49
|
+
fail(`file changed during read: ${path}`);
|
|
50
|
+
return bytes;
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
await fd.close();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function writeExclusive(path, bytes) {
|
|
57
|
+
const fd = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
|
|
58
|
+
try {
|
|
59
|
+
await fd.writeFile(bytes);
|
|
60
|
+
await fd.sync();
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await fd.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async function syncDirectory(path) {
|
|
67
|
+
const fd = await open(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
68
|
+
try {
|
|
69
|
+
await fd.sync();
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await fd.close();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Drain a cancelled builder, giving its own finally block time to remove its context. */
|
|
76
|
+
async function command(executable, args, environment, signal, timeoutMs, outputLimit = MAX_OUTPUT) {
|
|
77
|
+
signal.throwIfAborted();
|
|
78
|
+
const deadline = AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);
|
|
79
|
+
return new Promise((resolvePromise, reject) => {
|
|
80
|
+
let child;
|
|
81
|
+
try {
|
|
82
|
+
child = spawn(executable, [...args], { env: environment, stdio: ['ignore', 'pipe', 'pipe'],
|
|
83
|
+
detached: process.platform !== 'win32', windowsHide: true });
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
reject(new Error('rsi build: subprocess could not start'));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let stdoutBytes = 0, overLimit = false, spawnError = false;
|
|
90
|
+
const stdout = [];
|
|
91
|
+
let stderrTail = '';
|
|
92
|
+
let killTimer;
|
|
93
|
+
const group = (signalName) => {
|
|
94
|
+
if (!child.pid)
|
|
95
|
+
return;
|
|
96
|
+
try {
|
|
97
|
+
if (process.platform === 'win32')
|
|
98
|
+
child.kill(signalName);
|
|
99
|
+
else
|
|
100
|
+
process.kill(-child.pid, signalName);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error.code !== 'ESRCH')
|
|
104
|
+
child.kill(signalName);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
const abort = () => {
|
|
108
|
+
group('SIGTERM');
|
|
109
|
+
killTimer ??= setTimeout(() => group('SIGKILL'), 5_000);
|
|
110
|
+
killTimer.unref?.();
|
|
111
|
+
};
|
|
112
|
+
deadline.addEventListener('abort', abort, { once: true });
|
|
113
|
+
if (deadline.aborted)
|
|
114
|
+
abort();
|
|
115
|
+
const collect = (data, keep) => {
|
|
116
|
+
if (keep) {
|
|
117
|
+
stdoutBytes += data.length;
|
|
118
|
+
if (stdoutBytes > outputLimit) {
|
|
119
|
+
overLimit = true;
|
|
120
|
+
group('SIGKILL');
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
stdout.push(data);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Docker build progress can be large. Drain it without logging it or
|
|
127
|
+
// treating normal progress as a malformed JSON result.
|
|
128
|
+
stderrTail = (stderrTail + data.toString('utf8')).slice(-8_192);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
child.stdout.on('data', data => collect(data, true));
|
|
132
|
+
child.stderr.on('data', data => collect(data, false));
|
|
133
|
+
child.once('error', () => { spawnError = true; group('SIGKILL'); });
|
|
134
|
+
child.once('close', (code, killed) => {
|
|
135
|
+
deadline.removeEventListener('abort', abort);
|
|
136
|
+
if (killTimer)
|
|
137
|
+
clearTimeout(killTimer);
|
|
138
|
+
if (spawnError || overLimit || deadline.aborted || code !== 0 || killed !== null) {
|
|
139
|
+
const stage = executable === process.execPath ? 'source-image-builder'
|
|
140
|
+
: args[0] === 'image' ? 'image-inspect' : args[0] ?? 'command';
|
|
141
|
+
const tail = diagnosticTail(stderrTail);
|
|
142
|
+
reject(new Error(`rsi build: subprocess failed, was cancelled, or exceeded its bound (stage=${stage}, exit=${code ?? 'signal'}${tail ? `, stderr=${tail}` : ''})`));
|
|
143
|
+
}
|
|
144
|
+
else
|
|
145
|
+
resolvePromise(Buffer.concat(stdout).toString('utf8').trim());
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
function isolatedEnvironment(home) {
|
|
150
|
+
return { PATH: '/usr/bin:/bin', LANG: 'C', LC_ALL: 'C', HOME: home, DOCKER_CONFIG: join(home, 'docker-config'),
|
|
151
|
+
DOCKER_BUILDKIT: '1' };
|
|
152
|
+
}
|
|
153
|
+
// Shared by the release-toolchain preparer; these helpers never change a profile.
|
|
154
|
+
export const rsiBuildResources = { directory, readStable, writeExclusive, syncDirectory, command, isolatedEnvironment };
|
|
155
|
+
async function dockerExecutable(requested) {
|
|
156
|
+
let path = requested;
|
|
157
|
+
if (path === undefined) {
|
|
158
|
+
for (const folder of (process.env.PATH ?? '').split(':')) {
|
|
159
|
+
if (!folder || !exactPath(folder))
|
|
160
|
+
continue;
|
|
161
|
+
const candidate = join(folder, 'docker');
|
|
162
|
+
try {
|
|
163
|
+
await lstat(candidate);
|
|
164
|
+
path = candidate;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
if (error.code !== 'ENOENT')
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
path ??= '/usr/bin/docker';
|
|
173
|
+
}
|
|
174
|
+
if (!exactPath(path))
|
|
175
|
+
fail('Docker path must be absolute');
|
|
176
|
+
let canonical;
|
|
177
|
+
try {
|
|
178
|
+
canonical = await realpath(path);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (error.code === 'ENOENT')
|
|
182
|
+
throw new RsiBuildUnavailableError('Docker executable was not found');
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
const file = await lstat(canonical), parent = await lstat(dirname(canonical)), uid = process.getuid?.();
|
|
186
|
+
if (!file.isFile() || file.isSymbolicLink() || file.mode & 0o022 || !(file.mode & 0o111)
|
|
187
|
+
|| !parent.isDirectory() || parent.isSymbolicLink() || parent.mode & 0o002
|
|
188
|
+
|| uid !== undefined && file.uid !== uid && file.uid !== 0)
|
|
189
|
+
fail('Docker executable is not owner-safe');
|
|
190
|
+
return { path: canonical, sha256: digest(await readStable(canonical, 100_000_000, false, true)) };
|
|
191
|
+
}
|
|
192
|
+
async function runtime(dockerPath, scratch, signal) {
|
|
193
|
+
let output;
|
|
194
|
+
try {
|
|
195
|
+
output = await command(dockerPath, ['version', '--format', '{{.Server.Version}}/{{.Server.Os}}/{{.Server.Arch}}'], isolatedEnvironment(scratch), signal, 10_000, 4096);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
if (signal.aborted)
|
|
199
|
+
signal.throwIfAborted();
|
|
200
|
+
throw new RsiBuildUnavailableError('local Docker daemon is unavailable');
|
|
201
|
+
}
|
|
202
|
+
if (output !== '29.4.1/linux/amd64')
|
|
203
|
+
throw new RsiBuildUnavailableError('Docker Server 29.4.1/linux/amd64 is required');
|
|
204
|
+
}
|
|
205
|
+
async function sourceInputs(source, expectedRepository) {
|
|
206
|
+
if (source.schemaVersion !== 1 || !COMMIT.test(source.sourceCommit) || source.repository !== expectedRepository
|
|
207
|
+
|| !COMMIT.test(source.baseline.initialCommit)
|
|
208
|
+
|| source.baseline.ref !== 'refs/dsh-source/repairs' || source.baseline.targetBranch !== 'repairs'
|
|
209
|
+
|| source.baseline.remote !== join(dirname(expectedRepository), 'release.git'))
|
|
210
|
+
fail('source workspace binding is invalid');
|
|
211
|
+
if (source.baseline.initialCommit !== source.sourceCommit) {
|
|
212
|
+
// A newer checkout must be derived from retained, Host-signed maintenance
|
|
213
|
+
// history. A caller-supplied commit alone cannot replace the original root.
|
|
214
|
+
const current = await readRsiSourceWorkspace({ dshHome: dirname(dirname(dirname(expectedRepository))),
|
|
215
|
+
profile: basename(dirname(expectedRepository)),
|
|
216
|
+
...(source.origin.kind === 'local-head' ? { sourceRepository: source.origin.locator } : {}) });
|
|
217
|
+
if (!isDeepStrictEqual(current, source))
|
|
218
|
+
fail('source workspace differs from signed maintenance history');
|
|
219
|
+
}
|
|
220
|
+
await directory(source.repository);
|
|
221
|
+
const files = new Map();
|
|
222
|
+
const contextFiles = ['scripts/isolation/source-builder.Dockerfile', 'package.json', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'];
|
|
223
|
+
for (const folder of ['plugins', 'packages']) {
|
|
224
|
+
for (const entry of await readdir(join(source.repository, folder), { withFileTypes: true })) {
|
|
225
|
+
if (!entry.isDirectory() || entry.isSymbolicLink())
|
|
226
|
+
continue;
|
|
227
|
+
const name = `${folder}/${entry.name}/package.json`;
|
|
228
|
+
try {
|
|
229
|
+
await lstat(join(source.repository, name));
|
|
230
|
+
contextFiles.push(name);
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
if (error.code !== 'ENOENT')
|
|
234
|
+
throw error;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
contextFiles.sort();
|
|
239
|
+
if (contextFiles.length > 256)
|
|
240
|
+
fail('source context file count exceeds bound');
|
|
241
|
+
const inputs = [...contextFiles, 'scripts/isolation/build-source-image.mjs', 'scripts/isolation/source-builder-seccomp.json'];
|
|
242
|
+
for (const name of inputs)
|
|
243
|
+
files.set(name, await readStable(join(source.repository, name), 4_194_304));
|
|
244
|
+
const manifest = JSON.parse(files.get('package.json').toString('utf8'));
|
|
245
|
+
if (manifest.name !== 'dsh-enhanced' || manifest.version !== source.version || manifest.packageManager !== PACKAGE_MANAGER)
|
|
246
|
+
fail('source manifest differs from installed cohort');
|
|
247
|
+
if (digest(files.get('scripts/isolation/build-source-image.mjs')) !== BUILDER_SHA
|
|
248
|
+
|| digest(files.get('scripts/isolation/source-builder.Dockerfile')) !== DOCKERFILE_SHA)
|
|
249
|
+
fail('source builder differs from installed trusted builder');
|
|
250
|
+
if (digest(files.get('scripts/isolation/source-builder-seccomp.json')) !== SECCOMP_SHA)
|
|
251
|
+
fail('repository seccomp differs from approved runtime profile');
|
|
252
|
+
const hashes = Object.fromEntries([...files].map(([name, bytes]) => [name, digest(bytes)]));
|
|
253
|
+
return { files, hashes, contextFiles, lockSha256: digest(files.get('pnpm-lock.yaml')) };
|
|
254
|
+
}
|
|
255
|
+
async function snapshot(root, files) {
|
|
256
|
+
for (const [name, bytes] of files) {
|
|
257
|
+
const path = join(root, name);
|
|
258
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
259
|
+
await writeExclusive(path, bytes);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function parseBuildOutput(raw, expected) {
|
|
263
|
+
if (Buffer.byteLength(raw) > 16_384)
|
|
264
|
+
fail('builder output exceeds bound');
|
|
265
|
+
const value = JSON.parse(raw);
|
|
266
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)
|
|
267
|
+
|| Object.keys(value).sort().join('\0') !== ['image', 'tag', 'baseImage', 'packageManager', 'lockSha256', 'contextFiles'].sort().join('\0')
|
|
268
|
+
|| typeof value.image !== 'string' || !IMAGE.test(value.image)
|
|
269
|
+
|| value.baseImage !== BASE_IMAGE || value.packageManager !== PACKAGE_MANAGER
|
|
270
|
+
|| value.lockSha256 !== expected.lockSha256
|
|
271
|
+
|| JSON.stringify(value.contextFiles) !== JSON.stringify(expected.contextFiles))
|
|
272
|
+
fail('builder output does not match frozen source inputs');
|
|
273
|
+
return value.image;
|
|
274
|
+
}
|
|
275
|
+
function buildConfig(dockerPath, image, seccompPath) {
|
|
276
|
+
return { dockerPath, image, timeoutMs: 1_800_000, memoryMiB: 16_384, cpus: 8, pidsLimit: 1_024,
|
|
277
|
+
workspaceMiB: 4_096, temporaryMiB: 2_048, outputBytes: 65_536,
|
|
278
|
+
versioning: 'patch', profile: 'repository', repositorySandbox: { seccompPath } };
|
|
279
|
+
}
|
|
280
|
+
async function imageExists(dockerPath, image, scratch, signal) {
|
|
281
|
+
const actual = await command(dockerPath, ['image', 'inspect', '--format', '{{.Id}}', image], isolatedEnvironment(scratch), signal, 30_000, 4096);
|
|
282
|
+
if (actual !== image)
|
|
283
|
+
fail('Docker image content ID differs from builder receipt');
|
|
284
|
+
}
|
|
285
|
+
async function replay(final, expected, scratch, signal) {
|
|
286
|
+
await directory(final);
|
|
287
|
+
if (JSON.stringify((await readdir(final)).sort()) !== JSON.stringify(['bootstrap.json', 'seccomp.json']))
|
|
288
|
+
fail('build workspace incomplete or unexpected');
|
|
289
|
+
const value = JSON.parse((await readStable(join(final, 'bootstrap.json'), 65_536, true)).toString('utf8'));
|
|
290
|
+
const { receiptDigest, ...content } = value;
|
|
291
|
+
if (value.schemaVersion !== 1 || digest(JSON.stringify(content)) !== receiptDigest
|
|
292
|
+
|| value.dshHome !== expected.dshHome || value.profile !== expected.profile
|
|
293
|
+
|| value.repository !== expected.repository || value.sourceCommit !== expected.sourceCommit
|
|
294
|
+
|| value.dockerSha256 !== expected.dockerSha256 || value.sourceBuild?.dockerPath !== expected.dockerPath
|
|
295
|
+
|| !IMAGE.test(value.sourceBuild?.image ?? '')
|
|
296
|
+
|| JSON.stringify(value.inputHashes) !== JSON.stringify(expected.inputHashes)
|
|
297
|
+
|| JSON.stringify(value.contextFiles) !== JSON.stringify(expected.contextFiles)
|
|
298
|
+
|| value.lockSha256 !== expected.lockSha256
|
|
299
|
+
|| JSON.stringify(value.sourceBuild) !== JSON.stringify(buildConfig(expected.dockerPath, value.sourceBuild.image, join(final, 'seccomp.json'))))
|
|
300
|
+
fail('build receipt differs from frozen source or Docker client');
|
|
301
|
+
if (digest(await readStable(join(final, 'seccomp.json'), 65_536, true)) !== SECCOMP_SHA)
|
|
302
|
+
fail('private repository seccomp changed');
|
|
303
|
+
if (scratch !== undefined)
|
|
304
|
+
await imageExists(expected.dockerPath, value.sourceBuild.image, scratch, signal);
|
|
305
|
+
signal.throwIfAborted();
|
|
306
|
+
return { schemaVersion: 1, sourceCommit: value.sourceCommit, sourceBuild: value.sourceBuild };
|
|
307
|
+
}
|
|
308
|
+
/** Read recorded build inputs without creating resources or running Docker.
|
|
309
|
+
* Image availability is checked separately by preparation/execution. */
|
|
310
|
+
export async function readRsiBuildEnvironment(input) {
|
|
311
|
+
if (!exactPath(input.dshHome) || !PROFILE.test(input.profile))
|
|
312
|
+
fail('invalid DSH_HOME or profile');
|
|
313
|
+
await directory(input.dshHome, false);
|
|
314
|
+
const repository = join(input.dshHome, 'rsi-sources', input.profile, 'checkout');
|
|
315
|
+
const source = await sourceInputs(input.source, repository);
|
|
316
|
+
const parent = join(input.dshHome, 'rsi-builds'), final = join(parent, input.profile);
|
|
317
|
+
await directory(parent);
|
|
318
|
+
await directory(final);
|
|
319
|
+
const saved = JSON.parse((await readStable(join(final, 'bootstrap.json'), 65_536, true)).toString('utf8'));
|
|
320
|
+
if (typeof saved.sourceBuild?.dockerPath !== 'string')
|
|
321
|
+
fail('recorded Docker path is absent');
|
|
322
|
+
const docker = await dockerExecutable(saved.sourceBuild.dockerPath);
|
|
323
|
+
const signal = input.signal ?? new AbortController().signal;
|
|
324
|
+
return replay(final, { dshHome: input.dshHome, profile: input.profile, repository,
|
|
325
|
+
sourceCommit: input.source.sourceCommit, dockerPath: docker.path, dockerSha256: docker.sha256,
|
|
326
|
+
inputHashes: source.hashes, contextFiles: source.contextFiles, lockSha256: source.lockSha256 }, undefined, signal);
|
|
327
|
+
}
|
|
328
|
+
/** Caller holds the DSH_HOME lifecycle lock; no profile or service is changed here. */
|
|
329
|
+
export async function prepareRsiBuildEnvironment(input) {
|
|
330
|
+
if (!exactPath(input.dshHome) || !PROFILE.test(input.profile))
|
|
331
|
+
fail('invalid DSH_HOME or profile');
|
|
332
|
+
if (process.platform !== 'linux' || process.arch !== 'x64')
|
|
333
|
+
throw new RsiBuildUnavailableError('Linux x64 is required');
|
|
334
|
+
await directory(input.dshHome, false);
|
|
335
|
+
const repository = join(input.dshHome, 'rsi-sources', input.profile, 'checkout');
|
|
336
|
+
const source = await sourceInputs(input.source, repository);
|
|
337
|
+
const docker = await dockerExecutable(input.dockerPath);
|
|
338
|
+
const parent = join(input.dshHome, 'rsi-builds');
|
|
339
|
+
try {
|
|
340
|
+
await mkdir(parent, { mode: 0o700 });
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
if (error.code !== 'EEXIST')
|
|
344
|
+
throw error;
|
|
345
|
+
}
|
|
346
|
+
await directory(parent);
|
|
347
|
+
const final = join(parent, input.profile), signal = AbortSignal.any([input.signal ?? new AbortController().signal, AbortSignal.timeout(1_860_000)]);
|
|
348
|
+
const stage = await mkdtemp(join(parent, `.${input.profile}-stage-`));
|
|
349
|
+
await chmod(stage, 0o700);
|
|
350
|
+
let claimed;
|
|
351
|
+
try {
|
|
352
|
+
await mkdir(join(stage, 'docker-config'), { mode: 0o700 });
|
|
353
|
+
await runtime(docker.path, stage, signal);
|
|
354
|
+
const expected = { dshHome: input.dshHome, profile: input.profile, repository, sourceCommit: input.source.sourceCommit,
|
|
355
|
+
dockerPath: docker.path, dockerSha256: docker.sha256, inputHashes: source.hashes,
|
|
356
|
+
contextFiles: source.contextFiles, lockSha256: source.lockSha256 };
|
|
357
|
+
const present = await lstat(final).then(() => true, error => {
|
|
358
|
+
if (error.code === 'ENOENT')
|
|
359
|
+
return false;
|
|
360
|
+
throw error;
|
|
361
|
+
});
|
|
362
|
+
if (present)
|
|
363
|
+
return await replay(final, expected, stage, signal);
|
|
364
|
+
const sourceSnapshot = join(stage, 'source');
|
|
365
|
+
await mkdir(sourceSnapshot, { mode: 0o700 });
|
|
366
|
+
await snapshot(sourceSnapshot, source.files);
|
|
367
|
+
const builder = join(sourceSnapshot, 'scripts', 'isolation', 'build-source-image.mjs');
|
|
368
|
+
const raw = await command(process.execPath, [builder, '--docker-path', docker.path, '--timeout-ms', '1800000'], isolatedEnvironment(stage), signal, 1_810_000);
|
|
369
|
+
const image = parseBuildOutput(raw, source);
|
|
370
|
+
await imageExists(docker.path, image, stage, signal);
|
|
371
|
+
const fresh = await sourceInputs(input.source, repository);
|
|
372
|
+
if (JSON.stringify(fresh.hashes) !== JSON.stringify(source.hashes))
|
|
373
|
+
fail('source inputs changed during Docker build');
|
|
374
|
+
await mkdir(final, { mode: 0o700 });
|
|
375
|
+
const identity = await stat(final);
|
|
376
|
+
claimed = { dev: identity.dev, ino: identity.ino };
|
|
377
|
+
await writeExclusive(join(stage, 'seccomp.json'), source.files.get('scripts/isolation/source-builder-seccomp.json'));
|
|
378
|
+
await rename(join(stage, 'seccomp.json'), join(final, 'seccomp.json'));
|
|
379
|
+
const result = { schemaVersion: 1, sourceCommit: input.source.sourceCommit,
|
|
380
|
+
sourceBuild: buildConfig(docker.path, image, join(final, 'seccomp.json')) };
|
|
381
|
+
const content = { ...result, dshHome: input.dshHome, profile: input.profile, repository,
|
|
382
|
+
dockerSha256: docker.sha256, inputHashes: source.hashes, contextFiles: source.contextFiles, lockSha256: source.lockSha256 };
|
|
383
|
+
await writeExclusive(join(final, 'bootstrap.json'), JSON.stringify({ ...content, receiptDigest: digest(JSON.stringify(content)) }));
|
|
384
|
+
await syncDirectory(final);
|
|
385
|
+
await syncDirectory(parent);
|
|
386
|
+
return result;
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
if (claimed) {
|
|
390
|
+
const current = await lstat(final).catch(() => undefined);
|
|
391
|
+
if (current?.isDirectory() && current.dev === claimed.dev && current.ino === claimed.ino) {
|
|
392
|
+
const names = await readdir(final).catch(() => []);
|
|
393
|
+
if (names.every(name => ['seccomp.json', 'bootstrap.json'].includes(name)))
|
|
394
|
+
await rm(final, { recursive: true, force: true });
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
throw error;
|
|
398
|
+
}
|
|
399
|
+
finally {
|
|
400
|
+
await rm(stage, { recursive: true, force: true });
|
|
401
|
+
await syncDirectory(parent);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=rsi-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsi-build.js","sourceRoot":"","sources":["../src/rsi-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC1G,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAE7C,OAAO,EAAE,sBAAsB,EAA2B,MAAM,iBAAiB,CAAA;AAGjF,MAAM,MAAM,GAAG,iBAAiB,CAAA;AAChC,MAAM,KAAK,GAAG,wBAAwB,CAAA;AACtC,MAAM,OAAO,GAAG,oCAAoC,CAAA;AACpD,MAAM,WAAW,GAAG,kEAAkE,CAAA;AACtF,MAAM,WAAW,GAAG,kEAAkE,CAAA;AACtF,MAAM,cAAc,GAAG,kEAAkE,CAAA;AACzF,MAAM,UAAU,GAAG,oGAAoG,CAAA;AACvH,MAAM,eAAe,GAAG,aAAa,CAAA;AACrC,MAAM,UAAU,GAAG,MAAM,CAAA;AAEzB,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,IAAI,GAAG,uBAAuB,CAAA;IACvC,YAAY,OAAe,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAA,CAAC,CAAC;CAC5E;AAmBD,SAAS,IAAI,CAAC,OAAe,IAAW,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,EAAE,CAAC,CAAA,CAAC,CAAC;AAClF,SAAS,MAAM,CAAC,KAAsB,IAAY,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC;AAC3G,SAAS,SAAS,CAAC,IAAY,IAAa,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC;AACvH,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,kCAAkC,EAAE,qBAAqB,CAAC;SACtF,OAAO,CAAC,+BAA+B,EAAE,2BAA2B,CAAC,CAAA;IACxE,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAA;QACjC,OAAO,IAAI,GAAG,EAAE,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IAC/C,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;AAClC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,WAAW,GAAG,IAAI;IACvD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;WACxF,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAA;AAC1H,CAAC;AACD,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK;IAC7F,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,GAAG,OAAO,IAAI,WAAW,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK;eAC9E,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAA;QACxH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;QACpF,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;eACnF,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;eAC9D,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,IAAI,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAA;QAC3H,OAAO,KAAK,CAAA;IACd,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA;IAAC,CAAC;AAChC,CAAC;AACD,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,KAAsB;IAChE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;IACpH,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;IAAC,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA;IAAC,CAAC;AACjF,CAAC;AACD,KAAK,UAAU,aAAa,CAAC,IAAY;IACvC,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IAC9F,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;IAAC,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA;IAAC,CAAC;AACtD,CAAC;AAED,0FAA0F;AAC1F,KAAK,UAAU,OAAO,CAAC,UAAkB,EAAE,IAAuB,EAAE,WAA8B,EAChG,MAAmB,EAAE,SAAiB,EAAE,WAAW,GAAG,UAAU;IAChE,MAAM,CAAC,cAAc,EAAE,CAAA;IACvB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1E,OAAO,IAAI,OAAO,CAAS,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QACpD,IAAI,KAA+B,CAAA;QACnC,IAAI,CAAC;YAAC,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBAC9F,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;QAAC,CAAC;QAChE,MAAM,CAAC;YAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QAC5E,IAAI,WAAW,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,EAAE,UAAU,GAAG,KAAK,CAAA;QAC1D,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,SAAoD,CAAA;QACxD,MAAM,KAAK,GAAG,CAAC,UAA0B,EAAE,EAAE;YAC3C,IAAI,CAAC,KAAK,CAAC,GAAG;gBAAE,OAAM;YACtB,IAAI,CAAC;gBACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;;oBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAAC,CAAC;QACnG,CAAC,CAAA;QACD,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,KAAK,CAAC,SAAS,CAAC,CAAA;YAChB,SAAS,KAAK,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAA;YACvD,SAAS,CAAC,KAAK,EAAE,EAAE,CAAA;QACrB,CAAC,CAAA;QACD,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,IAAI,QAAQ,CAAC,OAAO;YAAE,KAAK,EAAE,CAAA;QAC7B,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,IAAa,EAAE,EAAE;YAC9C,IAAI,IAAI,EAAE,CAAC;gBACT,WAAW,IAAI,IAAI,CAAC,MAAM,CAAA;gBAC1B,IAAI,WAAW,GAAG,WAAW,EAAE,CAAC;oBAAC,SAAS,GAAG,IAAI,CAAC;oBAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBAAC,OAAM;gBAAC,CAAC;gBAC7E,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACN,qEAAqE;gBACrE,uDAAuD;gBACvD,UAAU,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAA;YACjE,CAAC;QACH,CAAC,CAAA;QACD,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;QACrD,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAClE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACnC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YAC5C,IAAI,SAAS;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAA;YACtC,IAAI,UAAU,IAAI,SAAS,IAAI,QAAQ,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACjF,MAAM,KAAK,GAAG,UAAU,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB;oBACpE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAA;gBAChE,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,6EAA6E,KAAK,UAAU,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;YACrK,CAAC;;gBACI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACpE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;QAC5G,eAAe,EAAE,GAAG,EAAE,CAAA;AAC1B,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAEvH,KAAK,UAAU,gBAAgB,CAAC,SAAkB;IAChD,IAAI,IAAI,GAAG,SAAS,CAAA;IACpB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAAE,SAAQ;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YACxC,IAAI,CAAC;gBAAC,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;gBAAC,IAAI,GAAG,SAAS,CAAC;gBAAC,MAAK;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAA;YAAC,CAAC;QAC/I,CAAC;QACD,IAAI,KAAK,iBAAiB,CAAA;IAC5B,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,8BAA8B,CAAC,CAAA;IAC1D,IAAI,SAAiB,CAAA;IACrB,IAAI,CAAC;QAAC,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;IAAC,CAAC;IACxC,OAAO,KAAK,EAAE,CAAC;QACb,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,wBAAwB,CAAC,iCAAiC,CAAC,CAAA;QAC7H,MAAM,KAAK,CAAA;IACb,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAA;IACvG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;WACnF,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,MAAM,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC,IAAI,GAAG,KAAK;WACvE,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC;QAAE,IAAI,CAAC,qCAAqC,CAAC,CAAA;IACzG,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,UAAU,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAA;AACnG,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,UAAkB,EAAE,OAAe,EAAE,MAAmB;IAC7E,IAAI,MAAc,CAAA;IAClB,IAAI,CAAC;QAAC,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,qDAAqD,CAAC,EACrH,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IAAC,CAAC;IACvD,MAAM,CAAC;QACL,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,cAAc,EAAE,CAAA;QAC3C,MAAM,IAAI,wBAAwB,CAAC,oCAAoC,CAAC,CAAA;IAC1E,CAAC;IACD,IAAI,MAAM,KAAK,oBAAoB;QAAE,MAAM,IAAI,wBAAwB,CAAC,8CAA8C,CAAC,CAAA;AACzH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,MAA0B,EAAE,kBAA0B;IAGhF,IAAI,MAAM,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,kBAAkB;WAC1G,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;WAC3C,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,yBAAyB,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,KAAK,SAAS;WAC/F,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,CAAC,qCAAqC,CAAC,CAAA;IAC7H,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;QAC1D,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACnG,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAC9C,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAChG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC;YAAE,IAAI,CAAC,0DAA0D,CAAC,CAAA;IAC3G,CAAC;IACD,MAAM,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,MAAM,YAAY,GAAG,CAAC,6CAA6C,EAAE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB,CAAC,CAAA;IAC7H,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5F,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE;gBAAE,SAAQ;YAC5D,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,eAAe,CAAA;YACnD,IAAI,CAAC;gBAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;gBAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAAC,CAAC;YAC3E,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAA;YAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,YAAY,CAAC,IAAI,EAAE,CAAA;IACnB,IAAI,YAAY,CAAC,MAAM,GAAG,GAAG;QAAE,IAAI,CAAC,yCAAyC,CAAC,CAAA;IAC9E,MAAM,MAAM,GAAG,CAAC,GAAG,YAAY,EAAE,0CAA0C,EAAE,+CAA+C,CAAC,CAAA;IAC7H,KAAK,MAAM,IAAI,IAAI,MAAM;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;IACtG,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA4B,CAAA;IACnG,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,IAAI,QAAQ,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,cAAc,KAAK,eAAe;QAAE,IAAI,CAAC,+CAA+C,CAAC,CAAA;IACjL,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAE,CAAC,KAAK,WAAW;WAC7E,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,CAAE,CAAC,KAAK,cAAc;QAAE,IAAI,CAAC,uDAAuD,CAAC,CAAA;IACxJ,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAE,CAAC,KAAK,WAAW;QAAE,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACzJ,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAE,CAAC,EAAE,CAAA;AAC1F,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,KAA0B;IAC9D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC7B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5D,MAAM,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,QAAwD;IAC7F,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM;QAAE,IAAI,CAAC,8BAA8B,CAAC,CAAA;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAA;IACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;WAC1D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;WACxI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;WAC3D,KAAK,CAAC,SAAS,KAAK,UAAU,IAAI,KAAK,CAAC,cAAc,KAAK,eAAe;WAC1E,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU;WACxC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAC7I,OAAO,KAAK,CAAC,KAAK,CAAA;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,UAAkB,EAAE,KAAa,EAAE,WAAmB;IACzE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK;QAC5F,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM;QAC7D,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,EAAE,WAAW,EAAE,EAAE,CAAA;AACpF,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,KAAa,EAAE,OAAe,EAAE,MAAmB;IAChG,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,EACzF,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACrD,IAAI,MAAM,KAAK,KAAK;QAAE,IAAI,CAAC,sDAAsD,CAAC,CAAA;AACpF,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,KAAa,EAAE,QAES,EAAE,OAA2B,EAAE,MAAmB;IAC9F,MAAM,SAAS,CAAC,KAAK,CAAC,CAAA;IACtB,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAAE,IAAI,CAAC,0CAA0C,CAAC,CAAA;IAC1J,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAA;IACrH,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAA;IAC3C,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,aAAa;WAC7E,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;WACxE,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,IAAI,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY;WACxF,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,YAAY,IAAI,KAAK,CAAC,WAAW,EAAE,UAAU,KAAK,QAAQ,CAAC,UAAU;WACrG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;WAC3C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;WAC1E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;WAC5E,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU;WACxC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;QAAE,IAAI,CAAC,2DAA2D,CAAC,CAAA;IACpN,IAAI,MAAM,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,WAAW;QAAE,IAAI,CAAC,oCAAoC,CAAC,CAAA;IACnI,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3G,MAAM,CAAC,cAAc,EAAE,CAAA;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAA;AAC/F,CAAC;AAED;wEACwE;AACxE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KACM;IAClD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,6BAA6B,CAAC,CAAA;IAClG,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAChF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;IACrF,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,SAAS,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,CAAA;IACrH,IAAI,OAAO,KAAK,CAAC,WAAW,EAAE,UAAU,KAAK,QAAQ;QAAE,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAC7F,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;IACnE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,CAAA;IAC3D,OAAO,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU;QAC/E,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM;QAC7F,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;AACtH,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,KACQ;IACvD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,6BAA6B,CAAC,CAAA;IAClG,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;QAAE,MAAM,IAAI,wBAAwB,CAAC,uBAAuB,CAAC,CAAA;IACvH,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAChF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC3D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAChD,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAA;IAAC,CAAC;IAClI,MAAM,SAAS,CAAC,MAAM,CAAC,CAAA;IACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACnJ,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC,CAAA;IACrE,MAAM,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACzB,IAAI,OAAiD,CAAA;IACrD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC1D,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QACzC,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY;YACpH,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM;YAChF,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAA;QACpE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YAC1D,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAA;YACpE,MAAM,KAAK,CAAA;QACb,CAAC,CAAC,CAAA;QACF,IAAI,OAAO;YAAE,OAAO,MAAM,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC5C,MAAM,KAAK,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5C,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,wBAAwB,CAAC,CAAA;QACtF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,CAAC,EAC5G,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;QAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAC3C,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QAC1D,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,2CAA2C,CAAC,CAAA;QACrH,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,OAAO,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAA;QACtF,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAE,CAAC,CAAA;QACrH,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAA;QACtE,MAAM,MAAM,GAAwB,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY;YAC7F,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,CAAA;QAC7E,MAAM,OAAO,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU;YACrF,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAA;QAC7H,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACnI,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QAAC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;QACvD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;YACzD,IAAI,OAAO,EAAE,WAAW,EAAE,IAAI,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;gBACzF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;gBAClD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/H,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAA;IAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type RsiBuildEnvironment } from './rsi-build.js';
|
|
2
|
+
import type { RsiSourceWorkspace } from './rsi-source.js';
|
|
3
|
+
export interface RsiCreationBuildEnvironment {
|
|
4
|
+
schemaVersion: 1;
|
|
5
|
+
sourceCommit: string;
|
|
6
|
+
sourceImage: string;
|
|
7
|
+
image: string;
|
|
8
|
+
dockerPath: string;
|
|
9
|
+
}
|
|
10
|
+
interface Input {
|
|
11
|
+
dshHome: string;
|
|
12
|
+
profile: string;
|
|
13
|
+
source: RsiSourceWorkspace;
|
|
14
|
+
build: RsiBuildEnvironment;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
}
|
|
17
|
+
/** Verify frozen local inputs only. This reader never invokes Docker. */
|
|
18
|
+
export declare function readRsiCreationBuildEnvironment(input: Input): Promise<RsiCreationBuildEnvironment>;
|
|
19
|
+
export declare function readRsiCreationBuildInStage(input: {
|
|
20
|
+
logicalHome: string;
|
|
21
|
+
stagePhysicalHome: string;
|
|
22
|
+
profile: string;
|
|
23
|
+
stagedSource: RsiSourceWorkspace;
|
|
24
|
+
stagedBuild: RsiBuildEnvironment;
|
|
25
|
+
signal?: AbortSignal;
|
|
26
|
+
}): Promise<RsiCreationBuildEnvironment>;
|
|
27
|
+
/** Bind a freshly built candidate image to a stopped, copied Home. The old
|
|
28
|
+
* logical Home and the candidate receipt are never written by this operation. */
|
|
29
|
+
export declare function materializeRsiCreationBuildInStage(input: {
|
|
30
|
+
candidateHome: string;
|
|
31
|
+
stagePhysicalHome: string;
|
|
32
|
+
logicalHome: string;
|
|
33
|
+
profile: string;
|
|
34
|
+
candidateSource: RsiSourceWorkspace;
|
|
35
|
+
candidateBuild: RsiBuildEnvironment;
|
|
36
|
+
stagedSource: RsiSourceWorkspace;
|
|
37
|
+
stagedBuild: RsiBuildEnvironment;
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
}): Promise<{
|
|
40
|
+
creationBuild: RsiCreationBuildEnvironment;
|
|
41
|
+
candidateReceiptSha256: string;
|
|
42
|
+
receiptSha256: string;
|
|
43
|
+
}>;
|
|
44
|
+
/** Caller holds the DSH_HOME lifecycle lock. Build or replay an immutable image. */
|
|
45
|
+
export declare function prepareRsiCreationBuildEnvironment(input: Input): Promise<RsiCreationBuildEnvironment>;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=rsi-creation-build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsi-creation-build.d.ts","sourceRoot":"","sources":["../src/rsi-creation-build.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoD,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAC3G,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAezD,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,CAAC,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;AAaD,UAAU,KAAK;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE;AAoIlI,yEAAyE;AACzE,wBAAsB,+BAA+B,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAOxG;AAED,wBAAsB,2BAA2B,CAAC,KAAK,EAAE;IACvD,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;IAC/D,YAAY,EAAE,kBAAkB,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CACzF,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAcvC;AAED;iFACiF;AACjF,wBAAsB,kCAAkC,CAAC,KAAK,EAAE;IAC9D,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;IACtF,eAAe,EAAE,kBAAkB,CAAC;IAAC,cAAc,EAAE,mBAAmB,CAAA;IACxE,YAAY,EAAE,kBAAkB,CAAC;IAAC,WAAW,EAAE,mBAAmB,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CACzF,GAAG,OAAO,CAAC;IAAE,aAAa,EAAE,2BAA2B,CAAC;IAAC,sBAAsB,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,CA8EjH;AAED,oFAAoF;AACpF,wBAAsB,kCAAkC,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,2BAA2B,CAAC,CA0D3G"}
|