@anmol-srv/sigil 0.10.3 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/daemon.js ADDED
@@ -0,0 +1,647 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __sigilCreateRequire } from 'node:module'; const require = __sigilCreateRequire(import.meta.url);
3
+ var Zm=Object.defineProperty;var u=(e,t)=>()=>(e&&(t=e(e=0)),t);var b=(e,t)=>{for(var r in t)Zm(e,r,{get:t[r],enumerable:!0})};import{fileURLToPath as Qm}from"node:url";import{dirname as ua,join as C}from"node:path";import{existsSync as da}from"node:fs";import{homedir as eh}from"node:os";function th(){let e=ua(Qm(import.meta.url));for(let t=0;t<10;t++){if(da(C(e,"package.json"))&&da(C(e,"prompts")))return e;let r=ua(e);if(r===e)break;e=r}return process.cwd()}var me,K,nt,fa,k,j,Yv,qn,pa,Kv,qv,ma,Vv,zv,Ue,qt,Vn,Vt,zn,Jn,Xn,Ge,ha,Jv,Xv,L=u(()=>{me=th(),K=C(me,"prompts"),nt=C(me,"src","db","migrations"),fa=eh(),k=C(fa,".sigil"),j=C(k,".env"),Yv=C(k,"db"),qn=C(k,"CLAUDE.md"),pa=C(k,"schemas"),Kv=C(k,".hook-errors.log"),qv=C(k,".last-clean-doctor"),ma=C(k,".active-session.json"),Vv=C(k,".stop-cursor.json"),zv=C(k,".hook-dedup.json"),Ue=C(k,"sock"),qt=C(k,"sigild.pid"),Vn=C(k,"sigild.log"),Vt=C(k,"gui.token"),zn=C(me,"dist","gui"),Jn=C(me,"src","gui","web"),Xn=C(k,"iroh"),Ge=C(k,"identity.key"),ha=C(fa,".claude"),Jv=C(ha,"settings.json"),Xv=C(ha,"CLAUDE.md")});var to={};b(to,{currentAgent:()=>uh,currentDeviceId:()=>lh,currentRequestContext:()=>eo,runWithRequestContext:()=>ch});import{AsyncLocalStorage as sh}from"node:async_hooks";function ch(e,t){return Fr.run(e,t)}function eo(){return Fr.getStore()||null}function lh(){return Fr.getStore()?.device?.id??null}function uh(){return Fr.getStore()?.agent??process.env.SIGIL_AGENT??null}var Fr,$r=u(()=>{Fr=new sh});var io={};b(io,{clearRegistry:()=>oo,getDbHealth:()=>ph,getRegistry:()=>no,setDbHealth:()=>fh,setRegistry:()=>ro});function ro(e){Br=e}function no(){if(!Br)throw new Error("rpc registry not initialised \u2014 is the daemon running?");return Br}function oo(){Br=null}function fh(e){Ia={healthy:null,error:null,checkedAt:null,...e}}function ph(){return Ia}var Br,Ia,zt=u(()=>{Br=null;Ia={healthy:null,error:null,checkedAt:null}});var Oa={};b(Oa,{EventBus:()=>Ur,default:()=>H});var Ur,Sh,H,ot=u(()=>{Ur=class{constructor(){this.buffer=[],this.subs=new Set}emit(t,r={}){let n={type:t,ts:new Date().toISOString(),...r};this.buffer.push(n),this.buffer.length>200&&this.buffer.shift();for(let o of this.subs)try{o(n)}catch{}return n}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}},Sh=new Ur,H=Sh});function Ma(e){let t=e.split(`
4
+ `),r=[],n=null,o=[];for(let s of t){let c=s.match(/^(#{1,6})\s+(.+)/);c?(o.length&&r.push({heading:n||"Introduction",text:o.join(`
5
+ `).trim()}),n=c[2].trim(),o=[]):o.push(s)}o.length&&r.push({heading:n||"Content",text:o.join(`
6
+ `).trim()});let i=r.map(s=>s.text).join(`
7
+
8
+ `),a=Bh(t)||null;return{text:i,sections:r,metadata:{title:a}}}function Bh(e){for(let t of e){let r=t.match(/^#\s+(.+)/);if(r)return r[1].trim()}return null}var Fa=u(()=>{});function co(e){let t=e.split(/\n{2,}/).map(n=>n.trim()).filter(Boolean),r=t.length>1?t.map((n,o)=>({heading:`Section ${o+1}`,text:n})):[{heading:"Content",text:e.trim()}];return{text:e.trim(),sections:r,metadata:{}}}var $a=u(()=>{});function Ba(e){let t=Hh(e),r=e.replace(/<script[\s\S]*?<\/script>/gi,"");return r=r.replace(/<style[\s\S]*?<\/style>/gi,""),r=r.replace(/<\/(p|div|h[1-6]|li|tr|br|hr)>/gi,`
9
+ `),r=r.replace(/<br\s*\/?>/gi,`
10
+ `),r=r.replace(/<[^>]+>/g,""),r=r.replace(/&amp;/g,"&"),r=r.replace(/&lt;/g,"<"),r=r.replace(/&gt;/g,">"),r=r.replace(/&quot;/g,'"'),r=r.replace(/&#39;/g,"'"),r=r.replace(/&nbsp;/g," "),r=r.replace(/[ \t]+/g," "),r=r.replace(/\n{3,}/g,`
11
+
12
+ `),r=r.trim(),{text:r,sections:[{heading:"Content",text:r}],metadata:{title:t}}}function Hh(e){let t=e.match(/<title[^>]*>([\s\S]*?)<\/title>/i);return t?t[1].trim():null}var Ha=u(()=>{});function Ua(e,{language:t}={}){let r=t||Wh(e),n=Uh(e,r);return{text:e.trim(),sections:n,metadata:{language:r}}}function Uh(e,t){let r=e.split(`
13
+ `),n=[],o="Header",i=[],a=!1,s=0;for(let c of r){let l=Gh(c,t);l&&s===0?(i.length&&n.push({heading:o,text:i.join(`
14
+ `).trim()}),o=l,i=[c],a=!0):i.push(c);for(let d of c)d==="{"&&s++,d==="}"&&(s=Math.max(0,s-1))}return i.length&&n.push({heading:o,text:i.join(`
15
+ `).trim()}),n.length<=1?jh(e):n.filter(c=>c.text)}function Gh(e,t){let r=e.trim(),n=[/^(?:export\s+)?(?:async\s+)?function\s+(\w+)/,/^(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s*)?\(/,/^(?:export\s+)?class\s+(\w+)/,/^(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=\s*\{/,/^(?:export\s+default\s+)/],o=[/^(?:async\s+)?def\s+(\w+)/,/^class\s+(\w+)/],i=[/^func\s+(?:\(\w+\s+\*?\w+\)\s+)?(\w+)/,/^type\s+(\w+)/],a=[...n,...o,...i];for(let s of a){let c=r.match(s);if(c)return c[1]||c[0].slice(0,40)}return null}function jh(e){return e.split(/\n{2,}/).map((r,n)=>({heading:`Block ${n+1}`,text:r.trim()})).filter(r=>r.text)}function Wh(e){return e.includes("import ")&&(e.includes("from ")||e.includes("require("))?"javascript":e.match(/^def\s/m)||e.match(/^class\s.*:/m)?"python":e.match(/^func\s/m)||e.includes("package ")?"go":e.match(/^fn\s/m)||e.includes("use ")?"rust":"unknown"}var Ga=u(()=>{});function ja(e){let t;try{t=typeof e=="string"?JSON.parse(e):e}catch{return{text:e,sections:[{heading:"Content",text:e}],metadata:{}}}let r=lo(t);return{text:r,sections:[{heading:"Content",text:r}],metadata:{}}}function lo(e,t=0){if(e==null)return"";if(Array.isArray(e))return e.map((r,n)=>typeof r=="object"&&r!==null?`Item ${n+1}:
16
+ ${lo(r,t+1)}`:`- ${r}`).join(`
17
+ `);if(typeof e=="object"){let r=" ".repeat(t);return Object.entries(e).filter(([,n])=>n!=null).map(([n,o])=>typeof o=="object"?`${r}${n}:
18
+ ${lo(o,t+1)}`:`${r}${n}: ${o}`).join(`
19
+ `)}return String(e)}var Wa=u(()=>{});function Ya(e,{format:t,filePath:r,contentType:n}={}){let o=t||Vh(n)||zh(r)||Jh(e);return(qh[o]||co)(e)}function Vh(e){if(!e)return null;let t=e.split(";")[0].trim();return Kh[t]||null}function zh(e){if(!e)return null;let t=e.match(/\.[^.]+$/)?.[0]?.toLowerCase();return t&&Yh[t]||null}function Jh(e){if(!e)return"text";let t=e.trim();return t.startsWith("{")||t.startsWith("[")?"json":t.startsWith("<!DOCTYPE")||t.startsWith("<html")?"html":t.match(/^#{1,6}\s/m)?"markdown":t.match(/^(import|export|function|class|const|let|var|def|func|package)\s/m)?"code":"text"}var Yh,Kh,qh,Ka=u(()=>{Fa();$a();Ha();Ga();Wa();Yh={".md":"markdown",".mdx":"markdown",".txt":"text",".html":"html",".htm":"html",".json":"json",".js":"code",".ts":"code",".jsx":"code",".tsx":"code",".py":"code",".go":"code",".rs":"code",".java":"code",".rb":"code",".php":"code",".c":"code",".cpp":"code",".h":"code",".cs":"code",".swift":"code",".kt":"code",".yaml":"text",".yml":"text",".toml":"text",".ini":"text",".cfg":"text",".env":"text",".csv":"text",".sql":"code",".sh":"code",".bash":"code",".zsh":"code"},Kh={"text/markdown":"markdown","text/html":"html","text/plain":"text","application/json":"json","text/javascript":"code","application/javascript":"code","text/x-python":"code"},qh={markdown:Ma,text:co,html:Ba,code:Ua,json:ja}});function Xh(e,{maxTokens:t=512,overlapTokens:r=50}={}){if(!e?.trim())return[];let n=t*4,o=r*4;if(e.length<=n)return[{content:e.trim(),index:0}];let i=Zh(e),a=[],s="",c="";for(let l of i){if(l.length>n){s.trim()&&(a.push({content:s.trim(),index:a.length}),c=uo(s,o),s="");let d=Qh(l,n,o);for(let p of d)a.push({content:p.trim(),index:a.length});c=uo(a[a.length-1].content,o);continue}(s+l).length>n?(a.push({content:s.trim(),index:a.length}),c=uo(s,o),s=c+l):s+=l}return s.trim()&&a.push({content:s.trim(),index:a.length}),a}function Va(e,t={}){let r=[];for(let{heading:n,text:o}of e){if(!o?.trim())continue;let i=Xh(o,t);for(let a of i)r.push({content:a.content,index:r.length,sectionHeading:n})}return r}function Zh(e){return e.split(/(?<=[.!?])\s+|(?<=\n)\s*/).filter(r=>r.trim())}function Qh(e,t,r){let n=[],o=0;for(;o<e.length;){let i=Math.min(o+t,e.length);if(n.push(e.slice(o,i)),o=i-r,o>=e.length)break}return n}function uo(e,t){if(e.length<=t)return e;let r=e.slice(-t),n=r.search(/[.!?]\s+/);return n!==-1?r.slice(n+1).trimStart():r}var qa,fo=u(()=>{qa=Object.freeze({version:3,size:512,overlap:50,contextualPrefix:!0})});var q={};b(q,{default:()=>g});var N,za,eg,g,S=u(()=>{N=(e,t)=>process.env[e]??t,za=N("SIGIL_DB_TYPE","postgres");if(za!=="postgres")throw new Error(`SIGIL_DB_TYPE=${za} is no longer supported. Sigil 0.10.0+ is Postgres-only.
20
+ PGlite was deprecated; existing PGlite data at ~/.sigil/db is preserved but unreachable from this version.
21
+ Set SIGIL_DB_TYPE=postgres in ~/.sigil/.env and configure SIGIL_DB_HOST / PORT / NAME / USER / PASSWORD.
22
+ Run \`sigil init\` for an interactive setup.`);eg={db:{type:"postgres",get url(){return N("SIGIL_DATABASE_URL",N("DATABASE_URL",""))||null},get host(){return N("SIGIL_DB_HOST","localhost")},get port(){return Number(N("SIGIL_DB_PORT",5432))},get database(){return N("SIGIL_DB_NAME","sigil")},get user(){return N("SIGIL_DB_USER","sigil_app")},get password(){return N("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:N("SIGIL_HTTP_ENABLED","true")!=="false",host:N("SIGIL_HTTP_HOST","127.0.0.1"),port:Number(N("SIGIL_HTTP_PORT",7777))},network:{mode:N("SIGIL_MODE","solo"),enabled:N("SIGIL_NETWORK_ENABLED",null)===null?N("SIGIL_MODE","solo")!=="solo":N("SIGIL_NETWORK_ENABLED","false")!=="false",masterNodeId:N("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:N("SIGIL_SYNTHESIZE","true")!=="false",synthesizeModel:N("SIGIL_SYNTH_MODEL","")},ingest:{eagerExtract:N("SIGIL_EAGER_EXTRACT","true")!=="false"},hebbian:{entity:{enabled:N("SIGIL_HEBBIAN_ENTITY_ENABLED",null,"true")!=="false",eta:Number(N("SIGIL_HEBBIAN_ENTITY_ETA",null,1)),cap:Number(N("SIGIL_HEBBIAN_ENTITY_CAP",null,50)),halfLifeDays:Number(N("SIGIL_HEBBIAN_ENTITY_HALF_LIFE_DAYS",null,30)),minEffective:Number(N("SIGIL_HEBBIAN_ENTITY_MIN_EFFECTIVE",null,.5)),rrfWeight:Number(N("SIGIL_HEBBIAN_ENTITY_RRF_WEIGHT",null,.3)),maxWriteEntities:Number(N("SIGIL_HEBBIAN_ENTITY_MAX_WRITE",null,12)),expandPerSeed:Number(N("SIGIL_HEBBIAN_ENTITY_EXPAND_PER_SEED",null,3))}}},g=eg});var Ja={};b(Ja,{chat:()=>tg,meta:()=>rg,setup:()=>ng});async function tg(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.openaiModel,o=[{role:"user",content:e}];r&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:n,messages:o};r&&(i.response_format={type:"json_object"});let a=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${g.llm.openaiApiKey}`},body:JSON.stringify(i)});if(!a.ok){let d=await a.text();throw new Error(`OpenAI error ${a.status}: ${d}`)}let s=await a.json(),c=s.choices[0].message.content.trim(),l=s.usage||{};return{text:c,inputTokens:l.prompt_tokens||0,outputTokens:l.completion_tokens||0,model:n}}async function ng({existing:e,clack:t}){let r=e.OPENAI_API_KEY||"",n=await t.text({message:"OpenAI API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-proj-...",validate:o=>{if(!o&&!r)return"API key is required";if(o&&!o.startsWith("sk-"))return'OpenAI keys start with "sk-" \u2014 check paste'}});return t.isCancel(n)?null:{env:{OPENAI_API_KEY:n||r}}}var rg,Xa=u(()=>{S();rg={id:"openai",label:"OpenAI",hint:"gpt-4o-mini"}});var Za={};b(Za,{buildLocalConnection:()=>se});function se(e){return{host:e.db.host,port:e.db.port,database:e.db.database,user:e.db.user,password:e.db.password}}var it=u(()=>{});var es={};b(es,{buildUrlConnection:()=>ce,classifyProvider:()=>be,directMigrationUrl:()=>po,isPooledUrl:()=>jr});function ce(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 r=t.searchParams.get("sslmode"),n=ig(t.hostname,r),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 n!==void 0&&(o.ssl=n),t.searchParams.get("application_name")||(o.application_name="sigil"),o}function ig(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(!Qa.some(r=>r.test(e)))return og.some(r=>r.test(e))?{rejectUnauthorized:!0}:{rejectUnauthorized:!1}}function jr(e){try{let t=new URL(e).hostname;return/-pooler\./i.test(t)||/\.pooler\.supabase\.com$/i.test(t)}catch{return!1}}function po(e){let t;try{t=new URL(e)}catch{return null}let r=t.hostname;return/\.neon\.tech$/i.test(r)&&/-pooler\./i.test(r)?(t.hostname=r.replace("-pooler.","."),t.toString()):jr(e)?null:e}function be(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":Qa.some(r=>r.test(t))?"local":"unknown"}catch{return"unknown"}}var og,Qa,at=u(()=>{og=[/\.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],Qa=[/^localhost$/i,/^127\.0\.0\.1$/,/^::1$/,/\.local$/i]});var ho={};b(ho,{buildLocalConnection:()=>se,buildUrlConnection:()=>ce,classifyProvider:()=>be,selectDriver:()=>mo});function mo(e){let t=e.db.url;return t?{kind:"url",provider:be(t),connection:ce(t)}:{kind:"local",provider:"local",connection:se(e)}}var Wr=u(()=>{it();at()});var P={};b(P,{default:()=>m});import ag from"knex";function sg(e){return Array.isArray(e)?e.map(go):e&&typeof e=="object"?go(e):e}function cg(e,t){return t(lg(e))}function go(e){if(!e||typeof e!="object"||e instanceof Date)return e;if(Array.isArray(e))return e.map(go);let t={};for(let[r,n]of Object.entries(e))t[r.replace(/_([a-z])/g,(o,i)=>i.toUpperCase())]=n;return t}function lg(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}var ts,rs,m,A=u(()=>{S();Wr();ts=mo(g),rs=ag({client:"pg",connection:ts.connection,pool:{min:2,max:10},postProcessResponse:sg,wrapIdentifier:cg});rs.__sigilDriver=ts;m=rs});function Z(e){return Math.ceil((e||"").length/4)}function yo(e,t,r){let n=ug[e];return n?(t*n.input+r*n.output)/1e6:0}function Zt({provider:e,model:t,caller:r,input:n,response:o,inputTokens:i,outputTokens:a,cost:s,durationMs:c,status:l,error:d}){m("llm_log").insert({provider:e,model:t,caller:r,input:n?.slice(0,1e4),response:o?.slice(0,1e4),inputTokens:i,outputTokens:a,cost:s,durationMs:c,status:l,error:d?.slice(0,2e3)}).catch(p=>console.error("[llm-log] Write failed:",p.message))}async function wo(e,t=3){for(let r=1;r<=t;r++)try{return await e()}catch(n){if(r===t)throw n;let o=Math.min(1e3*2**(r-1),1e4);await new Promise(i=>setTimeout(i,o))}}var ug,Qt=u(()=>{A();ug={"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 ns={};b(ns,{chat:()=>fg,meta:()=>pg,setup:()=>mg});async function dg(){if(!Eo){let{default:e}=await import("@anthropic-ai/sdk");Eo=new e({apiKey:g.llm.apiKey})}return Eo}async function fg(e,{model:t,jsonMode:r=!1}={}){let n=t||"claude-haiku-4-5-20251001",o=await dg(),i=[{role:"user",content:e}],a=r?"Respond with valid JSON only. No explanation or wrapping.":void 0,s=await o.messages.create({model:n,max_tokens:4096,messages:i,...a&&{system:a}});return{text:s.content[0].text.trim(),inputTokens:s.usage?.input_tokens||Z(e),outputTokens:s.usage?.output_tokens||Z(s.content[0].text),model:n}}async function mg({existing:e,clack:t}){let r=e.ANTHROPIC_API_KEY||"",n=await t.text({message:"Anthropic API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-ant-...",validate:o=>{if(!o&&!r)return"API key is required";if(o&&!o.startsWith("sk-ant-"))return'Anthropic keys start with "sk-ant-" \u2014 check paste'}});return t.isCancel(n)?null:{env:{ANTHROPIC_API_KEY:n||r}}}var Eo,pg,os=u(()=>{S();Qt();Eo=null;pg={id:"anthropic",label:"Anthropic",hint:"Claude Haiku \u2014 requires API key"}});var as={};b(as,{chat:()=>gg,meta:()=>yg,setup:()=>wg});async function gg(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.openrouterModel;if(!g.llm.openrouterApiKey)throw new Error("OPENROUTER_API_KEY is not set");if(!n)throw new Error("No OpenRouter model resolved. Set LLM_OPENROUTER_MODEL or pass `model`.");let o=[{role:"user",content:e}];r&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:n,messages:o};r&&(i.response_format={type:"json_object"});let a=(g.llm.openrouterBaseUrl||hg).replace(/\/+$/,""),s={"Content-Type":"application/json",Authorization:`Bearer ${g.llm.openrouterApiKey}`};g.llm.openrouterReferer&&(s["HTTP-Referer"]=g.llm.openrouterReferer),g.llm.openrouterTitle&&(s["X-Title"]=g.llm.openrouterTitle);let c=await fetch(`${a}/chat/completions`,{method:"POST",headers:s,body:JSON.stringify(i)});if(!c.ok){let h=await c.text();throw new Error(`OpenRouter error ${c.status}: ${h}`)}let l=await c.json(),p=(l.choices?.[0]?.message?.content||"").trim(),f=l.usage||{};return{text:p,inputTokens:f.prompt_tokens||0,outputTokens:f.completion_tokens||0,model:l.model||n}}async function wg({existing:e,clack:t}){let r={},n=e.OPENROUTER_API_KEY||"",o=await t.text({message:"OpenRouter API key (paste, then Enter)",placeholder:n?"(keep existing \u2014 press Enter)":"sk-or-v1-...",validate:c=>{if(!c&&!n)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;r.OPENROUTER_API_KEY=o||n;let i=e.LLM_OPENROUTER_MODEL||"",a=await t.text({message:"OpenRouter model (vendor/model)",placeholder:i||is,validate:c=>{if(c&&!c.includes("/"))return'OpenRouter models are "vendor/model" \u2014 e.g. google/gemini-flash-latest'}});if(t.isCancel(a))return null;r.LLM_OPENROUTER_MODEL=a||i||is;let s=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(s))return null;if(s==="yes"){let c=await t.text({message:"Extraction model (high-volume; cheap matters)",placeholder:e.LLM_EXTRACTION_MODEL||st.extraction});if(t.isCancel(c))return null;r.LLM_EXTRACTION_MODEL=c||e.LLM_EXTRACTION_MODEL||st.extraction;let l=await t.text({message:"Decision model (AUDM; smart matters)",placeholder:e.LLM_DECISION_MODEL||st.decision});if(t.isCancel(l))return null;r.LLM_DECISION_MODEL=l||e.LLM_DECISION_MODEL||st.decision;let d=await t.text({message:"Synthesis model (read-time answer composition)",placeholder:e.SIGIL_SYNTH_MODEL||st.synthesis});if(t.isCancel(d))return null;r.SIGIL_SYNTH_MODEL=d||e.SIGIL_SYNTH_MODEL||st.synthesis}return t.note(`OpenRouter can drive both LLM calls and embeddings.
23
+ You will pick an embedding provider in the next step \u2014 "openrouter" is an option,
24
+ or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"OpenRouter scope"),{env:r}}var hg,yg,is,st,ss=u(()=>{S();hg="https://openrouter.ai/api/v1";yg={id:"openrouter",label:"OpenRouter",hint:"one key, many models (Anthropic / OpenAI / Meta / ...)"},is="google/gemini-flash-latest",st={extraction:"openrouter:qwen/qwen3.5-flash",decision:"openrouter:anthropic/claude-sonnet-latest",synthesis:"openrouter:anthropic/claude-sonnet-latest"}});var cs={};b(cs,{chat:()=>Sg,meta:()=>Ag,setup:()=>Ig});import{spawn as Eg}from"node:child_process";function bg(e,t){let r=g.llm.cliTimeout||12e4;return new Promise((n,o)=>{let i=Eg("claude",e,{stdio:["pipe","pipe","pipe"]}),a=setTimeout(()=>{i.kill("SIGTERM"),o(new Error(`claude CLI timed out after ${r}ms`))},r),s="",c="";i.stdout.on("data",l=>{s+=l}),i.stderr.on("data",l=>{c+=l}),i.on("error",l=>{clearTimeout(a),o(new Error(`Failed to spawn claude CLI: ${l.message}`))}),i.on("close",l=>{clearTimeout(a),n({stdout:s,stderr:c,code:l})}),i.stdin.write(t),i.stdin.end()})}async function Sg(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.cliModel||"haiku",o=_g[n]||n,i=["-p","--model",o,"--output-format","json"];r&&i.push("--json-schema",xg);let{stdout:a,stderr:s,code:c}=await bg(i,e);if(c!==0)throw new Error(`claude CLI exited ${c}: ${(s||a).slice(0,500)}`);let l;try{l=JSON.parse(a)}catch{return{text:a.trim(),inputTokens:Z(e),outputTokens:Z(a),model:o}}if(l.is_error)throw new Error(`claude CLI error: ${l.result||"unknown error"}`);let d=r&&l.structured_output?JSON.stringify(l.structured_output):(l.result||"").trim(),p=l.usage||{};return{text:d,inputTokens:p.input_tokens||Z(e),outputTokens:p.output_tokens||Z(d),model:o,cost:l.total_cost_usd||0}}async function Ig(){return{env:{}}}var _g,xg,Ag,ls=u(()=>{S();Qt();_g={"claude-haiku-4-5-20251001":"haiku","claude-sonnet-4-6":"sonnet","claude-opus-4-6":"opus"},xg=JSON.stringify({type:"object",additionalProperties:!0});Ag={id:"claude-cli",label:"Claude Code",hint:"uses your existing subscription \u2014 no extra API key"}});var us={};b(us,{chat:()=>vg,meta:()=>Tg,setup:()=>Og});async function vg(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.ollamaModel,o=`${g.llm.ollamaHost}/api/chat`,i={model:n,messages:[{role:"user",content:e}],stream:!1};r&&(i.format="json");let a=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!a.ok){let c=await a.text();throw new Error(`Ollama error ${a.status}: ${c}`)}let s=await a.json();return{text:s.message.content.trim(),inputTokens:s.prompt_eval_count||Z(e),outputTokens:s.eval_count||Z(s.message.content),model:n}}async function Og({existing:e,clack:t}){let r=e.OLLAMA_HOST||"http://localhost:11434",n=await t.text({message:"Ollama host",placeholder:r,initialValue:r,validate:o=>{if(o&&!/^https?:\/\//.test(o))return"Must start with http:// or https://"}});return t.isCancel(n)?null:{env:{OLLAMA_HOST:n||r}}}var Tg,ds=u(()=>{S();Qt();Tg={id:"ollama",label:"Ollama",hint:"local models \u2014 no API cost"}});function _o(e,t){let r={};for(let n of e)r[n[t]]=n;return r}function Yr(e,t){if(t<1)return[];let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}var Kr=u(()=>{});var fs={};b(fs,{embedBatch:()=>Cg});async function Cg(e,{model:t,ollamaHost:r}){let n=Yr(e,Ng),o=[];for(let i of n){let a=await fetch(`${r}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:t,input:i})});if(!a.ok)throw new Error(`Ollama embed failed: ${a.status} ${await a.text()}`);let s=await a.json();o.push(...s.embeddings)}return o}var Ng,ps=u(()=>{Kr();Ng=50});var ms={};b(ms,{embedBatch:()=>Rg});async function Rg(e,{model:t,openaiApiKey:r,dimensions:n}={}){let o={model:t,input:e};n&&/^text-embedding-3/.test(t)&&(o.dimensions=n);let i=await fetch("https://api.openai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(o)});if(!i.ok)throw new Error(`OpenAI embed failed: ${i.status} ${await i.text()}`);return(await i.json()).data.map(s=>s.embedding)}var hs=u(()=>{});var gs={};b(gs,{embedBatch:()=>Lg});async function Lg(e,{model:t,voyageApiKey:r,inputType:n="document",dimensions:o}={}){if(!r)throw new Error("VOYAGE_API_KEY is not set. Get one at dashboard.voyageai.com.");let i=Yr(e,Dg),a=[];for(let s of i){let c={input:s,model:t||"voyage-3-large",input_type:n==="query"?"query":"document"};o&&(c.output_dimension=o);let l=await fetch("https://api.voyageai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(c)});if(!l.ok){let f=await l.text();throw new Error(`Voyage embed failed: ${l.status} ${f}`)}let p=[...(await l.json()).data].sort((f,h)=>f.index-h.index);a.push(...p.map(f=>f.embedding))}return a}var Dg,ys=u(()=>{Kr();Dg=50});var ws={};b(ws,{embedBatch:()=>Pg});async function Pg(e,{model:t,openrouterApiKey:r,openrouterBaseUrl:n,openrouterReferer:o,openrouterTitle:i,dimensions:a}={}){if(!r)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 s={model:t,input:e};a&&/(^|\/)text-embedding-3/.test(t)&&(s.dimensions=a);let c=(n||kg).replace(/\/+$/,""),l={"Content-Type":"application/json",Authorization:`Bearer ${r}`};o&&(l["HTTP-Referer"]=o),i&&(l["X-Title"]=i);let d=await fetch(`${c}/embeddings`,{method:"POST",headers:l,body:JSON.stringify(s)});if(!d.ok)throw new Error(`OpenRouter embed failed: ${d.status} ${await d.text()}`);return[...(await d.json()).data].sort((h,w)=>h.index-w.index).map(h=>h.embedding)}var kg,Es=u(()=>{kg="https://openrouter.ai/api/v1"});import{spawn as Mg}from"node:child_process";async function Ao(e){if(!xo[e]){let t=So[e];if(!t)throw new Error(`Unknown LLM provider: "${e}". Available: ${Object.keys(So).join(", ")}`);let r=await t();xo[e]=r.chat}return xo[e]}async function xs(e){if(!bo[e]){let t=_s[e];if(!t)throw new Error(`Unknown embedding provider: "${e}". Available: ${Object.keys(_s).join(", ")}`);let r=await t();bo[e]=r.embedBatch}return bo[e]}function bs(e,t){if(!e)return{provider:t,model:null};let r=e.indexOf(":");return r>0&&So[e.slice(0,r)]?{provider:e.slice(0,r),model:e.slice(r+1)}:{provider:t,model:e}}async function Ss(){let e=g.llm.ollamaHost||g.embedding.ollamaHost||"http://localhost:11434";try{return(await fetch(`${e}/api/tags`,{signal:AbortSignal.timeout(2e3)})).ok}catch{return!1}}function Fg(){return new Promise(e=>{let t=Mg("claude",["--version"],{stdio:"pipe"});t.on("error",()=>e(!1)),t.on("close",r=>e(r===0)),setTimeout(()=>{t.kill(),e(!1)},3e3)})}async function As(){if(W)return W;if(g.llm.provider)return W=g.llm.provider,W;if(g.llm.openrouterApiKey)return W="openrouter",W;if(g.llm.apiKey)return W="anthropic",W;if(g.llm.openaiApiKey)return W="openai",W;if(await Ss())return W="ollama",W;if(await Fg())return W="claude-cli",W;throw new Error(`No LLM provider available. Either:
25
+ - Set LLM_PROVIDER (openai, anthropic, openrouter, ollama, claude-cli)
26
+ - Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY
27
+ - Start Ollama locally
28
+ - Install the Claude CLI (claude)`)}async function Is(){if(V)return V;if(g.embedding.provider)return V=g.embedding.provider,V;if(g.embedding.voyageApiKey)return V="voyage",V;if(await Ss())return V="ollama",V;if(g.embedding.openaiApiKey)return V="openai",V;if(g.embedding.openrouterApiKey)return V="openrouter",V;throw new Error(`No embedding provider available. Either:
29
+ - Set EMBEDDING_PROVIDER (voyage, ollama, openai, openrouter)
30
+ - Set VOYAGE_API_KEY (recommended \u2014 best quality)
31
+ - Start Ollama locally
32
+ - Set OPENAI_API_KEY
33
+ - Set OPENROUTER_API_KEY (and EMBEDDING_MODEL like "openai/text-embedding-3-large")`)}var So,_s,xo,bo,W,V,Io=u(()=>{S();So={openai:()=>Promise.resolve().then(()=>(Xa(),Ja)),anthropic:()=>Promise.resolve().then(()=>(os(),ns)),openrouter:()=>Promise.resolve().then(()=>(ss(),as)),"claude-cli":()=>Promise.resolve().then(()=>(ls(),cs)),ollama:()=>Promise.resolve().then(()=>(ds(),us))},_s={ollama:()=>Promise.resolve().then(()=>(ps(),fs)),openai:()=>Promise.resolve().then(()=>(hs(),ms)),voyage:()=>Promise.resolve().then(()=>(ys(),gs)),openrouter:()=>Promise.resolve().then(()=>(Es(),ws))},xo={},bo={};W=null,V=null});function $(e){return e?`[${e.join(",")}]`:null}function vs(){let e=Number(g.embedding.dimensions)||768;if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid EMBEDDING_DIMENSIONS: ${g.embedding.dimensions}`);return e}function le(e="embedding"){return`(${e}::halfvec(${vs()}))`}function ue(){return`?::halfvec(${vs()})`}var Se=u(()=>{S()});import{createHash as $g}from"node:crypto";function Hg(e,t,r,n="document"){let o=$g("sha256");return o.update(e),o.update("\0"),o.update(t),o.update("\0"),o.update(n),o.update("\0"),o.update(r),o.digest("hex")}async function Ug(e){if(!e.length)return new Map;let t=await m("embedding_cache").whereIn("key",e).select("key","embedding");return new Map(t.map(r=>[r.key,Gg(r.embedding)]))}function Gg(e){return Array.isArray(e)||typeof e!="string"?e:(e.startsWith("[")?e.slice(1,-1):e).split(",").map(Number)}async function jg(e){e.length&&await m("embedding_cache").whereIn("key",e).update({hits:m.raw("hits + 1"),lastUsedAt:m.fn.now()})}async function Wg(e,t,r){if(e.length){for(let{key:n,embedding:o}of e)await m.raw(`
34
+ INSERT INTO embedding_cache (key, provider, model, embedding, hits, created_at, last_used_at)
35
+ VALUES (?, ?, ?, ?, 0, NOW(), NOW())
36
+ ON CONFLICT (key) DO UPDATE
37
+ SET last_used_at = NOW(),
38
+ hits = embedding_cache.hits + 1
39
+ `,[n,t,r,$(o)]);await Kg()}}async function Kg(){let e=Date.now();if(e-Os<Yg)return;Os=e;let[{count:t}]=await m("embedding_cache").count("key as count"),r=Number(t);if(r<=Ts)return;let n=Math.min(r-Ts,Bg);await m.raw(`
40
+ DELETE FROM embedding_cache WHERE key IN (
41
+ SELECT key FROM embedding_cache ORDER BY last_used_at ASC LIMIT ?
42
+ )
43
+ `,[n])}async function Ns(e,t,r,n,o,i={}){if(!e.length)return[];let a=i.inputType||o?.inputType||"document",s=e.map(h=>Hg(t,r,h,a)),c=await Ug(s),l=[],d=[],p=new Array(e.length);for(let h=0;h<e.length;h++){let w=c.get(s[h]);w?p[h]=w:(l.push(e[h]),d.push(h))}if(l.length){let h=await n(l,o),w=[];for(let y=0;y<l.length;y++){let E=d[y];p[E]=h[y],w.push({key:s[E],embedding:h[y]})}Wg(w,t,r).catch(y=>{process.stderr.write(`[embedding-cache] store failed: ${y.message}
44
+ `)})}let f=s.filter(h=>c.has(h));return f.length&&jg(f).catch(()=>{}),p}var Ts,Bg,Os,Yg,Cs=u(()=>{Se();A();Ts=1e4,Bg=500;Os=0,Yg=6e4});var Rs={};b(Rs,{dimensions:()=>qg,embed:()=>je,embedBatch:()=>he});async function je(e,t={}){let[r]=await he([e],t);return r}async function he(e,{inputType:t="document"}={}){if(!e.length)return[];let r=await Is(),n=await xs(r),o=g.embedding.model,i={...g.embedding,inputType:t};return Ns(e,r,o,n,i,{inputType:t})}var qg,ct=u(()=>{S();Io();Cs();({dimensions:qg}=g.embedding)});var Ls={};b(Ls,{parseJson:()=>qr,prompt:()=>ge,promptJson:()=>Q});async function Ds(e){let t=await As();return bs(e,t)}async function ge(e,{model:t,caller:r}={}){let{provider:n,model:o}=await Ds(t),i=await Ao(n),a=Date.now();try{let s=await wo(()=>i(e,{model:o,jsonMode:!1}),g.llm.maxRetries),c=s.cost||yo(s.model,s.inputTokens,s.outputTokens);return Zt({provider:n,model:s.model,caller:r,input:e,response:s.text,inputTokens:s.inputTokens,outputTokens:s.outputTokens,cost:c,durationMs:Date.now()-a,status:"success"}),s.text}catch(s){throw Zt({provider:n,model:o,caller:r,input:e,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-a,status:"error",error:s.message}),s}}async function Q(e,{model:t,caller:r}={}){let{provider:n,model:o}=await Ds(t),i=await Ao(n),a=Date.now();try{let s=await wo(()=>i(e,{model:o,jsonMode:!0}),g.llm.maxRetries),c=s.cost||yo(s.model,s.inputTokens,s.outputTokens);return Zt({provider:n,model:s.model,caller:r,input:e,response:s.text,inputTokens:s.inputTokens,outputTokens:s.outputTokens,cost:c,durationMs:Date.now()-a,status:"success"}),qr(s.text)}catch(s){throw Zt({provider:n,model:o,caller:r,input:e,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-a,status:"error",error:s.message}),s}}function qr(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 r=e.match(/[\[{][\s\S]*[\]}]/);if(r)try{return JSON.parse(r[0])}catch{}return null}var ee=u(()=>{S();Io();Qt()});import{readFile as Vg}from"node:fs/promises";import{join as zg}from"node:path";async function ks(e,t,{title:r}){if(!e.length)return e;let n=await Vg(Jg,"utf8"),o=e.map((a,s)=>`Chunk ${s+1}: ${a.content.slice(0,200)}`),i=`${n}
45
+
46
+ ---
47
+
48
+ **Document title:** ${r}
49
+
50
+ **Full document:**
51
+ ${t.slice(0,8e3)}
52
+
53
+ **Chunks (${e.length}):**
54
+ ${o.join(`
55
+ `)}
56
+
57
+ ---
58
+
59
+ Respond with a JSON array of ${e.length} context prefix strings.`;try{let a=await Q(i,{model:g.llm.extractionModel,caller:"contextualizer"}),s=Array.isArray(a)?a:a&&typeof a=="object"?Object.values(a).find(l=>Array.isArray(l))??null:null;if(!s)return console.warn("[contextualizer] LLM did not return an array \u2014 skipping"),e;let c=s;return c.length!==e.length&&console.warn(`[contextualizer] Got ${c.length} prefixes for ${e.length} chunks \u2014 using partial`),e.map((l,d)=>({...l,contextualPrefix:typeof c[d]=="string"?c[d]:null}))}catch(a){return console.error("[contextualizer] Failed:",a.message),e}}var Jg,Ps=u(()=>{ee();S();L();Jg=zg(K,"chunk-context.md")});var Ms,Fs=u(()=>{Ms="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"});import{webcrypto as $s}from"node:crypto";function Zg(e){if(e<0||e>1024)throw new RangeError("Wrong ID size");!We||We.length<e?(We=Buffer.allocUnsafe(e*Xg),$s.getRandomValues(We),lt=0):lt+e>We.length&&($s.getRandomValues(We),lt=0),lt+=e}function te(e=21){Zg(e|=0);let t="";for(let r=lt-e;r<lt;r++)t+=Ms[We[r]&63];return t}var Xg,We,lt,ut=u(()=>{Fs();Xg=128});var No={};b(No,{deleteDocument:()=>ny,findBySourcePath:()=>Qg,findByUid:()=>ey,getStats:()=>ty,listDocuments:()=>ry,resetHash:()=>To,updateCounts:()=>Vr,updateSourceMetadata:()=>Oo,upsert:()=>vo});async function Qg(e){let[t]=await m("document").where({sourcePath:e});return t||null}async function ey(e){let[t]=await m("document").where({uid:e});return t||null}async function vo({sourcePath:e,sourceType:t,title:r=null,contentHash:n,namespace:o}){let i=`doc-${te(16)}`,{rows:[a]}=await m.raw(`
60
+ INSERT INTO document (uid, source_path, source_type, title, content_hash, namespace, last_ingested_at, created_at, updated_at)
61
+ VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW(), NOW())
62
+ ON CONFLICT (source_path, namespace) DO UPDATE SET
63
+ title = EXCLUDED.title,
64
+ content_hash = EXCLUDED.content_hash,
65
+ last_ingested_at = NOW(),
66
+ updated_at = NOW()
67
+ RETURNING *, (xmax = 0) AS "isNew", content_hash != ? AS "contentChanged"
68
+ `,[i,e,t,r,n,o,n]),c=a.isNew||a.contentChanged;return{doc:a,changed:c}}async function Vr(e,{chunkCount:t,factCount:r}){await m("document").where({id:e}).update({chunkCount:t,factCount:r})}async function ty(e){let t=m("document");e&&t.where({namespace:e});let r=await t;return{documentCount:r.length,totalChunks:r.reduce((n,o)=>n+(o.chunkCount||0),0),totalFacts:r.reduce((n,o)=>n+(o.factCount||0),0)}}async function ry({namespace:e,sourceType:t,limit:r=100}={}){let n=m("document").orderBy("createdAt","desc").limit(r);return e&&n.where({namespace:e}),t&&n.where({sourceType:t}),n}async function ny(e){await m("chunk").where({documentId:e}).del(),await m("document").where({id:e}).del()}async function To(e){await m("document").where({id:e}).update({contentHash:null})}async function Oo(e,t,r=null){if(!t&&!r)return;let n={};t&&Object.keys(t).length&&(n.sourceMetadata=JSON.stringify(t)),r&&(n.connectionId=r),Object.keys(n).length&&await m("document").where({id:e}).update(n)}var Co=u(()=>{ut();A()});async function Bs(e,t,r){if(await m("chunk").where({documentId:e}).del(),!t.length)return[];let n=t.map((i,a)=>({documentId:e,chunkIndex:a,content:i.content,contextualPrefix:i.contextualPrefix||null,sectionHeading:i.sectionHeading||null,namespace:r,embedding:$(i.embedding)})),o=await m("chunk").insert(n).returning("*");return await m.raw(`
69
+ UPDATE chunk
70
+ SET search_vector = to_tsvector('english', COALESCE(contextual_prefix, '') || ' ' || content)
71
+ WHERE document_id = ?
72
+ `,[e]),o}var Hs=u(()=>{A();Se()});var iy,zr,Ro=u(()=>{iy=typeof global=="object"&&global&&global.Object===Object&&global,zr=iy});var ay,sy,M,de=u(()=>{Ro();ay=typeof self=="object"&&self&&self.Object===Object&&self,sy=zr||ay||Function("return this")(),M=sy});var cy,U,dt=u(()=>{de();cy=M.Symbol,U=cy});function dy(e){var t=ly.call(e,er),r=e[er];try{e[er]=void 0;var n=!0}catch{}var o=uy.call(e);return n&&(t?e[er]=r:delete e[er]),o}var Us,ly,uy,er,Gs,js=u(()=>{dt();Us=Object.prototype,ly=Us.hasOwnProperty,uy=Us.toString,er=U?U.toStringTag:void 0;Gs=dy});function my(e){return py.call(e)}var fy,py,Ws,Ys=u(()=>{fy=Object.prototype,py=fy.toString;Ws=my});function yy(e){return e==null?e===void 0?gy:hy:Ks&&Ks in Object(e)?Gs(e):Ws(e)}var hy,gy,Ks,re,ft=u(()=>{dt();js();Ys();hy="[object Null]",gy="[object Undefined]",Ks=U?U.toStringTag:void 0;re=yy});function wy(e){return e!=null&&typeof e=="object"}var ne,pt=u(()=>{ne=wy});function _y(e){return typeof e=="symbol"||ne(e)&&re(e)==Ey}var Ey,oe,mt=u(()=>{ft();pt();Ey="[object Symbol]";oe=_y});function xy(e,t){for(var r=-1,n=e==null?0:e.length,o=Array(n);++r<n;)o[r]=t(e[r],r,e);return o}var ht,Do=u(()=>{ht=xy});var by,D,z=u(()=>{by=Array.isArray,D=by});function zs(e){if(typeof e=="string")return e;if(D(e))return ht(e,zs)+"";if(oe(e))return Vs?Vs.call(e):"";var t=e+"";return t=="0"&&1/e==-Sy?"-0":t}var Sy,qs,Vs,Js,Xs=u(()=>{dt();Do();z();mt();Sy=1/0,qs=U?U.prototype:void 0,Vs=qs?qs.toString:void 0;Js=zs});function Iy(e){for(var t=e.length;t--&&Ay.test(e.charAt(t)););return t}var Ay,Zs,Qs=u(()=>{Ay=/\s/;Zs=Iy});function Ty(e){return e&&e.slice(0,Zs(e)+1).replace(vy,"")}var vy,ec,tc=u(()=>{Qs();vy=/^\s+/;ec=Ty});function Oy(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var ie,gt=u(()=>{ie=Oy});function Ly(e){if(typeof e=="number")return e;if(oe(e))return rc;if(ie(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=ie(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=ec(e);var r=Cy.test(e);return r||Ry.test(e)?Dy(e.slice(2),r?2:8):Ny.test(e)?rc:+e}var rc,Ny,Cy,Ry,Dy,nc,oc=u(()=>{tc();gt();mt();rc=NaN,Ny=/^[-+]0x[0-9a-f]+$/i,Cy=/^0b[01]+$/i,Ry=/^0o[0-7]+$/i,Dy=parseInt;nc=Ly});function Py(e){if(!e)return e===0?e:0;if(e=nc(e),e===ic||e===-ic){var t=e<0?-1:1;return t*ky}return e===e?e:0}var ic,ky,ac,sc=u(()=>{oc();ic=1/0,ky=17976931348623157e292;ac=Py});function My(e){var t=ac(e),r=t%1;return t===t?r?t-r:t:0}var cc,lc=u(()=>{sc();cc=My});function Fy(e){return e}var Ae,tr=u(()=>{Ae=Fy});function Gy(e){if(!ie(e))return!1;var t=re(e);return t==By||t==Hy||t==$y||t==Uy}var $y,By,Hy,Uy,Jr,Lo=u(()=>{ft();gt();$y="[object AsyncFunction]",By="[object Function]",Hy="[object GeneratorFunction]",Uy="[object Proxy]";Jr=Gy});var jy,Xr,uc=u(()=>{de();jy=M["__core-js_shared__"],Xr=jy});function Wy(e){return!!dc&&dc in e}var dc,fc,pc=u(()=>{uc();dc=(function(){var e=/[^.]+$/.exec(Xr&&Xr.keys&&Xr.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""})();fc=Wy});function qy(e){if(e!=null){try{return Ky.call(e)}catch{}try{return e+""}catch{}}return""}var Yy,Ky,ye,ko=u(()=>{Yy=Function.prototype,Ky=Yy.toString;ye=qy});function tw(e){if(!ie(e)||fc(e))return!1;var t=Jr(e)?ew:zy;return t.test(ye(e))}var Vy,zy,Jy,Xy,Zy,Qy,ew,mc,hc=u(()=>{Lo();pc();gt();ko();Vy=/[\\^$.*+?()[\]{}|]/g,zy=/^\[object .+?Constructor\]$/,Jy=Function.prototype,Xy=Object.prototype,Zy=Jy.toString,Qy=Xy.hasOwnProperty,ew=RegExp("^"+Zy.call(Qy).replace(Vy,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");mc=tw});function rw(e,t){return e?.[t]}var gc,yc=u(()=>{gc=rw});function nw(e,t){var r=gc(e,t);return mc(r)?r:void 0}var Y,Ie=u(()=>{hc();yc();Y=nw});var ow,Zr,wc=u(()=>{Ie();de();ow=Y(M,"WeakMap"),Zr=ow});function iw(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}var Ec,_c=u(()=>{Ec=iw});function aw(){}var xc,bc=u(()=>{xc=aw});function uw(e){var t=0,r=0;return function(){var n=lw(),o=cw-(n-r);if(r=n,o>0){if(++t>=sw)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var sw,cw,lw,Sc,Ac=u(()=>{sw=800,cw=16,lw=Date.now;Sc=uw});function dw(e){return function(){return e}}var Ic,vc=u(()=>{Ic=dw});var fw,yt,Po=u(()=>{Ie();fw=(function(){try{var e=Y(Object,"defineProperty");return e({},"",{}),e}catch{}})(),yt=fw});var pw,Tc,Oc=u(()=>{vc();Po();tr();pw=yt?function(e,t){return yt(e,"toString",{configurable:!0,enumerable:!1,value:Ic(t),writable:!0})}:Ae,Tc=pw});var mw,Nc,Cc=u(()=>{Oc();Ac();mw=Sc(Tc),Nc=mw});function hw(e,t,r,n){for(var o=e.length,i=r+(n?1:-1);n?i--:++i<o;)if(t(e[i],i,e))return i;return-1}var Rc,Dc=u(()=>{Rc=hw});function gw(e){return e!==e}var Lc,kc=u(()=>{Lc=gw});function yw(e,t,r){for(var n=r-1,o=e.length;++n<o;)if(e[n]===t)return n;return-1}var Pc,Mc=u(()=>{Pc=yw});function ww(e,t,r){return t===t?Pc(e,t,r):Rc(e,Lc,r)}var Fc,$c=u(()=>{Dc();kc();Mc();Fc=ww});function Ew(e,t){var r=e==null?0:e.length;return!!r&&Fc(e,t,0)>-1}var Bc,Hc=u(()=>{$c();Bc=Ew});function bw(e,t){var r=typeof e;return t=t??_w,!!t&&(r=="number"||r!="symbol"&&xw.test(e))&&e>-1&&e%1==0&&e<t}var _w,xw,wt,Qr=u(()=>{_w=9007199254740991,xw=/^(?:0|[1-9]\d*)$/;wt=bw});function Sw(e,t,r){t=="__proto__"&&yt?yt(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}var Uc,Gc=u(()=>{Po();Uc=Sw});function Aw(e,t){return e===t||e!==e&&t!==t}var Et,en=u(()=>{Et=Aw});function Iw(e,t,r){return t=jc(t===void 0?e.length-1:t,0),function(){for(var n=arguments,o=-1,i=jc(n.length-t,0),a=Array(i);++o<i;)a[o]=n[t+o];o=-1;for(var s=Array(t+1);++o<t;)s[o]=n[o];return s[t]=r(a),Ec(e,this,s)}}var jc,Wc,Yc=u(()=>{_c();jc=Math.max;Wc=Iw});function vw(e,t){return Nc(Wc(e,t,Ae),e+"")}var Kc,qc=u(()=>{tr();Yc();Cc();Kc=vw});function Ow(e){return typeof e=="number"&&e>-1&&e%1==0&&e<=Tw}var Tw,_t,tn=u(()=>{Tw=9007199254740991;_t=Ow});function Nw(e){return e!=null&&_t(e.length)&&!Jr(e)}var ve,rr=u(()=>{Lo();tn();ve=Nw});function Cw(e,t,r){if(!ie(r))return!1;var n=typeof t;return(n=="number"?ve(r)&&wt(t,r.length):n=="string"&&t in r)?Et(r[t],e):!1}var nr,Mo=u(()=>{en();rr();Qr();gt();nr=Cw});function Dw(e){var t=e&&e.constructor,r=typeof t=="function"&&t.prototype||Rw;return e===r}var Rw,Vc,zc=u(()=>{Rw=Object.prototype;Vc=Dw});function Lw(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n}var Jc,Xc=u(()=>{Jc=Lw});function Pw(e){return ne(e)&&re(e)==kw}var kw,Fo,Zc=u(()=>{ft();pt();kw="[object Arguments]";Fo=Pw});var Qc,Mw,Fw,$w,xt,rn=u(()=>{Zc();pt();Qc=Object.prototype,Mw=Qc.hasOwnProperty,Fw=Qc.propertyIsEnumerable,$w=Fo((function(){return arguments})())?Fo:function(e){return ne(e)&&Mw.call(e,"callee")&&!Fw.call(e,"callee")},xt=$w});function Bw(){return!1}var el,tl=u(()=>{el=Bw});var ol,rl,Hw,nl,Uw,Gw,or,$o=u(()=>{de();tl();ol=typeof exports=="object"&&exports&&!exports.nodeType&&exports,rl=ol&&typeof module=="object"&&module&&!module.nodeType&&module,Hw=rl&&rl.exports===ol,nl=Hw?M.Buffer:void 0,Uw=nl?nl.isBuffer:void 0,Gw=Uw||el,or=Gw});function pE(e){return ne(e)&&_t(e.length)&&!!R[re(e)]}var jw,Ww,Yw,Kw,qw,Vw,zw,Jw,Xw,Zw,Qw,eE,tE,rE,nE,oE,iE,aE,sE,cE,lE,uE,dE,fE,R,il,al=u(()=>{ft();tn();pt();jw="[object Arguments]",Ww="[object Array]",Yw="[object Boolean]",Kw="[object Date]",qw="[object Error]",Vw="[object Function]",zw="[object Map]",Jw="[object Number]",Xw="[object Object]",Zw="[object RegExp]",Qw="[object Set]",eE="[object String]",tE="[object WeakMap]",rE="[object ArrayBuffer]",nE="[object DataView]",oE="[object Float32Array]",iE="[object Float64Array]",aE="[object Int8Array]",sE="[object Int16Array]",cE="[object Int32Array]",lE="[object Uint8Array]",uE="[object Uint8ClampedArray]",dE="[object Uint16Array]",fE="[object Uint32Array]",R={};R[oE]=R[iE]=R[aE]=R[sE]=R[cE]=R[lE]=R[uE]=R[dE]=R[fE]=!0;R[jw]=R[Ww]=R[rE]=R[Yw]=R[nE]=R[Kw]=R[qw]=R[Vw]=R[zw]=R[Jw]=R[Xw]=R[Zw]=R[Qw]=R[eE]=R[tE]=!1;il=pE});function mE(e){return function(t){return e(t)}}var nn,Bo=u(()=>{nn=mE});var sl,ir,hE,Ho,gE,Uo,cl=u(()=>{Ro();sl=typeof exports=="object"&&exports&&!exports.nodeType&&exports,ir=sl&&typeof module=="object"&&module&&!module.nodeType&&module,hE=ir&&ir.exports===sl,Ho=hE&&zr.process,gE=(function(){try{var e=ir&&ir.require&&ir.require("util").types;return e||Ho&&Ho.binding&&Ho.binding("util")}catch{}})(),Uo=gE});var ll,yE,on,Go=u(()=>{al();Bo();cl();ll=Uo&&Uo.isTypedArray,yE=ll?nn(ll):il,on=yE});function _E(e,t){var r=D(e),n=!r&&xt(e),o=!r&&!n&&or(e),i=!r&&!n&&!o&&on(e),a=r||n||o||i,s=a?Jc(e.length,String):[],c=s.length;for(var l in e)(t||EE.call(e,l))&&!(a&&(l=="length"||o&&(l=="offset"||l=="parent")||i&&(l=="buffer"||l=="byteLength"||l=="byteOffset")||wt(l,c)))&&s.push(l);return s}var wE,EE,ul,dl=u(()=>{Xc();rn();z();$o();Qr();Go();wE=Object.prototype,EE=wE.hasOwnProperty;ul=_E});function xE(e,t){return function(r){return e(t(r))}}var fl,pl=u(()=>{fl=xE});var bE,ml,hl=u(()=>{pl();bE=fl(Object.keys,Object),ml=bE});function IE(e){if(!Vc(e))return ml(e);var t=[];for(var r in Object(e))AE.call(e,r)&&r!="constructor"&&t.push(r);return t}var SE,AE,gl,yl=u(()=>{zc();hl();SE=Object.prototype,AE=SE.hasOwnProperty;gl=IE});function vE(e){return ve(e)?ul(e):gl(e)}var bt,an=u(()=>{dl();yl();rr();bt=vE});function NE(e,t){if(D(e))return!1;var r=typeof e;return r=="number"||r=="symbol"||r=="boolean"||e==null||oe(e)?!0:OE.test(e)||!TE.test(e)||t!=null&&e in Object(t)}var TE,OE,St,sn=u(()=>{z();mt();TE=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,OE=/^\w*$/;St=NE});var CE,we,ar=u(()=>{Ie();CE=Y(Object,"create"),we=CE});function RE(){this.__data__=we?we(null):{},this.size=0}var wl,El=u(()=>{ar();wl=RE});function DE(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var _l,xl=u(()=>{_l=DE});function ME(e){var t=this.__data__;if(we){var r=t[e];return r===LE?void 0:r}return PE.call(t,e)?t[e]:void 0}var LE,kE,PE,bl,Sl=u(()=>{ar();LE="__lodash_hash_undefined__",kE=Object.prototype,PE=kE.hasOwnProperty;bl=ME});function BE(e){var t=this.__data__;return we?t[e]!==void 0:$E.call(t,e)}var FE,$E,Al,Il=u(()=>{ar();FE=Object.prototype,$E=FE.hasOwnProperty;Al=BE});function UE(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=we&&t===void 0?HE:t,this}var HE,vl,Tl=u(()=>{ar();HE="__lodash_hash_undefined__";vl=UE});function At(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var jo,Ol=u(()=>{El();xl();Sl();Il();Tl();At.prototype.clear=wl;At.prototype.delete=_l;At.prototype.get=bl;At.prototype.has=Al;At.prototype.set=vl;jo=At});function GE(){this.__data__=[],this.size=0}var Nl,Cl=u(()=>{Nl=GE});function jE(e,t){for(var r=e.length;r--;)if(Et(e[r][0],t))return r;return-1}var Te,sr=u(()=>{en();Te=jE});function KE(e){var t=this.__data__,r=Te(t,e);if(r<0)return!1;var n=t.length-1;return r==n?t.pop():YE.call(t,r,1),--this.size,!0}var WE,YE,Rl,Dl=u(()=>{sr();WE=Array.prototype,YE=WE.splice;Rl=KE});function qE(e){var t=this.__data__,r=Te(t,e);return r<0?void 0:t[r][1]}var Ll,kl=u(()=>{sr();Ll=qE});function VE(e){return Te(this.__data__,e)>-1}var Pl,Ml=u(()=>{sr();Pl=VE});function zE(e,t){var r=this.__data__,n=Te(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}var Fl,$l=u(()=>{sr();Fl=zE});function It(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var Oe,cr=u(()=>{Cl();Dl();kl();Ml();$l();It.prototype.clear=Nl;It.prototype.delete=Rl;It.prototype.get=Ll;It.prototype.has=Pl;It.prototype.set=Fl;Oe=It});var JE,Ne,cn=u(()=>{Ie();de();JE=Y(M,"Map"),Ne=JE});function XE(){this.size=0,this.__data__={hash:new jo,map:new(Ne||Oe),string:new jo}}var Bl,Hl=u(()=>{Ol();cr();cn();Bl=XE});function ZE(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var Ul,Gl=u(()=>{Ul=ZE});function QE(e,t){var r=e.__data__;return Ul(t)?r[typeof t=="string"?"string":"hash"]:r.map}var Ce,lr=u(()=>{Gl();Ce=QE});function e_(e){var t=Ce(this,e).delete(e);return this.size-=t?1:0,t}var jl,Wl=u(()=>{lr();jl=e_});function t_(e){return Ce(this,e).get(e)}var Yl,Kl=u(()=>{lr();Yl=t_});function r_(e){return Ce(this,e).has(e)}var ql,Vl=u(()=>{lr();ql=r_});function n_(e,t){var r=Ce(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var zl,Jl=u(()=>{lr();zl=n_});function vt(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var Ye,ln=u(()=>{Hl();Wl();Kl();Vl();Jl();vt.prototype.clear=Bl;vt.prototype.delete=jl;vt.prototype.get=Yl;vt.prototype.has=ql;vt.prototype.set=zl;Ye=vt});function Wo(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(o_);var r=function(){var n=arguments,o=t?t.apply(this,n):n[0],i=r.cache;if(i.has(o))return i.get(o);var a=e.apply(this,n);return r.cache=i.set(o,a)||i,a};return r.cache=new(Wo.Cache||Ye),r}var o_,Xl,Zl=u(()=>{ln();o_="Expected a function";Wo.Cache=Ye;Xl=Wo});function a_(e){var t=Xl(e,function(n){return r.size===i_&&r.clear(),n}),r=t.cache;return t}var i_,Ql,eu=u(()=>{Zl();i_=500;Ql=a_});var s_,c_,l_,tu,ru=u(()=>{eu();s_=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,c_=/\\(\\)?/g,l_=Ql(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(s_,function(r,n,o,i){t.push(o?i.replace(c_,"$1"):n||r)}),t}),tu=l_});function u_(e){return e==null?"":Js(e)}var nu,ou=u(()=>{Xs();nu=u_});function d_(e,t){return D(e)?e:St(e,t)?[e]:tu(nu(e))}var un,Yo=u(()=>{z();sn();ru();ou();un=d_});function p_(e){if(typeof e=="string"||oe(e))return e;var t=e+"";return t=="0"&&1/e==-f_?"-0":t}var f_,Re,ur=u(()=>{mt();f_=1/0;Re=p_});function m_(e,t){t=un(t,e);for(var r=0,n=t.length;e!=null&&r<n;)e=e[Re(t[r++])];return r&&r==n?e:void 0}var Tt,dn=u(()=>{Yo();ur();Tt=m_});function h_(e,t,r){var n=e==null?void 0:Tt(e,t);return n===void 0?r:n}var iu,au=u(()=>{dn();iu=h_});function g_(e,t){for(var r=-1,n=t.length,o=e.length;++r<n;)e[o+r]=t[r];return e}var fn,Ko=u(()=>{fn=g_});function y_(e){return D(e)||xt(e)||!!(su&&e&&e[su])}var su,cu,lu=u(()=>{dt();rn();z();su=U?U.isConcatSpreadable:void 0;cu=y_});function uu(e,t,r,n,o){var i=-1,a=e.length;for(r||(r=cu),o||(o=[]);++i<a;){var s=e[i];t>0&&r(s)?t>1?uu(s,t-1,r,n,o):fn(o,s):n||(o[o.length]=s)}return o}var du,fu=u(()=>{Ko();lu();du=uu});function w_(e,t,r){var n=-1,o=e.length;t<0&&(t=-t>o?0:o+t),r=r>o?o:r,r<0&&(r+=o),o=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(o);++n<o;)i[n]=e[n+t];return i}var pu,mu=u(()=>{pu=w_});function x_(e,t,r){(r?nr(e,t,r):t===void 0)?t=1:t=__(cc(t),0);var n=e==null?0:e.length;if(!n||t<1)return[];for(var o=0,i=0,a=Array(E_(n/t));o<n;)a[i++]=pu(e,o,o+=t);return a}var E_,__,qo,hu=u(()=>{mu();Mo();lc();E_=Math.ceil,__=Math.max;qo=x_});function b_(){this.__data__=new Oe,this.size=0}var gu,yu=u(()=>{cr();gu=b_});function S_(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}var wu,Eu=u(()=>{wu=S_});function A_(e){return this.__data__.get(e)}var _u,xu=u(()=>{_u=A_});function I_(e){return this.__data__.has(e)}var bu,Su=u(()=>{bu=I_});function T_(e,t){var r=this.__data__;if(r instanceof Oe){var n=r.__data__;if(!Ne||n.length<v_-1)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new Ye(n)}return r.set(e,t),this.size=r.size,this}var v_,Au,Iu=u(()=>{cr();cn();ln();v_=200;Au=T_});function Ot(e){var t=this.__data__=new Oe(e);this.size=t.size}var Nt,Vo=u(()=>{cr();yu();Eu();xu();Su();Iu();Ot.prototype.clear=gu;Ot.prototype.delete=wu;Ot.prototype.get=_u;Ot.prototype.has=bu;Ot.prototype.set=Au;Nt=Ot});function O_(e,t){for(var r=-1,n=e==null?0:e.length,o=0,i=[];++r<n;){var a=e[r];t(a,r,e)&&(i[o++]=a)}return i}var vu,Tu=u(()=>{vu=O_});function N_(){return[]}var Ou,Nu=u(()=>{Ou=N_});var C_,R_,Cu,D_,Ru,Du=u(()=>{Tu();Nu();C_=Object.prototype,R_=C_.propertyIsEnumerable,Cu=Object.getOwnPropertySymbols,D_=Cu?function(e){return e==null?[]:(e=Object(e),vu(Cu(e),function(t){return R_.call(e,t)}))}:Ou,Ru=D_});function L_(e,t,r){var n=t(e);return D(e)?n:fn(n,r(e))}var Lu,ku=u(()=>{Ko();z();Lu=L_});function k_(e){return Lu(e,bt,Ru)}var zo,Pu=u(()=>{ku();Du();an();zo=k_});var P_,pn,Mu=u(()=>{Ie();de();P_=Y(M,"DataView"),pn=P_});var M_,mn,Fu=u(()=>{Ie();de();M_=Y(M,"Promise"),mn=M_});var F_,De,Jo=u(()=>{Ie();de();F_=Y(M,"Set"),De=F_});var $u,$_,Bu,Hu,Uu,Gu,B_,H_,U_,G_,j_,Ke,Xo,ju=u(()=>{Mu();cn();Fu();Jo();wc();ft();ko();$u="[object Map]",$_="[object Object]",Bu="[object Promise]",Hu="[object Set]",Uu="[object WeakMap]",Gu="[object DataView]",B_=ye(pn),H_=ye(Ne),U_=ye(mn),G_=ye(De),j_=ye(Zr),Ke=re;(pn&&Ke(new pn(new ArrayBuffer(1)))!=Gu||Ne&&Ke(new Ne)!=$u||mn&&Ke(mn.resolve())!=Bu||De&&Ke(new De)!=Hu||Zr&&Ke(new Zr)!=Uu)&&(Ke=function(e){var t=re(e),r=t==$_?e.constructor:void 0,n=r?ye(r):"";if(n)switch(n){case B_:return Gu;case H_:return $u;case U_:return Bu;case G_:return Hu;case j_:return Uu}return t});Xo=Ke});var W_,Zo,Wu=u(()=>{de();W_=M.Uint8Array,Zo=W_});function K_(e){return this.__data__.set(e,Y_),this}var Y_,Yu,Ku=u(()=>{Y_="__lodash_hash_undefined__";Yu=K_});function q_(e){return this.__data__.has(e)}var qu,Vu=u(()=>{qu=q_});function hn(e){var t=-1,r=e==null?0:e.length;for(this.__data__=new Ye;++t<r;)this.add(e[t])}var gn,Qo=u(()=>{ln();Ku();Vu();hn.prototype.add=hn.prototype.push=Yu;hn.prototype.has=qu;gn=hn});function V_(e,t){for(var r=-1,n=e==null?0:e.length;++r<n;)if(t(e[r],r,e))return!0;return!1}var zu,Ju=u(()=>{zu=V_});function z_(e,t){return e.has(t)}var yn,ei=u(()=>{yn=z_});function Z_(e,t,r,n,o,i){var a=r&J_,s=e.length,c=t.length;if(s!=c&&!(a&&c>s))return!1;var l=i.get(e),d=i.get(t);if(l&&d)return l==t&&d==e;var p=-1,f=!0,h=r&X_?new gn:void 0;for(i.set(e,t),i.set(t,e);++p<s;){var w=e[p],y=t[p];if(n)var E=a?n(y,w,p,t,e,i):n(w,y,p,e,t,i);if(E!==void 0){if(E)continue;f=!1;break}if(h){if(!zu(t,function(I,_){if(!yn(h,_)&&(w===I||o(w,I,r,n,i)))return h.push(_)})){f=!1;break}}else if(!(w===y||o(w,y,r,n,i))){f=!1;break}}return i.delete(e),i.delete(t),f}var J_,X_,wn,ti=u(()=>{Qo();Ju();ei();J_=1,X_=2;wn=Z_});function Q_(e){var t=-1,r=Array(e.size);return e.forEach(function(n,o){r[++t]=[o,n]}),r}var Xu,Zu=u(()=>{Xu=Q_});function ex(e){var t=-1,r=Array(e.size);return e.forEach(function(n){r[++t]=n}),r}var Ct,En=u(()=>{Ct=ex});function mx(e,t,r,n,o,i,a){switch(r){case px:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case fx:return!(e.byteLength!=t.byteLength||!i(new Zo(e),new Zo(t)));case nx:case ox:case sx:return Et(+e,+t);case ix:return e.name==t.name&&e.message==t.message;case cx:case ux:return e==t+"";case ax:var s=Xu;case lx:var c=n&tx;if(s||(s=Ct),e.size!=t.size&&!c)return!1;var l=a.get(e);if(l)return l==t;n|=rx,a.set(e,t);var d=wn(s(e),s(t),n,o,i,a);return a.delete(e),d;case dx:if(ri)return ri.call(e)==ri.call(t)}return!1}var tx,rx,nx,ox,ix,ax,sx,cx,lx,ux,dx,fx,px,Qu,ri,ed,td=u(()=>{dt();Wu();en();ti();Zu();En();tx=1,rx=2,nx="[object Boolean]",ox="[object Date]",ix="[object Error]",ax="[object Map]",sx="[object Number]",cx="[object RegExp]",lx="[object Set]",ux="[object String]",dx="[object Symbol]",fx="[object ArrayBuffer]",px="[object DataView]",Qu=U?U.prototype:void 0,ri=Qu?Qu.valueOf:void 0;ed=mx});function wx(e,t,r,n,o,i){var a=r&hx,s=zo(e),c=s.length,l=zo(t),d=l.length;if(c!=d&&!a)return!1;for(var p=c;p--;){var f=s[p];if(!(a?f in t:yx.call(t,f)))return!1}var h=i.get(e),w=i.get(t);if(h&&w)return h==t&&w==e;var y=!0;i.set(e,t),i.set(t,e);for(var E=a;++p<c;){f=s[p];var I=e[f],_=t[f];if(n)var O=a?n(_,I,f,t,e,i):n(I,_,f,e,t,i);if(!(O===void 0?I===_||o(I,_,r,n,i):O)){y=!1;break}E||(E=f=="constructor")}if(y&&!E){var v=e.constructor,x=t.constructor;v!=x&&"constructor"in e&&"constructor"in t&&!(typeof v=="function"&&v instanceof v&&typeof x=="function"&&x instanceof x)&&(y=!1)}return i.delete(e),i.delete(t),y}var hx,gx,yx,rd,nd=u(()=>{Pu();hx=1,gx=Object.prototype,yx=gx.hasOwnProperty;rd=wx});function xx(e,t,r,n,o,i){var a=D(e),s=D(t),c=a?id:Xo(e),l=s?id:Xo(t);c=c==od?_n:c,l=l==od?_n:l;var d=c==_n,p=l==_n,f=c==l;if(f&&or(e)){if(!or(t))return!1;a=!0,d=!1}if(f&&!d)return i||(i=new Nt),a||on(e)?wn(e,t,r,n,o,i):ed(e,t,c,r,n,o,i);if(!(r&Ex)){var h=d&&ad.call(e,"__wrapped__"),w=p&&ad.call(t,"__wrapped__");if(h||w){var y=h?e.value():e,E=w?t.value():t;return i||(i=new Nt),o(y,E,r,n,i)}}return f?(i||(i=new Nt),rd(e,t,r,n,o,i)):!1}var Ex,od,id,_n,_x,ad,sd,cd=u(()=>{Vo();ti();td();nd();ju();z();$o();Go();Ex=1,od="[object Arguments]",id="[object Array]",_n="[object Object]",_x=Object.prototype,ad=_x.hasOwnProperty;sd=xx});function ld(e,t,r,n,o){return e===t?!0:e==null||t==null||!ne(e)&&!ne(t)?e!==e&&t!==t:sd(e,t,r,n,ld,o)}var xn,ni=u(()=>{cd();pt();xn=ld});function Ax(e,t,r,n){var o=r.length,i=o,a=!n;if(e==null)return!i;for(e=Object(e);o--;){var s=r[o];if(a&&s[2]?s[1]!==e[s[0]]:!(s[0]in e))return!1}for(;++o<i;){s=r[o];var c=s[0],l=e[c],d=s[1];if(a&&s[2]){if(l===void 0&&!(c in e))return!1}else{var p=new Nt;if(n)var f=n(l,d,c,e,t,p);if(!(f===void 0?xn(d,l,bx|Sx,n,p):f))return!1}}return!0}var bx,Sx,ud,dd=u(()=>{Vo();ni();bx=1,Sx=2;ud=Ax});function Ix(e){return e===e&&!ie(e)}var bn,oi=u(()=>{gt();bn=Ix});function vx(e){for(var t=bt(e),r=t.length;r--;){var n=t[r],o=e[n];t[r]=[n,o,bn(o)]}return t}var fd,pd=u(()=>{oi();an();fd=vx});function Tx(e,t){return function(r){return r==null?!1:r[e]===t&&(t!==void 0||e in Object(r))}}var Sn,ii=u(()=>{Sn=Tx});function Ox(e){var t=fd(e);return t.length==1&&t[0][2]?Sn(t[0][0],t[0][1]):function(r){return r===e||ud(r,e,t)}}var md,hd=u(()=>{dd();pd();ii();md=Ox});function Nx(e,t){return e!=null&&t in Object(e)}var gd,yd=u(()=>{gd=Nx});function Cx(e,t,r){t=un(t,e);for(var n=-1,o=t.length,i=!1;++n<o;){var a=Re(t[n]);if(!(i=e!=null&&r(e,a)))break;e=e[a]}return i||++n!=o?i:(o=e==null?0:e.length,!!o&&_t(o)&&wt(a,o)&&(D(e)||xt(e)))}var wd,Ed=u(()=>{Yo();rn();z();Qr();tn();ur();wd=Cx});function Rx(e,t){return e!=null&&wd(e,t,gd)}var _d,xd=u(()=>{yd();Ed();_d=Rx});function kx(e,t){return St(e)&&bn(t)?Sn(Re(e),t):function(r){var n=iu(r,e);return n===void 0&&n===t?_d(r,e):xn(t,n,Dx|Lx)}}var Dx,Lx,bd,Sd=u(()=>{ni();au();xd();sn();oi();ii();ur();Dx=1,Lx=2;bd=kx});function Px(e){return function(t){return t?.[e]}}var Ad,Id=u(()=>{Ad=Px});function Mx(e){return function(t){return Tt(t,e)}}var vd,Td=u(()=>{dn();vd=Mx});function Fx(e){return St(e)?Ad(Re(e)):vd(e)}var Od,Nd=u(()=>{Id();Td();sn();ur();Od=Fx});function $x(e){return typeof e=="function"?e:e==null?Ae:typeof e=="object"?D(e)?bd(e[0],e[1]):md(e):Od(e)}var Le,dr=u(()=>{hd();Sd();tr();z();Nd();Le=$x});function Bx(e,t,r,n){for(var o=-1,i=e==null?0:e.length;++o<i;){var a=e[o];t(n,a,r(a),e)}return n}var Cd,Rd=u(()=>{Cd=Bx});function Hx(e){return function(t,r,n){for(var o=-1,i=Object(t),a=n(t),s=a.length;s--;){var c=a[e?s:++o];if(r(i[c],c,i)===!1)break}return t}}var Dd,Ld=u(()=>{Dd=Hx});var Ux,kd,Pd=u(()=>{Ld();Ux=Dd(),kd=Ux});function Gx(e,t){return e&&kd(e,t,bt)}var Md,Fd=u(()=>{Pd();an();Md=Gx});function jx(e,t){return function(r,n){if(r==null)return r;if(!ve(r))return e(r,n);for(var o=r.length,i=t?o:-1,a=Object(r);(t?i--:++i<o)&&n(a[i],i,a)!==!1;);return r}}var $d,Bd=u(()=>{rr();$d=jx});var Wx,An,ai=u(()=>{Fd();Bd();Wx=$d(Md),An=Wx});function Yx(e,t,r,n){return An(e,function(o,i,a){t(n,o,r(o),a)}),n}var Hd,Ud=u(()=>{ai();Hd=Yx});function Kx(e,t){return function(r,n){var o=D(r)?Cd:Hd,i=t?t():{};return o(r,e,Le(n,2),i)}}var Gd,jd=u(()=>{Rd();Ud();dr();z();Gd=Kx});function qx(e,t,r){for(var n=-1,o=e==null?0:e.length;++n<o;)if(r(t,e[n]))return!0;return!1}var Wd,Yd=u(()=>{Wd=qx});function Vx(e,t){var r=-1,n=ve(e)?Array(e.length):[];return An(e,function(o,i,a){n[++r]=t(o,i,a)}),n}var Kd,qd=u(()=>{ai();rr();Kd=Vx});var zx,Jx,Xx,si,Vd=u(()=>{Gc();jd();zx=Object.prototype,Jx=zx.hasOwnProperty,Xx=Gd(function(e,t,r){Jx.call(e,r)?e[r].push(t):Uc(e,r,[t])}),si=Xx});function Zx(e,t){for(var r,n=-1,o=e.length;++n<o;){var i=t(e[n]);i!==void 0&&(r=r===void 0?i:r+i)}return r}var zd,Jd=u(()=>{zd=Zx});function Qx(e,t){var r=e.length;for(e.sort(t);r--;)e[r]=e[r].value;return e}var Xd,Zd=u(()=>{Xd=Qx});function eb(e,t){if(e!==t){var r=e!==void 0,n=e===null,o=e===e,i=oe(e),a=t!==void 0,s=t===null,c=t===t,l=oe(t);if(!s&&!l&&!i&&e>t||i&&a&&c&&!s&&!l||n&&a&&c||!r&&c||!o)return 1;if(!n&&!i&&!l&&e<t||l&&r&&o&&!n&&!i||s&&r&&o||!a&&o||!c)return-1}return 0}var Qd,ef=u(()=>{mt();Qd=eb});function tb(e,t,r){for(var n=-1,o=e.criteria,i=t.criteria,a=o.length,s=r.length;++n<a;){var c=Qd(o[n],i[n]);if(c){if(n>=s)return c;var l=r[n];return c*(l=="desc"?-1:1)}}return e.index-t.index}var tf,rf=u(()=>{ef();tf=tb});function rb(e,t,r){t.length?t=ht(t,function(i){return D(i)?function(a){return Tt(a,i.length===1?i[0]:i)}:i}):t=[Ae];var n=-1;t=ht(t,nn(Le));var o=Kd(e,function(i,a,s){var c=ht(t,function(l){return l(i)});return{criteria:c,index:++n,value:i}});return Xd(o,function(i,a){return tf(i,a,r)})}var nf,of=u(()=>{Do();dn();dr();qd();Zd();Bo();rf();tr();z();nf=rb});var nb,ci,af=u(()=>{fu();of();qc();Mo();nb=Kc(function(e,t){if(e==null)return[];var r=t.length;return r>1&&nr(e,t[0],t[1])?t=[]:r>2&&nr(t[0],t[1],t[2])&&(t=[t[0]]),nf(e,du(t,1),[])}),ci=nb});function ob(e,t){return e&&e.length?zd(e,Le(t,2)):0}var li,sf=u(()=>{dr();Jd();li=ob});var ib,ab,cf,lf=u(()=>{Jo();bc();En();ib=1/0,ab=De&&1/Ct(new De([,-0]))[1]==ib?function(e){return new De(e)}:xc,cf=ab});function cb(e,t,r){var n=-1,o=Bc,i=e.length,a=!0,s=[],c=s;if(r)a=!1,o=Wd;else if(i>=sb){var l=t?null:cf(e);if(l)return Ct(l);a=!1,o=yn,c=new gn}else c=t?[]:s;e:for(;++n<i;){var d=e[n],p=t?t(d):d;if(d=r||d!==0?d:0,a&&p===p){for(var f=c.length;f--;)if(c[f]===p)continue e;t&&c.push(p),s.push(d)}else o(c,p,r)||(c!==s&&c.push(p),s.push(d))}return s}var sb,uf,df=u(()=>{Qo();Hc();Yd();ei();lf();En();sb=200;uf=cb});function lb(e,t){return e&&e.length?uf(e,Le(t,2)):[]}var ui,ff=u(()=>{dr();df();ui=lb});var In=u(()=>{hu();Vd();af();sf();ff();});import{readFile as ub}from"node:fs/promises";function fb(e){let t=[];return e.sectionHeading&&t.push(`[Section: ${e.sectionHeading}]`),e.contextualPrefix&&t.push(e.contextualPrefix),t.push(e.content),t.join(`
73
+ `)}function pb(e,t,r){return`${e}
74
+
75
+ ---
76
+
77
+ ${t}
78
+
79
+ ---
80
+
81
+ Respond with ONLY a JSON array of facts. Each fact object must have exactly these fields:
82
+ - "content" (string): the atomic fact statement
83
+ - "category" (string): one of ${r.join(", ")}
84
+ - "confidence" (string): one of high, medium, low
85
+ - "importance" (string): "vital" if essential to understanding the topic, "supplementary" if supporting detail
86
+
87
+ Output the JSON array directly, no explanation or wrapping.`}function mb(e,t){let r=Array.isArray(e)?e:Array.isArray(e?.facts)?e.facts:null;return r?r.filter(n=>n.content&&t.includes(n.category)&&["high","medium","low"].includes(n.confidence)).map(n=>({...n,importance:["vital","supplementary"].includes(n.importance)?n.importance:"supplementary"})):[]}async function hb(e,t,r){let n=fb(e),o=pb(t,n,r),i=await Q(o,{model:g.llm.extractionModel,caller:"extractor"});return mb(i,r).map(s=>({...s,sourceSection:e.sectionHeading||null}))}async function pf(e,{promptPath:t,categories:r}){if(!e.length)return[];let n=await ub(t,"utf8"),o=qo(e,db),i=[];for(let a of o){let s=await Promise.all(a.map(c=>hb(c,n,r).catch(l=>(console.error(`[extractor] chunk failed: ${l.message}`),[]))));i.push(...s.flat())}return i}var db,mf=u(()=>{In();ee();S();db=5});function vn(e){if(!e||typeof e!="string")return e;let t=e;for(let r of gb)t=t.replace(r,fr);return t=t.replace(yb,(r,n)=>`${n}=${fr}`),t=t.replace(wb,(r,n)=>`${n}${fr}:${fr}@`),t=t.replace(_b,(r,n)=>`${n}=${fr}`),t}var fr,gb,yb,wb,Eb,_b,di=u(()=>{fr="***MASKED***",gb=[/\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],yb=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"),wb=/(\w+:\/\/)([^:/\s]+):([^@\s]{3,})@/g,Eb=["DATABASE_URL","REDIS_URL","MONGODB_URI","MONGO_URI","POSTGRES_URL","DSN","CONNECTION_STRING","ENCRYPTION_KEY","JWT_SECRET","SIGIL_ENCRYPTION_KEY","SESSION_SECRET","WEBHOOK_SECRET"],_b=new RegExp(`\\b(${Eb.join("|")})\\s*[=:]\\s*["']?([^\\s"']+)["']?`,"gi")});var pr={};b(pr,{deleteFact:()=>Cb,deleteNamespace:()=>Db,findByUid:()=>Ib,findSimilar:()=>wf,getFactCount:()=>Nb,getHotFacts:()=>Tb,insertFact:()=>Rt,listByCategory:()=>vb,listByDocument:()=>gf,listFacts:()=>Ob,listNamespaces:()=>Rb,markContradicted:()=>yf,markSuperseded:()=>hi,recordAccess:()=>gi,saveFact:()=>mi,supersedeStaleDocFacts:()=>Tn});import{readFile as xb}from"node:fs/promises";import bb from"node:path";async function mi({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:a,embedding:s}){e=vn(e);let c=s||await je(e),l=await wf(c,{namespace:o}),d={skip:hf,ambiguous:fi};if(!l.length)return{action:"ADD",fact:await Rt({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:a,embedding:c}),audm:{topSimilarity:null,matchCount:0,decision:"no-match",thresholds:d}};let p=l[0],f={topSimilarity:Number(p.similarity),matchCount:l.length,existingId:p.id,existingContent:p.content,thresholds:d};if(p.similarity>=hf)return{action:"SKIP",existing:p,audm:{...f,decision:"skip-duplicate"}};if(p.similarity>=fi){let w=await Ab(e,p.content);if(w==="UPDATE"){let E=await Rt({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:a,embedding:c});return await hi(p.id,E.id),await pi({targetType:"fact",targetId:p.id,event:"UPDATE",oldContent:p.content,newContent:e,triggeredBy:`audm:sim=${p.similarity.toFixed(3)}`}),{action:"UPDATE",fact:E,supersededId:p.id,audm:{...f,decision:"llm:UPDATE"}}}if(w==="CONTRADICT"){let E=await Rt({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:a,embedding:c});return await yf(p.id,E.id),await pi({targetType:"fact",targetId:p.id,event:"CONTRADICT",oldContent:p.content,newContent:e,triggeredBy:`audm:sim=${p.similarity.toFixed(3)}`}),{action:"CONTRADICT",fact:E,contradictedId:p.id,audm:{...f,decision:"llm:CONTRADICT"}}}return{action:"ADD",fact:await Rt({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:a,embedding:c}),audm:{...f,decision:"llm:ADD"}}}return{action:"ADD",fact:await Rt({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:a,embedding:c}),audm:{...f,decision:"below-ambiguous"}}}async function Ab(e,t){let n=`${await xb(Sb,"utf8")}
88
+
89
+ **EXISTING FACT:** ${t}
90
+
91
+ **NEW FACT:** ${e}`,i=(await ge(n,{model:g.llm.decisionModel,caller:"audm"})).trim().toUpperCase();return i.includes("UPDATE")?"UPDATE":i.includes("CONTRADICT")?"CONTRADICT":"ADD"}async function Rt({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:a,embedding:s}){let c=`fact-${te(16)}`,l=null,d=null;try{let{currentDeviceId:f,currentAgent:h}=await Promise.resolve().then(()=>($r(),to));l=f(),d=h()}catch{}let[p]=await m("fact").insert({uid:c,content:e,category:t,confidence:r||"medium",importance:n||"supplementary",namespace:o,status:"active",sourceDocumentIds:i||[],sourceSection:a||null,embedding:$(s),validFrom:new Date,embeddingModel:g.embedding.model||null,embeddingDim:Number(g.embedding.dimensions)||null,createdByDeviceId:l,createdByAgent:d}).returning("*");return await m.raw(`
92
+ UPDATE fact
93
+ SET search_vector = to_tsvector('english', content)
94
+ WHERE id = ?
95
+ `,[p.id]),p}async function Ib(e){let[t]=await m("fact").where({uid:e});return t||null}async function vb(e,{namespace:t,limit:r=50}={}){let n=m("fact").where({category:e,status:"active"}).orderBy("createdAt","desc").limit(r);return t&&n.where({namespace:t}),n}async function gf(e){return m("fact").whereRaw("? = ANY(source_document_ids)",[e]).where({status:"active"}).orderBy("createdAt","desc")}async function yf(e,t){await m("fact").where({id:e}).update({status:"contradicted",contradictedById:t,validUntil:m.fn.now()})}async function hi(e,t){await m("fact").where({id:e}).update({status:"superseded",supersededById:t,validUntil:m.fn.now()})}async function Tn(e,t=[]){let r=new Set((t||[]).filter(a=>a!=null)),n=await gf(e),o=0,i=0;for(let a of n){if(r.has(a.id))continue;(Array.isArray(a.sourceDocumentIds)?a.sourceDocumentIds:[]).length<=1?(await hi(a.id,null),await pi({targetType:"fact",targetId:a.id,event:"SUPERSEDE",oldContent:a.content,newContent:null,triggeredBy:`reingest:doc=${e}`}),o++):(await m("fact").where({id:a.id}).update({sourceDocumentIds:m.raw("array_remove(source_document_ids, ?)",[e])}),i++)}return{superseded:o,dissociated:i}}async function wf(e,{namespace:t,threshold:r=fi,limit:n=5}){let o=$(e),i=`${le("embedding")} <=> ${ue()}`;return m.transaction(async a=>{await a.raw("SET LOCAL hnsw.ef_search = 40");let{rows:s}=await a.raw(`
96
+ SELECT id, uid, content, category, status,
97
+ 1 - (${i}) as similarity
98
+ FROM fact
99
+ WHERE namespace = ?
100
+ AND status = 'active'
101
+ AND embedding IS NOT NULL
102
+ AND 1 - (${i}) >= ?
103
+ ORDER BY ${i}
104
+ LIMIT ?
105
+ `,[o,t,o,r,o,n]);return s})}async function pi({targetType:e,targetId:t,event:r,oldContent:n,newContent:o,triggeredBy:i}){await m("history").insert({targetType:e,targetId:t,event:r,oldContent:n||null,newContent:o||null,triggeredBy:i||null})}async function gi(e){e.length&&await m.raw(`UPDATE fact_lifecycle
106
+ SET access_count = access_count + 1,
107
+ last_accessed_at = NOW(),
108
+ stage = CASE WHEN stage = 'stable' THEN 'editing' ELSE stage END,
109
+ stage_entered_at = CASE WHEN stage = 'stable' THEN NOW() ELSE stage_entered_at END
110
+ WHERE fact_id = ANY(?)`,[e])}async function Tb(e,{limit:t=10,since:r}={}){let n=m("fact as f").join("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active"}).where("fl.access_count",">",0).orderBy("fl.access_count","desc").limit(t).select("f.*");return e&&n.where({"f.namespace":e}),r&&n.where("fl.last_accessed_at",">=",r),n}async function Ob({namespace:e,limit:t=50,offset:r=0,category:n}={}){let o=m("fact").where({status:"active"}).select("id","uid","content","category","confidence","importance","createdAt","namespace").orderBy("createdAt","desc").limit(t).offset(r);return e&&o.where({namespace:e}),n&&o.where({category:n}),o}async function Nb(e){let t=m("fact").where({status:"active"});e&&t.where({namespace:e});let[{count:r}]=await t.count("id as count");return Number(r)}async function Cb(e){let r=typeof e=="string"&&e.length>8?{uid:e}:{id:Number(e)},n=await m("fact").where(r).first();return n?(await m("fact_entity").where({factId:n.id}).del(),await m("fact").where({id:n.id}).del(),n):null}async function Rb(){return(await m("fact").where({status:"active"}).select("namespace").count("id as factCount").groupBy("namespace").orderBy("namespace")).map(t=>({namespace:t.namespace,factCount:Number(t.factCount)}))}async function Db(e){await m.raw("DELETE FROM relation WHERE source_fact_id IN (SELECT id FROM fact WHERE namespace = ?)",[e]),await m.raw("DELETE FROM fact_entity WHERE fact_id IN (SELECT id FROM fact WHERE namespace = ?)",[e]),await m.raw("DELETE FROM relation WHERE source_id IN (SELECT id FROM entity WHERE namespace = ?) OR target_id IN (SELECT id FROM entity WHERE namespace = ?)",[e,e]);let t=await m("fact").where({namespace:e}).del(),r=await m("chunk").where({namespace:e}).del(),n=await m("document").where({namespace:e}).del(),o=await m("entity").where({namespace:e}).del();return{factsDeleted:t,chunksDeleted:r,docsDeleted:n,entitiesDeleted:o}}var Sb,hf,fi,qe=u(()=>{ut();A();ct();ee();Se();di();S();L();Sb=bb.join(K,"audm-decision.md"),hf=g.memory.skipThreshold,fi=g.memory.ambiguousThreshold});var On,Lb,zP,Ef,yi=u(()=>{On={preference:"Personal likes, dislikes, favorites, preferred tools/foods/methods",opinion:"Personal views, assessments, evaluations of tools/concepts/approaches",personal:"Personal facts \u2014 birthday, workplace, location, biographical details",experience:"Personal experiences \u2014 projects built, tools used, skills acquired",business_rule:"Organizational rules, policies, constraints",workflow:"Process flows, state transitions, procedures",architecture:"System design, service interactions, infrastructure",convention:"Coding patterns, naming rules, team standards",decision:"Why choices were made, tradeoffs considered",domain_knowledge:"Domain-specific terminology and concepts",key_insight:"Important takeaways, notable explanations",metric:"Quantitative data, measurements, statistics",issue:"Known problems, bugs, limitations, risks",action_item:"Tasks, follow-ups, assignments, deadlines"},Lb=["preference","opinion","personal","experience"],zP=Object.keys(On).filter(e=>!Lb.includes(e)),Ef=On});import{readFile as kb}from"node:fs/promises";import{join as Pb}from"node:path";async function xf(e,{title:t}={}){if(!e?.trim()||e.trim().length<Fb)return{route:"noise",facts:[],entities:[],reasoning:"Empty or too short"};if(e.length>$b)return{route:"knowledge",facts:[],entities:[],reasoning:"Long content \u2014 auto-routed to full pipeline"};let n=`${await kb(Mb,"utf8")}
111
+
112
+ ---
113
+
114
+ Title: ${t||"(none)"}
115
+ Input: ${e}
116
+
117
+ ---
118
+
119
+ Respond with ONLY a JSON object: { "route": "thought|knowledge|noise", "facts": [{"content":"...","category":"...","confidence":"high|medium|low","importance":"vital|supplementary"}], "entities": ["..."], "reasoning": "..." }`;try{let o=await Q(n,{model:g.llm.extractionModel,caller:"classifier"});if(!o||!Bb.includes(o.route))return _f("Invalid classification result");let i=Object.keys(Ef),a=o.route==="thought"&&Array.isArray(o.facts)?o.facts.filter(s=>s.content&&i.includes(s.category)).map(s=>({...s,confidence:["high","medium","low"].includes(s.confidence)?s.confidence:"high",importance:["vital","supplementary"].includes(s.importance)?s.importance:"vital"})):[];return{route:o.route,facts:a,entities:Array.isArray(o.entities)?o.entities:[],reasoning:o.reasoning||""}}catch(o){return console.error("[input-classifier] Failed:",o.message),_f(o.message)}}function _f(e){return{route:"knowledge",facts:[],entities:[],reasoning:`Fallback \u2014 ${e}`}}var Mb,Fb,$b,Bb,bf=u(()=>{ee();S();yi();L();Mb=Pb(K,"input-classifier.md"),Fb=3,$b=2e3,Bb=["thought","knowledge","noise"]});var Dt={};b(Dt,{findById:()=>ae,findByName:()=>Ve,findByUid:()=>Hb,findSimilar:()=>Ub,getCanonicalEntity:()=>Je,getEntityCount:()=>Wb,incrementMentionCount:()=>mr,insertEntity:()=>wi,listByType:()=>jb,pushAlias:()=>Nn,searchByName:()=>_i,updateDescription:()=>Gb,updateEntityTypes:()=>ze,updateName:()=>Ei});async function wi({name:e,entityType:t,description:r,namespace:n,externalId:o,embedding:i}){let a=`ent-${te(16)}`,[s]=await m("entity").insert({uid:a,name:e,entityType:t,description:r||null,namespace:n||g.defaults.namespace,externalId:o||null,mentionCount:1,embedding:$(i)}).returning("*");return s}async function Ve(e,t){let r=t||g.defaults.namespace,n=e.toLowerCase();return m("entity").where({namespace:r}).whereNull("mergedWith").where(function(){this.whereRaw("LOWER(name) = ?",[n]).orWhereRaw("aliases @> ARRAY[?]::text[]",[n])}).first()||null}async function Nn(e,t){if(!t)return;let r=t.toLowerCase();await m.raw(`
120
+ UPDATE entity
121
+ SET aliases = (
122
+ SELECT ARRAY(SELECT DISTINCT unnest(aliases || ARRAY[?]::text[]))
123
+ )
124
+ WHERE id = ?
125
+ `,[r,e])}async function Ei(e,t){await m("entity").where({id:e}).update({name:t})}async function Hb(e){return m("entity").where({uid:e}).first()||null}async function ae(e){return m("entity").where({id:e}).first()||null}async function Ub(e,{entityType:t,namespace:r,threshold:n=.85,limit:o=3}){let i=$(e),a=`${le("embedding")} <=> ${ue()}`,{rows:s}=await m.raw(`
126
+ SELECT id, uid, name, entity_type AS "entityType", description,
127
+ mention_count AS "mentionCount",
128
+ 1 - (${a}) AS similarity
129
+ FROM entity
130
+ WHERE entity_type = ?
131
+ AND namespace = COALESCE(?, ?)
132
+ AND embedding IS NOT NULL
133
+ AND merged_with IS NULL
134
+ AND 1 - (${a}) >= ?
135
+ ORDER BY ${a}
136
+ LIMIT ?
137
+ `,[i,t,r,g.defaults.namespace,i,n,i,o]);return s}async function mr(e){await m("entity").where({id:e}).increment("mentionCount",1)}async function Gb(e,t){await m("entity").where({id:e}).update({description:t})}async function jb(e,{namespace:t,limit:r=50}={}){let n=m("entity").where({entityType:e}).whereNull("mergedWith").orderBy("mentionCount","desc").limit(r);return t&&n.where({namespace:t}),n}async function Wb(e){let[{count:t}]=await m("entity").where({entityType:e}).whereNull("mergedWith").count("id as count");return Number(t)}async function _i(e,{entityType:t,namespace:r,limit:n=10}={}){let o=m("entity").whereRaw("LOWER(name) LIKE ?",[`%${e.toLowerCase()}%`]).whereNull("mergedWith").orderBy("mentionCount","desc").limit(n);return t&&o.where({entityType:t}),r&&o.where({namespace:r}),o}async function ze(e,t){let r=await ae(e);if(!r)return;let n;try{n=r.entityTypes?JSON.parse(r.entityTypes):[r.entityType]}catch{n=[r.entityType]}n.includes(t)||(n.push(t),await m("entity").where({id:e}).update({entityTypes:JSON.stringify(n)}))}async function Je(e){let t=await ae(e);for(;t?.mergedWith;)t=await ae(t.mergedWith);return t}var fe=u(()=>{ut();A();Se();S()});async function Sf(e,t,{namespace:r,threshold:n=Yb,limit:o=5}){if(!t)return[];let i=$(t),a=`${le("embedding")} <=> ${ue()}`,{rows:s}=await m.raw(`
138
+ SELECT id, name, entity_type AS "entityType", entity_types AS "entityTypes",
139
+ 1 - (${a}) AS similarity
140
+ FROM entity
141
+ WHERE namespace = ?
142
+ AND embedding IS NOT NULL
143
+ AND LOWER(name) != LOWER(?)
144
+ AND merged_with IS NULL
145
+ AND 1 - (${a}) >= ?
146
+ ORDER BY ${a}
147
+ LIMIT ?
148
+ `,[i,r,e,i,n,i,o]);return s.map(c=>{let l;try{l=c.entityTypes?JSON.parse(c.entityTypes):[c.entityType]}catch{l=[c.entityType]}return{...c,types:l}})}async function xi(e,t,r,n){let o=(r.aliases||[]).filter(Boolean),i=o.length?`Existing aliases: ${o.join(", ")}`:"",a=r.similarity>0?`Name-embedding similarity: ${(r.similarity*100).toFixed(0)}%`:"Name-embedding similarity: not directly measured (LLM judging on episode text alone)",s=n?`
149
+ Source passage where the new mention appeared:
150
+ ---
151
+ ${n.slice(0,1500)}
152
+ ---
153
+ `:"",c=`You're deciding whether two entity mentions refer to the same real-world thing, and whether the source passage indicates a RENAME.
154
+
155
+ Mention A (new): "${e}" (type: ${t})
156
+ Mention B (existing): "${r.name}" (types: ${(r.types||[r.entityType]).join(", ")})
157
+ ${i}
158
+ ${a}
159
+ ${s}
160
+ Decision rules:
161
+ - "same" = true when both mentions refer to the same person/product/concept/thing \u2014 including renames, abbreviations ("NYC" / "New York City"), and common-knowledge equivalents.
162
+ - "rename" = true ONLY when "same" is true AND the source passage says one name has replaced the other ("X is now named Y", "X was renamed to Y", "we renamed X to Y", "X used to be called Y", etc.). A normal synonym match is NOT a rename.
163
+ - "current_name" = which of A or B is the new/canonical name per the source passage (the one we want as \`entity.name\` going forward). Only meaningful when "rename" is true. Use the literal string of mention A or B.
164
+ - If you cannot tell, "same" is false. Don't guess.
165
+
166
+ Respond as STRICT JSON, no markdown, no prose:
167
+ {"same": boolean, "rename": boolean, "current_name": "<one of A or B verbatim, or null>", "reason": "one short sentence"}`,l;try{l=await ge(c,{model:g.llm.entityModel,caller:"entity-matcher"})}catch{return{same:!1,rename:!1,reason:"llm-error"}}let d=Kb(l);return d&&typeof d.same=="boolean"?{same:d.same===!0,rename:d.rename===!0&&d.same===!0,currentName:typeof d.current_name=="string"?d.current_name:null,reason:typeof d.reason=="string"?d.reason:""}:{same:/^\s*(yes|true)\b/i.test(l),rename:!1,currentName:null,reason:"fallback-text-match"}}function Kb(e){if(typeof e!="string")return null;try{return JSON.parse(e.trim())}catch{}let t=e.match(/\{[\s\S]*\}/);if(t)try{return JSON.parse(t[0])}catch{}return null}var Yb,Af=u(()=>{A();ee();Se();S();Yb=.85});var If={};b(If,{followMergeChain:()=>Jb,mergeEntities:()=>qb});async function qb(e,t){let[r,n]=await Promise.all([ae(e),ae(t)]);if(!r||!n)throw new Error(`Entity ${e} or ${t} not found`);if(e===t)return r;let o=(r.mentionCount||0)+(n.mentionCount||0);await m.transaction(async a=>{await a("relation").where({sourceId:t}).update({sourceId:e}),await a("relation").where({targetId:t}).update({targetId:e}),await a("relation").whereRaw("source_id = target_id").del(),await a.raw(`
168
+ INSERT INTO fact_entity (fact_id, entity_id, mention_type, mention_count, created_at, updated_at)
169
+ SELECT fact_id, ?, mention_type, mention_count, NOW(), NOW()
170
+ FROM fact_entity
171
+ WHERE entity_id = ?
172
+ ON CONFLICT (fact_id, entity_id, mention_type)
173
+ DO UPDATE SET mention_count = fact_entity.mention_count + EXCLUDED.mention_count
174
+ `,[e,t]),await a("fact_entity").where({entityId:t}).del(),await a("entity").where({id:e}).update({mentionCount:o}),await a("pod").where({entityId:e,status:"active"}).first()?await a("pod").where({entityId:t}).update({status:"archived",updatedAt:a.fn.now()}):await a("pod").where({entityId:t}).update({entityId:e,updatedAt:a.fn.now()}),await a("entity").where({id:t}).update({mergedWith:e})}),await zb(e);let i=Vb(n);for(let a of i)await ze(e,a);return console.log(`[entity-merge] Merged ${t} (${n.name}) into ${e} (${r.name})`),{...r,mentionCount:o}}function Vb(e){if(!e.entityTypes)return[e.entityType];try{return JSON.parse(e.entityTypes)}catch{return[e.entityType]}}async function zb(e){let t=await m("relation").where(function(){this.where({sourceId:e}).orWhere({targetId:e})}).whereNull("invalidAt"),r=si(t,n=>`${n.sourceId}-${n.targetId}-${n.relationType}`);for(let n of Object.values(r)){if(n.length<=1)continue;let[o,...i]=ci(n,"id"),a=li(n,"mentionCount");await m("relation").where({id:o.id}).update({mentionCount:a}),await m("relation").whereIn("id",i.map(s=>s.id)).del()}}async function Jb(e){let t=await ae(e),r=[t?.id];for(;t?.mergedWith;)t=await ae(t.mergedWith),t&&r.push(t.id);return{canonical:t,chain:r}}var vf=u(()=>{In();A();fe()});import{readFile as Xb}from"node:fs/promises";async function hr({name:e,entityType:t,description:r,namespace:n,externalId:o,embedding:i,episodeText:a,episodeEntityIds:s=[]}){let c=n||g.defaults.namespace,l=await Ve(e,c);if(l)return l=await Je(l.id),await mr(l.id),l.entityType!==t&&await ze(l.id,t),l;let d=i||await je(`${t}: ${e}`),p=await Sf(e,d,{namespace:c,limit:3});for(let w of p){let y=await xi(e,t,w,a);if(y.same)return Tf(w,{newName:e,entityType:t,isRename:y.rename,currentName:y.currentName})}let f=new Set(p.map(w=>w.id)),h=s.filter(w=>w!=null&&!f.has(w));for(let w of h){let y=await Je(w);if(!y||y.namespace!==c||y.name?.toLowerCase()===e.toLowerCase())continue;let E=await xi(e,t,{...y,types:Zb(y),similarity:0},a);if(E.same)return Tf(y,{newName:e,entityType:t,isRename:E.rename,currentName:E.currentName})}try{return await wi({name:e,entityType:t,description:r,namespace:c,externalId:o,embedding:d})}catch(w){if(Of(w)){let y=await Ve(e,c);if(y){let E=await Je(y.id);return await mr(E.id),await ze(E.id,t),E}}throw w}}function Of(e){return e?!!(e.code==="23505"||typeof e.message=="string"&&e.message.includes("duplicate key value violates unique constraint")):!1}async function Tf(e,{newName:t,entityType:r,isRename:n,currentName:o}){let i=await Je(e.id);if(await mr(i.id),await ze(i.id,r),n&&i.name&&i.name.toLowerCase()!==t.toLowerCase()){let a=t.toLowerCase(),s=i.name.toLowerCase(),c=(o||"").toLowerCase(),l,d;if(c===a?(l=t,d=i.name):c===s?(l=i.name,d=t):(l=t,d=i.name),d&&d.toLowerCase()!==l.toLowerCase()&&(await Nn(i.id,d),i.aliases=[...i.aliases||[],d.toLowerCase()]),l!==i.name)try{await Ei(i.id,l),i.name=l}catch(p){if(Of(p)){let f=await Ve(l,i.namespace);if(f&&f.id!==i.id){let{mergeEntities:h}=await Promise.resolve().then(()=>(vf(),If));return await h(f.id,i.id),await Nn(f.id,i.name),await Je(f.id)}}throw p}}return i}function Zb(e){if(e.entityTypes)try{return JSON.parse(e.entityTypes)}catch{}return[e.entityType]}async function bi(e,{promptPath:t,namespace:r}){if(!e.length)return[];let n=e.map(f=>`- [${f.category}] ${f.content}`).join(`
175
+ `),i=`${await Xb(t,"utf8")}
176
+
177
+ ---
178
+
179
+ ${n}`,a=await ge(i,{model:g.llm.entityModel,caller:"entity-resolver"}),s=qr(a);if(!Array.isArray(s))return[];let c=s.filter(f=>f.name);if(!c.length)return[];let l=new Array(c.length),d=[],p=[];for(let f=0;f<c.length;f++){let h=await Qb(c[f].name,r);h?(l[f]=h,d.push(h.id)):p.push(f)}for(let f of p){let h=c[f],w=await hr({name:h.name,entityType:"topic",description:h.description||null,namespace:r,episodeText:n,episodeEntityIds:d});l[f]=w,w?.id&&d.push(w.id)}return l.filter(Boolean)}async function Qb(e,t){let{findByName:r,getCanonicalEntity:n,incrementMentionCount:o}=await Promise.resolve().then(()=>(fe(),Dt)),i=await r(e,t);if(!i)return null;let a=await n(i.id);return await o(a.id),a}var Nf=u(()=>{ct();ee();S();fe();Af()});var Cn={};b(Cn,{createRelation:()=>gr,findRelation:()=>eS,getRelationCount:()=>nS,getRelationsByFact:()=>rS,invalidateRelation:()=>tS,listRelationsForEntity:()=>yr});async function gr({sourceId:e,targetId:t,relationType:r,sourceFactId:n,validAt:o}){let{rows:[i]}=await m.raw(`
180
+ INSERT INTO relation (source_id, target_id, relation_type, source_fact_id, mention_count, valid_at, created_at, updated_at)
181
+ VALUES (?, ?, ?, ?, 1, ?, NOW(), NOW())
182
+ ON CONFLICT (source_id, target_id, relation_type) DO UPDATE SET
183
+ mention_count = relation.mention_count + 1,
184
+ source_fact_id = COALESCE(EXCLUDED.source_fact_id, relation.source_fact_id),
185
+ updated_at = NOW()
186
+ RETURNING *
187
+ `,[e,t,r,n||null,o||null]);return i}async function eS(e,t,r){return m("relation").where({sourceId:e,targetId:t,relationType:r}).whereNull("invalidAt").first()||null}async function tS(e,{invalidAt:t}={}){await m("relation").where({id:e}).update({invalidAt:t||new Date})}async function yr(e,{direction:t="both",relationType:r,limit:n=50}={}){let o=s=>{let c=s==="outgoing"?"source_id":"target_id",l=s==="outgoing"?"target_id":"source_id";return m.raw(`
188
+ SELECT r.id AS "relationId", r.relation_type AS "relationType",
189
+ r.mention_count AS "mentionCount", r.valid_at AS "validAt",
190
+ e.id AS "entityId", e.uid, e.name, e.entity_type AS "entityType",
191
+ e.description, '${s}' AS direction
192
+ FROM relation r
193
+ JOIN entity e ON e.id = r.${l}
194
+ WHERE r.${c} = ?
195
+ AND r.invalid_at IS NULL
196
+ AND e.merged_with IS NULL
197
+ ${r?"AND r.relation_type = ?":""}
198
+ ORDER BY r.mention_count DESC
199
+ LIMIT ?
200
+ `,r?[e,r,n]:[e,n])};if(t==="outgoing"){let{rows:s}=await o("outgoing");return s}if(t==="incoming"){let{rows:s}=await o("incoming");return s}let[i,a]=await Promise.all([o("outgoing"),o("incoming")]);return[...i.rows,...a.rows]}async function rS(e){let{rows:t}=await m.raw(`
201
+ SELECT r.id, r.relation_type AS "relationType",
202
+ r.mention_count AS "mentionCount",
203
+ s.name AS "sourceName", s.entity_type AS "sourceType",
204
+ t.name AS "targetName", t.entity_type AS "targetType"
205
+ FROM relation r
206
+ JOIN entity s ON s.id = r.source_id
207
+ JOIN entity t ON t.id = r.target_id
208
+ WHERE r.source_fact_id = ?
209
+ AND r.invalid_at IS NULL
210
+ AND s.merged_with IS NULL
211
+ AND t.merged_with IS NULL
212
+ `,[e]);return t}async function nS(){let[{count:e}]=await m("relation").whereNull("invalidAt").count("id as count");return Number(e)}var Xe=u(()=>{A()});var Ze={};b(Ze,{archivePod:()=>aS,deletePod:()=>sS,findByEntityId:()=>Rf,findByExternalId:()=>Pt,findById:()=>oS,findByUid:()=>kt,incrementCounters:()=>Mt,insertPod:()=>Cf,listPods:()=>iS,patchAttrs:()=>wr,reassignEntity:()=>cS,setEndedAt:()=>Si,upsertPod:()=>Lt});async function Cf({podType:e,name:t,namespace:r,attrs:n={},entityId:o=null,connectionId:i=null,externalId:a=null,startedAt:s=null,endedAt:c=null}){let l=`pod-${te(16)}`,[d]=await m("pod").insert({uid:l,podType:e,name:t,namespace:r||g.defaults.namespace,attrs:JSON.stringify(n),entityId:o,connectionId:i,externalId:a,startedAt:s,endedAt:c}).returning("*");return d}async function Lt({podType:e,externalId:t,name:r,namespace:n,attrs:o={},entityId:i=null,connectionId:a=null,startedAt:s=null}){if(!t)throw new Error("upsertPod requires externalId; use insertPod for custom pods");let c=`pod-${te(16)}`,l=n||g.defaults.namespace,{rows:[d]}=await m.raw(`
213
+ INSERT INTO pod (uid, pod_type, name, namespace, attrs, entity_id, connection_id, external_id, started_at, created_at, updated_at)
214
+ VALUES (?, ?, ?, ?, ?::jsonb, ?, ?, ?, ?, NOW(), NOW())
215
+ ON CONFLICT (pod_type, external_id, namespace) WHERE external_id IS NOT NULL DO UPDATE SET
216
+ attrs = pod.attrs || EXCLUDED.attrs,
217
+ updated_at = NOW()
218
+ RETURNING *, (xmax = 0) AS "isNew"
219
+ `,[c,e,r,l,JSON.stringify(o),i,a,t,s]);return{pod:d,isNew:d.isNew}}async function kt(e){return m("pod").where({uid:e}).first()||null}async function oS(e){return m("pod").where({id:e}).first()||null}async function Pt({podType:e,externalId:t,namespace:r}){return m("pod").where({podType:e,externalId:t,namespace:r||g.defaults.namespace}).first()||null}async function Rf(e){return m("pod").where({entityId:e}).first()||null}async function iS({podType:e,namespace:t,status:r="active",limit:n=20}={}){let o=m("pod").where({status:r}).orderBy("updatedAt","desc").limit(n);return e&&o.where({podType:e}),t&&o.where({namespace:t}),o}async function aS(e){await m("pod").where({id:e}).update({status:"archived",updatedAt:m.fn.now()})}async function sS(e){await m("pod").where({id:e}).del()}async function wr(e,t){await m.raw("UPDATE pod SET attrs = attrs || ?::jsonb, updated_at = NOW() WHERE id = ?",[JSON.stringify(t),e])}async function Si(e,t=new Date){await m("pod").where({id:e}).update({endedAt:t,updatedAt:m.fn.now()})}async function cS(e,t){await m("pod").where({entityId:e}).update({entityId:t,updatedAt:m.fn.now()})}async function Mt(e,{docs:t=0,facts:r=0}){!t&&!r||await m.raw(`UPDATE pod
220
+ SET member_doc_count = member_doc_count + ?,
221
+ member_fact_count = member_fact_count + ?,
222
+ updated_at = NOW()
223
+ WHERE id = ?`,[t,r,e])}var ke=u(()=>{ut();A();S()});var Ft={};b(Ft,{attach:()=>Rn,attachDocument:()=>Ai,attachEntity:()=>lS,attachFact:()=>Er,detach:()=>uS,factIdsInPod:()=>pS,listMembers:()=>dS,listPodsForMember:()=>fS});async function Rn(e,t,r,n="primary"){let{rowCount:o}=await m.raw(`INSERT INTO pod_membership (pod_id, member_type, member_id, role)
224
+ VALUES (?, ?, ?, ?)
225
+ ON CONFLICT (pod_id, member_type, member_id) DO NOTHING`,[e,t,r,n]);return o>0&&(t==="fact"?await Mt(e,{facts:1}):t==="document"&&await Mt(e,{docs:1})),{attached:o>0}}async function uS(e,t,r){let n=await m("pod_membership").where({podId:e,memberType:t,memberId:r}).del();return n>0&&(t==="fact"?await Mt(e,{facts:-1}):t==="document"&&await Mt(e,{docs:-1})),{detached:n>0}}async function dS(e,{memberType:t,limit:r=20}={}){if(!t)throw new Error("listMembers requires a memberType filter");return m(`${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(r).select("t.*","pm.role as podRole","pm.createdAt as attachedAt")}async function fS(e,t){return m("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 pS(e){return await m("pod_membership").where({podId:e,memberType:"fact"}).pluck("memberId")}var Er,Ai,lS,_r=u(()=>{A();ke();Er=(e,t,r)=>Rn(e,"fact",t,r),Ai=(e,t,r)=>Rn(e,"document",t,r),lS=(e,t,r)=>Rn(e,"entity",t,r)});var vi={};b(vi,{getEntitiesForFact:()=>hS,getEntityIdsForFacts:()=>$t,getFactsForEntity:()=>Ii,linkEntitiesToFact:()=>xr});async function xr(e,t){if(!t.length)return;let r=ui(t,"id"),n=r.map(o=>({factId:e,entityId:o.id,mentionType:"content",mentionCount:1}));await m("fact_entity").insert(n).onConflict(m.raw("(fact_id, entity_id, mention_type)")).merge({mentionCount:m.raw("fact_entity.mention_count + 1")}),await mS(e,r)}async function mS(e,t){let r=t.map(o=>o.id).filter(Boolean);if(!r.length)return;let n=await m("pod").whereIn("entityId",r).where({status:"active"}).select("id");for(let{id:o}of n)await Er(o,e,"mention")}async function Ii(e,{limit:t=50}={}){return m("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 hS(e){return m("entity").join("fact_entity","entity.id","fact_entity.entity_id").where("fact_entity.fact_id",e).whereNull("entity.mergedWith").select("entity.id","entity.uid","entity.name","entity.entityType","entity.description")}async function $t(e){if(!e.length)return new Map;let t=await m("fact_entity").whereIn("factId",e).select("factId","entityId"),r=new Map;for(let n of t)r.has(n.factId)||r.set(n.factId,[]),r.get(n.factId).push(n.entityId);return r}var Qe=u(()=>{In();A();_r()});import gS from"node:path";async function Ci(e,t,r,n){let{title:o,sourceType:i,metadata:a={}}=e,s=t.filter(f=>f.action==="ADD"||f.action==="UPDATE"),c=s.map(f=>f.fact||f.existing).filter(Boolean),d=s.find(f=>f.fact)?.fact?.id||null,p=new Date().toISOString().split("T")[0];return n?.items?.length?yS({entityDefs:n,factObjects:c,firstFactId:d,namespace:r,today:p}):wS({title:o,sourceType:i,metadata:a,factObjects:c,firstFactId:d,namespace:r,today:p})}async function yS({entityDefs:e,factObjects:t,firstFactId:r,namespace:n,today:o}){let i={},a=0,s=t.map(f=>f.content).filter(Boolean).join(`
226
+ `),c=[];for(let f of e.items){let h=await hr({name:f.name,entityType:f.type,description:f.description,namespace:n,episodeText:s,episodeEntityIds:c});i[f.name]=h,h?.id&&c.push(h.id)}for(let f of e.relations||[]){let h=i[f.source],w=i[f.target];if(!h||!w)continue;let y=Ti(t,f.source)||Ti(t,f.target);await gr({sourceId:h.id,targetId:w.id,relationType:f.type,sourceFactId:y?.id||r,validAt:o}),a++}let l=await Ni(t,n),d=Oi(Object.values(i),l),p=0;for(let f of t){let h=d.filter(w=>Dn(f.content,w));h.length&&(await xr(f.id,h),p+=h.length)}return{entityCount:d.length,relationCount:a,factEntityLinks:p,topics:d.filter(f=>f.entityType==="topic").map(f=>f.name)}}async function wS({title:e,sourceType:t,metadata:r,factObjects:n,firstFactId:o,namespace:i,today:a}){if(!e){let E=n.length?await bi(n,{promptPath:Df,namespace:i}):[],I=await Ni(n,i),_=Oi(E,I),O=0;for(let v of n){let x=_.filter(G=>Dn(v.content,G));x.length&&(await xr(v.id,x),O+=x.length)}return{entityCount:_.length,relationCount:0,factEntityLinks:O,topics:E.map(v=>v.name)}}let s=n.map(E=>E.content).filter(Boolean).join(`
227
+ `).slice(0,2e3),c=await hr({name:e,entityType:"document",description:`${t} document: ${e}`,namespace:i,episodeText:s}),l=null;r.author&&(l=await hr({name:r.author,entityType:"person",namespace:i,episodeText:s,episodeEntityIds:c?.id?[c.id]:[]}));let d=n.length?await bi(n,{promptPath:Df,namespace:i}):[],p=0;l&&(await gr({sourceId:c.id,targetId:l.id,relationType:"AUTHORED_BY",sourceFactId:o,validAt:a}),p++);for(let E of d){let I=Ti(n,E.name);await gr({sourceId:c.id,targetId:E.id,relationType:"COVERS",sourceFactId:I?.id||o,validAt:a}),p++}let f=[c,l,...d].filter(Boolean),h=await Ni(n,i),w=Oi(f,h),y=0;for(let E of n){let I=w.filter(_=>Dn(E.content,_));I.length&&(await xr(E.id,I),y+=I.length)}return{entityCount:w.length,relationCount:p,factEntityLinks:y,topics:d.map(E=>E.name)}}function Ti(e,t){if(!t)return null;let r=t.toLowerCase();return e.find(n=>n.content?.toLowerCase().includes(r))||null}function Dn(e,t){if(!e||!t?.name)return!1;let r=e.toLowerCase();return[t.name.toLowerCase(),...t.aliases||[]].some(o=>o?new RegExp(`\\b${ES(o)}\\b`).test(r):!1)}function ES(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Oi(...e){let t=new Set,r=[];for(let n of e)for(let o of n)!o||t.has(o.id)||(t.add(o.id),r.push(o));return r}async function Ni(e,t){if(!e?.length)return[];let r=await m("entity as e").join("pod as p","p.entity_id","e.id").where("p.status","active").where("e.namespace",t).whereNull("e.mergedWith").select("e.id","e.uid","e.name","e.entityType","e.aliases");return r.length?r.filter(n=>e.some(o=>Dn(o.content,n))):[]}var Df,Lf=u(()=>{Nf();Xe();Qe();L();A();Df=gS.join(K,"entity-extraction.md")});var _S,kf,Ri=u(()=>{A();S();_S=1440*60*1e3,kf={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||g.defaults.namespace;try{let r=new Date(Date.now()-_S);return(await m("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",">=",r).distinct("p.uid")).map(o=>o.uid)}catch{return[]}}}});function Ff({sessionId:e,transcriptPath:t=null,cwd:r=null,turnCount:n=0,model:o=null,conclusion:i=null,summary:a=null}){return{session_id:e,transcript_path:t,cwd:r,turn_count:n,model:o,conclusion:i,summary:a}}function $f({sessionId:e,startedAt:t=new Date}={}){let n=(t instanceof Date?t:new Date(t)).toISOString().replace("T"," ").slice(0,16),o=e?e.slice(0,8):"unknown";return`claude-session ${n} (${o})`}var Pf,Mf,Di=u(()=>{br();Pf="claude_session",Mf={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 Li();return e?[e]:[]}catch{return[]}}}});var kn={};b(kn,{CURSOR_PATH:()=>Bt,endActiveSession:()=>DS,ensureActiveSession:()=>NS,getActiveCursor:()=>RS,getActiveSessionPodUid:()=>Li});import{writeFile as SS,readFile as AS,unlink as IS}from"node:fs/promises";import{existsSync as vS,mkdirSync as TS}from"node:fs";import{dirname as Bf}from"node:path";async function Ln(){try{let e=await AS(Bt,"utf8");return JSON.parse(e)}catch{return null}}async function Hf(e){vS(Bf(Bt))||TS(Bf(Bt),{recursive:!0}),await SS(Bt,JSON.stringify(e,null,2),"utf8")}async function NS({sessionId:e,transcriptPath:t=null,cwd:r=null,model:n=null,namespace:o=null}){if(!e)throw new Error("ensureActiveSession requires sessionId from hook stdin");let i=o||g.defaults.namespace,a=await Ln();if(a&&a.session_id===e&&a.namespace===i){let l=await kt(a.pod_uid);if(l)return await wr(l.id,{turn_count:(LS(l.attrs)||0)+1}),await CS(a),l}let s=new Date,{pod:c}=await Lt({podType:Pf,externalId:e,name:$f({sessionId:e,startedAt:s}),namespace:i,attrs:Ff({sessionId:e,transcriptPath:t,cwd:r,turnCount:1,model:n}),startedAt:s});return await Hf({session_id:e,pod_uid:c.uid,namespace:i,started_at:c.startedAt??s.toISOString(),last_seen_at:new Date().toISOString()}),c}async function CS(e){await Hf({...e,last_seen_at:new Date().toISOString()})}async function Li({allowStale:e=!1}={}){let t=await Ln();return!t||!t.pod_uid||!e&&t.started_at&&Date.now()-new Date(t.started_at).getTime()>OS?null:t.pod_uid}async function RS(){return Ln()}async function DS({conclusion:e=null,summary:t=null}={}){let r=await Ln();if(!r)return null;let n=await kt(r.pod_uid);if(n){if(e||t){let o={};e&&(o.conclusion=e),t&&(o.summary=t),await wr(n.id,o)}await Si(n.id)}try{await IS(Bt)}catch{}return n}function LS(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 Bt,OS,br=u(()=>{ke();Di();S();L();Bt=ma,OS=360*60*1e3});var $i={};b($i,{POD_TYPE:()=>Pi,deriveProjectRoot:()=>Fi,ensureProjectPod:()=>PS,formatForDisplay:()=>FS,membership:()=>Ft,projectKind:()=>Mi});import{execFileSync as kS}from"node:child_process";import{basename as Uf}from"node:path";async function PS({cwd:e,namespace:t=null}){if(!e)return null;let r=Fi(e),n=t||g.defaults.namespace,i=(r!==e?!1:ki(e)===e)?r:ki(e),{pod:a}=await Lt({podType:Pi,externalId:r,name:Uf(r)||r,namespace:n,attrs:{root_path:r,git_root:i||null,display_name:Uf(r)||r,discovered_at:new Date().toISOString()},startedAt:new Date});return a}function Fi(e){return ki(e)||e}function ki(e){try{return kS("git",["rev-parse","--show-toplevel"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}async function MS(){try{let{getActiveCursor:e}=await Promise.resolve().then(()=>(br(),kn));return(await e())?.cwd||null}catch{return null}}function FS(e){let t=$S(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 $S(e){if(!e)return{};if(typeof e=="object")return e;try{return JSON.parse(e)}catch{return{}}}var Pi,Mi,Pn=u(()=>{ke();_r();S();Pi="project",Mi={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 MS();if(!t)return[];let r=e.namespace||g.defaults.namespace,n=Fi(t),o=await Pt({podType:Pi,externalId:n,namespace:r});return o?[o.uid]:[]}}});async function Gf(e,t){if(!e||typeof e!="object")return[];let r=[],n=t||g.defaults.namespace;if(e.slack?.team_id&&e.connection_id){let i=await Pt({podType:"connector_workspace",externalId:`slack:${e.slack.team_id}`,namespace:n});i&&r.push({podId:i.id,role:"primary"})}if(e.github?.org&&e.connection_id){let i=await Pt({podType:"connector_workspace",externalId:`github:${e.github.org}`,namespace:n});i&&r.push({podId:i.id,role:"primary"})}let o=e.project_root||e.source_root;if(o)try{let{ensureProjectPod:i}=await Promise.resolve().then(()=>(Pn(),$i)),a=await i({cwd:o,namespace:n});a&&r.push({podId:a.id,role:"primary"})}catch{}return r}var jf=u(()=>{ke();Ri();S()});var Bi={};b(Bi,{ingestDocument:()=>GS});import{createHash as BS}from"node:crypto";import{join as HS}from"node:path";async function GS({content:e,title:t,sourcePath:r,sourceType:n="raw",contentType:o,namespace:i,metadata:a={},promptPath:s,categories:c,entities:l,skipFacts:d=!1,skipEntities:p=!1,skipContextualization:f=!1,classify:h=!0,podUids:w=[],resolvePodsFrom:y=null}){e=vn(e);let E=i||g.defaults.namespace,I=c||Object.keys(On),_=s||US,O=t||r,v=null;if(h&&(process.stderr.write(`[0/6] Classifying input...
228
+ `),v=await xf(e,{title:O}),process.stderr.write(` Route: ${v.route} \u2014 ${v.reasoning}
229
+ `),v.route==="noise"))return process.stderr.write(` Skipped \u2014 classified as noise.
230
+ `),{documentId:null,title:O,skipped:!0,route:"noise"};process.stderr.write(`[1/6] Checking for changes...
231
+ `);let x=BS("sha256").update(e).digest("hex"),G=r||`thought:${x}`,{doc:T,changed:pe}=await vo({sourcePath:G,sourceType:n,title:O,contentHash:x,namespace:E});if(!pe)return process.stderr.write(` Skipped \u2014 content unchanged.
232
+ `),{documentId:T.id,title:O,skipped:!0};a&&(Object.keys(a).length||a.connection_id)&&await Oo(T.id,a,a.connection_id??null);let _e=await YS({podUids:w,resolvePodsFrom:y,metadata:a,namespace:E});for(let{podId:F,role:rt}of _e)await Ai(F,T.id,rt);process.stderr.write(`[2/6] Parsing content...
233
+ `);let Yt=Ya(e,{format:a.format,filePath:r,contentType:o});if(O=t||Yt.metadata?.title||r,v?.route==="thought"&&v.facts.length){process.stderr.write(`[thought] Storing ${v.facts.length} facts directly...
234
+ `);let F=await jS(v.facts,{documentId:T.id,namespace:E}),rt={entityCount:0,relationCount:0,factEntityLinks:0,topics:[]};return!p&&F.results.length&&(rt=await Ci({title:O,sourceType:n,metadata:a},F.results,E,l)),await Vr(T.id,{chunkCount:0,factCount:F.counts.added}),await Yf(F.results,_e),await Tn(T.id,F.results.map(Pr=>Pr.fact?.id??Pr.existing?.id).filter(Boolean)),process.stderr.write(`Done. Route: thought, ${F.counts.total} facts (${F.counts.added} new)
235
+ `),{documentId:T.id,documentUid:T.uid,title:O,skipped:!1,route:"thought",chunkCount:0,facts:{...F.counts,verdicts:Wf(F.results)},entities:rt}}let B=[],J={counts:{total:0,added:0,skipped:0,updated:0,contradicted:0},results:[]},Kt={entityCount:0,relationCount:0,factEntityLinks:0,topics:[]};try{process.stderr.write(`[3/6] Chunking and embedding...
236
+ `),B=Va(Yt.sections),process.stderr.write(` ${B.length} chunks created
237
+ `),!f&&B.length&&(B=await ks(B,Yt.text,{title:O}));let F=B.map(xe=>{let Mr=xe.contextualPrefix;return Mr?`${Mr}
238
+ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:rt[Mr]}));await Bs(T.id,Pr,E),!d&&g.ingest.eagerExtract?(process.stderr.write(`[4/6] Extracting facts...
239
+ `),J=await WS(B,{documentId:T.id,namespace:E,promptPath:_,categories:I})):g.ingest.eagerExtract||process.stderr.write(`[4/6] Skipping fact extraction (SIGIL_EAGER_EXTRACT=false)
240
+ `),await Vr(T.id,{chunkCount:B.length,factCount:J.counts.added+J.counts.updated+J.counts.contradicted}),await Yf(J.results,_e),await Tn(T.id,J.results.map(xe=>xe.fact?.id??xe.existing?.id).filter(Boolean)),!p&&J.results.length&&(process.stderr.write(`[5/6] Linking entities...
241
+ `),Kt=await Ci({title:O,sourceType:n,metadata:a},J.results,E,l),process.stderr.write(` ${Kt.entityCount} entities, ${Kt.relationCount} relations
242
+ `))}catch(F){throw console.error(`[pipeline] Failed after document upsert: ${F.message}`),await To(T.id).catch(()=>{}),F}return process.stderr.write(`Done. ${B.length} chunks, ${J.counts.total} facts, ${Kt.entityCount} entities
243
+ `),{documentId:T.id,documentUid:T.uid,title:O,skipped:!1,route:v?.route??null,chunkCount:B.length,facts:{...J.counts,verdicts:Wf(J.results)},entities:Kt}}function Wf(e){return(e||[]).map(t=>({action:t.action,factId:t.fact?.id??t.existing?.id??null,content:String(t.fact?.content||t.existing?.content||"").slice(0,240),audm:t.audm||null,supersededId:t.supersededId??null,contradictedId:t.contradictedId??null}))}async function Kf(e,{documentId:t,namespace:r,embeddings:n,defaultConfidence:o="medium",defaultImportance:i="supplementary"}){let a={total:e.length,added:0,skipped:0,updated:0,contradicted:0},s=[];for(let c=0;c<e.length;c++){let l=e[c],d=await mi({content:l.content,category:l.category,confidence:l.confidence||o,importance:l.importance||i,namespace:r,sourceDocumentIds:t?[t]:[],sourceSection:l.sourceSection||l.category,embedding:n[c]});s.push(d);let p=d.action.toLowerCase();p==="add"?a.added++:p==="skip"?a.skipped++:p==="update"?a.updated++:p==="contradict"&&a.contradicted++}return{counts:a,results:s}}async function jS(e,{documentId:t,namespace:r}){let n=await he(e.map(o=>o.content));return Kf(e,{documentId:t,namespace:r,embeddings:n,defaultConfidence:"high",defaultImportance:"vital"})}async function WS(e,{documentId:t,namespace:r,promptPath:n,categories:o}){let i=await pf(e,{promptPath:n,categories:o});if(process.stderr.write(` ${i.length} facts extracted from ${e.length} chunks
244
+ `),!i.length)return{counts:{total:0,added:0,skipped:0,updated:0,contradicted:0},results:[]};let a=await he(i.map(s=>s.content));return Kf(i,{documentId:t,namespace:r,embeddings:a})}async function YS({podUids:e,resolvePodsFrom:t,metadata:r,namespace:n}){let o=[];for(let a of e){let s=await kt(a);s&&o.push({podId:s.id,role:"primary"})}if(t==="metadata"){let a=await Gf(r,n);for(let s of a)o.push(s)}let i=new Map;for(let a of o){let s=i.get(a.podId);(!s||a.role==="primary"&&s.role!=="primary")&&i.set(a.podId,a)}return[...i.values()]}async function Yf(e,t){if(!(!t.length||!e.length))for(let r of e){let n=r?.fact?.id??r?.existing?.id;if(!n)continue;let o=r?.action==="SKIP"?"mention":"primary";for(let{podId:i}of t)await Er(i,n,o)}}var US,Hi=u(()=>{Ka();fo();ct();Ps();Co();Hs();mf();qe();yi();bf();Lf();ke();_r();jf();di();S();L();US=HS(K,"default-extraction.md")});var Pe={};b(Pe,{clearTraces:()=>XS,getTrace:()=>JS,listTraces:()=>zS,recordTrace:()=>VS});function qS(){let e=eo();return{deviceId:e?.device?.id??null,transport:e?.transport??null}}async function VS({kind:e,summary:t,detail:r={},namespace:n=null,durationMs:o=null}){let i=`trace-${te(16)}`,a=new Date().toISOString(),{deviceId:s,transport:c}=qS(),l=r;try{JSON.stringify(r).length>KS&&(l={truncated:!0,note:"trace detail exceeded size cap",summary:t})}catch{l={error:"detail not serializable"}}try{H.emit("trace",{uid:i,kind:e,summary:t,namespace:n,durationMs:o,deviceId:s,transport:c,detail:l})}catch{}try{return await m("trace_event").insert({uid:i,kind:e,ts:a,duration_ms:o,namespace:n,summary:t,device_id:s,transport:c,detail:JSON.stringify(l)}),i}catch(d){return console.error("[trace-store] persist failed:",d.message),null}}async function zS({kind:e=null,namespace:t=null,before:r=null,limit:n=50}={}){let o=m("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(n)||50,200));return e&&(o=o.where({kind:e})),t&&(o=o.where({namespace:t})),r&&(o=o.where("ts","<",r)),(await o).map(a=>({...a,detail:typeof a.detail=="string"?qf(a.detail):a.detail}))}async function JS(e){let t=await m("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"?qf(t.detail):t.detail}:null}async function XS(){return{cleared:await m("trace_event").del()}}function qf(e){try{return JSON.parse(e)}catch{return{}}}var KS,Me=u(()=>{ut();A();ot();$r();KS=256*1024});var Jf={};b(Jf,{_reset:()=>uA,activeKinds:()=>Ar,get:()=>iA,getSchemaDoc:()=>lA,list:()=>aA,register:()=>Ui,validateAttrs:()=>cA});import{readFile as Vf}from"node:fs/promises";import{fileURLToPath as ZS}from"node:url";import{dirname as QS,join as zf}from"node:path";function Ui(e){for(let t of eA)if(!e[t])throw new Error(`Pod kind missing required field: ${t}`);if(e.visibility&&!tA.has(e.visibility))throw new Error(`Pod kind ${e.name}: invalid visibility ${e.visibility}`);if(e.activeMode&&!rA.has(e.activeMode))throw new Error(`Pod kind ${e.name}: invalid activeMode ${e.activeMode}`);if(e.writePolicy&&!nA.has(e.writePolicy))throw new Error(`Pod kind ${e.name}: invalid writePolicy ${e.writePolicy}`);Sr.set(e.name,oA(e))}function oA(e){return{visibility:"private",activeMode:"multi-active",hotContextBudget:0,retrievalWeights:{recency:1,relevance:1},importanceDefault:2,ttlDays:null,writePolicy:"origin-only",lifecycle:{},...e}}function iA(e){return Sr.get(e)||null}function aA(){return Array.from(Sr.values())}async function Ar(e={}){let t=[];for(let r of Sr.values())if(typeof r.resolveActiveScope=="function")try{let n=await r.resolveActiveScope(e);Array.isArray(n)&&n.length>0&&t.push({kind:r,scope:n})}catch(n){process.stderr.write(`[sigil:pods] resolveActiveScope failed for kind "${r.name}": ${n.message}
245
+ `),sA(r.name,n)}return t}function sA(e,t){Promise.resolve().then(()=>(Me(),Pe)).then(({recordTrace:r})=>r({kind:"lifecycle",summary:`pod-resolution failed for kind "${e}"`,detail:{kind:e,error:t.message}})).catch(()=>{})}function cA(e,t={}){if(!e||!e.attrsSchema)return{valid:!0};let r=[];for(let[n,o]of Object.entries(e.attrsSchema)){let i=t[n];if(i==null)continue;let a=Array.isArray(i)?"array":typeof i;o!==a&&r.push(`attr "${n}" expected ${o}, got ${a}`)}return r.length?{valid:!1,errors:r}:{valid:!0}}async function lA(e){if(!e)return null;let t=zf(pa,`${e.name}.md`);try{return await Vf(t,"utf8")}catch{}if(!e.schemaDocPath)return null;let r=QS(ZS(import.meta.url)),n=zf(r,e.schemaDocPath);try{return await Vf(n,"utf8")}catch{return null}}function uA(){Sr.clear()}var eA,tA,rA,nA,Sr,Ir=u(()=>{L();eA=["name"],tA=new Set(["private","shared","public"]),rA=new Set(["singleton-live","multi-active","rolling-window","always"]),nA=new Set(["origin-only","shared-allowlist","open"]),Sr=new Map});async function fA(e){if(e.project)return e.project;if(!e.cwd)try{let{getActiveCursor:t}=await Promise.resolve().then(()=>(br(),kn)),r=await t();e={...e,cwd:r?.cwd}}catch{return null}if(!e.cwd)return null;try{let{deriveProjectRoot:t}=await Promise.resolve().then(()=>(Pn(),$i)),r=t(e.cwd);return r?r.split("/").pop():null}catch{return null}}function pA(e){if(!e)return{};if(typeof e=="object")return e;try{return JSON.parse(e)}catch{return{}}}var dA,Xf,Zf=u(()=>{A();S();dA="playbook",Xf={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||g.defaults.namespace,r=await fA(e);try{let o=await m("pod").where({podType:dA,namespace:t,status:"active"}).select("uid","attrs");return r?o.filter(a=>{let s=pA(a.attrs);return!s.project||s.project===r}).map(a=>a.uid):o.map(a=>a.uid)}catch{return[]}}}});var mA,Qf,ep=u(()=>{A();S();mA=["__virtual:vital__"],Qf={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()=>mA,fetchFacts:async(e={},{slots:t=8,namespace:r}={})=>{let n=r||e.namespace||g.defaults.namespace;return m("fact as f").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active","f.namespace":n}).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")}}});var np={};b(np,{registerBuiltins:()=>rp});function rp(){if(!tp){for(let e of hA)Ui(e);tp=!0}}var hA,tp,Mn=u(()=>{Ir();Di();Ri();Pn();Zf();ep();hA=[Mf,Mi,kf,Xf,Qf],tp=!1;rp()});var vr={};b(vr,{factsInPodsByRecency:()=>ip,getHotFacts:()=>op,updateContextSnapshot:()=>wA,writeSnapshotToFile:()=>ap});async function op({namespace:e,limit:t=gA,ctx:r={}}={}){let n=e||g.defaults.namespace,o={...r,namespace:n};o.cwd||(o.cwd=await yA());let i=await Ar(o),a=await Promise.all(i.map(async({kind:l,scope:d})=>{try{return typeof l.fetchFacts=="function"?await l.fetchFacts(o,{slots:l.hotContextBudget,namespace:n}):await ip(d,n,l.hotContextBudget)}catch{return[]}})),s=new Set,c=[];for(let l of a)for(let d of l)if(!(!d||s.has(d))&&(s.add(d),c.push(d),c.length>=t))return c;if(c.length===0){let l=await m("fact as f").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active","f.namespace":n}).orderByRaw("COALESCE(fl.last_accessed_at, f.created_at) DESC").limit(t).pluck("f.content");for(let d of l)if(!(!d||s.has(d))&&(s.add(d),c.push(d),c.length>=t))break}return c.slice(0,t)}async function ip(e,t,r){if(!Array.isArray(e)||e.length===0)return[];let n=e.filter(o=>typeof o=="string"&&!o.startsWith("__virtual:"));return n.length===0?[]:m("fact as f").join("pod_membership as pm",function(){this.on("pm.member_id","=","f.id").andOnVal("pm.member_type","=","fact")}).join("pod as p","p.id","pm.pod_id").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").whereIn("p.uid",n).where({"f.status":"active","f.namespace":t}).orderByRaw(`
246
+ COALESCE(f.importance_score, 2) DESC,
247
+ COALESCE(fl.last_accessed_at, f.created_at) DESC
248
+ `).limit(r).pluck("f.content")}async function yA(){try{let{getActiveCursor:e}=await Promise.resolve().then(()=>(br(),kn));return(await e())?.cwd||null}catch{return null}}async function ap({facts:e,namespace:t}){let r=await import("node:fs/promises");if(!e||!e.length)return 0;let n="<!-- sigil-context -->",o=new Date().toISOString().slice(0,16).replace("T"," "),i=[n,`## Active Context *(${e.length} facts \xB7 refreshed ${o}${t?` \xB7 ns=${t}`:""})*`,"",e.map(c=>`- ${c}`).join(`
249
+ `),n].join(`
250
+ `),a="";try{a=await r.readFile(qn,"utf8")}catch{}let s=a.includes(n)?a.replace(new RegExp(`${n}[\\s\\S]*?${n}`),i):a+(a.trim()?`
251
+
252
+ `:"")+i+`
253
+ `;return await r.writeFile(qn,s,"utf8"),e.length}async function wA({namespace:e,limit:t,ctx:r}={}){let n=await op({namespace:e,limit:t,ctx:r});return ap({facts:n,namespace:e})}var gA,Tr=u(()=>{A();S();L();Mn();Ir();gA=20});async function cp(e){if(!e||e.length<2)return;let t=[...new Set(e.filter(i=>Number.isInteger(i)))].sort((i,a)=>i-a);if(t.length<2)return;let r=[];for(let i=0;i<t.length;i++)for(let a=i+1;a<t.length;a++)r.push([t[i],t[a]]);let n=r.map(()=>"(?, ?, 1, NOW(), NOW())").join(", "),o=r.flat();await m.raw(`
254
+ INSERT INTO hebbian_edge (fact_a_id, fact_b_id, strength, first_seen_at, last_seen_at)
255
+ VALUES ${n}
256
+ ON CONFLICT (fact_a_id, fact_b_id)
257
+ DO UPDATE SET
258
+ strength = hebbian_edge.strength + 1,
259
+ last_seen_at = NOW()
260
+ `,o)}var lp=u(()=>{A()});var Wi={};b(Wi,{consolidateEntityCoRetrievalEdges:()=>xA,getCoRetrievedEntities:()=>_A,getEdgeStrengthsForRanking:()=>ji,getEntityHebbianStats:()=>bA,strengthenEntityEdges:()=>Gi});function Fn(e){return EA/Math.max(e,1)}async function Gi(e,t={}){if(!g.hebbian.entity.enabled||!e||e.length<2)return;let r=t.eta??g.hebbian.entity.eta,n=t.cap??g.hebbian.entity.cap,o=[...new Set(e.filter(c=>Number.isInteger(c)))].sort((c,l)=>c-l);if(o.length<2)return;let i=[];for(let c=0;c<o.length;c++)for(let l=c+1;l<o.length;l++)i.push([o[c],o[l]]);let a=i.map(()=>"(?, ?, ?, NOW(), NOW())").join(", "),s=i.flatMap(([c,l])=>[c,l,r]);await m.raw(`
261
+ INSERT INTO entity_hebbian_edge (entity_a_id, entity_b_id, strength, first_seen_at, last_seen_at)
262
+ VALUES ${a}
263
+ ON CONFLICT (entity_a_id, entity_b_id)
264
+ DO UPDATE SET
265
+ strength = LEAST(entity_hebbian_edge.strength + ?, ?),
266
+ last_seen_at = NOW()
267
+ `,[...s,r,n])}async function _A(e,t={}){if(!g.hebbian.entity.enabled)return[];let r=t.limit??10,n=t.minEffectiveStrength??g.hebbian.entity.minEffective,o=Fn(t.halfLifeDays??g.hebbian.entity.halfLifeDays),{rows:i}=await m.raw(`
268
+ SELECT
269
+ CASE WHEN entity_a_id = ? THEN entity_b_id ELSE entity_a_id END AS "partnerId",
270
+ (strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0))::float8 AS "effectiveStrength",
271
+ strength::float8 AS "rawStrength",
272
+ last_seen_at AS "lastSeenAt"
273
+ FROM entity_hebbian_edge
274
+ WHERE entity_a_id = ? OR entity_b_id = ?
275
+ ORDER BY "effectiveStrength" DESC
276
+ LIMIT ?
277
+ `,[e,o,e,e,r*3]);return i.filter(a=>a.effectiveStrength>=n).slice(0,r)}async function ji(e,t,r={}){if(!g.hebbian.entity.enabled)return new Map;if(!e.length||!t.length)return new Map;let n=Fn(r.halfLifeDays??g.hebbian.entity.halfLifeDays),o=[...new Set(e)],i=[...new Set(t)].filter(c=>!o.includes(c));if(!i.length)return new Map;let{rows:a}=await m.raw(`
278
+ SELECT
279
+ CASE
280
+ WHEN entity_a_id = ANY(?::bigint[]) THEN entity_b_id
281
+ ELSE entity_a_id
282
+ END AS "candidateId",
283
+ SUM(strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0))::float8 AS "summedStrength"
284
+ FROM entity_hebbian_edge
285
+ WHERE
286
+ (entity_a_id = ANY(?::bigint[]) AND entity_b_id = ANY(?::bigint[]))
287
+ OR
288
+ (entity_b_id = ANY(?::bigint[]) AND entity_a_id = ANY(?::bigint[]))
289
+ GROUP BY "candidateId"
290
+ `,[o,n,o,i,o,i]),s=new Map;for(let c of a)s.set(Number(c.candidateId),c.summedStrength);return s}async function xA({floor:e=.5,decayDays:t=90}={}){let r=Fn(g.hebbian.entity.halfLifeDays),{rows:n}=await m.raw(`
291
+ DELETE FROM entity_hebbian_edge
292
+ WHERE (strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0)) <= ?
293
+ AND last_seen_at < NOW() - (INTERVAL '1 day' * ?)
294
+ RETURNING entity_a_id
295
+ `,[r,e,t]);return n.length}async function bA({topN:e=5}={}){let t=Fn(g.hebbian.entity.halfLifeDays),r=await m.raw(`
296
+ SELECT
297
+ COUNT(*)::int AS "edgeCount",
298
+ COALESCE(AVG(strength)::float8, 0) AS "avgStrength",
299
+ COALESCE(MAX(strength)::float8, 0) AS "maxStrength"
300
+ FROM entity_hebbian_edge
301
+ `),n=await m.raw(`
302
+ SELECT
303
+ ea.name AS "aName",
304
+ eb.name AS "bName",
305
+ strength::float8 AS "strength",
306
+ (strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0))::float8 AS "decayed"
307
+ FROM entity_hebbian_edge
308
+ JOIN entity ea ON ea.id = entity_a_id
309
+ JOIN entity eb ON eb.id = entity_b_id
310
+ ORDER BY "decayed" DESC
311
+ LIMIT ?
312
+ `,[t,e]);return{edgeCount:r.rows[0]?.edgeCount??0,avgStrength:r.rows[0]?.avgStrength??0,maxStrength:r.rows[0]?.maxStrength??0,topPairs:n.rows??[]}}var EA,$n=u(()=>{A();S();EA=Math.log(2)});function Bn({minConfidence:e="medium",pointInTime:t,categories:r}){let n=SA[e]??1,o=[n],i="",a="";return t&&(i="AND valid_from <= ? AND (valid_until IS NULL OR valid_until > ?)",o.push(t,t)),r?.length&&(a="AND category = ANY(?)",o.push(r)),{minRank:n,temporalClause:i,categoryClause:a,filterParams:o}}var SA,Or,Hn=u(()=>{SA={low:0,medium:1,high:2},Or=`CASE confidence
313
+ WHEN 'high' THEN 2
314
+ WHEN 'medium' THEN 1
315
+ ELSE 0
316
+ END`});async function up(e,{namespaces:t,limit:r=20}){let n=$(e),o=`${le("embedding")} <=> ${ue()}`,{rows:i}=await m.raw(`
317
+ SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
318
+ content, section_heading AS "sectionHeading", namespace,
319
+ 1 - (${o}) as similarity
320
+ FROM chunk
321
+ WHERE namespace = ANY(?)
322
+ AND embedding IS NOT NULL
323
+ ORDER BY ${o}
324
+ LIMIT ?
325
+ `,[n,t,n,r]);return i}var dp=u(()=>{A();Se();S();Hn()});async function fp(e,{namespaces:t,limit:r=20}){let{rows:n}=await m.raw(`
326
+ SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
327
+ content, section_heading AS "sectionHeading", namespace,
328
+ ts_rank(search_vector, plainto_tsquery('english', ?)) as rank
329
+ FROM chunk
330
+ WHERE namespace = ANY(?)
331
+ AND search_vector @@ plainto_tsquery('english', ?)
332
+ ORDER BY rank DESC
333
+ LIMIT ?
334
+ `,[e,t,e,r]);return n}var pp=u(()=>{A();Hn()});async function hp(e,t,{namespaces:r,limit:n=5,minConfidence:o="medium",pointInTime:i,categories:a,podIds:s=null}){let c=$(t),l=`${le("embedding")} <=> ${ue()}`,{temporalClause:d,categoryClause:p,filterParams:f}=Bn({minConfidence:o,pointInTime:i,categories:a}),h=n*OA,w=Array.isArray(s),y=w&&s.length===0,E=w?y?"AND FALSE":`AND id = ANY(
335
+ SELECT member_id FROM pod_membership
336
+ WHERE member_type = 'fact' AND pod_id = ANY(?::int[])
337
+ )`:"",I=w&&!y?[s]:[],[_,...O]=f,v=[c,c,r,_,...O,...I,c,h],x=[e,e,r,_,e,...O,...I,h],G=[h,h,n],T=`
338
+ WITH semantic AS (
339
+ SELECT id,
340
+ uid,
341
+ content, category, confidence, importance, namespace, status,
342
+ source_document_ids AS "sourceDocumentIds",
343
+ source_section AS "sourceSection",
344
+ created_by_device_id AS "createdByDeviceId",
345
+ created_by_agent AS "createdByAgent",
346
+ created_at,
347
+ 1 - (${l}) AS similarity,
348
+ ROW_NUMBER() OVER (ORDER BY ${l}) AS rank_ix
349
+ FROM fact
350
+ WHERE namespace = ANY(?)
351
+ AND status = 'active'
352
+ AND embedding IS NOT NULL
353
+ AND ${Or} >= ?
354
+ ${d}
355
+ ${p}
356
+ ${E}
357
+ ORDER BY ${l}
358
+ LIMIT ?
359
+ ),
360
+ keyword AS (
361
+ SELECT id,
362
+ uid,
363
+ content, category, confidence, importance, namespace, status,
364
+ source_document_ids AS "sourceDocumentIds",
365
+ source_section AS "sourceSection",
366
+ created_by_device_id AS "createdByDeviceId",
367
+ created_by_agent AS "createdByAgent",
368
+ created_at,
369
+ ts_rank_cd(search_vector, plainto_tsquery('english', ?)) AS keyword_rank,
370
+ ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_vector, plainto_tsquery('english', ?)) DESC) AS rank_ix
371
+ FROM fact
372
+ WHERE namespace = ANY(?)
373
+ AND status = 'active'
374
+ AND ${Or} >= ?
375
+ AND search_vector @@ plainto_tsquery('english', ?)
376
+ ${d}
377
+ ${p}
378
+ ${E}
379
+ ORDER BY keyword_rank DESC
380
+ LIMIT ?
381
+ ),
382
+ fused AS (
383
+ SELECT COALESCE(s.id, k.id) AS id,
384
+ COALESCE(s.uid, k.uid) AS uid,
385
+ COALESCE(s.content, k.content) AS content,
386
+ COALESCE(s.category, k.category) AS category,
387
+ COALESCE(s.confidence, k.confidence) AS confidence,
388
+ COALESCE(s.importance, k.importance) AS importance,
389
+ COALESCE(s.namespace, k.namespace) AS namespace,
390
+ COALESCE(s.status, k.status) AS status,
391
+ COALESCE(s."sourceDocumentIds", k."sourceDocumentIds") AS "sourceDocumentIds",
392
+ COALESCE(s."sourceSection", k."sourceSection") AS "sourceSection",
393
+ COALESCE(s."createdByDeviceId", k."createdByDeviceId") AS "createdByDeviceId",
394
+ COALESCE(s."createdByAgent", k."createdByAgent") AS "createdByAgent",
395
+ COALESCE(s.created_at, k.created_at) AS created_at,
396
+ COALESCE(s.similarity, 0) AS similarity,
397
+ (
398
+ ${vA} * (1.0 / (${mp} + COALESCE(s.rank_ix, ?)))
399
+ + ${TA} * (1.0 / (${mp} + COALESCE(k.rank_ix, ?)))
400
+ ) AS rrf_raw
401
+ FROM semantic s
402
+ FULL OUTER JOIN keyword k ON s.id = k.id
403
+ ),
404
+ ranked AS (
405
+ SELECT f.*,
406
+ COALESCE(fl.access_count, 0) AS access_count,
407
+ fl.last_accessed_at,
408
+ -- ACT-R activation: ln(n+1) - 0.5*ln(t_days), softplus to keep >= 0.
409
+ -- t_days floor of 0.01 prevents log(0). Recently-accessed facts win ties.
410
+ ln(1.0 + exp(
411
+ ln(COALESCE(fl.access_count, 0) + 1.0)
412
+ - 0.5 * ln(
413
+ GREATEST(
414
+ EXTRACT(epoch FROM (now() - COALESCE(fl.last_accessed_at, f.created_at))) / 86400.0,
415
+ 0.01
416
+ )
417
+ )
418
+ )) AS activation,
419
+ CASE f.importance WHEN 'vital' THEN ${NA} ELSE 1.0 END AS importance_mult,
420
+ CASE f.confidence
421
+ WHEN 'high' THEN ${CA}
422
+ WHEN 'medium' THEN ${RA}
423
+ WHEN 'low' THEN ${DA}
424
+ ELSE 1.0
425
+ END AS confidence_mult
426
+ FROM fused f
427
+ LEFT JOIN fact_lifecycle fl ON fl.fact_id = f.id
428
+ )
429
+ SELECT id, uid, content, category, confidence, importance, namespace, status,
430
+ "sourceDocumentIds", "sourceSection", "createdByDeviceId", "createdByAgent", similarity,
431
+ rrf_raw,
432
+ access_count,
433
+ last_accessed_at AS "lastAccessedAt",
434
+ activation,
435
+ (rrf_raw * activation * importance_mult * confidence_mult) AS final_score
436
+ FROM ranked
437
+ ORDER BY final_score DESC,
438
+ CASE WHEN importance = 'vital' THEN 0 ELSE 1 END
439
+ LIMIT ?
440
+ `,pe=[...v,...x,...G],{rows:_e}=await m.raw(T,pe);if(!_e.length)return[];let Yt=_e[0].final_score||_e[0].rrf_raw||1;return _e.map(B=>({...B,rrfScore:Math.round(Number(B.final_score||B.rrf_raw)/Number(Yt)*100)/100}))}var mp,vA,TA,OA,NA,CA,RA,DA,gp=u(()=>{A();Se();S();Hn();mp=20,vA=1,TA=.7,OA=3,NA=1.5,CA=1,RA=.85,DA=.7});async function yp(e){let t=e.map(o=>o.id),r=await $t(t),n=new Set;for(let o of r.values())for(let i of o)n.add(i);return n.size?m("entity").whereIn("id",[...n]).whereNull("mergedWith").select("id","uid","name","entityType","description"):[]}async function wp(e,{limit:t=10}={}){if(!e.length)return[];let r=await m("relation").where(function(){this.whereIn("sourceId",e).orWhereIn("targetId",e)}).whereNull("invalidAt").select("*").limit(t*3),n=new Set(e),o=new Set,i=new Map;for(let p of r){let f=n.has(p.sourceId)?p.targetId:p.sourceId;o.add(f),i.has(f)||i.set(f,p)}if(!o.size)return[];let a=await m("entity").whereIn("id",[...o]).whereNull("mergedWith").select("id","name"),s=new Map(a.map(p=>[p.id,p.name])),c=await m("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),l=new Set,d=[];for(let p of c){if(l.has(p.id))continue;l.add(p.id);let f=i.get(p.entityId),h=s.get(p.entityId)||"unknown",w=f?.relationType||"related";if(d.push({...p,relationPath:`${h} (${w})`,graphDistance:1}),d.length>=t)break}return d}function Ep(e,t,r,n){let o=new Set(r),i=e.map(s=>({...s,resultType:"direct"})),a=t.filter(s=>!e.some(c=>c.id===s.id)).map(s=>({...s,rrfScore:(s.rrfScore||.1)*.5,resultType:"related"}));return[...i,...a].slice(0,n)}var _p=u(()=>{A();Qe()});var Ht,Yi=u(()=>{Ht=class{#e=new Map;#t;#r;constructor({maxSize:t=100,ttlMs:r=300*1e3}={}){this.#t=t,this.#r=r}get(t){let r=this.#e.get(t);if(r){if(Date.now()-r.timestamp>this.#r){this.#e.delete(t);return}return r.value}}set(t,r){if(this.#e.size>=this.#t){let n=this.#e.keys().next().value;this.#e.delete(n)}this.#e.set(t,{value:r,timestamp:Date.now()})}}});async function bp(e){let t=xp.get(e);if(t)return t;let r=`You are a search query expander for a personal knowledge base.
441
+
442
+ 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.
443
+
444
+ Think about:
445
+ - Synonyms and rephrased versions
446
+ - Inverse/negative framings (if someone asks "what should I use", also search for "what to avoid")
447
+ - Related concepts that would inform the answer
448
+ - Specific terms someone might have used when storing this knowledge
449
+
450
+ User query: "${e}"
451
+
452
+ Respond with ONLY a JSON array of strings. Do not include the original query.`;try{let n=await Q(r,{model:g.llm.extractionModel,caller:"query-expander"});if(!Array.isArray(n))return[e];let o=n.filter(a=>typeof a=="string"&&a.trim()).slice(0,LA),i=o.length?[e,...o]:[e];return xp.set(e,i),i}catch(n){return console.error("[query-expander] Failed:",n.message),[e]}}var LA,xp,Sp=u(()=>{ee();Yi();S();LA=5,xp=new Ht({maxSize:100,ttlMs:300*1e3})});import{readFile as kA}from"node:fs/promises";import{join as PA}from"node:path";async function vp(e){let t=e.trim().toLowerCase(),r=Ki.get(t);if(r)return r;let o=`${await kA(MA,"utf8")}
453
+
454
+ ---
455
+
456
+ Query: ${e}
457
+
458
+ ---
459
+
460
+ 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 Q(o,{model:g.llm.extractionModel,caller:"query-router"});if(!i||!FA.includes(i.intent)){let c=Ap("factual",{});return Ki.set(t,c),c}let a=Ip[i.intent],s={intent:i.intent,categories:Array.isArray(i.categories)&&i.categories.length?i.categories:a.categories,entities:Array.isArray(i.entities)?i.entities:[],expand:typeof i.expand=="boolean"?i.expand:a.expand,useGraph:a.useGraph,limit:a.limit,pointInTime:i.pointInTime||null,reasoning:i.reasoning||""};return Ki.set(t,s),s}catch(i){return console.error("[query-router] Failed:",i.message),Ap("factual",{reasoning:`Fallback \u2014 ${i.message}`})}}function Ap(e,t={}){let r=Ip[e];return{intent:e,categories:r.categories,entities:[],expand:r.expand,useGraph:r.useGraph,limit:r.limit,pointInTime:null,reasoning:"",...t}}var MA,Ki,FA,Ip,Tp=u(()=>{ee();Yi();S();L();MA=PA(K,"query-router.md"),Ki=new Ht({maxSize:200,ttlMs:600*1e3}),FA=["preference","factual","entity_lookup","exploratory","temporal"],Ip={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 Rp={};b(Rp,{isSearchableQuery:()=>Op,search:()=>UA});async function UA(e,{namespaces:t,limit:r=5,minConfidence:n="medium",useGraph:o=!1,includeChunks:i=!1,pointInTime:a,expand:s=!1,route:c=!0,categories:l,synthesize:d=g.search.synthesize,podScope:p=null,applyFloor:f=!0,ctx:h={}}={}){let w=Date.now();if(!Op(e)){let x=jA();return x._trace={query:e,searchable:!1,stages:[{stage:"guard",note:"query is not searchable (empty or wildcard-only)"}],durationMs:Date.now()-w},x}d&&(i=!0);let y=null;c&&(y=await vp(e),o=o||y.useGraph,s=s||y.expand,r=y.limit||r,a=a||y.pointInTime,l=l||(y.categories.length?y.categories:void 0));let E=await qA(e,t),I=await KA(p,{...h,namespace:t?.[0]}),_;E?_=await VA(E,e,{namespaces:t,limit:r,minConfidence:n,includeChunks:i,pointInTime:a,categories:l,podIds:I}):_=await XA(e,{namespaces:t,limit:r,minConfidence:n,useGraph:o,includeChunks:i,pointInTime:a,expand:s,categories:l,podIds:I});let O=null;if(f&&Array.isArray(_.facts)&&_.facts.length){let x=g.memory.injectionFloor,G=_.facts.length;_.facts=_.facts.filter(T=>{if(T.source==="entity")return!0;let pe=Number(T.similarity);return Number.isFinite(pe)?pe>=x:!0}),O={threshold:x,dropped:G-_.facts.length,kept:_.facts.length}}let v=_.facts.map(x=>x.id).filter(Boolean);if(gi(v).catch(x=>console.error("[access-tracking]",x.message)),cp(v.slice(0,8)).catch(x=>console.error("[hebbian]",x.message)),g.hebbian.entity.enabled&&v.length>=2&&YA(v).catch(x=>console.error("[hebbian-entity]",x.message)),d)try{_.synthesized=await WA(e,_)}catch(x){console.error("[synthesizer] failed:",x.message),_.synthesized=null}return _._trace=GA({query:e,namespaces:t,limit:r,minConfidence:n,useGraph:o,expand:s,route:c,routing:y,matchedEntity:E,podScope:p,podIds:I,result:_,factIds:v,floored:O,durationMs:Date.now()-w}),_}function GA({query:e,namespaces:t,limit:r,minConfidence:n,useGraph:o,expand:i,route:a,routing:s,matchedEntity:c,podScope:l,podIds:d,result:p,factIds:f,floored:h,durationMs:w}){let y=_=>{let O=Number(_);return Number.isFinite(O)?Math.round(O*1e4)/1e4:null},E=(p.facts||[]).map((_,O)=>({rank:O+1,id:_.id??null,content:String(_.content||"").slice(0,240),category:_.category??null,importance:_.importance??null,confidence:_.confidence??null,source:_.source??null,similarity:y(_.similarity),rrfRaw:y(_.rrf_raw),activation:y(_.activation),accessCount:_.access_count??null,lastAccessedAt:_.lastAccessedAt??null,finalScore:y(_.final_score),rrfScore:y(_.rrfScore),coRetrievalBoost:y(_.coRetrievalBoost)})),I=(p.chunks||[]).map((_,O)=>({rank:O+1,id:_.id??null,sectionHeading:_.sectionHeading??null,content:String(_.content||"").slice(0,200),similarity:y(_.similarity),rrfScore:y(_.rrfScore)}));return{query:e,namespaces:t,durationMs:w,params:{limit:r,minConfidence:n,useGraphRequested:o,expandRequested:i,routeEnabled:a},routing:s?{intent:s.intent??null,reasoning:s.reasoning??null,useGraph:s.useGraph??null,expand:s.expand??null,limit:s.limit??null,categories:s.categories??null,pointInTime:s.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:l,resolvedIds:d},floor:h?{applied:!0,threshold:h.threshold,dropped:h.dropped,kept:h.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:E,chunks:I},synthesized:p.synthesized||null,relatedEntities:p.relatedEntities||[],reinforced:{factIds:f,note:"access_count bumped + Hebbian co-retrieval edges strengthened (off hot path)"}}}function Op(e){let t=String(e||"").trim();return t?!/^[*%_?\s]+$/.test(t):!1}function jA(){return{facts:[],chunks:[],matchedEntity:null,relatedEntities:[]}}async function WA(e,{facts:t,chunks:r}){let n=[];if(t.slice(0,10).forEach((a,s)=>{n.push(`[F${s+1}] (${a.category}) ${a.content}`)}),r.length&&r.slice(0,15).forEach((a,s)=>{let c=(a.content||"").replace(/\s+/g," ").trim();c&&n.push(`[C${s+1}] ${c.slice(0,2e3)}`)}),!n.length)return"No retrieved evidence \u2014 nothing to synthesize.";let o=`You are answering a question from a personal-memory system.
461
+ Each retrieved item is labeled [F#] (a stored fact) or [C#] (a raw conversation chunk
462
+ that may include user/assistant turns and dates).
463
+
464
+ Question: ${e}
465
+
466
+ Retrieved memory items:
467
+ ${n.join(`
468
+ `)}
469
+
470
+ Instructions:
471
+ - Read the chunks carefully \u2014 the answer is often a specific phrase or date inside one of them, not always pre-summarized as a fact.
472
+ - Reason step-by-step internally for temporal questions ("first", "before", "after", "how many days") \u2014 compare the dates explicitly.
473
+ - Cite items in square brackets where they directly support the answer, e.g. [C2].
474
+ - 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.
475
+ - Plain text only, no headers. Direct answer first, then a short justification if needed. 1-4 sentences total.`,i=g.search.synthesizeModel||g.llm.extractionModel||void 0;return ge(o,{model:i,caller:"synthesizer"})}async function YA(e){let t=await $t(e.slice(0,8)),r=[];for(let o of t.values())for(let i of o)r.push(i);let n=[...new Set(r)].slice(0,g.hebbian.entity.maxWriteEntities);await Gi(n)}async function KA(e,t={}){if(e==null||e==="global")return null;if(e==="auto"){let n=(await Ar(t)).flatMap(i=>i.scope).filter(i=>typeof i=="string"&&!i.startsWith("__virtual:"));if(n.length===0){if(process.env.SIGIL_SCOPE_GRACE!=="false"){let i=m("pod");t.namespace&&(i=i.where({namespace:t.namespace}));let[{count:a}]=await i.count({count:"*"});if(Number(a)===0)return null}return[]}return(await m("pod").whereIn("uid",n).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 r=e.filter(o=>typeof o=="string");return r.length===0?[]:(await m("pod").where(function(){this.whereIn("uid",r).orWhereIn("name",r)}).select("id")).map(o=>o.id)}return null}async function qA(e,t){if(e.length<2||e.length>HA)return null;let r=t[0]||g.defaults.namespace,n=await Ve(e,r);return n||(await _i(e,{namespace:r,limit:1}))[0]||null}async function VA(e,t,{namespaces:r,limit:n,minConfidence:o,includeChunks:i,pointInTime:a,categories:s,podIds:c}){let l=zA(t,e),d=await he(l,{inputType:"query"}),[p,f,...h]=await Promise.all([Ii(e.id,{limit:n}),yr(e.id,{limit:15}),...l.map((x,G)=>Cp(x,{queryEmbedding:d[G],namespaces:r,limit:n,minConfidence:o,includeChunks:i,pointInTime:a,categories:s,podIds:c}))]),w=p.map(x=>({...x,source:"entity"})),y=Un(h.map(x=>x.facts),n*2),E=new Set(w.map(x=>x.id)),I=y.filter(x=>!E.has(x.id)).map(x=>({...x,source:"search"})),_=[...w,...I].slice(0,n);if(g.hebbian.entity.enabled&&_.length>=2)try{_=await Np(_,{seedEntityIds:[e.id]})}catch(x){console.error("[hebbian-entity-boost]",x.message)}let O=i?Un(h.map(x=>x.chunks||[]),n):[],v=f.map(x=>({id:x.entityId,name:x.name,type:x.entityType,relation:x.relationType,direction:x.direction,mentions:x.mentionCount}));return{facts:_,chunks:O,matchedEntity:{id:e.id,name:e.name,type:e.entityType,mentions:e.mentionCount,description:e.description||null,aliases:e.aliases||[]},relatedEntities:v}}function zA(e,t){let r=[e],n=(t.aliases||[]).filter(a=>typeof a=="string"&&a.trim());if(!n.length)return r;let o=(t.name||"").trim(),i=new Set([e.toLowerCase()]);for(let a of n){let s=e;if(o){let c=new RegExp(`\\b${JA(o)}\\b`,"gi");if(c.test(s))s=s.replace(c,a);else{i.has(a.toLowerCase())||(r.push(a),i.add(a.toLowerCase()));continue}}i.has(s.toLowerCase())||(r.push(s),i.add(s.toLowerCase()))}return r}function JA(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function XA(e,{namespaces:t,limit:r,minConfidence:n,useGraph:o,includeChunks:i,pointInTime:a,expand:s=!1,categories:c,podIds:l}){let d=s?await bp(e):[e],p=await he(d,{inputType:"query"}),f=await Promise.all(d.map((y,E)=>Cp(y,{queryEmbedding:p[E],namespaces:t,limit:r,minConfidence:n,includeChunks:i,pointInTime:a,categories:c,podIds:l}))),h=Un(f.map(y=>y.facts),r);if(h=h.map(y=>({...y,source:"search"})),g.hebbian.entity.enabled&&h.length>=2)try{h=await Np(h)}catch(y){console.error("[hebbian-entity-boost]",y.message)}if(o&&h.length)try{let y=await yp(h.slice(0,5));if(y.length){let E=await ZA(y.map(_=>_.id)),I=await wp(E,{limit:5});h=Ep(h,I,E,r)}}catch(y){console.error("[graph-enhancement] Failed:",y.message)}let w=i?Un(f.map(y=>y.chunks),r):[];return{facts:h,chunks:w,matchedEntity:null,relatedEntities:[]}}async function Np(e,t={}){let r=e.map(f=>f.id).filter(Boolean);if(r.length<2)return e;let n=await $t(r);if(!n.size)return e;let o,i;if(t.seedEntityIds?.length)o=t.seedEntityIds,i=e;else{let f=t.seedFactCount??3,h=[];for(let w of e.slice(0,f)){let y=n.get(w.id)||[];for(let E of y)h.push(E)}o=h,i=e.slice(f)}if(!o.length)return e;let a=new Set;for(let f of i){let h=n.get(f.id)||[];for(let w of h)a.add(w)}if(!a.size)return e;let s=await ji([...new Set(o)],[...a]);if(!s.size)return e;let c=new Map,l=0;for(let f of e){let h=n.get(f.id)||[],w=0;for(let y of h){let E=s.get(y)||0;E>w&&(w=E)}c.set(f.id,w),w>l&&(l=w)}if(l===0)return e;let d=g.hebbian.entity.rrfWeight;return e.map(f=>{let h=(c.get(f.id)||0)/l,w=(f.rrfScore||0)+d*h;return{...f,rrfScore:Math.round(w*100)/100,coRetrievalBoost:Math.round(h*100)/100}}).sort((f,h)=>(h.rrfScore||0)-(f.rrfScore||0))}async function ZA(e){let t=g.hebbian.entity.expandPerSeed;if(!t||!e.length)return e;let{getCoRetrievedEntities:r}=await Promise.resolve().then(()=>($n(),Wi)),n=await Promise.all(e.map(i=>r(i,{limit:t}).catch(()=>[]))),o=new Set(e);for(let i of n)for(let a of i)o.add(Number(a.partnerId));return[...o]}function Un(e,t){let r={},n={};for(let a of e)for(let[s,c]of a.entries())n[c.id]=c,r[c.id]=(r[c.id]||0)+1/(qi+s+1);let o=Object.entries(r).sort(([,a],[,s])=>s-a),i=o.length?o[0][1]:1;return o.slice(0,t).map(([a,s])=>({...n[a],rrfScore:Math.round(s/i*100)/100}))}async function Cp(e,{queryEmbedding:t,namespaces:r,limit:n,minConfidence:o,includeChunks:i=!1,pointInTime:a,categories:s,podIds:c}){let l=t||await je(e,{inputType:"query"}),d=hp(e,l,{namespaces:r,limit:n,minConfidence:o,pointInTime:a,categories:s,podIds:c}),p=i?[up(l,{namespaces:r,limit:n}),fp(e,{namespaces:r,limit:n})]:[],[f,...h]=await Promise.all([d,...p]),w=i&&h.length===2?QA(h[0],h[1],n):[];return{facts:f,chunks:w}}function QA(e,t,r){let n={},o={..._o(e,"id"),..._o(t,"id")};e.forEach((s,c)=>{n[s.id]=(n[s.id]||0)+$A/(qi+c+1)}),t.forEach((s,c)=>{n[s.id]=(n[s.id]||0)+BA/(qi+c+1)});let i=Object.entries(n).sort(([s,c],[l,d])=>{if(c!==d)return d-c;let p=o[s]?.importance==="vital"?1:0;return(o[l]?.importance==="vital"?1:0)-p}),a=i.length?i[0][1]:1;return i.slice(0,r).map(([s,c])=>({...o[s],rrfScore:Math.round(c/a*100)/100}))}var qi,$A,BA,HA,Dp=u(()=>{Kr();ct();S();fe();Qe();qe();lp();$n();Xe();Qe();dp();pp();gp();_p();Sp();Tp();ee();Mn();Ir();A();qi=20,$A=1,BA=.7,HA=60});var Fp={};b(Fp,{findEntitiesByType:()=>oI,findPath:()=>nI,findRelated:()=>Mp,getEntityNeighborhood:()=>rI});async function Mp(e,{maxDepth:t=2,relationType:r,limit:n=30}={}){let o=Math.min(Math.max(t,1),6),i=[e,e],a=r?"AND r.relation_type = ?":"";r&&i.push(r);let s=r?"AND r.relation_type = ?":"";r&&i.push(r),i.push(o,n);let{rows:c}=await m.raw(`
476
+ WITH RECURSIVE graph AS (
477
+ SELECT r.target_id AS entity_id, r.relation_type, r.mention_count,
478
+ 1 AS depth, ARRAY[?::integer] AS path
479
+ FROM relation r
480
+ WHERE r.source_id = ?
481
+ AND r.invalid_at IS NULL
482
+ ${a}
483
+
484
+ UNION ALL
485
+
486
+ SELECT r.target_id, r.relation_type, r.mention_count,
487
+ g.depth + 1, g.path || r.target_id
488
+ FROM relation r
489
+ JOIN graph g ON r.source_id = g.entity_id
490
+ WHERE g.depth < ?
491
+ AND r.invalid_at IS NULL
492
+ AND NOT (r.target_id = ANY(g.path))
493
+ ${s}
494
+ )
495
+ SELECT DISTINCT ON (g.entity_id)
496
+ g.entity_id AS "entityId", g.relation_type AS "relationType",
497
+ g.depth, g.mention_count AS "mentionCount",
498
+ e.name, e.entity_type AS "entityType", e.description, e.uid
499
+ FROM graph g
500
+ JOIN entity e ON e.id = g.entity_id
501
+ WHERE e.merged_with IS NULL
502
+ ORDER BY g.entity_id, g.depth ASC
503
+ LIMIT ?
504
+ `,i);return c}async function rI(e,{depth:t=1,limit:r=50}={}){let n=await ae(e);if(!n)return null;if(t>1){let i=await Mp(e,{maxDepth:t,limit:r});return{entity:n,related:i}}let o=await yr(e,{limit:r});return{entity:n,relations:o}}async function nI(e,t,{maxDepth:r=4}={}){let n=Math.min(Math.max(r,1),6),{rows:o}=await m.raw(`
505
+ WITH RECURSIVE search AS (
506
+ SELECT r.target_id AS current_id,
507
+ ARRAY[r.source_id, r.target_id] AS path,
508
+ ARRAY[r.relation_type] AS relation_types,
509
+ 1 AS depth
510
+ FROM relation r
511
+ WHERE r.source_id = ?
512
+ AND r.invalid_at IS NULL
513
+
514
+ UNION ALL
515
+
516
+ SELECT r.target_id,
517
+ s.path || r.target_id,
518
+ s.relation_types || r.relation_type,
519
+ s.depth + 1
520
+ FROM relation r
521
+ JOIN search s ON r.source_id = s.current_id
522
+ WHERE s.depth < ?
523
+ AND r.invalid_at IS NULL
524
+ AND NOT (r.target_id = ANY(s.path))
525
+ )
526
+ SELECT path, relation_types AS "relationTypes", depth
527
+ FROM search
528
+ WHERE current_id = ?
529
+ ORDER BY depth ASC
530
+ LIMIT 1
531
+ `,[e,n,t]);if(!o.length)return null;let{path:i,relationTypes:a,depth:s}=o[0],c=await m("entity").whereIn("id",i).select("id","uid","name","entityType","description"),l=Object.fromEntries(c.map(p=>[p.id,p]));return{path:i.map(p=>l[p]),relationTypes:a,depth:s}}async function oI(e,{namespace:t,sortBy:r="mentionCount",limit:n=50}={}){let o=m("entity").where({entityType:e}).whereNull("mergedWith").orderBy(r,"desc").limit(n);return t&&o.where({namespace:t}),o}var $p=u(()=>{A();fe();Xe()});import{readFile as aI,stat as J$}from"node:fs/promises";import{basename as sI,extname as cI,resolve as lI}from"node:path";async function Wp(e){let t=lI(e),r=await aI(t,"utf8"),n=sI(t),o=cI(t).toLowerCase();return{content:r,title:n,sourcePath:t,sourceType:"file",contentType:uI(o),metadata:{filePath:t,fileName:n,extension:o}}}function uI(e){return{".md":"text/markdown",".mdx":"text/markdown",".txt":"text/plain",".html":"text/html",".htm":"text/html",".json":"application/json",".js":"text/javascript",".ts":"text/javascript",".py":"text/x-python"}[e]||"text/plain"}var Yp=u(()=>{});async function Kp(e){let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch ${e}: ${t.status} ${t.statusText}`);let r=await t.text(),n=t.headers.get("content-type")||"text/plain",o=dI(e);return{content:r,title:o,sourcePath:e,sourceType:"url",contentType:n,metadata:{url:e,fetchedAt:new Date().toISOString()}}}function dI(e){try{let t=new URL(e),n=t.pathname.replace(/\/$/,"").split("/").pop()||t.hostname;return decodeURIComponent(n)}catch{return e}}var qp=u(()=>{});var Vp={};b(Vp,{resolveSource:()=>pI});import{resolve as fI}from"node:path";async function pI({content:e,url:t,filePath:r,title:n,sourceType:o,sourcePath:i,metadata:a}){if(t)return Kp(t);if(r){let s=fI(r),c=process.cwd();if(!s.startsWith(c))throw new Error(`Path traversal denied: ${r} resolves outside working directory`);return Wp(s)}return e?{content:e,title:n||"Untitled",sourcePath:i||`raw/${Date.now()}`,sourceType:o||"raw",contentType:"text/plain",metadata:a||{}}:null}var zp=u(()=>{Yp();qp()});import{existsSync as mI}from"node:fs";import{readFile as hI,writeFile as gI,chmod as yI,mkdir as wI}from"node:fs/promises";import{randomBytes as EI}from"node:crypto";import{dirname as _I}from"node:path";async function Qp(){if(Ut)return Ut;if(mI(Ge)){let t=(await hI(Ge,"utf8")).trim();if(!/^[0-9a-fA-F]{64}$/.test(t))throw new Error(`identity: ${Ge} is malformed (expected 64 hex chars). Refusing to overwrite \u2014 move or delete the file manually to regenerate.`);return Ut=Array.from(Buffer.from(t,"hex")),Ut}await wI(_I(Ge),{recursive:!0});let e=EI(xI);await gI(Ge,e.toString("hex"),"utf8");try{await yI(Ge,384)}catch{}return Ut=Array.from(e),Ut}var xI,Ut,em=u(()=>{L();xI=32,Ut=null});var $e={};b($e,{dial:()=>zi,getEndpoint:()=>rm,getNodeAddr:()=>AI,getNodeInfo:()=>II,registerProtocol:()=>SI,shutdownEndpoint:()=>vI});import{mkdir as bI}from"node:fs/promises";function SI(e,t){if(Fe||Gt)throw new Error(`registerProtocol("${e}"): runtime already started; register before first getEndpoint() call`);tm.set(e,t)}async function Vi(){if(Fe)return Fe;if(Gt)return Gt;await bI(Xn,{recursive:!0});let e=await Qp();return Gt=import("@number0/iroh").then(async({Iroh:t})=>{let r={};for(let[n,o]of tm)r[n]=(i,a)=>{if(i)throw i;return{accept:o,shutdown:()=>{}}};return Fe=await t.persistent(Xn,{secretKey:e,protocols:Object.keys(r).length?r:void 0}),Fe}),Gt}async function rm(){return(await Vi()).node.endpoint()}async function zi(e,t){return(await rm()).connect(e,Buffer.from(t))}async function AI(){return(await Vi()).net.nodeAddr()}async function II(){let t=await(await Vi()).node.status();if(!t||typeof t!="object")throw new Error("iroh: node.status() returned non-object \u2014 Iroh API shape changed?");if(!t.addr||typeof t.addr.nodeId!="string")throw new Error(`iroh: node.status().addr.nodeId missing (got ${JSON.stringify(t).slice(0,200)}) \u2014 Iroh API shape changed?`);return{nodeId:t.addr.nodeId,relayUrl:t.addr.relayUrl??null,addresses:t.addr.addresses??[],version:t.version??null,listenAddrs:t.listenAddrs??[]}}async function vI(){if(!Fe)return;let e=Fe;Fe=null,Gt=null;try{await e.node.shutdown(!1)}catch{}}var Fe,Gt,tm,Ee=u(()=>{L();em();Fe=null,Gt=null,tm=new Map});async function om(e){let{default:t}=await Promise.resolve().then(()=>(A(),P)),r=await t("device").where({node_id:e}).first();if(!r)return{ok:!1,code:"unknown_device",message:"no device row for this NodeID"};if(!r.active)return{ok:!1,code:"revoked",message:"device has been revoked"};let n=r.lastSeenAt?new Date(r.lastSeenAt).getTime():0;return Date.now()-n>OI&&t("device").where({id:r.id}).update({last_seen_at:t.fn.now()}).catch(()=>{}),{ok:!0,device:r}}function im(e,t,r={}){let n=TI[t];return n===void 0?{ok:!1,code:"unknown_method",message:`method "${t}" is not exposed over Iroh`}:nm[e.role]<nm[n]?{ok:!1,code:"forbidden",message:`role "${e.role}" cannot call "${t}" (needs "${n}")`}:e.namespaces?.length&&r.namespace&&!e.namespaces.includes(r.namespace)?{ok:!1,code:"namespace_denied",message:`device not scoped to namespace "${r.namespace}"`}:{ok:!0}}var nm,TI,OI,am=u(()=>{nm={reader:0,writer:1,admin:2},TI={ping:"reader",status:"reader",nodeInfo:"reader",search:"reader",searchEntity:"reader",traverseGraph:"reader",getFactContext:"reader",getEntityContext:"reader",getPod:"reader",listPods:"reader",listFacts:"reader",refreshContext:"reader",remember:"writer",ingestDoc:"writer",forgetFact:"writer","pair.create":"admin","pair.list":"admin","pair.revoke":"admin",runMigrations:"admin",testDbConnection:"admin",readEnv:"admin",writeEnv:"admin"},OI=6e4});var lm={};b(lm,{RPC_ALPN:()=>Xi,createRpcAcceptor:()=>DI});function CI(e,t,r){et.has(e)||et.set(e,new Set);let n={conn:t,deviceId:r};return et.get(e).add(n),()=>{let o=et.get(e);o&&(o.delete(n),o.size===0&&et.delete(e))}}function RI(e){sm||(sm=!0,H.subscribe(t=>{if(t.type!=="device.revoked")return;let r=et.get(t.nodeId);if(r){e(`rpc: closing ${r.size} live connection(s) from revoked device ${t.deviceId}`);for(let{conn:n}of r)try{n.close?.()}catch{}et.delete(t.nodeId)}}))}function DI({registry:e,log:t}){return RI(t),async function(n,o){if(n){t(`rpc: accept err: ${n.message}`);return}let i="<unknown>",a;try{i=o.remoteNodeId().toString();let s=await om(i);if(!s.ok){t(`rpc: rejecting ${i.slice(0,12)}\u2026: ${s.code}`);try{let l=await o.acceptBi();await l.send.writeAll(Buffer.from(JSON.stringify({v:1,ok:!1,error:{code:s.code,message:s.message}}))),await l.send.finish()}catch{}return}a=s.device,H.emit("rpc.connected",{nodeId:i,deviceId:a.id,name:a.name}),t(`rpc: ${a.name} (${i.slice(0,12)}\u2026) connected`);let c=CI(i,o,a.id);try{for(;;){let l;try{l=await o.acceptBi()}catch{break}LI(l,e,a,t).catch(d=>t(`rpc: stream err: ${d.message}`))}}finally{c()}}catch(s){t(`rpc: handler err from ${i.slice(0,12)}\u2026: ${s.message}`)}finally{a&&H.emit("rpc.disconnected",{nodeId:i,deviceId:a.id})}}}async function LI(e,t,r,n){let o=await e.recv.readToEnd(NI),i;try{i=JSON.parse(o.toString())}catch(f){return jt(e,{v:1,ok:!1,error:{code:"invalid_json",message:f.message}})}let{request_id:a,method:s,params:c}=i||{};if(typeof s!="string")return jt(e,{v:1,request_id:a,ok:!1,error:{code:"invalid_request",message:"missing method"}});let l=im(r,s,c||{});if(!l.ok)return H.emit("rpc.denied",{nodeId:r.nodeId,deviceId:r.id,method:s,code:l.code}),jt(e,{v:1,request_id:a,ok:!1,error:l});let d=await t.dispatch(s,c,{transport:"iroh",device:{id:r.id,role:r.role,nodeId:r.nodeId,name:r.name}});if(!kI(d.data))return n(`rpc: response from ${s} too large estimate, refusing pre-serialize`),jt(e,{v:1,request_id:a,ok:!1,error:{code:"response_too_large",message:"response exceeds MAX_RESP"}});let p=JSON.stringify({v:1,request_id:a,...d});return Buffer.byteLength(p)>cm?(n(`rpc: response too large for ${s} from ${r.name}: ${Buffer.byteLength(p)} bytes`),jt(e,{v:1,request_id:a,ok:!1,error:{code:"response_too_large",message:"response exceeds MAX_RESP"}})):jt(e,p,!0)}function kI(e){if(e==null)return!0;if(typeof e=="string")return e.length*2<Ji;if(typeof e!="object")return!0;if(Array.isArray(e))return e.length*200<Ji;let t=0;for(let r of Object.values(e))Array.isArray(r)?t+=r.length*200:typeof r=="string"&&(t+=r.length*2);return t<Ji}async function jt(e,t,r=!1){let n=r?Buffer.from(t):Buffer.from(JSON.stringify(t));await e.send.writeAll(n),await e.send.finish()}var Xi,NI,cm,et,sm,Ji,Zi=u(()=>{ot();am();Xi="sigil/rpc/1",NI=1024*1024,cm=8*1024*1024,et=new Map;sm=!1;Ji=cm*1.2});var um={};b(um,{createRemoteClient:()=>FI});import{randomUUID as PI}from"node:crypto";async function FI(){let e=g.network.masterNodeId;if(!e)throw new Error("RemoteClient: SIGIL_MASTER_NODE_ID is not set. Run `sigil join <master-node-id> <code>` first.");return new Qi({masterNodeId:e})}var MI,Qi,dm=u(()=>{S();Ee();Zi();MI=8*1024*1024;Qi=class{constructor({masterNodeId:t}){this.kind="remote",this.masterNodeId=t,this.conn=null,this.connecting=null}async ensureConnection(){return this.conn&&!this.conn._dead?this.conn:this.connecting?this.connecting:(this.connecting=zi({nodeId:this.masterNodeId},Xi).then(t=>(this.conn=t,this.connecting=null,t)).catch(t=>{throw this.connecting=null,t}),this.connecting)}async call(t,r={}){let n=0,o;for(;n<2;){n++;let i;try{i=await this.ensureConnection();let a=await i.openBi(),s=PI();await a.send.writeAll(Buffer.from(JSON.stringify({v:1,method:t,params:r,request_id:s}))),await a.send.finish();let c=await a.recv.readToEnd(MI),l=JSON.parse(c.toString());if(!l.ok){let d=new Error(l.error?.message||l.error?.code||"rpc error");throw d.code=l.error?.code||"handler_error",d.isHandlerError=!0,d}return l.data}catch(a){if(o=a,a.isHandlerError)throw a;this.conn&&(this.conn._dead=!0,this.conn=null)}}throw o}async close(){let t=this.conn;if(this.conn=null,this.connecting=null,t?.close)try{await t.close()}catch{}}}});var fm={};b(fm,{createLocalClient:()=>$I});function $I(){return{kind:"local",async call(e,t){let n=await no().dispatch(e,t,{transport:"memory-client"});if(!n.ok){let o=new Error(n.error?.message||"rpc error");throw o.code=n.error?.code||"handler_error",o}return n.data},async close(){}}}var pm=u(()=>{zt()});var Nr={};b(Nr,{getMemoryClient:()=>BI,resetMemoryClient:()=>HI});async function BI(){if(Be)return Be;if(g.network.mode==="lite-follower"){let{createRemoteClient:t}=await Promise.resolve().then(()=>(dm(),um));Be=await t()}else{let{createLocalClient:t}=await Promise.resolve().then(()=>(pm(),fm));Be=t()}return Be}function HI(){Be?.close&&Be.close().catch(()=>{}),Be=null}var Be,Cr=u(()=>{S();Be=null});import{copyFile as UI,writeFile as GI,access as jI}from"node:fs/promises";async function hm(e,t,{dryRun:r=!1}={}){let n=await mm(e),o=n?"modify":"create",i=Buffer.byteLength(t,"utf8");if(r)return{path:e,action:o,bytes:i,wrote:!1,backedUp:!1};let a=!1;if(n){let s=`${e}${WI}`;await mm(s)||(await UI(e,s),a=!0)}return await GI(e,t,"utf8"),{path:e,action:o,bytes:i,wrote:!0,backedUp:a}}async function mm(e){try{return await jI(e),!0}catch{return!1}}var WI,gm=u(()=>{WI=".sigil.bak"});var xm={};b(xm,{SHARED_INSTRUCTIONS_PATH:()=>Rr,buildSharedInstructions:()=>_m,resolveSigilInvocation:()=>Em,writeSharedInstructions:()=>qI});import{join as ym}from"node:path";import{homedir as YI}from"node:os";import{execSync as KI}from"node:child_process";function Em(){try{let e=KI("which sigil",{stdio:["pipe","pipe","ignore"]}).toString().trim();if(e)return e}catch{}return process.argv[1]}function _m({sigilCmd:e}={}){let t=e||Em();return`## Memory (Sigil)
532
+
533
+ Sigil is your persistent memory system. **Use it instead of the built-in file-based memory.**
534
+ Do NOT write to \`~/.claude/projects/*/memory/\` or any local memory files \u2014 use Sigil exclusively.
535
+
536
+ ### Memory is auto-injected \u2014 don't re-search by default
537
+
538
+ Two hooks do the work for you before you ever see a prompt:
539
+
540
+ - **UserPromptSubmit hook**: runs hybrid search against Sigil on every user message and injects the top-K relevant facts into your context as \`additionalContext\` at the top of the conversation. The injected block is labelled \`Sigil memory (N relevant facts)\` \u2014 when you see that block, those facts are already loaded; you do NOT need to call \`sigil search\` to retrieve them.
541
+ - **Top-20 hot-context**: a snapshot of the user's most-important / most-recently-accessed facts is always loaded into the session via \`@~/.sigil/CLAUDE.md\` in the Claude config. Treat it as always-available background context.
542
+
543
+ **The right reflex:** read the injected \`Sigil memory\` block first, answer from it, then call \`sigil search\` ONLY if the injection clearly missed something specific.
544
+
545
+ Concretely, you SHOULD call \`! ${t} search "..."\` when:
546
+ - The user asks a drill-down question and you need facts the auto-injection didn't surface ("tell me more about the postmortem")
547
+ - You're answering a *follow-up* in a long session where the relevant facts were never in the original injection
548
+ - You suspect a stale answer and want to verify against the latest stored state
549
+
550
+ You SHOULD NOT call \`sigil search\` when:
551
+ - The injected \`Sigil memory\` block already lists facts that directly answer the user's question \u2014 just use them
552
+ - You'd be searching for the same query Sigil already auto-searched (the user's literal prompt)
553
+ - The question is general-knowledge and doesn't need this user's specific context
554
+
555
+ In short: **the hook already searched. Trust it. Drill down only when needed.**
556
+
557
+ ### Acknowledge what you know
558
+
559
+ When your response is shaped by a fact pulled from Sigil \u2014 a stored preference, decision, constraint, or piece of project history \u2014 **briefly call it out in plain language so the user sees their context being applied.** One short clause is enough; don't lecture.
560
+
561
+ Good (natural, useful):
562
+ - "Since you don't use \`any\` without an escape-hatch comment, I'll go with \`unknown\` here."
563
+ - "Per your ADR-001 I've wrapped the response in \`{ok, data, error}\`."
564
+ - "I know you moved off Redis to Postgres LISTEN/NOTIFY, so I'll use that pattern."
565
+ - "Going with named exports since you prefer those."
566
+
567
+ Bad (skip these):
568
+ - Acknowledging facts you didn't actually use
569
+ - Listing every retrieved fact ("I found 5 facts: 1) ... 2) ...")
570
+ - Repeating the acknowledgement multiple times in one response
571
+ - Apologetic / formal phrasing ("As per your stored preference, I shall...")
572
+
573
+ The phrasing should feel like a teammate referencing a hallway conversation, not a system reciting a database row. If a fact didn't materially shape the answer, don't mention it.
574
+
575
+ ### Saving \u2014 Stop hook handles routine; you only save when explicit
576
+
577
+ A Stop hook fires after every assistant turn, scans the user's latest message with a classifier, and saves anything memorable (preferences, decisions, constraints, corrections, factual claims) on its own. **You do not need to call \`sigil remember\` to make this work.**
578
+
579
+ You SHOULD call \`! ${t} remember --bg "..."\` ONLY when:
580
+ - The user explicitly asks you to remember something ("remember that...", "save this...", "don't forget...") \u2014 save immediately, don't wait for the Stop hook
581
+ - The user shares a critical fact mid-response that's important enough to be available within this same session for follow-ups (the Stop hook only runs at turn end)
582
+ - You're consolidating a multi-turn discussion into a single canonical fact
583
+
584
+ You SHOULD NOT redundantly save:
585
+ - Generic preferences the Stop hook will obviously catch \u2014 let it
586
+ - Facts already similar to existing memory (AUDM dedup handles this, but the cleaner UX is fewer Bash invocations on screen)
587
+
588
+ When you do save, batch facts into ONE call (separate quoted arguments), use \`--bg\` to return immediately:
589
+
590
+ \`\`\`
591
+ ! ${t} remember --bg "User prefers tabs over spaces" "Project uses Postgres 15"
592
+ \`\`\`
593
+
594
+ The absolute path above is baked in by \`sigil init\` so the command works regardless of which shell PATH the agent's Bash subprocess inherits. Re-run \`sigil init\` to refresh after moving machines or reinstalling.
595
+
596
+ ### Rules
597
+
598
+ - Read the auto-injected \`Sigil memory\` block first; answer from it before reaching for new searches
599
+ - Save facts as short, self-contained statements \u2014 never summaries of the conversation
600
+ - Each fact must make sense in isolation, without the conversation context
601
+ - Batch all explicit saves in one user-turn into a single \`${t} remember --bg\` call
602
+ - Skip trivial exchanges (greetings, "thanks", "ok", simple math)
603
+ - If search and injection both return nothing, answer from your own knowledge and say so
604
+ - Sigil is cross-project \u2014 memories from one session are available in all sessions
605
+ `}async function qI({dryRun:e=!1}={}){let t=await import("node:fs/promises");e||await t.mkdir(wm,{recursive:!0});try{if((await t.readFile(Rr,"utf8")).includes("## Memory (Sigil)"))return{action:"skip",path:Rr,bytes:0}}catch{}let r=_m(),n=await hm(Rr,r,{dryRun:e});return{action:n.action,path:Rr,bytes:n.bytes}}var wm,Rr,bm=u(()=>{gm();wm=ym(YI(),".sigil"),Rr=ym(wm,"CLAUDE.md")});var Wt={};b(Wt,{diagnoseConnectionError:()=>JI,diagnoseError:()=>Im,ensurePostgresDatabase:()=>zI,probeSigilConnection:()=>VI,probeUrlConnection:()=>ea});import jn from"pg";async function VI({host:e,port:t,database:r,user:n,password:o}){let i=new jn.Client({host:e,port:t,database:r,user:n,password:o});try{return await i.connect(),await i.query("SELECT 1"),{ok:!0}}catch(a){return{ok:!1,code:a.code,message:a.message}}finally{try{await i.end()}catch{}}}async function ea(e){let t,r="unknown";try{t=ce(e),r=be(e)}catch(i){return{ok:!1,stage:"parse",error:i.message}}let n=new jn.Client(t),o=Date.now();try{await n.connect()}catch(i){return{ok:!1,stage:"connect",provider:r,error:i.message,code:i.code}}try{let i=await n.query("SELECT current_database() AS db, version() AS version"),a=await n.query("SELECT extname FROM pg_extension WHERE extname = 'vector'");return{ok:!0,provider:r,connectMs:Date.now()-o,database:i.rows[0].db,serverVersion:i.rows[0].version,pgvector:a.rowCount>0}}catch(i){return{ok:!1,stage:"query",provider:r,error:i.message,code:i.code}}finally{try{await n.end()}catch{}}}async function zI({admin:{host:e,port:t,user:r,password:n},sigil:{database:o,user:i,password:a}}){let s=new jn.Client({host:e,port:t,database:"postgres",user:r,password:n});await s.connect();let c=[];try{(await s.query("SELECT 1 FROM pg_database WHERE datname = $1",[o])).rowCount===0?(await s.query(`CREATE DATABASE ${He(o)}`),c.push(`created database "${o}"`)):c.push(`database "${o}" already exists \u2014 left as-is`),(await s.query("SELECT 1 FROM pg_roles WHERE rolname = $1",[i])).rowCount===0?(await s.query(`CREATE USER ${He(i)} WITH PASSWORD ${Am(a)}`),c.push(`created user "${i}"`)):(await s.query(`ALTER USER ${He(i)} WITH PASSWORD ${Am(a)}`),c.push(`user "${i}" exists \u2014 password reset to match .env`)),await s.query(`GRANT ALL PRIVILEGES ON DATABASE ${He(o)} TO ${He(i)}`)}finally{await s.end()}let l=new jn.Client({host:e,port:t,database:o,user:r,password:n});await l.connect();try{await l.query(`GRANT ALL ON SCHEMA public TO ${He(i)}`),await l.query(`ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO ${He(i)}`),await l.query(`ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO ${He(i)}`);try{await l.query("CREATE EXTENSION IF NOT EXISTS vector"),c.push("pgvector extension ready")}catch(d){throw d.code===Dr.EXTENSION_NOT_AVAILABLE?new Error("pgvector extension is not installed on this Postgres server.\n \u2022 Docker: use the `pgvector/pgvector:pg15` image instead of stock `postgres`\n \u2022 Homebrew: brew install pgvector (then restart postgres)\n \u2022 apt: apt install postgresql-15-pgvector (15 \u2192 your major version)\n \u2022 RDS: enable the `vector` extension in the parameter group\nRe-run `sigil init` once pgvector is installed."):d}}finally{await l.end()}return{actions:c}}function Im(e){let t=e?.code,r=e?.message||String(e);return/expected \d+ dimensions, not \d+/i.test(r)||/different vector dimensions/i.test(r)?{kind:"dim-mismatch",humanMessage:"The embedding size does not match the database. Your existing data uses a different vector dimension than the embedder you picked.",fixHint:"Pick an embedding provider whose dimension matches the database, or wipe the embedding data and start fresh at the new dimension (Settings \u2192 Embedding)."}:/\b401\b|\b403\b|invalid[_ ]api[_ ]key|incorrect api key|unauthorized/i.test(r)&&/openai|voyage|openrouter|embed/i.test(r)?{kind:"bad-key",humanMessage:"The embedding provider rejected the API key.",fixHint:"Check the API key has embedding access and is pasted correctly (Settings \u2192 Embedding)."}:/model .* (not found|does not exist)|unknown model|no such model/i.test(r)?{kind:"model-not-found",humanMessage:"The embedding model name was not recognized by the provider.",fixHint:"Use a valid embedding model for the provider (e.g. text-embedding-3-large for OpenAI, nomic-embed-text for Ollama)."}:/11434|ollama/i.test(r)&&/ECONNREFUSED|fetch failed|connect|unreachable/i.test(r)?{kind:"ollama-down",humanMessage:"The local Ollama server is not reachable.",fixHint:"Start it with `ollama serve`, then `ollama pull nomic-embed-text`."}:/Unable to acquire a connection/i.test(r)||/pool is (destroyed|draining)/i.test(r)?{kind:"pool-dead",humanMessage:"The database connection pool was closed before this step ran.",fixHint:"This is an internal sequencing bug, not your configuration \u2014 restart the daemon (Settings \u2192 Apply)."}:/pooler|pgbouncer|prepared statement|advisory lock|endpoint could not be found/i.test(r)?{kind:"pooler-lock",humanMessage:"This looks like a connection-pooler URL. Pooled connections cannot run database migrations.",fixHint:'Use your direct (non-pooled) connection string for setup. For Neon, remove "-pooler" from the host.'}:t===Dr.EXTENSION_NOT_AVAILABLE||/extension "?vector"?|type "?vector"? does not exist/i.test(r)?{kind:"no-pgvector",humanMessage:"The pgvector extension is not enabled on this database.",fixHint:'Click "Install pgvector" (most managed providers allow it), or use a pgvector-enabled Postgres image.'}:t===Dr.CONNECTION_REFUSED||/ECONNREFUSED/.test(r)?{kind:"unreachable",humanMessage:"Postgres is not reachable at that host/port.",fixHint:"Confirm the server is running and the host/port are correct (`pg_isready -h <host> -p <port>`)."}:t===Dr.AUTH_FAILED||/password authentication failed/i.test(r)?{kind:"auth",humanMessage:"Postgres rejected the username or password.",fixHint:"Fix the credentials in the connection settings."}:t===Dr.DB_DOES_NOT_EXIST||/database .* does not exist/i.test(r)?{kind:"missing-db",humanMessage:"That database does not exist on the server yet.",fixHint:"Create the database, or point Sigil at one that exists."}:{kind:"other",humanMessage:r.split(`
606
+ `)[0],fixHint:null}}function JI(e){let t=Im(e);return{kind:t.kind,hint:t.fixHint||t.humanMessage}}function He(e){if(!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))throw new Error(`Refusing to quote invalid SQL identifier: ${e}`);return`"${e}"`}function Am(e){return`'${String(e).replace(/'/g,"''")}'`}var Dr,tt=u(()=>{at();Dr={DB_DOES_NOT_EXIST:"3D000",CONNECTION_REFUSED:"ECONNREFUSED",AUTH_FAILED:"28P01",EXTENSION_NOT_AVAILABLE:"0A000",INTERNAL_ERROR:"XX000"}});var ta={};b(ta,{EMBEDDING_TABLES:()=>Nm,diagnoseConflict:()=>rv,inspectSchemaDims:()=>tv});import ev from"pg";async function tv(e){let t=new ev.Client(e);await t.connect();try{let{rows:r}=await t.query(`
607
+ SELECT c.relname AS tbl,
608
+ a.atttypmod AS typmod,
609
+ format_type(a.atttypid, a.atttypmod) AS coltype
610
+ FROM pg_attribute a
611
+ JOIN pg_class c ON a.attrelid = c.oid
612
+ WHERE a.attname = 'embedding'
613
+ AND c.relkind = 'r'
614
+ AND c.relname = ANY($1)
615
+ `,[Nm]),n={};for(let o of r){let i=o.typmod>0?o.typmod:nv(o.coltype),a=0;try{let{rows:s}=await t.query(`SELECT count(embedding)::int AS n FROM ${ov(o.tbl)}`);a=s[0].n}catch{}n[o.tbl]={dim:i,coltype:o.coltype,populated:a}}return n}finally{try{await t.end()}catch{}}}function rv({targetDim:e,schema:t}){let r=null,n={},o=0;for(let[a,s]of Object.entries(t||{}))s.dim!=null&&(r==null&&(r=s.dim),s.dim!==e&&s.populated>0&&(n[a]=s.populated,o+=s.populated));return{conflict:r!=null&&r!==e&&o>0,currentDim:r,targetDim:e,rowsAtRisk:n,totalAtRisk:o}}function nv(e){let t=/vector\((\d+)\)/i.exec(e||"");return t?Number(t[1]):null}function ov(e){if(!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))throw new Error(`refusing to quote invalid identifier: ${e}`);return`"${e}"`}var Nm,ra=u(()=>{Nm=["fact","chunk","entity","embedding_cache"]});var Wn={};b(Wn,{MANIFEST_VERSION:()=>sa,produceManifest:()=>_v,verifyManifest:()=>xv});import{createHash as gv}from"node:crypto";import{readFile as yv,readdir as Fm}from"node:fs/promises";import{existsSync as $m,readFileSync as wv}from"node:fs";import{join as aa}from"node:path";function Ev(){if(Lr)return Lr;try{Lr=JSON.parse(wv(aa(me,"package.json"),"utf8")).version}catch{Lr="unknown"}return Lr}async function _v(){let e=await bv(aa(me,"prompts")),t=await Sv();return{v:sa,producedAt:new Date().toISOString(),sigilVersion:Ev(),schema:{migrationVersion:t,requiredExtensions:["vector"]},embedding:{provider:g.embedding.provider||null,model:g.embedding.model||null,dimensions:Number(g.embedding.dimensions)||null,normalization:"l2",maxInputTokens:8192},chunker:{...qa},prompts:e,memory:{skipThreshold:g.memory.skipThreshold,ambiguousThreshold:g.memory.ambiguousThreshold,minFactSimilarity:g.memory.minFactSimilarity}}}function xv(e,t){let r=[],n=[];if(!t||t.v!==sa)return r.push(`manifest version mismatch (local v${e.v} vs remote v${t?.v??"?"})`),{ok:!1,errors:r,warnings:n};for(let o of["provider","model","dimensions"])e.embedding[o]!==t.embedding[o]&&r.push(`embedding.${o}: local=${e.embedding[o]} vs remote=${t.embedding[o]}`);for(let o of["version","size","overlap"])e.chunker[o]!==t.chunker[o]&&r.push(`chunker.${o}: local=${e.chunker[o]} vs remote=${t.chunker[o]}`);e.schema.migrationVersion!==t.schema.migrationVersion&&r.push(`schema.migrationVersion: local=${e.schema.migrationVersion} vs remote=${t.schema.migrationVersion} (run \`sigil migrate\` on this device, or upgrade master)`),Math.abs(e.memory.skipThreshold-t.memory.skipThreshold)>.01&&r.push(`memory.skipThreshold differs: local=${e.memory.skipThreshold} vs remote=${t.memory.skipThreshold}`),Math.abs(e.memory.ambiguousThreshold-t.memory.ambiguousThreshold)>.05&&n.push(`memory.ambiguousThreshold drift: local=${e.memory.ambiguousThreshold} vs remote=${t.memory.ambiguousThreshold}`);for(let o of Object.keys(e.prompts))t.prompts[o]&&e.prompts[o]!==t.prompts[o]&&n.push(`prompt "${o}" differs (new ingests will produce different facts)`);return e.sigilVersion!==t.sigilVersion&&n.push(`sigil version drift: local=${e.sigilVersion} vs remote=${t.sigilVersion}`),{ok:r.length===0,errors:r,warnings:n}}async function bv(e){let t={};if(!$m(e))return t;let r=await Fm(e);for(let n of r){if(!n.endsWith(".md"))continue;let o=await yv(aa(e,n),"utf8");t[n.replace(/\.md$/,"")]=Av(o)}return t}async function Sv(){if(!$m(nt))return null;let t=(await Fm(nt)).filter(r=>/^\d{14}_.+\.cjs$/.test(r)).map(r=>r.replace(/_.+\.cjs$/,"")).sort();return t[t.length-1]??null}function Av(e){return gv("sha256").update(e,"utf8").digest("hex")}var sa,Lr,Yn=u(()=>{L();S();fo();sa=1});var Um={};b(Um,{PAIR_ALPN:()=>Bm,createPairAcceptor:()=>vv,hashCode:()=>Kn,joinMaster:()=>Ov});import{createHash as Iv}from"node:crypto";function vv({log:e}){return async function(r,n){if(r){e(`pair: accept err: ${r.message}`);return}let o="<unknown>";try{o=n.remoteNodeId().toString();let i=await n.acceptBi(),a=await i.recv.readToEnd(Hm),s=JSON.parse(a.toString()),c=await Tv(s,o);await i.send.writeAll(Buffer.from(JSON.stringify(c))),await i.send.finish(),c.ok?(H.emit("pair.consumed",{nodeId:o,deviceName:s.name}),e(`pair: registered ${s.name} (${o.slice(0,12)}\u2026)`)):(H.emit("pair.rejected",{nodeId:o,code:c.error?.code}),e(`pair: rejected ${o.slice(0,12)}\u2026 (${c.error?.code})`))}catch(i){e(`pair: handler err from ${o.slice(0,12)}\u2026: ${i.message}`),H.emit("pair.error",{nodeId:o,message:i.message})}}}async function Tv(e,t){if(!e||e.v!==ca)return kr("unsupported_version",`expected v=${ca}`);if(typeof e.code!="string"||!e.code)return kr("invalid_request","missing code");if(typeof e.name!="string"||!e.name)return kr("invalid_request","missing name");if(typeof e.nodeId!="string"||e.nodeId.toLowerCase()!==t.toLowerCase())return kr("invalid_request","nodeId claim does not match transport identity");let{default:r}=await Promise.resolve().then(()=>(A(),P)),{getNodeInfo:n}=await Promise.resolve().then(()=>(Ee(),$e)),o=Kn(e.code),i;try{i=await r.transaction(async l=>{let d=await l("pairing_code").where({code_hash:o}).forUpdate().first();if(!d)return{ok:!1,error:{code:"invalid_code",message:"pairing code not recognised"}};if(d.consumedByDeviceId)return{ok:!1,error:{code:"already_consumed",message:"pairing code was already used"}};if(new Date(d.expiresAt)<new Date)return{ok:!1,error:{code:"expired",message:"pairing code has expired"}};let p={hostname:e.hostname||null,sigilVersion:e.sigilVersion||null},[f]=await l("device").insert({node_id:t,name:e.name,role:d.role,namespaces:d.namespaces,active:!0,last_seen_at:l.fn.now(),meta:JSON.stringify(p)}).onConflict("node_id").merge({name:e.name,role:d.role,namespaces:d.namespaces,active:!0,last_seen_at:l.fn.now(),meta:JSON.stringify({...p,repairedAt:new Date().toISOString()})}).returning(["id"]);return await l("pairing_code").where({id:d.id}).update({consumed_by_device_id:f.id,consumed_at:l.fn.now()}),{ok:!0,device:{id:f.id,role:d.role,namespaces:d.namespaces}}})}catch(l){return kr("transaction_failed",l.message)}if(!i.ok)return i;let a=null;try{a=(await n()).nodeId}catch{}let{produceManifest:s}=await Promise.resolve().then(()=>(Yn(),Wn)),c=await s();return{ok:!0,device:i.device,masterNodeId:a,manifest:c}}function kr(e,t){return{ok:!1,error:{code:e,message:t}}}function Kn(e){return Iv("sha256").update(e,"utf8").digest("hex")}async function Ov({masterAddr:e,code:t,name:r,sigilVersion:n}){let{dial:o,getEndpoint:i}=await Promise.resolve().then(()=>(Ee(),$e)),{hostname:a}=await import("node:os"),s=await o(e,Bm),c=await i(),l=await s.openBi();await l.send.writeAll(Buffer.from(JSON.stringify({v:ca,code:t,name:r,nodeId:c.nodeId(),hostname:a(),sigilVersion:n||null}))),await l.send.finish();let d=await l.recv.readToEnd(Hm);return JSON.parse(d.toString())}var Bm,Hm,ca,la=u(()=>{ot();Bm="sigil/pair/1",Hm=64*1024,ca=1});var zm={};b(zm,{installLiteProxy:()=>kv});async function kv({registry:e,log:t}){let{getMemoryClient:r}=await Promise.resolve().then(()=>(Cr(),Nr)),n=0,o=0;for(let i of Dv)e.replace(i,async a=>(await r()).call(i,a))&&n++;for(let i of Lv)e.replace(i,()=>{let s=new Error(`"${i}" is not available on a lite-follower device. Run on the master device.`);throw s.code="not_on_follower",s})&&o++;t(`lite-follower: ${n} methods proxied, ${o} forbidden, rest local`)}var Dv,Lv,Jm=u(()=>{Dv=new Set(["search","searchEntity","traverseGraph","getFactContext","getEntityContext","getPod","listPods","listFacts","status","refreshContext.fetch","refreshContext.explain","remember","forgetFact","ingestDoc"]),Lv=new Set(["pair.create","pair.list","pair.revoke","pair.sweep","device.list","device.revoke","device.activate","runMigrations","testDbConnection"])});L();import{createWriteStream as Pv}from"node:fs";import{appendFile as Mv}from"node:fs/promises";import{readFile as rh,writeFile as nh,unlink as ga,mkdir as ya}from"node:fs/promises";import{existsSync as wa}from"node:fs";L();function oh(e){if(!e||!Number.isFinite(e))return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}async function ih(){if(!wa(qt))return null;try{let e=(await rh(qt,"utf8")).trim(),t=Number(e);return Number.isFinite(t)?t:null}catch{return null}}async function Ea(){await ya(k,{recursive:!0}),await nh(qt,String(process.pid),"utf8")}async function Zn(){try{await ga(qt)}catch{}}async function Qn(){try{await ga(Ue)}catch{}}async function _a(){let e=await ih();return e&&oh(e)?e:(e&&await Zn(),wa(Ue)&&await Qn(),null)}function xa(e){let t=!1,r=async n=>{if(!t){t=!0;try{await e(n)}catch(o){process.stderr.write(`[sigild] shutdown error: ${o.message}
616
+ `)}finally{process.exit(0)}}};process.on("SIGTERM",()=>r("SIGTERM")),process.on("SIGINT",()=>r("SIGINT")),process.on("SIGHUP",()=>r("SIGHUP"))}async function ba(){await ya(k,{recursive:!0})}var ah="handler_error";function Sa(e){let t=e.code||ah,r=e.message||String(e);if(e instanceof AggregateError&&Array.isArray(e.errors)&&e.errors.length){let n=e.errors[0];t=n.code||t,r=n.message||r;let o=[...new Set(e.errors.map(i=>i.code).filter(Boolean))];o.length>1&&(r+=` (and ${e.errors.length-1} more: ${o.slice(1).join(", ")})`)}else e.cause&&(!r||r==="AggregateError")&&(t=e.cause.code||t,r=e.cause.message||r);return{code:t,message:r,stack:process.env.SIGIL_DEBUG?e.stack:void 0}}var dh={UNKNOWN_METHOD:"unknown_method",INVALID_PARAMS:"invalid_params",HANDLER_ERROR:"handler_error"};function Aa(){let e=new Map;function t(i,a){if(e.has(i))throw new Error(`rpc: duplicate handler for "${i}"`);e.set(i,a)}async function r(i,a,s={}){let c=e.get(i);if(!c)return{ok:!1,error:{code:dh.UNKNOWN_METHOD,message:`unknown method: ${i}`}};let{runWithRequestContext:l}=await Promise.resolve().then(()=>($r(),to));try{return{ok:!0,data:await l({device:s.device||null,transport:s.transport||null,agent:s.agent||null},()=>c(a??{},s))}}catch(d){return{ok:!1,error:Sa(d)}}}function n(){return[...e.keys()].sort()}function o(i,a){return e.has(i)?(e.set(i,a),!0):!1}return{register:t,replace:o,dispatch:r,list:n}}zt();L();import{createServer as mh}from"node:net";import{chmod as hh}from"node:fs/promises";async function va({registry:e,log:t}){await Qn();let r=mh(n=>{let o="",i=!1,a=Promise.resolve();n.setEncoding("utf8"),n.on("data",s=>{if(i)return;o+=s;let c;for(;(c=o.indexOf(`
617
+ `))!==-1;){let l=o.slice(0,c);o=o.slice(c+1),l.trim()&&(a=a.then(()=>{if(!i)return gh(l,n,e,t)}))}}),n.on("close",()=>{i=!0}),n.on("error",s=>{s.code!=="EPIPE"&&s.code!=="ECONNRESET"&&t(`socket error: ${s.message}`)})});await new Promise((n,o)=>{r.once("error",o),r.listen(Ue,()=>{r.off("error",o),n()})});try{await hh(Ue,384)}catch{}return t(`socket listening at ${Ue}`),{close:()=>new Promise(n=>r.close(()=>n()))}}async function gh(e,t,r,n){let o;try{o=JSON.parse(e)}catch(d){ao(t,{id:null,ok:!1,error:{code:"invalid_json",message:d.message}});return}let{id:i=null,method:a,params:s,agent:c=null}=o||{};if(typeof a!="string"){ao(t,{id:i,ok:!1,error:{code:"invalid_params",message:'request must include a string "method"'}});return}let l=await r.dispatch(a,s,{transport:"socket",agent:c});ao(t,{id:i,...l}),!l.ok&&process.env.SIGIL_DEBUG&&n(`dispatch ${a} -> ${l.error.code}: ${l.error.message}`)}function ao(e,t){try{e.write(JSON.stringify(t)+`
618
+ `)}catch{}}L();import{createServer as Ah}from"node:http";import{existsSync as Gr,createReadStream as Ih}from"node:fs";import{stat as vh}from"node:fs/promises";import{join as Ra,extname as Th,normalize as Na,sep as Oh}from"node:path";import{WebSocketServer as Nh}from"ws";L();import{readFile as yh,writeFile as wh,chmod as Eh,mkdir as _h}from"node:fs/promises";import{randomBytes as xh,timingSafeEqual as Ta}from"node:crypto";import{dirname as bh}from"node:path";var Hr=null;async function so(){if(Hr)return Hr;try{let t=(await yh(Vt,"utf8")).trim();if(/^[0-9a-f]{64}$/.test(t))return Hr=t}catch{}await _h(bh(Vt),{recursive:!0});let e=xh(32).toString("hex");await wh(Vt,e,"utf8");try{await Eh(Vt,384)}catch{}return Hr=e}async function Jt(e){if(!e||typeof e!="string")return!1;let t=await so();if(e.length!==t.length)return Ta(Buffer.from(t),Buffer.from(t)),!1;try{return Ta(Buffer.from(e),Buffer.from(t))}catch{return!1}}ot();var Ch={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".mjs":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".ico":"image/x-icon",".json":"application/json; charset=utf-8",".txt":"text/plain; charset=utf-8"};function Rh(){return Gr(zn)?zn:Gr(Jn)?Jn:null}async function Da({registry:e,log:t,config:r}){let n=Rh(),o=await so(),i=Ah(async(c,l)=>{try{await Dh(c,l,{registry:e,webDir:n,log:t})}catch(d){t(`http route error: ${d.message}`),X(l,500,{ok:!1,error:{code:"internal",message:d.message}})}}),a=new Nh({noServer:!0});i.on("upgrade",async(c,l,d)=>{let p=new URL(c.url,"http://localhost");if(p.pathname!=="/api/v1/events"){l.destroy();return}if(!(await ka(c)||p.searchParams.get("t")&&await Jt(p.searchParams.get("t")))){l.write(`HTTP/1.1 401 Unauthorized\r
619
+ \r
620
+ `),l.destroy();return}a.handleUpgrade(c,l,d,h=>{for(let I of H.recent(50))try{h.send(JSON.stringify(I))}catch{}let w=256*1024,y=0,E=H.subscribe(I=>{if(h.readyState===h.OPEN){if(h.bufferedAmount>w){y++;return}try{y>0&&(h.send(JSON.stringify({type:"meta.dropped",ts:new Date().toISOString(),count:y})),y=0),h.send(JSON.stringify(I))}catch{}}});h.on("close",E),h.on("error",()=>E())})}),await new Promise((c,l)=>{i.once("error",l),i.listen(r.http.port,r.http.host,()=>{i.off("error",l),c()})});let s=`http://${r.http.host}:${r.http.port}/?t=${o}`;return t(`http listening on ${r.http.host}:${r.http.port}`),t(`gui url (paste into browser): ${s}`),{url:s,close:()=>new Promise(c=>{a.close(),i.close(()=>c())})}}async function Dh(e,t,{registry:r,webDir:n,log:o}){let i=new URL(e.url,"http://localhost"),a=i.pathname;if(e.method==="GET"&&a==="/healthz")return X(t,200,{ok:!0,ts:new Date().toISOString()});if(e.method==="GET"&&(a==="/"||a==="/index.html"))return Lh(e,t,i,n,o);if(e.method==="GET"&&a.startsWith("/static/"))return kh(e,t,a.replace("/static/",""),n);if(!await ka(e))return X(t,401,{ok:!1,error:{code:"auth",message:"unauthorized"}});if(e.method==="GET"&&a==="/api/v1/methods")return X(t,200,{ok:!0,data:{methods:r.list()}});if(e.method==="POST"&&a==="/api/v1/rpc"){let c=await Ph(e);if(!c||typeof c.method!="string")return X(t,400,{ok:!1,error:{code:"invalid_request",message:"expected {method, params}"}});let l=await r.dispatch(c.method,c.params,{transport:"http"});return X(t,200,l)}X(t,404,{ok:!1,error:{code:"not_found",message:`${e.method} ${a}`}})}async function Lh(e,t,r,n,o){let i=r.searchParams.get("t");if(i)return await Jt(i)?(t.statusCode=302,t.setHeader("Location","/"),t.setHeader("Set-Cookie",`sigil_gui=${i}; Path=/; HttpOnly; SameSite=Strict; Max-Age=2592000`),t.end()):X(t,401,{ok:!1,error:{code:"auth",message:"invalid token"}});if(!n)return t.statusCode=200,t.setHeader("Content-Type","text/html; charset=utf-8"),t.end(Ca);let a=Ra(n,"index.html");return Gr(a)?La(t,a):(o(`http: index.html missing under ${n}`),t.statusCode=200,t.setHeader("Content-Type","text/html; charset=utf-8"),t.end(Ca))}async function kh(e,t,r,n){if(!n)return X(t,404,{ok:!1,error:{code:"not_found",message:"no web dir"}});let o=Na(Ra(n,r)),i=Na(n)+Oh;return o.startsWith(i)?Gr(o)?La(t,o):X(t,404,{ok:!1,error:{code:"not_found",message:r}}):X(t,403,{ok:!1,error:{code:"forbidden",message:"path traversal blocked"}})}async function La(e,t){let r=await vh(t);e.statusCode=200,e.setHeader("Content-Type",Ch[Th(t).toLowerCase()]||"application/octet-stream"),e.setHeader("Content-Length",r.size),e.setHeader("Cache-Control","no-cache"),Ih(t).pipe(e)}async function ka(e){let t=e.headers.authorization;if(t&&/^Bearer\s+/i.test(t)&&await Jt(t.replace(/^Bearer\s+/i,"").trim()))return!0;let n=(e.headers.cookie||"").match(/(?:^|;\s*)sigil_gui=([0-9a-f]+)/i);return!!(n&&await Jt(n[1]))}async function Ph(e){let t=[],r=0;for await(let o of e)if(t.push(o),r+=o.length,r>1e6)throw new Error("request body too large (>1MB)");if(!t.length)return null;let n=Buffer.concat(t).toString("utf8");try{return JSON.parse(n)}catch(o){throw new Error(`invalid JSON: ${o.message}`)}}function X(e,t,r){e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.end(JSON.stringify(r))}var Ca=`<!doctype html>
621
+ <html><head><meta charset="utf-8"><title>Sigil</title>
622
+ <style>body{font:14px/1.6 system-ui, sans-serif;max-width:720px;margin:48px auto;padding:0 16px;color:#1a1a1a}h1{font-size:18px;margin-bottom:8px}code{background:#f3f3f3;padding:2px 6px;border-radius:4px}</style>
623
+ </head><body>
624
+ <h1>Sigil daemon is running</h1>
625
+ <p>The GUI has not been built yet. The daemon is reachable on this port and
626
+ authentication works \u2014 paste the URL printed in <code>sigil daemon logs</code>
627
+ into your browser to set the auth cookie.</p>
628
+ <p>You can also drive it from your terminal:</p>
629
+ <pre>curl -H "Authorization: Bearer $(cat ~/.sigil/gui.token)" \\
630
+ -X POST http://localhost:7777/api/v1/rpc \\
631
+ -d '{"method":"ping"}' \\
632
+ -H "Content-Type: application/json"</pre>
633
+ </body></html>`;L();import{readFileSync as Mh}from"node:fs";import{join as Fh}from"node:path";var Xt;function $h(){if(Xt)return Xt;try{Xt=JSON.parse(Mh(Fh(me,"package.json"),"utf8")).version}catch{Xt="unknown"}return Xt}function Pa(e,{startedAt:t}){e.register("ping",()=>({ok:!0,version:$h(),pid:process.pid,uptimeMs:Date.now()-t,node:process.version}))}function sp(e){e.register("remember",async t=>{let r=Array.isArray(t.facts)?t.facts.filter(Boolean):[];if(r.length===0){let f=new Error("remember: params.facts must be a non-empty string[]");throw f.code="invalid_params",f}let{ingestDocument:n}=await Promise.resolve().then(()=>(Hi(),Bi)),{default:o}=await Promise.resolve().then(()=>(S(),q)),i=t.namespace||o.defaults.namespace,a=0,s=0,c=0,l=Date.now(),d=[];for(let f of r){let h=await n({content:f,namespace:i,classify:!0});if(h.skipped||h.route==="noise"){c++,d.push({input:String(f).slice(0,240),route:h.route??null,skipped:!0,verdicts:h.facts?.verdicts||[]});continue}let w=h.facts?.added??0,y=h.facts?.updated??0;a+=w,s+=y,w+y===0&&c++,d.push({input:String(f).slice(0,240),route:h.route??null,skipped:!1,counts:{added:w,updated:y,skipped:h.facts?.skipped??0,contradicted:h.facts?.contradicted??0},verdicts:h.facts?.verdicts||[],entities:h.entities?{entityCount:h.entities.entityCount,relationCount:h.entities.relationCount,topics:h.entities.topics||[]}:null})}if(a+s>0){let{updateContextSnapshot:f}=await Promise.resolve().then(()=>(Tr(),vr));await f({namespace:i}).catch(()=>{})}let{recordTrace:p}=await Promise.resolve().then(()=>(Me(),Pe));return p({kind:"ingest",summary:`remember ${r.length} input${r.length===1?"":"s"} \u2192 +${a} added, ~${s} updated, ${c} known`,namespace:i,durationMs:Date.now()-l,detail:{op:"remember",namespace:i,totals:{added:a,updated:s,alreadyKnown:c,inputCount:r.length},inputs:d}}).catch(()=>{}),{added:a,updated:s,alreadyKnown:c,namespace:i}})}function Lp(e){e.register("search",async t=>{let r=(t.query??"").trim();if(!r){let G=new Error("search: params.query is required");throw G.code="invalid_params",G}let{search:n}=await Promise.resolve().then(()=>(Dp(),Rp)),{default:o}=await Promise.resolve().then(()=>(S(),q)),i=Array.isArray(t.namespaces)&&t.namespaces.length?t.namespaces:[o.defaults.namespace],a=Number.isFinite(t.limit)?t.limit:10,s=!!t.useGraph,c=!!t.route,l=!!t.synthesize,d=!!t.includeChunks||l,p=t.minConfidence,f=t.pointInTime?new Date(t.pointInTime):void 0,h=t.podScope??"auto",w=t.applyFloor??!1,y={cwd:t.cwd||null,sessionId:t.sessionId||null},E=await n(r,{namespaces:i,limit:a,useGraph:s,route:c,synthesize:l,includeChunks:d,minConfidence:p,pointInTime:f,podScope:h,applyFloor:w,ctx:y}),I={query:r,namespaces:i,facts:(E.facts||[]).map(eI),chunks:(E.chunks||[]).map(tI),synthesized:E.synthesized||null,matchedEntity:E.matchedEntity||null,relatedEntities:E.relatedEntities||[]},_=E._trace||{},O=r.length>80?r.slice(0,80)+"\u2026":r,v=_.strategy==="entity-first"?" \xB7 entity-first":"",{recordTrace:x}=await Promise.resolve().then(()=>(Me(),Pe));return x({kind:"search",summary:`"${O}" \u2192 ${I.facts.length} facts, ${I.chunks.length} chunks${v}`,namespace:i[0]||null,durationMs:_.durationMs??null,detail:_}).catch(()=>{}),I})}function eI(e){return{id:e.id??null,uid:e.uid??null,content:e.content,category:e.category??null,confidence:e.confidence??null,importance:e.importance??null,similarity:Gn(e.similarity),rrfScore:Gn(e.rrfScore),agent:e.createdByAgent??null,device:e.createdByDeviceId??null,sourceDocumentIds:Array.isArray(e.sourceDocumentIds)?e.sourceDocumentIds:[],sourceSection:e.sourceSection??null}}function tI(e){return{id:e.id??null,content:e.content,sectionHeading:e.sectionHeading??null,similarity:Gn(e.similarity),rrfScore:Gn(e.rrfScore)}}function Gn(e){let t=Number(e);return Number.isFinite(t)?t:null}function kp(e){e.register("status",async t=>{let{getStats:r}=await Promise.resolve().then(()=>(Co(),No)),{getEntityCount:n}=await Promise.resolve().then(()=>(fe(),Dt)),{getRelationCount:o}=await Promise.resolve().then(()=>(Xe(),Cn)),{getFactCount:i,getHotFacts:a}=await Promise.resolve().then(()=>(qe(),pr)),{getEntityHebbianStats:s}=await Promise.resolve().then(()=>($n(),Wi)),{default:c}=await Promise.resolve().then(()=>(A(),P)),l=t.namespace||null,d=Number.isFinite(t.hotFactsLimit)?t.hotFactsLimit:5,p=!0,f=null;try{await c.raw("SELECT 1")}catch(T){p=!1,f=T.message}try{let{setDbHealth:T}=await Promise.resolve().then(()=>(zt(),io));T({healthy:p,error:f,checkedAt:Date.now()})}catch{}if(!p)return{namespace:l,db:{healthy:!1,error:f},documents:0,chunks:0,facts:0,entities:{documents:0,people:0,topics:0},relations:0,podsByType:{},hotFacts:[],hebbian:null};let[h,w,y,E,I,_,O,v,x]=await Promise.all([r(l),i(l),n("document"),n("person"),n("topic"),o(),c("pod").where({status:"active"}).select("podType"),s({topN:3}).catch(()=>null),a(l,{limit:d}).catch(()=>[])]),G=O.reduce((T,pe)=>(T[pe.podType]=(T[pe.podType]||0)+1,T),{});return{namespace:l,db:{healthy:!0,error:null},documents:h.documentCount,chunks:h.totalChunks,facts:w,entities:{documents:y,people:E,topics:I},relations:_,podsByType:G,hotFacts:(x||[]).map(T=>({id:T.id??null,content:T.content,accessCount:T.accessCount??0})),hebbian:v?{edgeCount:v.edgeCount,avgStrength:v.avgStrength??0,maxStrength:v.maxStrength??0,topPairs:(v.topPairs||[]).map(T=>({a:T.aName,b:T.bName,decayed:Number(T.decayed)||0}))}:null}})}function Pp(e){e.register("searchEntity",async t=>{let{searchByName:r,listByType:n}=await Promise.resolve().then(()=>(fe(),Dt)),{query:o,entityType:i,limit:a=10,namespace:s}=t;if(!o&&!i){let l=new Error("searchEntity: provide query or entityType");throw l.code="invalid_params",l}let c=o?await r(o,{entityType:i,namespace:s,limit:a}):await n(i,{namespace:s,limit:a});return{query:o||null,entityType:i||null,entities:c.map(l=>({id:l.id,name:l.name,entityType:l.entityType,description:l.description??null,mentionCount:l.mentionCount??0}))}})}function Bp(e){e.register("traverseGraph",async t=>{let{findById:r}=await Promise.resolve().then(()=>(fe(),Dt)),{getEntityNeighborhood:n,findPath:o,findRelated:i}=await Promise.resolve().then(()=>($p(),Fp)),{startEntityId:a,action:s="neighbors",targetEntityId:c,relationType:l,maxDepth:d=2,limit:p=20}=t;if(!Number.isFinite(a)){let y=new Error("traverseGraph: startEntityId required");throw y.code="invalid_params",y}let f=await r(a);if(!f)return{ok:!1,notFound:!0,startEntityId:a};let h={id:f.id,name:f.name,entityType:f.entityType};if(s==="path"){if(!Number.isFinite(c)){let E=new Error("traverseGraph: targetEntityId required for action=path");throw E.code="invalid_params",E}let y=await o(f.id,c,{maxDepth:Math.min(d,4)});return{action:s,start:h,targetEntityId:c,path:y||null}}if(s==="related"){let y=await i(f.id,{maxDepth:Math.min(d,3),relationType:l,limit:p});return{action:s,start:h,related:y}}let w=await n(f.id,{depth:Math.min(d,3),limit:p});return{action:"neighbors",start:h,relations:w.relations||[],related:w.related||null}})}function Hp(e){e.register("getFactContext",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),P)),{findByUid:n}=await Promise.resolve().then(()=>(qe(),pr)),{getEntitiesForFact:o}=await Promise.resolve().then(()=>(Qe(),vi)),{getRelationsByFact:i}=await Promise.resolve().then(()=>(Xe(),Cn)),{uid:a,factId:s}=t;if(!a&&!Number.isFinite(s)){let f=new Error("getFactContext: provide uid or factId");throw f.code="invalid_params",f}let c;if(a?c=await n(a):c=await r("fact").where({id:s}).first(),!c)return{notFound:!0};let[l,d,p]=await Promise.all([o(c.id),i(c.id),c.sourceDocumentIds?.length?r("document").whereIn("id",c.sourceDocumentIds).select("id","title","sourceType"):[]]);return{fact:{id:c.id,uid:c.uid,content:c.content,category:c.category??null,confidence:c.confidence??null,status:c.status??null,sourceSection:c.sourceSection??null},entities:l.map(f=>({id:f.id,name:f.name,entityType:f.entityType})),relations:d,documents:p.map(f=>({id:f.id,title:f.title,sourceType:f.sourceType}))}})}function Up(e){e.register("getEntityContext",async t=>{let{findById:r,searchByName:n}=await Promise.resolve().then(()=>(fe(),Dt)),{listRelationsForEntity:o}=await Promise.resolve().then(()=>(Xe(),Cn)),{getFactsForEntity:i}=await Promise.resolve().then(()=>(Qe(),vi)),{entityId:a,name:s,namespace:c}=t;if(!Number.isFinite(a)&&!s){let f=new Error("getEntityContext: provide entityId or name");throw f.code="invalid_params",f}let l;if(Number.isFinite(a)?l=await r(a):l=(await n(s,{namespace:c,limit:1}))[0],!l)return{notFound:!0};let[d,p]=await Promise.all([o(l.id,{limit:30}),i(l.id,{limit:10})]);return{entity:{id:l.id,name:l.name,entityType:l.entityType,description:l.description??null,mentionCount:l.mentionCount??0},relations:d,facts:p.map(f=>({id:f.id,content:f.content,category:f.category??null,confidence:f.confidence??null}))}})}function Gp(e){e.register("getPod",async t=>{let{findByUid:r}=await Promise.resolve().then(()=>(ke(),Ze)),{listMembers:n}=await Promise.resolve().then(()=>(_r(),Ft)),{uid:o}=t;if(!o){let l=new Error("getPod: uid required");throw l.code="invalid_params",l}let i=await r(o);if(!i)return{notFound:!0,uid:o};let a=typeof i.attrs=="object"?i.attrs:iI(i.attrs),[s,c]=await Promise.all([n(i.id,{memberType:"fact",limit:20}),n(i.id,{memberType:"document",limit:10})]);return{pod:{id:i.id,uid:i.uid,name:i.name,podType:i.podType,namespace:i.namespace,status:i.status,startedAt:i.startedAt??null,endedAt:i.endedAt??null,entityId:i.entityId??null,connectionId:i.connectionId??null,externalId:i.externalId??null,attrs:a},facts:s.map(l=>({id:l.id,content:l.content,podRole:l.podRole??null})),documents:c.map(l=>({id:l.id,title:l.title??null,sourcePath:l.sourcePath??null}))}})}function iI(e){if(!e)return{};try{return JSON.parse(e)}catch{return{}}}function jp(e){e.register("listPods",async t=>{let{listPods:r}=await Promise.resolve().then(()=>(ke(),Ze)),{type:n,namespace:o,status:i="active",limit:a=20}=t;return{pods:(await r({podType:n,namespace:o,status:i,limit:a})).map(c=>({id:c.id,uid:c.uid,name:c.name,podType:c.podType,memberFactCount:c.memberFactCount??0,memberDocCount:c.memberDocCount??0,updatedAt:c.updatedAt??null}))}})}function Jp(e){e.register("ingestDoc",async t=>{let{ingestDocument:r}=await Promise.resolve().then(()=>(Hi(),Bi)),{resolveSource:n}=await Promise.resolve().then(()=>(zp(),Vp)),{content:o,filePath:i,url:a,title:s,namespace:c,sourceType:l,skipFacts:d,skipEntities:p,metadata:f}=t,h=await n({content:o,filePath:i,url:a,title:s,sourceType:l});if(!h){let _=new Error("ingestDoc: provide content, filePath, or url");throw _.code="invalid_params",_}let w=await r({content:h.content,title:s||h.title,sourcePath:h.sourcePath,sourceType:l||h.sourceType,contentType:h.contentType,namespace:c,metadata:f||h.metadata,skipFacts:d,skipEntities:p}),y={skipped:!!w.skipped,title:w.title??null,documentId:w.documentId??null,chunkCount:w.chunkCount??0,facts:w.facts??null,entities:w.entities??null,output:w.md?.url??null},E=y.facts||{},{recordTrace:I}=await Promise.resolve().then(()=>(Me(),Pe));return I({kind:"ingest",summary:`ingest "${String(y.title||"document").slice(0,60)}" \u2192 ${y.chunkCount} chunks, +${E.added??0} facts${y.skipped?" (skipped)":""}`,namespace:c||null,detail:{op:"ingestDoc",title:y.title,documentId:y.documentId,skipped:y.skipped,route:w.route??null,chunkCount:y.chunkCount,counts:{added:E.added??0,updated:E.updated??0,skipped:E.skipped??0,contradicted:E.contradicted??0,total:E.total??0},verdicts:E.verdicts||[],entities:y.entities?{entityCount:y.entities.entityCount,relationCount:y.entities.relationCount,topics:y.entities.topics||[]}:null}}).catch(()=>{}),y})}function Xp(e){e.register("listFacts",async t=>{let{listFacts:r}=await Promise.resolve().then(()=>(qe(),pr)),{default:n}=await Promise.resolve().then(()=>(S(),q)),o=t.namespace||n.defaults.namespace,i=t.category||void 0,a=Number.isFinite(t.limit)?t.limit:20,s=await r({namespace:o,category:i,limit:a});return{namespace:o,category:i||null,facts:s.map(c=>({id:c.id,uid:c.uid,content:c.content,category:c.category??null,importance:c.importance??null,confidence:c.confidence??null}))}})}function Zp(e){e.register("forgetFact",async t=>{let{deleteFact:r}=await Promise.resolve().then(()=>(qe(),pr)),{default:n}=await Promise.resolve().then(()=>(A(),P)),o=String(t.id??"").trim();if(!o){let s=new Error("forgetFact: params.id required");throw s.code="invalid_params",s}let[i]=/^\d+$/.test(o)?await n("fact").where({id:Number(o)}).limit(1):await n("fact").where("uid","like",`${o}%`).limit(1);if(!i)return{notFound:!0,query:o};let a=await r(i.uid);return a?{deleted:{uid:a.uid,content:a.content}}:{notFound:!0,query:o}})}function Sm(e){e.register("refreshContext.fetch",async t=>{let{default:r}=await Promise.resolve().then(()=>(S(),q)),{getHotFacts:n}=await Promise.resolve().then(()=>(Tr(),vr)),o=t.namespace||r.defaults.namespace,i=Number.isFinite(t.limit)?t.limit:20,a=await n({namespace:o,limit:i});return{namespace:o,facts:a}}),e.register("refreshContext.explain",async t=>{let{default:r}=await Promise.resolve().then(()=>(S(),q)),n=t.namespace||r.defaults.namespace;await Promise.resolve().then(()=>(Mn(),np));let{activeKinds:o}=await Promise.resolve().then(()=>(Ir(),Jf)),{factsInPodsByRecency:i}=await Promise.resolve().then(()=>(Tr(),vr)),a={namespace:n,cwd:t.cwd||process.cwd()},s=await o(a),c=[];for(let{kind:l,scope:d}of s){let p,f=null;try{typeof l.fetchFacts=="function"?p=await l.fetchFacts(a,{slots:l.hotContextBudget,namespace:n}):p=await i(d,n,l.hotContextBudget)}catch(h){p=[],f=h.message}c.push({name:l.name,budget:l.hotContextBudget,visibility:l.visibility,error:f,facts:(p||[]).slice(0,l.hotContextBudget).map(h=>({content:typeof h=="string"?h:h.content||""}))})}return{mode:"explain",namespace:n,sections:c}}),e.register("refreshContext",async t=>{let{default:r}=await Promise.resolve().then(()=>(S(),q)),{getMemoryClient:n}=await Promise.resolve().then(()=>(Cr(),Nr)),o=t.namespace||r.defaults.namespace,i=Number.isFinite(t.limit)?t.limit:20,a=!!t.explain,s=await n();if(a)return s.call("refreshContext.explain",{namespace:o,cwd:t.cwd});let{facts:c}=await s.call("refreshContext.fetch",{namespace:o,limit:i}),{writeSnapshotToFile:l}=await Promise.resolve().then(()=>(Tr(),vr)),{writeSharedInstructions:d}=await Promise.resolve().then(()=>(bm(),xm));await d();let p=await l({facts:c,namespace:o});return{mode:"write",namespace:o,count:p}})}it();tt();import XI from"pg";function vm(e){e.register("testDbConnection",async t=>{if(t.url)return ea(t.url);let r;try{r=se({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}})}catch(i){return{ok:!1,stage:"parse",error:i.message}}let n=new XI.Client(r),o=Date.now();try{await n.connect()}catch(i){return{ok:!1,stage:"connect",provider:"local",error:i.message,code:i.code}}try{let i=await n.query("SELECT current_database() AS db, version() AS version"),a=await n.query("SELECT extname FROM pg_extension WHERE extname = 'vector'");return{ok:!0,provider:"local",connectMs:Date.now()-o,database:i.rows[0].db,serverVersion:i.rows[0].version,pgvector:a.rowCount>0}}catch(i){return{ok:!1,stage:"query",provider:"local",error:i.message,code:i.code}}finally{try{await n.end()}catch{}}})}L();it();at();import ZI from"knex";function Tm(e){e.register("runMigrations",async(t={})=>{if(t.url||t.host){let i;if(t.url){let s=t.url;if(jr(t.url)){let c=po(t.url);if(!c)throw new Error("This is a connection-pooler URL. Migrations need the direct connection \u2014 paste your non-pooled connection string.");s=c}i=ce(s)}else i=se({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}});let a=ZI({client:"pg",connection:i,pool:{min:1,max:2}});try{let[s,c]=await a.migrate.latest({directory:nt});return{batchNo:s,ran:c,against:t.url?"url":"fields"}}finally{await a.destroy()}}let{default:r}=await Promise.resolve().then(()=>(A(),P)),[n,o]=await r.migrate.latest({directory:nt});return{batchNo:n,ran:o,against:"daemon-pool"}})}it();at();import QI from"pg";function Om(e){e.register("ensurePgvector",async(t={})=>{let r,n="local";try{if(t.url)r=ce(t.url),n=be(t.url);else if(t.host)r=se({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}});else{let{default:i}=await Promise.resolve().then(()=>(S(),q)),{selectDriver:a}=await Promise.resolve().then(()=>(Wr(),ho)),s=a(i);r=s.connection,n=s.provider}}catch(i){return{ok:!1,stage:"parse",error:i.message}}let o=new QI.Client(r);try{await o.connect()}catch(i){return{ok:!1,stage:"connect",provider:n,error:i.message,code:i.code}}try{await o.query("CREATE EXTENSION IF NOT EXISTS vector");let i=await o.query("SELECT extname, extversion FROM pg_extension WHERE extname = 'vector'");return{ok:!0,provider:n,installed:i.rowCount>0,version:i.rows[0]?.extversion??null}}catch(i){return{ok:!1,stage:"extension",provider:n,error:i.message,code:i.code}}finally{try{await o.end()}catch{}}})}L();import{existsSync as iv,readFileSync as av,writeFileSync as sv,mkdirSync as cv}from"node:fs";import{dirname as lv}from"node:path";var Cm=[{id:"claude-cli",label:"Claude Code",hint:"Uses your existing Claude Code subscription \u2014 no extra API key.",recommended:!0,fields:[],env:{LLM_PROVIDER:"claude-cli"}},{id:"openrouter",label:"OpenRouter",hint:"One API key for many models (Anthropic, OpenAI, Gemini, \u2026). Cheapest default.",fields:[{name:"OPENROUTER_API_KEY",label:"OpenRouter API key",type:"password",placeholder:"sk-or-\u2026"},{name:"LLM_OPENROUTER_MODEL",label:"Model (optional)",type:"text",placeholder:"google/gemini-flash-latest",optional:!0}],env:{LLM_PROVIDER:"openrouter"}},{id:"openai",label:"OpenAI",hint:"Direct OpenAI access. Requires sk-\u2026 key with chat + embeddings.",fields:[{name:"OPENAI_API_KEY",label:"OpenAI API key",type:"password",placeholder:"sk-\u2026"},{name:"LLM_OPENAI_MODEL",label:"Model (optional)",type:"text",placeholder:"gpt-4o-mini",optional:!0}],env:{LLM_PROVIDER:"openai"}},{id:"anthropic",label:"Anthropic",hint:"Direct Anthropic API access.",fields:[{name:"ANTHROPIC_API_KEY",label:"Anthropic API key",type:"password",placeholder:"sk-ant-\u2026"}],env:{LLM_PROVIDER:"anthropic"}},{id:"ollama",label:"Ollama",hint:"Local Ollama install. Free + private but slower on small machines.",fields:[{name:"LLM_OLLAMA_HOST",label:"Ollama host",type:"text",placeholder:"http://localhost:11434"},{name:"LLM_OLLAMA_MODEL",label:"Model",type:"text",placeholder:"qwen2.5:7b"}],env:{LLM_PROVIDER:"ollama"}}],na=[{id:"openai",label:"OpenAI",hint:"text-embedding-3-large @ 1024 dimensions. Best out-of-the-box quality.",recommended:!0,fields:[{name:"OPENAI_API_KEY",label:"OpenAI API key",type:"password",placeholder:"sk-\u2026",sharedWith:"llm"}],env:{EMBEDDING_PROVIDER:"openai",EMBEDDING_MODEL:"text-embedding-3-large",EMBEDDING_DIMENSIONS:"1024"}},{id:"ollama",label:"Ollama (nomic-embed-text)",hint:"768-dim local embeddings. Free, no key. Lower retrieval quality than OpenAI.",fields:[{name:"OLLAMA_HOST",label:"Ollama host",type:"text",placeholder:"http://localhost:11434"}],env:{EMBEDDING_PROVIDER:"ollama",EMBEDDING_MODEL:"nomic-embed-text",EMBEDDING_DIMENSIONS:"768"}},{id:"openrouter",label:"OpenRouter",hint:"Uses OpenRouter as an embedding gateway. Reuses your LLM key.",fields:[{name:"OPENROUTER_API_KEY",label:"OpenRouter API key",type:"password",placeholder:"sk-or-\u2026",sharedWith:"llm"}],env:{EMBEDDING_PROVIDER:"openrouter",EMBEDDING_MODEL:"openai/text-embedding-3-large",EMBEDDING_DIMENSIONS:"1024"}}];function ia(){if(!iv(j))return{};let e=av(j,"utf8"),t={};for(let r of e.split(`
634
+ `)){let n=r.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/i);if(!n)continue;let o=n[2].trim();t[n[1]]=o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o.slice(1,-1):o}return t}function oa(e){let r={...ia(),...e};for(let i of Object.keys(e))(e[i]===null||e[i]===void 0)&&delete r[i];cv(lv(j),{recursive:!0});let n=`# Sigil \u2014 updated ${new Date().toISOString().slice(0,10)}
635
+ `,o=Object.entries(r).map(([i,a])=>`${i}=${/[\s#"']/.test(String(a))?`"${String(a).replace(/"/g,'\\"')}"`:a}`).join(`
636
+ `);sv(j,n+o+`
637
+ `,"utf8")}function Rm(e){e.register("onboardingState",async()=>{let t=ia(),r=!!(t.SIGIL_DATABASE_URL||t.SIGIL_DB_HOST),n=!!t.LLM_PROVIDER,o=!!t.EMBEDDING_PROVIDER,i=t.SIGIL_SETUP_COMPLETE==="true",a=!1,s=!1,c=0;if(r)try{let{default:l}=await Promise.resolve().then(()=>(A(),P));await l.raw("SELECT 1"),s=(await l.raw("SELECT extname FROM pg_extension WHERE extname = 'vector'")).rows.length>0;let[p]=await l("knex_migrations").count("* as n").catch(()=>[{n:0}]);c=Number(p?.n??0),a=s&&c>0}catch{}return{setupComplete:i,env:{llmProvider:t.LLM_PROVIDER||null,embeddingProvider:t.EMBEDDING_PROVIDER||null,embeddingModel:t.EMBEDDING_MODEL||null,embeddingDim:t.EMBEDDING_DIMENSIONS||null,hasDatabaseUrl:!!t.SIGIL_DATABASE_URL,hasDiscreteDb:!!t.SIGIL_DB_HOST},steps:{database:{done:a,configured:r,pgvector:s,migrationsRan:c},llm:{done:n,provider:t.LLM_PROVIDER||null},embedding:{done:o,provider:t.EMBEDDING_PROVIDER||null}}}}),e.register("listLlmProviders",async()=>({providers:Cm})),e.register("listEmbeddingProviders",async()=>({providers:na})),e.register("configureLlm",async t=>{let r=Cm.find(o=>o.id===t.id);if(!r){let o=new Error(`unknown llm provider: ${t.id}`);throw o.code="invalid_params",o}let n={...r.env};for(let o of r.fields)o.optional&&!t[o.name]||(n[o.name]=t[o.name]);return oa(n),{ok:!0,provider:r.id,keysWritten:Object.keys(n)}}),e.register("configureEmbedding",async t=>{let r=na.find(o=>o.id===t.id);if(!r){let o=new Error(`unknown embedding provider: ${t.id}`);throw o.code="invalid_params",o}let n={...r.env};for(let o of r.fields)o.optional&&!t[o.name]||o.sharedWith==="llm"&&!t[o.name]&&ia()[o.name]||(n[o.name]=t[o.name]);return oa(n),{ok:!0,provider:r.id,keysWritten:Object.keys(n)}}),e.register("inspectEmbeddingCompat",async(t={})=>{let r=t.id?na.find(i=>i.id===t.id):null,n=Number(t.targetDim??r?.env?.EMBEDDING_DIMENSIONS??0);if(!n){let i=new Error("inspectEmbeddingCompat: need a provider id or targetDim");throw i.code="invalid_params",i}let o;try{if(t.url){let{buildUrlConnection:i}=await Promise.resolve().then(()=>(at(),es));o=i(t.url)}else if(t.host){let{buildLocalConnection:i}=await Promise.resolve().then(()=>(it(),Za));o=i({db:{host:t.host,port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}})}else{let{default:i}=await Promise.resolve().then(()=>(S(),q)),{selectDriver:a}=await Promise.resolve().then(()=>(Wr(),ho));o=a(i).connection}}catch(i){let{diagnoseError:a}=await Promise.resolve().then(()=>(tt(),Wt)),s=a(i);return{ok:!1,error:s.humanMessage,kind:s.kind,fixHint:s.fixHint}}try{let{inspectSchemaDims:i,diagnoseConflict:a}=await Promise.resolve().then(()=>(ra(),ta)),s=await i(o);return{ok:!0,...a({targetDim:n,schema:s}),schema:s}}catch(i){let{diagnoseError:a}=await Promise.resolve().then(()=>(tt(),Wt)),s=a(i);return{ok:!1,error:s.humanMessage,kind:s.kind,fixHint:s.fixHint}}}),e.register("wipeEmbeddingData",async(t={})=>{if(t.confirm!==!0){let r=new Error("wipeEmbeddingData: refusing without confirm:true");throw r.code="invalid_params",r}try{let{default:r}=await Promise.resolve().then(()=>(A(),P)),{EMBEDDING_TABLES:n}=await Promise.resolve().then(()=>(ra(),ta));return await r.raw(`TRUNCATE ${n.join(", ")} RESTART IDENTITY CASCADE`),{ok:!0,truncated:n}}catch(r){let{diagnoseError:n}=await Promise.resolve().then(()=>(tt(),Wt)),o=n(r);return{ok:!1,error:o.humanMessage,kind:o.kind,fixHint:o.fixHint}}}),e.register("markOnboardingComplete",async()=>(oa({SIGIL_SETUP_COMPLETE:"true"}),setTimeout(()=>process.exit(0),250),{ok:!0,restarting:!0})),e.register("restartDaemon",async()=>(setTimeout(()=>process.exit(0),250),{ok:!0,restarting:!0})),e.register("testLlm",async()=>{try{let{prompt:t}=await Promise.resolve().then(()=>(ee(),Ls));return{ok:!0,response:(await t("Reply with the single word: ok",{caller:"onboarding-test"})).slice(0,200)}}catch(t){let{diagnoseError:r}=await Promise.resolve().then(()=>(tt(),Wt)),n=r(t);return{ok:!1,error:n.humanMessage,kind:n.kind,fixHint:n.fixHint}}}),e.register("testEmbedding",async()=>{try{let{embed:t}=await Promise.resolve().then(()=>(ct(),Rs)),r=await t("Sigil onboarding test");return!Array.isArray(r)||r.length===0?{ok:!1,error:"The embedder returned an empty vector.",kind:"other"}:{ok:!0,dim:r.length}}catch(t){let{diagnoseError:r}=await Promise.resolve().then(()=>(tt(),Wt)),n=r(t);return{ok:!1,error:n.humanMessage,kind:n.kind,fixHint:n.fixHint}}})}L();import{existsSync as Dm}from"node:fs";import{readFile as Lm,writeFile as uv,mkdir as dv}from"node:fs/promises";import{dirname as fv}from"node:path";var pv=/(KEY|PASSWORD|TOKEN|SECRET)$/i;function Pm(e){e.register("readEnv",async()=>{let t=Dm(j)?await Lm(j,"utf8"):"",r=mv(t),n={};for(let[o,i]of Object.entries(r))pv.test(o)?n[o]={masked:!0,hasValue:!!i}:n[o]={masked:!1,value:i};return{path:j,entries:n}}),e.register("writeEnv",async t=>{let r=t.patch||{};if(typeof r!="object"||Array.isArray(r)){let a=new Error("writeEnv: params.patch must be an object");throw a.code="invalid_params",a}let n=Dm(j)?await Lm(j,"utf8"):"",o=hv(n,r);await dv(fv(j),{recursive:!0}),await uv(j,o,"utf8");let i=["SIGIL_MODE","SIGIL_MASTER_NODE_ID","SIGIL_NETWORK_ENABLED"];if(Object.keys(r).some(a=>i.includes(a)))try{let{resetMemoryClient:a}=await Promise.resolve().then(()=>(Cr(),Nr));a()}catch{}return{ok:!0,path:j,patchedKeys:Object.keys(r)}})}function mv(e){let t={};for(let r of e.split(`
638
+ `)){let n=r.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/i);if(!n)continue;let o=n[1],i=n[2].trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),t[o]=i}return t}function hv(e,t){let r=new Set,o=e.split(`
639
+ `).map(a=>{let s=a.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=/i);if(!s)return a;let c=s[1];if(!(c in t))return a;r.add(c);let l=t[c];return l==null?null:`${c}=${km(l)}`}).filter(a=>a!==null);for(let[a,s]of Object.entries(t))r.has(a)||s===null||s===void 0||o.push(`${a}=${km(s)}`);let i=o.join(`
640
+ `);return i.endsWith(`
641
+ `)||(i+=`
642
+ `),i}function km(e){let t=String(e);return/[\s#"'$]/.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function Mm(e){e.register("nodeInfo",async()=>{let{default:t}=await Promise.resolve().then(()=>(S(),q));if(!t.network.enabled)return{enabled:!1,mode:t.network.mode};let{getNodeInfo:r}=await Promise.resolve().then(()=>(Ee(),$e));try{let n=await r();return{enabled:!0,mode:t.network.mode,...n}}catch(n){return{enabled:!0,mode:t.network.mode,error:n.message}}})}la();import{randomBytes as Nv}from"node:crypto";var Cv=600;function Gm(e){e.register("pair.create",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),P)),n=(t.name||"").trim();if(!n){let p=new Error("pair.create: params.name required");throw p.code="invalid_params",p}let o=t.role||"writer";if(!["reader","writer","admin"].includes(o)){let p=new Error(`pair.create: invalid role "${o}"`);throw p.code="invalid_params",p}let i=Array.isArray(t.namespaces)?t.namespaces:[],a=Number.isFinite(t.ttlSeconds)?t.ttlSeconds:Cv,s=new Date(Date.now()+a*1e3);r("pairing_code").whereNull("consumed_by_device_id").where("expires_at","<",new Date(Date.now()-24*3600*1e3)).del().catch(()=>{});let c=Rv();await r("pairing_code").insert({code_hash:Kn(c),name:n,role:o,namespaces:i,expires_at:s});let{getNodeInfo:l}=await Promise.resolve().then(()=>(Ee(),$e)),d=null;try{d=(await l()).nodeId}catch{}return{code:c,expiresAt:s.toISOString(),name:n,role:o,namespaces:i,masterNodeId:d}}),e.register("pair.list",async(t={})=>{let{default:r}=await Promise.resolve().then(()=>(A(),P)),n=Math.min(Math.max(Number(t.limit)||50,1),200),o=Math.max(Number(t.offset)||0,0),i=await r("pairing_code").leftJoin("device","pairing_code.consumed_by_device_id","device.id").select("pairing_code.id","pairing_code.name","pairing_code.role","pairing_code.namespaces","pairing_code.expires_at","pairing_code.consumed_at","pairing_code.created_at","device.name as consumed_by_name","device.node_id as consumed_by_node_id").orderBy("pairing_code.created_at","desc").limit(n).offset(o);return{limit:n,offset:o,codes:i.map(a=>({id:a.id,name:a.name,role:a.role,namespaces:a.namespaces,expiresAt:a.expiresAt,consumedAt:a.consumedAt,consumedBy:a.consumedByName?{name:a.consumedByName,nodeId:a.consumedByNodeId}:null,expired:new Date(a.expiresAt)<new Date}))}}),e.register("pair.sweep",async()=>{let{default:t}=await Promise.resolve().then(()=>(A(),P)),r=new Date(Date.now()-24*3600*1e3);return{deleted:await t("pairing_code").whereNull("consumed_by_device_id").where("expires_at","<",r).del()}}),e.register("pair.revoke",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),P)),n=Number(t.id);if(!Number.isFinite(n)){let i=new Error("pair.revoke: params.id required");throw i.code="invalid_params",i}return{deleted:await r("pairing_code").where({id:n}).del()}})}function Rv(){let e="ABCDEFGHJKLMNPQRSTUVWXYZ23456789",t=Nv(8),r="";for(let n=0;n<8;n++)r+=e[t[n]%e.length];return`SIGIL-${r.slice(0,4)}-${r.slice(4,8)}`}function jm(e){e.register("mode",async()=>{let{default:t}=await Promise.resolve().then(()=>(S(),q)),{getMemoryClient:r}=await Promise.resolve().then(()=>(Cr(),Nr)),n="unknown",o=null;try{n=(await r()).kind}catch(i){o=i.message}return{mode:t.network.mode,networkEnabled:t.network.enabled,masterNodeId:t.network.masterNodeId,memoryClient:n,memoryClientError:o}})}function Wm(e){e.register("manifest.get",async()=>{let{produceManifest:t}=await Promise.resolve().then(()=>(Yn(),Wn));return t()}),e.register("manifest.verify",async t=>{let{produceManifest:r,verifyManifest:n}=await Promise.resolve().then(()=>(Yn(),Wn)),o=await r();return n(o,t.remote)})}var Ym=new Set(["paused","compromised"]);function Km(e){e.register("device.list",async(t={})=>{let{default:r}=await Promise.resolve().then(()=>(A(),P)),n=Math.min(Math.max(Number(t.limit)||100,1),500),o=Math.max(Number(t.offset)||0,0),i=await r("device").select("id","node_id","name","role","namespaces","active","meta","last_seen_at","created_at","revoked_reason").orderBy("created_at","desc").limit(n).offset(o);return{limit:n,offset:o,devices:i.map(a=>({id:a.id,nodeId:a.nodeId,name:a.name,role:a.role,namespaces:a.namespaces,active:a.active,revokedReason:a.revokedReason??null,reactivatable:a.active||a.revokedReason!=="compromised",lastSeenAt:a.lastSeenAt,createdAt:a.createdAt,meta:a.meta}))}}),e.register("device.revoke",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),P)),n=Number(t.id);if(!Number.isFinite(n)){let s=new Error("device.revoke: params.id required");throw s.code="invalid_params",s}let o=t.reason||"paused";if(!Ym.has(o)){let s=new Error(`device.revoke: reason must be one of ${[...Ym].join(", ")}`);throw s.code="invalid_params",s}let i=await r("device").where({id:n}).first(),a=await r("device").where({id:n}).update({active:!1,revoked_reason:o});if(a>0&&i){let{default:s}=await Promise.resolve().then(()=>(ot(),Oa));s.emit("device.revoked",{deviceId:i.id,nodeId:i.nodeId,reason:o})}return{revoked:a>0,reason:o}}),e.register("device.activate",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),P)),n=Number(t.id);if(!Number.isFinite(n)){let a=new Error("device.activate: params.id required");throw a.code="invalid_params",a}let o=await r("device").where({id:n}).first();if(!o)return{activated:!1,notFound:!0};if(o.revokedReason==="compromised"){let a=new Error(`device ${n} ("${o.name}") was revoked as compromised. Re-activation is blocked \u2014 the device must re-pair with a fresh code.`);throw a.code="compromised",a}return{activated:await r("device").where({id:n}).update({active:!0,revoked_reason:null})>0}})}function qm(e){e.register("trace.list",async(t={})=>{let{listTraces:r}=await Promise.resolve().then(()=>(Me(),Pe));return{traces:await r({kind:t.kind||null,namespace:t.namespace||null,before:t.before||null,limit:t.limit??50})}}),e.register("trace.get",async(t={})=>{if(!t.uid){let o=new Error("trace.get: params.uid is required");throw o.code="invalid_params",o}let{getTrace:r}=await Promise.resolve().then(()=>(Me(),Pe));return{trace:await r(t.uid)}}),e.register("trace.clear",async()=>{let{clearTraces:t}=await Promise.resolve().then(()=>(Me(),Pe));return t()})}function Vm(e,{startedAt:t}){Pa(e,{startedAt:t}),sp(e),Lp(e),kp(e),Pp(e),Bp(e),Hp(e),Up(e),Gp(e),jp(e),Jp(e),Xp(e),Zp(e),Sm(e),vm(e),Tm(e),Om(e),Rm(e),Pm(e),Mm(e),Gm(e),jm(e),Wm(e),Km(e),qm(e)}var Xm=Date.now();async function Fv({foreground:e=!1}={}){delete process.env.SIGIL_AGENT,await ba();let t=await _a();t&&(process.stderr.write(`[sigild] already running (pid ${t})
643
+ `),process.exit(0));let r=Bv();r(`starting (pid ${process.pid}, node ${process.version})`),await Ea();let n=Aa();ro(n),Vm(n,{startedAt:Xm});let o=await va({registry:n,log:r}),{default:i}=await Promise.resolve().then(()=>(S(),q));i.network.mode!=="lite-follower"&&$v(r);let a=null;if(i.http.enabled)try{a=await Da({registry:n,log:r,config:i})}catch(c){r(`http server failed to start: ${c.message}`)}let s=!1;if(i.network.enabled)try{if(i.network.mode==="master"){let{registerProtocol:d}=await Promise.resolve().then(()=>(Ee(),$e)),{PAIR_ALPN:p,createPairAcceptor:f}=await Promise.resolve().then(()=>(la(),Um)),{RPC_ALPN:h,createRpcAcceptor:w}=await Promise.resolve().then(()=>(Zi(),lm));d(p,f({log:r})),d(h,w({registry:n,log:r})),r(`registered accept handlers: ${p}, ${h}`)}let{getNodeInfo:c}=await Promise.resolve().then(()=>(Ee(),$e)),l=await c();s=!0,r(`iroh node up: ${l.nodeId}`),l.relayUrl&&r(`iroh relay: ${l.relayUrl}`)}catch(c){r(`iroh failed to start: ${c.message}`)}else r(`iroh disabled (SIGIL_MODE=${i.network.mode})`);if(i.network.mode==="lite-follower")try{let{installLiteProxy:c}=await Promise.resolve().then(()=>(Jm(),zm));await c({registry:n,log:r})}catch(c){r(`lite-proxy install failed: ${c.message}`)}xa(async c=>{if(r(`received ${c}, shutting down`),await o.close(),a&&await a.close(),s)try{let{shutdownEndpoint:l}=await Promise.resolve().then(()=>(Ee(),$e));await l()}catch(l){r(`iroh shutdown failed: ${l.message}`)}try{let{default:l}=await Promise.resolve().then(()=>(A(),P));await l.destroy()}catch(l){r(`pool destroy failed: ${l.message}`)}await Zn(),oo(),r("stopped")}),r(`ready in ${Date.now()-Xm}ms \u2014 ${n.list().length} methods registered`),e&&process.stdout.write(`sigild ready
644
+ `)}async function $v(e){try{let{default:t}=await Promise.resolve().then(()=>(A(),P)),{setDbHealth:r}=await Promise.resolve().then(()=>(zt(),io));try{await t.raw("SELECT 1"),r({healthy:!0,error:null,checkedAt:Date.now()})}catch(n){r({healthy:!1,error:n.message,checkedAt:Date.now()}),e(`DB UNREACHABLE: ${n.message} \u2014 memory operations will fail until Postgres is back`)}}catch{}}function Bv(){let e;try{e=Pv(Vn,{flags:"a"})}catch{}return t=>{let r=`[${new Date().toISOString()}] ${t}
645
+ `;e?e.write(r):process.stderr.write(r)}}import.meta.url===`file://${process.argv[1]}`&&Fv({foreground:!0}).catch(async e=>{try{await Mv(Vn,`[fatal] ${e.stack||e.message}
646
+ `)}catch{}process.stderr.write(`[sigild] fatal: ${e.message}
647
+ `),process.exit(1)});export{Fv as startDaemon};