@anmol-srv/sigil 0.11.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
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 I}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(I(e,"package.json"))&&st(I(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,dt,Ua,Ha,M=f(()=>{ie=Pr(),ae=I(ie,"prompts"),Na=I(ie,"src","db","migrations"),ct=xr(),N=I(ct,".sigil"),se=I(N,".env"),Ra=I(N,"db"),Da=I(N,"CLAUDE.md"),Mr=I(N,"schemas"),lt=I(N,".hook-errors.log"),kr=I(N,".last-clean-doctor"),ut=I(N,".active-session.json"),va=I(N,".stop-cursor.json"),La=I(N,".hook-dedup.json"),Ca=I(N,"sock"),xa=I(N,"sigild.pid"),Pa=I(N,"sigild.log"),Ma=I(N,"gui.token"),ka=I(ie,"dist","gui"),Ba=I(ie,"src","gui","web"),$a=I(N,"iroh"),Fa=I(N,"identity.key"),dt=I(ct,".claude"),Ua=I(dt,"settings.json"),Ha=I(dt,"CLAUDE.md")});var mt={};T(mt,{default:()=>l});var S,pt,Br,l,A=f(()=>{S=(e,t)=>process.env[e]??t,pt=S("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
+ 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.
4
4
  PGlite was deprecated; existing PGlite data at ~/.sigil/db is preserved but unreachable from this version.
5
5
  Set SIGIL_DB_TYPE=postgres in ~/.sigil/.env and configure SIGIL_DB_HOST / PORT / NAME / USER / PASSWORD.
6
- Run \`sigil init\` for an interactive setup.`);Br={db:{type:"postgres",get url(){return S("SIGIL_DATABASE_URL",S("DATABASE_URL",""))||null},get host(){return S("SIGIL_DB_HOST","localhost")},get port(){return Number(S("SIGIL_DB_PORT",5432))},get database(){return S("SIGIL_DB_NAME","sigil")},get user(){return S("SIGIL_DB_USER","sigil_app")},get password(){return S("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:{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"},http:{enabled:S("SIGIL_HTTP_ENABLED","true")!=="false",host:S("SIGIL_HTTP_HOST","127.0.0.1"),port:Number(S("SIGIL_HTTP_PORT",7777))},network:{mode:S("SIGIL_MODE","solo"),enabled:S("SIGIL_NETWORK_ENABLED",null)===null?S("SIGIL_MODE","solo")!=="solo":S("SIGIL_NETWORK_ENABLED","false")!=="false",masterNodeId:S("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:S("SIGIL_SYNTHESIZE","true")!=="false",synthesizeModel:S("SIGIL_SYNTH_MODEL","")},ingest:{eagerExtract:S("SIGIL_EAGER_EXTRACT","true")!=="false"},hebbian:{entity:{enabled:S("SIGIL_HEBBIAN_ENTITY_ENABLED",null,"true")!=="false",eta:Number(S("SIGIL_HEBBIAN_ENTITY_ETA",null,1)),cap:Number(S("SIGIL_HEBBIAN_ENTITY_CAP",null,50)),halfLifeDays:Number(S("SIGIL_HEBBIAN_ENTITY_HALF_LIFE_DAYS",null,30)),minEffective:Number(S("SIGIL_HEBBIAN_ENTITY_MIN_EFFECTIVE",null,.5)),rrfWeight:Number(S("SIGIL_HEBBIAN_ENTITY_RRF_WEIGHT",null,.3)),maxWriteEntities:Number(S("SIGIL_HEBBIAN_ENTITY_MAX_WRITE",null,12)),expandPerSeed:Number(S("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(()=>{A();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(()=>{A();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(()=>{A();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(()=>{A();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.
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.
8
8
  You will pick an embedding provider in the next step \u2014 "openrouter" is an option,
9
- or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"OpenRouter scope"),{env:n}}var co,uo,$t,F,Ut=f(()=>{A();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(()=>{A();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(()=>{A();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
+ 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:
10
10
  - Set LLM_PROVIDER (openai, anthropic, openrouter, ollama, claude-cli)
11
11
  - Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY
12
12
  - Start Ollama locally
@@ -15,7 +15,7 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
15
15
  - Set VOYAGE_API_KEY (recommended \u2014 best quality)
16
16
  - Start Ollama locally
17
17
  - Set OPENAI_API_KEY
18
- - Set OPENROUTER_API_KEY (and EMBEDDING_MODEL like "openai/text-embedding-3-large")`)}var Pe,Qt,Ce,xe,D,L,ke=f(()=>{A();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(()=>{A()});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
+ - 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(`
19
19
  INSERT INTO embedding_cache (key, provider, model, embedding, hits, created_at, last_used_at)
20
20
  VALUES (?, ?, ?, ?, 0, NOW(), NOW())
21
21
  ON CONFLICT (key) DO UPDATE
@@ -26,7 +26,7 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
26
26
  SELECT key FROM embedding_cache ORDER BY last_used_at ASC LIMIT ?
27
27
  )
28
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 Bs,$e=f(()=>{A();ke();un();({dimensions:Bs}=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();A()});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
+ `)})}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(`
30
30
  INSERT INTO pod (uid, pod_type, name, namespace, attrs, entity_id, connection_id, external_id, started_at, created_at, updated_at)
31
31
  VALUES (?, ?, ?, ?, ?::jsonb, ?, ?, ?, ?, NOW(), NOW())
32
32
  ON CONFLICT (pod_type, external_id, namespace) WHERE external_id IS NOT NULL DO UPDATE SET
@@ -37,14 +37,14 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
37
37
  SET member_doc_count = member_doc_count + ?,
38
38
  member_fact_count = member_fact_count + ?,
39
39
  updated_at = NOW()
40
- WHERE id = ?`,[t,n,e])}var fe=f(()=>{Fe();b();A()});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
+ 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)
41
41
  VALUES (?, ?, ?, ?)
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(()=>{A();ke();z()});import zo from"node:path";async function In(e){e.length&&await d.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
43
43
  SET access_count = access_count + 1,
44
44
  last_accessed_at = NOW(),
45
45
  stage = CASE WHEN stage = 'stable' THEN 'editing' ELSE stage END,
46
46
  stage_entered_at = CASE WHEN stage = 'stable' THEN NOW() ELSE stage_entered_at END
47
- WHERE fact_id = ANY(?)`,[e])}var pc,mc,fc,bn=f(()=>{b();$e();Q();G();oe();A();M();pc=zo.join(ae,"audm-decision.md"),mc=l.memory.skipThreshold,fc=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
+ 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(`
48
48
  INSERT INTO hebbian_edge (fact_a_id, fact_b_id, strength, first_seen_at, last_seen_at)
49
49
  VALUES ${r}
50
50
  ON CONFLICT (fact_a_id, fact_b_id)
@@ -103,7 +103,7 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
103
103
  JOIN entity eb ON eb.id = entity_b_id
104
104
  ORDER BY "decayed" DESC
105
105
  LIMIT ?
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();A();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
+ `,[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(`
107
107
  SELECT r.id AS "relationId", r.relation_type AS "relationType",
108
108
  r.mention_count AS "mentionCount", r.valid_at AS "validAt",
109
109
  e.id AS "entityId", e.uid, e.name, e.entity_type AS "entityType",
@@ -129,7 +129,7 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
129
129
  AND embedding IS NOT NULL
130
130
  ORDER BY ${o}
131
131
  LIMIT ?
132
- `,[r,t,r,n]);return i}var Ln=f(()=>{b();G();A();Se()});async function Cn(e,{namespaces:t,limit:n=20}){let{rows:r}=await d.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(`
133
133
  SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
134
134
  content, section_heading AS "sectionHeading", namespace,
135
135
  ts_rank(search_vector, plainto_tsquery('english', ?)) as rank
@@ -244,7 +244,7 @@ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"Op
244
244
  ORDER BY final_score DESC,
245
245
  CASE WHEN importance = 'vital' THEN 0 ELSE 1 END
246
246
  LIMIT ?
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();A();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.
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.
248
248
 
249
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.
250
250
 
@@ -256,7 +256,7 @@ Think about:
256
256
 
257
257
  User query: "${e}"
258
258
 
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();A();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")}
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")}
260
260
 
261
261
  ---
262
262
 
@@ -264,8 +264,8 @@ Query: ${e}
264
264
 
265
265
  ---
266
266
 
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();A();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();A();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();A();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();A();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();A();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();A();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.
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.
269
269
  Each retrieved item is labeled [F#] (a stored fact) or [C#] (a raw conversation chunk
270
270
  that may include user/assistant turns and dates).
271
271
 
@@ -280,8 +280,8 @@ Instructions:
280
280
  - Reason step-by-step internally for temporal questions ("first", "before", "after", "how many days") \u2014 compare the dates explicitly.
281
281
  - Cite items in square brackets where they directly support the answer, e.g. [C2].
282
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.
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();A();_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 Qa,writeFile as es,unlink as ts}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(()=>(A(),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}
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
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
286
  `));return await(await Promise.resolve().then(()=>(b(),$))).default.destroy(),B(h)}catch(o){process.stderr.write(`[sigil:user-prompt-submit] ${o.message}
287
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();