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