@anmol-srv/sigil 0.10.3 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -12
- package/README.md +90 -82
- package/dist/cli.js +758 -507
- package/dist/daemon.js +724 -0
- package/dist/hooks/post-tool-use.js +20 -22
- package/dist/hooks/session-end.js +63 -61
- package/dist/hooks/stop.js +76 -74
- package/dist/hooks/user-prompt-submit.js +55 -47
- package/dist/server.js +45 -554
- package/integrations/hermes/README.md +4 -4
- package/integrations/hermes/plugin/README.md +8 -8
- package/knexfile.js +29 -8
- package/package.json +11 -5
- package/src/db/migrations/20260601000000_create-device-table.cjs +34 -0
- package/src/db/migrations/20260601000001_create-pairing-code-table.cjs +27 -0
- package/src/db/migrations/20260601000002_add-fact-provenance.cjs +31 -0
- package/src/db/migrations/20260601000003_add-device-revoked-reason.cjs +19 -0
- package/src/db/migrations/20260601000004_create-trace-event-table.cjs +35 -0
- package/src/db/migrations/20260601000005_add-fact-agent-provenance.cjs +25 -0
- package/src/gui/web/api.js +37 -0
- package/src/gui/web/app.css +947 -0
- package/src/gui/web/app.js +1230 -0
- package/src/gui/web/components.js +90 -0
- package/src/gui/web/design/colors_and_type.css +178 -0
- package/src/gui/web/design/sigil-mark-mono.svg +8 -0
- package/src/gui/web/design/sigil-mark.svg +26 -0
- package/src/gui/web/index.html +536 -0
- package/src/gui/web/sigil.svg +31 -0
- package/src/gui/web/toast.js +62 -0
package/dist/daemon.js
ADDED
|
@@ -0,0 +1,724 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __sigilCreateRequire } from 'node:module'; const require = __sigilCreateRequire(import.meta.url);
|
|
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,`
|
|
11
|
+
`),r=r.replace(/<br\s*\/?>/gi,`
|
|
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,`
|
|
13
|
+
|
|
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(`
|
|
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}:
|
|
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.
|
|
22
|
+
PGlite was deprecated; existing PGlite data at ~/.sigil/db is preserved but unreachable from this version.
|
|
23
|
+
Set SIGIL_DB_TYPE=postgres in ~/.sigil/.env and configure SIGIL_DB_HOST / PORT / NAME / USER / PASSWORD.
|
|
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.
|
|
25
|
+
You will pick an embedding provider in the next step \u2014 "openrouter" is an option,
|
|
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:
|
|
27
|
+
- Set LLM_PROVIDER (openai, anthropic, openrouter, ollama, claude-cli)
|
|
28
|
+
- Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or OPENROUTER_API_KEY
|
|
29
|
+
- Start Ollama locally
|
|
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:
|
|
31
|
+
- Set EMBEDDING_PROVIDER (voyage, ollama, openai, openrouter)
|
|
32
|
+
- Set VOYAGE_API_KEY (recommended \u2014 best quality)
|
|
33
|
+
- Start Ollama locally
|
|
34
|
+
- Set OPENAI_API_KEY
|
|
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(`
|
|
36
|
+
INSERT INTO embedding_cache (key, provider, model, embedding, hits, created_at, last_used_at)
|
|
37
|
+
VALUES (?, ?, ?, ?, 0, NOW(), NOW())
|
|
38
|
+
ON CONFLICT (key) DO UPDATE
|
|
39
|
+
SET last_used_at = NOW(),
|
|
40
|
+
hits = embedding_cache.hits + 1
|
|
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(`
|
|
42
|
+
DELETE FROM embedding_cache WHERE key IN (
|
|
43
|
+
SELECT key FROM embedding_cache ORDER BY last_used_at ASC LIMIT ?
|
|
44
|
+
)
|
|
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}
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
**Document title:** ${r}
|
|
51
|
+
|
|
52
|
+
**Full document:**
|
|
53
|
+
${t.slice(0,8e3)}
|
|
54
|
+
|
|
55
|
+
**Chunks (${e.length}):**
|
|
56
|
+
${o.join(`
|
|
57
|
+
`)}
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
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(`
|
|
62
|
+
INSERT INTO document (uid, source_path, source_type, title, content_hash, namespace, last_ingested_at, created_at, updated_at)
|
|
63
|
+
VALUES (?, ?, ?, ?, ?, ?, NOW(), NOW(), NOW())
|
|
64
|
+
ON CONFLICT (source_path, namespace) DO UPDATE SET
|
|
65
|
+
title = EXCLUDED.title,
|
|
66
|
+
content_hash = EXCLUDED.content_hash,
|
|
67
|
+
last_ingested_at = NOW(),
|
|
68
|
+
updated_at = NOW()
|
|
69
|
+
RETURNING *, (xmax = 0) AS "isNew", content_hash != ? AS "contentChanged"
|
|
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(`
|
|
71
|
+
UPDATE chunk
|
|
72
|
+
SET search_vector = to_tsvector('english', COALESCE(contextual_prefix, '') || ' ' || content)
|
|
73
|
+
WHERE document_id = ?
|
|
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}
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
${t}
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
Respond with ONLY a JSON array of facts. Each fact object must have exactly these fields:
|
|
84
|
+
- "content" (string): the atomic fact statement
|
|
85
|
+
- "category" (string): one of ${r.join(", ")}
|
|
86
|
+
- "confidence" (string): one of high, medium, low
|
|
87
|
+
- "importance" (string): "vital" if essential to understanding the topic, "supplementary" if supporting detail
|
|
88
|
+
|
|
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")}
|
|
90
|
+
|
|
91
|
+
**EXISTING FACT:** ${t}
|
|
92
|
+
|
|
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(`
|
|
94
|
+
UPDATE fact
|
|
95
|
+
SET search_vector = to_tsvector('english', content)
|
|
96
|
+
WHERE id = ?
|
|
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(`
|
|
98
|
+
SELECT id, uid, content, category, status,
|
|
99
|
+
1 - (${i}) as similarity
|
|
100
|
+
FROM fact
|
|
101
|
+
WHERE namespace = ?
|
|
102
|
+
AND status = 'active'
|
|
103
|
+
AND embedding IS NOT NULL
|
|
104
|
+
AND 1 - (${i}) >= ?
|
|
105
|
+
ORDER BY ${i}
|
|
106
|
+
LIMIT ?
|
|
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
|
|
108
|
+
SET access_count = access_count + 1,
|
|
109
|
+
last_accessed_at = NOW(),
|
|
110
|
+
stage = CASE WHEN stage = 'stable' THEN 'editing' ELSE stage END,
|
|
111
|
+
stage_entered_at = CASE WHEN stage = 'stable' THEN NOW() ELSE stage_entered_at END
|
|
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")}
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
Title: ${t||"(none)"}
|
|
117
|
+
Input: ${e}
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
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(`
|
|
122
|
+
UPDATE entity
|
|
123
|
+
SET aliases = (
|
|
124
|
+
SELECT ARRAY(SELECT DISTINCT unnest(aliases || ARRAY[?]::text[]))
|
|
125
|
+
)
|
|
126
|
+
WHERE id = ?
|
|
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(`
|
|
128
|
+
SELECT id, uid, name, entity_type AS "entityType", description,
|
|
129
|
+
mention_count AS "mentionCount",
|
|
130
|
+
1 - (${s}) AS similarity
|
|
131
|
+
FROM entity
|
|
132
|
+
WHERE entity_type = ?
|
|
133
|
+
AND namespace = COALESCE(?, ?)
|
|
134
|
+
AND embedding IS NOT NULL
|
|
135
|
+
AND merged_with IS NULL
|
|
136
|
+
AND 1 - (${s}) >= ?
|
|
137
|
+
ORDER BY ${s}
|
|
138
|
+
LIMIT ?
|
|
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(`
|
|
140
|
+
SELECT id, name, entity_type AS "entityType", entity_types AS "entityTypes",
|
|
141
|
+
1 - (${s}) AS similarity
|
|
142
|
+
FROM entity
|
|
143
|
+
WHERE namespace = ?
|
|
144
|
+
AND embedding IS NOT NULL
|
|
145
|
+
AND LOWER(name) != LOWER(?)
|
|
146
|
+
AND merged_with IS NULL
|
|
147
|
+
AND 1 - (${s}) >= ?
|
|
148
|
+
ORDER BY ${s}
|
|
149
|
+
LIMIT ?
|
|
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?`
|
|
151
|
+
Source passage where the new mention appeared:
|
|
152
|
+
---
|
|
153
|
+
${n.slice(0,1500)}
|
|
154
|
+
---
|
|
155
|
+
`:"",c=`You're deciding whether two entity mentions refer to the same real-world thing, and whether the source passage indicates a RENAME.
|
|
156
|
+
|
|
157
|
+
Mention A (new): "${e}" (type: ${t})
|
|
158
|
+
Mention B (existing): "${r.name}" (types: ${(r.types||[r.entityType]).join(", ")})
|
|
159
|
+
${i}
|
|
160
|
+
${s}
|
|
161
|
+
${a}
|
|
162
|
+
Decision rules:
|
|
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.
|
|
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.
|
|
165
|
+
- "current_name" = which of A or B is the new/canonical name per the source passage (the one we want as \`entity.name\` going forward). Only meaningful when "rename" is true. Use the literal string of mention A or B.
|
|
166
|
+
- If you cannot tell, "same" is false. Don't guess.
|
|
167
|
+
|
|
168
|
+
Respond as STRICT JSON, no markdown, no prose:
|
|
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(`
|
|
170
|
+
INSERT INTO fact_entity (fact_id, entity_id, mention_type, mention_count, created_at, updated_at)
|
|
171
|
+
SELECT fact_id, ?, mention_type, mention_count, NOW(), NOW()
|
|
172
|
+
FROM fact_entity
|
|
173
|
+
WHERE entity_id = ?
|
|
174
|
+
ON CONFLICT (fact_id, entity_id, mention_type)
|
|
175
|
+
DO UPDATE SET mention_count = fact_entity.mention_count + EXCLUDED.mention_count
|
|
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")}
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
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(`
|
|
182
|
+
INSERT INTO relation (source_id, target_id, relation_type, source_fact_id, mention_count, valid_at, created_at, updated_at)
|
|
183
|
+
VALUES (?, ?, ?, ?, 1, ?, NOW(), NOW())
|
|
184
|
+
ON CONFLICT (source_id, target_id, relation_type) DO UPDATE SET
|
|
185
|
+
mention_count = relation.mention_count + 1,
|
|
186
|
+
source_fact_id = COALESCE(EXCLUDED.source_fact_id, relation.source_fact_id),
|
|
187
|
+
updated_at = NOW()
|
|
188
|
+
RETURNING *
|
|
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(`
|
|
190
|
+
SELECT r.id AS "relationId", r.relation_type AS "relationType",
|
|
191
|
+
r.mention_count AS "mentionCount", r.valid_at AS "validAt",
|
|
192
|
+
e.id AS "entityId", e.uid, e.name, e.entity_type AS "entityType",
|
|
193
|
+
e.description, '${a}' AS direction
|
|
194
|
+
FROM relation r
|
|
195
|
+
JOIN entity e ON e.id = r.${l}
|
|
196
|
+
WHERE r.${c} = ?
|
|
197
|
+
AND r.invalid_at IS NULL
|
|
198
|
+
AND e.merged_with IS NULL
|
|
199
|
+
${r?"AND r.relation_type = ?":""}
|
|
200
|
+
ORDER BY r.mention_count DESC
|
|
201
|
+
LIMIT ?
|
|
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(`
|
|
203
|
+
SELECT r.id, r.relation_type AS "relationType",
|
|
204
|
+
r.mention_count AS "mentionCount",
|
|
205
|
+
s.name AS "sourceName", s.entity_type AS "sourceType",
|
|
206
|
+
t.name AS "targetName", t.entity_type AS "targetType"
|
|
207
|
+
FROM relation r
|
|
208
|
+
JOIN entity s ON s.id = r.source_id
|
|
209
|
+
JOIN entity t ON t.id = r.target_id
|
|
210
|
+
WHERE r.source_fact_id = ?
|
|
211
|
+
AND r.invalid_at IS NULL
|
|
212
|
+
AND s.merged_with IS NULL
|
|
213
|
+
AND t.merged_with IS NULL
|
|
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(`
|
|
215
|
+
INSERT INTO pod (uid, pod_type, name, namespace, attrs, entity_id, connection_id, external_id, started_at, created_at, updated_at)
|
|
216
|
+
VALUES (?, ?, ?, ?, ?::jsonb, ?, ?, ?, ?, NOW(), NOW())
|
|
217
|
+
ON CONFLICT (pod_type, external_id, namespace) WHERE external_id IS NOT NULL DO UPDATE SET
|
|
218
|
+
attrs = pod.attrs || EXCLUDED.attrs,
|
|
219
|
+
updated_at = NOW()
|
|
220
|
+
RETURNING *, (xmax = 0) AS "isNew"
|
|
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
|
|
222
|
+
SET member_doc_count = member_doc_count + ?,
|
|
223
|
+
member_fact_count = member_fact_count + ?,
|
|
224
|
+
updated_at = NOW()
|
|
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)
|
|
226
|
+
VALUES (?, ?, ?, ?)
|
|
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(`
|
|
248
|
+
COALESCE(f.importance_score, 2) DESC,
|
|
249
|
+
COALESCE(fl.last_accessed_at, f.created_at) DESC
|
|
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(`
|
|
251
|
+
`),n].join(`
|
|
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()?`
|
|
253
|
+
|
|
254
|
+
`:"")+i+`
|
|
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(`
|
|
256
|
+
INSERT INTO hebbian_edge (fact_a_id, fact_b_id, strength, first_seen_at, last_seen_at)
|
|
257
|
+
VALUES ${n}
|
|
258
|
+
ON CONFLICT (fact_a_id, fact_b_id)
|
|
259
|
+
DO UPDATE SET
|
|
260
|
+
strength = hebbian_edge.strength + 1,
|
|
261
|
+
last_seen_at = NOW()
|
|
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(`
|
|
263
|
+
INSERT INTO entity_hebbian_edge (entity_a_id, entity_b_id, strength, first_seen_at, last_seen_at)
|
|
264
|
+
VALUES ${s}
|
|
265
|
+
ON CONFLICT (entity_a_id, entity_b_id)
|
|
266
|
+
DO UPDATE SET
|
|
267
|
+
strength = LEAST(entity_hebbian_edge.strength + ?, ?),
|
|
268
|
+
last_seen_at = NOW()
|
|
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(`
|
|
270
|
+
SELECT
|
|
271
|
+
CASE WHEN entity_a_id = ? THEN entity_b_id ELSE entity_a_id END AS "partnerId",
|
|
272
|
+
(strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0))::float8 AS "effectiveStrength",
|
|
273
|
+
strength::float8 AS "rawStrength",
|
|
274
|
+
last_seen_at AS "lastSeenAt"
|
|
275
|
+
FROM entity_hebbian_edge
|
|
276
|
+
WHERE entity_a_id = ? OR entity_b_id = ?
|
|
277
|
+
ORDER BY "effectiveStrength" DESC
|
|
278
|
+
LIMIT ?
|
|
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(`
|
|
280
|
+
SELECT
|
|
281
|
+
CASE
|
|
282
|
+
WHEN entity_a_id = ANY(?::bigint[]) THEN entity_b_id
|
|
283
|
+
ELSE entity_a_id
|
|
284
|
+
END AS "candidateId",
|
|
285
|
+
SUM(strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0))::float8 AS "summedStrength"
|
|
286
|
+
FROM entity_hebbian_edge
|
|
287
|
+
WHERE
|
|
288
|
+
(entity_a_id = ANY(?::bigint[]) AND entity_b_id = ANY(?::bigint[]))
|
|
289
|
+
OR
|
|
290
|
+
(entity_b_id = ANY(?::bigint[]) AND entity_a_id = ANY(?::bigint[]))
|
|
291
|
+
GROUP BY "candidateId"
|
|
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(`
|
|
293
|
+
DELETE FROM entity_hebbian_edge
|
|
294
|
+
WHERE (strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0)) <= ?
|
|
295
|
+
AND last_seen_at < NOW() - (INTERVAL '1 day' * ?)
|
|
296
|
+
RETURNING entity_a_id
|
|
297
|
+
`,[r,e,t]);return n.length}async function RR({topN:e=5}={}){let t=pi(g.hebbian.entity.halfLifeDays),r=await h.raw(`
|
|
298
|
+
SELECT
|
|
299
|
+
COUNT(*)::int AS "edgeCount",
|
|
300
|
+
COALESCE(AVG(strength)::float8, 0) AS "avgStrength",
|
|
301
|
+
COALESCE(MAX(strength)::float8, 0) AS "maxStrength"
|
|
302
|
+
FROM entity_hebbian_edge
|
|
303
|
+
`),n=await h.raw(`
|
|
304
|
+
SELECT
|
|
305
|
+
ea.name AS "aName",
|
|
306
|
+
eb.name AS "bName",
|
|
307
|
+
strength::float8 AS "strength",
|
|
308
|
+
(strength * EXP(-1.0 * ?::float8 * EXTRACT(EPOCH FROM (NOW() - last_seen_at)) / 86400.0))::float8 AS "decayed"
|
|
309
|
+
FROM entity_hebbian_edge
|
|
310
|
+
JOIN entity ea ON ea.id = entity_a_id
|
|
311
|
+
JOIN entity eb ON eb.id = entity_b_id
|
|
312
|
+
ORDER BY "decayed" DESC
|
|
313
|
+
LIMIT ?
|
|
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
|
|
315
|
+
WHEN 'high' THEN 2
|
|
316
|
+
WHEN 'medium' THEN 1
|
|
317
|
+
ELSE 0
|
|
318
|
+
END`});async function Ch(e,{namespaces:t,limit:r=20}){let n=G(e),o=`${Re("embedding")} <=> ${Ce()}`,{rows:i}=await h.raw(`
|
|
319
|
+
SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
|
|
320
|
+
content, section_heading AS "sectionHeading", namespace,
|
|
321
|
+
1 - (${o}) as similarity
|
|
322
|
+
FROM chunk
|
|
323
|
+
WHERE namespace = ANY(?)
|
|
324
|
+
AND embedding IS NOT NULL
|
|
325
|
+
ORDER BY ${o}
|
|
326
|
+
LIMIT ?
|
|
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(`
|
|
328
|
+
SELECT id, document_id AS "documentId", chunk_index AS "chunkIndex",
|
|
329
|
+
content, section_heading AS "sectionHeading", namespace,
|
|
330
|
+
ts_rank(search_vector, plainto_tsquery('english', ?)) as rank
|
|
331
|
+
FROM chunk
|
|
332
|
+
WHERE namespace = ANY(?)
|
|
333
|
+
AND search_vector @@ plainto_tsquery('english', ?)
|
|
334
|
+
ORDER BY rank DESC
|
|
335
|
+
LIMIT ?
|
|
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(
|
|
337
|
+
SELECT member_id FROM pod_membership
|
|
338
|
+
WHERE member_type = 'fact' AND pod_id = ANY(?::int[])
|
|
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=`
|
|
340
|
+
WITH semantic AS (
|
|
341
|
+
SELECT id,
|
|
342
|
+
uid,
|
|
343
|
+
content, category, confidence, importance, namespace, status,
|
|
344
|
+
source_document_ids AS "sourceDocumentIds",
|
|
345
|
+
source_section AS "sourceSection",
|
|
346
|
+
created_by_device_id AS "createdByDeviceId",
|
|
347
|
+
created_by_agent AS "createdByAgent",
|
|
348
|
+
created_at,
|
|
349
|
+
1 - (${l}) AS similarity,
|
|
350
|
+
ROW_NUMBER() OVER (ORDER BY ${l}) AS rank_ix
|
|
351
|
+
FROM fact
|
|
352
|
+
WHERE namespace = ANY(?)
|
|
353
|
+
AND status = 'active'
|
|
354
|
+
AND embedding IS NOT NULL
|
|
355
|
+
AND ${Mn} >= ?
|
|
356
|
+
${d}
|
|
357
|
+
${p}
|
|
358
|
+
${E}
|
|
359
|
+
ORDER BY ${l}
|
|
360
|
+
LIMIT ?
|
|
361
|
+
),
|
|
362
|
+
keyword AS (
|
|
363
|
+
SELECT id,
|
|
364
|
+
uid,
|
|
365
|
+
content, category, confidence, importance, namespace, status,
|
|
366
|
+
source_document_ids AS "sourceDocumentIds",
|
|
367
|
+
source_section AS "sourceSection",
|
|
368
|
+
created_by_device_id AS "createdByDeviceId",
|
|
369
|
+
created_by_agent AS "createdByAgent",
|
|
370
|
+
created_at,
|
|
371
|
+
ts_rank_cd(search_vector, plainto_tsquery('english', ?)) AS keyword_rank,
|
|
372
|
+
ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_vector, plainto_tsquery('english', ?)) DESC) AS rank_ix
|
|
373
|
+
FROM fact
|
|
374
|
+
WHERE namespace = ANY(?)
|
|
375
|
+
AND status = 'active'
|
|
376
|
+
AND ${Mn} >= ?
|
|
377
|
+
AND search_vector @@ plainto_tsquery('english', ?)
|
|
378
|
+
${d}
|
|
379
|
+
${p}
|
|
380
|
+
${E}
|
|
381
|
+
ORDER BY keyword_rank DESC
|
|
382
|
+
LIMIT ?
|
|
383
|
+
),
|
|
384
|
+
fused AS (
|
|
385
|
+
SELECT COALESCE(s.id, k.id) AS id,
|
|
386
|
+
COALESCE(s.uid, k.uid) AS uid,
|
|
387
|
+
COALESCE(s.content, k.content) AS content,
|
|
388
|
+
COALESCE(s.category, k.category) AS category,
|
|
389
|
+
COALESCE(s.confidence, k.confidence) AS confidence,
|
|
390
|
+
COALESCE(s.importance, k.importance) AS importance,
|
|
391
|
+
COALESCE(s.namespace, k.namespace) AS namespace,
|
|
392
|
+
COALESCE(s.status, k.status) AS status,
|
|
393
|
+
COALESCE(s."sourceDocumentIds", k."sourceDocumentIds") AS "sourceDocumentIds",
|
|
394
|
+
COALESCE(s."sourceSection", k."sourceSection") AS "sourceSection",
|
|
395
|
+
COALESCE(s."createdByDeviceId", k."createdByDeviceId") AS "createdByDeviceId",
|
|
396
|
+
COALESCE(s."createdByAgent", k."createdByAgent") AS "createdByAgent",
|
|
397
|
+
COALESCE(s.created_at, k.created_at) AS created_at,
|
|
398
|
+
COALESCE(s.similarity, 0) AS similarity,
|
|
399
|
+
(
|
|
400
|
+
${DR} * (1.0 / (${Lh} + COALESCE(s.rank_ix, ?)))
|
|
401
|
+
+ ${LR} * (1.0 / (${Lh} + COALESCE(k.rank_ix, ?)))
|
|
402
|
+
) AS rrf_raw
|
|
403
|
+
FROM semantic s
|
|
404
|
+
FULL OUTER JOIN keyword k ON s.id = k.id
|
|
405
|
+
),
|
|
406
|
+
ranked AS (
|
|
407
|
+
SELECT f.*,
|
|
408
|
+
COALESCE(fl.access_count, 0) AS access_count,
|
|
409
|
+
fl.last_accessed_at,
|
|
410
|
+
-- ACT-R activation: ln(n+1) - 0.5*ln(t_days), softplus to keep >= 0.
|
|
411
|
+
-- t_days floor of 0.01 prevents log(0). Recently-accessed facts win ties.
|
|
412
|
+
ln(1.0 + exp(
|
|
413
|
+
ln(COALESCE(fl.access_count, 0) + 1.0)
|
|
414
|
+
- 0.5 * ln(
|
|
415
|
+
GREATEST(
|
|
416
|
+
EXTRACT(epoch FROM (now() - COALESCE(fl.last_accessed_at, f.created_at))) / 86400.0,
|
|
417
|
+
0.01
|
|
418
|
+
)
|
|
419
|
+
)
|
|
420
|
+
)) AS activation,
|
|
421
|
+
CASE f.importance WHEN 'vital' THEN ${kR} ELSE 1.0 END AS importance_mult,
|
|
422
|
+
CASE f.confidence
|
|
423
|
+
WHEN 'high' THEN ${MR}
|
|
424
|
+
WHEN 'medium' THEN ${HR}
|
|
425
|
+
WHEN 'low' THEN ${BR}
|
|
426
|
+
ELSE 1.0
|
|
427
|
+
END AS confidence_mult
|
|
428
|
+
FROM fused f
|
|
429
|
+
LEFT JOIN fact_lifecycle fl ON fl.fact_id = f.id
|
|
430
|
+
)
|
|
431
|
+
SELECT id, uid, content, category, confidence, importance, namespace, status,
|
|
432
|
+
"sourceDocumentIds", "sourceSection", "createdByDeviceId", "createdByAgent", similarity,
|
|
433
|
+
rrf_raw,
|
|
434
|
+
access_count,
|
|
435
|
+
last_accessed_at AS "lastAccessedAt",
|
|
436
|
+
activation,
|
|
437
|
+
(rrf_raw * activation * importance_mult * confidence_mult) AS final_score
|
|
438
|
+
FROM ranked
|
|
439
|
+
ORDER BY final_score DESC,
|
|
440
|
+
CASE WHEN importance = 'vital' THEN 0 ELSE 1 END
|
|
441
|
+
LIMIT ?
|
|
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.
|
|
443
|
+
|
|
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.
|
|
445
|
+
|
|
446
|
+
Think about:
|
|
447
|
+
- Synonyms and rephrased versions
|
|
448
|
+
- Inverse/negative framings (if someone asks "what should I use", also search for "what to avoid")
|
|
449
|
+
- Related concepts that would inform the answer
|
|
450
|
+
- Specific terms someone might have used when storing this knowledge
|
|
451
|
+
|
|
452
|
+
User query: "${e}"
|
|
453
|
+
|
|
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")}
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
Query: ${e}
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
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.
|
|
463
|
+
Each retrieved item is labeled [F#] (a stored fact) or [C#] (a raw conversation chunk
|
|
464
|
+
that may include user/assistant turns and dates).
|
|
465
|
+
|
|
466
|
+
Question: ${e}
|
|
467
|
+
|
|
468
|
+
Retrieved memory items:
|
|
469
|
+
${n.join(`
|
|
470
|
+
`)}
|
|
471
|
+
|
|
472
|
+
Instructions:
|
|
473
|
+
- Read the chunks carefully \u2014 the answer is often a specific phrase or date inside one of them, not always pre-summarized as a fact.
|
|
474
|
+
- Reason step-by-step internally for temporal questions ("first", "before", "after", "how many days") \u2014 compare the dates explicitly.
|
|
475
|
+
- Cite items in square brackets where they directly support the answer, e.g. [C2].
|
|
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.
|
|
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(`
|
|
478
|
+
WITH RECURSIVE graph AS (
|
|
479
|
+
SELECT r.target_id AS entity_id, r.relation_type, r.mention_count,
|
|
480
|
+
1 AS depth, ARRAY[?::integer] AS path
|
|
481
|
+
FROM relation r
|
|
482
|
+
WHERE r.source_id = ?
|
|
483
|
+
AND r.invalid_at IS NULL
|
|
484
|
+
${s}
|
|
485
|
+
|
|
486
|
+
UNION ALL
|
|
487
|
+
|
|
488
|
+
SELECT r.target_id, r.relation_type, r.mention_count,
|
|
489
|
+
g.depth + 1, g.path || r.target_id
|
|
490
|
+
FROM relation r
|
|
491
|
+
JOIN graph g ON r.source_id = g.entity_id
|
|
492
|
+
WHERE g.depth < ?
|
|
493
|
+
AND r.invalid_at IS NULL
|
|
494
|
+
AND NOT (r.target_id = ANY(g.path))
|
|
495
|
+
${a}
|
|
496
|
+
)
|
|
497
|
+
SELECT DISTINCT ON (g.entity_id)
|
|
498
|
+
g.entity_id AS "entityId", g.relation_type AS "relationType",
|
|
499
|
+
g.depth, g.mention_count AS "mentionCount",
|
|
500
|
+
e.name, e.entity_type AS "entityType", e.description, e.uid
|
|
501
|
+
FROM graph g
|
|
502
|
+
JOIN entity e ON e.id = g.entity_id
|
|
503
|
+
WHERE e.merged_with IS NULL
|
|
504
|
+
ORDER BY g.entity_id, g.depth ASC
|
|
505
|
+
LIMIT ?
|
|
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(`
|
|
507
|
+
WITH RECURSIVE search AS (
|
|
508
|
+
SELECT r.target_id AS current_id,
|
|
509
|
+
ARRAY[r.source_id, r.target_id] AS path,
|
|
510
|
+
ARRAY[r.relation_type] AS relation_types,
|
|
511
|
+
1 AS depth
|
|
512
|
+
FROM relation r
|
|
513
|
+
WHERE r.source_id = ?
|
|
514
|
+
AND r.invalid_at IS NULL
|
|
515
|
+
|
|
516
|
+
UNION ALL
|
|
517
|
+
|
|
518
|
+
SELECT r.target_id,
|
|
519
|
+
s.path || r.target_id,
|
|
520
|
+
s.relation_types || r.relation_type,
|
|
521
|
+
s.depth + 1
|
|
522
|
+
FROM relation r
|
|
523
|
+
JOIN search s ON r.source_id = s.current_id
|
|
524
|
+
WHERE s.depth < ?
|
|
525
|
+
AND r.invalid_at IS NULL
|
|
526
|
+
AND NOT (r.target_id = ANY(s.path))
|
|
527
|
+
)
|
|
528
|
+
SELECT path, relation_types AS "relationTypes", depth
|
|
529
|
+
FROM search
|
|
530
|
+
WHERE current_id = ?
|
|
531
|
+
ORDER BY depth ASC
|
|
532
|
+
LIMIT 1
|
|
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)
|
|
534
|
+
|
|
535
|
+
Sigil is your persistent memory system. **Use it instead of the built-in file-based memory.**
|
|
536
|
+
Do NOT write to \`~/.claude/projects/*/memory/\` or any local memory files \u2014 use Sigil exclusively.
|
|
537
|
+
|
|
538
|
+
### Memory is auto-injected \u2014 don't re-search by default
|
|
539
|
+
|
|
540
|
+
Two hooks do the work for you before you ever see a prompt:
|
|
541
|
+
|
|
542
|
+
- **UserPromptSubmit hook**: runs hybrid search against Sigil on every user message and injects the top-K relevant facts into your context as \`additionalContext\` at the top of the conversation. The injected block is labelled \`Sigil memory (N relevant facts)\` \u2014 when you see that block, those facts are already loaded; you do NOT need to call \`sigil search\` to retrieve them.
|
|
543
|
+
- **Top-20 hot-context**: a snapshot of the user's most-important / most-recently-accessed facts is always loaded into the session via \`@~/.sigil/CLAUDE.md\` in the Claude config. Treat it as always-available background context.
|
|
544
|
+
|
|
545
|
+
**The right reflex:** read the injected \`Sigil memory\` block first, answer from it, then call \`sigil search\` ONLY if the injection clearly missed something specific.
|
|
546
|
+
|
|
547
|
+
Concretely, you SHOULD call \`! ${t} search "..."\` when:
|
|
548
|
+
- The user asks a drill-down question and you need facts the auto-injection didn't surface ("tell me more about the postmortem")
|
|
549
|
+
- You're answering a *follow-up* in a long session where the relevant facts were never in the original injection
|
|
550
|
+
- You suspect a stale answer and want to verify against the latest stored state
|
|
551
|
+
|
|
552
|
+
You SHOULD NOT call \`sigil search\` when:
|
|
553
|
+
- The injected \`Sigil memory\` block already lists facts that directly answer the user's question \u2014 just use them
|
|
554
|
+
- You'd be searching for the same query Sigil already auto-searched (the user's literal prompt)
|
|
555
|
+
- The question is general-knowledge and doesn't need this user's specific context
|
|
556
|
+
|
|
557
|
+
In short: **the hook already searched. Trust it. Drill down only when needed.**
|
|
558
|
+
|
|
559
|
+
### Acknowledge what you know
|
|
560
|
+
|
|
561
|
+
When your response is shaped by a fact pulled from Sigil \u2014 a stored preference, decision, constraint, or piece of project history \u2014 **briefly call it out in plain language so the user sees their context being applied.** One short clause is enough; don't lecture.
|
|
562
|
+
|
|
563
|
+
Good (natural, useful):
|
|
564
|
+
- "Since you don't use \`any\` without an escape-hatch comment, I'll go with \`unknown\` here."
|
|
565
|
+
- "Per your ADR-001 I've wrapped the response in \`{ok, data, error}\`."
|
|
566
|
+
- "I know you moved off Redis to Postgres LISTEN/NOTIFY, so I'll use that pattern."
|
|
567
|
+
- "Going with named exports since you prefer those."
|
|
568
|
+
|
|
569
|
+
Bad (skip these):
|
|
570
|
+
- Acknowledging facts you didn't actually use
|
|
571
|
+
- Listing every retrieved fact ("I found 5 facts: 1) ... 2) ...")
|
|
572
|
+
- Repeating the acknowledgement multiple times in one response
|
|
573
|
+
- Apologetic / formal phrasing ("As per your stored preference, I shall...")
|
|
574
|
+
|
|
575
|
+
The phrasing should feel like a teammate referencing a hallway conversation, not a system reciting a database row. If a fact didn't materially shape the answer, don't mention it.
|
|
576
|
+
|
|
577
|
+
### Saving \u2014 Stop hook handles routine; you only save when explicit
|
|
578
|
+
|
|
579
|
+
A Stop hook fires after every assistant turn, scans the user's latest message with a classifier, and saves anything memorable (preferences, decisions, constraints, corrections, factual claims) on its own. **You do not need to call \`sigil remember\` to make this work.**
|
|
580
|
+
|
|
581
|
+
You SHOULD call \`! ${t} remember --bg "..."\` ONLY when:
|
|
582
|
+
- The user explicitly asks you to remember something ("remember that...", "save this...", "don't forget...") \u2014 save immediately, don't wait for the Stop hook
|
|
583
|
+
- The user shares a critical fact mid-response that's important enough to be available within this same session for follow-ups (the Stop hook only runs at turn end)
|
|
584
|
+
- You're consolidating a multi-turn discussion into a single canonical fact
|
|
585
|
+
|
|
586
|
+
You SHOULD NOT redundantly save:
|
|
587
|
+
- Generic preferences the Stop hook will obviously catch \u2014 let it
|
|
588
|
+
- Facts already similar to existing memory (AUDM dedup handles this, but the cleaner UX is fewer Bash invocations on screen)
|
|
589
|
+
|
|
590
|
+
When you do save, batch facts into ONE call (separate quoted arguments), use \`--bg\` to return immediately:
|
|
591
|
+
|
|
592
|
+
\`\`\`
|
|
593
|
+
! ${t} remember --bg "User prefers tabs over spaces" "Project uses Postgres 15"
|
|
594
|
+
\`\`\`
|
|
595
|
+
|
|
596
|
+
The absolute path above is baked in by \`sigil init\` so the command works regardless of which shell PATH the agent's Bash subprocess inherits. Re-run \`sigil init\` to refresh after moving machines or reinstalling.
|
|
597
|
+
|
|
598
|
+
### Rules
|
|
599
|
+
|
|
600
|
+
- Read the auto-injected \`Sigil memory\` block first; answer from it before reaching for new searches
|
|
601
|
+
- Save facts as short, self-contained statements \u2014 never summaries of the conversation
|
|
602
|
+
- Each fact must make sense in isolation, without the conversation context
|
|
603
|
+
- Batch all explicit saves in one user-turn into a single \`${t} remember --bg\` call
|
|
604
|
+
- Skip trivial exchanges (greetings, "thanks", "ok", simple math)
|
|
605
|
+
- If search and injection both return nothing, answer from your own knowledge and say so
|
|
606
|
+
- Sigil is cross-project \u2014 memories from one session are available in all sessions
|
|
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(`
|
|
612
|
+
SELECT c.relname AS tbl,
|
|
613
|
+
a.atttypmod AS typmod,
|
|
614
|
+
format_type(a.atttypid, a.atttypmod) AS coltype
|
|
615
|
+
FROM pg_attribute a
|
|
616
|
+
JOIN pg_class c ON a.attrelid = c.oid
|
|
617
|
+
WHERE a.attname = 'embedding'
|
|
618
|
+
AND c.relkind = 'r'
|
|
619
|
+
AND c.relname = ANY($1)
|
|
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
|
|
700
|
+
\r
|
|
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>
|
|
702
|
+
<html><head><meta charset="utf-8"><title>Sigil</title>
|
|
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>
|
|
704
|
+
</head><body>
|
|
705
|
+
<h1>Sigil daemon is running</h1>
|
|
706
|
+
<p>The GUI has not been built yet. The daemon is reachable on this port and
|
|
707
|
+
authentication works \u2014 paste the URL printed in <code>sigil daemon logs</code>
|
|
708
|
+
into your browser to set the auth cookie.</p>
|
|
709
|
+
<p>You can also drive it from your terminal:</p>
|
|
710
|
+
<pre>curl -H "Authorization: Bearer $(cat ~/.sigil/gui.token)" \\
|
|
711
|
+
-X POST http://localhost:7777/api/v1/rpc \\
|
|
712
|
+
-d '{"method":"ping"}' \\
|
|
713
|
+
-H "Content-Type: application/json"</pre>
|
|
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(`
|
|
717
|
+
`);return i.endsWith(`
|
|
718
|
+
`)||(i+=`
|
|
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}
|
|
723
|
+
`)}catch{}process.stderr.write(`[sigild] fatal: ${e.message}
|
|
724
|
+
`),process.exit(1)});export{yL as startDaemon};
|