@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.
- package/LICENSE +21 -0
- package/README.md +30 -0
- package/dist/agent.js +2604 -0
- package/dist/agent.js.map +1 -0
- package/dist/anton/controller.js +341 -0
- package/dist/anton/controller.js.map +1 -0
- package/dist/anton/lock.js +110 -0
- package/dist/anton/lock.js.map +1 -0
- package/dist/anton/parser.js +303 -0
- package/dist/anton/parser.js.map +1 -0
- package/dist/anton/prompt.js +203 -0
- package/dist/anton/prompt.js.map +1 -0
- package/dist/anton/reporter.js +119 -0
- package/dist/anton/reporter.js.map +1 -0
- package/dist/anton/session.js +51 -0
- package/dist/anton/session.js.map +1 -0
- package/dist/anton/types.js +7 -0
- package/dist/anton/types.js.map +1 -0
- package/dist/anton/verifier.js +263 -0
- package/dist/anton/verifier.js.map +1 -0
- package/dist/bench/compare.js +239 -0
- package/dist/bench/compare.js.map +1 -0
- package/dist/bench/debug_hooks.js +17 -0
- package/dist/bench/debug_hooks.js.map +1 -0
- package/dist/bench/json_extract.js +22 -0
- package/dist/bench/json_extract.js.map +1 -0
- package/dist/bench/openclaw.js +86 -0
- package/dist/bench/openclaw.js.map +1 -0
- package/dist/bench/report.js +116 -0
- package/dist/bench/report.js.map +1 -0
- package/dist/bench/runner.js +312 -0
- package/dist/bench/runner.js.map +1 -0
- package/dist/bench/types.js +2 -0
- package/dist/bench/types.js.map +1 -0
- package/dist/bot/commands.js +444 -0
- package/dist/bot/commands.js.map +1 -0
- package/dist/bot/confirm-discord.js +133 -0
- package/dist/bot/confirm-discord.js.map +1 -0
- package/dist/bot/confirm-telegram.js +290 -0
- package/dist/bot/confirm-telegram.js.map +1 -0
- package/dist/bot/discord.js +826 -0
- package/dist/bot/discord.js.map +1 -0
- package/dist/bot/format.js +210 -0
- package/dist/bot/format.js.map +1 -0
- package/dist/bot/session-manager.js +270 -0
- package/dist/bot/session-manager.js.map +1 -0
- package/dist/bot/telegram.js +678 -0
- package/dist/bot/telegram.js.map +1 -0
- package/dist/cli/agent-turn.js +45 -0
- package/dist/cli/agent-turn.js.map +1 -0
- package/dist/cli/args.js +236 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/bot.js +252 -0
- package/dist/cli/bot.js.map +1 -0
- package/dist/cli/build-repl-context.js +365 -0
- package/dist/cli/build-repl-context.js.map +1 -0
- package/dist/cli/command-registry.js +20 -0
- package/dist/cli/command-registry.js.map +1 -0
- package/dist/cli/commands/anton.js +271 -0
- package/dist/cli/commands/anton.js.map +1 -0
- package/dist/cli/commands/editing.js +328 -0
- package/dist/cli/commands/editing.js.map +1 -0
- package/dist/cli/commands/model.js +274 -0
- package/dist/cli/commands/model.js.map +1 -0
- package/dist/cli/commands/project.js +255 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/commands/runtime.js +63 -0
- package/dist/cli/commands/runtime.js.map +1 -0
- package/dist/cli/commands/session.js +281 -0
- package/dist/cli/commands/session.js.map +1 -0
- package/dist/cli/commands/tools.js +126 -0
- package/dist/cli/commands/tools.js.map +1 -0
- package/dist/cli/commands/trifecta.js +221 -0
- package/dist/cli/commands/trifecta.js.map +1 -0
- package/dist/cli/commands/tui.js +17 -0
- package/dist/cli/commands/tui.js.map +1 -0
- package/dist/cli/init.js +222 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/input.js +360 -0
- package/dist/cli/input.js.map +1 -0
- package/dist/cli/oneshot.js +254 -0
- package/dist/cli/oneshot.js.map +1 -0
- package/dist/cli/repl-context.js +2 -0
- package/dist/cli/repl-context.js.map +1 -0
- package/dist/cli/runtime-cmds.js +811 -0
- package/dist/cli/runtime-cmds.js.map +1 -0
- package/dist/cli/service.js +145 -0
- package/dist/cli/service.js.map +1 -0
- package/dist/cli/session-state.js +130 -0
- package/dist/cli/session-state.js.map +1 -0
- package/dist/cli/setup.js +815 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/shell.js +79 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/status.js +392 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/watch.js +33 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/client.js +676 -0
- package/dist/client.js.map +1 -0
- package/dist/commands.js +194 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.js +507 -0
- package/dist/config.js.map +1 -0
- package/dist/confirm/auto.js +13 -0
- package/dist/confirm/auto.js.map +1 -0
- package/dist/confirm/headless.js +41 -0
- package/dist/confirm/headless.js.map +1 -0
- package/dist/confirm/terminal.js +90 -0
- package/dist/confirm/terminal.js.map +1 -0
- package/dist/context.js +49 -0
- package/dist/context.js.map +1 -0
- package/dist/git.js +136 -0
- package/dist/git.js.map +1 -0
- package/dist/harnesses.js +171 -0
- package/dist/harnesses.js.map +1 -0
- package/dist/history.js +139 -0
- package/dist/history.js.map +1 -0
- package/dist/index.js +700 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.js +374 -0
- package/dist/indexer.js.map +1 -0
- package/dist/jsonrpc.js +76 -0
- package/dist/jsonrpc.js.map +1 -0
- package/dist/lens.js +525 -0
- package/dist/lens.js.map +1 -0
- package/dist/lsp.js +605 -0
- package/dist/lsp.js.map +1 -0
- package/dist/markdown.js +275 -0
- package/dist/markdown.js.map +1 -0
- package/dist/mcp.js +554 -0
- package/dist/mcp.js.map +1 -0
- package/dist/recovery.js +178 -0
- package/dist/recovery.js.map +1 -0
- package/dist/replay.js +132 -0
- package/dist/replay.js.map +1 -0
- package/dist/replay_cli.js +24 -0
- package/dist/replay_cli.js.map +1 -0
- package/dist/runtime/executor.js +418 -0
- package/dist/runtime/executor.js.map +1 -0
- package/dist/runtime/planner.js +197 -0
- package/dist/runtime/planner.js.map +1 -0
- package/dist/runtime/store.js +289 -0
- package/dist/runtime/store.js.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/safety.js +446 -0
- package/dist/safety.js.map +1 -0
- package/dist/spinner.js +224 -0
- package/dist/spinner.js.map +1 -0
- package/dist/sys/context.js +124 -0
- package/dist/sys/context.js.map +1 -0
- package/dist/sys/snapshot.sh +97 -0
- package/dist/term.js +61 -0
- package/dist/term.js.map +1 -0
- package/dist/themes.js +135 -0
- package/dist/themes.js.map +1 -0
- package/dist/tools.js +1114 -0
- package/dist/tools.js.map +1 -0
- package/dist/tui/branch-picker.js +65 -0
- package/dist/tui/branch-picker.js.map +1 -0
- package/dist/tui/command-handler.js +108 -0
- package/dist/tui/command-handler.js.map +1 -0
- package/dist/tui/confirm.js +90 -0
- package/dist/tui/confirm.js.map +1 -0
- package/dist/tui/controller.js +463 -0
- package/dist/tui/controller.js.map +1 -0
- package/dist/tui/event-bridge.js +44 -0
- package/dist/tui/event-bridge.js.map +1 -0
- package/dist/tui/events.js +2 -0
- package/dist/tui/events.js.map +1 -0
- package/dist/tui/keymap.js +144 -0
- package/dist/tui/keymap.js.map +1 -0
- package/dist/tui/layout.js +11 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/render.js +186 -0
- package/dist/tui/render.js.map +1 -0
- package/dist/tui/screen.js +48 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/state.js +167 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/theme.js +70 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.js +2 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/upgrade.js +412 -0
- package/dist/upgrade.js.map +1 -0
- package/dist/utils.js +87 -0
- package/dist/utils.js.map +1 -0
- package/dist/vault.js +520 -0
- package/dist/vault.js.map +1 -0
- package/dist/vim.js +160 -0
- package/dist/vim.js.map +1 -0
- package/package.json +67 -0
- 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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"}
|