@clauderecallhq/cli 0.12.1 → 0.61.2
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 +316 -106
- package/dist/cli.js +1641 -361
- 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 +57 -16
- 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/installs.js +0 -128
- package/dist/commands/installs.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,635 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { basename, join } from 'node:path';
|
|
5
|
-
import { getDb } from '../db/client.js';
|
|
6
|
-
import { ensureRecallHome, RECALL_HOME } from './paths.js';
|
|
7
|
-
import { addSessionToCollection, createCollection, removeMembershipsByRule, } from './collections.js';
|
|
8
|
-
const AUTO_RULES_DIR = join(RECALL_HOME, 'auto-rules');
|
|
9
|
-
const RULES_MIRROR = join(AUTO_RULES_DIR, 'rules.json');
|
|
10
|
-
const SUGGESTIONS_MIRROR = join(AUTO_RULES_DIR, 'suggestions.json');
|
|
11
|
-
const TOP_LEVEL_REPOSITORIES = 'Repositories';
|
|
12
|
-
const TOP_LEVEL_TOPICS = 'Topics';
|
|
13
|
-
const CWD_CLUSTER_MIN = 3;
|
|
14
|
-
const PROJECT_CLUSTER_MIN = 3;
|
|
15
|
-
const TAG_CLUSTER_MIN = 5;
|
|
16
|
-
const PLAN_FILE_CLUSTER_MIN = 2;
|
|
17
|
-
/**
|
|
18
|
-
* Regexes recognised by the plan-file detector + matcher. Keep narrow —
|
|
19
|
-
* matching random `.md` files produces noise. ROADMAP.md / PROJECT.md are
|
|
20
|
-
* near-universal repo conventions; `docs/*.md` and `.planning/*` cover the
|
|
21
|
-
* rest of the common cases without running regexes on tool call bodies.
|
|
22
|
-
*/
|
|
23
|
-
const PLAN_FILE_REGEXES = [
|
|
24
|
-
/\bROADMAP\.md\b/g,
|
|
25
|
-
/\bPROJECT\.md\b/g,
|
|
26
|
-
/\bdocs\/[A-Za-z0-9._-]+\.md\b/g,
|
|
27
|
-
/\.planning\/[A-Za-z0-9._\-/]+/g,
|
|
28
|
-
];
|
|
29
|
-
function rowToRule(r) {
|
|
30
|
-
return {
|
|
31
|
-
id: r.id,
|
|
32
|
-
name: r.name,
|
|
33
|
-
type: r.type,
|
|
34
|
-
pattern: r.pattern,
|
|
35
|
-
collection_id: r.collection_id,
|
|
36
|
-
priority: r.priority,
|
|
37
|
-
enabled: r.enabled !== 0,
|
|
38
|
-
created_at: r.created_at,
|
|
39
|
-
created_by: r.created_by,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
function rowToSuggestion(r) {
|
|
43
|
-
return {
|
|
44
|
-
id: r.id,
|
|
45
|
-
type: r.type,
|
|
46
|
-
pattern: r.pattern,
|
|
47
|
-
suggested_name: r.suggested_name,
|
|
48
|
-
suggested_parent_collection_id: r.suggested_parent_collection_id,
|
|
49
|
-
session_count: r.session_count,
|
|
50
|
-
detected_at: r.detected_at,
|
|
51
|
-
dismissed: r.dismissed !== 0,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
function topLevelFor(type) {
|
|
55
|
-
switch (type) {
|
|
56
|
-
case 'cwd-prefix':
|
|
57
|
-
case 'project-id':
|
|
58
|
-
case 'git-branch-prefix':
|
|
59
|
-
return TOP_LEVEL_REPOSITORIES;
|
|
60
|
-
case 'tag':
|
|
61
|
-
return TOP_LEVEL_TOPICS;
|
|
62
|
-
case 'plan-file':
|
|
63
|
-
return null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function ensureTopLevel(name) {
|
|
67
|
-
const db = getDb();
|
|
68
|
-
const existing = db
|
|
69
|
-
.prepare('SELECT id FROM collections WHERE name = ? AND parent_id IS NULL AND archived_at IS NULL')
|
|
70
|
-
.get(name);
|
|
71
|
-
if (existing)
|
|
72
|
-
return existing.id;
|
|
73
|
-
const icon = name === TOP_LEVEL_REPOSITORIES ? '📦' : '🏷';
|
|
74
|
-
const sortKey = name === TOP_LEVEL_REPOSITORIES ? '0000-repos' : '0001-topics';
|
|
75
|
-
const coll = createCollection({ name, icon, sort_key: sortKey });
|
|
76
|
-
// Seed rule — disabled, matches nothing. Its sole purpose is to mark this
|
|
77
|
-
// collection as auto-managed for the UI badge query.
|
|
78
|
-
const db2 = getDb();
|
|
79
|
-
db2
|
|
80
|
-
.prepare(`INSERT INTO auto_collection_rules
|
|
81
|
-
(id, name, type, pattern, collection_id, priority, enabled, created_at, created_by)
|
|
82
|
-
VALUES (?, ?, 'cwd-prefix', '__seed__', ?, 1000, 0, ?, 'seed')`)
|
|
83
|
-
.run(randomUUID(), `seed:${name}`, coll.id, new Date().toISOString());
|
|
84
|
-
return coll.id;
|
|
85
|
-
}
|
|
86
|
-
/** Create a rule's target collection lazily under the correct top-level parent. */
|
|
87
|
-
function lazyCreateCollection(name, type, parentOverride) {
|
|
88
|
-
let parentId;
|
|
89
|
-
if (parentOverride !== undefined) {
|
|
90
|
-
parentId = parentOverride;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
const topName = topLevelFor(type);
|
|
94
|
-
parentId = topName ? ensureTopLevel(topName) : null;
|
|
95
|
-
}
|
|
96
|
-
const coll = createCollection({ name, parent_id: parentId });
|
|
97
|
-
return coll.id;
|
|
98
|
-
}
|
|
99
|
-
function getRuleById(id) {
|
|
100
|
-
const row = getDb()
|
|
101
|
-
.prepare('SELECT * FROM auto_collection_rules WHERE id = ?')
|
|
102
|
-
.get(id);
|
|
103
|
-
return row ? rowToRule(row) : null;
|
|
104
|
-
}
|
|
105
|
-
function matchingSessionIds(rule) {
|
|
106
|
-
const db = getDb();
|
|
107
|
-
switch (rule.type) {
|
|
108
|
-
case 'cwd-prefix': {
|
|
109
|
-
const rows = db
|
|
110
|
-
.prepare(`SELECT id FROM sessions WHERE cwd IS NOT NULL AND cwd LIKE ? ESCAPE '\\'`)
|
|
111
|
-
.all(escapeLike(rule.pattern) + '%');
|
|
112
|
-
return rows.map((r) => r.id);
|
|
113
|
-
}
|
|
114
|
-
case 'git-branch-prefix': {
|
|
115
|
-
const rows = db
|
|
116
|
-
.prepare(`SELECT id FROM sessions WHERE git_branch IS NOT NULL AND git_branch LIKE ? ESCAPE '\\'`)
|
|
117
|
-
.all(escapeLike(rule.pattern) + '%');
|
|
118
|
-
return rows.map((r) => r.id);
|
|
119
|
-
}
|
|
120
|
-
case 'project-id': {
|
|
121
|
-
const pid = Number(rule.pattern);
|
|
122
|
-
if (!Number.isFinite(pid))
|
|
123
|
-
return [];
|
|
124
|
-
const rows = db
|
|
125
|
-
.prepare('SELECT id FROM sessions WHERE project_id = ?')
|
|
126
|
-
.all(pid);
|
|
127
|
-
return rows.map((r) => r.id);
|
|
128
|
-
}
|
|
129
|
-
case 'tag': {
|
|
130
|
-
const rows = db
|
|
131
|
-
.prepare('SELECT session_id FROM session_tags WHERE tag = ?')
|
|
132
|
-
.all(rule.pattern);
|
|
133
|
-
return rows.map((r) => r.session_id);
|
|
134
|
-
}
|
|
135
|
-
case 'plan-file': {
|
|
136
|
-
const rows = db
|
|
137
|
-
.prepare(`SELECT id, first_user_message FROM sessions
|
|
138
|
-
WHERE first_user_message IS NOT NULL AND first_user_message LIKE ?`)
|
|
139
|
-
.all('%' + rule.pattern + '%');
|
|
140
|
-
return rows.map((r) => r.id);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Pulls up to `limit` sessions that would be captured by a rule of
|
|
146
|
-
* (type, pattern). Used by the UI to render a concrete preview beside each
|
|
147
|
-
* suggestion so the user sees what they are agreeing to before they click
|
|
148
|
-
* Accept. Order by recency; return a display title, cwd, and started_at.
|
|
149
|
-
*/
|
|
150
|
-
export function previewMatches(type, pattern, limit = 3) {
|
|
151
|
-
const db = getDb();
|
|
152
|
-
const baseCols = `s.id AS id, s.cwd AS cwd, s.started_at AS started_at,
|
|
153
|
-
sa.alias AS alias, s.auto_title AS auto_title, s.first_user_message AS first_user_message`;
|
|
154
|
-
const joinAliases = `LEFT JOIN session_aliases sa ON sa.session_id = s.id`;
|
|
155
|
-
let rows = [];
|
|
156
|
-
switch (type) {
|
|
157
|
-
case 'cwd-prefix':
|
|
158
|
-
rows = db
|
|
159
|
-
.prepare(`SELECT ${baseCols} FROM sessions s ${joinAliases}
|
|
160
|
-
WHERE s.cwd IS NOT NULL AND s.cwd LIKE ? ESCAPE '\\'
|
|
161
|
-
ORDER BY s.started_at DESC LIMIT ?`)
|
|
162
|
-
.all(escapeLike(pattern) + '%', limit);
|
|
163
|
-
break;
|
|
164
|
-
case 'git-branch-prefix':
|
|
165
|
-
rows = db
|
|
166
|
-
.prepare(`SELECT ${baseCols} FROM sessions s ${joinAliases}
|
|
167
|
-
WHERE s.git_branch IS NOT NULL AND s.git_branch LIKE ? ESCAPE '\\'
|
|
168
|
-
ORDER BY s.started_at DESC LIMIT ?`)
|
|
169
|
-
.all(escapeLike(pattern) + '%', limit);
|
|
170
|
-
break;
|
|
171
|
-
case 'project-id': {
|
|
172
|
-
const pid = Number(pattern);
|
|
173
|
-
if (Number.isFinite(pid)) {
|
|
174
|
-
rows = db
|
|
175
|
-
.prepare(`SELECT ${baseCols} FROM sessions s ${joinAliases}
|
|
176
|
-
WHERE s.project_id = ?
|
|
177
|
-
ORDER BY s.started_at DESC LIMIT ?`)
|
|
178
|
-
.all(pid, limit);
|
|
179
|
-
}
|
|
180
|
-
break;
|
|
181
|
-
}
|
|
182
|
-
case 'tag':
|
|
183
|
-
rows = db
|
|
184
|
-
.prepare(`SELECT ${baseCols} FROM sessions s ${joinAliases}
|
|
185
|
-
JOIN session_tags st ON st.session_id = s.id
|
|
186
|
-
WHERE st.tag = ?
|
|
187
|
-
ORDER BY s.started_at DESC LIMIT ?`)
|
|
188
|
-
.all(pattern, limit);
|
|
189
|
-
break;
|
|
190
|
-
case 'plan-file':
|
|
191
|
-
rows = db
|
|
192
|
-
.prepare(`SELECT ${baseCols} FROM sessions s ${joinAliases}
|
|
193
|
-
WHERE s.first_user_message IS NOT NULL
|
|
194
|
-
AND s.first_user_message LIKE ?
|
|
195
|
-
ORDER BY s.started_at DESC LIMIT ?`)
|
|
196
|
-
.all('%' + pattern + '%', limit);
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
return rows.map((r) => ({
|
|
200
|
-
id: r.id,
|
|
201
|
-
title: displayTitleFor(r),
|
|
202
|
-
cwd: r.cwd,
|
|
203
|
-
started_at: r.started_at,
|
|
204
|
-
}));
|
|
205
|
-
}
|
|
206
|
-
function displayTitleFor(row) {
|
|
207
|
-
if (row.alias && row.alias.trim())
|
|
208
|
-
return row.alias.trim();
|
|
209
|
-
if (row.auto_title && row.auto_title.trim())
|
|
210
|
-
return row.auto_title.trim();
|
|
211
|
-
const msg = (row.first_user_message ?? '').trim();
|
|
212
|
-
if (!msg)
|
|
213
|
-
return `session ${row.id.slice(0, 8)}`;
|
|
214
|
-
const firstLine = msg.split('\n')[0].trim();
|
|
215
|
-
return firstLine.length > 80 ? firstLine.slice(0, 80) + '…' : firstLine;
|
|
216
|
-
}
|
|
217
|
-
function sessionMatches(rule, session, db = getDb()) {
|
|
218
|
-
switch (rule.type) {
|
|
219
|
-
case 'cwd-prefix':
|
|
220
|
-
return !!session.cwd && session.cwd.startsWith(rule.pattern);
|
|
221
|
-
case 'git-branch-prefix':
|
|
222
|
-
return !!session.git_branch && session.git_branch.startsWith(rule.pattern);
|
|
223
|
-
case 'project-id': {
|
|
224
|
-
const pid = Number(rule.pattern);
|
|
225
|
-
return Number.isFinite(pid) && session.project_id === pid;
|
|
226
|
-
}
|
|
227
|
-
case 'tag': {
|
|
228
|
-
const hit = db
|
|
229
|
-
.prepare('SELECT 1 FROM session_tags WHERE session_id = ? AND tag = ?')
|
|
230
|
-
.get(session.id, rule.pattern);
|
|
231
|
-
return !!hit;
|
|
232
|
-
}
|
|
233
|
-
case 'plan-file':
|
|
234
|
-
return (!!session.first_user_message &&
|
|
235
|
-
session.first_user_message.includes(rule.pattern));
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Apply every enabled rule to a single session. Called by the watcher after
|
|
240
|
-
* indexing and by `backfillRule` when a rule is first created / accepted.
|
|
241
|
-
* Returns the number of auto rows newly inserted — existing rows
|
|
242
|
-
* (manual OR auto from another rule) are left alone.
|
|
243
|
-
*/
|
|
244
|
-
export function applyRulesToSession(sessionId) {
|
|
245
|
-
const db = getDb();
|
|
246
|
-
const session = db
|
|
247
|
-
.prepare('SELECT id, project_id, cwd, git_branch, first_user_message FROM sessions WHERE id = ?')
|
|
248
|
-
.get(sessionId);
|
|
249
|
-
if (!session)
|
|
250
|
-
return { added: 0 };
|
|
251
|
-
const rules = db
|
|
252
|
-
.prepare(`SELECT * FROM auto_collection_rules
|
|
253
|
-
WHERE enabled = 1 AND created_by != 'seed'
|
|
254
|
-
ORDER BY priority, created_at`)
|
|
255
|
-
.all();
|
|
256
|
-
let added = 0;
|
|
257
|
-
for (const row of rules) {
|
|
258
|
-
const rule = rowToRule(row);
|
|
259
|
-
if (!sessionMatches(rule, session, db))
|
|
260
|
-
continue;
|
|
261
|
-
try {
|
|
262
|
-
const result = addSessionToCollection(rule.collection_id, sessionId, null, {
|
|
263
|
-
source: 'auto',
|
|
264
|
-
rule_id: rule.id,
|
|
265
|
-
});
|
|
266
|
-
if (result.added)
|
|
267
|
-
added += 1;
|
|
268
|
-
}
|
|
269
|
-
catch (err) {
|
|
270
|
-
console.error(`[auto-collections] failed to apply rule ${rule.id} to session ${sessionId}:`, err);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
return { added };
|
|
274
|
-
}
|
|
275
|
-
function backfillRule(rule) {
|
|
276
|
-
if (!rule.enabled)
|
|
277
|
-
return { added: 0 };
|
|
278
|
-
let added = 0;
|
|
279
|
-
for (const sid of matchingSessionIds(rule)) {
|
|
280
|
-
try {
|
|
281
|
-
const result = addSessionToCollection(rule.collection_id, sid, null, {
|
|
282
|
-
source: 'auto',
|
|
283
|
-
rule_id: rule.id,
|
|
284
|
-
});
|
|
285
|
-
if (result.added)
|
|
286
|
-
added += 1;
|
|
287
|
-
}
|
|
288
|
-
catch (err) {
|
|
289
|
-
console.error(`[auto-collections] backfill failed for rule ${rule.id} / session ${sid}:`, err);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
return { added };
|
|
293
|
-
}
|
|
294
|
-
export function createRule(input) {
|
|
295
|
-
const name = (input.name ?? '').trim();
|
|
296
|
-
if (!name)
|
|
297
|
-
throw new Error('name required');
|
|
298
|
-
const pattern = (input.pattern ?? '').trim();
|
|
299
|
-
if (!pattern)
|
|
300
|
-
throw new Error('pattern required');
|
|
301
|
-
const db = getDb();
|
|
302
|
-
const now = new Date().toISOString();
|
|
303
|
-
const id = randomUUID();
|
|
304
|
-
let collectionId = input.collection_id;
|
|
305
|
-
if (!collectionId) {
|
|
306
|
-
collectionId = lazyCreateCollection(name, input.type, input.parent_collection_id);
|
|
307
|
-
}
|
|
308
|
-
db.prepare(`INSERT INTO auto_collection_rules
|
|
309
|
-
(id, name, type, pattern, collection_id, priority, enabled, created_at, created_by)
|
|
310
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, name, input.type, pattern, collectionId, input.priority ?? 100, input.enabled === false ? 0 : 1, now, input.created_by ?? 'user');
|
|
311
|
-
// If the user (or a suggestion-accept flow) just created a rule for
|
|
312
|
-
// (type, pattern), any stale suggestion for that same pair is now moot.
|
|
313
|
-
db.prepare(`DELETE FROM auto_collection_suggestions WHERE type = ? AND pattern = ?`).run(input.type, pattern);
|
|
314
|
-
const rule = getRuleById(id);
|
|
315
|
-
backfillRule(rule);
|
|
316
|
-
backupAutoCollections();
|
|
317
|
-
return rule;
|
|
318
|
-
}
|
|
319
|
-
export function listRules(opts = {}) {
|
|
320
|
-
const sql = opts.includeSeed
|
|
321
|
-
? `SELECT * FROM auto_collection_rules ORDER BY priority, created_at`
|
|
322
|
-
: `SELECT * FROM auto_collection_rules WHERE created_by != 'seed' ORDER BY priority, created_at`;
|
|
323
|
-
const rows = getDb().prepare(sql).all();
|
|
324
|
-
return rows.map(rowToRule);
|
|
325
|
-
}
|
|
326
|
-
export function getRule(id) {
|
|
327
|
-
return getRuleById(id);
|
|
328
|
-
}
|
|
329
|
-
export function patchRule(id, patch) {
|
|
330
|
-
const db = getDb();
|
|
331
|
-
const existing = getRuleById(id);
|
|
332
|
-
if (!existing)
|
|
333
|
-
throw new Error(`rule not found: ${id}`);
|
|
334
|
-
const next = {
|
|
335
|
-
name: patch.name !== undefined ? patch.name.trim() : existing.name,
|
|
336
|
-
pattern: patch.pattern !== undefined ? patch.pattern.trim() : existing.pattern,
|
|
337
|
-
enabled: patch.enabled !== undefined ? patch.enabled : existing.enabled,
|
|
338
|
-
priority: patch.priority !== undefined ? patch.priority : existing.priority,
|
|
339
|
-
};
|
|
340
|
-
if (!next.name)
|
|
341
|
-
throw new Error('name required');
|
|
342
|
-
if (!next.pattern)
|
|
343
|
-
throw new Error('pattern required');
|
|
344
|
-
db.prepare(`UPDATE auto_collection_rules
|
|
345
|
-
SET name = ?, pattern = ?, enabled = ?, priority = ?
|
|
346
|
-
WHERE id = ?`).run(next.name, next.pattern, next.enabled ? 1 : 0, next.priority, id);
|
|
347
|
-
const updated = getRuleById(id);
|
|
348
|
-
// If the pattern changed we must prune out-of-band auto memberships that
|
|
349
|
-
// no longer match, then re-backfill. Simpler approach: drop everything we
|
|
350
|
-
// authored, re-apply. Manual rows are untouched because they have no
|
|
351
|
-
// rule_id.
|
|
352
|
-
if (patch.pattern !== undefined && patch.pattern !== existing.pattern) {
|
|
353
|
-
removeMembershipsByRule(id);
|
|
354
|
-
if (updated.enabled)
|
|
355
|
-
backfillRule(updated);
|
|
356
|
-
}
|
|
357
|
-
else if (patch.enabled !== undefined && patch.enabled !== existing.enabled) {
|
|
358
|
-
if (updated.enabled)
|
|
359
|
-
backfillRule(updated);
|
|
360
|
-
else
|
|
361
|
-
removeMembershipsByRule(id);
|
|
362
|
-
}
|
|
363
|
-
backupAutoCollections();
|
|
364
|
-
return updated;
|
|
365
|
-
}
|
|
366
|
-
export function deleteRule(id) {
|
|
367
|
-
const db = getDb();
|
|
368
|
-
const existing = getRuleById(id);
|
|
369
|
-
if (!existing)
|
|
370
|
-
return { removed: 0 };
|
|
371
|
-
const result = removeMembershipsByRule(id);
|
|
372
|
-
db.prepare('DELETE FROM auto_collection_rules WHERE id = ?').run(id);
|
|
373
|
-
backupAutoCollections();
|
|
374
|
-
return result;
|
|
375
|
-
}
|
|
376
|
-
export function listSuggestions(opts = {}) {
|
|
377
|
-
const sql = opts.includeDismissed
|
|
378
|
-
? `SELECT * FROM auto_collection_suggestions ORDER BY detected_at DESC`
|
|
379
|
-
: `SELECT * FROM auto_collection_suggestions WHERE dismissed = 0 ORDER BY detected_at DESC`;
|
|
380
|
-
const rows = getDb().prepare(sql).all();
|
|
381
|
-
return rows.map(rowToSuggestion);
|
|
382
|
-
}
|
|
383
|
-
export function dismissSuggestion(id) {
|
|
384
|
-
getDb()
|
|
385
|
-
.prepare('UPDATE auto_collection_suggestions SET dismissed = 1 WHERE id = ?')
|
|
386
|
-
.run(id);
|
|
387
|
-
backupAutoCollections();
|
|
388
|
-
}
|
|
389
|
-
export function acceptSuggestion(id) {
|
|
390
|
-
const db = getDb();
|
|
391
|
-
const row = db
|
|
392
|
-
.prepare('SELECT * FROM auto_collection_suggestions WHERE id = ?')
|
|
393
|
-
.get(id);
|
|
394
|
-
if (!row)
|
|
395
|
-
throw new Error(`suggestion not found: ${id}`);
|
|
396
|
-
if (row.dismissed)
|
|
397
|
-
throw new Error(`suggestion already dismissed: ${id}`);
|
|
398
|
-
const rule = createRule({
|
|
399
|
-
name: row.suggested_name,
|
|
400
|
-
type: row.type,
|
|
401
|
-
pattern: row.pattern,
|
|
402
|
-
parent_collection_id: row.suggested_parent_collection_id === null
|
|
403
|
-
? undefined
|
|
404
|
-
: row.suggested_parent_collection_id,
|
|
405
|
-
created_by: 'suggestion-accepted',
|
|
406
|
-
});
|
|
407
|
-
// Consuming a suggestion clears it from the pending list — if the rule is
|
|
408
|
-
// later deleted, we don't re-surface the same pattern; the user has to
|
|
409
|
-
// re-trigger detection (or create it manually). This avoids a "whack-a-
|
|
410
|
-
// mole" UX.
|
|
411
|
-
db.prepare('DELETE FROM auto_collection_suggestions WHERE id = ?').run(id);
|
|
412
|
-
backupAutoCollections();
|
|
413
|
-
return rule;
|
|
414
|
-
}
|
|
415
|
-
/**
|
|
416
|
-
* Detect clusters that would benefit from an auto rule. Inserts new rows
|
|
417
|
-
* into `auto_collection_suggestions` and updates the session_count on
|
|
418
|
-
* existing (type, pattern) rows. Returns the full current suggestion list
|
|
419
|
-
* (excluding dismissed) so callers can show it immediately.
|
|
420
|
-
*/
|
|
421
|
-
export function detectSuggestions() {
|
|
422
|
-
const db = getDb();
|
|
423
|
-
const now = new Date().toISOString();
|
|
424
|
-
const home = homedir();
|
|
425
|
-
// Projects already appear in the sidebar. Suggesting a collection that
|
|
426
|
-
// duplicates an existing project path adds no value and floods the banner.
|
|
427
|
-
// Collect each project's exact decoded_path so we can filter the cwd-prefix
|
|
428
|
-
// candidates down to ones that represent a sub-project slice, a parent of
|
|
429
|
-
// multiple projects, or a path that is not itself a Claude Code project.
|
|
430
|
-
const projectPaths = new Set(db.prepare('SELECT decoded_path FROM projects').all().map((r) => r.decoded_path));
|
|
431
|
-
const candidates = [
|
|
432
|
-
...detectCwdPrefixClusters(home, now).filter((s) => !projectPaths.has(s.pattern)),
|
|
433
|
-
// project-id clusters are 1:1 with entries already shown under Projects,
|
|
434
|
-
// so they are pure duplication. Skip entirely.
|
|
435
|
-
...detectTagClusters(now),
|
|
436
|
-
...detectPlanFileClusters(now),
|
|
437
|
-
];
|
|
438
|
-
// Drop any pre-existing project-id and redundant cwd-prefix suggestions
|
|
439
|
-
// so a re-scan converges to the new, cleaner set instead of leaving the
|
|
440
|
-
// old noise in place.
|
|
441
|
-
db.prepare(`DELETE FROM auto_collection_suggestions WHERE type = 'project-id'`).run();
|
|
442
|
-
if (projectPaths.size > 0) {
|
|
443
|
-
const placeholders = Array.from(projectPaths).map(() => '?').join(',');
|
|
444
|
-
db.prepare(`DELETE FROM auto_collection_suggestions WHERE type = 'cwd-prefix' AND pattern IN (${placeholders})`).run(...Array.from(projectPaths));
|
|
445
|
-
}
|
|
446
|
-
// Skip patterns already represented by an existing rule. No point
|
|
447
|
-
// suggesting something the user has already set up. UNIQUE(type, pattern)
|
|
448
|
-
// on the suggestion table prevents duplicate rows across rescans.
|
|
449
|
-
const existingRules = db
|
|
450
|
-
.prepare('SELECT type, pattern FROM auto_collection_rules')
|
|
451
|
-
.all();
|
|
452
|
-
const existingKey = new Set(existingRules.map((r) => `${r.type}:${r.pattern}`));
|
|
453
|
-
for (const s of candidates) {
|
|
454
|
-
const key = `${s.type}:${s.pattern}`;
|
|
455
|
-
if (existingKey.has(key))
|
|
456
|
-
continue;
|
|
457
|
-
const existing = db
|
|
458
|
-
.prepare('SELECT id FROM auto_collection_suggestions WHERE type = ? AND pattern = ?')
|
|
459
|
-
.get(s.type, s.pattern);
|
|
460
|
-
if (existing) {
|
|
461
|
-
db.prepare(`UPDATE auto_collection_suggestions
|
|
462
|
-
SET session_count = ?, detected_at = ?, suggested_name = ?, suggested_parent_collection_id = ?
|
|
463
|
-
WHERE id = ?`).run(s.session_count, now, s.suggested_name, s.suggested_parent_collection_id, existing.id);
|
|
464
|
-
}
|
|
465
|
-
else {
|
|
466
|
-
db.prepare(`INSERT INTO auto_collection_suggestions
|
|
467
|
-
(id, type, pattern, suggested_name, suggested_parent_collection_id, session_count, detected_at, dismissed)
|
|
468
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, 0)`).run(randomUUID(), s.type, s.pattern, s.suggested_name, s.suggested_parent_collection_id, s.session_count, now);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
backupAutoCollections();
|
|
472
|
-
return listSuggestions();
|
|
473
|
-
}
|
|
474
|
-
function detectCwdPrefixClusters(home, now) {
|
|
475
|
-
const db = getDb();
|
|
476
|
-
const rows = db
|
|
477
|
-
.prepare(`SELECT id, cwd FROM sessions WHERE cwd IS NOT NULL AND cwd != ''`)
|
|
478
|
-
.all();
|
|
479
|
-
// Walk every ancestor path of every session's cwd, counting distinct
|
|
480
|
-
// sessions per prefix. We skip prefixes equal to the user's $HOME (and
|
|
481
|
-
// '/' itself) because a cluster at home is both expected and useless.
|
|
482
|
-
const counts = new Map();
|
|
483
|
-
for (const r of rows) {
|
|
484
|
-
const parts = r.cwd.split('/').filter(Boolean);
|
|
485
|
-
let acc = '';
|
|
486
|
-
for (const p of parts) {
|
|
487
|
-
acc = `${acc}/${p}`;
|
|
488
|
-
if (acc === home || acc === '/')
|
|
489
|
-
continue;
|
|
490
|
-
let set = counts.get(acc);
|
|
491
|
-
if (!set) {
|
|
492
|
-
set = new Set();
|
|
493
|
-
counts.set(acc, set);
|
|
494
|
-
}
|
|
495
|
-
set.add(r.id);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
const out = [];
|
|
499
|
-
// Emit the DEEPEST prefix per chain with >= threshold: if any descendant
|
|
500
|
-
// prefix also has >= threshold sessions, this prefix is dominated and
|
|
501
|
-
// would just be noise in the UI.
|
|
502
|
-
for (const [prefix, set] of counts.entries()) {
|
|
503
|
-
if (set.size < CWD_CLUSTER_MIN)
|
|
504
|
-
continue;
|
|
505
|
-
let dominated = false;
|
|
506
|
-
for (const [other, otherSet] of counts.entries()) {
|
|
507
|
-
if (other === prefix)
|
|
508
|
-
continue;
|
|
509
|
-
if (!other.startsWith(prefix + '/'))
|
|
510
|
-
continue;
|
|
511
|
-
if (otherSet.size >= CWD_CLUSTER_MIN) {
|
|
512
|
-
dominated = true;
|
|
513
|
-
break;
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
if (dominated)
|
|
517
|
-
continue;
|
|
518
|
-
out.push({
|
|
519
|
-
type: 'cwd-prefix',
|
|
520
|
-
pattern: prefix,
|
|
521
|
-
suggested_name: basename(prefix) || prefix,
|
|
522
|
-
suggested_parent_collection_id: null,
|
|
523
|
-
session_count: set.size,
|
|
524
|
-
detected_at: now,
|
|
525
|
-
dismissed: false,
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
return out;
|
|
529
|
-
}
|
|
530
|
-
function detectProjectIdClusters(now) {
|
|
531
|
-
const rows = getDb()
|
|
532
|
-
.prepare(`SELECT s.project_id AS pid, p.name AS name, COUNT(*) AS n
|
|
533
|
-
FROM sessions s JOIN projects p ON p.id = s.project_id
|
|
534
|
-
GROUP BY s.project_id HAVING n >= ?`)
|
|
535
|
-
.all(PROJECT_CLUSTER_MIN);
|
|
536
|
-
return rows.map((r) => ({
|
|
537
|
-
type: 'project-id',
|
|
538
|
-
pattern: String(r.pid),
|
|
539
|
-
suggested_name: r.name,
|
|
540
|
-
suggested_parent_collection_id: null,
|
|
541
|
-
session_count: r.n,
|
|
542
|
-
detected_at: now,
|
|
543
|
-
dismissed: false,
|
|
544
|
-
}));
|
|
545
|
-
}
|
|
546
|
-
function detectTagClusters(now) {
|
|
547
|
-
const rows = getDb()
|
|
548
|
-
.prepare(`SELECT tag, COUNT(*) AS n FROM session_tags GROUP BY tag HAVING n >= ?`)
|
|
549
|
-
.all(TAG_CLUSTER_MIN);
|
|
550
|
-
return rows.map((r) => ({
|
|
551
|
-
type: 'tag',
|
|
552
|
-
pattern: r.tag,
|
|
553
|
-
suggested_name: r.tag,
|
|
554
|
-
suggested_parent_collection_id: null,
|
|
555
|
-
session_count: r.n,
|
|
556
|
-
detected_at: now,
|
|
557
|
-
dismissed: false,
|
|
558
|
-
}));
|
|
559
|
-
}
|
|
560
|
-
function detectPlanFileClusters(now) {
|
|
561
|
-
const rows = getDb()
|
|
562
|
-
.prepare(`SELECT id, first_user_message FROM sessions
|
|
563
|
-
WHERE first_user_message IS NOT NULL AND first_user_message != ''`)
|
|
564
|
-
.all();
|
|
565
|
-
const counts = new Map();
|
|
566
|
-
for (const r of rows) {
|
|
567
|
-
for (const regex of PLAN_FILE_REGEXES) {
|
|
568
|
-
regex.lastIndex = 0;
|
|
569
|
-
const matches = r.first_user_message.match(regex);
|
|
570
|
-
if (!matches)
|
|
571
|
-
continue;
|
|
572
|
-
for (const m of matches) {
|
|
573
|
-
let set = counts.get(m);
|
|
574
|
-
if (!set) {
|
|
575
|
-
set = new Set();
|
|
576
|
-
counts.set(m, set);
|
|
577
|
-
}
|
|
578
|
-
set.add(r.id);
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
const out = [];
|
|
583
|
-
for (const [file, set] of counts.entries()) {
|
|
584
|
-
if (set.size < PLAN_FILE_CLUSTER_MIN)
|
|
585
|
-
continue;
|
|
586
|
-
out.push({
|
|
587
|
-
type: 'plan-file',
|
|
588
|
-
pattern: file,
|
|
589
|
-
suggested_name: file,
|
|
590
|
-
suggested_parent_collection_id: null,
|
|
591
|
-
session_count: set.size,
|
|
592
|
-
detected_at: now,
|
|
593
|
-
dismissed: false,
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
return out;
|
|
597
|
-
}
|
|
598
|
-
function escapeLike(s) {
|
|
599
|
-
return s.replace(/[\\%_]/g, '\\$&');
|
|
600
|
-
}
|
|
601
|
-
function backupAutoCollections() {
|
|
602
|
-
try {
|
|
603
|
-
ensureRecallHome();
|
|
604
|
-
if (!existsSync(AUTO_RULES_DIR))
|
|
605
|
-
mkdirSync(AUTO_RULES_DIR, { recursive: true });
|
|
606
|
-
const db = getDb();
|
|
607
|
-
const rules = db
|
|
608
|
-
.prepare(`SELECT * FROM auto_collection_rules ORDER BY created_at, id`)
|
|
609
|
-
.all();
|
|
610
|
-
const suggestions = db
|
|
611
|
-
.prepare(`SELECT * FROM auto_collection_suggestions ORDER BY detected_at DESC, id`)
|
|
612
|
-
.all();
|
|
613
|
-
writeFileSync(RULES_MIRROR, JSON.stringify({
|
|
614
|
-
schema: 'claude-recall.auto-rules.v1',
|
|
615
|
-
backed_up_at: new Date().toISOString(),
|
|
616
|
-
rules,
|
|
617
|
-
}, null, 2));
|
|
618
|
-
writeFileSync(SUGGESTIONS_MIRROR, JSON.stringify({
|
|
619
|
-
schema: 'claude-recall.auto-suggestions.v1',
|
|
620
|
-
backed_up_at: new Date().toISOString(),
|
|
621
|
-
suggestions,
|
|
622
|
-
}, null, 2));
|
|
623
|
-
}
|
|
624
|
-
catch (err) {
|
|
625
|
-
console.error('[auto-collections] backup failed:', err);
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
/** Expose for the UI: which collections are auto-managed? */
|
|
629
|
-
export function autoCollectionIdSet() {
|
|
630
|
-
const rows = getDb()
|
|
631
|
-
.prepare('SELECT DISTINCT collection_id FROM auto_collection_rules')
|
|
632
|
-
.all();
|
|
633
|
-
return new Set(rows.map((r) => r.collection_id));
|
|
634
|
-
}
|
|
635
|
-
//# sourceMappingURL=autoCollections.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"autoCollections.js","sourceRoot":"","sources":["../../src/utils/autoCollections.ts"],"names":[],"mappings":"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"}
|