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,383 @@
|
|
|
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.WorkerPool = void 0;
|
|
7
|
+
exports.defaultWorkerPath = defaultWorkerPath;
|
|
8
|
+
/**
|
|
9
|
+
* WorkerPool — a fixed-size pool of parser workers with ordered draining,
|
|
10
|
+
* bounded out-of-order buffering, per-job attempt limits, and crash recovery.
|
|
11
|
+
*
|
|
12
|
+
* Used by the indexer's parallel-parsing path. The pool owns:
|
|
13
|
+
* - N workers, each its own V8 isolate + WASM heap.
|
|
14
|
+
* - A FIFO queue of pending jobs.
|
|
15
|
+
* - A small bounded buffer for out-of-order completions (results that
|
|
16
|
+
* finished ahead of the current head seq are held until the head
|
|
17
|
+
* advances). The buffer is bounded by `maxLag` so a slow head can't
|
|
18
|
+
* pile up unbounded memory.
|
|
19
|
+
* - An "inflight" map: workerId → currently-assigned job. On worker
|
|
20
|
+
* death this is what gets requeued.
|
|
21
|
+
*
|
|
22
|
+
* Design discipline:
|
|
23
|
+
* - Workers parse only. The pool never touches the DB or graph.
|
|
24
|
+
* - The consumer callback is invoked strictly in input order. Symbol IDs
|
|
25
|
+
* in the indexer depend on this for cross-run determinism.
|
|
26
|
+
* - Crashes are recoverable but bounded: a job that has crashed `maxAttempts`
|
|
27
|
+
* workers in a row is reported as a parse-error and the run continues.
|
|
28
|
+
* - Shutdown is graceful: drain inflight, send `shutdown` to each worker,
|
|
29
|
+
* await exit. Terminate is the hammer for tests.
|
|
30
|
+
*/
|
|
31
|
+
const worker_threads_1 = require("worker_threads");
|
|
32
|
+
const fs_1 = __importDefault(require("fs"));
|
|
33
|
+
const path_1 = __importDefault(require("path"));
|
|
34
|
+
const os_1 = __importDefault(require("os"));
|
|
35
|
+
// ── Default worker-path resolver ─────────────────────────────────────────────
|
|
36
|
+
//
|
|
37
|
+
// Workers always run from the compiled .js artifact. In dev (tsx) the source
|
|
38
|
+
// of this module is .ts; we reflect __dirname to dist. This means callers
|
|
39
|
+
// must `npm run build` before turning on parallel mode in dev — which matches
|
|
40
|
+
// the pattern already used by the MCP test suite. If the dist artifact is
|
|
41
|
+
// missing we throw with a clear message rather than silently fall back.
|
|
42
|
+
function defaultWorkerPath() {
|
|
43
|
+
const here = __filename;
|
|
44
|
+
if (here.endsWith('.js')) {
|
|
45
|
+
return path_1.default.join(__dirname, 'worker.js');
|
|
46
|
+
}
|
|
47
|
+
// Source mode: reflect src/parser/<this>.ts → dist/parser/worker.js.
|
|
48
|
+
const distDir = __dirname
|
|
49
|
+
.replace(`${path_1.default.sep}src${path_1.default.sep}parser`, `${path_1.default.sep}dist${path_1.default.sep}parser`)
|
|
50
|
+
.replace('/src/parser', '/dist/parser');
|
|
51
|
+
const distWorker = path_1.default.join(distDir, 'worker.js');
|
|
52
|
+
if (!fs_1.default.existsSync(distWorker)) {
|
|
53
|
+
throw new Error(`Parallel parsing requires the compiled worker at ${distWorker}. ` +
|
|
54
|
+
`Run \`npm run build\` first, or set SEER_PARALLEL_PARSE=0.`);
|
|
55
|
+
}
|
|
56
|
+
return distWorker;
|
|
57
|
+
}
|
|
58
|
+
// ── WorkerPool ───────────────────────────────────────────────────────────────
|
|
59
|
+
class WorkerPool {
|
|
60
|
+
workerPath;
|
|
61
|
+
maxLag;
|
|
62
|
+
maxAttempts;
|
|
63
|
+
_jobs;
|
|
64
|
+
workers = [];
|
|
65
|
+
idle = [];
|
|
66
|
+
nextWorkerId = 0;
|
|
67
|
+
/** Sequence number of the next result we expect to deliver via the callback. */
|
|
68
|
+
headSeq = 0;
|
|
69
|
+
/** Total jobs in the current dispatch. */
|
|
70
|
+
totalJobs = 0;
|
|
71
|
+
/** Next seq to send to a worker. */
|
|
72
|
+
nextDispatchSeq = 0;
|
|
73
|
+
/** seq → WorkItem (for the entire dispatch). */
|
|
74
|
+
items = [];
|
|
75
|
+
/** seq → attempt count. */
|
|
76
|
+
attempts = new Map();
|
|
77
|
+
/** Out-of-order buffer for seq > headSeq. */
|
|
78
|
+
buffered = new Map();
|
|
79
|
+
/** Awaiting-worker queue: seqs that need to be dispatched but no worker is free. */
|
|
80
|
+
pendingDispatch = [];
|
|
81
|
+
/** Currently active dispatch — null when idle. */
|
|
82
|
+
active = null;
|
|
83
|
+
/**
|
|
84
|
+
* Synchronous flag set the moment `dispatch()` is entered. Prevents two
|
|
85
|
+
* synchronous `dispatch()` calls from both passing the `if (this.active)`
|
|
86
|
+
* guard before the first reaches its `await this.ready()`. `this.active`
|
|
87
|
+
* itself is set after that await, so it can't be the only guard.
|
|
88
|
+
*/
|
|
89
|
+
dispatching = false;
|
|
90
|
+
/** A rolling promise chain so the consumer callback is invoked strictly serially. */
|
|
91
|
+
callbackChain = Promise.resolve();
|
|
92
|
+
_wasmResets = 0;
|
|
93
|
+
terminated = false;
|
|
94
|
+
constructor(opts = {}) {
|
|
95
|
+
this._jobs = Math.max(1, opts.jobs ?? defaultJobCount());
|
|
96
|
+
this.workerPath = opts.workerPath ?? defaultWorkerPath();
|
|
97
|
+
this.maxLag = Math.max(this._jobs, opts.maxLag ?? this._jobs * 4);
|
|
98
|
+
this.maxAttempts = Math.max(1, opts.maxAttempts ?? 3);
|
|
99
|
+
}
|
|
100
|
+
/** Number of workers actually spawned (after `ready()`). */
|
|
101
|
+
get jobs() { return this._jobs; }
|
|
102
|
+
/** Total worker-local ParserContext resets observed across this pool. */
|
|
103
|
+
wasmResetCount() { return this._wasmResets; }
|
|
104
|
+
/** Spawn workers and wait for all of them to post `ready`. */
|
|
105
|
+
async ready() {
|
|
106
|
+
if (this.workers.length > 0)
|
|
107
|
+
return; // already spawned
|
|
108
|
+
const readyPromises = [];
|
|
109
|
+
for (let i = 0; i < this._jobs; i++) {
|
|
110
|
+
const handle = this.spawnWorker();
|
|
111
|
+
this.workers.push(handle);
|
|
112
|
+
readyPromises.push(new Promise((resolve, reject) => {
|
|
113
|
+
handle.worker.once('error', reject);
|
|
114
|
+
const onMsg = (msg) => {
|
|
115
|
+
if (msg.kind === 'ready') {
|
|
116
|
+
handle.ready = true;
|
|
117
|
+
this.idle.push(handle);
|
|
118
|
+
handle.worker.off('message', onMsg);
|
|
119
|
+
resolve();
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
handle.worker.on('message', onMsg);
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
await Promise.all(readyPromises);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Dispatch every WorkItem to the pool. The callback is invoked exactly once
|
|
129
|
+
* per item, in input order, regardless of which worker finished it.
|
|
130
|
+
*
|
|
131
|
+
* Resolves when every item has been delivered to the callback. Rejects if
|
|
132
|
+
* the pool is terminated mid-dispatch.
|
|
133
|
+
*/
|
|
134
|
+
async dispatch(items, onResult) {
|
|
135
|
+
if (this.dispatching || this.active) {
|
|
136
|
+
throw new Error('WorkerPool: dispatch already in progress');
|
|
137
|
+
}
|
|
138
|
+
if (this.terminated) {
|
|
139
|
+
throw new Error('WorkerPool: terminated');
|
|
140
|
+
}
|
|
141
|
+
if (items.length === 0)
|
|
142
|
+
return;
|
|
143
|
+
this.dispatching = true;
|
|
144
|
+
try {
|
|
145
|
+
await this.ready();
|
|
146
|
+
this.items = items;
|
|
147
|
+
this.totalJobs = items.length;
|
|
148
|
+
this.headSeq = 0;
|
|
149
|
+
this.nextDispatchSeq = 0;
|
|
150
|
+
this.attempts.clear();
|
|
151
|
+
this.buffered.clear();
|
|
152
|
+
this.pendingDispatch.length = 0;
|
|
153
|
+
this.callbackChain = Promise.resolve();
|
|
154
|
+
await new Promise((resolve, reject) => {
|
|
155
|
+
this.active = {
|
|
156
|
+
onResult,
|
|
157
|
+
resolve,
|
|
158
|
+
reject,
|
|
159
|
+
delivering: this.callbackChain,
|
|
160
|
+
};
|
|
161
|
+
this.pump();
|
|
162
|
+
});
|
|
163
|
+
// Wait for the callback chain to fully drain before returning.
|
|
164
|
+
await this.callbackChain;
|
|
165
|
+
this.active = null;
|
|
166
|
+
this.items = [];
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
this.dispatching = false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Shutdown: send 'shutdown' to each worker, await all exits. */
|
|
173
|
+
async shutdown() {
|
|
174
|
+
if (this.terminated)
|
|
175
|
+
return;
|
|
176
|
+
this.terminated = true;
|
|
177
|
+
const exits = [];
|
|
178
|
+
for (const h of this.workers) {
|
|
179
|
+
exits.push(new Promise(resolve => {
|
|
180
|
+
h.worker.once('exit', () => resolve());
|
|
181
|
+
try {
|
|
182
|
+
h.worker.postMessage({ kind: 'shutdown' });
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
resolve();
|
|
186
|
+
}
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
await Promise.all(exits);
|
|
190
|
+
this.workers = [];
|
|
191
|
+
this.idle = [];
|
|
192
|
+
}
|
|
193
|
+
/** Hammer: force-terminate all workers. Use only when shutdown() can't. */
|
|
194
|
+
async terminate() {
|
|
195
|
+
if (this.terminated && this.workers.length === 0)
|
|
196
|
+
return;
|
|
197
|
+
this.terminated = true;
|
|
198
|
+
const exits = [];
|
|
199
|
+
for (const h of this.workers)
|
|
200
|
+
exits.push(h.worker.terminate());
|
|
201
|
+
await Promise.all(exits);
|
|
202
|
+
this.workers = [];
|
|
203
|
+
this.idle = [];
|
|
204
|
+
}
|
|
205
|
+
// ── Internals ──────────────────────────────────────────────────────────────
|
|
206
|
+
/** Pump dispatch + drain until either no work is left or no slack remains. */
|
|
207
|
+
pump() {
|
|
208
|
+
// 1. Dispatch as many new seqs as backpressure allows.
|
|
209
|
+
// Constraint: seqDispatched < headSeq + maxLag, so the buffered out-of-order
|
|
210
|
+
// set can't grow past `maxLag` entries.
|
|
211
|
+
while (this.idle.length > 0
|
|
212
|
+
&& this.nextDispatchSeq < this.totalJobs
|
|
213
|
+
&& this.nextDispatchSeq < this.headSeq + this.maxLag) {
|
|
214
|
+
const seq = this.nextDispatchSeq++;
|
|
215
|
+
const handle = this.idle.pop();
|
|
216
|
+
this.sendJob(handle, seq);
|
|
217
|
+
}
|
|
218
|
+
// 2. Also drain any pendingDispatch (requeued after a crash) while workers idle.
|
|
219
|
+
while (this.idle.length > 0 && this.pendingDispatch.length > 0) {
|
|
220
|
+
const seq = this.pendingDispatch.shift();
|
|
221
|
+
const handle = this.idle.pop();
|
|
222
|
+
this.sendJob(handle, seq);
|
|
223
|
+
}
|
|
224
|
+
// 3. If everything is delivered, finish the dispatch.
|
|
225
|
+
if (this.active && this.headSeq >= this.totalJobs) {
|
|
226
|
+
const a = this.active;
|
|
227
|
+
// Resolve once the callback chain has drained the last buffered result.
|
|
228
|
+
this.callbackChain.then(() => a.resolve(), err => a.reject(err));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
sendJob(handle, seq) {
|
|
232
|
+
const item = this.items[seq];
|
|
233
|
+
handle.inflight = { seq, item };
|
|
234
|
+
const job = {
|
|
235
|
+
kind: 'parse',
|
|
236
|
+
seq,
|
|
237
|
+
abs: item.abs,
|
|
238
|
+
lang: item.lang,
|
|
239
|
+
expectedHash: item.expectedHash,
|
|
240
|
+
maxFileBytes: item.maxFileBytes,
|
|
241
|
+
};
|
|
242
|
+
try {
|
|
243
|
+
handle.worker.postMessage(job);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
// Worker is gone — treat as crash.
|
|
247
|
+
this.onWorkerCrash(handle, err);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
spawnWorker() {
|
|
251
|
+
const id = this.nextWorkerId++;
|
|
252
|
+
const worker = new worker_threads_1.Worker(this.workerPath);
|
|
253
|
+
const handle = { id, worker, inflight: null, ready: false, wasmResets: 0 };
|
|
254
|
+
worker.on('message', (msg) => this.onWorkerMessage(handle, msg));
|
|
255
|
+
worker.on('error', err => this.onWorkerCrash(handle, err));
|
|
256
|
+
worker.on('exit', code => {
|
|
257
|
+
if (this.terminated)
|
|
258
|
+
return;
|
|
259
|
+
if (handle.inflight) {
|
|
260
|
+
// Unexpected exit during a job.
|
|
261
|
+
this.onWorkerCrash(handle, new Error(`worker ${id} exited with code ${code} mid-job`));
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
// Exited idle — only fine if we're tearing down. If we're still active,
|
|
265
|
+
// respawn so the pool doesn't shrink under load.
|
|
266
|
+
if (this.active && !this.terminated) {
|
|
267
|
+
this.respawnWorker(handle);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
return handle;
|
|
271
|
+
}
|
|
272
|
+
respawnWorker(dead) {
|
|
273
|
+
const idx = this.workers.indexOf(dead);
|
|
274
|
+
if (idx >= 0)
|
|
275
|
+
this.workers.splice(idx, 1);
|
|
276
|
+
const idleIdx = this.idle.indexOf(dead);
|
|
277
|
+
if (idleIdx >= 0)
|
|
278
|
+
this.idle.splice(idleIdx, 1);
|
|
279
|
+
const fresh = this.spawnWorker();
|
|
280
|
+
this.workers.push(fresh);
|
|
281
|
+
// Wait for fresh worker's ready message before counting it as idle.
|
|
282
|
+
const onMsg = (msg) => {
|
|
283
|
+
if (msg.kind === 'ready') {
|
|
284
|
+
fresh.ready = true;
|
|
285
|
+
fresh.worker.off('message', onMsg);
|
|
286
|
+
this.idle.push(fresh);
|
|
287
|
+
if (this.active)
|
|
288
|
+
this.pump();
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
fresh.worker.on('message', onMsg);
|
|
292
|
+
}
|
|
293
|
+
onWorkerCrash(handle, err) {
|
|
294
|
+
const job = handle.inflight;
|
|
295
|
+
handle.inflight = null;
|
|
296
|
+
if (job) {
|
|
297
|
+
const prior = this.attempts.get(job.seq) ?? 0;
|
|
298
|
+
const attempts = prior + 1;
|
|
299
|
+
this.attempts.set(job.seq, attempts);
|
|
300
|
+
if (attempts >= this.maxAttempts) {
|
|
301
|
+
// Give up on this seq — synthesize a parse-error so the dispatch can drain.
|
|
302
|
+
this.deliver(job.seq, {
|
|
303
|
+
kind: 'parse-error',
|
|
304
|
+
seq: job.seq,
|
|
305
|
+
hash: '',
|
|
306
|
+
lines: 0,
|
|
307
|
+
size: 0,
|
|
308
|
+
wasmResets: handle.wasmResets,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
// Retry on another worker.
|
|
313
|
+
this.pendingDispatch.push(job.seq);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (!this.terminated && this.active) {
|
|
317
|
+
this.respawnWorker(handle);
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
// Out-of-band crash — surface only if no active dispatch is going to swallow it.
|
|
321
|
+
if (this.active && !job)
|
|
322
|
+
this.active.reject(err);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
onWorkerMessage(handle, msg) {
|
|
326
|
+
if (msg.kind === 'ready' || msg.kind === 'shutdown-ack')
|
|
327
|
+
return;
|
|
328
|
+
const seq = msg.seq;
|
|
329
|
+
// Worker becomes idle again right away.
|
|
330
|
+
if (handle.inflight && handle.inflight.seq === seq)
|
|
331
|
+
handle.inflight = null;
|
|
332
|
+
if (!this.idle.includes(handle))
|
|
333
|
+
this.idle.push(handle);
|
|
334
|
+
if ('wasmResets' in msg) {
|
|
335
|
+
const total = msg.wasmResets;
|
|
336
|
+
const delta = Math.max(0, total - handle.wasmResets);
|
|
337
|
+
handle.wasmResets = total;
|
|
338
|
+
this._wasmResets += delta;
|
|
339
|
+
}
|
|
340
|
+
this.deliver(seq, msg);
|
|
341
|
+
}
|
|
342
|
+
deliver(seq, result) {
|
|
343
|
+
if (!this.active)
|
|
344
|
+
return; // late message after shutdown
|
|
345
|
+
if (seq === this.headSeq) {
|
|
346
|
+
this.invokeCallback(seq, result);
|
|
347
|
+
this.headSeq++;
|
|
348
|
+
// Drain any contiguous buffered successors.
|
|
349
|
+
while (this.buffered.has(this.headSeq)) {
|
|
350
|
+
const next = this.buffered.get(this.headSeq);
|
|
351
|
+
this.buffered.delete(this.headSeq);
|
|
352
|
+
this.invokeCallback(this.headSeq, next);
|
|
353
|
+
this.headSeq++;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
this.buffered.set(seq, result);
|
|
358
|
+
}
|
|
359
|
+
this.pump();
|
|
360
|
+
}
|
|
361
|
+
invokeCallback(seq, result) {
|
|
362
|
+
if (!this.active)
|
|
363
|
+
return;
|
|
364
|
+
const a = this.active;
|
|
365
|
+
const item = this.items[seq];
|
|
366
|
+
this.callbackChain = this.callbackChain.then(() => Promise.resolve(a.onResult(seq, result, item)));
|
|
367
|
+
// If the callback rejects, surface it through the active dispatch.
|
|
368
|
+
this.callbackChain = this.callbackChain.catch(err => {
|
|
369
|
+
if (this.active)
|
|
370
|
+
this.active.reject(err);
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
exports.WorkerPool = WorkerPool;
|
|
375
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
376
|
+
function defaultJobCount() {
|
|
377
|
+
// availableParallelism is the most accurate counter on cgroup-limited
|
|
378
|
+
// containers; fall back to cpus().length on older Node where it's missing.
|
|
379
|
+
const fn = os_1.default.availableParallelism;
|
|
380
|
+
const cores = typeof fn === 'function' ? fn() : os_1.default.cpus().length;
|
|
381
|
+
return Math.min(8, Math.max(1, cores - 1));
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=workerpool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerpool.js","sourceRoot":"","sources":["../../src/parser/workerpool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track-F SCIP import.
|
|
3
|
+
*
|
|
4
|
+
* Seer accepts SCIP-format precision indexes (https://github.com/sourcegraph/scip)
|
|
5
|
+
* as an ADDITIVE precision uplift over the tree-sitter baseline. A SCIP index
|
|
6
|
+
* carries precise definitions and references produced by a real type-aware
|
|
7
|
+
* indexer (rust-analyzer, scip-typescript, scip-java, etc.). Importing one
|
|
8
|
+
* lets Seer overlay precise edges where tree-sitter's syntactic heuristics
|
|
9
|
+
* were guessing.
|
|
10
|
+
*
|
|
11
|
+
* The import is source-labelled (`provenance = 'scip'`) so consumers can
|
|
12
|
+
* always see which signals came from SCIP vs which were tree-sitter's best
|
|
13
|
+
* effort. Tree-sitter rows are never deleted by a SCIP import; when a SCIP
|
|
14
|
+
* symbol overlaps an existing tree-sitter row at the same file/line/kind, the
|
|
15
|
+
* tree-sitter row is re-labeled `'scip-merge'` (precision confirmed) and
|
|
16
|
+
* SCIP edges target its existing id.
|
|
17
|
+
*
|
|
18
|
+
* Format support:
|
|
19
|
+
* - .scip : binary protobuf (the canonical SCIP format)
|
|
20
|
+
* - .scip.json : Seer's JSON envelope mirroring the protobuf shape. Many
|
|
21
|
+
* SCIP producers can dump JSON directly; the schema is also
|
|
22
|
+
* easy to hand-author for testing and migration scripts.
|
|
23
|
+
*
|
|
24
|
+
* The JSON envelope is the SUBSET of SCIP that Seer actually consumes — we
|
|
25
|
+
* don't carry hover-doc payloads or signature_documentation because Seer
|
|
26
|
+
* doesn't surface them. Adding more fields later is purely additive: a
|
|
27
|
+
* consumer that doesn't recognize a field ignores it.
|
|
28
|
+
*/
|
|
29
|
+
export type ScipSymbolKind = 'function' | 'method' | 'constructor' | 'class' | 'interface' | 'struct' | 'enum' | 'type' | 'variable';
|
|
30
|
+
export interface ScipSymbol {
|
|
31
|
+
/**
|
|
32
|
+
* Globally unique SCIP symbol id. Opaque string; the importer never parses
|
|
33
|
+
* it — it's just a primary key for cross-document references.
|
|
34
|
+
*/
|
|
35
|
+
symbolId: string;
|
|
36
|
+
displayName: string;
|
|
37
|
+
/** Optional dotted qualified name (e.g. `auth.AuthService.login`). */
|
|
38
|
+
qualifiedName?: string;
|
|
39
|
+
kind: ScipSymbolKind;
|
|
40
|
+
/** Repo-relative file path. */
|
|
41
|
+
relativePath: string;
|
|
42
|
+
/** 0-indexed source range. */
|
|
43
|
+
range: {
|
|
44
|
+
startLine: number;
|
|
45
|
+
startCharacter: number;
|
|
46
|
+
endLine: number;
|
|
47
|
+
endCharacter: number;
|
|
48
|
+
};
|
|
49
|
+
signature?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface ScipOccurrence {
|
|
52
|
+
/** SCIP symbol id being referenced. */
|
|
53
|
+
symbolId: string;
|
|
54
|
+
relativePath: string;
|
|
55
|
+
range: {
|
|
56
|
+
startLine: number;
|
|
57
|
+
startCharacter: number;
|
|
58
|
+
endLine: number;
|
|
59
|
+
endCharacter: number;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* 'definition' for the canonical defining occurrence (one per symbol),
|
|
63
|
+
* 'reference' for every other use site.
|
|
64
|
+
*/
|
|
65
|
+
role: 'definition' | 'reference';
|
|
66
|
+
}
|
|
67
|
+
export interface ScipDocument {
|
|
68
|
+
/**
|
|
69
|
+
* Repo-relative path the document covers. Symbol/occurrence rows can also
|
|
70
|
+
* carry their own relativePath, but the doc-level one is the default.
|
|
71
|
+
*/
|
|
72
|
+
relativePath: string;
|
|
73
|
+
symbols: ScipSymbol[];
|
|
74
|
+
occurrences: ScipOccurrence[];
|
|
75
|
+
}
|
|
76
|
+
export interface ScipIndex {
|
|
77
|
+
/** Producer identifier — e.g. `scip-typescript 0.3.5`. */
|
|
78
|
+
tool?: string;
|
|
79
|
+
/** Absolute project root used by the producer (informational). */
|
|
80
|
+
projectRoot?: string;
|
|
81
|
+
/**
|
|
82
|
+
* Documents keyed by repo-relative path. The same shape SCIP uses, just
|
|
83
|
+
* flattened for ergonomic JSON authoring.
|
|
84
|
+
*/
|
|
85
|
+
documents: ScipDocument[];
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/scip/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,cAAc,GACtB,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,OAAO,GAC/C,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5F;;;OAGG;IACH,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Track-F SCIP import.
|
|
4
|
+
*
|
|
5
|
+
* Seer accepts SCIP-format precision indexes (https://github.com/sourcegraph/scip)
|
|
6
|
+
* as an ADDITIVE precision uplift over the tree-sitter baseline. A SCIP index
|
|
7
|
+
* carries precise definitions and references produced by a real type-aware
|
|
8
|
+
* indexer (rust-analyzer, scip-typescript, scip-java, etc.). Importing one
|
|
9
|
+
* lets Seer overlay precise edges where tree-sitter's syntactic heuristics
|
|
10
|
+
* were guessing.
|
|
11
|
+
*
|
|
12
|
+
* The import is source-labelled (`provenance = 'scip'`) so consumers can
|
|
13
|
+
* always see which signals came from SCIP vs which were tree-sitter's best
|
|
14
|
+
* effort. Tree-sitter rows are never deleted by a SCIP import; when a SCIP
|
|
15
|
+
* symbol overlaps an existing tree-sitter row at the same file/line/kind, the
|
|
16
|
+
* tree-sitter row is re-labeled `'scip-merge'` (precision confirmed) and
|
|
17
|
+
* SCIP edges target its existing id.
|
|
18
|
+
*
|
|
19
|
+
* Format support:
|
|
20
|
+
* - .scip : binary protobuf (the canonical SCIP format)
|
|
21
|
+
* - .scip.json : Seer's JSON envelope mirroring the protobuf shape. Many
|
|
22
|
+
* SCIP producers can dump JSON directly; the schema is also
|
|
23
|
+
* easy to hand-author for testing and migration scripts.
|
|
24
|
+
*
|
|
25
|
+
* The JSON envelope is the SUBSET of SCIP that Seer actually consumes — we
|
|
26
|
+
* don't carry hover-doc payloads or signature_documentation because Seer
|
|
27
|
+
* doesn't surface them. Adding more fields later is purely additive: a
|
|
28
|
+
* consumer that doesn't recognize a field ignores it.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/scip/format.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Store } from '../db/store.js';
|
|
2
|
+
export interface ScipImportOptions {
|
|
3
|
+
/** Workspace root — used to resolve SCIP relativePaths to absolute paths. */
|
|
4
|
+
repoRoot: string;
|
|
5
|
+
/** Logger; defaults to no-op. */
|
|
6
|
+
log?: (msg: string) => void;
|
|
7
|
+
/**
|
|
8
|
+
* Skip ALL inserts for files that aren't already indexed by tree-sitter.
|
|
9
|
+
* Default true: SCIP precision is meant to enhance the existing index, not
|
|
10
|
+
* to introduce phantom symbols for files Seer can't see (e.g. a SCIP that
|
|
11
|
+
* covers `vendor/` we deliberately skipped). Set false to widen.
|
|
12
|
+
*/
|
|
13
|
+
requireFileInIndex?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ScipImportResult {
|
|
16
|
+
path: string;
|
|
17
|
+
sha256: string;
|
|
18
|
+
tool: string | null;
|
|
19
|
+
documentsProcessed: number;
|
|
20
|
+
symbolsInserted: number;
|
|
21
|
+
symbolsMerged: number;
|
|
22
|
+
edgesInserted: number;
|
|
23
|
+
filesMissing: number;
|
|
24
|
+
elapsedMs: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Import a SCIP index into the Store, layering precise SCIP symbols and
|
|
28
|
+
* references over the existing tree-sitter graph. Tree-sitter rows are never
|
|
29
|
+
* deleted; SCIP symbols with the same file/line/kind/qualified-name as an
|
|
30
|
+
* existing row reuse its id (and the existing row is re-labeled 'scip-merge').
|
|
31
|
+
*
|
|
32
|
+
* The import is idempotent on the (path, sha256) pair: re-importing the exact
|
|
33
|
+
* same file is a no-op. Re-importing the same path with new content clears
|
|
34
|
+
* the SCIP-sourced rows for that path first.
|
|
35
|
+
*/
|
|
36
|
+
export declare function importScip(scipPath: string, store: Store, options: ScipImportOptions): Promise<ScipImportResult>;
|
|
37
|
+
//# sourceMappingURL=import.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../src/scip/import.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAIvC,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,GACzD,OAAO,CAAC,gBAAgB,CAAC,CAwJ3B"}
|