@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,18 @@
1
+ import * as http from "node:http";
2
+ import { AmaSession } from "./session.js";
3
+ /**
4
+ * A standalone Node HTTP server that serves Ama's MCP tools over the Streamable
5
+ * HTTP transport — the same tools as the stdio server, reachable by URL.
6
+ *
7
+ * One {@link AmaSession} (the index) is shared across every client session, so
8
+ * it outlives a client disconnect/reconnect within this process. That decouples
9
+ * the index's lifetime from the client connection: a `tsx watch` restart of the
10
+ * *process* is the only thing that drops it, and connect-time catch-up (plus a
11
+ * future persistent store) makes that cheap. Each MCP session gets its own
12
+ * transport + {@link createMcpServer} wrapper over the shared session.
13
+ */
14
+ export declare function createHttpServer(session?: AmaSession): http.Server;
15
+ /** Entry point: serve MCP over Streamable HTTP. Logs to stderr (stdout is free
16
+ * here, unlike stdio, but stderr keeps logging uniform across transports). */
17
+ export declare function main(): Promise<void>;
18
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAWlC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,UAA6B,GAAG,IAAI,CAAC,MAAM,CAsDpF;AA8BD;8EAC8E;AAC9E,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgC1C"}
@@ -0,0 +1,145 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import * as fs from "node:fs";
3
+ import * as http from "node:http";
4
+ import * as path from "node:path";
5
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
6
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
7
+ import { createDefaultIndexer } from "../indexer/indexer.js";
8
+ import { isEntrypoint } from "../runtime/entrypoint.js";
9
+ import { ensureBaselineWasmTier } from "../runtime/wasm-tier.js";
10
+ import { InMemoryStore } from "../store/memory.js";
11
+ import { SqliteStore } from "../store/sqlite.js";
12
+ import { createServer as createMcpServer } from "./server.js";
13
+ import { AmaSession } from "./session.js";
14
+ const MCP_PATH = "/mcp";
15
+ /**
16
+ * A standalone Node HTTP server that serves Ama's MCP tools over the Streamable
17
+ * HTTP transport — the same tools as the stdio server, reachable by URL.
18
+ *
19
+ * One {@link AmaSession} (the index) is shared across every client session, so
20
+ * it outlives a client disconnect/reconnect within this process. That decouples
21
+ * the index's lifetime from the client connection: a `tsx watch` restart of the
22
+ * *process* is the only thing that drops it, and connect-time catch-up (plus a
23
+ * future persistent store) makes that cheap. Each MCP session gets its own
24
+ * transport + {@link createMcpServer} wrapper over the shared session.
25
+ */
26
+ export function createHttpServer(session = new AmaSession()) {
27
+ const transports = new Map();
28
+ return http.createServer((req, res) => void handle(req, res));
29
+ async function handle(req, res) {
30
+ try {
31
+ const { pathname } = new URL(req.url ?? "/", "http://localhost");
32
+ if (pathname !== MCP_PATH) {
33
+ res.writeHead(404).end();
34
+ return;
35
+ }
36
+ const header = req.headers["mcp-session-id"];
37
+ const sessionId = Array.isArray(header) ? header[0] : header;
38
+ if (req.method === "POST") {
39
+ const body = await readJson(req);
40
+ let transport = sessionId ? transports.get(sessionId) : undefined;
41
+ if (!transport) {
42
+ if (!isInitializeRequest(body)) {
43
+ // The session id is unknown (e.g. wiped by a `tsx watch` restart).
44
+ // Per the Streamable HTTP spec a 404 tells the client to drop the
45
+ // dead session and re-initialize — the hook for auto-reconnect.
46
+ res.writeHead(404, { "content-type": "application/json" }).end(JSON.stringify({
47
+ jsonrpc: "2.0",
48
+ error: { code: -32001, message: "Session not found — reinitialize." },
49
+ id: null,
50
+ }));
51
+ return;
52
+ }
53
+ transport = newSession(session, transports);
54
+ }
55
+ await transport.handleRequest(req, res, body);
56
+ return;
57
+ }
58
+ // GET (server SSE stream) and DELETE (session teardown) need an existing session.
59
+ if (req.method === "GET" || req.method === "DELETE") {
60
+ const transport = sessionId ? transports.get(sessionId) : undefined;
61
+ if (!transport) {
62
+ // 404 (not 400) so a client whose session was wiped re-initializes.
63
+ res.writeHead(404).end();
64
+ return;
65
+ }
66
+ await transport.handleRequest(req, res);
67
+ return;
68
+ }
69
+ res.writeHead(405).end();
70
+ }
71
+ catch (err) {
72
+ console.error("[ama] HTTP request failed:", err);
73
+ if (!res.headersSent)
74
+ res.writeHead(500).end();
75
+ }
76
+ }
77
+ }
78
+ /** Spin up a transport + MCP server for a new client session over `session`. */
79
+ function newSession(session, transports) {
80
+ // Annotated so the callbacks can reference `transport` within its own
81
+ // initializer; block bodies so they return void, not the Map.
82
+ const transport = new StreamableHTTPServerTransport({
83
+ sessionIdGenerator: () => randomUUID(),
84
+ enableJsonResponse: true,
85
+ onsessioninitialized: (id) => {
86
+ transports.set(id, transport);
87
+ },
88
+ onsessionclosed: (id) => {
89
+ transports.delete(id);
90
+ },
91
+ });
92
+ void createMcpServer(session).connect(transport);
93
+ return transport;
94
+ }
95
+ async function readJson(req) {
96
+ const chunks = [];
97
+ for await (const chunk of req)
98
+ chunks.push(chunk);
99
+ const raw = Buffer.concat(chunks).toString("utf8");
100
+ return raw ? JSON.parse(raw) : undefined;
101
+ }
102
+ /** Entry point: serve MCP over Streamable HTTP. Logs to stderr (stdout is free
103
+ * here, unlike stdio, but stderr keeps logging uniform across transports). */
104
+ export async function main() {
105
+ const port = Number(process.env.AMA_HTTP_PORT ?? 7077);
106
+ // With AMA_DB set, persist to (and reopen from) a file-backed store; with
107
+ // AMA_ROOT too, reopen that project's index at startup so a restart skips the
108
+ // full re-index and connect-time catch-up reconciles any drift.
109
+ const dbPath = process.env.AMA_DB;
110
+ const root = process.env.AMA_ROOT;
111
+ // Persist exactly one project to AMA_DB — the configured AMA_ROOT, or the first one
112
+ // indexed — and give every *other* project its own in-memory store, so a multi-project
113
+ // session never aliases several projects onto one shared db. (ama-mnj)
114
+ let createStore;
115
+ if (dbPath) {
116
+ fs.mkdirSync(path.dirname(path.resolve(dbPath)), { recursive: true });
117
+ const db = dbPath;
118
+ let persisted = root ? path.resolve(root) : undefined;
119
+ createStore = (projectRoot) => {
120
+ persisted ??= projectRoot; // the first project indexed claims the persistent db
121
+ return projectRoot === persisted ? new SqliteStore(db) : new InMemoryStore();
122
+ };
123
+ }
124
+ const session = createStore
125
+ ? new AmaSession(createDefaultIndexer(createStore))
126
+ : new AmaSession();
127
+ if (dbPath && root) {
128
+ const stats = await session.open(root);
129
+ console.error(`ama: index ready — ${stats.nodeCount} nodes / ${stats.fileCount} files (${root})`);
130
+ }
131
+ const server = createHttpServer(session);
132
+ await new Promise((resolve) => server.listen(port, resolve));
133
+ console.error(`ama MCP server (HTTP) on http://localhost:${port}${MCP_PATH}`);
134
+ }
135
+ if (isEntrypoint(import.meta.url)) {
136
+ // Pin grammar WASM to the baseline compiler before anything loads it, or the
137
+ // long-running index OOMs (ama-rgx). Re-execs once; the supervisor skips main.
138
+ if (!ensureBaselineWasmTier()) {
139
+ main().catch((error) => {
140
+ console.error(error);
141
+ process.exit(1);
142
+ });
143
+ }
144
+ }
145
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { AmaSession } from "./session.js";
3
+ /** Slice search results to `limit` and, when the search returned more than that
4
+ * (the handler requests `limit + 1`), append an advisory so a capped list isn't
5
+ * mistaken for the whole answer — search_symbol/search_code otherwise truncate
6
+ * silently. Composes with an existing hint (e.g. low-confidence). (ama-b4q) */
7
+ export declare function capped<T>(results: T[], limit: number, baseHint?: string): {
8
+ shown: T[];
9
+ hint?: string;
10
+ };
11
+ /** A one-glance summary of a tool result — list length, index counts, etc.
12
+ * Exported for unit testing of its banner/hint handling. */
13
+ export declare function resultHint(result: unknown): string;
14
+ /**
15
+ * Build the MCP server exposing Ama's tools over one {@link AmaSession}. Pure
16
+ * construction — no transport — so it can be driven by an in-memory client in
17
+ * tests or by stdio in production.
18
+ */
19
+ export declare function createServer(session?: AmaSession): McpServer;
20
+ /** Entry point: serve over stdio. stdout carries JSON-RPC only — log to stderr. */
21
+ export declare function main(): Promise<void>;
22
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAyB1C;;;gFAGgF;AAChF,wBAAgB,MAAM,CAAC,CAAC,EACtB,OAAO,EAAE,CAAC,EAAE,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ/B;AAkCD;6DAC6D;AAC7D,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAmClD;AAoBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,UAA6B,GAAG,SAAS,CAyiB9E;AAED,mFAAmF;AACnF,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1C"}
@@ -0,0 +1,401 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { z } from "zod";
4
+ import { NODE_KINDS } from "../graph/index.js";
5
+ import { DEFAULT_SEARCH_LIMIT } from "../query/service.js";
6
+ import { isEntrypoint } from "../runtime/entrypoint.js";
7
+ import { ensureBaselineWasmTier } from "../runtime/wasm-tier.js";
8
+ import { serverStamp } from "./build-info.js";
9
+ import { AmaSession } from "./session.js";
10
+ /** JSON tool result helper. `value ?? null` so an `undefined` result (e.g. a
11
+ * snippet/node for an unresolved symbol) serializes to `"null"` rather than the
12
+ * JS value `undefined`, which would make the MCP content invalid. */
13
+ function json(value) {
14
+ return { content: [{ type: "text", text: JSON.stringify(value ?? null, null, 2) }] };
15
+ }
16
+ /**
17
+ * A query result, with a staleness warning prepended when the auto-syncer has
18
+ * edits still in its debounce window — so a caller sees the caveat before the
19
+ * (possibly stale) data. No banner ⇒ identical to {@link json}.
20
+ */
21
+ function reply(session, value, hint) {
22
+ const banner = session.stalenessBanner();
23
+ const text = (t) => ({ type: "text", text: t });
24
+ const content = [text(JSON.stringify(value ?? null, null, 2))];
25
+ // Banner first (most urgent: results may be stale); hint last (advisory). The
26
+ // data block stays at a fixed position so a consumer reading the JSON is robust.
27
+ if (banner)
28
+ content.unshift(text(banner));
29
+ if (hint)
30
+ content.push(text(hint));
31
+ return { content };
32
+ }
33
+ /** Slice search results to `limit` and, when the search returned more than that
34
+ * (the handler requests `limit + 1`), append an advisory so a capped list isn't
35
+ * mistaken for the whole answer — search_symbol/search_code otherwise truncate
36
+ * silently. Composes with an existing hint (e.g. low-confidence). (ama-b4q) */
37
+ export function capped(results, limit, baseHint) {
38
+ const truncated = results.length > limit;
39
+ const shown = truncated ? results.slice(0, limit) : results;
40
+ const truncHint = truncated
41
+ ? `⚠️ Ama: showing the first ${limit} matches — more exist. Refine with a more specific query or path:/kind:/lang:/name: filters, or raise \`limit\`.`
42
+ : undefined;
43
+ const hint = [baseHint, truncHint].filter(Boolean).join("\n") || undefined;
44
+ return { shown, hint };
45
+ }
46
+ /** Optional `projectPath` for the cross-project query tools: target another indexed
47
+ * project by its root (or a path inside it); omit for the primary. (ama-ont) */
48
+ const projectPathSchema = z
49
+ .string()
50
+ .optional()
51
+ .describe("Query another indexed project by its root path (or a path inside it); omit for the " +
52
+ "primary (last-indexed) project. index_status lists the indexed projects.");
53
+ /**
54
+ * Wrap a read handler so it first runs a connect-time catch-up (reconciling any
55
+ * edits made while disconnected) and then replies with a staleness banner if
56
+ * the auto-syncer is mid-window. Keeps that policy in one place across the
57
+ * query tools.
58
+ */
59
+ function queryTool(session, run) {
60
+ return async (args) => {
61
+ await session.catchUpIfNeeded();
62
+ return reply(session, run(args));
63
+ };
64
+ }
65
+ /** Compact `key=value` rendering of a tool's arguments for a log line. */
66
+ function argsHint(args) {
67
+ if (!args || typeof args !== "object")
68
+ return "";
69
+ const pairs = Object.entries(args)
70
+ .filter(([, v]) => v !== undefined)
71
+ .map(([k, v]) => `${k}=${String(v)}`);
72
+ return pairs.length ? ` ${pairs.join(", ")}` : "";
73
+ }
74
+ /** A one-glance summary of a tool result — list length, index counts, etc.
75
+ * Exported for unit testing of its banner/hint handling. */
76
+ export function resultHint(result) {
77
+ const content = result?.content;
78
+ if (!content?.length)
79
+ return "ok";
80
+ // reply() prepends a staleness banner and/or appends an advisory hint around
81
+ // the JSON data block. Locate the data by which block parses as JSON, and read
82
+ // staleness from a banner *before* it (dataIdx > 0) — not the block count,
83
+ // which a trailing low-confidence hint also inflates. (ama-zk6)
84
+ let data;
85
+ let dataIdx = -1;
86
+ for (let i = 0; i < content.length; i++) {
87
+ try {
88
+ data = JSON.parse(content[i]?.text ?? "");
89
+ dataIdx = i;
90
+ break;
91
+ }
92
+ catch { }
93
+ }
94
+ const stale = dataIdx > 0 ? "stale, " : "";
95
+ if (dataIdx === -1) {
96
+ return content[0]?.text?.slice(0, 60) || "none";
97
+ }
98
+ if (Array.isArray(data)) {
99
+ return `${stale}${data.length} result${data.length === 1 ? "" : "s"}`;
100
+ }
101
+ if (data && typeof data === "object") {
102
+ const o = data;
103
+ if ("nodeCount" in o)
104
+ return `${stale}${o.nodeCount} nodes, ${o.edgeCount} edges`;
105
+ if ("changed" in o) {
106
+ const changed = o.changed?.length ?? 0;
107
+ const removed = o.removed?.length ?? 0;
108
+ return `${stale}${changed} changed, ${removed} removed`;
109
+ }
110
+ if ("startLine" in o)
111
+ return `${stale}${o.file}:${o.startLine}-${o.endLine}`;
112
+ return `${stale}ok`;
113
+ }
114
+ return `${stale}none`;
115
+ }
116
+ /**
117
+ * Wrap a tool handler so each invocation prints one stderr line when
118
+ * AMA_LOG_TOOLS is set — the tool name, its arguments, and a short summary of
119
+ * the reply — purely so the dev loop can see a tool was really called. Logging
120
+ * goes to stderr only, leaving the stdout JSON-RPC stream untouched; the
121
+ * `serve:dev` script turns it on. Reads the env per call so it can be toggled
122
+ * without rebuilding the wrapper.
123
+ */
124
+ function tap(name, run) {
125
+ return async (args) => {
126
+ const result = await run(args);
127
+ if (process.env.AMA_LOG_TOOLS) {
128
+ console.error(`[ama] ${name}${argsHint(args)} → ${resultHint(result)}`);
129
+ }
130
+ return result;
131
+ };
132
+ }
133
+ /**
134
+ * Build the MCP server exposing Ama's tools over one {@link AmaSession}. Pure
135
+ * construction — no transport — so it can be driven by an in-memory client in
136
+ * tests or by stdio in production.
137
+ */
138
+ export function createServer(session = new AmaSession()) {
139
+ const server = new McpServer({ name: "ama", version: serverStamp.version });
140
+ // Fires on each connection's initialize handshake — i.e. on reconnect. Arm a
141
+ // catch-up so the first query reconciles edits made while disconnected.
142
+ server.server.oninitialized = () => session.markForCatchUp();
143
+ server.registerTool("index_repository", {
144
+ description: "Build the code graph for a directory or project. Run this first.",
145
+ inputSchema: {
146
+ path: z.string().describe("Directory to index (absolute or relative)."),
147
+ },
148
+ }, tap("index_repository", async ({ path }) => json(await session.indexRepository(path))));
149
+ server.registerTool("index_status", {
150
+ description: "Whether anything is indexed, with node/edge counts, per-language coverage + tier, " +
151
+ "and how many edits are pending auto-sync.",
152
+ inputSchema: {},
153
+ }, tap("index_status", async () => {
154
+ await session.catchUpIfNeeded();
155
+ return json(session.indexStatus());
156
+ }));
157
+ server.registerTool("sync_index", {
158
+ description: "Reconcile files that changed on disk since indexing (a manual catch-up). " +
159
+ "Returns the repo-relative paths re-indexed and removed.",
160
+ inputSchema: {},
161
+ }, tap("sync_index", async () => json(await session.sync())));
162
+ server.registerTool("search_symbol", {
163
+ description: "Find symbols by name (case-insensitive substring). The query also accepts " +
164
+ "inline filters to scope a search: path:<file-substring>, kind:<NodeKind>, " +
165
+ "lang:<typescript|python|…>, name:<substring> (quote values with spaces). " +
166
+ "E.g. `handler path:src/api kind:Function` or, filters-only, `path:src/store kind:Class`.",
167
+ inputSchema: {
168
+ query: z
169
+ .string()
170
+ .describe("Name or partial name, optionally with path:/kind:/lang:/name: filters."),
171
+ limit: z.number().int().positive().optional().describe("Max results."),
172
+ kind: z.enum(NODE_KINDS).optional().describe("Restrict to a single node kind."),
173
+ projectPath: projectPathSchema,
174
+ },
175
+ }, tap("search_symbol", async ({ query, limit, kind, projectPath, }) => {
176
+ await session.catchUpIfNeeded();
177
+ const max = limit ?? DEFAULT_SEARCH_LIMIT;
178
+ const { results, lowConfidence } = session.searchSymbolWithConfidence(query, { limit: max + 1, kind }, projectPath);
179
+ const lowHint = lowConfidence
180
+ ? `⚠️ Ama: no exact or name-prefix match for "${query}" — these are loose substring hits, so they may not be what you meant. Double-check the name or refine the query.`
181
+ : undefined;
182
+ const { shown, hint } = capped(results, max, lowHint);
183
+ return reply(session, shown, hint);
184
+ }));
185
+ server.registerTool("find_callers", {
186
+ description: "Every place that calls a function or method — each result is " +
187
+ "{ symbol, at: { line, column } } so you see who calls it and where.",
188
+ inputSchema: {
189
+ symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
190
+ projectPath: projectPathSchema,
191
+ },
192
+ }, tap("find_callers", queryTool(session, ({ symbol, projectPath }) => session.findCallers(symbol, projectPath))));
193
+ server.registerTool("find_callees", {
194
+ description: "What a function or method calls — each result is { symbol, at: { line, column } }, " +
195
+ "the callee and the call site.",
196
+ inputSchema: {
197
+ symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
198
+ projectPath: projectPathSchema,
199
+ },
200
+ }, tap("find_callees", queryTool(session, ({ symbol, projectPath }) => session.findCallees(symbol, projectPath))));
201
+ server.registerTool("find_handlers", {
202
+ description: "The handler symbols a framework route maps to.",
203
+ inputSchema: {
204
+ route: z.string().describe('Route id or name, e.g. "GET /users".'),
205
+ projectPath: projectPathSchema,
206
+ },
207
+ }, tap("find_handlers", queryTool(session, ({ route, projectPath }) => session.findHandlers(route, projectPath))));
208
+ server.registerTool("find_routes", {
209
+ description: "Every framework route that maps to a symbol (handler).",
210
+ inputSchema: {
211
+ symbol: z.string().describe("Handler symbol id, simple name, or dotted qualified name."),
212
+ projectPath: projectPathSchema,
213
+ },
214
+ }, tap("find_routes", queryTool(session, ({ symbol, projectPath }) => session.findRoutes(symbol, projectPath))));
215
+ server.registerTool("find_overrides", {
216
+ description: "The supertype methods a method overrides or implements (method → the " +
217
+ "interface/base method of the same name).",
218
+ inputSchema: {
219
+ symbol: z.string().describe("Method id, simple name, or dotted qualified name."),
220
+ projectPath: projectPathSchema,
221
+ },
222
+ }, tap("find_overrides", queryTool(session, ({ symbol, projectPath }) => session.findOverrides(symbol, projectPath))));
223
+ server.registerTool("find_overridden_by", {
224
+ description: "The subtype methods that override a method — what breaks if you change this " +
225
+ "interface/base method.",
226
+ inputSchema: {
227
+ symbol: z.string().describe("Method id, simple name, or dotted qualified name."),
228
+ projectPath: projectPathSchema,
229
+ },
230
+ }, tap("find_overridden_by", queryTool(session, ({ symbol, projectPath }) => session.findOverriddenBy(symbol, projectPath))));
231
+ server.registerTool("find_referrers", {
232
+ description: "Everything that references a symbol via a References edge: who reads a module-level " +
233
+ "constant/variable, the routes that map to a handler, and other dispatch references. " +
234
+ "Use this for 'who uses X' when X isn't called (reads aren't calls, so find_callers " +
235
+ "won't see them).",
236
+ inputSchema: {
237
+ symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
238
+ projectPath: projectPathSchema,
239
+ },
240
+ }, tap("find_referrers", queryTool(session, ({ symbol, projectPath }) => session.findReferrers(symbol, projectPath))));
241
+ server.registerTool("find_implementations", {
242
+ description: "Every class that implements an interface.",
243
+ inputSchema: {
244
+ symbol: z.string().describe("Interface id, simple name, or dotted qualified name."),
245
+ projectPath: projectPathSchema,
246
+ },
247
+ }, tap("find_implementations", queryTool(session, ({ symbol, projectPath }) => session.findImplementations(symbol, projectPath))));
248
+ server.registerTool("find_interfaces", {
249
+ description: "The interfaces a class implements.",
250
+ inputSchema: {
251
+ symbol: z.string().describe("Class id, simple name, or dotted qualified name."),
252
+ projectPath: projectPathSchema,
253
+ },
254
+ }, tap("find_interfaces", queryTool(session, ({ symbol, projectPath }) => session.findInterfaces(symbol, projectPath))));
255
+ server.registerTool("find_importers", {
256
+ description: "Every file that imports (or re-exports) a symbol.",
257
+ inputSchema: {
258
+ symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
259
+ projectPath: projectPathSchema,
260
+ },
261
+ }, tap("find_importers", queryTool(session, ({ symbol, projectPath }) => session.findImporters(symbol, projectPath))));
262
+ server.registerTool("find_imports", {
263
+ description: "The symbols a file imports (or re-exports).",
264
+ inputSchema: {
265
+ file: z.string().describe("File node id (repo-relative path) or basename."),
266
+ projectPath: projectPathSchema,
267
+ },
268
+ }, tap("find_imports", queryTool(session, ({ file, projectPath }) => session.findImports(file, projectPath))));
269
+ server.registerTool("find_type_users", {
270
+ description: "Every symbol that uses a type in a parameter, return, or property.",
271
+ inputSchema: {
272
+ type: z.string().describe("Type id, simple name, or dotted qualified name."),
273
+ projectPath: projectPathSchema,
274
+ },
275
+ }, tap("find_type_users", queryTool(session, ({ type, projectPath }) => session.findTypeUsers(type, projectPath))));
276
+ server.registerTool("find_types_used", {
277
+ description: "The named types a symbol uses in its parameters, return, or properties.",
278
+ inputSchema: {
279
+ symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
280
+ projectPath: projectPathSchema,
281
+ },
282
+ }, tap("find_types_used", queryTool(session, ({ symbol, projectPath }) => session.findTypesUsed(symbol, projectPath))));
283
+ server.registerTool("find_returns", {
284
+ description: "The named type(s) a function or method returns — the return half of find_types_used.",
285
+ inputSchema: {
286
+ symbol: z.string().describe("Function/method id, simple name, or dotted qualified name."),
287
+ projectPath: projectPathSchema,
288
+ },
289
+ }, tap("find_returns", queryTool(session, ({ symbol, projectPath }) => session.findReturns(symbol, projectPath))));
290
+ server.registerTool("get_code_snippet", {
291
+ description: "A symbol's verbatim source.",
292
+ inputSchema: {
293
+ symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
294
+ projectPath: projectPathSchema,
295
+ },
296
+ }, tap("get_code_snippet", queryTool(session, ({ symbol, projectPath }) => session.getCodeSnippet(symbol, projectPath))));
297
+ server.registerTool("node", {
298
+ description: "Everything about one symbol or file at once: definition, source, callers, callees, " +
299
+ "and dependents.",
300
+ inputSchema: {
301
+ ref: z.string().describe("Symbol or file id, simple name, or dotted/path reference."),
302
+ projectPath: projectPathSchema,
303
+ },
304
+ }, tap("node", queryTool(session, ({ ref, projectPath }) => session.node(ref, projectPath))));
305
+ server.registerTool("file_skeleton", {
306
+ description: "A file's outline in one call: the symbols it defines (kind, name, line range) " +
307
+ "plus the files that depend on it — a structured, cheaper alternative to reading " +
308
+ "the whole file.",
309
+ inputSchema: {
310
+ file: z.string().describe("File node id (repo-relative path) or basename."),
311
+ projectPath: projectPathSchema,
312
+ },
313
+ }, tap("file_skeleton", queryTool(session, ({ file, projectPath }) => session.fileSkeleton(file, projectPath))));
314
+ server.registerTool("impact_analysis", {
315
+ description: "The transitive blast radius of a symbol: everything that could break if you change it " +
316
+ "(callers, callers of callers, …), optionally bounded by depth.",
317
+ inputSchema: {
318
+ symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
319
+ maxDepth: z
320
+ .number()
321
+ .int()
322
+ .positive()
323
+ .optional()
324
+ .describe("Max levels of callers to traverse (default: unbounded)."),
325
+ projectPath: projectPathSchema,
326
+ },
327
+ }, tap("impact_analysis", queryTool(session, ({ symbol, maxDepth, projectPath, }) => session.impactAnalysis(symbol, maxDepth, projectPath))));
328
+ server.registerTool("get_graph_schema", {
329
+ description: "A census of the index: how many nodes of each kind and edges of each kind it holds.",
330
+ inputSchema: { projectPath: projectPathSchema },
331
+ }, tap("get_graph_schema", queryTool(session, ({ projectPath }) => session.getGraphSchema(projectPath))));
332
+ server.registerTool("circular_imports", {
333
+ description: "File-level import cycles: groups of two or more files that (transitively) import " +
334
+ "each other. Each group is a strongly-connected component — high-signal for refactoring " +
335
+ "and untangling module graphs. Empty when the import graph is acyclic.",
336
+ inputSchema: { projectPath: projectPathSchema },
337
+ }, tap("circular_imports", queryTool(session, ({ projectPath }) => session.circularImports(projectPath))));
338
+ server.registerTool("affected", {
339
+ description: "Files affected by changing the given files: the transitive set that imports from them " +
340
+ "(directly or via a defined symbol) — which files/tests to recheck. Pass testsOnly to " +
341
+ "get just the affected test files (which tests to run for a change).",
342
+ inputSchema: {
343
+ files: z.array(z.string()).describe("File node ids (repo-relative paths) or basenames."),
344
+ testsOnly: z
345
+ .boolean()
346
+ .optional()
347
+ .describe("Return only the affected test files (test-impact mode)."),
348
+ projectPath: projectPathSchema,
349
+ },
350
+ }, tap("affected", queryTool(session, ({ files, testsOnly, projectPath, }) => session.affected(files, { testsOnly }, projectPath))));
351
+ server.registerTool("search_code", {
352
+ description: "Full-text search over symbol bodies — find code containing a string, not just by name.",
353
+ inputSchema: {
354
+ query: z.string().describe("Text to find inside symbol source (case-insensitive)."),
355
+ limit: z.number().int().positive().optional().describe("Max results."),
356
+ projectPath: projectPathSchema,
357
+ },
358
+ }, tap("search_code", async ({ query, limit, projectPath, }) => {
359
+ await session.catchUpIfNeeded();
360
+ const max = limit ?? DEFAULT_SEARCH_LIMIT;
361
+ const { results, viaTerms } = session.searchCodeWithConfidence(query, { limit: max + 1 }, projectPath);
362
+ const termHint = viaTerms
363
+ ? `⚠️ Ama: no symbol body contains the exact phrase "${query}" — these match its words separately and may be unrelated. Search a shorter exact phrase to narrow.`
364
+ : undefined;
365
+ const { shown, hint } = capped(results, max, termHint);
366
+ return reply(session, shown, hint);
367
+ }));
368
+ server.registerTool("explore", {
369
+ description: "A one-call overview of a question: matching symbols grouped by file, their " +
370
+ "caller/callee relationships, and the combined blast radius. Deep-dives only the " +
371
+ "top matches (see totalMatches); pass limit to widen or narrow.",
372
+ inputSchema: {
373
+ question: z.string().describe("A name or term to explore around."),
374
+ limit: z
375
+ .number()
376
+ .int()
377
+ .positive()
378
+ .optional()
379
+ .describe("How many top matches to deep-dive (default 15)."),
380
+ projectPath: projectPathSchema,
381
+ },
382
+ }, tap("explore", queryTool(session, ({ question, limit, projectPath, }) => session.explore(question, { limit }, projectPath))));
383
+ return server;
384
+ }
385
+ /** Entry point: serve over stdio. stdout carries JSON-RPC only — log to stderr. */
386
+ export async function main() {
387
+ const server = createServer();
388
+ await server.connect(new StdioServerTransport());
389
+ console.error("ama MCP server running on stdio");
390
+ }
391
+ if (isEntrypoint(import.meta.url)) {
392
+ // Pin grammar WASM to the baseline compiler before anything loads it, or a
393
+ // long-running index OOMs (ama-rgx). Re-execs once; the supervisor skips main.
394
+ if (!ensureBaselineWasmTier()) {
395
+ main().catch((error) => {
396
+ console.error(error);
397
+ process.exit(1);
398
+ });
399
+ }
400
+ }
401
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}