@aitytech/agentkits-memory 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.
Files changed (116) hide show
  1. package/README.md +250 -0
  2. package/dist/cache-manager.d.ts +134 -0
  3. package/dist/cache-manager.d.ts.map +1 -0
  4. package/dist/cache-manager.js +407 -0
  5. package/dist/cache-manager.js.map +1 -0
  6. package/dist/cli/save.d.ts +20 -0
  7. package/dist/cli/save.d.ts.map +1 -0
  8. package/dist/cli/save.js +94 -0
  9. package/dist/cli/save.js.map +1 -0
  10. package/dist/cli/setup.d.ts +18 -0
  11. package/dist/cli/setup.d.ts.map +1 -0
  12. package/dist/cli/setup.js +163 -0
  13. package/dist/cli/setup.js.map +1 -0
  14. package/dist/cli/viewer.d.ts +21 -0
  15. package/dist/cli/viewer.d.ts.map +1 -0
  16. package/dist/cli/viewer.js +182 -0
  17. package/dist/cli/viewer.js.map +1 -0
  18. package/dist/hnsw-index.d.ts +111 -0
  19. package/dist/hnsw-index.d.ts.map +1 -0
  20. package/dist/hnsw-index.js +781 -0
  21. package/dist/hnsw-index.js.map +1 -0
  22. package/dist/hooks/cli.d.ts +20 -0
  23. package/dist/hooks/cli.d.ts.map +1 -0
  24. package/dist/hooks/cli.js +102 -0
  25. package/dist/hooks/cli.js.map +1 -0
  26. package/dist/hooks/context.d.ts +31 -0
  27. package/dist/hooks/context.d.ts.map +1 -0
  28. package/dist/hooks/context.js +64 -0
  29. package/dist/hooks/context.js.map +1 -0
  30. package/dist/hooks/index.d.ts +16 -0
  31. package/dist/hooks/index.d.ts.map +1 -0
  32. package/dist/hooks/index.js +20 -0
  33. package/dist/hooks/index.js.map +1 -0
  34. package/dist/hooks/observation.d.ts +30 -0
  35. package/dist/hooks/observation.d.ts.map +1 -0
  36. package/dist/hooks/observation.js +79 -0
  37. package/dist/hooks/observation.js.map +1 -0
  38. package/dist/hooks/service.d.ts +102 -0
  39. package/dist/hooks/service.d.ts.map +1 -0
  40. package/dist/hooks/service.js +454 -0
  41. package/dist/hooks/service.js.map +1 -0
  42. package/dist/hooks/session-init.d.ts +30 -0
  43. package/dist/hooks/session-init.d.ts.map +1 -0
  44. package/dist/hooks/session-init.js +54 -0
  45. package/dist/hooks/session-init.js.map +1 -0
  46. package/dist/hooks/summarize.d.ts +30 -0
  47. package/dist/hooks/summarize.d.ts.map +1 -0
  48. package/dist/hooks/summarize.js +74 -0
  49. package/dist/hooks/summarize.js.map +1 -0
  50. package/dist/hooks/types.d.ts +193 -0
  51. package/dist/hooks/types.d.ts.map +1 -0
  52. package/dist/hooks/types.js +137 -0
  53. package/dist/hooks/types.js.map +1 -0
  54. package/dist/index.d.ts +173 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +564 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/mcp/index.d.ts +9 -0
  59. package/dist/mcp/index.d.ts.map +1 -0
  60. package/dist/mcp/index.js +9 -0
  61. package/dist/mcp/index.js.map +1 -0
  62. package/dist/mcp/server.d.ts +22 -0
  63. package/dist/mcp/server.d.ts.map +1 -0
  64. package/dist/mcp/server.js +368 -0
  65. package/dist/mcp/server.js.map +1 -0
  66. package/dist/mcp/tools.d.ts +14 -0
  67. package/dist/mcp/tools.d.ts.map +1 -0
  68. package/dist/mcp/tools.js +110 -0
  69. package/dist/mcp/tools.js.map +1 -0
  70. package/dist/mcp/types.d.ts +100 -0
  71. package/dist/mcp/types.d.ts.map +1 -0
  72. package/dist/mcp/types.js +9 -0
  73. package/dist/mcp/types.js.map +1 -0
  74. package/dist/migration.d.ts +77 -0
  75. package/dist/migration.d.ts.map +1 -0
  76. package/dist/migration.js +457 -0
  77. package/dist/migration.js.map +1 -0
  78. package/dist/sqljs-backend.d.ts +128 -0
  79. package/dist/sqljs-backend.d.ts.map +1 -0
  80. package/dist/sqljs-backend.js +623 -0
  81. package/dist/sqljs-backend.js.map +1 -0
  82. package/dist/types.d.ts +481 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +73 -0
  85. package/dist/types.js.map +1 -0
  86. package/hooks.json +46 -0
  87. package/package.json +67 -0
  88. package/src/__tests__/index.test.ts +407 -0
  89. package/src/__tests__/sqljs-backend.test.ts +410 -0
  90. package/src/cache-manager.ts +515 -0
  91. package/src/cli/save.ts +109 -0
  92. package/src/cli/setup.ts +203 -0
  93. package/src/cli/viewer.ts +218 -0
  94. package/src/hnsw-index.ts +1013 -0
  95. package/src/hooks/__tests__/handlers.test.ts +298 -0
  96. package/src/hooks/__tests__/integration.test.ts +431 -0
  97. package/src/hooks/__tests__/service.test.ts +487 -0
  98. package/src/hooks/__tests__/types.test.ts +341 -0
  99. package/src/hooks/cli.ts +121 -0
  100. package/src/hooks/context.ts +77 -0
  101. package/src/hooks/index.ts +23 -0
  102. package/src/hooks/observation.ts +102 -0
  103. package/src/hooks/service.ts +582 -0
  104. package/src/hooks/session-init.ts +70 -0
  105. package/src/hooks/summarize.ts +89 -0
  106. package/src/hooks/types.ts +365 -0
  107. package/src/index.ts +755 -0
  108. package/src/mcp/__tests__/server.test.ts +181 -0
  109. package/src/mcp/index.ts +9 -0
  110. package/src/mcp/server.ts +441 -0
  111. package/src/mcp/tools.ts +113 -0
  112. package/src/mcp/types.ts +109 -0
  113. package/src/migration.ts +574 -0
  114. package/src/sql.js.d.ts +70 -0
  115. package/src/sqljs-backend.ts +789 -0
  116. package/src/types.ts +715 -0
package/README.md ADDED
@@ -0,0 +1,250 @@
1
+ # @agentkits/memory
2
+
3
+ Project-scoped memory system for AgentKits with SQLite storage and optional HNSW vector search.
4
+
5
+ ## Features
6
+
7
+ - **Project-Scoped Storage**: Memory is stored in `.claude/memory/memory.db` within your project
8
+ - **SQLite + WASM**: Cross-platform compatibility (Windows, macOS, Linux)
9
+ - **Optional Vector Search**: HNSW indexing for semantic similarity search
10
+ - **Session Tracking**: Track Claude Code sessions with checkpoints
11
+ - **Migration Support**: Migrate from existing `.claude/memory/*.md` files
12
+ - **Backward Compatible**: Export to markdown for git-friendly backups
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @agentkits/memory
18
+ # or
19
+ pnpm add @agentkits/memory
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ ```typescript
25
+ import { ProjectMemoryService } from '@agentkits/memory';
26
+
27
+ // Initialize memory for current project
28
+ const memory = new ProjectMemoryService('.claude/memory');
29
+ await memory.initialize();
30
+
31
+ // Store an entry
32
+ await memory.storeEntry({
33
+ key: 'auth-pattern',
34
+ content: 'Use JWT with refresh tokens for authentication',
35
+ namespace: 'patterns',
36
+ tags: ['auth', 'security'],
37
+ });
38
+
39
+ // Query entries
40
+ const patterns = await memory.query({
41
+ type: 'hybrid',
42
+ namespace: 'patterns',
43
+ tags: ['auth'],
44
+ limit: 10,
45
+ });
46
+
47
+ // Get by key
48
+ const entry = await memory.getByKey('patterns', 'auth-pattern');
49
+ ```
50
+
51
+ ## Session Management
52
+
53
+ ```typescript
54
+ // Start a new session
55
+ await memory.startSession();
56
+
57
+ // Create checkpoints during work
58
+ await memory.checkpoint('Completed authentication setup');
59
+ await memory.checkpoint('Added user registration');
60
+
61
+ // End session with summary
62
+ await memory.endSession('Successfully implemented auth flow');
63
+
64
+ // Get recent sessions
65
+ const sessions = await memory.getRecentSessions(5);
66
+ ```
67
+
68
+ ## Migration from Markdown
69
+
70
+ ```typescript
71
+ // Migrate existing .claude/memory/*.md files
72
+ const result = await memory.migrateFromMarkdown();
73
+ console.log(result.summary);
74
+ // Output: "Migrated 24/24 entries"
75
+ ```
76
+
77
+ ## Semantic Search (Optional)
78
+
79
+ ```typescript
80
+ import { createEmbeddingMemory } from '@agentkits/memory';
81
+
82
+ // Create memory with embedding support
83
+ const memory = createEmbeddingMemory(
84
+ '.claude/memory',
85
+ async (text) => {
86
+ // Your embedding function (e.g., OpenAI, local model)
87
+ return await embeddings.embed(text);
88
+ },
89
+ 384 // dimensions
90
+ );
91
+
92
+ await memory.initialize();
93
+
94
+ // Semantic search
95
+ const similar = await memory.semanticSearch('how to authenticate users', 5);
96
+ ```
97
+
98
+ ## Export to Markdown
99
+
100
+ ```typescript
101
+ // Export namespace to markdown (for git)
102
+ await memory.exportToMarkdown('patterns');
103
+ // Creates: .claude/memory/patterns.md
104
+
105
+ // Export all namespaces
106
+ const files = await memory.exportAllToMarkdown();
107
+ ```
108
+
109
+ ## Default Namespaces
110
+
111
+ The memory system uses these default namespaces (matching existing `.md` file structure):
112
+
113
+ | Namespace | Type | Purpose |
114
+ |-----------|------|---------|
115
+ | `context` | semantic | Project context and facts |
116
+ | `active-context` | episodic | Current work focus |
117
+ | `session-state` | episodic | Session handoff notes |
118
+ | `progress` | episodic | Feature tracking |
119
+ | `patterns` | semantic | Reusable code patterns |
120
+ | `decisions` | procedural | ADRs and decisions |
121
+ | `errors` | procedural | Error solutions |
122
+
123
+ ## API Reference
124
+
125
+ ### ProjectMemoryService
126
+
127
+ #### Configuration
128
+
129
+ ```typescript
130
+ interface ProjectMemoryConfig {
131
+ baseDir: string; // Default: '.claude/memory'
132
+ dbFilename: string; // Default: 'memory.db'
133
+ enableVectorIndex: boolean; // Default: false
134
+ dimensions: number; // Default: 384
135
+ embeddingGenerator?: EmbeddingGenerator;
136
+ cacheEnabled: boolean; // Default: true
137
+ cacheSize: number; // Default: 1000
138
+ cacheTtl: number; // Default: 300000 (5 min)
139
+ autoPersistInterval: number; // Default: 10000 (10 sec)
140
+ maxEntries: number; // Default: 100000
141
+ verbose: boolean; // Default: false
142
+ }
143
+ ```
144
+
145
+ #### Methods
146
+
147
+ | Method | Description |
148
+ |--------|-------------|
149
+ | `initialize()` | Initialize the memory service |
150
+ | `shutdown()` | Shutdown and persist changes |
151
+ | `store(entry)` | Store a memory entry |
152
+ | `storeEntry(input)` | Store from simple input |
153
+ | `get(id)` | Get entry by ID |
154
+ | `getByKey(namespace, key)` | Get entry by namespace and key |
155
+ | `update(id, update)` | Update an entry |
156
+ | `delete(id)` | Delete an entry |
157
+ | `query(query)` | Query entries with filters |
158
+ | `search(embedding, options)` | Vector similarity search |
159
+ | `semanticSearch(content, k)` | Search by content string |
160
+ | `count(namespace?)` | Count entries |
161
+ | `listNamespaces()` | List all namespaces |
162
+ | `clearNamespace(namespace)` | Clear a namespace |
163
+ | `startSession()` | Start new session |
164
+ | `checkpoint(description)` | Create checkpoint |
165
+ | `endSession(summary?)` | End current session |
166
+ | `migrateFromMarkdown()` | Migrate from .md files |
167
+ | `exportToMarkdown(namespace)` | Export to markdown |
168
+ | `getStats()` | Get statistics |
169
+ | `healthCheck()` | Health check |
170
+
171
+ ## Architecture
172
+
173
+ ```
174
+ .claude/memory/
175
+ ├── memory.db # SQLite database (primary storage)
176
+ ├── memory.db-wal # Write-ahead log (temp)
177
+ └── exports/ # Optional markdown exports
178
+ ├── patterns.md
179
+ ├── decisions.md
180
+ └── ...
181
+ ```
182
+
183
+ ## Performance
184
+
185
+ | Operation | Time |
186
+ |-----------|------|
187
+ | Store entry | <5ms |
188
+ | Get by ID | <2ms (cached: <0.1ms) |
189
+ | Query (100 results) | <10ms |
190
+ | Vector search (10k entries) | <5ms (with HNSW) |
191
+ | Migration (100 files) | <2s |
192
+
193
+ ## Claude Code Hooks (Auto-Capture)
194
+
195
+ The memory package includes a lightweight hook system for automatically capturing Claude Code sessions.
196
+
197
+ ### Quick Setup
198
+
199
+ 1. Install the package globally or in your project:
200
+ ```bash
201
+ npm install -g @agentkits/memory
202
+ # or
203
+ npm install @agentkits/memory
204
+ ```
205
+
206
+ 2. Copy the hooks configuration to your project:
207
+ ```bash
208
+ cp node_modules/@agentkits/memory/hooks.json .claude/hooks.json
209
+ ```
210
+
211
+ 3. Claude Code will now automatically:
212
+ - Inject previous session context on start
213
+ - Track all tool usage during the session
214
+ - Generate session summaries on exit
215
+
216
+ ### Hook Events
217
+
218
+ | Event | Trigger | Action |
219
+ |-------|---------|--------|
220
+ | `context` | SessionStart | Injects memory context |
221
+ | `session-init` | UserPromptSubmit | Initializes session record |
222
+ | `observation` | PostToolUse | Captures tool usage |
223
+ | `summarize` | Stop | Generates session summary |
224
+
225
+ ### Manual Hook Usage
226
+
227
+ ```typescript
228
+ import { createContextHook, createObservationHook } from '@agentkits/memory/hooks';
229
+
230
+ // Create hook handlers
231
+ const contextHook = createContextHook(process.cwd());
232
+ const observationHook = createObservationHook(process.cwd());
233
+
234
+ // Execute hooks
235
+ const result = await contextHook.execute(input);
236
+ ```
237
+
238
+ ### Database Location
239
+
240
+ Hook data is stored in `.claude/memory/hooks.db` within your project directory.
241
+
242
+ ### Skipped Tools
243
+
244
+ Internal tools that are not captured:
245
+ - `TodoWrite`, `TodoRead`
246
+ - `AskFollowupQuestion`, `AttemptCompletion`
247
+
248
+ ## License
249
+
250
+ MIT - Based on claude-flow memory system (AGPL-3.0)
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Cache Manager
3
+ *
4
+ * High-performance LRU cache with TTL support, memory pressure handling,
5
+ * and write-through caching for the unified memory system.
6
+ *
7
+ * @module @agentkits/memory/cache-manager
8
+ */
9
+ import { EventEmitter } from 'node:events';
10
+ import { CacheConfig, CacheStats, MemoryEntry } from './types.js';
11
+ /**
12
+ * High-performance LRU Cache with TTL support
13
+ *
14
+ * Features:
15
+ * - O(1) get, set, delete operations
16
+ * - LRU eviction policy
17
+ * - TTL-based expiration
18
+ * - Memory pressure handling
19
+ * - Write-through caching support
20
+ * - Performance statistics
21
+ */
22
+ export declare class CacheManager<T = MemoryEntry> extends EventEmitter {
23
+ private config;
24
+ private cache;
25
+ private head;
26
+ private tail;
27
+ private currentMemory;
28
+ private stats;
29
+ private cleanupInterval;
30
+ constructor(config?: Partial<CacheConfig>);
31
+ /**
32
+ * Get a value from the cache
33
+ */
34
+ get(key: string): T | null;
35
+ /**
36
+ * Set a value in the cache
37
+ */
38
+ set(key: string, data: T, ttl?: number): void;
39
+ /**
40
+ * Delete a value from the cache
41
+ */
42
+ delete(key: string): boolean;
43
+ /**
44
+ * Check if a key exists in the cache (without affecting LRU order)
45
+ */
46
+ has(key: string): boolean;
47
+ /**
48
+ * Clear all entries from the cache
49
+ */
50
+ clear(): void;
51
+ /**
52
+ * Get cache statistics
53
+ */
54
+ getStats(): CacheStats;
55
+ /**
56
+ * Get all keys in the cache
57
+ */
58
+ keys(): string[];
59
+ /**
60
+ * Get the size of the cache
61
+ */
62
+ get size(): number;
63
+ /**
64
+ * Prefetch multiple keys in a single batch
65
+ */
66
+ prefetch(keys: string[], loader: (keys: string[]) => Promise<Map<string, T>>, ttl?: number): Promise<void>;
67
+ /**
68
+ * Get or set pattern - get from cache or load and cache
69
+ */
70
+ getOrSet(key: string, loader: () => Promise<T>, ttl?: number): Promise<T>;
71
+ /**
72
+ * Warm the cache with initial data
73
+ */
74
+ warmUp(entries: Array<{
75
+ key: string;
76
+ data: T;
77
+ ttl?: number;
78
+ }>): void;
79
+ /**
80
+ * Invalidate entries matching a pattern
81
+ */
82
+ invalidatePattern(pattern: string | RegExp): number;
83
+ /**
84
+ * Shutdown the cache manager
85
+ */
86
+ shutdown(): void;
87
+ private mergeConfig;
88
+ private isExpired;
89
+ private estimateSize;
90
+ private addToFront;
91
+ private removeNode;
92
+ private moveToFront;
93
+ private evictLRU;
94
+ private startCleanupTimer;
95
+ private cleanupExpired;
96
+ }
97
+ /**
98
+ * Multi-layer cache with L1 (memory) and L2 (storage) tiers
99
+ */
100
+ export declare class TieredCacheManager<T = MemoryEntry> extends EventEmitter {
101
+ private l1Cache;
102
+ private l2Loader;
103
+ private l2Writer;
104
+ constructor(l1Config?: Partial<CacheConfig>, l2Options?: {
105
+ loader: (key: string) => Promise<T | null>;
106
+ writer?: (key: string, value: T) => Promise<void>;
107
+ });
108
+ /**
109
+ * Get from tiered cache
110
+ */
111
+ get(key: string): Promise<T | null>;
112
+ /**
113
+ * Set in tiered cache
114
+ */
115
+ set(key: string, value: T, ttl?: number): Promise<void>;
116
+ /**
117
+ * Delete from tiered cache
118
+ */
119
+ delete(key: string): boolean;
120
+ /**
121
+ * Get L1 cache statistics
122
+ */
123
+ getStats(): CacheStats;
124
+ /**
125
+ * Clear L1 cache
126
+ */
127
+ clear(): void;
128
+ /**
129
+ * Shutdown tiered cache
130
+ */
131
+ shutdown(): void;
132
+ }
133
+ export default CacheManager;
134
+ //# sourceMappingURL=cache-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../src/cache-manager.ts"],"names":[],"mappings":"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"}