@telorun/analyzer 0.12.1 → 0.14.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 (69) hide show
  1. package/dist/adapters/http-adapter.d.ts +10 -0
  2. package/dist/adapters/http-adapter.d.ts.map +1 -0
  3. package/dist/adapters/http-adapter.js +18 -0
  4. package/dist/adapters/node-adapter.d.ts +17 -0
  5. package/dist/adapters/node-adapter.d.ts.map +1 -0
  6. package/dist/adapters/node-adapter.js +71 -0
  7. package/dist/adapters/registry-adapter.d.ts +15 -0
  8. package/dist/adapters/registry-adapter.d.ts.map +1 -0
  9. package/dist/adapters/registry-adapter.js +53 -0
  10. package/dist/alias-resolver.d.ts +6 -0
  11. package/dist/alias-resolver.d.ts.map +1 -1
  12. package/dist/alias-resolver.js +8 -0
  13. package/dist/analysis-registry.d.ts +13 -0
  14. package/dist/analysis-registry.d.ts.map +1 -1
  15. package/dist/analysis-registry.js +15 -0
  16. package/dist/analyzer.d.ts +1 -1
  17. package/dist/analyzer.d.ts.map +1 -1
  18. package/dist/analyzer.js +176 -88
  19. package/dist/builtins.d.ts.map +1 -1
  20. package/dist/builtins.js +86 -0
  21. package/dist/cel-environment.d.ts +1 -1
  22. package/dist/cel-environment.d.ts.map +1 -1
  23. package/dist/cel-environment.js +40 -2
  24. package/dist/dependency-graph.d.ts.map +1 -1
  25. package/dist/dependency-graph.js +41 -62
  26. package/dist/flatten-for-analyzer.d.ts.map +1 -1
  27. package/dist/flatten-for-analyzer.js +13 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +1 -0
  31. package/dist/kernel-globals.d.ts +1 -1
  32. package/dist/kernel-globals.d.ts.map +1 -1
  33. package/dist/kernel-globals.js +19 -1
  34. package/dist/manifest-visitor.d.ts +124 -0
  35. package/dist/manifest-visitor.d.ts.map +1 -0
  36. package/dist/manifest-visitor.js +181 -0
  37. package/dist/reference-field-map.js +16 -0
  38. package/dist/resolve-ref-sentinels.d.ts +15 -17
  39. package/dist/resolve-ref-sentinels.d.ts.map +1 -1
  40. package/dist/resolve-ref-sentinels.js +94 -40
  41. package/dist/resolve-throws-union.d.ts +10 -0
  42. package/dist/resolve-throws-union.d.ts.map +1 -1
  43. package/dist/resolve-throws-union.js +35 -7
  44. package/dist/schema-compat.d.ts +10 -0
  45. package/dist/schema-compat.d.ts.map +1 -1
  46. package/dist/schema-compat.js +32 -0
  47. package/dist/validate-cel-context.d.ts +14 -0
  48. package/dist/validate-cel-context.d.ts.map +1 -1
  49. package/dist/validate-cel-context.js +38 -0
  50. package/dist/validate-references.d.ts.map +1 -1
  51. package/dist/validate-references.js +215 -160
  52. package/dist/validate-unused-declarations.d.ts +25 -0
  53. package/dist/validate-unused-declarations.d.ts.map +1 -0
  54. package/dist/validate-unused-declarations.js +91 -0
  55. package/package.json +3 -3
  56. package/src/analysis-registry.ts +20 -0
  57. package/src/analyzer.ts +256 -168
  58. package/src/builtins.ts +85 -0
  59. package/src/cel-environment.ts +42 -1
  60. package/src/dependency-graph.ts +37 -52
  61. package/src/index.ts +11 -0
  62. package/src/kernel-globals.ts +22 -1
  63. package/src/manifest-visitor.ts +340 -0
  64. package/src/reference-field-map.ts +14 -0
  65. package/src/resolve-throws-union.ts +36 -8
  66. package/src/schema-compat.ts +32 -0
  67. package/src/validate-cel-context.ts +50 -0
  68. package/src/validate-references.ts +175 -211
  69. package/src/validate-unused-declarations.ts +95 -0
@@ -0,0 +1,10 @@
1
+ import { type ManifestAdapter } from "../types.js";
2
+ export declare class HttpAdapter implements ManifestAdapter {
3
+ supports(url: string): boolean;
4
+ read(url: string): Promise<{
5
+ text: string;
6
+ source: string;
7
+ }>;
8
+ resolveRelative(base: string, relative: string): string;
9
+ }
10
+ //# sourceMappingURL=http-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/http-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9E,qBAAa,WAAY,YAAW,eAAe;IACjD,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;IAWlE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;CAIxD"}
@@ -0,0 +1,18 @@
1
+ import { DEFAULT_MANIFEST_FILENAME } from "../types.js";
2
+ export class HttpAdapter {
3
+ supports(url) {
4
+ return url.startsWith("http://") || url.startsWith("https://");
5
+ }
6
+ async read(url) {
7
+ const fetchUrl = url.includes(".yaml") ? url : `${url}/${DEFAULT_MANIFEST_FILENAME}`;
8
+ const response = await fetch(fetchUrl);
9
+ if (!response.ok) {
10
+ throw new Error(`Failed to fetch manifest from ${fetchUrl}: ${response.status} ${response.statusText}`);
11
+ }
12
+ return { text: await response.text(), source: fetchUrl };
13
+ }
14
+ resolveRelative(base, relative) {
15
+ const baseDir = base.endsWith("/") ? base : base.slice(0, base.lastIndexOf("/") + 1);
16
+ return new URL(relative, baseDir).href;
17
+ }
18
+ }
@@ -0,0 +1,17 @@
1
+ import { type ManifestAdapter } from "../types.js";
2
+ /** Node.js fs-based ManifestAdapter for local files. Not browser-compatible. */
3
+ export declare class NodeAdapter implements ManifestAdapter {
4
+ private readonly cwd;
5
+ constructor(cwd?: string);
6
+ supports(url: string): boolean;
7
+ read(url: string): Promise<{
8
+ text: string;
9
+ source: string;
10
+ }>;
11
+ resolveRelative(base: string, relative: string): string;
12
+ expandGlob(base: string, patterns: string[]): Promise<string[]>;
13
+ resolveOwnerOf(fileUrl: string): Promise<string | null>;
14
+ }
15
+ /** @deprecated Use `new NodeAdapter(cwd)` instead */
16
+ export declare function createNodeAdapter(cwd?: string): ManifestAdapter;
17
+ //# sourceMappingURL=node-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/node-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAM9E,gFAAgF;AAChF,qBAAa,WAAY,YAAW,eAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,GAAE,MAAsB;IAExD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAUxB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IASlE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAKjD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAc/D,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAoB9D;AAED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAsB,GAAG,eAAe,CAE9E"}
@@ -0,0 +1,71 @@
1
+ import * as fs from "fs/promises";
2
+ import * as path from "path";
3
+ import { fileURLToPath } from "url";
4
+ import { minimatch } from "minimatch";
5
+ import { DEFAULT_MANIFEST_FILENAME } from "../types.js";
6
+ function toFilePath(url) {
7
+ return url.startsWith("file://") ? fileURLToPath(url) : url;
8
+ }
9
+ /** Node.js fs-based ManifestAdapter for local files. Not browser-compatible. */
10
+ export class NodeAdapter {
11
+ cwd;
12
+ constructor(cwd = process.cwd()) {
13
+ this.cwd = cwd;
14
+ }
15
+ supports(url) {
16
+ return (url.startsWith("file://") ||
17
+ url.startsWith("/") ||
18
+ url.startsWith("./") ||
19
+ url.startsWith("../") ||
20
+ (!url.includes("://") && !url.includes("@")));
21
+ }
22
+ async read(url) {
23
+ const filePath = toFilePath(url);
24
+ const stat = await fs.stat(filePath).catch(() => null);
25
+ const resolvedPath = stat?.isDirectory() ? path.join(filePath, DEFAULT_MANIFEST_FILENAME) : filePath;
26
+ const text = await fs.readFile(resolvedPath, "utf8");
27
+ return { text, source: resolvedPath };
28
+ }
29
+ resolveRelative(base, relative) {
30
+ const baseDir = path.dirname(path.resolve(this.cwd, toFilePath(base)));
31
+ return path.resolve(baseDir, relative);
32
+ }
33
+ async expandGlob(base, patterns) {
34
+ const baseDir = path.dirname(path.resolve(this.cwd, toFilePath(base)));
35
+ const entries = await fs.readdir(baseDir, { recursive: true, encoding: "utf8" });
36
+ const normalizedPatterns = patterns.map((p) => p.replace(/\\/g, "/").replace(/^\.\//, ""));
37
+ const matched = [];
38
+ for (const entry of entries) {
39
+ const normalized = entry.replace(/\\/g, "/");
40
+ if (normalizedPatterns.some((p) => minimatch(normalized, p))) {
41
+ matched.push(path.resolve(baseDir, entry));
42
+ }
43
+ }
44
+ return matched.sort();
45
+ }
46
+ async resolveOwnerOf(fileUrl) {
47
+ const resolved = path.resolve(this.cwd, toFilePath(fileUrl));
48
+ let dir = path.dirname(resolved);
49
+ while (true) {
50
+ const candidate = path.join(dir, DEFAULT_MANIFEST_FILENAME);
51
+ if (candidate !== resolved) {
52
+ try {
53
+ await fs.access(candidate);
54
+ return candidate;
55
+ }
56
+ catch {
57
+ // telo.yaml not found at this level
58
+ }
59
+ }
60
+ const parent = path.dirname(dir);
61
+ if (parent === dir)
62
+ break;
63
+ dir = parent;
64
+ }
65
+ return null;
66
+ }
67
+ }
68
+ /** @deprecated Use `new NodeAdapter(cwd)` instead */
69
+ export function createNodeAdapter(cwd = process.cwd()) {
70
+ return new NodeAdapter(cwd);
71
+ }
@@ -0,0 +1,15 @@
1
+ import { type ManifestAdapter } from "../types.js";
2
+ export declare class RegistryAdapter implements ManifestAdapter {
3
+ private registryUrl;
4
+ constructor(registryUrl?: string);
5
+ supports(url: string): boolean;
6
+ read(moduleRef: string): Promise<{
7
+ text: string;
8
+ source: string;
9
+ }>;
10
+ resolveRelative(base: string, relative: string): string;
11
+ private toRegistryModuleBase;
12
+ private toRegistryUrl;
13
+ private parseModuleRef;
14
+ }
15
+ //# sourceMappingURL=registry-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/registry-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9E,qBAAa,eAAgB,YAAW,eAAe;IACzC,OAAO,CAAC,WAAW;gBAAX,WAAW,SAAuB;IAEtD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAWxB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAWxE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAMvD,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,cAAc;CAmBvB"}
@@ -0,0 +1,53 @@
1
+ import { DEFAULT_MANIFEST_FILENAME } from "../types.js";
2
+ const DEFAULT_REGISTRY_URL = "https://registry.telo.run";
3
+ export class RegistryAdapter {
4
+ registryUrl;
5
+ constructor(registryUrl = DEFAULT_REGISTRY_URL) {
6
+ this.registryUrl = registryUrl;
7
+ }
8
+ supports(url) {
9
+ return (!url.startsWith("http://") &&
10
+ !url.startsWith("https://") &&
11
+ !url.startsWith("/") &&
12
+ !url.startsWith(".") &&
13
+ url.includes("@") &&
14
+ url.includes("/"));
15
+ }
16
+ async read(moduleRef) {
17
+ const fetchUrl = this.toRegistryUrl(moduleRef);
18
+ const response = await fetch(fetchUrl);
19
+ if (!response.ok) {
20
+ throw new Error(`Failed to fetch manifest ${moduleRef}: ${response.status} ${response.statusText}`);
21
+ }
22
+ return { text: await response.text(), source: fetchUrl };
23
+ }
24
+ resolveRelative(base, relative) {
25
+ const baseUrl = this.supports(base) ? this.toRegistryModuleBase(base) : base;
26
+ const baseWithSlash = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
27
+ return new URL(relative, baseWithSlash).href;
28
+ }
29
+ toRegistryModuleBase(moduleRef) {
30
+ const parsed = this.parseModuleRef(moduleRef);
31
+ const normalizedBase = this.registryUrl.replace(/\/+$/, "");
32
+ return `${normalizedBase}/${parsed.modulePath}/${parsed.version}`;
33
+ }
34
+ toRegistryUrl(moduleRef) {
35
+ return `${this.toRegistryModuleBase(moduleRef)}/${DEFAULT_MANIFEST_FILENAME}`;
36
+ }
37
+ parseModuleRef(moduleRef) {
38
+ const atIdx = moduleRef.lastIndexOf("@");
39
+ if (atIdx <= 0 || atIdx === moduleRef.length - 1) {
40
+ throw new Error(`Invalid module reference '${moduleRef}', expected namespace/name@version`);
41
+ }
42
+ const modulePath = moduleRef.slice(0, atIdx);
43
+ if (!modulePath.includes("/")) {
44
+ throw new Error(`Invalid module reference '${moduleRef}', expected namespace/name@version`);
45
+ }
46
+ const rawVersion = moduleRef.slice(atIdx + 1);
47
+ const version = rawVersion.startsWith("v") ? rawVersion.substring(1) : rawVersion;
48
+ if (!version) {
49
+ throw new Error(`Invalid module reference '${moduleRef}', expected namespace/name@version`);
50
+ }
51
+ return { modulePath, version };
52
+ }
53
+ }
@@ -4,6 +4,12 @@ export declare class AliasResolver {
4
4
  private readonly importAliases;
5
5
  private readonly importedKinds;
6
6
  registerImport(alias: string, targetModule: string, exportedKinds: string[]): void;
7
+ /** Real module name an alias points at (e.g. "Console" → "console"), or undefined.
8
+ * Used to resolve an alias-qualified instance reference "Console.writeLine" to the
9
+ * forwarded resource declared in that module. The `exports.resources` gate is enforced
10
+ * upstream by `flattenForAnalyzer` (only exported instances are forwarded), so a name
11
+ * that isn't exported simply won't be found. */
12
+ moduleForAlias(alias: string): string | undefined;
7
13
  /** Resolves "Http.Api" → "http-server.Api". Returns undefined if alias is unknown. */
8
14
  resolveKind(kind: string): string | undefined;
9
15
  hasAlias(alias: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"alias-resolver.d.ts","sourceRoot":"","sources":["../src/alias-resolver.ts"],"names":[],"mappings":"AAAA;gFACgF;AAChF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IAOlF,sFAAsF;IACtF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe7C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhC,YAAY,IAAI,MAAM,EAAE;IAIxB;;qEAEiE;IACjE,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;CAO3C"}
1
+ {"version":3,"file":"alias-resolver.d.ts","sourceRoot":"","sources":["../src/alias-resolver.ts"],"names":[],"mappings":"AAAA;gFACgF;AAChF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAEhE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IAOlF;;;;qDAIiD;IACjD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjD,sFAAsF;IACtF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAe7C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhC,YAAY,IAAI,MAAM,EAAE;IAIxB;;qEAEiE;IACjE,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;CAO3C"}
@@ -9,6 +9,14 @@ export class AliasResolver {
9
9
  this.importedKinds.set(alias, new Set(exportedKinds));
10
10
  }
11
11
  }
12
+ /** Real module name an alias points at (e.g. "Console" → "console"), or undefined.
13
+ * Used to resolve an alias-qualified instance reference "Console.writeLine" to the
14
+ * forwarded resource declared in that module. The `exports.resources` gate is enforced
15
+ * upstream by `flattenForAnalyzer` (only exported instances are forwarded), so a name
16
+ * that isn't exported simply won't be found. */
17
+ moduleForAlias(alias) {
18
+ return this.importAliases.get(alias);
19
+ }
12
20
  /** Resolves "Http.Api" → "http-server.Api". Returns undefined if alias is unknown. */
13
21
  resolveKind(kind) {
14
22
  if (!kind) {
@@ -1,4 +1,5 @@
1
1
  import type { ResourceDefinition, ResourceManifest } from "@telorun/sdk";
2
+ import { type ManifestVisitor } from "./manifest-visitor.js";
2
3
  import type { AnalysisContext } from "./types.js";
3
4
  /**
4
5
  * Accumulates type and alias knowledge for a running kernel or analysis session.
@@ -22,6 +23,18 @@ export declare class AnalysisRegistry {
22
23
  * sub-schema (e.g. Server.notFoundHandler.returns[].content[mime].encoder).
23
24
  */
24
25
  iterateFieldEntries(resource: ResourceManifest, onRef: (fieldPath: string) => void, onScope: (fieldPath: string) => void): void;
26
+ /**
27
+ * Walks a manifest's annotation sites (refs, scopes, schema-from, CEL) via
28
+ * the shared manifest visitor, bound to this registry's definitions and
29
+ * aliases. The public seam for hosts (editor overview graph, tooling) that
30
+ * need the same site discovery the analyzer's own passes use, without
31
+ * reaching into the internal DefinitionRegistry.
32
+ */
33
+ visitManifest(resources: ResourceManifest[], visitor: ManifestVisitor, opts?: {
34
+ skipKinds?: ReadonlySet<string>;
35
+ expand?: boolean;
36
+ discoverNestedRefs?: boolean;
37
+ }): void;
25
38
  /**
26
39
  * Returns the built-in kernel definitions. The underlying DefinitionRegistry already
27
40
  * seeds these on construction; this method exposes them so callers (e.g. the kernel's
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-registry.d.ts","sourceRoot":"","sources":["../src/analysis-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAMzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IAEpE,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI;IAIjD,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIpE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAIpE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7C;;;;;;;OAOG;IACH,mBAAmB,CACjB,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EAClC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACnC,IAAI;IAkBP;;;;OAIG;IACH,kBAAkB,IAAI,kBAAkB,EAAE;IAI1C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAM/D,QAAQ,IAAI,MAAM,EAAE;IAIpB;mEAC+D;IAC/D,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC;;;gCAG4B;IAC5B,oBAAoB,IAAI,MAAM,EAAE;IAIhC;wEACoE;IACpE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD;;;;;gEAK4D;IAC5D,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IA+B7D,qFAAqF;IACrF,QAAQ,IAAI,eAAe;CAG5B"}
1
+ {"version":3,"file":"analysis-registry.d.ts","sourceRoot":"","sources":["../src/analysis-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAKzE,OAAO,EAAqC,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEhG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;GAIG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA4B;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAoC;IAEpE,kBAAkB,CAAC,GAAG,EAAE,kBAAkB,GAAG,IAAI;IAIjD,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIpE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAIpE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7C;;;;;;;OAOG;IACH,mBAAmB,CACjB,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,EAClC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GACnC,IAAI;IAkBP;;;;;;OAMG;IACH,aAAa,CACX,SAAS,EAAE,gBAAgB,EAAE,EAC7B,OAAO,EAAE,eAAe,EACxB,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;KAAE,GACzF,IAAI;IAQP;;;;OAIG;IACH,kBAAkB,IAAI,kBAAkB,EAAE;IAI1C,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAM/D,QAAQ,IAAI,MAAM,EAAE;IAIpB;mEAC+D;IAC/D,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC;;;gCAG4B;IAC5B,oBAAoB,IAAI,MAAM,EAAE;IAIhC;wEACoE;IACpE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD;;;;;gEAK4D;IAC5D,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IA+B7D,qFAAqF;IACrF,QAAQ,IAAI,eAAe;CAG5B"}
@@ -2,6 +2,7 @@ import { AliasResolver } from "./alias-resolver.js";
2
2
  import { KERNEL_BUILTINS } from "./builtins.js";
3
3
  import { DefinitionRegistry } from "./definition-registry.js";
4
4
  import { computeSuggestKind, computeValidUserFacingKinds } from "./kind-suggest.js";
5
+ import { visitManifest as runVisitManifest } from "./manifest-visitor.js";
5
6
  import { isRefEntry, isScopeEntry } from "./reference-field-map.js";
6
7
  /**
7
8
  * Accumulates type and alias knowledge for a running kernel or analysis session.
@@ -46,6 +47,20 @@ export class AnalysisRegistry {
46
47
  }
47
48
  }
48
49
  }
50
+ /**
51
+ * Walks a manifest's annotation sites (refs, scopes, schema-from, CEL) via
52
+ * the shared manifest visitor, bound to this registry's definitions and
53
+ * aliases. The public seam for hosts (editor overview graph, tooling) that
54
+ * need the same site discovery the analyzer's own passes use, without
55
+ * reaching into the internal DefinitionRegistry.
56
+ */
57
+ visitManifest(resources, visitor, opts) {
58
+ runVisitManifest(resources, this.defs, visitor, {
59
+ aliases: this.aliases,
60
+ aliasesByModule: this.aliasesByModule,
61
+ ...opts,
62
+ });
63
+ }
49
64
  /**
50
65
  * Returns the built-in kernel definitions. The underlying DefinitionRegistry already
51
66
  * seeds these on construction; this method exposes them so callers (e.g. the kernel's
@@ -25,7 +25,7 @@ export declare class StaticAnalyzer {
25
25
  */
26
26
  analyze(manifests: ResourceManifest[], options?: AnalysisOptions, registry?: AnalysisRegistry): AnalysisDiagnostic[];
27
27
  analyzeErrors(manifests: ResourceManifest[], options?: AnalysisOptions, registry?: AnalysisRegistry): AnalysisDiagnostic[];
28
- normalize(manifests: ResourceManifest[], registry: AnalysisRegistry): ResourceManifest[];
28
+ normalize(manifests: ResourceManifest[], registry: AnalysisRegistry, crossModuleTargets?: ResourceManifest[]): ResourceManifest[];
29
29
  prepare(manifests: ResourceManifest[], registry: AnalysisRegistry): {
30
30
  diagnostics: AnalysisDiagnostic[];
31
31
  order: string[] | null;
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAgB9B,OAAO,EAAsB,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAif/F,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,OAAO,GAAE,qBAA0B;IAI/C;;;;;;;;;;;;;;OAcG;IACH,OAAO,CACL,SAAS,EAAE,gBAAgB,EAAE,EAC7B,OAAO,CAAC,EAAE,eAAe,EACzB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,kBAAkB,EAAE;IAoiBvB,aAAa,CACX,SAAS,EAAE,gBAAgB,EAAE,EAC7B,OAAO,CAAC,EAAE,eAAe,EACzB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,kBAAkB,EAAE;IAMvB,SAAS,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,QAAQ,EAAE,gBAAgB,GAAG,gBAAgB,EAAE;IAexF,OAAO,CACL,SAAS,EAAE,gBAAgB,EAAE,EAC7B,QAAQ,EAAE,gBAAgB,GACzB;QAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;CAsB5F"}
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../src/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAC;AAiB9B,OAAO,EAAsB,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAuhB/F,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,OAAO,GAAE,qBAA0B;IAI/C;;;;;;;;;;;;;;OAcG;IACH,OAAO,CACL,SAAS,EAAE,gBAAgB,EAAE,EAC7B,OAAO,CAAC,EAAE,eAAe,EACzB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,kBAAkB,EAAE;IAmmBvB,aAAa,CACX,SAAS,EAAE,gBAAgB,EAAE,EAC7B,OAAO,CAAC,EAAE,eAAe,EACzB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,kBAAkB,EAAE;IAMvB,SAAS,CACP,SAAS,EAAE,gBAAgB,EAAE,EAC7B,QAAQ,EAAE,gBAAgB,EAI1B,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,GACtC,gBAAgB,EAAE;IAqBrB,OAAO,CACL,SAAS,EAAE,gBAAgB,EAAE,EAC7B,QAAQ,EAAE,gBAAgB,GACzB;QAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE;CAsB5F"}