@anmol-srv/sigil 0.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +417 -0
- package/dist/cli.js +1019 -0
- package/dist/hooks/post-tool-use.js +70 -0
- package/dist/hooks/session-end.js +222 -0
- package/dist/hooks/stop.js +259 -0
- package/dist/hooks/user-prompt-submit.js +279 -0
- package/dist/server.js +573 -0
- package/integrations/hermes/README.md +41 -0
- package/integrations/hermes/plugin/README.md +72 -0
- package/integrations/hermes/plugin/__init__.py +353 -0
- package/integrations/hermes/plugin/plugin.yaml +10 -0
- package/knexfile.js +15 -0
- package/package.json +100 -0
- package/prompts/audm-decision.md +31 -0
- package/prompts/chunk-context.md +23 -0
- package/prompts/default-extraction.md +35 -0
- package/prompts/entity-extraction.md +37 -0
- package/prompts/input-classifier.md +23 -0
- package/prompts/query-router.md +18 -0
- package/src/db/migrations/20260310120000_create-cortex-document-table.cjs +21 -0
- package/src/db/migrations/20260310120001_create-cortex-chunk-table.cjs +37 -0
- package/src/db/migrations/20260310120002_create-cortex-fact-table.cjs +37 -0
- package/src/db/migrations/20260310120003_create-cortex-entity-table.cjs +26 -0
- package/src/db/migrations/20260310120004_create-cortex-relation-table.cjs +27 -0
- package/src/db/migrations/20260310120005_create-cortex-history-table.cjs +16 -0
- package/src/db/migrations/20260311120000_add-entity-namespace-and-relation-indexes.cjs +32 -0
- package/src/db/migrations/20260312120000_add-fact-entity-linking.cjs +22 -0
- package/src/db/migrations/20260313093130_create-api-key-table.cjs +15 -0
- package/src/db/migrations/20260313120000_add-entity-dedup-support.cjs +13 -0
- package/src/db/migrations/20260313150000_create-connector-tables.cjs +46 -0
- package/src/db/migrations/20260318120000_add-contextual-chunk-prefix.cjs +11 -0
- package/src/db/migrations/20260318120001_add-fact-temporal-validity.cjs +15 -0
- package/src/db/migrations/20260318120002_add-fact-importance.cjs +11 -0
- package/src/db/migrations/20260318120003_add-fact-access-tracking.cjs +13 -0
- package/src/db/migrations/20260405120000_add-unique-constraints.cjs +58 -0
- package/src/db/migrations/20260405140000_create-llm-log-table.cjs +21 -0
- package/src/db/migrations/20260424120000_split-fact-lifecycle.cjs +86 -0
- package/src/db/migrations/20260424120002_create-embedding-cache.cjs +26 -0
- package/src/db/migrations/20260429120000_halfvec-index-compression.cjs +34 -0
- package/src/db/migrations/20260429120100_create-hebbian-edge-table.cjs +37 -0
- package/src/db/migrations/20260429120200_upgrade-embedding-dim-1024.cjs +68 -0
- package/src/db/migrations/20260504120000_scope-document-source-path-uniqueness.cjs +45 -0
- package/src/db/migrations/20260508001733_add-entity-aliases.cjs +42 -0
- package/src/db/migrations/20260512120000_create-entity-hebbian-edge.cjs +42 -0
- package/src/db/migrations/20260512120000_create-pod-tables.cjs +71 -0
- package/src/db/migrations/20260512120100_create-pod-membership.cjs +50 -0
- package/src/db/migrations/20260512120200_add-document-source-metadata.cjs +32 -0
- package/src/db/migrations/20260514023428_rewrite-session-pods-and-add-fact-attribution-columns.cjs +86 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
var Yu=Object.defineProperty;var c=(t,e)=>()=>(t&&(e=t(t=0)),e);var A=(t,e)=>{for(var r in e)Yu(t,r,{get:e[r],enumerable:!0})};import{fileURLToPath as Ju}from"node:url";import{dirname as Yo,join as v}from"node:path";import{existsSync as Jo}from"node:fs";import{homedir as qu}from"node:os";function Vu(){let t=Yo(Ju(import.meta.url));for(let e=0;e<10;e++){if(Jo(v(t,"package.json"))&&Jo(v(t,"prompts")))return t;let r=Yo(t);if(r===t)break;t=r}return process.cwd()}var qo,q,Lx,Vo,z,Se,Nx,Xo,Xu,zo,Zo,Qo,tn,Rx,en,Dx,Mx,B=c(()=>{qo=Vu(),q=v(qo,"prompts"),Lx=v(qo,"src","db","migrations"),Vo=qu(),z=v(Vo,".sigil"),Se=v(z,".env"),Nx=v(z,"db"),Xo=v(z,"CLAUDE.md"),Xu=v(z,"schemas"),zo=v(z,".hook-errors.log"),Zo=v(z,".last-clean-doctor"),Qo=v(z,".active-session.json"),tn=v(z,".stop-cursor.json"),Rx=v(z,".hook-dedup.json"),en=v(Vo,".claude"),Dx=v(en,"settings.json"),Mx=v(en,"CLAUDE.md")});var Or={};A(Or,{default:()=>p});var C,an,Zu,p,_=c(()=>{C=(t,e)=>process.env[t]??e,an=C("SIGIL_DB_TYPE","postgres");if(an!=="postgres")throw new Error(`SIGIL_DB_TYPE=${an} is no longer supported. Sigil 0.10.0+ is Postgres-only.
|
|
3
|
+
PGlite was deprecated; existing PGlite data at ~/.sigil/db is preserved but unreachable from this version.
|
|
4
|
+
Set SIGIL_DB_TYPE=postgres in ~/.sigil/.env and configure SIGIL_DB_HOST / PORT / NAME / USER / PASSWORD.
|
|
5
|
+
Run \`sigil init\` for an interactive setup.`);Zu={db:{type:"postgres",host:C("SIGIL_DB_HOST","localhost"),port:Number(C("SIGIL_DB_PORT",5432)),database:C("SIGIL_DB_NAME","sigil"),user:C("SIGIL_DB_USER","sigil_app"),password:C("SIGIL_DB_PASSWORD","")},embedding:{provider:process.env.EMBEDDING_PROVIDER||"",model:process.env.EMBEDDING_MODEL||"nomic-embed-text",dimensions:Number(process.env.EMBEDDING_DIMENSIONS)||768,ollamaHost:process.env.OLLAMA_HOST||"http://localhost:11434",openaiApiKey:process.env.OPENAI_API_KEY||"",voyageApiKey:process.env.VOYAGE_API_KEY||"",openrouterApiKey:process.env.OPENROUTER_API_KEY||"",openrouterBaseUrl:process.env.EMBEDDING_OPENROUTER_BASE_URL||process.env.LLM_OPENROUTER_BASE_URL||"",openrouterReferer:process.env.EMBEDDING_OPENROUTER_REFERER||process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil",openrouterTitle:process.env.EMBEDDING_OPENROUTER_TITLE||process.env.LLM_OPENROUTER_TITLE||"Sigil"},llm:{provider:process.env.LLM_PROVIDER||"",openaiApiKey:process.env.OPENAI_API_KEY||"",openaiModel:process.env.LLM_OPENAI_MODEL||"gpt-4o-mini",ollamaHost:process.env.LLM_OLLAMA_HOST||process.env.OLLAMA_HOST||"http://localhost:11434",ollamaModel:process.env.LLM_OLLAMA_MODEL||"qwen2.5:7b",cliModel:process.env.LLM_CLI_MODEL||"haiku",apiKey:process.env.ANTHROPIC_API_KEY||"",openrouterApiKey:process.env.OPENROUTER_API_KEY||"",openrouterModel:process.env.LLM_OPENROUTER_MODEL||"google/gemini-flash-latest",openrouterBaseUrl:process.env.LLM_OPENROUTER_BASE_URL||"",openrouterReferer:process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil",openrouterTitle:process.env.LLM_OPENROUTER_TITLE||"Sigil",extractionModel:process.env.LLM_EXTRACTION_MODEL||"",decisionModel:process.env.LLM_DECISION_MODEL||"",entityModel:process.env.LLM_ENTITY_MODEL||"",maxRetries:Number(process.env.LLM_MAX_RETRIES)||3,cliTimeout:Number(process.env.LLM_CLI_TIMEOUT)||12e4},output:{storage:process.env.OUTPUT_STORAGE||"local",dir:process.env.OUTPUT_DIR||"./output",s3:{endpoint:process.env.S3_ENDPOINT||"",bucket:process.env.S3_BUCKET||"",region:process.env.S3_REGION||"us-east-1",accessKey:process.env.S3_ACCESS_KEY||"",secretKey:process.env.S3_SECRET_KEY||"",publicUrl:process.env.S3_PUBLIC_URL||""}},server:{port:Number(process.env.PORT)||4e3,host:process.env.HOST||"0.0.0.0",logLevel:process.env.LOG_LEVEL||"info"},defaults:{namespace:process.env.DEFAULT_NAMESPACE||"default"},memory:{skipThreshold:Number(process.env.MEMORY_SKIP_THRESHOLD)||.88,ambiguousThreshold:Number(process.env.MEMORY_AMBIGUOUS_THRESHOLD)||.78,minFactSimilarity:Number(process.env.MEMORY_MIN_FACT_SIMILARITY)||.45},search:{synthesize:C("SIGIL_SYNTHESIZE","true")!=="false",synthesizeModel:C("SIGIL_SYNTH_MODEL","")},ingest:{eagerExtract:C("SIGIL_EAGER_EXTRACT","true")!=="false"},hebbian:{entity:{enabled:C("SIGIL_HEBBIAN_ENTITY_ENABLED",null,"true")!=="false",eta:Number(C("SIGIL_HEBBIAN_ENTITY_ETA",null,1)),cap:Number(C("SIGIL_HEBBIAN_ENTITY_CAP",null,50)),halfLifeDays:Number(C("SIGIL_HEBBIAN_ENTITY_HALF_LIFE_DAYS",null,30)),minEffective:Number(C("SIGIL_HEBBIAN_ENTITY_MIN_EFFECTIVE",null,.5)),rrfWeight:Number(C("SIGIL_HEBBIAN_ENTITY_RRF_WEIGHT",null,.3)),maxWriteEntities:Number(C("SIGIL_HEBBIAN_ENTITY_MAX_WRITE",null,12)),expandPerSeed:Number(C("SIGIL_HEBBIAN_ENTITY_EXPAND_PER_SEED",null,3))}}},p=Zu});var vr={};A(vr,{default:()=>m});import Qu from"knex";function el(t){return Array.isArray(t)?t.map(Ir):t&&typeof t=="object"?Ir(t):t}function rl(t,e){return e(ol(t))}function Ir(t){if(!t||typeof t!="object"||t instanceof Date)return t;if(Array.isArray(t))return t.map(Ir);let e={};for(let[r,o]of Object.entries(t))e[r.replace(/_([a-z])/g,(n,a)=>a.toUpperCase())]=o;return e}function ol(t){return t.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}var tl,m,S=c(()=>{_();tl=Qu({client:"pg",connection:{host:p.db.host,port:p.db.port,database:p.db.database,user:p.db.user,password:p.db.password},pool:{min:2,max:10},postProcessResponse:el,wrapIdentifier:rl});m=tl});var ln={};A(ln,{validateConfig:()=>un,validateConfigDeep:()=>nl});function un(){let t=[];return al(t),il(t),sl(t),t}async function nl(){let t=un();if(p.db.type==="postgres"&&!t.some(e=>e.code.startsWith("DB_")))try{await(await Promise.resolve().then(()=>(S(),vr))).default.raw("SELECT 1")}catch(e){t.push({level:"fail",code:"DB_UNREACHABLE",message:`Postgres at ${p.db.host}:${p.db.port}/${p.db.database} unreachable: ${e.message.split(`
|
|
6
|
+
`)[0]}`,fix:"Start Postgres (e.g. `docker start sigil-pg` or your equivalent) and verify SIGIL_DB_HOST/PORT/NAME/USER/PASSWORD in ~/.sigil/.env"})}return t}function al(t){let{provider:e,model:r}=p.embedding;if(e&&r){let o=Object.keys(sn).find(n=>sn[n].some(a=>a.test(r)));o&&o!==e&&t.push({level:"fail",code:"EMBEDDING_PROVIDER_MODEL_MISMATCH",message:`EMBEDDING_PROVIDER=${e} but EMBEDDING_MODEL=${r} is a ${o} model.`,fix:cl(e,r,o)})}if(e&&fn[e]){let o=fn[e];p.embedding[o]||t.push({level:"fail",code:"EMBEDDING_PROVIDER_MISSING_KEY",message:`EMBEDDING_PROVIDER=${e} but no ${Te(o)} found.`,fix:`Set ${Te(o)} in ~/.sigil/.env, or run 'sigil init' to reconfigure.`})}}function il(t){let{provider:e}=p.llm;if(e&&cn[e]){let r=cn[e];p.llm[r]||t.push({level:"fail",code:"LLM_PROVIDER_MISSING_KEY",message:`LLM_PROVIDER=${e} but no ${Te(r)} found.`,fix:`Set ${Te(r)} in ~/.sigil/.env, or run 'sigil init' to reconfigure.`})}e==="openrouter"&&p.llm.openrouterModel&&(p.llm.openrouterModel.includes("/")||t.push({level:"warn",code:"OPENROUTER_MODEL_FORMAT",message:`LLM_OPENROUTER_MODEL=${p.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 sl(t){p.db.type==="postgres"&&(!p.db.host||!p.db.database||!p.db.user)&&t.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 Te(t){return{openaiApiKey:"OPENAI_API_KEY",apiKey:"ANTHROPIC_API_KEY",openrouterApiKey:"OPENROUTER_API_KEY",voyageApiKey:"VOYAGE_API_KEY"}[t]||t}function cl(t,e,r){let o={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"}[t]||"(see provider docs)";return`Either set EMBEDDING_PROVIDER=${r} (matches your current model), or change EMBEDDING_MODEL to one of: ${o}`}var sn,cn,fn,pn=c(()=>{_();sn={voyage:[/^voyage-/],openai:[/^text-embedding-/],ollama:[/^nomic-embed/,/^mxbai-embed/,/^all-minilm/,/^bge-/,/^snowflake-/,/^granite-embedding/]},cn={openai:"openaiApiKey",anthropic:"apiKey",openrouter:"openrouterApiKey"},fn={openai:"openaiApiKey",voyage:"voyageApiKey",openrouter:"openrouterApiKey"}});var Pr={};A(Pr,{HOOK_ERROR_LOG:()=>Oe,LAST_CLEAN_DOCTOR_PATH:()=>Ie,clearLastCleanDoctor:()=>gl,failClosedOnBadConfig:()=>dl,getUnackedErrorCount:()=>hl,markDoctorClean:()=>yl,readRecentHookErrors:()=>ml,recordHookError:()=>dn});import{appendFile as fl,readFile as Cr,writeFile as ul,unlink as ll}from"node:fs/promises";import{createHash as pl}from"node:crypto";async function dn(t,e,r=null){try{let o={ts:new Date().toISOString(),hook:t,error:e?.message||String(e),input_hash:r?wl(r):null};await fl(Oe,JSON.stringify(o)+`
|
|
7
|
+
`,"utf8")}catch{}}async function dl(t,e=null){try{let{validateConfig:r}=await Promise.resolve().then(()=>(pn(),ln)),o=r().filter(n=>n.level==="fail");if(o.length===0)return!1;for(let n of o){let a=new Error(`${n.code}: ${n.message} \u2014 fix: ${n.fix}`);await dn(t,a,e)}return!0}catch{return!1}}async function ml(t=10){let e;try{e=await Cr(Oe,"utf8")}catch{return[]}let r=e.split(`
|
|
8
|
+
`).filter(Boolean),o=[];for(let n of r.slice(-t))try{o.push(JSON.parse(n))}catch{}return o}async function hl(){let t=0;try{let o=await Cr(Ie,"utf8");t=new Date(o.trim()).getTime()}catch{}let e;try{e=await Cr(Oe,"utf8")}catch{return 0}let r=0;for(let o of e.split(`
|
|
9
|
+
`))if(o.trim())try{let n=JSON.parse(o);(n.ts?new Date(n.ts).getTime():0)>t&&(r+=1)}catch{}return r}async function yl(){try{await ul(Ie,new Date().toISOString(),"utf8")}catch{}}async function gl(){try{await ll(Ie)}catch{}}function wl(t){try{let e=typeof t=="string"?t:JSON.stringify(t);return pl("sha256").update(e).digest("hex").slice(0,12)}catch{return null}}var Oe,Ie,Lr=c(()=>{B();Oe=zo,Ie=Zo});var mn,hn=c(()=>{mn="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"});import{webcrypto as yn}from"node:crypto";function _l(t){!mt||mt.length<t?(mt=Buffer.allocUnsafe(t*xl),yn.getRandomValues(mt),bt=0):bt+t>mt.length&&(yn.getRandomValues(mt),bt=0),bt+=t}function rt(t=21){_l(t|=0);let e="";for(let r=bt-t;r<bt;r++)e+=mn[mt[r]&63];return e}var xl,mt,bt,Zt=c(()=>{hn();xl=128});async function Qt({podType:t,externalId:e,name:r,namespace:o,attrs:n={},entityId:a=null,connectionId:i=null,startedAt:s=null}){if(!e)throw new Error("upsertPod requires externalId; use insertPod for custom pods");let f=`pod-${rt(16)}`,u=o||p.defaults.namespace,{rows:[l]}=await m.raw(`
|
|
10
|
+
INSERT INTO pod (uid, pod_type, name, namespace, attrs, entity_id, connection_id, external_id, started_at, created_at, updated_at)
|
|
11
|
+
VALUES (?, ?, ?, ?, ?::jsonb, ?, ?, ?, ?, NOW(), NOW())
|
|
12
|
+
ON CONFLICT (pod_type, external_id, namespace) WHERE external_id IS NOT NULL DO UPDATE SET
|
|
13
|
+
attrs = pod.attrs || EXCLUDED.attrs,
|
|
14
|
+
updated_at = NOW()
|
|
15
|
+
RETURNING *, (xmax = 0) AS "isNew"
|
|
16
|
+
`,[f,t,r,u,JSON.stringify(n),a,i,e,s]);return{pod:l,isNew:l.isNew}}async function te(t){return m("pod").where({uid:t}).first()||null}async function ee({podType:t,externalId:e,namespace:r}){return m("pod").where({podType:t,externalId:e,namespace:r||p.defaults.namespace}).first()||null}async function ve(t,e){await m.raw("UPDATE pod SET attrs = attrs || ?::jsonb, updated_at = NOW() WHERE id = ?",[JSON.stringify(e),t])}async function gn(t,e=new Date){await m("pod").where({id:t}).update({endedAt:e,updatedAt:m.fn.now()})}async function re(t,{docs:e=0,facts:r=0}){!e&&!r||await m.raw(`UPDATE pod
|
|
17
|
+
SET member_doc_count = member_doc_count + ?,
|
|
18
|
+
member_fact_count = member_fact_count + ?,
|
|
19
|
+
updated_at = NOW()
|
|
20
|
+
WHERE id = ?`,[e,r,t])}var At=c(()=>{Zt();S();_()});function _n({sessionId:t,transcriptPath:e=null,cwd:r=null,turnCount:o=0,model:n=null,conclusion:a=null,summary:i=null}){return{session_id:t,transcript_path:e,cwd:r,turn_count:o,model:n,conclusion:a,summary:i}}function En({sessionId:t,startedAt:e=new Date}={}){let o=(e instanceof Date?e:new Date(e)).toISOString().replace("T"," ").slice(0,16),n=t?t.slice(0,8):"unknown";return`claude-session ${o} (${n})`}var wn,xn,Nr=c(()=>{St();wn="claude_session",xn={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 t=await Rr();return t?[t]:[]}catch{return[]}}}});var Le={};A(Le,{CURSOR_PATH:()=>Tt,endActiveSession:()=>Pl,ensureActiveSession:()=>Dr,getActiveCursor:()=>Cl,getActiveSessionPodUid:()=>Rr});import{writeFile as bl,readFile as Al,unlink as Sl}from"node:fs/promises";import{existsSync as Tl,mkdirSync as Ol}from"node:fs";import{dirname as bn}from"node:path";async function Pe(){try{let t=await Al(Tt,"utf8");return JSON.parse(t)}catch{return null}}async function An(t){Tl(bn(Tt))||Ol(bn(Tt),{recursive:!0}),await bl(Tt,JSON.stringify(t,null,2),"utf8")}async function Dr({sessionId:t,transcriptPath:e=null,cwd:r=null,model:o=null,namespace:n=null}){if(!t)throw new Error("ensureActiveSession requires sessionId from hook stdin");let a=n||p.defaults.namespace,i=await Pe();if(i&&i.session_id===t&&i.namespace===a){let u=await te(i.pod_uid);if(u)return await ve(u.id,{turn_count:(Ll(u.attrs)||0)+1}),await vl(i),u}let s=new Date,{pod:f}=await Qt({podType:wn,externalId:t,name:En({sessionId:t,startedAt:s}),namespace:a,attrs:_n({sessionId:t,transcriptPath:e,cwd:r,turnCount:1,model:o}),startedAt:s});return await An({session_id:t,pod_uid:f.uid,namespace:a,started_at:f.startedAt??s.toISOString(),last_seen_at:new Date().toISOString()}),f}async function vl(t){await An({...t,last_seen_at:new Date().toISOString()})}async function Rr({allowStale:t=!1}={}){let e=await Pe();return!e||!e.pod_uid||!t&&e.started_at&&Date.now()-new Date(e.started_at).getTime()>Il?null:e.pod_uid}async function Cl(){return Pe()}async function Pl({conclusion:t=null,summary:e=null}={}){let r=await Pe();if(!r)return null;let o=await te(r.pod_uid);if(o){if(t||e){let n={};t&&(n.conclusion=t),e&&(n.summary=e),await ve(o.id,n)}await gn(o.id)}try{await Sl(Tt)}catch{}return o}function Ll(t){if(!t)return 0;if(typeof t=="object")return t.turn_count??0;try{return JSON.parse(t).turn_count??0}catch{return 0}}var Tt,Il,St=c(()=>{At();Nr();_();B();Tt=Qo,Il=360*60*1e3});var ne={};A(ne,{attach:()=>Ne,attachDocument:()=>Mr,attachEntity:()=>Nl,attachFact:()=>oe,detach:()=>Rl,factIdsInPod:()=>kl,listMembers:()=>Dl,listPodsForMember:()=>Ml});async function Ne(t,e,r,o="primary"){let{rowCount:n}=await m.raw(`INSERT INTO pod_membership (pod_id, member_type, member_id, role)
|
|
21
|
+
VALUES (?, ?, ?, ?)
|
|
22
|
+
ON CONFLICT (pod_id, member_type, member_id) DO NOTHING`,[t,e,r,o]);return n>0&&(e==="fact"?await re(t,{facts:1}):e==="document"&&await re(t,{docs:1})),{attached:n>0}}async function Rl(t,e,r){let o=await m("pod_membership").where({podId:t,memberType:e,memberId:r}).del();return o>0&&(e==="fact"?await re(t,{facts:-1}):e==="document"&&await re(t,{docs:-1})),{detached:o>0}}async function Dl(t,{memberType:e,limit:r=20}={}){if(!e)throw new Error("listMembers requires a memberType filter");return m(`${e} as t`).join("pod_membership as pm",function(){this.on("pm.member_id","=","t.id").andOnVal("pm.member_type","=",e)}).where("pm.pod_id",t).orderBy("pm.createdAt","desc").limit(r).select("t.*","pm.role as podRole","pm.createdAt as attachedAt")}async function Ml(t,e){return m("pod as p").join("pod_membership as pm","pm.pod_id","p.id").where("pm.memberType",t).where("pm.memberId",e).select("p.*","pm.role as podRole")}async function kl(t){return await m("pod_membership").where({podId:t,memberType:"fact"}).pluck("memberId")}var oe,Mr,Nl,Re=c(()=>{S();At();oe=(t,e,r)=>Ne(t,"fact",e,r),Mr=(t,e,r)=>Ne(t,"document",e,r),Nl=(t,e,r)=>Ne(t,"entity",e,r)});var Tn={};A(Tn,{POD_TYPE:()=>Br,deriveProjectRoot:()=>Ur,ensureProjectPod:()=>$r,formatForDisplay:()=>$l,membership:()=>ne,projectKind:()=>Fr});import{execFileSync as Bl}from"node:child_process";import{basename as Sn}from"node:path";async function $r({cwd:t,namespace:e=null}){if(!t)return null;let r=Ur(t),o=e||p.defaults.namespace,a=(r!==t?!1:kr(t)===t)?r:kr(t),{pod:i}=await Qt({podType:Br,externalId:r,name:Sn(r)||r,namespace:o,attrs:{root_path:r,git_root:a||null,display_name:Sn(r)||r,discovered_at:new Date().toISOString()},startedAt:new Date});return i}function Ur(t){return kr(t)||t}function kr(t){try{return Bl("git",["rev-parse","--show-toplevel"],{cwd:t,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}async function Fl(){try{let{getActiveCursor:t}=await Promise.resolve().then(()=>(St(),Le));return(await t())?.cwd||null}catch{return null}}function $l(t){let e=Ul(t.attrs);return{uid:t.uid,name:t.name,rootPath:e.root_path,gitRoot:e.git_root,displayName:e.display_name,discoveredAt:e.discovered_at,memberFactCount:t.memberFactCount,memberDocCount:t.memberDocCount}}function Ul(t){if(!t)return{};if(typeof t=="object")return t;try{return JSON.parse(t)}catch{return{}}}var Br,Fr,De=c(()=>{At();Re();_();Br="project",Fr={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(t={})=>{let e=t.cwd||await Fl();if(!e)return[];try{let r=t.namespace||p.defaults.namespace,o=Ur(e),n=await ee({podType:Br,externalId:o,namespace:r});return n?[n.uid]:[]}catch{return[]}}}});var On={};A(On,{ensureActivePodsForHook:()=>Hl});async function Hl({sessionId:t,cwd:e=null,transcriptPath:r=null,model:o=null,namespace:n=null}){let a=null;if(t)try{a=await Dr({sessionId:t,transcriptPath:r,cwd:e,model:o,namespace:n})}catch{a=null}let i=null;if(e)try{i=await $r({cwd:e,namespace:n})}catch{i=null}let s=[a,i].filter(Boolean).map(f=>f.uid);return{sessionPod:a,projectPod:i,podUids:s}}var In=c(()=>{St();De()});var vn={};A(vn,{chat:()=>jl,meta:()=>Gl,setup:()=>Wl});async function jl(t,{model:e,jsonMode:r=!1}={}){let o=e||p.llm.openaiModel,n=[{role:"user",content:t}];r&&!t.toLowerCase().includes("json")&&n.unshift({role:"system",content:"Respond with valid JSON."});let a={model:o,messages:n};r&&(a.response_format={type:"json_object"});let i=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${p.llm.openaiApiKey}`},body:JSON.stringify(a)});if(!i.ok){let l=await i.text();throw new Error(`OpenAI error ${i.status}: ${l}`)}let s=await i.json(),f=s.choices[0].message.content.trim(),u=s.usage||{};return{text:f,inputTokens:u.prompt_tokens||0,outputTokens:u.completion_tokens||0,model:o}}async function Wl({existing:t,clack:e}){let r=t.OPENAI_API_KEY||"",o=await e.text({message:"OpenAI API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-proj-...",validate:n=>{if(!n&&!r)return"API key is required";if(n&&!n.startsWith("sk-"))return'OpenAI keys start with "sk-" \u2014 check paste'}});return e.isCancel(o)?null:{env:{OPENAI_API_KEY:o||r}}}var Gl,Cn=c(()=>{_();Gl={id:"openai",label:"OpenAI",hint:"gpt-4o-mini"}});function G(t){return Math.ceil((t||"").length/4)}function Hr(t,e,r){let o=Kl[t];return o?(e*o.input+r*o.output)/1e6:0}function ae({provider:t,model:e,caller:r,input:o,response:n,inputTokens:a,outputTokens:i,cost:s,durationMs:f,status:u,error:l}){m("llm_log").insert({provider:t,model:e,caller:r,input:o?.slice(0,1e4),response:n?.slice(0,1e4),inputTokens:a,outputTokens:i,cost:s,durationMs:f,status:u,error:l?.slice(0,2e3)}).catch(h=>console.error("[llm-log] Write failed:",h.message))}async function jr(t,e=3){for(let r=1;r<=e;r++)try{return await t()}catch(o){if(r===e)throw o;let n=Math.min(1e3*2**(r-1),1e4);await new Promise(a=>setTimeout(a,n))}}var Kl,ie=c(()=>{S();Kl={"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 Pn={};A(Pn,{chat:()=>Jl,meta:()=>ql,setup:()=>Vl});async function Yl(){if(!Gr){let{default:t}=await import("@anthropic-ai/sdk");Gr=new t({apiKey:p.llm.apiKey})}return Gr}async function Jl(t,{model:e,jsonMode:r=!1}={}){let o=e||"claude-haiku-4-5-20251001",n=await Yl(),a=[{role:"user",content:t}],i=r?"Respond with valid JSON only. No explanation or wrapping.":void 0,s=await n.messages.create({model:o,max_tokens:4096,messages:a,...i&&{system:i}});return{text:s.content[0].text.trim(),inputTokens:s.usage?.input_tokens||G(t),outputTokens:s.usage?.output_tokens||G(s.content[0].text),model:o}}async function Vl({existing:t,clack:e}){let r=t.ANTHROPIC_API_KEY||"",o=await e.text({message:"Anthropic API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-ant-...",validate:n=>{if(!n&&!r)return"API key is required";if(n&&!n.startsWith("sk-ant-"))return'Anthropic keys start with "sk-ant-" \u2014 check paste'}});return e.isCancel(o)?null:{env:{ANTHROPIC_API_KEY:o||r}}}var Gr,ql,Ln=c(()=>{_();ie();Gr=null;ql={id:"anthropic",label:"Anthropic",hint:"Claude Haiku \u2014 requires API key"}});var Rn={};A(Rn,{chat:()=>zl,meta:()=>Zl,setup:()=>Ql});async function zl(t,{model:e,jsonMode:r=!1}={}){let o=e||p.llm.openrouterModel;if(!p.llm.openrouterApiKey)throw new Error("OPENROUTER_API_KEY is not set");if(!o)throw new Error("No OpenRouter model resolved. Set LLM_OPENROUTER_MODEL or pass `model`.");let n=[{role:"user",content:t}];r&&!t.toLowerCase().includes("json")&&n.unshift({role:"system",content:"Respond with valid JSON."});let a={model:o,messages:n};r&&(a.response_format={type:"json_object"});let i=(p.llm.openrouterBaseUrl||Xl).replace(/\/+$/,""),s={"Content-Type":"application/json",Authorization:`Bearer ${p.llm.openrouterApiKey}`};p.llm.openrouterReferer&&(s["HTTP-Referer"]=p.llm.openrouterReferer),p.llm.openrouterTitle&&(s["X-Title"]=p.llm.openrouterTitle);let f=await fetch(`${i}/chat/completions`,{method:"POST",headers:s,body:JSON.stringify(a)});if(!f.ok){let y=await f.text();throw new Error(`OpenRouter error ${f.status}: ${y}`)}let u=await f.json(),h=(u.choices?.[0]?.message?.content||"").trim(),d=u.usage||{};return{text:h,inputTokens:d.prompt_tokens||0,outputTokens:d.completion_tokens||0,model:u.model||o}}async function Ql({existing:t,clack:e}){let r={},o=t.OPENROUTER_API_KEY||"",n=await e.text({message:"OpenRouter API key (paste, then Enter)",placeholder:o?"(keep existing \u2014 press Enter)":"sk-or-v1-...",validate:f=>{if(!f&&!o)return"API key is required";if(f&&!f.startsWith("sk-or-"))return'OpenRouter keys start with "sk-or-" \u2014 check paste'}});if(e.isCancel(n))return null;r.OPENROUTER_API_KEY=n||o;let a=t.LLM_OPENROUTER_MODEL||"",i=await e.text({message:"OpenRouter model (vendor/model)",placeholder:a||Nn,validate:f=>{if(f&&!f.includes("/"))return'OpenRouter models are "vendor/model" \u2014 e.g. google/gemini-flash-latest'}});if(e.isCancel(i))return null;r.LLM_OPENROUTER_MODEL=i||a||Nn;let s=await e.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(e.isCancel(s))return null;if(s==="yes"){let f=await e.text({message:"Extraction model (high-volume; cheap matters)",placeholder:t.LLM_EXTRACTION_MODEL||Ot.extraction});if(e.isCancel(f))return null;r.LLM_EXTRACTION_MODEL=f||t.LLM_EXTRACTION_MODEL||Ot.extraction;let u=await e.text({message:"Decision model (AUDM; smart matters)",placeholder:t.LLM_DECISION_MODEL||Ot.decision});if(e.isCancel(u))return null;r.LLM_DECISION_MODEL=u||t.LLM_DECISION_MODEL||Ot.decision;let l=await e.text({message:"Synthesis model (read-time answer composition)",placeholder:t.SIGIL_SYNTH_MODEL||Ot.synthesis});if(e.isCancel(l))return null;r.SIGIL_SYNTH_MODEL=l||t.SIGIL_SYNTH_MODEL||Ot.synthesis}return e.note(`OpenRouter can drive both LLM calls and embeddings.
|
|
23
|
+
You will pick an embedding provider in the next step \u2014 "openrouter" is an option,
|
|
24
|
+
or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"OpenRouter scope"),{env:r}}var Xl,Zl,Nn,Ot,Dn=c(()=>{_();Xl="https://openrouter.ai/api/v1";Zl={id:"openrouter",label:"OpenRouter",hint:"one key, many models (Anthropic / OpenAI / Meta / ...)"},Nn="google/gemini-flash-latest",Ot={extraction:"openrouter:qwen/qwen3.5-flash",decision:"openrouter:anthropic/claude-sonnet-latest",synthesis:"openrouter:anthropic/claude-sonnet-latest"}});var Mn={};A(Mn,{chat:()=>np,meta:()=>ap,setup:()=>ip});import{spawn as tp}from"node:child_process";function op(t,e){let r=p.llm.cliTimeout||12e4;return new Promise((o,n)=>{let a=tp("claude",t,{stdio:["pipe","pipe","pipe"]}),i=setTimeout(()=>{a.kill("SIGTERM"),n(new Error(`claude CLI timed out after ${r}ms`))},r),s="",f="";a.stdout.on("data",u=>{s+=u}),a.stderr.on("data",u=>{f+=u}),a.on("error",u=>{clearTimeout(i),n(new Error(`Failed to spawn claude CLI: ${u.message}`))}),a.on("close",u=>{clearTimeout(i),o({stdout:s,stderr:f,code:u})}),a.stdin.write(e),a.stdin.end()})}async function np(t,{model:e,jsonMode:r=!1}={}){let o=e||p.llm.cliModel||"haiku",n=ep[o]||o,a=["-p","--model",n,"--output-format","json"];r&&a.push("--json-schema",rp);let{stdout:i,stderr:s,code:f}=await op(a,t);if(f!==0)throw new Error(`claude CLI exited ${f}: ${(s||i).slice(0,500)}`);let u;try{u=JSON.parse(i)}catch{return{text:i.trim(),inputTokens:G(t),outputTokens:G(i),model:n}}if(u.is_error)throw new Error(`claude CLI error: ${u.result||"unknown error"}`);let l=r&&u.structured_output?JSON.stringify(u.structured_output):(u.result||"").trim(),h=u.usage||{};return{text:l,inputTokens:h.input_tokens||G(t),outputTokens:h.output_tokens||G(l),model:n,cost:u.total_cost_usd||0}}async function ip(){return{env:{}}}var ep,rp,ap,kn=c(()=>{_();ie();ep={"claude-haiku-4-5-20251001":"haiku","claude-sonnet-4-6":"sonnet","claude-opus-4-6":"opus"},rp=JSON.stringify({type:"object",additionalProperties:!0});ap={id:"claude-cli",label:"Claude Code",hint:"uses your existing subscription \u2014 no extra API key"}});var Bn={};A(Bn,{chat:()=>sp,meta:()=>cp,setup:()=>fp});async function sp(t,{model:e,jsonMode:r=!1}={}){let o=e||p.llm.ollamaModel,n=`${p.llm.ollamaHost}/api/chat`,a={model:o,messages:[{role:"user",content:t}],stream:!1};r&&(a.format="json");let i=await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(!i.ok){let f=await i.text();throw new Error(`Ollama error ${i.status}: ${f}`)}let s=await i.json();return{text:s.message.content.trim(),inputTokens:s.prompt_eval_count||G(t),outputTokens:s.eval_count||G(s.message.content),model:o}}async function fp({existing:t,clack:e}){let r=t.OLLAMA_HOST||"http://localhost:11434",o=await e.text({message:"Ollama host",placeholder:r,initialValue:r,validate:n=>{if(n&&!/^https?:\/\//.test(n))return"Must start with http:// or https://"}});return e.isCancel(o)?null:{env:{OLLAMA_HOST:o||r}}}var cp,Fn=c(()=>{_();ie();cp={id:"ollama",label:"Ollama",hint:"local models \u2014 no API cost"}});function Me(t,e){if(e<1)return[];let r=[];for(let o=0;o<t.length;o+=e)r.push(t.slice(o,o+e));return r}var Wr=c(()=>{});var $n={};A($n,{embedBatch:()=>lp});async function lp(t,{model:e,ollamaHost:r}){let o=Me(t,up),n=[];for(let a of o){let i=await fetch(`${r}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e,input:a})});if(!i.ok)throw new Error(`Ollama embed failed: ${i.status} ${await i.text()}`);let s=await i.json();n.push(...s.embeddings)}return n}var up,Un=c(()=>{Wr();up=50});var Hn={};A(Hn,{embedBatch:()=>pp});async function pp(t,{model:e,openaiApiKey:r,dimensions:o}={}){let n={model:e,input:t};o&&/^text-embedding-3/.test(e)&&(n.dimensions=o);let a=await fetch("https://api.openai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(n)});if(!a.ok)throw new Error(`OpenAI embed failed: ${a.status} ${await a.text()}`);return(await a.json()).data.map(s=>s.embedding)}var jn=c(()=>{});var Gn={};A(Gn,{embedBatch:()=>mp});async function mp(t,{model:e,voyageApiKey:r,inputType:o="document",dimensions:n}={}){if(!r)throw new Error("VOYAGE_API_KEY is not set. Get one at dashboard.voyageai.com.");let a=Me(t,dp),i=[];for(let s of a){let f={input:s,model:e||"voyage-3-large",input_type:o==="query"?"query":"document"};n&&(f.output_dimension=n);let u=await fetch("https://api.voyageai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(f)});if(!u.ok){let d=await u.text();throw new Error(`Voyage embed failed: ${u.status} ${d}`)}let h=[...(await u.json()).data].sort((d,y)=>d.index-y.index);i.push(...h.map(d=>d.embedding))}return i}var dp,Wn=c(()=>{Wr();dp=50});var Kn={};A(Kn,{embedBatch:()=>yp});async function yp(t,{model:e,openrouterApiKey:r,openrouterBaseUrl:o,openrouterReferer:n,openrouterTitle:a,dimensions:i}={}){if(!r)throw new Error("OPENROUTER_API_KEY is not set");if(!e)throw new Error('No OpenRouter embedding model resolved. Set EMBEDDING_MODEL (e.g. "openai/text-embedding-3-large").');let s={model:e,input:t};i&&/(^|\/)text-embedding-3/.test(e)&&(s.dimensions=i);let f=(o||hp).replace(/\/+$/,""),u={"Content-Type":"application/json",Authorization:`Bearer ${r}`};n&&(u["HTTP-Referer"]=n),a&&(u["X-Title"]=a);let l=await fetch(`${f}/embeddings`,{method:"POST",headers:u,body:JSON.stringify(s)});if(!l.ok)throw new Error(`OpenRouter embed failed: ${l.status} ${await l.text()}`);return[...(await l.json()).data].sort((y,g)=>y.index-g.index).map(y=>y.embedding)}var hp,Yn=c(()=>{hp="https://openrouter.ai/api/v1"});import{spawn as gp}from"node:child_process";async function qr(t){if(!Kr[t]){let e=Jr[t];if(!e)throw new Error(`Unknown LLM provider: "${t}". Available: ${Object.keys(Jr).join(", ")}`);let r=await e();Kr[t]=r.chat}return Kr[t]}async function qn(t){if(!Yr[t]){let e=Jn[t];if(!e)throw new Error(`Unknown embedding provider: "${t}". Available: ${Object.keys(Jn).join(", ")}`);let r=await e();Yr[t]=r.embedBatch}return Yr[t]}function Vn(t,e){if(!t)return{provider:e,model:null};let r=t.indexOf(":");return r>0&&Jr[t.slice(0,r)]?{provider:t.slice(0,r),model:t.slice(r+1)}:{provider:e,model:t}}async function Xn(){let t=p.llm.ollamaHost||p.embedding.ollamaHost||"http://localhost:11434";try{return(await fetch(`${t}/api/tags`,{signal:AbortSignal.timeout(2e3)})).ok}catch{return!1}}function wp(){return new Promise(t=>{let e=gp("claude",["--version"],{stdio:"pipe"});e.on("error",()=>t(!1)),e.on("close",r=>t(r===0)),setTimeout(()=>{e.kill(),t(!1)},3e3)})}async function zn(){if(D)return D;if(p.llm.provider)return D=p.llm.provider,D;if(p.llm.openrouterApiKey)return D="openrouter",D;if(p.llm.apiKey)return D="anthropic",D;if(p.llm.openaiApiKey)return D="openai",D;if(await Xn())return D="ollama",D;if(await wp())return D="claude-cli",D;throw new Error(`No LLM provider available. Either:
|
|
25
|
+
- Set LLM_PROVIDER (openai, anthropic, openrouter, ollama, claude-cli)
|
|
26
|
+
- Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY
|
|
27
|
+
- Start Ollama locally
|
|
28
|
+
- Install the Claude CLI (claude)`)}async function Zn(){if(F)return F;if(p.embedding.provider)return F=p.embedding.provider,F;if(p.embedding.voyageApiKey)return F="voyage",F;if(await Xn())return F="ollama",F;if(p.embedding.openaiApiKey)return F="openai",F;if(p.embedding.openrouterApiKey)return F="openrouter",F;throw new Error(`No embedding provider available. Either:
|
|
29
|
+
- Set EMBEDDING_PROVIDER (voyage, ollama, openai, openrouter)
|
|
30
|
+
- Set VOYAGE_API_KEY (recommended \u2014 best quality)
|
|
31
|
+
- Start Ollama locally
|
|
32
|
+
- Set OPENAI_API_KEY
|
|
33
|
+
- Set OPENROUTER_API_KEY (and EMBEDDING_MODEL like "openai/text-embedding-3-large")`)}var Jr,Jn,Kr,Yr,D,F,Vr=c(()=>{_();Jr={openai:()=>Promise.resolve().then(()=>(Cn(),vn)),anthropic:()=>Promise.resolve().then(()=>(Ln(),Pn)),openrouter:()=>Promise.resolve().then(()=>(Dn(),Rn)),"claude-cli":()=>Promise.resolve().then(()=>(kn(),Mn)),ollama:()=>Promise.resolve().then(()=>(Fn(),Bn))},Jn={ollama:()=>Promise.resolve().then(()=>(Un(),$n)),openai:()=>Promise.resolve().then(()=>(jn(),Hn)),voyage:()=>Promise.resolve().then(()=>(Wn(),Gn)),openrouter:()=>Promise.resolve().then(()=>(Yn(),Kn))},Kr={},Yr={};D=null,F=null});var ta={};A(ta,{parseJson:()=>ke,prompt:()=>ht,promptJson:()=>yt});async function Qn(t){let e=await zn();return Vn(t,e)}async function ht(t,{model:e,caller:r}={}){let{provider:o,model:n}=await Qn(e),a=await qr(o),i=Date.now();try{let s=await jr(()=>a(t,{model:n,jsonMode:!1}),p.llm.maxRetries),f=s.cost||Hr(s.model,s.inputTokens,s.outputTokens);return ae({provider:o,model:s.model,caller:r,input:t,response:s.text,inputTokens:s.inputTokens,outputTokens:s.outputTokens,cost:f,durationMs:Date.now()-i,status:"success"}),s.text}catch(s){throw ae({provider:o,model:n,caller:r,input:t,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-i,status:"error",error:s.message}),s}}async function yt(t,{model:e,caller:r}={}){let{provider:o,model:n}=await Qn(e),a=await qr(o),i=Date.now();try{let s=await jr(()=>a(t,{model:n,jsonMode:!0}),p.llm.maxRetries),f=s.cost||Hr(s.model,s.inputTokens,s.outputTokens);return ae({provider:o,model:s.model,caller:r,input:t,response:s.text,inputTokens:s.inputTokens,outputTokens:s.outputTokens,cost:f,durationMs:Date.now()-i,status:"success"}),ke(s.text)}catch(s){throw ae({provider:o,model:n,caller:r,input:t,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-i,status:"error",error:s.message}),s}}function ke(t){try{return JSON.parse(t.trim())}catch{}let e=t.match(/```(?:json)?\s*([\s\S]*?)```/);if(e)try{return JSON.parse(e[1].trim())}catch{}let r=t.match(/[\[{][\s\S]*[\]}]/);if(r)try{return JSON.parse(r[0])}catch{}return null}var ot=c(()=>{_();Vr();ie()});function ea(t){let e=t.split(`
|
|
34
|
+
`),r=[],o=null,n=[];for(let s of e){let f=s.match(/^(#{1,6})\s+(.+)/);f?(n.length&&r.push({heading:o||"Introduction",text:n.join(`
|
|
35
|
+
`).trim()}),o=f[2].trim(),n=[]):n.push(s)}n.length&&r.push({heading:o||"Content",text:n.join(`
|
|
36
|
+
`).trim()});let a=r.map(s=>s.text).join(`
|
|
37
|
+
|
|
38
|
+
`),i=xp(e)||null;return{text:a,sections:r,metadata:{title:i}}}function xp(t){for(let e of t){let r=e.match(/^#\s+(.+)/);if(r)return r[1].trim()}return null}var ra=c(()=>{});function Xr(t){let e=t.split(/\n{2,}/).map(o=>o.trim()).filter(Boolean),r=e.length>1?e.map((o,n)=>({heading:`Section ${n+1}`,text:o})):[{heading:"Content",text:t.trim()}];return{text:t.trim(),sections:r,metadata:{}}}var oa=c(()=>{});function na(t){let e=_p(t),r=t.replace(/<script[\s\S]*?<\/script>/gi,"");return r=r.replace(/<style[\s\S]*?<\/style>/gi,""),r=r.replace(/<\/(p|div|h[1-6]|li|tr|br|hr)>/gi,`
|
|
39
|
+
`),r=r.replace(/<br\s*\/?>/gi,`
|
|
40
|
+
`),r=r.replace(/<[^>]+>/g,""),r=r.replace(/&/g,"&"),r=r.replace(/</g,"<"),r=r.replace(/>/g,">"),r=r.replace(/"/g,'"'),r=r.replace(/'/g,"'"),r=r.replace(/ /g," "),r=r.replace(/[ \t]+/g," "),r=r.replace(/\n{3,}/g,`
|
|
41
|
+
|
|
42
|
+
`),r=r.trim(),{text:r,sections:[{heading:"Content",text:r}],metadata:{title:e}}}function _p(t){let e=t.match(/<title[^>]*>([\s\S]*?)<\/title>/i);return e?e[1].trim():null}var aa=c(()=>{});function ia(t,{language:e}={}){let r=e||Sp(t),o=Ep(t,r);return{text:t.trim(),sections:o,metadata:{language:r}}}function Ep(t,e){let r=t.split(`
|
|
43
|
+
`),o=[],n="Header",a=[],i=!1,s=0;for(let f of r){let u=bp(f,e);u&&s===0?(a.length&&o.push({heading:n,text:a.join(`
|
|
44
|
+
`).trim()}),n=u,a=[f],i=!0):a.push(f);for(let l of f)l==="{"&&s++,l==="}"&&(s=Math.max(0,s-1))}return a.length&&o.push({heading:n,text:a.join(`
|
|
45
|
+
`).trim()}),o.length<=1?Ap(t):o.filter(f=>f.text)}function bp(t,e){let r=t.trim(),o=[/^(?:export\s+)?(?:async\s+)?function\s+(\w+)/,/^(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s*)?\(/,/^(?:export\s+)?class\s+(\w+)/,/^(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=\s*\{/,/^(?:export\s+default\s+)/],n=[/^(?:async\s+)?def\s+(\w+)/,/^class\s+(\w+)/],a=[/^func\s+(?:\(\w+\s+\*?\w+\)\s+)?(\w+)/,/^type\s+(\w+)/],i=[...o,...n,...a];for(let s of i){let f=r.match(s);if(f)return f[1]||f[0].slice(0,40)}return null}function Ap(t){return t.split(/\n{2,}/).map((r,o)=>({heading:`Block ${o+1}`,text:r.trim()})).filter(r=>r.text)}function Sp(t){return t.includes("import ")&&(t.includes("from ")||t.includes("require("))?"javascript":t.match(/^def\s/m)||t.match(/^class\s.*:/m)?"python":t.match(/^func\s/m)||t.includes("package ")?"go":t.match(/^fn\s/m)||t.includes("use ")?"rust":"unknown"}var sa=c(()=>{});function ca(t){let e;try{e=typeof t=="string"?JSON.parse(t):t}catch{return{text:t,sections:[{heading:"Content",text:t}],metadata:{}}}let r=zr(e);return{text:r,sections:[{heading:"Content",text:r}],metadata:{}}}function zr(t,e=0){if(t==null)return"";if(Array.isArray(t))return t.map((r,o)=>typeof r=="object"&&r!==null?`Item ${o+1}:
|
|
46
|
+
${zr(r,e+1)}`:`- ${r}`).join(`
|
|
47
|
+
`);if(typeof t=="object"){let r=" ".repeat(e);return Object.entries(t).filter(([,o])=>o!=null).map(([o,n])=>typeof n=="object"?`${r}${o}:
|
|
48
|
+
${zr(n,e+1)}`:`${r}${o}: ${n}`).join(`
|
|
49
|
+
`)}return String(t)}var fa=c(()=>{});function ua(t,{format:e,filePath:r,contentType:o}={}){let n=e||vp(o)||Cp(r)||Pp(t);return(Ip[n]||Xr)(t)}function vp(t){if(!t)return null;let e=t.split(";")[0].trim();return Op[e]||null}function Cp(t){if(!t)return null;let e=t.match(/\.[^.]+$/)?.[0]?.toLowerCase();return e&&Tp[e]||null}function Pp(t){if(!t)return"text";let e=t.trim();return e.startsWith("{")||e.startsWith("[")?"json":e.startsWith("<!DOCTYPE")||e.startsWith("<html")?"html":e.match(/^#{1,6}\s/m)?"markdown":e.match(/^(import|export|function|class|const|let|var|def|func|package)\s/m)?"code":"text"}var Tp,Op,Ip,la=c(()=>{ra();oa();aa();sa();fa();Tp={".md":"markdown",".mdx":"markdown",".txt":"text",".html":"html",".htm":"html",".json":"json",".js":"code",".ts":"code",".jsx":"code",".tsx":"code",".py":"code",".go":"code",".rs":"code",".java":"code",".rb":"code",".php":"code",".c":"code",".cpp":"code",".h":"code",".cs":"code",".swift":"code",".kt":"code",".yaml":"text",".yml":"text",".toml":"text",".ini":"text",".cfg":"text",".env":"text",".csv":"text",".sql":"code",".sh":"code",".bash":"code",".zsh":"code"},Op={"text/markdown":"markdown","text/html":"html","text/plain":"text","application/json":"json","text/javascript":"code","application/javascript":"code","text/x-python":"code"},Ip={markdown:ea,text:Xr,html:na,code:ia,json:ca}});function Lp(t,{maxTokens:e=512,overlapTokens:r=50}={}){if(!t?.trim())return[];let o=e*4,n=r*4;if(t.length<=o)return[{content:t.trim(),index:0}];let a=Np(t),i=[],s="",f="";for(let u of a){if(u.length>o){s.trim()&&(i.push({content:s.trim(),index:i.length}),f=Zr(s,n),s="");let l=Rp(u,o,n);for(let h of l)i.push({content:h.trim(),index:i.length});f=Zr(i[i.length-1].content,n);continue}(s+u).length>o?(i.push({content:s.trim(),index:i.length}),f=Zr(s,n),s=f+u):s+=u}return s.trim()&&i.push({content:s.trim(),index:i.length}),i}function pa(t,e={}){let r=[];for(let{heading:o,text:n}of t){if(!n?.trim())continue;let a=Lp(n,e);for(let i of a)r.push({content:i.content,index:r.length,sectionHeading:o})}return r}function Np(t){return t.split(/(?<=[.!?])\s+|(?<=\n)\s*/).filter(r=>r.trim())}function Rp(t,e,r){let o=[],n=0;for(;n<t.length;){let a=Math.min(n+e,t.length);if(o.push(t.slice(n,a)),n=a-r,n>=t.length)break}return o}function Zr(t,e){if(t.length<=e)return t;let r=t.slice(-e),o=r.search(/[.!?]\s+/);return o!==-1?r.slice(o+1).trimStart():r}var da=c(()=>{});function $(t){return t?`[${t.join(",")}]`:null}function ma(){let t=Number(p.embedding.dimensions)||768;if(!Number.isInteger(t)||t<=0)throw new Error(`Invalid EMBEDDING_DIMENSIONS: ${p.embedding.dimensions}`);return t}function It(t="embedding"){return`(${t}::halfvec(${ma()}))`}function vt(){return`?::halfvec(${ma()})`}var Ct=c(()=>{_()});import{createHash as Dp}from"node:crypto";function kp(t,e,r,o="document"){let n=Dp("sha256");return n.update(t),n.update("\0"),n.update(e),n.update("\0"),n.update(o),n.update("\0"),n.update(r),n.digest("hex")}async function Bp(t){if(!t.length)return new Map;let e=await m("embedding_cache").whereIn("key",t).select("key","embedding");return new Map(e.map(r=>[r.key,Fp(r.embedding)]))}function Fp(t){return Array.isArray(t)||typeof t!="string"?t:(t.startsWith("[")?t.slice(1,-1):t).split(",").map(Number)}async function $p(t){t.length&&await m("embedding_cache").whereIn("key",t).update({hits:m.raw("hits + 1"),lastUsedAt:m.fn.now()})}async function Up(t,e,r){if(t.length){for(let{key:o,embedding:n}of t)await m.raw(`
|
|
50
|
+
INSERT INTO embedding_cache (key, provider, model, embedding, hits, created_at, last_used_at)
|
|
51
|
+
VALUES (?, ?, ?, ?, 0, NOW(), NOW())
|
|
52
|
+
ON CONFLICT (key) DO UPDATE
|
|
53
|
+
SET last_used_at = NOW(),
|
|
54
|
+
hits = embedding_cache.hits + 1
|
|
55
|
+
`,[o,e,r,$(n)]);await jp()}}async function jp(){let t=Date.now();if(t-ya<Hp)return;ya=t;let[{count:e}]=await m("embedding_cache").count("key as count"),r=Number(e);if(r<=ha)return;let o=Math.min(r-ha,Mp);await m.raw(`
|
|
56
|
+
DELETE FROM embedding_cache WHERE key IN (
|
|
57
|
+
SELECT key FROM embedding_cache ORDER BY last_used_at ASC LIMIT ?
|
|
58
|
+
)
|
|
59
|
+
`,[o])}async function ga(t,e,r,o,n,a={}){if(!t.length)return[];let i=a.inputType||n?.inputType||"document",s=t.map(y=>kp(e,r,y,i)),f=await Bp(s),u=[],l=[],h=new Array(t.length);for(let y=0;y<t.length;y++){let g=f.get(s[y]);g?h[y]=g:(u.push(t[y]),l.push(y))}if(u.length){let y=await o(u,n),g=[];for(let w=0;w<u.length;w++){let x=l[w];h[x]=y[w],g.push({key:s[x],embedding:y[w]})}Up(g,e,r).catch(w=>{process.stderr.write(`[embedding-cache] store failed: ${w.message}
|
|
60
|
+
`)})}let d=s.filter(y=>f.has(y));return d.length&&$p(d).catch(()=>{}),h}var ha,Mp,ya,Hp,wa=c(()=>{Ct();S();ha=1e4,Mp=500;ya=0,Hp=6e4});async function Be(t,e={}){let[r]=await se([t],e);return r}async function se(t,{inputType:e="document"}={}){if(!t.length)return[];let r=await Zn(),o=await qn(r),n=p.embedding.model,a={...p.embedding,inputType:e};return ga(t,r,n,o,a,{inputType:e})}var eE,Fe=c(()=>{_();Vr();wa();({dimensions:eE}=p.embedding)});import{readFile as Gp}from"node:fs/promises";import{join as Wp}from"node:path";async function xa(t,e,{title:r}){if(!t.length)return t;let o=await Gp(Kp,"utf8"),n=t.map((i,s)=>`Chunk ${s+1}: ${i.content.slice(0,200)}`),a=`${o}
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
**Document title:** ${r}
|
|
65
|
+
|
|
66
|
+
**Full document:**
|
|
67
|
+
${e.slice(0,8e3)}
|
|
68
|
+
|
|
69
|
+
**Chunks (${t.length}):**
|
|
70
|
+
${n.join(`
|
|
71
|
+
`)}
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
Respond with a JSON array of ${t.length} context prefix strings.`;try{let i=await yt(a,{model:p.llm.extractionModel,caller:"contextualizer"}),s=Array.isArray(i)?i:i&&typeof i=="object"?Object.values(i).find(u=>Array.isArray(u))??null:null;if(!s)return console.warn("[contextualizer] LLM did not return an array \u2014 skipping"),t;let f=s;return f.length!==t.length&&console.warn(`[contextualizer] Got ${f.length} prefixes for ${t.length} chunks \u2014 using partial`),t.map((u,l)=>({...u,contextualPrefix:typeof f[l]=="string"?f[l]:null}))}catch(i){return console.error("[contextualizer] Failed:",i.message),t}}var Kp,_a=c(()=>{ot();_();B();Kp=Wp(q,"chunk-context.md")});async function Ea({sourcePath:t,sourceType:e,title:r=null,contentHash:o,namespace:n}){let a=`doc-${rt(16)}`,{rows:[i]}=await m.raw(`
|
|
76
|
+
INSERT INTO document (uid, source_path, source_type, title, content_hash, namespace, last_ingested_at, created_at, updated_at)
|
|
77
|
+
VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW(), NOW())
|
|
78
|
+
ON CONFLICT (source_path, namespace) DO UPDATE SET
|
|
79
|
+
title = EXCLUDED.title,
|
|
80
|
+
content_hash = EXCLUDED.content_hash,
|
|
81
|
+
last_ingested_at = NOW(),
|
|
82
|
+
updated_at = NOW()
|
|
83
|
+
RETURNING *, (xmax = 0) AS "isNew", content_hash != ? AS "contentChanged"
|
|
84
|
+
`,[a,t,e,r,o,n,o]),f=i.isNew||i.contentChanged;return{doc:i,changed:f}}async function Qr(t,{chunkCount:e,factCount:r}){await m("document").where({id:t}).update({chunkCount:e,factCount:r})}async function ba(t){await m("document").where({id:t}).update({contentHash:null})}async function Aa(t,e,r=null){if(!e&&!r)return;let o={};e&&Object.keys(e).length&&(o.sourceMetadata=JSON.stringify(e)),r&&(o.connectionId=r),Object.keys(o).length&&await m("document").where({id:t}).update(o)}var Sa=c(()=>{Zt();S()});async function Ta(t,e,r){if(await m("chunk").where({documentId:t}).del(),!e.length)return[];let o=e.map((a,i)=>({documentId:t,chunkIndex:i,content:a.content,contextualPrefix:a.contextualPrefix||null,sectionHeading:a.sectionHeading||null,namespace:r,embedding:$(a.embedding)})),n=await m("chunk").insert(o).returning("*");return await m.raw(`
|
|
85
|
+
UPDATE chunk
|
|
86
|
+
SET search_vector = to_tsvector('english', COALESCE(contextual_prefix, '') || ' ' || content)
|
|
87
|
+
WHERE document_id = ?
|
|
88
|
+
`,[t]),n}var Oa=c(()=>{S();Ct()});var qp,$e,to=c(()=>{qp=typeof global=="object"&&global&&global.Object===Object&&global,$e=qp});var Vp,Xp,O,V=c(()=>{to();Vp=typeof self=="object"&&self&&self.Object===Object&&self,Xp=$e||Vp||Function("return this")(),O=Xp});var zp,L,Pt=c(()=>{V();zp=O.Symbol,L=zp});function td(t){var e=Zp.call(t,ce),r=t[ce];try{t[ce]=void 0;var o=!0}catch{}var n=Qp.call(t);return o&&(e?t[ce]=r:delete t[ce]),n}var Ia,Zp,Qp,ce,va,Ca=c(()=>{Pt();Ia=Object.prototype,Zp=Ia.hasOwnProperty,Qp=Ia.toString,ce=L?L.toStringTag:void 0;va=td});function od(t){return rd.call(t)}var ed,rd,Pa,La=c(()=>{ed=Object.prototype,rd=ed.toString;Pa=od});function id(t){return t==null?t===void 0?ad:nd:Na&&Na in Object(t)?va(t):Pa(t)}var nd,ad,Na,W,Lt=c(()=>{Pt();Ca();La();nd="[object Null]",ad="[object Undefined]",Na=L?L.toStringTag:void 0;W=id});function sd(t){return t!=null&&typeof t=="object"}var K,Nt=c(()=>{K=sd});function fd(t){return typeof t=="symbol"||K(t)&&W(t)==cd}var cd,Y,Rt=c(()=>{Lt();Nt();cd="[object Symbol]";Y=fd});function ud(t,e){for(var r=-1,o=t==null?0:t.length,n=Array(o);++r<o;)n[r]=e(t[r],r,t);return n}var Dt,eo=c(()=>{Dt=ud});var ld,b,U=c(()=>{ld=Array.isArray,b=ld});function Ma(t){if(typeof t=="string")return t;if(b(t))return Dt(t,Ma)+"";if(Y(t))return Da?Da.call(t):"";var e=t+"";return e=="0"&&1/t==-pd?"-0":e}var pd,Ra,Da,ka,Ba=c(()=>{Pt();eo();U();Rt();pd=1/0,Ra=L?L.prototype:void 0,Da=Ra?Ra.toString:void 0;ka=Ma});function md(t){for(var e=t.length;e--&&dd.test(t.charAt(e)););return e}var dd,Fa,$a=c(()=>{dd=/\s/;Fa=md});function yd(t){return t&&t.slice(0,Fa(t)+1).replace(hd,"")}var hd,Ua,Ha=c(()=>{$a();hd=/^\s+/;Ua=yd});function gd(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var J,Mt=c(()=>{J=gd});function bd(t){if(typeof t=="number")return t;if(Y(t))return ja;if(J(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=J(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Ua(t);var r=xd.test(t);return r||_d.test(t)?Ed(t.slice(2),r?2:8):wd.test(t)?ja:+t}var ja,wd,xd,_d,Ed,Ga,Wa=c(()=>{Ha();Mt();Rt();ja=NaN,wd=/^[-+]0x[0-9a-f]+$/i,xd=/^0b[01]+$/i,_d=/^0o[0-7]+$/i,Ed=parseInt;Ga=bd});function Sd(t){if(!t)return t===0?t:0;if(t=Ga(t),t===Ka||t===-Ka){var e=t<0?-1:1;return e*Ad}return t===t?t:0}var Ka,Ad,Ya,Ja=c(()=>{Wa();Ka=1/0,Ad=17976931348623157e292;Ya=Sd});function Td(t){var e=Ya(t),r=e%1;return e===e?r?e-r:e:0}var qa,Va=c(()=>{Ja();qa=Td});function Od(t){return t}var nt,fe=c(()=>{nt=Od});function Ld(t){if(!J(t))return!1;var e=W(t);return e==vd||e==Cd||e==Id||e==Pd}var Id,vd,Cd,Pd,Ue,ro=c(()=>{Lt();Mt();Id="[object AsyncFunction]",vd="[object Function]",Cd="[object GeneratorFunction]",Pd="[object Proxy]";Ue=Ld});var Nd,He,Xa=c(()=>{V();Nd=O["__core-js_shared__"],He=Nd});function Rd(t){return!!za&&za in t}var za,Za,Qa=c(()=>{Xa();za=(function(){var t=/[^.]+$/.exec(He&&He.keys&&He.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""})();Za=Rd});function kd(t){if(t!=null){try{return Md.call(t)}catch{}try{return t+""}catch{}}return""}var Dd,Md,Z,oo=c(()=>{Dd=Function.prototype,Md=Dd.toString;Z=kd});function Wd(t){if(!J(t)||Za(t))return!1;var e=Ue(t)?Gd:Fd;return e.test(Z(t))}var Bd,Fd,$d,Ud,Hd,jd,Gd,ti,ei=c(()=>{ro();Qa();Mt();oo();Bd=/[\\^$.*+?()[\]{}|]/g,Fd=/^\[object .+?Constructor\]$/,$d=Function.prototype,Ud=Object.prototype,Hd=$d.toString,jd=Ud.hasOwnProperty,Gd=RegExp("^"+Hd.call(jd).replace(Bd,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");ti=Wd});function Kd(t,e){return t?.[e]}var ri,oi=c(()=>{ri=Kd});function Yd(t,e){var r=ri(t,e);return ti(r)?r:void 0}var M,at=c(()=>{ei();oi();M=Yd});var Jd,je,ni=c(()=>{at();V();Jd=M(O,"WeakMap"),je=Jd});function qd(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}var ai,ii=c(()=>{ai=qd});function Vd(){}var si,ci=c(()=>{si=Vd});function Qd(t){var e=0,r=0;return function(){var o=Zd(),n=zd-(o-r);if(r=o,n>0){if(++e>=Xd)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var Xd,zd,Zd,fi,ui=c(()=>{Xd=800,zd=16,Zd=Date.now;fi=Qd});function tm(t){return function(){return t}}var li,pi=c(()=>{li=tm});var em,kt,no=c(()=>{at();em=(function(){try{var t=M(Object,"defineProperty");return t({},"",{}),t}catch{}})(),kt=em});var rm,di,mi=c(()=>{pi();no();fe();rm=kt?function(t,e){return kt(t,"toString",{configurable:!0,enumerable:!1,value:li(e),writable:!0})}:nt,di=rm});var om,hi,yi=c(()=>{mi();ui();om=fi(di),hi=om});function nm(t,e,r,o){for(var n=t.length,a=r+(o?1:-1);o?a--:++a<n;)if(e(t[a],a,t))return a;return-1}var gi,wi=c(()=>{gi=nm});function am(t){return t!==t}var xi,_i=c(()=>{xi=am});function im(t,e,r){for(var o=r-1,n=t.length;++o<n;)if(t[o]===e)return o;return-1}var Ei,bi=c(()=>{Ei=im});function sm(t,e,r){return e===e?Ei(t,e,r):gi(t,xi,r)}var Ai,Si=c(()=>{wi();_i();bi();Ai=sm});function cm(t,e){var r=t==null?0:t.length;return!!r&&Ai(t,e,0)>-1}var Ti,Oi=c(()=>{Si();Ti=cm});function lm(t,e){var r=typeof t;return e=e??fm,!!e&&(r=="number"||r!="symbol"&&um.test(t))&&t>-1&&t%1==0&&t<e}var fm,um,Bt,Ge=c(()=>{fm=9007199254740991,um=/^(?:0|[1-9]\d*)$/;Bt=lm});function pm(t,e,r){e=="__proto__"&&kt?kt(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var Ii,vi=c(()=>{no();Ii=pm});function dm(t,e){return t===e||t!==t&&e!==e}var Ft,We=c(()=>{Ft=dm});function mm(t,e,r){return e=Ci(e===void 0?t.length-1:e,0),function(){for(var o=arguments,n=-1,a=Ci(o.length-e,0),i=Array(a);++n<a;)i[n]=o[e+n];n=-1;for(var s=Array(e+1);++n<e;)s[n]=o[n];return s[e]=r(i),ai(t,this,s)}}var Ci,Pi,Li=c(()=>{ii();Ci=Math.max;Pi=mm});function hm(t,e){return hi(Pi(t,e,nt),t+"")}var Ni,Ri=c(()=>{fe();Li();yi();Ni=hm});function gm(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=ym}var ym,$t,Ke=c(()=>{ym=9007199254740991;$t=gm});function wm(t){return t!=null&&$t(t.length)&&!Ue(t)}var it,ue=c(()=>{ro();Ke();it=wm});function xm(t,e,r){if(!J(r))return!1;var o=typeof e;return(o=="number"?it(r)&&Bt(e,r.length):o=="string"&&e in r)?Ft(r[e],t):!1}var le,ao=c(()=>{We();ue();Ge();Mt();le=xm});function Em(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||_m;return t===r}var _m,Di,Mi=c(()=>{_m=Object.prototype;Di=Em});function bm(t,e){for(var r=-1,o=Array(t);++r<t;)o[r]=e(r);return o}var ki,Bi=c(()=>{ki=bm});function Sm(t){return K(t)&&W(t)==Am}var Am,io,Fi=c(()=>{Lt();Nt();Am="[object Arguments]";io=Sm});var $i,Tm,Om,Im,Ut,Ye=c(()=>{Fi();Nt();$i=Object.prototype,Tm=$i.hasOwnProperty,Om=$i.propertyIsEnumerable,Im=io((function(){return arguments})())?io:function(t){return K(t)&&Tm.call(t,"callee")&&!Om.call(t,"callee")},Ut=Im});function vm(){return!1}var Ui,Hi=c(()=>{Ui=vm});var Wi,ji,Cm,Gi,Pm,Lm,pe,so=c(()=>{V();Hi();Wi=typeof exports=="object"&&exports&&!exports.nodeType&&exports,ji=Wi&&typeof module=="object"&&module&&!module.nodeType&&module,Cm=ji&&ji.exports===Wi,Gi=Cm?O.Buffer:void 0,Pm=Gi?Gi.isBuffer:void 0,Lm=Pm||Ui,pe=Lm});function rh(t){return K(t)&&$t(t.length)&&!!E[W(t)]}var Nm,Rm,Dm,Mm,km,Bm,Fm,$m,Um,Hm,jm,Gm,Wm,Km,Ym,Jm,qm,Vm,Xm,zm,Zm,Qm,th,eh,E,Ki,Yi=c(()=>{Lt();Ke();Nt();Nm="[object Arguments]",Rm="[object Array]",Dm="[object Boolean]",Mm="[object Date]",km="[object Error]",Bm="[object Function]",Fm="[object Map]",$m="[object Number]",Um="[object Object]",Hm="[object RegExp]",jm="[object Set]",Gm="[object String]",Wm="[object WeakMap]",Km="[object ArrayBuffer]",Ym="[object DataView]",Jm="[object Float32Array]",qm="[object Float64Array]",Vm="[object Int8Array]",Xm="[object Int16Array]",zm="[object Int32Array]",Zm="[object Uint8Array]",Qm="[object Uint8ClampedArray]",th="[object Uint16Array]",eh="[object Uint32Array]",E={};E[Jm]=E[qm]=E[Vm]=E[Xm]=E[zm]=E[Zm]=E[Qm]=E[th]=E[eh]=!0;E[Nm]=E[Rm]=E[Km]=E[Dm]=E[Ym]=E[Mm]=E[km]=E[Bm]=E[Fm]=E[$m]=E[Um]=E[Hm]=E[jm]=E[Gm]=E[Wm]=!1;Ki=rh});function oh(t){return function(e){return t(e)}}var Je,co=c(()=>{Je=oh});var Ji,de,nh,fo,ah,uo,qi=c(()=>{to();Ji=typeof exports=="object"&&exports&&!exports.nodeType&&exports,de=Ji&&typeof module=="object"&&module&&!module.nodeType&&module,nh=de&&de.exports===Ji,fo=nh&&$e.process,ah=(function(){try{var t=de&&de.require&&de.require("util").types;return t||fo&&fo.binding&&fo.binding("util")}catch{}})(),uo=ah});var Vi,ih,qe,lo=c(()=>{Yi();co();qi();Vi=uo&&uo.isTypedArray,ih=Vi?Je(Vi):Ki,qe=ih});function fh(t,e){var r=b(t),o=!r&&Ut(t),n=!r&&!o&&pe(t),a=!r&&!o&&!n&&qe(t),i=r||o||n||a,s=i?ki(t.length,String):[],f=s.length;for(var u in t)(e||ch.call(t,u))&&!(i&&(u=="length"||n&&(u=="offset"||u=="parent")||a&&(u=="buffer"||u=="byteLength"||u=="byteOffset")||Bt(u,f)))&&s.push(u);return s}var sh,ch,Xi,zi=c(()=>{Bi();Ye();U();so();Ge();lo();sh=Object.prototype,ch=sh.hasOwnProperty;Xi=fh});function uh(t,e){return function(r){return t(e(r))}}var Zi,Qi=c(()=>{Zi=uh});var lh,ts,es=c(()=>{Qi();lh=Zi(Object.keys,Object),ts=lh});function mh(t){if(!Di(t))return ts(t);var e=[];for(var r in Object(t))dh.call(t,r)&&r!="constructor"&&e.push(r);return e}var ph,dh,rs,os=c(()=>{Mi();es();ph=Object.prototype,dh=ph.hasOwnProperty;rs=mh});function hh(t){return it(t)?Xi(t):rs(t)}var Ht,Ve=c(()=>{zi();os();ue();Ht=hh});function wh(t,e){if(b(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||Y(t)?!0:gh.test(t)||!yh.test(t)||e!=null&&t in Object(e)}var yh,gh,jt,Xe=c(()=>{U();Rt();yh=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,gh=/^\w*$/;jt=wh});var xh,Q,me=c(()=>{at();xh=M(Object,"create"),Q=xh});function _h(){this.__data__=Q?Q(null):{},this.size=0}var ns,as=c(()=>{me();ns=_h});function Eh(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var is,ss=c(()=>{is=Eh});function Th(t){var e=this.__data__;if(Q){var r=e[t];return r===bh?void 0:r}return Sh.call(e,t)?e[t]:void 0}var bh,Ah,Sh,cs,fs=c(()=>{me();bh="__lodash_hash_undefined__",Ah=Object.prototype,Sh=Ah.hasOwnProperty;cs=Th});function vh(t){var e=this.__data__;return Q?e[t]!==void 0:Ih.call(e,t)}var Oh,Ih,us,ls=c(()=>{me();Oh=Object.prototype,Ih=Oh.hasOwnProperty;us=vh});function Ph(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Q&&e===void 0?Ch:e,this}var Ch,ps,ds=c(()=>{me();Ch="__lodash_hash_undefined__";ps=Ph});function Gt(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var o=t[e];this.set(o[0],o[1])}}var po,ms=c(()=>{as();ss();fs();ls();ds();Gt.prototype.clear=ns;Gt.prototype.delete=is;Gt.prototype.get=cs;Gt.prototype.has=us;Gt.prototype.set=ps;po=Gt});function Lh(){this.__data__=[],this.size=0}var hs,ys=c(()=>{hs=Lh});function Nh(t,e){for(var r=t.length;r--;)if(Ft(t[r][0],e))return r;return-1}var st,he=c(()=>{We();st=Nh});function Mh(t){var e=this.__data__,r=st(e,t);if(r<0)return!1;var o=e.length-1;return r==o?e.pop():Dh.call(e,r,1),--this.size,!0}var Rh,Dh,gs,ws=c(()=>{he();Rh=Array.prototype,Dh=Rh.splice;gs=Mh});function kh(t){var e=this.__data__,r=st(e,t);return r<0?void 0:e[r][1]}var xs,_s=c(()=>{he();xs=kh});function Bh(t){return st(this.__data__,t)>-1}var Es,bs=c(()=>{he();Es=Bh});function Fh(t,e){var r=this.__data__,o=st(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}var As,Ss=c(()=>{he();As=Fh});function Wt(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var o=t[e];this.set(o[0],o[1])}}var ct,ye=c(()=>{ys();ws();_s();bs();Ss();Wt.prototype.clear=hs;Wt.prototype.delete=gs;Wt.prototype.get=xs;Wt.prototype.has=Es;Wt.prototype.set=As;ct=Wt});var $h,ft,ze=c(()=>{at();V();$h=M(O,"Map"),ft=$h});function Uh(){this.size=0,this.__data__={hash:new po,map:new(ft||ct),string:new po}}var Ts,Os=c(()=>{ms();ye();ze();Ts=Uh});function Hh(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var Is,vs=c(()=>{Is=Hh});function jh(t,e){var r=t.__data__;return Is(e)?r[typeof e=="string"?"string":"hash"]:r.map}var ut,ge=c(()=>{vs();ut=jh});function Gh(t){var e=ut(this,t).delete(t);return this.size-=e?1:0,e}var Cs,Ps=c(()=>{ge();Cs=Gh});function Wh(t){return ut(this,t).get(t)}var Ls,Ns=c(()=>{ge();Ls=Wh});function Kh(t){return ut(this,t).has(t)}var Rs,Ds=c(()=>{ge();Rs=Kh});function Yh(t,e){var r=ut(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}var Ms,ks=c(()=>{ge();Ms=Yh});function Kt(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var o=t[e];this.set(o[0],o[1])}}var gt,Ze=c(()=>{Os();Ps();Ns();Ds();ks();Kt.prototype.clear=Ts;Kt.prototype.delete=Cs;Kt.prototype.get=Ls;Kt.prototype.has=Rs;Kt.prototype.set=Ms;gt=Kt});function mo(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(Jh);var r=function(){var o=arguments,n=e?e.apply(this,o):o[0],a=r.cache;if(a.has(n))return a.get(n);var i=t.apply(this,o);return r.cache=a.set(n,i)||a,i};return r.cache=new(mo.Cache||gt),r}var Jh,Bs,Fs=c(()=>{Ze();Jh="Expected a function";mo.Cache=gt;Bs=mo});function Vh(t){var e=Bs(t,function(o){return r.size===qh&&r.clear(),o}),r=e.cache;return e}var qh,$s,Us=c(()=>{Fs();qh=500;$s=Vh});var Xh,zh,Zh,Hs,js=c(()=>{Us();Xh=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,zh=/\\(\\)?/g,Zh=$s(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(Xh,function(r,o,n,a){e.push(n?a.replace(zh,"$1"):o||r)}),e}),Hs=Zh});function Qh(t){return t==null?"":ka(t)}var Gs,Ws=c(()=>{Ba();Gs=Qh});function ty(t,e){return b(t)?t:jt(t,e)?[t]:Hs(Gs(t))}var Qe,ho=c(()=>{U();Xe();js();Ws();Qe=ty});function ry(t){if(typeof t=="string"||Y(t))return t;var e=t+"";return e=="0"&&1/t==-ey?"-0":e}var ey,lt,we=c(()=>{Rt();ey=1/0;lt=ry});function oy(t,e){e=Qe(e,t);for(var r=0,o=e.length;t!=null&&r<o;)t=t[lt(e[r++])];return r&&r==o?t:void 0}var Yt,tr=c(()=>{ho();we();Yt=oy});function ny(t,e,r){var o=t==null?void 0:Yt(t,e);return o===void 0?r:o}var Ks,Ys=c(()=>{tr();Ks=ny});function ay(t,e){for(var r=-1,o=e.length,n=t.length;++r<o;)t[n+r]=e[r];return t}var er,yo=c(()=>{er=ay});function iy(t){return b(t)||Ut(t)||!!(Js&&t&&t[Js])}var Js,qs,Vs=c(()=>{Pt();Ye();U();Js=L?L.isConcatSpreadable:void 0;qs=iy});function Xs(t,e,r,o,n){var a=-1,i=t.length;for(r||(r=qs),n||(n=[]);++a<i;){var s=t[a];e>0&&r(s)?e>1?Xs(s,e-1,r,o,n):er(n,s):o||(n[n.length]=s)}return n}var zs,Zs=c(()=>{yo();Vs();zs=Xs});function sy(t,e,r){var o=-1,n=t.length;e<0&&(e=-e>n?0:n+e),r=r>n?n:r,r<0&&(r+=n),n=e>r?0:r-e>>>0,e>>>=0;for(var a=Array(n);++o<n;)a[o]=t[o+e];return a}var Qs,tc=c(()=>{Qs=sy});function uy(t,e,r){(r?le(t,e,r):e===void 0)?e=1:e=fy(qa(e),0);var o=t==null?0:t.length;if(!o||e<1)return[];for(var n=0,a=0,i=Array(cy(o/e));n<o;)i[a++]=Qs(t,n,n+=e);return i}var cy,fy,go,ec=c(()=>{tc();ao();Va();cy=Math.ceil,fy=Math.max;go=uy});function ly(){this.__data__=new ct,this.size=0}var rc,oc=c(()=>{ye();rc=ly});function py(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}var nc,ac=c(()=>{nc=py});function dy(t){return this.__data__.get(t)}var ic,sc=c(()=>{ic=dy});function my(t){return this.__data__.has(t)}var cc,fc=c(()=>{cc=my});function yy(t,e){var r=this.__data__;if(r instanceof ct){var o=r.__data__;if(!ft||o.length<hy-1)return o.push([t,e]),this.size=++r.size,this;r=this.__data__=new gt(o)}return r.set(t,e),this.size=r.size,this}var hy,uc,lc=c(()=>{ye();ze();Ze();hy=200;uc=yy});function Jt(t){var e=this.__data__=new ct(t);this.size=e.size}var qt,wo=c(()=>{ye();oc();ac();sc();fc();lc();Jt.prototype.clear=rc;Jt.prototype.delete=nc;Jt.prototype.get=ic;Jt.prototype.has=cc;Jt.prototype.set=uc;qt=Jt});function gy(t,e){for(var r=-1,o=t==null?0:t.length,n=0,a=[];++r<o;){var i=t[r];e(i,r,t)&&(a[n++]=i)}return a}var pc,dc=c(()=>{pc=gy});function wy(){return[]}var mc,hc=c(()=>{mc=wy});var xy,_y,yc,Ey,gc,wc=c(()=>{dc();hc();xy=Object.prototype,_y=xy.propertyIsEnumerable,yc=Object.getOwnPropertySymbols,Ey=yc?function(t){return t==null?[]:(t=Object(t),pc(yc(t),function(e){return _y.call(t,e)}))}:mc,gc=Ey});function by(t,e,r){var o=e(t);return b(t)?o:er(o,r(t))}var xc,_c=c(()=>{yo();U();xc=by});function Ay(t){return xc(t,Ht,gc)}var xo,Ec=c(()=>{_c();wc();Ve();xo=Ay});var Sy,rr,bc=c(()=>{at();V();Sy=M(O,"DataView"),rr=Sy});var Ty,or,Ac=c(()=>{at();V();Ty=M(O,"Promise"),or=Ty});var Oy,pt,_o=c(()=>{at();V();Oy=M(O,"Set"),pt=Oy});var Sc,Iy,Tc,Oc,Ic,vc,vy,Cy,Py,Ly,Ny,wt,Eo,Cc=c(()=>{bc();ze();Ac();_o();ni();Lt();oo();Sc="[object Map]",Iy="[object Object]",Tc="[object Promise]",Oc="[object Set]",Ic="[object WeakMap]",vc="[object DataView]",vy=Z(rr),Cy=Z(ft),Py=Z(or),Ly=Z(pt),Ny=Z(je),wt=W;(rr&&wt(new rr(new ArrayBuffer(1)))!=vc||ft&&wt(new ft)!=Sc||or&&wt(or.resolve())!=Tc||pt&&wt(new pt)!=Oc||je&&wt(new je)!=Ic)&&(wt=function(t){var e=W(t),r=e==Iy?t.constructor:void 0,o=r?Z(r):"";if(o)switch(o){case vy:return vc;case Cy:return Sc;case Py:return Tc;case Ly:return Oc;case Ny:return Ic}return e});Eo=wt});var Ry,bo,Pc=c(()=>{V();Ry=O.Uint8Array,bo=Ry});function My(t){return this.__data__.set(t,Dy),this}var Dy,Lc,Nc=c(()=>{Dy="__lodash_hash_undefined__";Lc=My});function ky(t){return this.__data__.has(t)}var Rc,Dc=c(()=>{Rc=ky});function nr(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new gt;++e<r;)this.add(t[e])}var ar,Ao=c(()=>{Ze();Nc();Dc();nr.prototype.add=nr.prototype.push=Lc;nr.prototype.has=Rc;ar=nr});function By(t,e){for(var r=-1,o=t==null?0:t.length;++r<o;)if(e(t[r],r,t))return!0;return!1}var Mc,kc=c(()=>{Mc=By});function Fy(t,e){return t.has(e)}var ir,So=c(()=>{ir=Fy});function Hy(t,e,r,o,n,a){var i=r&$y,s=t.length,f=e.length;if(s!=f&&!(i&&f>s))return!1;var u=a.get(t),l=a.get(e);if(u&&l)return u==e&&l==t;var h=-1,d=!0,y=r&Uy?new ar:void 0;for(a.set(t,e),a.set(e,t);++h<s;){var g=t[h],w=e[h];if(o)var x=i?o(w,g,h,e,t,a):o(g,w,h,t,e,a);if(x!==void 0){if(x)continue;d=!1;break}if(y){if(!Mc(e,function(I,N){if(!ir(y,N)&&(g===I||n(g,I,r,o,a)))return y.push(N)})){d=!1;break}}else if(!(g===w||n(g,w,r,o,a))){d=!1;break}}return a.delete(t),a.delete(e),d}var $y,Uy,sr,To=c(()=>{Ao();kc();So();$y=1,Uy=2;sr=Hy});function jy(t){var e=-1,r=Array(t.size);return t.forEach(function(o,n){r[++e]=[n,o]}),r}var Bc,Fc=c(()=>{Bc=jy});function Gy(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[++e]=o}),r}var Vt,cr=c(()=>{Vt=Gy});function og(t,e,r,o,n,a,i){switch(r){case rg:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case eg:return!(t.byteLength!=e.byteLength||!a(new bo(t),new bo(e)));case Yy:case Jy:case Xy:return Ft(+t,+e);case qy:return t.name==e.name&&t.message==e.message;case zy:case Qy:return t==e+"";case Vy:var s=Bc;case Zy:var f=o&Wy;if(s||(s=Vt),t.size!=e.size&&!f)return!1;var u=i.get(t);if(u)return u==e;o|=Ky,i.set(t,e);var l=sr(s(t),s(e),o,n,a,i);return i.delete(t),l;case tg:if(Oo)return Oo.call(t)==Oo.call(e)}return!1}var Wy,Ky,Yy,Jy,qy,Vy,Xy,zy,Zy,Qy,tg,eg,rg,$c,Oo,Uc,Hc=c(()=>{Pt();Pc();We();To();Fc();cr();Wy=1,Ky=2,Yy="[object Boolean]",Jy="[object Date]",qy="[object Error]",Vy="[object Map]",Xy="[object Number]",zy="[object RegExp]",Zy="[object Set]",Qy="[object String]",tg="[object Symbol]",eg="[object ArrayBuffer]",rg="[object DataView]",$c=L?L.prototype:void 0,Oo=$c?$c.valueOf:void 0;Uc=og});function sg(t,e,r,o,n,a){var i=r&ng,s=xo(t),f=s.length,u=xo(e),l=u.length;if(f!=l&&!i)return!1;for(var h=f;h--;){var d=s[h];if(!(i?d in e:ig.call(e,d)))return!1}var y=a.get(t),g=a.get(e);if(y&&g)return y==e&&g==t;var w=!0;a.set(t,e),a.set(e,t);for(var x=i;++h<f;){d=s[h];var I=t[d],N=e[d];if(o)var P=i?o(N,I,d,e,t,a):o(I,N,d,t,e,a);if(!(P===void 0?I===N||n(I,N,r,o,a):P)){w=!1;break}x||(x=d=="constructor")}if(w&&!x){var T=t.constructor,H=e.constructor;T!=H&&"constructor"in t&&"constructor"in e&&!(typeof T=="function"&&T instanceof T&&typeof H=="function"&&H instanceof H)&&(w=!1)}return a.delete(t),a.delete(e),w}var ng,ag,ig,jc,Gc=c(()=>{Ec();ng=1,ag=Object.prototype,ig=ag.hasOwnProperty;jc=sg});function ug(t,e,r,o,n,a){var i=b(t),s=b(e),f=i?Kc:Eo(t),u=s?Kc:Eo(e);f=f==Wc?fr:f,u=u==Wc?fr:u;var l=f==fr,h=u==fr,d=f==u;if(d&&pe(t)){if(!pe(e))return!1;i=!0,l=!1}if(d&&!l)return a||(a=new qt),i||qe(t)?sr(t,e,r,o,n,a):Uc(t,e,f,r,o,n,a);if(!(r&cg)){var y=l&&Yc.call(t,"__wrapped__"),g=h&&Yc.call(e,"__wrapped__");if(y||g){var w=y?t.value():t,x=g?e.value():e;return a||(a=new qt),n(w,x,r,o,a)}}return d?(a||(a=new qt),jc(t,e,r,o,n,a)):!1}var cg,Wc,Kc,fr,fg,Yc,Jc,qc=c(()=>{wo();To();Hc();Gc();Cc();U();so();lo();cg=1,Wc="[object Arguments]",Kc="[object Array]",fr="[object Object]",fg=Object.prototype,Yc=fg.hasOwnProperty;Jc=ug});function Vc(t,e,r,o,n){return t===e?!0:t==null||e==null||!K(t)&&!K(e)?t!==t&&e!==e:Jc(t,e,r,o,Vc,n)}var ur,Io=c(()=>{qc();Nt();ur=Vc});function dg(t,e,r,o){var n=r.length,a=n,i=!o;if(t==null)return!a;for(t=Object(t);n--;){var s=r[n];if(i&&s[2]?s[1]!==t[s[0]]:!(s[0]in t))return!1}for(;++n<a;){s=r[n];var f=s[0],u=t[f],l=s[1];if(i&&s[2]){if(u===void 0&&!(f in t))return!1}else{var h=new qt;if(o)var d=o(u,l,f,t,e,h);if(!(d===void 0?ur(l,u,lg|pg,o,h):d))return!1}}return!0}var lg,pg,Xc,zc=c(()=>{wo();Io();lg=1,pg=2;Xc=dg});function mg(t){return t===t&&!J(t)}var lr,vo=c(()=>{Mt();lr=mg});function hg(t){for(var e=Ht(t),r=e.length;r--;){var o=e[r],n=t[o];e[r]=[o,n,lr(n)]}return e}var Zc,Qc=c(()=>{vo();Ve();Zc=hg});function yg(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}var pr,Co=c(()=>{pr=yg});function gg(t){var e=Zc(t);return e.length==1&&e[0][2]?pr(e[0][0],e[0][1]):function(r){return r===t||Xc(r,t,e)}}var tf,ef=c(()=>{zc();Qc();Co();tf=gg});function wg(t,e){return t!=null&&e in Object(t)}var rf,of=c(()=>{rf=wg});function xg(t,e,r){e=Qe(e,t);for(var o=-1,n=e.length,a=!1;++o<n;){var i=lt(e[o]);if(!(a=t!=null&&r(t,i)))break;t=t[i]}return a||++o!=n?a:(n=t==null?0:t.length,!!n&&$t(n)&&Bt(i,n)&&(b(t)||Ut(t)))}var nf,af=c(()=>{ho();Ye();U();Ge();Ke();we();nf=xg});function _g(t,e){return t!=null&&nf(t,e,rf)}var sf,cf=c(()=>{of();af();sf=_g});function Ag(t,e){return jt(t)&&lr(e)?pr(lt(t),e):function(r){var o=Ks(r,t);return o===void 0&&o===e?sf(r,t):ur(e,o,Eg|bg)}}var Eg,bg,ff,uf=c(()=>{Io();Ys();cf();Xe();vo();Co();we();Eg=1,bg=2;ff=Ag});function Sg(t){return function(e){return e?.[t]}}var lf,pf=c(()=>{lf=Sg});function Tg(t){return function(e){return Yt(e,t)}}var df,mf=c(()=>{tr();df=Tg});function Og(t){return jt(t)?lf(lt(t)):df(t)}var hf,yf=c(()=>{pf();mf();Xe();we();hf=Og});function Ig(t){return typeof t=="function"?t:t==null?nt:typeof t=="object"?b(t)?ff(t[0],t[1]):tf(t):hf(t)}var dt,xe=c(()=>{ef();uf();fe();U();yf();dt=Ig});function vg(t,e,r,o){for(var n=-1,a=t==null?0:t.length;++n<a;){var i=t[n];e(o,i,r(i),t)}return o}var gf,wf=c(()=>{gf=vg});function Cg(t){return function(e,r,o){for(var n=-1,a=Object(e),i=o(e),s=i.length;s--;){var f=i[t?s:++n];if(r(a[f],f,a)===!1)break}return e}}var xf,_f=c(()=>{xf=Cg});var Pg,Ef,bf=c(()=>{_f();Pg=xf(),Ef=Pg});function Lg(t,e){return t&&Ef(t,e,Ht)}var Af,Sf=c(()=>{bf();Ve();Af=Lg});function Ng(t,e){return function(r,o){if(r==null)return r;if(!it(r))return t(r,o);for(var n=r.length,a=e?n:-1,i=Object(r);(e?a--:++a<n)&&o(i[a],a,i)!==!1;);return r}}var Tf,Of=c(()=>{ue();Tf=Ng});var Rg,dr,Po=c(()=>{Sf();Of();Rg=Tf(Af),dr=Rg});function Dg(t,e,r,o){return dr(t,function(n,a,i){e(o,n,r(n),i)}),o}var If,vf=c(()=>{Po();If=Dg});function Mg(t,e){return function(r,o){var n=b(r)?gf:If,a=e?e():{};return n(r,t,dt(o,2),a)}}var Cf,Pf=c(()=>{wf();vf();xe();U();Cf=Mg});function kg(t,e,r){for(var o=-1,n=t==null?0:t.length;++o<n;)if(r(e,t[o]))return!0;return!1}var Lf,Nf=c(()=>{Lf=kg});function Bg(t,e){var r=-1,o=it(t)?Array(t.length):[];return dr(t,function(n,a,i){o[++r]=e(n,a,i)}),o}var Rf,Df=c(()=>{Po();ue();Rf=Bg});var Fg,$g,Ug,Lo,Mf=c(()=>{vi();Pf();Fg=Object.prototype,$g=Fg.hasOwnProperty,Ug=Cf(function(t,e,r){$g.call(t,r)?t[r].push(e):Ii(t,r,[e])}),Lo=Ug});function Hg(t,e){for(var r,o=-1,n=t.length;++o<n;){var a=e(t[o]);a!==void 0&&(r=r===void 0?a:r+a)}return r}var kf,Bf=c(()=>{kf=Hg});function jg(t,e){var r=t.length;for(t.sort(e);r--;)t[r]=t[r].value;return t}var Ff,$f=c(()=>{Ff=jg});function Gg(t,e){if(t!==e){var r=t!==void 0,o=t===null,n=t===t,a=Y(t),i=e!==void 0,s=e===null,f=e===e,u=Y(e);if(!s&&!u&&!a&&t>e||a&&i&&f&&!s&&!u||o&&i&&f||!r&&f||!n)return 1;if(!o&&!a&&!u&&t<e||u&&r&&n&&!o&&!a||s&&r&&n||!i&&n||!f)return-1}return 0}var Uf,Hf=c(()=>{Rt();Uf=Gg});function Wg(t,e,r){for(var o=-1,n=t.criteria,a=e.criteria,i=n.length,s=r.length;++o<i;){var f=Uf(n[o],a[o]);if(f){if(o>=s)return f;var u=r[o];return f*(u=="desc"?-1:1)}}return t.index-e.index}var jf,Gf=c(()=>{Hf();jf=Wg});function Kg(t,e,r){e.length?e=Dt(e,function(a){return b(a)?function(i){return Yt(i,a.length===1?a[0]:a)}:a}):e=[nt];var o=-1;e=Dt(e,Je(dt));var n=Rf(t,function(a,i,s){var f=Dt(e,function(u){return u(a)});return{criteria:f,index:++o,value:a}});return Ff(n,function(a,i){return jf(a,i,r)})}var Wf,Kf=c(()=>{eo();tr();xe();Df();$f();co();Gf();fe();U();Wf=Kg});var Yg,No,Yf=c(()=>{Zs();Kf();Ri();ao();Yg=Ni(function(t,e){if(t==null)return[];var r=e.length;return r>1&&le(t,e[0],e[1])?e=[]:r>2&&le(e[0],e[1],e[2])&&(e=[e[0]]),Wf(t,zs(e,1),[])}),No=Yg});function Jg(t,e){return t&&t.length?kf(t,dt(e,2)):0}var Ro,Jf=c(()=>{xe();Bf();Ro=Jg});var qg,Vg,qf,Vf=c(()=>{_o();ci();cr();qg=1/0,Vg=pt&&1/Vt(new pt([,-0]))[1]==qg?function(t){return new pt(t)}:si,qf=Vg});function zg(t,e,r){var o=-1,n=Ti,a=t.length,i=!0,s=[],f=s;if(r)i=!1,n=Lf;else if(a>=Xg){var u=e?null:qf(t);if(u)return Vt(u);i=!1,n=ir,f=new ar}else f=e?[]:s;t:for(;++o<a;){var l=t[o],h=e?e(l):l;if(l=r||l!==0?l:0,i&&h===h){for(var d=f.length;d--;)if(f[d]===h)continue t;e&&f.push(h),s.push(l)}else n(f,h,r)||(f!==s&&f.push(h),s.push(l))}return s}var Xg,Xf,zf=c(()=>{Ao();Oi();Nf();So();Vf();cr();Xg=200;Xf=zg});function Zg(t,e){return t&&t.length?Xf(t,dt(e,2)):[]}var Do,Zf=c(()=>{xe();zf();Do=Zg});var mr=c(()=>{ec();Mf();Yf();Jf();Zf();});import{readFile as Qg}from"node:fs/promises";function ew(t){let e=[];return t.sectionHeading&&e.push(`[Section: ${t.sectionHeading}]`),t.contextualPrefix&&e.push(t.contextualPrefix),e.push(t.content),e.join(`
|
|
89
|
+
`)}function rw(t,e,r){return`${t}
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
${e}
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
Respond with ONLY a JSON array of facts. Each fact object must have exactly these fields:
|
|
98
|
+
- "content" (string): the atomic fact statement
|
|
99
|
+
- "category" (string): one of ${r.join(", ")}
|
|
100
|
+
- "confidence" (string): one of high, medium, low
|
|
101
|
+
- "importance" (string): "vital" if essential to understanding the topic, "supplementary" if supporting detail
|
|
102
|
+
|
|
103
|
+
Output the JSON array directly, no explanation or wrapping.`}function ow(t,e){let r=Array.isArray(t)?t:Array.isArray(t?.facts)?t.facts:null;return r?r.filter(o=>o.content&&e.includes(o.category)&&["high","medium","low"].includes(o.confidence)).map(o=>({...o,importance:["vital","supplementary"].includes(o.importance)?o.importance:"supplementary"})):[]}async function nw(t,e,r){let o=ew(t),n=rw(e,o,r),a=await yt(n,{model:p.llm.extractionModel,caller:"extractor"});return ow(a,r).map(s=>({...s,sourceSection:t.sectionHeading||null}))}async function Qf(t,{promptPath:e,categories:r}){if(!t.length)return[];let o=await Qg(e,"utf8"),n=go(t,tw),a=[];for(let i of n){let s=await Promise.all(i.map(f=>nw(f,o,r).catch(u=>(console.error(`[extractor] chunk failed: ${u.message}`),[]))));a.push(...s.flat())}return a}var tw,tu=c(()=>{mr();ot();_();tw=5});import{readFile as aw}from"node:fs/promises";import iw from"node:path";async function ou({content:t,category:e,confidence:r,importance:o,namespace:n,sourceDocumentIds:a,sourceSection:i,embedding:s}){let f=s||await Be(t),u=await pw(f,{namespace:n});if(!u.length)return{action:"ADD",fact:await hr({content:t,category:e,confidence:r,importance:o,namespace:n,sourceDocumentIds:a,sourceSection:i,embedding:f})};let l=u[0];if(l.similarity>=cw)return{action:"SKIP",existing:l};if(l.similarity>=ru){let d=await fw(t,l.content);if(d==="UPDATE"){let y=await hr({content:t,category:e,confidence:r,importance:o,namespace:n,sourceDocumentIds:a,sourceSection:i,embedding:f});return await lw(l.id,y.id),await eu({targetType:"fact",targetId:l.id,event:"UPDATE",oldContent:l.content,newContent:t,triggeredBy:`audm:sim=${l.similarity.toFixed(3)}`}),{action:"UPDATE",fact:y,supersededId:l.id}}if(d==="CONTRADICT"){let y=await hr({content:t,category:e,confidence:r,importance:o,namespace:n,sourceDocumentIds:a,sourceSection:i,embedding:f});return await uw(l.id,y.id),await eu({targetType:"fact",targetId:l.id,event:"CONTRADICT",oldContent:l.content,newContent:t,triggeredBy:`audm:sim=${l.similarity.toFixed(3)}`}),{action:"CONTRADICT",fact:y,contradictedId:l.id}}}return{action:"ADD",fact:await hr({content:t,category:e,confidence:r,importance:o,namespace:n,sourceDocumentIds:a,sourceSection:i,embedding:f})}}async function fw(t,e){let o=`${await aw(sw,"utf8")}
|
|
104
|
+
|
|
105
|
+
**EXISTING FACT:** ${e}
|
|
106
|
+
|
|
107
|
+
**NEW FACT:** ${t}`,a=(await ht(o,{model:p.llm.decisionModel,caller:"audm"})).trim().toUpperCase();return a.includes("UPDATE")?"UPDATE":a.includes("CONTRADICT")?"CONTRADICT":"ADD"}async function hr({content:t,category:e,confidence:r,importance:o,namespace:n,sourceDocumentIds:a,sourceSection:i,embedding:s}){let f=`fact-${rt(16)}`,[u]=await m("fact").insert({uid:f,content:t,category:e,confidence:r||"medium",importance:o||"supplementary",namespace:n,status:"active",sourceDocumentIds:a||[],sourceSection:i||null,embedding:$(s),validFrom:new Date}).returning("*");return await m.raw(`
|
|
108
|
+
UPDATE fact
|
|
109
|
+
SET search_vector = to_tsvector('english', content)
|
|
110
|
+
WHERE id = ?
|
|
111
|
+
`,[u.id]),u}async function uw(t,e){await m("fact").where({id:t}).update({status:"contradicted",contradictedById:e,validUntil:m.fn.now()})}async function lw(t,e){await m("fact").where({id:t}).update({status:"superseded",supersededById:e,validUntil:m.fn.now()})}async function pw(t,{namespace:e,threshold:r=ru,limit:o=5}){let n=$(t),a=`${It("embedding")} <=> ${vt()}`;return m.transaction(async i=>{await i.raw("SET LOCAL hnsw.ef_search = 40");let{rows:s}=await i.raw(`
|
|
112
|
+
SELECT id, uid, content, category, status,
|
|
113
|
+
1 - (${a}) as similarity
|
|
114
|
+
FROM fact
|
|
115
|
+
WHERE namespace = ?
|
|
116
|
+
AND status = 'active'
|
|
117
|
+
AND embedding IS NOT NULL
|
|
118
|
+
AND 1 - (${a}) >= ?
|
|
119
|
+
ORDER BY ${a}
|
|
120
|
+
LIMIT ?
|
|
121
|
+
`,[n,e,n,r,n,o]);return s})}async function eu({targetType:t,targetId:e,event:r,oldContent:o,newContent:n,triggeredBy:a}){await m("history").insert({targetType:t,targetId:e,event:r,oldContent:o||null,newContent:n||null,triggeredBy:a||null})}var sw,cw,ru,nu=c(()=>{Zt();S();Fe();ot();Ct();_();B();sw=iw.join(q,"audm-decision.md"),cw=p.memory.skipThreshold,ru=p.memory.ambiguousThreshold});var yr,dw,TC,au,Mo=c(()=>{yr={preference:"Personal likes, dislikes, favorites, preferred tools/foods/methods",opinion:"Personal views, assessments, evaluations of tools/concepts/approaches",personal:"Personal facts \u2014 birthday, workplace, location, biographical details",experience:"Personal experiences \u2014 projects built, tools used, skills acquired",business_rule:"Organizational rules, policies, constraints",workflow:"Process flows, state transitions, procedures",architecture:"System design, service interactions, infrastructure",convention:"Coding patterns, naming rules, team standards",decision:"Why choices were made, tradeoffs considered",domain_knowledge:"Domain-specific terminology and concepts",key_insight:"Important takeaways, notable explanations",metric:"Quantitative data, measurements, statistics",issue:"Known problems, bugs, limitations, risks",action_item:"Tasks, follow-ups, assignments, deadlines"},dw=["preference","opinion","personal","experience"],TC=Object.keys(yr).filter(t=>!dw.includes(t)),au=yr});import{readFile as mw}from"node:fs/promises";import{join as hw}from"node:path";async function su(t,{title:e}={}){if(!t?.trim()||t.trim().length<gw)return{route:"noise",facts:[],entities:[],reasoning:"Empty or too short"};if(t.length>ww)return{route:"knowledge",facts:[],entities:[],reasoning:"Long content \u2014 auto-routed to full pipeline"};let o=`${await mw(yw,"utf8")}
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
Title: ${e||"(none)"}
|
|
126
|
+
Input: ${t}
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
Respond with ONLY a JSON object: { "route": "thought|knowledge|noise", "facts": [{"content":"...","category":"...","confidence":"high|medium|low","importance":"vital|supplementary"}], "entities": ["..."], "reasoning": "..." }`;try{let n=await yt(o,{model:p.llm.extractionModel,caller:"classifier"});if(!n||!xw.includes(n.route))return iu("Invalid classification result");let a=Object.keys(au),i=n.route==="thought"&&Array.isArray(n.facts)?n.facts.filter(s=>s.content&&a.includes(s.category)).map(s=>({...s,confidence:["high","medium","low"].includes(s.confidence)?s.confidence:"high",importance:["vital","supplementary"].includes(s.importance)?s.importance:"vital"})):[];return{route:n.route,facts:i,entities:Array.isArray(n.entities)?n.entities:[],reasoning:n.reasoning||""}}catch(n){return console.error("[input-classifier] Failed:",n.message),iu(n.message)}}function iu(t){return{route:"knowledge",facts:[],entities:[],reasoning:`Fallback \u2014 ${t}`}}var yw,gw,ww,xw,cu=c(()=>{ot();_();Mo();B();yw=hw(q,"input-classifier.md"),gw=3,ww=2e3,xw=["thought","knowledge","noise"]});var fu={};A(fu,{findById:()=>tt,findByName:()=>_e,findByUid:()=>_w,findSimilar:()=>Ew,getCanonicalEntity:()=>_t,getEntityCount:()=>Sw,incrementMentionCount:()=>Ee,insertEntity:()=>ko,listByType:()=>Aw,pushAlias:()=>gr,searchByName:()=>Tw,updateDescription:()=>bw,updateEntityTypes:()=>xt,updateName:()=>Bo});async function ko({name:t,entityType:e,description:r,namespace:o,externalId:n,embedding:a}){let i=`ent-${rt(16)}`,[s]=await m("entity").insert({uid:i,name:t,entityType:e,description:r||null,namespace:o||p.defaults.namespace,externalId:n||null,mentionCount:1,embedding:$(a)}).returning("*");return s}async function _e(t,e){let r=e||p.defaults.namespace,o=t.toLowerCase();return m("entity").where({namespace:r}).whereNull("mergedWith").where(function(){this.whereRaw("LOWER(name) = ?",[o]).orWhereRaw("aliases @> ARRAY[?]::text[]",[o])}).first()||null}async function gr(t,e){if(!e)return;let r=e.toLowerCase();await m.raw(`
|
|
131
|
+
UPDATE entity
|
|
132
|
+
SET aliases = (
|
|
133
|
+
SELECT ARRAY(SELECT DISTINCT unnest(aliases || ARRAY[?]::text[]))
|
|
134
|
+
)
|
|
135
|
+
WHERE id = ?
|
|
136
|
+
`,[r,t])}async function Bo(t,e){await m("entity").where({id:t}).update({name:e})}async function _w(t){return m("entity").where({uid:t}).first()||null}async function tt(t){return m("entity").where({id:t}).first()||null}async function Ew(t,{entityType:e,namespace:r,threshold:o=.85,limit:n=3}){let a=$(t),i=`${It("embedding")} <=> ${vt()}`,{rows:s}=await m.raw(`
|
|
137
|
+
SELECT id, uid, name, entity_type AS "entityType", description,
|
|
138
|
+
mention_count AS "mentionCount",
|
|
139
|
+
1 - (${i}) AS similarity
|
|
140
|
+
FROM entity
|
|
141
|
+
WHERE entity_type = ?
|
|
142
|
+
AND namespace = COALESCE(?, ?)
|
|
143
|
+
AND embedding IS NOT NULL
|
|
144
|
+
AND merged_with IS NULL
|
|
145
|
+
AND 1 - (${i}) >= ?
|
|
146
|
+
ORDER BY ${i}
|
|
147
|
+
LIMIT ?
|
|
148
|
+
`,[a,e,r,p.defaults.namespace,a,o,a,n]);return s}async function Ee(t){await m("entity").where({id:t}).increment("mentionCount",1)}async function bw(t,e){await m("entity").where({id:t}).update({description:e})}async function Aw(t,{namespace:e,limit:r=50}={}){let o=m("entity").where({entityType:t}).whereNull("mergedWith").orderBy("mentionCount","desc").limit(r);return e&&o.where({namespace:e}),o}async function Sw(t){let[{count:e}]=await m("entity").where({entityType:t}).whereNull("mergedWith").count("id as count");return Number(e)}async function Tw(t,{entityType:e,namespace:r,limit:o=10}={}){let n=m("entity").whereRaw("LOWER(name) LIKE ?",[`%${t.toLowerCase()}%`]).whereNull("mergedWith").orderBy("mentionCount","desc").limit(o);return e&&n.where({entityType:e}),r&&n.where({namespace:r}),n}async function xt(t,e){let r=await tt(t);if(!r)return;let o;try{o=r.entityTypes?JSON.parse(r.entityTypes):[r.entityType]}catch{o=[r.entityType]}o.includes(e)||(o.push(e),await m("entity").where({id:t}).update({entityTypes:JSON.stringify(o)}))}async function _t(t){let e=await tt(t);for(;e?.mergedWith;)e=await tt(e.mergedWith);return e}var wr=c(()=>{Zt();S();Ct();_()});async function uu(t,e,{namespace:r,threshold:o=Ow,limit:n=5}){if(!e)return[];let a=$(e),i=`${It("embedding")} <=> ${vt()}`,{rows:s}=await m.raw(`
|
|
149
|
+
SELECT id, name, entity_type AS "entityType", entity_types AS "entityTypes",
|
|
150
|
+
1 - (${i}) AS similarity
|
|
151
|
+
FROM entity
|
|
152
|
+
WHERE namespace = ?
|
|
153
|
+
AND embedding IS NOT NULL
|
|
154
|
+
AND LOWER(name) != LOWER(?)
|
|
155
|
+
AND merged_with IS NULL
|
|
156
|
+
AND 1 - (${i}) >= ?
|
|
157
|
+
ORDER BY ${i}
|
|
158
|
+
LIMIT ?
|
|
159
|
+
`,[a,r,t,a,o,a,n]);return s.map(f=>{let u;try{u=f.entityTypes?JSON.parse(f.entityTypes):[f.entityType]}catch{u=[f.entityType]}return{...f,types:u}})}async function Fo(t,e,r,o){let n=(r.aliases||[]).filter(Boolean),a=n.length?`Existing aliases: ${n.join(", ")}`:"",i=r.similarity>0?`Name-embedding similarity: ${(r.similarity*100).toFixed(0)}%`:"Name-embedding similarity: not directly measured (LLM judging on episode text alone)",s=o?`
|
|
160
|
+
Source passage where the new mention appeared:
|
|
161
|
+
---
|
|
162
|
+
${o.slice(0,1500)}
|
|
163
|
+
---
|
|
164
|
+
`:"",f=`You're deciding whether two entity mentions refer to the same real-world thing, and whether the source passage indicates a RENAME.
|
|
165
|
+
|
|
166
|
+
Mention A (new): "${t}" (type: ${e})
|
|
167
|
+
Mention B (existing): "${r.name}" (types: ${(r.types||[r.entityType]).join(", ")})
|
|
168
|
+
${a}
|
|
169
|
+
${i}
|
|
170
|
+
${s}
|
|
171
|
+
Decision rules:
|
|
172
|
+
- "same" = true when both mentions refer to the same person/product/concept/thing \u2014 including renames, abbreviations ("NYC" / "New York City"), and common-knowledge equivalents.
|
|
173
|
+
- "rename" = true ONLY when "same" is true AND the source passage says one name has replaced the other ("X is now named Y", "X was renamed to Y", "we renamed X to Y", "X used to be called Y", etc.). A normal synonym match is NOT a rename.
|
|
174
|
+
- "current_name" = which of A or B is the new/canonical name per the source passage (the one we want as \`entity.name\` going forward). Only meaningful when "rename" is true. Use the literal string of mention A or B.
|
|
175
|
+
- If you cannot tell, "same" is false. Don't guess.
|
|
176
|
+
|
|
177
|
+
Respond as STRICT JSON, no markdown, no prose:
|
|
178
|
+
{"same": boolean, "rename": boolean, "current_name": "<one of A or B verbatim, or null>", "reason": "one short sentence"}`,u;try{u=await ht(f,{model:p.llm.entityModel,caller:"entity-matcher"})}catch{return{same:!1,rename:!1,reason:"llm-error"}}let l=Iw(u);return l&&typeof l.same=="boolean"?{same:l.same===!0,rename:l.rename===!0&&l.same===!0,currentName:typeof l.current_name=="string"?l.current_name:null,reason:typeof l.reason=="string"?l.reason:""}:{same:/^\s*(yes|true)\b/i.test(u),rename:!1,currentName:null,reason:"fallback-text-match"}}function Iw(t){if(typeof t!="string")return null;try{return JSON.parse(t.trim())}catch{}let e=t.match(/\{[\s\S]*\}/);if(e)try{return JSON.parse(e[0])}catch{}return null}var Ow,lu=c(()=>{S();ot();Ct();_();Ow=.85});var pu={};A(pu,{followMergeChain:()=>Lw,mergeEntities:()=>vw});async function vw(t,e){let[r,o]=await Promise.all([tt(t),tt(e)]);if(!r||!o)throw new Error(`Entity ${t} or ${e} not found`);if(t===e)return r;let n=(r.mentionCount||0)+(o.mentionCount||0);await m.transaction(async i=>{await i("relation").where({sourceId:e}).update({sourceId:t}),await i("relation").where({targetId:e}).update({targetId:t}),await i("relation").whereRaw("source_id = target_id").del(),await i.raw(`
|
|
179
|
+
INSERT INTO fact_entity (fact_id, entity_id, mention_type, mention_count, created_at, updated_at)
|
|
180
|
+
SELECT fact_id, ?, mention_type, mention_count, NOW(), NOW()
|
|
181
|
+
FROM fact_entity
|
|
182
|
+
WHERE entity_id = ?
|
|
183
|
+
ON CONFLICT (fact_id, entity_id, mention_type)
|
|
184
|
+
DO UPDATE SET mention_count = fact_entity.mention_count + EXCLUDED.mention_count
|
|
185
|
+
`,[t,e]),await i("fact_entity").where({entityId:e}).del(),await i("entity").where({id:t}).update({mentionCount:n}),await i("pod").where({entityId:t,status:"active"}).first()?await i("pod").where({entityId:e}).update({status:"archived",updatedAt:i.fn.now()}):await i("pod").where({entityId:e}).update({entityId:t,updatedAt:i.fn.now()}),await i("entity").where({id:e}).update({mergedWith:t})}),await Pw(t);let a=Cw(o);for(let i of a)await xt(t,i);return console.log(`[entity-merge] Merged ${e} (${o.name}) into ${t} (${r.name})`),{...r,mentionCount:n}}function Cw(t){if(!t.entityTypes)return[t.entityType];try{return JSON.parse(t.entityTypes)}catch{return[t.entityType]}}async function Pw(t){let e=await m("relation").where(function(){this.where({sourceId:t}).orWhere({targetId:t})}).whereNull("invalidAt"),r=Lo(e,o=>`${o.sourceId}-${o.targetId}-${o.relationType}`);for(let o of Object.values(r)){if(o.length<=1)continue;let[n,...a]=No(o,"id"),i=Ro(o,"mentionCount");await m("relation").where({id:n.id}).update({mentionCount:i}),await m("relation").whereIn("id",a.map(s=>s.id)).del()}}async function Lw(t){let e=await tt(t),r=[e?.id];for(;e?.mergedWith;)e=await tt(e.mergedWith),e&&r.push(e.id);return{canonical:e,chain:r}}var du=c(()=>{mr();S();wr()});import{readFile as Nw}from"node:fs/promises";async function be({name:t,entityType:e,description:r,namespace:o,externalId:n,embedding:a,episodeText:i,episodeEntityIds:s=[]}){let f=o||p.defaults.namespace,u=await _e(t,f);if(u)return u=await _t(u.id),await Ee(u.id),u.entityType!==e&&await xt(u.id,e),u;let l=a||await Be(`${e}: ${t}`),h=await uu(t,l,{namespace:f,limit:3});for(let g of h){let w=await Fo(t,e,g,i);if(w.same)return mu(g,{newName:t,entityType:e,isRename:w.rename,currentName:w.currentName})}let d=new Set(h.map(g=>g.id)),y=s.filter(g=>g!=null&&!d.has(g));for(let g of y){let w=await _t(g);if(!w||w.namespace!==f||w.name?.toLowerCase()===t.toLowerCase())continue;let x=await Fo(t,e,{...w,types:Rw(w),similarity:0},i);if(x.same)return mu(w,{newName:t,entityType:e,isRename:x.rename,currentName:x.currentName})}try{return await ko({name:t,entityType:e,description:r,namespace:f,externalId:n,embedding:l})}catch(g){if(hu(g)){let w=await _e(t,f);if(w){let x=await _t(w.id);return await Ee(x.id),await xt(x.id,e),x}}throw g}}function hu(t){return t?!!(t.code==="23505"||typeof t.message=="string"&&t.message.includes("duplicate key value violates unique constraint")):!1}async function mu(t,{newName:e,entityType:r,isRename:o,currentName:n}){let a=await _t(t.id);if(await Ee(a.id),await xt(a.id,r),o&&a.name&&a.name.toLowerCase()!==e.toLowerCase()){let i=e.toLowerCase(),s=a.name.toLowerCase(),f=(n||"").toLowerCase(),u,l;if(f===i?(u=e,l=a.name):f===s?(u=a.name,l=e):(u=e,l=a.name),l&&l.toLowerCase()!==u.toLowerCase()&&(await gr(a.id,l),a.aliases=[...a.aliases||[],l.toLowerCase()]),u!==a.name)try{await Bo(a.id,u),a.name=u}catch(h){if(hu(h)){let d=await _e(u,a.namespace);if(d&&d.id!==a.id){let{mergeEntities:y}=await Promise.resolve().then(()=>(du(),pu));return await y(d.id,a.id),await gr(d.id,a.name),await _t(d.id)}}throw h}}return a}function Rw(t){if(t.entityTypes)try{return JSON.parse(t.entityTypes)}catch{}return[t.entityType]}async function $o(t,{promptPath:e,namespace:r}){if(!t.length)return[];let o=t.map(d=>`- [${d.category}] ${d.content}`).join(`
|
|
186
|
+
`),a=`${await Nw(e,"utf8")}
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
${o}`,i=await ht(a,{model:p.llm.entityModel,caller:"entity-resolver"}),s=ke(i);if(!Array.isArray(s))return[];let f=s.filter(d=>d.name);if(!f.length)return[];let u=new Array(f.length),l=[],h=[];for(let d=0;d<f.length;d++){let y=await Dw(f[d].name,r);y?(u[d]=y,l.push(y.id)):h.push(d)}for(let d of h){let y=f[d],g=await be({name:y.name,entityType:"topic",description:y.description||null,namespace:r,episodeText:o,episodeEntityIds:l});u[d]=g,g?.id&&l.push(g.id)}return u.filter(Boolean)}async function Dw(t,e){let{findByName:r,getCanonicalEntity:o,incrementMentionCount:n}=await Promise.resolve().then(()=>(wr(),fu)),a=await r(t,e);if(!a)return null;let i=await o(a.id);return await n(i.id),i}var yu=c(()=>{Fe();ot();_();wr();lu()});async function xr({sourceId:t,targetId:e,relationType:r,sourceFactId:o,validAt:n}){let{rows:[a]}=await m.raw(`
|
|
191
|
+
INSERT INTO relation (source_id, target_id, relation_type, source_fact_id, mention_count, valid_at, created_at, updated_at)
|
|
192
|
+
VALUES (?, ?, ?, ?, 1, ?, NOW(), NOW())
|
|
193
|
+
ON CONFLICT (source_id, target_id, relation_type) DO UPDATE SET
|
|
194
|
+
mention_count = relation.mention_count + 1,
|
|
195
|
+
source_fact_id = COALESCE(EXCLUDED.source_fact_id, relation.source_fact_id),
|
|
196
|
+
updated_at = NOW()
|
|
197
|
+
RETURNING *
|
|
198
|
+
`,[t,e,r,o||null,n||null]);return a}var gu=c(()=>{S()});async function _r(t,e){if(!e.length)return;let r=Do(e,"id"),o=r.map(n=>({factId:t,entityId:n.id,mentionType:"content",mentionCount:1}));await m("fact_entity").insert(o).onConflict(m.raw("(fact_id, entity_id, mention_type)")).merge({mentionCount:m.raw("fact_entity.mention_count + 1")}),await Mw(t,r)}async function Mw(t,e){let r=e.map(n=>n.id).filter(Boolean);if(!r.length)return;let o=await m("pod").whereIn("entityId",r).where({status:"active"}).select("id");for(let{id:n}of o)await oe(n,t,"mention")}var wu=c(()=>{mr();S();Re()});import kw from"node:path";async function Go(t,e,r,o){let{title:n,sourceType:a,metadata:i={}}=t,s=e.filter(d=>d.action==="ADD"||d.action==="UPDATE"),f=s.map(d=>d.fact||d.existing).filter(Boolean),l=s.find(d=>d.fact)?.fact?.id||null,h=new Date().toISOString().split("T")[0];return o?.items?.length?Bw({entityDefs:o,factObjects:f,firstFactId:l,namespace:r,today:h}):Fw({title:n,sourceType:a,metadata:i,factObjects:f,firstFactId:l,namespace:r,today:h})}async function Bw({entityDefs:t,factObjects:e,firstFactId:r,namespace:o,today:n}){let a={},i=0,s=e.map(d=>d.content).filter(Boolean).join(`
|
|
199
|
+
`),f=[];for(let d of t.items){let y=await be({name:d.name,entityType:d.type,description:d.description,namespace:o,episodeText:s,episodeEntityIds:f});a[d.name]=y,y?.id&&f.push(y.id)}for(let d of t.relations||[]){let y=a[d.source],g=a[d.target];if(!y||!g)continue;let w=Uo(e,d.source)||Uo(e,d.target);await xr({sourceId:y.id,targetId:g.id,relationType:d.type,sourceFactId:w?.id||r,validAt:n}),i++}let u=await jo(e,o),l=Ho(Object.values(a),u),h=0;for(let d of e){let y=l.filter(g=>Er(d.content,g));y.length&&(await _r(d.id,y),h+=y.length)}return{entityCount:l.length,relationCount:i,factEntityLinks:h,topics:l.filter(d=>d.entityType==="topic").map(d=>d.name)}}async function Fw({title:t,sourceType:e,metadata:r,factObjects:o,firstFactId:n,namespace:a,today:i}){if(!t){let x=o.length?await $o(o,{promptPath:xu,namespace:a}):[],I=await jo(o,a),N=Ho(x,I),P=0;for(let T of o){let H=N.filter(Ar=>Er(T.content,Ar));H.length&&(await _r(T.id,H),P+=H.length)}return{entityCount:N.length,relationCount:0,factEntityLinks:P,topics:x.map(T=>T.name)}}let s=o.map(x=>x.content).filter(Boolean).join(`
|
|
200
|
+
`).slice(0,2e3),f=await be({name:t,entityType:"document",description:`${e} document: ${t}`,namespace:a,episodeText:s}),u=null;r.author&&(u=await be({name:r.author,entityType:"person",namespace:a,episodeText:s,episodeEntityIds:f?.id?[f.id]:[]}));let l=o.length?await $o(o,{promptPath:xu,namespace:a}):[],h=0;u&&(await xr({sourceId:f.id,targetId:u.id,relationType:"AUTHORED_BY",sourceFactId:n,validAt:i}),h++);for(let x of l){let I=Uo(o,x.name);await xr({sourceId:f.id,targetId:x.id,relationType:"COVERS",sourceFactId:I?.id||n,validAt:i}),h++}let d=[f,u,...l].filter(Boolean),y=await jo(o,a),g=Ho(d,y),w=0;for(let x of o){let I=g.filter(N=>Er(x.content,N));I.length&&(await _r(x.id,I),w+=I.length)}return{entityCount:g.length,relationCount:h,factEntityLinks:w,topics:l.map(x=>x.name)}}function Uo(t,e){if(!e)return null;let r=e.toLowerCase();return t.find(o=>o.content?.toLowerCase().includes(r))||null}function Er(t,e){if(!t||!e?.name)return!1;let r=t.toLowerCase();return[e.name.toLowerCase(),...e.aliases||[]].some(n=>n?new RegExp(`\\b${$w(n)}\\b`).test(r):!1)}function $w(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ho(...t){let e=new Set,r=[];for(let o of t)for(let n of o)!n||e.has(n.id)||(e.add(n.id),r.push(n));return r}async function jo(t,e){if(!t?.length)return[];let r=await m("entity as e").join("pod as p","p.entity_id","e.id").where("p.status","active").where("e.namespace",e).whereNull("e.mergedWith").select("e.id","e.uid","e.name","e.entityType","e.aliases");return r.length?r.filter(o=>t.some(n=>Er(n.content,o))):[]}var xu,_u=c(()=>{yu();gu();wu();B();S();xu=kw.join(q,"entity-extraction.md")});var Uw,Eu,Wo=c(()=>{S();_();Uw=1440*60*1e3,Eu={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(t={})=>{let e=t.namespace||p.defaults.namespace;try{let r=new Date(Date.now()-Uw);return(await m("pod as p").join("pod_membership as pm","pm.pod_id","p.id").join("fact_lifecycle as fl","fl.fact_id","pm.member_id").where("pm.memberType","fact").where("p.podType","person").where("p.namespace",e).where("p.status","active").where("fl.lastAccessedAt",">=",r).distinct("p.uid")).map(n=>n.uid)}catch{return[]}}}});async function bu(t,e){if(!t||typeof t!="object")return[];let r=[],o=e||p.defaults.namespace;if(t.slack?.team_id&&t.connection_id){let n=await ee({podType:"connector_workspace",externalId:`slack:${t.slack.team_id}`,namespace:o});n&&r.push({podId:n.id,role:"primary"})}if(t.github?.org&&t.connection_id){let n=await ee({podType:"connector_workspace",externalId:`github:${t.github.org}`,namespace:o});n&&r.push({podId:n.id,role:"primary"})}return r}var Au=c(()=>{At();Wo();_()});var Ou={};A(Ou,{ingestDocument:()=>Kw});import{createHash as jw}from"node:crypto";import{join as Gw}from"node:path";async function Kw({content:t,title:e,sourcePath:r,sourceType:o="raw",contentType:n,namespace:a,metadata:i={},promptPath:s,categories:f,entities:u,skipFacts:l=!1,skipEntities:h=!1,skipContextualization:d=!1,classify:y=!0,podUids:g=[],resolvePodsFrom:w=null}){let x=a||p.defaults.namespace,I=f||Object.keys(yr),N=s||Ww,P=e||r,T=null;if(y&&(process.stderr.write(`[0/6] Classifying input...
|
|
201
|
+
`),T=await su(t,{title:P}),process.stderr.write(` Route: ${T.route} \u2014 ${T.reasoning}
|
|
202
|
+
`),T.route==="noise"))return process.stderr.write(` Skipped \u2014 classified as noise.
|
|
203
|
+
`),{documentId:null,title:P,skipped:!0,route:"noise"};process.stderr.write(`[1/6] Checking for changes...
|
|
204
|
+
`);let H=jw("sha256").update(t).digest("hex"),Ar=r||`thought:${H}`,{doc:k,changed:Wu}=await Ea({sourcePath:Ar,sourceType:o,title:P,contentHash:H,namespace:x});if(!Wu)return process.stderr.write(` Skipped \u2014 content unchanged.
|
|
205
|
+
`),{documentId:k.id,title:P,skipped:!0};i&&(Object.keys(i).length||i.connection_id)&&await Aa(k.id,i,i.connection_id??null);let Sr=await qw({podUids:g,resolvePodsFrom:w,metadata:i,namespace:x});for(let{podId:R,role:Et}of Sr)await Mr(R,k.id,Et);process.stderr.write(`[2/6] Parsing content...
|
|
206
|
+
`);let Tr=ua(t,{format:i.format,filePath:r,contentType:n});if(P=e||Tr.metadata?.title||r,T?.route==="thought"&&T.facts.length){process.stderr.write(`[thought] Storing ${T.facts.length} facts directly...
|
|
207
|
+
`);let R=await Yw(T.facts,{documentId:k.id,namespace:x}),Et={entityCount:0,relationCount:0,factEntityLinks:0,topics:[]};return!h&&R.results.length&&(Et=await Go({title:P,sourceType:o,metadata:i},R.results,x,u)),await Qr(k.id,{chunkCount:0,factCount:R.counts.added}),await Su(R.results,Sr),process.stderr.write(`Done. Route: thought, ${R.counts.total} facts (${R.counts.added} new)
|
|
208
|
+
`),{documentId:k.id,documentUid:k.uid,title:P,skipped:!1,route:"thought",chunkCount:0,facts:R.counts,entities:Et}}let j=[],X={counts:{total:0,added:0,skipped:0,updated:0,contradicted:0},results:[]},Xt={entityCount:0,relationCount:0,factEntityLinks:0,topics:[]};try{process.stderr.write(`[3/6] Chunking and embedding...
|
|
209
|
+
`),j=pa(Tr.sections),process.stderr.write(` ${j.length} chunks created
|
|
210
|
+
`),!d&&j.length&&(j=await xa(j,Tr.text,{title:P}));let R=j.map(zt=>{let Ae=zt.contextualPrefix;return Ae?`${Ae}
|
|
211
|
+
${zt.content}`:zt.content}),Et=await se(R),Ku=j.map((zt,Ae)=>({...zt,embedding:Et[Ae]}));await Ta(k.id,Ku,x),!l&&p.ingest.eagerExtract?(process.stderr.write(`[4/6] Extracting facts...
|
|
212
|
+
`),X=await Jw(j,{documentId:k.id,namespace:x,promptPath:N,categories:I})):p.ingest.eagerExtract||process.stderr.write(`[4/6] Skipping fact extraction (SIGIL_EAGER_EXTRACT=false)
|
|
213
|
+
`),await Qr(k.id,{chunkCount:j.length,factCount:X.counts.added+X.counts.updated+X.counts.contradicted}),await Su(X.results,Sr),!h&&X.results.length&&(process.stderr.write(`[5/6] Linking entities...
|
|
214
|
+
`),Xt=await Go({title:P,sourceType:o,metadata:i},X.results,x,u),process.stderr.write(` ${Xt.entityCount} entities, ${Xt.relationCount} relations
|
|
215
|
+
`))}catch(R){throw console.error(`[pipeline] Failed after document upsert: ${R.message}`),await ba(k.id).catch(()=>{}),R}return process.stderr.write(`Done. ${j.length} chunks, ${X.counts.total} facts, ${Xt.entityCount} entities
|
|
216
|
+
`),{documentId:k.id,documentUid:k.uid,title:P,skipped:!1,chunkCount:j.length,facts:X.counts,entities:Xt}}async function Tu(t,{documentId:e,namespace:r,embeddings:o,defaultConfidence:n="medium",defaultImportance:a="supplementary"}){let i={total:t.length,added:0,skipped:0,updated:0,contradicted:0},s=[];for(let f=0;f<t.length;f++){let u=t[f],l=await ou({content:u.content,category:u.category,confidence:u.confidence||n,importance:u.importance||a,namespace:r,sourceDocumentIds:e?[e]:[],sourceSection:u.sourceSection||u.category,embedding:o[f]});s.push(l);let h=l.action.toLowerCase();h==="add"?i.added++:h==="skip"?i.skipped++:h==="update"?i.updated++:h==="contradict"&&i.contradicted++}return{counts:i,results:s}}async function Yw(t,{documentId:e,namespace:r}){let o=await se(t.map(n=>n.content));return Tu(t,{documentId:e,namespace:r,embeddings:o,defaultConfidence:"high",defaultImportance:"vital"})}async function Jw(t,{documentId:e,namespace:r,promptPath:o,categories:n}){let a=await Qf(t,{promptPath:o,categories:n});if(process.stderr.write(` ${a.length} facts extracted from ${t.length} chunks
|
|
217
|
+
`),!a.length)return{counts:{total:0,added:0,skipped:0,updated:0,contradicted:0},results:[]};let i=await se(a.map(s=>s.content));return Tu(a,{documentId:e,namespace:r,embeddings:i})}async function qw({podUids:t,resolvePodsFrom:e,metadata:r,namespace:o}){let n=[];for(let i of t){let s=await te(i);s&&n.push({podId:s.id,role:"primary"})}if(e==="metadata"){let i=await bu(r,o);for(let s of i)n.push(s)}let a=new Map;for(let i of n){let s=a.get(i.podId);(!s||i.role==="primary"&&s.role!=="primary")&&a.set(i.podId,i)}return[...a.values()]}async function Su(t,e){if(!(!e.length||!t.length))for(let r of t){let o=r?.fact?.id??r?.existing?.id;if(!o)continue;let n=r?.action==="SKIP"?"mention":"primary";for(let{podId:a}of e)await oe(a,o,n)}}var Ww,Iu=c(()=>{la();da();Fe();_a();Sa();Oa();tu();nu();Mo();cu();_u();At();Re();Au();_();B();Ww=Gw(q,"default-extraction.md")});function Cu(t){for(let e of Vw)if(!t[e])throw new Error(`Pod kind missing required field: ${e}`);if(t.visibility&&!Xw.has(t.visibility))throw new Error(`Pod kind ${t.name}: invalid visibility ${t.visibility}`);if(t.activeMode&&!zw.has(t.activeMode))throw new Error(`Pod kind ${t.name}: invalid activeMode ${t.activeMode}`);if(t.writePolicy&&!Zw.has(t.writePolicy))throw new Error(`Pod kind ${t.name}: invalid writePolicy ${t.writePolicy}`);vu.set(t.name,Qw(t))}function Qw(t){return{visibility:"private",activeMode:"multi-active",hotContextBudget:0,retrievalWeights:{recency:1,relevance:1},importanceDefault:2,ttlDays:null,writePolicy:"origin-only",lifecycle:{},...t}}async function Pu(t={}){let e=[];for(let r of vu.values())if(typeof r.resolveActiveScope=="function")try{let o=await r.resolveActiveScope(t);Array.isArray(o)&&o.length>0&&e.push({kind:r,scope:o})}catch{}return e}var Vw,Xw,zw,Zw,vu,Ko=c(()=>{B();Vw=["name"],Xw=new Set(["private","shared","public"]),zw=new Set(["singleton-live","multi-active","rolling-window","always"]),Zw=new Set(["origin-only","shared-allowlist","open"]),vu=new Map});async function ex(t){if(t.project)return t.project;if(!t.cwd)try{let{getActiveCursor:e}=await Promise.resolve().then(()=>(St(),Le)),r=await e();t={...t,cwd:r?.cwd}}catch{return null}if(!t.cwd)return null;try{let{deriveProjectRoot:e}=await Promise.resolve().then(()=>(De(),Tn)),r=e(t.cwd);return r?r.split("/").pop():null}catch{return null}}function rx(t){if(!t)return{};if(typeof t=="object")return t;try{return JSON.parse(t)}catch{return{}}}var tx,Lu,Nu=c(()=>{S();_();tx="playbook",Lu={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(t={})=>{let e=t.namespace||p.defaults.namespace,r=await ex(t);try{let n=await m("pod").where({podType:tx,namespace:e,status:"active"}).select("uid","attrs");return r?n.filter(i=>{let s=rx(i.attrs);return!s.project||s.project===r}).map(i=>i.uid):n.map(i=>i.uid)}catch{return[]}}}});var ox,Ru,Du=c(()=>{S();_();ox=["__virtual:vital__"],Ru={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()=>ox,fetchFacts:async(t={},{slots:e=8,namespace:r}={})=>{let o=r||t.namespace||p.defaults.namespace;return m("fact as f").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active","f.namespace":o}).where(n=>{n.where("f.importance","vital").orWhere("f.importance_score",5)}).orderByRaw("COALESCE(fl.access_count, 0) DESC, f.created_at DESC").limit(e).pluck("f.content")}}});function ax(){if(!Mu){for(let t of nx)Cu(t);Mu=!0}}var nx,Mu,ku=c(()=>{Ko();Nr();Wo();De();Nu();Du();nx=[xn,Fr,Eu,Lu,Ru],Mu=!1;ax()});var $u={};A($u,{factsInPodsByRecency:()=>Fu,getHotFacts:()=>Bu,updateContextSnapshot:()=>cx});async function Bu({namespace:t,limit:e=ix,ctx:r={}}={}){let o=t||p.defaults.namespace,n={...r,namespace:o};n.cwd||(n.cwd=await sx());let a=await Pu(n),i=await Promise.all(a.map(async({kind:u,scope:l})=>{try{return typeof u.fetchFacts=="function"?await u.fetchFacts(n,{slots:u.hotContextBudget,namespace:o}):await Fu(l,o,u.hotContextBudget)}catch{return[]}})),s=new Set,f=[];for(let u of i)for(let l of u)if(!(!l||s.has(l))&&(s.add(l),f.push(l),f.length>=e))return f;if(f.length<e){let u=await m("fact as f").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active","f.namespace":o}).orderByRaw("COALESCE(fl.last_accessed_at, f.created_at) DESC").limit(e).pluck("f.content");for(let l of u)if(!(!l||s.has(l))&&(s.add(l),f.push(l),f.length>=e))break}return f.slice(0,e)}async function Fu(t,e,r){if(!Array.isArray(t)||t.length===0)return[];let o=t.filter(n=>typeof n=="string"&&!n.startsWith("__virtual:"));return o.length===0?[]:m("fact as f").join("pod_membership as pm",function(){this.on("pm.member_id","=","f.id").andOnVal("pm.member_type","=","fact")}).join("pod as p","p.id","pm.pod_id").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").whereIn("p.uid",o).where({"f.status":"active","f.namespace":e}).orderByRaw(`
|
|
218
|
+
COALESCE(f.importance_score, 2) DESC,
|
|
219
|
+
COALESCE(fl.last_accessed_at, f.created_at) DESC
|
|
220
|
+
`).limit(r).pluck("f.content")}async function sx(){try{let{getActiveCursor:t}=await Promise.resolve().then(()=>(St(),Le));return(await t())?.cwd||null}catch{return null}}async function cx({namespace:t,limit:e,ctx:r}={}){let o=await import("node:fs/promises"),n=Xo,a=await Bu({namespace:t,limit:e,ctx:r}),i="<!-- sigil-context -->";if(!a.length)return 0;let s=new Date().toISOString().slice(0,16).replace("T"," "),f=[i,`## Active Context *(${a.length} facts \xB7 refreshed ${s})*`,"",a.map(h=>`- ${h}`).join(`
|
|
221
|
+
`),i].join(`
|
|
222
|
+
`),u="";try{u=await o.readFile(n,"utf8")}catch{}let l=u.includes(i)?u.replace(new RegExp(`${i}[\\s\\S]*?${i}`),f):u+(u.trim()?`
|
|
223
|
+
|
|
224
|
+
`:"")+f+`
|
|
225
|
+
`;return await o.writeFile(n,l,"utf8"),a.length}var ix,Uu=c(()=>{S();_();B();ku();Ko();ix=20});import{dirname as fx}from"node:path";import{existsSync as Hu,readFileSync as ju,writeFileSync as ux,mkdirSync as lx}from"node:fs";import{createHash as px}from"node:crypto";B();import{resolve as zu}from"node:path";import{existsSync as rn}from"node:fs";import{config as on}from"dotenv";function nn(){let t=zu(process.cwd(),".env");rn(t)&&on({path:t,quiet:!0}),rn(Se)&&Se!==t&&on({path:Se,quiet:!0})}B();nn();var dx=15,mx=8e3,br=tn;async function hx(){let t=await yx();if(!t)return et();let e;try{e=JSON.parse(t)}catch{return et()}let r=await gx(e);if(!r||r.length<dx||r.length>mx)return et();let o=bx(r);if(_x(o))return et();let{failClosedOnBadConfig:n}=await Promise.resolve().then(()=>(Lr(),Pr));if(await n("stop",t))return et();try{let a=await Sx(r);if(Ex(o),!a.length)return et();let i=[];try{let{ensureActivePodsForHook:s}=await Promise.resolve().then(()=>(In(),On));i=(await s({sessionId:e.session_id,cwd:e.cwd||null,transcriptPath:e.transcript_path||null})).podUids}catch(s){process.stderr.write(`[sigil:stop] pod dispatch failed: ${s.message}
|
|
226
|
+
`)}await Tx(a,{podUids:i})}catch(a){process.stderr.write(`[sigil:stop] ${a.message}
|
|
227
|
+
`);try{let{recordHookError:i}=await Promise.resolve().then(()=>(Lr(),Pr));await i("stop",a,e)}catch{}}finally{try{await(await Promise.resolve().then(()=>(S(),vr))).default.destroy()}catch{}}return et()}async function yx(){if(process.stdin.isTTY)return"";let t=[];for await(let e of process.stdin)t.push(e);return Buffer.concat(t).toString("utf8").trim()}function et(){process.stdout.write("{}")}async function gx(t){if(t.transcript_path&&Hu(t.transcript_path)){let e=wx(t.transcript_path);if(e)return e}if(Array.isArray(t.messages))for(let e=t.messages.length-1;e>=0;e--){let r=t.messages[e];if((r.role==="user"||r.message?.role==="user")&&r.content)return Gu(r.content)}return typeof t.last_user_message=="string"?t.last_user_message:typeof t.user_message=="string"?t.user_message:typeof t.prompt=="string"?t.prompt:null}function wx(t){let e;try{e=ju(t,"utf8").split(`
|
|
228
|
+
`).filter(Boolean)}catch{return null}for(let r=e.length-1;r>=0;r--){let o;try{o=JSON.parse(e[r])}catch{continue}if((o.role||o.message?.role||o.type)!=="user")continue;let a=o.content??o.message?.content,i=Gu(a);if(i&&!xx(i))return i}return null}function Gu(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>typeof e=="string"?e:e?.type==="text"&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
|
|
229
|
+
`).trim():""}function xx(t){return/^<tool_use_result|^<bash_output|^<file_contents|^Tool execution result/.test(t)}function _x(t){if(!Hu(br))return!1;try{return JSON.parse(ju(br,"utf8")).lastHash===t}catch{return!1}}function Ex(t){try{lx(fx(br),{recursive:!0}),ux(br,JSON.stringify({lastHash:t,ts:Date.now()}),"utf8")}catch{}}function bx(t){return px("sha256").update(t).digest("hex").slice(0,16)}var Ax=`You decide whether a user's message contains durable, memorable content for a long-term AI memory system, and extract the facts if so.
|
|
230
|
+
|
|
231
|
+
SAVE these signals:
|
|
232
|
+
- Preferences ("I prefer X", "I always X", "I never X", "I like X")
|
|
233
|
+
- Decisions ("we use X", "we picked X", "we don't use X", "we moved off X")
|
|
234
|
+
- Constraints ("we can't use X because\u2026", "X is blocked", "X must support Y")
|
|
235
|
+
- Corrections ("actually it's X, not Y", "we changed X to Y")
|
|
236
|
+
- Factual claims about the user's project, codebase, team, tools, or conventions
|
|
237
|
+
|
|
238
|
+
DO NOT save:
|
|
239
|
+
- Questions or code requests ("write me a X", "how do I Y", "fix this")
|
|
240
|
+
- Casual chitchat or greetings ("ok", "thanks", "hi")
|
|
241
|
+
- Ephemeral context that won't generalize ("this file", "this branch", "this run")
|
|
242
|
+
- Generic claims about the world ("Python is interpreted", "git is version control")
|
|
243
|
+
- Commands or instructions to Claude itself ("be more careful", "don't apologize")
|
|
244
|
+
|
|
245
|
+
Each saved fact must:
|
|
246
|
+
- Be a complete declarative statement that makes sense without the surrounding conversation
|
|
247
|
+
- Stay under 25 words
|
|
248
|
+
- Be specific enough that retrieving it later helps Claude answer better
|
|
249
|
+
- Be phrased in third person where natural ("User prefers X" or "Project uses X")
|
|
250
|
+
|
|
251
|
+
Respond as STRICT JSON, no markdown:
|
|
252
|
+
{"memorable": boolean, "facts": ["...", "..."]}
|
|
253
|
+
|
|
254
|
+
If "memorable" is false, "facts" must be an empty array.`;async function Sx(t){let{promptJson:e}=await Promise.resolve().then(()=>(ot(),ta)),r=(await Promise.resolve().then(()=>(_(),Or))).default,o=`${Ax}
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
User message:
|
|
258
|
+
${t}`,n=await e(o,{model:r.llm.extractionModel,caller:"stop-hook"});return!n||n.memorable!==!0?[]:Array.isArray(n.facts)?n.facts.filter(a=>typeof a=="string").map(a=>a.trim()).filter(a=>a.length>=8&&a.length<=200):[]}async function Tx(t,{podUids:e=[]}={}){let{ingestDocument:r}=await Promise.resolve().then(()=>(Iu(),Ou)),o=(await Promise.resolve().then(()=>(_(),Or))).default;for(let n of t)try{await r({content:n,namespace:o.defaults.namespace,classify:!1,podUids:e})}catch(a){process.stderr.write(`[sigil:stop] save failed: ${a.message}
|
|
259
|
+
`)}try{let{updateContextSnapshot:n}=await Promise.resolve().then(()=>(Uu(),$u));await n({namespace:o.defaults.namespace})}catch{}}hx();
|