@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.
- package/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/analyzers/baseline/analyzer.d.ts +47 -0
- package/dist/analyzers/baseline/analyzer.d.ts.map +1 -0
- package/dist/analyzers/baseline/analyzer.js +84 -0
- package/dist/analyzers/baseline/analyzer.js.map +1 -0
- package/dist/analyzers/baseline/c.d.ts +12 -0
- package/dist/analyzers/baseline/c.d.ts.map +1 -0
- package/dist/analyzers/baseline/c.js +56 -0
- package/dist/analyzers/baseline/c.js.map +1 -0
- package/dist/analyzers/baseline/config.d.ts +21 -0
- package/dist/analyzers/baseline/config.d.ts.map +1 -0
- package/dist/analyzers/baseline/config.js +32 -0
- package/dist/analyzers/baseline/config.js.map +1 -0
- package/dist/analyzers/baseline/csharp.d.ts +9 -0
- package/dist/analyzers/baseline/csharp.d.ts.map +1 -0
- package/dist/analyzers/baseline/csharp.js +107 -0
- package/dist/analyzers/baseline/csharp.js.map +1 -0
- package/dist/analyzers/baseline/go.d.ts +11 -0
- package/dist/analyzers/baseline/go.d.ts.map +1 -0
- package/dist/analyzers/baseline/go.js +66 -0
- package/dist/analyzers/baseline/go.js.map +1 -0
- package/dist/analyzers/baseline/java.d.ts +9 -0
- package/dist/analyzers/baseline/java.d.ts.map +1 -0
- package/dist/analyzers/baseline/java.js +50 -0
- package/dist/analyzers/baseline/java.js.map +1 -0
- package/dist/analyzers/baseline/javascript.d.ts +10 -0
- package/dist/analyzers/baseline/javascript.d.ts.map +1 -0
- package/dist/analyzers/baseline/javascript.js +55 -0
- package/dist/analyzers/baseline/javascript.js.map +1 -0
- package/dist/analyzers/baseline/kotlin.d.ts +11 -0
- package/dist/analyzers/baseline/kotlin.d.ts.map +1 -0
- package/dist/analyzers/baseline/kotlin.js +67 -0
- package/dist/analyzers/baseline/kotlin.js.map +1 -0
- package/dist/analyzers/baseline/paths.d.ts +6 -0
- package/dist/analyzers/baseline/paths.d.ts.map +1 -0
- package/dist/analyzers/baseline/paths.js +17 -0
- package/dist/analyzers/baseline/paths.js.map +1 -0
- package/dist/analyzers/baseline/php.d.ts +11 -0
- package/dist/analyzers/baseline/php.d.ts.map +1 -0
- package/dist/analyzers/baseline/php.js +76 -0
- package/dist/analyzers/baseline/php.js.map +1 -0
- package/dist/analyzers/baseline/python.d.ts +10 -0
- package/dist/analyzers/baseline/python.d.ts.map +1 -0
- package/dist/analyzers/baseline/python.js +63 -0
- package/dist/analyzers/baseline/python.js.map +1 -0
- package/dist/analyzers/baseline/rust.d.ts +10 -0
- package/dist/analyzers/baseline/rust.d.ts.map +1 -0
- package/dist/analyzers/baseline/rust.js +45 -0
- package/dist/analyzers/baseline/rust.js.map +1 -0
- package/dist/analyzers/baseline/swift.d.ts +11 -0
- package/dist/analyzers/baseline/swift.d.ts.map +1 -0
- package/dist/analyzers/baseline/swift.js +19 -0
- package/dist/analyzers/baseline/swift.js.map +1 -0
- package/dist/analyzers/baseline/treesitter.d.ts +11 -0
- package/dist/analyzers/baseline/treesitter.d.ts.map +1 -0
- package/dist/analyzers/baseline/treesitter.js +87 -0
- package/dist/analyzers/baseline/treesitter.js.map +1 -0
- package/dist/analyzers/baseline/walk.d.ts +26 -0
- package/dist/analyzers/baseline/walk.d.ts.map +1 -0
- package/dist/analyzers/baseline/walk.js +76 -0
- package/dist/analyzers/baseline/walk.js.map +1 -0
- package/dist/analyzers/registry.d.ts +19 -0
- package/dist/analyzers/registry.d.ts.map +1 -0
- package/dist/analyzers/registry.js +43 -0
- package/dist/analyzers/registry.js.map +1 -0
- package/dist/analyzers/sfc/analyzer.d.ts +17 -0
- package/dist/analyzers/sfc/analyzer.d.ts.map +1 -0
- package/dist/analyzers/sfc/analyzer.js +141 -0
- package/dist/analyzers/sfc/analyzer.js.map +1 -0
- package/dist/analyzers/sidecar/analyzer.d.ts +29 -0
- package/dist/analyzers/sidecar/analyzer.d.ts.map +1 -0
- package/dist/analyzers/sidecar/analyzer.js +114 -0
- package/dist/analyzers/sidecar/analyzer.js.map +1 -0
- package/dist/analyzers/sidecar/protocol.d.ts +508 -0
- package/dist/analyzers/sidecar/protocol.d.ts.map +1 -0
- package/dist/analyzers/sidecar/protocol.js +102 -0
- package/dist/analyzers/sidecar/protocol.js.map +1 -0
- package/dist/analyzers/types.d.ts +46 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +2 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/analyzers/typescript/analyzer.d.ts +126 -0
- package/dist/analyzers/typescript/analyzer.d.ts.map +1 -0
- package/dist/analyzers/typescript/analyzer.js +1600 -0
- package/dist/analyzers/typescript/analyzer.js.map +1 -0
- package/dist/cli/commands/cycles.d.ts +6 -0
- package/dist/cli/commands/cycles.d.ts.map +1 -0
- package/dist/cli/commands/cycles.js +27 -0
- package/dist/cli/commands/cycles.js.map +1 -0
- package/dist/cli/commands/files.d.ts +6 -0
- package/dist/cli/commands/files.d.ts.map +1 -0
- package/dist/cli/commands/files.js +33 -0
- package/dist/cli/commands/files.js.map +1 -0
- package/dist/cli/commands/impact.d.ts +18 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +113 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/lifecycle.d.ts +5 -0
- package/dist/cli/commands/lifecycle.d.ts.map +1 -0
- package/dist/cli/commands/lifecycle.js +83 -0
- package/dist/cli/commands/lifecycle.js.map +1 -0
- package/dist/cli/commands/query.d.ts +31 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +187 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/search.d.ts +21 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +160 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +63 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +6 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +57 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/emit.d.ts +9 -0
- package/dist/cli/emit.d.ts.map +1 -0
- package/dist/cli/emit.js +10 -0
- package/dist/cli/emit.js.map +1 -0
- package/dist/cli/index.d.ts +37 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +128 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/paths.d.ts +7 -0
- package/dist/cli/paths.d.ts.map +1 -0
- package/dist/cli/paths.js +10 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/query-runner.d.ts +13 -0
- package/dist/cli/query-runner.d.ts.map +1 -0
- package/dist/cli/query-runner.js +33 -0
- package/dist/cli/query-runner.js.map +1 -0
- package/dist/graph/dispatch.d.ts +17 -0
- package/dist/graph/dispatch.d.ts.map +1 -0
- package/dist/graph/dispatch.js +82 -0
- package/dist/graph/dispatch.js.map +1 -0
- package/dist/graph/id.d.ts +19 -0
- package/dist/graph/id.d.ts.map +1 -0
- package/dist/graph/id.js +17 -0
- package/dist/graph/id.js.map +1 -0
- package/dist/graph/index.d.ts +6 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +4 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/types.d.ts +71 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +52 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/indexer/debouncer.d.ts +32 -0
- package/dist/indexer/debouncer.d.ts.map +1 -0
- package/dist/indexer/debouncer.js +81 -0
- package/dist/indexer/debouncer.js.map +1 -0
- package/dist/indexer/ignore.d.ts +55 -0
- package/dist/indexer/ignore.d.ts.map +1 -0
- package/dist/indexer/ignore.js +170 -0
- package/dist/indexer/ignore.js.map +1 -0
- package/dist/indexer/indexer.d.ts +112 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +392 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/watcher.d.ts +50 -0
- package/dist/indexer/watcher.d.ts.map +1 -0
- package/dist/indexer/watcher.js +86 -0
- package/dist/indexer/watcher.js.map +1 -0
- package/dist/mcp/build-info.d.ts +16 -0
- package/dist/mcp/build-info.d.ts.map +1 -0
- package/dist/mcp/build-info.js +54 -0
- package/dist/mcp/build-info.js.map +1 -0
- package/dist/mcp/http.d.ts +18 -0
- package/dist/mcp/http.d.ts.map +1 -0
- package/dist/mcp/http.js +145 -0
- package/dist/mcp/http.js.map +1 -0
- package/dist/mcp/server.d.ts +22 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +401 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +155 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +319 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/query/service.d.ts +329 -0
- package/dist/query/service.d.ts.map +1 -0
- package/dist/query/service.js +959 -0
- package/dist/query/service.js.map +1 -0
- package/dist/runtime/entrypoint.d.ts +11 -0
- package/dist/runtime/entrypoint.d.ts.map +1 -0
- package/dist/runtime/entrypoint.js +22 -0
- package/dist/runtime/entrypoint.js.map +1 -0
- package/dist/runtime/quiet-sqlite-warning.d.ts +14 -0
- package/dist/runtime/quiet-sqlite-warning.d.ts.map +1 -0
- package/dist/runtime/quiet-sqlite-warning.js +26 -0
- package/dist/runtime/quiet-sqlite-warning.js.map +1 -0
- package/dist/runtime/wasm-tier.d.ts +2 -0
- package/dist/runtime/wasm-tier.d.ts.map +1 -0
- package/dist/runtime/wasm-tier.js +54 -0
- package/dist/runtime/wasm-tier.js.map +1 -0
- package/dist/store/memory.d.ts +54 -0
- package/dist/store/memory.d.ts.map +1 -0
- package/dist/store/memory.js +210 -0
- package/dist/store/memory.js.map +1 -0
- package/dist/store/sqlite.d.ts +38 -0
- package/dist/store/sqlite.d.ts.map +1 -0
- package/dist/store/sqlite.js +298 -0
- package/dist/store/sqlite.js.map +1 -0
- package/dist/store/types.d.ts +76 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { ResolutionStats } from "../analyzers/types.js";
|
|
2
|
+
import type { GraphNode } from "../graph/index.js";
|
|
3
|
+
import type { IndexStats, Indexer, LanguageCoverage, SyncResult } from "../indexer/indexer.js";
|
|
4
|
+
import { type WatchSource } from "../indexer/watcher.js";
|
|
5
|
+
import type { EdgeNeighbor, Exploration, FileSkeleton, GraphSchema, NodeView, SearchOptions, SearchResult, Snippet } from "../query/service.js";
|
|
6
|
+
import { type ServerStamp } from "./build-info.js";
|
|
7
|
+
export type IndexStatus = {
|
|
8
|
+
indexed: false;
|
|
9
|
+
server: ServerStamp;
|
|
10
|
+
} | {
|
|
11
|
+
indexed: true;
|
|
12
|
+
root: string;
|
|
13
|
+
nodeCount: number;
|
|
14
|
+
edgeCount: number;
|
|
15
|
+
fileCount: number;
|
|
16
|
+
languages: LanguageCoverage[];
|
|
17
|
+
/** Call-resolution coverage (resolved vs total attributable call sites), when
|
|
18
|
+
* measured — an honest signal of how complete the call graph is. */
|
|
19
|
+
resolution?: ResolutionStats;
|
|
20
|
+
/** Edits the auto-syncer has queued but not yet re-indexed (0 if not watching). */
|
|
21
|
+
pendingSync: number;
|
|
22
|
+
/** Every indexed project (root + counts). The top-level root/counts above are the
|
|
23
|
+
* primary (last-indexed) project; this lists all of them for a multi-project
|
|
24
|
+
* session, so a caller can see what `projectPath` values are queryable. (ama-ont) */
|
|
25
|
+
projects: {
|
|
26
|
+
root: string;
|
|
27
|
+
nodeCount: number;
|
|
28
|
+
edgeCount: number;
|
|
29
|
+
fileCount: number;
|
|
30
|
+
}[];
|
|
31
|
+
/** Running-server build stamp, for detecting a stale server (see build-info). */
|
|
32
|
+
server: ServerStamp;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Stateful core behind the MCP tools. Holds the current index and routes the
|
|
36
|
+
* tool calls (index_repository, index_status, and the query tools) to the
|
|
37
|
+
* indexer and query service. Kept transport-free so it is unit-testable without
|
|
38
|
+
* standing up a stdio server.
|
|
39
|
+
*/
|
|
40
|
+
export declare class AmaSession {
|
|
41
|
+
private readonly indexer;
|
|
42
|
+
/** All indexed projects, keyed by resolved root. The watcher/auto-sync and the
|
|
43
|
+
* `store`/`query`/`stats` fields track the *primary* (last-indexed) project; other
|
|
44
|
+
* projects are queryable snapshots reached via a `projectPath`. (ama-ont) */
|
|
45
|
+
private readonly projects;
|
|
46
|
+
private store?;
|
|
47
|
+
private query?;
|
|
48
|
+
private stats?;
|
|
49
|
+
private watcher?;
|
|
50
|
+
private debouncer?;
|
|
51
|
+
private needsCatchUp;
|
|
52
|
+
constructor(indexer?: Indexer);
|
|
53
|
+
indexRepository(root: string): Promise<IndexStats>;
|
|
54
|
+
/** Add (or replace) a project in the registry and make it the primary. Re-indexing
|
|
55
|
+
* the same root closes its old store; a different root is kept alongside, so several
|
|
56
|
+
* projects stay queryable at once via `projectPath`. (ama-ont) */
|
|
57
|
+
private register;
|
|
58
|
+
/**
|
|
59
|
+
* Open a persisted index for `root` without re-analyzing, falling back to a
|
|
60
|
+
* full {@link indexRepository} when there is nothing usable to reopen (e.g. the
|
|
61
|
+
* in-memory store, or a stale/incompatible DB). On reopen, drift is reconciled
|
|
62
|
+
* lazily on the first query (the connect-time catch-up). Used at server
|
|
63
|
+
* startup so a process restart reuses the persisted graph.
|
|
64
|
+
*/
|
|
65
|
+
open(root: string): Promise<IndexStats>;
|
|
66
|
+
/** Release resources: stop watching and close every project's store. */
|
|
67
|
+
close(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Arm a one-shot catch-up — typically on MCP reconnect, since files may have
|
|
70
|
+
* changed while disconnected. A no-op until something is indexed.
|
|
71
|
+
*/
|
|
72
|
+
markForCatchUp(): void;
|
|
73
|
+
/**
|
|
74
|
+
* If armed, reconcile on-disk changes before serving (a size/mtime + hash
|
|
75
|
+
* diff via {@link sync}), then disarm. Returns what it reconciled, or
|
|
76
|
+
* undefined when nothing was armed. Called before each query so the first one
|
|
77
|
+
* after a reconnect sees a current graph.
|
|
78
|
+
*/
|
|
79
|
+
catchUpIfNeeded(): Promise<SyncResult | undefined>;
|
|
80
|
+
/**
|
|
81
|
+
* Re-index a single file that changed on disk, updating the live graph in
|
|
82
|
+
* place (no full rebuild, same store, so existing queries keep working).
|
|
83
|
+
* Counts are refreshed; language coverage is unchanged by a single-file edit.
|
|
84
|
+
*/
|
|
85
|
+
reindexFile(rel: string): Promise<IndexStats>;
|
|
86
|
+
/**
|
|
87
|
+
* Start watching the indexed root and auto-re-index files as they change,
|
|
88
|
+
* collapsing bursts of edits with a debounce window. Idempotent; requires a
|
|
89
|
+
* prior index. Pair with {@link unwatch} to stop.
|
|
90
|
+
*/
|
|
91
|
+
watch(options?: {
|
|
92
|
+
windowMs?: number;
|
|
93
|
+
source?: WatchSource;
|
|
94
|
+
}): void;
|
|
95
|
+
/** Stop watching. Pending (un-synced) edits are dropped. */
|
|
96
|
+
unwatch(): void;
|
|
97
|
+
/**
|
|
98
|
+
* Manually reconcile files that changed on disk since the last index — a
|
|
99
|
+
* catch-up that does not need a live watcher. Returns what it re-indexed and
|
|
100
|
+
* removed, and refreshes the cached counts.
|
|
101
|
+
*/
|
|
102
|
+
sync(): Promise<SyncResult>;
|
|
103
|
+
/**
|
|
104
|
+
* A warning to prepend to query results while edits sit in the auto-syncer's
|
|
105
|
+
* debounce window: those files' results are stale until the next re-index, so
|
|
106
|
+
* name them and steer the caller to read them directly. Undefined when there
|
|
107
|
+
* is nothing pending (the common case — no banner).
|
|
108
|
+
*/
|
|
109
|
+
stalenessBanner(): string | undefined;
|
|
110
|
+
indexStatus(): IndexStatus;
|
|
111
|
+
/** Live per-language file coverage from the current store, in first-seen order. */
|
|
112
|
+
private coverage;
|
|
113
|
+
searchSymbol(query: string, opts?: SearchOptions, projectPath?: string): GraphNode[];
|
|
114
|
+
searchSymbolWithConfidence(query: string, opts?: SearchOptions, projectPath?: string): SearchResult;
|
|
115
|
+
searchCode(query: string, opts?: {
|
|
116
|
+
limit?: number;
|
|
117
|
+
}, projectPath?: string): GraphNode[];
|
|
118
|
+
searchCodeWithConfidence(query: string, opts?: {
|
|
119
|
+
limit?: number;
|
|
120
|
+
}, projectPath?: string): {
|
|
121
|
+
results: GraphNode[];
|
|
122
|
+
viaTerms: boolean;
|
|
123
|
+
};
|
|
124
|
+
findCallers(ref: string, projectPath?: string): EdgeNeighbor[];
|
|
125
|
+
findCallees(ref: string, projectPath?: string): EdgeNeighbor[];
|
|
126
|
+
findHandlers(ref: string, projectPath?: string): EdgeNeighbor[];
|
|
127
|
+
findRoutes(ref: string, projectPath?: string): EdgeNeighbor[];
|
|
128
|
+
findReferrers(ref: string, projectPath?: string): EdgeNeighbor[];
|
|
129
|
+
findOverrides(ref: string, projectPath?: string): EdgeNeighbor[];
|
|
130
|
+
findOverriddenBy(ref: string, projectPath?: string): EdgeNeighbor[];
|
|
131
|
+
circularImports(projectPath?: string): GraphNode[][];
|
|
132
|
+
findImplementations(ref: string, projectPath?: string): GraphNode[];
|
|
133
|
+
findInterfaces(ref: string, projectPath?: string): GraphNode[];
|
|
134
|
+
findImporters(ref: string, projectPath?: string): GraphNode[];
|
|
135
|
+
findImports(ref: string, projectPath?: string): GraphNode[];
|
|
136
|
+
findTypeUsers(ref: string, projectPath?: string): GraphNode[];
|
|
137
|
+
findTypesUsed(ref: string, projectPath?: string): GraphNode[];
|
|
138
|
+
findReturns(ref: string, projectPath?: string): GraphNode[];
|
|
139
|
+
getCodeSnippet(ref: string, projectPath?: string): Snippet | undefined;
|
|
140
|
+
node(ref: string, projectPath?: string): NodeView | undefined;
|
|
141
|
+
fileSkeleton(ref: string, projectPath?: string): FileSkeleton | undefined;
|
|
142
|
+
impactAnalysis(ref: string, maxDepth?: number, projectPath?: string): GraphNode[];
|
|
143
|
+
getGraphSchema(projectPath?: string): GraphSchema;
|
|
144
|
+
affected(files: string[], opts?: {
|
|
145
|
+
testsOnly?: boolean;
|
|
146
|
+
}, projectPath?: string): GraphNode[];
|
|
147
|
+
explore(question: string, opts?: {
|
|
148
|
+
limit?: number;
|
|
149
|
+
}, projectPath?: string): Exploration;
|
|
150
|
+
private requireQuery;
|
|
151
|
+
/** The indexed project a `projectPath` names: the one whose root equals the resolved
|
|
152
|
+
* path or contains it (longest root wins, for nested/monorepo layouts). (ama-ont) */
|
|
153
|
+
private projectFor;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { Debouncer } from "../indexer/debouncer.js";
|
|
3
|
+
import { createDefaultIndexer } from "../indexer/indexer.js";
|
|
4
|
+
import { FileWatcher } from "../indexer/watcher.js";
|
|
5
|
+
import { QueryService } from "../query/service.js";
|
|
6
|
+
import { serverStamp } from "./build-info.js";
|
|
7
|
+
/** Default quiet window before a burst of edits triggers a re-index. */
|
|
8
|
+
const DEFAULT_DEBOUNCE_MS = 200;
|
|
9
|
+
/**
|
|
10
|
+
* Stateful core behind the MCP tools. Holds the current index and routes the
|
|
11
|
+
* tool calls (index_repository, index_status, and the query tools) to the
|
|
12
|
+
* indexer and query service. Kept transport-free so it is unit-testable without
|
|
13
|
+
* standing up a stdio server.
|
|
14
|
+
*/
|
|
15
|
+
export class AmaSession {
|
|
16
|
+
indexer;
|
|
17
|
+
/** All indexed projects, keyed by resolved root. The watcher/auto-sync and the
|
|
18
|
+
* `store`/`query`/`stats` fields track the *primary* (last-indexed) project; other
|
|
19
|
+
* projects are queryable snapshots reached via a `projectPath`. (ama-ont) */
|
|
20
|
+
projects = new Map();
|
|
21
|
+
store;
|
|
22
|
+
query;
|
|
23
|
+
stats;
|
|
24
|
+
watcher;
|
|
25
|
+
debouncer;
|
|
26
|
+
needsCatchUp = false;
|
|
27
|
+
constructor(indexer = createDefaultIndexer()) {
|
|
28
|
+
this.indexer = indexer;
|
|
29
|
+
}
|
|
30
|
+
async indexRepository(root) {
|
|
31
|
+
const abs = path.resolve(root);
|
|
32
|
+
const { store, stats } = await this.indexer.index(abs);
|
|
33
|
+
this.register(abs, { store, query: new QueryService(store, abs), stats });
|
|
34
|
+
this.needsCatchUp = false; // a fresh index is already current
|
|
35
|
+
return stats;
|
|
36
|
+
}
|
|
37
|
+
/** Add (or replace) a project in the registry and make it the primary. Re-indexing
|
|
38
|
+
* the same root closes its old store; a different root is kept alongside, so several
|
|
39
|
+
* projects stay queryable at once via `projectPath`. (ama-ont) */
|
|
40
|
+
register(abs, project) {
|
|
41
|
+
this.projects.get(abs)?.store.close();
|
|
42
|
+
this.projects.set(abs, project);
|
|
43
|
+
this.store = project.store;
|
|
44
|
+
this.query = project.query;
|
|
45
|
+
this.stats = project.stats;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Open a persisted index for `root` without re-analyzing, falling back to a
|
|
49
|
+
* full {@link indexRepository} when there is nothing usable to reopen (e.g. the
|
|
50
|
+
* in-memory store, or a stale/incompatible DB). On reopen, drift is reconciled
|
|
51
|
+
* lazily on the first query (the connect-time catch-up). Used at server
|
|
52
|
+
* startup so a process restart reuses the persisted graph.
|
|
53
|
+
*/
|
|
54
|
+
async open(root) {
|
|
55
|
+
const abs = path.resolve(root);
|
|
56
|
+
const opened = await this.indexer.open(abs);
|
|
57
|
+
if (!opened)
|
|
58
|
+
return this.indexRepository(abs);
|
|
59
|
+
this.register(abs, {
|
|
60
|
+
store: opened.store,
|
|
61
|
+
query: new QueryService(opened.store, abs),
|
|
62
|
+
stats: opened.stats,
|
|
63
|
+
});
|
|
64
|
+
this.needsCatchUp = true; // reconcile anything that changed while we were down
|
|
65
|
+
return opened.stats;
|
|
66
|
+
}
|
|
67
|
+
/** Release resources: stop watching and close every project's store. */
|
|
68
|
+
close() {
|
|
69
|
+
this.unwatch();
|
|
70
|
+
for (const project of this.projects.values())
|
|
71
|
+
project.store.close();
|
|
72
|
+
this.projects.clear();
|
|
73
|
+
this.store = undefined;
|
|
74
|
+
this.query = undefined;
|
|
75
|
+
this.stats = undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Arm a one-shot catch-up — typically on MCP reconnect, since files may have
|
|
79
|
+
* changed while disconnected. A no-op until something is indexed.
|
|
80
|
+
*/
|
|
81
|
+
markForCatchUp() {
|
|
82
|
+
if (this.stats)
|
|
83
|
+
this.needsCatchUp = true;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* If armed, reconcile on-disk changes before serving (a size/mtime + hash
|
|
87
|
+
* diff via {@link sync}), then disarm. Returns what it reconciled, or
|
|
88
|
+
* undefined when nothing was armed. Called before each query so the first one
|
|
89
|
+
* after a reconnect sees a current graph.
|
|
90
|
+
*/
|
|
91
|
+
async catchUpIfNeeded() {
|
|
92
|
+
if (!this.needsCatchUp)
|
|
93
|
+
return undefined;
|
|
94
|
+
this.needsCatchUp = false;
|
|
95
|
+
return this.sync();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Re-index a single file that changed on disk, updating the live graph in
|
|
99
|
+
* place (no full rebuild, same store, so existing queries keep working).
|
|
100
|
+
* Counts are refreshed; language coverage is unchanged by a single-file edit.
|
|
101
|
+
*/
|
|
102
|
+
async reindexFile(rel) {
|
|
103
|
+
if (!this.store || !this.stats) {
|
|
104
|
+
throw new Error("Nothing indexed yet — call index_repository first.");
|
|
105
|
+
}
|
|
106
|
+
await this.indexer.reindexFile(this.store, this.stats.root, rel);
|
|
107
|
+
this.stats = {
|
|
108
|
+
...this.stats,
|
|
109
|
+
nodeCount: this.store.nodeCount,
|
|
110
|
+
edgeCount: this.store.edgeCount,
|
|
111
|
+
fileCount: this.store.allFiles().length,
|
|
112
|
+
};
|
|
113
|
+
return this.stats;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Start watching the indexed root and auto-re-index files as they change,
|
|
117
|
+
* collapsing bursts of edits with a debounce window. Idempotent; requires a
|
|
118
|
+
* prior index. Pair with {@link unwatch} to stop.
|
|
119
|
+
*/
|
|
120
|
+
watch(options = {}) {
|
|
121
|
+
if (!this.store || !this.stats) {
|
|
122
|
+
throw new Error("Nothing indexed yet — call index_repository first.");
|
|
123
|
+
}
|
|
124
|
+
if (this.watcher)
|
|
125
|
+
return; // already watching
|
|
126
|
+
this.debouncer = new Debouncer((rel) => this.reindexFile(rel).then(() => undefined), options.windowMs ?? DEFAULT_DEBOUNCE_MS);
|
|
127
|
+
this.watcher = new FileWatcher(this.stats.root, (rel) => this.debouncer?.notify(rel), {
|
|
128
|
+
source: options.source,
|
|
129
|
+
});
|
|
130
|
+
this.watcher.start();
|
|
131
|
+
}
|
|
132
|
+
/** Stop watching. Pending (un-synced) edits are dropped. */
|
|
133
|
+
unwatch() {
|
|
134
|
+
this.watcher?.close();
|
|
135
|
+
this.watcher = undefined;
|
|
136
|
+
this.debouncer?.stop();
|
|
137
|
+
this.debouncer = undefined;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Manually reconcile files that changed on disk since the last index — a
|
|
141
|
+
* catch-up that does not need a live watcher. Returns what it re-indexed and
|
|
142
|
+
* removed, and refreshes the cached counts.
|
|
143
|
+
*/
|
|
144
|
+
async sync() {
|
|
145
|
+
if (!this.store || !this.stats) {
|
|
146
|
+
throw new Error("Nothing indexed yet — call index_repository first.");
|
|
147
|
+
}
|
|
148
|
+
const result = await this.indexer.sync(this.store, this.stats.root);
|
|
149
|
+
this.stats = {
|
|
150
|
+
...this.stats,
|
|
151
|
+
nodeCount: this.store.nodeCount,
|
|
152
|
+
edgeCount: this.store.edgeCount,
|
|
153
|
+
fileCount: this.store.allFiles().length,
|
|
154
|
+
};
|
|
155
|
+
return result;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A warning to prepend to query results while edits sit in the auto-syncer's
|
|
159
|
+
* debounce window: those files' results are stale until the next re-index, so
|
|
160
|
+
* name them and steer the caller to read them directly. Undefined when there
|
|
161
|
+
* is nothing pending (the common case — no banner).
|
|
162
|
+
*/
|
|
163
|
+
stalenessBanner() {
|
|
164
|
+
const pending = this.debouncer?.pendingPaths() ?? [];
|
|
165
|
+
if (pending.length === 0)
|
|
166
|
+
return undefined;
|
|
167
|
+
const shown = pending.slice(0, 10);
|
|
168
|
+
const more = pending.length - shown.length;
|
|
169
|
+
const list = more > 0 ? `${shown.join(", ")}, and ${more} more` : shown.join(", ");
|
|
170
|
+
return (`⚠️ Ama: ${pending.length} file(s) changed and are pending re-index — results below ` +
|
|
171
|
+
`may be stale for: ${list}. For their current contents, read these files directly.`);
|
|
172
|
+
}
|
|
173
|
+
indexStatus() {
|
|
174
|
+
if (!this.stats)
|
|
175
|
+
return { indexed: false, server: serverStamp };
|
|
176
|
+
const { root, nodeCount, edgeCount, fileCount, resolution } = this.stats;
|
|
177
|
+
return {
|
|
178
|
+
indexed: true,
|
|
179
|
+
root,
|
|
180
|
+
nodeCount,
|
|
181
|
+
edgeCount,
|
|
182
|
+
fileCount,
|
|
183
|
+
// Recompute coverage live from the current files: a full index writes the
|
|
184
|
+
// cached `ama:coverage` metadata, but an incremental sync/reindex doesn't, so
|
|
185
|
+
// the cached per-language census drifts. Deriving it from the store each call
|
|
186
|
+
// keeps it correct on every path. (resolution still reflects the last full
|
|
187
|
+
// index — it's analysis metadata, not derivable from the store.) (ama-okg)
|
|
188
|
+
languages: this.coverage(),
|
|
189
|
+
...(resolution ? { resolution } : {}),
|
|
190
|
+
pendingSync: this.debouncer?.pendingCount ?? 0,
|
|
191
|
+
projects: [...this.projects.entries()].map(([root, p]) => ({
|
|
192
|
+
root,
|
|
193
|
+
nodeCount: p.store.nodeCount,
|
|
194
|
+
edgeCount: p.store.edgeCount,
|
|
195
|
+
fileCount: p.store.allFiles().length,
|
|
196
|
+
})),
|
|
197
|
+
server: serverStamp,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/** Live per-language file coverage from the current store, in first-seen order. */
|
|
201
|
+
coverage() {
|
|
202
|
+
const counts = new Map();
|
|
203
|
+
for (const meta of this.store?.allFiles() ?? []) {
|
|
204
|
+
const lang = this.indexer.languageOf(meta.path);
|
|
205
|
+
if (!lang)
|
|
206
|
+
continue;
|
|
207
|
+
const entry = counts.get(lang.language);
|
|
208
|
+
if (entry)
|
|
209
|
+
entry.files++;
|
|
210
|
+
else
|
|
211
|
+
counts.set(lang.language, { tier: lang.tier, files: 1 });
|
|
212
|
+
}
|
|
213
|
+
return [...counts].map(([language, { tier, files }]) => ({ language, tier, files }));
|
|
214
|
+
}
|
|
215
|
+
searchSymbol(query, opts, projectPath) {
|
|
216
|
+
return this.requireQuery(projectPath).searchSymbol(query, opts);
|
|
217
|
+
}
|
|
218
|
+
searchSymbolWithConfidence(query, opts, projectPath) {
|
|
219
|
+
return this.requireQuery(projectPath).searchSymbolWithConfidence(query, opts);
|
|
220
|
+
}
|
|
221
|
+
searchCode(query, opts, projectPath) {
|
|
222
|
+
return this.requireQuery(projectPath).searchCode(query, opts);
|
|
223
|
+
}
|
|
224
|
+
searchCodeWithConfidence(query, opts, projectPath) {
|
|
225
|
+
return this.requireQuery(projectPath).searchCodeWithConfidence(query, opts);
|
|
226
|
+
}
|
|
227
|
+
findCallers(ref, projectPath) {
|
|
228
|
+
return this.requireQuery(projectPath).findCallers(ref);
|
|
229
|
+
}
|
|
230
|
+
findCallees(ref, projectPath) {
|
|
231
|
+
return this.requireQuery(projectPath).findCallees(ref);
|
|
232
|
+
}
|
|
233
|
+
findHandlers(ref, projectPath) {
|
|
234
|
+
return this.requireQuery(projectPath).findHandlers(ref);
|
|
235
|
+
}
|
|
236
|
+
findRoutes(ref, projectPath) {
|
|
237
|
+
return this.requireQuery(projectPath).findRoutes(ref);
|
|
238
|
+
}
|
|
239
|
+
findReferrers(ref, projectPath) {
|
|
240
|
+
return this.requireQuery(projectPath).findReferrers(ref);
|
|
241
|
+
}
|
|
242
|
+
findOverrides(ref, projectPath) {
|
|
243
|
+
return this.requireQuery(projectPath).findOverrides(ref);
|
|
244
|
+
}
|
|
245
|
+
findOverriddenBy(ref, projectPath) {
|
|
246
|
+
return this.requireQuery(projectPath).findOverriddenBy(ref);
|
|
247
|
+
}
|
|
248
|
+
circularImports(projectPath) {
|
|
249
|
+
return this.requireQuery(projectPath).circularImports();
|
|
250
|
+
}
|
|
251
|
+
findImplementations(ref, projectPath) {
|
|
252
|
+
return this.requireQuery(projectPath).findImplementations(ref);
|
|
253
|
+
}
|
|
254
|
+
findInterfaces(ref, projectPath) {
|
|
255
|
+
return this.requireQuery(projectPath).findInterfaces(ref);
|
|
256
|
+
}
|
|
257
|
+
findImporters(ref, projectPath) {
|
|
258
|
+
return this.requireQuery(projectPath).findImporters(ref);
|
|
259
|
+
}
|
|
260
|
+
findImports(ref, projectPath) {
|
|
261
|
+
return this.requireQuery(projectPath).findImports(ref);
|
|
262
|
+
}
|
|
263
|
+
findTypeUsers(ref, projectPath) {
|
|
264
|
+
return this.requireQuery(projectPath).findTypeUsers(ref);
|
|
265
|
+
}
|
|
266
|
+
findTypesUsed(ref, projectPath) {
|
|
267
|
+
return this.requireQuery(projectPath).findTypesUsed(ref);
|
|
268
|
+
}
|
|
269
|
+
findReturns(ref, projectPath) {
|
|
270
|
+
return this.requireQuery(projectPath).findReturns(ref);
|
|
271
|
+
}
|
|
272
|
+
getCodeSnippet(ref, projectPath) {
|
|
273
|
+
return this.requireQuery(projectPath).getCodeSnippet(ref);
|
|
274
|
+
}
|
|
275
|
+
node(ref, projectPath) {
|
|
276
|
+
return this.requireQuery(projectPath).node(ref);
|
|
277
|
+
}
|
|
278
|
+
fileSkeleton(ref, projectPath) {
|
|
279
|
+
return this.requireQuery(projectPath).fileSkeleton(ref);
|
|
280
|
+
}
|
|
281
|
+
impactAnalysis(ref, maxDepth, projectPath) {
|
|
282
|
+
return this.requireQuery(projectPath).impactAnalysis(ref, maxDepth);
|
|
283
|
+
}
|
|
284
|
+
getGraphSchema(projectPath) {
|
|
285
|
+
return this.requireQuery(projectPath).getGraphSchema();
|
|
286
|
+
}
|
|
287
|
+
affected(files, opts = {}, projectPath) {
|
|
288
|
+
return this.requireQuery(projectPath).affected(files, opts);
|
|
289
|
+
}
|
|
290
|
+
explore(question, opts = {}, projectPath) {
|
|
291
|
+
return this.requireQuery(projectPath).explore(question, opts);
|
|
292
|
+
}
|
|
293
|
+
requireQuery(projectPath) {
|
|
294
|
+
if (projectPath !== undefined)
|
|
295
|
+
return this.projectFor(projectPath).query;
|
|
296
|
+
if (!this.query) {
|
|
297
|
+
throw new Error("Nothing indexed yet — call index_repository first.");
|
|
298
|
+
}
|
|
299
|
+
return this.query;
|
|
300
|
+
}
|
|
301
|
+
/** The indexed project a `projectPath` names: the one whose root equals the resolved
|
|
302
|
+
* path or contains it (longest root wins, for nested/monorepo layouts). (ama-ont) */
|
|
303
|
+
projectFor(projectPath) {
|
|
304
|
+
const abs = path.resolve(projectPath);
|
|
305
|
+
let best;
|
|
306
|
+
let bestLen = -1;
|
|
307
|
+
for (const [root, project] of this.projects) {
|
|
308
|
+
if ((abs === root || abs.startsWith(`${root}${path.sep}`)) && root.length > bestLen) {
|
|
309
|
+
best = project;
|
|
310
|
+
bestLen = root.length;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (!best) {
|
|
314
|
+
throw new Error(`No indexed project for ${abs}. Run index_repository on its root first (see index_status for the indexed projects).`);
|
|
315
|
+
}
|
|
316
|
+
return best;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/mcp/session.ts"],"names":[],"mappings":"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"}
|