@mka-rainmaker/ama 0.1.1 → 0.2.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 (65) hide show
  1. package/README.md +36 -2
  2. package/dist/analyzers/baseline/analyzer.d.ts +19 -0
  3. package/dist/analyzers/baseline/analyzer.d.ts.map +1 -1
  4. package/dist/analyzers/baseline/analyzer.js +10 -0
  5. package/dist/analyzers/baseline/analyzer.js.map +1 -1
  6. package/dist/analyzers/baseline/go.d.ts.map +1 -1
  7. package/dist/analyzers/baseline/go.js +67 -0
  8. package/dist/analyzers/baseline/go.js.map +1 -1
  9. package/dist/analyzers/baseline/java.d.ts.map +1 -1
  10. package/dist/analyzers/baseline/java.js +84 -0
  11. package/dist/analyzers/baseline/java.js.map +1 -1
  12. package/dist/analyzers/baseline/php.d.ts.map +1 -1
  13. package/dist/analyzers/baseline/php.js +56 -0
  14. package/dist/analyzers/baseline/php.js.map +1 -1
  15. package/dist/analyzers/baseline/python.d.ts.map +1 -1
  16. package/dist/analyzers/baseline/python.js +257 -0
  17. package/dist/analyzers/baseline/python.js.map +1 -1
  18. package/dist/analyzers/baseline/rust.d.ts.map +1 -1
  19. package/dist/analyzers/baseline/rust.js +80 -0
  20. package/dist/analyzers/baseline/rust.js.map +1 -1
  21. package/dist/analyzers/sidecar/protocol.d.ts +22 -22
  22. package/dist/analyzers/typescript/analyzer.d.ts.map +1 -1
  23. package/dist/analyzers/typescript/analyzer.js +51 -1
  24. package/dist/analyzers/typescript/analyzer.js.map +1 -1
  25. package/dist/api.d.ts +34 -0
  26. package/dist/api.d.ts.map +1 -0
  27. package/dist/api.js +38 -0
  28. package/dist/api.js.map +1 -0
  29. package/dist/cli/agents.d.ts +37 -0
  30. package/dist/cli/agents.d.ts.map +1 -0
  31. package/dist/cli/agents.js +86 -0
  32. package/dist/cli/agents.js.map +1 -0
  33. package/dist/cli/commands/install.d.ts +20 -0
  34. package/dist/cli/commands/install.d.ts.map +1 -0
  35. package/dist/cli/commands/install.js +117 -0
  36. package/dist/cli/commands/install.js.map +1 -0
  37. package/dist/cli/index.d.ts.map +1 -1
  38. package/dist/cli/index.js +3 -0
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/graph/index.d.ts +2 -1
  41. package/dist/graph/index.d.ts.map +1 -1
  42. package/dist/graph/index.js +2 -1
  43. package/dist/graph/index.js.map +1 -1
  44. package/dist/graph/prisma-link.d.ts +9 -4
  45. package/dist/graph/prisma-link.d.ts.map +1 -1
  46. package/dist/graph/prisma-link.js +25 -10
  47. package/dist/graph/prisma-link.js.map +1 -1
  48. package/dist/graph/python-calls.d.ts +14 -0
  49. package/dist/graph/python-calls.d.ts.map +1 -0
  50. package/dist/graph/python-calls.js +0 -0
  51. package/dist/graph/python-calls.js.map +1 -0
  52. package/dist/graph/types.d.ts +1 -1
  53. package/dist/graph/types.d.ts.map +1 -1
  54. package/dist/indexer/indexer.d.ts.map +1 -1
  55. package/dist/indexer/indexer.js +12 -1
  56. package/dist/indexer/indexer.js.map +1 -1
  57. package/dist/mcp/server.d.ts +7 -1
  58. package/dist/mcp/server.d.ts.map +1 -1
  59. package/dist/mcp/server.js +66 -30
  60. package/dist/mcp/server.js.map +1 -1
  61. package/dist/query/service.d.ts +3 -0
  62. package/dist/query/service.d.ts.map +1 -1
  63. package/dist/query/service.js +18 -2
  64. package/dist/query/service.js.map +1 -1
  65. package/package.json +10 -1
@@ -1,4 +1,5 @@
1
1
  import * as path from "node:path";
2
+ import { CALL_REF_PREFIX, symbolId } from "../../graph/index.js";
2
3
  /**
3
4
  * Resolve a Python relative import (`from .x import y`, `from . import m`,
4
5
  * `from ..pkg import z`) to candidate repo-relative module files. The leading
@@ -43,6 +44,260 @@ function pythonImports(node, importerRel) {
43
44
  }
44
45
  return groups;
45
46
  }
47
+ /** Flask/FastAPI HTTP-verb decorator attributes (`@app.get(...)`); `route` is handled
48
+ * separately as Flask's any-/default-GET form. (ama-bvg) */
49
+ const ROUTE_METHOD_ATTRS = new Set(["get", "post", "put", "delete", "patch", "options", "head"]);
50
+ /** Normalize a framework route path to the `:param` form — Flask `<id>`/`<int:id>` and
51
+ * FastAPI `{id}` both become `:id` — and ensure a leading slash. (ama-bvg) */
52
+ function normalizeRoutePath(p) {
53
+ const s = p.replace(/<(?:[^:>]+:)?([^>]+)>/g, ":$1").replace(/\{([^}]+)\}/g, ":$1");
54
+ return s.startsWith("/") ? s : `/${s}`;
55
+ }
56
+ /** The first string-literal argument of a call's `arguments`, unquoted. */
57
+ function firstStringArg(args) {
58
+ if (!args)
59
+ return undefined;
60
+ for (const a of args.namedChildren) {
61
+ if (a.type === "string")
62
+ return a.namedChildren.find((c) => c.type === "string_content")?.text;
63
+ }
64
+ return undefined;
65
+ }
66
+ /** Method + normalized path for a Flask/FastAPI route decorator, else undefined. `@x.route(p)`
67
+ * → GET (Flask default; the `methods=` kwarg is a later refinement); `@x.get(p)` etc. take the
68
+ * verb from the attribute name. (ama-bvg) */
69
+ function routeFromDecorator(dec) {
70
+ const call = dec.namedChildren.find((c) => c.type === "call");
71
+ const fn = call?.childForFieldName("function");
72
+ if (!call || fn?.type !== "attribute")
73
+ return undefined;
74
+ const attr = fn.childForFieldName("attribute")?.text?.toLowerCase();
75
+ if (!attr || (attr !== "route" && !ROUTE_METHOD_ATTRS.has(attr)))
76
+ return undefined;
77
+ const raw = firstStringArg(call.childForFieldName("arguments"));
78
+ if (raw === undefined)
79
+ return undefined;
80
+ return { method: attr === "route" ? "GET" : attr.toUpperCase(), path: normalizeRoutePath(raw) };
81
+ }
82
+ /** The handler's qualified name, matching walkSymbols' nesting: prepend each enclosing
83
+ * class/function name (a class method is `Class.method`; a top-level def is just its name). */
84
+ function qualifiedNameOf(fn) {
85
+ const own = fn.childForFieldName("name")?.text;
86
+ if (!own)
87
+ return undefined;
88
+ const parts = [];
89
+ for (let p = fn.parent; p; p = p.parent) {
90
+ if (p.type === "class_definition" || p.type === "function_definition") {
91
+ const n = p.childForFieldName("name")?.text;
92
+ if (n)
93
+ parts.unshift(n);
94
+ }
95
+ }
96
+ parts.push(own);
97
+ return parts.join(".");
98
+ }
99
+ function* eachDecorated(node) {
100
+ if (node.type === "decorated_definition")
101
+ yield node;
102
+ for (const c of node.namedChildren)
103
+ yield* eachDecorated(c);
104
+ }
105
+ /** Detect Flask/FastAPI routes: a decorated function whose decorator is `@<obj>.route(path)`
106
+ * or `@<obj>.<verb>(path)` becomes a `METHOD /path` Route referencing the function. (ama-bvg) */
107
+ function pythonRoutes(root, rel) {
108
+ const nodes = [];
109
+ const edges = [];
110
+ for (const dd of eachDecorated(root)) {
111
+ const fn = dd.childForFieldName("definition");
112
+ if (fn?.type !== "function_definition")
113
+ continue;
114
+ const handler = qualifiedNameOf(fn);
115
+ if (!handler)
116
+ continue;
117
+ for (const dec of dd.namedChildren) {
118
+ if (dec.type !== "decorator")
119
+ continue;
120
+ const route = routeFromDecorator(dec);
121
+ if (!route)
122
+ continue;
123
+ const name = `${route.method} ${route.path}`;
124
+ const routeId = symbolId({ file: rel, qualifiedName: name });
125
+ nodes.push({
126
+ id: routeId,
127
+ kind: "Route",
128
+ name,
129
+ file: rel,
130
+ qualifiedName: name,
131
+ tier: "baseline",
132
+ range: { startLine: fn.startPosition.row + 1, endLine: fn.endPosition.row + 1 },
133
+ });
134
+ edges.push({
135
+ from: routeId,
136
+ to: symbolId({ file: rel, qualifiedName: handler }),
137
+ kind: "References",
138
+ provenance: "heuristic",
139
+ });
140
+ }
141
+ }
142
+ return { nodes, edges };
143
+ }
144
+ /** Django URL-pattern functions in `urls.py`. */
145
+ const DJANGO_URL_FUNCS = new Set(["path", "re_path"]);
146
+ function* eachCall(node) {
147
+ if (node.type === "call")
148
+ yield node;
149
+ for (const c of node.namedChildren)
150
+ yield* eachCall(c);
151
+ }
152
+ /** Detect Django URL patterns: `path("users/<int:pk>/", view)` / `re_path(...)` in urls.py —
153
+ * method-agnostic (the view handles every verb), so each forms an `ANY /path` Route. The view
154
+ * is a cross-module reference (`views.foo`), not a same-file symbol, so no handler edge. (ama-a2r) */
155
+ function djangoUrlRoutes(root, rel) {
156
+ const nodes = [];
157
+ for (const call of eachCall(root)) {
158
+ const fn = call.childForFieldName("function");
159
+ if (fn?.type !== "identifier" || !DJANGO_URL_FUNCS.has(fn.text))
160
+ continue;
161
+ const raw = firstStringArg(call.childForFieldName("arguments"));
162
+ if (raw === undefined)
163
+ continue;
164
+ const name = `ANY ${normalizeRoutePath(raw)}`;
165
+ nodes.push({
166
+ id: symbolId({ file: rel, qualifiedName: name }),
167
+ kind: "Route",
168
+ name,
169
+ file: rel,
170
+ qualifiedName: name,
171
+ tier: "baseline",
172
+ range: { startLine: call.startPosition.row + 1, endLine: call.endPosition.row + 1 },
173
+ });
174
+ }
175
+ return { nodes, edges: [] };
176
+ }
177
+ /** Python route detection across shapes: Flask/FastAPI decorators + Django urls.py `path()`. */
178
+ function pythonRoutesAll(root, rel) {
179
+ const decorated = pythonRoutes(root, rel);
180
+ const django = djangoUrlRoutes(root, rel);
181
+ return {
182
+ nodes: [...decorated.nodes, ...django.nodes],
183
+ edges: [...decorated.edges, ...django.edges],
184
+ };
185
+ }
186
+ /** The nearest enclosing `function_definition` of a node, or undefined (module-level). */
187
+ function enclosingFunction(node) {
188
+ for (let p = node.parent; p; p = p.parent) {
189
+ if (p.type === "function_definition")
190
+ return p;
191
+ }
192
+ return undefined;
193
+ }
194
+ function* eachFunction(node) {
195
+ if (node.type === "function_definition")
196
+ yield node;
197
+ for (const c of node.namedChildren)
198
+ yield* eachFunction(c);
199
+ }
200
+ /** The simple (last-segment) name a call targets: `foo()` → "foo", `obj.bar()` → "bar". */
201
+ function calleeName(call) {
202
+ const fn = call.childForFieldName("function");
203
+ if (fn?.type === "identifier")
204
+ return fn.text;
205
+ if (fn?.type === "attribute")
206
+ return fn.childForFieldName("attribute")?.text;
207
+ return undefined;
208
+ }
209
+ /** Common Python builtins — not emitted as cross-file call candidates (they resolve to no
210
+ * project function, so they'd only add dangling candidates). (ama-bnj) */
211
+ const PYTHON_BUILTINS = new Set([
212
+ "print",
213
+ "len",
214
+ "range",
215
+ "str",
216
+ "int",
217
+ "float",
218
+ "bool",
219
+ "list",
220
+ "dict",
221
+ "set",
222
+ "tuple",
223
+ "isinstance",
224
+ "issubclass",
225
+ "super",
226
+ "open",
227
+ "enumerate",
228
+ "zip",
229
+ "map",
230
+ "filter",
231
+ "sorted",
232
+ "reversed",
233
+ "sum",
234
+ "min",
235
+ "max",
236
+ "abs",
237
+ "round",
238
+ "getattr",
239
+ "setattr",
240
+ "hasattr",
241
+ "type",
242
+ "repr",
243
+ "format",
244
+ "iter",
245
+ "next",
246
+ "any",
247
+ "all",
248
+ ]);
249
+ /** Heuristic baseline call edges. A call to a function/method defined in the SAME file resolves
250
+ * straight to a `Calls` edge (name-based; an ambiguous name defined more than once, and
251
+ * module-level calls with no enclosing function, are skipped). A call to a name NOT defined
252
+ * locally (and not a builtin) becomes a `call:<name>` candidate that {@link deriveCallEdges}
253
+ * resolves cross-file via the import graph. (ama-bnj) */
254
+ function pythonCalls(root, rel) {
255
+ const byName = new Map(); // simple name → id, or null when ambiguous
256
+ for (const fn of eachFunction(root)) {
257
+ const qn = qualifiedNameOf(fn);
258
+ if (!qn)
259
+ continue;
260
+ const simple = qn.slice(qn.lastIndexOf(".") + 1);
261
+ byName.set(simple, byName.has(simple) ? null : symbolId({ file: rel, qualifiedName: qn }));
262
+ }
263
+ const edges = [];
264
+ const seen = new Set();
265
+ for (const call of eachCall(root)) {
266
+ const enc = enclosingFunction(call);
267
+ const name = calleeName(call);
268
+ if (!enc || !name)
269
+ continue;
270
+ const callerQn = qualifiedNameOf(enc);
271
+ if (!callerQn)
272
+ continue;
273
+ const from = symbolId({ file: rel, qualifiedName: callerQn });
274
+ const local = byName.get(name);
275
+ if (local === null)
276
+ continue; // a name defined more than once locally — don't guess
277
+ if (local) {
278
+ // resolved within this file (slice 1)
279
+ const key = `c ${from} ${local}`;
280
+ if (from === local || seen.has(key))
281
+ continue; // skip self-recursion + duplicate sites
282
+ seen.add(key);
283
+ edges.push({ from, to: local, kind: "Calls", provenance: "heuristic" });
284
+ }
285
+ else if (!PYTHON_BUILTINS.has(name)) {
286
+ // not local — a cross-file candidate deriveCallEdges resolves via the import graph (slice 2)
287
+ const key = `r ${from} ${name}`;
288
+ if (seen.has(key))
289
+ continue;
290
+ seen.add(key);
291
+ edges.push({
292
+ from,
293
+ to: `${CALL_REF_PREFIX}${name}`,
294
+ kind: "References",
295
+ provenance: "call-ref",
296
+ });
297
+ }
298
+ }
299
+ return { nodes: [], edges };
300
+ }
46
301
  /**
47
302
  * Baseline (syntactic) spec for Python. Functions and classes are the symbols
48
303
  * worth a node; methods are `function_definition` too (Python doesn't
@@ -59,5 +314,7 @@ export const pythonSpec = {
59
314
  class_definition: { kind: "Class" },
60
315
  },
61
316
  resolveImports: pythonImports,
317
+ collectRoutes: pythonRoutesAll,
318
+ collectCalls: pythonCalls,
62
319
  };
63
320
  //# sourceMappingURL=python.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/analyzers/baseline/python.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/analyzers/baseline/python.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../../src/analyzers/baseline/rust.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAuBlD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE,YAatB,CAAC"}
1
+ {"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../../src/analyzers/baseline/rust.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AA2GlD;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,EAAE,YActB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import * as path from "node:path";
2
+ import { symbolId } from "../../graph/index.js";
2
3
  /** Files whose `mod foo;` submodules live in the *same* directory (a crate root
3
4
  * or a `mod.rs`); any other `foo.rs` owns a `foo/` directory for its submodules. */
4
5
  const RUST_DIR_MODULES = new Set(["mod", "lib", "main"]);
@@ -21,6 +22,84 @@ function rustImports(node, importerRel) {
21
22
  const base = baseDir === "." ? name : `${baseDir}/${name}`;
22
23
  return [[`${base}.rs`, `${base}/mod.rs`]];
23
24
  }
25
+ /** actix-web route attribute macros — `#[get("/x")]` — by macro name → HTTP verb. (ama-a2r) */
26
+ const RUST_ROUTE_VERBS = new Map([
27
+ ["get", "GET"],
28
+ ["post", "POST"],
29
+ ["put", "PUT"],
30
+ ["delete", "DELETE"],
31
+ ["patch", "PATCH"],
32
+ ["head", "HEAD"],
33
+ ]);
34
+ function firstOfType(node, type) {
35
+ if (node.type === type)
36
+ return node;
37
+ for (const c of node.namedChildren) {
38
+ const found = firstOfType(c, type);
39
+ if (found)
40
+ return found;
41
+ }
42
+ return undefined;
43
+ }
44
+ /** Normalize an actix route path: `{id}` → `:id`; ensure a leading slash. (ama-a2r) */
45
+ function normalizeRustRoutePath(p) {
46
+ const s = p.replace(/\{([^}]+)\}/g, ":$1");
47
+ return s.startsWith("/") ? s : `/${s}`;
48
+ }
49
+ /** A route `{verb, path}` among the `attribute_item`s immediately preceding `siblings[fnIndex]`
50
+ * (a function_item), or undefined — `#[get("/x")]` → `attribute` (`get` + a string token). */
51
+ function rustRouteFromAttrs(siblings, fnIndex) {
52
+ for (let j = fnIndex - 1; j >= 0 && siblings[j]?.type === "attribute_item"; j--) {
53
+ const attr = siblings[j]?.namedChildren.find((c) => c.type === "attribute");
54
+ if (!attr)
55
+ continue;
56
+ const verb = RUST_ROUTE_VERBS.get(firstOfType(attr, "identifier")?.text ?? "");
57
+ const str = firstOfType(attr, "string_literal");
58
+ if (verb && str)
59
+ return { verb, path: str.text.replace(/^"|"$/g, "") };
60
+ }
61
+ return undefined;
62
+ }
63
+ /** Detect actix-web routes: a `#[get("/x")]`-style attribute on a `fn` becomes a `METHOD /x`
64
+ * Route referencing the function. Recurses so functions inside `mod` blocks are covered. (ama-a2r) */
65
+ function rustRoutes(root, rel) {
66
+ const nodes = [];
67
+ const edges = [];
68
+ const visit = (node) => {
69
+ const kids = node.namedChildren;
70
+ for (let i = 0; i < kids.length; i++) {
71
+ const k = kids[i];
72
+ if (!k)
73
+ continue;
74
+ if (k.type === "function_item") {
75
+ const route = rustRouteFromAttrs(kids, i);
76
+ const fnName = k.childForFieldName("name")?.text;
77
+ if (route && fnName) {
78
+ const name = `${route.verb} ${normalizeRustRoutePath(route.path)}`;
79
+ const routeId = symbolId({ file: rel, qualifiedName: name });
80
+ nodes.push({
81
+ id: routeId,
82
+ kind: "Route",
83
+ name,
84
+ file: rel,
85
+ qualifiedName: name,
86
+ tier: "baseline",
87
+ range: { startLine: k.startPosition.row + 1, endLine: k.endPosition.row + 1 },
88
+ });
89
+ edges.push({
90
+ from: routeId,
91
+ to: symbolId({ file: rel, qualifiedName: fnName }),
92
+ kind: "References",
93
+ provenance: "heuristic",
94
+ });
95
+ }
96
+ }
97
+ visit(k);
98
+ }
99
+ };
100
+ visit(root);
101
+ return { nodes, edges };
102
+ }
24
103
  /**
25
104
  * Baseline (syntactic) spec for Rust. Rust gives each kind its own node type, so
26
105
  * the plain map suffices: struct → Class, enum → Enum, trait → Interface, fn →
@@ -41,5 +120,6 @@ export const rustSpec = {
41
120
  trait_item: { kind: "Interface" },
42
121
  },
43
122
  resolveImports: rustImports,
123
+ collectRoutes: rustRoutes,
44
124
  };
45
125
  //# sourceMappingURL=rust.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../src/analyzers/baseline/rust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC;qFACqF;AACrF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzD;;;;mFAImF;AACnF,SAAS,WAAW,CAAC,IAAuB,EAAE,WAAmB;IAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC;QAAE,OAAO,EAAE,CAAC,CAAC,gBAAgB;IAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,EAAE,CAAC;IAC3D,OAAO,CAAC,CAAC,GAAG,IAAI,KAAK,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,CAAC,KAAK,CAAC;IACnB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE;QACP,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QACnC,8EAA8E;QAC9E,uBAAuB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;QAC9B,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;KAClC;IACD,cAAc,EAAE,WAAW;CAC5B,CAAC"}
1
+ {"version":3,"file":"rust.js","sourceRoot":"","sources":["../../../src/analyzers/baseline/rust.ts"],"names":[],"mappings":"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"}
@@ -22,9 +22,9 @@ export declare const graphNodeSchema: z.ZodObject<{
22
22
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
23
23
  name: string;
24
24
  id: string;
25
+ tier: "deep" | "baseline";
25
26
  file: string;
26
27
  qualifiedName: string;
27
- tier: "deep" | "baseline";
28
28
  range?: {
29
29
  startLine: number;
30
30
  endLine: number;
@@ -33,9 +33,9 @@ export declare const graphNodeSchema: z.ZodObject<{
33
33
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
34
34
  name: string;
35
35
  id: string;
36
+ tier: "deep" | "baseline";
36
37
  file: string;
37
38
  qualifiedName: string;
38
- tier: "deep" | "baseline";
39
39
  range?: {
40
40
  startLine: number;
41
41
  endLine: number;
@@ -75,11 +75,11 @@ export declare const graphEdgeSchema: z.ZodObject<{
75
75
  line: number;
76
76
  column: number;
77
77
  } | undefined;
78
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
79
78
  sites?: {
80
79
  line: number;
81
80
  column: number;
82
81
  }[] | undefined;
82
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
83
83
  }, {
84
84
  kind: "Defines" | "Calls" | "Instantiates" | "Overrides" | "Inherits" | "Implements" | "UsesType" | "Returns" | "Imports" | "ImportsType" | "References";
85
85
  from: string;
@@ -88,11 +88,11 @@ export declare const graphEdgeSchema: z.ZodObject<{
88
88
  line: number;
89
89
  column: number;
90
90
  } | undefined;
91
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
92
91
  sites?: {
93
92
  line: number;
94
93
  column: number;
95
94
  }[] | undefined;
95
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
96
96
  }>;
97
97
  /** Ama → sidecar: analyze these repo-relative `files` rooted at the absolute `root`.
98
98
  * `id` correlates the matching `result`/`error`. */
@@ -104,13 +104,13 @@ export declare const analyzeRequestSchema: z.ZodObject<{
104
104
  }, "strip", z.ZodTypeAny, {
105
105
  type: "analyze";
106
106
  id: number;
107
- root: string;
108
107
  files: string[];
108
+ root: string;
109
109
  }, {
110
110
  type: "analyze";
111
111
  id: number;
112
- root: string;
113
112
  files: string[];
113
+ root: string;
114
114
  }>;
115
115
  /** Sidecar → Ama: the analysis of one request's files. */
116
116
  declare const resultSchema: z.ZodObject<{
@@ -137,9 +137,9 @@ declare const resultSchema: z.ZodObject<{
137
137
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
138
138
  name: string;
139
139
  id: string;
140
+ tier: "deep" | "baseline";
140
141
  file: string;
141
142
  qualifiedName: string;
142
- tier: "deep" | "baseline";
143
143
  range?: {
144
144
  startLine: number;
145
145
  endLine: number;
@@ -148,9 +148,9 @@ declare const resultSchema: z.ZodObject<{
148
148
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
149
149
  name: string;
150
150
  id: string;
151
+ tier: "deep" | "baseline";
151
152
  file: string;
152
153
  qualifiedName: string;
153
- tier: "deep" | "baseline";
154
154
  range?: {
155
155
  startLine: number;
156
156
  endLine: number;
@@ -189,11 +189,11 @@ declare const resultSchema: z.ZodObject<{
189
189
  line: number;
190
190
  column: number;
191
191
  } | undefined;
192
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
193
192
  sites?: {
194
193
  line: number;
195
194
  column: number;
196
195
  }[] | undefined;
196
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
197
197
  }, {
198
198
  kind: "Defines" | "Calls" | "Instantiates" | "Overrides" | "Inherits" | "Implements" | "UsesType" | "Returns" | "Imports" | "ImportsType" | "References";
199
199
  from: string;
@@ -202,11 +202,11 @@ declare const resultSchema: z.ZodObject<{
202
202
  line: number;
203
203
  column: number;
204
204
  } | undefined;
205
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
206
205
  sites?: {
207
206
  line: number;
208
207
  column: number;
209
208
  }[] | undefined;
209
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
210
210
  }>, "many">;
211
211
  resolution: z.ZodOptional<z.ZodObject<{
212
212
  callsTotal: z.ZodNumber;
@@ -226,9 +226,9 @@ declare const resultSchema: z.ZodObject<{
226
226
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
227
227
  name: string;
228
228
  id: string;
229
+ tier: "deep" | "baseline";
229
230
  file: string;
230
231
  qualifiedName: string;
231
- tier: "deep" | "baseline";
232
232
  range?: {
233
233
  startLine: number;
234
234
  endLine: number;
@@ -242,11 +242,11 @@ declare const resultSchema: z.ZodObject<{
242
242
  line: number;
243
243
  column: number;
244
244
  } | undefined;
245
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
246
245
  sites?: {
247
246
  line: number;
248
247
  column: number;
249
248
  }[] | undefined;
249
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
250
250
  }[];
251
251
  type: "result";
252
252
  id: number;
@@ -260,9 +260,9 @@ declare const resultSchema: z.ZodObject<{
260
260
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
261
261
  name: string;
262
262
  id: string;
263
+ tier: "deep" | "baseline";
263
264
  file: string;
264
265
  qualifiedName: string;
265
- tier: "deep" | "baseline";
266
266
  range?: {
267
267
  startLine: number;
268
268
  endLine: number;
@@ -276,11 +276,11 @@ declare const resultSchema: z.ZodObject<{
276
276
  line: number;
277
277
  column: number;
278
278
  } | undefined;
279
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
280
279
  sites?: {
281
280
  line: number;
282
281
  column: number;
283
282
  }[] | undefined;
283
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
284
284
  }[];
285
285
  type: "result";
286
286
  id: number;
@@ -327,9 +327,9 @@ export declare const sidecarMessageSchema: z.ZodDiscriminatedUnion<"type", [z.Zo
327
327
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
328
328
  name: string;
329
329
  id: string;
330
+ tier: "deep" | "baseline";
330
331
  file: string;
331
332
  qualifiedName: string;
332
- tier: "deep" | "baseline";
333
333
  range?: {
334
334
  startLine: number;
335
335
  endLine: number;
@@ -338,9 +338,9 @@ export declare const sidecarMessageSchema: z.ZodDiscriminatedUnion<"type", [z.Zo
338
338
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
339
339
  name: string;
340
340
  id: string;
341
+ tier: "deep" | "baseline";
341
342
  file: string;
342
343
  qualifiedName: string;
343
- tier: "deep" | "baseline";
344
344
  range?: {
345
345
  startLine: number;
346
346
  endLine: number;
@@ -379,11 +379,11 @@ export declare const sidecarMessageSchema: z.ZodDiscriminatedUnion<"type", [z.Zo
379
379
  line: number;
380
380
  column: number;
381
381
  } | undefined;
382
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
383
382
  sites?: {
384
383
  line: number;
385
384
  column: number;
386
385
  }[] | undefined;
386
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
387
387
  }, {
388
388
  kind: "Defines" | "Calls" | "Instantiates" | "Overrides" | "Inherits" | "Implements" | "UsesType" | "Returns" | "Imports" | "ImportsType" | "References";
389
389
  from: string;
@@ -392,11 +392,11 @@ export declare const sidecarMessageSchema: z.ZodDiscriminatedUnion<"type", [z.Zo
392
392
  line: number;
393
393
  column: number;
394
394
  } | undefined;
395
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
396
395
  sites?: {
397
396
  line: number;
398
397
  column: number;
399
398
  }[] | undefined;
399
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
400
400
  }>, "many">;
401
401
  resolution: z.ZodOptional<z.ZodObject<{
402
402
  callsTotal: z.ZodNumber;
@@ -416,9 +416,9 @@ export declare const sidecarMessageSchema: z.ZodDiscriminatedUnion<"type", [z.Zo
416
416
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
417
417
  name: string;
418
418
  id: string;
419
+ tier: "deep" | "baseline";
419
420
  file: string;
420
421
  qualifiedName: string;
421
- tier: "deep" | "baseline";
422
422
  range?: {
423
423
  startLine: number;
424
424
  endLine: number;
@@ -432,11 +432,11 @@ export declare const sidecarMessageSchema: z.ZodDiscriminatedUnion<"type", [z.Zo
432
432
  line: number;
433
433
  column: number;
434
434
  } | undefined;
435
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
436
435
  sites?: {
437
436
  line: number;
438
437
  column: number;
439
438
  }[] | undefined;
439
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
440
440
  }[];
441
441
  type: "result";
442
442
  id: number;
@@ -450,9 +450,9 @@ export declare const sidecarMessageSchema: z.ZodDiscriminatedUnion<"type", [z.Zo
450
450
  kind: "File" | "Module" | "Class" | "Interface" | "Enum" | "TypeAlias" | "Function" | "Method" | "Property" | "Variable" | "Route" | "Component";
451
451
  name: string;
452
452
  id: string;
453
+ tier: "deep" | "baseline";
453
454
  file: string;
454
455
  qualifiedName: string;
455
- tier: "deep" | "baseline";
456
456
  range?: {
457
457
  startLine: number;
458
458
  endLine: number;
@@ -466,11 +466,11 @@ export declare const sidecarMessageSchema: z.ZodDiscriminatedUnion<"type", [z.Zo
466
466
  line: number;
467
467
  column: number;
468
468
  } | undefined;
469
- provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
470
469
  sites?: {
471
470
  line: number;
472
471
  column: number;
473
472
  }[] | undefined;
473
+ provenance?: "resolved" | "heuristic" | "dispatch" | undefined;
474
474
  }[];
475
475
  type: "result";
476
476
  id: number;