@sylphx/flow 1.0.1 → 1.0.3

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 (229) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/package.json +10 -9
  3. package/src/commands/codebase-command.ts +168 -0
  4. package/src/commands/flow-command.ts +1137 -0
  5. package/src/commands/flow-orchestrator.ts +296 -0
  6. package/src/commands/hook-command.ts +444 -0
  7. package/src/commands/init-command.ts +92 -0
  8. package/src/commands/init-core.ts +322 -0
  9. package/src/commands/knowledge-command.ts +161 -0
  10. package/src/commands/run-command.ts +120 -0
  11. package/src/components/benchmark-monitor.tsx +331 -0
  12. package/src/components/reindex-progress.tsx +261 -0
  13. package/src/composables/functional/index.ts +14 -0
  14. package/src/composables/functional/useEnvironment.ts +171 -0
  15. package/src/composables/functional/useFileSystem.ts +139 -0
  16. package/src/composables/index.ts +5 -0
  17. package/src/composables/useEnv.ts +13 -0
  18. package/src/composables/useRuntimeConfig.ts +27 -0
  19. package/src/composables/useTargetConfig.ts +45 -0
  20. package/src/config/ai-config.ts +376 -0
  21. package/src/config/constants.ts +35 -0
  22. package/src/config/index.ts +27 -0
  23. package/src/config/rules.ts +43 -0
  24. package/src/config/servers.ts +371 -0
  25. package/src/config/targets.ts +126 -0
  26. package/src/core/agent-loader.ts +141 -0
  27. package/src/core/agent-manager.ts +174 -0
  28. package/src/core/ai-sdk.ts +603 -0
  29. package/src/core/app-factory.ts +381 -0
  30. package/src/core/builtin-agents.ts +9 -0
  31. package/src/core/command-system.ts +550 -0
  32. package/src/core/config-system.ts +550 -0
  33. package/src/core/connection-pool.ts +390 -0
  34. package/src/core/di-container.ts +155 -0
  35. package/src/core/error-handling.ts +519 -0
  36. package/src/core/formatting/bytes.test.ts +115 -0
  37. package/src/core/formatting/bytes.ts +64 -0
  38. package/src/core/functional/async.ts +313 -0
  39. package/src/core/functional/either.ts +109 -0
  40. package/src/core/functional/error-handler.ts +135 -0
  41. package/src/core/functional/error-types.ts +311 -0
  42. package/src/core/functional/index.ts +19 -0
  43. package/src/core/functional/option.ts +142 -0
  44. package/src/core/functional/pipe.ts +189 -0
  45. package/src/core/functional/result.ts +204 -0
  46. package/src/core/functional/validation.ts +138 -0
  47. package/src/core/headless-display.ts +96 -0
  48. package/src/core/index.ts +6 -0
  49. package/src/core/installers/file-installer.ts +303 -0
  50. package/src/core/installers/mcp-installer.ts +213 -0
  51. package/src/core/interfaces/index.ts +22 -0
  52. package/src/core/interfaces/repository.interface.ts +91 -0
  53. package/src/core/interfaces/service.interface.ts +133 -0
  54. package/src/core/interfaces.ts +129 -0
  55. package/src/core/loop-controller.ts +200 -0
  56. package/src/core/result.ts +351 -0
  57. package/src/core/rule-loader.ts +147 -0
  58. package/src/core/rule-manager.ts +240 -0
  59. package/src/core/service-config.ts +252 -0
  60. package/src/core/session-service.ts +121 -0
  61. package/src/core/state-detector.ts +389 -0
  62. package/src/core/storage-factory.ts +115 -0
  63. package/src/core/stream-handler.ts +288 -0
  64. package/src/core/target-manager.ts +161 -0
  65. package/src/core/type-utils.ts +427 -0
  66. package/src/core/unified-storage.ts +456 -0
  67. package/src/core/upgrade-manager.ts +300 -0
  68. package/src/core/validation/limit.test.ts +155 -0
  69. package/src/core/validation/limit.ts +46 -0
  70. package/src/core/validation/query.test.ts +44 -0
  71. package/src/core/validation/query.ts +20 -0
  72. package/src/db/auto-migrate.ts +322 -0
  73. package/src/db/base-database-client.ts +144 -0
  74. package/src/db/cache-db.ts +218 -0
  75. package/src/db/cache-schema.ts +75 -0
  76. package/src/db/database.ts +70 -0
  77. package/src/db/index.ts +252 -0
  78. package/src/db/memory-db.ts +153 -0
  79. package/src/db/memory-schema.ts +29 -0
  80. package/src/db/schema.ts +289 -0
  81. package/src/db/session-repository.ts +733 -0
  82. package/src/domains/codebase/index.ts +5 -0
  83. package/src/domains/codebase/tools.ts +139 -0
  84. package/src/domains/index.ts +8 -0
  85. package/src/domains/knowledge/index.ts +10 -0
  86. package/src/domains/knowledge/resources.ts +537 -0
  87. package/src/domains/knowledge/tools.ts +174 -0
  88. package/src/domains/utilities/index.ts +6 -0
  89. package/src/domains/utilities/time/index.ts +5 -0
  90. package/src/domains/utilities/time/tools.ts +291 -0
  91. package/src/index.ts +211 -0
  92. package/src/services/agent-service.ts +273 -0
  93. package/src/services/claude-config-service.ts +252 -0
  94. package/src/services/config-service.ts +258 -0
  95. package/src/services/evaluation-service.ts +271 -0
  96. package/src/services/functional/evaluation-logic.ts +296 -0
  97. package/src/services/functional/file-processor.ts +273 -0
  98. package/src/services/functional/index.ts +12 -0
  99. package/src/services/index.ts +13 -0
  100. package/src/services/mcp-service.ts +432 -0
  101. package/src/services/memory.service.ts +476 -0
  102. package/src/services/search/base-indexer.ts +156 -0
  103. package/src/services/search/codebase-indexer-types.ts +38 -0
  104. package/src/services/search/codebase-indexer.ts +647 -0
  105. package/src/services/search/embeddings-provider.ts +455 -0
  106. package/src/services/search/embeddings.ts +316 -0
  107. package/src/services/search/functional-indexer.ts +323 -0
  108. package/src/services/search/index.ts +27 -0
  109. package/src/services/search/indexer.ts +380 -0
  110. package/src/services/search/knowledge-indexer.ts +422 -0
  111. package/src/services/search/semantic-search.ts +244 -0
  112. package/src/services/search/tfidf.ts +559 -0
  113. package/src/services/search/unified-search-service.ts +888 -0
  114. package/src/services/smart-config-service.ts +385 -0
  115. package/src/services/storage/cache-storage.ts +487 -0
  116. package/src/services/storage/drizzle-storage.ts +581 -0
  117. package/src/services/storage/index.ts +15 -0
  118. package/src/services/storage/lancedb-vector-storage.ts +494 -0
  119. package/src/services/storage/memory-storage.ts +268 -0
  120. package/src/services/storage/separated-storage.ts +467 -0
  121. package/src/services/storage/vector-storage.ts +13 -0
  122. package/src/shared/agents/index.ts +63 -0
  123. package/src/shared/files/index.ts +99 -0
  124. package/src/shared/index.ts +32 -0
  125. package/src/shared/logging/index.ts +24 -0
  126. package/src/shared/processing/index.ts +153 -0
  127. package/src/shared/types/index.ts +25 -0
  128. package/src/targets/claude-code.ts +574 -0
  129. package/src/targets/functional/claude-code-logic.ts +185 -0
  130. package/src/targets/functional/index.ts +6 -0
  131. package/src/targets/opencode.ts +529 -0
  132. package/src/types/agent.types.ts +32 -0
  133. package/src/types/api/batch.ts +108 -0
  134. package/src/types/api/errors.ts +118 -0
  135. package/src/types/api/index.ts +55 -0
  136. package/src/types/api/requests.ts +76 -0
  137. package/src/types/api/responses.ts +180 -0
  138. package/src/types/api/websockets.ts +85 -0
  139. package/src/types/api.types.ts +9 -0
  140. package/src/types/benchmark.ts +49 -0
  141. package/src/types/cli.types.ts +87 -0
  142. package/src/types/common.types.ts +35 -0
  143. package/src/types/database.types.ts +510 -0
  144. package/src/types/mcp-config.types.ts +448 -0
  145. package/src/types/mcp.types.ts +69 -0
  146. package/src/types/memory-types.ts +63 -0
  147. package/src/types/provider.types.ts +28 -0
  148. package/src/types/rule.types.ts +24 -0
  149. package/src/types/session.types.ts +214 -0
  150. package/src/types/target-config.types.ts +295 -0
  151. package/src/types/target.types.ts +140 -0
  152. package/src/types/todo.types.ts +25 -0
  153. package/src/types.ts +40 -0
  154. package/src/utils/advanced-tokenizer.ts +191 -0
  155. package/src/utils/agent-enhancer.ts +114 -0
  156. package/src/utils/ai-model-fetcher.ts +19 -0
  157. package/src/utils/async-file-operations.ts +516 -0
  158. package/src/utils/audio-player.ts +345 -0
  159. package/src/utils/cli-output.ts +266 -0
  160. package/src/utils/codebase-helpers.ts +211 -0
  161. package/src/utils/console-ui.ts +79 -0
  162. package/src/utils/database-errors.ts +140 -0
  163. package/src/utils/debug-logger.ts +49 -0
  164. package/src/utils/error-handler.ts +53 -0
  165. package/src/utils/file-operations.ts +310 -0
  166. package/src/utils/file-scanner.ts +259 -0
  167. package/src/utils/functional/array.ts +355 -0
  168. package/src/utils/functional/index.ts +15 -0
  169. package/src/utils/functional/object.ts +279 -0
  170. package/src/utils/functional/string.ts +281 -0
  171. package/src/utils/functional.ts +543 -0
  172. package/src/utils/help.ts +20 -0
  173. package/src/utils/immutable-cache.ts +106 -0
  174. package/src/utils/index.ts +78 -0
  175. package/src/utils/jsonc.ts +158 -0
  176. package/src/utils/logger.ts +396 -0
  177. package/src/utils/mcp-config.ts +249 -0
  178. package/src/utils/memory-tui.ts +414 -0
  179. package/src/utils/models-dev.ts +91 -0
  180. package/src/utils/notifications.ts +169 -0
  181. package/src/utils/object-utils.ts +51 -0
  182. package/src/utils/parallel-operations.ts +487 -0
  183. package/src/utils/paths.ts +143 -0
  184. package/src/utils/process-manager.ts +155 -0
  185. package/src/utils/prompts.ts +120 -0
  186. package/src/utils/search-tool-builder.ts +214 -0
  187. package/src/utils/secret-utils.ts +179 -0
  188. package/src/utils/security.ts +537 -0
  189. package/src/utils/session-manager.ts +168 -0
  190. package/src/utils/session-title.ts +87 -0
  191. package/src/utils/settings.ts +182 -0
  192. package/src/utils/simplified-errors.ts +410 -0
  193. package/src/utils/sync-utils.ts +159 -0
  194. package/src/utils/target-config.ts +570 -0
  195. package/src/utils/target-utils.ts +394 -0
  196. package/src/utils/template-engine.ts +94 -0
  197. package/src/utils/test-audio.ts +71 -0
  198. package/src/utils/todo-context.ts +46 -0
  199. package/src/utils/token-counter.ts +288 -0
  200. package/dist/index.d.ts +0 -10
  201. package/dist/index.js +0 -59554
  202. package/dist/lancedb.linux-x64-gnu-b7f0jgsz.node +0 -0
  203. package/dist/lancedb.linux-x64-musl-tgcv22rx.node +0 -0
  204. package/dist/shared/chunk-25dwp0dp.js +0 -89
  205. package/dist/shared/chunk-3pjb6063.js +0 -208
  206. package/dist/shared/chunk-4d6ydpw7.js +0 -2854
  207. package/dist/shared/chunk-4wjcadjk.js +0 -225
  208. package/dist/shared/chunk-5j4w74t6.js +0 -30
  209. package/dist/shared/chunk-5j8m3dh3.js +0 -58
  210. package/dist/shared/chunk-5thh3qem.js +0 -91
  211. package/dist/shared/chunk-6g9xy73m.js +0 -252
  212. package/dist/shared/chunk-7eq34c42.js +0 -23
  213. package/dist/shared/chunk-c2gwgx3r.js +0 -115
  214. package/dist/shared/chunk-cjd3mk4c.js +0 -1320
  215. package/dist/shared/chunk-g5cv6703.js +0 -368
  216. package/dist/shared/chunk-hpkhykhq.js +0 -574
  217. package/dist/shared/chunk-m2322pdk.js +0 -122
  218. package/dist/shared/chunk-nd5fdvaq.js +0 -26
  219. package/dist/shared/chunk-pgd3m6zf.js +0 -108
  220. package/dist/shared/chunk-qk8n91hw.js +0 -494
  221. package/dist/shared/chunk-rkkn8szp.js +0 -16855
  222. package/dist/shared/chunk-t16rfxh0.js +0 -61
  223. package/dist/shared/chunk-t4fbfa5v.js +0 -19
  224. package/dist/shared/chunk-t77h86w6.js +0 -276
  225. package/dist/shared/chunk-v0ez4aef.js +0 -71
  226. package/dist/shared/chunk-v29j2r3s.js +0 -32051
  227. package/dist/shared/chunk-vfbc6ew5.js +0 -765
  228. package/dist/shared/chunk-vmeqwm1c.js +0 -204
  229. package/dist/shared/chunk-x66eh37x.js +0 -137
@@ -0,0 +1,268 @@
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
+ }