@nanonets/graft 0.10.0 → 0.12.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 +34 -13
- package/dist/ai/crux.d.ts.map +1 -1
- package/dist/ai/crux.js +7 -6
- package/dist/ai/crux.js.map +1 -1
- package/dist/ai/failure.d.ts +49 -0
- package/dist/ai/failure.d.ts.map +1 -0
- package/dist/ai/failure.js +74 -0
- package/dist/ai/failure.js.map +1 -0
- package/dist/ai/llm/anthropic.d.ts.map +1 -1
- package/dist/ai/llm/anthropic.js +4 -1
- package/dist/ai/llm/anthropic.js.map +1 -1
- package/dist/ai/llm/claude-cli.d.ts +60 -0
- package/dist/ai/llm/claude-cli.d.ts.map +1 -0
- package/dist/ai/llm/claude-cli.js +417 -0
- package/dist/ai/llm/claude-cli.js.map +1 -0
- package/dist/ai/llm/openai.d.ts.map +1 -1
- package/dist/ai/llm/openai.js +2 -0
- package/dist/ai/llm/openai.js.map +1 -1
- package/dist/ai/llm/types.d.ts +9 -0
- package/dist/ai/llm/types.d.ts.map +1 -1
- package/dist/ai/llm/types.js +12 -1
- package/dist/ai/llm/types.js.map +1 -1
- package/dist/ask/ask.d.ts.map +1 -1
- package/dist/ask/ask.js +39 -45
- package/dist/ask/ask.js.map +1 -1
- package/dist/ask/fuse.d.ts +83 -46
- package/dist/ask/fuse.d.ts.map +1 -1
- package/dist/ask/fuse.js +165 -67
- package/dist/ask/fuse.js.map +1 -1
- package/dist/blast/blast-cli.d.ts +30 -0
- package/dist/blast/blast-cli.d.ts.map +1 -0
- package/dist/blast/blast-cli.js +163 -0
- package/dist/blast/blast-cli.js.map +1 -0
- package/dist/blast/blast.d.ts +119 -0
- package/dist/blast/blast.d.ts.map +1 -0
- package/dist/blast/blast.js +383 -0
- package/dist/blast/blast.js.map +1 -0
- package/dist/blast/diff.d.ts +53 -0
- package/dist/blast/diff.d.ts.map +1 -0
- package/dist/blast/diff.js +193 -0
- package/dist/blast/diff.js.map +1 -0
- package/dist/blast/modules.d.ts +33 -0
- package/dist/blast/modules.d.ts.map +1 -0
- package/dist/blast/modules.js +83 -0
- package/dist/blast/modules.js.map +1 -0
- package/dist/blast/name.d.ts +61 -0
- package/dist/blast/name.d.ts.map +1 -0
- package/dist/blast/name.js +233 -0
- package/dist/blast/name.js.map +1 -0
- package/dist/blast/render.d.ts +37 -0
- package/dist/blast/render.d.ts.map +1 -0
- package/dist/blast/render.js +300 -0
- package/dist/blast/render.js.map +1 -0
- package/dist/blast/viz.d.ts +17 -0
- package/dist/blast/viz.d.ts.map +1 -0
- package/dist/blast/viz.js +324 -0
- package/dist/blast/viz.js.map +1 -0
- package/dist/claude/hooks.d.ts +13 -0
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +44 -4
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +45 -15
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/state.d.ts +5 -0
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/cli-picker.d.ts +44 -5
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +73 -26
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.js +270 -14
- package/dist/cli.js.map +1 -1
- package/dist/context/build.d.ts +8 -0
- package/dist/context/build.d.ts.map +1 -1
- package/dist/context/build.js +57 -9
- package/dist/context/build.js.map +1 -1
- package/dist/context/check.d.ts.map +1 -1
- package/dist/context/check.js +7 -6
- package/dist/context/check.js.map +1 -1
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +9 -2
- package/dist/context/node-file.js.map +1 -1
- package/dist/graph/bindings.d.ts.map +1 -1
- package/dist/graph/bindings.js +245 -2
- package/dist/graph/bindings.js.map +1 -1
- package/dist/graph/build.d.ts.map +1 -1
- package/dist/graph/build.js +36 -16
- package/dist/graph/build.js.map +1 -1
- package/dist/graph/check.d.ts +4 -0
- package/dist/graph/check.d.ts.map +1 -1
- package/dist/graph/check.js +8 -1
- package/dist/graph/check.js.map +1 -1
- package/dist/graph/container.d.ts +63 -0
- package/dist/graph/container.d.ts.map +1 -0
- package/dist/graph/container.js +185 -0
- package/dist/graph/container.js.map +1 -0
- package/dist/graph/enrich.d.ts +18 -0
- package/dist/graph/enrich.d.ts.map +1 -1
- package/dist/graph/enrich.js +55 -2
- package/dist/graph/enrich.js.map +1 -1
- package/dist/graph/extract.d.ts +8 -1
- package/dist/graph/extract.d.ts.map +1 -1
- package/dist/graph/extract.js +401 -12
- package/dist/graph/extract.js.map +1 -1
- package/dist/graph/generic.d.ts +34 -1
- package/dist/graph/generic.d.ts.map +1 -1
- package/dist/graph/generic.js +176 -6
- package/dist/graph/generic.js.map +1 -1
- package/dist/graph/invariants.d.ts +32 -0
- package/dist/graph/invariants.d.ts.map +1 -0
- package/dist/graph/invariants.js +49 -0
- package/dist/graph/invariants.js.map +1 -0
- package/dist/graph/queries/clojure.scm +58 -0
- package/dist/graph/resolve.d.ts.map +1 -1
- package/dist/graph/resolve.js +249 -23
- package/dist/graph/resolve.js.map +1 -1
- package/dist/graph/scopes.d.ts +2 -2
- package/dist/graph/scopes.d.ts.map +1 -1
- package/dist/graph/scopes.js +8 -6
- package/dist/graph/scopes.js.map +1 -1
- package/dist/graph/source-files.d.ts +13 -4
- package/dist/graph/source-files.d.ts.map +1 -1
- package/dist/graph/source-files.js +35 -12
- package/dist/graph/source-files.js.map +1 -1
- package/dist/graph/types.d.ts +3 -1
- package/dist/graph/types.d.ts.map +1 -1
- package/dist/graph/workspace-cli.d.ts +2 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -1
- package/dist/graph/workspace-cli.js +10 -4
- package/dist/graph/workspace-cli.js.map +1 -1
- package/dist/graph/workspace.d.ts +11 -6
- package/dist/graph/workspace.d.ts.map +1 -1
- package/dist/graph/workspace.js +24 -13
- package/dist/graph/workspace.js.map +1 -1
- package/dist/graph/write.d.ts.map +1 -1
- package/dist/graph/write.js +25 -2
- package/dist/graph/write.js.map +1 -1
- package/dist/hosts/antigravity.d.ts +7 -0
- package/dist/hosts/antigravity.d.ts.map +1 -0
- package/dist/hosts/antigravity.js +42 -0
- package/dist/hosts/antigravity.js.map +1 -0
- package/dist/hosts/codex-hooks.d.ts +3 -3
- package/dist/hosts/codex-hooks.d.ts.map +1 -1
- package/dist/hosts/codex-hooks.js +27 -21
- package/dist/hosts/codex-hooks.js.map +1 -1
- package/dist/hosts/init.d.ts.map +1 -1
- package/dist/hosts/init.js +6 -1
- package/dist/hosts/init.js.map +1 -1
- package/dist/hosts/mcp-config.d.ts.map +1 -1
- package/dist/hosts/mcp-config.js +7 -0
- package/dist/hosts/mcp-config.js.map +1 -1
- package/dist/hosts/plan.d.ts +1 -1
- package/dist/hosts/plan.d.ts.map +1 -1
- package/dist/hosts/plan.js +2 -0
- package/dist/hosts/plan.js.map +1 -1
- package/dist/hosts/registry.d.ts.map +1 -1
- package/dist/hosts/registry.js +13 -0
- package/dist/hosts/registry.js.map +1 -1
- package/dist/ingest/fs.d.ts +9 -2
- package/dist/ingest/fs.d.ts.map +1 -1
- package/dist/ingest/fs.js +100 -16
- package/dist/ingest/fs.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +45 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/telemetry/contract.d.ts +90 -0
- package/dist/telemetry/contract.d.ts.map +1 -0
- package/dist/telemetry/contract.js +203 -0
- package/dist/telemetry/contract.js.map +1 -0
- package/dist/telemetry/flush.d.ts +21 -0
- package/dist/telemetry/flush.d.ts.map +1 -0
- package/dist/telemetry/flush.js +84 -0
- package/dist/telemetry/flush.js.map +1 -0
- package/dist/telemetry/gate.d.ts +16 -0
- package/dist/telemetry/gate.d.ts.map +1 -0
- package/dist/telemetry/gate.js +64 -0
- package/dist/telemetry/gate.js.map +1 -0
- package/dist/telemetry/identity.d.ts +33 -0
- package/dist/telemetry/identity.d.ts.map +1 -0
- package/dist/telemetry/identity.js +80 -0
- package/dist/telemetry/identity.js.map +1 -0
- package/dist/telemetry/index.d.ts +18 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +16 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/key.d.ts +21 -0
- package/dist/telemetry/key.d.ts.map +1 -0
- package/dist/telemetry/key.js +49 -0
- package/dist/telemetry/key.js.map +1 -0
- package/dist/telemetry/notice.d.ts +19 -0
- package/dist/telemetry/notice.d.ts.map +1 -0
- package/dist/telemetry/notice.js +90 -0
- package/dist/telemetry/notice.js.map +1 -0
- package/dist/telemetry/queue.d.ts +35 -0
- package/dist/telemetry/queue.d.ts.map +1 -0
- package/dist/telemetry/queue.js +162 -0
- package/dist/telemetry/queue.js.map +1 -0
- package/dist/telemetry/send.d.ts +19 -0
- package/dist/telemetry/send.d.ts.map +1 -0
- package/dist/telemetry/send.js +84 -0
- package/dist/telemetry/send.js.map +1 -0
- package/dist/telemetry/sessions.d.ts +8 -0
- package/dist/telemetry/sessions.d.ts.map +1 -0
- package/dist/telemetry/sessions.js +81 -0
- package/dist/telemetry/sessions.js.map +1 -0
- package/dist/telemetry/track.d.ts +43 -0
- package/dist/telemetry/track.d.ts.map +1 -0
- package/dist/telemetry/track.js +108 -0
- package/dist/telemetry/track.js.map +1 -0
- package/dist/upkeep-run.d.ts +15 -0
- package/dist/upkeep-run.d.ts.map +1 -0
- package/dist/upkeep-run.js +60 -0
- package/dist/upkeep-run.js.map +1 -0
- package/dist/upkeep.d.ts +114 -0
- package/dist/upkeep.d.ts.map +1 -0
- package/dist/upkeep.js +232 -0
- package/dist/upkeep.js.map +1 -0
- package/dist/util/num.d.ts +3 -0
- package/dist/util/num.d.ts.map +1 -0
- package/dist/util/num.js +20 -0
- package/dist/util/num.js.map +1 -0
- package/dist/util/state.d.ts +11 -4
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +9 -0
- package/dist/util/state.js.map +1 -1
- package/dist/viewer/app.js +1 -1
- package/dist/viewer/index.html +1 -0
- package/dist/viewer/style.css +23 -2
- package/dist/viz/assemble.d.ts +33 -0
- package/dist/viz/assemble.d.ts.map +1 -1
- package/dist/viz/assemble.js.map +1 -1
- package/dist/viz/export.d.ts +39 -0
- package/dist/viz/export.d.ts.map +1 -0
- package/dist/viz/export.js +98 -0
- package/dist/viz/export.js.map +1 -0
- package/package.json +15 -5
- package/scripts/stamp-telemetry-key.mjs +53 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container tier — files that are not a language but a wrapper around one.
|
|
3
|
+
*
|
|
4
|
+
* A Vue SFC is the motivating case: `.vue` is HTML-shaped, and everything worth
|
|
5
|
+
* indexing lives inside its `<script>` block. Registering `tree-sitter-vue` as a
|
|
6
|
+
* breadth-tier language (generic.ts) would not help — that grammar parses the
|
|
7
|
+
* shell (`<template>` / `<script>` / `<style>`) and hands back the script body as
|
|
8
|
+
* one opaque `raw_text` node, so the cards would come out empty.
|
|
9
|
+
*
|
|
10
|
+
* So the container grammar is used only to answer "where does the embedded
|
|
11
|
+
* language start and end", and the block itself goes to the DEPTH-tier extractor
|
|
12
|
+
* (extract.ts). A `.vue` file therefore gets the same quality of extraction as a
|
|
13
|
+
* `.ts` file — bindings, imports, resolved calls — not the signature-only output
|
|
14
|
+
* the breadth tier would give.
|
|
15
|
+
*
|
|
16
|
+
* **The span shift is the whole risk here.** `extractFile` numbers its spans from
|
|
17
|
+
* the start of the string it was handed, so every node comes back pointing at a
|
|
18
|
+
* line in the script, not in the `.vue`. A span that is off by even one line is
|
|
19
|
+
* worse than not indexing the file at all: graft's promise is that its
|
|
20
|
+
* `file:line` is exact, and a plausible-but-wrong line silently sends the reader
|
|
21
|
+
* to the wrong place. `test/container-extract.test.ts` pins this against
|
|
22
|
+
* fixtures whose true line numbers are known.
|
|
23
|
+
*/
|
|
24
|
+
import { type ExtractResult, type Language } from "./extract.js";
|
|
25
|
+
/** A container language: the wrapper grammar, the node that holds the embedded
|
|
26
|
+
* source, and which depth-tier extractor to hand that source to. */
|
|
27
|
+
export interface ContainerLang {
|
|
28
|
+
name: string;
|
|
29
|
+
exts: string[];
|
|
30
|
+
/** wasm basename in tree-sitter-wasms/out/tree-sitter-<wasm>.wasm */
|
|
31
|
+
wasm: string;
|
|
32
|
+
/** Wrapper node that represents one embedded block (e.g. Vue's script_element). */
|
|
33
|
+
block: string;
|
|
34
|
+
/** Child of `block` holding the raw embedded source (e.g. Vue's raw_text). */
|
|
35
|
+
body: string;
|
|
36
|
+
/** Depth-tier grammar for the embedded language. TypeScript is a superset of
|
|
37
|
+
* JavaScript, so it parses both `<script>` and `<script lang="ts">`. */
|
|
38
|
+
inner: Language;
|
|
39
|
+
}
|
|
40
|
+
/** The container registry. Svelte and Astro are the same shape and would be a
|
|
41
|
+
* row each, but they are left out until someone has a repo to verify them
|
|
42
|
+
* against — a wrong `body` node type would produce silently misplaced spans. */
|
|
43
|
+
export declare const CONTAINER_LANGS: readonly ContainerLang[];
|
|
44
|
+
/** The container language for a path, or null if none claims it. */
|
|
45
|
+
export declare function containerLangOf(path: string): ContainerLang | null;
|
|
46
|
+
/** Every file extension the container tier claims. */
|
|
47
|
+
export declare function containerExtensions(): string[];
|
|
48
|
+
/** Warm the container grammars this repo needs. Same contract as
|
|
49
|
+
* `warmGenericGrammars`: await once before the synchronous parse loop, and an
|
|
50
|
+
* unavailable grammar is skipped rather than fatal (its files then extract to a
|
|
51
|
+
* file node only, exactly as they do today). */
|
|
52
|
+
export declare function warmContainerGrammars(langNames: Iterable<string>): Promise<void>;
|
|
53
|
+
/** True if a container grammar has been warmed (else extraction is file-only). */
|
|
54
|
+
export declare function isContainerWarm(langName: string): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Extract one container file. Synchronous; needs the grammar pre-warmed.
|
|
57
|
+
*
|
|
58
|
+
* Never throws: a missing grammar, an unparseable SFC or a script block the
|
|
59
|
+
* inner extractor chokes on all degrade to "fewer nodes", because a build must
|
|
60
|
+
* not fail over one component.
|
|
61
|
+
*/
|
|
62
|
+
export declare function extractContainer(rel: string, source: string, lang: ContainerLang): ExtractResult;
|
|
63
|
+
//# sourceMappingURL=container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/graph/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAuB,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAgB,MAAM,cAAc,CAAC;AAKpG;oEACoE;AACpE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;4EACwE;IACxE,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED;;gFAEgF;AAChF,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAEnD,CAAC;AAKF,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAIlE;AAED,sDAAsD;AACtD,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAID;;;gDAGgD;AAChD,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtF;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AA0DD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,aAAa,CAyDhG"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container tier — files that are not a language but a wrapper around one.
|
|
3
|
+
*
|
|
4
|
+
* A Vue SFC is the motivating case: `.vue` is HTML-shaped, and everything worth
|
|
5
|
+
* indexing lives inside its `<script>` block. Registering `tree-sitter-vue` as a
|
|
6
|
+
* breadth-tier language (generic.ts) would not help — that grammar parses the
|
|
7
|
+
* shell (`<template>` / `<script>` / `<style>`) and hands back the script body as
|
|
8
|
+
* one opaque `raw_text` node, so the cards would come out empty.
|
|
9
|
+
*
|
|
10
|
+
* So the container grammar is used only to answer "where does the embedded
|
|
11
|
+
* language start and end", and the block itself goes to the DEPTH-tier extractor
|
|
12
|
+
* (extract.ts). A `.vue` file therefore gets the same quality of extraction as a
|
|
13
|
+
* `.ts` file — bindings, imports, resolved calls — not the signature-only output
|
|
14
|
+
* the breadth tier would give.
|
|
15
|
+
*
|
|
16
|
+
* **The span shift is the whole risk here.** `extractFile` numbers its spans from
|
|
17
|
+
* the start of the string it was handed, so every node comes back pointing at a
|
|
18
|
+
* line in the script, not in the `.vue`. A span that is off by even one line is
|
|
19
|
+
* worse than not indexing the file at all: graft's promise is that its
|
|
20
|
+
* `file:line` is exact, and a plausible-but-wrong line silently sends the reader
|
|
21
|
+
* to the wrong place. `test/container-extract.test.ts` pins this against
|
|
22
|
+
* fixtures whose true line numbers are known.
|
|
23
|
+
*/
|
|
24
|
+
import { extractFile, mintId } from "./extract.js";
|
|
25
|
+
import { loadWasmLanguage, parseWasm } from "./generic.js";
|
|
26
|
+
import { contentHash } from "../util/id.js";
|
|
27
|
+
/** The container registry. Svelte and Astro are the same shape and would be a
|
|
28
|
+
* row each, but they are left out until someone has a repo to verify them
|
|
29
|
+
* against — a wrong `body` node type would produce silently misplaced spans. */
|
|
30
|
+
export const CONTAINER_LANGS = [
|
|
31
|
+
{ name: "vue", exts: [".vue"], wasm: "vue", block: "script_element", body: "raw_text", inner: "typescript" },
|
|
32
|
+
];
|
|
33
|
+
const byExt = new Map();
|
|
34
|
+
for (const l of CONTAINER_LANGS)
|
|
35
|
+
for (const e of l.exts)
|
|
36
|
+
byExt.set(e, l);
|
|
37
|
+
/** The container language for a path, or null if none claims it. */
|
|
38
|
+
export function containerLangOf(path) {
|
|
39
|
+
const lower = path.toLowerCase();
|
|
40
|
+
for (const [ext, l] of byExt)
|
|
41
|
+
if (lower.endsWith(ext))
|
|
42
|
+
return l;
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/** Every file extension the container tier claims. */
|
|
46
|
+
export function containerExtensions() {
|
|
47
|
+
return CONTAINER_LANGS.flatMap((l) => l.exts);
|
|
48
|
+
}
|
|
49
|
+
const loaded = new Map();
|
|
50
|
+
/** Warm the container grammars this repo needs. Same contract as
|
|
51
|
+
* `warmGenericGrammars`: await once before the synchronous parse loop, and an
|
|
52
|
+
* unavailable grammar is skipped rather than fatal (its files then extract to a
|
|
53
|
+
* file node only, exactly as they do today). */
|
|
54
|
+
export async function warmContainerGrammars(langNames) {
|
|
55
|
+
for (const name of new Set(langNames)) {
|
|
56
|
+
if (loaded.has(name))
|
|
57
|
+
continue;
|
|
58
|
+
const row = CONTAINER_LANGS.find((l) => l.name === name);
|
|
59
|
+
if (!row)
|
|
60
|
+
continue;
|
|
61
|
+
const language = await loadWasmLanguage(row.wasm);
|
|
62
|
+
if (language)
|
|
63
|
+
loaded.set(name, language);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** True if a container grammar has been warmed (else extraction is file-only). */
|
|
67
|
+
export function isContainerWarm(langName) {
|
|
68
|
+
return loaded.has(langName);
|
|
69
|
+
}
|
|
70
|
+
/** `L12-L20` shifted by n lines. The span format is produced in exactly two
|
|
71
|
+
* places (extract.ts and generic.ts) and is always this shape; anything else is
|
|
72
|
+
* returned untouched rather than guessed at. */
|
|
73
|
+
function shiftSpan(span, lines) {
|
|
74
|
+
const m = /^L(\d+)-L(\d+)$/.exec(span);
|
|
75
|
+
if (!m)
|
|
76
|
+
return span;
|
|
77
|
+
return `L${Number(m[1]) + lines}-L${Number(m[2]) + lines}`;
|
|
78
|
+
}
|
|
79
|
+
/** The `.vue` file's own node. Deliberately describes the whole file — line
|
|
80
|
+
* count, hash and size of the SFC, not of the script block — because that is
|
|
81
|
+
* what a reader opening this path will see. */
|
|
82
|
+
function containerFileNode(rel, source, residual) {
|
|
83
|
+
return {
|
|
84
|
+
id: rel,
|
|
85
|
+
name: rel.split("/").pop() ?? rel,
|
|
86
|
+
kind: "file",
|
|
87
|
+
path: rel,
|
|
88
|
+
span: `L1-L${Math.max(1, source.split("\n").length)}`,
|
|
89
|
+
signature: null,
|
|
90
|
+
exported: true,
|
|
91
|
+
// "ast", not "generic": the symbols under this file come from the depth-tier
|
|
92
|
+
// extractor with real bindings and specifiers. resolve.ts gates a
|
|
93
|
+
// guess-by-name fallback on `origin === "generic"`, and these nodes must not
|
|
94
|
+
// take it — they carry the information to resolve properly.
|
|
95
|
+
origin: "ast",
|
|
96
|
+
body_hash: contentHash(source),
|
|
97
|
+
chars: source.length,
|
|
98
|
+
body_text: residual,
|
|
99
|
+
summary_state: "pending",
|
|
100
|
+
summary: null,
|
|
101
|
+
crux: null,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** Every embedded block in document order, as [bodyNode] — an SFC may legally
|
|
105
|
+
* carry two (`<script>` for options/exports plus `<script setup>`), and each
|
|
106
|
+
* needs its own offset. */
|
|
107
|
+
function blocks(root, lang) {
|
|
108
|
+
const out = [];
|
|
109
|
+
const n = root.namedChildCount ?? 0;
|
|
110
|
+
for (let i = 0; i < n; i++) {
|
|
111
|
+
const child = root.namedChild?.(i);
|
|
112
|
+
if (!child || child.type !== lang.block)
|
|
113
|
+
continue;
|
|
114
|
+
const kids = child.namedChildCount ?? 0;
|
|
115
|
+
for (let j = 0; j < kids; j++) {
|
|
116
|
+
const body = child.namedChild?.(j);
|
|
117
|
+
// An empty `<script></script>` has no body child at all — skipped here, so
|
|
118
|
+
// the file still gets its file node and nothing else, which is the same
|
|
119
|
+
// shape as a file whose grammar is missing.
|
|
120
|
+
if (body && body.type === lang.body)
|
|
121
|
+
out.push(body);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Extract one container file. Synchronous; needs the grammar pre-warmed.
|
|
128
|
+
*
|
|
129
|
+
* Never throws: a missing grammar, an unparseable SFC or a script block the
|
|
130
|
+
* inner extractor chokes on all degrade to "fewer nodes", because a build must
|
|
131
|
+
* not fail over one component.
|
|
132
|
+
*/
|
|
133
|
+
export function extractContainer(rel, source, lang) {
|
|
134
|
+
const nodes = [];
|
|
135
|
+
const rawEdges = [];
|
|
136
|
+
const residuals = [];
|
|
137
|
+
const language = loaded.get(lang.name);
|
|
138
|
+
const root = language ? parseWasm(language, source) : null;
|
|
139
|
+
if (root) {
|
|
140
|
+
// Ids are minted per file by the inner extractor, so two script blocks that
|
|
141
|
+
// both define `setup` would collide. Threading one set across the blocks
|
|
142
|
+
// makes the second one `path#setup~2`, and the rename is applied to that
|
|
143
|
+
// block's edges too so nothing points at an id that no longer exists.
|
|
144
|
+
const minted = new Set([rel]);
|
|
145
|
+
for (const body of blocks(root, lang)) {
|
|
146
|
+
const script = source.slice(body.startIndex, body.endIndex);
|
|
147
|
+
let inner;
|
|
148
|
+
try {
|
|
149
|
+
inner = extractFile(rel, script, lang.inner);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
continue; // one bad block, not a bad build
|
|
153
|
+
}
|
|
154
|
+
// `raw_text` starts immediately after the `>` of the opening tag, so its
|
|
155
|
+
// row IS the tag's row and the slice begins with that line's newline.
|
|
156
|
+
// Script line 1 is therefore the tail of the tag line, and script line N
|
|
157
|
+
// lands on `.vue` line row + N — which is exactly "add the start row to a
|
|
158
|
+
// 1-based span". Taking the row from the tag node instead would look
|
|
159
|
+
// equivalent and be right only when the tag has no attributes.
|
|
160
|
+
const shift = body.startPosition.row;
|
|
161
|
+
// nodes[0] is the script's own file node: it describes the block, not the
|
|
162
|
+
// file, so it is dropped and its residual folded into the .vue file node.
|
|
163
|
+
const [scriptFile, ...symbols] = inner.nodes;
|
|
164
|
+
if (scriptFile?.body_text)
|
|
165
|
+
residuals.push(scriptFile.body_text);
|
|
166
|
+
const renamed = new Map();
|
|
167
|
+
for (const node of symbols) {
|
|
168
|
+
const id = mintId(node.id, minted);
|
|
169
|
+
if (id !== node.id)
|
|
170
|
+
renamed.set(node.id, id);
|
|
171
|
+
nodes.push({ ...node, id, span: shiftSpan(node.span, shift) });
|
|
172
|
+
}
|
|
173
|
+
for (const edge of inner.rawEdges) {
|
|
174
|
+
const source_ = renamed.get(edge.source) ?? edge.source;
|
|
175
|
+
const targetId = edge.targetId === undefined ? undefined : (renamed.get(edge.targetId) ?? edge.targetId);
|
|
176
|
+
rawEdges.push({ ...edge, source: source_, ...(targetId === undefined ? {} : { targetId }) });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Built last so it can carry the residual, but unshifted first so the file node
|
|
181
|
+
// stays at index 0 like every other tier's output.
|
|
182
|
+
nodes.unshift(containerFileNode(rel, source, residuals.join("\n")));
|
|
183
|
+
return { nodes, rawEdges };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/graph/container.ts"],"names":[],"mappings":"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"}
|
package/dist/graph/enrich.d.ts
CHANGED
|
@@ -32,6 +32,14 @@ export interface EnrichOptions {
|
|
|
32
32
|
total: number;
|
|
33
33
|
node: string;
|
|
34
34
|
}) => void;
|
|
35
|
+
/**
|
|
36
|
+
* Durability flush of the (partially) enriched graph, called from the per-file
|
|
37
|
+
* completion handler at most once every {@link CHECKPOINT_MS}. Without it, crux
|
|
38
|
+
* only reached wiring.json at build end, so an interrupted --deep run discarded
|
|
39
|
+
* every crux it had already computed and paid for (#128). Single-threaded, so it
|
|
40
|
+
* never interleaves with a node mutation.
|
|
41
|
+
*/
|
|
42
|
+
checkpoint?: () => void;
|
|
35
43
|
}
|
|
36
44
|
export interface EnrichStats {
|
|
37
45
|
cached: number;
|
|
@@ -39,6 +47,16 @@ export interface EnrichStats {
|
|
|
39
47
|
stale: number;
|
|
40
48
|
pending: number;
|
|
41
49
|
errors: string[];
|
|
50
|
+
/** Files whose LLM call failed outright. The count `errors` used to only imply —
|
|
51
|
+
* a caller has to be able to decide "this build is degraded" without parsing
|
|
52
|
+
* message strings (#127). */
|
|
53
|
+
failedFiles: number;
|
|
54
|
+
/** Files never attempted, because {@link EnrichStats.fatal} stopped the pass. */
|
|
55
|
+
skippedFiles: number;
|
|
56
|
+
/** Set when the pass gave up early: quota/auth rejection, or a run of failures
|
|
57
|
+
* that says the provider is not going to start working. The reason is written
|
|
58
|
+
* for a human — it is what `graft build --deep` exits non-zero with. */
|
|
59
|
+
fatal?: string;
|
|
42
60
|
}
|
|
43
61
|
export declare function enrichGraph(nodes: NodeV1[], prior: Map<string, NodeV1>, sources: Map<string, string>, opts?: EnrichOptions): Promise<EnrichStats>;
|
|
44
62
|
//# sourceMappingURL=enrich.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../src/graph/enrich.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../src/graph/enrich.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,eAAe,CAAC;AAEvE,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,YAAY,CAAC;AAQ/C,MAAM,WAAW,aAAa;IAC5B,sFAAsF;IACtF,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,oGAAoG;IACpG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5E;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AASD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;iCAE6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB;;4EAEwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC1B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,WAAW,CAAC,CAkItB"}
|
package/dist/graph/enrich.js
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
|
+
import { LlmFailureGate } from "../ai/failure.js";
|
|
1
2
|
/** Cap on the stored crux: an over-long pick is trimmed to its leading slice. */
|
|
2
3
|
const MAX_CRUX_LINES = 12;
|
|
3
4
|
/** Files summarized at once. Each is an independent LLM call; order is preserved. */
|
|
4
5
|
const DEFAULT_CONCURRENCY = 5;
|
|
6
|
+
/** How often the crux pass flushes partial progress to disk. Read at call time (not
|
|
7
|
+
* module load) so a test seam `GRAFT_CRUX_CHECKPOINT_MS=0` (flush on every completed
|
|
8
|
+
* file) takes effect. */
|
|
9
|
+
function checkpointMs() {
|
|
10
|
+
return Number(process.env.GRAFT_CRUX_CHECKPOINT_MS ?? 15000);
|
|
11
|
+
}
|
|
5
12
|
export async function enrichGraph(nodes, prior, sources, opts = {}) {
|
|
6
|
-
const stats = {
|
|
13
|
+
const stats = {
|
|
14
|
+
cached: 0,
|
|
15
|
+
computed: 0,
|
|
16
|
+
stale: 0,
|
|
17
|
+
pending: 0,
|
|
18
|
+
errors: [],
|
|
19
|
+
failedFiles: 0,
|
|
20
|
+
skippedFiles: 0,
|
|
21
|
+
};
|
|
7
22
|
// Which nodes actually need an LLM call this run (after cache carry-over).
|
|
8
23
|
const dirty = [];
|
|
9
24
|
for (const node of nodes) {
|
|
@@ -52,17 +67,45 @@ export async function enrichGraph(nodes, prior, sources, opts = {}) {
|
|
|
52
67
|
const files = [...byFile.keys()];
|
|
53
68
|
const limit = Math.max(1, opts.concurrency ?? DEFAULT_CONCURRENCY);
|
|
54
69
|
let done = 0;
|
|
70
|
+
const flushEvery = checkpointMs();
|
|
71
|
+
let lastCheckpoint = Date.now();
|
|
72
|
+
// Shared with the concept pass (`context/build.ts`), so both agree on when a
|
|
73
|
+
// provider has stopped working. Counted across the whole pass, not per worker:
|
|
74
|
+
// with `-j 5` the interleaving is what a user sees as "everything is failing now".
|
|
75
|
+
const gate = new LlmFailureGate();
|
|
55
76
|
await mapWithConcurrency(files, limit, async (path) => {
|
|
56
77
|
const fileNodes = byFile.get(path);
|
|
57
78
|
const source = sources.get(path);
|
|
58
79
|
const lineCount = source.split("\n").length;
|
|
80
|
+
// Once the pass is fatal, the remaining files are not attempted: every call
|
|
81
|
+
// would fail the same way, and on a metered gateway each one still costs a
|
|
82
|
+
// request. They are counted so the caller can report what was left undone.
|
|
83
|
+
if (gate.stopped) {
|
|
84
|
+
gate.skip();
|
|
85
|
+
for (const node of fileNodes) {
|
|
86
|
+
if (node.summary_state === "stale")
|
|
87
|
+
stats.stale++;
|
|
88
|
+
else
|
|
89
|
+
stats.pending++;
|
|
90
|
+
}
|
|
91
|
+
// Still reported, so the caller's progress counter reaches `total` instead of
|
|
92
|
+
// freezing at the file that broke — the abort is announced by the build's
|
|
93
|
+
// summary, not by a stalled line.
|
|
94
|
+
opts.onProgress?.({ index: done++, total: files.length, node: path });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
59
97
|
const refs = fileNodes.map((n) => {
|
|
60
98
|
const [startLine, endLine] = spanLines(n.span, lineCount);
|
|
61
99
|
return { id: n.id, kind: n.kind, signature: n.signature, startLine, endLine };
|
|
62
100
|
});
|
|
63
101
|
const { results, error } = await collectFileCrux(summarizer, path, source, refs);
|
|
64
|
-
if (error)
|
|
102
|
+
if (error) {
|
|
65
103
|
stats.errors.push(`${path}: ${error}`);
|
|
104
|
+
gate.record(error);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
gate.succeeded();
|
|
108
|
+
}
|
|
66
109
|
for (const node of fileNodes) {
|
|
67
110
|
const r = results.size > 0 ? results.get(node.id) : undefined;
|
|
68
111
|
if (!r) {
|
|
@@ -80,7 +123,17 @@ export async function enrichGraph(nodes, prior, sources, opts = {}) {
|
|
|
80
123
|
}
|
|
81
124
|
// Report on completion so the counter climbs monotonically under concurrency.
|
|
82
125
|
opts.onProgress?.({ index: done++, total: files.length, node: path });
|
|
126
|
+
// Flush partial crux to disk periodically, so a killed --deep run keeps what it
|
|
127
|
+
// has already computed (#128). Throttled by wall-clock; the caller's checkpoint
|
|
128
|
+
// writes wiring.json atomically, and the next run folds it back in by body_hash.
|
|
129
|
+
if (opts.checkpoint && Date.now() - lastCheckpoint >= flushEvery) {
|
|
130
|
+
lastCheckpoint = Date.now();
|
|
131
|
+
opts.checkpoint();
|
|
132
|
+
}
|
|
83
133
|
});
|
|
134
|
+
stats.failedFiles = gate.failed;
|
|
135
|
+
stats.skippedFiles = gate.skipped;
|
|
136
|
+
stats.fatal = gate.fatal;
|
|
84
137
|
return stats;
|
|
85
138
|
}
|
|
86
139
|
/** Run `fn` over `items` with at most `limit` in flight, preserving result order. */
|
package/dist/graph/enrich.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/graph/enrich.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../src/graph/enrich.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,iFAAiF;AACjF,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B,qFAAqF;AACrF,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAmB9B;;yBAEyB;AACzB,SAAS,YAAY;IACnB,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,KAAK,CAAC,CAAC;AAC/D,CAAC;AAoBD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAe,EACf,KAA0B,EAC1B,OAA4B,EAC5B,OAAsB,EAAE;IAExB,MAAM,KAAK,GAAgB;QACzB,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;KAChB,CAAC;IAEF,2EAA2E;IAC3E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,GAAG,EAAE,aAAa,KAAK,OAAO,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACvE,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,KAAK,CAAC,MAAM,EAAE,CAAC;YACf,SAAS;QACX,CAAC;QACD,8EAA8E;QAC9E,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;gBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;;gBAC7C,KAAK,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yEAAyE;IACzE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACnB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,8EAA8E;IAC9E,+EAA+E;IAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACnC,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,IAAI,mBAAmB,CAAC,CAAC;IACnE,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;IAClC,IAAI,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEhC,6EAA6E;IAC7E,+EAA+E;IAC/E,mFAAmF;IACnF,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;IAElC,MAAM,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAClC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAE5C,4EAA4E;QAC5E,2EAA2E;QAC3E,2EAA2E;QAC3E,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;oBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;;oBAC7C,KAAK,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;YACD,8EAA8E;YAC9E,0EAA0E;YAC1E,kCAAkC;YAClC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAc,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1C,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC1D,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACjF,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9D,IAAI,CAAC,CAAC,EAAE,CAAC;gBACP,8EAA8E;gBAC9E,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO;oBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;;oBAC7C,KAAK,CAAC,OAAO,EAAE,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;YACjC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;YAC7B,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,CAAC;QAED,8EAA8E;QAC9E,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,gFAAgF;QAChF,gFAAgF;QAChF,iFAAiF;QACjF,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,IAAI,UAAU,EAAE,CAAC;YACjE,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IAChC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC;IAClC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qFAAqF;AACrF,KAAK,UAAU,kBAAkB,CAC/B,KAAU,EACV,KAAa,EACb,EAA0C;IAE1C,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE;QAC/E,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,eAAe,CAC5B,UAA0B,EAC1B,IAAY,EACZ,MAAc,EACd,IAAe;IAEf,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,KAAyB,CAAC;IAC9B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7E,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzD,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,CAAW,EAAE,IAAY,EAAE,MAAc,EAAE,SAAiB;IAC7E,6EAA6E;IAC7E,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzD,0EAA0E;IAC1E,6EAA6E;IAC7E,2EAA2E;IAC3E,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,cAAc;QAAE,GAAG,GAAG,KAAK,GAAG,cAAc,GAAG,CAAC,CAAC;IAEvE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG,EAAE,EAAE,CAAC;AAC7C,CAAC;AAED,gFAAgF;AAChF,SAAS,SAAS,CAAC,IAAY,EAAE,SAAiB;IAChD,MAAM,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACtB,CAAC"}
|
package/dist/graph/extract.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type FileBindings } from "./bindings.js";
|
|
2
2
|
import type { Kind, NodeV1, Relation } from "./types.js";
|
|
3
|
-
export type Language = "typescript" | "tsx" | "python" | "go";
|
|
3
|
+
export type Language = "typescript" | "tsx" | "python" | "go" | "java" | "php";
|
|
4
|
+
/** Every file extension a depth-tier (hand-written) extractor claims. */
|
|
5
|
+
export declare function depthExtensions(): string[];
|
|
4
6
|
/** Map a file path to a supported language, or null if unsupported. */
|
|
5
7
|
export declare function languageOf(path: string): Language | null;
|
|
6
8
|
/**
|
|
@@ -24,6 +26,11 @@ export interface RawEdge {
|
|
|
24
26
|
/** calls with viaMember: the receiver's resolved type name (from bindings /
|
|
25
27
|
* self / this / Go receiver), when a confident local clue exists. */
|
|
26
28
|
recvType?: string;
|
|
29
|
+
/** calls: the number of arguments at the CALL SITE. Only emitted for languages
|
|
30
|
+
* with overloading (Java), where a same-named sibling on the same class is
|
|
31
|
+
* otherwise indistinguishable — and picking wrong turns a delegating overload
|
|
32
|
+
* into a self-loop. */
|
|
33
|
+
argCount?: number;
|
|
27
34
|
}
|
|
28
35
|
export interface ExtractResult {
|
|
29
36
|
nodes: NodeV1[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/graph/extract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/graph/extract.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAqD,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACrG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,KAAK,CAAC;AAsC/E,yEAAyE;AACzE,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAExD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3D;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;yEACqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;2BAGuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAgJD,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAuBD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,aAAa,CAiDtF;AAED;;;;;wEAKwE;AACxE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAMhE"}
|