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