@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,138 +0,0 @@
1
- import { spawnSync } from 'node:child_process';
2
- import { readdirSync } from 'node:fs';
3
- import { fileURLToPath } from 'node:url';
4
- import { dirname, join, resolve } from 'node:path';
5
- import { c } from '../utils/format.js';
6
- const EDITOR_IDS = ['code', 'cursor', 'code-insiders', 'windsurf'];
7
- const EDITORS = [
8
- { id: 'code', label: 'VS Code' },
9
- { id: 'cursor', label: 'Cursor' },
10
- { id: 'code-insiders', label: 'VS Code Insiders' },
11
- { id: 'windsurf', label: 'Windsurf' },
12
- ];
13
- // Primary Marketplace listing — published by the clauderecallhq publisher.
14
- // The legacy fibogacci.claude-recall-vscode listing stays live as a defensive
15
- // holding; we steer new users at the primary one.
16
- const MARKETPLACE_URL = 'https://marketplace.visualstudio.com/items?itemName=clauderecallhq.clauderecall-vscode';
17
- function resolveVsixDir() {
18
- const here = dirname(fileURLToPath(import.meta.url));
19
- // src/commands (tsx dev) and dist/commands (prod) both sit two levels below
20
- // the package root where extensions/vscode/ lives.
21
- return join(here, '..', '..', 'extensions', 'vscode');
22
- }
23
- function findLatestVsix() {
24
- const dir = resolveVsixDir();
25
- let entries;
26
- try {
27
- entries = readdirSync(dir);
28
- }
29
- catch {
30
- return null;
31
- }
32
- // Matches both the primary (`clauderecall-vscode-*.vsix`) and legacy
33
- // (`claude-recall-vscode-*.vsix`) artifact names during the transition.
34
- const matches = entries.filter((f) => /^(clauderecall|claude-recall)-vscode-.*\.vsix$/i.test(f));
35
- if (matches.length === 0)
36
- return null;
37
- matches.sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
38
- return resolve(dir, matches[0]);
39
- }
40
- function editorAvailable(id) {
41
- const result = spawnSync(id, ['--version'], {
42
- stdio: 'ignore',
43
- shell: process.platform === 'win32',
44
- });
45
- if (result.error)
46
- return false;
47
- return result.status === 0;
48
- }
49
- function installIntoEditor(id, vsixPath) {
50
- const result = spawnSync(id, ['--install-extension', vsixPath], {
51
- stdio: 'pipe',
52
- encoding: 'utf8',
53
- shell: process.platform === 'win32',
54
- });
55
- if (result.error)
56
- return { ok: false, message: result.error.message };
57
- if (result.status !== 0) {
58
- const stderr = (result.stderr ?? '').trim();
59
- return { ok: false, message: stderr || `exit code ${result.status ?? 'null'}` };
60
- }
61
- return { ok: true, message: '' };
62
- }
63
- function printNoVsixError() {
64
- process.stderr.write(c.err('no bundled .vsix found at extensions/vscode/(clauderecall|claude-recall)-vscode-*.vsix\n'));
65
- process.stderr.write(c.dim('see PUBLISHING.md for how to build the extension, or run:\n'));
66
- process.stderr.write(c.dim(' (cd extensions/vscode && npm install && npm run build && npm run package)\n'));
67
- }
68
- function isKnownEditor(id) {
69
- return EDITOR_IDS.includes(id);
70
- }
71
- export async function runInstallExtension(opts) {
72
- if (opts.editor !== undefined && !isKnownEditor(opts.editor)) {
73
- process.stderr.write(c.err(`unknown --editor target: ${opts.editor}\n`));
74
- process.stderr.write(c.dim(`valid values: ${EDITOR_IDS.join(', ')}\n`));
75
- process.exitCode = 1;
76
- return;
77
- }
78
- const vsixPath = findLatestVsix();
79
- if (opts.printPath) {
80
- if (!vsixPath) {
81
- printNoVsixError();
82
- process.exitCode = 1;
83
- return;
84
- }
85
- process.stdout.write(vsixPath + '\n');
86
- return;
87
- }
88
- if (!vsixPath) {
89
- printNoVsixError();
90
- process.exitCode = 1;
91
- return;
92
- }
93
- let targets;
94
- if (opts.editor) {
95
- const editorId = opts.editor;
96
- if (!editorAvailable(editorId)) {
97
- process.stderr.write(c.err(`editor CLI not found on PATH: ${editorId}\n`));
98
- process.stderr.write(c.dim('install the editor shell integration, or omit --editor to install into every detected editor.\n'));
99
- process.stderr.write(c.dim('see PUBLISHING.md for manual install instructions.\n'));
100
- process.exitCode = 1;
101
- return;
102
- }
103
- const spec = EDITORS.find((e) => e.id === editorId);
104
- targets = [spec ?? { id: editorId, label: editorId }];
105
- }
106
- else {
107
- targets = EDITORS.filter((e) => editorAvailable(e.id));
108
- }
109
- if (targets.length === 0) {
110
- process.stderr.write(c.err('no supported editor CLI detected on PATH.\n'));
111
- process.stderr.write(c.dim(`looked for: ${EDITOR_IDS.join(', ')}.\n`));
112
- process.stderr.write(c.dim('install the editor shell integration and try again.\n'));
113
- process.stderr.write(c.dim('see PUBLISHING.md for manual install instructions.\n'));
114
- process.exitCode = 1;
115
- return;
116
- }
117
- process.stderr.write(c.dim(`bundled .vsix: ${vsixPath}\n\n`));
118
- let anyFailed = false;
119
- for (const target of targets) {
120
- const { ok, message } = installIntoEditor(target.id, vsixPath);
121
- if (ok) {
122
- process.stderr.write(c.ok(`✓ installed into ${target.label} (${target.id})\n`));
123
- }
124
- else {
125
- anyFailed = true;
126
- process.stderr.write(c.err(`✗ ${target.label} (${target.id}): ${message}\n`));
127
- }
128
- }
129
- process.stderr.write('\n');
130
- process.stderr.write(c.bold('next steps:\n'));
131
- process.stderr.write(' 1. reload the editor window: Cmd/Ctrl+Shift+P then pick "Developer: Reload Window"\n');
132
- process.stderr.write(' 2. enable the extension: open settings and set "claude-recall.autoAlias" to true\n');
133
- process.stderr.write('\n');
134
- process.stderr.write(c.dim(`marketplace install: ${MARKETPLACE_URL}\n`));
135
- if (anyFailed)
136
- process.exitCode = 1;
137
- }
138
- //# sourceMappingURL=install-extension.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-extension.js","sourceRoot":"","sources":["../../src/commands/install-extension.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import { c } from '../utils/format.js';
2
- import { getLicenseStatus } from '../license/manager.js';
3
- import { clearStoredLicense, LICENSE_FILE } from '../license/storage.js';
4
- export async function runLicenseStatus() {
5
- const status = await getLicenseStatus();
6
- console.log();
7
- if (status.tier === 'free') {
8
- console.log(c.bold('Tier: Free'));
9
- console.log(c.dim('Free includes: index, list, show, projects, status, the daemon, and the basic web UI.'));
10
- if (status.invalid_reason) {
11
- console.log();
12
- console.log(c.warn(`Stored license is invalid: ${status.invalid_reason}`));
13
- }
14
- console.log();
15
- console.log('Buy Pro at https://clauderecall.com/pricing');
16
- console.log('Then run: recall activate <license-key>');
17
- console.log();
18
- return;
19
- }
20
- console.log(c.bold('Tier: Pro'));
21
- console.log(` ${c.dim('Key:')} ${status.key_short}`);
22
- console.log(` ${c.dim('Email:')} ${status.customer_email}`);
23
- console.log(` ${c.dim('Activated:')} ${status.activated_at}`);
24
- if (status.expires_at) {
25
- console.log(` ${c.dim('Expires:')} ${status.expires_at}`);
26
- }
27
- if (status.test_mode) {
28
- console.log(` ${c.warn('Test mode:')} this license was issued in LemonSqueezy test mode.`);
29
- }
30
- console.log();
31
- }
32
- export function runLicenseDeactivate() {
33
- clearStoredLicense();
34
- console.log();
35
- console.log('License removed from this machine.');
36
- console.log(c.dim(`(${LICENSE_FILE})`));
37
- console.log();
38
- }
39
- //# sourceMappingURL=license.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/commands/license.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACxC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,uFAAuF,CAAC,CAAC,CAAC;QAC5G,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAC7E,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,qDAAqD,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,kBAAkB,EAAE,CAAC;IACrB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -1,47 +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
- export function runList(options) {
5
- const db = getDb();
6
- const limit = Math.max(1, Math.min(500, parseInt(options.limit ?? '30', 10) || 30));
7
- const params = { limit };
8
- let where = '1=1';
9
- if (options.project) {
10
- where += ' AND (p.name LIKE @proj OR p.decoded_path LIKE @proj OR p.encoded_path LIKE @proj)';
11
- params.proj = `%${options.project}%`;
12
- }
13
- if (!options.all) {
14
- where += ' AND s.message_count > 2';
15
- }
16
- const rows = db
17
- .prepare(`SELECT s.id, p.name AS project_name, s.started_at,
18
- s.message_count, s.first_user_message, s.git_branch
19
- FROM sessions s
20
- JOIN projects p ON p.id = s.project_id
21
- WHERE ${where}
22
- ORDER BY COALESCE(s.started_at, '') DESC
23
- LIMIT @limit`)
24
- .all(params);
25
- if (rows.length === 0) {
26
- console.log(c.dim('no sessions found. run `recall index` first.'));
27
- return;
28
- }
29
- const table = new Table({
30
- head: [c.bold('id'), c.bold('project'), c.bold('when'), c.bold('msgs'), c.bold('opening prompt')],
31
- colWidths: [10, 22, 14, 6, 70],
32
- wordWrap: true,
33
- style: { head: [], border: ['grey'] },
34
- });
35
- for (const row of rows) {
36
- table.push([
37
- c.accent(shortId(row.id)),
38
- c.project(truncate(row.project_name, 20)),
39
- c.dim(timeAgo(row.started_at)),
40
- String(row.message_count),
41
- truncate(row.first_user_message, 200),
42
- ]);
43
- }
44
- console.log(table.toString());
45
- console.log(c.dim(`showing ${rows.length} session${rows.length === 1 ? '' : 's'}. use \`recall show <id>\` to view one.`));
46
- }
47
- //# sourceMappingURL=list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAiBnE,MAAM,UAAU,OAAO,CAAC,OAAoB;IAC1C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,MAAM,GAA4B,EAAE,KAAK,EAAE,CAAC;IAClD,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,KAAK,IAAI,oFAAoF,CAAC;QAC9F,MAAM,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,0BAA0B,CAAC;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;eAIS,KAAK;;oBAEA,CACf;SACA,GAAG,CAAC,MAAM,CAAiB,CAAC;IAE/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACjG,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;KACtC,CAAC,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC;YACT,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC;SACtC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,yCAAyC,CAAC,CAAC,CAAC;AAC7H,CAAC"}
@@ -1,29 +0,0 @@
1
- import { dirname, join } from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- import { spawn } from 'node:child_process';
4
- import { requireProOrExit } from '../license/manager.js';
5
- export async function runMcp(opts = {}) {
6
- await requireProOrExit('MCP server');
7
- const here = dirname(fileURLToPath(import.meta.url));
8
- const mcpEntry = join(here, '..', 'mcp', 'server.js');
9
- const env = { ...process.env };
10
- if (opts.allowWrites) {
11
- env.RECALL_MCP_ALLOW_WRITES = '1';
12
- }
13
- const child = spawn(process.execPath, [mcpEntry], {
14
- stdio: 'inherit',
15
- env,
16
- });
17
- return new Promise((resolve, reject) => {
18
- child.on('error', reject);
19
- child.on('exit', (code, signal) => {
20
- if (signal) {
21
- process.kill(process.pid, signal);
22
- return;
23
- }
24
- process.exitCode = code ?? 0;
25
- resolve();
26
- });
27
- });
28
- }
29
- //# sourceMappingURL=mcp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAWzD,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAsB,EAAE;IACnD,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAEtD,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,GAAG,CAAC,uBAAuB,GAAG,GAAG,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE;QAChD,KAAK,EAAE,SAAS;QAChB,GAAG;KACJ,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAChC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,28 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import { platform } from 'node:os';
3
- import { getRunningDaemon } from '../daemon/pidfile.js';
4
- import { runStart } from './start.js';
5
- import { c } from '../utils/format.js';
6
- function openUrl(url) {
7
- const cmd = platform() === 'darwin' ? 'open' : platform() === 'win32' ? 'start' : 'xdg-open';
8
- const args = platform() === 'win32' ? ['', url] : [url];
9
- const child = spawn(cmd, args, { detached: true, stdio: 'ignore', shell: platform() === 'win32' });
10
- child.unref();
11
- }
12
- export async function runOpen() {
13
- let info = getRunningDaemon();
14
- if (!info) {
15
- console.log(c.dim('daemon not running — starting it…'));
16
- await runStart();
17
- info = getRunningDaemon();
18
- if (!info) {
19
- console.error(c.err('could not start the daemon. run `recall start` manually and check logs.'));
20
- process.exitCode = 1;
21
- return;
22
- }
23
- }
24
- const url = `http://127.0.0.1:${info.port}`;
25
- console.log(`${c.ok('opening')} ${url}`);
26
- openUrl(url);
27
- }
28
- //# sourceMappingURL=open.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAEvC,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,GAAG,GAAG,QAAQ,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7F,MAAM,IAAI,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;IACnG,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,IAAI,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QACxD,MAAM,QAAQ,EAAE,CAAC;QACjB,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC,CAAC;YAChG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -1,154 +0,0 @@
1
- import { execSync } from 'node:child_process';
2
- import { randomUUID } from 'node:crypto';
3
- import readline from 'node:readline/promises';
4
- import { getDb } from '../db/client.js';
5
- import { scanForSecrets } from '../utils/secret-scanner.js';
6
- import { c, timeAgo } from '../utils/format.js';
7
- export async function runPaste(options) {
8
- if (options.list) {
9
- listPastes();
10
- return;
11
- }
12
- if (options.purge) {
13
- purgePaste(options.purge);
14
- return;
15
- }
16
- const content = await readContent();
17
- if (!content) {
18
- process.stderr.write(c.err('clipboard empty / nothing on stdin\n'));
19
- process.exit(1);
20
- }
21
- const secrets = scanForSecrets(content);
22
- if (secrets.length > 0 && !options.force) {
23
- process.stderr.write(c.warn(`⚠ detected ${secrets.length} possible secret${secrets.length === 1 ? '' : 's'} in content:\n`));
24
- for (const s of secrets.slice(0, 8)) {
25
- process.stderr.write(` ${c.err(s.pattern)} ${c.dim('→')} ${s.maskedPreview}\n`);
26
- }
27
- if (secrets.length > 8) {
28
- process.stderr.write(c.dim(` … ${secrets.length - 8} more\n`));
29
- }
30
- if (options.dryRun) {
31
- process.stderr.write(c.dim('\n(dry run — nothing archived)\n'));
32
- process.exit(1);
33
- }
34
- if (!process.stdin.isTTY && !process.stderr.isTTY) {
35
- process.stderr.write(c.err('refusing to archive secret content in non-interactive mode. use --force to override.\n'));
36
- // Still echo to stdout so the paste pipeline isn't broken.
37
- if (options.pipe)
38
- process.stdout.write(content);
39
- process.exit(1);
40
- }
41
- const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
42
- const answer = await rl.question(c.accent('archive anyway? [y/N] '));
43
- rl.close();
44
- if (answer.trim().toLowerCase() !== 'y') {
45
- process.stderr.write(c.dim('cancelled — nothing archived.\n'));
46
- if (options.pipe)
47
- process.stdout.write(content);
48
- process.exit(0);
49
- }
50
- }
51
- if (options.dryRun) {
52
- process.stderr.write(c.dim(`(dry run — would archive ${content.length.toLocaleString()} chars)\n`));
53
- if (options.pipe)
54
- process.stdout.write(content);
55
- process.exit(0);
56
- }
57
- const id = randomUUID();
58
- const now = new Date().toISOString();
59
- getDb()
60
- .prepare(`INSERT INTO paste_archives (id, created_at, content, size_bytes, source, label)
61
- VALUES (?, ?, ?, ?, ?, ?)`)
62
- .run(id, now, content, Buffer.byteLength(content, 'utf8'), options.pipe ? 'cli-piped' : 'cli', options.label ?? null);
63
- process.stderr.write(c.ok(`✓ archived ${content.length.toLocaleString()} chars as ${id.slice(0, 8)}\n`));
64
- if (options.label) {
65
- process.stderr.write(c.dim(` label: ${options.label}\n`));
66
- }
67
- process.stderr.write(c.dim(` purge any time with: recall paste --purge ${id.slice(0, 8)}\n`));
68
- if (options.pipe) {
69
- process.stdout.write(content);
70
- }
71
- }
72
- function listPastes() {
73
- const rows = getDb()
74
- .prepare(`SELECT id, created_at, size_bytes, source, label,
75
- substr(replace(replace(content, char(10), '↵'), char(13), ''), 1, 80) AS preview
76
- FROM paste_archives
77
- ORDER BY created_at DESC
78
- LIMIT 100`)
79
- .all();
80
- if (rows.length === 0) {
81
- process.stdout.write(c.dim('no pastes archived yet. use `pbpaste | recall paste` to archive.\n'));
82
- return;
83
- }
84
- process.stdout.write(`\n${c.bold(`${rows.length} archived paste${rows.length === 1 ? '' : 's'}`)}\n`);
85
- process.stdout.write(c.dim('─────────────────────\n'));
86
- for (const r of rows) {
87
- const size = r.size_bytes < 1024
88
- ? `${r.size_bytes}b`
89
- : r.size_bytes < 1024 * 1024
90
- ? `${(r.size_bytes / 1024).toFixed(1)}K`
91
- : `${(r.size_bytes / 1024 / 1024).toFixed(1)}M`;
92
- const label = r.label ? ` ${c.project(r.label)}` : '';
93
- process.stdout.write(` ${c.accent(r.id.slice(0, 8))} ${c.dim(timeAgo(r.created_at).padEnd(12))} ${size.padStart(6)}${label} ${c.dim(r.preview)}\n`);
94
- }
95
- process.stdout.write(c.dim(`\nshow full content: recall paste --show <id>\n`) +
96
- c.dim(`purge one (permanent): recall paste --purge <id>\n\n`));
97
- }
98
- function purgePaste(idOrPrefix) {
99
- // Guard against overly-broad prefixes. A single-character "%" expansion
100
- // could otherwise sweep across many rows; the ambiguity check below
101
- // already blocks multi-row deletion, but requiring 8 chars up front is
102
- // cheaper and matches the documented UX ("first 8 of the id").
103
- if (idOrPrefix.length < 8) {
104
- process.stderr.write(c.err('provide at least 8 characters of the paste id to purge.\n'));
105
- process.exit(1);
106
- }
107
- const db = getDb();
108
- const rows = db
109
- .prepare('SELECT id FROM paste_archives WHERE id = ? OR id LIKE ? LIMIT 2')
110
- .all(idOrPrefix, `${idOrPrefix}%`);
111
- if (rows.length === 0) {
112
- process.stderr.write(c.err(`no paste matches ${idOrPrefix}\n`));
113
- process.exit(1);
114
- }
115
- if (rows.length > 1) {
116
- process.stderr.write(c.err(`prefix ${idOrPrefix} is ambiguous. be more specific.\n`));
117
- process.exit(1);
118
- }
119
- db.prepare('DELETE FROM paste_archives WHERE id = ?').run(rows[0].id);
120
- process.stderr.write(c.ok(`✓ purged ${rows[0].id.slice(0, 8)} — content permanently destroyed\n`));
121
- }
122
- async function readContent() {
123
- if (!process.stdin.isTTY) {
124
- return await readStdin();
125
- }
126
- // Read from clipboard
127
- try {
128
- return execSync('pbpaste', { encoding: 'utf8', maxBuffer: 16 * 1024 * 1024 });
129
- }
130
- catch {
131
- /* fall through to xclip / powershell */
132
- }
133
- try {
134
- return execSync('xclip -o -selection clipboard', { encoding: 'utf8', maxBuffer: 16 * 1024 * 1024 });
135
- }
136
- catch {
137
- /* ignore */
138
- }
139
- try {
140
- return execSync('powershell.exe -command Get-Clipboard', { encoding: 'utf8', maxBuffer: 16 * 1024 * 1024 });
141
- }
142
- catch {
143
- /* ignore */
144
- }
145
- throw new Error('Could not read clipboard. On macOS pbpaste should be built in; on Linux install xclip; on Windows pipe into this command instead.');
146
- }
147
- async function readStdin() {
148
- const chunks = [];
149
- for await (const chunk of process.stdin) {
150
- chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
151
- }
152
- return Buffer.concat(chunks).toString('utf8');
153
- }
154
- //# sourceMappingURL=paste.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"paste.js","sourceRoot":"","sources":["../../src/commands/paste.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- import Table from 'cli-table3';
2
- import { getDb } from '../db/client.js';
3
- import { c, timeAgo, truncate } from '../utils/format.js';
4
- export function runProjects() {
5
- const db = getDb();
6
- const rows = db
7
- .prepare(`SELECT p.name,
8
- p.decoded_path,
9
- COUNT(s.id) AS session_count,
10
- COALESCE(SUM(s.message_count), 0) AS message_count,
11
- MAX(s.started_at) AS latest
12
- FROM projects p
13
- LEFT JOIN sessions s ON s.project_id = p.id
14
- GROUP BY p.id
15
- ORDER BY MAX(COALESCE(s.started_at, '')) DESC`)
16
- .all();
17
- if (rows.length === 0) {
18
- console.log(c.dim('no projects indexed yet.'));
19
- return;
20
- }
21
- const table = new Table({
22
- head: [c.bold('project'), c.bold('sessions'), c.bold('msgs'), c.bold('latest'), c.bold('path')],
23
- style: { head: [], border: ['grey'] },
24
- });
25
- for (const r of rows) {
26
- table.push([
27
- c.project(truncate(r.name, 30)),
28
- String(r.session_count),
29
- String(r.message_count),
30
- c.dim(timeAgo(r.latest)),
31
- c.dim(truncate(r.decoded_path, 50)),
32
- ]);
33
- }
34
- console.log(table.toString());
35
- }
36
- //# sourceMappingURL=projects.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAU1D,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;qDAQ+C,CAChD;SACA,GAAG,EAAkB,CAAC;IAEzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/F,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;KACtC,CAAC,CAAC;IACH,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC;YACT,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;YACvB,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC;YACvB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChC,CAAC"}
@@ -1,67 +0,0 @@
1
- import { getDb } from '../db/client.js';
2
- import { c, highlight, shortId, timeAgo, truncate } from '../utils/format.js';
3
- import { requireProOrExit } from '../license/manager.js';
4
- function sanitizeFtsQuery(query) {
5
- // Wrap each term in quotes for safety; join with AND semantics.
6
- const terms = query
7
- .split(/\s+/)
8
- .filter(Boolean)
9
- .map((t) => t.replace(/"/g, ''))
10
- .filter((t) => t.length > 0);
11
- if (terms.length === 0)
12
- return '';
13
- return terms.map((t) => `"${t}"`).join(' ');
14
- }
15
- export async function runSearch(query, options) {
16
- await requireProOrExit('Full-text search');
17
- const db = getDb();
18
- const ftsQuery = sanitizeFtsQuery(query);
19
- if (!ftsQuery) {
20
- console.log(c.dim('empty query'));
21
- return;
22
- }
23
- const limit = Math.max(1, Math.min(200, parseInt(options.limit ?? '20', 10) || 20));
24
- const params = { q: ftsQuery, limit };
25
- let projectFilter = '';
26
- if (options.project) {
27
- projectFilter = ' AND (p.name LIKE @proj OR p.decoded_path LIKE @proj) ';
28
- params.proj = `%${options.project}%`;
29
- }
30
- const rows = db
31
- .prepare(`SELECT m.session_id AS session_id,
32
- p.name AS project_name,
33
- s.started_at AS started_at,
34
- snippet(messages_fts, 0, '<<', '>>', '…', 16) AS snippet,
35
- m.role AS role,
36
- m.timestamp AS timestamp
37
- FROM messages_fts
38
- JOIN messages m ON m.rowid = messages_fts.rowid
39
- JOIN sessions s ON s.id = m.session_id
40
- JOIN projects p ON p.id = s.project_id
41
- WHERE messages_fts MATCH @q
42
- ${projectFilter}
43
- ORDER BY bm25(messages_fts)
44
- LIMIT @limit`)
45
- .all(params);
46
- if (rows.length === 0) {
47
- console.log(c.dim(`no matches for "${query}"`));
48
- return;
49
- }
50
- console.log(c.dim(`${rows.length} match${rows.length === 1 ? '' : 'es'} for "${query}"`));
51
- console.log('');
52
- for (const hit of rows) {
53
- const snippet = hit.snippet
54
- .replace(/<<([\s\S]*?)>>/g, (_, s) => highlight(s, s).replace(/\n/g, ' '))
55
- .replace(/\n/g, ' ');
56
- const roleTag = hit.role === 'user'
57
- ? c.user('user')
58
- : hit.role === 'assistant'
59
- ? c.assistant('asst')
60
- : c.dim('----');
61
- console.log(`${c.accent(shortId(hit.session_id))} ${c.project(truncate(hit.project_name, 20))} ${c.dim(timeAgo(hit.started_at))} ${roleTag}`);
62
- console.log(` ${truncate(snippet, 200)}`);
63
- console.log('');
64
- }
65
- console.log(c.dim('`recall show <id>` to read any session.'));
66
- }
67
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAgBzD,SAAS,gBAAgB,CAAC,KAAa;IACrC,gEAAgE;IAChE,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,OAAsB;IACnE,MAAM,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEpF,MAAM,MAAM,GAA4B,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC/D,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,aAAa,GAAG,wDAAwD,CAAC;QACzE,MAAM,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC;IACvC,CAAC;IAED,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;WAWK,aAAa;;oBAEJ,CACf;SACA,GAAG,CAAC,MAAM,CAAU,CAAC;IAExB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;aACxB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAC3C,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACpC;aACA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvB,MAAM,OAAO,GACX,GAAG,CAAC,IAAI,KAAK,MAAM;YACjB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAChB,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW;gBACxB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gBACrB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,OAAO,EAAE,CACpI,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;AAChE,CAAC"}