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.
- package/CHANGELOG.md +77 -0
- package/LICENSE +21 -0
- package/README.md +191 -0
- package/dist/dashboard.d.ts +4 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +434 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/embeddings/claude.d.ts +21 -0
- package/dist/embeddings/claude.d.ts.map +1 -0
- package/dist/embeddings/claude.js +84 -0
- package/dist/embeddings/claude.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +60 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/gemini.d.ts +21 -0
- package/dist/embeddings/gemini.d.ts.map +1 -0
- package/dist/embeddings/gemini.js +86 -0
- package/dist/embeddings/gemini.js.map +1 -0
- package/dist/embeddings/index.d.ts +4 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +3 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/local.d.ts +20 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +73 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/embeddings/openai.d.ts +20 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +84 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/types.d.ts +39 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +12 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/distill.d.ts +27 -0
- package/dist/knowledge/distill.d.ts.map +1 -0
- package/dist/knowledge/distill.js +407 -0
- package/dist/knowledge/distill.js.map +1 -0
- package/dist/knowledge/git.d.ts +30 -0
- package/dist/knowledge/git.d.ts.map +1 -0
- package/dist/knowledge/git.js +228 -0
- package/dist/knowledge/git.js.map +1 -0
- package/dist/knowledge/search.d.ts +20 -0
- package/dist/knowledge/search.d.ts.map +1 -0
- package/dist/knowledge/search.js +72 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/knowledge/store.d.ts +47 -0
- package/dist/knowledge/store.d.ts.map +1 -0
- package/dist/knowledge/store.js +173 -0
- package/dist/knowledge/store.js.map +1 -0
- package/dist/search/excerpt.d.ts +12 -0
- package/dist/search/excerpt.d.ts.map +1 -0
- package/dist/search/excerpt.js +28 -0
- package/dist/search/excerpt.js.map +1 -0
- package/dist/search/fuzzy.d.ts +15 -0
- package/dist/search/fuzzy.d.ts.map +1 -0
- package/dist/search/fuzzy.js +81 -0
- package/dist/search/fuzzy.js.map +1 -0
- package/dist/search/tfidf.d.ts +19 -0
- package/dist/search/tfidf.d.ts.map +1 -0
- package/dist/search/tfidf.js +200 -0
- package/dist/search/tfidf.js.map +1 -0
- package/dist/search/types.d.ts +19 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +2 -0
- package/dist/search/types.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +518 -0
- package/dist/server.js.map +1 -0
- package/dist/sessions/indexer.d.ts +15 -0
- package/dist/sessions/indexer.d.ts.map +1 -0
- package/dist/sessions/indexer.js +182 -0
- package/dist/sessions/indexer.js.map +1 -0
- package/dist/sessions/parser.d.ts +58 -0
- package/dist/sessions/parser.d.ts.map +1 -0
- package/dist/sessions/parser.js +142 -0
- package/dist/sessions/parser.js.map +1 -0
- package/dist/sessions/scopes.d.ts +16 -0
- package/dist/sessions/scopes.d.ts.map +1 -0
- package/dist/sessions/scopes.js +153 -0
- package/dist/sessions/scopes.js.map +1 -0
- package/dist/sessions/search.d.ts +26 -0
- package/dist/sessions/search.d.ts.map +1 -0
- package/dist/sessions/search.js +256 -0
- package/dist/sessions/search.js.map +1 -0
- package/dist/sessions/summary.d.ts +28 -0
- package/dist/sessions/summary.d.ts.map +1 -0
- package/dist/sessions/summary.js +135 -0
- package/dist/sessions/summary.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +109 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/app.js +1029 -0
- package/dist/ui/index.html +373 -0
- package/dist/ui/styles.css +1508 -0
- package/dist/ui/ui/app.js +811 -0
- package/dist/ui/ui/index.html +300 -0
- package/dist/ui/ui/styles.css +1154 -0
- package/dist/validate.d.ts +21 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +86 -0
- package/dist/validate.js.map +1 -0
- package/dist/vectorstore/chunker.d.ts +48 -0
- package/dist/vectorstore/chunker.d.ts.map +1 -0
- package/dist/vectorstore/chunker.js +165 -0
- package/dist/vectorstore/chunker.js.map +1 -0
- package/dist/vectorstore/index.d.ts +5 -0
- package/dist/vectorstore/index.d.ts.map +1 -0
- package/dist/vectorstore/index.js +3 -0
- package/dist/vectorstore/index.js.map +1 -0
- package/dist/vectorstore/store.d.ts +139 -0
- package/dist/vectorstore/store.d.ts.map +1 -0
- package/dist/vectorstore/store.js +500 -0
- package/dist/vectorstore/store.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/docs/ARCHITECTURE.md +244 -0
- package/docs/DASHBOARD.md +133 -0
- package/docs/SETUP.md +178 -0
- package/package.json +92 -0
- 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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/search/types.ts"],"names":[],"mappings":""}
|
package/dist/server.d.ts
ADDED
|
@@ -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"}
|