@clauderecallhq/cli 0.0.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) 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 +354 -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/license.js +39 -0
  27. package/dist/commands/license.js.map +1 -0
  28. package/dist/commands/list.js +47 -0
  29. package/dist/commands/list.js.map +1 -0
  30. package/dist/commands/mcp.js +29 -0
  31. package/dist/commands/mcp.js.map +1 -0
  32. package/dist/commands/open.js +28 -0
  33. package/dist/commands/open.js.map +1 -0
  34. package/dist/commands/paste.js +154 -0
  35. package/dist/commands/paste.js.map +1 -0
  36. package/dist/commands/projects.js +36 -0
  37. package/dist/commands/projects.js.map +1 -0
  38. package/dist/commands/search.js +67 -0
  39. package/dist/commands/search.js.map +1 -0
  40. package/dist/commands/semantic.js +173 -0
  41. package/dist/commands/semantic.js.map +1 -0
  42. package/dist/commands/show.js +121 -0
  43. package/dist/commands/show.js.map +1 -0
  44. package/dist/commands/start.js +47 -0
  45. package/dist/commands/start.js.map +1 -0
  46. package/dist/commands/stats.js +133 -0
  47. package/dist/commands/stats.js.map +1 -0
  48. package/dist/commands/status.js +45 -0
  49. package/dist/commands/status.js.map +1 -0
  50. package/dist/commands/stop.js +29 -0
  51. package/dist/commands/stop.js.map +1 -0
  52. package/dist/commands/thread.js +396 -0
  53. package/dist/commands/thread.js.map +1 -0
  54. package/dist/context/formatter.js +103 -0
  55. package/dist/context/formatter.js.map +1 -0
  56. package/dist/daemon/auto-tag-config.js +103 -0
  57. package/dist/daemon/auto-tag-config.js.map +1 -0
  58. package/dist/daemon/auto-tag-config.test.js +72 -0
  59. package/dist/daemon/auto-tag-config.test.js.map +1 -0
  60. package/dist/daemon/auto-title-config.js +70 -0
  61. package/dist/daemon/auto-title-config.js.map +1 -0
  62. package/dist/daemon/bulk-title-jobs.js +170 -0
  63. package/dist/daemon/bulk-title-jobs.js.map +1 -0
  64. package/dist/daemon/correlator.js +320 -0
  65. package/dist/daemon/correlator.js.map +1 -0
  66. package/dist/daemon/discover.js +316 -0
  67. package/dist/daemon/discover.js.map +1 -0
  68. package/dist/daemon/editor-detection.js +186 -0
  69. package/dist/daemon/editor-detection.js.map +1 -0
  70. package/dist/daemon/entrypoint.js +55 -0
  71. package/dist/daemon/entrypoint.js.map +1 -0
  72. package/dist/daemon/git-correlator.js +256 -0
  73. package/dist/daemon/git-correlator.js.map +1 -0
  74. package/dist/daemon/mcp-installer.js +108 -0
  75. package/dist/daemon/mcp-installer.js.map +1 -0
  76. package/dist/daemon/onboarding-state.js +140 -0
  77. package/dist/daemon/onboarding-state.js.map +1 -0
  78. package/dist/daemon/pidfile.js +57 -0
  79. package/dist/daemon/pidfile.js.map +1 -0
  80. package/dist/daemon/ports.js +48 -0
  81. package/dist/daemon/ports.js.map +1 -0
  82. package/dist/daemon/scanProgressRegistry.js +62 -0
  83. package/dist/daemon/scanProgressRegistry.js.map +1 -0
  84. package/dist/daemon/server.js +2010 -0
  85. package/dist/daemon/server.js.map +1 -0
  86. package/dist/daemon/tag-scanner/anthropic-client.js +40 -0
  87. package/dist/daemon/tag-scanner/anthropic-client.js.map +1 -0
  88. package/dist/daemon/tag-scanner/autopilot.js +131 -0
  89. package/dist/daemon/tag-scanner/autopilot.js.map +1 -0
  90. package/dist/daemon/tag-scanner/claude-cli-driver.js +250 -0
  91. package/dist/daemon/tag-scanner/claude-cli-driver.js.map +1 -0
  92. package/dist/daemon/tag-scanner/orchestrator.js +88 -0
  93. package/dist/daemon/tag-scanner/orchestrator.js.map +1 -0
  94. package/dist/daemon/tag-scanner/prompt.js +46 -0
  95. package/dist/daemon/tag-scanner/prompt.js.map +1 -0
  96. package/dist/daemon/tag-scanner/prompt.test.js +48 -0
  97. package/dist/daemon/tag-scanner/prompt.test.js.map +1 -0
  98. package/dist/daemon/tag-scanner/scan-state.js +49 -0
  99. package/dist/daemon/tag-scanner/scan-state.js.map +1 -0
  100. package/dist/daemon/tag-scanner/session-fetcher.js +82 -0
  101. package/dist/daemon/tag-scanner/session-fetcher.js.map +1 -0
  102. package/dist/daemon/tag-scanner/session-fetcher.test.js +34 -0
  103. package/dist/daemon/tag-scanner/session-fetcher.test.js.map +1 -0
  104. package/dist/daemon/tag-scanner/validator.js +50 -0
  105. package/dist/daemon/tag-scanner/validator.js.map +1 -0
  106. package/dist/daemon/tag-scanner/validator.test.js +41 -0
  107. package/dist/daemon/tag-scanner/validator.test.js.map +1 -0
  108. package/dist/daemon/terminal-registry.js +443 -0
  109. package/dist/daemon/terminal-registry.js.map +1 -0
  110. package/dist/daemon/ui.js +64 -0
  111. package/dist/daemon/ui.js.map +1 -0
  112. package/dist/daemon/watcher.js +256 -0
  113. package/dist/daemon/watcher.js.map +1 -0
  114. package/dist/db/client.js +22 -0
  115. package/dist/db/client.js.map +1 -0
  116. package/dist/db/schema.js +496 -0
  117. package/dist/db/schema.js.map +1 -0
  118. package/dist/license/api-base.js +13 -0
  119. package/dist/license/api-base.js.map +1 -0
  120. package/dist/license/manager.js +43 -0
  121. package/dist/license/manager.js.map +1 -0
  122. package/dist/license/public-key.js +19 -0
  123. package/dist/license/public-key.js.map +1 -0
  124. package/dist/license/storage.js +27 -0
  125. package/dist/license/storage.js.map +1 -0
  126. package/dist/license/verify.js +23 -0
  127. package/dist/license/verify.js.map +1 -0
  128. package/dist/mcp/audit.js +126 -0
  129. package/dist/mcp/audit.js.map +1 -0
  130. package/dist/mcp/prompts.js +180 -0
  131. package/dist/mcp/prompts.js.map +1 -0
  132. package/dist/mcp/server.js +502 -0
  133. package/dist/mcp/server.js.map +1 -0
  134. package/dist/mcp/thread-tools.js +363 -0
  135. package/dist/mcp/thread-tools.js.map +1 -0
  136. package/dist/mcp/write-tools.js +239 -0
  137. package/dist/mcp/write-tools.js.map +1 -0
  138. package/dist/parser/jsonl.js +150 -0
  139. package/dist/parser/jsonl.js.map +1 -0
  140. package/dist/semantic/chunker.js +47 -0
  141. package/dist/semantic/chunker.js.map +1 -0
  142. package/dist/semantic/config.js +74 -0
  143. package/dist/semantic/config.js.map +1 -0
  144. package/dist/semantic/embedder.js +54 -0
  145. package/dist/semantic/embedder.js.map +1 -0
  146. package/dist/semantic/fusion.js +38 -0
  147. package/dist/semantic/fusion.js.map +1 -0
  148. package/dist/semantic/model-download.js +69 -0
  149. package/dist/semantic/model-download.js.map +1 -0
  150. package/dist/semantic/pipeline.js +375 -0
  151. package/dist/semantic/pipeline.js.map +1 -0
  152. package/dist/semantic/query.js +42 -0
  153. package/dist/semantic/query.js.map +1 -0
  154. package/dist/semantic/worker.js +78 -0
  155. package/dist/semantic/worker.js.map +1 -0
  156. package/dist/stats/backfill.js +151 -0
  157. package/dist/stats/backfill.js.map +1 -0
  158. package/dist/stats/health.js +102 -0
  159. package/dist/stats/health.js.map +1 -0
  160. package/dist/stats/query.js +385 -0
  161. package/dist/stats/query.js.map +1 -0
  162. package/dist/utils/aliases.js +107 -0
  163. package/dist/utils/aliases.js.map +1 -0
  164. package/dist/utils/autoCollections.js +635 -0
  165. package/dist/utils/autoCollections.js.map +1 -0
  166. package/dist/utils/autoTitle.js +348 -0
  167. package/dist/utils/autoTitle.js.map +1 -0
  168. package/dist/utils/collections.js +446 -0
  169. package/dist/utils/collections.js.map +1 -0
  170. package/dist/utils/format.js +46 -0
  171. package/dist/utils/format.js.map +1 -0
  172. package/dist/utils/notes.js +270 -0
  173. package/dist/utils/notes.js.map +1 -0
  174. package/dist/utils/paths.js +50 -0
  175. package/dist/utils/paths.js.map +1 -0
  176. package/dist/utils/pricing.js +257 -0
  177. package/dist/utils/pricing.js.map +1 -0
  178. package/dist/utils/secret-scanner.js +166 -0
  179. package/dist/utils/secret-scanner.js.map +1 -0
  180. package/dist/utils/sessionLabel.js +64 -0
  181. package/dist/utils/sessionLabel.js.map +1 -0
  182. package/dist/utils/tags.js +97 -0
  183. package/dist/utils/tags.js.map +1 -0
  184. package/dist/utils/thread-context.js +129 -0
  185. package/dist/utils/thread-context.js.map +1 -0
  186. package/dist/utils/threadFilter.js +18 -0
  187. package/dist/utils/threadFilter.js.map +1 -0
  188. package/dist/utils/threads-titler.js +298 -0
  189. package/dist/utils/threads-titler.js.map +1 -0
  190. package/dist/utils/threads.js +383 -0
  191. package/dist/utils/threads.js.map +1 -0
  192. package/dist/utils/usage.js +76 -0
  193. package/dist/utils/usage.js.map +1 -0
  194. package/dist/verification/compute.js +88 -0
  195. package/dist/verification/compute.js.map +1 -0
  196. package/dist/verification/config.js +34 -0
  197. package/dist/verification/config.js.map +1 -0
  198. package/dist/web/assets/index-CIr6J4Fw.js +1201 -0
  199. package/dist/web/assets/index-Ctc8g9Jw.css +1 -0
  200. package/dist/web/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  201. package/dist/web/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  202. package/dist/web/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  203. package/dist/web/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  204. package/dist/web/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  205. package/dist/web/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  206. package/dist/web/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  207. package/dist/web/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  208. package/dist/web/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  209. package/dist/web/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  210. package/dist/web/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  211. package/dist/web/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  212. package/dist/web/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  213. package/dist/web/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  214. package/dist/web/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  215. package/dist/web/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  216. package/dist/web/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  217. package/dist/web/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  218. package/dist/web/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  219. package/dist/web/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  220. package/dist/web/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  221. package/dist/web/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  222. package/dist/web/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  223. package/dist/web/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  224. package/dist/web/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  225. package/dist/web/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  226. package/dist/web/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  227. package/dist/web/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  228. package/dist/web/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  229. package/dist/web/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  230. package/dist/web/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  231. package/dist/web/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  232. package/dist/web/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  233. package/dist/web/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  234. package/dist/web/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  235. package/dist/web/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  236. package/dist/web/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  237. package/dist/web/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  238. package/dist/web/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  239. package/dist/web/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  240. package/dist/web/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  241. package/dist/web/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  242. package/dist/web/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  243. package/dist/web/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  244. package/dist/web/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  245. package/dist/web/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  246. package/dist/web/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  247. package/dist/web/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  248. package/dist/web/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  249. package/dist/web/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  250. package/dist/web/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  251. package/dist/web/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  252. package/dist/web/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  253. package/dist/web/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  254. package/dist/web/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  255. package/dist/web/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  256. package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  257. package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  258. package/dist/web/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
  259. package/dist/web/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
  260. package/dist/web/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  261. package/dist/web/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  262. package/dist/web/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
  263. package/dist/web/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
  264. package/dist/web/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  265. package/dist/web/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  266. package/dist/web/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  267. package/dist/web/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  268. package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  269. package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  270. package/dist/web/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
  271. package/dist/web/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
  272. package/dist/web/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  273. package/dist/web/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
  274. package/dist/web/favicon.svg +9 -0
  275. package/dist/web/index.html +15 -0
  276. package/package.json +79 -9
  277. package/bin/cli.js +0 -12
@@ -0,0 +1,126 @@
1
+ /**
2
+ * v0.13 — MCP write audit + rate limiting.
3
+ *
4
+ * Every invocation of an MCP write tool flows through `withAudit()`:
5
+ * 1. Sliding-window rate limit check (default 60 writes/min). Exhaustion
6
+ * raises `RateLimitError` and is itself logged as `result='rate_limited'`.
7
+ * 2. The wrapped function runs.
8
+ * 3. Outcome ('ok' | 'error') is appended to `mcp_audit_events`.
9
+ *
10
+ * The table is append-only — the audit row exists *before* the write commits
11
+ * conceptually, but in practice we log on outcome so failures are visible too.
12
+ * Tags and collections also write to their own event tables, but every single
13
+ * write tool call lands here so reviewers have one chronological feed.
14
+ *
15
+ * Stderr-only logging (stdout is reserved for MCP JSON-RPC framing).
16
+ */
17
+ import { getDb } from '../db/client.js';
18
+ export const DEFAULT_RATE_LIMIT_PER_MIN = 60;
19
+ export const RATE_LIMIT_WINDOW_MS = 60_000;
20
+ export class RateLimitError extends Error {
21
+ retryAfterMs;
22
+ constructor(retryAfterMs) {
23
+ super(`MCP write rate limit exceeded — try again in ${Math.ceil(retryAfterMs / 1000)}s`);
24
+ this.name = 'RateLimitError';
25
+ this.retryAfterMs = retryAfterMs;
26
+ }
27
+ }
28
+ export function logWrite(input) {
29
+ const at = new Date().toISOString();
30
+ let argsJson;
31
+ try {
32
+ argsJson = JSON.stringify(input.args ?? null);
33
+ }
34
+ catch {
35
+ argsJson = '"<unserializable>"';
36
+ }
37
+ getDb()
38
+ .prepare(`INSERT INTO mcp_audit_events (tool, args_json, result, error_message, caller, at)
39
+ VALUES (?, ?, ?, ?, ?, ?)`)
40
+ .run(input.tool, argsJson, input.result, input.errorMessage ?? null, input.caller ?? null, at);
41
+ }
42
+ export function getAuditLog(limit = 100) {
43
+ return getDb()
44
+ .prepare(`SELECT id, tool, args_json, result, error_message, caller, at
45
+ FROM mcp_audit_events
46
+ ORDER BY at DESC, id DESC
47
+ LIMIT ?`)
48
+ .all(limit);
49
+ }
50
+ /**
51
+ * Sliding-window rate limiter. Keeps a per-process timestamp ring (lightweight
52
+ * — we don't need cross-process accuracy because the MCP server is one
53
+ * process). Cheap, correct, no dependencies.
54
+ */
55
+ export class RateLimiter {
56
+ capacity;
57
+ windowMs;
58
+ hits = [];
59
+ constructor(capacity = DEFAULT_RATE_LIMIT_PER_MIN, windowMs = RATE_LIMIT_WINDOW_MS) {
60
+ this.capacity = capacity;
61
+ this.windowMs = windowMs;
62
+ }
63
+ /** Throws RateLimitError if budget is exhausted; otherwise records the hit. */
64
+ consume(now = Date.now()) {
65
+ this.evict(now);
66
+ if (this.hits.length >= this.capacity) {
67
+ const oldest = this.hits[0];
68
+ const retryAfterMs = Math.max(1, oldest + this.windowMs - now);
69
+ throw new RateLimitError(retryAfterMs);
70
+ }
71
+ this.hits.push(now);
72
+ }
73
+ /** Inspect remaining budget without consuming. */
74
+ remaining(now = Date.now()) {
75
+ this.evict(now);
76
+ return Math.max(0, this.capacity - this.hits.length);
77
+ }
78
+ reset() {
79
+ this.hits.length = 0;
80
+ }
81
+ evict(now) {
82
+ const cutoff = now - this.windowMs;
83
+ while (this.hits.length > 0 && this.hits[0] < cutoff) {
84
+ this.hits.shift();
85
+ }
86
+ }
87
+ }
88
+ /**
89
+ * Run a write tool through the rate limiter + audit log. The runtime ALWAYS
90
+ * gets an audit row, whether the call succeeded, threw, or was rejected by
91
+ * the rate limiter. Re-throws so the caller can map to an MCP error response.
92
+ */
93
+ export async function withAudit(opts) {
94
+ try {
95
+ opts.limiter.consume();
96
+ }
97
+ catch (err) {
98
+ if (err instanceof RateLimitError) {
99
+ logWrite({
100
+ tool: opts.tool,
101
+ args: opts.args,
102
+ result: 'rate_limited',
103
+ errorMessage: err.message,
104
+ caller: opts.caller,
105
+ });
106
+ }
107
+ throw err;
108
+ }
109
+ try {
110
+ const out = await opts.run();
111
+ logWrite({ tool: opts.tool, args: opts.args, result: 'ok', caller: opts.caller });
112
+ return out;
113
+ }
114
+ catch (err) {
115
+ const message = err instanceof Error ? err.message : String(err);
116
+ logWrite({
117
+ tool: opts.tool,
118
+ args: opts.args,
119
+ result: 'error',
120
+ errorMessage: message,
121
+ caller: opts.caller,
122
+ });
123
+ throw err;
124
+ }
125
+ }
126
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/mcp/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ import { z } from 'zod';
2
+ export const AutoTagPromptSchema = {
3
+ project: z.string().optional().describe('Exact project name match (optional).'),
4
+ collectionId: z.string().optional().describe('Restrict to sessions in this collection (optional).'),
5
+ sessionId: z.string().optional().describe('Full session UUID to tag just one session (optional).'),
6
+ untaggedOnly: z.boolean().optional().describe('Skip sessions that already have any tag (default: true).'),
7
+ limit: z.number().int().min(1).max(500).optional().describe('Max sessions to process (default: 100).'),
8
+ minTags: z.number().int().min(1).max(10).optional().describe('Minimum tags per session (default: 2).'),
9
+ maxTags: z.number().int().min(1).max(10).optional().describe('Maximum tags per session (default: 4).'),
10
+ };
11
+ export function buildAutoTagPrompt(args) {
12
+ const minTags = args.minTags ?? 2;
13
+ const maxTags = args.maxTags ?? 4;
14
+ const untaggedOnly = args.untaggedOnly ?? !args.sessionId;
15
+ const lines = [
16
+ 'Auto-tag my Claude Recall sessions using the MCP tools available to you.',
17
+ '',
18
+ '1. Call `list_tags` first to see which tags I already use (prefer those for consistency over inventing new ones).',
19
+ '2. Call `list_sessions_to_tag` with these filters:',
20
+ ];
21
+ const filters = [];
22
+ if (args.sessionId) {
23
+ filters.push('limit: 1');
24
+ lines.push(` ${filters.join(', ')}`);
25
+ lines.push(` Then match the session id ${args.sessionId} from the returned list.`);
26
+ }
27
+ else {
28
+ if (untaggedOnly)
29
+ filters.push('untaggedOnly: true');
30
+ if (args.project)
31
+ filters.push(`project: "${args.project}"`);
32
+ if (args.collectionId)
33
+ filters.push(`collectionId: "${args.collectionId}"`);
34
+ filters.push(`limit: ${args.limit ?? 100}`);
35
+ lines.push(` ${filters.join(', ')}`);
36
+ }
37
+ lines.push('');
38
+ lines.push(`3. For each session returned, look at the alias, first user message, git branch, and sampled messages. Pick ${minTags}-${maxTags} concise, lowercase, hyphen-separated tags describing:`);
39
+ lines.push(' - domain/subsystem (auth, db, frontend, billing, etc.)');
40
+ lines.push(' - kind of work (bugfix, feature, refactor, research)');
41
+ lines.push(' - prominent tools or libraries if relevant');
42
+ lines.push('');
43
+ lines.push('4. Call `apply_tags` once per session to write the tags.');
44
+ lines.push('');
45
+ lines.push('Work through EVERY session returned — do not stop partway. When done, reply with a short summary of how many sessions were tagged. Do not ask clarifying questions; just do the work.');
46
+ return lines.join('\n');
47
+ }
48
+ export const SummarizeSessionPromptSchema = {
49
+ sessionId: z.string().describe('Session UUID (or 8+-char prefix) to summarize.'),
50
+ mode: z.enum(['brief', 'detailed']).optional().describe('brief = 3-5 bullets; detailed = paragraph + bullets. Default: brief.'),
51
+ };
52
+ export function buildSummarizeSessionPrompt(args) {
53
+ const detailed = args.mode === 'detailed';
54
+ const lines = [
55
+ `Summarize Claude Recall session ${args.sessionId} using the MCP tools available to you.`,
56
+ '',
57
+ `1. Call \`context_for_session\` with id "${args.sessionId}" and mode "condensed" to get the transcript as markdown.`,
58
+ detailed
59
+ ? '2. Write a 1-paragraph overview (≤3 sentences) of what this session was for, then 5-8 bullet points covering:'
60
+ : '2. Write 3-5 bullet points covering:',
61
+ ' - What was accomplished (shipped, decided, learned)',
62
+ ' - What was tried and abandoned',
63
+ ' - Any explicit open questions or follow-ups',
64
+ '',
65
+ 'Rules:',
66
+ '- Be concrete. Name files, functions, and decisions. Avoid vague "discussed X".',
67
+ '- If nothing was actually shipped or decided, say so plainly.',
68
+ '- Reply with just the summary — no preamble, no "Here is the summary:".',
69
+ ];
70
+ return lines.join('\n');
71
+ }
72
+ export const ExtractDecisionsPromptSchema = {
73
+ sessionId: z.string().describe('Session UUID (or 8+-char prefix) to extract decisions from.'),
74
+ };
75
+ export function buildExtractDecisionsPrompt(args) {
76
+ return [
77
+ `Extract every architectural or product decision made in Claude Recall session ${args.sessionId}.`,
78
+ '',
79
+ `1. Call \`context_for_session\` with id "${args.sessionId}" and mode "full" (so tool I/O is included — sometimes the decision lives in a commit message or diff).`,
80
+ '2. For each distinct decision, emit one block:',
81
+ '',
82
+ ' - **Decision:** one sentence.',
83
+ ' - **Why:** the stated rationale (quote if possible).',
84
+ ' - **Alternatives considered:** bullet list, or "none mentioned".',
85
+ ' - **Where it landed:** file path / function name / commit SHA if identifiable, otherwise "TBD".',
86
+ '',
87
+ 'Rules:',
88
+ '- Include only decisions that were actually made, not ideas merely discussed.',
89
+ '- If an alternative was rejected, list it with a one-line reason.',
90
+ '- Group related decisions under a short heading when useful.',
91
+ '- If the session made zero real decisions, reply exactly with: "No decisions made in this session."',
92
+ '- No preamble, no closing, just the decision blocks.',
93
+ ].join('\n');
94
+ }
95
+ export const FindSimilarSessionsPromptSchema = {
96
+ sessionId: z.string().describe('Session UUID (or 8+-char prefix) to find similar sessions to.'),
97
+ limit: z.number().int().min(1).max(20).optional().describe('How many similar sessions to surface (default: 5).'),
98
+ };
99
+ export function buildFindSimilarSessionsPrompt(args) {
100
+ const limit = args.limit ?? 5;
101
+ return [
102
+ `Find ${limit} Recall sessions most similar to session ${args.sessionId}.`,
103
+ '',
104
+ `1. Call \`get_session\` with id "${args.sessionId}" — note its alias, first user message, tags, and git branch.`,
105
+ '2. Derive 2-3 short search queries from that content (topic words, library names, error strings — NOT generic words like "fix" or "add").',
106
+ `3. Call \`search\` once per query (limit: ${Math.max(5, limit * 2)}). Dedupe hits by session_id.`,
107
+ '4. Also call `list_sessions` with the same tag(s) if the target session has any (pick the most specific tag).',
108
+ '5. Union the results. Exclude the target session itself. Rank by a mix of:',
109
+ ' - Shared tags (strongest signal)',
110
+ ' - Matching search hits across multiple queries',
111
+ ' - Recency as a tiebreaker',
112
+ '',
113
+ `6. Return the top ${limit} as a numbered list. For each:`,
114
+ ' - **<short_id> · <project>** — <alias or first_user_message truncated>',
115
+ ' - One sentence on WHY it is similar (not a generic "same topic" — be specific).',
116
+ '',
117
+ 'If fewer than 2 genuinely-similar sessions exist, say so rather than padding with weak matches.',
118
+ 'No preamble. Just the ranked list.',
119
+ ].join('\n');
120
+ }
121
+ const ALL_RECALL_READ_TOOLS = [
122
+ 'mcp__recall__list_projects',
123
+ 'mcp__recall__list_sessions',
124
+ 'mcp__recall__list_tags',
125
+ 'mcp__recall__search',
126
+ 'mcp__recall__get_session',
127
+ 'mcp__recall__context_for_session',
128
+ ];
129
+ export const AUTO_TAG_PROMPT = {
130
+ name: 'auto_tag_sessions',
131
+ title: 'Auto-tag Recall sessions',
132
+ description: 'Have the agent auto-tag Recall sessions using the Recall MCP tools. Scope can be restricted to a project, collection, or single session.',
133
+ argsSchema: AutoTagPromptSchema,
134
+ build: buildAutoTagPrompt,
135
+ allowedTools: [
136
+ 'mcp__recall__list_tags',
137
+ 'mcp__recall__list_sessions_to_tag',
138
+ 'mcp__recall__apply_tags',
139
+ ],
140
+ };
141
+ export const SUMMARIZE_SESSION_PROMPT = {
142
+ name: 'summarize_session',
143
+ title: 'Summarize a session',
144
+ description: 'Produce a concise, concrete summary of one session — what shipped, what was tried, what\'s still open.',
145
+ argsSchema: SummarizeSessionPromptSchema,
146
+ build: buildSummarizeSessionPrompt,
147
+ allowedTools: ['mcp__recall__get_session', 'mcp__recall__context_for_session'],
148
+ };
149
+ export const EXTRACT_DECISIONS_PROMPT = {
150
+ name: 'extract_decisions',
151
+ title: 'Extract architectural decisions',
152
+ description: 'Scan a session and emit one structured block per architectural / product decision: what, why, alternatives, where it landed.',
153
+ argsSchema: ExtractDecisionsPromptSchema,
154
+ build: buildExtractDecisionsPrompt,
155
+ allowedTools: ['mcp__recall__get_session', 'mcp__recall__context_for_session'],
156
+ };
157
+ export const FIND_SIMILAR_SESSIONS_PROMPT = {
158
+ name: 'find_similar_sessions',
159
+ title: 'Find similar sessions',
160
+ description: 'Given a session, find other sessions that touched the same topic / library / error — ranked with reasons.',
161
+ argsSchema: FindSimilarSessionsPromptSchema,
162
+ build: buildFindSimilarSessionsPrompt,
163
+ allowedTools: [
164
+ 'mcp__recall__get_session',
165
+ 'mcp__recall__search',
166
+ 'mcp__recall__list_sessions',
167
+ 'mcp__recall__list_tags',
168
+ ],
169
+ };
170
+ export const RECALL_PROMPTS = [
171
+ AUTO_TAG_PROMPT,
172
+ SUMMARIZE_SESSION_PROMPT,
173
+ EXTRACT_DECISIONS_PROMPT,
174
+ FIND_SIMILAR_SESSIONS_PROMPT,
175
+ ];
176
+ export function findPrompt(name) {
177
+ return RECALL_PROMPTS.find((p) => p.name === name);
178
+ }
179
+ export { ALL_RECALL_READ_TOOLS };
180
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/mcp/prompts.ts"],"names":[],"mappings":"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"}