@visorcraft/idlehands 0.9.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 (197) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/agent.js +2604 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/anton/controller.js +341 -0
  6. package/dist/anton/controller.js.map +1 -0
  7. package/dist/anton/lock.js +110 -0
  8. package/dist/anton/lock.js.map +1 -0
  9. package/dist/anton/parser.js +303 -0
  10. package/dist/anton/parser.js.map +1 -0
  11. package/dist/anton/prompt.js +203 -0
  12. package/dist/anton/prompt.js.map +1 -0
  13. package/dist/anton/reporter.js +119 -0
  14. package/dist/anton/reporter.js.map +1 -0
  15. package/dist/anton/session.js +51 -0
  16. package/dist/anton/session.js.map +1 -0
  17. package/dist/anton/types.js +7 -0
  18. package/dist/anton/types.js.map +1 -0
  19. package/dist/anton/verifier.js +263 -0
  20. package/dist/anton/verifier.js.map +1 -0
  21. package/dist/bench/compare.js +239 -0
  22. package/dist/bench/compare.js.map +1 -0
  23. package/dist/bench/debug_hooks.js +17 -0
  24. package/dist/bench/debug_hooks.js.map +1 -0
  25. package/dist/bench/json_extract.js +22 -0
  26. package/dist/bench/json_extract.js.map +1 -0
  27. package/dist/bench/openclaw.js +86 -0
  28. package/dist/bench/openclaw.js.map +1 -0
  29. package/dist/bench/report.js +116 -0
  30. package/dist/bench/report.js.map +1 -0
  31. package/dist/bench/runner.js +312 -0
  32. package/dist/bench/runner.js.map +1 -0
  33. package/dist/bench/types.js +2 -0
  34. package/dist/bench/types.js.map +1 -0
  35. package/dist/bot/commands.js +444 -0
  36. package/dist/bot/commands.js.map +1 -0
  37. package/dist/bot/confirm-discord.js +133 -0
  38. package/dist/bot/confirm-discord.js.map +1 -0
  39. package/dist/bot/confirm-telegram.js +290 -0
  40. package/dist/bot/confirm-telegram.js.map +1 -0
  41. package/dist/bot/discord.js +826 -0
  42. package/dist/bot/discord.js.map +1 -0
  43. package/dist/bot/format.js +210 -0
  44. package/dist/bot/format.js.map +1 -0
  45. package/dist/bot/session-manager.js +270 -0
  46. package/dist/bot/session-manager.js.map +1 -0
  47. package/dist/bot/telegram.js +678 -0
  48. package/dist/bot/telegram.js.map +1 -0
  49. package/dist/cli/agent-turn.js +45 -0
  50. package/dist/cli/agent-turn.js.map +1 -0
  51. package/dist/cli/args.js +236 -0
  52. package/dist/cli/args.js.map +1 -0
  53. package/dist/cli/bot.js +252 -0
  54. package/dist/cli/bot.js.map +1 -0
  55. package/dist/cli/build-repl-context.js +365 -0
  56. package/dist/cli/build-repl-context.js.map +1 -0
  57. package/dist/cli/command-registry.js +20 -0
  58. package/dist/cli/command-registry.js.map +1 -0
  59. package/dist/cli/commands/anton.js +271 -0
  60. package/dist/cli/commands/anton.js.map +1 -0
  61. package/dist/cli/commands/editing.js +328 -0
  62. package/dist/cli/commands/editing.js.map +1 -0
  63. package/dist/cli/commands/model.js +274 -0
  64. package/dist/cli/commands/model.js.map +1 -0
  65. package/dist/cli/commands/project.js +255 -0
  66. package/dist/cli/commands/project.js.map +1 -0
  67. package/dist/cli/commands/runtime.js +63 -0
  68. package/dist/cli/commands/runtime.js.map +1 -0
  69. package/dist/cli/commands/session.js +281 -0
  70. package/dist/cli/commands/session.js.map +1 -0
  71. package/dist/cli/commands/tools.js +126 -0
  72. package/dist/cli/commands/tools.js.map +1 -0
  73. package/dist/cli/commands/trifecta.js +221 -0
  74. package/dist/cli/commands/trifecta.js.map +1 -0
  75. package/dist/cli/commands/tui.js +17 -0
  76. package/dist/cli/commands/tui.js.map +1 -0
  77. package/dist/cli/init.js +222 -0
  78. package/dist/cli/init.js.map +1 -0
  79. package/dist/cli/input.js +360 -0
  80. package/dist/cli/input.js.map +1 -0
  81. package/dist/cli/oneshot.js +254 -0
  82. package/dist/cli/oneshot.js.map +1 -0
  83. package/dist/cli/repl-context.js +2 -0
  84. package/dist/cli/repl-context.js.map +1 -0
  85. package/dist/cli/runtime-cmds.js +811 -0
  86. package/dist/cli/runtime-cmds.js.map +1 -0
  87. package/dist/cli/service.js +145 -0
  88. package/dist/cli/service.js.map +1 -0
  89. package/dist/cli/session-state.js +130 -0
  90. package/dist/cli/session-state.js.map +1 -0
  91. package/dist/cli/setup.js +815 -0
  92. package/dist/cli/setup.js.map +1 -0
  93. package/dist/cli/shell.js +79 -0
  94. package/dist/cli/shell.js.map +1 -0
  95. package/dist/cli/status.js +392 -0
  96. package/dist/cli/status.js.map +1 -0
  97. package/dist/cli/watch.js +33 -0
  98. package/dist/cli/watch.js.map +1 -0
  99. package/dist/client.js +676 -0
  100. package/dist/client.js.map +1 -0
  101. package/dist/commands.js +194 -0
  102. package/dist/commands.js.map +1 -0
  103. package/dist/config.js +507 -0
  104. package/dist/config.js.map +1 -0
  105. package/dist/confirm/auto.js +13 -0
  106. package/dist/confirm/auto.js.map +1 -0
  107. package/dist/confirm/headless.js +41 -0
  108. package/dist/confirm/headless.js.map +1 -0
  109. package/dist/confirm/terminal.js +90 -0
  110. package/dist/confirm/terminal.js.map +1 -0
  111. package/dist/context.js +49 -0
  112. package/dist/context.js.map +1 -0
  113. package/dist/git.js +136 -0
  114. package/dist/git.js.map +1 -0
  115. package/dist/harnesses.js +171 -0
  116. package/dist/harnesses.js.map +1 -0
  117. package/dist/history.js +139 -0
  118. package/dist/history.js.map +1 -0
  119. package/dist/index.js +700 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/indexer.js +374 -0
  122. package/dist/indexer.js.map +1 -0
  123. package/dist/jsonrpc.js +76 -0
  124. package/dist/jsonrpc.js.map +1 -0
  125. package/dist/lens.js +525 -0
  126. package/dist/lens.js.map +1 -0
  127. package/dist/lsp.js +605 -0
  128. package/dist/lsp.js.map +1 -0
  129. package/dist/markdown.js +275 -0
  130. package/dist/markdown.js.map +1 -0
  131. package/dist/mcp.js +554 -0
  132. package/dist/mcp.js.map +1 -0
  133. package/dist/recovery.js +178 -0
  134. package/dist/recovery.js.map +1 -0
  135. package/dist/replay.js +132 -0
  136. package/dist/replay.js.map +1 -0
  137. package/dist/replay_cli.js +24 -0
  138. package/dist/replay_cli.js.map +1 -0
  139. package/dist/runtime/executor.js +418 -0
  140. package/dist/runtime/executor.js.map +1 -0
  141. package/dist/runtime/planner.js +197 -0
  142. package/dist/runtime/planner.js.map +1 -0
  143. package/dist/runtime/store.js +289 -0
  144. package/dist/runtime/store.js.map +1 -0
  145. package/dist/runtime/types.js +2 -0
  146. package/dist/runtime/types.js.map +1 -0
  147. package/dist/safety.js +446 -0
  148. package/dist/safety.js.map +1 -0
  149. package/dist/spinner.js +224 -0
  150. package/dist/spinner.js.map +1 -0
  151. package/dist/sys/context.js +124 -0
  152. package/dist/sys/context.js.map +1 -0
  153. package/dist/sys/snapshot.sh +97 -0
  154. package/dist/term.js +61 -0
  155. package/dist/term.js.map +1 -0
  156. package/dist/themes.js +135 -0
  157. package/dist/themes.js.map +1 -0
  158. package/dist/tools.js +1114 -0
  159. package/dist/tools.js.map +1 -0
  160. package/dist/tui/branch-picker.js +65 -0
  161. package/dist/tui/branch-picker.js.map +1 -0
  162. package/dist/tui/command-handler.js +108 -0
  163. package/dist/tui/command-handler.js.map +1 -0
  164. package/dist/tui/confirm.js +90 -0
  165. package/dist/tui/confirm.js.map +1 -0
  166. package/dist/tui/controller.js +463 -0
  167. package/dist/tui/controller.js.map +1 -0
  168. package/dist/tui/event-bridge.js +44 -0
  169. package/dist/tui/event-bridge.js.map +1 -0
  170. package/dist/tui/events.js +2 -0
  171. package/dist/tui/events.js.map +1 -0
  172. package/dist/tui/keymap.js +144 -0
  173. package/dist/tui/keymap.js.map +1 -0
  174. package/dist/tui/layout.js +11 -0
  175. package/dist/tui/layout.js.map +1 -0
  176. package/dist/tui/render.js +186 -0
  177. package/dist/tui/render.js.map +1 -0
  178. package/dist/tui/screen.js +48 -0
  179. package/dist/tui/screen.js.map +1 -0
  180. package/dist/tui/state.js +167 -0
  181. package/dist/tui/state.js.map +1 -0
  182. package/dist/tui/theme.js +70 -0
  183. package/dist/tui/theme.js.map +1 -0
  184. package/dist/tui/types.js +2 -0
  185. package/dist/tui/types.js.map +1 -0
  186. package/dist/types.js +2 -0
  187. package/dist/types.js.map +1 -0
  188. package/dist/upgrade.js +412 -0
  189. package/dist/upgrade.js.map +1 -0
  190. package/dist/utils.js +87 -0
  191. package/dist/utils.js.map +1 -0
  192. package/dist/vault.js +520 -0
  193. package/dist/vault.js.map +1 -0
  194. package/dist/vim.js +160 -0
  195. package/dist/vim.js.map +1 -0
  196. package/package.json +67 -0
  197. package/src/sys/snapshot.sh +97 -0
package/dist/vault.js ADDED
@@ -0,0 +1,520 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DatabaseSync } from 'node:sqlite';
4
+ import { stateDir } from './utils.js';
5
+ function defaultVaultPath() {
6
+ return path.join(stateDir(), 'vault.db');
7
+ }
8
+ function normalizeText(s) {
9
+ return s.toLowerCase().replace(/\s+/g, ' ').trim();
10
+ }
11
+ function truncate(s, max) {
12
+ if (s.length <= max)
13
+ return s;
14
+ return s.slice(0, max - 1) + '…';
15
+ }
16
+ function nowIso() {
17
+ return new Date().toISOString();
18
+ }
19
+ function isToolMessage(m) {
20
+ return m.role === 'tool' && typeof m.content === 'string' && typeof m.tool_call_id === 'string';
21
+ }
22
+ function toSearchText(row) {
23
+ return normalizeText(`${row.key ?? ''} ${row.tool ?? ''} ${row.value ?? ''} ${row.snippet ?? ''} ${row.content ?? ''}`);
24
+ }
25
+ export class VaultStore {
26
+ dbPath;
27
+ maxEntries;
28
+ db = null;
29
+ initPromise = null;
30
+ ftsEnabled = false;
31
+ _projectDir;
32
+ constructor(opts = {}) {
33
+ this.dbPath = opts.path ?? defaultVaultPath();
34
+ this.maxEntries = opts.maxEntries ?? 500;
35
+ this._projectDir = opts.projectDir;
36
+ }
37
+ /** Set the project directory for scoping vault entries. */
38
+ setProjectDir(dir) {
39
+ this._projectDir = dir;
40
+ }
41
+ /** Get the current project directory. */
42
+ get projectDir() {
43
+ return this._projectDir;
44
+ }
45
+ /** Close the database connection. Safe to call multiple times. */
46
+ close() {
47
+ if (this.db) {
48
+ try {
49
+ this.db.close();
50
+ }
51
+ catch { /* already closed */ }
52
+ this.db = null;
53
+ }
54
+ this.initPromise = null;
55
+ }
56
+ [Symbol.dispose]() {
57
+ this.close();
58
+ }
59
+ async init() {
60
+ if (!this.initPromise) {
61
+ this.initPromise = this.open();
62
+ }
63
+ return this.initPromise;
64
+ }
65
+ async count() {
66
+ await this.init();
67
+ const rows = this.rows('SELECT COUNT(*) as count FROM vault_entries');
68
+ return Number(rows[0]?.count ?? 0);
69
+ }
70
+ async list(limit = 50) {
71
+ await this.init();
72
+ const n = Math.max(1, limit);
73
+ const rows = this.rows(`SELECT id, kind, key, value, tool, tool_call_id, content, snippet, project_dir, created_at, updated_at
74
+ FROM vault_entries
75
+ ORDER BY updated_at DESC
76
+ LIMIT ?`, [n]);
77
+ return rows.map((r) => this.mapRow(r));
78
+ }
79
+ async note(key, value) {
80
+ await this.init();
81
+ const cleanKey = key.trim();
82
+ const cleanVal = String(value ?? '');
83
+ const id = this.transaction(() => this.insertAndIndex('note', cleanKey, cleanVal, null, null, cleanVal, truncate(cleanVal, 300)));
84
+ await this.pruneToLimit();
85
+ await this.persist();
86
+ return String(id ?? '');
87
+ }
88
+ async upsertNote(key, value, kind = 'note') {
89
+ await this.init();
90
+ const cleanKey = key.trim();
91
+ const cleanVal = String(value ?? '');
92
+ const now = nowIso();
93
+ const snippet = truncate(cleanVal, 300);
94
+ if (!this.db)
95
+ throw new Error('vault db not initialized');
96
+ let id = 0;
97
+ this.db.exec('BEGIN');
98
+ try {
99
+ const existing = this.rows(`SELECT id FROM vault_entries WHERE kind = ? AND key = ? ORDER BY id DESC LIMIT 1`, [kind, cleanKey]);
100
+ if (existing.length) {
101
+ const existingId = Number(existing[0].id);
102
+ const projDir = this._projectDir ?? null;
103
+ this.run(`UPDATE vault_entries SET updated_at = ?, value = ?, content = ?, snippet = ?, project_dir = COALESCE(?, project_dir) WHERE id = ?`, [now, cleanVal, cleanVal, snippet, projDir, existingId]);
104
+ if (this.ftsEnabled) {
105
+ this.run('DELETE FROM vault_fts WHERE rowid = ?', [existingId]);
106
+ const row = {
107
+ id: existingId, kind, key: cleanKey, value: cleanVal, tool: null, tool_call_id: null,
108
+ content: cleanVal, snippet, project_dir: projDir,
109
+ created_at: now, updated_at: now, createdAt: now, updatedAt: now,
110
+ };
111
+ this.indexFts(existingId, row);
112
+ }
113
+ id = existingId;
114
+ }
115
+ else {
116
+ id = this.insertAndIndex(kind, cleanKey, cleanVal, null, null, cleanVal, snippet);
117
+ }
118
+ const row = this.rows('SELECT COUNT(*) as count FROM vault_entries');
119
+ const count = Number(row[0]?.count ?? 0);
120
+ const excess = count - this.maxEntries;
121
+ if (excess > 0) {
122
+ const stale = this.rows('SELECT id FROM vault_entries ORDER BY id ASC LIMIT ?', [excess]);
123
+ const ids = stale.map((item) => item.id);
124
+ if (ids.length) {
125
+ const placeholders = ids.map(() => '?').join(',');
126
+ this.run(`DELETE FROM vault_entries WHERE id IN (${placeholders})`, ids);
127
+ if (this.ftsEnabled) {
128
+ this.run(`DELETE FROM vault_fts WHERE rowid IN (${placeholders})`, ids);
129
+ }
130
+ }
131
+ }
132
+ this.db.exec('COMMIT');
133
+ }
134
+ catch (e) {
135
+ try {
136
+ this.db.exec('ROLLBACK');
137
+ }
138
+ catch { /* ignore */ }
139
+ throw e;
140
+ }
141
+ await this.persist();
142
+ return String(id);
143
+ }
144
+ async getLatestByKey(key, kind) {
145
+ await this.init();
146
+ const rows = kind
147
+ ? this.rows(`SELECT id, kind, key, value, tool, tool_call_id, content, snippet, project_dir, created_at, updated_at
148
+ FROM vault_entries
149
+ WHERE key = ? AND kind = ?
150
+ ORDER BY updated_at DESC, id DESC
151
+ LIMIT 1`, [key, kind])
152
+ : this.rows(`SELECT id, kind, key, value, tool, tool_call_id, content, snippet, project_dir, created_at, updated_at
153
+ FROM vault_entries
154
+ WHERE key = ?
155
+ ORDER BY updated_at DESC, id DESC
156
+ LIMIT 1`, [key]);
157
+ if (!rows.length)
158
+ return null;
159
+ return this.mapRow(rows[0]);
160
+ }
161
+ async deleteByKey(key) {
162
+ await this.init();
163
+ const ids = this.rows(`SELECT id FROM vault_entries WHERE key = ?`, [key]).map((r) => Number(r.id));
164
+ return this.deleteByIds(ids);
165
+ }
166
+ async deleteByKeyPrefix(prefix) {
167
+ await this.init();
168
+ const ids = this.rows(`SELECT id FROM vault_entries WHERE key LIKE ?`, [`${prefix}%`]).map((r) => Number(r.id));
169
+ return this.deleteByIds(ids);
170
+ }
171
+ /** Shared delete-by-ids helper (entries + FTS). */
172
+ async deleteByIds(ids) {
173
+ if (!ids.length)
174
+ return 0;
175
+ const placeholders = ids.map(() => '?').join(',');
176
+ this.transaction(() => {
177
+ this.run(`DELETE FROM vault_entries WHERE id IN (${placeholders})`, ids);
178
+ if (this.ftsEnabled) {
179
+ this.run(`DELETE FROM vault_fts WHERE rowid IN (${placeholders})`, ids);
180
+ }
181
+ });
182
+ await this.persist();
183
+ return ids.length;
184
+ }
185
+ async archiveToolResult(message, toolName) {
186
+ if (!isToolMessage(message))
187
+ return;
188
+ if (!message.content?.trim())
189
+ return;
190
+ await this.init();
191
+ const exists = this.rows(`SELECT 1 as found FROM vault_entries WHERE kind='tool' AND tool_call_id = ? LIMIT 1`, [message.tool_call_id]);
192
+ if (exists.length)
193
+ return;
194
+ const name = (toolName ?? 'tool').trim() || 'tool';
195
+ const raw = message.content;
196
+ this.transaction(() => this.insertAndIndex('tool', `tool:${name}`, raw, name, message.tool_call_id, raw, truncate(raw, 300)));
197
+ await this.pruneToLimit();
198
+ await this.persist();
199
+ }
200
+ async archiveToolMessages(messages, toolNameByCallId = new Map()) {
201
+ await this.init();
202
+ // Filter to valid tool messages that aren't already archived
203
+ const toArchive = [];
204
+ for (const m of messages) {
205
+ if (!isToolMessage(m) || !m.content?.trim())
206
+ continue;
207
+ const exists = this.rows(`SELECT 1 as found FROM vault_entries WHERE kind='tool' AND tool_call_id = ? LIMIT 1`, [m.tool_call_id]);
208
+ if (exists.length)
209
+ continue;
210
+ toArchive.push({
211
+ content: m.content,
212
+ tool_call_id: m.tool_call_id,
213
+ name: (toolNameByCallId.get(m.tool_call_id) ?? 'tool').trim() || 'tool',
214
+ });
215
+ }
216
+ if (!toArchive.length)
217
+ return 0;
218
+ // Batch insert in a single transaction
219
+ this.transaction(() => {
220
+ for (const item of toArchive) {
221
+ this.insertAndIndex('tool', `tool:${item.name}`, item.content, item.name, item.tool_call_id, item.content, truncate(item.content, 300));
222
+ }
223
+ });
224
+ await this.pruneToLimit();
225
+ await this.persist();
226
+ return toArchive.length;
227
+ }
228
+ async search(query, limit = 5) {
229
+ await this.init();
230
+ const q = normalizeText(query || '');
231
+ if (!q.trim())
232
+ return [];
233
+ const n = Math.max(1, limit);
234
+ const projDir = this._projectDir ?? null;
235
+ if (this.ftsEnabled) {
236
+ try {
237
+ const ftsQuery = this.escapeFtsQuery(q);
238
+ // Fetch extra results to allow project-scoping reorder
239
+ const fetchLimit = projDir ? n * 3 : n;
240
+ const rows = this.rows(`SELECT e.id, e.kind, e.key, e.value, e.tool, e.tool_call_id, e.content, e.snippet, e.project_dir, e.created_at, e.updated_at,
241
+ bm25(vault_fts) as rank
242
+ FROM vault_fts
243
+ JOIN vault_entries e ON e.id = vault_fts.rowid
244
+ WHERE vault_fts MATCH ?
245
+ ORDER BY rank ASC, e.updated_at DESC
246
+ LIMIT ?`, [ftsQuery, fetchLimit]);
247
+ let results = rows
248
+ .map((r) => ({
249
+ ...this.mapRow(r),
250
+ score: Number(r.rank ?? 0),
251
+ _projectDir: r.project_dir,
252
+ }))
253
+ .filter(Boolean);
254
+ // Project scoping: same-project entries first, then unscoped, then other-project
255
+ if (projDir) {
256
+ results = this.sortByProjectRelevance(results, projDir);
257
+ }
258
+ return results.slice(0, n).map(({ _projectDir, ...rest }) => rest);
259
+ }
260
+ catch (e) {
261
+ this.ftsEnabled = false;
262
+ }
263
+ }
264
+ const rows = this.rows(`SELECT id, kind, key, value, tool, tool_call_id, content, snippet, project_dir, created_at, updated_at
265
+ FROM vault_entries
266
+ WHERE LOWER(COALESCE(key, '')) LIKE ?
267
+ OR LOWER(COALESCE(tool, '')) LIKE ?
268
+ OR LOWER(COALESCE(content, '')) LIKE ?
269
+ OR LOWER(COALESCE(snippet, '')) LIKE ?
270
+ ORDER BY updated_at DESC
271
+ LIMIT ?`, [`%${q}%`, `%${q}%`, `%${q}%`, `%${q}%`, n * 10]);
272
+ const tokens = q.split(' ').filter(Boolean);
273
+ const scored = rows
274
+ .map((r) => {
275
+ const haystack = toSearchText(r);
276
+ let score = 0;
277
+ if (haystack.includes(q))
278
+ score += 4;
279
+ for (const t of tokens) {
280
+ if (!t)
281
+ continue;
282
+ if (haystack.includes(t))
283
+ score += 1;
284
+ }
285
+ return { ...r, score, updatedAt: r.updated_at ?? r.updatedAt ?? '', _projectDir: r.project_dir };
286
+ })
287
+ .filter((x) => x.score > 0)
288
+ .sort((a, b) => {
289
+ if (b.score !== a.score)
290
+ return b.score - a.score;
291
+ return String(b.updatedAt ?? '').localeCompare(String(a.updatedAt ?? ''));
292
+ });
293
+ let results = scored.slice(0, projDir ? n * 3 : n);
294
+ // Project scoping: same-project entries first
295
+ if (projDir) {
296
+ results = this.sortByProjectRelevance(results, projDir);
297
+ }
298
+ return results.slice(0, n).map((r) => {
299
+ const { _projectDir, ...rest } = r;
300
+ return { ...this.mapRow(rest), score: r.score };
301
+ });
302
+ }
303
+ /**
304
+ * Sort results by project relevance:
305
+ * 1. Same project dir (exact match or child path)
306
+ * 2. No project dir (legacy/unscoped entries)
307
+ * 3. Different project dir (cross-project — deprioritized)
308
+ */
309
+ sortByProjectRelevance(results, projDir) {
310
+ const norm = projDir.replace(/\/+$/, '');
311
+ return results.sort((a, b) => {
312
+ const aTier = this.projectTier(a._projectDir, norm);
313
+ const bTier = this.projectTier(b._projectDir, norm);
314
+ if (aTier !== bTier)
315
+ return aTier - bTier;
316
+ // Within same tier, preserve original score ordering
317
+ return (b.score ?? 0) - (a.score ?? 0);
318
+ });
319
+ }
320
+ /** 0 = same project, 1 = unscoped, 2 = different project */
321
+ projectTier(entryDir, normProjDir) {
322
+ if (!entryDir)
323
+ return 1; // unscoped legacy entry
324
+ const normEntry = entryDir.replace(/\/+$/, '');
325
+ if (normEntry === normProjDir || normEntry.startsWith(normProjDir + '/'))
326
+ return 0;
327
+ return 2;
328
+ }
329
+ async open() {
330
+ await fs.mkdir(path.dirname(this.dbPath), { recursive: true });
331
+ try {
332
+ this.db = new DatabaseSync(this.dbPath);
333
+ this.migrate();
334
+ await this.rebuildFts();
335
+ await this.pruneToLimit();
336
+ return;
337
+ }
338
+ catch (e) {
339
+ if (this.db) {
340
+ try {
341
+ this.db.close();
342
+ }
343
+ catch { /* ignore */ }
344
+ this.db = null;
345
+ }
346
+ await this.recoverCorruptDb(e);
347
+ return;
348
+ }
349
+ }
350
+ async recoverCorruptDb(e) {
351
+ const backup = `${this.dbPath}.corrupt-${new Date().toISOString().replace(/[:.]/g, '-')}`;
352
+ await fs.rename(this.dbPath, backup).catch(() => { });
353
+ this.db = new DatabaseSync(this.dbPath);
354
+ this.migrate();
355
+ await this.rebuildFts();
356
+ if (!process.env.IDLEHANDS_QUIET_WARNINGS) {
357
+ console.warn(`[warn] vault db corrupt, recreated from scratch: ${e instanceof Error ? e.message : String(e)}`);
358
+ }
359
+ }
360
+ migrate() {
361
+ if (!this.db)
362
+ throw new Error('vault db not initialized');
363
+ this.db.exec(`
364
+ CREATE TABLE IF NOT EXISTS vault_entries (
365
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
366
+ kind TEXT NOT NULL CHECK(kind IN ('note','tool','system')),
367
+ created_at TEXT NOT NULL,
368
+ updated_at TEXT NOT NULL,
369
+ key TEXT,
370
+ value TEXT,
371
+ tool TEXT,
372
+ tool_call_id TEXT,
373
+ content TEXT,
374
+ snippet TEXT,
375
+ project_dir TEXT
376
+ );
377
+ `);
378
+ this.db.exec('CREATE INDEX IF NOT EXISTS idx_vault_updated_at ON vault_entries (updated_at DESC);');
379
+ this.db.exec('CREATE INDEX IF NOT EXISTS idx_vault_tool_call ON vault_entries (tool_call_id);');
380
+ this.db.exec('CREATE INDEX IF NOT EXISTS idx_vault_project_dir ON vault_entries (project_dir);');
381
+ // Migration: add project_dir column to existing databases
382
+ try {
383
+ this.db.exec('ALTER TABLE vault_entries ADD COLUMN project_dir TEXT');
384
+ }
385
+ catch {
386
+ // Column already exists — safe to ignore
387
+ }
388
+ }
389
+ async rebuildFts() {
390
+ if (!this.db)
391
+ return;
392
+ try {
393
+ this.db.exec('DROP TABLE IF EXISTS vault_fts;');
394
+ this.db.exec('CREATE VIRTUAL TABLE vault_fts USING fts5(search_text);');
395
+ this.ftsEnabled = true;
396
+ const rows = this.rows(`SELECT id, kind, key, value, tool, tool_call_id, content, snippet, project_dir, created_at, updated_at
397
+ FROM vault_entries`);
398
+ for (const row of rows) {
399
+ this.indexFts(row.id, row);
400
+ }
401
+ return;
402
+ }
403
+ catch {
404
+ this.ftsEnabled = false;
405
+ this.db.exec('DROP TABLE IF EXISTS vault_fts;');
406
+ }
407
+ }
408
+ async pruneToLimit() {
409
+ if (!this.db)
410
+ return;
411
+ const row = this.rows('SELECT COUNT(*) as count FROM vault_entries');
412
+ const count = Number(row[0]?.count ?? 0);
413
+ const excess = count - this.maxEntries;
414
+ if (excess <= 0)
415
+ return;
416
+ const stale = this.rows('SELECT id FROM vault_entries ORDER BY id ASC LIMIT ?', [excess]);
417
+ const ids = stale.map((item) => item.id);
418
+ if (ids.length) {
419
+ const placeholders = ids.map(() => '?').join(',');
420
+ this.transaction(() => {
421
+ this.run(`DELETE FROM vault_entries WHERE id IN (${placeholders})`, ids);
422
+ if (this.ftsEnabled) {
423
+ this.run(`DELETE FROM vault_fts WHERE rowid IN (${placeholders})`, ids);
424
+ }
425
+ });
426
+ }
427
+ }
428
+ indexFts(id, row) {
429
+ if (!this.db || !this.ftsEnabled)
430
+ return;
431
+ const text = truncate(toSearchText(row), 10000);
432
+ try {
433
+ // Keep FTS row aligned with base table rowid.
434
+ this.db.prepare('INSERT INTO vault_fts(rowid, search_text) VALUES (?, ?)').run(id, text);
435
+ }
436
+ catch {
437
+ this.ftsEnabled = false;
438
+ }
439
+ }
440
+ escapeFtsQuery(query) {
441
+ const tokens = normalizeText(query)
442
+ .split(' ')
443
+ .map((t) => t.trim())
444
+ .filter(Boolean)
445
+ .map((t) => t.replace(/[^\p{L}\p{N}_:.\-]/gu, ''))
446
+ .filter(Boolean);
447
+ if (!tokens.length)
448
+ return query;
449
+ return tokens.map((t) => `"${t}"`).join(' OR ');
450
+ }
451
+ mapRow(r) {
452
+ return {
453
+ id: String(r.id),
454
+ kind: r.kind,
455
+ key: r.key ?? undefined,
456
+ value: r.value ?? undefined,
457
+ tool: r.tool ?? undefined,
458
+ toolCallId: r.tool_call_id ?? undefined,
459
+ content: r.content ?? undefined,
460
+ snippet: r.snippet ?? undefined,
461
+ createdAt: r.created_at ?? r.createdAt ?? '',
462
+ updatedAt: r.updated_at ?? r.updatedAt ?? ''
463
+ };
464
+ }
465
+ run(sql, params = []) {
466
+ if (!this.db)
467
+ throw new Error('vault db not initialized');
468
+ return this.db.prepare(sql).run(...params);
469
+ }
470
+ rows(sql, params = []) {
471
+ if (!this.db)
472
+ throw new Error('vault db not initialized');
473
+ return this.db.prepare(sql).all(...params) ?? [];
474
+ }
475
+ /** Run a function inside a BEGIN/COMMIT transaction. Rolls back on error. */
476
+ transaction(fn) {
477
+ if (!this.db)
478
+ throw new Error('vault db not initialized');
479
+ this.db.exec('BEGIN');
480
+ try {
481
+ const result = fn();
482
+ this.db.exec('COMMIT');
483
+ return result;
484
+ }
485
+ catch (e) {
486
+ try {
487
+ this.db.exec('ROLLBACK');
488
+ }
489
+ catch { /* already rolled back */ }
490
+ throw e;
491
+ }
492
+ }
493
+ /** Insert + FTS index helper to eliminate duplication across note/upsert/archive methods. */
494
+ insertAndIndex(kind, key, value, tool, toolCallId, content, snippet) {
495
+ const now = nowIso();
496
+ const projDir = this._projectDir ?? null;
497
+ const result = this.run(`INSERT INTO vault_entries(kind, created_at, updated_at, key, value, tool, tool_call_id, content, snippet, project_dir)
498
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [kind, now, now, key, value, tool, toolCallId, content, snippet, projDir]);
499
+ const id = Number(result.lastInsertRowid);
500
+ if (id != null && this.ftsEnabled) {
501
+ const row = {
502
+ id, kind, key, value, tool, tool_call_id: toolCallId, content, snippet, project_dir: projDir,
503
+ created_at: now, updated_at: now, createdAt: now, updatedAt: now,
504
+ };
505
+ this.indexFts(id, row);
506
+ }
507
+ return id;
508
+ }
509
+ async persist() {
510
+ if (!this.db)
511
+ return;
512
+ try {
513
+ this.db.exec('PRAGMA wal_checkpoint(FULL);');
514
+ }
515
+ catch {
516
+ // SQLite sync mode may already flush automatically in local file mode.
517
+ }
518
+ }
519
+ }
520
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}