@telorun/cli 0.89.0 → 0.90.0

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.
Files changed (57) hide show
  1. package/dist/bundle/built-layers.d.ts +36 -0
  2. package/dist/bundle/built-layers.d.ts.map +1 -0
  3. package/dist/bundle/built-layers.js +84 -0
  4. package/dist/bundle/built-layers.js.map +1 -0
  5. package/dist/bundle/module-payload.d.ts +14 -10
  6. package/dist/bundle/module-payload.d.ts.map +1 -1
  7. package/dist/bundle/module-payload.js +76 -14
  8. package/dist/bundle/module-payload.js.map +1 -1
  9. package/dist/bundle/partition-layers.d.ts +13 -6
  10. package/dist/bundle/partition-layers.d.ts.map +1 -1
  11. package/dist/bundle/partition-layers.js +49 -7
  12. package/dist/bundle/partition-layers.js.map +1 -1
  13. package/dist/bundle/payload-drift.d.ts +1 -1
  14. package/dist/bundle/payload-drift.d.ts.map +1 -1
  15. package/dist/bundle/select-files.d.ts +11 -2
  16. package/dist/bundle/select-files.d.ts.map +1 -1
  17. package/dist/bundle/select-files.js +23 -8
  18. package/dist/bundle/select-files.js.map +1 -1
  19. package/dist/bundle/staged-files.d.ts +43 -0
  20. package/dist/bundle/staged-files.d.ts.map +1 -0
  21. package/dist/bundle/staged-files.js +158 -0
  22. package/dist/bundle/staged-files.js.map +1 -0
  23. package/dist/bundle/warm-layers.d.ts +11 -6
  24. package/dist/bundle/warm-layers.d.ts.map +1 -1
  25. package/dist/bundle/warm-layers.js +26 -10
  26. package/dist/bundle/warm-layers.js.map +1 -1
  27. package/dist/commands/install.d.ts +1 -0
  28. package/dist/commands/install.d.ts.map +1 -1
  29. package/dist/commands/install.js +7 -1
  30. package/dist/commands/install.js.map +1 -1
  31. package/dist/commands/module.d.ts.map +1 -1
  32. package/dist/commands/module.js +11 -5
  33. package/dist/commands/module.js.map +1 -1
  34. package/dist/commands/publish.d.ts.map +1 -1
  35. package/dist/commands/publish.js +5 -1
  36. package/dist/commands/publish.js.map +1 -1
  37. package/dist/commands/release.d.ts +2 -1
  38. package/dist/commands/release.d.ts.map +1 -1
  39. package/dist/commands/release.js +65 -5
  40. package/dist/commands/release.js.map +1 -1
  41. package/dist/controller-runtime.d.ts +25 -3
  42. package/dist/controller-runtime.d.ts.map +1 -1
  43. package/dist/controller-runtime.js +39 -9
  44. package/dist/controller-runtime.js.map +1 -1
  45. package/dist/release/cargo-toml.d.ts +17 -0
  46. package/dist/release/cargo-toml.d.ts.map +1 -0
  47. package/dist/release/cargo-toml.js +253 -0
  48. package/dist/release/cargo-toml.js.map +1 -0
  49. package/dist/release/crate-inputs.d.ts +41 -0
  50. package/dist/release/crate-inputs.d.ts.map +1 -0
  51. package/dist/release/crate-inputs.js +407 -0
  52. package/dist/release/crate-inputs.js.map +1 -0
  53. package/dist/release/stage.d.ts +61 -0
  54. package/dist/release/stage.d.ts.map +1 -0
  55. package/dist/release/stage.js +506 -0
  56. package/dist/release/stage.js.map +1 -0
  57. package/package.json +6 -6
@@ -0,0 +1,407 @@
1
+ /**
2
+ * The build inputs of a crate-built source, as one digest.
3
+ *
4
+ * A source whose files are prebuilt from a crate in this repository names that
5
+ * crate (`build: { cargo: <dir> }`), and `telo release stage --pin` records what
6
+ * built them (`build.inputs`): the committed files of the crate and of every
7
+ * path crate it reaches transitively — through a path dependency or a `[patch]`
8
+ * entry — the `Cargo.lock` packages those crates reach, the cargo configuration
9
+ * and toolchain files that apply where the crate is built, and what the
10
+ * workspace root's `Cargo.toml` passes down. A lock entry nothing here depends
11
+ * on is not an input, so an unrelated crate's new dependency trips no source.
12
+ * `telo release check` recomputes the same digest and fails when it moved, so a
13
+ * module never ships binaries older than the code they were built from — and an
14
+ * edit to a crate every controller depends on (the SDK, the controller ABI)
15
+ * trips every source built on it.
16
+ *
17
+ * Files are what git tracks, read from the working tree: build output, ignored
18
+ * files and a scratch file nobody added are not inputs, wherever they sit.
19
+ * Cargo is never invoked, so the check needs no toolchain and builds nothing.
20
+ */
21
+ import { isModuleKind, readModuleSources, sha256Base64Url, } from "@telorun/analyzer";
22
+ import { defaultCustomTags } from "@telorun/templating";
23
+ import { execFileSync } from "node:child_process";
24
+ import * as fs from "node:fs";
25
+ import * as path from "node:path";
26
+ import { parseAllDocuments } from "yaml";
27
+ import { parseCargoToml } from "./cargo-toml.js";
28
+ /** Files that configure a build from the directory they sit in downward. */
29
+ const BUILD_CONFIG_FILES = [
30
+ ".cargo/config",
31
+ ".cargo/config.toml",
32
+ "rust-toolchain",
33
+ "rust-toolchain.toml",
34
+ ];
35
+ /** What the workspace root's `Cargo.toml` passes down to every member's build. */
36
+ const INHERITED_ROOT_KEYS = [
37
+ ["patch"],
38
+ ["replace"],
39
+ ["profile"],
40
+ ["workspace", "resolver"],
41
+ ["workspace", "package"],
42
+ ["workspace", "lints"],
43
+ ];
44
+ const isTable = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
45
+ function readManifest(dir) {
46
+ const file = path.join(dir, "Cargo.toml");
47
+ if (!fs.existsSync(file))
48
+ throw new Error(`'${dir}' holds no Cargo.toml, so it is not a crate.`);
49
+ return parseCargoToml(fs.readFileSync(file, "utf8"), file);
50
+ }
51
+ /** The directory of the workspace governing `crateDir` — the one whose
52
+ * `Cargo.lock` fixed its registry dependencies — resolved as cargo does. */
53
+ function workspaceRootOf(crateDir, manifest) {
54
+ if (isTable(manifest.workspace))
55
+ return { dir: crateDir, manifest };
56
+ const pkg = manifest.package;
57
+ if (isTable(pkg) && typeof pkg.workspace === "string") {
58
+ const dir = path.resolve(crateDir, pkg.workspace);
59
+ return { dir, manifest: readManifest(dir) };
60
+ }
61
+ for (let dir = path.dirname(crateDir);; dir = path.dirname(dir)) {
62
+ if (fs.existsSync(path.join(dir, "Cargo.toml"))) {
63
+ const candidate = readManifest(dir);
64
+ const workspace = candidate.workspace;
65
+ if (isTable(workspace)) {
66
+ const relative = path.relative(dir, crateDir).split(path.sep).join("/");
67
+ const excluded = Array.isArray(workspace.exclude) && workspace.exclude.some((entry) => typeof entry === "string" && (relative === entry.replace(/\/+$/, "") || relative.startsWith(`${entry.replace(/\/+$/, "")}/`)));
68
+ return excluded ? { dir: crateDir, manifest } : { dir, manifest: candidate };
69
+ }
70
+ }
71
+ if (path.dirname(dir) === dir)
72
+ return { dir: crateDir, manifest };
73
+ }
74
+ }
75
+ /** The directories of the path dependencies one crate's manifest declares — in
76
+ * `[dependencies]`, `[build-dependencies]` and their per-target forms, the ones
77
+ * that link into the build — with `workspace = true` resolved against the
78
+ * workspace root's `[workspace.dependencies]`. */
79
+ function pathDependencies(crateDir, manifest, root, inheritedNames) {
80
+ const tables = [manifest.dependencies, manifest["build-dependencies"]];
81
+ if (isTable(manifest.target)) {
82
+ for (const target of Object.values(manifest.target)) {
83
+ if (isTable(target))
84
+ tables.push(target.dependencies, target["build-dependencies"]);
85
+ }
86
+ }
87
+ const workspaceDeps = isTable(root.manifest.workspace) ? root.manifest.workspace.dependencies : undefined;
88
+ const out = [];
89
+ for (const table of tables) {
90
+ if (!isTable(table))
91
+ continue;
92
+ for (const [name, spec] of Object.entries(table)) {
93
+ if (!isTable(spec))
94
+ continue;
95
+ if (typeof spec.path === "string") {
96
+ out.push(path.resolve(crateDir, spec.path));
97
+ }
98
+ else if (spec.workspace === true) {
99
+ inheritedNames.add(name);
100
+ const inherited = isTable(workspaceDeps) ? workspaceDeps[name] : undefined;
101
+ if (inherited === undefined) {
102
+ throw new Error(`${path.join(crateDir, "Cargo.toml")}: dependency '${name}' sets workspace = true, but ` +
103
+ `${path.join(root.dir, "Cargo.toml")} declares no [workspace.dependencies] '${name}'.`);
104
+ }
105
+ if (isTable(inherited) && typeof inherited.path === "string") {
106
+ out.push(path.resolve(root.dir, inherited.path));
107
+ }
108
+ }
109
+ }
110
+ }
111
+ return out;
112
+ }
113
+ /** Package name → directory of every path crate the workspace root's `[patch]`
114
+ * tables substitute for a registry or git dependency. */
115
+ function patchedPathCrates(root) {
116
+ const out = new Map();
117
+ const patch = root.manifest.patch;
118
+ if (!isTable(patch))
119
+ return out;
120
+ for (const registry of Object.values(patch)) {
121
+ if (!isTable(registry))
122
+ continue;
123
+ for (const [name, spec] of Object.entries(registry)) {
124
+ if (!isTable(spec) || typeof spec.path !== "string")
125
+ continue;
126
+ const crate = typeof spec.package === "string" ? spec.package : name;
127
+ out.set(crate, path.resolve(root.dir, spec.path));
128
+ }
129
+ }
130
+ return out;
131
+ }
132
+ /** The git work tree `dir` belongs to. Not being able to ask is a failure. */
133
+ function gitTopLevel(dir) {
134
+ return realPath(git(dir, ["rev-parse", "--show-toplevel"]).trim());
135
+ }
136
+ function git(cwd, args) {
137
+ try {
138
+ return execFileSync("git", args, { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
139
+ }
140
+ catch (err) {
141
+ const stderr = err.stderr;
142
+ throw new Error(`\`git ${args.join(" ")}\` failed in ${cwd}` +
143
+ `${typeof stderr === "string" && stderr.trim() !== "" ? ` (${stderr.trim()})` : ""}. ` +
144
+ `A crate's build inputs are the files git tracks, so the digest is taken in the ` +
145
+ `repository's work tree.`);
146
+ }
147
+ }
148
+ /** A path with every link resolved, in the form the OS reports it. The native
149
+ * resolver, because it is the one that expands a Windows 8.3 short name
150
+ * (`RUNNER~1`) — git names the work tree by its long name, and a path compared
151
+ * against it in the other form reads as outside the repository. */
152
+ function realPath(target) {
153
+ return fs.realpathSync.native(target);
154
+ }
155
+ /** The files git tracks in `repo`, by repository-relative `/`-separated name.
156
+ * Listed once per digest and matched in memory: a process spawn costs far more
157
+ * than the listing, above all on Windows. */
158
+ class TrackedFiles {
159
+ repo;
160
+ names;
161
+ constructor(repo) {
162
+ this.repo = repo;
163
+ this.names = new Set(git(repo, ["ls-files", "-z", "--cached"]).split("\0").filter((name) => name !== ""));
164
+ }
165
+ nameOf(file) {
166
+ return path.relative(this.repo, file).split(path.sep).join("/");
167
+ }
168
+ has(file) {
169
+ return this.names.has(this.nameOf(file));
170
+ }
171
+ /** The tracked files under `dirs`, absolute. A tracked file deleted from the
172
+ * work tree is not an input any more, so it is left out. */
173
+ under(dirs) {
174
+ const prefixes = dirs.map((dir) => this.nameOf(dir));
175
+ return [...this.names]
176
+ .filter((name) => prefixes.some((prefix) => prefix === "" || name.startsWith(`${prefix}/`)))
177
+ .map((name) => path.join(this.repo, name))
178
+ .filter((file) => fs.existsSync(file));
179
+ }
180
+ }
181
+ /** JSON with object keys sorted, so equal TOML data renders to equal text. */
182
+ function canonical(value) {
183
+ if (value === undefined)
184
+ return "null";
185
+ if (Array.isArray(value))
186
+ return `[${value.map(canonical).join(",")}]`;
187
+ if (isTable(value)) {
188
+ return `{${Object.keys(value)
189
+ .sort()
190
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
191
+ .join(",")}}`;
192
+ }
193
+ return JSON.stringify(value);
194
+ }
195
+ /**
196
+ * The `Cargo.lock` packages the given crates reach through the lock's own
197
+ * dependency graph. A dependency is written `name`, `name version` or
198
+ * `name version (source)` — as specific as the lock needs to tell packages of one
199
+ * name apart — and one that matches no package, or several, is refused rather
200
+ * than guessed.
201
+ */
202
+ function reachedLockPackages(lockfile, crateNames) {
203
+ const lock = parseCargoToml(fs.readFileSync(lockfile, "utf8"), lockfile);
204
+ const packages = [];
205
+ for (const entry of Array.isArray(lock.package) ? lock.package : []) {
206
+ if (!isTable(entry) || typeof entry.name !== "string" || typeof entry.version !== "string") {
207
+ throw new Error(`${lockfile}: a [[package]] entry has no name or version.`);
208
+ }
209
+ packages.push({
210
+ name: entry.name,
211
+ version: entry.version,
212
+ ...(typeof entry.source === "string" ? { source: entry.source } : {}),
213
+ entry,
214
+ });
215
+ }
216
+ const find = (spec, from) => {
217
+ const match = /^(\S+)(?: (\S+))?(?: \((.+)\))?$/.exec(spec);
218
+ const candidates = match
219
+ ? packages.filter((p) => p.name === match[1] &&
220
+ (match[2] === undefined || p.version === match[2]) &&
221
+ (match[3] === undefined || p.source === match[3]))
222
+ : [];
223
+ if (candidates.length !== 1) {
224
+ throw new Error(`${lockfile}: ${from} depends on '${spec}', which names ${candidates.length === 0 ? "no" : "more than one"} ` +
225
+ `[[package]] — regenerate the lockfile with \`cargo generate-lockfile\`.`);
226
+ }
227
+ return candidates[0];
228
+ };
229
+ const reached = new Set();
230
+ const queue = crateNames.map((name) => {
231
+ const local = packages.filter((p) => p.name === name && p.source === undefined);
232
+ if (local.length !== 1) {
233
+ throw new Error(`${lockfile} has ${local.length === 0 ? "no" : "more than one"} entry for the path crate '${name}' — ` +
234
+ `run \`cargo generate-lockfile\` in the workspace.`);
235
+ }
236
+ return local[0];
237
+ });
238
+ while (queue.length > 0) {
239
+ const pkg = queue.shift();
240
+ if (reached.has(pkg))
241
+ continue;
242
+ reached.add(pkg);
243
+ const deps = pkg.entry.dependencies;
244
+ for (const dep of Array.isArray(deps) ? deps : []) {
245
+ if (typeof dep !== "string")
246
+ throw new Error(`${lockfile}: '${pkg.name}' lists a non-string dependency.`);
247
+ queue.push(find(dep, `'${pkg.name} ${pkg.version}'`));
248
+ }
249
+ }
250
+ return [...reached];
251
+ }
252
+ /** The value at a dotted key path, or undefined. */
253
+ function valueAt(table, keys) {
254
+ let current = table;
255
+ for (const key of keys)
256
+ current = isTable(current) ? current[key] : undefined;
257
+ return current;
258
+ }
259
+ /**
260
+ * The digest of a crate's build inputs, `sha256-<base64url>`: one line per input,
261
+ * sorted — each tracked file of the crate and of every path crate it reaches
262
+ * (workspace-root-relative path and content digest), each `Cargo.lock` package
263
+ * those crates reach, each cargo configuration or toolchain file from the crate's
264
+ * directory up to the repository root, and from the workspace root's
265
+ * `Cargo.toml` the inherited `[workspace.dependencies]` entries plus `[patch]`,
266
+ * `[replace]`, `[profile]` and `[workspace]`'s `resolver`, `package` and `lints`.
267
+ */
268
+ export async function crateInputsDigest(crateDir) {
269
+ const manifest = readManifest(crateDir);
270
+ const root = workspaceRootOf(crateDir, manifest);
271
+ const lockfile = path.join(root.dir, "Cargo.lock");
272
+ if (!fs.existsSync(lockfile)) {
273
+ throw new Error(`${root.dir} has no Cargo.lock. The lockfile fixes every registry dependency the build ` +
274
+ `links, so it is part of the digest — generate it with \`cargo generate-lockfile\`.`);
275
+ }
276
+ const repo = gitTopLevel(crateDir);
277
+ const tracked = new TrackedFiles(repo);
278
+ const rootDir = realPath(root.dir);
279
+ const patched = patchedPathCrates(root);
280
+ const crates = new Set();
281
+ const crateNames = [];
282
+ const inheritedNames = new Set();
283
+ const walk = (start) => {
284
+ const queue = [start];
285
+ while (queue.length > 0) {
286
+ const dir = realPath(queue.shift());
287
+ if (crates.has(dir))
288
+ continue;
289
+ if (!tracked.has(path.join(dir, "Cargo.toml"))) {
290
+ throw new Error(`${path.join(dir, "Cargo.toml")} is not tracked by git. A build input is a committed ` +
291
+ `file, so an uncommitted crate has none to digest — git add the crate.`);
292
+ }
293
+ crates.add(dir);
294
+ const own = dir === realPath(crateDir) ? manifest : readManifest(dir);
295
+ const name = isTable(own.package) ? own.package.name : undefined;
296
+ if (typeof name !== "string")
297
+ throw new Error(`${path.join(dir, "Cargo.toml")} declares no [package] name.`);
298
+ crateNames.push(name);
299
+ queue.push(...pathDependencies(dir, own, root, inheritedNames));
300
+ }
301
+ };
302
+ walk(crateDir);
303
+ // A path crate the lock reaches that no path dependency named was substituted
304
+ // by `[patch]`: its files link into the build as much as any other's.
305
+ let reached = reachedLockPackages(lockfile, crateNames);
306
+ for (;;) {
307
+ const unwalked = reached.filter((p) => p.source === undefined && !crateNames.includes(p.name));
308
+ if (unwalked.length === 0)
309
+ break;
310
+ for (const pkg of unwalked) {
311
+ const dir = patched.get(pkg.name);
312
+ if (dir === undefined) {
313
+ throw new Error(`${lockfile}: the crate reaches the path package '${pkg.name}', but neither a path ` +
314
+ `dependency nor a [patch] entry of ${path.join(root.dir, "Cargo.toml")} names its directory, ` +
315
+ `so its files cannot be digested — regenerate the lockfile with \`cargo generate-lockfile\`.`);
316
+ }
317
+ walk(dir);
318
+ }
319
+ reached = reachedLockPackages(lockfile, crateNames);
320
+ }
321
+ const lines = reached.map((p) => `Cargo.lock#${p.name} ${p.version} ${p.source ?? ""}\0${canonical(p.entry)}`);
322
+ const workspace = isTable(root.manifest.workspace) ? root.manifest.workspace : {};
323
+ const workspaceDeps = isTable(workspace.dependencies) ? workspace.dependencies : {};
324
+ for (const name of inheritedNames) {
325
+ lines.push(`Cargo.toml#workspace.dependencies.${name}\0${canonical(workspaceDeps[name])}`);
326
+ }
327
+ for (const keys of INHERITED_ROOT_KEYS) {
328
+ const value = valueAt(root.manifest, keys);
329
+ if (value !== undefined)
330
+ lines.push(`Cargo.toml#${keys.join(".")}\0${canonical(value)}`);
331
+ }
332
+ const configs = [];
333
+ for (let dir = realPath(crateDir);; dir = path.dirname(dir)) {
334
+ for (const name of BUILD_CONFIG_FILES)
335
+ configs.push(path.join(dir, name));
336
+ if (dir === repo || path.dirname(dir) === dir)
337
+ break;
338
+ }
339
+ const inputs = new Set(tracked.under([...crates]));
340
+ for (const config of configs) {
341
+ if (tracked.has(config) && fs.existsSync(config))
342
+ inputs.add(config);
343
+ }
344
+ for (const file of inputs) {
345
+ const name = path.relative(rootDir, file).split(path.sep).join("/");
346
+ lines.push(`${name}\0${await sha256Base64Url(fs.readFileSync(file))}`);
347
+ }
348
+ lines.sort();
349
+ return `sha256-${await sha256Base64Url(new TextEncoder().encode([...new Set(lines)].join("\n")))}`;
350
+ }
351
+ /** Recompute every crate-built source's inputs across `modules` and report each
352
+ * one that is unrecorded or has moved. */
353
+ export async function checkCrateInputs(modules) {
354
+ const failures = [];
355
+ for (const module of modules) {
356
+ const sources = moduleSources(module);
357
+ if (sources instanceof Error) {
358
+ failures.push({ module: module.key, source: "", message: sources.message });
359
+ continue;
360
+ }
361
+ for (const source of sources) {
362
+ if (source.build === undefined)
363
+ continue;
364
+ const { cargo, inputs } = source.build;
365
+ const fail = (message) => failures.push({ module: module.key, source: source.name, message });
366
+ let actual;
367
+ try {
368
+ actual = await crateInputsDigest(path.resolve(module.dir, cargo));
369
+ }
370
+ catch (err) {
371
+ fail(`cannot digest crate '${cargo}': ${err instanceof Error ? err.message : String(err)}`);
372
+ continue;
373
+ }
374
+ if (inputs === undefined) {
375
+ fail(`builds from crate '${cargo}' but records no build.inputs — run ` +
376
+ `\`telo release stage --pin --module ${module.key}\` after rebuilding its files.`);
377
+ }
378
+ else if (inputs !== actual) {
379
+ fail(`the build inputs of crate '${cargo}' moved (recorded ${inputs}, now ${actual}): a ` +
380
+ `tracked file of the crate or of a path crate it reaches, a lock package they reach, ` +
381
+ `or a cargo configuration applying to the build changed since its files were built. ` +
382
+ `Rebuild them and run \`telo release stage --pin --module ${module.key}\`.`);
383
+ }
384
+ }
385
+ }
386
+ return failures;
387
+ }
388
+ function moduleSources(module) {
389
+ const text = fs.readFileSync(module.manifestPath, "utf8");
390
+ for (const doc of parseAllDocuments(text, { customTags: defaultCustomTags() })) {
391
+ if (doc.errors.length > 0) {
392
+ return new Error(`${module.manifestPath} does not parse, so its crate inputs cannot be checked: ` +
393
+ doc.errors[0].message);
394
+ }
395
+ const json = doc.toJSON();
396
+ if (typeof json?.kind !== "string" || !isModuleKind(json.kind))
397
+ continue;
398
+ const { sources, problems } = readModuleSources(json);
399
+ if (problems.length > 0) {
400
+ return new Error(`its sources: block cannot be read, so its crate inputs cannot be checked:\n` +
401
+ problems.map((problem) => ` ${problem.message}`).join("\n"));
402
+ }
403
+ return sources;
404
+ }
405
+ return [];
406
+ }
407
+ //# sourceMappingURL=crate-inputs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crate-inputs.js","sourceRoot":"","sources":["../../src/release/crate-inputs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * `telo release stage` — fetch, extract, verify and pin the files a module's
3
+ * `sources:` block declares.
4
+ *
5
+ * Fetching is the CLI's alone: the kernel reads what this put on disk and never
6
+ * reaches an upstream. Plain staging only verifies against the pins in the
7
+ * manifest; `--pin` is the one writer of those pins, through the analyzer's
8
+ * byte-splice editor, so nothing else in `telo.yaml` moves — and nothing is
9
+ * written until the edited text reads back with exactly the pins computed.
10
+ */
11
+ import { type SourceArchiveFormat } from "@telorun/analyzer";
12
+ import { type BundleEntry } from "@telorun/kernel";
13
+ export interface StageTarget {
14
+ /** Workspace-relative module key, for messages. */
15
+ readonly key: string;
16
+ readonly dir: string;
17
+ readonly manifestPath: string;
18
+ }
19
+ export interface StageOutcome {
20
+ readonly module: string;
21
+ readonly source: string;
22
+ /** Module-relative path of the entry. */
23
+ readonly path: string;
24
+ readonly action: "verified" | "staged" | "linked" | "pinned";
25
+ }
26
+ export interface StageFailure {
27
+ readonly module: string;
28
+ readonly source?: string;
29
+ readonly path?: string;
30
+ readonly url?: string;
31
+ readonly message: string;
32
+ }
33
+ export interface StageResult {
34
+ readonly outcomes: StageOutcome[];
35
+ readonly failures: StageFailure[];
36
+ }
37
+ /** Reads the archive at a URL, in the format its source declares, into its entries. */
38
+ export type ArchiveReader = (url: string, format: SourceArchiveFormat) => Promise<BundleEntry[]>;
39
+ /**
40
+ * One fetch per URL for the life of the reader; the caller decides that life
41
+ * (the command takes one reader per module, so decoded archives do not pile up
42
+ * across a workspace). A request is bounded in time, in response size and in
43
+ * decompressed size, and may not end at a URL a source could not name.
44
+ */
45
+ export declare function createArchiveReader(options?: {
46
+ fetchImpl?: typeof fetch;
47
+ timeoutMs?: number;
48
+ maxBytes?: number;
49
+ maxExtractedBytes?: number;
50
+ }): ArchiveReader;
51
+ /**
52
+ * Stage one module's `sources:`. With `pin`, fetch every file entry, write its
53
+ * `sha256` and `executable` — and each built source's `build.inputs` — into the
54
+ * manifest, then stage against those pins. A module with no `sources:` block
55
+ * yields an empty result.
56
+ */
57
+ export declare function stageModule(target: StageTarget, options: {
58
+ pin: boolean;
59
+ archives: ArchiveReader;
60
+ }): Promise<StageResult>;
61
+ //# sourceMappingURL=stage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../src/release/stage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EASL,KAAK,mBAAmB,EAIzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAQhF,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC9D;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;CACnC;AAED,uFAAuF;AACvF,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAgBjG;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE;IACP,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACvB,GACL,aAAa,CAwBf;AA2ZD;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GACjD,OAAO,CAAC,WAAW,CAAC,CA2FtB"}