@anmol-srv/sigil 0.11.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +397 -339
- package/dist/daemon.js +198 -121
- package/dist/hooks/post-tool-use.js +18 -18
- package/dist/hooks/session-end.js +28 -28
- package/dist/hooks/stop.js +36 -36
- package/dist/hooks/user-prompt-submit.js +17 -17
- package/dist/server.js +26 -26
- package/package.json +1 -1
- package/src/gui/web/api.js +37 -0
- package/src/gui/web/app.css +114 -50
- package/src/gui/web/app.js +244 -92
- package/src/gui/web/components.js +90 -0
- package/src/gui/web/design/colors_and_type.css +178 -0
- package/src/gui/web/design/sigil-mark-mono.svg +8 -0
- package/src/gui/web/design/sigil-mark.svg +26 -0
- package/src/gui/web/index.html +64 -42
- package/src/gui/web/toast.js +62 -0
package/dist/daemon.js
CHANGED
|
@@ -1,47 +1,49 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __sigilCreateRequire } from 'node:module'; const require = __sigilCreateRequire(import.meta.url);
|
|
3
|
-
var
|
|
4
|
-
`),r=
|
|
5
|
-
`).
|
|
6
|
-
`)
|
|
7
|
-
|
|
8
|
-
`)
|
|
3
|
+
var Uw=Object.create;var $i=Object.defineProperty;var Gw=Object.getOwnPropertyDescriptor;var jw=Object.getOwnPropertyNames;var Ww=Object.getPrototypeOf,Kw=Object.prototype.hasOwnProperty;var Yw=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var u=(e,t)=>()=>(e&&(t=e(e=0)),t);var J=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),x=(e,t)=>{for(var r in t)$i(e,r,{get:t[r],enumerable:!0})},Vw=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of jw(t))!Kw.call(e,o)&&o!==r&&$i(e,o,{get:()=>t[o],enumerable:!(n=Gw(t,o))||n.enumerable});return e};var qw=(e,t,r)=>(r=e!=null?Uw(Ww(e)):{},Vw(t||!e||!e.__esModule?$i(r,"default",{value:e,enumerable:!0}):r,e));var kc={};x(kc,{CLAUDE_HOME:()=>ji,CLAUDE_MD_PATH:()=>iE,CLAUDE_SETTINGS_PATH:()=>oE,GUI_WEB_DIR:()=>nE,GUI_WEB_DIR_BUILT:()=>en,GUI_WEB_DIR_DEV:()=>no,MIGRATIONS_DIR:()=>ke,PKG_ROOT:()=>Z,PROMPTS_DIR:()=>Q,SIGIL_ACTIVE_SESSION_CURSOR:()=>Gi,SIGIL_DAEMON_LOG:()=>Ie,SIGIL_DAEMON_PID:()=>Yt,SIGIL_DAEMON_SOCK:()=>qe,SIGIL_DB_PATH:()=>Zw,SIGIL_ENV_PATH:()=>W,SIGIL_GUI_TOKEN:()=>qt,SIGIL_HEARTBEAT:()=>Vt,SIGIL_HOME:()=>M,SIGIL_HOOK_DEDUP:()=>rE,SIGIL_HOOK_ERRORS_LOG:()=>Qw,SIGIL_IDENTITY_KEY:()=>Je,SIGIL_IROH_DIR:()=>oo,SIGIL_LAST_CLEAN_DOCTOR:()=>eE,SIGIL_MD_PATH:()=>to,SIGIL_ONBOARDING_STATE:()=>ro,SIGIL_SCHEMAS_DIR:()=>Ui,SIGIL_STOP_CURSOR:()=>tE});import{fileURLToPath as Jw}from"node:url";import{dirname as Dc,join as N}from"node:path";import{existsSync as Lc}from"node:fs";import{homedir as zw}from"node:os";function Xw(){let e=Dc(Jw(import.meta.url));for(let t=0;t<10;t++){if(Lc(N(e,"package.json"))&&Lc(N(e,"prompts")))return e;let r=Dc(e);if(r===e)break;e=r}return process.cwd()}var Z,Q,ke,Pc,M,W,Zw,to,Ui,Qw,eE,Gi,tE,rE,qe,Yt,Ie,Vt,ro,qt,en,no,nE,oo,Je,ji,oE,iE,C=u(()=>{Z=Xw(),Q=N(Z,"prompts"),ke=N(Z,"src","db","migrations"),Pc=zw(),M=N(Pc,".sigil"),W=N(M,".env"),Zw=N(M,"db"),to=N(M,"CLAUDE.md"),Ui=N(M,"schemas"),Qw=N(M,".hook-errors.log"),eE=N(M,".last-clean-doctor"),Gi=N(M,".active-session.json"),tE=N(M,".stop-cursor.json"),rE=N(M,".hook-dedup.json"),qe=N(M,"sock"),Yt=N(M,"sigild.pid"),Ie=N(M,"sigild.log"),Vt=N(M,"heartbeat.json"),ro=N(M,"onboarding-state.json"),qt=N(M,"gui.token"),en=N(Z,"dist","gui"),no=N(Z,"src","gui","web"),nE=en,oo=N(M,"iroh"),Je=N(M,"identity.key"),ji=N(Pc,".claude"),oE=N(ji,"settings.json"),iE=N(ji,"CLAUDE.md")});var Uc={};x(Uc,{detectRunningDaemon:()=>Ki,dirname:()=>cE,ensureSigilHome:()=>Vi,installShutdownHooks:()=>Yi,isPidAlive:()=>Fc,readPidFile:()=>$c,removePidFile:()=>io,removeSocketFile:()=>so,writePidFile:()=>Wi});import{readFile as sE,writeFile as aE,unlink as Mc,mkdir as Hc}from"node:fs/promises";import{existsSync as Bc}from"node:fs";import{dirname as cE}from"node:path";function Fc(e){if(!e||!Number.isFinite(e))return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}async function $c(){if(!Bc(Yt))return null;try{let e=(await sE(Yt,"utf8")).trim(),t=Number(e);return Number.isFinite(t)?t:null}catch{return null}}async function Wi(){await Hc(M,{recursive:!0}),await aE(Yt,String(process.pid),"utf8")}async function io(){try{await Mc(Yt)}catch{}}async function so(){try{await Mc(qe)}catch{}}async function Ki(){let e=await $c();return e&&Fc(e)?e:(e&&await io(),Bc(qe)&&await so(),null)}function Yi(e){let t=!1,r=async n=>{if(!t){t=!0;try{await e(n)}catch(o){process.stderr.write(`[sigild] shutdown error: ${o.message}
|
|
4
|
+
`)}finally{process.exit(0)}}};process.on("SIGTERM",()=>r("SIGTERM")),process.on("SIGINT",()=>r("SIGINT")),process.on("SIGHUP",()=>r("SIGHUP"))}async function Vi(){await Hc(M,{recursive:!0})}var ao=u(()=>{C()});var jc={};x(jc,{buildUrlConnection:()=>re,classifyProvider:()=>ze,directMigrationUrl:()=>qi,isPooledUrl:()=>co});function re(e){if(!e)throw new Error("url driver: SIGIL_DATABASE_URL is empty");let t;try{t=new URL(e)}catch(i){throw new Error(`url driver: invalid URL \u2014 ${i.message}`)}if(!/^postgres(ql)?:$/i.test(t.protocol))throw new Error(`url driver: expected postgres:// or postgresql:// scheme, got ${t.protocol}`);let r=t.searchParams.get("sslmode"),n=uE(t.hostname,r),o={host:t.hostname,port:t.port?Number(t.port):5432,database:t.pathname.replace(/^\//,"")||"postgres",user:decodeURIComponent(t.username),password:decodeURIComponent(t.password)};return n!==void 0&&(o.ssl=n),t.searchParams.get("application_name")||(o.application_name="sigil"),o}function uE(e,t){if(t==="disable")return!1;if(t==="require"||t==="verify-full"||t==="verify-ca")return{rejectUnauthorized:!0};if(t==="no-verify"||t==="prefer")return{rejectUnauthorized:!1};if(!Gc.some(r=>r.test(e)))return lE.some(r=>r.test(e))?{rejectUnauthorized:!0}:{rejectUnauthorized:!1}}function co(e){try{let t=new URL(e).hostname;return/-pooler\./i.test(t)||/\.pooler\.supabase\.com$/i.test(t)}catch{return!1}}function qi(e){let t;try{t=new URL(e)}catch{return null}let r=t.hostname;return/\.neon\.tech$/i.test(r)&&/-pooler\./i.test(r)?(t.hostname=r.replace("-pooler.","."),t.toString()):co(e)?null:e}function ze(e){try{let t=new URL(e).hostname;return/\.neon\.tech$/i.test(t)?"neon":/\.pooler\.supabase\.com$/i.test(t)?"supabase-pooler":/\.supabase\.co$/i.test(t)||/\.supabase\.com$/i.test(t)?"supabase":/\.rds\.amazonaws\.com$/i.test(t)?"aws-rds":/\.render\.com$/i.test(t)?"render":/\.railway\.app$/i.test(t)?"railway":/\.cockroachlabs\.cloud$/i.test(t)?"cockroachdb":Gc.some(r=>r.test(t))?"local":"unknown"}catch{return"unknown"}}var lE,Gc,_t=u(()=>{lE=[/\.neon\.tech$/i,/\.supabase\.co$/i,/\.supabase\.com$/i,/\.pooler\.supabase\.com$/i,/\.rds\.amazonaws\.com$/i,/\.render\.com$/i,/\.railway\.app$/i,/\.cockroachlabs\.cloud$/i],Gc=[/^localhost$/i,/^127\.0\.0\.1$/,/^::1$/,/\.local$/i]});var Jt={};x(Jt,{diagnoseConnectionError:()=>pE,diagnoseError:()=>uo,ensurePostgresDatabase:()=>fE,probeSigilConnection:()=>dE,probeUrlConnection:()=>rn});import lo from"pg";async function dE({host:e,port:t,database:r,user:n,password:o}){let i=new lo.Client({host:e,port:t,database:r,user:n,password:o});try{return await i.connect(),await i.query("SELECT 1"),{ok:!0}}catch(s){return{ok:!1,code:s.code,message:s.message}}finally{try{await i.end()}catch{}}}async function rn(e){let t,r="unknown";try{t=re(e),r=ze(e)}catch(i){return{ok:!1,stage:"parse",error:i.message}}let n=new lo.Client(t),o=Date.now();try{await n.connect()}catch(i){return{ok:!1,stage:"connect",provider:r,error:i.message,code:i.code}}try{let i=await n.query("SELECT current_database() AS db, version() AS version"),s=await n.query("SELECT extname FROM pg_extension WHERE extname = 'vector'");return{ok:!0,provider:r,connectMs:Date.now()-o,database:i.rows[0].db,serverVersion:i.rows[0].version,pgvector:s.rowCount>0}}catch(i){return{ok:!1,stage:"query",provider:r,error:i.message,code:i.code}}finally{try{await n.end()}catch{}}}async function fE({admin:{host:e,port:t,user:r,password:n},sigil:{database:o,user:i,password:s}}){let a=new lo.Client({host:e,port:t,database:"postgres",user:r,password:n});await a.connect();let c=[];try{(await a.query("SELECT 1 FROM pg_database WHERE datname = $1",[o])).rowCount===0?(await a.query(`CREATE DATABASE ${Xe(o)}`),c.push(`created database "${o}"`)):c.push(`database "${o}" already exists \u2014 left as-is`),(await a.query("SELECT 1 FROM pg_roles WHERE rolname = $1",[i])).rowCount===0?(await a.query(`CREATE USER ${Xe(i)} WITH PASSWORD ${Wc(s)}`),c.push(`created user "${i}"`)):(await a.query(`ALTER USER ${Xe(i)} WITH PASSWORD ${Wc(s)}`),c.push(`user "${i}" exists \u2014 password reset to match .env`)),await a.query(`GRANT ALL PRIVILEGES ON DATABASE ${Xe(o)} TO ${Xe(i)}`)}finally{await a.end()}let l=new lo.Client({host:e,port:t,database:o,user:r,password:n});await l.connect();try{await l.query(`GRANT ALL ON SCHEMA public TO ${Xe(i)}`),await l.query(`ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO ${Xe(i)}`),await l.query(`ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO ${Xe(i)}`);try{await l.query("CREATE EXTENSION IF NOT EXISTS vector"),c.push("pgvector extension ready")}catch(d){throw d.code===tn.EXTENSION_NOT_AVAILABLE?new Error("pgvector extension is not installed on this Postgres server.\n \u2022 Docker: use the `pgvector/pgvector:pg15` image instead of stock `postgres`\n \u2022 Homebrew: brew install pgvector (then restart postgres)\n \u2022 apt: apt install postgresql-15-pgvector (15 \u2192 your major version)\n \u2022 RDS: enable the `vector` extension in the parameter group\nRe-run `sigil init` once pgvector is installed."):d}}finally{await l.end()}return{actions:c}}function uo(e){let t=e?.code,r=e?.message||String(e);return/expected \d+ dimensions, not \d+/i.test(r)||/different vector dimensions/i.test(r)?{kind:"dim-mismatch",humanMessage:"The embedding size does not match the database. Your existing data uses a different vector dimension than the embedder you picked.",fixHint:"Pick an embedding provider whose dimension matches the database, or wipe the embedding data and start fresh at the new dimension (Settings \u2192 Embedding)."}:/\b401\b|\b403\b|invalid[_ ]api[_ ]key|incorrect api key|unauthorized/i.test(r)&&/openai|voyage|openrouter|embed/i.test(r)?{kind:"bad-key",humanMessage:"The embedding provider rejected the API key.",fixHint:"Check the API key has embedding access and is pasted correctly (Settings \u2192 Embedding)."}:/model .* (not found|does not exist)|unknown model|no such model/i.test(r)?{kind:"model-not-found",humanMessage:"The embedding model name was not recognized by the provider.",fixHint:"Use a valid embedding model for the provider (e.g. text-embedding-3-large for OpenAI, nomic-embed-text for Ollama)."}:/11434|ollama/i.test(r)&&/ECONNREFUSED|fetch failed|connect|unreachable/i.test(r)?{kind:"ollama-down",humanMessage:"The local Ollama server is not reachable.",fixHint:"Start it with `ollama serve`, then `ollama pull nomic-embed-text`."}:/Unable to acquire a connection/i.test(r)||/pool is (destroyed|draining)/i.test(r)?{kind:"pool-dead",humanMessage:"The database connection pool was closed before this step ran.",fixHint:"This is an internal sequencing bug, not your configuration \u2014 restart the daemon (Settings \u2192 Apply)."}:/pooler|pgbouncer|prepared statement|advisory lock|endpoint could not be found/i.test(r)?{kind:"pooler-lock",humanMessage:"This looks like a connection-pooler URL. Pooled connections cannot run database migrations.",fixHint:'Use your direct (non-pooled) connection string for setup. For Neon, remove "-pooler" from the host.'}:t===tn.EXTENSION_NOT_AVAILABLE||/extension "?vector"?|type "?vector"? does not exist/i.test(r)?{kind:"no-pgvector",humanMessage:"The pgvector extension is not enabled on this database.",fixHint:'Click "Install pgvector" (most managed providers allow it), or use a pgvector-enabled Postgres image.'}:t===tn.CONNECTION_REFUSED||/ECONNREFUSED/.test(r)?{kind:"unreachable",humanMessage:"Postgres is not reachable at that host/port.",fixHint:"Confirm the server is running and the host/port are correct (`pg_isready -h <host> -p <port>`)."}:t===tn.AUTH_FAILED||/password authentication failed/i.test(r)?{kind:"auth",humanMessage:"Postgres rejected the username or password.",fixHint:"Fix the credentials in the connection settings."}:t===tn.DB_DOES_NOT_EXIST||/database .* does not exist/i.test(r)?{kind:"missing-db",humanMessage:"That database does not exist on the server yet.",fixHint:"Create the database, or point Sigil at one that exists."}:{kind:"other",humanMessage:r.split(`
|
|
5
|
+
`)[0],fixHint:null}}function pE(e){let t=uo(e);return{kind:t.kind,hint:t.fixHint||t.humanMessage}}function Xe(e){if(!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))throw new Error(`Refusing to quote invalid SQL identifier: ${e}`);return`"${e}"`}function Wc(e){return`'${String(e).replace(/'/g,"''")}'`}var tn,Me=u(()=>{_t();tn={DB_DOES_NOT_EXIST:"3D000",CONNECTION_REFUSED:"ECONNREFUSED",AUTH_FAILED:"28P01",EXTENSION_NOT_AVAILABLE:"0A000",INTERNAL_ERROR:"XX000"}});function Yc(e,{data:t}={}){let r=Kc[e?.kind]||"DB_ERROR";return new H({errorCode:r,message:e?.humanMessage,hint:e?.fixHint,data:t})}function Ji(e,t){process.env.SIGIL_DEBUG&&t?.stack&&(e.stack=t.stack);for(let r of Object.keys(e))e[r]===void 0&&delete e[r];return e}function Vc(e){if(e instanceof H)return Ji({code:e.errorCode,message:e.message,hint:e.hint??zt[e.errorCode]?.hint??void 0,data:e.data},e);let t=e,r=e?.message||String(e),n="";if(e instanceof AggregateError&&Array.isArray(e.errors)&&e.errors.length){t=e.errors[0]||e,r=t.message||r;let i=[...new Set(e.errors.map(s=>s.code).filter(Boolean))];i.length>1&&(n=` (and ${e.errors.length-1} more: ${i.slice(1).join(", ")})`)}else e?.cause&&(!r||r==="AggregateError")&&(t=e.cause,r=t.message||r);let o=uo(t);if(o&&o.kind!=="other"){let i=Kc[o.kind]||"DB_ERROR";return Ji({code:i,message:o.humanMessage+n,hint:o.fixHint??zt[i]?.hint??void 0},e)}return Ji({code:t?.code||e?.code||mE,message:r+n,hint:void 0},e)}var mE,zt,Kc,H,Xt=u(()=>{Me();mE="handler_error",zt={VALIDATION_ERROR:{message:"Validation error",statusCode:400},INVALID_PARAMS:{message:"Invalid parameters",statusCode:400},BAD_REQUEST:{message:"Bad request",statusCode:400},NOT_FOUND:{message:"Resource not found",statusCode:404},UNKNOWN_METHOD:{message:"Unknown method",statusCode:404},CONFLICT:{message:"Resource conflict",statusCode:409},INTERNAL:{message:"Internal server error",statusCode:500},HANDLER_ERROR:{message:"Handler error",statusCode:500},SERVICE_UNAVAILABLE:{message:"Service unavailable",statusCode:503},LLM_ERROR:{message:"LLM provider error",statusCode:502},DB_ERROR:{message:"Database error",statusCode:500},DB_UNREACHABLE:{message:"Postgres is not reachable at that host/port.",statusCode:503,hint:"Confirm the server is running and the host/port are correct (`pg_isready -h <host> -p <port>`)."},DB_AUTH_FAILED:{message:"Postgres rejected the username or password.",statusCode:401,hint:"Fix the credentials in the connection settings."},DB_MISSING:{message:"That database does not exist on the server yet.",statusCode:404,hint:"Create the database, or point Sigil at one that exists."},DB_NO_PGVECTOR:{message:"The pgvector extension is not enabled on this database.",statusCode:400,hint:'Click "Install pgvector", or use a pgvector-enabled Postgres image.'},DB_POOLER_LOCK:{message:"This looks like a connection-pooler URL. Pooled connections cannot run migrations.",statusCode:400,hint:'Use the direct (non-pooled) connection string. For Neon, remove "-pooler" from the host.'},DB_POOL_DEAD:{message:"The database connection pool was closed before this step ran.",statusCode:503,hint:"Internal sequencing issue, not your config \u2014 restart the daemon (Settings \u2192 Apply)."},EMBED_DIM_MISMATCH:{message:"The embedding size does not match the database.",statusCode:409,hint:"Pick an embedder whose dimension matches the DB, or wipe embedding data and start fresh."},EMBED_BAD_KEY:{message:"The embedding provider rejected the API key.",statusCode:401,hint:"Check the API key has embedding access and is pasted correctly (Settings \u2192 Embedding)."},EMBED_MODEL_NOT_FOUND:{message:"The embedding model name was not recognized by the provider.",statusCode:400,hint:"Use a valid embedding model for the provider."},OLLAMA_DOWN:{message:"The local Ollama server is not reachable.",statusCode:503,hint:"Start it with `ollama serve`, then `ollama pull nomic-embed-text`."},ONBOARDING_INVALID_TRANSITION:{message:"Invalid onboarding step transition",statusCode:409},DOCKER_UNAVAILABLE:{message:"Docker is not available on this machine.",statusCode:503,hint:"Install/start Docker Desktop, or use the connection-URL flow instead."},DOCKER_PROVISION_FAILED:{message:"Failed to provision the local Postgres container.",statusCode:500,hint:"Check `docker ps`/`docker logs sigil-postgres`, or use the connection-URL flow."},SUPERVISOR_UNSUPPORTED_PLATFORM:{message:"No supervisor backend for this platform",statusCode:501},SUPERVISOR_INSTALL_FAILED:{message:"Failed to install the always-up service.",statusCode:500,hint:"Sigil still runs; you can retry with `sigil service install`."},CONNECTOR_INSTALL_FAILED:{message:"Failed to connect this client",statusCode:500},CONNECTOR_VERIFY_FAILED:{message:"The client did not verify after connecting.",statusCode:500,hint:"Re-run connect; if it persists, check the client config file permissions."}},Kc={"dim-mismatch":"EMBED_DIM_MISMATCH","bad-key":"EMBED_BAD_KEY","model-not-found":"EMBED_MODEL_NOT_FOUND","ollama-down":"OLLAMA_DOWN","pool-dead":"DB_POOL_DEAD","pooler-lock":"DB_POOLER_LOCK","no-pgvector":"DB_NO_PGVECTOR",unreachable:"DB_UNREACHABLE",auth:"DB_AUTH_FAILED","missing-db":"DB_MISSING",other:"DB_ERROR"},H=class extends Error{constructor({errorCode:t,message:r,hint:n,data:o}={}){let i=zt[t]||zt.INTERNAL;super(r||i.message),this.name="AppError",this.errorCode=t&&zt[t]?t:"INTERNAL",this.statusCode=i.statusCode,this.hint=n??i.hint??null,this.data=o}static get codes(){return zt}}});var Xi={};x(Xi,{currentAgent:()=>wE,currentDeviceId:()=>yE,currentRequestContext:()=>zi,runWithRequestContext:()=>gE});import{AsyncLocalStorage as hE}from"node:async_hooks";function gE(e,t){return fo.run(e,t)}function zi(){return fo.getStore()||null}function yE(){return fo.getStore()?.device?.id??null}function wE(){return fo.getStore()?.agent??process.env.SIGIL_AGENT??null}var fo,po=u(()=>{fo=new hE});var rs={};x(rs,{clearRegistry:()=>es,getDbHealth:()=>ts,getRegistry:()=>Qi,setDbHealth:()=>_E,setRegistry:()=>Zi});function Zi(e){mo=e}function Qi(){if(!mo)throw new Error("rpc registry not initialised \u2014 is the daemon running?");return mo}function es(){mo=null}function _E(e){Jc={healthy:null,error:null,checkedAt:null,...e}}function ts(){return Jc}var mo,Jc,Zt=u(()=>{mo=null;Jc={healthy:null,error:null,checkedAt:null}});var Zc={};x(Zc,{EventBus:()=>go,default:()=>K});var go,NE,K,Qt=u(()=>{go=class{constructor(){this.buffer=[],this.subs=new Set}emit(t,r={}){let n={type:t,ts:new Date().toISOString(),...r};this.buffer.push(n),this.buffer.length>200&&this.buffer.shift();for(let o of this.subs)try{o(n)}catch{}return n}subscribe(t){return this.subs.add(t),()=>this.subs.delete(t)}recent(t=50){return t>=this.buffer.length?[...this.buffer]:this.buffer.slice(-t)}subscriberCount(){return this.subs.size}},NE=new go,K=NE});function sl(e){let t=e.split(`
|
|
6
|
+
`),r=[],n=null,o=[];for(let a of t){let c=a.match(/^(#{1,6})\s+(.+)/);c?(o.length&&r.push({heading:n||"Introduction",text:o.join(`
|
|
7
|
+
`).trim()}),n=c[2].trim(),o=[]):o.push(a)}o.length&&r.push({heading:n||"Content",text:o.join(`
|
|
8
|
+
`).trim()});let i=r.map(a=>a.text).join(`
|
|
9
|
+
|
|
10
|
+
`),s=YE(t)||null;return{text:i,sections:r,metadata:{title:s}}}function YE(e){for(let t of e){let r=t.match(/^#\s+(.+)/);if(r)return r[1].trim()}return null}var al=u(()=>{});function is(e){let t=e.split(/\n{2,}/).map(n=>n.trim()).filter(Boolean),r=t.length>1?t.map((n,o)=>({heading:`Section ${o+1}`,text:n})):[{heading:"Content",text:e.trim()}];return{text:e.trim(),sections:r,metadata:{}}}var cl=u(()=>{});function ll(e){let t=VE(e),r=e.replace(/<script[\s\S]*?<\/script>/gi,"");return r=r.replace(/<style[\s\S]*?<\/style>/gi,""),r=r.replace(/<\/(p|div|h[1-6]|li|tr|br|hr)>/gi,`
|
|
9
11
|
`),r=r.replace(/<br\s*\/?>/gi,`
|
|
10
12
|
`),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,`
|
|
11
13
|
|
|
12
|
-
`),r=r.trim(),{text:r,sections:[{heading:"Content",text:r}],metadata:{title:t}}}function
|
|
13
|
-
`),n=[],o="Header",i=[],
|
|
14
|
-
`).trim()}),o=l,i=[c],
|
|
15
|
-
`).trim()}),n.length<=1?
|
|
16
|
-
${
|
|
14
|
+
`),r=r.trim(),{text:r,sections:[{heading:"Content",text:r}],metadata:{title:t}}}function VE(e){let t=e.match(/<title[^>]*>([\s\S]*?)<\/title>/i);return t?t[1].trim():null}var ul=u(()=>{});function dl(e,{language:t}={}){let r=t||XE(e),n=qE(e,r);return{text:e.trim(),sections:n,metadata:{language:r}}}function qE(e,t){let r=e.split(`
|
|
15
|
+
`),n=[],o="Header",i=[],s=!1,a=0;for(let c of r){let l=JE(c,t);l&&a===0?(i.length&&n.push({heading:o,text:i.join(`
|
|
16
|
+
`).trim()}),o=l,i=[c],s=!0):i.push(c);for(let d of c)d==="{"&&a++,d==="}"&&(a=Math.max(0,a-1))}return i.length&&n.push({heading:o,text:i.join(`
|
|
17
|
+
`).trim()}),n.length<=1?zE(e):n.filter(c=>c.text)}function JE(e,t){let r=e.trim(),n=[/^(?:export\s+)?(?:async\s+)?function\s+(\w+)/,/^(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s*)?\(/,/^(?:export\s+)?class\s+(\w+)/,/^(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=\s*\{/,/^(?:export\s+default\s+)/],o=[/^(?:async\s+)?def\s+(\w+)/,/^class\s+(\w+)/],i=[/^func\s+(?:\(\w+\s+\*?\w+\)\s+)?(\w+)/,/^type\s+(\w+)/],s=[...n,...o,...i];for(let a of s){let c=r.match(a);if(c)return c[1]||c[0].slice(0,40)}return null}function zE(e){return e.split(/\n{2,}/).map((r,n)=>({heading:`Block ${n+1}`,text:r.trim()})).filter(r=>r.text)}function XE(e){return e.includes("import ")&&(e.includes("from ")||e.includes("require("))?"javascript":e.match(/^def\s/m)||e.match(/^class\s.*:/m)?"python":e.match(/^func\s/m)||e.includes("package ")?"go":e.match(/^fn\s/m)||e.includes("use ")?"rust":"unknown"}var fl=u(()=>{});function pl(e){let t;try{t=typeof e=="string"?JSON.parse(e):e}catch{return{text:e,sections:[{heading:"Content",text:e}],metadata:{}}}let r=ss(t);return{text:r,sections:[{heading:"Content",text:r}],metadata:{}}}function ss(e,t=0){if(e==null)return"";if(Array.isArray(e))return e.map((r,n)=>typeof r=="object"&&r!==null?`Item ${n+1}:
|
|
18
|
+
${ss(r,t+1)}`:`- ${r}`).join(`
|
|
17
19
|
`);if(typeof e=="object"){let r=" ".repeat(t);return Object.entries(e).filter(([,n])=>n!=null).map(([n,o])=>typeof o=="object"?`${r}${n}:
|
|
18
|
-
${
|
|
19
|
-
`)}return String(e)}var
|
|
20
|
+
${ss(o,t+1)}`:`${r}${n}: ${o}`).join(`
|
|
21
|
+
`)}return String(e)}var ml=u(()=>{});function hl(e,{format:t,filePath:r,contentType:n}={}){let o=t||t_(n)||r_(r)||n_(e);return(e_[o]||is)(e)}function t_(e){if(!e)return null;let t=e.split(";")[0].trim();return QE[t]||null}function r_(e){if(!e)return null;let t=e.match(/\.[^.]+$/)?.[0]?.toLowerCase();return t&&ZE[t]||null}function n_(e){if(!e)return"text";let t=e.trim();return t.startsWith("{")||t.startsWith("[")?"json":t.startsWith("<!DOCTYPE")||t.startsWith("<html")?"html":t.match(/^#{1,6}\s/m)?"markdown":t.match(/^(import|export|function|class|const|let|var|def|func|package)\s/m)?"code":"text"}var ZE,QE,e_,gl=u(()=>{al();cl();ul();fl();ml();ZE={".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"},QE={"text/markdown":"markdown","text/html":"html","text/plain":"text","application/json":"json","text/javascript":"code","application/javascript":"code","text/x-python":"code"},e_={markdown:sl,text:is,html:ll,code:dl,json:pl}});function o_(e,{maxTokens:t=512,overlapTokens:r=50}={}){if(!e?.trim())return[];let n=t*4,o=r*4;if(e.length<=n)return[{content:e.trim(),index:0}];let i=i_(e),s=[],a="",c="";for(let l of i){if(l.length>n){a.trim()&&(s.push({content:a.trim(),index:s.length}),c=as(a,o),a="");let d=s_(l,n,o);for(let p of d)s.push({content:p.trim(),index:s.length});c=as(s[s.length-1].content,o);continue}(a+l).length>n?(s.push({content:a.trim(),index:s.length}),c=as(a,o),a=c+l):a+=l}return a.trim()&&s.push({content:a.trim(),index:s.length}),s}function wl(e,t={}){let r=[];for(let{heading:n,text:o}of e){if(!o?.trim())continue;let i=o_(o,t);for(let s of i)r.push({content:s.content,index:r.length,sectionHeading:n})}return r}function i_(e){return e.split(/(?<=[.!?])\s+|(?<=\n)\s*/).filter(r=>r.trim())}function s_(e,t,r){let n=[],o=0;for(;o<e.length;){let i=Math.min(o+t,e.length);if(n.push(e.slice(o,i)),o=i-r,o>=e.length)break}return n}function as(e,t){if(e.length<=t)return e;let r=e.slice(-t),n=r.search(/[.!?]\s+/);return n!==-1?r.slice(n+1).trimStart():r}var yl,cs=u(()=>{yl=Object.freeze({version:3,size:512,overlap:50,contextualPrefix:!0})});var ne={};x(ne,{default:()=>g});var v,El,a_,g,A=u(()=>{v=(e,t)=>process.env[e]??t,El=v("SIGIL_DB_TYPE","postgres");if(El!=="postgres")throw new Error(`SIGIL_DB_TYPE=${El} is no longer supported. Sigil 0.10.0+ is Postgres-only.
|
|
20
22
|
PGlite was deprecated; existing PGlite data at ~/.sigil/db is preserved but unreachable from this version.
|
|
21
23
|
Set SIGIL_DB_TYPE=postgres in ~/.sigil/.env and configure SIGIL_DB_HOST / PORT / NAME / USER / PASSWORD.
|
|
22
|
-
Run \`sigil init\` for an interactive setup.`);eg={db:{type:"postgres",get url(){return N("SIGIL_DATABASE_URL",N("DATABASE_URL",""))||null},get host(){return N("SIGIL_DB_HOST","localhost")},get port(){return Number(N("SIGIL_DB_PORT",5432))},get database(){return N("SIGIL_DB_NAME","sigil")},get user(){return N("SIGIL_DB_USER","sigil_app")},get password(){return N("SIGIL_DB_PASSWORD","")}},embedding:{get provider(){return process.env.EMBEDDING_PROVIDER||""},get model(){return process.env.EMBEDDING_MODEL||"nomic-embed-text"},get dimensions(){return Number(process.env.EMBEDDING_DIMENSIONS)||768},get ollamaHost(){return process.env.OLLAMA_HOST||"http://localhost:11434"},get openaiApiKey(){return process.env.OPENAI_API_KEY||""},get voyageApiKey(){return process.env.VOYAGE_API_KEY||""},openrouterApiKey:process.env.OPENROUTER_API_KEY||"",openrouterBaseUrl:process.env.EMBEDDING_OPENROUTER_BASE_URL||process.env.LLM_OPENROUTER_BASE_URL||"",openrouterReferer:process.env.EMBEDDING_OPENROUTER_REFERER||process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil",openrouterTitle:process.env.EMBEDDING_OPENROUTER_TITLE||process.env.LLM_OPENROUTER_TITLE||"Sigil"},llm:{provider:process.env.LLM_PROVIDER||"",openaiApiKey:process.env.OPENAI_API_KEY||"",openaiModel:process.env.LLM_OPENAI_MODEL||"gpt-4o-mini",ollamaHost:process.env.LLM_OLLAMA_HOST||process.env.OLLAMA_HOST||"http://localhost:11434",ollamaModel:process.env.LLM_OLLAMA_MODEL||"qwen2.5:7b",cliModel:process.env.LLM_CLI_MODEL||"haiku",apiKey:process.env.ANTHROPIC_API_KEY||"",openrouterApiKey:process.env.OPENROUTER_API_KEY||"",openrouterModel:process.env.LLM_OPENROUTER_MODEL||"google/gemini-flash-latest",openrouterBaseUrl:process.env.LLM_OPENROUTER_BASE_URL||"",openrouterReferer:process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil",openrouterTitle:process.env.LLM_OPENROUTER_TITLE||"Sigil",extractionModel:process.env.LLM_EXTRACTION_MODEL||"",decisionModel:process.env.LLM_DECISION_MODEL||"",entityModel:process.env.LLM_ENTITY_MODEL||"",maxRetries:Number(process.env.LLM_MAX_RETRIES)||3,cliTimeout:Number(process.env.LLM_CLI_TIMEOUT)||12e4},output:{storage:process.env.OUTPUT_STORAGE||"local",dir:process.env.OUTPUT_DIR||"./output",s3:{endpoint:process.env.S3_ENDPOINT||"",bucket:process.env.S3_BUCKET||"",region:process.env.S3_REGION||"us-east-1",accessKey:process.env.S3_ACCESS_KEY||"",secretKey:process.env.S3_SECRET_KEY||"",publicUrl:process.env.S3_PUBLIC_URL||""}},server:{port:Number(process.env.PORT)||4e3,host:process.env.HOST||"0.0.0.0",logLevel:process.env.LOG_LEVEL||"info"},http:{enabled:N("SIGIL_HTTP_ENABLED","true")!=="false",host:N("SIGIL_HTTP_HOST","127.0.0.1"),port:Number(N("SIGIL_HTTP_PORT",7777))},network:{mode:N("SIGIL_MODE","solo"),enabled:N("SIGIL_NETWORK_ENABLED",null)===null?N("SIGIL_MODE","solo")!=="solo":N("SIGIL_NETWORK_ENABLED","false")!=="false",masterNodeId:N("SIGIL_MASTER_NODE_ID","")||null},defaults:{namespace:process.env.DEFAULT_NAMESPACE||"default"},memory:{skipThreshold:Number(process.env.MEMORY_SKIP_THRESHOLD)||.88,ambiguousThreshold:Number(process.env.MEMORY_AMBIGUOUS_THRESHOLD)||.78,minFactSimilarity:Number(process.env.MEMORY_MIN_FACT_SIMILARITY)||.45,injectionFloor:Number(process.env.MEMORY_INJECTION_FLOOR)||.6},search:{synthesize:N("SIGIL_SYNTHESIZE","true")!=="false",synthesizeModel:N("SIGIL_SYNTH_MODEL","")},ingest:{eagerExtract:N("SIGIL_EAGER_EXTRACT","true")!=="false"},hebbian:{entity:{enabled:N("SIGIL_HEBBIAN_ENTITY_ENABLED",null,"true")!=="false",eta:Number(N("SIGIL_HEBBIAN_ENTITY_ETA",null,1)),cap:Number(N("SIGIL_HEBBIAN_ENTITY_CAP",null,50)),halfLifeDays:Number(N("SIGIL_HEBBIAN_ENTITY_HALF_LIFE_DAYS",null,30)),minEffective:Number(N("SIGIL_HEBBIAN_ENTITY_MIN_EFFECTIVE",null,.5)),rrfWeight:Number(N("SIGIL_HEBBIAN_ENTITY_RRF_WEIGHT",null,.3)),maxWriteEntities:Number(N("SIGIL_HEBBIAN_ENTITY_MAX_WRITE",null,12)),expandPerSeed:Number(N("SIGIL_HEBBIAN_ENTITY_EXPAND_PER_SEED",null,3))}}},g=eg});var Ja={};b(Ja,{chat:()=>tg,meta:()=>rg,setup:()=>ng});async function tg(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.openaiModel,o=[{role:"user",content:e}];r&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:n,messages:o};r&&(i.response_format={type:"json_object"});let a=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${g.llm.openaiApiKey}`},body:JSON.stringify(i)});if(!a.ok){let d=await a.text();throw new Error(`OpenAI error ${a.status}: ${d}`)}let s=await a.json(),c=s.choices[0].message.content.trim(),l=s.usage||{};return{text:c,inputTokens:l.prompt_tokens||0,outputTokens:l.completion_tokens||0,model:n}}async function ng({existing:e,clack:t}){let r=e.OPENAI_API_KEY||"",n=await t.text({message:"OpenAI API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-proj-...",validate:o=>{if(!o&&!r)return"API key is required";if(o&&!o.startsWith("sk-"))return'OpenAI keys start with "sk-" \u2014 check paste'}});return t.isCancel(n)?null:{env:{OPENAI_API_KEY:n||r}}}var rg,Xa=u(()=>{S();rg={id:"openai",label:"OpenAI",hint:"gpt-4o-mini"}});var Za={};b(Za,{buildLocalConnection:()=>se});function se(e){return{host:e.db.host,port:e.db.port,database:e.db.database,user:e.db.user,password:e.db.password}}var it=u(()=>{});var es={};b(es,{buildUrlConnection:()=>ce,classifyProvider:()=>be,directMigrationUrl:()=>po,isPooledUrl:()=>jr});function ce(e){if(!e)throw new Error("url driver: SIGIL_DATABASE_URL is empty");let t;try{t=new URL(e)}catch(i){throw new Error(`url driver: invalid URL \u2014 ${i.message}`)}if(!/^postgres(ql)?:$/i.test(t.protocol))throw new Error(`url driver: expected postgres:// or postgresql:// scheme, got ${t.protocol}`);let r=t.searchParams.get("sslmode"),n=ig(t.hostname,r),o={host:t.hostname,port:t.port?Number(t.port):5432,database:t.pathname.replace(/^\//,"")||"postgres",user:decodeURIComponent(t.username),password:decodeURIComponent(t.password)};return n!==void 0&&(o.ssl=n),t.searchParams.get("application_name")||(o.application_name="sigil"),o}function ig(e,t){if(t==="disable")return!1;if(t==="require"||t==="verify-full"||t==="verify-ca")return{rejectUnauthorized:!0};if(t==="no-verify"||t==="prefer")return{rejectUnauthorized:!1};if(!Qa.some(r=>r.test(e)))return og.some(r=>r.test(e))?{rejectUnauthorized:!0}:{rejectUnauthorized:!1}}function jr(e){try{let t=new URL(e).hostname;return/-pooler\./i.test(t)||/\.pooler\.supabase\.com$/i.test(t)}catch{return!1}}function po(e){let t;try{t=new URL(e)}catch{return null}let r=t.hostname;return/\.neon\.tech$/i.test(r)&&/-pooler\./i.test(r)?(t.hostname=r.replace("-pooler.","."),t.toString()):jr(e)?null:e}function be(e){try{let t=new URL(e).hostname;return/\.neon\.tech$/i.test(t)?"neon":/\.pooler\.supabase\.com$/i.test(t)?"supabase-pooler":/\.supabase\.co$/i.test(t)||/\.supabase\.com$/i.test(t)?"supabase":/\.rds\.amazonaws\.com$/i.test(t)?"aws-rds":/\.render\.com$/i.test(t)?"render":/\.railway\.app$/i.test(t)?"railway":/\.cockroachlabs\.cloud$/i.test(t)?"cockroachdb":Qa.some(r=>r.test(t))?"local":"unknown"}catch{return"unknown"}}var og,Qa,at=u(()=>{og=[/\.neon\.tech$/i,/\.supabase\.co$/i,/\.supabase\.com$/i,/\.pooler\.supabase\.com$/i,/\.rds\.amazonaws\.com$/i,/\.render\.com$/i,/\.railway\.app$/i,/\.cockroachlabs\.cloud$/i],Qa=[/^localhost$/i,/^127\.0\.0\.1$/,/^::1$/,/\.local$/i]});var ho={};b(ho,{buildLocalConnection:()=>se,buildUrlConnection:()=>ce,classifyProvider:()=>be,selectDriver:()=>mo});function mo(e){let t=e.db.url;return t?{kind:"url",provider:be(t),connection:ce(t)}:{kind:"local",provider:"local",connection:se(e)}}var Wr=u(()=>{it();at()});var P={};b(P,{default:()=>m});import ag from"knex";function sg(e){return Array.isArray(e)?e.map(go):e&&typeof e=="object"?go(e):e}function cg(e,t){return t(lg(e))}function go(e){if(!e||typeof e!="object"||e instanceof Date)return e;if(Array.isArray(e))return e.map(go);let t={};for(let[r,n]of Object.entries(e))t[r.replace(/_([a-z])/g,(o,i)=>i.toUpperCase())]=n;return t}function lg(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}var ts,rs,m,A=u(()=>{S();Wr();ts=mo(g),rs=ag({client:"pg",connection:ts.connection,pool:{min:2,max:10},postProcessResponse:sg,wrapIdentifier:cg});rs.__sigilDriver=ts;m=rs});function Z(e){return Math.ceil((e||"").length/4)}function yo(e,t,r){let n=ug[e];return n?(t*n.input+r*n.output)/1e6:0}function Zt({provider:e,model:t,caller:r,input:n,response:o,inputTokens:i,outputTokens:a,cost:s,durationMs:c,status:l,error:d}){m("llm_log").insert({provider:e,model:t,caller:r,input:n?.slice(0,1e4),response:o?.slice(0,1e4),inputTokens:i,outputTokens:a,cost:s,durationMs:c,status:l,error:d?.slice(0,2e3)}).catch(p=>console.error("[llm-log] Write failed:",p.message))}async function wo(e,t=3){for(let r=1;r<=t;r++)try{return await e()}catch(n){if(r===t)throw n;let o=Math.min(1e3*2**(r-1),1e4);await new Promise(i=>setTimeout(i,o))}}var ug,Qt=u(()=>{A();ug={"gpt-4o-mini":{input:.15,output:.6},"gpt-4o":{input:2.5,output:10},"gpt-4.1-nano":{input:.1,output:.4},"gpt-4.1-mini":{input:.4,output:1.6},"claude-haiku-4-5-20251001":{input:.8,output:4},"claude-sonnet-4-6":{input:3,output:15},"claude-opus-4-6":{input:15,output:75}}});var ns={};b(ns,{chat:()=>fg,meta:()=>pg,setup:()=>mg});async function dg(){if(!Eo){let{default:e}=await import("@anthropic-ai/sdk");Eo=new e({apiKey:g.llm.apiKey})}return Eo}async function fg(e,{model:t,jsonMode:r=!1}={}){let n=t||"claude-haiku-4-5-20251001",o=await dg(),i=[{role:"user",content:e}],a=r?"Respond with valid JSON only. No explanation or wrapping.":void 0,s=await o.messages.create({model:n,max_tokens:4096,messages:i,...a&&{system:a}});return{text:s.content[0].text.trim(),inputTokens:s.usage?.input_tokens||Z(e),outputTokens:s.usage?.output_tokens||Z(s.content[0].text),model:n}}async function mg({existing:e,clack:t}){let r=e.ANTHROPIC_API_KEY||"",n=await t.text({message:"Anthropic API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-ant-...",validate:o=>{if(!o&&!r)return"API key is required";if(o&&!o.startsWith("sk-ant-"))return'Anthropic keys start with "sk-ant-" \u2014 check paste'}});return t.isCancel(n)?null:{env:{ANTHROPIC_API_KEY:n||r}}}var Eo,pg,os=u(()=>{S();Qt();Eo=null;pg={id:"anthropic",label:"Anthropic",hint:"Claude Haiku \u2014 requires API key"}});var as={};b(as,{chat:()=>gg,meta:()=>yg,setup:()=>wg});async function gg(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.openrouterModel;if(!g.llm.openrouterApiKey)throw new Error("OPENROUTER_API_KEY is not set");if(!n)throw new Error("No OpenRouter model resolved. Set LLM_OPENROUTER_MODEL or pass `model`.");let o=[{role:"user",content:e}];r&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:n,messages:o};r&&(i.response_format={type:"json_object"});let a=(g.llm.openrouterBaseUrl||hg).replace(/\/+$/,""),s={"Content-Type":"application/json",Authorization:`Bearer ${g.llm.openrouterApiKey}`};g.llm.openrouterReferer&&(s["HTTP-Referer"]=g.llm.openrouterReferer),g.llm.openrouterTitle&&(s["X-Title"]=g.llm.openrouterTitle);let c=await fetch(`${a}/chat/completions`,{method:"POST",headers:s,body:JSON.stringify(i)});if(!c.ok){let h=await c.text();throw new Error(`OpenRouter error ${c.status}: ${h}`)}let l=await c.json(),p=(l.choices?.[0]?.message?.content||"").trim(),f=l.usage||{};return{text:p,inputTokens:f.prompt_tokens||0,outputTokens:f.completion_tokens||0,model:l.model||n}}async function wg({existing:e,clack:t}){let r={},n=e.OPENROUTER_API_KEY||"",o=await t.text({message:"OpenRouter API key (paste, then Enter)",placeholder:n?"(keep existing \u2014 press Enter)":"sk-or-v1-...",validate:c=>{if(!c&&!n)return"API key is required";if(c&&!c.startsWith("sk-or-"))return'OpenRouter keys start with "sk-or-" \u2014 check paste'}});if(t.isCancel(o))return null;r.OPENROUTER_API_KEY=o||n;let i=e.LLM_OPENROUTER_MODEL||"",a=await t.text({message:"OpenRouter model (vendor/model)",placeholder:i||is,validate:c=>{if(c&&!c.includes("/"))return'OpenRouter models are "vendor/model" \u2014 e.g. google/gemini-flash-latest'}});if(t.isCancel(a))return null;r.LLM_OPENROUTER_MODEL=a||i||is;let s=await t.select({message:"Configure per-task model overrides? (advanced \u2014 better quality / cost)",options:[{value:"no",label:"No, use one model everywhere",hint:"simpler \u2014 debug one model"},{value:"yes",label:"Yes, configure smart split",hint:"~5\xD7 cheaper extraction + better AUDM/synthesis"}],initialValue:"no"});if(t.isCancel(s))return null;if(s==="yes"){let c=await t.text({message:"Extraction model (high-volume; cheap matters)",placeholder:e.LLM_EXTRACTION_MODEL||st.extraction});if(t.isCancel(c))return null;r.LLM_EXTRACTION_MODEL=c||e.LLM_EXTRACTION_MODEL||st.extraction;let l=await t.text({message:"Decision model (AUDM; smart matters)",placeholder:e.LLM_DECISION_MODEL||st.decision});if(t.isCancel(l))return null;r.LLM_DECISION_MODEL=l||e.LLM_DECISION_MODEL||st.decision;let d=await t.text({message:"Synthesis model (read-time answer composition)",placeholder:e.SIGIL_SYNTH_MODEL||st.synthesis});if(t.isCancel(d))return null;r.SIGIL_SYNTH_MODEL=d||e.SIGIL_SYNTH_MODEL||st.synthesis}return t.note(`OpenRouter can drive both LLM calls and embeddings.
|
|
24
|
+
Run \`sigil init\` for an interactive setup.`);a_={db:{type:"postgres",get url(){return v("SIGIL_DATABASE_URL",v("DATABASE_URL",""))||null},get host(){return v("SIGIL_DB_HOST","localhost")},get port(){return Number(v("SIGIL_DB_PORT",5432))},get database(){return v("SIGIL_DB_NAME","sigil")},get user(){return v("SIGIL_DB_USER","sigil_app")},get password(){return v("SIGIL_DB_PASSWORD","")}},embedding:{get provider(){return process.env.EMBEDDING_PROVIDER||""},get model(){return process.env.EMBEDDING_MODEL||"nomic-embed-text"},get dimensions(){return Number(process.env.EMBEDDING_DIMENSIONS)||768},get ollamaHost(){return process.env.OLLAMA_HOST||"http://localhost:11434"},get openaiApiKey(){return process.env.OPENAI_API_KEY||""},get voyageApiKey(){return process.env.VOYAGE_API_KEY||""},openrouterApiKey:process.env.OPENROUTER_API_KEY||"",openrouterBaseUrl:process.env.EMBEDDING_OPENROUTER_BASE_URL||process.env.LLM_OPENROUTER_BASE_URL||"",openrouterReferer:process.env.EMBEDDING_OPENROUTER_REFERER||process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil",openrouterTitle:process.env.EMBEDDING_OPENROUTER_TITLE||process.env.LLM_OPENROUTER_TITLE||"Sigil"},llm:{get provider(){return process.env.LLM_PROVIDER||""},get openaiApiKey(){return process.env.OPENAI_API_KEY||""},get openaiModel(){return process.env.LLM_OPENAI_MODEL||"gpt-4o-mini"},get ollamaHost(){return process.env.LLM_OLLAMA_HOST||process.env.OLLAMA_HOST||"http://localhost:11434"},get ollamaModel(){return process.env.LLM_OLLAMA_MODEL||"qwen2.5:7b"},get cliModel(){return process.env.LLM_CLI_MODEL||"haiku"},get apiKey(){return process.env.ANTHROPIC_API_KEY||""},get openrouterApiKey(){return process.env.OPENROUTER_API_KEY||""},get openrouterModel(){return process.env.LLM_OPENROUTER_MODEL||"google/gemini-flash-latest"},get openrouterBaseUrl(){return process.env.LLM_OPENROUTER_BASE_URL||""},get openrouterReferer(){return process.env.LLM_OPENROUTER_REFERER||"https://github.com/Anmol-Srv/sigil"},get openrouterTitle(){return process.env.LLM_OPENROUTER_TITLE||"Sigil"},get extractionModel(){return process.env.LLM_EXTRACTION_MODEL||""},get decisionModel(){return process.env.LLM_DECISION_MODEL||""},get entityModel(){return process.env.LLM_ENTITY_MODEL||""},get maxRetries(){return Number(process.env.LLM_MAX_RETRIES)||3},get cliTimeout(){return Number(process.env.LLM_CLI_TIMEOUT)||12e4}},output:{storage:process.env.OUTPUT_STORAGE||"local",dir:process.env.OUTPUT_DIR||"./output",s3:{endpoint:process.env.S3_ENDPOINT||"",bucket:process.env.S3_BUCKET||"",region:process.env.S3_REGION||"us-east-1",accessKey:process.env.S3_ACCESS_KEY||"",secretKey:process.env.S3_SECRET_KEY||"",publicUrl:process.env.S3_PUBLIC_URL||""}},server:{port:Number(process.env.PORT)||4e3,host:process.env.HOST||"0.0.0.0",logLevel:process.env.LOG_LEVEL||"info"},http:{enabled:v("SIGIL_HTTP_ENABLED","true")!=="false",host:v("SIGIL_HTTP_HOST","127.0.0.1"),port:Number(v("SIGIL_HTTP_PORT",7777))},network:{mode:v("SIGIL_MODE","solo"),enabled:v("SIGIL_NETWORK_ENABLED",null)===null?v("SIGIL_MODE","solo")!=="solo":v("SIGIL_NETWORK_ENABLED","false")!=="false",masterNodeId:v("SIGIL_MASTER_NODE_ID","")||null},defaults:{namespace:process.env.DEFAULT_NAMESPACE||"default"},memory:{skipThreshold:Number(process.env.MEMORY_SKIP_THRESHOLD)||.88,ambiguousThreshold:Number(process.env.MEMORY_AMBIGUOUS_THRESHOLD)||.78,minFactSimilarity:Number(process.env.MEMORY_MIN_FACT_SIMILARITY)||.45,injectionFloor:Number(process.env.MEMORY_INJECTION_FLOOR)||.6},search:{synthesize:v("SIGIL_SYNTHESIZE","true")!=="false",synthesizeModel:v("SIGIL_SYNTH_MODEL","")},ingest:{eagerExtract:v("SIGIL_EAGER_EXTRACT","true")!=="false"},hebbian:{entity:{enabled:v("SIGIL_HEBBIAN_ENTITY_ENABLED",null,"true")!=="false",eta:Number(v("SIGIL_HEBBIAN_ENTITY_ETA",null,1)),cap:Number(v("SIGIL_HEBBIAN_ENTITY_CAP",null,50)),halfLifeDays:Number(v("SIGIL_HEBBIAN_ENTITY_HALF_LIFE_DAYS",null,30)),minEffective:Number(v("SIGIL_HEBBIAN_ENTITY_MIN_EFFECTIVE",null,.5)),rrfWeight:Number(v("SIGIL_HEBBIAN_ENTITY_RRF_WEIGHT",null,.3)),maxWriteEntities:Number(v("SIGIL_HEBBIAN_ENTITY_MAX_WRITE",null,12)),expandPerSeed:Number(v("SIGIL_HEBBIAN_ENTITY_EXPAND_PER_SEED",null,3))}}},g=a_});var _l={};x(_l,{chat:()=>c_,meta:()=>l_,setup:()=>u_});async function c_(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.openaiModel,o=[{role:"user",content:e}];r&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:n,messages:o};r&&(i.response_format={type:"json_object"});let s=await fetch("https://api.openai.com/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${g.llm.openaiApiKey}`},body:JSON.stringify(i)});if(!s.ok){let d=await s.text();throw new Error(`OpenAI error ${s.status}: ${d}`)}let a=await s.json(),c=a.choices[0].message.content.trim(),l=a.usage||{};return{text:c,inputTokens:l.prompt_tokens||0,outputTokens:l.completion_tokens||0,model:n}}async function u_({existing:e,clack:t}){let r=e.OPENAI_API_KEY||"",n=await t.text({message:"OpenAI API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-proj-...",validate:o=>{if(!o&&!r)return"API key is required";if(o&&!o.startsWith("sk-"))return'OpenAI keys start with "sk-" \u2014 check paste'}});return t.isCancel(n)?null:{env:{OPENAI_API_KEY:n||r}}}var l_,xl=u(()=>{A();l_={id:"openai",label:"OpenAI",hint:"gpt-4o-mini"}});var Sl={};x(Sl,{buildLocalConnection:()=>Oe});function Oe(e){return{host:e.db.host,port:e.db.port,database:e.db.database,user:e.db.user,password:e.db.password}}var er=u(()=>{});var us={};x(us,{buildLocalConnection:()=>Oe,buildUrlConnection:()=>re,classifyProvider:()=>ze,selectDriver:()=>ls});function ls(e){let t=e.db.url;return t?{kind:"url",provider:ze(t),connection:re(t)}:{kind:"local",provider:"local",connection:Oe(e)}}var wo=u(()=>{er();_t()});var F={};x(F,{default:()=>h});import d_ from"knex";function f_(e){return Array.isArray(e)?e.map(ds):e&&typeof e=="object"?ds(e):e}function p_(e,t){return t(m_(e))}function ds(e){if(!e||typeof e!="object"||e instanceof Date)return e;if(Array.isArray(e))return e.map(ds);let t={};for(let[r,n]of Object.entries(e))t[r.replace(/_([a-z])/g,(o,i)=>i.toUpperCase())]=n;return t}function m_(e){return e.replace(/[A-Z]/g,t=>`_${t.toLowerCase()}`)}var Al,bl,h,T=u(()=>{A();wo();Al=ls(g),bl=d_({client:"pg",connection:Al.connection,pool:{min:2,max:10},postProcessResponse:f_,wrapIdentifier:p_});bl.__sigilDriver=Al;h=bl});function he(e){return Math.ceil((e||"").length/4)}function fs(e,t,r){let n=h_[e];return n?(t*n.input+r*n.output)/1e6:0}function sn({provider:e,model:t,caller:r,input:n,response:o,inputTokens:i,outputTokens:s,cost:a,durationMs:c,status:l,error:d}){h("llm_log").insert({provider:e,model:t,caller:r,input:n?.slice(0,1e4),response:o?.slice(0,1e4),inputTokens:i,outputTokens:s,cost:a,durationMs:c,status:l,error:d?.slice(0,2e3)}).catch(p=>console.error("[llm-log] Write failed:",p.message))}async function ps(e,t=3){for(let r=1;r<=t;r++)try{return await e()}catch(n){if(r===t)throw n;let o=Math.min(1e3*2**(r-1),1e4);await new Promise(i=>setTimeout(i,o))}}var h_,an=u(()=>{T();h_={"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 Tl={};x(Tl,{chat:()=>y_,meta:()=>w_,setup:()=>E_});async function g_(){if(!ms){let{default:e}=await import("@anthropic-ai/sdk");ms=new e({apiKey:g.llm.apiKey})}return ms}async function y_(e,{model:t,jsonMode:r=!1}={}){let n=t||"claude-haiku-4-5-20251001",o=await g_(),i=[{role:"user",content:e}],s=r?"Respond with valid JSON only. No explanation or wrapping.":void 0,a=await o.messages.create({model:n,max_tokens:4096,messages:i,...s&&{system:s}});return{text:a.content[0].text.trim(),inputTokens:a.usage?.input_tokens||he(e),outputTokens:a.usage?.output_tokens||he(a.content[0].text),model:n}}async function E_({existing:e,clack:t}){let r=e.ANTHROPIC_API_KEY||"",n=await t.text({message:"Anthropic API key (paste, then Enter)",placeholder:r?"(keep existing \u2014 press Enter)":"sk-ant-...",validate:o=>{if(!o&&!r)return"API key is required";if(o&&!o.startsWith("sk-ant-"))return'Anthropic keys start with "sk-ant-" \u2014 check paste'}});return t.isCancel(n)?null:{env:{ANTHROPIC_API_KEY:n||r}}}var ms,w_,Il=u(()=>{A();an();ms=null;w_={id:"anthropic",label:"Anthropic",hint:"Claude Haiku \u2014 requires API key"}});var Rl={};x(Rl,{chat:()=>x_,meta:()=>S_,setup:()=>A_});async function x_(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.openrouterModel;if(!g.llm.openrouterApiKey)throw new Error("OPENROUTER_API_KEY is not set");if(!n)throw new Error("No OpenRouter model resolved. Set LLM_OPENROUTER_MODEL or pass `model`.");let o=[{role:"user",content:e}];r&&!e.toLowerCase().includes("json")&&o.unshift({role:"system",content:"Respond with valid JSON."});let i={model:n,messages:o};r&&(i.response_format={type:"json_object"});let s=(g.llm.openrouterBaseUrl||__).replace(/\/+$/,""),a={"Content-Type":"application/json",Authorization:`Bearer ${g.llm.openrouterApiKey}`};g.llm.openrouterReferer&&(a["HTTP-Referer"]=g.llm.openrouterReferer),g.llm.openrouterTitle&&(a["X-Title"]=g.llm.openrouterTitle);let c=await fetch(`${s}/chat/completions`,{method:"POST",headers:a,body:JSON.stringify(i)});if(!c.ok){let m=await c.text();throw new Error(`OpenRouter error ${c.status}: ${m}`)}let l=await c.json(),p=(l.choices?.[0]?.message?.content||"").trim(),f=l.usage||{};return{text:p,inputTokens:f.prompt_tokens||0,outputTokens:f.completion_tokens||0,model:l.model||n}}async function A_({existing:e,clack:t}){let r={},n=e.OPENROUTER_API_KEY||"",o=await t.text({message:"OpenRouter API key (paste, then Enter)",placeholder:n?"(keep existing \u2014 press Enter)":"sk-or-v1-...",validate:c=>{if(!c&&!n)return"API key is required";if(c&&!c.startsWith("sk-or-"))return'OpenRouter keys start with "sk-or-" \u2014 check paste'}});if(t.isCancel(o))return null;r.OPENROUTER_API_KEY=o||n;let i=e.LLM_OPENROUTER_MODEL||"",s=await t.text({message:"OpenRouter model (vendor/model)",placeholder:i||Ol,validate:c=>{if(c&&!c.includes("/"))return'OpenRouter models are "vendor/model" \u2014 e.g. google/gemini-flash-latest'}});if(t.isCancel(s))return null;r.LLM_OPENROUTER_MODEL=s||i||Ol;let a=await t.select({message:"Configure per-task model overrides? (advanced \u2014 better quality / cost)",options:[{value:"no",label:"No, use one model everywhere",hint:"simpler \u2014 debug one model"},{value:"yes",label:"Yes, configure smart split",hint:"~5\xD7 cheaper extraction + better AUDM/synthesis"}],initialValue:"no"});if(t.isCancel(a))return null;if(a==="yes"){let c=await t.text({message:"Extraction model (high-volume; cheap matters)",placeholder:e.LLM_EXTRACTION_MODEL||tr.extraction});if(t.isCancel(c))return null;r.LLM_EXTRACTION_MODEL=c||e.LLM_EXTRACTION_MODEL||tr.extraction;let l=await t.text({message:"Decision model (AUDM; smart matters)",placeholder:e.LLM_DECISION_MODEL||tr.decision});if(t.isCancel(l))return null;r.LLM_DECISION_MODEL=l||e.LLM_DECISION_MODEL||tr.decision;let d=await t.text({message:"Synthesis model (read-time answer composition)",placeholder:e.SIGIL_SYNTH_MODEL||tr.synthesis});if(t.isCancel(d))return null;r.SIGIL_SYNTH_MODEL=d||e.SIGIL_SYNTH_MODEL||tr.synthesis}return t.note(`OpenRouter can drive both LLM calls and embeddings.
|
|
23
25
|
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
|
|
26
|
+
or you can use a direct provider (Ollama / OpenAI / Voyage) for embeddings.`,"OpenRouter scope"),{env:r}}var __,S_,Ol,tr,Cl=u(()=>{A();__="https://openrouter.ai/api/v1";S_={id:"openrouter",label:"OpenRouter",hint:"one key, many models (Anthropic / OpenAI / Meta / ...)"},Ol="google/gemini-flash-latest",tr={extraction:"openrouter:qwen/qwen3.5-flash",decision:"openrouter:anthropic/claude-sonnet-latest",synthesis:"openrouter:anthropic/claude-sonnet-latest"}});var Nl={};x(Nl,{chat:()=>R_,meta:()=>C_,setup:()=>N_});import{spawn as b_}from"node:child_process";function O_(e,t){let r=g.llm.cliTimeout||12e4;return new Promise((n,o)=>{let i=b_("claude",e,{stdio:["pipe","pipe","pipe"]}),s=setTimeout(()=>{i.kill("SIGTERM"),o(new Error(`claude CLI timed out after ${r}ms`))},r),a="",c="";i.stdout.on("data",l=>{a+=l}),i.stderr.on("data",l=>{c+=l}),i.on("error",l=>{clearTimeout(s),o(new Error(`Failed to spawn claude CLI: ${l.message}`))}),i.on("close",l=>{clearTimeout(s),n({stdout:a,stderr:c,code:l})}),i.stdin.write(t),i.stdin.end()})}async function R_(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.cliModel||"haiku",o=T_[n]||n,i=["-p","--model",o,"--output-format","json"];r&&i.push("--json-schema",I_);let{stdout:s,stderr:a,code:c}=await O_(i,e);if(c!==0)throw new Error(`claude CLI exited ${c}: ${(a||s).slice(0,500)}`);let l;try{l=JSON.parse(s)}catch{return{text:s.trim(),inputTokens:he(e),outputTokens:he(s),model:o}}if(l.is_error)throw new Error(`claude CLI error: ${l.result||"unknown error"}`);let d=r&&l.structured_output?JSON.stringify(l.structured_output):(l.result||"").trim(),p=l.usage||{};return{text:d,inputTokens:p.input_tokens||he(e),outputTokens:p.output_tokens||he(d),model:o,cost:l.total_cost_usd||0}}async function N_(){return{env:{}}}var T_,I_,C_,vl=u(()=>{A();an();T_={"claude-haiku-4-5-20251001":"haiku","claude-sonnet-4-6":"sonnet","claude-opus-4-6":"opus"},I_=JSON.stringify({type:"object",additionalProperties:!0});C_={id:"claude-cli",label:"Claude Code",hint:"uses your existing subscription \u2014 no extra API key"}});var Dl={};x(Dl,{chat:()=>v_,meta:()=>D_,setup:()=>L_});async function v_(e,{model:t,jsonMode:r=!1}={}){let n=t||g.llm.ollamaModel,o=`${g.llm.ollamaHost}/api/chat`,i={model:n,messages:[{role:"user",content:e}],stream:!1};r&&(i.format="json");let s=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!s.ok){let c=await s.text();throw new Error(`Ollama error ${s.status}: ${c}`)}let a=await s.json();return{text:a.message.content.trim(),inputTokens:a.prompt_eval_count||he(e),outputTokens:a.eval_count||he(a.message.content),model:n}}async function L_({existing:e,clack:t}){let r=e.OLLAMA_HOST||"http://localhost:11434",n=await t.text({message:"Ollama host",placeholder:r,initialValue:r,validate:o=>{if(o&&!/^https?:\/\//.test(o))return"Must start with http:// or https://"}});return t.isCancel(n)?null:{env:{OLLAMA_HOST:n||r}}}var D_,Ll=u(()=>{A();an();D_={id:"ollama",label:"Ollama",hint:"local models \u2014 no API cost"}});function hs(e,t){let r={};for(let n of e)r[n[t]]=n;return r}function Eo(e,t){if(t<1)return[];let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}var _o=u(()=>{});var Pl={};x(Pl,{embedBatch:()=>k_});async function k_(e,{model:t,ollamaHost:r}){let n=Eo(e,P_),o=[];for(let i of n){let s=await fetch(`${r}/api/embed`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:t,input:i})});if(!s.ok)throw new Error(`Ollama embed failed: ${s.status} ${await s.text()}`);let a=await s.json();o.push(...a.embeddings)}return o}var P_,kl=u(()=>{_o();P_=50});var Ml={};x(Ml,{embedBatch:()=>M_});async function M_(e,{model:t,openaiApiKey:r,dimensions:n}={}){let o={model:t,input:e};n&&/^text-embedding-3/.test(t)&&(o.dimensions=n);let i=await fetch("https://api.openai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(o)});if(!i.ok)throw new Error(`OpenAI embed failed: ${i.status} ${await i.text()}`);return(await i.json()).data.map(a=>a.embedding)}var Hl=u(()=>{});var Bl={};x(Bl,{embedBatch:()=>B_});async function B_(e,{model:t,voyageApiKey:r,inputType:n="document",dimensions:o}={}){if(!r)throw new Error("VOYAGE_API_KEY is not set. Get one at dashboard.voyageai.com.");let i=Eo(e,H_),s=[];for(let a of i){let c={input:a,model:t||"voyage-3-large",input_type:n==="query"?"query":"document"};o&&(c.output_dimension=o);let l=await fetch("https://api.voyageai.com/v1/embeddings",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(c)});if(!l.ok){let f=await l.text();throw new Error(`Voyage embed failed: ${l.status} ${f}`)}let p=[...(await l.json()).data].sort((f,m)=>f.index-m.index);s.push(...p.map(f=>f.embedding))}return s}var H_,Fl=u(()=>{_o();H_=50});var $l={};x($l,{embedBatch:()=>$_});async function $_(e,{model:t,openrouterApiKey:r,openrouterBaseUrl:n,openrouterReferer:o,openrouterTitle:i,dimensions:s}={}){if(!r)throw new Error("OPENROUTER_API_KEY is not set");if(!t)throw new Error('No OpenRouter embedding model resolved. Set EMBEDDING_MODEL (e.g. "openai/text-embedding-3-large").');let a={model:t,input:e};s&&/(^|\/)text-embedding-3/.test(t)&&(a.dimensions=s);let c=(n||F_).replace(/\/+$/,""),l={"Content-Type":"application/json",Authorization:`Bearer ${r}`};o&&(l["HTTP-Referer"]=o),i&&(l["X-Title"]=i);let d=await fetch(`${c}/embeddings`,{method:"POST",headers:l,body:JSON.stringify(a)});if(!d.ok)throw new Error(`OpenRouter embed failed: ${d.status} ${await d.text()}`);return[...(await d.json()).data].sort((m,w)=>m.index-w.index).map(m=>m.embedding)}var F_,Ul=u(()=>{F_="https://openrouter.ai/api/v1"});var Wl={};x(Wl,{detectEmbeddingProvider:()=>Ss,detectProvider:()=>xs,getEmbedder:()=>ws,getProvider:()=>So,isClaudeCliAvailable:()=>jl,isOllamaReachable:()=>_s,listProvidersForSetup:()=>j_,resetDetection:()=>G_,resolveProviderAndModel:()=>Es});import{spawn as U_}from"node:child_process";async function So(e){if(!gs[e]){let t=xo[e];if(!t)throw new Error(`Unknown LLM provider: "${e}". Available: ${Object.keys(xo).join(", ")}`);let r=await t();gs[e]=r.chat}return gs[e]}async function ws(e){if(!ys[e]){let t=Gl[e];if(!t)throw new Error(`Unknown embedding provider: "${e}". Available: ${Object.keys(Gl).join(", ")}`);let r=await t();ys[e]=r.embedBatch}return ys[e]}function Es(e,t){if(!e)return{provider:t,model:null};let r=e.indexOf(":");return r>0&&xo[e.slice(0,r)]?{provider:e.slice(0,r),model:e.slice(r+1)}:{provider:t,model:e}}async function _s(){let e=g.llm.ollamaHost||g.embedding.ollamaHost||"http://localhost:11434";try{return(await fetch(`${e}/api/tags`,{signal:AbortSignal.timeout(2e3)})).ok}catch{return!1}}function jl(){return new Promise(e=>{let t=U_("claude",["--version"],{stdio:"pipe"});t.on("error",()=>e(!1)),t.on("close",r=>e(r===0)),setTimeout(()=>{t.kill(),e(!1)},3e3)})}async function xs(){if(Y)return Y;if(g.llm.provider)return Y=g.llm.provider,Y;if(g.llm.openrouterApiKey)return Y="openrouter",Y;if(g.llm.apiKey)return Y="anthropic",Y;if(g.llm.openaiApiKey)return Y="openai",Y;if(await _s())return Y="ollama",Y;if(await jl())return Y="claude-cli",Y;throw new Error(`No LLM provider available. Either:
|
|
25
27
|
- Set LLM_PROVIDER (openai, anthropic, openrouter, ollama, claude-cli)
|
|
26
28
|
- Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY
|
|
27
29
|
- Start Ollama locally
|
|
28
|
-
- Install the Claude CLI (claude)`)}async function
|
|
30
|
+
- Install the Claude CLI (claude)`)}async function Ss(){if(ee)return ee;if(g.embedding.provider)return ee=g.embedding.provider,ee;if(g.embedding.voyageApiKey)return ee="voyage",ee;if(await _s())return ee="ollama",ee;if(g.embedding.openaiApiKey)return ee="openai",ee;if(g.embedding.openrouterApiKey)return ee="openrouter",ee;throw new Error(`No embedding provider available. Either:
|
|
29
31
|
- Set EMBEDDING_PROVIDER (voyage, ollama, openai, openrouter)
|
|
30
32
|
- Set VOYAGE_API_KEY (recommended \u2014 best quality)
|
|
31
33
|
- Start Ollama locally
|
|
32
34
|
- Set OPENAI_API_KEY
|
|
33
|
-
- Set OPENROUTER_API_KEY (and EMBEDDING_MODEL like "openai/text-embedding-3-large")`)}
|
|
35
|
+
- Set OPENROUTER_API_KEY (and EMBEDDING_MODEL like "openai/text-embedding-3-large")`)}function G_(){Y=null,ee=null}async function j_(){return await Promise.all(Object.entries(xo).map(async([t,r])=>{let n=await r();if(!n.meta||typeof n.setup!="function")throw new Error(`Provider "${t}" is missing the init contract \u2014 expected exports: meta, setup`);return{...n.meta,setup:n.setup}}))}var xo,Gl,gs,ys,Y,ee,Ao=u(()=>{A();xo={openai:()=>Promise.resolve().then(()=>(xl(),_l)),anthropic:()=>Promise.resolve().then(()=>(Il(),Tl)),openrouter:()=>Promise.resolve().then(()=>(Cl(),Rl)),"claude-cli":()=>Promise.resolve().then(()=>(vl(),Nl)),ollama:()=>Promise.resolve().then(()=>(Ll(),Dl))},Gl={ollama:()=>Promise.resolve().then(()=>(kl(),Pl)),openai:()=>Promise.resolve().then(()=>(Hl(),Ml)),voyage:()=>Promise.resolve().then(()=>(Fl(),Bl)),openrouter:()=>Promise.resolve().then(()=>(Ul(),$l))},gs={},ys={};Y=null,ee=null});function G(e){return e?`[${e.join(",")}]`:null}function Kl(){let e=Number(g.embedding.dimensions)||768;if(!Number.isInteger(e)||e<=0)throw new Error(`Invalid EMBEDDING_DIMENSIONS: ${g.embedding.dimensions}`);return e}function Re(e="embedding"){return`(${e}::halfvec(${Kl()}))`}function Ce(){return`?::halfvec(${Kl()})`}var Ze=u(()=>{A()});import{createHash as W_}from"node:crypto";function Y_(e,t,r,n="document"){let o=W_("sha256");return o.update(e),o.update("\0"),o.update(t),o.update("\0"),o.update(n),o.update("\0"),o.update(r),o.digest("hex")}async function V_(e){if(!e.length)return new Map;let t=await h("embedding_cache").whereIn("key",e).select("key","embedding");return new Map(t.map(r=>[r.key,q_(r.embedding)]))}function q_(e){return Array.isArray(e)||typeof e!="string"?e:(e.startsWith("[")?e.slice(1,-1):e).split(",").map(Number)}async function J_(e){e.length&&await h("embedding_cache").whereIn("key",e).update({hits:h.raw("hits + 1"),lastUsedAt:h.fn.now()})}async function z_(e,t,r){if(e.length){for(let{key:n,embedding:o}of e)await h.raw(`
|
|
34
36
|
INSERT INTO embedding_cache (key, provider, model, embedding, hits, created_at, last_used_at)
|
|
35
37
|
VALUES (?, ?, ?, ?, 0, NOW(), NOW())
|
|
36
38
|
ON CONFLICT (key) DO UPDATE
|
|
37
39
|
SET last_used_at = NOW(),
|
|
38
40
|
hits = embedding_cache.hits + 1
|
|
39
|
-
`,[n,t,r
|
|
41
|
+
`,[n,t,r,G(o)]);await Z_()}}async function Z_(){let e=Date.now();if(e-Vl<X_)return;Vl=e;let[{count:t}]=await h("embedding_cache").count("key as count"),r=Number(t);if(r<=Yl)return;let n=Math.min(r-Yl,K_);await h.raw(`
|
|
40
42
|
DELETE FROM embedding_cache WHERE key IN (
|
|
41
43
|
SELECT key FROM embedding_cache ORDER BY last_used_at ASC LIMIT ?
|
|
42
44
|
)
|
|
43
|
-
`,[n])}async function
|
|
44
|
-
`)})}let f=
|
|
45
|
+
`,[n])}async function ql(e,t,r,n,o,i={}){if(!e.length)return[];let s=i.inputType||o?.inputType||"document",a=e.map(m=>Y_(t,r,m,s)),c=await V_(a),l=[],d=[],p=new Array(e.length);for(let m=0;m<e.length;m++){let w=c.get(a[m]);w?p[m]=w:(l.push(e[m]),d.push(m))}if(l.length){let m=await n(l,o),w=[];for(let y=0;y<l.length;y++){let E=d[y];p[E]=m[y],w.push({key:a[E],embedding:m[y]})}z_(w,t,r).catch(y=>{process.stderr.write(`[embedding-cache] store failed: ${y.message}
|
|
46
|
+
`)})}let f=a.filter(m=>c.has(m));return f.length&&J_(f).catch(()=>{}),p}var Yl,K_,Vl,X_,Jl=u(()=>{Ze();T();Yl=1e4,K_=500;Vl=0,X_=6e4});var zl={};x(zl,{dimensions:()=>Q_,embed:()=>xt,embedBatch:()=>He});async function xt(e,t={}){let[r]=await He([e],t);return r}async function He(e,{inputType:t="document"}={}){if(!e.length)return[];let r=await Ss(),n=await ws(r),o=g.embedding.model,i={...g.embedding,inputType:t};return ql(e,r,o,n,i,{inputType:t})}var Q_,rr=u(()=>{A();Ao();Jl();({dimensions:Q_}=g.embedding)});var Zl={};x(Zl,{parseJson:()=>bo,prompt:()=>Be,promptJson:()=>ge});async function Xl(e){let t=await xs();return Es(e,t)}async function Be(e,{model:t,caller:r}={}){let{provider:n,model:o}=await Xl(t),i=await So(n),s=Date.now();try{let a=await ps(()=>i(e,{model:o,jsonMode:!1}),g.llm.maxRetries),c=a.cost||fs(a.model,a.inputTokens,a.outputTokens);return sn({provider:n,model:a.model,caller:r,input:e,response:a.text,inputTokens:a.inputTokens,outputTokens:a.outputTokens,cost:c,durationMs:Date.now()-s,status:"success"}),a.text}catch(a){throw sn({provider:n,model:o,caller:r,input:e,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-s,status:"error",error:a.message}),a}}async function ge(e,{model:t,caller:r}={}){let{provider:n,model:o}=await Xl(t),i=await So(n),s=Date.now();try{let a=await ps(()=>i(e,{model:o,jsonMode:!0}),g.llm.maxRetries),c=a.cost||fs(a.model,a.inputTokens,a.outputTokens);return sn({provider:n,model:a.model,caller:r,input:e,response:a.text,inputTokens:a.inputTokens,outputTokens:a.outputTokens,cost:c,durationMs:Date.now()-s,status:"success"}),bo(a.text)}catch(a){throw sn({provider:n,model:o,caller:r,input:e,response:null,inputTokens:0,outputTokens:0,cost:0,durationMs:Date.now()-s,status:"error",error:a.message}),a}}function bo(e){try{return JSON.parse(e.trim())}catch{}let t=e.match(/```(?:json)?\s*([\s\S]*?)```/);if(t)try{return JSON.parse(t[1].trim())}catch{}let r=e.match(/[\[{][\s\S]*[\]}]/);if(r)try{return JSON.parse(r[0])}catch{}return null}var ye=u(()=>{A();Ao();an()});import{readFile as ex}from"node:fs/promises";import{join as tx}from"node:path";async function Ql(e,t,{title:r}){if(!e.length)return e;let n=await ex(rx,"utf8"),o=e.map((s,a)=>`Chunk ${a+1}: ${s.content.slice(0,200)}`),i=`${n}
|
|
45
47
|
|
|
46
48
|
---
|
|
47
49
|
|
|
@@ -56,7 +58,7 @@ ${o.join(`
|
|
|
56
58
|
|
|
57
59
|
---
|
|
58
60
|
|
|
59
|
-
Respond with a JSON array of ${e.length} context prefix strings.`;try{let
|
|
61
|
+
Respond with a JSON array of ${e.length} context prefix strings.`;try{let s=await ge(i,{model:g.llm.extractionModel,caller:"contextualizer"}),a=Array.isArray(s)?s:s&&typeof s=="object"?Object.values(s).find(l=>Array.isArray(l))??null:null;if(!a)return console.warn("[contextualizer] LLM did not return an array \u2014 skipping"),e;let c=a;return c.length!==e.length&&console.warn(`[contextualizer] Got ${c.length} prefixes for ${e.length} chunks \u2014 using partial`),e.map((l,d)=>({...l,contextualPrefix:typeof c[d]=="string"?c[d]:null}))}catch(s){return console.error("[contextualizer] Failed:",s.message),e}}var rx,eu=u(()=>{ye();A();C();rx=tx(Q,"chunk-context.md")});var tu,ru=u(()=>{tu="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"});import{webcrypto as nu}from"node:crypto";function ox(e){if(e<0||e>1024)throw new RangeError("Wrong ID size");!St||St.length<e?(St=Buffer.allocUnsafe(e*nx),nu.getRandomValues(St),nr=0):nr+e>St.length&&(nu.getRandomValues(St),nr=0),nr+=e}function we(e=21){ox(e|=0);let t="";for(let r=nr-e;r<nr;r++)t+=tu[St[r]&63];return t}var nx,St,nr,or=u(()=>{ru();nx=128});var Is={};x(Is,{deleteDocument:()=>lx,findBySourcePath:()=>ix,findByUid:()=>sx,getStats:()=>ax,listDocuments:()=>cx,resetHash:()=>bs,updateCounts:()=>To,updateSourceMetadata:()=>Ts,upsert:()=>As});async function ix(e){let[t]=await h("document").where({sourcePath:e});return t||null}async function sx(e){let[t]=await h("document").where({uid:e});return t||null}async function As({sourcePath:e,sourceType:t,title:r=null,contentHash:n,namespace:o}){let i=`doc-${we(16)}`,{rows:[s]}=await h.raw(`
|
|
60
62
|
INSERT INTO document (uid, source_path, source_type, title, content_hash, namespace, last_ingested_at, created_at, updated_at)
|
|
61
63
|
VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW(), NOW())
|
|
62
64
|
ON CONFLICT (source_path, namespace) DO UPDATE SET
|
|
@@ -65,12 +67,12 @@ Respond with a JSON array of ${e.length} context prefix strings.`;try{let a=awai
|
|
|
65
67
|
last_ingested_at = NOW(),
|
|
66
68
|
updated_at = NOW()
|
|
67
69
|
RETURNING *, (xmax = 0) AS "isNew", content_hash != ? AS "contentChanged"
|
|
68
|
-
`,[i,e,t,r,n,o,n]),c=
|
|
70
|
+
`,[i,e,t,r,n,o,n]),c=s.isNew||s.contentChanged;return{doc:s,changed:c}}async function To(e,{chunkCount:t,factCount:r}){await h("document").where({id:e}).update({chunkCount:t,factCount:r})}async function ax(e){let t=h("document");e&&t.where({namespace:e});let r=await t;return{documentCount:r.length,totalChunks:r.reduce((n,o)=>n+(o.chunkCount||0),0),totalFacts:r.reduce((n,o)=>n+(o.factCount||0),0)}}async function cx({namespace:e,sourceType:t,limit:r=100}={}){let n=h("document").orderBy("createdAt","desc").limit(r);return e&&n.where({namespace:e}),t&&n.where({sourceType:t}),n}async function lx(e){await h("chunk").where({documentId:e}).del(),await h("document").where({id:e}).del()}async function bs(e){await h("document").where({id:e}).update({contentHash:null})}async function Ts(e,t,r=null){if(!t&&!r)return;let n={};t&&Object.keys(t).length&&(n.sourceMetadata=JSON.stringify(t)),r&&(n.connectionId=r),Object.keys(n).length&&await h("document").where({id:e}).update(n)}var Os=u(()=>{or();T()});async function ou(e,t,r){if(await h("chunk").where({documentId:e}).del(),!t.length)return[];let n=t.map((i,s)=>({documentId:e,chunkIndex:s,content:i.content,contextualPrefix:i.contextualPrefix||null,sectionHeading:i.sectionHeading||null,namespace:r,embedding:G(i.embedding)})),o=await h("chunk").insert(n).returning("*");return await h.raw(`
|
|
69
71
|
UPDATE chunk
|
|
70
72
|
SET search_vector = to_tsvector('english', COALESCE(contextual_prefix, '') || ' ' || content)
|
|
71
73
|
WHERE document_id = ?
|
|
72
|
-
`,[e]),o}var Hs=u(()=>{A();Se()});var iy,zr,Ro=u(()=>{iy=typeof global=="object"&&global&&global.Object===Object&&global,zr=iy});var ay,sy,M,de=u(()=>{Ro();ay=typeof self=="object"&&self&&self.Object===Object&&self,sy=zr||ay||Function("return this")(),M=sy});var cy,U,dt=u(()=>{de();cy=M.Symbol,U=cy});function dy(e){var t=ly.call(e,er),r=e[er];try{e[er]=void 0;var n=!0}catch{}var o=uy.call(e);return n&&(t?e[er]=r:delete e[er]),o}var Us,ly,uy,er,Gs,js=u(()=>{dt();Us=Object.prototype,ly=Us.hasOwnProperty,uy=Us.toString,er=U?U.toStringTag:void 0;Gs=dy});function my(e){return py.call(e)}var fy,py,Ws,Ys=u(()=>{fy=Object.prototype,py=fy.toString;Ws=my});function yy(e){return e==null?e===void 0?gy:hy:Ks&&Ks in Object(e)?Gs(e):Ws(e)}var hy,gy,Ks,re,ft=u(()=>{dt();js();Ys();hy="[object Null]",gy="[object Undefined]",Ks=U?U.toStringTag:void 0;re=yy});function wy(e){return e!=null&&typeof e=="object"}var ne,pt=u(()=>{ne=wy});function _y(e){return typeof e=="symbol"||ne(e)&&re(e)==Ey}var Ey,oe,mt=u(()=>{ft();pt();Ey="[object Symbol]";oe=_y});function xy(e,t){for(var r=-1,n=e==null?0:e.length,o=Array(n);++r<n;)o[r]=t(e[r],r,e);return o}var ht,Do=u(()=>{ht=xy});var by,D,z=u(()=>{by=Array.isArray,D=by});function zs(e){if(typeof e=="string")return e;if(D(e))return ht(e,zs)+"";if(oe(e))return Vs?Vs.call(e):"";var t=e+"";return t=="0"&&1/e==-Sy?"-0":t}var Sy,qs,Vs,Js,Xs=u(()=>{dt();Do();z();mt();Sy=1/0,qs=U?U.prototype:void 0,Vs=qs?qs.toString:void 0;Js=zs});function Iy(e){for(var t=e.length;t--&&Ay.test(e.charAt(t)););return t}var Ay,Zs,Qs=u(()=>{Ay=/\s/;Zs=Iy});function Ty(e){return e&&e.slice(0,Zs(e)+1).replace(vy,"")}var vy,ec,tc=u(()=>{Qs();vy=/^\s+/;ec=Ty});function Oy(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var ie,gt=u(()=>{ie=Oy});function Ly(e){if(typeof e=="number")return e;if(oe(e))return rc;if(ie(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=ie(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=ec(e);var r=Cy.test(e);return r||Ry.test(e)?Dy(e.slice(2),r?2:8):Ny.test(e)?rc:+e}var rc,Ny,Cy,Ry,Dy,nc,oc=u(()=>{tc();gt();mt();rc=NaN,Ny=/^[-+]0x[0-9a-f]+$/i,Cy=/^0b[01]+$/i,Ry=/^0o[0-7]+$/i,Dy=parseInt;nc=Ly});function Py(e){if(!e)return e===0?e:0;if(e=nc(e),e===ic||e===-ic){var t=e<0?-1:1;return t*ky}return e===e?e:0}var ic,ky,ac,sc=u(()=>{oc();ic=1/0,ky=17976931348623157e292;ac=Py});function My(e){var t=ac(e),r=t%1;return t===t?r?t-r:t:0}var cc,lc=u(()=>{sc();cc=My});function Fy(e){return e}var Ae,tr=u(()=>{Ae=Fy});function Gy(e){if(!ie(e))return!1;var t=re(e);return t==By||t==Hy||t==$y||t==Uy}var $y,By,Hy,Uy,Jr,Lo=u(()=>{ft();gt();$y="[object AsyncFunction]",By="[object Function]",Hy="[object GeneratorFunction]",Uy="[object Proxy]";Jr=Gy});var jy,Xr,uc=u(()=>{de();jy=M["__core-js_shared__"],Xr=jy});function Wy(e){return!!dc&&dc in e}var dc,fc,pc=u(()=>{uc();dc=(function(){var e=/[^.]+$/.exec(Xr&&Xr.keys&&Xr.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""})();fc=Wy});function qy(e){if(e!=null){try{return Ky.call(e)}catch{}try{return e+""}catch{}}return""}var Yy,Ky,ye,ko=u(()=>{Yy=Function.prototype,Ky=Yy.toString;ye=qy});function tw(e){if(!ie(e)||fc(e))return!1;var t=Jr(e)?ew:zy;return t.test(ye(e))}var Vy,zy,Jy,Xy,Zy,Qy,ew,mc,hc=u(()=>{Lo();pc();gt();ko();Vy=/[\\^$.*+?()[\]{}|]/g,zy=/^\[object .+?Constructor\]$/,Jy=Function.prototype,Xy=Object.prototype,Zy=Jy.toString,Qy=Xy.hasOwnProperty,ew=RegExp("^"+Zy.call(Qy).replace(Vy,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");mc=tw});function rw(e,t){return e?.[t]}var gc,yc=u(()=>{gc=rw});function nw(e,t){var r=gc(e,t);return mc(r)?r:void 0}var Y,Ie=u(()=>{hc();yc();Y=nw});var ow,Zr,wc=u(()=>{Ie();de();ow=Y(M,"WeakMap"),Zr=ow});function iw(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}var Ec,_c=u(()=>{Ec=iw});function aw(){}var xc,bc=u(()=>{xc=aw});function uw(e){var t=0,r=0;return function(){var n=lw(),o=cw-(n-r);if(r=n,o>0){if(++t>=sw)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var sw,cw,lw,Sc,Ac=u(()=>{sw=800,cw=16,lw=Date.now;Sc=uw});function dw(e){return function(){return e}}var Ic,vc=u(()=>{Ic=dw});var fw,yt,Po=u(()=>{Ie();fw=(function(){try{var e=Y(Object,"defineProperty");return e({},"",{}),e}catch{}})(),yt=fw});var pw,Tc,Oc=u(()=>{vc();Po();tr();pw=yt?function(e,t){return yt(e,"toString",{configurable:!0,enumerable:!1,value:Ic(t),writable:!0})}:Ae,Tc=pw});var mw,Nc,Cc=u(()=>{Oc();Ac();mw=Sc(Tc),Nc=mw});function hw(e,t,r,n){for(var o=e.length,i=r+(n?1:-1);n?i--:++i<o;)if(t(e[i],i,e))return i;return-1}var Rc,Dc=u(()=>{Rc=hw});function gw(e){return e!==e}var Lc,kc=u(()=>{Lc=gw});function yw(e,t,r){for(var n=r-1,o=e.length;++n<o;)if(e[n]===t)return n;return-1}var Pc,Mc=u(()=>{Pc=yw});function ww(e,t,r){return t===t?Pc(e,t,r):Rc(e,Lc,r)}var Fc,$c=u(()=>{Dc();kc();Mc();Fc=ww});function Ew(e,t){var r=e==null?0:e.length;return!!r&&Fc(e,t,0)>-1}var Bc,Hc=u(()=>{$c();Bc=Ew});function bw(e,t){var r=typeof e;return t=t??_w,!!t&&(r=="number"||r!="symbol"&&xw.test(e))&&e>-1&&e%1==0&&e<t}var _w,xw,wt,Qr=u(()=>{_w=9007199254740991,xw=/^(?:0|[1-9]\d*)$/;wt=bw});function Sw(e,t,r){t=="__proto__"&&yt?yt(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}var Uc,Gc=u(()=>{Po();Uc=Sw});function Aw(e,t){return e===t||e!==e&&t!==t}var Et,en=u(()=>{Et=Aw});function Iw(e,t,r){return t=jc(t===void 0?e.length-1:t,0),function(){for(var n=arguments,o=-1,i=jc(n.length-t,0),a=Array(i);++o<i;)a[o]=n[t+o];o=-1;for(var s=Array(t+1);++o<t;)s[o]=n[o];return s[t]=r(a),Ec(e,this,s)}}var jc,Wc,Yc=u(()=>{_c();jc=Math.max;Wc=Iw});function vw(e,t){return Nc(Wc(e,t,Ae),e+"")}var Kc,qc=u(()=>{tr();Yc();Cc();Kc=vw});function Ow(e){return typeof e=="number"&&e>-1&&e%1==0&&e<=Tw}var Tw,_t,tn=u(()=>{Tw=9007199254740991;_t=Ow});function Nw(e){return e!=null&&_t(e.length)&&!Jr(e)}var ve,rr=u(()=>{Lo();tn();ve=Nw});function Cw(e,t,r){if(!ie(r))return!1;var n=typeof t;return(n=="number"?ve(r)&&wt(t,r.length):n=="string"&&t in r)?Et(r[t],e):!1}var nr,Mo=u(()=>{en();rr();Qr();gt();nr=Cw});function Dw(e){var t=e&&e.constructor,r=typeof t=="function"&&t.prototype||Rw;return e===r}var Rw,Vc,zc=u(()=>{Rw=Object.prototype;Vc=Dw});function Lw(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n}var Jc,Xc=u(()=>{Jc=Lw});function Pw(e){return ne(e)&&re(e)==kw}var kw,Fo,Zc=u(()=>{ft();pt();kw="[object Arguments]";Fo=Pw});var Qc,Mw,Fw,$w,xt,rn=u(()=>{Zc();pt();Qc=Object.prototype,Mw=Qc.hasOwnProperty,Fw=Qc.propertyIsEnumerable,$w=Fo((function(){return arguments})())?Fo:function(e){return ne(e)&&Mw.call(e,"callee")&&!Fw.call(e,"callee")},xt=$w});function Bw(){return!1}var el,tl=u(()=>{el=Bw});var ol,rl,Hw,nl,Uw,Gw,or,$o=u(()=>{de();tl();ol=typeof exports=="object"&&exports&&!exports.nodeType&&exports,rl=ol&&typeof module=="object"&&module&&!module.nodeType&&module,Hw=rl&&rl.exports===ol,nl=Hw?M.Buffer:void 0,Uw=nl?nl.isBuffer:void 0,Gw=Uw||el,or=Gw});function pE(e){return ne(e)&&_t(e.length)&&!!R[re(e)]}var jw,Ww,Yw,Kw,qw,Vw,zw,Jw,Xw,Zw,Qw,eE,tE,rE,nE,oE,iE,aE,sE,cE,lE,uE,dE,fE,R,il,al=u(()=>{ft();tn();pt();jw="[object Arguments]",Ww="[object Array]",Yw="[object Boolean]",Kw="[object Date]",qw="[object Error]",Vw="[object Function]",zw="[object Map]",Jw="[object Number]",Xw="[object Object]",Zw="[object RegExp]",Qw="[object Set]",eE="[object String]",tE="[object WeakMap]",rE="[object ArrayBuffer]",nE="[object DataView]",oE="[object Float32Array]",iE="[object Float64Array]",aE="[object Int8Array]",sE="[object Int16Array]",cE="[object Int32Array]",lE="[object Uint8Array]",uE="[object Uint8ClampedArray]",dE="[object Uint16Array]",fE="[object Uint32Array]",R={};R[oE]=R[iE]=R[aE]=R[sE]=R[cE]=R[lE]=R[uE]=R[dE]=R[fE]=!0;R[jw]=R[Ww]=R[rE]=R[Yw]=R[nE]=R[Kw]=R[qw]=R[Vw]=R[zw]=R[Jw]=R[Xw]=R[Zw]=R[Qw]=R[eE]=R[tE]=!1;il=pE});function mE(e){return function(t){return e(t)}}var nn,Bo=u(()=>{nn=mE});var sl,ir,hE,Ho,gE,Uo,cl=u(()=>{Ro();sl=typeof exports=="object"&&exports&&!exports.nodeType&&exports,ir=sl&&typeof module=="object"&&module&&!module.nodeType&&module,hE=ir&&ir.exports===sl,Ho=hE&&zr.process,gE=(function(){try{var e=ir&&ir.require&&ir.require("util").types;return e||Ho&&Ho.binding&&Ho.binding("util")}catch{}})(),Uo=gE});var ll,yE,on,Go=u(()=>{al();Bo();cl();ll=Uo&&Uo.isTypedArray,yE=ll?nn(ll):il,on=yE});function _E(e,t){var r=D(e),n=!r&&xt(e),o=!r&&!n&&or(e),i=!r&&!n&&!o&&on(e),a=r||n||o||i,s=a?Jc(e.length,String):[],c=s.length;for(var l in e)(t||EE.call(e,l))&&!(a&&(l=="length"||o&&(l=="offset"||l=="parent")||i&&(l=="buffer"||l=="byteLength"||l=="byteOffset")||wt(l,c)))&&s.push(l);return s}var wE,EE,ul,dl=u(()=>{Xc();rn();z();$o();Qr();Go();wE=Object.prototype,EE=wE.hasOwnProperty;ul=_E});function xE(e,t){return function(r){return e(t(r))}}var fl,pl=u(()=>{fl=xE});var bE,ml,hl=u(()=>{pl();bE=fl(Object.keys,Object),ml=bE});function IE(e){if(!Vc(e))return ml(e);var t=[];for(var r in Object(e))AE.call(e,r)&&r!="constructor"&&t.push(r);return t}var SE,AE,gl,yl=u(()=>{zc();hl();SE=Object.prototype,AE=SE.hasOwnProperty;gl=IE});function vE(e){return ve(e)?ul(e):gl(e)}var bt,an=u(()=>{dl();yl();rr();bt=vE});function NE(e,t){if(D(e))return!1;var r=typeof e;return r=="number"||r=="symbol"||r=="boolean"||e==null||oe(e)?!0:OE.test(e)||!TE.test(e)||t!=null&&e in Object(t)}var TE,OE,St,sn=u(()=>{z();mt();TE=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,OE=/^\w*$/;St=NE});var CE,we,ar=u(()=>{Ie();CE=Y(Object,"create"),we=CE});function RE(){this.__data__=we?we(null):{},this.size=0}var wl,El=u(()=>{ar();wl=RE});function DE(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var _l,xl=u(()=>{_l=DE});function ME(e){var t=this.__data__;if(we){var r=t[e];return r===LE?void 0:r}return PE.call(t,e)?t[e]:void 0}var LE,kE,PE,bl,Sl=u(()=>{ar();LE="__lodash_hash_undefined__",kE=Object.prototype,PE=kE.hasOwnProperty;bl=ME});function BE(e){var t=this.__data__;return we?t[e]!==void 0:$E.call(t,e)}var FE,$E,Al,Il=u(()=>{ar();FE=Object.prototype,$E=FE.hasOwnProperty;Al=BE});function UE(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=we&&t===void 0?HE:t,this}var HE,vl,Tl=u(()=>{ar();HE="__lodash_hash_undefined__";vl=UE});function At(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var jo,Ol=u(()=>{El();xl();Sl();Il();Tl();At.prototype.clear=wl;At.prototype.delete=_l;At.prototype.get=bl;At.prototype.has=Al;At.prototype.set=vl;jo=At});function GE(){this.__data__=[],this.size=0}var Nl,Cl=u(()=>{Nl=GE});function jE(e,t){for(var r=e.length;r--;)if(Et(e[r][0],t))return r;return-1}var Te,sr=u(()=>{en();Te=jE});function KE(e){var t=this.__data__,r=Te(t,e);if(r<0)return!1;var n=t.length-1;return r==n?t.pop():YE.call(t,r,1),--this.size,!0}var WE,YE,Rl,Dl=u(()=>{sr();WE=Array.prototype,YE=WE.splice;Rl=KE});function qE(e){var t=this.__data__,r=Te(t,e);return r<0?void 0:t[r][1]}var Ll,kl=u(()=>{sr();Ll=qE});function VE(e){return Te(this.__data__,e)>-1}var Pl,Ml=u(()=>{sr();Pl=VE});function zE(e,t){var r=this.__data__,n=Te(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}var Fl,$l=u(()=>{sr();Fl=zE});function It(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var Oe,cr=u(()=>{Cl();Dl();kl();Ml();$l();It.prototype.clear=Nl;It.prototype.delete=Rl;It.prototype.get=Ll;It.prototype.has=Pl;It.prototype.set=Fl;Oe=It});var JE,Ne,cn=u(()=>{Ie();de();JE=Y(M,"Map"),Ne=JE});function XE(){this.size=0,this.__data__={hash:new jo,map:new(Ne||Oe),string:new jo}}var Bl,Hl=u(()=>{Ol();cr();cn();Bl=XE});function ZE(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var Ul,Gl=u(()=>{Ul=ZE});function QE(e,t){var r=e.__data__;return Ul(t)?r[typeof t=="string"?"string":"hash"]:r.map}var Ce,lr=u(()=>{Gl();Ce=QE});function e_(e){var t=Ce(this,e).delete(e);return this.size-=t?1:0,t}var jl,Wl=u(()=>{lr();jl=e_});function t_(e){return Ce(this,e).get(e)}var Yl,Kl=u(()=>{lr();Yl=t_});function r_(e){return Ce(this,e).has(e)}var ql,Vl=u(()=>{lr();ql=r_});function n_(e,t){var r=Ce(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var zl,Jl=u(()=>{lr();zl=n_});function vt(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var Ye,ln=u(()=>{Hl();Wl();Kl();Vl();Jl();vt.prototype.clear=Bl;vt.prototype.delete=jl;vt.prototype.get=Yl;vt.prototype.has=ql;vt.prototype.set=zl;Ye=vt});function Wo(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(o_);var r=function(){var n=arguments,o=t?t.apply(this,n):n[0],i=r.cache;if(i.has(o))return i.get(o);var a=e.apply(this,n);return r.cache=i.set(o,a)||i,a};return r.cache=new(Wo.Cache||Ye),r}var o_,Xl,Zl=u(()=>{ln();o_="Expected a function";Wo.Cache=Ye;Xl=Wo});function a_(e){var t=Xl(e,function(n){return r.size===i_&&r.clear(),n}),r=t.cache;return t}var i_,Ql,eu=u(()=>{Zl();i_=500;Ql=a_});var s_,c_,l_,tu,ru=u(()=>{eu();s_=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,c_=/\\(\\)?/g,l_=Ql(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(s_,function(r,n,o,i){t.push(o?i.replace(c_,"$1"):n||r)}),t}),tu=l_});function u_(e){return e==null?"":Js(e)}var nu,ou=u(()=>{Xs();nu=u_});function d_(e,t){return D(e)?e:St(e,t)?[e]:tu(nu(e))}var un,Yo=u(()=>{z();sn();ru();ou();un=d_});function p_(e){if(typeof e=="string"||oe(e))return e;var t=e+"";return t=="0"&&1/e==-f_?"-0":t}var f_,Re,ur=u(()=>{mt();f_=1/0;Re=p_});function m_(e,t){t=un(t,e);for(var r=0,n=t.length;e!=null&&r<n;)e=e[Re(t[r++])];return r&&r==n?e:void 0}var Tt,dn=u(()=>{Yo();ur();Tt=m_});function h_(e,t,r){var n=e==null?void 0:Tt(e,t);return n===void 0?r:n}var iu,au=u(()=>{dn();iu=h_});function g_(e,t){for(var r=-1,n=t.length,o=e.length;++r<n;)e[o+r]=t[r];return e}var fn,Ko=u(()=>{fn=g_});function y_(e){return D(e)||xt(e)||!!(su&&e&&e[su])}var su,cu,lu=u(()=>{dt();rn();z();su=U?U.isConcatSpreadable:void 0;cu=y_});function uu(e,t,r,n,o){var i=-1,a=e.length;for(r||(r=cu),o||(o=[]);++i<a;){var s=e[i];t>0&&r(s)?t>1?uu(s,t-1,r,n,o):fn(o,s):n||(o[o.length]=s)}return o}var du,fu=u(()=>{Ko();lu();du=uu});function w_(e,t,r){var n=-1,o=e.length;t<0&&(t=-t>o?0:o+t),r=r>o?o:r,r<0&&(r+=o),o=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(o);++n<o;)i[n]=e[n+t];return i}var pu,mu=u(()=>{pu=w_});function x_(e,t,r){(r?nr(e,t,r):t===void 0)?t=1:t=__(cc(t),0);var n=e==null?0:e.length;if(!n||t<1)return[];for(var o=0,i=0,a=Array(E_(n/t));o<n;)a[i++]=pu(e,o,o+=t);return a}var E_,__,qo,hu=u(()=>{mu();Mo();lc();E_=Math.ceil,__=Math.max;qo=x_});function b_(){this.__data__=new Oe,this.size=0}var gu,yu=u(()=>{cr();gu=b_});function S_(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}var wu,Eu=u(()=>{wu=S_});function A_(e){return this.__data__.get(e)}var _u,xu=u(()=>{_u=A_});function I_(e){return this.__data__.has(e)}var bu,Su=u(()=>{bu=I_});function T_(e,t){var r=this.__data__;if(r instanceof Oe){var n=r.__data__;if(!Ne||n.length<v_-1)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new Ye(n)}return r.set(e,t),this.size=r.size,this}var v_,Au,Iu=u(()=>{cr();cn();ln();v_=200;Au=T_});function Ot(e){var t=this.__data__=new Oe(e);this.size=t.size}var Nt,Vo=u(()=>{cr();yu();Eu();xu();Su();Iu();Ot.prototype.clear=gu;Ot.prototype.delete=wu;Ot.prototype.get=_u;Ot.prototype.has=bu;Ot.prototype.set=Au;Nt=Ot});function O_(e,t){for(var r=-1,n=e==null?0:e.length,o=0,i=[];++r<n;){var a=e[r];t(a,r,e)&&(i[o++]=a)}return i}var vu,Tu=u(()=>{vu=O_});function N_(){return[]}var Ou,Nu=u(()=>{Ou=N_});var C_,R_,Cu,D_,Ru,Du=u(()=>{Tu();Nu();C_=Object.prototype,R_=C_.propertyIsEnumerable,Cu=Object.getOwnPropertySymbols,D_=Cu?function(e){return e==null?[]:(e=Object(e),vu(Cu(e),function(t){return R_.call(e,t)}))}:Ou,Ru=D_});function L_(e,t,r){var n=t(e);return D(e)?n:fn(n,r(e))}var Lu,ku=u(()=>{Ko();z();Lu=L_});function k_(e){return Lu(e,bt,Ru)}var zo,Pu=u(()=>{ku();Du();an();zo=k_});var P_,pn,Mu=u(()=>{Ie();de();P_=Y(M,"DataView"),pn=P_});var M_,mn,Fu=u(()=>{Ie();de();M_=Y(M,"Promise"),mn=M_});var F_,De,Jo=u(()=>{Ie();de();F_=Y(M,"Set"),De=F_});var $u,$_,Bu,Hu,Uu,Gu,B_,H_,U_,G_,j_,Ke,Xo,ju=u(()=>{Mu();cn();Fu();Jo();wc();ft();ko();$u="[object Map]",$_="[object Object]",Bu="[object Promise]",Hu="[object Set]",Uu="[object WeakMap]",Gu="[object DataView]",B_=ye(pn),H_=ye(Ne),U_=ye(mn),G_=ye(De),j_=ye(Zr),Ke=re;(pn&&Ke(new pn(new ArrayBuffer(1)))!=Gu||Ne&&Ke(new Ne)!=$u||mn&&Ke(mn.resolve())!=Bu||De&&Ke(new De)!=Hu||Zr&&Ke(new Zr)!=Uu)&&(Ke=function(e){var t=re(e),r=t==$_?e.constructor:void 0,n=r?ye(r):"";if(n)switch(n){case B_:return Gu;case H_:return $u;case U_:return Bu;case G_:return Hu;case j_:return Uu}return t});Xo=Ke});var W_,Zo,Wu=u(()=>{de();W_=M.Uint8Array,Zo=W_});function K_(e){return this.__data__.set(e,Y_),this}var Y_,Yu,Ku=u(()=>{Y_="__lodash_hash_undefined__";Yu=K_});function q_(e){return this.__data__.has(e)}var qu,Vu=u(()=>{qu=q_});function hn(e){var t=-1,r=e==null?0:e.length;for(this.__data__=new Ye;++t<r;)this.add(e[t])}var gn,Qo=u(()=>{ln();Ku();Vu();hn.prototype.add=hn.prototype.push=Yu;hn.prototype.has=qu;gn=hn});function V_(e,t){for(var r=-1,n=e==null?0:e.length;++r<n;)if(t(e[r],r,e))return!0;return!1}var zu,Ju=u(()=>{zu=V_});function z_(e,t){return e.has(t)}var yn,ei=u(()=>{yn=z_});function Z_(e,t,r,n,o,i){var a=r&J_,s=e.length,c=t.length;if(s!=c&&!(a&&c>s))return!1;var l=i.get(e),d=i.get(t);if(l&&d)return l==t&&d==e;var p=-1,f=!0,h=r&X_?new gn:void 0;for(i.set(e,t),i.set(t,e);++p<s;){var w=e[p],y=t[p];if(n)var E=a?n(y,w,p,t,e,i):n(w,y,p,e,t,i);if(E!==void 0){if(E)continue;f=!1;break}if(h){if(!zu(t,function(I,_){if(!yn(h,_)&&(w===I||o(w,I,r,n,i)))return h.push(_)})){f=!1;break}}else if(!(w===y||o(w,y,r,n,i))){f=!1;break}}return i.delete(e),i.delete(t),f}var J_,X_,wn,ti=u(()=>{Qo();Ju();ei();J_=1,X_=2;wn=Z_});function Q_(e){var t=-1,r=Array(e.size);return e.forEach(function(n,o){r[++t]=[o,n]}),r}var Xu,Zu=u(()=>{Xu=Q_});function ex(e){var t=-1,r=Array(e.size);return e.forEach(function(n){r[++t]=n}),r}var Ct,En=u(()=>{Ct=ex});function mx(e,t,r,n,o,i,a){switch(r){case px:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case fx:return!(e.byteLength!=t.byteLength||!i(new Zo(e),new Zo(t)));case nx:case ox:case sx:return Et(+e,+t);case ix:return e.name==t.name&&e.message==t.message;case cx:case ux:return e==t+"";case ax:var s=Xu;case lx:var c=n&tx;if(s||(s=Ct),e.size!=t.size&&!c)return!1;var l=a.get(e);if(l)return l==t;n|=rx,a.set(e,t);var d=wn(s(e),s(t),n,o,i,a);return a.delete(e),d;case dx:if(ri)return ri.call(e)==ri.call(t)}return!1}var tx,rx,nx,ox,ix,ax,sx,cx,lx,ux,dx,fx,px,Qu,ri,ed,td=u(()=>{dt();Wu();en();ti();Zu();En();tx=1,rx=2,nx="[object Boolean]",ox="[object Date]",ix="[object Error]",ax="[object Map]",sx="[object Number]",cx="[object RegExp]",lx="[object Set]",ux="[object String]",dx="[object Symbol]",fx="[object ArrayBuffer]",px="[object DataView]",Qu=U?U.prototype:void 0,ri=Qu?Qu.valueOf:void 0;ed=mx});function wx(e,t,r,n,o,i){var a=r&hx,s=zo(e),c=s.length,l=zo(t),d=l.length;if(c!=d&&!a)return!1;for(var p=c;p--;){var f=s[p];if(!(a?f in t:yx.call(t,f)))return!1}var h=i.get(e),w=i.get(t);if(h&&w)return h==t&&w==e;var y=!0;i.set(e,t),i.set(t,e);for(var E=a;++p<c;){f=s[p];var I=e[f],_=t[f];if(n)var O=a?n(_,I,f,t,e,i):n(I,_,f,e,t,i);if(!(O===void 0?I===_||o(I,_,r,n,i):O)){y=!1;break}E||(E=f=="constructor")}if(y&&!E){var v=e.constructor,x=t.constructor;v!=x&&"constructor"in e&&"constructor"in t&&!(typeof v=="function"&&v instanceof v&&typeof x=="function"&&x instanceof x)&&(y=!1)}return i.delete(e),i.delete(t),y}var hx,gx,yx,rd,nd=u(()=>{Pu();hx=1,gx=Object.prototype,yx=gx.hasOwnProperty;rd=wx});function xx(e,t,r,n,o,i){var a=D(e),s=D(t),c=a?id:Xo(e),l=s?id:Xo(t);c=c==od?_n:c,l=l==od?_n:l;var d=c==_n,p=l==_n,f=c==l;if(f&&or(e)){if(!or(t))return!1;a=!0,d=!1}if(f&&!d)return i||(i=new Nt),a||on(e)?wn(e,t,r,n,o,i):ed(e,t,c,r,n,o,i);if(!(r&Ex)){var h=d&&ad.call(e,"__wrapped__"),w=p&&ad.call(t,"__wrapped__");if(h||w){var y=h?e.value():e,E=w?t.value():t;return i||(i=new Nt),o(y,E,r,n,i)}}return f?(i||(i=new Nt),rd(e,t,r,n,o,i)):!1}var Ex,od,id,_n,_x,ad,sd,cd=u(()=>{Vo();ti();td();nd();ju();z();$o();Go();Ex=1,od="[object Arguments]",id="[object Array]",_n="[object Object]",_x=Object.prototype,ad=_x.hasOwnProperty;sd=xx});function ld(e,t,r,n,o){return e===t?!0:e==null||t==null||!ne(e)&&!ne(t)?e!==e&&t!==t:sd(e,t,r,n,ld,o)}var xn,ni=u(()=>{cd();pt();xn=ld});function Ax(e,t,r,n){var o=r.length,i=o,a=!n;if(e==null)return!i;for(e=Object(e);o--;){var s=r[o];if(a&&s[2]?s[1]!==e[s[0]]:!(s[0]in e))return!1}for(;++o<i;){s=r[o];var c=s[0],l=e[c],d=s[1];if(a&&s[2]){if(l===void 0&&!(c in e))return!1}else{var p=new Nt;if(n)var f=n(l,d,c,e,t,p);if(!(f===void 0?xn(d,l,bx|Sx,n,p):f))return!1}}return!0}var bx,Sx,ud,dd=u(()=>{Vo();ni();bx=1,Sx=2;ud=Ax});function Ix(e){return e===e&&!ie(e)}var bn,oi=u(()=>{gt();bn=Ix});function vx(e){for(var t=bt(e),r=t.length;r--;){var n=t[r],o=e[n];t[r]=[n,o,bn(o)]}return t}var fd,pd=u(()=>{oi();an();fd=vx});function Tx(e,t){return function(r){return r==null?!1:r[e]===t&&(t!==void 0||e in Object(r))}}var Sn,ii=u(()=>{Sn=Tx});function Ox(e){var t=fd(e);return t.length==1&&t[0][2]?Sn(t[0][0],t[0][1]):function(r){return r===e||ud(r,e,t)}}var md,hd=u(()=>{dd();pd();ii();md=Ox});function Nx(e,t){return e!=null&&t in Object(e)}var gd,yd=u(()=>{gd=Nx});function Cx(e,t,r){t=un(t,e);for(var n=-1,o=t.length,i=!1;++n<o;){var a=Re(t[n]);if(!(i=e!=null&&r(e,a)))break;e=e[a]}return i||++n!=o?i:(o=e==null?0:e.length,!!o&&_t(o)&&wt(a,o)&&(D(e)||xt(e)))}var wd,Ed=u(()=>{Yo();rn();z();Qr();tn();ur();wd=Cx});function Rx(e,t){return e!=null&&wd(e,t,gd)}var _d,xd=u(()=>{yd();Ed();_d=Rx});function kx(e,t){return St(e)&&bn(t)?Sn(Re(e),t):function(r){var n=iu(r,e);return n===void 0&&n===t?_d(r,e):xn(t,n,Dx|Lx)}}var Dx,Lx,bd,Sd=u(()=>{ni();au();xd();sn();oi();ii();ur();Dx=1,Lx=2;bd=kx});function Px(e){return function(t){return t?.[e]}}var Ad,Id=u(()=>{Ad=Px});function Mx(e){return function(t){return Tt(t,e)}}var vd,Td=u(()=>{dn();vd=Mx});function Fx(e){return St(e)?Ad(Re(e)):vd(e)}var Od,Nd=u(()=>{Id();Td();sn();ur();Od=Fx});function $x(e){return typeof e=="function"?e:e==null?Ae:typeof e=="object"?D(e)?bd(e[0],e[1]):md(e):Od(e)}var Le,dr=u(()=>{hd();Sd();tr();z();Nd();Le=$x});function Bx(e,t,r,n){for(var o=-1,i=e==null?0:e.length;++o<i;){var a=e[o];t(n,a,r(a),e)}return n}var Cd,Rd=u(()=>{Cd=Bx});function Hx(e){return function(t,r,n){for(var o=-1,i=Object(t),a=n(t),s=a.length;s--;){var c=a[e?s:++o];if(r(i[c],c,i)===!1)break}return t}}var Dd,Ld=u(()=>{Dd=Hx});var Ux,kd,Pd=u(()=>{Ld();Ux=Dd(),kd=Ux});function Gx(e,t){return e&&kd(e,t,bt)}var Md,Fd=u(()=>{Pd();an();Md=Gx});function jx(e,t){return function(r,n){if(r==null)return r;if(!ve(r))return e(r,n);for(var o=r.length,i=t?o:-1,a=Object(r);(t?i--:++i<o)&&n(a[i],i,a)!==!1;);return r}}var $d,Bd=u(()=>{rr();$d=jx});var Wx,An,ai=u(()=>{Fd();Bd();Wx=$d(Md),An=Wx});function Yx(e,t,r,n){return An(e,function(o,i,a){t(n,o,r(o),a)}),n}var Hd,Ud=u(()=>{ai();Hd=Yx});function Kx(e,t){return function(r,n){var o=D(r)?Cd:Hd,i=t?t():{};return o(r,e,Le(n,2),i)}}var Gd,jd=u(()=>{Rd();Ud();dr();z();Gd=Kx});function qx(e,t,r){for(var n=-1,o=e==null?0:e.length;++n<o;)if(r(t,e[n]))return!0;return!1}var Wd,Yd=u(()=>{Wd=qx});function Vx(e,t){var r=-1,n=ve(e)?Array(e.length):[];return An(e,function(o,i,a){n[++r]=t(o,i,a)}),n}var Kd,qd=u(()=>{ai();rr();Kd=Vx});var zx,Jx,Xx,si,Vd=u(()=>{Gc();jd();zx=Object.prototype,Jx=zx.hasOwnProperty,Xx=Gd(function(e,t,r){Jx.call(e,r)?e[r].push(t):Uc(e,r,[t])}),si=Xx});function Zx(e,t){for(var r,n=-1,o=e.length;++n<o;){var i=t(e[n]);i!==void 0&&(r=r===void 0?i:r+i)}return r}var zd,Jd=u(()=>{zd=Zx});function Qx(e,t){var r=e.length;for(e.sort(t);r--;)e[r]=e[r].value;return e}var Xd,Zd=u(()=>{Xd=Qx});function eb(e,t){if(e!==t){var r=e!==void 0,n=e===null,o=e===e,i=oe(e),a=t!==void 0,s=t===null,c=t===t,l=oe(t);if(!s&&!l&&!i&&e>t||i&&a&&c&&!s&&!l||n&&a&&c||!r&&c||!o)return 1;if(!n&&!i&&!l&&e<t||l&&r&&o&&!n&&!i||s&&r&&o||!a&&o||!c)return-1}return 0}var Qd,ef=u(()=>{mt();Qd=eb});function tb(e,t,r){for(var n=-1,o=e.criteria,i=t.criteria,a=o.length,s=r.length;++n<a;){var c=Qd(o[n],i[n]);if(c){if(n>=s)return c;var l=r[n];return c*(l=="desc"?-1:1)}}return e.index-t.index}var tf,rf=u(()=>{ef();tf=tb});function rb(e,t,r){t.length?t=ht(t,function(i){return D(i)?function(a){return Tt(a,i.length===1?i[0]:i)}:i}):t=[Ae];var n=-1;t=ht(t,nn(Le));var o=Kd(e,function(i,a,s){var c=ht(t,function(l){return l(i)});return{criteria:c,index:++n,value:i}});return Xd(o,function(i,a){return tf(i,a,r)})}var nf,of=u(()=>{Do();dn();dr();qd();Zd();Bo();rf();tr();z();nf=rb});var nb,ci,af=u(()=>{fu();of();qc();Mo();nb=Kc(function(e,t){if(e==null)return[];var r=t.length;return r>1&&nr(e,t[0],t[1])?t=[]:r>2&&nr(t[0],t[1],t[2])&&(t=[t[0]]),nf(e,du(t,1),[])}),ci=nb});function ob(e,t){return e&&e.length?zd(e,Le(t,2)):0}var li,sf=u(()=>{dr();Jd();li=ob});var ib,ab,cf,lf=u(()=>{Jo();bc();En();ib=1/0,ab=De&&1/Ct(new De([,-0]))[1]==ib?function(e){return new De(e)}:xc,cf=ab});function cb(e,t,r){var n=-1,o=Bc,i=e.length,a=!0,s=[],c=s;if(r)a=!1,o=Wd;else if(i>=sb){var l=t?null:cf(e);if(l)return Ct(l);a=!1,o=yn,c=new gn}else c=t?[]:s;e:for(;++n<i;){var d=e[n],p=t?t(d):d;if(d=r||d!==0?d:0,a&&p===p){for(var f=c.length;f--;)if(c[f]===p)continue e;t&&c.push(p),s.push(d)}else o(c,p,r)||(c!==s&&c.push(p),s.push(d))}return s}var sb,uf,df=u(()=>{Qo();Hc();Yd();ei();lf();En();sb=200;uf=cb});function lb(e,t){return e&&e.length?uf(e,Le(t,2)):[]}var ui,ff=u(()=>{dr();df();ui=lb});var In=u(()=>{hu();Vd();af();sf();ff();});import{readFile as ub}from"node:fs/promises";function fb(e){let t=[];return e.sectionHeading&&t.push(`[Section: ${e.sectionHeading}]`),e.contextualPrefix&&t.push(e.contextualPrefix),t.push(e.content),t.join(`
|
|
73
|
-
`)}function
|
|
74
|
+
`,[e]),o}var iu=u(()=>{T();Ze()});var dx,Io,Rs=u(()=>{dx=typeof global=="object"&&global&&global.Object===Object&&global,Io=dx});var fx,px,$,Ne=u(()=>{Rs();fx=typeof self=="object"&&self&&self.Object===Object&&self,px=Io||fx||Function("return this")(),$=px});var mx,V,ir=u(()=>{Ne();mx=$.Symbol,V=mx});function yx(e){var t=hx.call(e,cn),r=e[cn];try{e[cn]=void 0;var n=!0}catch{}var o=gx.call(e);return n&&(t?e[cn]=r:delete e[cn]),o}var su,hx,gx,cn,au,cu=u(()=>{ir();su=Object.prototype,hx=su.hasOwnProperty,gx=su.toString,cn=V?V.toStringTag:void 0;au=yx});function _x(e){return Ex.call(e)}var wx,Ex,lu,uu=u(()=>{wx=Object.prototype,Ex=wx.toString;lu=_x});function Ax(e){return e==null?e===void 0?Sx:xx:du&&du in Object(e)?au(e):lu(e)}var xx,Sx,du,Ee,sr=u(()=>{ir();cu();uu();xx="[object Null]",Sx="[object Undefined]",du=V?V.toStringTag:void 0;Ee=Ax});function bx(e){return e!=null&&typeof e=="object"}var _e,ar=u(()=>{_e=bx});function Ix(e){return typeof e=="symbol"||_e(e)&&Ee(e)==Tx}var Tx,xe,cr=u(()=>{sr();ar();Tx="[object Symbol]";xe=Ix});function Ox(e,t){for(var r=-1,n=e==null?0:e.length,o=Array(n);++r<n;)o[r]=t(e[r],r,e);return o}var lr,Cs=u(()=>{lr=Ox});var Rx,P,oe=u(()=>{Rx=Array.isArray,P=Rx});function mu(e){if(typeof e=="string")return e;if(P(e))return lr(e,mu)+"";if(xe(e))return pu?pu.call(e):"";var t=e+"";return t=="0"&&1/e==-Cx?"-0":t}var Cx,fu,pu,hu,gu=u(()=>{ir();Cs();oe();cr();Cx=1/0,fu=V?V.prototype:void 0,pu=fu?fu.toString:void 0;hu=mu});function vx(e){for(var t=e.length;t--&&Nx.test(e.charAt(t)););return t}var Nx,yu,wu=u(()=>{Nx=/\s/;yu=vx});function Lx(e){return e&&e.slice(0,yu(e)+1).replace(Dx,"")}var Dx,Eu,_u=u(()=>{wu();Dx=/^\s+/;Eu=Lx});function Px(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var Se,ur=u(()=>{Se=Px});function Fx(e){if(typeof e=="number")return e;if(xe(e))return xu;if(Se(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=Se(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=Eu(e);var r=Mx.test(e);return r||Hx.test(e)?Bx(e.slice(2),r?2:8):kx.test(e)?xu:+e}var xu,kx,Mx,Hx,Bx,Su,Au=u(()=>{_u();ur();cr();xu=NaN,kx=/^[-+]0x[0-9a-f]+$/i,Mx=/^0b[01]+$/i,Hx=/^0o[0-7]+$/i,Bx=parseInt;Su=Fx});function Ux(e){if(!e)return e===0?e:0;if(e=Su(e),e===bu||e===-bu){var t=e<0?-1:1;return t*$x}return e===e?e:0}var bu,$x,Tu,Iu=u(()=>{Au();bu=1/0,$x=17976931348623157e292;Tu=Ux});function Gx(e){var t=Tu(e),r=t%1;return t===t?r?t-r:t:0}var Ou,Ru=u(()=>{Iu();Ou=Gx});function jx(e){return e}var Qe,ln=u(()=>{Qe=jx});function qx(e){if(!Se(e))return!1;var t=Ee(e);return t==Kx||t==Yx||t==Wx||t==Vx}var Wx,Kx,Yx,Vx,Oo,Ns=u(()=>{sr();ur();Wx="[object AsyncFunction]",Kx="[object Function]",Yx="[object GeneratorFunction]",Vx="[object Proxy]";Oo=qx});var Jx,Ro,Cu=u(()=>{Ne();Jx=$["__core-js_shared__"],Ro=Jx});function zx(e){return!!Nu&&Nu in e}var Nu,vu,Du=u(()=>{Cu();Nu=(function(){var e=/[^.]+$/.exec(Ro&&Ro.keys&&Ro.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""})();vu=zx});function Qx(e){if(e!=null){try{return Zx.call(e)}catch{}try{return e+""}catch{}}return""}var Xx,Zx,Fe,vs=u(()=>{Xx=Function.prototype,Zx=Xx.toString;Fe=Qx});function aS(e){if(!Se(e)||vu(e))return!1;var t=Oo(e)?sS:tS;return t.test(Fe(e))}var eS,tS,rS,nS,oS,iS,sS,Lu,Pu=u(()=>{Ns();Du();ur();vs();eS=/[\\^$.*+?()[\]{}|]/g,tS=/^\[object .+?Constructor\]$/,rS=Function.prototype,nS=Object.prototype,oS=rS.toString,iS=nS.hasOwnProperty,sS=RegExp("^"+oS.call(iS).replace(eS,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");Lu=aS});function cS(e,t){return e?.[t]}var ku,Mu=u(()=>{ku=cS});function lS(e,t){var r=ku(e,t);return Lu(r)?r:void 0}var z,et=u(()=>{Pu();Mu();z=lS});var uS,Co,Hu=u(()=>{et();Ne();uS=z($,"WeakMap"),Co=uS});function dS(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}var Bu,Fu=u(()=>{Bu=dS});function fS(){}var $u,Uu=u(()=>{$u=fS});function gS(e){var t=0,r=0;return function(){var n=hS(),o=mS-(n-r);if(r=n,o>0){if(++t>=pS)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var pS,mS,hS,Gu,ju=u(()=>{pS=800,mS=16,hS=Date.now;Gu=gS});function yS(e){return function(){return e}}var Wu,Ku=u(()=>{Wu=yS});var wS,dr,Ds=u(()=>{et();wS=(function(){try{var e=z(Object,"defineProperty");return e({},"",{}),e}catch{}})(),dr=wS});var ES,Yu,Vu=u(()=>{Ku();Ds();ln();ES=dr?function(e,t){return dr(e,"toString",{configurable:!0,enumerable:!1,value:Wu(t),writable:!0})}:Qe,Yu=ES});var _S,qu,Ju=u(()=>{Vu();ju();_S=Gu(Yu),qu=_S});function xS(e,t,r,n){for(var o=e.length,i=r+(n?1:-1);n?i--:++i<o;)if(t(e[i],i,e))return i;return-1}var zu,Xu=u(()=>{zu=xS});function SS(e){return e!==e}var Zu,Qu=u(()=>{Zu=SS});function AS(e,t,r){for(var n=r-1,o=e.length;++n<o;)if(e[n]===t)return n;return-1}var ed,td=u(()=>{ed=AS});function bS(e,t,r){return t===t?ed(e,t,r):zu(e,Zu,r)}var rd,nd=u(()=>{Xu();Qu();td();rd=bS});function TS(e,t){var r=e==null?0:e.length;return!!r&&rd(e,t,0)>-1}var od,id=u(()=>{nd();od=TS});function RS(e,t){var r=typeof e;return t=t??IS,!!t&&(r=="number"||r!="symbol"&&OS.test(e))&&e>-1&&e%1==0&&e<t}var IS,OS,fr,No=u(()=>{IS=9007199254740991,OS=/^(?:0|[1-9]\d*)$/;fr=RS});function CS(e,t,r){t=="__proto__"&&dr?dr(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}var sd,ad=u(()=>{Ds();sd=CS});function NS(e,t){return e===t||e!==e&&t!==t}var pr,vo=u(()=>{pr=NS});function vS(e,t,r){return t=cd(t===void 0?e.length-1:t,0),function(){for(var n=arguments,o=-1,i=cd(n.length-t,0),s=Array(i);++o<i;)s[o]=n[t+o];o=-1;for(var a=Array(t+1);++o<t;)a[o]=n[o];return a[t]=r(s),Bu(e,this,a)}}var cd,ld,ud=u(()=>{Fu();cd=Math.max;ld=vS});function DS(e,t){return qu(ld(e,t,Qe),e+"")}var dd,fd=u(()=>{ln();ud();Ju();dd=DS});function PS(e){return typeof e=="number"&&e>-1&&e%1==0&&e<=LS}var LS,mr,Do=u(()=>{LS=9007199254740991;mr=PS});function kS(e){return e!=null&&mr(e.length)&&!Oo(e)}var tt,un=u(()=>{Ns();Do();tt=kS});function MS(e,t,r){if(!Se(r))return!1;var n=typeof t;return(n=="number"?tt(r)&&fr(t,r.length):n=="string"&&t in r)?pr(r[t],e):!1}var dn,Ls=u(()=>{vo();un();No();ur();dn=MS});function BS(e){var t=e&&e.constructor,r=typeof t=="function"&&t.prototype||HS;return e===r}var HS,pd,md=u(()=>{HS=Object.prototype;pd=BS});function FS(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n}var hd,gd=u(()=>{hd=FS});function US(e){return _e(e)&&Ee(e)==$S}var $S,Ps,yd=u(()=>{sr();ar();$S="[object Arguments]";Ps=US});var wd,GS,jS,WS,hr,Lo=u(()=>{yd();ar();wd=Object.prototype,GS=wd.hasOwnProperty,jS=wd.propertyIsEnumerable,WS=Ps((function(){return arguments})())?Ps:function(e){return _e(e)&&GS.call(e,"callee")&&!jS.call(e,"callee")},hr=WS});function KS(){return!1}var Ed,_d=u(()=>{Ed=KS});var Ad,xd,YS,Sd,VS,qS,fn,ks=u(()=>{Ne();_d();Ad=typeof exports=="object"&&exports&&!exports.nodeType&&exports,xd=Ad&&typeof module=="object"&&module&&!module.nodeType&&module,YS=xd&&xd.exports===Ad,Sd=YS?$.Buffer:void 0,VS=Sd?Sd.isBuffer:void 0,qS=VS||Ed,fn=qS});function EA(e){return _e(e)&&mr(e.length)&&!!D[Ee(e)]}var JS,zS,XS,ZS,QS,eA,tA,rA,nA,oA,iA,sA,aA,cA,lA,uA,dA,fA,pA,mA,hA,gA,yA,wA,D,bd,Td=u(()=>{sr();Do();ar();JS="[object Arguments]",zS="[object Array]",XS="[object Boolean]",ZS="[object Date]",QS="[object Error]",eA="[object Function]",tA="[object Map]",rA="[object Number]",nA="[object Object]",oA="[object RegExp]",iA="[object Set]",sA="[object String]",aA="[object WeakMap]",cA="[object ArrayBuffer]",lA="[object DataView]",uA="[object Float32Array]",dA="[object Float64Array]",fA="[object Int8Array]",pA="[object Int16Array]",mA="[object Int32Array]",hA="[object Uint8Array]",gA="[object Uint8ClampedArray]",yA="[object Uint16Array]",wA="[object Uint32Array]",D={};D[uA]=D[dA]=D[fA]=D[pA]=D[mA]=D[hA]=D[gA]=D[yA]=D[wA]=!0;D[JS]=D[zS]=D[cA]=D[XS]=D[lA]=D[ZS]=D[QS]=D[eA]=D[tA]=D[rA]=D[nA]=D[oA]=D[iA]=D[sA]=D[aA]=!1;bd=EA});function _A(e){return function(t){return e(t)}}var Po,Ms=u(()=>{Po=_A});var Id,pn,xA,Hs,SA,Bs,Od=u(()=>{Rs();Id=typeof exports=="object"&&exports&&!exports.nodeType&&exports,pn=Id&&typeof module=="object"&&module&&!module.nodeType&&module,xA=pn&&pn.exports===Id,Hs=xA&&Io.process,SA=(function(){try{var e=pn&&pn.require&&pn.require("util").types;return e||Hs&&Hs.binding&&Hs.binding("util")}catch{}})(),Bs=SA});var Rd,AA,ko,Fs=u(()=>{Td();Ms();Od();Rd=Bs&&Bs.isTypedArray,AA=Rd?Po(Rd):bd,ko=AA});function IA(e,t){var r=P(e),n=!r&&hr(e),o=!r&&!n&&fn(e),i=!r&&!n&&!o&&ko(e),s=r||n||o||i,a=s?hd(e.length,String):[],c=a.length;for(var l in e)(t||TA.call(e,l))&&!(s&&(l=="length"||o&&(l=="offset"||l=="parent")||i&&(l=="buffer"||l=="byteLength"||l=="byteOffset")||fr(l,c)))&&a.push(l);return a}var bA,TA,Cd,Nd=u(()=>{gd();Lo();oe();ks();No();Fs();bA=Object.prototype,TA=bA.hasOwnProperty;Cd=IA});function OA(e,t){return function(r){return e(t(r))}}var vd,Dd=u(()=>{vd=OA});var RA,Ld,Pd=u(()=>{Dd();RA=vd(Object.keys,Object),Ld=RA});function vA(e){if(!pd(e))return Ld(e);var t=[];for(var r in Object(e))NA.call(e,r)&&r!="constructor"&&t.push(r);return t}var CA,NA,kd,Md=u(()=>{md();Pd();CA=Object.prototype,NA=CA.hasOwnProperty;kd=vA});function DA(e){return tt(e)?Cd(e):kd(e)}var gr,Mo=u(()=>{Nd();Md();un();gr=DA});function kA(e,t){if(P(e))return!1;var r=typeof e;return r=="number"||r=="symbol"||r=="boolean"||e==null||xe(e)?!0:PA.test(e)||!LA.test(e)||t!=null&&e in Object(t)}var LA,PA,yr,Ho=u(()=>{oe();cr();LA=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,PA=/^\w*$/;yr=kA});var MA,$e,mn=u(()=>{et();MA=z(Object,"create"),$e=MA});function HA(){this.__data__=$e?$e(null):{},this.size=0}var Hd,Bd=u(()=>{mn();Hd=HA});function BA(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var Fd,$d=u(()=>{Fd=BA});function GA(e){var t=this.__data__;if($e){var r=t[e];return r===FA?void 0:r}return UA.call(t,e)?t[e]:void 0}var FA,$A,UA,Ud,Gd=u(()=>{mn();FA="__lodash_hash_undefined__",$A=Object.prototype,UA=$A.hasOwnProperty;Ud=GA});function KA(e){var t=this.__data__;return $e?t[e]!==void 0:WA.call(t,e)}var jA,WA,jd,Wd=u(()=>{mn();jA=Object.prototype,WA=jA.hasOwnProperty;jd=KA});function VA(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=$e&&t===void 0?YA:t,this}var YA,Kd,Yd=u(()=>{mn();YA="__lodash_hash_undefined__";Kd=VA});function wr(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var $s,Vd=u(()=>{Bd();$d();Gd();Wd();Yd();wr.prototype.clear=Hd;wr.prototype.delete=Fd;wr.prototype.get=Ud;wr.prototype.has=jd;wr.prototype.set=Kd;$s=wr});function qA(){this.__data__=[],this.size=0}var qd,Jd=u(()=>{qd=qA});function JA(e,t){for(var r=e.length;r--;)if(pr(e[r][0],t))return r;return-1}var rt,hn=u(()=>{vo();rt=JA});function ZA(e){var t=this.__data__,r=rt(t,e);if(r<0)return!1;var n=t.length-1;return r==n?t.pop():XA.call(t,r,1),--this.size,!0}var zA,XA,zd,Xd=u(()=>{hn();zA=Array.prototype,XA=zA.splice;zd=ZA});function QA(e){var t=this.__data__,r=rt(t,e);return r<0?void 0:t[r][1]}var Zd,Qd=u(()=>{hn();Zd=QA});function eb(e){return rt(this.__data__,e)>-1}var ef,tf=u(()=>{hn();ef=eb});function tb(e,t){var r=this.__data__,n=rt(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}var rf,nf=u(()=>{hn();rf=tb});function Er(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var nt,gn=u(()=>{Jd();Xd();Qd();tf();nf();Er.prototype.clear=qd;Er.prototype.delete=zd;Er.prototype.get=Zd;Er.prototype.has=ef;Er.prototype.set=rf;nt=Er});var rb,ot,Bo=u(()=>{et();Ne();rb=z($,"Map"),ot=rb});function nb(){this.size=0,this.__data__={hash:new $s,map:new(ot||nt),string:new $s}}var of,sf=u(()=>{Vd();gn();Bo();of=nb});function ob(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var af,cf=u(()=>{af=ob});function ib(e,t){var r=e.__data__;return af(t)?r[typeof t=="string"?"string":"hash"]:r.map}var it,yn=u(()=>{cf();it=ib});function sb(e){var t=it(this,e).delete(e);return this.size-=t?1:0,t}var lf,uf=u(()=>{yn();lf=sb});function ab(e){return it(this,e).get(e)}var df,ff=u(()=>{yn();df=ab});function cb(e){return it(this,e).has(e)}var pf,mf=u(()=>{yn();pf=cb});function lb(e,t){var r=it(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var hf,gf=u(()=>{yn();hf=lb});function _r(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}var At,Fo=u(()=>{sf();uf();ff();mf();gf();_r.prototype.clear=of;_r.prototype.delete=lf;_r.prototype.get=df;_r.prototype.has=pf;_r.prototype.set=hf;At=_r});function Us(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(ub);var r=function(){var n=arguments,o=t?t.apply(this,n):n[0],i=r.cache;if(i.has(o))return i.get(o);var s=e.apply(this,n);return r.cache=i.set(o,s)||i,s};return r.cache=new(Us.Cache||At),r}var ub,yf,wf=u(()=>{Fo();ub="Expected a function";Us.Cache=At;yf=Us});function fb(e){var t=yf(e,function(n){return r.size===db&&r.clear(),n}),r=t.cache;return t}var db,Ef,_f=u(()=>{wf();db=500;Ef=fb});var pb,mb,hb,xf,Sf=u(()=>{_f();pb=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,mb=/\\(\\)?/g,hb=Ef(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(pb,function(r,n,o,i){t.push(o?i.replace(mb,"$1"):n||r)}),t}),xf=hb});function gb(e){return e==null?"":hu(e)}var Af,bf=u(()=>{gu();Af=gb});function yb(e,t){return P(e)?e:yr(e,t)?[e]:xf(Af(e))}var $o,Gs=u(()=>{oe();Ho();Sf();bf();$o=yb});function Eb(e){if(typeof e=="string"||xe(e))return e;var t=e+"";return t=="0"&&1/e==-wb?"-0":t}var wb,st,wn=u(()=>{cr();wb=1/0;st=Eb});function _b(e,t){t=$o(t,e);for(var r=0,n=t.length;e!=null&&r<n;)e=e[st(t[r++])];return r&&r==n?e:void 0}var xr,Uo=u(()=>{Gs();wn();xr=_b});function xb(e,t,r){var n=e==null?void 0:xr(e,t);return n===void 0?r:n}var Tf,If=u(()=>{Uo();Tf=xb});function Sb(e,t){for(var r=-1,n=t.length,o=e.length;++r<n;)e[o+r]=t[r];return e}var Go,js=u(()=>{Go=Sb});function Ab(e){return P(e)||hr(e)||!!(Of&&e&&e[Of])}var Of,Rf,Cf=u(()=>{ir();Lo();oe();Of=V?V.isConcatSpreadable:void 0;Rf=Ab});function Nf(e,t,r,n,o){var i=-1,s=e.length;for(r||(r=Rf),o||(o=[]);++i<s;){var a=e[i];t>0&&r(a)?t>1?Nf(a,t-1,r,n,o):Go(o,a):n||(o[o.length]=a)}return o}var vf,Df=u(()=>{js();Cf();vf=Nf});function bb(e,t,r){var n=-1,o=e.length;t<0&&(t=-t>o?0:o+t),r=r>o?o:r,r<0&&(r+=o),o=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(o);++n<o;)i[n]=e[n+t];return i}var Lf,Pf=u(()=>{Lf=bb});function Ob(e,t,r){(r?dn(e,t,r):t===void 0)?t=1:t=Ib(Ou(t),0);var n=e==null?0:e.length;if(!n||t<1)return[];for(var o=0,i=0,s=Array(Tb(n/t));o<n;)s[i++]=Lf(e,o,o+=t);return s}var Tb,Ib,Ws,kf=u(()=>{Pf();Ls();Ru();Tb=Math.ceil,Ib=Math.max;Ws=Ob});function Rb(){this.__data__=new nt,this.size=0}var Mf,Hf=u(()=>{gn();Mf=Rb});function Cb(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}var Bf,Ff=u(()=>{Bf=Cb});function Nb(e){return this.__data__.get(e)}var $f,Uf=u(()=>{$f=Nb});function vb(e){return this.__data__.has(e)}var Gf,jf=u(()=>{Gf=vb});function Lb(e,t){var r=this.__data__;if(r instanceof nt){var n=r.__data__;if(!ot||n.length<Db-1)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new At(n)}return r.set(e,t),this.size=r.size,this}var Db,Wf,Kf=u(()=>{gn();Bo();Fo();Db=200;Wf=Lb});function Sr(e){var t=this.__data__=new nt(e);this.size=t.size}var Ar,Ks=u(()=>{gn();Hf();Ff();Uf();jf();Kf();Sr.prototype.clear=Mf;Sr.prototype.delete=Bf;Sr.prototype.get=$f;Sr.prototype.has=Gf;Sr.prototype.set=Wf;Ar=Sr});function Pb(e,t){for(var r=-1,n=e==null?0:e.length,o=0,i=[];++r<n;){var s=e[r];t(s,r,e)&&(i[o++]=s)}return i}var Yf,Vf=u(()=>{Yf=Pb});function kb(){return[]}var qf,Jf=u(()=>{qf=kb});var Mb,Hb,zf,Bb,Xf,Zf=u(()=>{Vf();Jf();Mb=Object.prototype,Hb=Mb.propertyIsEnumerable,zf=Object.getOwnPropertySymbols,Bb=zf?function(e){return e==null?[]:(e=Object(e),Yf(zf(e),function(t){return Hb.call(e,t)}))}:qf,Xf=Bb});function Fb(e,t,r){var n=t(e);return P(e)?n:Go(n,r(e))}var Qf,ep=u(()=>{js();oe();Qf=Fb});function $b(e){return Qf(e,gr,Xf)}var Ys,tp=u(()=>{ep();Zf();Mo();Ys=$b});var Ub,jo,rp=u(()=>{et();Ne();Ub=z($,"DataView"),jo=Ub});var Gb,Wo,np=u(()=>{et();Ne();Gb=z($,"Promise"),Wo=Gb});var jb,at,Vs=u(()=>{et();Ne();jb=z($,"Set"),at=jb});var op,Wb,ip,sp,ap,cp,Kb,Yb,Vb,qb,Jb,bt,qs,lp=u(()=>{rp();Bo();np();Vs();Hu();sr();vs();op="[object Map]",Wb="[object Object]",ip="[object Promise]",sp="[object Set]",ap="[object WeakMap]",cp="[object DataView]",Kb=Fe(jo),Yb=Fe(ot),Vb=Fe(Wo),qb=Fe(at),Jb=Fe(Co),bt=Ee;(jo&&bt(new jo(new ArrayBuffer(1)))!=cp||ot&&bt(new ot)!=op||Wo&&bt(Wo.resolve())!=ip||at&&bt(new at)!=sp||Co&&bt(new Co)!=ap)&&(bt=function(e){var t=Ee(e),r=t==Wb?e.constructor:void 0,n=r?Fe(r):"";if(n)switch(n){case Kb:return cp;case Yb:return op;case Vb:return ip;case qb:return sp;case Jb:return ap}return t});qs=bt});var zb,Js,up=u(()=>{Ne();zb=$.Uint8Array,Js=zb});function Zb(e){return this.__data__.set(e,Xb),this}var Xb,dp,fp=u(()=>{Xb="__lodash_hash_undefined__";dp=Zb});function Qb(e){return this.__data__.has(e)}var pp,mp=u(()=>{pp=Qb});function Ko(e){var t=-1,r=e==null?0:e.length;for(this.__data__=new At;++t<r;)this.add(e[t])}var Yo,zs=u(()=>{Fo();fp();mp();Ko.prototype.add=Ko.prototype.push=dp;Ko.prototype.has=pp;Yo=Ko});function eT(e,t){for(var r=-1,n=e==null?0:e.length;++r<n;)if(t(e[r],r,e))return!0;return!1}var hp,gp=u(()=>{hp=eT});function tT(e,t){return e.has(t)}var Vo,Xs=u(()=>{Vo=tT});function oT(e,t,r,n,o,i){var s=r&rT,a=e.length,c=t.length;if(a!=c&&!(s&&c>a))return!1;var l=i.get(e),d=i.get(t);if(l&&d)return l==t&&d==e;var p=-1,f=!0,m=r&nT?new Yo:void 0;for(i.set(e,t),i.set(t,e);++p<a;){var w=e[p],y=t[p];if(n)var E=s?n(y,w,p,t,e,i):n(w,y,p,e,t,i);if(E!==void 0){if(E)continue;f=!1;break}if(m){if(!hp(t,function(b,_){if(!Vo(m,_)&&(w===b||o(w,b,r,n,i)))return m.push(_)})){f=!1;break}}else if(!(w===y||o(w,y,r,n,i))){f=!1;break}}return i.delete(e),i.delete(t),f}var rT,nT,qo,Zs=u(()=>{zs();gp();Xs();rT=1,nT=2;qo=oT});function iT(e){var t=-1,r=Array(e.size);return e.forEach(function(n,o){r[++t]=[o,n]}),r}var yp,wp=u(()=>{yp=iT});function sT(e){var t=-1,r=Array(e.size);return e.forEach(function(n){r[++t]=n}),r}var br,Jo=u(()=>{br=sT});function _T(e,t,r,n,o,i,s){switch(r){case ET:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case wT:return!(e.byteLength!=t.byteLength||!i(new Js(e),new Js(t)));case lT:case uT:case pT:return pr(+e,+t);case dT:return e.name==t.name&&e.message==t.message;case mT:case gT:return e==t+"";case fT:var a=yp;case hT:var c=n&aT;if(a||(a=br),e.size!=t.size&&!c)return!1;var l=s.get(e);if(l)return l==t;n|=cT,s.set(e,t);var d=qo(a(e),a(t),n,o,i,s);return s.delete(e),d;case yT:if(Qs)return Qs.call(e)==Qs.call(t)}return!1}var aT,cT,lT,uT,dT,fT,pT,mT,hT,gT,yT,wT,ET,Ep,Qs,_p,xp=u(()=>{ir();up();vo();Zs();wp();Jo();aT=1,cT=2,lT="[object Boolean]",uT="[object Date]",dT="[object Error]",fT="[object Map]",pT="[object Number]",mT="[object RegExp]",hT="[object Set]",gT="[object String]",yT="[object Symbol]",wT="[object ArrayBuffer]",ET="[object DataView]",Ep=V?V.prototype:void 0,Qs=Ep?Ep.valueOf:void 0;_p=_T});function bT(e,t,r,n,o,i){var s=r&xT,a=Ys(e),c=a.length,l=Ys(t),d=l.length;if(c!=d&&!s)return!1;for(var p=c;p--;){var f=a[p];if(!(s?f in t:AT.call(t,f)))return!1}var m=i.get(e),w=i.get(t);if(m&&w)return m==t&&w==e;var y=!0;i.set(e,t),i.set(t,e);for(var E=s;++p<c;){f=a[p];var b=e[f],_=t[f];if(n)var R=s?n(_,b,f,t,e,i):n(b,_,f,e,t,i);if(!(R===void 0?b===_||o(b,_,r,n,i):R)){y=!1;break}E||(E=f=="constructor")}if(y&&!E){var I=e.constructor,S=t.constructor;I!=S&&"constructor"in e&&"constructor"in t&&!(typeof I=="function"&&I instanceof I&&typeof S=="function"&&S instanceof S)&&(y=!1)}return i.delete(e),i.delete(t),y}var xT,ST,AT,Sp,Ap=u(()=>{tp();xT=1,ST=Object.prototype,AT=ST.hasOwnProperty;Sp=bT});function OT(e,t,r,n,o,i){var s=P(e),a=P(t),c=s?Tp:qs(e),l=a?Tp:qs(t);c=c==bp?zo:c,l=l==bp?zo:l;var d=c==zo,p=l==zo,f=c==l;if(f&&fn(e)){if(!fn(t))return!1;s=!0,d=!1}if(f&&!d)return i||(i=new Ar),s||ko(e)?qo(e,t,r,n,o,i):_p(e,t,c,r,n,o,i);if(!(r&TT)){var m=d&&Ip.call(e,"__wrapped__"),w=p&&Ip.call(t,"__wrapped__");if(m||w){var y=m?e.value():e,E=w?t.value():t;return i||(i=new Ar),o(y,E,r,n,i)}}return f?(i||(i=new Ar),Sp(e,t,r,n,o,i)):!1}var TT,bp,Tp,zo,IT,Ip,Op,Rp=u(()=>{Ks();Zs();xp();Ap();lp();oe();ks();Fs();TT=1,bp="[object Arguments]",Tp="[object Array]",zo="[object Object]",IT=Object.prototype,Ip=IT.hasOwnProperty;Op=OT});function Cp(e,t,r,n,o){return e===t?!0:e==null||t==null||!_e(e)&&!_e(t)?e!==e&&t!==t:Op(e,t,r,n,Cp,o)}var Xo,ea=u(()=>{Rp();ar();Xo=Cp});function NT(e,t,r,n){var o=r.length,i=o,s=!n;if(e==null)return!i;for(e=Object(e);o--;){var a=r[o];if(s&&a[2]?a[1]!==e[a[0]]:!(a[0]in e))return!1}for(;++o<i;){a=r[o];var c=a[0],l=e[c],d=a[1];if(s&&a[2]){if(l===void 0&&!(c in e))return!1}else{var p=new Ar;if(n)var f=n(l,d,c,e,t,p);if(!(f===void 0?Xo(d,l,RT|CT,n,p):f))return!1}}return!0}var RT,CT,Np,vp=u(()=>{Ks();ea();RT=1,CT=2;Np=NT});function vT(e){return e===e&&!Se(e)}var Zo,ta=u(()=>{ur();Zo=vT});function DT(e){for(var t=gr(e),r=t.length;r--;){var n=t[r],o=e[n];t[r]=[n,o,Zo(o)]}return t}var Dp,Lp=u(()=>{ta();Mo();Dp=DT});function LT(e,t){return function(r){return r==null?!1:r[e]===t&&(t!==void 0||e in Object(r))}}var Qo,ra=u(()=>{Qo=LT});function PT(e){var t=Dp(e);return t.length==1&&t[0][2]?Qo(t[0][0],t[0][1]):function(r){return r===e||Np(r,e,t)}}var Pp,kp=u(()=>{vp();Lp();ra();Pp=PT});function kT(e,t){return e!=null&&t in Object(e)}var Mp,Hp=u(()=>{Mp=kT});function MT(e,t,r){t=$o(t,e);for(var n=-1,o=t.length,i=!1;++n<o;){var s=st(t[n]);if(!(i=e!=null&&r(e,s)))break;e=e[s]}return i||++n!=o?i:(o=e==null?0:e.length,!!o&&mr(o)&&fr(s,o)&&(P(e)||hr(e)))}var Bp,Fp=u(()=>{Gs();Lo();oe();No();Do();wn();Bp=MT});function HT(e,t){return e!=null&&Bp(e,t,Mp)}var $p,Up=u(()=>{Hp();Fp();$p=HT});function $T(e,t){return yr(e)&&Zo(t)?Qo(st(e),t):function(r){var n=Tf(r,e);return n===void 0&&n===t?$p(r,e):Xo(t,n,BT|FT)}}var BT,FT,Gp,jp=u(()=>{ea();If();Up();Ho();ta();ra();wn();BT=1,FT=2;Gp=$T});function UT(e){return function(t){return t?.[e]}}var Wp,Kp=u(()=>{Wp=UT});function GT(e){return function(t){return xr(t,e)}}var Yp,Vp=u(()=>{Uo();Yp=GT});function jT(e){return yr(e)?Wp(st(e)):Yp(e)}var qp,Jp=u(()=>{Kp();Vp();Ho();wn();qp=jT});function WT(e){return typeof e=="function"?e:e==null?Qe:typeof e=="object"?P(e)?Gp(e[0],e[1]):Pp(e):qp(e)}var ct,En=u(()=>{kp();jp();ln();oe();Jp();ct=WT});function KT(e,t,r,n){for(var o=-1,i=e==null?0:e.length;++o<i;){var s=e[o];t(n,s,r(s),e)}return n}var zp,Xp=u(()=>{zp=KT});function YT(e){return function(t,r,n){for(var o=-1,i=Object(t),s=n(t),a=s.length;a--;){var c=s[e?a:++o];if(r(i[c],c,i)===!1)break}return t}}var Zp,Qp=u(()=>{Zp=YT});var VT,em,tm=u(()=>{Qp();VT=Zp(),em=VT});function qT(e,t){return e&&em(e,t,gr)}var rm,nm=u(()=>{tm();Mo();rm=qT});function JT(e,t){return function(r,n){if(r==null)return r;if(!tt(r))return e(r,n);for(var o=r.length,i=t?o:-1,s=Object(r);(t?i--:++i<o)&&n(s[i],i,s)!==!1;);return r}}var om,im=u(()=>{un();om=JT});var zT,ei,na=u(()=>{nm();im();zT=om(rm),ei=zT});function XT(e,t,r,n){return ei(e,function(o,i,s){t(n,o,r(o),s)}),n}var sm,am=u(()=>{na();sm=XT});function ZT(e,t){return function(r,n){var o=P(r)?zp:sm,i=t?t():{};return o(r,e,ct(n,2),i)}}var cm,lm=u(()=>{Xp();am();En();oe();cm=ZT});function QT(e,t,r){for(var n=-1,o=e==null?0:e.length;++n<o;)if(r(t,e[n]))return!0;return!1}var um,dm=u(()=>{um=QT});function eI(e,t){var r=-1,n=tt(e)?Array(e.length):[];return ei(e,function(o,i,s){n[++r]=t(o,i,s)}),n}var fm,pm=u(()=>{na();un();fm=eI});var tI,rI,nI,oa,mm=u(()=>{ad();lm();tI=Object.prototype,rI=tI.hasOwnProperty,nI=cm(function(e,t,r){rI.call(e,r)?e[r].push(t):sd(e,r,[t])}),oa=nI});function oI(e,t){for(var r,n=-1,o=e.length;++n<o;){var i=t(e[n]);i!==void 0&&(r=r===void 0?i:r+i)}return r}var hm,gm=u(()=>{hm=oI});function iI(e,t){var r=e.length;for(e.sort(t);r--;)e[r]=e[r].value;return e}var ym,wm=u(()=>{ym=iI});function sI(e,t){if(e!==t){var r=e!==void 0,n=e===null,o=e===e,i=xe(e),s=t!==void 0,a=t===null,c=t===t,l=xe(t);if(!a&&!l&&!i&&e>t||i&&s&&c&&!a&&!l||n&&s&&c||!r&&c||!o)return 1;if(!n&&!i&&!l&&e<t||l&&r&&o&&!n&&!i||a&&r&&o||!s&&o||!c)return-1}return 0}var Em,_m=u(()=>{cr();Em=sI});function aI(e,t,r){for(var n=-1,o=e.criteria,i=t.criteria,s=o.length,a=r.length;++n<s;){var c=Em(o[n],i[n]);if(c){if(n>=a)return c;var l=r[n];return c*(l=="desc"?-1:1)}}return e.index-t.index}var xm,Sm=u(()=>{_m();xm=aI});function cI(e,t,r){t.length?t=lr(t,function(i){return P(i)?function(s){return xr(s,i.length===1?i[0]:i)}:i}):t=[Qe];var n=-1;t=lr(t,Po(ct));var o=fm(e,function(i,s,a){var c=lr(t,function(l){return l(i)});return{criteria:c,index:++n,value:i}});return ym(o,function(i,s){return xm(i,s,r)})}var Am,bm=u(()=>{Cs();Uo();En();pm();wm();Ms();Sm();ln();oe();Am=cI});var lI,ia,Tm=u(()=>{Df();bm();fd();Ls();lI=dd(function(e,t){if(e==null)return[];var r=t.length;return r>1&&dn(e,t[0],t[1])?t=[]:r>2&&dn(t[0],t[1],t[2])&&(t=[t[0]]),Am(e,vf(t,1),[])}),ia=lI});function uI(e,t){return e&&e.length?hm(e,ct(t,2)):0}var sa,Im=u(()=>{En();gm();sa=uI});var dI,fI,Om,Rm=u(()=>{Vs();Uu();Jo();dI=1/0,fI=at&&1/br(new at([,-0]))[1]==dI?function(e){return new at(e)}:$u,Om=fI});function mI(e,t,r){var n=-1,o=od,i=e.length,s=!0,a=[],c=a;if(r)s=!1,o=um;else if(i>=pI){var l=t?null:Om(e);if(l)return br(l);s=!1,o=Vo,c=new Yo}else c=t?[]:a;e:for(;++n<i;){var d=e[n],p=t?t(d):d;if(d=r||d!==0?d:0,s&&p===p){for(var f=c.length;f--;)if(c[f]===p)continue e;t&&c.push(p),a.push(d)}else o(c,p,r)||(c!==a&&c.push(p),a.push(d))}return a}var pI,Cm,Nm=u(()=>{zs();id();dm();Xs();Rm();Jo();pI=200;Cm=mI});function hI(e,t){return e&&e.length?Cm(e,ct(t,2)):[]}var aa,vm=u(()=>{En();Nm();aa=hI});var ti=u(()=>{kf();mm();Tm();Im();vm();});import{readFile as gI}from"node:fs/promises";function wI(e){let t=[];return e.sectionHeading&&t.push(`[Section: ${e.sectionHeading}]`),e.contextualPrefix&&t.push(e.contextualPrefix),t.push(e.content),t.join(`
|
|
75
|
+
`)}function EI(e,t,r){return`${e}
|
|
74
76
|
|
|
75
77
|
---
|
|
76
78
|
|
|
@@ -84,15 +86,15 @@ Respond with ONLY a JSON array of facts. Each fact object must have exactly thes
|
|
|
84
86
|
- "confidence" (string): one of high, medium, low
|
|
85
87
|
- "importance" (string): "vital" if essential to understanding the topic, "supplementary" if supporting detail
|
|
86
88
|
|
|
87
|
-
Output the JSON array directly, no explanation or wrapping.`}function
|
|
89
|
+
Output the JSON array directly, no explanation or wrapping.`}function _I(e,t){let r=Array.isArray(e)?e:Array.isArray(e?.facts)?e.facts:null;return r?r.filter(n=>n.content&&t.includes(n.category)&&["high","medium","low"].includes(n.confidence)).map(n=>({...n,importance:["vital","supplementary"].includes(n.importance)?n.importance:"supplementary"})):[]}async function xI(e,t,r){let n=wI(e),o=EI(t,n,r),i=await ge(o,{model:g.llm.extractionModel,caller:"extractor"});return _I(i,r).map(a=>({...a,sourceSection:e.sectionHeading||null}))}async function Dm(e,{promptPath:t,categories:r}){if(!e.length)return[];let n=await gI(t,"utf8"),o=Ws(e,yI),i=[];for(let s of o){let a=await Promise.all(s.map(c=>xI(c,n,r).catch(l=>(console.error(`[extractor] chunk failed: ${l.message}`),[]))));i.push(...a.flat())}return i}var yI,Lm=u(()=>{ti();ye();A();yI=5});function ri(e){if(!e||typeof e!="string")return e;let t=e;for(let r of SI)t=t.replace(r,_n);return t=t.replace(AI,(r,n)=>`${n}=${_n}`),t=t.replace(bI,(r,n)=>`${n}${_n}:${_n}@`),t=t.replace(II,(r,n)=>`${n}=${_n}`),t}var _n,SI,AI,bI,TI,II,ca=u(()=>{_n="***MASKED***",SI=[/\b(sk-(?:proj-|ant-)?[A-Za-z0-9_\-]{20,})\b/g,/\b(ghp_[A-Za-z0-9]{36,})\b/g,/\b(github_pat_[A-Za-z0-9_]{20,})\b/g,/\b(gho_[A-Za-z0-9]{36,})\b/g,/\b(glpat-[A-Za-z0-9_\-]{20,})\b/g,/\b(xox[baprs]-[A-Za-z0-9\-]{10,})\b/g,/\b(whsec_[A-Za-z0-9]{20,})\b/g,/\b(rk_(?:live|test)_[A-Za-z0-9]{20,})\b/g,/\b(AKIA[A-Z0-9]{16})\b/g,/\b(ASIA[A-Z0-9]{16})\b/g,/\b(eyJ[A-Za-z0-9_\-]{20,}\.[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,})\b/g,/\b([A-Za-z0-9]{24}\.[A-Za-z0-9_\-]{6}\.[A-Za-z0-9_\-]{27})\b/g,/\b(\d{8,12}:[A-Za-z0-9_\-]{35})\b/g],AI=new RegExp(`\\b(api[_-]?key|api[_-]?secret|secret[_-]?key|secret|token|password|passwd|pwd|auth[_-]?token|access[_-]?token|refresh[_-]?token|bearer|private[_-]?key|client[_-]?secret)\\s*[=:]\\s*["']?([^\\s"']{8,})["']?`,"gi"),bI=/(\w+:\/\/)([^:/\s]+):([^@\s]{3,})@/g,TI=["DATABASE_URL","REDIS_URL","MONGODB_URI","MONGO_URI","POSTGRES_URL","DSN","CONNECTION_STRING","ENCRYPTION_KEY","JWT_SECRET","SIGIL_ENCRYPTION_KEY","SESSION_SECRET","WEBHOOK_SECRET"],II=new RegExp(`\\b(${TI.join("|")})\\s*[=:]\\s*["']?([^\\s"']+)["']?`,"gi")});var xn={};x(xn,{deleteFact:()=>MI,deleteNamespace:()=>BI,findByUid:()=>vI,findSimilar:()=>Hm,getFactCount:()=>kI,getHotFacts:()=>LI,insertFact:()=>Tr,listByCategory:()=>DI,listByDocument:()=>km,listFacts:()=>PI,listNamespaces:()=>HI,markContradicted:()=>Mm,markSuperseded:()=>fa,recordAccess:()=>pa,saveFact:()=>da,supersedeStaleDocFacts:()=>ni});import{readFile as OI}from"node:fs/promises";import RI from"node:path";async function da({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:s,embedding:a}){e=ri(e);let c=a||await xt(e),l=await Hm(c,{namespace:o}),d={skip:Pm,ambiguous:la};if(!l.length)return{action:"ADD",fact:await Tr({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:s,embedding:c}),audm:{topSimilarity:null,matchCount:0,decision:"no-match",thresholds:d}};let p=l[0],f={topSimilarity:Number(p.similarity),matchCount:l.length,existingId:p.id,existingContent:p.content,thresholds:d};if(p.similarity>=Pm)return{action:"SKIP",existing:p,audm:{...f,decision:"skip-duplicate"}};if(p.similarity>=la){let w=await NI(e,p.content);if(w==="UPDATE"){let E=await Tr({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:s,embedding:c});return await fa(p.id,E.id),await ua({targetType:"fact",targetId:p.id,event:"UPDATE",oldContent:p.content,newContent:e,triggeredBy:`audm:sim=${p.similarity.toFixed(3)}`}),{action:"UPDATE",fact:E,supersededId:p.id,audm:{...f,decision:"llm:UPDATE"}}}if(w==="CONTRADICT"){let E=await Tr({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:s,embedding:c});return await Mm(p.id,E.id),await ua({targetType:"fact",targetId:p.id,event:"CONTRADICT",oldContent:p.content,newContent:e,triggeredBy:`audm:sim=${p.similarity.toFixed(3)}`}),{action:"CONTRADICT",fact:E,contradictedId:p.id,audm:{...f,decision:"llm:CONTRADICT"}}}return{action:"ADD",fact:await Tr({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:s,embedding:c}),audm:{...f,decision:"llm:ADD"}}}return{action:"ADD",fact:await Tr({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:s,embedding:c}),audm:{...f,decision:"below-ambiguous"}}}async function NI(e,t){let n=`${await OI(CI,"utf8")}
|
|
88
90
|
|
|
89
91
|
**EXISTING FACT:** ${t}
|
|
90
92
|
|
|
91
|
-
**NEW FACT:** ${e}`,i=(await
|
|
93
|
+
**NEW FACT:** ${e}`,i=(await Be(n,{model:g.llm.decisionModel,caller:"audm"})).trim().toUpperCase();return i.includes("UPDATE")?"UPDATE":i.includes("CONTRADICT")?"CONTRADICT":"ADD"}async function Tr({content:e,category:t,confidence:r,importance:n,namespace:o,sourceDocumentIds:i,sourceSection:s,embedding:a}){let c=`fact-${we(16)}`,l=null,d=null;try{let{currentDeviceId:f,currentAgent:m}=await Promise.resolve().then(()=>(po(),Xi));l=f(),d=m()}catch{}let[p]=await h("fact").insert({uid:c,content:e,category:t,confidence:r||"medium",importance:n||"supplementary",namespace:o,status:"active",sourceDocumentIds:i||[],sourceSection:s||null,embedding:G(a),validFrom:new Date,embeddingModel:g.embedding.model||null,embeddingDim:Number(g.embedding.dimensions)||null,createdByDeviceId:l,createdByAgent:d}).returning("*");return await h.raw(`
|
|
92
94
|
UPDATE fact
|
|
93
95
|
SET search_vector = to_tsvector('english', content)
|
|
94
96
|
WHERE id = ?
|
|
95
|
-
`,[p.id]),p}async function
|
|
97
|
+
`,[p.id]),p}async function vI(e){let[t]=await h("fact").where({uid:e});return t||null}async function DI(e,{namespace:t,limit:r=50}={}){let n=h("fact").where({category:e,status:"active"}).orderBy("createdAt","desc").limit(r);return t&&n.where({namespace:t}),n}async function km(e){return h("fact").whereRaw("? = ANY(source_document_ids)",[e]).where({status:"active"}).orderBy("createdAt","desc")}async function Mm(e,t){await h("fact").where({id:e}).update({status:"contradicted",contradictedById:t,validUntil:h.fn.now()})}async function fa(e,t){await h("fact").where({id:e}).update({status:"superseded",supersededById:t,validUntil:h.fn.now()})}async function ni(e,t=[]){let r=new Set((t||[]).filter(s=>s!=null)),n=await km(e),o=0,i=0;for(let s of n){if(r.has(s.id))continue;(Array.isArray(s.sourceDocumentIds)?s.sourceDocumentIds:[]).length<=1?(await fa(s.id,null),await ua({targetType:"fact",targetId:s.id,event:"SUPERSEDE",oldContent:s.content,newContent:null,triggeredBy:`reingest:doc=${e}`}),o++):(await h("fact").where({id:s.id}).update({sourceDocumentIds:h.raw("array_remove(source_document_ids, ?)",[e])}),i++)}return{superseded:o,dissociated:i}}async function Hm(e,{namespace:t,threshold:r=la,limit:n=5}){let o=G(e),i=`${Re("embedding")} <=> ${Ce()}`;return h.transaction(async s=>{await s.raw("SET LOCAL hnsw.ef_search = 40");let{rows:a}=await s.raw(`
|
|
96
98
|
SELECT id, uid, content, category, status,
|
|
97
99
|
1 - (${i}) as similarity
|
|
98
100
|
FROM fact
|
|
@@ -102,12 +104,12 @@ Output the JSON array directly, no explanation or wrapping.`}function mb(e,t){le
|
|
|
102
104
|
AND 1 - (${i}) >= ?
|
|
103
105
|
ORDER BY ${i}
|
|
104
106
|
LIMIT ?
|
|
105
|
-
`,[o,t,o,r,o,n]);return
|
|
107
|
+
`,[o,t,o,r,o,n]);return a})}async function ua({targetType:e,targetId:t,event:r,oldContent:n,newContent:o,triggeredBy:i}){await h("history").insert({targetType:e,targetId:t,event:r,oldContent:n||null,newContent:o||null,triggeredBy:i||null})}async function pa(e){e.length&&await h.raw(`UPDATE fact_lifecycle
|
|
106
108
|
SET access_count = access_count + 1,
|
|
107
109
|
last_accessed_at = NOW(),
|
|
108
110
|
stage = CASE WHEN stage = 'stable' THEN 'editing' ELSE stage END,
|
|
109
111
|
stage_entered_at = CASE WHEN stage = 'stable' THEN NOW() ELSE stage_entered_at END
|
|
110
|
-
WHERE fact_id = ANY(?)`,[e])}async function
|
|
112
|
+
WHERE fact_id = ANY(?)`,[e])}async function LI(e,{limit:t=10,since:r}={}){let n=h("fact as f").join("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active"}).where("fl.access_count",">",0).orderBy("fl.access_count","desc").limit(t).select("f.*");return e&&n.where({"f.namespace":e}),r&&n.where("fl.last_accessed_at",">=",r),n}async function PI({namespace:e,limit:t=50,offset:r=0,category:n}={}){let o=h("fact").where({status:"active"}).select("id","uid","content","category","confidence","importance","createdAt","namespace").orderBy("createdAt","desc").limit(t).offset(r);return e&&o.where({namespace:e}),n&&o.where({category:n}),o}async function kI(e){let t=h("fact").where({status:"active"});e&&t.where({namespace:e});let[{count:r}]=await t.count("id as count");return Number(r)}async function MI(e){let r=typeof e=="string"&&e.length>8?{uid:e}:{id:Number(e)},n=await h("fact").where(r).first();return n?(await h("fact_entity").where({factId:n.id}).del(),await h("fact").where({id:n.id}).del(),n):null}async function HI(){return(await h("fact").where({status:"active"}).select("namespace").count("id as factCount").groupBy("namespace").orderBy("namespace")).map(t=>({namespace:t.namespace,factCount:Number(t.factCount)}))}async function BI(e){await h.raw("DELETE FROM relation WHERE source_fact_id IN (SELECT id FROM fact WHERE namespace = ?)",[e]),await h.raw("DELETE FROM fact_entity WHERE fact_id IN (SELECT id FROM fact WHERE namespace = ?)",[e]),await h.raw("DELETE FROM relation WHERE source_id IN (SELECT id FROM entity WHERE namespace = ?) OR target_id IN (SELECT id FROM entity WHERE namespace = ?)",[e,e]);let t=await h("fact").where({namespace:e}).del(),r=await h("chunk").where({namespace:e}).del(),n=await h("document").where({namespace:e}).del(),o=await h("entity").where({namespace:e}).del();return{factsDeleted:t,chunksDeleted:r,docsDeleted:n,entitiesDeleted:o}}var CI,Pm,la,Tt=u(()=>{or();T();rr();ye();Ze();ca();A();C();CI=RI.join(Q,"audm-decision.md"),Pm=g.memory.skipThreshold,la=g.memory.ambiguousThreshold});var oi,FI,bU,Bm,ma=u(()=>{oi={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"},FI=["preference","opinion","personal","experience"],bU=Object.keys(oi).filter(e=>!FI.includes(e)),Bm=oi});import{readFile as $I}from"node:fs/promises";import{join as UI}from"node:path";async function $m(e,{title:t}={}){if(!e?.trim()||e.trim().length<jI)return{route:"noise",facts:[],entities:[],reasoning:"Empty or too short"};if(e.length>WI)return{route:"knowledge",facts:[],entities:[],reasoning:"Long content \u2014 auto-routed to full pipeline"};let n=`${await $I(GI,"utf8")}
|
|
111
113
|
|
|
112
114
|
---
|
|
113
115
|
|
|
@@ -116,36 +118,36 @@ Input: ${e}
|
|
|
116
118
|
|
|
117
119
|
---
|
|
118
120
|
|
|
119
|
-
Respond with ONLY a JSON object: { "route": "thought|knowledge|noise", "facts": [{"content":"...","category":"...","confidence":"high|medium|low","importance":"vital|supplementary"}], "entities": ["..."], "reasoning": "..." }`;try{let o=await
|
|
121
|
+
Respond with ONLY a JSON object: { "route": "thought|knowledge|noise", "facts": [{"content":"...","category":"...","confidence":"high|medium|low","importance":"vital|supplementary"}], "entities": ["..."], "reasoning": "..." }`;try{let o=await ge(n,{model:g.llm.extractionModel,caller:"classifier"});if(!o||!KI.includes(o.route))return Fm("Invalid classification result");let i=Object.keys(Bm),s=o.route==="thought"&&Array.isArray(o.facts)?o.facts.filter(a=>a.content&&i.includes(a.category)).map(a=>({...a,confidence:["high","medium","low"].includes(a.confidence)?a.confidence:"high",importance:["vital","supplementary"].includes(a.importance)?a.importance:"vital"})):[];return{route:o.route,facts:s,entities:Array.isArray(o.entities)?o.entities:[],reasoning:o.reasoning||""}}catch(o){return console.error("[input-classifier] Failed:",o.message),Fm(o.message)}}function Fm(e){return{route:"knowledge",facts:[],entities:[],reasoning:`Fallback \u2014 ${e}`}}var GI,jI,WI,KI,Um=u(()=>{ye();A();ma();C();GI=UI(Q,"input-classifier.md"),jI=3,WI=2e3,KI=["thought","knowledge","noise"]});var Ir={};x(Ir,{findById:()=>Ae,findByName:()=>It,findByUid:()=>YI,findSimilar:()=>VI,getCanonicalEntity:()=>Rt,getEntityCount:()=>zI,incrementMentionCount:()=>Sn,insertEntity:()=>ha,listByType:()=>JI,pushAlias:()=>ii,searchByName:()=>ya,updateDescription:()=>qI,updateEntityTypes:()=>Ot,updateName:()=>ga});async function ha({name:e,entityType:t,description:r,namespace:n,externalId:o,embedding:i}){let s=`ent-${we(16)}`,[a]=await h("entity").insert({uid:s,name:e,entityType:t,description:r||null,namespace:n||g.defaults.namespace,externalId:o||null,mentionCount:1,embedding:G(i)}).returning("*");return a}async function It(e,t){let r=t||g.defaults.namespace,n=e.toLowerCase();return h("entity").where({namespace:r}).whereNull("mergedWith").where(function(){this.whereRaw("LOWER(name) = ?",[n]).orWhereRaw("aliases @> ARRAY[?]::text[]",[n])}).first()||null}async function ii(e,t){if(!t)return;let r=t.toLowerCase();await h.raw(`
|
|
120
122
|
UPDATE entity
|
|
121
123
|
SET aliases = (
|
|
122
124
|
SELECT ARRAY(SELECT DISTINCT unnest(aliases || ARRAY[?]::text[]))
|
|
123
125
|
)
|
|
124
126
|
WHERE id = ?
|
|
125
|
-
`,[r,e])}async function
|
|
127
|
+
`,[r,e])}async function ga(e,t){await h("entity").where({id:e}).update({name:t})}async function YI(e){return h("entity").where({uid:e}).first()||null}async function Ae(e){return h("entity").where({id:e}).first()||null}async function VI(e,{entityType:t,namespace:r,threshold:n=.85,limit:o=3}){let i=G(e),s=`${Re("embedding")} <=> ${Ce()}`,{rows:a}=await h.raw(`
|
|
126
128
|
SELECT id, uid, name, entity_type AS "entityType", description,
|
|
127
129
|
mention_count AS "mentionCount",
|
|
128
|
-
1 - (${
|
|
130
|
+
1 - (${s}) AS similarity
|
|
129
131
|
FROM entity
|
|
130
132
|
WHERE entity_type = ?
|
|
131
133
|
AND namespace = COALESCE(?, ?)
|
|
132
134
|
AND embedding IS NOT NULL
|
|
133
135
|
AND merged_with IS NULL
|
|
134
|
-
AND 1 - (${
|
|
135
|
-
ORDER BY ${
|
|
136
|
+
AND 1 - (${s}) >= ?
|
|
137
|
+
ORDER BY ${s}
|
|
136
138
|
LIMIT ?
|
|
137
|
-
`,[i,t,r,g.defaults.namespace,i,n,i,o]);return
|
|
139
|
+
`,[i,t,r,g.defaults.namespace,i,n,i,o]);return a}async function Sn(e){await h("entity").where({id:e}).increment("mentionCount",1)}async function qI(e,t){await h("entity").where({id:e}).update({description:t})}async function JI(e,{namespace:t,limit:r=50}={}){let n=h("entity").where({entityType:e}).whereNull("mergedWith").orderBy("mentionCount","desc").limit(r);return t&&n.where({namespace:t}),n}async function zI(e){let[{count:t}]=await h("entity").where({entityType:e}).whereNull("mergedWith").count("id as count");return Number(t)}async function ya(e,{entityType:t,namespace:r,limit:n=10}={}){let o=h("entity").whereRaw("LOWER(name) LIKE ?",[`%${e.toLowerCase()}%`]).whereNull("mergedWith").orderBy("mentionCount","desc").limit(n);return t&&o.where({entityType:t}),r&&o.where({namespace:r}),o}async function Ot(e,t){let r=await Ae(e);if(!r)return;let n;try{n=r.entityTypes?JSON.parse(r.entityTypes):[r.entityType]}catch{n=[r.entityType]}n.includes(t)||(n.push(t),await h("entity").where({id:e}).update({entityTypes:JSON.stringify(n)}))}async function Rt(e){let t=await Ae(e);for(;t?.mergedWith;)t=await Ae(t.mergedWith);return t}var ve=u(()=>{or();T();Ze();A()});async function Gm(e,t,{namespace:r,threshold:n=XI,limit:o=5}){if(!t)return[];let i=G(t),s=`${Re("embedding")} <=> ${Ce()}`,{rows:a}=await h.raw(`
|
|
138
140
|
SELECT id, name, entity_type AS "entityType", entity_types AS "entityTypes",
|
|
139
|
-
1 - (${
|
|
141
|
+
1 - (${s}) AS similarity
|
|
140
142
|
FROM entity
|
|
141
143
|
WHERE namespace = ?
|
|
142
144
|
AND embedding IS NOT NULL
|
|
143
145
|
AND LOWER(name) != LOWER(?)
|
|
144
146
|
AND merged_with IS NULL
|
|
145
|
-
AND 1 - (${
|
|
146
|
-
ORDER BY ${
|
|
147
|
+
AND 1 - (${s}) >= ?
|
|
148
|
+
ORDER BY ${s}
|
|
147
149
|
LIMIT ?
|
|
148
|
-
`,[i,r,e,i,n,i,o]);return
|
|
150
|
+
`,[i,r,e,i,n,i,o]);return a.map(c=>{let l;try{l=c.entityTypes?JSON.parse(c.entityTypes):[c.entityType]}catch{l=[c.entityType]}return{...c,types:l}})}async function wa(e,t,r,n){let o=(r.aliases||[]).filter(Boolean),i=o.length?`Existing aliases: ${o.join(", ")}`:"",s=r.similarity>0?`Name-embedding similarity: ${(r.similarity*100).toFixed(0)}%`:"Name-embedding similarity: not directly measured (LLM judging on episode text alone)",a=n?`
|
|
149
151
|
Source passage where the new mention appeared:
|
|
150
152
|
---
|
|
151
153
|
${n.slice(0,1500)}
|
|
@@ -155,8 +157,8 @@ ${n.slice(0,1500)}
|
|
|
155
157
|
Mention A (new): "${e}" (type: ${t})
|
|
156
158
|
Mention B (existing): "${r.name}" (types: ${(r.types||[r.entityType]).join(", ")})
|
|
157
159
|
${i}
|
|
158
|
-
${a}
|
|
159
160
|
${s}
|
|
161
|
+
${a}
|
|
160
162
|
Decision rules:
|
|
161
163
|
- "same" = true when both mentions refer to the same person/product/concept/thing \u2014 including renames, abbreviations ("NYC" / "New York City"), and common-knowledge equivalents.
|
|
162
164
|
- "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.
|
|
@@ -164,19 +166,19 @@ Decision rules:
|
|
|
164
166
|
- If you cannot tell, "same" is false. Don't guess.
|
|
165
167
|
|
|
166
168
|
Respond as STRICT JSON, no markdown, no prose:
|
|
167
|
-
{"same": boolean, "rename": boolean, "current_name": "<one of A or B verbatim, or null>", "reason": "one short sentence"}`,l;try{l=await
|
|
169
|
+
{"same": boolean, "rename": boolean, "current_name": "<one of A or B verbatim, or null>", "reason": "one short sentence"}`,l;try{l=await Be(c,{model:g.llm.entityModel,caller:"entity-matcher"})}catch{return{same:!1,rename:!1,reason:"llm-error"}}let d=ZI(l);return d&&typeof d.same=="boolean"?{same:d.same===!0,rename:d.rename===!0&&d.same===!0,currentName:typeof d.current_name=="string"?d.current_name:null,reason:typeof d.reason=="string"?d.reason:""}:{same:/^\s*(yes|true)\b/i.test(l),rename:!1,currentName:null,reason:"fallback-text-match"}}function ZI(e){if(typeof e!="string")return null;try{return JSON.parse(e.trim())}catch{}let t=e.match(/\{[\s\S]*\}/);if(t)try{return JSON.parse(t[0])}catch{}return null}var XI,jm=u(()=>{T();ye();Ze();A();XI=.85});var Wm={};x(Wm,{followMergeChain:()=>rO,mergeEntities:()=>QI});async function QI(e,t){let[r,n]=await Promise.all([Ae(e),Ae(t)]);if(!r||!n)throw new Error(`Entity ${e} or ${t} not found`);if(e===t)return r;let o=(r.mentionCount||0)+(n.mentionCount||0);await h.transaction(async s=>{await s("relation").where({sourceId:t}).update({sourceId:e}),await s("relation").where({targetId:t}).update({targetId:e}),await s("relation").whereRaw("source_id = target_id").del(),await s.raw(`
|
|
168
170
|
INSERT INTO fact_entity (fact_id, entity_id, mention_type, mention_count, created_at, updated_at)
|
|
169
171
|
SELECT fact_id, ?, mention_type, mention_count, NOW(), NOW()
|
|
170
172
|
FROM fact_entity
|
|
171
173
|
WHERE entity_id = ?
|
|
172
174
|
ON CONFLICT (fact_id, entity_id, mention_type)
|
|
173
175
|
DO UPDATE SET mention_count = fact_entity.mention_count + EXCLUDED.mention_count
|
|
174
|
-
`,[e,t]),await
|
|
175
|
-
`),i=`${await
|
|
176
|
+
`,[e,t]),await s("fact_entity").where({entityId:t}).del(),await s("entity").where({id:e}).update({mentionCount:o}),await s("pod").where({entityId:e,status:"active"}).first()?await s("pod").where({entityId:t}).update({status:"archived",updatedAt:s.fn.now()}):await s("pod").where({entityId:t}).update({entityId:e,updatedAt:s.fn.now()}),await s("entity").where({id:t}).update({mergedWith:e})}),await tO(e);let i=eO(n);for(let s of i)await Ot(e,s);return console.log(`[entity-merge] Merged ${t} (${n.name}) into ${e} (${r.name})`),{...r,mentionCount:o}}function eO(e){if(!e.entityTypes)return[e.entityType];try{return JSON.parse(e.entityTypes)}catch{return[e.entityType]}}async function tO(e){let t=await h("relation").where(function(){this.where({sourceId:e}).orWhere({targetId:e})}).whereNull("invalidAt"),r=oa(t,n=>`${n.sourceId}-${n.targetId}-${n.relationType}`);for(let n of Object.values(r)){if(n.length<=1)continue;let[o,...i]=ia(n,"id"),s=sa(n,"mentionCount");await h("relation").where({id:o.id}).update({mentionCount:s}),await h("relation").whereIn("id",i.map(a=>a.id)).del()}}async function rO(e){let t=await Ae(e),r=[t?.id];for(;t?.mergedWith;)t=await Ae(t.mergedWith),t&&r.push(t.id);return{canonical:t,chain:r}}var Km=u(()=>{ti();T();ve()});import{readFile as nO}from"node:fs/promises";async function An({name:e,entityType:t,description:r,namespace:n,externalId:o,embedding:i,episodeText:s,episodeEntityIds:a=[]}){let c=n||g.defaults.namespace,l=await It(e,c);if(l)return l=await Rt(l.id),await Sn(l.id),l.entityType!==t&&await Ot(l.id,t),l;let d=i||await xt(`${t}: ${e}`),p=await Gm(e,d,{namespace:c,limit:3});for(let w of p){let y=await wa(e,t,w,s);if(y.same)return Ym(w,{newName:e,entityType:t,isRename:y.rename,currentName:y.currentName})}let f=new Set(p.map(w=>w.id)),m=a.filter(w=>w!=null&&!f.has(w));for(let w of m){let y=await Rt(w);if(!y||y.namespace!==c||y.name?.toLowerCase()===e.toLowerCase())continue;let E=await wa(e,t,{...y,types:oO(y),similarity:0},s);if(E.same)return Ym(y,{newName:e,entityType:t,isRename:E.rename,currentName:E.currentName})}try{return await ha({name:e,entityType:t,description:r,namespace:c,externalId:o,embedding:d})}catch(w){if(Vm(w)){let y=await It(e,c);if(y){let E=await Rt(y.id);return await Sn(E.id),await Ot(E.id,t),E}}throw w}}function Vm(e){return e?!!(e.code==="23505"||typeof e.message=="string"&&e.message.includes("duplicate key value violates unique constraint")):!1}async function Ym(e,{newName:t,entityType:r,isRename:n,currentName:o}){let i=await Rt(e.id);if(await Sn(i.id),await Ot(i.id,r),n&&i.name&&i.name.toLowerCase()!==t.toLowerCase()){let s=t.toLowerCase(),a=i.name.toLowerCase(),c=(o||"").toLowerCase(),l,d;if(c===s?(l=t,d=i.name):c===a?(l=i.name,d=t):(l=t,d=i.name),d&&d.toLowerCase()!==l.toLowerCase()&&(await ii(i.id,d),i.aliases=[...i.aliases||[],d.toLowerCase()]),l!==i.name)try{await ga(i.id,l),i.name=l}catch(p){if(Vm(p)){let f=await It(l,i.namespace);if(f&&f.id!==i.id){let{mergeEntities:m}=await Promise.resolve().then(()=>(Km(),Wm));return await m(f.id,i.id),await ii(f.id,i.name),await Rt(f.id)}}throw p}}return i}function oO(e){if(e.entityTypes)try{return JSON.parse(e.entityTypes)}catch{}return[e.entityType]}async function Ea(e,{promptPath:t,namespace:r}){if(!e.length)return[];let n=e.map(f=>`- [${f.category}] ${f.content}`).join(`
|
|
177
|
+
`),i=`${await nO(t,"utf8")}
|
|
176
178
|
|
|
177
179
|
---
|
|
178
180
|
|
|
179
|
-
${n}`,
|
|
181
|
+
${n}`,s=await Be(i,{model:g.llm.entityModel,caller:"entity-resolver"}),a=bo(s);if(!Array.isArray(a))return[];let c=a.filter(f=>f.name);if(!c.length)return[];let l=new Array(c.length),d=[],p=[];for(let f=0;f<c.length;f++){let m=await iO(c[f].name,r);m?(l[f]=m,d.push(m.id)):p.push(f)}for(let f of p){let m=c[f],w=await An({name:m.name,entityType:"topic",description:m.description||null,namespace:r,episodeText:n,episodeEntityIds:d});l[f]=w,w?.id&&d.push(w.id)}return l.filter(Boolean)}async function iO(e,t){let{findByName:r,getCanonicalEntity:n,incrementMentionCount:o}=await Promise.resolve().then(()=>(ve(),Ir)),i=await r(e,t);if(!i)return null;let s=await n(i.id);return await o(s.id),s}var qm=u(()=>{rr();ye();A();ve();jm()});var si={};x(si,{createRelation:()=>bn,findRelation:()=>sO,getRelationCount:()=>lO,getRelationsByFact:()=>cO,invalidateRelation:()=>aO,listRelationsForEntity:()=>Tn});async function bn({sourceId:e,targetId:t,relationType:r,sourceFactId:n,validAt:o}){let{rows:[i]}=await h.raw(`
|
|
180
182
|
INSERT INTO relation (source_id, target_id, relation_type, source_fact_id, mention_count, valid_at, created_at, updated_at)
|
|
181
183
|
VALUES (?, ?, ?, ?, 1, ?, NOW(), NOW())
|
|
182
184
|
ON CONFLICT (source_id, target_id, relation_type) DO UPDATE SET
|
|
@@ -184,11 +186,11 @@ ${n}`,a=await ge(i,{model:g.llm.entityModel,caller:"entity-resolver"}),s=qr(a);i
|
|
|
184
186
|
source_fact_id = COALESCE(EXCLUDED.source_fact_id, relation.source_fact_id),
|
|
185
187
|
updated_at = NOW()
|
|
186
188
|
RETURNING *
|
|
187
|
-
`,[e,t,r,n||null,o||null]);return i}async function
|
|
189
|
+
`,[e,t,r,n||null,o||null]);return i}async function sO(e,t,r){return h("relation").where({sourceId:e,targetId:t,relationType:r}).whereNull("invalidAt").first()||null}async function aO(e,{invalidAt:t}={}){await h("relation").where({id:e}).update({invalidAt:t||new Date})}async function Tn(e,{direction:t="both",relationType:r,limit:n=50}={}){let o=a=>{let c=a==="outgoing"?"source_id":"target_id",l=a==="outgoing"?"target_id":"source_id";return h.raw(`
|
|
188
190
|
SELECT r.id AS "relationId", r.relation_type AS "relationType",
|
|
189
191
|
r.mention_count AS "mentionCount", r.valid_at AS "validAt",
|
|
190
192
|
e.id AS "entityId", e.uid, e.name, e.entity_type AS "entityType",
|
|
191
|
-
e.description, '${
|
|
193
|
+
e.description, '${a}' AS direction
|
|
192
194
|
FROM relation r
|
|
193
195
|
JOIN entity e ON e.id = r.${l}
|
|
194
196
|
WHERE r.${c} = ?
|
|
@@ -197,7 +199,7 @@ ${n}`,a=await ge(i,{model:g.llm.entityModel,caller:"entity-resolver"}),s=qr(a);i
|
|
|
197
199
|
${r?"AND r.relation_type = ?":""}
|
|
198
200
|
ORDER BY r.mention_count DESC
|
|
199
201
|
LIMIT ?
|
|
200
|
-
`,r?[e,r,n]:[e,n])};if(t==="outgoing"){let{rows:
|
|
202
|
+
`,r?[e,r,n]:[e,n])};if(t==="outgoing"){let{rows:a}=await o("outgoing");return a}if(t==="incoming"){let{rows:a}=await o("incoming");return a}let[i,s]=await Promise.all([o("outgoing"),o("incoming")]);return[...i.rows,...s.rows]}async function cO(e){let{rows:t}=await h.raw(`
|
|
201
203
|
SELECT r.id, r.relation_type AS "relationType",
|
|
202
204
|
r.mention_count AS "mentionCount",
|
|
203
205
|
s.name AS "sourceName", s.entity_type AS "sourceType",
|
|
@@ -209,62 +211,62 @@ ${n}`,a=await ge(i,{model:g.llm.entityModel,caller:"entity-resolver"}),s=qr(a);i
|
|
|
209
211
|
AND r.invalid_at IS NULL
|
|
210
212
|
AND s.merged_with IS NULL
|
|
211
213
|
AND t.merged_with IS NULL
|
|
212
|
-
`,[e]);return t}async function
|
|
214
|
+
`,[e]);return t}async function lO(){let[{count:e}]=await h("relation").whereNull("invalidAt").count("id as count");return Number(e)}var Ct=u(()=>{T()});var Nt={};x(Nt,{archivePod:()=>fO,deletePod:()=>pO,findByEntityId:()=>zm,findByExternalId:()=>Cr,findById:()=>uO,findByUid:()=>Rr,incrementCounters:()=>Nr,insertPod:()=>Jm,listPods:()=>dO,patchAttrs:()=>In,reassignEntity:()=>mO,setEndedAt:()=>_a,upsertPod:()=>Or});async function Jm({podType:e,name:t,namespace:r,attrs:n={},entityId:o=null,connectionId:i=null,externalId:s=null,startedAt:a=null,endedAt:c=null}){let l=`pod-${we(16)}`,[d]=await h("pod").insert({uid:l,podType:e,name:t,namespace:r||g.defaults.namespace,attrs:JSON.stringify(n),entityId:o,connectionId:i,externalId:s,startedAt:a,endedAt:c}).returning("*");return d}async function Or({podType:e,externalId:t,name:r,namespace:n,attrs:o={},entityId:i=null,connectionId:s=null,startedAt:a=null}){if(!t)throw new Error("upsertPod requires externalId; use insertPod for custom pods");let c=`pod-${we(16)}`,l=n||g.defaults.namespace,{rows:[d]}=await h.raw(`
|
|
213
215
|
INSERT INTO pod (uid, pod_type, name, namespace, attrs, entity_id, connection_id, external_id, started_at, created_at, updated_at)
|
|
214
216
|
VALUES (?, ?, ?, ?, ?::jsonb, ?, ?, ?, ?, NOW(), NOW())
|
|
215
217
|
ON CONFLICT (pod_type, external_id, namespace) WHERE external_id IS NOT NULL DO UPDATE SET
|
|
216
218
|
attrs = pod.attrs || EXCLUDED.attrs,
|
|
217
219
|
updated_at = NOW()
|
|
218
220
|
RETURNING *, (xmax = 0) AS "isNew"
|
|
219
|
-
`,[c,e,r,l,JSON.stringify(o),i,
|
|
221
|
+
`,[c,e,r,l,JSON.stringify(o),i,s,t,a]);return{pod:d,isNew:d.isNew}}async function Rr(e){return h("pod").where({uid:e}).first()||null}async function uO(e){return h("pod").where({id:e}).first()||null}async function Cr({podType:e,externalId:t,namespace:r}){return h("pod").where({podType:e,externalId:t,namespace:r||g.defaults.namespace}).first()||null}async function zm(e){return h("pod").where({entityId:e}).first()||null}async function dO({podType:e,namespace:t,status:r="active",limit:n=20}={}){let o=h("pod").where({status:r}).orderBy("updatedAt","desc").limit(n);return e&&o.where({podType:e}),t&&o.where({namespace:t}),o}async function fO(e){await h("pod").where({id:e}).update({status:"archived",updatedAt:h.fn.now()})}async function pO(e){await h("pod").where({id:e}).del()}async function In(e,t){await h.raw("UPDATE pod SET attrs = attrs || ?::jsonb, updated_at = NOW() WHERE id = ?",[JSON.stringify(t),e])}async function _a(e,t=new Date){await h("pod").where({id:e}).update({endedAt:t,updatedAt:h.fn.now()})}async function mO(e,t){await h("pod").where({entityId:e}).update({entityId:t,updatedAt:h.fn.now()})}async function Nr(e,{docs:t=0,facts:r=0}){!t&&!r||await h.raw(`UPDATE pod
|
|
220
222
|
SET member_doc_count = member_doc_count + ?,
|
|
221
223
|
member_fact_count = member_fact_count + ?,
|
|
222
224
|
updated_at = NOW()
|
|
223
|
-
WHERE id = ?`,[t,r,e])}var
|
|
225
|
+
WHERE id = ?`,[t,r,e])}var lt=u(()=>{or();T();A()});var vr={};x(vr,{attach:()=>ai,attachDocument:()=>xa,attachEntity:()=>hO,attachFact:()=>On,detach:()=>gO,factIdsInPod:()=>EO,listMembers:()=>yO,listPodsForMember:()=>wO});async function ai(e,t,r,n="primary"){let{rowCount:o}=await h.raw(`INSERT INTO pod_membership (pod_id, member_type, member_id, role)
|
|
224
226
|
VALUES (?, ?, ?, ?)
|
|
225
|
-
ON CONFLICT (pod_id, member_type, member_id) DO NOTHING`,[e,t,r,n]);return o>0&&(t==="fact"?await
|
|
226
|
-
`),c=[];for(let f of e.items){let
|
|
227
|
-
`).slice(0,2e3),c=await
|
|
228
|
-
`),
|
|
229
|
-
`),
|
|
230
|
-
`),{documentId:null,title:
|
|
231
|
-
`);let
|
|
232
|
-
`),{documentId:
|
|
233
|
-
`);let
|
|
234
|
-
`);let
|
|
235
|
-
`),{documentId:
|
|
236
|
-
`),
|
|
237
|
-
`),!f&&
|
|
238
|
-
${
|
|
239
|
-
`),
|
|
240
|
-
`),await
|
|
241
|
-
`),
|
|
242
|
-
`))}catch(
|
|
243
|
-
`),{documentId:
|
|
244
|
-
`),!i.length)return{counts:{total:0,added:0,skipped:0,updated:0,contradicted:0},results:[]};let
|
|
245
|
-
`),
|
|
227
|
+
ON CONFLICT (pod_id, member_type, member_id) DO NOTHING`,[e,t,r,n]);return o>0&&(t==="fact"?await Nr(e,{facts:1}):t==="document"&&await Nr(e,{docs:1})),{attached:o>0}}async function gO(e,t,r){let n=await h("pod_membership").where({podId:e,memberType:t,memberId:r}).del();return n>0&&(t==="fact"?await Nr(e,{facts:-1}):t==="document"&&await Nr(e,{docs:-1})),{detached:n>0}}async function yO(e,{memberType:t,limit:r=20}={}){if(!t)throw new Error("listMembers requires a memberType filter");return h(`${t} as t`).join("pod_membership as pm",function(){this.on("pm.member_id","=","t.id").andOnVal("pm.member_type","=",t)}).where("pm.pod_id",e).orderBy("pm.createdAt","desc").limit(r).select("t.*","pm.role as podRole","pm.createdAt as attachedAt")}async function wO(e,t){return h("pod as p").join("pod_membership as pm","pm.pod_id","p.id").where("pm.memberType",e).where("pm.memberId",t).select("p.*","pm.role as podRole")}async function EO(e){return await h("pod_membership").where({podId:e,memberType:"fact"}).pluck("memberId")}var On,xa,hO,Rn=u(()=>{T();lt();On=(e,t,r)=>ai(e,"fact",t,r),xa=(e,t,r)=>ai(e,"document",t,r),hO=(e,t,r)=>ai(e,"entity",t,r)});var Aa={};x(Aa,{getEntitiesForFact:()=>xO,getEntityIdsForFacts:()=>Dr,getFactsForEntity:()=>Sa,linkEntitiesToFact:()=>Cn});async function Cn(e,t){if(!t.length)return;let r=aa(t,"id"),n=r.map(o=>({factId:e,entityId:o.id,mentionType:"content",mentionCount:1}));await h("fact_entity").insert(n).onConflict(h.raw("(fact_id, entity_id, mention_type)")).merge({mentionCount:h.raw("fact_entity.mention_count + 1")}),await _O(e,r)}async function _O(e,t){let r=t.map(o=>o.id).filter(Boolean);if(!r.length)return;let n=await h("pod").whereIn("entityId",r).where({status:"active"}).select("id");for(let{id:o}of n)await On(o,e,"mention")}async function Sa(e,{limit:t=50}={}){return h("fact").join("fact_entity","fact.id","fact_entity.fact_id").where("fact_entity.entity_id",e).where("fact.status","active").select("fact.*","fact_entity.mention_count as entityMentionCount").orderBy("fact_entity.mention_count","desc").limit(t)}async function xO(e){return h("entity").join("fact_entity","entity.id","fact_entity.entity_id").where("fact_entity.fact_id",e).whereNull("entity.mergedWith").select("entity.id","entity.uid","entity.name","entity.entityType","entity.description")}async function Dr(e){if(!e.length)return new Map;let t=await h("fact_entity").whereIn("factId",e).select("factId","entityId"),r=new Map;for(let n of t)r.has(n.factId)||r.set(n.factId,[]),r.get(n.factId).push(n.entityId);return r}var vt=u(()=>{ti();T();Rn()});import SO from"node:path";async function Oa(e,t,r,n){let{title:o,sourceType:i,metadata:s={}}=e,a=t.filter(f=>f.action==="ADD"||f.action==="UPDATE"),c=a.map(f=>f.fact||f.existing).filter(Boolean),d=a.find(f=>f.fact)?.fact?.id||null,p=new Date().toISOString().split("T")[0];return n?.items?.length?AO({entityDefs:n,factObjects:c,firstFactId:d,namespace:r,today:p}):bO({title:o,sourceType:i,metadata:s,factObjects:c,firstFactId:d,namespace:r,today:p})}async function AO({entityDefs:e,factObjects:t,firstFactId:r,namespace:n,today:o}){let i={},s=0,a=t.map(f=>f.content).filter(Boolean).join(`
|
|
228
|
+
`),c=[];for(let f of e.items){let m=await An({name:f.name,entityType:f.type,description:f.description,namespace:n,episodeText:a,episodeEntityIds:c});i[f.name]=m,m?.id&&c.push(m.id)}for(let f of e.relations||[]){let m=i[f.source],w=i[f.target];if(!m||!w)continue;let y=ba(t,f.source)||ba(t,f.target);await bn({sourceId:m.id,targetId:w.id,relationType:f.type,sourceFactId:y?.id||r,validAt:o}),s++}let l=await Ia(t,n),d=Ta(Object.values(i),l),p=0;for(let f of t){let m=d.filter(w=>ci(f.content,w));m.length&&(await Cn(f.id,m),p+=m.length)}return{entityCount:d.length,relationCount:s,factEntityLinks:p,topics:d.filter(f=>f.entityType==="topic").map(f=>f.name)}}async function bO({title:e,sourceType:t,metadata:r,factObjects:n,firstFactId:o,namespace:i,today:s}){if(!e){let E=n.length?await Ea(n,{promptPath:Xm,namespace:i}):[],b=await Ia(n,i),_=Ta(E,b),R=0;for(let I of n){let S=_.filter(q=>ci(I.content,q));S.length&&(await Cn(I.id,S),R+=S.length)}return{entityCount:_.length,relationCount:0,factEntityLinks:R,topics:E.map(I=>I.name)}}let a=n.map(E=>E.content).filter(Boolean).join(`
|
|
229
|
+
`).slice(0,2e3),c=await An({name:e,entityType:"document",description:`${t} document: ${e}`,namespace:i,episodeText:a}),l=null;r.author&&(l=await An({name:r.author,entityType:"person",namespace:i,episodeText:a,episodeEntityIds:c?.id?[c.id]:[]}));let d=n.length?await Ea(n,{promptPath:Xm,namespace:i}):[],p=0;l&&(await bn({sourceId:c.id,targetId:l.id,relationType:"AUTHORED_BY",sourceFactId:o,validAt:s}),p++);for(let E of d){let b=ba(n,E.name);await bn({sourceId:c.id,targetId:E.id,relationType:"COVERS",sourceFactId:b?.id||o,validAt:s}),p++}let f=[c,l,...d].filter(Boolean),m=await Ia(n,i),w=Ta(f,m),y=0;for(let E of n){let b=w.filter(_=>ci(E.content,_));b.length&&(await Cn(E.id,b),y+=b.length)}return{entityCount:w.length,relationCount:p,factEntityLinks:y,topics:d.map(E=>E.name)}}function ba(e,t){if(!t)return null;let r=t.toLowerCase();return e.find(n=>n.content?.toLowerCase().includes(r))||null}function ci(e,t){if(!e||!t?.name)return!1;let r=e.toLowerCase();return[t.name.toLowerCase(),...t.aliases||[]].some(o=>o?new RegExp(`\\b${TO(o)}\\b`).test(r):!1)}function TO(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ta(...e){let t=new Set,r=[];for(let n of e)for(let o of n)!o||t.has(o.id)||(t.add(o.id),r.push(o));return r}async function Ia(e,t){if(!e?.length)return[];let r=await h("entity as e").join("pod as p","p.entity_id","e.id").where("p.status","active").where("e.namespace",t).whereNull("e.mergedWith").select("e.id","e.uid","e.name","e.entityType","e.aliases");return r.length?r.filter(n=>e.some(o=>ci(o.content,n))):[]}var Xm,Zm=u(()=>{qm();Ct();vt();C();T();Xm=SO.join(Q,"entity-extraction.md")});var IO,Qm,Ra=u(()=>{T();A();IO=1440*60*1e3,Qm={name:"person",description:"A person you have a working relationship with",identityField:"primary_handle",attrsSchema:{platforms:"object",role:"string",relationship:"string",notes:"string"},visibility:"private",activeMode:"rolling-window",hotContextBudget:4,retrievalWeights:{recency:1,relevance:.8},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/person.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.namespace||g.defaults.namespace;try{let r=new Date(Date.now()-IO);return(await h("pod as p").join("pod_membership as pm","pm.pod_id","p.id").join("fact_lifecycle as fl","fl.fact_id","pm.member_id").where("pm.memberType","fact").where("p.podType","person").where("p.namespace",t).where("p.status","active").where("fl.lastAccessedAt",">=",r).distinct("p.uid")).map(o=>o.uid)}catch{return[]}}}});function rh({sessionId:e,transcriptPath:t=null,cwd:r=null,turnCount:n=0,model:o=null,conclusion:i=null,summary:s=null}){return{session_id:e,transcript_path:t,cwd:r,turn_count:n,model:o,conclusion:i,summary:s}}function nh({sessionId:e,startedAt:t=new Date}={}){let n=(t instanceof Date?t:new Date(t)).toISOString().replace("T"," ").slice(0,16),o=e?e.slice(0,8):"unknown";return`claude-session ${n} (${o})`}var eh,th,Ca=u(()=>{Nn();eh="claude_session",th={name:"claude_session",description:"Claude Code session",identityField:"session_id",attrsSchema:{session_id:"string",transcript_path:"string",cwd:"string",turn_count:"number",model:"string",conclusion:"string",summary:"string"},visibility:"private",activeMode:"singleton-live",hotContextBudget:6,retrievalWeights:{recency:1,relevance:.7},importanceDefault:2,ttlDays:90,schemaDocPath:"kinds/claude_session.schema.md",writePolicy:"origin-only",resolveActiveScope:async()=>{try{let e=await Na();return e?[e]:[]}catch{return[]}}}});var ui={};x(ui,{CURSOR_PATH:()=>Lr,endActiveSession:()=>BO,ensureActiveSession:()=>kO,getActiveCursor:()=>HO,getActiveSessionPodUid:()=>Na});import{writeFile as CO,readFile as NO,unlink as vO}from"node:fs/promises";import{existsSync as DO,mkdirSync as LO}from"node:fs";import{dirname as oh}from"node:path";async function li(){try{let e=await NO(Lr,"utf8");return JSON.parse(e)}catch{return null}}async function ih(e){DO(oh(Lr))||LO(oh(Lr),{recursive:!0}),await CO(Lr,JSON.stringify(e,null,2),"utf8")}async function kO({sessionId:e,transcriptPath:t=null,cwd:r=null,model:n=null,namespace:o=null}){if(!e)throw new Error("ensureActiveSession requires sessionId from hook stdin");let i=o||g.defaults.namespace,s=await li();if(s&&s.session_id===e&&s.namespace===i){let l=await Rr(s.pod_uid);if(l)return await In(l.id,{turn_count:(FO(l.attrs)||0)+1}),await MO(s),l}let a=new Date,{pod:c}=await Or({podType:eh,externalId:e,name:nh({sessionId:e,startedAt:a}),namespace:i,attrs:rh({sessionId:e,transcriptPath:t,cwd:r,turnCount:1,model:n}),startedAt:a});return await ih({session_id:e,pod_uid:c.uid,namespace:i,started_at:c.startedAt??a.toISOString(),last_seen_at:new Date().toISOString()}),c}async function MO(e){await ih({...e,last_seen_at:new Date().toISOString()})}async function Na({allowStale:e=!1}={}){let t=await li();return!t||!t.pod_uid||!e&&t.started_at&&Date.now()-new Date(t.started_at).getTime()>PO?null:t.pod_uid}async function HO(){return li()}async function BO({conclusion:e=null,summary:t=null}={}){let r=await li();if(!r)return null;let n=await Rr(r.pod_uid);if(n){if(e||t){let o={};e&&(o.conclusion=e),t&&(o.summary=t),await In(n.id,o)}await _a(n.id)}try{await vO(Lr)}catch{}return n}function FO(e){if(!e)return 0;if(typeof e=="object")return e.turn_count??0;try{return JSON.parse(e).turn_count??0}catch{return 0}}var Lr,PO,Nn=u(()=>{lt();Ca();A();C();Lr=Gi,PO=360*60*1e3});var ka={};x(ka,{POD_TYPE:()=>Da,deriveProjectRoot:()=>Pa,ensureProjectPod:()=>UO,formatForDisplay:()=>jO,membership:()=>vr,projectKind:()=>La});import{execFileSync as $O}from"node:child_process";import{basename as sh}from"node:path";async function UO({cwd:e,namespace:t=null}){if(!e)return null;let r=Pa(e),n=t||g.defaults.namespace,i=(r!==e?!1:va(e)===e)?r:va(e),{pod:s}=await Or({podType:Da,externalId:r,name:sh(r)||r,namespace:n,attrs:{root_path:r,git_root:i||null,display_name:sh(r)||r,discovered_at:new Date().toISOString()},startedAt:new Date});return s}function Pa(e){return va(e)||e}function va(e){try{return $O("git",["rev-parse","--show-toplevel"],{cwd:e,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}}async function GO(){try{let{getActiveCursor:e}=await Promise.resolve().then(()=>(Nn(),ui));return(await e())?.cwd||null}catch{return null}}function jO(e){let t=WO(e.attrs);return{uid:e.uid,name:e.name,rootPath:t.root_path,gitRoot:t.git_root,displayName:t.display_name,discoveredAt:t.discovered_at,memberFactCount:e.memberFactCount,memberDocCount:e.memberDocCount}}function WO(e){if(!e)return{};if(typeof e=="object")return e;try{return JSON.parse(e)}catch{return{}}}var Da,La,di=u(()=>{lt();Rn();A();Da="project",La={name:"project",description:"Code project rooted at a git repo or directory",identityField:"root_path",attrsSchema:{root_path:"string",git_root:"string",display_name:"string",discovered_at:"string"},visibility:"shared",activeMode:"multi-active",hotContextBudget:4,retrievalWeights:{recency:.6,relevance:1},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/project.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.cwd||await GO();if(!t)return[];let r=e.namespace||g.defaults.namespace,n=Pa(t),o=await Cr({podType:Da,externalId:n,namespace:r});return o?[o.uid]:[]}}});async function ah(e,t){if(!e||typeof e!="object")return[];let r=[],n=t||g.defaults.namespace;if(e.slack?.team_id&&e.connection_id){let i=await Cr({podType:"connector_workspace",externalId:`slack:${e.slack.team_id}`,namespace:n});i&&r.push({podId:i.id,role:"primary"})}if(e.github?.org&&e.connection_id){let i=await Cr({podType:"connector_workspace",externalId:`github:${e.github.org}`,namespace:n});i&&r.push({podId:i.id,role:"primary"})}let o=e.project_root||e.source_root;if(o)try{let{ensureProjectPod:i}=await Promise.resolve().then(()=>(di(),ka)),s=await i({cwd:o,namespace:n});s&&r.push({podId:s.id,role:"primary"})}catch{}return r}var ch=u(()=>{lt();Ra();A()});var Ma={};x(Ma,{ingestDocument:()=>qO});import{createHash as KO}from"node:crypto";import{join as YO}from"node:path";async function qO({content:e,title:t,sourcePath:r,sourceType:n="raw",contentType:o,namespace:i,metadata:s={},promptPath:a,categories:c,entities:l,skipFacts:d=!1,skipEntities:p=!1,skipContextualization:f=!1,classify:m=!0,podUids:w=[],resolvePodsFrom:y=null}){e=ri(e);let E=i||g.defaults.namespace,b=c||Object.keys(oi),_=a||VO,R=t||r,I=null;if(m&&(process.stderr.write(`[0/6] Classifying input...
|
|
230
|
+
`),I=await $m(e,{title:R}),process.stderr.write(` Route: ${I.route} \u2014 ${I.reasoning}
|
|
231
|
+
`),I.route==="noise"))return process.stderr.write(` Skipped \u2014 classified as noise.
|
|
232
|
+
`),{documentId:null,title:R,skipped:!0,route:"noise"};process.stderr.write(`[1/6] Checking for changes...
|
|
233
|
+
`);let S=KO("sha256").update(e).digest("hex"),q=r||`thought:${S}`,{doc:O,changed:Pe}=await As({sourcePath:q,sourceType:n,title:R,contentHash:S,namespace:E});if(!Pe)return process.stderr.write(` Skipped \u2014 content unchanged.
|
|
234
|
+
`),{documentId:O.id,title:R,skipped:!0};s&&(Object.keys(s).length||s.connection_id)&&await Ts(O.id,s,s.connection_id??null);let Ye=await XO({podUids:w,resolvePodsFrom:y,metadata:s,namespace:E});for(let{podId:U,role:Kt}of Ye)await xa(U,O.id,Kt);process.stderr.write(`[2/6] Parsing content...
|
|
235
|
+
`);let Zr=hl(e,{format:s.format,filePath:r,contentType:o});if(R=t||Zr.metadata?.title||r,I?.route==="thought"&&I.facts.length){process.stderr.write(`[thought] Storing ${I.facts.length} facts directly...
|
|
236
|
+
`);let U=await JO(I.facts,{documentId:O.id,namespace:E}),Kt={entityCount:0,relationCount:0,factEntityLinks:0,topics:[]};return!p&&U.results.length&&(Kt=await Oa({title:R,sourceType:n,metadata:s},U.results,E,l)),await To(O.id,{chunkCount:0,factCount:U.counts.added}),await uh(U.results,Ye),await ni(O.id,U.results.map(Qn=>Qn.fact?.id??Qn.existing?.id).filter(Boolean)),process.stderr.write(`Done. Route: thought, ${U.counts.total} facts (${U.counts.added} new)
|
|
237
|
+
`),{documentId:O.id,documentUid:O.uid,title:R,skipped:!1,route:"thought",chunkCount:0,facts:{...U.counts,verdicts:lh(U.results)},entities:Kt}}let j=[],pe={counts:{total:0,added:0,skipped:0,updated:0,contradicted:0},results:[]},Qr={entityCount:0,relationCount:0,factEntityLinks:0,topics:[]};try{process.stderr.write(`[3/6] Chunking and embedding...
|
|
238
|
+
`),j=wl(Zr.sections),process.stderr.write(` ${j.length} chunks created
|
|
239
|
+
`),!f&&j.length&&(j=await Ql(j,Zr.text,{title:R}));let U=j.map(Ve=>{let eo=Ve.contextualPrefix;return eo?`${eo}
|
|
240
|
+
${Ve.content}`:Ve.content}),Kt=await He(U),Qn=j.map((Ve,eo)=>({...Ve,embedding:Kt[eo]}));await ou(O.id,Qn,E),!d&&g.ingest.eagerExtract?(process.stderr.write(`[4/6] Extracting facts...
|
|
241
|
+
`),pe=await zO(j,{documentId:O.id,namespace:E,promptPath:_,categories:b})):g.ingest.eagerExtract||process.stderr.write(`[4/6] Skipping fact extraction (SIGIL_EAGER_EXTRACT=false)
|
|
242
|
+
`),await To(O.id,{chunkCount:j.length,factCount:pe.counts.added+pe.counts.updated+pe.counts.contradicted}),await uh(pe.results,Ye),await ni(O.id,pe.results.map(Ve=>Ve.fact?.id??Ve.existing?.id).filter(Boolean)),!p&&pe.results.length&&(process.stderr.write(`[5/6] Linking entities...
|
|
243
|
+
`),Qr=await Oa({title:R,sourceType:n,metadata:s},pe.results,E,l),process.stderr.write(` ${Qr.entityCount} entities, ${Qr.relationCount} relations
|
|
244
|
+
`))}catch(U){throw console.error(`[pipeline] Failed after document upsert: ${U.message}`),await bs(O.id).catch(()=>{}),U}return process.stderr.write(`Done. ${j.length} chunks, ${pe.counts.total} facts, ${Qr.entityCount} entities
|
|
245
|
+
`),{documentId:O.id,documentUid:O.uid,title:R,skipped:!1,route:I?.route??null,chunkCount:j.length,facts:{...pe.counts,verdicts:lh(pe.results)},entities:Qr}}function lh(e){return(e||[]).map(t=>({action:t.action,factId:t.fact?.id??t.existing?.id??null,content:String(t.fact?.content||t.existing?.content||"").slice(0,240),audm:t.audm||null,supersededId:t.supersededId??null,contradictedId:t.contradictedId??null}))}async function dh(e,{documentId:t,namespace:r,embeddings:n,defaultConfidence:o="medium",defaultImportance:i="supplementary"}){let s={total:e.length,added:0,skipped:0,updated:0,contradicted:0},a=[];for(let c=0;c<e.length;c++){let l=e[c],d=await da({content:l.content,category:l.category,confidence:l.confidence||o,importance:l.importance||i,namespace:r,sourceDocumentIds:t?[t]:[],sourceSection:l.sourceSection||l.category,embedding:n[c]});a.push(d);let p=d.action.toLowerCase();p==="add"?s.added++:p==="skip"?s.skipped++:p==="update"?s.updated++:p==="contradict"&&s.contradicted++}return{counts:s,results:a}}async function JO(e,{documentId:t,namespace:r}){let n=await He(e.map(o=>o.content));return dh(e,{documentId:t,namespace:r,embeddings:n,defaultConfidence:"high",defaultImportance:"vital"})}async function zO(e,{documentId:t,namespace:r,promptPath:n,categories:o}){let i=await Dm(e,{promptPath:n,categories:o});if(process.stderr.write(` ${i.length} facts extracted from ${e.length} chunks
|
|
246
|
+
`),!i.length)return{counts:{total:0,added:0,skipped:0,updated:0,contradicted:0},results:[]};let s=await He(i.map(a=>a.content));return dh(i,{documentId:t,namespace:r,embeddings:s})}async function XO({podUids:e,resolvePodsFrom:t,metadata:r,namespace:n}){let o=[];for(let s of e){let a=await Rr(s);a&&o.push({podId:a.id,role:"primary"})}if(t==="metadata"){let s=await ah(r,n);for(let a of s)o.push(a)}let i=new Map;for(let s of o){let a=i.get(s.podId);(!a||s.role==="primary"&&a.role!=="primary")&&i.set(s.podId,s)}return[...i.values()]}async function uh(e,t){if(!(!t.length||!e.length))for(let r of e){let n=r?.fact?.id??r?.existing?.id;if(!n)continue;let o=r?.action==="SKIP"?"mention":"primary";for(let{podId:i}of t)await On(i,n,o)}}var VO,Ha=u(()=>{gl();cs();rr();eu();Os();iu();Lm();Tt();ma();Um();Zm();lt();Rn();ch();ca();A();C();VO=YO(Q,"default-extraction.md")});var ut={};x(ut,{clearTraces:()=>nR,getTrace:()=>rR,listTraces:()=>tR,recordTrace:()=>eR});function QO(){let e=zi();return{deviceId:e?.device?.id??null,transport:e?.transport??null}}async function eR({kind:e,summary:t,detail:r={},namespace:n=null,durationMs:o=null}){let i=`trace-${we(16)}`,s=new Date().toISOString(),{deviceId:a,transport:c}=QO(),l=r;try{JSON.stringify(r).length>ZO&&(l={truncated:!0,note:"trace detail exceeded size cap",summary:t})}catch{l={error:"detail not serializable"}}try{K.emit("trace",{uid:i,kind:e,summary:t,namespace:n,durationMs:o,deviceId:a,transport:c,detail:l})}catch{}try{return await h("trace_event").insert({uid:i,kind:e,ts:s,duration_ms:o,namespace:n,summary:t,device_id:a,transport:c,detail:JSON.stringify(l)}),i}catch(d){return console.error("[trace-store] persist failed:",d.message),null}}async function tR({kind:e=null,namespace:t=null,before:r=null,limit:n=50}={}){let o=h("trace_event").select("uid","kind","ts","duration_ms as durationMs","namespace","summary","device_id as deviceId","transport","detail").orderBy("ts","desc").limit(Math.min(Number(n)||50,200));return e&&(o=o.where({kind:e})),t&&(o=o.where({namespace:t})),r&&(o=o.where("ts","<",r)),(await o).map(s=>({...s,detail:typeof s.detail=="string"?fh(s.detail):s.detail}))}async function rR(e){let t=await h("trace_event").select("uid","kind","ts","duration_ms as durationMs","namespace","summary","device_id as deviceId","transport","detail").where({uid:e}).first();return t?{...t,detail:typeof t.detail=="string"?fh(t.detail):t.detail}:null}async function nR(){return{cleared:await h("trace_event").del()}}function fh(e){try{return JSON.parse(e)}catch{return{}}}var ZO,dt=u(()=>{or();T();Qt();po();ZO=256*1024});var hh={};x(hh,{_reset:()=>gR,activeKinds:()=>Dn,get:()=>dR,getSchemaDoc:()=>hR,list:()=>fR,register:()=>Ba,validateAttrs:()=>mR});import{readFile as ph}from"node:fs/promises";import{fileURLToPath as oR}from"node:url";import{dirname as iR,join as mh}from"node:path";function Ba(e){for(let t of sR)if(!e[t])throw new Error(`Pod kind missing required field: ${t}`);if(e.visibility&&!aR.has(e.visibility))throw new Error(`Pod kind ${e.name}: invalid visibility ${e.visibility}`);if(e.activeMode&&!cR.has(e.activeMode))throw new Error(`Pod kind ${e.name}: invalid activeMode ${e.activeMode}`);if(e.writePolicy&&!lR.has(e.writePolicy))throw new Error(`Pod kind ${e.name}: invalid writePolicy ${e.writePolicy}`);vn.set(e.name,uR(e))}function uR(e){return{visibility:"private",activeMode:"multi-active",hotContextBudget:0,retrievalWeights:{recency:1,relevance:1},importanceDefault:2,ttlDays:null,writePolicy:"origin-only",lifecycle:{},...e}}function dR(e){return vn.get(e)||null}function fR(){return Array.from(vn.values())}async function Dn(e={}){let t=[];for(let r of vn.values())if(typeof r.resolveActiveScope=="function")try{let n=await r.resolveActiveScope(e);Array.isArray(n)&&n.length>0&&t.push({kind:r,scope:n})}catch(n){process.stderr.write(`[sigil:pods] resolveActiveScope failed for kind "${r.name}": ${n.message}
|
|
247
|
+
`),pR(r.name,n)}return t}function pR(e,t){Promise.resolve().then(()=>(dt(),ut)).then(({recordTrace:r})=>r({kind:"lifecycle",summary:`pod-resolution failed for kind "${e}"`,detail:{kind:e,error:t.message}})).catch(()=>{})}function mR(e,t={}){if(!e||!e.attrsSchema)return{valid:!0};let r=[];for(let[n,o]of Object.entries(e.attrsSchema)){let i=t[n];if(i==null)continue;let s=Array.isArray(i)?"array":typeof i;o!==s&&r.push(`attr "${n}" expected ${o}, got ${s}`)}return r.length?{valid:!1,errors:r}:{valid:!0}}async function hR(e){if(!e)return null;let t=mh(Ui,`${e.name}.md`);try{return await ph(t,"utf8")}catch{}if(!e.schemaDocPath)return null;let r=iR(oR(import.meta.url)),n=mh(r,e.schemaDocPath);try{return await ph(n,"utf8")}catch{return null}}function gR(){vn.clear()}var sR,aR,cR,lR,vn,Ln=u(()=>{C();sR=["name"],aR=new Set(["private","shared","public"]),cR=new Set(["singleton-live","multi-active","rolling-window","always"]),lR=new Set(["origin-only","shared-allowlist","open"]),vn=new Map});async function wR(e){if(e.project)return e.project;if(!e.cwd)try{let{getActiveCursor:t}=await Promise.resolve().then(()=>(Nn(),ui)),r=await t();e={...e,cwd:r?.cwd}}catch{return null}if(!e.cwd)return null;try{let{deriveProjectRoot:t}=await Promise.resolve().then(()=>(di(),ka)),r=t(e.cwd);return r?r.split("/").pop():null}catch{return null}}function ER(e){if(!e)return{};if(typeof e=="object")return e;try{return JSON.parse(e)}catch{return{}}}var yR,gh,yh=u(()=>{T();A();yR="playbook",gh={name:"playbook",description:"A reusable workflow or debug recipe (procedural memory)",identityField:"slug",attrsSchema:{slug:"string",project:"string",description:"string",tags:"array"},visibility:"shared",activeMode:"always",hotContextBudget:3,retrievalWeights:{recency:.3,relevance:1},importanceDefault:3,ttlDays:null,schemaDocPath:"kinds/playbook.schema.md",writePolicy:"origin-only",resolveActiveScope:async(e={})=>{let t=e.namespace||g.defaults.namespace,r=await wR(e);try{let o=await h("pod").where({podType:yR,namespace:t,status:"active"}).select("uid","attrs");return r?o.filter(s=>{let a=ER(s.attrs);return!a.project||a.project===r}).map(s=>s.uid):o.map(s=>s.uid)}catch{return[]}}}});var _R,wh,Eh=u(()=>{T();A();_R=["__virtual:vital__"],wh={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()=>_R,fetchFacts:async(e={},{slots:t=8,namespace:r}={})=>{let n=r||e.namespace||g.defaults.namespace;return h("fact as f").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active","f.namespace":n}).where(o=>{o.where("f.importance","vital").orWhere("f.importance_score",5)}).orderByRaw("COALESCE(fl.access_count, 0) DESC, f.created_at DESC").limit(t).pluck("f.content")}}});var Sh={};x(Sh,{registerBuiltins:()=>xh});function xh(){if(!_h){for(let e of xR)Ba(e);_h=!0}}var xR,_h,fi=u(()=>{Ln();Ca();Ra();di();yh();Eh();xR=[th,La,Qm,gh,wh],_h=!1;xh()});var Pn={};x(Pn,{factsInPodsByRecency:()=>bh,getHotFacts:()=>Ah,updateContextSnapshot:()=>bR,writeSnapshotToFile:()=>Th});async function Ah({namespace:e,limit:t=SR,ctx:r={}}={}){let n=e||g.defaults.namespace,o={...r,namespace:n};o.cwd||(o.cwd=await AR());let i=await Dn(o),s=await Promise.all(i.map(async({kind:l,scope:d})=>{try{return typeof l.fetchFacts=="function"?await l.fetchFacts(o,{slots:l.hotContextBudget,namespace:n}):await bh(d,n,l.hotContextBudget)}catch{return[]}})),a=new Set,c=[];for(let l of s)for(let d of l)if(!(!d||a.has(d))&&(a.add(d),c.push(d),c.length>=t))return c;if(c.length===0){let l=await h("fact as f").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").where({"f.status":"active","f.namespace":n}).orderByRaw("COALESCE(fl.last_accessed_at, f.created_at) DESC").limit(t).pluck("f.content");for(let d of l)if(!(!d||a.has(d))&&(a.add(d),c.push(d),c.length>=t))break}return c.slice(0,t)}async function bh(e,t,r){if(!Array.isArray(e)||e.length===0)return[];let n=e.filter(o=>typeof o=="string"&&!o.startsWith("__virtual:"));return n.length===0?[]:h("fact as f").join("pod_membership as pm",function(){this.on("pm.member_id","=","f.id").andOnVal("pm.member_type","=","fact")}).join("pod as p","p.id","pm.pod_id").leftJoin("fact_lifecycle as fl","fl.fact_id","f.id").whereIn("p.uid",n).where({"f.status":"active","f.namespace":t}).orderByRaw(`
|
|
246
248
|
COALESCE(f.importance_score, 2) DESC,
|
|
247
249
|
COALESCE(fl.last_accessed_at, f.created_at) DESC
|
|
248
|
-
`).limit(r).pluck("f.content")}async function
|
|
250
|
+
`).limit(r).pluck("f.content")}async function AR(){try{let{getActiveCursor:e}=await Promise.resolve().then(()=>(Nn(),ui));return(await e())?.cwd||null}catch{return null}}async function Th({facts:e,namespace:t}){let r=await import("node:fs/promises");if(!e||!e.length)return 0;let n="<!-- sigil-context -->",o=new Date().toISOString().slice(0,16).replace("T"," "),i=[n,`## Active Context *(${e.length} facts \xB7 refreshed ${o}${t?` \xB7 ns=${t}`:""})*`,"",e.map(c=>`- ${c}`).join(`
|
|
249
251
|
`),n].join(`
|
|
250
|
-
`),
|
|
252
|
+
`),s="";try{s=await r.readFile(to,"utf8")}catch{}let a=s.includes(n)?s.replace(new RegExp(`${n}[\\s\\S]*?${n}`),i):s+(s.trim()?`
|
|
251
253
|
|
|
252
254
|
`:"")+i+`
|
|
253
|
-
`;return await r.writeFile(
|
|
255
|
+
`;return await r.writeFile(to,a,"utf8"),e.length}async function bR({namespace:e,limit:t,ctx:r}={}){let n=await Ah({namespace:e,limit:t,ctx:r});return Th({facts:n,namespace:e})}var SR,kn=u(()=>{T();A();C();fi();Ln();SR=20});async function Oh(e){if(!e||e.length<2)return;let t=[...new Set(e.filter(i=>Number.isInteger(i)))].sort((i,s)=>i-s);if(t.length<2)return;let r=[];for(let i=0;i<t.length;i++)for(let s=i+1;s<t.length;s++)r.push([t[i],t[s]]);let n=r.map(()=>"(?, ?, 1, NOW(), NOW())").join(", "),o=r.flat();await h.raw(`
|
|
254
256
|
INSERT INTO hebbian_edge (fact_a_id, fact_b_id, strength, first_seen_at, last_seen_at)
|
|
255
257
|
VALUES ${n}
|
|
256
258
|
ON CONFLICT (fact_a_id, fact_b_id)
|
|
257
259
|
DO UPDATE SET
|
|
258
260
|
strength = hebbian_edge.strength + 1,
|
|
259
261
|
last_seen_at = NOW()
|
|
260
|
-
`,o)}var
|
|
262
|
+
`,o)}var Rh=u(()=>{T()});var Ua={};x(Ua,{consolidateEntityCoRetrievalEdges:()=>OR,getCoRetrievedEntities:()=>IR,getEdgeStrengthsForRanking:()=>$a,getEntityHebbianStats:()=>RR,strengthenEntityEdges:()=>Fa});function pi(e){return TR/Math.max(e,1)}async function Fa(e,t={}){if(!g.hebbian.entity.enabled||!e||e.length<2)return;let r=t.eta??g.hebbian.entity.eta,n=t.cap??g.hebbian.entity.cap,o=[...new Set(e.filter(c=>Number.isInteger(c)))].sort((c,l)=>c-l);if(o.length<2)return;let i=[];for(let c=0;c<o.length;c++)for(let l=c+1;l<o.length;l++)i.push([o[c],o[l]]);let s=i.map(()=>"(?, ?, ?, NOW(), NOW())").join(", "),a=i.flatMap(([c,l])=>[c,l,r]);await h.raw(`
|
|
261
263
|
INSERT INTO entity_hebbian_edge (entity_a_id, entity_b_id, strength, first_seen_at, last_seen_at)
|
|
262
|
-
VALUES ${
|
|
264
|
+
VALUES ${s}
|
|
263
265
|
ON CONFLICT (entity_a_id, entity_b_id)
|
|
264
266
|
DO UPDATE SET
|
|
265
267
|
strength = LEAST(entity_hebbian_edge.strength + ?, ?),
|
|
266
268
|
last_seen_at = NOW()
|
|
267
|
-
`,[...
|
|
269
|
+
`,[...a,r,n])}async function IR(e,t={}){if(!g.hebbian.entity.enabled)return[];let r=t.limit??10,n=t.minEffectiveStrength??g.hebbian.entity.minEffective,o=pi(t.halfLifeDays??g.hebbian.entity.halfLifeDays),{rows:i}=await h.raw(`
|
|
268
270
|
SELECT
|
|
269
271
|
CASE WHEN entity_a_id = ? THEN entity_b_id ELSE entity_a_id END AS "partnerId",
|
|
270
272
|
(strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0))::float8 AS "effectiveStrength",
|
|
@@ -274,7 +276,7 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
274
276
|
WHERE entity_a_id = ? OR entity_b_id = ?
|
|
275
277
|
ORDER BY "effectiveStrength" DESC
|
|
276
278
|
LIMIT ?
|
|
277
|
-
`,[e,o,e,e,r*3]);return i.filter(
|
|
279
|
+
`,[e,o,e,e,r*3]);return i.filter(s=>s.effectiveStrength>=n).slice(0,r)}async function $a(e,t,r={}){if(!g.hebbian.entity.enabled)return new Map;if(!e.length||!t.length)return new Map;let n=pi(r.halfLifeDays??g.hebbian.entity.halfLifeDays),o=[...new Set(e)],i=[...new Set(t)].filter(c=>!o.includes(c));if(!i.length)return new Map;let{rows:s}=await h.raw(`
|
|
278
280
|
SELECT
|
|
279
281
|
CASE
|
|
280
282
|
WHEN entity_a_id = ANY(?::bigint[]) THEN entity_b_id
|
|
@@ -287,18 +289,18 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
287
289
|
OR
|
|
288
290
|
(entity_b_id = ANY(?::bigint[]) AND entity_a_id = ANY(?::bigint[]))
|
|
289
291
|
GROUP BY "candidateId"
|
|
290
|
-
`,[o,n,o,i,o,i]),
|
|
292
|
+
`,[o,n,o,i,o,i]),a=new Map;for(let c of s)a.set(Number(c.candidateId),c.summedStrength);return a}async function OR({floor:e=.5,decayDays:t=90}={}){let r=pi(g.hebbian.entity.halfLifeDays),{rows:n}=await h.raw(`
|
|
291
293
|
DELETE FROM entity_hebbian_edge
|
|
292
294
|
WHERE (strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0)) <= ?
|
|
293
295
|
AND last_seen_at < NOW() - (INTERVAL '1 day' * ?)
|
|
294
296
|
RETURNING entity_a_id
|
|
295
|
-
`,[r,e,t]);return n.length}async function
|
|
297
|
+
`,[r,e,t]);return n.length}async function RR({topN:e=5}={}){let t=pi(g.hebbian.entity.halfLifeDays),r=await h.raw(`
|
|
296
298
|
SELECT
|
|
297
299
|
COUNT(*)::int AS "edgeCount",
|
|
298
300
|
COALESCE(AVG(strength)::float8, 0) AS "avgStrength",
|
|
299
301
|
COALESCE(MAX(strength)::float8, 0) AS "maxStrength"
|
|
300
302
|
FROM entity_hebbian_edge
|
|
301
|
-
`),n=await
|
|
303
|
+
`),n=await h.raw(`
|
|
302
304
|
SELECT
|
|
303
305
|
ea.name AS "aName",
|
|
304
306
|
eb.name AS "bName",
|
|
@@ -309,11 +311,11 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
309
311
|
JOIN entity eb ON eb.id = entity_b_id
|
|
310
312
|
ORDER BY "decayed" DESC
|
|
311
313
|
LIMIT ?
|
|
312
|
-
`,[t,e]);return{edgeCount:r.rows[0]?.edgeCount??0,avgStrength:r.rows[0]?.avgStrength??0,maxStrength:r.rows[0]?.maxStrength??0,topPairs:n.rows??[]}}var
|
|
314
|
+
`,[t,e]);return{edgeCount:r.rows[0]?.edgeCount??0,avgStrength:r.rows[0]?.avgStrength??0,maxStrength:r.rows[0]?.maxStrength??0,topPairs:n.rows??[]}}var TR,mi=u(()=>{T();A();TR=Math.log(2)});function hi({minConfidence:e="medium",pointInTime:t,categories:r}){let n=CR[e]??1,o=[n],i="",s="";return t&&(i="AND valid_from <= ? AND (valid_until IS NULL OR valid_until > ?)",o.push(t,t)),r?.length&&(s="AND category = ANY(?)",o.push(r)),{minRank:n,temporalClause:i,categoryClause:s,filterParams:o}}var CR,Mn,gi=u(()=>{CR={low:0,medium:1,high:2},Mn=`CASE confidence
|
|
313
315
|
WHEN 'high' THEN 2
|
|
314
316
|
WHEN 'medium' THEN 1
|
|
315
317
|
ELSE 0
|
|
316
|
-
END`});async function
|
|
318
|
+
END`});async function Ch(e,{namespaces:t,limit:r=20}){let n=G(e),o=`${Re("embedding")} <=> ${Ce()}`,{rows:i}=await h.raw(`
|
|
317
319
|
SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
|
|
318
320
|
content, section_heading AS "sectionHeading", namespace,
|
|
319
321
|
1 - (${o}) as similarity
|
|
@@ -322,7 +324,7 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
322
324
|
AND embedding IS NOT NULL
|
|
323
325
|
ORDER BY ${o}
|
|
324
326
|
LIMIT ?
|
|
325
|
-
`,[n,t,n,r]);return i}var
|
|
327
|
+
`,[n,t,n,r]);return i}var Nh=u(()=>{T();Ze();A();gi()});async function vh(e,{namespaces:t,limit:r=20}){let{rows:n}=await h.raw(`
|
|
326
328
|
SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
|
|
327
329
|
content, section_heading AS "sectionHeading", namespace,
|
|
328
330
|
ts_rank(search_vector, plainto_tsquery('english', ?)) as rank
|
|
@@ -331,10 +333,10 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
331
333
|
AND search_vector @@ plainto_tsquery('english', ?)
|
|
332
334
|
ORDER BY rank DESC
|
|
333
335
|
LIMIT ?
|
|
334
|
-
`,[e,t,e,r]);return n}var
|
|
336
|
+
`,[e,t,e,r]);return n}var Dh=u(()=>{T();gi()});async function Ph(e,t,{namespaces:r,limit:n=5,minConfidence:o="medium",pointInTime:i,categories:s,podIds:a=null}){let c=G(t),l=`${Re("embedding")} <=> ${Ce()}`,{temporalClause:d,categoryClause:p,filterParams:f}=hi({minConfidence:o,pointInTime:i,categories:s}),m=n*PR,w=Array.isArray(a),y=w&&a.length===0,E=w?y?"AND FALSE":`AND id = ANY(
|
|
335
337
|
SELECT member_id FROM pod_membership
|
|
336
338
|
WHERE member_type = 'fact' AND pod_id = ANY(?::int[])
|
|
337
|
-
)`:"",
|
|
339
|
+
)`:"",b=w&&!y?[a]:[],[_,...R]=f,I=[c,c,r,_,...R,...b,c,m],S=[e,e,r,_,e,...R,...b,m],q=[m,m,n],O=`
|
|
338
340
|
WITH semantic AS (
|
|
339
341
|
SELECT id,
|
|
340
342
|
uid,
|
|
@@ -350,7 +352,7 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
350
352
|
WHERE namespace = ANY(?)
|
|
351
353
|
AND status = 'active'
|
|
352
354
|
AND embedding IS NOT NULL
|
|
353
|
-
AND ${
|
|
355
|
+
AND ${Mn} >= ?
|
|
354
356
|
${d}
|
|
355
357
|
${p}
|
|
356
358
|
${E}
|
|
@@ -371,7 +373,7 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
371
373
|
FROM fact
|
|
372
374
|
WHERE namespace = ANY(?)
|
|
373
375
|
AND status = 'active'
|
|
374
|
-
AND ${
|
|
376
|
+
AND ${Mn} >= ?
|
|
375
377
|
AND search_vector @@ plainto_tsquery('english', ?)
|
|
376
378
|
${d}
|
|
377
379
|
${p}
|
|
@@ -395,8 +397,8 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
395
397
|
COALESCE(s.created_at, k.created_at) AS created_at,
|
|
396
398
|
COALESCE(s.similarity, 0) AS similarity,
|
|
397
399
|
(
|
|
398
|
-
${
|
|
399
|
-
+ ${
|
|
400
|
+
${DR} * (1.0 / (${Lh} + COALESCE(s.rank_ix, ?)))
|
|
401
|
+
+ ${LR} * (1.0 / (${Lh} + COALESCE(k.rank_ix, ?)))
|
|
400
402
|
) AS rrf_raw
|
|
401
403
|
FROM semantic s
|
|
402
404
|
FULL OUTER JOIN keyword k ON s.id = k.id
|
|
@@ -416,11 +418,11 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
416
418
|
)
|
|
417
419
|
)
|
|
418
420
|
)) AS activation,
|
|
419
|
-
CASE f.importance WHEN 'vital' THEN ${
|
|
421
|
+
CASE f.importance WHEN 'vital' THEN ${kR} ELSE 1.0 END AS importance_mult,
|
|
420
422
|
CASE f.confidence
|
|
421
|
-
WHEN 'high' THEN ${
|
|
422
|
-
WHEN 'medium' THEN ${
|
|
423
|
-
WHEN 'low' THEN ${
|
|
423
|
+
WHEN 'high' THEN ${MR}
|
|
424
|
+
WHEN 'medium' THEN ${HR}
|
|
425
|
+
WHEN 'low' THEN ${BR}
|
|
424
426
|
ELSE 1.0
|
|
425
427
|
END AS confidence_mult
|
|
426
428
|
FROM fused f
|
|
@@ -437,7 +439,7 @@ ${xe.content}`:xe.content}),rt=await he(F),Pr=B.map((xe,Mr)=>({...xe,embedding:r
|
|
|
437
439
|
ORDER BY final_score DESC,
|
|
438
440
|
CASE WHEN importance = 'vital' THEN 0 ELSE 1 END
|
|
439
441
|
LIMIT ?
|
|
440
|
-
`,
|
|
442
|
+
`,Pe=[...I,...S,...q],{rows:Ye}=await h.raw(O,Pe);if(!Ye.length)return[];let Zr=Ye[0].final_score||Ye[0].rrf_raw||1;return Ye.map(j=>({...j,rrfScore:Math.round(Number(j.final_score||j.rrf_raw)/Number(Zr)*100)/100}))}var Lh,DR,LR,PR,kR,MR,HR,BR,kh=u(()=>{T();Ze();A();gi();Lh=20,DR=1,LR=.7,PR=3,kR=1.5,MR=1,HR=.85,BR=.7});async function Mh(e){let t=e.map(o=>o.id),r=await Dr(t),n=new Set;for(let o of r.values())for(let i of o)n.add(i);return n.size?h("entity").whereIn("id",[...n]).whereNull("mergedWith").select("id","uid","name","entityType","description"):[]}async function Hh(e,{limit:t=10}={}){if(!e.length)return[];let r=await h("relation").where(function(){this.whereIn("sourceId",e).orWhereIn("targetId",e)}).whereNull("invalidAt").select("*").limit(t*3),n=new Set(e),o=new Set,i=new Map;for(let p of r){let f=n.has(p.sourceId)?p.targetId:p.sourceId;o.add(f),i.has(f)||i.set(f,p)}if(!o.size)return[];let s=await h("entity").whereIn("id",[...o]).whereNull("mergedWith").select("id","name"),a=new Map(s.map(p=>[p.id,p.name])),c=await h("fact").join("fact_entity","fact.id","fact_entity.factId").whereIn("fact_entity.entityId",[...o]).where("fact.status","active").select("fact.*","fact_entity.entityId").orderBy("fact_entity.mentionCount","desc").limit(t*3),l=new Set,d=[];for(let p of c){if(l.has(p.id))continue;l.add(p.id);let f=i.get(p.entityId),m=a.get(p.entityId)||"unknown",w=f?.relationType||"related";if(d.push({...p,relationPath:`${m} (${w})`,graphDistance:1}),d.length>=t)break}return d}function Bh(e,t,r,n){let o=new Set(r),i=e.map(a=>({...a,resultType:"direct"})),s=t.filter(a=>!e.some(c=>c.id===a.id)).map(a=>({...a,rrfScore:(a.rrfScore||.1)*.5,resultType:"related"}));return[...i,...s].slice(0,n)}var Fh=u(()=>{T();vt()});var Pr,Ga=u(()=>{Pr=class{#e=new Map;#t;#r;constructor({maxSize:t=100,ttlMs:r=300*1e3}={}){this.#t=t,this.#r=r}get(t){let r=this.#e.get(t);if(r){if(Date.now()-r.timestamp>this.#r){this.#e.delete(t);return}return r.value}}set(t,r){if(this.#e.size>=this.#t){let n=this.#e.keys().next().value;this.#e.delete(n)}this.#e.set(t,{value:r,timestamp:Date.now()})}}});async function Uh(e){let t=$h.get(e);if(t)return t;let r=`You are a search query expander for a personal knowledge base.
|
|
441
443
|
|
|
442
444
|
Given the user's query, generate 3-5 alternative search queries that would help find ALL relevant information \u2014 including facts that don't literally match the query but are semantically related.
|
|
443
445
|
|
|
@@ -449,7 +451,7 @@ Think about:
|
|
|
449
451
|
|
|
450
452
|
User query: "${e}"
|
|
451
453
|
|
|
452
|
-
Respond with ONLY a JSON array of strings. Do not include the original query.`;try{let n=await
|
|
454
|
+
Respond with ONLY a JSON array of strings. Do not include the original query.`;try{let n=await ge(r,{model:g.llm.extractionModel,caller:"query-expander"});if(!Array.isArray(n))return[e];let o=n.filter(s=>typeof s=="string"&&s.trim()).slice(0,FR),i=o.length?[e,...o]:[e];return $h.set(e,i),i}catch(n){return console.error("[query-expander] Failed:",n.message),[e]}}var FR,$h,Gh=u(()=>{ye();Ga();A();FR=5,$h=new Pr({maxSize:100,ttlMs:300*1e3})});import{readFile as $R}from"node:fs/promises";import{join as UR}from"node:path";async function Kh(e){let t=e.trim().toLowerCase(),r=ja.get(t);if(r)return r;let o=`${await $R(GR,"utf8")}
|
|
453
455
|
|
|
454
456
|
---
|
|
455
457
|
|
|
@@ -457,7 +459,7 @@ Query: ${e}
|
|
|
457
459
|
|
|
458
460
|
---
|
|
459
461
|
|
|
460
|
-
Respond with ONLY a JSON object: { "intent": "preference|factual|entity_lookup|exploratory|temporal", "categories": [...], "entities": [...], "expand": bool, "pointInTime": null or "YYYY-MM-DD", "reasoning": "..." }`;try{let i=await
|
|
462
|
+
Respond with ONLY a JSON object: { "intent": "preference|factual|entity_lookup|exploratory|temporal", "categories": [...], "entities": [...], "expand": bool, "pointInTime": null or "YYYY-MM-DD", "reasoning": "..." }`;try{let i=await ge(o,{model:g.llm.extractionModel,caller:"query-router"});if(!i||!jR.includes(i.intent)){let c=jh("factual",{});return ja.set(t,c),c}let s=Wh[i.intent],a={intent:i.intent,categories:Array.isArray(i.categories)&&i.categories.length?i.categories:s.categories,entities:Array.isArray(i.entities)?i.entities:[],expand:typeof i.expand=="boolean"?i.expand:s.expand,useGraph:s.useGraph,limit:s.limit,pointInTime:i.pointInTime||null,reasoning:i.reasoning||""};return ja.set(t,a),a}catch(i){return console.error("[query-router] Failed:",i.message),jh("factual",{reasoning:`Fallback \u2014 ${i.message}`})}}function jh(e,t={}){let r=Wh[e];return{intent:e,categories:r.categories,entities:[],expand:r.expand,useGraph:r.useGraph,limit:r.limit,pointInTime:null,reasoning:"",...t}}var GR,ja,jR,Wh,Yh=u(()=>{ye();Ga();A();C();GR=UR(Q,"query-router.md"),ja=new Pr({maxSize:200,ttlMs:600*1e3}),jR=["preference","factual","entity_lookup","exploratory","temporal"],Wh={preference:{categories:["preference","opinion","personal"],expand:!1,useGraph:!1,limit:null},factual:{categories:[],expand:!1,useGraph:!1,limit:null},entity_lookup:{categories:[],expand:!1,useGraph:!0,limit:null},exploratory:{categories:[],expand:!0,useGraph:!0,limit:15},temporal:{categories:[],expand:!1,useGraph:!1,limit:null}}});var zh={};x(zh,{isSearchableQuery:()=>Vh,search:()=>VR});async function VR(e,{namespaces:t,limit:r=5,minConfidence:n="medium",useGraph:o=!1,includeChunks:i=!1,pointInTime:s,expand:a=!1,route:c=!0,categories:l,synthesize:d=g.search.synthesize,podScope:p=null,applyFloor:f=!0,ctx:m={}}={}){let w=Date.now();if(!Vh(e)){let S=JR();return S._trace={query:e,searchable:!1,stages:[{stage:"guard",note:"query is not searchable (empty or wildcard-only)"}],durationMs:Date.now()-w},S}d&&(i=!0);let y=null;c&&(y=await Kh(e),o=o||y.useGraph,a=a||y.expand,r=y.limit||r,s=s||y.pointInTime,l=l||(y.categories.length?y.categories:void 0));let E=await QR(e,t),b=await ZR(p,{...m,namespace:t?.[0]}),_;E?_=await eC(E,e,{namespaces:t,limit:r,minConfidence:n,includeChunks:i,pointInTime:s,categories:l,podIds:b}):_=await nC(e,{namespaces:t,limit:r,minConfidence:n,useGraph:o,includeChunks:i,pointInTime:s,expand:a,categories:l,podIds:b});let R=null;if(f&&Array.isArray(_.facts)&&_.facts.length){let S=g.memory.injectionFloor,q=_.facts.length;_.facts=_.facts.filter(O=>{if(O.source==="entity")return!0;let Pe=Number(O.similarity);return Number.isFinite(Pe)?Pe>=S:!0}),R={threshold:S,dropped:q-_.facts.length,kept:_.facts.length}}let I=_.facts.map(S=>S.id).filter(Boolean);if(pa(I).catch(S=>console.error("[access-tracking]",S.message)),Oh(I.slice(0,8)).catch(S=>console.error("[hebbian]",S.message)),g.hebbian.entity.enabled&&I.length>=2&&XR(I).catch(S=>console.error("[hebbian-entity]",S.message)),d)try{_.synthesized=await zR(e,_)}catch(S){console.error("[synthesizer] failed:",S.message),_.synthesized=null}return _._trace=qR({query:e,namespaces:t,limit:r,minConfidence:n,useGraph:o,expand:a,route:c,routing:y,matchedEntity:E,podScope:p,podIds:b,result:_,factIds:I,floored:R,durationMs:Date.now()-w}),_}function qR({query:e,namespaces:t,limit:r,minConfidence:n,useGraph:o,expand:i,route:s,routing:a,matchedEntity:c,podScope:l,podIds:d,result:p,factIds:f,floored:m,durationMs:w}){let y=_=>{let R=Number(_);return Number.isFinite(R)?Math.round(R*1e4)/1e4:null},E=(p.facts||[]).map((_,R)=>({rank:R+1,id:_.id??null,content:String(_.content||"").slice(0,240),category:_.category??null,importance:_.importance??null,confidence:_.confidence??null,source:_.source??null,similarity:y(_.similarity),rrfRaw:y(_.rrf_raw),activation:y(_.activation),accessCount:_.access_count??null,lastAccessedAt:_.lastAccessedAt??null,finalScore:y(_.final_score),rrfScore:y(_.rrfScore),coRetrievalBoost:y(_.coRetrievalBoost)})),b=(p.chunks||[]).map((_,R)=>({rank:R+1,id:_.id??null,sectionHeading:_.sectionHeading??null,content:String(_.content||"").slice(0,200),similarity:y(_.similarity),rrfScore:y(_.rrfScore)}));return{query:e,namespaces:t,durationMs:w,params:{limit:r,minConfidence:n,useGraphRequested:o,expandRequested:i,routeEnabled:s},routing:a?{intent:a.intent??null,reasoning:a.reasoning??null,useGraph:a.useGraph??null,expand:a.expand??null,limit:a.limit??null,categories:a.categories??null,pointInTime:a.pointInTime??null}:null,strategy:c?"entity-first":"standard",matchedEntity:c?{id:c.id,name:c.name,type:c.entityType,aliases:c.aliases||[]}:null,podScope:{requested:l,resolvedIds:d},floor:m?{applied:!0,threshold:m.threshold,dropped:m.dropped,kept:m.kept,note:"precision-first: facts below cosine floor dropped from injection"}:{applied:!1},ranking:{model:"RRF(vector\xD71.0 + keyword\xD70.7) \xD7 softplus(ACT-R activation) \xD7 importance \xD7 confidence",facts:E,chunks:b},synthesized:p.synthesized||null,relatedEntities:p.relatedEntities||[],reinforced:{factIds:f,note:"access_count bumped + Hebbian co-retrieval edges strengthened (off hot path)"}}}function Vh(e){let t=String(e||"").trim();return t?!/^[*%_?\s]+$/.test(t):!1}function JR(){return{facts:[],chunks:[],matchedEntity:null,relatedEntities:[]}}async function zR(e,{facts:t,chunks:r}){let n=[];if(t.slice(0,10).forEach((s,a)=>{n.push(`[F${a+1}] (${s.category}) ${s.content}`)}),r.length&&r.slice(0,15).forEach((s,a)=>{let c=(s.content||"").replace(/\s+/g," ").trim();c&&n.push(`[C${a+1}] ${c.slice(0,2e3)}`)}),!n.length)return"No retrieved evidence \u2014 nothing to synthesize.";let o=`You are answering a question from a personal-memory system.
|
|
461
463
|
Each retrieved item is labeled [F#] (a stored fact) or [C#] (a raw conversation chunk
|
|
462
464
|
that may include user/assistant turns and dates).
|
|
463
465
|
|
|
@@ -472,14 +474,14 @@ Instructions:
|
|
|
472
474
|
- Reason step-by-step internally for temporal questions ("first", "before", "after", "how many days") \u2014 compare the dates explicitly.
|
|
473
475
|
- Cite items in square brackets where they directly support the answer, e.g. [C2].
|
|
474
476
|
- Only respond "Not in retrieved memory." if you genuinely cannot find the information after carefully reading every chunk. Prefer a careful answer with citation over refusal.
|
|
475
|
-
- Plain text only, no headers. Direct answer first, then a short justification if needed. 1-4 sentences total.`,i=g.search.synthesizeModel||g.llm.extractionModel||void 0;return
|
|
477
|
+
- Plain text only, no headers. Direct answer first, then a short justification if needed. 1-4 sentences total.`,i=g.search.synthesizeModel||g.llm.extractionModel||void 0;return Be(o,{model:i,caller:"synthesizer"})}async function XR(e){let t=await Dr(e.slice(0,8)),r=[];for(let o of t.values())for(let i of o)r.push(i);let n=[...new Set(r)].slice(0,g.hebbian.entity.maxWriteEntities);await Fa(n)}async function ZR(e,t={}){if(e==null||e==="global")return null;if(e==="auto"){let n=(await Dn(t)).flatMap(i=>i.scope).filter(i=>typeof i=="string"&&!i.startsWith("__virtual:"));if(n.length===0){if(process.env.SIGIL_SCOPE_GRACE!=="false"){let i=h("pod");t.namespace&&(i=i.where({namespace:t.namespace}));let[{count:s}]=await i.count({count:"*"});if(Number(s)===0)return null}return[]}return(await h("pod").whereIn("uid",n).select("id")).map(i=>i.id)}if(Array.isArray(e)){if(e.length===0)return[];if(e.every(o=>typeof o=="number"))return e;let r=e.filter(o=>typeof o=="string");return r.length===0?[]:(await h("pod").where(function(){this.whereIn("uid",r).orWhereIn("name",r)}).select("id")).map(o=>o.id)}return null}async function QR(e,t){if(e.length<2||e.length>YR)return null;let r=t[0]||g.defaults.namespace,n=await It(e,r);return n||(await ya(e,{namespace:r,limit:1}))[0]||null}async function eC(e,t,{namespaces:r,limit:n,minConfidence:o,includeChunks:i,pointInTime:s,categories:a,podIds:c}){let l=tC(t,e),d=await He(l,{inputType:"query"}),[p,f,...m]=await Promise.all([Sa(e.id,{limit:n}),Tn(e.id,{limit:15}),...l.map((S,q)=>Jh(S,{queryEmbedding:d[q],namespaces:r,limit:n,minConfidence:o,includeChunks:i,pointInTime:s,categories:a,podIds:c}))]),w=p.map(S=>({...S,source:"entity"})),y=yi(m.map(S=>S.facts),n*2),E=new Set(w.map(S=>S.id)),b=y.filter(S=>!E.has(S.id)).map(S=>({...S,source:"search"})),_=[...w,...b].slice(0,n);if(g.hebbian.entity.enabled&&_.length>=2)try{_=await qh(_,{seedEntityIds:[e.id]})}catch(S){console.error("[hebbian-entity-boost]",S.message)}let R=i?yi(m.map(S=>S.chunks||[]),n):[],I=f.map(S=>({id:S.entityId,name:S.name,type:S.entityType,relation:S.relationType,direction:S.direction,mentions:S.mentionCount}));return{facts:_,chunks:R,matchedEntity:{id:e.id,name:e.name,type:e.entityType,mentions:e.mentionCount,description:e.description||null,aliases:e.aliases||[]},relatedEntities:I}}function tC(e,t){let r=[e],n=(t.aliases||[]).filter(s=>typeof s=="string"&&s.trim());if(!n.length)return r;let o=(t.name||"").trim(),i=new Set([e.toLowerCase()]);for(let s of n){let a=e;if(o){let c=new RegExp(`\\b${rC(o)}\\b`,"gi");if(c.test(a))a=a.replace(c,s);else{i.has(s.toLowerCase())||(r.push(s),i.add(s.toLowerCase()));continue}}i.has(a.toLowerCase())||(r.push(a),i.add(a.toLowerCase()))}return r}function rC(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}async function nC(e,{namespaces:t,limit:r,minConfidence:n,useGraph:o,includeChunks:i,pointInTime:s,expand:a=!1,categories:c,podIds:l}){let d=a?await Uh(e):[e],p=await He(d,{inputType:"query"}),f=await Promise.all(d.map((y,E)=>Jh(y,{queryEmbedding:p[E],namespaces:t,limit:r,minConfidence:n,includeChunks:i,pointInTime:s,categories:c,podIds:l}))),m=yi(f.map(y=>y.facts),r);if(m=m.map(y=>({...y,source:"search"})),g.hebbian.entity.enabled&&m.length>=2)try{m=await qh(m)}catch(y){console.error("[hebbian-entity-boost]",y.message)}if(o&&m.length)try{let y=await Mh(m.slice(0,5));if(y.length){let E=await oC(y.map(_=>_.id)),b=await Hh(E,{limit:5});m=Bh(m,b,E,r)}}catch(y){console.error("[graph-enhancement] Failed:",y.message)}let w=i?yi(f.map(y=>y.chunks),r):[];return{facts:m,chunks:w,matchedEntity:null,relatedEntities:[]}}async function qh(e,t={}){let r=e.map(f=>f.id).filter(Boolean);if(r.length<2)return e;let n=await Dr(r);if(!n.size)return e;let o,i;if(t.seedEntityIds?.length)o=t.seedEntityIds,i=e;else{let f=t.seedFactCount??3,m=[];for(let w of e.slice(0,f)){let y=n.get(w.id)||[];for(let E of y)m.push(E)}o=m,i=e.slice(f)}if(!o.length)return e;let s=new Set;for(let f of i){let m=n.get(f.id)||[];for(let w of m)s.add(w)}if(!s.size)return e;let a=await $a([...new Set(o)],[...s]);if(!a.size)return e;let c=new Map,l=0;for(let f of e){let m=n.get(f.id)||[],w=0;for(let y of m){let E=a.get(y)||0;E>w&&(w=E)}c.set(f.id,w),w>l&&(l=w)}if(l===0)return e;let d=g.hebbian.entity.rrfWeight;return e.map(f=>{let m=(c.get(f.id)||0)/l,w=(f.rrfScore||0)+d*m;return{...f,rrfScore:Math.round(w*100)/100,coRetrievalBoost:Math.round(m*100)/100}}).sort((f,m)=>(m.rrfScore||0)-(f.rrfScore||0))}async function oC(e){let t=g.hebbian.entity.expandPerSeed;if(!t||!e.length)return e;let{getCoRetrievedEntities:r}=await Promise.resolve().then(()=>(mi(),Ua)),n=await Promise.all(e.map(i=>r(i,{limit:t}).catch(()=>[]))),o=new Set(e);for(let i of n)for(let s of i)o.add(Number(s.partnerId));return[...o]}function yi(e,t){let r={},n={};for(let s of e)for(let[a,c]of s.entries())n[c.id]=c,r[c.id]=(r[c.id]||0)+1/(Wa+a+1);let o=Object.entries(r).sort(([,s],[,a])=>a-s),i=o.length?o[0][1]:1;return o.slice(0,t).map(([s,a])=>({...n[s],rrfScore:Math.round(a/i*100)/100}))}async function Jh(e,{queryEmbedding:t,namespaces:r,limit:n,minConfidence:o,includeChunks:i=!1,pointInTime:s,categories:a,podIds:c}){let l=t||await xt(e,{inputType:"query"}),d=Ph(e,l,{namespaces:r,limit:n,minConfidence:o,pointInTime:s,categories:a,podIds:c}),p=i?[Ch(l,{namespaces:r,limit:n}),vh(e,{namespaces:r,limit:n})]:[],[f,...m]=await Promise.all([d,...p]),w=i&&m.length===2?iC(m[0],m[1],n):[];return{facts:f,chunks:w}}function iC(e,t,r){let n={},o={...hs(e,"id"),...hs(t,"id")};e.forEach((a,c)=>{n[a.id]=(n[a.id]||0)+WR/(Wa+c+1)}),t.forEach((a,c)=>{n[a.id]=(n[a.id]||0)+KR/(Wa+c+1)});let i=Object.entries(n).sort(([a,c],[l,d])=>{if(c!==d)return d-c;let p=o[a]?.importance==="vital"?1:0;return(o[l]?.importance==="vital"?1:0)-p}),s=i.length?i[0][1]:1;return i.slice(0,r).map(([a,c])=>({...o[a],rrfScore:Math.round(c/s*100)/100}))}var Wa,WR,KR,YR,Xh=u(()=>{_o();rr();A();ve();vt();Tt();Rh();mi();Ct();vt();Nh();Dh();kh();Fh();Gh();Yh();ye();fi();Ln();T();Wa=20,WR=1,KR=.7,YR=60});var rg={};x(rg,{findEntitiesByType:()=>uC,findPath:()=>lC,findRelated:()=>tg,getEntityNeighborhood:()=>cC});async function tg(e,{maxDepth:t=2,relationType:r,limit:n=30}={}){let o=Math.min(Math.max(t,1),6),i=[e,e],s=r?"AND r.relation_type = ?":"";r&&i.push(r);let a=r?"AND r.relation_type = ?":"";r&&i.push(r),i.push(o,n);let{rows:c}=await h.raw(`
|
|
476
478
|
WITH RECURSIVE graph AS (
|
|
477
479
|
SELECT r.target_id AS entity_id, r.relation_type, r.mention_count,
|
|
478
480
|
1 AS depth, ARRAY[?::integer] AS path
|
|
479
481
|
FROM relation r
|
|
480
482
|
WHERE r.source_id = ?
|
|
481
483
|
AND r.invalid_at IS NULL
|
|
482
|
-
${
|
|
484
|
+
${s}
|
|
483
485
|
|
|
484
486
|
UNION ALL
|
|
485
487
|
|
|
@@ -490,7 +492,7 @@ Instructions:
|
|
|
490
492
|
WHERE g.depth < ?
|
|
491
493
|
AND r.invalid_at IS NULL
|
|
492
494
|
AND NOT (r.target_id = ANY(g.path))
|
|
493
|
-
${
|
|
495
|
+
${a}
|
|
494
496
|
)
|
|
495
497
|
SELECT DISTINCT ON (g.entity_id)
|
|
496
498
|
g.entity_id AS "entityId", g.relation_type AS "relationType",
|
|
@@ -501,7 +503,7 @@ Instructions:
|
|
|
501
503
|
WHERE e.merged_with IS NULL
|
|
502
504
|
ORDER BY g.entity_id, g.depth ASC
|
|
503
505
|
LIMIT ?
|
|
504
|
-
`,i);return c}async function
|
|
506
|
+
`,i);return c}async function cC(e,{depth:t=1,limit:r=50}={}){let n=await Ae(e);if(!n)return null;if(t>1){let i=await tg(e,{maxDepth:t,limit:r});return{entity:n,related:i}}let o=await Tn(e,{limit:r});return{entity:n,relations:o}}async function lC(e,t,{maxDepth:r=4}={}){let n=Math.min(Math.max(r,1),6),{rows:o}=await h.raw(`
|
|
505
507
|
WITH RECURSIVE search AS (
|
|
506
508
|
SELECT r.target_id AS current_id,
|
|
507
509
|
ARRAY[r.source_id, r.target_id] AS path,
|
|
@@ -528,7 +530,7 @@ Instructions:
|
|
|
528
530
|
WHERE current_id = ?
|
|
529
531
|
ORDER BY depth ASC
|
|
530
532
|
LIMIT 1
|
|
531
|
-
`,[e,n,t]);if(!o.length)return null;let{path:i,relationTypes:a,depth:s}=o[0],c=await m("entity").whereIn("id",i).select("id","uid","name","entityType","description"),l=Object.fromEntries(c.map(p=>[p.id,p]));return{path:i.map(p=>l[p]),relationTypes:a,depth:s}}async function oI(e,{namespace:t,sortBy:r="mentionCount",limit:n=50}={}){let o=m("entity").where({entityType:e}).whereNull("mergedWith").orderBy(r,"desc").limit(n);return t&&o.where({namespace:t}),o}var $p=u(()=>{A();fe();Xe()});import{readFile as aI,stat as J$}from"node:fs/promises";import{basename as sI,extname as cI,resolve as lI}from"node:path";async function Wp(e){let t=lI(e),r=await aI(t,"utf8"),n=sI(t),o=cI(t).toLowerCase();return{content:r,title:n,sourcePath:t,sourceType:"file",contentType:uI(o),metadata:{filePath:t,fileName:n,extension:o}}}function uI(e){return{".md":"text/markdown",".mdx":"text/markdown",".txt":"text/plain",".html":"text/html",".htm":"text/html",".json":"application/json",".js":"text/javascript",".ts":"text/javascript",".py":"text/x-python"}[e]||"text/plain"}var Yp=u(()=>{});async function Kp(e){let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch ${e}: ${t.status} ${t.statusText}`);let r=await t.text(),n=t.headers.get("content-type")||"text/plain",o=dI(e);return{content:r,title:o,sourcePath:e,sourceType:"url",contentType:n,metadata:{url:e,fetchedAt:new Date().toISOString()}}}function dI(e){try{let t=new URL(e),n=t.pathname.replace(/\/$/,"").split("/").pop()||t.hostname;return decodeURIComponent(n)}catch{return e}}var qp=u(()=>{});var Vp={};b(Vp,{resolveSource:()=>pI});import{resolve as fI}from"node:path";async function pI({content:e,url:t,filePath:r,title:n,sourceType:o,sourcePath:i,metadata:a}){if(t)return Kp(t);if(r){let s=fI(r),c=process.cwd();if(!s.startsWith(c))throw new Error(`Path traversal denied: ${r} resolves outside working directory`);return Wp(s)}return e?{content:e,title:n||"Untitled",sourcePath:i||`raw/${Date.now()}`,sourceType:o||"raw",contentType:"text/plain",metadata:a||{}}:null}var zp=u(()=>{Yp();qp()});import{existsSync as mI}from"node:fs";import{readFile as hI,writeFile as gI,chmod as yI,mkdir as wI}from"node:fs/promises";import{randomBytes as EI}from"node:crypto";import{dirname as _I}from"node:path";async function Qp(){if(Ut)return Ut;if(mI(Ge)){let t=(await hI(Ge,"utf8")).trim();if(!/^[0-9a-fA-F]{64}$/.test(t))throw new Error(`identity: ${Ge} is malformed (expected 64 hex chars). Refusing to overwrite \u2014 move or delete the file manually to regenerate.`);return Ut=Array.from(Buffer.from(t,"hex")),Ut}await wI(_I(Ge),{recursive:!0});let e=EI(xI);await gI(Ge,e.toString("hex"),"utf8");try{await yI(Ge,384)}catch{}return Ut=Array.from(e),Ut}var xI,Ut,em=u(()=>{L();xI=32,Ut=null});var $e={};b($e,{dial:()=>zi,getEndpoint:()=>rm,getNodeAddr:()=>AI,getNodeInfo:()=>II,registerProtocol:()=>SI,shutdownEndpoint:()=>vI});import{mkdir as bI}from"node:fs/promises";function SI(e,t){if(Fe||Gt)throw new Error(`registerProtocol("${e}"): runtime already started; register before first getEndpoint() call`);tm.set(e,t)}async function Vi(){if(Fe)return Fe;if(Gt)return Gt;await bI(Xn,{recursive:!0});let e=await Qp();return Gt=import("@number0/iroh").then(async({Iroh:t})=>{let r={};for(let[n,o]of tm)r[n]=(i,a)=>{if(i)throw i;return{accept:o,shutdown:()=>{}}};return Fe=await t.persistent(Xn,{secretKey:e,protocols:Object.keys(r).length?r:void 0}),Fe}),Gt}async function rm(){return(await Vi()).node.endpoint()}async function zi(e,t){return(await rm()).connect(e,Buffer.from(t))}async function AI(){return(await Vi()).net.nodeAddr()}async function II(){let t=await(await Vi()).node.status();if(!t||typeof t!="object")throw new Error("iroh: node.status() returned non-object \u2014 Iroh API shape changed?");if(!t.addr||typeof t.addr.nodeId!="string")throw new Error(`iroh: node.status().addr.nodeId missing (got ${JSON.stringify(t).slice(0,200)}) \u2014 Iroh API shape changed?`);return{nodeId:t.addr.nodeId,relayUrl:t.addr.relayUrl??null,addresses:t.addr.addresses??[],version:t.version??null,listenAddrs:t.listenAddrs??[]}}async function vI(){if(!Fe)return;let e=Fe;Fe=null,Gt=null;try{await e.node.shutdown(!1)}catch{}}var Fe,Gt,tm,Ee=u(()=>{L();em();Fe=null,Gt=null,tm=new Map});async function om(e){let{default:t}=await Promise.resolve().then(()=>(A(),P)),r=await t("device").where({node_id:e}).first();if(!r)return{ok:!1,code:"unknown_device",message:"no device row for this NodeID"};if(!r.active)return{ok:!1,code:"revoked",message:"device has been revoked"};let n=r.lastSeenAt?new Date(r.lastSeenAt).getTime():0;return Date.now()-n>OI&&t("device").where({id:r.id}).update({last_seen_at:t.fn.now()}).catch(()=>{}),{ok:!0,device:r}}function im(e,t,r={}){let n=TI[t];return n===void 0?{ok:!1,code:"unknown_method",message:`method "${t}" is not exposed over Iroh`}:nm[e.role]<nm[n]?{ok:!1,code:"forbidden",message:`role "${e.role}" cannot call "${t}" (needs "${n}")`}:e.namespaces?.length&&r.namespace&&!e.namespaces.includes(r.namespace)?{ok:!1,code:"namespace_denied",message:`device not scoped to namespace "${r.namespace}"`}:{ok:!0}}var nm,TI,OI,am=u(()=>{nm={reader:0,writer:1,admin:2},TI={ping:"reader",status:"reader",nodeInfo:"reader",search:"reader",searchEntity:"reader",traverseGraph:"reader",getFactContext:"reader",getEntityContext:"reader",getPod:"reader",listPods:"reader",listFacts:"reader",refreshContext:"reader",remember:"writer",ingestDoc:"writer",forgetFact:"writer","pair.create":"admin","pair.list":"admin","pair.revoke":"admin",runMigrations:"admin",testDbConnection:"admin",readEnv:"admin",writeEnv:"admin"},OI=6e4});var lm={};b(lm,{RPC_ALPN:()=>Xi,createRpcAcceptor:()=>DI});function CI(e,t,r){et.has(e)||et.set(e,new Set);let n={conn:t,deviceId:r};return et.get(e).add(n),()=>{let o=et.get(e);o&&(o.delete(n),o.size===0&&et.delete(e))}}function RI(e){sm||(sm=!0,H.subscribe(t=>{if(t.type!=="device.revoked")return;let r=et.get(t.nodeId);if(r){e(`rpc: closing ${r.size} live connection(s) from revoked device ${t.deviceId}`);for(let{conn:n}of r)try{n.close?.()}catch{}et.delete(t.nodeId)}}))}function DI({registry:e,log:t}){return RI(t),async function(n,o){if(n){t(`rpc: accept err: ${n.message}`);return}let i="<unknown>",a;try{i=o.remoteNodeId().toString();let s=await om(i);if(!s.ok){t(`rpc: rejecting ${i.slice(0,12)}\u2026: ${s.code}`);try{let l=await o.acceptBi();await l.send.writeAll(Buffer.from(JSON.stringify({v:1,ok:!1,error:{code:s.code,message:s.message}}))),await l.send.finish()}catch{}return}a=s.device,H.emit("rpc.connected",{nodeId:i,deviceId:a.id,name:a.name}),t(`rpc: ${a.name} (${i.slice(0,12)}\u2026) connected`);let c=CI(i,o,a.id);try{for(;;){let l;try{l=await o.acceptBi()}catch{break}LI(l,e,a,t).catch(d=>t(`rpc: stream err: ${d.message}`))}}finally{c()}}catch(s){t(`rpc: handler err from ${i.slice(0,12)}\u2026: ${s.message}`)}finally{a&&H.emit("rpc.disconnected",{nodeId:i,deviceId:a.id})}}}async function LI(e,t,r,n){let o=await e.recv.readToEnd(NI),i;try{i=JSON.parse(o.toString())}catch(f){return jt(e,{v:1,ok:!1,error:{code:"invalid_json",message:f.message}})}let{request_id:a,method:s,params:c}=i||{};if(typeof s!="string")return jt(e,{v:1,request_id:a,ok:!1,error:{code:"invalid_request",message:"missing method"}});let l=im(r,s,c||{});if(!l.ok)return H.emit("rpc.denied",{nodeId:r.nodeId,deviceId:r.id,method:s,code:l.code}),jt(e,{v:1,request_id:a,ok:!1,error:l});let d=await t.dispatch(s,c,{transport:"iroh",device:{id:r.id,role:r.role,nodeId:r.nodeId,name:r.name}});if(!kI(d.data))return n(`rpc: response from ${s} too large estimate, refusing pre-serialize`),jt(e,{v:1,request_id:a,ok:!1,error:{code:"response_too_large",message:"response exceeds MAX_RESP"}});let p=JSON.stringify({v:1,request_id:a,...d});return Buffer.byteLength(p)>cm?(n(`rpc: response too large for ${s} from ${r.name}: ${Buffer.byteLength(p)} bytes`),jt(e,{v:1,request_id:a,ok:!1,error:{code:"response_too_large",message:"response exceeds MAX_RESP"}})):jt(e,p,!0)}function kI(e){if(e==null)return!0;if(typeof e=="string")return e.length*2<Ji;if(typeof e!="object")return!0;if(Array.isArray(e))return e.length*200<Ji;let t=0;for(let r of Object.values(e))Array.isArray(r)?t+=r.length*200:typeof r=="string"&&(t+=r.length*2);return t<Ji}async function jt(e,t,r=!1){let n=r?Buffer.from(t):Buffer.from(JSON.stringify(t));await e.send.writeAll(n),await e.send.finish()}var Xi,NI,cm,et,sm,Ji,Zi=u(()=>{ot();am();Xi="sigil/rpc/1",NI=1024*1024,cm=8*1024*1024,et=new Map;sm=!1;Ji=cm*1.2});var um={};b(um,{createRemoteClient:()=>FI});import{randomUUID as PI}from"node:crypto";async function FI(){let e=g.network.masterNodeId;if(!e)throw new Error("RemoteClient: SIGIL_MASTER_NODE_ID is not set. Run `sigil join <master-node-id> <code>` first.");return new Qi({masterNodeId:e})}var MI,Qi,dm=u(()=>{S();Ee();Zi();MI=8*1024*1024;Qi=class{constructor({masterNodeId:t}){this.kind="remote",this.masterNodeId=t,this.conn=null,this.connecting=null}async ensureConnection(){return this.conn&&!this.conn._dead?this.conn:this.connecting?this.connecting:(this.connecting=zi({nodeId:this.masterNodeId},Xi).then(t=>(this.conn=t,this.connecting=null,t)).catch(t=>{throw this.connecting=null,t}),this.connecting)}async call(t,r={}){let n=0,o;for(;n<2;){n++;let i;try{i=await this.ensureConnection();let a=await i.openBi(),s=PI();await a.send.writeAll(Buffer.from(JSON.stringify({v:1,method:t,params:r,request_id:s}))),await a.send.finish();let c=await a.recv.readToEnd(MI),l=JSON.parse(c.toString());if(!l.ok){let d=new Error(l.error?.message||l.error?.code||"rpc error");throw d.code=l.error?.code||"handler_error",d.isHandlerError=!0,d}return l.data}catch(a){if(o=a,a.isHandlerError)throw a;this.conn&&(this.conn._dead=!0,this.conn=null)}}throw o}async close(){let t=this.conn;if(this.conn=null,this.connecting=null,t?.close)try{await t.close()}catch{}}}});var fm={};b(fm,{createLocalClient:()=>$I});function $I(){return{kind:"local",async call(e,t){let n=await no().dispatch(e,t,{transport:"memory-client"});if(!n.ok){let o=new Error(n.error?.message||"rpc error");throw o.code=n.error?.code||"handler_error",o}return n.data},async close(){}}}var pm=u(()=>{zt()});var Nr={};b(Nr,{getMemoryClient:()=>BI,resetMemoryClient:()=>HI});async function BI(){if(Be)return Be;if(g.network.mode==="lite-follower"){let{createRemoteClient:t}=await Promise.resolve().then(()=>(dm(),um));Be=await t()}else{let{createLocalClient:t}=await Promise.resolve().then(()=>(pm(),fm));Be=t()}return Be}function HI(){Be?.close&&Be.close().catch(()=>{}),Be=null}var Be,Cr=u(()=>{S();Be=null});import{copyFile as UI,writeFile as GI,access as jI}from"node:fs/promises";async function hm(e,t,{dryRun:r=!1}={}){let n=await mm(e),o=n?"modify":"create",i=Buffer.byteLength(t,"utf8");if(r)return{path:e,action:o,bytes:i,wrote:!1,backedUp:!1};let a=!1;if(n){let s=`${e}${WI}`;await mm(s)||(await UI(e,s),a=!0)}return await GI(e,t,"utf8"),{path:e,action:o,bytes:i,wrote:!0,backedUp:a}}async function mm(e){try{return await jI(e),!0}catch{return!1}}var WI,gm=u(()=>{WI=".sigil.bak"});var xm={};b(xm,{SHARED_INSTRUCTIONS_PATH:()=>Rr,buildSharedInstructions:()=>_m,resolveSigilInvocation:()=>Em,writeSharedInstructions:()=>qI});import{join as ym}from"node:path";import{homedir as YI}from"node:os";import{execSync as KI}from"node:child_process";function Em(){try{let e=KI("which sigil",{stdio:["pipe","pipe","ignore"]}).toString().trim();if(e)return e}catch{}return process.argv[1]}function _m({sigilCmd:e}={}){let t=e||Em();return`## Memory (Sigil)
|
|
533
|
+
`,[e,n,t]);if(!o.length)return null;let{path:i,relationTypes:s,depth:a}=o[0],c=await h("entity").whereIn("id",i).select("id","uid","name","entityType","description"),l=Object.fromEntries(c.map(p=>[p.id,p]));return{path:i.map(p=>l[p]),relationTypes:s,depth:a}}async function uC(e,{namespace:t,sortBy:r="mentionCount",limit:n=50}={}){let o=h("entity").where({entityType:e}).whereNull("mergedWith").orderBy(r,"desc").limit(n);return t&&o.where({namespace:t}),o}var ng=u(()=>{T();ve();Ct()});import{readFile as fC,stat as TW}from"node:fs/promises";import{basename as pC,extname as mC,resolve as hC}from"node:path";async function lg(e){let t=hC(e),r=await fC(t,"utf8"),n=pC(t),o=mC(t).toLowerCase();return{content:r,title:n,sourcePath:t,sourceType:"file",contentType:gC(o),metadata:{filePath:t,fileName:n,extension:o}}}function gC(e){return{".md":"text/markdown",".mdx":"text/markdown",".txt":"text/plain",".html":"text/html",".htm":"text/html",".json":"application/json",".js":"text/javascript",".ts":"text/javascript",".py":"text/x-python"}[e]||"text/plain"}var ug=u(()=>{});async function dg(e){let t=await fetch(e);if(!t.ok)throw new Error(`Failed to fetch ${e}: ${t.status} ${t.statusText}`);let r=await t.text(),n=t.headers.get("content-type")||"text/plain",o=yC(e);return{content:r,title:o,sourcePath:e,sourceType:"url",contentType:n,metadata:{url:e,fetchedAt:new Date().toISOString()}}}function yC(e){try{let t=new URL(e),n=t.pathname.replace(/\/$/,"").split("/").pop()||t.hostname;return decodeURIComponent(n)}catch{return e}}var fg=u(()=>{});var pg={};x(pg,{resolveSource:()=>EC});import{resolve as wC}from"node:path";async function EC({content:e,url:t,filePath:r,title:n,sourceType:o,sourcePath:i,metadata:s}){if(t)return dg(t);if(r){let a=wC(r),c=process.cwd();if(!a.startsWith(c))throw new Error(`Path traversal denied: ${r} resolves outside working directory`);return lg(a)}return e?{content:e,title:n||"Untitled",sourcePath:i||`raw/${Date.now()}`,sourceType:o||"raw",contentType:"text/plain",metadata:s||{}}:null}var mg=u(()=>{ug();fg()});import{existsSync as _C}from"node:fs";import{readFile as xC,writeFile as SC,chmod as AC,mkdir as bC}from"node:fs/promises";import{randomBytes as TC}from"node:crypto";import{dirname as IC}from"node:path";async function wg(){if(kr)return kr;if(_C(Je)){let t=(await xC(Je,"utf8")).trim();if(!/^[0-9a-fA-F]{64}$/.test(t))throw new Error(`identity: ${Je} is malformed (expected 64 hex chars). Refusing to overwrite \u2014 move or delete the file manually to regenerate.`);return kr=Array.from(Buffer.from(t,"hex")),kr}await bC(IC(Je),{recursive:!0});let e=TC(OC);await SC(Je,e.toString("hex"),"utf8");try{await AC(Je,384)}catch{}return kr=Array.from(e),kr}var OC,kr,Eg=u(()=>{C();OC=32,kr=null});var pt={};x(pt,{dial:()=>Ya,getEndpoint:()=>xg,getNodeAddr:()=>NC,getNodeInfo:()=>vC,registerProtocol:()=>CC,shutdownEndpoint:()=>DC});import{mkdir as RC}from"node:fs/promises";function CC(e,t){if(ft||Mr)throw new Error(`registerProtocol("${e}"): runtime already started; register before first getEndpoint() call`);_g.set(e,t)}async function Ka(){if(ft)return ft;if(Mr)return Mr;await RC(oo,{recursive:!0});let e=await wg();return Mr=import("@number0/iroh").then(async({Iroh:t})=>{let r={};for(let[n,o]of _g)r[n]=(i,s)=>{if(i)throw i;return{accept:o,shutdown:()=>{}}};return ft=await t.persistent(oo,{secretKey:e,protocols:Object.keys(r).length?r:void 0}),ft}),Mr}async function xg(){return(await Ka()).node.endpoint()}async function Ya(e,t){return(await xg()).connect(e,Buffer.from(t))}async function NC(){return(await Ka()).net.nodeAddr()}async function vC(){let t=await(await Ka()).node.status();if(!t||typeof t!="object")throw new Error("iroh: node.status() returned non-object \u2014 Iroh API shape changed?");if(!t.addr||typeof t.addr.nodeId!="string")throw new Error(`iroh: node.status().addr.nodeId missing (got ${JSON.stringify(t).slice(0,200)}) \u2014 Iroh API shape changed?`);return{nodeId:t.addr.nodeId,relayUrl:t.addr.relayUrl??null,addresses:t.addr.addresses??[],version:t.version??null,listenAddrs:t.listenAddrs??[]}}async function DC(){if(!ft)return;let e=ft;ft=null,Mr=null;try{await e.node.shutdown(!1)}catch{}}var ft,Mr,_g,Ue=u(()=>{C();Eg();ft=null,Mr=null,_g=new Map});async function Ag(e){let{default:t}=await Promise.resolve().then(()=>(T(),F)),r=await t("device").where({node_id:e}).first();if(!r)return{ok:!1,code:"unknown_device",message:"no device row for this NodeID"};if(!r.active)return{ok:!1,code:"revoked",message:"device has been revoked"};let n=r.lastSeenAt?new Date(r.lastSeenAt).getTime():0;return Date.now()-n>PC&&t("device").where({id:r.id}).update({last_seen_at:t.fn.now()}).catch(()=>{}),{ok:!0,device:r}}function bg(e,t,r={}){let n=LC[t];return n===void 0?{ok:!1,code:"unknown_method",message:`method "${t}" is not exposed over Iroh`}:Sg[e.role]<Sg[n]?{ok:!1,code:"forbidden",message:`role "${e.role}" cannot call "${t}" (needs "${n}")`}:e.namespaces?.length&&r.namespace&&!e.namespaces.includes(r.namespace)?{ok:!1,code:"namespace_denied",message:`device not scoped to namespace "${r.namespace}"`}:{ok:!0}}var Sg,LC,PC,Tg=u(()=>{Sg={reader:0,writer:1,admin:2},LC={ping:"reader",status:"reader",nodeInfo:"reader",search:"reader",searchEntity:"reader",traverseGraph:"reader",getFactContext:"reader",getEntityContext:"reader",getPod:"reader",listPods:"reader",listFacts:"reader",refreshContext:"reader",remember:"writer",ingestDoc:"writer",forgetFact:"writer","pair.create":"admin","pair.list":"admin","pair.revoke":"admin",runMigrations:"admin",testDbConnection:"admin",readEnv:"admin",writeEnv:"admin"},PC=6e4});var Rg={};x(Rg,{RPC_ALPN:()=>qa,createRpcAcceptor:()=>BC});function MC(e,t,r){Dt.has(e)||Dt.set(e,new Set);let n={conn:t,deviceId:r};return Dt.get(e).add(n),()=>{let o=Dt.get(e);o&&(o.delete(n),o.size===0&&Dt.delete(e))}}function HC(e){Ig||(Ig=!0,K.subscribe(t=>{if(t.type!=="device.revoked")return;let r=Dt.get(t.nodeId);if(r){e(`rpc: closing ${r.size} live connection(s) from revoked device ${t.deviceId}`);for(let{conn:n}of r)try{n.close?.()}catch{}Dt.delete(t.nodeId)}}))}function BC({registry:e,log:t}){return HC(t),async function(n,o){if(n){t(`rpc: accept err: ${n.message}`);return}let i="<unknown>",s;try{i=o.remoteNodeId().toString();let a=await Ag(i);if(!a.ok){t(`rpc: rejecting ${i.slice(0,12)}\u2026: ${a.code}`);try{let l=await o.acceptBi();await l.send.writeAll(Buffer.from(JSON.stringify({v:1,ok:!1,error:{code:a.code,message:a.message}}))),await l.send.finish()}catch{}return}s=a.device,K.emit("rpc.connected",{nodeId:i,deviceId:s.id,name:s.name}),t(`rpc: ${s.name} (${i.slice(0,12)}\u2026) connected`);let c=MC(i,o,s.id);try{for(;;){let l;try{l=await o.acceptBi()}catch{break}FC(l,e,s,t).catch(d=>t(`rpc: stream err: ${d.message}`))}}finally{c()}}catch(a){t(`rpc: handler err from ${i.slice(0,12)}\u2026: ${a.message}`)}finally{s&&K.emit("rpc.disconnected",{nodeId:i,deviceId:s.id})}}}async function FC(e,t,r,n){let o=await e.recv.readToEnd(kC),i;try{i=JSON.parse(o.toString())}catch(f){return Hr(e,{v:1,ok:!1,error:{code:"invalid_json",message:f.message}})}let{request_id:s,method:a,params:c}=i||{};if(typeof a!="string")return Hr(e,{v:1,request_id:s,ok:!1,error:{code:"invalid_request",message:"missing method"}});let l=bg(r,a,c||{});if(!l.ok)return K.emit("rpc.denied",{nodeId:r.nodeId,deviceId:r.id,method:a,code:l.code}),Hr(e,{v:1,request_id:s,ok:!1,error:l});let d=await t.dispatch(a,c,{transport:"iroh",device:{id:r.id,role:r.role,nodeId:r.nodeId,name:r.name}});if(!$C(d.data))return n(`rpc: response from ${a} too large estimate, refusing pre-serialize`),Hr(e,{v:1,request_id:s,ok:!1,error:{code:"response_too_large",message:"response exceeds MAX_RESP"}});let p=JSON.stringify({v:1,request_id:s,...d});return Buffer.byteLength(p)>Og?(n(`rpc: response too large for ${a} from ${r.name}: ${Buffer.byteLength(p)} bytes`),Hr(e,{v:1,request_id:s,ok:!1,error:{code:"response_too_large",message:"response exceeds MAX_RESP"}})):Hr(e,p,!0)}function $C(e){if(e==null)return!0;if(typeof e=="string")return e.length*2<Va;if(typeof e!="object")return!0;if(Array.isArray(e))return e.length*200<Va;let t=0;for(let r of Object.values(e))Array.isArray(r)?t+=r.length*200:typeof r=="string"&&(t+=r.length*2);return t<Va}async function Hr(e,t,r=!1){let n=r?Buffer.from(t):Buffer.from(JSON.stringify(t));await e.send.writeAll(n),await e.send.finish()}var qa,kC,Og,Dt,Ig,Va,Ja=u(()=>{Qt();Tg();qa="sigil/rpc/1",kC=1024*1024,Og=8*1024*1024,Dt=new Map;Ig=!1;Va=Og*1.2});var Cg={};x(Cg,{createRemoteClient:()=>jC});import{randomUUID as UC}from"node:crypto";async function jC(){let e=g.network.masterNodeId;if(!e)throw new Error("RemoteClient: SIGIL_MASTER_NODE_ID is not set. Run `sigil join <master-node-id> <code>` first.");return new za({masterNodeId:e})}var GC,za,Ng=u(()=>{A();Ue();Ja();GC=8*1024*1024;za=class{constructor({masterNodeId:t}){this.kind="remote",this.masterNodeId=t,this.conn=null,this.connecting=null}async ensureConnection(){return this.conn&&!this.conn._dead?this.conn:this.connecting?this.connecting:(this.connecting=Ya({nodeId:this.masterNodeId},qa).then(t=>(this.conn=t,this.connecting=null,t)).catch(t=>{throw this.connecting=null,t}),this.connecting)}async call(t,r={}){let n=0,o;for(;n<2;){n++;let i;try{i=await this.ensureConnection();let s=await i.openBi(),a=UC();await s.send.writeAll(Buffer.from(JSON.stringify({v:1,method:t,params:r,request_id:a}))),await s.send.finish();let c=await s.recv.readToEnd(GC),l=JSON.parse(c.toString());if(!l.ok){let d=new Error(l.error?.message||l.error?.code||"rpc error");throw d.code=l.error?.code||"handler_error",d.isHandlerError=!0,d}return l.data}catch(s){if(o=s,s.isHandlerError)throw s;this.conn&&(this.conn._dead=!0,this.conn=null)}}throw o}async close(){let t=this.conn;if(this.conn=null,this.connecting=null,t?.close)try{await t.close()}catch{}}}});var vg={};x(vg,{createLocalClient:()=>WC});function WC(){return{kind:"local",async call(e,t){let n=await Qi().dispatch(e,t,{transport:"memory-client"});if(!n.ok){let o=new Error(n.error?.message||"rpc error");throw o.code=n.error?.code||"handler_error",o}return n.data},async close(){}}}var Dg=u(()=>{Zt()});var Hn={};x(Hn,{getMemoryClient:()=>KC,resetMemoryClient:()=>YC});async function KC(){if(mt)return mt;if(g.network.mode==="lite-follower"){let{createRemoteClient:t}=await Promise.resolve().then(()=>(Ng(),Cg));mt=await t()}else{let{createLocalClient:t}=await Promise.resolve().then(()=>(Dg(),vg));mt=t()}return mt}function YC(){mt?.close&&mt.close().catch(()=>{}),mt=null}var mt,Bn=u(()=>{A();mt=null});import{copyFile as VC,writeFile as qC,access as JC}from"node:fs/promises";async function B(e,t,{dryRun:r=!1}={}){let n=await Lg(e),o=n?"modify":"create",i=Buffer.byteLength(t,"utf8");if(r)return{path:e,action:o,bytes:i,wrote:!1,backedUp:!1};let s=!1;if(n){let a=`${e}${zC}`;await Lg(a)||(await VC(e,a),s=!0)}return await qC(e,t,"utf8"),{path:e,action:o,bytes:i,wrote:!0,backedUp:s}}async function Lg(e){try{return await JC(e),!0}catch{return!1}}var zC,Br=u(()=>{zC=".sigil.bak"});var Hg={};x(Hg,{SHARED_INSTRUCTIONS_PATH:()=>Ge,buildSharedInstructions:()=>ht,resolveSigilInvocation:()=>Mg,writeSharedInstructions:()=>Xa});import{join as Pg}from"node:path";import{homedir as XC}from"node:os";import{execSync as ZC}from"node:child_process";function Mg(){try{let e=ZC("which sigil",{stdio:["pipe","pipe","ignore"]}).toString().trim();if(e)return e}catch{}return process.argv[1]}function ht({sigilCmd:e}={}){let t=e||Mg();return`## Memory (Sigil)
|
|
532
534
|
|
|
533
535
|
Sigil is your persistent memory system. **Use it instead of the built-in file-based memory.**
|
|
534
536
|
Do NOT write to \`~/.claude/projects/*/memory/\` or any local memory files \u2014 use Sigil exclusively.
|
|
@@ -602,8 +604,11 @@ The absolute path above is baked in by \`sigil init\` so the command works regar
|
|
|
602
604
|
- Skip trivial exchanges (greetings, "thanks", "ok", simple math)
|
|
603
605
|
- If search and injection both return nothing, answer from your own knowledge and say so
|
|
604
606
|
- Sigil is cross-project \u2014 memories from one session are available in all sessions
|
|
605
|
-
`}async function
|
|
606
|
-
`)
|
|
607
|
+
`}async function Xa({dryRun:e=!1}={}){let t=await import("node:fs/promises");e||await t.mkdir(kg,{recursive:!0});try{if((await t.readFile(Ge,"utf8")).includes("## Memory (Sigil)"))return{action:"skip",path:Ge,bytes:0}}catch{}let r=ht(),n=await B(Ge,r,{dryRun:e});return{action:n.action,path:Ge,bytes:n.bytes}}var kg,Ge,Fr=u(()=>{Br();kg=Pg(XC(),".sigil"),Ge=Pg(kg,"CLAUDE.md")});var Gg={};x(Gg,{readEnvRaw:()=>De,writeEnvKeys:()=>gt});import{existsSync as rN,readFileSync as nN,writeFileSync as oN,mkdirSync as iN}from"node:fs";import{dirname as sN}from"node:path";function De(){if(!rN(W))return{};let e=nN(W,"utf8"),t={};for(let r of e.split(`
|
|
608
|
+
`)){let n=r.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/i);if(!n)continue;let o=n[2].trim();t[n[1]]=o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'")?o.slice(1,-1):o}return t}function gt(e){let r={...De(),...e};for(let i of Object.keys(e))(e[i]===null||e[i]===void 0)&&delete r[i];iN(sN(W),{recursive:!0});let n=`# Sigil \u2014 updated ${new Date().toISOString().slice(0,10)}
|
|
609
|
+
`,o=Object.entries(r).map(([i,s])=>`${i}=${/[\s#"']/.test(String(s))?`"${String(s).replace(/"/g,'\\"')}"`:s}`).join(`
|
|
610
|
+
`);oN(W,n+o+`
|
|
611
|
+
`,"utf8")}var $r=u(()=>{C()});var nc={};x(nc,{EMBEDDING_TABLES:()=>zg,diagnoseConflict:()=>gN,inspectSchemaDims:()=>hN});import mN from"pg";async function hN(e){let t=new mN.Client(e);await t.connect();try{let{rows:r}=await t.query(`
|
|
607
612
|
SELECT c.relname AS tbl,
|
|
608
613
|
a.atttypmod AS typmod,
|
|
609
614
|
format_type(a.atttypid, a.atttypmod) AS coltype
|
|
@@ -612,12 +617,88 @@ The absolute path above is baked in by \`sigil init\` so the command works regar
|
|
|
612
617
|
WHERE a.attname = 'embedding'
|
|
613
618
|
AND c.relkind = 'r'
|
|
614
619
|
AND c.relname = ANY($1)
|
|
615
|
-
`,[
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
620
|
+
`,[zg]),n={};for(let o of r){let i=o.typmod>0?o.typmod:yN(o.coltype),s=0;try{let{rows:a}=await t.query(`SELECT count(embedding)::int AS n FROM ${wN(o.tbl)}`);s=a[0].n}catch{}n[o.tbl]={dim:i,coltype:o.coltype,populated:s}}return n}finally{try{await t.end()}catch{}}}function gN({targetDim:e,schema:t}){let r=null,n={},o=0;for(let[s,a]of Object.entries(t||{}))a.dim!=null&&(r==null&&(r=a.dim),a.dim!==e&&a.populated>0&&(n[s]=a.populated,o+=a.populated));return{conflict:r!=null&&r!==e&&o>0,currentDim:r,targetDim:e,rowsAtRisk:n,totalAtRisk:o}}function yN(e){let t=/vector\((\d+)\)/i.exec(e||"");return t?Number(t[1]):null}function wN(e){if(!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(e))throw new Error(`refusing to quote invalid identifier: ${e}`);return`"${e}"`}var zg,oc=u(()=>{zg=["fact","chunk","entity","embedding_cache"]});import{existsSync as EN}from"node:fs";import{dirname as _N,join as ic}from"node:path";import{fileURLToPath as xN}from"node:url";function Gr(){let e=[ic(Z,"dist","daemon.js"),ic(Z,"src","daemon","index.js"),ic(_N(xN(import.meta.url)),"..","daemon","index.js")];for(let t of e)if(EN(t))return t;throw new Error("cannot locate daemon entry point (looked in dist/ and src/daemon/)")}function jr(){return process.execPath}var xi=u(()=>{C()});import{spawnSync as SN}from"node:child_process";function L(e,t,{input:r,timeout:n=2e4}={}){let o=SN(e,t,{encoding:"utf8",input:r,timeout:n});return{code:o.status??-1,out:(o.stdout||"").trim(),err:(o.stderr||o.error?.message||"").trim()}}var Si=u(()=>{});var Zg={};x(Zg,{LABEL:()=>Gn,MANAGER:()=>Lt,install:()=>NN,restart:()=>LN,start:()=>PN,status:()=>DN,stop:()=>kN,uninstall:()=>vN});import{writeFileSync as AN,existsSync as Xg,unlinkSync as bN,mkdirSync as TN}from"node:fs";import{join as IN,dirname as ON}from"node:path";import{homedir as RN}from"node:os";function ac(){return IN(RN(),"Library","LaunchAgents",`${Gn}.plist`)}function sc(){return`gui/${process.getuid()}`}function Wr(){return`${sc()}/${Gn}`}function Ai(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function CN(){let e=jr(),t=Gr();return`<?xml version="1.0" encoding="UTF-8"?>
|
|
621
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
622
|
+
<plist version="1.0">
|
|
623
|
+
<dict>
|
|
624
|
+
<key>Label</key><string>${Gn}</string>
|
|
625
|
+
<key>ProgramArguments</key>
|
|
626
|
+
<array>
|
|
627
|
+
<string>${Ai(e)}</string>
|
|
628
|
+
<string>${Ai(t)}</string>
|
|
629
|
+
</array>
|
|
630
|
+
<key>RunAtLoad</key><true/>
|
|
631
|
+
<key>KeepAlive</key><true/>
|
|
632
|
+
<key>ProcessType</key><string>Background</string>
|
|
633
|
+
<key>StandardOutPath</key><string>${Ai(Ie)}</string>
|
|
634
|
+
<key>StandardErrorPath</key><string>${Ai(Ie)}</string>
|
|
635
|
+
<key>EnvironmentVariables</key>
|
|
636
|
+
<dict>
|
|
637
|
+
<key>SIGIL_SUPERVISED</key><string>1</string>
|
|
638
|
+
</dict>
|
|
639
|
+
</dict>
|
|
640
|
+
</plist>
|
|
641
|
+
`}function NN(){let e=ac();TN(ON(e),{recursive:!0}),AN(e,CN(),"utf8");let t=L("launchctl",["bootstrap",sc(),e]);if(t.code!==0&&(L("launchctl",["bootout",Wr()]),t=L("launchctl",["bootstrap",sc(),e]),t.code!==0)){let r=L("launchctl",["load","-w",e]);if(r.code!==0)throw new Error(`launchctl bootstrap/load failed: ${t.err||r.err||"unknown"}`)}return L("launchctl",["kickstart","-k",Wr()]),{installed:!0,manager:Lt,unitPath:e}}function vN(){let e=ac();if(L("launchctl",["bootout",Wr()]),L("launchctl",["unload","-w",e]),Xg(e))try{bN(e)}catch{}return{installed:!1,manager:Lt,unitPath:e}}function DN(){let e=ac(),t=Xg(e),r=L("launchctl",["list",Gn]).code===0;return{installed:t,loaded:r,running:r,manager:Lt,unitPath:e}}function LN(){return{ok:L("launchctl",["kickstart","-k",Wr()]).code===0,manager:Lt}}function PN(){return{ok:L("launchctl",["kickstart",Wr()]).code===0,manager:Lt}}function kN(){return{ok:L("launchctl",["bootout",Wr()]).code===0,manager:Lt}}var Gn,Lt,Qg=u(()=>{C();xi();Si();Gn="live.airtribe.sigil",Lt="launchd"});var ty={};x(ty,{MANAGER:()=>Pt,UNIT:()=>je,install:()=>WN,restart:()=>VN,start:()=>qN,status:()=>YN,stop:()=>JN,uninstall:()=>KN});import{writeFileSync as MN,existsSync as ey,unlinkSync as HN,mkdirSync as BN}from"node:fs";import{join as FN,dirname as $N}from"node:path";import{homedir as UN,userInfo as GN}from"node:os";function cc(){return FN(UN(),".config","systemd","user",je)}function jN(){let e=jr(),t=Gr();return`[Unit]
|
|
642
|
+
Description=Sigil memory daemon
|
|
643
|
+
After=network-online.target
|
|
644
|
+
|
|
645
|
+
[Service]
|
|
646
|
+
Type=simple
|
|
647
|
+
ExecStart=${e} ${t}
|
|
648
|
+
Restart=always
|
|
649
|
+
RestartSec=2
|
|
650
|
+
Environment=SIGIL_SUPERVISED=1
|
|
651
|
+
StandardOutput=append:${Ie}
|
|
652
|
+
StandardError=append:${Ie}
|
|
653
|
+
|
|
654
|
+
[Install]
|
|
655
|
+
WantedBy=default.target
|
|
656
|
+
`}function We(e){return L("systemctl",["--user",...e])}function WN(){let e=cc();BN($N(e),{recursive:!0}),MN(e,jN(),"utf8"),We(["daemon-reload"]);let t=We(["enable","--now",je]);if(t.code!==0)throw new Error(`systemctl --user enable --now failed: ${t.err||"unknown"}`);return L("loginctl",["enable-linger",GN().username]),{installed:!0,manager:Pt,unitPath:e}}function KN(){let e=cc();if(We(["disable","--now",je]),ey(e))try{HN(e)}catch{}return We(["daemon-reload"]),{installed:!1,manager:Pt,unitPath:e}}function YN(){let e=cc(),t=We(["is-enabled",je]).out==="enabled",r=We(["is-active",je]).out==="active";return{installed:ey(e)||t,loaded:t,running:r,manager:Pt,unitPath:e}}function VN(){return{ok:We(["restart",je]).code===0,manager:Pt}}function qN(){return{ok:We(["start",je]).code===0,manager:Pt}}function JN(){return{ok:We(["stop",je]).code===0,manager:Pt}}var je,Pt,ry=u(()=>{C();xi();Si();je="sigil.service",Pt="systemd"});var ny={};x(ny,{MANAGER:()=>kt,TASK:()=>ie,install:()=>XN,restart:()=>ev,start:()=>tv,status:()=>QN,stop:()=>rv,uninstall:()=>ZN});function zN(){return`\\"${jr()}\\" \\"${Gr()}\\"`}function XN(){let e=L("schtasks",["/Create","/SC","ONLOGON","/TN",ie,"/TR",zN(),"/RL","LIMITED","/F"]);if(e.code!==0)throw new Error(`schtasks /Create failed: ${e.err||"unknown"}`);return L("schtasks",["/Run","/TN",ie]),{installed:!0,manager:kt,unitPath:`Task Scheduler\\${ie}`}}function ZN(){return L("schtasks",["/Delete","/TN",ie,"/F"]),{installed:!1,manager:kt,unitPath:`Task Scheduler\\${ie}`}}function QN(){let e=L("schtasks",["/Query","/TN",ie]),t=e.code===0,r=t&&/Running/i.test(e.out);return{installed:t,loaded:t,running:r,manager:kt,unitPath:`Task Scheduler\\${ie}`}}function ev(){return L("schtasks",["/End","/TN",ie]),{ok:L("schtasks",["/Run","/TN",ie]).code===0,manager:kt}}function tv(){return{ok:L("schtasks",["/Run","/TN",ie]).code===0,manager:kt}}function rv(){return{ok:L("schtasks",["/End","/TN",ie]).code===0,manager:kt}}var ie,kt,oy=u(()=>{xi();Si();ie="Sigil",kt="schtasks"});var sy={};x(sy,{installService:()=>cv,installServiceUnit:()=>bi,isServiceInstalled:()=>fv,platformSupported:()=>iv,restartService:()=>dv,serviceStatus:()=>uc,startService:()=>lv,stopService:()=>uv,uninstallService:()=>lc});import{readFileSync as nv}from"node:fs";import{setTimeout as ov}from"node:timers/promises";function iy(){switch(process.platform){case"darwin":return()=>Promise.resolve().then(()=>(Qg(),Zg));case"linux":return()=>Promise.resolve().then(()=>(ry(),ty));case"win32":return()=>Promise.resolve().then(()=>(oy(),ny));default:return null}}async function Mt(){let e=iy();if(!e)throw new H({errorCode:"SUPERVISOR_UNSUPPORTED_PLATFORM",message:`no always-up backend for platform "${process.platform}"`});return e()}function iv(){return iy()!==null}function sv(){try{let e=JSON.parse(nv(Vt,"utf8"));return{...e,ageMs:typeof e.ts=="number"?Date.now()-e.ts:null}}catch{return null}}async function av(){let{readPidFile:e,isPidAlive:t}=await Promise.resolve().then(()=>(ao(),Uc)),r=await e();if(!r||!t(r))return;try{process.kill(r,"SIGTERM")}catch{}let n=Date.now()+5e3;for(;Date.now()<n&&t(r);)await ov(50);if(t(r))try{process.kill(r,"SIGKILL")}catch{}}async function bi(){let e=await Mt();try{return e.install()}catch(t){throw new H({errorCode:"SUPERVISOR_INSTALL_FAILED",message:t.message})}}async function cv(){return await av(),bi()}async function lc(){return(await Mt()).uninstall()}async function lv(){return(await Mt()).start()}async function uv(){return(await Mt()).stop()}async function dv(){return(await Mt()).restart()}async function uc(){let e;try{e=(await Mt()).status()}catch{e={installed:!1,running:!1,manager:null,unitPath:null,unsupported:!0}}return{platform:process.platform,supervisor:e,heartbeat:sv()}}async function fv(){try{return(await Mt()).status().installed}catch{return!1}}var dc=u(()=>{Xt();C()});var dy={};x(dy,{detect:()=>gv,install:()=>yv,mergeHooks:()=>uy,meta:()=>hv,uninstall:()=>Ev,verify:()=>wv,writeImportLine:()=>ly});import{join as Ke}from"node:path";import{homedir as pv}from"node:os";import{existsSync as yt}from"node:fs";import{fileURLToPath as mv}from"node:url";import{dirname as Ti}from"node:path";async function gv(){return yt(jn)}async function ly({dryRun:e=!1}={}){let t=await import("node:fs/promises");e||await t.mkdir(jn,{recursive:!0});let r=`@${Ge}`,n="";if(yt(ae)&&(n=await t.readFile(ae,"utf8")),n.includes(r))return{action:"skip",path:ae,detail:"already imports sigil CLAUDE.md"};let o=n.trim()?`
|
|
657
|
+
`:"",i=`${n}${o}${r}
|
|
658
|
+
`;return{action:(await B(ae,i,{dryRun:e})).action,path:ae,detail:n?"+1 @import line":"new file"}}async function uy({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r={};try{let f=await t.readFile(se,"utf8");r=JSON.parse(f)}catch{}let n=Ke(cy,"src","hooks"),o=Ke(cy,"dist","hooks"),i=yt(o)?o:n,s={UserPromptSubmit:{hooks:[{type:"command",command:`node ${Ke(i,"user-prompt-submit.js")}`,timeout:10,statusMessage:"Searching memory..."}]},PostToolUse:{matcher:"Edit|Write|Bash",hooks:[{type:"command",command:`node ${Ke(i,"post-tool-use.js")}`,timeout:10,async:!0}]},Stop:{hooks:[{type:"command",command:`node ${Ke(i,"stop.js")}`,timeout:30,async:!0}]},SessionEnd:{hooks:[{type:"command",command:`node ${Ke(i,"session-end.js")}`,timeout:10,async:!0}]}},a=yt(se);r.hooks=r.hooks||{};let c=["user-prompt-submit.js","stop.js","post-tool-use.js","session-end.js"],l=f=>typeof f=="string"&&c.some(m=>f.endsWith(m)||f.includes(`/${m}`));for(let[f,m]of Object.entries(s)){let y=(r.hooks[f]||[]).filter(E=>!E.hooks?.some(b=>l(b.command)));r.hooks[f]=[...y,m]}e||await t.mkdir(jn,{recursive:!0});let d=JSON.stringify(r,null,2);return{action:(await B(se,d,{dryRun:e})).action,path:se,detail:a?"+UserPromptSubmit, +PostToolUse, +Stop, +SessionEnd hooks (other settings preserved)":"new settings.json with sigil hooks"}}async function yv({dryRun:e=!1}={}){let t=[],r=await Xa({dryRun:e});r&&t.push({action:r.action,path:r.path,detail:`${r.bytes??0} bytes`});let n=await ly({dryRun:e});n&&t.push(n);let o=await uy({dryRun:e});return o&&t.push(o),{actions:t}}async function wv(){let e=await import("node:fs/promises"),t=`@${Ge}`;if(!yt(ae))return{installed:!1,reason:"~/.claude/CLAUDE.md missing \u2014 run `sigil init`"};if(!(await e.readFile(ae,"utf8")).includes(t))return{installed:!1,reason:"@import line missing from ~/.claude/CLAUDE.md"};if(!yt(se))return{installed:!1,reason:"~/.claude/settings.json missing \u2014 hooks not registered"};let n;try{n=JSON.parse(await e.readFile(se,"utf8"))}catch{return{installed:!1,reason:"~/.claude/settings.json is not valid JSON"}}let o=n.hooks||{},s=["UserPromptSubmit","PostToolUse","Stop","SessionEnd"].filter(a=>!(o[a]||[]).some(l=>l.hooks?.some(d=>typeof d.command=="string"&&(d.command.includes("user-prompt-submit.js")||d.command.includes("post-tool-use.js")||d.command.includes("stop.js")||d.command.includes("session-end.js")))));return s.length?{installed:!1,reason:`hooks missing: ${s.join(", ")}`}:{installed:!0}}async function Ev({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r=[];if(yt(ae)){let n=`@${Ge}`,o=await t.readFile(ae,"utf8"),i=new RegExp(`^${n.replace(/[.*+?^${}()|[\\]\\\\]/g,"\\\\$&")}\\s*\\n?`,"gm"),s=o.replace(i,"");if(s!==o){let a=await B(ae,s,{dryRun:e});r.push({action:a.action,path:ae,detail:"-1 @import line"})}else r.push({action:"skip",path:ae,detail:"@import not present"})}if(yt(se)){let n;try{n=JSON.parse(await t.readFile(se,"utf8"))}catch{return r.push({action:"skip",path:se,detail:"invalid JSON \u2014 not touched"}),{actions:r}}let o=["user-prompt-submit.js","stop.js","post-tool-use.js","session-end.js"],i=a=>typeof a=="string"&&o.some(c=>a.endsWith(c)||a.includes(`/${c}`)),s=!1;for(let a of Object.keys(n.hooks||{})){let c=n.hooks[a],l=c.filter(d=>!d.hooks?.some(p=>i(p.command)));l.length!==c.length&&(s=!0,l.length===0?delete n.hooks[a]:n.hooks[a]=l)}if(s){let a=await B(se,JSON.stringify(n,null,2),{dryRun:e});r.push({action:a.action,path:se,detail:"sigil hooks removed (other entries preserved)"})}else r.push({action:"skip",path:se,detail:"no sigil hooks to remove"})}return{actions:r}}var jn,ae,se,cy,hv,fy=u(()=>{Br();Fr();jn=Ke(pv(),".claude"),ae=Ke(jn,"CLAUDE.md"),se=Ke(jn,"settings.json"),cy=Ti(Ti(Ti(Ti(mv(import.meta.url))))),hv={id:"claude-code",label:"Claude Code",hint:"hooks + @import \u2014 full auto-injection"}});var wy={};x(wy,{detect:()=>bv,install:()=>Iv,meta:()=>Av,resolveServerPath:()=>hy,uninstall:()=>Rv,verify:()=>Ov,writeMcpEntry:()=>gy,writeRulesFile:()=>yy});import{join as Bt,dirname as Wn}from"node:path";import{homedir as my}from"node:os";import{existsSync as Ft}from"node:fs";import{fileURLToPath as _v}from"node:url";async function bv(){return Ft(Ii)}function hy(){let e=Bt(py,"dist","server.js"),t=Bt(py,"src","server.js");return Ft(e)?e:t}async function gy({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r={};try{let i=await t.readFile(ce,"utf8");r=JSON.parse(i)}catch{}let n=Ft(ce);return r.mcpServers=r.mcpServers||{},r.mcpServers.sigil={command:process.execPath,args:[hy(),"--mcp"],env:{DOTENV_CONFIG_PATH:Sv}},e||await t.mkdir(Ii,{recursive:!0}),{action:(await B(ce,JSON.stringify(r,null,2),{dryRun:e})).action,path:ce,detail:n?"+sigil MCP server (other entries preserved)":"new mcp.json with sigil entry"}}function Tv(){return["---","description: Sigil persistent memory \u2014 consult before answering, save in batches","alwaysApply: true","---",""].join(`
|
|
659
|
+
`)+ht()}async function yy({dryRun:e=!1}={}){let t=await import("node:fs/promises");e||await t.mkdir(Wn(Ht),{recursive:!0});let r=await B(Ht,Tv(),{dryRun:e});return{action:r.action,path:Ht,detail:`${r.bytes??0} bytes, alwaysApply=true`}}async function Iv({dryRun:e=!1}={}){let t=[],r=await gy({dryRun:e});r&&t.push(r);let n=await yy({dryRun:e});return n&&t.push(n),{actions:t}}async function Ov(){let e=await import("node:fs/promises");if(!Ft(ce))return{installed:!1,reason:"~/.cursor/mcp.json missing"};let t;try{t=JSON.parse(await e.readFile(ce,"utf8"))}catch{return{installed:!1,reason:"~/.cursor/mcp.json is not valid JSON"}}return t.mcpServers?.sigil?Ft(Ht)?{installed:!0}:{installed:!1,reason:"~/.cursor/rules/sigil.mdc missing"}:{installed:!1,reason:"sigil entry missing from ~/.cursor/mcp.json"}}async function Rv({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r=[];if(Ft(ce)){let n;try{n=JSON.parse(await t.readFile(ce,"utf8"))}catch{return r.push({action:"skip",path:ce,detail:"invalid JSON \u2014 not touched"}),{actions:r}}if(n.mcpServers?.sigil){delete n.mcpServers.sigil;let o=await B(ce,JSON.stringify(n,null,2),{dryRun:e});r.push({action:o.action,path:ce,detail:"-sigil MCP entry"})}else r.push({action:"skip",path:ce,detail:"sigil entry not present"})}return Ft(Ht)&&(e||await t.unlink(Ht),r.push({action:"delete",path:Ht,detail:"sigil rules file removed"})),{actions:r}}var Ii,ce,Ht,xv,Sv,py,Av,Ey=u(()=>{Br();Fr();Ii=Bt(my(),".cursor"),ce=Bt(Ii,"mcp.json"),Ht=Bt(Ii,"rules","sigil.mdc"),xv=Bt(my(),".sigil"),Sv=Bt(xv,".env"),py=Wn(Wn(Wn(Wn(_v(import.meta.url))))),Av={id:"cursor",label:"Cursor",hint:"global MCP + always-applied rule (no native hooks)"}});var xy=J((SK,_y)=>{"use strict";var $t=class e extends Error{constructor(t,r,n){super("[ParserError] "+t,r,n),this.name="ParserError",this.code="ParserError",Error.captureStackTrace&&Error.captureStackTrace(this,e)}},Oi=class{constructor(t){this.parser=t,this.buf="",this.returned=null,this.result=null,this.resultTable=null,this.resultArr=null}},Kn=class{constructor(){this.pos=0,this.col=0,this.line=0,this.obj={},this.ctx=this.obj,this.stack=[],this._buf="",this.char=null,this.ii=0,this.state=new Oi(this.parseStart)}parse(t){if(t.length===0||t.length==null)return;this._buf=String(t),this.ii=-1,this.char=-1;let r;for(;r===!1||this.nextChar();)r=this.runOne();this._buf=null}nextChar(){return this.char===10&&(++this.line,this.col=-1),++this.ii,this.char=this._buf.codePointAt(this.ii),++this.pos,++this.col,this.haveBuffer()}haveBuffer(){return this.ii<this._buf.length}runOne(){return this.state.parser.call(this,this.state.returned)}finish(){this.char=1114112;let t;do t=this.state.parser,this.runOne();while(this.state.parser!==t);return this.ctx=null,this.state=null,this._buf=null,this.obj}next(t){if(typeof t!="function")throw new $t("Tried to set state to non-existent state: "+JSON.stringify(t));this.state.parser=t}goto(t){return this.next(t),this.runOne()}call(t,r){r&&this.next(r),this.stack.push(this.state),this.state=new Oi(t)}callNow(t,r){return this.call(t,r),this.runOne()}return(t){if(this.stack.length===0)throw this.error(new $t("Stack underflow"));t===void 0&&(t=this.state.buf),this.state=this.stack.pop(),this.state.returned=t}returnNow(t){return this.return(t),this.runOne()}consume(){if(this.char===1114112)throw this.error(new $t("Unexpected end-of-buffer"));this.state.buf+=this._buf[this.ii]}error(t){return t.line=this.line,t.col=this.col,t.pos=this.pos,t}parseStart(){throw new $t("Must declare a parseStart method")}};Kn.END=1114112;Kn.Error=$t;_y.exports=Kn});var Ay=J((AK,Sy)=>{"use strict";Sy.exports=e=>{let t=new Date(e);if(isNaN(t))throw new TypeError("Invalid Datetime");return t}});var Ri=J((bK,by)=>{"use strict";by.exports=(e,t)=>{for(t=String(t);t.length<e;)t="0"+t;return t}});var Iy=J((TK,Ty)=>{"use strict";var Kr=Ri(),fc=class extends Date{constructor(t){super(t+"Z"),this.isFloating=!0}toISOString(){let t=`${this.getUTCFullYear()}-${Kr(2,this.getUTCMonth()+1)}-${Kr(2,this.getUTCDate())}`,r=`${Kr(2,this.getUTCHours())}:${Kr(2,this.getUTCMinutes())}:${Kr(2,this.getUTCSeconds())}.${Kr(3,this.getUTCMilliseconds())}`;return`${t}T${r}`}};Ty.exports=e=>{let t=new fc(e);if(isNaN(t))throw new TypeError("Invalid Datetime");return t}});var Cy=J((IK,Ry)=>{"use strict";var Oy=Ri(),Cv=global.Date,pc=class extends Cv{constructor(t){super(t),this.isDate=!0}toISOString(){return`${this.getUTCFullYear()}-${Oy(2,this.getUTCMonth()+1)}-${Oy(2,this.getUTCDate())}`}};Ry.exports=e=>{let t=new pc(e);if(isNaN(t))throw new TypeError("Invalid Datetime");return t}});var vy=J((OK,Ny)=>{"use strict";var Ci=Ri(),mc=class extends Date{constructor(t){super(`0000-01-01T${t}Z`),this.isTime=!0}toISOString(){return`${Ci(2,this.getUTCHours())}:${Ci(2,this.getUTCMinutes())}:${Ci(2,this.getUTCSeconds())}.${Ci(3,this.getUTCMilliseconds())}`}};Ny.exports=e=>{let t=new mc(e);if(isNaN(t))throw new TypeError("Invalid Datetime");return t}});var Ni=J((exports,module)=>{"use strict";module.exports=makeParserClass(xy());module.exports.makeParserClass=makeParserClass;var TomlError=class e extends Error{constructor(t){super(t),this.name="TomlError",Error.captureStackTrace&&Error.captureStackTrace(this,e),this.fromTOML=!0,this.wrapped=null}};TomlError.wrap=e=>{let t=new TomlError(e.message);return t.code=e.code,t.wrapped=e,t};module.exports.TomlError=TomlError;var createDateTime=Ay(),createDateTimeFloat=Iy(),createDate=Cy(),createTime=vy(),CTRL_I=9,CTRL_J=10,CTRL_M=13,CTRL_CHAR_BOUNDARY=31,CHAR_SP=32,CHAR_QUOT=34,CHAR_NUM=35,CHAR_APOS=39,CHAR_PLUS=43,CHAR_COMMA=44,CHAR_HYPHEN=45,CHAR_PERIOD=46,CHAR_0=48,CHAR_1=49,CHAR_7=55,CHAR_9=57,CHAR_COLON=58,CHAR_EQUALS=61,CHAR_A=65,CHAR_E=69,CHAR_F=70,CHAR_T=84,CHAR_U=85,CHAR_Z=90,CHAR_LOWBAR=95,CHAR_a=97,CHAR_b=98,CHAR_e=101,CHAR_f=102,CHAR_i=105,CHAR_l=108,CHAR_n=110,CHAR_o=111,CHAR_r=114,CHAR_s=115,CHAR_t=116,CHAR_u=117,CHAR_x=120,CHAR_z=122,CHAR_LCUB=123,CHAR_RCUB=125,CHAR_LSQB=91,CHAR_BSOL=92,CHAR_RSQB=93,CHAR_DEL=127,SURROGATE_FIRST=55296,SURROGATE_LAST=57343,escapes={[CHAR_b]:"\b",[CHAR_t]:" ",[CHAR_n]:`
|
|
660
|
+
`,[CHAR_f]:"\f",[CHAR_r]:"\r",[CHAR_QUOT]:'"',[CHAR_BSOL]:"\\"};function isDigit(e){return e>=CHAR_0&&e<=CHAR_9}function isHexit(e){return e>=CHAR_A&&e<=CHAR_F||e>=CHAR_a&&e<=CHAR_f||e>=CHAR_0&&e<=CHAR_9}function isBit(e){return e===CHAR_1||e===CHAR_0}function isOctit(e){return e>=CHAR_0&&e<=CHAR_7}function isAlphaNumQuoteHyphen(e){return e>=CHAR_A&&e<=CHAR_Z||e>=CHAR_a&&e<=CHAR_z||e>=CHAR_0&&e<=CHAR_9||e===CHAR_APOS||e===CHAR_QUOT||e===CHAR_LOWBAR||e===CHAR_HYPHEN}function isAlphaNumHyphen(e){return e>=CHAR_A&&e<=CHAR_Z||e>=CHAR_a&&e<=CHAR_z||e>=CHAR_0&&e<=CHAR_9||e===CHAR_LOWBAR||e===CHAR_HYPHEN}var _type=Symbol("type"),_declared=Symbol("declared"),hasOwnProperty=Object.prototype.hasOwnProperty,defineProperty=Object.defineProperty,descriptor={configurable:!0,enumerable:!0,writable:!0,value:void 0};function hasKey(e,t){return hasOwnProperty.call(e,t)?!0:(t==="__proto__"&&defineProperty(e,"__proto__",descriptor),!1)}var INLINE_TABLE=Symbol("inline-table");function InlineTable(){return Object.defineProperties({},{[_type]:{value:INLINE_TABLE}})}function isInlineTable(e){return e===null||typeof e!="object"?!1:e[_type]===INLINE_TABLE}var TABLE=Symbol("table");function Table(){return Object.defineProperties({},{[_type]:{value:TABLE},[_declared]:{value:!1,writable:!0}})}function isTable(e){return e===null||typeof e!="object"?!1:e[_type]===TABLE}var _contentType=Symbol("content-type"),INLINE_LIST=Symbol("inline-list");function InlineList(e){return Object.defineProperties([],{[_type]:{value:INLINE_LIST},[_contentType]:{value:e}})}function isInlineList(e){return e===null||typeof e!="object"?!1:e[_type]===INLINE_LIST}var LIST=Symbol("list");function List(){return Object.defineProperties([],{[_type]:{value:LIST}})}function isList(e){return e===null||typeof e!="object"?!1:e[_type]===LIST}var _custom;try{let utilInspect=eval("require('util').inspect");_custom=utilInspect.custom}catch(e){}var _inspect=_custom||"inspect",BoxedBigInt=class{constructor(t){try{this.value=global.BigInt.asIntN(64,t)}catch{this.value=null}Object.defineProperty(this,_type,{value:INTEGER})}isNaN(){return this.value===null}toString(){return String(this.value)}[_inspect](){return`[BigInt: ${this.toString()}]}`}valueOf(){return this.value}},INTEGER=Symbol("integer");function Integer(e){let t=Number(e);return Object.is(t,-0)&&(t=0),global.BigInt&&!Number.isSafeInteger(t)?new BoxedBigInt(e):Object.defineProperties(new Number(t),{isNaN:{value:function(){return isNaN(this)}},[_type]:{value:INTEGER},[_inspect]:{value:()=>`[Integer: ${e}]`}})}function isInteger(e){return e===null||typeof e!="object"?!1:e[_type]===INTEGER}var FLOAT=Symbol("float");function Float(e){return Object.defineProperties(new Number(e),{[_type]:{value:FLOAT},[_inspect]:{value:()=>`[Float: ${e}]`}})}function isFloat(e){return e===null||typeof e!="object"?!1:e[_type]===FLOAT}function tomlType(e){let t=typeof e;if(t==="object"){if(e===null)return"null";if(e instanceof Date)return"datetime";if(_type in e)switch(e[_type]){case INLINE_TABLE:return"inline-table";case INLINE_LIST:return"inline-list";case TABLE:return"table";case LIST:return"list";case FLOAT:return"float";case INTEGER:return"integer"}}return t}function makeParserClass(e){class t extends e{constructor(){super(),this.ctx=this.obj=Table()}atEndOfWord(){return this.char===CHAR_NUM||this.char===CTRL_I||this.char===CHAR_SP||this.atEndOfLine()}atEndOfLine(){return this.char===e.END||this.char===CTRL_J||this.char===CTRL_M}parseStart(){if(this.char===e.END)return null;if(this.char===CHAR_LSQB)return this.call(this.parseTableOrList);if(this.char===CHAR_NUM)return this.call(this.parseComment);if(this.char===CTRL_J||this.char===CHAR_SP||this.char===CTRL_I||this.char===CTRL_M)return null;if(isAlphaNumQuoteHyphen(this.char))return this.callNow(this.parseAssignStatement);throw this.error(new TomlError(`Unknown character "${this.char}"`))}parseWhitespaceToEOL(){if(this.char===CHAR_SP||this.char===CTRL_I||this.char===CTRL_M)return null;if(this.char===CHAR_NUM)return this.goto(this.parseComment);if(this.char===e.END||this.char===CTRL_J)return this.return();throw this.error(new TomlError("Unexpected character, expected only whitespace or comments till end of line"))}parseAssignStatement(){return this.callNow(this.parseAssign,this.recordAssignStatement)}recordAssignStatement(n){let o=this.ctx,i=n.key.pop();for(let s of n.key){if(hasKey(o,s)&&(!isTable(o[s])||o[s][_declared]))throw this.error(new TomlError("Can't redefine existing key"));o=o[s]=o[s]||Table()}if(hasKey(o,i))throw this.error(new TomlError("Can't redefine existing key"));return isInteger(n.value)||isFloat(n.value)?o[i]=n.value.valueOf():o[i]=n.value,this.goto(this.parseWhitespaceToEOL)}parseAssign(){return this.callNow(this.parseKeyword,this.recordAssignKeyword)}recordAssignKeyword(n){return this.state.resultTable?this.state.resultTable.push(n):this.state.resultTable=[n],this.goto(this.parseAssignKeywordPreDot)}parseAssignKeywordPreDot(){if(this.char===CHAR_PERIOD)return this.next(this.parseAssignKeywordPostDot);if(this.char!==CHAR_SP&&this.char!==CTRL_I)return this.goto(this.parseAssignEqual)}parseAssignKeywordPostDot(){if(this.char!==CHAR_SP&&this.char!==CTRL_I)return this.callNow(this.parseKeyword,this.recordAssignKeyword)}parseAssignEqual(){if(this.char===CHAR_EQUALS)return this.next(this.parseAssignPreValue);throw this.error(new TomlError('Invalid character, expected "="'))}parseAssignPreValue(){return this.char===CHAR_SP||this.char===CTRL_I?null:this.callNow(this.parseValue,this.recordAssignValue)}recordAssignValue(n){return this.returnNow({key:this.state.resultTable,value:n})}parseComment(){do if(this.char===e.END||this.char===CTRL_J)return this.return();while(this.nextChar())}parseTableOrList(){if(this.char===CHAR_LSQB)this.next(this.parseList);else return this.goto(this.parseTable)}parseTable(){return this.ctx=this.obj,this.goto(this.parseTableNext)}parseTableNext(){return this.char===CHAR_SP||this.char===CTRL_I?null:this.callNow(this.parseKeyword,this.parseTableMore)}parseTableMore(n){if(this.char===CHAR_SP||this.char===CTRL_I)return null;if(this.char===CHAR_RSQB){if(hasKey(this.ctx,n)&&(!isTable(this.ctx[n])||this.ctx[n][_declared]))throw this.error(new TomlError("Can't redefine existing key"));return this.ctx=this.ctx[n]=this.ctx[n]||Table(),this.ctx[_declared]=!0,this.next(this.parseWhitespaceToEOL)}else if(this.char===CHAR_PERIOD){if(!hasKey(this.ctx,n))this.ctx=this.ctx[n]=Table();else if(isTable(this.ctx[n]))this.ctx=this.ctx[n];else if(isList(this.ctx[n]))this.ctx=this.ctx[n][this.ctx[n].length-1];else throw this.error(new TomlError("Can't redefine existing key"));return this.next(this.parseTableNext)}else throw this.error(new TomlError("Unexpected character, expected whitespace, . or ]"))}parseList(){return this.ctx=this.obj,this.goto(this.parseListNext)}parseListNext(){return this.char===CHAR_SP||this.char===CTRL_I?null:this.callNow(this.parseKeyword,this.parseListMore)}parseListMore(n){if(this.char===CHAR_SP||this.char===CTRL_I)return null;if(this.char===CHAR_RSQB){if(hasKey(this.ctx,n)||(this.ctx[n]=List()),isInlineList(this.ctx[n]))throw this.error(new TomlError("Can't extend an inline array"));if(isList(this.ctx[n])){let o=Table();this.ctx[n].push(o),this.ctx=o}else throw this.error(new TomlError("Can't redefine an existing key"));return this.next(this.parseListEnd)}else if(this.char===CHAR_PERIOD){if(!hasKey(this.ctx,n))this.ctx=this.ctx[n]=Table();else{if(isInlineList(this.ctx[n]))throw this.error(new TomlError("Can't extend an inline array"));if(isInlineTable(this.ctx[n]))throw this.error(new TomlError("Can't extend an inline table"));if(isList(this.ctx[n]))this.ctx=this.ctx[n][this.ctx[n].length-1];else if(isTable(this.ctx[n]))this.ctx=this.ctx[n];else throw this.error(new TomlError("Can't redefine an existing key"))}return this.next(this.parseListNext)}else throw this.error(new TomlError("Unexpected character, expected whitespace, . or ]"))}parseListEnd(n){if(this.char===CHAR_RSQB)return this.next(this.parseWhitespaceToEOL);throw this.error(new TomlError("Unexpected character, expected whitespace, . or ]"))}parseValue(){if(this.char===e.END)throw this.error(new TomlError("Key without value"));if(this.char===CHAR_QUOT)return this.next(this.parseDoubleString);if(this.char===CHAR_APOS)return this.next(this.parseSingleString);if(this.char===CHAR_HYPHEN||this.char===CHAR_PLUS)return this.goto(this.parseNumberSign);if(this.char===CHAR_i)return this.next(this.parseInf);if(this.char===CHAR_n)return this.next(this.parseNan);if(isDigit(this.char))return this.goto(this.parseNumberOrDateTime);if(this.char===CHAR_t||this.char===CHAR_f)return this.goto(this.parseBoolean);if(this.char===CHAR_LSQB)return this.call(this.parseInlineList,this.recordValue);if(this.char===CHAR_LCUB)return this.call(this.parseInlineTable,this.recordValue);throw this.error(new TomlError("Unexpected character, expecting string, number, datetime, boolean, inline array or inline table"))}recordValue(n){return this.returnNow(n)}parseInf(){if(this.char===CHAR_n)return this.next(this.parseInf2);throw this.error(new TomlError('Unexpected character, expected "inf", "+inf" or "-inf"'))}parseInf2(){if(this.char===CHAR_f)return this.state.buf==="-"?this.return(-1/0):this.return(1/0);throw this.error(new TomlError('Unexpected character, expected "inf", "+inf" or "-inf"'))}parseNan(){if(this.char===CHAR_a)return this.next(this.parseNan2);throw this.error(new TomlError('Unexpected character, expected "nan"'))}parseNan2(){if(this.char===CHAR_n)return this.return(NaN);throw this.error(new TomlError('Unexpected character, expected "nan"'))}parseKeyword(){return this.char===CHAR_QUOT?this.next(this.parseBasicString):this.char===CHAR_APOS?this.next(this.parseLiteralString):this.goto(this.parseBareKey)}parseBareKey(){do{if(this.char===e.END)throw this.error(new TomlError("Key ended without value"));if(isAlphaNumHyphen(this.char))this.consume();else{if(this.state.buf.length===0)throw this.error(new TomlError("Empty bare keys are not allowed"));return this.returnNow()}}while(this.nextChar())}parseSingleString(){return this.char===CHAR_APOS?this.next(this.parseLiteralMultiStringMaybe):this.goto(this.parseLiteralString)}parseLiteralString(){do{if(this.char===CHAR_APOS)return this.return();if(this.atEndOfLine())throw this.error(new TomlError("Unterminated string"));if(this.char===CHAR_DEL||this.char<=CTRL_CHAR_BOUNDARY&&this.char!==CTRL_I)throw this.errorControlCharInString();this.consume()}while(this.nextChar())}parseLiteralMultiStringMaybe(){return this.char===CHAR_APOS?this.next(this.parseLiteralMultiString):this.returnNow()}parseLiteralMultiString(){return this.char===CTRL_M?null:this.char===CTRL_J?this.next(this.parseLiteralMultiStringContent):this.goto(this.parseLiteralMultiStringContent)}parseLiteralMultiStringContent(){do{if(this.char===CHAR_APOS)return this.next(this.parseLiteralMultiEnd);if(this.char===e.END)throw this.error(new TomlError("Unterminated multi-line string"));if(this.char===CHAR_DEL||this.char<=CTRL_CHAR_BOUNDARY&&this.char!==CTRL_I&&this.char!==CTRL_J&&this.char!==CTRL_M)throw this.errorControlCharInString();this.consume()}while(this.nextChar())}parseLiteralMultiEnd(){return this.char===CHAR_APOS?this.next(this.parseLiteralMultiEnd2):(this.state.buf+="'",this.goto(this.parseLiteralMultiStringContent))}parseLiteralMultiEnd2(){return this.char===CHAR_APOS?this.return():(this.state.buf+="''",this.goto(this.parseLiteralMultiStringContent))}parseDoubleString(){return this.char===CHAR_QUOT?this.next(this.parseMultiStringMaybe):this.goto(this.parseBasicString)}parseBasicString(){do{if(this.char===CHAR_BSOL)return this.call(this.parseEscape,this.recordEscapeReplacement);if(this.char===CHAR_QUOT)return this.return();if(this.atEndOfLine())throw this.error(new TomlError("Unterminated string"));if(this.char===CHAR_DEL||this.char<=CTRL_CHAR_BOUNDARY&&this.char!==CTRL_I)throw this.errorControlCharInString();this.consume()}while(this.nextChar())}recordEscapeReplacement(n){return this.state.buf+=n,this.goto(this.parseBasicString)}parseMultiStringMaybe(){return this.char===CHAR_QUOT?this.next(this.parseMultiString):this.returnNow()}parseMultiString(){return this.char===CTRL_M?null:this.char===CTRL_J?this.next(this.parseMultiStringContent):this.goto(this.parseMultiStringContent)}parseMultiStringContent(){do{if(this.char===CHAR_BSOL)return this.call(this.parseMultiEscape,this.recordMultiEscapeReplacement);if(this.char===CHAR_QUOT)return this.next(this.parseMultiEnd);if(this.char===e.END)throw this.error(new TomlError("Unterminated multi-line string"));if(this.char===CHAR_DEL||this.char<=CTRL_CHAR_BOUNDARY&&this.char!==CTRL_I&&this.char!==CTRL_J&&this.char!==CTRL_M)throw this.errorControlCharInString();this.consume()}while(this.nextChar())}errorControlCharInString(){let n="\\u00";return this.char<16&&(n+="0"),n+=this.char.toString(16),this.error(new TomlError(`Control characters (codes < 0x1f and 0x7f) are not allowed in strings, use ${n} instead`))}recordMultiEscapeReplacement(n){return this.state.buf+=n,this.goto(this.parseMultiStringContent)}parseMultiEnd(){return this.char===CHAR_QUOT?this.next(this.parseMultiEnd2):(this.state.buf+='"',this.goto(this.parseMultiStringContent))}parseMultiEnd2(){return this.char===CHAR_QUOT?this.return():(this.state.buf+='""',this.goto(this.parseMultiStringContent))}parseMultiEscape(){return this.char===CTRL_M||this.char===CTRL_J?this.next(this.parseMultiTrim):this.char===CHAR_SP||this.char===CTRL_I?this.next(this.parsePreMultiTrim):this.goto(this.parseEscape)}parsePreMultiTrim(){if(this.char===CHAR_SP||this.char===CTRL_I)return null;if(this.char===CTRL_M||this.char===CTRL_J)return this.next(this.parseMultiTrim);throw this.error(new TomlError("Can't escape whitespace"))}parseMultiTrim(){return this.char===CTRL_J||this.char===CHAR_SP||this.char===CTRL_I||this.char===CTRL_M?null:this.returnNow()}parseEscape(){if(this.char in escapes)return this.return(escapes[this.char]);if(this.char===CHAR_u)return this.call(this.parseSmallUnicode,this.parseUnicodeReturn);if(this.char===CHAR_U)return this.call(this.parseLargeUnicode,this.parseUnicodeReturn);throw this.error(new TomlError("Unknown escape character: "+this.char))}parseUnicodeReturn(n){try{let o=parseInt(n,16);if(o>=SURROGATE_FIRST&&o<=SURROGATE_LAST)throw this.error(new TomlError("Invalid unicode, character in range 0xD800 - 0xDFFF is reserved"));return this.returnNow(String.fromCodePoint(o))}catch(o){throw this.error(TomlError.wrap(o))}}parseSmallUnicode(){if(isHexit(this.char)){if(this.consume(),this.state.buf.length>=4)return this.return()}else throw this.error(new TomlError("Invalid character in unicode sequence, expected hex"))}parseLargeUnicode(){if(isHexit(this.char)){if(this.consume(),this.state.buf.length>=8)return this.return()}else throw this.error(new TomlError("Invalid character in unicode sequence, expected hex"))}parseNumberSign(){return this.consume(),this.next(this.parseMaybeSignedInfOrNan)}parseMaybeSignedInfOrNan(){return this.char===CHAR_i?this.next(this.parseInf):this.char===CHAR_n?this.next(this.parseNan):this.callNow(this.parseNoUnder,this.parseNumberIntegerStart)}parseNumberIntegerStart(){return this.char===CHAR_0?(this.consume(),this.next(this.parseNumberIntegerExponentOrDecimal)):this.goto(this.parseNumberInteger)}parseNumberIntegerExponentOrDecimal(){return this.char===CHAR_PERIOD?(this.consume(),this.call(this.parseNoUnder,this.parseNumberFloat)):this.char===CHAR_E||this.char===CHAR_e?(this.consume(),this.next(this.parseNumberExponentSign)):this.returnNow(Integer(this.state.buf))}parseNumberInteger(){if(isDigit(this.char))this.consume();else{if(this.char===CHAR_LOWBAR)return this.call(this.parseNoUnder);if(this.char===CHAR_E||this.char===CHAR_e)return this.consume(),this.next(this.parseNumberExponentSign);if(this.char===CHAR_PERIOD)return this.consume(),this.call(this.parseNoUnder,this.parseNumberFloat);{let n=Integer(this.state.buf);if(n.isNaN())throw this.error(new TomlError("Invalid number"));return this.returnNow(n)}}}parseNoUnder(){if(this.char===CHAR_LOWBAR||this.char===CHAR_PERIOD||this.char===CHAR_E||this.char===CHAR_e)throw this.error(new TomlError("Unexpected character, expected digit"));if(this.atEndOfWord())throw this.error(new TomlError("Incomplete number"));return this.returnNow()}parseNoUnderHexOctBinLiteral(){if(this.char===CHAR_LOWBAR||this.char===CHAR_PERIOD)throw this.error(new TomlError("Unexpected character, expected digit"));if(this.atEndOfWord())throw this.error(new TomlError("Incomplete number"));return this.returnNow()}parseNumberFloat(){if(this.char===CHAR_LOWBAR)return this.call(this.parseNoUnder,this.parseNumberFloat);if(isDigit(this.char))this.consume();else return this.char===CHAR_E||this.char===CHAR_e?(this.consume(),this.next(this.parseNumberExponentSign)):this.returnNow(Float(this.state.buf))}parseNumberExponentSign(){if(isDigit(this.char))return this.goto(this.parseNumberExponent);if(this.char===CHAR_HYPHEN||this.char===CHAR_PLUS)this.consume(),this.call(this.parseNoUnder,this.parseNumberExponent);else throw this.error(new TomlError("Unexpected character, expected -, + or digit"))}parseNumberExponent(){if(isDigit(this.char))this.consume();else return this.char===CHAR_LOWBAR?this.call(this.parseNoUnder):this.returnNow(Float(this.state.buf))}parseNumberOrDateTime(){return this.char===CHAR_0?(this.consume(),this.next(this.parseNumberBaseOrDateTime)):this.goto(this.parseNumberOrDateTimeOnly)}parseNumberOrDateTimeOnly(){if(this.char===CHAR_LOWBAR)return this.call(this.parseNoUnder,this.parseNumberInteger);if(isDigit(this.char))this.consume(),this.state.buf.length>4&&this.next(this.parseNumberInteger);else return this.char===CHAR_E||this.char===CHAR_e?(this.consume(),this.next(this.parseNumberExponentSign)):this.char===CHAR_PERIOD?(this.consume(),this.call(this.parseNoUnder,this.parseNumberFloat)):this.char===CHAR_HYPHEN?this.goto(this.parseDateTime):this.char===CHAR_COLON?this.goto(this.parseOnlyTimeHour):this.returnNow(Integer(this.state.buf))}parseDateTimeOnly(){if(this.state.buf.length<4){if(isDigit(this.char))return this.consume();if(this.char===CHAR_COLON)return this.goto(this.parseOnlyTimeHour);throw this.error(new TomlError("Expected digit while parsing year part of a date"))}else{if(this.char===CHAR_HYPHEN)return this.goto(this.parseDateTime);throw this.error(new TomlError("Expected hyphen (-) while parsing year part of date"))}}parseNumberBaseOrDateTime(){return this.char===CHAR_b?(this.consume(),this.call(this.parseNoUnderHexOctBinLiteral,this.parseIntegerBin)):this.char===CHAR_o?(this.consume(),this.call(this.parseNoUnderHexOctBinLiteral,this.parseIntegerOct)):this.char===CHAR_x?(this.consume(),this.call(this.parseNoUnderHexOctBinLiteral,this.parseIntegerHex)):this.char===CHAR_PERIOD?this.goto(this.parseNumberInteger):isDigit(this.char)?this.goto(this.parseDateTimeOnly):this.returnNow(Integer(this.state.buf))}parseIntegerHex(){if(isHexit(this.char))this.consume();else{if(this.char===CHAR_LOWBAR)return this.call(this.parseNoUnderHexOctBinLiteral);{let n=Integer(this.state.buf);if(n.isNaN())throw this.error(new TomlError("Invalid number"));return this.returnNow(n)}}}parseIntegerOct(){if(isOctit(this.char))this.consume();else{if(this.char===CHAR_LOWBAR)return this.call(this.parseNoUnderHexOctBinLiteral);{let n=Integer(this.state.buf);if(n.isNaN())throw this.error(new TomlError("Invalid number"));return this.returnNow(n)}}}parseIntegerBin(){if(isBit(this.char))this.consume();else{if(this.char===CHAR_LOWBAR)return this.call(this.parseNoUnderHexOctBinLiteral);{let n=Integer(this.state.buf);if(n.isNaN())throw this.error(new TomlError("Invalid number"));return this.returnNow(n)}}}parseDateTime(){if(this.state.buf.length<4)throw this.error(new TomlError("Years less than 1000 must be zero padded to four characters"));return this.state.result=this.state.buf,this.state.buf="",this.next(this.parseDateMonth)}parseDateMonth(){if(this.char===CHAR_HYPHEN){if(this.state.buf.length<2)throw this.error(new TomlError("Months less than 10 must be zero padded to two characters"));return this.state.result+="-"+this.state.buf,this.state.buf="",this.next(this.parseDateDay)}else if(isDigit(this.char))this.consume();else throw this.error(new TomlError("Incomplete datetime"))}parseDateDay(){if(this.char===CHAR_T||this.char===CHAR_SP){if(this.state.buf.length<2)throw this.error(new TomlError("Days less than 10 must be zero padded to two characters"));return this.state.result+="-"+this.state.buf,this.state.buf="",this.next(this.parseStartTimeHour)}else{if(this.atEndOfWord())return this.returnNow(createDate(this.state.result+"-"+this.state.buf));if(isDigit(this.char))this.consume();else throw this.error(new TomlError("Incomplete datetime"))}}parseStartTimeHour(){return this.atEndOfWord()?this.returnNow(createDate(this.state.result)):this.goto(this.parseTimeHour)}parseTimeHour(){if(this.char===CHAR_COLON){if(this.state.buf.length<2)throw this.error(new TomlError("Hours less than 10 must be zero padded to two characters"));return this.state.result+="T"+this.state.buf,this.state.buf="",this.next(this.parseTimeMin)}else if(isDigit(this.char))this.consume();else throw this.error(new TomlError("Incomplete datetime"))}parseTimeMin(){if(this.state.buf.length<2&&isDigit(this.char))this.consume();else{if(this.state.buf.length===2&&this.char===CHAR_COLON)return this.state.result+=":"+this.state.buf,this.state.buf="",this.next(this.parseTimeSec);throw this.error(new TomlError("Incomplete datetime"))}}parseTimeSec(){if(isDigit(this.char)){if(this.consume(),this.state.buf.length===2)return this.state.result+=":"+this.state.buf,this.state.buf="",this.next(this.parseTimeZoneOrFraction)}else throw this.error(new TomlError("Incomplete datetime"))}parseOnlyTimeHour(){if(this.char===CHAR_COLON){if(this.state.buf.length<2)throw this.error(new TomlError("Hours less than 10 must be zero padded to two characters"));return this.state.result=this.state.buf,this.state.buf="",this.next(this.parseOnlyTimeMin)}else throw this.error(new TomlError("Incomplete time"))}parseOnlyTimeMin(){if(this.state.buf.length<2&&isDigit(this.char))this.consume();else{if(this.state.buf.length===2&&this.char===CHAR_COLON)return this.state.result+=":"+this.state.buf,this.state.buf="",this.next(this.parseOnlyTimeSec);throw this.error(new TomlError("Incomplete time"))}}parseOnlyTimeSec(){if(isDigit(this.char)){if(this.consume(),this.state.buf.length===2)return this.next(this.parseOnlyTimeFractionMaybe)}else throw this.error(new TomlError("Incomplete time"))}parseOnlyTimeFractionMaybe(){if(this.state.result+=":"+this.state.buf,this.char===CHAR_PERIOD)this.state.buf="",this.next(this.parseOnlyTimeFraction);else return this.return(createTime(this.state.result))}parseOnlyTimeFraction(){if(isDigit(this.char))this.consume();else if(this.atEndOfWord()){if(this.state.buf.length===0)throw this.error(new TomlError("Expected digit in milliseconds"));return this.returnNow(createTime(this.state.result+"."+this.state.buf))}else throw this.error(new TomlError("Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z"))}parseTimeZoneOrFraction(){if(this.char===CHAR_PERIOD)this.consume(),this.next(this.parseDateTimeFraction);else if(this.char===CHAR_HYPHEN||this.char===CHAR_PLUS)this.consume(),this.next(this.parseTimeZoneHour);else{if(this.char===CHAR_Z)return this.consume(),this.return(createDateTime(this.state.result+this.state.buf));if(this.atEndOfWord())return this.returnNow(createDateTimeFloat(this.state.result+this.state.buf));throw this.error(new TomlError("Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z"))}}parseDateTimeFraction(){if(isDigit(this.char))this.consume();else{if(this.state.buf.length===1)throw this.error(new TomlError("Expected digit in milliseconds"));if(this.char===CHAR_HYPHEN||this.char===CHAR_PLUS)this.consume(),this.next(this.parseTimeZoneHour);else{if(this.char===CHAR_Z)return this.consume(),this.return(createDateTime(this.state.result+this.state.buf));if(this.atEndOfWord())return this.returnNow(createDateTimeFloat(this.state.result+this.state.buf));throw this.error(new TomlError("Unexpected character in datetime, expected period (.), minus (-), plus (+) or Z"))}}}parseTimeZoneHour(){if(isDigit(this.char)){if(this.consume(),/\d\d$/.test(this.state.buf))return this.next(this.parseTimeZoneSep)}else throw this.error(new TomlError("Unexpected character in datetime, expected digit"))}parseTimeZoneSep(){if(this.char===CHAR_COLON)this.consume(),this.next(this.parseTimeZoneMin);else throw this.error(new TomlError("Unexpected character in datetime, expected colon"))}parseTimeZoneMin(){if(isDigit(this.char)){if(this.consume(),/\d\d$/.test(this.state.buf))return this.return(createDateTime(this.state.result+this.state.buf))}else throw this.error(new TomlError("Unexpected character in datetime, expected digit"))}parseBoolean(){if(this.char===CHAR_t)return this.consume(),this.next(this.parseTrue_r);if(this.char===CHAR_f)return this.consume(),this.next(this.parseFalse_a)}parseTrue_r(){if(this.char===CHAR_r)return this.consume(),this.next(this.parseTrue_u);throw this.error(new TomlError("Invalid boolean, expected true or false"))}parseTrue_u(){if(this.char===CHAR_u)return this.consume(),this.next(this.parseTrue_e);throw this.error(new TomlError("Invalid boolean, expected true or false"))}parseTrue_e(){if(this.char===CHAR_e)return this.return(!0);throw this.error(new TomlError("Invalid boolean, expected true or false"))}parseFalse_a(){if(this.char===CHAR_a)return this.consume(),this.next(this.parseFalse_l);throw this.error(new TomlError("Invalid boolean, expected true or false"))}parseFalse_l(){if(this.char===CHAR_l)return this.consume(),this.next(this.parseFalse_s);throw this.error(new TomlError("Invalid boolean, expected true or false"))}parseFalse_s(){if(this.char===CHAR_s)return this.consume(),this.next(this.parseFalse_e);throw this.error(new TomlError("Invalid boolean, expected true or false"))}parseFalse_e(){if(this.char===CHAR_e)return this.return(!1);throw this.error(new TomlError("Invalid boolean, expected true or false"))}parseInlineList(){if(this.char===CHAR_SP||this.char===CTRL_I||this.char===CTRL_M||this.char===CTRL_J)return null;if(this.char===e.END)throw this.error(new TomlError("Unterminated inline array"));return this.char===CHAR_NUM?this.call(this.parseComment):this.char===CHAR_RSQB?this.return(this.state.resultArr||InlineList()):this.callNow(this.parseValue,this.recordInlineListValue)}recordInlineListValue(n){if(this.state.resultArr){let o=this.state.resultArr[_contentType],i=tomlType(n);if(o!==i)throw this.error(new TomlError(`Inline lists must be a single type, not a mix of ${o} and ${i}`))}else this.state.resultArr=InlineList(tomlType(n));return isFloat(n)||isInteger(n)?this.state.resultArr.push(n.valueOf()):this.state.resultArr.push(n),this.goto(this.parseInlineListNext)}parseInlineListNext(){if(this.char===CHAR_SP||this.char===CTRL_I||this.char===CTRL_M||this.char===CTRL_J)return null;if(this.char===CHAR_NUM)return this.call(this.parseComment);if(this.char===CHAR_COMMA)return this.next(this.parseInlineList);if(this.char===CHAR_RSQB)return this.goto(this.parseInlineList);throw this.error(new TomlError("Invalid character, expected whitespace, comma (,) or close bracket (])"))}parseInlineTable(){if(this.char===CHAR_SP||this.char===CTRL_I)return null;if(this.char===e.END||this.char===CHAR_NUM||this.char===CTRL_J||this.char===CTRL_M)throw this.error(new TomlError("Unterminated inline array"));return this.char===CHAR_RCUB?this.return(this.state.resultTable||InlineTable()):(this.state.resultTable||(this.state.resultTable=InlineTable()),this.callNow(this.parseAssign,this.recordInlineTableValue))}recordInlineTableValue(n){let o=this.state.resultTable,i=n.key.pop();for(let s of n.key){if(hasKey(o,s)&&(!isTable(o[s])||o[s][_declared]))throw this.error(new TomlError("Can't redefine existing key"));o=o[s]=o[s]||Table()}if(hasKey(o,i))throw this.error(new TomlError("Can't redefine existing key"));return isInteger(n.value)||isFloat(n.value)?o[i]=n.value.valueOf():o[i]=n.value,this.goto(this.parseInlineTableNext)}parseInlineTableNext(){if(this.char===CHAR_SP||this.char===CTRL_I)return null;if(this.char===e.END||this.char===CHAR_NUM||this.char===CTRL_J||this.char===CTRL_M)throw this.error(new TomlError("Unterminated inline array"));if(this.char===CHAR_COMMA)return this.next(this.parseInlineTable);if(this.char===CHAR_RCUB)return this.goto(this.parseInlineTable);throw this.error(new TomlError("Invalid character, expected whitespace, comma (,) or close bracket (])"))}}return t}});var vi=J((RK,Dy)=>{"use strict";Dy.exports=Nv;function Nv(e,t){if(e.pos==null||e.line==null)return e;let r=e.message;if(r+=` at row ${e.line+1}, col ${e.col+1}, pos ${e.pos}:
|
|
661
|
+
`,t&&t.split){let n=t.split(/\n/),o=String(Math.min(n.length,e.line+3)).length,i=" ";for(;i.length<o;)i+=" ";for(let s=Math.max(0,e.line-1);s<Math.min(n.length,e.line+2);++s){let a=String(s+1);if(a.length<o&&(a=" "+a),e.line===s){r+=a+"> "+n[s]+`
|
|
662
|
+
`,r+=i+" ";for(let c=0;c<e.col;++c)r+=" ";r+=`^
|
|
663
|
+
`}else r+=a+": "+n[s]+`
|
|
664
|
+
`}}return e.message=r+`
|
|
665
|
+
`,e}});var Py=J((CK,Ly)=>{"use strict";Ly.exports=Lv;var vv=Ni(),Dv=vi();function Lv(e){global.Buffer&&global.Buffer.isBuffer(e)&&(e=e.toString("utf8"));let t=new vv;try{return t.parse(e),t.finish()}catch(r){throw Dv(r,e)}}});var Hy=J((NK,My)=>{"use strict";My.exports=kv;var Pv=Ni(),ky=vi();function kv(e,t){t||(t={});let r=0,n=t.blocksize||40960,o=new Pv;return new Promise((s,a)=>{setImmediate(i,r,n,s,a)});function i(s,a,c,l){if(s>=e.length)try{return c(o.finish())}catch(d){return l(ky(d,e))}try{o.parse(e.slice(s,s+a)),setImmediate(i,s+a,a,c,l)}catch(d){l(ky(d,e))}}}});var $y=J((vK,Fy)=>{"use strict";Fy.exports=Hv;var Mv=Yw("stream"),By=Ni();function Hv(e){return e?Bv(e):Fv(e)}function Bv(e){let t=new By;return e.setEncoding("utf8"),new Promise((r,n)=>{let o,i=!1,s=!1;function a(){if(i=!0,!o)try{r(t.finish())}catch(d){n(d)}}function c(d){s=!0,n(d)}e.once("end",a),e.once("error",c),l();function l(){o=!0;let d;for(;(d=e.read())!==null;)try{t.parse(d)}catch(p){return c(p)}if(o=!1,i)return a();s||e.once("readable",l)}})}function Fv(){let e=new By;return new Mv.Transform({objectMode:!0,transform(t,r,n){try{e.parse(t.toString(r))}catch(o){this.emit("error",o)}n()},flush(t){try{this.push(e.finish())}catch(r){this.emit("error",r)}t()}})}});var Uy=J((DK,Yn)=>{"use strict";Yn.exports=Py();Yn.exports.async=Hy();Yn.exports.stream=$y();Yn.exports.prettyError=vi()});var Jy=J((LK,yc)=>{"use strict";yc.exports=$v;yc.exports.value=gc;function $v(e){if(e===null)throw Ut("null");if(e===void 0)throw Ut("undefined");if(typeof e!="object")throw Ut(typeof e);if(typeof e.toJSON=="function"&&(e=e.toJSON()),e==null)return null;let t=X(e);if(t!=="table")throw Ut(t);return hc("","",e)}function Ut(e){return new Error("Can only stringify objects, not "+e)}function Uv(){return new Error("Array values can't have mixed types")}function Gy(e){return Object.keys(e).filter(t=>jy(e[t]))}function Gv(e){return Object.keys(e).filter(t=>!jy(e[t]))}function Di(e){let t=Array.isArray(e)?[]:Object.prototype.hasOwnProperty.call(e,"__proto__")?{["__proto__"]:void 0}:{};for(let r of Object.keys(e))e[r]&&typeof e[r].toJSON=="function"&&!("toISOString"in e[r])?t[r]=e[r].toJSON():t[r]=e[r];return t}function hc(e,t,r){r=Di(r);var n,o;n=Gy(r),o=Gv(r);var i=[],s=t||"";n.forEach(c=>{var l=X(r[c]);l!=="undefined"&&l!=="null"&&i.push(s+Li(c)+" = "+Yy(r[c],!0))}),i.length>0&&i.push("");var a=e&&n.length>0?t+" ":"";return o.forEach(c=>{i.push(Qv(e,a,c,r[c]))}),i.join(`
|
|
666
|
+
`)}function jy(e){switch(X(e)){case"undefined":case"null":case"integer":case"nan":case"float":case"boolean":case"string":case"datetime":return!0;case"array":return e.length===0||X(e[0])!=="table";case"table":return Object.keys(e).length===0;default:return!1}}function X(e){return e===void 0?"undefined":e===null?"null":typeof e=="bigint"||Number.isInteger(e)&&!Object.is(e,-0)?"integer":typeof e=="number"?"float":typeof e=="boolean"?"boolean":typeof e=="string"?"string":"toISOString"in e?isNaN(e)?"undefined":"datetime":Array.isArray(e)?"array":"table"}function Li(e){var t=String(e);return/^[-A-Za-z0-9_]+$/.test(t)?t:Wy(t)}function Wy(e){return'"'+Ky(e).replace(/"/g,'\\"')+'"'}function jv(e){return"'"+e+"'"}function Wv(e,t){for(;t.length<e;)t="0"+t;return t}function Ky(e){return e.replace(/\\/g,"\\\\").replace(/[\b]/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/([\u0000-\u001f\u007f])/,t=>"\\u"+Wv(4,t.codePointAt(0).toString(16)))}function Kv(e){let t=e.split(/\n/).map(r=>Ky(r).replace(/"(?="")/g,'\\"')).join(`
|
|
667
|
+
`);return t.slice(-1)==='"'&&(t+=`\\
|
|
668
|
+
`),`"""
|
|
669
|
+
`+t+'"""'}function Yy(e,t){let r=X(e);return r==="string"&&(t&&/\n/.test(e)?r="string-multiline":!/[\b\t\n\f\r']/.test(e)&&/"/.test(e)&&(r="string-literal")),gc(e,r)}function gc(e,t){switch(t||(t=X(e)),t){case"string-multiline":return Kv(e);case"string":return Wy(e);case"string-literal":return jv(e);case"integer":return Vy(e);case"float":return Yv(e);case"boolean":return Vv(e);case"datetime":return qv(e);case"array":return Xv(e.filter(r=>X(r)!=="null"&&X(r)!=="undefined"&&X(r)!=="nan"));case"table":return Zv(e);default:throw Ut(t)}}function Vy(e){return String(e).replace(/\B(?=(\d{3})+(?!\d))/g,"_")}function Yv(e){if(e===1/0)return"inf";if(e===-1/0)return"-inf";if(Object.is(e,NaN))return"nan";if(Object.is(e,-0))return"-0.0";var t=String(e).split("."),r=t[0],n=t[1]||0;return Vy(r)+"."+n}function Vv(e){return String(e)}function qv(e){return e.toISOString()}function Jv(e){return e==="float"||e==="integer"}function zv(e){var t=X(e[0]);return e.every(r=>X(r)===t)?t:e.every(r=>Jv(X(r)))?"float":"mixed"}function qy(e){let t=zv(e);if(t==="mixed")throw Uv();return t}function Xv(e){e=Di(e);let t=qy(e);var r="[",n=e.map(o=>gc(o,t));return n.join(", ").length>60||/\n/.test(n)?r+=`
|
|
670
|
+
`+n.join(`,
|
|
671
|
+
`)+`
|
|
672
|
+
`:r+=" "+n.join(", ")+(n.length>0?" ":""),r+"]"}function Zv(e){e=Di(e);var t=[];return Object.keys(e).forEach(r=>{t.push(Li(r)+" = "+Yy(e[r],!1))}),"{ "+t.join(", ")+(t.length>0?" ":"")+"}"}function Qv(e,t,r,n){var o=X(n);if(o==="array")return eD(e,t,r,n);if(o==="table")return tD(e,t,r,n);throw Ut(o)}function eD(e,t,r,n){n=Di(n),qy(n);var o=X(n[0]);if(o!=="table")throw Ut(o);var i=e+Li(r),s="";return n.forEach(a=>{s.length>0&&(s+=`
|
|
673
|
+
`),s+=t+"[["+i+`]]
|
|
674
|
+
`,s+=hc(i+".",t,a)}),s}function tD(e,t,r,n){var o=e+Li(r),i="";return Gy(n).length>0&&(i+=t+"["+o+`]
|
|
675
|
+
`),i+hc(o+".",t,n)}});var zy=J(wc=>{"use strict";wc.parse=Uy();wc.stringify=Jy()});var rw={};x(rw,{detect:()=>iD,install:()=>aD,meta:()=>oD,resolveServerPath:()=>Qy,uninstall:()=>lD,verify:()=>cD,writeAgentsFile:()=>tw,writeMcpEntry:()=>ew});import{join as Yr,dirname as Pi}from"node:path";import{homedir as Zy}from"node:os";import{existsSync as wt}from"node:fs";import{fileURLToPath as rD}from"node:url";async function iD(){return wt(Vn)}function Qy(){let e=Yr(Xy,"dist","server.js"),t=Yr(Xy,"src","server.js");return wt(e)?e:t}async function ew({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r={};try{let i=await t.readFile(le,"utf8");r=Vr.default.parse(i)}catch{}let n=wt(le);return r.mcp_servers=r.mcp_servers||{},r.mcp_servers.sigil={command:process.execPath,args:[Qy(),"--mcp"],env:{DOTENV_CONFIG_PATH:nD}},e||await t.mkdir(Vn,{recursive:!0}),{action:(await B(le,Vr.default.stringify(r),{dryRun:e})).action,path:le,detail:n?"+[mcp_servers.sigil] (other keys preserved)":"new config.toml with sigil MCP entry"}}function sD(){return[ki,ht(),qr].join(`
|
|
676
|
+
`)}async function tw({dryRun:e=!1}={}){let t=await import("node:fs/promises");e||await t.mkdir(Vn,{recursive:!0});let r="";wt(ue)&&(r=await t.readFile(ue,"utf8"));let n=sD(),o,i,s=r.indexOf(ki),a=r.indexOf(qr);if(s!==-1&&a!==-1&&a>s){let l=r.slice(0,s),d=r.slice(a+qr.length);o=`${l}${n}${d}`,i="sigil block replaced (other content preserved)"}else if(!r.trim())o=`${n}
|
|
677
|
+
`,i="new AGENTS.md with sigil block";else{let l=r.endsWith(`
|
|
678
|
+
`)?`
|
|
679
|
+
`:`
|
|
680
|
+
|
|
681
|
+
`;o=`${r}${l}${n}
|
|
682
|
+
`,i="appended sigil block (existing content preserved)"}return o===r?{action:"skip",path:ue,detail:"block already up to date"}:{action:(await B(ue,o,{dryRun:e})).action,path:ue,detail:i}}async function aD({dryRun:e=!1}={}){let t=[],r=await ew({dryRun:e});r&&t.push(r);let n=await tw({dryRun:e});return n&&t.push(n),{actions:t}}async function cD(){let e=await import("node:fs/promises");if(!wt(le))return{installed:!1,reason:"~/.codex/config.toml missing"};let t;try{t=Vr.default.parse(await e.readFile(le,"utf8"))}catch(n){return{installed:!1,reason:`~/.codex/config.toml unparseable: ${n.message}`}}if(!t.mcp_servers?.sigil)return{installed:!1,reason:"[mcp_servers.sigil] missing from ~/.codex/config.toml"};if(!wt(ue))return{installed:!1,reason:"~/.codex/AGENTS.md missing"};let r=await e.readFile(ue,"utf8");return!r.includes(ki)||!r.includes(qr)?{installed:!1,reason:"sigil block markers missing from ~/.codex/AGENTS.md"}:{installed:!0}}async function lD({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r=[];if(wt(le)){let n;try{n=Vr.default.parse(await t.readFile(le,"utf8"))}catch(o){return r.push({action:"skip",path:le,detail:`unparseable \u2014 not touched: ${o.message}`}),{actions:r}}if(n.mcp_servers?.sigil){delete n.mcp_servers.sigil,Object.keys(n.mcp_servers).length===0&&delete n.mcp_servers;let o=await B(le,Vr.default.stringify(n),{dryRun:e});r.push({action:o.action,path:le,detail:"-[mcp_servers.sigil]"})}else r.push({action:"skip",path:le,detail:"[mcp_servers.sigil] not present"})}if(wt(ue)){let n=await t.readFile(ue,"utf8"),o=n.indexOf(ki),i=n.indexOf(qr);if(o!==-1&&i!==-1&&i>o){let s=n.slice(0,o).replace(/\n+$/,""),a=n.slice(i+qr.length).replace(/^\n+/,""),c=s&&a?`${s}
|
|
683
|
+
|
|
684
|
+
${a}`:s||a,l=await B(ue,c.endsWith(`
|
|
685
|
+
`)?c:`${c}
|
|
686
|
+
`,{dryRun:e});r.push({action:l.action,path:ue,detail:"sigil block removed (other content preserved)"})}else r.push({action:"skip",path:ue,detail:"sigil block not present"})}return{actions:r}}var Vr,Vn,le,ue,nD,Xy,ki,qr,oD,nw=u(()=>{Vr=qw(zy(),1);Br();Fr();Vn=Yr(Zy(),".codex"),le=Yr(Vn,"config.toml"),ue=Yr(Vn,"AGENTS.md"),nD=Yr(Zy(),".sigil",".env"),Xy=Pi(Pi(Pi(Pi(rD(import.meta.url))))),ki="<!-- BEGIN sigil -->",qr="<!-- END sigil -->",oD={id:"codex-cli",label:"Codex CLI",hint:"TOML config + AGENTS.md (no native hooks)"}});var lw={};x(lw,{detect:()=>pD,install:()=>mD,meta:()=>fD,resolveServerPath:()=>sw,uninstall:()=>gD,verify:()=>hD,writeMcpEntry:()=>aw,writeSteeringFile:()=>cw});import{join as zr,dirname as Jr}from"node:path";import{homedir as iw}from"node:os";import{existsSync as jt}from"node:fs";import{fileURLToPath as uD}from"node:url";async function pD(){return jt(Ec)}function sw(){let e=zr(ow,"dist","server.js"),t=zr(ow,"src","server.js");return jt(e)?e:t}async function aw({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r={};try{let i=await t.readFile(te,"utf8");r=JSON.parse(i)}catch{}let n=jt(te);return r.mcpServers=r.mcpServers||{},r.mcpServers.sigil={command:process.execPath,args:[sw(),"--mcp"],env:{DOTENV_CONFIG_PATH:dD}},e||await t.mkdir(Jr(te),{recursive:!0}),{action:(await B(te,JSON.stringify(r,null,2),{dryRun:e})).action,path:te,detail:n?"+sigil MCP server (other entries preserved)":"new mcp.json with sigil entry"}}async function cw({dryRun:e=!1}={}){let t=await import("node:fs/promises");e||await t.mkdir(Jr(Gt),{recursive:!0});let r=await B(Gt,ht(),{dryRun:e});return{action:r.action,path:Gt,detail:`${r.bytes??0} bytes, steering (always-on)`}}async function mD({dryRun:e=!1}={}){let t=[],r=await aw({dryRun:e});r&&t.push(r);let n=await cw({dryRun:e});return n&&t.push(n),{actions:t}}async function hD(){let e=await import("node:fs/promises");if(!jt(te))return{installed:!1,reason:"~/.kiro/settings/mcp.json missing"};let t;try{t=JSON.parse(await e.readFile(te,"utf8"))}catch{return{installed:!1,reason:"~/.kiro/settings/mcp.json is not valid JSON"}}return t.mcpServers?.sigil?jt(Gt)?{installed:!0}:{installed:!1,reason:"~/.kiro/steering/sigil.md missing"}:{installed:!1,reason:"sigil entry missing from ~/.kiro/settings/mcp.json"}}async function gD({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r=[];if(jt(te)){let n;try{n=JSON.parse(await t.readFile(te,"utf8"))}catch{return r.push({action:"skip",path:te,detail:"invalid JSON \u2014 not touched"}),{actions:r}}if(n.mcpServers?.sigil){delete n.mcpServers.sigil;let o=await B(te,JSON.stringify(n,null,2),{dryRun:e});r.push({action:o.action,path:te,detail:"-sigil MCP entry"})}else r.push({action:"skip",path:te,detail:"sigil entry not present"})}return jt(Gt)&&(e||await t.unlink(Gt),r.push({action:"delete",path:Gt,detail:"sigil steering file removed"})),{actions:r}}var Ec,te,Gt,dD,ow,fD,uw=u(()=>{Br();Fr();Ec=zr(iw(),".kiro"),te=zr(Ec,"settings","mcp.json"),Gt=zr(Ec,"steering","sigil.md"),dD=zr(iw(),".sigil",".env"),ow=Jr(Jr(Jr(Jr(uD(import.meta.url))))),fD={id:"kiro",label:"Kiro",hint:"MCP + steering file (steering auto-applies)"}});var pw={};x(pw,{detect:()=>SD,install:()=>TD,meta:()=>xD,setMemoryProviderInYaml:()=>xc,uninstall:()=>ID,verify:()=>OD});import{join as Wt,dirname as qn}from"node:path";import{homedir as yD}from"node:os";import{existsSync as Le}from"node:fs";import{fileURLToPath as wD}from"node:url";async function SD(){return Le(fw)}function xc(e,t){let r=e.split(`
|
|
687
|
+
`),n=!1,o=!1;for(let i=0;i<r.length;i++){let s=r[i];if(/^[A-Za-z_][\w-]*:\s*$/.test(s)||/^[A-Za-z_][\w-]*:\s/.test(s)){n=/^memory:\s*$/.test(s);continue}if(!n)continue;let a=s.match(/^(\s+provider:\s*)(['"]?)([^'"\n]*)\2(\s*(#.*)?)$/);if(a){let[,c,,l,d]=a;if(l===t)return{content:e,changed:!1};r[i]=`${c}'${t}'${d}`,o=!0;break}}return{content:r.join(`
|
|
688
|
+
`),changed:o}}async function AD({dryRun:e}){let t=await import("node:fs/promises");if(!Le(_c))throw new Error(`Plugin source missing at ${_c} \u2014 is this Sigil install complete? \`integrations/hermes/plugin/\` must ship with the package.`);return e?{action:Le(de)?"modify":"create"}:(await t.mkdir(qn(de),{recursive:!0}),Le(de)&&await t.rm(de,{recursive:!0,force:!0}),await t.cp(_c,de,{recursive:!0}),{action:"create"})}async function bD({dryRun:e,value:t}){let r=await import("node:fs/promises");if(!Le(be))return{action:"skip",detail:"config.yaml not present \u2014 set memory.provider manually"};let n=await r.readFile(be,"utf8"),{content:o,changed:i}=xc(n,t);return i?(e||await r.writeFile(be,o,"utf8"),{action:"modify",detail:`memory.provider \u2192 '${t}'`}):{action:"skip",detail:`memory.provider already '${t}'`}}async function TD({dryRun:e=!1}={}){let t=[],r=await AD({dryRun:e});t.push({action:r.action,path:de,detail:"plugin tree (__init__.py, plugin.yaml, README.md)"});let n=await bD({dryRun:e,value:"sigil"});return t.push({action:n.action,path:be,detail:n.detail}),{actions:t}}async function ID({dryRun:e=!1}={}){let t=await import("node:fs/promises"),r=[];if(Le(de)?(e||await t.rm(de,{recursive:!0,force:!0}),r.push({action:"delete",path:de,detail:"plugin directory removed"})):r.push({action:"skip",path:de,detail:"plugin not present"}),Le(be)){let n=await t.readFile(be,"utf8"),o=n.match(/^memory:\s*\n([\s\S]*?)(?=^[A-Za-z_])/m),s=(o?o[1]:"").match(/^\s+provider:\s*['"]?([^'"\n]*)['"]?/m)?.[1];if(s==="sigil"){let{content:a,changed:c}=xc(n,"");c&&!e&&await t.writeFile(be,a,"utf8"),r.push({action:"modify",path:be,detail:"memory.provider \u2192 '' (sigil cleared)"})}else r.push({action:"skip",path:be,detail:`memory.provider is '${s??""}' (not sigil) \u2014 not touched`})}return{actions:r}}async function OD(){let e=await import("node:fs/promises");if(!Le(de))return{installed:!1,reason:"plugin missing at ~/.hermes/hermes-agent/plugins/memory/sigil/"};if(!Le(Wt(de,"__init__.py")))return{installed:!1,reason:"plugin dir present but __init__.py missing"};if(!Le(be))return{installed:!1,reason:"~/.hermes/config.yaml missing"};let r=(await e.readFile(be,"utf8")).match(/^memory:\s*\n([\s\S]*?)(?=^[A-Za-z_])/m),o=(r?r[1]:"").match(/^\s+provider:\s*['"]?([^'"\n]*)['"]?/m)?.[1];return o!=="sigil"?{installed:!1,reason:`memory.provider in config.yaml is '${o??""}' (expected 'sigil')`}:{installed:!0}}var dw,ED,fw,de,be,_D,_c,xD,mw=u(()=>{dw=Wt(yD(),".hermes"),ED=Wt(dw,"hermes-agent"),fw=Wt(ED,"plugins","memory"),de=Wt(fw,"sigil"),be=Wt(dw,"config.yaml"),_D=qn(qn(qn(qn(wD(import.meta.url))))),_c=Wt(_D,"integrations","hermes","plugin"),xD={id:"hermes",label:"Hermes",hint:"Python memory-provider plugin + config.yaml flip"}});var Ew={};x(Ew,{CONTAINER:()=>fe,IMAGE:()=>Ac,VOLUME:()=>bc,detectDocker:()=>zn,ensureLocalPostgresRunning:()=>HD,provisionLocalPostgres:()=>Tc,removeLocalPostgres:()=>FD,stopLocalPostgres:()=>BD});import{spawn as ND}from"node:child_process";import{randomBytes as vD}from"node:crypto";import DD from"node:net";function Te(e,t,{timeout:r=15e3,input:n}={}){return new Promise(o=>{let i;try{i=ND(e,t,{stdio:["pipe","pipe","pipe"]})}catch(l){o({code:-1,out:"",err:l.message,spawnError:!0});return}let s="",a="",c=setTimeout(()=>{try{i.kill("SIGKILL")}catch{}},r);i.stdout.on("data",l=>{s+=l}),i.stderr.on("data",l=>{a+=l}),i.on("error",l=>{clearTimeout(c),o({code:-1,out:s,err:l.message,spawnError:!0})}),i.on("close",l=>{clearTimeout(c),o({code:l,out:s.trim(),err:a.trim()})}),n!=null&&(i.stdin.write(n),i.stdin.end())})}async function zn({refresh:e=!1}={}){if(Mi&&!e)return Mi;let t=await Te("docker",["version","--format","{{.Server.Version}}"],{timeout:8e3});return Mi=t.code===0&&!t.spawnError?{available:!0,version:t.out||"unknown",reason:null}:{available:!1,version:null,reason:t.spawnError?"docker not found on PATH":t.err||"docker daemon not responding"},Mi}async function ww(){let e=await Te("docker",["inspect","-f","{{.State.Running}}",fe],{timeout:8e3});return e.code!==0?{exists:!1,running:!1}:{exists:!0,running:e.out==="true"}}async function LD(){let e=await Te("docker",["port",fe,"5432/tcp"],{timeout:8e3});if(e.code!==0)return null;let t=e.out.match(/:(\d+)\s*$/m);return t?Number(t[1]):null}function PD(e){return new Promise(t=>{let r=DD.createServer();r.once("error",()=>t(!1)),r.once("listening",()=>r.close(()=>t(!0))),r.listen(e,"127.0.0.1")})}async function kD(e=5432){for(let t=e;t<e+25;t++)if(await PD(t))return t;return e}function yw(){return vD(18).toString("base64url")}async function Jn(e,t){let r=await Te("docker",["exec","-i",fe,"psql","-v","ON_ERROR_STOP=1","-U","postgres","-d",e],{input:t,timeout:2e4});if(r.code!==0)throw new Error(`psql(${e}) failed: ${r.err||r.out||`exit ${r.code}`}`);return r.out}async function MD({deadlineMs:e=3e4}={}){let t=Date.now(),r="timed out";for(;Date.now()-t<e;){let n=await Te("docker",["exec",fe,"pg_isready","-U","postgres"],{timeout:5e3});if(n.code===0)return;r=n.err||n.out||r,await new Promise(o=>setTimeout(o,700))}throw new Error(`Postgres did not become ready in ${e}ms: ${r}`)}async function Tc({env:e=De()}={}){let t=await zn();if(!t.available){let c=new Error(t.reason||"Docker is not available");throw c.dockerUnavailable=!0,c}let r=await ww(),n,o=yw();if(r.exists){if(!r.running){let c=await Te("docker",["start",fe],{timeout:15e3});if(c.code!==0)throw new Error(`failed to start existing ${fe}: ${c.err}`)}n=await LD()||5432}else{n=await kD(5432);let c=yw(),l=await Te("docker",["run","-d","--name",fe,"--restart","unless-stopped","-e",`POSTGRES_PASSWORD=${c}`,"-e",`POSTGRES_DB=${Xr}`,"-v",`${bc}:/var/lib/postgresql/data`,"-p",`${n}:5432`,Ac],{timeout:6e4});if(l.code!==0)throw new Error(`docker run failed: ${l.err||l.out}`)}await MD(),(await Jn("postgres",`SELECT 1 FROM pg_database WHERE datname='${Xr}'`)).includes("1")||await Jn("postgres",`CREATE DATABASE ${Xr}`),await Jn("postgres",`DO $$ BEGIN
|
|
689
|
+
IF EXISTS (SELECT FROM pg_roles WHERE rolname='${Et}') THEN
|
|
690
|
+
ALTER ROLE ${Et} WITH LOGIN PASSWORD '${o}';
|
|
691
|
+
ELSE
|
|
692
|
+
CREATE ROLE ${Et} WITH LOGIN PASSWORD '${o}';
|
|
693
|
+
END IF;
|
|
694
|
+
END $$;`),await Jn("postgres",`GRANT ALL PRIVILEGES ON DATABASE ${Xr} TO ${Et}`),await Jn(Xr,`GRANT ALL ON SCHEMA public TO ${Et};
|
|
695
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO ${Et};
|
|
696
|
+
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO ${Et};
|
|
697
|
+
CREATE EXTENSION IF NOT EXISTS vector;`);let s=`postgres://${Et}:${encodeURIComponent(o)}@localhost:${n}/${Xr}`,a=await rn(s);if(!a.ok)throw new Error(`provisioned container did not accept a TCP connection (${a.stage}): ${a.error}`);return{url:s,port:n,container:fe,image:Ac,reused:r.exists,pgvector:a.pgvector}}async function HD(e=De()){try{let t=e.SIGIL_DATABASE_URL||"";if(!/@localhost:|@127\.0\.0\.1:/.test(t))return{started:!1,reason:"not a local url"};if(!(await zn()).available)return{started:!1,reason:"docker unavailable"};let n=await ww();if(!n.exists)return{started:!1,reason:"no sigil-postgres container"};if(n.running)return{started:!1,reason:"already running"};let o=await Te("docker",["start",fe],{timeout:15e3});return o.code===0?{started:!0}:{started:!1,reason:o.err}}catch(t){return{started:!1,reason:t.message}}}async function BD(){return Te("docker",["stop",fe],{timeout:2e4})}async function FD({deleteVolume:e=!1}={}){await Te("docker",["rm","-f",fe],{timeout:2e4}),e&&await Te("docker",["volume","rm",bc],{timeout:15e3})}var fe,bc,Ac,Xr,Et,Mi,Ic=u(()=>{Me();$r();fe="sigil-postgres",bc="sigil-pgdata",Ac="pgvector/pgvector:pg16",Xr="sigil",Et="sigil_app";Mi=null});var Hi={};x(Hi,{MANIFEST_VERSION:()=>Rc,produceManifest:()=>ZD,verifyManifest:()=>QD});import{createHash as qD}from"node:crypto";import{readFile as JD,readdir as Ow}from"node:fs/promises";import{existsSync as Rw,readFileSync as zD}from"node:fs";import{join as Oc}from"node:path";function XD(){if(Xn)return Xn;try{Xn=JSON.parse(zD(Oc(Z,"package.json"),"utf8")).version}catch{Xn="unknown"}return Xn}async function ZD(){let e=await eL(Oc(Z,"prompts")),t=await tL();return{v:Rc,producedAt:new Date().toISOString(),sigilVersion:XD(),schema:{migrationVersion:t,requiredExtensions:["vector"]},embedding:{provider:g.embedding.provider||null,model:g.embedding.model||null,dimensions:Number(g.embedding.dimensions)||null,normalization:"l2",maxInputTokens:8192},chunker:{...yl},prompts:e,memory:{skipThreshold:g.memory.skipThreshold,ambiguousThreshold:g.memory.ambiguousThreshold,minFactSimilarity:g.memory.minFactSimilarity}}}function QD(e,t){let r=[],n=[];if(!t||t.v!==Rc)return r.push(`manifest version mismatch (local v${e.v} vs remote v${t?.v??"?"})`),{ok:!1,errors:r,warnings:n};for(let o of["provider","model","dimensions"])e.embedding[o]!==t.embedding[o]&&r.push(`embedding.${o}: local=${e.embedding[o]} vs remote=${t.embedding[o]}`);for(let o of["version","size","overlap"])e.chunker[o]!==t.chunker[o]&&r.push(`chunker.${o}: local=${e.chunker[o]} vs remote=${t.chunker[o]}`);e.schema.migrationVersion!==t.schema.migrationVersion&&r.push(`schema.migrationVersion: local=${e.schema.migrationVersion} vs remote=${t.schema.migrationVersion} (run \`sigil migrate\` on this device, or upgrade master)`),Math.abs(e.memory.skipThreshold-t.memory.skipThreshold)>.01&&r.push(`memory.skipThreshold differs: local=${e.memory.skipThreshold} vs remote=${t.memory.skipThreshold}`),Math.abs(e.memory.ambiguousThreshold-t.memory.ambiguousThreshold)>.05&&n.push(`memory.ambiguousThreshold drift: local=${e.memory.ambiguousThreshold} vs remote=${t.memory.ambiguousThreshold}`);for(let o of Object.keys(e.prompts))t.prompts[o]&&e.prompts[o]!==t.prompts[o]&&n.push(`prompt "${o}" differs (new ingests will produce different facts)`);return e.sigilVersion!==t.sigilVersion&&n.push(`sigil version drift: local=${e.sigilVersion} vs remote=${t.sigilVersion}`),{ok:r.length===0,errors:r,warnings:n}}async function eL(e){let t={};if(!Rw(e))return t;let r=await Ow(e);for(let n of r){if(!n.endsWith(".md"))continue;let o=await JD(Oc(e,n),"utf8");t[n.replace(/\.md$/,"")]=rL(o)}return t}async function tL(){if(!Rw(ke))return null;let t=(await Ow(ke)).filter(r=>/^\d{14}_.+\.cjs$/.test(r)).map(r=>r.replace(/_.+\.cjs$/,"")).sort();return t[t.length-1]??null}function rL(e){return qD("sha256").update(e,"utf8").digest("hex")}var Rc,Xn,Bi=u(()=>{C();A();cs();Rc=1});var vw={};x(vw,{PAIR_ALPN:()=>Cw,createPairAcceptor:()=>oL,hashCode:()=>Fi,joinMaster:()=>sL});import{createHash as nL}from"node:crypto";function oL({log:e}){return async function(r,n){if(r){e(`pair: accept err: ${r.message}`);return}let o="<unknown>";try{o=n.remoteNodeId().toString();let i=await n.acceptBi(),s=await i.recv.readToEnd(Nw),a=JSON.parse(s.toString()),c=await iL(a,o);await i.send.writeAll(Buffer.from(JSON.stringify(c))),await i.send.finish(),c.ok?(K.emit("pair.consumed",{nodeId:o,deviceName:a.name}),e(`pair: registered ${a.name} (${o.slice(0,12)}\u2026)`)):(K.emit("pair.rejected",{nodeId:o,code:c.error?.code}),e(`pair: rejected ${o.slice(0,12)}\u2026 (${c.error?.code})`))}catch(i){e(`pair: handler err from ${o.slice(0,12)}\u2026: ${i.message}`),K.emit("pair.error",{nodeId:o,message:i.message})}}}async function iL(e,t){if(!e||e.v!==Cc)return Zn("unsupported_version",`expected v=${Cc}`);if(typeof e.code!="string"||!e.code)return Zn("invalid_request","missing code");if(typeof e.name!="string"||!e.name)return Zn("invalid_request","missing name");if(typeof e.nodeId!="string"||e.nodeId.toLowerCase()!==t.toLowerCase())return Zn("invalid_request","nodeId claim does not match transport identity");let{default:r}=await Promise.resolve().then(()=>(T(),F)),{getNodeInfo:n}=await Promise.resolve().then(()=>(Ue(),pt)),o=Fi(e.code),i;try{i=await r.transaction(async l=>{let d=await l("pairing_code").where({code_hash:o}).forUpdate().first();if(!d)return{ok:!1,error:{code:"invalid_code",message:"pairing code not recognised"}};if(d.consumedByDeviceId)return{ok:!1,error:{code:"already_consumed",message:"pairing code was already used"}};if(new Date(d.expiresAt)<new Date)return{ok:!1,error:{code:"expired",message:"pairing code has expired"}};let p={hostname:e.hostname||null,sigilVersion:e.sigilVersion||null},[f]=await l("device").insert({node_id:t,name:e.name,role:d.role,namespaces:d.namespaces,active:!0,last_seen_at:l.fn.now(),meta:JSON.stringify(p)}).onConflict("node_id").merge({name:e.name,role:d.role,namespaces:d.namespaces,active:!0,last_seen_at:l.fn.now(),meta:JSON.stringify({...p,repairedAt:new Date().toISOString()})}).returning(["id"]);return await l("pairing_code").where({id:d.id}).update({consumed_by_device_id:f.id,consumed_at:l.fn.now()}),{ok:!0,device:{id:f.id,role:d.role,namespaces:d.namespaces}}})}catch(l){return Zn("transaction_failed",l.message)}if(!i.ok)return i;let s=null;try{s=(await n()).nodeId}catch{}let{produceManifest:a}=await Promise.resolve().then(()=>(Bi(),Hi)),c=await a();return{ok:!0,device:i.device,masterNodeId:s,manifest:c}}function Zn(e,t){return{ok:!1,error:{code:e,message:t}}}function Fi(e){return nL("sha256").update(e,"utf8").digest("hex")}async function sL({masterAddr:e,code:t,name:r,sigilVersion:n}){let{dial:o,getEndpoint:i}=await Promise.resolve().then(()=>(Ue(),pt)),{hostname:s}=await import("node:os"),a=await o(e,Cw),c=await i(),l=await a.openBi();await l.send.writeAll(Buffer.from(JSON.stringify({v:Cc,code:t,name:r,nodeId:c.nodeId(),hostname:s(),sigilVersion:n||null}))),await l.send.finish();let d=await l.recv.readToEnd(Nw);return JSON.parse(d.toString())}var Cw,Nw,Cc,Nc=u(()=>{Qt();Cw="sigil/pair/1",Nw=64*1024,Cc=1});var Fw={};x(Fw,{installLiteProxy:()=>fL});async function fL({registry:e,log:t}){let{getMemoryClient:r}=await Promise.resolve().then(()=>(Bn(),Hn)),n=0,o=0;for(let i of uL)e.replace(i,async s=>(await r()).call(i,s))&&n++;for(let i of dL)e.replace(i,()=>{let a=new Error(`"${i}" is not available on a lite-follower device. Run on the master device.`);throw a.code="not_on_follower",a})&&o++;t(`lite-follower: ${n} methods proxied, ${o} forbidden, rest local`)}var uL,dL,$w=u(()=>{uL=new Set(["search","searchEntity","traverseGraph","getFactContext","getEntityContext","getPod","listPods","listFacts","status","refreshContext.fetch","refreshContext.explain","remember","forgetFact","ingestDoc"]),dL=new Set(["pair.create","pair.list","pair.revoke","pair.sweep","device.list","device.revoke","device.activate","runMigrations","testDbConnection"])});C();ao();import{createWriteStream as pL,writeFileSync as mL,rmSync as hL}from"node:fs";import{appendFile as gL}from"node:fs/promises";Xt();var EE={UNKNOWN_METHOD:"unknown_method",INVALID_PARAMS:"invalid_params",HANDLER_ERROR:"handler_error"};function qc(){let e=new Map;function t(i,s){if(e.has(i))throw new Error(`rpc: duplicate handler for "${i}"`);e.set(i,s)}async function r(i,s,a={}){let c=e.get(i);if(!c)return{ok:!1,error:{code:EE.UNKNOWN_METHOD,message:`unknown method: ${i}`}};let{runWithRequestContext:l}=await Promise.resolve().then(()=>(po(),Xi));try{return{ok:!0,data:await l({device:a.device||null,transport:a.transport||null,agent:a.agent||null},()=>c(s??{},a))}}catch(d){return{ok:!1,error:Vc(d)}}}function n(){return[...e.keys()].sort()}function o(i,s){return e.has(i)?(e.set(i,s),!0):!1}return{register:t,replace:o,dispatch:r,list:n}}Zt();C();ao();import{createServer as xE}from"node:net";import{chmod as SE}from"node:fs/promises";async function zc({registry:e,log:t}){await so();let r=xE(n=>{let o="",i=!1,s=Promise.resolve();n.setEncoding("utf8"),n.on("data",a=>{if(i)return;o+=a;let c;for(;(c=o.indexOf(`
|
|
698
|
+
`))!==-1;){let l=o.slice(0,c);o=o.slice(c+1),l.trim()&&(s=s.then(()=>{if(!i)return AE(l,n,e,t)}))}}),n.on("close",()=>{i=!0}),n.on("error",a=>{a.code!=="EPIPE"&&a.code!=="ECONNRESET"&&t(`socket error: ${a.message}`)})});await new Promise((n,o)=>{r.once("error",o),r.listen(qe,()=>{r.off("error",o),n()})});try{await SE(qe,384)}catch{}return t(`socket listening at ${qe}`),{close:()=>new Promise(n=>r.close(()=>n()))}}async function AE(e,t,r,n){let o;try{o=JSON.parse(e)}catch(d){ns(t,{id:null,ok:!1,error:{code:"invalid_json",message:d.message}});return}let{id:i=null,method:s,params:a,agent:c=null}=o||{};if(typeof s!="string"){ns(t,{id:i,ok:!1,error:{code:"invalid_params",message:'request must include a string "method"'}});return}let l=await r.dispatch(s,a,{transport:"socket",agent:c});ns(t,{id:i,...l}),!l.ok&&process.env.SIGIL_DEBUG&&n(`dispatch ${s} -> ${l.error.code}: ${l.error.message}`)}function ns(e,t){try{e.write(JSON.stringify(t)+`
|
|
699
|
+
`)}catch{}}C();import{createServer as vE}from"node:http";import{existsSync as yo,createReadStream as DE}from"node:fs";import{stat as LE}from"node:fs/promises";import{join as tl,extname as PE,normalize as Qc,sep as kE}from"node:path";import{WebSocketServer as ME}from"ws";C();import{readFile as bE,writeFile as TE,chmod as IE,mkdir as OE}from"node:fs/promises";import{randomBytes as RE,timingSafeEqual as Xc}from"node:crypto";import{dirname as CE}from"node:path";var ho=null;async function os(){if(ho)return ho;try{let t=(await bE(qt,"utf8")).trim();if(/^[0-9a-f]{64}$/.test(t))return ho=t}catch{}await OE(CE(qt),{recursive:!0});let e=RE(32).toString("hex");await TE(qt,e,"utf8");try{await IE(qt,384)}catch{}return ho=e}async function nn(e){if(!e||typeof e!="string")return!1;let t=await os();if(e.length!==t.length)return Xc(Buffer.from(t),Buffer.from(t)),!1;try{return Xc(Buffer.from(e),Buffer.from(t))}catch{return!1}}Qt();var HE={".html":"text/html; charset=utf-8",".js":"application/javascript; charset=utf-8",".mjs":"application/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".svg":"image/svg+xml",".png":"image/png",".jpg":"image/jpeg",".ico":"image/x-icon",".json":"application/json; charset=utf-8",".txt":"text/plain; charset=utf-8"};function BE(){return yo(en)?en:yo(no)?no:null}async function rl({registry:e,log:t,config:r}){let n=BE(),o=await os(),i=vE(async(c,l)=>{try{await FE(c,l,{registry:e,webDir:n,log:t})}catch(d){t(`http route error: ${d.message}`),me(l,500,{ok:!1,error:{code:"internal",message:d.message}})}}),s=new ME({noServer:!0});i.on("upgrade",async(c,l,d)=>{let p=new URL(c.url,"http://localhost");if(p.pathname!=="/api/v1/events"){l.destroy();return}if(!(await ol(c)||p.searchParams.get("t")&&await nn(p.searchParams.get("t")))){l.write(`HTTP/1.1 401 Unauthorized\r
|
|
619
700
|
\r
|
|
620
|
-
`),l.destroy();return}
|
|
701
|
+
`),l.destroy();return}s.handleUpgrade(c,l,d,m=>{for(let b of K.recent(50))try{m.send(JSON.stringify(b))}catch{}let w=256*1024,y=0,E=K.subscribe(b=>{if(m.readyState===m.OPEN){if(m.bufferedAmount>w){y++;return}try{y>0&&(m.send(JSON.stringify({type:"meta.dropped",ts:new Date().toISOString(),count:y})),y=0),m.send(JSON.stringify(b))}catch{}}});m.on("close",E),m.on("error",()=>E())})}),await new Promise((c,l)=>{i.once("error",l),i.listen(r.http.port,r.http.host,()=>{i.off("error",l),c()})});let a=`http://${r.http.host}:${r.http.port}/?t=${o}`;return t(`http listening on ${r.http.host}:${r.http.port}`),t(`gui url (paste into browser): ${a}`),{url:a,close:()=>new Promise(c=>{s.close(),i.close(()=>c())})}}async function FE(e,t,{registry:r,webDir:n,log:o}){let i=new URL(e.url,"http://localhost"),s=i.pathname;if(e.method==="GET"&&s==="/healthz")return me(t,200,{ok:!0,ts:new Date().toISOString()});if(e.method==="GET"&&(s==="/"||s==="/index.html"))return $E(e,t,i,n,o);if(e.method==="GET"&&s.startsWith("/static/"))return UE(e,t,s.replace("/static/",""),n);if(!await ol(e))return me(t,401,{ok:!1,error:{code:"auth",message:"unauthorized"}});if(e.method==="GET"&&s==="/api/v1/methods")return me(t,200,{ok:!0,data:{methods:r.list()}});if(e.method==="POST"&&s==="/api/v1/rpc"){let c=await GE(e);if(!c||typeof c.method!="string")return me(t,400,{ok:!1,error:{code:"invalid_request",message:"expected {method, params}"}});let l=await r.dispatch(c.method,c.params,{transport:"http"});return me(t,200,l)}me(t,404,{ok:!1,error:{code:"not_found",message:`${e.method} ${s}`}})}async function $E(e,t,r,n,o){let i=r.searchParams.get("t");if(i)return await nn(i)?(t.statusCode=302,t.setHeader("Location","/"),t.setHeader("Set-Cookie",`sigil_gui=${i}; Path=/; HttpOnly; SameSite=Strict; Max-Age=2592000`),t.end()):me(t,401,{ok:!1,error:{code:"auth",message:"invalid token"}});if(!n)return t.statusCode=200,t.setHeader("Content-Type","text/html; charset=utf-8"),t.end(el);let s=tl(n,"index.html");return yo(s)?nl(t,s):(o(`http: index.html missing under ${n}`),t.statusCode=200,t.setHeader("Content-Type","text/html; charset=utf-8"),t.end(el))}async function UE(e,t,r,n){if(!n)return me(t,404,{ok:!1,error:{code:"not_found",message:"no web dir"}});let o=Qc(tl(n,r)),i=Qc(n)+kE;return o.startsWith(i)?yo(o)?nl(t,o):me(t,404,{ok:!1,error:{code:"not_found",message:r}}):me(t,403,{ok:!1,error:{code:"forbidden",message:"path traversal blocked"}})}async function nl(e,t){let r=await LE(t);e.statusCode=200,e.setHeader("Content-Type",HE[PE(t).toLowerCase()]||"application/octet-stream"),e.setHeader("Content-Length",r.size),e.setHeader("Cache-Control","no-cache"),DE(t).pipe(e)}async function ol(e){let t=e.headers.authorization;if(t&&/^Bearer\s+/i.test(t)&&await nn(t.replace(/^Bearer\s+/i,"").trim()))return!0;let n=(e.headers.cookie||"").match(/(?:^|;\s*)sigil_gui=([0-9a-f]+)/i);return!!(n&&await nn(n[1]))}async function GE(e){let t=[],r=0;for await(let o of e)if(t.push(o),r+=o.length,r>1e6)throw new Error("request body too large (>1MB)");if(!t.length)return null;let n=Buffer.concat(t).toString("utf8");try{return JSON.parse(n)}catch(o){throw new Error(`invalid JSON: ${o.message}`)}}function me(e,t,r){e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.end(JSON.stringify(r))}var el=`<!doctype html>
|
|
621
702
|
<html><head><meta charset="utf-8"><title>Sigil</title>
|
|
622
703
|
<style>body{font:14px/1.6 system-ui, sans-serif;max-width:720px;margin:48px auto;padding:0 16px;color:#1a1a1a}h1{font-size:18px;margin-bottom:8px}code{background:#f3f3f3;padding:2px 6px;border-radius:4px}</style>
|
|
623
704
|
</head><body>
|
|
@@ -630,18 +711,14 @@ into your browser to set the auth cookie.</p>
|
|
|
630
711
|
-X POST http://localhost:7777/api/v1/rpc \\
|
|
631
712
|
-d '{"method":"ping"}' \\
|
|
632
713
|
-H "Content-Type: application/json"</pre>
|
|
633
|
-
</body></html>`;L();import{readFileSync as Mh}from"node:fs";import{join as Fh}from"node:path";var Xt;function $h(){if(Xt)return Xt;try{Xt=JSON.parse(Mh(Fh(me,"package.json"),"utf8")).version}catch{Xt="unknown"}return Xt}function Pa(e,{startedAt:t}){e.register("ping",()=>({ok:!0,version:$h(),pid:process.pid,uptimeMs:Date.now()-t,node:process.version}))}function sp(e){e.register("remember",async t=>{let r=Array.isArray(t.facts)?t.facts.filter(Boolean):[];if(r.length===0){let f=new Error("remember: params.facts must be a non-empty string[]");throw f.code="invalid_params",f}let{ingestDocument:n}=await Promise.resolve().then(()=>(Hi(),Bi)),{default:o}=await Promise.resolve().then(()=>(S(),q)),i=t.namespace||o.defaults.namespace,a=0,s=0,c=0,l=Date.now(),d=[];for(let f of r){let h=await n({content:f,namespace:i,classify:!0});if(h.skipped||h.route==="noise"){c++,d.push({input:String(f).slice(0,240),route:h.route??null,skipped:!0,verdicts:h.facts?.verdicts||[]});continue}let w=h.facts?.added??0,y=h.facts?.updated??0;a+=w,s+=y,w+y===0&&c++,d.push({input:String(f).slice(0,240),route:h.route??null,skipped:!1,counts:{added:w,updated:y,skipped:h.facts?.skipped??0,contradicted:h.facts?.contradicted??0},verdicts:h.facts?.verdicts||[],entities:h.entities?{entityCount:h.entities.entityCount,relationCount:h.entities.relationCount,topics:h.entities.topics||[]}:null})}if(a+s>0){let{updateContextSnapshot:f}=await Promise.resolve().then(()=>(Tr(),vr));await f({namespace:i}).catch(()=>{})}let{recordTrace:p}=await Promise.resolve().then(()=>(Me(),Pe));return p({kind:"ingest",summary:`remember ${r.length} input${r.length===1?"":"s"} \u2192 +${a} added, ~${s} updated, ${c} known`,namespace:i,durationMs:Date.now()-l,detail:{op:"remember",namespace:i,totals:{added:a,updated:s,alreadyKnown:c,inputCount:r.length},inputs:d}}).catch(()=>{}),{added:a,updated:s,alreadyKnown:c,namespace:i}})}function Lp(e){e.register("search",async t=>{let r=(t.query??"").trim();if(!r){let G=new Error("search: params.query is required");throw G.code="invalid_params",G}let{search:n}=await Promise.resolve().then(()=>(Dp(),Rp)),{default:o}=await Promise.resolve().then(()=>(S(),q)),i=Array.isArray(t.namespaces)&&t.namespaces.length?t.namespaces:[o.defaults.namespace],a=Number.isFinite(t.limit)?t.limit:10,s=!!t.useGraph,c=!!t.route,l=!!t.synthesize,d=!!t.includeChunks||l,p=t.minConfidence,f=t.pointInTime?new Date(t.pointInTime):void 0,h=t.podScope??"auto",w=t.applyFloor??!1,y={cwd:t.cwd||null,sessionId:t.sessionId||null},E=await n(r,{namespaces:i,limit:a,useGraph:s,route:c,synthesize:l,includeChunks:d,minConfidence:p,pointInTime:f,podScope:h,applyFloor:w,ctx:y}),I={query:r,namespaces:i,facts:(E.facts||[]).map(eI),chunks:(E.chunks||[]).map(tI),synthesized:E.synthesized||null,matchedEntity:E.matchedEntity||null,relatedEntities:E.relatedEntities||[]},_=E._trace||{},O=r.length>80?r.slice(0,80)+"\u2026":r,v=_.strategy==="entity-first"?" \xB7 entity-first":"",{recordTrace:x}=await Promise.resolve().then(()=>(Me(),Pe));return x({kind:"search",summary:`"${O}" \u2192 ${I.facts.length} facts, ${I.chunks.length} chunks${v}`,namespace:i[0]||null,durationMs:_.durationMs??null,detail:_}).catch(()=>{}),I})}function eI(e){return{id:e.id??null,uid:e.uid??null,content:e.content,category:e.category??null,confidence:e.confidence??null,importance:e.importance??null,similarity:Gn(e.similarity),rrfScore:Gn(e.rrfScore),agent:e.createdByAgent??null,device:e.createdByDeviceId??null,sourceDocumentIds:Array.isArray(e.sourceDocumentIds)?e.sourceDocumentIds:[],sourceSection:e.sourceSection??null}}function tI(e){return{id:e.id??null,content:e.content,sectionHeading:e.sectionHeading??null,similarity:Gn(e.similarity),rrfScore:Gn(e.rrfScore)}}function Gn(e){let t=Number(e);return Number.isFinite(t)?t:null}function kp(e){e.register("status",async t=>{let{getStats:r}=await Promise.resolve().then(()=>(Co(),No)),{getEntityCount:n}=await Promise.resolve().then(()=>(fe(),Dt)),{getRelationCount:o}=await Promise.resolve().then(()=>(Xe(),Cn)),{getFactCount:i,getHotFacts:a}=await Promise.resolve().then(()=>(qe(),pr)),{getEntityHebbianStats:s}=await Promise.resolve().then(()=>($n(),Wi)),{default:c}=await Promise.resolve().then(()=>(A(),P)),l=t.namespace||null,d=Number.isFinite(t.hotFactsLimit)?t.hotFactsLimit:5,p=!0,f=null;try{await c.raw("SELECT 1")}catch(T){p=!1,f=T.message}try{let{setDbHealth:T}=await Promise.resolve().then(()=>(zt(),io));T({healthy:p,error:f,checkedAt:Date.now()})}catch{}if(!p)return{namespace:l,db:{healthy:!1,error:f},documents:0,chunks:0,facts:0,entities:{documents:0,people:0,topics:0},relations:0,podsByType:{},hotFacts:[],hebbian:null};let[h,w,y,E,I,_,O,v,x]=await Promise.all([r(l),i(l),n("document"),n("person"),n("topic"),o(),c("pod").where({status:"active"}).select("podType"),s({topN:3}).catch(()=>null),a(l,{limit:d}).catch(()=>[])]),G=O.reduce((T,pe)=>(T[pe.podType]=(T[pe.podType]||0)+1,T),{});return{namespace:l,db:{healthy:!0,error:null},documents:h.documentCount,chunks:h.totalChunks,facts:w,entities:{documents:y,people:E,topics:I},relations:_,podsByType:G,hotFacts:(x||[]).map(T=>({id:T.id??null,content:T.content,accessCount:T.accessCount??0})),hebbian:v?{edgeCount:v.edgeCount,avgStrength:v.avgStrength??0,maxStrength:v.maxStrength??0,topPairs:(v.topPairs||[]).map(T=>({a:T.aName,b:T.bName,decayed:Number(T.decayed)||0}))}:null}})}function Pp(e){e.register("searchEntity",async t=>{let{searchByName:r,listByType:n}=await Promise.resolve().then(()=>(fe(),Dt)),{query:o,entityType:i,limit:a=10,namespace:s}=t;if(!o&&!i){let l=new Error("searchEntity: provide query or entityType");throw l.code="invalid_params",l}let c=o?await r(o,{entityType:i,namespace:s,limit:a}):await n(i,{namespace:s,limit:a});return{query:o||null,entityType:i||null,entities:c.map(l=>({id:l.id,name:l.name,entityType:l.entityType,description:l.description??null,mentionCount:l.mentionCount??0}))}})}function Bp(e){e.register("traverseGraph",async t=>{let{findById:r}=await Promise.resolve().then(()=>(fe(),Dt)),{getEntityNeighborhood:n,findPath:o,findRelated:i}=await Promise.resolve().then(()=>($p(),Fp)),{startEntityId:a,action:s="neighbors",targetEntityId:c,relationType:l,maxDepth:d=2,limit:p=20}=t;if(!Number.isFinite(a)){let y=new Error("traverseGraph: startEntityId required");throw y.code="invalid_params",y}let f=await r(a);if(!f)return{ok:!1,notFound:!0,startEntityId:a};let h={id:f.id,name:f.name,entityType:f.entityType};if(s==="path"){if(!Number.isFinite(c)){let E=new Error("traverseGraph: targetEntityId required for action=path");throw E.code="invalid_params",E}let y=await o(f.id,c,{maxDepth:Math.min(d,4)});return{action:s,start:h,targetEntityId:c,path:y||null}}if(s==="related"){let y=await i(f.id,{maxDepth:Math.min(d,3),relationType:l,limit:p});return{action:s,start:h,related:y}}let w=await n(f.id,{depth:Math.min(d,3),limit:p});return{action:"neighbors",start:h,relations:w.relations||[],related:w.related||null}})}function Hp(e){e.register("getFactContext",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),P)),{findByUid:n}=await Promise.resolve().then(()=>(qe(),pr)),{getEntitiesForFact:o}=await Promise.resolve().then(()=>(Qe(),vi)),{getRelationsByFact:i}=await Promise.resolve().then(()=>(Xe(),Cn)),{uid:a,factId:s}=t;if(!a&&!Number.isFinite(s)){let f=new Error("getFactContext: provide uid or factId");throw f.code="invalid_params",f}let c;if(a?c=await n(a):c=await r("fact").where({id:s}).first(),!c)return{notFound:!0};let[l,d,p]=await Promise.all([o(c.id),i(c.id),c.sourceDocumentIds?.length?r("document").whereIn("id",c.sourceDocumentIds).select("id","title","sourceType"):[]]);return{fact:{id:c.id,uid:c.uid,content:c.content,category:c.category??null,confidence:c.confidence??null,status:c.status??null,sourceSection:c.sourceSection??null},entities:l.map(f=>({id:f.id,name:f.name,entityType:f.entityType})),relations:d,documents:p.map(f=>({id:f.id,title:f.title,sourceType:f.sourceType}))}})}function Up(e){e.register("getEntityContext",async t=>{let{findById:r,searchByName:n}=await Promise.resolve().then(()=>(fe(),Dt)),{listRelationsForEntity:o}=await Promise.resolve().then(()=>(Xe(),Cn)),{getFactsForEntity:i}=await Promise.resolve().then(()=>(Qe(),vi)),{entityId:a,name:s,namespace:c}=t;if(!Number.isFinite(a)&&!s){let f=new Error("getEntityContext: provide entityId or name");throw f.code="invalid_params",f}let l;if(Number.isFinite(a)?l=await r(a):l=(await n(s,{namespace:c,limit:1}))[0],!l)return{notFound:!0};let[d,p]=await Promise.all([o(l.id,{limit:30}),i(l.id,{limit:10})]);return{entity:{id:l.id,name:l.name,entityType:l.entityType,description:l.description??null,mentionCount:l.mentionCount??0},relations:d,facts:p.map(f=>({id:f.id,content:f.content,category:f.category??null,confidence:f.confidence??null}))}})}function Gp(e){e.register("getPod",async t=>{let{findByUid:r}=await Promise.resolve().then(()=>(ke(),Ze)),{listMembers:n}=await Promise.resolve().then(()=>(_r(),Ft)),{uid:o}=t;if(!o){let l=new Error("getPod: uid required");throw l.code="invalid_params",l}let i=await r(o);if(!i)return{notFound:!0,uid:o};let a=typeof i.attrs=="object"?i.attrs:iI(i.attrs),[s,c]=await Promise.all([n(i.id,{memberType:"fact",limit:20}),n(i.id,{memberType:"document",limit:10})]);return{pod:{id:i.id,uid:i.uid,name:i.name,podType:i.podType,namespace:i.namespace,status:i.status,startedAt:i.startedAt??null,endedAt:i.endedAt??null,entityId:i.entityId??null,connectionId:i.connectionId??null,externalId:i.externalId??null,attrs:a},facts:s.map(l=>({id:l.id,content:l.content,podRole:l.podRole??null})),documents:c.map(l=>({id:l.id,title:l.title??null,sourcePath:l.sourcePath??null}))}})}function iI(e){if(!e)return{};try{return JSON.parse(e)}catch{return{}}}function jp(e){e.register("listPods",async t=>{let{listPods:r}=await Promise.resolve().then(()=>(ke(),Ze)),{type:n,namespace:o,status:i="active",limit:a=20}=t;return{pods:(await r({podType:n,namespace:o,status:i,limit:a})).map(c=>({id:c.id,uid:c.uid,name:c.name,podType:c.podType,memberFactCount:c.memberFactCount??0,memberDocCount:c.memberDocCount??0,updatedAt:c.updatedAt??null}))}})}function Jp(e){e.register("ingestDoc",async t=>{let{ingestDocument:r}=await Promise.resolve().then(()=>(Hi(),Bi)),{resolveSource:n}=await Promise.resolve().then(()=>(zp(),Vp)),{content:o,filePath:i,url:a,title:s,namespace:c,sourceType:l,skipFacts:d,skipEntities:p,metadata:f}=t,h=await n({content:o,filePath:i,url:a,title:s,sourceType:l});if(!h){let _=new Error("ingestDoc: provide content, filePath, or url");throw _.code="invalid_params",_}let w=await r({content:h.content,title:s||h.title,sourcePath:h.sourcePath,sourceType:l||h.sourceType,contentType:h.contentType,namespace:c,metadata:f||h.metadata,skipFacts:d,skipEntities:p}),y={skipped:!!w.skipped,title:w.title??null,documentId:w.documentId??null,chunkCount:w.chunkCount??0,facts:w.facts??null,entities:w.entities??null,output:w.md?.url??null},E=y.facts||{},{recordTrace:I}=await Promise.resolve().then(()=>(Me(),Pe));return I({kind:"ingest",summary:`ingest "${String(y.title||"document").slice(0,60)}" \u2192 ${y.chunkCount} chunks, +${E.added??0} facts${y.skipped?" (skipped)":""}`,namespace:c||null,detail:{op:"ingestDoc",title:y.title,documentId:y.documentId,skipped:y.skipped,route:w.route??null,chunkCount:y.chunkCount,counts:{added:E.added??0,updated:E.updated??0,skipped:E.skipped??0,contradicted:E.contradicted??0,total:E.total??0},verdicts:E.verdicts||[],entities:y.entities?{entityCount:y.entities.entityCount,relationCount:y.entities.relationCount,topics:y.entities.topics||[]}:null}}).catch(()=>{}),y})}function Xp(e){e.register("listFacts",async t=>{let{listFacts:r}=await Promise.resolve().then(()=>(qe(),pr)),{default:n}=await Promise.resolve().then(()=>(S(),q)),o=t.namespace||n.defaults.namespace,i=t.category||void 0,a=Number.isFinite(t.limit)?t.limit:20,s=await r({namespace:o,category:i,limit:a});return{namespace:o,category:i||null,facts:s.map(c=>({id:c.id,uid:c.uid,content:c.content,category:c.category??null,importance:c.importance??null,confidence:c.confidence??null}))}})}function Zp(e){e.register("forgetFact",async t=>{let{deleteFact:r}=await Promise.resolve().then(()=>(qe(),pr)),{default:n}=await Promise.resolve().then(()=>(A(),P)),o=String(t.id??"").trim();if(!o){let s=new Error("forgetFact: params.id required");throw s.code="invalid_params",s}let[i]=/^\d+$/.test(o)?await n("fact").where({id:Number(o)}).limit(1):await n("fact").where("uid","like",`${o}%`).limit(1);if(!i)return{notFound:!0,query:o};let a=await r(i.uid);return a?{deleted:{uid:a.uid,content:a.content}}:{notFound:!0,query:o}})}function Sm(e){e.register("refreshContext.fetch",async t=>{let{default:r}=await Promise.resolve().then(()=>(S(),q)),{getHotFacts:n}=await Promise.resolve().then(()=>(Tr(),vr)),o=t.namespace||r.defaults.namespace,i=Number.isFinite(t.limit)?t.limit:20,a=await n({namespace:o,limit:i});return{namespace:o,facts:a}}),e.register("refreshContext.explain",async t=>{let{default:r}=await Promise.resolve().then(()=>(S(),q)),n=t.namespace||r.defaults.namespace;await Promise.resolve().then(()=>(Mn(),np));let{activeKinds:o}=await Promise.resolve().then(()=>(Ir(),Jf)),{factsInPodsByRecency:i}=await Promise.resolve().then(()=>(Tr(),vr)),a={namespace:n,cwd:t.cwd||process.cwd()},s=await o(a),c=[];for(let{kind:l,scope:d}of s){let p,f=null;try{typeof l.fetchFacts=="function"?p=await l.fetchFacts(a,{slots:l.hotContextBudget,namespace:n}):p=await i(d,n,l.hotContextBudget)}catch(h){p=[],f=h.message}c.push({name:l.name,budget:l.hotContextBudget,visibility:l.visibility,error:f,facts:(p||[]).slice(0,l.hotContextBudget).map(h=>({content:typeof h=="string"?h:h.content||""}))})}return{mode:"explain",namespace:n,sections:c}}),e.register("refreshContext",async t=>{let{default:r}=await Promise.resolve().then(()=>(S(),q)),{getMemoryClient:n}=await Promise.resolve().then(()=>(Cr(),Nr)),o=t.namespace||r.defaults.namespace,i=Number.isFinite(t.limit)?t.limit:20,a=!!t.explain,s=await n();if(a)return s.call("refreshContext.explain",{namespace:o,cwd:t.cwd});let{facts:c}=await s.call("refreshContext.fetch",{namespace:o,limit:i}),{writeSnapshotToFile:l}=await Promise.resolve().then(()=>(Tr(),vr)),{writeSharedInstructions:d}=await Promise.resolve().then(()=>(bm(),xm));await d();let p=await l({facts:c,namespace:o});return{mode:"write",namespace:o,count:p}})}it();tt();import XI from"pg";function vm(e){e.register("testDbConnection",async t=>{if(t.url)return ea(t.url);let r;try{r=se({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}})}catch(i){return{ok:!1,stage:"parse",error:i.message}}let n=new XI.Client(r),o=Date.now();try{await n.connect()}catch(i){return{ok:!1,stage:"connect",provider:"local",error:i.message,code:i.code}}try{let i=await n.query("SELECT current_database() AS db, version() AS version"),a=await n.query("SELECT extname FROM pg_extension WHERE extname = 'vector'");return{ok:!0,provider:"local",connectMs:Date.now()-o,database:i.rows[0].db,serverVersion:i.rows[0].version,pgvector:a.rowCount>0}}catch(i){return{ok:!1,stage:"query",provider:"local",error:i.message,code:i.code}}finally{try{await n.end()}catch{}}})}L();it();at();import ZI from"knex";function Tm(e){e.register("runMigrations",async(t={})=>{if(t.url||t.host){let i;if(t.url){let s=t.url;if(jr(t.url)){let c=po(t.url);if(!c)throw new Error("This is a connection-pooler URL. Migrations need the direct connection \u2014 paste your non-pooled connection string.");s=c}i=ce(s)}else i=se({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}});let a=ZI({client:"pg",connection:i,pool:{min:1,max:2}});try{let[s,c]=await a.migrate.latest({directory:nt});return{batchNo:s,ran:c,against:t.url?"url":"fields"}}finally{await a.destroy()}}let{default:r}=await Promise.resolve().then(()=>(A(),P)),[n,o]=await r.migrate.latest({directory:nt});return{batchNo:n,ran:o,against:"daemon-pool"}})}it();at();import QI from"pg";function Om(e){e.register("ensurePgvector",async(t={})=>{let r,n="local";try{if(t.url)r=ce(t.url),n=be(t.url);else if(t.host)r=se({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}});else{let{default:i}=await Promise.resolve().then(()=>(S(),q)),{selectDriver:a}=await Promise.resolve().then(()=>(Wr(),ho)),s=a(i);r=s.connection,n=s.provider}}catch(i){return{ok:!1,stage:"parse",error:i.message}}let o=new QI.Client(r);try{await o.connect()}catch(i){return{ok:!1,stage:"connect",provider:n,error:i.message,code:i.code}}try{await o.query("CREATE EXTENSION IF NOT EXISTS vector");let i=await o.query("SELECT extname, extversion FROM pg_extension WHERE extname = 'vector'");return{ok:!0,provider:n,installed:i.rowCount>0,version:i.rows[0]?.extversion??null}}catch(i){return{ok:!1,stage:"extension",provider:n,error:i.message,code:i.code}}finally{try{await o.end()}catch{}}})}L();import{existsSync as iv,readFileSync as av,writeFileSync as sv,mkdirSync as cv}from"node:fs";import{dirname as lv}from"node:path";var Cm=[{id:"claude-cli",label:"Claude Code",hint:"Uses your existing Claude Code subscription \u2014 no extra API key.",recommended:!0,fields:[],env:{LLM_PROVIDER:"claude-cli"}},{id:"openrouter",label:"OpenRouter",hint:"One API key for many models (Anthropic, OpenAI, Gemini, \u2026). Cheapest default.",fields:[{name:"OPENROUTER_API_KEY",label:"OpenRouter API key",type:"password",placeholder:"sk-or-\u2026"},{name:"LLM_OPENROUTER_MODEL",label:"Model (optional)",type:"text",placeholder:"google/gemini-flash-latest",optional:!0}],env:{LLM_PROVIDER:"openrouter"}},{id:"openai",label:"OpenAI",hint:"Direct OpenAI access. Requires sk-\u2026 key with chat + embeddings.",fields:[{name:"OPENAI_API_KEY",label:"OpenAI API key",type:"password",placeholder:"sk-\u2026"},{name:"LLM_OPENAI_MODEL",label:"Model (optional)",type:"text",placeholder:"gpt-4o-mini",optional:!0}],env:{LLM_PROVIDER:"openai"}},{id:"anthropic",label:"Anthropic",hint:"Direct Anthropic API access.",fields:[{name:"ANTHROPIC_API_KEY",label:"Anthropic API key",type:"password",placeholder:"sk-ant-\u2026"}],env:{LLM_PROVIDER:"anthropic"}},{id:"ollama",label:"Ollama",hint:"Local Ollama install. Free + private but slower on small machines.",fields:[{name:"LLM_OLLAMA_HOST",label:"Ollama host",type:"text",placeholder:"http://localhost:11434"},{name:"LLM_OLLAMA_MODEL",label:"Model",type:"text",placeholder:"qwen2.5:7b"}],env:{LLM_PROVIDER:"ollama"}}],na=[{id:"openai",label:"OpenAI",hint:"text-embedding-3-large @ 1024 dimensions. Best out-of-the-box quality.",recommended:!0,fields:[{name:"OPENAI_API_KEY",label:"OpenAI API key",type:"password",placeholder:"sk-\u2026",sharedWith:"llm"}],env:{EMBEDDING_PROVIDER:"openai",EMBEDDING_MODEL:"text-embedding-3-large",EMBEDDING_DIMENSIONS:"1024"}},{id:"ollama",label:"Ollama (nomic-embed-text)",hint:"768-dim local embeddings. Free, no key. Lower retrieval quality than OpenAI.",fields:[{name:"OLLAMA_HOST",label:"Ollama host",type:"text",placeholder:"http://localhost:11434"}],env:{EMBEDDING_PROVIDER:"ollama",EMBEDDING_MODEL:"nomic-embed-text",EMBEDDING_DIMENSIONS:"768"}},{id:"openrouter",label:"OpenRouter",hint:"Uses OpenRouter as an embedding gateway. Reuses your LLM key.",fields:[{name:"OPENROUTER_API_KEY",label:"OpenRouter API key",type:"password",placeholder:"sk-or-\u2026",sharedWith:"llm"}],env:{EMBEDDING_PROVIDER:"openrouter",EMBEDDING_MODEL:"openai/text-embedding-3-large",EMBEDDING_DIMENSIONS:"1024"}}];function ia(){if(!iv(j))return{};let e=av(j,"utf8"),t={};for(let r of e.split(`
|
|
634
|
-
`)){let n=r.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/i);if(!n)continue;let o=n[2].trim();
|
|
635
|
-
|
|
636
|
-
`);sv(j,n+o+`
|
|
637
|
-
`,"utf8")}function Rm(e){e.register("onboardingState",async()=>{let t=ia(),r=!!(t.SIGIL_DATABASE_URL||t.SIGIL_DB_HOST),n=!!t.LLM_PROVIDER,o=!!t.EMBEDDING_PROVIDER,i=t.SIGIL_SETUP_COMPLETE==="true",a=!1,s=!1,c=0;if(r)try{let{default:l}=await Promise.resolve().then(()=>(A(),P));await l.raw("SELECT 1"),s=(await l.raw("SELECT extname FROM pg_extension WHERE extname = 'vector'")).rows.length>0;let[p]=await l("knex_migrations").count("* as n").catch(()=>[{n:0}]);c=Number(p?.n??0),a=s&&c>0}catch{}return{setupComplete:i,env:{llmProvider:t.LLM_PROVIDER||null,embeddingProvider:t.EMBEDDING_PROVIDER||null,embeddingModel:t.EMBEDDING_MODEL||null,embeddingDim:t.EMBEDDING_DIMENSIONS||null,hasDatabaseUrl:!!t.SIGIL_DATABASE_URL,hasDiscreteDb:!!t.SIGIL_DB_HOST},steps:{database:{done:a,configured:r,pgvector:s,migrationsRan:c},llm:{done:n,provider:t.LLM_PROVIDER||null},embedding:{done:o,provider:t.EMBEDDING_PROVIDER||null}}}}),e.register("listLlmProviders",async()=>({providers:Cm})),e.register("listEmbeddingProviders",async()=>({providers:na})),e.register("configureLlm",async t=>{let r=Cm.find(o=>o.id===t.id);if(!r){let o=new Error(`unknown llm provider: ${t.id}`);throw o.code="invalid_params",o}let n={...r.env};for(let o of r.fields)o.optional&&!t[o.name]||(n[o.name]=t[o.name]);return oa(n),{ok:!0,provider:r.id,keysWritten:Object.keys(n)}}),e.register("configureEmbedding",async t=>{let r=na.find(o=>o.id===t.id);if(!r){let o=new Error(`unknown embedding provider: ${t.id}`);throw o.code="invalid_params",o}let n={...r.env};for(let o of r.fields)o.optional&&!t[o.name]||o.sharedWith==="llm"&&!t[o.name]&&ia()[o.name]||(n[o.name]=t[o.name]);return oa(n),{ok:!0,provider:r.id,keysWritten:Object.keys(n)}}),e.register("inspectEmbeddingCompat",async(t={})=>{let r=t.id?na.find(i=>i.id===t.id):null,n=Number(t.targetDim??r?.env?.EMBEDDING_DIMENSIONS??0);if(!n){let i=new Error("inspectEmbeddingCompat: need a provider id or targetDim");throw i.code="invalid_params",i}let o;try{if(t.url){let{buildUrlConnection:i}=await Promise.resolve().then(()=>(at(),es));o=i(t.url)}else if(t.host){let{buildLocalConnection:i}=await Promise.resolve().then(()=>(it(),Za));o=i({db:{host:t.host,port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}})}else{let{default:i}=await Promise.resolve().then(()=>(S(),q)),{selectDriver:a}=await Promise.resolve().then(()=>(Wr(),ho));o=a(i).connection}}catch(i){let{diagnoseError:a}=await Promise.resolve().then(()=>(tt(),Wt)),s=a(i);return{ok:!1,error:s.humanMessage,kind:s.kind,fixHint:s.fixHint}}try{let{inspectSchemaDims:i,diagnoseConflict:a}=await Promise.resolve().then(()=>(ra(),ta)),s=await i(o);return{ok:!0,...a({targetDim:n,schema:s}),schema:s}}catch(i){let{diagnoseError:a}=await Promise.resolve().then(()=>(tt(),Wt)),s=a(i);return{ok:!1,error:s.humanMessage,kind:s.kind,fixHint:s.fixHint}}}),e.register("wipeEmbeddingData",async(t={})=>{if(t.confirm!==!0){let r=new Error("wipeEmbeddingData: refusing without confirm:true");throw r.code="invalid_params",r}try{let{default:r}=await Promise.resolve().then(()=>(A(),P)),{EMBEDDING_TABLES:n}=await Promise.resolve().then(()=>(ra(),ta));return await r.raw(`TRUNCATE ${n.join(", ")} RESTART IDENTITY CASCADE`),{ok:!0,truncated:n}}catch(r){let{diagnoseError:n}=await Promise.resolve().then(()=>(tt(),Wt)),o=n(r);return{ok:!1,error:o.humanMessage,kind:o.kind,fixHint:o.fixHint}}}),e.register("markOnboardingComplete",async()=>(oa({SIGIL_SETUP_COMPLETE:"true"}),setTimeout(()=>process.exit(0),250),{ok:!0,restarting:!0})),e.register("restartDaemon",async()=>(setTimeout(()=>process.exit(0),250),{ok:!0,restarting:!0})),e.register("testLlm",async()=>{try{let{prompt:t}=await Promise.resolve().then(()=>(ee(),Ls));return{ok:!0,response:(await t("Reply with the single word: ok",{caller:"onboarding-test"})).slice(0,200)}}catch(t){let{diagnoseError:r}=await Promise.resolve().then(()=>(tt(),Wt)),n=r(t);return{ok:!1,error:n.humanMessage,kind:n.kind,fixHint:n.fixHint}}}),e.register("testEmbedding",async()=>{try{let{embed:t}=await Promise.resolve().then(()=>(ct(),Rs)),r=await t("Sigil onboarding test");return!Array.isArray(r)||r.length===0?{ok:!1,error:"The embedder returned an empty vector.",kind:"other"}:{ok:!0,dim:r.length}}catch(t){let{diagnoseError:r}=await Promise.resolve().then(()=>(tt(),Wt)),n=r(t);return{ok:!1,error:n.humanMessage,kind:n.kind,fixHint:n.fixHint}}})}L();import{existsSync as Dm}from"node:fs";import{readFile as Lm,writeFile as uv,mkdir as dv}from"node:fs/promises";import{dirname as fv}from"node:path";var pv=/(KEY|PASSWORD|TOKEN|SECRET)$/i;function Pm(e){e.register("readEnv",async()=>{let t=Dm(j)?await Lm(j,"utf8"):"",r=mv(t),n={};for(let[o,i]of Object.entries(r))pv.test(o)?n[o]={masked:!0,hasValue:!!i}:n[o]={masked:!1,value:i};return{path:j,entries:n}}),e.register("writeEnv",async t=>{let r=t.patch||{};if(typeof r!="object"||Array.isArray(r)){let a=new Error("writeEnv: params.patch must be an object");throw a.code="invalid_params",a}let n=Dm(j)?await Lm(j,"utf8"):"",o=hv(n,r);await dv(fv(j),{recursive:!0}),await uv(j,o,"utf8");let i=["SIGIL_MODE","SIGIL_MASTER_NODE_ID","SIGIL_NETWORK_ENABLED"];if(Object.keys(r).some(a=>i.includes(a)))try{let{resetMemoryClient:a}=await Promise.resolve().then(()=>(Cr(),Nr));a()}catch{}return{ok:!0,path:j,patchedKeys:Object.keys(r)}})}function mv(e){let t={};for(let r of e.split(`
|
|
638
|
-
`)){let n=r.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/i);if(!n)continue;let o=n[1],i=n[2].trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),t[o]=i}return t}function hv(e,t){let r=new Set,o=e.split(`
|
|
639
|
-
`).map(a=>{let s=a.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=/i);if(!s)return a;let c=s[1];if(!(c in t))return a;r.add(c);let l=t[c];return l==null?null:`${c}=${km(l)}`}).filter(a=>a!==null);for(let[a,s]of Object.entries(t))r.has(a)||s===null||s===void 0||o.push(`${a}=${km(s)}`);let i=o.join(`
|
|
714
|
+
</body></html>`;C();import{readFileSync as jE}from"node:fs";import{join as WE}from"node:path";var on;function KE(){if(on)return on;try{on=JSON.parse(jE(WE(Z,"package.json"),"utf8")).version}catch{on="unknown"}return on}function il(e,{startedAt:t}){e.register("ping",()=>({ok:!0,version:KE(),pid:process.pid,uptimeMs:Date.now()-t,node:process.version}))}function Ih(e){e.register("remember",async t=>{let r=Array.isArray(t.facts)?t.facts.filter(Boolean):[];if(r.length===0){let f=new Error("remember: params.facts must be a non-empty string[]");throw f.code="invalid_params",f}let{ingestDocument:n}=await Promise.resolve().then(()=>(Ha(),Ma)),{default:o}=await Promise.resolve().then(()=>(A(),ne)),i=t.namespace||o.defaults.namespace,s=0,a=0,c=0,l=Date.now(),d=[];for(let f of r){let m=await n({content:f,namespace:i,classify:!0});if(m.skipped||m.route==="noise"){c++,d.push({input:String(f).slice(0,240),route:m.route??null,skipped:!0,verdicts:m.facts?.verdicts||[]});continue}let w=m.facts?.added??0,y=m.facts?.updated??0;s+=w,a+=y,w+y===0&&c++,d.push({input:String(f).slice(0,240),route:m.route??null,skipped:!1,counts:{added:w,updated:y,skipped:m.facts?.skipped??0,contradicted:m.facts?.contradicted??0},verdicts:m.facts?.verdicts||[],entities:m.entities?{entityCount:m.entities.entityCount,relationCount:m.entities.relationCount,topics:m.entities.topics||[]}:null})}if(s+a>0){let{updateContextSnapshot:f}=await Promise.resolve().then(()=>(kn(),Pn));await f({namespace:i}).catch(()=>{})}let{recordTrace:p}=await Promise.resolve().then(()=>(dt(),ut));return p({kind:"ingest",summary:`remember ${r.length} input${r.length===1?"":"s"} \u2192 +${s} added, ~${a} updated, ${c} known`,namespace:i,durationMs:Date.now()-l,detail:{op:"remember",namespace:i,totals:{added:s,updated:a,alreadyKnown:c,inputCount:r.length},inputs:d}}).catch(()=>{}),{added:s,updated:a,alreadyKnown:c,namespace:i}})}function Zh(e){e.register("search",async t=>{let r=(t.query??"").trim();if(!r){let q=new Error("search: params.query is required");throw q.code="invalid_params",q}let{search:n}=await Promise.resolve().then(()=>(Xh(),zh)),{default:o}=await Promise.resolve().then(()=>(A(),ne)),i=Array.isArray(t.namespaces)&&t.namespaces.length?t.namespaces:[o.defaults.namespace],s=Number.isFinite(t.limit)?t.limit:10,a=!!t.useGraph,c=!!t.route,l=!!t.synthesize,d=!!t.includeChunks||l,p=t.minConfidence,f=t.pointInTime?new Date(t.pointInTime):void 0,m=t.podScope??"auto",w=t.applyFloor??!1,y={cwd:t.cwd||null,sessionId:t.sessionId||null},E=await n(r,{namespaces:i,limit:s,useGraph:a,route:c,synthesize:l,includeChunks:d,minConfidence:p,pointInTime:f,podScope:m,applyFloor:w,ctx:y}),b={query:r,namespaces:i,facts:(E.facts||[]).map(sC),chunks:(E.chunks||[]).map(aC),synthesized:E.synthesized||null,matchedEntity:E.matchedEntity||null,relatedEntities:E.relatedEntities||[]},_=E._trace||{},R=r.length>80?r.slice(0,80)+"\u2026":r,I=_.strategy==="entity-first"?" \xB7 entity-first":"",{recordTrace:S}=await Promise.resolve().then(()=>(dt(),ut));return S({kind:"search",summary:`"${R}" \u2192 ${b.facts.length} facts, ${b.chunks.length} chunks${I}`,namespace:i[0]||null,durationMs:_.durationMs??null,detail:_}).catch(()=>{}),b})}function sC(e){return{id:e.id??null,uid:e.uid??null,content:e.content,category:e.category??null,confidence:e.confidence??null,importance:e.importance??null,similarity:wi(e.similarity),rrfScore:wi(e.rrfScore),agent:e.createdByAgent??null,device:e.createdByDeviceId??null,sourceDocumentIds:Array.isArray(e.sourceDocumentIds)?e.sourceDocumentIds:[],sourceSection:e.sourceSection??null}}function aC(e){return{id:e.id??null,content:e.content,sectionHeading:e.sectionHeading??null,similarity:wi(e.similarity),rrfScore:wi(e.rrfScore)}}function wi(e){let t=Number(e);return Number.isFinite(t)?t:null}function Qh(e){e.register("status",async t=>{let{getStats:r}=await Promise.resolve().then(()=>(Os(),Is)),{getEntityCount:n}=await Promise.resolve().then(()=>(ve(),Ir)),{getRelationCount:o}=await Promise.resolve().then(()=>(Ct(),si)),{getFactCount:i,getHotFacts:s}=await Promise.resolve().then(()=>(Tt(),xn)),{getEntityHebbianStats:a}=await Promise.resolve().then(()=>(mi(),Ua)),{default:c}=await Promise.resolve().then(()=>(T(),F)),l=t.namespace||null,d=Number.isFinite(t.hotFactsLimit)?t.hotFactsLimit:5,p=!0,f=null;try{await c.raw("SELECT 1")}catch(O){p=!1,f=O.message}try{let{setDbHealth:O}=await Promise.resolve().then(()=>(Zt(),rs));O({healthy:p,error:f,checkedAt:Date.now()})}catch{}if(!p)return{namespace:l,db:{healthy:!1,error:f},documents:0,chunks:0,facts:0,entities:{documents:0,people:0,topics:0},relations:0,podsByType:{},hotFacts:[],hebbian:null};let[m,w,y,E,b,_,R,I,S]=await Promise.all([r(l),i(l),n("document"),n("person"),n("topic"),o(),c("pod").where({status:"active"}).select("podType"),a({topN:3}).catch(()=>null),s(l,{limit:d}).catch(()=>[])]),q=R.reduce((O,Pe)=>(O[Pe.podType]=(O[Pe.podType]||0)+1,O),{});return{namespace:l,db:{healthy:!0,error:null},documents:m.documentCount,chunks:m.totalChunks,facts:w,entities:{documents:y,people:E,topics:b},relations:_,podsByType:q,hotFacts:(S||[]).map(O=>({id:O.id??null,content:O.content,accessCount:O.accessCount??0})),hebbian:I?{edgeCount:I.edgeCount,avgStrength:I.avgStrength??0,maxStrength:I.maxStrength??0,topPairs:(I.topPairs||[]).map(O=>({a:O.aName,b:O.bName,decayed:Number(O.decayed)||0}))}:null}})}function eg(e){e.register("searchEntity",async t=>{let{searchByName:r,listByType:n}=await Promise.resolve().then(()=>(ve(),Ir)),{query:o,entityType:i,limit:s=10,namespace:a}=t;if(!o&&!i){let l=new Error("searchEntity: provide query or entityType");throw l.code="invalid_params",l}let c=o?await r(o,{entityType:i,namespace:a,limit:s}):await n(i,{namespace:a,limit:s});return{query:o||null,entityType:i||null,entities:c.map(l=>({id:l.id,name:l.name,entityType:l.entityType,description:l.description??null,mentionCount:l.mentionCount??0}))}})}function og(e){e.register("traverseGraph",async t=>{let{findById:r}=await Promise.resolve().then(()=>(ve(),Ir)),{getEntityNeighborhood:n,findPath:o,findRelated:i}=await Promise.resolve().then(()=>(ng(),rg)),{startEntityId:s,action:a="neighbors",targetEntityId:c,relationType:l,maxDepth:d=2,limit:p=20}=t;if(!Number.isFinite(s)){let y=new Error("traverseGraph: startEntityId required");throw y.code="invalid_params",y}let f=await r(s);if(!f)return{ok:!1,notFound:!0,startEntityId:s};let m={id:f.id,name:f.name,entityType:f.entityType};if(a==="path"){if(!Number.isFinite(c)){let E=new Error("traverseGraph: targetEntityId required for action=path");throw E.code="invalid_params",E}let y=await o(f.id,c,{maxDepth:Math.min(d,4)});return{action:a,start:m,targetEntityId:c,path:y||null}}if(a==="related"){let y=await i(f.id,{maxDepth:Math.min(d,3),relationType:l,limit:p});return{action:a,start:m,related:y}}let w=await n(f.id,{depth:Math.min(d,3),limit:p});return{action:"neighbors",start:m,relations:w.relations||[],related:w.related||null}})}function ig(e){e.register("getFactContext",async t=>{let{default:r}=await Promise.resolve().then(()=>(T(),F)),{findByUid:n}=await Promise.resolve().then(()=>(Tt(),xn)),{getEntitiesForFact:o}=await Promise.resolve().then(()=>(vt(),Aa)),{getRelationsByFact:i}=await Promise.resolve().then(()=>(Ct(),si)),{uid:s,factId:a}=t;if(!s&&!Number.isFinite(a)){let f=new Error("getFactContext: provide uid or factId");throw f.code="invalid_params",f}let c;if(s?c=await n(s):c=await r("fact").where({id:a}).first(),!c)return{notFound:!0};let[l,d,p]=await Promise.all([o(c.id),i(c.id),c.sourceDocumentIds?.length?r("document").whereIn("id",c.sourceDocumentIds).select("id","title","sourceType"):[]]);return{fact:{id:c.id,uid:c.uid,content:c.content,category:c.category??null,confidence:c.confidence??null,status:c.status??null,sourceSection:c.sourceSection??null},entities:l.map(f=>({id:f.id,name:f.name,entityType:f.entityType})),relations:d,documents:p.map(f=>({id:f.id,title:f.title,sourceType:f.sourceType}))}})}function sg(e){e.register("getEntityContext",async t=>{let{findById:r,searchByName:n}=await Promise.resolve().then(()=>(ve(),Ir)),{listRelationsForEntity:o}=await Promise.resolve().then(()=>(Ct(),si)),{getFactsForEntity:i}=await Promise.resolve().then(()=>(vt(),Aa)),{entityId:s,name:a,namespace:c}=t;if(!Number.isFinite(s)&&!a){let f=new Error("getEntityContext: provide entityId or name");throw f.code="invalid_params",f}let l;if(Number.isFinite(s)?l=await r(s):l=(await n(a,{namespace:c,limit:1}))[0],!l)return{notFound:!0};let[d,p]=await Promise.all([o(l.id,{limit:30}),i(l.id,{limit:10})]);return{entity:{id:l.id,name:l.name,entityType:l.entityType,description:l.description??null,mentionCount:l.mentionCount??0},relations:d,facts:p.map(f=>({id:f.id,content:f.content,category:f.category??null,confidence:f.confidence??null}))}})}function ag(e){e.register("getPod",async t=>{let{findByUid:r}=await Promise.resolve().then(()=>(lt(),Nt)),{listMembers:n}=await Promise.resolve().then(()=>(Rn(),vr)),{uid:o}=t;if(!o){let l=new Error("getPod: uid required");throw l.code="invalid_params",l}let i=await r(o);if(!i)return{notFound:!0,uid:o};let s=typeof i.attrs=="object"?i.attrs:dC(i.attrs),[a,c]=await Promise.all([n(i.id,{memberType:"fact",limit:20}),n(i.id,{memberType:"document",limit:10})]);return{pod:{id:i.id,uid:i.uid,name:i.name,podType:i.podType,namespace:i.namespace,status:i.status,startedAt:i.startedAt??null,endedAt:i.endedAt??null,entityId:i.entityId??null,connectionId:i.connectionId??null,externalId:i.externalId??null,attrs:s},facts:a.map(l=>({id:l.id,content:l.content,podRole:l.podRole??null})),documents:c.map(l=>({id:l.id,title:l.title??null,sourcePath:l.sourcePath??null}))}})}function dC(e){if(!e)return{};try{return JSON.parse(e)}catch{return{}}}function cg(e){e.register("listPods",async t=>{let{listPods:r}=await Promise.resolve().then(()=>(lt(),Nt)),{type:n,namespace:o,status:i="active",limit:s=20}=t;return{pods:(await r({podType:n,namespace:o,status:i,limit:s})).map(c=>({id:c.id,uid:c.uid,name:c.name,podType:c.podType,memberFactCount:c.memberFactCount??0,memberDocCount:c.memberDocCount??0,updatedAt:c.updatedAt??null}))}})}function hg(e){e.register("ingestDoc",async t=>{let{ingestDocument:r}=await Promise.resolve().then(()=>(Ha(),Ma)),{resolveSource:n}=await Promise.resolve().then(()=>(mg(),pg)),{content:o,filePath:i,url:s,title:a,namespace:c,sourceType:l,skipFacts:d,skipEntities:p,metadata:f}=t,m=await n({content:o,filePath:i,url:s,title:a,sourceType:l});if(!m){let _=new Error("ingestDoc: provide content, filePath, or url");throw _.code="invalid_params",_}let w=await r({content:m.content,title:a||m.title,sourcePath:m.sourcePath,sourceType:l||m.sourceType,contentType:m.contentType,namespace:c,metadata:f||m.metadata,skipFacts:d,skipEntities:p}),y={skipped:!!w.skipped,title:w.title??null,documentId:w.documentId??null,chunkCount:w.chunkCount??0,facts:w.facts??null,entities:w.entities??null,output:w.md?.url??null},E=y.facts||{},{recordTrace:b}=await Promise.resolve().then(()=>(dt(),ut));return b({kind:"ingest",summary:`ingest "${String(y.title||"document").slice(0,60)}" \u2192 ${y.chunkCount} chunks, +${E.added??0} facts${y.skipped?" (skipped)":""}`,namespace:c||null,detail:{op:"ingestDoc",title:y.title,documentId:y.documentId,skipped:y.skipped,route:w.route??null,chunkCount:y.chunkCount,counts:{added:E.added??0,updated:E.updated??0,skipped:E.skipped??0,contradicted:E.contradicted??0,total:E.total??0},verdicts:E.verdicts||[],entities:y.entities?{entityCount:y.entities.entityCount,relationCount:y.entities.relationCount,topics:y.entities.topics||[]}:null}}).catch(()=>{}),y})}function gg(e){e.register("listFacts",async t=>{let{listFacts:r}=await Promise.resolve().then(()=>(Tt(),xn)),{default:n}=await Promise.resolve().then(()=>(A(),ne)),o=t.namespace||n.defaults.namespace,i=t.category||void 0,s=Number.isFinite(t.limit)?t.limit:20,a=await r({namespace:o,category:i,limit:s});return{namespace:o,category:i||null,facts:a.map(c=>({id:c.id,uid:c.uid,content:c.content,category:c.category??null,importance:c.importance??null,confidence:c.confidence??null}))}})}function yg(e){e.register("forgetFact",async t=>{let{deleteFact:r}=await Promise.resolve().then(()=>(Tt(),xn)),{default:n}=await Promise.resolve().then(()=>(T(),F)),o=String(t.id??"").trim();if(!o){let a=new Error("forgetFact: params.id required");throw a.code="invalid_params",a}let[i]=/^\d+$/.test(o)?await n("fact").where({id:Number(o)}).limit(1):await n("fact").where("uid","like",`${o}%`).limit(1);if(!i)return{notFound:!0,query:o};let s=await r(i.uid);return s?{deleted:{uid:s.uid,content:s.content}}:{notFound:!0,query:o}})}function Bg(e){e.register("refreshContext.fetch",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),ne)),{getHotFacts:n}=await Promise.resolve().then(()=>(kn(),Pn)),o=t.namespace||r.defaults.namespace,i=Number.isFinite(t.limit)?t.limit:20,s=await n({namespace:o,limit:i});return{namespace:o,facts:s}}),e.register("refreshContext.explain",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),ne)),n=t.namespace||r.defaults.namespace;await Promise.resolve().then(()=>(fi(),Sh));let{activeKinds:o}=await Promise.resolve().then(()=>(Ln(),hh)),{factsInPodsByRecency:i}=await Promise.resolve().then(()=>(kn(),Pn)),s={namespace:n,cwd:t.cwd||process.cwd()},a=await o(s),c=[];for(let{kind:l,scope:d}of a){let p,f=null;try{typeof l.fetchFacts=="function"?p=await l.fetchFacts(s,{slots:l.hotContextBudget,namespace:n}):p=await i(d,n,l.hotContextBudget)}catch(m){p=[],f=m.message}c.push({name:l.name,budget:l.hotContextBudget,visibility:l.visibility,error:f,facts:(p||[]).slice(0,l.hotContextBudget).map(m=>({content:typeof m=="string"?m:m.content||""}))})}return{mode:"explain",namespace:n,sections:c}}),e.register("refreshContext",async t=>{let{default:r}=await Promise.resolve().then(()=>(A(),ne)),{getMemoryClient:n}=await Promise.resolve().then(()=>(Bn(),Hn)),o=t.namespace||r.defaults.namespace,i=Number.isFinite(t.limit)?t.limit:20,s=!!t.explain,a=await n();if(s)return a.call("refreshContext.explain",{namespace:o,cwd:t.cwd});let{facts:c}=await a.call("refreshContext.fetch",{namespace:o,limit:i}),{writeSnapshotToFile:l}=await Promise.resolve().then(()=>(kn(),Pn)),{writeSharedInstructions:d}=await Promise.resolve().then(()=>(Fr(),Hg));await d();let p=await l({facts:c,namespace:o});return{mode:"write",namespace:o,count:p}})}er();Me();import QC from"pg";function Fg(e){e.register("testDbConnection",async t=>{if(t.url)return rn(t.url);let r;try{r=Oe({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}})}catch(i){return{ok:!1,stage:"parse",error:i.message}}let n=new QC.Client(r),o=Date.now();try{await n.connect()}catch(i){return{ok:!1,stage:"connect",provider:"local",error:i.message,code:i.code}}try{let i=await n.query("SELECT current_database() AS db, version() AS version"),s=await n.query("SELECT extname FROM pg_extension WHERE extname = 'vector'");return{ok:!0,provider:"local",connectMs:Date.now()-o,database:i.rows[0].db,serverVersion:i.rows[0].version,pgvector:s.rowCount>0}}catch(i){return{ok:!1,stage:"query",provider:"local",error:i.message,code:i.code}}finally{try{await n.end()}catch{}}})}C();er();_t();import eN from"knex";function $g(e){e.register("runMigrations",async(t={})=>{if(t.url||t.host){let i;if(t.url){let a=t.url;if(co(t.url)){let c=qi(t.url);if(!c)throw new Error("This is a connection-pooler URL. Migrations need the direct connection \u2014 paste your non-pooled connection string.");a=c}i=re(a)}else i=Oe({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}});let s=eN({client:"pg",connection:i,pool:{min:1,max:2}});try{let[a,c]=await s.migrate.latest({directory:ke});return{batchNo:a,ran:c,against:t.url?"url":"fields"}}finally{await s.destroy()}}let{default:r}=await Promise.resolve().then(()=>(T(),F)),[n,o]=await r.migrate.latest({directory:ke});return{batchNo:n,ran:o,against:"daemon-pool"}})}er();_t();import tN from"pg";function Ug(e){e.register("ensurePgvector",async(t={})=>{let r,n="local";try{if(t.url)r=re(t.url),n=ze(t.url);else if(t.host)r=Oe({db:{host:t.host||"localhost",port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}});else{let{default:i}=await Promise.resolve().then(()=>(A(),ne)),{selectDriver:s}=await Promise.resolve().then(()=>(wo(),us)),a=s(i);r=a.connection,n=a.provider}}catch(i){return{ok:!1,stage:"parse",error:i.message}}let o=new tN.Client(r);try{await o.connect()}catch(i){return{ok:!1,stage:"connect",provider:n,error:i.message,code:i.code}}try{await o.query("CREATE EXTENSION IF NOT EXISTS vector");let i=await o.query("SELECT extname, extversion FROM pg_extension WHERE extname = 'vector'");return{ok:!0,provider:n,installed:i.rowCount>0,version:i.rows[0]?.extversion??null}}catch(i){return{ok:!1,stage:"extension",provider:n,error:i.message,code:i.code}}finally{try{await o.end()}catch{}}})}$r();var Za=[{id:"claude-cli",label:"Claude Code",hint:"Uses your existing Claude Code subscription \u2014 no extra API key.",recommended:!0,fields:[],env:{LLM_PROVIDER:"claude-cli"}},{id:"openrouter",label:"OpenRouter",hint:"One API key for many models (Anthropic, OpenAI, Gemini, \u2026). Cheapest default.",fields:[{name:"OPENROUTER_API_KEY",label:"OpenRouter API key",type:"password",placeholder:"sk-or-\u2026"},{name:"LLM_OPENROUTER_MODEL",label:"Model (optional)",type:"text",placeholder:"google/gemini-flash-latest",optional:!0}],env:{LLM_PROVIDER:"openrouter"}},{id:"openai",label:"OpenAI",hint:"Direct OpenAI access. Requires sk-\u2026 key with chat + embeddings.",fields:[{name:"OPENAI_API_KEY",label:"OpenAI API key",type:"password",placeholder:"sk-\u2026"},{name:"LLM_OPENAI_MODEL",label:"Model (optional)",type:"text",placeholder:"gpt-4o-mini",optional:!0}],env:{LLM_PROVIDER:"openai"}},{id:"anthropic",label:"Anthropic",hint:"Direct Anthropic API access.",fields:[{name:"ANTHROPIC_API_KEY",label:"Anthropic API key",type:"password",placeholder:"sk-ant-\u2026"}],env:{LLM_PROVIDER:"anthropic"}},{id:"ollama",label:"Ollama",hint:"Local Ollama install. Free + private but slower on small machines.",fields:[{name:"LLM_OLLAMA_HOST",label:"Ollama host",type:"text",placeholder:"http://localhost:11434"},{name:"LLM_OLLAMA_MODEL",label:"Model",type:"text",placeholder:"qwen2.5:7b"}],env:{LLM_PROVIDER:"ollama"}}],Fn=[{id:"openai",label:"OpenAI",hint:"text-embedding-3-large @ 1024 dimensions. Best out-of-the-box quality.",recommended:!0,fields:[{name:"OPENAI_API_KEY",label:"OpenAI API key",type:"password",placeholder:"sk-\u2026",sharedWith:"llm"}],env:{EMBEDDING_PROVIDER:"openai",EMBEDDING_MODEL:"text-embedding-3-large",EMBEDDING_DIMENSIONS:"1024"}},{id:"ollama",label:"Ollama (nomic-embed-text)",hint:"768-dim local embeddings. Free, no key. Lower retrieval quality than OpenAI.",fields:[{name:"OLLAMA_HOST",label:"Ollama host",type:"text",placeholder:"http://localhost:11434"}],env:{EMBEDDING_PROVIDER:"ollama",EMBEDDING_MODEL:"nomic-embed-text",EMBEDDING_DIMENSIONS:"768"}},{id:"openrouter",label:"OpenRouter",hint:"Uses OpenRouter as an embedding gateway. Reuses your LLM key.",fields:[{name:"OPENROUTER_API_KEY",label:"OpenRouter API key",type:"password",placeholder:"sk-or-\u2026",sharedWith:"llm"}],env:{EMBEDDING_PROVIDER:"openrouter",EMBEDDING_MODEL:"openai/text-embedding-3-large",EMBEDDING_DIMENSIONS:"1024"}}],S2=Object.fromEntries(Fn.map(e=>[e.id,{model:e.env.EMBEDDING_MODEL,dimensions:Number(e.env.EMBEDDING_DIMENSIONS)}]));C();$r();Xt();import{existsSync as aN,readFileSync as cN,writeFileSync as lN,mkdirSync as uN,renameSync as dN}from"node:fs";import{dirname as fN}from"node:path";var k={PENDING:"PENDING",ACTIVE:"ACTIVE",DONE:"DONE",SKIPPED:"SKIPPED",ERROR:"ERROR"},jg=new Set([k.DONE,k.SKIPPED]),Qa=[{id:"CONNECTORS",skippable:!0,validate:()=>!0},{id:"PROVIDER",skippable:!1,validate:e=>!!e?.llmProvider},{id:"EMBEDDING",skippable:!1,validate:e=>!!e?.provider},{id:"DATABASE",skippable:!1,validate:e=>!!e?.pgvector&&Number(e?.migrationsRan)>0},{id:"FINISH",skippable:!1,validate:()=>!0}],$n=Qa.map(e=>e.id),Wg=Object.fromEntries(Qa.map(e=>[e.id,e]));function Kg(e){return Qa.every(t=>{let r=e[t.id]?.status;return t.skippable?jg.has(r):r===k.DONE})}function Yg(e){return $n.find(r=>!jg.has(e[r]?.status))||"FINISH"}var Vg=1;function ec(){return new Date().toISOString()}function Ur(){let e={};for(let r of $n)e[r]={status:k.PENDING,error:null,data:{}};let t=ec();return{version:Vg,status:"IN_PROGRESS",currentStep:$n[0],startedAt:t,updatedAt:t,steps:e}}function Ei(e=ro){try{if(!aN(e))return Ur();let t=JSON.parse(cN(e,"utf8"));if(!t||typeof t!="object"||t.version!==Vg||!t.steps)return Ur();let r=Ur(),n={...r.steps};for(let o of $n)t.steps[o]&&(n[o]={status:k.PENDING,error:null,data:{},...t.steps[o]});return{...r,...t,steps:n}}catch{return Ur()}}function Un(e,t=ro){uN(fN(t),{recursive:!0});let r=`${t}.${process.pid}.tmp`;return lN(r,JSON.stringify(e,null,2),"utf8"),dN(r,t),e}function qg(e){return JSON.parse(JSON.stringify(e))}function Jg(e){Kg(e.steps)?(e.status="COMPLETED",e.currentStep="FINISH"):(e.status="IN_PROGRESS",e.currentStep=Yg(e.steps))}function tc(e,{step:t,status:r,data:n,error:o}={}){let i=Wg[t];if(!i)throw new H({errorCode:"ONBOARDING_INVALID_TRANSITION",message:`unknown onboarding step: ${t}`});if(!k[r])throw new H({errorCode:"ONBOARDING_INVALID_TRANSITION",message:`unknown step status: ${r}`});let s=qg(e),c={...s.steps[t].data||{},...n||{}};if(r===k.DONE&&!i.validate(c))throw new H({errorCode:"ONBOARDING_INVALID_TRANSITION",message:`step ${t} cannot be marked DONE: its invariant is not satisfied`,data:{step:t,data:c}});if(r===k.SKIPPED&&!i.skippable)throw new H({errorCode:"ONBOARDING_INVALID_TRANSITION",message:`step ${t} is not skippable`});return s.steps[t]={status:r,error:o||null,data:c},Jg(s),s.updatedAt=ec(),s}async function pN(e){let t={configured:!!(e.SIGIL_DATABASE_URL||e.SIGIL_DB_HOST),reachable:!1,pgvector:!1,migrationsRan:0};if(!t.configured)return t;try{let{default:r}=await Promise.resolve().then(()=>(T(),F));await r.raw("SELECT 1"),t.reachable=!0;let n=await r.raw("SELECT extname FROM pg_extension WHERE extname = 'vector'");t.pgvector=n.rows.length>0;let[o]=await r("knex_migrations").count("* as n").catch(()=>[{n:0}]);t.migrationsRan=Number(o?.n??0)}catch{}return t}async function rc(e,{readEnv:t=De,probeDb:r=pN}={}){let n=t(),o=qg(e),i=n.SIGIL_SETUP_COMPLETE==="true",s=(p,f,m)=>{let w=o.steps[p];o.steps[p]={status:f,error:f===k.ERROR?w.error:null,data:{...w.data||{},...m||{}}}},a=p=>o.steps[p].status===k.DONE;n.LLM_PROVIDER&&s("PROVIDER",k.DONE,{llmProvider:n.LLM_PROVIDER}),n.EMBEDDING_PROVIDER&&s("EMBEDDING",k.DONE,{provider:n.EMBEDDING_PROVIDER,model:n.EMBEDDING_MODEL||null,dim:n.EMBEDDING_DIMENSIONS||null});let c=await r(n),l={configured:c.configured,mode:n.SIGIL_DATABASE_URL?"url":n.SIGIL_DB_HOST?"fields":null,reachable:c.reachable,pgvector:c.pgvector,migrationsRan:c.migrationsRan},d=c.configured&&c.pgvector&&c.migrationsRan>0;return s("DATABASE",d||a("DATABASE")?k.DONE:o.steps.DATABASE.status,l),i&&(n.LLM_PROVIDER&&s("PROVIDER",k.DONE,{}),n.EMBEDDING_PROVIDER&&s("EMBEDDING",k.DONE,{}),c.configured&&s("DATABASE",k.DONE,{}),o.steps.CONNECTORS.status===k.PENDING&&s("CONNECTORS",k.SKIPPED,{}),s("FINISH",k.DONE,{})),Jg(o),o.updatedAt=ec(),o}function _i(e,t=De()){let r=e.steps;return{setupComplete:e.status==="COMPLETED",env:{llmProvider:t.LLM_PROVIDER||null,embeddingProvider:t.EMBEDDING_PROVIDER||null,embeddingModel:t.EMBEDDING_MODEL||null,embeddingDim:t.EMBEDDING_DIMENSIONS||null,hasDatabaseUrl:!!t.SIGIL_DATABASE_URL,hasDiscreteDb:!!t.SIGIL_DB_HOST},steps:{database:{done:r.DATABASE.status===k.DONE,configured:!!r.DATABASE.data?.configured,pgvector:!!r.DATABASE.data?.pgvector,migrationsRan:Number(r.DATABASE.data?.migrationsRan||0)},llm:{done:r.PROVIDER.status===k.DONE,provider:r.PROVIDER.data?.llmProvider||null},embedding:{done:r.EMBEDDING.status===k.DONE,provider:r.EMBEDDING.data?.provider||null}}}}function ay(e){e.register("onboardingState",async()=>{let t=Ei(),r=JSON.stringify(t),n=await rc(t);return JSON.stringify(n)!==r&&Un(n),{..._i(n),machine:n}}),e.register("onboardingAdvance",async(t={})=>{let r=tc(Ei(),{step:t.step,status:t.status,data:t.data,error:t.error});return Un(r),{..._i(r),machine:r}}),e.register("onboardingReset",async()=>{let t=Un(Ur());return gt({SIGIL_SETUP_COMPLETE:null}),{..._i(t),machine:t}}),e.register("listLlmProviders",async()=>({providers:Za})),e.register("listEmbeddingProviders",async()=>({providers:Fn})),e.register("configureLlm",async t=>{let r=Za.find(o=>o.id===t.id);if(!r){let o=new Error(`unknown llm provider: ${t.id}`);throw o.code="invalid_params",o}let n={...r.env};for(let o of r.fields)o.optional&&!t[o.name]||(n[o.name]=t[o.name]);return gt(n),{ok:!0,provider:r.id,keysWritten:Object.keys(n)}}),e.register("configureEmbedding",async t=>{let r=Fn.find(o=>o.id===t.id);if(!r){let o=new Error(`unknown embedding provider: ${t.id}`);throw o.code="invalid_params",o}let n={...r.env};for(let o of r.fields)o.optional&&!t[o.name]||o.sharedWith==="llm"&&!t[o.name]&&De()[o.name]||(n[o.name]=t[o.name]);return gt(n),{ok:!0,provider:r.id,keysWritten:Object.keys(n)}}),e.register("inspectEmbeddingCompat",async(t={})=>{let r=t.id?Fn.find(i=>i.id===t.id):null,n=Number(t.targetDim??r?.env?.EMBEDDING_DIMENSIONS??0);if(!n){let i=new Error("inspectEmbeddingCompat: need a provider id or targetDim");throw i.code="invalid_params",i}let o;try{if(t.url){let{buildUrlConnection:i}=await Promise.resolve().then(()=>(_t(),jc));o=i(t.url)}else if(t.host){let{buildLocalConnection:i}=await Promise.resolve().then(()=>(er(),Sl));o=i({db:{host:t.host,port:Number(t.port)||5432,database:t.database||"sigil",user:t.user||"sigil_app",password:t.password||""}})}else{let{default:i}=await Promise.resolve().then(()=>(A(),ne)),{selectDriver:s}=await Promise.resolve().then(()=>(wo(),us));o=s(i).connection}}catch(i){let{diagnoseError:s}=await Promise.resolve().then(()=>(Me(),Jt)),a=s(i);return{ok:!1,error:a.humanMessage,kind:a.kind,fixHint:a.fixHint}}try{let{inspectSchemaDims:i,diagnoseConflict:s}=await Promise.resolve().then(()=>(oc(),nc)),a=await i(o);return{ok:!0,...s({targetDim:n,schema:a}),schema:a}}catch(i){let{diagnoseError:s}=await Promise.resolve().then(()=>(Me(),Jt)),a=s(i);return{ok:!1,error:a.humanMessage,kind:a.kind,fixHint:a.fixHint}}}),e.register("wipeEmbeddingData",async(t={})=>{if(t.confirm!==!0){let r=new Error("wipeEmbeddingData: refusing without confirm:true");throw r.code="invalid_params",r}try{let{default:r}=await Promise.resolve().then(()=>(T(),F)),{EMBEDDING_TABLES:n}=await Promise.resolve().then(()=>(oc(),nc));return await r.raw(`TRUNCATE ${n.join(", ")} RESTART IDENTITY CASCADE`),{ok:!0,truncated:n}}catch(r){let{diagnoseError:n}=await Promise.resolve().then(()=>(Me(),Jt)),o=n(r);return{ok:!1,error:o.humanMessage,kind:o.kind,fixHint:o.fixHint}}}),e.register("markOnboardingComplete",async(t={})=>{gt({SIGIL_SETUP_COMPLETE:"true"});try{let n=await rc(Ei());Un(tc(n,{step:"FINISH",status:"DONE"}))}catch{}let r=!1;if(t.installService)try{let{installServiceUnit:n}=await Promise.resolve().then(()=>(dc(),sy));await n(),r=!0}catch{}return setTimeout(()=>process.exit(0),250),{ok:!0,restarting:!0,serviceInstalled:r}}),e.register("restartDaemon",async()=>(setTimeout(()=>process.exit(0),250),{ok:!0,restarting:!0})),e.register("testLlm",async()=>{try{let{resetDetection:t,detectProvider:r}=await Promise.resolve().then(()=>(Ao(),Wl)),{readEnvRaw:n}=await Promise.resolve().then(()=>($r(),Gg)),o=n();for(let c of["LLM_PROVIDER","OPENAI_API_KEY","ANTHROPIC_API_KEY","OPENROUTER_API_KEY","LLM_OPENROUTER_MODEL","LLM_OPENAI_MODEL","LLM_OLLAMA_HOST","LLM_OLLAMA_MODEL","LLM_CLI_MODEL"])o[c]&&(process.env[c]=o[c]);t();let i=await r(),{prompt:s}=await Promise.resolve().then(()=>(ye(),Zl)),a=await s("Reply with the single word: ok",{caller:"onboarding-test"});return{ok:!0,response:String(a).slice(0,200),provider:i}}catch(t){return{ok:!1,error:t.message,kind:"llm"}}}),e.register("testEmbedding",async()=>{try{let{embed:t}=await Promise.resolve().then(()=>(rr(),zl)),r=await t("Sigil onboarding test");return!Array.isArray(r)||r.length===0?{ok:!1,error:"The embedder returned an empty vector.",kind:"other"}:{ok:!0,dim:r.length}}catch(t){let{diagnoseError:r}=await Promise.resolve().then(()=>(Me(),Jt)),n=r(t);return{ok:!1,error:n.humanMessage,kind:n.kind,fixHint:n.fixHint}}})}var RD={"claude-code":()=>Promise.resolve().then(()=>(fy(),dy)),cursor:()=>Promise.resolve().then(()=>(Ey(),wy)),"codex-cli":()=>Promise.resolve().then(()=>(nw(),rw)),kiro:()=>Promise.resolve().then(()=>(uw(),lw)),hermes:()=>Promise.resolve().then(()=>(mw(),pw))};async function Sc(){return await Promise.all(Object.entries(RD).map(async([t,r])=>{let n=await r();if(!n.meta||typeof n.detect!="function"||typeof n.install!="function"||typeof n.uninstall!="function"||typeof n.verify!="function")throw new Error(`Client "${t}" is missing the install contract \u2014 expected exports: meta, detect, install, uninstall, verify`);return{...n.meta,detect:n.detect,install:n.install,uninstall:n.uninstall,verify:n.verify}}))}Xt();function CD(e,t){return t?"connected":e?"available":"unavailable"}async function hw(e){let r=(await Sc()).find(n=>n.id===e);if(!r)throw new H({errorCode:"VALIDATION_ERROR",message:`unknown connector: ${e}`});return r}function gw(e){e.register("listConnectors",async()=>{let t=await Sc();return{connectors:await Promise.all(t.map(async n=>{let[o,i]=await Promise.all([Promise.resolve().then(()=>n.detect()).catch(()=>!1),Promise.resolve().then(()=>n.verify()).catch(a=>({installed:!1,reason:a?.message}))]),s=!!i?.installed;return{id:n.id,label:n.label,hint:n.hint,detected:!!o,installed:s,status:CD(!!o,s),reason:i?.reason||null}}))}}),e.register("connectConnector",async(t={})=>{let r=await hw(t.id),n=[];try{n=(await r.install({dryRun:!1}))?.actions||[]}catch(i){throw new H({errorCode:"CONNECTOR_INSTALL_FAILED",message:i?.message,data:{id:r.id}})}let o=await Promise.resolve().then(()=>r.verify()).catch(i=>({installed:!1,reason:i?.message}));if(!o?.installed)throw new H({errorCode:"CONNECTOR_VERIFY_FAILED",hint:o?.reason||void 0,data:{id:r.id,reason:o?.reason||null}});return{ok:!0,id:r.id,status:"connected",actions:n}}),e.register("disconnectConnector",async(t={})=>{let r=await hw(t.id),n=[];try{n=(await r.uninstall({dryRun:!1}))?.actions||[]}catch(o){throw new H({errorCode:"CONNECTOR_INSTALL_FAILED",message:o?.message,data:{id:r.id}})}return{ok:!0,id:r.id,status:"available",actions:n}})}C();$r();Xt();_t();Ic();import $D from"knex";async function UD(e){let t=$D({client:"pg",connection:re(e),pool:{min:1,max:2}});try{let[r,n]=await t.migrate.latest({directory:ke});return{batchNo:r,ran:n}}finally{await t.destroy()}}function _w(e){e.register("dbDockerAvailable",async()=>zn()),e.register("dbProvisionDocker",async()=>{let t;try{t=await Tc()}catch(n){throw n?.dockerUnavailable?new H({errorCode:"DOCKER_UNAVAILABLE",message:n.message}):new H({errorCode:"DOCKER_PROVISION_FAILED",message:n?.message})}gt({SIGIL_DATABASE_URL:t.url,SIGIL_DB_TYPE:"postgres",SIGIL_DB_HOST:null,SIGIL_DB_PORT:null,SIGIL_DB_NAME:null,SIGIL_DB_USER:null,SIGIL_DB_PASSWORD:null});let r;try{r=await UD(t.url)}catch(n){let{diagnoseError:o}=await Promise.resolve().then(()=>(Me(),Jt));throw Yc(o(n),{data:{stage:"migrate",container:t.container}})}return{ok:!0,url:t.url,port:t.port,container:t.container,image:t.image,reused:t.reused,pgvector:t.pgvector,migrationsRan:r.ran.length,migrationBatch:r.batchNo}})}dc();Zt();function xw(e){e.register("serviceStatus",async()=>({...await uc(),db:ts?.()??null})),e.register("serviceInstall",async()=>{let t=await bi();return setTimeout(()=>process.exit(0),400),{ok:!0,handingOff:!0,...t}}),e.register("serviceUninstall",async()=>({ok:!0,...await lc()}))}C();import{existsSync as Sw}from"node:fs";import{readFile as Aw,writeFile as GD,mkdir as jD}from"node:fs/promises";import{dirname as WD}from"node:path";var KD=/(KEY|PASSWORD|TOKEN|SECRET)$/i;function Tw(e){e.register("readEnv",async()=>{let t=Sw(W)?await Aw(W,"utf8"):"",r=YD(t),n={};for(let[o,i]of Object.entries(r))KD.test(o)?n[o]={masked:!0,hasValue:!!i}:n[o]={masked:!1,value:i};return{path:W,entries:n}}),e.register("writeEnv",async t=>{let r=t.patch||{};if(typeof r!="object"||Array.isArray(r)){let s=new Error("writeEnv: params.patch must be an object");throw s.code="invalid_params",s}let n=Sw(W)?await Aw(W,"utf8"):"",o=VD(n,r);await jD(WD(W),{recursive:!0}),await GD(W,o,"utf8");let i=["SIGIL_MODE","SIGIL_MASTER_NODE_ID","SIGIL_NETWORK_ENABLED"];if(Object.keys(r).some(s=>i.includes(s)))try{let{resetMemoryClient:s}=await Promise.resolve().then(()=>(Bn(),Hn));s()}catch{}return{ok:!0,path:W,patchedKeys:Object.keys(r)}})}function YD(e){let t={};for(let r of e.split(`
|
|
715
|
+
`)){let n=r.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/i);if(!n)continue;let o=n[1],i=n[2].trim();(i.startsWith('"')&&i.endsWith('"')||i.startsWith("'")&&i.endsWith("'"))&&(i=i.slice(1,-1)),t[o]=i}return t}function VD(e,t){let r=new Set,o=e.split(`
|
|
716
|
+
`).map(s=>{let a=s.match(/^\s*([A-Z_][A-Z0-9_]*)\s*=/i);if(!a)return s;let c=a[1];if(!(c in t))return s;r.add(c);let l=t[c];return l==null?null:`${c}=${bw(l)}`}).filter(s=>s!==null);for(let[s,a]of Object.entries(t))r.has(s)||a===null||a===void 0||o.push(`${s}=${bw(a)}`);let i=o.join(`
|
|
640
717
|
`);return i.endsWith(`
|
|
641
718
|
`)||(i+=`
|
|
642
|
-
`),i}function
|
|
643
|
-
`),process.exit(0));let r=
|
|
644
|
-
`)}async function
|
|
645
|
-
`;e?e.write(r):process.stderr.write(r)}}import.meta.url===`file://${process.argv[1]}`&&
|
|
719
|
+
`),i}function bw(e){let t=String(e);return/[\s#"'$]/.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function Iw(e){e.register("nodeInfo",async()=>{let{default:t}=await Promise.resolve().then(()=>(A(),ne));if(!t.network.enabled)return{enabled:!1,mode:t.network.mode};let{getNodeInfo:r}=await Promise.resolve().then(()=>(Ue(),pt));try{let n=await r();return{enabled:!0,mode:t.network.mode,...n}}catch(n){return{enabled:!0,mode:t.network.mode,error:n.message}}})}Nc();import{randomBytes as aL}from"node:crypto";var cL=600;function Dw(e){e.register("pair.create",async t=>{let{default:r}=await Promise.resolve().then(()=>(T(),F)),n=(t.name||"").trim();if(!n){let p=new Error("pair.create: params.name required");throw p.code="invalid_params",p}let o=t.role||"writer";if(!["reader","writer","admin"].includes(o)){let p=new Error(`pair.create: invalid role "${o}"`);throw p.code="invalid_params",p}let i=Array.isArray(t.namespaces)?t.namespaces:[],s=Number.isFinite(t.ttlSeconds)?t.ttlSeconds:cL,a=new Date(Date.now()+s*1e3);r("pairing_code").whereNull("consumed_by_device_id").where("expires_at","<",new Date(Date.now()-24*3600*1e3)).del().catch(()=>{});let c=lL();await r("pairing_code").insert({code_hash:Fi(c),name:n,role:o,namespaces:i,expires_at:a});let{getNodeInfo:l}=await Promise.resolve().then(()=>(Ue(),pt)),d=null;try{d=(await l()).nodeId}catch{}return{code:c,expiresAt:a.toISOString(),name:n,role:o,namespaces:i,masterNodeId:d}}),e.register("pair.list",async(t={})=>{let{default:r}=await Promise.resolve().then(()=>(T(),F)),n=Math.min(Math.max(Number(t.limit)||50,1),200),o=Math.max(Number(t.offset)||0,0),i=await r("pairing_code").leftJoin("device","pairing_code.consumed_by_device_id","device.id").select("pairing_code.id","pairing_code.name","pairing_code.role","pairing_code.namespaces","pairing_code.expires_at","pairing_code.consumed_at","pairing_code.created_at","device.name as consumed_by_name","device.node_id as consumed_by_node_id").orderBy("pairing_code.created_at","desc").limit(n).offset(o);return{limit:n,offset:o,codes:i.map(s=>({id:s.id,name:s.name,role:s.role,namespaces:s.namespaces,expiresAt:s.expiresAt,consumedAt:s.consumedAt,consumedBy:s.consumedByName?{name:s.consumedByName,nodeId:s.consumedByNodeId}:null,expired:new Date(s.expiresAt)<new Date}))}}),e.register("pair.sweep",async()=>{let{default:t}=await Promise.resolve().then(()=>(T(),F)),r=new Date(Date.now()-24*3600*1e3);return{deleted:await t("pairing_code").whereNull("consumed_by_device_id").where("expires_at","<",r).del()}}),e.register("pair.revoke",async t=>{let{default:r}=await Promise.resolve().then(()=>(T(),F)),n=Number(t.id);if(!Number.isFinite(n)){let i=new Error("pair.revoke: params.id required");throw i.code="invalid_params",i}return{deleted:await r("pairing_code").where({id:n}).del()}})}function lL(){let e="ABCDEFGHJKLMNPQRSTUVWXYZ23456789",t=aL(8),r="";for(let n=0;n<8;n++)r+=e[t[n]%e.length];return`SIGIL-${r.slice(0,4)}-${r.slice(4,8)}`}function Lw(e){e.register("mode",async()=>{let{default:t}=await Promise.resolve().then(()=>(A(),ne)),{getMemoryClient:r}=await Promise.resolve().then(()=>(Bn(),Hn)),n="unknown",o=null;try{n=(await r()).kind}catch(i){o=i.message}return{mode:t.network.mode,networkEnabled:t.network.enabled,masterNodeId:t.network.masterNodeId,memoryClient:n,memoryClientError:o}})}function Pw(e){e.register("manifest.get",async()=>{let{produceManifest:t}=await Promise.resolve().then(()=>(Bi(),Hi));return t()}),e.register("manifest.verify",async t=>{let{produceManifest:r,verifyManifest:n}=await Promise.resolve().then(()=>(Bi(),Hi)),o=await r();return n(o,t.remote)})}var kw=new Set(["paused","compromised"]);function Mw(e){e.register("device.list",async(t={})=>{let{default:r}=await Promise.resolve().then(()=>(T(),F)),n=Math.min(Math.max(Number(t.limit)||100,1),500),o=Math.max(Number(t.offset)||0,0),i=await r("device").select("id","node_id","name","role","namespaces","active","meta","last_seen_at","created_at","revoked_reason").orderBy("created_at","desc").limit(n).offset(o);return{limit:n,offset:o,devices:i.map(s=>({id:s.id,nodeId:s.nodeId,name:s.name,role:s.role,namespaces:s.namespaces,active:s.active,revokedReason:s.revokedReason??null,reactivatable:s.active||s.revokedReason!=="compromised",lastSeenAt:s.lastSeenAt,createdAt:s.createdAt,meta:s.meta}))}}),e.register("device.revoke",async t=>{let{default:r}=await Promise.resolve().then(()=>(T(),F)),n=Number(t.id);if(!Number.isFinite(n)){let a=new Error("device.revoke: params.id required");throw a.code="invalid_params",a}let o=t.reason||"paused";if(!kw.has(o)){let a=new Error(`device.revoke: reason must be one of ${[...kw].join(", ")}`);throw a.code="invalid_params",a}let i=await r("device").where({id:n}).first(),s=await r("device").where({id:n}).update({active:!1,revoked_reason:o});if(s>0&&i){let{default:a}=await Promise.resolve().then(()=>(Qt(),Zc));a.emit("device.revoked",{deviceId:i.id,nodeId:i.nodeId,reason:o})}return{revoked:s>0,reason:o}}),e.register("device.activate",async t=>{let{default:r}=await Promise.resolve().then(()=>(T(),F)),n=Number(t.id);if(!Number.isFinite(n)){let s=new Error("device.activate: params.id required");throw s.code="invalid_params",s}let o=await r("device").where({id:n}).first();if(!o)return{activated:!1,notFound:!0};if(o.revokedReason==="compromised"){let s=new Error(`device ${n} ("${o.name}") was revoked as compromised. Re-activation is blocked \u2014 the device must re-pair with a fresh code.`);throw s.code="compromised",s}return{activated:await r("device").where({id:n}).update({active:!0,revoked_reason:null})>0}})}function Hw(e){e.register("trace.list",async(t={})=>{let{listTraces:r}=await Promise.resolve().then(()=>(dt(),ut));return{traces:await r({kind:t.kind||null,namespace:t.namespace||null,before:t.before||null,limit:t.limit??50})}}),e.register("trace.get",async(t={})=>{if(!t.uid){let o=new Error("trace.get: params.uid is required");throw o.code="invalid_params",o}let{getTrace:r}=await Promise.resolve().then(()=>(dt(),ut));return{trace:await r(t.uid)}}),e.register("trace.clear",async()=>{let{clearTraces:t}=await Promise.resolve().then(()=>(dt(),ut));return t()})}function Bw(e,{startedAt:t}){il(e,{startedAt:t}),Ih(e),Zh(e),Qh(e),eg(e),og(e),ig(e),sg(e),ag(e),cg(e),hg(e),gg(e),yg(e),Bg(e),Fg(e),$g(e),Ug(e),ay(e),gw(e),_w(e),xw(e),Tw(e),Iw(e),Dw(e),Lw(e),Pw(e),Mw(e),Hw(e)}var vc=Date.now();async function yL({foreground:e=!1}={}){delete process.env.SIGIL_AGENT,await Vi();let t=await Ki();t&&(process.stderr.write(`[sigild] already running (pid ${t})
|
|
720
|
+
`),process.exit(0));let r=_L();r(`starting (pid ${process.pid}, node ${process.version})`),await Wi();let n=qc();Zi(n),Bw(n,{startedAt:vc});let o=await zc({registry:n,log:r}),{default:i}=await Promise.resolve().then(()=>(A(),ne));if(i.network.mode!=="lite-follower"){try{let{ensureLocalPostgresRunning:p}=await Promise.resolve().then(()=>(Ic(),Ew));(await p()).started&&r("started local sigil-postgres container")}catch{}EL(r)}let s=null;if(i.http.enabled)try{s=await rl({registry:n,log:r,config:i})}catch(p){r(`http server failed to start: ${p.message}`)}let a=!1;if(i.network.enabled)try{if(i.network.mode==="master"){let{registerProtocol:m}=await Promise.resolve().then(()=>(Ue(),pt)),{PAIR_ALPN:w,createPairAcceptor:y}=await Promise.resolve().then(()=>(Nc(),vw)),{RPC_ALPN:E,createRpcAcceptor:b}=await Promise.resolve().then(()=>(Ja(),Rg));m(w,y({log:r})),m(E,b({registry:n,log:r})),r(`registered accept handlers: ${w}, ${E}`)}let{getNodeInfo:p}=await Promise.resolve().then(()=>(Ue(),pt)),f=await p();a=!0,r(`iroh node up: ${f.nodeId}`),f.relayUrl&&r(`iroh relay: ${f.relayUrl}`)}catch(p){r(`iroh failed to start: ${p.message}`)}else r(`iroh disabled (SIGIL_MODE=${i.network.mode})`);if(i.network.mode==="lite-follower")try{let{installLiteProxy:p}=await Promise.resolve().then(()=>($w(),Fw));await p({registry:n,log:r})}catch(p){r(`lite-proxy install failed: ${p.message}`)}let c=await wL(),l=()=>{try{mL(Vt,JSON.stringify({pid:process.pid,version:c,node:process.version,startedAt:vc,ts:Date.now(),supervised:process.env.SIGIL_SUPERVISED==="1"}),"utf8")}catch{}};l();let d=setInterval(l,15e3);d.unref(),Yi(async p=>{r(`received ${p}, shutting down`),clearInterval(d);try{hL(Vt,{force:!0})}catch{}if(await o.close(),s&&await s.close(),a)try{let{shutdownEndpoint:f}=await Promise.resolve().then(()=>(Ue(),pt));await f()}catch(f){r(`iroh shutdown failed: ${f.message}`)}try{let{default:f}=await Promise.resolve().then(()=>(T(),F));await f.destroy()}catch(f){r(`pool destroy failed: ${f.message}`)}await io(),es(),r("stopped")}),r(`ready in ${Date.now()-vc}ms \u2014 ${n.list().length} methods registered`),e&&process.stdout.write(`sigild ready
|
|
721
|
+
`)}async function wL(){try{let{readFile:e}=await import("node:fs/promises"),{join:t}=await import("node:path"),{PKG_ROOT:r}=await Promise.resolve().then(()=>(C(),kc));return JSON.parse(await e(t(r,"package.json"),"utf8")).version}catch{return"unknown"}}async function EL(e){try{let{default:t}=await Promise.resolve().then(()=>(T(),F)),{setDbHealth:r}=await Promise.resolve().then(()=>(Zt(),rs));try{await t.raw("SELECT 1"),r({healthy:!0,error:null,checkedAt:Date.now()})}catch(n){r({healthy:!1,error:n.message,checkedAt:Date.now()}),e(`DB UNREACHABLE: ${n.message} \u2014 memory operations will fail until Postgres is back`)}}catch{}}function _L(){let e;try{e=pL(Ie,{flags:"a"})}catch{}return t=>{let r=`[${new Date().toISOString()}] ${t}
|
|
722
|
+
`;e?e.write(r):process.stderr.write(r)}}import.meta.url===`file://${process.argv[1]}`&&yL({foreground:!0}).catch(async e=>{try{await gL(Ie,`[fatal] ${e.stack||e.message}
|
|
646
723
|
`)}catch{}process.stderr.write(`[sigild] fatal: ${e.message}
|
|
647
|
-
`),process.exit(1)});export{
|
|
724
|
+
`),process.exit(1)});export{yL as startDaemon};
|