@mka-rainmaker/ama 0.1.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 (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/dist/analyzers/baseline/analyzer.d.ts +47 -0
  4. package/dist/analyzers/baseline/analyzer.d.ts.map +1 -0
  5. package/dist/analyzers/baseline/analyzer.js +84 -0
  6. package/dist/analyzers/baseline/analyzer.js.map +1 -0
  7. package/dist/analyzers/baseline/c.d.ts +12 -0
  8. package/dist/analyzers/baseline/c.d.ts.map +1 -0
  9. package/dist/analyzers/baseline/c.js +56 -0
  10. package/dist/analyzers/baseline/c.js.map +1 -0
  11. package/dist/analyzers/baseline/config.d.ts +21 -0
  12. package/dist/analyzers/baseline/config.d.ts.map +1 -0
  13. package/dist/analyzers/baseline/config.js +32 -0
  14. package/dist/analyzers/baseline/config.js.map +1 -0
  15. package/dist/analyzers/baseline/csharp.d.ts +9 -0
  16. package/dist/analyzers/baseline/csharp.d.ts.map +1 -0
  17. package/dist/analyzers/baseline/csharp.js +107 -0
  18. package/dist/analyzers/baseline/csharp.js.map +1 -0
  19. package/dist/analyzers/baseline/go.d.ts +11 -0
  20. package/dist/analyzers/baseline/go.d.ts.map +1 -0
  21. package/dist/analyzers/baseline/go.js +66 -0
  22. package/dist/analyzers/baseline/go.js.map +1 -0
  23. package/dist/analyzers/baseline/java.d.ts +9 -0
  24. package/dist/analyzers/baseline/java.d.ts.map +1 -0
  25. package/dist/analyzers/baseline/java.js +50 -0
  26. package/dist/analyzers/baseline/java.js.map +1 -0
  27. package/dist/analyzers/baseline/javascript.d.ts +10 -0
  28. package/dist/analyzers/baseline/javascript.d.ts.map +1 -0
  29. package/dist/analyzers/baseline/javascript.js +55 -0
  30. package/dist/analyzers/baseline/javascript.js.map +1 -0
  31. package/dist/analyzers/baseline/kotlin.d.ts +11 -0
  32. package/dist/analyzers/baseline/kotlin.d.ts.map +1 -0
  33. package/dist/analyzers/baseline/kotlin.js +67 -0
  34. package/dist/analyzers/baseline/kotlin.js.map +1 -0
  35. package/dist/analyzers/baseline/paths.d.ts +6 -0
  36. package/dist/analyzers/baseline/paths.d.ts.map +1 -0
  37. package/dist/analyzers/baseline/paths.js +17 -0
  38. package/dist/analyzers/baseline/paths.js.map +1 -0
  39. package/dist/analyzers/baseline/php.d.ts +11 -0
  40. package/dist/analyzers/baseline/php.d.ts.map +1 -0
  41. package/dist/analyzers/baseline/php.js +76 -0
  42. package/dist/analyzers/baseline/php.js.map +1 -0
  43. package/dist/analyzers/baseline/python.d.ts +10 -0
  44. package/dist/analyzers/baseline/python.d.ts.map +1 -0
  45. package/dist/analyzers/baseline/python.js +63 -0
  46. package/dist/analyzers/baseline/python.js.map +1 -0
  47. package/dist/analyzers/baseline/rust.d.ts +10 -0
  48. package/dist/analyzers/baseline/rust.d.ts.map +1 -0
  49. package/dist/analyzers/baseline/rust.js +45 -0
  50. package/dist/analyzers/baseline/rust.js.map +1 -0
  51. package/dist/analyzers/baseline/swift.d.ts +11 -0
  52. package/dist/analyzers/baseline/swift.d.ts.map +1 -0
  53. package/dist/analyzers/baseline/swift.js +19 -0
  54. package/dist/analyzers/baseline/swift.js.map +1 -0
  55. package/dist/analyzers/baseline/treesitter.d.ts +11 -0
  56. package/dist/analyzers/baseline/treesitter.d.ts.map +1 -0
  57. package/dist/analyzers/baseline/treesitter.js +87 -0
  58. package/dist/analyzers/baseline/treesitter.js.map +1 -0
  59. package/dist/analyzers/baseline/walk.d.ts +26 -0
  60. package/dist/analyzers/baseline/walk.d.ts.map +1 -0
  61. package/dist/analyzers/baseline/walk.js +76 -0
  62. package/dist/analyzers/baseline/walk.js.map +1 -0
  63. package/dist/analyzers/registry.d.ts +19 -0
  64. package/dist/analyzers/registry.d.ts.map +1 -0
  65. package/dist/analyzers/registry.js +43 -0
  66. package/dist/analyzers/registry.js.map +1 -0
  67. package/dist/analyzers/sfc/analyzer.d.ts +17 -0
  68. package/dist/analyzers/sfc/analyzer.d.ts.map +1 -0
  69. package/dist/analyzers/sfc/analyzer.js +141 -0
  70. package/dist/analyzers/sfc/analyzer.js.map +1 -0
  71. package/dist/analyzers/sidecar/analyzer.d.ts +29 -0
  72. package/dist/analyzers/sidecar/analyzer.d.ts.map +1 -0
  73. package/dist/analyzers/sidecar/analyzer.js +114 -0
  74. package/dist/analyzers/sidecar/analyzer.js.map +1 -0
  75. package/dist/analyzers/sidecar/protocol.d.ts +508 -0
  76. package/dist/analyzers/sidecar/protocol.d.ts.map +1 -0
  77. package/dist/analyzers/sidecar/protocol.js +102 -0
  78. package/dist/analyzers/sidecar/protocol.js.map +1 -0
  79. package/dist/analyzers/types.d.ts +46 -0
  80. package/dist/analyzers/types.d.ts.map +1 -0
  81. package/dist/analyzers/types.js +2 -0
  82. package/dist/analyzers/types.js.map +1 -0
  83. package/dist/analyzers/typescript/analyzer.d.ts +126 -0
  84. package/dist/analyzers/typescript/analyzer.d.ts.map +1 -0
  85. package/dist/analyzers/typescript/analyzer.js +1600 -0
  86. package/dist/analyzers/typescript/analyzer.js.map +1 -0
  87. package/dist/cli/commands/cycles.d.ts +6 -0
  88. package/dist/cli/commands/cycles.d.ts.map +1 -0
  89. package/dist/cli/commands/cycles.js +27 -0
  90. package/dist/cli/commands/cycles.js.map +1 -0
  91. package/dist/cli/commands/files.d.ts +6 -0
  92. package/dist/cli/commands/files.d.ts.map +1 -0
  93. package/dist/cli/commands/files.js +33 -0
  94. package/dist/cli/commands/files.js.map +1 -0
  95. package/dist/cli/commands/impact.d.ts +18 -0
  96. package/dist/cli/commands/impact.d.ts.map +1 -0
  97. package/dist/cli/commands/impact.js +113 -0
  98. package/dist/cli/commands/impact.js.map +1 -0
  99. package/dist/cli/commands/lifecycle.d.ts +5 -0
  100. package/dist/cli/commands/lifecycle.d.ts.map +1 -0
  101. package/dist/cli/commands/lifecycle.js +83 -0
  102. package/dist/cli/commands/lifecycle.js.map +1 -0
  103. package/dist/cli/commands/query.d.ts +31 -0
  104. package/dist/cli/commands/query.d.ts.map +1 -0
  105. package/dist/cli/commands/query.js +187 -0
  106. package/dist/cli/commands/query.js.map +1 -0
  107. package/dist/cli/commands/search.d.ts +21 -0
  108. package/dist/cli/commands/search.d.ts.map +1 -0
  109. package/dist/cli/commands/search.js +160 -0
  110. package/dist/cli/commands/search.js.map +1 -0
  111. package/dist/cli/commands/status.d.ts +6 -0
  112. package/dist/cli/commands/status.d.ts.map +1 -0
  113. package/dist/cli/commands/status.js +63 -0
  114. package/dist/cli/commands/status.js.map +1 -0
  115. package/dist/cli/commands/sync.d.ts +6 -0
  116. package/dist/cli/commands/sync.d.ts.map +1 -0
  117. package/dist/cli/commands/sync.js +57 -0
  118. package/dist/cli/commands/sync.js.map +1 -0
  119. package/dist/cli/emit.d.ts +9 -0
  120. package/dist/cli/emit.d.ts.map +1 -0
  121. package/dist/cli/emit.js +10 -0
  122. package/dist/cli/emit.js.map +1 -0
  123. package/dist/cli/index.d.ts +37 -0
  124. package/dist/cli/index.d.ts.map +1 -0
  125. package/dist/cli/index.js +128 -0
  126. package/dist/cli/index.js.map +1 -0
  127. package/dist/cli/paths.d.ts +7 -0
  128. package/dist/cli/paths.d.ts.map +1 -0
  129. package/dist/cli/paths.js +10 -0
  130. package/dist/cli/paths.js.map +1 -0
  131. package/dist/cli/query-runner.d.ts +13 -0
  132. package/dist/cli/query-runner.d.ts.map +1 -0
  133. package/dist/cli/query-runner.js +33 -0
  134. package/dist/cli/query-runner.js.map +1 -0
  135. package/dist/graph/dispatch.d.ts +17 -0
  136. package/dist/graph/dispatch.d.ts.map +1 -0
  137. package/dist/graph/dispatch.js +82 -0
  138. package/dist/graph/dispatch.js.map +1 -0
  139. package/dist/graph/id.d.ts +19 -0
  140. package/dist/graph/id.d.ts.map +1 -0
  141. package/dist/graph/id.js +17 -0
  142. package/dist/graph/id.js.map +1 -0
  143. package/dist/graph/index.d.ts +6 -0
  144. package/dist/graph/index.d.ts.map +1 -0
  145. package/dist/graph/index.js +4 -0
  146. package/dist/graph/index.js.map +1 -0
  147. package/dist/graph/types.d.ts +71 -0
  148. package/dist/graph/types.d.ts.map +1 -0
  149. package/dist/graph/types.js +52 -0
  150. package/dist/graph/types.js.map +1 -0
  151. package/dist/indexer/debouncer.d.ts +32 -0
  152. package/dist/indexer/debouncer.d.ts.map +1 -0
  153. package/dist/indexer/debouncer.js +81 -0
  154. package/dist/indexer/debouncer.js.map +1 -0
  155. package/dist/indexer/ignore.d.ts +55 -0
  156. package/dist/indexer/ignore.d.ts.map +1 -0
  157. package/dist/indexer/ignore.js +170 -0
  158. package/dist/indexer/ignore.js.map +1 -0
  159. package/dist/indexer/indexer.d.ts +112 -0
  160. package/dist/indexer/indexer.d.ts.map +1 -0
  161. package/dist/indexer/indexer.js +392 -0
  162. package/dist/indexer/indexer.js.map +1 -0
  163. package/dist/indexer/watcher.d.ts +50 -0
  164. package/dist/indexer/watcher.d.ts.map +1 -0
  165. package/dist/indexer/watcher.js +86 -0
  166. package/dist/indexer/watcher.js.map +1 -0
  167. package/dist/mcp/build-info.d.ts +16 -0
  168. package/dist/mcp/build-info.d.ts.map +1 -0
  169. package/dist/mcp/build-info.js +54 -0
  170. package/dist/mcp/build-info.js.map +1 -0
  171. package/dist/mcp/http.d.ts +18 -0
  172. package/dist/mcp/http.d.ts.map +1 -0
  173. package/dist/mcp/http.js +145 -0
  174. package/dist/mcp/http.js.map +1 -0
  175. package/dist/mcp/server.d.ts +22 -0
  176. package/dist/mcp/server.d.ts.map +1 -0
  177. package/dist/mcp/server.js +401 -0
  178. package/dist/mcp/server.js.map +1 -0
  179. package/dist/mcp/session.d.ts +155 -0
  180. package/dist/mcp/session.d.ts.map +1 -0
  181. package/dist/mcp/session.js +319 -0
  182. package/dist/mcp/session.js.map +1 -0
  183. package/dist/query/service.d.ts +329 -0
  184. package/dist/query/service.d.ts.map +1 -0
  185. package/dist/query/service.js +959 -0
  186. package/dist/query/service.js.map +1 -0
  187. package/dist/runtime/entrypoint.d.ts +11 -0
  188. package/dist/runtime/entrypoint.d.ts.map +1 -0
  189. package/dist/runtime/entrypoint.js +22 -0
  190. package/dist/runtime/entrypoint.js.map +1 -0
  191. package/dist/runtime/quiet-sqlite-warning.d.ts +14 -0
  192. package/dist/runtime/quiet-sqlite-warning.d.ts.map +1 -0
  193. package/dist/runtime/quiet-sqlite-warning.js +26 -0
  194. package/dist/runtime/quiet-sqlite-warning.js.map +1 -0
  195. package/dist/runtime/wasm-tier.d.ts +2 -0
  196. package/dist/runtime/wasm-tier.d.ts.map +1 -0
  197. package/dist/runtime/wasm-tier.js +54 -0
  198. package/dist/runtime/wasm-tier.js.map +1 -0
  199. package/dist/store/memory.d.ts +54 -0
  200. package/dist/store/memory.d.ts.map +1 -0
  201. package/dist/store/memory.js +210 -0
  202. package/dist/store/memory.js.map +1 -0
  203. package/dist/store/sqlite.d.ts +38 -0
  204. package/dist/store/sqlite.d.ts.map +1 -0
  205. package/dist/store/sqlite.js +298 -0
  206. package/dist/store/sqlite.js.map +1 -0
  207. package/dist/store/types.d.ts +76 -0
  208. package/dist/store/types.d.ts.map +1 -0
  209. package/dist/store/types.js +2 -0
  210. package/dist/store/types.js.map +1 -0
  211. package/package.json +59 -0
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env node
2
+ import * as fs from "node:fs";
3
+ import { serverStamp } from "../mcp/build-info.js";
4
+ import { isEntrypoint } from "../runtime/entrypoint.js";
5
+ import { ensureBaselineWasmTier } from "../runtime/wasm-tier.js";
6
+ import { cyclesCommand } from "./commands/cycles.js";
7
+ import { filesCommand } from "./commands/files.js";
8
+ import { affectedCommand, impactCommand } from "./commands/impact.js";
9
+ import { indexCommand, initCommand, uninitCommand } from "./commands/lifecycle.js";
10
+ import { calleesCommand, callersCommand, exploreCommand, handlersCommand, implementationsCommand, importersCommand, importsCommand, interfacesCommand, nodeCommand, overriddenByCommand, overridesCommand, referrersCommand, returnsCommand, routesCommand, skeletonCommand, typeUsersCommand, typesUsedCommand, } from "./commands/query.js";
11
+ import { searchCodeCommand, searchCommand } from "./commands/search.js";
12
+ import { statusCommand } from "./commands/status.js";
13
+ import { syncCommand } from "./commands/sync.js";
14
+ function usage(commands) {
15
+ const lines = ["Usage: ama [--json] <command> [args]", "", "Commands:"];
16
+ // The MCP server is the primary way agents use Ama; the rest are one-shot CLI queries.
17
+ lines.push(` ${"mcp".padEnd(12)} serve the code-intelligence MCP server over stdio (for coding agents)`);
18
+ if (commands.length === 0) {
19
+ lines.push(" (none registered yet)");
20
+ }
21
+ else {
22
+ for (const command of commands)
23
+ lines.push(` ${command.name.padEnd(12)} ${command.summary}`);
24
+ }
25
+ return lines.join("\n");
26
+ }
27
+ /**
28
+ * Parse argv and dispatch to a command, returning a process exit code. `out`/`err`
29
+ * are injectable so the framework is unit-testable without touching real streams.
30
+ * Unlike the MCP server, the CLI *owns* stdout, so writing results there is fine.
31
+ */
32
+ export async function run(argv, commands, out = (line) => process.stdout.write(`${line}\n`), err = (line) => process.stderr.write(`${line}\n`)) {
33
+ const json = argv.includes("--json");
34
+ const positional = argv.filter((arg) => arg !== "--json");
35
+ const name = positional[0];
36
+ if (name === undefined || name === "--help" || name === "-h") {
37
+ out(usage(commands));
38
+ return 0;
39
+ }
40
+ if (name === "--version" || name === "-v") {
41
+ out(serverStamp.version);
42
+ return 0;
43
+ }
44
+ const command = commands.find((c) => c.name === name);
45
+ if (!command) {
46
+ err(`Unknown command: ${name}`);
47
+ err(usage(commands));
48
+ return 1;
49
+ }
50
+ const rest = positional.slice(1);
51
+ // `ama <command> --help` shows the command's own help (and never reaches its
52
+ // run(), so it can't be misread as an argument), before dispatching.
53
+ if (rest.includes("--help") || rest.includes("-h")) {
54
+ out(`ama ${command.name} — ${command.summary}`);
55
+ if (command.usage)
56
+ out(command.usage);
57
+ return 0;
58
+ }
59
+ return command.run(rest, { json, write: out, error: err, stdin: readPipedStdin });
60
+ }
61
+ /** Read all of piped stdin synchronously; "" when stdin is a TTY (no pipe) so an
62
+ * interactive `ama affected` doesn't block waiting for input. (ama-dx1) */
63
+ function readPipedStdin() {
64
+ if (process.stdin.isTTY)
65
+ return "";
66
+ try {
67
+ return fs.readFileSync(0, "utf8");
68
+ }
69
+ catch {
70
+ return "";
71
+ }
72
+ }
73
+ /** Registered commands. More domain commands (search/sync/…) are added here
74
+ * as the CLI epic progresses (ama-5gs.4+). */
75
+ export const COMMANDS = [
76
+ affectedCommand,
77
+ calleesCommand,
78
+ callersCommand,
79
+ cyclesCommand,
80
+ exploreCommand,
81
+ filesCommand,
82
+ handlersCommand,
83
+ impactCommand,
84
+ implementationsCommand,
85
+ importersCommand,
86
+ importsCommand,
87
+ indexCommand,
88
+ initCommand,
89
+ interfacesCommand,
90
+ nodeCommand,
91
+ overriddenByCommand,
92
+ overridesCommand,
93
+ referrersCommand,
94
+ returnsCommand,
95
+ routesCommand,
96
+ searchCodeCommand,
97
+ searchCommand,
98
+ skeletonCommand,
99
+ statusCommand,
100
+ syncCommand,
101
+ typeUsersCommand,
102
+ typesUsedCommand,
103
+ uninitCommand,
104
+ ];
105
+ export async function main() {
106
+ const argv = process.argv.slice(2);
107
+ // `ama mcp` serves the code-intelligence MCP protocol over stdio — the entry coding
108
+ // agents spawn for a local server. WASM is already pinned by the entry guard; the stdio
109
+ // server owns the process lifecycle (it stays alive on the transport until the client
110
+ // disconnects), so unlike a query command it must not `process.exit`.
111
+ if (argv[0] === "mcp") {
112
+ const { main: serveMcp } = await import("../mcp/server.js");
113
+ await serveMcp();
114
+ return;
115
+ }
116
+ process.exit(await run(argv, COMMANDS));
117
+ }
118
+ if (isEntrypoint(import.meta.url)) {
119
+ // Pin grammar WASM to the baseline compiler before any command can load it, or
120
+ // an indexing command OOMs (ama-rgx). Re-execs once; the supervisor skips main.
121
+ if (!ensureBaselineWasmTier()) {
122
+ main().catch((error) => {
123
+ console.error(error);
124
+ process.exit(1);
125
+ });
126
+ }
127
+ }
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Where a project's persisted index lives by default, mirroring `serve:dev`:
3
+ * the `AMA_DB` env var wins, else `<root>/.ama/index.db`. Shared by every CLI
4
+ * command that opens or builds the index.
5
+ */
6
+ export declare function dbPathFor(root: string): string;
7
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/cli/paths.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,10 @@
1
+ import * as path from "node:path";
2
+ /**
3
+ * Where a project's persisted index lives by default, mirroring `serve:dev`:
4
+ * the `AMA_DB` env var wins, else `<root>/.ama/index.db`. Shared by every CLI
5
+ * command that opens or builds the index.
6
+ */
7
+ export function dbPathFor(root) {
8
+ return process.env.AMA_DB ?? path.join(path.resolve(root), ".ama", "index.db");
9
+ }
10
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/cli/paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { QueryService } from "../query/service.js";
2
+ /**
3
+ * Open the persisted index read-only, run `fn` against a {@link QueryService},
4
+ * and close. Returns `undefined` when there is no usable index (callers map that
5
+ * to "run `ama index`"). The single open/close path shared by the read-query
6
+ * commands — `Indexer.open` does not fall back to a full build on a miss.
7
+ *
8
+ * Note the `undefined` here means "no index", which can collide with a query
9
+ * that itself returns `undefined` (e.g. `node` on a missing symbol). Wrap such
10
+ * results in an object so the two cases stay distinguishable.
11
+ */
12
+ export declare function withQuery<T>(root: string, fn: (query: QueryService) => T): Promise<T | undefined>;
13
+ //# sourceMappingURL=query-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-runner.d.ts","sourceRoot":"","sources":["../../src/cli/query-runner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,CAAC,GAC7B,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAYxB"}
@@ -0,0 +1,33 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { createDefaultIndexer } from "../indexer/indexer.js";
4
+ import { QueryService } from "../query/service.js";
5
+ import { SqliteStore } from "../store/sqlite.js";
6
+ import { dbPathFor } from "./paths.js";
7
+ /**
8
+ * Open the persisted index read-only, run `fn` against a {@link QueryService},
9
+ * and close. Returns `undefined` when there is no usable index (callers map that
10
+ * to "run `ama index`"). The single open/close path shared by the read-query
11
+ * commands — `Indexer.open` does not fall back to a full build on a miss.
12
+ *
13
+ * Note the `undefined` here means "no index", which can collide with a query
14
+ * that itself returns `undefined` (e.g. `node` on a missing symbol). Wrap such
15
+ * results in an object so the two cases stay distinguishable.
16
+ */
17
+ export async function withQuery(root, fn) {
18
+ const dbPath = dbPathFor(root);
19
+ if (!fs.existsSync(dbPath))
20
+ return undefined;
21
+ const abs = path.resolve(root);
22
+ const indexer = createDefaultIndexer(() => new SqliteStore(dbPath));
23
+ const opened = await indexer.open(abs);
24
+ if (!opened)
25
+ return undefined;
26
+ try {
27
+ return fn(new QueryService(opened.store, abs));
28
+ }
29
+ finally {
30
+ opened.store.close();
31
+ }
32
+ }
33
+ //# sourceMappingURL=query-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-runner.js","sourceRoot":"","sources":["../../src/cli/query-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,EAA8B;IAE9B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { GraphEdge, GraphNode } from "./types.js";
2
+ /**
3
+ * Derive the dispatch edges of a graph: `Overrides` edges (a subtype method
4
+ * overriding/implementing a supertype method of the same name) and the fan-out of
5
+ * interface/superclass method calls to each subtype's implementation. Both are
6
+ * whole-graph inferences over `Implements`/`Inherits`/`Defines`/`Calls` edges, so
7
+ * they can only be computed with the *full* node/edge set in view — which is why
8
+ * a single-file reindex can't reproduce them and the indexer re-derives them over
9
+ * the whole store instead (ama-tr1). Pure: returns the derived edges (tagged
10
+ * `provenance: "dispatch"`) rather than mutating its input, so the same function
11
+ * serves the per-batch analyze() and the store-level re-derivation.
12
+ *
13
+ * Only the input `edges` are fanned (never the freshly-derived ones), so a
14
+ * fan-out never cascades. Language-agnostic — it reads node/edge *kinds* only.
15
+ */
16
+ export declare function deriveDispatchEdges(nodes: GraphNode[], edges: GraphEdge[]): GraphEdge[];
17
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/graph/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CA6DvF"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Derive the dispatch edges of a graph: `Overrides` edges (a subtype method
3
+ * overriding/implementing a supertype method of the same name) and the fan-out of
4
+ * interface/superclass method calls to each subtype's implementation. Both are
5
+ * whole-graph inferences over `Implements`/`Inherits`/`Defines`/`Calls` edges, so
6
+ * they can only be computed with the *full* node/edge set in view — which is why
7
+ * a single-file reindex can't reproduce them and the indexer re-derives them over
8
+ * the whole store instead (ama-tr1). Pure: returns the derived edges (tagged
9
+ * `provenance: "dispatch"`) rather than mutating its input, so the same function
10
+ * serves the per-batch analyze() and the store-level re-derivation.
11
+ *
12
+ * Only the input `edges` are fanned (never the freshly-derived ones), so a
13
+ * fan-out never cascades. Language-agnostic — it reads node/edge *kinds* only.
14
+ */
15
+ export function deriveDispatchEdges(nodes, edges) {
16
+ const byId = new Map(nodes.map((n) => [n.id, n]));
17
+ const definerOf = new Map(); // member id -> container id
18
+ const subtypes = new Map(); // supertype id -> implementing/extending subtype ids
19
+ const methodsByContainer = new Map(); // container -> name -> method id
20
+ for (const edge of edges) {
21
+ if (edge.kind === "Defines") {
22
+ definerOf.set(edge.to, edge.from);
23
+ const member = byId.get(edge.to);
24
+ if (member?.kind === "Method") {
25
+ const byName = methodsByContainer.get(edge.from) ?? new Map();
26
+ byName.set(member.name, edge.to);
27
+ methodsByContainer.set(edge.from, byName);
28
+ }
29
+ }
30
+ else if (edge.kind === "Implements" || edge.kind === "Inherits") {
31
+ const list = subtypes.get(edge.to) ?? [];
32
+ list.push(edge.from);
33
+ subtypes.set(edge.to, list);
34
+ }
35
+ }
36
+ const derived = [];
37
+ // Overrides: a subtype method of the same name as a supertype method
38
+ // overrides/implements it. Independent of any call. (ama-hft.11)
39
+ for (const [superId, subIds] of subtypes) {
40
+ const superMethods = methodsByContainer.get(superId);
41
+ if (!superMethods)
42
+ continue;
43
+ for (const subId of subIds) {
44
+ const subMethods = methodsByContainer.get(subId);
45
+ if (!subMethods)
46
+ continue;
47
+ for (const [name, subMethodId] of subMethods) {
48
+ const superMethodId = superMethods.get(name);
49
+ if (superMethodId && superMethodId !== subMethodId) {
50
+ derived.push({
51
+ from: subMethodId,
52
+ to: superMethodId,
53
+ kind: "Overrides",
54
+ provenance: "dispatch",
55
+ });
56
+ }
57
+ }
58
+ }
59
+ }
60
+ // Fan-out: a call to a super/interface method may reach each subtype's override.
61
+ for (const edge of edges) {
62
+ if (edge.kind !== "Calls")
63
+ continue;
64
+ const target = byId.get(edge.to);
65
+ if (target?.kind !== "Method")
66
+ continue;
67
+ const container = definerOf.get(edge.to);
68
+ if (!container)
69
+ continue;
70
+ const containerKind = byId.get(container)?.kind;
71
+ if (containerKind !== "Interface" && containerKind !== "Class")
72
+ continue;
73
+ for (const subId of subtypes.get(container) ?? []) {
74
+ const override = methodsByContainer.get(subId)?.get(target.name);
75
+ if (override && override !== edge.to) {
76
+ derived.push({ from: edge.from, to: override, kind: "Calls", provenance: "dispatch" });
77
+ }
78
+ }
79
+ }
80
+ return derived;
81
+ }
82
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/graph/dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Stable, location-independent identifiers for graph symbols.
3
+ *
4
+ * An id is derived from *where a symbol lives in the module namespace* (file +
5
+ * dotted qualified name), never from its byte offset or line. Moving a function
6
+ * within its file therefore keeps its id — which is what lets the graph survive
7
+ * incremental edits without re-linking every edge.
8
+ */
9
+ export interface SymbolLocation {
10
+ /** Repo-relative file path, e.g. "src/a.ts". */
11
+ file: string;
12
+ /** Dotted qualified name within the file, e.g. "Cls.method" or "foo". */
13
+ qualifiedName: string;
14
+ }
15
+ /** Stable id for a symbol node (function, method, class, …). */
16
+ export declare function symbolId(loc: SymbolLocation): string;
17
+ /** Stable id for a File node — the repo-relative path itself. */
18
+ export declare function fileId(file: string): string;
19
+ //# sourceMappingURL=id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/graph/id.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAEpD;AAED,iEAAiE;AACjE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Stable, location-independent identifiers for graph symbols.
3
+ *
4
+ * An id is derived from *where a symbol lives in the module namespace* (file +
5
+ * dotted qualified name), never from its byte offset or line. Moving a function
6
+ * within its file therefore keeps its id — which is what lets the graph survive
7
+ * incremental edits without re-linking every edge.
8
+ */
9
+ /** Stable id for a symbol node (function, method, class, …). */
10
+ export function symbolId(loc) {
11
+ return `${loc.file}#${loc.qualifiedName}`;
12
+ }
13
+ /** Stable id for a File node — the repo-relative path itself. */
14
+ export function fileId(file) {
15
+ return file;
16
+ }
17
+ //# sourceMappingURL=id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/graph/id.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,gEAAgE;AAChE,MAAM,UAAU,QAAQ,CAAC,GAAmB;IAC1C,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;AAC5C,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type { NodeKind, EdgeKind, EdgeProvenance, Tier, SourceRange, GraphNode, GraphEdge, } from "./types.js";
2
+ export { NODE_KINDS, EDGE_KINDS } from "./types.js";
3
+ export { deriveDispatchEdges } from "./dispatch.js";
4
+ export { symbolId, fileId } from "./id.js";
5
+ export type { SymbolLocation } from "./id.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,IAAI,EACJ,WAAW,EACX,SAAS,EACT,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { NODE_KINDS, EDGE_KINDS } from "./types.js";
2
+ export { deriveDispatchEdges } from "./dispatch.js";
3
+ export { symbolId, fileId } from "./id.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Language-agnostic graph model: the vocabulary every analyzer emits and every
3
+ * query reads. Kept deliberately small for the MVP; new kinds are added as
4
+ * analyzers learn to resolve them.
5
+ */
6
+ /** The node kinds, as a runtime array — the single source of truth (e.g. for
7
+ * validating a `kind` filter). `NodeKind` is derived from it, so the two stay
8
+ * in sync. */
9
+ export declare const NODE_KINDS: readonly ["File", "Module", "Class", "Interface", "Enum", "TypeAlias", "Function", "Method", "Property", "Variable", "Route", "Component"];
10
+ export type NodeKind = (typeof NODE_KINDS)[number];
11
+ /** The edge kinds, as a runtime array — the single source of truth (e.g. for
12
+ * validating an edge over the wire). `EdgeKind` is derived from it, so the two stay
13
+ * in sync. Mirrors {@link NODE_KINDS}. */
14
+ export declare const EDGE_KINDS: readonly ["Defines", "Calls", "Instantiates", "Overrides", "Inherits", "Implements", "UsesType", "Returns", "Imports", "ImportsType", "References"];
15
+ export type EdgeKind = (typeof EDGE_KINDS)[number];
16
+ /** Which analysis tier produced a piece of data. */
17
+ export type Tier = "deep" | "baseline";
18
+ /** 1-based, inclusive source span — used for snippet extraction, never for ids. */
19
+ export interface SourceRange {
20
+ startLine: number;
21
+ endLine: number;
22
+ }
23
+ export interface GraphNode {
24
+ /** Stable, location-independent id (see {@link ./id.ts}). */
25
+ id: string;
26
+ kind: NodeKind;
27
+ /** Simple (unqualified) name, e.g. "method". */
28
+ name: string;
29
+ /** Repo-relative file the symbol lives in, e.g. "src/a.ts". */
30
+ file: string;
31
+ /** Dotted qualified name within the file, e.g. "Cls.method". */
32
+ qualifiedName: string;
33
+ /** Source span for snippet extraction; absent for synthetic nodes. */
34
+ range?: SourceRange;
35
+ /** Tier of the analyzer that produced this node. */
36
+ tier: Tier;
37
+ }
38
+ /**
39
+ * How an edge was derived. `resolved` (the default when absent) means a
40
+ * type-checker- or symbol-backed fact; `heuristic` means a pattern/string match
41
+ * that isn't checker-verified (route detection, callback-handler synthesis);
42
+ * `dispatch` means a whole-graph inference from interface/inheritance fan-out (an
43
+ * interface-method call reaching each implementation, and Overrides edges) — a
44
+ * "may-reach", not a proven direct call. Lets query results label edge trust — the
45
+ * node-level tier honesty rule, at edge level. `dispatch` also marks the edges the
46
+ * indexer re-derives after an incremental reindex (ama-tr1).
47
+ */
48
+ export type EdgeProvenance = "resolved" | "heuristic" | "dispatch";
49
+ export interface GraphEdge {
50
+ /** Source node id. */
51
+ from: string;
52
+ /** Target node id. */
53
+ to: string;
54
+ kind: EdgeKind;
55
+ /** How the edge was derived; absent ⇒ `resolved`. */
56
+ provenance?: EdgeProvenance;
57
+ /** Where the edge originates — a call/new site's 1-based line and column. With
58
+ * dedup on (from,to,kind), this is the first such site. Absent for edges with
59
+ * no single source point (Defines, Imports). (ama-hft.9) */
60
+ at?: {
61
+ line: number;
62
+ column: number;
63
+ };
64
+ /** Every call/construction site for this edge, when a caller invokes a target
65
+ * more than once (`sites[0] === at`). Absent for single-site edges. (ama-hft.10) */
66
+ sites?: {
67
+ line: number;
68
+ column: number;
69
+ }[];
70
+ }
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;cAEc;AACd,eAAO,MAAM,UAAU,4IAgBb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD;;0CAE0C;AAC1C,eAAO,MAAM,UAAU,qJAsBb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,oDAAoD;AACpD,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;AAEvC,mFAAmF;AACnF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,oDAAoD;IACpD,IAAI,EAAE,IAAI,CAAC;CACZ;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAC;AAEnE,MAAM,WAAW,SAAS;IACxB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC;IACf,qDAAqD;IACrD,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B;;iEAE6D;IAC7D,EAAE,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC;yFACqF;IACrF,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5C"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Language-agnostic graph model: the vocabulary every analyzer emits and every
3
+ * query reads. Kept deliberately small for the MVP; new kinds are added as
4
+ * analyzers learn to resolve them.
5
+ */
6
+ /** The node kinds, as a runtime array — the single source of truth (e.g. for
7
+ * validating a `kind` filter). `NodeKind` is derived from it, so the two stay
8
+ * in sync. */
9
+ export const NODE_KINDS = [
10
+ "File",
11
+ "Module",
12
+ "Class",
13
+ "Interface",
14
+ "Enum",
15
+ "TypeAlias",
16
+ "Function",
17
+ "Method",
18
+ "Property",
19
+ /** A module-level variable/constant binding, e.g. `const MAX_RETRIES = 3`. */
20
+ "Variable",
21
+ /** A framework route, e.g. "GET /users" — its handler is found via a References edge. */
22
+ "Route",
23
+ /** A UI component — a JSX-returning function (React) or a Vue `defineComponent`. */
24
+ "Component",
25
+ ];
26
+ /** The edge kinds, as a runtime array — the single source of truth (e.g. for
27
+ * validating an edge over the wire). `EdgeKind` is derived from it, so the two stay
28
+ * in sync. Mirrors {@link NODE_KINDS}. */
29
+ export const EDGE_KINDS = [
30
+ "Defines",
31
+ "Calls",
32
+ /** A `new X()` construction — distinct from a plain Calls so "who instantiates
33
+ * X" is separable from "who calls X". (ama-hft.11) */
34
+ "Instantiates",
35
+ /** A subtype method that overrides/implements a supertype method of the same
36
+ * name (subtype.method → supertype.method). (ama-hft.11) */
37
+ "Overrides",
38
+ "Inherits",
39
+ "Implements",
40
+ "UsesType",
41
+ /** A function/method → its declared return type, distinct from the param/property
42
+ * type usages of UsesType. (ama-37c) */
43
+ "Returns",
44
+ "Imports",
45
+ /** A type-only import (`import type` / `import { type X }`) — a compile-time
46
+ * dependency erased at runtime. Counted as an import for dependents/affected,
47
+ * but excluded from runtime analyses like circular_imports. */
48
+ "ImportsType",
49
+ /** A route (or other dispatch) refers to the symbol that handles it. */
50
+ "References",
51
+ ];
52
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;cAEc;AACd,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM;IACN,QAAQ;IACR,OAAO;IACP,WAAW;IACX,MAAM;IACN,WAAW;IACX,UAAU;IACV,QAAQ;IACR,UAAU;IACV,8EAA8E;IAC9E,UAAU;IACV,yFAAyF;IACzF,OAAO;IACP,oFAAoF;IACpF,WAAW;CACH,CAAC;AAIX;;0CAE0C;AAC1C,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,SAAS;IACT,OAAO;IACP;2DACuD;IACvD,cAAc;IACd;iEAC6D;IAC7D,WAAW;IACX,UAAU;IACV,YAAY;IACZ,UAAU;IACV;6CACyC;IACzC,SAAS;IACT,SAAS;IACT;;oEAEgE;IAChE,aAAa;IACb,wEAAwE;IACxE,YAAY;CACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ /** Runs a sync for one changed path. */
2
+ export type SyncFn = (rel: string) => Promise<void>;
3
+ /**
4
+ * Collapses bursts of file-change events into batched syncs. Each `notify(rel)`
5
+ * adds the path to a pending set and (re)arms a trailing timer; when the window
6
+ * elapses quietly, every pending path is synced once. A single flush runs at a
7
+ * time — paths that arrive while one is in progress are batched into the next —
8
+ * and a failing sync is isolated so the rest of the batch still runs.
9
+ *
10
+ * The debounce window collapses the several `fs.watch` events a single save can
11
+ * emit into one re-index. Drives ama-gd5.3's auto-sync; reusable anywhere a
12
+ * stream of keyed events should settle before acting.
13
+ */
14
+ export declare class Debouncer {
15
+ private readonly sync;
16
+ private readonly windowMs;
17
+ private readonly pending;
18
+ private timer?;
19
+ private flushing;
20
+ constructor(sync: SyncFn, windowMs: number);
21
+ /** Record a changed path and (re)start the trailing window. */
22
+ notify(rel: string): void;
23
+ /** Pending paths not yet synced — for surfacing sync status (ama-gd5.6). */
24
+ get pendingCount(): number;
25
+ /** The actual queued paths — for naming stale files in a banner (ama-gd5.5). */
26
+ pendingPaths(): string[];
27
+ /** Cancel the pending window. Does not flush — stopping accepts staleness. */
28
+ stop(): void;
29
+ private arm;
30
+ private flush;
31
+ }
32
+ //# sourceMappingURL=debouncer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debouncer.d.ts","sourceRoot":"","sources":["../../src/indexer/debouncer.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,qBAAa,SAAS;IAMlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAN3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAS;gBAGN,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM;IAGnC,+DAA+D;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKzB,4EAA4E;IAC5E,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,gFAAgF;IAChF,YAAY,IAAI,MAAM,EAAE;IAIxB,8EAA8E;IAC9E,IAAI,IAAI,IAAI;IAOZ,OAAO,CAAC,GAAG;YAQG,KAAK;CAyBpB"}