@clauderecallhq/cli 0.12.5 → 0.61.3
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 +37 -17
- package/README.md +110 -22
- package/dist/cli.js +1641 -353
- package/dist/daemon/entrypoint.js +1872 -54
- package/dist/mcp-server.js +930 -0
- package/dist/share/fonts/Inter-Bold.woff +0 -0
- package/dist/share/fonts/Inter-Regular.woff +0 -0
- package/dist/share/fonts/JetBrainsMono-Regular.woff +0 -0
- package/dist/web/assets/_brand-Bw9uSB4O.js +1 -0
- package/dist/web/assets/captureNode-9CVj9vYC.js +2 -0
- package/dist/web/assets/card-a-minimal-ujNERzX7.js +1 -0
- package/dist/web/assets/card-b-terminal-DpJ_tVpg.js +1 -0
- package/dist/web/assets/card-c-gradient-CZXVGuNd.js +1 -0
- package/dist/web/assets/card-d-dashboard-CHKD-PnB.js +1 -0
- package/dist/web/assets/dist-CWaokT35.js +56 -0
- package/dist/web/assets/index-B-HrjaDy.css +1 -0
- package/dist/web/assets/index-BZYcD76T.js +633 -0
- package/dist/web/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff +0 -0
- package/dist/web/assets/patterns-BPeZb9N0.js +1 -0
- package/dist/web/assets/stats-BSwqSiFU.js +1 -0
- package/dist/web/assets/thread-D2AXyhOx.js +1 -0
- package/dist/web/index.html +8 -2
- package/package.json +58 -18
- package/scripts/postinstall.mjs +38 -0
- package/dist/cli.js.map +0 -1
- package/dist/commands/activate.js +0 -69
- package/dist/commands/activate.js.map +0 -1
- package/dist/commands/audit-secrets.js +0 -103
- package/dist/commands/audit-secrets.js.map +0 -1
- package/dist/commands/blame.js +0 -35
- package/dist/commands/blame.js.map +0 -1
- package/dist/commands/config-verification.js +0 -18
- package/dist/commands/config-verification.js.map +0 -1
- package/dist/commands/context.js +0 -144
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/correlate.js +0 -70
- package/dist/commands/correlate.js.map +0 -1
- package/dist/commands/digest.js +0 -78
- package/dist/commands/digest.js.map +0 -1
- package/dist/commands/health.js +0 -62
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/index.js +0 -247
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/install-extension.js +0 -138
- package/dist/commands/install-extension.js.map +0 -1
- package/dist/commands/license.js +0 -39
- package/dist/commands/license.js.map +0 -1
- package/dist/commands/list.js +0 -47
- package/dist/commands/list.js.map +0 -1
- package/dist/commands/mcp.js +0 -29
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/open.js +0 -28
- package/dist/commands/open.js.map +0 -1
- package/dist/commands/paste.js +0 -154
- package/dist/commands/paste.js.map +0 -1
- package/dist/commands/projects.js +0 -36
- package/dist/commands/projects.js.map +0 -1
- package/dist/commands/search.js +0 -67
- package/dist/commands/search.js.map +0 -1
- package/dist/commands/semantic.js +0 -173
- package/dist/commands/semantic.js.map +0 -1
- package/dist/commands/show.js +0 -121
- package/dist/commands/show.js.map +0 -1
- package/dist/commands/start.js +0 -47
- package/dist/commands/start.js.map +0 -1
- package/dist/commands/stats.js +0 -133
- package/dist/commands/stats.js.map +0 -1
- package/dist/commands/status.js +0 -45
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/stop.js +0 -29
- package/dist/commands/stop.js.map +0 -1
- package/dist/commands/thread.js +0 -396
- package/dist/commands/thread.js.map +0 -1
- package/dist/context/formatter.js +0 -103
- package/dist/context/formatter.js.map +0 -1
- package/dist/daemon/auto-tag-config.js +0 -103
- package/dist/daemon/auto-tag-config.js.map +0 -1
- package/dist/daemon/auto-tag-config.test.js +0 -72
- package/dist/daemon/auto-tag-config.test.js.map +0 -1
- package/dist/daemon/auto-title-config.js +0 -70
- package/dist/daemon/auto-title-config.js.map +0 -1
- package/dist/daemon/bulk-title-jobs.js +0 -170
- package/dist/daemon/bulk-title-jobs.js.map +0 -1
- package/dist/daemon/correlator.js +0 -320
- package/dist/daemon/correlator.js.map +0 -1
- package/dist/daemon/discover.js +0 -316
- package/dist/daemon/discover.js.map +0 -1
- package/dist/daemon/editor-detection.js +0 -186
- package/dist/daemon/editor-detection.js.map +0 -1
- package/dist/daemon/entrypoint.js.map +0 -1
- package/dist/daemon/git-correlator.js +0 -256
- package/dist/daemon/git-correlator.js.map +0 -1
- package/dist/daemon/mcp-installer.js +0 -108
- package/dist/daemon/mcp-installer.js.map +0 -1
- package/dist/daemon/onboarding-state.js +0 -140
- package/dist/daemon/onboarding-state.js.map +0 -1
- package/dist/daemon/pidfile.js +0 -57
- package/dist/daemon/pidfile.js.map +0 -1
- package/dist/daemon/ports.js +0 -48
- package/dist/daemon/ports.js.map +0 -1
- package/dist/daemon/scanProgressRegistry.js +0 -62
- package/dist/daemon/scanProgressRegistry.js.map +0 -1
- package/dist/daemon/server.js +0 -2010
- package/dist/daemon/server.js.map +0 -1
- package/dist/daemon/tag-scanner/anthropic-client.js +0 -40
- package/dist/daemon/tag-scanner/anthropic-client.js.map +0 -1
- package/dist/daemon/tag-scanner/autopilot.js +0 -131
- package/dist/daemon/tag-scanner/autopilot.js.map +0 -1
- package/dist/daemon/tag-scanner/claude-cli-driver.js +0 -250
- package/dist/daemon/tag-scanner/claude-cli-driver.js.map +0 -1
- package/dist/daemon/tag-scanner/orchestrator.js +0 -88
- package/dist/daemon/tag-scanner/orchestrator.js.map +0 -1
- package/dist/daemon/tag-scanner/prompt.js +0 -46
- package/dist/daemon/tag-scanner/prompt.js.map +0 -1
- package/dist/daemon/tag-scanner/prompt.test.js +0 -48
- package/dist/daemon/tag-scanner/prompt.test.js.map +0 -1
- package/dist/daemon/tag-scanner/scan-state.js +0 -49
- package/dist/daemon/tag-scanner/scan-state.js.map +0 -1
- package/dist/daemon/tag-scanner/session-fetcher.js +0 -82
- package/dist/daemon/tag-scanner/session-fetcher.js.map +0 -1
- package/dist/daemon/tag-scanner/session-fetcher.test.js +0 -34
- package/dist/daemon/tag-scanner/session-fetcher.test.js.map +0 -1
- package/dist/daemon/tag-scanner/validator.js +0 -50
- package/dist/daemon/tag-scanner/validator.js.map +0 -1
- package/dist/daemon/tag-scanner/validator.test.js +0 -41
- package/dist/daemon/tag-scanner/validator.test.js.map +0 -1
- package/dist/daemon/terminal-registry.js +0 -443
- package/dist/daemon/terminal-registry.js.map +0 -1
- package/dist/daemon/ui.js +0 -64
- package/dist/daemon/ui.js.map +0 -1
- package/dist/daemon/watcher.js +0 -256
- package/dist/daemon/watcher.js.map +0 -1
- package/dist/db/client.js +0 -22
- package/dist/db/client.js.map +0 -1
- package/dist/db/schema.js +0 -496
- package/dist/db/schema.js.map +0 -1
- package/dist/license/api-base.js +0 -13
- package/dist/license/api-base.js.map +0 -1
- package/dist/license/manager.js +0 -43
- package/dist/license/manager.js.map +0 -1
- package/dist/license/public-key.js +0 -19
- package/dist/license/public-key.js.map +0 -1
- package/dist/license/storage.js +0 -27
- package/dist/license/storage.js.map +0 -1
- package/dist/license/verify.js +0 -23
- package/dist/license/verify.js.map +0 -1
- package/dist/mcp/audit.js +0 -126
- package/dist/mcp/audit.js.map +0 -1
- package/dist/mcp/prompts.js +0 -180
- package/dist/mcp/prompts.js.map +0 -1
- package/dist/mcp/server.js +0 -502
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/thread-tools.js +0 -363
- package/dist/mcp/thread-tools.js.map +0 -1
- package/dist/mcp/write-tools.js +0 -239
- package/dist/mcp/write-tools.js.map +0 -1
- package/dist/parser/jsonl.js +0 -150
- package/dist/parser/jsonl.js.map +0 -1
- package/dist/semantic/chunker.js +0 -47
- package/dist/semantic/chunker.js.map +0 -1
- package/dist/semantic/config.js +0 -74
- package/dist/semantic/config.js.map +0 -1
- package/dist/semantic/embedder.js +0 -54
- package/dist/semantic/embedder.js.map +0 -1
- package/dist/semantic/fusion.js +0 -38
- package/dist/semantic/fusion.js.map +0 -1
- package/dist/semantic/model-download.js +0 -69
- package/dist/semantic/model-download.js.map +0 -1
- package/dist/semantic/pipeline.js +0 -375
- package/dist/semantic/pipeline.js.map +0 -1
- package/dist/semantic/query.js +0 -42
- package/dist/semantic/query.js.map +0 -1
- package/dist/semantic/worker.js +0 -78
- package/dist/semantic/worker.js.map +0 -1
- package/dist/stats/backfill.js +0 -151
- package/dist/stats/backfill.js.map +0 -1
- package/dist/stats/health.js +0 -102
- package/dist/stats/health.js.map +0 -1
- package/dist/stats/query.js +0 -385
- package/dist/stats/query.js.map +0 -1
- package/dist/utils/aliases.js +0 -107
- package/dist/utils/aliases.js.map +0 -1
- package/dist/utils/autoCollections.js +0 -635
- package/dist/utils/autoCollections.js.map +0 -1
- package/dist/utils/autoTitle.js +0 -348
- package/dist/utils/autoTitle.js.map +0 -1
- package/dist/utils/collections.js +0 -446
- package/dist/utils/collections.js.map +0 -1
- package/dist/utils/format.js +0 -46
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/notes.js +0 -270
- package/dist/utils/notes.js.map +0 -1
- package/dist/utils/paths.js +0 -50
- package/dist/utils/paths.js.map +0 -1
- package/dist/utils/pricing.js +0 -257
- package/dist/utils/pricing.js.map +0 -1
- package/dist/utils/secret-scanner.js +0 -166
- package/dist/utils/secret-scanner.js.map +0 -1
- package/dist/utils/sessionLabel.js +0 -64
- package/dist/utils/sessionLabel.js.map +0 -1
- package/dist/utils/tags.js +0 -97
- package/dist/utils/tags.js.map +0 -1
- package/dist/utils/thread-context.js +0 -129
- package/dist/utils/thread-context.js.map +0 -1
- package/dist/utils/threadFilter.js +0 -18
- package/dist/utils/threadFilter.js.map +0 -1
- package/dist/utils/threads-titler.js +0 -298
- package/dist/utils/threads-titler.js.map +0 -1
- package/dist/utils/threads.js +0 -383
- package/dist/utils/threads.js.map +0 -1
- package/dist/utils/usage.js +0 -76
- package/dist/utils/usage.js.map +0 -1
- package/dist/verification/compute.js +0 -88
- package/dist/verification/compute.js.map +0 -1
- package/dist/verification/config.js +0 -34
- package/dist/verification/config.js.map +0 -1
- package/dist/web/assets/index-CIr6J4Fw.js +0 -1201
- package/dist/web/assets/index-Ctc8g9Jw.css +0 -1
|
@@ -1,446 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { writeFileSync, readFileSync, existsSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { getDb } from '../db/client.js';
|
|
5
|
-
import { RECALL_HOME, ensureRecallHome } from './paths.js';
|
|
6
|
-
/**
|
|
7
|
-
* v0.8 — Collections. A hand-picked, hierarchical grouping of sessions.
|
|
8
|
-
*
|
|
9
|
-
* Three durability layers (same pattern as aliases / notes / tags):
|
|
10
|
-
*
|
|
11
|
-
* 1. SQLite — `collections`, `collection_sessions`, `collection_events`.
|
|
12
|
-
* 2. Plain-text mirror — `~/.recall/collections.json` rewritten on every
|
|
13
|
-
* mutation, with both current state *and* the full event log so the
|
|
14
|
-
* entire tree can be reconstructed from this single file.
|
|
15
|
-
* 3. Source JSONLs at ~/.claude/projects/ are read-only to us — unchanged.
|
|
16
|
-
*
|
|
17
|
-
* Never hard-delete. `archived_at` hides collections; `collection_sessions`
|
|
18
|
-
* rows are removed from the membership table but the removal is recorded
|
|
19
|
-
* in `collection_events` forever, so the full history is always recoverable.
|
|
20
|
-
*/
|
|
21
|
-
export const COLLECTIONS_BACKUP_FILE = join(RECALL_HOME, 'collections.json');
|
|
22
|
-
export const MAX_DEPTH = 8;
|
|
23
|
-
function rowFromDb(r) {
|
|
24
|
-
return { ...r };
|
|
25
|
-
}
|
|
26
|
-
function logEvent(collectionId, action, payload, sessionId = null, at = new Date().toISOString()) {
|
|
27
|
-
getDb()
|
|
28
|
-
.prepare(`INSERT INTO collection_events (collection_id, session_id, action, payload, at)
|
|
29
|
-
VALUES (?, ?, ?, ?, ?)`)
|
|
30
|
-
.run(collectionId, sessionId, action, payload ? JSON.stringify(payload) : null, at);
|
|
31
|
-
}
|
|
32
|
-
function mustExist(id) {
|
|
33
|
-
const row = getDb()
|
|
34
|
-
.prepare('SELECT * FROM collections WHERE id = ?')
|
|
35
|
-
.get(id);
|
|
36
|
-
if (!row)
|
|
37
|
-
throw new Error(`collection not found: ${id}`);
|
|
38
|
-
return row;
|
|
39
|
-
}
|
|
40
|
-
function depthOf(collectionId) {
|
|
41
|
-
if (!collectionId)
|
|
42
|
-
return 0;
|
|
43
|
-
let depth = 0;
|
|
44
|
-
let current = collectionId;
|
|
45
|
-
const seen = new Set();
|
|
46
|
-
const db = getDb();
|
|
47
|
-
while (current) {
|
|
48
|
-
if (seen.has(current))
|
|
49
|
-
throw new Error('collection cycle detected');
|
|
50
|
-
seen.add(current);
|
|
51
|
-
const row = db
|
|
52
|
-
.prepare('SELECT parent_id FROM collections WHERE id = ?')
|
|
53
|
-
.get(current);
|
|
54
|
-
if (!row)
|
|
55
|
-
break;
|
|
56
|
-
depth += 1;
|
|
57
|
-
current = row.parent_id;
|
|
58
|
-
}
|
|
59
|
-
return depth;
|
|
60
|
-
}
|
|
61
|
-
function isDescendantOf(candidateParentId, potentialAncestorId) {
|
|
62
|
-
const db = getDb();
|
|
63
|
-
let current = candidateParentId;
|
|
64
|
-
const seen = new Set();
|
|
65
|
-
while (current) {
|
|
66
|
-
if (seen.has(current))
|
|
67
|
-
return false;
|
|
68
|
-
seen.add(current);
|
|
69
|
-
if (current === potentialAncestorId)
|
|
70
|
-
return true;
|
|
71
|
-
const row = db
|
|
72
|
-
.prepare('SELECT parent_id FROM collections WHERE id = ?')
|
|
73
|
-
.get(current);
|
|
74
|
-
if (!row)
|
|
75
|
-
return false;
|
|
76
|
-
current = row.parent_id;
|
|
77
|
-
}
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
export function listCollections(includeArchived = false) {
|
|
81
|
-
const db = getDb();
|
|
82
|
-
const rows = db
|
|
83
|
-
.prepare(`SELECT c.*,
|
|
84
|
-
(SELECT COUNT(*) FROM collection_sessions cs WHERE cs.collection_id = c.id) AS session_count
|
|
85
|
-
FROM collections c
|
|
86
|
-
${includeArchived ? '' : 'WHERE c.archived_at IS NULL'}
|
|
87
|
-
ORDER BY c.parent_id IS NOT NULL, c.parent_id, c.sort_key, LOWER(c.name)`)
|
|
88
|
-
.all();
|
|
89
|
-
return rows.map((r) => ({ ...rowFromDb(r), session_count: r.session_count }));
|
|
90
|
-
}
|
|
91
|
-
export function getCollection(id) {
|
|
92
|
-
const row = getDb()
|
|
93
|
-
.prepare('SELECT * FROM collections WHERE id = ?')
|
|
94
|
-
.get(id);
|
|
95
|
-
return row ? rowFromDb(row) : null;
|
|
96
|
-
}
|
|
97
|
-
export function sessionsInCollection(collectionId, includeDescendants = true) {
|
|
98
|
-
const db = getDb();
|
|
99
|
-
const ids = includeDescendants ? descendantIds(collectionId) : [collectionId];
|
|
100
|
-
if (ids.length === 0)
|
|
101
|
-
return [];
|
|
102
|
-
const placeholders = ids.map(() => '?').join(',');
|
|
103
|
-
return db
|
|
104
|
-
.prepare(`SELECT collection_id, session_id, added_at, note, source, rule_id
|
|
105
|
-
FROM collection_sessions
|
|
106
|
-
WHERE collection_id IN (${placeholders})
|
|
107
|
-
ORDER BY added_at DESC`)
|
|
108
|
-
.all(...ids);
|
|
109
|
-
}
|
|
110
|
-
/** Returns ids of the collection itself + every descendant. */
|
|
111
|
-
export function descendantIds(collectionId) {
|
|
112
|
-
const db = getDb();
|
|
113
|
-
const out = [collectionId];
|
|
114
|
-
let frontier = [collectionId];
|
|
115
|
-
const seen = new Set([collectionId]);
|
|
116
|
-
while (frontier.length > 0) {
|
|
117
|
-
const placeholders = frontier.map(() => '?').join(',');
|
|
118
|
-
const children = db
|
|
119
|
-
.prepare(`SELECT id FROM collections WHERE parent_id IN (${placeholders})`)
|
|
120
|
-
.all(...frontier);
|
|
121
|
-
const next = [];
|
|
122
|
-
for (const c of children) {
|
|
123
|
-
if (!seen.has(c.id)) {
|
|
124
|
-
seen.add(c.id);
|
|
125
|
-
out.push(c.id);
|
|
126
|
-
next.push(c.id);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
frontier = next;
|
|
130
|
-
}
|
|
131
|
-
return out;
|
|
132
|
-
}
|
|
133
|
-
export function collectionsForSession(sessionId) {
|
|
134
|
-
return getDb()
|
|
135
|
-
.prepare(`SELECT c.* FROM collections c
|
|
136
|
-
JOIN collection_sessions cs ON cs.collection_id = c.id
|
|
137
|
-
WHERE cs.session_id = ? AND c.archived_at IS NULL
|
|
138
|
-
ORDER BY LOWER(c.name)`)
|
|
139
|
-
.all(sessionId);
|
|
140
|
-
}
|
|
141
|
-
export function createCollection(input) {
|
|
142
|
-
const name = (input.name ?? '').trim();
|
|
143
|
-
if (!name)
|
|
144
|
-
throw new Error('name required');
|
|
145
|
-
if (name.length > 120)
|
|
146
|
-
throw new Error('name too long (max 120 chars)');
|
|
147
|
-
const db = getDb();
|
|
148
|
-
const now = new Date().toISOString();
|
|
149
|
-
const id = randomUUID();
|
|
150
|
-
if (input.parent_id) {
|
|
151
|
-
const parent = getCollection(input.parent_id);
|
|
152
|
-
if (!parent)
|
|
153
|
-
throw new Error('parent collection not found');
|
|
154
|
-
if (depthOf(input.parent_id) >= MAX_DEPTH - 1) {
|
|
155
|
-
throw new Error(`max collection depth is ${MAX_DEPTH}`);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
const txn = db.transaction(() => {
|
|
159
|
-
db.prepare(`INSERT INTO collections
|
|
160
|
-
(id, name, description, icon, color, parent_id, sort_key, created_at, updated_at, archived_at)
|
|
161
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL)`).run(id, name, input.description ?? null, input.icon ?? null, input.color ?? null, input.parent_id ?? null, input.sort_key ?? '', now, now);
|
|
162
|
-
logEvent(id, 'create', {
|
|
163
|
-
name,
|
|
164
|
-
parent_id: input.parent_id ?? null,
|
|
165
|
-
icon: input.icon ?? null,
|
|
166
|
-
color: input.color ?? null,
|
|
167
|
-
}, null, now);
|
|
168
|
-
});
|
|
169
|
-
txn();
|
|
170
|
-
backupCollections();
|
|
171
|
-
return getCollection(id);
|
|
172
|
-
}
|
|
173
|
-
export function patchCollection(id, patch) {
|
|
174
|
-
const db = getDb();
|
|
175
|
-
const existing = mustExist(id);
|
|
176
|
-
const now = new Date().toISOString();
|
|
177
|
-
const next = {
|
|
178
|
-
name: patch.name !== undefined ? patch.name.trim() : existing.name,
|
|
179
|
-
description: patch.description !== undefined ? patch.description : existing.description,
|
|
180
|
-
icon: patch.icon !== undefined ? patch.icon : existing.icon,
|
|
181
|
-
color: patch.color !== undefined ? patch.color : existing.color,
|
|
182
|
-
parent_id: patch.parent_id !== undefined ? patch.parent_id : existing.parent_id,
|
|
183
|
-
sort_key: patch.sort_key !== undefined ? patch.sort_key : existing.sort_key,
|
|
184
|
-
};
|
|
185
|
-
if (!next.name)
|
|
186
|
-
throw new Error('name required');
|
|
187
|
-
if (next.name.length > 120)
|
|
188
|
-
throw new Error('name too long (max 120 chars)');
|
|
189
|
-
if (patch.parent_id !== undefined && patch.parent_id !== existing.parent_id) {
|
|
190
|
-
if (patch.parent_id) {
|
|
191
|
-
if (patch.parent_id === id)
|
|
192
|
-
throw new Error('cannot set parent to self');
|
|
193
|
-
const parent = getCollection(patch.parent_id);
|
|
194
|
-
if (!parent)
|
|
195
|
-
throw new Error('parent collection not found');
|
|
196
|
-
if (isDescendantOf(patch.parent_id, id)) {
|
|
197
|
-
throw new Error('cannot move collection into one of its descendants');
|
|
198
|
-
}
|
|
199
|
-
if (depthOf(patch.parent_id) >= MAX_DEPTH - 1) {
|
|
200
|
-
throw new Error(`max collection depth is ${MAX_DEPTH}`);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
const txn = db.transaction(() => {
|
|
205
|
-
db.prepare(`UPDATE collections
|
|
206
|
-
SET name = ?, description = ?, icon = ?, color = ?,
|
|
207
|
-
parent_id = ?, sort_key = ?, updated_at = ?
|
|
208
|
-
WHERE id = ?`).run(next.name, next.description, next.icon, next.color, next.parent_id, next.sort_key, now, id);
|
|
209
|
-
if (patch.name !== undefined && patch.name !== existing.name) {
|
|
210
|
-
logEvent(id, 'rename', { from: existing.name, to: next.name }, null, now);
|
|
211
|
-
}
|
|
212
|
-
if (patch.description !== undefined &&
|
|
213
|
-
patch.description !== existing.description) {
|
|
214
|
-
logEvent(id, 'describe', { description: next.description }, null, now);
|
|
215
|
-
}
|
|
216
|
-
if ((patch.icon !== undefined && patch.icon !== existing.icon) ||
|
|
217
|
-
(patch.color !== undefined && patch.color !== existing.color)) {
|
|
218
|
-
logEvent(id, 'recolor', { icon: next.icon, color: next.color }, null, now);
|
|
219
|
-
}
|
|
220
|
-
if (patch.parent_id !== undefined &&
|
|
221
|
-
patch.parent_id !== existing.parent_id) {
|
|
222
|
-
logEvent(id, 'move', { from: existing.parent_id, to: next.parent_id }, null, now);
|
|
223
|
-
}
|
|
224
|
-
if (patch.sort_key !== undefined &&
|
|
225
|
-
patch.sort_key !== existing.sort_key) {
|
|
226
|
-
logEvent(id, 'reorder', { from: existing.sort_key, to: next.sort_key }, null, now);
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
txn();
|
|
230
|
-
backupCollections();
|
|
231
|
-
return getCollection(id);
|
|
232
|
-
}
|
|
233
|
-
export function archiveCollection(id) {
|
|
234
|
-
const db = getDb();
|
|
235
|
-
const existing = mustExist(id);
|
|
236
|
-
if (existing.archived_at)
|
|
237
|
-
return rowFromDb(existing);
|
|
238
|
-
const now = new Date().toISOString();
|
|
239
|
-
const txn = db.transaction(() => {
|
|
240
|
-
db.prepare('UPDATE collections SET archived_at = ?, updated_at = ? WHERE id = ?').run(now, now, id);
|
|
241
|
-
logEvent(id, 'archive', { name: existing.name }, null, now);
|
|
242
|
-
});
|
|
243
|
-
txn();
|
|
244
|
-
backupCollections();
|
|
245
|
-
return getCollection(id);
|
|
246
|
-
}
|
|
247
|
-
export function restoreCollection(id) {
|
|
248
|
-
const db = getDb();
|
|
249
|
-
const existing = mustExist(id);
|
|
250
|
-
if (!existing.archived_at)
|
|
251
|
-
return rowFromDb(existing);
|
|
252
|
-
const now = new Date().toISOString();
|
|
253
|
-
const txn = db.transaction(() => {
|
|
254
|
-
db.prepare('UPDATE collections SET archived_at = NULL, updated_at = ? WHERE id = ?').run(now, id);
|
|
255
|
-
logEvent(id, 'restore', { name: existing.name }, null, now);
|
|
256
|
-
});
|
|
257
|
-
txn();
|
|
258
|
-
backupCollections();
|
|
259
|
-
return getCollection(id);
|
|
260
|
-
}
|
|
261
|
-
export function addSessionToCollection(collectionId, sessionId, note = null, opts = {}) {
|
|
262
|
-
const db = getDb();
|
|
263
|
-
mustExist(collectionId);
|
|
264
|
-
const sessionExists = db
|
|
265
|
-
.prepare('SELECT 1 FROM sessions WHERE id = ?')
|
|
266
|
-
.get(sessionId);
|
|
267
|
-
if (!sessionExists)
|
|
268
|
-
throw new Error(`session not found: ${sessionId}`);
|
|
269
|
-
const already = db
|
|
270
|
-
.prepare('SELECT 1 FROM collection_sessions WHERE collection_id = ? AND session_id = ?')
|
|
271
|
-
.get(collectionId, sessionId);
|
|
272
|
-
// A row already exists — we never overwrite. Crucially this protects manual
|
|
273
|
-
// memberships from the rule engine: the auto path calls this with
|
|
274
|
-
// source='auto' and silently no-ops when the user has already added the
|
|
275
|
-
// session by hand.
|
|
276
|
-
if (already)
|
|
277
|
-
return { added: false };
|
|
278
|
-
const source = opts.source ?? 'manual';
|
|
279
|
-
const ruleId = opts.rule_id ?? null;
|
|
280
|
-
if (source === 'auto' && !ruleId) {
|
|
281
|
-
throw new Error('auto membership requires a rule_id');
|
|
282
|
-
}
|
|
283
|
-
const now = new Date().toISOString();
|
|
284
|
-
const txn = db.transaction(() => {
|
|
285
|
-
db.prepare(`INSERT INTO collection_sessions (collection_id, session_id, added_at, note, source, rule_id)
|
|
286
|
-
VALUES (?, ?, ?, ?, ?, ?)`).run(collectionId, sessionId, now, note, source, ruleId);
|
|
287
|
-
logEvent(collectionId, 'add', { note, source, rule_id: ruleId }, sessionId, now);
|
|
288
|
-
});
|
|
289
|
-
txn();
|
|
290
|
-
backupCollections();
|
|
291
|
-
return { added: true };
|
|
292
|
-
}
|
|
293
|
-
export function removeSessionFromCollection(collectionId, sessionId) {
|
|
294
|
-
const db = getDb();
|
|
295
|
-
const existed = db
|
|
296
|
-
.prepare('SELECT 1 FROM collection_sessions WHERE collection_id = ? AND session_id = ?')
|
|
297
|
-
.get(collectionId, sessionId);
|
|
298
|
-
if (!existed)
|
|
299
|
-
return { removed: false };
|
|
300
|
-
const now = new Date().toISOString();
|
|
301
|
-
const txn = db.transaction(() => {
|
|
302
|
-
db.prepare('DELETE FROM collection_sessions WHERE collection_id = ? AND session_id = ?').run(collectionId, sessionId);
|
|
303
|
-
logEvent(collectionId, 'remove', null, sessionId, now);
|
|
304
|
-
});
|
|
305
|
-
txn();
|
|
306
|
-
backupCollections();
|
|
307
|
-
return { removed: true };
|
|
308
|
-
}
|
|
309
|
-
export function getMembership(collectionId, sessionId) {
|
|
310
|
-
const row = getDb()
|
|
311
|
-
.prepare(`SELECT collection_id, session_id, added_at, note, source, rule_id
|
|
312
|
-
FROM collection_sessions
|
|
313
|
-
WHERE collection_id = ? AND session_id = ?`)
|
|
314
|
-
.get(collectionId, sessionId);
|
|
315
|
-
return row ?? null;
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* v0.15 T6 — delete ALL memberships authored by the given rule. Uses the
|
|
319
|
-
* `rule_id` column so manual rows (rule_id IS NULL) are untouched by design —
|
|
320
|
-
* the UNIQUE PK (collection, session) means one session has at most one row
|
|
321
|
-
* per collection, and that row either belongs to a rule or it doesn't.
|
|
322
|
-
*
|
|
323
|
-
* Returns the number of rows removed so callers can log what happened.
|
|
324
|
-
* Each removal is logged into `collection_events` for durability.
|
|
325
|
-
*/
|
|
326
|
-
export function removeMembershipsByRule(ruleId) {
|
|
327
|
-
const db = getDb();
|
|
328
|
-
const rows = db
|
|
329
|
-
.prepare(`SELECT collection_id, session_id FROM collection_sessions
|
|
330
|
-
WHERE rule_id = ?`)
|
|
331
|
-
.all(ruleId);
|
|
332
|
-
if (rows.length === 0)
|
|
333
|
-
return { removed: 0 };
|
|
334
|
-
const now = new Date().toISOString();
|
|
335
|
-
const txn = db.transaction(() => {
|
|
336
|
-
db.prepare('DELETE FROM collection_sessions WHERE rule_id = ?').run(ruleId);
|
|
337
|
-
for (const r of rows) {
|
|
338
|
-
logEvent(r.collection_id, 'remove', { rule_id: ruleId }, r.session_id, now);
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
txn();
|
|
342
|
-
backupCollections();
|
|
343
|
-
return { removed: rows.length };
|
|
344
|
-
}
|
|
345
|
-
export function allCollectionEvents() {
|
|
346
|
-
return getDb()
|
|
347
|
-
.prepare(`SELECT id, collection_id, session_id, action, payload, at
|
|
348
|
-
FROM collection_events
|
|
349
|
-
ORDER BY at ASC, id ASC`)
|
|
350
|
-
.all();
|
|
351
|
-
}
|
|
352
|
-
export function backupCollections() {
|
|
353
|
-
try {
|
|
354
|
-
ensureRecallHome();
|
|
355
|
-
const db = getDb();
|
|
356
|
-
const collections = db
|
|
357
|
-
.prepare(`SELECT id, name, description, icon, color, parent_id, sort_key,
|
|
358
|
-
created_at, updated_at, archived_at
|
|
359
|
-
FROM collections
|
|
360
|
-
ORDER BY COALESCE(parent_id, ''), sort_key, LOWER(name)`)
|
|
361
|
-
.all();
|
|
362
|
-
const memberships = db
|
|
363
|
-
.prepare(`SELECT collection_id, session_id, added_at, note, source, rule_id
|
|
364
|
-
FROM collection_sessions
|
|
365
|
-
ORDER BY collection_id, added_at`)
|
|
366
|
-
.all();
|
|
367
|
-
const events = allCollectionEvents();
|
|
368
|
-
const payload = {
|
|
369
|
-
schema: 'claude-recall.collections.v1',
|
|
370
|
-
backed_up_at: new Date().toISOString(),
|
|
371
|
-
collections,
|
|
372
|
-
memberships,
|
|
373
|
-
events,
|
|
374
|
-
};
|
|
375
|
-
writeFileSync(COLLECTIONS_BACKUP_FILE, JSON.stringify(payload, null, 2));
|
|
376
|
-
}
|
|
377
|
-
catch (err) {
|
|
378
|
-
console.error('[collections] backup failed:', err);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
/**
|
|
382
|
-
* Restore from the plain-text mirror. Used by the `recall` CLI recovery path
|
|
383
|
-
* when the SQLite database has been wiped but the user still has the JSON
|
|
384
|
-
* file on disk. Idempotent: safe to call when rows already exist (skips them).
|
|
385
|
-
*/
|
|
386
|
-
export function restoreFromBackupFile(path = COLLECTIONS_BACKUP_FILE) {
|
|
387
|
-
if (!existsSync(path)) {
|
|
388
|
-
return { collections: 0, memberships: 0, events: 0 };
|
|
389
|
-
}
|
|
390
|
-
let parsed;
|
|
391
|
-
try {
|
|
392
|
-
parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
393
|
-
}
|
|
394
|
-
catch (err) {
|
|
395
|
-
throw new Error(`invalid collections backup: ${err.message}`);
|
|
396
|
-
}
|
|
397
|
-
if (parsed.schema && !parsed.schema.startsWith('claude-recall.collections.')) {
|
|
398
|
-
throw new Error(`unexpected backup schema: ${parsed.schema}`);
|
|
399
|
-
}
|
|
400
|
-
const db = getDb();
|
|
401
|
-
let collectionsRestored = 0;
|
|
402
|
-
let membershipsRestored = 0;
|
|
403
|
-
let eventsRestored = 0;
|
|
404
|
-
const txn = db.transaction(() => {
|
|
405
|
-
for (const c of parsed.collections ?? []) {
|
|
406
|
-
const exists = db
|
|
407
|
-
.prepare('SELECT 1 FROM collections WHERE id = ?')
|
|
408
|
-
.get(c.id);
|
|
409
|
-
if (exists)
|
|
410
|
-
continue;
|
|
411
|
-
db.prepare(`INSERT INTO collections
|
|
412
|
-
(id, name, description, icon, color, parent_id, sort_key,
|
|
413
|
-
created_at, updated_at, archived_at)
|
|
414
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(c.id, c.name, c.description, c.icon, c.color, c.parent_id, c.sort_key, c.created_at, c.updated_at, c.archived_at);
|
|
415
|
-
collectionsRestored += 1;
|
|
416
|
-
}
|
|
417
|
-
for (const m of parsed.memberships ?? []) {
|
|
418
|
-
const sessionExists = db
|
|
419
|
-
.prepare('SELECT 1 FROM sessions WHERE id = ?')
|
|
420
|
-
.get(m.session_id);
|
|
421
|
-
if (!sessionExists)
|
|
422
|
-
continue;
|
|
423
|
-
const exists = db
|
|
424
|
-
.prepare('SELECT 1 FROM collection_sessions WHERE collection_id = ? AND session_id = ?')
|
|
425
|
-
.get(m.collection_id, m.session_id);
|
|
426
|
-
if (exists)
|
|
427
|
-
continue;
|
|
428
|
-
db.prepare(`INSERT INTO collection_sessions (collection_id, session_id, added_at, note, source, rule_id)
|
|
429
|
-
VALUES (?, ?, ?, ?, ?, ?)`).run(m.collection_id, m.session_id, m.added_at, m.note, m.source ?? 'manual', m.rule_id ?? null);
|
|
430
|
-
membershipsRestored += 1;
|
|
431
|
-
}
|
|
432
|
-
for (const e of parsed.events ?? []) {
|
|
433
|
-
db.prepare(`INSERT INTO collection_events
|
|
434
|
-
(collection_id, session_id, action, payload, at)
|
|
435
|
-
VALUES (?, ?, ?, ?, ?)`).run(e.collection_id, e.session_id, e.action, e.payload, e.at);
|
|
436
|
-
eventsRestored += 1;
|
|
437
|
-
}
|
|
438
|
-
});
|
|
439
|
-
txn();
|
|
440
|
-
return {
|
|
441
|
-
collections: collectionsRestored,
|
|
442
|
-
memberships: membershipsRestored,
|
|
443
|
-
events: eventsRestored,
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
|
-
//# sourceMappingURL=collections.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/utils/collections.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/format.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { formatDistanceToNowStrict, parseISO } from 'date-fns';
|
|
3
|
-
export function truncate(s, n) {
|
|
4
|
-
if (!s)
|
|
5
|
-
return '';
|
|
6
|
-
const clean = s.replace(/\s+/g, ' ').trim();
|
|
7
|
-
return clean.length <= n ? clean : clean.slice(0, n - 1) + '…';
|
|
8
|
-
}
|
|
9
|
-
export function timeAgo(iso) {
|
|
10
|
-
if (!iso)
|
|
11
|
-
return '';
|
|
12
|
-
try {
|
|
13
|
-
return formatDistanceToNowStrict(parseISO(iso), { addSuffix: true });
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return '';
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export function shortId(id) {
|
|
20
|
-
return id.slice(0, 8);
|
|
21
|
-
}
|
|
22
|
-
export const c = {
|
|
23
|
-
dim: chalk.gray,
|
|
24
|
-
bold: chalk.bold,
|
|
25
|
-
project: chalk.cyan,
|
|
26
|
-
user: chalk.blue,
|
|
27
|
-
assistant: chalk.green,
|
|
28
|
-
tool: chalk.magenta,
|
|
29
|
-
warn: chalk.yellow,
|
|
30
|
-
err: chalk.red,
|
|
31
|
-
ok: chalk.green,
|
|
32
|
-
accent: chalk.hex('#f97316'),
|
|
33
|
-
};
|
|
34
|
-
export function highlight(text, query) {
|
|
35
|
-
if (!query)
|
|
36
|
-
return text;
|
|
37
|
-
const terms = query
|
|
38
|
-
.split(/\s+/)
|
|
39
|
-
.filter((t) => t.length > 1)
|
|
40
|
-
.map((t) => t.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
|
|
41
|
-
if (terms.length === 0)
|
|
42
|
-
return text;
|
|
43
|
-
const re = new RegExp(`(${terms.join('|')})`, 'gi');
|
|
44
|
-
return text.replace(re, (m) => chalk.bgYellow.black(m));
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=format.js.map
|
package/dist/utils/format.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,UAAU,QAAQ,CAAC,CAA4B,EAAE,CAAS;IAC9D,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAA8B;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,yBAAyB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,GAAG,EAAE,KAAK,CAAC,IAAI;IACf,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,OAAO,EAAE,KAAK,CAAC,IAAI;IACnB,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,SAAS,EAAE,KAAK,CAAC,KAAK;IACtB,IAAI,EAAE,KAAK,CAAC,OAAO;IACnB,IAAI,EAAE,KAAK,CAAC,MAAM;IAClB,GAAG,EAAE,KAAK,CAAC,GAAG;IACd,EAAE,EAAE,KAAK,CAAC,KAAK;IACf,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;CAC7B,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|