@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.
Files changed (149) hide show
  1. package/README.md +54 -500
  2. package/dist/chunk-2YXOBNKW.js +619 -0
  3. package/dist/chunk-2YXOBNKW.js.map +1 -0
  4. package/dist/chunk-QR64Y5TI.js +363 -0
  5. package/dist/chunk-QR64Y5TI.js.map +1 -0
  6. package/dist/cli/main.d.ts +0 -15
  7. package/dist/cli/main.js +356 -3100
  8. package/dist/cli/main.js.map +1 -1
  9. package/dist/index.js +2 -36
  10. package/dist/index.js.map +1 -1
  11. package/dist/server/mcp-server.js +2 -36
  12. package/package.json +8 -31
  13. package/dist/autonomy-config-FSERX3O3.js +0 -30
  14. package/dist/autonomy-config-FSERX3O3.js.map +0 -1
  15. package/dist/chat-store-JNGNTDSN.js +0 -15
  16. package/dist/chat-store-JNGNTDSN.js.map +0 -1
  17. package/dist/chunk-2HF65EHQ.js +0 -311
  18. package/dist/chunk-2HF65EHQ.js.map +0 -1
  19. package/dist/chunk-43X6JBEM.js +0 -36
  20. package/dist/chunk-43X6JBEM.js.map +0 -1
  21. package/dist/chunk-4MXH2ZPT.js +0 -1827
  22. package/dist/chunk-4MXH2ZPT.js.map +0 -1
  23. package/dist/chunk-575YT2SD.js +0 -737
  24. package/dist/chunk-575YT2SD.js.map +0 -1
  25. package/dist/chunk-5BRRRTN6.js +0 -354
  26. package/dist/chunk-5BRRRTN6.js.map +0 -1
  27. package/dist/chunk-6NLHFIYA.js +0 -344
  28. package/dist/chunk-6NLHFIYA.js.map +0 -1
  29. package/dist/chunk-7WITSO22.js +0 -824
  30. package/dist/chunk-7WITSO22.js.map +0 -1
  31. package/dist/chunk-DGUM43GV.js +0 -11
  32. package/dist/chunk-DGUM43GV.js.map +0 -1
  33. package/dist/chunk-EFWVF6TI.js +0 -267
  34. package/dist/chunk-EFWVF6TI.js.map +0 -1
  35. package/dist/chunk-F6WFNUAY.js +0 -216
  36. package/dist/chunk-F6WFNUAY.js.map +0 -1
  37. package/dist/chunk-FQ45QP5A.js +0 -361
  38. package/dist/chunk-FQ45QP5A.js.map +0 -1
  39. package/dist/chunk-G2TGF6TR.js +0 -573
  40. package/dist/chunk-G2TGF6TR.js.map +0 -1
  41. package/dist/chunk-GTKYBOXL.js +0 -700
  42. package/dist/chunk-GTKYBOXL.js.map +0 -1
  43. package/dist/chunk-HVCDY3AK.js +0 -850
  44. package/dist/chunk-HVCDY3AK.js.map +0 -1
  45. package/dist/chunk-JVMBCWKS.js +0 -348
  46. package/dist/chunk-JVMBCWKS.js.map +0 -1
  47. package/dist/chunk-KDHN2ZQE.js +0 -313
  48. package/dist/chunk-KDHN2ZQE.js.map +0 -1
  49. package/dist/chunk-LQIMKE3P.js +0 -12524
  50. package/dist/chunk-LQIMKE3P.js.map +0 -1
  51. package/dist/chunk-ME2OERF5.js +0 -345
  52. package/dist/chunk-ME2OERF5.js.map +0 -1
  53. package/dist/chunk-MRHKX5M5.js +0 -662
  54. package/dist/chunk-MRHKX5M5.js.map +0 -1
  55. package/dist/chunk-OBQ74FOU.js +0 -27
  56. package/dist/chunk-OBQ74FOU.js.map +0 -1
  57. package/dist/chunk-OMR4YCBS.js +0 -987
  58. package/dist/chunk-OMR4YCBS.js.map +0 -1
  59. package/dist/chunk-Q5EKA5YA.js +0 -254
  60. package/dist/chunk-Q5EKA5YA.js.map +0 -1
  61. package/dist/chunk-Q63FFI6D.js +0 -132
  62. package/dist/chunk-Q63FFI6D.js.map +0 -1
  63. package/dist/chunk-SY6KQG44.js +0 -983
  64. package/dist/chunk-SY6KQG44.js.map +0 -1
  65. package/dist/chunk-T63OHG4Q.js +0 -440
  66. package/dist/chunk-T63OHG4Q.js.map +0 -1
  67. package/dist/chunk-TN5WEKWI.js +0 -173
  68. package/dist/chunk-TN5WEKWI.js.map +0 -1
  69. package/dist/chunk-VUL52BQL.js +0 -402
  70. package/dist/chunk-VUL52BQL.js.map +0 -1
  71. package/dist/chunk-VVITXIHN.js +0 -189
  72. package/dist/chunk-VVITXIHN.js.map +0 -1
  73. package/dist/chunk-WCN7S3EI.js +0 -14
  74. package/dist/chunk-WCN7S3EI.js.map +0 -1
  75. package/dist/chunk-XE6KQRKZ.js +0 -816
  76. package/dist/chunk-XE6KQRKZ.js.map +0 -1
  77. package/dist/chunk-XPZZFPBZ.js +0 -491
  78. package/dist/chunk-XPZZFPBZ.js.map +0 -1
  79. package/dist/chunk-XTFWT2XM.js +0 -727
  80. package/dist/chunk-XTFWT2XM.js.map +0 -1
  81. package/dist/chunk-YDHUCDHM.js +0 -4011
  82. package/dist/chunk-YDHUCDHM.js.map +0 -1
  83. package/dist/chunk-YZ6Y2H3P.js +0 -1289
  84. package/dist/chunk-YZ6Y2H3P.js.map +0 -1
  85. package/dist/chunk-ZJF5FTBX.js +0 -1396
  86. package/dist/chunk-ZJF5FTBX.js.map +0 -1
  87. package/dist/chunk-ZV2K6M7T.js +0 -74
  88. package/dist/chunk-ZV2K6M7T.js.map +0 -1
  89. package/dist/cli/create-agent.d.ts +0 -1
  90. package/dist/cli/create-agent.js +0 -1050
  91. package/dist/cli/create-agent.js.map +0 -1
  92. package/dist/cli/yolo-daemon.d.ts +0 -1
  93. package/dist/cli/yolo-daemon.js +0 -423
  94. package/dist/cli/yolo-daemon.js.map +0 -1
  95. package/dist/client-NJPZE5JT.js +0 -28
  96. package/dist/client-NJPZE5JT.js.map +0 -1
  97. package/dist/codebase-index-VAPF32XX.js +0 -12
  98. package/dist/codebase-index-VAPF32XX.js.map +0 -1
  99. package/dist/fast-analyzer-XXYMOXRK.js +0 -216
  100. package/dist/fast-analyzer-XXYMOXRK.js.map +0 -1
  101. package/dist/git-EO5SRFMN.js +0 -28
  102. package/dist/git-EO5SRFMN.js.map +0 -1
  103. package/dist/github-ingester-ZOKK6GRS.js +0 -11
  104. package/dist/github-ingester-ZOKK6GRS.js.map +0 -1
  105. package/dist/goal-manager-YOB7VWK7.js +0 -25
  106. package/dist/goal-manager-YOB7VWK7.js.map +0 -1
  107. package/dist/goal-validator-ULKIBDPX.js +0 -24
  108. package/dist/goal-validator-ULKIBDPX.js.map +0 -1
  109. package/dist/graph-B3NA4S7I.js +0 -10
  110. package/dist/graph-B3NA4S7I.js.map +0 -1
  111. package/dist/hypothesis-7BFFT5JY.js +0 -23
  112. package/dist/hypothesis-7BFFT5JY.js.map +0 -1
  113. package/dist/incident-index-EFNUSGWL.js +0 -11
  114. package/dist/incident-index-EFNUSGWL.js.map +0 -1
  115. package/dist/insight-store-EC4PLSAW.js +0 -22
  116. package/dist/insight-store-EC4PLSAW.js.map +0 -1
  117. package/dist/issue-store-ZIRP23EP.js +0 -36
  118. package/dist/issue-store-ZIRP23EP.js.map +0 -1
  119. package/dist/ledger-TWZTGDFA.js +0 -58
  120. package/dist/ledger-TWZTGDFA.js.map +0 -1
  121. package/dist/linear-ingester-XXPAZZRW.js +0 -11
  122. package/dist/linear-ingester-XXPAZZRW.js.map +0 -1
  123. package/dist/output-manager-RVJ37XKA.js +0 -13
  124. package/dist/output-manager-RVJ37XKA.js.map +0 -1
  125. package/dist/parse-goal-violation-SACGFG3C.js +0 -8
  126. package/dist/parse-goal-violation-SACGFG3C.js.map +0 -1
  127. package/dist/pattern-discovery-F7LU5K6E.js +0 -8
  128. package/dist/pattern-discovery-F7LU5K6E.js.map +0 -1
  129. package/dist/progress-SRQ2V3BP.js +0 -18
  130. package/dist/progress-SRQ2V3BP.js.map +0 -1
  131. package/dist/project-state-AHPA77SM.js +0 -28
  132. package/dist/project-state-AHPA77SM.js.map +0 -1
  133. package/dist/sync-M2FSWPBC.js +0 -12
  134. package/dist/sync-M2FSWPBC.js.map +0 -1
  135. package/dist/terminal-spawn-5YXDMUCF.js +0 -157
  136. package/dist/terminal-spawn-5YXDMUCF.js.map +0 -1
  137. package/dist/tiered-storage-Z3YCR465.js +0 -12
  138. package/dist/tiered-storage-Z3YCR465.js.map +0 -1
  139. package/dist/trie-agent-3YDPEGHJ.js +0 -28
  140. package/dist/trie-agent-3YDPEGHJ.js.map +0 -1
  141. package/dist/ui/chat.html +0 -1014
  142. package/dist/ui/goals.html +0 -967
  143. package/dist/ui/hypotheses.html +0 -1011
  144. package/dist/ui/ledger.html +0 -954
  145. package/dist/ui/nudges.html +0 -995
  146. package/dist/vibe-code-signatures-F6URTBW3.js +0 -16
  147. package/dist/vibe-code-signatures-F6URTBW3.js.map +0 -1
  148. package/dist/vulnerability-signatures-T7SKHORW.js +0 -18
  149. package/dist/vulnerability-signatures-T7SKHORW.js.map +0 -1
@@ -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":[]}