agent-knowledge 1.0.0

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 (130) hide show
  1. package/CHANGELOG.md +77 -0
  2. package/LICENSE +21 -0
  3. package/README.md +191 -0
  4. package/dist/dashboard.d.ts +4 -0
  5. package/dist/dashboard.d.ts.map +1 -0
  6. package/dist/dashboard.js +434 -0
  7. package/dist/dashboard.js.map +1 -0
  8. package/dist/embeddings/claude.d.ts +21 -0
  9. package/dist/embeddings/claude.d.ts.map +1 -0
  10. package/dist/embeddings/claude.js +84 -0
  11. package/dist/embeddings/claude.js.map +1 -0
  12. package/dist/embeddings/factory.d.ts +9 -0
  13. package/dist/embeddings/factory.d.ts.map +1 -0
  14. package/dist/embeddings/factory.js +60 -0
  15. package/dist/embeddings/factory.js.map +1 -0
  16. package/dist/embeddings/gemini.d.ts +21 -0
  17. package/dist/embeddings/gemini.d.ts.map +1 -0
  18. package/dist/embeddings/gemini.js +86 -0
  19. package/dist/embeddings/gemini.js.map +1 -0
  20. package/dist/embeddings/index.d.ts +4 -0
  21. package/dist/embeddings/index.d.ts.map +1 -0
  22. package/dist/embeddings/index.js +3 -0
  23. package/dist/embeddings/index.js.map +1 -0
  24. package/dist/embeddings/local.d.ts +20 -0
  25. package/dist/embeddings/local.d.ts.map +1 -0
  26. package/dist/embeddings/local.js +73 -0
  27. package/dist/embeddings/local.js.map +1 -0
  28. package/dist/embeddings/openai.d.ts +20 -0
  29. package/dist/embeddings/openai.d.ts.map +1 -0
  30. package/dist/embeddings/openai.js +84 -0
  31. package/dist/embeddings/openai.js.map +1 -0
  32. package/dist/embeddings/types.d.ts +39 -0
  33. package/dist/embeddings/types.d.ts.map +1 -0
  34. package/dist/embeddings/types.js +12 -0
  35. package/dist/embeddings/types.js.map +1 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +18 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/knowledge/distill.d.ts +27 -0
  41. package/dist/knowledge/distill.d.ts.map +1 -0
  42. package/dist/knowledge/distill.js +407 -0
  43. package/dist/knowledge/distill.js.map +1 -0
  44. package/dist/knowledge/git.d.ts +30 -0
  45. package/dist/knowledge/git.d.ts.map +1 -0
  46. package/dist/knowledge/git.js +228 -0
  47. package/dist/knowledge/git.js.map +1 -0
  48. package/dist/knowledge/search.d.ts +20 -0
  49. package/dist/knowledge/search.d.ts.map +1 -0
  50. package/dist/knowledge/search.js +72 -0
  51. package/dist/knowledge/search.js.map +1 -0
  52. package/dist/knowledge/store.d.ts +47 -0
  53. package/dist/knowledge/store.d.ts.map +1 -0
  54. package/dist/knowledge/store.js +173 -0
  55. package/dist/knowledge/store.js.map +1 -0
  56. package/dist/search/excerpt.d.ts +12 -0
  57. package/dist/search/excerpt.d.ts.map +1 -0
  58. package/dist/search/excerpt.js +28 -0
  59. package/dist/search/excerpt.js.map +1 -0
  60. package/dist/search/fuzzy.d.ts +15 -0
  61. package/dist/search/fuzzy.d.ts.map +1 -0
  62. package/dist/search/fuzzy.js +81 -0
  63. package/dist/search/fuzzy.js.map +1 -0
  64. package/dist/search/tfidf.d.ts +19 -0
  65. package/dist/search/tfidf.d.ts.map +1 -0
  66. package/dist/search/tfidf.js +200 -0
  67. package/dist/search/tfidf.js.map +1 -0
  68. package/dist/search/types.d.ts +19 -0
  69. package/dist/search/types.d.ts.map +1 -0
  70. package/dist/search/types.js +2 -0
  71. package/dist/search/types.js.map +1 -0
  72. package/dist/server.d.ts +3 -0
  73. package/dist/server.d.ts.map +1 -0
  74. package/dist/server.js +518 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/sessions/indexer.d.ts +15 -0
  77. package/dist/sessions/indexer.d.ts.map +1 -0
  78. package/dist/sessions/indexer.js +182 -0
  79. package/dist/sessions/indexer.js.map +1 -0
  80. package/dist/sessions/parser.d.ts +58 -0
  81. package/dist/sessions/parser.d.ts.map +1 -0
  82. package/dist/sessions/parser.js +142 -0
  83. package/dist/sessions/parser.js.map +1 -0
  84. package/dist/sessions/scopes.d.ts +16 -0
  85. package/dist/sessions/scopes.d.ts.map +1 -0
  86. package/dist/sessions/scopes.js +153 -0
  87. package/dist/sessions/scopes.js.map +1 -0
  88. package/dist/sessions/search.d.ts +26 -0
  89. package/dist/sessions/search.d.ts.map +1 -0
  90. package/dist/sessions/search.js +256 -0
  91. package/dist/sessions/search.js.map +1 -0
  92. package/dist/sessions/summary.d.ts +28 -0
  93. package/dist/sessions/summary.d.ts.map +1 -0
  94. package/dist/sessions/summary.js +135 -0
  95. package/dist/sessions/summary.js.map +1 -0
  96. package/dist/types.d.ts +26 -0
  97. package/dist/types.d.ts.map +1 -0
  98. package/dist/types.js +109 -0
  99. package/dist/types.js.map +1 -0
  100. package/dist/ui/app.js +1029 -0
  101. package/dist/ui/index.html +373 -0
  102. package/dist/ui/styles.css +1508 -0
  103. package/dist/ui/ui/app.js +811 -0
  104. package/dist/ui/ui/index.html +300 -0
  105. package/dist/ui/ui/styles.css +1154 -0
  106. package/dist/validate.d.ts +21 -0
  107. package/dist/validate.d.ts.map +1 -0
  108. package/dist/validate.js +86 -0
  109. package/dist/validate.js.map +1 -0
  110. package/dist/vectorstore/chunker.d.ts +48 -0
  111. package/dist/vectorstore/chunker.d.ts.map +1 -0
  112. package/dist/vectorstore/chunker.js +165 -0
  113. package/dist/vectorstore/chunker.js.map +1 -0
  114. package/dist/vectorstore/index.d.ts +5 -0
  115. package/dist/vectorstore/index.d.ts.map +1 -0
  116. package/dist/vectorstore/index.js +3 -0
  117. package/dist/vectorstore/index.js.map +1 -0
  118. package/dist/vectorstore/store.d.ts +139 -0
  119. package/dist/vectorstore/store.d.ts.map +1 -0
  120. package/dist/vectorstore/store.js +500 -0
  121. package/dist/vectorstore/store.js.map +1 -0
  122. package/dist/version.d.ts +2 -0
  123. package/dist/version.d.ts.map +1 -0
  124. package/dist/version.js +2 -0
  125. package/dist/version.js.map +1 -0
  126. package/docs/ARCHITECTURE.md +244 -0
  127. package/docs/DASHBOARD.md +133 -0
  128. package/docs/SETUP.md +178 -0
  129. package/package.json +92 -0
  130. package/scripts/copy-ui.js +6 -0
@@ -0,0 +1,81 @@
1
+ export function levenshtein(a, b) {
2
+ const aLen = a.length;
3
+ const bLen = b.length;
4
+ if (aLen === 0)
5
+ return bLen;
6
+ if (bLen === 0)
7
+ return aLen;
8
+ let prev = new Array(bLen + 1);
9
+ let curr = new Array(bLen + 1);
10
+ for (let j = 0; j <= bLen; j++) {
11
+ prev[j] = j;
12
+ }
13
+ for (let i = 1; i <= aLen; i++) {
14
+ curr[0] = i;
15
+ for (let j = 1; j <= bLen; j++) {
16
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
17
+ curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);
18
+ }
19
+ [prev, curr] = [curr, prev];
20
+ }
21
+ return prev[bLen];
22
+ }
23
+ export function fuzzyMatch(needle, haystack, threshold = 0.7) {
24
+ const results = [];
25
+ if (needle.length === 0 || haystack.length === 0) {
26
+ return results;
27
+ }
28
+ const needleLower = needle.toLowerCase();
29
+ const haystackLower = haystack.toLowerCase();
30
+ const needleLen = needleLower.length;
31
+ const minWindow = Math.max(1, Math.floor(needleLen * threshold));
32
+ const maxWindow = Math.ceil(needleLen / threshold);
33
+ const bestAtPos = new Map();
34
+ for (let winSize = minWindow; winSize <= Math.min(maxWindow, haystackLower.length); winSize++) {
35
+ for (let start = 0; start <= haystackLower.length - winSize; start++) {
36
+ const window = haystackLower.substring(start, start + winSize);
37
+ const distance = levenshtein(needleLower, window);
38
+ const maxLen = Math.max(needleLen, winSize);
39
+ const score = 1 - distance / maxLen;
40
+ if (score >= threshold) {
41
+ const existing = bestAtPos.get(start);
42
+ if (!existing || score > existing.score) {
43
+ bestAtPos.set(start, { end: start + winSize, score });
44
+ }
45
+ }
46
+ }
47
+ }
48
+ const candidates = Array.from(bestAtPos.entries())
49
+ .map(([start, { end, score }]) => ({ start, end, score }))
50
+ .sort((a, b) => b.score - a.score);
51
+ const taken = [];
52
+ for (const candidate of candidates) {
53
+ const overlaps = taken.some((t) => candidate.start < t.end && candidate.end > t.start);
54
+ if (!overlaps) {
55
+ taken.push(candidate);
56
+ }
57
+ }
58
+ taken.sort((a, b) => a.start - b.start);
59
+ return taken;
60
+ }
61
+ export function fuzzySearch(query, texts, threshold = 0.7) {
62
+ const results = [];
63
+ for (const { id, text } of texts) {
64
+ const matches = fuzzyMatch(query, text, threshold);
65
+ if (matches.length === 0)
66
+ continue;
67
+ const bestMatch = matches.reduce((best, m) => (m.score > best.score ? m : best), matches[0]);
68
+ const contextChars = 40;
69
+ const excerptStart = Math.max(0, bestMatch.start - contextChars);
70
+ const excerptEnd = Math.min(text.length, bestMatch.end + contextChars);
71
+ let excerpt = text.substring(excerptStart, excerptEnd);
72
+ if (excerptStart > 0)
73
+ excerpt = '...' + excerpt;
74
+ if (excerptEnd < text.length)
75
+ excerpt = excerpt + '...';
76
+ results.push({ id, score: bestMatch.score, excerpt });
77
+ }
78
+ results.sort((a, b) => b.score - a.score);
79
+ return results;
80
+ }
81
+ //# sourceMappingURL=fuzzy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../../src/search/fuzzy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Compute a recency decay multiplier using exponential decay.
3
+ * Half-life is in days — after `halfLifeDays`, the multiplier is 0.5.
4
+ * Returns a value in (0, 1] where 1 = now, 0.5 = halfLifeDays ago, etc.
5
+ * Floor of 0.1 ensures very old results aren't completely invisible.
6
+ */
7
+ export declare function recencyDecay(timestamp: string | null, halfLifeDays?: number): number;
8
+ export declare class TfIdfIndex {
9
+ private docs;
10
+ private docFreq;
11
+ private totalDocs;
12
+ addDocument(id: string, text: string): void;
13
+ search(query: string, maxResults?: number): Array<{
14
+ id: string;
15
+ score: number;
16
+ }>;
17
+ clear(): void;
18
+ }
19
+ //# sourceMappingURL=tfidf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tfidf.d.ts","sourceRoot":"","sources":["../../src/search/tfidf.ts"],"names":[],"mappings":"AAgIA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,GAAE,MAAW,GAAG,MAAM,CAOxF;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAoC;IAChD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,SAAS,CAAa;IAE9B,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IA8B3C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAoChF,KAAK,IAAI,IAAI;CAKd"}
@@ -0,0 +1,200 @@
1
+ const STOPWORDS = new Set([
2
+ 'a',
3
+ 'an',
4
+ 'the',
5
+ 'and',
6
+ 'or',
7
+ 'but',
8
+ 'not',
9
+ 'is',
10
+ 'are',
11
+ 'was',
12
+ 'were',
13
+ 'be',
14
+ 'been',
15
+ 'being',
16
+ 'have',
17
+ 'has',
18
+ 'had',
19
+ 'having',
20
+ 'do',
21
+ 'does',
22
+ 'did',
23
+ 'doing',
24
+ 'will',
25
+ 'would',
26
+ 'could',
27
+ 'should',
28
+ 'shall',
29
+ 'may',
30
+ 'might',
31
+ 'can',
32
+ 'must',
33
+ 'to',
34
+ 'of',
35
+ 'in',
36
+ 'for',
37
+ 'on',
38
+ 'with',
39
+ 'at',
40
+ 'by',
41
+ 'from',
42
+ 'as',
43
+ 'into',
44
+ 'through',
45
+ 'during',
46
+ 'before',
47
+ 'after',
48
+ 'above',
49
+ 'below',
50
+ 'between',
51
+ 'out',
52
+ 'off',
53
+ 'over',
54
+ 'under',
55
+ 'again',
56
+ 'further',
57
+ 'then',
58
+ 'once',
59
+ 'here',
60
+ 'there',
61
+ 'when',
62
+ 'where',
63
+ 'why',
64
+ 'how',
65
+ 'all',
66
+ 'each',
67
+ 'every',
68
+ 'both',
69
+ 'few',
70
+ 'more',
71
+ 'most',
72
+ 'other',
73
+ 'some',
74
+ 'such',
75
+ 'no',
76
+ 'nor',
77
+ 'only',
78
+ 'own',
79
+ 'same',
80
+ 'so',
81
+ 'than',
82
+ 'too',
83
+ 'very',
84
+ 'just',
85
+ 'about',
86
+ 'up',
87
+ 'down',
88
+ 'if',
89
+ 'it',
90
+ 'its',
91
+ 'he',
92
+ 'she',
93
+ 'they',
94
+ 'them',
95
+ 'his',
96
+ 'her',
97
+ 'their',
98
+ 'we',
99
+ 'me',
100
+ 'him',
101
+ 'my',
102
+ 'your',
103
+ 'our',
104
+ 'this',
105
+ 'that',
106
+ 'these',
107
+ 'those',
108
+ 'i',
109
+ 'you',
110
+ 'what',
111
+ 'which',
112
+ 'who',
113
+ 'whom',
114
+ 'am',
115
+ ]);
116
+ function tokenize(text) {
117
+ return text
118
+ .toLowerCase()
119
+ .split(/[^a-z0-9]+/)
120
+ .filter((token) => token.length > 0 && !STOPWORDS.has(token));
121
+ }
122
+ /**
123
+ * Compute a recency decay multiplier using exponential decay.
124
+ * Half-life is in days — after `halfLifeDays`, the multiplier is 0.5.
125
+ * Returns a value in (0, 1] where 1 = now, 0.5 = halfLifeDays ago, etc.
126
+ * Floor of 0.1 ensures very old results aren't completely invisible.
127
+ */
128
+ export function recencyDecay(timestamp, halfLifeDays = 30) {
129
+ if (!timestamp)
130
+ return 0.5; // unknown age gets neutral weight
131
+ const ageMs = Date.now() - new Date(timestamp).getTime();
132
+ if (ageMs <= 0)
133
+ return 1.0;
134
+ const ageDays = ageMs / (1000 * 60 * 60 * 24);
135
+ const decay = Math.pow(0.5, ageDays / halfLifeDays);
136
+ return Math.max(decay, 0.1); // floor at 0.1
137
+ }
138
+ export class TfIdfIndex {
139
+ docs = new Map();
140
+ docFreq = new Map();
141
+ totalDocs = 0;
142
+ addDocument(id, text) {
143
+ if (this.docs.has(id)) {
144
+ const existing = this.docs.get(id);
145
+ for (const term of existing.termFreqs.keys()) {
146
+ const count = this.docFreq.get(term) ?? 0;
147
+ if (count <= 1) {
148
+ this.docFreq.delete(term);
149
+ }
150
+ else {
151
+ this.docFreq.set(term, count - 1);
152
+ }
153
+ }
154
+ this.totalDocs--;
155
+ }
156
+ const tokens = tokenize(text);
157
+ const termFreqs = new Map();
158
+ for (const token of tokens) {
159
+ termFreqs.set(token, (termFreqs.get(token) ?? 0) + 1);
160
+ }
161
+ this.docs.set(id, { termFreqs, totalTerms: tokens.length });
162
+ for (const term of termFreqs.keys()) {
163
+ this.docFreq.set(term, (this.docFreq.get(term) ?? 0) + 1);
164
+ }
165
+ this.totalDocs++;
166
+ }
167
+ search(query, maxResults) {
168
+ const queryTokens = tokenize(query);
169
+ if (queryTokens.length === 0 || this.totalDocs === 0) {
170
+ return [];
171
+ }
172
+ const results = [];
173
+ for (const [id, doc] of this.docs) {
174
+ let score = 0;
175
+ for (const term of queryTokens) {
176
+ const termCount = doc.termFreqs.get(term) ?? 0;
177
+ if (termCount === 0)
178
+ continue;
179
+ const tf = termCount / doc.totalTerms;
180
+ const docsWithTerm = this.docFreq.get(term) ?? 0;
181
+ const idf = Math.log(1 + this.totalDocs / docsWithTerm);
182
+ score += tf * idf;
183
+ }
184
+ if (score > 0) {
185
+ results.push({ id, score });
186
+ }
187
+ }
188
+ results.sort((a, b) => b.score - a.score);
189
+ if (maxResults !== undefined && maxResults > 0) {
190
+ return results.slice(0, maxResults);
191
+ }
192
+ return results;
193
+ }
194
+ clear() {
195
+ this.docs.clear();
196
+ this.docFreq.clear();
197
+ this.totalDocs = 0;
198
+ }
199
+ }
200
+ //# sourceMappingURL=tfidf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tfidf.js","sourceRoot":"","sources":["../../src/search/tfidf.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;IACxB,GAAG;IACH,IAAI;IACJ,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,MAAM;IACN,IAAI;IACJ,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,KAAK;IACL,QAAQ;IACR,IAAI;IACJ,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,KAAK;IACL,OAAO;IACP,KAAK;IACL,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,IAAI;IACJ,MAAM;IACN,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,KAAK;IACL,KAAK;IACL,MAAM;IACN,OAAO;IACP,OAAO;IACP,SAAS;IACT,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,IAAI;IACJ,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,IAAI;IACJ,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,KAAK;IACL,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,GAAG;IACH,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,IAAI;CACL,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAClE,CAAC;AAOD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,SAAwB,EAAE,eAAuB,EAAE;IAC9E,IAAI,CAAC,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,kCAAkC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACzD,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAC3B,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe;AAC9C,CAAC;AAED,MAAM,OAAO,UAAU;IACb,IAAI,GAA0B,IAAI,GAAG,EAAE,CAAC;IACxC,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IACzC,SAAS,GAAW,CAAC,CAAC;IAE9B,WAAW,CAAC,EAAU,EAAE,IAAY;QAClC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAE5D,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,UAAmB;QACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;YACrD,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAyC,EAAE,CAAC;QAEzD,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,SAAS,KAAK,CAAC;oBAAE,SAAS;gBAE9B,MAAM,EAAE,GAAG,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC;gBACtC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,CAAC;gBAExD,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC;YACpB,CAAC;YAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAE1C,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YAC/C,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ export interface SearchResult {
2
+ source: 'session' | 'knowledge';
3
+ id: string;
4
+ project?: string;
5
+ title?: string;
6
+ role?: string;
7
+ timestamp?: string;
8
+ excerpt: string;
9
+ score: number;
10
+ metadata?: Record<string, unknown>;
11
+ }
12
+ export interface SearchOptions {
13
+ query: string;
14
+ maxResults?: number;
15
+ caseSensitive?: boolean;
16
+ fuzzy?: boolean;
17
+ fuzzyThreshold?: number;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/search/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/search/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ export declare function createServer(): Server;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAsFnE,wBAAgB,YAAY,IAAI,MAAM,CA0erC"}