@triedotdev/mcp 1.0.168 → 1.0.170
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 +54 -500
- package/dist/chunk-2YXOBNKW.js +619 -0
- package/dist/chunk-2YXOBNKW.js.map +1 -0
- package/dist/chunk-QR64Y5TI.js +363 -0
- package/dist/chunk-QR64Y5TI.js.map +1 -0
- package/dist/cli/main.d.ts +0 -15
- package/dist/cli/main.js +356 -3100
- package/dist/cli/main.js.map +1 -1
- package/dist/index.js +2 -36
- package/dist/index.js.map +1 -1
- package/dist/server/mcp-server.js +2 -36
- package/package.json +8 -31
- package/dist/autonomy-config-FSERX3O3.js +0 -30
- package/dist/autonomy-config-FSERX3O3.js.map +0 -1
- package/dist/chat-store-JNGNTDSN.js +0 -15
- package/dist/chat-store-JNGNTDSN.js.map +0 -1
- package/dist/chunk-2HF65EHQ.js +0 -311
- package/dist/chunk-2HF65EHQ.js.map +0 -1
- package/dist/chunk-43X6JBEM.js +0 -36
- package/dist/chunk-43X6JBEM.js.map +0 -1
- package/dist/chunk-4MXH2ZPT.js +0 -1827
- package/dist/chunk-4MXH2ZPT.js.map +0 -1
- package/dist/chunk-575YT2SD.js +0 -737
- package/dist/chunk-575YT2SD.js.map +0 -1
- package/dist/chunk-5BRRRTN6.js +0 -354
- package/dist/chunk-5BRRRTN6.js.map +0 -1
- package/dist/chunk-6NLHFIYA.js +0 -344
- package/dist/chunk-6NLHFIYA.js.map +0 -1
- package/dist/chunk-7WITSO22.js +0 -824
- package/dist/chunk-7WITSO22.js.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -11
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-EFWVF6TI.js +0 -267
- package/dist/chunk-EFWVF6TI.js.map +0 -1
- package/dist/chunk-F6WFNUAY.js +0 -216
- package/dist/chunk-F6WFNUAY.js.map +0 -1
- package/dist/chunk-FQ45QP5A.js +0 -361
- package/dist/chunk-FQ45QP5A.js.map +0 -1
- package/dist/chunk-G2TGF6TR.js +0 -573
- package/dist/chunk-G2TGF6TR.js.map +0 -1
- package/dist/chunk-GTKYBOXL.js +0 -700
- package/dist/chunk-GTKYBOXL.js.map +0 -1
- package/dist/chunk-HVCDY3AK.js +0 -850
- package/dist/chunk-HVCDY3AK.js.map +0 -1
- package/dist/chunk-JVMBCWKS.js +0 -348
- package/dist/chunk-JVMBCWKS.js.map +0 -1
- package/dist/chunk-KDHN2ZQE.js +0 -313
- package/dist/chunk-KDHN2ZQE.js.map +0 -1
- package/dist/chunk-LQIMKE3P.js +0 -12524
- package/dist/chunk-LQIMKE3P.js.map +0 -1
- package/dist/chunk-ME2OERF5.js +0 -345
- package/dist/chunk-ME2OERF5.js.map +0 -1
- package/dist/chunk-MRHKX5M5.js +0 -662
- package/dist/chunk-MRHKX5M5.js.map +0 -1
- package/dist/chunk-OBQ74FOU.js +0 -27
- package/dist/chunk-OBQ74FOU.js.map +0 -1
- package/dist/chunk-OMR4YCBS.js +0 -987
- package/dist/chunk-OMR4YCBS.js.map +0 -1
- package/dist/chunk-Q5EKA5YA.js +0 -254
- package/dist/chunk-Q5EKA5YA.js.map +0 -1
- package/dist/chunk-Q63FFI6D.js +0 -132
- package/dist/chunk-Q63FFI6D.js.map +0 -1
- package/dist/chunk-SY6KQG44.js +0 -983
- package/dist/chunk-SY6KQG44.js.map +0 -1
- package/dist/chunk-T63OHG4Q.js +0 -440
- package/dist/chunk-T63OHG4Q.js.map +0 -1
- package/dist/chunk-TN5WEKWI.js +0 -173
- package/dist/chunk-TN5WEKWI.js.map +0 -1
- package/dist/chunk-VUL52BQL.js +0 -402
- package/dist/chunk-VUL52BQL.js.map +0 -1
- package/dist/chunk-VVITXIHN.js +0 -189
- package/dist/chunk-VVITXIHN.js.map +0 -1
- package/dist/chunk-WCN7S3EI.js +0 -14
- package/dist/chunk-WCN7S3EI.js.map +0 -1
- package/dist/chunk-XE6KQRKZ.js +0 -816
- package/dist/chunk-XE6KQRKZ.js.map +0 -1
- package/dist/chunk-XPZZFPBZ.js +0 -491
- package/dist/chunk-XPZZFPBZ.js.map +0 -1
- package/dist/chunk-XTFWT2XM.js +0 -727
- package/dist/chunk-XTFWT2XM.js.map +0 -1
- package/dist/chunk-YDHUCDHM.js +0 -4011
- package/dist/chunk-YDHUCDHM.js.map +0 -1
- package/dist/chunk-YZ6Y2H3P.js +0 -1289
- package/dist/chunk-YZ6Y2H3P.js.map +0 -1
- package/dist/chunk-ZJF5FTBX.js +0 -1396
- package/dist/chunk-ZJF5FTBX.js.map +0 -1
- package/dist/chunk-ZV2K6M7T.js +0 -74
- package/dist/chunk-ZV2K6M7T.js.map +0 -1
- package/dist/cli/create-agent.d.ts +0 -1
- package/dist/cli/create-agent.js +0 -1050
- package/dist/cli/create-agent.js.map +0 -1
- package/dist/cli/yolo-daemon.d.ts +0 -1
- package/dist/cli/yolo-daemon.js +0 -423
- package/dist/cli/yolo-daemon.js.map +0 -1
- package/dist/client-NJPZE5JT.js +0 -28
- package/dist/client-NJPZE5JT.js.map +0 -1
- package/dist/codebase-index-VAPF32XX.js +0 -12
- package/dist/codebase-index-VAPF32XX.js.map +0 -1
- package/dist/fast-analyzer-XXYMOXRK.js +0 -216
- package/dist/fast-analyzer-XXYMOXRK.js.map +0 -1
- package/dist/git-EO5SRFMN.js +0 -28
- package/dist/git-EO5SRFMN.js.map +0 -1
- package/dist/github-ingester-ZOKK6GRS.js +0 -11
- package/dist/github-ingester-ZOKK6GRS.js.map +0 -1
- package/dist/goal-manager-YOB7VWK7.js +0 -25
- package/dist/goal-manager-YOB7VWK7.js.map +0 -1
- package/dist/goal-validator-ULKIBDPX.js +0 -24
- package/dist/goal-validator-ULKIBDPX.js.map +0 -1
- package/dist/graph-B3NA4S7I.js +0 -10
- package/dist/graph-B3NA4S7I.js.map +0 -1
- package/dist/hypothesis-7BFFT5JY.js +0 -23
- package/dist/hypothesis-7BFFT5JY.js.map +0 -1
- package/dist/incident-index-EFNUSGWL.js +0 -11
- package/dist/incident-index-EFNUSGWL.js.map +0 -1
- package/dist/insight-store-EC4PLSAW.js +0 -22
- package/dist/insight-store-EC4PLSAW.js.map +0 -1
- package/dist/issue-store-ZIRP23EP.js +0 -36
- package/dist/issue-store-ZIRP23EP.js.map +0 -1
- package/dist/ledger-TWZTGDFA.js +0 -58
- package/dist/ledger-TWZTGDFA.js.map +0 -1
- package/dist/linear-ingester-XXPAZZRW.js +0 -11
- package/dist/linear-ingester-XXPAZZRW.js.map +0 -1
- package/dist/output-manager-RVJ37XKA.js +0 -13
- package/dist/output-manager-RVJ37XKA.js.map +0 -1
- package/dist/parse-goal-violation-SACGFG3C.js +0 -8
- package/dist/parse-goal-violation-SACGFG3C.js.map +0 -1
- package/dist/pattern-discovery-F7LU5K6E.js +0 -8
- package/dist/pattern-discovery-F7LU5K6E.js.map +0 -1
- package/dist/progress-SRQ2V3BP.js +0 -18
- package/dist/progress-SRQ2V3BP.js.map +0 -1
- package/dist/project-state-AHPA77SM.js +0 -28
- package/dist/project-state-AHPA77SM.js.map +0 -1
- package/dist/sync-M2FSWPBC.js +0 -12
- package/dist/sync-M2FSWPBC.js.map +0 -1
- package/dist/terminal-spawn-5YXDMUCF.js +0 -157
- package/dist/terminal-spawn-5YXDMUCF.js.map +0 -1
- package/dist/tiered-storage-Z3YCR465.js +0 -12
- package/dist/tiered-storage-Z3YCR465.js.map +0 -1
- package/dist/trie-agent-3YDPEGHJ.js +0 -28
- package/dist/trie-agent-3YDPEGHJ.js.map +0 -1
- package/dist/ui/chat.html +0 -1014
- package/dist/ui/goals.html +0 -967
- package/dist/ui/hypotheses.html +0 -1011
- package/dist/ui/ledger.html +0 -954
- package/dist/ui/nudges.html +0 -995
- package/dist/vibe-code-signatures-F6URTBW3.js +0 -16
- package/dist/vibe-code-signatures-F6URTBW3.js.map +0 -1
- package/dist/vulnerability-signatures-T7SKHORW.js +0 -18
- package/dist/vulnerability-signatures-T7SKHORW.js.map +0 -1
package/dist/chunk-TN5WEKWI.js
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Trie
|
|
3
|
-
} from "./chunk-6NLHFIYA.js";
|
|
4
|
-
import {
|
|
5
|
-
getTrieDirectory
|
|
6
|
-
} from "./chunk-VVITXIHN.js";
|
|
7
|
-
|
|
8
|
-
// src/context/incident-index.ts
|
|
9
|
-
import path2 from "path";
|
|
10
|
-
|
|
11
|
-
// src/context/file-trie.ts
|
|
12
|
-
import fs from "fs";
|
|
13
|
-
import path from "path";
|
|
14
|
-
import { performance } from "perf_hooks";
|
|
15
|
-
function normalizePath(filePath) {
|
|
16
|
-
const normalized = filePath.replace(/\\/g, "/");
|
|
17
|
-
return normalized.startsWith("./") ? normalized.slice(2) : normalized;
|
|
18
|
-
}
|
|
19
|
-
var FilePathTrie = class {
|
|
20
|
-
trie = new Trie();
|
|
21
|
-
persistPath;
|
|
22
|
-
constructor(persistPath) {
|
|
23
|
-
if (persistPath) this.persistPath = persistPath;
|
|
24
|
-
if (persistPath && fs.existsSync(persistPath)) {
|
|
25
|
-
try {
|
|
26
|
-
const raw = fs.readFileSync(persistPath, "utf-8");
|
|
27
|
-
if (raw.trim().length > 0) {
|
|
28
|
-
const json = JSON.parse(raw);
|
|
29
|
-
this.trie = Trie.fromJSON(json);
|
|
30
|
-
}
|
|
31
|
-
} catch {
|
|
32
|
-
this.trie = new Trie();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
addIncident(filePath, incident) {
|
|
37
|
-
const key = normalizePath(filePath);
|
|
38
|
-
const existing = this.trie.search(key);
|
|
39
|
-
const incidents = existing.found && Array.isArray(existing.value) ? existing.value : [];
|
|
40
|
-
incidents.push(incident);
|
|
41
|
-
this.trie.insert(key, incidents);
|
|
42
|
-
this.persist();
|
|
43
|
-
}
|
|
44
|
-
getIncidents(filePath) {
|
|
45
|
-
const key = normalizePath(filePath);
|
|
46
|
-
const result = this.trie.search(key);
|
|
47
|
-
return result.found && Array.isArray(result.value) ? result.value : [];
|
|
48
|
-
}
|
|
49
|
-
getDirectoryIncidents(prefix) {
|
|
50
|
-
const normalizedPrefix = normalizePath(prefix);
|
|
51
|
-
const matches = this.trie.getWithPrefix(normalizedPrefix);
|
|
52
|
-
return matches.flatMap((m) => Array.isArray(m.value) ? m.value : []).filter(Boolean);
|
|
53
|
-
}
|
|
54
|
-
getHotZones(threshold) {
|
|
55
|
-
const matches = this.trie.getWithPrefix("");
|
|
56
|
-
const zones = [];
|
|
57
|
-
for (const match of matches) {
|
|
58
|
-
const incidents = Array.isArray(match.value) ? match.value : [];
|
|
59
|
-
if (incidents.length >= threshold) {
|
|
60
|
-
zones.push({
|
|
61
|
-
path: match.pattern,
|
|
62
|
-
incidentCount: incidents.length,
|
|
63
|
-
confidence: this.calculateConfidence(incidents.length)
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return zones.sort((a, b) => b.incidentCount - a.incidentCount);
|
|
68
|
-
}
|
|
69
|
-
suggestPaths(partial, limit = 5) {
|
|
70
|
-
const normalized = normalizePath(partial);
|
|
71
|
-
const results = this.trie.getWithPrefix(normalized);
|
|
72
|
-
return results.map((r) => ({
|
|
73
|
-
path: r.pattern,
|
|
74
|
-
incidentCount: Array.isArray(r.value) ? r.value.length : 0
|
|
75
|
-
})).sort((a, b) => b.incidentCount - a.incidentCount).slice(0, limit);
|
|
76
|
-
}
|
|
77
|
-
timeLookup(path3) {
|
|
78
|
-
const start = performance.now();
|
|
79
|
-
this.getIncidents(path3);
|
|
80
|
-
return performance.now() - start;
|
|
81
|
-
}
|
|
82
|
-
toJSON() {
|
|
83
|
-
return this.trie.toJSON();
|
|
84
|
-
}
|
|
85
|
-
calculateConfidence(count) {
|
|
86
|
-
const capped = Math.min(count, 10);
|
|
87
|
-
return Math.round(capped / 10 * 100) / 100;
|
|
88
|
-
}
|
|
89
|
-
persist() {
|
|
90
|
-
if (!this.persistPath) return;
|
|
91
|
-
try {
|
|
92
|
-
const dir = path.dirname(this.persistPath);
|
|
93
|
-
if (!fs.existsSync(dir)) {
|
|
94
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
95
|
-
}
|
|
96
|
-
fs.writeFileSync(this.persistPath, JSON.stringify(this.trie.toJSON()), "utf-8");
|
|
97
|
-
} catch {
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
// src/context/incident-index.ts
|
|
103
|
-
var IncidentIndex = class _IncidentIndex {
|
|
104
|
-
graph;
|
|
105
|
-
trie;
|
|
106
|
-
projectRoot;
|
|
107
|
-
constructor(graph, projectRoot, options) {
|
|
108
|
-
this.graph = graph;
|
|
109
|
-
this.projectRoot = projectRoot;
|
|
110
|
-
this.trie = new FilePathTrie(
|
|
111
|
-
options?.persistPath ?? path2.join(getTrieDirectory(projectRoot), "incident-trie.json")
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
static async build(graph, projectRoot, options) {
|
|
115
|
-
const index = new _IncidentIndex(graph, projectRoot, options);
|
|
116
|
-
await index.rebuild();
|
|
117
|
-
return index;
|
|
118
|
-
}
|
|
119
|
-
async rebuild() {
|
|
120
|
-
const nodes = await this.graph.listNodes();
|
|
121
|
-
const incidents = nodes.filter((n) => n.type === "incident");
|
|
122
|
-
for (const incident of incidents) {
|
|
123
|
-
const files = await this.getFilesForIncident(incident.id);
|
|
124
|
-
this.addIncidentToTrie(incident, files);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
addIncidentToTrie(incident, files) {
|
|
128
|
-
const meta = {
|
|
129
|
-
id: incident.id,
|
|
130
|
-
file: "",
|
|
131
|
-
description: incident.data.description,
|
|
132
|
-
severity: incident.data.severity,
|
|
133
|
-
timestamp: incident.data.timestamp
|
|
134
|
-
};
|
|
135
|
-
for (const file of files) {
|
|
136
|
-
const normalized = this.normalizePath(file);
|
|
137
|
-
this.trie.addIncident(normalized, { ...meta, file: normalized });
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
getFileTrie() {
|
|
141
|
-
return this.trie;
|
|
142
|
-
}
|
|
143
|
-
async getFilesForIncident(incidentId) {
|
|
144
|
-
const files = /* @__PURE__ */ new Set();
|
|
145
|
-
const edges = await this.graph.getEdges(incidentId, "both");
|
|
146
|
-
for (const edge of edges) {
|
|
147
|
-
if (edge.type === "causedBy" || edge.type === "leadTo") {
|
|
148
|
-
const changeId = edge.type === "causedBy" ? edge.to_id : edge.from_id;
|
|
149
|
-
const change = await this.graph.getNode("change", changeId);
|
|
150
|
-
if (change?.data && "files" in change.data && Array.isArray(change.data.files)) {
|
|
151
|
-
change.data.files.forEach((f) => files.add(f));
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
if (edge.type === "affects") {
|
|
155
|
-
const fileNode = await this.graph.getNode("file", edge.to_id) || await this.graph.getNode("file", edge.from_id);
|
|
156
|
-
if (fileNode && typeof fileNode.data?.path === "string") {
|
|
157
|
-
files.add(fileNode.data.path);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return Array.from(files);
|
|
162
|
-
}
|
|
163
|
-
normalizePath(filePath) {
|
|
164
|
-
const absolute = path2.isAbsolute(filePath) ? filePath : path2.join(this.projectRoot, filePath);
|
|
165
|
-
const relative = path2.relative(this.projectRoot, absolute);
|
|
166
|
-
return relative.replace(/\\/g, "/");
|
|
167
|
-
}
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
export {
|
|
171
|
-
IncidentIndex
|
|
172
|
-
};
|
|
173
|
-
//# sourceMappingURL=chunk-TN5WEKWI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/incident-index.ts","../src/context/file-trie.ts"],"sourcesContent":["import path from 'node:path';\n\nimport type { IncidentNode } from './nodes.js';\nimport type { ContextGraph } from './graph.js';\nimport { FilePathTrie, type IncidentMetadata } from './file-trie.js';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nexport interface IncidentIndexOptions {\n persistPath?: string;\n}\n\nexport class IncidentIndex {\n private readonly graph: ContextGraph;\n private readonly trie: FilePathTrie;\n private readonly projectRoot: string;\n\n constructor(graph: ContextGraph, projectRoot: string, options?: IncidentIndexOptions) {\n this.graph = graph;\n this.projectRoot = projectRoot;\n this.trie = new FilePathTrie(\n options?.persistPath ?? path.join(getTrieDirectory(projectRoot), 'incident-trie.json')\n );\n }\n\n static async build(graph: ContextGraph, projectRoot: string, options?: IncidentIndexOptions): Promise<IncidentIndex> {\n const index = new IncidentIndex(graph, projectRoot, options);\n await index.rebuild();\n return index;\n }\n\n async rebuild(): Promise<void> {\n const nodes = await this.graph.listNodes();\n const incidents = nodes.filter((n) => n.type === 'incident') as IncidentNode[];\n\n for (const incident of incidents) {\n const files = await this.getFilesForIncident(incident.id);\n this.addIncidentToTrie(incident, files);\n }\n }\n\n addIncidentToTrie(incident: IncidentNode, files: string[]): void {\n const meta: IncidentMetadata = {\n id: incident.id,\n file: '',\n description: incident.data.description,\n severity: incident.data.severity,\n timestamp: incident.data.timestamp,\n };\n\n for (const file of files) {\n const normalized = this.normalizePath(file);\n this.trie.addIncident(normalized, { ...meta, file: normalized });\n }\n }\n\n getFileTrie(): FilePathTrie {\n return this.trie;\n }\n\n private async getFilesForIncident(incidentId: string): Promise<string[]> {\n const files = new Set<string>();\n const edges = await this.graph.getEdges(incidentId, 'both');\n\n // Traverse connected changes to pull file lists\n for (const edge of edges) {\n if (edge.type === 'causedBy' || edge.type === 'leadTo') {\n // Identify the change node id regardless of direction\n const changeId = edge.type === 'causedBy' ? edge.to_id : edge.from_id;\n const change = await this.graph.getNode('change', changeId);\n if (change?.data && 'files' in change.data && Array.isArray(change.data.files)) {\n (change.data.files as string[]).forEach((f: string) => files.add(f));\n }\n }\n\n // If there are direct file links, capture them as well\n if (edge.type === 'affects') {\n const fileNode =\n (await this.graph.getNode('file', edge.to_id)) ||\n (await this.graph.getNode('file', edge.from_id));\n if (fileNode && typeof (fileNode as any).data?.path === 'string') {\n files.add((fileNode as any).data.path);\n }\n }\n }\n\n return Array.from(files);\n }\n\n private normalizePath(filePath: string): string {\n const absolute = path.isAbsolute(filePath) ? filePath : path.join(this.projectRoot, filePath);\n const relative = path.relative(this.projectRoot, absolute);\n return relative.replace(/\\\\/g, '/');\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport { Trie } from '../trie/trie.js';\n\nexport interface IncidentMetadata {\n id: string;\n file: string;\n description: string;\n severity: 'minor' | 'major' | 'critical' | string;\n timestamp: string;\n}\n\nexport interface HotZone {\n path: string;\n incidentCount: number;\n confidence: number;\n}\n\nfunction normalizePath(filePath: string): string {\n const normalized = filePath.replace(/\\\\/g, '/');\n return normalized.startsWith('./') ? normalized.slice(2) : normalized;\n}\n\nexport class FilePathTrie {\n private trie: Trie<IncidentMetadata[]> = new Trie();\n private persistPath?: string;\n\n constructor(persistPath?: string) {\n if (persistPath) this.persistPath = persistPath;\n if (persistPath && fs.existsSync(persistPath)) {\n try {\n const raw = fs.readFileSync(persistPath, 'utf-8');\n if (raw.trim().length > 0) {\n const json = JSON.parse(raw);\n this.trie = Trie.fromJSON<IncidentMetadata[]>(json);\n }\n } catch {\n this.trie = new Trie();\n }\n }\n }\n\n addIncident(filePath: string, incident: IncidentMetadata): void {\n const key = normalizePath(filePath);\n const existing = this.trie.search(key);\n const incidents = existing.found && Array.isArray(existing.value) ? existing.value : [];\n incidents.push(incident);\n this.trie.insert(key, incidents);\n this.persist();\n }\n\n getIncidents(filePath: string): IncidentMetadata[] {\n const key = normalizePath(filePath);\n const result = this.trie.search(key);\n return result.found && Array.isArray(result.value) ? result.value : [];\n }\n\n getDirectoryIncidents(prefix: string): IncidentMetadata[] {\n const normalizedPrefix = normalizePath(prefix);\n const matches = this.trie.getWithPrefix(normalizedPrefix);\n return matches.flatMap((m) => (Array.isArray(m.value) ? m.value : [])).filter(Boolean);\n }\n\n getHotZones(threshold: number): HotZone[] {\n const matches = this.trie.getWithPrefix('');\n const zones: HotZone[] = [];\n\n for (const match of matches) {\n const incidents = Array.isArray(match.value) ? match.value : [];\n if (incidents.length >= threshold) {\n zones.push({\n path: match.pattern,\n incidentCount: incidents.length,\n confidence: this.calculateConfidence(incidents.length),\n });\n }\n }\n\n return zones.sort((a, b) => b.incidentCount - a.incidentCount);\n }\n\n suggestPaths(partial: string, limit = 5): Array<{ path: string; incidentCount: number }> {\n const normalized = normalizePath(partial);\n const results = this.trie.getWithPrefix(normalized);\n return results\n .map((r) => ({\n path: r.pattern,\n incidentCount: Array.isArray(r.value) ? r.value.length : 0,\n }))\n .sort((a, b) => b.incidentCount - a.incidentCount)\n .slice(0, limit);\n }\n\n timeLookup(path: string): number {\n const start = performance.now();\n this.getIncidents(path);\n return performance.now() - start;\n }\n\n toJSON(): object {\n return this.trie.toJSON();\n }\n\n private calculateConfidence(count: number): number {\n const capped = Math.min(count, 10);\n return Math.round((capped / 10) * 100) / 100; // 0-1 scale\n }\n\n private persist(): void {\n if (!this.persistPath) return;\n try {\n const dir = path.dirname(this.persistPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(this.persistPath, JSON.stringify(this.trie.toJSON()), 'utf-8');\n } catch {\n // Persistence is best-effort; ignore failures\n }\n }\n}\n"],"mappings":";;;;;;;;AAAA,OAAOA,WAAU;;;ACAjB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAkB5B,SAAS,cAAc,UAA0B;AAC/C,QAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAC9C,SAAO,WAAW,WAAW,IAAI,IAAI,WAAW,MAAM,CAAC,IAAI;AAC7D;AAEO,IAAM,eAAN,MAAmB;AAAA,EAChB,OAAiC,IAAI,KAAK;AAAA,EAC1C;AAAA,EAER,YAAY,aAAsB;AAChC,QAAI,YAAa,MAAK,cAAc;AACpC,QAAI,eAAe,GAAG,WAAW,WAAW,GAAG;AAC7C,UAAI;AACF,cAAM,MAAM,GAAG,aAAa,aAAa,OAAO;AAChD,YAAI,IAAI,KAAK,EAAE,SAAS,GAAG;AACzB,gBAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,eAAK,OAAO,KAAK,SAA6B,IAAI;AAAA,QACpD;AAAA,MACF,QAAQ;AACN,aAAK,OAAO,IAAI,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,UAAkB,UAAkC;AAC9D,UAAM,MAAM,cAAc,QAAQ;AAClC,UAAM,WAAW,KAAK,KAAK,OAAO,GAAG;AACrC,UAAM,YAAY,SAAS,SAAS,MAAM,QAAQ,SAAS,KAAK,IAAI,SAAS,QAAQ,CAAC;AACtF,cAAU,KAAK,QAAQ;AACvB,SAAK,KAAK,OAAO,KAAK,SAAS;AAC/B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,aAAa,UAAsC;AACjD,UAAM,MAAM,cAAc,QAAQ;AAClC,UAAM,SAAS,KAAK,KAAK,OAAO,GAAG;AACnC,WAAO,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,QAAQ,CAAC;AAAA,EACvE;AAAA,EAEA,sBAAsB,QAAoC;AACxD,UAAM,mBAAmB,cAAc,MAAM;AAC7C,UAAM,UAAU,KAAK,KAAK,cAAc,gBAAgB;AACxD,WAAO,QAAQ,QAAQ,CAAC,MAAO,MAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAE,EAAE,OAAO,OAAO;AAAA,EACvF;AAAA,EAEA,YAAY,WAA8B;AACxC,UAAM,UAAU,KAAK,KAAK,cAAc,EAAE;AAC1C,UAAM,QAAmB,CAAC;AAE1B,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAY,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC9D,UAAI,UAAU,UAAU,WAAW;AACjC,cAAM,KAAK;AAAA,UACT,MAAM,MAAM;AAAA,UACZ,eAAe,UAAU;AAAA,UACzB,YAAY,KAAK,oBAAoB,UAAU,MAAM;AAAA,QACvD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,gBAAgB,EAAE,aAAa;AAAA,EAC/D;AAAA,EAEA,aAAa,SAAiB,QAAQ,GAAmD;AACvF,UAAM,aAAa,cAAc,OAAO;AACxC,UAAM,UAAU,KAAK,KAAK,cAAc,UAAU;AAClD,WAAO,QACJ,IAAI,CAAC,OAAO;AAAA,MACX,MAAM,EAAE;AAAA,MACR,eAAe,MAAM,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,SAAS;AAAA,IAC3D,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAChD,MAAM,GAAG,KAAK;AAAA,EACnB;AAAA,EAEA,WAAWC,OAAsB;AAC/B,UAAM,QAAQ,YAAY,IAAI;AAC9B,SAAK,aAAaA,KAAI;AACtB,WAAO,YAAY,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,SAAiB;AACf,WAAO,KAAK,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEQ,oBAAoB,OAAuB;AACjD,UAAM,SAAS,KAAK,IAAI,OAAO,EAAE;AACjC,WAAO,KAAK,MAAO,SAAS,KAAM,GAAG,IAAI;AAAA,EAC3C;AAAA,EAEQ,UAAgB;AACtB,QAAI,CAAC,KAAK,YAAa;AACvB,QAAI;AACF,YAAM,MAAM,KAAK,QAAQ,KAAK,WAAW;AACzC,UAAI,CAAC,GAAG,WAAW,GAAG,GAAG;AACvB,WAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,MACvC;AACA,SAAG,cAAc,KAAK,aAAa,KAAK,UAAU,KAAK,KAAK,OAAO,CAAC,GAAG,OAAO;AAAA,IAChF,QAAQ;AAAA,IAER;AAAA,EACF;AACF;;;AD/GO,IAAM,gBAAN,MAAM,eAAc;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,OAAqB,aAAqB,SAAgC;AACpF,SAAK,QAAQ;AACb,SAAK,cAAc;AACnB,SAAK,OAAO,IAAI;AAAA,MACd,SAAS,eAAeC,MAAK,KAAK,iBAAiB,WAAW,GAAG,oBAAoB;AAAA,IACvF;AAAA,EACF;AAAA,EAEA,aAAa,MAAM,OAAqB,aAAqB,SAAwD;AACnH,UAAM,QAAQ,IAAI,eAAc,OAAO,aAAa,OAAO;AAC3D,UAAM,MAAM,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,QAAQ,MAAM,KAAK,MAAM,UAAU;AACzC,UAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAE3D,eAAW,YAAY,WAAW;AAChC,YAAM,QAAQ,MAAM,KAAK,oBAAoB,SAAS,EAAE;AACxD,WAAK,kBAAkB,UAAU,KAAK;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,kBAAkB,UAAwB,OAAuB;AAC/D,UAAM,OAAyB;AAAA,MAC7B,IAAI,SAAS;AAAA,MACb,MAAM;AAAA,MACN,aAAa,SAAS,KAAK;AAAA,MAC3B,UAAU,SAAS,KAAK;AAAA,MACxB,WAAW,SAAS,KAAK;AAAA,IAC3B;AAEA,eAAW,QAAQ,OAAO;AACxB,YAAM,aAAa,KAAK,cAAc,IAAI;AAC1C,WAAK,KAAK,YAAY,YAAY,EAAE,GAAG,MAAM,MAAM,WAAW,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,cAA4B;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,oBAAoB,YAAuC;AACvE,UAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAM,QAAQ,MAAM,KAAK,MAAM,SAAS,YAAY,MAAM;AAG1D,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,cAAc,KAAK,SAAS,UAAU;AAEtD,cAAM,WAAW,KAAK,SAAS,aAAa,KAAK,QAAQ,KAAK;AAC9D,cAAM,SAAS,MAAM,KAAK,MAAM,QAAQ,UAAU,QAAQ;AAC1D,YAAI,QAAQ,QAAQ,WAAW,OAAO,QAAQ,MAAM,QAAQ,OAAO,KAAK,KAAK,GAAG;AAC9E,UAAC,OAAO,KAAK,MAAmB,QAAQ,CAAC,MAAc,MAAM,IAAI,CAAC,CAAC;AAAA,QACrE;AAAA,MACF;AAGA,UAAI,KAAK,SAAS,WAAW;AAC3B,cAAM,WACH,MAAM,KAAK,MAAM,QAAQ,QAAQ,KAAK,KAAK,KAC3C,MAAM,KAAK,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAChD,YAAI,YAAY,OAAQ,SAAiB,MAAM,SAAS,UAAU;AAChE,gBAAM,IAAK,SAAiB,KAAK,IAAI;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA,EAEQ,cAAc,UAA0B;AAC9C,UAAM,WAAWA,MAAK,WAAW,QAAQ,IAAI,WAAWA,MAAK,KAAK,KAAK,aAAa,QAAQ;AAC5F,UAAM,WAAWA,MAAK,SAAS,KAAK,aAAa,QAAQ;AACzD,WAAO,SAAS,QAAQ,OAAO,GAAG;AAAA,EACpC;AACF;","names":["path","path","path"]}
|
package/dist/chunk-VUL52BQL.js
DELETED
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getTrieDirectory
|
|
3
|
-
} from "./chunk-VVITXIHN.js";
|
|
4
|
-
|
|
5
|
-
// src/context/graph.ts
|
|
6
|
-
import * as crypto from "crypto";
|
|
7
|
-
import * as path2 from "path";
|
|
8
|
-
|
|
9
|
-
// src/context/store.ts
|
|
10
|
-
import Database from "better-sqlite3";
|
|
11
|
-
import * as fs from "fs";
|
|
12
|
-
import * as path from "path";
|
|
13
|
-
var ContextStore = class {
|
|
14
|
-
db;
|
|
15
|
-
dbFilePath;
|
|
16
|
-
constructor(projectPath, dbFilePath) {
|
|
17
|
-
this.dbFilePath = dbFilePath ?? path.join(getTrieDirectory(projectPath), "context.db");
|
|
18
|
-
this.ensureDirectory();
|
|
19
|
-
this.db = new Database(this.dbFilePath);
|
|
20
|
-
this.configure();
|
|
21
|
-
this.prepareSchema();
|
|
22
|
-
}
|
|
23
|
-
get databasePath() {
|
|
24
|
-
return this.dbFilePath;
|
|
25
|
-
}
|
|
26
|
-
addNode(node) {
|
|
27
|
-
const stmt = this.db.prepare(
|
|
28
|
-
`INSERT INTO nodes (id, type, data, created_at, updated_at)
|
|
29
|
-
VALUES (@id, @type, @data, @created_at, @updated_at)`
|
|
30
|
-
);
|
|
31
|
-
stmt.run({
|
|
32
|
-
id: node.id,
|
|
33
|
-
type: node.type,
|
|
34
|
-
data: JSON.stringify(node.data),
|
|
35
|
-
created_at: node.created_at,
|
|
36
|
-
updated_at: node.updated_at
|
|
37
|
-
});
|
|
38
|
-
return node;
|
|
39
|
-
}
|
|
40
|
-
upsertNode(node) {
|
|
41
|
-
const stmt = this.db.prepare(
|
|
42
|
-
`INSERT INTO nodes (id, type, data, created_at, updated_at)
|
|
43
|
-
VALUES (@id, @type, @data, @created_at, @updated_at)
|
|
44
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
45
|
-
type=excluded.type,
|
|
46
|
-
data=excluded.data,
|
|
47
|
-
updated_at=excluded.updated_at`
|
|
48
|
-
);
|
|
49
|
-
stmt.run({
|
|
50
|
-
id: node.id,
|
|
51
|
-
type: node.type,
|
|
52
|
-
data: JSON.stringify(node.data),
|
|
53
|
-
created_at: node.created_at,
|
|
54
|
-
updated_at: node.updated_at
|
|
55
|
-
});
|
|
56
|
-
return node;
|
|
57
|
-
}
|
|
58
|
-
getNode(id) {
|
|
59
|
-
const row = this.db.prepare("SELECT * FROM nodes WHERE id = ?").get(id);
|
|
60
|
-
return row ? this.mapNodeRow(row) : null;
|
|
61
|
-
}
|
|
62
|
-
getNodeByType(type, id) {
|
|
63
|
-
const row = this.db.prepare("SELECT * FROM nodes WHERE id = ? AND type = ?").get(id, type);
|
|
64
|
-
return row ? this.mapNodeRow(row) : null;
|
|
65
|
-
}
|
|
66
|
-
updateNode(id, updates, updatedAt) {
|
|
67
|
-
const existing = this.getNode(id);
|
|
68
|
-
if (!existing) {
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
const merged = {
|
|
72
|
-
...existing,
|
|
73
|
-
data: { ...existing.data, ...updates },
|
|
74
|
-
updated_at: updatedAt
|
|
75
|
-
};
|
|
76
|
-
this.db.prepare(
|
|
77
|
-
`UPDATE nodes SET data = @data, updated_at = @updated_at
|
|
78
|
-
WHERE id = @id`
|
|
79
|
-
).run({
|
|
80
|
-
id,
|
|
81
|
-
data: JSON.stringify(merged.data),
|
|
82
|
-
updated_at: merged.updated_at
|
|
83
|
-
});
|
|
84
|
-
return merged;
|
|
85
|
-
}
|
|
86
|
-
deleteNode(id) {
|
|
87
|
-
const deleteEdges = this.db.prepare("DELETE FROM edges WHERE from_id = ? OR to_id = ?");
|
|
88
|
-
const deleteNodeStmt = this.db.prepare("DELETE FROM nodes WHERE id = ?");
|
|
89
|
-
const transaction = this.db.transaction((nodeId) => {
|
|
90
|
-
deleteEdges.run(nodeId, nodeId);
|
|
91
|
-
deleteNodeStmt.run(nodeId);
|
|
92
|
-
});
|
|
93
|
-
transaction(id);
|
|
94
|
-
}
|
|
95
|
-
listNodes() {
|
|
96
|
-
const rows = this.db.prepare("SELECT * FROM nodes").all();
|
|
97
|
-
return rows.map((row) => this.mapNodeRow(row));
|
|
98
|
-
}
|
|
99
|
-
findNodesByType(type) {
|
|
100
|
-
const rows = this.db.prepare("SELECT * FROM nodes WHERE type = ?").all(type);
|
|
101
|
-
return rows.map((row) => this.mapNodeRow(row));
|
|
102
|
-
}
|
|
103
|
-
addEdge(edge) {
|
|
104
|
-
const stmt = this.db.prepare(
|
|
105
|
-
`INSERT INTO edges (id, from_id, to_id, type, weight, metadata, created_at)
|
|
106
|
-
VALUES (@id, @from_id, @to_id, @type, @weight, @metadata, @created_at)`
|
|
107
|
-
);
|
|
108
|
-
stmt.run({
|
|
109
|
-
id: edge.id,
|
|
110
|
-
from_id: edge.from_id,
|
|
111
|
-
to_id: edge.to_id,
|
|
112
|
-
type: edge.type,
|
|
113
|
-
weight: edge.weight,
|
|
114
|
-
metadata: JSON.stringify(edge.metadata ?? {}),
|
|
115
|
-
created_at: edge.created_at
|
|
116
|
-
});
|
|
117
|
-
return edge;
|
|
118
|
-
}
|
|
119
|
-
upsertEdge(edge) {
|
|
120
|
-
const stmt = this.db.prepare(
|
|
121
|
-
`INSERT INTO edges (id, from_id, to_id, type, weight, metadata, created_at)
|
|
122
|
-
VALUES (@id, @from_id, @to_id, @type, @weight, @metadata, @created_at)
|
|
123
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
124
|
-
from_id=excluded.from_id,
|
|
125
|
-
to_id=excluded.to_id,
|
|
126
|
-
type=excluded.type,
|
|
127
|
-
weight=excluded.weight,
|
|
128
|
-
metadata=excluded.metadata`
|
|
129
|
-
);
|
|
130
|
-
stmt.run({
|
|
131
|
-
id: edge.id,
|
|
132
|
-
from_id: edge.from_id,
|
|
133
|
-
to_id: edge.to_id,
|
|
134
|
-
type: edge.type,
|
|
135
|
-
weight: edge.weight,
|
|
136
|
-
metadata: JSON.stringify(edge.metadata ?? {}),
|
|
137
|
-
created_at: edge.created_at
|
|
138
|
-
});
|
|
139
|
-
return edge;
|
|
140
|
-
}
|
|
141
|
-
getEdge(id) {
|
|
142
|
-
const row = this.db.prepare("SELECT * FROM edges WHERE id = ?").get(id);
|
|
143
|
-
return row ? this.mapEdgeRow(row) : null;
|
|
144
|
-
}
|
|
145
|
-
getEdges(nodeId, direction = "both") {
|
|
146
|
-
let rows;
|
|
147
|
-
if (direction === "in") {
|
|
148
|
-
rows = this.db.prepare("SELECT * FROM edges WHERE to_id = ?").all(nodeId);
|
|
149
|
-
} else if (direction === "out") {
|
|
150
|
-
rows = this.db.prepare("SELECT * FROM edges WHERE from_id = ?").all(nodeId);
|
|
151
|
-
} else {
|
|
152
|
-
rows = this.db.prepare("SELECT * FROM edges WHERE from_id = ? OR to_id = ?").all(nodeId, nodeId);
|
|
153
|
-
}
|
|
154
|
-
return rows.map((row) => this.mapEdgeRow(row));
|
|
155
|
-
}
|
|
156
|
-
listEdges() {
|
|
157
|
-
const rows = this.db.prepare("SELECT * FROM edges").all();
|
|
158
|
-
return rows.map((row) => this.mapEdgeRow(row));
|
|
159
|
-
}
|
|
160
|
-
deleteEdge(id) {
|
|
161
|
-
this.db.prepare("DELETE FROM edges WHERE id = ?").run(id);
|
|
162
|
-
}
|
|
163
|
-
close() {
|
|
164
|
-
this.db.close();
|
|
165
|
-
}
|
|
166
|
-
ensureDirectory() {
|
|
167
|
-
fs.mkdirSync(path.dirname(this.dbFilePath), { recursive: true });
|
|
168
|
-
}
|
|
169
|
-
configure() {
|
|
170
|
-
this.db.pragma("journal_mode = WAL");
|
|
171
|
-
this.db.pragma("busy_timeout = 5000");
|
|
172
|
-
this.db.pragma("synchronous = NORMAL");
|
|
173
|
-
}
|
|
174
|
-
prepareSchema() {
|
|
175
|
-
this.db.exec(`
|
|
176
|
-
CREATE TABLE IF NOT EXISTS nodes (
|
|
177
|
-
id TEXT PRIMARY KEY,
|
|
178
|
-
type TEXT NOT NULL,
|
|
179
|
-
data TEXT NOT NULL,
|
|
180
|
-
created_at TEXT NOT NULL,
|
|
181
|
-
updated_at TEXT NOT NULL
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
CREATE TABLE IF NOT EXISTS edges (
|
|
185
|
-
id TEXT PRIMARY KEY,
|
|
186
|
-
from_id TEXT NOT NULL,
|
|
187
|
-
to_id TEXT NOT NULL,
|
|
188
|
-
type TEXT NOT NULL,
|
|
189
|
-
weight REAL NOT NULL DEFAULT 1,
|
|
190
|
-
metadata TEXT DEFAULT '{}',
|
|
191
|
-
created_at TEXT NOT NULL
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
CREATE INDEX IF NOT EXISTS idx_nodes_type ON nodes(type);
|
|
195
|
-
CREATE INDEX IF NOT EXISTS idx_edges_from ON edges(from_id);
|
|
196
|
-
CREATE INDEX IF NOT EXISTS idx_edges_to ON edges(to_id);
|
|
197
|
-
CREATE INDEX IF NOT EXISTS idx_edges_type ON edges(type);
|
|
198
|
-
`);
|
|
199
|
-
}
|
|
200
|
-
mapNodeRow(row) {
|
|
201
|
-
return {
|
|
202
|
-
id: row.id,
|
|
203
|
-
type: row.type,
|
|
204
|
-
data: JSON.parse(row.data),
|
|
205
|
-
created_at: row.created_at,
|
|
206
|
-
updated_at: row.updated_at
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
mapEdgeRow(row) {
|
|
210
|
-
return {
|
|
211
|
-
id: row.id,
|
|
212
|
-
from_id: row.from_id,
|
|
213
|
-
to_id: row.to_id,
|
|
214
|
-
type: row.type,
|
|
215
|
-
weight: row.weight,
|
|
216
|
-
created_at: row.created_at,
|
|
217
|
-
metadata: row.metadata ? JSON.parse(row.metadata) : {}
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
|
|
222
|
-
// src/context/graph.ts
|
|
223
|
-
var ContextGraph = class {
|
|
224
|
-
store;
|
|
225
|
-
projectPath;
|
|
226
|
-
constructor(projectPath, dbPath, store) {
|
|
227
|
-
this.projectPath = projectPath;
|
|
228
|
-
this.store = store ?? new ContextStore(projectPath, dbPath);
|
|
229
|
-
}
|
|
230
|
-
get projectRoot() {
|
|
231
|
-
return this.projectPath;
|
|
232
|
-
}
|
|
233
|
-
async addNode(type, data) {
|
|
234
|
-
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
235
|
-
const id = this.generateNodeId(type, data);
|
|
236
|
-
const node = {
|
|
237
|
-
id,
|
|
238
|
-
type,
|
|
239
|
-
data,
|
|
240
|
-
created_at: now,
|
|
241
|
-
updated_at: now
|
|
242
|
-
};
|
|
243
|
-
this.store.addNode(node);
|
|
244
|
-
return node;
|
|
245
|
-
}
|
|
246
|
-
async getNode(type, id) {
|
|
247
|
-
return this.store.getNodeByType(type, id);
|
|
248
|
-
}
|
|
249
|
-
async updateNode(type, id, updates) {
|
|
250
|
-
const updated = this.store.updateNode(id, updates, (/* @__PURE__ */ new Date()).toISOString());
|
|
251
|
-
if (updated && updated.type !== type) {
|
|
252
|
-
throw new Error(`Type mismatch for node ${id}: expected ${type} but found ${updated.type}`);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
async deleteNode(_type, id) {
|
|
256
|
-
this.store.deleteNode(id);
|
|
257
|
-
}
|
|
258
|
-
async addEdge(fromId, toId, type, metadata = {}, weight = 1) {
|
|
259
|
-
const edge = {
|
|
260
|
-
id: crypto.randomUUID(),
|
|
261
|
-
from_id: fromId,
|
|
262
|
-
to_id: toId,
|
|
263
|
-
type,
|
|
264
|
-
weight,
|
|
265
|
-
metadata,
|
|
266
|
-
created_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
267
|
-
};
|
|
268
|
-
this.store.addEdge(edge);
|
|
269
|
-
return edge;
|
|
270
|
-
}
|
|
271
|
-
async getEdges(nodeId, direction = "both") {
|
|
272
|
-
return this.store.getEdges(nodeId, direction);
|
|
273
|
-
}
|
|
274
|
-
async getIncidentsForFile(filePath) {
|
|
275
|
-
const fileNode = this.findFileNode(filePath);
|
|
276
|
-
if (!fileNode) return [];
|
|
277
|
-
const incidents = /* @__PURE__ */ new Map();
|
|
278
|
-
const affectEdges = this.store.getEdges(fileNode.id, "in").filter((edge) => edge.type === "affects");
|
|
279
|
-
for (const edge of affectEdges) {
|
|
280
|
-
const changeId = edge.from_id;
|
|
281
|
-
const leadEdges = this.store.getEdges(changeId, "out").filter((e) => e.type === "leadTo");
|
|
282
|
-
const causedByEdges = this.store.getEdges(changeId, "in").filter((e) => e.type === "causedBy");
|
|
283
|
-
for (const le of leadEdges) {
|
|
284
|
-
const incident = this.store.getNodeByType("incident", le.to_id);
|
|
285
|
-
if (incident) incidents.set(incident.id, incident);
|
|
286
|
-
}
|
|
287
|
-
for (const ce of causedByEdges) {
|
|
288
|
-
const incident = this.store.getNodeByType("incident", ce.from_id);
|
|
289
|
-
if (incident) incidents.set(incident.id, incident);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
return Array.from(incidents.values());
|
|
293
|
-
}
|
|
294
|
-
async getPatternsForFile(filePath) {
|
|
295
|
-
const normalized = this.normalizePath(filePath);
|
|
296
|
-
const nodes = this.store.findNodesByType("pattern");
|
|
297
|
-
return nodes.filter(
|
|
298
|
-
(node) => node.data.appliesTo.some((pattern) => normalized.includes(pattern) || filePath.includes(pattern))
|
|
299
|
-
);
|
|
300
|
-
}
|
|
301
|
-
async getRecentChanges(limit) {
|
|
302
|
-
const nodes = this.store.findNodesByType("change");
|
|
303
|
-
return nodes.sort((a, b) => new Date(b.data.timestamp).getTime() - new Date(a.data.timestamp).getTime()).slice(0, limit);
|
|
304
|
-
}
|
|
305
|
-
async calculateFileRisk(filePath) {
|
|
306
|
-
const fileNode = this.findFileNode(filePath);
|
|
307
|
-
if (!fileNode) return "low";
|
|
308
|
-
const incidentScore = Math.min(fileNode.data.incidentCount * 2, 6);
|
|
309
|
-
const changeScore = Math.min(fileNode.data.changeCount, 4);
|
|
310
|
-
const baseScore = this.riskLevelToScore(fileNode.data.riskLevel);
|
|
311
|
-
const total = baseScore + incidentScore + changeScore;
|
|
312
|
-
if (total >= 10) return "critical";
|
|
313
|
-
if (total >= 7) return "high";
|
|
314
|
-
if (total >= 4) return "medium";
|
|
315
|
-
return "low";
|
|
316
|
-
}
|
|
317
|
-
async listNodes() {
|
|
318
|
-
return this.store.listNodes();
|
|
319
|
-
}
|
|
320
|
-
async listEdges() {
|
|
321
|
-
return this.store.listEdges();
|
|
322
|
-
}
|
|
323
|
-
async deleteEdge(id) {
|
|
324
|
-
this.store.deleteEdge(id);
|
|
325
|
-
}
|
|
326
|
-
async getSnapshot() {
|
|
327
|
-
return {
|
|
328
|
-
nodes: this.store.listNodes(),
|
|
329
|
-
edges: this.store.listEdges(),
|
|
330
|
-
exported_at: (/* @__PURE__ */ new Date()).toISOString()
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
async applySnapshot(snapshot) {
|
|
334
|
-
for (const node of snapshot.nodes) {
|
|
335
|
-
const existing = this.store.getNode(node.id);
|
|
336
|
-
if (!existing || this.isNewer(node.updated_at, existing.updated_at)) {
|
|
337
|
-
this.store.upsertNode(node);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
for (const edge of snapshot.edges) {
|
|
341
|
-
const existing = this.store.getEdge(edge.id);
|
|
342
|
-
if (!existing) {
|
|
343
|
-
this.store.upsertEdge(edge);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
generateNodeId(type, data) {
|
|
348
|
-
if (type === "file") {
|
|
349
|
-
const fileData = data;
|
|
350
|
-
return this.normalizePath(fileData.path);
|
|
351
|
-
}
|
|
352
|
-
if (type === "change") {
|
|
353
|
-
const changeData = data;
|
|
354
|
-
if (changeData.commitHash) {
|
|
355
|
-
return changeData.commitHash;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
if (type === "linear-ticket") {
|
|
359
|
-
const ticketData = data;
|
|
360
|
-
return `linear:${ticketData.ticketId}`;
|
|
361
|
-
}
|
|
362
|
-
if (type === "pull-request") {
|
|
363
|
-
const prData = data;
|
|
364
|
-
return `pr:${prData.prNumber}`;
|
|
365
|
-
}
|
|
366
|
-
if (type === "github-issue") {
|
|
367
|
-
const issueData = data;
|
|
368
|
-
return `gh-issue:${issueData.issueNumber}`;
|
|
369
|
-
}
|
|
370
|
-
return crypto.randomUUID();
|
|
371
|
-
}
|
|
372
|
-
findFileNode(filePath) {
|
|
373
|
-
const normalized = this.normalizePath(filePath);
|
|
374
|
-
const nodes = this.store.findNodesByType("file");
|
|
375
|
-
return nodes.find(
|
|
376
|
-
(node) => node.id === normalized || this.normalizePath(node.data.path) === normalized || node.data.path === filePath
|
|
377
|
-
) ?? null;
|
|
378
|
-
}
|
|
379
|
-
normalizePath(filePath) {
|
|
380
|
-
return path2.resolve(this.projectPath, filePath);
|
|
381
|
-
}
|
|
382
|
-
riskLevelToScore(level) {
|
|
383
|
-
switch (level) {
|
|
384
|
-
case "critical":
|
|
385
|
-
return 6;
|
|
386
|
-
case "high":
|
|
387
|
-
return 4;
|
|
388
|
-
case "medium":
|
|
389
|
-
return 2;
|
|
390
|
-
default:
|
|
391
|
-
return 0;
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
isNewer(incoming, existing) {
|
|
395
|
-
return new Date(incoming).getTime() >= new Date(existing).getTime();
|
|
396
|
-
}
|
|
397
|
-
};
|
|
398
|
-
|
|
399
|
-
export {
|
|
400
|
-
ContextGraph
|
|
401
|
-
};
|
|
402
|
-
//# sourceMappingURL=chunk-VUL52BQL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/graph.ts","../src/context/store.ts"],"sourcesContent":["import * as crypto from 'node:crypto';\nimport * as path from 'node:path';\n\nimport type { RiskLevel } from '../types/index.js';\nimport { ContextStore } from './store.js';\nimport type {\n ChangeNode,\n ChangeNodeData,\n ContextSnapshot,\n DecisionNode,\n DecisionNodeData,\n Edge,\n EdgeDirection,\n EdgeType,\n FileNode,\n FileNodeData,\n FixNode,\n FixNodeData,\n GitHubIssueNode,\n GitHubIssueNodeData,\n IncidentNode,\n IncidentNodeData,\n IssueNode,\n IssueNodeData,\n LinearTicketNode,\n LinearTicketNodeData,\n Node,\n NodeData,\n NodeType,\n PatternNode,\n PatternNodeData,\n PullRequestNode,\n PullRequestNodeData\n} from './types.js';\n\nexport class ContextGraph {\n private readonly store: ContextStore;\n private readonly projectPath: string;\n\n constructor(projectPath: string, dbPath?: string, store?: ContextStore) {\n this.projectPath = projectPath;\n this.store = store ?? new ContextStore(projectPath, dbPath);\n }\n\n get projectRoot(): string {\n return this.projectPath;\n }\n\n async addNode(type: 'file', data: FileNodeData): Promise<FileNode>;\n async addNode(type: 'change', data: ChangeNodeData): Promise<ChangeNode>;\n async addNode(type: 'incident', data: IncidentNodeData): Promise<IncidentNode>;\n async addNode(type: 'issue', data: IssueNodeData): Promise<IssueNode>;\n async addNode(type: 'pattern', data: PatternNodeData): Promise<PatternNode>;\n async addNode(type: 'fix', data: FixNodeData): Promise<FixNode>;\n async addNode(type: 'decision', data: DecisionNodeData): Promise<DecisionNode>;\n async addNode(type: 'linear-ticket', data: LinearTicketNodeData): Promise<LinearTicketNode>;\n async addNode(type: 'pull-request', data: PullRequestNodeData): Promise<PullRequestNode>;\n async addNode(type: 'github-issue', data: GitHubIssueNodeData): Promise<GitHubIssueNode>;\n async addNode(type: NodeType, data: NodeData): Promise<Node> {\n const now = new Date().toISOString();\n const id = this.generateNodeId(type, data);\n const node = {\n id,\n type,\n data,\n created_at: now,\n updated_at: now\n } as Node;\n\n this.store.addNode(node);\n return node;\n }\n\n async getNode(type: NodeType, id: string): Promise<Node | null> {\n return this.store.getNodeByType(type, id);\n }\n\n async updateNode(type: NodeType, id: string, updates: Partial<NodeData>): Promise<void> {\n const updated = this.store.updateNode(id, updates, new Date().toISOString());\n if (updated && updated.type !== type) {\n throw new Error(`Type mismatch for node ${id}: expected ${type} but found ${updated.type}`);\n }\n }\n\n async deleteNode(_type: NodeType, id: string): Promise<void> {\n this.store.deleteNode(id);\n }\n\n async addEdge(\n fromId: string,\n toId: string,\n type: EdgeType,\n metadata: Record<string, unknown> = {},\n weight = 1\n ): Promise<Edge> {\n const edge: Edge = {\n id: crypto.randomUUID(),\n from_id: fromId,\n to_id: toId,\n type,\n weight,\n metadata,\n created_at: new Date().toISOString()\n };\n\n this.store.addEdge(edge);\n return edge;\n }\n\n async getEdges(nodeId: string, direction: EdgeDirection = 'both'): Promise<Edge[]> {\n return this.store.getEdges(nodeId, direction);\n }\n\n async getIncidentsForFile(filePath: string): Promise<IncidentNode[]> {\n const fileNode = this.findFileNode(filePath);\n if (!fileNode) return [];\n\n const incidents = new Map<string, IncidentNode>();\n\n const affectEdges = this.store.getEdges(fileNode.id, 'in').filter((edge) => edge.type === 'affects');\n for (const edge of affectEdges) {\n const changeId = edge.from_id;\n const leadEdges = this.store.getEdges(changeId, 'out').filter((e) => e.type === 'leadTo');\n const causedByEdges = this.store.getEdges(changeId, 'in').filter((e) => e.type === 'causedBy');\n\n for (const le of leadEdges) {\n const incident = this.store.getNodeByType('incident', le.to_id);\n if (incident) incidents.set(incident.id, incident as IncidentNode);\n }\n\n for (const ce of causedByEdges) {\n const incident = this.store.getNodeByType('incident', ce.from_id);\n if (incident) incidents.set(incident.id, incident as IncidentNode);\n }\n }\n\n return Array.from(incidents.values());\n }\n\n async getPatternsForFile(filePath: string): Promise<PatternNode[]> {\n const normalized = this.normalizePath(filePath);\n const nodes = this.store.findNodesByType('pattern') as PatternNode[];\n\n return nodes.filter((node) =>\n node.data.appliesTo.some((pattern) => normalized.includes(pattern) || filePath.includes(pattern))\n );\n }\n\n async getRecentChanges(limit: number): Promise<ChangeNode[]> {\n const nodes = this.store.findNodesByType('change') as ChangeNode[];\n return nodes\n .sort((a, b) => new Date(b.data.timestamp).getTime() - new Date(a.data.timestamp).getTime())\n .slice(0, limit);\n }\n\n async calculateFileRisk(filePath: string): Promise<RiskLevel> {\n const fileNode = this.findFileNode(filePath);\n if (!fileNode) return 'low';\n\n // Simple heuristic based on incidents and changes\n const incidentScore = Math.min(fileNode.data.incidentCount * 2, 6);\n const changeScore = Math.min(fileNode.data.changeCount, 4);\n const baseScore = this.riskLevelToScore(fileNode.data.riskLevel);\n const total = baseScore + incidentScore + changeScore;\n\n if (total >= 10) return 'critical';\n if (total >= 7) return 'high';\n if (total >= 4) return 'medium';\n return 'low';\n }\n\n async listNodes(): Promise<Node[]> {\n return this.store.listNodes();\n }\n\n async listEdges(): Promise<Edge[]> {\n return this.store.listEdges();\n }\n\n async deleteEdge(id: string): Promise<void> {\n this.store.deleteEdge(id);\n }\n\n async getSnapshot(): Promise<ContextSnapshot> {\n return {\n nodes: this.store.listNodes(),\n edges: this.store.listEdges(),\n exported_at: new Date().toISOString()\n };\n }\n\n async applySnapshot(snapshot: ContextSnapshot): Promise<void> {\n for (const node of snapshot.nodes) {\n const existing = this.store.getNode(node.id);\n if (!existing || this.isNewer(node.updated_at, existing.updated_at)) {\n this.store.upsertNode(node);\n }\n }\n\n for (const edge of snapshot.edges) {\n const existing = this.store.getEdge(edge.id);\n if (!existing) {\n this.store.upsertEdge(edge);\n }\n }\n }\n\n private generateNodeId(type: NodeType, data: NodeData): string {\n if (type === 'file') {\n const fileData = data as FileNodeData;\n return this.normalizePath(fileData.path);\n }\n\n if (type === 'change') {\n const changeData = data as ChangeNodeData;\n if (changeData.commitHash) {\n return changeData.commitHash;\n }\n }\n\n if (type === 'linear-ticket') {\n const ticketData = data as LinearTicketNodeData;\n return `linear:${ticketData.ticketId}`;\n }\n\n if (type === 'pull-request') {\n const prData = data as PullRequestNodeData;\n return `pr:${prData.prNumber}`;\n }\n\n if (type === 'github-issue') {\n const issueData = data as GitHubIssueNodeData;\n return `gh-issue:${issueData.issueNumber}`;\n }\n\n return crypto.randomUUID();\n }\n\n private findFileNode(filePath: string): FileNode | null {\n const normalized = this.normalizePath(filePath);\n const nodes = this.store.findNodesByType('file') as FileNode[];\n return (\n nodes.find(\n (node) =>\n node.id === normalized ||\n this.normalizePath(node.data.path) === normalized ||\n node.data.path === filePath\n ) ?? null\n );\n }\n\n private normalizePath(filePath: string): string {\n return path.resolve(this.projectPath, filePath);\n }\n\n private riskLevelToScore(level: RiskLevel): number {\n switch (level) {\n case 'critical':\n return 6;\n case 'high':\n return 4;\n case 'medium':\n return 2;\n default:\n return 0;\n }\n }\n\n private isNewer(incoming: string, existing: string): boolean {\n return new Date(incoming).getTime() >= new Date(existing).getTime();\n }\n}\n","import Database, { type Database as DatabaseType } from 'better-sqlite3';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { getTrieDirectory } from '../utils/workspace.js';\n\nimport type { Edge, EdgeDirection, EdgeType, Node, NodeData, NodeType } from './types.js';\n\ntype NodeRow = {\n id: string;\n type: NodeType;\n data: string;\n created_at: string;\n updated_at: string;\n};\n\ntype EdgeRow = {\n id: string;\n from_id: string;\n to_id: string;\n type: EdgeType;\n weight: number;\n metadata: string | null;\n created_at: string;\n};\n\nexport class ContextStore {\n private db: DatabaseType;\n private readonly dbFilePath: string;\n\n constructor(projectPath: string, dbFilePath?: string) {\n this.dbFilePath = dbFilePath ?? path.join(getTrieDirectory(projectPath), 'context.db');\n this.ensureDirectory();\n\n this.db = new Database(this.dbFilePath);\n this.configure();\n this.prepareSchema();\n }\n\n get databasePath(): string {\n return this.dbFilePath;\n }\n\n addNode(node: Node): Node {\n const stmt = this.db.prepare(\n `INSERT INTO nodes (id, type, data, created_at, updated_at)\n VALUES (@id, @type, @data, @created_at, @updated_at)`\n );\n\n stmt.run({\n id: node.id,\n type: node.type,\n data: JSON.stringify(node.data),\n created_at: node.created_at,\n updated_at: node.updated_at\n });\n\n return node;\n }\n\n upsertNode(node: Node): Node {\n const stmt = this.db.prepare(\n `INSERT INTO nodes (id, type, data, created_at, updated_at)\n VALUES (@id, @type, @data, @created_at, @updated_at)\n ON CONFLICT(id) DO UPDATE SET\n type=excluded.type,\n data=excluded.data,\n updated_at=excluded.updated_at`\n );\n\n stmt.run({\n id: node.id,\n type: node.type,\n data: JSON.stringify(node.data),\n created_at: node.created_at,\n updated_at: node.updated_at\n });\n\n return node;\n }\n\n getNode(id: string): Node | null {\n const row = this.db.prepare('SELECT * FROM nodes WHERE id = ?').get(id) as NodeRow | undefined;\n return row ? this.mapNodeRow(row) : null;\n }\n\n getNodeByType(type: NodeType, id: string): Node | null {\n const row = this.db\n .prepare('SELECT * FROM nodes WHERE id = ? AND type = ?')\n .get(id, type) as NodeRow | undefined;\n return row ? this.mapNodeRow(row) : null;\n }\n\n updateNode(id: string, updates: Partial<NodeData>, updatedAt: string): Node | null {\n const existing = this.getNode(id);\n if (!existing) {\n return null;\n }\n\n const merged = {\n ...existing,\n data: { ...existing.data, ...updates },\n updated_at: updatedAt\n } as Node;\n\n this.db\n .prepare(\n `UPDATE nodes SET data = @data, updated_at = @updated_at\n WHERE id = @id`\n )\n .run({\n id,\n data: JSON.stringify(merged.data),\n updated_at: merged.updated_at\n });\n\n return merged;\n }\n\n deleteNode(id: string): void {\n const deleteEdges = this.db.prepare('DELETE FROM edges WHERE from_id = ? OR to_id = ?');\n const deleteNodeStmt = this.db.prepare('DELETE FROM nodes WHERE id = ?');\n\n const transaction = this.db.transaction((nodeId: string) => {\n deleteEdges.run(nodeId, nodeId);\n deleteNodeStmt.run(nodeId);\n });\n\n transaction(id);\n }\n\n listNodes(): Node[] {\n const rows = this.db.prepare('SELECT * FROM nodes').all() as NodeRow[];\n return rows.map((row) => this.mapNodeRow(row));\n }\n\n findNodesByType(type: NodeType): Node[] {\n const rows = this.db.prepare('SELECT * FROM nodes WHERE type = ?').all(type) as NodeRow[];\n return rows.map((row) => this.mapNodeRow(row));\n }\n\n addEdge(edge: Edge): Edge {\n const stmt = this.db.prepare(\n `INSERT INTO edges (id, from_id, to_id, type, weight, metadata, created_at)\n VALUES (@id, @from_id, @to_id, @type, @weight, @metadata, @created_at)`\n );\n\n stmt.run({\n id: edge.id,\n from_id: edge.from_id,\n to_id: edge.to_id,\n type: edge.type,\n weight: edge.weight,\n metadata: JSON.stringify(edge.metadata ?? {}),\n created_at: edge.created_at\n });\n\n return edge;\n }\n\n upsertEdge(edge: Edge): Edge {\n const stmt = this.db.prepare(\n `INSERT INTO edges (id, from_id, to_id, type, weight, metadata, created_at)\n VALUES (@id, @from_id, @to_id, @type, @weight, @metadata, @created_at)\n ON CONFLICT(id) DO UPDATE SET\n from_id=excluded.from_id,\n to_id=excluded.to_id,\n type=excluded.type,\n weight=excluded.weight,\n metadata=excluded.metadata`\n );\n\n stmt.run({\n id: edge.id,\n from_id: edge.from_id,\n to_id: edge.to_id,\n type: edge.type,\n weight: edge.weight,\n metadata: JSON.stringify(edge.metadata ?? {}),\n created_at: edge.created_at\n });\n\n return edge;\n }\n\n getEdge(id: string): Edge | null {\n const row = this.db.prepare('SELECT * FROM edges WHERE id = ?').get(id) as EdgeRow | undefined;\n return row ? this.mapEdgeRow(row) : null;\n }\n\n getEdges(nodeId: string, direction: EdgeDirection = 'both'): Edge[] {\n let rows: EdgeRow[];\n\n if (direction === 'in') {\n rows = this.db.prepare('SELECT * FROM edges WHERE to_id = ?').all(nodeId) as EdgeRow[];\n } else if (direction === 'out') {\n rows = this.db.prepare('SELECT * FROM edges WHERE from_id = ?').all(nodeId) as EdgeRow[];\n } else {\n rows = this.db\n .prepare('SELECT * FROM edges WHERE from_id = ? OR to_id = ?')\n .all(nodeId, nodeId) as EdgeRow[];\n }\n\n return rows.map((row) => this.mapEdgeRow(row));\n }\n\n listEdges(): Edge[] {\n const rows = this.db.prepare('SELECT * FROM edges').all() as EdgeRow[];\n return rows.map((row) => this.mapEdgeRow(row));\n }\n\n deleteEdge(id: string): void {\n this.db.prepare('DELETE FROM edges WHERE id = ?').run(id);\n }\n\n close(): void {\n this.db.close();\n }\n\n private ensureDirectory(): void {\n fs.mkdirSync(path.dirname(this.dbFilePath), { recursive: true });\n }\n\n private configure(): void {\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('busy_timeout = 5000');\n this.db.pragma('synchronous = NORMAL');\n }\n\n private prepareSchema(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS nodes (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n data TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS edges (\n id TEXT PRIMARY KEY,\n from_id TEXT NOT NULL,\n to_id TEXT NOT NULL,\n type TEXT NOT NULL,\n weight REAL NOT NULL DEFAULT 1,\n metadata TEXT DEFAULT '{}',\n created_at TEXT NOT NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_nodes_type ON nodes(type);\n CREATE INDEX IF NOT EXISTS idx_edges_from ON edges(from_id);\n CREATE INDEX IF NOT EXISTS idx_edges_to ON edges(to_id);\n CREATE INDEX IF NOT EXISTS idx_edges_type ON edges(type);\n `);\n }\n\n private mapNodeRow(row: NodeRow): Node {\n return {\n id: row.id,\n type: row.type,\n data: JSON.parse(row.data),\n created_at: row.created_at,\n updated_at: row.updated_at\n } as Node;\n }\n\n private mapEdgeRow(row: EdgeRow): Edge {\n return {\n id: row.id,\n from_id: row.from_id,\n to_id: row.to_id,\n type: row.type,\n weight: row.weight,\n created_at: row.created_at,\n metadata: row.metadata ? (JSON.parse(row.metadata) as Record<string, unknown>) : {}\n };\n }\n}\n"],"mappings":"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","names":["path"]}
|