@clauderecallhq/cli 0.0.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +33 -0
- package/README.md +543 -3
- package/README.public.md +523 -0
- package/dist/cli.js +354 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/activate.js +69 -0
- package/dist/commands/activate.js.map +1 -0
- package/dist/commands/audit-secrets.js +103 -0
- package/dist/commands/audit-secrets.js.map +1 -0
- package/dist/commands/blame.js +35 -0
- package/dist/commands/blame.js.map +1 -0
- package/dist/commands/config-verification.js +18 -0
- package/dist/commands/config-verification.js.map +1 -0
- package/dist/commands/context.js +144 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/correlate.js +70 -0
- package/dist/commands/correlate.js.map +1 -0
- package/dist/commands/digest.js +78 -0
- package/dist/commands/digest.js.map +1 -0
- package/dist/commands/health.js +62 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/index.js +247 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install-extension.js +138 -0
- package/dist/commands/install-extension.js.map +1 -0
- package/dist/commands/license.js +39 -0
- package/dist/commands/license.js.map +1 -0
- package/dist/commands/list.js +47 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/mcp.js +29 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/open.js +28 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/paste.js +154 -0
- package/dist/commands/paste.js.map +1 -0
- package/dist/commands/projects.js +36 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/search.js +67 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/semantic.js +173 -0
- package/dist/commands/semantic.js.map +1 -0
- package/dist/commands/show.js +121 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/start.js +47 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stats.js +133 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/status.js +45 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.js +29 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/thread.js +396 -0
- package/dist/commands/thread.js.map +1 -0
- package/dist/context/formatter.js +103 -0
- package/dist/context/formatter.js.map +1 -0
- package/dist/daemon/auto-tag-config.js +103 -0
- package/dist/daemon/auto-tag-config.js.map +1 -0
- package/dist/daemon/auto-tag-config.test.js +72 -0
- package/dist/daemon/auto-tag-config.test.js.map +1 -0
- package/dist/daemon/auto-title-config.js +70 -0
- package/dist/daemon/auto-title-config.js.map +1 -0
- package/dist/daemon/bulk-title-jobs.js +170 -0
- package/dist/daemon/bulk-title-jobs.js.map +1 -0
- package/dist/daemon/correlator.js +320 -0
- package/dist/daemon/correlator.js.map +1 -0
- package/dist/daemon/discover.js +316 -0
- package/dist/daemon/discover.js.map +1 -0
- package/dist/daemon/editor-detection.js +186 -0
- package/dist/daemon/editor-detection.js.map +1 -0
- package/dist/daemon/entrypoint.js +55 -0
- package/dist/daemon/entrypoint.js.map +1 -0
- package/dist/daemon/git-correlator.js +256 -0
- package/dist/daemon/git-correlator.js.map +1 -0
- package/dist/daemon/mcp-installer.js +108 -0
- package/dist/daemon/mcp-installer.js.map +1 -0
- package/dist/daemon/onboarding-state.js +140 -0
- package/dist/daemon/onboarding-state.js.map +1 -0
- package/dist/daemon/pidfile.js +57 -0
- package/dist/daemon/pidfile.js.map +1 -0
- package/dist/daemon/ports.js +48 -0
- package/dist/daemon/ports.js.map +1 -0
- package/dist/daemon/scanProgressRegistry.js +62 -0
- package/dist/daemon/scanProgressRegistry.js.map +1 -0
- package/dist/daemon/server.js +2010 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/tag-scanner/anthropic-client.js +40 -0
- package/dist/daemon/tag-scanner/anthropic-client.js.map +1 -0
- package/dist/daemon/tag-scanner/autopilot.js +131 -0
- package/dist/daemon/tag-scanner/autopilot.js.map +1 -0
- package/dist/daemon/tag-scanner/claude-cli-driver.js +250 -0
- package/dist/daemon/tag-scanner/claude-cli-driver.js.map +1 -0
- package/dist/daemon/tag-scanner/orchestrator.js +88 -0
- package/dist/daemon/tag-scanner/orchestrator.js.map +1 -0
- package/dist/daemon/tag-scanner/prompt.js +46 -0
- package/dist/daemon/tag-scanner/prompt.js.map +1 -0
- package/dist/daemon/tag-scanner/prompt.test.js +48 -0
- package/dist/daemon/tag-scanner/prompt.test.js.map +1 -0
- package/dist/daemon/tag-scanner/scan-state.js +49 -0
- package/dist/daemon/tag-scanner/scan-state.js.map +1 -0
- package/dist/daemon/tag-scanner/session-fetcher.js +82 -0
- package/dist/daemon/tag-scanner/session-fetcher.js.map +1 -0
- package/dist/daemon/tag-scanner/session-fetcher.test.js +34 -0
- package/dist/daemon/tag-scanner/session-fetcher.test.js.map +1 -0
- package/dist/daemon/tag-scanner/validator.js +50 -0
- package/dist/daemon/tag-scanner/validator.js.map +1 -0
- package/dist/daemon/tag-scanner/validator.test.js +41 -0
- package/dist/daemon/tag-scanner/validator.test.js.map +1 -0
- package/dist/daemon/terminal-registry.js +443 -0
- package/dist/daemon/terminal-registry.js.map +1 -0
- package/dist/daemon/ui.js +64 -0
- package/dist/daemon/ui.js.map +1 -0
- package/dist/daemon/watcher.js +256 -0
- package/dist/daemon/watcher.js.map +1 -0
- package/dist/db/client.js +22 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/schema.js +496 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/license/api-base.js +13 -0
- package/dist/license/api-base.js.map +1 -0
- package/dist/license/manager.js +43 -0
- package/dist/license/manager.js.map +1 -0
- package/dist/license/public-key.js +19 -0
- package/dist/license/public-key.js.map +1 -0
- package/dist/license/storage.js +27 -0
- package/dist/license/storage.js.map +1 -0
- package/dist/license/verify.js +23 -0
- package/dist/license/verify.js.map +1 -0
- package/dist/mcp/audit.js +126 -0
- package/dist/mcp/audit.js.map +1 -0
- package/dist/mcp/prompts.js +180 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/server.js +502 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/thread-tools.js +363 -0
- package/dist/mcp/thread-tools.js.map +1 -0
- package/dist/mcp/write-tools.js +239 -0
- package/dist/mcp/write-tools.js.map +1 -0
- package/dist/parser/jsonl.js +150 -0
- package/dist/parser/jsonl.js.map +1 -0
- package/dist/semantic/chunker.js +47 -0
- package/dist/semantic/chunker.js.map +1 -0
- package/dist/semantic/config.js +74 -0
- package/dist/semantic/config.js.map +1 -0
- package/dist/semantic/embedder.js +54 -0
- package/dist/semantic/embedder.js.map +1 -0
- package/dist/semantic/fusion.js +38 -0
- package/dist/semantic/fusion.js.map +1 -0
- package/dist/semantic/model-download.js +69 -0
- package/dist/semantic/model-download.js.map +1 -0
- package/dist/semantic/pipeline.js +375 -0
- package/dist/semantic/pipeline.js.map +1 -0
- package/dist/semantic/query.js +42 -0
- package/dist/semantic/query.js.map +1 -0
- package/dist/semantic/worker.js +78 -0
- package/dist/semantic/worker.js.map +1 -0
- package/dist/stats/backfill.js +151 -0
- package/dist/stats/backfill.js.map +1 -0
- package/dist/stats/health.js +102 -0
- package/dist/stats/health.js.map +1 -0
- package/dist/stats/query.js +385 -0
- package/dist/stats/query.js.map +1 -0
- package/dist/utils/aliases.js +107 -0
- package/dist/utils/aliases.js.map +1 -0
- package/dist/utils/autoCollections.js +635 -0
- package/dist/utils/autoCollections.js.map +1 -0
- package/dist/utils/autoTitle.js +348 -0
- package/dist/utils/autoTitle.js.map +1 -0
- package/dist/utils/collections.js +446 -0
- package/dist/utils/collections.js.map +1 -0
- package/dist/utils/format.js +46 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/notes.js +270 -0
- package/dist/utils/notes.js.map +1 -0
- package/dist/utils/paths.js +50 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/pricing.js +257 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/secret-scanner.js +166 -0
- package/dist/utils/secret-scanner.js.map +1 -0
- package/dist/utils/sessionLabel.js +64 -0
- package/dist/utils/sessionLabel.js.map +1 -0
- package/dist/utils/tags.js +97 -0
- package/dist/utils/tags.js.map +1 -0
- package/dist/utils/thread-context.js +129 -0
- package/dist/utils/thread-context.js.map +1 -0
- package/dist/utils/threadFilter.js +18 -0
- package/dist/utils/threadFilter.js.map +1 -0
- package/dist/utils/threads-titler.js +298 -0
- package/dist/utils/threads-titler.js.map +1 -0
- package/dist/utils/threads.js +383 -0
- package/dist/utils/threads.js.map +1 -0
- package/dist/utils/usage.js +76 -0
- package/dist/utils/usage.js.map +1 -0
- package/dist/verification/compute.js +88 -0
- package/dist/verification/compute.js.map +1 -0
- package/dist/verification/config.js +34 -0
- package/dist/verification/config.js.map +1 -0
- package/dist/web/assets/index-CIr6J4Fw.js +1201 -0
- package/dist/web/assets/index-Ctc8g9Jw.css +1 -0
- package/dist/web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
- package/dist/web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
- package/dist/web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
- package/dist/web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
- package/dist/web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
- package/dist/web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
- package/dist/web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
- package/dist/web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
- package/dist/web/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
- package/dist/web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
- package/dist/web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
- package/dist/web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
- package/dist/web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
- package/dist/web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
- package/dist/web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
- package/dist/web/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
- package/dist/web/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
- package/dist/web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
- package/dist/web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
- package/dist/web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
- package/dist/web/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
- package/dist/web/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
- package/dist/web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
- package/dist/web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
- package/dist/web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
- package/dist/web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
- package/dist/web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
- package/dist/web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
- package/dist/web/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
- package/dist/web/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
- package/dist/web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
- package/dist/web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
- package/dist/web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
- package/dist/web/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
- package/dist/web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
- package/dist/web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
- package/dist/web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
- package/dist/web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
- package/dist/web/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
- package/dist/web/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
- package/dist/web/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
- package/dist/web/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
- package/dist/web/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- package/dist/web/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
- package/dist/web/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
- package/dist/web/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
- package/dist/web/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
- package/dist/web/favicon.svg +9 -0
- package/dist/web/index.html +15 -0
- package/package.json +79 -9
- package/bin/cli.js +0 -12
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { watch } from 'chokidar';
|
|
2
|
+
import { statSync } from 'node:fs';
|
|
3
|
+
import { CLAUDE_PROJECTS_DIR } from '../utils/paths.js';
|
|
4
|
+
import { getDb } from '../db/client.js';
|
|
5
|
+
import { parseSessionFile } from '../parser/jsonl.js';
|
|
6
|
+
import { basename } from 'node:path';
|
|
7
|
+
import { tryAutoAlias } from './correlator.js';
|
|
8
|
+
import { redactSecrets } from '../utils/secret-scanner.js';
|
|
9
|
+
import { maybeProcessOnSessionClose } from '../semantic/pipeline.js';
|
|
10
|
+
import { writeMessageUsageRows, recomputeSessionRollup } from '../utils/usage.js';
|
|
11
|
+
import { maybeCorrelateInBackground } from './git-correlator.js';
|
|
12
|
+
import { deriveHeuristicTitle, setAutoTitle } from '../utils/autoTitle.js';
|
|
13
|
+
import { readAutoTitleConfig } from './auto-title-config.js';
|
|
14
|
+
import { applyRulesToSession } from '../utils/autoCollections.js';
|
|
15
|
+
const DEBOUNCE_MS = 1500;
|
|
16
|
+
const pending = new Map();
|
|
17
|
+
function getEncodedProjectFromPath(filePath) {
|
|
18
|
+
// ~/.claude/projects/<encoded>/<uuid>.jsonl
|
|
19
|
+
const parts = filePath.split('/');
|
|
20
|
+
const idx = parts.findIndex((p) => p === 'projects');
|
|
21
|
+
if (idx === -1 || idx + 1 >= parts.length)
|
|
22
|
+
return null;
|
|
23
|
+
return parts[idx + 1] ?? null;
|
|
24
|
+
}
|
|
25
|
+
async function reindexFile(filePath) {
|
|
26
|
+
let mtime = 0;
|
|
27
|
+
try {
|
|
28
|
+
mtime = statSync(filePath).mtimeMs;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const encodedProject = getEncodedProjectFromPath(filePath);
|
|
34
|
+
if (!encodedProject)
|
|
35
|
+
return;
|
|
36
|
+
const db = getDb();
|
|
37
|
+
const existing = db
|
|
38
|
+
.prepare('SELECT id, file_mtime FROM sessions WHERE file_path = ? LIMIT 1')
|
|
39
|
+
.get(filePath);
|
|
40
|
+
if (existing && existing.file_mtime >= mtime)
|
|
41
|
+
return;
|
|
42
|
+
const accs = new Map();
|
|
43
|
+
let observedCwd = null;
|
|
44
|
+
for await (const e of parseSessionFile(filePath)) {
|
|
45
|
+
let acc = accs.get(e.sessionId);
|
|
46
|
+
if (!acc) {
|
|
47
|
+
acc = {
|
|
48
|
+
sessionId: e.sessionId,
|
|
49
|
+
entries: [],
|
|
50
|
+
earliest: null,
|
|
51
|
+
latest: null,
|
|
52
|
+
firstUser: null,
|
|
53
|
+
users: 0,
|
|
54
|
+
assistants: 0,
|
|
55
|
+
cwd: null,
|
|
56
|
+
branch: null,
|
|
57
|
+
version: null,
|
|
58
|
+
};
|
|
59
|
+
accs.set(e.sessionId, acc);
|
|
60
|
+
}
|
|
61
|
+
acc.entries.push(e);
|
|
62
|
+
if (e.timestamp) {
|
|
63
|
+
if (!acc.earliest || e.timestamp < acc.earliest)
|
|
64
|
+
acc.earliest = e.timestamp;
|
|
65
|
+
if (!acc.latest || e.timestamp > acc.latest)
|
|
66
|
+
acc.latest = e.timestamp;
|
|
67
|
+
}
|
|
68
|
+
if (e.role === 'user' && !e.isSidechain) {
|
|
69
|
+
acc.users += 1;
|
|
70
|
+
if (!acc.firstUser && e.contentText) {
|
|
71
|
+
const body = e.contentText.replace(/^(?:<[^>]+>[\s\S]*?<\/[^>]+>\s*)+/, '').trim();
|
|
72
|
+
if (body && !/^<local-command-caveat>/.test(body)) {
|
|
73
|
+
acc.firstUser = redactSecrets(body).redacted.slice(0, 200);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (e.role === 'assistant' && !e.isSidechain) {
|
|
78
|
+
acc.assistants += 1;
|
|
79
|
+
}
|
|
80
|
+
if (!acc.cwd && e.cwd)
|
|
81
|
+
acc.cwd = e.cwd;
|
|
82
|
+
if (!acc.branch && e.gitBranch)
|
|
83
|
+
acc.branch = e.gitBranch;
|
|
84
|
+
if (!acc.version && e.version)
|
|
85
|
+
acc.version = e.version;
|
|
86
|
+
if (!observedCwd && e.cwd)
|
|
87
|
+
observedCwd = e.cwd;
|
|
88
|
+
}
|
|
89
|
+
const projectName = observedCwd ? basename(observedCwd) || observedCwd : encodedProject;
|
|
90
|
+
const decoded = observedCwd ?? encodedProject.replace(/^-/, '/').replace(/-/g, '/');
|
|
91
|
+
const upsertProj = db.prepare(`INSERT INTO projects (encoded_path, decoded_path, name)
|
|
92
|
+
VALUES (?, ?, ?)
|
|
93
|
+
ON CONFLICT(encoded_path) DO UPDATE SET decoded_path = excluded.decoded_path, name = excluded.name
|
|
94
|
+
RETURNING id`);
|
|
95
|
+
const insSession = db.prepare(`
|
|
96
|
+
INSERT INTO sessions (
|
|
97
|
+
id, project_id, file_path, file_mtime,
|
|
98
|
+
started_at, ended_at, message_count,
|
|
99
|
+
user_message_count, assistant_message_count,
|
|
100
|
+
first_user_message, cwd, git_branch, version, indexed_at
|
|
101
|
+
) VALUES (@id, @project_id, @file_path, @file_mtime, @started_at, @ended_at, @message_count,
|
|
102
|
+
@user_message_count, @assistant_message_count, @first_user_message,
|
|
103
|
+
@cwd, @git_branch, @version, @indexed_at)
|
|
104
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
105
|
+
file_path = excluded.file_path,
|
|
106
|
+
file_mtime = excluded.file_mtime,
|
|
107
|
+
started_at = excluded.started_at,
|
|
108
|
+
ended_at = excluded.ended_at,
|
|
109
|
+
message_count = excluded.message_count,
|
|
110
|
+
user_message_count = excluded.user_message_count,
|
|
111
|
+
assistant_message_count = excluded.assistant_message_count,
|
|
112
|
+
first_user_message = excluded.first_user_message,
|
|
113
|
+
cwd = excluded.cwd,
|
|
114
|
+
git_branch = excluded.git_branch,
|
|
115
|
+
version = excluded.version,
|
|
116
|
+
indexed_at = excluded.indexed_at
|
|
117
|
+
`);
|
|
118
|
+
const insMsg = db.prepare(`
|
|
119
|
+
INSERT INTO messages (uuid, session_id, parent_uuid, type, role, timestamp,
|
|
120
|
+
is_sidechain, content_text, tool_names, raw_json)
|
|
121
|
+
VALUES (@uuid, @session_id, @parent_uuid, @type, @role, @timestamp,
|
|
122
|
+
@is_sidechain, @content_text, @tool_names, @raw_json)
|
|
123
|
+
ON CONFLICT(uuid) DO NOTHING
|
|
124
|
+
`);
|
|
125
|
+
const delMsgs = db.prepare('DELETE FROM messages WHERE session_id = ?');
|
|
126
|
+
const now = new Date().toISOString();
|
|
127
|
+
const txn = db.transaction(() => {
|
|
128
|
+
const { id: projectId } = upsertProj.get(encodedProject, decoded, projectName);
|
|
129
|
+
for (const acc of accs.values()) {
|
|
130
|
+
insSession.run({
|
|
131
|
+
id: acc.sessionId,
|
|
132
|
+
project_id: projectId,
|
|
133
|
+
file_path: filePath,
|
|
134
|
+
file_mtime: mtime,
|
|
135
|
+
started_at: acc.earliest,
|
|
136
|
+
ended_at: acc.latest,
|
|
137
|
+
message_count: acc.entries.length,
|
|
138
|
+
user_message_count: acc.users,
|
|
139
|
+
assistant_message_count: acc.assistants,
|
|
140
|
+
first_user_message: acc.firstUser,
|
|
141
|
+
cwd: acc.cwd,
|
|
142
|
+
git_branch: acc.branch,
|
|
143
|
+
version: acc.version,
|
|
144
|
+
indexed_at: now,
|
|
145
|
+
});
|
|
146
|
+
delMsgs.run(acc.sessionId);
|
|
147
|
+
for (const entry of acc.entries)
|
|
148
|
+
insMsg.run(makeEntryRow(entry));
|
|
149
|
+
// v0.10a — per-message usage + session rollups.
|
|
150
|
+
writeMessageUsageRows(db, acc.sessionId, acc.entries);
|
|
151
|
+
recomputeSessionRollup(db, acc.sessionId);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
txn();
|
|
155
|
+
// v0.14b (T5) — refresh heuristic title after the session row lands.
|
|
156
|
+
// setAutoTitle is a no-op when the existing title is agent-sourced, so a
|
|
157
|
+
// user's ✨ Generate choice survives subsequent reindexes of the same file.
|
|
158
|
+
if (readAutoTitleConfig().heuristicEnabled) {
|
|
159
|
+
for (const acc of accs.values()) {
|
|
160
|
+
const title = deriveHeuristicTitle(acc.firstUser);
|
|
161
|
+
if (title)
|
|
162
|
+
setAutoTitle(acc.sessionId, title, 'heuristic');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function makeEntryRow(e) {
|
|
167
|
+
// Redact secrets before they ever reach SQLite. The source JSONL at
|
|
168
|
+
// ~/.claude/projects/ stays untouched; only our derived store is scrubbed.
|
|
169
|
+
const safeContent = redactSecrets(e.contentText).redacted;
|
|
170
|
+
const safeRaw = redactSecrets(e.raw).redacted;
|
|
171
|
+
return {
|
|
172
|
+
uuid: e.uuid,
|
|
173
|
+
session_id: e.sessionId,
|
|
174
|
+
parent_uuid: e.parentUuid,
|
|
175
|
+
type: e.type,
|
|
176
|
+
role: e.role,
|
|
177
|
+
timestamp: e.timestamp,
|
|
178
|
+
is_sidechain: e.isSidechain ? 1 : 0,
|
|
179
|
+
content_text: safeContent,
|
|
180
|
+
tool_names: e.toolNames.join(','),
|
|
181
|
+
raw_json: safeRaw,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function scheduleReindex(filePath) {
|
|
185
|
+
const prior = pending.get(filePath);
|
|
186
|
+
if (prior?.timer)
|
|
187
|
+
clearTimeout(prior.timer);
|
|
188
|
+
const entry = { timer: null };
|
|
189
|
+
entry.timer = setTimeout(() => {
|
|
190
|
+
pending.delete(filePath);
|
|
191
|
+
reindexFile(filePath)
|
|
192
|
+
.then(async () => {
|
|
193
|
+
// v0.7 correlator: after a successful ingest, best-effort auto-alias
|
|
194
|
+
// this session to the VS Code terminal tab it was started in. Silent
|
|
195
|
+
// if no matching entry is in the registry.
|
|
196
|
+
void tryAutoAlias(filePath);
|
|
197
|
+
// v0.11 — semantic summary pass. No-op when semantic mode is off.
|
|
198
|
+
// Walks every session in the file (a single .jsonl can hold > 1).
|
|
199
|
+
try {
|
|
200
|
+
const db = getDb();
|
|
201
|
+
const rows = db
|
|
202
|
+
.prepare('SELECT id FROM sessions WHERE file_path = ?')
|
|
203
|
+
.all(filePath);
|
|
204
|
+
for (const r of rows) {
|
|
205
|
+
void maybeProcessOnSessionClose(r.id);
|
|
206
|
+
// v0.10b — link newly-closed sessions to the commits their cwd
|
|
207
|
+
// saw during the session window. Non-blocking, silently no-ops
|
|
208
|
+
// on non-repo cwds.
|
|
209
|
+
maybeCorrelateInBackground(r.id);
|
|
210
|
+
// v0.15 T6 — apply the auto-collection engine. Pure SQL, fast;
|
|
211
|
+
// runs inline so the UI sees new memberships immediately after
|
|
212
|
+
// the session row appears.
|
|
213
|
+
try {
|
|
214
|
+
applyRulesToSession(r.id);
|
|
215
|
+
}
|
|
216
|
+
catch (acErr) {
|
|
217
|
+
console.error('[watcher] auto-collections apply failed:', acErr);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
console.error('[watcher] semantic dispatch failed:', err);
|
|
223
|
+
}
|
|
224
|
+
})
|
|
225
|
+
.catch((err) => {
|
|
226
|
+
console.error(`[watcher] reindex failed for ${filePath}:`, err);
|
|
227
|
+
});
|
|
228
|
+
}, DEBOUNCE_MS);
|
|
229
|
+
pending.set(filePath, entry);
|
|
230
|
+
}
|
|
231
|
+
export function startWatcher() {
|
|
232
|
+
const watcher = watch(CLAUDE_PROJECTS_DIR, {
|
|
233
|
+
depth: 4,
|
|
234
|
+
ignoreInitial: true,
|
|
235
|
+
persistent: true,
|
|
236
|
+
awaitWriteFinish: { stabilityThreshold: 500, pollInterval: 200 },
|
|
237
|
+
ignored: (path) => {
|
|
238
|
+
// Only care about .jsonl files (and the dirs containing them).
|
|
239
|
+
if (path.endsWith('.jsonl'))
|
|
240
|
+
return false;
|
|
241
|
+
try {
|
|
242
|
+
const stat = statSync(path);
|
|
243
|
+
if (stat.isDirectory())
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
/* ignore */
|
|
248
|
+
}
|
|
249
|
+
return true;
|
|
250
|
+
},
|
|
251
|
+
});
|
|
252
|
+
watcher.on('add', (p) => p.endsWith('.jsonl') && scheduleReindex(p));
|
|
253
|
+
watcher.on('change', (p) => p.endsWith('.jsonl') && scheduleReindex(p));
|
|
254
|
+
return watcher;
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/daemon/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import * as sqliteVec from 'sqlite-vec';
|
|
3
|
+
import { ensureRecallHome, RECALL_DB_PATH } from '../utils/paths.js';
|
|
4
|
+
import { SCHEMA_SQL, runMigrations } from './schema.js';
|
|
5
|
+
let db = null;
|
|
6
|
+
export function getDb() {
|
|
7
|
+
if (db)
|
|
8
|
+
return db;
|
|
9
|
+
ensureRecallHome();
|
|
10
|
+
db = new Database(RECALL_DB_PATH);
|
|
11
|
+
sqliteVec.load(db);
|
|
12
|
+
db.exec(SCHEMA_SQL);
|
|
13
|
+
runMigrations(db);
|
|
14
|
+
return db;
|
|
15
|
+
}
|
|
16
|
+
export function closeDb() {
|
|
17
|
+
if (db) {
|
|
18
|
+
db.close();
|
|
19
|
+
db = null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,IAAI,EAAE,GAAwB,IAAI,CAAC;AAEnC,MAAM,UAAU,KAAK;IACnB,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAClB,gBAAgB,EAAE,CAAC;IACnB,EAAE,GAAG,IAAI,QAAQ,CAAC,cAAc,CAAC,CAAC;IAClC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC"}
|