@clauderecallhq/cli 0.77.0 → 0.77.1
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/dist/cli.js +1 -1
- package/package.json +9 -9
package/dist/cli.js
CHANGED
|
@@ -710,7 +710,7 @@ ${t.message}
|
|
|
710
710
|
`)}var pN,mN,gN,fN,Va=N(()=>{"use strict";pN={project:Re.string().optional().describe("Exact project name match (optional)."),collectionId:Re.string().optional().describe("Restrict to sessions in this collection (optional)."),sessionId:Re.string().optional().describe("Full session UUID to tag just one session (optional)."),untaggedOnly:Re.boolean().optional().describe("Skip sessions that already have any tag (default: true)."),limit:Re.number().int().min(1).max(500).optional().describe("Max sessions to process (default: 100)."),minTags:Re.number().int().min(1).max(10).optional().describe("Minimum tags per session (default: 2)."),maxTags:Re.number().int().min(1).max(10).optional().describe("Maximum tags per session (default: 4).")};mN={sessionId:Re.string().describe("Session UUID (or 8+-char prefix) to summarize."),mode:Re.enum(["brief","detailed"]).optional().describe("brief = 3-5 bullets; detailed = paragraph + bullets. Default: brief.")},gN={sessionId:Re.string().describe("Session UUID (or 8+-char prefix) to extract decisions from.")},fN={sessionId:Re.string().describe("Session UUID (or 8+-char prefix) to find similar sessions to."),limit:Re.number().int().min(1).max(20).optional().describe("How many similar sessions to surface (default: 5).")}});function Za(e,t){let s=O_.get(e);if(!(!s||s.size===0))for(let n of s)try{n(t)}catch{}}var O_,Qa=N(()=>{"use strict";O_=new Map});import{existsSync as v_,statSync as I_}from"node:fs";import{delimiter as M_,join as D_}from"node:path";function ec(e){if(e.includes("/")||e.includes("\\")||e.includes(".."))return null;let t=(process.env.PATH??"").split(M_).filter(Boolean),s=process.platform==="win32"?[e,`${e}.exe`,`${e}.cmd`,`${e}.bat`]:[e];for(let n of t)for(let r of s){let o=D_(n,r);try{if(v_(o)&&I_(o).isFile())return o}catch{}}return null}function tc(e){if(process.platform!=="win32"||!e)return!1;let t=e.toLowerCase();return t.endsWith(".cmd")||t.endsWith(".bat")}var sc=N(()=>{"use strict"});var Us={};he(Us,{_resetClaudePathCacheForTests:()=>j_,buildScanPrompt:()=>rc,isClaudeCliAvailable:()=>ne,runClaudeCliScan:()=>X_,spawnClaudePrompt:()=>bt});import{spawn as $_}from"node:child_process";function nc(){if(Dt!==void 0&&ts!==void 0)return{path:Dt,available:ts};let e=ec("claude");return Dt=e??"claude",ts=e!==null,{path:Dt,available:ts}}function F_(){return nc().path}function ne(){return nc().available}function j_(){Dt=void 0,ts=void 0}function rc(e){return Ka({project:e.project,collectionId:e.collectionId,sessionId:e.sessionIds&&e.sessionIds.length===1?e.sessionIds[0]:void 0,untaggedOnly:e.untaggedOnly,limit:e.limit})}function U_(e,t){let s=t.get(e);return s||e.slice(0,8)}function B_(e){try{return za(e).map(s=>({id:s.id,label:s.alias&&s.alias.trim().length>0?s.alias:s.first_user_message&&s.first_user_message.trim().length>0?s.first_user_message.slice(0,60):s.id.slice(0,8)}))}catch{return[]}}function H_(e){let{scanId:t,total:s,labelTable:n}=e,r=new Set;return o=>{let i=o.trim();if(!i.startsWith("{"))return;let a;try{a=JSON.parse(i)}catch{return}if(!a||typeof a!="object")return;let d=a;if(!(d.type!=="assistant"||!d.message?.content))for(let l of d.message.content){if(l?.type!=="tool_use"||l.name!=="mcp__recall__apply_tags")continue;let u=l.input,p=typeof u?.sessionId=="string"?u.sessionId:null;!p||r.has(p)||(r.add(p),Za(t,{type:"progress",current:r.size,total:s,sessionId:p,sessionLabel:U_(p,n)}))}}}function W_(e){let t="";return s=>{t+=s.toString("utf8");let n=t.indexOf(`
|
|
711
711
|
`);for(;n!==-1;){let r=t.slice(0,n);t=t.slice(n+1),r.length>0&&e(r),n=t.indexOf(`
|
|
712
712
|
`)}}}async function X_(e,t={},s){let n=!!t.scanId,r=n?B_(e):[],o=new Map(r.map(d=>[d.id,d.label])),i=r.length,a;return n&&t.scanId&&(a=H_({scanId:t.scanId,total:i,labelTable:o})),oc({prompt:rc(e),allowedTools:P_.split(","),opts:t,onProgress:s,onStdoutLine:a,outputFormat:n?"stream-json":"json"})}async function bt(e,t,s={},n){return oc({prompt:e,allowedTools:t,opts:s,onProgress:n,outputFormat:"json"})}function oc(e){let{prompt:t,allowedTools:s,opts:n,onProgress:r,onStdoutLine:o,outputFormat:i}=e,a=["-p",t,"--output-format",i,"--allowedTools",s.join(","),"--permission-mode","bypassPermissions","--no-session-persistence"];return i==="stream-json"&&a.push("--verbose"),n.model&&a.push("--model",n.model),new Promise(d=>{let l=F_(),u=$_(l,a,{stdio:["ignore","pipe","pipe"],shell:tc(l)||process.platform==="win32"&&Dt==="claude"}),p=[],m=[],g=o?W_(o):void 0;u.stdout.on("data",h=>{p.push(h),g&&g(h)}),u.stderr.on("data",h=>{if(m.push(h),r){let E=h.toString("utf8").trim();E&&r(E)}});let f=setTimeout(()=>{u.kill("SIGKILL")},1800*1e3);u.on("close",h=>{clearTimeout(f),d({success:h===0,stdout:Buffer.concat(p).toString("utf8"),stderr:Buffer.concat(m).toString("utf8"),exitCode:h})}),u.on("error",h=>{clearTimeout(f),d({success:!1,stdout:"",stderr:String(h),exitCode:null})})})}var P_,Dt,ts,Be=N(()=>{"use strict";qa();Va();Qa();sc();P_=["mcp__recall__list_tags","mcp__recall__list_sessions_to_tag","mcp__recall__apply_tags"].join(",")});var dc={};he(dc,{downloadModel:()=>Or,getModelDir:()=>Xs,isModelInstalled:()=>St,uninstallModel:()=>vr});import{existsSync as Ar,mkdirSync as cc,rmSync as Nr,createWriteStream as lh,statSync as dh}from"node:fs";import{join as Ws}from"node:path";import{createHash as uh}from"node:crypto";import{readFile as ph}from"node:fs/promises";function Xs(){return Ws(x,"models","BAAI","bge-base-en-v1.5")}function St(){let e=Xs();return lc.every(t=>Ar(Ws(e,t.path)))}async function Or(e){let t=Xs();cc(t,{recursive:!0}),cc(Ws(t,"onnx"),{recursive:!0});for(let s of lc){let n=Ws(t,s.path),r=mh+s.path,o=0;Ar(n)&&(o=dh(n).size);let i={};o>0&&(i.Range=`bytes=${o}-`);let a=await fetch(r,{headers:i});if(!a.ok&&a.status!==206)throw new Error(`Failed to download ${s.path}: HTTP ${a.status}`);let d=a.headers.get("content-length"),l=d?o+Number(d):0,u=a.body;if(!u)throw new Error(`No response body for ${s.path}`);let p=lh(n,{flags:o>0?"a":"w"}),m=u.getReader(),g=o;for(;;){let{done:E,value:b}=await m.read();if(E)break;p.write(Buffer.from(b)),g+=b.byteLength,e?.(s.path,g,l)}if(p.end(),await new Promise((E,b)=>{p.on("finish",E),p.on("error",b)}),s.sha256==="TODO_PLACEHOLDER")throw Nr(n),new Error(`Refusing to install: SHA-256 not pinned for ${s.path}. Update model-download.ts.`);let f=await ph(n);if(uh("sha256").update(f).digest("hex")!==s.sha256)throw Nr(n),new Error(`SHA-256 mismatch for ${s.path}`)}}function vr(){let e=Xs();Ar(e)&&Nr(e,{recursive:!0,force:!0})}var mh,lc,Js=N(()=>{"use strict";P();mh="https://huggingface.co/BAAI/bge-base-en-v1.5/resolve/main/",lc=[{path:"config.json",sha256:"bc00af31a4a31b74040d73370aa83b62da34c90b75eb77bfa7db039d90abd591"},{path:"tokenizer.json",sha256:"d241a60d5e8f04cc1b2b3e9ef7a4921b27bf526d9f6050ab90f9267a1f9e5c66"},{path:"tokenizer_config.json",sha256:"9261e7d79b44c8195c1cada2b453e55b00aeb81e907a6664974b4d7776172ab3"},{path:"onnx/model.onnx",sha256:"9bc579acdba21c253c62a9bf866891355a63ffa3442b52c8a37d75b2ccb91848"}]});var uc,pc=N(()=>{"use strict";uc="BAAI/bge-base-en-v1.5"});var Dr={};he(Dr,{EmbedderUnavailableError:()=>ns,embed:()=>$t,embedQuery:()=>yh,getEmbedderStatus:()=>Ze,loadEmbedder:()=>nt,unloadEmbedder:()=>wh});import{Worker as fh}from"node:worker_threads";import{join as _h}from"node:path";import{existsSync as hh}from"node:fs";function Eh(){return _h(ee(),"dist","daemon","embedder-worker.js")}function bh(e){return["Semantic search is unavailable on this platform.","",`Reason: ${e.detail}`,"",`Platform: ${process.platform}/${process.arch}, Node ${process.version}`,"","Claude Recall supports macOS (arm64/x64), Linux (x64/arm64), and Windows (x64).","Core CLI features (search, list, context, daemon) work everywhere.","Only `recall semantic *` requires the on-device embedder.","","See: https://clauderecall.com/docs (Supported platforms) \u2014 or file an issue at","https://gitlab.com/clauderecallhq/clauderecallhq/-/issues with the platform line above."].join(`
|
|
713
|
-
`)}function mc(e){for(let t of ss.values())t.reject(e);ss.clear()}function Sh(){if(Ve)return Ve;let e=Eh();if(!hh(e))throw new ns({kind:"bundle-missing",detail:"embedder-worker bundle not found \u2014 run `npm run build:cli` to emit it",path:e});let t=new fh(e);return t.on("message",s=>{let n=ss.get(s.id);n&&(ss.delete(s.id),n.resolve(s))}),t.on("error",s=>{console.error("[embedder-worker] thread error:",s);let n=s instanceof Error?s:new Error(String(s));mc(n),Ve=null,He=!1}),t.on("exit",s=>{s!==0&&(console.error(`[embedder-worker] exited with code ${s}`),mc(new Error(`embedder worker exited with code ${s}`))),Ve=null,He=!1}),Ve=t,t}function Gs(e){return new Promise((t,s)=>{let n;try{n=Sh()}catch(r){s(r instanceof Error?r:new Error(String(r)));return}ss.set(e.id,{resolve:t,reject:s}),n.postMessage(e)})}function Ys(){return Ir=Ir+1>>>0,String(Ir)}function Mr(e){if(!e.ok)throw e.unavailable?new ns({kind:"platform-unsupported",detail:"embedder worker reports the runtime is unavailable on this platform",underlying:new Error(e.error)}):new Error(e.error);return e}async function nt(){if(!(He&&Ve))try{Mr(await Gs({id:Ys(),type:"load"})),He=!0}catch(e){throw He=!1,e}}function Ze(){return{loaded:He,modelId:uc,dim:768}}async function $t(e){if(!He)throw new Error("[embedder] Model not loaded. Call loadEmbedder() before embedding.");return Mr(await Gs({id:Ys(),type:"embed",texts:e})).embeddings.map(s=>new Float32Array(s))}async function yh(e){if(!He)throw new Error("[embedder] Model not loaded. Call loadEmbedder() before embedding.");let t=Mr(await Gs({id:Ys(),type:"embedQuery",text:e}));return new Float32Array(t.embedding)}async function wh(){if(!Ve){He=!1;return}try{await Gs({id:Ys(),type:"unload"})}catch{}He=!1;let e=Ve;Ve=null;try{await e.terminate()}catch{}}var Ve,ss,Ir,He,ns,yt=N(()=>{"use strict";Ke();pc();Ve=null,ss=new Map,Ir=0,He=!1,ns=class extends Error{kind;path;underlying;cause;constructor(t){super(bh(t)),this.name="EmbedderUnavailableError",this.kind=t.kind,this.path=t.path,this.underlying=t.underlying,this.cause=t}}});var hc={};he(hc,{detectRunningClaudeOnWindows:()=>_c,ensureTransformersInstalled:()=>Fh});import{execFileSync as Lh,spawn as Nh}from"node:child_process";import{existsSync as Ah}from"node:fs";import{dirname as Oh,resolve as vh}from"node:path";import{fileURLToPath as Ih}from"node:url";function Dh(){let e=Oh(Ih(import.meta.url));return vh(e,"..","..")}async function $h(){try{return await import("@huggingface/transformers"),!0}catch{return!1}}function Ph(e){return new Promise(t=>{let s=["install","--no-save","--no-audit","--no-fund","--prefix",e,`@huggingface/transformers@${Mh}`],n=Nh("npm",s,{stdio:["ignore","inherit","inherit"],cwd:e,shell:process.platform==="win32"});n.on("error",r=>{t({ok:!1,error:`npm spawn failed: ${r instanceof Error?r.message:String(r)}`})}),n.on("exit",r=>{t(r===0?{ok:!0,action:"installed"}:{ok:!1,error:`npm install exited with code ${r}`})})})}function _c(){if(process.platform!=="win32")return!1;try{return Lh("tasklist",["/FI","IMAGENAME eq claude.exe"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).toLowerCase().includes("claude.exe")}catch{return!1}}async function Fh(){if(await $h())return{ok:!0,action:"already-installed"};if(_c())return{ok:!1,error:"Close all Claude Code windows before running `recall semantic install` on Windows. claude.exe holds exclusive locks on shared dependency files (Windows kernel default), which causes the underlying npm install to fail with EBUSY. After closing Claude Code, rerun `recall semantic install` to complete the install."};let e=Dh();return Ah(e)?(console.log(`Installing @huggingface/transformers into ${e} ...`),Ph(e)):{ok:!1,error:`package root not found at ${e}`}}var Mh,Ec=N(()=>{"use strict";Mh="^
|
|
713
|
+
`)}function mc(e){for(let t of ss.values())t.reject(e);ss.clear()}function Sh(){if(Ve)return Ve;let e=Eh();if(!hh(e))throw new ns({kind:"bundle-missing",detail:"embedder-worker bundle not found \u2014 run `npm run build:cli` to emit it",path:e});let t=new fh(e);return t.on("message",s=>{let n=ss.get(s.id);n&&(ss.delete(s.id),n.resolve(s))}),t.on("error",s=>{console.error("[embedder-worker] thread error:",s);let n=s instanceof Error?s:new Error(String(s));mc(n),Ve=null,He=!1}),t.on("exit",s=>{s!==0&&(console.error(`[embedder-worker] exited with code ${s}`),mc(new Error(`embedder worker exited with code ${s}`))),Ve=null,He=!1}),Ve=t,t}function Gs(e){return new Promise((t,s)=>{let n;try{n=Sh()}catch(r){s(r instanceof Error?r:new Error(String(r)));return}ss.set(e.id,{resolve:t,reject:s}),n.postMessage(e)})}function Ys(){return Ir=Ir+1>>>0,String(Ir)}function Mr(e){if(!e.ok)throw e.unavailable?new ns({kind:"platform-unsupported",detail:"embedder worker reports the runtime is unavailable on this platform",underlying:new Error(e.error)}):new Error(e.error);return e}async function nt(){if(!(He&&Ve))try{Mr(await Gs({id:Ys(),type:"load"})),He=!0}catch(e){throw He=!1,e}}function Ze(){return{loaded:He,modelId:uc,dim:768}}async function $t(e){if(!He)throw new Error("[embedder] Model not loaded. Call loadEmbedder() before embedding.");return Mr(await Gs({id:Ys(),type:"embed",texts:e})).embeddings.map(s=>new Float32Array(s))}async function yh(e){if(!He)throw new Error("[embedder] Model not loaded. Call loadEmbedder() before embedding.");let t=Mr(await Gs({id:Ys(),type:"embedQuery",text:e}));return new Float32Array(t.embedding)}async function wh(){if(!Ve){He=!1;return}try{await Gs({id:Ys(),type:"unload"})}catch{}He=!1;let e=Ve;Ve=null;try{await e.terminate()}catch{}}var Ve,ss,Ir,He,ns,yt=N(()=>{"use strict";Ke();pc();Ve=null,ss=new Map,Ir=0,He=!1,ns=class extends Error{kind;path;underlying;cause;constructor(t){super(bh(t)),this.name="EmbedderUnavailableError",this.kind=t.kind,this.path=t.path,this.underlying=t.underlying,this.cause=t}}});var hc={};he(hc,{detectRunningClaudeOnWindows:()=>_c,ensureTransformersInstalled:()=>Fh});import{execFileSync as Lh,spawn as Nh}from"node:child_process";import{existsSync as Ah}from"node:fs";import{dirname as Oh,resolve as vh}from"node:path";import{fileURLToPath as Ih}from"node:url";function Dh(){let e=Oh(Ih(import.meta.url));return vh(e,"..","..")}async function $h(){try{return await import("@huggingface/transformers"),!0}catch{return!1}}function Ph(e){return new Promise(t=>{let s=["install","--no-save","--no-audit","--no-fund","--prefix",e,`@huggingface/transformers@${Mh}`],n=Nh("npm",s,{stdio:["ignore","inherit","inherit"],cwd:e,shell:process.platform==="win32"});n.on("error",r=>{t({ok:!1,error:`npm spawn failed: ${r instanceof Error?r.message:String(r)}`})}),n.on("exit",r=>{t(r===0?{ok:!0,action:"installed"}:{ok:!1,error:`npm install exited with code ${r}`})})})}function _c(){if(process.platform!=="win32")return!1;try{return Lh("tasklist",["/FI","IMAGENAME eq claude.exe"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).toLowerCase().includes("claude.exe")}catch{return!1}}async function Fh(){if(await $h())return{ok:!0,action:"already-installed"};if(_c())return{ok:!1,error:"Close all Claude Code windows before running `recall semantic install` on Windows. claude.exe holds exclusive locks on shared dependency files (Windows kernel default), which causes the underlying npm install to fail with EBUSY. After closing Claude Code, rerun `recall semantic install` to complete the install."};let e=Dh();return Ah(e)?(console.log(`Installing @huggingface/transformers into ${e} ...`),Ph(e)):{ok:!1,error:`package root not found at ${e}`}}var Mh,Ec=N(()=>{"use strict";Mh="^4.2.0"});import{writeFileSync as vc,readFileSync as WA,existsSync as Ic,mkdirSync as Mc,readdirSync as XA}from"node:fs";import{join as Ks}from"node:path";function RE(){F(),Ic(Hr)||Mc(Hr,{recursive:!0})}function xE(){F(),Ic(Wr)||Mc(Wr,{recursive:!0})}function Dc(e){try{return JSON.parse(e)}catch{return e}}function Xr(e){return{id:e.id,source_session_id:e.source_session_id,target_session_id:e.target_session_id,link_type:e.link_type,confidence:e.confidence,source:e.source,evidence:Dc(e.evidence),approved:e.approved===1,created_at:e.created_at,updated_at:e.updated_at}}function Jr(e){return{id:e.id,source_session_id:e.source_session_id,target_session_id:e.target_session_id,link_type:e.link_type,confidence:e.confidence,evidence:Dc(e.evidence),status:e.status,inferred_by:e.inferred_by,created_at:e.created_at,decided_at:e.decided_at}}function kE(e){if(!Number.isFinite(e)||e<0||e>1)throw new Error("confidence must be a number in [0, 1]")}function $c(e){if(!bE.has(e))throw new Error(`invalid link_type: ${e}`)}function Pc(e){if(!wE.has(e))throw new Error(`invalid inferred_by: ${e}`)}function CE(e,t){if(!e||!t)throw new Error("source_session_id and target_session_id are required");if(e===t)throw new Error("a session cannot link to itself")}function LE(e={}){let t=_(),s=[],n=[];e.sourceSessionId&&(s.push("source_session_id = ?"),n.push(e.sourceSessionId)),e.targetSessionId&&(s.push("target_session_id = ?"),n.push(e.targetSessionId)),e.linkType&&($c(e.linkType),s.push("link_type = ?"),n.push(e.linkType)),e.approvedOnly&&s.push("approved = 1");let r=s.length?`WHERE ${s.join(" AND ")}`:"",o=Math.max(1,Math.min(5e3,e.limit??1e3));return t.prepare(`SELECT * FROM session_links ${r}
|
|
714
714
|
ORDER BY confidence DESC, updated_at DESC
|
|
715
715
|
LIMIT ?`).all(...n,o).map(Xr)}function Gr(e){return _().prepare(`SELECT * FROM session_links
|
|
716
716
|
WHERE source_session_id = ? OR target_session_id = ?
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clauderecallhq/cli",
|
|
3
|
-
"version": "0.77.
|
|
3
|
+
"version": "0.77.1",
|
|
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",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"arm64"
|
|
82
82
|
],
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"@anthropic-ai/sdk": "^0.
|
|
84
|
+
"@anthropic-ai/sdk": "^0.96.0",
|
|
85
85
|
"@hono/node-server": "^2.0.2",
|
|
86
86
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
87
87
|
"chalk": "^5.3.0",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"cli-table3": "^0.6.5",
|
|
90
90
|
"commander": "^14.0.3",
|
|
91
91
|
"date-fns": "^4.1.0",
|
|
92
|
-
"hono": "^4.
|
|
92
|
+
"hono": "^4.12.19",
|
|
93
93
|
"ink": "^7.0.1",
|
|
94
94
|
"ink-text-input": "^6.0.0",
|
|
95
95
|
"jose": "^6.2.2",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"devDependencies": {
|
|
103
103
|
"@fontsource/inter": "^5.2.8",
|
|
104
104
|
"@fontsource/jetbrains-mono": "^5.2.8",
|
|
105
|
-
"@huggingface/transformers": "^
|
|
105
|
+
"@huggingface/transformers": "^4.2.0",
|
|
106
106
|
"@playwright/test": "^1.59.1",
|
|
107
107
|
"@tanstack/react-query": "^5.99.1",
|
|
108
108
|
"@tanstack/react-virtual": "^3.13.24",
|
|
@@ -110,14 +110,14 @@
|
|
|
110
110
|
"@types/d3": "^7.4.3",
|
|
111
111
|
"@types/dompurify": "^3.0.5",
|
|
112
112
|
"@types/mailparser": "^3.4.6",
|
|
113
|
-
"@types/node": "^25.
|
|
113
|
+
"@types/node": "^25.8.0",
|
|
114
114
|
"@types/nodemailer": "^8.0.0",
|
|
115
115
|
"@types/react": "^19.2.14",
|
|
116
116
|
"@types/react-dom": "^19.2.3",
|
|
117
|
-
"@vitejs/plugin-react": "^6.0.
|
|
117
|
+
"@vitejs/plugin-react": "^6.0.2",
|
|
118
118
|
"autoprefixer": "^10.5.0",
|
|
119
119
|
"better-sqlite3": "^12.9.0",
|
|
120
|
-
"bullmq": "^5.76.
|
|
120
|
+
"bullmq": "^5.76.9",
|
|
121
121
|
"clsx": "^2.1.1",
|
|
122
122
|
"d3": "^7.9.0",
|
|
123
123
|
"dompurify": "^3.4.0",
|
|
@@ -134,10 +134,10 @@
|
|
|
134
134
|
"postcss": "^8.5.10",
|
|
135
135
|
"react-dom": "^19.2.5",
|
|
136
136
|
"tailwindcss": "^3.4.19",
|
|
137
|
-
"tsx": "^4.
|
|
137
|
+
"tsx": "^4.22.0",
|
|
138
138
|
"typescript": "^6.0.3",
|
|
139
139
|
"ulid": "^3.0.2",
|
|
140
|
-
"vite": "^8.0.
|
|
140
|
+
"vite": "^8.0.13",
|
|
141
141
|
"wink-bm25-text-search": "^3.1.2"
|
|
142
142
|
}
|
|
143
143
|
}
|