@anmol-srv/sigil 0.10.3 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,63 +1,64 @@
1
1
  #!/usr/bin/env node
2
- var sr=Object.defineProperty;var f=(e,t)=>()=>(e&&(t=e(e=0)),t);var I=(e,t)=>{for(var n in t)sr(e,n,{get:t[n],enumerable:!0})};import{fileURLToPath as mr}from"node:url";import{dirname as et,join as O}from"node:path";import{existsSync as tt}from"node:fs";import{homedir as fr}from"node:os";function hr(){let e=et(mr(import.meta.url));for(let t=0;t<10;t++){if(tt(O(e,"package.json"))&&tt(O(e,"prompts")))return e;let n=et(e);if(n===e)break;e=n}return process.cwd()}var nt,Z,qi,rt,C,Q,zi,Xi,Er,ot,_r,it,Zi,Qi,at,ea,ta,P=f(()=>{nt=hr(),Z=O(nt,"prompts"),qi=O(nt,"src","db","migrations"),rt=fr(),C=O(rt,".sigil"),Q=O(C,".env"),zi=O(C,"db"),Xi=O(C,"CLAUDE.md"),Er=O(C,"schemas"),ot=O(C,".hook-errors.log"),_r=O(C,".last-clean-doctor"),it=O(C,".active-session.json"),Zi=O(C,".stop-cursor.json"),Qi=O(C,".hook-dedup.json"),at=O(rt,".claude"),ea=O(at,"settings.json"),ta=O(at,"CLAUDE.md")});var ct={};I(ct,{default:()=>c});var T,st,yr,c,g=f(()=>{T=(e,t)=>process.env[e]??t,st=T("SIGIL_DB_TYPE","postgres");if(st!=="postgres")throw new Error(`SIGIL_DB_TYPE=${st} is no longer supported. Sigil 0.10.0+ is Postgres-only.
2
+ import { createRequire as __sigilCreateRequire } from 'node:module'; const require = __sigilCreateRequire(import.meta.url);
3
+ var Tr=Object.defineProperty;var f=(e,t)=>()=>(e&&(t=e(e=0)),t);var T=(e,t)=>{for(var n in t)Tr(e,n,{get:t[n],enumerable:!0})};function J(e){if(!e||typeof e!="string")return e;let t=e;for(let n of Nr)t=t.replace(n,V);return t=t.replace(Rr,(n,r)=>`${r}=${V}`),t=t.replace(Dr,(n,r)=>`${r}${V}:${V}@`),t=t.replace(Lr,(n,r)=>`${r}=${V}`),t}var V,Nr,Rr,Dr,vr,Lr,oe=f(()=>{V="***MASKED***",Nr=[/\b(sk-(?:proj-|ant-)?[A-Za-z0-9_\-]{20,})\b/g,/\b(ghp_[A-Za-z0-9]{36,})\b/g,/\b(github_pat_[A-Za-z0-9_]{20,})\b/g,/\b(gho_[A-Za-z0-9]{36,})\b/g,/\b(glpat-[A-Za-z0-9_\-]{20,})\b/g,/\b(xox[baprs]-[A-Za-z0-9\-]{10,})\b/g,/\b(whsec_[A-Za-z0-9]{20,})\b/g,/\b(rk_(?:live|test)_[A-Za-z0-9]{20,})\b/g,/\b(AKIA[A-Z0-9]{16})\b/g,/\b(ASIA[A-Z0-9]{16})\b/g,/\b(eyJ[A-Za-z0-9_\-]{20,}\.[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,})\b/g,/\b([A-Za-z0-9]{24}\.[A-Za-z0-9_\-]{6}\.[A-Za-z0-9_\-]{27})\b/g,/\b(\d{8,12}:[A-Za-z0-9_\-]{35})\b/g],Rr=new RegExp(`\\b(api[_-]?key|api[_-]?secret|secret[_-]?key|secret|token|password|passwd|pwd|auth[_-]?token|access[_-]?token|refresh[_-]?token|bearer|private[_-]?key|client[_-]?secret)\\s*[=:]\\s*["']?([^\\s"']{8,})["']?`,"gi"),Dr=/(\w+:\/\/)([^:/\s]+):([^@\s]{3,})@/g,vr=["DATABASE_URL","REDIS_URL","MONGODB_URI","MONGO_URI","POSTGRES_URL","DSN","CONNECTION_STRING","ENCRYPTION_KEY","JWT_SECRET","SIGIL_ENCRYPTION_KEY","SESSION_SECRET","WEBHOOK_SECRET"],Lr=new RegExp(`\\b(${vr.join("|")})\\s*[=:]\\s*["']?([^\\s"']+)["']?`,"gi")});import{fileURLToPath as Cr}from"node:url";import{dirname as at,join as S}from"node:path";import{existsSync as st}from"node:fs";import{homedir as xr}from"node:os";function Pr(){let e=at(Cr(import.meta.url));for(let t=0;t<10;t++){if(st(S(e,"package.json"))&&st(S(e,"prompts")))return e;let n=at(e);if(n===e)break;e=n}return process.cwd()}var ie,ae,Na,ct,N,se,Ra,Da,Mr,lt,kr,ut,va,La,Ca,xa,Pa,Ma,ka,Ba,$a,Fa,Ua,Ha,dt,Ga,Wa,M=f(()=>{ie=Pr(),ae=S(ie,"prompts"),Na=S(ie,"src","db","migrations"),ct=xr(),N=S(ct,".sigil"),se=S(N,".env"),Ra=S(N,"db"),Da=S(N,"CLAUDE.md"),Mr=S(N,"schemas"),lt=S(N,".hook-errors.log"),kr=S(N,".last-clean-doctor"),ut=S(N,".active-session.json"),va=S(N,".stop-cursor.json"),La=S(N,".hook-dedup.json"),Ca=S(N,"sock"),xa=S(N,"sigild.pid"),Pa=S(N,"sigild.log"),Ma=S(N,"heartbeat.json"),ka=S(N,"onboarding-state.json"),Ba=S(N,"gui.token"),$a=S(ie,"dist","gui"),Fa=S(ie,"src","gui","web"),Ua=S(N,"iroh"),Ha=S(N,"identity.key"),dt=S(ct,".claude"),Ga=S(dt,"settings.json"),Wa=S(dt,"CLAUDE.md")});var mt={};T(mt,{default:()=>l});var A,pt,Br,l,I=f(()=>{A=(e,t)=>process.env[e]??t,pt=A("SIGIL_DB_TYPE","postgres");if(pt!=="postgres")throw new Error(`SIGIL_DB_TYPE=${pt} is no longer supported. Sigil 0.10.0+ is Postgres-only.
3
4
  PGlite was deprecated; existing PGlite data at ~/.sigil/db is preserved but unreachable from this version.
4
5
  Set SIGIL_DB_TYPE=postgres in ~/.sigil/.env and configure SIGIL_DB_HOST / PORT / NAME / USER / PASSWORD.
5
- Run \`sigil init\` for an interactive setup.`);yr={db:{type:"postgres",host:T("SIGIL_DB_HOST","localhost"),port:Number(T("SIGIL_DB_PORT",5432)),database:T("SIGIL_DB_NAME","sigil"),user:T("SIGIL_DB_USER","sigil_app"),password:T("SIGIL_DB_PASSWORD","")},embedding:{provider:process.env.EMBEDDING_PROVIDER||"",model:process.env.EMBEDDING_MODEL||"nomic-embed-text",dimensions:Number(process.env.EMBEDDING_DIMENSIONS)||768,ollamaHost:process.env.OLLAMA_HOST||"http://localhost:11434",openaiApiKey:process.env.OPENAI_API_KEY||"",voyageApiKey:process.env.VOYAGE_API_KEY||"",openrouterApiKey:process.env.OPENROUTER_API_KEY||"",openrouterBaseUrl:process.env.EMBEDDING_OPENROUTER_BASE_URL||process.env.LLM_OPENROUTER_BASE_URL||"",openrouterReferer:process.env.EMBEDDING_OPENROUTER_REFERER||process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil",openrouterTitle:process.env.EMBEDDING_OPENROUTER_TITLE||process.env.LLM_OPENROUTER_TITLE||"Sigil"},llm:{provider:process.env.LLM_PROVIDER||"",openaiApiKey:process.env.OPENAI_API_KEY||"",openaiModel:process.env.LLM_OPENAI_MODEL||"gpt-4o-mini",ollamaHost:process.env.LLM_OLLAMA_HOST||process.env.OLLAMA_HOST||"http://localhost:11434",ollamaModel:process.env.LLM_OLLAMA_MODEL||"qwen2.5:7b",cliModel:process.env.LLM_CLI_MODEL||"haiku",apiKey:process.env.ANTHROPIC_API_KEY||"",openrouterApiKey:process.env.OPENROUTER_API_KEY||"",openrouterModel:process.env.LLM_OPENROUTER_MODEL||"google/gemini-flash-latest",openrouterBaseUrl:process.env.LLM_OPENROUTER_BASE_URL||"",openrouterReferer:process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil",openrouterTitle:process.env.LLM_OPENROUTER_TITLE||"Sigil",extractionModel:process.env.LLM_EXTRACTION_MODEL||"",decisionModel:process.env.LLM_DECISION_MODEL||"",entityModel:process.env.LLM_ENTITY_MODEL||"",maxRetries:Number(process.env.LLM_MAX_RETRIES)||3,cliTimeout:Number(process.env.LLM_CLI_TIMEOUT)||12e4},output:{storage:process.env.OUTPUT_STORAGE||"local",dir:process.env.OUTPUT_DIR||"./output",s3:{endpoint:process.env.S3_ENDPOINT||"",bucket:process.env.S3_BUCKET||"",region:process.env.S3_REGION||"us-east-1",accessKey:process.env.S3_ACCESS_KEY||"",secretKey:process.env.S3_SECRET_KEY||"",publicUrl:process.env.S3_PUBLIC_URL||""}},server:{port:Number(process.env.PORT)||4e3,host:process.env.HOST||"0.0.0.0",logLevel:process.env.LOG_LEVEL||"info"},defaults:{namespace:process.env.DEFAULT_NAMESPACE||"default"},memory:{skipThreshold:Number(process.env.MEMORY_SKIP_THRESHOLD)||.88,ambiguousThreshold:Number(process.env.MEMORY_AMBIGUOUS_THRESHOLD)||.78,minFactSimilarity:Number(process.env.MEMORY_MIN_FACT_SIMILARITY)||.45},search:{synthesize:T("SIGIL_SYNTHESIZE","true")!=="false",synthesizeModel:T("SIGIL_SYNTH_MODEL","")},ingest:{eagerExtract:T("SIGIL_EAGER_EXTRACT","true")!=="false"},hebbian:{entity:{enabled:T("SIGIL_HEBBIAN_ENTITY_ENABLED",null,"true")!=="false",eta:Number(T("SIGIL_HEBBIAN_ENTITY_ETA",null,1)),cap:Number(T("SIGIL_HEBBIAN_ENTITY_CAP",null,50)),halfLifeDays:Number(T("SIGIL_HEBBIAN_ENTITY_HALF_LIFE_DAYS",null,30)),minEffective:Number(T("SIGIL_HEBBIAN_ENTITY_MIN_EFFECTIVE",null,.5)),rrfWeight:Number(T("SIGIL_HEBBIAN_ENTITY_RRF_WEIGHT",null,.3)),maxWriteEntities:Number(T("SIGIL_HEBBIAN_ENTITY_MAX_WRITE",null,12)),expandPerSeed:Number(T("SIGIL_HEBBIAN_ENTITY_EXPAND_PER_SEED",null,3))}}},c=yr});var W={};I(W,{default:()=>p});import gr from"knex";function Sr(e){return Array.isArray(e)?e.map(we):e&&typeof e=="object"?we(e):e}function Ar(e,t){return t(br(e))}function we(e){if(!e||typeof e!="object"||e instanceof Date)return e;if(Array.isArray(e))return e.map(we);let t={};for(let[n,r]of Object.entries(e))t[n.replace(/_([a-z])/g,(o,i)=>i.toUpperCase())]=r;return t}function br(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}var wr,p,A=f(()=>{g();wr=gr({client:"pg",connection:{host:c.db.host,port:c.db.port,database:c.db.database,user:c.db.user,password:c.db.password},pool:{min:2,max:10},postProcessResponse:Sr,wrapIdentifier:Ar});p=wr});var mt={};I(mt,{validateConfig:()=>pt,validateConfigDeep:()=>Ir});function pt(){let e=[];return Or(e),Tr(e),Nr(e),e}async function Ir(){let e=pt();if(c.db.type==="postgres"&&!e.some(t=>t.code.startsWith("DB_")))try{await(await Promise.resolve().then(()=>(A(),W))).default.raw("SELECT 1")}catch(t){e.push({level:"fail",code:"DB_UNREACHABLE",message:`Postgres at ${c.db.host}:${c.db.port}/${c.db.database} unreachable: ${t.message.split(`
6
- `)[0]}`,fix:"Start Postgres (e.g. `docker start sigil-pg` or your equivalent) and verify SIGIL_DB_HOST/PORT/NAME/USER/PASSWORD in ~/.sigil/.env"})}return e}function Or(e){let{provider:t,model:n}=c.embedding;if(t&&n){let r=Object.keys(lt).find(o=>lt[o].some(i=>i.test(n)));r&&r!==t&&e.push({level:"fail",code:"EMBEDDING_PROVIDER_MODEL_MISMATCH",message:`EMBEDDING_PROVIDER=${t} but EMBEDDING_MODEL=${n} is a ${r} model.`,fix:Rr(t,n,r)})}if(t&&dt[t]){let r=dt[t];c.embedding[r]||e.push({level:"fail",code:"EMBEDDING_PROVIDER_MISSING_KEY",message:`EMBEDDING_PROVIDER=${t} but no ${ee(r)} found.`,fix:`Set ${ee(r)} in ~/.sigil/.env, or run 'sigil init' to reconfigure.`})}}function Tr(e){let{provider:t}=c.llm;if(t&&ut[t]){let n=ut[t];c.llm[n]||e.push({level:"fail",code:"LLM_PROVIDER_MISSING_KEY",message:`LLM_PROVIDER=${t} but no ${ee(n)} found.`,fix:`Set ${ee(n)} in ~/.sigil/.env, or run 'sigil init' to reconfigure.`})}t==="openrouter"&&c.llm.openrouterModel&&(c.llm.openrouterModel.includes("/")||e.push({level:"warn",code:"OPENROUTER_MODEL_FORMAT",message:`LLM_OPENROUTER_MODEL=${c.llm.openrouterModel} doesn't look like vendor/model format.`,fix:'Use format like "anthropic/claude-haiku-4-5" or "google/gemini-2.5-flash".'}))}function Nr(e){c.db.type==="postgres"&&(!c.db.host||!c.db.database||!c.db.user)&&e.push({level:"fail",code:"DB_CONFIG_INCOMPLETE",message:"SIGIL_DB_TYPE=postgres but host/database/user missing.",fix:"Set SIGIL_DB_HOST, SIGIL_DB_NAME, SIGIL_DB_USER, SIGIL_DB_PASSWORD in ~/.sigil/.env. Run `sigil init` for an interactive setup."})}function ee(e){return{openaiApiKey:"OPENAI_API_KEY",apiKey:"ANTHROPIC_API_KEY",openrouterApiKey:"OPENROUTER_API_KEY",voyageApiKey:"VOYAGE_API_KEY"}[e]||e}function Rr(e,t,n){let r={voyage:"voyage-3.5, voyage-3-large, voyage-code-3.5",openai:"text-embedding-3-large, text-embedding-3-small",ollama:"nomic-embed-text, mxbai-embed-large"}[e]||"(see provider docs)";return`Either set EMBEDDING_PROVIDER=${n} (matches your current model), or change EMBEDDING_MODEL to one of: ${r}`}var lt,ut,dt,ft=f(()=>{g();lt={voyage:[/^voyage-/],openai:[/^text-embedding-/],ollama:[/^nomic-embed/,/^mxbai-embed/,/^all-minilm/,/^bge-/,/^snowflake-/,/^granite-embedding/]},ut={openai:"openaiApiKey",anthropic:"apiKey",openrouter:"openrouterApiKey"},dt={openai:"openaiApiKey",voyage:"voyageApiKey",openrouter:"openrouterApiKey"}});function Ae(e,t){let n={};for(let r of e)n[r[t]]=r;return n}function te(e,t){if(t<1)return[];let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}var ne=f(()=>{});var gt={};I(gt,{chat:()=>Mr,meta:()=>xr,setup:()=>kr});async function Mr(e,{model:t,jsonMode:n=!1}={}){let r=t||c.llm.openaiModel,o=[{role:"user",content:e}];n&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:r,messages:o};n&&(i.response_format={type:"json_object"});let s=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${c.llm.openaiApiKey}`},body:JSON.stringify(i)});if(!s.ok){let h=await s.text();throw new Error(`OpenAI error ${s.status}: ${h}`)}let a=await s.json(),l=a.choices[0].message.content.trim(),u=a.usage||{};return{text:l,inputTokens:u.prompt_tokens||0,outputTokens:u.completion_tokens||0,model:r}}async function kr({existing:e,clack:t}){let n=e.OPENAI_API_KEY||"",r=await t.text({message:"OpenAI API key (paste, then Enter)",placeholder:n?"(keep existing \u2014 press Enter)":"sk-proj-...",validate:o=>{if(!o&&!n)return"API key is required";if(o&&!o.startsWith("sk-"))return'OpenAI keys start with "sk-" \u2014 check paste'}});return t.isCancel(r)?null:{env:{OPENAI_API_KEY:r||n}}}var xr,wt=f(()=>{g();xr={id:"openai",label:"OpenAI",hint:"gpt-4o-mini"}});function v(e){return Math.ceil((e||"").length/4)}function be(e,t,n){let r=Fr[e];return r?(t*r.input+n*r.output)/1e6:0}function K({provider:e,model:t,caller:n,input:r,response:o,inputTokens:i,outputTokens:s,cost:a,durationMs:l,status:u,error:h}){p("llm_log").insert({provider:e,model:t,caller:n,input:r?.slice(0,1e4),response:o?.slice(0,1e4),inputTokens:i,outputTokens:s,cost:a,durationMs:l,status:u,error:h?.slice(0,2e3)}).catch(E=>console.error("[llm-log] Write failed:",E.message))}async function Ie(e,t=3){for(let n=1;n<=t;n++)try{return await e()}catch(r){if(n===t)throw r;let o=Math.min(1e3*2**(n-1),1e4);await new Promise(i=>setTimeout(i,o))}}var Fr,j=f(()=>{A();Fr={"gpt-4o-mini":{input:.15,output:.6},"gpt-4o":{input:2.5,output:10},"gpt-4.1-nano":{input:.1,output:.4},"gpt-4.1-mini":{input:.4,output:1.6},"claude-haiku-4-5-20251001":{input:.8,output:4},"claude-sonnet-4-6":{input:3,output:15},"claude-opus-4-6":{input:15,output:75}}});var St={};I(St,{chat:()=>Hr,meta:()=>$r,setup:()=>Ur});async function Br(){if(!Oe){let{default:e}=await import("@anthropic-ai/sdk");Oe=new e({apiKey:c.llm.apiKey})}return Oe}async function Hr(e,{model:t,jsonMode:n=!1}={}){let r=t||"claude-haiku-4-5-20251001",o=await Br(),i=[{role:"user",content:e}],s=n?"Respond with valid JSON only. No explanation or wrapping.":void 0,a=await o.messages.create({model:r,max_tokens:4096,messages:i,...s&&{system:s}});return{text:a.content[0].text.trim(),inputTokens:a.usage?.input_tokens||v(e),outputTokens:a.usage?.output_tokens||v(a.content[0].text),model:r}}async function Ur({existing:e,clack:t}){let n=e.ANTHROPIC_API_KEY||"",r=await t.text({message:"Anthropic API key (paste, then Enter)",placeholder:n?"(keep existing \u2014 press Enter)":"sk-ant-...",validate:o=>{if(!o&&!n)return"API key is required";if(o&&!o.startsWith("sk-ant-"))return'Anthropic keys start with "sk-ant-" \u2014 check paste'}});return t.isCancel(r)?null:{env:{ANTHROPIC_API_KEY:r||n}}}var Oe,$r,At=f(()=>{g();j();Oe=null;$r={id:"anthropic",label:"Anthropic",hint:"Claude Haiku \u2014 requires API key"}});var It={};I(It,{chat:()=>Yr,meta:()=>Wr,setup:()=>Kr});async function Yr(e,{model:t,jsonMode:n=!1}={}){let r=t||c.llm.openrouterModel;if(!c.llm.openrouterApiKey)throw new Error("OPENROUTER_API_KEY is not set");if(!r)throw new Error("No OpenRouter model resolved. Set LLM_OPENROUTER_MODEL or pass `model`.");let o=[{role:"user",content:e}];n&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:r,messages:o};n&&(i.response_format={type:"json_object"});let s=(c.llm.openrouterBaseUrl||Gr).replace(/\/+$/,""),a={"Content-Type":"application/json",Authorization:`Bearer ${c.llm.openrouterApiKey}`};c.llm.openrouterReferer&&(a["HTTP-Referer"]=c.llm.openrouterReferer),c.llm.openrouterTitle&&(a["X-Title"]=c.llm.openrouterTitle);let l=await fetch(`${s}/chat/completions`,{method:"POST",headers:a,body:JSON.stringify(i)});if(!l.ok){let d=await l.text();throw new Error(`OpenRouter error ${l.status}: ${d}`)}let u=await l.json(),E=(u.choices?.[0]?.message?.content||"").trim(),m=u.usage||{};return{text:E,inputTokens:m.prompt_tokens||0,outputTokens:m.completion_tokens||0,model:u.model||r}}async function Kr({existing:e,clack:t}){let n={},r=e.OPENROUTER_API_KEY||"",o=await t.text({message:"OpenRouter API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-or-v1-...",validate:l=>{if(!l&&!r)return"API key is required";if(l&&!l.startsWith("sk-or-"))return'OpenRouter keys start with "sk-or-" \u2014 check paste'}});if(t.isCancel(o))return null;n.OPENROUTER_API_KEY=o||r;let i=e.LLM_OPENROUTER_MODEL||"",s=await t.text({message:"OpenRouter model (vendor/model)",placeholder:i||bt,validate:l=>{if(l&&!l.includes("/"))return'OpenRouter models are "vendor/model" \u2014 e.g. google/gemini-flash-latest'}});if(t.isCancel(s))return null;n.LLM_OPENROUTER_MODEL=s||i||bt;let a=await t.select({message:"Configure per-task model overrides? (advanced \u2014 better quality / cost)",options:[{value:"no",label:"No, use one model everywhere",hint:"simpler \u2014 debug one model"},{value:"yes",label:"Yes, configure smart split",hint:"~5\xD7 cheaper extraction + better AUDM/synthesis"}],initialValue:"no"});if(t.isCancel(a))return null;if(a==="yes"){let l=await t.text({message:"Extraction model (high-volume; cheap matters)",placeholder:e.LLM_EXTRACTION_MODEL||x.extraction});if(t.isCancel(l))return null;n.LLM_EXTRACTION_MODEL=l||e.LLM_EXTRACTION_MODEL||x.extraction;let u=await t.text({message:"Decision model (AUDM; smart matters)",placeholder:e.LLM_DECISION_MODEL||x.decision});if(t.isCancel(u))return null;n.LLM_DECISION_MODEL=u||e.LLM_DECISION_MODEL||x.decision;let h=await t.text({message:"Synthesis model (read-time answer composition)",placeholder:e.SIGIL_SYNTH_MODEL||x.synthesis});if(t.isCancel(h))return null;n.SIGIL_SYNTH_MODEL=h||e.SIGIL_SYNTH_MODEL||x.synthesis}return t.note(`OpenRouter can drive both LLM calls and embeddings.
6
+ Run \`sigil init\` for an interactive setup.`);Br={db:{type:"postgres",get url(){return A("SIGIL_DATABASE_URL",A("DATABASE_URL",""))||null},get host(){return A("SIGIL_DB_HOST","localhost")},get port(){return Number(A("SIGIL_DB_PORT",5432))},get database(){return A("SIGIL_DB_NAME","sigil")},get user(){return A("SIGIL_DB_USER","sigil_app")},get password(){return A("SIGIL_DB_PASSWORD","")}},embedding:{get provider(){return process.env.EMBEDDING_PROVIDER||""},get model(){return process.env.EMBEDDING_MODEL||"nomic-embed-text"},get dimensions(){return Number(process.env.EMBEDDING_DIMENSIONS)||768},get ollamaHost(){return process.env.OLLAMA_HOST||"http://localhost:11434"},get openaiApiKey(){return process.env.OPENAI_API_KEY||""},get voyageApiKey(){return process.env.VOYAGE_API_KEY||""},openrouterApiKey:process.env.OPENROUTER_API_KEY||"",openrouterBaseUrl:process.env.EMBEDDING_OPENROUTER_BASE_URL||process.env.LLM_OPENROUTER_BASE_URL||"",openrouterReferer:process.env.EMBEDDING_OPENROUTER_REFERER||process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil",openrouterTitle:process.env.EMBEDDING_OPENROUTER_TITLE||process.env.LLM_OPENROUTER_TITLE||"Sigil"},llm:{get provider(){return process.env.LLM_PROVIDER||""},get openaiApiKey(){return process.env.OPENAI_API_KEY||""},get openaiModel(){return process.env.LLM_OPENAI_MODEL||"gpt-4o-mini"},get ollamaHost(){return process.env.LLM_OLLAMA_HOST||process.env.OLLAMA_HOST||"http://localhost:11434"},get ollamaModel(){return process.env.LLM_OLLAMA_MODEL||"qwen2.5:7b"},get cliModel(){return process.env.LLM_CLI_MODEL||"haiku"},get apiKey(){return process.env.ANTHROPIC_API_KEY||""},get openrouterApiKey(){return process.env.OPENROUTER_API_KEY||""},get openrouterModel(){return process.env.LLM_OPENROUTER_MODEL||"google/gemini-flash-latest"},get openrouterBaseUrl(){return process.env.LLM_OPENROUTER_BASE_URL||""},get openrouterReferer(){return process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil"},get openrouterTitle(){return process.env.LLM_OPENROUTER_TITLE||"Sigil"},get extractionModel(){return process.env.LLM_EXTRACTION_MODEL||""},get decisionModel(){return process.env.LLM_DECISION_MODEL||""},get entityModel(){return process.env.LLM_ENTITY_MODEL||""},get maxRetries(){return Number(process.env.LLM_MAX_RETRIES)||3},get cliTimeout(){return Number(process.env.LLM_CLI_TIMEOUT)||12e4}},output:{storage:process.env.OUTPUT_STORAGE||"local",dir:process.env.OUTPUT_DIR||"./output",s3:{endpoint:process.env.S3_ENDPOINT||"",bucket:process.env.S3_BUCKET||"",region:process.env.S3_REGION||"us-east-1",accessKey:process.env.S3_ACCESS_KEY||"",secretKey:process.env.S3_SECRET_KEY||"",publicUrl:process.env.S3_PUBLIC_URL||""}},server:{port:Number(process.env.PORT)||4e3,host:process.env.HOST||"0.0.0.0",logLevel:process.env.LOG_LEVEL||"info"},http:{enabled:A("SIGIL_HTTP_ENABLED","true")!=="false",host:A("SIGIL_HTTP_HOST","127.0.0.1"),port:Number(A("SIGIL_HTTP_PORT",7777))},network:{mode:A("SIGIL_MODE","solo"),enabled:A("SIGIL_NETWORK_ENABLED",null)===null?A("SIGIL_MODE","solo")!=="solo":A("SIGIL_NETWORK_ENABLED","false")!=="false",masterNodeId:A("SIGIL_MASTER_NODE_ID","")||null},defaults:{namespace:process.env.DEFAULT_NAMESPACE||"default"},memory:{skipThreshold:Number(process.env.MEMORY_SKIP_THRESHOLD)||.88,ambiguousThreshold:Number(process.env.MEMORY_AMBIGUOUS_THRESHOLD)||.78,minFactSimilarity:Number(process.env.MEMORY_MIN_FACT_SIMILARITY)||.45,injectionFloor:Number(process.env.MEMORY_INJECTION_FLOOR)||.6},search:{synthesize:A("SIGIL_SYNTHESIZE","true")!=="false",synthesizeModel:A("SIGIL_SYNTH_MODEL","")},ingest:{eagerExtract:A("SIGIL_EAGER_EXTRACT","true")!=="false"},hebbian:{entity:{enabled:A("SIGIL_HEBBIAN_ENTITY_ENABLED",null,"true")!=="false",eta:Number(A("SIGIL_HEBBIAN_ENTITY_ETA",null,1)),cap:Number(A("SIGIL_HEBBIAN_ENTITY_CAP",null,50)),halfLifeDays:Number(A("SIGIL_HEBBIAN_ENTITY_HALF_LIFE_DAYS",null,30)),minEffective:Number(A("SIGIL_HEBBIAN_ENTITY_MIN_EFFECTIVE",null,.5)),rrfWeight:Number(A("SIGIL_HEBBIAN_ENTITY_RRF_WEIGHT",null,.3)),maxWriteEntities:Number(A("SIGIL_HEBBIAN_ENTITY_MAX_WRITE",null,12)),expandPerSeed:Number(A("SIGIL_HEBBIAN_ENTITY_EXPAND_PER_SEED",null,3))}}},l=Br});function ft(e){return{host:e.db.host,port:e.db.port,database:e.db.database,user:e.db.user,password:e.db.password}}var ht=f(()=>{});function Et(e){if(!e)throw new Error("url driver: SIGIL_DATABASE_URL is empty");let t;try{t=new URL(e)}catch(i){throw new Error(`url driver: invalid URL \u2014 ${i.message}`)}if(!/^postgres(ql)?:$/i.test(t.protocol))throw new Error(`url driver: expected postgres:// or postgresql:// scheme, got ${t.protocol}`);let n=t.searchParams.get("sslmode"),r=Fr(t.hostname,n),o={host:t.hostname,port:t.port?Number(t.port):5432,database:t.pathname.replace(/^\//,"")||"postgres",user:decodeURIComponent(t.username),password:decodeURIComponent(t.password)};return r!==void 0&&(o.ssl=r),t.searchParams.get("application_name")||(o.application_name="sigil"),o}function Fr(e,t){if(t==="disable")return!1;if(t==="require"||t==="verify-full"||t==="verify-ca")return{rejectUnauthorized:!0};if(t==="no-verify"||t==="prefer")return{rejectUnauthorized:!1};if(!_t.some(n=>n.test(e)))return $r.some(n=>n.test(e))?{rejectUnauthorized:!0}:{rejectUnauthorized:!1}}function yt(e){try{let t=new URL(e).hostname;return/\.neon\.tech$/i.test(t)?"neon":/\.pooler\.supabase\.com$/i.test(t)?"supabase-pooler":/\.supabase\.co$/i.test(t)||/\.supabase\.com$/i.test(t)?"supabase":/\.rds\.amazonaws\.com$/i.test(t)?"aws-rds":/\.render\.com$/i.test(t)?"render":/\.railway\.app$/i.test(t)?"railway":/\.cockroachlabs\.cloud$/i.test(t)?"cockroachdb":_t.some(n=>n.test(t))?"local":"unknown"}catch{return"unknown"}}var $r,_t,gt=f(()=>{$r=[/\.neon\.tech$/i,/\.supabase\.co$/i,/\.supabase\.com$/i,/\.pooler\.supabase\.com$/i,/\.rds\.amazonaws\.com$/i,/\.render\.com$/i,/\.railway\.app$/i,/\.cockroachlabs\.cloud$/i],_t=[/^localhost$/i,/^127\.0\.0\.1$/,/^::1$/,/\.local$/i]});function wt(e){let t=e.db.url;return t?{kind:"url",provider:yt(t),connection:Et(t)}:{kind:"local",provider:"local",connection:ft(e)}}var St=f(()=>{ht();gt()});var $={};T($,{default:()=>d});import Ur from"knex";function Hr(e){return Array.isArray(e)?e.map(Te):e&&typeof e=="object"?Te(e):e}function Gr(e,t){return t(Wr(e))}function Te(e){if(!e||typeof e!="object"||e instanceof Date)return e;if(Array.isArray(e))return e.map(Te);let t={};for(let[n,r]of Object.entries(e))t[n.replace(/_([a-z])/g,(o,i)=>i.toUpperCase())]=r;return t}function Wr(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}var At,It,d,b=f(()=>{I();St();At=wt(l),It=Ur({client:"pg",connection:At.connection,pool:{min:2,max:10},postProcessResponse:Hr,wrapIdentifier:Gr});It.__sigilDriver=At;d=It});var Rt={};T(Rt,{validateConfig:()=>Nt,validateConfigDeep:()=>Yr});function Nt(){let e=[];return Kr(e),jr(e),Vr(e),e}async function Yr(){let e=Nt();if(l.db.type==="postgres"&&!e.some(t=>t.code.startsWith("DB_")))try{await(await Promise.resolve().then(()=>(b(),$))).default.raw("SELECT 1")}catch(t){e.push({level:"fail",code:"DB_UNREACHABLE",message:`Postgres at ${l.db.host}:${l.db.port}/${l.db.database} unreachable: ${t.message.split(`
7
+ `)[0]}`,fix:"Start Postgres (e.g. `docker start sigil-pg` or your equivalent) and verify SIGIL_DB_HOST/PORT/NAME/USER/PASSWORD in ~/.sigil/.env"})}return e}function Kr(e){let{provider:t,model:n}=l.embedding;if(t&&n){let r=Object.keys(bt).find(o=>bt[o].some(i=>i.test(n)));r&&r!==t&&e.push({level:"fail",code:"EMBEDDING_PROVIDER_MODEL_MISMATCH",message:`EMBEDDING_PROVIDER=${t} but EMBEDDING_MODEL=${n} is a ${r} model.`,fix:Jr(t,n,r)})}if(t&&Tt[t]){let r=Tt[t];l.embedding[r]||e.push({level:"fail",code:"EMBEDDING_PROVIDER_MISSING_KEY",message:`EMBEDDING_PROVIDER=${t} but no ${ce(r)} found.`,fix:`Set ${ce(r)} in ~/.sigil/.env, or run 'sigil init' to reconfigure.`})}}function jr(e){let{provider:t}=l.llm;if(t&&Ot[t]){let n=Ot[t];l.llm[n]||e.push({level:"fail",code:"LLM_PROVIDER_MISSING_KEY",message:`LLM_PROVIDER=${t} but no ${ce(n)} found.`,fix:`Set ${ce(n)} in ~/.sigil/.env, or run 'sigil init' to reconfigure.`})}t==="openrouter"&&l.llm.openrouterModel&&(l.llm.openrouterModel.includes("/")||e.push({level:"warn",code:"OPENROUTER_MODEL_FORMAT",message:`LLM_OPENROUTER_MODEL=${l.llm.openrouterModel} doesn't look like vendor/model format.`,fix:'Use format like "anthropic/claude-haiku-4-5" or "google/gemini-2.5-flash".'}))}function Vr(e){l.db.type==="postgres"&&(!l.db.host||!l.db.database||!l.db.user)&&e.push({level:"fail",code:"DB_CONFIG_INCOMPLETE",message:"SIGIL_DB_TYPE=postgres but host/database/user missing.",fix:"Set SIGIL_DB_HOST, SIGIL_DB_NAME, SIGIL_DB_USER, SIGIL_DB_PASSWORD in ~/.sigil/.env. Run `sigil init` for an interactive setup."})}function ce(e){return{openaiApiKey:"OPENAI_API_KEY",apiKey:"ANTHROPIC_API_KEY",openrouterApiKey:"OPENROUTER_API_KEY",voyageApiKey:"VOYAGE_API_KEY"}[e]||e}function Jr(e,t,n){let r={voyage:"voyage-3.5, voyage-3-large, voyage-code-3.5",openai:"text-embedding-3-large, text-embedding-3-small",ollama:"nomic-embed-text, mxbai-embed-large"}[e]||"(see provider docs)";return`Either set EMBEDDING_PROVIDER=${n} (matches your current model), or change EMBEDDING_MODEL to one of: ${r}`}var bt,Ot,Tt,Dt=f(()=>{I();bt={voyage:[/^voyage-/],openai:[/^text-embedding-/],ollama:[/^nomic-embed/,/^mxbai-embed/,/^all-minilm/,/^bge-/,/^snowflake-/,/^granite-embedding/]},Ot={openai:"openaiApiKey",anthropic:"apiKey",openrouter:"openrouterApiKey"},Tt={openai:"openaiApiKey",voyage:"voyageApiKey",openrouter:"openrouterApiKey"}});function Re(e,t){let n={};for(let r of e)n[r[t]]=r;return n}function le(e,t){if(t<1)return[];let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}var ue=f(()=>{});var Pt={};T(Pt,{chat:()=>eo,meta:()=>to,setup:()=>no});async function eo(e,{model:t,jsonMode:n=!1}={}){let r=t||l.llm.openaiModel,o=[{role:"user",content:e}];n&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:r,messages:o};n&&(i.response_format={type:"json_object"});let s=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${l.llm.openaiApiKey}`},body:JSON.stringify(i)});if(!s.ok){let h=await s.text();throw new Error(`OpenAI error ${s.status}: ${h}`)}let a=await s.json(),c=a.choices[0].message.content.trim(),u=a.usage||{};return{text:c,inputTokens:u.prompt_tokens||0,outputTokens:u.completion_tokens||0,model:r}}async function no({existing:e,clack:t}){let n=e.OPENAI_API_KEY||"",r=await t.text({message:"OpenAI API key (paste, then Enter)",placeholder:n?"(keep existing \u2014 press Enter)":"sk-proj-...",validate:o=>{if(!o&&!n)return"API key is required";if(o&&!o.startsWith("sk-"))return'OpenAI keys start with "sk-" \u2014 check paste'}});return t.isCancel(r)?null:{env:{OPENAI_API_KEY:r||n}}}var to,Mt=f(()=>{I();to={id:"openai",label:"OpenAI",hint:"gpt-4o-mini"}});function C(e){return Math.ceil((e||"").length/4)}function De(e,t,n){let r=ro[e];return r?(t*r.input+n*r.output)/1e6:0}function q({provider:e,model:t,caller:n,input:r,response:o,inputTokens:i,outputTokens:s,cost:a,durationMs:c,status:u,error:h}){d("llm_log").insert({provider:e,model:t,caller:n,input:r?.slice(0,1e4),response:o?.slice(0,1e4),inputTokens:i,outputTokens:s,cost:a,durationMs:c,status:u,error:h?.slice(0,2e3)}).catch(y=>console.error("[llm-log] Write failed:",y.message))}async function ve(e,t=3){for(let n=1;n<=t;n++)try{return await e()}catch(r){if(n===t)throw r;let o=Math.min(1e3*2**(n-1),1e4);await new Promise(i=>setTimeout(i,o))}}var ro,z=f(()=>{b();ro={"gpt-4o-mini":{input:.15,output:.6},"gpt-4o":{input:2.5,output:10},"gpt-4.1-nano":{input:.1,output:.4},"gpt-4.1-mini":{input:.4,output:1.6},"claude-haiku-4-5-20251001":{input:.8,output:4},"claude-sonnet-4-6":{input:3,output:15},"claude-opus-4-6":{input:15,output:75}}});var kt={};T(kt,{chat:()=>io,meta:()=>ao,setup:()=>so});async function oo(){if(!Le){let{default:e}=await import("@anthropic-ai/sdk");Le=new e({apiKey:l.llm.apiKey})}return Le}async function io(e,{model:t,jsonMode:n=!1}={}){let r=t||"claude-haiku-4-5-20251001",o=await oo(),i=[{role:"user",content:e}],s=n?"Respond with valid JSON only. No explanation or wrapping.":void 0,a=await o.messages.create({model:r,max_tokens:4096,messages:i,...s&&{system:s}});return{text:a.content[0].text.trim(),inputTokens:a.usage?.input_tokens||C(e),outputTokens:a.usage?.output_tokens||C(a.content[0].text),model:r}}async function so({existing:e,clack:t}){let n=e.ANTHROPIC_API_KEY||"",r=await t.text({message:"Anthropic API key (paste, then Enter)",placeholder:n?"(keep existing \u2014 press Enter)":"sk-ant-...",validate:o=>{if(!o&&!n)return"API key is required";if(o&&!o.startsWith("sk-ant-"))return'Anthropic keys start with "sk-ant-" \u2014 check paste'}});return t.isCancel(r)?null:{env:{ANTHROPIC_API_KEY:r||n}}}var Le,ao,Bt=f(()=>{I();z();Le=null;ao={id:"anthropic",label:"Anthropic",hint:"Claude Haiku \u2014 requires API key"}});var Ft={};T(Ft,{chat:()=>lo,meta:()=>uo,setup:()=>po});async function lo(e,{model:t,jsonMode:n=!1}={}){let r=t||l.llm.openrouterModel;if(!l.llm.openrouterApiKey)throw new Error("OPENROUTER_API_KEY is not set");if(!r)throw new Error("No OpenRouter model resolved. Set LLM_OPENROUTER_MODEL or pass `model`.");let o=[{role:"user",content:e}];n&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:r,messages:o};n&&(i.response_format={type:"json_object"});let s=(l.llm.openrouterBaseUrl||co).replace(/\/+$/,""),a={"Content-Type":"application/json",Authorization:`Bearer ${l.llm.openrouterApiKey}`};l.llm.openrouterReferer&&(a["HTTP-Referer"]=l.llm.openrouterReferer),l.llm.openrouterTitle&&(a["X-Title"]=l.llm.openrouterTitle);let c=await fetch(`${s}/chat/completions`,{method:"POST",headers:a,body:JSON.stringify(i)});if(!c.ok){let p=await c.text();throw new Error(`OpenRouter error ${c.status}: ${p}`)}let u=await c.json(),y=(u.choices?.[0]?.message?.content||"").trim(),m=u.usage||{};return{text:y,inputTokens:m.prompt_tokens||0,outputTokens:m.completion_tokens||0,model:u.model||r}}async function po({existing:e,clack:t}){let n={},r=e.OPENROUTER_API_KEY||"",o=await t.text({message:"OpenRouter API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-or-v1-...",validate:c=>{if(!c&&!r)return"API key is required";if(c&&!c.startsWith("sk-or-"))return'OpenRouter keys start with "sk-or-" \u2014 check paste'}});if(t.isCancel(o))return null;n.OPENROUTER_API_KEY=o||r;let i=e.LLM_OPENROUTER_MODEL||"",s=await t.text({message:"OpenRouter model (vendor/model)",placeholder:i||$t,validate:c=>{if(c&&!c.includes("/"))return'OpenRouter models are "vendor/model" \u2014 e.g. google/gemini-flash-latest'}});if(t.isCancel(s))return null;n.LLM_OPENROUTER_MODEL=s||i||$t;let a=await t.select({message:"Configure per-task model overrides? (advanced \u2014 better quality / cost)",options:[{value:"no",label:"No, use one model everywhere",hint:"simpler \u2014 debug one model"},{value:"yes",label:"Yes, configure smart split",hint:"~5\xD7 cheaper extraction + better AUDM/synthesis"}],initialValue:"no"});if(t.isCancel(a))return null;if(a==="yes"){let c=await t.text({message:"Extraction model (high-volume; cheap matters)",placeholder:e.LLM_EXTRACTION_MODEL||F.extraction});if(t.isCancel(c))return null;n.LLM_EXTRACTION_MODEL=c||e.LLM_EXTRACTION_MODEL||F.extraction;let u=await t.text({message:"Decision model (AUDM; smart matters)",placeholder:e.LLM_DECISION_MODEL||F.decision});if(t.isCancel(u))return null;n.LLM_DECISION_MODEL=u||e.LLM_DECISION_MODEL||F.decision;let h=await t.text({message:"Synthesis model (read-time answer composition)",placeholder:e.SIGIL_SYNTH_MODEL||F.synthesis});if(t.isCancel(h))return null;n.SIGIL_SYNTH_MODEL=h||e.SIGIL_SYNTH_MODEL||F.synthesis}return t.note(`OpenRouter can drive both LLM calls and embeddings.
7
8
  You will pick an embedding provider in the next step \u2014 "openrouter" is an option,
8
- or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"OpenRouter scope"),{env:n}}var Gr,Wr,bt,x,Ot=f(()=>{g();Gr="https://openrouter.ai/api/v1";Wr={id:"openrouter",label:"OpenRouter",hint:"one key, many models (Anthropic / OpenAI / Meta / ...)"},bt="google/gemini-flash-latest",x={extraction:"openrouter:qwen/qwen3.5-flash",decision:"openrouter:anthropic/claude-sonnet-latest",synthesis:"openrouter:anthropic/claude-sonnet-latest"}});var Tt={};I(Tt,{chat:()=>zr,meta:()=>Xr,setup:()=>Zr});import{spawn as jr}from"node:child_process";function qr(e,t){let n=c.llm.cliTimeout||12e4;return new Promise((r,o)=>{let i=jr("claude",e,{stdio:["pipe","pipe","pipe"]}),s=setTimeout(()=>{i.kill("SIGTERM"),o(new Error(`claude CLI timed out after ${n}ms`))},n),a="",l="";i.stdout.on("data",u=>{a+=u}),i.stderr.on("data",u=>{l+=u}),i.on("error",u=>{clearTimeout(s),o(new Error(`Failed to spawn claude CLI: ${u.message}`))}),i.on("close",u=>{clearTimeout(s),r({stdout:a,stderr:l,code:u})}),i.stdin.write(t),i.stdin.end()})}async function zr(e,{model:t,jsonMode:n=!1}={}){let r=t||c.llm.cliModel||"haiku",o=Vr[r]||r,i=["-p","--model",o,"--output-format","json"];n&&i.push("--json-schema",Jr);let{stdout:s,stderr:a,code:l}=await qr(i,e);if(l!==0)throw new Error(`claude CLI exited ${l}: ${(a||s).slice(0,500)}`);let u;try{u=JSON.parse(s)}catch{return{text:s.trim(),inputTokens:v(e),outputTokens:v(s),model:o}}if(u.is_error)throw new Error(`claude CLI error: ${u.result||"unknown error"}`);let h=n&&u.structured_output?JSON.stringify(u.structured_output):(u.result||"").trim(),E=u.usage||{};return{text:h,inputTokens:E.input_tokens||v(e),outputTokens:E.output_tokens||v(h),model:o,cost:u.total_cost_usd||0}}async function Zr(){return{env:{}}}var Vr,Jr,Xr,Nt=f(()=>{g();j();Vr={"claude-haiku-4-5-20251001":"haiku","claude-sonnet-4-6":"sonnet","claude-opus-4-6":"opus"},Jr=JSON.stringify({type:"object",additionalProperties:!0});Xr={id:"claude-cli",label:"Claude Code",hint:"uses your existing subscription \u2014 no extra API key"}});var Rt={};I(Rt,{chat:()=>Qr,meta:()=>eo,setup:()=>to});async function Qr(e,{model:t,jsonMode:n=!1}={}){let r=t||c.llm.ollamaModel,o=`${c.llm.ollamaHost}/api/chat`,i={model:r,messages:[{role:"user",content:e}],stream:!1};n&&(i.format="json");let s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!s.ok){let l=await s.text();throw new Error(`Ollama error ${s.status}: ${l}`)}let a=await s.json();return{text:a.message.content.trim(),inputTokens:a.prompt_eval_count||v(e),outputTokens:a.eval_count||v(a.message.content),model:r}}async function to({existing:e,clack:t}){let n=e.OLLAMA_HOST||"http://localhost:11434",r=await t.text({message:"Ollama host",placeholder:n,initialValue:n,validate:o=>{if(o&&!/^https?:\/\//.test(o))return"Must start with http:// or https://"}});return t.isCancel(r)?null:{env:{OLLAMA_HOST:r||n}}}var eo,Dt=f(()=>{g();j();eo={id:"ollama",label:"Ollama",hint:"local models \u2014 no API cost"}});var vt={};I(vt,{embedBatch:()=>ro});async function ro(e,{model:t,ollamaHost:n}){let r=te(e,no),o=[];for(let i of r){let s=await fetch(`${n}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:t,input:i})});if(!s.ok)throw new Error(`Ollama embed failed: ${s.status} ${await s.text()}`);let a=await s.json();o.push(...a.embeddings)}return o}var no,Ct=f(()=>{ne();no=50});var Lt={};I(Lt,{embedBatch:()=>oo});async function oo(e,{model:t,openaiApiKey:n,dimensions:r}={}){let o={model:t,input:e};r&&/^text-embedding-3/.test(t)&&(o.dimensions=r);let i=await fetch("https://api.openai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(o)});if(!i.ok)throw new Error(`OpenAI embed failed: ${i.status} ${await i.text()}`);return(await i.json()).data.map(a=>a.embedding)}var Pt=f(()=>{});var Mt={};I(Mt,{embedBatch:()=>ao});async function ao(e,{model:t,voyageApiKey:n,inputType:r="document",dimensions:o}={}){if(!n)throw new Error("VOYAGE_API_KEY is not set. Get one at dashboard.voyageai.com.");let i=te(e,io),s=[];for(let a of i){let l={input:a,model:t||"voyage-3-large",input_type:r==="query"?"query":"document"};o&&(l.output_dimension=o);let u=await fetch("https://api.voyageai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(l)});if(!u.ok){let m=await u.text();throw new Error(`Voyage embed failed: ${u.status} ${m}`)}let E=[...(await u.json()).data].sort((m,d)=>m.index-d.index);s.push(...E.map(m=>m.embedding))}return s}var io,xt=f(()=>{ne();io=50});var kt={};I(kt,{embedBatch:()=>co});async function co(e,{model:t,openrouterApiKey:n,openrouterBaseUrl:r,openrouterReferer:o,openrouterTitle:i,dimensions:s}={}){if(!n)throw new Error("OPENROUTER_API_KEY is not set");if(!t)throw new Error('No OpenRouter embedding model resolved. Set EMBEDDING_MODEL (e.g. "openai/text-embedding-3-large").');let a={model:t,input:e};s&&/(^|\/)text-embedding-3/.test(t)&&(a.dimensions=s);let l=(r||so).replace(/\/+$/,""),u={"Content-Type":"application/json",Authorization:`Bearer ${n}`};o&&(u["HTTP-Referer"]=o),i&&(u["X-Title"]=i);let h=await fetch(`${l}/embeddings`,{method:"POST",headers:u,body:JSON.stringify(a)});if(!h.ok)throw new Error(`OpenRouter embed failed: ${h.status} ${await h.text()}`);return[...(await h.json()).data].sort((d,_)=>d.index-_.index).map(d=>d.embedding)}var so,Ft=f(()=>{so="https://openrouter.ai/api/v1"});import{spawn as lo}from"node:child_process";async function De(e){if(!Te[e]){let t=Re[e];if(!t)throw new Error(`Unknown LLM provider: "${e}". Available: ${Object.keys(Re).join(", ")}`);let n=await t();Te[e]=n.chat}return Te[e]}async function Ht(e){if(!Ne[e]){let t=Bt[e];if(!t)throw new Error(`Unknown embedding provider: "${e}". Available: ${Object.keys(Bt).join(", ")}`);let n=await t();Ne[e]=n.embedBatch}return Ne[e]}function $t(e,t){if(!e)return{provider:t,model:null};let n=e.indexOf(":");return n>0&&Re[e.slice(0,n)]?{provider:e.slice(0,n),model:e.slice(n+1)}:{provider:t,model:e}}async function Ut(){let e=c.llm.ollamaHost||c.embedding.ollamaHost||"http://localhost:11434";try{return(await fetch(`${e}/api/tags`,{signal:AbortSignal.timeout(2e3)})).ok}catch{return!1}}function uo(){return new Promise(e=>{let t=lo("claude",["--version"],{stdio:"pipe"});t.on("error",()=>e(!1)),t.on("close",n=>e(n===0)),setTimeout(()=>{t.kill(),e(!1)},3e3)})}async function Gt(){if(N)return N;if(c.llm.provider)return N=c.llm.provider,N;if(c.llm.openrouterApiKey)return N="openrouter",N;if(c.llm.apiKey)return N="anthropic",N;if(c.llm.openaiApiKey)return N="openai",N;if(await Ut())return N="ollama",N;if(await uo())return N="claude-cli",N;throw new Error(`No LLM provider available. Either:
9
+ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"OpenRouter scope"),{env:n}}var co,uo,$t,F,Ut=f(()=>{I();co="https://openrouter.ai/api/v1";uo={id:"openrouter",label:"OpenRouter",hint:"one key, many models (Anthropic / OpenAI / Meta / ...)"},$t="google/gemini-flash-latest",F={extraction:"openrouter:qwen/qwen3.5-flash",decision:"openrouter:anthropic/claude-sonnet-latest",synthesis:"openrouter:anthropic/claude-sonnet-latest"}});var Ht={};T(Ht,{chat:()=>Eo,meta:()=>yo,setup:()=>go});import{spawn as mo}from"node:child_process";function _o(e,t){let n=l.llm.cliTimeout||12e4;return new Promise((r,o)=>{let i=mo("claude",e,{stdio:["pipe","pipe","pipe"]}),s=setTimeout(()=>{i.kill("SIGTERM"),o(new Error(`claude CLI timed out after ${n}ms`))},n),a="",c="";i.stdout.on("data",u=>{a+=u}),i.stderr.on("data",u=>{c+=u}),i.on("error",u=>{clearTimeout(s),o(new Error(`Failed to spawn claude CLI: ${u.message}`))}),i.on("close",u=>{clearTimeout(s),r({stdout:a,stderr:c,code:u})}),i.stdin.write(t),i.stdin.end()})}async function Eo(e,{model:t,jsonMode:n=!1}={}){let r=t||l.llm.cliModel||"haiku",o=fo[r]||r,i=["-p","--model",o,"--output-format","json"];n&&i.push("--json-schema",ho);let{stdout:s,stderr:a,code:c}=await _o(i,e);if(c!==0)throw new Error(`claude CLI exited ${c}: ${(a||s).slice(0,500)}`);let u;try{u=JSON.parse(s)}catch{return{text:s.trim(),inputTokens:C(e),outputTokens:C(s),model:o}}if(u.is_error)throw new Error(`claude CLI error: ${u.result||"unknown error"}`);let h=n&&u.structured_output?JSON.stringify(u.structured_output):(u.result||"").trim(),y=u.usage||{};return{text:h,inputTokens:y.input_tokens||C(e),outputTokens:y.output_tokens||C(h),model:o,cost:u.total_cost_usd||0}}async function go(){return{env:{}}}var fo,ho,yo,Gt=f(()=>{I();z();fo={"claude-haiku-4-5-20251001":"haiku","claude-sonnet-4-6":"sonnet","claude-opus-4-6":"opus"},ho=JSON.stringify({type:"object",additionalProperties:!0});yo={id:"claude-cli",label:"Claude Code",hint:"uses your existing subscription \u2014 no extra API key"}});var Wt={};T(Wt,{chat:()=>wo,meta:()=>So,setup:()=>Ao});async function wo(e,{model:t,jsonMode:n=!1}={}){let r=t||l.llm.ollamaModel,o=`${l.llm.ollamaHost}/api/chat`,i={model:r,messages:[{role:"user",content:e}],stream:!1};n&&(i.format="json");let s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!s.ok){let c=await s.text();throw new Error(`Ollama error ${s.status}: ${c}`)}let a=await s.json();return{text:a.message.content.trim(),inputTokens:a.prompt_eval_count||C(e),outputTokens:a.eval_count||C(a.message.content),model:r}}async function Ao({existing:e,clack:t}){let n=e.OLLAMA_HOST||"http://localhost:11434",r=await t.text({message:"Ollama host",placeholder:n,initialValue:n,validate:o=>{if(o&&!/^https?:\/\//.test(o))return"Must start with http:// or https://"}});return t.isCancel(r)?null:{env:{OLLAMA_HOST:r||n}}}var So,Yt=f(()=>{I();z();So={id:"ollama",label:"Ollama",hint:"local models \u2014 no API cost"}});var Kt={};T(Kt,{embedBatch:()=>bo});async function bo(e,{model:t,ollamaHost:n}){let r=le(e,Io),o=[];for(let i of r){let s=await fetch(`${n}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:t,input:i})});if(!s.ok)throw new Error(`Ollama embed failed: ${s.status} ${await s.text()}`);let a=await s.json();o.push(...a.embeddings)}return o}var Io,jt=f(()=>{ue();Io=50});var Vt={};T(Vt,{embedBatch:()=>Oo});async function Oo(e,{model:t,openaiApiKey:n,dimensions:r}={}){let o={model:t,input:e};r&&/^text-embedding-3/.test(t)&&(o.dimensions=r);let i=await fetch("https://api.openai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(o)});if(!i.ok)throw new Error(`OpenAI embed failed: ${i.status} ${await i.text()}`);return(await i.json()).data.map(a=>a.embedding)}var Jt=f(()=>{});var qt={};T(qt,{embedBatch:()=>No});async function No(e,{model:t,voyageApiKey:n,inputType:r="document",dimensions:o}={}){if(!n)throw new Error("VOYAGE_API_KEY is not set. Get one at dashboard.voyageai.com.");let i=le(e,To),s=[];for(let a of i){let c={input:a,model:t||"voyage-3-large",input_type:r==="query"?"query":"document"};o&&(c.output_dimension=o);let u=await fetch("https://api.voyageai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(c)});if(!u.ok){let m=await u.text();throw new Error(`Voyage embed failed: ${u.status} ${m}`)}let y=[...(await u.json()).data].sort((m,p)=>m.index-p.index);s.push(...y.map(m=>m.embedding))}return s}var To,zt=f(()=>{ue();To=50});var Xt={};T(Xt,{embedBatch:()=>Do});async function Do(e,{model:t,openrouterApiKey:n,openrouterBaseUrl:r,openrouterReferer:o,openrouterTitle:i,dimensions:s}={}){if(!n)throw new Error("OPENROUTER_API_KEY is not set");if(!t)throw new Error('No OpenRouter embedding model resolved. Set EMBEDDING_MODEL (e.g. "openai/text-embedding-3-large").');let a={model:t,input:e};s&&/(^|\/)text-embedding-3/.test(t)&&(a.dimensions=s);let c=(r||Ro).replace(/\/+$/,""),u={"Content-Type":"application/json",Authorization:`Bearer ${n}`};o&&(u["HTTP-Referer"]=o),i&&(u["X-Title"]=i);let h=await fetch(`${c}/embeddings`,{method:"POST",headers:u,body:JSON.stringify(a)});if(!h.ok)throw new Error(`OpenRouter embed failed: ${h.status} ${await h.text()}`);return[...(await h.json()).data].sort((p,w)=>p.index-w.index).map(p=>p.embedding)}var Ro,Zt=f(()=>{Ro="https://openrouter.ai/api/v1"});import{spawn as vo}from"node:child_process";async function Me(e){if(!Ce[e]){let t=Pe[e];if(!t)throw new Error(`Unknown LLM provider: "${e}". Available: ${Object.keys(Pe).join(", ")}`);let n=await t();Ce[e]=n.chat}return Ce[e]}async function en(e){if(!xe[e]){let t=Qt[e];if(!t)throw new Error(`Unknown embedding provider: "${e}". Available: ${Object.keys(Qt).join(", ")}`);let n=await t();xe[e]=n.embedBatch}return xe[e]}function tn(e,t){if(!e)return{provider:t,model:null};let n=e.indexOf(":");return n>0&&Pe[e.slice(0,n)]?{provider:e.slice(0,n),model:e.slice(n+1)}:{provider:t,model:e}}async function nn(){let e=l.llm.ollamaHost||l.embedding.ollamaHost||"http://localhost:11434";try{return(await fetch(`${e}/api/tags`,{signal:AbortSignal.timeout(2e3)})).ok}catch{return!1}}function Lo(){return new Promise(e=>{let t=vo("claude",["--version"],{stdio:"pipe"});t.on("error",()=>e(!1)),t.on("close",n=>e(n===0)),setTimeout(()=>{t.kill(),e(!1)},3e3)})}async function rn(){if(D)return D;if(l.llm.provider)return D=l.llm.provider,D;if(l.llm.openrouterApiKey)return D="openrouter",D;if(l.llm.apiKey)return D="anthropic",D;if(l.llm.openaiApiKey)return D="openai",D;if(await nn())return D="ollama",D;if(await Lo())return D="claude-cli",D;throw new Error(`No LLM provider available. Either:
9
10
  - Set LLM_PROVIDER (openai, anthropic, openrouter, ollama, claude-cli)
10
11
  - Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY
11
12
  - Start Ollama locally
12
- - Install the Claude CLI (claude)`)}async function Yt(){if(R)return R;if(c.embedding.provider)return R=c.embedding.provider,R;if(c.embedding.voyageApiKey)return R="voyage",R;if(await Ut())return R="ollama",R;if(c.embedding.openaiApiKey)return R="openai",R;if(c.embedding.openrouterApiKey)return R="openrouter",R;throw new Error(`No embedding provider available. Either:
13
+ - Install the Claude CLI (claude)`)}async function on(){if(L)return L;if(l.embedding.provider)return L=l.embedding.provider,L;if(l.embedding.voyageApiKey)return L="voyage",L;if(await nn())return L="ollama",L;if(l.embedding.openaiApiKey)return L="openai",L;if(l.embedding.openrouterApiKey)return L="openrouter",L;throw new Error(`No embedding provider available. Either:
13
14
  - Set EMBEDDING_PROVIDER (voyage, ollama, openai, openrouter)
14
15
  - Set VOYAGE_API_KEY (recommended \u2014 best quality)
15
16
  - Start Ollama locally
16
17
  - Set OPENAI_API_KEY
17
- - Set OPENROUTER_API_KEY (and EMBEDDING_MODEL like "openai/text-embedding-3-large")`)}var Re,Bt,Te,Ne,N,R,ve=f(()=>{g();Re={openai:()=>Promise.resolve().then(()=>(wt(),gt)),anthropic:()=>Promise.resolve().then(()=>(At(),St)),openrouter:()=>Promise.resolve().then(()=>(Ot(),It)),"claude-cli":()=>Promise.resolve().then(()=>(Nt(),Tt)),ollama:()=>Promise.resolve().then(()=>(Dt(),Rt))},Bt={ollama:()=>Promise.resolve().then(()=>(Ct(),vt)),openai:()=>Promise.resolve().then(()=>(Pt(),Lt)),voyage:()=>Promise.resolve().then(()=>(xt(),Mt)),openrouter:()=>Promise.resolve().then(()=>(Ft(),kt))},Te={},Ne={};N=null,R=null});function L(e){return e?`[${e.join(",")}]`:null}function Wt(){let e=Number(c.embedding.dimensions)||768;if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid EMBEDDING_DIMENSIONS: ${c.embedding.dimensions}`);return e}function k(e="embedding"){return`(${e}::halfvec(${Wt()}))`}function F(){return`?::halfvec(${Wt()})`}var B=f(()=>{g()});import{createHash as po}from"node:crypto";function fo(e,t,n,r="document"){let o=po("sha256");return o.update(e),o.update("\0"),o.update(t),o.update("\0"),o.update(r),o.update("\0"),o.update(n),o.digest("hex")}async function ho(e){if(!e.length)return new Map;let t=await p("embedding_cache").whereIn("key",e).select("key","embedding");return new Map(t.map(n=>[n.key,Eo(n.embedding)]))}function Eo(e){return Array.isArray(e)||typeof e!="string"?e:(e.startsWith("[")?e.slice(1,-1):e).split(",").map(Number)}async function _o(e){e.length&&await p("embedding_cache").whereIn("key",e).update({hits:p.raw("hits + 1"),lastUsedAt:p.fn.now()})}async function yo(e,t,n){if(e.length){for(let{key:r,embedding:o}of e)await p.raw(`
18
+ - Set OPENROUTER_API_KEY (and EMBEDDING_MODEL like "openai/text-embedding-3-large")`)}var Pe,Qt,Ce,xe,D,L,ke=f(()=>{I();Pe={openai:()=>Promise.resolve().then(()=>(Mt(),Pt)),anthropic:()=>Promise.resolve().then(()=>(Bt(),kt)),openrouter:()=>Promise.resolve().then(()=>(Ut(),Ft)),"claude-cli":()=>Promise.resolve().then(()=>(Gt(),Ht)),ollama:()=>Promise.resolve().then(()=>(Yt(),Wt))},Qt={ollama:()=>Promise.resolve().then(()=>(jt(),Kt)),openai:()=>Promise.resolve().then(()=>(Jt(),Vt)),voyage:()=>Promise.resolve().then(()=>(zt(),qt)),openrouter:()=>Promise.resolve().then(()=>(Zt(),Xt))},Ce={},xe={};D=null,L=null});function P(e){return e?`[${e.join(",")}]`:null}function an(){let e=Number(l.embedding.dimensions)||768;if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid EMBEDDING_DIMENSIONS: ${l.embedding.dimensions}`);return e}function U(e="embedding"){return`(${e}::halfvec(${an()}))`}function H(){return`?::halfvec(${an()})`}var G=f(()=>{I()});import{createHash as Co}from"node:crypto";function Po(e,t,n,r="document"){let o=Co("sha256");return o.update(e),o.update("\0"),o.update(t),o.update("\0"),o.update(r),o.update("\0"),o.update(n),o.digest("hex")}async function Mo(e){if(!e.length)return new Map;let t=await d("embedding_cache").whereIn("key",e).select("key","embedding");return new Map(t.map(n=>[n.key,ko(n.embedding)]))}function ko(e){return Array.isArray(e)||typeof e!="string"?e:(e.startsWith("[")?e.slice(1,-1):e).split(",").map(Number)}async function Bo(e){e.length&&await d("embedding_cache").whereIn("key",e).update({hits:d.raw("hits + 1"),lastUsedAt:d.fn.now()})}async function $o(e,t,n){if(e.length){for(let{key:r,embedding:o}of e)await d.raw(`
18
19
  INSERT INTO embedding_cache (key, provider, model, embedding, hits, created_at, last_used_at)
19
20
  VALUES (?, ?, ?, ?, 0, NOW(), NOW())
20
21
  ON CONFLICT (key) DO UPDATE
21
22
  SET last_used_at = NOW(),
22
23
  hits = embedding_cache.hits + 1
23
- `,[r,t,n,L(o)]);await wo()}}async function wo(){let e=Date.now();if(e-jt<go)return;jt=e;let[{count:t}]=await p("embedding_cache").count("key as count"),n=Number(t);if(n<=Kt)return;let r=Math.min(n-Kt,mo);await p.raw(`
24
+ `,[r,t,n,P(o)]);await Uo()}}async function Uo(){let e=Date.now();if(e-cn<Fo)return;cn=e;let[{count:t}]=await d("embedding_cache").count("key as count"),n=Number(t);if(n<=sn)return;let r=Math.min(n-sn,xo);await d.raw(`
24
25
  DELETE FROM embedding_cache WHERE key IN (
25
26
  SELECT key FROM embedding_cache ORDER BY last_used_at ASC LIMIT ?
26
27
  )
27
- `,[r])}async function Vt(e,t,n,r,o,i={}){if(!e.length)return[];let s=i.inputType||o?.inputType||"document",a=e.map(d=>fo(t,n,d,s)),l=await ho(a),u=[],h=[],E=new Array(e.length);for(let d=0;d<e.length;d++){let _=l.get(a[d]);_?E[d]=_:(u.push(e[d]),h.push(d))}if(u.length){let d=await r(u,o),_=[];for(let y=0;y<u.length;y++){let w=h[y];E[w]=d[y],_.push({key:a[w],embedding:d[y]})}yo(_,t,n).catch(y=>{process.stderr.write(`[embedding-cache] store failed: ${y.message}
28
- `)})}let m=a.filter(d=>l.has(d));return m.length&&_o(m).catch(()=>{}),E}var Kt,mo,jt,go,Jt=f(()=>{B();A();Kt=1e4,mo=500;jt=0,go=6e4});async function Ce(e,t={}){let[n]=await re([e],t);return n}async function re(e,{inputType:t="document"}={}){if(!e.length)return[];let n=await Yt(),r=await Ht(n),o=c.embedding.model,i={...c.embedding,inputType:t};return Vt(e,n,o,r,i,{inputType:t})}var Wa,Le=f(()=>{g();ve();Jt();({dimensions:Wa}=c.embedding)});var qt,zt=f(()=>{qt="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"});import{webcrypto as Xt}from"node:crypto";function Ao(e){!M||M.length<e?(M=Buffer.allocUnsafe(e*So),Xt.getRandomValues(M),H=0):H+e>M.length&&(Xt.getRandomValues(M),H=0),H+=e}function Zt(e=21){Ao(e|=0);let t="";for(let n=H-e;n<H;n++)t+=qt[M[n]&63];return t}var So,M,H,Qt=f(()=>{zt();So=128});async function en(e,t){let n=t||c.defaults.namespace,r=e.toLowerCase();return p("entity").where({namespace:n}).whereNull("mergedWith").where(function(){this.whereRaw("LOWER(name) = ?",[r]).orWhereRaw("aliases @> ARRAY[?]::text[]",[r])}).first()||null}async function tn(e,{entityType:t,namespace:n,limit:r=10}={}){let o=p("entity").whereRaw("LOWER(name) LIKE ?",[`%${e.toLowerCase()}%`]).whereNull("mergedWith").orderBy("mentionCount","desc").limit(r);return t&&o.where({entityType:t}),n&&o.where({namespace:n}),o}var nn=f(()=>{A();B();g()});async function oe({podType:e,externalId:t,name:n,namespace:r,attrs:o={},entityId:i=null,connectionId:s=null,startedAt:a=null}){if(!t)throw new Error("upsertPod requires externalId; use insertPod for custom pods");let l=`pod-${Zt(16)}`,u=r||c.defaults.namespace,{rows:[h]}=await p.raw(`
28
+ `,[r])}async function ln(e,t,n,r,o,i={}){if(!e.length)return[];let s=i.inputType||o?.inputType||"document",a=e.map(p=>Po(t,n,p,s)),c=await Mo(a),u=[],h=[],y=new Array(e.length);for(let p=0;p<e.length;p++){let w=c.get(a[p]);w?y[p]=w:(u.push(e[p]),h.push(p))}if(u.length){let p=await r(u,o),w=[];for(let _=0;_<u.length;_++){let O=h[_];y[O]=p[_],w.push({key:a[O],embedding:p[_]})}$o(w,t,n).catch(_=>{process.stderr.write(`[embedding-cache] store failed: ${_.message}
29
+ `)})}let m=a.filter(p=>c.has(p));return m.length&&Bo(m).catch(()=>{}),y}var sn,xo,cn,Fo,un=f(()=>{G();b();sn=1e4,xo=500;cn=0,Fo=6e4});async function Be(e,t={}){let[n]=await de([e],t);return n}async function de(e,{inputType:t="document"}={}){if(!e.length)return[];let n=await on(),r=await en(n),o=l.embedding.model,i={...l.embedding,inputType:t};return ln(e,n,o,r,i,{inputType:t})}var Fs,$e=f(()=>{I();ke();un();({dimensions:Fs}=l.embedding)});var dn,pn=f(()=>{dn="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"});import{webcrypto as mn}from"node:crypto";function Go(e){if(e<0||e>1024)throw new RangeError("Wrong ID size");!k||k.length<e?(k=Buffer.allocUnsafe(e*Ho),mn.getRandomValues(k),W=0):W+e>k.length&&(mn.getRandomValues(k),W=0),W+=e}function pe(e=21){Go(e|=0);let t="";for(let n=W-e;n<W;n++)t+=dn[k[n]&63];return t}var Ho,k,W,Fe=f(()=>{pn();Ho=128});async function fn(e,t){let n=t||l.defaults.namespace,r=e.toLowerCase();return d("entity").where({namespace:n}).whereNull("mergedWith").where(function(){this.whereRaw("LOWER(name) = ?",[r]).orWhereRaw("aliases @> ARRAY[?]::text[]",[r])}).first()||null}async function hn(e,{entityType:t,namespace:n,limit:r=10}={}){let o=d("entity").whereRaw("LOWER(name) LIKE ?",[`%${e.toLowerCase()}%`]).whereNull("mergedWith").orderBy("mentionCount","desc").limit(r);return t&&o.where({entityType:t}),n&&o.where({namespace:n}),o}var _n=f(()=>{b();G();I()});async function me({podType:e,externalId:t,name:n,namespace:r,attrs:o={},entityId:i=null,connectionId:s=null,startedAt:a=null}){if(!t)throw new Error("upsertPod requires externalId; use insertPod for custom pods");let c=`pod-${pe(16)}`,u=r||l.defaults.namespace,{rows:[h]}=await d.raw(`
29
30
  INSERT INTO pod (uid, pod_type, name, namespace, attrs, entity_id, connection_id, external_id, started_at, created_at, updated_at)
30
31
  VALUES (?, ?, ?, ?, ?::jsonb, ?, ?, ?, ?, NOW(), NOW())
31
32
  ON CONFLICT (pod_type, external_id, namespace) WHERE external_id IS NOT NULL DO UPDATE SET
32
33
  attrs = pod.attrs || EXCLUDED.attrs,
33
34
  updated_at = NOW()
34
35
  RETURNING *, (xmax = 0) AS "isNew"
35
- `,[l,e,n,u,JSON.stringify(o),i,s,t,a]);return{pod:h,isNew:h.isNew}}async function Pe(e){return p("pod").where({uid:e}).first()||null}async function rn({podType:e,externalId:t,namespace:n}){return p("pod").where({podType:e,externalId:t,namespace:n||c.defaults.namespace}).first()||null}async function Me(e,t){await p.raw("UPDATE pod SET attrs = attrs || ?::jsonb, updated_at = NOW() WHERE id = ?",[JSON.stringify(t),e])}async function on(e,t=new Date){await p("pod").where({id:e}).update({endedAt:t,updatedAt:p.fn.now()})}async function V(e,{docs:t=0,facts:n=0}){!t&&!n||await p.raw(`UPDATE pod
36
+ `,[c,e,n,u,JSON.stringify(o),i,s,t,a]);return{pod:h,isNew:h.isNew}}async function Ue(e){return d("pod").where({uid:e}).first()||null}async function En({podType:e,externalId:t,namespace:n}){return d("pod").where({podType:e,externalId:t,namespace:n||l.defaults.namespace}).first()||null}async function He(e,t){await d.raw("UPDATE pod SET attrs = attrs || ?::jsonb, updated_at = NOW() WHERE id = ?",[JSON.stringify(t),e])}async function yn(e,t=new Date){await d("pod").where({id:e}).update({endedAt:t,updatedAt:d.fn.now()})}async function X(e,{docs:t=0,facts:n=0}){!t&&!n||await d.raw(`UPDATE pod
36
37
  SET member_doc_count = member_doc_count + ?,
37
38
  member_fact_count = member_fact_count + ?,
38
39
  updated_at = NOW()
39
- WHERE id = ?`,[t,n,e])}var ie=f(()=>{Qt();A();g()});var se={};I(se,{attach:()=>ae,attachDocument:()=>bo,attachEntity:()=>Io,attachFact:()=>sn,detach:()=>Oo,factIdsInPod:()=>Ro,listMembers:()=>To,listPodsForMember:()=>No});async function ae(e,t,n,r="primary"){let{rowCount:o}=await p.raw(`INSERT INTO pod_membership (pod_id, member_type, member_id, role)
40
+ WHERE id = ?`,[t,n,e])}var fe=f(()=>{Fe();b();I()});var _e={};T(_e,{attach:()=>he,attachDocument:()=>Wo,attachEntity:()=>Yo,attachFact:()=>wn,detach:()=>Ko,factIdsInPod:()=>Jo,listMembers:()=>jo,listPodsForMember:()=>Vo});async function he(e,t,n,r="primary"){let{rowCount:o}=await d.raw(`INSERT INTO pod_membership (pod_id, member_type, member_id, role)
40
41
  VALUES (?, ?, ?, ?)
41
- ON CONFLICT (pod_id, member_type, member_id) DO NOTHING`,[e,t,n,r]);return o>0&&(t==="fact"?await V(e,{facts:1}):t==="document"&&await V(e,{docs:1})),{attached:o>0}}async function Oo(e,t,n){let r=await p("pod_membership").where({podId:e,memberType:t,memberId:n}).del();return r>0&&(t==="fact"?await V(e,{facts:-1}):t==="document"&&await V(e,{docs:-1})),{detached:r>0}}async function To(e,{memberType:t,limit:n=20}={}){if(!t)throw new Error("listMembers requires a memberType filter");return p(`${t} as t`).join("pod_membership as pm",function(){this.on("pm.member_id","=","t.id").andOnVal("pm.member_type","=",t)}).where("pm.pod_id",e).orderBy("pm.createdAt","desc").limit(n).select("t.*","pm.role as podRole","pm.createdAt as attachedAt")}async function No(e,t){return p("pod as p").join("pod_membership as pm","pm.pod_id","p.id").where("pm.memberType",e).where("pm.memberId",t).select("p.*","pm.role as podRole")}async function Ro(e){return await p("pod_membership").where({podId:e,memberType:"fact"}).pluck("memberId")}var sn,bo,Io,xe=f(()=>{A();ie();sn=(e,t,n)=>ae(e,"fact",t,n),bo=(e,t,n)=>ae(e,"document",t,n),Io=(e,t,n)=>ae(e,"entity",t,n)});async function cn(e,{limit:t=50}={}){return p("fact").join("fact_entity","fact.id","fact_entity.fact_id").where("fact_entity.entity_id",e).where("fact.status","active").select("fact.*","fact_entity.mention_count as entityMentionCount").orderBy("fact_entity.mention_count","desc").limit(t)}async function J(e){if(!e.length)return new Map;let t=await p("fact_entity").whereIn("factId",e).select("factId","entityId"),n=new Map;for(let r of t)n.has(r.factId)||n.set(r.factId,[]),n.get(r.factId).push(r.entityId);return n}var ce=f(()=>{A();xe()});async function ln(e){let t=await Gt();return $t(e,t)}async function ke(e,{model:t,caller:n}={}){let{provider:r,model:o}=await ln(t),i=await De(r),s=Date.now();try{let a=await Ie(()=>i(e,{model:o,jsonMode:!1}),c.llm.maxRetries),l=a.cost||be(a.model,a.inputTokens,a.outputTokens);return K({provider:r,model:a.model,caller:n,input:e,response:a.text,inputTokens:a.inputTokens,outputTokens:a.outputTokens,cost:l,durationMs:Date.now()-s,status:"success"}),a.text}catch(a){throw K({provider:r,model:o,caller:n,input:e,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-s,status:"error",error:a.message}),a}}async function le(e,{model:t,caller:n}={}){let{provider:r,model:o}=await ln(t),i=await De(r),s=Date.now();try{let a=await Ie(()=>i(e,{model:o,jsonMode:!0}),c.llm.maxRetries),l=a.cost||be(a.model,a.inputTokens,a.outputTokens);return K({provider:r,model:a.model,caller:n,input:e,response:a.text,inputTokens:a.inputTokens,outputTokens:a.outputTokens,cost:l,durationMs:Date.now()-s,status:"success"}),Do(a.text)}catch(a){throw K({provider:r,model:o,caller:n,input:e,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-s,status:"error",error:a.message}),a}}function Do(e){try{return JSON.parse(e.trim())}catch{}let t=e.match(/```(?:json)?\s*([\s\S]*?)```/);if(t)try{return JSON.parse(t[1].trim())}catch{}let n=e.match(/[\[{][\s\S]*[\]}]/);if(n)try{return JSON.parse(n[0])}catch{}return null}var q=f(()=>{g();ve();j()});import vo from"node:path";async function un(e){e.length&&await p.raw(`UPDATE fact_lifecycle
42
+ ON CONFLICT (pod_id, member_type, member_id) DO NOTHING`,[e,t,n,r]);return o>0&&(t==="fact"?await X(e,{facts:1}):t==="document"&&await X(e,{docs:1})),{attached:o>0}}async function Ko(e,t,n){let r=await d("pod_membership").where({podId:e,memberType:t,memberId:n}).del();return r>0&&(t==="fact"?await X(e,{facts:-1}):t==="document"&&await X(e,{docs:-1})),{detached:r>0}}async function jo(e,{memberType:t,limit:n=20}={}){if(!t)throw new Error("listMembers requires a memberType filter");return d(`${t} as t`).join("pod_membership as pm",function(){this.on("pm.member_id","=","t.id").andOnVal("pm.member_type","=",t)}).where("pm.pod_id",e).orderBy("pm.createdAt","desc").limit(n).select("t.*","pm.role as podRole","pm.createdAt as attachedAt")}async function Vo(e,t){return d("pod as p").join("pod_membership as pm","pm.pod_id","p.id").where("pm.memberType",e).where("pm.memberId",t).select("p.*","pm.role as podRole")}async function Jo(e){return await d("pod_membership").where({podId:e,memberType:"fact"}).pluck("memberId")}var wn,Wo,Yo,Ge=f(()=>{b();fe();wn=(e,t,n)=>he(e,"fact",t,n),Wo=(e,t,n)=>he(e,"document",t,n),Yo=(e,t,n)=>he(e,"entity",t,n)});async function Sn(e,{limit:t=50}={}){return d("fact").join("fact_entity","fact.id","fact_entity.fact_id").where("fact_entity.entity_id",e).where("fact.status","active").select("fact.*","fact_entity.mention_count as entityMentionCount").orderBy("fact_entity.mention_count","desc").limit(t)}async function Z(e){if(!e.length)return new Map;let t=await d("fact_entity").whereIn("factId",e).select("factId","entityId"),n=new Map;for(let r of t)n.has(r.factId)||n.set(r.factId,[]),n.get(r.factId).push(r.entityId);return n}var Ee=f(()=>{b();Ge()});async function An(e){let t=await rn();return tn(e,t)}async function We(e,{model:t,caller:n}={}){let{provider:r,model:o}=await An(t),i=await Me(r),s=Date.now();try{let a=await ve(()=>i(e,{model:o,jsonMode:!1}),l.llm.maxRetries),c=a.cost||De(a.model,a.inputTokens,a.outputTokens);return q({provider:r,model:a.model,caller:n,input:e,response:a.text,inputTokens:a.inputTokens,outputTokens:a.outputTokens,cost:c,durationMs:Date.now()-s,status:"success"}),a.text}catch(a){throw q({provider:r,model:o,caller:n,input:e,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-s,status:"error",error:a.message}),a}}async function ye(e,{model:t,caller:n}={}){let{provider:r,model:o}=await An(t),i=await Me(r),s=Date.now();try{let a=await ve(()=>i(e,{model:o,jsonMode:!0}),l.llm.maxRetries),c=a.cost||De(a.model,a.inputTokens,a.outputTokens);return q({provider:r,model:a.model,caller:n,input:e,response:a.text,inputTokens:a.inputTokens,outputTokens:a.outputTokens,cost:c,durationMs:Date.now()-s,status:"success"}),qo(a.text)}catch(a){throw q({provider:r,model:o,caller:n,input:e,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-s,status:"error",error:a.message}),a}}function qo(e){try{return JSON.parse(e.trim())}catch{}let t=e.match(/```(?:json)?\s*([\s\S]*?)```/);if(t)try{return JSON.parse(t[1].trim())}catch{}let n=e.match(/[\[{][\s\S]*[\]}]/);if(n)try{return JSON.parse(n[0])}catch{}return null}var Q=f(()=>{I();ke();z()});import zo from"node:path";async function In(e){e.length&&await d.raw(`UPDATE fact_lifecycle
42
43
  SET access_count = access_count + 1,
43
44
  last_accessed_at = NOW(),
44
45
  stage = CASE WHEN stage = 'stable' THEN 'editing' ELSE stage END,
45
46
  stage_entered_at = CASE WHEN stage = 'stable' THEN NOW() ELSE stage_entered_at END
46
- WHERE fact_id = ANY(?)`,[e])}var ys,gs,ws,dn=f(()=>{A();Le();q();B();g();P();ys=vo.join(Z,"audm-decision.md"),gs=c.memory.skipThreshold,ws=c.memory.ambiguousThreshold});async function pn(e){if(!e||e.length<2)return;let t=[...new Set(e.filter(i=>Number.isInteger(i)))].sort((i,s)=>i-s);if(t.length<2)return;let n=[];for(let i=0;i<t.length;i++)for(let s=i+1;s<t.length;s++)n.push([t[i],t[s]]);let r=n.map(()=>"(?, ?, 1, NOW(), NOW())").join(", "),o=n.flat();await p.raw(`
47
+ WHERE fact_id = ANY(?)`,[e])}var fc,hc,_c,bn=f(()=>{b();$e();Q();G();oe();I();M();fc=zo.join(ae,"audm-decision.md"),hc=l.memory.skipThreshold,_c=l.memory.ambiguousThreshold});async function On(e){if(!e||e.length<2)return;let t=[...new Set(e.filter(i=>Number.isInteger(i)))].sort((i,s)=>i-s);if(t.length<2)return;let n=[];for(let i=0;i<t.length;i++)for(let s=i+1;s<t.length;s++)n.push([t[i],t[s]]);let r=n.map(()=>"(?, ?, 1, NOW(), NOW())").join(", "),o=n.flat();await d.raw(`
47
48
  INSERT INTO hebbian_edge (fact_a_id, fact_b_id, strength, first_seen_at, last_seen_at)
48
49
  VALUES ${r}
49
50
  ON CONFLICT (fact_a_id, fact_b_id)
50
51
  DO UPDATE SET
51
52
  strength = hebbian_edge.strength + 1,
52
53
  last_seen_at = NOW()
53
- `,o)}var mn=f(()=>{A()});var fn={};I(fn,{consolidateEntityCoRetrievalEdges:()=>Po,getCoRetrievedEntities:()=>Lo,getEdgeStrengthsForRanking:()=>Be,getEntityHebbianStats:()=>Mo,strengthenEntityEdges:()=>Fe});function ue(e){return Co/Math.max(e,1)}async function Fe(e,t={}){if(!c.hebbian.entity.enabled||!e||e.length<2)return;let n=t.eta??c.hebbian.entity.eta,r=t.cap??c.hebbian.entity.cap,o=[...new Set(e.filter(l=>Number.isInteger(l)))].sort((l,u)=>l-u);if(o.length<2)return;let i=[];for(let l=0;l<o.length;l++)for(let u=l+1;u<o.length;u++)i.push([o[l],o[u]]);let s=i.map(()=>"(?, ?, ?, NOW(), NOW())").join(", "),a=i.flatMap(([l,u])=>[l,u,n]);await p.raw(`
54
+ `,o)}var Tn=f(()=>{b()});var Nn={};T(Nn,{consolidateEntityCoRetrievalEdges:()=>Qo,getCoRetrievedEntities:()=>Zo,getEdgeStrengthsForRanking:()=>Ke,getEntityHebbianStats:()=>ei,strengthenEntityEdges:()=>Ye});function ge(e){return Xo/Math.max(e,1)}async function Ye(e,t={}){if(!l.hebbian.entity.enabled||!e||e.length<2)return;let n=t.eta??l.hebbian.entity.eta,r=t.cap??l.hebbian.entity.cap,o=[...new Set(e.filter(c=>Number.isInteger(c)))].sort((c,u)=>c-u);if(o.length<2)return;let i=[];for(let c=0;c<o.length;c++)for(let u=c+1;u<o.length;u++)i.push([o[c],o[u]]);let s=i.map(()=>"(?, ?, ?, NOW(), NOW())").join(", "),a=i.flatMap(([c,u])=>[c,u,n]);await d.raw(`
54
55
  INSERT INTO entity_hebbian_edge (entity_a_id, entity_b_id, strength, first_seen_at, last_seen_at)
55
56
  VALUES ${s}
56
57
  ON CONFLICT (entity_a_id, entity_b_id)
57
58
  DO UPDATE SET
58
59
  strength = LEAST(entity_hebbian_edge.strength + ?, ?),
59
60
  last_seen_at = NOW()
60
- `,[...a,n,r])}async function Lo(e,t={}){if(!c.hebbian.entity.enabled)return[];let n=t.limit??10,r=t.minEffectiveStrength??c.hebbian.entity.minEffective,o=ue(t.halfLifeDays??c.hebbian.entity.halfLifeDays),{rows:i}=await p.raw(`
61
+ `,[...a,n,r])}async function Zo(e,t={}){if(!l.hebbian.entity.enabled)return[];let n=t.limit??10,r=t.minEffectiveStrength??l.hebbian.entity.minEffective,o=ge(t.halfLifeDays??l.hebbian.entity.halfLifeDays),{rows:i}=await d.raw(`
61
62
  SELECT
62
63
  CASE WHEN entity_a_id = ? THEN entity_b_id ELSE entity_a_id END AS "partnerId",
63
64
  (strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0))::float8 AS "effectiveStrength",
@@ -67,7 +68,7 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
67
68
  WHERE entity_a_id = ? OR entity_b_id = ?
68
69
  ORDER BY "effectiveStrength" DESC
69
70
  LIMIT ?
70
- `,[e,o,e,e,n*3]);return i.filter(s=>s.effectiveStrength>=r).slice(0,n)}async function Be(e,t,n={}){if(!c.hebbian.entity.enabled)return new Map;if(!e.length||!t.length)return new Map;let r=ue(n.halfLifeDays??c.hebbian.entity.halfLifeDays),o=[...new Set(e)],i=[...new Set(t)].filter(l=>!o.includes(l));if(!i.length)return new Map;let{rows:s}=await p.raw(`
71
+ `,[e,o,e,e,n*3]);return i.filter(s=>s.effectiveStrength>=r).slice(0,n)}async function Ke(e,t,n={}){if(!l.hebbian.entity.enabled)return new Map;if(!e.length||!t.length)return new Map;let r=ge(n.halfLifeDays??l.hebbian.entity.halfLifeDays),o=[...new Set(e)],i=[...new Set(t)].filter(c=>!o.includes(c));if(!i.length)return new Map;let{rows:s}=await d.raw(`
71
72
  SELECT
72
73
  CASE
73
74
  WHEN entity_a_id = ANY(?::bigint[]) THEN entity_b_id
@@ -80,18 +81,18 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
80
81
  OR
81
82
  (entity_b_id = ANY(?::bigint[]) AND entity_a_id = ANY(?::bigint[]))
82
83
  GROUP BY "candidateId"
83
- `,[o,r,o,i,o,i]),a=new Map;for(let l of s)a.set(Number(l.candidateId),l.summedStrength);return a}async function Po({floor:e=.5,decayDays:t=90}={}){let n=ue(c.hebbian.entity.halfLifeDays),{rows:r}=await p.raw(`
84
+ `,[o,r,o,i,o,i]),a=new Map;for(let c of s)a.set(Number(c.candidateId),c.summedStrength);return a}async function Qo({floor:e=.5,decayDays:t=90}={}){let n=ge(l.hebbian.entity.halfLifeDays),{rows:r}=await d.raw(`
84
85
  DELETE FROM entity_hebbian_edge
85
86
  WHERE (strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0)) <= ?
86
87
  AND last_seen_at < NOW() - (INTERVAL '1 day' * ?)
87
88
  RETURNING entity_a_id
88
- `,[n,e,t]);return r.length}async function Mo({topN:e=5}={}){let t=ue(c.hebbian.entity.halfLifeDays),n=await p.raw(`
89
+ `,[n,e,t]);return r.length}async function ei({topN:e=5}={}){let t=ge(l.hebbian.entity.halfLifeDays),n=await d.raw(`
89
90
  SELECT
90
91
  COUNT(*)::int AS "edgeCount",
91
92
  COALESCE(AVG(strength)::float8, 0) AS "avgStrength",
92
93
  COALESCE(MAX(strength)::float8, 0) AS "maxStrength"
93
94
  FROM entity_hebbian_edge
94
- `),r=await p.raw(`
95
+ `),r=await d.raw(`
95
96
  SELECT
96
97
  ea.name AS "aName",
97
98
  eb.name AS "bName",
@@ -102,24 +103,24 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
102
103
  JOIN entity eb ON eb.id = entity_b_id
103
104
  ORDER BY "decayed" DESC
104
105
  LIMIT ?
105
- `,[t,e]);return{edgeCount:n.rows[0]?.edgeCount??0,avgStrength:n.rows[0]?.avgStrength??0,maxStrength:n.rows[0]?.maxStrength??0,topPairs:r.rows??[]}}var Co,He=f(()=>{A();g();Co=Math.log(2)});async function hn(e,{direction:t="both",relationType:n,limit:r=50}={}){let o=a=>{let l=a==="outgoing"?"source_id":"target_id",u=a==="outgoing"?"target_id":"source_id";return p.raw(`
106
+ `,[t,e]);return{edgeCount:n.rows[0]?.edgeCount??0,avgStrength:n.rows[0]?.avgStrength??0,maxStrength:n.rows[0]?.maxStrength??0,topPairs:r.rows??[]}}var Xo,je=f(()=>{b();I();Xo=Math.log(2)});async function Rn(e,{direction:t="both",relationType:n,limit:r=50}={}){let o=a=>{let c=a==="outgoing"?"source_id":"target_id",u=a==="outgoing"?"target_id":"source_id";return d.raw(`
106
107
  SELECT r.id AS "relationId", r.relation_type AS "relationType",
107
108
  r.mention_count AS "mentionCount", r.valid_at AS "validAt",
108
109
  e.id AS "entityId", e.uid, e.name, e.entity_type AS "entityType",
109
110
  e.description, '${a}' AS direction
110
111
  FROM relation r
111
112
  JOIN entity e ON e.id = r.${u}
112
- WHERE r.${l} = ?
113
+ WHERE r.${c} = ?
113
114
  AND r.invalid_at IS NULL
114
115
  AND e.merged_with IS NULL
115
116
  ${n?"AND r.relation_type = ?":""}
116
117
  ORDER BY r.mention_count DESC
117
118
  LIMIT ?
118
- `,n?[e,n,r]:[e,r])};if(t==="outgoing"){let{rows:a}=await o("outgoing");return a}if(t==="incoming"){let{rows:a}=await o("incoming");return a}let[i,s]=await Promise.all([o("outgoing"),o("incoming")]);return[...i.rows,...s.rows]}var En=f(()=>{A()});function de({minConfidence:e="medium",pointInTime:t,categories:n}){let r=xo[e]??1,o=[r],i="",s="";return t&&(i="AND valid_from <= ? AND (valid_until IS NULL OR valid_until > ?)",o.push(t,t)),n?.length&&(s="AND category = ANY(?)",o.push(n)),{minRank:r,temporalClause:i,categoryClause:s,filterParams:o}}var xo,z,pe=f(()=>{xo={low:0,medium:1,high:2},z=`CASE confidence
119
+ `,n?[e,n,r]:[e,r])};if(t==="outgoing"){let{rows:a}=await o("outgoing");return a}if(t==="incoming"){let{rows:a}=await o("incoming");return a}let[i,s]=await Promise.all([o("outgoing"),o("incoming")]);return[...i.rows,...s.rows]}var Dn=f(()=>{b()});function we({minConfidence:e="medium",pointInTime:t,categories:n}){let r=ti[e]??1,o=[r],i="",s="";return t&&(i="AND valid_from <= ? AND (valid_until IS NULL OR valid_until > ?)",o.push(t,t)),n?.length&&(s="AND category = ANY(?)",o.push(n)),{minRank:r,temporalClause:i,categoryClause:s,filterParams:o}}var ti,ee,Se=f(()=>{ti={low:0,medium:1,high:2},ee=`CASE confidence
119
120
  WHEN 'high' THEN 2
120
121
  WHEN 'medium' THEN 1
121
122
  ELSE 0
122
- END`});async function _n(e,{namespaces:t,limit:n=20}){let r=L(e),o=`${k("embedding")} <=> ${F()}`,{rows:i}=await p.raw(`
123
+ END`});async function vn(e,{namespaces:t,limit:n=20}){let r=P(e),o=`${U("embedding")} <=> ${H()}`,{rows:i}=await d.raw(`
123
124
  SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
124
125
  content, section_heading AS "sectionHeading", namespace,
125
126
  1 - (${o}) as similarity
@@ -128,7 +129,7 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
128
129
  AND embedding IS NOT NULL
129
130
  ORDER BY ${o}
130
131
  LIMIT ?
131
- `,[r,t,r,n]);return i}var yn=f(()=>{A();B();g();pe()});async function gn(e,{namespaces:t,limit:n=20}){let{rows:r}=await p.raw(`
132
+ `,[r,t,r,n]);return i}var Ln=f(()=>{b();G();I();Se()});async function Cn(e,{namespaces:t,limit:n=20}){let{rows:r}=await d.raw(`
132
133
  SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
133
134
  content, section_heading AS "sectionHeading", namespace,
134
135
  ts_rank(search_vector, plainto_tsquery('english', ?)) as rank
@@ -137,16 +138,18 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
137
138
  AND search_vector @@ plainto_tsquery('english', ?)
138
139
  ORDER BY rank DESC
139
140
  LIMIT ?
140
- `,[e,t,e,n]);return r}var wn=f(()=>{A();pe()});async function An(e,t,{namespaces:n,limit:r=5,minConfidence:o="medium",pointInTime:i,categories:s,podIds:a=null}){let l=L(t),u=`${k("embedding")} <=> ${F()}`,{temporalClause:h,categoryClause:E,filterParams:m}=de({minConfidence:o,pointInTime:i,categories:s}),d=r*$o,_=Array.isArray(a)&&a.length>0,y=_?`AND id = ANY(
141
- SELECT member_id FROM pod_membership
142
- WHERE member_type = 'fact' AND pod_id = ANY(?::int[])
143
- )`:"",w=_?[a]:[],[D,...b]=m,Ee=[l,l,n,D,...b,...w,l,d],_e=[e,e,n,D,e,...b,...w,d],S=[d,d,r],ye=`
141
+ `,[e,t,e,n]);return r}var xn=f(()=>{b();Se()});async function Mn(e,t,{namespaces:n,limit:r=5,minConfidence:o="medium",pointInTime:i,categories:s,podIds:a=null}){let c=P(t),u=`${U("embedding")} <=> ${H()}`,{temporalClause:h,categoryClause:y,filterParams:m}=we({minConfidence:o,pointInTime:i,categories:s}),p=r*ai,w=Array.isArray(a),_=w&&a.length===0,O=w?_?"AND FALSE":`AND id = ANY(
142
+ SELECT member_id FROM pod_membership
143
+ WHERE member_type = 'fact' AND pod_id = ANY(?::int[])
144
+ )`:"",v=w&&!_?[a]:[],[E,...R]=m,x=[c,c,n,E,...R,...v,c,p],g=[e,e,n,E,e,...R,...v,p],j=[p,p,r],te=`
144
145
  WITH semantic AS (
145
146
  SELECT id,
146
147
  uid,
147
148
  content, category, confidence, importance, namespace, status,
148
149
  source_document_ids AS "sourceDocumentIds",
149
150
  source_section AS "sourceSection",
151
+ created_by_device_id AS "createdByDeviceId",
152
+ created_by_agent AS "createdByAgent",
150
153
  created_at,
151
154
  1 - (${u}) AS similarity,
152
155
  ROW_NUMBER() OVER (ORDER BY ${u}) AS rank_ix
@@ -154,10 +157,10 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
154
157
  WHERE namespace = ANY(?)
155
158
  AND status = 'active'
156
159
  AND embedding IS NOT NULL
157
- AND ${z} >= ?
160
+ AND ${ee} >= ?
158
161
  ${h}
159
- ${E}
160
162
  ${y}
163
+ ${O}
161
164
  ORDER BY ${u}
162
165
  LIMIT ?
163
166
  ),
@@ -167,17 +170,19 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
167
170
  content, category, confidence, importance, namespace, status,
168
171
  source_document_ids AS "sourceDocumentIds",
169
172
  source_section AS "sourceSection",
173
+ created_by_device_id AS "createdByDeviceId",
174
+ created_by_agent AS "createdByAgent",
170
175
  created_at,
171
176
  ts_rank_cd(search_vector, plainto_tsquery('english', ?)) AS keyword_rank,
172
177
  ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_vector, plainto_tsquery('english', ?)) DESC) AS rank_ix
173
178
  FROM fact
174
179
  WHERE namespace = ANY(?)
175
180
  AND status = 'active'
176
- AND ${z} >= ?
181
+ AND ${ee} >= ?
177
182
  AND search_vector @@ plainto_tsquery('english', ?)
178
183
  ${h}
179
- ${E}
180
184
  ${y}
185
+ ${O}
181
186
  ORDER BY keyword_rank DESC
182
187
  LIMIT ?
183
188
  ),
@@ -192,11 +197,13 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
192
197
  COALESCE(s.status, k.status) AS status,
193
198
  COALESCE(s."sourceDocumentIds", k."sourceDocumentIds") AS "sourceDocumentIds",
194
199
  COALESCE(s."sourceSection", k."sourceSection") AS "sourceSection",
200
+ COALESCE(s."createdByDeviceId", k."createdByDeviceId") AS "createdByDeviceId",
201
+ COALESCE(s."createdByAgent", k."createdByAgent") AS "createdByAgent",
195
202
  COALESCE(s.created_at, k.created_at) AS created_at,
196
203
  COALESCE(s.similarity, 0) AS similarity,
197
204
  (
198
- ${Bo} * (1.0 / (${Sn} + COALESCE(s.rank_ix, ?)))
199
- + ${Ho} * (1.0 / (${Sn} + COALESCE(k.rank_ix, ?)))
205
+ ${oi} * (1.0 / (${Pn} + COALESCE(s.rank_ix, ?)))
206
+ + ${ii} * (1.0 / (${Pn} + COALESCE(k.rank_ix, ?)))
200
207
  ) AS rrf_raw
201
208
  FROM semantic s
202
209
  FULL OUTER JOIN keyword k ON s.id = k.id
@@ -216,18 +223,18 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
216
223
  )
217
224
  )
218
225
  )) AS activation,
219
- CASE f.importance WHEN 'vital' THEN ${Uo} ELSE 1.0 END AS importance_mult,
226
+ CASE f.importance WHEN 'vital' THEN ${si} ELSE 1.0 END AS importance_mult,
220
227
  CASE f.confidence
221
- WHEN 'high' THEN ${Go}
222
- WHEN 'medium' THEN ${Yo}
223
- WHEN 'low' THEN ${Wo}
228
+ WHEN 'high' THEN ${ci}
229
+ WHEN 'medium' THEN ${li}
230
+ WHEN 'low' THEN ${ui}
224
231
  ELSE 1.0
225
232
  END AS confidence_mult
226
233
  FROM fused f
227
234
  LEFT JOIN fact_lifecycle fl ON fl.fact_id = f.id
228
235
  )
229
236
  SELECT id, uid, content, category, confidence, importance, namespace, status,
230
- "sourceDocumentIds", "sourceSection", similarity,
237
+ "sourceDocumentIds", "sourceSection", "createdByDeviceId", "createdByAgent", similarity,
231
238
  rrf_raw,
232
239
  access_count,
233
240
  last_accessed_at AS "lastAccessedAt",
@@ -237,7 +244,7 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
237
244
  ORDER BY final_score DESC,
238
245
  CASE WHEN importance = 'vital' THEN 0 ELSE 1 END
239
246
  LIMIT ?
240
- `,ir=[...Ee,..._e,...S],{rows:X}=await p.raw(ye,ir);if(!X.length)return[];let ar=X[0].final_score||X[0].rrf_raw||1;return X.map(ge=>({...ge,rrfScore:Math.round(Number(ge.final_score||ge.rrf_raw)/Number(ar)*100)/100}))}var Sn,Bo,Ho,$o,Uo,Go,Yo,Wo,bn=f(()=>{A();B();g();pe();Sn=20,Bo=1,Ho=.7,$o=3,Uo=1.5,Go=1,Yo=.85,Wo=.7});async function In(e){let t=e.map(o=>o.id),n=await J(t),r=new Set;for(let o of n.values())for(let i of o)r.add(i);return r.size?p("entity").whereIn("id",[...r]).whereNull("mergedWith").select("id","uid","name","entityType","description"):[]}async function On(e,{limit:t=10}={}){if(!e.length)return[];let n=await p("relation").where(function(){this.whereIn("sourceId",e).orWhereIn("targetId",e)}).whereNull("invalidAt").select("*").limit(t*3),r=new Set(e),o=new Set,i=new Map;for(let E of n){let m=r.has(E.sourceId)?E.targetId:E.sourceId;o.add(m),i.has(m)||i.set(m,E)}if(!o.size)return[];let s=await p("entity").whereIn("id",[...o]).whereNull("mergedWith").select("id","name"),a=new Map(s.map(E=>[E.id,E.name])),l=await p("fact").join("fact_entity","fact.id","fact_entity.factId").whereIn("fact_entity.entityId",[...o]).where("fact.status","active").select("fact.*","fact_entity.entityId").orderBy("fact_entity.mentionCount","desc").limit(t*3),u=new Set,h=[];for(let E of l){if(u.has(E.id))continue;u.add(E.id);let m=i.get(E.entityId),d=a.get(E.entityId)||"unknown",_=m?.relationType||"related";if(h.push({...E,relationPath:`${d} (${_})`,graphDistance:1}),h.length>=t)break}return h}function Tn(e,t,n,r){let o=new Set(n),i=e.map(a=>({...a,resultType:"direct"})),s=t.filter(a=>!e.some(l=>l.id===a.id)).map(a=>({...a,rrfScore:(a.rrfScore||.1)*.5,resultType:"related"}));return[...i,...s].slice(0,r)}var Nn=f(()=>{A();ce()});var $,$e=f(()=>{$=class{#e=new Map;#t;#n;constructor({maxSize:t=100,ttlMs:n=300*1e3}={}){this.#t=t,this.#n=n}get(t){let n=this.#e.get(t);if(n){if(Date.now()-n.timestamp>this.#n){this.#e.delete(t);return}return n.value}}set(t,n){if(this.#e.size>=this.#t){let r=this.#e.keys().next().value;this.#e.delete(r)}this.#e.set(t,{value:n,timestamp:Date.now()})}}});async function Dn(e){let t=Rn.get(e);if(t)return t;let n=`You are a search query expander for a personal knowledge base.
247
+ `,ne=[...x,...g,...j],{rows:re}=await d.raw(te,ne);if(!re.length)return[];let Or=re[0].final_score||re[0].rrf_raw||1;return re.map(Oe=>({...Oe,rrfScore:Math.round(Number(Oe.final_score||Oe.rrf_raw)/Number(Or)*100)/100}))}var Pn,oi,ii,ai,si,ci,li,ui,kn=f(()=>{b();G();I();Se();Pn=20,oi=1,ii=.7,ai=3,si=1.5,ci=1,li=.85,ui=.7});async function Bn(e){let t=e.map(o=>o.id),n=await Z(t),r=new Set;for(let o of n.values())for(let i of o)r.add(i);return r.size?d("entity").whereIn("id",[...r]).whereNull("mergedWith").select("id","uid","name","entityType","description"):[]}async function $n(e,{limit:t=10}={}){if(!e.length)return[];let n=await d("relation").where(function(){this.whereIn("sourceId",e).orWhereIn("targetId",e)}).whereNull("invalidAt").select("*").limit(t*3),r=new Set(e),o=new Set,i=new Map;for(let y of n){let m=r.has(y.sourceId)?y.targetId:y.sourceId;o.add(m),i.has(m)||i.set(m,y)}if(!o.size)return[];let s=await d("entity").whereIn("id",[...o]).whereNull("mergedWith").select("id","name"),a=new Map(s.map(y=>[y.id,y.name])),c=await d("fact").join("fact_entity","fact.id","fact_entity.factId").whereIn("fact_entity.entityId",[...o]).where("fact.status","active").select("fact.*","fact_entity.entityId").orderBy("fact_entity.mentionCount","desc").limit(t*3),u=new Set,h=[];for(let y of c){if(u.has(y.id))continue;u.add(y.id);let m=i.get(y.entityId),p=a.get(y.entityId)||"unknown",w=m?.relationType||"related";if(h.push({...y,relationPath:`${p} (${w})`,graphDistance:1}),h.length>=t)break}return h}function Fn(e,t,n,r){let o=new Set(n),i=e.map(a=>({...a,resultType:"direct"})),s=t.filter(a=>!e.some(c=>c.id===a.id)).map(a=>({...a,rrfScore:(a.rrfScore||.1)*.5,resultType:"related"}));return[...i,...s].slice(0,r)}var Un=f(()=>{b();Ee()});var Y,Ve=f(()=>{Y=class{#e=new Map;#t;#n;constructor({maxSize:t=100,ttlMs:n=300*1e3}={}){this.#t=t,this.#n=n}get(t){let n=this.#e.get(t);if(n){if(Date.now()-n.timestamp>this.#n){this.#e.delete(t);return}return n.value}}set(t,n){if(this.#e.size>=this.#t){let r=this.#e.keys().next().value;this.#e.delete(r)}this.#e.set(t,{value:n,timestamp:Date.now()})}}});async function Gn(e){let t=Hn.get(e);if(t)return t;let n=`You are a search query expander for a personal knowledge base.
241
248
 
242
249
  Given the user's query, generate 3-5 alternative search queries that would help find ALL relevant information \u2014 including facts that don't literally match the query but are semantically related.
243
250
 
@@ -249,7 +256,7 @@ Think about:
249
256
 
250
257
  User query: "${e}"
251
258
 
252
- Respond with ONLY a JSON array of strings. Do not include the original query.`;try{let r=await le(n,{model:c.llm.extractionModel,caller:"query-expander"});if(!Array.isArray(r))return[e];let o=r.filter(s=>typeof s=="string"&&s.trim()).slice(0,Ko),i=o.length?[e,...o]:[e];return Rn.set(e,i),i}catch(r){return console.error("[query-expander] Failed:",r.message),[e]}}var Ko,Rn,vn=f(()=>{q();$e();g();Ko=5,Rn=new $({maxSize:100,ttlMs:300*1e3})});import{readFile as jo}from"node:fs/promises";import{join as Vo}from"node:path";async function Pn(e){let t=e.trim().toLowerCase(),n=Ue.get(t);if(n)return n;let o=`${await jo(Jo,"utf8")}
259
+ Respond with ONLY a JSON array of strings. Do not include the original query.`;try{let r=await ye(n,{model:l.llm.extractionModel,caller:"query-expander"});if(!Array.isArray(r))return[e];let o=r.filter(s=>typeof s=="string"&&s.trim()).slice(0,di),i=o.length?[e,...o]:[e];return Hn.set(e,i),i}catch(r){return console.error("[query-expander] Failed:",r.message),[e]}}var di,Hn,Wn=f(()=>{Q();Ve();I();di=5,Hn=new Y({maxSize:100,ttlMs:300*1e3})});import{readFile as pi}from"node:fs/promises";import{join as mi}from"node:path";async function jn(e){let t=e.trim().toLowerCase(),n=Je.get(t);if(n)return n;let o=`${await pi(fi,"utf8")}
253
260
 
254
261
  ---
255
262
 
@@ -257,7 +264,8 @@ Query: ${e}
257
264
 
258
265
  ---
259
266
 
260
- Respond with ONLY a JSON object: { "intent": "preference|factual|entity_lookup|exploratory|temporal", "categories": [...], "entities": [...], "expand": bool, "pointInTime": null or "YYYY-MM-DD", "reasoning": "..." }`;try{let i=await le(o,{model:c.llm.extractionModel,caller:"query-router"});if(!i||!qo.includes(i.intent)){let l=Cn("factual",{});return Ue.set(t,l),l}let s=Ln[i.intent],a={intent:i.intent,categories:Array.isArray(i.categories)&&i.categories.length?i.categories:s.categories,entities:Array.isArray(i.entities)?i.entities:[],expand:typeof i.expand=="boolean"?i.expand:s.expand,useGraph:s.useGraph,limit:s.limit,pointInTime:i.pointInTime||null,reasoning:i.reasoning||""};return Ue.set(t,a),a}catch(i){return console.error("[query-router] Failed:",i.message),Cn("factual",{reasoning:`Fallback \u2014 ${i.message}`})}}function Cn(e,t={}){let n=Ln[e];return{intent:e,categories:n.categories,entities:[],expand:n.expand,useGraph:n.useGraph,limit:n.limit,pointInTime:null,reasoning:"",...t}}var Jo,Ue,qo,Ln,Mn=f(()=>{q();$e();g();P();Jo=Vo(Z,"query-router.md"),Ue=new $({maxSize:200,ttlMs:600*1e3}),qo=["preference","factual","entity_lookup","exploratory","temporal"],Ln={preference:{categories:["preference","opinion","personal"],expand:!1,useGraph:!1,limit:null},factual:{categories:[],expand:!1,useGraph:!1,limit:null},entity_lookup:{categories:[],expand:!1,useGraph:!0,limit:null},exploratory:{categories:[],expand:!0,useGraph:!0,limit:15},temporal:{categories:[],expand:!1,useGraph:!1,limit:null}}});function kn(e){for(let t of zo)if(!e[t])throw new Error(`Pod kind missing required field: ${t}`);if(e.visibility&&!Xo.has(e.visibility))throw new Error(`Pod kind ${e.name}: invalid visibility ${e.visibility}`);if(e.activeMode&&!Zo.has(e.activeMode))throw new Error(`Pod kind ${e.name}: invalid activeMode ${e.activeMode}`);if(e.writePolicy&&!Qo.has(e.writePolicy))throw new Error(`Pod kind ${e.name}: invalid writePolicy ${e.writePolicy}`);xn.set(e.name,ei(e))}function ei(e){return{visibility:"private",activeMode:"multi-active",hotContextBudget:0,retrievalWeights:{recency:1,relevance:1},importanceDefault:2,ttlDays:null,writePolicy:"origin-only",lifecycle:{},...e}}async function Fn(e={}){let t=[];for(let n of xn.values())if(typeof n.resolveActiveScope=="function")try{let r=await n.resolveActiveScope(e);Array.isArray(r)&&r.length>0&&t.push({kind:n,scope:r})}catch{}return t}var zo,Xo,Zo,Qo,xn,Ge=f(()=>{P();zo=["name"],Xo=new Set(["private","shared","public"]),Zo=new Set(["singleton-live","multi-active","rolling-window","always"]),Qo=new Set(["origin-only","shared-allowlist","open"]),xn=new Map});var We={};I(We,{CURSOR_PATH:()=>U,endActiveSession:()=>ui,ensureActiveSession:()=>si,getActiveCursor:()=>li,getActiveSessionPodUid:()=>Ye});import{writeFile as ti,readFile as ni,unlink as ri}from"node:fs/promises";import{existsSync as oi,mkdirSync as ii}from"node:fs";import{dirname as Bn}from"node:path";async function me(){try{let e=await ni(U,"utf8");return JSON.parse(e)}catch{return null}}async function Hn(e){oi(Bn(U))||ii(Bn(U),{recursive:!0}),await ti(U,JSON.stringify(e,null,2),"utf8")}async function si({sessionId:e,transcriptPath:t=null,cwd:n=null,model:r=null,namespace:o=null}){if(!e)throw new Error("ensureActiveSession requires sessionId from hook stdin");let i=o||c.defaults.namespace,s=await me();if(s&&s.session_id===e&&s.namespace===i){let u=await Pe(s.pod_uid);if(u)return await Me(u.id,{turn_count:(di(u.attrs)||0)+1}),await ci(s),u}let a=new Date,{pod:l}=await oe({podType:$n,externalId:e,name:Gn({sessionId:e,startedAt:a}),namespace:i,attrs:Un({sessionId:e,transcriptPath:t,cwd:n,turnCount:1,model:r}),startedAt:a});return await Hn({session_id:e,pod_uid:l.uid,namespace:i,started_at:l.startedAt??a.toISOString(),last_seen_at:new Date().toISOString()}),l}async function ci(e){await Hn({...e,last_seen_at:new Date().toISOString()})}async function Ye({allowStale:e=!1}={}){let t=await me();return!t||!t.pod_uid||!e&&t.started_at&&Date.now()-new Date(t.started_at).getTime()>ai?null:t.pod_uid}async function li(){return me()}async function ui({conclusion:e=null,summary:t=null}={}){let n=await me();if(!n)return null;let r=await Pe(n.pod_uid);if(r){if(e||t){let o={};e&&(o.conclusion=e),t&&(o.summary=t),await Me(r.id,o)}await on(r.id)}try{await ri(U)}catch{}return r}function di(e){if(!e)return 0;if(typeof e=="object")return e.turn_count??0;try{return JSON.parse(e).turn_count??0}catch{return 0}}var U,ai,fe=f(()=>{ie();Ke();g();P();U=it,ai=360*60*1e3});function Un({sessionId:e,transcriptPath:t=null,cwd:n=null,turnCount:r=0,model:o=null,conclusion:i=null,summary:s=null}){return{session_id:e,transcript_path:t,cwd:n,turn_count:r,model:o,conclusion:i,summary:s}}function Gn({sessionId:e,startedAt:t=new Date}={}){let r=(t instanceof Date?t:new Date(t)).toISOString().replace("T"," ").slice(0,16),o=e?e.slice(0,8):"unknown";return`claude-session ${r} (${o})`}var $n,Yn,Ke=f(()=>{fe();$n="claude_session",Yn={name:"claude_session",description:"Claude Code session",identityField:"session_id",attrsSchema:{session_id:"string",transcript_path:"string",cwd:"string",turn_count:"number",model:"string",conclusion:"string",summary:"string"},visibility:"private",activeMode:"singleton-live",hotContextBudget:6,retrievalWeights:{recency:1,relevance:.7},importanceDefault:2,ttlDays:90,schemaDocPath:"kinds/claude_session.schema.md",writePolicy:"origin-only",resolveActiveScope:async()=>{try{let e=await Ye();return e?[e]:[]}catch{return[]}}}});var mi,Wn,Kn=f(()=>{A();g();mi=1440*60*1e3,Wn={name:"person",description:"A person you have a working relationship with",identityField:"primary_handle",attrsSchema:{platforms:"object",role:"string",relationship:"string",notes:"string"},visibility:"private",activeMode:"rolling-window",hotContextBudget:4,retrievalWeights:{recency:1,relevance:.8},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/person.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.namespace||c.defaults.namespace;try{let n=new Date(Date.now()-mi);return(await p("pod as p").join("pod_membership as pm","pm.pod_id","p.id").join("fact_lifecycle as fl","fl.fact_id","pm.member_id").where("pm.memberType","fact").where("p.podType","person").where("p.namespace",t).where("p.status","active").where("fl.lastAccessedAt",">=",n).distinct("p.uid")).map(o=>o.uid)}catch{return[]}}}});var Vn={};I(Vn,{POD_TYPE:()=>Ve,deriveProjectRoot:()=>qe,ensureProjectPod:()=>hi,formatForDisplay:()=>_i,membership:()=>se,projectKind:()=>Je});import{execFileSync as fi}from"node:child_process";import{basename as jn}from"node:path";async function hi({cwd:e,namespace:t=null}){if(!e)return null;let n=qe(e),r=t||c.defaults.namespace,i=(n!==e?!1:je(e)===e)?n:je(e),{pod:s}=await oe({podType:Ve,externalId:n,name:jn(n)||n,namespace:r,attrs:{root_path:n,git_root:i||null,display_name:jn(n)||n,discovered_at:new Date().toISOString()},startedAt:new Date});return s}function qe(e){return je(e)||e}function je(e){try{return fi("git",["rev-parse","--show-toplevel"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}async function Ei(){try{let{getActiveCursor:e}=await Promise.resolve().then(()=>(fe(),We));return(await e())?.cwd||null}catch{return null}}function _i(e){let t=yi(e.attrs);return{uid:e.uid,name:e.name,rootPath:t.root_path,gitRoot:t.git_root,displayName:t.display_name,discoveredAt:t.discovered_at,memberFactCount:e.memberFactCount,memberDocCount:e.memberDocCount}}function yi(e){if(!e)return{};if(typeof e=="object")return e;try{return JSON.parse(e)}catch{return{}}}var Ve,Je,ze=f(()=>{ie();xe();g();Ve="project",Je={name:"project",description:"Code project rooted at a git repo or directory",identityField:"root_path",attrsSchema:{root_path:"string",git_root:"string",display_name:"string",discovered_at:"string"},visibility:"shared",activeMode:"multi-active",hotContextBudget:4,retrievalWeights:{recency:.6,relevance:1},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/project.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.cwd||await Ei();if(!t)return[];try{let n=e.namespace||c.defaults.namespace,r=qe(t),o=await rn({podType:Ve,externalId:r,namespace:n});return o?[o.uid]:[]}catch{return[]}}}});async function wi(e){if(e.project)return e.project;if(!e.cwd)try{let{getActiveCursor:t}=await Promise.resolve().then(()=>(fe(),We)),n=await t();e={...e,cwd:n?.cwd}}catch{return null}if(!e.cwd)return null;try{let{deriveProjectRoot:t}=await Promise.resolve().then(()=>(ze(),Vn)),n=t(e.cwd);return n?n.split("/").pop():null}catch{return null}}function Si(e){if(!e)return{};if(typeof e=="object")return e;try{return JSON.parse(e)}catch{return{}}}var gi,Jn,qn=f(()=>{A();g();gi="playbook",Jn={name:"playbook",description:"A reusable workflow or debug recipe (procedural memory)",identityField:"slug",attrsSchema:{slug:"string",project:"string",description:"string",tags:"array"},visibility:"shared",activeMode:"always",hotContextBudget:3,retrievalWeights:{recency:.3,relevance:1},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/playbook.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.namespace||c.defaults.namespace,n=await wi(e);try{let o=await p("pod").where({podType:gi,namespace:t,status:"active"}).select("uid","attrs");return n?o.filter(s=>{let a=Si(s.attrs);return!a.project||a.project===n}).map(s=>s.uid):o.map(s=>s.uid)}catch{return[]}}}});var Ai,zn,Xn=f(()=>{A();g();Ai=["__virtual:vital__"],zn={name:"vital",description:"Facts marked importance=5 (vital), surfaced globally",identityField:null,attrsSchema:{},visibility:"public",activeMode:"always",hotContextBudget:6,retrievalWeights:{recency:.5,relevance:1},importanceDefault:5,ttlDays:null,schemaDocPath:"kinds/vital.schema.md",writePolicy:"open",resolveActiveScope:async()=>Ai,fetchFacts:async(e={},{slots:t=8,namespace:n}={})=>{let r=n||e.namespace||c.defaults.namespace;return p("fact as f").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active","f.namespace":r}).where(o=>{o.where("f.importance","vital").orWhere("f.importance_score",5)}).orderByRaw("COALESCE(fl.access_count, 0) DESC, f.created_at DESC").limit(t).pluck("f.content")}}});function Ii(){if(!Zn){for(let e of bi)kn(e);Zn=!0}}var bi,Zn,Qn=f(()=>{Ge();Ke();Kn();ze();qn();Xn();bi=[Yn,Je,Wn,Jn,zn],Zn=!1;Ii()});var rr={};I(rr,{isSearchableQuery:()=>er,search:()=>Ri});async function Ri(e,{namespaces:t,limit:n=5,minConfidence:r="medium",useGraph:o=!1,includeChunks:i=!1,pointInTime:s,expand:a=!1,route:l=!0,categories:u,synthesize:h=c.search.synthesize,podScope:E=null,ctx:m={}}={}){if(!er(e))return Di();h&&(i=!0);let d=null;l&&(d=await Pn(e),o=o||d.useGraph,a=a||d.expand,n=d.limit||n,s=s||d.pointInTime,u=u||(d.categories.length?d.categories:void 0));let _=await Pi(e,t),y=await Li(E,{...m,namespace:t?.[0]}),w;_?w=await Mi(_,e,{namespaces:t,limit:n,minConfidence:r,includeChunks:i,pointInTime:s,categories:u,podIds:y}):w=await Fi(e,{namespaces:t,limit:n,minConfidence:r,useGraph:o,includeChunks:i,pointInTime:s,expand:a,categories:u,podIds:y});let D=w.facts.map(b=>b.id).filter(Boolean);if(un(D).catch(b=>console.error("[access-tracking]",b.message)),pn(D.slice(0,8)).catch(b=>console.error("[hebbian]",b.message)),c.hebbian.entity.enabled&&D.length>=2&&Ci(D).catch(b=>console.error("[hebbian-entity]",b.message)),h)try{w.synthesized=await vi(e,w)}catch(b){console.error("[synthesizer] failed:",b.message),w.synthesized=null}return w}function er(e){let t=String(e||"").trim();return t?!/^[*%_?\s]+$/.test(t):!1}function Di(){return{facts:[],chunks:[],matchedEntity:null,relatedEntities:[]}}async function vi(e,{facts:t,chunks:n}){let r=[];if(t.slice(0,10).forEach((s,a)=>{r.push(`[F${a+1}] (${s.category}) ${s.content}`)}),n.length&&n.slice(0,15).forEach((s,a)=>{let l=(s.content||"").replace(/\s+/g," ").trim();l&&r.push(`[C${a+1}] ${l.slice(0,2e3)}`)}),!r.length)return"No retrieved evidence \u2014 nothing to synthesize.";let o=`You are answering a question from a personal-memory system.
267
+ Respond with ONLY a JSON object: { "intent": "preference|factual|entity_lookup|exploratory|temporal", "categories": [...], "entities": [...], "expand": bool, "pointInTime": null or "YYYY-MM-DD", "reasoning": "..." }`;try{let i=await ye(o,{model:l.llm.extractionModel,caller:"query-router"});if(!i||!hi.includes(i.intent)){let c=Yn("factual",{});return Je.set(t,c),c}let s=Kn[i.intent],a={intent:i.intent,categories:Array.isArray(i.categories)&&i.categories.length?i.categories:s.categories,entities:Array.isArray(i.entities)?i.entities:[],expand:typeof i.expand=="boolean"?i.expand:s.expand,useGraph:s.useGraph,limit:s.limit,pointInTime:i.pointInTime||null,reasoning:i.reasoning||""};return Je.set(t,a),a}catch(i){return console.error("[query-router] Failed:",i.message),Yn("factual",{reasoning:`Fallback \u2014 ${i.message}`})}}function Yn(e,t={}){let n=Kn[e];return{intent:e,categories:n.categories,entities:[],expand:n.expand,useGraph:n.useGraph,limit:n.limit,pointInTime:null,reasoning:"",...t}}var fi,Je,hi,Kn,Vn=f(()=>{Q();Ve();I();M();fi=mi(ae,"query-router.md"),Je=new Y({maxSize:200,ttlMs:600*1e3}),hi=["preference","factual","entity_lookup","exploratory","temporal"],Kn={preference:{categories:["preference","opinion","personal"],expand:!1,useGraph:!1,limit:null},factual:{categories:[],expand:!1,useGraph:!1,limit:null},entity_lookup:{categories:[],expand:!1,useGraph:!0,limit:null},exploratory:{categories:[],expand:!0,useGraph:!0,limit:15},temporal:{categories:[],expand:!1,useGraph:!1,limit:null}}});var qe,_i,Jn,qn=f(()=>{qe=class{constructor(){this.buffer=[],this.subs=new Set}emit(t,n={}){let r={type:t,ts:new Date().toISOString(),...n};this.buffer.push(r),this.buffer.length>200&&this.buffer.shift();for(let o of this.subs)try{o(r)}catch{}return r}subscribe(t){return this.subs.add(t),()=>this.subs.delete(t)}recent(t=50){return t>=this.buffer.length?[...this.buffer]:this.buffer.slice(-t)}subscriberCount(){return this.subs.size}},_i=new qe,Jn=_i});import{AsyncLocalStorage as Ei}from"node:async_hooks";function zn(){return yi.getStore()||null}var yi,Xn=f(()=>{yi=new Ei});var Qn={};T(Qn,{clearTraces:()=>bi,getTrace:()=>Ii,listTraces:()=>Ai,recordTrace:()=>Si});function wi(){let e=zn();return{deviceId:e?.device?.id??null,transport:e?.transport??null}}async function Si({kind:e,summary:t,detail:n={},namespace:r=null,durationMs:o=null}){let i=`trace-${pe(16)}`,s=new Date().toISOString(),{deviceId:a,transport:c}=wi(),u=n;try{JSON.stringify(n).length>gi&&(u={truncated:!0,note:"trace detail exceeded size cap",summary:t})}catch{u={error:"detail not serializable"}}try{Jn.emit("trace",{uid:i,kind:e,summary:t,namespace:r,durationMs:o,deviceId:a,transport:c,detail:u})}catch{}try{return await d("trace_event").insert({uid:i,kind:e,ts:s,duration_ms:o,namespace:r,summary:t,device_id:a,transport:c,detail:JSON.stringify(u)}),i}catch(h){return console.error("[trace-store] persist failed:",h.message),null}}async function Ai({kind:e=null,namespace:t=null,before:n=null,limit:r=50}={}){let o=d("trace_event").select("uid","kind","ts","duration_ms as durationMs","namespace","summary","device_id as deviceId","transport","detail").orderBy("ts","desc").limit(Math.min(Number(r)||50,200));return e&&(o=o.where({kind:e})),t&&(o=o.where({namespace:t})),n&&(o=o.where("ts","<",n)),(await o).map(s=>({...s,detail:typeof s.detail=="string"?Zn(s.detail):s.detail}))}async function Ii(e){let t=await d("trace_event").select("uid","kind","ts","duration_ms as durationMs","namespace","summary","device_id as deviceId","transport","detail").where({uid:e}).first();return t?{...t,detail:typeof t.detail=="string"?Zn(t.detail):t.detail}:null}async function bi(){return{cleared:await d("trace_event").del()}}function Zn(e){try{return JSON.parse(e)}catch{return{}}}var gi,er=f(()=>{Fe();b();qn();Xn();gi=256*1024});function nr(e){for(let t of Oi)if(!e[t])throw new Error(`Pod kind missing required field: ${t}`);if(e.visibility&&!Ti.has(e.visibility))throw new Error(`Pod kind ${e.name}: invalid visibility ${e.visibility}`);if(e.activeMode&&!Ni.has(e.activeMode))throw new Error(`Pod kind ${e.name}: invalid activeMode ${e.activeMode}`);if(e.writePolicy&&!Ri.has(e.writePolicy))throw new Error(`Pod kind ${e.name}: invalid writePolicy ${e.writePolicy}`);tr.set(e.name,Di(e))}function Di(e){return{visibility:"private",activeMode:"multi-active",hotContextBudget:0,retrievalWeights:{recency:1,relevance:1},importanceDefault:2,ttlDays:null,writePolicy:"origin-only",lifecycle:{},...e}}async function rr(e={}){let t=[];for(let n of tr.values())if(typeof n.resolveActiveScope=="function")try{let r=await n.resolveActiveScope(e);Array.isArray(r)&&r.length>0&&t.push({kind:n,scope:r})}catch(r){process.stderr.write(`[sigil:pods] resolveActiveScope failed for kind "${n.name}": ${r.message}
268
+ `),vi(n.name,r)}return t}function vi(e,t){Promise.resolve().then(()=>(er(),Qn)).then(({recordTrace:n})=>n({kind:"lifecycle",summary:`pod-resolution failed for kind "${e}"`,detail:{kind:e,error:t.message}})).catch(()=>{})}var Oi,Ti,Ni,Ri,tr,ze=f(()=>{M();Oi=["name"],Ti=new Set(["private","shared","public"]),Ni=new Set(["singleton-live","multi-active","rolling-window","always"]),Ri=new Set(["origin-only","shared-allowlist","open"]),tr=new Map});var Ze={};T(Ze,{CURSOR_PATH:()=>K,endActiveSession:()=>Ui,ensureActiveSession:()=>Bi,getActiveCursor:()=>Fi,getActiveSessionPodUid:()=>Xe});import{writeFile as Li,readFile as Ci,unlink as xi}from"node:fs/promises";import{existsSync as Pi,mkdirSync as Mi}from"node:fs";import{dirname as or}from"node:path";async function Ae(){try{let e=await Ci(K,"utf8");return JSON.parse(e)}catch{return null}}async function ir(e){Pi(or(K))||Mi(or(K),{recursive:!0}),await Li(K,JSON.stringify(e,null,2),"utf8")}async function Bi({sessionId:e,transcriptPath:t=null,cwd:n=null,model:r=null,namespace:o=null}){if(!e)throw new Error("ensureActiveSession requires sessionId from hook stdin");let i=o||l.defaults.namespace,s=await Ae();if(s&&s.session_id===e&&s.namespace===i){let u=await Ue(s.pod_uid);if(u)return await He(u.id,{turn_count:(Hi(u.attrs)||0)+1}),await $i(s),u}let a=new Date,{pod:c}=await me({podType:ar,externalId:e,name:cr({sessionId:e,startedAt:a}),namespace:i,attrs:sr({sessionId:e,transcriptPath:t,cwd:n,turnCount:1,model:r}),startedAt:a});return await ir({session_id:e,pod_uid:c.uid,namespace:i,started_at:c.startedAt??a.toISOString(),last_seen_at:new Date().toISOString()}),c}async function $i(e){await ir({...e,last_seen_at:new Date().toISOString()})}async function Xe({allowStale:e=!1}={}){let t=await Ae();return!t||!t.pod_uid||!e&&t.started_at&&Date.now()-new Date(t.started_at).getTime()>ki?null:t.pod_uid}async function Fi(){return Ae()}async function Ui({conclusion:e=null,summary:t=null}={}){let n=await Ae();if(!n)return null;let r=await Ue(n.pod_uid);if(r){if(e||t){let o={};e&&(o.conclusion=e),t&&(o.summary=t),await He(r.id,o)}await yn(r.id)}try{await xi(K)}catch{}return r}function Hi(e){if(!e)return 0;if(typeof e=="object")return e.turn_count??0;try{return JSON.parse(e).turn_count??0}catch{return 0}}var K,ki,Ie=f(()=>{fe();Qe();I();M();K=ut,ki=360*60*1e3});function sr({sessionId:e,transcriptPath:t=null,cwd:n=null,turnCount:r=0,model:o=null,conclusion:i=null,summary:s=null}){return{session_id:e,transcript_path:t,cwd:n,turn_count:r,model:o,conclusion:i,summary:s}}function cr({sessionId:e,startedAt:t=new Date}={}){let r=(t instanceof Date?t:new Date(t)).toISOString().replace("T"," ").slice(0,16),o=e?e.slice(0,8):"unknown";return`claude-session ${r} (${o})`}var ar,lr,Qe=f(()=>{Ie();ar="claude_session",lr={name:"claude_session",description:"Claude Code session",identityField:"session_id",attrsSchema:{session_id:"string",transcript_path:"string",cwd:"string",turn_count:"number",model:"string",conclusion:"string",summary:"string"},visibility:"private",activeMode:"singleton-live",hotContextBudget:6,retrievalWeights:{recency:1,relevance:.7},importanceDefault:2,ttlDays:90,schemaDocPath:"kinds/claude_session.schema.md",writePolicy:"origin-only",resolveActiveScope:async()=>{try{let e=await Xe();return e?[e]:[]}catch{return[]}}}});var Wi,ur,dr=f(()=>{b();I();Wi=1440*60*1e3,ur={name:"person",description:"A person you have a working relationship with",identityField:"primary_handle",attrsSchema:{platforms:"object",role:"string",relationship:"string",notes:"string"},visibility:"private",activeMode:"rolling-window",hotContextBudget:4,retrievalWeights:{recency:1,relevance:.8},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/person.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.namespace||l.defaults.namespace;try{let n=new Date(Date.now()-Wi);return(await d("pod as p").join("pod_membership as pm","pm.pod_id","p.id").join("fact_lifecycle as fl","fl.fact_id","pm.member_id").where("pm.memberType","fact").where("p.podType","person").where("p.namespace",t).where("p.status","active").where("fl.lastAccessedAt",">=",n).distinct("p.uid")).map(o=>o.uid)}catch{return[]}}}});var mr={};T(mr,{POD_TYPE:()=>tt,deriveProjectRoot:()=>rt,ensureProjectPod:()=>Ki,formatForDisplay:()=>Vi,membership:()=>_e,projectKind:()=>nt});import{execFileSync as Yi}from"node:child_process";import{basename as pr}from"node:path";async function Ki({cwd:e,namespace:t=null}){if(!e)return null;let n=rt(e),r=t||l.defaults.namespace,i=(n!==e?!1:et(e)===e)?n:et(e),{pod:s}=await me({podType:tt,externalId:n,name:pr(n)||n,namespace:r,attrs:{root_path:n,git_root:i||null,display_name:pr(n)||n,discovered_at:new Date().toISOString()},startedAt:new Date});return s}function rt(e){return et(e)||e}function et(e){try{return Yi("git",["rev-parse","--show-toplevel"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}async function ji(){try{let{getActiveCursor:e}=await Promise.resolve().then(()=>(Ie(),Ze));return(await e())?.cwd||null}catch{return null}}function Vi(e){let t=Ji(e.attrs);return{uid:e.uid,name:e.name,rootPath:t.root_path,gitRoot:t.git_root,displayName:t.display_name,discoveredAt:t.discovered_at,memberFactCount:e.memberFactCount,memberDocCount:e.memberDocCount}}function Ji(e){if(!e)return{};if(typeof e=="object")return e;try{return JSON.parse(e)}catch{return{}}}var tt,nt,ot=f(()=>{fe();Ge();I();tt="project",nt={name:"project",description:"Code project rooted at a git repo or directory",identityField:"root_path",attrsSchema:{root_path:"string",git_root:"string",display_name:"string",discovered_at:"string"},visibility:"shared",activeMode:"multi-active",hotContextBudget:4,retrievalWeights:{recency:.6,relevance:1},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/project.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.cwd||await ji();if(!t)return[];let n=e.namespace||l.defaults.namespace,r=rt(t),o=await En({podType:tt,externalId:r,namespace:n});return o?[o.uid]:[]}}});async function zi(e){if(e.project)return e.project;if(!e.cwd)try{let{getActiveCursor:t}=await Promise.resolve().then(()=>(Ie(),Ze)),n=await t();e={...e,cwd:n?.cwd}}catch{return null}if(!e.cwd)return null;try{let{deriveProjectRoot:t}=await Promise.resolve().then(()=>(ot(),mr)),n=t(e.cwd);return n?n.split("/").pop():null}catch{return null}}function Xi(e){if(!e)return{};if(typeof e=="object")return e;try{return JSON.parse(e)}catch{return{}}}var qi,fr,hr=f(()=>{b();I();qi="playbook",fr={name:"playbook",description:"A reusable workflow or debug recipe (procedural memory)",identityField:"slug",attrsSchema:{slug:"string",project:"string",description:"string",tags:"array"},visibility:"shared",activeMode:"always",hotContextBudget:3,retrievalWeights:{recency:.3,relevance:1},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/playbook.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.namespace||l.defaults.namespace,n=await zi(e);try{let o=await d("pod").where({podType:qi,namespace:t,status:"active"}).select("uid","attrs");return n?o.filter(s=>{let a=Xi(s.attrs);return!a.project||a.project===n}).map(s=>s.uid):o.map(s=>s.uid)}catch{return[]}}}});var Zi,_r,Er=f(()=>{b();I();Zi=["__virtual:vital__"],_r={name:"vital",description:"Facts marked importance=5 (vital), surfaced globally",identityField:null,attrsSchema:{},visibility:"public",activeMode:"always",hotContextBudget:6,retrievalWeights:{recency:.5,relevance:1},importanceDefault:5,ttlDays:null,schemaDocPath:"kinds/vital.schema.md",writePolicy:"open",resolveActiveScope:async()=>Zi,fetchFacts:async(e={},{slots:t=8,namespace:n}={})=>{let r=n||e.namespace||l.defaults.namespace;return d("fact as f").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active","f.namespace":r}).where(o=>{o.where("f.importance","vital").orWhere("f.importance_score",5)}).orderByRaw("COALESCE(fl.access_count, 0) DESC, f.created_at DESC").limit(t).pluck("f.content")}}});function ea(){if(!yr){for(let e of Qi)nr(e);yr=!0}}var Qi,yr,gr=f(()=>{ze();Qe();dr();ot();hr();Er();Qi=[lr,nt,ur,fr,_r],yr=!1;ea()});var Ir={};T(Ir,{isSearchableQuery:()=>wr,search:()=>oa});async function oa(e,{namespaces:t,limit:n=5,minConfidence:r="medium",useGraph:o=!1,includeChunks:i=!1,pointInTime:s,expand:a=!1,route:c=!0,categories:u,synthesize:h=l.search.synthesize,podScope:y=null,applyFloor:m=!0,ctx:p={}}={}){let w=Date.now();if(!wr(e)){let g=aa();return g._trace={query:e,searchable:!1,stages:[{stage:"guard",note:"query is not searchable (empty or wildcard-only)"}],durationMs:Date.now()-w},g}h&&(i=!0);let _=null;c&&(_=await jn(e),o=o||_.useGraph,a=a||_.expand,n=_.limit||n,s=s||_.pointInTime,u=u||(_.categories.length?_.categories:void 0));let O=await ua(e,t),v=await la(y,{...p,namespace:t?.[0]}),E;O?E=await da(O,e,{namespaces:t,limit:n,minConfidence:r,includeChunks:i,pointInTime:s,categories:u,podIds:v}):E=await fa(e,{namespaces:t,limit:n,minConfidence:r,useGraph:o,includeChunks:i,pointInTime:s,expand:a,categories:u,podIds:v});let R=null;if(m&&Array.isArray(E.facts)&&E.facts.length){let g=l.memory.injectionFloor,j=E.facts.length;E.facts=E.facts.filter(te=>{if(te.source==="entity")return!0;let ne=Number(te.similarity);return Number.isFinite(ne)?ne>=g:!0}),R={threshold:g,dropped:j-E.facts.length,kept:E.facts.length}}let x=E.facts.map(g=>g.id).filter(Boolean);if(In(x).catch(g=>console.error("[access-tracking]",g.message)),On(x.slice(0,8)).catch(g=>console.error("[hebbian]",g.message)),l.hebbian.entity.enabled&&x.length>=2&&ca(x).catch(g=>console.error("[hebbian-entity]",g.message)),h)try{E.synthesized=await sa(e,E)}catch(g){console.error("[synthesizer] failed:",g.message),E.synthesized=null}return E._trace=ia({query:e,namespaces:t,limit:n,minConfidence:r,useGraph:o,expand:a,route:c,routing:_,matchedEntity:O,podScope:y,podIds:v,result:E,factIds:x,floored:R,durationMs:Date.now()-w}),E}function ia({query:e,namespaces:t,limit:n,minConfidence:r,useGraph:o,expand:i,route:s,routing:a,matchedEntity:c,podScope:u,podIds:h,result:y,factIds:m,floored:p,durationMs:w}){let _=E=>{let R=Number(E);return Number.isFinite(R)?Math.round(R*1e4)/1e4:null},O=(y.facts||[]).map((E,R)=>({rank:R+1,id:E.id??null,content:String(E.content||"").slice(0,240),category:E.category??null,importance:E.importance??null,confidence:E.confidence??null,source:E.source??null,similarity:_(E.similarity),rrfRaw:_(E.rrf_raw),activation:_(E.activation),accessCount:E.access_count??null,lastAccessedAt:E.lastAccessedAt??null,finalScore:_(E.final_score),rrfScore:_(E.rrfScore),coRetrievalBoost:_(E.coRetrievalBoost)})),v=(y.chunks||[]).map((E,R)=>({rank:R+1,id:E.id??null,sectionHeading:E.sectionHeading??null,content:String(E.content||"").slice(0,200),similarity:_(E.similarity),rrfScore:_(E.rrfScore)}));return{query:e,namespaces:t,durationMs:w,params:{limit:n,minConfidence:r,useGraphRequested:o,expandRequested:i,routeEnabled:s},routing:a?{intent:a.intent??null,reasoning:a.reasoning??null,useGraph:a.useGraph??null,expand:a.expand??null,limit:a.limit??null,categories:a.categories??null,pointInTime:a.pointInTime??null}:null,strategy:c?"entity-first":"standard",matchedEntity:c?{id:c.id,name:c.name,type:c.entityType,aliases:c.aliases||[]}:null,podScope:{requested:u,resolvedIds:h},floor:p?{applied:!0,threshold:p.threshold,dropped:p.dropped,kept:p.kept,note:"precision-first: facts below cosine floor dropped from injection"}:{applied:!1},ranking:{model:"RRF(vector\xD71.0 + keyword\xD70.7) \xD7 softplus(ACT-R activation) \xD7 importance \xD7 confidence",facts:O,chunks:v},synthesized:y.synthesized||null,relatedEntities:y.relatedEntities||[],reinforced:{factIds:m,note:"access_count bumped + Hebbian co-retrieval edges strengthened (off hot path)"}}}function wr(e){let t=String(e||"").trim();return t?!/^[*%_?\s]+$/.test(t):!1}function aa(){return{facts:[],chunks:[],matchedEntity:null,relatedEntities:[]}}async function sa(e,{facts:t,chunks:n}){let r=[];if(t.slice(0,10).forEach((s,a)=>{r.push(`[F${a+1}] (${s.category}) ${s.content}`)}),n.length&&n.slice(0,15).forEach((s,a)=>{let c=(s.content||"").replace(/\s+/g," ").trim();c&&r.push(`[C${a+1}] ${c.slice(0,2e3)}`)}),!r.length)return"No retrieved evidence \u2014 nothing to synthesize.";let o=`You are answering a question from a personal-memory system.
261
269
  Each retrieved item is labeled [F#] (a stored fact) or [C#] (a raw conversation chunk
262
270
  that may include user/assistant turns and dates).
263
271
 
@@ -272,8 +280,8 @@ Instructions:
272
280
  - Reason step-by-step internally for temporal questions ("first", "before", "after", "how many days") \u2014 compare the dates explicitly.
273
281
  - Cite items in square brackets where they directly support the answer, e.g. [C2].
274
282
  - Only respond "Not in retrieved memory." if you genuinely cannot find the information after carefully reading every chunk. Prefer a careful answer with citation over refusal.
275
- - Plain text only, no headers. Direct answer first, then a short justification if needed. 1-4 sentences total.`,i=c.search.synthesizeModel||c.llm.extractionModel||void 0;return ke(o,{model:i,caller:"synthesizer"})}async function Ci(e){let t=await J(e.slice(0,8)),n=[];for(let o of t.values())for(let i of o)n.push(i);let r=[...new Set(n)].slice(0,c.hebbian.entity.maxWriteEntities);await Fe(r)}async function Li(e,t={}){if(e==null||e==="global")return null;if(e==="auto"){let r=(await Fn(t)).flatMap(i=>i.scope).filter(i=>typeof i=="string"&&!i.startsWith("__virtual:"));return r.length===0?[]:(await p("pod").whereIn("uid",r).select("id")).map(i=>i.id)}if(Array.isArray(e)){if(e.length===0)return[];if(e.every(o=>typeof o=="number"))return e;let n=e.filter(o=>typeof o=="string");return n.length===0?[]:(await p("pod").where(function(){this.whereIn("uid",n).orWhereIn("name",n)}).select("id")).map(o=>o.id)}return null}async function Pi(e,t){if(e.length<2||e.length>Ni)return null;let n=t[0]||c.defaults.namespace,r=await en(e,n);return r||(await tn(e,{namespace:n,limit:1}))[0]||null}async function Mi(e,t,{namespaces:n,limit:r,minConfidence:o,includeChunks:i,pointInTime:s,categories:a,podIds:l}){let u=xi(t,e),h=await re(u,{inputType:"query"}),[E,m,...d]=await Promise.all([cn(e.id,{limit:r}),hn(e.id,{limit:15}),...u.map((S,ye)=>nr(S,{queryEmbedding:h[ye],namespaces:n,limit:r,minConfidence:o,includeChunks:i,pointInTime:s,categories:a,podIds:l}))]),_=E.map(S=>({...S,source:"entity"})),y=he(d.map(S=>S.facts),r*2),w=new Set(_.map(S=>S.id)),D=y.filter(S=>!w.has(S.id)).map(S=>({...S,source:"search"})),b=[..._,...D].slice(0,r);if(c.hebbian.entity.enabled&&b.length>=2)try{b=await tr(b,{seedEntityIds:[e.id]})}catch(S){console.error("[hebbian-entity-boost]",S.message)}let Ee=i?he(d.map(S=>S.chunks||[]),r):[],_e=m.map(S=>({id:S.entityId,name:S.name,type:S.entityType,relation:S.relationType,direction:S.direction,mentions:S.mentionCount}));return{facts:b,chunks:Ee,matchedEntity:{id:e.id,name:e.name,type:e.entityType,mentions:e.mentionCount,description:e.description||null,aliases:e.aliases||[]},relatedEntities:_e}}function xi(e,t){let n=[e],r=(t.aliases||[]).filter(s=>typeof s=="string"&&s.trim());if(!r.length)return n;let o=(t.name||"").trim(),i=new Set([e.toLowerCase()]);for(let s of r){let a=e;if(o){let l=new RegExp(`\\b${ki(o)}\\b`,"gi");if(l.test(a))a=a.replace(l,s);else{i.has(s.toLowerCase())||(n.push(s),i.add(s.toLowerCase()));continue}}i.has(a.toLowerCase())||(n.push(a),i.add(a.toLowerCase()))}return n}function ki(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function Fi(e,{namespaces:t,limit:n,minConfidence:r,useGraph:o,includeChunks:i,pointInTime:s,expand:a=!1,categories:l,podIds:u}){let h=a?await Dn(e):[e],E=await re(h,{inputType:"query"}),m=await Promise.all(h.map((y,w)=>nr(y,{queryEmbedding:E[w],namespaces:t,limit:n,minConfidence:r,includeChunks:i,pointInTime:s,categories:l,podIds:u}))),d=he(m.map(y=>y.facts),n);if(d=d.map(y=>({...y,source:"search"})),c.hebbian.entity.enabled&&d.length>=2)try{d=await tr(d)}catch(y){console.error("[hebbian-entity-boost]",y.message)}if(o&&d.length)try{let y=await In(d.slice(0,5));if(y.length){let w=await Bi(y.map(b=>b.id)),D=await On(w,{limit:5});d=Tn(d,D,w,n)}}catch(y){console.error("[graph-enhancement] Failed:",y.message)}let _=i?he(m.map(y=>y.chunks),n):[];return{facts:d,chunks:_,matchedEntity:null,relatedEntities:[]}}async function tr(e,t={}){let n=e.map(m=>m.id).filter(Boolean);if(n.length<2)return e;let r=await J(n);if(!r.size)return e;let o,i;if(t.seedEntityIds?.length)o=t.seedEntityIds,i=e;else{let m=t.seedFactCount??3,d=[];for(let _ of e.slice(0,m)){let y=r.get(_.id)||[];for(let w of y)d.push(w)}o=d,i=e.slice(m)}if(!o.length)return e;let s=new Set;for(let m of i){let d=r.get(m.id)||[];for(let _ of d)s.add(_)}if(!s.size)return e;let a=await Be([...new Set(o)],[...s]);if(!a.size)return e;let l=new Map,u=0;for(let m of e){let d=r.get(m.id)||[],_=0;for(let y of d){let w=a.get(y)||0;w>_&&(_=w)}l.set(m.id,_),_>u&&(u=_)}if(u===0)return e;let h=c.hebbian.entity.rrfWeight;return e.map(m=>{let d=(l.get(m.id)||0)/u,_=(m.rrfScore||0)+h*d;return{...m,rrfScore:Math.round(_*100)/100,coRetrievalBoost:Math.round(d*100)/100}}).sort((m,d)=>(d.rrfScore||0)-(m.rrfScore||0))}async function Bi(e){let t=c.hebbian.entity.expandPerSeed;if(!t||!e.length)return e;let{getCoRetrievedEntities:n}=await Promise.resolve().then(()=>(He(),fn)),r=await Promise.all(e.map(i=>n(i,{limit:t}).catch(()=>[]))),o=new Set(e);for(let i of r)for(let s of i)o.add(Number(s.partnerId));return[...o]}function he(e,t){let n={},r={};for(let s of e)for(let[a,l]of s.entries())r[l.id]=l,n[l.id]=(n[l.id]||0)+1/(Xe+a+1);let o=Object.entries(n).sort(([,s],[,a])=>a-s),i=o.length?o[0][1]:1;return o.slice(0,t).map(([s,a])=>({...r[s],rrfScore:Math.round(a/i*100)/100}))}async function nr(e,{queryEmbedding:t,namespaces:n,limit:r,minConfidence:o,includeChunks:i=!1,pointInTime:s,categories:a,podIds:l}){let u=t||await Ce(e,{inputType:"query"}),h=An(e,u,{namespaces:n,limit:r,minConfidence:o,pointInTime:s,categories:a,podIds:l}),E=i?[_n(u,{namespaces:n,limit:r}),gn(e,{namespaces:n,limit:r})]:[],[m,...d]=await Promise.all([h,...E]),_=i&&d.length===2?Hi(d[0],d[1],r):[];return{facts:m,chunks:_}}function Hi(e,t,n){let r={},o={...Ae(e,"id"),...Ae(t,"id")};e.forEach((a,l)=>{r[a.id]=(r[a.id]||0)+Oi/(Xe+l+1)}),t.forEach((a,l)=>{r[a.id]=(r[a.id]||0)+Ti/(Xe+l+1)});let i=Object.entries(r).sort(([a,l],[u,h])=>{if(l!==h)return h-l;let E=o[a]?.importance==="vital"?1:0;return(o[u]?.importance==="vital"?1:0)-E}),s=i.length?i[0][1]:1;return i.slice(0,n).map(([a,l])=>({...o[a],rrfScore:Math.round(l/s*100)/100}))}var Xe,Oi,Ti,Ni,or=f(()=>{ne();Le();g();nn();ce();dn();mn();He();En();ce();yn();wn();bn();Nn();vn();Mn();q();Qn();Ge();A();Xe=20,Oi=1,Ti=.7,Ni=60});var Y="***MASKED***",cr=[/\b(sk-(?:proj-|ant-)?[A-Za-z0-9_\-]{20,})\b/g,/\b(ghp_[A-Za-z0-9]{36,})\b/g,/\b(github_pat_[A-Za-z0-9_]{20,})\b/g,/\b(gho_[A-Za-z0-9]{36,})\b/g,/\b(glpat-[A-Za-z0-9_\-]{20,})\b/g,/\b(xox[baprs]-[A-Za-z0-9\-]{10,})\b/g,/\b(whsec_[A-Za-z0-9]{20,})\b/g,/\b(rk_(?:live|test)_[A-Za-z0-9]{20,})\b/g,/\b(AKIA[A-Z0-9]{16})\b/g,/\b(ASIA[A-Z0-9]{16})\b/g,/\b(eyJ[A-Za-z0-9_\-]{20,}\.[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,})\b/g,/\b([A-Za-z0-9]{24}\.[A-Za-z0-9_\-]{6}\.[A-Za-z0-9_\-]{27})\b/g,/\b(\d{8,12}:[A-Za-z0-9_\-]{35})\b/g],lr=new RegExp(`\\b(api[_-]?key|api[_-]?secret|secret[_-]?key|secret|token|password|passwd|pwd|auth[_-]?token|access[_-]?token|refresh[_-]?token|bearer|private[_-]?key|client[_-]?secret)\\s*[=:]\\s*["']?([^\\s"']{8,})["']?`,"gi"),ur=/(\w+:\/\/)([^:/\s]+):([^@\s]{3,})@/g,dr=["DATABASE_URL","REDIS_URL","MONGODB_URI","MONGO_URI","POSTGRES_URL","DSN","CONNECTION_STRING","ENCRYPTION_KEY","JWT_SECRET","SIGIL_ENCRYPTION_KEY","SESSION_SECRET","WEBHOOK_SECRET"],pr=new RegExp(`\\b(${dr.join("|")})\\s*[=:]\\s*["']?([^\\s"']+)["']?`,"gi");function Qe(e){if(!e||typeof e!="string")return e;let t=e;for(let n of cr)t=t.replace(n,Y);return t=t.replace(lr,(n,r)=>`${r}=${Y}`),t=t.replace(ur,(n,r)=>`${r}${Y}:${Y}@`),t=t.replace(pr,(n,r)=>`${r}=${Y}`),t}P();import{appendFile as Dr,readFile as sa,writeFile as ca,unlink as la}from"node:fs/promises";import{createHash as vr}from"node:crypto";var Cr=ot;async function Se(e,t,n=null){try{let r={ts:new Date().toISOString(),hook:e,error:t?.message||String(t),input_hash:n?Lr(n):null};await Dr(Cr,JSON.stringify(r)+`
276
- `,"utf8")}catch{}}async function ht(e,t=null){try{let{validateConfig:n}=await Promise.resolve().then(()=>(ft(),mt)),r=n().filter(o=>o.level==="fail");if(r.length===0)return!1;for(let o of r){let i=new Error(`${o.code}: ${o.message} \u2014 fix: ${o.fix}`);await Se(e,i,t)}return!0}catch{return!1}}function Lr(e){try{let t=typeof e=="string"?e:JSON.stringify(e);return vr("sha256").update(t).digest("hex").slice(0,12)}catch{return null}}P();import{resolve as Pr}from"node:path";import{existsSync as Et}from"node:fs";import{config as _t}from"dotenv";function yt(){let e=Pr(process.cwd(),".env");Et(e)&&_t({path:e,quiet:!0}),Et(Q)&&Q!==e&&_t({path:Q,quiet:!0})}yt();var $i=8,Ze=20,Ui=4800;async function Gi(){let e=[];for await(let o of process.stdin)e.push(o);let t=Buffer.concat(e).toString("utf8").trim();if(!t)return G();let n=JSON.parse(t),r=n.prompt||"";if(r.length<$i||await ht("user-prompt-submit",t))return G();try{let{search:o}=await Promise.resolve().then(()=>(or(),rr)),i=(await Promise.resolve().then(()=>(g(),ct))).default,s;try{s=await o(r,{namespaces:[i.defaults.namespace],limit:Ze,useGraph:!1,route:!0,expand:!0,synthesize:!1,podScope:"auto",ctx:{cwd:n.cwd||null,sessionId:n.session_id||null}})}catch(m){process.stderr.write(`[sigil:user-prompt-submit] pod-scoped search failed, retrying global: ${m.message}
277
- `),s=await o(r,{namespaces:[i.defaults.namespace],limit:Ze,useGraph:!1,route:!0,expand:!0,synthesize:!1,podScope:"global"})}let a=s?.facts||[];if(a.length===0)try{a=(await o(r,{namespaces:[i.defaults.namespace],limit:Ze,useGraph:!1,route:!0,expand:!0,synthesize:!1,podScope:"global"}))?.facts||[]}catch{}if(!a.length)return await(await Promise.resolve().then(()=>(A(),W))).default.destroy(),G();let l=[],u=0;for(let m of a){let d=(m.content||"").length+4;if(l.length>0&&u+d>Ui)break;l.push(m),u+=d}let h=Qe([`Sigil memory (${l.length} relevant facts):`,...l.map(m=>`- ${m.content}`)].join(`
278
- `));return await(await Promise.resolve().then(()=>(A(),W))).default.destroy(),G(h)}catch(o){process.stderr.write(`[sigil:user-prompt-submit] ${o.message}
279
- `),await Se("user-prompt-submit",o,t);try{await(await Promise.resolve().then(()=>(A(),W))).default.destroy()}catch{}return G()}}function G(e){let t={hookSpecificOutput:{hookEventName:"UserPromptSubmit",...e&&{additionalContext:e}}};process.stdout.write(JSON.stringify(t))}Gi();
283
+ - Plain text only, no headers. Direct answer first, then a short justification if needed. 1-4 sentences total.`,i=l.search.synthesizeModel||l.llm.extractionModel||void 0;return We(o,{model:i,caller:"synthesizer"})}async function ca(e){let t=await Z(e.slice(0,8)),n=[];for(let o of t.values())for(let i of o)n.push(i);let r=[...new Set(n)].slice(0,l.hebbian.entity.maxWriteEntities);await Ye(r)}async function la(e,t={}){if(e==null||e==="global")return null;if(e==="auto"){let r=(await rr(t)).flatMap(i=>i.scope).filter(i=>typeof i=="string"&&!i.startsWith("__virtual:"));if(r.length===0){if(process.env.SIGIL_SCOPE_GRACE!=="false"){let i=d("pod");t.namespace&&(i=i.where({namespace:t.namespace}));let[{count:s}]=await i.count({count:"*"});if(Number(s)===0)return null}return[]}return(await d("pod").whereIn("uid",r).select("id")).map(i=>i.id)}if(Array.isArray(e)){if(e.length===0)return[];if(e.every(o=>typeof o=="number"))return e;let n=e.filter(o=>typeof o=="string");return n.length===0?[]:(await d("pod").where(function(){this.whereIn("uid",n).orWhereIn("name",n)}).select("id")).map(o=>o.id)}return null}async function ua(e,t){if(e.length<2||e.length>ra)return null;let n=t[0]||l.defaults.namespace,r=await fn(e,n);return r||(await hn(e,{namespace:n,limit:1}))[0]||null}async function da(e,t,{namespaces:n,limit:r,minConfidence:o,includeChunks:i,pointInTime:s,categories:a,podIds:c}){let u=pa(t,e),h=await de(u,{inputType:"query"}),[y,m,...p]=await Promise.all([Sn(e.id,{limit:r}),Rn(e.id,{limit:15}),...u.map((g,j)=>Ar(g,{queryEmbedding:h[j],namespaces:n,limit:r,minConfidence:o,includeChunks:i,pointInTime:s,categories:a,podIds:c}))]),w=y.map(g=>({...g,source:"entity"})),_=be(p.map(g=>g.facts),r*2),O=new Set(w.map(g=>g.id)),v=_.filter(g=>!O.has(g.id)).map(g=>({...g,source:"search"})),E=[...w,...v].slice(0,r);if(l.hebbian.entity.enabled&&E.length>=2)try{E=await Sr(E,{seedEntityIds:[e.id]})}catch(g){console.error("[hebbian-entity-boost]",g.message)}let R=i?be(p.map(g=>g.chunks||[]),r):[],x=m.map(g=>({id:g.entityId,name:g.name,type:g.entityType,relation:g.relationType,direction:g.direction,mentions:g.mentionCount}));return{facts:E,chunks:R,matchedEntity:{id:e.id,name:e.name,type:e.entityType,mentions:e.mentionCount,description:e.description||null,aliases:e.aliases||[]},relatedEntities:x}}function pa(e,t){let n=[e],r=(t.aliases||[]).filter(s=>typeof s=="string"&&s.trim());if(!r.length)return n;let o=(t.name||"").trim(),i=new Set([e.toLowerCase()]);for(let s of r){let a=e;if(o){let c=new RegExp(`\\b${ma(o)}\\b`,"gi");if(c.test(a))a=a.replace(c,s);else{i.has(s.toLowerCase())||(n.push(s),i.add(s.toLowerCase()));continue}}i.has(a.toLowerCase())||(n.push(a),i.add(a.toLowerCase()))}return n}function ma(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function fa(e,{namespaces:t,limit:n,minConfidence:r,useGraph:o,includeChunks:i,pointInTime:s,expand:a=!1,categories:c,podIds:u}){let h=a?await Gn(e):[e],y=await de(h,{inputType:"query"}),m=await Promise.all(h.map((_,O)=>Ar(_,{queryEmbedding:y[O],namespaces:t,limit:n,minConfidence:r,includeChunks:i,pointInTime:s,categories:c,podIds:u}))),p=be(m.map(_=>_.facts),n);if(p=p.map(_=>({..._,source:"search"})),l.hebbian.entity.enabled&&p.length>=2)try{p=await Sr(p)}catch(_){console.error("[hebbian-entity-boost]",_.message)}if(o&&p.length)try{let _=await Bn(p.slice(0,5));if(_.length){let O=await ha(_.map(E=>E.id)),v=await $n(O,{limit:5});p=Fn(p,v,O,n)}}catch(_){console.error("[graph-enhancement] Failed:",_.message)}let w=i?be(m.map(_=>_.chunks),n):[];return{facts:p,chunks:w,matchedEntity:null,relatedEntities:[]}}async function Sr(e,t={}){let n=e.map(m=>m.id).filter(Boolean);if(n.length<2)return e;let r=await Z(n);if(!r.size)return e;let o,i;if(t.seedEntityIds?.length)o=t.seedEntityIds,i=e;else{let m=t.seedFactCount??3,p=[];for(let w of e.slice(0,m)){let _=r.get(w.id)||[];for(let O of _)p.push(O)}o=p,i=e.slice(m)}if(!o.length)return e;let s=new Set;for(let m of i){let p=r.get(m.id)||[];for(let w of p)s.add(w)}if(!s.size)return e;let a=await Ke([...new Set(o)],[...s]);if(!a.size)return e;let c=new Map,u=0;for(let m of e){let p=r.get(m.id)||[],w=0;for(let _ of p){let O=a.get(_)||0;O>w&&(w=O)}c.set(m.id,w),w>u&&(u=w)}if(u===0)return e;let h=l.hebbian.entity.rrfWeight;return e.map(m=>{let p=(c.get(m.id)||0)/u,w=(m.rrfScore||0)+h*p;return{...m,rrfScore:Math.round(w*100)/100,coRetrievalBoost:Math.round(p*100)/100}}).sort((m,p)=>(p.rrfScore||0)-(m.rrfScore||0))}async function ha(e){let t=l.hebbian.entity.expandPerSeed;if(!t||!e.length)return e;let{getCoRetrievedEntities:n}=await Promise.resolve().then(()=>(je(),Nn)),r=await Promise.all(e.map(i=>n(i,{limit:t}).catch(()=>[]))),o=new Set(e);for(let i of r)for(let s of i)o.add(Number(s.partnerId));return[...o]}function be(e,t){let n={},r={};for(let s of e)for(let[a,c]of s.entries())r[c.id]=c,n[c.id]=(n[c.id]||0)+1/(it+a+1);let o=Object.entries(n).sort(([,s],[,a])=>a-s),i=o.length?o[0][1]:1;return o.slice(0,t).map(([s,a])=>({...r[s],rrfScore:Math.round(a/i*100)/100}))}async function Ar(e,{queryEmbedding:t,namespaces:n,limit:r,minConfidence:o,includeChunks:i=!1,pointInTime:s,categories:a,podIds:c}){let u=t||await Be(e,{inputType:"query"}),h=Mn(e,u,{namespaces:n,limit:r,minConfidence:o,pointInTime:s,categories:a,podIds:c}),y=i?[vn(u,{namespaces:n,limit:r}),Cn(e,{namespaces:n,limit:r})]:[],[m,...p]=await Promise.all([h,...y]),w=i&&p.length===2?_a(p[0],p[1],r):[];return{facts:m,chunks:w}}function _a(e,t,n){let r={},o={...Re(e,"id"),...Re(t,"id")};e.forEach((a,c)=>{r[a.id]=(r[a.id]||0)+ta/(it+c+1)}),t.forEach((a,c)=>{r[a.id]=(r[a.id]||0)+na/(it+c+1)});let i=Object.entries(r).sort(([a,c],[u,h])=>{if(c!==h)return h-c;let y=o[a]?.importance==="vital"?1:0;return(o[u]?.importance==="vital"?1:0)-y}),s=i.length?i[0][1]:1;return i.slice(0,n).map(([a,c])=>({...o[a],rrfScore:Math.round(c/s*100)/100}))}var it,ta,na,ra,br=f(()=>{ue();$e();I();_n();Ee();bn();Tn();je();Dn();Ee();Ln();xn();kn();Un();Wn();Vn();Q();gr();ze();b();it=20,ta=1,na=.7,ra=60});oe();M();oe();import{appendFile as qr,readFile as ts,writeFile as ns,unlink as rs}from"node:fs/promises";import{createHash as zr}from"node:crypto";var Xr=lt;async function Ne(e,t,n=null){try{let r={ts:new Date().toISOString(),hook:e,error:J(t?.message||String(t)),input_hash:n?Zr(n):null};await qr(Xr,JSON.stringify(r)+`
284
+ `,"utf8")}catch{}}async function vt(e,t=null){try{let{validateConfig:n}=await Promise.resolve().then(()=>(Dt(),Rt)),r=n().filter(o=>o.level==="fail");if(r.length===0)return!1;for(let o of r){let i=new Error(`${o.code}: ${o.message} \u2014 fix: ${o.fix}`);await Ne(e,i,t)}return!0}catch{return!1}}function Zr(e){try{let t=typeof e=="string"?e:JSON.stringify(e);return zr("sha256").update(t).digest("hex").slice(0,12)}catch{return null}}M();import{resolve as Qr}from"node:path";import{existsSync as Lt}from"node:fs";import{config as Ct}from"dotenv";function xt(){let e=Qr(process.cwd(),".env");Lt(e)&&Ct({path:e,quiet:!0}),Lt(se)&&se!==e&&Ct({path:se,quiet:!0}),process.env.SIGIL_AGENT||(process.env.SIGIL_AGENT="claude-code")}xt();var Ea=8,ya=20,ga=4800;async function wa(){let e=[];for await(let o of process.stdin)e.push(o);let t=Buffer.concat(e).toString("utf8").trim();if(!t)return B();let n=JSON.parse(t),r=n.prompt||"";if(r.length<Ea||await vt("user-prompt-submit",t))return B();try{let{search:o}=await Promise.resolve().then(()=>(br(),Ir)),i=(await Promise.resolve().then(()=>(I(),mt))).default,s;try{s=await o(r,{namespaces:[i.defaults.namespace],limit:ya,useGraph:!1,route:!0,expand:!0,synthesize:!1,podScope:"auto",ctx:{cwd:n.cwd||null,sessionId:n.session_id||null}})}catch(m){return process.stderr.write(`[sigil:user-prompt-submit] scoped search failed: ${m.message}
285
+ `),await(await Promise.resolve().then(()=>(b(),$))).default.destroy().catch(()=>{}),B()}let a=s?.facts||[];if(!a.length)return await(await Promise.resolve().then(()=>(b(),$))).default.destroy(),B();let c=[],u=0;for(let m of a){let p=(m.content||"").length+4;if(c.length>0&&u+p>ga)break;c.push(m),u+=p}let h=J([`Sigil memory (${c.length} relevant facts):`,...c.map(m=>`- ${m.content}`)].join(`
286
+ `));return await(await Promise.resolve().then(()=>(b(),$))).default.destroy(),B(h)}catch(o){process.stderr.write(`[sigil:user-prompt-submit] ${o.message}
287
+ `),await Ne("user-prompt-submit",o,t);try{await(await Promise.resolve().then(()=>(b(),$))).default.destroy()}catch{}return B()}}function B(e){let t={hookSpecificOutput:{hookEventName:"UserPromptSubmit",...e&&{additionalContext:e}}};process.stdout.write(JSON.stringify(t))}wa();