mcp-cognition-engine 1.0.0-alpha.1
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/LICENSE +201 -0
- package/README.md +281 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +66 -0
- package/dist/cli.js.map +1 -0
- package/dist/cognition-engine/ast-constraint-solver.d.ts +67 -0
- package/dist/cognition-engine/ast-constraint-solver.d.ts.map +1 -0
- package/dist/cognition-engine/ast-constraint-solver.js +294 -0
- package/dist/cognition-engine/ast-constraint-solver.js.map +1 -0
- package/dist/cognition-engine/constraint-validator.d.ts +35 -0
- package/dist/cognition-engine/constraint-validator.d.ts.map +1 -0
- package/dist/cognition-engine/constraint-validator.js +55 -0
- package/dist/cognition-engine/constraint-validator.js.map +1 -0
- package/dist/cognition-engine/graph-traverser.d.ts +43 -0
- package/dist/cognition-engine/graph-traverser.d.ts.map +1 -0
- package/dist/cognition-engine/graph-traverser.js +205 -0
- package/dist/cognition-engine/graph-traverser.js.map +1 -0
- package/dist/cognition-engine/index.d.ts +51 -0
- package/dist/cognition-engine/index.d.ts.map +1 -0
- package/dist/cognition-engine/index.js +60 -0
- package/dist/cognition-engine/index.js.map +1 -0
- package/dist/cognition-engine/intent-recognizer.d.ts +25 -0
- package/dist/cognition-engine/intent-recognizer.d.ts.map +1 -0
- package/dist/cognition-engine/intent-recognizer.js +226 -0
- package/dist/cognition-engine/intent-recognizer.js.map +1 -0
- package/dist/cognition-engine/types.d.ts +96 -0
- package/dist/cognition-engine/types.d.ts.map +1 -0
- package/dist/cognition-engine/types.js +17 -0
- package/dist/cognition-engine/types.js.map +1 -0
- package/dist/conflict/arbitrator.d.ts +24 -0
- package/dist/conflict/arbitrator.d.ts.map +1 -0
- package/dist/conflict/arbitrator.js +43 -0
- package/dist/conflict/arbitrator.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/legacy-engine/ast-diff.d.ts +23 -0
- package/dist/legacy-engine/ast-diff.d.ts.map +1 -0
- package/dist/legacy-engine/ast-diff.js +146 -0
- package/dist/legacy-engine/ast-diff.js.map +1 -0
- package/dist/legacy-engine/ast-node.d.ts +24 -0
- package/dist/legacy-engine/ast-node.d.ts.map +1 -0
- package/dist/legacy-engine/ast-node.js +52 -0
- package/dist/legacy-engine/ast-node.js.map +1 -0
- package/dist/legacy-engine/parsers.d.ts +34 -0
- package/dist/legacy-engine/parsers.d.ts.map +1 -0
- package/dist/legacy-engine/parsers.js +134 -0
- package/dist/legacy-engine/parsers.js.map +1 -0
- package/dist/legacy-engine/regex-fallback.d.ts +23 -0
- package/dist/legacy-engine/regex-fallback.d.ts.map +1 -0
- package/dist/legacy-engine/regex-fallback.js +40 -0
- package/dist/legacy-engine/regex-fallback.js.map +1 -0
- package/dist/legacy-engine/rule-generator.d.ts +31 -0
- package/dist/legacy-engine/rule-generator.d.ts.map +1 -0
- package/dist/legacy-engine/rule-generator.js +54 -0
- package/dist/legacy-engine/rule-generator.js.map +1 -0
- package/dist/legacy-engine/rule-matcher.d.ts +28 -0
- package/dist/legacy-engine/rule-matcher.d.ts.map +1 -0
- package/dist/legacy-engine/rule-matcher.js +79 -0
- package/dist/legacy-engine/rule-matcher.js.map +1 -0
- package/dist/legacy-engine/token-controller.d.ts +31 -0
- package/dist/legacy-engine/token-controller.d.ts.map +1 -0
- package/dist/legacy-engine/token-controller.js +66 -0
- package/dist/legacy-engine/token-controller.js.map +1 -0
- package/dist/middleware/response-validation.d.ts +27 -0
- package/dist/middleware/response-validation.d.ts.map +1 -0
- package/dist/middleware/response-validation.js +50 -0
- package/dist/middleware/response-validation.js.map +1 -0
- package/dist/modes/confirm.d.ts +29 -0
- package/dist/modes/confirm.d.ts.map +1 -0
- package/dist/modes/confirm.js +27 -0
- package/dist/modes/confirm.js.map +1 -0
- package/dist/modes/silent.d.ts +24 -0
- package/dist/modes/silent.d.ts.map +1 -0
- package/dist/modes/silent.js +24 -0
- package/dist/modes/silent.js.map +1 -0
- package/dist/resources/cognition-resources.d.ts +28 -0
- package/dist/resources/cognition-resources.d.ts.map +1 -0
- package/dist/resources/cognition-resources.js +124 -0
- package/dist/resources/cognition-resources.js.map +1 -0
- package/dist/storage/client.d.ts +26 -0
- package/dist/storage/client.d.ts.map +1 -0
- package/dist/storage/client.js +45 -0
- package/dist/storage/client.js.map +1 -0
- package/dist/storage/cognition-repository.d.ts +55 -0
- package/dist/storage/cognition-repository.d.ts.map +1 -0
- package/dist/storage/cognition-repository.js +287 -0
- package/dist/storage/cognition-repository.js.map +1 -0
- package/dist/storage/cognition-types.d.ts +96 -0
- package/dist/storage/cognition-types.d.ts.map +1 -0
- package/dist/storage/cognition-types.js +41 -0
- package/dist/storage/cognition-types.js.map +1 -0
- package/dist/storage/conflict-repo.d.ts +41 -0
- package/dist/storage/conflict-repo.d.ts.map +1 -0
- package/dist/storage/conflict-repo.js +67 -0
- package/dist/storage/conflict-repo.js.map +1 -0
- package/dist/storage/diff-log-repo.d.ts +48 -0
- package/dist/storage/diff-log-repo.d.ts.map +1 -0
- package/dist/storage/diff-log-repo.js +51 -0
- package/dist/storage/diff-log-repo.js.map +1 -0
- package/dist/storage/metric-repo.d.ts +20 -0
- package/dist/storage/metric-repo.d.ts.map +1 -0
- package/dist/storage/metric-repo.js +36 -0
- package/dist/storage/metric-repo.js.map +1 -0
- package/dist/storage/rule-repo.d.ts +66 -0
- package/dist/storage/rule-repo.d.ts.map +1 -0
- package/dist/storage/rule-repo.js +188 -0
- package/dist/storage/rule-repo.js.map +1 -0
- package/dist/tools/analyze-workspace.d.ts +26 -0
- package/dist/tools/analyze-workspace.d.ts.map +1 -0
- package/dist/tools/analyze-workspace.js +147 -0
- package/dist/tools/analyze-workspace.js.map +1 -0
- package/dist/tools/capture-diff.d.ts +26 -0
- package/dist/tools/capture-diff.d.ts.map +1 -0
- package/dist/tools/capture-diff.js +58 -0
- package/dist/tools/capture-diff.js.map +1 -0
- package/dist/tools/cognition-tools.d.ts +60 -0
- package/dist/tools/cognition-tools.d.ts.map +1 -0
- package/dist/tools/cognition-tools.js +170 -0
- package/dist/tools/cognition-tools.js.map +1 -0
- package/dist/tools/config-tools.d.ts +29 -0
- package/dist/tools/config-tools.d.ts.map +1 -0
- package/dist/tools/config-tools.js +58 -0
- package/dist/tools/config-tools.js.map +1 -0
- package/dist/tools/confirm-rule.d.ts +32 -0
- package/dist/tools/confirm-rule.d.ts.map +1 -0
- package/dist/tools/confirm-rule.js +64 -0
- package/dist/tools/confirm-rule.js.map +1 -0
- package/dist/tools/injection-approval.d.ts +43 -0
- package/dist/tools/injection-approval.d.ts.map +1 -0
- package/dist/tools/injection-approval.js +102 -0
- package/dist/tools/injection-approval.js.map +1 -0
- package/dist/tools/list-rules.d.ts +24 -0
- package/dist/tools/list-rules.d.ts.map +1 -0
- package/dist/tools/list-rules.js +20 -0
- package/dist/tools/list-rules.js.map +1 -0
- package/dist/tools/query-rules.d.ts +25 -0
- package/dist/tools/query-rules.d.ts.map +1 -0
- package/dist/tools/query-rules.js +65 -0
- package/dist/tools/query-rules.js.map +1 -0
- package/dist/tools/resolve-conflict.d.ts +33 -0
- package/dist/tools/resolve-conflict.d.ts.map +1 -0
- package/dist/tools/resolve-conflict.js +35 -0
- package/dist/tools/resolve-conflict.js.map +1 -0
- package/dist/types.d.ts +190 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +50 -0
- package/dist/types.js.map +1 -0
- package/docs/api-reference.md +1229 -0
- package/docs/community/feedback-playbook.md +94 -0
- package/docs/integration-snippets.md +100 -0
- package/docs/mcp-integration-guide.md +151 -0
- package/docs/phase4-mcp-feedback.md +155 -0
- package/docs/trust-governance-protocol.md +72 -0
- package/package.json +74 -0
- package/prisma/schema.prisma +145 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
17
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
18
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
19
|
+
import { getPrismaClient, disconnectPrisma } from "./storage/client.js";
|
|
20
|
+
import { RuleRepo } from "./storage/rule-repo.js";
|
|
21
|
+
import { DiffLogRepo } from "./storage/diff-log-repo.js";
|
|
22
|
+
import { ConflictRepo } from "./storage/conflict-repo.js";
|
|
23
|
+
import { MetricRepo } from "./storage/metric-repo.js";
|
|
24
|
+
import { handleCaptureDiff } from "./tools/capture-diff.js";
|
|
25
|
+
import { handleQueryRules } from "./tools/query-rules.js";
|
|
26
|
+
import { handleConfirmRule } from "./tools/confirm-rule.js";
|
|
27
|
+
import { handleResolveConflict } from "./tools/resolve-conflict.js";
|
|
28
|
+
import { handleListRules } from "./tools/list-rules.js";
|
|
29
|
+
import { handleAnalyzeWorkspace } from "./tools/analyze-workspace.js";
|
|
30
|
+
import { handleCognitionQuery, handleCognitionValidate, handleCognitionFeedback } from "./tools/cognition-tools.js";
|
|
31
|
+
import { handleApproveInjection } from "./tools/injection-approval.js";
|
|
32
|
+
import { handleUpdateConfig } from "./tools/config-tools.js";
|
|
33
|
+
const server = new Server({ name: "agent-tuning-reverse-graph", version: "0.1.0" }, { capabilities: { tools: {} } });
|
|
34
|
+
const ruleRepo = new RuleRepo();
|
|
35
|
+
const diffLogRepo = new DiffLogRepo();
|
|
36
|
+
const metricRepo = new MetricRepo();
|
|
37
|
+
const conflictRepo = new ConflictRepo(ruleRepo);
|
|
38
|
+
async function getMode() {
|
|
39
|
+
const prisma = getPrismaClient();
|
|
40
|
+
const config = await prisma.appConfig.findUnique({ where: { id: "default" } });
|
|
41
|
+
return config?.mode ?? "silent";
|
|
42
|
+
}
|
|
43
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
44
|
+
tools: [
|
|
45
|
+
{ name: "analyze_workspace", description: "批量分析工作区变更并生成规则候选", inputSchema: { type: "object", properties: { baseCommit: { type: "string" }, headCommit: { type: "string" }, paths: { type: "array", items: { type: "string" } }, taskId: { type: "string" } }, required: ["baseCommit"] } },
|
|
46
|
+
{ name: "capture_diff", description: "分析代码差异并生成规则候选", inputSchema: { type: "object", properties: { filePath: { type: "string" }, originalContent: { type: "string" }, modifiedContent: { type: "string" }, language: { type: "string" }, projectId: { type: "string" } }, required: ["filePath", "originalContent", "modifiedContent", "language"] } },
|
|
47
|
+
{ name: "query_rules", description: "查询与当前上下文最相关的规则", inputSchema: { type: "object", properties: { language: { type: "string" }, filePath: { type: "string" }, projectId: { type: "string" }, tags: { type: "array", items: { type: "string" } } }, required: ["language", "filePath"] } },
|
|
48
|
+
{ name: "confirm_rule", description: "确认/拒绝/编辑/跳过规则候选", inputSchema: { type: "object", properties: { ruleId: { type: "string" }, action: { type: "string", enum: ["accept", "reject", "edit", "skip"] }, editedPattern: { type: "string" }, editedSuggestion: { type: "string" } }, required: ["ruleId", "action"] } },
|
|
49
|
+
{ name: "resolve_conflict", description: "解决规则冲突", inputSchema: { type: "object", properties: { conflictId: { type: "string" }, resolution: { type: "string", enum: ["keep_a", "keep_b", "merge", "skip"] }, batchAllSession: { type: "boolean" } }, required: ["conflictId", "resolution"] } },
|
|
50
|
+
{ name: "list_rules", description: "列出规则", inputSchema: { type: "object", properties: { language: { type: "string" }, scope: { type: "string", enum: ["project", "user", "global"] }, status: { type: "string", enum: ["active", "pending", "archived"] }, projectId: { type: "string" }, limit: { type: "number" }, offset: { type: "number" } } } },
|
|
51
|
+
],
|
|
52
|
+
}));
|
|
53
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
54
|
+
const { name, arguments: args } = request.params;
|
|
55
|
+
try {
|
|
56
|
+
switch (name) {
|
|
57
|
+
case "analyze_workspace": return await handleAnalyzeWorkspace(args, ruleRepo, diffLogRepo, metricRepo);
|
|
58
|
+
case "capture_diff": return await handleCaptureDiff(args, ruleRepo, diffLogRepo, metricRepo, await getMode());
|
|
59
|
+
case "query_rules": return await handleQueryRules(args, ruleRepo, metricRepo);
|
|
60
|
+
case "confirm_rule": return await handleConfirmRule(args, ruleRepo, metricRepo);
|
|
61
|
+
case "resolve_conflict": return await handleResolveConflict(args, conflictRepo, ruleRepo, metricRepo);
|
|
62
|
+
case "list_rules": return await handleListRules(args, ruleRepo);
|
|
63
|
+
case "cognition_query": return await handleCognitionQuery(args);
|
|
64
|
+
case "cognition_validate": return await handleCognitionValidate(args);
|
|
65
|
+
case "cognition_feedback": return await handleCognitionFeedback(args);
|
|
66
|
+
case "cognition_approve_injection": return await handleApproveInjection(args);
|
|
67
|
+
case "cognition_update_config": return await handleUpdateConfig(args);
|
|
68
|
+
default: throw new McpError(ErrorCode.MethodNotFound, "Unknown tool: " + name);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (err instanceof McpError)
|
|
73
|
+
throw err;
|
|
74
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: String(err) }) }], isError: true };
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
async function main() {
|
|
78
|
+
const prisma = getPrismaClient();
|
|
79
|
+
// Initialize the SQLite database and push schema
|
|
80
|
+
await prisma.$connect();
|
|
81
|
+
await prisma.appConfig.upsert({ where: { id: "default" }, update: {}, create: { id: "default", mode: "silent" } });
|
|
82
|
+
const transport = new StdioServerTransport();
|
|
83
|
+
server.onerror = (err) => console.error("[MCP Error]", err);
|
|
84
|
+
process.on("SIGINT", async () => { await disconnectPrisma(); process.exit(0); });
|
|
85
|
+
process.on("SIGTERM", async () => { await disconnectPrisma(); process.exit(0); });
|
|
86
|
+
await server.connect(transport);
|
|
87
|
+
console.error("Agent Tuning Reverse Graph MCP Server running on stdio");
|
|
88
|
+
}
|
|
89
|
+
main().catch((err) => { console.error("Fatal error:", err); process.exit(1); });
|
|
90
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated LEGACY ENGINE MODULE — Preserved for reference only.
|
|
18
|
+
* Do NOT modify. The new cognition-engine module replaces this entire subsystem.
|
|
19
|
+
* See src/cognition-engine/ for the replacement.
|
|
20
|
+
*/
|
|
21
|
+
import { ASTNode, DiffResult } from "../types.js";
|
|
22
|
+
export declare function computeDiff(oldAst: ASTNode, newAst: ASTNode): DiffResult;
|
|
23
|
+
//# sourceMappingURL=ast-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-diff.d.ts","sourceRoot":"","sources":["../../src/legacy-engine/ast-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAY,UAAU,EAAiB,MAAM,aAAa,CAAC;AAyD3E,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,UAAU,CAsFxE"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { buildSignatureMap } from "./ast-node.js";
|
|
17
|
+
/** Enhanced signature match using structuralHash (Merkle-tree style). */
|
|
18
|
+
function signaturesEqual(a, b) {
|
|
19
|
+
if (!a || !b)
|
|
20
|
+
return false;
|
|
21
|
+
return a.structuralHash === b.structuralHash;
|
|
22
|
+
}
|
|
23
|
+
function findMatchingChild(child, candidates, oldSigs, newSigs, used) {
|
|
24
|
+
const childSig = oldSigs.get(child);
|
|
25
|
+
if (!childSig)
|
|
26
|
+
return undefined;
|
|
27
|
+
return candidates.find(c => !used.has(c) && signaturesEqual(newSigs.get(c), childSig));
|
|
28
|
+
}
|
|
29
|
+
/** Post-process operations: convert DELETE+INSERT pairs with matching content to MOVE.
|
|
30
|
+
* This handles cross-parent moves that can"t be detected within a single walk level. */
|
|
31
|
+
function detectMovesPostProcess(ops) {
|
|
32
|
+
// Collect deletes and inserts by key (nodeType + originalText or modifiedText)
|
|
33
|
+
const deletes = [];
|
|
34
|
+
const inserts = [];
|
|
35
|
+
for (const op of ops) {
|
|
36
|
+
if (op.type === "DELETE" && op.originalText) {
|
|
37
|
+
deletes.push({ op, key: op.nodeType + ":" + op.originalText });
|
|
38
|
+
}
|
|
39
|
+
if (op.type === "INSERT" && op.modifiedText) {
|
|
40
|
+
inserts.push({ op, key: op.nodeType + ":" + op.modifiedText });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Match delete+insert pairs by key and convert to MOVE
|
|
44
|
+
for (const d of deletes) {
|
|
45
|
+
const matchIdx = inserts.findIndex(i => i.key === d.key);
|
|
46
|
+
if (matchIdx >= 0) {
|
|
47
|
+
const match = inserts[matchIdx];
|
|
48
|
+
d.op.type = "MOVE";
|
|
49
|
+
d.op.modifiedText = match.op.modifiedText;
|
|
50
|
+
d.op.endByte = Math.max(d.op.endByte, match.op.endByte);
|
|
51
|
+
// Mark the matched insert for removal
|
|
52
|
+
match.op.type = "__REMOVED__";
|
|
53
|
+
inserts.splice(matchIdx, 1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Remove marked operations
|
|
57
|
+
for (let i = ops.length - 1; i >= 0; i--) {
|
|
58
|
+
if (ops[i].type === "__REMOVED__") {
|
|
59
|
+
ops.splice(i, 1);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function computeDiff(oldAst, newAst) {
|
|
64
|
+
const startTime = performance.now();
|
|
65
|
+
try {
|
|
66
|
+
if (!oldAst || !newAst) {
|
|
67
|
+
return { operations: [], status: "failed", confidence: "low", processedBytes: 0, durationMs: performance.now() - startTime, error: "Invalid AST" };
|
|
68
|
+
}
|
|
69
|
+
const oldSigs = buildSignatureMap(oldAst);
|
|
70
|
+
const newSigs = buildSignatureMap(newAst);
|
|
71
|
+
const operations = [];
|
|
72
|
+
const matchedNew = new Set();
|
|
73
|
+
function walk(oldNode, newNode) {
|
|
74
|
+
const usedInLevel = new Set();
|
|
75
|
+
const unmatchedOld = [];
|
|
76
|
+
const unmatchedNew = [];
|
|
77
|
+
// Phase 1: Exact structural match
|
|
78
|
+
for (const oc of oldNode.children) {
|
|
79
|
+
const match = findMatchingChild(oc, newNode.children, oldSigs, newSigs, usedInLevel);
|
|
80
|
+
if (match) {
|
|
81
|
+
usedInLevel.add(match);
|
|
82
|
+
matchedNew.add(match);
|
|
83
|
+
if (oc.text !== match.text && oc.type === match.type) {
|
|
84
|
+
operations.push({ type: "UPDATE", nodeType: oc.type, originalText: oc.text, modifiedText: match.text, startByte: Math.min(oc.startByte, match.startByte), endByte: Math.max(oc.endByte, match.endByte) });
|
|
85
|
+
}
|
|
86
|
+
walk(oc, match);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
unmatchedOld.push(oc);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
for (const nc of newNode.children) {
|
|
93
|
+
if (!usedInLevel.has(nc)) {
|
|
94
|
+
unmatchedNew.push(nc);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Phase 2: MOVE detection — same structuralHash, different parent within same level
|
|
98
|
+
const movedSet = new Set();
|
|
99
|
+
for (const oc of unmatchedOld) {
|
|
100
|
+
const ocSig = oldSigs.get(oc);
|
|
101
|
+
if (!ocSig) {
|
|
102
|
+
operations.push({ type: "DELETE", nodeType: oc.type, originalText: oc.text, startByte: oc.startByte, endByte: oc.endByte, parentType: oldNode.type });
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
const moveIdx = unmatchedNew.findIndex(nc => {
|
|
106
|
+
if (movedSet.has(nc))
|
|
107
|
+
return false;
|
|
108
|
+
const ncSig = newSigs.get(nc);
|
|
109
|
+
return ncSig && ncSig.structuralHash === ocSig.structuralHash;
|
|
110
|
+
});
|
|
111
|
+
if (moveIdx >= 0) {
|
|
112
|
+
const moveTarget = unmatchedNew[moveIdx];
|
|
113
|
+
movedSet.add(moveTarget);
|
|
114
|
+
matchedNew.add(moveTarget);
|
|
115
|
+
operations.push({ type: "MOVE", nodeType: oc.type, originalText: oc.text, modifiedText: moveTarget.text, startByte: Math.min(oc.startByte, moveTarget.startByte), endByte: Math.max(oc.endByte, moveTarget.endByte), parentType: oldNode.type });
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
operations.push({ type: "DELETE", nodeType: oc.type, originalText: oc.text, startByte: oc.startByte, endByte: oc.endByte, parentType: oldNode.type });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Phase 3: Remaining unmatched new → INSERT
|
|
122
|
+
for (const nc of unmatchedNew) {
|
|
123
|
+
if (!movedSet.has(nc)) {
|
|
124
|
+
operations.push({ type: "INSERT", nodeType: nc.type, modifiedText: nc.text, startByte: nc.startByte, endByte: nc.endByte, parentType: newNode.type });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
walk(oldAst, newAst);
|
|
129
|
+
// Post-process: cross-parent MOVE detection
|
|
130
|
+
detectMovesPostProcess(operations);
|
|
131
|
+
const durationMs = performance.now() - startTime;
|
|
132
|
+
const totalNodes = oldAst.children.length + newAst.children.length;
|
|
133
|
+
const threshold = Math.max(totalNodes * 0.6, 1);
|
|
134
|
+
return {
|
|
135
|
+
operations,
|
|
136
|
+
status: operations.length <= threshold ? "success" : "fallback",
|
|
137
|
+
confidence: operations.length <= threshold ? "high" : "low",
|
|
138
|
+
processedBytes: Math.max(oldAst.endByte, newAst.endByte),
|
|
139
|
+
durationMs,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
return { operations: [], status: "failed", confidence: "low", processedBytes: 0, durationMs: performance.now() - startTime, error: String(err) };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=ast-diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-diff.js","sourceRoot":"","sources":["../../src/legacy-engine/ast-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated LEGACY ENGINE MODULE — Preserved for reference only.
|
|
18
|
+
* Do NOT modify. The new cognition-engine module replaces this entire subsystem.
|
|
19
|
+
* See src/cognition-engine/ for the replacement.
|
|
20
|
+
*/
|
|
21
|
+
import { ASTNode, NodeSignature } from "../types.js";
|
|
22
|
+
export declare function computeSignature(node: ASTNode, childSigs?: NodeSignature[], hashFn?: (s: string) => string): NodeSignature;
|
|
23
|
+
export declare function buildSignatureMap(node: ASTNode, hashFn?: (s: string) => string): Map<ASTNode, NodeSignature>;
|
|
24
|
+
//# sourceMappingURL=ast-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-node.d.ts","sourceRoot":"","sources":["../../src/legacy-engine/ast-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYrD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,aAAa,CAc1H;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,CAS5G"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
function simpleHash(s) {
|
|
17
|
+
if (!s)
|
|
18
|
+
return "0";
|
|
19
|
+
let hash = 0;
|
|
20
|
+
for (let i = 0; i < s.length; i++) {
|
|
21
|
+
hash = ((hash << 5) - hash) + s.charCodeAt(i);
|
|
22
|
+
hash |= 0;
|
|
23
|
+
}
|
|
24
|
+
return hash.toString(16);
|
|
25
|
+
}
|
|
26
|
+
export function computeSignature(node, childSigs, hashFn) {
|
|
27
|
+
const hash = (hashFn ?? simpleHash);
|
|
28
|
+
const childStructHashes = childSigs
|
|
29
|
+
? childSigs.map(s => s.structuralHash)
|
|
30
|
+
: node.children.map(c => computeSignature(c, undefined, hashFn).structuralHash);
|
|
31
|
+
const structuralHash = hash(node.type + "[" + childStructHashes.join(",") + "]");
|
|
32
|
+
const childTypes = node.children.map(c => c.type).join(",");
|
|
33
|
+
return {
|
|
34
|
+
type: node.type,
|
|
35
|
+
textHash: hash(node.text),
|
|
36
|
+
childrenCount: node.children.length,
|
|
37
|
+
childTypesHash: hash(childTypes),
|
|
38
|
+
structuralHash,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function buildSignatureMap(node, hashFn) {
|
|
42
|
+
const map = new Map();
|
|
43
|
+
function walk(n) {
|
|
44
|
+
for (const child of n.children)
|
|
45
|
+
walk(child);
|
|
46
|
+
const childSigs = n.children.map(c => map.get(c));
|
|
47
|
+
map.set(n, computeSignature(n, childSigs, hashFn));
|
|
48
|
+
}
|
|
49
|
+
walk(node);
|
|
50
|
+
return map;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=ast-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-node.js","sourceRoot":"","sources":["../../src/legacy-engine/ast-node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACnB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAa,EAAE,SAA2B,EAAE,MAA8B;IACzG,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC;IACpC,MAAM,iBAAiB,GAAG,SAAS;QACjC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;QACtC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAClF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;QACnC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC;QAChC,cAAc;KACf,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAa,EAAE,MAA8B;IAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,SAAS,IAAI,CAAC,CAAU;QACtB,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ;YAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;QACnD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { ASTNode, AtomicOp, DiffResult } from "../types.js";
|
|
17
|
+
export interface ParserResult {
|
|
18
|
+
ast: ASTNode;
|
|
19
|
+
language: string;
|
|
20
|
+
parseSuccess: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** Parse code to AST using web-tree-sitter, falling back to line-based AST on failure. */
|
|
23
|
+
export declare function parseToAST(code: string, languageOrPath: string): Promise<ParserResult>;
|
|
24
|
+
/** Compute diff with automatic AST → regex fallback chain. */
|
|
25
|
+
export declare function computeDiffWithFallback(originalCode: string, modifiedCode: string, languageOrPath: string): Promise<DiffResult | {
|
|
26
|
+
fallbackReason: string;
|
|
27
|
+
operations: AtomicOp[];
|
|
28
|
+
status: "success" | "fallback" | "failed";
|
|
29
|
+
confidence: "high" | "medium" | "low";
|
|
30
|
+
processedBytes: number;
|
|
31
|
+
durationMs: number;
|
|
32
|
+
error?: string;
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=parsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/legacy-engine/parsers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyE5D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,OAAO,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,0FAA0F;AAC1F,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA0B5F;AAED,8DAA8D;AAC9D,wBAAsB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM;;;;;;;;GAY/G"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated LEGACY ENGINE MODULE — Preserved for reference only.
|
|
18
|
+
* Do NOT modify. The new cognition-engine module replaces this entire subsystem.
|
|
19
|
+
* See src/cognition-engine/ for the replacement.
|
|
20
|
+
*/
|
|
21
|
+
import { fileURLToPath } from "node:url";
|
|
22
|
+
import path from "node:path";
|
|
23
|
+
import { computeDiff } from "./ast-diff.js";
|
|
24
|
+
import { regexDiff } from "./regex-fallback.js";
|
|
25
|
+
// ── Path Resolution ──────────────────────────────────────────
|
|
26
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
27
|
+
const projectRoot = path.resolve(__dirname, "../..");
|
|
28
|
+
const WASM_PATHS = {
|
|
29
|
+
javascript: path.join(projectRoot, "node_modules", "tree-sitter-javascript", "tree-sitter-javascript.wasm"),
|
|
30
|
+
typescript: path.join(projectRoot, "node_modules", "tree-sitter-typescript", "tree-sitter-typescript.wasm"),
|
|
31
|
+
tsx: path.join(projectRoot, "node_modules", "tree-sitter-typescript", "tree-sitter-tsx.wasm"),
|
|
32
|
+
python: path.join(projectRoot, "node_modules", "tree-sitter-python", "tree-sitter-python.wasm"),
|
|
33
|
+
};
|
|
34
|
+
function getLanguageForFile(filePath) {
|
|
35
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
36
|
+
if (ext === ".tsx")
|
|
37
|
+
return "tsx";
|
|
38
|
+
if (ext === ".ts")
|
|
39
|
+
return "typescript";
|
|
40
|
+
if (ext === ".js" || ext === ".jsx" || ext === ".mjs" || ext === ".cjs")
|
|
41
|
+
return "javascript";
|
|
42
|
+
if (ext === ".py")
|
|
43
|
+
return "python";
|
|
44
|
+
return "javascript"; // default fallback
|
|
45
|
+
}
|
|
46
|
+
// ── Tree-sitter WASM Initialization ──────────────────────────
|
|
47
|
+
let tsInitialized = false;
|
|
48
|
+
let tsFailed = false;
|
|
49
|
+
const grammarCache = new Map();
|
|
50
|
+
let ParserModule = null;
|
|
51
|
+
async function ensureTreeSitter() {
|
|
52
|
+
if (tsInitialized)
|
|
53
|
+
return true;
|
|
54
|
+
if (tsFailed)
|
|
55
|
+
return false;
|
|
56
|
+
try {
|
|
57
|
+
ParserModule = await import("web-tree-sitter");
|
|
58
|
+
await ParserModule.Parser.init();
|
|
59
|
+
tsInitialized = true;
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
tsFailed = true;
|
|
64
|
+
console.error("[parsers] web-tree-sitter init failed:", err);
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function loadGrammar(language) {
|
|
69
|
+
if (grammarCache.has(language))
|
|
70
|
+
return grammarCache.get(language);
|
|
71
|
+
const wasmPath = WASM_PATHS[language];
|
|
72
|
+
if (!wasmPath)
|
|
73
|
+
throw new Error(`No WASM path for language: ${language}`);
|
|
74
|
+
const fs = await import("node:fs");
|
|
75
|
+
if (!fs.existsSync(wasmPath)) {
|
|
76
|
+
throw new Error(`WASM file not found: ${wasmPath}`);
|
|
77
|
+
}
|
|
78
|
+
const lang = await ParserModule.Language.load(wasmPath);
|
|
79
|
+
grammarCache.set(language, lang);
|
|
80
|
+
return lang;
|
|
81
|
+
}
|
|
82
|
+
// ── Tree-sitter → ASTNode Conversion ────────────────────────
|
|
83
|
+
function treeSitterToAST(node) {
|
|
84
|
+
return {
|
|
85
|
+
type: node.type,
|
|
86
|
+
text: node.text,
|
|
87
|
+
startByte: node.startIndex,
|
|
88
|
+
endByte: node.endIndex,
|
|
89
|
+
children: node.namedChildren.map((c) => treeSitterToAST(c)),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Parse code to AST using web-tree-sitter, falling back to line-based AST on failure. */
|
|
93
|
+
export async function parseToAST(code, languageOrPath) {
|
|
94
|
+
const lang = languageOrPath.includes(".") ? getLanguageForFile(languageOrPath) : languageOrPath;
|
|
95
|
+
// Try tree-sitter WASM first
|
|
96
|
+
const available = await ensureTreeSitter();
|
|
97
|
+
if (available) {
|
|
98
|
+
try {
|
|
99
|
+
const grammar = await loadGrammar(lang);
|
|
100
|
+
const parser = new ParserModule.Parser();
|
|
101
|
+
parser.setLanguage(grammar);
|
|
102
|
+
const tree = parser.parse(code);
|
|
103
|
+
const ast = treeSitterToAST(tree.rootNode);
|
|
104
|
+
return { ast, language: lang, parseSuccess: true };
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
// Fall through to line-based fallback
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Fallback: line-based AST
|
|
111
|
+
const lines = code.split("\n");
|
|
112
|
+
const children = lines.map((line, i) => {
|
|
113
|
+
const idx = code.indexOf(line, i > 0 ? code.indexOf(lines[i - 1]) + lines[i - 1].length : 0);
|
|
114
|
+
return { type: "line", text: line, startByte: idx >= 0 ? idx : 0, endByte: idx >= 0 ? idx + line.length : line.length, children: [] };
|
|
115
|
+
});
|
|
116
|
+
const ast = { type: "program", text: code, startByte: 0, endByte: code.length, children };
|
|
117
|
+
return { ast, language: lang, parseSuccess: false };
|
|
118
|
+
}
|
|
119
|
+
/** Compute diff with automatic AST → regex fallback chain. */
|
|
120
|
+
export async function computeDiffWithFallback(originalCode, modifiedCode, languageOrPath) {
|
|
121
|
+
try {
|
|
122
|
+
const { ast: oldAst } = await parseToAST(originalCode, languageOrPath);
|
|
123
|
+
const { ast: newAst } = await parseToAST(modifiedCode, languageOrPath);
|
|
124
|
+
const result = computeDiff(oldAst, newAst);
|
|
125
|
+
if (result.status === "failed" || result.confidence === "low") {
|
|
126
|
+
return { ...regexDiff(originalCode, modifiedCode), fallbackReason: "ast_low_confidence" };
|
|
127
|
+
}
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return regexDiff(originalCode, modifiedCode);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/legacy-engine/parsers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated LEGACY ENGINE MODULE — Preserved for reference only.
|
|
18
|
+
* Do NOT modify. The new cognition-engine module replaces this entire subsystem.
|
|
19
|
+
* See src/cognition-engine/ for the replacement.
|
|
20
|
+
*/
|
|
21
|
+
import { DiffResult } from "../types.js";
|
|
22
|
+
export declare function regexDiff(original: string, modified: string): DiffResult;
|
|
23
|
+
//# sourceMappingURL=regex-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-fallback.d.ts","sourceRoot":"","sources":["../../src/legacy-engine/regex-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;GAIG;AAEH,OAAO,EAAY,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAoBxE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2026 熊高锐
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
export function regexDiff(original, modified) {
|
|
17
|
+
const startTime = performance.now();
|
|
18
|
+
try {
|
|
19
|
+
const origLines = original.split("\n");
|
|
20
|
+
const modLines = modified.split("\n");
|
|
21
|
+
const ops = [];
|
|
22
|
+
const maxLen = Math.max(origLines.length, modLines.length);
|
|
23
|
+
for (let i = 0; i < maxLen; i++) {
|
|
24
|
+
if (i >= origLines.length) {
|
|
25
|
+
ops.push({ type: "INSERT", nodeType: "line", modifiedText: modLines[i], startByte: 0, endByte: 0 });
|
|
26
|
+
}
|
|
27
|
+
else if (i >= modLines.length) {
|
|
28
|
+
ops.push({ type: "DELETE", nodeType: "line", originalText: origLines[i], startByte: 0, endByte: 0 });
|
|
29
|
+
}
|
|
30
|
+
else if (origLines[i] !== modLines[i]) {
|
|
31
|
+
ops.push({ type: "UPDATE", nodeType: "line", originalText: origLines[i], modifiedText: modLines[i], startByte: 0, endByte: 0 });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { operations: ops, status: "fallback", confidence: "medium", processedBytes: Math.max(original.length, modified.length), durationMs: performance.now() - startTime };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return { operations: [], status: "failed", confidence: "low", processedBytes: 0, durationMs: performance.now() - startTime, error: String(err) };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=regex-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regex-fallback.js","sourceRoot":"","sources":["../../src/legacy-engine/regex-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,QAAgB;IAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACtG,CAAC;iBAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAChC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACvG,CAAC;iBAAM,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAClI,CAAC;QACH,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;IAC9K,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACnJ,CAAC;AACH,CAAC"}
|