@triedotdev/mcp 1.0.169 → 1.0.171
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 +62 -540
- 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 -3098
- package/dist/cli/main.js.map +1 -1
- package/dist/index.js +2 -34
- package/dist/index.js.map +1 -1
- package/dist/server/mcp-server.js +2 -34
- 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-3XR6WVAW.js +0 -4011
- package/dist/chunk-3XR6WVAW.js.map +0 -1
- package/dist/chunk-43X6JBEM.js +0 -36
- package/dist/chunk-43X6JBEM.js.map +0 -1
- package/dist/chunk-6NLHFIYA.js +0 -344
- package/dist/chunk-6NLHFIYA.js.map +0 -1
- package/dist/chunk-7IO4YUI3.js +0 -1827
- package/dist/chunk-7IO4YUI3.js.map +0 -1
- package/dist/chunk-AHD2CBQ7.js +0 -846
- package/dist/chunk-AHD2CBQ7.js.map +0 -1
- package/dist/chunk-BUTOP5EB.js +0 -931
- package/dist/chunk-BUTOP5EB.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-FBNURWRY.js +0 -662
- package/dist/chunk-FBNURWRY.js.map +0 -1
- package/dist/chunk-FQ45QP5A.js +0 -361
- package/dist/chunk-FQ45QP5A.js.map +0 -1
- package/dist/chunk-FVRO5RN3.js +0 -1306
- package/dist/chunk-FVRO5RN3.js.map +0 -1
- package/dist/chunk-G2TGF6TR.js +0 -573
- package/dist/chunk-G2TGF6TR.js.map +0 -1
- package/dist/chunk-G3I7SZLW.js +0 -354
- package/dist/chunk-G3I7SZLW.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-I2O5OYQT.js +0 -727
- package/dist/chunk-I2O5OYQT.js.map +0 -1
- package/dist/chunk-JVMBCWKS.js +0 -348
- package/dist/chunk-JVMBCWKS.js.map +0 -1
- package/dist/chunk-KCUOWRPX.js +0 -816
- package/dist/chunk-KCUOWRPX.js.map +0 -1
- package/dist/chunk-KDHN2ZQE.js +0 -313
- package/dist/chunk-KDHN2ZQE.js.map +0 -1
- package/dist/chunk-ME2OERF5.js +0 -345
- package/dist/chunk-ME2OERF5.js.map +0 -1
- package/dist/chunk-OBQ74FOU.js +0 -27
- package/dist/chunk-OBQ74FOU.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-SASNMSB5.js +0 -12597
- package/dist/chunk-SASNMSB5.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-XPZZFPBZ.js +0 -491
- package/dist/chunk-XPZZFPBZ.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 -421
- 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-3GCCZMLK.js +0 -216
- package/dist/fast-analyzer-3GCCZMLK.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-QUKX2W6C.js +0 -25
- package/dist/goal-manager-QUKX2W6C.js.map +0 -1
- package/dist/goal-validator-2SFSKKVU.js +0 -24
- package/dist/goal-validator-2SFSKKVU.js.map +0 -1
- package/dist/graph-B3NA4S7I.js +0 -10
- package/dist/graph-B3NA4S7I.js.map +0 -1
- package/dist/hypothesis-KCPBR652.js +0 -23
- package/dist/hypothesis-KCPBR652.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-YAXTNRRY.js +0 -36
- package/dist/issue-store-YAXTNRRY.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-DYNC5CQ6.js +0 -13
- package/dist/tiered-storage-DYNC5CQ6.js.map +0 -1
- package/dist/trie-agent-I3HAHY2G.js +0 -26
- package/dist/trie-agent-I3HAHY2G.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-5ZULYP3D.js +0 -987
- package/dist/vibe-code-signatures-5ZULYP3D.js.map +0 -1
- package/dist/vulnerability-signatures-2URZSXAQ.js +0 -983
- package/dist/vulnerability-signatures-2URZSXAQ.js.map +0 -1
package/dist/chunk-43X6JBEM.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
// src/utils/atomic-write.ts
|
|
2
|
-
import { writeFile, rename, unlink, mkdir } from "fs/promises";
|
|
3
|
-
import { randomBytes } from "crypto";
|
|
4
|
-
import { dirname } from "path";
|
|
5
|
-
async function atomicWriteFile(filePath, data, options = {}) {
|
|
6
|
-
const { createDir = true, encoding = "utf-8" } = options;
|
|
7
|
-
const tempSuffix = randomBytes(6).toString("hex");
|
|
8
|
-
const tempPath = `${filePath}.${tempSuffix}.tmp`;
|
|
9
|
-
try {
|
|
10
|
-
if (createDir) {
|
|
11
|
-
await mkdir(dirname(filePath), { recursive: true });
|
|
12
|
-
}
|
|
13
|
-
if (typeof data === "string") {
|
|
14
|
-
await writeFile(tempPath, data, { encoding });
|
|
15
|
-
} else {
|
|
16
|
-
await writeFile(tempPath, data);
|
|
17
|
-
}
|
|
18
|
-
await rename(tempPath, filePath);
|
|
19
|
-
} catch (error) {
|
|
20
|
-
try {
|
|
21
|
-
await unlink(tempPath);
|
|
22
|
-
} catch {
|
|
23
|
-
}
|
|
24
|
-
throw error;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
async function atomicWriteJSON(filePath, data, options = {}) {
|
|
28
|
-
const { spaces = 2, ...writeOptions } = options;
|
|
29
|
-
const json = JSON.stringify(data, null, spaces);
|
|
30
|
-
await atomicWriteFile(filePath, json, writeOptions);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export {
|
|
34
|
-
atomicWriteJSON
|
|
35
|
-
};
|
|
36
|
-
//# sourceMappingURL=chunk-43X6JBEM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/atomic-write.ts"],"sourcesContent":["/**\n * Atomic File Write Utility\n * \n * Provides safe file writes using the temp file + rename pattern.\n * Prevents data corruption from interrupted writes or crashes.\n * \n * Pattern:\n * 1. Write to a temporary file with random suffix\n * 2. Rename temp file to target path (atomic on POSIX systems)\n * 3. Clean up temp file on failure\n */\n\nimport { writeFile, rename, unlink, mkdir } from 'fs/promises';\nimport { randomBytes } from 'crypto';\nimport { dirname } from 'path';\n\nexport interface AtomicWriteOptions {\n /**\n * Create parent directories if they don't exist\n * @default true\n */\n createDir?: boolean;\n \n /**\n * File encoding for string data\n * @default 'utf-8'\n */\n encoding?: BufferEncoding;\n}\n\n/**\n * Write data to a file atomically\n * \n * Uses a temp file + rename pattern to ensure the target file\n * is never in a partially written state. On POSIX systems,\n * rename() is atomic, so readers will always see either the\n * old complete file or the new complete file.\n * \n * @param filePath - Target file path\n * @param data - Data to write (string or Buffer)\n * @param options - Write options\n * @throws Error if write or rename fails\n * \n * @example\n * ```typescript\n * await atomicWriteFile('/path/to/data.json', JSON.stringify(data, null, 2));\n * ```\n */\nexport async function atomicWriteFile(\n filePath: string,\n data: string | Buffer,\n options: AtomicWriteOptions = {}\n): Promise<void> {\n const { createDir = true, encoding = 'utf-8' } = options;\n \n // Generate a unique temp file path\n const tempSuffix = randomBytes(6).toString('hex');\n const tempPath = `${filePath}.${tempSuffix}.tmp`;\n \n try {\n // Ensure parent directory exists\n if (createDir) {\n await mkdir(dirname(filePath), { recursive: true });\n }\n \n // Write to temp file\n if (typeof data === 'string') {\n await writeFile(tempPath, data, { encoding });\n } else {\n await writeFile(tempPath, data);\n }\n \n // Atomic rename to target path\n await rename(tempPath, filePath);\n } catch (error) {\n // Clean up temp file on failure\n try {\n await unlink(tempPath);\n } catch {\n // Ignore cleanup errors - temp file might not exist\n }\n throw error;\n }\n}\n\n/**\n * Write JSON data to a file atomically\n * \n * Convenience wrapper that handles JSON serialization\n * with optional pretty printing.\n * \n * @param filePath - Target file path\n * @param data - Data to serialize as JSON\n * @param options - Write options and JSON formatting\n * @throws Error if serialization, write, or rename fails\n * \n * @example\n * ```typescript\n * await atomicWriteJSON('/path/to/config.json', { key: 'value' });\n * ```\n */\nexport async function atomicWriteJSON(\n filePath: string,\n data: unknown,\n options: AtomicWriteOptions & {\n /**\n * Spaces for JSON pretty printing\n * @default 2\n */\n spaces?: number;\n } = {}\n): Promise<void> {\n const { spaces = 2, ...writeOptions } = options;\n const json = JSON.stringify(data, null, spaces);\n await atomicWriteFile(filePath, json, writeOptions);\n}\n"],"mappings":";AAYA,SAAS,WAAW,QAAQ,QAAQ,aAAa;AACjD,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AAkCxB,eAAsB,gBACpB,UACA,MACA,UAA8B,CAAC,GAChB;AACf,QAAM,EAAE,YAAY,MAAM,WAAW,QAAQ,IAAI;AAGjD,QAAM,aAAa,YAAY,CAAC,EAAE,SAAS,KAAK;AAChD,QAAM,WAAW,GAAG,QAAQ,IAAI,UAAU;AAE1C,MAAI;AAEF,QAAI,WAAW;AACb,YAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IACpD;AAGA,QAAI,OAAO,SAAS,UAAU;AAC5B,YAAM,UAAU,UAAU,MAAM,EAAE,SAAS,CAAC;AAAA,IAC9C,OAAO;AACL,YAAM,UAAU,UAAU,IAAI;AAAA,IAChC;AAGA,UAAM,OAAO,UAAU,QAAQ;AAAA,EACjC,SAAS,OAAO;AAEd,QAAI;AACF,YAAM,OAAO,QAAQ;AAAA,IACvB,QAAQ;AAAA,IAER;AACA,UAAM;AAAA,EACR;AACF;AAkBA,eAAsB,gBACpB,UACA,MACA,UAMI,CAAC,GACU;AACf,QAAM,EAAE,SAAS,GAAG,GAAG,aAAa,IAAI;AACxC,QAAM,OAAO,KAAK,UAAU,MAAM,MAAM,MAAM;AAC9C,QAAM,gBAAgB,UAAU,MAAM,YAAY;AACpD;","names":[]}
|
package/dist/chunk-6NLHFIYA.js
DELETED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
// src/trie/trie.ts
|
|
2
|
-
var Trie = class _Trie {
|
|
3
|
-
root;
|
|
4
|
-
size = 0;
|
|
5
|
-
constructor() {
|
|
6
|
-
this.root = this.createNode();
|
|
7
|
-
}
|
|
8
|
-
createNode() {
|
|
9
|
-
return {
|
|
10
|
-
children: /* @__PURE__ */ new Map(),
|
|
11
|
-
isEnd: false
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Insert a pattern into the trie
|
|
16
|
-
* O(m) where m = pattern length
|
|
17
|
-
*/
|
|
18
|
-
insert(pattern, value, metadata) {
|
|
19
|
-
let node = this.root;
|
|
20
|
-
for (const char of pattern) {
|
|
21
|
-
if (!node.children.has(char)) {
|
|
22
|
-
node.children.set(char, this.createNode());
|
|
23
|
-
}
|
|
24
|
-
node = node.children.get(char);
|
|
25
|
-
}
|
|
26
|
-
node.isEnd = true;
|
|
27
|
-
if (value !== void 0) {
|
|
28
|
-
node.value = value;
|
|
29
|
-
}
|
|
30
|
-
if (metadata !== void 0) {
|
|
31
|
-
node.metadata = metadata;
|
|
32
|
-
}
|
|
33
|
-
this.size++;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Search for an exact pattern
|
|
37
|
-
* O(m) where m = pattern length
|
|
38
|
-
*/
|
|
39
|
-
search(pattern) {
|
|
40
|
-
let node = this.root;
|
|
41
|
-
for (const char of pattern) {
|
|
42
|
-
if (!node.children.has(char)) {
|
|
43
|
-
return { found: false };
|
|
44
|
-
}
|
|
45
|
-
node = node.children.get(char);
|
|
46
|
-
}
|
|
47
|
-
const result = {
|
|
48
|
-
found: node.isEnd
|
|
49
|
-
};
|
|
50
|
-
if (node.value !== void 0) {
|
|
51
|
-
result.value = node.value;
|
|
52
|
-
}
|
|
53
|
-
if (node.metadata !== void 0) {
|
|
54
|
-
result.metadata = node.metadata;
|
|
55
|
-
}
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Check if any pattern starts with the given prefix
|
|
60
|
-
* O(m) where m = prefix length
|
|
61
|
-
*/
|
|
62
|
-
startsWith(prefix) {
|
|
63
|
-
let node = this.root;
|
|
64
|
-
for (const char of prefix) {
|
|
65
|
-
if (!node.children.has(char)) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
node = node.children.get(char);
|
|
69
|
-
}
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Find all patterns that match within the given text
|
|
74
|
-
* Uses Aho-Corasick-like multi-pattern matching
|
|
75
|
-
* O(n + m) where n = text length, m = total matches
|
|
76
|
-
*/
|
|
77
|
-
findAllMatches(text) {
|
|
78
|
-
const matches = [];
|
|
79
|
-
const lines = text.split("\n");
|
|
80
|
-
let globalPos = 0;
|
|
81
|
-
for (let lineNum = 0; lineNum < lines.length; lineNum++) {
|
|
82
|
-
const line = lines[lineNum];
|
|
83
|
-
for (let i = 0; i < line.length; i++) {
|
|
84
|
-
let node = this.root;
|
|
85
|
-
let matchLen = 0;
|
|
86
|
-
let j = i;
|
|
87
|
-
while (j < line.length && node.children.has(line[j])) {
|
|
88
|
-
node = node.children.get(line[j]);
|
|
89
|
-
matchLen++;
|
|
90
|
-
j++;
|
|
91
|
-
if (node.isEnd) {
|
|
92
|
-
const matchResult = {
|
|
93
|
-
pattern: line.substring(i, i + matchLen),
|
|
94
|
-
position: globalPos + i,
|
|
95
|
-
line: lineNum + 1,
|
|
96
|
-
column: i + 1
|
|
97
|
-
};
|
|
98
|
-
if (node.value !== void 0) {
|
|
99
|
-
matchResult.value = node.value;
|
|
100
|
-
}
|
|
101
|
-
if (node.metadata !== void 0) {
|
|
102
|
-
matchResult.metadata = node.metadata;
|
|
103
|
-
}
|
|
104
|
-
matches.push(matchResult);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
globalPos += line.length + 1;
|
|
109
|
-
}
|
|
110
|
-
return matches;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Find the longest matching prefix at a position
|
|
114
|
-
* O(m) where m = longest pattern length
|
|
115
|
-
*/
|
|
116
|
-
findLongestMatch(text, startPos = 0) {
|
|
117
|
-
let node = this.root;
|
|
118
|
-
let lastMatch = null;
|
|
119
|
-
let matchLen = 0;
|
|
120
|
-
for (let i = startPos; i < text.length; i++) {
|
|
121
|
-
const char = text[i];
|
|
122
|
-
if (!node.children.has(char)) {
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
node = node.children.get(char);
|
|
126
|
-
matchLen++;
|
|
127
|
-
if (node.isEnd) {
|
|
128
|
-
lastMatch = {
|
|
129
|
-
pattern: text.substring(startPos, startPos + matchLen),
|
|
130
|
-
position: startPos,
|
|
131
|
-
line: this.getLineNumber(text, startPos),
|
|
132
|
-
column: this.getColumnNumber(text, startPos)
|
|
133
|
-
};
|
|
134
|
-
if (node.value !== void 0) {
|
|
135
|
-
lastMatch.value = node.value;
|
|
136
|
-
}
|
|
137
|
-
if (node.metadata !== void 0) {
|
|
138
|
-
lastMatch.metadata = node.metadata;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
return lastMatch;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Get all patterns with a given prefix
|
|
146
|
-
* O(p + n) where p = prefix length, n = number of matches
|
|
147
|
-
*/
|
|
148
|
-
getWithPrefix(prefix) {
|
|
149
|
-
let node = this.root;
|
|
150
|
-
for (const char of prefix) {
|
|
151
|
-
if (!node.children.has(char)) {
|
|
152
|
-
return [];
|
|
153
|
-
}
|
|
154
|
-
node = node.children.get(char);
|
|
155
|
-
}
|
|
156
|
-
const results = [];
|
|
157
|
-
this.collectPatterns(node, prefix, results);
|
|
158
|
-
return results;
|
|
159
|
-
}
|
|
160
|
-
collectPatterns(node, prefix, results) {
|
|
161
|
-
if (node.isEnd) {
|
|
162
|
-
const entry = { pattern: prefix };
|
|
163
|
-
if (node.value !== void 0) {
|
|
164
|
-
entry.value = node.value;
|
|
165
|
-
}
|
|
166
|
-
if (node.metadata !== void 0) {
|
|
167
|
-
entry.metadata = node.metadata;
|
|
168
|
-
}
|
|
169
|
-
results.push(entry);
|
|
170
|
-
}
|
|
171
|
-
for (const [char, child] of node.children) {
|
|
172
|
-
this.collectPatterns(child, prefix + char, results);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
getLineNumber(text, position) {
|
|
176
|
-
let line = 1;
|
|
177
|
-
for (let i = 0; i < position && i < text.length; i++) {
|
|
178
|
-
if (text[i] === "\n") line++;
|
|
179
|
-
}
|
|
180
|
-
return line;
|
|
181
|
-
}
|
|
182
|
-
getColumnNumber(text, position) {
|
|
183
|
-
let column = 1;
|
|
184
|
-
for (let i = position - 1; i >= 0 && text[i] !== "\n"; i--) {
|
|
185
|
-
column++;
|
|
186
|
-
}
|
|
187
|
-
return column;
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* Get the number of patterns in the trie
|
|
191
|
-
*/
|
|
192
|
-
getSize() {
|
|
193
|
-
return this.size;
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Clear all patterns
|
|
197
|
-
*/
|
|
198
|
-
clear() {
|
|
199
|
-
this.root = this.createNode();
|
|
200
|
-
this.size = 0;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Serialize trie to JSON for persistence
|
|
204
|
-
*/
|
|
205
|
-
toJSON() {
|
|
206
|
-
return this.serializeNode(this.root);
|
|
207
|
-
}
|
|
208
|
-
serializeNode(node) {
|
|
209
|
-
const children = {};
|
|
210
|
-
for (const [char, child] of node.children) {
|
|
211
|
-
children[char] = this.serializeNode(child);
|
|
212
|
-
}
|
|
213
|
-
return {
|
|
214
|
-
children,
|
|
215
|
-
isEnd: node.isEnd,
|
|
216
|
-
value: node.value,
|
|
217
|
-
metadata: node.metadata
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Load trie from JSON
|
|
222
|
-
*/
|
|
223
|
-
static fromJSON(json) {
|
|
224
|
-
const trie = new _Trie();
|
|
225
|
-
trie.root = trie.deserializeNode(json);
|
|
226
|
-
return trie;
|
|
227
|
-
}
|
|
228
|
-
deserializeNode(data) {
|
|
229
|
-
const node = this.createNode();
|
|
230
|
-
node.isEnd = data.isEnd;
|
|
231
|
-
node.value = data.value;
|
|
232
|
-
node.metadata = data.metadata;
|
|
233
|
-
for (const [char, childData] of Object.entries(data.children)) {
|
|
234
|
-
node.children.set(char, this.deserializeNode(childData));
|
|
235
|
-
}
|
|
236
|
-
return node;
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
var AhoCorasick = class {
|
|
240
|
-
root;
|
|
241
|
-
built = false;
|
|
242
|
-
constructor() {
|
|
243
|
-
this.root = this.createNode();
|
|
244
|
-
}
|
|
245
|
-
createNode() {
|
|
246
|
-
return {
|
|
247
|
-
children: /* @__PURE__ */ new Map(),
|
|
248
|
-
fail: null,
|
|
249
|
-
output: []
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
/**
|
|
253
|
-
* Add a pattern to the automaton
|
|
254
|
-
*/
|
|
255
|
-
addPattern(pattern, value, metadata) {
|
|
256
|
-
let node = this.root;
|
|
257
|
-
for (const char of pattern) {
|
|
258
|
-
if (!node.children.has(char)) {
|
|
259
|
-
node.children.set(char, this.createNode());
|
|
260
|
-
}
|
|
261
|
-
node = node.children.get(char);
|
|
262
|
-
}
|
|
263
|
-
const outputEntry = { pattern };
|
|
264
|
-
if (value !== void 0) {
|
|
265
|
-
outputEntry.value = value;
|
|
266
|
-
}
|
|
267
|
-
if (metadata !== void 0) {
|
|
268
|
-
outputEntry.metadata = metadata;
|
|
269
|
-
}
|
|
270
|
-
node.output.push(outputEntry);
|
|
271
|
-
this.built = false;
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Build failure links (call after adding all patterns)
|
|
275
|
-
*/
|
|
276
|
-
build() {
|
|
277
|
-
const queue = [];
|
|
278
|
-
for (const child of this.root.children.values()) {
|
|
279
|
-
child.fail = this.root;
|
|
280
|
-
queue.push(child);
|
|
281
|
-
}
|
|
282
|
-
while (queue.length > 0) {
|
|
283
|
-
const current = queue.shift();
|
|
284
|
-
for (const [char, child] of current.children) {
|
|
285
|
-
queue.push(child);
|
|
286
|
-
let fail = current.fail;
|
|
287
|
-
while (fail !== null && !fail.children.has(char)) {
|
|
288
|
-
fail = fail.fail;
|
|
289
|
-
}
|
|
290
|
-
child.fail = fail ? fail.children.get(char) : this.root;
|
|
291
|
-
if (child.fail !== this.root) {
|
|
292
|
-
child.output = [...child.output, ...child.fail.output];
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
this.built = true;
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* Search text for all pattern matches
|
|
300
|
-
* O(n + z) where n = text length, z = number of matches
|
|
301
|
-
*/
|
|
302
|
-
search(text) {
|
|
303
|
-
if (!this.built) {
|
|
304
|
-
this.build();
|
|
305
|
-
}
|
|
306
|
-
const matches = [];
|
|
307
|
-
let node = this.root;
|
|
308
|
-
let line = 1;
|
|
309
|
-
let lineStart = 0;
|
|
310
|
-
for (let i = 0; i < text.length; i++) {
|
|
311
|
-
const char = text[i];
|
|
312
|
-
if (char === "\n") {
|
|
313
|
-
line++;
|
|
314
|
-
lineStart = i + 1;
|
|
315
|
-
}
|
|
316
|
-
while (node !== this.root && !node.children.has(char)) {
|
|
317
|
-
node = node.fail || this.root;
|
|
318
|
-
}
|
|
319
|
-
node = node.children.get(char) || this.root;
|
|
320
|
-
for (const output of node.output) {
|
|
321
|
-
const matchResult = {
|
|
322
|
-
pattern: output.pattern,
|
|
323
|
-
position: i - output.pattern.length + 1,
|
|
324
|
-
line,
|
|
325
|
-
column: i - output.pattern.length + 1 - lineStart + 1
|
|
326
|
-
};
|
|
327
|
-
if (output.value !== void 0) {
|
|
328
|
-
matchResult.value = output.value;
|
|
329
|
-
}
|
|
330
|
-
if (output.metadata !== void 0) {
|
|
331
|
-
matchResult.metadata = output.metadata;
|
|
332
|
-
}
|
|
333
|
-
matches.push(matchResult);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
return matches;
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
export {
|
|
341
|
-
Trie,
|
|
342
|
-
AhoCorasick
|
|
343
|
-
};
|
|
344
|
-
//# sourceMappingURL=chunk-6NLHFIYA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/trie/trie.ts"],"sourcesContent":["/**\n * Trie Data Structure\n * \n * A prefix tree for O(m) pattern matching where m = pattern length.\n * Used for:\n * - Fast vulnerability signature matching\n * - Code symbol indexing\n * - Pattern-based triaging\n */\n\nexport interface TrieNode<T = any> {\n children: Map<string, TrieNode<T>>;\n isEnd: boolean;\n value?: T;\n // For pattern matching - store metadata about what this pattern means\n metadata?: PatternMetadata;\n}\n\nexport interface PatternMetadata {\n type: 'vulnerability' | 'symbol' | 'pattern' | 'keyword';\n severity?: 'critical' | 'serious' | 'moderate' | 'low';\n category?: string;\n description?: string;\n cwe?: string;\n fix?: string;\n}\n\nexport interface MatchResult<T = any> {\n pattern: string;\n position: number;\n line: number;\n column: number;\n value?: T;\n metadata?: PatternMetadata;\n}\n\n/**\n * Core Trie implementation with pattern matching\n */\nexport class Trie<T = any> {\n private root: TrieNode<T>;\n private size: number = 0;\n\n constructor() {\n this.root = this.createNode();\n }\n\n private createNode(): TrieNode<T> {\n return {\n children: new Map(),\n isEnd: false,\n };\n }\n\n /**\n * Insert a pattern into the trie\n * O(m) where m = pattern length\n */\n insert(pattern: string, value?: T, metadata?: PatternMetadata): void {\n let node = this.root;\n\n for (const char of pattern) {\n if (!node.children.has(char)) {\n node.children.set(char, this.createNode());\n }\n node = node.children.get(char)!;\n }\n\n node.isEnd = true;\n if (value !== undefined) {\n node.value = value;\n }\n if (metadata !== undefined) {\n node.metadata = metadata;\n }\n this.size++;\n }\n\n /**\n * Search for an exact pattern\n * O(m) where m = pattern length\n */\n search(pattern: string): { found: boolean; value?: T; metadata?: PatternMetadata } {\n let node = this.root;\n\n for (const char of pattern) {\n if (!node.children.has(char)) {\n return { found: false };\n }\n node = node.children.get(char)!;\n }\n\n const result: { found: boolean; value?: T; metadata?: PatternMetadata } = {\n found: node.isEnd,\n };\n if (node.value !== undefined) {\n result.value = node.value;\n }\n if (node.metadata !== undefined) {\n result.metadata = node.metadata;\n }\n return result;\n }\n\n /**\n * Check if any pattern starts with the given prefix\n * O(m) where m = prefix length\n */\n startsWith(prefix: string): boolean {\n let node = this.root;\n\n for (const char of prefix) {\n if (!node.children.has(char)) {\n return false;\n }\n node = node.children.get(char)!;\n }\n\n return true;\n }\n\n /**\n * Find all patterns that match within the given text\n * Uses Aho-Corasick-like multi-pattern matching\n * O(n + m) where n = text length, m = total matches\n */\n findAllMatches(text: string): MatchResult<T>[] {\n const matches: MatchResult<T>[] = [];\n const lines = text.split('\\n');\n \n let globalPos = 0;\n\n for (let lineNum = 0; lineNum < lines.length; lineNum++) {\n const line = lines[lineNum]!;\n \n // Try matching at each position in the line\n for (let i = 0; i < line.length; i++) {\n let node = this.root;\n let matchLen = 0;\n let j = i;\n\n // Walk the trie as far as we can\n while (j < line.length && node.children.has(line[j]!)) {\n node = node.children.get(line[j]!)!;\n matchLen++;\n j++;\n\n // Check if we found a complete pattern\n if (node.isEnd) {\n const matchResult: MatchResult<T> = {\n pattern: line.substring(i, i + matchLen),\n position: globalPos + i,\n line: lineNum + 1,\n column: i + 1,\n };\n if (node.value !== undefined) {\n matchResult.value = node.value;\n }\n if (node.metadata !== undefined) {\n matchResult.metadata = node.metadata;\n }\n matches.push(matchResult);\n }\n }\n }\n\n globalPos += line.length + 1; // +1 for newline\n }\n\n return matches;\n }\n\n /**\n * Find the longest matching prefix at a position\n * O(m) where m = longest pattern length\n */\n findLongestMatch(text: string, startPos: number = 0): MatchResult<T> | null {\n let node = this.root;\n let lastMatch: MatchResult<T> | null = null;\n let matchLen = 0;\n\n for (let i = startPos; i < text.length; i++) {\n const char = text[i]!;\n \n if (!node.children.has(char)) {\n break;\n }\n\n node = node.children.get(char)!;\n matchLen++;\n\n if (node.isEnd) {\n lastMatch = {\n pattern: text.substring(startPos, startPos + matchLen),\n position: startPos,\n line: this.getLineNumber(text, startPos),\n column: this.getColumnNumber(text, startPos),\n };\n if (node.value !== undefined) {\n lastMatch.value = node.value;\n }\n if (node.metadata !== undefined) {\n lastMatch.metadata = node.metadata;\n }\n }\n }\n\n return lastMatch;\n }\n\n /**\n * Get all patterns with a given prefix\n * O(p + n) where p = prefix length, n = number of matches\n */\n getWithPrefix(prefix: string): Array<{ pattern: string; value?: T; metadata?: PatternMetadata }> {\n let node = this.root;\n\n // Navigate to prefix node\n for (const char of prefix) {\n if (!node.children.has(char)) {\n return [];\n }\n node = node.children.get(char)!;\n }\n\n // Collect all patterns under this prefix\n const results: Array<{ pattern: string; value?: T; metadata?: PatternMetadata }> = [];\n this.collectPatterns(node, prefix, results);\n return results;\n }\n\n private collectPatterns(\n node: TrieNode<T>,\n prefix: string,\n results: Array<{ pattern: string; value?: T; metadata?: PatternMetadata }>\n ): void {\n if (node.isEnd) {\n const entry: { pattern: string; value?: T; metadata?: PatternMetadata } = { pattern: prefix };\n if (node.value !== undefined) {\n entry.value = node.value;\n }\n if (node.metadata !== undefined) {\n entry.metadata = node.metadata;\n }\n results.push(entry);\n }\n\n for (const [char, child] of node.children) {\n this.collectPatterns(child, prefix + char, results);\n }\n }\n\n private getLineNumber(text: string, position: number): number {\n let line = 1;\n for (let i = 0; i < position && i < text.length; i++) {\n if (text[i] === '\\n') line++;\n }\n return line;\n }\n\n private getColumnNumber(text: string, position: number): number {\n let column = 1;\n for (let i = position - 1; i >= 0 && text[i] !== '\\n'; i--) {\n column++;\n }\n return column;\n }\n\n /**\n * Get the number of patterns in the trie\n */\n getSize(): number {\n return this.size;\n }\n\n /**\n * Clear all patterns\n */\n clear(): void {\n this.root = this.createNode();\n this.size = 0;\n }\n\n /**\n * Serialize trie to JSON for persistence\n */\n toJSON(): object {\n return this.serializeNode(this.root);\n }\n\n private serializeNode(node: TrieNode<T>): object {\n const children: Record<string, object> = {};\n for (const [char, child] of node.children) {\n children[char] = this.serializeNode(child);\n }\n return {\n children,\n isEnd: node.isEnd,\n value: node.value,\n metadata: node.metadata,\n };\n }\n\n /**\n * Load trie from JSON\n */\n static fromJSON<T>(json: object): Trie<T> {\n const trie = new Trie<T>();\n trie.root = trie.deserializeNode(json as any);\n return trie;\n }\n\n private deserializeNode(data: any): TrieNode<T> {\n const node = this.createNode();\n node.isEnd = data.isEnd;\n node.value = data.value;\n node.metadata = data.metadata;\n \n for (const [char, childData] of Object.entries(data.children)) {\n node.children.set(char, this.deserializeNode(childData));\n }\n \n return node;\n }\n}\n\n/**\n * Aho-Corasick implementation for efficient multi-pattern matching\n * O(n + m + z) where n = text length, m = total pattern length, z = number of matches\n */\nexport class AhoCorasick<T = any> {\n private root: ACNode<T>;\n private built: boolean = false;\n\n constructor() {\n this.root = this.createNode();\n }\n\n private createNode(): ACNode<T> {\n return {\n children: new Map(),\n fail: null,\n output: [],\n };\n }\n\n /**\n * Add a pattern to the automaton\n */\n addPattern(pattern: string, value?: T, metadata?: PatternMetadata): void {\n let node = this.root;\n\n for (const char of pattern) {\n if (!node.children.has(char)) {\n node.children.set(char, this.createNode());\n }\n node = node.children.get(char)!;\n }\n\n const outputEntry: { pattern: string; value?: T; metadata?: PatternMetadata } = { pattern };\n if (value !== undefined) {\n outputEntry.value = value;\n }\n if (metadata !== undefined) {\n outputEntry.metadata = metadata;\n }\n node.output.push(outputEntry);\n this.built = false;\n }\n\n /**\n * Build failure links (call after adding all patterns)\n */\n build(): void {\n const queue: ACNode<T>[] = [];\n\n // Initialize failure links for depth 1\n for (const child of this.root.children.values()) {\n child.fail = this.root;\n queue.push(child);\n }\n\n // BFS to build failure links\n while (queue.length > 0) {\n const current = queue.shift()!;\n\n for (const [char, child] of current.children) {\n queue.push(child);\n\n // Find failure link\n let fail = current.fail;\n while (fail !== null && !fail.children.has(char)) {\n fail = fail.fail;\n }\n\n child.fail = fail ? fail.children.get(char)! : this.root;\n\n // Merge outputs from failure chain\n if (child.fail !== this.root) {\n child.output = [...child.output, ...child.fail.output];\n }\n }\n }\n\n this.built = true;\n }\n\n /**\n * Search text for all pattern matches\n * O(n + z) where n = text length, z = number of matches\n */\n search(text: string): MatchResult<T>[] {\n if (!this.built) {\n this.build();\n }\n\n const matches: MatchResult<T>[] = [];\n let node = this.root;\n let line = 1;\n let lineStart = 0;\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i]!;\n\n // Track line numbers\n if (char === '\\n') {\n line++;\n lineStart = i + 1;\n }\n\n // Follow failure links until we find a match or reach root\n while (node !== this.root && !node.children.has(char)) {\n node = node.fail || this.root;\n }\n\n node = node.children.get(char) || this.root;\n\n // Report all matches at this position\n for (const output of node.output) {\n const matchResult: MatchResult<T> = {\n pattern: output.pattern,\n position: i - output.pattern.length + 1,\n line,\n column: i - output.pattern.length + 1 - lineStart + 1,\n };\n if (output.value !== undefined) {\n matchResult.value = output.value;\n }\n if (output.metadata !== undefined) {\n matchResult.metadata = output.metadata;\n }\n matches.push(matchResult);\n }\n }\n\n return matches;\n }\n}\n\ninterface ACNode<T> {\n children: Map<string, ACNode<T>>;\n fail: ACNode<T> | null;\n output: Array<{ pattern: string; value?: T; metadata?: PatternMetadata }>;\n}\n\n"],"mappings":"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","names":[]}
|