@sylphx/flow 1.1.0 → 1.2.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 +33 -0
- package/package.json +12 -2
- package/src/commands/hook-command.ts +10 -230
- package/src/composables/index.ts +0 -1
- package/src/config/servers.ts +35 -78
- package/src/core/interfaces.ts +0 -33
- package/src/domains/index.ts +0 -2
- package/src/index.ts +0 -4
- package/src/services/mcp-service.ts +0 -16
- package/src/targets/claude-code.ts +3 -9
- package/src/targets/functional/claude-code-logic.ts +4 -22
- package/src/targets/opencode.ts +0 -6
- package/src/types/mcp.types.ts +29 -38
- package/src/types/target.types.ts +0 -2
- package/src/types.ts +0 -1
- package/src/commands/codebase-command.ts +0 -168
- package/src/commands/knowledge-command.ts +0 -161
- package/src/composables/useTargetConfig.ts +0 -45
- package/src/core/formatting/bytes.test.ts +0 -115
- package/src/core/validation/limit.test.ts +0 -155
- package/src/core/validation/query.test.ts +0 -44
- package/src/domains/codebase/index.ts +0 -5
- package/src/domains/codebase/tools.ts +0 -139
- package/src/domains/knowledge/index.ts +0 -10
- package/src/domains/knowledge/resources.ts +0 -537
- package/src/domains/knowledge/tools.ts +0 -174
- package/src/services/search/base-indexer.ts +0 -156
- package/src/services/search/codebase-indexer-types.ts +0 -38
- package/src/services/search/codebase-indexer.ts +0 -647
- package/src/services/search/embeddings-provider.ts +0 -455
- package/src/services/search/embeddings.ts +0 -316
- package/src/services/search/functional-indexer.ts +0 -323
- package/src/services/search/index.ts +0 -27
- package/src/services/search/indexer.ts +0 -380
- package/src/services/search/knowledge-indexer.ts +0 -422
- package/src/services/search/semantic-search.ts +0 -244
- package/src/services/search/tfidf.ts +0 -559
- package/src/services/search/unified-search-service.ts +0 -888
- package/src/services/storage/cache-storage.ts +0 -487
- package/src/services/storage/drizzle-storage.ts +0 -581
- package/src/services/storage/index.ts +0 -15
- package/src/services/storage/lancedb-vector-storage.ts +0 -494
- package/src/services/storage/memory-storage.ts +0 -268
- package/src/services/storage/separated-storage.ts +0 -467
- package/src/services/storage/vector-storage.ts +0 -13
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Storage Implementation - 記憶存儲實現
|
|
3
|
-
* 專門處理需要持久化嘅 memory 數據(應該上 Git)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { and, count, desc, eq, like, or } from 'drizzle-orm';
|
|
7
|
-
import { type MemoryDatabase, MemoryDatabaseClient } from '../../db/memory-db.js';
|
|
8
|
-
import { memory } from '../../db/memory-schema.js';
|
|
9
|
-
|
|
10
|
-
// Memory entry interface
|
|
11
|
-
export interface MemoryEntry {
|
|
12
|
-
key: string;
|
|
13
|
-
namespace: string;
|
|
14
|
-
value: unknown;
|
|
15
|
-
timestamp: number;
|
|
16
|
-
created_at: string;
|
|
17
|
-
updated_at: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Memory storage implementation
|
|
22
|
-
*/
|
|
23
|
-
export class MemoryStorage {
|
|
24
|
-
private memoryDb: MemoryDatabaseClient;
|
|
25
|
-
private memory: MemoryDatabase;
|
|
26
|
-
|
|
27
|
-
constructor() {
|
|
28
|
-
this.memoryDb = new MemoryDatabaseClient();
|
|
29
|
-
this.memory = this.memoryDb.db;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
async initialize(): Promise<void> {
|
|
33
|
-
await this.memoryDb.initialize();
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Safely serialize a value to JSON string
|
|
38
|
-
*/
|
|
39
|
-
private safeSerialize(value: any): string {
|
|
40
|
-
try {
|
|
41
|
-
return JSON.stringify(value);
|
|
42
|
-
} catch (error) {
|
|
43
|
-
throw new Error(`Failed to serialize value: ${(error as Error).message}`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Safely deserialize a JSON string to value
|
|
49
|
-
*/
|
|
50
|
-
private safeDeserialize(jsonString: string): any {
|
|
51
|
-
try {
|
|
52
|
-
return JSON.parse(jsonString);
|
|
53
|
-
} catch (error) {
|
|
54
|
-
throw new Error(`Failed to deserialize value: ${(error as Error).message}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Set a memory entry
|
|
60
|
-
*/
|
|
61
|
-
async set(key: string, value: any, namespace = 'default'): Promise<void> {
|
|
62
|
-
const errorMessage = `Failed to set memory entry: ${namespace}:${key}`;
|
|
63
|
-
|
|
64
|
-
try {
|
|
65
|
-
const now = new Date().toISOString();
|
|
66
|
-
const timestamp = Date.now();
|
|
67
|
-
const serializedValue = this.safeSerialize(value);
|
|
68
|
-
|
|
69
|
-
// Check if entry exists
|
|
70
|
-
const existing = await this.memory
|
|
71
|
-
.select()
|
|
72
|
-
.from(memory)
|
|
73
|
-
.where(and(eq(memory.key, key), eq(memory.namespace, namespace)))
|
|
74
|
-
.limit(1);
|
|
75
|
-
|
|
76
|
-
if (existing.length > 0) {
|
|
77
|
-
// Update existing entry
|
|
78
|
-
await this.memory
|
|
79
|
-
.update(memory)
|
|
80
|
-
.set({
|
|
81
|
-
value: serializedValue,
|
|
82
|
-
timestamp,
|
|
83
|
-
updated_at: now,
|
|
84
|
-
})
|
|
85
|
-
.where(and(eq(memory.key, key), eq(memory.namespace, namespace)));
|
|
86
|
-
} else {
|
|
87
|
-
// Insert new entry
|
|
88
|
-
await this.memory.insert(memory).values({
|
|
89
|
-
key,
|
|
90
|
-
namespace,
|
|
91
|
-
value: serializedValue,
|
|
92
|
-
timestamp,
|
|
93
|
-
created_at: now,
|
|
94
|
-
updated_at: now,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
} catch (error) {
|
|
98
|
-
throw new Error(`${errorMessage}: ${(error as Error).message}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Get a memory entry
|
|
104
|
-
*/
|
|
105
|
-
async get(key: string, namespace = 'default'): Promise<MemoryEntry | null> {
|
|
106
|
-
const errorMessage = `Failed to get memory entry: ${namespace}:${key}`;
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
const result = await this.memory
|
|
110
|
-
.select()
|
|
111
|
-
.from(memory)
|
|
112
|
-
.where(and(eq(memory.key, key), eq(memory.namespace, namespace)))
|
|
113
|
-
.limit(1);
|
|
114
|
-
|
|
115
|
-
if (result.length === 0) {
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const entry = result[0];
|
|
120
|
-
return {
|
|
121
|
-
key: entry.key,
|
|
122
|
-
namespace: entry.namespace,
|
|
123
|
-
value: this.safeDeserialize(entry.value),
|
|
124
|
-
timestamp: entry.timestamp,
|
|
125
|
-
created_at: entry.created_at,
|
|
126
|
-
updated_at: entry.updated_at,
|
|
127
|
-
};
|
|
128
|
-
} catch (error) {
|
|
129
|
-
throw new Error(`${errorMessage}: ${(error as Error).message}`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Get all memory entries
|
|
135
|
-
*/
|
|
136
|
-
async getAll(namespace?: string): Promise<MemoryEntry[]> {
|
|
137
|
-
const errorMessage = 'Failed to get all memory entries';
|
|
138
|
-
|
|
139
|
-
try {
|
|
140
|
-
let query = this.memory.select().from(memory);
|
|
141
|
-
|
|
142
|
-
if (namespace && namespace !== 'all') {
|
|
143
|
-
query = query.where(eq(memory.namespace, namespace));
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const results = await query.orderBy(desc(memory.timestamp));
|
|
147
|
-
|
|
148
|
-
return results.map((entry) => ({
|
|
149
|
-
key: entry.key,
|
|
150
|
-
namespace: entry.namespace,
|
|
151
|
-
value: this.safeDeserialize(entry.value),
|
|
152
|
-
timestamp: entry.timestamp,
|
|
153
|
-
created_at: entry.created_at,
|
|
154
|
-
updated_at: entry.updated_at,
|
|
155
|
-
}));
|
|
156
|
-
} catch (error) {
|
|
157
|
-
throw new Error(`${errorMessage}: ${(error as Error).message}`);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Search memory entries
|
|
163
|
-
*/
|
|
164
|
-
async search(pattern: string, namespace?: string): Promise<MemoryEntry[]> {
|
|
165
|
-
const errorMessage = `Failed to search memory entries: ${pattern}`;
|
|
166
|
-
|
|
167
|
-
try {
|
|
168
|
-
let query = this.memory
|
|
169
|
-
.select()
|
|
170
|
-
.from(memory)
|
|
171
|
-
.where(or(like(memory.key, `%${pattern}%`), like(memory.value, `%${pattern}%`)));
|
|
172
|
-
|
|
173
|
-
if (namespace && namespace !== 'all') {
|
|
174
|
-
query = query.where(
|
|
175
|
-
and(
|
|
176
|
-
eq(memory.namespace, namespace),
|
|
177
|
-
or(like(memory.key, `%${pattern}%`), like(memory.value, `%${pattern}%`))
|
|
178
|
-
)
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const results = await query.orderBy(desc(memory.timestamp));
|
|
183
|
-
|
|
184
|
-
return results.map((entry) => ({
|
|
185
|
-
key: entry.key,
|
|
186
|
-
namespace: entry.namespace,
|
|
187
|
-
value: this.safeDeserialize(entry.value),
|
|
188
|
-
timestamp: entry.timestamp,
|
|
189
|
-
created_at: entry.created_at,
|
|
190
|
-
updated_at: entry.updated_at,
|
|
191
|
-
}));
|
|
192
|
-
} catch (error) {
|
|
193
|
-
throw new Error(`${errorMessage}: ${(error as Error).message}`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Delete a memory entry
|
|
199
|
-
*/
|
|
200
|
-
async delete(key: string, namespace = 'default'): Promise<boolean> {
|
|
201
|
-
const errorMessage = `Failed to delete memory entry: ${namespace}:${key}`;
|
|
202
|
-
|
|
203
|
-
try {
|
|
204
|
-
const _result = await this.memory
|
|
205
|
-
.delete(memory)
|
|
206
|
-
.where(and(eq(memory.key, key), eq(memory.namespace, namespace)));
|
|
207
|
-
|
|
208
|
-
// For libSQL, check if deletion was successful by trying to select the record
|
|
209
|
-
const exists = await this.memory
|
|
210
|
-
.select()
|
|
211
|
-
.from(memory)
|
|
212
|
-
.where(and(eq(memory.key, key), eq(memory.namespace, namespace)))
|
|
213
|
-
.limit(1);
|
|
214
|
-
|
|
215
|
-
return exists.length === 0;
|
|
216
|
-
} catch (error) {
|
|
217
|
-
throw new Error(`${errorMessage}: ${(error as Error).message}`);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Clear all memory entries in a namespace
|
|
223
|
-
*/
|
|
224
|
-
async clear(namespace = 'default'): Promise<void> {
|
|
225
|
-
const errorMessage = `Failed to clear memory namespace: ${namespace}`;
|
|
226
|
-
|
|
227
|
-
try {
|
|
228
|
-
await this.memory.delete(memory).where(eq(memory.namespace, namespace));
|
|
229
|
-
} catch (error) {
|
|
230
|
-
throw new Error(`${errorMessage}: ${(error as Error).message}`);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Get memory statistics
|
|
236
|
-
*/
|
|
237
|
-
async getStats(namespace?: string): Promise<{
|
|
238
|
-
totalEntries: number;
|
|
239
|
-
namespaces: string[];
|
|
240
|
-
}> {
|
|
241
|
-
const errorMessage = 'Failed to get memory statistics';
|
|
242
|
-
|
|
243
|
-
try {
|
|
244
|
-
let baseQuery = this.memory.select({ count: count() }).from(memory);
|
|
245
|
-
|
|
246
|
-
if (namespace && namespace !== 'all') {
|
|
247
|
-
baseQuery = baseQuery.where(eq(memory.namespace, namespace));
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
const totalResult = await baseQuery;
|
|
251
|
-
const totalEntries = totalResult[0]?.count || 0;
|
|
252
|
-
|
|
253
|
-
// Get unique namespaces
|
|
254
|
-
const namespaceResults = await this.memory
|
|
255
|
-
.selectDistinct({ namespace: memory.namespace })
|
|
256
|
-
.from(memory);
|
|
257
|
-
|
|
258
|
-
const namespaces = namespaceResults.map((row) => row.namespace);
|
|
259
|
-
|
|
260
|
-
return {
|
|
261
|
-
totalEntries,
|
|
262
|
-
namespaces,
|
|
263
|
-
};
|
|
264
|
-
} catch (error) {
|
|
265
|
-
throw new Error(`${errorMessage}: ${(error as Error).message}`);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|