context-mode 1.0.161 → 1.0.162
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.openclaw-plugin/openclaw.plugin.json +1 -1
- package/.openclaw-plugin/package.json +1 -1
- package/build/session/analytics.d.ts +7 -7
- package/build/session/analytics.js +13 -12
- package/build/session/db.d.ts +1 -0
- package/build/session/db.js +14 -1
- package/build/session/extract.d.ts +46 -0
- package/build/session/extract.js +756 -13
- package/build/session/project-attribution.js +14 -0
- package/cli.bundle.mjs +10 -6
- package/hooks/session-db.bundle.mjs +11 -7
- package/hooks/session-extract.bundle.mjs +2 -2
- package/hooks/session-loaders.mjs +8 -5
- package/hooks/sessionstart.mjs +16 -2
- package/hooks/userpromptsubmit.mjs +9 -2
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
- package/server.bundle.mjs +9 -5
|
@@ -194,14 +194,28 @@ export function resolveProjectAttribution(event, context) {
|
|
|
194
194
|
export function resolveProjectAttributions(events, context) {
|
|
195
195
|
const out = [];
|
|
196
196
|
let lastKnown = context.lastKnownProjectDir ? normalizePath(context.lastKnownProjectDir) : "";
|
|
197
|
+
// v1.0.162 Bug 8 — track whether an in-batch CWD-level event has explicitly
|
|
198
|
+
// re-scoped the project. When extract.ts emits a cwd event for `cd /projB`
|
|
199
|
+
// or `git -C /projB ...`, subsequent path-less events in the same batch
|
|
200
|
+
// (e.g. the git operation event itself) currently fall back to the hook's
|
|
201
|
+
// inputProjectDir, which still points at the session startup cwd. The
|
|
202
|
+
// user's INTENTIONAL scoping should win over the hook's startup cwd —
|
|
203
|
+
// shadow inputProjectDir with the carried-forward lastKnown once a high-
|
|
204
|
+
// confidence cwd event has fired in this batch.
|
|
205
|
+
let inBatchCwdScope = false;
|
|
197
206
|
for (const ev of events) {
|
|
207
|
+
const effectiveInputCwd = inBatchCwdScope ? lastKnown : context.inputProjectDir;
|
|
198
208
|
const attribution = resolveProjectAttribution(ev, {
|
|
199
209
|
...context,
|
|
210
|
+
inputProjectDir: effectiveInputCwd,
|
|
200
211
|
lastKnownProjectDir: lastKnown || context.lastKnownProjectDir || null,
|
|
201
212
|
});
|
|
202
213
|
out.push(attribution);
|
|
203
214
|
if (attribution.projectDir && attribution.confidence >= ATTRIBUTION_CONFIDENCE.CARRY_FORWARD_THRESHOLD) {
|
|
204
215
|
lastKnown = attribution.projectDir;
|
|
216
|
+
if (attribution.confidence >= ATTRIBUTION_CONFIDENCE.CWD_EVENT) {
|
|
217
|
+
inBatchCwdScope = true;
|
|
218
|
+
}
|
|
205
219
|
}
|
|
206
220
|
}
|
|
207
221
|
return out;
|
package/cli.bundle.mjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
var FR=Object.create;var _d=Object.defineProperty;var HR=Object.getOwnPropertyDescriptor;var UR=Object.getOwnPropertyNames;var BR=Object.getPrototypeOf,ZR=Object.prototype.hasOwnProperty;var S=(t,e)=>()=>(t&&(e=t(t=0)),e);var L=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),we=(t,e)=>{for(var r in e)_d(t,r,{get:e[r],enumerable:!0})},qR=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of UR(e))!ZR.call(t,o)&&o!==r&&_d(t,o,{get:()=>e[o],enumerable:!(n=HR(e,o))||n.enumerable});return t};var xi=(t,e,r)=>(r=t!=null?FR(BR(t)):{},qR(e||!t||!t.__esModule?_d(r,"default",{value:t,enumerable:!0}):r,t));var Ed=L((vq,bx)=>{"use strict";var wd={to(t,e){return e?`\x1B[${e+1};${t+1}H`:`\x1B[${t+1}G`},move(t,e){let r="";return t<0?r+=`\x1B[${-t}D`:t>0&&(r+=`\x1B[${t}C`),e<0?r+=`\x1B[${-e}A`:e>0&&(r+=`\x1B[${e}B`),r},up:(t=1)=>`\x1B[${t}A`,down:(t=1)=>`\x1B[${t}B`,forward:(t=1)=>`\x1B[${t}C`,backward:(t=1)=>`\x1B[${t}D`,nextLine:(t=1)=>"\x1B[E".repeat(t),prevLine:(t=1)=>"\x1B[F".repeat(t),left:"\x1B[G",hide:"\x1B[?25l",show:"\x1B[?25h",save:"\x1B7",restore:"\x1B8"},tC={up:(t=1)=>"\x1B[S".repeat(t),down:(t=1)=>"\x1B[T".repeat(t)},rC={screen:"\x1B[2J",up:(t=1)=>"\x1B[1J".repeat(t),down:(t=1)=>"\x1B[J".repeat(t),line:"\x1B[2K",lineEnd:"\x1B[K",lineStart:"\x1B[1K",lines(t){let e="";for(let r=0;r<t;r++)e+=this.line+(r<t-1?wd.up():"");return t&&(e+=wd.left),e}};bx.exports={cursor:wd,scroll:tC,erase:rC,beep:"\x07"}});var Tx=L((n4,Od)=>{var hc=process||{},Ex=hc.argv||[],fc=hc.env||{},TC=!(fc.NO_COLOR||Ex.includes("--no-color"))&&(!!fc.FORCE_COLOR||Ex.includes("--color")||hc.platform==="win32"||(hc.stdout||{}).isTTY&&fc.TERM!=="dumb"||!!fc.CI),PC=(t,e,r=t)=>n=>{let o=""+n,s=o.indexOf(e,t.length);return~s?t+RC(o,e,r,s)+e:t+o+e},RC=(t,e,r,n)=>{let o="",s=0;do o+=t.substring(s,n)+r,s=n+e.length,n=t.indexOf(e,s);while(~n);return o+t.substring(s)},$x=(t=TC)=>{let e=t?PC:()=>String;return{isColorSupported:t,reset:e("\x1B[0m","\x1B[0m"),bold:e("\x1B[1m","\x1B[22m","\x1B[22m\x1B[1m"),dim:e("\x1B[2m","\x1B[22m","\x1B[22m\x1B[2m"),italic:e("\x1B[3m","\x1B[23m"),underline:e("\x1B[4m","\x1B[24m"),inverse:e("\x1B[7m","\x1B[27m"),hidden:e("\x1B[8m","\x1B[28m"),strikethrough:e("\x1B[9m","\x1B[29m"),black:e("\x1B[30m","\x1B[39m"),red:e("\x1B[31m","\x1B[39m"),green:e("\x1B[32m","\x1B[39m"),yellow:e("\x1B[33m","\x1B[39m"),blue:e("\x1B[34m","\x1B[39m"),magenta:e("\x1B[35m","\x1B[39m"),cyan:e("\x1B[36m","\x1B[39m"),white:e("\x1B[37m","\x1B[39m"),gray:e("\x1B[90m","\x1B[39m"),bgBlack:e("\x1B[40m","\x1B[49m"),bgRed:e("\x1B[41m","\x1B[49m"),bgGreen:e("\x1B[42m","\x1B[49m"),bgYellow:e("\x1B[43m","\x1B[49m"),bgBlue:e("\x1B[44m","\x1B[49m"),bgMagenta:e("\x1B[45m","\x1B[49m"),bgCyan:e("\x1B[46m","\x1B[49m"),bgWhite:e("\x1B[47m","\x1B[49m"),blackBright:e("\x1B[90m","\x1B[39m"),redBright:e("\x1B[91m","\x1B[39m"),greenBright:e("\x1B[92m","\x1B[39m"),yellowBright:e("\x1B[93m","\x1B[39m"),blueBright:e("\x1B[94m","\x1B[39m"),magentaBright:e("\x1B[95m","\x1B[39m"),cyanBright:e("\x1B[96m","\x1B[39m"),whiteBright:e("\x1B[97m","\x1B[39m"),bgBlackBright:e("\x1B[100m","\x1B[49m"),bgRedBright:e("\x1B[101m","\x1B[49m"),bgGreenBright:e("\x1B[102m","\x1B[49m"),bgYellowBright:e("\x1B[103m","\x1B[49m"),bgBlueBright:e("\x1B[104m","\x1B[49m"),bgMagentaBright:e("\x1B[105m","\x1B[49m"),bgCyanBright:e("\x1B[106m","\x1B[49m"),bgWhiteBright:e("\x1B[107m","\x1B[49m")}};Od.exports=$x();Od.exports.createColors=$x});function Si(t,e){let r=process.execPath.replace(/\\/g,"/");if(Yn(e?.platform)){let o=r.split("/").pop().replace(/\.exe$/i,"");Id.has(o)||(r=e?.jsRuntime?.replace(/\\/g,"/")??"node")}let n=t.replace(/\\/g,"/");return`"${r}" "${n}"`}function Xe(t,e){if(Yn(e?.platform))return Si(t,e);let n=Ad().path.replace(/\\/g,"/"),o=t.replace(/\\/g,"/");return`"${n}" "${o}"`}function gc(t){if(typeof t!="string"||t.length===0)return null;let e=t.match(/^"([^"]+)"\s+"([^"]+)"\s*$/);return e?{nodePath:e[1],scriptPath:e[2]}:null}function Yn(t){return!!t&&CC.has(t)}var Id,CC,Cr=S(()=>{"use strict";Xo();Id=new Set(["node","bun","deno"]),CC=new Set(["opencode","kilo"])});var Ax={};we(Ax,{buildCommand:()=>Ld,detectRuntimes:()=>Qn,getAvailableLanguages:()=>Ei,getRuntimeSummary:()=>wi,hasBunRuntime:()=>_n,isAllowlistedShell:()=>Rx,resetHookRuntimeCache:()=>NC,resolveHookRuntime:()=>Ad,resolveJavascriptRuntime:()=>Ix});import{execFileSync as Md,execSync as Yo}from"node:child_process";import{existsSync as yc}from"node:fs";function Dd(t){let e=t.split(/[\\/]/);return e[e.length-1]??t}function Rx(t){return OC.test(Dd(t))}function IC(t){let e=t.toLowerCase().replace(/\//g,"\\");return/\\windows\\(?:system32|sysnative)\\bash\.exe$/.test(e)||/\\microsoft\\windowsapps\\bash\.exe$/.test(e)}function tt(t){try{let e=ki?`where ${t}`:`command -v ${t}`;return Yo(e,{stdio:"pipe"}),!0}catch{return!1}}function Nd(t){if(ki)try{let r=Yo(`where ${t}`,{encoding:"utf-8",stdio:"pipe"}).trim().split(/\r?\n/).map(o=>o.trim()).filter(Boolean);if(r.length===0||r.filter(o=>!/\\Microsoft\\WindowsApps\\/i.test(o)).length===0)return!1}catch{return!1}else if(!tt(t))return!1;try{return ki?Yo(`"${t}" --version`,{stdio:"pipe",timeout:5e3}):Md(t,["--version"],{stdio:"pipe",timeout:1500}),!0}catch{return!1}}function jd(){if(tt("bun"))return!0;for(let t of Ox())if(yc(t))return!0;return!1}function Cx(){for(let e of Ox())if(yc(e))return e;if(tt("bun"))return"bun";let t=process.env.HOME??process.env.USERPROFILE??"";return ki?`${t}\\.bun\\bin\\bun.exe`:`${t}/.bun/bin/bun`}function Ox(){let t=process.env.HOME??process.env.USERPROFILE??"";if(ki){let e=process.env.LOCALAPPDATA??"",r=process.env.APPDATA??"";return[...t?[`${t}\\.bun\\bin\\bun.exe`]:[],...e?[`${e}\\bun\\bin\\bun.exe`]:[],...r?[`${r}\\npm\\node_modules\\bun\\bin\\bun.exe`]:[]]}return t?[`${t}/.bun/bin/bun`]:[]}function AC(){let t=["C:\\Program Files\\Git\\usr\\bin\\bash.exe","C:\\Program Files (x86)\\Git\\usr\\bin\\bash.exe"];for(let e of t)if(yc(e))return e;try{let r=Yo("where bash",{encoding:"utf-8",stdio:"pipe"}).trim().split(/\r?\n/).map(n=>n.trim()).filter(Boolean);for(let n of r){let o=n.toLowerCase();if(!(o.includes("system32")||o.includes("windowsapps")))return n}return null}catch{return null}}function Wt(t,e=["--version"]){try{if(process.platform==="win32"){let r=[t,...e].map(n=>/[\s"&|<>^()%!]/.test(n)?JSON.stringify(n):n).join(" ");return Yo(r,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}).trim().split(/\r?\n/)[0]}else return Md(t,e,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}).trim().split(/\r?\n/)[0]}catch{return"unknown"}}function Ix(t,e={}){if(t)return t;let r=e.execPath??process.execPath,n=e.commandExists??tt,o=r.split(/[\\/]/).pop().replace(/\.exe$/i,"");return Id.has(o)?r:n("node")?"node":null}function Qn(){let e=jd()?Cx():null,r=process.env.SHELL,n=process.platform==="win32",o=r&&yc(r)&&Rx(r)&&!(n&&IC(r))?r:null;return{javascript:Ix(e),typescript:e||(tt("tsx")?"tsx":tt("ts-node")?"ts-node":null),python:Nd("python3")?"python3":Nd("python")?"python":Nd("py")?"py":null,shell:o??(n?AC()??(tt("sh")?"sh":tt("powershell")?"powershell":"cmd.exe"):tt("bash")?"bash":"sh"),ruby:tt("ruby")?"ruby":null,go:tt("go")?"go":null,rust:tt("rustc")?"rustc":null,php:tt("php")?"php":null,perl:tt("perl")?"perl":null,r:tt("Rscript")?"Rscript":tt("r")?"r":null,elixir:tt("elixir")?"elixir":null,csharp:tt("dotnet-script")?"dotnet-script":null}}function _n(){return jd()}function NC(){zt=null}function DC(t){let e=t.trim(),r=/^(\d+)\.(\d+)\.(\d+)/.exec(e);if(!r)return!1;let n=Number(r[1]);return Number.isFinite(n)&&n>=1}function Ad(){if(zt)return zt;let t={path:process.execPath,isBun:!1};try{if(!jd())return zt=t,zt;let e=Cx(),r;try{if(process.platform==="win32"){let n=Yo(`"${e}" --version`,{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3});r=String(n)}else{let n=Md(e,["--version"],{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3});r=String(n)}}catch{return zt=t,zt}return DC(r)?(zt={path:e,isBun:!0},zt):(zt=t,zt)}catch{return zt=t,zt}}function wi(t){let e=[],r=t.javascript?.endsWith("bun")??!1;return t.javascript?e.push(` JavaScript: ${t.javascript} (${Wt(t.javascript)})${r?" \u26A1":""}`):e.push(" JavaScript: not available (install node or bun \u2014 host process is not a JS runtime)"),t.typescript?e.push(` TypeScript: ${t.typescript} (${Wt(t.typescript)})`):e.push(" TypeScript: not available (install bun, tsx, or ts-node)"),t.python?e.push(` Python: ${t.python} (${Wt(t.python)})`):e.push(" Python: not available"),e.push(` Shell: ${t.shell} (${Wt(t.shell)})`),t.ruby&&e.push(` Ruby: ${t.ruby} (${Wt(t.ruby)})`),t.go&&e.push(` Go: ${t.go} (${Wt(t.go,["version"])})`),t.rust&&e.push(` Rust: ${t.rust} (${Wt(t.rust)})`),t.php&&e.push(` PHP: ${t.php} (${Wt(t.php)})`),t.perl&&e.push(` Perl: ${t.perl} (${Wt(t.perl)})`),t.r&&e.push(` R: ${t.r} (${Wt(t.r)})`),t.elixir&&e.push(` Elixir: ${t.elixir} (${Wt(t.elixir)})`),t.csharp&&e.push(` C#: ${t.csharp} (${Wt(t.csharp)})`),r||(e.push(""),e.push(" Tip: Install Bun for 3-5x faster JS/TS execution \u2192 https://bun.sh")),e.join(`
|
|
3
3
|
`)}function Ei(t){let e=["javascript","shell"];return t.typescript&&e.push("typescript"),t.python&&e.push("python"),t.ruby&&e.push("ruby"),t.go&&e.push("go"),t.rust&&e.push("rust"),t.php&&e.push("php"),t.perl&&e.push("perl"),t.r&&e.push("r"),t.elixir&&e.push("elixir"),t.csharp&&e.push("csharp"),e}function Ld(t,e,r){switch(e){case"javascript":if(!t.javascript)throw new Error("No JavaScript runtime available. Install Node.js or Bun on PATH (the host process is not itself a JS runtime).");return Px.test(Dd(t.javascript))?[t.javascript,"run",r]:[t.javascript,r];case"typescript":if(!t.typescript)throw new Error("No TypeScript runtime available. Install one of: bun (recommended), tsx (npm i -g tsx), or ts-node.");return Px.test(Dd(t.typescript))?[t.typescript,"run",r]:t.typescript==="tsx"?["tsx",r]:["ts-node",r];case"python":if(!t.python)throw new Error("No Python runtime available. Install python3 or python.");return[t.python,r];case"shell":{if(process.platform==="win32"){let o=t.shell.toLowerCase();if(o.includes("bash")||o.endsWith("/sh")||o.endsWith("\\sh.exe")){let i=r.replace(/'/g,"'\\''");return[t.shell,"-c",`source '${i}'`]}if(o.includes("powershell")||o.includes("pwsh"))return[t.shell,"-NoProfile","-ExecutionPolicy","Bypass","-File",r];let s=o.split(/[\\/]/).pop()??o;if(s==="cmd"||s==="cmd.exe")return[t.shell,"/d","/s","/c",r]}return[t.shell,r]}case"ruby":if(!t.ruby)throw new Error("Ruby not available. Install ruby.");return[t.ruby,r];case"go":if(!t.go)throw new Error("Go not available. Install go.");return["go","run",r];case"rust":{if(!t.rust)throw new Error("Rust not available. Install rustc via https://rustup.rs");return["__rust_compile_run__",r]}case"php":if(!t.php)throw new Error("PHP not available. Install php.");return["php",r];case"perl":if(!t.perl)throw new Error("Perl not available. Install perl.");return["perl",r];case"r":if(!t.r)throw new Error("R not available. Install R / Rscript.");return[t.r,r];case"elixir":if(!t.elixir)throw new Error("Elixir not available. Install elixir.");return["elixir",r];case"csharp":if(!t.csharp)throw new Error("C# not available. Install dotnet-script via `dotnet tool install -g dotnet-script`.");return[t.csharp,r]}}var OC,Px,ki,zt,Xo=S(()=>{"use strict";Cr();OC=/^(bash|sh|zsh|dash|pwsh|powershell|cmd)(\.exe)?$/i,Px=/^bun(\.exe)?$/i;ki=process.platform==="win32";zt=null});function MC(t){let e=[];if(t&&typeof t=="object"){let r=t.command;typeof r=="string"&&e.push(r);let n=t.hooks;if(Array.isArray(n)){for(let o of n)if(o&&typeof o=="object"){let s=o.command;typeof s=="string"&&e.push(s)}}}return e}function jC(t){let e=gc(t);if(e)return e.scriptPath.endsWith(".mjs")?e.scriptPath:null;let r=t.match(/^\s*node\s+"([^"]+\.mjs)"\s*$/);if(r)return r[1];let n=t.match(/^\s*node\s+(\S+\.mjs)\s*$/);return n?n[1]:null}function _c(t,e){let r=new Set,n=t.generateHookConfig(e);for(let o of Object.values(n))if(Array.isArray(o))for(let s of o)for(let i of MC(s)){let a=jC(i);a&&r.add(a)}return[...r]}var zd=S(()=>{"use strict";Cr()});var Nx,Dx=S(()=>{"use strict";Nx={"claude-code":"claude-code","gemini-cli-mcp-client":"gemini-cli","antigravity-client":"antigravity","cursor-vscode":"cursor","Visual-Studio-Code":"vscode-copilot","JetBrains Client":"jetbrains-copilot","IntelliJ IDEA":"jetbrains-copilot",PyCharm:"jetbrains-copilot",Codex:"codex","codex-mcp-client":"codex","Kilo Code":"kilo","Kiro CLI":"kiro","Pi CLI":"pi","Pi Coding Agent":"pi","omp-coding-agent":"omp",Zed:"zed",zed:"zed","qwen-code":"qwen-code","qwen-cli-mcp-client":"qwen-code","kimi-code":"kimi",kimi:"kimi","Kimi Code":"kimi"}});var Ud={};we(Ud,{BunSQLiteAdapter:()=>xc,NodeSQLiteAdapter:()=>bc,SQLiteBase:()=>Ti,applyWALPragmas:()=>es,cleanOrphanedWALFiles:()=>ts,closeDB:()=>rs,defaultDBPath:()=>Hd,deleteDBFiles:()=>vc,hasModernSqlite:()=>Lx,isSQLiteCorruptionError:()=>Sc,loadDatabase:()=>rt,nodeSqliteHasFts5:()=>jx,renameCorruptDB:()=>zx,withRetry:()=>xn});import{createRequire as LC}from"node:module";import{existsSync as zC,unlinkSync as Mx,renameSync as FC}from"node:fs";import{tmpdir as HC}from"node:os";import{join as UC}from"node:path";function jx(t){let e=null;try{return e=new t(":memory:"),e.exec("CREATE VIRTUAL TABLE __fts5_probe USING fts5(x)"),!0}catch{return!1}finally{try{e?.close()}catch{}}}function Lx(t,e){let r=e!==void 0?e:globalThis.Bun;if(typeof r<"u"&&r!==null)return!0;let n=t??process.versions,[o,s]=(n.node??"0.0.0").split("."),i=Number(o),a=Number(s);return!Number.isFinite(i)||!Number.isFinite(a)?!1:i>22||i===22&&a>=5}function rt(){if(!Qo){let t=LC(import.meta.url);if(globalThis.Bun){let e=t(["bun","sqlite"].join(":")).Database;Qo=function(n,o){let s=new e(n,{readonly:o?.readonly,create:!0}),i=new xc(s);return o?.timeout&&i.pragma(`busy_timeout = ${o.timeout}`),i}}else if(Lx()){let e=null;try{({DatabaseSync:e}=t(["node","sqlite"].join(":")))}catch{e=null}e&&jx(e)?Qo=function(n,o){let s=new e(n,{readOnly:o?.readonly??!1}),i=new bc(s);return o?.timeout&&i.pragma(`busy_timeout = ${o.timeout}`),i}:Qo=t("better-sqlite3")}else Qo=t("better-sqlite3")}return Qo}function es(t){t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL");try{t.pragma("mmap_size = 268435456")}catch{}}function ts(t){if(!zC(t))for(let e of["-wal","-shm"])try{Mx(t+e)}catch{}}function vc(t){for(let e of["","-wal","-shm"])try{Mx(t+e)}catch{}}function rs(t){try{t.pragma("wal_checkpoint(TRUNCATE)")}catch{}try{t.close()}catch{}}function Hd(t="context-mode"){return UC(HC(),`${t}-${process.pid}.db`)}function xn(t,e=[100,500,2e3]){let r;for(let n=0;n<=e.length;n++)try{return t()}catch(o){let s=o instanceof Error?o.message:String(o);if(!s.includes("SQLITE_BUSY")&&!s.includes("database is locked"))throw o;if(r=o instanceof Error?o:new Error(s),n<e.length){let i=e[n],a=Date.now();for(;Date.now()-a<i;);}}throw new Error(`SQLITE_BUSY: database is locked after ${e.length} retries. Original error: ${r?.message}`)}function Sc(t){return t.includes("SQLITE_CORRUPT")||t.includes("SQLITE_NOTADB")||t.includes("database disk image is malformed")||t.includes("file is not a database")}function zx(t){let e=Date.now();for(let r of["","-wal","-shm"])try{FC(t+r,`${t}${r}.corrupt-${e}`)}catch{}}var xc,bc,Qo,$i,Fd,Ti,bn=S(()=>{"use strict";xc=class{#e;constructor(e){this.#e=e}pragma(e){let n=this.#e.prepare(`PRAGMA ${e}`).all();if(!n||n.length===0)return;if(n.length>1)return n;let o=Object.values(n[0]);return o.length===1?o[0]:n[0]}exec(e){let r="",n=null;for(let s=0;s<e.length;s++){let i=e[s];if(n)r+=i,i===n&&(n=null);else if(i==="'"||i==='"')r+=i,n=i;else if(i===";"){let a=r.trim();a&&this.#e.prepare(a).run(),r=""}else r+=i}let o=r.trim();return o&&this.#e.prepare(o).run(),this}prepare(e){let r=this.#e.prepare(e);return{run:(...n)=>r.run(...n),get:(...n)=>{let o=r.get(...n);return o===null?void 0:o},all:(...n)=>r.all(...n),iterate:(...n)=>r.iterate(...n)}}transaction(e){return this.#e.transaction(e)}close(){this.#e.close()}},bc=class{#e;constructor(e){this.#e=e}pragma(e){let n=this.#e.prepare(`PRAGMA ${e}`).all();if(!n||n.length===0)return;if(n.length>1)return n;let o=Object.values(n[0]);return o.length===1?o[0]:n[0]}exec(e){return this.#e.exec(e),this}prepare(e){let r=this.#e.prepare(e);return{run:(...n)=>r.run(...n),get:(...n)=>r.get(...n),all:(...n)=>r.all(...n),iterate:(...n)=>typeof r.iterate=="function"?r.iterate(...n):r.all(...n)[Symbol.iterator]()}}transaction(e){return(...r)=>{this.#e.exec("BEGIN");try{let n=e(...r);return this.#e.exec("COMMIT"),n}catch(n){throw this.#e.exec("ROLLBACK"),n}}}close(){this.#e.close()}},Qo=null;$i=Symbol.for("__context_mode_live_dbs_v3__"),Fd=(()=>{let t=globalThis;return t[$i]||(t[$i]=new Set,process.on("exit",()=>{for(let e of t[$i])rs(e);t[$i].clear()})),t[$i]})(),Ti=class{#e;#t;constructor(e){let r=rt();this.#e=e,ts(e);let n;try{n=new r(e,{timeout:3e4}),es(n)}catch(o){let s=o instanceof Error?o.message:String(o);if(Sc(s)){zx(e),ts(e);try{n=new r(e,{timeout:3e4}),es(n)}catch(i){throw new Error(`Failed to create fresh DB after renaming corrupt file: ${i instanceof Error?i.message:String(i)}`)}}else throw o}this.#t=n,Fd.add(this.#t),this.initSchema(),this.prepareStatements()}get db(){return this.#t}get dbPath(){return this.#e}close(){Fd.delete(this.#t),rs(this.#t)}withRetry(e){return xn(e)}cleanup(){Fd.delete(this.#t),rs(this.#t),vc(this.#e)}}});var Qx={};we(Qx,{SessionDB:()=>Gt,StorageDirectoryError:()=>Kt,_resetWorktreeSuffixCacheForTests:()=>sO,applyMissingSessionEventsColumns:()=>qd,clearStorageDirectoryCheckCacheForTests:()=>QC,describeStorageDirectorySource:()=>Ri,ensureSessionEventsSchema:()=>Vd,ensureWritableStorageDir:()=>Ir,formatStorageDirectoryError:()=>is,getWorktreeSuffix:()=>Ci,hashProjectDirCanonical:()=>nt,hashProjectDirLegacy:()=>Ar,normalizeWorktreePath:()=>as,resolveContentStorageDir:()=>Sn,resolveContentStorePath:()=>Zd,resolveDefaultSessionDir:()=>$c,resolveSessionDbPath:()=>cs,resolveSessionPath:()=>Yx,resolveSessionStorageDir:()=>Jr,resolveStatsStorageDir:()=>ss});import{createHash as Pi}from"node:crypto";import{execFileSync as BC}from"node:child_process";import{accessSync as ZC,constants as qC,existsSync as Ec,mkdirSync as VC,realpathSync as WC,renameSync as Bd}from"node:fs";import{homedir as qx}from"node:os";import{dirname as KC,isAbsolute as Vx,join as vn,resolve as os}from"node:path";function $c(t){let e=t.env??process.env,r=t.legacySessionDirEnv,n=r?e[r]?.trim():void 0;return n&&r?(t.onLegacySessionDir?.(r,n),n):vn(GC(t.configDir,t.configDirEnv,e),"context-mode","sessions")}function GC(t,e,r){let n=e?r[e]:void 0;return n&&n.trim()!==""?Hx(n.trim()):Hx(t,qx())}function Hx(t,e){return t.startsWith("~")?os(qx(),t.replace(/^~[/\\]?/,"")):Vx(t)?os(t):e?os(e,t):os(t)}function JC(t,e,r){return new Kt(t,e,Or,void 0,[`Invalid ${Or} for context-mode ${t} directory: ${r}`,Jx()].join(`
|
|
4
4
|
`))}function Kx(t){let e=process.env[Or];if(e===void 0)return{kind:"unset"};let r=e.trim();if(!r)return{kind:"ignored-empty",ignoredEnvVar:Or,ignoredReason:"empty"};if(!Vx(r))throw JC(t,r,`${Or} must be an absolute path.`);return{kind:"override",root:os(r)}}function XC(t){return t.kind==="ignored-empty"?{ignoredEnvVar:t.ignoredEnvVar,ignoredReason:t.ignoredReason}:{}}function Gx(t,e){let r=Kx(t);return r.kind!=="override"?null:{kind:t,path:vn(r.root,e),envVar:Or,source:"override"}}function YC(t,e,r){return{kind:t,path:os(e()),envVar:null,source:"default",...r}}function Jr(t){let e=Kx("session");return e.kind==="override"?{kind:"session",path:vn(e.root,Wx),envVar:Or,source:"override"}:YC("session",t,XC(e))}function Sn(t){let e=Gx("content",Fx);if(e)return e;let r=Jr(t);return{kind:"content",path:vn(KC(r.path),Fx),envVar:r.envVar,source:r.source,ignoredEnvVar:r.ignoredEnvVar,ignoredReason:r.ignoredReason}}function ss(t){let e=Gx("stats",Wx);if(e)return e;let r=Jr(t);return{kind:"stats",path:r.path,envVar:r.envVar,source:r.source,ignoredEnvVar:r.ignoredEnvVar,ignoredReason:r.ignoredReason}}function is(t){return t.message}function Ri(t){return t.source==="override"&&t.envVar?`via ${t.envVar}`:t.ignoredEnvVar&&t.ignoredReason==="empty"?`default; ignored empty ${t.ignoredEnvVar}`:"default"}function QC(){wc.clear()}function Ir(t){let e=[t.kind,t.path,t.source,t.envVar??"",t.ignoredEnvVar??"",t.ignoredReason??""].join("\0"),r=wc.get(e);if(r instanceof Kt)throw r;if(r===t.path)return r;try{return VC(t.path,{recursive:!0}),ZC(t.path,qC.W_OK),wc.set(e,t.path),t.path}catch(n){let o=new Kt(t.kind,rO(n)??t.path,Or,n,void 0,{ignoredEnvVar:t.ignoredEnvVar,ignoredReason:t.ignoredReason});throw wc.set(e,o),o}}function eO(t,e,r={}){return[`context-mode ${t} directory is not writable: ${e}`,tO(r),Jx()].filter(Boolean).join(`
|
|
5
|
-
`)}function tO(t){return t.ignoredEnvVar&&t.ignoredReason==="empty"?`Ignored empty ${t.ignoredEnvVar}; using adapter default.`:null}function Jx(){return`Set ${Or} to a writable absolute path.`}function rO(t){if(!t||typeof t!="object")return null;let e=t.path;return typeof e=="string"&&e.length>0?e:null}function as(t){let e=t.replace(/\\/g,"/");return/^\/+$/.test(e)?"/":/^[A-Za-z]:\/+$/.test(e)?`${e.slice(0,2)}/`:e.replace(/\/+$/,"")}function Ux(t){let e=t;try{e=WC.native(t)}catch{}let r=as(e);return process.platform==="win32"||process.platform==="darwin"?r.toLowerCase():r}function Xx(t,e){return BC("git",["-C",t,...e],{encoding:"utf-8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}function nO(t){let e=Xx(t,["rev-parse","--show-toplevel"]);return e.length>0?as(e):null}function oO(t){let e=Xx(t,["worktree","list","--porcelain"]).split(/\r?\n/).find(r=>r.startsWith("worktree "))?.replace("worktree ","")?.trim();return e?as(e):null}function Ci(t=process.cwd()){let e=process.env.CONTEXT_MODE_SESSION_SUFFIX;if(ns&&ns.projectDir===t&&ns.envSuffix===e)return ns.suffix;let r="";if(e!==void 0)r=e?`__${e}`:"";else try{let n=nO(t),o=oO(t);if(n&&o){let s=Ux(n),i=Ux(o);s!==i&&(r=`__${Pi("sha256").update(s).digest("hex").slice(0,8)}`)}}catch{}return ns={projectDir:t,envSuffix:e,suffix:r},r}function sO(){ns=void 0}function Ar(t){return Pi("sha256").update(as(t)).digest("hex").slice(0,16)}function nt(t){let e=as(t),r=process.platform==="darwin"||process.platform==="win32"?e.toLowerCase():e;return Pi("sha256").update(r).digest("hex").slice(0,16)}function Zd(t){let{projectDir:e,contentDir:r}=t,n=nt(e),o=vn(r,`${n}.db`);if(Ec(o))return o;let s=Ar(e);if(s===n)return o;let i=vn(r,`${s}.db`);if(Ec(i))try{Bd(i,o);for(let a of["-wal","-shm"])try{Bd(i+a,o+a)}catch{}}catch{}return o}function cs(t){return Yx({...t,ext:".db"})}function Yx(t){let{projectDir:e,sessionsDir:r,ext:n}=t,o=t.suffix??Ci(e),s=nt(e),i=vn(r,`${s}${o}${n}`);if(Ec(i))return i;let a=Ar(e);if(a===s)return i;let c=vn(r,`${a}${o}${n}`);if(Ec(c))try{Bd(c,i)}catch{}return i}function kc(t){let e=Number(t);return!Number.isFinite(e)||e<=0?0:Math.floor(e)}function qd(t){let e=t.pragma("table_xinfo(session_events)"),r=new Set(e.map(o=>o.name)),n=!1;for(let[o,s]of iO)r.has(o)||(t.exec(`ALTER TABLE session_events ADD COLUMN ${o} ${s}`),n=!0);return n&&t.exec("CREATE INDEX IF NOT EXISTS idx_session_events_project ON session_events(session_id, project_dir)"),n}function Vd(t,e){let r=null;try{r=new e(t),qd(r)}catch{}finally{try{r?.close()}catch{}}}var Or,Wx,Fx,Kt,wc,ns,Bx,Zx,U,iO,Gt,Jt=S(()=>{"use strict";bn();Or="CONTEXT_MODE_DIR",Wx="sessions",Fx="content",Kt=class extends Error{kind;path;overrideEnvVar;ignoredEnvVar;ignoredReason;constructor(e,r,n=Or,o,s,i={}){super(s??eO(e,r,i),{cause:o}),this.name="StorageDirectoryError",this.kind=e,this.path=r,this.overrideEnvVar=n,this.ignoredEnvVar=i.ignoredEnvVar,this.ignoredReason=i.ignoredReason}},wc=new Map;Bx=1e3,Zx=5;U={insertEvent:"insertEvent",getEvents:"getEvents",getEventsByType:"getEventsByType",getEventsByPriority:"getEventsByPriority",getEventsByTypeAndPriority:"getEventsByTypeAndPriority",getEventCount:"getEventCount",getLatestAttributedProject:"getLatestAttributedProject",checkDuplicate:"checkDuplicate",evictLowestPriority:"evictLowestPriority",updateMetaLastEvent:"updateMetaLastEvent",ensureSession:"ensureSession",getSessionStats:"getSessionStats",getSessionRollup:"getSessionRollup",getMaxFileEdits:"getMaxFileEdits",incrementCompactCount:"incrementCompactCount",upsertResume:"upsertResume",getResume:"getResume",markResumeConsumed:"markResumeConsumed",claimLatestUnconsumedResume:"claimLatestUnconsumedResume",deleteEvents:"deleteEvents",deleteMeta:"deleteMeta",deleteResume:"deleteResume",getOldSessions:"getOldSessions",searchEvents:"searchEvents",incrementToolCall:"incrementToolCall",getToolCallTotals:"getToolCallTotals",getToolCallByTool:"getToolCallByTool",getEventBytesSummary:"getEventBytesSummary"},iO=[["project_dir","TEXT NOT NULL DEFAULT ''"],["attribution_source","TEXT NOT NULL DEFAULT 'unknown'"],["attribution_confidence","REAL NOT NULL DEFAULT 0"],["bytes_avoided","INTEGER NOT NULL DEFAULT 0"],["bytes_returned","INTEGER NOT NULL DEFAULT 0"]];Gt=class extends Ti{constructor(e){super(e?.dbPath??Hd("session"))}stmt(e){return this.stmts.get(e)}initSchema(){try{let r=this.db.pragma("table_xinfo(session_events)").find(n=>n.name==="data_hash");r&&r.hidden!==0&&this.db.exec("DROP TABLE session_events")}catch{}this.db.exec(`
|
|
5
|
+
`)}function tO(t){return t.ignoredEnvVar&&t.ignoredReason==="empty"?`Ignored empty ${t.ignoredEnvVar}; using adapter default.`:null}function Jx(){return`Set ${Or} to a writable absolute path.`}function rO(t){if(!t||typeof t!="object")return null;let e=t.path;return typeof e=="string"&&e.length>0?e:null}function as(t){let e=t.replace(/\\/g,"/");return/^\/+$/.test(e)?"/":/^[A-Za-z]:\/+$/.test(e)?`${e.slice(0,2)}/`:e.replace(/\/+$/,"")}function Ux(t){let e=t;try{e=WC.native(t)}catch{}let r=as(e);return process.platform==="win32"||process.platform==="darwin"?r.toLowerCase():r}function Xx(t,e){return BC("git",["-C",t,...e],{encoding:"utf-8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}function nO(t){let e=Xx(t,["rev-parse","--show-toplevel"]);return e.length>0?as(e):null}function oO(t){let e=Xx(t,["worktree","list","--porcelain"]).split(/\r?\n/).find(r=>r.startsWith("worktree "))?.replace("worktree ","")?.trim();return e?as(e):null}function Ci(t=process.cwd()){let e=process.env.CONTEXT_MODE_SESSION_SUFFIX;if(ns&&ns.projectDir===t&&ns.envSuffix===e)return ns.suffix;let r="";if(e!==void 0)r=e?`__${e}`:"";else try{let n=nO(t),o=oO(t);if(n&&o){let s=Ux(n),i=Ux(o);s!==i&&(r=`__${Pi("sha256").update(s).digest("hex").slice(0,8)}`)}}catch{}return ns={projectDir:t,envSuffix:e,suffix:r},r}function sO(){ns=void 0}function Ar(t){return Pi("sha256").update(as(t)).digest("hex").slice(0,16)}function nt(t){let e=as(t),r=process.platform==="darwin"||process.platform==="win32"?e.toLowerCase():e;return Pi("sha256").update(r).digest("hex").slice(0,16)}function Zd(t){let{projectDir:e,contentDir:r}=t,n=nt(e),o=vn(r,`${n}.db`);if(Ec(o))return o;let s=Ar(e);if(s===n)return o;let i=vn(r,`${s}.db`);if(Ec(i))try{Bd(i,o);for(let a of["-wal","-shm"])try{Bd(i+a,o+a)}catch{}}catch{}return o}function cs(t){return Yx({...t,ext:".db"})}function Yx(t){let{projectDir:e,sessionsDir:r,ext:n}=t,o=t.suffix??Ci(e),s=nt(e),i=vn(r,`${s}${o}${n}`);if(Ec(i))return i;let a=Ar(e);if(a===s)return i;let c=vn(r,`${a}${o}${n}`);if(Ec(c))try{Bd(c,i)}catch{}return i}function kc(t){let e=Number(t);return!Number.isFinite(e)||e<=0?0:Math.floor(e)}function qd(t){let e=t.pragma("table_xinfo(session_events)"),r=new Set(e.map(o=>o.name)),n=!1;for(let[o,s]of iO)r.has(o)||(t.exec(`ALTER TABLE session_events ADD COLUMN ${o} ${s}`),n=!0);return n&&t.exec("CREATE INDEX IF NOT EXISTS idx_session_events_project ON session_events(session_id, project_dir)"),n}function Vd(t,e){let r=null;try{r=new e(t),qd(r)}catch{}finally{try{r?.close()}catch{}}}var Or,Wx,Fx,Kt,wc,ns,Bx,Zx,U,iO,Gt,Jt=S(()=>{"use strict";bn();Or="CONTEXT_MODE_DIR",Wx="sessions",Fx="content",Kt=class extends Error{kind;path;overrideEnvVar;ignoredEnvVar;ignoredReason;constructor(e,r,n=Or,o,s,i={}){super(s??eO(e,r,i),{cause:o}),this.name="StorageDirectoryError",this.kind=e,this.path=r,this.overrideEnvVar=n,this.ignoredEnvVar=i.ignoredEnvVar,this.ignoredReason=i.ignoredReason}},wc=new Map;Bx=1e3,Zx=5;U={insertEvent:"insertEvent",getEvents:"getEvents",getEventsByType:"getEventsByType",getEventsByPriority:"getEventsByPriority",getEventsByTypeAndPriority:"getEventsByTypeAndPriority",getEventCount:"getEventCount",getLatestAttributedProject:"getLatestAttributedProject",checkDuplicate:"checkDuplicate",evictLowestPriority:"evictLowestPriority",updateMetaLastEvent:"updateMetaLastEvent",ensureSession:"ensureSession",getSessionStats:"getSessionStats",getSessionRollup:"getSessionRollup",getMaxFileEdits:"getMaxFileEdits",getLatestCommitMessage:"getLatestCommitMessage",incrementCompactCount:"incrementCompactCount",upsertResume:"upsertResume",getResume:"getResume",markResumeConsumed:"markResumeConsumed",claimLatestUnconsumedResume:"claimLatestUnconsumedResume",deleteEvents:"deleteEvents",deleteMeta:"deleteMeta",deleteResume:"deleteResume",getOldSessions:"getOldSessions",searchEvents:"searchEvents",incrementToolCall:"incrementToolCall",getToolCallTotals:"getToolCallTotals",getToolCallByTool:"getToolCallByTool",getEventBytesSummary:"getEventBytesSummary"},iO=[["project_dir","TEXT NOT NULL DEFAULT ''"],["attribution_source","TEXT NOT NULL DEFAULT 'unknown'"],["attribution_confidence","REAL NOT NULL DEFAULT 0"],["bytes_avoided","INTEGER NOT NULL DEFAULT 0"],["bytes_returned","INTEGER NOT NULL DEFAULT 0"]];Gt=class extends Ti{constructor(e){super(e?.dbPath??Hd("session"))}stmt(e){return this.stmts.get(e)}initSchema(){try{let r=this.db.pragma("table_xinfo(session_events)").find(n=>n.name==="data_hash");r&&r.hidden!==0&&this.db.exec("DROP TABLE session_events")}catch{}this.db.exec(`
|
|
6
6
|
CREATE TABLE IF NOT EXISTS session_events (
|
|
7
7
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
8
8
|
session_id TEXT NOT NULL,
|
|
@@ -94,7 +94,7 @@ var FR=Object.create;var _d=Object.defineProperty;var HR=Object.getOwnPropertyDe
|
|
|
94
94
|
COALESCE(SUM(CASE WHEN category = 'error' THEN 1 ELSE 0 END), 0) AS errors,
|
|
95
95
|
COUNT(DISTINCT type) AS unique_tools,
|
|
96
96
|
COUNT(DISTINCT CASE WHEN category = 'file' THEN data END) AS unique_files,
|
|
97
|
-
CASE WHEN SUM(CASE WHEN
|
|
97
|
+
CASE WHEN SUM(CASE WHEN type = 'git_commit' THEN 1 ELSE 0 END) > 0 THEN 1 ELSE 0 END AS has_commit,
|
|
98
98
|
CAST(COALESCE((MAX(strftime('%s', created_at)) - MIN(strftime('%s', created_at))) / 60.0, 0) AS INTEGER) AS duration_min,
|
|
99
99
|
COALESCE(SUM(CASE WHEN type = 'external_ref' THEN 1 ELSE 0 END), 0) AS sources_indexed,
|
|
100
100
|
CAST(COALESCE(SUM(bytes_avoided) / 1024.0, 0) AS INTEGER) AS total_chunks,
|
|
@@ -106,7 +106,11 @@ var FR=Object.create;var _d=Object.defineProperty;var HR=Object.getOwnPropertyDe
|
|
|
106
106
|
FROM session_events
|
|
107
107
|
WHERE session_id = ? AND category = 'file' AND type IN ('file_edit', 'file_write')
|
|
108
108
|
GROUP BY data
|
|
109
|
-
)`),e(U.
|
|
109
|
+
)`),e(U.getLatestCommitMessage,`SELECT data
|
|
110
|
+
FROM session_events
|
|
111
|
+
WHERE session_id = ? AND type = 'git_commit'
|
|
112
|
+
ORDER BY id DESC
|
|
113
|
+
LIMIT 1`),e(U.incrementCompactCount,"UPDATE session_meta SET compact_count = compact_count + 1 WHERE session_id = ?"),e(U.upsertResume,`INSERT INTO session_resume (session_id, snapshot, event_count)
|
|
110
114
|
VALUES (?, ?, ?)
|
|
111
115
|
ON CONFLICT(session_id) DO UPDATE SET
|
|
112
116
|
snapshot = excluded.snapshot,
|
|
@@ -139,7 +143,7 @@ var FR=Object.create;var _d=Object.defineProperty;var HR=Object.getOwnPropertyDe
|
|
|
139
143
|
COALESCE(SUM(bytes_returned), 0) AS bytes_returned
|
|
140
144
|
FROM session_events WHERE session_id = ?`)}insertEvent(e,r,n="PostToolUse",o,s){let i=Pi("sha256").update(r.data).digest("hex").slice(0,16).toUpperCase(),a=String(o?.projectDir??r.project_dir??this._getSessionProjectDir(e)).trim(),c=String(o?.source??r.attribution_source??"unknown"),u=Number(o?.confidence??r.attribution_confidence??0),l=Number.isFinite(u)?Math.max(0,Math.min(1,u)):0,d=kc(s?.bytesAvoided),p=kc(s?.bytesReturned),h=this.db.transaction(()=>{if(this.stmt(U.checkDuplicate).get(e,Zx,r.type,i))return;this.stmt(U.getEventCount).get(e).cnt>=Bx&&this.stmt(U.evictLowestPriority).run(e),this.stmt(U.insertEvent).run(e,r.type,r.category,r.priority,r.data,a,c,l,d,p,n,i),this.stmt(U.updateMetaLastEvent).run(e)});this.withRetry(()=>h())}bulkInsertEvents(e,r,n="PostToolUse",o,s){if(!r||r.length===0)return;if(r.length===1){this.insertEvent(e,r[0],n,o?.[0],s?.[0]);return}let i=r.map((c,u)=>{let l=Pi("sha256").update(c.data).digest("hex").slice(0,16).toUpperCase(),d=o?.[u],p=String(d?.projectDir??c.project_dir??this._getSessionProjectDir(e)??"").trim(),h=String(d?.source??c.attribution_source??"unknown"),m=Number(d?.confidence??c.attribution_confidence??0),f=Number.isFinite(m)?Math.max(0,Math.min(1,m)):0,g=s?.[u],y=kc(g?.bytesAvoided),_=kc(g?.bytesReturned);return{event:c,dataHash:l,projectDir:p,attributionSource:h,attributionConfidence:f,bytesAvoided:y,bytesReturned:_}}),a=this.db.transaction(()=>{let c=this.stmt(U.getEventCount).get(e).cnt;for(let u of i)this.stmt(U.checkDuplicate).get(e,Zx,u.event.type,u.dataHash)||(c>=Bx?this.stmt(U.evictLowestPriority).run(e):c++,this.stmt(U.insertEvent).run(e,u.event.type,u.event.category,u.event.priority,u.event.data,u.projectDir,u.attributionSource,u.attributionConfidence,u.bytesAvoided,u.bytesReturned,n,u.dataHash));this.stmt(U.updateMetaLastEvent).run(e)});this.withRetry(()=>a())}getEvents(e,r){let n=r?.limit??1e3,o=r?.type,s=r?.minPriority;return o&&s!==void 0?this.stmt(U.getEventsByTypeAndPriority).all(e,o,s,n):o?this.stmt(U.getEventsByType).all(e,o,n):s!==void 0?this.stmt(U.getEventsByPriority).all(e,s,n):this.stmt(U.getEvents).all(e,n)}getEventCount(e){return this.stmt(U.getEventCount).get(e).cnt}getEventBytesSummary(e){let r=this.stmt(U.getEventBytesSummary).get(e);return{bytesAvoided:Number(r?.bytes_avoided??0),bytesReturned:Number(r?.bytes_returned??0)}}getLatestAttributedProjectDir(e){return this.stmt(U.getLatestAttributedProject).get(e)?.project_dir||null}_getSessionProjectDir(e){try{return this.db.prepare("SELECT project_dir FROM session_meta WHERE session_id = ?").get(e)?.project_dir||""}catch{return""}}searchEvents(e,r,n,o){try{let s=e.replace(/[%_]/g,a=>"\\"+a),i=o??null;return this.stmt(U.searchEvents).all(n,s,s,i,i,r)}catch{return[]}}getSessionIdsForProject(e){try{return this.db.prepare(`SELECT DISTINCT session_id
|
|
141
145
|
FROM session_events
|
|
142
|
-
WHERE project_dir = ?`).all(e).map(n=>n.session_id)}catch{return[]}}ensureSession(e,r){this.stmt(U.ensureSession).run(e,r)}getSessionStats(e){return this.stmt(U.getSessionStats).get(e)??null}getSessionRollup(e){let r=this.stmt(U.getSessionRollup).get(e),n=this.stmt(U.getMaxFileEdits).get(e),o=this.
|
|
146
|
+
WHERE project_dir = ?`).all(e).map(n=>n.session_id)}catch{return[]}}ensureSession(e,r){this.stmt(U.ensureSession).run(e,r)}getSessionStats(e){return this.stmt(U.getSessionStats).get(e)??null}getSessionRollup(e){let r=this.stmt(U.getSessionRollup).get(e),n=this.stmt(U.getMaxFileEdits).get(e),o=this.stmt(U.getLatestCommitMessage).get(e),s=this.getSessionStats(e),i=(r?.tool_calls??0)>0?r?.unique_files??0:0,a=r?.errors??0,c=Math.min(i,a);return{tool_calls:r?.tool_calls??0,errors:r?.errors??0,unique_tools:r?.unique_tools??0,unique_files:r?.unique_files??0,max_file_edits:n?.max_file_edits??0,has_commit:r?.has_commit??0,commit_message:o?.data??"",edit_test_cycles:c,duration_min:r?.duration_min??0,compact_count:s?.compact_count??0,sources_indexed:r?.sources_indexed??0,total_chunks:r?.total_chunks??0,search_queries:r?.search_queries??0}}incrementCompactCount(e){this.stmt(U.incrementCompactCount).run(e)}upsertResume(e,r,n){this.stmt(U.upsertResume).run(e,r,n??0)}getResume(e){return this.stmt(U.getResume).get(e)??null}markResumeConsumed(e){this.stmt(U.markResumeConsumed).run(e)}claimLatestUnconsumedResume(e){let r=this.stmt(U.claimLatestUnconsumedResume).get(e);return r?{sessionId:r.session_id,snapshot:r.snapshot}:null}getLatestSessionId(){try{return this.db.prepare("SELECT session_id FROM session_meta ORDER BY started_at DESC LIMIT 1").get()?.session_id??null}catch{return null}}incrementToolCall(e,r,n=0){let o=Number.isFinite(n)&&n>0?Math.round(n):0;try{this.stmt(U.incrementToolCall).run(e,r,o)}catch{}}getToolCallStats(e){try{let r=this.stmt(U.getToolCallTotals).get(e),n=this.stmt(U.getToolCallByTool).all(e),o={};for(let s of n)o[s.tool]={calls:s.calls,bytesReturned:s.bytes_returned};return{totalCalls:r?.calls??0,totalBytesReturned:r?.bytes_returned??0,byTool:o}}catch{return{totalCalls:0,totalBytesReturned:0,byTool:{}}}}deleteSession(e){this.db.transaction(()=>{this.stmt(U.deleteEvents).run(e),this.stmt(U.deleteResume).run(e),this.stmt(U.deleteMeta).run(e)})()}cleanupOldSessions(e=7){let r=`-${e}`,n=this.stmt(U.getOldSessions).all(r);for(let{session_id:o}of n)this.deleteSession(o);return n.length}pruneOrphanedEvents(){let e=this.db.prepare("DELETE FROM session_events WHERE session_id NOT IN (SELECT session_id FROM session_meta)").run();return Number(e.changes??0)}}});import{join as us,resolve as eb}from"node:path";import{accessSync as aO,copyFileSync as cO,constants as uO,mkdirSync as lO}from"node:fs";import{homedir as Wd}from"node:os";function Pt(t=process.env){let e=t.CONTEXT_MODE_DATA_DIR;return!e||e.trim()===""?null:e.startsWith("~")?eb(Wd(),e.replace(/^~[/\\]?/,"")):eb(e)}var xe,pt=S(()=>{"use strict";Jt();xe=class{constructor(e){this.sessionDirSegments=e}sessionDirSegments;getSessionDir(){let e=Pt(),r=e?us(e,"context-mode","sessions"):us(Wd(),...this.sessionDirSegments,"context-mode","sessions");return lO(r,{recursive:!0}),r}getConfigDir(e){return us(Wd(),...this.sessionDirSegments)}getInstructionFiles(){return["CLAUDE.md"]}getMemoryDir(e){let r=Pt(),n=r?us(r,"context-mode","memory"):us(this.getConfigDir(),"memory");return e?us(n,nt(e)):n}backupSettings(){let e=this.getSettingsPath();try{aO(e,uO.R_OK);let r=e+".bak";return cO(e,r),r}catch{return null}}}});var ls,Kd=S(()=>{"use strict";pt();ls=class extends xe{parsePreToolUseInput(e){let r=e;return{toolName:r.tool_name??"",toolInput:r.tool_input??{},sessionId:this.extractSessionId(r),projectDir:process.env[this.projectDirEnvVar]??process.cwd(),raw:e}}parsePostToolUseInput(e){let r=e;return{toolName:r.tool_name??"",toolInput:r.tool_input??{},toolOutput:r.tool_output,isError:r.is_error,sessionId:this.extractSessionId(r),projectDir:process.env[this.projectDirEnvVar]??process.cwd(),raw:e}}parsePreCompactInput(e){let r=e;return{sessionId:this.extractSessionId(r),projectDir:process.env[this.projectDirEnvVar]??process.cwd(),raw:e}}parseSessionStartInput(e){let r=e,n=r.source??"startup",o;switch(n){case"compact":o="compact";break;case"resume":o="resume";break;case"clear":o="clear";break;default:o="startup"}return{sessionId:this.extractSessionId(r),source:o,projectDir:process.env[this.projectDirEnvVar]??process.cwd(),raw:e}}formatPreToolUseResponse(e){if(e.decision==="deny")return{permissionDecision:"deny",reason:e.reason??"Blocked by context-mode hook"};if(e.decision==="modify"&&e.updatedInput)return{updatedInput:e.updatedInput};if(e.decision==="context"&&e.additionalContext)return{additionalContext:e.additionalContext};if(e.decision==="ask")return{permissionDecision:"ask"}}formatPostToolUseResponse(e){let r={};return e.additionalContext&&(r.additionalContext=e.additionalContext),e.updatedOutput&&(r.updatedMCPToolOutput=e.updatedOutput),Object.keys(r).length>0?r:void 0}formatPreCompactResponse(e){return e.context??""}formatSessionStartResponse(e){return e.context??""}}});import{existsSync as Gd}from"node:fs";import{join as Jd}from"node:path";async function dO(){if(ds)return ds;if(ps)return null;try{let t=[new URL("../../scripts/plugin-cache-integrity.mjs",import.meta.url),new URL("./scripts/plugin-cache-integrity.mjs",import.meta.url)],e=null;for(let r of t)try{let n=await import(r.href);if(typeof n?.assertPluginCacheIntegrity=="function")return ds=n,ds}catch(n){e=n}return ps=e instanceof Error?e.message:String(e??"not found"),null}catch(t){return ps=t instanceof Error?t.message:String(t),null}}function pO(t){let e=[];return Gd(Jd(t,"start.mjs"))||e.push("start.mjs"),!Gd(Jd(t,"server.bundle.mjs"))&&!Gd(Jd(t,"build","server.js"))&&e.push("server.bundle.mjs (or build/server.js)"),e}function tb(t){if(ds){let e=ds.assertPluginCacheIntegrity({pluginRoot:t});return e.ok?{status:"OK",detail:`${t} (all required runtime siblings present)`}:{status:"FAIL",detail:`missing: ${e.missing.join(", ")}`}}if(ps){let e=pO(t);return e.length>0?{status:"FAIL",detail:`partial install \u2014 critical launch files missing: ${e.join(", ")} (integrity helper also missing: ${ps}); the MCP server cannot start. Reinstall: npm install -g context-mode@latest`}:{status:"FAIL",detail:`integrity helper unavailable: ${ps}`}}return{status:"FAIL",detail:"integrity helper not yet loaded"}}var ds,ps,rb=S(()=>{"use strict";ds=null,ps=null;dO()});function Oi(t,e){let r=eo[e],n=Yd(e);return t.hooks?.some(o=>o.command?.includes(r)||o.command?.includes(n))??!1}function Yd(t,e){if(e){let r=eo[t];return Xe(`${e}/hooks/${r}`)}return`context-mode hook claude-code ${t.toLowerCase()}`}function Qd(t){let e=gc(t);if(e)return e.scriptPath.endsWith(".mjs")?e.scriptPath:null;let r=t.match(/^\s*node\s+"([^"]+\.mjs)"\s*$/);if(r)return r[1];let n=t.match(/^\s*node\s+(\S+\.mjs)\s*$/);return n?n[1]:null}function sb(t){let e=Object.values(eo);return t.hooks?.some(r=>r.command!=null&&(e.some(n=>r.command.includes(n))||r.command.includes("context-mode hook")))??!1}var fr,mO,Xd,nb,fO,A4,eo,ob,N4,ib=S(()=>{"use strict";Cr();fr={PRE_TOOL_USE:"PreToolUse",POST_TOOL_USE:"PostToolUse",PRE_COMPACT:"PreCompact",SESSION_START:"SessionStart",USER_PROMPT_SUBMIT:"UserPromptSubmit"},mO="mcp__",Xd=["Bash","WebFetch","Read","Grep","Agent","mcp__plugin_context-mode_context-mode__ctx_execute","mcp__plugin_context-mode_context-mode__ctx_execute_file","mcp__plugin_context-mode_context-mode__ctx_batch_execute",mO],nb=Xd.join("|"),fO=["Bash","Read","Write","Edit","NotebookEdit","Glob","Grep","TodoWrite","TaskCreate","TaskUpdate","EnterPlanMode","ExitPlanMode","Skill","Agent","AskUserQuestion","EnterWorktree","mcp__"],A4=fO.join("|"),eo={PreToolUse:"pretooluse.mjs",PostToolUse:"posttooluse.mjs",PreCompact:"precompact.mjs",SessionStart:"sessionstart.mjs",UserPromptSubmit:"userpromptsubmit.mjs"},ob=[fr.PRE_TOOL_USE,fr.SESSION_START],N4=[fr.POST_TOOL_USE,fr.PRE_COMPACT,fr.USER_PROMPT_SUBMIT]});var tp={};we(tp,{ClaudeCodeAdapter:()=>ep});import{readFileSync as Tc,writeFileSync as ab,existsSync as cb,readdirSync as hO,chmodSync as gO,accessSync as yO,mkdirSync as _O,constants as xO}from"node:fs";import{resolve as Pc,join as kn}from"node:path";import{homedir as ub}from"node:os";var ep,rp=S(()=>{"use strict";Kd();pt();wn();rb();Cr();ib();ep=class extends ls{constructor(){super([".claude"])}name="Claude Code";paradigm="json-stdio";projectDirEnvVar="CLAUDE_PROJECT_DIR";capabilities={preToolUse:!0,postToolUse:!0,preCompact:!0,sessionStart:!0,canModifyArgs:!0,canModifyOutput:!0,canInjectSessionContext:!0};getConfigDir(e){return qe()}getSessionDir(){let e=Pt(),r=e?kn(e,"context-mode","sessions"):kn(this.getConfigDir(),"context-mode","sessions");return _O(r,{recursive:!0}),r}getSettingsPath(){return kn(this.getConfigDir(),"settings.json")}generateHookConfig(e){let r=Xe(`${e}/hooks/pretooluse.mjs`);return{PreToolUse:[...Xd].map(o=>({matcher:o,hooks:[{type:"command",command:r}]})),PostToolUse:[{matcher:"",hooks:[{type:"command",command:Xe(`${e}/hooks/posttooluse.mjs`)}]}],PreCompact:[{matcher:"",hooks:[{type:"command",command:Xe(`${e}/hooks/precompact.mjs`)}]}],UserPromptSubmit:[{matcher:"",hooks:[{type:"command",command:Xe(`${e}/hooks/userpromptsubmit.mjs`)}]}],SessionStart:[{matcher:"",hooks:[{type:"command",command:Xe(`${e}/hooks/sessionstart.mjs`)}]}]}}readSettings(){try{let e=Tc(this.getSettingsPath(),"utf-8");return JSON.parse(e)}catch{return null}}writeSettings(e){ab(this.getSettingsPath(),JSON.stringify(e,null,2)+`
|
|
143
147
|
`,"utf-8")}validateHooks(e){let r=[],n=this.readSettings();if(!n)return r.push({check:"PreToolUse hook",status:"fail",message:`Could not read ${this.getSettingsPath()}`,fix:"context-mode upgrade"}),r;let o=n.hooks,s=this.readPluginHooks(e),i=this.checkHookType(o,s,fr.PRE_TOOL_USE);r.push({check:"PreToolUse hook",status:i?"pass":"fail",message:i?"PreToolUse hook configured":"No PreToolUse hooks found",fix:i?void 0:"context-mode upgrade"});let a=this.checkHookType(o,s,fr.SESSION_START);return r.push({check:"SessionStart hook",status:a?"pass":"fail",message:a?"SessionStart hook configured":"No SessionStart hooks found",fix:a?void 0:"context-mode upgrade"}),r}getHealthChecks(e){let r=Object.entries(eo).map(([o,s])=>{let i=kn(e,"hooks",s);return{name:`Hook script: ${o} (${s})`,check:()=>cb(i)?{status:"OK",detail:i}:{status:"FAIL",detail:`not found at ${i}`}}}),n={name:"Plugin cache integrity",check:()=>tb(e)};return[...r,n]}readPluginHooks(e){let r=[kn(e,"hooks","hooks.json"),kn(e,".claude-plugin","hooks","hooks.json")];for(let n of r)try{let o=Tc(n,"utf-8"),s=JSON.parse(o);if(s.hooks)return s.hooks}catch{}}checkHookType(e,r,n){let o=e?.[n];if(o&&o.length>0&&o.some(i=>Oi(i,n)))return!0;let s=r?.[n];return!!(s&&s.length>0&&s.some(i=>Oi(i,n)))}checkPluginRegistration(){let e=this.readSettings();if(!e)return{check:"Plugin registration",status:"warn",message:"Could not read settings.json"};let r=e.enabledPlugins;if(!r)return{check:"Plugin registration",status:"warn",message:"No enabledPlugins section found (might be using standalone MCP mode)"};let n=Object.keys(r).find(o=>o.startsWith("context-mode"));return n&&r[n]?{check:"Plugin registration",status:"pass",message:`Plugin enabled: ${n}`}:{check:"Plugin registration",status:"warn",message:"context-mode not in enabledPlugins (might be using standalone MCP mode)"}}getInstalledVersion(){try{let r=kn(this.getConfigDir(),"plugins","installed_plugins.json"),o=JSON.parse(Tc(r,"utf-8")).plugins??{};for(let[s,i]of Object.entries(o)){if(!s.toLowerCase().includes("context-mode"))continue;let a=i;if(a.length>0&&typeof a[0].version=="string")return a[0].version}}catch{}let e=Array.from(new Set([this.getConfigDir(),qe(),Pc(ub(),".claude"),Pc(ub(),".config","claude")]));for(let r of e){let n=Pc(r,"plugins","cache","context-mode","context-mode");try{let s=hO(n).filter(i=>/^\d+\.\d+\.\d+/.test(i)).sort((i,a)=>{let c=i.split(".").map(Number),u=a.split(".").map(Number);for(let l=0;l<3;l++)if((c[l]??0)!==(u[l]??0))return(c[l]??0)-(u[l]??0);return 0});if(s.length>0)return s[s.length-1]}catch{}}return"not installed"}configureAllHooks(e){let r=this.readSettings()??{},n=r.hooks??{},o=[];for(let a of Object.keys(n)){let c=n[a];if(!Array.isArray(c))continue;let u=c.filter(d=>{let p=d;if(!sb(p))return!0;let h=p.hooks??[];return h.every(f=>!f.command||!Qd(f.command))?!0:h.every(f=>{let g=f.command?Qd(f.command):null;return g?cb(g):!0})}),l=c.length-u.length;l>0&&(n[a]=u,o.push(`Removed ${l} stale ${a} hook(s)`))}let s=this.readPluginHooks(e);if(s&&ob.every(c=>this.checkHookType(void 0,s,c))){let c=Object.values(eo),u=l=>l!=null&&(c.some(d=>l.includes(d))||l.includes("context-mode hook"));for(let l of Object.keys(n)){let d=n[l];if(!Array.isArray(d))continue;let p=0;for(let m of d){let f=m,g=f.hooks??[],y=g.length;f.hooks=g.filter(_=>!u(_.command)),p+=y-f.hooks.length}let h=d.filter(m=>{let f=m.hooks;return Array.isArray(f)&&f.length>0});(p>0||h.length!==d.length)&&(n[l]=h,p>0&&o.push(`Removed ${p} duplicate ${l} hook(s) \u2014 covered by plugin hooks.json`))}return r.hooks=n,this.writeSettings(r),o.push("Skipped settings.json registration \u2014 plugin hooks.json is sufficient"),o}let i=[fr.PRE_TOOL_USE,fr.SESSION_START];for(let a of i){let c=Yd(a,e);if(a===fr.PRE_TOOL_USE){let u={matcher:nb,hooks:[{type:"command",command:c}]},l=n.PreToolUse;if(l&&Array.isArray(l)){let d=l.findIndex(p=>Oi(p,a));d>=0?(l[d]=u,o.push(`Updated existing ${a} hook entry`)):(l.push(u),o.push(`Added ${a} hook entry`)),n.PreToolUse=l}else n.PreToolUse=[u],o.push(`Created ${a} hooks section`)}else{let u={matcher:"",hooks:[{type:"command",command:c}]},l=n[a];if(l&&Array.isArray(l)){let d=l.findIndex(p=>Oi(p,a));d>=0?(l[d]=u,o.push(`Updated existing ${a} hook entry`)):(l.push(u),o.push(`Added ${a} hook entry`)),n[a]=l}else n[a]=[u],o.push(`Created ${a} hooks section`)}}return r.hooks=n,this.writeSettings(r),o}setHookPermissions(e){let r=[];for(let[,n]of Object.entries(eo)){let o=Pc(e,"hooks",n);try{yO(o,xO.R_OK),gO(o,493),r.push(o)}catch{}}return r}updatePluginRegistry(e,r){try{let n=kn(this.getConfigDir(),"plugins","installed_plugins.json"),o=JSON.parse(Tc(n,"utf-8"));for(let[s,i]of Object.entries(o.plugins||{}))if(s.toLowerCase().includes("context-mode"))for(let a of i)a.installPath=e,a.version=r,a.lastUpdated=new Date().toISOString();ab(n,JSON.stringify(o,null,2)+`
|
|
144
148
|
`,"utf-8")}catch{}}extractSessionId(e){if(e.transcript_path){let r=e.transcript_path.match(/([a-f0-9-]{36})\.jsonl$/);if(r)return r[1]}return e.session_id?e.session_id:process.env.CLAUDE_SESSION_ID?process.env.CLAUDE_SESSION_ID:`pid-${process.ppid}`}}});function to(t,e){let r=Rc[t];return e&&r?Xe(`${e}/hooks/gemini-cli/${r}`):`context-mode hook gemini-cli ${t.toLowerCase()}`}var Oe,lb,Rc,V4,W4,db=S(()=>{"use strict";Cr();Oe={BEFORE_AGENT:"BeforeAgent",BEFORE_TOOL:"BeforeTool",AFTER_TOOL:"AfterTool",PRE_COMPRESS:"PreCompress",SESSION_START:"SessionStart"},lb="mcp__(?!.*context-mode)",Rc={[Oe.BEFORE_AGENT]:"beforeagent.mjs",[Oe.BEFORE_TOOL]:"beforetool.mjs",[Oe.AFTER_TOOL]:"aftertool.mjs",[Oe.PRE_COMPRESS]:"precompress.mjs",[Oe.SESSION_START]:"sessionstart.mjs"},V4=[Oe.BEFORE_TOOL,Oe.SESSION_START],W4=[Oe.AFTER_TOOL,Oe.PRE_COMPRESS]});var fb={};we(fb,{GeminiCLIAdapter:()=>op});import{readFileSync as np,writeFileSync as pb,mkdirSync as bO,accessSync as vO,chmodSync as SO,existsSync as kO,constants as wO}from"node:fs";import{resolve as Ii,join as mb}from"node:path";import{homedir as Cc}from"node:os";var op,hb=S(()=>{"use strict";pt();db();op=class extends xe{constructor(){super([".gemini"])}name="Gemini CLI";paradigm="json-stdio";capabilities={preToolUse:!0,postToolUse:!0,preCompact:!0,sessionStart:!0,canModifyArgs:!0,canModifyOutput:!0,canInjectSessionContext:!0};parsePreToolUseInput(e){let r=e;return{toolName:r.tool_name??"",toolInput:r.tool_input??{},sessionId:this.extractSessionId(r),projectDir:this.getProjectDir(r),raw:e}}parsePostToolUseInput(e){let r=e;return{toolName:r.tool_name??"",toolInput:r.tool_input??{},toolOutput:r.tool_output,isError:r.is_error,sessionId:this.extractSessionId(r),projectDir:this.getProjectDir(r),raw:e}}parsePreCompactInput(e){let r=e;return{sessionId:this.extractSessionId(r),projectDir:this.getProjectDir(r),raw:e}}parseSessionStartInput(e){let r=e,n=r.source??"startup",o;switch(n){case"compact":o="compact";break;case"resume":o="resume";break;case"clear":o="clear";break;default:o="startup"}return{sessionId:this.extractSessionId(r),source:o,projectDir:this.getProjectDir(r),raw:e}}formatPreToolUseResponse(e){if(e.decision==="deny")return{decision:"deny",reason:e.reason??"Blocked by context-mode hook"};if(e.decision==="modify"&&e.updatedInput)return{hookSpecificOutput:{tool_input:e.updatedInput}};if(e.decision==="context"&&e.additionalContext)return{hookSpecificOutput:{additionalContext:e.additionalContext}};if(e.decision==="ask")return{decision:"deny",reason:e.reason??"Action requires user confirmation (security policy)"}}formatPostToolUseResponse(e){if(e.updatedOutput)return{decision:"deny",reason:e.updatedOutput};if(e.additionalContext)return{hookSpecificOutput:{additionalContext:e.additionalContext}}}formatPreCompactResponse(e){return e.context??""}formatSessionStartResponse(e){return e.context??""}getSettingsPath(){return Ii(Cc(),".gemini","settings.json")}getInstructionFiles(){return["GEMINI.md"]}generateHookConfig(e){return{[Oe.BEFORE_AGENT]:[{matcher:"",hooks:[{type:"command",command:to(Oe.BEFORE_AGENT,e)}]}],[Oe.BEFORE_TOOL]:[{matcher:`run_shell_command|read_file|read_many_files|grep_search|search_file_content|web_fetch|activate_skill|mcp__plugin_context-mode|mcp__context-mode|${lb}`,hooks:[{type:"command",command:to(Oe.BEFORE_TOOL,e)}]}],[Oe.AFTER_TOOL]:[{matcher:"",hooks:[{type:"command",command:to(Oe.AFTER_TOOL,e)}]}],[Oe.PRE_COMPRESS]:[{matcher:"",hooks:[{type:"command",command:to(Oe.PRE_COMPRESS,e)}]}],[Oe.SESSION_START]:[{matcher:"",hooks:[{type:"command",command:to(Oe.SESSION_START,e)}]}]}}readSettings(){try{let e=np(this.getSettingsPath(),"utf-8");return JSON.parse(e)}catch{return null}}writeSettings(e){let r=Ii(Cc(),".gemini");bO(r,{recursive:!0}),pb(this.getSettingsPath(),JSON.stringify(e,null,2)+`
|
|
145
149
|
`,"utf-8")}validateHooks(e){let r=[],n=this.readSettings();if(!n)return r.push({check:"BeforeTool hook",status:"fail",message:"Could not read ~/.gemini/settings.json",fix:"context-mode upgrade"}),r;let o=n.hooks,s=o?.[Oe.BEFORE_TOOL];if(s&&s.length>0){let a=s.some(c=>c.hooks?.some(u=>u.command?.includes("context-mode")));r.push({check:"BeforeTool hook",status:a?"pass":"fail",message:a?"BeforeTool hook configured":"BeforeTool exists but does not point to context-mode",fix:a?void 0:"context-mode upgrade"})}else r.push({check:"BeforeTool hook",status:"fail",message:"No BeforeTool hooks found",fix:"context-mode upgrade"});let i=o?.[Oe.SESSION_START];if(i&&i.length>0){let a=i.some(c=>c.hooks?.some(u=>u.command?.includes("context-mode")));r.push({check:"SessionStart hook",status:a?"pass":"fail",message:a?"SessionStart hook configured":"SessionStart exists but does not point to context-mode",fix:a?void 0:"context-mode upgrade"})}else r.push({check:"SessionStart hook",status:"fail",message:"No SessionStart hooks found",fix:"context-mode upgrade"});return r}getHealthChecks(e){return Object.entries(Rc).map(([r,n])=>{let o=mb(e,"hooks","gemini-cli",n);return{name:`Hook script: ${r} (${n})`,check:()=>kO(o)?{status:"OK",detail:o}:{status:"FAIL",detail:`not found at ${o}`}}})}checkPluginRegistration(){let e=this.readSettings();if(!e)return{check:"Plugin registration",status:"warn",message:"Could not read ~/.gemini/settings.json"};let r=e.extensions;return r&&(Array.isArray(r)?r.some(o=>typeof o=="string"&&o.includes("context-mode")):Object.keys(r).some(o=>o.includes("context-mode")))?{check:"Plugin registration",status:"pass",message:"context-mode found in extensions"}:{check:"Plugin registration",status:"warn",message:"context-mode not found in extensions (might be using standalone MCP mode)"}}getInstalledVersion(){try{let e=Ii(Cc(),".gemini","extensions","context-mode","package.json"),r=JSON.parse(np(e,"utf-8"));if(typeof r.version=="string")return r.version}catch{}return"not installed"}configureAllHooks(e){let r=this.readSettings()??{},n=r.hooks??{},o=[],s=[{name:Oe.BEFORE_AGENT},{name:Oe.BEFORE_TOOL},{name:Oe.SESSION_START}];for(let i of s){let c={matcher:"",hooks:[{type:"command",command:to(i.name,e)}]},u=n[i.name];if(u&&Array.isArray(u)){let l=u.findIndex(d=>d.hooks?.some(h=>h.command?.includes("context-mode")));l>=0?(u[l]=c,o.push(`Updated existing ${i.name} hook entry`)):(u.push(c),o.push(`Added ${i.name} hook entry`)),n[i.name]=u}else n[i.name]=[c],o.push(`Created ${i.name} hooks section`)}return r.hooks=n,this.writeSettings(r),o}setHookPermissions(e){let r=[],n=mb(e,"hooks","gemini-cli");for(let o of Object.values(Rc)){let s=Ii(n,o);try{vO(s,wO.R_OK),SO(s,493),r.push(s)}catch{}}return r}updatePluginRegistry(e,r){try{let n=Ii(Cc(),".gemini","extensions","context-mode","package.json"),o=JSON.parse(np(n,"utf-8"));o.version=r,o.installPath=e,o.lastUpdated=new Date().toISOString(),pb(n,JSON.stringify(o,null,2)+`
|
|
@@ -592,10 +596,10 @@ ${o}`}}var FT=S(()=>{"use strict"});import{execFileSync as J2}from"node:child_pr
|
|
|
592
596
|
COALESCE(SUM(LENGTH(data)), 0) AS data_bytes,
|
|
593
597
|
COALESCE(SUM(bytes_avoided), 0) AS bytes_avoided,
|
|
594
598
|
COALESCE(SUM(bytes_returned), 0) AS bytes_returned
|
|
595
|
-
FROM session_events`).get();m&&(s+=Number(m.data_bytes??0),i+=Number(m.bytes_avoided??0),a+=Number(m.bytes_returned??0));try{let f=h.prepare("SELECT COALESCE(SUM(LENGTH(snapshot)), 0) AS bytes FROM session_resume").get();f?.bytes&&(c+=Number(f.bytes))}catch{}}}finally{h.close()}}catch{}}let u=0;t.sessionId&&t.contentDbPath&&(u=xB(t.sessionId,t.contentDbPath,{loadDatabase:t.loadDatabase}),i+=u);let l=Math.floor((s+i+c)/4);return{eventDataBytes:s,bytesAvoided:i,bytesReturned:a,snapshotBytes:c,contentBytes:u,totalSavedTokens:l}}function vB(t,e,r){let n={name:t.name,eventCount:0,sessionCount:0,dataBytes:0,rescueBytes:0,contentBytes:0,uuidConvs:0,projectDirs:[],firstMs:Number.POSITIVE_INFINITY,lastMs:0,isReal:!1};if(!pn(t.sessionsDir))return n;let o=[];try{o=di(t.sessionsDir).filter(l=>l.endsWith(".db"))}catch{return n}if(o.length===0)return n;let s=null;try{s=e()}catch{return n}if(!s)return n;let i=new Set,a=new Set;for(let l of o){let d=Bt(t.sessionsDir,l);try{let p=new s(d,{readonly:!0});try{let h=p.prepare("SELECT COUNT(*) AS cnt, COALESCE(SUM(LENGTH(data)), 0) AS bytes FROM session_events").get();h&&(n.eventCount+=Number(h.cnt??0),n.dataBytes+=Number(h.bytes??0));try{let m=p.prepare("SELECT COUNT(*) AS cnt FROM session_meta").get();n.sessionCount+=Number(m?.cnt??0)}catch{}try{let m=p.prepare("SELECT COALESCE(SUM(length(snapshot)), 0) AS bytes FROM session_resume WHERE consumed = 1").get();m?.bytes&&(n.rescueBytes+=Number(m.bytes))}catch{}try{let m=p.prepare("SELECT MIN(created_at) AS mn, MAX(created_at) AS mx FROM session_events").get();if(m?.mn){let f=Date.parse(m.mn+(m.mn.endsWith("Z")?"":"Z"));Number.isFinite(f)&&f<n.firstMs&&(n.firstMs=f)}if(m?.mx){let f=Date.parse(m.mx+(m.mx.endsWith("Z")?"":"Z"));Number.isFinite(f)&&f>n.lastMs&&(n.lastMs=f)}}catch{}try{let m=p.prepare("SELECT DISTINCT project_dir AS p FROM session_events WHERE project_dir != ''").all();for(let f of m)f.p&&i.add(f.p)}catch{}try{let m=p.prepare("SELECT DISTINCT session_id AS s FROM session_events").all();for(let f of m)f.s&&a.add(f.s)}catch{}}finally{p.close()}}catch{}}n.projectDirs=Array.from(i),n.uuidConvs=a.size;let c=n.eventCount>0?n.dataBytes/n.eventCount:0,u=n.lastMs>0&&r.nowMs-n.lastMs<=r.recencyMs;return n.isReal=n.eventCount>=r.minEvents&&i.size>=r.minProjects&&u&&c>=r.minAvgBytes,n}function Gl(t){let e=yB({home:t?.home}),r=t?.loadDatabase??rt,n={...bB,...t?.filter??{},nowMs:t?.filter?.nowMs??Date.now()},o=[],s=0,i=0,a=0;for(let c of e){if(!pn(c.sessionsDir))continue;let u=vB(c,r,n);o.push(u),s+=u.eventCount,i+=u.sessionCount,a+=u.dataBytes+u.rescueBytes}return{totalEvents:s,totalSessions:i,totalBytes:a,perAdapter:o}}function Vl(t){return SB[t]??t}function dt(t){if(!Number.isFinite(t)||t<=0)return"0 B";if(t<1024)return`${Math.round(t)} B`;let e=t/1024;if(e<1024)return e<100?`${e.toFixed(1)} KB`:`${Math.round(e)} KB`;let r=e/1024;if(r<1024)return r<100?`${r.toFixed(1)} MB`:`${Math.round(r)} MB`;let n=r/1024;return n<100?`${n.toFixed(2)} GB`:`${n.toFixed(1)} GB`}function kB(t){let e=parseFloat(t);if(isNaN(e)||e<1)return"< 1 min";if(e<60)return`${Math.round(e)} min`;let r=Math.floor(e/60),n=Math.round(e%60);return n>0?`${r}h ${n}m`:`${r}h`}function Zl(t){if(!t)return!1;try{return Intl.DateTimeFormat.supportedLocalesOf(t).length===0?!1:(new Intl.DateTimeFormat(t),!0)}catch{return!1}}function wB(){let t=process.env??{},e=t.CONTEXT_MODE_LOCALE??"";if(e&&!Zl(e)&&(e=""),!e){if(process.platform==="darwin"){try{let n=mB("defaults",["read","-g","AppleLocale"],{encoding:"utf8",timeout:500}).trim();n&&(e=n.replace(/_/g,"-"))}catch{}e&&!Zl(e)&&(e="")}if(!e&&(t.LC_TIME||t.LANG)){let n=(t.LC_TIME||t.LANG||"").split(".")[0];n&&(e=n.replace(/_/g,"-")),e&&!Zl(e)&&(e="")}if(!e)try{e=new Intl.DateTimeFormat().resolvedOptions().locale}catch{e="en-US"}}let r=t.CONTEXT_MODE_TZ??"";if(!r)try{r=new Intl.DateTimeFormat().resolvedOptions().timeZone}catch{r="UTC"}return Zl(e)||(e="en-US"),{locale:e,tz:r||"UTC"}}function mP(t){let e=Kl();return e?t===e?"~":t.startsWith(e+hB)?"~"+t.slice(e.length):t:t}function EB(t,e,r){if(!Number.isFinite(e)||e<=0)return[];let n=e*Xa(),o=(y,_=2)=>y.toFixed(_),s=Math.round(n/20),i=(n/200).toFixed(1),a=Math.round(n/73.67),c=Math.round(n*10),u=r>0?Math.round(n*10/r*365):0,l=(e*3/1e6).toFixed(2),d=(e*2.5/1e6).toFixed(2),p=(e*1.25/1e6).toFixed(2),h=(e*.8/1e6).toFixed(2),m=process.env.PI_CONTEXT_MODE_PRICE_OUTPUT_PER_TOKEN!==void 0,f=process.env.PI_CONTEXT_MODE_MODEL_ID,g=[];return m&&f?g.push(` $${o(n)} of ${f} tokens your team didn't burn.`):m?g.push(` $${o(n)} of tokens your team didn't burn.`):g.push(` $${o(n)} of Opus 4 tokens your team didn't burn.`),g.push(` context-mode kept ${dt(t)} out of context \u2014 that's ${s} months of Cursor Pro paid for itself.`),c>0&&u>0&&(g.push(""),g.push(` Scale across a 10-dev team and that's ~$${u.toLocaleString("en-US")}/year saved.`)),m||(g.push(""),g.push(" (Opus rates shown for context. On cheaper models the dollar number drops; the savings ratio holds.)")),g}function $B(t){let{conversation:e,lifetime:r,multiAdapter:n,realBytes:o,cwd:s,locale:i,tz:a,now:c,version:u,latestVersion:l}=t,d=[],p=e.events*_P,h=Math.round((e.snapshotBytes??0)/4),m=p+h,f=o?.conversation?.totalSavedTokens??0,g=Math.max(m,f),y=(r?.totalEvents??0)*_P,_=Math.round((r?.rescueBytes??0)/4),x=y+_,v=o?.lifetime?.totalSavedTokens??0,E=Math.max(x,v),C=o?.lifetime?.bytesReturned??0,b=o?.lifetime?.bytesAvoided??0,k=C+b>0?Math.max(1,Math.floor(C/4)):Math.max(1,Math.round(E*.02)),P=n?.totalBytes&&n.totalBytes>0?n.totalBytes:E*4,N=o?.conversation?o.conversation.eventDataBytes+o.conversation.bytesAvoided+o.conversation.snapshotBytes:g*4,R=e.daysAlive>=1?`${e.daysAlive.toFixed(1)} days alive \xB7 still going`:`${Math.max(1,Math.round(e.daysAlive*24))} hr alive \xB7 still going`,O=r?.firstEventMs??n?.perAdapter?.[0]?.firstMs??0,F=O>0?Math.max(1,Math.round((c-O)/864e5)):0,K=n?.totalSessions??r?.totalSessions??1,ge=n?.perAdapter.filter(Ze=>Ze.isReal).length??0,We;if(n&&ge>=2)We=`across ${ge} AI tools`;else if(n&&ge===1){let Ze=n.perAdapter.find(pr=>pr.isReal);We=`in ${Ze?Vl(Ze.name):"Claude Code"}`}else We="in Claude Code";F>0?d.push(` Across ${F} days you ran ${wr(K)} conversations ${We}.`):d.push(` You ran ${wr(K)} conversations ${We}.`);let _t=F>0?P/F:0;d.push(` context-mode kept ${dt(P)} out of your context window \u2014 about ${dt(_t)} every single day.`),d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 1. Where you are now \u2500\u2500\u2500"),d.push("");let Pr=e.firstEventMs&&e.firstEventMs>0?fP(e.firstEventMs,i,a):"";if(Pr?d.push(` This conversation started ${Pr} in ${mP(s)}.`):d.push(` This conversation lives in ${mP(s)}.`),d.push(` ${R}.`),e.snapshotsConsumed>0&&e.snapshotBytes>0){let Ze=e.lastRescueMs&&e.lastRescueMs>0?fP(e.lastRescueMs,i,a):"",pr=Math.round(e.snapshotBytes/1024);Ze?d.push(` On ${Ze}, /compact fired \u2014 ${pr} KB rescued from snapshot.`):d.push(` /compact fired \u2014 ${pr} KB rescued from snapshot.`),d.push(" Without that, you'd be re-explaining everything to a blank model right now.")}d.push("");let ic=o?.conversation,ac=ic?.bytesAvoided??0,gd=ic?.bytesReturned??0;if(ac+gd===0)d.push(" No measurable redirect activity captured yet \u2014 bars will appear once context-mode diverts its first payload."),d.push("");else{let Ze=ac+gd,pr=Math.max(1,gd),mr=Math.max(1,Math.floor(Ze/4)),Gr=Math.max(1,Math.floor(pr/4)),yd=Kn(mr,mr,32),jR=Kn(Gr,mr,32),LR=(1-Gr/mr)*100,zR=Math.max(1,Math.round(mr/Gr));d.push(` Without context-mode ${dt(Ze).padStart(8)} ${yd} ${wr(mr).padStart(7)} tokens`),d.push(` With context-mode ${dt(pr).padStart(8)} ${jR} ${wr(Gr).padStart(7)} tokens`),d.push(` ${LR.toFixed(0)}% kept out of context \xB7 your AI ran ${zR}\xD7 longer before /compact fired`),d.push("")}if(e.byDay&&e.byDay.length>0){let Ze=e.lastEventMs&&e.firstEventMs?Math.max(1,Math.round((e.lastEventMs-e.firstEventMs)/864e5)+1):e.byDay.length;d.push(` How that ${dt(N)} built up \u2014 ${Ze} days, ${e.byDay.length} active:`),d.push(""),d.push(...PB(e.byDay,i,a))}d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 2. What this chat captured (used when you --continue or /resume here) \u2500\u2500\u2500"),d.push("");let AR=e.byCategory.reduce((Ze,pr)=>Ze+pr.count,0).toLocaleString(i);d.push(` ${AR} things \u2014 files, errors, decisions, agent runs:`),d.push("");let NR=e.byCategory[0]?.count??1;for(let Ze of e.byCategory)d.push(` ${Ze.label.padEnd(26)} ${String(Ze.count).padStart(5)} ${Kn(Ze.count,NR,28)}`);d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 3. The scope, getting wider \u2500\u2500\u2500"),d.push("");let sx=e.firstEventMs&&e.firstEventMs>0?new Intl.DateTimeFormat(i,{timeZone:a,year:"numeric",month:"short",day:"numeric"}).format(new Date(e.firstEventMs)):"",ix=O>0?new Intl.DateTimeFormat(i,{timeZone:a,year:"numeric",month:"short",day:"numeric"}).format(new Date(O)):"",ax=r?.distinctProjects??0,DR=r?.totalEvents??n?.totalEvents??0;if(d.push(` This chat: ${dt(N)} kept out \xB7 ${e.events.toLocaleString(i)} captures${sx?` \xB7 started ${sx}`:""}.`),d.push(` All your work: ${dt(P)} kept out \xB7 ${DR.toLocaleString(i)} captures across ${ax} project${ax===1?"":"s"}${ix?` \xB7 since ${ix}`:""}.`),d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 4. The bottom line \u2500\u2500\u2500"),d.push(""),d.push(...EB(P,E,F)),d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 5. What context-mode learned about how you work \u2500\u2500\u2500"),d.push(""),r&&r.autoMemoryCount>0){d.push(` ${r.autoMemoryCount} preferences picked up across ${r.autoMemoryProjects} project${r.autoMemoryProjects===1?"":"s"}:`);let Ze=Object.entries(r.autoMemoryByPrefix).sort((mr,Gr)=>Gr[1]-mr[1]),pr=Ze.length>0?Ze[0][1]:1;for(let[mr,Gr]of Ze){let yd=kP[mr]??mr;d.push(` ${yd.padEnd(26)} ${String(Gr).padStart(2)} ${Kn(Gr,pr,20)}`)}}else d.push(" No preferences learned yet \u2014 context-mode picks them up automatically.");d.push(""),d.push(""),d.push(" Your AI talks less, remembers more, costs less."),d.push(` Locale ${i} \xB7 timezone ${a} \xB7 pricing examples for illustration only.`),d.push("");let MR=u?`v${u}`:"context-mode";return d.push(` ${MR}`),u&&l&&l!=="unknown"&&bP(l,u)&&d.push(` Update available: v${u} -> v${l} | ctx_upgrade`),TB(d)}function TB(t){let e=[],r=0;for(let n of t)n===""?(r++,r<=2&&e.push(n)):(r=0,e.push(n));for(;e.length>0&&e[e.length-1]==="";)e.pop();return e}function PB(t,e,r){if(t.length===0)return[];let n=[...t].sort((p,h)=>p.ms-h.ms),o=n[0],s=n[n.length-1],i=Math.max(1,s.ms-o.ms),a=n[0];for(let p of n)p.count>a.count&&(a=p);let c=56,u=Array.from({length:c},()=>"\u2500");for(let p of n){let h=Math.round((p.ms-o.ms)/i*(c-1)),m="\u25CF";p===a&&(m="\u2588"),(p.rescueBytes??0)>0&&(m="\u25C6"),u[h]=m}let l=p=>{let h=new Intl.DateTimeFormat(e,{timeZone:r,month:"short",day:"numeric"}).formatToParts(new Date(p)),m=(h.find(g=>g.type==="month")?.value??"").toLowerCase(),f=h.find(g=>g.type==="day")?.value??"";return`${m} ${f}`},d=[];d.push(` ${l(o.ms)} ${u.join("")} ${l(s.ms)}`),d.push("");for(let p of n){let h=l(p.ms).padEnd(7),m=`${p.count} captures`,f=p===a?" \u2190 peak":"",g=(p.rescueBytes??0)>0?` \u25C6 /compact rescued ${Math.round((p.rescueBytes??0)/1024)} KB`:"";d.push(` ${h} ${m}${f}${g}`)}return d.push(""),d.push(" \u25CF active day \u2588 peak day \u25C6 /compact rescue"),d}function fP(t,e,r){if(!Number.isFinite(t)||t<=0)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let o=new Intl.DateTimeFormat(e,{timeZone:r,year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}).formatToParts(n),s=d=>o.find(p=>p.type===d)?.value??"",i=s("day"),a=s("month"),c=s("year"),u=s("hour"),l=s("minute");return u==="24"&&(u="00"),`${i} ${a} ${c} at ${u}:${l} (${r})`}function wr(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}K`:String(t)}function Xa(){let t=process.env.PI_CONTEXT_MODE_PRICE_OUTPUT_PER_TOKEN;if(t!==void 0&&t!==""){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}return 15/1e6}function Wl(t){return`$${((Number.isFinite(t)&&t>0?t:0)*Xa()).toFixed(2)}`}function Kn(t,e,r=40){if(e<=0)return"\u2591".repeat(r);let n=Math.max(1,Math.round(t/e*r));return"\u2588".repeat(Math.min(n,r))+"\u2591".repeat(Math.max(0,r-n))}function hP(t,e){let r=e?.sessionTokensSaved??0;if(t.total_events===0&&(e?.lifetime?.totalEvents??0)===0&&r===0&&(e?.multiAdapter?.totalEvents??0)===0)return[];let n=e?.topN??Number.POSITIVE_INFINITY,o=[];o.push("");let s=e?.multiAdapter,i=s?.perAdapter.filter(f=>f.isReal).length??0,a=s?.totalEvents??e?.lifetime?.totalEvents??t.total_events,c=s?.totalSessions??e?.lifetime?.totalSessions??t.session_count,u=e?.lifetime?.distinctProjects;if(a>0&&u&&u>0){let f=i>=2?" everywhere":"";o.push(` All your work${f} \xB7 ${wr(a)} events captured across ${u} project${u===1?"":"s"} \xB7 ${wr(c)} conversations`)}else{o.push("Persistent memory \u2713 preserved across compact, restart & upgrade");let f=c===0&&r>0?1:c,g=f===1?"1 session":`${wr(f)} sessions`,y=a*256+r;o.push(` ${wr(a)} events \xB7 ${g} \xB7 ~${Wl(y)} saved lifetime`)}o.push("");let l=e?.lifetime?.categoryCounts,d;l&&Object.keys(l).length>0?d=Object.entries(l).filter(([,f])=>f>0).map(([f,g])=>({category:f,count:g,label:ql[f]||f})).sort((f,g)=>g.count-f.count):d=(t.by_category??[]).filter(f=>f&&f.count>0);let p=d.slice(0,n),h=p.length>0?p[0].count:1;for(let f of p)o.push(` ${f.label.padEnd(26)} ${String(f.count).padStart(5)} ${Kn(f.count,h,30)}`);let m=Math.max(0,d.length-n);return m>0&&o.push(` ... ${m} more categor${m===1?"y":"ies"}`),o}function gP(t){if(!t||t.autoMemoryCount===0)return[];let e=[];e.push(""),e.push(` Preferences learned \xB7 ${t.autoMemoryCount} across ${t.autoMemoryProjects} project${t.autoMemoryProjects===1?"":"s"}`);let r=Object.entries(t.autoMemoryByPrefix).sort((o,s)=>s[1]-o[1]).slice(0,6),n=r.length>0?r[0][1]:1;for(let[o,s]of r){let i=kP[o]??o;e.push(` ${i.padEnd(26)} ${String(s).padStart(2)} ${Kn(s,n,20)}`)}return e}function yP(t,e){let r=[],n=Wl(t),o=(e?.totalEvents??0)*256+t,s=Wl(o);return r.push(""),r.push("\u2500".repeat(65)),r.push("Your AI talks less, remembers more, costs less."),r.push(`${n} this session \xB7 ${s} lifetime`),r.push("\u2500".repeat(65)),r}function xP(t){if(!t)return[];let e=[],r=[];for(let o of t.perAdapter)(o.isReal?e:r).push(o);if(e.length===0&&r.length===0)return[];let n=[];if(e.length>0){n.push(""),n.push("Where it came from (tools you actually used \u2014 fixtures + probes filtered):"),n.push("");let o=16,s=10,i=10,a=16;n.push(` ${"Tool".padEnd(o)}${"Captures".padStart(s)}${"Indexed".padStart(i)}${"Total kept out".padStart(a)}`);let c=[...e].sort((u,l)=>l.dataBytes+l.rescueBytes-(u.dataBytes+u.rescueBytes));for(let u of c){let l=u.dataBytes+u.rescueBytes,d=u.eventCount>0?wr(u.eventCount):"\u2014",p=dt(u.dataBytes),h=dt(l);n.push(` ${Vl(u.name).padEnd(o)}${d.padStart(s)}${p.padStart(i)}${h.padStart(a)}`)}}if(r.length>0){e.length>0&&n.push("");let o=r.map(s=>Vl(s.name)).join(", ");n.push(` Skipped (${r.length}): ${o}`),n.push(" These adapters have DBs on disk but only test fixtures, dev skeletons,"),n.push(" or detection probes \u2014 no real chat activity.")}return n}function Jl(t,e,r,n){let o=[],s=kB(t.session.uptime_min),i=n?.lifetime,a=n?.mcpUsage,c=n?.conversation,u=n?.realBytes,l=n?.multiAdapter,d=l?.perAdapter.filter(C=>C.isReal).length??0;if(l&&d>0){let C=l.totalSessions||i?.totalSessions||0,b=i?.firstEventMs??0,k=b>0?Math.max(1,Math.round((Date.now()-b)/864e5)):0,P=k>0?`Across ${k} day${k===1?"":"s"} `:"",N=C>0?`you ran ${wr(C)} conversation${C===1?"":"s"} `:"you ran ",R;if(d>=2)R=`across ${d} AI tools`;else{let O=l.perAdapter.find(F=>F.isReal);R=`in ${O?Vl(O.name):"Claude Code"}`}o.push(`${P}${N}${R}.`),o.push("")}if(c&&c.events>0){o.length>0&&(o.length=0);let C=wB(),b=n?.cwd??process.cwd(),k=n?.now??Date.now(),P=n?.locale??C.locale,N=n?.tz??C.tz;return o.push(...$B({conversation:c,lifetime:i,multiAdapter:l,realBytes:u,cwd:b,locale:P,tz:N,now:k,version:e,latestVersion:r})),o.join(`
|
|
599
|
+
FROM session_events`).get();m&&(s+=Number(m.data_bytes??0),i+=Number(m.bytes_avoided??0),a+=Number(m.bytes_returned??0));try{let f=h.prepare("SELECT COALESCE(SUM(LENGTH(snapshot)), 0) AS bytes FROM session_resume").get();f?.bytes&&(c+=Number(f.bytes))}catch{}}}finally{h.close()}}catch{}}let u=0;t.sessionId&&t.contentDbPath&&(u=xB(t.sessionId,t.contentDbPath,{loadDatabase:t.loadDatabase}),i+=u);let l=Math.floor((s+i+c)/4);return{eventDataBytes:s,bytesAvoided:i,bytesReturned:a,snapshotBytes:c,contentBytes:u,totalSavedTokens:l}}function vB(t,e,r){let n={name:t.name,eventCount:0,sessionCount:0,dataBytes:0,rescueBytes:0,contentBytes:0,uuidConvs:0,projectDirs:[],firstMs:Number.POSITIVE_INFINITY,lastMs:0,isReal:!1};if(!pn(t.sessionsDir))return n;let o=[];try{o=di(t.sessionsDir).filter(l=>l.endsWith(".db"))}catch{return n}if(o.length===0)return n;let s=null;try{s=e()}catch{return n}if(!s)return n;let i=new Set,a=new Set;for(let l of o){let d=Bt(t.sessionsDir,l);try{let p=new s(d,{readonly:!0});try{let h=p.prepare("SELECT COUNT(*) AS cnt, COALESCE(SUM(LENGTH(data)), 0) AS bytes FROM session_events").get();h&&(n.eventCount+=Number(h.cnt??0),n.dataBytes+=Number(h.bytes??0));try{let m=p.prepare("SELECT COUNT(*) AS cnt FROM session_meta").get();n.sessionCount+=Number(m?.cnt??0)}catch{}try{let m=p.prepare("SELECT COALESCE(SUM(length(snapshot)), 0) AS bytes FROM session_resume WHERE consumed = 1").get();m?.bytes&&(n.rescueBytes+=Number(m.bytes))}catch{}try{let m=p.prepare("SELECT MIN(created_at) AS mn, MAX(created_at) AS mx FROM session_events").get();if(m?.mn){let f=Date.parse(m.mn+(m.mn.endsWith("Z")?"":"Z"));Number.isFinite(f)&&f<n.firstMs&&(n.firstMs=f)}if(m?.mx){let f=Date.parse(m.mx+(m.mx.endsWith("Z")?"":"Z"));Number.isFinite(f)&&f>n.lastMs&&(n.lastMs=f)}}catch{}try{let m=p.prepare("SELECT DISTINCT project_dir AS p FROM session_events WHERE project_dir != ''").all();for(let f of m)f.p&&i.add(f.p)}catch{}try{let m=p.prepare("SELECT DISTINCT session_id AS s FROM session_events").all();for(let f of m)f.s&&a.add(f.s)}catch{}}finally{p.close()}}catch{}}n.projectDirs=Array.from(i),n.uuidConvs=a.size;let c=n.eventCount>0?n.dataBytes/n.eventCount:0,u=n.lastMs>0&&r.nowMs-n.lastMs<=r.recencyMs;return n.isReal=n.eventCount>=r.minEvents&&i.size>=r.minProjects&&u&&c>=r.minAvgBytes,n}function Gl(t){let e=yB({home:t?.home}),r=t?.loadDatabase??rt,n={...bB,...t?.filter??{},nowMs:t?.filter?.nowMs??Date.now()},o=[],s=0,i=0,a=0;for(let c of e){if(!pn(c.sessionsDir))continue;let u=vB(c,r,n);o.push(u),s+=u.eventCount,i+=u.sessionCount,a+=u.dataBytes+u.rescueBytes}return{totalEvents:s,totalSessions:i,totalBytes:a,perAdapter:o}}function Vl(t){return SB[t]??t}function dt(t){if(!Number.isFinite(t)||t<=0)return"0 B";if(t<1024)return`${Math.round(t)} B`;let e=t/1024;if(e<1024)return e<100?`${e.toFixed(1)} KB`:`${Math.round(e)} KB`;let r=e/1024;if(r<1024)return r<100?`${r.toFixed(1)} MB`:`${Math.round(r)} MB`;let n=r/1024;return n<100?`${n.toFixed(2)} GB`:`${n.toFixed(1)} GB`}function kB(t){let e=parseFloat(t);if(isNaN(e)||e<1)return"< 1 min";if(e<60)return`${Math.round(e)} min`;let r=Math.floor(e/60),n=Math.round(e%60);return n>0?`${r}h ${n}m`:`${r}h`}function Zl(t){if(!t)return!1;try{return Intl.DateTimeFormat.supportedLocalesOf(t).length===0?!1:(new Intl.DateTimeFormat(t),!0)}catch{return!1}}function wB(){let t=process.env??{},e=t.CONTEXT_MODE_LOCALE??"";if(e&&!Zl(e)&&(e=""),!e){if(process.platform==="darwin"){try{let n=mB("defaults",["read","-g","AppleLocale"],{encoding:"utf8",timeout:500}).trim();n&&(e=n.replace(/_/g,"-"))}catch{}e&&!Zl(e)&&(e="")}if(!e&&(t.LC_TIME||t.LANG)){let n=(t.LC_TIME||t.LANG||"").split(".")[0];n&&(e=n.replace(/_/g,"-")),e&&!Zl(e)&&(e="")}if(!e)try{e=new Intl.DateTimeFormat().resolvedOptions().locale}catch{e="en-US"}}let r=t.CONTEXT_MODE_TZ??"";if(!r)try{r=new Intl.DateTimeFormat().resolvedOptions().timeZone}catch{r="UTC"}return Zl(e)||(e="en-US"),{locale:e,tz:r||"UTC"}}function mP(t){let e=Kl();return e?t===e?"~":t.startsWith(e+hB)?"~"+t.slice(e.length):t:t}function EB(t,e,r){if(!Number.isFinite(e)||e<=0)return[];let n=e*Xa(),o=(y,_=2)=>y.toFixed(_),s=Math.round(n/20),i=(n/200).toFixed(1),a=Math.round(n/73.67),c=Math.round(n*10),u=r>0?Math.round(n*10/r*365):0,l=(e*3/1e6).toFixed(2),d=(e*2.5/1e6).toFixed(2),p=(e*1.25/1e6).toFixed(2),h=(e*1/1e6).toFixed(2),m=process.env.PI_CONTEXT_MODE_PRICE_OUTPUT_PER_TOKEN!==void 0,f=process.env.PI_CONTEXT_MODE_MODEL_ID,g=[];return m&&f?g.push(` $${o(n)} of ${f} tokens your team didn't burn.`):m?g.push(` $${o(n)} of tokens your team didn't burn.`):g.push(` $${o(n)} of Opus 4.7 tokens your team didn't burn.`),g.push(` context-mode kept ${dt(t)} out of context \u2014 that's ${s} months of Cursor Pro paid for itself.`),c>0&&u>0&&(g.push(""),g.push(` Scale across a 10-dev team and that's ~$${u.toLocaleString("en-US")}/year saved.`)),m||(g.push(""),g.push(" (Opus rates shown for context. On cheaper models the dollar number drops; the savings ratio holds.)")),g}function $B(t){let{conversation:e,lifetime:r,multiAdapter:n,realBytes:o,cwd:s,locale:i,tz:a,now:c,version:u,latestVersion:l}=t,d=[],p=e.events*_P,h=Math.round((e.snapshotBytes??0)/4),m=p+h,f=o?.conversation?.totalSavedTokens??0,g=Math.max(m,f),y=(r?.totalEvents??0)*_P,_=Math.round((r?.rescueBytes??0)/4),x=y+_,v=o?.lifetime?.totalSavedTokens??0,E=Math.max(x,v),C=o?.lifetime?.bytesReturned??0,b=o?.lifetime?.bytesAvoided??0,k=C+b>0?Math.max(1,Math.floor(C/4)):Math.max(1,Math.round(E*.02)),P=n?.totalBytes&&n.totalBytes>0?n.totalBytes:E*4,N=o?.conversation?o.conversation.eventDataBytes+o.conversation.bytesAvoided+o.conversation.snapshotBytes:g*4,R=e.daysAlive>=1?`${e.daysAlive.toFixed(1)} days alive \xB7 still going`:`${Math.max(1,Math.round(e.daysAlive*24))} hr alive \xB7 still going`,O=r?.firstEventMs??n?.perAdapter?.[0]?.firstMs??0,F=O>0?Math.max(1,Math.round((c-O)/864e5)):0,K=n?.totalSessions??r?.totalSessions??1,ge=n?.perAdapter.filter(Ze=>Ze.isReal).length??0,We;if(n&&ge>=2)We=`across ${ge} AI tools`;else if(n&&ge===1){let Ze=n.perAdapter.find(pr=>pr.isReal);We=`in ${Ze?Vl(Ze.name):"Claude Code"}`}else We="in Claude Code";F>0?d.push(` Across ${F} days you ran ${wr(K)} conversations ${We}.`):d.push(` You ran ${wr(K)} conversations ${We}.`);let _t=F>0?P/F:0;d.push(` context-mode kept ${dt(P)} out of your context window \u2014 about ${dt(_t)} every single day.`),d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 1. Where you are now \u2500\u2500\u2500"),d.push("");let Pr=e.firstEventMs&&e.firstEventMs>0?fP(e.firstEventMs,i,a):"";if(Pr?d.push(` This conversation started ${Pr} in ${mP(s)}.`):d.push(` This conversation lives in ${mP(s)}.`),d.push(` ${R}.`),e.snapshotsConsumed>0&&e.snapshotBytes>0){let Ze=e.lastRescueMs&&e.lastRescueMs>0?fP(e.lastRescueMs,i,a):"",pr=Math.round(e.snapshotBytes/1024);Ze?d.push(` On ${Ze}, /compact fired \u2014 ${pr} KB rescued from snapshot.`):d.push(` /compact fired \u2014 ${pr} KB rescued from snapshot.`),d.push(" Without that, you'd be re-explaining everything to a blank model right now.")}d.push("");let ic=o?.conversation,ac=ic?.bytesAvoided??0,gd=ic?.bytesReturned??0;if(ac+gd===0)d.push(" No measurable redirect activity captured yet \u2014 bars will appear once context-mode diverts its first payload."),d.push("");else{let Ze=ac+gd,pr=Math.max(1,gd),mr=Math.max(1,Math.floor(Ze/4)),Gr=Math.max(1,Math.floor(pr/4)),yd=Kn(mr,mr,32),jR=Kn(Gr,mr,32),LR=(1-Gr/mr)*100,zR=Math.max(1,Math.round(mr/Gr));d.push(` Without context-mode ${dt(Ze).padStart(8)} ${yd} ${wr(mr).padStart(7)} tokens`),d.push(` With context-mode ${dt(pr).padStart(8)} ${jR} ${wr(Gr).padStart(7)} tokens`),d.push(` ${LR.toFixed(0)}% kept out of context \xB7 your AI ran ${zR}\xD7 longer before /compact fired`),d.push("")}if(e.byDay&&e.byDay.length>0){let Ze=e.lastEventMs&&e.firstEventMs?Math.max(1,Math.round((e.lastEventMs-e.firstEventMs)/864e5)+1):e.byDay.length;d.push(` How that ${dt(N)} built up \u2014 ${Ze} days, ${e.byDay.length} active:`),d.push(""),d.push(...PB(e.byDay,i,a))}d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 2. What this chat captured (used when you --continue or /resume here) \u2500\u2500\u2500"),d.push("");let AR=e.byCategory.reduce((Ze,pr)=>Ze+pr.count,0).toLocaleString(i);d.push(` ${AR} things \u2014 files, errors, decisions, agent runs:`),d.push("");let NR=e.byCategory[0]?.count??1;for(let Ze of e.byCategory)d.push(` ${Ze.label.padEnd(26)} ${String(Ze.count).padStart(5)} ${Kn(Ze.count,NR,28)}`);d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 3. The scope, getting wider \u2500\u2500\u2500"),d.push("");let sx=e.firstEventMs&&e.firstEventMs>0?new Intl.DateTimeFormat(i,{timeZone:a,year:"numeric",month:"short",day:"numeric"}).format(new Date(e.firstEventMs)):"",ix=O>0?new Intl.DateTimeFormat(i,{timeZone:a,year:"numeric",month:"short",day:"numeric"}).format(new Date(O)):"",ax=r?.distinctProjects??0,DR=r?.totalEvents??n?.totalEvents??0;if(d.push(` This chat: ${dt(N)} kept out \xB7 ${e.events.toLocaleString(i)} captures${sx?` \xB7 started ${sx}`:""}.`),d.push(` All your work: ${dt(P)} kept out \xB7 ${DR.toLocaleString(i)} captures across ${ax} project${ax===1?"":"s"}${ix?` \xB7 since ${ix}`:""}.`),d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 4. The bottom line \u2500\u2500\u2500"),d.push(""),d.push(...EB(P,E,F)),d.push(""),d.push(""),d.push(" \u2500\u2500\u2500 5. What context-mode learned about how you work \u2500\u2500\u2500"),d.push(""),r&&r.autoMemoryCount>0){d.push(` ${r.autoMemoryCount} preferences picked up across ${r.autoMemoryProjects} project${r.autoMemoryProjects===1?"":"s"}:`);let Ze=Object.entries(r.autoMemoryByPrefix).sort((mr,Gr)=>Gr[1]-mr[1]),pr=Ze.length>0?Ze[0][1]:1;for(let[mr,Gr]of Ze){let yd=kP[mr]??mr;d.push(` ${yd.padEnd(26)} ${String(Gr).padStart(2)} ${Kn(Gr,pr,20)}`)}}else d.push(" No preferences learned yet \u2014 context-mode picks them up automatically.");d.push(""),d.push(""),d.push(" Your AI talks less, remembers more, costs less."),d.push(` Locale ${i} \xB7 timezone ${a} \xB7 pricing examples for illustration only.`),d.push("");let MR=u?`v${u}`:"context-mode";return d.push(` ${MR}`),u&&l&&l!=="unknown"&&bP(l,u)&&d.push(` Update available: v${u} -> v${l} | ctx_upgrade`),TB(d)}function TB(t){let e=[],r=0;for(let n of t)n===""?(r++,r<=2&&e.push(n)):(r=0,e.push(n));for(;e.length>0&&e[e.length-1]==="";)e.pop();return e}function PB(t,e,r){if(t.length===0)return[];let n=[...t].sort((p,h)=>p.ms-h.ms),o=n[0],s=n[n.length-1],i=Math.max(1,s.ms-o.ms),a=n[0];for(let p of n)p.count>a.count&&(a=p);let c=56,u=Array.from({length:c},()=>"\u2500");for(let p of n){let h=Math.round((p.ms-o.ms)/i*(c-1)),m="\u25CF";p===a&&(m="\u2588"),(p.rescueBytes??0)>0&&(m="\u25C6"),u[h]=m}let l=p=>{let h=new Intl.DateTimeFormat(e,{timeZone:r,month:"short",day:"numeric"}).formatToParts(new Date(p)),m=(h.find(g=>g.type==="month")?.value??"").toLowerCase(),f=h.find(g=>g.type==="day")?.value??"";return`${m} ${f}`},d=[];d.push(` ${l(o.ms)} ${u.join("")} ${l(s.ms)}`),d.push("");for(let p of n){let h=l(p.ms).padEnd(7),m=`${p.count} captures`,f=p===a?" \u2190 peak":"",g=(p.rescueBytes??0)>0?` \u25C6 /compact rescued ${Math.round((p.rescueBytes??0)/1024)} KB`:"";d.push(` ${h} ${m}${f}${g}`)}return d.push(""),d.push(" \u25CF active day \u2588 peak day \u25C6 /compact rescue"),d}function fP(t,e,r){if(!Number.isFinite(t)||t<=0)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let o=new Intl.DateTimeFormat(e,{timeZone:r,year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}).formatToParts(n),s=d=>o.find(p=>p.type===d)?.value??"",i=s("day"),a=s("month"),c=s("year"),u=s("hour"),l=s("minute");return u==="24"&&(u="00"),`${i} ${a} ${c} at ${u}:${l} (${r})`}function wr(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}K`:String(t)}function Xa(){let t=process.env.PI_CONTEXT_MODE_PRICE_OUTPUT_PER_TOKEN;if(t!==void 0&&t!==""){let e=Number(t);if(Number.isFinite(e)&&e>0)return e}return 5/1e6}function Wl(t){return`$${((Number.isFinite(t)&&t>0?t:0)*Xa()).toFixed(2)}`}function Kn(t,e,r=40){if(e<=0)return"\u2591".repeat(r);let n=Math.max(1,Math.round(t/e*r));return"\u2588".repeat(Math.min(n,r))+"\u2591".repeat(Math.max(0,r-n))}function hP(t,e){let r=e?.sessionTokensSaved??0;if(t.total_events===0&&(e?.lifetime?.totalEvents??0)===0&&r===0&&(e?.multiAdapter?.totalEvents??0)===0)return[];let n=e?.topN??Number.POSITIVE_INFINITY,o=[];o.push("");let s=e?.multiAdapter,i=s?.perAdapter.filter(f=>f.isReal).length??0,a=s?.totalEvents??e?.lifetime?.totalEvents??t.total_events,c=s?.totalSessions??e?.lifetime?.totalSessions??t.session_count,u=e?.lifetime?.distinctProjects;if(a>0&&u&&u>0){let f=i>=2?" everywhere":"";o.push(` All your work${f} \xB7 ${wr(a)} events captured across ${u} project${u===1?"":"s"} \xB7 ${wr(c)} conversations`)}else{o.push("Persistent memory \u2713 preserved across compact, restart & upgrade");let f=c===0&&r>0?1:c,g=f===1?"1 session":`${wr(f)} sessions`,y=a*256+r;o.push(` ${wr(a)} events \xB7 ${g} \xB7 ~${Wl(y)} saved lifetime`)}o.push("");let l=e?.lifetime?.categoryCounts,d;l&&Object.keys(l).length>0?d=Object.entries(l).filter(([,f])=>f>0).map(([f,g])=>({category:f,count:g,label:ql[f]||f})).sort((f,g)=>g.count-f.count):d=(t.by_category??[]).filter(f=>f&&f.count>0);let p=d.slice(0,n),h=p.length>0?p[0].count:1;for(let f of p)o.push(` ${f.label.padEnd(26)} ${String(f.count).padStart(5)} ${Kn(f.count,h,30)}`);let m=Math.max(0,d.length-n);return m>0&&o.push(` ... ${m} more categor${m===1?"y":"ies"}`),o}function gP(t){if(!t||t.autoMemoryCount===0)return[];let e=[];e.push(""),e.push(` Preferences learned \xB7 ${t.autoMemoryCount} across ${t.autoMemoryProjects} project${t.autoMemoryProjects===1?"":"s"}`);let r=Object.entries(t.autoMemoryByPrefix).sort((o,s)=>s[1]-o[1]).slice(0,6),n=r.length>0?r[0][1]:1;for(let[o,s]of r){let i=kP[o]??o;e.push(` ${i.padEnd(26)} ${String(s).padStart(2)} ${Kn(s,n,20)}`)}return e}function yP(t,e){let r=[],n=Wl(t),o=(e?.totalEvents??0)*256+t,s=Wl(o);return r.push(""),r.push("\u2500".repeat(65)),r.push("Your AI talks less, remembers more, costs less."),r.push(`${n} this session \xB7 ${s} lifetime`),r.push("\u2500".repeat(65)),r}function xP(t){if(!t)return[];let e=[],r=[];for(let o of t.perAdapter)(o.isReal?e:r).push(o);if(e.length===0&&r.length===0)return[];let n=[];if(e.length>0){n.push(""),n.push("Where it came from (tools you actually used \u2014 fixtures + probes filtered):"),n.push("");let o=16,s=10,i=10,a=16;n.push(` ${"Tool".padEnd(o)}${"Captures".padStart(s)}${"Indexed".padStart(i)}${"Total kept out".padStart(a)}`);let c=[...e].sort((u,l)=>l.dataBytes+l.rescueBytes-(u.dataBytes+u.rescueBytes));for(let u of c){let l=u.dataBytes+u.rescueBytes,d=u.eventCount>0?wr(u.eventCount):"\u2014",p=dt(u.dataBytes),h=dt(l);n.push(` ${Vl(u.name).padEnd(o)}${d.padStart(s)}${p.padStart(i)}${h.padStart(a)}`)}}if(r.length>0){e.length>0&&n.push("");let o=r.map(s=>Vl(s.name)).join(", ");n.push(` Skipped (${r.length}): ${o}`),n.push(" These adapters have DBs on disk but only test fixtures, dev skeletons,"),n.push(" or detection probes \u2014 no real chat activity.")}return n}function Jl(t,e,r,n){let o=[],s=kB(t.session.uptime_min),i=n?.lifetime,a=n?.mcpUsage,c=n?.conversation,u=n?.realBytes,l=n?.multiAdapter,d=l?.perAdapter.filter(C=>C.isReal).length??0;if(l&&d>0){let C=l.totalSessions||i?.totalSessions||0,b=i?.firstEventMs??0,k=b>0?Math.max(1,Math.round((Date.now()-b)/864e5)):0,P=k>0?`Across ${k} day${k===1?"":"s"} `:"",N=C>0?`you ran ${wr(C)} conversation${C===1?"":"s"} `:"you ran ",R;if(d>=2)R=`across ${d} AI tools`;else{let O=l.perAdapter.find(F=>F.isReal);R=`in ${O?Vl(O.name):"Claude Code"}`}o.push(`${P}${N}${R}.`),o.push("")}if(c&&c.events>0){o.length>0&&(o.length=0);let C=wB(),b=n?.cwd??process.cwd(),k=n?.now??Date.now(),P=n?.locale??C.locale,N=n?.tz??C.tz;return o.push(...$B({conversation:c,lifetime:i,multiAdapter:l,realBytes:u,cwd:b,locale:P,tz:N,now:k,version:e,latestVersion:r})),o.join(`
|
|
596
600
|
`)}let p=t.savings.kept_out+(t.cache?t.cache.bytes_saved:0),h=t.savings.total_bytes_returned,m=t.savings.total_calls,f=p+h,g=f>0?p/f*100:0,y=Math.round(p/4),_=h>0?Math.max(1,Math.round(f/Math.max(h,1))):0;if(p===0){o.push(`context-mode ${s} ${m} calls`),o.push(""),m===0?o.push("No tool calls yet. Use batch_execute or execute to start saving tokens."):o.push(`${dt(h)} entered context | 0 tokens saved`),o.push(...hP(t.projectMemory,{lifetime:i,multiAdapter:l,sessionTokensSaved:0})),o.push(...xP(l)),o.push(...gP(i)),o.push(...yP(0,i)),o.push("");let C=e?`v${e}`:"context-mode";return o.push(C),e&&r&&r!=="unknown"&&bP(r,e)&&o.push(`Update available: v${e} -> v${r} | ctx_upgrade`),o.join(`
|
|
597
601
|
`)}o.push(`${wr(y)} tokens saved \xB7 ${g.toFixed(1)}% reduction \xB7 ${s} \xB7 ~${Wl(y)} saved (Opus)`),o.push(""),o.push(`Without context-mode |${Kn(f,f)}| ${dt(f)}`),o.push(`With context-mode |${Kn(h,f)}| ${dt(h)}`),o.push(""),_>=2?o.push(`${dt(p)} kept out of your conversation \u2014 ${_}\xD7 longer sessions before compact.`):o.push(`${dt(p)} kept out of your conversation. Never entered context.`),o.push("");let x=[`${m} calls`];t.cache&&t.cache.hits>0&&x.push(`${t.cache.hits} cache hits (+${dt(t.cache.bytes_saved)})`),o.push(x.join(" \xB7 "));let v=t.savings.by_tool.filter(C=>C.calls>0);if(v.length>=2){o.push("");let C=v.map(b=>{let k=b.context_kb*1024,P=g<100?k/(1-g/100):k,N=Math.max(0,P-k);return{...b,returnedBytes:k,estimatedSaved:N}}).sort((b,k)=>k.estimatedSaved-b.estimatedSaved);for(let b of C){let k=b.tool.length>22?b.tool.slice(0,19)+"...":b.tool;o.push(` ${k.padEnd(22)} ${String(b.calls).padStart(4)} calls ${dt(b.estimatedSaved).padStart(8)} saved`)}}if(a&&a.length>0){let C=a.filter(b=>b.median_concurrency!=null&&(b.max_concurrency??1)>1);if(C.length>0){o.push(""),o.push("Parallel I/O \u2713 one call did the work of many \u2014 faster runs, lower bill, same answer.");for(let b of C){let k=b.tool_name.replace(/^mcp__.*?__/,"");o.push(` ${k.padEnd(22)} ${b.calls} batches \xB7 ${b.median_concurrency} typical, ${b.max_concurrency} peak`)}}}o.push(...hP(t.projectMemory,{lifetime:i,multiAdapter:l,sessionTokensSaved:y})),o.push(...xP(l)),o.push(...gP(i)),o.push(...yP(y,i)),o.push("");let E=e?`v${e}`:"context-mode";return o.push(E),e&&r&&r!=="unknown"&&r!==e&&o.push(`Update available: v${e} -> v${r} | ctx_upgrade`),o.join(`
|
|
598
|
-
`)}var ql,gB,pi,bB,kP,SB,fX,_P,wP=S(()=>{"use strict";bn();Jt();wn();ql={file:"Files tracked",cwd:"Working directory",rule:"Project rules (CLAUDE.md)",prompt:"Your requests saved",intent:"Session intent",goal:"Session goal",role:"Behavior rules",constraint:"Constraints you set",mcp:"MCP tools called",skill:"Skills used",subagent:"Delegated work",decision:"Your decisions","agent-finding":"Agent insights kept","rejected-approach":"Approaches you rejected","external-ref":"External docs indexed",data:"Data references",git:"Git operations",env:"Environment setup",task:"Tasks in progress",error:"Errors caught",compact:"Compactions weathered",resume:"Sessions resumed cleanly",snapshot:"Snapshots restored",cache:"Cache hits saved",latency:"Slow tools recorded","user-prompt":"Your messages remembered",plan:"Plans drafted","blocked-on":"Blockers logged"},gB={file:"Restored after compact \u2014 no need to re-read",rule:"Your project instructions survive context resets",prompt:"Continues exactly where you left off",decision:"Applied automatically \u2014 won\u2019t ask again",task:"Picks up from where it stopped",error:"Tracked and monitored across compacts",git:"Branch, commit, and repo state preserved",env:"Runtime config carried forward",mcp:"Tool usage patterns remembered",subagent:"Delegation history preserved",skill:"Skill invocations tracked"},pi=class{db;constructor(e){this.db=e}static contextSavingsTotal(e,r){let n=e-r,o=e>0?Math.round(n/e*1e3)/10:0;return{rawBytes:e,contextBytes:r,savedBytes:n,savedPercent:o}}static thinkInCodeComparison(e,r){let n=r>0?Math.round(e/r*10)/10:0;return{fileBytes:e,outputBytes:r,ratio:n}}static toolSavings(e){return e.map(r=>({...r,savedBytes:r.rawBytes-r.contextBytes}))}static sandboxIO(e,r){return{inputBytes:e,outputBytes:r}}getMcpToolUsage(){let e;try{e=this.db.prepare("SELECT data FROM session_events WHERE category = 'mcp_tool_call'").all()}catch{return[]}let r=new Map;for(let o of e){let s;try{s=JSON.parse(o.data)}catch{continue}let i=typeof s.tool_name=="string"?s.tool_name:null;if(!i)continue;let a=r.get(i)??{calls:0,concurrencies:[]};if(a.calls+=1,s.truncated!==!0&&s.params&&typeof s.params=="object"){let c=s.params.concurrency;typeof c=="number"&&Number.isFinite(c)&&c>0&&a.concurrencies.push(c)}r.set(i,a)}let n=[];for(let[o,s]of r){let i=null,a=null;if(s.concurrencies.length>0){s.concurrencies.sort((l,d)=>l-d);let c=s.concurrencies,u=Math.floor(c.length/2);i=c.length%2===0?(c[u-1]+c[u])/2:c[u],a=c[c.length-1]}n.push({tool_name:o,calls:s.calls,median_concurrency:i,max_concurrency:a})}return n.sort((o,s)=>s.calls-o.calls||o.tool_name.localeCompare(s.tool_name)),n}queryAll(e){let n=this.db.prepare("SELECT session_id FROM session_meta ORDER BY started_at DESC LIMIT 1").get()?.session_id??"",o=Object.values(e.bytesReturned).reduce((O,F)=>O+F,0),s=Object.values(e.calls).reduce((O,F)=>O+F,0),i=e.bytesIndexed+e.bytesSandboxed,a=i+o,c=a/Math.max(o,1),u=a>0?Math.round((1-o/a)*100):0,l=new Set([...Object.keys(e.calls),...Object.keys(e.bytesReturned)]),d=Array.from(l).sort().map(O=>({tool:O,calls:e.calls[O]||0,context_kb:Math.round((e.bytesReturned[O]||0)/1024*10)/10,tokens:Math.round((e.bytesReturned[O]||0)/4)})),h=((Date.now()-e.sessionStart)/6e4).toFixed(1),m,f=e.cacheMisses??0;if(e.cacheHits>0||e.cacheBytesSaved>0||f>0){let O=a+e.cacheBytesSaved,F=O/Math.max(o,1),K=Math.max(0,24-Math.floor((Date.now()-e.sessionStart)/(3600*1e3))),ge=e.cacheHits+f,We=ge>0?e.cacheHits/ge:0;m={hits:e.cacheHits,misses:f,hit_rate:We,bytes_saved:e.cacheBytesSaved,ttl_hours_left:K,total_with_cache:O,total_savings_ratio:F}}let g=this.db.prepare("SELECT COUNT(*) as cnt FROM session_events WHERE session_id = ?").get(n).cnt,y=this.db.prepare("SELECT category, COUNT(*) as cnt FROM session_events WHERE session_id = ? GROUP BY category ORDER BY cnt DESC").all(n),x=this.db.prepare("SELECT compact_count FROM session_meta WHERE session_id = ?").get(n)?.compact_count??0,v=this.db.prepare("SELECT event_count, consumed FROM session_resume WHERE session_id = ? ORDER BY created_at DESC LIMIT 1").get(n),E=v?!v.consumed:!1,C=this.db.prepare("SELECT category, type, data FROM session_events WHERE session_id = ? ORDER BY id DESC").all(n),b=new Map;for(let O of C){b.has(O.category)||b.set(O.category,new Set);let F=b.get(O.category);if(F.size<5){let K=O.data;O.category==="file"?K=O.data.split("/").pop()||O.data:(O.category==="prompt"||O.category==="user-prompt")&&(K=K.length>50?K.slice(0,47)+"...":K),K.length>40&&(K=K.slice(0,37)+"..."),F.add(K)}}let k=y.map(O=>({category:O.category,count:O.cnt,label:ql[O.category]||O.category,preview:b.get(O.category)?Array.from(b.get(O.category)).join(", "):"",why:gB[O.category]||"Survives context resets"})),P=this.db.prepare("SELECT COUNT(*) as cnt, COUNT(DISTINCT session_id) as sessions FROM session_events").get(),R=this.db.prepare("SELECT category, COUNT(*) as cnt FROM session_events GROUP BY category ORDER BY cnt DESC").all().filter(O=>O.cnt>0).map(O=>({category:O.category,count:O.cnt,label:ql[O.category]||O.category}));return{savings:{processed_kb:Math.round(a/1024*10)/10,entered_kb:Math.round(o/1024*10)/10,saved_kb:Math.round(i/1024*10)/10,pct:u,savings_ratio:Math.round(c*10)/10,by_tool:d,total_calls:s,total_bytes_returned:o,kept_out:i,total_processed:a},cache:m,session:{id:n,uptime_min:h},continuity:{total_events:g,by_category:k,compact_count:x,resume_ready:E},projectMemory:{total_events:P.cnt,session_count:P.sessions,by_category:R}}}};bB={minEvents:100,minProjects:5,recencyMs:30*864e5,minAvgBytes:50};kP={project:"What you're building",feedback:"How you work",user:"Who you are",reference:"Where to look",memory:"Long-term context",other:"Other notes"},SB={"claude-code":"Claude Code","gemini-cli":"Gemini CLI",antigravity:"Antigravity",openclaw:"Openclaw",codex:"Codex CLI",cursor:"Cursor","vscode-copilot":"VS Code Copilot",kiro:"Kiro",pi:"Pi",omp:"OMP","qwen-code":"Qwen Code",kilo:"Kilo",opencode:"OpenCode",zed:"Zed","jetbrains-copilot":"JetBrains"};fX=
|
|
602
|
+
`)}var ql,gB,pi,bB,kP,SB,fX,_P,wP=S(()=>{"use strict";bn();Jt();wn();ql={file:"Files tracked",cwd:"Working directory",rule:"Project rules (CLAUDE.md)",prompt:"Your requests saved",intent:"Session intent",goal:"Session goal",role:"Behavior rules",constraint:"Constraints you set",mcp:"MCP tools called",skill:"Skills used",subagent:"Delegated work",decision:"Your decisions","agent-finding":"Agent insights kept","rejected-approach":"Approaches you rejected","external-ref":"External docs indexed",data:"Data references",git:"Git operations",env:"Environment setup",task:"Tasks in progress",error:"Errors caught",compact:"Compactions weathered",resume:"Sessions resumed cleanly",snapshot:"Snapshots restored",cache:"Cache hits saved",latency:"Slow tools recorded","user-prompt":"Your messages remembered",plan:"Plans drafted","blocked-on":"Blockers logged"},gB={file:"Restored after compact \u2014 no need to re-read",rule:"Your project instructions survive context resets",prompt:"Continues exactly where you left off",decision:"Applied automatically \u2014 won\u2019t ask again",task:"Picks up from where it stopped",error:"Tracked and monitored across compacts",git:"Branch, commit, and repo state preserved",env:"Runtime config carried forward",mcp:"Tool usage patterns remembered",subagent:"Delegation history preserved",skill:"Skill invocations tracked"},pi=class{db;constructor(e){this.db=e}static contextSavingsTotal(e,r){let n=e-r,o=e>0?Math.round(n/e*1e3)/10:0;return{rawBytes:e,contextBytes:r,savedBytes:n,savedPercent:o}}static thinkInCodeComparison(e,r){let n=r>0?Math.round(e/r*10)/10:0;return{fileBytes:e,outputBytes:r,ratio:n}}static toolSavings(e){return e.map(r=>({...r,savedBytes:r.rawBytes-r.contextBytes}))}static sandboxIO(e,r){return{inputBytes:e,outputBytes:r}}getMcpToolUsage(){let e;try{e=this.db.prepare("SELECT data FROM session_events WHERE category = 'mcp_tool_call'").all()}catch{return[]}let r=new Map;for(let o of e){let s;try{s=JSON.parse(o.data)}catch{continue}let i=typeof s.tool_name=="string"?s.tool_name:null;if(!i)continue;let a=r.get(i)??{calls:0,concurrencies:[]};if(a.calls+=1,s.truncated!==!0&&s.params&&typeof s.params=="object"){let c=s.params.concurrency;typeof c=="number"&&Number.isFinite(c)&&c>0&&a.concurrencies.push(c)}r.set(i,a)}let n=[];for(let[o,s]of r){let i=null,a=null;if(s.concurrencies.length>0){s.concurrencies.sort((l,d)=>l-d);let c=s.concurrencies,u=Math.floor(c.length/2);i=c.length%2===0?(c[u-1]+c[u])/2:c[u],a=c[c.length-1]}n.push({tool_name:o,calls:s.calls,median_concurrency:i,max_concurrency:a})}return n.sort((o,s)=>s.calls-o.calls||o.tool_name.localeCompare(s.tool_name)),n}queryAll(e){let n=this.db.prepare("SELECT session_id FROM session_meta ORDER BY started_at DESC LIMIT 1").get()?.session_id??"",o=Object.values(e.bytesReturned).reduce((O,F)=>O+F,0),s=Object.values(e.calls).reduce((O,F)=>O+F,0),i=e.bytesIndexed+e.bytesSandboxed,a=i+o,c=a/Math.max(o,1),u=a>0?Math.round((1-o/a)*100):0,l=new Set([...Object.keys(e.calls),...Object.keys(e.bytesReturned)]),d=Array.from(l).sort().map(O=>({tool:O,calls:e.calls[O]||0,context_kb:Math.round((e.bytesReturned[O]||0)/1024*10)/10,tokens:Math.round((e.bytesReturned[O]||0)/4)})),h=((Date.now()-e.sessionStart)/6e4).toFixed(1),m,f=e.cacheMisses??0;if(e.cacheHits>0||e.cacheBytesSaved>0||f>0){let O=a+e.cacheBytesSaved,F=O/Math.max(o,1),K=Math.max(0,24-Math.floor((Date.now()-e.sessionStart)/(3600*1e3))),ge=e.cacheHits+f,We=ge>0?e.cacheHits/ge:0;m={hits:e.cacheHits,misses:f,hit_rate:We,bytes_saved:e.cacheBytesSaved,ttl_hours_left:K,total_with_cache:O,total_savings_ratio:F}}let g=this.db.prepare("SELECT COUNT(*) as cnt FROM session_events WHERE session_id = ?").get(n).cnt,y=this.db.prepare("SELECT category, COUNT(*) as cnt FROM session_events WHERE session_id = ? GROUP BY category ORDER BY cnt DESC").all(n),x=this.db.prepare("SELECT compact_count FROM session_meta WHERE session_id = ?").get(n)?.compact_count??0,v=this.db.prepare("SELECT event_count, consumed FROM session_resume WHERE session_id = ? ORDER BY created_at DESC LIMIT 1").get(n),E=v?!v.consumed:!1,C=this.db.prepare("SELECT category, type, data FROM session_events WHERE session_id = ? ORDER BY id DESC").all(n),b=new Map;for(let O of C){b.has(O.category)||b.set(O.category,new Set);let F=b.get(O.category);if(F.size<5){let K=O.data;O.category==="file"?K=O.data.split("/").pop()||O.data:(O.category==="prompt"||O.category==="user-prompt")&&(K=K.length>50?K.slice(0,47)+"...":K),K.length>40&&(K=K.slice(0,37)+"..."),F.add(K)}}let k=y.map(O=>({category:O.category,count:O.cnt,label:ql[O.category]||O.category,preview:b.get(O.category)?Array.from(b.get(O.category)).join(", "):"",why:gB[O.category]||"Survives context resets"})),P=this.db.prepare("SELECT COUNT(*) as cnt, COUNT(DISTINCT session_id) as sessions FROM session_events").get(),R=this.db.prepare("SELECT category, COUNT(*) as cnt FROM session_events GROUP BY category ORDER BY cnt DESC").all().filter(O=>O.cnt>0).map(O=>({category:O.category,count:O.cnt,label:ql[O.category]||O.category}));return{savings:{processed_kb:Math.round(a/1024*10)/10,entered_kb:Math.round(o/1024*10)/10,saved_kb:Math.round(i/1024*10)/10,pct:u,savings_ratio:Math.round(c*10)/10,by_tool:d,total_calls:s,total_bytes_returned:o,kept_out:i,total_processed:a},cache:m,session:{id:n,uptime_min:h},continuity:{total_events:g,by_category:k,compact_count:x,resume_ready:E},projectMemory:{total_events:P.cnt,session_count:P.sessions,by_category:R}}}};bB={minEvents:100,minProjects:5,recencyMs:30*864e5,minAvgBytes:50};kP={project:"What you're building",feedback:"How you work",user:"Who you are",reference:"Where to look",memory:"Long-term context",other:"Other notes"},SB={"claude-code":"Claude Code","gemini-cli":"Gemini CLI",antigravity:"Antigravity",openclaw:"Openclaw",codex:"Codex CLI",cursor:"Cursor","vscode-copilot":"VS Code Copilot",kiro:"Kiro",pi:"Pi",omp:"OMP","qwen-code":"Qwen Code",kilo:"Kilo",opencode:"OpenCode",zed:"Zed","jetbrains-copilot":"JetBrains"};fX=5/1e6;_P=256});var nR={};we(nR,{REGISTERED_CTX_TOOLS:()=>FP,__resetSuppressionDiagnosticForTests:()=>UB,browserOpenArgv:()=>rR,buildBatchNodeOptionsPrefix:()=>JP,buildFetchCode:()=>tR,classifyIp:()=>ec,currentAttribution:()=>Gn,emitSuppressionDiagnostic:()=>BP,extractSnippet:()=>W_,formatBatchQueryResults:()=>GP,getProjectDir:()=>Lt,killProcessOnPort:()=>X_,openBrowserSync:()=>U_,positionsFromHighlight:()=>KP,registerEmptyToolsListHandler:()=>ZP,resolveSessionIdFromSessionDB:()=>qP,runBatchCommands:()=>QP,server:()=>Fe,shouldSuppressMcpToolsForNativePluginHost:()=>HP,withProjectDirOverride:()=>qB});import{createRequire as DP}from"node:module";import{existsSync as ke,unlinkSync as hi,readdirSync as MP,readFileSync as tc,writeFileSync as B_,renameSync as RB,rmSync as rd,mkdirSync as jP,cpSync as CB,statSync as nd,symlinkSync as OB,lstatSync as LP,realpathSync as IB}from"node:fs";import{execSync as EP,spawnSync as zP}from"node:child_process";import{join as Ce,dirname as Zt,resolve as Ve,sep as L_,isAbsolute as AB}from"node:path";import{fileURLToPath as NB}from"node:url";import{homedir as gi,tmpdir as Z_,cpus as DB}from"node:os";import{request as MB}from"node:https";import{AsyncLocalStorage as jB}from"node:async_hooks";function HP(t={}){if((t.embedded??process.env.CONTEXT_MODE_EMBEDDED_PLUGIN_TOOLS)==="1")return!1;let r=t.platform??vt().platform;if(r!=="opencode"&&r!=="kilo")return!1;let n=t.settings??zB(r);return FB(n)&&HB(n)}function LB(t){let e="",r=!1,n=!1,o=!1;for(let s=0;s<t.length;s++){let i=t[s],a=t[s+1];if(o){i==="*"&&a==="/"&&(o=!1,s++);continue}if(n){e+=i,n=!1;continue}if(i==="\\"){e+=i,n=r;continue}if(i==='"'){r=!r,e+=i;continue}if(!r&&i==="/"&&a==="/"){for(;s<t.length&&t[s]!==`
|
|
599
603
|
`;)s++;s<t.length&&(e+=`
|
|
600
604
|
`);continue}if(!r&&i==="/"&&a==="*"){o=!0,s++;continue}e+=i}return e.replace(/,(\s*[}\]])/g,"$1")}function zB(t){let e=t==="kilo"?"kilo":"opencode",r=[Ve(`${e}.json`),Ve(`${e}.jsonc`),Ve(`.${e}`,`${e}.json`),Ve(`.${e}`,`${e}.jsonc`),Ce(gi(),".config",e,`${e}.json`),Ce(gi(),".config",e,`${e}.jsonc`)];for(let n of r)try{if(!ke(n))continue;return JSON.parse(LB(tc(n,"utf8")))}catch{}return null}function FB(t){let e=t?.plugin;return Array.isArray(e)&&e.some(r=>typeof r=="string"&&r.includes("context-mode"))}function HB(t){let e=t?.mcp;return!!(e&&typeof e=="object"&&!Array.isArray(e)&&Object.prototype.hasOwnProperty.call(e,"context-mode"))}function BP(t={}){if(z_)return;z_=!0;let e=t.write??(n=>{process.stderr.write(n)}),r=t.platform??"opencode/kilo";e(`[context-mode] ctx_* tools/list intentionally empty on this MCP child: legacy mcp.context-mode block coexists with plugin: ["context-mode"] in ${r}.json \u2014 plugin-native tools are the supported path (#623). Run \`context-mode upgrade\` to remove the legacy block (preserves other MCP servers).
|
|
601
605
|
`)}function UB(){z_=!1}function ZP(t=Fe){t.server.registerCapabilities({tools:{listChanged:!1}}),t.server.setRequestHandler(Us,async()=>({tools:[]}))}function ZB(t,e){return async r=>{try{return await e(r)}catch(n){let o=JB(n);if(o)try{return W(t,o)}catch(s){if(s instanceof Kt)return o;throw s}throw n}}}async function qB(t,e){let r=typeof t=="string"?{projectDir:t}:t;return q_.run(r,e)}function Gn(){let t=q_.getStore();if(t?.sessionId)return{sessionId:t.sessionId};let e=process.env.CLAUDE_SESSION_ID??qP();if(e)return{sessionId:e}}function qP(t){let e=Date.now();if(!t?.bypassCache&&Xl&&e-Xl.checkedAt<2e3)return Xl.sid;try{let r=t?.projectDir??process.env.CLAUDE_PROJECT_DIR??process.env.CONTEXT_MODE_PROJECT_DIR;if(!r)return;let n=t?.sessionsDir??Be(),o=cs({projectDir:r,sessionsDir:n});if(!ke(o))return;let s=rt(),i=new s(o,{readonly:!0,fileMustExist:!0});try{let c=i.prepare("SELECT session_id FROM session_events ORDER BY created_at DESC LIMIT 1").get()?.session_id;return c&&(Xl={sid:c,checkedAt:e}),c}finally{try{i.close()}catch{}}}catch{return}}function VB(t){try{let e=Be();if(!ke(e))return;let r=MP(e).filter(n=>n.endsWith("-events.md"));for(let n of r){let o=Ce(e,n);try{t.index({path:o,source:"session-events",attribution:Gn()}),hi(o)}catch{}}}catch{}}async function WB(){if($r)return $r;try{let{getAdapter:t}=await Promise.resolve().then(()=>(Tn(),zc)),e=vt();return await t(e.platform)}catch{return null}}function mi(){if($r)return $r.getSessionDir();try{let t=vt(),e=Mi(t.platform);if(e)return $c({configDir:Ce(...e),configDirEnv:KB(e)})}catch{}return $c({configDir:".claude",configDirEnv:"CLAUDE_CONFIG_DIR"})}function KB(t){if(t.length===1&&t[0]===".claude")return"CLAUDE_CONFIG_DIR";if(t.length===1&&t[0]===".codex")return"CODEX_HOME"}function Be(){return Ir(Jr(mi))}function Lt(){let t=q_.getStore();if(t)return t.projectDir;let e,r,n;try{let o=vt().platform;r=o,o==="claude-code"&&(e=Ce(gi(),".claude","projects")),o==="codex"&&(n=process.env.CODEX_HOME??Ce(gi(),".codex"))}catch{}return dP({env:process.env,cwd:process.cwd(),pwd:process.env.PWD,transcriptsRoot:e,transcriptMaxAgeMs:300*1e3,strictPlatform:r,codexHome:n})}function GB(t){return AB(t)?t:Ve(Lt(),t)}function Qa(){return cs({projectDir:Lt(),sessionsDir:Be()})}function od(){let t=Ir(Sn(mi));return Zd({projectDir:Lt(),contentDir:t})}function Vr(){if(!Er){let t=od();Er=new vs(t),Er.setDenyChecker(e=>{try{let r=Lt(),n=lo("Read",r);return po(e,n,process.platform==="win32",r).denied}catch{return!0}});try{let e=Zt(od());Jp(e,14),Er.cleanupStaleSources(14);let r=Ce(gi(),".context-mode","content");ke(r)&&Jp(r,0)}catch{}Gp()}return VB(Er),Er}function JB(t){return t instanceof Kt?{content:[{type:"text",text:is(t)}],isError:!0}:null}async function TP(){return new Promise(t=>{let e=MB("https://registry.npmjs.org/context-mode/latest",{headers:{Connection:"close"}},r=>{let n="";r.on("data",o=>{n+=o}),r.on("end",()=>{try{let o=JSON.parse(n);t(o.version??"unknown")}catch{t("unknown")}})});e.on("error",()=>t("unknown")),e.setTimeout(5e3,()=>{e.destroy(),t("unknown")}),e.end()})}function QB(){let t=$r?.name;return t==="Claude Code"?"/ctx-upgrade":t==="OpenClaw"?"npm run install:openclaw":t==="Pi"?"npm run build":"npm update -g context-mode"}function eZ(t,e){let r=t.split(".").map(Number),n=e.split(".").map(Number);for(let o=0;o<3;o++){if((r[o]??0)>(n[o]??0))return!0;if((r[o]??0)<(n[o]??0))return!1}return!1}function tZ(){return!hn||hn==="unknown"?!1:eZ(hn,fn)}function rZ(){if(!tZ())return!1;let t=Date.now();if(Yl>=XB){if(t-$P<YB)return!1;Yl=0}return Yl===0&&($P=t),Yl++,!0}function nZ(){if(!PP){PP=!0;try{let t=qe(),e=Ve(t,"plugins","installed_plugins.json");if(!ke(e))return;let r=JSON.parse(tc(e,"utf-8")),n=Ve(t,"plugins","cache"),o=ke(Ve(qt,"package.json"))?qt:Zt(qt);for(let[s,i]of Object.entries(r.plugins??{}))if(s==="context-mode@context-mode")for(let a of i){let c=a.installPath;if(!c||ke(c)||!Ve(c).startsWith(n+L_))continue;try{LP(c).isSymbolicLink()&&hi(c)}catch{}let u=Zt(c);ke(u)||jP(u,{recursive:!0}),ke(o)&&OB(o,c,process.platform==="win32"?"junction":void 0)}}catch{}}}function W(t,e){if(nZ(),rZ()&&e.content.length>0){let n=QB();e.content[0].text=`\u26A0\uFE0F context-mode v${fn} outdated \u2192 v${hn} available. Upgrade: ${n}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{createRequire as oe}from"node:module";import{existsSync as ie,unlinkSync as P,renameSync as ae}from"node:fs";import{tmpdir as ce}from"node:os";import{join as ue}from"node:path";var A=class{#e;constructor(e){this.#e=e}pragma(e){let r=this.#e.prepare(`PRAGMA ${e}`).all();if(!r||r.length===0)return;if(r.length>1)return r;let s=Object.values(r[0]);return s.length===1?s[0]:r[0]}exec(e){let t="",r=null;for(let a=0;a<e.length;a++){let i=e[a];if(r)t+=i,i===r&&(r=null);else if(i==="'"||i==='"')t+=i,r=i;else if(i===";"){let c=t.trim();c&&this.#e.prepare(c).run(),t=""}else t+=i}let s=t.trim();return s&&this.#e.prepare(s).run(),this}prepare(e){let t=this.#e.prepare(e);return{run:(...r)=>t.run(...r),get:(...r)=>{let s=t.get(...r);return s===null?void 0:s},all:(...r)=>t.all(...r),iterate:(...r)=>t.iterate(...r)}}transaction(e){return this.#e.transaction(e)}close(){this.#e.close()}},w=class{#e;constructor(e){this.#e=e}pragma(e){let r=this.#e.prepare(`PRAGMA ${e}`).all();if(!r||r.length===0)return;if(r.length>1)return r;let s=Object.values(r[0]);return s.length===1?s[0]:r[0]}exec(e){return this.#e.exec(e),this}prepare(e){let t=this.#e.prepare(e);return{run:(...r)=>t.run(...r),get:(...r)=>t.get(...r),all:(...r)=>t.all(...r),iterate:(...r)=>typeof t.iterate=="function"?t.iterate(...r):t.all(...r)[Symbol.iterator]()}}transaction(e){return(...t)=>{this.#e.exec("BEGIN");try{let r=e(...t);return this.#e.exec("COMMIT"),r}catch(r){throw this.#e.exec("ROLLBACK"),r}}}close(){this.#e.close()}},g=null;function de(n){let e=null;try{return e=new n(":memory:"),e.exec("CREATE VIRTUAL TABLE __fts5_probe USING fts5(x)"),!0}catch{return!1}finally{try{e?.close()}catch{}}}function le(n,e){let t=e!==void 0?e:globalThis.Bun;if(typeof t<"u"&&t!==null)return!0;let r=n??process.versions,[s,a]=(r.node??"0.0.0").split("."),i=Number(s),c=Number(a);return!Number.isFinite(i)||!Number.isFinite(c)?!1:i>22||i===22&&c>=5}function Ee(){if(!g){let n=oe(import.meta.url);if(globalThis.Bun){let e=n(["bun","sqlite"].join(":")).Database;g=function(r,s){let a=new e(r,{readonly:s?.readonly,create:!0}),i=new A(a);return s?.timeout&&i.pragma(`busy_timeout = ${s.timeout}`),i}}else if(le()){let e=null;try{({DatabaseSync:e}=n(["node","sqlite"].join(":")))}catch{e=null}e&&de(e)?g=function(r,s){let a=new e(r,{readOnly:s?.readonly??!1}),i=new w(a);return s?.timeout&&i.pragma(`busy_timeout = ${s.timeout}`),i}:g=n("better-sqlite3")}else g=n("better-sqlite3")}return g}function F(n){n.pragma("journal_mode = WAL"),n.pragma("synchronous = NORMAL");try{n.pragma("mmap_size = 268435456")}catch{}}function k(n){if(!ie(n))for(let e of["-wal","-shm"])try{P(n+e)}catch{}}function ge(n){for(let e of["","-wal","-shm"])try{P(n+e)}catch{}}function x(n){try{n.pragma("wal_checkpoint(TRUNCATE)")}catch{}try{n.close()}catch{}}function B(n="context-mode"){return ue(ce(),`${n}-${process.pid}.db`)}function me(n,e=[100,500,2e3]){let t;for(let r=0;r<=e.length;r++)try{return n()}catch(s){let a=s instanceof Error?s.message:String(s);if(!a.includes("SQLITE_BUSY")&&!a.includes("database is locked"))throw s;if(t=s instanceof Error?s:new Error(a),r<e.length){let i=e[r],c=Date.now();for(;Date.now()-c<i;);}}throw new Error(`SQLITE_BUSY: database is locked after ${e.length} retries. Original error: ${t?.message}`)}function _e(n){return n.includes("SQLITE_CORRUPT")||n.includes("SQLITE_NOTADB")||n.includes("database disk image is malformed")||n.includes("file is not a database")}function pe(n){let e=Date.now();for(let t of["","-wal","-shm"])try{ae(n+t,`${n}${t}.corrupt-${e}`)}catch{}}var y=Symbol.for("__context_mode_live_dbs_v3__"),
|
|
2
|
-
`))}function K(n){let e=process.env[l];if(e===void 0)return{kind:"unset"};let t=e.trim();if(!t)return{kind:"ignored-empty",ignoredEnvVar:l,ignoredReason:"empty"};if(!G(t))throw be(n,t,`${l} must be an absolute path.`);return{kind:"override",root:_(t)}}function De(n){return n.kind==="ignored-empty"?{ignoredEnvVar:n.ignoredEnvVar,ignoredReason:n.ignoredReason}:{}}function z(n,e){let t=K(n);return t.kind!=="override"?null:{kind:n,path:E(t.root,e),envVar:l,source:"override"}}function
|
|
3
|
-
`)}function
|
|
1
|
+
import{createRequire as oe}from"node:module";import{existsSync as ie,unlinkSync as P,renameSync as ae}from"node:fs";import{tmpdir as ce}from"node:os";import{join as ue}from"node:path";var A=class{#e;constructor(e){this.#e=e}pragma(e){let r=this.#e.prepare(`PRAGMA ${e}`).all();if(!r||r.length===0)return;if(r.length>1)return r;let s=Object.values(r[0]);return s.length===1?s[0]:r[0]}exec(e){let t="",r=null;for(let a=0;a<e.length;a++){let i=e[a];if(r)t+=i,i===r&&(r=null);else if(i==="'"||i==='"')t+=i,r=i;else if(i===";"){let c=t.trim();c&&this.#e.prepare(c).run(),t=""}else t+=i}let s=t.trim();return s&&this.#e.prepare(s).run(),this}prepare(e){let t=this.#e.prepare(e);return{run:(...r)=>t.run(...r),get:(...r)=>{let s=t.get(...r);return s===null?void 0:s},all:(...r)=>t.all(...r),iterate:(...r)=>t.iterate(...r)}}transaction(e){return this.#e.transaction(e)}close(){this.#e.close()}},w=class{#e;constructor(e){this.#e=e}pragma(e){let r=this.#e.prepare(`PRAGMA ${e}`).all();if(!r||r.length===0)return;if(r.length>1)return r;let s=Object.values(r[0]);return s.length===1?s[0]:r[0]}exec(e){return this.#e.exec(e),this}prepare(e){let t=this.#e.prepare(e);return{run:(...r)=>t.run(...r),get:(...r)=>t.get(...r),all:(...r)=>t.all(...r),iterate:(...r)=>typeof t.iterate=="function"?t.iterate(...r):t.all(...r)[Symbol.iterator]()}}transaction(e){return(...t)=>{this.#e.exec("BEGIN");try{let r=e(...t);return this.#e.exec("COMMIT"),r}catch(r){throw this.#e.exec("ROLLBACK"),r}}}close(){this.#e.close()}},g=null;function de(n){let e=null;try{return e=new n(":memory:"),e.exec("CREATE VIRTUAL TABLE __fts5_probe USING fts5(x)"),!0}catch{return!1}finally{try{e?.close()}catch{}}}function le(n,e){let t=e!==void 0?e:globalThis.Bun;if(typeof t<"u"&&t!==null)return!0;let r=n??process.versions,[s,a]=(r.node??"0.0.0").split("."),i=Number(s),c=Number(a);return!Number.isFinite(i)||!Number.isFinite(c)?!1:i>22||i===22&&c>=5}function Ee(){if(!g){let n=oe(import.meta.url);if(globalThis.Bun){let e=n(["bun","sqlite"].join(":")).Database;g=function(r,s){let a=new e(r,{readonly:s?.readonly,create:!0}),i=new A(a);return s?.timeout&&i.pragma(`busy_timeout = ${s.timeout}`),i}}else if(le()){let e=null;try{({DatabaseSync:e}=n(["node","sqlite"].join(":")))}catch{e=null}e&&de(e)?g=function(r,s){let a=new e(r,{readOnly:s?.readonly??!1}),i=new w(a);return s?.timeout&&i.pragma(`busy_timeout = ${s.timeout}`),i}:g=n("better-sqlite3")}else g=n("better-sqlite3")}return g}function F(n){n.pragma("journal_mode = WAL"),n.pragma("synchronous = NORMAL");try{n.pragma("mmap_size = 268435456")}catch{}}function k(n){if(!ie(n))for(let e of["-wal","-shm"])try{P(n+e)}catch{}}function ge(n){for(let e of["","-wal","-shm"])try{P(n+e)}catch{}}function x(n){try{n.pragma("wal_checkpoint(TRUNCATE)")}catch{}try{n.close()}catch{}}function B(n="context-mode"){return ue(ce(),`${n}-${process.pid}.db`)}function me(n,e=[100,500,2e3]){let t;for(let r=0;r<=e.length;r++)try{return n()}catch(s){let a=s instanceof Error?s.message:String(s);if(!a.includes("SQLITE_BUSY")&&!a.includes("database is locked"))throw s;if(t=s instanceof Error?s:new Error(a),r<e.length){let i=e[r],c=Date.now();for(;Date.now()-c<i;);}}throw new Error(`SQLITE_BUSY: database is locked after ${e.length} retries. Original error: ${t?.message}`)}function _e(n){return n.includes("SQLITE_CORRUPT")||n.includes("SQLITE_NOTADB")||n.includes("database disk image is malformed")||n.includes("file is not a database")}function pe(n){let e=Date.now();for(let t of["","-wal","-shm"])try{ae(n+t,`${n}${t}.corrupt-${e}`)}catch{}}var y=Symbol.for("__context_mode_live_dbs_v3__"),O=(()=>{let n=globalThis;return n[y]||(n[y]=new Set,process.on("exit",()=>{for(let e of n[y])x(e);n[y].clear()})),n[y]})(),v=class{#e;#t;constructor(e){let t=Ee();this.#e=e,k(e);let r;try{r=new t(e,{timeout:3e4}),F(r)}catch(s){let a=s instanceof Error?s.message:String(s);if(_e(a)){pe(e),k(e);try{r=new t(e,{timeout:3e4}),F(r)}catch(i){throw new Error(`Failed to create fresh DB after renaming corrupt file: ${i instanceof Error?i.message:String(i)}`)}}else throw s}this.#t=r,O.add(this.#t),this.initSchema(),this.prepareStatements()}get db(){return this.#t}get dbPath(){return this.#e}close(){O.delete(this.#t),x(this.#t)}withRetry(e){return me(e)}cleanup(){O.delete(this.#t),x(this.#t),ge(this.#e)}};import{createHash as S}from"node:crypto";import{execFileSync as ye}from"node:child_process";import{accessSync as Se,constants as fe,existsSync as D,mkdirSync as he,realpathSync as Te,renameSync as I}from"node:fs";import{homedir as q}from"node:os";import{dirname as ve,isAbsolute as G,join as E,resolve as _}from"node:path";var l="CONTEXT_MODE_DIR",Y="sessions",j="content",f=class extends Error{kind;path;overrideEnvVar;ignoredEnvVar;ignoredReason;constructor(e,t,r=l,s,a,i={}){super(a??Ne(e,t,i),{cause:s}),this.name="StorageDirectoryError",this.kind=e,this.path=t,this.overrideEnvVar=r,this.ignoredEnvVar=i.ignoredEnvVar,this.ignoredReason=i.ignoredReason}},b=new Map;function qe(n){let e=n.env??process.env,t=n.legacySessionDirEnv,r=t?e[t]?.trim():void 0;return r&&t?(n.onLegacySessionDir?.(t,r),r):E(Re(n.configDir,n.configDirEnv,e),"context-mode","sessions")}function Re(n,e,t){let r=e?t[e]:void 0;return r&&r.trim()!==""?V(r.trim()):V(n,q())}function V(n,e){return n.startsWith("~")?_(q(),n.replace(/^~[/\\]?/,"")):G(n)?_(n):e?_(e,n):_(n)}function be(n,e,t){return new f(n,e,l,void 0,[`Invalid ${l} for context-mode ${n} directory: ${t}`,J()].join(`
|
|
2
|
+
`))}function K(n){let e=process.env[l];if(e===void 0)return{kind:"unset"};let t=e.trim();if(!t)return{kind:"ignored-empty",ignoredEnvVar:l,ignoredReason:"empty"};if(!G(t))throw be(n,t,`${l} must be an absolute path.`);return{kind:"override",root:_(t)}}function De(n){return n.kind==="ignored-empty"?{ignoredEnvVar:n.ignoredEnvVar,ignoredReason:n.ignoredReason}:{}}function z(n,e){let t=K(n);return t.kind!=="override"?null:{kind:n,path:E(t.root,e),envVar:l,source:"override"}}function Le(n,e,t){return{kind:n,path:_(e()),envVar:null,source:"default",...t}}function Q(n){let e=K("session");return e.kind==="override"?{kind:"session",path:E(e.root,Y),envVar:l,source:"override"}:Le("session",n,De(e))}function Ge(n){let e=z("content",j);if(e)return e;let t=Q(n);return{kind:"content",path:E(ve(t.path),j),envVar:t.envVar,source:t.source,ignoredEnvVar:t.ignoredEnvVar,ignoredReason:t.ignoredReason}}function Ye(n){let e=z("stats",Y);if(e)return e;let t=Q(n);return{kind:"stats",path:t.path,envVar:t.envVar,source:t.source,ignoredEnvVar:t.ignoredEnvVar,ignoredReason:t.ignoredReason}}function Ke(n){return n.message}function ze(n){return n.source==="override"&&n.envVar?`via ${n.envVar}`:n.ignoredEnvVar&&n.ignoredReason==="empty"?`default; ignored empty ${n.ignoredEnvVar}`:"default"}function Qe(){b.clear()}function Je(n){let e=[n.kind,n.path,n.source,n.envVar??"",n.ignoredEnvVar??"",n.ignoredReason??""].join("\0"),t=b.get(e);if(t instanceof f)throw t;if(t===n.path)return t;try{return he(n.path,{recursive:!0}),Se(n.path,fe.W_OK),b.set(e,n.path),n.path}catch(r){let s=new f(n.kind,Oe(r)??n.path,l,r,void 0,{ignoredEnvVar:n.ignoredEnvVar,ignoredReason:n.ignoredReason});throw b.set(e,s),s}}function Ne(n,e,t={}){return[`context-mode ${n} directory is not writable: ${e}`,Ce(t),J()].filter(Boolean).join(`
|
|
3
|
+
`)}function Ce(n){return n.ignoredEnvVar&&n.ignoredReason==="empty"?`Ignored empty ${n.ignoredEnvVar}; using adapter default.`:null}function J(){return`Set ${l} to a writable absolute path.`}function Oe(n){if(!n||typeof n!="object")return null;let e=n.path;return typeof e=="string"&&e.length>0?e:null}var m;function h(n){let e=n.replace(/\\/g,"/");return/^\/+$/.test(e)?"/":/^[A-Za-z]:\/+$/.test(e)?`${e.slice(0,2)}/`:e.replace(/\/+$/,"")}function H(n){let e=n;try{e=Te.native(n)}catch{}let t=h(e);return process.platform==="win32"||process.platform==="darwin"?t.toLowerCase():t}function Z(n,e){return ye("git",["-C",n,...e],{encoding:"utf-8",timeout:2e3,stdio:["ignore","pipe","ignore"]}).trim()}function Ae(n){let e=Z(n,["rev-parse","--show-toplevel"]);return e.length>0?h(e):null}function we(n){let e=Z(n,["worktree","list","--porcelain"]).split(/\r?\n/).find(t=>t.startsWith("worktree "))?.replace("worktree ","")?.trim();return e?h(e):null}function xe(n=process.cwd()){let e=process.env.CONTEXT_MODE_SESSION_SUFFIX;if(m&&m.projectDir===n&&m.envSuffix===e)return m.suffix;let t="";if(e!==void 0)t=e?`__${e}`:"";else try{let r=Ae(n),s=we(n);if(r&&s){let a=H(r),i=H(s);a!==i&&(t=`__${S("sha256").update(a).digest("hex").slice(0,8)}`)}}catch{}return m={projectDir:n,envSuffix:e,suffix:t},t}function Ze(){m=void 0}function ee(n){return S("sha256").update(h(n)).digest("hex").slice(0,16)}function te(n){let e=h(n),t=process.platform==="darwin"||process.platform==="win32"?e.toLowerCase():e;return S("sha256").update(t).digest("hex").slice(0,16)}function et(n){let{projectDir:e,contentDir:t}=n,r=te(e),s=E(t,`${r}.db`);if(D(s))return s;let a=ee(e);if(a===r)return s;let i=E(t,`${a}.db`);if(D(i))try{I(i,s);for(let c of["-wal","-shm"])try{I(i+c,s+c)}catch{}}catch{}return s}function tt(n){return Ie({...n,ext:".db"})}function Ie(n){let{projectDir:e,sessionsDir:t,ext:r}=n,s=n.suffix??xe(e),a=te(e),i=E(t,`${a}${s}${r}`);if(D(i))return i;let c=ee(e);if(c===a)return i;let d=E(t,`${c}${s}${r}`);if(D(d))try{I(d,i)}catch{}return i}var W=1e3,X=5;function R(n){let e=Number(n);return!Number.isFinite(e)||e<=0?0:Math.floor(e)}var o={insertEvent:"insertEvent",getEvents:"getEvents",getEventsByType:"getEventsByType",getEventsByPriority:"getEventsByPriority",getEventsByTypeAndPriority:"getEventsByTypeAndPriority",getEventCount:"getEventCount",getLatestAttributedProject:"getLatestAttributedProject",checkDuplicate:"checkDuplicate",evictLowestPriority:"evictLowestPriority",updateMetaLastEvent:"updateMetaLastEvent",ensureSession:"ensureSession",getSessionStats:"getSessionStats",getSessionRollup:"getSessionRollup",getMaxFileEdits:"getMaxFileEdits",getLatestCommitMessage:"getLatestCommitMessage",incrementCompactCount:"incrementCompactCount",upsertResume:"upsertResume",getResume:"getResume",markResumeConsumed:"markResumeConsumed",claimLatestUnconsumedResume:"claimLatestUnconsumedResume",deleteEvents:"deleteEvents",deleteMeta:"deleteMeta",deleteResume:"deleteResume",getOldSessions:"getOldSessions",searchEvents:"searchEvents",incrementToolCall:"incrementToolCall",getToolCallTotals:"getToolCallTotals",getToolCallByTool:"getToolCallByTool",getEventBytesSummary:"getEventBytesSummary"},Me=[["project_dir","TEXT NOT NULL DEFAULT ''"],["attribution_source","TEXT NOT NULL DEFAULT 'unknown'"],["attribution_confidence","REAL NOT NULL DEFAULT 0"],["bytes_avoided","INTEGER NOT NULL DEFAULT 0"],["bytes_returned","INTEGER NOT NULL DEFAULT 0"]];function ne(n){let e=n.pragma("table_xinfo(session_events)"),t=new Set(e.map(s=>s.name)),r=!1;for(let[s,a]of Me)t.has(s)||(n.exec(`ALTER TABLE session_events ADD COLUMN ${s} ${a}`),r=!0);return r&&n.exec("CREATE INDEX IF NOT EXISTS idx_session_events_project ON session_events(session_id, project_dir)"),r}function nt(n,e){let t=null;try{t=new e(n),ne(t)}catch{}finally{try{t?.close()}catch{}}}var $=class extends v{constructor(e){super(e?.dbPath??B("session"))}stmt(e){return this.stmts.get(e)}initSchema(){try{let t=this.db.pragma("table_xinfo(session_events)").find(r=>r.name==="data_hash");t&&t.hidden!==0&&this.db.exec("DROP TABLE session_events")}catch{}this.db.exec(`
|
|
4
4
|
CREATE TABLE IF NOT EXISTS session_events (
|
|
5
5
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
6
6
|
session_id TEXT NOT NULL,
|
|
@@ -92,7 +92,7 @@ import{createRequire as oe}from"node:module";import{existsSync as ie,unlinkSync
|
|
|
92
92
|
COALESCE(SUM(CASE WHEN category = 'error' THEN 1 ELSE 0 END), 0) AS errors,
|
|
93
93
|
COUNT(DISTINCT type) AS unique_tools,
|
|
94
94
|
COUNT(DISTINCT CASE WHEN category = 'file' THEN data END) AS unique_files,
|
|
95
|
-
CASE WHEN SUM(CASE WHEN
|
|
95
|
+
CASE WHEN SUM(CASE WHEN type = 'git_commit' THEN 1 ELSE 0 END) > 0 THEN 1 ELSE 0 END AS has_commit,
|
|
96
96
|
CAST(COALESCE((MAX(strftime('%s', created_at)) - MIN(strftime('%s', created_at))) / 60.0, 0) AS INTEGER) AS duration_min,
|
|
97
97
|
COALESCE(SUM(CASE WHEN type = 'external_ref' THEN 1 ELSE 0 END), 0) AS sources_indexed,
|
|
98
98
|
CAST(COALESCE(SUM(bytes_avoided) / 1024.0, 0) AS INTEGER) AS total_chunks,
|
|
@@ -104,7 +104,11 @@ import{createRequire as oe}from"node:module";import{existsSync as ie,unlinkSync
|
|
|
104
104
|
FROM session_events
|
|
105
105
|
WHERE session_id = ? AND category = 'file' AND type IN ('file_edit', 'file_write')
|
|
106
106
|
GROUP BY data
|
|
107
|
-
)`),e(o.
|
|
107
|
+
)`),e(o.getLatestCommitMessage,`SELECT data
|
|
108
|
+
FROM session_events
|
|
109
|
+
WHERE session_id = ? AND type = 'git_commit'
|
|
110
|
+
ORDER BY id DESC
|
|
111
|
+
LIMIT 1`),e(o.incrementCompactCount,"UPDATE session_meta SET compact_count = compact_count + 1 WHERE session_id = ?"),e(o.upsertResume,`INSERT INTO session_resume (session_id, snapshot, event_count)
|
|
108
112
|
VALUES (?, ?, ?)
|
|
109
113
|
ON CONFLICT(session_id) DO UPDATE SET
|
|
110
114
|
snapshot = excluded.snapshot,
|
|
@@ -135,6 +139,6 @@ import{createRequire as oe}from"node:module";import{existsSync as ie,unlinkSync
|
|
|
135
139
|
FROM tool_calls WHERE session_id = ?`),e(o.getToolCallByTool,`SELECT tool, calls, bytes_returned
|
|
136
140
|
FROM tool_calls WHERE session_id = ? ORDER BY calls DESC`),e(o.getEventBytesSummary,`SELECT COALESCE(SUM(bytes_avoided), 0) AS bytes_avoided,
|
|
137
141
|
COALESCE(SUM(bytes_returned), 0) AS bytes_returned
|
|
138
|
-
FROM session_events WHERE session_id = ?`)}insertEvent(e,t,r="PostToolUse",s,a){let i=S("sha256").update(t.data).digest("hex").slice(0,16).toUpperCase(),c=String(s?.projectDir??t.project_dir??this._getSessionProjectDir(e)).trim(),d=String(s?.source??t.attribution_source??"unknown"),u=Number(s?.confidence??t.attribution_confidence??0),T=Number.isFinite(u)?Math.max(0,Math.min(1,u)):0,p=R(a?.bytesAvoided),
|
|
142
|
+
FROM session_events WHERE session_id = ?`)}insertEvent(e,t,r="PostToolUse",s,a){let i=S("sha256").update(t.data).digest("hex").slice(0,16).toUpperCase(),c=String(s?.projectDir??t.project_dir??this._getSessionProjectDir(e)).trim(),d=String(s?.source??t.attribution_source??"unknown"),u=Number(s?.confidence??t.attribution_confidence??0),T=Number.isFinite(u)?Math.max(0,Math.min(1,u)):0,p=R(a?.bytesAvoided),L=R(a?.bytesReturned),N=this.db.transaction(()=>{if(this.stmt(o.checkDuplicate).get(e,X,t.type,i))return;this.stmt(o.getEventCount).get(e).cnt>=W&&this.stmt(o.evictLowestPriority).run(e),this.stmt(o.insertEvent).run(e,t.type,t.category,t.priority,t.data,c,d,T,p,L,r,i),this.stmt(o.updateMetaLastEvent).run(e)});this.withRetry(()=>N())}bulkInsertEvents(e,t,r="PostToolUse",s,a){if(!t||t.length===0)return;if(t.length===1){this.insertEvent(e,t[0],r,s?.[0],a?.[0]);return}let i=t.map((d,u)=>{let T=S("sha256").update(d.data).digest("hex").slice(0,16).toUpperCase(),p=s?.[u],L=String(p?.projectDir??d.project_dir??this._getSessionProjectDir(e)??"").trim(),N=String(p?.source??d.attribution_source??"unknown"),C=Number(p?.confidence??d.attribution_confidence??0),M=Number.isFinite(C)?Math.max(0,Math.min(1,C)):0,U=a?.[u],re=R(U?.bytesAvoided),se=R(U?.bytesReturned);return{event:d,dataHash:T,projectDir:L,attributionSource:N,attributionConfidence:M,bytesAvoided:re,bytesReturned:se}}),c=this.db.transaction(()=>{let d=this.stmt(o.getEventCount).get(e).cnt;for(let u of i)this.stmt(o.checkDuplicate).get(e,X,u.event.type,u.dataHash)||(d>=W?this.stmt(o.evictLowestPriority).run(e):d++,this.stmt(o.insertEvent).run(e,u.event.type,u.event.category,u.event.priority,u.event.data,u.projectDir,u.attributionSource,u.attributionConfidence,u.bytesAvoided,u.bytesReturned,r,u.dataHash));this.stmt(o.updateMetaLastEvent).run(e)});this.withRetry(()=>c())}getEvents(e,t){let r=t?.limit??1e3,s=t?.type,a=t?.minPriority;return s&&a!==void 0?this.stmt(o.getEventsByTypeAndPriority).all(e,s,a,r):s?this.stmt(o.getEventsByType).all(e,s,r):a!==void 0?this.stmt(o.getEventsByPriority).all(e,a,r):this.stmt(o.getEvents).all(e,r)}getEventCount(e){return this.stmt(o.getEventCount).get(e).cnt}getEventBytesSummary(e){let t=this.stmt(o.getEventBytesSummary).get(e);return{bytesAvoided:Number(t?.bytes_avoided??0),bytesReturned:Number(t?.bytes_returned??0)}}getLatestAttributedProjectDir(e){return this.stmt(o.getLatestAttributedProject).get(e)?.project_dir||null}_getSessionProjectDir(e){try{return this.db.prepare("SELECT project_dir FROM session_meta WHERE session_id = ?").get(e)?.project_dir||""}catch{return""}}searchEvents(e,t,r,s){try{let a=e.replace(/[%_]/g,c=>"\\"+c),i=s??null;return this.stmt(o.searchEvents).all(r,a,a,i,i,t)}catch{return[]}}getSessionIdsForProject(e){try{return this.db.prepare(`SELECT DISTINCT session_id
|
|
139
143
|
FROM session_events
|
|
140
|
-
WHERE project_dir = ?`).all(e).map(r=>r.session_id)}catch{return[]}}ensureSession(e,t){this.stmt(o.ensureSession).run(e,t)}getSessionStats(e){return this.stmt(o.getSessionStats).get(e)??null}getSessionRollup(e){let t=this.stmt(o.getSessionRollup).get(e),r=this.stmt(o.getMaxFileEdits).get(e),s=this.
|
|
144
|
+
WHERE project_dir = ?`).all(e).map(r=>r.session_id)}catch{return[]}}ensureSession(e,t){this.stmt(o.ensureSession).run(e,t)}getSessionStats(e){return this.stmt(o.getSessionStats).get(e)??null}getSessionRollup(e){let t=this.stmt(o.getSessionRollup).get(e),r=this.stmt(o.getMaxFileEdits).get(e),s=this.stmt(o.getLatestCommitMessage).get(e),a=this.getSessionStats(e),i=(t?.tool_calls??0)>0?t?.unique_files??0:0,c=t?.errors??0,d=Math.min(i,c);return{tool_calls:t?.tool_calls??0,errors:t?.errors??0,unique_tools:t?.unique_tools??0,unique_files:t?.unique_files??0,max_file_edits:r?.max_file_edits??0,has_commit:t?.has_commit??0,commit_message:s?.data??"",edit_test_cycles:d,duration_min:t?.duration_min??0,compact_count:a?.compact_count??0,sources_indexed:t?.sources_indexed??0,total_chunks:t?.total_chunks??0,search_queries:t?.search_queries??0}}incrementCompactCount(e){this.stmt(o.incrementCompactCount).run(e)}upsertResume(e,t,r){this.stmt(o.upsertResume).run(e,t,r??0)}getResume(e){return this.stmt(o.getResume).get(e)??null}markResumeConsumed(e){this.stmt(o.markResumeConsumed).run(e)}claimLatestUnconsumedResume(e){let t=this.stmt(o.claimLatestUnconsumedResume).get(e);return t?{sessionId:t.session_id,snapshot:t.snapshot}:null}getLatestSessionId(){try{return this.db.prepare("SELECT session_id FROM session_meta ORDER BY started_at DESC LIMIT 1").get()?.session_id??null}catch{return null}}incrementToolCall(e,t,r=0){let s=Number.isFinite(r)&&r>0?Math.round(r):0;try{this.stmt(o.incrementToolCall).run(e,t,s)}catch{}}getToolCallStats(e){try{let t=this.stmt(o.getToolCallTotals).get(e),r=this.stmt(o.getToolCallByTool).all(e),s={};for(let a of r)s[a.tool]={calls:a.calls,bytesReturned:a.bytes_returned};return{totalCalls:t?.calls??0,totalBytesReturned:t?.bytes_returned??0,byTool:s}}catch{return{totalCalls:0,totalBytesReturned:0,byTool:{}}}}deleteSession(e){this.db.transaction(()=>{this.stmt(o.deleteEvents).run(e),this.stmt(o.deleteResume).run(e),this.stmt(o.deleteMeta).run(e)})()}cleanupOldSessions(e=7){let t=`-${e}`,r=this.stmt(o.getOldSessions).all(t);for(let{session_id:s}of r)this.deleteSession(s);return r.length}pruneOrphanedEvents(){let e=this.db.prepare("DELETE FROM session_events WHERE session_id NOT IN (SELECT session_id FROM session_meta)").run();return Number(e.changes??0)}};export{$ as SessionDB,f as StorageDirectoryError,Ze as _resetWorktreeSuffixCacheForTests,ne as applyMissingSessionEventsColumns,Qe as clearStorageDirectoryCheckCacheForTests,ze as describeStorageDirectorySource,nt as ensureSessionEventsSchema,Je as ensureWritableStorageDir,Ke as formatStorageDirectoryError,xe as getWorktreeSuffix,te as hashProjectDirCanonical,ee as hashProjectDirLegacy,h as normalizeWorktreePath,Ge as resolveContentStorageDir,et as resolveContentStorePath,qe as resolveDefaultSessionDir,tt as resolveSessionDbPath,Ie as resolveSessionPath,Q as resolveSessionStorageDir,Ye as resolveStatsStorageDir};
|