@backbencher/brain 0.0.0-stage → 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/CHANGELOG.md +298 -0
- package/EMBEDDINGS.md +355 -0
- package/LICENSE +21 -0
- package/README.md +415 -2
- package/bin/bb +13 -0
- package/dist/analysis-exclusions-7ZJDXOVZ.js +35 -0
- package/dist/brain-index-health-KY7K552E.js +17 -0
- package/dist/brain-relationship-enrichment-QH7OOHUF.js +558 -0
- package/dist/brain.sql-EIM4WS4D.js +29 -0
- package/dist/chunk-2BSKD7O3.js +40 -0
- package/dist/chunk-2DE27DVC.js +1314 -0
- package/dist/chunk-2RRBMNBQ.js +322 -0
- package/dist/chunk-2RTN2DFU.js +711 -0
- package/dist/chunk-2WXYNLBA.js +29 -0
- package/dist/chunk-3CTFIJJB.js +17 -0
- package/dist/chunk-3LFTSMIV.js +174 -0
- package/dist/chunk-47HKX4AJ.js +930 -0
- package/dist/chunk-4H22TLOT.js +543 -0
- package/dist/chunk-5SD45FLC.js +818 -0
- package/dist/chunk-66A5ZFYA.js +1758 -0
- package/dist/chunk-6AIRWAO2.js +247 -0
- package/dist/chunk-6WNGD3NN.js +196 -0
- package/dist/chunk-7AN7U5IZ.js +371 -0
- package/dist/chunk-BHB7BYYI.js +626 -0
- package/dist/chunk-BQ3OVQ3P.js +125 -0
- package/dist/chunk-CW4XXSNN.js +1479 -0
- package/dist/chunk-D2Q4Y47A.js +53 -0
- package/dist/chunk-DIYAGQJL.js +34 -0
- package/dist/chunk-DYM4FQEE.js +90 -0
- package/dist/chunk-EWMWK7WN.js +75 -0
- package/dist/chunk-FVVQTSIM.js +3427 -0
- package/dist/chunk-FWSL4VG6.js +1290 -0
- package/dist/chunk-GBI7V7KY.js +69 -0
- package/dist/chunk-GEFFO6O2.js +152 -0
- package/dist/chunk-HOWAQXJO.js +236 -0
- package/dist/chunk-HQSPJDHI.js +613 -0
- package/dist/chunk-IFZNR5UJ.js +2863 -0
- package/dist/chunk-J4PMBXQQ.js +336 -0
- package/dist/chunk-KAET47ZL.js +125 -0
- package/dist/chunk-KCDECRJY.js +440 -0
- package/dist/chunk-KLK3PBTO.js +1119 -0
- package/dist/chunk-L5TDYKYK.js +76 -0
- package/dist/chunk-MLKGABMK.js +9 -0
- package/dist/chunk-OWISBAOF.js +61 -0
- package/dist/chunk-PJTNGD3Z.js +6924 -0
- package/dist/chunk-QLK6ED4Q.js +235 -0
- package/dist/chunk-R2GW4F6R.js +19 -0
- package/dist/chunk-RCMTFSEF.js +87 -0
- package/dist/chunk-RH7KC5HU.js +12050 -0
- package/dist/chunk-RM3PY6TG.js +376 -0
- package/dist/chunk-ROMM6KMC.js +433 -0
- package/dist/chunk-SK6YVHFZ.js +211 -0
- package/dist/chunk-SM7RFQRO.js +214 -0
- package/dist/chunk-UFE77L67.js +782 -0
- package/dist/chunk-UGR4QIGS.js +67 -0
- package/dist/chunk-UUNHHX4M.js +13 -0
- package/dist/chunk-V44PGPA6.js +2104 -0
- package/dist/chunk-VL52PL2T.js +71 -0
- package/dist/chunk-VURYFIHW.js +201 -0
- package/dist/chunk-XJKJYIPP.js +7436 -0
- package/dist/chunk-YI6FF2ZR.js +340 -0
- package/dist/cli/index.js +37 -0
- package/dist/config-HZAAYDP3.js +10 -0
- package/dist/content-search-642F7E5V.js +593 -0
- package/dist/database-TCTZDLE5.js +9 -0
- package/dist/doctor-GXCKSJOX.js +395 -0
- package/dist/edit-engine-KM7MPFEC.js +51 -0
- package/dist/engine-42TZFNIZ.js +11 -0
- package/dist/engine-LO6L4JLQ.js +18 -0
- package/dist/fingerprint-XDXFRWO6.js +33 -0
- package/dist/framework-intelligence-DWFCKV44.js +860 -0
- package/dist/freshness-3K6VU5OT.js +174 -0
- package/dist/graph-engine-PL5YA7BA.js +21 -0
- package/dist/graph_request-MM4REP6H.js +350 -0
- package/dist/impact_request-WDE47IZ5.js +68 -0
- package/dist/index-space-IUUN5WYV.js +15 -0
- package/dist/index-status-6BD7UBHR.js +34 -0
- package/dist/index.js +159 -0
- package/dist/instance-FO6QZRLH.js +19 -0
- package/dist/language-detection-DFCAU5DZ.js +11 -0
- package/dist/lsp/server.js +4301 -0
- package/dist/mcp/server.js +132 -0
- package/dist/onboard-DIQZV2NW.js +161 -0
- package/dist/override-companion-pass-XR7MHTP7.js +117 -0
- package/dist/parallel-indexer-4PW3AFXP.js +88 -0
- package/dist/pool-worker.js +1153 -0
- package/dist/project-health-ZS5TS2Z6.js +94 -0
- package/dist/project-index-5SDPHITE.js +57 -0
- package/dist/project-registry-DGZBIZS7.js +355 -0
- package/dist/real-bash-analyzer-SXSV67E2.js +2201 -0
- package/dist/real-c-analyzer-SY7FTZ6W.js +5942 -0
- package/dist/real-clean-analyzer-IGDHHLZK.js +3470 -0
- package/dist/real-clojure-analyzer-4OH7IWLB.js +2818 -0
- package/dist/real-cpp-analyzer-7LTDRJRJ.js +4101 -0
- package/dist/real-csharp-analyzer-KICU3TLH.js +3298 -0
- package/dist/real-css-analyzer-HPU277Q6.js +15 -0
- package/dist/real-dart-analyzer-7LZ5LCMW.js +3944 -0
- package/dist/real-elixir-analyzer-BE3MEVZO.js +2192 -0
- package/dist/real-erlang-analyzer-BZMAKYBK.js +1731 -0
- package/dist/real-fsharp-analyzer-5QLTOV3E.js +2390 -0
- package/dist/real-go-analyzer-POD7MZQR.js +4126 -0
- package/dist/real-graphql-analyzer-MAQRZ6QW.js +1442 -0
- package/dist/real-groovy-analyzer-MEWSUPMJ.js +2285 -0
- package/dist/real-haskell-analyzer-I5L2GR3Y.js +2533 -0
- package/dist/real-hcl-analyzer-DBOPXSWJ.js +725 -0
- package/dist/real-html-analyzer-O63XZLZD.js +1759 -0
- package/dist/real-java-analyzer-CHCW3EKA.js +4677 -0
- package/dist/real-javascript-analyzer-QAAJQYZE.js +14 -0
- package/dist/real-json-analyzer-UGBR7YQN.js +1640 -0
- package/dist/real-julia-analyzer-35Q4GHOZ.js +2085 -0
- package/dist/real-kotlin-analyzer-GRAYCWW2.js +3956 -0
- package/dist/real-lua-analyzer-5BAPDZDF.js +1957 -0
- package/dist/real-makefile-analyzer-YJKAHNAS.js +920 -0
- package/dist/real-markdown-analyzer-UKUQZO4F.js +1215 -0
- package/dist/real-matlab-analyzer-FVIKQZKG.js +480 -0
- package/dist/real-nim-analyzer-M7FAIABG.js +3603 -0
- package/dist/real-objective-c-analyzer-XMYQIGQI.js +1518 -0
- package/dist/real-perl-analyzer-ZLY6M2DZ.js +1865 -0
- package/dist/real-php-analyzer-KI2ZAM7X.js +9368 -0
- package/dist/real-powershell-analyzer-B3T5ZP6U.js +2915 -0
- package/dist/real-protobuf-analyzer-23OZ75XV.js +867 -0
- package/dist/real-python-analyzer-I4TIUB6D.js +4880 -0
- package/dist/real-r-analyzer-FJZJXXS6.js +2596 -0
- package/dist/real-ruby-analyzer-M3UFIVTQ.js +2429 -0
- package/dist/real-rust-analyzer-LVSONPAN.js +3359 -0
- package/dist/real-scala-analyzer-CWPI33Q2.js +3293 -0
- package/dist/real-scss-analyzer-TGRJQ7TH.js +1515 -0
- package/dist/real-solidity-analyzer-4P2VBVWA.js +2608 -0
- package/dist/real-sql-analyzer-J7DYZOZR.js +3840 -0
- package/dist/real-svelte-analyzer-NHEN2SX5.js +2532 -0
- package/dist/real-swift-analyzer-2NSYULWI.js +2311 -0
- package/dist/real-toml-analyzer-L3C66L7Q.js +929 -0
- package/dist/real-typescript-analyzer-FTC6ETRQ.js +14 -0
- package/dist/real-vb-analyzer-ORY7LAQS.js +3145 -0
- package/dist/real-vba-analyzer-JH2TTUFI.js +466 -0
- package/dist/real-vue-analyzer-OO4FUGBV.js +2680 -0
- package/dist/real-xml-analyzer-6CQVR477.js +2405 -0
- package/dist/real-yaml-analyzer-J6MQG3YX.js +3528 -0
- package/dist/real-zig-analyzer-EFKCPJNU.js +2430 -0
- package/dist/regex-search-OPTLKUN5.js +239 -0
- package/dist/rules-I453JTRC.js +152 -0
- package/dist/scoped-path-MJYWJZQX.js +11 -0
- package/dist/setup-show-Y5GB5KXA.js +15 -0
- package/dist/setup-wizard-G5YYR5T6.js +24 -0
- package/dist/symbol-search-KB4MU4SI.js +16 -0
- package/dist/taint-YOTN5X55.js +202 -0
- package/dist/taint-analyzer-N7YLZU3N.js +163 -0
- package/dist/tool-handlers-G4NAGJIH.js +72 -0
- package/dist/tool-registry-BPEJNSZG.js +17 -0
- package/dist/tool-validation-RF675A3C.js +32 -0
- package/dist/type-inference-4Y7WTMFE.js +13 -0
- package/dist/vector-binary-LMY4QGAN.js +19 -0
- package/dist/version-LXGNFO37.js +9 -0
- package/dist/wasm-NMWO3WXY.js +16 -0
- package/docs/EMBEDDINGS.md +132 -0
- package/docs/README.md +178 -0
- package/docs/data/m10-baseline.json +602 -0
- package/docs/data/m10-benchmark-baseline.json +57 -0
- package/docs/data/m10-benchmark-last-run.json +127 -0
- package/docs/data/m10-final-audit.json +215 -0
- package/docs/data/m12-final-audit.json +138 -0
- package/docs/data/m12-surface-matrix.json +50 -0
- package/docs/data/public-tools.json +1902 -0
- package/docs/indexing/DEAD-ASSETS.md +88 -0
- package/docs/indexing/INDEXER-REVIEW.md +634 -0
- package/docs/indexing/PERFORMANCE-FINDINGS.md +106 -0
- package/docs/indexing/README.md +427 -0
- package/docs/indexing/discovery-matrix.md +41 -0
- package/docs/indexing/embeddings.md +325 -0
- package/docs/indexing/environment-variables.md +77 -0
- package/docs/indexing/performance.md +323 -0
- package/docs/indexing/resume.md +345 -0
- package/docs/indexing/troubleshooting.md +391 -0
- package/docs/man/bb.1 +190 -0
- package/docs/tools/bb_analyze.md +147 -0
- package/docs/tools/bb_annotate.md +110 -0
- package/docs/tools/bb_annotations.md +106 -0
- package/docs/tools/bb_ask.md +101 -0
- package/docs/tools/bb_cross_language.md +103 -0
- package/docs/tools/bb_doc.md +169 -0
- package/docs/tools/bb_edit.md +185 -0
- package/docs/tools/bb_graph.md +169 -0
- package/docs/tools/bb_health.md +156 -0
- package/docs/tools/bb_impact.md +117 -0
- package/docs/tools/bb_index.md +108 -0
- package/docs/tools/bb_migrate.md +135 -0
- package/docs/tools/bb_patterns.md +140 -0
- package/docs/tools/bb_search.md +150 -0
- package/docs/tools/bb_security.md +100 -0
- package/docs/tools/bb_visualize.md +184 -0
- package/grammars/README.md +57 -0
- package/grammars/THIRD-PARTY-NOTICES.md +50 -0
- package/grammars/tree-sitter-c/LICENSE +21 -0
- package/grammars/tree-sitter-clojure/LICENSE.md +21 -0
- package/grammars/tree-sitter-cpp/LICENSE +21 -0
- package/grammars/tree-sitter-csharp/LICENSE +21 -0
- package/grammars/tree-sitter-css/LICENSE +21 -0
- package/grammars/tree-sitter-css/README.md +21 -0
- package/grammars/tree-sitter-dart/LICENSE +20 -0
- package/grammars/tree-sitter-dart-upstream/LICENSE +20 -0
- package/grammars/tree-sitter-dart-upstream/README.md +18 -0
- package/grammars/tree-sitter-elixir/LICENSE +176 -0
- package/grammars/tree-sitter-elixir/README.md +11 -0
- package/grammars/tree-sitter-fsharp/LICENSE +21 -0
- package/grammars/tree-sitter-fsharp/README.md +45 -0
- package/grammars/tree-sitter-graphql/LICENSE +21 -0
- package/grammars/tree-sitter-graphql/README.md +106 -0
- package/grammars/tree-sitter-groovy/LICENSE +21 -0
- package/grammars/tree-sitter-groovy/README.md +4 -0
- package/grammars/tree-sitter-haskell/LICENSE +21 -0
- package/grammars/tree-sitter-haskell/README.md +394 -0
- package/grammars/tree-sitter-hcl/CHANGELOG.md +102 -0
- package/grammars/tree-sitter-hcl/LICENSE +201 -0
- package/grammars/tree-sitter-hcl/README.md +39 -0
- package/grammars/tree-sitter-html/LICENSE +21 -0
- package/grammars/tree-sitter-html/README.md +21 -0
- package/grammars/tree-sitter-julia/LICENSE +21 -0
- package/grammars/tree-sitter-julia/README.md +24 -0
- package/grammars/tree-sitter-kotlin/LICENSE +9 -0
- package/grammars/tree-sitter-lua/LICENSE.md +21 -0
- package/grammars/tree-sitter-lua/README.md +29 -0
- package/grammars/tree-sitter-make/LICENSE +21 -0
- package/grammars/tree-sitter-matlab/LICENSE +19 -0
- package/grammars/tree-sitter-matlab/README.md +99 -0
- package/grammars/tree-sitter-nim/LICENSE +373 -0
- package/grammars/tree-sitter-nim/README.md +46 -0
- package/grammars/tree-sitter-objc/LICENSE +21 -0
- package/grammars/tree-sitter-objc/README.md +20 -0
- package/grammars/tree-sitter-perl/LICENSE +7 -0
- package/grammars/tree-sitter-perl/README.md +100 -0
- package/grammars/tree-sitter-powershell/LICENSE +21 -0
- package/grammars/tree-sitter-powershell/README.md +7 -0
- package/grammars/tree-sitter-proto/LICENSE +21 -0
- package/grammars/tree-sitter-proto/README.md +105 -0
- package/grammars/tree-sitter-r/LICENSE +9 -0
- package/grammars/tree-sitter-r/README.md +66 -0
- package/grammars/tree-sitter-ruby/LICENSE +22 -0
- package/grammars/tree-sitter-scss/LICENSE +21 -0
- package/grammars/tree-sitter-scss/README.md +17 -0
- package/grammars/tree-sitter-solidity/LICENSE +7 -0
- package/grammars/tree-sitter-sql/LICENSE +21 -0
- package/grammars/tree-sitter-typescript/LICENSE +21 -0
- package/grammars/tree-sitter-vba/LICENSE +21 -0
- package/grammars/tree-sitter-vba/README.md +738 -0
- package/grammars/tree-sitter-vbnet/LICENSE +21 -0
- package/grammars/tree-sitter-vbnet/README.md +322 -0
- package/grammars/tree-sitter-xml/LICENSE +19 -0
- package/grammars/tree-sitter-yaml/LICENSE +20 -0
- package/grammars/tree-sitter-yaml/README.md +21 -0
- package/package.json +184 -4
- package/wasm/dart.wasm +0 -0
- package/wasm/tree-sitter-bash.wasm +0 -0
- package/wasm/tree-sitter-c.wasm +0 -0
- package/wasm/tree-sitter-c_sharp.wasm +0 -0
- package/wasm/tree-sitter-clean.wasm +0 -0
- package/wasm/tree-sitter-clojure.wasm +0 -0
- package/wasm/tree-sitter-core_schema.wasm +0 -0
- package/wasm/tree-sitter-cpp.wasm +0 -0
- package/wasm/tree-sitter-css.wasm +0 -0
- package/wasm/tree-sitter-dart.wasm +0 -0
- package/wasm/tree-sitter-elisp.wasm +0 -0
- package/wasm/tree-sitter-elixir.wasm +0 -0
- package/wasm/tree-sitter-elm.wasm +0 -0
- package/wasm/tree-sitter-embedded_template.wasm +0 -0
- package/wasm/tree-sitter-erlang.wasm +0 -0
- package/wasm/tree-sitter-fsharp.wasm +0 -0
- package/wasm/tree-sitter-fsharp_signature.wasm +0 -0
- package/wasm/tree-sitter-go.wasm +0 -0
- package/wasm/tree-sitter-graphql.wasm +0 -0
- package/wasm/tree-sitter-groovy.wasm +0 -0
- package/wasm/tree-sitter-haskell.wasm +0 -0
- package/wasm/tree-sitter-hcl.wasm +0 -0
- package/wasm/tree-sitter-html.wasm +0 -0
- package/wasm/tree-sitter-java.wasm +0 -0
- package/wasm/tree-sitter-javascript.wasm +0 -0
- package/wasm/tree-sitter-json.wasm +0 -0
- package/wasm/tree-sitter-json_schema.wasm +0 -0
- package/wasm/tree-sitter-julia.wasm +0 -0
- package/wasm/tree-sitter-kotlin.wasm +0 -0
- package/wasm/tree-sitter-lua.wasm +0 -0
- package/wasm/tree-sitter-make.wasm +0 -0
- package/wasm/tree-sitter-markdown.wasm +0 -0
- package/wasm/tree-sitter-markdown_inline.wasm +0 -0
- package/wasm/tree-sitter-matlab.wasm +0 -0
- package/wasm/tree-sitter-nim.wasm +0 -0
- package/wasm/tree-sitter-objc.wasm +0 -0
- package/wasm/tree-sitter-ocaml.wasm +0 -0
- package/wasm/tree-sitter-perl.wasm +0 -0
- package/wasm/tree-sitter-php.wasm +0 -0
- package/wasm/tree-sitter-php_only.wasm +0 -0
- package/wasm/tree-sitter-powershell.wasm +0 -0
- package/wasm/tree-sitter-protobuf.wasm +0 -0
- package/wasm/tree-sitter-python.wasm +0 -0
- package/wasm/tree-sitter-ql.wasm +0 -0
- package/wasm/tree-sitter-r.wasm +0 -0
- package/wasm/tree-sitter-rescript.wasm +0 -0
- package/wasm/tree-sitter-ruby.wasm +0 -0
- package/wasm/tree-sitter-rust.wasm +0 -0
- package/wasm/tree-sitter-scala.wasm +0 -0
- package/wasm/tree-sitter-scss.wasm +0 -0
- package/wasm/tree-sitter-solidity.wasm +0 -0
- package/wasm/tree-sitter-sql.wasm +0 -0
- package/wasm/tree-sitter-svelte.wasm +0 -0
- package/wasm/tree-sitter-swift.wasm +0 -0
- package/wasm/tree-sitter-systemrdl.wasm +0 -0
- package/wasm/tree-sitter-terraform.wasm +0 -0
- package/wasm/tree-sitter-tlaplus.wasm +0 -0
- package/wasm/tree-sitter-toml.wasm +0 -0
- package/wasm/tree-sitter-tsx.wasm +0 -0
- package/wasm/tree-sitter-typescript.wasm +0 -0
- package/wasm/tree-sitter-vba.wasm +0 -0
- package/wasm/tree-sitter-vbnet.wasm +0 -0
- package/wasm/tree-sitter-vue.wasm +0 -0
- package/wasm/tree-sitter-xml.wasm +0 -0
- package/wasm/tree-sitter-yaml.wasm +0 -0
- package/wasm/tree-sitter-zig.wasm +0 -0
- package/wasm/tree-sitter.wasm +0 -0
- package/wasm/tsx.wasm +0 -0
- package/wasm/typescript.wasm +0 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// src/lsp/identity.ts
|
|
2
|
+
var IDENTITY_TRAVERSABLE_TYPES = [
|
|
3
|
+
"function",
|
|
4
|
+
"method",
|
|
5
|
+
"class",
|
|
6
|
+
"interface",
|
|
7
|
+
"trait",
|
|
8
|
+
"struct",
|
|
9
|
+
"enum",
|
|
10
|
+
"macro"
|
|
11
|
+
];
|
|
12
|
+
function memberFileMatches(hint, stored) {
|
|
13
|
+
const h = hint.replace(/\\/g, "/");
|
|
14
|
+
const s = stored.replace(/\\/g, "/");
|
|
15
|
+
if (h === s) return true;
|
|
16
|
+
return h.endsWith("/" + s);
|
|
17
|
+
}
|
|
18
|
+
function resolveMemberIdentity(db, projectId, symbolName, fileHint) {
|
|
19
|
+
try {
|
|
20
|
+
const TRAVERSABLE = IDENTITY_TRAVERSABLE_TYPES;
|
|
21
|
+
const memberRows = db.prepare(
|
|
22
|
+
`SELECT s.id, s.name, s.symbol_type AS symbolType, s.owner_symbol_id AS ownerId,
|
|
23
|
+
COALESCE(f.relative_path, f.path, '') AS file
|
|
24
|
+
FROM brain_symbol s LEFT JOIN brain_file f ON f.id = s.file_id
|
|
25
|
+
WHERE s.project_id = ? AND s.name = ?`
|
|
26
|
+
).all(projectId, symbolName);
|
|
27
|
+
let member = memberRows[0];
|
|
28
|
+
if (memberRows.length > 1) {
|
|
29
|
+
if (!fileHint) return null;
|
|
30
|
+
const narrowed = memberRows.filter((r) => memberFileMatches(fileHint, r.file));
|
|
31
|
+
if (narrowed.length !== 1) return null;
|
|
32
|
+
member = narrowed[0];
|
|
33
|
+
}
|
|
34
|
+
if (!member) return null;
|
|
35
|
+
if (TRAVERSABLE.includes(member.symbolType)) return null;
|
|
36
|
+
const inbound = db.prepare(
|
|
37
|
+
`SELECT COUNT(*) AS c FROM brain_relationship
|
|
38
|
+
WHERE project_id = ? AND target_symbol_id = ?
|
|
39
|
+
AND relationship_type IN ('calls','instantiates','extends','implements')`
|
|
40
|
+
).get(projectId, member.id);
|
|
41
|
+
if (typeof inbound?.c === "number" && inbound.c > 0) return null;
|
|
42
|
+
if (!member.ownerId) return null;
|
|
43
|
+
const ownerRows = db.prepare(
|
|
44
|
+
`SELECT s.id, s.name, s.symbol_type AS symbolType,
|
|
45
|
+
COALESCE(f.relative_path, f.path, '') AS file
|
|
46
|
+
FROM brain_symbol s LEFT JOIN brain_file f ON f.id = s.file_id
|
|
47
|
+
WHERE s.project_id = ? AND s.id = ?`
|
|
48
|
+
).all(projectId, member.ownerId);
|
|
49
|
+
if (ownerRows.length !== 1) return null;
|
|
50
|
+
const owner = ownerRows[0];
|
|
51
|
+
if (!TRAVERSABLE.includes(owner.symbolType)) return null;
|
|
52
|
+
return { id: owner.id, name: owner.name, file: owner.file };
|
|
53
|
+
} catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function memberResolutionRecord(requestedName, ownerName, fileHint) {
|
|
58
|
+
return {
|
|
59
|
+
through: "owning-declaration",
|
|
60
|
+
memberName: requestedName,
|
|
61
|
+
ownerName,
|
|
62
|
+
...fileHint ? { memberFile: fileHint } : {}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export {
|
|
67
|
+
IDENTITY_TRAVERSABLE_TYPES,
|
|
68
|
+
memberFileMatches,
|
|
69
|
+
resolveMemberIdentity,
|
|
70
|
+
memberResolutionRecord
|
|
71
|
+
};
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BrainDatabase
|
|
3
|
+
} from "./chunk-KLK3PBTO.js";
|
|
4
|
+
import {
|
|
5
|
+
bbDataDir
|
|
6
|
+
} from "./chunk-2BSKD7O3.js";
|
|
7
|
+
|
|
8
|
+
// src/ast/index-status.ts
|
|
9
|
+
import {
|
|
10
|
+
mkdirSync,
|
|
11
|
+
writeFileSync,
|
|
12
|
+
readFileSync,
|
|
13
|
+
existsSync,
|
|
14
|
+
rmSync,
|
|
15
|
+
renameSync,
|
|
16
|
+
openSync,
|
|
17
|
+
fsyncSync,
|
|
18
|
+
closeSync
|
|
19
|
+
} from "fs";
|
|
20
|
+
import path from "path";
|
|
21
|
+
var INDEX_STATUS_SCHEMA_VERSION = 2;
|
|
22
|
+
var INDEX_RUN_PHASES = ["indexing", "post-processing", "complete", "failed", "cancelled"];
|
|
23
|
+
var RESUMABLE_PHASES = ["indexing", "cancelled"];
|
|
24
|
+
var TERMINAL_PHASES = ["complete", "failed", "cancelled"];
|
|
25
|
+
function statusPath(projectId) {
|
|
26
|
+
return path.join(bbDataDir(), "status", `${projectId}.json`);
|
|
27
|
+
}
|
|
28
|
+
function statusTempPath(projectId) {
|
|
29
|
+
return `${statusPath(projectId)}.tmp`;
|
|
30
|
+
}
|
|
31
|
+
function writeStatusAtomically(projectId, contents) {
|
|
32
|
+
const target = statusPath(projectId);
|
|
33
|
+
const tmp = statusTempPath(projectId);
|
|
34
|
+
mkdirSync(path.dirname(target), { recursive: true });
|
|
35
|
+
writeFileSync(tmp, contents);
|
|
36
|
+
if (process.env.BB_STATUS_FSYNC === "1") {
|
|
37
|
+
try {
|
|
38
|
+
const fd = openSync(tmp, "r");
|
|
39
|
+
try {
|
|
40
|
+
fsyncSync(fd);
|
|
41
|
+
} finally {
|
|
42
|
+
closeSync(fd);
|
|
43
|
+
}
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
renameSync(tmp, target);
|
|
48
|
+
}
|
|
49
|
+
function writeLiveStatus(projectId, live) {
|
|
50
|
+
try {
|
|
51
|
+
writeStatusAtomically(projectId, JSON.stringify({ ...live, schemaVersion: INDEX_STATUS_SCHEMA_VERSION, updatedAt: Date.now() }));
|
|
52
|
+
} catch {
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function readIndexCheckpoint(projectId) {
|
|
56
|
+
const file = statusPath(projectId);
|
|
57
|
+
let raw;
|
|
58
|
+
try {
|
|
59
|
+
if (!existsSync(file)) {
|
|
60
|
+
return { integrity: "missing", file, problem: "no status file: this project has no recorded index run" };
|
|
61
|
+
}
|
|
62
|
+
raw = readFileSync(file, "utf8");
|
|
63
|
+
} catch (e) {
|
|
64
|
+
return { integrity: "corrupt", file, problem: `status file could not be read: ${e?.message ?? e}` };
|
|
65
|
+
}
|
|
66
|
+
if (raw.trim() === "") {
|
|
67
|
+
return { integrity: "corrupt", file, problem: "status file is empty \u2014 a run was interrupted while writing it" };
|
|
68
|
+
}
|
|
69
|
+
let parsed;
|
|
70
|
+
try {
|
|
71
|
+
parsed = JSON.parse(raw);
|
|
72
|
+
} catch (e) {
|
|
73
|
+
return { integrity: "corrupt", file, problem: `status file is not valid JSON (${e?.message ?? e}) \u2014 a run was interrupted while writing it` };
|
|
74
|
+
}
|
|
75
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
76
|
+
return { integrity: "corrupt", file, problem: "status file is not a status document" };
|
|
77
|
+
}
|
|
78
|
+
const version = typeof parsed.schemaVersion === "number" ? parsed.schemaVersion : 1;
|
|
79
|
+
if (version > INDEX_STATUS_SCHEMA_VERSION) {
|
|
80
|
+
return {
|
|
81
|
+
integrity: "future-schema",
|
|
82
|
+
file,
|
|
83
|
+
problem: `status file schema v${version} is newer than this bb understands (v${INDEX_STATUS_SCHEMA_VERSION}); not interpreted`
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (typeof parsed.phase !== "string" || typeof parsed.updatedAt !== "number") {
|
|
87
|
+
return { integrity: "incomplete", file, problem: "status file has no phase/update timestamp" };
|
|
88
|
+
}
|
|
89
|
+
const status = {
|
|
90
|
+
...parsed,
|
|
91
|
+
schemaVersion: version,
|
|
92
|
+
phase: parsed.phase,
|
|
93
|
+
projectId: typeof parsed.projectId === "string" ? parsed.projectId : projectId,
|
|
94
|
+
processedFiles: typeof parsed.processedFiles === "number" ? parsed.processedFiles : 0,
|
|
95
|
+
totalFiles: typeof parsed.totalFiles === "number" ? parsed.totalFiles : 0,
|
|
96
|
+
startedAt: typeof parsed.startedAt === "number" ? parsed.startedAt : parsed.updatedAt,
|
|
97
|
+
updatedAt: parsed.updatedAt
|
|
98
|
+
};
|
|
99
|
+
return { integrity: "ok", status, file };
|
|
100
|
+
}
|
|
101
|
+
function readLiveStatus(projectId) {
|
|
102
|
+
const cp = readIndexCheckpoint(projectId);
|
|
103
|
+
return cp.integrity === "ok" ? cp.status : void 0;
|
|
104
|
+
}
|
|
105
|
+
function isRunPhase(phase) {
|
|
106
|
+
return typeof phase === "string" && INDEX_RUN_PHASES.includes(phase);
|
|
107
|
+
}
|
|
108
|
+
function decideResume(projectId, opts = {}) {
|
|
109
|
+
const now = opts.now ?? Date.now();
|
|
110
|
+
const maxAgeMs = opts.maxAgeMs ?? 36e5;
|
|
111
|
+
const cp = readIndexCheckpoint(projectId);
|
|
112
|
+
if (cp.integrity === "missing") {
|
|
113
|
+
return { resumable: false, reason: "no in-progress checkpoint; running incremental (only missing/changed files)" };
|
|
114
|
+
}
|
|
115
|
+
if (cp.integrity !== "ok" || !cp.status) {
|
|
116
|
+
return {
|
|
117
|
+
resumable: false,
|
|
118
|
+
// Said plainly rather than as "no checkpoint": the file is there, and a
|
|
119
|
+
// user who was told "none" cannot tell that from a project that was
|
|
120
|
+
// never interrupted. The work is unaffected (resume is derived from the
|
|
121
|
+
// store either way), but the report should not hide a damaged file.
|
|
122
|
+
reason: `checkpoint unreadable (${cp.integrity}): ${cp.problem ?? "unknown problem"}; running incremental (only missing/changed files)`
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const s = cp.status;
|
|
126
|
+
if (!RESUMABLE_PHASES.includes(s.phase)) {
|
|
127
|
+
return { resumable: false, reason: `checkpoint phase is "${s.phase}", not resumable; running incremental (only missing/changed files)` };
|
|
128
|
+
}
|
|
129
|
+
const age = now - s.updatedAt;
|
|
130
|
+
if (age >= maxAgeMs) {
|
|
131
|
+
return {
|
|
132
|
+
resumable: false,
|
|
133
|
+
reason: `checkpoint is ${Math.round(age / 6e4)} min old (> ${Math.round(maxAgeMs / 6e4)} min), so its counts describe a tree that has since moved; running incremental (only missing/changed files)`
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return { resumable: true, reason: `resuming interrupted index (checkpoint: ${s.processedFiles}/${s.totalFiles} files done)` };
|
|
137
|
+
}
|
|
138
|
+
async function readLastRun(projectId) {
|
|
139
|
+
try {
|
|
140
|
+
const raw = await BrainDatabase.getRawInstance(projectId);
|
|
141
|
+
const row = raw.prepare("SELECT performance_stats FROM brain_index_status WHERE project_id = ?").get(projectId);
|
|
142
|
+
const perf = row?.performance_stats ? JSON.parse(String(row.performance_stats)) : null;
|
|
143
|
+
if (!perf || !Array.isArray(perf.runs) || perf.runs.length === 0) return void 0;
|
|
144
|
+
const r = perf.runs[perf.runs.length - 1];
|
|
145
|
+
if (!r || typeof r !== "object") return void 0;
|
|
146
|
+
return {
|
|
147
|
+
mode: r.mode,
|
|
148
|
+
phaseTimings: r.phases ?? void 0,
|
|
149
|
+
workerCount: r.counts?.workerCount ?? void 0,
|
|
150
|
+
counts: r.counts ?? void 0,
|
|
151
|
+
totalWallMs: r.phases?.totalWallMs ?? void 0,
|
|
152
|
+
postProcessing: r.postProcessingPhases ?? void 0,
|
|
153
|
+
generatedAt: r.generatedAt ?? void 0,
|
|
154
|
+
noop: r.noop ?? void 0
|
|
155
|
+
};
|
|
156
|
+
} catch {
|
|
157
|
+
return void 0;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function composeStatus(projectId) {
|
|
161
|
+
const checkpoint = readIndexCheckpoint(projectId);
|
|
162
|
+
const live = checkpoint.integrity === "ok" ? checkpoint.status : void 0;
|
|
163
|
+
const lastRun = await readLastRun(projectId);
|
|
164
|
+
const isRunning = !!live && !TERMINAL_PHASES.includes(live.phase) && Date.now() - live.updatedAt < 3e4;
|
|
165
|
+
const dbFileExists = existsSync(BrainDatabase.getPath(projectId));
|
|
166
|
+
const dbStats = live || lastRun || dbFileExists ? await (async () => {
|
|
167
|
+
try {
|
|
168
|
+
const { BrainDatabase: DB } = await import("./database-TCTZDLE5.js");
|
|
169
|
+
const r = await DB.getRawInstance(projectId);
|
|
170
|
+
const one = (sql) => r.prepare(sql).get()?.c ?? 0;
|
|
171
|
+
return { files: one("SELECT COUNT(*) c FROM brain_file"), symbols: one("SELECT COUNT(*) c FROM brain_symbol"), relationships: one("SELECT COUNT(*) c FROM brain_relationship") };
|
|
172
|
+
} catch {
|
|
173
|
+
return { files: 0, symbols: 0, relationships: 0 };
|
|
174
|
+
}
|
|
175
|
+
})() : { files: 0, symbols: 0, relationships: 0 };
|
|
176
|
+
return { hasIndex: !!(live || lastRun) || dbStats.files > 0, live, lastRun, isRunning, checkpoint, dbStats };
|
|
177
|
+
}
|
|
178
|
+
function clearStatus(projectId) {
|
|
179
|
+
for (const p of [statusPath(projectId), statusTempPath(projectId)]) {
|
|
180
|
+
try {
|
|
181
|
+
if (existsSync(p)) rmSync(p);
|
|
182
|
+
} catch {
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export {
|
|
188
|
+
INDEX_STATUS_SCHEMA_VERSION,
|
|
189
|
+
INDEX_RUN_PHASES,
|
|
190
|
+
RESUMABLE_PHASES,
|
|
191
|
+
TERMINAL_PHASES,
|
|
192
|
+
statusPath,
|
|
193
|
+
writeLiveStatus,
|
|
194
|
+
readIndexCheckpoint,
|
|
195
|
+
readLiveStatus,
|
|
196
|
+
isRunPhase,
|
|
197
|
+
decideResume,
|
|
198
|
+
readLastRun,
|
|
199
|
+
composeStatus,
|
|
200
|
+
clearStatus
|
|
201
|
+
};
|