gitnexus 1.6.8-rc.8 → 1.6.8
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/README.md +3 -3
- package/dist/_shared/graph/types.d.ts +31 -1
- package/dist/_shared/graph/types.d.ts.map +1 -1
- package/dist/_shared/language-detection.d.ts.map +1 -1
- package/dist/_shared/language-detection.js +11 -1
- package/dist/_shared/language-detection.js.map +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts +1 -1
- package/dist/_shared/lbug/schema-constants.d.ts.map +1 -1
- package/dist/_shared/lbug/schema-constants.js +6 -0
- package/dist/_shared/lbug/schema-constants.js.map +1 -1
- package/dist/_shared/scope-resolution/parsed-file.d.ts +21 -0
- package/dist/_shared/scope-resolution/parsed-file.d.ts.map +1 -1
- package/dist/_shared/scope-resolution/symbol-definition.d.ts +6 -0
- package/dist/_shared/scope-resolution/symbol-definition.d.ts.map +1 -1
- package/dist/cli/ai-context.d.ts +31 -1
- package/dist/cli/ai-context.js +18 -16
- package/dist/cli/analyze-config.js +11 -0
- package/dist/cli/analyze.d.ts +14 -0
- package/dist/cli/analyze.js +98 -0
- package/dist/cli/embedding-dims.d.ts +33 -0
- package/dist/cli/embedding-dims.js +39 -0
- package/dist/cli/eval-server.d.ts +8 -0
- package/dist/cli/eval-server.js +242 -2
- package/dist/cli/help-i18n.js +19 -0
- package/dist/cli/i18n/en.d.ts +15 -1
- package/dist/cli/i18n/en.js +15 -1
- package/dist/cli/i18n/resources.d.ts +29 -1
- package/dist/cli/i18n/zh-CN.d.ts +14 -0
- package/dist/cli/i18n/zh-CN.js +15 -1
- package/dist/cli/index.js +89 -1
- package/dist/cli/mcp.d.ts +6 -1
- package/dist/cli/mcp.js +26 -1
- package/dist/cli/optional-grammars.d.ts +6 -8
- package/dist/cli/optional-grammars.js +8 -11
- package/dist/cli/setup.d.ts +3 -1
- package/dist/cli/setup.js +67 -17
- package/dist/cli/skill-gen.js +2 -1
- package/dist/cli/tool.d.ts +19 -1
- package/dist/cli/tool.js +96 -3
- package/dist/core/embeddings/hf-env.d.ts +0 -66
- package/dist/core/embeddings/http-client.d.ts +7 -0
- package/dist/core/embeddings/http-client.js +5 -3
- package/dist/core/embeddings/server-mapping.d.ts +1 -1
- package/dist/core/embeddings/server-mapping.js +7 -3
- package/dist/core/graph/import-cycles.d.ts +10 -0
- package/dist/core/graph/import-cycles.js +103 -0
- package/dist/core/group/cross-impact.d.ts +2 -1
- package/dist/core/group/cross-impact.js +5 -1
- package/dist/core/group/extractors/grpc-patterns/proto.js +10 -6
- package/dist/core/group/extractors/http-patterns/kotlin.js +7 -7
- package/dist/core/group/extractors/http-route-extractor.d.ts +24 -0
- package/dist/core/group/extractors/http-route-extractor.js +22 -4
- package/dist/core/group/extractors/include-extractor.js +22 -13
- package/dist/core/group/sync.d.ts +27 -1
- package/dist/core/group/sync.js +0 -0
- package/dist/core/incremental/subgraph-extract.js +18 -1
- package/dist/core/ingestion/cfg/cfg-builder.d.ts +114 -0
- package/dist/core/ingestion/cfg/cfg-builder.js +196 -0
- package/dist/core/ingestion/cfg/collect.d.ts +51 -0
- package/dist/core/ingestion/cfg/collect.js +77 -0
- package/dist/core/ingestion/cfg/control-dependence.d.ts +58 -0
- package/dist/core/ingestion/cfg/control-dependence.js +182 -0
- package/dist/core/ingestion/cfg/control-flow-context.d.ts +106 -0
- package/dist/core/ingestion/cfg/control-flow-context.js +124 -0
- package/dist/core/ingestion/cfg/emit.d.ts +293 -0
- package/dist/core/ingestion/cfg/emit.js +646 -0
- package/dist/core/ingestion/cfg/post-dominators.d.ts +79 -0
- package/dist/core/ingestion/cfg/post-dominators.js +176 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.d.ts +106 -0
- package/dist/core/ingestion/cfg/reaching-def-reason-codec.js +133 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.d.ts +18 -0
- package/dist/core/ingestion/cfg/reaching-defs-graph.js +312 -0
- package/dist/core/ingestion/cfg/reaching-defs.d.ts +162 -0
- package/dist/core/ingestion/cfg/reaching-defs.js +785 -0
- package/dist/core/ingestion/cfg/synthetic-escape.d.ts +124 -0
- package/dist/core/ingestion/cfg/synthetic-escape.js +300 -0
- package/dist/core/ingestion/cfg/traversal-result.d.ts +20 -0
- package/dist/core/ingestion/cfg/traversal-result.js +2 -0
- package/dist/core/ingestion/cfg/types.d.ts +274 -0
- package/dist/core/ingestion/cfg/types.js +13 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.d.ts +111 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp-harvest.js +541 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.d.ts +74 -0
- package/dist/core/ingestion/cfg/visitors/c-cpp.js +584 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.d.ts +195 -0
- package/dist/core/ingestion/cfg/visitors/call-site-harvest.js +350 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.d.ts +124 -0
- package/dist/core/ingestion/cfg/visitors/csharp-harvest.js +589 -0
- package/dist/core/ingestion/cfg/visitors/csharp.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/csharp.js +867 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.d.ts +278 -0
- package/dist/core/ingestion/cfg/visitors/dart-harvest.js +870 -0
- package/dist/core/ingestion/cfg/visitors/dart.d.ts +119 -0
- package/dist/core/ingestion/cfg/visitors/dart.js +836 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.d.ts +160 -0
- package/dist/core/ingestion/cfg/visitors/go-harvest.js +621 -0
- package/dist/core/ingestion/cfg/visitors/go.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/go.js +638 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.d.ts +108 -0
- package/dist/core/ingestion/cfg/visitors/java-harvest.js +513 -0
- package/dist/core/ingestion/cfg/visitors/java.d.ts +101 -0
- package/dist/core/ingestion/cfg/visitors/java.js +812 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.d.ts +253 -0
- package/dist/core/ingestion/cfg/visitors/kotlin-harvest.js +719 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.d.ts +121 -0
- package/dist/core/ingestion/cfg/visitors/kotlin.js +809 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.d.ts +172 -0
- package/dist/core/ingestion/cfg/visitors/php-harvest.js +626 -0
- package/dist/core/ingestion/cfg/visitors/php.d.ts +96 -0
- package/dist/core/ingestion/cfg/visitors/php.js +721 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.d.ts +212 -0
- package/dist/core/ingestion/cfg/visitors/python-harvest.js +739 -0
- package/dist/core/ingestion/cfg/visitors/python.d.ts +103 -0
- package/dist/core/ingestion/cfg/visitors/python.js +558 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.d.ts +223 -0
- package/dist/core/ingestion/cfg/visitors/ruby-harvest.js +587 -0
- package/dist/core/ingestion/cfg/visitors/ruby.d.ts +112 -0
- package/dist/core/ingestion/cfg/visitors/ruby.js +756 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.d.ts +324 -0
- package/dist/core/ingestion/cfg/visitors/rust-harvest.js +873 -0
- package/dist/core/ingestion/cfg/visitors/rust.d.ts +95 -0
- package/dist/core/ingestion/cfg/visitors/rust.js +558 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.d.ts +87 -0
- package/dist/core/ingestion/cfg/visitors/scope-tree-harvest.js +116 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.d.ts +255 -0
- package/dist/core/ingestion/cfg/visitors/swift-harvest.js +679 -0
- package/dist/core/ingestion/cfg/visitors/swift.d.ts +116 -0
- package/dist/core/ingestion/cfg/visitors/swift.js +787 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.d.ts +149 -0
- package/dist/core/ingestion/cfg/visitors/typescript-harvest.js +1056 -0
- package/dist/core/ingestion/cfg/visitors/typescript.d.ts +66 -0
- package/dist/core/ingestion/cfg/visitors/typescript.js +583 -0
- package/dist/core/ingestion/import-resolvers/utils.js +2 -0
- package/dist/core/ingestion/language-provider.d.ts +23 -2
- package/dist/core/ingestion/languages/c-cpp.js +17 -5
- package/dist/core/ingestion/languages/cobol.js +4 -0
- package/dist/core/ingestion/languages/cpp/arity-metadata.js +41 -2
- package/dist/core/ingestion/languages/cpp/captures.js +50 -1
- package/dist/core/ingestion/languages/cpp/conversion-rank.d.ts +2 -0
- package/dist/core/ingestion/languages/cpp/conversion-rank.js +89 -0
- package/dist/core/ingestion/languages/cpp/header-scan.d.ts +1 -1
- package/dist/core/ingestion/languages/cpp/header-scan.js +2 -2
- package/dist/core/ingestion/languages/cpp/inline-namespaces.js +7 -2
- package/dist/core/ingestion/languages/cpp/member-lookup.js +2 -1
- package/dist/core/ingestion/languages/cpp/query.js +23 -0
- package/dist/core/ingestion/languages/cpp/scope-resolver.js +2 -1
- package/dist/core/ingestion/languages/csharp.js +2 -0
- package/dist/core/ingestion/languages/dart.js +2 -0
- package/dist/core/ingestion/languages/go.js +2 -0
- package/dist/core/ingestion/languages/java.js +3 -0
- package/dist/core/ingestion/languages/kotlin/query.js +3 -2
- package/dist/core/ingestion/languages/kotlin.js +8 -1
- package/dist/core/ingestion/languages/php.js +2 -0
- package/dist/core/ingestion/languages/python.js +2 -0
- package/dist/core/ingestion/languages/ruby.js +2 -0
- package/dist/core/ingestion/languages/rust.js +2 -0
- package/dist/core/ingestion/languages/swift.js +2 -0
- package/dist/core/ingestion/languages/typescript.js +5 -0
- package/dist/core/ingestion/languages/vue.js +6 -0
- package/dist/core/ingestion/method-extractors/configs/c-cpp.js +6 -13
- package/dist/core/ingestion/method-extractors/generic.js +1 -0
- package/dist/core/ingestion/method-types.d.ts +2 -0
- package/dist/core/ingestion/model/symbol-table.d.ts +1 -0
- package/dist/core/ingestion/model/symbol-table.js +1 -0
- package/dist/core/ingestion/mro-processor.js +109 -0
- package/dist/core/ingestion/parsing-processor.js +44 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.d.ts +26 -0
- package/dist/core/ingestion/pipeline-phases/call-summaries.js +46 -0
- package/dist/core/ingestion/pipeline-phases/index.d.ts +2 -0
- package/dist/core/ingestion/pipeline-phases/index.js +2 -0
- package/dist/core/ingestion/pipeline-phases/parse-impl.d.ts +0 -21
- package/dist/core/ingestion/pipeline-phases/parse-impl.js +18 -1
- package/dist/core/ingestion/pipeline-phases/routes.d.ts +10 -0
- package/dist/core/ingestion/pipeline-phases/routes.js +30 -1
- package/dist/core/ingestion/pipeline-phases/taint-summaries.d.ts +30 -0
- package/dist/core/ingestion/pipeline-phases/taint-summaries.js +81 -0
- package/dist/core/ingestion/pipeline.d.ts +92 -10
- package/dist/core/ingestion/pipeline.js +11 -2
- package/dist/core/ingestion/scope-extractor.js +12 -2
- package/dist/core/ingestion/scope-resolution/contract/scope-resolver.d.ts +9 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/callee-id-sink.js +67 -0
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.d.ts +12 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/edges.js +14 -2
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/graph-bridge/references-to-edges.js +13 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.d.ts +9 -1
- package/dist/core/ingestion/scope-resolution/passes/free-call-fallback.js +28 -2
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.d.ts +4 -0
- package/dist/core/ingestion/scope-resolution/passes/overload-narrowing.js +9 -0
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.d.ts +6 -1
- package/dist/core/ingestion/scope-resolution/passes/receiver-bound-calls.js +174 -40
- package/dist/core/ingestion/scope-resolution/pipeline/phase.d.ts +24 -0
- package/dist/core/ingestion/scope-resolution/pipeline/phase.js +276 -190
- package/dist/core/ingestion/scope-resolution/pipeline/reconcile-ownership.js +43 -3
- package/dist/core/ingestion/scope-resolution/pipeline/run.d.ts +75 -0
- package/dist/core/ingestion/scope-resolution/pipeline/run.js +349 -1
- package/dist/core/ingestion/scope-resolution/resolution-outcome.d.ts +1 -1
- package/dist/core/ingestion/taint/call-summary-codec.d.ts +75 -0
- package/dist/core/ingestion/taint/call-summary-codec.js +128 -0
- package/dist/core/ingestion/taint/call-summary-emit.d.ts +43 -0
- package/dist/core/ingestion/taint/call-summary-emit.js +70 -0
- package/dist/core/ingestion/taint/call-summary-harvest.d.ts +77 -0
- package/dist/core/ingestion/taint/call-summary-harvest.js +179 -0
- package/dist/core/ingestion/taint/call-summary-model.d.ts +47 -0
- package/dist/core/ingestion/taint/call-summary-model.js +25 -0
- package/dist/core/ingestion/taint/emit.d.ts +125 -0
- package/dist/core/ingestion/taint/emit.js +208 -0
- package/dist/core/ingestion/taint/interproc-emit.d.ts +50 -0
- package/dist/core/ingestion/taint/interproc-emit.js +88 -0
- package/dist/core/ingestion/taint/interproc-solver.d.ts +110 -0
- package/dist/core/ingestion/taint/interproc-solver.js +312 -0
- package/dist/core/ingestion/taint/match.d.ts +153 -0
- package/dist/core/ingestion/taint/match.js +278 -0
- package/dist/core/ingestion/taint/path-codec.d.ts +134 -0
- package/dist/core/ingestion/taint/path-codec.js +190 -0
- package/dist/core/ingestion/taint/propagate.d.ts +216 -0
- package/dist/core/ingestion/taint/propagate.js +659 -0
- package/dist/core/ingestion/taint/site-safety.d.ts +29 -0
- package/dist/core/ingestion/taint/site-safety.js +98 -0
- package/dist/core/ingestion/taint/source-sink-config.d.ts +107 -23
- package/dist/core/ingestion/taint/source-sink-config.js +35 -12
- package/dist/core/ingestion/taint/source-sink-registry.d.ts +6 -4
- package/dist/core/ingestion/taint/source-sink-registry.js +6 -4
- package/dist/core/ingestion/taint/summary-harvest-driver.d.ts +80 -0
- package/dist/core/ingestion/taint/summary-harvest-driver.js +179 -0
- package/dist/core/ingestion/taint/summary-harvest.d.ts +89 -0
- package/dist/core/ingestion/taint/summary-harvest.js +537 -0
- package/dist/core/ingestion/taint/summary-model.d.ts +200 -0
- package/dist/core/ingestion/taint/summary-model.js +86 -0
- package/dist/core/ingestion/taint/typescript-model.d.ts +38 -0
- package/dist/core/ingestion/taint/typescript-model.js +102 -0
- package/dist/core/ingestion/type-extractors/c-cpp.js +21 -0
- package/dist/core/ingestion/utils/env.d.ts +7 -0
- package/dist/core/ingestion/utils/env.js +12 -0
- package/dist/core/ingestion/utils/method-props.js +1 -0
- package/dist/core/ingestion/workers/clone-safety.d.ts +109 -0
- package/dist/core/ingestion/workers/clone-safety.js +465 -0
- package/dist/core/ingestion/workers/parse-worker.d.ts +23 -0
- package/dist/core/ingestion/workers/parse-worker.js +81 -53
- package/dist/core/ingestion/workers/post-result.d.ts +22 -0
- package/dist/core/ingestion/workers/post-result.js +87 -0
- package/dist/core/ingestion/workers/result-merge.d.ts +20 -0
- package/dist/core/ingestion/workers/result-merge.js +43 -0
- package/dist/core/ingestion/workers/worker-pool.d.ts +15 -40
- package/dist/core/ingestion/workers/worker-pool.js +43 -16
- package/dist/core/lbug/csv-generator.d.ts +51 -3
- package/dist/core/lbug/csv-generator.js +369 -255
- package/dist/core/lbug/lbug-adapter.d.ts +58 -18
- package/dist/core/lbug/lbug-adapter.js +346 -84
- package/dist/core/lbug/lbug-config.d.ts +19 -0
- package/dist/core/lbug/lbug-config.js +29 -0
- package/dist/core/lbug/pdg-emit-sink.d.ts +127 -0
- package/dist/core/lbug/pdg-emit-sink.js +358 -0
- package/dist/core/lbug/pool-adapter.d.ts +35 -0
- package/dist/core/lbug/pool-adapter.js +90 -1
- package/dist/core/lbug/rel-pair-routing.d.ts +54 -0
- package/dist/core/lbug/rel-pair-routing.js +140 -0
- package/dist/core/lbug/schema.d.ts +2 -2
- package/dist/core/lbug/schema.js +3 -0
- package/dist/core/logger.d.ts +0 -5
- package/dist/core/run-analyze.d.ts +96 -0
- package/dist/core/run-analyze.js +207 -3
- package/dist/core/tree-sitter/parser-loader.js +5 -4
- package/dist/core/tree-sitter/safe-parse.d.ts +0 -5
- package/dist/core/tree-sitter/vendored-grammars.d.ts +39 -0
- package/dist/core/tree-sitter/vendored-grammars.js +57 -0
- package/dist/core/wiki/generator.js +3 -1
- package/dist/core/wiki/graph-queries.d.ts +6 -0
- package/dist/core/wiki/graph-queries.js +9 -1
- package/dist/mcp/http-transport.d.ts +134 -0
- package/dist/mcp/http-transport.js +503 -0
- package/dist/mcp/local/local-backend.d.ts +110 -24
- package/dist/mcp/local/local-backend.js +1225 -19
- package/dist/mcp/local/pdg-impact.d.ts +384 -0
- package/dist/mcp/local/pdg-impact.js +1972 -0
- package/dist/mcp/resources.js +13 -1
- package/dist/mcp/tools.d.ts +12 -0
- package/dist/mcp/tools.js +214 -7
- package/dist/server/analyze-launch.d.ts +29 -0
- package/dist/server/analyze-launch.js +137 -0
- package/dist/server/analyze-upload.d.ts +33 -0
- package/dist/server/analyze-upload.js +123 -0
- package/dist/server/analyze-worker-ipc.d.ts +58 -0
- package/dist/server/analyze-worker-ipc.js +16 -0
- package/dist/server/analyze-worker.d.ts +17 -1
- package/dist/server/analyze-worker.js +7 -1
- package/dist/server/api.d.ts +17 -0
- package/dist/server/api.js +132 -168
- package/dist/server/git-clone.d.ts +43 -2
- package/dist/server/git-clone.js +211 -16
- package/dist/server/mcp-http.d.ts +5 -6
- package/dist/server/mcp-http.js +9 -82
- package/dist/server/middleware.d.ts +40 -0
- package/dist/server/middleware.js +92 -0
- package/dist/server/private-ip.d.ts +1 -0
- package/dist/server/private-ip.js +15 -0
- package/dist/server/upload-ingest.d.ts +56 -0
- package/dist/server/upload-ingest.js +276 -0
- package/dist/server/upload-paths.d.ts +37 -0
- package/dist/server/upload-paths.js +57 -0
- package/dist/server/upload-sweep.d.ts +20 -0
- package/dist/server/upload-sweep.js +57 -0
- package/dist/storage/git.js +5 -8
- package/dist/storage/parse-cache.d.ts +22 -1
- package/dist/storage/parse-cache.js +44 -10
- package/dist/storage/repo-manager.d.ts +121 -10
- package/dist/storage/repo-manager.js +43 -5
- package/dist/types/pipeline.d.ts +9 -0
- package/hooks/antigravity/gitnexus-antigravity-hook.cjs +110 -10
- package/hooks/claude/gitnexus-hook.cjs +110 -13
- package/hooks/claude/hook-db-lock-probe.cjs +513 -26
- package/package.json +8 -2
- package/scripts/assert-publish-grammar-coverage.cjs +31 -0
- package/scripts/build-tree-sitter-grammars.cjs +16 -10
- package/scripts/cross-platform-tests.ts +1 -0
- package/skills/gitnexus-debugging.md +16 -4
- package/skills/gitnexus-exploring.md +3 -3
- package/skills/gitnexus-guide.md +33 -0
- package/skills/gitnexus-pdg-query.md +89 -0
- package/skills/gitnexus-refactoring.md +1 -1
- package/skills/gitnexus-taint-analysis.md +178 -0
- package/vendor/tree-sitter-c/package.json +1 -1
- package/vendor/tree-sitter-dart/package.json +1 -1
- package/vendor/tree-sitter-kotlin/package.json +1 -1
- package/vendor/tree-sitter-proto/package.json +1 -1
- package/vendor/tree-sitter-swift/package.json +1 -1
- package/web/assets/{agent-CKPMqImC.js → agent-D3Xd7zZE.js} +123 -123
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-DxJw65fT.js +1 -0
- package/web/assets/architectureDiagram-UL44E2DR-ChH9xW-N.js +36 -0
- package/web/assets/{blockDiagram-7IZFK4PR-B4niSLvR.js → blockDiagram-7IZFK4PR-BkWhpzWB.js} +1 -1
- package/web/assets/{c4Diagram-Y2BXMSZH-DIzEXalR.js → c4Diagram-Y2BXMSZH-DtBvpzWD.js} +1 -1
- package/web/assets/{chunk-3SSMPTDK-BzGeeheI.js → chunk-3SSMPTDK-B4_etUhr.js} +2 -2
- package/web/assets/{chunk-5IMINLNL-CnTLsXIV.js → chunk-5IMINLNL-DOdTeQri.js} +1 -1
- package/web/assets/{chunk-5VCL7Z4A-w1BCx98Z.js → chunk-5VCL7Z4A-CQ-2dYWj.js} +1 -1
- package/web/assets/chunk-6764PJDD-DpIS7hxD.js +1 -0
- package/web/assets/{chunk-67TQ5CYL-CChC2cAv.js → chunk-67TQ5CYL-4sNPJU1q.js} +3 -3
- package/web/assets/{chunk-7W6UQGC5-CgFyfZ6k.js → chunk-7W6UQGC5-KyEG0HQg.js} +1 -1
- package/web/assets/{chunk-AZZRMDJM-5E9ARdDQ.js → chunk-AZZRMDJM-y-xJBuMz.js} +1 -1
- package/web/assets/{chunk-INKRHTLW-ELpfuk9h.js → chunk-INKRHTLW-Nu4ri9P-.js} +1 -1
- package/web/assets/{chunk-JQRUD6KW-Dcq_Qnyy.js → chunk-JQRUD6KW-Dbva2Z17.js} +1 -1
- package/web/assets/{chunk-KGFNY3KK-W-VR57xb.js → chunk-KGFNY3KK-JGMJvKCK.js} +1 -1
- package/web/assets/chunk-KGYTTC2M-CWC_c3H9.js +161 -0
- package/web/assets/{chunk-KNLZD3CH-BuZBOcso.js → chunk-KNLZD3CH-BGlP6X9R.js} +1 -1
- package/web/assets/{chunk-KRXBNO2N-DH2NPM7I.js → chunk-KRXBNO2N-BW5o0KUN.js} +1 -1
- package/web/assets/{chunk-LCXTWHL2-Dfmux4m1.js → chunk-LCXTWHL2-zoomRtWX.js} +1 -1
- package/web/assets/{chunk-LII3EMHJ-3X33tCpU.js → chunk-LII3EMHJ-D-jm-dLa.js} +1 -1
- package/web/assets/{chunk-QA3QBVWF-D5Ha3GgB.js → chunk-QA3QBVWF-BgRW3SXd.js} +1 -1
- package/web/assets/{chunk-RG4AUYOV-CAkzcoRj.js → chunk-RG4AUYOV-DD0B2N2B.js} +1 -1
- package/web/assets/{chunk-T2UQINTJ-kGYG7ppP.js → chunk-T2UQINTJ-DSBqkzH7.js} +1 -1
- package/web/assets/chunk-T5OCTHI4-DdZvN-9i.js +1 -0
- package/web/assets/{chunk-UY5QBCOK-Du-c56gs.js → chunk-UY5QBCOK-DyF0vyGd.js} +1 -1
- package/web/assets/{chunk-W44A43WB-lrCpuupA.js → chunk-W44A43WB-JqMLIpR0.js} +1 -1
- package/web/assets/{chunk-ZXARS5L4-CSZRiyOf.js → chunk-ZXARS5L4-CxN8oiwI.js} +1 -1
- package/web/assets/classDiagram-KGZ6W3CR-DJm9BgF-.js +1 -0
- package/web/assets/classDiagram-v2-72OJOZXJ-DJm9BgF-.js +1 -0
- package/web/assets/{context-builder-_HS0v2ma.js → context-builder-BHiFUA8O.js} +10 -2
- package/web/assets/{cose-bilkent-UX7MHV2Q-BHv2bbtl.js → cose-bilkent-UX7MHV2Q-D71wNYRJ.js} +1 -1
- package/web/assets/dagre-ND4H6XIP-BIkxmhcu.js +4 -0
- package/web/assets/diagram-3NCE3AQN-BTa6iH0T.js +43 -0
- package/web/assets/diagram-GF46GFSD-DZDV0vBj.js +24 -0
- package/web/assets/{diagram-HNR7UZ2L-fUWreZzx.js → diagram-HNR7UZ2L-DFCfd5LI.js} +2 -2
- package/web/assets/diagram-QXG6HAR7-BzM--Jj0.js +24 -0
- package/web/assets/diagram-WEQXMOUZ-DFFwz0k4.js +10 -0
- package/web/assets/{erDiagram-L5TCEMPS-QN2eEP1e.js → erDiagram-L5TCEMPS-CfHMJJqo.js} +1 -1
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-BQm9QzEa.js +1 -0
- package/web/assets/{flowDiagram-H6V6AXG4-CXbXImlN.js → flowDiagram-H6V6AXG4-Be805QiJ.js} +3 -3
- package/web/assets/{ganttDiagram-JCBTUEKG-BHQssTz6.js → ganttDiagram-JCBTUEKG-D3iL2Aet.js} +1 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-Cr_Bm2Nb.js +1 -0
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CPIDgxGm.js +106 -0
- package/web/assets/index-BvYev1UJ.js +635 -0
- package/web/assets/index-_lgn7hs5.css +2 -0
- package/web/assets/info-J43DQDTF-KCYPFFUO-Cs4p2oyk.js +1 -0
- package/web/assets/infoDiagram-3YFTVSEB-Y7BKSoke.js +2 -0
- package/web/assets/{ishikawaDiagram-BNXS4ZKH-6LKOvBfp.js → ishikawaDiagram-BNXS4ZKH-CT4SHFuI.js} +1 -1
- package/web/assets/{journeyDiagram-M6C3CM3L-DNPYCpvq.js → journeyDiagram-M6C3CM3L-CvArszLo.js} +1 -1
- package/web/assets/{kanban-definition-75IXJCU3-DgDi9oJT.js → kanban-definition-75IXJCU3-C6yDxr7N.js} +3 -3
- package/web/assets/{katex-K3KEBU37-CrVLz8l7.js → katex-K3KEBU37-CTc5BslQ.js} +1 -1
- package/web/assets/{mindmap-definition-2TDM6QVE-CwR5sBB-.js → mindmap-definition-2TDM6QVE-BOc2WEne.js} +1 -1
- package/web/assets/packet-YPE3B663-LP52Z2RK-CKCrztD2.js +1 -0
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BB7pHqoD.js +1 -0
- package/web/assets/{pieDiagram-CU6KROY3-By8g6f6B.js → pieDiagram-CU6KROY3-Cvc0f_Pd.js} +1 -1
- package/web/assets/{quadrantDiagram-VICAPDV7-bAm6Hi_5.js → quadrantDiagram-VICAPDV7-yXSZ2lLz.js} +1 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-DhoTOcuK.js +1 -0
- package/web/assets/{requirementDiagram-JXO7QTGE-7oDcJ1_J.js → requirementDiagram-JXO7QTGE-BRcZvHs4.js} +1 -1
- package/web/assets/{sankeyDiagram-URQDO5SZ-LFJz53u5.js → sankeyDiagram-URQDO5SZ-1qEjlFIB.js} +1 -1
- package/web/assets/{sequenceDiagram-VS2MUI6T-FySeKCUy.js → sequenceDiagram-VS2MUI6T-PcSCuvrB.js} +3 -3
- package/web/assets/stateDiagram-7D4R322I-D6qYSV1E.js +1 -0
- package/web/assets/stateDiagram-v2-36443NZ5-Bg-ImOSX.js +1 -0
- package/web/assets/{timeline-definition-O6YCAMPW-Ds2CnVZK.js → timeline-definition-O6YCAMPW-QWkh01xw.js} +1 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-ODehyGKL.js +1 -0
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-BfpgC-7o.js +1 -0
- package/web/assets/{vennDiagram-MWXL3ELB-DUIEwXWp.js → vennDiagram-MWXL3ELB-ak4DfwuM.js} +3 -3
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-CNeL6VHE.js +1 -0
- package/web/assets/{wardleyDiagram-CUQ6CDDI-DEiFPQih.js → wardleyDiagram-CUQ6CDDI-CTzR4Loq.js} +1 -1
- package/web/assets/{xychartDiagram-N2JHSOCM-BUbayhST.js → xychartDiagram-N2JHSOCM-DA1BEaQz.js} +1 -1
- package/web/index.html +13 -15
- package/scripts/materialize-vendor-grammars.cjs +0 -97
- package/web/assets/architecture-7EHR7CIX-6QZW5X65-BETj2x4g.js +0 -1
- package/web/assets/architectureDiagram-UL44E2DR-D1EXI0zA.js +0 -36
- package/web/assets/chunk-2T2R6R2M-n6s9JZqv.js +0 -4
- package/web/assets/chunk-2UTLFMKG-CMBB1TMN.js +0 -1
- package/web/assets/chunk-4R4BOZG6-mKhL59ul.js +0 -159
- package/web/assets/chunk-6764PJDD-ChwMM2z4.js +0 -1
- package/web/assets/chunk-7J6CGLKN-DT-b53FT.js +0 -10
- package/web/assets/chunk-C62D2QBJ-CDAWj26E.js +0 -1
- package/web/assets/chunk-CEXFNPSA-D68Tk6ls.js +0 -1
- package/web/assets/chunk-CilyBKbf.js +0 -1
- package/web/assets/chunk-J5EP6P6S-DxWW0yvu.js +0 -1
- package/web/assets/chunk-KGYTTC2M-C6PHeuay.js +0 -1
- package/web/assets/chunk-RERM46MO-DQNbXtfw.js +0 -1
- package/web/assets/chunk-RKZBBQEN-BmTPLSyv.js +0 -1
- package/web/assets/chunk-RLI5ZMPA-DExu2DOK.js +0 -1
- package/web/assets/chunk-T5OCTHI4--9wWpVws.js +0 -1
- package/web/assets/chunk-UP6H54XL-DsKdC6jC.js +0 -1
- package/web/assets/chunk-UXSXWOXI-DR81EqLr.js +0 -1
- package/web/assets/classDiagram-KGZ6W3CR-Bv93af_b.js +0 -1
- package/web/assets/classDiagram-v2-72OJOZXJ-CLfEqHUa.js +0 -1
- package/web/assets/dagre-ND4H6XIP-DsIr9MOv.js +0 -4
- package/web/assets/diagram-3NCE3AQN-BqAtKUpW.js +0 -43
- package/web/assets/diagram-GF46GFSD-CaBG6n6o.js +0 -24
- package/web/assets/diagram-QXG6HAR7-CZ-O3rcV.js +0 -24
- package/web/assets/diagram-WEQXMOUZ-P4lSL4GH.js +0 -10
- package/web/assets/eventmodeling-FCH6USID-MREXMVOE-B3myHUst.js +0 -1
- package/web/assets/gitGraph-WXDBUCRP-R675I2BI-DF3rtf4A.js +0 -1
- package/web/assets/gitGraphDiagram-S2ZK5IYY-CCwVLT__.js +0 -106
- package/web/assets/index-BKWA-m7o.css +0 -2
- package/web/assets/index-CG6q8eTs.js +0 -626
- package/web/assets/info-J43DQDTF-KCYPFFUO-R4XV_akJ.js +0 -1
- package/web/assets/infoDiagram-3YFTVSEB-DmLICZx1.js +0 -2
- package/web/assets/packet-YPE3B663-LP52Z2RK-CgQPdNZa.js +0 -1
- package/web/assets/pie-LRSECV5Y-TCRJHUBD-BzWOwc_c.js +0 -1
- package/web/assets/radar-GUYGQ44K-RDLRG3WG-B7KG0FN7.js +0 -1
- package/web/assets/stateDiagram-7D4R322I-CB2nABwH.js +0 -1
- package/web/assets/stateDiagram-v2-36443NZ5-COBGd2RL.js +0 -1
- package/web/assets/treeView-BLDUP644-QA4HXRO3-CRSxEwLO.js +0 -1
- package/web/assets/treemap-LRROVOQU-LLAWBHMP-a0PfKoVn.js +0 -1
- package/web/assets/wardley-L42UT6IY-5TKZOOLJ-BKQ6e5mC.js +0 -1
- /package/web/assets/{chunk-AQ6EADP3-CCFje6lL.js → chunk-AQ6EADP3-CZhslHi-.js} +0 -0
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured-clone safety for the worker result boundary (#2112).
|
|
3
|
+
*
|
|
4
|
+
* A parse worker delivers its accumulated result to the main thread via
|
|
5
|
+
* `parentPort.postMessage(...)`. Node serializes that payload with the
|
|
6
|
+
* structured-clone algorithm SYNCHRONOUSLY on the worker thread, and it
|
|
7
|
+
* THROWS a `DataCloneError` the instant it meets a value it can't serialize —
|
|
8
|
+
* a function, a symbol, a Promise, a WeakMap, etc. The reporter of #2112 hit
|
|
9
|
+
* exactly this: a node record whose `properties` carried an own-enumerable
|
|
10
|
+
* value pointing at a native function (`function toString() { [native code] }
|
|
11
|
+
* could not be cloned`). One such value aborted the entire parse phase,
|
|
12
|
+
* because the worker re-posts the throw as `{type:'error'}` which the pool
|
|
13
|
+
* counts as a worker death — and under `GITNEXUS_WORKER_POOL_SIZE=1` the same
|
|
14
|
+
* graph re-throws on every respawn until the slot's budget is exhausted.
|
|
15
|
+
*
|
|
16
|
+
* This module is the safety net. It runs ONLY after a real clone failure on
|
|
17
|
+
* the fast-path post (zero overhead on healthy runs), and rewrites the
|
|
18
|
+
* boundary-crossing arrays so the result becomes cloneable: a non-cloneable
|
|
19
|
+
* value inside a plain extraction record is dropped (the record is otherwise
|
|
20
|
+
* kept — strictly-missing data, never wrong), and a `ParsedFile` that can't be
|
|
21
|
+
* made cloneable is dropped whole so scope-resolution re-derives it on the
|
|
22
|
+
* main thread (where there is no clone boundary) with intact edge data.
|
|
23
|
+
*
|
|
24
|
+
* Language-neutral by construction: it keys on value shape and field name
|
|
25
|
+
* only, never on a language (AGENTS.md shared-pipeline rule). The strip
|
|
26
|
+
* semantics mirror what the store path's `JSON.stringify` already silently
|
|
27
|
+
* drops, so store / no-store / cold / warm runs converge on the same graph.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* True iff `value` survives Node's structured-clone algorithm (the same
|
|
31
|
+
* algorithm `postMessage` uses). This is the authoritative probe — it matches
|
|
32
|
+
* the real failure exactly, including Map/Set/Date/RegExp/TypedArray support,
|
|
33
|
+
* so it never false-positives on the `Scope` Maps that clone fine.
|
|
34
|
+
*/
|
|
35
|
+
export function isStructuredCloneable(value) {
|
|
36
|
+
try {
|
|
37
|
+
structuredClone(value);
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Identity at runtime (zero cost — returns its argument unchanged); a
|
|
46
|
+
* compile-time assertion that `value` is structured-clone safe. Wrap a
|
|
47
|
+
* producer that feeds an `unknown` worker-result sink:
|
|
48
|
+
*
|
|
49
|
+
* collectCaptureSideChannel: (filePath) => assertCloneable(collectFoo(filePath))
|
|
50
|
+
*
|
|
51
|
+
* If `collectFoo`'s return type ever gains a non-cloneable member (a function, a
|
|
52
|
+
* `SyntaxNode`, …) the call fails to compile, pointing at the offending key.
|
|
53
|
+
*
|
|
54
|
+
* The parameter is a conditional type rather than an `extends Cloneable<T>`
|
|
55
|
+
* constraint because a self-referential constraint (`T extends Cloneable<T>`)
|
|
56
|
+
* is a "circular constraint" error in TypeScript. For a clone-safe `T` the
|
|
57
|
+
* parameter resolves to `T` (call type-checks as a plain identity); for an
|
|
58
|
+
* unsafe `T` it resolves to `Cloneable<T>` (which has `never` at the bad key),
|
|
59
|
+
* so the argument is rejected.
|
|
60
|
+
*/
|
|
61
|
+
export function assertCloneable(value) {
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Recursion cap for the module's own traversal. An over-deep subtree is treated
|
|
66
|
+
* as non-cloneable rather than recursing to a stack overflow — without this, a
|
|
67
|
+
* deeply-nested record would throw `RangeError` inside the sanitizer and (since
|
|
68
|
+
* the recovery path is the safety net) re-arm the very cascade #2112 fixes. Set
|
|
69
|
+
* far below the observed ~3000-frame overflow and far above any real
|
|
70
|
+
* parse-result record (extraction records are shallow plain data). Note: this
|
|
71
|
+
* caps the module's recursion only; `structuredClone`'s own internal recursion
|
|
72
|
+
* (the `isStructuredCloneable` probe of non-plain objects) is bounded by that
|
|
73
|
+
* helper's catch-all, which turns a probe-side `RangeError` into a
|
|
74
|
+
* non-cloneable verdict — so do not narrow that catch.
|
|
75
|
+
*/
|
|
76
|
+
const MAX_CLONE_DEPTH = 200;
|
|
77
|
+
/**
|
|
78
|
+
* True iff `key` is a canonical array-index string (`"0"`, `"1"`, … `< 2^32-1`)
|
|
79
|
+
* — i.e. one of the slots the numeric index loop already visits. Everything
|
|
80
|
+
* else returned by `Object.keys(array)` is a NON-index own-enumerable property
|
|
81
|
+
* (`arr.meta = …`), which the structured-clone algorithm ALSO serializes (and
|
|
82
|
+
* throws on if non-cloneable). The array branches of `containsNonCloneable` and
|
|
83
|
+
* `stripNonCloneable` use this to scan those extra keys in lockstep.
|
|
84
|
+
*/
|
|
85
|
+
function isArrayIndexKey(key) {
|
|
86
|
+
const n = Number(key);
|
|
87
|
+
return Number.isInteger(n) && n >= 0 && n < 4294967295 && String(n) === key;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Non-allocating scan: returns true on the FIRST value structured-clone would
|
|
91
|
+
* reject. Used to decide whether an array (or element) needs rewriting at all,
|
|
92
|
+
* so clean arrays keep their referential identity and pay no copy cost.
|
|
93
|
+
*/
|
|
94
|
+
function containsNonCloneable(value, seen, depth = 0) {
|
|
95
|
+
const t = typeof value;
|
|
96
|
+
if (t === 'function' || t === 'symbol')
|
|
97
|
+
return true;
|
|
98
|
+
if (value === null || t !== 'object')
|
|
99
|
+
return false;
|
|
100
|
+
// Depth bound: treat an over-deep subtree as non-cloneable (the element is
|
|
101
|
+
// then stripped/dropped) instead of overflowing the stack.
|
|
102
|
+
if (depth >= MAX_CLONE_DEPTH)
|
|
103
|
+
return true;
|
|
104
|
+
const obj = value;
|
|
105
|
+
// Cycles clone fine; don't recurse into one twice.
|
|
106
|
+
if (seen.has(obj))
|
|
107
|
+
return false;
|
|
108
|
+
// Structured-clone-native containers carry no non-cloneable payload of their
|
|
109
|
+
// own; their *contents* still need scanning (a Map value could be a fn).
|
|
110
|
+
if (obj instanceof Date || obj instanceof RegExp)
|
|
111
|
+
return false;
|
|
112
|
+
// Buffers/views usually clone, but a DETACHED one is rejected by
|
|
113
|
+
// structuredClone — probe rather than wave it through. No byteLength
|
|
114
|
+
// heuristic: a legitimately empty `new Uint8Array(0)` also has byteLength 0
|
|
115
|
+
// yet clones fine, so a length check would false-positive.
|
|
116
|
+
if (obj instanceof ArrayBuffer || ArrayBuffer.isView(obj))
|
|
117
|
+
return !isStructuredCloneable(obj);
|
|
118
|
+
seen.add(obj);
|
|
119
|
+
if (Array.isArray(obj)) {
|
|
120
|
+
for (let i = 0; i < obj.length; i++) {
|
|
121
|
+
if (containsNonCloneable(obj[i], seen, depth + 1))
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
// structuredClone also serializes an array's NON-index own-enumerable
|
|
125
|
+
// properties and throws on a non-cloneable one — scan them too (lockstep
|
|
126
|
+
// with stripNonCloneable's array branch; see isArrayIndexKey).
|
|
127
|
+
for (const key of Object.keys(obj)) {
|
|
128
|
+
if (isArrayIndexKey(key))
|
|
129
|
+
continue;
|
|
130
|
+
let child;
|
|
131
|
+
try {
|
|
132
|
+
child = obj[key];
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return true; // a throwing getter can't be serialized either
|
|
136
|
+
}
|
|
137
|
+
if (containsNonCloneable(child, seen, depth + 1))
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
if (obj instanceof Map) {
|
|
143
|
+
for (const [k, v] of obj) {
|
|
144
|
+
if (containsNonCloneable(k, seen, depth + 1) || containsNonCloneable(v, seen, depth + 1))
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
if (obj instanceof Set) {
|
|
150
|
+
for (const v of obj) {
|
|
151
|
+
if (containsNonCloneable(v, seen, depth + 1))
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
// A non-plain object (Promise, WeakMap, class instance with internal slots)
|
|
157
|
+
// that structured clone can't handle: detect via the authoritative probe.
|
|
158
|
+
// Plain objects fall through to a property scan (cheap, no allocation).
|
|
159
|
+
const proto = Object.getPrototypeOf(obj);
|
|
160
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
161
|
+
if (!isStructuredCloneable(obj))
|
|
162
|
+
return true;
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
for (const key of Object.keys(obj)) {
|
|
166
|
+
let child;
|
|
167
|
+
try {
|
|
168
|
+
child = obj[key];
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// A getter that throws can't be serialized either — treat as non-cloneable.
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
if (containsNonCloneable(child, seen, depth + 1))
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
/** Record a strip at `path` (root → `(root)`); keeps the count + key path in sync. */
|
|
180
|
+
function recordStrip(ctx, path) {
|
|
181
|
+
ctx.stripped++;
|
|
182
|
+
ctx.keys.push(path === '' ? '(root)' : path);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Deep-copy `value`, replacing any value structured-clone would reject with
|
|
186
|
+
* `undefined` (which clones fine). Preserves primitives, arrays, plain
|
|
187
|
+
* objects, and the structured-clone-native containers (Date, RegExp, Map,
|
|
188
|
+
* Set, ArrayBuffer, TypedArray). Rebuilds only what it must — clean leaves are
|
|
189
|
+
* returned by reference. `path` is the dotted key path of `value` (for the
|
|
190
|
+
* diagnostic record).
|
|
191
|
+
*/
|
|
192
|
+
function stripNonCloneable(value, ctx, depth = 0, path = '') {
|
|
193
|
+
const t = typeof value;
|
|
194
|
+
if (t === 'function' || t === 'symbol') {
|
|
195
|
+
recordStrip(ctx, path);
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
if (value === null || t !== 'object')
|
|
199
|
+
return value;
|
|
200
|
+
// Depth bound (mirrors containsNonCloneable): drop an over-deep subtree to
|
|
201
|
+
// `undefined` (itself cloneable, and a legal property value / array element)
|
|
202
|
+
// rather than overflowing the stack.
|
|
203
|
+
if (depth >= MAX_CLONE_DEPTH) {
|
|
204
|
+
recordStrip(ctx, path);
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
const obj = value;
|
|
208
|
+
// Memoized? Return the SAME stripped copy (preserves DAG shape; terminates
|
|
209
|
+
// cycles by returning the in-progress copy inserted before recursing below).
|
|
210
|
+
if (ctx.seen.has(obj))
|
|
211
|
+
return ctx.seen.get(obj);
|
|
212
|
+
// Leaf-like values: returned by reference, but still memoize the decision so
|
|
213
|
+
// a second alias resolves identically.
|
|
214
|
+
if (obj instanceof Date || obj instanceof RegExp) {
|
|
215
|
+
ctx.seen.set(obj, value);
|
|
216
|
+
return value;
|
|
217
|
+
}
|
|
218
|
+
if (obj instanceof ArrayBuffer || ArrayBuffer.isView(obj)) {
|
|
219
|
+
// Keep a live buffer/view (even an empty one); drop a detached one, which
|
|
220
|
+
// structuredClone rejects. The probe is exact — no byteLength heuristic.
|
|
221
|
+
if (!isStructuredCloneable(obj)) {
|
|
222
|
+
recordStrip(ctx, path);
|
|
223
|
+
ctx.seen.set(obj, undefined);
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
ctx.seen.set(obj, value);
|
|
227
|
+
return value;
|
|
228
|
+
}
|
|
229
|
+
// Containers: allocate the empty copy, memoize it BEFORE recursing, then fill
|
|
230
|
+
// — so a cycle/alias that re-enters gets this in-progress copy.
|
|
231
|
+
if (Array.isArray(obj)) {
|
|
232
|
+
const out = [];
|
|
233
|
+
ctx.seen.set(obj, out);
|
|
234
|
+
for (let i = 0; i < obj.length; i++)
|
|
235
|
+
out.push(stripNonCloneable(obj[i], ctx, depth + 1, `${path}[${i}]`));
|
|
236
|
+
// Carry NON-index own-enumerable props through the same strip (lockstep
|
|
237
|
+
// with containsNonCloneable): structuredClone serializes them, so a
|
|
238
|
+
// non-cloneable one must be stripped rather than left to throw on re-post.
|
|
239
|
+
for (const key of Object.keys(obj)) {
|
|
240
|
+
if (isArrayIndexKey(key))
|
|
241
|
+
continue;
|
|
242
|
+
const childPath = `${path}.${key}`;
|
|
243
|
+
let child;
|
|
244
|
+
try {
|
|
245
|
+
child = obj[key];
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
recordStrip(ctx, childPath);
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
out[key] = stripNonCloneable(child, ctx, depth + 1, childPath);
|
|
252
|
+
}
|
|
253
|
+
return out;
|
|
254
|
+
}
|
|
255
|
+
if (obj instanceof Map) {
|
|
256
|
+
// Scope limit (acceptable): object keys aren't identity-preserved across
|
|
257
|
+
// stripping. Parse-result Maps are primitive-keyed, so this never bites.
|
|
258
|
+
const out = new Map();
|
|
259
|
+
ctx.seen.set(obj, out);
|
|
260
|
+
for (const [k, v] of obj)
|
|
261
|
+
out.set(stripNonCloneable(k, ctx, depth + 1, `${path}<key>`), stripNonCloneable(v, ctx, depth + 1, `${path}<map>`));
|
|
262
|
+
return out;
|
|
263
|
+
}
|
|
264
|
+
if (obj instanceof Set) {
|
|
265
|
+
const out = new Set();
|
|
266
|
+
ctx.seen.set(obj, out);
|
|
267
|
+
for (const v of obj)
|
|
268
|
+
out.add(stripNonCloneable(v, ctx, depth + 1, `${path}<set>`));
|
|
269
|
+
return out;
|
|
270
|
+
}
|
|
271
|
+
const proto = Object.getPrototypeOf(obj);
|
|
272
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
273
|
+
// Non-plain object that the probe already flagged as non-cloneable and
|
|
274
|
+
// that we can't safely reconstruct (Promise, WeakMap, class instance with
|
|
275
|
+
// internal slots). Drop it whole — memoize the decision so aliases agree.
|
|
276
|
+
if (!isStructuredCloneable(obj)) {
|
|
277
|
+
recordStrip(ctx, path);
|
|
278
|
+
ctx.seen.set(obj, undefined);
|
|
279
|
+
return undefined;
|
|
280
|
+
}
|
|
281
|
+
ctx.seen.set(obj, value);
|
|
282
|
+
return value;
|
|
283
|
+
}
|
|
284
|
+
const out = {};
|
|
285
|
+
ctx.seen.set(obj, out);
|
|
286
|
+
for (const key of Object.keys(obj)) {
|
|
287
|
+
const childPath = path === '' ? key : `${path}.${key}`;
|
|
288
|
+
let child;
|
|
289
|
+
try {
|
|
290
|
+
child = obj[key];
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// A getter that throws is non-serializable — drop the property.
|
|
294
|
+
recordStrip(ctx, childPath);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
out[key] = stripNonCloneable(child, ctx, depth + 1, childPath);
|
|
298
|
+
}
|
|
299
|
+
return out;
|
|
300
|
+
}
|
|
301
|
+
/** Keys checked (top-level and one level deep) to attribute a record to a file. */
|
|
302
|
+
const DEFAULT_PATH_KEYS = ['filePath', 'path', 'file'];
|
|
303
|
+
/** Read `obj[key]`, returning undefined if the access throws (throwing getter / Proxy trap). */
|
|
304
|
+
function safeGet(obj, key) {
|
|
305
|
+
try {
|
|
306
|
+
return obj[key];
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/** Read a path key off a child object (one level deep); never throws. */
|
|
313
|
+
function pathFromChild(child, pathKeys) {
|
|
314
|
+
if (child === null || typeof child !== 'object')
|
|
315
|
+
return undefined;
|
|
316
|
+
const crec = child;
|
|
317
|
+
for (const pk of pathKeys) {
|
|
318
|
+
const v = safeGet(crec, pk);
|
|
319
|
+
if (typeof v === 'string')
|
|
320
|
+
return v;
|
|
321
|
+
}
|
|
322
|
+
return undefined;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Best-effort source-path extraction for reporting; never throws. Reads are
|
|
326
|
+
* defensive (a throwing getter / Proxy trap on a path-attribution key must not
|
|
327
|
+
* escape and abandon the sanitize — it would re-arm the fail-closed cascade).
|
|
328
|
+
*/
|
|
329
|
+
function findFilePath(element, pathKeys) {
|
|
330
|
+
if (element === null || typeof element !== 'object')
|
|
331
|
+
return undefined;
|
|
332
|
+
const rec = element;
|
|
333
|
+
// Top level first — a ParsedFile carries `filePath` here.
|
|
334
|
+
for (const key of pathKeys) {
|
|
335
|
+
const v = safeGet(rec, key);
|
|
336
|
+
if (typeof v === 'string')
|
|
337
|
+
return v;
|
|
338
|
+
}
|
|
339
|
+
// Known child next — a ParsedNode carries its path at `properties.filePath`.
|
|
340
|
+
// Prefer it over the generic sweep so attribution is deterministic when a
|
|
341
|
+
// sibling child also happens to carry a path-like key.
|
|
342
|
+
const fromProps = pathFromChild(safeGet(rec, 'properties'), pathKeys);
|
|
343
|
+
if (fromProps !== undefined)
|
|
344
|
+
return fromProps;
|
|
345
|
+
// Generic one-level sweep as the fallback for other shapes.
|
|
346
|
+
let keys;
|
|
347
|
+
try {
|
|
348
|
+
keys = Object.keys(rec);
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
return undefined; // a Proxy ownKeys trap that throws — give up on attribution
|
|
352
|
+
}
|
|
353
|
+
for (const key of keys) {
|
|
354
|
+
if (key === 'properties')
|
|
355
|
+
continue; // already checked above
|
|
356
|
+
const fromChild = pathFromChild(safeGet(rec, key), pathKeys);
|
|
357
|
+
if (fromChild !== undefined)
|
|
358
|
+
return fromChild;
|
|
359
|
+
}
|
|
360
|
+
return undefined;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Make a worker result's boundary-crossing array fields structured-cloneable,
|
|
364
|
+
* mutating `result` in place. Only arrays that actually contain a
|
|
365
|
+
* non-cloneable value are rewritten; everything else keeps referential
|
|
366
|
+
* identity. Returns the list of affected file paths for reporting.
|
|
367
|
+
*
|
|
368
|
+
* Call this after ANY failure of the fast-path post — a `DataCloneError`, OR a
|
|
369
|
+
* throwing getter's own error surfaced by structuredClone (the caller in
|
|
370
|
+
* `post-result.ts` recovers on any throw, not only `DataCloneError`).
|
|
371
|
+
*/
|
|
372
|
+
export function makeWorkerResultCloneSafe(result, options) {
|
|
373
|
+
const pathKeys = options.pathKeys ?? DEFAULT_PATH_KEYS;
|
|
374
|
+
const skipped = [];
|
|
375
|
+
for (const field of Object.keys(result)) {
|
|
376
|
+
if (options.skipFields?.has(field))
|
|
377
|
+
continue;
|
|
378
|
+
const value = result[field];
|
|
379
|
+
if (!Array.isArray(value))
|
|
380
|
+
continue;
|
|
381
|
+
const dropWhole = options.dropWholeElement.has(field);
|
|
382
|
+
// `out` is built lazily — only once a dirty element appears — by copying the
|
|
383
|
+
// clean prefix, so a fully-clean array is never rebuilt and keeps its
|
|
384
|
+
// referential identity (no field reassignment). A dirty element is scanned
|
|
385
|
+
// (containsNonCloneable) and then stripped (stripNonCloneable): two passes,
|
|
386
|
+
// deliberately. The non-allocating pre-scan is exactly what lets CLEAN
|
|
387
|
+
// elements stay by reference (zero-copy) — replacing it with an
|
|
388
|
+
// always-allocating strip would regress that. This whole path is
|
|
389
|
+
// failure-path-only (the fast post already threw), so the second pass over
|
|
390
|
+
// the rare dirty element is acceptable.
|
|
391
|
+
let out = null;
|
|
392
|
+
for (let i = 0; i < value.length; i++) {
|
|
393
|
+
const element = value[i];
|
|
394
|
+
try {
|
|
395
|
+
if (!containsNonCloneable(element, new WeakSet())) {
|
|
396
|
+
if (out)
|
|
397
|
+
out.push(element);
|
|
398
|
+
continue;
|
|
399
|
+
}
|
|
400
|
+
if (!out)
|
|
401
|
+
out = value.slice(0, i); // first dirty element: copy clean prefix
|
|
402
|
+
const path = findFilePath(element, pathKeys) ?? '(unknown)';
|
|
403
|
+
if (dropWhole) {
|
|
404
|
+
skipped.push({ path, reason: `dropped non-serializable ${field} entry` });
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
407
|
+
const ctx = { stripped: 0, seen: new Map(), keys: [] };
|
|
408
|
+
const cleaned = stripNonCloneable(element, ctx);
|
|
409
|
+
// Last-resort guard: if stripping functions/symbols still left something
|
|
410
|
+
// structured-clone rejects, drop the element rather than re-throw.
|
|
411
|
+
if (isStructuredCloneable(cleaned)) {
|
|
412
|
+
out.push(cleaned);
|
|
413
|
+
// Name the offending key path(s) so the leak is locatable from the log
|
|
414
|
+
// (e.g. "from nodes: properties.toString") — not just the array field.
|
|
415
|
+
const at = ctx.keys.slice(0, 3).join(', ');
|
|
416
|
+
const more = ctx.keys.length > 3 ? `, …+${ctx.keys.length - 3}` : '';
|
|
417
|
+
skipped.push({
|
|
418
|
+
path,
|
|
419
|
+
reason: `stripped ${ctx.stripped} non-serializable value(s) from ${field}: ${at}${more}`,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
skipped.push({ path, reason: `dropped unsalvageable ${field} entry` });
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
catch {
|
|
427
|
+
// A throw DURING this element's scan/strip — a Proxy with a throwing
|
|
428
|
+
// `getPrototypeOf`/`ownKeys` trap reached by Object.getPrototypeOf /
|
|
429
|
+
// Object.keys, or any other structural-enumeration throw. Drop the
|
|
430
|
+
// element rather than let the throw escape to postResultCloneSafe's
|
|
431
|
+
// fail-closed {type:'error'} (which under POOL_SIZE=1 re-arms the
|
|
432
|
+
// cascade this net prevents). One pathological element can't sink the
|
|
433
|
+
// whole result.
|
|
434
|
+
if (!out)
|
|
435
|
+
out = value.slice(0, i);
|
|
436
|
+
skipped.push({ path: '(unknown)', reason: `dropped ${field} entry (sanitizer error)` });
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
if (out)
|
|
440
|
+
result[field] = out;
|
|
441
|
+
}
|
|
442
|
+
// Final safety gate. The loop above only rewrites ARRAY fields, so a future
|
|
443
|
+
// non-array result sink (a nested object / Map) — or an array field whose own
|
|
444
|
+
// non-index property the element loop didn't reach — could still hold a
|
|
445
|
+
// non-cloneable value and throw on the re-post. Make "the returned result is
|
|
446
|
+
// structured-cloneable" a hard postcondition: strip any remaining offending
|
|
447
|
+
// field in place. Failure-path-only and a no-op once the result is already
|
|
448
|
+
// clean (the per-field probe short-circuits every clean field).
|
|
449
|
+
if (!isStructuredCloneable(result)) {
|
|
450
|
+
for (const field of Object.keys(result)) {
|
|
451
|
+
if (options.skipFields?.has(field))
|
|
452
|
+
continue;
|
|
453
|
+
if (isStructuredCloneable(result[field]))
|
|
454
|
+
continue;
|
|
455
|
+
const ctx = { stripped: 0, seen: new Map(), keys: [] };
|
|
456
|
+
result[field] = stripNonCloneable(result[field], ctx);
|
|
457
|
+
const at = ctx.keys.slice(0, 3).join(', ');
|
|
458
|
+
skipped.push({
|
|
459
|
+
path: '(result)',
|
|
460
|
+
reason: `stripped ${ctx.stripped} non-serializable value(s) from ${field}${at ? `: ${at}` : ''}`,
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return { skipped };
|
|
465
|
+
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { SupportedLanguages } from '../../../_shared/index.js';
|
|
2
|
+
import type { SkippedPath } from './clone-safety.js';
|
|
2
3
|
import type { ExtractedRouterInclude, ExtractedRouterImport, ExtractedRouterModuleAlias } from '../route-extractors/fastapi-router-bindings.js';
|
|
3
4
|
import { type MixedChainStep } from '../utils/call-analysis.js';
|
|
4
5
|
import type { ConstructorBinding } from '../type-env.js';
|
|
5
6
|
import type { NodeLabel, ParameterTypeClass } from '../../../_shared/index.js';
|
|
6
7
|
import type { ParsedFile } from '../../../_shared/index.js';
|
|
7
8
|
import { type ExtractedRoute } from '../route-extractors/laravel.js';
|
|
9
|
+
import { type CfgSkipCounts } from '../cfg/collect.js';
|
|
8
10
|
export type { ExtractedRoute } from '../route-extractors/laravel.js';
|
|
9
11
|
interface ParsedNode {
|
|
10
12
|
id: string;
|
|
@@ -49,6 +51,7 @@ interface ParsedSymbol {
|
|
|
49
51
|
isReadonly?: boolean;
|
|
50
52
|
isAbstract?: boolean;
|
|
51
53
|
isFinal?: boolean;
|
|
54
|
+
isDeleted?: boolean;
|
|
52
55
|
annotations?: string[];
|
|
53
56
|
}
|
|
54
57
|
export interface ExtractedCall {
|
|
@@ -201,6 +204,26 @@ export interface ParseWorkerResult {
|
|
|
201
204
|
*/
|
|
202
205
|
parsedFiles: ParsedFile[];
|
|
203
206
|
skippedLanguages: Record<string, number>;
|
|
207
|
+
/**
|
|
208
|
+
* Files whose parse output carried a value the structured-clone algorithm
|
|
209
|
+
* couldn't serialize across the worker boundary (#2112). The clone-safety
|
|
210
|
+
* net stripped or dropped the offending value so the result could be
|
|
211
|
+
* delivered; these paths are surfaced to the operator so the (rare) data
|
|
212
|
+
* loss is visible. Optional for cache backward compatibility — older cache
|
|
213
|
+
* entries predate the field; consumers must guard with `?? []`.
|
|
214
|
+
*/
|
|
215
|
+
skippedPaths?: SkippedPath[];
|
|
216
|
+
/**
|
|
217
|
+
* Per-language CFG-bearing functions skipped during the worker walk, bucketed
|
|
218
|
+
* by reason (#2195): too-many-lines, too-deeply-nested (the proactive
|
|
219
|
+
* depth-guard bail), or build-error. Survives the parse cache (a small number
|
|
220
|
+
* map, kept by `...result` in slimParseWorkerResultsForCache) and is merged +
|
|
221
|
+
* logged per-language in `dispatchChunkParse` (alongside `skippedLanguages`),
|
|
222
|
+
* so a CFG coverage gap is visible. Like that sibling telemetry the warn is
|
|
223
|
+
* emitted for freshly-parsed chunks, not re-emitted on a warm cache hit.
|
|
224
|
+
* Optional for cache backward-compatibility — older shards predate it.
|
|
225
|
+
*/
|
|
226
|
+
cfgSkipped?: Record<string, CfgSkipCounts>;
|
|
204
227
|
fileCount: number;
|
|
205
228
|
}
|
|
206
229
|
export interface ParseWorkerInput {
|