@unerr-ai/unerr 0.2.0 → 0.2.2
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 +6 -0
- package/dist/cli.js +37236 -35793
- package/package.json +6 -1
- package/dist/behaviors/agent-llm-bridge.js +0 -166
- package/dist/behaviors/architecture-guard.js +0 -256
- package/dist/behaviors/auto-doc.js +0 -247
- package/dist/behaviors/cascade-guard.js +0 -289
- package/dist/behaviors/change-narrative.js +0 -270
- package/dist/behaviors/convention-drift.js +0 -290
- package/dist/behaviors/framework.js +0 -235
- package/dist/behaviors/guard-formatter.js +0 -44
- package/dist/behaviors/incomplete-work.js +0 -270
- package/dist/behaviors/loop-breaker.js +0 -300
- package/dist/behaviors/session-continuity.js +0 -208
- package/dist/commands/branches.js +0 -97
- package/dist/commands/check-commit.js +0 -225
- package/dist/commands/compress-output.js +0 -64
- package/dist/commands/config-verify.js +0 -243
- package/dist/commands/daemon.js +0 -905
- package/dist/commands/dashboard.js +0 -52
- package/dist/commands/debug.js +0 -200
- package/dist/commands/enrich.js +0 -184
- package/dist/commands/exec.js +0 -233
- package/dist/commands/gain.js +0 -156
- package/dist/commands/hook.js +0 -88
- package/dist/commands/index.js +0 -88
- package/dist/commands/init.js +0 -74
- package/dist/commands/install.js +0 -505
- package/dist/commands/learn.js +0 -116
- package/dist/commands/manifest.js +0 -193
- package/dist/commands/rewind.js +0 -103
- package/dist/commands/serve.js +0 -19
- package/dist/commands/setup-wizard.js +0 -414
- package/dist/commands/skills.js +0 -64
- package/dist/commands/stats.js +0 -20
- package/dist/commands/status.js +0 -654
- package/dist/commands/timeline.js +0 -139
- package/dist/commands/uninstall.js +0 -230
- package/dist/components/App.js +0 -109
- package/dist/components/Banner.js +0 -12
- package/dist/components/ConfirmPrompt.js +0 -25
- package/dist/components/DriftSummary.js +0 -23
- package/dist/components/GradeBadge.js +0 -15
- package/dist/components/HealthCard.js +0 -18
- package/dist/components/InkSpinner.js +0 -22
- package/dist/components/InputBox.js +0 -17
- package/dist/components/KeyValue.js +0 -13
- package/dist/components/MessageList.js +0 -14
- package/dist/components/ProgressBar.js +0 -26
- package/dist/components/Section.js +0 -16
- package/dist/components/SessionSummaryCard.js +0 -73
- package/dist/components/StartupDisplay.js +0 -24
- package/dist/components/StatusDashboard.js +0 -57
- package/dist/components/StatusLine.js +0 -8
- package/dist/components/StepLine.js +0 -22
- package/dist/components/Theme.js +0 -20
- package/dist/components/ToolProgress.js +0 -8
- package/dist/components/ViolationList.js +0 -21
- package/dist/components/render.js +0 -13
- package/dist/config/agent-registry.js +0 -237
- package/dist/config/claude-settings-hooks.js +0 -304
- package/dist/config/hook-installer.js +0 -65
- package/dist/config/instruction-writer.js +0 -388
- package/dist/config/mcp-config-writer.js +0 -266
- package/dist/config/settings.js +0 -174
- package/dist/config/tool-detector.js +0 -42
- package/dist/config/value-surfacing.js +0 -119
- package/dist/core/context-assembly.js +0 -108
- package/dist/core/conversation.js +0 -33
- package/dist/core/local-chat-provider.js +0 -475
- package/dist/core/provider-factory.js +0 -55
- package/dist/core/providers.js +0 -90
- package/dist/core/query-engine.js +0 -174
- package/dist/daemon/api.js +0 -312
- package/dist/daemon/autostart.js +0 -119
- package/dist/daemon/bootstrap.js +0 -39
- package/dist/daemon/client.js +0 -164
- package/dist/daemon/detect-ci.js +0 -81
- package/dist/daemon/platform-linux.js +0 -146
- package/dist/daemon/platform-macos.js +0 -134
- package/dist/daemon/platform-windows.js +0 -116
- package/dist/daemon/process-manager.js +0 -299
- package/dist/daemon/protocol.js +0 -23
- package/dist/daemon/registry.js +0 -270
- package/dist/daemon/settings-schema.js +0 -72
- package/dist/daemon/system-health.js +0 -134
- package/dist/daemon/version-checker.js +0 -262
- package/dist/daemon/warm-start.js +0 -223
- package/dist/entrypoints/cli.js +0 -1043
- package/dist/entrypoints/daemon.js +0 -380
- package/dist/entrypoints/repl.js +0 -147
- package/dist/hooks/adapters/claude-code.js +0 -90
- package/dist/hooks/adapters/cline.js +0 -100
- package/dist/hooks/adapters/cursor.js +0 -98
- package/dist/hooks/hook-dedup.js +0 -79
- package/dist/hooks/hook-runner.js +0 -113
- package/dist/hooks/navigation-hooks.js +0 -175
- package/dist/hooks/prompt-hooks.js +0 -63
- package/dist/hooks/shell-hooks.js +0 -47
- package/dist/ignore.js +0 -111
- package/dist/intelligence/approach-suggester.js +0 -61
- package/dist/intelligence/ast-extractor.js +0 -2615
- package/dist/intelligence/ast-worker.js +0 -34
- package/dist/intelligence/background-indexer.js +0 -121
- package/dist/intelligence/blast-radius.js +0 -200
- package/dist/intelligence/community-detection.js +0 -691
- package/dist/intelligence/community-detector.js +0 -184
- package/dist/intelligence/computation-scheduler.js +0 -75
- package/dist/intelligence/confidence-propagation.js +0 -47
- package/dist/intelligence/convention-detector.js +0 -242
- package/dist/intelligence/convention-learner.js +0 -205
- package/dist/intelligence/convention-matcher.js +0 -205
- package/dist/intelligence/cozo-schema.js +0 -376
- package/dist/intelligence/decision-point-detector.js +0 -90
- package/dist/intelligence/deep-dive-tools.js +0 -586
- package/dist/intelligence/durability-scorer.js +0 -84
- package/dist/intelligence/exploration-cost.js +0 -204
- package/dist/intelligence/exploration-pattern-tracker.js +0 -61
- package/dist/intelligence/fact-generator.js +0 -322
- package/dist/intelligence/facts-schema.js +0 -90
- package/dist/intelligence/file-intelligence.js +0 -59
- package/dist/intelligence/graph-holder.js +0 -220
- package/dist/intelligence/graph-temporal-joiner.js +0 -238
- package/dist/intelligence/health-grade.js +0 -423
- package/dist/intelligence/health-grader.js +0 -200
- package/dist/intelligence/health-map-data.js +0 -259
- package/dist/intelligence/import-symbols.js +0 -136
- package/dist/intelligence/incremental-indexer.js +0 -658
- package/dist/intelligence/indexer/centrality.js +0 -62
- package/dist/intelligence/indexer/cfg-context.js +0 -95
- package/dist/intelligence/indexer/confidence.js +0 -34
- package/dist/intelligence/indexer/cross-file-resolver.js +0 -104
- package/dist/intelligence/indexer/edge-repair.js +0 -89
- package/dist/intelligence/indexer/entity-key.js +0 -17
- package/dist/intelligence/indexer/export-map.js +0 -132
- package/dist/intelligence/indexer/git-cochange.js +0 -128
- package/dist/intelligence/indexer/graph-patch.js +0 -147
- package/dist/intelligence/indexer/incremental.js +0 -78
- package/dist/intelligence/indexer/ingest.js +0 -160
- package/dist/intelligence/indexer/language-detect.js +0 -226
- package/dist/intelligence/indexer/metadata.js +0 -63
- package/dist/intelligence/indexer/mutation-tracker.js +0 -79
- package/dist/intelligence/indexer/orchestrator.js +0 -155
- package/dist/intelligence/indexer/plugin-interface.js +0 -31
- package/dist/intelligence/indexer/plugins/csharp.js +0 -440
- package/dist/intelligence/indexer/plugins/go.js +0 -335
- package/dist/intelligence/indexer/plugins/java.js +0 -370
- package/dist/intelligence/indexer/plugins/python.js +0 -358
- package/dist/intelligence/indexer/plugins/regex-fallback.js +0 -82
- package/dist/intelligence/indexer/plugins/ruby.js +0 -290
- package/dist/intelligence/indexer/plugins/rust.js +0 -484
- package/dist/intelligence/indexer/plugins/tier2-generic.js +0 -310
- package/dist/intelligence/indexer/plugins/typescript.js +0 -456
- package/dist/intelligence/indexer/resource-monitor.js +0 -93
- package/dist/intelligence/indexer/scip/decoder.js +0 -253
- package/dist/intelligence/indexer/scip/detector.js +0 -232
- package/dist/intelligence/indexer/scip/downloader.js +0 -427
- package/dist/intelligence/indexer/scip/fallback.js +0 -34
- package/dist/intelligence/indexer/scip/merger.js +0 -109
- package/dist/intelligence/indexer/scip/orchestrator.js +0 -433
- package/dist/intelligence/indexer/scip/runner.js +0 -98
- package/dist/intelligence/indexer/snapshot.js +0 -66
- package/dist/intelligence/indexer/test-detector.js +0 -196
- package/dist/intelligence/indexer/watch-integration.js +0 -61
- package/dist/intelligence/indexer/worker.js +0 -85
- package/dist/intelligence/local-convention-detector.js +0 -437
- package/dist/intelligence/local-embeddings.js +0 -190
- package/dist/intelligence/local-graph.js +0 -1946
- package/dist/intelligence/local-indexer.js +0 -1575
- package/dist/intelligence/local-llm.js +0 -163
- package/dist/intelligence/local-rule-generator.js +0 -154
- package/dist/intelligence/local-snapshot.js +0 -213
- package/dist/intelligence/negative-knowledge.js +0 -103
- package/dist/intelligence/persistent-db.js +0 -85
- package/dist/intelligence/query-router.js +0 -2556
- package/dist/intelligence/risk-classifier.js +0 -116
- package/dist/intelligence/rule-evaluator.js +0 -380
- package/dist/intelligence/rule-generator.js +0 -49
- package/dist/intelligence/search-index.js +0 -173
- package/dist/intelligence/semantic/docstring-extractor.js +0 -67
- package/dist/intelligence/semantic/embedding-store.js +0 -52
- package/dist/intelligence/semantic/enrichment-orchestrator.js +0 -48
- package/dist/intelligence/semantic/git-message-miner.js +0 -114
- package/dist/intelligence/semantic/identifier-tokenizer.js +0 -51
- package/dist/intelligence/semantic/node2vec-embeddings.js +0 -71
- package/dist/intelligence/semantic/node2vec-walks.js +0 -103
- package/dist/intelligence/semantic/path-domain-inference.js +0 -112
- package/dist/intelligence/semantic/similarity-engine.js +0 -60
- package/dist/intelligence/semantic/tfidf-vectors.js +0 -88
- package/dist/intelligence/session-brief-builder.js +0 -159
- package/dist/intelligence/session-context.js +0 -221
- package/dist/intelligence/session-health-monitor.js +0 -211
- package/dist/intelligence/session-narrative.js +0 -197
- package/dist/intelligence/session-pattern-analyzer.js +0 -218
- package/dist/intelligence/signal-scorer.js +0 -390
- package/dist/intelligence/signal-show-store.js +0 -182
- package/dist/intelligence/smart-truncate.js +0 -158
- package/dist/intelligence/subgraph-cache.js +0 -88
- package/dist/intelligence/temporal-facts.js +0 -494
- package/dist/intelligence/token-estimator.js +0 -100
- package/dist/intelligence/tool-injector.js +0 -87
- package/dist/intelligence/tree-sitter-loader.js +0 -71
- package/dist/intelligence/worker-pool.js +0 -116
- package/dist/proxy/arg-validator.js +0 -79
- package/dist/proxy/auto-bootstrap.js +0 -167
- package/dist/proxy/bridge.js +0 -147
- package/dist/proxy/budget-enforcer.js +0 -70
- package/dist/proxy/compression-quality-monitor.js +0 -160
- package/dist/proxy/compression-stats.js +0 -51
- package/dist/proxy/context-rot-detector.js +0 -137
- package/dist/proxy/drift-detector.js +0 -139
- package/dist/proxy/efficiency-tracker.js +0 -79
- package/dist/proxy/fact-ranking.js +0 -154
- package/dist/proxy/format-encoder.js +0 -266
- package/dist/proxy/http-transport.js +0 -90
- package/dist/proxy/lifecycle-actor.js +0 -55
- package/dist/proxy/lifecycle-machine.js +0 -187
- package/dist/proxy/log-tailer.js +0 -265
- package/dist/proxy/model-pricing.js +0 -98
- package/dist/proxy/network-firewall.js +0 -141
- package/dist/proxy/nudge-state.js +0 -93
- package/dist/proxy/output-compressor.js +0 -185
- package/dist/proxy/pid-lock.js +0 -291
- package/dist/proxy/proxy-context.js +0 -11
- package/dist/proxy/proxy.js +0 -2633
- package/dist/proxy/response-enrichment.js +0 -32
- package/dist/proxy/response-envelope.js +0 -313
- package/dist/proxy/session-dedup.js +0 -82
- package/dist/proxy/session-legend.js +0 -30
- package/dist/proxy/session-persistence.js +0 -210
- package/dist/proxy/session-resume.js +0 -94
- package/dist/proxy/session-stats.js +0 -513
- package/dist/proxy/shell-classifier.js +0 -1346
- package/dist/proxy/shell-compression-log.js +0 -93
- package/dist/proxy/shell-compressor.js +0 -390
- package/dist/proxy/shell-graph-boost.js +0 -202
- package/dist/proxy/shell-monitor-map.js +0 -18
- package/dist/proxy/shell-stats.js +0 -54
- package/dist/proxy/shell-strategies/cloud.js +0 -215
- package/dist/proxy/shell-strategies/diff.js +0 -159
- package/dist/proxy/shell-strategies/error-diagnostic.js +0 -796
- package/dist/proxy/shell-strategies/filter-dsl.js +0 -358
- package/dist/proxy/shell-strategies/git-status.js +0 -177
- package/dist/proxy/shell-strategies/key-value.js +0 -193
- package/dist/proxy/shell-strategies/log-text.js +0 -154
- package/dist/proxy/shell-strategies/omni.js +0 -188
- package/dist/proxy/shell-strategies/progress.js +0 -55
- package/dist/proxy/shell-strategies/redact.js +0 -76
- package/dist/proxy/shell-strategies/structured.js +0 -241
- package/dist/proxy/shell-strategies/tabular.js +0 -243
- package/dist/proxy/shell-strategies/test-results-types.js +0 -13
- package/dist/proxy/shell-strategies/test-results.js +0 -784
- package/dist/proxy/shell-strategies/tree-paths.js +0 -144
- package/dist/proxy/shell-strategies/yaml.js +0 -182
- package/dist/proxy/shell-tee.js +0 -111
- package/dist/proxy/signal-dedup.js +0 -171
- package/dist/proxy/startup-renderer.js +0 -158
- package/dist/proxy/task-token-display.js +0 -38
- package/dist/proxy/token-counter.js +0 -61
- package/dist/proxy/tool-clusters.js +0 -273
- package/dist/proxy/tool-definitions.js +0 -525
- package/dist/proxy/transport-mux.js +0 -229
- package/dist/proxy/wire-cap.js +0 -268
- package/dist/rules/developer.mozilla.org.json +0 -9
- package/dist/rules/github.com.json +0 -21
- package/dist/schemas/api/skills.js +0 -19
- package/dist/schemas/common/errors.js +0 -7
- package/dist/schemas/common/headers.js +0 -5
- package/dist/schemas/entities/edge.js +0 -25
- package/dist/schemas/entities/entity.js +0 -22
- package/dist/schemas/entities/rule.js +0 -18
- package/dist/schemas/index.js +0 -14
- package/dist/server/event-bus.js +0 -59
- package/dist/server/http.js +0 -156
- package/dist/server/middleware.js +0 -70
- package/dist/server/routes/drift.js +0 -97
- package/dist/server/routes/intelligence.js +0 -1217
- package/dist/server/routes/reasoning-quality.js +0 -444
- package/dist/server/routes/session.js +0 -86
- package/dist/server/routes/stream.js +0 -120
- package/dist/server/routes/system.js +0 -73
- package/dist/server/routes/temporal.js +0 -170
- package/dist/server/routes/timeline.js +0 -232
- package/dist/server/routes/token-flow.js +0 -403
- package/dist/skills/effectiveness-tracker.js +0 -93
- package/dist/skills/local-pack.js +0 -380
- package/dist/skills/resolver.js +0 -495
- package/dist/state-detector.js +0 -83
- package/dist/timeline/intent-detector.js +0 -263
- package/dist/timeline/loop-miner.js +0 -140
- package/dist/timeline/open-threads.js +0 -49
- package/dist/timeline/signal-reinforcer.js +0 -62
- package/dist/timeline/timeline-bootstrap.js +0 -151
- package/dist/timeline/timeline-store.js +0 -618
- package/dist/tools/coding/bash.js +0 -49
- package/dist/tools/coding/file-edit.js +0 -72
- package/dist/tools/coding/file-outline.js +0 -227
- package/dist/tools/coding/file-read-protocol.js +0 -425
- package/dist/tools/coding/file-read.js +0 -35
- package/dist/tools/coding/file-write.js +0 -43
- package/dist/tools/coding/glob-tool.js +0 -109
- package/dist/tools/coding/grep.js +0 -162
- package/dist/tools/coding/index.js +0 -27
- package/dist/tools/intelligence/index.js +0 -269
- package/dist/tools/intelligence/record-fact.js +0 -48
- package/dist/tools/intelligence/timeline-markers.js +0 -130
- package/dist/tools/registry.js +0 -47
- package/dist/tools/types.js +0 -8
- package/dist/tracking/auto-snapshot-triggers.js +0 -246
- package/dist/tracking/branch-context.js +0 -115
- package/dist/tracking/branch-snapshot.js +0 -217
- package/dist/tracking/causal-bridge.js +0 -317
- package/dist/tracking/circuit-breaker.js +0 -147
- package/dist/tracking/commit-watcher.js +0 -114
- package/dist/tracking/context-ledger.js +0 -119
- package/dist/tracking/correction-detector.js +0 -324
- package/dist/tracking/drift-tracker.js +0 -874
- package/dist/tracking/durability-tracker.js +0 -94
- package/dist/tracking/entity-rewind.js +0 -200
- package/dist/tracking/file-hash-state.js +0 -114
- package/dist/tracking/git-attribution.js +0 -132
- package/dist/tracking/git-trailers.js +0 -171
- package/dist/tracking/intelligence-counter.js +0 -46
- package/dist/tracking/intent-correlator.js +0 -202
- package/dist/tracking/intent-encoder.js +0 -52
- package/dist/tracking/intent-token-tracker.js +0 -159
- package/dist/tracking/ledger-archiver.js +0 -94
- package/dist/tracking/ledger-chains.js +0 -245
- package/dist/tracking/metrics-store.js +0 -361
- package/dist/tracking/native-watcher.js +0 -131
- package/dist/tracking/offline-rewind.js +0 -295
- package/dist/tracking/pending-violations.js +0 -74
- package/dist/tracking/persistence-effectiveness.js +0 -167
- package/dist/tracking/prompt-durability.js +0 -202
- package/dist/tracking/quality-signals.js +0 -213
- package/dist/tracking/redactor.js +0 -73
- package/dist/tracking/rewind-engine.js +0 -161
- package/dist/tracking/session-history.js +0 -128
- package/dist/tracking/session-receipt.js +0 -88
- package/dist/tracking/session-summary-writer.js +0 -157
- package/dist/tracking/shadow-ledger.js +0 -321
- package/dist/tracking/stash-manager.js +0 -258
- package/dist/tracking/timeline-fork.js +0 -213
- package/dist/tracking/timeline.js +0 -69
- package/dist/tracking/token-flow.js +0 -276
- package/dist/tracking/turn-segmenter.js +0 -122
- package/dist/tracking/weekly-accumulator.js +0 -179
- package/dist/tracking/working-snapshots.js +0 -188
- package/dist/tracking/workspace-manifest.js +0 -176
- package/dist/transport/http.js +0 -102
- package/dist/utils/counterfactual.js +0 -65
- package/dist/utils/deep-link.js +0 -34
- package/dist/utils/detect.js +0 -193
- package/dist/utils/exec.js +0 -73
- package/dist/utils/file-logger.js +0 -87
- package/dist/utils/format-error.js +0 -29
- package/dist/utils/git.js +0 -181
- package/dist/utils/log.js +0 -57
- package/dist/utils/logger.js +0 -35
- package/dist/utils/mcp-content-json.js +0 -8
- package/dist/utils/session-logger.js +0 -154
- package/dist/utils/startup-log.js +0 -512
- package/dist/utils/ui.js +0 -56
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SCIP Protobuf Decoder — reads SCIP index output and extracts symbol occurrences.
|
|
3
|
-
*
|
|
4
|
-
* SCIP output is a protobuf-encoded Index message (scip.proto schema).
|
|
5
|
-
* Structure:
|
|
6
|
-
* Index {
|
|
7
|
-
* documents: Document[] (field 1)
|
|
8
|
-
* }
|
|
9
|
-
* Document {
|
|
10
|
-
* language: string (field 1)
|
|
11
|
-
* relative_path: string (field 4)
|
|
12
|
-
* occurrences: Occurrence[] (field 3)
|
|
13
|
-
* symbols: SymbolInformation[] (field 2)
|
|
14
|
-
* }
|
|
15
|
-
* Occurrence {
|
|
16
|
-
* range: int32[] (field 1, packed varint)
|
|
17
|
-
* symbol: string (field 2)
|
|
18
|
-
* symbol_roles: int32 (field 3, bit 0 = Definition)
|
|
19
|
-
* }
|
|
20
|
-
*
|
|
21
|
-
* We implement a minimal protobuf decoder — no external dependency needed.
|
|
22
|
-
*/
|
|
23
|
-
import { readFileSync } from "node:fs";
|
|
24
|
-
import { createModuleLogger } from "../../../utils/logger.js";
|
|
25
|
-
const log = createModuleLogger("scip-decoder");
|
|
26
|
-
/**
|
|
27
|
-
* Decode a SCIP protobuf output file into structured symbol occurrences.
|
|
28
|
-
*/
|
|
29
|
-
export async function decodeScipOutput(filePath) {
|
|
30
|
-
const start = performance.now();
|
|
31
|
-
let buffer;
|
|
32
|
-
try {
|
|
33
|
-
buffer = readFileSync(filePath);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return emptyResult(start);
|
|
37
|
-
}
|
|
38
|
-
if (buffer.length === 0)
|
|
39
|
-
return emptyResult(start);
|
|
40
|
-
const documents = [];
|
|
41
|
-
let symbolCount = 0;
|
|
42
|
-
let definitionCount = 0;
|
|
43
|
-
let referenceCount = 0;
|
|
44
|
-
try {
|
|
45
|
-
// Parse top-level Index message
|
|
46
|
-
// SCIP proto: field 1 = metadata, field 2 = documents (repeated)
|
|
47
|
-
let offset = 0;
|
|
48
|
-
while (offset < buffer.length) {
|
|
49
|
-
const field = readField(buffer, offset);
|
|
50
|
-
if (!field)
|
|
51
|
-
break;
|
|
52
|
-
offset = field.nextOffset;
|
|
53
|
-
// field 2 = documents (length-delimited)
|
|
54
|
-
if (field.fieldNumber === 2 && field.wireType === 2) {
|
|
55
|
-
const doc = parseDocument(field.data);
|
|
56
|
-
if (doc?.relativePath) {
|
|
57
|
-
documents.push(doc);
|
|
58
|
-
symbolCount += doc.symbols.length;
|
|
59
|
-
definitionCount += doc.symbols.filter((s) => s.isDefinition).length;
|
|
60
|
-
referenceCount += doc.symbols.filter((s) => !s.isDefinition).length;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch (err) {
|
|
66
|
-
log.warn(`SCIP decode error: ${err instanceof Error ? err.message : String(err)} (decoded ${documents.length} docs before failure)`);
|
|
67
|
-
}
|
|
68
|
-
const durationMs = performance.now() - start;
|
|
69
|
-
log.info(`SCIP decoded: ${documents.length} docs, ${symbolCount} symbols (${definitionCount} defs, ${referenceCount} refs) in ${Math.round(durationMs)}ms`);
|
|
70
|
-
return {
|
|
71
|
-
documents,
|
|
72
|
-
symbolCount,
|
|
73
|
-
definitionCount,
|
|
74
|
-
referenceCount,
|
|
75
|
-
durationMs,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
// ── Document Parsing ────────────────────────────────���─────────────
|
|
79
|
-
function parseDocument(data) {
|
|
80
|
-
let relativePath = "";
|
|
81
|
-
const occurrenceBuffers = [];
|
|
82
|
-
let offset = 0;
|
|
83
|
-
while (offset < data.length) {
|
|
84
|
-
const field = readField(data, offset);
|
|
85
|
-
if (!field)
|
|
86
|
-
break;
|
|
87
|
-
offset = field.nextOffset;
|
|
88
|
-
switch (field.fieldNumber) {
|
|
89
|
-
case 1: // relative_path (string) — scip-typescript puts path in field 1
|
|
90
|
-
if (field.wireType === 2) {
|
|
91
|
-
relativePath = field.data.toString("utf-8");
|
|
92
|
-
}
|
|
93
|
-
break;
|
|
94
|
-
case 2: // occurrences (repeated Occurrence message)
|
|
95
|
-
if (field.wireType === 2) {
|
|
96
|
-
occurrenceBuffers.push(field.data);
|
|
97
|
-
}
|
|
98
|
-
break;
|
|
99
|
-
case 4: // relative_path in older SCIP versions
|
|
100
|
-
if (field.wireType === 2 && !relativePath) {
|
|
101
|
-
relativePath = field.data.toString("utf-8");
|
|
102
|
-
}
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (!relativePath)
|
|
107
|
-
return null;
|
|
108
|
-
// Parse occurrences now that we have the file path
|
|
109
|
-
const symbols = [];
|
|
110
|
-
for (const buf of occurrenceBuffers) {
|
|
111
|
-
const occ = parseOccurrence(buf, relativePath);
|
|
112
|
-
if (occ)
|
|
113
|
-
symbols.push(occ);
|
|
114
|
-
}
|
|
115
|
-
return { relativePath, symbols };
|
|
116
|
-
}
|
|
117
|
-
// ── Occurrence Parsing ────────────────────────────────────────────
|
|
118
|
-
function parseOccurrence(data, filePath) {
|
|
119
|
-
let symbol = "";
|
|
120
|
-
let line = 0;
|
|
121
|
-
let symbolRoles = 0;
|
|
122
|
-
let offset = 0;
|
|
123
|
-
while (offset < data.length) {
|
|
124
|
-
const field = readField(data, offset);
|
|
125
|
-
if (!field)
|
|
126
|
-
break;
|
|
127
|
-
offset = field.nextOffset;
|
|
128
|
-
switch (field.fieldNumber) {
|
|
129
|
-
case 1: // range (packed repeated int32) — [startLine, startChar, endChar] or [startLine, startChar, endLine, endChar]
|
|
130
|
-
if (field.wireType === 2) {
|
|
131
|
-
const rangeData = field.data;
|
|
132
|
-
const values = decodePackedVarints(rangeData);
|
|
133
|
-
if (values.length >= 1)
|
|
134
|
-
line = values[0];
|
|
135
|
-
}
|
|
136
|
-
else if (field.wireType === 0) {
|
|
137
|
-
// Non-packed (shouldn't happen for range but handle gracefully)
|
|
138
|
-
line = field.data;
|
|
139
|
-
}
|
|
140
|
-
break;
|
|
141
|
-
case 2: // symbol (string)
|
|
142
|
-
if (field.wireType === 2) {
|
|
143
|
-
symbol = field.data.toString("utf-8");
|
|
144
|
-
}
|
|
145
|
-
break;
|
|
146
|
-
case 3: // symbol_roles (int32, bit 0 = Definition)
|
|
147
|
-
if (field.wireType === 0) {
|
|
148
|
-
symbolRoles = field.data;
|
|
149
|
-
}
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
if (!symbol)
|
|
154
|
-
return null;
|
|
155
|
-
return {
|
|
156
|
-
symbol,
|
|
157
|
-
filePath,
|
|
158
|
-
line,
|
|
159
|
-
isDefinition: (symbolRoles & 0x01) !== 0,
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
/** Decode a packed varint array from a buffer. */
|
|
163
|
-
function decodePackedVarints(buf) {
|
|
164
|
-
const values = [];
|
|
165
|
-
let offset = 0;
|
|
166
|
-
while (offset < buf.length) {
|
|
167
|
-
const result = readVarint(buf, offset);
|
|
168
|
-
if (!result)
|
|
169
|
-
break;
|
|
170
|
-
values.push(result.value);
|
|
171
|
-
offset = result.offset;
|
|
172
|
-
}
|
|
173
|
-
return values;
|
|
174
|
-
}
|
|
175
|
-
function readField(buffer, offset) {
|
|
176
|
-
if (offset >= buffer.length)
|
|
177
|
-
return null;
|
|
178
|
-
const tagResult = readVarint(buffer, offset);
|
|
179
|
-
if (!tagResult)
|
|
180
|
-
return null;
|
|
181
|
-
const tag = tagResult.value;
|
|
182
|
-
const fieldNumber = tag >>> 3;
|
|
183
|
-
const wireType = tag & 0x07;
|
|
184
|
-
const nextOffset = tagResult.offset;
|
|
185
|
-
if (fieldNumber === 0)
|
|
186
|
-
return null; // Invalid field number
|
|
187
|
-
switch (wireType) {
|
|
188
|
-
case 0: {
|
|
189
|
-
// Varint
|
|
190
|
-
const valResult = readVarint(buffer, nextOffset);
|
|
191
|
-
if (!valResult)
|
|
192
|
-
return null;
|
|
193
|
-
return {
|
|
194
|
-
fieldNumber,
|
|
195
|
-
wireType,
|
|
196
|
-
data: valResult.value,
|
|
197
|
-
nextOffset: valResult.offset,
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
case 1: {
|
|
201
|
-
// 64-bit (skip 8 bytes)
|
|
202
|
-
return { fieldNumber, wireType, data: 0, nextOffset: nextOffset + 8 };
|
|
203
|
-
}
|
|
204
|
-
case 2: {
|
|
205
|
-
// Length-delimited
|
|
206
|
-
const lenResult = readVarint(buffer, nextOffset);
|
|
207
|
-
if (!lenResult)
|
|
208
|
-
return null;
|
|
209
|
-
const len = lenResult.value;
|
|
210
|
-
const dataStart = lenResult.offset;
|
|
211
|
-
if (dataStart + len > buffer.length)
|
|
212
|
-
return null;
|
|
213
|
-
return {
|
|
214
|
-
fieldNumber,
|
|
215
|
-
wireType,
|
|
216
|
-
data: buffer.subarray(dataStart, dataStart + len),
|
|
217
|
-
nextOffset: dataStart + len,
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
case 5: {
|
|
221
|
-
// 32-bit (skip 4 bytes)
|
|
222
|
-
return { fieldNumber, wireType, data: 0, nextOffset: nextOffset + 4 };
|
|
223
|
-
}
|
|
224
|
-
default:
|
|
225
|
-
return null; // Unknown wire type — stop parsing
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
function readVarint(buffer, offset) {
|
|
229
|
-
let value = 0;
|
|
230
|
-
let shift = 0;
|
|
231
|
-
let pos = offset;
|
|
232
|
-
while (pos < buffer.length) {
|
|
233
|
-
const byte = buffer[pos];
|
|
234
|
-
value |= (byte & 0x7f) << shift;
|
|
235
|
-
pos++;
|
|
236
|
-
if ((byte & 0x80) === 0) {
|
|
237
|
-
return { value: value >>> 0, offset: pos }; // unsigned
|
|
238
|
-
}
|
|
239
|
-
shift += 7;
|
|
240
|
-
if (shift > 35)
|
|
241
|
-
return null; // Overflow protection
|
|
242
|
-
}
|
|
243
|
-
return null;
|
|
244
|
-
}
|
|
245
|
-
function emptyResult(start) {
|
|
246
|
-
return {
|
|
247
|
-
documents: [],
|
|
248
|
-
symbolCount: 0,
|
|
249
|
-
definitionCount: 0,
|
|
250
|
-
referenceCount: 0,
|
|
251
|
-
durationMs: performance.now() - start,
|
|
252
|
-
};
|
|
253
|
-
}
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SCIP Binary Detector — resolves SCIP indexer binaries.
|
|
3
|
-
*
|
|
4
|
-
* Strategy:
|
|
5
|
-
* - TypeScript/JavaScript: BUNDLED as npm dependency (@sourcegraph/scip-typescript)
|
|
6
|
-
* - Python: BUNDLED as npm dependency (@sourcegraph/scip-python)
|
|
7
|
-
* - Go/Rust: AUTO-DOWNLOADED to ~/.unerr/bin/ on first use,
|
|
8
|
-
* or detected on PATH if already installed.
|
|
9
|
-
* - Java: Launcher script downloaded, requires JRE on PATH.
|
|
10
|
-
*/
|
|
11
|
-
import { existsSync } from "node:fs";
|
|
12
|
-
import { join } from "node:path";
|
|
13
|
-
import { exec } from "../../../utils/exec.js";
|
|
14
|
-
import { getCachedBinaryPath } from "./downloader.js";
|
|
15
|
-
/**
|
|
16
|
-
* Bundled SCIP tools — shipped as npm dependencies.
|
|
17
|
-
* These are ALWAYS available after `pnpm install`.
|
|
18
|
-
*/
|
|
19
|
-
const BUNDLED_SCIP = {
|
|
20
|
-
typescript: {
|
|
21
|
-
bin: "scip-typescript",
|
|
22
|
-
resolveFrom: "@sourcegraph/scip-typescript",
|
|
23
|
-
},
|
|
24
|
-
python: {
|
|
25
|
-
bin: "scip-python",
|
|
26
|
-
resolveFrom: "@sourcegraph/scip-python",
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* External SCIP tools — checked on PATH after download cache.
|
|
31
|
-
* Only languages with SCIP ✓ in README (Tier 1).
|
|
32
|
-
*/
|
|
33
|
-
const EXTERNAL_SCIP = {
|
|
34
|
-
go: ["scip-go"],
|
|
35
|
-
java: ["scip-java"],
|
|
36
|
-
rust: ["rust-analyzer"],
|
|
37
|
-
ruby: ["scip-ruby"],
|
|
38
|
-
cpp: ["scip-clang"],
|
|
39
|
-
csharp: ["scip-dotnet"],
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Resolve the path to a bundled SCIP binary.
|
|
43
|
-
* Walks up from this file to find node_modules/.bin/<binary>.
|
|
44
|
-
*/
|
|
45
|
-
function resolveBundledBinary(binName) {
|
|
46
|
-
let dir = import.meta.dirname ?? __dirname;
|
|
47
|
-
for (let i = 0; i < 10; i++) {
|
|
48
|
-
const candidate = join(dir, "node_modules", ".bin", binName);
|
|
49
|
-
if (existsSync(candidate))
|
|
50
|
-
return candidate;
|
|
51
|
-
const parent = join(dir, "..");
|
|
52
|
-
if (parent === dir)
|
|
53
|
-
break;
|
|
54
|
-
dir = parent;
|
|
55
|
-
}
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Detect SCIP binary for a language.
|
|
60
|
-
*
|
|
61
|
-
* Resolution order:
|
|
62
|
-
* 1. Bundled (npm) — TypeScript, Python
|
|
63
|
-
* 2. Download cache (~/.unerr/bin/) — auto-downloaded binaries
|
|
64
|
-
* 3. PATH — user-installed binaries
|
|
65
|
-
* 4. Not available — orchestrator will attempt auto-download
|
|
66
|
-
*/
|
|
67
|
-
export async function detectScipBinary(language) {
|
|
68
|
-
// 1. Check bundled first (TypeScript, Python)
|
|
69
|
-
const bundled = BUNDLED_SCIP[language];
|
|
70
|
-
if (bundled) {
|
|
71
|
-
const binPath = resolveBundledBinary(bundled.bin);
|
|
72
|
-
if (binPath) {
|
|
73
|
-
return {
|
|
74
|
-
language,
|
|
75
|
-
binaryName: bundled.bin,
|
|
76
|
-
available: true,
|
|
77
|
-
bundled: true,
|
|
78
|
-
version: null,
|
|
79
|
-
path: binPath,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
// Fallback: try npx (in case node_modules resolution fails)
|
|
83
|
-
return {
|
|
84
|
-
language,
|
|
85
|
-
binaryName: `npx ${bundled.bin}`,
|
|
86
|
-
available: true,
|
|
87
|
-
bundled: true,
|
|
88
|
-
version: null,
|
|
89
|
-
path: null,
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
// 2. Check download cache (~/.unerr/bin/)
|
|
93
|
-
const cachedPath = getCachedBinaryPath(language);
|
|
94
|
-
if (cachedPath) {
|
|
95
|
-
return {
|
|
96
|
-
language,
|
|
97
|
-
binaryName: cachedPath.split("/").pop() ?? `scip-${language}`,
|
|
98
|
-
available: true,
|
|
99
|
-
bundled: false,
|
|
100
|
-
version: null,
|
|
101
|
-
path: cachedPath,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
// 3. Check external binaries on PATH
|
|
105
|
-
const candidates = EXTERNAL_SCIP[language] ?? [];
|
|
106
|
-
for (const candidate of candidates) {
|
|
107
|
-
try {
|
|
108
|
-
const whichResult = await exec("which", [candidate]);
|
|
109
|
-
if (whichResult.exitCode === 0) {
|
|
110
|
-
const versionResult = await exec(candidate, ["--version"]);
|
|
111
|
-
return {
|
|
112
|
-
language,
|
|
113
|
-
binaryName: candidate,
|
|
114
|
-
available: true,
|
|
115
|
-
bundled: false,
|
|
116
|
-
version: versionResult.exitCode === 0
|
|
117
|
-
? (versionResult.stdout.split("\n")[0]?.trim() ?? null)
|
|
118
|
-
: null,
|
|
119
|
-
path: whichResult.stdout.trim() || null,
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch { }
|
|
124
|
-
}
|
|
125
|
-
// 4. Not available — caller should attempt auto-download
|
|
126
|
-
return {
|
|
127
|
-
language,
|
|
128
|
-
binaryName: candidates[0] ?? `scip-${language}`,
|
|
129
|
-
available: false,
|
|
130
|
-
bundled: false,
|
|
131
|
-
version: null,
|
|
132
|
-
path: null,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Extension → SCIP language mapping.
|
|
137
|
-
* Only languages with SCIP support (Tier 1 with SCIP ✓ in README).
|
|
138
|
-
*/
|
|
139
|
-
const EXT_TO_SCIP_LANG = {
|
|
140
|
-
// TypeScript / JavaScript (scip-typescript handles all)
|
|
141
|
-
".ts": "typescript",
|
|
142
|
-
".tsx": "typescript",
|
|
143
|
-
".js": "typescript",
|
|
144
|
-
".jsx": "typescript",
|
|
145
|
-
".mjs": "typescript",
|
|
146
|
-
".cjs": "typescript",
|
|
147
|
-
".mts": "typescript",
|
|
148
|
-
".cts": "typescript",
|
|
149
|
-
// Python
|
|
150
|
-
".py": "python",
|
|
151
|
-
".pyi": "python",
|
|
152
|
-
".pyx": "python",
|
|
153
|
-
// Go
|
|
154
|
-
".go": "go",
|
|
155
|
-
// Java / Kotlin / Scala (JVM — scip-java handles all)
|
|
156
|
-
".java": "java",
|
|
157
|
-
".kt": "java",
|
|
158
|
-
".kts": "java",
|
|
159
|
-
".scala": "java",
|
|
160
|
-
".sc": "java",
|
|
161
|
-
// Rust
|
|
162
|
-
".rs": "rust",
|
|
163
|
-
// Ruby
|
|
164
|
-
".rb": "ruby",
|
|
165
|
-
// C / C++ (scip-clang handles both)
|
|
166
|
-
".c": "cpp",
|
|
167
|
-
".cpp": "cpp",
|
|
168
|
-
".cc": "cpp",
|
|
169
|
-
".cxx": "cpp",
|
|
170
|
-
".h": "cpp",
|
|
171
|
-
".hpp": "cpp",
|
|
172
|
-
".hxx": "cpp",
|
|
173
|
-
// C#
|
|
174
|
-
".cs": "csharp",
|
|
175
|
-
};
|
|
176
|
-
/**
|
|
177
|
-
* Detect the primary language of a project from file extensions.
|
|
178
|
-
* Returns the language with the most source files.
|
|
179
|
-
*/
|
|
180
|
-
export function detectPrimaryLanguage(files) {
|
|
181
|
-
const counts = {};
|
|
182
|
-
for (const file of files) {
|
|
183
|
-
const dotIdx = file.lastIndexOf(".");
|
|
184
|
-
if (dotIdx === -1)
|
|
185
|
-
continue;
|
|
186
|
-
const ext = file.slice(dotIdx);
|
|
187
|
-
const lang = EXT_TO_SCIP_LANG[ext];
|
|
188
|
-
if (lang) {
|
|
189
|
-
counts[lang] = (counts[lang] ?? 0) + 1;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
let maxLang = null;
|
|
193
|
-
let maxCount = 0;
|
|
194
|
-
for (const [lang, count] of Object.entries(counts)) {
|
|
195
|
-
if (count > maxCount) {
|
|
196
|
-
maxCount = count;
|
|
197
|
-
maxLang = lang;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return maxLang;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Detect ALL languages present in the project (for multi-language SCIP).
|
|
204
|
-
* Returns languages sorted by file count (primary first).
|
|
205
|
-
*/
|
|
206
|
-
export function detectProjectLanguages(files) {
|
|
207
|
-
const counts = {};
|
|
208
|
-
for (const file of files) {
|
|
209
|
-
const dotIdx = file.lastIndexOf(".");
|
|
210
|
-
if (dotIdx === -1)
|
|
211
|
-
continue;
|
|
212
|
-
const ext = file.slice(dotIdx);
|
|
213
|
-
const lang = EXT_TO_SCIP_LANG[ext];
|
|
214
|
-
if (lang) {
|
|
215
|
-
counts[lang] = (counts[lang] ?? 0) + 1;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
return Object.entries(counts)
|
|
219
|
-
.map(([language, fileCount]) => ({ language, fileCount }))
|
|
220
|
-
.sort((a, b) => b.fileCount - a.fileCount);
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Get all languages that have SCIP support (bundled or detected).
|
|
224
|
-
*/
|
|
225
|
-
export async function getAvailableScipLanguages() {
|
|
226
|
-
const allLangs = [
|
|
227
|
-
...Object.keys(BUNDLED_SCIP),
|
|
228
|
-
...Object.keys(EXTERNAL_SCIP),
|
|
229
|
-
];
|
|
230
|
-
const results = await Promise.all(allLangs.map(detectScipBinary));
|
|
231
|
-
return results.filter((r) => r.available);
|
|
232
|
-
}
|