@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.
Files changed (220) hide show
  1. package/LICENSE +37 -17
  2. package/README.md +316 -106
  3. package/dist/cli.js +1641 -361
  4. package/dist/daemon/entrypoint.js +1872 -54
  5. package/dist/mcp-server.js +930 -0
  6. package/dist/share/fonts/Inter-Bold.woff +0 -0
  7. package/dist/share/fonts/Inter-Regular.woff +0 -0
  8. package/dist/share/fonts/JetBrainsMono-Regular.woff +0 -0
  9. package/dist/web/assets/_brand-Bw9uSB4O.js +1 -0
  10. package/dist/web/assets/captureNode-9CVj9vYC.js +2 -0
  11. package/dist/web/assets/card-a-minimal-ujNERzX7.js +1 -0
  12. package/dist/web/assets/card-b-terminal-DpJ_tVpg.js +1 -0
  13. package/dist/web/assets/card-c-gradient-CZXVGuNd.js +1 -0
  14. package/dist/web/assets/card-d-dashboard-CHKD-PnB.js +1 -0
  15. package/dist/web/assets/dist-CWaokT35.js +56 -0
  16. package/dist/web/assets/index-B-HrjaDy.css +1 -0
  17. package/dist/web/assets/index-BZYcD76T.js +633 -0
  18. package/dist/web/assets/jetbrains-mono-latin-700-normal-D3wTyLJW.woff +0 -0
  19. package/dist/web/assets/patterns-BPeZb9N0.js +1 -0
  20. package/dist/web/assets/stats-BSwqSiFU.js +1 -0
  21. package/dist/web/assets/thread-D2AXyhOx.js +1 -0
  22. package/dist/web/index.html +8 -2
  23. package/package.json +57 -16
  24. package/scripts/postinstall.mjs +38 -0
  25. package/dist/cli.js.map +0 -1
  26. package/dist/commands/activate.js +0 -69
  27. package/dist/commands/activate.js.map +0 -1
  28. package/dist/commands/audit-secrets.js +0 -103
  29. package/dist/commands/audit-secrets.js.map +0 -1
  30. package/dist/commands/blame.js +0 -35
  31. package/dist/commands/blame.js.map +0 -1
  32. package/dist/commands/config-verification.js +0 -18
  33. package/dist/commands/config-verification.js.map +0 -1
  34. package/dist/commands/context.js +0 -144
  35. package/dist/commands/context.js.map +0 -1
  36. package/dist/commands/correlate.js +0 -70
  37. package/dist/commands/correlate.js.map +0 -1
  38. package/dist/commands/digest.js +0 -78
  39. package/dist/commands/digest.js.map +0 -1
  40. package/dist/commands/health.js +0 -62
  41. package/dist/commands/health.js.map +0 -1
  42. package/dist/commands/index.js +0 -247
  43. package/dist/commands/index.js.map +0 -1
  44. package/dist/commands/install-extension.js +0 -138
  45. package/dist/commands/install-extension.js.map +0 -1
  46. package/dist/commands/installs.js +0 -128
  47. package/dist/commands/installs.js.map +0 -1
  48. package/dist/commands/license.js +0 -39
  49. package/dist/commands/license.js.map +0 -1
  50. package/dist/commands/list.js +0 -47
  51. package/dist/commands/list.js.map +0 -1
  52. package/dist/commands/mcp.js +0 -29
  53. package/dist/commands/mcp.js.map +0 -1
  54. package/dist/commands/open.js +0 -28
  55. package/dist/commands/open.js.map +0 -1
  56. package/dist/commands/paste.js +0 -154
  57. package/dist/commands/paste.js.map +0 -1
  58. package/dist/commands/projects.js +0 -36
  59. package/dist/commands/projects.js.map +0 -1
  60. package/dist/commands/search.js +0 -67
  61. package/dist/commands/search.js.map +0 -1
  62. package/dist/commands/semantic.js +0 -173
  63. package/dist/commands/semantic.js.map +0 -1
  64. package/dist/commands/show.js +0 -121
  65. package/dist/commands/show.js.map +0 -1
  66. package/dist/commands/start.js +0 -47
  67. package/dist/commands/start.js.map +0 -1
  68. package/dist/commands/stats.js +0 -133
  69. package/dist/commands/stats.js.map +0 -1
  70. package/dist/commands/status.js +0 -45
  71. package/dist/commands/status.js.map +0 -1
  72. package/dist/commands/stop.js +0 -29
  73. package/dist/commands/stop.js.map +0 -1
  74. package/dist/commands/thread.js +0 -396
  75. package/dist/commands/thread.js.map +0 -1
  76. package/dist/context/formatter.js +0 -103
  77. package/dist/context/formatter.js.map +0 -1
  78. package/dist/daemon/auto-tag-config.js +0 -103
  79. package/dist/daemon/auto-tag-config.js.map +0 -1
  80. package/dist/daemon/auto-tag-config.test.js +0 -72
  81. package/dist/daemon/auto-tag-config.test.js.map +0 -1
  82. package/dist/daemon/auto-title-config.js +0 -70
  83. package/dist/daemon/auto-title-config.js.map +0 -1
  84. package/dist/daemon/bulk-title-jobs.js +0 -170
  85. package/dist/daemon/bulk-title-jobs.js.map +0 -1
  86. package/dist/daemon/correlator.js +0 -320
  87. package/dist/daemon/correlator.js.map +0 -1
  88. package/dist/daemon/discover.js +0 -316
  89. package/dist/daemon/discover.js.map +0 -1
  90. package/dist/daemon/editor-detection.js +0 -186
  91. package/dist/daemon/editor-detection.js.map +0 -1
  92. package/dist/daemon/entrypoint.js.map +0 -1
  93. package/dist/daemon/git-correlator.js +0 -256
  94. package/dist/daemon/git-correlator.js.map +0 -1
  95. package/dist/daemon/mcp-installer.js +0 -108
  96. package/dist/daemon/mcp-installer.js.map +0 -1
  97. package/dist/daemon/onboarding-state.js +0 -140
  98. package/dist/daemon/onboarding-state.js.map +0 -1
  99. package/dist/daemon/pidfile.js +0 -57
  100. package/dist/daemon/pidfile.js.map +0 -1
  101. package/dist/daemon/ports.js +0 -48
  102. package/dist/daemon/ports.js.map +0 -1
  103. package/dist/daemon/scanProgressRegistry.js +0 -62
  104. package/dist/daemon/scanProgressRegistry.js.map +0 -1
  105. package/dist/daemon/server.js +0 -2010
  106. package/dist/daemon/server.js.map +0 -1
  107. package/dist/daemon/tag-scanner/anthropic-client.js +0 -40
  108. package/dist/daemon/tag-scanner/anthropic-client.js.map +0 -1
  109. package/dist/daemon/tag-scanner/autopilot.js +0 -131
  110. package/dist/daemon/tag-scanner/autopilot.js.map +0 -1
  111. package/dist/daemon/tag-scanner/claude-cli-driver.js +0 -250
  112. package/dist/daemon/tag-scanner/claude-cli-driver.js.map +0 -1
  113. package/dist/daemon/tag-scanner/orchestrator.js +0 -88
  114. package/dist/daemon/tag-scanner/orchestrator.js.map +0 -1
  115. package/dist/daemon/tag-scanner/prompt.js +0 -46
  116. package/dist/daemon/tag-scanner/prompt.js.map +0 -1
  117. package/dist/daemon/tag-scanner/prompt.test.js +0 -48
  118. package/dist/daemon/tag-scanner/prompt.test.js.map +0 -1
  119. package/dist/daemon/tag-scanner/scan-state.js +0 -49
  120. package/dist/daemon/tag-scanner/scan-state.js.map +0 -1
  121. package/dist/daemon/tag-scanner/session-fetcher.js +0 -82
  122. package/dist/daemon/tag-scanner/session-fetcher.js.map +0 -1
  123. package/dist/daemon/tag-scanner/session-fetcher.test.js +0 -34
  124. package/dist/daemon/tag-scanner/session-fetcher.test.js.map +0 -1
  125. package/dist/daemon/tag-scanner/validator.js +0 -50
  126. package/dist/daemon/tag-scanner/validator.js.map +0 -1
  127. package/dist/daemon/tag-scanner/validator.test.js +0 -41
  128. package/dist/daemon/tag-scanner/validator.test.js.map +0 -1
  129. package/dist/daemon/terminal-registry.js +0 -443
  130. package/dist/daemon/terminal-registry.js.map +0 -1
  131. package/dist/daemon/ui.js +0 -64
  132. package/dist/daemon/ui.js.map +0 -1
  133. package/dist/daemon/watcher.js +0 -256
  134. package/dist/daemon/watcher.js.map +0 -1
  135. package/dist/db/client.js +0 -22
  136. package/dist/db/client.js.map +0 -1
  137. package/dist/db/schema.js +0 -496
  138. package/dist/db/schema.js.map +0 -1
  139. package/dist/license/api-base.js +0 -13
  140. package/dist/license/api-base.js.map +0 -1
  141. package/dist/license/manager.js +0 -43
  142. package/dist/license/manager.js.map +0 -1
  143. package/dist/license/public-key.js +0 -19
  144. package/dist/license/public-key.js.map +0 -1
  145. package/dist/license/storage.js +0 -27
  146. package/dist/license/storage.js.map +0 -1
  147. package/dist/license/verify.js +0 -23
  148. package/dist/license/verify.js.map +0 -1
  149. package/dist/mcp/audit.js +0 -126
  150. package/dist/mcp/audit.js.map +0 -1
  151. package/dist/mcp/prompts.js +0 -180
  152. package/dist/mcp/prompts.js.map +0 -1
  153. package/dist/mcp/server.js +0 -502
  154. package/dist/mcp/server.js.map +0 -1
  155. package/dist/mcp/thread-tools.js +0 -363
  156. package/dist/mcp/thread-tools.js.map +0 -1
  157. package/dist/mcp/write-tools.js +0 -239
  158. package/dist/mcp/write-tools.js.map +0 -1
  159. package/dist/parser/jsonl.js +0 -150
  160. package/dist/parser/jsonl.js.map +0 -1
  161. package/dist/semantic/chunker.js +0 -47
  162. package/dist/semantic/chunker.js.map +0 -1
  163. package/dist/semantic/config.js +0 -74
  164. package/dist/semantic/config.js.map +0 -1
  165. package/dist/semantic/embedder.js +0 -54
  166. package/dist/semantic/embedder.js.map +0 -1
  167. package/dist/semantic/fusion.js +0 -38
  168. package/dist/semantic/fusion.js.map +0 -1
  169. package/dist/semantic/model-download.js +0 -69
  170. package/dist/semantic/model-download.js.map +0 -1
  171. package/dist/semantic/pipeline.js +0 -375
  172. package/dist/semantic/pipeline.js.map +0 -1
  173. package/dist/semantic/query.js +0 -42
  174. package/dist/semantic/query.js.map +0 -1
  175. package/dist/semantic/worker.js +0 -78
  176. package/dist/semantic/worker.js.map +0 -1
  177. package/dist/stats/backfill.js +0 -151
  178. package/dist/stats/backfill.js.map +0 -1
  179. package/dist/stats/health.js +0 -102
  180. package/dist/stats/health.js.map +0 -1
  181. package/dist/stats/query.js +0 -385
  182. package/dist/stats/query.js.map +0 -1
  183. package/dist/utils/aliases.js +0 -107
  184. package/dist/utils/aliases.js.map +0 -1
  185. package/dist/utils/autoCollections.js +0 -635
  186. package/dist/utils/autoCollections.js.map +0 -1
  187. package/dist/utils/autoTitle.js +0 -348
  188. package/dist/utils/autoTitle.js.map +0 -1
  189. package/dist/utils/collections.js +0 -446
  190. package/dist/utils/collections.js.map +0 -1
  191. package/dist/utils/format.js +0 -46
  192. package/dist/utils/format.js.map +0 -1
  193. package/dist/utils/notes.js +0 -270
  194. package/dist/utils/notes.js.map +0 -1
  195. package/dist/utils/paths.js +0 -50
  196. package/dist/utils/paths.js.map +0 -1
  197. package/dist/utils/pricing.js +0 -257
  198. package/dist/utils/pricing.js.map +0 -1
  199. package/dist/utils/secret-scanner.js +0 -166
  200. package/dist/utils/secret-scanner.js.map +0 -1
  201. package/dist/utils/sessionLabel.js +0 -64
  202. package/dist/utils/sessionLabel.js.map +0 -1
  203. package/dist/utils/tags.js +0 -97
  204. package/dist/utils/tags.js.map +0 -1
  205. package/dist/utils/thread-context.js +0 -129
  206. package/dist/utils/thread-context.js.map +0 -1
  207. package/dist/utils/threadFilter.js +0 -18
  208. package/dist/utils/threadFilter.js.map +0 -1
  209. package/dist/utils/threads-titler.js +0 -298
  210. package/dist/utils/threads-titler.js.map +0 -1
  211. package/dist/utils/threads.js +0 -383
  212. package/dist/utils/threads.js.map +0 -1
  213. package/dist/utils/usage.js +0 -76
  214. package/dist/utils/usage.js.map +0 -1
  215. package/dist/verification/compute.js +0 -88
  216. package/dist/verification/compute.js.map +0 -1
  217. package/dist/verification/config.js +0 -34
  218. package/dist/verification/config.js.map +0 -1
  219. package/dist/web/assets/index-CIr6J4Fw.js +0 -1201
  220. package/dist/web/assets/index-Ctc8g9Jw.css +0 -1
@@ -1,186 +0,0 @@
1
- /**
2
- * v0.15, T4 — Passive editor/terminal origin detection.
3
- *
4
- * Reads the env of a running `claude` process to figure out whether it was
5
- * launched from VS Code / Cursor / Warp / iTerm / etc., without requiring
6
- * our VS Code extension to be installed. Feeds the correlator so sessions
7
- * started in those surfaces still get a human-readable auto-alias.
8
- *
9
- * Security posture (HANDOFF.md):
10
- * - Process inspection is LOCAL ONLY via `ps eww` (macOS/BSD) or
11
- * `/proc/<pid>/environ` (Linux). No network, no escalation.
12
- * - Env is filtered through EDITOR_ENV_ALLOWLIST before it's ever inspected,
13
- * logged, or passed across a function boundary — so an `OPENAI_API_KEY`
14
- * or `AWS_SECRET_ACCESS_KEY` the user exported in their shell can never
15
- * leak into a log line or stored alias.
16
- */
17
- import { execFile } from 'node:child_process';
18
- import { readFile } from 'node:fs/promises';
19
- import { promisify } from 'node:util';
20
- const execFileP = promisify(execFile);
21
- /**
22
- * The ONLY env vars this module is allowed to read. Anything else MUST be
23
- * dropped before it crosses a function boundary — see filterEnvToAllowlist.
24
- *
25
- * If you add a new editor/terminal detection rule, add its marker here too.
26
- */
27
- export const EDITOR_ENV_ALLOWLIST = [
28
- 'CURSOR_TRACE_ID',
29
- 'VSCODE_PID',
30
- 'VSCODE_INJECTION',
31
- 'TERM_PROGRAM',
32
- 'TERM_PROGRAM_VERSION',
33
- 'TERM',
34
- 'WT_SESSION',
35
- 'KITTY_WINDOW_ID',
36
- 'ALACRITTY_SOCKET',
37
- 'WARP_HONOR_PS1',
38
- ];
39
- /**
40
- * Strip any env key not explicitly allowlisted. Returns a new object — never
41
- * mutates the input. This is the secret-redaction choke point: nothing outside
42
- * this module should ever see a raw env map.
43
- */
44
- export function filterEnvToAllowlist(env) {
45
- const out = {};
46
- for (const key of EDITOR_ENV_ALLOWLIST) {
47
- const v = env[key];
48
- if (typeof v === 'string' && v.length > 0)
49
- out[key] = v;
50
- }
51
- return out;
52
- }
53
- /**
54
- * Pure, synchronous classifier. The input MUST already be filtered through
55
- * filterEnvToAllowlist — the function itself does not re-filter, so callers
56
- * that pass unfiltered env risk feeding a secret into the `label` string.
57
- * (In practice, the only callers in this module do filter first.)
58
- *
59
- * Precedence order matters: Cursor is a VS Code fork and ships VSCODE_PID
60
- * unconditionally, so CURSOR_TRACE_ID has to be checked first or every Cursor
61
- * session gets misattributed to VS Code.
62
- */
63
- export function detectFromEnv(env) {
64
- const detectedAt = Date.now();
65
- if (env.CURSOR_TRACE_ID) {
66
- return { editor: 'cursor', label: 'Cursor', detectedAt };
67
- }
68
- if (env.VSCODE_PID || env.VSCODE_INJECTION) {
69
- return { editor: 'vscode', label: 'VS Code', detectedAt };
70
- }
71
- const termProgram = env.TERM_PROGRAM;
72
- if (termProgram === 'WarpTerminal') {
73
- return { editor: 'warp', label: 'Warp', detectedAt };
74
- }
75
- if (termProgram === 'iTerm.app') {
76
- return { editor: 'iterm', label: 'iTerm', detectedAt };
77
- }
78
- if (termProgram === 'Apple_Terminal') {
79
- return { editor: 'apple-terminal', label: 'Terminal', detectedAt };
80
- }
81
- if (termProgram === 'WezTerm') {
82
- return { editor: 'wezterm', label: 'WezTerm', detectedAt };
83
- }
84
- if (env.WT_SESSION) {
85
- return { editor: 'windows-terminal', label: 'Windows Terminal', detectedAt };
86
- }
87
- if (env.KITTY_WINDOW_ID) {
88
- return { editor: 'kitty', label: 'Kitty', detectedAt };
89
- }
90
- if (env.TERM === 'alacritty' || env.ALACRITTY_SOCKET) {
91
- return { editor: 'alacritty', label: 'Alacritty', detectedAt };
92
- }
93
- return null;
94
- }
95
- /**
96
- * Read the env of an arbitrary PID using a platform-specific shim.
97
- * - Linux: /proc/<pid>/environ (NUL-delimited KEY=VALUE)
98
- * - macOS/BSD: `ps eww -o command= -p <pid>` — the `e` flag appends the
99
- * env after the argv in the command column, separated by spaces.
100
- *
101
- * Returns an empty object on any failure (process gone, permission denied,
102
- * unsupported platform). The caller treats "can't read env" the same as
103
- * "no editor marker present" → no origin detected.
104
- */
105
- async function readProcessEnv(pid) {
106
- if (process.platform === 'linux') {
107
- try {
108
- const raw = await readFile(`/proc/${pid}/environ`, 'utf8');
109
- return parseNulDelimited(raw);
110
- }
111
- catch {
112
- return {};
113
- }
114
- }
115
- // macOS, FreeBSD, OpenBSD — ps eww appends env after argv.
116
- try {
117
- const { stdout } = await execFileP('ps', ['eww', '-o', 'command=', '-p', String(pid)], { timeout: 2_000, maxBuffer: 1024 * 1024 });
118
- return parsePsCommandEnv(stdout);
119
- }
120
- catch {
121
- return {};
122
- }
123
- }
124
- function parseNulDelimited(raw) {
125
- const out = {};
126
- for (const pair of raw.split('\0')) {
127
- if (!pair)
128
- continue;
129
- const eq = pair.indexOf('=');
130
- if (eq <= 0)
131
- continue;
132
- const k = pair.slice(0, eq);
133
- const v = pair.slice(eq + 1);
134
- out[k] = v;
135
- }
136
- return out;
137
- }
138
- /**
139
- * `ps eww` output looks like:
140
- * /path/to/claude arg1 arg2 KEY=value OTHER=value2 ...
141
- *
142
- * We can't reliably split argv from env (argv can contain `=`), but for our
143
- * purposes we only care about the allowlisted env keys — so we scan every
144
- * space-separated token, keep the ones that look like `KEY=value` AND whose
145
- * KEY is in the allowlist. Everything else (argv, unrelated env) is dropped.
146
- * This is intentionally conservative: we'd rather miss a marker than misread
147
- * an argv as env.
148
- */
149
- function parsePsCommandEnv(stdout) {
150
- const out = {};
151
- const allowlist = new Set(EDITOR_ENV_ALLOWLIST);
152
- // Flatten multi-line output (long command lines wrap) into one blob then
153
- // split on whitespace. `ps eww` doesn't quote — env values with spaces will
154
- // be truncated at the first whitespace, which is fine for the short ID-like
155
- // markers we care about.
156
- const tokens = stdout.replace(/\s+/g, ' ').trim().split(' ');
157
- for (const tok of tokens) {
158
- const eq = tok.indexOf('=');
159
- if (eq <= 0)
160
- continue;
161
- const k = tok.slice(0, eq);
162
- if (!allowlist.has(k))
163
- continue;
164
- out[k] = tok.slice(eq + 1);
165
- }
166
- return out;
167
- }
168
- /**
169
- * End-to-end origin detection for a live process. Reads env via the platform
170
- * shim, filters through the allowlist, classifies. Returns `null` on any
171
- * failure — callers treat that as "no origin known" and fall through to the
172
- * next heuristic. Never throws.
173
- */
174
- export async function detectEditorOrigin(pid) {
175
- if (!Number.isFinite(pid) || pid <= 0)
176
- return null;
177
- try {
178
- const raw = await readProcessEnv(pid);
179
- const filtered = filterEnvToAllowlist(raw);
180
- return detectFromEnv(filtered);
181
- }
182
- catch {
183
- return null;
184
- }
185
- }
186
- //# sourceMappingURL=editor-detection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"editor-detection.js","sourceRoot":"","sources":["../../src/daemon/editor-detection.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"entrypoint.js","sourceRoot":"","sources":["../../src/daemon/entrypoint.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,MAAM,2BAA2B,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAEvC,eAAe,CAAC;QACd,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI;QACJ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAE/B,0EAA0E;IAC1E,0EAA0E;IAC1E,uEAAuE;IACvE,uDAAuD;IACvD,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,IAAI,CAAC;YACH,iBAAiB,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,UAAU,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,WAAW,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,CAAC;IAE9E,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,EAAE;QAClC,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,iBAAiB,CAAC,CAAC;QAC1D,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3B,aAAa,CAAC,SAAS,CAAC,CAAC;QACzB,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE/C,OAAO,CAAC,GAAG,CAAC,sCAAsC,IAAI,SAAS,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACtC,eAAe,EAAE,CAAC;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,256 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { promisify } from 'node:util';
3
- import { stat } from 'node:fs/promises';
4
- import { getDb } from '../db/client.js';
5
- const execFileP = promisify(execFile);
6
- /**
7
- * v0.10b — Git correlator.
8
- *
9
- * For any session whose `cwd` is a live git worktree, we record every commit
10
- * authored in that worktree during the session's [started_at, ended_at]
11
- * window. The invariants are non-negotiable:
12
- *
13
- * - `git` is always spawned with `cwd: sessionCwd`. It is never invoked at
14
- * the user's HOME or anywhere else. This is what keeps blast radius
15
- * scoped to the worktree the user was working in.
16
- * - Only read-only subcommands run (`rev-parse`, `log`). No `fetch`, no
17
- * `push`, no `pull`, no `checkout`. We never touch refs or disk state.
18
- * - Arguments are passed via the execFile array form — no shell, no
19
- * interpolation. A malicious branch name or commit subject cannot inject
20
- * a command.
21
- * - Missing cwds, non-repos, or permission errors are swallowed silently.
22
- * This is a best-effort enrichment; it must never crash ingest.
23
- */
24
- const GIT_TIMEOUT_MS = 10_000;
25
- const LOG_PRETTY = '%H%x09%aI%x09%s';
26
- async function isGitWorktree(cwd) {
27
- try {
28
- const { stdout } = await execFileP('git', ['rev-parse', '--is-inside-work-tree'], { cwd, timeout: GIT_TIMEOUT_MS });
29
- return stdout.trim() === 'true';
30
- }
31
- catch {
32
- return false;
33
- }
34
- }
35
- async function gitLogCommits(cwd, since, until) {
36
- // --no-color / --no-pager for scriptable output.
37
- // --all ensures we catch commits on any branch authored during the window,
38
- // not just the current HEAD lineage. Recall users frequently rebase or
39
- // branch-hop mid-session.
40
- const args = [
41
- '--no-pager',
42
- 'log',
43
- '--all',
44
- '--no-color',
45
- '--since',
46
- since,
47
- '--until',
48
- until,
49
- `--pretty=format:${LOG_PRETTY}`,
50
- ];
51
- const { stdout } = await execFileP('git', args, {
52
- cwd,
53
- timeout: GIT_TIMEOUT_MS,
54
- maxBuffer: 8 * 1024 * 1024,
55
- });
56
- const rows = [];
57
- const seen = new Set();
58
- for (const line of stdout.split('\n')) {
59
- if (!line)
60
- continue;
61
- const [sha, iso, ...rest] = line.split('\t');
62
- if (!sha || seen.has(sha))
63
- continue;
64
- seen.add(sha);
65
- rows.push({
66
- commit_sha: sha,
67
- committed_at: iso ?? null,
68
- subject: rest.join('\t') || null,
69
- });
70
- }
71
- return rows;
72
- }
73
- function getSession(sessionId) {
74
- const db = getDb();
75
- return (db
76
- .prepare(`SELECT id, cwd, started_at, ended_at
77
- FROM sessions WHERE id = ?`)
78
- .get(sessionId) ?? null);
79
- }
80
- function persistCommits(sessionId, cwdSnapshot, commits) {
81
- if (commits.length === 0)
82
- return 0;
83
- const db = getDb();
84
- const now = new Date().toISOString();
85
- const ins = db.prepare(`INSERT OR IGNORE INTO session_commits
86
- (session_id, commit_sha, committed_at, subject, cwd_snapshot, correlated_at)
87
- VALUES (?, ?, ?, ?, ?, ?)`);
88
- let inserted = 0;
89
- const txn = db.transaction((rows) => {
90
- for (const r of rows) {
91
- const result = ins.run(sessionId, r.commit_sha, r.committed_at, r.subject, cwdSnapshot, now);
92
- if (result.changes > 0)
93
- inserted += 1;
94
- }
95
- });
96
- txn(commits);
97
- return inserted;
98
- }
99
- /**
100
- * Correlate one session. Silently skips any graceful-failure path — the
101
- * CLI and API endpoints surface the result code for user-facing calls; the
102
- * watcher hook discards it.
103
- */
104
- export async function correlateSession(sessionId) {
105
- const session = getSession(sessionId);
106
- if (!session) {
107
- return { sessionId, status: 'error', commitsFound: 0, commitsInserted: 0, error: 'session not found' };
108
- }
109
- if (!session.cwd) {
110
- return { sessionId, status: 'no-cwd', commitsFound: 0, commitsInserted: 0 };
111
- }
112
- if (!session.started_at || !session.ended_at) {
113
- return { sessionId, status: 'no-window', commitsFound: 0, commitsInserted: 0 };
114
- }
115
- // Tolerate zero-length windows by extending the upper bound by 1 second —
116
- // very short sessions sometimes share a timestamp across started_at and
117
- // ended_at, which `git log --since=X --until=X` rejects.
118
- const sinceIso = session.started_at;
119
- const untilIso = session.ended_at === session.started_at
120
- ? new Date(Date.parse(session.ended_at) + 1000).toISOString()
121
- : session.ended_at;
122
- try {
123
- const s = await stat(session.cwd);
124
- if (!s.isDirectory()) {
125
- return { sessionId, status: 'cwd-missing', commitsFound: 0, commitsInserted: 0 };
126
- }
127
- }
128
- catch {
129
- return { sessionId, status: 'cwd-missing', commitsFound: 0, commitsInserted: 0 };
130
- }
131
- const isRepo = await isGitWorktree(session.cwd);
132
- if (!isRepo) {
133
- return { sessionId, status: 'not-a-repo', commitsFound: 0, commitsInserted: 0 };
134
- }
135
- try {
136
- const commits = await gitLogCommits(session.cwd, sinceIso, untilIso);
137
- const inserted = persistCommits(sessionId, session.cwd, commits);
138
- return {
139
- sessionId,
140
- status: 'ok',
141
- commitsFound: commits.length,
142
- commitsInserted: inserted,
143
- };
144
- }
145
- catch (err) {
146
- return {
147
- sessionId,
148
- status: 'error',
149
- commitsFound: 0,
150
- commitsInserted: 0,
151
- error: err.message,
152
- };
153
- }
154
- }
155
- /**
156
- * Correlate every session that has a cwd and a closed time window. Safe to
157
- * re-run: INSERT OR IGNORE on the composite PK means a second pass just
158
- * tops up newly-visible commits.
159
- */
160
- export async function correlateAll(opts = {}) {
161
- const db = getDb();
162
- const limit = Math.max(1, Math.min(100_000, opts.limit ?? 10_000));
163
- const rows = db
164
- .prepare(`SELECT id FROM sessions
165
- WHERE cwd IS NOT NULL AND started_at IS NOT NULL AND ended_at IS NOT NULL
166
- ORDER BY COALESCE(ended_at, started_at) DESC
167
- LIMIT ?`)
168
- .all(limit);
169
- const summary = {
170
- total: rows.length,
171
- ok: 0,
172
- skipped: 0,
173
- errors: 0,
174
- commitsInserted: 0,
175
- results: [],
176
- };
177
- let done = 0;
178
- for (const r of rows) {
179
- const res = await correlateSession(r.id);
180
- summary.results.push(res);
181
- if (res.status === 'ok') {
182
- summary.ok += 1;
183
- summary.commitsInserted += res.commitsInserted;
184
- }
185
- else if (res.status === 'error') {
186
- summary.errors += 1;
187
- }
188
- else {
189
- summary.skipped += 1;
190
- }
191
- done += 1;
192
- opts.onProgress?.(done, rows.length);
193
- }
194
- return summary;
195
- }
196
- export function findSessionsByCommit(shaOrPrefix) {
197
- const db = getDb();
198
- const trimmed = shaOrPrefix.trim();
199
- if (!/^[0-9a-fA-F]{4,40}$/.test(trimmed))
200
- return [];
201
- const like = `${trimmed.toLowerCase()}%`;
202
- return db
203
- .prepare(`SELECT sc.session_id AS sessionId,
204
- NULLIF(sa.alias, '') AS alias,
205
- p.name AS project,
206
- s.started_at AS startedAt,
207
- s.ended_at AS endedAt,
208
- sc.commit_sha AS commitSha,
209
- sc.committed_at AS committedAt,
210
- sc.subject AS subject
211
- FROM session_commits sc
212
- JOIN sessions s ON s.id = sc.session_id
213
- JOIN projects p ON p.id = s.project_id
214
- LEFT JOIN session_aliases sa ON sa.session_id = sc.session_id
215
- WHERE lower(sc.commit_sha) = lower(?)
216
- OR lower(sc.commit_sha) LIKE ?
217
- ORDER BY COALESCE(sc.committed_at, s.started_at, '') DESC`)
218
- .all(trimmed, like);
219
- }
220
- /** Commits already correlated for a given session. Used by the UI strip. */
221
- export function getCommitsForSession(sessionId) {
222
- const db = getDb();
223
- return db
224
- .prepare(`SELECT commit_sha, committed_at, subject, correlated_at
225
- FROM session_commits
226
- WHERE session_id = ?
227
- ORDER BY COALESCE(committed_at, correlated_at) ASC`)
228
- .all(sessionId);
229
- }
230
- /**
231
- * Non-blocking hook for the watcher. Fires correlation for a session id,
232
- * swallows all errors, and never blocks the caller. If the session already
233
- * has correlated rows younger than `freshness_ms`, skip to avoid hammering
234
- * git on every debounced reindex while a session is still being written.
235
- */
236
- const RECORRELATE_COOLDOWN_MS = 30_000;
237
- export function maybeCorrelateInBackground(sessionId) {
238
- try {
239
- const db = getDb();
240
- const row = db
241
- .prepare(`SELECT MAX(correlated_at) AS last_at
242
- FROM session_commits WHERE session_id = ?`)
243
- .get(sessionId);
244
- const lastAt = row?.last_at ? Date.parse(row.last_at) : 0;
245
- if (lastAt && Date.now() - lastAt < RECORRELATE_COOLDOWN_MS)
246
- return;
247
- }
248
- catch {
249
- // DB read failures should never prevent correlation from attempting.
250
- }
251
- void correlateSession(sessionId).catch((err) => {
252
- // eslint-disable-next-line no-console
253
- console.error(`[git-correlator] ${sessionId.slice(0, 8)} failed:`, err);
254
- });
255
- }
256
- //# sourceMappingURL=git-correlator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"git-correlator.js","sourceRoot":"","sources":["../../src/daemon/git-correlator.ts"],"names":[],"mappings":"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"}
@@ -1,108 +0,0 @@
1
- import { execSync } from 'node:child_process';
2
- import { existsSync, readFileSync, writeFileSync } from 'node:fs';
3
- import { homedir } from 'node:os';
4
- import { dirname, join, resolve } from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
- /**
7
- * One-click "Install Claude Recall MCP in Claude Code" helper. Reads the
8
- * user's Claude Code user config at ~/.claude.json, surgically adds a
9
- * `mcpServers.recall` entry, and writes it back preserving every other key.
10
- *
11
- * We pick the best command shape at install time:
12
- * 1. If `claude-recall-mcp` is on PATH (globally installed via npm), use
13
- * that as the command — shortest, works anywhere.
14
- * 2. Otherwise, locate the bundled `dist/mcp/server.js` relative to this
15
- * module and write an absolute-path invocation via `node`. This is
16
- * what local-dev users (npm link not run) need.
17
- */
18
- const CLAUDE_CONFIG_FILE = join(homedir(), '.claude.json');
19
- // Resolve dist/mcp/server.js by walking up from this file. When built,
20
- // this file lives at <repo>/dist/daemon/mcp-installer.js → go up two → <repo>/dist
21
- // → join mcp/server.js.
22
- const HERE = dirname(fileURLToPath(import.meta.url));
23
- const BUNDLED_MCP_SCRIPT = resolve(HERE, '..', 'mcp', 'server.js');
24
- function readClaudeConfig() {
25
- if (!existsSync(CLAUDE_CONFIG_FILE))
26
- return {};
27
- try {
28
- const raw = readFileSync(CLAUDE_CONFIG_FILE, 'utf8');
29
- const parsed = JSON.parse(raw);
30
- if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
31
- return parsed;
32
- }
33
- return {};
34
- }
35
- catch (err) {
36
- console.error('[mcp-installer] failed to parse ~/.claude.json:', err);
37
- return {};
38
- }
39
- }
40
- function hasBinaryOnPath(name) {
41
- try {
42
- execSync(`command -v ${name}`, { stdio: 'ignore' });
43
- return true;
44
- }
45
- catch {
46
- return false;
47
- }
48
- }
49
- /**
50
- * Pick the best MCP invocation for THIS machine. Globally-installed users
51
- * get the short form; local-dev / npm-link-skipped users get an absolute
52
- * path to the bundled script so Claude Code can actually find it.
53
- */
54
- function preferredCommand() {
55
- if (hasBinaryOnPath('claude-recall-mcp')) {
56
- return { command: 'claude-recall-mcp', args: [] };
57
- }
58
- return { command: process.execPath, args: [BUNDLED_MCP_SCRIPT] };
59
- }
60
- export function getMcpInstallStatus() {
61
- const cfg = readClaudeConfig();
62
- const entry = cfg.mcpServers?.['recall'];
63
- return {
64
- configPath: CLAUDE_CONFIG_FILE,
65
- configExists: existsSync(CLAUDE_CONFIG_FILE),
66
- installed: Boolean(entry && typeof entry.command === 'string'),
67
- command: entry?.command ?? null,
68
- args: entry?.args ?? null,
69
- };
70
- }
71
- export function installMcp() {
72
- const cfg = readClaudeConfig();
73
- const existing = (cfg.mcpServers ?? {});
74
- const desired = preferredCommand();
75
- const already = existing['recall'];
76
- const alreadyMatches = already?.command === desired.command &&
77
- JSON.stringify(already?.args ?? []) === JSON.stringify(desired.args);
78
- if (alreadyMatches)
79
- return getMcpInstallStatus();
80
- // Build the entry — omit `args` field when empty to keep the config tidy.
81
- const recallEntry = { command: desired.command };
82
- if (desired.args.length > 0)
83
- recallEntry.args = desired.args;
84
- const next = {
85
- ...cfg,
86
- mcpServers: {
87
- ...existing,
88
- recall: recallEntry,
89
- },
90
- };
91
- writeFileSync(CLAUDE_CONFIG_FILE, JSON.stringify(next, null, 2));
92
- return getMcpInstallStatus();
93
- }
94
- export function uninstallMcp() {
95
- const cfg = readClaudeConfig();
96
- const existing = (cfg.mcpServers ?? {});
97
- if (!existing['recall'])
98
- return getMcpInstallStatus();
99
- const { recall: _removed, ...rest } = existing;
100
- void _removed;
101
- const next = {
102
- ...cfg,
103
- mcpServers: rest,
104
- };
105
- writeFileSync(CLAUDE_CONFIG_FILE, JSON.stringify(next, null, 2));
106
- return getMcpInstallStatus();
107
- }
108
- //# sourceMappingURL=mcp-installer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-installer.js","sourceRoot":"","sources":["../../src/daemon/mcp-installer.ts"],"names":[],"mappings":"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"}