@telorun/cli 0.60.0 → 0.62.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.
package/README.md CHANGED
@@ -122,6 +122,15 @@ telo check https://example.com/manifest.yaml
122
122
 
123
123
  Accepts local paths, directories containing a `telo.yaml`, or HTTP(S) URLs.
124
124
 
125
+ Imports resolve through the same `.telo/manifests/` cache `telo run` reads, and `check` writes through to it after a successful load (disable with `--no-cache-write`). Freshness depends on how the import addresses its target:
126
+
127
+ - **Pinned** (`…@1.2.3#sha256-…`, or an `@sha256:` reference) — verified against the hash on read, so a repeat check of a fully pinned manifest needs no network at all.
128
+ - **Mutable OCI tag** — revalidated with one `HEAD` per reference against the digest recorded in `.telo/manifests/.origins.json`. If the tag has moved, that entry is dropped and refetched.
129
+ - **Registry ref** (`<namespace>/<name>@<version>`) — served from cache without revalidation; a published version is immutable by convention.
130
+ - **HTTP(S) URL** — never read from the cache by `check`, since its key carries no version segment and a hit would be served indefinitely. Always re-fetched (one request, the same cost revalidating would have).
131
+
132
+ One loader serves every path in a single invocation, so `telo check a b c` resolves a module shared between them once.
133
+
125
134
  **Example output:**
126
135
 
127
136
  ```
@@ -165,8 +174,9 @@ The cache lives next to the manifest at `<entry-manifest-dir>/.telo/`:
165
174
  - `.telo/manifests/registry/<host>/<path…>/<version>/telo.yaml` — registry-served manifests.
166
175
  - `.telo/manifests/oci/<host>/<repo…>/<tag>/telo.yaml` — manifests imported from an OCI registry.
167
176
  - `.telo/manifests/url/<host>/<pathname>` — manifests imported via raw HTTP URLs.
177
+ - `.telo/manifests/.origins.json` — for each cached import named by a **mutable tag**, the OCI manifest digest that produced the copy. `telo check` revalidates against it with one `HEAD` per reference; a pinned import needs no entry, since its bytes are verified against the ref's own hash.
168
178
 
169
- Every entry is keyed `<transport>/<host>/<path…>/<version>/<file>`, the same grammar the
179
+ Every manifest entry is keyed `<transport>/<host>/<path…>/<version>/<file>`, the same grammar the
170
180
  discovery hub uses for its cached manifests.
171
181
 
172
182
  Per-manifest scope means the whole `.telo/` tree is naturally portable: `COPY` the manifest dir into your image and both caches travel with it; no environment variable is required.
@@ -2,6 +2,7 @@ import type { Argv } from "yargs";
2
2
  export declare function check(argv: {
3
3
  paths: string[];
4
4
  registryUrl?: string;
5
+ cacheWrite?: boolean;
5
6
  }): Promise<void>;
6
7
  export declare function checkCommand(yargs: Argv): Argv;
7
8
  //# sourceMappingURL=check.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAoDlC,wBAAsB,KAAK,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B1F;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAoB9C"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAkOlC,wBAAsB,KAAK,CAAC,IAAI,EAAE;IAChC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DhB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAoB9C"}
@@ -1,13 +1,42 @@
1
1
  import { Loader, StaticAnalyzer, flattenForAnalyzer } from "@telorun/analyzer";
2
2
  import { assembleGraphDiagnostics } from "@telorun/ide-support";
3
+ import { LocalManifestCacheSource, resolveCacheRoot, resolveEntryDir, writeManifestCache, } from "@telorun/kernel";
3
4
  import { LocalFileSource } from "@telorun/kernel/manifest-sources/local-file-source";
4
5
  import { defaultTransportRegistry } from "@telorun/kernel/transports";
6
+ import * as fs from "fs/promises";
5
7
  import * as path from "path";
8
+ import { pathToFileURL } from "url";
6
9
  import { createLogger, formatAnalysisDiagnostics, formatDiagnostics } from "../logger.js";
10
+ import { RecordingCacheSource, readOriginDigests, revalidateMutableOciRefs, writeOriginDigests, } from "../manifest-freshness.js";
7
11
  const DEFAULT_REGISTRY_URL = "https://registry.telo.run";
8
- async function checkOne(inputPath, registryUrl, log) {
12
+ function cacheTargetFor(entryPath) {
13
+ const cacheRoot = resolveCacheRoot(entryPath);
14
+ const entryDir = resolveEntryDir(entryPath);
15
+ if (!cacheRoot || entryDir === null)
16
+ return null;
17
+ return { entryDir, manifestsDir: path.join(cacheRoot, "manifests") };
18
+ }
19
+ function resolveEntryPath(inputPath) {
9
20
  const isUrl = inputPath.startsWith("http://") || inputPath.startsWith("https://");
10
- const entryPath = isUrl ? inputPath : path.resolve(process.cwd(), inputPath);
21
+ return isUrl ? inputPath : path.resolve(process.cwd(), inputPath);
22
+ }
23
+ /**
24
+ * One loader for the whole invocation, ahead of the transports:
25
+ *
26
+ * - `LocalManifestCacheSource` makes a repeat check hermetic. Without it every
27
+ * `oci://` / registry import was re-pulled on every run even when fully
28
+ * pinned, which is the bulk of `check`'s wall time.
29
+ * - The loader is shared across *all* input paths, so `telo check a b c` reads
30
+ * a module common to several of them once. Its `urlToSource` / `fileCache`
31
+ * dedupe by canonical URL, so this is purely a cache-hit question — the
32
+ * resolution result for a given URL does not depend on which entry asked.
33
+ *
34
+ * A cache source is registered for every input path's cache root: the entries
35
+ * are content-addressed, so a hit under any root is as good as a hit under the
36
+ * one this path would write to, and a miss falls through unchanged.
37
+ */
38
+ function openSession(cacheTargets, registryUrl) {
39
+ const recorders = cacheTargets.map((t) => new RecordingCacheSource(new LocalManifestCacheSource(t.entryDir, registryUrl, t.manifestsDir), registryUrl));
11
40
  // The kernel's transport sources — the same set `install` / `run` use — so
12
41
  // `check` resolves every scheme they do, `oci://` included, direct-to-origin.
13
42
  // The browser-only `manifests.telo.sh` cache path stays the editor's; a CLI
@@ -15,14 +44,78 @@ async function checkOne(inputPath, registryUrl, log) {
15
44
  // plan: resolution never routes through the hub).
16
45
  const loader = new Loader([
17
46
  new LocalFileSource(),
47
+ ...recorders,
18
48
  ...defaultTransportRegistry(registryUrl).sources(),
19
49
  ]);
50
+ return {
51
+ loader,
52
+ recorders,
53
+ manifestsDirs: cacheTargets.map((t) => t.manifestsDir),
54
+ verified: new Map(),
55
+ };
56
+ }
57
+ /**
58
+ * Drop a stale cache entry: the file, the loader's memo of it, and the record
59
+ * that it was ever served. The next load re-resolves that one manifest through
60
+ * the transports and leaves every other file's memo intact.
61
+ *
62
+ * Removal failures are warned, not thrown. This is cache maintenance, and the
63
+ * rest of the command already treats caching as an optimization — a read-only
64
+ * or root-owned `.telo` must not change the exit code of a static check. An
65
+ * entry that could not be removed is still forgotten by the loader, so the
66
+ * reload re-fetches it rather than trusting bytes it just judged stale.
67
+ */
68
+ async function dropStaleEntry(file, session, log) {
69
+ try {
70
+ await fs.rm(file, { force: true });
71
+ }
72
+ catch (err) {
73
+ process.stderr.write(`${log.warn(`[manifest-cache] could not remove stale entry ${file}: ${err instanceof Error ? err.message : String(err)}`)}\n`);
74
+ }
75
+ session.loader.forget(pathToFileURL(file).href);
76
+ for (const recorder of session.recorders) {
77
+ for (const [url, served] of recorder.served) {
78
+ if (served === file)
79
+ recorder.served.delete(url);
80
+ }
81
+ }
82
+ }
83
+ async function checkOne(inputPath, registryUrl, session, cacheTarget, cacheWrite,
84
+ /** Digests already verified by a prior pass. Present only on the retry after
85
+ * a stale entry was dropped: revalidating again would re-`HEAD` the same
86
+ * tags, and the freshly fetched bytes are current by construction. */
87
+ knownDigests, log) {
88
+ const entryPath = resolveEntryPath(inputPath);
89
+ const isUrl = entryPath.startsWith("http://") || entryPath.startsWith("https://");
20
90
  try {
21
91
  // `desugarImports` so inline `imports:` maps expand into synthetic
22
92
  // Telo.Import manifests before analysis — `telo check` is a static
23
93
  // resolution consumer and must see inline imports exactly as the kernel does.
24
- const graph = await loader.loadGraph(entryPath, { desugarImports: true });
25
- const manifests = flattenForAnalyzer(graph);
94
+ const graph = await session.loader.loadGraph(entryPath, { desugarImports: true });
95
+ // Freshness before analysis: a verdict computed from a moved tag would be
96
+ // reported as authoritative. Pinned imports make this a no-op.
97
+ let digests = knownDigests ?? new Map();
98
+ if (!knownDigests && session.recorders.length > 0) {
99
+ const served = new Map();
100
+ for (const recorder of session.recorders) {
101
+ for (const [url, file] of recorder.served)
102
+ served.set(url, file);
103
+ }
104
+ const originsByRoot = new Map();
105
+ for (const dir of session.manifestsDirs) {
106
+ originsByRoot.set(dir, await readOriginDigests(dir));
107
+ }
108
+ const freshness = await revalidateMutableOciRefs(graph, served, originsByRoot, registryUrl, session.verified);
109
+ if (freshness.staleFiles.length > 0) {
110
+ return {
111
+ errorCount: 0,
112
+ warnCount: 0,
113
+ staleFiles: freshness.staleFiles,
114
+ digests: freshness.digests,
115
+ };
116
+ }
117
+ digests = freshness.digests;
118
+ }
26
119
  // `assembleGraphDiagnostics` is the shared assembler every host uses: it
27
120
  // folds parse, version-reconciliation, import-resolution, and static
28
121
  // analysis diagnostics into one list, holding back the cascade for files
@@ -30,28 +123,61 @@ async function checkOne(inputPath, registryUrl, log) {
30
123
  // `imports:` source thus surfaces here as a coded diagnostic — identical to
31
124
  // the editor — instead of a bare re-thrown load error. The CLI drops the
32
125
  // suppressed cascade; the editor / VS Code keep it available to render.
33
- const analysis = new StaticAnalyzer().analyze(manifests);
126
+ const analysis = new StaticAnalyzer().analyze(flattenForAnalyzer(graph));
34
127
  const { diagnostics } = assembleGraphDiagnostics(graph, analysis);
35
- return formatAnalysisDiagnostics(diagnostics, graph, log, entryPath);
128
+ const counts = formatAnalysisDiagnostics(diagnostics, graph, log, entryPath);
129
+ if (cacheWrite && cacheTarget) {
130
+ // Write-through so the next check — and the next `telo run` from this
131
+ // directory, which reads the same cache — is hermetic. Caching is an
132
+ // optimization: a read-only filesystem warns rather than fails the check.
133
+ try {
134
+ await writeManifestCache(graph, cacheTarget.entryDir, registryUrl, cacheTarget.manifestsDir);
135
+ await writeOriginDigests(cacheTarget.manifestsDir, digests);
136
+ }
137
+ catch (err) {
138
+ process.stderr.write(`${log.warn(`[manifest-cache] write failed: ${err instanceof Error ? err.message : String(err)}`)}\n`);
139
+ }
140
+ }
141
+ return { ...counts, staleFiles: [], digests };
36
142
  }
37
143
  catch (err) {
38
144
  const sourceLine = err.sourceLine;
39
145
  const displayPath = isUrl ? entryPath : path.relative(process.cwd(), entryPath);
40
146
  const loc = sourceLine !== undefined ? `:${sourceLine + 1}` : "";
41
147
  formatDiagnostics([{ message: err instanceof Error ? err.message : String(err) }], log, `${displayPath}${loc}`);
42
- return { errorCount: 1, warnCount: 0 };
148
+ return { errorCount: 1, warnCount: 0, staleFiles: [], digests: new Map() };
43
149
  }
44
150
  }
45
151
  export async function check(argv) {
46
152
  const log = createLogger(false);
47
153
  // Same fallback chain as `run` / `install`.
48
154
  const registryUrl = argv.registryUrl ?? process.env.TELO_REGISTRY_URL ?? DEFAULT_REGISTRY_URL;
155
+ const cacheWrite = argv.cacheWrite !== false;
156
+ const cacheTargets = new Map();
157
+ for (const p of argv.paths) {
158
+ const target = cacheTargetFor(resolveEntryPath(p));
159
+ if (target)
160
+ cacheTargets.set(target.manifestsDir, target);
161
+ }
162
+ const session = openSession([...cacheTargets.values()], registryUrl);
49
163
  let totalErrors = 0;
50
164
  let totalWarns = 0;
51
165
  for (const p of argv.paths) {
52
- const { errorCount, warnCount } = await checkOne(p, registryUrl, log);
53
- totalErrors += errorCount;
54
- totalWarns += warnCount;
166
+ const cacheTarget = cacheTargetFor(resolveEntryPath(p));
167
+ let outcome = await checkOne(p, registryUrl, session, cacheTarget, cacheWrite, null, log);
168
+ if (outcome.staleFiles.length > 0) {
169
+ // A mutable tag moved under the cache. Drop just those entries — file,
170
+ // loader memo, and served record — so every other path's resolution
171
+ // survives, then re-check. Revalidation is off on the retry: the digests
172
+ // were established a moment ago, and the reload cannot be stale because
173
+ // the entries it would have used are gone.
174
+ for (const file of outcome.staleFiles) {
175
+ await dropStaleEntry(file, session, log);
176
+ }
177
+ outcome = await checkOne(p, registryUrl, session, cacheTarget, cacheWrite, outcome.digests, log);
178
+ }
179
+ totalErrors += outcome.errorCount;
180
+ totalWarns += outcome.warnCount;
55
181
  }
56
182
  if (totalErrors === 0 && totalWarns === 0) {
57
183
  console.log(log.ok("✓") + " No issues found");
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AA4IlC,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,KAAK,EAAE,OAAO,CAAC;IACf;gFAC4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAgQF,wBAAsB,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiEtD;AAuFD,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAoE5C"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAyKlC,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,KAAK,EAAE,OAAO,CAAC;IACf;gFAC4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAqRF,wBAAsB,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEtD;AAwGD,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAoE5C"}
@@ -82,14 +82,41 @@ function createWatcherSet(log, onChange) {
82
82
  const watchers = new Map();
83
83
  const debounceTimers = new Map();
84
84
  let active = true;
85
+ function inodeOf(fsPath) {
86
+ try {
87
+ return fs.statSync(fsPath, { bigint: true }).ino;
88
+ }
89
+ catch {
90
+ return null;
91
+ }
92
+ }
93
+ /** An editor's atomic save (write a temp file, then rename it over the path)
94
+ * puts a NEW inode behind the path. The watcher stays bound to the replaced
95
+ * one, so it never fires again — and emits no `error`, so the handler below
96
+ * never runs and `sync` skips the path as already watched. The event we are
97
+ * handling is that watcher's last gasp, so rebind on it. Keyed on the inode
98
+ * rather than on a `rename` event type, which bun does not deliver. */
99
+ function rebindIfReplaced(fsPath) {
100
+ const entry = watchers.get(fsPath);
101
+ if (!entry)
102
+ return;
103
+ const inode = inodeOf(fsPath);
104
+ if (inode === null || inode === entry.inode)
105
+ return;
106
+ entry.watcher.close();
107
+ watchers.delete(fsPath);
108
+ watchFile(fsPath);
109
+ }
85
110
  function watchFile(fsPath) {
86
111
  if (!active || watchers.has(fsPath))
87
112
  return;
113
+ const inode = inodeOf(fsPath);
88
114
  let watcher;
89
115
  try {
90
116
  watcher = fs.watch(fsPath, () => {
91
117
  if (!active)
92
118
  return;
119
+ rebindIfReplaced(fsPath);
93
120
  const existing = debounceTimers.get(fsPath);
94
121
  if (existing)
95
122
  clearTimeout(existing);
@@ -107,7 +134,7 @@ function createWatcherSet(log, onChange) {
107
134
  }
108
135
  watcher.on("error", () => {
109
136
  // OS invalidated the watch (e.g. file deleted). Remove and re-establish.
110
- if (watchers.get(fsPath) === watcher) {
137
+ if (watchers.get(fsPath)?.watcher === watcher) {
111
138
  watchers.delete(fsPath);
112
139
  setTimeout(() => {
113
140
  if (active)
@@ -115,7 +142,7 @@ function createWatcherSet(log, onChange) {
115
142
  }, 50);
116
143
  }
117
144
  });
118
- watchers.set(fsPath, watcher);
145
+ watchers.set(fsPath, { watcher, inode });
119
146
  }
120
147
  return {
121
148
  sync(files) {
@@ -128,8 +155,8 @@ function createWatcherSet(log, onChange) {
128
155
  for (const t of debounceTimers.values())
129
156
  clearTimeout(t);
130
157
  debounceTimers.clear();
131
- for (const w of watchers.values())
132
- w.close();
158
+ for (const { watcher } of watchers.values())
159
+ watcher.close();
133
160
  watchers.clear();
134
161
  },
135
162
  };
@@ -318,9 +345,32 @@ async function persistManifestCache(argv, kernel, log, cacheRoot) {
318
345
  process.stderr.write(`${log.warn(`[manifest-cache] write failed: ${err instanceof Error ? err.message : String(err)}`)}\n`);
319
346
  }
320
347
  }
348
+ /** Count the errors a reader actually has to act on: entries the kernel marked
349
+ * `derived` are shadows of another failure, and an entry that only wraps a
350
+ * nested context (an import) counts as whatever failed inside it. Never
351
+ * reports zero for a real failure — a wrapper whose children are all derived
352
+ * still counts as one. */
353
+ function countRootErrors(diagnostics) {
354
+ let count = 0;
355
+ for (const d of diagnostics) {
356
+ if (d.severity === "warning")
357
+ continue;
358
+ const fromChildren = d.children?.length ? countRootErrors(d.children) : 0;
359
+ // A collapsed entry contributes nothing itself, but a nested context it
360
+ // wraps still carries its own root causes.
361
+ if (d.derived)
362
+ count += fromChildren;
363
+ else
364
+ count += fromChildren || 1;
365
+ }
366
+ return count;
367
+ }
321
368
  /** Format an error as diagnostics on the terminal. Returns the non-warning
322
- * count so the single-shot path can pick an exit code while watch keeps going. */
323
- function reportError(argv, error, log) {
369
+ * count so the single-shot path can pick an exit code while watch keeps going.
370
+ * The kernel's loaded graph is what turns a static failure's `origin` into a
371
+ * `file:line:col` — it is present for every failure raised after the graph
372
+ * loaded, which is every static one. */
373
+ function reportError(argv, error, log, kernel) {
324
374
  const isUrl = argv.path.startsWith("http://") || argv.path.startsWith("https://");
325
375
  const displayPath = isUrl
326
376
  ? argv.path
@@ -334,8 +384,8 @@ function reportError(argv, error, log) {
334
384
  code: error?.code,
335
385
  },
336
386
  ];
337
- formatDiagnostics(diags, log, displayPath);
338
- const errorCount = diags.filter((d) => d.severity !== "warning").length;
387
+ formatDiagnostics(diags, log, displayPath, kernel?.getLoadedGraph());
388
+ const errorCount = countRootErrors(diags);
339
389
  const warnCount = diags.filter((d) => d.severity === "warning").length;
340
390
  const parts = [];
341
391
  if (errorCount > 0)
@@ -356,8 +406,12 @@ export async function run(argv) {
356
406
  const debug = argv.debug || argv.inspect !== undefined
357
407
  ? await startDebugSession(argv, log, cacheRoot)
358
408
  : undefined;
409
+ // Held outside the try so the catch can reach the loaded graph a static
410
+ // failure's location resolves against.
411
+ let bootedKernel;
359
412
  try {
360
413
  const kernel = await buildKernel(argv, log, cacheRoot);
414
+ bootedKernel = kernel;
361
415
  debug?.attach(kernel);
362
416
  const shutdown = () => {
363
417
  // Cooperatively cancel the boot run first (so honoring targets / in-flight
@@ -404,7 +458,7 @@ export async function run(argv) {
404
458
  }
405
459
  catch (error) {
406
460
  debug?.stop();
407
- reportError(argv, error, log);
461
+ reportError(argv, error, log, bootedKernel);
408
462
  process.exit(1);
409
463
  }
410
464
  }
@@ -427,10 +481,20 @@ async function runWatch(argv, log) {
427
481
  let stopping = false;
428
482
  let signalChange = null;
429
483
  let currentKernel = null;
484
+ /** A change that arrived while no cycle was waiting on a gate — teardown and
485
+ * the next load take seconds, and resolving an already-settled promise is a
486
+ * no-op, so the edit would be lost. The next cycle consumes it instead. */
487
+ let pendingChange = false;
430
488
  // One watcher set for the whole session — see createWatcherSet. A change
431
489
  // resolves the current cycle's `changed` gate; cycles re-read `signalChange`
432
490
  // so the same watcher drives every reload.
433
- const watchers = createWatcherSet(log, () => signalChange?.());
491
+ const notifyChange = () => {
492
+ if (signalChange)
493
+ signalChange();
494
+ else
495
+ pendingChange = true;
496
+ };
497
+ const watchers = createWatcherSet(log, notifyChange);
434
498
  const requestStop = () => {
435
499
  stopping = true;
436
500
  log.info("\n[watch] stopping...");
@@ -438,7 +502,7 @@ async function runWatch(argv, log) {
438
502
  debug?.stop(currentKernel ?? undefined);
439
503
  currentKernel?.cancel("interrupted");
440
504
  currentKernel?.forceIdle();
441
- signalChange?.();
505
+ notifyChange();
442
506
  };
443
507
  process.once("SIGINT", requestStop);
444
508
  process.once("SIGTERM", requestStop);
@@ -454,8 +518,17 @@ async function runWatch(argv, log) {
454
518
  // overrides every hold (including a server's own) when we want to reload.
455
519
  kernel.acquireHold("watch-mode");
456
520
  const changed = new Promise((resolve) => {
457
- signalChange = resolve;
521
+ // Clearing the slot on resolve is what routes a later change into
522
+ // `pendingChange` instead of onto this already-settled gate.
523
+ signalChange = () => {
524
+ signalChange = null;
525
+ resolve();
526
+ };
458
527
  });
528
+ if (pendingChange) {
529
+ pendingChange = false;
530
+ notifyChange();
531
+ }
459
532
  try {
460
533
  await kernel.load(argv.path, {
461
534
  cacheDir: cacheRoot,
@@ -468,7 +541,7 @@ async function runWatch(argv, log) {
468
541
  // start() resolves on its own only on boot error or one-shot completion
469
542
  // without a hold; the hold keeps long-running and completed apps alive,
470
543
  // so the cycle advances on a file change. Errors are reported, not thrown.
471
- const startPromise = kernel.start().catch((err) => reportError(argv, err, log));
544
+ const startPromise = kernel.start().catch((err) => reportError(argv, err, log, kernel));
472
545
  await changed;
473
546
  kernel.cancel("reload");
474
547
  kernel.forceIdle();
@@ -476,7 +549,7 @@ async function runWatch(argv, log) {
476
549
  }
477
550
  catch (error) {
478
551
  // Load failed before start(); report and wait for an edit before retrying.
479
- reportError(argv, error, log);
552
+ reportError(argv, error, log, kernel);
480
553
  await kernel.teardown();
481
554
  await changed;
482
555
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
package/dist/logger.d.ts CHANGED
@@ -9,7 +9,18 @@ export declare function createLogger(verbose: boolean): {
9
9
  verbose: boolean;
10
10
  };
11
11
  export type Logger = ReturnType<typeof createLogger>;
12
- export declare function formatDiagnostics(diagnostics: RuntimeDiagnostic[], log: Logger, displayPath: string): void;
12
+ /**
13
+ * Render runtime diagnostics. Entries the kernel classified as `derived` (they
14
+ * failed only because a dependency did) collapse into one line per blocked
15
+ * chain — a ten-resource chain is one real error and nine shadows of it, and
16
+ * printing them flat buries the only line a reader can act on. `--verbose`
17
+ * prints every entry in full.
18
+ *
19
+ * An entry the kernel raised from static analysis carries `origin`; given the
20
+ * loaded graph it renders with the same `file:line:col` prefix `telo check`
21
+ * prints, so a manifest error points at its line whichever command surfaced it.
22
+ */
23
+ export declare function formatDiagnostics(diagnostics: RuntimeDiagnostic[], log: Logger, displayPath: string, graph?: LoadedGraph): void;
13
24
  /** Format analysis diagnostics with file:line:col locations resolved via
14
25
  * the canonical `LoadedGraph` — no need to thread positionIndex through
15
26
  * manifest metadata. */
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGzE,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAetE,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO;oBAezB,GAAG,EAAE;eACV,MAAM;iBACJ,MAAM;kBACL,MAAM;gBACR,MAAM;;EAGrB;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,iBAAiB,EAAE,EAChC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB,IAAI,CA2BN;AAED;;yBAEyB;AACzB,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,kBAAkB,EAAE,EACjC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAkC3C"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGzE,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAyCzB,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO;oBAezB,GAAG,EAAE;eACV,MAAM;iBACJ,MAAM;kBACL,MAAM;gBACR,MAAM;;EAGrB;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,iBAAiB,EAAE,EAChC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,WAAW,GAClB,IAAI,CAmEN;AAED;;yBAEyB;AACzB,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,kBAAkB,EAAE,EACjC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAChB;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAqB3C"}
package/dist/logger.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { DiagnosticSeverity } from "@telorun/analyzer";
2
- import { findPositions } from "@telorun/ide-support";
3
- import { decideColor } from "@telorun/kernel";
2
+ import { findPositions, resolveRange } from "@telorun/ide-support";
3
+ import { decideColor, describeBlockedGroup, groupBlockedResources, } from "@telorun/kernel";
4
4
  import * as path from "path";
5
5
  import { fileURLToPath } from "url";
6
6
  /** Render a manifest source for display: a local `file://` URL (how the loader
@@ -14,6 +14,28 @@ function displaySourcePath(raw) {
14
14
  return raw;
15
15
  return path.relative(process.cwd(), raw);
16
16
  }
17
+ /** Resolve a diagnostic's manifest site to `file:line:col`. `d` is an analyzer
18
+ * diagnostic, or a `RuntimeDiagnostic.origin` rebuilt into one — the position
19
+ * itself comes from `resolveRange`, the rule the VS Code extension already
20
+ * uses, so `run`, `check` and the editor agree on where an error is instead of
21
+ * each carrying their own copy. That rule does more than a direct field-path
22
+ * lookup: it walks parent paths when the leaf is absent from the index (a
23
+ * `imports.Foo.source` failure lands on `imports.Foo`) and prefers the entry's
24
+ * key over its value.
25
+ *
26
+ * Undefined when nothing located it — a diagnostic whose resource is synthetic
27
+ * and whose file matches no graph source. A pointer to line 1 would be worse
28
+ * than none: it sends the reader somewhere the error is not. */
29
+ function resolveLocation(graph, d, fallbackSource) {
30
+ const located = findPositions(graph, d.data);
31
+ if (!located && !d.range)
32
+ return undefined;
33
+ const range = resolveRange(d, {
34
+ positionIndex: located?.positionIndex,
35
+ sourceLine: located?.sourceLine,
36
+ });
37
+ return `${displaySourcePath(located?.file ?? fallbackSource)}:${range.start.line + 1}:${range.start.character + 1}`;
38
+ }
17
39
  export function createLogger(verbose) {
18
40
  // The color decision follows `kernel/specs/logging.md` §11.2's precedence
19
41
  // order exactly, shared with the `pretty` log encoding rather than
@@ -37,33 +59,76 @@ export function createLogger(verbose) {
37
59
  verbose,
38
60
  };
39
61
  }
40
- export function formatDiagnostics(diagnostics, log, displayPath) {
41
- for (const d of diagnostics) {
42
- const severityLabel = d.severity === "warning" ? log.warn("warning") : log.error("error");
43
- const code = d.code ? ` ${log.dim(d.code)}` : "";
44
- if (d.resource) {
45
- // Runtime diagnostic the failure is pinned to a resource, so the entry
46
- // manifest path adds no information. Show kind + name + message and any
47
- // structured details indented below.
48
- const who = `${d.kind ? `${log.dim(d.kind)} ` : ""}${d.resource}`;
49
- console.error(` ${severityLabel} ${who}: ${d.message}${code}`);
50
- if (d.details) {
51
- for (const line of d.details.split("\n")) {
52
- console.error(` ${log.dim(line)}`);
62
+ /**
63
+ * Render runtime diagnostics. Entries the kernel classified as `derived` (they
64
+ * failed only because a dependency did) collapse into one line per blocked
65
+ * chain a ten-resource chain is one real error and nine shadows of it, and
66
+ * printing them flat buries the only line a reader can act on. `--verbose`
67
+ * prints every entry in full.
68
+ *
69
+ * An entry the kernel raised from static analysis carries `origin`; given the
70
+ * loaded graph it renders with the same `file:line:col` prefix `telo check`
71
+ * prints, so a manifest error points at its line whichever command surfaced it.
72
+ */
73
+ export function formatDiagnostics(diagnostics, log, displayPath, graph) {
74
+ // Column the `error`/`warning` label occupies, so a collapsed group line sits
75
+ // under the resource names it summarizes rather than under the label.
76
+ const NAME_COLUMN = " ".repeat(" error ".length);
77
+ const render = (entries, indent) => {
78
+ for (const d of entries) {
79
+ const skip = d.derived && !log.verbose;
80
+ if (!skip) {
81
+ const severityLabel = d.severity === "warning" ? log.warn("warning") : log.error("error");
82
+ const code = d.code ? ` ${log.dim(d.code)}` : "";
83
+ // A static failure that nothing could locate falls through to the
84
+ // resource / bare-path branches below, which at least name what failed.
85
+ const location = d.origin && graph
86
+ ? resolveLocation(graph, { message: d.message, range: d.origin.range, data: d.origin }, displayPath)
87
+ : undefined;
88
+ // Details sit under the message; how far under depends on which branch
89
+ // printed it, so the branch picks the indent and the printing is one place.
90
+ const printDetails = (detailIndent) => {
91
+ if (!d.details)
92
+ return;
93
+ for (const line of d.details.split("\n")) {
94
+ console.error(`${detailIndent}${log.dim(line)}`);
95
+ }
96
+ };
97
+ if (location) {
98
+ // Static-analysis failure — the position names the exact spot, so it
99
+ // renders exactly as `telo check` does. Repeating the resource here
100
+ // would duplicate it: an analyzer message already names its own.
101
+ console.error(`${indent}${location} ${severityLabel} ${d.message}${code}`);
102
+ printDetails(`${indent} `);
103
+ }
104
+ else if (d.resource) {
105
+ // Runtime diagnostic — the failure is pinned to a resource, so the
106
+ // entry manifest path adds no information. Show kind + name + message
107
+ // and any structured details indented below.
108
+ const who = `${d.kind ? `${log.dim(d.kind)} ` : ""}${d.resource}`;
109
+ console.error(`${indent} ${severityLabel} ${who}: ${d.message}${code}`);
110
+ printDetails(`${indent}${NAME_COLUMN} `);
111
+ }
112
+ else {
113
+ // Non-resource diagnostic (e.g. loader/parse failure) — keep the file
114
+ // path since it is the only location cue we have.
115
+ console.error(`${indent}${displayPath} ${severityLabel} ${d.message}${code}`);
116
+ printDetails(`${indent} `);
53
117
  }
54
118
  }
119
+ // A nested context's failures (an import initializing its library) render
120
+ // one level in — for a collapsed parent too, since a child context's root
121
+ // causes are not shadows of THIS context's failure.
122
+ if (d.children?.length)
123
+ render(d.children, `${indent} `);
55
124
  }
56
- else {
57
- // Non-resource diagnostic (e.g. loader/parse failure) — keep the file path
58
- // since it is the only location cue we have.
59
- console.error(`${displayPath} ${severityLabel} ${d.message}${code}`);
60
- if (d.details) {
61
- for (const line of d.details.split("\n")) {
62
- console.error(` ${log.dim(line)}`);
63
- }
125
+ if (!log.verbose) {
126
+ for (const [blockedBy, names] of groupBlockedResources(entries)) {
127
+ console.error(`${indent}${NAME_COLUMN}${log.dim(describeBlockedGroup(blockedBy, names))}`);
64
128
  }
65
129
  }
66
- }
130
+ };
131
+ render(diagnostics, "");
67
132
  }
68
133
  /** Format analysis diagnostics with file:line:col locations resolved via
69
134
  * the canonical `LoadedGraph` — no need to thread positionIndex through
@@ -72,19 +137,9 @@ export function formatAnalysisDiagnostics(diagnostics, graph, log, entryPath) {
72
137
  let errorCount = 0;
73
138
  let warnCount = 0;
74
139
  for (const d of diagnostics) {
75
- const located = findPositions(graph, d.data);
76
- const raw = located?.file ?? entryPath;
77
- const displaySource = displaySourcePath(raw);
78
- const fieldPath = d.data?.path;
79
- const fieldRange = fieldPath !== undefined && located?.positionIndex
80
- ? located.positionIndex.get(fieldPath)
81
- : undefined;
82
- // Prefer a field-path position, then the diagnostic's own range (parse
83
- // errors carry one), then the doc's source line.
84
- const start = fieldRange?.start ?? d.range?.start;
85
- const line = (start?.line ?? located?.sourceLine ?? 0) + 1;
86
- const col = (start?.character ?? 0) + 1;
87
- const loc = `${displaySource}:${line}:${col}`;
140
+ // `check` prints one line per diagnostic and has no resource-named form to
141
+ // fall back to, so an unlocatable one still leads with the entry manifest.
142
+ const loc = resolveLocation(graph, d, entryPath) ?? `${displaySourcePath(entryPath)}:1:1`;
88
143
  const severityLabel = (d.severity ?? DiagnosticSeverity.Warning) <= DiagnosticSeverity.Error
89
144
  ? log.error("error")
90
145
  : log.warn("warning");
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,qBAAqB,GAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC;;6EAE6E;AAC7E,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;iEAWiE;AACjE,SAAS,eAAe,CACtB,KAAkB,EAClB,CAAqB,EACrB,cAAsB;IAEtB,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,EAAE;QAC5B,aAAa,EAAE,OAAO,EAAE,aAAa;QACrC,UAAU,EAAE,OAAO,EAAE,UAAU;KAChC,CAAC,CAAC;IACH,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;AACtH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,0EAA0E;IAC1E,mEAAmE;IACnE,0EAA0E;IAC1E,0EAA0E;IAC1E,oDAAoD;IACpD,EAAE;IACF,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC3B,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;KACrC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/F,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC9C,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACtC,IAAI,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACxC,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;QACzC,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;QACtC,OAAO;KACR,CAAC;AACJ,CAAC;AAID;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAgC,EAChC,GAAW,EACX,WAAmB,EACnB,KAAmB;IAEnB,8EAA8E;IAC9E,sEAAsE;IACtE,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,CAAC,OAA4B,EAAE,MAAc,EAAQ,EAAE;QACpE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,aAAa,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1F,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAElD,kEAAkE;gBAClE,wEAAwE;gBACxE,MAAM,QAAQ,GACZ,CAAC,CAAC,MAAM,IAAI,KAAK;oBACf,CAAC,CAAC,eAAe,CACb,KAAK,EACL,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAC7D,WAAW,CACZ;oBACH,CAAC,CAAC,SAAS,CAAC;gBAEhB,uEAAuE;gBACvE,4EAA4E;gBAC5E,MAAM,YAAY,GAAG,CAAC,YAAoB,EAAQ,EAAE;oBAClD,IAAI,CAAC,CAAC,CAAC,OAAO;wBAAE,OAAO;oBACvB,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBACzC,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,QAAQ,EAAE,CAAC;oBACb,qEAAqE;oBACrE,oEAAoE;oBACpE,iEAAiE;oBACjE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,QAAQ,KAAK,aAAa,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;oBAC7E,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;gBAC9B,CAAC;qBAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;oBACtB,mEAAmE;oBACnE,sEAAsE;oBACtE,6CAA6C;oBAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAClE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,KAAK,aAAa,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;oBAC1E,YAAY,CAAC,GAAG,MAAM,GAAG,WAAW,IAAI,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,sEAAsE;oBACtE,kDAAkD;oBAClD,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,WAAW,KAAK,aAAa,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;oBAChF,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,0EAA0E;YAC1E,0EAA0E;YAC1E,oDAAoD;YACpD,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM;gBAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChE,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,GAAG,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC7F,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED;;yBAEyB;AACzB,MAAM,UAAU,yBAAyB,CACvC,WAAiC,EACjC,KAAkB,EAClB,GAAW,EACX,SAAiB;IAEjB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAM,CAAC;QAC1F,MAAM,aAAa,GACjB,CAAC,CAAC,CAAC,QAAQ,IAAI,kBAAkB,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,KAAK;YACpE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;YACpB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1D,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,aAAa,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QAE7D,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,kBAAkB,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,KAAK;YAAE,UAAU,EAAE,CAAC;;YACpF,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { type LoadedGraph, type ManifestSource } from "@telorun/analyzer";
2
+ import type { LocalManifestCacheSource } from "@telorun/kernel";
3
+ /**
4
+ * True when `ref` names an OCI artifact by a **tag** rather than by content —
5
+ * the only case a cached manifest can silently go stale.
6
+ *
7
+ * A `sha256:` *reference* addresses the OCI manifest directly and is immutable.
8
+ * A tag the publisher can repoint is not, unless something else verifies the
9
+ * bytes — which is what {@link isPinnedOciRef} covers separately, because the
10
+ * pin does not survive into a resolved graph.
11
+ */
12
+ export declare function isOciTagRef(ref: string): boolean;
13
+ /** True when `ref` carries Telo's inline `#sha256-…` pin, which the cache source
14
+ * and the OCI transport both verify the manifest bytes against on every read.
15
+ * A moved tag therefore cannot be served undetected, so no `HEAD` is needed.
16
+ *
17
+ * This must be asked of the ref **as authored**: `OciTransport` strips the
18
+ * fragment when it builds a module's canonical source, so a network-resolved
19
+ * graph no longer remembers that the import was pinned. */
20
+ export declare function isPinnedOciRef(ref: string): boolean;
21
+ /** Identity under which a mutable ref's origin digest is recorded:
22
+ * `host/repo@tag`, independent of scheme spelling. */
23
+ export declare function originKey(ref: string): string;
24
+ /**
25
+ * Whether a cached manifest for `ref` may be served to `check` at all.
26
+ *
27
+ * The cache maps three key shapes, and only two of them address content that
28
+ * cannot change under the key:
29
+ *
30
+ * - `oci` — the reference is either a `sha256:` digest or a tag. A tag is
31
+ * mutable, which is what {@link revalidateMutableOciRefs} exists to catch,
32
+ * so both are cacheable and freshness is settled separately.
33
+ * - `registry` — `<path>@<version>`, always version-segmented. A published
34
+ * version is immutable by convention, the same assumption npm makes, so
35
+ * these are served without revalidation. This is a deliberate policy call,
36
+ * not a gap: the registry origin has no cheap freshness probe (`digest()`
37
+ * downloads the manifest to hash it), so revalidating would cost exactly
38
+ * what re-fetching costs and buy nothing.
39
+ * - `url` — an arbitrary HTTP(S) import. Its key carries **no version
40
+ * segment**: one URL is one path forever, so a cached copy would be served
41
+ * for the lifetime of the directory no matter what the server now returns.
42
+ * `check` therefore never reads these from the cache and always re-fetches.
43
+ * That costs one request — exactly what revalidating would cost, since
44
+ * `RegistryTransport.digest` is a full GET — so the honest option is also
45
+ * the cheap one. `telo run` keeps caching them; changing that is a separate
46
+ * decision about `run`'s freshness model, not a property of this pass.
47
+ */
48
+ export declare function isCacheableForCheck(ref: string, registryUrl: string): boolean;
49
+ /**
50
+ * Wraps a manifest source and records which request URLs it actually served,
51
+ * and from which file on disk.
52
+ *
53
+ * The freshness pass needs both halves, and neither survives into the loaded
54
+ * graph: once the cache serves a manifest the graph's canonical source is a
55
+ * `file://` URL, so the `oci://` ref that asked for it is gone. Recording at
56
+ * the source is also what makes a *relative* import inside an OCI module work
57
+ * here — the loader resolves it to an absolute `oci://` ref before `read()`,
58
+ * so this map holds the absolute ref even though no manifest ever spelled it.
59
+ */
60
+ export declare class RecordingCacheSource implements ManifestSource {
61
+ private readonly inner;
62
+ private readonly registryUrl;
63
+ /** Request URL → absolute path of the cache file that answered it. */
64
+ readonly served: Map<string, string>;
65
+ constructor(inner: LocalManifestCacheSource, registryUrl: string);
66
+ supports(url: string): boolean;
67
+ read(url: string): Promise<{
68
+ text: string;
69
+ source: string;
70
+ }>;
71
+ resolveRelative(base: string, relative: string): string;
72
+ }
73
+ /**
74
+ * Read the recorded origin digests for one cache root.
75
+ *
76
+ * A missing, unreadable, or version-mismatched record yields an empty map,
77
+ * which makes every cached mutable ref count as *unverified* and therefore
78
+ * stale. That is the conservative direction — the failure mode is one extra
79
+ * fetch, never serving a manifest whose tag has moved. It is a cache miss in
80
+ * the same sense `LocalManifestCacheSource` treats a failed `stat`, not a
81
+ * suppressed error.
82
+ */
83
+ export declare function readOriginDigests(manifestsDir: string): Promise<Map<string, string>>;
84
+ /** Persist origin digests, merging over whatever the record already held so a
85
+ * check of one entry never drops another's. */
86
+ export declare function writeOriginDigests(manifestsDir: string, digests: Map<string, string>): Promise<void>;
87
+ export interface FreshnessResult {
88
+ /** Cache files whose tag has moved (or was never verified) since they were
89
+ * written. Deleting these and reloading is what makes the check honest. */
90
+ staleFiles: string[];
91
+ /** Current digest per origin key, to record once the load is trusted. */
92
+ digests: Map<string, string>;
93
+ }
94
+ /**
95
+ * Revalidate every **mutable** OCI ref this graph resolved, with one `HEAD` per
96
+ * repository reference.
97
+ *
98
+ * `check` is the correctness command, so it must not report a clean bill of
99
+ * health against a manifest whose tag has since moved. But re-pulling every
100
+ * import to find that out is what made it slow, and a pinned ref — which is
101
+ * what `telo install` writes and what every published manifest carries — needs
102
+ * no network at all: its bytes are verified against the inline hash. So the
103
+ * cost falls only on unpinned tags, and only one round trip each, against the
104
+ * four a full re-pull would take.
105
+ *
106
+ * A ref fetched over the network during this load is fresh by construction and
107
+ * is only recorded, never revalidated.
108
+ */
109
+ export declare function revalidateMutableOciRefs(graph: LoadedGraph, served: Map<string, string>,
110
+ /** Recorded origin digests per cache root (keyed by its `manifests` dir). A
111
+ * cached manifest is judged against the record of the root it was served
112
+ * from, which is not necessarily the root this entry writes to: one loader
113
+ * serves every input path, so a hit may land in a sibling's cache. */
114
+ originsByRoot: Map<string, Map<string, string>>, registryUrl: string,
115
+ /** Digests already probed earlier in this invocation, keyed as {@link originKey}.
116
+ * A tag verified once in a process is verified for the whole run, so checking
117
+ * twenty manifests that share an import issues one `HEAD`, not twenty.
118
+ * Mutated in place so later paths see what earlier ones learned. */
119
+ verified?: Map<string, string>): Promise<FreshnessResult>;
120
+ //# sourceMappingURL=manifest-freshness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-freshness.d.ts","sourceRoot":"","sources":["../src/manifest-freshness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAgBhE;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAShD;AAED;;;;;;4DAM4D;AAC5D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED;uDACuD;AACvD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IAKvD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL9B,sEAAsE;IACtE,QAAQ,CAAC,MAAM,sBAA6B;gBAGzB,KAAK,EAAE,wBAAwB,EAC/B,WAAW,EAAE,MAAM;IAGtC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAUlE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAGxD;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiB1F;AAED;gDACgD;AAChD,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,MAAM,WAAW,eAAe;IAC9B;gFAC4E;IAC5E,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,yEAAyE;IACzE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;AAC3B;;;uEAGuE;AACvE,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC/C,WAAW,EAAE,MAAM;AACnB;;;qEAGqE;AACrE,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAa,GACxC,OAAO,CAAC,eAAe,CAAC,CAyE1B"}
@@ -0,0 +1,261 @@
1
+ import { isOciRef, parseOciRef } from "@telorun/analyzer";
2
+ import { defaultTransportRegistry } from "@telorun/kernel/transports";
3
+ import * as fs from "fs/promises";
4
+ import * as path from "path";
5
+ import { fileURLToPath, pathToFileURL } from "url";
6
+ /** Sits beside `.validated.json` inside `<cacheRoot>/manifests/`. */
7
+ const ORIGINS_FILE = ".origins.json";
8
+ const ORIGINS_VERSION = 1;
9
+ /**
10
+ * True when `ref` names an OCI artifact by a **tag** rather than by content —
11
+ * the only case a cached manifest can silently go stale.
12
+ *
13
+ * A `sha256:` *reference* addresses the OCI manifest directly and is immutable.
14
+ * A tag the publisher can repoint is not, unless something else verifies the
15
+ * bytes — which is what {@link isPinnedOciRef} covers separately, because the
16
+ * pin does not survive into a resolved graph.
17
+ */
18
+ export function isOciTagRef(ref) {
19
+ if (!isOciRef(ref))
20
+ return false;
21
+ try {
22
+ return !parseOciRef(ref).reference.includes(":");
23
+ }
24
+ catch {
25
+ // An unparseable ref is not something this pass can revalidate; the loader
26
+ // will report it as a resolution failure in its own right.
27
+ return false;
28
+ }
29
+ }
30
+ /** True when `ref` carries Telo's inline `#sha256-…` pin, which the cache source
31
+ * and the OCI transport both verify the manifest bytes against on every read.
32
+ * A moved tag therefore cannot be served undetected, so no `HEAD` is needed.
33
+ *
34
+ * This must be asked of the ref **as authored**: `OciTransport` strips the
35
+ * fragment when it builds a module's canonical source, so a network-resolved
36
+ * graph no longer remembers that the import was pinned. */
37
+ export function isPinnedOciRef(ref) {
38
+ if (!isOciRef(ref))
39
+ return false;
40
+ try {
41
+ return Boolean(parseOciRef(ref).integrity);
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ /** Identity under which a mutable ref's origin digest is recorded:
48
+ * `host/repo@tag`, independent of scheme spelling. */
49
+ export function originKey(ref) {
50
+ const { host, repo, reference } = parseOciRef(ref);
51
+ return `${host}/${repo}@${reference}`;
52
+ }
53
+ /**
54
+ * Whether a cached manifest for `ref` may be served to `check` at all.
55
+ *
56
+ * The cache maps three key shapes, and only two of them address content that
57
+ * cannot change under the key:
58
+ *
59
+ * - `oci` — the reference is either a `sha256:` digest or a tag. A tag is
60
+ * mutable, which is what {@link revalidateMutableOciRefs} exists to catch,
61
+ * so both are cacheable and freshness is settled separately.
62
+ * - `registry` — `<path>@<version>`, always version-segmented. A published
63
+ * version is immutable by convention, the same assumption npm makes, so
64
+ * these are served without revalidation. This is a deliberate policy call,
65
+ * not a gap: the registry origin has no cheap freshness probe (`digest()`
66
+ * downloads the manifest to hash it), so revalidating would cost exactly
67
+ * what re-fetching costs and buy nothing.
68
+ * - `url` — an arbitrary HTTP(S) import. Its key carries **no version
69
+ * segment**: one URL is one path forever, so a cached copy would be served
70
+ * for the lifetime of the directory no matter what the server now returns.
71
+ * `check` therefore never reads these from the cache and always re-fetches.
72
+ * That costs one request — exactly what revalidating would cost, since
73
+ * `RegistryTransport.digest` is a full GET — so the honest option is also
74
+ * the cheap one. `telo run` keeps caching them; changing that is a separate
75
+ * decision about `run`'s freshness model, not a property of this pass.
76
+ */
77
+ export function isCacheableForCheck(ref, registryUrl) {
78
+ return defaultTransportRegistry(registryUrl).cacheCoords(ref)?.transport !== "url";
79
+ }
80
+ /**
81
+ * Wraps a manifest source and records which request URLs it actually served,
82
+ * and from which file on disk.
83
+ *
84
+ * The freshness pass needs both halves, and neither survives into the loaded
85
+ * graph: once the cache serves a manifest the graph's canonical source is a
86
+ * `file://` URL, so the `oci://` ref that asked for it is gone. Recording at
87
+ * the source is also what makes a *relative* import inside an OCI module work
88
+ * here — the loader resolves it to an absolute `oci://` ref before `read()`,
89
+ * so this map holds the absolute ref even though no manifest ever spelled it.
90
+ */
91
+ export class RecordingCacheSource {
92
+ inner;
93
+ registryUrl;
94
+ /** Request URL → absolute path of the cache file that answered it. */
95
+ served = new Map();
96
+ constructor(inner, registryUrl) {
97
+ this.inner = inner;
98
+ this.registryUrl = registryUrl;
99
+ }
100
+ supports(url) {
101
+ return isCacheableForCheck(url, this.registryUrl) && this.inner.supports(url);
102
+ }
103
+ async read(url) {
104
+ const result = await this.inner.read(url);
105
+ // The cache always answers with a `file://` URL; anything else means the
106
+ // wrapped source is not disk-backed, and there is no cache file to record.
107
+ if (result.source.startsWith("file://")) {
108
+ this.served.set(url, fileURLToPath(result.source));
109
+ }
110
+ return result;
111
+ }
112
+ resolveRelative(base, relative) {
113
+ return this.inner.resolveRelative(base, relative);
114
+ }
115
+ }
116
+ /**
117
+ * Read the recorded origin digests for one cache root.
118
+ *
119
+ * A missing, unreadable, or version-mismatched record yields an empty map,
120
+ * which makes every cached mutable ref count as *unverified* and therefore
121
+ * stale. That is the conservative direction — the failure mode is one extra
122
+ * fetch, never serving a manifest whose tag has moved. It is a cache miss in
123
+ * the same sense `LocalManifestCacheSource` treats a failed `stat`, not a
124
+ * suppressed error.
125
+ */
126
+ export async function readOriginDigests(manifestsDir) {
127
+ let raw;
128
+ try {
129
+ raw = await fs.readFile(path.join(manifestsDir, ORIGINS_FILE), "utf-8");
130
+ }
131
+ catch {
132
+ return new Map();
133
+ }
134
+ let parsed;
135
+ try {
136
+ parsed = JSON.parse(raw);
137
+ }
138
+ catch {
139
+ return new Map();
140
+ }
141
+ if (parsed?.version !== ORIGINS_VERSION || typeof parsed.digests !== "object") {
142
+ return new Map();
143
+ }
144
+ return new Map(Object.entries(parsed.digests));
145
+ }
146
+ /** Persist origin digests, merging over whatever the record already held so a
147
+ * check of one entry never drops another's. */
148
+ export async function writeOriginDigests(manifestsDir, digests) {
149
+ if (digests.size === 0)
150
+ return;
151
+ const merged = new Map([...(await readOriginDigests(manifestsDir)), ...digests]);
152
+ const record = {
153
+ version: ORIGINS_VERSION,
154
+ digests: Object.fromEntries([...merged].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))),
155
+ };
156
+ await fs.mkdir(manifestsDir, { recursive: true });
157
+ await fs.writeFile(path.join(manifestsDir, ORIGINS_FILE), `${JSON.stringify(record, null, 2)}\n`, "utf-8");
158
+ }
159
+ /**
160
+ * Revalidate every **mutable** OCI ref this graph resolved, with one `HEAD` per
161
+ * repository reference.
162
+ *
163
+ * `check` is the correctness command, so it must not report a clean bill of
164
+ * health against a manifest whose tag has since moved. But re-pulling every
165
+ * import to find that out is what made it slow, and a pinned ref — which is
166
+ * what `telo install` writes and what every published manifest carries — needs
167
+ * no network at all: its bytes are verified against the inline hash. So the
168
+ * cost falls only on unpinned tags, and only one round trip each, against the
169
+ * four a full re-pull would take.
170
+ *
171
+ * A ref fetched over the network during this load is fresh by construction and
172
+ * is only recorded, never revalidated.
173
+ */
174
+ export async function revalidateMutableOciRefs(graph, served,
175
+ /** Recorded origin digests per cache root (keyed by its `manifests` dir). A
176
+ * cached manifest is judged against the record of the root it was served
177
+ * from, which is not necessarily the root this entry writes to: one loader
178
+ * serves every input path, so a hit may land in a sibling's cache. */
179
+ originsByRoot, registryUrl,
180
+ /** Digests already probed earlier in this invocation, keyed as {@link originKey}.
181
+ * A tag verified once in a process is verified for the whole run, so checking
182
+ * twenty manifests that share an import issues one `HEAD`, not twenty.
183
+ * Mutated in place so later paths see what earlier ones learned. */
184
+ verified = new Map()) {
185
+ const recordFor = (cacheFile) => {
186
+ let best;
187
+ for (const root of originsByRoot.keys()) {
188
+ if (!cacheFile.startsWith(root + path.sep))
189
+ continue;
190
+ if (!best || root.length > best.length)
191
+ best = root;
192
+ }
193
+ return (best && originsByRoot.get(best)) || new Map();
194
+ };
195
+ // A module's canonical source loses the `#sha256-` pin, so pinning has to be
196
+ // read off the refs as authored. Collect every authored ref that reached each
197
+ // canonical source; one pinned edge is enough, since edges sharing a canonical
198
+ // source resolved the same tag and its bytes were verified against that pin.
199
+ const pinnedSources = new Set();
200
+ for (const [, edges] of graph.importEdges) {
201
+ for (const [, edge] of edges) {
202
+ if (isPinnedOciRef(edge.targetRef))
203
+ pinnedSources.add(edge.targetSource);
204
+ }
205
+ }
206
+ // Cache hits record the request URL, which keeps its pin — and is the only
207
+ // place a relative import's absolute `oci://` ref survives.
208
+ const cacheFileToRequest = new Map();
209
+ for (const [url, cacheFile] of served) {
210
+ cacheFileToRequest.set(pathToFileURL(cacheFile).href, url);
211
+ }
212
+ const targets = new Map();
213
+ // Restricted to modules this graph actually reached — a shared loader carries
214
+ // entries from previously-checked paths too.
215
+ for (const source of graph.modules.keys()) {
216
+ const request = cacheFileToRequest.get(source);
217
+ const ref = request ?? source;
218
+ if (!isOciTagRef(ref))
219
+ continue;
220
+ if (isPinnedOciRef(ref) || pinnedSources.has(source))
221
+ continue;
222
+ const key = originKey(ref);
223
+ // The same tag reached twice can only differ in whether a copy sat on disk;
224
+ // the cache-served one is what a staleness verdict has to act on.
225
+ if (targets.get(key)?.cacheFile)
226
+ continue;
227
+ targets.set(key, {
228
+ ref,
229
+ ...(request ? { cacheFile: fileURLToPath(source) } : {}),
230
+ });
231
+ }
232
+ if (targets.size === 0)
233
+ return { staleFiles: [], digests: new Map() };
234
+ const transports = defaultTransportRegistry(registryUrl);
235
+ const resolved = await Promise.all([...targets.entries()].map(async ([key, target]) => {
236
+ const already = verified.get(key);
237
+ if (already !== undefined)
238
+ return [key, already];
239
+ const digest = await transports.digest(target.ref);
240
+ if (digest)
241
+ verified.set(key, digest);
242
+ return [key, digest];
243
+ }));
244
+ const staleFiles = [];
245
+ const digests = new Map();
246
+ for (const [key, digest] of resolved) {
247
+ if (digest)
248
+ digests.set(key, digest);
249
+ const target = targets.get(key);
250
+ if (!target?.cacheFile)
251
+ continue;
252
+ // A tag that no longer resolves (`null`) is stale too — dropping the cached
253
+ // copy lets the reload surface the real resolution failure instead of
254
+ // quietly analyzing a version the registry no longer publishes.
255
+ if (digest && recordFor(target.cacheFile).get(key) === digest)
256
+ continue;
257
+ staleFiles.push(target.cacheFile);
258
+ }
259
+ return { staleFiles, digests };
260
+ }
261
+ //# sourceMappingURL=manifest-freshness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-freshness.js","sourceRoot":"","sources":["../src/manifest-freshness.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telorun/cli",
3
- "version": "0.60.0",
3
+ "version": "0.62.0",
4
4
  "description": "Telo CLI - Command-line interface for the Telo runtime.",
5
5
  "keywords": [
6
6
  "telo",
@@ -34,12 +34,12 @@
34
34
  "dist"
35
35
  ],
36
36
  "dependencies": {
37
- "@telorun/analyzer": "0.48.0",
37
+ "@telorun/analyzer": "0.49.1",
38
38
  "@telorun/glob": "0.2.0",
39
- "@telorun/ide-support": "0.7.8",
40
- "@telorun/kernel": "0.60.0",
41
- "@telorun/sdk": "0.60.0",
42
- "@telorun/templating": "0.11.0",
39
+ "@telorun/ide-support": "0.7.10",
40
+ "@telorun/kernel": "0.62.0",
41
+ "@telorun/sdk": "0.62.0",
42
+ "@telorun/templating": "0.11.1",
43
43
  "dotenv": "^17.4.0",
44
44
  "packageurl-js": "^2.0.1",
45
45
  "semver": "^7.7.3",