seer-mcp 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/.vscode/settings.json +3 -0
- package/LICENSE +176 -0
- package/README.md +272 -0
- package/README_dev.md +199 -0
- package/dist/bundle/ci.d.ts +47 -0
- package/dist/bundle/ci.d.ts.map +1 -0
- package/dist/bundle/ci.js +113 -0
- package/dist/bundle/ci.js.map +1 -0
- package/dist/bundle/contract.d.ts +111 -0
- package/dist/bundle/contract.d.ts.map +1 -0
- package/dist/bundle/contract.js +352 -0
- package/dist/bundle/contract.js.map +1 -0
- package/dist/bundle/export.d.ts +36 -0
- package/dist/bundle/export.d.ts.map +1 -0
- package/dist/bundle/export.js +152 -0
- package/dist/bundle/export.js.map +1 -0
- package/dist/bundle/external.d.ts +66 -0
- package/dist/bundle/external.d.ts.map +1 -0
- package/dist/bundle/external.js +238 -0
- package/dist/bundle/external.js.map +1 -0
- package/dist/bundle/format.d.ts +94 -0
- package/dist/bundle/format.d.ts.map +1 -0
- package/dist/bundle/format.js +42 -0
- package/dist/bundle/format.js.map +1 -0
- package/dist/bundle/import.d.ts +49 -0
- package/dist/bundle/import.d.ts.map +1 -0
- package/dist/bundle/import.js +116 -0
- package/dist/bundle/import.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1402 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +48 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +284 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +616 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/store.d.ts +1011 -0
- package/dist/db/store.d.ts.map +1 -0
- package/dist/db/store.js +3888 -0
- package/dist/db/store.js.map +1 -0
- package/dist/graph/pagerank.d.ts +9 -0
- package/dist/graph/pagerank.d.ts.map +1 -0
- package/dist/graph/pagerank.js +47 -0
- package/dist/graph/pagerank.js.map +1 -0
- package/dist/indexer/architecture.d.ts +72 -0
- package/dist/indexer/architecture.d.ts.map +1 -0
- package/dist/indexer/architecture.js +112 -0
- package/dist/indexer/architecture.js.map +1 -0
- package/dist/indexer/behavior.d.ts +75 -0
- package/dist/indexer/behavior.d.ts.map +1 -0
- package/dist/indexer/behavior.js +395 -0
- package/dist/indexer/behavior.js.map +1 -0
- package/dist/indexer/boundaries.d.ts +60 -0
- package/dist/indexer/boundaries.d.ts.map +1 -0
- package/dist/indexer/boundaries.js +366 -0
- package/dist/indexer/boundaries.js.map +1 -0
- package/dist/indexer/churn.d.ts +15 -0
- package/dist/indexer/churn.d.ts.map +1 -0
- package/dist/indexer/churn.js +49 -0
- package/dist/indexer/churn.js.map +1 -0
- package/dist/indexer/classify.d.ts +9 -0
- package/dist/indexer/classify.d.ts.map +1 -0
- package/dist/indexer/classify.js +90 -0
- package/dist/indexer/classify.js.map +1 -0
- package/dist/indexer/context.d.ts +176 -0
- package/dist/indexer/context.d.ts.map +1 -0
- package/dist/indexer/context.js +193 -0
- package/dist/indexer/context.js.map +1 -0
- package/dist/indexer/continuity.d.ts +67 -0
- package/dist/indexer/continuity.d.ts.map +1 -0
- package/dist/indexer/continuity.js +288 -0
- package/dist/indexer/continuity.js.map +1 -0
- package/dist/indexer/detectchanges.d.ts +32 -0
- package/dist/indexer/detectchanges.d.ts.map +1 -0
- package/dist/indexer/detectchanges.js +74 -0
- package/dist/indexer/detectchanges.js.map +1 -0
- package/dist/indexer/discovery.d.ts +37 -0
- package/dist/indexer/discovery.d.ts.map +1 -0
- package/dist/indexer/discovery.js +136 -0
- package/dist/indexer/discovery.js.map +1 -0
- package/dist/indexer/externaldeps.d.ts +18 -0
- package/dist/indexer/externaldeps.d.ts.map +1 -0
- package/dist/indexer/externaldeps.js +288 -0
- package/dist/indexer/externaldeps.js.map +1 -0
- package/dist/indexer/freshness.d.ts +48 -0
- package/dist/indexer/freshness.d.ts.map +1 -0
- package/dist/indexer/freshness.js +128 -0
- package/dist/indexer/freshness.js.map +1 -0
- package/dist/indexer/git.d.ts +144 -0
- package/dist/indexer/git.d.ts.map +1 -0
- package/dist/indexer/git.js +444 -0
- package/dist/indexer/git.js.map +1 -0
- package/dist/indexer/index.d.ts +145 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +930 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/modules.d.ts +62 -0
- package/dist/indexer/modules.d.ts.map +1 -0
- package/dist/indexer/modules.js +293 -0
- package/dist/indexer/modules.js.map +1 -0
- package/dist/indexer/preflight.d.ts +154 -0
- package/dist/indexer/preflight.d.ts.map +1 -0
- package/dist/indexer/preflight.js +399 -0
- package/dist/indexer/preflight.js.map +1 -0
- package/dist/indexer/protoScanner.d.ts +34 -0
- package/dist/indexer/protoScanner.d.ts.map +1 -0
- package/dist/indexer/protoScanner.js +133 -0
- package/dist/indexer/protoScanner.js.map +1 -0
- package/dist/indexer/risk.d.ts +115 -0
- package/dist/indexer/risk.d.ts.map +1 -0
- package/dist/indexer/risk.js +194 -0
- package/dist/indexer/risk.js.map +1 -0
- package/dist/indexer/serviceHostScanner.d.ts +25 -0
- package/dist/indexer/serviceHostScanner.d.ts.map +1 -0
- package/dist/indexer/serviceHostScanner.js +95 -0
- package/dist/indexer/serviceHostScanner.js.map +1 -0
- package/dist/indexer/serviceLinks.d.ts +105 -0
- package/dist/indexer/serviceLinks.d.ts.map +1 -0
- package/dist/indexer/serviceLinks.js +509 -0
- package/dist/indexer/serviceLinks.js.map +1 -0
- package/dist/indexer/shapehash.d.ts +98 -0
- package/dist/indexer/shapehash.d.ts.map +1 -0
- package/dist/indexer/shapehash.js +354 -0
- package/dist/indexer/shapehash.js.map +1 -0
- package/dist/indexer/skeleton.d.ts +15 -0
- package/dist/indexer/skeleton.d.ts.map +1 -0
- package/dist/indexer/skeleton.js +136 -0
- package/dist/indexer/skeleton.js.map +1 -0
- package/dist/indexer/symbolhistory.d.ts +41 -0
- package/dist/indexer/symbolhistory.d.ts.map +1 -0
- package/dist/indexer/symbolhistory.js +124 -0
- package/dist/indexer/symbolhistory.js.map +1 -0
- package/dist/indexer/watcher.d.ts +68 -0
- package/dist/indexer/watcher.d.ts.map +1 -0
- package/dist/indexer/watcher.js +179 -0
- package/dist/indexer/watcher.js.map +1 -0
- package/dist/mcp/server.d.ts +80 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +1610 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parser/index.d.ts +8 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +33 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/languages/cpp.d.ts +3 -0
- package/dist/parser/languages/cpp.d.ts.map +1 -0
- package/dist/parser/languages/cpp.js +350 -0
- package/dist/parser/languages/cpp.js.map +1 -0
- package/dist/parser/languages/csharp.d.ts +3 -0
- package/dist/parser/languages/csharp.d.ts.map +1 -0
- package/dist/parser/languages/csharp.js +239 -0
- package/dist/parser/languages/csharp.js.map +1 -0
- package/dist/parser/languages/go.d.ts +3 -0
- package/dist/parser/languages/go.d.ts.map +1 -0
- package/dist/parser/languages/go.js +259 -0
- package/dist/parser/languages/go.js.map +1 -0
- package/dist/parser/languages/java.d.ts +3 -0
- package/dist/parser/languages/java.d.ts.map +1 -0
- package/dist/parser/languages/java.js +391 -0
- package/dist/parser/languages/java.js.map +1 -0
- package/dist/parser/languages/python.d.ts +3 -0
- package/dist/parser/languages/python.d.ts.map +1 -0
- package/dist/parser/languages/python.js +396 -0
- package/dist/parser/languages/python.js.map +1 -0
- package/dist/parser/languages/rust.d.ts +3 -0
- package/dist/parser/languages/rust.d.ts.map +1 -0
- package/dist/parser/languages/rust.js +159 -0
- package/dist/parser/languages/rust.js.map +1 -0
- package/dist/parser/languages/typescript.d.ts +3 -0
- package/dist/parser/languages/typescript.d.ts.map +1 -0
- package/dist/parser/languages/typescript.js +1442 -0
- package/dist/parser/languages/typescript.js.map +1 -0
- package/dist/parser/parserContext.d.ts +77 -0
- package/dist/parser/parserContext.d.ts.map +1 -0
- package/dist/parser/parserContext.js +354 -0
- package/dist/parser/parserContext.js.map +1 -0
- package/dist/parser/walker.d.ts +81 -0
- package/dist/parser/walker.d.ts.map +1 -0
- package/dist/parser/walker.js +217 -0
- package/dist/parser/walker.js.map +1 -0
- package/dist/parser/worker.d.ts +66 -0
- package/dist/parser/worker.d.ts.map +1 -0
- package/dist/parser/worker.js +129 -0
- package/dist/parser/worker.js.map +1 -0
- package/dist/parser/workerpool.d.ts +107 -0
- package/dist/parser/workerpool.d.ts.map +1 -0
- package/dist/parser/workerpool.js +383 -0
- package/dist/parser/workerpool.js.map +1 -0
- package/dist/scip/format.d.ts +87 -0
- package/dist/scip/format.d.ts.map +1 -0
- package/dist/scip/format.js +31 -0
- package/dist/scip/format.js.map +1 -0
- package/dist/scip/import.d.ts +37 -0
- package/dist/scip/import.d.ts.map +1 -0
- package/dist/scip/import.js +180 -0
- package/dist/scip/import.js.map +1 -0
- package/dist/types.d.ts +392 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/docs/architecture.md +105 -0
- package/docs/benchmarks/methodology.md +134 -0
- package/docs/benchmarks/raw-results.md +71 -0
- package/docs/benchmarks.md +74 -0
- package/docs/cli.md +148 -0
- package/docs/examples/behavior-tests.md +70 -0
- package/docs/examples/change-history.md +85 -0
- package/docs/examples/pre-edit-context.md +81 -0
- package/docs/examples/service-links.md +88 -0
- package/docs/examples.md +80 -0
- package/docs/faq.md +70 -0
- package/docs/internals.md +104 -0
- package/docs/languages.md +70 -0
- package/docs/limits.md +52 -0
- package/docs/mcp.md +199 -0
- package/docs/quickstart.md +119 -0
- package/docs/testing.md +123 -0
- package/docs/tools.md +115 -0
- package/package.json +52 -0
- package/research-codebase.md +578 -0
- package/seer-cli-docs.md +326 -0
- package/seer-master-guide.md +246 -0
- package/src/bundle/ci.ts +141 -0
- package/src/bundle/contract.ts +387 -0
- package/src/bundle/export.ts +175 -0
- package/src/bundle/external.ts +285 -0
- package/src/bundle/format.ts +92 -0
- package/src/bundle/import.ts +157 -0
- package/src/cli/index.ts +1249 -0
- package/src/cli/init.ts +389 -0
- package/src/db/schema.ts +614 -0
- package/src/db/store.ts +4306 -0
- package/src/graph/pagerank.ts +53 -0
- package/src/indexer/architecture.ts +148 -0
- package/src/indexer/behavior.ts +466 -0
- package/src/indexer/boundaries.ts +374 -0
- package/src/indexer/churn.ts +58 -0
- package/src/indexer/classify.ts +96 -0
- package/src/indexer/context.ts +340 -0
- package/src/indexer/continuity.ts +322 -0
- package/src/indexer/detectchanges.ts +94 -0
- package/src/indexer/discovery.ts +176 -0
- package/src/indexer/externaldeps.ts +243 -0
- package/src/indexer/freshness.ts +166 -0
- package/src/indexer/git.ts +453 -0
- package/src/indexer/index.ts +1092 -0
- package/src/indexer/modules.ts +358 -0
- package/src/indexer/preflight.ts +548 -0
- package/src/indexer/protoScanner.ts +147 -0
- package/src/indexer/risk.ts +304 -0
- package/src/indexer/serviceHostScanner.ts +92 -0
- package/src/indexer/serviceLinks.ts +543 -0
- package/src/indexer/shapehash.ts +370 -0
- package/src/indexer/skeleton.ts +169 -0
- package/src/indexer/symbolhistory.ts +172 -0
- package/src/indexer/watcher.ts +206 -0
- package/src/mcp/server.ts +1659 -0
- package/src/parser/index.ts +37 -0
- package/src/parser/languages/cpp.ts +361 -0
- package/src/parser/languages/csharp.ts +235 -0
- package/src/parser/languages/go.ts +259 -0
- package/src/parser/languages/java.ts +382 -0
- package/src/parser/languages/python.ts +370 -0
- package/src/parser/languages/rust.ts +164 -0
- package/src/parser/languages/typescript.ts +1435 -0
- package/src/parser/parserContext.ts +392 -0
- package/src/parser/walker.ts +306 -0
- package/src/parser/worker.ts +181 -0
- package/src/parser/workerpool.ts +448 -0
- package/src/scip/format.ts +83 -0
- package/src/scip/import.ts +216 -0
- package/src/types.ts +457 -0
- package/tests/benchmark-service-links.ts +244 -0
- package/tests/bug-regressions.ts +626 -0
- package/tests/filters.ts +264 -0
- package/tests/fixtures/Counter.tsx +38 -0
- package/tests/fixtures/caller.ts +7 -0
- package/tests/fixtures/collisions.ts +23 -0
- package/tests/fixtures/local_helper.ts +5 -0
- package/tests/fixtures/overloads.java +17 -0
- package/tests/fixtures/remote_helper.ts +4 -0
- package/tests/fixtures/sample.c +15 -0
- package/tests/fixtures/sample.cpp +47 -0
- package/tests/fixtures/sample.cs +62 -0
- package/tests/fixtures/sample.go +68 -0
- package/tests/fixtures/sample.h +30 -0
- package/tests/fixtures/sample.java +85 -0
- package/tests/fixtures/sample.py +46 -0
- package/tests/fixtures/sample.rs +78 -0
- package/tests/fixtures/sample.ts +76 -0
- package/tests/fixtures-service/HttpClients.cs +30 -0
- package/tests/fixtures-service/HttpClients.java +24 -0
- package/tests/fixtures-service/billing.ts +15 -0
- package/tests/fixtures-service/docker-compose.yml +15 -0
- package/tests/fixtures-service/gateway.ts +10 -0
- package/tests/fixtures-service/get_user.ts +11 -0
- package/tests/fixtures-service/graphql_client.ts +63 -0
- package/tests/fixtures-service/graphql_server.ts +30 -0
- package/tests/fixtures-service/grpc_client.go +30 -0
- package/tests/fixtures-service/http_clients.go +23 -0
- package/tests/fixtures-service/http_clients.py +38 -0
- package/tests/fixtures-service/http_clients.ts +49 -0
- package/tests/fixtures-service/k8s/payment-service.yaml +22 -0
- package/tests/fixtures-service/k8s_calls.ts +20 -0
- package/tests/fixtures-service/messaging.ts +87 -0
- package/tests/fixtures-service/trpc_client.ts +39 -0
- package/tests/fixtures-service/trpc_server.ts +39 -0
- package/tests/fixtures-service/user_service.proto +33 -0
- package/tests/fixtures-trackcd/Cargo.toml +11 -0
- package/tests/fixtures-trackcd/SpringController.java +36 -0
- package/tests/fixtures-trackcd/auth_service.ts +19 -0
- package/tests/fixtures-trackcd/complex_module.py +50 -0
- package/tests/fixtures-trackcd/express_app.js +30 -0
- package/tests/fixtures-trackcd/fastapi_app.py +49 -0
- package/tests/fixtures-trackcd/fastify_object_routes.js +32 -0
- package/tests/fixtures-trackcd/go.mod +8 -0
- package/tests/fixtures-trackcd/package.json +15 -0
- package/tests/fixtures-trackcd/requirements.txt +4 -0
- package/tests/fixtures-trackcd/tests/auth_service.test.ts +13 -0
- package/tests/fixtures-tracke/auth/AuthService.ts +23 -0
- package/tests/fixtures-tracke/auth/crypto.ts +7 -0
- package/tests/fixtures-tracke/billing/Billing.ts +20 -0
- package/tests/fixtures-tracke/billing/Invoice.ts +10 -0
- package/tests/fixtures-tracke/billing/server.ts +17 -0
- package/tests/fixtures-tracke/package.json +7 -0
- package/tests/fixtures-tracke/tests/auth.test.ts +23 -0
- package/tests/fixtures-tracke/tests/billing.test.ts +14 -0
- package/tests/fixtures-trackf/package.json +5 -0
- package/tests/fixtures-trackf/src/auth.ts +26 -0
- package/tests/fixtures-trackf/src/handlers.ts +35 -0
- package/tests/fixtures-tracki/billing/routes.ts +12 -0
- package/tests/fixtures-tracki/gateway/client.ts +13 -0
- package/tests/git-features.ts +267 -0
- package/tests/init.ts +141 -0
- package/tests/mcp-jit.ts +130 -0
- package/tests/mcp-smoke.ts +191 -0
- package/tests/mcp-trackcd.ts +169 -0
- package/tests/mcp-tracke.ts +229 -0
- package/tests/mcp-trackf.ts +330 -0
- package/tests/mcp-trackg.ts +219 -0
- package/tests/mcp-tracki.ts +174 -0
- package/tests/mcp-watcher.ts +126 -0
- package/tests/optspec.ts +194 -0
- package/tests/parallel-index.ts +333 -0
- package/tests/parallel-read.ts +125 -0
- package/tests/parallel-recovery.ts +241 -0
- package/tests/perf-callers.ts +145 -0
- package/tests/query-parity.ts +184 -0
- package/tests/query-perf.ts +55 -0
- package/tests/scale-parallel-parity.ts +225 -0
- package/tests/scale-test.ts +523 -0
- package/tests/smoke.ts +396 -0
- package/tests/trackcd.ts +325 -0
- package/tests/tracke-collisions.ts +255 -0
- package/tests/tracke.ts +314 -0
- package/tests/trackf-bugs.ts +406 -0
- package/tests/trackf.ts +390 -0
- package/tests/trackg.ts +1372 -0
- package/tests/tracki-boundaries.ts +202 -0
- package/tests/tracki-continuity.ts +253 -0
- package/tests/tracki-contract-diff.ts +249 -0
- package/tests/tracki-external-bundles.ts +341 -0
- package/tests/tracki-preflight.ts +251 -0
- package/tests/verify-roles.ts +51 -0
- package/tests/worker-parity.ts +286 -0
- package/tests/worker-pool.ts +262 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildSymbolHistory = buildSymbolHistory;
|
|
4
|
+
const git_js_1 = require("./git.js");
|
|
5
|
+
const continuity_js_1 = require("./continuity.js");
|
|
6
|
+
async function buildSymbolHistory(repoRoot, store, options = {}) {
|
|
7
|
+
const start = Date.now();
|
|
8
|
+
const log = options.log ?? ((m) => process.stderr.write(`[symbol-history] ${m}\n`));
|
|
9
|
+
if (!(0, git_js_1.isGitRepo)(repoRoot)) {
|
|
10
|
+
log('not a git repo, skipping');
|
|
11
|
+
return { filesProcessed: 0, symbolsProcessed: 0, historyRowsInserted: 0, skipped: true, elapsedMs: Date.now() - start };
|
|
12
|
+
}
|
|
13
|
+
const head = (0, git_js_1.gitHeadSha)(repoRoot);
|
|
14
|
+
const state = store.getGitIndexState();
|
|
15
|
+
// Skip only if symbol-history specifically has already been built against
|
|
16
|
+
// this HEAD. Reading `lastHistoryHeadSha` instead of the generic
|
|
17
|
+
// `lastHeadSha` means a previous file-level churn pass (which also stamps
|
|
18
|
+
// git_index_state) can't trick us into skipping when history was never
|
|
19
|
+
// actually built.
|
|
20
|
+
if (options.skipIfHeadUnchanged !== false && state && state.lastHistoryHeadSha === head && head !== null) {
|
|
21
|
+
log(`HEAD ${head?.slice(0, 8)} unchanged; skipping`);
|
|
22
|
+
return { filesProcessed: 0, symbolsProcessed: 0, historyRowsInserted: 0, skipped: true, elapsedMs: Date.now() - start };
|
|
23
|
+
}
|
|
24
|
+
const remote = (0, git_js_1.gitRemoteUrl)(repoRoot);
|
|
25
|
+
const maxCommits = options.maxCommitsPerFile ?? 200;
|
|
26
|
+
const symbols = store.listSymbolsForHistoryIndex();
|
|
27
|
+
if (symbols.length === 0) {
|
|
28
|
+
return { filesProcessed: 0, symbolsProcessed: 0, historyRowsInserted: 0, skipped: false, elapsedMs: Date.now() - start };
|
|
29
|
+
}
|
|
30
|
+
// Group symbols by file path so we walk `git log` once per file.
|
|
31
|
+
const byFile = new Map();
|
|
32
|
+
for (const s of symbols) {
|
|
33
|
+
let arr = byFile.get(s.filePath);
|
|
34
|
+
if (!arr) {
|
|
35
|
+
arr = [];
|
|
36
|
+
byFile.set(s.filePath, arr);
|
|
37
|
+
}
|
|
38
|
+
arr.push(s);
|
|
39
|
+
}
|
|
40
|
+
let totalInserts = 0;
|
|
41
|
+
let processedFiles = 0;
|
|
42
|
+
for (const [filePath, fileSymbols] of byFile) {
|
|
43
|
+
processedFiles++;
|
|
44
|
+
const commits = await (0, git_js_1.commitsForFile)(repoRoot, filePath, { limit: maxCommits, since: options.since });
|
|
45
|
+
if (commits.length === 0)
|
|
46
|
+
continue;
|
|
47
|
+
// For each commit, fetch its diff hunks (in the new-file coordinate
|
|
48
|
+
// space). A symbol whose [line_start..line_end] range overlaps any hunk
|
|
49
|
+
// is considered touched.
|
|
50
|
+
for (let i = 0; i < commits.length; i++) {
|
|
51
|
+
const c = commits[i];
|
|
52
|
+
// Use the per-commit path resolved from `git log --follow --name-status`.
|
|
53
|
+
// If that wasn't available (older git or no rename detected), fall back
|
|
54
|
+
// to the current path — that's correct for commits where the file
|
|
55
|
+
// hadn't been renamed.
|
|
56
|
+
const lookupPath = c.pathAtCommit ?? filePath;
|
|
57
|
+
const info = await (0, git_js_1.fileDiffInfo)(repoRoot, c.sha, lookupPath);
|
|
58
|
+
if (info.hunks.length === 0 && !info.isFileAddition)
|
|
59
|
+
continue;
|
|
60
|
+
const totalAdded = info.hunks.reduce((acc, h) => acc + h.newLines, 0);
|
|
61
|
+
const totalRemoved = info.hunks.reduce((acc, h) => acc + h.oldLines, 0);
|
|
62
|
+
const prNum = (0, git_js_1.extractPrNumber)(c.message);
|
|
63
|
+
const prUrl = prNum != null ? (0, git_js_1.githubPrUrl)(remote, prNum) : null;
|
|
64
|
+
for (const sym of fileSymbols) {
|
|
65
|
+
// The current symbol's line span is in the HEAD file. As commits get
|
|
66
|
+
// older, line numbers drift — so we accept any overlap in any commit
|
|
67
|
+
// as "this commit touched the line range that now holds this symbol".
|
|
68
|
+
// confidence drops with commit age to flag the drift.
|
|
69
|
+
//
|
|
70
|
+
// Special case: if this commit added the file (isFileAddition), the
|
|
71
|
+
// pre-commit state had no symbols at all — every current symbol
|
|
72
|
+
// got its initial existence from this commit, so attribute all of
|
|
73
|
+
// them regardless of where the hunk lines up. Match strategy
|
|
74
|
+
// 'file-addition' so the caller can tell apart "this commit
|
|
75
|
+
// created the file" from "this commit overlapped the symbol".
|
|
76
|
+
const symStart = sym.lineStart + 1; // git is 1-indexed
|
|
77
|
+
const symEnd = sym.lineEnd + 1;
|
|
78
|
+
let strategy;
|
|
79
|
+
if (info.isFileAddition) {
|
|
80
|
+
strategy = 'file-addition';
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const overlaps = info.hunks.some(h => {
|
|
84
|
+
const hStart = h.newStart;
|
|
85
|
+
const hEnd = h.newStart + Math.max(0, h.newLines - 1);
|
|
86
|
+
return hStart <= symEnd && hEnd >= symStart;
|
|
87
|
+
});
|
|
88
|
+
if (!overlaps)
|
|
89
|
+
continue;
|
|
90
|
+
strategy = 'overlap';
|
|
91
|
+
}
|
|
92
|
+
const ageDays = Math.max(0, (Date.now() / 1000 - c.committedAt) / 86400);
|
|
93
|
+
// Confidence: 1.0 for HEAD..HEAD~1, decays with age but never below 0.3.
|
|
94
|
+
const confidence = Math.max(0.3, 1.0 - Math.min(0.7, ageDays / 365 * 0.1));
|
|
95
|
+
store.insertSymbolHistory(sym.id, sym.symbolKey, c.sha, c.authorName, c.authorEmail, c.committedAt, c.message, totalAdded, totalRemoved, prNum, prUrl, strategy, confidence);
|
|
96
|
+
totalInserts++;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// v10 — run the continuity heuristics for symbols whose recorded history is
|
|
101
|
+
// shallow. Strictly additive (lives in symbol_history_continuity); never
|
|
102
|
+
// touches symbol_history rows.
|
|
103
|
+
try {
|
|
104
|
+
if (store.hasV10()) {
|
|
105
|
+
const cont = (0, continuity_js_1.buildContinuity)(store, { historyThreshold: 1 });
|
|
106
|
+
log(`continuity: considered=${cont.candidatesConsidered}, inserted=${cont.inserted}, skipped=${cont.skipped}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
log(`continuity pass failed: ${err.message}`);
|
|
111
|
+
}
|
|
112
|
+
// Stamp the history-specific HEAD marker (not the generic one) so a future
|
|
113
|
+
// run can skip this work without colliding with file-level churn's stamp.
|
|
114
|
+
store.setHistoryHeadSha(repoRoot, head, remote);
|
|
115
|
+
log(`done: ${processedFiles} files, ${totalInserts} history rows`);
|
|
116
|
+
return {
|
|
117
|
+
filesProcessed: processedFiles,
|
|
118
|
+
symbolsProcessed: symbols.length,
|
|
119
|
+
historyRowsInserted: totalInserts,
|
|
120
|
+
skipped: false,
|
|
121
|
+
elapsedMs: Date.now() - start,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=symbolhistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbolhistory.js","sourceRoot":"","sources":["../../src/indexer/symbolhistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Store } from '../db/store.js';
|
|
2
|
+
import { Indexer } from './index.js';
|
|
3
|
+
export interface WatcherOptions {
|
|
4
|
+
/** Debounce window in ms before triggering a reindex pass. Default 250ms. */
|
|
5
|
+
debounceMs?: number;
|
|
6
|
+
/** Logger; default writes to stderr (so stdio MCP isn't polluted). */
|
|
7
|
+
log?: (msg: string) => void;
|
|
8
|
+
/**
|
|
9
|
+
* Skip these paths. Defaults match the indexer's ignore list — we don't
|
|
10
|
+
* want chokidar to fire on `node_modules/` updates that the index would
|
|
11
|
+
* skip anyway. The list is intentionally narrower than the full glob; the
|
|
12
|
+
* indexer's `discoverFiles()` re-applies all rules at reindex time.
|
|
13
|
+
*/
|
|
14
|
+
ignored?: (string | RegExp)[];
|
|
15
|
+
}
|
|
16
|
+
export declare class SeerWatcher {
|
|
17
|
+
private repoRoot;
|
|
18
|
+
private store;
|
|
19
|
+
private indexer;
|
|
20
|
+
private watcher;
|
|
21
|
+
private dirty;
|
|
22
|
+
private debounceTimer;
|
|
23
|
+
private indexing;
|
|
24
|
+
private indexingQueue;
|
|
25
|
+
private lastSyncMs;
|
|
26
|
+
private lastSyncResult;
|
|
27
|
+
private logFn;
|
|
28
|
+
private debounceMs;
|
|
29
|
+
constructor(repoRoot: string, store: Store, indexer: Indexer, options?: WatcherOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Start watching. Idempotent: calling twice is a no-op.
|
|
32
|
+
*/
|
|
33
|
+
start(): void;
|
|
34
|
+
stop(): Promise<void>;
|
|
35
|
+
/** Whether anything is currently waiting to be reindexed. */
|
|
36
|
+
isDirty(): boolean;
|
|
37
|
+
dirtyCount(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Snapshot for `seer_health`: when did we last reconcile, how many files,
|
|
40
|
+
* how long did it take. Lets agents tell whether the index they're querying
|
|
41
|
+
* is "this happened just now" vs "we haven't run in 10 minutes."
|
|
42
|
+
*/
|
|
43
|
+
syncStatus(): {
|
|
44
|
+
watching: boolean;
|
|
45
|
+
dirtyCount: number;
|
|
46
|
+
indexing: boolean;
|
|
47
|
+
lastSyncMs: number;
|
|
48
|
+
lastSync: {
|
|
49
|
+
dirtyReindexed: number;
|
|
50
|
+
added: number;
|
|
51
|
+
removed: number;
|
|
52
|
+
elapsedMs: number;
|
|
53
|
+
} | null;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Force an immediate sync, bypassing the debounce. Used by `seer_reindex`
|
|
57
|
+
* and JIT — both need the dirty set drained NOW, not when a timer fires.
|
|
58
|
+
*/
|
|
59
|
+
syncNow(): Promise<void>;
|
|
60
|
+
private scheduleSync;
|
|
61
|
+
/**
|
|
62
|
+
* Reindex the workspace. Serialized — if a sync is already running, we
|
|
63
|
+
* queue at most one follow-up and coalesce further requests into it. This
|
|
64
|
+
* matches the indexer's contract that only one writer can be active.
|
|
65
|
+
*/
|
|
66
|
+
private runSync;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/indexer/watcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA0BrC,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;CAC/B;AAED,qBAAa,WAAW;IAYpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IAbjB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,cAAc,CAA8F;IACpH,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,UAAU,CAAS;gBAGjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EACxB,OAAO,GAAE,cAAmB;IAM9B;;OAEG;IACH,KAAK,IAAI,IAAI;IAyCP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,6DAA6D;IAC7D,OAAO,IAAI,OAAO;IAIlB,UAAU,IAAI,MAAM;IAEpB;;;;OAIG;IACH,UAAU,IAAI;QACZ,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE;YAAE,cAAc,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;KAChG;IAUD;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,OAAO,CAAC,YAAY;IAUpB;;;;OAIG;YACW,OAAO;CAgCtB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SeerWatcher = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
/**
|
|
9
|
+
* Background file watcher that keeps the index warm.
|
|
10
|
+
*
|
|
11
|
+
* Design split:
|
|
12
|
+
* - Watcher (this module) reacts to file events and marks files dirty in a
|
|
13
|
+
* shared in-memory set. Debounces bursts so a `git checkout` doesn't
|
|
14
|
+
* hammer the indexer.
|
|
15
|
+
* - JIT sync ([./freshness.ts]) does the actual correctness work — when an
|
|
16
|
+
* MCP query comes in, it consults the dirty set + on-disk hashes and
|
|
17
|
+
* reindexes just what needs it.
|
|
18
|
+
*
|
|
19
|
+
* Why both? The watcher alone is racy (filesystem events on Windows arrive
|
|
20
|
+
* out of order, can be missed under load) and the JIT alone is slow on
|
|
21
|
+
* burst-y workloads (every query re-walks the workspace). Together the
|
|
22
|
+
* watcher absorbs steady-state edits so most JIT runs are no-ops, while JIT
|
|
23
|
+
* provides the per-query correctness guarantee.
|
|
24
|
+
*
|
|
25
|
+
* We use chokidar because it abstracts the OS-level oddities (FSEvents on
|
|
26
|
+
* macOS, ReadDirectoryChangesW on Windows, inotify on Linux) and provides
|
|
27
|
+
* a uniform API. It's the same library Aider uses for its watch mode.
|
|
28
|
+
*/
|
|
29
|
+
const chokidar_1 = __importDefault(require("chokidar"));
|
|
30
|
+
class SeerWatcher {
|
|
31
|
+
repoRoot;
|
|
32
|
+
store;
|
|
33
|
+
indexer;
|
|
34
|
+
watcher = null;
|
|
35
|
+
dirty = new Set();
|
|
36
|
+
debounceTimer = null;
|
|
37
|
+
indexing = false;
|
|
38
|
+
indexingQueue = false;
|
|
39
|
+
lastSyncMs = 0;
|
|
40
|
+
lastSyncResult = null;
|
|
41
|
+
logFn;
|
|
42
|
+
debounceMs;
|
|
43
|
+
constructor(repoRoot, store, indexer, options = {}) {
|
|
44
|
+
this.repoRoot = repoRoot;
|
|
45
|
+
this.store = store;
|
|
46
|
+
this.indexer = indexer;
|
|
47
|
+
this.debounceMs = options.debounceMs ?? 250;
|
|
48
|
+
this.logFn = options.log ?? ((m) => process.stderr.write(`[watcher] ${m}\n`));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Start watching. Idempotent: calling twice is a no-op.
|
|
52
|
+
*/
|
|
53
|
+
start() {
|
|
54
|
+
if (this.watcher)
|
|
55
|
+
return;
|
|
56
|
+
const abs = path_1.default.resolve(this.repoRoot);
|
|
57
|
+
this.watcher = chokidar_1.default.watch(abs, {
|
|
58
|
+
ignored: [
|
|
59
|
+
// chokidar accepts globs and functions. We use simple substring tests
|
|
60
|
+
// because the chokidar glob engine is finicky on Windows paths.
|
|
61
|
+
(p) => {
|
|
62
|
+
const norm = p.replace(/\\/g, '/');
|
|
63
|
+
return (norm.includes('/node_modules/') ||
|
|
64
|
+
norm.includes('/.git/') ||
|
|
65
|
+
norm.includes('/dist/') ||
|
|
66
|
+
norm.includes('/build/') ||
|
|
67
|
+
norm.includes('/.seer/') ||
|
|
68
|
+
norm.includes('/target/') ||
|
|
69
|
+
norm.includes('/obj/'));
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
persistent: true,
|
|
73
|
+
ignoreInitial: true, // Don't fire for files that already exist
|
|
74
|
+
awaitWriteFinish: {
|
|
75
|
+
// Some editors write through a tmp + rename dance. Wait for the file
|
|
76
|
+
// to stop growing before considering it changed.
|
|
77
|
+
stabilityThreshold: 100,
|
|
78
|
+
pollInterval: 50,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
const onChange = (filePath) => {
|
|
82
|
+
this.dirty.add(filePath);
|
|
83
|
+
this.scheduleSync();
|
|
84
|
+
};
|
|
85
|
+
this.watcher.on('add', onChange);
|
|
86
|
+
this.watcher.on('change', onChange);
|
|
87
|
+
this.watcher.on('unlink', onChange);
|
|
88
|
+
this.watcher.on('error', (err) => this.logFn(`error: ${err}`));
|
|
89
|
+
this.logFn(`watching ${abs}`);
|
|
90
|
+
}
|
|
91
|
+
async stop() {
|
|
92
|
+
if (this.debounceTimer) {
|
|
93
|
+
clearTimeout(this.debounceTimer);
|
|
94
|
+
this.debounceTimer = null;
|
|
95
|
+
}
|
|
96
|
+
if (this.watcher) {
|
|
97
|
+
await this.watcher.close();
|
|
98
|
+
this.watcher = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Whether anything is currently waiting to be reindexed. */
|
|
102
|
+
isDirty() {
|
|
103
|
+
return this.dirty.size > 0 || this.indexing || this.indexingQueue;
|
|
104
|
+
}
|
|
105
|
+
dirtyCount() { return this.dirty.size; }
|
|
106
|
+
/**
|
|
107
|
+
* Snapshot for `seer_health`: when did we last reconcile, how many files,
|
|
108
|
+
* how long did it take. Lets agents tell whether the index they're querying
|
|
109
|
+
* is "this happened just now" vs "we haven't run in 10 minutes."
|
|
110
|
+
*/
|
|
111
|
+
syncStatus() {
|
|
112
|
+
return {
|
|
113
|
+
watching: this.watcher !== null,
|
|
114
|
+
dirtyCount: this.dirty.size,
|
|
115
|
+
indexing: this.indexing,
|
|
116
|
+
lastSyncMs: this.lastSyncMs,
|
|
117
|
+
lastSync: this.lastSyncResult,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Force an immediate sync, bypassing the debounce. Used by `seer_reindex`
|
|
122
|
+
* and JIT — both need the dirty set drained NOW, not when a timer fires.
|
|
123
|
+
*/
|
|
124
|
+
async syncNow() {
|
|
125
|
+
if (this.debounceTimer) {
|
|
126
|
+
clearTimeout(this.debounceTimer);
|
|
127
|
+
this.debounceTimer = null;
|
|
128
|
+
}
|
|
129
|
+
await this.runSync();
|
|
130
|
+
}
|
|
131
|
+
scheduleSync() {
|
|
132
|
+
if (this.debounceTimer)
|
|
133
|
+
clearTimeout(this.debounceTimer);
|
|
134
|
+
this.debounceTimer = setTimeout(() => {
|
|
135
|
+
this.debounceTimer = null;
|
|
136
|
+
// Fire-and-forget — uncaught rejection would just kill the process.
|
|
137
|
+
// Errors are reported through the log function.
|
|
138
|
+
this.runSync().catch(err => this.logFn(`sync failed: ${err.message ?? err}`));
|
|
139
|
+
}, this.debounceMs);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Reindex the workspace. Serialized — if a sync is already running, we
|
|
143
|
+
* queue at most one follow-up and coalesce further requests into it. This
|
|
144
|
+
* matches the indexer's contract that only one writer can be active.
|
|
145
|
+
*/
|
|
146
|
+
async runSync() {
|
|
147
|
+
if (this.indexing) {
|
|
148
|
+
this.indexingQueue = true;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
this.indexing = true;
|
|
152
|
+
try {
|
|
153
|
+
const dirtyCount = this.dirty.size;
|
|
154
|
+
// Clear the dirty set BEFORE running the index so any events arriving
|
|
155
|
+
// during the index are caught for the next pass instead of being lost.
|
|
156
|
+
this.dirty.clear();
|
|
157
|
+
const start = Date.now();
|
|
158
|
+
const result = await this.indexer.indexDirectory(this.repoRoot, { quiet: true });
|
|
159
|
+
this.lastSyncMs = Date.now();
|
|
160
|
+
this.lastSyncResult = {
|
|
161
|
+
dirtyReindexed: dirtyCount,
|
|
162
|
+
added: result.filesIndexed,
|
|
163
|
+
removed: 0, // indexer doesn't expose pruned count; OK for now
|
|
164
|
+
elapsedMs: result.elapsedMs,
|
|
165
|
+
};
|
|
166
|
+
this.logFn(`sync: ${dirtyCount} dirty event(s), ${result.filesIndexed} reindexed, ` +
|
|
167
|
+
`${result.filesReusedFromCache} reused, ${result.elapsedMs}ms`);
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
this.indexing = false;
|
|
171
|
+
if (this.indexingQueue) {
|
|
172
|
+
this.indexingQueue = false;
|
|
173
|
+
this.runSync().catch(err => this.logFn(`requeued sync failed: ${err.message ?? err}`));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.SeerWatcher = SeerWatcher;
|
|
179
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/indexer/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Seer MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Tool surface (Track-B baseline + Track-C/D additions):
|
|
5
|
+
* - seer_health freshness + schema state
|
|
6
|
+
* - seer_stats counts (files/symbols/edges + role + Track-C totals)
|
|
7
|
+
* - seer_symbols symbol search (BM25 / LIKE)
|
|
8
|
+
* - seer_definition exact symbol definition lookup
|
|
9
|
+
* - seer_file_symbols list symbols in a file
|
|
10
|
+
* - seer_callers direct callers, bounded with true total
|
|
11
|
+
* - seer_callees direct callees, bounded
|
|
12
|
+
* - seer_search combined symbol + file path BM25 search,
|
|
13
|
+
* enriched with containing-symbol context
|
|
14
|
+
* - seer_reindex explicit reindex
|
|
15
|
+
*
|
|
16
|
+
* v4 additions:
|
|
17
|
+
* - seer_routes list HTTP routes detected in source
|
|
18
|
+
* - seer_dependencies list external dependencies from manifests
|
|
19
|
+
* - seer_config list config / env reads
|
|
20
|
+
* - seer_complexity rank symbols by cyclomatic/cognitive complexity
|
|
21
|
+
* - seer_behavior tests that exercise a given symbol
|
|
22
|
+
* - seer_trace_path bounded BFS shortest call path A → B
|
|
23
|
+
* - seer_architecture one-page codebase snapshot
|
|
24
|
+
* - seer_detect_changes blast-radius for current diff
|
|
25
|
+
* - seer_churn file-level git churn pass (opt-in)
|
|
26
|
+
* - seer_history per-symbol git history
|
|
27
|
+
* - seer_symbol_history (action) build symbol history index
|
|
28
|
+
*/
|
|
29
|
+
export interface McpServerOptions {
|
|
30
|
+
workspace: string;
|
|
31
|
+
dbPath?: string;
|
|
32
|
+
watch?: boolean;
|
|
33
|
+
jit?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare class SeerMcpServer {
|
|
36
|
+
private store;
|
|
37
|
+
private indexer;
|
|
38
|
+
private watcher;
|
|
39
|
+
private mcp;
|
|
40
|
+
private startedAt;
|
|
41
|
+
private workspace;
|
|
42
|
+
private dbPath;
|
|
43
|
+
private jitEnabled;
|
|
44
|
+
private watchEnabled;
|
|
45
|
+
private jitPromise;
|
|
46
|
+
constructor(options: McpServerOptions);
|
|
47
|
+
start(): Promise<void>;
|
|
48
|
+
stop(): Promise<void>;
|
|
49
|
+
private ensureFresh;
|
|
50
|
+
private text;
|
|
51
|
+
/**
|
|
52
|
+
* Registry of every tool handler, keyed by name. Mirrors the MCP registration
|
|
53
|
+
* so seer_batch can dispatch internally without a second round-trip. The
|
|
54
|
+
* wrapper stores the raw handler and forwards to the SDK unchanged.
|
|
55
|
+
*/
|
|
56
|
+
private handlers;
|
|
57
|
+
private registerTool;
|
|
58
|
+
/**
|
|
59
|
+
* Up to 5 deterministic fuzzy suggestions (BM25 over the camel/snake-split
|
|
60
|
+
* FTS index) for a name that resolved to nothing. SUGGESTION-ONLY: callers
|
|
61
|
+
* surface these under a `didYouMean` key, never substitute them for a real
|
|
62
|
+
* lookup. Returning a guessed symbol as if exact would be exactly the
|
|
63
|
+
* "misleading information" Seer's contract forbids.
|
|
64
|
+
*/
|
|
65
|
+
private suggestSymbols;
|
|
66
|
+
/**
|
|
67
|
+
* Emit a list response under a deterministic token budget. Items are assumed
|
|
68
|
+
* pre-sorted by relevance, so we prefix-trim: keep appending until the
|
|
69
|
+
* serialized payload would exceed `tokenBudget * 4` chars (~4 chars/token).
|
|
70
|
+
* Without a budget the output is byte-identical to the previous behavior.
|
|
71
|
+
*/
|
|
72
|
+
private budgetedText;
|
|
73
|
+
private autoBuilt;
|
|
74
|
+
private ensureModules;
|
|
75
|
+
private ensureShapeHashes;
|
|
76
|
+
private ensureSymbolHistory;
|
|
77
|
+
private registerTools;
|
|
78
|
+
}
|
|
79
|
+
export declare function runMcp(options: McpServerOptions): Promise<void>;
|
|
80
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAA8B;gBAEpC,OAAO,EAAE,gBAAgB;IAU/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,WAAW;IAWzB,OAAO,CAAC,IAAI;IAIZ;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAkD;IAElE,OAAO,CAAC,YAAY;IASpB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAYtB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAkCpB,OAAO,CAAC,SAAS,CAAqD;IAEtE,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,iBAAiB;YAWX,mBAAmB;IAejC,OAAO,CAAC,aAAa;CA83CtB;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CASrE"}
|