@clauderecallhq/cli 0.65.6 → 0.65.9

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.
package/README.md CHANGED
@@ -157,10 +157,7 @@ recall stats --project Tools --days 7
157
157
 
158
158
  <div align="center">
159
159
 
160
- <video autoplay loop muted playsinline width="540">
161
- <source src="https://cdn.clauderecall.com/marketing/cost-analytics.mp4?v=hd3" type="video/mp4">
162
- <img src="https://cdn.clauderecall.com/marketing/cost-analytics.gif?v=hd3" alt="Cost analytics dashboard — daily spend bars, top sessions ranked by cost, primary model breakdown" width="540">
163
- </video>
160
+ <img src="https://cdn.clauderecall.com/marketing/cost-analytics.gif?v=hd3" alt="Cost analytics dashboard — daily spend bars, top sessions ranked by cost, primary model breakdown" width="540">
164
161
 
165
162
  <sub>Hover any day. Exact cost. Exact tokens.</sub>
166
163
 
@@ -190,10 +187,7 @@ recall mcp --allow-writes
190
187
 
191
188
  <div align="center">
192
189
 
193
- <video autoplay loop muted playsinline width="900">
194
- <source src="https://cdn.clauderecall.com/marketing/mcp-server-demo.mp4?v=hd3" type="video/mp4">
195
- <img src="https://cdn.clauderecall.com/marketing/mcp-server-demo.gif?v=hd3" alt="Claude calling Recall as native MCP tools — search and get_session executing live" width="900">
196
- </video>
190
+ <img src="https://cdn.clauderecall.com/marketing/mcp-server-demo.gif?v=hd3" alt="Claude calling Recall as native MCP tools — search and get_session executing live" width="900">
197
191
 
198
192
  <sub>Claude searches your history, pulls context, and decides — no copy-paste.</sub>
199
193
 
@@ -205,10 +199,7 @@ Hand-curated hierarchical collections that cut across projects. Flat tags. Markd
205
199
 
206
200
  <div align="center">
207
201
 
208
- <video autoplay loop muted playsinline width="540">
209
- <source src="https://cdn.clauderecall.com/marketing/collections.mp4?v=hd3" type="video/mp4">
210
- <img src="https://cdn.clauderecall.com/marketing/collections.gif?v=hd3" alt="Collections panel — Auth System, Database Migrations, React Refactor, API Design, Deployment Issues; drag a session card into a collection" width="540">
211
- </video>
202
+ <img src="https://cdn.clauderecall.com/marketing/collections.gif?v=hd3" alt="Collections panel Auth System, Database Migrations, React Refactor, API Design, Deployment Issues; drag a session card into a collection" width="540">
212
203
 
213
204
  <sub>Drag-to-organize. Collections cut across projects.</sub>
214
205
 
@@ -220,10 +211,7 @@ Dark-mode three-pane layout. **Virtualized transcript** (10,000-message sessions
220
211
 
221
212
  <div align="center">
222
213
 
223
- <video autoplay loop muted playsinline width="900">
224
- <source src="https://cdn.clauderecall.com/marketing/tui-demo.mp4?v=hd3" type="video/mp4">
225
- <img src="https://cdn.clauderecall.com/marketing/tui-demo.gif?v=hd3" alt="Full-screen terminal UI — sessions list with live preview pane, slash-to-filter" width="900">
226
- </video>
214
+ <img src="https://cdn.clauderecall.com/marketing/tui-demo.gif?v=hd3" alt="Full-screen terminal UI — sessions list with live preview pane, slash-to-filter" width="900">
227
215
 
228
216
  <sub>Or stay in the terminal. <code>recall tui</code> ships the same library as a full-screen terminal app — slash to filter, arrow keys to navigate, live preview.</sub>
229
217
 
@@ -283,10 +271,7 @@ recall install-extension
283
271
 
284
272
  <div align="center">
285
273
 
286
- <video autoplay loop muted playsinline width="900">
287
- <source src="https://cdn.clauderecall.com/marketing/vs-obsidian.mp4?v=hd3" type="video/mp4">
288
- <img src="https://cdn.clauderecall.com/marketing/vs-obsidian.gif?v=hd3" alt="Side-by-side: Obsidian vault on the left, Claude Recall TUI on the right showing 247 sessions across 8 projects with live preview" width="900">
289
- </video>
274
+ <img src="https://cdn.clauderecall.com/marketing/vs-obsidian.gif?v=hd3" alt="Side-by-side: Obsidian vault on the left, Claude Recall TUI on the right showing 247 sessions across 8 projects with live preview" width="900">
290
275
 
291
276
  <sub>People sometimes ask if this is "Obsidian for Claude Code." It is not. A general note-taking app cannot watch your filesystem for new sessions, index JSONLs into FTS5 + vector search, expose those sessions as MCP tools, or pipe a session back into Claude with one command. Claude Recall is built specifically for the loop you actually run.</sub>
292
277
 
package/dist/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env -S node --disable-warning=ExperimentalWarning
1
+ #!/usr/bin/env node
2
2
  /* Claude Recall (proprietary). See LICENSE for terms. */
3
3
  var Vu=Object.defineProperty;var N=(e,t)=>()=>(e&&(t=e(e=0)),t);var fe=(e,t)=>{for(var s in t)Vu(e,s,{get:t[s],enumerable:!0})};import{DatabaseSync as Zu}from"node:sqlite";var Qu,_n,hn,rs,En=N(()=>{"use strict";{let e=process.emit.bind(process);process.emit=function(t,...s){let n=s[0];return t==="warning"&&n instanceof Error&&n.name==="ExperimentalWarning"&&/SQLite/i.test(n.message)?!1:e(t,...s)}}Qu={DatabaseSync:Zu},_n=class{inner;constructor(t){this.inner=t}get(...t){return t.length===0?this.inner.get():this.inner.get(...t)}all(...t){return t.length===0?this.inner.all():this.inner.all(...t)}run(...t){let s=t.length===0?this.inner.run():this.inner.run(...t);return{changes:s.changes,lastInsertRowid:s.lastInsertRowid}}iterate(...t){return t.length===0?this.inner.iterate():this.inner.iterate(...t)}},hn=class{inner;extensionLoadingEnabled=!1;txDepth=0;constructor(t,s={}){this.inner=new Qu.DatabaseSync(t,{readOnly:s.readonly??!1,allowExtension:!0})}prepare(t){return new _n(this.inner.prepare(t))}exec(t){this.inner.exec(t)}close(){this.inner.close()}pragma(t,s={}){if(t.includes("=")){this.inner.exec(`PRAGMA ${t}`);return}if(s.simple){let n=this.inner.prepare(`PRAGMA ${t}`).get();return n&&typeof n=="object"?Object.values(n)[0]:void 0}return this.inner.prepare(`PRAGMA ${t}`).all()}transaction(t){return((...n)=>{this.txDepth===0?this.inner.exec("BEGIN"):this.inner.exec(`SAVEPOINT sp_${this.txDepth}`),this.txDepth+=1;try{let r=t(...n);return this.txDepth-=1,this.txDepth===0?this.inner.exec("COMMIT"):this.inner.exec(`RELEASE sp_${this.txDepth}`),r}catch(r){this.txDepth-=1;try{this.txDepth===0?this.inner.exec("ROLLBACK"):(this.inner.exec(`ROLLBACK TO sp_${this.txDepth}`),this.inner.exec(`RELEASE sp_${this.txDepth}`))}catch{}throw r}})}loadExtension(t,s){this.extensionLoadingEnabled||(this.inner.enableLoadExtension(!0),this.extensionLoadingEnabled=!0),s===void 0?this.inner.loadExtension(t):this.inner.loadExtension(t,s)}},rs=hn});import{homedir as ko}from"node:os";import{join as Mt,basename as ep}from"node:path";import{existsSync as No,mkdirSync as tp,chmodSync as sp,readdirSync as Ro,statSync as np}from"node:fs";function P(){No(x)||tp(x,{recursive:!0,mode:448}),process.platform!=="win32"&&sp(x,448)}function Sn(e){return e.replace(/^-/,"/").replace(/-/g,"/")}function Co(e){let t=Sn(e);return ep(t)||t}function Lo(){if(!No(bn))return[];let e=[],t=Ro(bn,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name);for(let s of t){let n=Mt(bn,s),r=Ro(n,{withFileTypes:!0});for(let o of r){if(!o.isFile()||!o.name.endsWith(".jsonl"))continue;let i=Mt(n,o.name),a=np(i);e.push({sessionFile:i,encodedProject:s,mtime:a.mtimeMs,size:a.size})}}return e}var bn,x,te,j=N(()=>{"use strict";bn=Mt(ko(),".claude","projects"),x=process.env.RECALL_HOME?process.env.RECALL_HOME:Mt(ko(),".recall"),te=Mt(x,"db.sqlite")});function Ao(e){let t=e.prepare("PRAGMA table_info(sessions)").all(),s=new Set(t.map(f=>f.name)),n=[["total_input_tokens","INTEGER"],["total_output_tokens","INTEGER"],["total_cache_create_tokens","INTEGER"],["total_cache_read_tokens","INTEGER"],["primary_model","TEXT"],["auto_title","TEXT"],["auto_title_source","TEXT"],["auto_title_generated_at","INTEGER"],["auto_title_history","TEXT"],["verification_status","TEXT"],["verification_computed_at","INTEGER"],["title_quality","TEXT"],["title_quality_computed_at","INTEGER"]];for(let[f,g]of n)s.has(f)||e.exec(`ALTER TABLE sessions ADD COLUMN ${f} ${g}`);let r=e.prepare("PRAGMA table_info(collection_sessions)").all(),o=new Set(r.map(f=>f.name)),i=[["source","TEXT NOT NULL DEFAULT 'manual'"],["rule_id","TEXT"]];for(let[f,g]of i)o.has(f)||e.exec(`ALTER TABLE collection_sessions ADD COLUMN ${f} ${g}`);let a=e.prepare("PRAGMA table_info(session_notes)").all(),l=new Set(a.map(f=>f.name)),c=[["auto_synopsis","TEXT"],["auto_synopsis_generated_at","INTEGER"],["auto_synopsis_history","TEXT"]];for(let[f,g]of c)l.has(f)||e.exec(`ALTER TABLE session_notes ADD COLUMN ${f} ${g}`);let u=e.prepare("PRAGMA table_info(threads)").all();new Set(u.map(f=>f.name)).has("folder_id")||(e.exec("ALTER TABLE threads ADD COLUMN folder_id TEXT REFERENCES thread_folders(id) ON DELETE SET NULL"),e.exec("CREATE INDEX IF NOT EXISTS idx_threads_folder ON threads(folder_id)"));let p=e.prepare("PRAGMA table_info(thread_folders)").all(),m=new Set(p.map(f=>f.name));m.has("project_scope")||(e.exec("ALTER TABLE thread_folders ADD COLUMN project_scope TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_thread_folders_project ON thread_folders(project_scope)")),m.has("sort_order")||e.exec("ALTER TABLE thread_folders ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0"),e.exec(`
4
4
  CREATE TABLE IF NOT EXISTS message_embeddings (
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env -S node --disable-warning=ExperimentalWarning
1
+ #!/usr/bin/env node
2
2
  /* Claude Recall (proprietary). See LICENSE for terms. */
3
3
  var Bu=Object.defineProperty;var be=(e,t)=>()=>(e&&(t=e(e=0)),t);var vo=(e,t)=>{for(var s in t)Bu(e,s,{get:t[s],enumerable:!0})};import{homedir as jo}from"node:os";import{join as Tn,basename as OT}from"node:path";import{existsSync as Hu,mkdirSync as Wu,chmodSync as qu,readdirSync as CT,statSync as IT}from"node:fs";function J(){Hu($)||Wu($,{recursive:!0,mode:448}),process.platform!=="win32"&&qu($,448)}var Mo,$,yn,Z=be(()=>{"use strict";Mo=Tn(jo(),".claude","projects"),$=process.env.RECALL_HOME?process.env.RECALL_HOME:Tn(jo(),".recall"),yn=Tn($,"db.sqlite")});import{DatabaseSync as gp}from"node:sqlite";var _p,kn,An,Yo,Ko=be(()=>{"use strict";{let e=process.emit.bind(process);process.emit=function(t,...s){let n=s[0];return t==="warning"&&n instanceof Error&&n.name==="ExperimentalWarning"&&/SQLite/i.test(n.message)?!1:e(t,...s)}}_p={DatabaseSync:gp},kn=class{inner;constructor(t){this.inner=t}get(...t){return t.length===0?this.inner.get():this.inner.get(...t)}all(...t){return t.length===0?this.inner.all():this.inner.all(...t)}run(...t){let s=t.length===0?this.inner.run():this.inner.run(...t);return{changes:s.changes,lastInsertRowid:s.lastInsertRowid}}iterate(...t){return t.length===0?this.inner.iterate():this.inner.iterate(...t)}},An=class{inner;extensionLoadingEnabled=!1;txDepth=0;constructor(t,s={}){this.inner=new _p.DatabaseSync(t,{readOnly:s.readonly??!1,allowExtension:!0})}prepare(t){return new kn(this.inner.prepare(t))}exec(t){this.inner.exec(t)}close(){this.inner.close()}pragma(t,s={}){if(t.includes("=")){this.inner.exec(`PRAGMA ${t}`);return}if(s.simple){let n=this.inner.prepare(`PRAGMA ${t}`).get();return n&&typeof n=="object"?Object.values(n)[0]:void 0}return this.inner.prepare(`PRAGMA ${t}`).all()}transaction(t){return((...n)=>{this.txDepth===0?this.inner.exec("BEGIN"):this.inner.exec(`SAVEPOINT sp_${this.txDepth}`),this.txDepth+=1;try{let r=t(...n);return this.txDepth-=1,this.txDepth===0?this.inner.exec("COMMIT"):this.inner.exec(`RELEASE sp_${this.txDepth}`),r}catch(r){this.txDepth-=1;try{this.txDepth===0?this.inner.exec("ROLLBACK"):(this.inner.exec(`ROLLBACK TO sp_${this.txDepth}`),this.inner.exec(`RELEASE sp_${this.txDepth}`))}catch{}throw r}})}loadExtension(t,s){this.extensionLoadingEnabled||(this.inner.enableLoadExtension(!0),this.extensionLoadingEnabled=!0),s===void 0?this.inner.loadExtension(t):this.inner.loadExtension(t,s)}},Yo=An});function Vo(e){let t=e.prepare("PRAGMA table_info(sessions)").all(),s=new Set(t.map(S=>S.name)),n=[["total_input_tokens","INTEGER"],["total_output_tokens","INTEGER"],["total_cache_create_tokens","INTEGER"],["total_cache_read_tokens","INTEGER"],["primary_model","TEXT"],["auto_title","TEXT"],["auto_title_source","TEXT"],["auto_title_generated_at","INTEGER"],["auto_title_history","TEXT"],["verification_status","TEXT"],["verification_computed_at","INTEGER"],["title_quality","TEXT"],["title_quality_computed_at","INTEGER"]];for(let[S,y]of n)s.has(S)||e.exec(`ALTER TABLE sessions ADD COLUMN ${S} ${y}`);let r=e.prepare("PRAGMA table_info(collection_sessions)").all(),o=new Set(r.map(S=>S.name)),a=[["source","TEXT NOT NULL DEFAULT 'manual'"],["rule_id","TEXT"]];for(let[S,y]of a)o.has(S)||e.exec(`ALTER TABLE collection_sessions ADD COLUMN ${S} ${y}`);let c=e.prepare("PRAGMA table_info(session_notes)").all(),d=new Set(c.map(S=>S.name)),u=[["auto_synopsis","TEXT"],["auto_synopsis_generated_at","INTEGER"],["auto_synopsis_history","TEXT"]];for(let[S,y]of u)d.has(S)||e.exec(`ALTER TABLE session_notes ADD COLUMN ${S} ${y}`);let g=e.prepare("PRAGMA table_info(threads)").all();new Set(g.map(S=>S.name)).has("folder_id")||(e.exec("ALTER TABLE threads ADD COLUMN folder_id TEXT REFERENCES thread_folders(id) ON DELETE SET NULL"),e.exec("CREATE INDEX IF NOT EXISTS idx_threads_folder ON threads(folder_id)"));let h=e.prepare("PRAGMA table_info(thread_folders)").all(),b=new Set(h.map(S=>S.name));b.has("project_scope")||(e.exec("ALTER TABLE thread_folders ADD COLUMN project_scope TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_thread_folders_project ON thread_folders(project_scope)")),b.has("sort_order")||e.exec("ALTER TABLE thread_folders ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0"),e.exec(`
4
4
  CREATE TABLE IF NOT EXISTS message_embeddings (
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env -S node --disable-warning=ExperimentalWarning
1
+ #!/usr/bin/env node
2
2
  /* Claude Recall (proprietary). See LICENSE for terms. */
3
3
  var En=Object.defineProperty;var j=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ie=(e,t)=>{for(var s in t)En(e,s,{get:t[s],enumerable:!0})};import{DatabaseSync as Tn}from"node:sqlite";var Sn,xe,ve,at,ct=j(()=>{"use strict";{let e=process.emit.bind(process);process.emit=function(t,...s){let n=s[0];return t==="warning"&&n instanceof Error&&n.name==="ExperimentalWarning"&&/SQLite/i.test(n.message)?!1:e(t,...s)}}Sn={DatabaseSync:Tn},xe=class{inner;constructor(t){this.inner=t}get(...t){return t.length===0?this.inner.get():this.inner.get(...t)}all(...t){return t.length===0?this.inner.all():this.inner.all(...t)}run(...t){let s=t.length===0?this.inner.run():this.inner.run(...t);return{changes:s.changes,lastInsertRowid:s.lastInsertRowid}}iterate(...t){return t.length===0?this.inner.iterate():this.inner.iterate(...t)}},ve=class{inner;extensionLoadingEnabled=!1;txDepth=0;constructor(t,s={}){this.inner=new Sn.DatabaseSync(t,{readOnly:s.readonly??!1,allowExtension:!0})}prepare(t){return new xe(this.inner.prepare(t))}exec(t){this.inner.exec(t)}close(){this.inner.close()}pragma(t,s={}){if(t.includes("=")){this.inner.exec(`PRAGMA ${t}`);return}if(s.simple){let n=this.inner.prepare(`PRAGMA ${t}`).get();return n&&typeof n=="object"?Object.values(n)[0]:void 0}return this.inner.prepare(`PRAGMA ${t}`).all()}transaction(t){return((...n)=>{this.txDepth===0?this.inner.exec("BEGIN"):this.inner.exec(`SAVEPOINT sp_${this.txDepth}`),this.txDepth+=1;try{let i=t(...n);return this.txDepth-=1,this.txDepth===0?this.inner.exec("COMMIT"):this.inner.exec(`RELEASE sp_${this.txDepth}`),i}catch(i){this.txDepth-=1;try{this.txDepth===0?this.inner.exec("ROLLBACK"):(this.inner.exec(`ROLLBACK TO sp_${this.txDepth}`),this.inner.exec(`RELEASE sp_${this.txDepth}`))}catch{}throw i}})}loadExtension(t,s){this.extensionLoadingEnabled||(this.inner.enableLoadExtension(!0),this.extensionLoadingEnabled=!0),s===void 0?this.inner.loadExtension(t):this.inner.loadExtension(t,s)}},at=ve});import{homedir as lt}from"node:os";import{join as Ce,basename as Ho}from"node:path";import{existsSync as bn,mkdirSync as Rn,chmodSync as yn,readdirSync as Wo,statSync as Yo}from"node:fs";function x(){bn(S)||Rn(S,{recursive:!0,mode:448}),process.platform!=="win32"&&yn(S,448)}var Go,S,oe,F=j(()=>{"use strict";Go=Ce(lt(),".claude","projects"),S=process.env.RECALL_HOME?process.env.RECALL_HOME:Ce(lt(),".recall"),oe=Ce(S,"db.sqlite")});function ut(e){let t=e.prepare("PRAGMA table_info(sessions)").all(),s=new Set(t.map(g=>g.name)),n=[["total_input_tokens","INTEGER"],["total_output_tokens","INTEGER"],["total_cache_create_tokens","INTEGER"],["total_cache_read_tokens","INTEGER"],["primary_model","TEXT"],["auto_title","TEXT"],["auto_title_source","TEXT"],["auto_title_generated_at","INTEGER"],["auto_title_history","TEXT"],["verification_status","TEXT"],["verification_computed_at","INTEGER"],["title_quality","TEXT"],["title_quality_computed_at","INTEGER"]];for(let[g,_]of n)s.has(g)||e.exec(`ALTER TABLE sessions ADD COLUMN ${g} ${_}`);let i=e.prepare("PRAGMA table_info(collection_sessions)").all(),r=new Set(i.map(g=>g.name)),a=[["source","TEXT NOT NULL DEFAULT 'manual'"],["rule_id","TEXT"]];for(let[g,_]of a)r.has(g)||e.exec(`ALTER TABLE collection_sessions ADD COLUMN ${g} ${_}`);let o=e.prepare("PRAGMA table_info(session_notes)").all(),c=new Set(o.map(g=>g.name)),l=[["auto_synopsis","TEXT"],["auto_synopsis_generated_at","INTEGER"],["auto_synopsis_history","TEXT"]];for(let[g,_]of l)c.has(g)||e.exec(`ALTER TABLE session_notes ADD COLUMN ${g} ${_}`);let d=e.prepare("PRAGMA table_info(threads)").all();new Set(d.map(g=>g.name)).has("folder_id")||(e.exec("ALTER TABLE threads ADD COLUMN folder_id TEXT REFERENCES thread_folders(id) ON DELETE SET NULL"),e.exec("CREATE INDEX IF NOT EXISTS idx_threads_folder ON threads(folder_id)"));let u=e.prepare("PRAGMA table_info(thread_folders)").all(),m=new Set(u.map(g=>g.name));m.has("project_scope")||(e.exec("ALTER TABLE thread_folders ADD COLUMN project_scope TEXT"),e.exec("CREATE INDEX IF NOT EXISTS idx_thread_folders_project ON thread_folders(project_scope)")),m.has("sort_order")||e.exec("ALTER TABLE thread_folders ADD COLUMN sort_order INTEGER NOT NULL DEFAULT 0"),e.exec(`
4
4
  CREATE TABLE IF NOT EXISTS message_embeddings (
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clauderecallhq/cli",
3
- "version": "0.65.6",
3
+ "version": "0.65.9",
4
4
  "description": "Never lose a Claude Code session again. Local, fast, searchable memory over every session you've ever run.",
5
5
  "type": "module",
6
6
  "homepage": "https://clauderecall.com",