jfl 0.1.0 → 0.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.
Files changed (262) hide show
  1. package/README.md +443 -145
  2. package/clawdbot-plugin/clawdbot.plugin.json +20 -0
  3. package/clawdbot-plugin/index.js +555 -0
  4. package/clawdbot-plugin/index.ts +582 -0
  5. package/clawdbot-skill/SKILL.md +33 -336
  6. package/clawdbot-skill/index.ts +491 -321
  7. package/clawdbot-skill/skill.json +4 -13
  8. package/dist/commands/clawdbot.d.ts +11 -0
  9. package/dist/commands/clawdbot.d.ts.map +1 -0
  10. package/dist/commands/clawdbot.js +215 -0
  11. package/dist/commands/clawdbot.js.map +1 -0
  12. package/dist/commands/context-hub.d.ts +5 -0
  13. package/dist/commands/context-hub.d.ts.map +1 -1
  14. package/dist/commands/context-hub.js +394 -28
  15. package/dist/commands/context-hub.js.map +1 -1
  16. package/dist/commands/gtm-process-update.d.ts +10 -0
  17. package/dist/commands/gtm-process-update.d.ts.map +1 -0
  18. package/dist/commands/gtm-process-update.js +101 -0
  19. package/dist/commands/gtm-process-update.js.map +1 -0
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +278 -4
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/login.d.ts.map +1 -1
  24. package/dist/commands/login.js +32 -33
  25. package/dist/commands/login.js.map +1 -1
  26. package/dist/commands/memory.d.ts +38 -0
  27. package/dist/commands/memory.d.ts.map +1 -0
  28. package/dist/commands/memory.js +229 -0
  29. package/dist/commands/memory.js.map +1 -0
  30. package/dist/commands/migrate-services.d.ts +8 -0
  31. package/dist/commands/migrate-services.d.ts.map +1 -0
  32. package/dist/commands/migrate-services.js +182 -0
  33. package/dist/commands/migrate-services.js.map +1 -0
  34. package/dist/commands/onboard.d.ts +24 -0
  35. package/dist/commands/onboard.d.ts.map +1 -0
  36. package/dist/commands/onboard.js +663 -0
  37. package/dist/commands/onboard.js.map +1 -0
  38. package/dist/commands/openclaw.d.ts +56 -0
  39. package/dist/commands/openclaw.d.ts.map +1 -0
  40. package/dist/commands/openclaw.js +700 -0
  41. package/dist/commands/openclaw.js.map +1 -0
  42. package/dist/commands/orchestrate.d.ts +14 -0
  43. package/dist/commands/orchestrate.d.ts.map +1 -0
  44. package/dist/commands/orchestrate.js +270 -0
  45. package/dist/commands/orchestrate.js.map +1 -0
  46. package/dist/commands/profile.d.ts +46 -0
  47. package/dist/commands/profile.d.ts.map +1 -0
  48. package/dist/commands/profile.js +498 -0
  49. package/dist/commands/profile.js.map +1 -0
  50. package/dist/commands/repair.d.ts.map +1 -1
  51. package/dist/commands/repair.js +37 -0
  52. package/dist/commands/repair.js.map +1 -1
  53. package/dist/commands/service-agent.d.ts +16 -0
  54. package/dist/commands/service-agent.d.ts.map +1 -0
  55. package/dist/commands/service-agent.js +375 -0
  56. package/dist/commands/service-agent.js.map +1 -0
  57. package/dist/commands/service-manager.d.ts +12 -0
  58. package/dist/commands/service-manager.d.ts.map +1 -0
  59. package/dist/commands/service-manager.js +967 -0
  60. package/dist/commands/service-manager.js.map +1 -0
  61. package/dist/commands/service-validate.d.ts +12 -0
  62. package/dist/commands/service-validate.d.ts.map +1 -0
  63. package/dist/commands/service-validate.js +611 -0
  64. package/dist/commands/service-validate.js.map +1 -0
  65. package/dist/commands/services-create.d.ts +15 -0
  66. package/dist/commands/services-create.d.ts.map +1 -0
  67. package/dist/commands/services-create.js +1452 -0
  68. package/dist/commands/services-create.js.map +1 -0
  69. package/dist/commands/services-scan.d.ts +13 -0
  70. package/dist/commands/services-scan.d.ts.map +1 -0
  71. package/dist/commands/services-scan.js +251 -0
  72. package/dist/commands/services-scan.js.map +1 -0
  73. package/dist/commands/services-sync-agents.d.ts +23 -0
  74. package/dist/commands/services-sync-agents.d.ts.map +1 -0
  75. package/dist/commands/services-sync-agents.js +207 -0
  76. package/dist/commands/services-sync-agents.js.map +1 -0
  77. package/dist/commands/services.d.ts +19 -0
  78. package/dist/commands/services.d.ts.map +1 -0
  79. package/dist/commands/services.js +742 -0
  80. package/dist/commands/services.js.map +1 -0
  81. package/dist/commands/session.d.ts +5 -1
  82. package/dist/commands/session.d.ts.map +1 -1
  83. package/dist/commands/session.js +68 -586
  84. package/dist/commands/session.js.map +1 -1
  85. package/dist/commands/status.d.ts.map +1 -1
  86. package/dist/commands/status.js +17 -0
  87. package/dist/commands/status.js.map +1 -1
  88. package/dist/commands/update.d.ts.map +1 -1
  89. package/dist/commands/update.js +75 -21
  90. package/dist/commands/update.js.map +1 -1
  91. package/dist/commands/validate-settings.d.ts +37 -0
  92. package/dist/commands/validate-settings.d.ts.map +1 -0
  93. package/dist/commands/validate-settings.js +197 -0
  94. package/dist/commands/validate-settings.js.map +1 -0
  95. package/dist/commands/voice.d.ts +0 -1
  96. package/dist/commands/voice.d.ts.map +1 -1
  97. package/dist/commands/voice.js +16 -15
  98. package/dist/commands/voice.js.map +1 -1
  99. package/dist/index.js +395 -141
  100. package/dist/index.js.map +1 -1
  101. package/dist/lib/agent-generator.d.ts +26 -0
  102. package/dist/lib/agent-generator.d.ts.map +1 -0
  103. package/dist/lib/agent-generator.js +331 -0
  104. package/dist/lib/agent-generator.js.map +1 -0
  105. package/dist/lib/memory-db.d.ts +102 -0
  106. package/dist/lib/memory-db.d.ts.map +1 -0
  107. package/dist/lib/memory-db.js +313 -0
  108. package/dist/lib/memory-db.js.map +1 -0
  109. package/dist/lib/memory-indexer.d.ts +47 -0
  110. package/dist/lib/memory-indexer.d.ts.map +1 -0
  111. package/dist/lib/memory-indexer.js +215 -0
  112. package/dist/lib/memory-indexer.js.map +1 -0
  113. package/dist/lib/memory-search.d.ts +41 -0
  114. package/dist/lib/memory-search.d.ts.map +1 -0
  115. package/dist/lib/memory-search.js +246 -0
  116. package/dist/lib/memory-search.js.map +1 -0
  117. package/dist/lib/openclaw-registry.d.ts +48 -0
  118. package/dist/lib/openclaw-registry.d.ts.map +1 -0
  119. package/dist/lib/openclaw-registry.js +181 -0
  120. package/dist/lib/openclaw-registry.js.map +1 -0
  121. package/dist/lib/openclaw-sdk.d.ts +107 -0
  122. package/dist/lib/openclaw-sdk.d.ts.map +1 -0
  123. package/dist/lib/openclaw-sdk.js +208 -0
  124. package/dist/lib/openclaw-sdk.js.map +1 -0
  125. package/dist/lib/peer-agent-generator.d.ts +44 -0
  126. package/dist/lib/peer-agent-generator.d.ts.map +1 -0
  127. package/dist/lib/peer-agent-generator.js +286 -0
  128. package/dist/lib/peer-agent-generator.js.map +1 -0
  129. package/dist/lib/service-dependencies.d.ts +44 -0
  130. package/dist/lib/service-dependencies.d.ts.map +1 -0
  131. package/dist/lib/service-dependencies.js +314 -0
  132. package/dist/lib/service-dependencies.js.map +1 -0
  133. package/dist/lib/service-detector.d.ts +61 -0
  134. package/dist/lib/service-detector.d.ts.map +1 -0
  135. package/dist/lib/service-detector.js +521 -0
  136. package/dist/lib/service-detector.js.map +1 -0
  137. package/dist/lib/service-gtm.d.ts +157 -0
  138. package/dist/lib/service-gtm.d.ts.map +1 -0
  139. package/dist/lib/service-gtm.js +786 -0
  140. package/dist/lib/service-gtm.js.map +1 -0
  141. package/dist/lib/service-mcp-base.d.ts +103 -0
  142. package/dist/lib/service-mcp-base.d.ts.map +1 -0
  143. package/dist/lib/service-mcp-base.js +263 -0
  144. package/dist/lib/service-mcp-base.js.map +1 -0
  145. package/dist/lib/service-utils.d.ts +103 -0
  146. package/dist/lib/service-utils.d.ts.map +1 -0
  147. package/dist/lib/service-utils.js +368 -0
  148. package/dist/lib/service-utils.js.map +1 -0
  149. package/dist/lib/skill-generator.d.ts +21 -0
  150. package/dist/lib/skill-generator.d.ts.map +1 -0
  151. package/dist/lib/skill-generator.js +253 -0
  152. package/dist/lib/skill-generator.js.map +1 -0
  153. package/dist/lib/stratus-client.d.ts +100 -0
  154. package/dist/lib/stratus-client.d.ts.map +1 -0
  155. package/dist/lib/stratus-client.js +255 -0
  156. package/dist/lib/stratus-client.js.map +1 -0
  157. package/dist/mcp/context-hub-mcp.js +135 -53
  158. package/dist/mcp/context-hub-mcp.js.map +1 -1
  159. package/dist/mcp/service-mcp-server.d.ts +12 -0
  160. package/dist/mcp/service-mcp-server.d.ts.map +1 -0
  161. package/dist/mcp/service-mcp-server.js +434 -0
  162. package/dist/mcp/service-mcp-server.js.map +1 -0
  163. package/dist/mcp/service-peer-mcp.d.ts +36 -0
  164. package/dist/mcp/service-peer-mcp.d.ts.map +1 -0
  165. package/dist/mcp/service-peer-mcp.js +220 -0
  166. package/dist/mcp/service-peer-mcp.js.map +1 -0
  167. package/dist/mcp/service-registry-mcp.d.ts +13 -0
  168. package/dist/mcp/service-registry-mcp.d.ts.map +1 -0
  169. package/dist/mcp/service-registry-mcp.js +330 -0
  170. package/dist/mcp/service-registry-mcp.js.map +1 -0
  171. package/dist/ui/banner.js +1 -1
  172. package/dist/ui/banner.js.map +1 -1
  173. package/dist/ui/context-hub-logs.d.ts +10 -0
  174. package/dist/ui/context-hub-logs.d.ts.map +1 -0
  175. package/dist/ui/context-hub-logs.js +175 -0
  176. package/dist/ui/context-hub-logs.js.map +1 -0
  177. package/dist/ui/service-dashboard.d.ts +11 -0
  178. package/dist/ui/service-dashboard.d.ts.map +1 -0
  179. package/dist/ui/service-dashboard.js +357 -0
  180. package/dist/ui/service-dashboard.js.map +1 -0
  181. package/dist/ui/services-manager.d.ts +11 -0
  182. package/dist/ui/services-manager.d.ts.map +1 -0
  183. package/dist/ui/services-manager.js +507 -0
  184. package/dist/ui/services-manager.js.map +1 -0
  185. package/dist/utils/auth-guard.d.ts.map +1 -1
  186. package/dist/utils/auth-guard.js +8 -9
  187. package/dist/utils/auth-guard.js.map +1 -1
  188. package/dist/utils/claude-md-generator.d.ts +10 -0
  189. package/dist/utils/claude-md-generator.d.ts.map +1 -0
  190. package/dist/utils/claude-md-generator.js +215 -0
  191. package/dist/utils/claude-md-generator.js.map +1 -0
  192. package/dist/utils/ensure-context-hub.d.ts +20 -0
  193. package/dist/utils/ensure-context-hub.d.ts.map +1 -0
  194. package/dist/utils/ensure-context-hub.js +65 -0
  195. package/dist/utils/ensure-context-hub.js.map +1 -0
  196. package/dist/utils/ensure-project.d.ts.map +1 -1
  197. package/dist/utils/ensure-project.js +3 -4
  198. package/dist/utils/ensure-project.js.map +1 -1
  199. package/dist/utils/jfl-config.d.ts +19 -0
  200. package/dist/utils/jfl-config.d.ts.map +1 -0
  201. package/dist/utils/jfl-config.js +112 -0
  202. package/dist/utils/jfl-config.js.map +1 -0
  203. package/dist/utils/jfl-migration.d.ts +29 -0
  204. package/dist/utils/jfl-migration.d.ts.map +1 -0
  205. package/dist/utils/jfl-migration.js +142 -0
  206. package/dist/utils/jfl-migration.js.map +1 -0
  207. package/dist/utils/jfl-paths.d.ts +55 -0
  208. package/dist/utils/jfl-paths.d.ts.map +1 -0
  209. package/dist/utils/jfl-paths.js +120 -0
  210. package/dist/utils/jfl-paths.js.map +1 -0
  211. package/dist/utils/settings-validator.d.ts +73 -0
  212. package/dist/utils/settings-validator.d.ts.map +1 -0
  213. package/dist/utils/settings-validator.js +222 -0
  214. package/dist/utils/settings-validator.js.map +1 -0
  215. package/package.json +19 -3
  216. package/scripts/commit-gtm.sh +56 -0
  217. package/scripts/commit-product.sh +68 -0
  218. package/scripts/context-query.sh +45 -0
  219. package/scripts/session/auto-commit.sh +297 -0
  220. package/scripts/session/jfl-doctor.sh +707 -0
  221. package/scripts/session/session-cleanup.sh +268 -0
  222. package/scripts/session/session-end.sh +198 -0
  223. package/scripts/session/session-init.sh +350 -0
  224. package/scripts/session/session-init.sh.backup +292 -0
  225. package/scripts/session/session-sync.sh +167 -0
  226. package/scripts/session/test-context-preservation.sh +160 -0
  227. package/scripts/session/test-critical-infrastructure.sh +293 -0
  228. package/scripts/session/test-experience-level.sh +336 -0
  229. package/scripts/session/test-session-cleanup.sh +268 -0
  230. package/scripts/session/test-session-sync.sh +320 -0
  231. package/scripts/voice-start.sh +36 -8
  232. package/scripts/where-am-i.sh +78 -0
  233. package/template/.claude/service-settings.json +32 -0
  234. package/template/.claude/settings.json +14 -1
  235. package/template/.claude/skills/end/SKILL.md +1780 -0
  236. package/template/.jfl/config.json +2 -1
  237. package/template/CLAUDE.md +1039 -134
  238. package/template/CLAUDE.md.bak +1187 -0
  239. package/template/scripts/commit-gtm.sh +56 -0
  240. package/template/scripts/commit-product.sh +68 -0
  241. package/template/scripts/migrate-to-branch-sessions.sh +201 -0
  242. package/template/scripts/session/auto-commit.sh +58 -6
  243. package/template/scripts/session/jfl-doctor.sh +137 -17
  244. package/template/scripts/session/session-cleanup.sh +268 -0
  245. package/template/scripts/session/session-end.sh +4 -0
  246. package/template/scripts/session/session-init.sh +253 -66
  247. package/template/scripts/session/test-critical-infrastructure.sh +293 -0
  248. package/template/scripts/session/test-experience-level.sh +336 -0
  249. package/template/scripts/session/test-session-cleanup.sh +268 -0
  250. package/template/scripts/session/test-session-sync.sh +320 -0
  251. package/template/scripts/where-am-i.sh +78 -0
  252. package/template/templates/service-agent/.claude/settings.json +32 -0
  253. package/template/templates/service-agent/CLAUDE.md +334 -0
  254. package/template/templates/service-agent/knowledge/ARCHITECTURE.md +115 -0
  255. package/template/templates/service-agent/knowledge/DEPLOYMENT.md +199 -0
  256. package/template/templates/service-agent/knowledge/RUNBOOK.md +412 -0
  257. package/template/templates/service-agent/knowledge/SERVICE_SPEC.md +77 -0
  258. package/dist/commands/session-mgmt.d.ts +0 -33
  259. package/dist/commands/session-mgmt.d.ts.map +0 -1
  260. package/dist/commands/session-mgmt.js +0 -404
  261. package/dist/commands/session-mgmt.js.map +0 -1
  262. package/template/scripts/session/auto-merge.sh +0 -325
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Memory Database Module
3
+ *
4
+ * SQLite database for indexed journal entries and memories.
5
+ * Provides schema initialization, CRUD operations, and query builders.
6
+ *
7
+ * @purpose Memory persistence and querying via SQLite
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import initSqlJs from 'sql.js';
12
+ let SQL = null;
13
+ let dbInstance = null;
14
+ let dbPath = null;
15
+ /**
16
+ * Initialize sql.js library
17
+ */
18
+ async function initSQL() {
19
+ if (SQL)
20
+ return;
21
+ SQL = await initSqlJs();
22
+ }
23
+ /**
24
+ * Get database path for current project
25
+ */
26
+ function getDbPath() {
27
+ return path.join(process.cwd(), '.jfl', 'memory.db');
28
+ }
29
+ /**
30
+ * Load or create database
31
+ */
32
+ async function loadDb() {
33
+ await initSQL();
34
+ const currentPath = getDbPath();
35
+ // If db instance exists and path matches, reuse it
36
+ if (dbInstance && dbPath === currentPath) {
37
+ return dbInstance;
38
+ }
39
+ // Check if database file exists
40
+ if (fs.existsSync(currentPath)) {
41
+ const buffer = fs.readFileSync(currentPath);
42
+ dbInstance = new SQL.Database(buffer);
43
+ }
44
+ else {
45
+ // Create new database
46
+ dbInstance = new SQL.Database();
47
+ }
48
+ dbPath = currentPath;
49
+ if (!dbInstance) {
50
+ throw new Error('Failed to create database instance');
51
+ }
52
+ return dbInstance;
53
+ }
54
+ /**
55
+ * Save database to disk
56
+ */
57
+ async function saveDb(db) {
58
+ const currentPath = getDbPath();
59
+ const data = db.export();
60
+ const buffer = Buffer.from(data);
61
+ // Ensure .jfl directory exists
62
+ const dir = path.dirname(currentPath);
63
+ if (!fs.existsSync(dir)) {
64
+ fs.mkdirSync(dir, { recursive: true });
65
+ }
66
+ fs.writeFileSync(currentPath, buffer);
67
+ }
68
+ /**
69
+ * Initialize database schema
70
+ */
71
+ export async function initializeDatabase() {
72
+ const db = await loadDb();
73
+ // Create memories table
74
+ db.run(`
75
+ CREATE TABLE IF NOT EXISTS memories (
76
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
77
+ source TEXT NOT NULL,
78
+ source_id TEXT,
79
+ type TEXT,
80
+ title TEXT NOT NULL,
81
+ content TEXT NOT NULL,
82
+ summary TEXT,
83
+ metadata TEXT,
84
+ created_at TEXT NOT NULL,
85
+ indexed_at TEXT NOT NULL,
86
+ embedding BLOB,
87
+ embedding_model TEXT,
88
+ tf_idf_tokens TEXT
89
+ )
90
+ `);
91
+ db.run(`CREATE INDEX IF NOT EXISTS idx_memories_source ON memories(source)`);
92
+ db.run(`CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type)`);
93
+ db.run(`CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at)`);
94
+ db.run(`CREATE INDEX IF NOT EXISTS idx_memories_source_id ON memories(source_id)`);
95
+ // Create tags table
96
+ db.run(`
97
+ CREATE TABLE IF NOT EXISTS tags (
98
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
99
+ memory_id INTEGER NOT NULL,
100
+ tag TEXT NOT NULL,
101
+ FOREIGN KEY (memory_id) REFERENCES memories(id) ON DELETE CASCADE
102
+ )
103
+ `);
104
+ db.run(`CREATE INDEX IF NOT EXISTS idx_tags_memory ON tags(memory_id)`);
105
+ db.run(`CREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag)`);
106
+ // Create links table
107
+ db.run(`
108
+ CREATE TABLE IF NOT EXISTS links (
109
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
110
+ from_memory_id INTEGER NOT NULL,
111
+ to_memory_id INTEGER NOT NULL,
112
+ link_type TEXT,
113
+ FOREIGN KEY (from_memory_id) REFERENCES memories(id) ON DELETE CASCADE,
114
+ FOREIGN KEY (to_memory_id) REFERENCES memories(id) ON DELETE CASCADE
115
+ )
116
+ `);
117
+ db.run(`CREATE INDEX IF NOT EXISTS idx_links_from ON links(from_memory_id)`);
118
+ db.run(`CREATE INDEX IF NOT EXISTS idx_links_to ON links(to_memory_id)`);
119
+ // Create meta table
120
+ db.run(`
121
+ CREATE TABLE IF NOT EXISTS meta (
122
+ key TEXT PRIMARY KEY,
123
+ value TEXT NOT NULL
124
+ )
125
+ `);
126
+ // Insert default meta values if not exists
127
+ const versionExists = db.exec(`SELECT value FROM meta WHERE key = 'version'`);
128
+ if (versionExists.length === 0) {
129
+ db.run(`INSERT INTO meta (key, value) VALUES ('version', '1')`);
130
+ db.run(`INSERT INTO meta (key, value) VALUES ('last_index', '${new Date().toISOString()}')`);
131
+ db.run(`INSERT INTO meta (key, value) VALUES ('embedding_model', 'text-embedding-3-small')`);
132
+ }
133
+ await saveDb(db);
134
+ }
135
+ /**
136
+ * Check if memory is already indexed
137
+ */
138
+ export async function isMemoryIndexed(sourceId, timestamp) {
139
+ const db = await loadDb();
140
+ const result = db.exec(`
141
+ SELECT id FROM memories
142
+ WHERE source_id = ? AND created_at = ?
143
+ `, [sourceId, timestamp]);
144
+ return result.length > 0 && result[0].values.length > 0;
145
+ }
146
+ /**
147
+ * Insert a memory
148
+ */
149
+ export async function insertMemory(memory) {
150
+ const db = await loadDb();
151
+ const now = new Date().toISOString();
152
+ // Serialize embedding if present
153
+ let embeddingBlob = null;
154
+ if (memory.embedding) {
155
+ embeddingBlob = Buffer.from(memory.embedding.buffer);
156
+ }
157
+ db.run(`
158
+ INSERT INTO memories (
159
+ source, source_id, type, title, content, summary,
160
+ metadata, created_at, indexed_at, embedding,
161
+ embedding_model, tf_idf_tokens
162
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
163
+ `, [
164
+ memory.source,
165
+ memory.source_id || null,
166
+ memory.type || null,
167
+ memory.title,
168
+ memory.content,
169
+ memory.summary || null,
170
+ memory.metadata ? JSON.stringify(memory.metadata) : null,
171
+ memory.created_at,
172
+ now,
173
+ embeddingBlob,
174
+ memory.embedding_model || null,
175
+ memory.tf_idf_tokens ? JSON.stringify(memory.tf_idf_tokens) : null
176
+ ]);
177
+ // Get last insert ID
178
+ const result = db.exec(`SELECT last_insert_rowid() as id`);
179
+ const id = result[0].values[0][0];
180
+ await saveDb(db);
181
+ return id;
182
+ }
183
+ /**
184
+ * Get all memories
185
+ */
186
+ export async function getAllMemories() {
187
+ const db = await loadDb();
188
+ const result = db.exec(`SELECT * FROM memories ORDER BY created_at DESC`);
189
+ if (result.length === 0 || result[0].values.length === 0) {
190
+ return [];
191
+ }
192
+ const columns = result[0].columns;
193
+ const rows = result[0].values;
194
+ return rows.map((row) => {
195
+ const memory = {};
196
+ columns.forEach((col, i) => {
197
+ memory[col] = row[i];
198
+ });
199
+ return memory;
200
+ });
201
+ }
202
+ /**
203
+ * Get memories by IDs
204
+ */
205
+ export async function getMemoriesByIds(ids) {
206
+ if (ids.length === 0)
207
+ return [];
208
+ const db = await loadDb();
209
+ const placeholders = ids.map(() => '?').join(',');
210
+ const result = db.exec(`SELECT * FROM memories WHERE id IN (${placeholders})`, ids);
211
+ if (result.length === 0 || result[0].values.length === 0) {
212
+ return [];
213
+ }
214
+ const columns = result[0].columns;
215
+ const rows = result[0].values;
216
+ return rows.map((row) => {
217
+ const memory = {};
218
+ columns.forEach((col, i) => {
219
+ memory[col] = row[i];
220
+ });
221
+ return memory;
222
+ });
223
+ }
224
+ /**
225
+ * Get memory statistics
226
+ */
227
+ export async function getMemoryStats() {
228
+ const db = await loadDb();
229
+ // Total count
230
+ const totalResult = db.exec(`SELECT COUNT(*) as total FROM memories`);
231
+ const total = totalResult[0].values[0][0];
232
+ // By type
233
+ const typeResult = db.exec(`SELECT type, COUNT(*) as count FROM memories GROUP BY type`);
234
+ const byType = {};
235
+ if (typeResult.length > 0) {
236
+ typeResult[0].values.forEach((row) => {
237
+ const type = row[0] || 'unknown';
238
+ const count = row[1];
239
+ byType[type] = count;
240
+ });
241
+ }
242
+ // Date range
243
+ const dateResult = db.exec(`
244
+ SELECT MIN(created_at) as earliest, MAX(created_at) as latest
245
+ FROM memories
246
+ `);
247
+ const earliest = dateResult[0].values[0][0] || null;
248
+ const latest = dateResult[0].values[0][1] || null;
249
+ // Embeddings
250
+ const embeddingResult = db.exec(`
251
+ SELECT COUNT(*) as count, embedding_model
252
+ FROM memories
253
+ WHERE embedding IS NOT NULL
254
+ `);
255
+ const embeddingCount = embeddingResult.length > 0 ? embeddingResult[0].values[0][0] : 0;
256
+ const embeddingModel = embeddingResult.length > 0 ? embeddingResult[0].values[0][1] : null;
257
+ // Last index
258
+ const metaResult = db.exec(`SELECT value FROM meta WHERE key = 'last_index'`);
259
+ const lastIndex = metaResult.length > 0 ? metaResult[0].values[0][0] : null;
260
+ return {
261
+ total_memories: total,
262
+ by_type: byType,
263
+ date_range: {
264
+ earliest,
265
+ latest
266
+ },
267
+ embeddings: {
268
+ available: embeddingCount > 0,
269
+ count: embeddingCount,
270
+ model: embeddingModel
271
+ },
272
+ last_index: lastIndex
273
+ };
274
+ }
275
+ /**
276
+ * Update last index timestamp
277
+ */
278
+ export async function setLastIndexTimestamp(timestamp) {
279
+ const db = await loadDb();
280
+ db.run(`
281
+ INSERT OR REPLACE INTO meta (key, value)
282
+ VALUES ('last_index', ?)
283
+ `, [timestamp]);
284
+ await saveDb(db);
285
+ }
286
+ /**
287
+ * Get last index timestamp
288
+ */
289
+ export async function getLastIndexTimestamp() {
290
+ const db = await loadDb();
291
+ const result = db.exec(`SELECT value FROM meta WHERE key = 'last_index'`);
292
+ if (result.length === 0 || result[0].values.length === 0) {
293
+ return null;
294
+ }
295
+ return result[0].values[0][0];
296
+ }
297
+ /**
298
+ * Deserialize embedding from buffer
299
+ */
300
+ export function deserializeEmbedding(buffer) {
301
+ return new Float32Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / 4);
302
+ }
303
+ /**
304
+ * Close database connection
305
+ */
306
+ export async function closeDatabase() {
307
+ if (dbInstance) {
308
+ dbInstance.close();
309
+ dbInstance = null;
310
+ dbPath = null;
311
+ }
312
+ }
313
+ //# sourceMappingURL=memory-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../../src/lib/memory-db.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,SAAuB,MAAM,QAAQ,CAAA;AA4D5C,IAAI,GAAG,GAAQ,IAAI,CAAA;AACnB,IAAI,UAAU,GAAoB,IAAI,CAAA;AACtC,IAAI,MAAM,GAAkB,IAAI,CAAA;AAEhC;;GAEG;AACH,KAAK,UAAU,OAAO;IACpB,IAAI,GAAG;QAAE,OAAM;IACf,GAAG,GAAG,MAAM,SAAS,EAAE,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,CAAA;AACtD,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,MAAM;IACnB,MAAM,OAAO,EAAE,CAAA;IAEf,MAAM,WAAW,GAAG,SAAS,EAAE,CAAA;IAE/B,mDAAmD;IACnD,IAAI,UAAU,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QACzC,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,gCAAgC;IAChC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAA;QAC3C,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACN,sBAAsB;QACtB,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAA;IACjC,CAAC;IAED,MAAM,GAAG,WAAW,CAAA;IAEpB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,MAAM,CAAC,EAAY;IAChC,MAAM,WAAW,GAAG,SAAS,EAAE,CAAA;IAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,EAAE,CAAA;IACxB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEhC,+BAA+B;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAA;IAEzB,wBAAwB;IACxB,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;GAgBN,CAAC,CAAA;IAEF,EAAE,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAA;IAC5E,EAAE,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;IACxE,EAAE,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAA;IACpF,EAAE,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAA;IAElF,oBAAoB;IACpB,EAAE,CAAC,GAAG,CAAC;;;;;;;GAON,CAAC,CAAA;IAEF,EAAE,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAA;IACvE,EAAE,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAA;IAE9D,qBAAqB;IACrB,EAAE,CAAC,GAAG,CAAC;;;;;;;;;GASN,CAAC,CAAA;IAEF,EAAE,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAA;IAC5E,EAAE,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;IAExE,oBAAoB;IACpB,EAAE,CAAC,GAAG,CAAC;;;;;GAKN,CAAC,CAAA;IAEF,2CAA2C;IAC3C,MAAM,aAAa,GAAG,EAAE,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;IAC7E,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;QAC/D,EAAE,CAAC,GAAG,CAAC,wDAAwD,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;QAC5F,EAAE,CAAC,GAAG,CAAC,oFAAoF,CAAC,CAAA;IAC9F,CAAC;IAED,MAAM,MAAM,CAAC,EAAE,CAAC,CAAA;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAiB;IACvE,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAA;IAEzB,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC;;;GAGtB,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;IAEzB,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAoB;IACrD,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAA;IAEzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAEpC,iCAAiC;IACjC,IAAI,aAAa,GAAG,IAAI,CAAA;IACxB,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACtD,CAAC;IAED,EAAE,CAAC,GAAG,CAAC;;;;;;GAMN,EAAE;QACD,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,SAAS,IAAI,IAAI;QACxB,MAAM,CAAC,IAAI,IAAI,IAAI;QACnB,MAAM,CAAC,KAAK;QACZ,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,OAAO,IAAI,IAAI;QACtB,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI;QACxD,MAAM,CAAC,UAAU;QACjB,GAAG;QACH,aAAa;QACb,MAAM,CAAC,eAAe,IAAI,IAAI;QAC9B,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;KACnE,CAAC,CAAA;IAEF,qBAAqB;IACrB,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;IAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;IAE3C,MAAM,MAAM,CAAC,EAAE,CAAC,CAAA;IAEhB,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAA;IAEzB,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAEzE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAE7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAQ,EAAE,CAAA;QACtB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,CAAS,EAAE,EAAE;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QACF,OAAO,MAAgB,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAa;IAClD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAE/B,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAA;IACzB,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEjD,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,uCAAuC,YAAY,GAAG,EAAE,GAAG,CAAC,CAAA;IAEnF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAE7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAQ,EAAE,CAAA;QACtB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,CAAS,EAAE,EAAE;YACzC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QACF,OAAO,MAAgB,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAA;IAEzB,cAAc;IACd,MAAM,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IACrE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;IAEnD,UAAU;IACV,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAA;IACxF,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAW,IAAI,SAAS,CAAA;YAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAW,CAAA;YAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;QACtB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,aAAa;IACb,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC;;;GAG1B,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,IAAI,IAAI,CAAA;IAC7D,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,IAAI,IAAI,CAAA;IAE3D,aAAa;IACb,MAAM,eAAe,GAAG,EAAE,CAAC,IAAI,CAAC;;;;GAI/B,CAAC,CAAA;IACF,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IACjG,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,CAAC,IAAI,CAAA;IAEpG,aAAa;IACb,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAC7E,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC,CAAC,IAAI,CAAA;IAErF,OAAO;QACL,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,MAAM;QACf,UAAU,EAAE;YACV,QAAQ;YACR,MAAM;SACP;QACD,UAAU,EAAE;YACV,SAAS,EAAE,cAAc,GAAG,CAAC;YAC7B,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,cAAc;SACtB;QACD,UAAU,EAAE,SAAS;KACtB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB;IAC3D,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAA;IAEzB,EAAE,CAAC,GAAG,CAAC;;;GAGN,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAEf,MAAM,MAAM,CAAC,EAAE,CAAC,CAAA;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAA;IAEzB,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IAEzE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,CAAA;QAClB,UAAU,GAAG,IAAI,CAAA;QACjB,MAAM,GAAG,IAAI,CAAA;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Memory Indexer Module
3
+ *
4
+ * Indexes journal entries into the memory database.
5
+ * Runs periodically and on-demand to keep memory system up-to-date.
6
+ *
7
+ * @purpose Automatic indexing of journal entries
8
+ */
9
+ export interface JournalEntry {
10
+ v: number;
11
+ ts: string;
12
+ session: string;
13
+ type?: string;
14
+ status?: string;
15
+ title: string;
16
+ summary?: string;
17
+ detail?: string;
18
+ files?: string[];
19
+ decision?: string;
20
+ incomplete?: string[];
21
+ next?: string;
22
+ learned?: string[];
23
+ }
24
+ export interface IndexStats {
25
+ added: number;
26
+ updated: number;
27
+ skipped: number;
28
+ errors: number;
29
+ }
30
+ /**
31
+ * Index all journal entries
32
+ */
33
+ export declare function indexJournalEntries(force?: boolean): Promise<IndexStats>;
34
+ /**
35
+ * Recompute TF-IDF for all memories
36
+ * Used when corpus changes significantly
37
+ */
38
+ export declare function recomputeTFIDF(): Promise<number>;
39
+ /**
40
+ * Start periodic indexing
41
+ */
42
+ export declare function startPeriodicIndexing(intervalMs?: number): void;
43
+ /**
44
+ * Stop periodic indexing
45
+ */
46
+ export declare function stopPeriodicIndexing(): void;
47
+ //# sourceMappingURL=memory-indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-indexer.d.ts","sourceRoot":"","sources":["../../src/lib/memory-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAA;IACT,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAiHD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAuDrF;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAwBtD;AAKD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,GAAE,MAAc,GAAG,IAAI,CAYtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Memory Indexer Module
3
+ *
4
+ * Indexes journal entries into the memory database.
5
+ * Runs periodically and on-demand to keep memory system up-to-date.
6
+ *
7
+ * @purpose Automatic indexing of journal entries
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import { insertMemory, isMemoryIndexed, setLastIndexTimestamp, getAllMemories } from './memory-db.js';
12
+ import { computeTFIDF, computeEmbedding } from './memory-search.js';
13
+ /**
14
+ * Parse a single journal file (JSONL format)
15
+ */
16
+ async function parseJournalFile(filePath) {
17
+ const content = fs.readFileSync(filePath, 'utf-8');
18
+ const lines = content.split('\n').filter(line => line.trim());
19
+ const entries = [];
20
+ for (const line of lines) {
21
+ try {
22
+ const entry = JSON.parse(line);
23
+ entries.push(entry);
24
+ }
25
+ catch (error) {
26
+ console.error(`Failed to parse line in ${filePath}:`, error);
27
+ }
28
+ }
29
+ return entries;
30
+ }
31
+ /**
32
+ * Get all journal files
33
+ */
34
+ async function getJournalFiles() {
35
+ const journalDir = path.join(process.cwd(), '.jfl', 'journal');
36
+ if (!fs.existsSync(journalDir)) {
37
+ return [];
38
+ }
39
+ const files = fs.readdirSync(journalDir)
40
+ .filter(file => file.endsWith('.jsonl'))
41
+ .map(file => path.join(journalDir, file));
42
+ return files;
43
+ }
44
+ /**
45
+ * Extract full text content from journal entry
46
+ */
47
+ function extractContent(entry) {
48
+ const parts = [
49
+ entry.title,
50
+ entry.summary || '',
51
+ entry.detail || '',
52
+ (entry.files || []).join(' '),
53
+ (entry.learned || []).join(' '),
54
+ entry.next || ''
55
+ ];
56
+ return parts.filter(p => p).join('\n\n');
57
+ }
58
+ /**
59
+ * Index a single journal entry
60
+ */
61
+ async function indexEntry(entry, allTexts) {
62
+ // Check if already indexed
63
+ if (await isMemoryIndexed(entry.session, entry.ts)) {
64
+ return false;
65
+ }
66
+ // Extract content
67
+ const content = extractContent(entry);
68
+ // Compute TF-IDF tokens
69
+ const tfIdfTokens = computeTFIDF(content, allTexts);
70
+ // Try to compute embedding (optional)
71
+ let embedding;
72
+ let embeddingModel;
73
+ try {
74
+ const result = await computeEmbedding(content);
75
+ if (result) {
76
+ embedding = result.embedding;
77
+ embeddingModel = result.model;
78
+ }
79
+ }
80
+ catch (error) {
81
+ // Embeddings are optional - continue without them
82
+ }
83
+ // Prepare metadata
84
+ const metadata = {
85
+ files: entry.files || [],
86
+ learned: entry.learned || [],
87
+ decision: entry.decision || null,
88
+ incomplete: entry.incomplete || [],
89
+ next: entry.next || null,
90
+ status: entry.status || null
91
+ };
92
+ // Insert into database
93
+ await insertMemory({
94
+ source: 'journal',
95
+ source_id: entry.session,
96
+ type: entry.type,
97
+ title: entry.title,
98
+ content,
99
+ summary: entry.summary,
100
+ metadata,
101
+ created_at: entry.ts,
102
+ embedding,
103
+ embedding_model: embeddingModel,
104
+ tf_idf_tokens: tfIdfTokens
105
+ });
106
+ return true;
107
+ }
108
+ /**
109
+ * Index all journal entries
110
+ */
111
+ export async function indexJournalEntries(force = false) {
112
+ const stats = {
113
+ added: 0,
114
+ updated: 0,
115
+ skipped: 0,
116
+ errors: 0
117
+ };
118
+ try {
119
+ // Get all journal files
120
+ const journalFiles = await getJournalFiles();
121
+ if (journalFiles.length === 0) {
122
+ return stats;
123
+ }
124
+ // Parse all entries
125
+ const allEntries = [];
126
+ for (const file of journalFiles) {
127
+ try {
128
+ const entries = await parseJournalFile(file);
129
+ allEntries.push(...entries);
130
+ }
131
+ catch (error) {
132
+ console.error(`Failed to parse ${file}:`, error);
133
+ stats.errors++;
134
+ }
135
+ }
136
+ // Get all content for TF-IDF computation
137
+ const allTexts = allEntries.map(entry => extractContent(entry));
138
+ // Index each entry
139
+ for (const entry of allEntries) {
140
+ try {
141
+ const added = await indexEntry(entry, allTexts);
142
+ if (added) {
143
+ stats.added++;
144
+ }
145
+ else {
146
+ stats.skipped++;
147
+ }
148
+ }
149
+ catch (error) {
150
+ console.error(`Failed to index entry ${entry.title}:`, error);
151
+ stats.errors++;
152
+ }
153
+ }
154
+ // Update last index timestamp
155
+ await setLastIndexTimestamp(new Date().toISOString());
156
+ }
157
+ catch (error) {
158
+ console.error('Failed to index journal entries:', error);
159
+ stats.errors++;
160
+ }
161
+ return stats;
162
+ }
163
+ /**
164
+ * Recompute TF-IDF for all memories
165
+ * Used when corpus changes significantly
166
+ */
167
+ export async function recomputeTFIDF() {
168
+ const memories = await getAllMemories();
169
+ if (memories.length === 0) {
170
+ return 0;
171
+ }
172
+ const allTexts = memories.map((m) => m.content);
173
+ let updated = 0;
174
+ for (const memory of memories) {
175
+ try {
176
+ const tfIdfTokens = computeTFIDF(memory.content, allTexts);
177
+ // Update memory with new TF-IDF tokens
178
+ // Note: This would require an update function in memory-db
179
+ // For now, this is a placeholder
180
+ updated++;
181
+ }
182
+ catch (error) {
183
+ console.error(`Failed to recompute TF-IDF for memory ${memory.id}:`, error);
184
+ }
185
+ }
186
+ return updated;
187
+ }
188
+ // Periodic indexing state
189
+ let indexingInterval = null;
190
+ /**
191
+ * Start periodic indexing
192
+ */
193
+ export function startPeriodicIndexing(intervalMs = 60000) {
194
+ if (indexingInterval) {
195
+ return;
196
+ }
197
+ indexingInterval = setInterval(async () => {
198
+ try {
199
+ await indexJournalEntries();
200
+ }
201
+ catch (error) {
202
+ console.error('Periodic indexing failed:', error);
203
+ }
204
+ }, intervalMs);
205
+ }
206
+ /**
207
+ * Stop periodic indexing
208
+ */
209
+ export function stopPeriodicIndexing() {
210
+ if (indexingInterval) {
211
+ clearInterval(indexingInterval);
212
+ indexingInterval = null;
213
+ }
214
+ }
215
+ //# sourceMappingURL=memory-indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-indexer.js","sourceRoot":"","sources":["../../src/lib/memory-indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Memory Search Module
3
+ *
4
+ * Hybrid search combining TF-IDF (fast, always available) and
5
+ * embeddings (semantic, optional). Provides relevance scoring
6
+ * and result ranking.
7
+ *
8
+ * @purpose Fast and semantic search across indexed memories
9
+ */
10
+ import { Memory } from './memory-db.js';
11
+ export interface SearchResult {
12
+ memory: Memory;
13
+ score: number;
14
+ relevance: 'high' | 'medium' | 'low';
15
+ }
16
+ export interface SearchOptions {
17
+ maxItems?: number;
18
+ type?: string;
19
+ since?: string;
20
+ method?: 'tfidf' | 'embedding' | 'hybrid';
21
+ }
22
+ /**
23
+ * Compute TF-IDF scores for text
24
+ */
25
+ export declare function computeTFIDF(text: string, allTexts: string[]): Record<string, number>;
26
+ /**
27
+ * Compute embedding for text using OpenAI
28
+ */
29
+ declare function computeEmbedding(text: string): Promise<{
30
+ embedding: Float32Array;
31
+ model: string;
32
+ } | null>;
33
+ /**
34
+ * Main search function
35
+ */
36
+ export declare function searchMemories(query: string, options?: SearchOptions): Promise<SearchResult[]>;
37
+ /**
38
+ * Export compute embedding for use in indexer
39
+ */
40
+ export { computeEmbedding };
41
+ //# sourceMappingURL=memory-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/lib/memory-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,EAAwC,MAAM,gBAAgB,CAAA;AAE7E,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAA;CAC1C;AAcD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmCrF;AAgDD;;GAEG;AACH,iBAAe,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACrD,SAAS,EAAE,YAAY,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd,GAAG,IAAI,CAAC,CAwBR;AA8HD;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BzB;AAYD;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,CAAA"}