@clauderecallhq/cli 0.12.5 → 0.61.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/LICENSE +37 -17
  2. package/README.md +110 -22
  3. package/dist/cli.js +1641 -353
  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 +58 -18
  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/license.js +0 -39
  47. package/dist/commands/license.js.map +0 -1
  48. package/dist/commands/list.js +0 -47
  49. package/dist/commands/list.js.map +0 -1
  50. package/dist/commands/mcp.js +0 -29
  51. package/dist/commands/mcp.js.map +0 -1
  52. package/dist/commands/open.js +0 -28
  53. package/dist/commands/open.js.map +0 -1
  54. package/dist/commands/paste.js +0 -154
  55. package/dist/commands/paste.js.map +0 -1
  56. package/dist/commands/projects.js +0 -36
  57. package/dist/commands/projects.js.map +0 -1
  58. package/dist/commands/search.js +0 -67
  59. package/dist/commands/search.js.map +0 -1
  60. package/dist/commands/semantic.js +0 -173
  61. package/dist/commands/semantic.js.map +0 -1
  62. package/dist/commands/show.js +0 -121
  63. package/dist/commands/show.js.map +0 -1
  64. package/dist/commands/start.js +0 -47
  65. package/dist/commands/start.js.map +0 -1
  66. package/dist/commands/stats.js +0 -133
  67. package/dist/commands/stats.js.map +0 -1
  68. package/dist/commands/status.js +0 -45
  69. package/dist/commands/status.js.map +0 -1
  70. package/dist/commands/stop.js +0 -29
  71. package/dist/commands/stop.js.map +0 -1
  72. package/dist/commands/thread.js +0 -396
  73. package/dist/commands/thread.js.map +0 -1
  74. package/dist/context/formatter.js +0 -103
  75. package/dist/context/formatter.js.map +0 -1
  76. package/dist/daemon/auto-tag-config.js +0 -103
  77. package/dist/daemon/auto-tag-config.js.map +0 -1
  78. package/dist/daemon/auto-tag-config.test.js +0 -72
  79. package/dist/daemon/auto-tag-config.test.js.map +0 -1
  80. package/dist/daemon/auto-title-config.js +0 -70
  81. package/dist/daemon/auto-title-config.js.map +0 -1
  82. package/dist/daemon/bulk-title-jobs.js +0 -170
  83. package/dist/daemon/bulk-title-jobs.js.map +0 -1
  84. package/dist/daemon/correlator.js +0 -320
  85. package/dist/daemon/correlator.js.map +0 -1
  86. package/dist/daemon/discover.js +0 -316
  87. package/dist/daemon/discover.js.map +0 -1
  88. package/dist/daemon/editor-detection.js +0 -186
  89. package/dist/daemon/editor-detection.js.map +0 -1
  90. package/dist/daemon/entrypoint.js.map +0 -1
  91. package/dist/daemon/git-correlator.js +0 -256
  92. package/dist/daemon/git-correlator.js.map +0 -1
  93. package/dist/daemon/mcp-installer.js +0 -108
  94. package/dist/daemon/mcp-installer.js.map +0 -1
  95. package/dist/daemon/onboarding-state.js +0 -140
  96. package/dist/daemon/onboarding-state.js.map +0 -1
  97. package/dist/daemon/pidfile.js +0 -57
  98. package/dist/daemon/pidfile.js.map +0 -1
  99. package/dist/daemon/ports.js +0 -48
  100. package/dist/daemon/ports.js.map +0 -1
  101. package/dist/daemon/scanProgressRegistry.js +0 -62
  102. package/dist/daemon/scanProgressRegistry.js.map +0 -1
  103. package/dist/daemon/server.js +0 -2010
  104. package/dist/daemon/server.js.map +0 -1
  105. package/dist/daemon/tag-scanner/anthropic-client.js +0 -40
  106. package/dist/daemon/tag-scanner/anthropic-client.js.map +0 -1
  107. package/dist/daemon/tag-scanner/autopilot.js +0 -131
  108. package/dist/daemon/tag-scanner/autopilot.js.map +0 -1
  109. package/dist/daemon/tag-scanner/claude-cli-driver.js +0 -250
  110. package/dist/daemon/tag-scanner/claude-cli-driver.js.map +0 -1
  111. package/dist/daemon/tag-scanner/orchestrator.js +0 -88
  112. package/dist/daemon/tag-scanner/orchestrator.js.map +0 -1
  113. package/dist/daemon/tag-scanner/prompt.js +0 -46
  114. package/dist/daemon/tag-scanner/prompt.js.map +0 -1
  115. package/dist/daemon/tag-scanner/prompt.test.js +0 -48
  116. package/dist/daemon/tag-scanner/prompt.test.js.map +0 -1
  117. package/dist/daemon/tag-scanner/scan-state.js +0 -49
  118. package/dist/daemon/tag-scanner/scan-state.js.map +0 -1
  119. package/dist/daemon/tag-scanner/session-fetcher.js +0 -82
  120. package/dist/daemon/tag-scanner/session-fetcher.js.map +0 -1
  121. package/dist/daemon/tag-scanner/session-fetcher.test.js +0 -34
  122. package/dist/daemon/tag-scanner/session-fetcher.test.js.map +0 -1
  123. package/dist/daemon/tag-scanner/validator.js +0 -50
  124. package/dist/daemon/tag-scanner/validator.js.map +0 -1
  125. package/dist/daemon/tag-scanner/validator.test.js +0 -41
  126. package/dist/daemon/tag-scanner/validator.test.js.map +0 -1
  127. package/dist/daemon/terminal-registry.js +0 -443
  128. package/dist/daemon/terminal-registry.js.map +0 -1
  129. package/dist/daemon/ui.js +0 -64
  130. package/dist/daemon/ui.js.map +0 -1
  131. package/dist/daemon/watcher.js +0 -256
  132. package/dist/daemon/watcher.js.map +0 -1
  133. package/dist/db/client.js +0 -22
  134. package/dist/db/client.js.map +0 -1
  135. package/dist/db/schema.js +0 -496
  136. package/dist/db/schema.js.map +0 -1
  137. package/dist/license/api-base.js +0 -13
  138. package/dist/license/api-base.js.map +0 -1
  139. package/dist/license/manager.js +0 -43
  140. package/dist/license/manager.js.map +0 -1
  141. package/dist/license/public-key.js +0 -19
  142. package/dist/license/public-key.js.map +0 -1
  143. package/dist/license/storage.js +0 -27
  144. package/dist/license/storage.js.map +0 -1
  145. package/dist/license/verify.js +0 -23
  146. package/dist/license/verify.js.map +0 -1
  147. package/dist/mcp/audit.js +0 -126
  148. package/dist/mcp/audit.js.map +0 -1
  149. package/dist/mcp/prompts.js +0 -180
  150. package/dist/mcp/prompts.js.map +0 -1
  151. package/dist/mcp/server.js +0 -502
  152. package/dist/mcp/server.js.map +0 -1
  153. package/dist/mcp/thread-tools.js +0 -363
  154. package/dist/mcp/thread-tools.js.map +0 -1
  155. package/dist/mcp/write-tools.js +0 -239
  156. package/dist/mcp/write-tools.js.map +0 -1
  157. package/dist/parser/jsonl.js +0 -150
  158. package/dist/parser/jsonl.js.map +0 -1
  159. package/dist/semantic/chunker.js +0 -47
  160. package/dist/semantic/chunker.js.map +0 -1
  161. package/dist/semantic/config.js +0 -74
  162. package/dist/semantic/config.js.map +0 -1
  163. package/dist/semantic/embedder.js +0 -54
  164. package/dist/semantic/embedder.js.map +0 -1
  165. package/dist/semantic/fusion.js +0 -38
  166. package/dist/semantic/fusion.js.map +0 -1
  167. package/dist/semantic/model-download.js +0 -69
  168. package/dist/semantic/model-download.js.map +0 -1
  169. package/dist/semantic/pipeline.js +0 -375
  170. package/dist/semantic/pipeline.js.map +0 -1
  171. package/dist/semantic/query.js +0 -42
  172. package/dist/semantic/query.js.map +0 -1
  173. package/dist/semantic/worker.js +0 -78
  174. package/dist/semantic/worker.js.map +0 -1
  175. package/dist/stats/backfill.js +0 -151
  176. package/dist/stats/backfill.js.map +0 -1
  177. package/dist/stats/health.js +0 -102
  178. package/dist/stats/health.js.map +0 -1
  179. package/dist/stats/query.js +0 -385
  180. package/dist/stats/query.js.map +0 -1
  181. package/dist/utils/aliases.js +0 -107
  182. package/dist/utils/aliases.js.map +0 -1
  183. package/dist/utils/autoCollections.js +0 -635
  184. package/dist/utils/autoCollections.js.map +0 -1
  185. package/dist/utils/autoTitle.js +0 -348
  186. package/dist/utils/autoTitle.js.map +0 -1
  187. package/dist/utils/collections.js +0 -446
  188. package/dist/utils/collections.js.map +0 -1
  189. package/dist/utils/format.js +0 -46
  190. package/dist/utils/format.js.map +0 -1
  191. package/dist/utils/notes.js +0 -270
  192. package/dist/utils/notes.js.map +0 -1
  193. package/dist/utils/paths.js +0 -50
  194. package/dist/utils/paths.js.map +0 -1
  195. package/dist/utils/pricing.js +0 -257
  196. package/dist/utils/pricing.js.map +0 -1
  197. package/dist/utils/secret-scanner.js +0 -166
  198. package/dist/utils/secret-scanner.js.map +0 -1
  199. package/dist/utils/sessionLabel.js +0 -64
  200. package/dist/utils/sessionLabel.js.map +0 -1
  201. package/dist/utils/tags.js +0 -97
  202. package/dist/utils/tags.js.map +0 -1
  203. package/dist/utils/thread-context.js +0 -129
  204. package/dist/utils/thread-context.js.map +0 -1
  205. package/dist/utils/threadFilter.js +0 -18
  206. package/dist/utils/threadFilter.js.map +0 -1
  207. package/dist/utils/threads-titler.js +0 -298
  208. package/dist/utils/threads-titler.js.map +0 -1
  209. package/dist/utils/threads.js +0 -383
  210. package/dist/utils/threads.js.map +0 -1
  211. package/dist/utils/usage.js +0 -76
  212. package/dist/utils/usage.js.map +0 -1
  213. package/dist/verification/compute.js +0 -88
  214. package/dist/verification/compute.js.map +0 -1
  215. package/dist/verification/config.js +0 -34
  216. package/dist/verification/config.js.map +0 -1
  217. package/dist/web/assets/index-CIr6J4Fw.js +0 -1201
  218. package/dist/web/assets/index-Ctc8g9Jw.css +0 -1
@@ -1,396 +0,0 @@
1
- import Table from 'cli-table3';
2
- import { getDb } from '../db/client.js';
3
- import { c, shortId, timeAgo, truncate } from '../utils/format.js';
4
- import { addSessionToThread, archiveThread, closeThread, createThread, getThread, listThreads, mergeThreads, removeSessionFromThread, renameThread, reopenThread, setParent, splitThread, } from '../utils/threads.js';
5
- /**
6
- * Resolve a thread id-prefix to a full thread id.
7
- * Returns null and writes to stderr if nothing or multiple matches are found.
8
- */
9
- function resolveThreadId(prefix) {
10
- const db = getDb();
11
- if (prefix.length >= 32) {
12
- const row = db.prepare('SELECT id FROM threads WHERE id = ?').get(prefix);
13
- if (row)
14
- return row.id;
15
- process.stderr.write(`thread not found: ${prefix}\n`);
16
- return null;
17
- }
18
- const rows = db
19
- .prepare('SELECT id, name FROM threads WHERE id LIKE ? ORDER BY created_at DESC')
20
- .all(prefix + '%');
21
- if (rows.length === 1)
22
- return rows[0].id;
23
- if (rows.length === 0) {
24
- process.stderr.write(`no thread matches prefix "${prefix}"\n`);
25
- return null;
26
- }
27
- process.stderr.write(`ambiguous thread prefix "${prefix}" — candidates:\n`);
28
- for (const r of rows) {
29
- process.stderr.write(` ${shortId(r.id)} ${r.name}\n`);
30
- }
31
- return null;
32
- }
33
- function resolveSessionId(prefix) {
34
- const db = getDb();
35
- if (prefix.length >= 32) {
36
- const row = db.prepare('SELECT id FROM sessions WHERE id = ?').get(prefix);
37
- if (row)
38
- return row.id;
39
- process.stderr.write(`session not found: ${prefix}\n`);
40
- return null;
41
- }
42
- const rows = db
43
- .prepare('SELECT id FROM sessions WHERE id LIKE ? LIMIT 2')
44
- .all(prefix + '%');
45
- if (rows.length === 1)
46
- return rows[0].id;
47
- if (rows.length === 0) {
48
- process.stderr.write(`no session matches prefix "${prefix}"\n`);
49
- return null;
50
- }
51
- process.stderr.write(`ambiguous session prefix "${prefix}". be more specific.\n`);
52
- return null;
53
- }
54
- function loadSessionLabels(ids) {
55
- const map = new Map();
56
- if (ids.length === 0)
57
- return map;
58
- const placeholders = ids.map(() => '?').join(',');
59
- const db = getDb();
60
- const rows = db
61
- .prepare(`SELECT s.id,
62
- s.first_user_message,
63
- p.name AS project_name,
64
- a.alias AS alias
65
- FROM sessions s
66
- LEFT JOIN projects p ON p.id = s.project_id
67
- LEFT JOIN session_aliases a ON a.session_id = s.id
68
- WHERE s.id IN (${placeholders})`)
69
- .all(...ids);
70
- for (const r of rows)
71
- map.set(r.id, r);
72
- return map;
73
- }
74
- function sessionLabel(id, labels) {
75
- const row = labels.get(id);
76
- const prefix = c.accent(shortId(id));
77
- if (!row)
78
- return `${prefix} ${c.dim('(unindexed)')}`;
79
- const title = row.alias ?? row.first_user_message ?? '';
80
- const project = row.project_name ? c.project(`[${row.project_name}] `) : '';
81
- return `${prefix} ${project}${truncate(title, 80)}`;
82
- }
83
- function threadStatus(t) {
84
- if (t.archived)
85
- return 'archived';
86
- if (t.closed_at)
87
- return 'closed';
88
- return 'open';
89
- }
90
- function printStatusLine(t) {
91
- const status = threadStatus(t);
92
- process.stderr.write(c.ok(`✓ ${t.name} ${c.dim(`(${shortId(t.id)})`)} [${status}]\n`));
93
- }
94
- function emit(json, payload, renderText) {
95
- if (json) {
96
- process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
97
- return;
98
- }
99
- renderText();
100
- }
101
- export function runThreadList(opts) {
102
- const threads = listThreads({ includeArchived: opts.archived === true });
103
- emit(opts.json === true, threads, () => {
104
- if (threads.length === 0) {
105
- console.log(c.dim('no threads. create one with `recall thread new <name>`.'));
106
- return;
107
- }
108
- const table = new Table({
109
- head: [
110
- c.bold('id'),
111
- c.bold('name'),
112
- c.bold('sessions'),
113
- c.bold('origins'),
114
- c.bold('status'),
115
- c.bold('created'),
116
- ],
117
- colWidths: [10, 40, 10, 9, 10, 16],
118
- wordWrap: true,
119
- style: { head: [], border: ['grey'] },
120
- });
121
- for (const t of threads) {
122
- table.push([
123
- c.accent(shortId(t.id)),
124
- truncate(t.name, 38),
125
- String(t.session_count),
126
- String(t.origin_count),
127
- threadStatus(t),
128
- c.dim(timeAgo(t.created_at)),
129
- ]);
130
- }
131
- console.log(table.toString());
132
- console.log(c.dim(`${threads.length} thread${threads.length === 1 ? '' : 's'}.` +
133
- (opts.archived ? '' : ' add --archived to include archived.')));
134
- });
135
- }
136
- /**
137
- * Build children-by-parent map and origin list from edges, then print a tree.
138
- * Nodes whose parent_session_id is not itself a member of the thread are
139
- * treated as roots so we don't silently drop anything.
140
- */
141
- function printTree(detail, labels) {
142
- const members = new Set(detail.edges.map((e) => e.session_id));
143
- const childrenByParent = new Map();
144
- const roots = [];
145
- for (const e of detail.edges) {
146
- const parent = e.parent_session_id;
147
- if (e.role === 'origin' || !parent || !members.has(parent)) {
148
- roots.push(e);
149
- continue;
150
- }
151
- const list = childrenByParent.get(parent) ?? [];
152
- list.push(e);
153
- childrenByParent.set(parent, list);
154
- }
155
- const seen = new Set();
156
- const render = (edge, prefix, isLast, isRoot) => {
157
- if (seen.has(edge.session_id))
158
- return;
159
- seen.add(edge.session_id);
160
- const connector = isRoot ? '' : isLast ? '└─ ' : '├─ ';
161
- const roleTag = edge.role === 'origin' ? c.warn('[origin] ') : '';
162
- process.stdout.write(`${prefix}${connector}${roleTag}${sessionLabel(edge.session_id, labels)}\n`);
163
- const children = childrenByParent.get(edge.session_id) ?? [];
164
- const childPrefix = isRoot ? '' : prefix + (isLast ? ' ' : '│ ');
165
- children.forEach((child, i) => {
166
- render(child, childPrefix, i === children.length - 1, false);
167
- });
168
- };
169
- roots.forEach((r, i) => render(r, '', i === roots.length - 1, true));
170
- // Safety net: any orphan we missed (cycle, weird state) still gets listed.
171
- for (const e of detail.edges) {
172
- if (seen.has(e.session_id))
173
- continue;
174
- process.stdout.write(`${c.warn('? ')}${sessionLabel(e.session_id, labels)}\n`);
175
- }
176
- }
177
- export function runThreadShow(idPrefix, opts) {
178
- const id = resolveThreadId(idPrefix);
179
- if (!id) {
180
- process.exitCode = 1;
181
- return;
182
- }
183
- const detail = getThread(id);
184
- if (!detail) {
185
- process.stderr.write(`thread not found: ${idPrefix}\n`);
186
- process.exitCode = 1;
187
- return;
188
- }
189
- const labels = loadSessionLabels(detail.edges.map((e) => e.session_id));
190
- emit(opts.json === true, detail, () => {
191
- const status = threadStatus(detail);
192
- console.log(c.bold(detail.name));
193
- console.log(c.dim(`id ${shortId(detail.id)} · ${status} · ` +
194
- `${detail.session_count} session${detail.session_count === 1 ? '' : 's'} · ` +
195
- `${detail.origin_count} origin${detail.origin_count === 1 ? '' : 's'} · ` +
196
- `created ${timeAgo(detail.created_at)}`));
197
- if (detail.summary)
198
- console.log(detail.summary);
199
- console.log();
200
- if (detail.edges.length === 0) {
201
- console.log(c.dim('(no sessions linked — use `recall thread link ...`)'));
202
- return;
203
- }
204
- printTree(detail, labels);
205
- });
206
- }
207
- export function runThreadNew(name, opts) {
208
- let originId;
209
- if (opts.origin) {
210
- const resolved = resolveSessionId(opts.origin);
211
- if (!resolved) {
212
- process.exitCode = 1;
213
- return;
214
- }
215
- originId = resolved;
216
- }
217
- const detail = createThread({
218
- name,
219
- summary: opts.summary ?? null,
220
- originSessionId: originId,
221
- });
222
- emit(opts.json === true, detail, () => {
223
- printStatusLine(detail);
224
- process.stderr.write(c.dim(`id ${detail.id}\n`));
225
- if (originId) {
226
- process.stderr.write(c.dim(`origin: ${shortId(originId)}\n`));
227
- }
228
- });
229
- }
230
- export function runThreadLink(sessionPrefix, opts) {
231
- const threadId = resolveThreadId(opts.thread);
232
- if (!threadId) {
233
- process.exitCode = 1;
234
- return;
235
- }
236
- const sessionId = resolveSessionId(sessionPrefix);
237
- if (!sessionId) {
238
- process.exitCode = 1;
239
- return;
240
- }
241
- let parentId = null;
242
- if (opts.parent) {
243
- const resolved = resolveSessionId(opts.parent);
244
- if (!resolved) {
245
- process.exitCode = 1;
246
- return;
247
- }
248
- parentId = resolved;
249
- }
250
- const role = opts.role ?? (parentId ? 'child' : 'origin');
251
- const edge = addSessionToThread({
252
- threadId,
253
- sessionId,
254
- parentSessionId: parentId,
255
- role,
256
- });
257
- emit(opts.json === true, edge, () => {
258
- process.stderr.write(c.ok(`✓ linked ${shortId(sessionId)} → ${shortId(threadId)} [${role}]\n`));
259
- });
260
- }
261
- export function runThreadUnlink(sessionPrefix, opts) {
262
- const threadId = resolveThreadId(opts.thread);
263
- if (!threadId) {
264
- process.exitCode = 1;
265
- return;
266
- }
267
- const sessionId = resolveSessionId(sessionPrefix);
268
- if (!sessionId) {
269
- process.exitCode = 1;
270
- return;
271
- }
272
- const result = removeSessionFromThread(threadId, sessionId);
273
- emit(opts.json === true, result, () => {
274
- if (result.removed === 0) {
275
- process.stderr.write(c.warn(`(no edge existed for ${shortId(sessionId)} in ${shortId(threadId)})\n`));
276
- return;
277
- }
278
- process.stderr.write(c.ok(`✓ unlinked ${shortId(sessionId)} from ${shortId(threadId)}\n`));
279
- });
280
- }
281
- export function runThreadSetParent(sessionPrefix, opts) {
282
- const threadId = resolveThreadId(opts.thread);
283
- if (!threadId) {
284
- process.exitCode = 1;
285
- return;
286
- }
287
- const sessionId = resolveSessionId(sessionPrefix);
288
- if (!sessionId) {
289
- process.exitCode = 1;
290
- return;
291
- }
292
- let parentId = null;
293
- if (opts.parent && opts.parent.toLowerCase() !== 'none') {
294
- const resolved = resolveSessionId(opts.parent);
295
- if (!resolved) {
296
- process.exitCode = 1;
297
- return;
298
- }
299
- parentId = resolved;
300
- }
301
- const edge = setParent(threadId, sessionId, parentId);
302
- emit(opts.json === true, edge, () => {
303
- process.stderr.write(c.ok(`✓ ${shortId(sessionId)} in ${shortId(threadId)} → ` +
304
- (parentId ? `child of ${shortId(parentId)}` : 'origin') +
305
- '\n'));
306
- });
307
- }
308
- export function runThreadRename(idPrefix, newName, opts) {
309
- const id = resolveThreadId(idPrefix);
310
- if (!id) {
311
- process.exitCode = 1;
312
- return;
313
- }
314
- const summary = renameThread(id, newName);
315
- emit(opts.json === true, summary, () => printStatusLine(summary));
316
- }
317
- export function runThreadClose(idPrefix, opts) {
318
- const id = resolveThreadId(idPrefix);
319
- if (!id) {
320
- process.exitCode = 1;
321
- return;
322
- }
323
- const summary = closeThread(id);
324
- emit(opts.json === true, summary, () => printStatusLine(summary));
325
- }
326
- export function runThreadReopen(idPrefix, opts) {
327
- const id = resolveThreadId(idPrefix);
328
- if (!id) {
329
- process.exitCode = 1;
330
- return;
331
- }
332
- const summary = reopenThread(id);
333
- emit(opts.json === true, summary, () => printStatusLine(summary));
334
- }
335
- export function runThreadArchive(idPrefix, opts) {
336
- const id = resolveThreadId(idPrefix);
337
- if (!id) {
338
- process.exitCode = 1;
339
- return;
340
- }
341
- const summary = archiveThread(id);
342
- emit(opts.json === true, summary, () => printStatusLine(summary));
343
- }
344
- export function runThreadMerge(sourcePrefix, opts) {
345
- const sourceId = resolveThreadId(sourcePrefix);
346
- if (!sourceId) {
347
- process.exitCode = 1;
348
- return;
349
- }
350
- const destId = resolveThreadId(opts.into);
351
- if (!destId) {
352
- process.exitCode = 1;
353
- return;
354
- }
355
- if (sourceId === destId) {
356
- process.stderr.write(c.err('cannot merge a thread into itself\n'));
357
- process.exitCode = 1;
358
- return;
359
- }
360
- const detail = mergeThreads(sourceId, destId);
361
- emit(opts.json === true, detail, () => {
362
- process.stderr.write(c.ok(`✓ merged ${shortId(sourceId)} → ${shortId(destId)} (${detail.session_count} sessions)\n`));
363
- });
364
- }
365
- export function runThreadSplit(idPrefix, opts) {
366
- const id = resolveThreadId(idPrefix);
367
- if (!id) {
368
- process.exitCode = 1;
369
- return;
370
- }
371
- const rawIds = opts.sessions.split(',').map((s) => s.trim()).filter(Boolean);
372
- if (rawIds.length === 0) {
373
- process.stderr.write(c.err('--sessions must be a non-empty comma-separated list\n'));
374
- process.exitCode = 1;
375
- return;
376
- }
377
- const resolved = [];
378
- for (const raw of rawIds) {
379
- const sid = resolveSessionId(raw);
380
- if (!sid) {
381
- process.exitCode = 1;
382
- return;
383
- }
384
- resolved.push(sid);
385
- }
386
- const detail = splitThread({
387
- threadId: id,
388
- sessionIds: resolved,
389
- newThreadName: opts.name,
390
- });
391
- emit(opts.json === true, detail, () => {
392
- printStatusLine(detail);
393
- process.stderr.write(c.dim(`split off ${resolved.length} session${resolved.length === 1 ? '' : 's'} from ${shortId(id)}\n`));
394
- });
395
- }
396
- //# sourceMappingURL=thread.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"thread.js","sourceRoot":"","sources":["../../src/commands/thread.ts"],"names":[],"mappings":"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"}
@@ -1,103 +0,0 @@
1
- /**
2
- * Shared context formatter. Used by:
3
- * - `recall context <id>` (CLI, piped into `claude` or `pbcopy`)
4
- * - `/api/sessions/:id/context` (HTTP, fed to the "Copy as context" button)
5
- *
6
- * Two modes:
7
- * - "condensed" (default): user + assistant text, tool-call JSON stripped,
8
- * tool *names* preserved. Small, pipe-friendly.
9
- * - "full": everything including tool call inputs and tool results.
10
- */
11
- const SYSTEM_WRAPPER_REGEX = /<(local-command-caveat|local-command-stdout|command-name|command-message|command-args|system-reminder|user-prompt-submit-hook|task-notification)[\s\S]*?<\/\1>/gi;
12
- /** Remove the synthesized tool-call blocks we emit during indexing. */
13
- const TOOL_CALL_BLOCK_REGEX = /⚡ \*\*Tool call · `[^`]+`\*\*\s*\n+```json\n[\s\S]*?\n```/g;
14
- /** Remove the synthesized tool-result blocks we emit during indexing. */
15
- const TOOL_RESULT_BLOCK_REGEX = /\*\*Tool result\*\*\s*\n+```\n[\s\S]*?\n```/g;
16
- function stripSystemWrappers(text) {
17
- return text.replace(SYSTEM_WRAPPER_REGEX, '').trim();
18
- }
19
- function condenseMessage(text) {
20
- let out = text.replace(TOOL_CALL_BLOCK_REGEX, '[tool call]');
21
- out = out.replace(TOOL_RESULT_BLOCK_REGEX, '[tool result]');
22
- // Claude's extended-thinking blocks land in the index as unknown-block placeholders.
23
- out = out.replace(/_\(unknown block: thinking\)_/g, '');
24
- // Collapse runs of placeholder tokens created by the above replacements.
25
- out = out.replace(/(?:\[tool call\]|\[tool result\])(?:\s*(?:\[tool call\]|\[tool result\]))+/g, '[tool activity]');
26
- out = out.replace(/\n{3,}/g, '\n\n');
27
- return out.trim();
28
- }
29
- function roleLabel(m) {
30
- return m.role ?? m.type ?? 'message';
31
- }
32
- export function formatSessionAsContext(session, messages, options = {}) {
33
- const mode = options.mode ?? 'condensed';
34
- const includeSidechain = options.includeSidechain === true;
35
- const sinceMs = options.since ? Date.parse(options.since) : 0;
36
- const filtered = messages.filter((m) => {
37
- if (!includeSidechain && m.is_sidechain === 1)
38
- return false;
39
- if (sinceMs && m.timestamp && Date.parse(m.timestamp) < sinceMs)
40
- return false;
41
- return true;
42
- });
43
- const lines = [];
44
- if (options.prelude) {
45
- lines.push(options.prelude.trim());
46
- lines.push('');
47
- }
48
- lines.push(`# Claude Recall — past session context (${mode})`);
49
- lines.push('');
50
- lines.push(`- **Project**: ${session.project_name}`);
51
- if (session.decoded_path)
52
- lines.push(`- **Path**: \`${session.decoded_path}\``);
53
- lines.push(`- **Session ID**: \`${session.id}\``);
54
- if (session.started_at)
55
- lines.push(`- **Started**: ${session.started_at}`);
56
- if (session.ended_at)
57
- lines.push(`- **Ended**: ${session.ended_at}`);
58
- if (session.git_branch)
59
- lines.push(`- **Branch**: \`${session.git_branch}\``);
60
- lines.push(`- **Messages**: ${filtered.length}`);
61
- lines.push('');
62
- lines.push('> This is a transcript of a previous Claude Code session, included for context. ' +
63
- 'Refer back to it when the user asks about past decisions, code written, or problems debugged in this work.');
64
- lines.push('');
65
- lines.push('---');
66
- lines.push('');
67
- let kept = 0;
68
- let skipped = 0;
69
- for (const m of filtered) {
70
- const raw = m.content_text ?? '';
71
- let body = stripSystemWrappers(raw);
72
- if (mode === 'condensed') {
73
- body = condenseMessage(body);
74
- }
75
- const hasBody = body.length > 0;
76
- const hasTools = !!m.tool_names && m.tool_names.length > 0;
77
- if (!hasBody && !hasTools) {
78
- skipped += 1;
79
- continue;
80
- }
81
- const role = roleLabel(m);
82
- const ts = m.timestamp ? ` \`${m.timestamp}\`` : '';
83
- lines.push(`## ${role}${ts}`);
84
- lines.push('');
85
- if (hasTools && mode === 'condensed') {
86
- lines.push(`_tools used: ${m.tool_names}_`);
87
- lines.push('');
88
- }
89
- if (hasBody) {
90
- lines.push(body);
91
- lines.push('');
92
- }
93
- kept += 1;
94
- }
95
- lines.push('---');
96
- lines.push('');
97
- lines.push(`_${kept} messages included_` +
98
- (skipped ? `, ${skipped} empty skipped` : '') +
99
- (!includeSidechain ? ', subagent/sidechain hidden' : '') +
100
- '.');
101
- return lines.join('\n');
102
- }
103
- //# sourceMappingURL=formatter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/context/formatter.ts"],"names":[],"mappings":"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"}
@@ -1,103 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';
2
- import { homedir } from 'node:os';
3
- import { join } from 'node:path';
4
- import { z } from 'zod';
5
- /**
6
- * Auto-tag scanner config. Persisted as `{ autoTag: {...} }` inside
7
- * `$RECALL_HOME/config.json` (default `~/.recall/config.json`).
8
- *
9
- * The file is written with mode 0600 because it may contain an Anthropic
10
- * API key. Reads are tolerant: a missing or malformed file yields defaults
11
- * rather than throwing — the daemon must start even if config is broken.
12
- *
13
- * Path resolution is lazy (re-reads `process.env.RECALL_HOME` on every call)
14
- * so tests can redirect the data root per-test without a module-cache dance.
15
- * `RECALL_HOME` in `src/utils/paths.ts` is captured at module-load and stays
16
- * authoritative for every other consumer; this module intentionally uses its
17
- * own lazy lookup so it stays independent and test-friendly.
18
- */
19
- function recallHome() {
20
- return process.env.RECALL_HOME ?? join(homedir(), '.recall');
21
- }
22
- function ensureHome() {
23
- const home = recallHome();
24
- if (!existsSync(home))
25
- mkdirSync(home, { recursive: true });
26
- }
27
- function configFile() {
28
- return join(recallHome(), 'config.json');
29
- }
30
- export const AutoTagConfigSchema = z.object({
31
- enabled: z.boolean().default(false),
32
- backend: z.enum(['api', 'mcp']).default('api'),
33
- apiKey: z.string().optional(),
34
- model: z.string().default('claude-opus-4-7'),
35
- maxTagsPerSession: z.number().int().min(1).max(10).default(4),
36
- minTagsPerSession: z.number().int().min(1).max(10).default(2),
37
- /**
38
- * When true, daemon background-scans untagged sessions (existing + new)
39
- * and applies tags automatically — no modal, no review. Only takes effect
40
- * when backend='api' and an apiKey is set; MCP mode can't be driven by
41
- * the daemon because it needs the user's agent to make tool calls.
42
- */
43
- autopilot: z.boolean().default(false),
44
- });
45
- const DEFAULTS = {
46
- enabled: false,
47
- backend: 'api',
48
- model: 'claude-opus-4-7',
49
- maxTagsPerSession: 4,
50
- minTagsPerSession: 2,
51
- autopilot: false,
52
- };
53
- function readFileShape() {
54
- const path = configFile();
55
- if (!existsSync(path))
56
- return {};
57
- try {
58
- return JSON.parse(readFileSync(path, 'utf8'));
59
- }
60
- catch (err) {
61
- console.error('[auto-tag-config] failed to parse config.json, using defaults:', err);
62
- return {};
63
- }
64
- }
65
- export function readAutoTagConfig() {
66
- const raw = readFileShape().autoTag;
67
- if (!raw)
68
- return { ...DEFAULTS };
69
- const parsed = AutoTagConfigSchema.safeParse({ ...DEFAULTS, ...raw });
70
- return parsed.success ? parsed.data : { ...DEFAULTS };
71
- }
72
- export function writeAutoTagConfig(patch) {
73
- ensureHome();
74
- const existing = readFileShape();
75
- const merged = AutoTagConfigSchema.parse({
76
- ...DEFAULTS,
77
- ...(existing.autoTag ?? {}),
78
- ...patch,
79
- });
80
- const next = { ...existing, autoTag: merged };
81
- const path = configFile();
82
- writeFileSync(path, JSON.stringify(next, null, 2));
83
- try {
84
- chmodSync(path, 0o600);
85
- }
86
- catch (err) {
87
- console.error('[auto-tag-config] chmod 0600 failed (continuing):', err);
88
- }
89
- return merged;
90
- }
91
- /**
92
- * Shape for HTTP `GET /api/config/auto-tag`. Never exposes the raw apiKey over
93
- * the wire; instead emits a marker and a `hasApiKey` boolean.
94
- */
95
- export function redactForApi(cfg) {
96
- const { apiKey, ...rest } = cfg;
97
- return {
98
- ...rest,
99
- apiKey: apiKey ? 'sk-ant-…' : null,
100
- hasApiKey: Boolean(apiKey),
101
- };
102
- }
103
- //# sourceMappingURL=auto-tag-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-tag-config.js","sourceRoot":"","sources":["../../src/daemon/auto-tag-config.ts"],"names":[],"mappings":"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"}