@vheins/local-memory-mcp 0.1.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/DASHBOARD.md +129 -0
- package/HYBRID_SEARCH.md +204 -0
- package/IMPLEMENTATION.md +159 -0
- package/README.md +175 -0
- package/dist/capabilities.d.ts +22 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +23 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/dashboard/dashboard.test.d.ts +2 -0
- package/dist/dashboard/dashboard.test.d.ts.map +1 -0
- package/dist/dashboard/dashboard.test.js +362 -0
- package/dist/dashboard/dashboard.test.js.map +1 -0
- package/dist/dashboard/public/app.js +1187 -0
- package/dist/dashboard/public/chart.js +0 -0
- package/dist/dashboard/public/index.html +967 -0
- package/dist/dashboard/server.d.ts +3 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +297 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/mcp/client.d.ts +34 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +181 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/client.test.d.ts +2 -0
- package/dist/mcp/client.test.d.ts.map +1 -0
- package/dist/mcp/client.test.js +130 -0
- package/dist/mcp/client.test.js.map +1 -0
- package/dist/prompts/registry.d.ts +39 -0
- package/dist/prompts/registry.d.ts.map +1 -0
- package/dist/prompts/registry.js +90 -0
- package/dist/prompts/registry.js.map +1 -0
- package/dist/resources/index.d.ts +17 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +100 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/index.test.d.ts +2 -0
- package/dist/resources/index.test.d.ts.map +1 -0
- package/dist/resources/index.test.js +96 -0
- package/dist/resources/index.test.js.map +1 -0
- package/dist/router.d.ts +4 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +60 -0
- package/dist/router.js.map +1 -0
- package/dist/router.test.d.ts +2 -0
- package/dist/router.test.d.ts.map +1 -0
- package/dist/router.test.js +113 -0
- package/dist/router.test.js.map +1 -0
- package/dist/search_memory_example.d.ts +3 -0
- package/dist/search_memory_example.d.ts.map +1 -0
- package/dist/search_memory_example.js +56 -0
- package/dist/search_memory_example.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +91 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/sqlite.d.ts +95 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +537 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/sqlite.test.d.ts +2 -0
- package/dist/storage/sqlite.test.d.ts.map +1 -0
- package/dist/storage/sqlite.test.js +358 -0
- package/dist/storage/sqlite.test.js.map +1 -0
- package/dist/storage/vectors.stub.d.ts +12 -0
- package/dist/storage/vectors.stub.d.ts.map +1 -0
- package/dist/storage/vectors.stub.js +88 -0
- package/dist/storage/vectors.stub.js.map +1 -0
- package/dist/store_memory_example.d.ts +3 -0
- package/dist/store_memory_example.d.ts.map +1 -0
- package/dist/store_memory_example.js +69 -0
- package/dist/store_memory_example.js.map +1 -0
- package/dist/test_quotes_client.d.ts +3 -0
- package/dist/test_quotes_client.d.ts.map +1 -0
- package/dist/test_quotes_client.js +72 -0
- package/dist/test_quotes_client.js.map +1 -0
- package/dist/tools/memory.delete.d.ts +9 -0
- package/dist/tools/memory.delete.d.ts.map +1 -0
- package/dist/tools/memory.delete.js +22 -0
- package/dist/tools/memory.delete.js.map +1 -0
- package/dist/tools/memory.recap.d.ts +4 -0
- package/dist/tools/memory.recap.d.ts.map +1 -0
- package/dist/tools/memory.recap.js +42 -0
- package/dist/tools/memory.recap.js.map +1 -0
- package/dist/tools/memory.search.d.ts +5 -0
- package/dist/tools/memory.search.d.ts.map +1 -0
- package/dist/tools/memory.search.js +192 -0
- package/dist/tools/memory.search.js.map +1 -0
- package/dist/tools/memory.search.test.d.ts +2 -0
- package/dist/tools/memory.search.test.d.ts.map +1 -0
- package/dist/tools/memory.search.test.js +181 -0
- package/dist/tools/memory.search.test.js.map +1 -0
- package/dist/tools/memory.store.d.ts +5 -0
- package/dist/tools/memory.store.d.ts.map +1 -0
- package/dist/tools/memory.store.js +41 -0
- package/dist/tools/memory.store.js.map +1 -0
- package/dist/tools/memory.summarize.d.ts +4 -0
- package/dist/tools/memory.summarize.d.ts.map +1 -0
- package/dist/tools/memory.summarize.js +13 -0
- package/dist/tools/memory.summarize.js.map +1 -0
- package/dist/tools/memory.update.d.ts +5 -0
- package/dist/tools/memory.update.d.ts.map +1 -0
- package/dist/tools/memory.update.js +31 -0
- package/dist/tools/memory.update.js.map +1 -0
- package/dist/tools/schemas.d.ts +334 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +251 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git-scope.d.ts +8 -0
- package/dist/utils/git-scope.d.ts.map +1 -0
- package/dist/utils/git-scope.js +38 -0
- package/dist/utils/git-scope.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logger.test.d.ts +2 -0
- package/dist/utils/logger.test.d.ts.map +1 -0
- package/dist/utils/logger.test.js +84 -0
- package/dist/utils/logger.test.js.map +1 -0
- package/dist/utils/mcp-response.d.ts +44 -0
- package/dist/utils/mcp-response.d.ts.map +1 -0
- package/dist/utils/mcp-response.js +81 -0
- package/dist/utils/mcp-response.js.map +1 -0
- package/dist/utils/normalize.d.ts +4 -0
- package/dist/utils/normalize.d.ts.map +1 -0
- package/dist/utils/normalize.js +51 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/utils/normalize.test.d.ts +2 -0
- package/dist/utils/normalize.test.d.ts.map +1 -0
- package/dist/utils/normalize.test.js +159 -0
- package/dist/utils/normalize.test.js.map +1 -0
- package/dist/utils/query-expander.d.ts +2 -0
- package/dist/utils/query-expander.d.ts.map +1 -0
- package/dist/utils/query-expander.js +50 -0
- package/dist/utils/query-expander.js.map +1 -0
- package/dist/utils/query-expander.test.d.ts +2 -0
- package/dist/utils/query-expander.test.d.ts.map +1 -0
- package/dist/utils/query-expander.test.js +35 -0
- package/dist/utils/query-expander.test.js.map +1 -0
- package/docs/PRD.md +199 -0
- package/docs/PROMPT-agent.md +139 -0
- package/docs/SPEC-git-scope.md +172 -0
- package/docs/SPEC-heuristics.md +199 -0
- package/docs/SPEC-server.md +243 -0
- package/docs/SPEC-skeleton.md +255 -0
- package/docs/SPEC-sqlite-schema.md +183 -0
- package/docs/SPEC-tool-schema.md +201 -0
- package/docs/SPEC-vector-search.md +198 -0
- package/docs/TEST-scenarios.md +179 -0
- package/package.json +43 -0
- package/scripts/update-null-titles-ai.mjs +272 -0
- package/scripts/update-titles-batch.mjs +71 -0
- package/scripts/update-titles.mjs +66 -0
- package/seed-data.mjs +151 -0
- package/src/capabilities.ts +22 -0
- package/src/dashboard/dashboard.test.ts +546 -0
- package/src/dashboard/public/app.js +1187 -0
- package/src/dashboard/public/chart.js +0 -0
- package/src/dashboard/public/index.html +967 -0
- package/src/dashboard/server.ts +347 -0
- package/src/mcp/client.test.ts +164 -0
- package/src/mcp/client.ts +212 -0
- package/src/prompts/registry.ts +89 -0
- package/src/resources/index.test.ts +132 -0
- package/src/resources/index.ts +113 -0
- package/src/router.test.ts +145 -0
- package/src/router.ts +80 -0
- package/src/server.ts +99 -0
- package/src/storage/sqlite.test.ts +504 -0
- package/src/storage/sqlite.ts +688 -0
- package/src/storage/vectors.stub.ts +101 -0
- package/src/tools/memory.delete.ts +37 -0
- package/src/tools/memory.recap.ts +61 -0
- package/src/tools/memory.search.test.ts +276 -0
- package/src/tools/memory.search.ts +244 -0
- package/src/tools/memory.store.ts +56 -0
- package/src/tools/memory.summarize.ts +23 -0
- package/src/tools/memory.update.ts +46 -0
- package/src/tools/schemas.ts +261 -0
- package/src/types.ts +36 -0
- package/src/utils/git-scope.ts +42 -0
- package/src/utils/logger.test.ts +125 -0
- package/src/utils/logger.ts +53 -0
- package/src/utils/mcp-response.ts +116 -0
- package/src/utils/normalize.test.ts +203 -0
- package/src/utils/normalize.ts +53 -0
- package/src/utils/query-expander.test.ts +40 -0
- package/src/utils/query-expander.ts +60 -0
- package/storage/.gitkeep +5 -0
- package/test.sh +48 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +10 -0
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
// Feature: memory-mcp-optimization
|
|
2
|
+
// Property tests for SQLiteStore ā Properties 1, 6, 7, 8, 9, 10, 18
|
|
3
|
+
import { describe, it, expect } from "vitest";
|
|
4
|
+
import * as fc from "fast-check";
|
|
5
|
+
import { SQLiteStore } from "./sqlite.js";
|
|
6
|
+
function makeEntry(overrides) {
|
|
7
|
+
const now = new Date().toISOString();
|
|
8
|
+
return {
|
|
9
|
+
id: overrides.id ?? `id-${Math.random().toString(36).slice(2)}`,
|
|
10
|
+
type: overrides.type ?? "code_fact",
|
|
11
|
+
title: overrides.title ?? "Test Memory Title",
|
|
12
|
+
content: overrides.content ?? "sample content for testing purposes",
|
|
13
|
+
importance: overrides.importance ?? 3,
|
|
14
|
+
scope: { repo: overrides.repo ?? "test-repo" },
|
|
15
|
+
created_at: overrides.created_at ?? now,
|
|
16
|
+
updated_at: now,
|
|
17
|
+
hit_count: 0,
|
|
18
|
+
recall_count: 0,
|
|
19
|
+
last_used_at: null,
|
|
20
|
+
expires_at: overrides.expires_at !== undefined ? overrides.expires_at : null,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function freshStore() {
|
|
24
|
+
return new SQLiteStore(":memory:");
|
|
25
|
+
}
|
|
26
|
+
// āāā Property 1: Pre-filter SQL membatasi kandidat searchBySimilarity āāāāāāāā
|
|
27
|
+
// Validates: Requirements 1.1, 1.2, 1.3, 1.4
|
|
28
|
+
describe("Property 1: Pre-filter SQL membatasi kandidat searchBySimilarity", () => {
|
|
29
|
+
// Feature: memory-mcp-optimization, Property 1: Pre-filter SQL membatasi kandidat searchBySimilarity
|
|
30
|
+
it("result.length <= limit for any repo with N > limit memories", () => {
|
|
31
|
+
fc.assert(fc.property(fc.integer({ min: 5, max: 30 }), // N memories
|
|
32
|
+
fc.integer({ min: 1, max: 4 }), // limit < N
|
|
33
|
+
fc.string({ minLength: 5, maxLength: 30 }), // query
|
|
34
|
+
(n, limit, query) => {
|
|
35
|
+
const store = freshStore();
|
|
36
|
+
const repo = "repo-p1";
|
|
37
|
+
for (let i = 0; i < n; i++) {
|
|
38
|
+
store.insert(makeEntry({
|
|
39
|
+
id: `p1-${i}`,
|
|
40
|
+
repo,
|
|
41
|
+
content: `memory content item number ${i} about coding patterns`,
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
const results = store.searchBySimilarity(query, repo, limit);
|
|
45
|
+
store.close();
|
|
46
|
+
return results.length <= limit;
|
|
47
|
+
}), { numRuns: 50 });
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
// āāā Property 6: Inisialisasi SQLiteStore berulang tidak melempar exception āā
|
|
51
|
+
// Validates: Requirements 7.1, 7.3, 7.4
|
|
52
|
+
describe("Property 6: Inisialisasi SQLiteStore berulang tidak melempar exception", () => {
|
|
53
|
+
// Feature: memory-mcp-optimization, Property 6: Inisialisasi SQLiteStore berulang tidak melempar exception
|
|
54
|
+
it("constructing SQLiteStore twice on :memory: does not throw", () => {
|
|
55
|
+
fc.assert(fc.property(fc.constant(":memory:"), (_path) => {
|
|
56
|
+
// Each :memory: DB is independent, so we test the migration logic
|
|
57
|
+
// by creating two stores (each runs migrate() on a fresh in-memory DB)
|
|
58
|
+
expect(() => {
|
|
59
|
+
const s1 = new SQLiteStore(":memory:");
|
|
60
|
+
s1.close();
|
|
61
|
+
}).not.toThrow();
|
|
62
|
+
expect(() => {
|
|
63
|
+
const s2 = new SQLiteStore(":memory:");
|
|
64
|
+
s2.close();
|
|
65
|
+
}).not.toThrow();
|
|
66
|
+
return true;
|
|
67
|
+
}), { numRuns: 20 });
|
|
68
|
+
});
|
|
69
|
+
it("migrate() is idempotent ā inserting then re-opening same store does not throw", () => {
|
|
70
|
+
// We simulate re-initialization by calling migrate logic twice via two stores
|
|
71
|
+
// on the same in-memory path (each :memory: is isolated, so we verify no throw)
|
|
72
|
+
const store1 = new SQLiteStore(":memory:");
|
|
73
|
+
store1.insert(makeEntry({ id: "m1", repo: "r1" }));
|
|
74
|
+
// A second store on :memory: is a fresh DB ā migration runs again safely
|
|
75
|
+
const store2 = new SQLiteStore(":memory:");
|
|
76
|
+
store2.insert(makeEntry({ id: "m2", repo: "r2" }));
|
|
77
|
+
store1.close();
|
|
78
|
+
store2.close();
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
// āāā Property 7: Pagination non-overlapping āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
82
|
+
// Validates: Requirements 8.2, 8.4
|
|
83
|
+
describe("Property 7: Pagination non-overlapping", () => {
|
|
84
|
+
// Feature: memory-mcp-optimization, Property 7: Pagination non-overlapping
|
|
85
|
+
it("pages i and j (i ā j) share no memory ids", () => {
|
|
86
|
+
fc.assert(fc.property(fc.integer({ min: 10, max: 40 }), // total memories N
|
|
87
|
+
fc.integer({ min: 2, max: 5 }), // page size L
|
|
88
|
+
fc.integer({ min: 0, max: 3 }), // page index i
|
|
89
|
+
fc.integer({ min: 0, max: 3 }), // page index j
|
|
90
|
+
(n, pageSize, i, j) => {
|
|
91
|
+
fc.pre(i !== j);
|
|
92
|
+
const store = freshStore();
|
|
93
|
+
const repo = "repo-p7";
|
|
94
|
+
for (let k = 0; k < n; k++) {
|
|
95
|
+
store.insert(makeEntry({
|
|
96
|
+
id: `p7-${k}`,
|
|
97
|
+
repo,
|
|
98
|
+
content: `memory item ${k} for pagination test`,
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
const pageI = store.getRecentMemories(repo, pageSize, i * pageSize);
|
|
102
|
+
const pageJ = store.getRecentMemories(repo, pageSize, j * pageSize);
|
|
103
|
+
store.close();
|
|
104
|
+
const idsI = new Set(pageI.map((m) => m.id));
|
|
105
|
+
const idsJ = new Set(pageJ.map((m) => m.id));
|
|
106
|
+
// No overlap
|
|
107
|
+
for (const id of idsI) {
|
|
108
|
+
if (idsJ.has(id))
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}), { numRuns: 100 });
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
// āāā Property 8: TTL menyimpan expires_at yang benar āāāāāāāāāāāāāāāāāāāāāāāāā
|
|
116
|
+
// Validates: Requirement 9.2
|
|
117
|
+
describe("Property 8: TTL menyimpan expires_at yang benar", () => {
|
|
118
|
+
// Feature: memory-mcp-optimization, Property 8: TTL menyimpan expires_at yang benar
|
|
119
|
+
it("expires_at equals created_at + ttlDays * 86400 seconds", () => {
|
|
120
|
+
fc.assert(fc.property(fc.integer({ min: 1, max: 365 }), // ttlDays
|
|
121
|
+
(ttlDays) => {
|
|
122
|
+
const store = freshStore();
|
|
123
|
+
const createdAt = new Date("2025-01-01T00:00:00.000Z");
|
|
124
|
+
const expectedExpiresAt = new Date(createdAt.getTime() + ttlDays * 86400 * 1000).toISOString();
|
|
125
|
+
const entry = makeEntry({
|
|
126
|
+
id: `p8-${ttlDays}`,
|
|
127
|
+
repo: "repo-p8",
|
|
128
|
+
created_at: createdAt.toISOString(),
|
|
129
|
+
expires_at: expectedExpiresAt,
|
|
130
|
+
});
|
|
131
|
+
store.insert(entry);
|
|
132
|
+
const retrieved = store.getById(entry.id);
|
|
133
|
+
store.close();
|
|
134
|
+
return retrieved?.expires_at === expectedExpiresAt;
|
|
135
|
+
}), { numRuns: 100 });
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
// āāā Property 9: Expired memories dikecualikan dari hasil pencarian āāāāāāāāāāā
|
|
139
|
+
// Validates: Requirements 9.3, 9.6
|
|
140
|
+
describe("Property 9: Expired memories dikecualikan dari hasil pencarian", () => {
|
|
141
|
+
// Feature: memory-mcp-optimization, Property 9: Expired memories dikecualikan dari hasil pencarian
|
|
142
|
+
it("searchBySimilarity does not return expired memories", () => {
|
|
143
|
+
fc.assert(fc.property(fc.string({ minLength: 5, maxLength: 20 }), // query
|
|
144
|
+
(query) => {
|
|
145
|
+
const store = freshStore();
|
|
146
|
+
const repo = "repo-p9-sim";
|
|
147
|
+
const pastDate = new Date(Date.now() - 86400 * 1000).toISOString(); // yesterday
|
|
148
|
+
store.insert(makeEntry({
|
|
149
|
+
id: "expired-sim",
|
|
150
|
+
repo,
|
|
151
|
+
content: `${query} expired content that should not appear`,
|
|
152
|
+
expires_at: pastDate,
|
|
153
|
+
}));
|
|
154
|
+
const results = store.searchBySimilarity(query, repo, 10);
|
|
155
|
+
store.close();
|
|
156
|
+
return !results.some((r) => r.id === "expired-sim");
|
|
157
|
+
}), { numRuns: 50 });
|
|
158
|
+
});
|
|
159
|
+
it("searchByRepo does not return expired memories", () => {
|
|
160
|
+
fc.assert(fc.property(fc.integer({ min: 1, max: 5 }), // importance
|
|
161
|
+
(importance) => {
|
|
162
|
+
const store = freshStore();
|
|
163
|
+
const repo = "repo-p9-byrepo";
|
|
164
|
+
const pastDate = new Date(Date.now() - 86400 * 1000).toISOString();
|
|
165
|
+
store.insert(makeEntry({
|
|
166
|
+
id: "expired-byrepo",
|
|
167
|
+
repo,
|
|
168
|
+
importance,
|
|
169
|
+
expires_at: pastDate,
|
|
170
|
+
}));
|
|
171
|
+
const results = store.searchByRepo(repo);
|
|
172
|
+
store.close();
|
|
173
|
+
return !results.some((r) => r.id === "expired-byrepo");
|
|
174
|
+
}), { numRuns: 50 });
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
// āāā Property 10: archiveExpiredMemories() idempoten āāāāāāāāāāāāāāāāāāāāāāāāā
|
|
178
|
+
// Validates: Requirement 9.5
|
|
179
|
+
describe("Property 10: archiveExpiredMemories() idempoten", () => {
|
|
180
|
+
// Feature: memory-mcp-optimization, Property 10: archiveExpiredMemories() idempoten
|
|
181
|
+
it("second call returns 0 when no new memories expired between calls", () => {
|
|
182
|
+
fc.assert(fc.property(fc.integer({ min: 1, max: 10 }), // number of expired memories
|
|
183
|
+
(n) => {
|
|
184
|
+
const store = freshStore();
|
|
185
|
+
const repo = "repo-p10";
|
|
186
|
+
const pastDate = new Date(Date.now() - 86400 * 1000).toISOString();
|
|
187
|
+
for (let i = 0; i < n; i++) {
|
|
188
|
+
store.insert(makeEntry({
|
|
189
|
+
id: `p10-${i}`,
|
|
190
|
+
repo,
|
|
191
|
+
expires_at: pastDate,
|
|
192
|
+
}));
|
|
193
|
+
}
|
|
194
|
+
const first = store.archiveExpiredMemories();
|
|
195
|
+
const second = store.archiveExpiredMemories();
|
|
196
|
+
store.close();
|
|
197
|
+
return first === n && second === 0;
|
|
198
|
+
}), { numRuns: 50 });
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
// āāā Property 18: listRepos() mengembalikan daftar unik dan terurut āāāāāāāāāāā
|
|
202
|
+
// Validates: Requirements 19.5, 19.6
|
|
203
|
+
describe("Property 18: listRepos() mengembalikan daftar unik dan terurut", () => {
|
|
204
|
+
// Feature: memory-mcp-optimization, Property 18: listRepos() mengembalikan daftar unik dan terurut
|
|
205
|
+
it("no duplicates and sorted ascending", () => {
|
|
206
|
+
fc.assert(fc.property(fc.array(fc.stringMatching(/^[a-z][a-z0-9-]{1,10}$/), { minLength: 2, maxLength: 10 }), (repos) => {
|
|
207
|
+
const store = freshStore();
|
|
208
|
+
repos.forEach((repo, i) => {
|
|
209
|
+
store.insert(makeEntry({
|
|
210
|
+
id: `p18-${i}-${repo}`,
|
|
211
|
+
repo,
|
|
212
|
+
}));
|
|
213
|
+
});
|
|
214
|
+
const result = store.listRepos();
|
|
215
|
+
store.close();
|
|
216
|
+
// No duplicates
|
|
217
|
+
const unique = new Set(result);
|
|
218
|
+
if (unique.size !== result.length)
|
|
219
|
+
return false;
|
|
220
|
+
// Sorted ascending
|
|
221
|
+
for (let i = 1; i < result.length; i++) {
|
|
222
|
+
if (result[i] < result[i - 1])
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
return true;
|
|
226
|
+
}), { numRuns: 100 });
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
// Property 19: Action Log functionality
|
|
230
|
+
describe("Property 19: Action Log stores and retrieves recent actions", () => {
|
|
231
|
+
it("logAction stores action with correct metadata", () => {
|
|
232
|
+
const store = freshStore();
|
|
233
|
+
store.logAction('search', "test-repo", { query: "test query", resultCount: 5 });
|
|
234
|
+
const actions = store.getRecentActions("test-repo", 10);
|
|
235
|
+
expect(actions).toHaveLength(1);
|
|
236
|
+
expect(actions[0].action).toBe("search");
|
|
237
|
+
expect(actions[0].query).toBe("test query");
|
|
238
|
+
});
|
|
239
|
+
it("getRecentActions returns actions in descending order by created_at", () => {
|
|
240
|
+
const store = freshStore();
|
|
241
|
+
store.logAction('search', "test-repo", { query: "first query", resultCount: 3 });
|
|
242
|
+
store.logAction('read', "test-repo", { memoryId: "id-1", resultCount: 2 });
|
|
243
|
+
store.logAction('write', "test-repo", { query: "third query", resultCount: 1 });
|
|
244
|
+
const actions = store.getRecentActions("test-repo", 10);
|
|
245
|
+
expect(actions[0].action).toBe("write");
|
|
246
|
+
expect(actions[1].action).toBe("read");
|
|
247
|
+
expect(actions[2].action).toBe("search");
|
|
248
|
+
});
|
|
249
|
+
it("getRecentActions limits results correctly", () => {
|
|
250
|
+
const store = freshStore();
|
|
251
|
+
for (let i = 0; i < 25; i++) {
|
|
252
|
+
store.logAction('search', "test-repo", { query: `query-${i}`, resultCount: i });
|
|
253
|
+
}
|
|
254
|
+
const actions = store.getRecentActions("test-repo", 10);
|
|
255
|
+
expect(actions).toHaveLength(10);
|
|
256
|
+
});
|
|
257
|
+
it("getRecentActions filters by repo correctly", () => {
|
|
258
|
+
const store = freshStore();
|
|
259
|
+
store.logAction('search', "repo1", { query: "repo1 query", resultCount: 1 });
|
|
260
|
+
store.logAction('search', "repo2", { query: "repo2 query", resultCount: 1 });
|
|
261
|
+
store.logAction('read', "repo1", { memoryId: "id-1", resultCount: 1 });
|
|
262
|
+
const repo1Actions = store.getRecentActions("repo1", 10);
|
|
263
|
+
const repo2Actions = store.getRecentActions("repo2", 10);
|
|
264
|
+
expect(repo1Actions).toHaveLength(2);
|
|
265
|
+
expect(repo2Actions).toHaveLength(1);
|
|
266
|
+
});
|
|
267
|
+
it("getRecentActions returns empty array when no actions exist", () => {
|
|
268
|
+
const store = freshStore();
|
|
269
|
+
const actions = store.getRecentActions("nonexistent-repo", 10);
|
|
270
|
+
expect(actions).toHaveLength(0);
|
|
271
|
+
});
|
|
272
|
+
it("getRecentActions without repo parameter returns all actions", () => {
|
|
273
|
+
const store = freshStore();
|
|
274
|
+
store.logAction('search', "repo1", { query: "query1", resultCount: 1 });
|
|
275
|
+
store.logAction('read', "repo2", { memoryId: "id-1", resultCount: 1 });
|
|
276
|
+
const allActions = store.getRecentActions(undefined, 10);
|
|
277
|
+
expect(allActions).toHaveLength(2);
|
|
278
|
+
});
|
|
279
|
+
it("logAction stores result_count correctly", () => {
|
|
280
|
+
const store = freshStore();
|
|
281
|
+
store.logAction('search', "test-repo", { query: "high results", resultCount: 100 });
|
|
282
|
+
store.logAction('search', "test-repo", { query: "low results", resultCount: 1 });
|
|
283
|
+
const actions = store.getRecentActions("test-repo", 10);
|
|
284
|
+
expect(actions[0].result_count).toBe(1);
|
|
285
|
+
expect(actions[1].result_count).toBe(100);
|
|
286
|
+
});
|
|
287
|
+
it("different action types are logged correctly", () => {
|
|
288
|
+
const store = freshStore();
|
|
289
|
+
store.logAction('search', "test-repo", { query: "search query", resultCount: 5 });
|
|
290
|
+
store.logAction('read', "test-repo", { memoryId: "mem-1", resultCount: 1 });
|
|
291
|
+
store.logAction('write', "test-repo", { query: "new memory", resultCount: 1 });
|
|
292
|
+
store.logAction('update', "test-repo", { memoryId: "mem-2", resultCount: 1 });
|
|
293
|
+
store.logAction('delete', "test-repo", { memoryId: "mem-3", resultCount: 1 });
|
|
294
|
+
const actions = store.getRecentActions("test-repo", 10);
|
|
295
|
+
expect(actions).toHaveLength(5);
|
|
296
|
+
expect(actions.map(a => a.action)).toEqual(['delete', 'update', 'write', 'read', 'search']);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
describe("Dashboard memory queries", () => {
|
|
300
|
+
it("listMemoriesForDashboard paginates, searches, and sorts server-side", () => {
|
|
301
|
+
const store = freshStore();
|
|
302
|
+
store.insert(makeEntry({
|
|
303
|
+
id: "dash-1",
|
|
304
|
+
repo: "repo-dashboard",
|
|
305
|
+
title: "Alpha Memory",
|
|
306
|
+
content: "alpha content",
|
|
307
|
+
importance: 5,
|
|
308
|
+
}));
|
|
309
|
+
store.insert(makeEntry({
|
|
310
|
+
id: "dash-2",
|
|
311
|
+
repo: "repo-dashboard",
|
|
312
|
+
title: "Beta Memory",
|
|
313
|
+
content: "beta content",
|
|
314
|
+
importance: 3,
|
|
315
|
+
}));
|
|
316
|
+
store.insert(makeEntry({
|
|
317
|
+
id: "dash-3",
|
|
318
|
+
repo: "repo-dashboard",
|
|
319
|
+
title: "Gamma Memory",
|
|
320
|
+
content: "gamma content",
|
|
321
|
+
importance: 4,
|
|
322
|
+
}));
|
|
323
|
+
store.incrementHitCount("dash-2");
|
|
324
|
+
store.incrementHitCount("dash-2");
|
|
325
|
+
store.incrementRecallCount("dash-2");
|
|
326
|
+
const result = store.listMemoriesForDashboard({
|
|
327
|
+
repo: "repo-dashboard",
|
|
328
|
+
search: "memory",
|
|
329
|
+
sortBy: "title",
|
|
330
|
+
sortOrder: "asc",
|
|
331
|
+
limit: 2,
|
|
332
|
+
offset: 0,
|
|
333
|
+
});
|
|
334
|
+
expect(result.total).toBe(3);
|
|
335
|
+
expect(result.items).toHaveLength(2);
|
|
336
|
+
expect(result.items[0].title).toBe("Alpha Memory");
|
|
337
|
+
expect(result.items[1].title).toBe("Beta Memory");
|
|
338
|
+
store.close();
|
|
339
|
+
});
|
|
340
|
+
it("getByIdWithStats returns recall_rate for detail views", () => {
|
|
341
|
+
const store = freshStore();
|
|
342
|
+
store.insert(makeEntry({
|
|
343
|
+
id: "detail-1",
|
|
344
|
+
repo: "repo-detail",
|
|
345
|
+
title: "Detail Memory",
|
|
346
|
+
content: "detail content",
|
|
347
|
+
}));
|
|
348
|
+
store.incrementHitCount("detail-1");
|
|
349
|
+
store.incrementHitCount("detail-1");
|
|
350
|
+
store.incrementRecallCount("detail-1");
|
|
351
|
+
const memory = store.getByIdWithStats("detail-1");
|
|
352
|
+
expect(memory).not.toBeNull();
|
|
353
|
+
expect(memory?.title).toBe("Detail Memory");
|
|
354
|
+
expect(memory?.recall_rate).toBe(0.5);
|
|
355
|
+
store.close();
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
//# sourceMappingURL=sqlite.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.test.js","sourceRoot":"","sources":["../../src/storage/sqlite.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { VectorStore, VectorResult } from "../types.js";
|
|
2
|
+
import { SQLiteStore } from "./sqlite.js";
|
|
3
|
+
export declare class StubVectorStore implements VectorStore {
|
|
4
|
+
private db;
|
|
5
|
+
constructor(db?: SQLiteStore);
|
|
6
|
+
private generateTextVector;
|
|
7
|
+
private calculateSimilarity;
|
|
8
|
+
upsert(id: string, text: string): Promise<void>;
|
|
9
|
+
remove(id: string): Promise<void>;
|
|
10
|
+
search(query: string, limit: number): Promise<VectorResult[]>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=vectors.stub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectors.stub.d.ts","sourceRoot":"","sources":["../../src/storage/vectors.stub.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,EAAE,CAAc;gBAEZ,EAAE,CAAC,EAAE,WAAW;IAQ5B,OAAO,CAAC,kBAAkB;IAsC1B,OAAO,CAAC,mBAAmB;IAarB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAiBpE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Simple vector store using SQLite - lightweight embeddings without ollama
|
|
2
|
+
export class StubVectorStore {
|
|
3
|
+
db;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
if (!db) {
|
|
6
|
+
throw new Error("SQLiteStore required for vector operations");
|
|
7
|
+
}
|
|
8
|
+
this.db = db;
|
|
9
|
+
}
|
|
10
|
+
// Generate simple text-based vector (TF-IDF style) without external embeddings
|
|
11
|
+
generateTextVector(text) {
|
|
12
|
+
const normalized = text.toLowerCase()
|
|
13
|
+
// Remove punctuation and special characters, but keep Indonesian characters
|
|
14
|
+
.replace(/[^\w\s\u00C0-\u017F]/g, ' ')
|
|
15
|
+
// Normalize multiple spaces to single space
|
|
16
|
+
.replace(/\s+/g, ' ')
|
|
17
|
+
.trim()
|
|
18
|
+
.split(/\s+/)
|
|
19
|
+
.filter(word => word.length > 2);
|
|
20
|
+
const stopwords = new Set([
|
|
21
|
+
// English stopwords
|
|
22
|
+
'the', 'is', 'at', 'which', 'on', 'and', 'or', 'but', 'for', 'with',
|
|
23
|
+
'to', 'from', 'by', 'as', 'in', 'of', 'a', 'an', 'be', 'this', 'that',
|
|
24
|
+
'are', 'was', 'were', 'been', 'have', 'has', 'had', 'do', 'does', 'did',
|
|
25
|
+
// Indonesian stopwords
|
|
26
|
+
'yang', 'di', 'ke', 'dari', 'untuk', 'dengan', 'oleh', 'pada', 'dalam', 'atas',
|
|
27
|
+
'bawah', 'depan', 'belakang', 'samping', 'sebelah', 'antara', 'diantara', 'melalui',
|
|
28
|
+
'selama', 'sampai', 'hingga', 'sejak', 'sebelum', 'sesudah', 'setelah', 'sebelumnya',
|
|
29
|
+
'kemudian', 'selanjutnya', 'lagi', 'juga', 'pun', 'bahkan', 'malah', 'bahwa',
|
|
30
|
+
'karena', 'sebab', 'oleh', 'karena', 'sehingga', 'maka', 'lalu', 'kemudian',
|
|
31
|
+
'saya', 'kamu', 'dia', 'kami', 'kalian', 'mereka', 'aku', 'engkau', 'ia', 'kita',
|
|
32
|
+
'anda', 'beliau', 'mereka', 'siapa', 'apa', 'dimana', 'kapan', 'bagaimana', 'mengapa',
|
|
33
|
+
'berapa', 'banyak', 'sedikit', 'semua', 'beberapa', 'banyak', 'sedikit', 'hampir',
|
|
34
|
+
'hanya', 'sudah', 'belum', 'masih', 'lagi', 'selalu', 'kadang', 'sering', 'jarang',
|
|
35
|
+
'pernah', 'belum', 'sudah', 'akan', 'sedang', 'telah', 'baru', 'lama', 'cepat',
|
|
36
|
+
'lambat', 'besar', 'kecil', 'panjang', 'pendek', 'tinggi', 'rendah', 'lebar', 'sempit',
|
|
37
|
+
'tebal', 'tipis', 'berat', 'ringan', 'kuat', 'lemah', 'baik', 'buruk', 'benar', 'salah',
|
|
38
|
+
'cantik', 'jelek', 'indah', 'buruk', 'bagus', 'jelek', 'suka', 'tidak', 'bukan',
|
|
39
|
+
'jangan', 'harus', 'boleh', 'bisa', 'mampu', 'dapat', 'mau', 'ingin', 'perlu', 'penting',
|
|
40
|
+
// Additional common Indonesian words
|
|
41
|
+
'dan', 'atau', 'tapi', 'namun', 'lalu', 'kemudian', 'jadi', 'maka', 'yaitu', 'yakni'
|
|
42
|
+
]);
|
|
43
|
+
return normalized.filter(word => !stopwords.has(word));
|
|
44
|
+
}
|
|
45
|
+
// Calculate similarity between two token sets
|
|
46
|
+
calculateSimilarity(tokens1, tokens2) {
|
|
47
|
+
if (tokens1.length === 0 || tokens2.length === 0)
|
|
48
|
+
return 0;
|
|
49
|
+
const set1 = new Set(tokens1);
|
|
50
|
+
const set2 = new Set(tokens2);
|
|
51
|
+
// Jaccard similarity: intersection / union
|
|
52
|
+
const intersection = new Set([...set1].filter(x => set2.has(x)));
|
|
53
|
+
const union = new Set([...set1, ...set2]);
|
|
54
|
+
return union.size > 0 ? intersection.size / union.size : 0;
|
|
55
|
+
}
|
|
56
|
+
async upsert(id, text) {
|
|
57
|
+
try {
|
|
58
|
+
// Generate simple vector from text tokens
|
|
59
|
+
const tokens = this.generateTextVector(text);
|
|
60
|
+
// Store tokens as JSON array for better retrieval
|
|
61
|
+
this.db.upsertVectorEmbedding(id, tokens);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error("Error upserting vector:", error);
|
|
65
|
+
// Silently fail - vector is optional for search fallback
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async remove(id) {
|
|
69
|
+
// Vectors are automatically removed by CASCADE when memory is deleted
|
|
70
|
+
}
|
|
71
|
+
async search(query, limit) {
|
|
72
|
+
try {
|
|
73
|
+
// Get all memories and compute similarity to query
|
|
74
|
+
const queryTokens = this.generateTextVector(query);
|
|
75
|
+
if (queryTokens.length === 0) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
// For now, return empty - we'll use similarity search in SQLite instead
|
|
79
|
+
// In production, you could implement approximate nearest neighbor search here
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error("Error searching vectors:", error);
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=vectors.stub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectors.stub.js","sourceRoot":"","sources":["../../src/storage/vectors.stub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store_memory_example.d.ts","sourceRoot":"","sources":["../src/store_memory_example.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { MCPClient } from "./mcp/client.js";
|
|
3
|
+
async function storeMemoryExample() {
|
|
4
|
+
const client = new MCPClient();
|
|
5
|
+
try {
|
|
6
|
+
console.log("Connecting to MCP server...");
|
|
7
|
+
await client.start();
|
|
8
|
+
console.log("Connected! ā");
|
|
9
|
+
// Example 1: Store a code fact
|
|
10
|
+
console.log("\nš Storing a code fact...");
|
|
11
|
+
const result1 = await client.callTool("memory-store", {
|
|
12
|
+
type: "code_fact",
|
|
13
|
+
content: "React hooks should be called at the top level of React functions, not inside loops, conditions, or nested functions.",
|
|
14
|
+
importance: 5,
|
|
15
|
+
scope: {
|
|
16
|
+
repo: "react-examples",
|
|
17
|
+
language: "typescript"
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
console.log(`ā Stored with ID: ${result1.id}`);
|
|
21
|
+
// Example 2: Store a decision
|
|
22
|
+
console.log("\nš Storing a decision...");
|
|
23
|
+
const result2 = await client.callTool("memory-store", {
|
|
24
|
+
type: "decision",
|
|
25
|
+
content: "Decided to use TypeScript for all new projects due to better type safety and developer experience.",
|
|
26
|
+
importance: 4,
|
|
27
|
+
scope: {
|
|
28
|
+
repo: "company-policies",
|
|
29
|
+
folder: "decisions"
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
console.log(`ā Stored with ID: ${result2.id}`);
|
|
33
|
+
// Example 3: Store a mistake
|
|
34
|
+
console.log("\nš Storing a mistake...");
|
|
35
|
+
const result3 = await client.callTool("memory-store", {
|
|
36
|
+
type: "mistake",
|
|
37
|
+
content: "Forgot to handle error cases in API calls, causing crashes in production. Always implement proper error handling.",
|
|
38
|
+
importance: 5,
|
|
39
|
+
scope: {
|
|
40
|
+
repo: "api-client",
|
|
41
|
+
language: "javascript"
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
console.log(`ā Stored with ID: ${result3.id}`);
|
|
45
|
+
// Example 4: Store a pattern
|
|
46
|
+
console.log("\nš Storing a pattern...");
|
|
47
|
+
const result4 = await client.callTool("memory-store", {
|
|
48
|
+
type: "pattern",
|
|
49
|
+
content: "Use the Repository pattern for data access to abstract database operations and make code more testable.",
|
|
50
|
+
importance: 3,
|
|
51
|
+
scope: {
|
|
52
|
+
repo: "architecture-patterns",
|
|
53
|
+
language: "csharp"
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
console.log(`ā Stored with ID: ${result4.id}`);
|
|
57
|
+
console.log("\nš All memories stored successfully!");
|
|
58
|
+
console.log("\nYou can now search for these memories using memory-search tool.");
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error("ā Error:", error);
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
client.stop();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Run the example
|
|
68
|
+
storeMemoryExample();
|
|
69
|
+
//# sourceMappingURL=store_memory_example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store_memory_example.js","sourceRoot":"","sources":["../src/store_memory_example.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,KAAK,UAAU,kBAAkB;IAC/B,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAE5B,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACpD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,sHAAsH;YAC/H,UAAU,EAAE,CAAC;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,YAAY;aACvB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,8BAA8B;QAC9B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACpD,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,oGAAoG;YAC7G,UAAU,EAAE,CAAC;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,kBAAkB;gBACxB,MAAM,EAAE,WAAW;aACpB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACpD,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,mHAAmH;YAC5H,UAAU,EAAE,CAAC;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,YAAY;aACvB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;YACpD,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,yGAAyG;YAClH,UAAU,EAAE,CAAC;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,QAAQ,EAAE,QAAQ;aACnB;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QAE/C,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IAEnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,kBAAkB;AAClB,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_quotes_client.d.ts","sourceRoot":"","sources":["../src/test_quotes_client.ts"],"names":[],"mappings":""}
|