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