@aitytech/agentkits-memory 1.0.1 → 2.0.1

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 (105) hide show
  1. package/README.md +54 -5
  2. package/dist/better-sqlite3-backend.d.ts +192 -0
  3. package/dist/better-sqlite3-backend.d.ts.map +1 -0
  4. package/dist/better-sqlite3-backend.js +801 -0
  5. package/dist/better-sqlite3-backend.js.map +1 -0
  6. package/dist/cli/save.js +0 -0
  7. package/dist/cli/setup.d.ts +6 -2
  8. package/dist/cli/setup.d.ts.map +1 -1
  9. package/dist/cli/setup.js +289 -42
  10. package/dist/cli/setup.js.map +1 -1
  11. package/dist/cli/viewer.js +25 -56
  12. package/dist/cli/viewer.js.map +1 -1
  13. package/dist/cli/web-viewer.d.ts +2 -1
  14. package/dist/cli/web-viewer.d.ts.map +1 -1
  15. package/dist/cli/web-viewer.js +791 -141
  16. package/dist/cli/web-viewer.js.map +1 -1
  17. package/dist/embeddings/embedding-cache.d.ts +131 -0
  18. package/dist/embeddings/embedding-cache.d.ts.map +1 -0
  19. package/dist/embeddings/embedding-cache.js +217 -0
  20. package/dist/embeddings/embedding-cache.js.map +1 -0
  21. package/dist/embeddings/index.d.ts +11 -0
  22. package/dist/embeddings/index.d.ts.map +1 -0
  23. package/dist/embeddings/index.js +11 -0
  24. package/dist/embeddings/index.js.map +1 -0
  25. package/dist/embeddings/local-embeddings.d.ts +140 -0
  26. package/dist/embeddings/local-embeddings.d.ts.map +1 -0
  27. package/dist/embeddings/local-embeddings.js +293 -0
  28. package/dist/embeddings/local-embeddings.js.map +1 -0
  29. package/dist/hooks/context.d.ts +6 -1
  30. package/dist/hooks/context.d.ts.map +1 -1
  31. package/dist/hooks/context.js +12 -2
  32. package/dist/hooks/context.js.map +1 -1
  33. package/dist/hooks/observation.d.ts +6 -1
  34. package/dist/hooks/observation.d.ts.map +1 -1
  35. package/dist/hooks/observation.js +12 -2
  36. package/dist/hooks/observation.js.map +1 -1
  37. package/dist/hooks/service.d.ts +1 -6
  38. package/dist/hooks/service.d.ts.map +1 -1
  39. package/dist/hooks/service.js +33 -85
  40. package/dist/hooks/service.js.map +1 -1
  41. package/dist/hooks/session-init.d.ts +6 -1
  42. package/dist/hooks/session-init.d.ts.map +1 -1
  43. package/dist/hooks/session-init.js +12 -2
  44. package/dist/hooks/session-init.js.map +1 -1
  45. package/dist/hooks/summarize.d.ts +6 -1
  46. package/dist/hooks/summarize.d.ts.map +1 -1
  47. package/dist/hooks/summarize.js +12 -2
  48. package/dist/hooks/summarize.js.map +1 -1
  49. package/dist/index.d.ts +10 -17
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +172 -94
  52. package/dist/index.js.map +1 -1
  53. package/dist/mcp/server.js +17 -3
  54. package/dist/mcp/server.js.map +1 -1
  55. package/dist/migration.js +3 -3
  56. package/dist/migration.js.map +1 -1
  57. package/dist/search/hybrid-search.d.ts +262 -0
  58. package/dist/search/hybrid-search.d.ts.map +1 -0
  59. package/dist/search/hybrid-search.js +688 -0
  60. package/dist/search/hybrid-search.js.map +1 -0
  61. package/dist/search/index.d.ts +13 -0
  62. package/dist/search/index.d.ts.map +1 -0
  63. package/dist/search/index.js +13 -0
  64. package/dist/search/index.js.map +1 -0
  65. package/dist/search/token-economics.d.ts +161 -0
  66. package/dist/search/token-economics.d.ts.map +1 -0
  67. package/dist/search/token-economics.js +239 -0
  68. package/dist/search/token-economics.js.map +1 -0
  69. package/dist/types.d.ts +0 -68
  70. package/dist/types.d.ts.map +1 -1
  71. package/dist/types.js.map +1 -1
  72. package/package.json +6 -4
  73. package/src/__tests__/better-sqlite3-backend.test.ts +1466 -0
  74. package/src/__tests__/cache-manager.test.ts +499 -0
  75. package/src/__tests__/embedding-integration.test.ts +481 -0
  76. package/src/__tests__/hnsw-index.test.ts +727 -0
  77. package/src/__tests__/index.test.ts +432 -0
  78. package/src/better-sqlite3-backend.ts +1000 -0
  79. package/src/cli/setup.ts +358 -47
  80. package/src/cli/viewer.ts +28 -63
  81. package/src/cli/web-viewer.ts +936 -182
  82. package/src/embeddings/__tests__/embedding-cache.test.ts +269 -0
  83. package/src/embeddings/__tests__/local-embeddings.test.ts +495 -0
  84. package/src/embeddings/embedding-cache.ts +318 -0
  85. package/src/embeddings/index.ts +20 -0
  86. package/src/embeddings/local-embeddings.ts +419 -0
  87. package/src/hooks/__tests__/handlers.test.ts +58 -17
  88. package/src/hooks/__tests__/integration.test.ts +77 -26
  89. package/src/hooks/context.ts +13 -2
  90. package/src/hooks/observation.ts +13 -2
  91. package/src/hooks/service.ts +39 -100
  92. package/src/hooks/session-init.ts +13 -2
  93. package/src/hooks/summarize.ts +13 -2
  94. package/src/index.ts +210 -116
  95. package/src/mcp/server.ts +20 -3
  96. package/src/search/__tests__/hybrid-search.test.ts +669 -0
  97. package/src/search/__tests__/token-economics.test.ts +276 -0
  98. package/src/search/hybrid-search.ts +968 -0
  99. package/src/search/index.ts +29 -0
  100. package/src/search/token-economics.ts +367 -0
  101. package/src/types.ts +0 -96
  102. package/src/__tests__/sqljs-backend.test.ts +0 -410
  103. package/src/migration.ts +0 -574
  104. package/src/sql.js.d.ts +0 -70
  105. package/src/sqljs-backend.ts +0 -789
package/README.md CHANGED
@@ -46,14 +46,13 @@
46
46
  | Feature | Benefit |
47
47
  |---------|---------|
48
48
  | **100% Local** | All data stays on your machine. No cloud, no API keys, no accounts |
49
- | **Blazing Fast** | SQLite + WASM = instant queries, zero latency |
49
+ | **Blazing Fast** | Native SQLite (better-sqlite3) = instant queries, zero latency |
50
50
  | **Zero Config** | Works out of the box. No database setup required |
51
51
  | **Cross-Platform** | Windows, macOS, Linux - same code, same speed |
52
52
  | **MCP Server** | `memory_save`, `memory_search`, `memory_recall`, `memory_list`, `memory_status` |
53
53
  | **Web Viewer** | Browser UI to view, add, edit, delete memories |
54
54
  | **Vector Search** | Optional HNSW semantic similarity (no external service) |
55
55
  | **Auto-Capture** | Hooks for session context, tool usage, summaries |
56
- | **Git-Friendly** | Export to markdown for version control |
57
56
 
58
57
  ---
59
58
 
@@ -220,12 +219,63 @@ Memories are stored in `.claude/memory/memory.db` within your project directory.
220
219
  ```
221
220
  .claude/memory/
222
221
  ├── memory.db # SQLite database
223
- ├── memory.db-wal # Write-ahead log (temp)
224
- └── exports/ # Optional markdown exports
222
+ └── memory.db-wal # Write-ahead log (temp)
225
223
  ```
226
224
 
227
225
  ---
228
226
 
227
+ ## CJK Language Support
228
+
229
+ AgentKits Memory has **automatic CJK support** for Chinese, Japanese, and Korean text search.
230
+
231
+ ### Zero Configuration
232
+
233
+ When `better-sqlite3` is installed (default), CJK search works automatically:
234
+
235
+ ```typescript
236
+ import { ProjectMemoryService } from '@aitytech/agentkits-memory';
237
+
238
+ const memory = new ProjectMemoryService('.claude/memory');
239
+ await memory.initialize();
240
+
241
+ // Store CJK content
242
+ await memory.storeEntry({
243
+ key: 'auth-pattern',
244
+ content: '認証機能の実装パターン - JWT with refresh tokens',
245
+ namespace: 'patterns',
246
+ });
247
+
248
+ // Search in Japanese, Chinese, or Korean - it just works!
249
+ const results = await memory.query({
250
+ type: 'hybrid',
251
+ content: '認証機能',
252
+ });
253
+ ```
254
+
255
+ ### How It Works
256
+
257
+ - **Native SQLite**: Uses `better-sqlite3` for maximum performance
258
+ - **Trigram tokenizer**: FTS5 with trigram creates 3-character sequences for CJK matching
259
+ - **Smart fallback**: Short CJK queries (< 3 chars) automatically use LIKE search
260
+ - **BM25 ranking**: Relevance scoring for search results
261
+
262
+ ### Advanced: Japanese Word Segmentation
263
+
264
+ For advanced Japanese with proper word segmentation, optionally use lindera:
265
+
266
+ ```typescript
267
+ import { createJapaneseOptimizedBackend } from '@aitytech/agentkits-memory';
268
+
269
+ const backend = createJapaneseOptimizedBackend({
270
+ databasePath: '.claude/memory/memory.db',
271
+ linderaPath: './path/to/liblindera_sqlite.dylib',
272
+ });
273
+ ```
274
+
275
+ Requires [lindera-sqlite](https://github.com/lindera/lindera-sqlite) build.
276
+
277
+ ---
278
+
229
279
  ## API Reference
230
280
 
231
281
  ### ProjectMemoryService
@@ -258,7 +308,6 @@ interface ProjectMemoryConfig {
258
308
  | `semanticSearch(content, k)` | Semantic similarity search |
259
309
  | `count(namespace?)` | Count entries |
260
310
  | `listNamespaces()` | List all namespaces |
261
- | `exportToMarkdown(namespace)` | Export to markdown |
262
311
  | `getStats()` | Get statistics |
263
312
 
264
313
  ---
@@ -0,0 +1,192 @@
1
+ /**
2
+ * BetterSqlite3Backend - Native SQLite with FTS5 Trigram for CJK Support
3
+ *
4
+ * Production-grade backend using better-sqlite3 (native SQLite).
5
+ * Provides:
6
+ * - FTS5 with trigram tokenizer for CJK (Japanese, Chinese, Korean)
7
+ * - BM25 ranking for relevance scoring
8
+ * - 10x faster than sql.js for large datasets
9
+ * - Proper word segmentation for all languages
10
+ *
11
+ * Requires:
12
+ * - Node.js environment (no browser support)
13
+ * - npm install better-sqlite3
14
+ *
15
+ * @module @agentkits/memory/better-sqlite3-backend
16
+ */
17
+ import { EventEmitter } from 'node:events';
18
+ import type Database from 'better-sqlite3';
19
+ import { IMemoryBackend, MemoryEntry, MemoryEntryUpdate, MemoryQuery, SearchOptions, SearchResult, BackendStats, HealthCheckResult, EmbeddingGenerator } from './types.js';
20
+ /**
21
+ * Configuration for BetterSqlite3 Backend
22
+ */
23
+ export interface BetterSqlite3BackendConfig {
24
+ /** Path to SQLite database file (:memory: for in-memory) */
25
+ databasePath: string;
26
+ /** Enable query optimization and WAL mode */
27
+ optimize: boolean;
28
+ /** Default namespace */
29
+ defaultNamespace: string;
30
+ /** Embedding generator for semantic search */
31
+ embeddingGenerator?: EmbeddingGenerator;
32
+ /** Maximum entries before auto-cleanup */
33
+ maxEntries: number;
34
+ /** Enable verbose logging */
35
+ verbose: boolean;
36
+ /**
37
+ * FTS5 tokenizer to use
38
+ * - 'trigram': Best for CJK (Japanese, Chinese, Korean) - works with all languages
39
+ * - 'unicode61': Standard tokenizer, good for English/Latin
40
+ * - 'porter': Stemming for English
41
+ */
42
+ ftsTokenizer: 'trigram' | 'unicode61' | 'porter';
43
+ /** Path to custom SQLite extension (e.g., lindera for advanced Japanese) */
44
+ extensionPath?: string;
45
+ /** Custom tokenizer name when using extension (e.g., 'lindera_tokenizer') */
46
+ customTokenizer?: string;
47
+ }
48
+ /**
49
+ * BetterSqlite3 Backend for Production Memory Storage
50
+ *
51
+ * Features:
52
+ * - Native SQLite performance (10x faster than sql.js)
53
+ * - FTS5 with trigram tokenizer for CJK language support
54
+ * - BM25 relevance ranking
55
+ * - WAL mode for concurrent reads
56
+ * - Optional extension loading (lindera, ICU, etc.)
57
+ */
58
+ export declare class BetterSqlite3Backend extends EventEmitter implements IMemoryBackend {
59
+ private config;
60
+ private db;
61
+ private initialized;
62
+ private ftsAvailable;
63
+ private stats;
64
+ constructor(config?: Partial<BetterSqlite3BackendConfig>);
65
+ /**
66
+ * Initialize the BetterSqlite3 backend
67
+ */
68
+ initialize(): Promise<void>;
69
+ /**
70
+ * Create the database schema
71
+ */
72
+ private createSchema;
73
+ /**
74
+ * Create FTS5 virtual table with appropriate tokenizer
75
+ */
76
+ private createFtsTable;
77
+ /**
78
+ * Get the active tokenizer being used
79
+ */
80
+ getActiveTokenizer(): string;
81
+ /**
82
+ * Check if FTS5 is available and CJK optimized
83
+ */
84
+ isFtsAvailable(): boolean;
85
+ /**
86
+ * Check if CJK is optimally supported (trigram or lindera)
87
+ */
88
+ isCjkOptimized(): boolean;
89
+ /**
90
+ * Shutdown the backend
91
+ */
92
+ shutdown(): Promise<void>;
93
+ /**
94
+ * Store a memory entry
95
+ */
96
+ store(entry: MemoryEntry): Promise<void>;
97
+ /**
98
+ * Retrieve a memory entry by ID
99
+ */
100
+ get(id: string): Promise<MemoryEntry | null>;
101
+ /**
102
+ * Retrieve a memory entry by key within a namespace
103
+ */
104
+ getByKey(namespace: string, key: string): Promise<MemoryEntry | null>;
105
+ /**
106
+ * Update a memory entry
107
+ */
108
+ update(id: string, update: MemoryEntryUpdate): Promise<MemoryEntry | null>;
109
+ /**
110
+ * Delete a memory entry
111
+ */
112
+ delete(id: string): Promise<boolean>;
113
+ /**
114
+ * Query memory entries
115
+ */
116
+ query(query: MemoryQuery): Promise<MemoryEntry[]>;
117
+ /**
118
+ * Full-text search using FTS5
119
+ */
120
+ searchFts(query: string, options?: {
121
+ namespace?: string;
122
+ limit?: number;
123
+ }): Promise<MemoryEntry[]>;
124
+ /**
125
+ * LIKE-based search fallback
126
+ */
127
+ private searchLike;
128
+ /**
129
+ * Sanitize query for FTS5
130
+ */
131
+ private sanitizeFtsQuery;
132
+ /**
133
+ * Semantic vector search
134
+ */
135
+ search(embedding: Float32Array, options: SearchOptions): Promise<SearchResult[]>;
136
+ /**
137
+ * Calculate cosine similarity between two vectors
138
+ */
139
+ private cosineSimilarity;
140
+ /**
141
+ * Bulk insert entries
142
+ */
143
+ bulkInsert(entries: MemoryEntry[]): Promise<void>;
144
+ /**
145
+ * Bulk delete entries
146
+ */
147
+ bulkDelete(ids: string[]): Promise<number>;
148
+ /**
149
+ * Get entry count
150
+ */
151
+ count(namespace?: string): Promise<number>;
152
+ /**
153
+ * List all namespaces
154
+ */
155
+ listNamespaces(): Promise<string[]>;
156
+ /**
157
+ * Clear all entries in a namespace
158
+ */
159
+ clearNamespace(namespace: string): Promise<number>;
160
+ /**
161
+ * Get backend statistics
162
+ */
163
+ getStats(): Promise<BackendStats>;
164
+ /**
165
+ * Perform health check
166
+ */
167
+ healthCheck(): Promise<HealthCheckResult>;
168
+ /**
169
+ * Get the underlying database for advanced operations
170
+ */
171
+ getDatabase(): Database.Database | null;
172
+ /**
173
+ * Rebuild FTS index
174
+ */
175
+ rebuildFtsIndex(): Promise<void>;
176
+ /**
177
+ * Convert database row to MemoryEntry
178
+ */
179
+ private rowToEntry;
180
+ }
181
+ /**
182
+ * Create a BetterSqlite3 backend with default CJK support
183
+ */
184
+ export declare function createBetterSqlite3Backend(config?: Partial<BetterSqlite3BackendConfig>): BetterSqlite3Backend;
185
+ /**
186
+ * Create a BetterSqlite3 backend with lindera extension for advanced Japanese
187
+ */
188
+ export declare function createJapaneseOptimizedBackend(config: Partial<BetterSqlite3BackendConfig> & {
189
+ linderaPath: string;
190
+ }): BetterSqlite3Backend;
191
+ export default BetterSqlite3Backend;
192
+ //# sourceMappingURL=better-sqlite3-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-sqlite3-backend.d.ts","sourceRoot":"","sources":["../src/better-sqlite3-backend.ts"],"names":[],"mappings":"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"}