@danielblomma/cortex-mcp 2.4.0 → 2.4.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/CHANGELOG.md +226 -0
- package/README.md +24 -3
- package/bin/cli/arguments.mjs +60 -0
- package/bin/cli/context-passthrough.mjs +129 -0
- package/bin/cli/daemon.mjs +157 -0
- package/bin/cli/enterprise.mjs +516 -0
- package/bin/cli/help.mjs +88 -0
- package/bin/cli/hooks.mjs +199 -0
- package/bin/cli/mcp-command.mjs +87 -0
- package/bin/cli/paths.mjs +14 -0
- package/bin/cli/process.mjs +49 -0
- package/bin/cli/project-commands.mjs +237 -0
- package/bin/cli/project-runtime.mjs +34 -0
- package/bin/cli/query-command.mjs +18 -0
- package/bin/cli/router.mjs +66 -0
- package/bin/cli/run-command.mjs +44 -0
- package/bin/cli/scaffold-ownership.mjs +936 -0
- package/bin/cli/scaffold.mjs +687 -0
- package/bin/cli/stage-command.mjs +9 -0
- package/bin/cli/telemetry-command.mjs +18 -0
- package/bin/cli/trusted-runtime.mjs +18 -0
- package/bin/cortex.mjs +12 -1607
- package/bin/daemon-control.mjs +162 -0
- package/mcp-registry-submission.json +1 -1
- package/package.json +8 -3
- package/scaffold/mcp/dist/.cortex-build-hash +1 -0
- package/scaffold/mcp/dist/cli/enterprise-setup.js +134 -0
- package/scaffold/mcp/dist/cli/govern.js +937 -0
- package/scaffold/mcp/dist/cli/query.js +409 -0
- package/scaffold/mcp/dist/cli/run.js +295 -0
- package/scaffold/mcp/dist/cli/stage.js +308 -0
- package/scaffold/mcp/dist/cli/telemetry-test.js +141 -0
- package/scaffold/mcp/dist/cli/ungoverned-detector.js +133 -0
- package/scaffold/mcp/dist/contextEntities.js +282 -0
- package/scaffold/mcp/dist/core/audit/query.js +72 -0
- package/scaffold/mcp/dist/core/audit/writer.js +28 -0
- package/scaffold/mcp/dist/core/config.js +235 -0
- package/scaffold/mcp/dist/core/enterprise-host-identity.js +193 -0
- package/scaffold/mcp/dist/core/enterprise-identity.js +18 -0
- package/scaffold/mcp/dist/core/enterprise-rotation.js +158 -0
- package/scaffold/mcp/dist/core/govern-paths.js +21 -0
- package/scaffold/mcp/dist/core/index.js +14 -0
- package/scaffold/mcp/dist/core/license.js +278 -0
- package/scaffold/mcp/dist/core/policy/enforce.js +66 -0
- package/scaffold/mcp/dist/core/policy/injection.js +172 -0
- package/scaffold/mcp/dist/core/policy/store.js +179 -0
- package/scaffold/mcp/dist/core/rbac/check.js +30 -0
- package/scaffold/mcp/dist/core/secure-endpoint.js +25 -0
- package/scaffold/mcp/dist/core/telemetry/collector.js +285 -0
- package/scaffold/mcp/dist/core/telemetry/state-dir.js +31 -0
- package/scaffold/mcp/dist/core/validators/builtins.js +632 -0
- package/scaffold/mcp/dist/core/validators/config.js +44 -0
- package/scaffold/mcp/dist/core/validators/engine.js +120 -0
- package/scaffold/mcp/dist/core/validators/evaluators/code_comments.js +236 -0
- package/scaffold/mcp/dist/core/validators/evaluators/regex.js +116 -0
- package/scaffold/mcp/dist/core/workflow/artifact-io.js +103 -0
- package/scaffold/mcp/dist/core/workflow/capabilities.js +88 -0
- package/scaffold/mcp/dist/core/workflow/default-workflows.js +102 -0
- package/scaffold/mcp/dist/core/workflow/enforcement.js +164 -0
- package/scaffold/mcp/dist/core/workflow/envelope.js +132 -0
- package/scaffold/mcp/dist/core/workflow/index.js +11 -0
- package/scaffold/mcp/dist/core/workflow/mcp-tools.js +175 -0
- package/scaffold/mcp/dist/core/workflow/resolution.js +69 -0
- package/scaffold/mcp/dist/core/workflow/run-lifecycle.js +123 -0
- package/scaffold/mcp/dist/core/workflow/schemas.js +141 -0
- package/scaffold/mcp/dist/core/workflow/synced-capability-registry.js +60 -0
- package/scaffold/mcp/dist/core/workflow/synced-registry.js +60 -0
- package/scaffold/mcp/dist/daemon/capability-sync-checker.js +242 -0
- package/scaffold/mcp/dist/daemon/client.js +130 -0
- package/scaffold/mcp/dist/daemon/egress-proxy.js +288 -0
- package/scaffold/mcp/dist/daemon/global-host-events.js +222 -0
- package/scaffold/mcp/dist/daemon/heartbeat-pusher.js +116 -0
- package/scaffold/mcp/dist/daemon/heartbeat-tracker.js +165 -0
- package/scaffold/mcp/dist/daemon/host-events-pusher.js +249 -0
- package/scaffold/mcp/dist/daemon/main.js +449 -0
- package/scaffold/mcp/dist/daemon/paths.js +36 -0
- package/scaffold/mcp/dist/daemon/project-service-registry.js +78 -0
- package/scaffold/mcp/dist/daemon/protocol.js +8 -0
- package/scaffold/mcp/dist/daemon/server.js +180 -0
- package/scaffold/mcp/dist/daemon/skill-sync-checker.js +557 -0
- package/scaffold/mcp/dist/daemon/sync-checker.js +165 -0
- package/scaffold/mcp/dist/daemon/ungoverned-scanner.js +136 -0
- package/scaffold/mcp/dist/daemon/workflow-sync-checker.js +249 -0
- package/scaffold/mcp/dist/defaults.js +6 -0
- package/scaffold/mcp/dist/embed.js +627 -0
- package/scaffold/mcp/dist/embedScheduler.js +479 -0
- package/scaffold/mcp/dist/embeddings.js +167 -0
- package/scaffold/mcp/dist/enterprise/audit/push.js +66 -0
- package/scaffold/mcp/dist/enterprise/index.js +327 -0
- package/scaffold/mcp/dist/enterprise/model/deploy.js +27 -0
- package/scaffold/mcp/dist/enterprise/policy/sync.js +129 -0
- package/scaffold/mcp/dist/enterprise/privacy/boundary.js +184 -0
- package/scaffold/mcp/dist/enterprise/reviews/changed-files.js +33 -0
- package/scaffold/mcp/dist/enterprise/reviews/pattern-context.js +202 -0
- package/scaffold/mcp/dist/enterprise/reviews/policy-selection.js +46 -0
- package/scaffold/mcp/dist/enterprise/reviews/push.js +102 -0
- package/scaffold/mcp/dist/enterprise/reviews/trust-state.js +186 -0
- package/scaffold/mcp/dist/enterprise/telemetry/sync.js +57 -0
- package/scaffold/mcp/dist/enterprise/tools/enterprise.js +826 -0
- package/scaffold/mcp/dist/enterprise/tools/harness.js +40 -0
- package/scaffold/mcp/dist/enterprise/tools/walk.js +73 -0
- package/scaffold/mcp/dist/enterprise/violations/push.js +77 -0
- package/scaffold/mcp/dist/enterprise/workflow/push.js +44 -0
- package/scaffold/mcp/dist/enterprise/workflow/state.js +329 -0
- package/scaffold/mcp/dist/frontmatter.js +33 -0
- package/scaffold/mcp/dist/graph.js +769 -0
- package/scaffold/mcp/dist/graphCsv.js +55 -0
- package/scaffold/mcp/dist/graphMetrics.js +8 -0
- package/scaffold/mcp/dist/hooks/permission-request.js +89 -0
- package/scaffold/mcp/dist/hooks/post-tool-use.js +105 -0
- package/scaffold/mcp/dist/hooks/pre-compact.js +29 -0
- package/scaffold/mcp/dist/hooks/pre-tool-use.js +78 -0
- package/scaffold/mcp/dist/hooks/session-end.js +43 -0
- package/scaffold/mcp/dist/hooks/session-start.js +41 -0
- package/scaffold/mcp/dist/hooks/shared.js +194 -0
- package/scaffold/mcp/dist/hooks/stop.js +28 -0
- package/scaffold/mcp/dist/hooks/user-prompt-submit.js +33 -0
- package/scaffold/mcp/dist/impactPresentation.js +137 -0
- package/scaffold/mcp/dist/impactRanking.js +191 -0
- package/scaffold/mcp/dist/impactResponse.js +30 -0
- package/scaffold/mcp/dist/impactResults.js +105 -0
- package/scaffold/mcp/dist/impactSeed.js +20 -0
- package/scaffold/mcp/dist/impactTraversal.js +64 -0
- package/scaffold/mcp/dist/jsonl.js +77 -0
- package/scaffold/mcp/dist/loadGraph.js +759 -0
- package/scaffold/mcp/dist/lruCache.js +38 -0
- package/scaffold/mcp/dist/paths.js +97 -0
- package/scaffold/mcp/dist/patternEvidence.js +272 -0
- package/scaffold/mcp/dist/plugin.js +81 -0
- package/scaffold/mcp/dist/presets.js +78 -0
- package/scaffold/mcp/dist/relatedResponse.js +18 -0
- package/scaffold/mcp/dist/relatedTraversal.js +78 -0
- package/scaffold/mcp/dist/rules.js +23 -0
- package/scaffold/mcp/dist/search.js +212 -0
- package/scaffold/mcp/dist/searchCore.js +457 -0
- package/scaffold/mcp/dist/searchResults.js +230 -0
- package/scaffold/mcp/dist/server.js +317 -0
- package/scaffold/mcp/dist/types.js +1 -0
- package/scaffold/mcp/package-lock.json +321 -200
- package/scaffold/mcp/package.json +15 -6
- package/scaffold/mcp/src/cli/enterprise-setup.ts +82 -8
- package/scaffold/mcp/src/cli/govern.ts +137 -52
- package/scaffold/mcp/src/cli/run.ts +53 -19
- package/scaffold/mcp/src/cli/stage.ts +8 -3
- package/scaffold/mcp/src/core/config.ts +9 -2
- package/scaffold/mcp/src/core/enterprise-host-identity.ts +259 -0
- package/scaffold/mcp/src/core/enterprise-identity.ts +20 -0
- package/scaffold/mcp/src/core/enterprise-rotation.ts +185 -0
- package/scaffold/mcp/src/core/govern-paths.ts +30 -0
- package/scaffold/mcp/src/core/license.ts +186 -17
- package/scaffold/mcp/src/core/secure-endpoint.ts +23 -0
- package/scaffold/mcp/src/core/workflow/enforcement.ts +8 -1
- package/scaffold/mcp/src/core/workflow/mcp-tools.ts +3 -0
- package/scaffold/mcp/src/core/workflow/resolution.ts +9 -1
- package/scaffold/mcp/src/core/workflow/synced-capability-registry.ts +15 -0
- package/scaffold/mcp/src/core/workflow/synced-registry.ts +15 -0
- package/scaffold/mcp/src/daemon/capability-sync-checker.ts +38 -2
- package/scaffold/mcp/src/daemon/egress-proxy.ts +14 -8
- package/scaffold/mcp/src/daemon/global-host-events.ts +288 -0
- package/scaffold/mcp/src/daemon/heartbeat-pusher.ts +4 -0
- package/scaffold/mcp/src/daemon/heartbeat-tracker.ts +2 -0
- package/scaffold/mcp/src/daemon/host-events-pusher.ts +5 -0
- package/scaffold/mcp/src/daemon/main.ts +99 -25
- package/scaffold/mcp/src/daemon/project-service-registry.ts +107 -0
- package/scaffold/mcp/src/daemon/skill-sync-checker.ts +368 -31
- package/scaffold/mcp/src/daemon/sync-checker.ts +4 -0
- package/scaffold/mcp/src/daemon/ungoverned-scanner.ts +57 -25
- package/scaffold/mcp/src/daemon/workflow-sync-checker.ts +41 -2
- package/scaffold/mcp/src/enterprise/audit/push.ts +8 -0
- package/scaffold/mcp/src/enterprise/policy/sync.ts +12 -0
- package/scaffold/mcp/src/enterprise/reviews/push.ts +9 -0
- package/scaffold/mcp/src/enterprise/reviews/trust-state.ts +3 -1
- package/scaffold/mcp/src/enterprise/telemetry/sync.ts +9 -0
- package/scaffold/mcp/src/enterprise/violations/push.ts +9 -0
- package/scaffold/mcp/src/enterprise/workflow/push.ts +7 -0
- package/scaffold/mcp/src/plugin.ts +20 -0
- package/scaffold/mcp/tests/copilot-shim.test.mjs +19 -1
- package/scaffold/mcp/tests/egress-proxy.test.mjs +37 -0
- package/scaffold/mcp/tests/enterprise-identity-sync.test.mjs +401 -0
- package/scaffold/mcp/tests/enterprise-setup.test.mjs +189 -0
- package/scaffold/mcp/tests/global-host-events.test.mjs +81 -0
- package/scaffold/mcp/tests/govern-install.test.mjs +95 -2
- package/scaffold/mcp/tests/govern-repair.test.mjs +20 -3
- package/scaffold/mcp/tests/heartbeat-tracker.test.mjs +26 -0
- package/scaffold/mcp/tests/license.test.mjs +367 -0
- package/scaffold/mcp/tests/project-service-registry.test.mjs +172 -0
- package/scaffold/mcp/tests/review-trust-contract.test.mjs +18 -0
- package/scaffold/mcp/tests/secure-enterprise-endpoint.test.mjs +46 -0
- package/scaffold/mcp/tests/skill-sync-checker.test.mjs +446 -2
- package/scaffold/mcp/tests/ungoverned-scanner.test.mjs +104 -22
- package/scaffold/mcp/tests/workflow-cli.test.mjs +14 -1
- package/scaffold/mcp/tests/workflow-synced-capabilities.test.mjs +37 -0
- package/scaffold/mcp/tests/workflow-synced-registry.test.mjs +40 -1
- package/scaffold/ownership/baseline-v2.4.1.json +22 -0
- package/scaffold/ownership/current.json +4 -0
- package/scaffold/ownership/v1.json +456 -0
- package/scaffold/scripts/ingest-parsers.mjs +1 -387
- package/scaffold/scripts/ingest-worker.mjs +4 -1
- package/scaffold/scripts/ingest.mjs +5 -3899
- package/scaffold/scripts/lib/ingest/arguments.mjs +78 -0
- package/scaffold/scripts/lib/ingest/chunks.mjs +212 -0
- package/scaffold/scripts/lib/ingest/config.mjs +120 -0
- package/scaffold/scripts/lib/ingest/constants.mjs +222 -0
- package/scaffold/scripts/lib/ingest/files.mjs +387 -0
- package/scaffold/scripts/lib/ingest/incremental-state.mjs +131 -0
- package/scaffold/scripts/lib/ingest/io.mjs +78 -0
- package/scaffold/scripts/lib/ingest/main.mjs +76 -0
- package/scaffold/scripts/lib/ingest/parser-composition.mjs +140 -0
- package/scaffold/scripts/lib/ingest/parser-registry.mjs +387 -0
- package/scaffold/scripts/lib/ingest/pipeline-stages.mjs +1625 -0
- package/scaffold/scripts/lib/ingest/projects.mjs +272 -0
- package/scaffold/scripts/lib/ingest/relations.mjs +860 -0
- package/scaffold/scripts/lib/ingest/runtime-paths.mjs +11 -0
- package/scaffold/scripts/lib/ingest/workers.mjs +264 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import {
|
|
3
|
+
getChunkParserForExtension,
|
|
4
|
+
getCSharpParserRuntime,
|
|
5
|
+
hasCSharpProjectParser,
|
|
6
|
+
isCSharpParserAvailable,
|
|
7
|
+
loadParsers,
|
|
8
|
+
parseCSharpProject,
|
|
9
|
+
PARALLEL_SAFE_LANGUAGES
|
|
10
|
+
} from "./parser-registry.mjs";
|
|
11
|
+
import {
|
|
12
|
+
MAX_CONTENT_CHARS,
|
|
13
|
+
STRUCTURED_NON_CODE_CHUNK_EXTENSIONS
|
|
14
|
+
} from "./constants.mjs";
|
|
15
|
+
import { REPO_ROOT } from "./runtime-paths.mjs";
|
|
16
|
+
|
|
17
|
+
async function initializeParserComposition() {
|
|
18
|
+
await loadParsers();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function inspectCSharpParser(fileRecords) {
|
|
22
|
+
const fileCount = fileRecords.filter(
|
|
23
|
+
(record) => path.extname(record.path).toLowerCase() === ".cs"
|
|
24
|
+
).length;
|
|
25
|
+
return {
|
|
26
|
+
fileCount,
|
|
27
|
+
runtime: fileCount > 0 ? getCSharpParserRuntime() : null
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function createCSharpBatchCache({
|
|
32
|
+
fileRecords,
|
|
33
|
+
incrementalMode,
|
|
34
|
+
changedFileIds,
|
|
35
|
+
cachedChunkFileIds,
|
|
36
|
+
verbose
|
|
37
|
+
}) {
|
|
38
|
+
const batchCache = new Map();
|
|
39
|
+
if (
|
|
40
|
+
hasCSharpProjectParser() &&
|
|
41
|
+
isCSharpParserAvailable() &&
|
|
42
|
+
process.env.CORTEX_CSHARP_BATCH !== "never"
|
|
43
|
+
) {
|
|
44
|
+
const csharpFilesForBatch = fileRecords.filter((record) => {
|
|
45
|
+
if (record.kind !== "CODE") return false;
|
|
46
|
+
if (path.extname(record.path).toLowerCase() !== ".cs") return false;
|
|
47
|
+
return (
|
|
48
|
+
!incrementalMode ||
|
|
49
|
+
changedFileIds.has(record.id) ||
|
|
50
|
+
!cachedChunkFileIds.has(record.id)
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
if (csharpFilesForBatch.length > 0) {
|
|
54
|
+
const allCsharpInputs = fileRecords
|
|
55
|
+
.filter(
|
|
56
|
+
(record) =>
|
|
57
|
+
record.kind === "CODE" &&
|
|
58
|
+
path.extname(record.path).toLowerCase() === ".cs"
|
|
59
|
+
)
|
|
60
|
+
.map((record) => ({ path: record.path, content: record.content }));
|
|
61
|
+
try {
|
|
62
|
+
const batchResult = parseCSharpProject(allCsharpInputs);
|
|
63
|
+
for (const [filePath, result] of batchResult) {
|
|
64
|
+
batchCache.set(filePath, result);
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
if (verbose) {
|
|
68
|
+
console.log(
|
|
69
|
+
`[ingest] C# batch parse failed, falling back per-file: ${error.message}`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return batchCache;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async function collectParseEligibleFiles({
|
|
79
|
+
fileRecords,
|
|
80
|
+
incrementalMode,
|
|
81
|
+
changedFileIds,
|
|
82
|
+
cachedChunkFileIds
|
|
83
|
+
}) {
|
|
84
|
+
const parseEligible = new Map();
|
|
85
|
+
for (const fileRecord of fileRecords) {
|
|
86
|
+
const ext = path.extname(fileRecord.path).toLowerCase();
|
|
87
|
+
const parser = getChunkParserForExtension(ext);
|
|
88
|
+
const isStructuredNonCodeChunk = STRUCTURED_NON_CODE_CHUNK_EXTENSIONS.has(ext);
|
|
89
|
+
if (fileRecord.kind !== "CODE" && !isStructuredNonCodeChunk) continue;
|
|
90
|
+
if (!parser) continue;
|
|
91
|
+
if (
|
|
92
|
+
typeof parser.isAvailable === "function" &&
|
|
93
|
+
!(await parser.isAvailable())
|
|
94
|
+
) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const shouldParseFile =
|
|
99
|
+
!incrementalMode ||
|
|
100
|
+
changedFileIds.has(fileRecord.id) ||
|
|
101
|
+
!cachedChunkFileIds.has(fileRecord.id);
|
|
102
|
+
if (!shouldParseFile) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
parseEligible.set(fileRecord.id, { parser, ext });
|
|
106
|
+
}
|
|
107
|
+
return parseEligible;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function createWorkerTasks(fileRecords, parseEligible, csharpBatchCache) {
|
|
111
|
+
return fileRecords
|
|
112
|
+
.filter((fileRecord) => {
|
|
113
|
+
const eligible = parseEligible.get(fileRecord.id);
|
|
114
|
+
if (!eligible) return false;
|
|
115
|
+
if (!PARALLEL_SAFE_LANGUAGES.has(eligible.parser.language)) return false;
|
|
116
|
+
if (
|
|
117
|
+
eligible.parser.language === "csharp" &&
|
|
118
|
+
csharpBatchCache.has(fileRecord.path)
|
|
119
|
+
) {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
})
|
|
124
|
+
.map((fileRecord) => ({
|
|
125
|
+
id: fileRecord.id,
|
|
126
|
+
ext: parseEligible.get(fileRecord.id).ext,
|
|
127
|
+
absolutePath: path.resolve(REPO_ROOT, fileRecord.path),
|
|
128
|
+
contentLimit: MAX_CONTENT_CHARS,
|
|
129
|
+
path: fileRecord.path
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export {
|
|
134
|
+
collectParseEligibleFiles,
|
|
135
|
+
createCSharpBatchCache,
|
|
136
|
+
createWorkerTasks,
|
|
137
|
+
getChunkParserForExtension,
|
|
138
|
+
initializeParserComposition,
|
|
139
|
+
inspectCSharpParser
|
|
140
|
+
};
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared chunk-parser registry.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for "which parser handles which extension", used by
|
|
5
|
+
* both the main ingest process and the worker-thread pool. Keeping one table
|
|
6
|
+
* guarantees a file parses identically whether it runs inline or in a worker.
|
|
7
|
+
*
|
|
8
|
+
* Parsers self-initialize lazily (tree-sitter grammars load WASM on first
|
|
9
|
+
* parse and cache per module instance), so a worker amortizes that cost over
|
|
10
|
+
* its lifetime.
|
|
11
|
+
*/
|
|
12
|
+
import { parseCode } from "../../parsers/javascript.mjs";
|
|
13
|
+
|
|
14
|
+
const parseJavaScriptCode = parseCode;
|
|
15
|
+
let parseVbNetCode = null;
|
|
16
|
+
let parseCSharpCode = null;
|
|
17
|
+
let parseCSharpProjectImpl = null;
|
|
18
|
+
let parseCppCode = null;
|
|
19
|
+
let parseConfigCode = null;
|
|
20
|
+
let parseResourcesCode = null;
|
|
21
|
+
let parseSqlCode = null;
|
|
22
|
+
let parseRustCode = null;
|
|
23
|
+
let parsePythonCode = null;
|
|
24
|
+
let parseGoCode = null;
|
|
25
|
+
let parseJavaCode = null;
|
|
26
|
+
let parseRubyCode = null;
|
|
27
|
+
let parseBashCode = null;
|
|
28
|
+
let parseVb6Code = null;
|
|
29
|
+
let parseMarkdownCode = null;
|
|
30
|
+
let isVbNetParserAvailable = () => false;
|
|
31
|
+
let isCSharpParserAvailableImpl = () => false;
|
|
32
|
+
let isCppParserAvailable = () => false;
|
|
33
|
+
let getCSharpParserRuntimeImpl = () => ({ available: false, reason: "parser module not loaded" });
|
|
34
|
+
|
|
35
|
+
let loadPromise = null;
|
|
36
|
+
|
|
37
|
+
// Languages whose parser runs purely in-process (JS or WASM) with no
|
|
38
|
+
// subprocess and no cross-file global state, so they are safe to run in a
|
|
39
|
+
// worker thread. csharp (Roslyn subprocess + project-wide batch parse in the
|
|
40
|
+
// main process), vbnet (subprocess), and cpp (clang-bridge fallback
|
|
41
|
+
// subprocess) stay on the main thread.
|
|
42
|
+
export const PARALLEL_SAFE_LANGUAGES = new Set([
|
|
43
|
+
"javascript",
|
|
44
|
+
"jsx",
|
|
45
|
+
"typescript",
|
|
46
|
+
"tsx",
|
|
47
|
+
"python",
|
|
48
|
+
"go",
|
|
49
|
+
"java",
|
|
50
|
+
"ruby",
|
|
51
|
+
"bash",
|
|
52
|
+
"sql",
|
|
53
|
+
"config",
|
|
54
|
+
"resource",
|
|
55
|
+
"settings",
|
|
56
|
+
"markdown",
|
|
57
|
+
"rust",
|
|
58
|
+
"vb6"
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
export async function loadParsers() {
|
|
62
|
+
if (loadPromise) {
|
|
63
|
+
return loadPromise;
|
|
64
|
+
}
|
|
65
|
+
const loaders = [
|
|
66
|
+
import("../../parsers/vbnet.mjs").then((module) => {
|
|
67
|
+
parseVbNetCode = module.parseCode;
|
|
68
|
+
isVbNetParserAvailable =
|
|
69
|
+
typeof module.isVbNetParserAvailable === "function"
|
|
70
|
+
? module.isVbNetParserAvailable
|
|
71
|
+
: () => typeof module.parseCode === "function";
|
|
72
|
+
}),
|
|
73
|
+
import("../../parsers/csharp.mjs").then((module) => {
|
|
74
|
+
parseCSharpCode = module.parseCode;
|
|
75
|
+
parseCSharpProjectImpl = module.parseProject ?? null;
|
|
76
|
+
getCSharpParserRuntimeImpl =
|
|
77
|
+
typeof module.getCSharpParserRuntime === "function"
|
|
78
|
+
? module.getCSharpParserRuntime
|
|
79
|
+
: () => ({ available: typeof module.parseCode === "function", reason: "runtime details unavailable" });
|
|
80
|
+
isCSharpParserAvailableImpl =
|
|
81
|
+
typeof module.isCSharpParserAvailable === "function"
|
|
82
|
+
? module.isCSharpParserAvailable
|
|
83
|
+
: () => typeof module.parseCode === "function";
|
|
84
|
+
}),
|
|
85
|
+
import("../../parsers/cpp-dispatch.mjs").then((module) => {
|
|
86
|
+
parseCppCode = module.parseCode;
|
|
87
|
+
isCppParserAvailable =
|
|
88
|
+
typeof module.isCppParserAvailable === "function"
|
|
89
|
+
? module.isCppParserAvailable
|
|
90
|
+
: () => typeof module.parseCode === "function";
|
|
91
|
+
}),
|
|
92
|
+
import("../../parsers/config.mjs").then((module) => {
|
|
93
|
+
parseConfigCode = module.parseCode;
|
|
94
|
+
}),
|
|
95
|
+
import("../../parsers/resources.mjs").then((module) => {
|
|
96
|
+
parseResourcesCode = module.parseCode;
|
|
97
|
+
}),
|
|
98
|
+
import("../../parsers/sql.mjs").then((module) => {
|
|
99
|
+
parseSqlCode = module.parseCode;
|
|
100
|
+
}),
|
|
101
|
+
import("../../parsers/rust-dispatch.mjs").then((module) => {
|
|
102
|
+
parseRustCode = module.parseCode;
|
|
103
|
+
}),
|
|
104
|
+
import("../../parsers/python-treesitter.mjs").then((module) => {
|
|
105
|
+
parsePythonCode = module.parseCode;
|
|
106
|
+
}),
|
|
107
|
+
import("../../parsers/go-treesitter.mjs").then((module) => {
|
|
108
|
+
parseGoCode = module.parseCode;
|
|
109
|
+
}),
|
|
110
|
+
import("../../parsers/java-treesitter.mjs").then((module) => {
|
|
111
|
+
parseJavaCode = module.parseCode;
|
|
112
|
+
}),
|
|
113
|
+
import("../../parsers/ruby-treesitter.mjs").then((module) => {
|
|
114
|
+
parseRubyCode = module.parseCode;
|
|
115
|
+
}),
|
|
116
|
+
import("../../parsers/bash-treesitter.mjs").then((module) => {
|
|
117
|
+
parseBashCode = module.parseCode;
|
|
118
|
+
}),
|
|
119
|
+
import("../../parsers/vb6.mjs").then((module) => {
|
|
120
|
+
parseVb6Code = module.parseCode;
|
|
121
|
+
}),
|
|
122
|
+
import("../../parsers/markdown.mjs").then((module) => {
|
|
123
|
+
parseMarkdownCode = module.parseCode;
|
|
124
|
+
})
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
loadPromise = Promise.allSettled(loaders).then(() => undefined);
|
|
128
|
+
return loadPromise;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const CHUNK_PARSERS = new Map([
|
|
132
|
+
[".js", { language: "javascript", parse: parseJavaScriptCode }],
|
|
133
|
+
[".jsx", { language: "jsx", parse: parseJavaScriptCode }],
|
|
134
|
+
[".mjs", { language: "javascript", parse: parseJavaScriptCode }],
|
|
135
|
+
[".cjs", { language: "javascript", parse: parseJavaScriptCode }],
|
|
136
|
+
[".ts", { language: "typescript", parse: parseJavaScriptCode }],
|
|
137
|
+
[".tsx", { language: "tsx", parse: parseJavaScriptCode }],
|
|
138
|
+
[".mts", { language: "typescript", parse: parseJavaScriptCode }],
|
|
139
|
+
[".cts", { language: "typescript", parse: parseJavaScriptCode }],
|
|
140
|
+
[
|
|
141
|
+
".vb",
|
|
142
|
+
{
|
|
143
|
+
language: "vbnet",
|
|
144
|
+
parse: (...args) => parseVbNetCode(...args),
|
|
145
|
+
isAvailable: () => typeof parseVbNetCode === "function" && isVbNetParserAvailable()
|
|
146
|
+
}
|
|
147
|
+
],
|
|
148
|
+
[
|
|
149
|
+
".cs",
|
|
150
|
+
{
|
|
151
|
+
language: "csharp",
|
|
152
|
+
parse: (...args) => parseCSharpCode(...args),
|
|
153
|
+
isAvailable: () => typeof parseCSharpCode === "function" && isCSharpParserAvailableImpl()
|
|
154
|
+
}
|
|
155
|
+
],
|
|
156
|
+
[
|
|
157
|
+
".sql",
|
|
158
|
+
{
|
|
159
|
+
language: "sql",
|
|
160
|
+
parse: (...args) => parseSqlCode(...args),
|
|
161
|
+
isAvailable: () => typeof parseSqlCode === "function"
|
|
162
|
+
}
|
|
163
|
+
],
|
|
164
|
+
[
|
|
165
|
+
".md",
|
|
166
|
+
{
|
|
167
|
+
language: "markdown",
|
|
168
|
+
parse: (...args) => parseMarkdownCode(...args),
|
|
169
|
+
isAvailable: () => typeof parseMarkdownCode === "function"
|
|
170
|
+
}
|
|
171
|
+
],
|
|
172
|
+
[
|
|
173
|
+
".mdx",
|
|
174
|
+
{
|
|
175
|
+
language: "markdown",
|
|
176
|
+
parse: (...args) => parseMarkdownCode(...args),
|
|
177
|
+
isAvailable: () => typeof parseMarkdownCode === "function"
|
|
178
|
+
}
|
|
179
|
+
],
|
|
180
|
+
[
|
|
181
|
+
".config",
|
|
182
|
+
{
|
|
183
|
+
language: "config",
|
|
184
|
+
parse: (...args) => parseConfigCode(...args),
|
|
185
|
+
isAvailable: () => typeof parseConfigCode === "function"
|
|
186
|
+
}
|
|
187
|
+
],
|
|
188
|
+
[
|
|
189
|
+
".resx",
|
|
190
|
+
{
|
|
191
|
+
language: "resource",
|
|
192
|
+
parse: (...args) => parseResourcesCode(...args),
|
|
193
|
+
isAvailable: () => typeof parseResourcesCode === "function"
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
[
|
|
197
|
+
".settings",
|
|
198
|
+
{
|
|
199
|
+
language: "settings",
|
|
200
|
+
parse: (...args) => parseResourcesCode(...args),
|
|
201
|
+
isAvailable: () => typeof parseResourcesCode === "function"
|
|
202
|
+
}
|
|
203
|
+
],
|
|
204
|
+
[
|
|
205
|
+
".c",
|
|
206
|
+
{
|
|
207
|
+
language: "c",
|
|
208
|
+
parse: (...args) => parseCppCode(...args),
|
|
209
|
+
isAvailable: () => typeof parseCppCode === "function" && isCppParserAvailable()
|
|
210
|
+
}
|
|
211
|
+
],
|
|
212
|
+
[
|
|
213
|
+
".h",
|
|
214
|
+
{
|
|
215
|
+
language: "c",
|
|
216
|
+
parse: (...args) => parseCppCode(...args),
|
|
217
|
+
isAvailable: () => typeof parseCppCode === "function" && isCppParserAvailable()
|
|
218
|
+
}
|
|
219
|
+
],
|
|
220
|
+
[
|
|
221
|
+
".cpp",
|
|
222
|
+
{
|
|
223
|
+
language: "cpp",
|
|
224
|
+
parse: (...args) => parseCppCode(...args),
|
|
225
|
+
isAvailable: () => typeof parseCppCode === "function" && isCppParserAvailable()
|
|
226
|
+
}
|
|
227
|
+
],
|
|
228
|
+
[
|
|
229
|
+
".cc",
|
|
230
|
+
{
|
|
231
|
+
language: "cpp",
|
|
232
|
+
parse: (...args) => parseCppCode(...args),
|
|
233
|
+
isAvailable: () => typeof parseCppCode === "function" && isCppParserAvailable()
|
|
234
|
+
}
|
|
235
|
+
],
|
|
236
|
+
[
|
|
237
|
+
".hpp",
|
|
238
|
+
{
|
|
239
|
+
language: "cpp",
|
|
240
|
+
parse: (...args) => parseCppCode(...args),
|
|
241
|
+
isAvailable: () => typeof parseCppCode === "function" && isCppParserAvailable()
|
|
242
|
+
}
|
|
243
|
+
],
|
|
244
|
+
[
|
|
245
|
+
".hh",
|
|
246
|
+
{
|
|
247
|
+
language: "cpp",
|
|
248
|
+
parse: (...args) => parseCppCode(...args),
|
|
249
|
+
isAvailable: () => typeof parseCppCode === "function" && isCppParserAvailable()
|
|
250
|
+
}
|
|
251
|
+
],
|
|
252
|
+
[
|
|
253
|
+
".rs",
|
|
254
|
+
{
|
|
255
|
+
language: "rust",
|
|
256
|
+
parse: (...args) => parseRustCode(...args),
|
|
257
|
+
isAvailable: () => typeof parseRustCode === "function"
|
|
258
|
+
}
|
|
259
|
+
],
|
|
260
|
+
[
|
|
261
|
+
".py",
|
|
262
|
+
{
|
|
263
|
+
language: "python",
|
|
264
|
+
parse: (...args) => parsePythonCode(...args),
|
|
265
|
+
isAvailable: () => typeof parsePythonCode === "function"
|
|
266
|
+
}
|
|
267
|
+
],
|
|
268
|
+
[
|
|
269
|
+
".go",
|
|
270
|
+
{
|
|
271
|
+
language: "go",
|
|
272
|
+
parse: (...args) => parseGoCode(...args),
|
|
273
|
+
isAvailable: () => typeof parseGoCode === "function"
|
|
274
|
+
}
|
|
275
|
+
],
|
|
276
|
+
[
|
|
277
|
+
".java",
|
|
278
|
+
{
|
|
279
|
+
language: "java",
|
|
280
|
+
parse: (...args) => parseJavaCode(...args),
|
|
281
|
+
isAvailable: () => typeof parseJavaCode === "function"
|
|
282
|
+
}
|
|
283
|
+
],
|
|
284
|
+
[
|
|
285
|
+
".rb",
|
|
286
|
+
{
|
|
287
|
+
language: "ruby",
|
|
288
|
+
parse: (...args) => parseRubyCode(...args),
|
|
289
|
+
isAvailable: () => typeof parseRubyCode === "function"
|
|
290
|
+
}
|
|
291
|
+
],
|
|
292
|
+
[
|
|
293
|
+
".sh",
|
|
294
|
+
{
|
|
295
|
+
language: "bash",
|
|
296
|
+
parse: (...args) => parseBashCode(...args),
|
|
297
|
+
isAvailable: () => typeof parseBashCode === "function"
|
|
298
|
+
}
|
|
299
|
+
],
|
|
300
|
+
[
|
|
301
|
+
".bash",
|
|
302
|
+
{
|
|
303
|
+
language: "bash",
|
|
304
|
+
parse: (...args) => parseBashCode(...args),
|
|
305
|
+
isAvailable: () => typeof parseBashCode === "function"
|
|
306
|
+
}
|
|
307
|
+
],
|
|
308
|
+
[
|
|
309
|
+
".zsh",
|
|
310
|
+
{
|
|
311
|
+
language: "bash",
|
|
312
|
+
parse: (...args) => parseBashCode(...args),
|
|
313
|
+
isAvailable: () => typeof parseBashCode === "function"
|
|
314
|
+
}
|
|
315
|
+
],
|
|
316
|
+
[
|
|
317
|
+
".bas",
|
|
318
|
+
{
|
|
319
|
+
language: "vb6",
|
|
320
|
+
parse: (...args) => parseVb6Code(...args),
|
|
321
|
+
isAvailable: () => typeof parseVb6Code === "function"
|
|
322
|
+
}
|
|
323
|
+
],
|
|
324
|
+
[
|
|
325
|
+
".cls",
|
|
326
|
+
{
|
|
327
|
+
language: "vb6",
|
|
328
|
+
parse: (...args) => parseVb6Code(...args),
|
|
329
|
+
isAvailable: () => typeof parseVb6Code === "function"
|
|
330
|
+
}
|
|
331
|
+
],
|
|
332
|
+
[
|
|
333
|
+
".frm",
|
|
334
|
+
{
|
|
335
|
+
language: "vb6",
|
|
336
|
+
parse: (...args) => parseVb6Code(...args),
|
|
337
|
+
isAvailable: () => typeof parseVb6Code === "function"
|
|
338
|
+
}
|
|
339
|
+
],
|
|
340
|
+
[
|
|
341
|
+
".ctl",
|
|
342
|
+
{
|
|
343
|
+
language: "vb6",
|
|
344
|
+
parse: (...args) => parseVb6Code(...args),
|
|
345
|
+
isAvailable: () => typeof parseVb6Code === "function"
|
|
346
|
+
}
|
|
347
|
+
]
|
|
348
|
+
]);
|
|
349
|
+
|
|
350
|
+
export function getChunkParserForExtension(ext) {
|
|
351
|
+
return CHUNK_PARSERS.get(ext) ?? null;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Stable wrappers so callers can import these once; they delegate to whatever
|
|
355
|
+
// the dynamic import populated.
|
|
356
|
+
export function isCSharpParserAvailable() {
|
|
357
|
+
return isCSharpParserAvailableImpl();
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
export function getCSharpParserRuntime() {
|
|
361
|
+
return getCSharpParserRuntimeImpl();
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
export function parseCSharpProject(inputs) {
|
|
365
|
+
if (typeof parseCSharpProjectImpl !== "function") {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
return parseCSharpProjectImpl(inputs);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export function hasCSharpProjectParser() {
|
|
372
|
+
return typeof parseCSharpProjectImpl === "function";
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Parse a single file with the registered parser for its extension. Used by
|
|
376
|
+
// the worker; returns the parser's { chunks, errors } result, or null if no
|
|
377
|
+
// parser is registered or it is unavailable in this process.
|
|
378
|
+
export async function parseFileContent(ext, content, filePath) {
|
|
379
|
+
const parser = getChunkParserForExtension(ext);
|
|
380
|
+
if (!parser) {
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
if (typeof parser.isAvailable === "function" && !(await parser.isAvailable())) {
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
386
|
+
return { language: parser.language, result: await parser.parse(content, filePath, parser.language) };
|
|
387
|
+
}
|