craby-gateway 0.31.5 → 0.31.6

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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`node:crypto`),u=require(`node:fs`);u=c(u);let d=require(`node:fs/promises`);d=c(d);let f=require(`node:os`);f=c(f);let p=require(`node:path`);p=c(p);let m=require(`module`),h=require(`node:child_process`),g=require(`node:module`),_=require(`node:url`),v=require(`node:readline`);v=c(v);let y=require(`node:process`);y=c(y);let b=require(`node:util`),x=require(`node:http`),S=require(`node:https`),C=require(`node:stream/promises`),w=require(`path`);w=c(w);let T=require(`node:string_decoder`),E=require(`net`),D=require(`child_process`),O=require(`@anthropic-ai/claude-agent-sdk`),k=require(`node:perf_hooks`);var A={name:`@remote-agent/desktop-gateway`,private:!0,version:`0.31.5`,description:`Craby desktop gateway CLI`,type:`module`,bin:{"craby-gateway":`dist-sea/gateway.cjs`},files:[`dist-sea`,`README.md`],publishConfig:{access:`public`,registry:`https://registry.npmjs.org/`},engines:{node:`>=20`},repository:{type:`git`,url:`git+https://github.com/wuyongzhi/anycoding.git`,directory:`apps/desktop-gateway`},scripts:{dev:`GATEWAY_PORT=18787 GATEWAY_HTTPS_PORT=18787 GATEWAY_AUDIT_LOG_PATH=./logs/audit.log GATEWAY_LOG_PATH=./logs/gateway.log GATEWAY_SESSION_HISTORY_DIR=./logs/sessions-v2 GATEWAY_PROJECT_STORE_DIR=./logs/projects GATEWAY_AUTH_STORE_DIR=./logs/auth tsx watch src/index.ts --config ./logs/gateway.dev.yaml`,build:`tsup src/index.ts --format esm --dts`,"build:workspace-deps":`pnpm --filter @remote-agent/contracts run build && pnpm --filter @remote-agent/provider-adapters run build`,"build:bundle":`pnpm run build:workspace-deps && tsdown --config tsdown.config.ts`,"build:npm":`pnpm run build:bundle && node ./scripts/preparePublishPackage.mjs`,"start:bundle":`node dist-sea/gateway.cjs`,"build:blob:darwin":`pnpm run build:bundle && node --experimental-sea-config sea-config.darwin.json`,"build:blob:linux":`pnpm run build:bundle && node --experimental-sea-config sea-config.linux.json`,"build:blob:win32":`pnpm run build:bundle && node --experimental-sea-config sea-config.win32.json`,"build:bin":`pnpm run build:bin:current`,"build:bin:current":`pnpm run build:bundle && node ./scripts/buildSea.mjs`,"build:bin:darwin":`pnpm run build:bundle && node ./scripts/buildSea.mjs darwin`,"build:bin:linux":`pnpm run build:bundle && node ./scripts/buildSea.mjs linux`,"build:bin:win32":`pnpm run build:bundle && node ./scripts/buildSea.mjs win32`,test:`vitest run --passWithNoTests`,typecheck:`tsc -p tsconfig.json --noEmit`,"dump:codex-history":`tsx src/dumpCodexSessionHistory.ts`,"export:codex-project-history":`tsx src/exportCodexProjectHistory.ts`,"mobile:ios-ota:publish":`tsx src/mobileIosOtaInstall.ts`,"pairing:start":`tsx src/pairingStart.ts`,"pack:check":`pnpm run build:npm && npm pack --dry-run ./dist-npm --userconfig ../../.npmrc`,"publish:npm":`pnpm run build:npm && npm publish ./dist-npm --access public --userconfig ../../.npmrc`},dependencies:{"@anthropic-ai/claude-agent-sdk":`^0.2.118`,"@fastify/compress":`^8.3.1`,"@fastify/cors":`^10.0.2`,"@fastify/websocket":`^11.0.2`,diff:`^7.0.0`,fastify:`^5.2.1`,jsonwebtoken:`^9.0.2`,nanoid:`^5.1.5`,pino:`^10.3.1`,"qrcode-terminal":`^0.12.0`,ws:`^8.18.3`,yaml:`^2.8.2`},devDependencies:{"@remote-agent/contracts":`workspace:*`,"@remote-agent/provider-adapters":`workspace:*`,"@types/diff":`^7.0.1`,"@types/jsonwebtoken":`^9.0.9`,"@types/qrcode-terminal":`^0.12.2`,"@types/ws":`^8.5.13`,postject:`^1.0.0-alpha.6`,tsdown:`^0.21.0`}};const j=/(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/;function M(e){let t=e.match(j);return t?t[0]:null}function N(e){return typeof e==`string`?M(e):null}function P(e,t){let n=I(e),r=I(t);if(!n||!r)throw Error(`Invalid version comparison: ${e} vs ${t}`);return n.major===r.major?n.minor===r.minor?n.patch===r.patch?n.prerelease===r.prerelease?0:n.prerelease?r.prerelease?n.prerelease.localeCompare(r.prerelease):-1:1:n.patch-r.patch:n.minor-r.minor:n.major-r.major}function F(e,t){return P(e,t)>=0}function I(e){let t=e.match(j);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:typeof t[4]==`string`?t[4]:null}:null}const ee=A,L=ee.dependencies??{};function R(e){return L[e]??``}const z={packageName:`craby-gateway`,cliName:`craby-gateway`,version:ee.version??`0.0.0`,providerRequirements:[{id:`codex`,dependencyName:null,dependencyRange:``,minimumVersion:null,systemCommand:`codex`,versionArgs:[`--version`],systemCommandRequired:!0,displayName:`Codex`},{id:`claude`,dependencyName:`@anthropic-ai/claude-agent-sdk`,dependencyRange:R(`@anthropic-ai/claude-agent-sdk`),minimumVersion:N(R(`@anthropic-ai/claude-agent-sdk`)),systemCommand:`claude`,versionArgs:[`--version`],systemCommandRequired:!1,displayName:`Claude Code`}]};function B(e){let t=`start`,n,r=!1,i=!1,a=[...e],o=a[0]?.trim();if(o&&!o.startsWith(`-`))if(o===`start`||o===`init`||o===`doctor`||o===`help`||o===`__worker`)t=o,a.shift();else throw Error(`Unknown command: ${o}`);for(let e=0;e<a.length;e+=1){let o=a[e];if(o===`--config`){n=V(o,a[e+1]),e+=1;continue}if(o===`--force`){r=!0;continue}if(o===`--log`){i=!0;continue}if(o===`--help`||o===`-h`){t=`help`;continue}if(o===`--version`||o===`-v`){t=`version`;continue}throw Error(`Unknown argument: ${o}`)}return{command:t,configPath:n,force:r,logToConsole:i}}function V(e,t){let n=t?.trim();if(!n)throw Error(`${e} requires a value`);return n}var H=o((e=>{let t=Symbol.for(`yaml.alias`),n=Symbol.for(`yaml.document`),r=Symbol.for(`yaml.map`),i=Symbol.for(`yaml.pair`),a=Symbol.for(`yaml.scalar`),o=Symbol.for(`yaml.seq`),s=Symbol.for(`yaml.node.type`),c=e=>!!e&&typeof e==`object`&&e[s]===t,l=e=>!!e&&typeof e==`object`&&e[s]===n,u=e=>!!e&&typeof e==`object`&&e[s]===r,d=e=>!!e&&typeof e==`object`&&e[s]===i,f=e=>!!e&&typeof e==`object`&&e[s]===a,p=e=>!!e&&typeof e==`object`&&e[s]===o;function m(e){if(e&&typeof e==`object`)switch(e[s]){case r:case o:return!0}return!1}function h(e){if(e&&typeof e==`object`)switch(e[s]){case t:case r:case a:case o:return!0}return!1}e.ALIAS=t,e.DOC=n,e.MAP=r,e.NODE_TYPE=s,e.PAIR=i,e.SCALAR=a,e.SEQ=o,e.hasAnchor=e=>(f(e)||m(e))&&!!e.anchor,e.isAlias=c,e.isCollection=m,e.isDocument=l,e.isMap=u,e.isNode=h,e.isPair=d,e.isScalar=f,e.isSeq=p})),U=o((e=>{var t=H();let n=Symbol(`break visit`),r=Symbol(`skip children`),i=Symbol(`remove node`);function a(e,n){let r=l(n);t.isDocument(e)?o(null,e.contents,r,Object.freeze([e]))===i&&(e.contents=null):o(null,e,r,Object.freeze([]))}a.BREAK=n,a.SKIP=r,a.REMOVE=i;function o(e,r,a,s){let c=u(e,r,a,s);if(t.isNode(c)||t.isPair(c))return d(e,s,c),o(e,c,a,s);if(typeof c!=`symbol`){if(t.isCollection(r)){s=Object.freeze(s.concat(r));for(let e=0;e<r.items.length;++e){let t=o(e,r.items[e],a,s);if(typeof t==`number`)e=t-1;else if(t===n)return n;else t===i&&(r.items.splice(e,1),--e)}}else if(t.isPair(r)){s=Object.freeze(s.concat(r));let e=o(`key`,r.key,a,s);if(e===n)return n;e===i&&(r.key=null);let t=o(`value`,r.value,a,s);if(t===n)return n;t===i&&(r.value=null)}}return c}async function s(e,n){let r=l(n);t.isDocument(e)?await c(null,e.contents,r,Object.freeze([e]))===i&&(e.contents=null):await c(null,e,r,Object.freeze([]))}s.BREAK=n,s.SKIP=r,s.REMOVE=i;async function c(e,r,a,o){let s=await u(e,r,a,o);if(t.isNode(s)||t.isPair(s))return d(e,o,s),c(e,s,a,o);if(typeof s!=`symbol`){if(t.isCollection(r)){o=Object.freeze(o.concat(r));for(let e=0;e<r.items.length;++e){let t=await c(e,r.items[e],a,o);if(typeof t==`number`)e=t-1;else if(t===n)return n;else t===i&&(r.items.splice(e,1),--e)}}else if(t.isPair(r)){o=Object.freeze(o.concat(r));let e=await c(`key`,r.key,a,o);if(e===n)return n;e===i&&(r.key=null);let t=await c(`value`,r.value,a,o);if(t===n)return n;t===i&&(r.value=null)}}return s}function l(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function u(e,n,r,i){if(typeof r==`function`)return r(e,n,i);if(t.isMap(n))return r.Map?.(e,n,i);if(t.isSeq(n))return r.Seq?.(e,n,i);if(t.isPair(n))return r.Pair?.(e,n,i);if(t.isScalar(n))return r.Scalar?.(e,n,i);if(t.isAlias(n))return r.Alias?.(e,n,i)}function d(e,n,r){let i=n[n.length-1];if(t.isCollection(i))i.items[e]=r;else if(t.isPair(i))e===`key`?i.key=r:i.value=r;else if(t.isDocument(i))i.contents=r;else{let e=t.isAlias(i)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}e.visit=a,e.visitAsync=s})),te=o((e=>{var t=H(),n=U();let r={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},i=e=>e.replace(/[!,[\]{}]/g,e=>r[e]);var a=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+i(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let r=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],i=Object.entries(this.tags),a;if(e&&i.length>0&&t.isNode(e.contents)){let r={};n.visit(e.contents,(e,n)=>{t.isNode(n)&&n.tag&&(r[n.tag]=!0)}),a=Object.keys(r)}else a=[];for(let[t,n]of i)t===`!!`&&n===`tag:yaml.org,2002:`||(!e||a.some(e=>e.startsWith(n)))&&r.push(`%TAG ${t} ${n}`);return r.join(`
2
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`node:crypto`),u=require(`node:fs`);u=c(u);let d=require(`node:fs/promises`);d=c(d);let f=require(`node:os`);f=c(f);let p=require(`node:path`);p=c(p);let m=require(`module`),h=require(`node:child_process`),g=require(`node:module`),_=require(`node:url`),v=require(`node:readline`);v=c(v);let y=require(`node:process`);y=c(y);let b=require(`node:util`),x=require(`node:http`),S=require(`node:https`),C=require(`node:stream/promises`),w=require(`path`);w=c(w);let T=require(`node:string_decoder`),E=require(`net`),D=require(`child_process`),O=require(`@anthropic-ai/claude-agent-sdk`),k=require(`node:perf_hooks`);var A={name:`@remote-agent/desktop-gateway`,private:!0,version:`0.31.6`,description:`Craby desktop gateway CLI`,type:`module`,bin:{"craby-gateway":`dist-sea/gateway.cjs`},files:[`dist-sea`,`README.md`],publishConfig:{access:`public`,registry:`https://registry.npmjs.org/`},engines:{node:`>=20`},repository:{type:`git`,url:`git+https://github.com/wuyongzhi/anycoding.git`,directory:`apps/desktop-gateway`},scripts:{dev:`GATEWAY_PORT=18787 GATEWAY_HTTPS_PORT=18787 GATEWAY_AUDIT_LOG_PATH=./logs/audit.log GATEWAY_LOG_PATH=./logs/gateway.log GATEWAY_SESSION_HISTORY_DIR=./logs/sessions-v2 GATEWAY_PROJECT_STORE_DIR=./logs/projects GATEWAY_AUTH_STORE_DIR=./logs/auth tsx watch src/index.ts --config ./logs/gateway.dev.yaml`,build:`tsup src/index.ts --format esm --dts`,"build:workspace-deps":`pnpm --filter @remote-agent/contracts run build && pnpm --filter @remote-agent/provider-adapters run build`,"build:bundle":`pnpm run build:workspace-deps && tsdown --config tsdown.config.ts`,"build:npm":`pnpm run build:bundle && node ./scripts/preparePublishPackage.mjs`,"start:bundle":`node dist-sea/gateway.cjs`,"build:blob:darwin":`pnpm run build:bundle && node --experimental-sea-config sea-config.darwin.json`,"build:blob:linux":`pnpm run build:bundle && node --experimental-sea-config sea-config.linux.json`,"build:blob:win32":`pnpm run build:bundle && node --experimental-sea-config sea-config.win32.json`,"build:bin":`pnpm run build:bin:current`,"build:bin:current":`pnpm run build:bundle && node ./scripts/buildSea.mjs`,"build:bin:darwin":`pnpm run build:bundle && node ./scripts/buildSea.mjs darwin`,"build:bin:linux":`pnpm run build:bundle && node ./scripts/buildSea.mjs linux`,"build:bin:win32":`pnpm run build:bundle && node ./scripts/buildSea.mjs win32`,test:`vitest run --passWithNoTests`,typecheck:`tsc -p tsconfig.json --noEmit`,"dump:codex-history":`tsx src/dumpCodexSessionHistory.ts`,"export:codex-project-history":`tsx src/exportCodexProjectHistory.ts`,"mobile:ios-ota:publish":`tsx src/mobileIosOtaInstall.ts`,"pairing:start":`tsx src/pairingStart.ts`,"pack:check":`pnpm run build:npm && npm pack --dry-run ./dist-npm --userconfig ../../.npmrc`,"publish:npm":`pnpm run build:npm && npm publish ./dist-npm --access public --userconfig ../../.npmrc`},dependencies:{"@anthropic-ai/claude-agent-sdk":`^0.2.118`,"@fastify/compress":`^8.3.1`,"@fastify/cors":`^10.0.2`,"@fastify/websocket":`^11.0.2`,diff:`^7.0.0`,fastify:`^5.2.1`,jsonwebtoken:`^9.0.2`,nanoid:`^5.1.5`,pino:`^10.3.1`,"qrcode-terminal":`^0.12.0`,ws:`^8.18.3`,yaml:`^2.8.2`},devDependencies:{"@remote-agent/contracts":`workspace:*`,"@remote-agent/provider-adapters":`workspace:*`,"@types/diff":`^7.0.1`,"@types/jsonwebtoken":`^9.0.9`,"@types/qrcode-terminal":`^0.12.2`,"@types/ws":`^8.5.13`,postject:`^1.0.0-alpha.6`,tsdown:`^0.21.0`}};const j=/(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/;function M(e){let t=e.match(j);return t?t[0]:null}function N(e){return typeof e==`string`?M(e):null}function P(e,t){let n=I(e),r=I(t);if(!n||!r)throw Error(`Invalid version comparison: ${e} vs ${t}`);return n.major===r.major?n.minor===r.minor?n.patch===r.patch?n.prerelease===r.prerelease?0:n.prerelease?r.prerelease?n.prerelease.localeCompare(r.prerelease):-1:1:n.patch-r.patch:n.minor-r.minor:n.major-r.major}function F(e,t){return P(e,t)>=0}function I(e){let t=e.match(j);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:typeof t[4]==`string`?t[4]:null}:null}const ee=A,L=ee.dependencies??{};function R(e){return L[e]??``}const z={packageName:`craby-gateway`,cliName:`craby-gateway`,version:ee.version??`0.0.0`,providerRequirements:[{id:`codex`,dependencyName:null,dependencyRange:``,minimumVersion:null,systemCommand:`codex`,versionArgs:[`--version`],systemCommandRequired:!0,displayName:`Codex`},{id:`claude`,dependencyName:`@anthropic-ai/claude-agent-sdk`,dependencyRange:R(`@anthropic-ai/claude-agent-sdk`),minimumVersion:N(R(`@anthropic-ai/claude-agent-sdk`)),systemCommand:`claude`,versionArgs:[`--version`],systemCommandRequired:!1,displayName:`Claude Code`}]};function B(e){let t=`start`,n,r=!1,i=!1,a=[...e],o=a[0]?.trim();if(o&&!o.startsWith(`-`))if(o===`start`||o===`init`||o===`doctor`||o===`help`||o===`__worker`)t=o,a.shift();else throw Error(`Unknown command: ${o}`);for(let e=0;e<a.length;e+=1){let o=a[e];if(o===`--config`){n=V(o,a[e+1]),e+=1;continue}if(o===`--force`){r=!0;continue}if(o===`--log`){i=!0;continue}if(o===`--help`||o===`-h`){t=`help`;continue}if(o===`--version`||o===`-v`){t=`version`;continue}throw Error(`Unknown argument: ${o}`)}return{command:t,configPath:n,force:r,logToConsole:i}}function V(e,t){let n=t?.trim();if(!n)throw Error(`${e} requires a value`);return n}var H=o((e=>{let t=Symbol.for(`yaml.alias`),n=Symbol.for(`yaml.document`),r=Symbol.for(`yaml.map`),i=Symbol.for(`yaml.pair`),a=Symbol.for(`yaml.scalar`),o=Symbol.for(`yaml.seq`),s=Symbol.for(`yaml.node.type`),c=e=>!!e&&typeof e==`object`&&e[s]===t,l=e=>!!e&&typeof e==`object`&&e[s]===n,u=e=>!!e&&typeof e==`object`&&e[s]===r,d=e=>!!e&&typeof e==`object`&&e[s]===i,f=e=>!!e&&typeof e==`object`&&e[s]===a,p=e=>!!e&&typeof e==`object`&&e[s]===o;function m(e){if(e&&typeof e==`object`)switch(e[s]){case r:case o:return!0}return!1}function h(e){if(e&&typeof e==`object`)switch(e[s]){case t:case r:case a:case o:return!0}return!1}e.ALIAS=t,e.DOC=n,e.MAP=r,e.NODE_TYPE=s,e.PAIR=i,e.SCALAR=a,e.SEQ=o,e.hasAnchor=e=>(f(e)||m(e))&&!!e.anchor,e.isAlias=c,e.isCollection=m,e.isDocument=l,e.isMap=u,e.isNode=h,e.isPair=d,e.isScalar=f,e.isSeq=p})),U=o((e=>{var t=H();let n=Symbol(`break visit`),r=Symbol(`skip children`),i=Symbol(`remove node`);function a(e,n){let r=l(n);t.isDocument(e)?o(null,e.contents,r,Object.freeze([e]))===i&&(e.contents=null):o(null,e,r,Object.freeze([]))}a.BREAK=n,a.SKIP=r,a.REMOVE=i;function o(e,r,a,s){let c=u(e,r,a,s);if(t.isNode(c)||t.isPair(c))return d(e,s,c),o(e,c,a,s);if(typeof c!=`symbol`){if(t.isCollection(r)){s=Object.freeze(s.concat(r));for(let e=0;e<r.items.length;++e){let t=o(e,r.items[e],a,s);if(typeof t==`number`)e=t-1;else if(t===n)return n;else t===i&&(r.items.splice(e,1),--e)}}else if(t.isPair(r)){s=Object.freeze(s.concat(r));let e=o(`key`,r.key,a,s);if(e===n)return n;e===i&&(r.key=null);let t=o(`value`,r.value,a,s);if(t===n)return n;t===i&&(r.value=null)}}return c}async function s(e,n){let r=l(n);t.isDocument(e)?await c(null,e.contents,r,Object.freeze([e]))===i&&(e.contents=null):await c(null,e,r,Object.freeze([]))}s.BREAK=n,s.SKIP=r,s.REMOVE=i;async function c(e,r,a,o){let s=await u(e,r,a,o);if(t.isNode(s)||t.isPair(s))return d(e,o,s),c(e,s,a,o);if(typeof s!=`symbol`){if(t.isCollection(r)){o=Object.freeze(o.concat(r));for(let e=0;e<r.items.length;++e){let t=await c(e,r.items[e],a,o);if(typeof t==`number`)e=t-1;else if(t===n)return n;else t===i&&(r.items.splice(e,1),--e)}}else if(t.isPair(r)){o=Object.freeze(o.concat(r));let e=await c(`key`,r.key,a,o);if(e===n)return n;e===i&&(r.key=null);let t=await c(`value`,r.value,a,o);if(t===n)return n;t===i&&(r.value=null)}}return s}function l(e){return typeof e==`object`&&(e.Collection||e.Node||e.Value)?Object.assign({Alias:e.Node,Map:e.Node,Scalar:e.Node,Seq:e.Node},e.Value&&{Map:e.Value,Scalar:e.Value,Seq:e.Value},e.Collection&&{Map:e.Collection,Seq:e.Collection},e):e}function u(e,n,r,i){if(typeof r==`function`)return r(e,n,i);if(t.isMap(n))return r.Map?.(e,n,i);if(t.isSeq(n))return r.Seq?.(e,n,i);if(t.isPair(n))return r.Pair?.(e,n,i);if(t.isScalar(n))return r.Scalar?.(e,n,i);if(t.isAlias(n))return r.Alias?.(e,n,i)}function d(e,n,r){let i=n[n.length-1];if(t.isCollection(i))i.items[e]=r;else if(t.isPair(i))e===`key`?i.key=r:i.value=r;else if(t.isDocument(i))i.contents=r;else{let e=t.isAlias(i)?`alias`:`scalar`;throw Error(`Cannot replace node with ${e} parent`)}}e.visit=a,e.visitAsync=s})),te=o((e=>{var t=H(),n=U();let r={"!":`%21`,",":`%2C`,"[":`%5B`,"]":`%5D`,"{":`%7B`,"}":`%7D`},i=e=>e.replace(/[!,[\]{}]/g,e=>r[e]);var a=class e{constructor(t,n){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},e.defaultYaml,t),this.tags=Object.assign({},e.defaultTags,n)}clone(){let t=new e(this.yaml,this.tags);return t.docStart=this.docStart,t}atDocument(){let t=new e(this.yaml,this.tags);switch(this.yaml.version){case`1.1`:this.atNextDocument=!0;break;case`1.2`:this.atNextDocument=!1,this.yaml={explicit:e.defaultYaml.explicit,version:`1.2`},this.tags=Object.assign({},e.defaultTags);break}return t}add(t,n){this.atNextDocument&&=(this.yaml={explicit:e.defaultYaml.explicit,version:`1.1`},this.tags=Object.assign({},e.defaultTags),!1);let r=t.trim().split(/[ \t]+/),i=r.shift();switch(i){case`%TAG`:{if(r.length!==2&&(n(0,`%TAG directive should contain exactly two parts`),r.length<2))return!1;let[e,t]=r;return this.tags[e]=t,!0}case`%YAML`:{if(this.yaml.explicit=!0,r.length!==1)return n(0,`%YAML directive should contain exactly one part`),!1;let[e]=r;if(e===`1.1`||e===`1.2`)return this.yaml.version=e,!0;{let t=/^\d+\.\d+$/.test(e);return n(6,`Unsupported YAML version ${e}`,t),!1}}default:return n(0,`Unknown directive ${i}`,!0),!1}}tagName(e,t){if(e===`!`)return`!`;if(e[0]!==`!`)return t(`Not a valid tag: ${e}`),null;if(e[1]===`<`){let n=e.slice(2,-1);return n===`!`||n===`!!`?(t(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==`>`&&t(`Verbatim tags must end with a >`),n)}let[,n,r]=e.match(/^(.*!)([^!]*)$/s);r||t(`The ${e} tag has no suffix`);let i=this.tags[n];if(i)try{return i+decodeURIComponent(r)}catch(e){return t(String(e)),null}return n===`!`?e:(t(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[t,n]of Object.entries(this.tags))if(e.startsWith(n))return t+i(e.substring(n.length));return e[0]===`!`?e:`!<${e}>`}toString(e){let r=this.yaml.explicit?[`%YAML ${this.yaml.version||`1.2`}`]:[],i=Object.entries(this.tags),a;if(e&&i.length>0&&t.isNode(e.contents)){let r={};n.visit(e.contents,(e,n)=>{t.isNode(n)&&n.tag&&(r[n.tag]=!0)}),a=Object.keys(r)}else a=[];for(let[t,n]of i)t===`!!`&&n===`tag:yaml.org,2002:`||(!e||a.some(e=>e.startsWith(n)))&&r.push(`%TAG ${t} ${n}`);return r.join(`
3
3
  `)}};a.defaultYaml={explicit:!1,version:`1.2`},a.defaultTags={"!!":`tag:yaml.org,2002:`},e.Directives=a})),ne=o((e=>{var t=H(),n=U();function r(e){if(/[\x00-\x19\s,[\]{}]/.test(e)){let t=`Anchor must not contain whitespace or control characters: ${JSON.stringify(e)}`;throw Error(t)}return!0}function i(e){let t=new Set;return n.visit(e,{Value(e,n){n.anchor&&t.add(n.anchor)}}),t}function a(e,t){for(let n=1;;++n){let r=`${e}${n}`;if(!t.has(r))return r}}function o(e,n){let r=[],o=new Map,s=null;return{onAnchor:t=>{r.push(t),s??=i(e);let o=a(n,s);return s.add(o),o},setAnchors:()=>{for(let e of r){let n=o.get(e);if(typeof n==`object`&&n.anchor&&(t.isScalar(n.node)||t.isCollection(n.node)))n.node.anchor=n.anchor;else{let t=Error(`Failed to resolve repeated object (this should not happen)`);throw t.source=e,t}}},sourceObjects:o}}e.anchorIsValid=r,e.anchorNames=i,e.createNodeAnchors=o,e.findNewAnchor=a})),re=o((e=>{function t(e,n,r,i){if(i&&typeof i==`object`)if(Array.isArray(i))for(let n=0,r=i.length;n<r;++n){let r=i[n],a=t(e,i,String(n),r);a===void 0?delete i[n]:a!==r&&(i[n]=a)}else if(i instanceof Map)for(let n of Array.from(i.keys())){let r=i.get(n),a=t(e,i,n,r);a===void 0?i.delete(n):a!==r&&i.set(n,a)}else if(i instanceof Set)for(let n of Array.from(i)){let r=t(e,i,n,n);r===void 0?i.delete(n):r!==n&&(i.delete(n),i.add(r))}else for(let[n,r]of Object.entries(i)){let a=t(e,i,n,r);a===void 0?delete i[n]:a!==r&&(i[n]=a)}return e.call(n,r,i)}e.applyReviver=t})),ie=o((e=>{var t=H();function n(e,r,i){if(Array.isArray(e))return e.map((e,t)=>n(e,String(t),i));if(e&&typeof e.toJSON==`function`){if(!i||!t.hasAnchor(e))return e.toJSON(r,i);let n={aliasCount:0,count:1,res:void 0};i.anchors.set(e,n),i.onCreate=e=>{n.res=e,delete i.onCreate};let a=e.toJSON(r,i);return i.onCreate&&i.onCreate(a),a}return typeof e==`bigint`&&!i?.keep?Number(e):e}e.toJS=n})),ae=o((e=>{var t=re(),n=H(),r=ie();e.NodeBase=class{constructor(e){Object.defineProperty(this,n.NODE_TYPE,{value:e})}clone(){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(e.range=this.range.slice()),e}toJS(e,{mapAsMap:i,maxAliasCount:a,onAnchor:o,reviver:s}={}){if(!n.isDocument(e))throw TypeError(`A document argument is required`);let c={anchors:new Map,doc:e,keep:!0,mapAsMap:i===!0,mapKeyWarned:!1,maxAliasCount:typeof a==`number`?a:100},l=r.toJS(this,``,c);if(typeof o==`function`)for(let{count:e,res:t}of c.anchors.values())o(t,e);return typeof s==`function`?t.applyReviver(s,{"":l},``,l):l}}})),oe=o((e=>{var t=ne(),n=U(),r=H(),i=ae(),a=ie(),o=class extends i.NodeBase{constructor(e){super(r.ALIAS),this.source=e,Object.defineProperty(this,`tag`,{set(){throw Error(`Alias nodes cannot have tags`)}})}resolve(e,t){let i;t?.aliasResolveCache?i=t.aliasResolveCache:(i=[],n.visit(e,{Node:(e,t)=>{(r.isAlias(t)||r.hasAnchor(t))&&i.push(t)}}),t&&(t.aliasResolveCache=i));let a;for(let e of i){if(e===this)break;e.anchor===this.source&&(a=e)}return a}toJSON(e,t){if(!t)return{source:this.source};let{anchors:n,doc:r,maxAliasCount:i}=t,o=this.resolve(r,t);if(!o){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw ReferenceError(e)}let c=n.get(o);if(c||=(a.toJS(o,null,t),n.get(o)),c?.res===void 0)throw ReferenceError(`This should not happen: Alias anchor was not resolved?`);if(i>=0&&(c.count+=1,c.aliasCount===0&&(c.aliasCount=s(r,o,n)),c.count*c.aliasCount>i))throw ReferenceError(`Excessive alias count indicates a resource exhaustion attack`);return c.res}toString(e,n,r){let i=`*${this.source}`;if(e){if(t.anchorIsValid(this.source),e.options.verifyAliasOrder&&!e.anchors.has(this.source)){let e=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw Error(e)}if(e.implicitKey)return`${i} `}return i}};function s(e,t,n){if(r.isAlias(t)){let r=t.resolve(e),i=n&&r&&n.get(r);return i?i.count*i.aliasCount:0}else if(r.isCollection(t)){let r=0;for(let i of t.items){let t=s(e,i,n);t>r&&(r=t)}return r}else if(r.isPair(t)){let r=s(e,t.key,n),i=s(e,t.value,n);return Math.max(r,i)}return 1}e.Alias=o})),se=o((e=>{var t=H(),n=ae(),r=ie();let i=e=>!e||typeof e!=`function`&&typeof e!=`object`;var a=class extends n.NodeBase{constructor(e){super(t.SCALAR),this.value=e}toJSON(e,t){return t?.keep?this.value:r.toJS(this.value,e,t)}toString(){return String(this.value)}};a.BLOCK_FOLDED=`BLOCK_FOLDED`,a.BLOCK_LITERAL=`BLOCK_LITERAL`,a.PLAIN=`PLAIN`,a.QUOTE_DOUBLE=`QUOTE_DOUBLE`,a.QUOTE_SINGLE=`QUOTE_SINGLE`,e.Scalar=a,e.isScalarValue=i})),ce=o((e=>{var t=oe(),n=H(),r=se();function i(e,t,n){if(t){let e=n.filter(e=>e.tag===t),r=e.find(e=>!e.format)??e[0];if(!r)throw Error(`Tag ${t} not found`);return r}return n.find(t=>t.identify?.(e)&&!t.format)}function a(e,a,o){if(n.isDocument(e)&&(e=e.contents),n.isNode(e))return e;if(n.isPair(e)){let t=o.schema[n.MAP].createNode?.(o.schema,null,o);return t.items.push(e),t}(e instanceof String||e instanceof Number||e instanceof Boolean||typeof BigInt<`u`&&e instanceof BigInt)&&(e=e.valueOf());let{aliasDuplicateObjects:s,onAnchor:c,onTagObj:l,schema:u,sourceObjects:d}=o,f;if(s&&e&&typeof e==`object`){if(f=d.get(e),f)return f.anchor??=c(e),new t.Alias(f.anchor);f={anchor:null,node:null},d.set(e,f)}a?.startsWith(`!!`)&&(a=`tag:yaml.org,2002:`+a.slice(2));let p=i(e,a,u.tags);if(!p){if(e&&typeof e.toJSON==`function`&&(e=e.toJSON()),!e||typeof e!=`object`){let t=new r.Scalar(e);return f&&(f.node=t),t}p=e instanceof Map?u[n.MAP]:Symbol.iterator in Object(e)?u[n.SEQ]:u[n.MAP]}l&&(l(p),delete o.onTagObj);let m=p?.createNode?p.createNode(o.schema,e,o):typeof p?.nodeClass?.from==`function`?p.nodeClass.from(o.schema,e,o):new r.Scalar(e);return a?m.tag=a:p.default||(m.tag=p.tag),f&&(f.node=m),m}e.createNode=a})),le=o((e=>{var t=ce(),n=H(),r=ae();function i(e,n,r){let i=r;for(let e=n.length-1;e>=0;--e){let t=n[e];if(typeof t==`number`&&Number.isInteger(t)&&t>=0){let e=[];e[t]=i,i=e}else i=new Map([[t,i]])}return t.createNode(i,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw Error(`This should not happen, please report a bug.`)},schema:e,sourceObjects:new Map})}let a=e=>e==null||typeof e==`object`&&!!e[Symbol.iterator]().next().done;e.Collection=class extends r.NodeBase{constructor(e,t){super(e),Object.defineProperty(this,`schema`,{value:t,configurable:!0,enumerable:!1,writable:!0})}clone(e){let t=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return e&&(t.schema=e),t.items=t.items.map(t=>n.isNode(t)||n.isPair(t)?t.clone(e):t),this.range&&(t.range=this.range.slice()),t}addIn(e,t){if(a(e))this.add(t);else{let[r,...a]=e,o=this.get(r,!0);if(n.isCollection(o))o.addIn(a,t);else if(o===void 0&&this.schema)this.set(r,i(this.schema,a,t));else throw Error(`Expected YAML collection at ${r}. Remaining path: ${a}`)}}deleteIn(e){let[t,...r]=e;if(r.length===0)return this.delete(t);let i=this.get(t,!0);if(n.isCollection(i))return i.deleteIn(r);throw Error(`Expected YAML collection at ${t}. Remaining path: ${r}`)}getIn(e,t){let[r,...i]=e,a=this.get(r,!0);return i.length===0?!t&&n.isScalar(a)?a.value:a:n.isCollection(a)?a.getIn(i,t):void 0}hasAllNullValues(e){return this.items.every(t=>{if(!n.isPair(t))return!1;let r=t.value;return r==null||e&&n.isScalar(r)&&r.value==null&&!r.commentBefore&&!r.comment&&!r.tag})}hasIn(e){let[t,...r]=e;if(r.length===0)return this.has(t);let i=this.get(t,!0);return n.isCollection(i)?i.hasIn(r):!1}setIn(e,t){let[r,...a]=e;if(a.length===0)this.set(r,t);else{let e=this.get(r,!0);if(n.isCollection(e))e.setIn(a,t);else if(e===void 0&&this.schema)this.set(r,i(this.schema,a,t));else throw Error(`Expected YAML collection at ${r}. Remaining path: ${a}`)}}},e.collectionFromPath=i,e.isEmptyPath=a})),ue=o((e=>{let t=e=>e.replace(/^(?!$)(?: $)?/gm,`#`);function n(e,t){return/^\n+$/.test(e)?e.substring(1):t?e.replace(/^(?! *$)/gm,t):e}e.indentComment=n,e.lineComment=(e,t,r)=>e.endsWith(`
4
4
  `)?n(r,t):r.includes(`
5
5
  `)?`
@@ -524,10 +524,10 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
524
524
  `)}function AA(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=FA(e);if(t.type!==`image`)continue;let r=FA(t.remote_agent_attachment);if(Object.keys(r).length>0){n.push(r);continue}let i=FA(t.source),a=IA(i.media_type)??IA(i.mediaType),o=IA(i.path);n.push({id:IA(t.id)??o??`claude_image_${n.length+1}`,kind:`image`,mimeType:a,...o?{locator:{kind:`absolute`,path:o}}:{}})}return n}function jA(e){let t=FA(FA(e.event).delta);if(typeof t.text==`string`&&t.text.length>0)return t.text}function MA(e,t=!1){if(t)return iA;let n=Array.isArray(e.errors)?e.errors.filter(e=>typeof e==`string`):[];return n.length>0?n.join(`; `):IA(e.subtype)||`Claude turn failed`}function NA(e,t){return t||(IA(e.terminal_reason)??IA(e.terminalReason))===`aborted_streaming`?!0:(Array.isArray(e.errors)?e.errors.filter(e=>typeof e==`string`):[]).some(e=>e.includes(`result_type=user`)||e.includes(`[Request interrupted by user]`)||e.includes(`[Request interrupted by user for tool use]`))}function PA(e){let t=FA(e);return{input_tokens:zA(t.input_tokens)??zA(t.inputTokens)??0,cached_input_tokens:zA(t.cached_input_tokens)??zA(t.cache_read_input_tokens)??zA(t.cacheReadInputTokens)??0,output_tokens:zA(t.output_tokens)??zA(t.outputTokens)??0}}function FA(e){return typeof e==`object`&&e?e:{}}function IA(e){if(typeof e==`string`&&e.trim())return e}function LA(e){if(typeof e==`string`&&e.length>0)return e}function RA(e){if(Array.isArray(e)){for(let t of e)if(typeof t==`string`&&t.trim())return t}}function zA(e){if(typeof e==`number`&&Number.isFinite(e))return e}function BA(e){let t=IA(FA(e.message).id);if(t)return t;let n=IA(FA(FA(e.event).message).id);if(n)return n}function VA(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`_`);return t?t.replace(/^_+|_+$/g,``):`tool`}var HA=class{constructor(e,t,n,r){this.nativeSession=r,this.provider=e,this.id=t,this.model=n,this.bindNativeEvents(r)}id;provider;providerMode=`native`;model;listeners=new Set;unsubscribe;onEvent(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}async sendInput(e,t){let n=cO(e);if((n.attachments?.length??0)>0)throw Error(`Native legacy session does not support image attachments`);let r=n.text;if(typeof this.nativeSession?.sendInput==`function`){await this.nativeSession.sendInput(r);return}if(typeof this.nativeSession?.input==`function`){await this.nativeSession.input(r);return}if(typeof this.nativeSession?.turn==`function`){await this.nativeSession.turn({input:r});return}throw Error(`Native session does not expose a known input method`)}async interrupt(){if(typeof this.nativeSession?.interrupt==`function`){await this.nativeSession.interrupt();return}if(typeof this.nativeSession?.cancel==`function`){await this.nativeSession.cancel();return}throw Error(`Native session does not expose interrupt/cancel`)}async close(){if(typeof this.unsubscribe==`function`&&(this.unsubscribe(),this.unsubscribe=void 0),typeof this.nativeSession?.close==`function`){await this.nativeSession.close();return}if(typeof this.nativeSession?.dispose==`function`){await this.nativeSession.dispose();return}}async respondToolPermission(e,t,n){if(typeof this.nativeSession?.respondToolPermission==`function`){await this.nativeSession.respondToolPermission({requestId:e,decision:t,reason:n});return}if(typeof this.nativeSession?.approveToolCall==`function`){await this.nativeSession.approveToolCall({requestId:e,approved:t===`allow`,reason:n});return}throw Error(`Native session does not expose tool approval response method`)}bindNativeEvents(e){let t=e=>{let t=UA(e);for(let e of this.listeners)e(t)};if(typeof e?.subscribe==`function`){let n=e.subscribe(e=>t(e));typeof n==`function`&&(this.unsubscribe=n);return}if(typeof e?.on==`function`){let n=e=>t(e);e.on(`event`,n),this.unsubscribe=()=>{typeof e?.off==`function`&&e.off(`event`,n)};return}throw Error(`Native session does not expose a known event subscription API`)}};function UA(e){return typeof e==`object`&&e&&`type`in e?e:{type:`status.progress`,nativeEvent:e}}var WA=`@anthropic-ai/claude-agent-sdk`,GA=`claude-sonnet-4-6`,KA=1e4,qA=class{constructor(e,t){this.preferNative=e,this.requireNative=t}provider=`claude`;async isNativeAvailable(){try{return await import(WA),!0}catch{return!1}}async createSession(e){if(!this.preferNative)throw Error(`Claude native provider is disabled. Set ENABLE_NATIVE_PROVIDERS=true to use Claude sessions.`);try{let t=await import(WA),n=await JA(YA(t,e),KA,`Claude native query session creation timed out`);if(n)return n;let r=await JA(XA(t,e),KA,`Claude legacy native session creation timed out`);if(r)return r;throw this.requireNative,Error(`Claude SDK loaded but no supported stable session API was found`)}catch(e){throw Error(`Claude native session creation failed: ${String(e)}`)}}};async function JA(e,t,n){if(!Number.isFinite(t)||t<=0)return e;let r,i=new Promise((e,i)=>{r=setTimeout(()=>{i(Error(n))},t)});try{return await Promise.race([e,i])}finally{r&&clearTimeout(r)}}async function YA(e,t){let n=ZA(e);if(!n)return null;let r=t.model??GA;return new lA(t.sessionId,r,({prompt:e,model:i,sessionConfig:a,resume:o,abortController:s,canUseTool:c})=>{let l=a?.permissionMode??t.sessionConfig?.permissionMode??`default`,u={model:i??r,includePartialMessages:!0,abortController:s,canUseTool:c,permissionMode:l},d=QA(a?.reasoningEffort??t.sessionConfig?.reasoningEffort);return d&&(u.effort=d),l===`bypassPermissions`&&(u.allowDangerouslySkipPermissions=!0),t.cwd&&(u.cwd=t.cwd),o&&(u.resume=o,u.forkSession=!1),n({prompt:e,options:u})},t.resumeSessionId,{cwd:t.cwd})}async function XA(e,t){if(typeof e?.createSession==`function`){let n=await e.createSession({model:t.model,cwd:t.cwd,metadata:t.metadata,sessionId:t.sessionId});return new HA(`claude`,t.sessionId,t.model,n)}if(typeof e?.ClaudeAgentClient==`function`){let n=new e.ClaudeAgentClient;if(typeof n?.createSession==`function`){let e=await n.createSession({model:t.model,cwd:t.cwd,metadata:t.metadata,sessionId:t.sessionId});return new HA(`claude`,t.sessionId,t.model,e)}}if(typeof e?.default?.createSession==`function`){let n=await e.default.createSession({model:t.model,cwd:t.cwd,metadata:t.metadata,sessionId:t.sessionId});return new HA(`claude`,t.sessionId,t.model,n)}return null}function ZA(e){if(typeof e?.query==`function`)return e.query;if(typeof e?.default?.query==`function`)return e.default.query}function QA(e){if(e){if(e===`max`)return`max`;if(e===`high`||e===`medium`||e===`low`)return e;if(e===`xhigh`)return`max`;if(e===`minimal`||e===`none`)return`low`}}function $A(e,t={}){let n=t.preferNative??!1,r=t.requireNative??!1;return e===`codex`?new Vk(n,r):new qA(n,r)}const ej=p.default.join(`.claude`,`projects`),tj=/\u001B\[[0-?]*[ -/]*[@-~]/g,nj=[`/clear`,`/config`,`/copy`,`/cost`,`/effort`,`/exit`,`/help`,`/login`,`/model`,`/permissions`,`/plugin`,`/release-notes`,`/resume`,`/skills`,`/status`,`/usage`];async function rj(e){return(await(0,O.listSessions)(typeof e==`number`?{limit:e}:void 0)).map(e=>uj(e)).filter(e=>typeof e.cwd==`string`).sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt))}async function ij(e,t){let n=cj(e,t?.homeDir),r=p.default.resolve(e);try{let i=await dj(e,n,r,{maxSessions:Uj(t?.maxSessions),updatedAfterMs:Hj(t?.updatedAfterMs)});if(i.length>0)return i}catch{}return fj(n,{maxSessions:Uj(t?.maxSessions),updatedAfterMs:Hj(t?.updatedAfterMs)})}async function aj(e){let t=await Oj(e.nativeSessionId,e.projectPath),n=await kj(e.projectPath,e.nativeSessionId,e.homeDir),r=hj(t,{createdAtFallbackMs:n.birthtimeMs,updatedAtFallbackMs:n.mtimeMs}),i=vj(r.updatedAt,n.mtimeMs),a=gj(r.model);return{rawEvents:oj({rows:t,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,nativeSessionId:e.nativeSessionId,createdAtFallbackMs:n.birthtimeMs,updatedAtFallbackMs:n.mtimeMs}),model:r.model,sessionTurnConfig:a,sessionTurnConfigUpdatedAt:a?i:void 0,updatedAt:i,status:yj(t),nativeWatchPath:sj(e.projectPath,e.nativeSessionId,e.homeDir)}}function oj(e){let t=[],n=hj(e.rows,{createdAtFallbackMs:e.createdAtFallbackMs,updatedAtFallbackMs:e.updatedAtFallbackMs}),r=Date.parse(n.createdAt),i=0,a=Number.isFinite(r)?r:0,o=e=>{if(e){let t=Date.parse(e);if(Number.isFinite(t))return a=Math.max(a+1,t),new Date(t).toISOString()}return a+=1,new Date(a).toISOString()};for(let n of e.rows)n.type!==`system`&&(i+=1,t.push({v:`1.0`,kind:`provider.raw`,rawSeq:i,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`raw_hist_claude_${e.sessionId}_${i.toString().padStart(6,`0`)}`,ts:o(n.timestamp),type:`native.raw`,payload:{raw:{source:`claude.history.getSessionMessages`,native_type:n.type??`unknown`,message:n.raw,historyReplay:!0,replaySynthetic:!1,source_line:n.line,native_session_id:e.nativeSessionId}}}));return t}function sj(e,t,n){return p.default.join(cj(e,n),`${t}.jsonl`)}function cj(e,t){let n=t??f.default.homedir();return p.default.join(n,ej,lj(e))}function lj(e){let t=p.default.resolve(e).replace(/\\/g,`/`).replace(/:/g,`-`).replace(/\//g,`-`);return t.startsWith(`-`)?t:`-${t}`}function uj(e){let t=Rj(e.customTitle)??Rj(e.summary)??Rj(e.firstPrompt),n=Ej(e.createdAt??e.lastModified),r=Ej(e.lastModified);return{nativeSessionId:e.sessionId,cwd:Tj(e.cwd),title:t,createdAt:n,updatedAt:r,status:`idle`}}async function dj(e,t,n,r){let i=Math.max(1,Math.min(r.maxSessions??100,100)),a=[],o=0,s=!1;for(;r.maxSessions===void 0||a.length<r.maxSessions;){let c=r.maxSessions===void 0?i:Math.max(1,Math.min(i,r.maxSessions-a.length)),l=await(0,O.listSessions)({dir:e,limit:c,offset:o});if(l.length===0)break;for(let e of l){let i=Hj(e.lastModified);if(r.updatedAfterMs!==void 0&&i!==void 0&&i<r.updatedAfterMs){s=!0;break}let o=uj(e);if(typeof o.cwd!=`string`||p.default.resolve(o.cwd)!==n)continue;let c=await pj(t,{nativeSessionId:o.nativeSessionId,sdkSession:o});if(c&&(a.push(c),r.maxSessions!==void 0&&a.length>=r.maxSessions))break}if(s||r.maxSessions!==void 0&&a.length>=r.maxSessions||l.length<c)break;o+=l.length}return mj(a,r)}async function fj(e,t){let n=[];try{n=await d.default.readdir(e,{withFileTypes:!0})}catch(e){if(e.code!==`ENOENT`)throw e}let r=[];for(let t of n){if(!t.isFile()||!t.name.endsWith(`.jsonl`))continue;let n=await pj(e,{nativeSessionId:t.name.slice(0,-6)});n&&r.push(n)}return mj(r,t)}async function pj(e,t){let n=p.default.join(e,`${t.nativeSessionId}.jsonl`),r;try{r=await Dj(n)}catch(e){if(e.code===`ENOENT`)return t.sdkSession;throw e}if(!wj(r))return;let i=await d.default.stat(n),a=t.sdkSession?.createdAt?Vj(t.sdkSession.createdAt):void 0,o=t.sdkSession?.updatedAt?Vj(t.sdkSession.updatedAt):void 0,s=hj(r,{createdAtFallbackMs:a??i.birthtimeMs,updatedAtFallbackMs:o??i.mtimeMs});return{nativeSessionId:t.nativeSessionId,model:s.model,title:t.sdkSession?.title??s.title,createdAt:s.createdAt,updatedAt:t.sdkSession?.updatedAt??s.updatedAt,status:yj(r)}}function mj(e,t){let n=e.filter(e=>{if(t.updatedAfterMs===void 0)return!0;let n=Vj(e.updatedAt);return n===void 0?!0:n>=t.updatedAfterMs}).sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt));return t.maxSessions===void 0?n:n.slice(0,t.maxSessions)}function hj(e,t){let n,r,i,a;for(let t of e){t.timestampMs!==void 0&&(i=i===void 0?t.timestampMs:Math.min(i,t.timestampMs),a=a===void 0?t.timestampMs:Math.max(a,t.timestampMs)),!r&&t.type===`user`&&(r=Fj(Nj(Ij(t.raw.message))));let e=_j(t);e&&(n=e)}let o=i??Hj(t.createdAtFallbackMs)??0,s=a??Hj(t.updatedAtFallbackMs)??o;return{model:n,title:r,createdAt:new Date(o).toISOString(),updatedAt:new Date(s).toISOString()}}function gj(e){let t=Tj(e);if(t)return{mode:`default`,model:t,reasoningEffort:null}}function _j(e){return Tj(Ij(e.raw.message).model)??Tj(e.raw.model)}function vj(e,t){let n=Vj(e)??0,r=Hj(t)??0;return new Date(Math.max(n,r)).toISOString()}function yj(e,t=Date.now()){let n=null;for(let t of e){let e=bj(t);e&&(n=e)}return!n?.unresolved||n.timestampMs!==void 0&&t-n.timestampMs>6e5?`idle`:`running`}function bj(e){let t=e.timestampMs??Vj(e.timestamp??``);switch(e.type){case`assistant`:case`result`:case`tool_use_summary`:return{unresolved:!1,timestampMs:t};case`stream_event`:case`tool_progress`:return{unresolved:!0,timestampMs:t};case`user`:return xj(e.raw,t);default:return null}}function xj(e,t){let n=Ij(e);if(n.isMeta===!0)return null;let r=Ij(n.message);if(Mj(r).length>0)return{unresolved:!0,timestampMs:t};let i=Nj(r);return i?Sj(i)?{unresolved:!1,timestampMs:t}:{unresolved:!0,timestampMs:t}:null}function Sj(e){let t=e.toLowerCase();return t.includes(`[request interrupted by user]`)||t.includes(`[request interrupted by user for tool use]`)||t.includes(`<local-command-stdout>`)?!0:nj.some(e=>Cj(t,e))}function Cj(e,t){return e.includes(`<command-name>${t.toLowerCase()}</command-name>`)}function wj(e){for(let t of e){if(t.type===`user`){let e=Ij(t.raw.message);if(Nj(e)||Mj(e).length>0)return!0;continue}if(t.type!==`assistant`)continue;let e=Ij(t.raw.message);if(Nj(e)||jj(e).length>0||Lj(t.raw.error))return!0}return!1}function Tj(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Ej(e){return Number.isFinite(e)?new Date(e).toISOString():new Date(0).toISOString()}async function Dj(e){let t=(await d.default.readFile(e,`utf8`)).split(`
525
525
  `),n=[];for(let e=0;e<t.length;e+=1){let r=t[e]?.trim();if(!r)continue;let i;try{i=JSON.parse(r)}catch{continue}let a=Ij(i),o=Lj(a.timestamp),s=o?Vj(o):void 0;n.push({line:e+1,raw:a,type:Lj(a.type),timestamp:o,timestampMs:s})}return n}async function Oj(e,t){let n=await(0,O.getSessionMessages)(e,{dir:t,includeSystemMessages:!0});if(n.length===0)throw Error(`Claude session ${e} returned no messages from getSessionMessages`);return n.map((e,t)=>Aj(e,t+1))}async function kj(e,t,n){let r=sj(e,t,n);try{return await d.default.stat(r)}catch{let e=Date.now();return{birthtimeMs:e,mtimeMs:e}}}function Aj(e,t){let n=Ij(e),r=Ij(n.message),i=Lj(n.timestamp)??Lj(r.timestamp)??Lj(r.created_at)??Lj(r.createdAt);return{line:t,raw:{...n,message:r},type:Lj(n.type),timestamp:i,timestampMs:i?Vj(i):void 0}}function jj(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=Ij(e);if(Lj(t.type)!==`tool_use`)continue;let r=Ij(t.input),i=Lj(r.command),a=Lj(t.name)??`tool`,o=Lj(r.description);n.push({id:Lj(t.id),name:a,command:i,summary:o??i??`${a} started`})}return n}function Mj(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=Ij(e);if(Lj(t.type)!==`tool_result`)continue;let r=zj(Lj(t.content)??Lj(Ij(t.toolUseResult).stdout)??Lj(Ij(t.tool_use_result).stdout)??Lj(t.text));n.push({toolUseId:Lj(t.tool_use_id)??Lj(t.toolUseId),toolName:Lj(t.tool_name)??Lj(t.toolName),text:r,isError:t.is_error===!0})}return n}function Nj(e){let t=Lj(e.content);if(t)return zj(t);let n=Lj(e.text)??Lj(e.prompt);if(n)return zj(n);let r=Array.isArray(e.content)?e.content:[],i=[];for(let e of r){if(typeof e==`string`&&e.trim()){i.push(e);continue}let t=Ij(e),n=Lj(t.type);if(n&&n!==`text`)continue;let r=Lj(t.text)??Lj(t.content)??Pj(t);r&&i.push(r)}if(i.length!==0)return zj(i.join(`
526
526
  `))}function Pj(e){let t=Array.isArray(e.text_elements)?e.text_elements:Array.isArray(e.textElements)?e.textElements:[];if(t.length===0)return;let n=[];for(let e of t){let t=Ij(e),r=Lj(t.text)??Lj(t.value);r&&n.push(r)}return n.length>0?n.join(``):void 0}function Fj(e,t=60){if(!e)return;let n=Bj(e).replace(/\s+/g,` `).trim();if(!n)return;let r=Array.from(n);return r.length<=t?n:r.slice(0,t).join(``).trimEnd()}function Ij(e){return typeof e==`object`&&e?e:{}}function Lj(e){return typeof e==`string`&&e.trim()||void 0}function Rj(e){if(typeof e==`string`)return zj(e)}function zj(e){if(!e)return;let t=Bj(e).trim();return t.length>0?t:void 0}function Bj(e){return e.replace(tj,``)}function Vj(e){let t=Date.parse(e);if(Number.isFinite(t))return t}function Hj(e){if(!(e===void 0||!Number.isFinite(e)||e<=0))return Math.round(e)}function Uj(e){if(e===void 0||!Number.isFinite(e))return;let t=Math.floor(e);return t>0?t:void 0}var Wj=class{constructor(e){this.options=e}async init(){await this.options.store.init()}async getProjects(){await this.init();let e=await this.options.store.getIndex();return e?{generatedAt:e.generatedAt,source:`cache`,providers:e.providers,projects:e.projects}:this.refreshProjects()}async refreshProjects(){await this.init();let e=new Map,[t,n]=await Promise.all([this.scanCodexSessions(e),this.scanClaudeSessions(e)]),r=new Date().toISOString(),i={codex:t.status,claude:n.status},{projects:a,projectSessions:o}=Kj(r,[t,n]);if(qj(i)){let e=await this.options.store.getSnapshot();if(e)return await this.options.store.writeSnapshot({...e,providers:i}),{generatedAt:e.generatedAt,source:`cache`,providers:i,projects:e.projects}}return await this.options.store.writeSnapshot({generatedAt:r,providers:i,projects:a,projectSessions:o}),{generatedAt:r,source:`fresh_scan`,providers:i,projects:a}}async listProjectSessions(e){await this.init();let t=e.trim(),n=await this.options.store.getIndex(),r=!1;n||(n=Yj(await this.refreshProjects()),r=!0);let i=await Jj(n.projects,t);if(!i)throw GT(t);let a=await this.options.store.getProject(i.key);if(!a&&!r){if(n=Yj(await this.refreshProjects()),i=await Jj(n.projects,t),!i)throw GT(t);if(a=await this.options.store.getProject(i.key),!a)throw Error(`Discovery cache missing project sessions: ${i.path}`)}if(!a)throw Error(`Discovery cache missing project sessions: ${i.path}`);return{canonicalProjectPath:i.path,project:a.project,providers:a.providers,sessions:a.sessions}}async scanCodexSessions(e){let t=new Date().toISOString();try{let n=new Map;for(let e of[!1,!0]){let t=null;do{let r=await Uk({archived:e,cursor:t,limit:100});for(let e of r.threads)n.set(e.id,e);t=r.nextCursor}while(t)}let r=await Gj({sessions:[...n.values()],canonicalPathCache:e,getRawPath:e=>Qj(e.cwd),mapSession:e=>{let t=$j(e.createdAt),n=$j(e.updatedAt,t);return{provider:`codex`,nativeSessionId:e.id,title:Qj(e.name)??Qj(e.preview),model:Qj(e.model),createdAt:t,updatedAt:n}}});return{records:r.records,status:{scannedAt:t,sessionCount:r.records.length,status:r.skippedCount>0?`partial`:`ready`,...r.skippedCount>0?{error:`Skipped ${r.skippedCount} Codex session(s) with missing or invalid cwd`}:{}}}}catch(e){return{records:[],status:{scannedAt:t,sessionCount:0,status:`failed`,error:String(e)}}}}async scanClaudeSessions(e){let t=new Date().toISOString();try{let n=await Gj({sessions:await rj(),canonicalPathCache:e,getRawPath:e=>Qj(e.cwd),mapSession:e=>({provider:`claude`,nativeSessionId:e.nativeSessionId,title:Qj(e.title),model:Qj(e.model),createdAt:Qj(e.createdAt),updatedAt:e.updatedAt})});return{records:n.records,status:{scannedAt:t,sessionCount:n.records.length,status:n.skippedCount>0?`partial`:`ready`,...n.skippedCount>0?{error:`Skipped ${n.skippedCount} Claude session(s) with missing or invalid cwd`}:{}}}}catch(e){return{records:[],status:{scannedAt:t,sessionCount:0,status:`failed`,error:String(e)}}}}};async function Gj(e){let t=[],n=0;for(let r of e.sessions){let i=e.getRawPath(r);if(!i){n+=1;continue}try{let n=await Xj(i,e.canonicalPathCache);t.push({canonicalProjectPath:n,session:e.mapSession(r)})}catch{n+=1}}return{records:t,skippedCount:n}}function Kj(e,t){let n=new Map;for(let e of t)for(let t of e.records){let e=n.get(t.canonicalProjectPath);e||(e={path:t.canonicalProjectPath,key:Zj(t.canonicalProjectPath),title:p.default.basename(t.canonicalProjectPath)||t.canonicalProjectPath,providerCounts:{codex:0,claude:0},sessionsByKey:new Map},n.set(t.canonicalProjectPath,e));let r=`${t.session.provider}:${t.session.nativeSessionId}`,i=e.sessionsByKey.get(r);i||(e.providerCounts[t.session.provider]+=1);let a=eM(i,t.session);e.sessionsByKey.set(r,a),(!e.lastSessionAt||t.session.updatedAt>e.lastSessionAt)&&(e.lastSessionAt=t.session.updatedAt)}let r=[...n.values()].map(t=>({project:{key:t.key,path:t.path,title:t.title,lastSessionAt:t.lastSessionAt,sessionCount:t.sessionsByKey.size,providerCounts:t.providerCounts,lastDiscoveryAt:e},sessions:[...t.sessionsByKey.values()].sort(nM)})).sort((e,t)=>tM(e.project,t.project));return{projects:r.map(e=>e.project),projectSessions:r}}function qj(e){return Object.values(e).some(e=>e?.status===`failed`)}async function Jj(e,t){let n=e.find(e=>e.path===t);if(n)return n;let r=await KD(t);return e.find(e=>e.path===r)}function Yj(e){return{v:1,generatedAt:e.generatedAt,providers:e.providers,projects:e.projects}}async function Xj(e,t){let n=t.get(e);return n||(n=KD(e),t.set(e,n)),n}function Zj(e){return(0,l.createHash)(`sha256`).update(e).digest(`hex`).slice(0,16)}function Qj(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function $j(e,t){return!Number.isFinite(e)||e<=0?t??new Date(0).toISOString():new Date(e*1e3).toISOString()}function eM(e,t){return e&&e.updatedAt>=t.updatedAt?e:t}function tM(e,t){let n=e.lastSessionAt??e.lastDiscoveryAt,r=t.lastSessionAt??t.lastDiscoveryAt;return n===r?e.path.localeCompare(t.path):r.localeCompare(n)}function nM(e,t){return e.updatedAt===t.updatedAt?`${e.provider}:${e.nativeSessionId}`.localeCompare(`${t.provider}:${t.nativeSessionId}`):t.updatedAt.localeCompare(e.updatedAt)}var rM=class{indexPath;projectsDir;ready;writeQueue=Promise.resolve();indexCache=null;projectCache=new Map;constructor(e){this.baseDir=e,this.indexPath=p.default.join(e,`discovery-index.json`),this.projectsDir=p.default.join(e,`discovery-projects`),this.ready=this.loadFromDisk()}async init(){await this.ready}async getIndex(){return await this.ready,this.indexCache?structuredClone(this.indexCache):null}async getProject(e){await this.ready;let t=this.projectCache.get(e);if(t)return structuredClone(t);let n=await iM(this.getProjectPath(e),sM);return n?(this.projectCache.set(e,n),structuredClone(n)):null}async getSnapshot(){if(await this.ready,!this.indexCache)return null;let e=[];for(let t of this.indexCache.projects){let n=await this.getProject(t.key);if(!n)return null;e.push({project:n.project,sessions:n.sessions})}return{generatedAt:this.indexCache.generatedAt,providers:structuredClone(this.indexCache.providers),projects:structuredClone(this.indexCache.projects),projectSessions:e}}async writeSnapshot(e){await this.ready;let t={v:1,generatedAt:e.generatedAt,providers:e.providers,projects:e.projects},n=e.projectSessions.map(t=>({v:1,projectKey:t.project.key,canonicalProjectPath:t.project.path,project:t.project,providers:e.providers,sessions:t.sessions}));await this.enqueueWrite(async()=>{await d.default.mkdir(this.projectsDir,{recursive:!0});let e=new Set(n.map(e=>e.projectKey)),r=[];try{r=await d.default.readdir(this.projectsDir,{withFileTypes:!0})}catch(e){if(e.code!==`ENOENT`)throw e}await Promise.all(n.map(async e=>{await aM(this.getProjectPath(e.projectKey),e)})),await Promise.all(r.map(async t=>{if(!t.isFile()||!t.name.endsWith(`.json`))return;let n=t.name.slice(0,-5);e.has(n)||(await d.default.rm(p.default.join(this.projectsDir,t.name),{force:!0}),this.projectCache.delete(n))})),await aM(this.indexPath,t),this.indexCache=t,this.projectCache.clear();for(let e of n)this.projectCache.set(e.projectKey,e)})}async loadFromDisk(){await d.default.mkdir(this.baseDir,{recursive:!0}),await d.default.mkdir(this.projectsDir,{recursive:!0}),this.indexCache=await iM(this.indexPath,oM)}getProjectPath(e){return p.default.join(this.projectsDir,`${e}.json`)}enqueueWrite(e){return this.writeQueue=this.writeQueue.then(e,e),this.writeQueue}};async function iM(e,t){try{let n=await d.default.readFile(e,`utf8`),r=JSON.parse(n);return t(r)?r:null}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function aM(e,t){let n=`${JSON.stringify(t,null,2)}\n`;try{if(await d.default.readFile(e,`utf8`)===n)return}catch(e){if(e.code!==`ENOENT`)throw e}await d.default.mkdir(p.default.dirname(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;await d.default.writeFile(r,n,`utf8`),await d.default.rename(r,e)}function oM(e){return!cM(e)||e.v!==1||typeof e.generatedAt!=`string`||!sf.safeParse(e.providers).success||!Array.isArray(e.projects)?!1:e.projects.every(e=>cf.safeParse(e).success)}function sM(e){return!cM(e)||e.v!==1||typeof e.projectKey!=`string`||e.projectKey.length===0||typeof e.canonicalProjectPath!=`string`||e.canonicalProjectPath.length===0||!cf.safeParse(e.project).success||!sf.safeParse(e.providers).success||!Array.isArray(e.sessions)?!1:e.sessions.every(e=>lf.safeParse(e).success)}function cM(e){return typeof e==`object`&&!!e}const lM=Buffer.from([48,42,48,5,6,3,43,101,112,3,33,0]);function uM(e){let t=Gf.parse(e.clientHello),n=(0,l.randomBytes)(32).toString(`base64`),{privateKey:r,publicKey:i}=(0,l.generateKeyPairSync)(`x25519`),a=Ip(zp(mM(i.export({format:`jwk`})))),o=Ep({gatewayId:e.gatewayId,clientHello:t,gatewayHello:{gatewayNonce:n,gatewayPublicKeyFingerprint:e.gatewayIdentity.publicKeyFingerprint,gatewayEphemeralPublicKey:a}}),s=(0,l.sign)(null,Buffer.from(o,`utf8`),(0,l.createPrivateKey)(e.privateKeyPem)).toString(`base64`);return{gatewayHello:Kf.parse({version:t.version,securityLevel:t.securityLevel,cipherSuite:t.cipherSuite,gatewayId:e.gatewayId,deviceId:t.deviceId,clientNonce:t.clientNonce,gatewayNonce:n,gatewayPublicKeyFingerprint:e.gatewayIdentity.publicKeyFingerprint,gatewayEphemeralPublicKey:a,signatureAlgorithm:`ed25519`,signature:s}),gatewayEphemeralPrivateKey:r}}function dM(e){let t=Gf.parse(e.clientHello),n=Kf.parse(e.gatewayHello),r=qf.parse(e.clientAuth);if(t.version!==n.version||r.version!==t.version||!Ff.safeParse(t.cipherSuite).success||n.cipherSuite!==t.cipherSuite||t.cipherSuite!==`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`)throw Error(`unsupported_version`);if(r.gatewayId!==e.gatewayId||n.gatewayId!==e.gatewayId)throw Error(`transcript_invalid`);if(r.deviceId!==t.deviceId||n.deviceId!==t.deviceId||r.deviceIdentityFingerprint!==t.deviceIdentity.publicKeyFingerprint)throw Error(`identity_mismatch`);let i=(0,l.createPublicKey)({format:`der`,type:`spki`,key:Buffer.concat([lM,Lp(t.deviceIdentity.publicKey)])});if(!(0,l.verify)(null,Buffer.from(Dp({gatewayId:e.gatewayId,clientHello:t,gatewayHello:{gatewayNonce:n.gatewayNonce,gatewayPublicKeyFingerprint:n.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:n.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:r.clientEphemeralPublicKey}}),`utf8`),i,Lp(r.signature)))throw Error(`transcript_invalid`)}function fM(e){let t=Kf.parse(e.gatewayHello),n=qf.parse(e.clientAuth),r=(0,l.createPublicKey)({key:{crv:`X25519`,kty:`OKP`,x:Rp(Lp(n.clientEphemeralPublicKey))},format:`jwk`}),i=(0,l.diffieHellman)({privateKey:e.gatewayEphemeralPrivateKey,publicKey:r});return Ap({role:`gateway`,keySchedule:kp({gatewayId:e.gatewayId,clientHello:Gf.parse(e.clientHello),gatewayHello:{gatewayNonce:t.gatewayNonce,gatewayPublicKeyFingerprint:t.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:t.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:n.clientEphemeralPublicKey},sharedSecret:new Uint8Array(i),keyEpoch:1})})}function pM(e){return tp.parse({version:1,gatewayId:e.gatewayId,deviceId:e.deviceId,code:e.code,message:e.message,retryable:e.retryable})}function mM(e){if(typeof e.x!=`string`||e.x.length===0)throw Error(`x25519 public key export missing x`);return e.x}const hM=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;let gM=null;function _M(e){gM=e}function vM(e,t){hM&&(console.log(`[session-fetch][gateway] ${e}`,t),gM?.info({event:e,...t},`session fetch debug`))}const yM=64*1024;var bM=class{OPEN=1;readyState=1;constructor(e){this.onPayload=e}send(e){let t=JSON.parse(e);this.onPayload(t)}sendProviderRaw(e){this.onPayload(e)}close(){this.readyState=3}},xM=class{mobileConnections=new Map;constructor(e){this.dependencies=e}async handleFrame(e){switch(e.type){case`mobile.connected`:this.addMobileConnection(e.mobileId??``,e.payload.deviceId,e.payload.deliveryMode,e.payload.gatewayAvailableAtConnect);return;case`mobile.disconnected`:this.removeMobileConnection(e.mobileId??``,`mobile.disconnected`);return;case`secure.client_hello`:await this.handleSecureClientHello(e.mobileId,e.payload);return;case`secure.client_auth`:await this.handleSecureClientAuth(e.mobileId,e.payload);return;case`from_mobile`:await this.handleFromMobile(e);return;case`rpc.request`:await this.handleRpcRequest(e);return;case`pairing.claim.forward`:await this.handlePairingClaim(e.requestId,e.payload);return;case`auth.refresh.forward`:await this.handleRefresh(e.requestId,e.payload);return;case`file.content.forward`:await this.handleFileContent(e.requestId,e.payload);return;case`file.content.upload.started`:this.dependencies.handleFileContentUploadStarted?.(e.requestId);return;default:return}}close(){for(let e of this.mobileConnections.keys())this.removeMobileConnection(e,`bridge.close`)}addMobileConnection(e,t,n,r){if(!e)return;this.removeMobileConnection(e,`mobile.replaced`);let i={mobileId:e,deviceId:t,handshake:{status:`awaiting_client_hello`}};this.mobileConnections.set(e,i),this.dependencies.relayTransportSecurityLevel!==`e2ee-relay`&&this.ensureReadyMobileClient(i),this.dependencies.relayTransportSecurityLevel===`e2ee-relay`&&n===`gateway_replay`&&this.dependencies.sendFrame(Cp.parse({type:`secure.handshake_required`,gatewayId:this.dependencies.gatewayId,mobileId:e,messageType:`system`,payload:{version:1,gatewayId:this.dependencies.gatewayId,deviceId:t,reason:r?`gateway_restarted`:`gateway_available`,retryable:!0}}))}removeMobileConnection(e,t){let n=this.mobileConnections.get(e);if(!n)return;let r=n.clientId?this.dependencies.describeClientState?.(n.clientId)??{}:{};this.dependencies.logger?.info?.({mobileId:e,deviceId:n.deviceId,clientId:n.clientId??null,reason:t,hadSocket:!!n.socket,socketReadyState:n.socket?.readyState??null,...r},`relay mobile connection removed`),n.socket?.close(),n.clientId&&this.dependencies.sessionHub.removeClient(n.clientId),this.mobileConnections.delete(e)}async handleFromMobile(e){let t=e.mobileId;if(!t){this.sendRelayError({code:`BAD_REQUEST`,status:400,message:`from_mobile frame requires mobileId`});return}let n=this.mobileConnections.get(t);if(!n){this.sendRelayError({mobileId:t,code:`BAD_REQUEST`,status:400,message:`Unknown mobile ${t}`});return}if(n.handshake.status===`ready`&&n.clientId){let r=n,i=r.clientId;if(!i){this.sendSecureError(t,n.deviceId,`transcript_invalid`,`secure handshake not ready`);return}let a=this.decodeRelayBusinessPayload({connection:r,mobileId:t,frameType:`from_mobile`,messageType:e.messageType,parse:e=>gl.parse(e),payload:e.payload,encryptedPayload:e.encryptedPayload});if(!a)return;await this.dependencies.dispatchCommand(a,r.deviceId,i);return}if(this.dependencies.relayTransportSecurityLevel===`e2ee-relay`){this.sendSecureError(t,n.deviceId,`transcript_invalid`,`secure handshake not ready`);return}if(this.ensureReadyMobileClient(n),!n.clientId)return;if(e.payload===void 0){this.sendRelayError({mobileId:t,code:`BAD_REQUEST`,status:400,message:`plaintext relay payload missing`});return}let r=gl.parse(e.payload);await this.dependencies.dispatchCommand(r,n.deviceId,n.clientId)}async handlePairingClaim(e,t){try{let n=await this.dependencies.handlePairingClaim(t);this.dependencies.sendFrame(Cp.parse({type:`pairing.claim.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...DM(t,`pairing.claim`)})}}async handleRefresh(e,t){try{let n=await this.dependencies.handleRefresh(t);this.dependencies.sendFrame(Cp.parse({type:`auth.refresh.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...DM(t,`auth.refresh`)})}}async handleFileContent(e,t){try{let n=await this.dependencies.handleFileContentRequest(e,t);this.dependencies.sendFrame(Cp.parse({type:`file.content.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...DM(t,`file.content`)})}}async handleRpcRequest(e){let t=e.mobileId,n=e.requestId,r=this.mobileConnections.get(t);if(!r){this.dependencies.sendFrame({type:`rpc.error`,gatewayId:this.dependencies.gatewayId,mobileId:t,requestId:n,messageType:`rpc`,payload:{...EM(`BAD_REQUEST`,400,`Unknown mobile ${t}`)}});return}if(r.handshake.status===`ready`){let i=r,a=this.decodeRelayBusinessPayload({connection:i,mobileId:t,frameType:`rpc.request`,messageType:e.messageType,requestId:n,parse:e=>np.parse(e),payload:e.payload,encryptedPayload:e.encryptedPayload});if(!a)return;try{let e=await this.dependencies.handleRpcRequest(a,{mobileId:t,deviceId:i.deviceId});this.dependencies.sendFrame(Cp.parse({type:`rpc.response`,gatewayId:this.dependencies.gatewayId,mobileId:t,requestId:n,messageType:`rpc`,...this.createRelayBusinessPayloadFields(i,{frameType:`rpc.response`,messageType:`rpc`,requestId:n},e)}))}catch(e){let r=ap.safeParse(e);this.dependencies.sendFrame({type:`rpc.error`,gatewayId:this.dependencies.gatewayId,mobileId:t,requestId:n,messageType:`rpc`,...this.createRelayBusinessPayloadFields(i,{frameType:`rpc.error`,messageType:`rpc`,requestId:n},{...r.success?r.data:EM(`INTERNAL`,500,String(e)),method:a.method})})}return}if(this.dependencies.relayTransportSecurityLevel===`e2ee-relay`){this.sendSecureError(t,r.deviceId,`transcript_invalid`,`secure handshake not ready`);return}if(e.payload===void 0){this.dependencies.sendFrame({type:`rpc.error`,gatewayId:this.dependencies.gatewayId,mobileId:t,requestId:n,messageType:`rpc`,payload:EM(`BAD_REQUEST`,400,`plaintext relay payload missing`)});return}let i=np.parse(e.payload);try{let e=await this.dependencies.handleRpcRequest(i,{mobileId:t,deviceId:r.deviceId});this.dependencies.sendFrame(Cp.parse({type:`rpc.response`,gatewayId:this.dependencies.gatewayId,mobileId:t,requestId:n,messageType:`rpc`,...this.createRelayBusinessPayloadFields(r,{frameType:`rpc.response`,messageType:`rpc`,requestId:n},e)}))}catch(e){let a=ap.safeParse(e);this.dependencies.sendFrame({type:`rpc.error`,gatewayId:this.dependencies.gatewayId,mobileId:t,requestId:n,messageType:`rpc`,...this.createRelayBusinessPayloadFields(r,{frameType:`rpc.error`,messageType:`rpc`,requestId:n},{...a.success?a.data:EM(`INTERNAL`,500,String(e)),method:i.method})})}}async handleSecureClientHello(e,t){if(!e){this.sendRelayError({code:`BAD_REQUEST`,status:400,message:`secure.client_hello frame requires mobileId`});return}let n=this.mobileConnections.get(e);if(!n){this.sendRelayError({mobileId:e,code:`BAD_REQUEST`,status:400,message:`Unknown mobile ${e}`});return}if(n.handshake.status!==`awaiting_client_hello`){this.sendSecureError(e,n.deviceId,`counter_replay`,`duplicate secure.client_hello`);return}if(t.deviceId!==n.deviceId){this.sendSecureError(e,n.deviceId,`identity_mismatch`,`deviceId does not match relay token`);return}if(t.version!==1||t.cipherSuite!==`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`){this.sendSecureError(e,n.deviceId,`unsupported_version`,`unsupported secure handshake version`);return}let r=uM({gatewayId:this.dependencies.gatewayId,gatewayIdentity:this.dependencies.gatewayIdentity,privateKeyPem:this.dependencies.gatewayIdentityPrivateKeyPem,clientHello:t});n.handshake={status:`awaiting_client_auth`,clientHello:t,gatewayHello:r.gatewayHello,gatewayEphemeralPrivateKey:r.gatewayEphemeralPrivateKey},this.mobileConnections.set(e,n),this.dependencies.sendFrame(Cp.parse({type:`secure.gateway_hello`,gatewayId:this.dependencies.gatewayId,mobileId:e,messageType:`system`,payload:r.gatewayHello}))}async handleSecureClientAuth(e,t){if(!e){this.sendRelayError({code:`BAD_REQUEST`,status:400,message:`secure.client_auth frame requires mobileId`});return}let n=this.mobileConnections.get(e);if(!n){this.sendRelayError({mobileId:e,code:`BAD_REQUEST`,status:400,message:`Unknown mobile ${e}`});return}if(n.handshake.status===`ready`){this.sendSecureError(e,n.deviceId,`counter_replay`,`duplicate secure.client_auth`);return}if(n.handshake.status!==`awaiting_client_auth`){this.sendSecureError(e,n.deviceId,`transcript_invalid`,`secure.client_hello missing`);return}try{dM({gatewayId:this.dependencies.gatewayId,clientHello:n.handshake.clientHello,gatewayHello:n.handshake.gatewayHello,clientAuth:t})}catch(t){this.sendSecureError(e,n.deviceId,OM(t),String(t));return}try{let r=await this.dependencies.verifyDeviceIdentityBinding(n.deviceId,n.handshake.clientHello.deviceIdentity),i=fM({gatewayId:this.dependencies.gatewayId,clientHello:n.handshake.clientHello,gatewayHello:n.handshake.gatewayHello,clientAuth:t,gatewayEphemeralPrivateKey:n.handshake.gatewayEphemeralPrivateKey});this.ensureReadyMobileClient(n),n.handshake={status:`ready`,clientHello:n.handshake.clientHello,gatewayHello:n.handshake.gatewayHello,session:i},this.mobileConnections.set(e,n),this.dependencies.sendFrame(Cp.parse({type:`secure.ready`,gatewayId:this.dependencies.gatewayId,mobileId:e,messageType:`system`,payload:{version:1,securityLevel:`e2ee-relay`,cipherSuite:i.cipherSuite,gatewayId:this.dependencies.gatewayId,deviceId:n.deviceId,keyEpoch:i.keyEpoch,deviceIdentityFingerprint:r.publicKeyFingerprint??n.handshake.clientHello.deviceIdentity.publicKeyFingerprint,deviceIdentityStatus:r.identityStatus??`active`}}))}catch(t){this.sendSecureError(e,n.deviceId,AM(t),String(t))}}ensureReadyMobileClient(e){if(e.clientId&&e.socket)return;let t=new bM(t=>{try{let n=Cp.parse({type:`to_mobile`,gatewayId:this.dependencies.gatewayId,mobileId:e.mobileId,messageType:`event`,...this.createRelayBusinessPayloadFields(e,{frameType:`to_mobile`,messageType:`event`},t)});this.dependencies.sendFrame(n)}catch(t){this.sendSecureError(e.mobileId,e.deviceId,kM(t),`relay secure payload failed: ${String(t)}`)}}),n=this.dependencies.sessionHub.addClient(e.deviceId,t);e.socket=t,e.clientId=n}sendSecureError(e,t,n,r){this.dependencies.sendFrame({type:`secure.error`,gatewayId:this.dependencies.gatewayId,mobileId:e,messageType:`system`,payload:pM({gatewayId:this.dependencies.gatewayId,deviceId:t,code:n,message:r,retryable:n===`transcript_invalid`||n===`unsupported_version`||n===`key_epoch_mismatch`})})}sendRelayError(e){this.dependencies.sendFrame({type:`relay.error`,gatewayId:this.dependencies.gatewayId,...e.mobileId?{mobileId:e.mobileId}:{},...e.requestId?{requestId:e.requestId}:{},messageType:`system`,payload:EM(e.code,e.status,e.message)})}decodeRelayBusinessPayload(e){if(e.payload!==void 0)return this.sendSecureError(e.mobileId,e.connection.deviceId,`decrypt_failed`,`relay secure payload must be encrypted`),null;if(!e.encryptedPayload)return this.sendSecureError(e.mobileId,e.connection.deviceId,`decrypt_failed`,`relay secure payload missing`),null;try{return Fp({session:e.connection.handshake.session,metadata:{frameType:e.frameType,messageType:e.messageType,gatewayId:this.dependencies.gatewayId,...e.requestId?{requestId:e.requestId}:{}},encryptedPayload:e.encryptedPayload,parse:e.parse})}catch(t){return this.sendSecureError(e.mobileId,e.connection.deviceId,kM(t),`relay secure payload failed: ${String(t)}`),null}}createRelayBusinessPayloadFields(e,t,n){let r=bf({payload:n,compressionThresholdBytes:SM(t.frameType,n)?yM:void 0});if(CM(n)){let i=wM(n),a=TM(n);vM(`relay.snapshot.chunk.outbound`,{mobileId:e.mobileId,deviceId:e.deviceId,frameType:t.frameType,messageType:t.messageType,sessionId:n.sessionId,projectId:n.projectId??null,snapshotId:i.snapshotId??a?.snapshotId??null,chunkIndex:i.chunkIndex??a?.chunkIndex??null,totalChunks:i.totalChunks??a?.totalChunks??null,snapshotFormat:n.kind===`session.readable.snapshot.chunk`?`readable`:a?`raw+readable`:`raw`,chunkEventCount:i.events.length||null,chunkTimelineItemCount:a?.timelineItems?.length??null,handshakeStatus:e.handshake.status,payloadTransport:e.handshake.status===`ready`?`encryptedPayload`:r.compression===`gzip`?`compressedPayload`:`payload`,compression:r.compression,compressionThresholdBytes:yM,uncompressedByteLength:r.uncompressedByteLength,compressedByteLength:r.compressedByteLength})}if(e.handshake.status!==`ready`){let e=xf(r);return e?{compressedPayload:e}:{payload:n}}return{encryptedPayload:Pp({session:e.handshake.session,metadata:{frameType:t.frameType,messageType:t.messageType,gatewayId:this.dependencies.gatewayId,...t.requestId?{requestId:t.requestId}:{}},preparedPayload:r})}}};function SM(e,t){return e===`to_mobile`&&CM(t)}function CM(e){return typeof e==`object`&&!!e&&`kind`in e&&(e.kind===`session.stream.snapshot.chunk`||e.kind===`session.readable.snapshot.chunk`)}function wM(e){return e.kind===`session.readable.snapshot.chunk`?{snapshotId:e.payload.readable.snapshotId,chunkIndex:e.payload.readable.chunkIndex,totalChunks:e.payload.readable.totalChunks,events:[]}:e.payload.raw}function TM(e){return e.kind===`session.readable.snapshot.chunk`||`readable`in e.payload?e.payload.readable:void 0}function EM(e,t,n){return ap.parse({code:e,status:t,message:n})}function DM(e,t){if(kT(e))switch(e.code){case`PAIRING_CODE_INVALID`:case`PAIRING_CODE_EXPIRED`:return{code:`BAD_REQUEST`,status:e.status,message:String(e)};case`REFRESH_TOKEN_REVOKED`:case`DEVICE_REVOKED`:case`REFRESH_TOKEN_DEVICE_MISMATCH`:case`PREVIEW_TICKET_INVALID`:case`PREVIEW_TICKET_EXPIRED`:return{code:`UNAUTHORIZED`,status:e.status,message:String(e)};default:return{code:e.status>=500?`INTERNAL`:`BAD_REQUEST`,status:e.status,message:String(e)}}let n=String(e),r=jM(e);return t===`pairing.claim`&&(r===`Invalid pairing code`||r===`Pairing code expired`)?{code:`BAD_REQUEST`,status:400,message:n}:t===`auth.refresh`&&(r===`Refresh token revoked`||r===`Device revoked`||r===`Device revoked or not found`||r===`Refresh token device mismatch`||YT(e))||t===`file.content`&&YT(e)?{code:`UNAUTHORIZED`,status:401,message:n}:{code:`INTERNAL`,status:500,message:n}}function OM(e){return MM(e,[`identity_mismatch`,`counter_replay`,`unsupported_version`,`transcript_invalid`])??`transcript_invalid`}function kM(e){return MM(e,[`counter_gap_too_large`,`counter_replay`,`key_epoch_mismatch`,`decrypt_failed`])??`decrypt_failed`}function AM(e){if(kT(e))switch(e.code){case`DEVICE_REVOKED`:return`device_revoked`;case`DEVICE_IDENTITY_NOT_REGISTERED`:case`DEVICE_IDENTITY_MISMATCH`:return`identity_mismatch`;default:return`transcript_invalid`}let t=jM(e);return t===`Device revoked`||t===`Device revoked or not found`?`device_revoked`:t===`Device identity mismatch`||t===`Device identity not registered`?`identity_mismatch`:`transcript_invalid`}function jM(e){return e instanceof Error?e.message:typeof e==`string`?e:String(e)}function MM(e,t){let n=jM(e);return t.find(e=>e===n)}function NM(e){return e?e.readyState:null}function PM(e){return(typeof e.extensions==`string`?e.extensions.trim():``)||null}var FM=class{logger;reconnectBaseDelayMs;reconnectMaxDelayMs;heartbeatIntervalMs;heartbeatTimeoutMs;webSocketFactory;socket;reconnectTimer;heartbeatIntervalTimer;heartbeatTimeoutTimer;reconnectAttempt=0;connectAttemptId=0;state=`idle`;stopped=!1;constructor(e){this.options=e,this.logger=e.logger??{},this.reconnectBaseDelayMs=e.reconnectBaseDelayMs??1e3,this.reconnectMaxDelayMs=e.reconnectMaxDelayMs??15e3,this.heartbeatIntervalMs=e.heartbeatIntervalMs??15e3,this.heartbeatTimeoutMs=e.heartbeatTimeoutMs??2e4,this.webSocketFactory=e.webSocketFactory??RM}start(){this.stopped&&=!1,!(this.socket||this.reconnectTimer)&&this.connect()}close(){this.stopped=!0,this.state=`stopped`,this.reconnectTimer&&=(clearTimeout(this.reconnectTimer),void 0);let e=this.socket;if(this.socket=void 0,this.stopHeartbeat(),!e)return;let t=NM(e);try{e.close(1e3,`Gateway shutting down`)}catch(n){this.logger.error?.({err:n,readyState:t},`relay websocket close threw during shutdown`);try{e.terminate()}catch(e){this.logger.error?.({err:e,readyState:t},`relay websocket terminate threw after close failure`)}}}isConnected(){let e=this.socket;return this.state===`connected`&&!!e&&e.readyState===e.OPEN}send(e){let t=this.socket;if(!t||t.readyState!==t.OPEN)return!1;let n=Cp.parse(e);return t.send(JSON.stringify(n)),!0}async connect(){if(this.stopped)return;let e=++this.connectAttemptId,t;try{t=await this.resolveGatewayAccessToken()}catch(e){this.state=`idle`,this.logger.warn?.({err:e},`failed to resolve relay gateway access token`),this.scheduleReconnect();return}if(this.stopped||e!==this.connectAttemptId)return;let n=IM(this.options.relayUrl);this.state=`connecting`;let r=this.webSocketFactory(n);this.socket=r,r.on(`open`,()=>{this.socket!==r||this.stopped||(this.reconnectAttempt=0,this.state=`connected`,this.startHeartbeat(r),this.logger.info?.({relayUrl:this.options.relayUrl,gatewayId:this.options.gatewayId,negotiatedExtensions:PM(r)},`relay gateway websocket connected`),this.send({type:`gateway.hello`,gatewayId:this.options.gatewayId,messageType:`system`,payload:{name:this.options.machineName,relayBaseUrl:this.options.relayUrl,directBaseUrls:this.options.directBaseUrls,transportSecurityLevel:this.options.relayTransportSecurityLevel,gatewayIdentity:this.options.gatewayIdentity,gatewayAccessToken:t,connectedAt:new Date().toISOString()}}))}),r.on(`message`,e=>{if(this.socket===r){this.ackHeartbeat(r);try{let t=Cp.parse(JSON.parse(LM(e)));Promise.resolve(this.options.onFrame(t)).catch(e=>{this.logger.error?.({err:e},`failed to handle relay frame`)})}catch(e){this.logger.warn?.({err:e},`failed to parse relay frame from relay`)}}}),r.on(`error`,e=>{this.socket===r&&this.logger.warn?.({err:e},`relay websocket emitted error`)}),r.on(`pong`,()=>{this.socket===r&&this.ackHeartbeat(r)}),r.on(`close`,(e,t)=>{if(this.socket===r){if(this.socket=void 0,this.stopHeartbeat(),this.stopped){this.state=`stopped`;return}this.logger.warn?.({relayUrl:this.options.relayUrl,gatewayId:this.options.gatewayId,closeCode:e,closeReason:t.toString(`utf8`)},`relay websocket closed`),this.state=`idle`,this.scheduleReconnect()}})}async resolveGatewayAccessToken(){let e=this.options.relayGatewayAccessToken.trim();if(e)return e;let t=this.options.resolveRelayGatewayAccessToken;if(t)return t();throw Error(`Gateway relay access token is not configured`)}scheduleReconnect(){if(this.stopped||this.reconnectTimer)return;let e=Math.min(this.reconnectMaxDelayMs,this.reconnectBaseDelayMs*Math.max(1,2**this.reconnectAttempt));this.reconnectAttempt+=1,this.logger.info?.({delayMs:e},`scheduling relay reconnect`),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=void 0,this.connect()},e)}startHeartbeat(e){this.stopHeartbeat(),this.heartbeatIntervalTimer=setInterval(()=>{if(!(this.socket!==e||this.stopped)&&!(e.readyState!==e.OPEN||this.heartbeatTimeoutTimer)){try{e.ping()}catch(t){this.logger.warn?.({err:t},`failed to send relay websocket heartbeat ping`),e.terminate();return}this.heartbeatTimeoutTimer=setTimeout(()=>{this.heartbeatTimeoutTimer=void 0,!(this.socket!==e||this.stopped||e.readyState!==e.OPEN)&&(this.logger.warn?.({relayUrl:this.options.relayUrl,gatewayId:this.options.gatewayId,heartbeatTimeoutMs:this.heartbeatTimeoutMs},`relay websocket heartbeat timed out`),e.terminate())},this.heartbeatTimeoutMs)}},this.heartbeatIntervalMs)}ackHeartbeat(e){this.socket===e&&(this.heartbeatTimeoutTimer&&=(clearTimeout(this.heartbeatTimeoutTimer),void 0))}stopHeartbeat(){this.heartbeatIntervalTimer&&=(clearInterval(this.heartbeatIntervalTimer),void 0),this.heartbeatTimeoutTimer&&=(clearTimeout(this.heartbeatTimeoutTimer),void 0)}};function IM(e){let t=new URL(e);return t.protocol===`http:`?t.protocol=`ws:`:t.protocol===`https:`&&(t.protocol=`wss:`),t.pathname=`/ws/gateway`,t.toString()}function LM(e){return typeof e==`string`?e:e instanceof ArrayBuffer?Buffer.from(e).toString(`utf8`):ArrayBuffer.isView(e)?Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString(`utf8`):Array.isArray(e)&&e.every(e=>ArrayBuffer.isView(e))?Buffer.concat(e.map(e=>Buffer.from(e.buffer,e.byteOffset,e.byteLength))).toString(`utf8`):String(e)}function RM(e){return new sO(e,void 0,{perMessageDeflate:!0})}function zM(e){let t={gatewayId:e.gatewayId.trim(),gatewayIdentity:e.gatewayIdentity,requestedAt:e.requestedAt??new Date().toISOString()};if(!t.gatewayId)throw Error(`gatewayId must not be empty when requesting a guest relay gateway access token.`);return{grantType:`guest`,payload:t,signatureAlgorithm:`ed25519`,signature:(0,l.sign)(null,Buffer.from(wp(t),`utf8`),(0,l.createPrivateKey)(e.privateKeyPem)).toString(`base64`)}}async function BM(e){let t=e.fetchImpl??globalThis.fetch;if(!t)throw Error(`fetch is not available when requesting a guest relay gateway access token.`);let n=await t(VM(e.relayUrl),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(zM({gatewayId:e.gatewayId,gatewayIdentity:e.gatewayIdentity,privateKeyPem:e.privateKeyPem}))}),r=await n.text();if(!n.ok)throw Error(`Failed to request a guest relay gateway access token (${n.status}): ${r}`);return dp.parse(JSON.parse(r)).token}function VM(e){let t=new URL(e);return t.protocol===`ws:`?t.protocol=`http:`:t.protocol===`wss:`&&(t.protocol=`https:`),t.pathname=`/api/gateway-token/guest`,t.search=``,t.toString()}function HM(e){return e?.trim()||void 0}function UM(e){if(!e)return;let t=e.codex?.sandboxMode??null;return{codex:e.codex?{approvalPolicy:Ga(t),sandboxMode:t}:void 0,claude:e.claude?{permissionMode:e.claude.permissionMode}:void 0}}function WM(e,t){let n=t.defaults.sandboxMode??null;return{modeDefault:`default`,model:HM(t.defaults.model),reasoningEffort:t.defaults.reasoningEffort,execution:e===`codex`?{codex:{approvalPolicy:Ga(n),sandboxMode:n}}:{claude:{permissionMode:t.defaults.permissionMode??null}}}}function GM(e){return{mode:`default`,model:null,reasoningEffort:null,execution:e===`codex`?{codex:{approvalPolicy:null,sandboxMode:null}}:{claude:{permissionMode:null}}}}function KM(e,t){let n=GM(e);if(!t)return n;if(e===`codex`){let e=t.execution?.codex?.sandboxMode??null;return{mode:t.mode,model:t.model,reasoningEffort:t.reasoningEffort,execution:{codex:{approvalPolicy:Ga(e),sandboxMode:e}}}}return{mode:t.mode,model:t.model,reasoningEffort:t.reasoningEffort,execution:{claude:{permissionMode:t.execution?.claude?.permissionMode??null}}}}function qM(e,t){return e===`claude`&&t?.permissionMode===`plan`?`plan`:`default`}function JM(e){let t=KM(e.provider,e.sessionTurnConfig);return e.sessionTurnConfig!==void 0||HM(e.legacyModel)!==void 0||e.legacySessionConfig!==void 0?YM({provider:e.provider,providerDefaults:{modeDefault:`default`},currentSessionTurnConfig:t,legacyModel:e.legacyModel,legacySessionConfig:e.legacySessionConfig}).sessionTurnConfig:t}function YM(e){let t=KM(e.provider,e.currentSessionTurnConfig),n=e.mode??(e.legacySessionConfig?qM(e.provider,e.legacySessionConfig):void 0)??t.mode??e.providerDefaults.modeDefault,r=KM(e.provider,{...t,mode:n});if(e.config){if(e.config.model!==void 0&&(r.model=e.config.model),e.config.reasoningEffort!==void 0&&(r.reasoningEffort=e.config.reasoningEffort),e.provider===`codex`&&e.config.execution?.codex){let t=e.config.execution.codex.sandboxMode;r.execution={codex:{approvalPolicy:Ga(t),sandboxMode:t}}}e.provider===`claude`&&e.config.execution?.claude&&(r.execution={claude:{permissionMode:e.config.execution.claude.permissionMode}})}let i=HM(e.legacyModel);if(i&&(r.model=i),e.legacySessionConfig?.reasoningEffort!==void 0&&(r.reasoningEffort=e.legacySessionConfig.reasoningEffort),e.provider===`codex`&&e.legacySessionConfig){let t=e.legacySessionConfig.sandboxMode??r.execution?.codex?.sandboxMode??null;r.execution={codex:{approvalPolicy:Ga(t),sandboxMode:t}}}e.provider===`claude`&&e.legacySessionConfig&&(r.execution={claude:{permissionMode:e.legacySessionConfig.permissionMode===`plan`?r.execution?.claude?.permissionMode??null:e.legacySessionConfig.permissionMode??r.execution?.claude?.permissionMode??null}});let a=r.model??HM(e.providerDefaults.model),o={},s=r.reasoningEffort??e.providerDefaults.reasoningEffort;if(s&&(o.reasoningEffort=s),e.provider===`codex`){let t=r.execution?.codex?.sandboxMode??e.providerDefaults.execution?.codex?.sandboxMode??void 0,n=Ga(t);n&&(o.approvalPolicy=n),t&&(o.sandboxMode=t)}else{let t=n===`plan`?`plan`:r.execution?.claude?.permissionMode??e.providerDefaults.execution?.claude?.permissionMode??void 0;t&&(o.permissionMode=t)}return{mode:n,model:a,sessionConfig:o,sessionTurnConfig:{mode:r.mode,model:r.model,reasoningEffort:r.reasoningEffort,execution:UM(r.execution)}}}function XM(e,t){let n=Ha.safeParse({provider:e,...t&&typeof t==`object`&&!Array.isArray(t)?t:{}});if(!n.success)return;let{provider:r,...i}=Ka(n.data);return i}function ZM(e,t,n){return e===`codex`&&(!(`codexAppServerTransport`in n)||n.codexAppServerTransport===void 0)&&t&&`codexAppServerTransport`in t&&t.codexAppServerTransport?{...n,codexAppServerTransport:t.codexAppServerTransport}:n}var QM=class{filePath;ready;preferences={};writeQueue=Promise.resolve();constructor(e){this.filePath=p.default.join(e,`provider-execution-preferences.json`),this.ready=this.loadFromDisk()}async get(e){await this.ready;let t=this.preferences[e];return t?{provider:e,...t}:null}async set(e){await this.ready;let{provider:t,...n}=Ka(e),r=n;return await this.enqueueWrite(async()=>{let e=this.preferences[t],i=ZM(t,e,n);r=i,this.preferences[t]=i;try{await this.persist()}catch(n){throw e?this.preferences[t]=e:delete this.preferences[t],n}}),{provider:t,...r}}async loadFromDisk(){await d.default.mkdir(p.default.dirname(this.filePath),{recursive:!0});let e;try{e=await d.default.readFile(this.filePath,`utf8`)}catch(e){if(e?.code===`ENOENT`)return;throw e}let t;try{t=JSON.parse(e)}catch{return}if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t.providers;if(!n||typeof n!=`object`||Array.isArray(n))return;let r=n;for(let e of[`codex`,`claude`]){let t=XM(e,r[e]);t&&(this.preferences[e]=t)}}async persist(){let e={v:1,providers:this.preferences};await d.default.writeFile(this.filePath,`${JSON.stringify(e,null,2)}\n`,`utf8`)}async enqueueWrite(e){let t=this.writeQueue.then(e,e);this.writeQueue=t.catch(()=>{}),await t}};const $M=[],eN=[{id:`default`,label:`Default`,isDefault:!0,supportedReasoningEfforts:[`low`,`medium`,`high`,`max`]}],tN=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`],nN=Ia.options,rN=[`read-only`,`workspace-write`,`danger-full-access`],iN=[`websocket`,`stdio`],aN=[`default`,`acceptEdits`,`bypassPermissions`,`plan`,`dontAsk`],oN={codex:[{version:`codex-mobile-v1`,defaults:{reasoningEffort:`medium`,approvalPolicy:`on-request`,sandboxMode:`workspace-write`}},{version:`codex-mobile-v2`,defaults:{reasoningEffort:`low`,approvalPolicy:`on-request`,sandboxMode:`read-only`}}],claude:[{version:`claude-mobile-v1`,defaults:{model:`default`}}]};function sN(e,t){let n=t?.trim().toLowerCase();return n?(oN[e]??[]).find(e=>n===e.version.toLowerCase())??null:null}function cN(e,t,n){return e.some(e=>e.id===t)?e.map(e=>({...e,isDefault:e.id===t})):[{id:t,label:t,isDefault:!0,...n===`codex`?{supportedReasoningEfforts:tN}:{}},...e.map(e=>({...e,isDefault:!1}))]}function lN(e){return e===`none`||e===`minimal`||e===`low`||e===`medium`||e===`high`||e===`xhigh`||e===`max`?e:null}function uN(e){let t=new Set;for(let n of e){let e=lN(n);e&&t.add(e)}return[...t]}function dN(e){return e?.trim()||void 0}function fN(e){let t=dN(e.runtimeModel);if(t)return t;let n=dN(e.discoveredModel);if(n)return n;let r=dN(e.existingModel),i=dN(e.modelProvider)?.toLowerCase();if(r&&(!i||r.toLowerCase()!==i))return r}function pN(e){let t=e.filter(e=>!!e.id).map(e=>({id:e.id,label:e.displayName||e.model||e.id,description:e.description,isDefault:e.isDefault,supportedReasoningEfforts:uN(e.supportedReasoningEfforts)}));return t.length===0?$M:(t.some(e=>e.isDefault)||(t[0]={...t[0],isDefault:!0}),t)}async function mN(e){let t=Date.now();try{let n=pN(await Kk());return e?.info?.({provider:`codex`,durationMs:Date.now()-t,modelCount:n.length},`provider capabilities codex model load completed`),n}catch(n){return e?.warn?.({provider:`codex`,durationMs:Date.now()-t,err:n},`provider capabilities codex model load failed`),null}}async function hN(e){let t=Date.now();try{let n=await import(`@anthropic-ai/claude-agent-sdk`),r=n.query??n.default?.query;if(typeof r!=`function`)return null;let i=r,a=p.default.join(Eh(),`claude-capability-probe`);await d.default.mkdir(a,{recursive:!0,mode:448});let o=i({prompt:`/clear`,options:{cwd:a,permissionMode:`plan`,maxTurns:1,includePartialMessages:!1}});try{let n=await o.supportedModels(),r=[];for(let e of n){let t=typeof e.value==`string`?e.value:``;if(!t)continue;let n=Array.isArray(e.supportedEffortLevels)&&e.supportedEffortLevels.length>0,i=_N(e.description,e.displayName,t),a=e.supportsEffort===!1?[]:e.supportsEffort||n?uN(e.supportedEffortLevels??[]):i===`haiku`?[]:void 0;r.push({id:t,label:e.displayName||t,description:typeof e.description==`string`&&e.description.trim()?e.description.trim():void 0,isDefault:t===`default`,supportedReasoningEfforts:a})}return r.length===0?null:(r.some(e=>e.isDefault)||(r[0]={...r[0],isDefault:!0}),e?.info?.({provider:`claude`,durationMs:Date.now()-t,modelCount:r.length},`provider capabilities claude model load completed`),r)}finally{o.close()}}catch(n){return e?.warn?.({provider:`claude`,durationMs:Date.now()-t,err:n},`provider capabilities claude model load failed`),null}}function gN(e){let t=(e.find(e=>e.isDefault)??e[0])?.supportedReasoningEfforts??[];if(t.includes(`medium`))return`medium`;if(t.includes(`high`))return`high`;if(t.length>0)return t[0]}function _N(...e){for(let t of e){let e=t?.trim().toLowerCase();if(e){if(e.includes(`haiku`))return`haiku`;if(e.includes(`opus`))return`opus`;if(e.includes(`sonnet`)||e.includes(`sonnect`))return`sonnet`}}}var vN=class{cache=new Map;inFlight=new Map;cacheEpochByProvider=new Map;executionPreferences;constructor(e){this.options=e,this.executionPreferences=new QM(this.options.providerExecutionPreferencesDir??p.default.join(Eh(),`settings`))}async getProviderCapabilities(e,t,n){return(await this.resolveProviderCapabilities(e,t,n)).capabilities}async getAgentConfig(e,t){let n=await this.resolveProviderCapabilities(e,t?.projectId,t?.agentVersion);return{agent:{provider:e,requestedVersion:t?.agentVersion?.trim()||null,resolvedVersion:n.resolvedAgentVersion},capabilities:n.capabilities}}async warmStartupProviderCapabilities(){if(!this.options.preferNativeProviders)return;let e=oN.claude.length>0?oN.claude.map(e=>e.version):[void 0];await Promise.allSettled(e.map(e=>this.resolveProviderCapabilities(`claude`,void 0,e)))}async getProviderDefaults(e,t,n){return WM(e,await this.getProviderCapabilities(e,t,n))}async updateProviderExecutionDefaults(e){let t=await this.executionPreferences.set(e);return this.invalidateProviderCache(e.provider),t}async resolveProviderCapabilities(e,t,n){if(t&&!await this.options.projectStore.getById(t))throw LT(t);let r=sN(e,n),i=r?.version??`default`,a=`${e}::${i}`,o=this.getProviderCacheEpoch(e),s={provider:e,projectId:t??null,requestedAgentVersion:n?.trim()||null,resolvedAgentVersion:i},c=Date.now(),l=this.cache.get(a);if(l){if(l.expiresAt>c)return this.options.logger?.info?.({...s,cacheStatus:`hit`,source:l.value.capabilities.source,modelCount:l.value.capabilities.models.length},`provider capabilities cache hit`),l.value;this.cache.delete(a)}let u=this.inFlight.get(a);if(u)return this.options.logger?.info?.({...s,cacheStatus:`in_flight`},`provider capabilities awaiting in-flight load`),u;let d=Date.now(),f=(async()=>{let t=$A(e,{preferNative:this.options.preferNativeProviders,requireNative:!1}),n=Date.now(),a=this.options.preferNativeProviders?await t.isNativeAvailable().catch(()=>!1):!1;this.options.logger?.info?.({...s,cacheStatus:`miss`,nativeAvailable:a,durationMs:Date.now()-n},`provider capabilities native availability checked`);let o=a?`native`:`fallback`,c=e===`codex`&&a?await mN(this.options.logger)??$M:$M,l=e===`claude`&&a?await hN(this.options.logger)??eN:eN,u=uN(l.flatMap(e=>e.supportedReasoningEfforts??[])),f=e===`codex`?{provider:e,source:o,models:c,support:{reasoningEffort:!0,approvalPolicy:!0,sandboxMode:!0,permissionMode:!1,imageInput:a,codexAppServerTransport:!0},options:{reasoningEfforts:tN,approvalPolicies:nN,sandboxModes:rN,permissionModes:[],codexAppServerTransports:[...iN]},defaults:{model:c.find(e=>e.isDefault)?.id??c[0]?.id,reasoningEffort:`medium`,approvalPolicy:`on-request`,sandboxMode:`workspace-write`}}:{provider:e,source:o,models:l,support:{reasoningEffort:u.length>0,approvalPolicy:!1,sandboxMode:!1,permissionMode:!0,imageInput:a},options:{reasoningEfforts:u,approvalPolicies:[],sandboxModes:[],permissionModes:aN},defaults:{model:l.find(e=>e.isDefault)?.id??l[0]?.id,reasoningEffort:gN(l),permissionMode:`default`}},p=await this.executionPreferences.get(e),m={...f.defaults,...r?.defaults??{},...p?.provider===`codex`?{approvalPolicy:p.approvalPolicy,sandboxMode:p.sandboxMode,...p.codexAppServerTransport?{codexAppServerTransport:p.codexAppServerTransport}:{}}:{},...p?.provider===`claude`?{permissionMode:p.permissionMode}:{}},h=e===`codex`?{...m,approvalPolicy:Ga(m.sandboxMode)}:m,g=h.model?.trim(),_=o===`native`?f.models:g?cN(f.models,g,e):f.models;if(!r){let e={capabilities:{...f,models:_,defaults:h},resolvedAgentVersion:i};return this.options.logger?.info?.({...s,cacheStatus:`miss`,durationMs:Date.now()-d,source:e.capabilities.source,modelCount:e.capabilities.models.length},`provider capabilities resolved`),e}let v={capabilities:{...f,models:_,defaults:h},resolvedAgentVersion:r.version};return this.options.logger?.info?.({...s,cacheStatus:`miss`,durationMs:Date.now()-d,source:v.capabilities.source,modelCount:v.capabilities.models.length},`provider capabilities resolved`),v})();this.inFlight.set(a,f);try{let t=await f;return this.getProviderCacheEpoch(e)===o&&this.cache.set(a,{value:t,expiresAt:Date.now()+864e5}),t}catch(e){throw this.options.logger?.warn?.({...s,cacheStatus:`miss`,durationMs:Date.now()-d,err:e},`provider capabilities resolution failed`),e}finally{this.inFlight.get(a)===f&&this.inFlight.delete(a)}}invalidateProviderCache(e){this.cacheEpochByProvider.set(e,this.getProviderCacheEpoch(e)+1);for(let t of[...this.cache.keys()])t.startsWith(`${e}::`)&&this.cache.delete(t);for(let t of[...this.inFlight.keys()])t.startsWith(`${e}::`)&&this.inFlight.delete(t)}getProviderCacheEpoch(e){return this.cacheEpochByProvider.get(e)??0}};const yN=`.meta.json`;function bN(){let e=process.env.CODEX_HOME?.trim();return e?p.default.resolve(e):p.default.join(f.default.homedir(),`.codex`)}function xN(){return p.default.join(bN(),`auth.json`)}function SN(){return p.default.join(Eh(),`codex-accounts`)}var CN=class{currentAuthFilePath;snapshotsDir;readAccountMetadata;constructor(e={}){this.currentAuthFilePath=e.currentAuthFilePath??xN(),this.snapshotsDir=e.snapshotsDir??SN(),this.readAccountMetadata=e.readAccountMetadata??EN}async getAccountsOverview(){let e=await this.getCurrentAccount();return{current:e,savedAccounts:await this.listSavedAccounts(e?.accountId??null)}}async getCurrentAccount(){let e=await this.readCurrentAuthFileOrNull();if(!e)return null;let t=await this.readAccountMetadataOrNull();if(!t)return null;let n=t.accountType===`chatgpt`?await this.resolveSnapshotStatus(t.accountId,e.canonicalContent):`missing`;return{accountId:t.accountId,accountType:t.accountType,authMode:e.authMode,planType:t.planType,lastRefreshAt:e.lastRefreshAt,hasSavedSnapshot:n!==`missing`,snapshotStatus:n,rateLimits:t.rateLimits}}async saveCurrentAccount(){let e=await this.readCurrentAuthFile(),t=await this.readSnapshotSupportedAccountMetadata();return await this.writeSnapshot(t.accountId,e,t),{current:{accountId:t.accountId,accountType:t.accountType,authMode:e.authMode,planType:t.planType,lastRefreshAt:e.lastRefreshAt,hasSavedSnapshot:!0,snapshotStatus:`current`,rateLimits:t.rateLimits},savedAccounts:await this.listSavedAccounts(t.accountId)}}async applySavedAccount(e){let t=await UN(this.currentAuthFilePath),n=await this.readSavedSnapshot(e);return await WN(this.currentAuthFilePath,n.rawContent),{previousRawContent:t}}async deleteSavedAccount(e){let t=this.getSnapshotPath(e);if(await UN(t)===null)throw UT(e);return await Promise.all([d.default.rm(t,{force:!0}),d.default.rm(this.getSnapshotMetadataPath(e),{force:!0})]),this.getAccountsOverview()}async restoreCurrentAuthFile(e){await WN(this.currentAuthFilePath,e)}async listSavedAccounts(e){let t=await HN(this.snapshotsDir);return(await Promise.all(t.filter(e=>e.isFile()&&VN(e.name)).map(async t=>{let n=BN(t.name);if(!n)return null;let r=p.default.join(this.snapshotsDir,t.name);try{let t=wN(await d.default.readFile(r,`utf8`),r),i=await this.readSnapshotMetadata(n),a=await d.default.stat(r);return{accountId:i?.accountId??n,accountType:i?.accountType??`unknown`,authMode:t.authMode,planType:i?.planType??null,lastRefreshAt:t.lastRefreshAt,savedAt:i?.savedAt??a.mtime.toISOString(),isCurrent:e===n,rateLimits:i?.rateLimits??null}}catch{return null}}))).filter(e=>e!==null).sort((e,t)=>e.isCurrent===t.isCurrent?t.savedAt.localeCompare(e.savedAt):e.isCurrent?-1:1)}async resolveSnapshotStatus(e,t){let n=await UN(this.getSnapshotPath(e));if(n===null)return`missing`;try{return wN(n,this.getSnapshotPath(e)).canonicalContent===t?`current`:`stale`}catch{return`stale`}}async writeSnapshot(e,t,n){let r=new Date().toISOString();await WN(this.getSnapshotPath(e),t.rawContent),await WN(this.getSnapshotMetadataPath(e),JSON.stringify({accountId:n.accountId,accountType:n.accountType,planType:n.planType,rateLimits:n.rateLimits,savedAt:r},null,2))}async readSavedSnapshot(e){let t=this.getSnapshotPath(e),n=await UN(t);if(n===null)throw UT(e);return wN(n,t)}async readSnapshotMetadata(e){let t=await UN(this.getSnapshotMetadataPath(e));if(t===null)return null;try{return TN(t)}catch{return null}}async readCurrentAuthFile(){let e=await this.readCurrentAuthFileOrNull();if(!e)throw WT(`Current Codex auth.json is missing or unreadable`);return e}async readCurrentAuthFileOrNull(){let e=await UN(this.currentAuthFilePath);if(e===null)return null;try{return wN(e,this.currentAuthFilePath)}catch{return null}}async readAccountMetadataOrNull(){try{return await this.readAccountMetadata()}catch{return null}}async readSnapshotSupportedAccountMetadata(){let e=await this.readAccountMetadataOrNull();if(!e||e.accountType!==`chatgpt`)throw WT(`Current Codex account does not expose a ChatGPT email via account/read`);return e}getSnapshotPath(e){return p.default.join(this.snapshotsDir,`${zN(e)}.json`)}getSnapshotMetadataPath(e){return p.default.join(this.snapshotsDir,`${zN(e)}${yN}`)}};function wN(e,t){let n;try{n=JSON.parse(e)}catch(e){throw WT(`Codex auth file is not valid JSON: ${t}`,{error:String(e)})}if(!n||typeof n!=`object`||Array.isArray(n))throw WT(`Codex auth file is not an object: ${t}`);let r=n;return{authMode:DN(r.auth_mode),lastRefreshAt:jN(r.last_refresh),rawContent:e,canonicalContent:LN(n)}}function TN(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`invalid snapshot metadata`);let n=t,r=kN(n.accountId);if(!r)throw Error(`missing snapshot metadata accountId`);return{accountId:r,accountType:AN(n.accountType),planType:ON(n.planType),rateLimits:MN(n.rateLimits),savedAt:jN(n.savedAt)??new Date(0).toISOString()}}async function EN(){return GO(async e=>{let t=IN(await e.sendRequest(`account/read`,{refreshToken:!1}));if(!t)return null;let n=IN(t.account);if(!n)return null;let r=null;try{let t=IN(await e.sendRequest(`account/rateLimits/read`,void 0));r=t?MN(IN(t.rateLimits)):null}catch{r=null}let i=AN(n.type);if(i===`chatgpt`){let e=kN(n.email);return e?{accountId:e,accountType:i,planType:ON(n.planType)??r?.planType??null,rateLimits:r}:null}return i===`apiKey`?{accountId:`API Key`,accountType:i,planType:ON(n.planType)??r?.planType??null,rateLimits:r}:null})}function DN(e){return typeof e==`string`&&e.trim()?e.trim():`unknown`}function ON(e){return typeof e==`string`&&e.trim()?e.trim():null}function kN(e){return typeof e==`string`&&e.trim()?e.trim().toLowerCase():null}function AN(e){return e===`chatgpt`||e===`apiKey`?e:`unknown`}function jN(e){if(typeof e!=`string`||!e.trim())return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function MN(e){let t=IN(e);if(!t)return null;let n=NN(t.primary),r=NN(t.secondary),i=ON(t.planType??t.plan_type),a=IN(t.credits),o=ON(t.creditsBalance??a?.balance);return!n&&!r&&!i&&!o?null:{...n?{primary:n}:{},...r?{secondary:r}:{},...i?{planType:i}:{},...o?{creditsBalance:o}:{}}}function NN(e){let t=IN(e);if(!t)return null;let n=PN(t.usedPercent??t.used_percent);return n===null?null:{usedPercent:n,windowMinutes:FN(t.windowMinutes??t.windowDurationMins??t.window_minutes),resetsAt:PN(t.resetsAt??t.resets_at)}}function PN(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function FN(e){return typeof e==`number`&&Number.isFinite(e)?Math.trunc(e):null}function IN(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function LN(e){return JSON.stringify(RN(e))}function RN(e){return Array.isArray(e)?e.map(e=>RN(e)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,RN(t)])):e}function zN(e){let t=kN(e);if(!t)throw WT(`Codex account identifier cannot be empty`);return encodeURIComponent(t)}function BN(e){if(!VN(e))return null;try{return kN(decodeURIComponent(e.slice(0,-5)))}catch{return null}}function VN(e){return e.endsWith(`.json`)&&!e.endsWith(yN)}async function HN(e){try{return await d.default.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function UN(e){try{return await d.default.readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function WN(e,t){let n=p.default.dirname(e),r=p.default.join(n,`.${p.default.basename(e)}.${process.pid}.${Date.now()}.tmp`);await d.default.mkdir(n,{recursive:!0,mode:448}),await d.default.writeFile(r,t,{encoding:`utf8`,mode:384}),await d.default.rename(r,e)}const GN=[`## Code review guidelines:`,`# Review guidelines:`,``,`You are acting as a reviewer for a proposed code change made by another engineer.`,``,`Below are some default guidelines for determining whether the original author would appreciate the issue being flagged.`,``,`These are not the final word in determining whether an issue is a bug. In many cases, you will encounter other, more specific guidelines. These may be present elsewhere in a developer message, a user message, a file, or even elsewhere in this system message.`,`Those guidelines should be considered to override these general instructions.`,``,`Here are the general guidelines for determining whether something is a bug and should be flagged.`,``,`1. It meaningfully impacts the accuracy, performance, security, or maintainability of the code.`,`2. The bug is discrete and actionable (i.e. not a general issue with the codebase or a combination of multiple issues).`,`3. Fixing the bug does not demand a level of rigor that is not present in the rest of the codebase (e.g. one doesn't need very detailed comments and input validation in a repository of one-off scripts in personal projects).`,`4. The bug was introduced in the change under review (pre-existing bugs should not be flagged).`,`5. The author of the original change would likely fix the issue if they were made aware of it.`,`6. The bug does not rely on unstated assumptions about the codebase or the author's intent.`,`7. It is not enough to speculate that a change may disrupt another part of the codebase; to be considered a bug, one must identify the other parts of the code that are provably affected.`,`8. The bug is clearly not just an intentional change by the original author.`,``,`When flagging a bug, you will also provide an accompanying comment. Once again, these guidelines are not the final word on how to construct a comment; defer to any subsequent guidelines that you encounter.`,``,`1. The comment should be clear about why the issue is a bug.`,`2. The comment should appropriately communicate the severity of the issue. It should not claim that an issue is more severe than it actually is.`,`3. The comment should be brief. The body should be at most 1 paragraph. It should not introduce line breaks within the natural language flow unless it is necessary for the code fragment.`,`4. The comment should not include any chunks of code longer than 3 lines. Any code chunks should be wrapped in markdown inline code tags or a code block.`,`5. The comment should clearly and explicitly communicate the scenarios, environments, or inputs that are necessary for the bug to arise. The comment should immediately indicate that the issue's severity depends on these factors.`,`6. The comment's tone should be matter-of-fact and not accusatory or overly positive. It should read as a helpful AI assistant suggestion without sounding too much like a human reviewer.`,`7. The comment should be written such that the original author can immediately grasp the idea without close reading.`,`8. The comment should avoid excessive flattery and comments that are not helpful to the original author. The comment should avoid phrasing like "Great job ..." or "Thanks for ...".`,``,`Below are some more detailed guidelines that you should apply to this specific review.`,``,`HOW MANY FINDINGS TO RETURN:`,``,`Output all findings that the original author would fix if they knew about them. If there is no finding that a person would definitely appreciate and fix, prefer outputting no findings. Do not stop at the first qualifying finding. Continue until you have listed every qualifying finding.`,``,`GUIDELINES:`,``,`- Ignore trivial style unless it obscures meaning or violates documented standards.`,`- Use one comment per distinct issue (or a multi-line range if necessary).`,"- Use ```suggestion``` blocks only for concrete replacement code (minimal lines; no commentary inside the block).","- In every ```suggestion``` block, preserve the exact leading whitespace of the replaced lines (spaces vs tabs, number of spaces).",`- Do not introduce or remove outer indentation levels unless that is the actual fix.`,``,`The comments will be presented in the code review as inline comments. Avoid unnecessary location details in the comment body. Always keep the line range as short as possible for interpreting the issue. Avoid ranges longer than 5-10 lines; instead, choose the most suitable subrange that pinpoints the problem.`,``,`At the beginning of the finding title, tag the bug with a priority level. For example "[P1] Un-padding slices along wrong tensor dimensions".`,`- [P0]: Drop everything to fix. Blocking release, operations, or major usage. Only use this for universal issues that do not depend on assumptions about the inputs.`,`- [P1]: Urgent. Should be addressed in the next cycle.`,`- [P2]: Normal. To be fixed eventually.`,`- [P3]: Low. Nice to have.`,``,"Additionally, include a numeric priority field in the JSON output for each finding: set `priority` to 0 for P0, 1 for P1, 2 for P2, or 3 for P3. If a priority cannot be determined, omit the field or use null.",``,`At the end of your findings, output an overall correctness verdict of whether or not the patch should be considered correct.`,`Correct implies that existing code and tests will not break, and the patch is free of bugs and other blocking issues.`,`Ignore non-blocking issues such as style, formatting, typos, documentation, and other nits.`,``,`FORMATTING GUIDELINES:`,`The finding description should be one paragraph.`,``,`OUTPUT FORMAT:`,``,`## Output schema - MUST MATCH exactly`,``,"```json",`{`,` "findings": [`,` {`,` "title": "<= 80 chars, imperative",`,` "body": "<valid Markdown explaining why this is a problem; cite files/lines/functions>",`,` "confidence_score": <float 0.0-1.0>,`,` "priority": <int 0-3, optional>,`,` "code_location": {`,` "absolute_file_path": "<file path>",`,` "line_range": {"start": <int>, "end": <int>}`,` }`,` }`,` ],`,` "overall_correctness": "patch is correct" | "patch is incorrect",`,` "overall_explanation": "<1-3 sentence explanation justifying the overall_correctness verdict>",`,` "overall_confidence_score": <float 0.0-1.0>`,`}`,"```",``,`- Do not wrap the JSON in markdown fences or extra prose.`,"- The `code_location` field is required and must include `absolute_file_path` and `line_range`.",`- Line ranges must be as short as possible for interpreting the issue (avoid ranges over 5-10 lines; pick the most suitable subrange).`,"- The `code_location` should overlap with the diff under review.",`- Do not generate a fix patch.`,`- Your initial response to the user must always use the JSON schema above.`,`- After the initial response, choose the format based on the user's request:`,` - If they explicitly ask for another review (for example, "re-review" or "rerun the review"), return the findings in the exact JSON schema again.`,` - If they ask you to fix something, answer follow-up questions, or otherwise request non-review help, respond in plain text (no JSON or schema output).`,`- All review instructions apply to the overall code review conversation. Continue following the guidelines in every response, only switching between JSON and plain text as described above.`];function KN(e,t){let n=e.provider===`codex`?e.codex:void 0;if(!n)throw Error(`Codex review config is required`);return[...GN,``,JN(n.target),`## My request for Codex:`,qN(e,t)].join(`
527
- `)}function qN(e,t){let n=e.provider===`codex`?e.codex:void 0;if(!n)throw Error(`Codex review config is required`);let r=n.target,i=r.type===`baseBranch`?`Please review the code changes against the base branch ${r.branch}.`:r.type===`commit`?`Please review the code changes introduced by commit ${YN(r.sha,r.title)}.`:r.type===`custom`?r.instructions:`Please review my uncommitted changes.`,a=XN(t);return a?`${i}\n\nAdditional review instructions:\n${a}`:i}function JN(e){return e.type===`baseBranch`?`Review the code changes against the base branch ${e.branch} and provide prioritized, actionable findings.`:e.type===`commit`?`Review the code changes introduced by commit ${YN(e.sha,e.title)} and provide prioritized, actionable findings.`:e.type===`custom`?`Review the requested code changes and provide prioritized, actionable findings.`:`Review the current code changes (staged, unstaged, and untracked files) and provide prioritized, actionable findings.`}function YN(e,t){let n=XN(t);return n?`${e} (${JSON.stringify(n)})`:e}function XN(e){return e?.trim()||void 0}async function ZN(e){let t=e.attachments??[];if(t.length===0)return{attachments:[],totalSizeBytes:0};if(t.length>5)throw Error(`Too many image attachments; maximum is 5`);let n=p.default.join(e.rootDir,eP(e.sessionId),eP(e.commandId??`turn_${DT(10)}`));await d.default.mkdir(n,{recursive:!0,mode:448});let r=0,i=[];for(let[e,a]of t.entries()){if(a.kind!==`image`)continue;let t=Buffer.from(a.dataBase64,`base64`);if(t.length===0)throw Error(`Image attachment is empty`);if(t.length>8388608)throw Error(`Image attachment exceeds 8388608 bytes`);if(r+=t.length,r>20971520)throw Error(`Image attachments exceed 20971520 bytes in total`);if(!$N(t,a.mimeType))throw Error(`Image attachment MIME/content mismatch: ${a.mimeType}`);let o=QN(a.mimeType),s=(0,l.createHash)(`sha256`).update(t).digest(`hex`).slice(0,16),c=`${String(e+1).padStart(2,`0`)}-${s}.${o}`,u=p.default.join(n,c);await d.default.writeFile(u,t,{mode:384}),i.push({id:a.id,kind:`image`,mimeType:a.mimeType,localPath:u,fileName:a.fileName,width:a.width,height:a.height,sizeBytes:t.length,dataBase64:a.dataBase64})}return{attachments:i,totalSizeBytes:r}}function QN(e){return e===`image/jpeg`?`jpg`:e===`image/webp`?`webp`:`png`}function $N(e,t){return t===`image/png`?e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10:t===`image/jpeg`?e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255:e.length>=12&&e.toString(`ascii`,0,4)===`RIFF`&&e.toString(`ascii`,8,12)===`WEBP`}function eP(e){return e.replace(/[^a-zA-Z0-9._-]+/g,`_`).slice(0,80)||`unknown`}const tP=Symbol(`dispatchRollbackHandled`),nP=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;function rP(e){return e.lastHydratedExternalUpdatedAt||e.updatedAt||e.createdAt}function iP(e,t){nP&&(!e.startsWith(`config.get`)&&!e.startsWith(`raw-events`)&&!e.startsWith(`sync-external`)&&!e.endsWith(`.error`)||console.log(`[session-fetch][gateway] ${e}`,t))}function aP(e){return e?{sessionFound:!0,sessionId:e.id,nativeSessionId:e.nativeSessionId??null,sessionSource:e.source??null,sessionModel:e.model??null,sessionUpdatedAt:e.updatedAt,sessionActiveStartedAt:e.activeStartedAt??null,sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt??null,sessionTurnConfigModel:e.sessionTurnConfig?.model??null,sessionTurnConfigReasoningEffort:e.sessionTurnConfig?.reasoningEffort??null,sessionTurnConfigApprovalPolicy:e.sessionTurnConfig?.execution?.codex?.approvalPolicy??null,sessionTurnConfigSandboxMode:e.sessionTurnConfig?.execution?.codex?.sandboxMode??null,lastHydratedExternalUpdatedAt:e.lastHydratedExternalUpdatedAt??null,lastHydratedExternalConfigFreshnessAt:e.lastHydratedExternalConfigFreshnessAt??null,codexExternalConfigHydrationVersion:e.codexExternalConfigHydrationVersion??null}:{sessionFound:!1}}function oP(e,t,n,r){let i=KM(e,n);if(!t)return cP(e,i,r);let a=KM(e,t);return cP(e,{mode:i.mode??a.mode,model:i.model===void 0?a.model:i.model,reasoningEffort:i.reasoningEffort===void 0?a.reasoningEffort:i.reasoningEffort},r)}function sP(e){return e.observedModel===void 0?e.observedSessionTurnConfig?.model===void 0?e.currentModel:dN(e.observedSessionTurnConfig.model??void 0):dN(e.observedModel)}function cP(e,t,n){let r=KM(e,t);return{mode:r.mode,model:r.model,reasoningEffort:e===`claude`&&n?.preserveReasoningEffort===!1?null:r.reasoningEffort}}function lP(e){return e.provider!==`claude`||e.source===`gateway`}function uP(e){return!e||e.provider!==`claude`||e.source===`gateway`||!e.sessionTurnConfig?e:{...e,sessionTurnConfig:cP(`claude`,e.sessionTurnConfig,{preserveReasoningEffort:!1})}}function dP(e,t){return fP(e)?{status:`running`}:t?{status:`running`,interactionLockReason:`external_turn_running`}:{status:`idle`}}function fP(e){return!!(e&&(e.status===`running`||e.dispatchInFlight))}function pP(e){return e.status===`active`?!0:e.turns.some(e=>e.status===`inProgress`||e.status===`in_progress`)}function mP(e,t){if(!t)return pP(e);for(let n of e.turns)if(!(n.status!==`inProgress`&&n.status!==`in_progress`)&&!t.terminalTurnStatusById.has(n.id))return!0;return!1}function hP(e){return e.startsWith(`sess_`)}function gP(e){return e.source===`native_discovered`?!0:e.providerMode===`native`&&(e.provider===`codex`||e.provider===`claude`)}function _P(e){return e.nativeSessionId?.trim()??``?!0:e.provider===`codex`&&!hP(e.id)}function vP(e){return hP(e.id)?e.nativeSessionId??e.id:e.id}function yP(e){return e.provider!==`codex`&&e.provider!==`claude`||e.providerMode!==`native`?!1:_P(e)}function bP(e){return e instanceof Error&&/^Session .+ is closed$/i.test(e.message)}function xP(e,t){if(e.provider!==`codex`||t.type!==`error.runtime`)return!1;if(UF(t.source)?.startsWith(`codex.app_server`))return!0;let n=UF(t.message)??``;return/\bclosed\b/i.test(n)}function SP(e,t){return t.type===`error.runtime`?!0:e.provider===`claude`&&t.type===`error`}function CP(e){if(e&&(typeof e==`object`||typeof e==`function`))try{return Object.defineProperty(e,tP,{value:!0,configurable:!0}),e}catch{}let t=Error(e instanceof Error?e.message:String(e));return Object.defineProperty(t,tP,{value:!0,configurable:!0}),Object.defineProperty(t,`cause`,{value:e,configurable:!0}),t}function wP(e){return!!(e&&(typeof e==`object`||typeof e==`function`)&&tP in e)}function TP(e){return wP(e)&&e&&(typeof e==`object`||typeof e==`function`)&&`cause`in e&&e.cause!==void 0?e.cause:e}const EP={idleTtlMs:900*1e3,sweepIntervalMs:60*1e3,maxSessions:24,maxCodexSessions:8,maxClaudeSessions:16};function DP(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(1,Math.trunc(n)):t}function OP(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(0,Math.trunc(n)):t}var kP=class{sessions=new Map;providerCapabilities;codexAccounts;nextRawSeqBySession=new Map;preparingRuntimeDispatches=new Set;queuedInterruptsBeforeDispatch=new Set;runtimeLifecycle;attachmentStoreDir;sweepTimer;lastRawEnvelopeTimestampMs=0;shuttingDown=!1;constructor(e){if(this.options=e,this.providerCapabilities=new vN({preferNativeProviders:e.preferNativeProviders,projectStore:e.projectStore,logger:e.logger,providerExecutionPreferencesDir:e.providerExecutionPreferencesDir}),this.codexAccounts=e.codexAccountService??new CN,this.attachmentStoreDir=e.attachmentStoreDir??p.default.join(f.default.tmpdir(),`craby-session-attachments`),this.runtimeLifecycle={idleTtlMs:DP(e.runtimeLifecycle?.idleTtlMs,EP.idleTtlMs),sweepIntervalMs:OP(e.runtimeLifecycle?.sweepIntervalMs,EP.sweepIntervalMs),maxSessions:DP(e.runtimeLifecycle?.maxSessions,EP.maxSessions),maxCodexSessions:DP(e.runtimeLifecycle?.maxCodexSessions,EP.maxCodexSessions),maxClaudeSessions:DP(e.runtimeLifecycle?.maxClaudeSessions,EP.maxClaudeSessions)},this.runtimeLifecycle.sweepIntervalMs<=0){this.sweepTimer=null;return}this.sweepTimer=setInterval(()=>{this.sweepRuntimeSessions().catch(e=>{console.error(`[session-runtime] sweep failed: ${String(e)}`)})},this.runtimeLifecycle.sweepIntervalMs),this.sweepTimer.unref?.()}async shutdown(){this.shuttingDown=!0,this.sweepTimer&&clearInterval(this.sweepTimer);let e=[...this.sessions.keys()];this.options.logger?.info?.({sessionCount:e.length,sessionIds:e},`session manager shutdown starting`),await Promise.allSettled(e.map(e=>this.closeRuntimeSession(e,`shutdown`))),await DO(),this.options.logger?.info?.({sessionCount:e.length,sessionIds:e},`session manager shutdown completed`)}async listProjects(){let e=await this.options.projectStore.list(),t=this.buildProjectStatsMap();return e.map(e=>this.attachProjectStats(e,t))}async createProject(e){let t=await this.options.projectStore.upsertByPath(e.path,e.title);return this.attachProjectStats(t,this.buildProjectStatsMap())}async deleteProject(e){if(this.listProjectSessionsWithRuntime(e,`running`).length>0)throw VT(e);return this.options.projectStore.remove(e)}async restartCodexAppServer(){let e=this.getRunningRuntimeSessionCount();if(e>0)throw HT(e);let t=[...this.sessions.values()].filter(e=>e.provider===`codex`).map(e=>e.id);return await Promise.allSettled(t.map(e=>this.closeRuntimeSession(e,`codex_restart`))),await OO(),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`codex.app_server.restart`,detail:{closedRuntimeSessionCount:t.length}}),{restarted:!0,closedRuntimeSessionCount:t.length}}async getCodexAccounts(){return this.codexAccounts.getAccountsOverview()}async saveCurrentCodexAccount(){let e=await this.codexAccounts.saveCurrentAccount();return await this.options.auditLogger.record({ts:new Date().toISOString(),action:`codex.account.save`,detail:{currentAccountId:e.current?.accountId??null,savedAccountCount:e.savedAccounts.length}}),{saved:!0,accounts:e}}async switchCodexAccount(e){let t=await this.codexAccounts.getCurrentAccount();if(t?.accountId===e)return{switched:!0,closedRuntimeSessionCount:0,accounts:t.accountType===`chatgpt`?await this.codexAccounts.saveCurrentAccount():await this.codexAccounts.getAccountsOverview()};let n=this.getRunningRuntimeSessionCount();if(n>0)throw HT(n);let r=[...this.sessions.values()].filter(e=>e.provider===`codex`).map(e=>e.id);await Promise.allSettled(r.map(e=>this.closeRuntimeSession(e,`codex_restart`))),t?.accountType===`chatgpt`&&await this.codexAccounts.saveCurrentAccount(),await DO();let i=null;try{i=await this.codexAccounts.applySavedAccount(e),await OO()}catch(e){if(i?.previousRawContent)try{await this.codexAccounts.restoreCurrentAuthFile(i.previousRawContent),await OO()}catch{}throw e}let a=await this.codexAccounts.getAccountsOverview();return await this.options.auditLogger.record({ts:new Date().toISOString(),action:`codex.account.switch`,detail:{previousAccountId:t?.accountId??null,nextAccountId:a.current?.accountId??e,closedRuntimeSessionCount:r.length}}),{switched:!0,closedRuntimeSessionCount:r.length,accounts:a}}async deleteSavedCodexAccount(e){let t=await this.codexAccounts.deleteSavedAccount(e);return await this.options.auditLogger.record({ts:new Date().toISOString(),action:`codex.account.delete`,detail:{deletedAccountId:e,currentAccountId:t.current?.accountId??null,savedAccountCount:t.savedAccounts.length}}),{deleted:!0,accounts:t}}async getProject(e){return this.options.projectStore.getById(e)}getRunningRuntimeSessionCount(){let e=0;for(let t of this.sessions.values())t.status===`running`&&(e+=1);return e}buildProjectStatsMap(){let e=new Map,t=this.listAllSessionsWithRuntime(`all`);for(let n of t){let t=e.get(n.projectId)??{runningCount:0,idleCount:0,totalCount:0,lastSessionAt:void 0};n.status===`running`?t.runningCount+=1:t.idleCount+=1,t.totalCount+=1;let r=n.updatedAt||n.createdAt;(!t.lastSessionAt||r>t.lastSessionAt)&&(t.lastSessionAt=r),e.set(n.projectId,t)}return e}attachProjectStats(e,t){let n=t.get(e.id),r=n?.idleCount??0;return{...e,lastSessionAt:n?.lastSessionAt,runningCount:n?.runningCount??0,idleCount:r,totalCount:n?.totalCount??0,endedCount:r}}async getProviderCapabilities(e,t,n){return this.providerCapabilities.getProviderCapabilities(e,t,n)}async getAgentConfig(e,t){return this.providerCapabilities.getAgentConfig(e,t)}async updateProviderExecutionDefaults(e){return this.providerCapabilities.updateProviderExecutionDefaults(e)}async warmStartupProviderCapabilities(){if(!this.shuttingDown)return this.providerCapabilities.warmStartupProviderCapabilities()}async getProviderDefaults(e,t,n){return this.providerCapabilities.getProviderDefaults(e,t,n)}async resolveCodexAppServerTransport(e){if(e.provider===`codex`)return(await this.getProviderCapabilities(`codex`,e.projectId)).defaults.codexAppServerTransport}async listProjectSessions(e,t=`all`,n){let r=await this.options.projectStore.getById(e);if(!r)throw LT(e);if(n?.syncExternal){let e=Date.now(),n=this.options.historyStore.listProjectSessions(r.id,`all`).length;this.options.logger?.info?.({projectId:r.id,projectPath:r.path,requestedStatus:t,sessionCountBeforeSync:n},`project external session sync started`);let[i,a]=await Promise.all([this.syncCodexSessionsForProject(r),this.syncClaudeSessionsForProject(r)]);this.options.logger?.info?.({projectId:r.id,projectPath:r.path,requestedStatus:t,sessionCountBeforeSync:n,sessionCountAfterSync:this.options.historyStore.listProjectSessions(r.id,`all`).length,totalDurationMs:Date.now()-e,codexSync:i,claudeSync:a},`project external session sync completed`)}return this.listProjectSessionsWithRuntime(e,t)}async getProjectSessionSummary(e,t){let n=this.options.historyStore.getProjectSession(e,t);return this.getRuntimeSessionSummary(e,t,n)||uP(n)}isGatewayOwnedRuntimeLive(e,t){let n=this.sessions.get(t);if(n&&n.projectId===e&&fP(n))return!0;if(!this.preparingRuntimeDispatches.has(t))return!1;let r=this.options.historyStore.getProjectSession(e,t);return!!(r&&r.source===`gateway`&&r.providerMode===`native`)}async getProjectSessionConfig(e,t){let n=this.options.historyStore.getProjectSession(e,t),r=this.getRuntimeSessionSummary(e,t,n);if(iP(`config.get.begin`,{projectId:e,sessionId:t,shouldHydrate:n?this.shouldHydrateCodexExternalSessionConfig(n):!1,persisted:aP(n),runtime:aP(r)}),r)return iP(`config.get.result`,{projectId:e,sessionId:t,resultSource:`runtime`,...aP(r)}),r;let i=n?.provider===`codex`?await this.maybeHydrateCodexExternalSessionConfig(n):uP(n);return iP(`config.get.result`,{projectId:e,sessionId:t,resultSource:i===n?`persisted`:`hydrated`,...aP(i)}),i}async syncProjectSessionHistory(e,t){let n=await this.options.projectStore.getById(e);if(!n)throw LT(e);let r=this.options.historyStore.getProjectSession(e,t);if(!r&&this.options.preferNativeProviders&&(await this.syncCodexSessionsForProject(n),await this.syncClaudeSessionsForProject(n),r=this.options.historyStore.getProjectSession(e,t)),!r)throw RT(e,t);let i=Date.now(),a=Date.now(),o=await this.options.historyStore.getSessionRawEvents(r.id,2**53-1),s=Date.now()-a,c=Date.now(),l=await this.options.historyStore.getSessionStoredRawEvents(r.id,2**53-1),u=Date.now()-c,d=Date.now(),f=await this.syncExternalRawHistory(r,e,o,l),p=Date.now()-d,m=f.session??this.options.historyStore.getProjectSession(e,r.id)??r,h=Date.now(),g=SF(o,f.rawEvents),_=Date.now()-h;iP(`sync-external.classify`,xF({projectId:e,sessionId:t,session:m,previousEvents:o,nextEvents:f.rawEvents,classification:g})),iP(`sync-external.timing`,{projectId:e,sessionId:t,provider:m.provider,source:m.source,providerMode:m.providerMode,localEventCount:o.length,localStoredEventCount:l.length,nextEventCount:f.rawEvents.length,historyUpdated:g.historyUpdated,refreshMode:g.refreshMode,fromRawSeq:g.fromRawSeq??null,toRawSeq:g.toRawSeq??null,localEventsDurationMs:s,localStoredEventsDurationMs:u,externalSyncDurationMs:p,classifyDurationMs:_,totalDurationMs:Date.now()-i});let v=m.status!==r.status||(m.interactionLockReason??``)!==(r.interactionLockReason??``);return{session:m,rawEvents:f.rawEvents,historyUpdated:g.historyUpdated,statusChanged:v,refreshMode:g.refreshMode,fromRawSeq:g.fromRawSeq,toRawSeq:g.toRawSeq,nativeWatchPath:f.nativeWatchPath}}async getProjectSessionRawEvents(e,t,n=300){return(await this.getProjectSessionRawEventsWithCoverage(e,t,n)).rawEvents}async getProjectSessionRawEventsWithCoverage(e,t,n=300){let r=Date.now();if(!await this.options.projectStore.getById(e))throw LT(e);let i=0,a=0,o,s=(s,c)=>{iP(`raw-events.read`,{projectId:e,sessionId:t,limit:n,provider:o?.provider,source:o?.source,providerMode:o?.providerMode,localReadDurationMs:i,finalCount:a,outcome:s,totalDurationMs:Date.now()-r,...c})},c=this.options.historyStore.getProjectSession(e,t);if(!c&&this.getRuntimeSessionSummary(e,t))return s(`runtime_session_empty`),{rawEvents:[],coveredToRawSeq:null};if(!c)throw RT(e,t);o=c;let l=Date.now(),u=await this.options.historyStore.getSessionRawEventsWithCoverage(c.id,Math.max(n,300)),d=u.rawEvents.slice(-Math.max(1,n));return i=Date.now()-l,a=d.length,s(`local_only_cached`,{localEventCount:u.rawEvents.length,coveredToRawSeq:u.coveredToRawSeq}),{rawEvents:d,coveredToRawSeq:u.coveredToRawSeq}}async getProjectSessionRawEventsCompacted(e,t,n=300){return(await this.getProjectSessionRawEventsCompactedWithCoverage(e,t,n)).rawEvents}async getProjectSessionRawEventsCompactedWithCoverage(e,t,n=300){let r=await this.resolveProjectSessionForRawRead(e,t);return this.options.historyStore.getSessionRawEventsCompactedWithCoverage(r.id,n)}async getProjectSessionRawEventsSinceSeq(e,t,n,r=2e3){let i=await this.resolveProjectSessionForRawRead(e,t);return this.options.historyStore.getSessionRawEventsSinceSeq(i.id,n,r)}async getProjectSessionRawSeqRange(e,t){let n=await this.resolveProjectSessionForRawRead(e,t);return this.options.historyStore.getSessionRawSeqRange(n.id)}async resolveProjectSessionForRawRead(e,t){if(!await this.options.projectStore.getById(e))throw LT(e);let n=this.options.historyStore.getProjectSession(e,t);if(n||=this.getRuntimeSessionSummary(e,t),!n)throw RT(e,t);return n}async startSession(e){let t=await this.resolveProjectForSessionStart(e.projectId,e.cwd),n=`sess_${DT(10)}`,r=e.provider===`codex`&&this.options.requireNativeCodex,i=$A(e.provider,{preferNative:this.options.preferNativeProviders,requireNative:r}),a=await this.getProviderDefaults(e.provider,t.id),o=await this.resolveCodexAppServerTransport({provider:e.provider,projectId:t.id}),s=e.sessionTurnConfig?KM(e.provider,e.sessionTurnConfig):JM({provider:e.provider,legacyModel:e.model,legacySessionConfig:e.sessionConfig}),c=YM({provider:e.provider,providerDefaults:a,currentSessionTurnConfig:s}),l=cP(e.provider,s),u=await i.createSession({sessionId:n,model:c.model,cwd:t.path,sessionConfig:c.sessionConfig,codexAppServerTransport:o,metadata:e.metadata,logger:this.options.logger});if(r&&u.providerMode!==`native`)throw await u.close(),Error(`Native Codex provider is required, but adapter fell back to mock. Check ENABLE_NATIVE_PROVIDERS and Codex app-server availability.`);let d=this.resolveCanonicalSessionId(e.provider,u,n),f=this.resolveNativeSessionId(e.provider,u,d),p=new Date().toISOString(),m=await this.attachRuntimeSession({id:d,nativeSessionId:f,source:`gateway`,projectId:t.id,projectPath:t.path,provider:e.provider,providerMode:u.providerMode,model:c.model,title:void 0,sessionTurnConfig:l,sessionTurnConfigUpdatedAt:p,createdAt:p,updatedAt:p,activeStartedAt:void 0,status:`idle`,providerSession:u,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!1,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return this.markSessionStreamReady(m),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.start`,deviceId:e.deviceId,sessionId:m.id,detail:{provider:e.provider,model:c.model,sessionConfig:e.sessionConfig,sessionTurnConfig:l,codexAppServerTransport:o,projectId:t.id,projectPath:t.path}}),{sessionId:m.id,projectId:t.id}}async sendInput(e,t,n,r){let i=t??``,a=r?.attachments??[];if(!i.trim()&&a.length===0)throw Error(`turn.input requires text or image attachments`);let o=this.options.historyStore.getSession(e),s=this.sessions.get(e);if(s?.dispatchInFlight)throw BT(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!s&&this.preparingRuntimeDispatches.has(e))throw BT(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(o?.interactionLockReason===`external_turn_running`)throw BT(e,`an external native turn is still running`,{reason:`external_turn_running`,status:o.status,interactionLockReason:o.interactionLockReason,provider:o.provider,providerMode:o.providerMode});if(s?.status===`running`)throw BT(e,`the current turn is still running`,{reason:`runtime_running`,provider:s.provider,providerMode:s.providerMode});if(!s&&o?.status===`running`&&gP(o))throw BT(e,`the native session is still running`,{reason:`persisted_running`,status:o.status,provider:o.provider,providerMode:o.providerMode,source:o.source});let c=!s,l=s,u=!1,d=!1,f=!1;try{if(c&&this.preparingRuntimeDispatches.add(e),l=s??await this.resumeSessionFromHistory(e),!l)throw zT(e);let t=await this.getProviderDefaults(l.provider,l.projectId),o=YM({provider:l.provider,providerDefaults:t,currentSessionTurnConfig:l.sessionTurnConfig,legacyModel:r?.model,legacySessionConfig:r?.sessionConfig,mode:r?.mode,config:r?.config});if(l.dispatchInFlight=!0,this.touchSession(l),a.length>0&&(await this.getProviderCapabilities(l.provider,l.projectId,o.model)).support.imageInput!==!0)throw Error(`${l.provider} does not support image input`);let p=await ZN({rootDir:this.attachmentStoreDir,sessionId:e,commandId:r?.commandId,attachments:a}),m={text:i,attachments:p.attachments};if(await this.options.auditLogger.record({ts:new Date().toISOString(),action:`turn.input`,deviceId:n,sessionId:e,detail:{text:i,attachments:p.attachments.map(e=>({id:e.id,kind:e.kind,mimeType:e.mimeType,fileName:e.fileName,width:e.width,height:e.height,sizeBytes:e.sizeBytes})),attachmentCount:p.attachments.length,attachmentTotalSizeBytes:p.totalSizeBytes,model:o.model,sessionConfig:r?.sessionConfig,mode:o.mode,config:r?.config,resolvedSessionConfig:o.sessionConfig}}),this.consumeQueuedInterruptBeforeDispatch(e)||(await this.persistGatewayOwnedDispatchStart(l),f=!0,this.consumeQueuedInterruptBeforeDispatch(e)))throw u=!0,this.createInterruptedBeforeDispatchError(e);if(l=await this.sendInputWithRuntimeRecovery(e,l,m,{model:o.model,sessionConfig:o.sessionConfig,mode:o.mode}),d=!0,!l.title){let e=VF(i)??(p.attachments.length>0?`图片消息`:void 0);e&&this.setSessionTitle(l,e)}let h=new Date().toISOString();l.sessionTurnConfig=cP(l.provider,o.sessionTurnConfig),l.sessionTurnConfigUpdatedAt=h,o.model&&l.model!==o.model&&(l.model=o.model),l.updatedAt=h,await this.persistSessionSnapshot(l)}catch(e){throw!wP(e)&&!d&&f&&l&&await this.restoreUnacceptedGatewayOwnedDispatch(l),TP(e)}finally{c&&this.preparingRuntimeDispatches.delete(e),this.queuedInterruptsBeforeDispatch.delete(e);let t=!1;u&&c&&l&&(await this.closeRuntimeSession(l.id,`dispatch_cancelled`,{suppressAudit:!0}),t=!0),!t&&l&&(l.dispatchInFlight=!1,this.touchSession(l))}}async startReview(e,t,n,r){let i=this.options.historyStore.getSession(e),a=this.sessions.get(e);if(a?.dispatchInFlight)throw BT(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!a&&this.preparingRuntimeDispatches.has(e))throw BT(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(i?.interactionLockReason===`external_turn_running`)throw BT(e,`an external native turn is still running`,{reason:`external_turn_running`,status:i.status,interactionLockReason:i.interactionLockReason,provider:i.provider,providerMode:i.providerMode});if(a?.status===`running`)throw BT(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&gP(i))throw BT(e,`the native session is still running`,{reason:`persisted_running`,status:i.status,provider:i.provider,providerMode:i.providerMode,source:i.source});let o=!a,s=a,c=!1,l=!1,u=!1;try{if(o&&this.preparingRuntimeDispatches.add(e),s=a??await this.resumeSessionFromHistory(e),!s)throw zT(e);if(s.provider!==t.provider)throw Error(`Review provider mismatch for session ${e}`);if(t.provider!==`codex`||!t.codex)throw Error(`Only Codex review is currently supported`);let i=await this.getProviderDefaults(s.provider,s.projectId),d=YM({provider:s.provider,providerDefaults:i,currentSessionTurnConfig:s.sessionTurnConfig,config:r?.turnConfig});if(s.dispatchInFlight=!0,this.touchSession(s),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`review.start`,deviceId:n,sessionId:e,detail:{input:r?.input,config:t,turnConfig:r?.turnConfig,resolvedModel:d.model,resolvedSessionConfig:d.sessionConfig}}),this.consumeQueuedInterruptBeforeDispatch(e)||(await this.persistGatewayOwnedDispatchStart(s),u=!0,this.consumeQueuedInterruptBeforeDispatch(e)))throw c=!0,this.createInterruptedBeforeDispatchError(e);let f=KN(t,r?.input);if(s=await this.sendInputWithRuntimeRecovery(e,s,f,{model:d.model,sessionConfig:d.sessionConfig}),l=!0,!s.title){let e=HF(t,r?.input);e&&this.setSessionTitle(s,e)}let p=new Date().toISOString();s.sessionTurnConfig=cP(s.provider,d.sessionTurnConfig),s.sessionTurnConfigUpdatedAt=p,d.model&&s.model!==d.model&&(s.model=d.model),s.updatedAt=p,await this.persistSessionSnapshot(s)}catch(e){throw!wP(e)&&!l&&u&&s&&await this.restoreUnacceptedGatewayOwnedDispatch(s),TP(e)}finally{o&&this.preparingRuntimeDispatches.delete(e),this.queuedInterruptsBeforeDispatch.delete(e);let t=!1;c&&o&&s&&(await this.closeRuntimeSession(s.id,`dispatch_cancelled`,{suppressAudit:!0}),t=!0),!t&&s&&(s.dispatchInFlight=!1,this.touchSession(s))}}async sendInputWithRuntimeRecovery(e,t,n,r){try{return await t.providerSession.sendInput(n,r),t}catch(i){if(!bP(i))throw i;let a=i;this.options.logger?.warn?.({sessionId:e,runtimeSessionId:t.id,nativeSessionId:t.nativeSessionId,provider:t.provider,providerMode:t.providerMode,projectId:t.projectId,projectPath:t.projectPath,model:t.model,error:a.message},`provider runtime session sendInput hit closed session; resuming from history`),await this.closeRuntimeSession(t.id,`provider_error`,{suppressAudit:!0});let o=await this.resumeSessionFromHistory(e);if(!o)throw a;o.dispatchInFlight=!0,await this.persistGatewayOwnedDispatchStart(o);try{await o.providerSession.sendInput(n,r)}catch(e){throw await this.restoreUnacceptedGatewayOwnedDispatch(o),CP(e)}return o}}async respondToolPermission(e,t,n,r,i){let a=this.mustGetSession(e);if(!a.pendingToolApprovals.has(t))throw Error(`Unknown tool approval request: ${t}`);if(typeof a.providerSession.respondToolPermission!=`function`){a.pendingToolApprovals.delete(t),a.updatedAt=new Date().toISOString(),await this.persistSessionSnapshot(a);return}await a.providerSession.respondToolPermission(t,n,r),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`tool.approval.respond`,deviceId:i,sessionId:e,detail:{requestId:t,decision:n,reason:r}})}async respondUserInput(e,t,n,r){let i=this.mustGetSession(e);if(!i.pendingUserInputs.has(t))throw Error(`Unknown user input request: ${t}`);if(typeof i.providerSession.respondUserInput!=`function`){i.pendingUserInputs.delete(t),i.updatedAt=new Date().toISOString(),await this.persistSessionSnapshot(i);return}await i.providerSession.respondUserInput(t,n),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`user.input.respond`,deviceId:r,sessionId:e,detail:{requestId:t,answeredCount:WF(n)}})}async interruptSession(e,t){let n=this.sessions.get(e),r=this.preparingRuntimeDispatches.has(e)||!!n?.dispatchInFlight;r&&this.queuedInterruptsBeforeDispatch.add(e),n&&await n.providerSession.interrupt(),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.interrupt`,deviceId:t,sessionId:e,detail:{runtimeSessionFound:!!n,queuedBeforeDispatch:r}})}async closeSession(e){throw Error(`session.close is deprecated. Use session.interrupt instead.`)}getSessionExecutionContext(e){let t=this.sessions.get(e);if(t)return{provider:t.provider,projectId:t.projectId,projectPath:t.projectPath};let n=this.options.historyStore.getSession(e);if(!n)throw zT(e);return{provider:n.provider,projectId:n.projectId,projectPath:n.projectPath}}async emitExternalEvent(e){let t=this.options.historyStore.getSession(e.sessionId),n={v:`1.0`,kind:`provider.raw`,rawSeq:await this.nextRawSeq(e.sessionId),provider:e.provider,sessionId:e.sessionId,projectId:e.projectId??t?.projectId,eventId:`raw_${DT(12)}`,ts:this.nextRawEnvelopeTimestamp(),type:e.type,payload:{raw:{...e.raw,type:e.type}}};this.options.onEnvelope(n),this.options.historyStore.appendRawEvent(n).catch(e=>{console.error(`[session-history] append raw event failed: ${String(e)}`)})}async resumeSessionFromHistory(e){let t=this.options.historyStore.getSession(e);if(!t)return;let n=t.provider===`codex`&&this.options.requireNativeCodex,r=$A(t.provider,{preferNative:this.options.preferNativeProviders,requireNative:n}),i=await this.getProviderDefaults(t.provider,t.projectId),a=cP(t.provider,t.sessionTurnConfig,{preserveReasoningEffort:lP(t)}),o=YM({provider:t.provider,providerDefaults:i,currentSessionTurnConfig:a}),s=t.provider===`claude`?vP(t):t.nativeSessionId??t.id,c=await this.resolveCodexAppServerTransport({provider:t.provider,projectId:t.projectId}),l=await r.createSession({sessionId:t.id,model:o.model??t.model,cwd:t.projectPath,resumeSessionId:s,sessionConfig:o.sessionConfig,codexAppServerTransport:c,metadata:{resumeFromHistory:!0,codexAppServerTransport:c},logger:this.options.logger});if(n&&l.providerMode!==`native`)throw await l.close(),Error(`Native Codex provider is required, but adapter fell back to mock. Check ENABLE_NATIVE_PROVIDERS and Codex app-server availability.`);let u=this.resolveCanonicalSessionId(t.provider,l,t.id),d=this.resolveNativeSessionId(t.provider,l,t.nativeSessionId),f=await this.attachRuntimeSession({id:u,nativeSessionId:d,source:t.source??`gateway`,projectId:t.projectId,projectPath:t.projectPath,provider:t.provider,providerMode:l.providerMode,model:o.model??t.model,title:t.title,sessionTurnConfig:a,sessionTurnConfigUpdatedAt:t.sessionTurnConfigUpdatedAt,createdAt:t.createdAt,updatedAt:t.updatedAt||new Date().toISOString(),activeStartedAt:t.activeStartedAt,status:`idle`,providerSession:l,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!0,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return await this.persistSessionSnapshot(f),f}consumeQueuedInterruptBeforeDispatch(e){return this.queuedInterruptsBeforeDispatch.delete(e)}createInterruptedBeforeDispatchError(e){return BT(e,`the pending turn was interrupted before provider dispatch started`,{reason:`interrupt_requested_before_dispatch`})}async syncCodexSessionsForProject(e){let t=Date.now();if(!this.options.preferNativeProviders)return{provider:`codex`,status:`disabled`,discoveredCount:0,staleRemovedCount:0,upsertedCount:0,catalogDurationMs:0,applyDurationMs:0,totalDurationMs:Date.now()-t};let n=Date.now(),r,i=Math.floor((Date.now()-14400*60*1e3)/1e3);try{r=await Hk(e.path,{maxThreads:100,sortKey:`updated_at`,updatedAfterUnixSeconds:i})}catch(r){let i={provider:`codex`,status:`error`,discoveredCount:0,staleRemovedCount:0,upsertedCount:0,catalogDurationMs:Date.now()-n,applyDurationMs:0,totalDurationMs:Date.now()-t,error:r instanceof Error?r.message:String(r)};return this.options.logger?.warn?.({projectId:e.id,projectPath:e.path,...i},`project external session sync provider failed`),i}let a=Date.now()-n,o=new Map(this.options.historyStore.listProjectSessions(e.id,`all`).map(e=>[e.id,e])),s=Date.now(),c=0;for(let t of r){if(t.cwd!==e.path)continue;let n=[...o.values()].find(e=>e.provider===`codex`&&(e.id===t.id||e.nativeSessionId===t.id)),r=n?.id??t.id,i=this.sessions.get(r)??this.sessions.get(t.id),a=GF(t.createdAt),s=GF(t.updatedAt),l=dP(i,pP(t)),u=l.status,d=u===`running`?i?.pendingToolApprovals.size??0:0,f=u===`running`?i?.pendingUserInputs.size??0:0,p={id:r,nativeSessionId:t.id,source:n?.source??`native_discovered`,projectId:e.id,projectPath:e.path,provider:`codex`,providerMode:i?.providerMode??n?.providerMode??`native`,model:fN({runtimeModel:i?.model,discoveredModel:t.model,existingModel:n?.model,modelProvider:t.modelProvider}),title:i?.title??VF(t.name??t.preview)??n?.title,sessionTurnConfig:i?.sessionTurnConfig??(n?.sessionTurnConfig?cP(`codex`,n.sessionTurnConfig):void 0),sessionTurnConfigUpdatedAt:i?.sessionTurnConfigUpdatedAt??n?.sessionTurnConfigUpdatedAt,createdAt:n?.createdAt??a,updatedAt:u===`running`?i?.updatedAt??s:s,status:u,interactionLockReason:l.interactionLockReason,pendingApprovals:d,pendingUserInputs:f,pendingActions:d+f};await this.options.historyStore.upsertSession(p),o.set(r,p),c+=1}let l={provider:`codex`,status:`ok`,discoveredCount:r.filter(t=>t.cwd===e.path).length,staleRemovedCount:0,upsertedCount:c,catalogDurationMs:a,applyDurationMs:Date.now()-s,totalDurationMs:Date.now()-t};return this.options.logger?.info?.({projectId:e.id,projectPath:e.path,maxThreads:100,lookbackDays:10,...l},`project external session sync provider completed`),l}async syncClaudeSessionsForProject(e){let t=Date.now();if(!this.options.preferNativeProviders)return{provider:`claude`,status:`disabled`,discoveredCount:0,staleRemovedCount:0,upsertedCount:0,catalogDurationMs:0,applyDurationMs:0,totalDurationMs:Date.now()-t};let n=Date.now(),r,i=Date.now()-14400*60*1e3;try{r=await ij(e.path,{maxSessions:100,updatedAfterMs:i})}catch(r){let i={provider:`claude`,status:`error`,discoveredCount:0,staleRemovedCount:0,upsertedCount:0,catalogDurationMs:Date.now()-n,applyDurationMs:0,totalDurationMs:Date.now()-t,error:r instanceof Error?r.message:String(r)};return this.options.logger?.warn?.({projectId:e.id,projectPath:e.path,...i},`project external session sync provider failed`),i}let a=Date.now()-n,o=new Map(this.options.historyStore.listProjectSessions(e.id,`all`).map(e=>[e.id,e])),s=Date.now(),c=0;for(let t of r){let n=[...o.values()].find(e=>e.provider===`claude`&&(e.id===t.nativeSessionId||e.nativeSessionId===t.nativeSessionId)),r=n?.id??t.nativeSessionId,i=this.sessions.get(r),a=dP(i,t.status===`running`),s=a.status,l=s===`running`?i?.pendingToolApprovals.size??0:0,u=s===`running`?i?.pendingUserInputs.size??0:0,d={id:r,nativeSessionId:t.nativeSessionId,source:n?.source??`native_discovered`,projectId:e.id,projectPath:e.path,provider:`claude`,providerMode:i?.providerMode??n?.providerMode??`native`,model:i?.model??n?.model??t.model,title:i?.title??t.title??n?.title,sessionTurnConfig:i?.sessionTurnConfig??(n?.sessionTurnConfig?cP(`claude`,n.sessionTurnConfig,{preserveReasoningEffort:lP(n)}):void 0),sessionTurnConfigUpdatedAt:i?.sessionTurnConfigUpdatedAt??n?.sessionTurnConfigUpdatedAt,createdAt:n?.createdAt??t.createdAt,updatedAt:s===`running`?i?.updatedAt??t.updatedAt:t.updatedAt,status:s,interactionLockReason:a.interactionLockReason,pendingApprovals:l,pendingUserInputs:u,pendingActions:l+u};await this.options.historyStore.upsertSession(d),o.set(r,d),c+=1}let l={provider:`claude`,status:`ok`,discoveredCount:r.length,staleRemovedCount:0,upsertedCount:c,catalogDurationMs:a,applyDurationMs:Date.now()-s,totalDurationMs:Date.now()-t};return this.options.logger?.info?.({projectId:e.id,projectPath:e.path,maxSessions:100,lookbackDays:10,...l},`project external session sync provider completed`),l}async maybeHydrateCodexExternalSessionConfig(e){if(!e||!this.shouldHydrateCodexExternalSessionConfig(e))return e;let t=rP(e),n=lF([e.nativeSessionId,e.id]);for(let r of n)try{iP(`config.get.probe.begin`,{projectId:e.projectId,sessionId:e.id,threadId:r,...aP(e)});let n=await Gk(r);if(!n){iP(`config.get.probe.empty`,{projectId:e.projectId,sessionId:e.id,threadId:r});continue}let i=n.sessionTurnConfig?oP(e.provider,e.sessionTurnConfig,n.sessionTurnConfig):e.sessionTurnConfig,a={...e,model:sP({currentModel:e.model,observedModel:n.model,observedSessionTurnConfig:i}),sessionTurnConfig:i,sessionTurnConfigUpdatedAt:n.sessionTurnConfigUpdatedAt,codexExternalConfigHydrationVersion:3,...t?{lastHydratedExternalConfigFreshnessAt:t}:{}};return await this.options.historyStore.upsertSession(a),iP(`config.get.probe.result`,{projectId:e.projectId,sessionId:e.id,threadId:r,snapshotModel:n.model??null,snapshotSessionTurnConfigModel:n.sessionTurnConfig?.model??null,snapshotReasoningEffort:n.sessionTurnConfig?.reasoningEffort??null,snapshotApprovalPolicy:n.sessionTurnConfig?.execution?.codex?.approvalPolicy??null,snapshotSandboxMode:n.sessionTurnConfig?.execution?.codex?.sandboxMode??null,snapshotUpdatedAt:n.sessionTurnConfigUpdatedAt,next:aP(a)}),this.options.historyStore.getProjectSession(e.projectId,e.id)??a}catch(t){iP(`config.get.probe.error`,{projectId:e.projectId,sessionId:e.id,threadId:r,error:String(t)})}return e}shouldHydrateCodexExternalSessionConfig(e){if(!this.options.preferNativeProviders||e.provider!==`codex`||!yP(e)||this.sessions.has(e.id)||e.nativeSessionId&&this.sessions.has(e.nativeSessionId))return!1;let t=rP(e),n=e.sessionTurnConfigUpdatedAt||``;if(!e.sessionTurnConfig||!dN(e.model)||!n||e.codexExternalConfigHydrationVersion!==3)return!0;if(!t)return!1;let r=e.lastHydratedExternalConfigFreshnessAt;return r?t.localeCompare(r)>0:!0}async resolveProjectForSessionStart(e,t){if(!e&&!t)throw Error(`session.start requires projectId or cwd`);if(e&&t){let n=await this.options.projectStore.getById(e);if(!n)throw LT(e);if((await this.options.projectStore.upsertByPath(t)).id!==n.id)throw Error(`projectId (${e}) does not match cwd (${t})`);return await KF(n.path),n}if(e){let t=await this.options.projectStore.getById(e);if(!t)throw LT(e);return await KF(t.path),t}return this.options.projectStore.upsertByPath(t)}async attachRuntimeSession(e){let t=this.sessions.get(e.id);t&&await this.closeRuntimeSession(t.id,`replaced`,{suppressAudit:!0});let n={...e,unsubscribe:()=>{}};return await this.initializeRawSeqCursor(n.id),n.unsubscribe=n.providerSession.onEvent(e=>{if(!n.streamReady){n.bufferedProviderEvents.push(e);return}this.handleProviderEvent(n,e)}),this.sessions.set(n.id,n),n}handleProviderEvent(e,t){let n=this.ensureProviderRequestId(t);this.emitRawEnvelope(e,n),this.maybePersistUpdatedNativeSessionId(e);let r=new Date().toISOString();if(e.updatedAt=r,this.touchSession(e),n.type===`thread.title.updated`){let t=UF(n.title);t&&this.setSessionTitle(e,t);return}if(n.type===`turn.started`){e.status=`running`,e.activeStartedAt=e.activeStartedAt??r,e.dispatchInFlight=!1,this.persistSessionSnapshot(e);return}if(n.type===`turn.completed`||n.type===`turn.failed`){e.status=`idle`,e.dispatchInFlight=!1,this.persistSessionSnapshot(e),e.provider===`claude`&&this.closeRuntimeSession(e.id,`turn_terminal`);return}if(SP(e,n)){let t=UF(n.message);e.status!==`idle`&&this.options.logger?.warn?.({sessionId:e.id,nativeSessionId:e.nativeSessionId,provider:e.provider,providerMode:e.providerMode,projectId:e.projectId,projectPath:e.projectPath,model:e.model,previousStatus:e.status,nextStatus:`idle`,eventType:n.type,errorMessage:t},`provider session forced idle after error event`),e.status=`idle`,e.dispatchInFlight=!1,this.persistSessionSnapshot(e),xP(e,n)&&this.closeRuntimeSession(e.id,`provider_error`,{suppressAudit:!0});return}if(n.type===`tool.permission.requested`){let t=typeof n.requestId==`string`?n.requestId:``;if(!t)return;e.pendingToolApprovals.add(t),this.persistSessionSnapshot(e);return}if(n.type===`tool.permission.resolved`&&typeof n.requestId==`string`){e.pendingToolApprovals.delete(n.requestId),this.persistSessionSnapshot(e);return}if(n.type===`user.input.requested`){let t=typeof n.requestId==`string`?n.requestId:``;if(!t)return;e.pendingUserInputs.add(t),this.persistSessionSnapshot(e);return}if(n.type===`user.input.resolved`&&typeof n.requestId==`string`){e.pendingUserInputs.delete(n.requestId),this.persistSessionSnapshot(e);return}}emitRawEnvelope(e,t){let n={v:`1.0`,kind:`provider.raw`,rawSeq:this.nextRawSeqSync(e.id),provider:e.provider,sessionId:e.id,projectId:e.projectId,eventId:`raw_${DT(12)}`,ts:this.nextRawEnvelopeTimestamp(),type:t.type,payload:{raw:t}};this.options.onEnvelope(n),this.options.historyStore.appendRawEvent(n).catch(e=>{console.error(`[session-history] append raw event failed: ${String(e)}`)})}nextRawEnvelopeTimestamp(){let e=Date.now(),t=e>this.lastRawEnvelopeTimestampMs?e:this.lastRawEnvelopeTimestampMs+1;return this.lastRawEnvelopeTimestampMs=t,new Date(t).toISOString()}async initializeRawSeqCursor(e){if(this.nextRawSeqBySession.has(e))return;let t=await this.options.historyStore.getSessionRawSeqRange(e),n=t?t.max+1:1;this.nextRawSeqBySession.set(e,n)}async nextRawSeq(e){return await this.initializeRawSeqCursor(e),this.nextRawSeqSync(e)}nextRawSeqSync(e){let t=this.nextRawSeqBySession.get(e)??1;return this.nextRawSeqBySession.set(e,t+1),t}touchSession(e){e.lastActiveAtMs=Date.now()}isSessionEvictable(e){return!(e.closing||e.status!==`idle`||e.pendingToolApprovals.size>0||e.pendingUserInputs.size>0||e.dispatchInFlight)}async closeRuntimeSession(e,t,n){let r=this.sessions.get(e);if(!r||r.closing)return!1;r.closing=!0;let i=Date.now();this.options.logger?.info?.({sessionId:e,nativeSessionId:r.nativeSessionId,provider:r.provider,providerMode:r.providerMode,reason:t,statusBefore:r.status,projectId:r.projectId,projectPath:r.projectPath,model:r.model,pendingApprovalCount:r.pendingToolApprovals.size,pendingUserInputCount:r.pendingUserInputs.size,dispatchInFlight:r.dispatchInFlight},`provider runtime session close starting`);try{r.unsubscribe()}catch{}let a;try{await r.providerSession.close()}catch(n){a=n,console.error(`[session-runtime] failed closing session ${e}:`,n),this.options.logger?.error?.({sessionId:e,nativeSessionId:r.nativeSessionId,provider:r.provider,providerMode:r.providerMode,reason:t,projectId:r.projectId,projectPath:r.projectPath,model:r.model,error:String(n),err:n},`provider runtime session close failed`)}finally{r.status=`idle`,r.updatedAt=new Date().toISOString(),r.pendingToolApprovals.clear(),r.pendingUserInputs.clear();let t=this.sessions.get(e);if(!(t&&t!==r))try{await this.persistSessionSnapshot(r)}catch(t){console.error(`[session-runtime] failed persisting closed session ${e}: ${String(t)}`)}this.sessions.get(e)===r&&this.sessions.delete(e),r.dispatchInFlight=!1,r.closing=!1}if(this.options.logger?.info?.({sessionId:e,nativeSessionId:r.nativeSessionId,provider:r.provider,providerMode:r.providerMode,reason:t,projectId:r.projectId,projectPath:r.projectPath,model:r.model,result:a?`error`:`success`,durationMs:Date.now()-i},`provider runtime session close completed`),!n?.suppressAudit)try{await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.runtime.close`,sessionId:e,detail:{reason:t,provider:r.provider}})}catch(e){console.error(`[session-runtime] failed to record runtime close audit log: ${String(e)}`)}return!0}async sweepRuntimeSessions(){if(this.shuttingDown||this.sessions.size===0)return;let e=Date.now(),t=this.runtimeLifecycle.idleTtlMs,n=[...this.sessions.values()].filter(e=>this.isSessionEvictable(e)).sort((e,t)=>e.lastActiveAtMs-t.lastActiveAtMs);for(let r of n)e-r.lastActiveAtMs<t||await this.closeRuntimeSession(r.id,`idle_ttl`);await this.enforceProviderSessionCap(`codex`,this.runtimeLifecycle.maxCodexSessions),await this.enforceProviderSessionCap(`claude`,this.runtimeLifecycle.maxClaudeSessions),await this.enforceGlobalSessionCap(this.runtimeLifecycle.maxSessions)}async enforceProviderSessionCap(e,t){let n=[...this.sessions.values()].filter(t=>t.provider===e);if(n.length<=t)return;let r=n.length-t,i=n.filter(e=>this.isSessionEvictable(e)).sort((e,t)=>e.lastActiveAtMs-t.lastActiveAtMs),a=0;for(let e of i){if(a>=r)break;await this.closeRuntimeSession(e.id,`lru_cap`)&&(a+=1)}a<r&&console.warn(`[session-runtime] ${e} sessions exceed cap (${n.length}/${t}), no more idle sessions to evict`)}async enforceGlobalSessionCap(e){if(this.sessions.size<=e)return;let t=this.sessions.size-e,n=[...this.sessions.values()].filter(e=>this.isSessionEvictable(e)).sort((e,t)=>e.lastActiveAtMs-t.lastActiveAtMs),r=0;for(let e of n){if(r>=t)break;await this.closeRuntimeSession(e.id,`lru_cap`)&&(r+=1)}r<t&&console.warn(`[session-runtime] session count exceeds cap (${this.sessions.size}/${e}), no more idle sessions to evict`)}ensureProviderRequestId(e){return e.type===`tool.permission.requested`||e.type===`user.input.requested`?typeof e.requestId==`string`&&e.requestId.trim()?e:{...e,requestId:`req_${DT(8)}`}:e}async maybePersistSyncedExternalRawEvents(e,t,n,r){if(!r)return n;let i=await this.options.historyStore.mergeSessionRawEvents(e.id,n,{replaceMissing:!0,baseEventIds:t.map(e=>e.eventId)}),a=i[i.length-1]?.rawSeq;return typeof a==`number`&&Number.isFinite(a)&&a>0&&this.nextRawSeqBySession.set(e.id,a+1),i}async syncExternalRawHistory(e,t,n,r=n){if(e.provider===`claude`){let i=dF(e);if(!i)return{rawEvents:n};try{let a=Date.now(),o=await aj({projectPath:e.projectPath,nativeSessionId:i,provider:e.provider,sessionId:e.id,projectId:t}),s=Date.now(),c=await this.finalizeExternalRawHistorySync(e,r,o.rawEvents,o.updatedAt),l=await this.patchObservedExternalSessionSummary(e,{updatedAt:o.updatedAt,externallyRunning:o.status===`running`,model:o.model,sessionTurnConfig:o.sessionTurnConfig,sessionTurnConfigUpdatedAt:o.sessionTurnConfigUpdatedAt});return iP(`sync-external.claude`,{projectId:t,sessionId:e.id,source:e.source,localEventCount:n.length,localStoredEventCount:r.length,historyEventCount:o.rawEvents.length,resultEventCount:c.length,readHistoryDurationMs:s-a,finalizeDurationMs:Date.now()-s}),{rawEvents:c,session:l,nativeWatchPath:o.nativeWatchPath}}catch(i){return e.source===`native_discovered`&&uF(i)&&await this.markExternalHistoryHydrated(e.id,e.updatedAt),iP(`sync-external.claude.error`,{projectId:t,sessionId:e.id,source:e.source,localEventCount:n.length,localStoredEventCount:r.length,error:i instanceof Error?i.message:String(i)}),{rawEvents:n}}}if(e.provider!==`codex`)return{rawEvents:n};let i=VP(n,(this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0))?.status===`running`),a=lF([e.nativeSessionId,e.id]);for(let o of a)try{let a=Date.now(),s=await Wk(o,!0),c=Date.now(),l,u;if(e.source===`gateway`&&n.length>0)l=PF({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n,localCodexLiveTurnState:i}),u=`gateway_incremental`;else if(e.source===`native_discovered`&&n.length>0){let r=wF({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n});r?(l=r,u=`native_tail_incremental`):(l=CF({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`)}else l=CF({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`;let d=Date.now(),f=await this.finalizeExternalRawHistorySync(e,r,l,GF(s.updatedAt),i),p=await this.patchObservedExternalSessionSummary(e,{updatedAt:GF(s.updatedAt),externallyRunning:e.source===`gateway`?mP(s,i):pP(s)});return iP(`sync-external.codex`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,threadStatus:s.status,threadUpdatedAt:GF(s.updatedAt),threadTurnCount:s.turns.length,threadTurns:s.turns.slice(-3).map(e=>({id:e.id,status:e.status,itemCount:e.items.length,lastItemId:e.items[e.items.length-1]?.id??null,lastItemType:e.items[e.items.length-1]?.type??null})),externallyRunning:e.source===`gateway`?mP(s,i):pP(s),localEventCount:n.length,localStoredEventCount:r.length,historyBuildMode:u,historyEventCount:l.length,resultEventCount:f.length,readThreadDurationMs:c-a,buildHistoryDurationMs:d-c,finalizeDurationMs:Date.now()-d}),{rawEvents:f,session:p,nativeWatchPath:s.path??void 0}}catch(i){iP(`sync-external.codex.read.error`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,localEventCount:n.length,localStoredEventCount:r.length,error:i instanceof Error?i.message:String(i)})}return iP(`sync-external.codex.read.exhausted`,{projectId:t,sessionId:e.id,source:e.source,attemptedThreadIds:a,localEventCount:n.length}),{rawEvents:n}}async finalizeExternalRawHistorySync(e,t,n,r=e.updatedAt,i){let a=Date.now(),o=jP(e.provider,t,n,i),s=Date.now(),c=await this.maybePersistSyncedExternalRawEvents(e,t,o,!0);return await this.markExternalHistoryHydrated(e.id,r),iP(`sync-external.finalize`,{sessionId:e.id,provider:e.provider,source:e.source,localEventCount:t.length,historyEventCount:n.length,mergedEventCount:o.length,persistedEventCount:c.length,hydratedExternalUpdatedAt:r,mergeDurationMs:s-a,persistDurationMs:Date.now()-s}),c}async patchObservedExternalSessionSummary(e,t){let n=this.options.historyStore.getSession(e.id)??e,r=this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0),i=lP(n),a=t.sessionTurnConfig?oP(e.provider,n.sessionTurnConfig,t.sessionTurnConfig,{preserveReasoningEffort:i}):void 0,o=dP(r,t.externallyRunning),s=o.status===`running`?r?.pendingToolApprovals.size??0:0,c=o.status===`running`?r?.pendingUserInputs.size??0:0,l={...n,updatedAt:o.status===`running`?r?.updatedAt??t.updatedAt:t.updatedAt,status:o.status,model:r?.model??sP({currentModel:n.model,observedModel:t.model,observedSessionTurnConfig:a}),sessionTurnConfig:r?.sessionTurnConfig??a??(n.sessionTurnConfig?cP(e.provider,n.sessionTurnConfig,{preserveReasoningEffort:i}):void 0),sessionTurnConfigUpdatedAt:r?.sessionTurnConfigUpdatedAt??(a?t.sessionTurnConfigUpdatedAt??t.updatedAt:void 0)??n.sessionTurnConfigUpdatedAt,interactionLockReason:o.interactionLockReason,pendingApprovals:s,pendingUserInputs:c,pendingActions:s+c,...e.provider===`codex`&&a?{codexExternalConfigHydrationVersion:3}:{}};return await this.options.historyStore.upsertSession(l),this.options.historyStore.getSession(e.id)??l}async markExternalHistoryHydrated(e,t){await this.options.historyStore.patchSession(e,{lastHydratedExternalUpdatedAt:t})}mustGetSession(e){let t=this.sessions.get(e);if(!t)throw zT(e);return t}markSessionStreamReady(e){if(e.streamReady||(e.streamReady=!0,e.bufferedProviderEvents.length===0))return;let t=[...e.bufferedProviderEvents];e.bufferedProviderEvents.length=0;for(let n of t)this.handleProviderEvent(e,n)}async persistSessionSnapshot(e){await this.options.historyStore.upsertSession(this.toSessionSummary(e))}async persistGatewayOwnedDispatchStart(e){e.status=`running`;let t=new Date().toISOString();e.updatedAt=t,e.activeStartedAt=t,this.touchSession(e),await this.persistSessionSnapshot(e)}async restoreUnacceptedGatewayOwnedDispatch(e){e.status=`idle`,e.dispatchInFlight=!1,e.updatedAt=new Date().toISOString(),this.touchSession(e),await this.persistSessionSnapshot(e)}listAllSessionsWithRuntime(e=`all`){let t=new Map(this.options.historyStore.listSessions(`all`).map(e=>[e.id,e]));for(let e of this.sessions.values())(!t.get(e.id)||e.status===`running`)&&t.set(e.id,this.toSessionSummary(e));return[...t.values()].filter(t=>e===`all`||t.status===e).sort((e,t)=>{let n=e.updatedAt||e.createdAt;return(t.updatedAt||t.createdAt).localeCompare(n)})}listProjectSessionsWithRuntime(e,t=`all`){return this.listAllSessionsWithRuntime(t).filter(t=>t.projectId===e)}getRuntimeSessionSummary(e,t,n){let r=this.sessions.get(t);if(!(!r||r.projectId!==e)&&!(r.status!==`running`&&n))return this.toSessionSummary(r)}toSessionSummary(e){return{id:e.id,nativeSessionId:e.nativeSessionId,source:e.source,...e.source===`gateway`?{lastHydratedExternalUpdatedAt:e.updatedAt}:{},projectId:e.projectId,projectPath:e.projectPath,provider:e.provider,providerMode:e.providerMode,model:e.model,title:e.title,sessionTurnConfig:e.sessionTurnConfig,sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt,createdAt:e.createdAt,updatedAt:e.updatedAt,activeStartedAt:e.activeStartedAt,status:e.status,interactionLockReason:void 0,pendingApprovals:e.pendingToolApprovals.size,pendingUserInputs:e.pendingUserInputs.size,pendingActions:e.pendingToolApprovals.size+e.pendingUserInputs.size}}setSessionTitle(e,t){let n=BF(t);!n||n===e.title||(e.title=n,e.updatedAt=new Date().toISOString(),this.persistSessionSnapshot(e))}resolveCanonicalSessionId(e,t,n){return e===`codex`&&t.getNativeSessionId?.()||n}resolveNativeSessionId(e,t,n){return e!==`codex`&&e!==`claude`?n:t.getNativeSessionId?.()||n}maybePersistUpdatedNativeSessionId(e){let t=this.resolveNativeSessionId(e.provider,e.providerSession,e.nativeSessionId);!t||t===e.nativeSessionId||this.shouldPersistNativeSessionId(e,t)&&(e.nativeSessionId=t,e.updatedAt=new Date().toISOString(),this.persistSessionSnapshot(e))}shouldPersistNativeSessionId(e,t){return e.source===`native_discovered`?!1:e.nativeSessionId?e.nativeSessionId===e.id&&e.id.startsWith(`sess_`)?t!==e.nativeSessionId:!1:!0}};const AP=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]);function jP(e,t,n,r){if(e===`claude`)return NP(e,WP(t,n),n);if(e!==`codex`)return NP(e,t,n);if(t.length===0)return n.slice().sort((e,t)=>e.ts.localeCompare(t.ts));let i=r??VP(t),a=MP(e,t.filter(e=>!LP(e))),o=JP(e),s=t.filter(t=>{if(BP(t,i))return!1;if(!LP(t))return!0;let n=YP(e,t,o);if(n.length===0||n.some(e=>(a.get(e)??0)<=0))return!0;for(let e of n){let t=(a.get(e)??0)-1;t>0?a.set(e,t):a.delete(e)}return!1}),c=new Map,l=new Map,u=new Set,d=JP(e),f=JP(e),p=UP(t)??UP(n)??Date.now();for(let[t,n]of s.entries()){c.set(n.eventId,n),l.set(n.eventId,t);for(let t of YP(e,n,d))u.add(t)}for(let t of n){if(BP(t,i))continue;let n=YP(e,t,f);if(!c.has(t.eventId)&&n.length>0&&n.every(e=>u.has(e)))continue;let r=c.get(t.eventId);if(r){if(!PP(r,t))continue;let e=l.get(t.eventId),n=HP(r,t);e!==void 0&&(s[e]=n),c.set(n.eventId,n)}else{p+=1;let e={...t,ts:new Date(p).toISOString()};c.set(e.eventId,e),l.set(e.eventId,s.length),s.push(e)}for(let e of n)u.add(e)}return s}function MP(e,t){let n=new Map,r=JP(e);for(let i of t)for(let t of YP(e,i,r))n.set(t,(n.get(t)??0)+1);return n}function NP(e,t,n){let r=new Map,i=new Set,a=JP(e),o=JP(e);for(let n of t){r.set(n.eventId,n);for(let t of YP(e,n,a))i.add(t)}for(let t of n){let n=YP(e,t,o);if(!(!r.has(t.eventId)&&n.length>0&&n.every(e=>i.has(e)))){r.set(t.eventId,t);for(let e of n)i.add(e)}}return[...r.values()].sort((e,t)=>e.ts.localeCompare(t.ts))}function PP(e,t){return FP(e)&&FP(t)}function FP(e){return e.type===`native.raw`?$(aF(e.payload.raw).source)===`codex.history.thread_read`:!1}function IP(e){return e===`codex.history.thread_read`||e===`codex.history.thread_read.incremental`}function LP(e){let t=aF(e.payload.raw),n=$(t.source);return t.historyReplay===!0||IP(n)}function RP(e){let t=aF(e.payload.raw),n=aF(t.item),r=aF(t.turn);if(e.type===`turn.started`||e.type===`turn.completed`||e.type===`turn.failed`)return $(t.turn_id)??$(t.turnId)??$(r.id)??$(n.turn_id)??$(n.turnId);if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`)return $(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId)??$(r.id);if(e.type!==`native.raw`)return;let i=$(t.source),a=aF(t.message);if(i===`codex.app_server`){let e=$(a.method),t=aF(a.params);return e===`turn/started`||e===`turn/completed`||e===`turn/failed`||e===`turn/interrupted`?$(aF(t.turn).id)??$(t.turn_id)??$(t.turnId):e===`item/started`||e===`item/updated`||e===`item/completed`?$(t.turn_id)??$(t.turnId)??$(aF(t.item).turn_id)??$(aF(t.item).turnId):void 0}if(i!==`codex.history.thread_read`)return;let o=$(a.scope);if(o===`turn`)return $(aF(a.turn).id);if(o===`item`)return $(a.turn_id)??$(aF(a.item).turn_id)}function zP(e){let t=aF(e.payload.raw);if(e.type===`turn.completed`||e.type===`turn.failed`){let n=$(t.status)??(e.type===`turn.completed`?`completed`:`failed`);return n&&RF(n)?n:void 0}if(e.type!==`native.raw`)return;let n=$(t.source),r=aF(t.message);if(n===`codex.app_server`){let e=$(r.method);if(e!==`turn/completed`&&e!==`turn/failed`&&e!==`turn/interrupted`)return;let t=$(aF(aF(r.params).turn).status)??(e===`turn/completed`?`completed`:e===`turn/interrupted`?`interrupted`:`failed`);return t&&RF(t)?t:void 0}if(n!==`codex.history.thread_read`||$(r.scope)!==`turn`)return;let i=$(aF(r.turn).status);return i&&RF(i)?i:void 0}function BP(e,t){if(!LP(e))return!1;let n=RP(e),r=zP(e);return!n||!r?!1:zF(t.terminalTurnStatusById.get(n),r)}function VP(e,t=!1){let n=new Set,r=new Map;for(let t of e){if(LP(t))continue;let e=RP(t);e&&n.add(e);let i=zP(t);e&&i&&r.set(e,i)}let i=new Set;if(t)for(let e of n)r.has(e)||i.add(e);return{activeTurnIds:i,terminalTurnStatusById:r}}function HP(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function UP(e){let t;for(let n of e){let e=Date.parse(n.ts);Number.isFinite(e)&&(t=t===void 0?e:Math.max(t,e))}return t}function WP(e,t){let n=GP(e);if(n.size===0)return e;let r=new Set(e.map(e=>e.eventId)),i=new Set;for(let e of t){if(r.has(e.eventId))continue;let t=qP(e);if(!t)continue;let a=n.get(t.text);if(!a||a.length===0)continue;let o,s=1/0;for(let e of a){if(e.consumed)continue;let n=t.tsMs-e.tsMs;if(n>3e4||n<0)continue;let r=Math.abs(n);r>=s||(o=e,s=r)}if(o){o.consumed=!0;for(let e of o.eventIds)i.add(e)}}return i.size===0?e:e.filter(e=>!i.has(e.eventId))}function GP(e){let t=new Map,n=new Map;for(let r of e){let e=KP(r);if(!e)continue;let i=t.get(e.text)??[],a=e.syntheticMessageId?`${e.text}\u0000${e.syntheticMessageId}`:``,o=a?n.get(a):void 0;if(o)o.tsMs=Math.min(o.tsMs,e.tsMs),o.eventIds.push(r.eventId);else{let t={text:e.text,tsMs:e.tsMs,eventIds:[r.eventId],consumed:!1};i.push(t),a&&n.set(a,t)}t.set(e.text,i)}return t}function KP(e){let t=Date.parse(e.ts);if(!Number.isFinite(t))return;if(e.type===`item.completed`){let n=aF(aF(e.payload.raw).item);if($(n.type)!==`user_message`||$(n.source_event_type)!==`claude.synthetic.user_input`)return;let r=sF(n);return r?{text:r,tsMs:t,syntheticMessageId:UF(n.id)??UF(n.item_id)??UF(n.itemId)}:void 0}if(e.type!==`native.raw`)return;let n=aF(e.payload.raw);if($(n.source)!==`claude.synthetic.user_input`||($(n.native_type)??$(aF(n.message).type))!==`user`)return;let r=cF(aF(aF(n.message).message));if(r)return{text:r,tsMs:t,syntheticMessageId:UF(aF(n.message).uuid)}}function qP(e){if(e.type!==`native.raw`)return;let t=Date.parse(e.ts);if(!Number.isFinite(t))return;let n=aF(e.payload.raw),r=$(n.source);if(!r||!AP.has(r))return;let i=aF(n.message);if(($(n.native_type)??$(i.type))!==`user`)return;let a=cF(aF(i.message));if(a)return{text:a,tsMs:t}}function JP(e){if(e===`codex`)return{codexTurnScopedItemOccurrences:new Map}}function YP(e,t,n){return e===`codex`?XP(t,n):e===`claude`?nF(t):[]}function XP(e,t){let n=aF(e.payload.raw),r=new Set,i=rF(e.type,n);if(i){let a=ZP(e.type,n);a?r.add(eF(a,t,n)):r.add(i)}if(e.type!==`native.raw`)return[...r];let a=$(n.source);if(a===`codex.app_server`){let e=aF(n.message),i=$(e.method),a=aF(e.params);if(i===`turn/started`)return r.add(iF(`turn.started`,{turn:aF(a.turn)})),[...r];if(i===`turn/completed`)return r.add(iF(`turn.completed`,{status:`completed`,turn:aF(a.turn)})),[...r];if(i===`turn/failed`||i===`turn/interrupted`)return r.add(iF(`turn.failed`,{status:i===`turn/interrupted`?`interrupted`:`failed`,turn:aF(a.turn)})),[...r];if(i===`item/started`||i===`item/updated`||i===`item/completed`){let e=i.replace(`/`,`.`),n={turn_id:$(a.turn_id)??$(a.turnId)??$(aF(a.item).turn_id),item:aF(a.item)},o=ZP(e,n);return o?r.add(eF(o,t,n)):r.add(iF(e,n)),[...r]}return[...r]}if(a!==`codex.history.thread_read`)return[...r];let o=aF(n.message),s=$(o.scope);if(s===`thread`){let e=aF(o.thread),t=$(e.id);t&&r.add(iF(`thread.started`,{thread_id:t,thread:e}));let n=VF(oF(e.preview)??oF(e.name)??``);return n&&r.add(iF(`thread.title.updated`,{title:n,thread_id:t})),[...r]}if(s===`turn`){let e=aF(o.turn),t=$(e.status);return r.add(iF(`turn.started`,{turn:e})),t===`completed`?r.add(iF(`turn.completed`,{status:t,turn:e})):(t===`failed`||t===`interrupted`)&&r.add(iF(`turn.failed`,{status:t,turn:e})),[...r]}if(s===`item`){let e={turn_id:$(o.turn_id)??$(aF(o.item).turn_id),item:aF(o.item),...o.semantic_occurrence===void 0?{}:{semantic_occurrence:o.semantic_occurrence}},n=ZP(`item.completed`,e);return n?r.add(eF(n,t,e)):r.add(iF(`item.completed`,e)),[...r]}return[...r]}function ZP(e,t){if(!e.startsWith(`item.`))return;let n=aF(t.item),r=$(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId),i=QP($(n.type));if(!(!r||!i))return[`codex`,e,r,i,$P(i,$(n.phase)),$(n.status)??``,yF($(n.command)),yF(sF(n))].join(`|`)}function QP(e){if(!e)return;let t=e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).replace(/[\s-]+/g,`_`).toLowerCase();return t.length>0?t:void 0}function $P(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function eF(e,t,n){let r=tF(n);if(r!==void 0)return`${e}|${r}`;let i=t?.codexTurnScopedItemOccurrences;if(!i)return e;let a=(i.get(e)??0)+1;return i.set(e,a),`${e}|${a}`}function tF(e){if(!e)return;let t=e.semantic_occurrence??e.semanticOccurrence;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return t;if(typeof t==`string`){let e=Number.parseInt(t,10);if(Number.isInteger(e)&&e>0)return e}}function nF(e){let t=aF(e.payload.raw),n=rF(e.type,t);if(n)return[n];if(e.type!==`native.raw`)return[];let r=$(t.source);if(!r||!AP.has(r))return[];let i=aF(t.message),a=$(t.native_type)??$(i.type),o=aF(i.message);if(a===`user`){let e=cF(o),t=$(i.uuid);return!e||!t?[]:[iF(`item.completed`,{item:{id:t,type:`user_message`,text:e}})]}if(a===`assistant`){let e=cF(o),t=$(o.id)??$(i.uuid);return!e||!t?[]:[iF(`item.completed`,{item:{id:t,type:`agent_message`,text:e}})]}return[]}function rF(e,t){switch(e){case`thread.started`:case`thread.title.updated`:case`turn.started`:case`turn.completed`:case`turn.failed`:case`item.started`:case`item.updated`:case`item.completed`:return iF(e,t);default:return}}function iF(e,t){let n=aF(t.item),r=aF(t.turn),i=aF(t.thread),a=$(n.id)??``,o=$(t.turn_id)??$(t.turnId)??$(r.id)??$(n.turn_id)??``,s=$(r.status)??$(t.status)??``,c=$(t.thread_id)??$(t.threadId)??$(i.id)??``,l=$(n.type)??``,u=$(n.phase)??``,d=$(n.status)??``,f=yF($(n.command)),p=yF(sF(n)),m=yF(oF(t.message)),h=yF(oF(t.title));return e.startsWith(`item.`)?[e,a,l,u,d,f,p||m].join(`|`):e.startsWith(`turn.`)?[e,o,s].join(`|`):e===`thread.title.updated`?[e,c,h].join(`|`):[e,c,o,a,l,h||m].join(`|`)}function aF(e){return typeof e==`object`&&e?e:{}}function $(e){return typeof e==`string`&&e.trim()||void 0}function oF(e){if(typeof e==`string`)return e.length>0?e:void 0}function sF(e){let t=oF(e.text);if(t)return t;let n=Array.isArray(e.content)?e.content:[];if(n.length>0){let e=[];for(let t of n){let n=oF(aF(t).text);n&&e.push(n)}if(e.length>0)return e.join(`
528
- `)}let r=Array.isArray(e.summary)?e.summary:[];if(r.length>0){let e=r.map(e=>oF(e)).filter(e=>!!e);if(e.length>0)return e.join(`
529
- `)}return``}function cF(e){let t=$(e.content);if(t)return t;let n=$(e.text)??$(e.prompt);if(n)return n;let r=Array.isArray(e.content)?e.content:[],i=[];for(let e of r){if(typeof e==`string`){let t=e.trim();t&&i.push(t);continue}let t=aF(e),n=$(t.type);if(n&&n!==`text`)continue;let r=$(t.text)??$(t.content);r&&i.push(r)}if(i.length!==0)return i.join(`
530
- `)}function lF(e){let t=new Set;for(let n of e)n&&t.add(n);return[...t]}function uF(e){return String(e).includes(`returned no messages from getSessionMessages`)}function dF(e){return vP(e)}function fF(e){return e?{rawSeq:e.rawSeq,type:e.type,eventId:e.eventId,ts:e.ts}:null}function pF(e,t){let n=Math.min(e.length,t.length);for(let r=0;r<n;r+=1){let n=e[r],i=t[r];if(!mF(n,i))return r}return e.length===t.length?null:n}function mF(e,t){return _F(hF(e))===_F(hF(t))}function hF(e){let{ts:t,...n}=e;return n}function gF(e){if(typeof e==`string`)return vF(e);if(Array.isArray(e))return e.map(e=>gF(e));if(!e||typeof e!=`object`)return e;let t=e,n={};for(let e of Object.keys(t).sort())n[e]=gF(t[e]);return n}function _F(e){return JSON.stringify(gF(e))}function vF(e){return e.length<=4096?e:{__type:`hashed_text`,length:e.length,sha256:(0,l.createHash)(`sha256`).update(e).digest(`hex`)}}function yF(e){if(!e)return``;let t=vF(e);return typeof t==`string`?t:`sha256:${t.length}:${t.sha256}`}function bF(e,t,n,r){if(!n.historyUpdated)return`unchanged`;if(n.refreshMode===`delta`)return`append_only_delta`;if(t.length<e.length)return`history_shrunk`;let i=Math.min(e.length,t.length);return r!==null&&r<i?`prefix_rewrite`:`snapshot_fallback`}function xF(e){let t=e.previousEvents[e.previousEvents.length-1]?.rawSeq??null,n=e.nextEvents[e.nextEvents.length-1]?.rawSeq??null,r=pF(e.previousEvents,e.nextEvents),i=r??Math.min(e.previousEvents.length,e.nextEvents.length);return{projectId:e.projectId,sessionId:e.sessionId,provider:e.session.provider,source:e.session.source,providerMode:e.session.providerMode,decision:e.classification.refreshMode,reason:bF(e.previousEvents,e.nextEvents,e.classification,r),historyUpdated:e.classification.historyUpdated,fromRawSeq:e.classification.fromRawSeq??null,toRawSeq:e.classification.toRawSeq??null,previousEventCount:e.previousEvents.length,nextEventCount:e.nextEvents.length,sharedPrefixCount:i,appendedCount:Math.max(0,e.nextEvents.length-e.previousEvents.length),firstMismatchIndex:r,previousLastRawSeq:t,nextLastRawSeq:n,previousMismatchEvent:fF(r===null?void 0:e.previousEvents[r]),nextMismatchEvent:fF(r===null?void 0:e.nextEvents[r])}}function SF(e,t){let n=e[e.length-1]?.rawSeq,r=t[t.length-1]?.rawSeq;return e.length===t.length&&e.every((e,n)=>{let r=t[n];return r!==void 0&&mF(e,r)})?{historyUpdated:!1,refreshMode:`snapshot`,...r===void 0?{}:{toRawSeq:r}}:t.length>e.length&&e.every((e,n)=>{let r=t[n];return r!==void 0&&mF(e,r)})?{historyUpdated:!0,refreshMode:`delta`,fromRawSeq:n??0,toRawSeq:r??n??0}:{historyUpdated:!0,refreshMode:`snapshot`,...r===void 0?{}:{toRawSeq:r}}}function CF(e){let t=[],n=e.thread.createdAt>0?e.thread.createdAt*1e3:Date.now(),r=0,i=()=>(r+=1,n+=1,new Date(n).toISOString()),a=(n,a)=>{let o=t.length+1;t.push({v:`1.0`,kind:`provider.raw`,rawSeq:o,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:NF(e.sessionId,r,a),ts:i(),type:`native.raw`,payload:{raw:{source:`codex.history.thread_read`,native_type:`thread.read.snapshot`,message:n,historyReplay:!0,replaySynthetic:!0}}})};a({scope:`thread`,thread:{id:e.thread.id,preview:e.thread.preview,model_provider:e.thread.modelProvider,created_at:e.thread.createdAt,updated_at:e.thread.updatedAt,path:e.thread.path,cwd:e.thread.cwd,cli_version:e.thread.cliVersion,source:e.thread.source,git_info:e.thread.gitInfo}},[`thread`,e.thread.id,e.thread.updatedAt]);for(let t of e.thread.turns){let n=e.localCodexLiveTurnState?e.localCodexLiveTurnState.terminalTurnStatusById.has(t.id)||e.localCodexLiveTurnState.activeTurnIds.has(t.id):!1,r=e.localCodexLiveTurnState?.terminalTurnStatusById.get(t.id);(RF(t.status)?!zF(r,t.status):!n)&&a({scope:`turn`,thread_id:e.thread.id,turn:{id:t.id,status:t.status,error:t.error}},[`turn`,t.id,t.status]);for(let n of t.items)a({scope:`item`,thread_id:e.thread.id,turn_id:t.id,item:n},[`item`,t.id,UF(n.id)??null])}return t}function wF(e){let t=TF(e.localEvents);if(!t.hasHistoryReplay||!t.hasThreadEnvelope)return null;let n=e.thread.turns.map(e=>e.id);if(t.turnOrder.length>n.length)return null;for(let[e,r]of t.turnOrder.entries())if(n[e]!==r)return null;let r=[],i=Math.max(UP(e.localEvents)??0,e.thread.updatedAt>0?e.thread.updatedAt*1e3:Date.now()),a=0,o=()=>(a+=1,i+=1,new Date(i).toISOString()),s=(t,n)=>{r.push({v:`1.0`,kind:`provider.raw`,rawSeq:r.length+1,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:NF(e.sessionId,a,n),ts:o(),type:`native.raw`,payload:{raw:{source:`codex.history.thread_read`,native_type:`thread.read.snapshot`,message:t,historyReplay:!0,replaySynthetic:!0}}})},c=t.turnOrder.length-1;for(let[n,r]of e.thread.turns.entries()){let i=t.turnsById.get(r.id);if(!i){s({scope:`turn`,thread_id:e.thread.id,turn:{id:r.id,status:r.status,error:r.error}},[`turn`,r.id,r.status]);for(let t of r.items)s({scope:`item`,thread_id:e.thread.id,turn_id:r.id,item:t},[`item`,r.id,UF(t.id)??null]);continue}let a=n!==c,o=DF(i,r);if(!o.safe||a&&(o.appendedItems.length>0||o.statusChanged))return null;if(!a){o.statusChanged&&s({scope:`turn`,thread_id:e.thread.id,turn:{id:r.id,status:r.status,error:r.error}},[`turn`,r.id,r.status]);for(let t of o.appendedItems)s({scope:`item`,thread_id:e.thread.id,turn_id:r.id,item:t},[`item`,r.id,UF(t.id)??null])}}return r}function TF(e){let t={hasHistoryReplay:!1,hasThreadEnvelope:!1,turnOrder:[],turnsById:new Map};for(let n of e){if(n.type!==`native.raw`)continue;let e=aF(n.payload.raw);if($(e.source)!==`codex.history.thread_read`)continue;let r=aF(e.message),i=$(r.scope);if(t.hasHistoryReplay=!0,i===`thread`){t.hasThreadEnvelope=!0;continue}if(i===`turn`){let e=aF(r.turn),n=$(e.id);if(!n)continue;let i=EF(t,n),a=$(e.status);a&&(i.status=a),i.fingerprint=jF(e);continue}if(i!==`item`)continue;let a=aF(r.item),o=$(r.turn_id)??$(a.turn_id);if(!o)continue;let s=EF(t,o),c=OF(o,a,void 0,s.itemOccurrenceByBaseKey);c&&(s.itemFingerprintByKey.has(c)||s.itemOrder.push(c),s.itemFingerprintByKey.set(c,AF(a)))}return t}function EF(e,t){let n=e.turnsById.get(t);if(n)return n;let r={itemOrder:[],itemFingerprintByKey:new Map,itemOccurrenceByBaseKey:new Map};return e.turnsById.set(t,r),e.turnOrder.push(t),r}function DF(e,t){if(t.items.length<e.itemOrder.length)return{safe:!1,appendedItems:[],statusChanged:!1};let n=new Map;for(let[r,i]of e.itemOrder.entries()){let a=t.items[r];if(!a||OF(t.id,a,r,n)!==i||e.itemFingerprintByKey.get(i)!==AF(a))return{safe:!1,appendedItems:[],statusChanged:!1}}return e.fingerprint!==void 0&&e.fingerprint!==jF(t)&&(e.status??``)===t.status?{safe:!1,appendedItems:[],statusChanged:!1}:{safe:!0,appendedItems:t.items.slice(e.itemOrder.length),statusChanged:(e.status??``)!==t.status}}function OF(e,t,n,r){let i=kF(e,t,n);if(!i)return;let a=tF(t);if(a!==void 0)return`${i}|${a}`;if(!r)return i;let o=(r.get(i)??0)+1;return r.set(i,o),`${i}|${o}`}function kF(e,t,n){let r=ZP(`item.completed`,{turn_id:e,item:t});if(r)return r;let i=UF(t.id);if(i)return`id:${i}`;if(n!==void 0)return`${e}::${n}`}function AF(e){let t=QP($(e.type)),n=t?$P(t,$(e.phase)):$(e.phase),r={};for(let[i,a]of Object.entries(e))if(!(i===`id`||i===`turn_id`||i===`turnId`)){if(i===`type`){t&&(r.type=t);continue}if(i===`phase`){n&&(r.phase=n);continue}r[i]=a}return t&&r.type===void 0&&(r.type=t),_F(r)}function jF(e){return _F({status:$(e.status)??null,error:aF(e.error)})}function MF(e){return String(e??``).replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)}function NF(e,t,n){let r=n.map(MF).filter(e=>e.length>0);return r.length===0?`raw_hist_codex_${e}_${t.toString().padStart(6,`0`)}`:`raw_hist_codex_${e}_${r.join(`_`)}`}function PF(e){let t=e.localCodexLiveTurnState??VP(e.localEvents),n=new Set,r=FF(e.localEvents),i=new Map(t.terminalTurnStatusById),a=0,o=1;for(let t of e.localEvents){let e=Date.parse(t.ts);Number.isFinite(e)&&(a=Math.max(a,e)),o=Math.max(o,t.rawSeq+1);let r=aF(t.payload.raw),s=$(r.source),c=s===`codex.history.thread_read.incremental`;if(t.type===`turn.started`){let e=$(r.turn_id)??$(aF(r.turn).id);e&&!c&&n.add(e);continue}if(t.type===`turn.completed`||t.type===`turn.failed`){let e=$(r.turn_id)??$(aF(r.turn).id);if(!e)continue;c||n.add(e);let a=$(r.status)??(t.type===`turn.completed`?`completed`:`failed`);i.set(e,a)}if(t.type!==`native.raw`)continue;if(s===`codex.app_server`){let e=aF(r.message),t=aF(e.params),i=$(e.method),a=$(aF(t.turn).id)??$(t.turn_id)??$(t.turnId);a&&(i===`turn/started`||i===`turn/completed`||i===`turn/failed`||i===`turn/interrupted`)&&n.add(a);continue}if(s!==`codex.history.thread_read`)continue;let l=aF(r.message);if($(l.scope)===`turn`){let e=aF(l.turn),t=$(e.id);if(!t)continue;let n=$(e.status);n&&RF(n)&&i.set(t,n);continue}}let s=Math.max(a,e.thread.createdAt>0?e.thread.createdAt*1e3:Date.now()),c=0,l=e=>String(e??``).replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``),u=t=>{let n=t.map(l).filter(e=>e.length>0);return n.length===0?`raw_sync_codex_${e.sessionId}_${o.toString().padStart(6,`0`)}`:`raw_sync_codex_${e.sessionId}_${n.join(`_`)}`},d=()=>(c+=1,new Date(s+c).toISOString()),f=[],p=(t,n)=>{let r=d();f.push({v:`1.0`,kind:`provider.raw`,rawSeq:o,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:u(n),ts:r,type:`native.raw`,payload:{raw:{source:`codex.history.thread_read`,native_type:`thread.read.snapshot`,message:t,historyReplay:!0,replaySynthetic:!0}}}),o+=1};for(let a of e.thread.turns){let s=i.get(a.id),c=zF(s,a.status);(!(n.has(a.id)||t.activeTurnIds.has(a.id))&&!c||RF(a.status)&&s!==a.status)&&p({scope:`turn`,thread_id:e.thread.id,turn:{id:a.id,status:a.status,error:a.error}},[`turn`,a.id,a.status]);let l=new Map;for(let t of a.items){let n=$(t.id),i=OF(a.id,t,void 0,l);if(i&&r.has(i))continue;let s=i?IF(i):void 0;p({scope:`item`,thread_id:e.thread.id,turn_id:a.id,item:t,...s?{semantic_occurrence:s}:{}},[`item`,a.id,n??`seq_${o}`])}}return f}function FF(e){let t=new Set,n=new Map;for(let r of e){let e=LF(r);if(!e)continue;let i=OF(e.turnId,e.item,void 0,n);i&&t.add(i)}return t}function IF(e){let t=e.lastIndexOf(`|`);if(t<0||t===e.length-1)return;let n=Number.parseInt(e.slice(t+1),10);return Number.isInteger(n)&&n>0?n:void 0}function LF(e){let t=aF(e.payload.raw);if(e.type===`item.completed`){let e=aF(t.item),n=$(t.turn_id)??$(t.turnId)??$(e.turn_id)??$(e.turnId);return!n||Object.keys(e).length===0?null:{turnId:n,item:e}}if(e.type!==`native.raw`)return null;let n=$(t.source);if(n===`codex.app_server`){let e=aF(t.message);if($(e.method)!==`item/completed`)return null;let n=aF(e.params),r=aF(n.item),i=$(n.turn_id)??$(n.turnId)??$(r.turn_id)??$(r.turnId);return!i||Object.keys(r).length===0?null:{turnId:i,item:r}}if(n===`codex.history.thread_read`){let e=aF(t.message);if($(e.scope)!==`item`)return null;let n={...aF(e.item),...e.semantic_occurrence===void 0?{}:{semantic_occurrence:e.semantic_occurrence}},r=$(e.turn_id)??$(n.turn_id)??$(n.turnId);return!r||Object.keys(n).length===0?null:{turnId:r,item:n}}return null}function RF(e){return e===`completed`||e===`failed`||e===`interrupted`}function zF(e,t){return e===t&&RF(t)}function BF(e){let t=e.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g,``).replace(/\s+/g,` `).trim();if(t)return t}function VF(e,t=60){let n=BF(e);if(!n)return;let r=Array.from(n);return r.length<=t?n:r.slice(0,t).join(``).trimEnd()}function HF(e,t){if(t){let e=VF(t);if(e)return e}if(e.provider!==`codex`||!e.codex)return VF(`代码审查`);let n=e.codex.target;return n.type===`baseBranch`?VF(`审查 ${n.branch} 分支改动`):n.type===`custom`?VF(n.instructions):n.type===`commit`?VF(n.title||`审查提交 ${n.sha.slice(0,12)}`):VF(`审查未提交更改`)}function UF(e){if(typeof e!=`string`)return;let t=BF(e);if(t)return t}function WF(e){let t=0;for(let n of Object.values(e))n.some(e=>e.trim().length>0)&&(t+=1);return t}function GF(e){return!Number.isFinite(e)||e<=0?new Date().toISOString():new Date(e*1e3).toISOString()}async function KF(e){if(!(await d.default.stat(e)).isDirectory())throw Error(`Project path is not a directory: ${e}`)}var qF=class{indexPath;eventsDir;sessions=new Map;rawEventsCacheBySession=new Map;compactedRawEventsCacheBySession=new Map;pendingRawMutationsBySession=new Map;ready;writeQueue=Promise.resolve();constructor(e,t={}){this.baseDir=e,this.options=t,this.indexPath=p.default.join(e,`session-index.json`),this.eventsDir=p.default.join(e,`session-events`),this.ready=this.loadFromDisk()}async init(){await this.ready}logDebug(e,t){this.options.logDebug?.(`history-store.${e}`,t)}async flushRawCompactions(e){await this.ready}async shutdown(){await this.ready}async upsertSession(e){await this.ready;let t=JF(e),n=this.sessions.get(t.id);this.sessions.set(t.id,{...n,...t}),await this.enqueueWrite(async()=>{await this.persistIndex()})}async patchSession(e,t){await this.ready;let n=this.sessions.get(e);return n?(this.sessions.set(e,JF({...n,...t})),await this.enqueueWrite(async()=>{await this.persistIndex()}),!0):!1}async setSessionStatus(e,t,n){await this.ready;let r=this.sessions.get(e);r&&(this.sessions.set(e,{...r,status:t,updatedAt:n,interactionLockReason:void 0,pendingApprovals:t===`running`?r.pendingApprovals:0,pendingUserInputs:t===`running`?r.pendingUserInputs:0,pendingActions:t===`running`?r.pendingActions:0}),await this.enqueueWrite(async()=>{await this.persistIndex()}))}async removeSession(e){if(await this.ready,!this.sessions.has(e))return;this.sessions.delete(e),this.rawEventsCacheBySession.delete(e),this.compactedRawEventsCacheBySession.delete(e);let t=p.default.join(this.eventsDir,`${e}.jsonl`),n=p.default.join(this.eventsDir,`${e}.raw.jsonl`);await this.enqueueWrite(async()=>{await Promise.all([this.persistIndex(),d.default.rm(t,{force:!0}),d.default.rm(n,{force:!0})])})}hasSession(e){return this.sessions.has(e)}getSession(e){return this.sessions.get(e)}getProjectSession(e,t){let n=this.sessions.get(t);if(!(!n||n.projectId!==e))return n}listSessions(e=`all`){return[...this.sessions.values()].filter(t=>e===`all`||t.status===e).sort((e,t)=>{let n=e.updatedAt||e.createdAt;return(t.updatedAt||t.createdAt).localeCompare(n)})}listProjectSessions(e,t=`all`){return this.listSessions(t).filter(t=>t.projectId===e)}async appendRawEvent(e){await this.ready;let t=this.normalizeRawEventProjectIdentity(e);this.sessions.has(t.sessionId)&&(hI(t)||await this.enqueueRawSessionWrite(t.sessionId,async()=>{if(sI(t)){let e=mI([...await this.readSessionRawEventsLocked(t.sessionId),t]);await this.replaceRawEventFile(t.sessionId,e),this.rawEventsCacheBySession.set(t.sessionId,e),this.compactedRawEventsCacheBySession.set(t.sessionId,tI(e));return}await this.appendRawEventLine(t),this.appendRawEventToCache(t)}))}async mergeSessionRawEvents(e,t,n){if(await this.ready,!this.sessions.has(e))return[];let r=t.filter(t=>t.sessionId===e).map(e=>this.normalizeRawEventProjectIdentity(e)),i=[];return await this.enqueueRawSessionWrite(e,async()=>{let t=cI(await this.readSessionRawEventsLocked(e),r,n);await this.replaceRawEventFile(e,t);let a=tI(t);i=nI(a),this.rawEventsCacheBySession.set(e,t),this.compactedRawEventsCacheBySession.set(e,a)}),i}async getSessionRawEvents(e,t=300){return(await this.getSessionRawEventsWithCoverage(e,t)).rawEvents}async getSessionRawEventsWithCoverage(e,t=300){return this.getSessionRawEventsCompactedWithCoverage(e,t)}async getSessionStoredRawEvents(e,t=300){let n=Date.now();if(await this.ready,!this.sessions.has(e))return[];let r=Math.max(1,t),i=this.readSessionRawEventsFromCache(e);if(i!==void 0){let a=i.slice(-r);return this.logDebug(`stored-raw-read`,{sessionId:e,limit:t,normalizedLimit:r,cacheHit:!0,rawEventCount:i.length,returnedEventCount:a.length,totalDurationMs:Date.now()-n}),a}let a=[],o=0,s=Date.now();return await this.enqueueWrite(async()=>{o=Date.now()-s,a=(await this.readSessionRawEventsLocked(e)).slice(-r)}),this.logDebug(`stored-raw-read`,{sessionId:e,limit:t,normalizedLimit:r,cacheHit:!1,queueWaitDurationMs:o,returnedEventCount:a.length,totalDurationMs:Date.now()-n}),a}async getSessionRawEventsCompacted(e,t=300){return(await this.getSessionRawEventsCompactedWithCoverage(e,t)).rawEvents}async getSessionRawEventsCompactedWithCoverage(e,t=300){let n=Date.now();if(await this.ready,!this.sessions.has(e))return{rawEvents:[],coveredToRawSeq:null};let r=Math.max(1,t),i=this.readSessionRawEventsCompactedWithCoverageFromCache(e);if(i!==void 0){let a=$F(i,r);return this.logDebug(`compacted-read`,{sessionId:e,limit:t,normalizedLimit:r,cacheHit:!0,compactedEventCount:i.rawEvents.length,returnedEventCount:a.rawEvents.length,coveredToRawSeq:a.coveredToRawSeq,totalDurationMs:Date.now()-n}),a}let a={rawEvents:[],coveredToRawSeq:null},o=0,s=Date.now();return await this.enqueueWrite(async()=>{o=Date.now()-s,a=$F(await this.readSessionRawEventsCompactedWithCoverageLocked(e),r)}),this.logDebug(`compacted-read`,{sessionId:e,limit:t,normalizedLimit:r,cacheHit:!1,queueWaitDurationMs:o,returnedEventCount:a.rawEvents.length,coveredToRawSeq:a.coveredToRawSeq,totalDurationMs:Date.now()-n}),a}async getSessionRawEventsSinceSeq(e,t,n=2e3){if(await this.ready,!this.sessions.has(e))return[];let r=Math.max(1,n),i=this.readSessionRawEventsFromCache(e);if(i!==void 0)return Um(i.filter(e=>e.rawSeq>t)).slice(0,r);let a=[];return await this.enqueueWrite(async()=>{a=Um((await this.readSessionRawEventsLocked(e)).filter(e=>e.rawSeq>t)).slice(0,r)}),a}async getSessionRawSeqRange(e){if(await this.ready,!this.sessions.has(e))return null;let t=this.readSessionRawEventsFromCache(e);if(t!==void 0)return QF(t);let n=null;return await this.enqueueWrite(async()=>{n=QF(await this.readSessionRawEventsLocked(e))}),n}async loadFromDisk(){await d.default.mkdir(this.eventsDir,{recursive:!0});try{let e=await d.default.readFile(this.indexPath,`utf8`),t=JSON.parse(e);if(t.v!==1||!Array.isArray(t.sessions))return;for(let e of t.sessions)if(e?.id&&e?.provider&&e?.createdAt&&e?.updatedAt&&e?.status&&e?.projectId&&e?.projectPath){if(e.projectId!==e.projectPath)throw Error(`Legacy session project ids are no longer supported in ${this.indexPath}; clear the session history store and restart the gateway.`);this.sessions.set(e.id,{...e,status:`idle`,interactionLockReason:void 0,pendingApprovals:0,pendingUserInputs:0,pendingActions:0})}}catch(e){if(e.code!==`ENOENT`)throw e}}async persistIndex(){await d.default.mkdir(this.baseDir,{recursive:!0});let e={v:1,sessions:[...this.sessions.values()].sort((e,t)=>{let n=e.updatedAt||e.createdAt;return(t.updatedAt||t.createdAt).localeCompare(n)})};await d.default.writeFile(this.indexPath,`${JSON.stringify(e,null,2)}\n`,`utf8`)}enqueueWrite(e){return this.writeQueue=this.writeQueue.then(e,e),this.writeQueue}async enqueueRawSessionWrite(e,t){this.incrementPendingRawMutation(e);try{let e;return await this.enqueueWrite(async()=>{e=await t()}),e}finally{this.decrementPendingRawMutation(e)}}async appendRawEventLine(e){let t=p.default.join(this.eventsDir,`${e.sessionId}.raw.jsonl`),n=`${ZF(e)}\n`;await d.default.appendFile(t,n,`utf8`)}async replaceRawEventFile(e,t){let n=p.default.join(this.eventsDir,`${e}.raw.jsonl`),r=t.map(e=>ZF(e)).join(`
531
- `);await eI(n,r?`${r}\n`:``)}appendRawEventToCache(e){let t=this.rawEventsCacheBySession.get(e.sessionId),n=t?.[t.length-1];t&&t.push(e);let r=this.compactedRawEventsCacheBySession.get(e.sessionId);if(r){if(oI(e)){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}if(n&&aI(e,n)<0){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}iI(r,e)}}async readSessionRawEventsCompactedLocked(e){return(await this.readSessionRawEventsCompactedWithCoverageLocked(e)).rawEvents}async readSessionRawEventsCompactedWithCoverageLocked(e){let t=this.compactedRawEventsCacheBySession.get(e);if(t)return rI(t);let n=Date.now(),r=await this.readSessionRawEventsLocked(e),i=Date.now(),a=tI(r),o=Date.now()-i;this.compactedRawEventsCacheBySession.set(e,a);let s=rI(a);return this.logDebug(`compact-build`,{sessionId:e,rawEventCount:r.length,compactedEventCount:s.rawEvents.length,coveredToRawSeq:s.coveredToRawSeq,compactDurationMs:o,totalDurationMs:Date.now()-n}),s}async readSessionRawEventsLocked(e){let t=this.rawEventsCacheBySession.get(e);if(t)return t;let n=p.default.join(this.eventsDir,`${e}.raw.jsonl`),r,i=Date.now();try{r=await d.default.readFile(n,`utf8`)}catch(t){if(t.code===`ENOENT`)return this.rawEventsCacheBySession.set(e,[]),this.logDebug(`raw-file-read`,{sessionId:e,fileExists:!1,readDurationMs:Date.now()-i,totalDurationMs:Date.now()-i}),[];throw t}let a=Date.now()-i,o=Date.now(),s=r.split(`
532
- `).map(e=>e.trim()).filter(Boolean),c=[];for(let e of s)try{let t=JSON.parse(e);if(!YF(t)||t.kind!==`provider.raw`)continue;let n=XF(t.rawSeq);c.push({value:t,...n===void 0?{}:{rawSeq:n}})}catch{}let l=Date.now()-o;if(c.length===0)return this.rawEventsCacheBySession.set(e,[]),this.logDebug(`raw-file-read`,{sessionId:e,fileExists:!0,fileBytes:Buffer.byteLength(r,`utf8`),lineCount:s.length,parsedEventCount:0,readDurationMs:a,parseDurationMs:l,totalDurationMs:Date.now()-i}),[];let u=Date.now(),f=c.some(e=>e.rawSeq===void 0),m=c.map((e,t)=>({...e.value,rawSeq:e.rawSeq??t+1})),h=[];for(let t of m){let n=Kl.safeParse(t);if(n.success){let t=this.normalizeRawEventProjectIdentity(n.data);if(t.projectId!==n.data.projectId)throw Error(`Legacy raw event project ids are no longer supported for session ${e}; clear the session history store and restart the gateway.`);h.push(t)}}let g=Date.now()-u,_=0;if(f){let e=Date.now(),t=h.map(e=>ZF(e)).join(`
533
- `),r=t?`${t}\n`:``;await d.default.writeFile(n,r,`utf8`),_=Date.now()-e}return this.rawEventsCacheBySession.set(e,h),this.logDebug(`raw-file-read`,{sessionId:e,fileExists:!0,fileBytes:Buffer.byteLength(r,`utf8`),lineCount:s.length,parsedEventCount:c.length,normalizedEventCount:h.length,needsBackfill:f,readDurationMs:a,parseDurationMs:l,normalizeDurationMs:g,backfillWriteDurationMs:_,totalDurationMs:Date.now()-i}),h}normalizeRawEventProjectIdentity(e){let t=this.sessions.get(e.sessionId);return!t||!t.projectId||e.projectId===t.projectId?e:{...e,projectId:t.projectId}}readSessionRawEventsFromCache(e){if(!this.hasPendingRawMutation(e))return this.rawEventsCacheBySession.get(e)}readSessionRawEventsCompactedFromCache(e){return this.readSessionRawEventsCompactedWithCoverageFromCache(e)?.rawEvents}readSessionRawEventsCompactedWithCoverageFromCache(e){if(this.hasPendingRawMutation(e))return;let t=this.compactedRawEventsCacheBySession.get(e);if(t)return rI(t);let n=this.rawEventsCacheBySession.get(e);if(!n)return;let r=Date.now(),i=tI(n);this.compactedRawEventsCacheBySession.set(e,i);let a=rI(i);return this.logDebug(`compact-build-from-raw-cache`,{sessionId:e,rawEventCount:n.length,compactedEventCount:a.rawEvents.length,coveredToRawSeq:a.coveredToRawSeq,totalDurationMs:Date.now()-r}),a}incrementPendingRawMutation(e){this.pendingRawMutationsBySession.set(e,(this.pendingRawMutationsBySession.get(e)??0)+1)}decrementPendingRawMutation(e){let t=(this.pendingRawMutationsBySession.get(e)??0)-1;if(t>0){this.pendingRawMutationsBySession.set(e,t);return}this.pendingRawMutationsBySession.delete(e)}hasPendingRawMutation(e){return(this.pendingRawMutationsBySession.get(e)??0)>0}};function JF(e){let t=e.projectPath?.trim()||e.projectId;return t===e.projectId?e:{...e,projectId:t}}function YF(e){return typeof e==`object`&&!!e}function XF(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<=0))return e}function ZF(e){let t=new WeakSet;return JSON.stringify(e,(e,n)=>{if(typeof n==`bigint`)return n.toString();if(typeof n==`function`)return`[Function ${n.name||`anonymous`}]`;if(typeof n==`object`&&n){if(t.has(n))return`[Circular]`;t.add(n)}return n})}function QF(e){if(e.length===0)return null;let t=null,n=null;for(let r of e)t=t===null?r.rawSeq:Math.min(t,r.rawSeq),n=n===null?r.rawSeq:Math.max(n,r.rawSeq);return t===null||n===null?null:{min:t,max:n}}function $F(e,t){return{rawEvents:e.rawEvents.slice(-Math.max(1,t)),coveredToRawSeq:e.coveredToRawSeq}}async function eI(e,t){await d.default.mkdir(p.default.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;try{await d.default.writeFile(n,t,`utf8`),await d.default.rename(n,e)}catch(e){try{await d.default.rm(n,{force:!0})}catch{}throw e}}function tI(e){let t=Hm(e),n=t.map(e=>e),r=new Map;for(let[e,t]of n.entries()){let n=Gm(t);n&&r.set(n.key,e)}return{slots:n,indexByKey:r,dense:t,coveredToRawSeq:QF(e)?.max??null}}function nI(e){return e.dense||=e.slots.filter(e=>e!==null),e.dense}function rI(e){return{rawEvents:nI(e),coveredToRawSeq:e.coveredToRawSeq}}function iI(e,t){e.coveredToRawSeq=e.coveredToRawSeq===null?t.rawSeq:Math.max(e.coveredToRawSeq,t.rawSeq);let n=Gm(t);if(!n){e.slots.push(t),e.dense=null;return}let r=e.indexByKey.get(n.key);if(r===void 0){e.slots.push(t),e.indexByKey.set(n.key,e.slots.length-1),e.dense=null;return}let i=e.slots[r];if(!i){e.slots.push(t),e.indexByKey.set(n.key,e.slots.length-1),e.dense=null;return}let a=Km(i,t);if(!a){e.slots.push(t),e.indexByKey.set(n.key,e.slots.length-1),e.dense=null;return}e.slots[r]=null,e.slots.push(a),e.indexByKey.set(n.key,e.slots.length-1),e.dense=null}function aI(e,t){let n=e.ts.localeCompare(t.ts);return n===0?e.eventId.localeCompare(t.eventId):n}function oI(e){if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=YF(e.payload.raw)?e.payload.raw:{},n=YF(t.message)?t.message:{};return(typeof n.method==`string`?n.method:typeof t.method==`string`?t.method:``)===`item/completed`}function sI(e){if(oI(e)||e.type===`turn.completed`||e.type===`turn.failed`)return!0;if(e.type!==`native.raw`)return!1;let t=YF(e.payload.raw)?e.payload.raw:{},n=YF(t.message)?t.message:{},r=typeof n.method==`string`?n.method:typeof t.method==`string`?t.method:``;return r===`turn/completed`||r===`turn/failed`||r===`turn/interrupted`}function cI(e,t,n){if(n?.replaceMissing)return lI(e,t,n);let r=[...e].sort(pI),i=new Map,a=1;for(let[e,t]of r.entries())i.set(t.eventId,e),a=Math.max(a,t.rawSeq+1);for(let e of t){let t=i.get(e.eventId);if(t!==void 0){let n=r[t];n&&uI(n,e)&&(r[t]=fI(n,e));continue}let n={...e,rawSeq:a};a+=1,i.set(n.eventId,r.length),r.push(n)}return mI(r.sort(pI)).sort(pI)}function lI(e,t,n){let r=new Map(e.map(e=>[e.eventId,e])),i=new Set(t.map(e=>e.eventId)),a=n?.baseEventIds?new Set(n.baseEventIds):null,o=a?e.filter(e=>!a.has(e.eventId)&&!i.has(e.eventId)):[],s=[...t,...o].sort(pI),c=1;for(let t of e)c=Math.max(c,t.rawSeq+1);return mI(s.map(e=>{let t=r.get(e.eventId);if(t)return uI(t,e)?fI(t,e):{...e,rawSeq:t.rawSeq};let n={...e,rawSeq:c};return c+=1,n})).sort(pI)}function uI(e,t){return dI(e)&&dI(t)}function dI(e){return e.type===`native.raw`?bI((YF(e.payload.raw)?e.payload.raw:{}).source)===`codex.history.thread_read`:!1}function fI(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function pI(e,t){let n=e.rawSeq-t.rawSeq;if(n!==0)return n;let r=e.ts.localeCompare(t.ts);return r===0?e.eventId.localeCompare(t.eventId):r}function mI(e){let t=Wm(e).filter(e=>!hI(e)),n=new Set;for(let e of t){let t=gI(e);t&&n.add(t)}return n.size===0?t:t.filter(e=>{let t=_I(e);return!t||!n.has(t)})}function hI(e){let t=YF(e.payload.raw)?e.payload.raw:{},n=bI(t.source)??``;if(e.type!==`native.raw`&&(t.historyReplay===!0||n.startsWith(`codex.history.thread_read`)))return!0;if(e.type!==`native.raw`||n!==`codex.app_server`)return!1;let r=YF(t.message)?t.message:{};return bI(r.method)??bI(t.method)?!1:YF((YF(r.result)?r.result:{}).turn)}function gI(e){if(e.type===`item.completed`){let t=YF(e.payload.raw)?e.payload.raw:{},n=YF(t.item)?t.item:{};return vI(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=YF(e.payload.raw)?e.payload.raw:{},n=YF(t.message)?t.message:{},r=YF(n.params)?n.params:{};if((bI(n.method)??bI(t.method))!==`item/completed`)return null;let i=YF(r.item)?r.item:{};return vI(e.sessionId,i)}function _I(e){if(e.type===`item.updated`){let t=YF(e.payload.raw)?e.payload.raw:{},n=YF(t.item)?t.item:{},r=bI(n.original_method)??bI(n.originalMethod)??``,i=YF(n.payload)?n.payload:{};return!(typeof i.delta==`string`||typeof i.output_delta==`string`||typeof i.outputDelta==`string`||typeof n.output_delta==`string`||typeof n.outputDelta==`string`||typeof n.text==`string`)&&!yI(r)?null:vI(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=YF(e.payload.raw)?e.payload.raw:{},n=YF(t.message)?t.message:{},r=YF(n.params)?n.params:{};if(!yI(bI(n.method)??bI(t.method)??``))return null;let i=YF(r.msg)?r.msg:{},a=bI(r.itemId)??bI(r.item_id)??bI(i.itemId)??bI(i.item_id);return a?`${e.sessionId}|${a}`:null}function vI(e,t){let n=bI(t.id)??bI(t.item_id)??bI(t.itemId);return n?`${e}|${n}`:null}function yI(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function bI(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function xI(e){return!e||e.providerMode!==`native`?!1:e.interactionLockReason===`external_turn_running`?!0:e.status!==`running`}const SI=e=>e.filter(e=>!(e.kind===`system`&&e.title===`Turn Usage`)),CI=(e,t)=>e.find(e=>e.itemId===t||e.id===t)??null,wI=e=>e.kind!==`tool_card`&&e.kind!==`file_change_card`&&e.kind!==`terminal_card`||e.status!==void 0||`deferredDetail`in e&&e.deferredDetail!==void 0?null:e.itemId??e.id,TI=e=>{let t=SI(sm(e.sessionId,e.rawEvents,[]));return{timelineItems:Uo({rawEvents:e.rawEvents,messages:t,deferCompletedToolDetails:!1}).timelineItems,lastRawSeq:e.rawEvents[e.rawEvents.length-1]?.rawSeq??null}};async function EI(e){if(e.readableItemDetailLookup)return e.readableItemDetailLookup.getReadableItemDetailResult({projectId:e.projectId,sessionId:e.sessionId,itemId:e.itemId});let t=await e.sessionManager.getProjectSessionRawEvents(e.projectId,e.sessionId,2**53-1),n=CI(TI({sessionId:e.sessionId,rawEvents:t}).timelineItems,e.itemId);return n?{item:n}:null}function DI(e,t){if(e&&e!==t)throw PT()}async function OI(e){let t=kI(e.authService,e.refreshToken);e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:AI(t)},`auth refresh attempt`);try{let t=await e.execute(),n=kI(e.authService,e.refreshToken),r=kI(e.authService,t.refreshToken);return e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshedDeviceId:t.deviceId,previousRefreshToken:AI(n),nextRefreshToken:AI(r)},`auth refresh succeeded`),t}catch(t){let n=kI(e.authService,e.refreshToken);throw e.logger?.warn?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:AI(n),error:jI(t)},`auth refresh failed`),t}}function kI(e,t){return e.inspectRefreshToken?.(t)??{tokenRecordState:`missing`}}function AI(e){return{claimDeviceId:e.claimDeviceId??null,claimExpAt:e.claimExpAt??null,claimIssuedAt:e.claimIssuedAt??null,claimJtiSuffix:MI(e.claimJti),claimType:e.claimType??null,latestActiveTokenCreatedAt:e.latestActiveTokenCreatedAt??null,latestActiveTokenJtiSuffix:MI(e.latestActiveTokenJti),tokenRecordCreatedAt:e.tokenRecordCreatedAt??null,tokenRecordDeviceId:e.tokenRecordDeviceId??null,tokenRecordRevokedAt:e.tokenRecordRevokedAt??null,tokenRecordState:e.tokenRecordState}}function jI(e){return kT(e)?{code:e.code,message:String(e),status:e.status}:e instanceof Error?{message:e.message,name:e.name}:{message:String(e)}}function MI(e){return e?e.slice(-8):null}function NI(e,t,n,r){if(!r)return t;let i={gatewayId:t.gatewayId,deviceId:t.deviceId,mobilePublicKey:r.publicKey,pairingContext:{pairingCode:PI(n),signedAt:new Date().toISOString()}};return{...t,gatewayIdentity:e.identity,pairingConfirmation:hh(e.identity,e.privateKeyPem,i)}}function PI(e){return e.replace(/\s+/gu,``).toUpperCase()}async function FI(e,t){try{let n=np.parse(e);switch(n.method){case`auth.refresh`:{let e=await OI({authService:t.authService,execute:()=>t.authService.refreshAccessToken(n.params.refreshToken),logger:t.logger,refreshToken:n.params.refreshToken,requestedDeviceId:n.params.deviceId??t.relayDeviceId,source:`relay_rpc`});return DI(n.params.deviceId??t.relayDeviceId,e.deviceId),rp.parse({method:n.method,result:e})}case`projects.list`:{let e=await t.sessionManager.listProjects();return rp.parse({method:n.method,result:{projects:e}})}case`codex.accounts.get`:{let e=await t.sessionManager.getCodexAccounts();return rp.parse({method:n.method,result:e})}case`codex.accounts.save`:{let e=await t.sessionManager.saveCurrentCodexAccount();return rp.parse({method:n.method,result:e})}case`codex.accounts.switch`:{let e=await t.sessionManager.switchCodexAccount(n.params.accountId);return rp.parse({method:n.method,result:e})}case`codex.accounts.delete`:{let e=await t.sessionManager.deleteSavedCodexAccount(n.params.accountId);return rp.parse({method:n.method,result:e})}case`gateway.settings.get`:return rp.parse({method:n.method,result:t.gatewaySettings.get()});case`gateway.settings.update`:{let e=await t.gatewaySettings.update(n.params);return rp.parse({method:n.method,result:e})}case`gateway.update.get`:{let e=await t.updateService.getOrCheckInfo(`mobile`);return rp.parse({method:n.method,result:e})}case`gateway.update.check`:{let e=await t.updateService.checkForUpdates(n.params.requestedBy??`mobile`);return rp.parse({method:n.method,result:e})}case`codex.appServer.restart`:{let e=await t.sessionManager.restartCodexAppServer();return rp.parse({method:n.method,result:e})}case`gateway.update.apply`:{let e=await t.updateService.applyUpdate(n.params.requestedBy??`mobile`);return rp.parse({method:n.method,result:e})}case`projects.discovery.get`:{let e=await t.projectDiscoveryService.getProjects();return rp.parse({method:n.method,result:e})}case`projects.discovery.refresh`:{let e=await t.projectDiscoveryService.refreshProjects();return rp.parse({method:n.method,result:e})}case`projects.create`:{let e=await t.sessionManager.createProject({path:n.params.path,title:n.params.title});return rp.parse({method:n.method,result:{project:e}})}case`projects.delete`:if(!await t.sessionManager.deleteProject(n.params.projectId))throw LI(n.method,`NOT_FOUND`,404,`Project not found`);return rp.parse({method:n.method,result:{removed:!0}});case`workspace.directories.list`:{let e=await t.fsService.listDirectoriesUnrestricted(n.params.path,n.params.limit??200);return rp.parse({method:n.method,result:e})}case`workspace.directories.create`:{let e=await t.fsService.createDirectoryUnrestricted(n.params.path,n.params.name,200);return rp.parse({method:n.method,result:e})}case`workspace.entries.list`:{let e=await t.workspaceFileService.listEntries(n.params.locator,n.params.limit??200);return rp.parse({method:n.method,result:e})}case`workspace.files.resolve`:{let e=await t.workspaceFileService.resolveFile(n.params.locator);return rp.parse({method:n.method,result:e})}case`workspace.files.readText`:{let e=await t.workspaceFileService.readTextFile(n.params.locator,{startLine:n.params.startLine,maxLines:n.params.maxLines,maxBytes:n.params.maxBytes});return rp.parse({method:n.method,result:e})}case`workspace.files.preparePreview`:{let e=t.relayPreviewBaseUrl?.trim(),r=t.gatewayId?.trim();if(!e||!r)throw LI(n.method,`BAD_REQUEST`,400,`Relay preview base url is not configured`);let i=await t.workspaceFileService.preparePreview(n.params.locator,{deviceId:t.relayDeviceId,disposition:n.params.disposition,buildPreviewUrl:t=>`${e.replace(/\/+$/,``)}/api/gateways/${encodeURIComponent(r)}/workspace/files/content/${encodeURIComponent(t)}`});return rp.parse({method:n.method,result:i})}case`sessions.list`:{let e=await t.sessionManager.listProjectSessions(n.params.projectId,n.params.status??`all`,{syncExternal:n.params.syncExternal});return rp.parse({method:n.method,result:{sessions:e}})}case`sessions.discovery.list`:{let e=await t.projectDiscoveryService.listProjectSessions(n.params.projectPath);return rp.parse({method:n.method,result:e})}case`sessions.get`:{let e=await t.sessionManager.getProjectSessionSummary(n.params.projectId,n.params.sessionId);if(!e)throw LI(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return rp.parse({method:n.method,result:{session:e}})}case`sessions.config.get`:{let e=await t.sessionManager.getProjectSessionConfig(n.params.projectId,n.params.sessionId);if(!e)throw LI(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return rp.parse({method:n.method,result:{session:e}})}case`sessions.history.sync`:{let e=await t.sessionManager.syncProjectSessionHistory(n.params.projectId,n.params.sessionId);return e.historyUpdated&&await t.refreshDetailSessionSnapshots?.({projectId:n.params.projectId,sessionId:n.params.sessionId,reason:`explicit_history_sync`,refreshMode:e.refreshMode,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}),rp.parse({method:n.method,result:{session:e.session,rawEventCount:e.rawEvents.length,historyUpdated:e.historyUpdated,statusChanged:e.statusChanged,refreshMode:e.refreshMode,...e.fromRawSeq===void 0?{}:{fromRawSeq:e.fromRawSeq},...e.toRawSeq===void 0?{}:{toRawSeq:e.toRawSeq}}})}case`sessions.rawEvents.list`:{let e=n.params.limit===`all`?2**53-1:n.params.limit,r=await t.buildRawEventsListResult({sessionManager:t.sessionManager,projectId:n.params.projectId,sessionId:n.params.sessionId,limit:e,fromRawSeqExclusive:n.params.fromRawSeqExclusive,detailLevel:n.params.detailLevel,requestSource:`rpc`});return rp.parse({method:n.method,result:r})}case`sessions.readableItem.get`:{let e=await EI({sessionManager:t.sessionManager,readableItemDetailLookup:t.readableItemDetailLookup,projectId:n.params.projectId,sessionId:n.params.sessionId,itemId:n.params.itemId});if(!e)throw LI(n.method,`NOT_FOUND`,404,`Readable item ${n.params.itemId} not found`);return rp.parse({method:n.method,result:e})}case`providers.capabilities.get`:{let e=Date.now();t.logger?.info?.({relayDeviceId:t.relayDeviceId??null,rpcMethod:n.method,provider:n.params.provider,projectId:n.params.projectId??null,agentVersion:n.params.agentVersion??null},`relay rpc provider capabilities request started`);try{let r=await t.sessionManager.getProviderCapabilities(n.params.provider,n.params.projectId??void 0,n.params.agentVersion??void 0),i=r&&typeof r==`object`&&!Array.isArray(r)?r:null;return t.logger?.info?.({relayDeviceId:t.relayDeviceId??null,rpcMethod:n.method,provider:n.params.provider,projectId:n.params.projectId??null,agentVersion:n.params.agentVersion??null,durationMs:Date.now()-e,source:typeof i?.source==`string`?i.source:void 0,modelCount:Array.isArray(i?.models)?i.models.length:void 0},`relay rpc provider capabilities request completed`),rp.parse({method:n.method,result:{capabilities:r}})}catch(r){throw t.logger?.warn?.({relayDeviceId:t.relayDeviceId??null,rpcMethod:n.method,provider:n.params.provider,projectId:n.params.projectId??null,agentVersion:n.params.agentVersion??null,durationMs:Date.now()-e,err:r},`relay rpc provider capabilities request failed`),r}}case`providers.execution.update`:{let e=await t.sessionManager.updateProviderExecutionDefaults(n.params);return rp.parse({method:n.method,result:{defaults:e}})}case`agents.config.get`:{let e=await t.sessionManager.getAgentConfig(n.params.provider,{projectId:n.params.projectId??void 0,agentVersion:n.params.agentVersion??void 0});return rp.parse({method:n.method,result:e})}case`devices.list`:return rp.parse({method:n.method,result:{devices:t.authService.listDevices()}});case`devices.revoke`:if(!await t.authService.revokeDevice(n.params.deviceId))throw LI(n.method,`NOT_FOUND`,404,`Device ${n.params.deviceId} not found`);return rp.parse({method:n.method,result:{revoked:!0}});default:{let e=n;throw LI(void 0,`INTERNAL`,500,`Unhandled relay RPC method: ${JSON.stringify(e)}`)}}}catch(e){throw II(e)}}function II(e){if(kT(e))switch(e.code){case`REFRESH_TOKEN_REVOKED`:case`DEVICE_REVOKED`:case`REFRESH_TOKEN_DEVICE_MISMATCH`:return LI(`UNAUTHORIZED`,e.status,String(e),e.details);case`PROJECT_NOT_FOUND`:case`DISCOVERED_PROJECT_NOT_FOUND`:case`PROJECT_SESSION_NOT_FOUND`:case`SESSION_NOT_FOUND`:case`CODEX_ACCOUNT_NOT_FOUND`:return LI(`NOT_FOUND`,e.status,String(e),e.details);case`SESSION_TURN_CONFLICT`:case`PROJECT_DELETE_CONFLICT`:case`CODEX_APP_SERVER_RESTART_CONFLICT`:return LI(`BAD_REQUEST`,e.status,String(e),e.details);default:return LI(e.status>=500?`INTERNAL`:`BAD_REQUEST`,e.status,String(e),e.details)}let t=ap.safeParse(e);if(t.success)return t.data;let n=ip.safeParse(e);if(n.success)return LI(void 0,n.data.code,n.data.status,n.data.message,n.data.details);if(e&&typeof e==`object`&&`code`in e&&`status`in e&&`message`in e&&typeof e.code==`string`&&typeof e.status==`number`&&typeof e.message==`string`){let t=e;return LI(t.code,t.status,t.message,t.details)}let r=String(e);return e instanceof Error&&e.name===`ZodError`?LI(`BAD_REQUEST`,400,r):RI(e)?LI(`UNAUTHORIZED`,401,r):zI(r)?LI(`BAD_REQUEST`,400,r):LI(`INTERNAL`,500,r)}function LI(e,t,n,r,i){let a=typeof t==`string`,o=a?e:void 0,s=a?t:e,c=a?n:t,l=a?r:n,u=a?i:r;return ap.parse({...o?{method:o}:{},code:s,status:c,message:l,...u===void 0?{}:{details:u}})}function RI(e){return kT(e)&&(e.code===`REFRESH_TOKEN_REVOKED`||e.code===`DEVICE_REVOKED`||e.code===`REFRESH_TOKEN_DEVICE_MISMATCH`)||YT(e)}function zI(e){let t=e.trim();return t===`Invalid provider`||t.startsWith(`Invalid provider:`)||t.startsWith(`Project path must be absolute:`)||t.startsWith(`Project path does not exist:`)||t.startsWith(`Project path is not a directory:`)||t.startsWith(`ZodError:`)}function BI(e,t){return e.length===0?[]:t===void 0?[...e]:e.filter(e=>e.rawSeq>t)}function VI(e){let t=e.coveredToRawSeq??void 0;for(let n of e.rawEvents)(t===void 0||n.rawSeq>t)&&(t=n.rawSeq);return t}function HI(e){return{baseRawEvents:Hm(e.rawEvents.filter(t=>t.rawSeq<=e.cursorRawSeq)),nextRawEvents:Hm(e.rawEvents)}}function UI(e,t){return t&&`kind`in t&&t.kind===`bootstrapping`?t:{kind:`bootstrapping`,sessionId:e,previousReadyState:t??null,queuedEnvelopes:[]}}function WI(e,t){let n=e.previousReadyState;if(!n)return{previousReadyState:null,nextReadyState:null,replayedEnvelopes:[]};let r=BI(e.queuedEnvelopes,VI(n)),i=n;for(let e of r)i=t(i,e);return{previousReadyState:n,nextReadyState:i,replayedEnvelopes:r}}function GI(e){return{v:`1.0`,kind:`session.stream.sync`,type:`session.stream.sync`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`stream_sync_${DT(12)}`,ts:new Date().toISOString(),payload:{raw:{decision:e.decision,reason:e.reason,snapshotId:e.snapshotId,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}}}}function KI(e){return{v:`1.0`,kind:`session.stream.snapshot.chunk`,type:`session.stream.snapshot.chunk`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`stream_snapshot_${e.snapshotId}_${e.chunkIndex}`,ts:new Date().toISOString(),payload:{raw:{snapshotId:e.snapshotId,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,events:e.events,...e.sessionSummary?{sessionSummary:e.sessionSummary}:{}},...e.timelineItems?{readable:{snapshotId:e.snapshotId,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,...e.timelineItems?{timelineItems:e.timelineItems}:{}}}:{}}}}function qI(e){return{v:`1.0`,kind:`session.readable.snapshot.chunk`,type:`session.readable.snapshot.chunk`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`readable_snapshot_${e.snapshotId}_${e.chunkIndex}`,ts:new Date().toISOString(),payload:{readable:{snapshotId:e.snapshotId,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,timelineItems:e.timelineItems,...e.pendingApprovals?{pendingApprovals:e.pendingApprovals}:{},...e.pendingUserInputs?{pendingUserInputs:e.pendingUserInputs}:{},...e.contextUsage===void 0?{}:{contextUsage:e.contextUsage},...e.sessionSummary?{sessionSummary:e.sessionSummary}:{}}}}}function JI(e){return{v:`1.0`,kind:`session.readable.delta`,type:`session.readable.delta`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`readable_delta_${e.sessionId}_${e.toRawSeq}`,ts:new Date().toISOString(),payload:{readable:{...e.fromRawSeq===void 0?{}:{fromRawSeq:e.fromRawSeq},toRawSeq:e.toRawSeq,timelineUpserts:e.timelineUpserts,timelineRemovals:e.timelineRemovals,...e.timelineTextDeltaPatches&&e.timelineTextDeltaPatches.length>0?{timelineTextDeltaPatches:e.timelineTextDeltaPatches}:{},...e.pendingApprovalUpserts&&e.pendingApprovalUpserts.length>0?{pendingApprovalUpserts:e.pendingApprovalUpserts}:{},...e.pendingApprovalRemovals&&e.pendingApprovalRemovals.length>0?{pendingApprovalRemovals:e.pendingApprovalRemovals}:{},...e.pendingUserInputUpserts&&e.pendingUserInputUpserts.length>0?{pendingUserInputUpserts:e.pendingUserInputUpserts}:{},...e.pendingUserInputRemovals&&e.pendingUserInputRemovals.length>0?{pendingUserInputRemovals:e.pendingUserInputRemovals}:{},...e.sessionSummary?{sessionSummary:e.sessionSummary}:{},...e.contextUsage===void 0?{}:{contextUsage:e.contextUsage}}}}}function YI(e){return{v:`1.0`,kind:`session.external.update`,type:`session.external.update`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`session_external_update_${DT(12)}`,ts:new Date().toISOString(),payload:{raw:{updatedAt:e.updatedAt,status:e.status,interactionLockReason:e.interactionLockReason,refreshMode:e.refreshMode,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq,historyUpdated:e.historyUpdated,statusChanged:e.statusChanged,...e.sessionSummary?{sessionSummary:e.sessionSummary}:{}}}}}function XI(e,t){if(e.length===0)return[[]];let n=Math.max(1,Math.floor(t)),r=[];for(let t=0;t<e.length;t+=n)r.push(e.slice(t,t+n));return r}const ZI=1e3,QI=(e,t)=>`${e}::${t}`,$I=e=>e.purpose===`detail_view`&&e.bootstrapMode===`readable`,eL=e=>{let t=new Map;for(let n of e)t.set(n.sessionId,n);return[...t.values()]},tL=e=>{let t;for(let n of e)(t===void 0||n.rawSeq>t)&&(t=n.rawSeq);return t},nL=e=>e[e.length-1]?.rawSeq,rL=(e,t)=>{let n=tL(e);return t==null?n??null:n===void 0?t:Math.max(t,n)},iL=e=>rL(e.rawEvents,e.coveredToRawSeq)??void 0,aL=e=>{let t=rL(e.rawEvents,e.coveredToRawSeq);return{kind:`ready`,sessionId:e.target.sessionId,projectId:e.target.projectId,provider:e.target.provider,detailLevel:e.target.detailLevel,rawEvents:[...e.rawEvents],coveredToRawSeq:t,detailTransportRawEvents:[...e.detailTransportRawEvents??e.rawEvents],contextUsage:e.contextUsage??null,timelineItems:[...e.timelineItems],pendingApprovals:[...e.pendingApprovals],pendingUserInputs:[...e.pendingUserInputs]}},oL=e=>typeof e==`object`&&e?e:{},sL=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}},cL=e=>{if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=oL(n),r=sL(e,`id`),i=sL(e,`header`),a=sL(e,`question`);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=oL(e),n=sL(t,`label`);if(!n)return null;let r=sL(t,`description`)??n,i=sL(t,`markdown`);return{label:n,description:r,...i?{markdown:i}:{}}}).filter(e=>e!==null):null;t.push({id:r,header:i,question:a,multiSelect:e.multiSelect===!0,isOther:e.isOther===!0,isSecret:e.isSecret===!0,options:o})}return t},lL=(e,t)=>{let n=om(e,t),r=new Map,i=new Map;for(let e of n){if(e.type===`tool.permission.requested`){let t=oL(e.payload.raw),n=sL(t,`requestId`,`request_id`);if(!n)continue;let i=oL(t.rawParams??t.raw_params),a=oL(i.networkApprovalContext??i.network_approval_context);r.set(n,{requestId:n,sessionId:e.sessionId,...sL(t,`toolName`,`tool_name`)?{toolName:sL(t,`toolName`,`tool_name`)}:{},...sL(t,`reason`)?{reason:sL(t,`reason`)}:{},...sL(i,`command`)?{command:sL(i,`command`)}:{},...sL(i,`cwd`)?{cwd:sL(i,`cwd`)}:{},...sL(i,`grantRoot`,`grant_root`)?{grantRoot:sL(i,`grantRoot`,`grant_root`)}:{},...sL(a,`host`)?{networkHost:sL(a,`host`)}:{},...sL(a,`protocol`)?{networkProtocol:sL(a,`protocol`)}:{},...sL(t,`itemId`,`item_id`)?{itemId:sL(t,`itemId`,`item_id`)}:{},...sL(t,`turnId`,`turn_id`)?{turnId:sL(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`tool.permission.resolved`){let t=sL(oL(e.payload.raw),`requestId`,`request_id`);t&&r.delete(t);continue}if(e.type===`user.input.requested`){let t=oL(e.payload.raw),n=sL(t,`requestId`,`request_id`);if(!n)continue;i.set(n,{requestId:n,sessionId:e.sessionId,questions:cL(t.questions),...sL(t,`itemId`,`item_id`)?{itemId:sL(t,`itemId`,`item_id`)}:{},...sL(t,`turnId`,`turn_id`)?{turnId:sL(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`user.input.resolved`){let t=sL(oL(e.payload.raw),`requestId`,`request_id`);t&&i.delete(t)}}return{pendingApprovals:[...r.values()],pendingUserInputs:[...i.values()]}},uL=e=>{let t=e.rawEventsAlreadyMatchDetailTransport===!0?e.rawEvents:pL({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=e.target.purpose===`detail_view`?Cl({provider:e.target.provider,rawEvents:t}):null,r=e.target.purpose===`detail_view`?SI(sm(e.target.sessionId,t,[])):[],i=e.target.purpose===`detail_view`?Uo({rawEvents:t,messages:r,deferCompletedToolDetails:!0}):{timelineItems:[],consumedMessageIds:[]},a=e.target.purpose===`detail_view`?lL(e.target.sessionId,t):{pendingApprovals:[],pendingUserInputs:[]};return{detailTransportRawEvents:t,contextUsage:n,timelineItems:i.timelineItems,pendingApprovals:a.pendingApprovals,pendingUserInputs:a.pendingUserInputs}},dL=e=>{let t=pL({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=uL({target:e.target,rawEvents:t,rawEventsAlreadyMatchDetailTransport:!0});return aL({target:e.target,rawEvents:e.rawEvents,coveredToRawSeq:e.coveredToRawSeq,detailTransportRawEvents:t,contextUsage:n.contextUsage,timelineItems:n.timelineItems,pendingApprovals:n.pendingApprovals,pendingUserInputs:n.pendingUserInputs})},fL=(e,t)=>{let n=xL(e.rawEvents,t),r=rL(n,iL(e)),i=pL({rawEvents:xL(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),a=uL({target:{sessionId:e.sessionId,provider:e.provider,detailLevel:e.detailLevel,purpose:`detail_view`},rawEvents:i,rawEventsAlreadyMatchDetailTransport:!0});return{...e,rawEvents:n,coveredToRawSeq:r,detailTransportRawEvents:i,contextUsage:a.contextUsage,timelineItems:a.timelineItems,pendingApprovals:a.pendingApprovals,pendingUserInputs:a.pendingUserInputs}},pL=e=>{if(e.detailLevel!==`compact`||e.rawEvents.length===0)return e.rawEvents;let t=mL(e.rawEvents[0]?.sessionId??``,e.rawEvents);return xD(e.rawEvents,e.detailLevel,{preserveIncompleteCommandOutput:!0,additionalCompletedCommandItemKeys:t})},mL=(e,t)=>{if(!e||t.length===0)return new Set;let n=new Set,r=sm(e,t,[]);for(let t of r){if(t.itemType!==`command_execution`||!t.itemId||t.status!==`completed`&&t.status!==`failed`)continue;let r=vL(e,t.itemId);r&&n.add(r)}return n},hL=e=>sL(e,`id`,`itemId`,`item_id`)??null,gL=e=>{if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`)return hL(oL(oL(e.payload.raw).item));if(e.type!==`native.raw`)return null;let t=oL(oL(e.payload.raw).message),n=oL(t.params),r=oL(n.item),i=oL(n.msg);return hL(r)??hL(oL(t.item))??sL(n,`itemId`,`item_id`)??sL(i,`itemId`,`item_id`)??null},_L=e=>{if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=oL(e.payload.raw);return(sL(oL(t.message),`method`)??sL(t,`method`))===`item/completed`},vL=(e,t)=>t?`${e}|${t}`:null,yL=e=>vL(e.sessionId,gL(e)),bL=e=>{let t=yL(e);if(t)return`item:${t}`;let n=Gm(e);return n?`delta:${n.key}`:null},xL=(e,t)=>{let n=[...e],r=yL(t),i=bL(t),a=Gm(t),o=t;if(i&&a)for(let e=n.length-1;e>=0;--e){let r=n[e];if(!r||bL(r)!==i||!Gm(r))continue;let a=Km(r,t);if(a){n[e]=null,o=a;break}}return n.push(o),!r||!_L(t)?n.filter(e=>e!==null):n.filter(e=>e!==null&&(e.eventId===o.eventId||yL(e)!==r||!Gm(e)))},SL=e=>{let t=CL(e);if(!t)return null;let n=hL(t),r=oL(t.payload),i=sL(t,`output_delta`,`outputDelta`)??sL(r,`output_delta`,`outputDelta`);return!n||!i?null:{itemId:n,delta:i}},CL=e=>{if(e.type===`item.updated`){let t=oL(oL(e.payload.raw).item);return wL(t)?t:null}if(e.type!==`native.raw`)return null;let t=oL(e.payload.raw),n=oL(t.message);if((sL(n,`method`)??sL(t,`method`))!==`item/updated`)return null;let r=oL(oL(n.params).item);return wL(r)?r:null},wL=e=>{let t=sL(e,`type`);return t===`commandExecution`||t===`command_execution`},TL=e=>e.includes(`[compact history preview:`),EL=(e,t)=>{let n=SL(t);if(!n)return null;let r=e.timelineItems.findIndex(e=>e.kind===`terminal_card`&&e.itemId===n.itemId&&typeof e.output==`string`);if(r<0)return null;let i=e.timelineItems[r];if(!i||i.kind!==`terminal_card`||TL(i.output))return null;let a=xL(e.rawEvents,t),o=pL({rawEvents:xL(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),s={...i,output:`${i.output}${n.delta}`},c=[...e.timelineItems];c[r]=s;let l=iL(e),u=rL(a,l)??t.rawSeq;return{nextState:{...e,rawEvents:a,coveredToRawSeq:u,detailTransportRawEvents:o,timelineItems:c},messageInput:{provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,fromRawSeq:l,toRawSeq:u,timelineUpserts:[],timelineRemovals:[],timelineTextDeltaPatches:[{id:i.id,field:`output`,delta:n.delta}]}}},DL=e=>Buffer.byteLength(JSON.stringify(qI(e)),`utf8`),OL=e=>{let t=Math.max(1,Math.floor(e.maxChunkBytes??524288)),n=[],r=(t,n)=>DL({provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,snapshotId:e.snapshotId,chunkIndex:t,totalChunks:1,timelineItems:n,pendingApprovals:t===0?e.pendingApprovals:void 0,pendingUserInputs:t===0?e.pendingUserInputs:void 0,contextUsage:t===0?e.contextUsage:void 0,sessionSummary:t===0?e.sessionSummary:void 0});if(e.timelineItems.length===0)return[{timelineItems:[],estimatedByteLength:r(0,[])}];let i=[];for(let a of e.timelineItems){let e=n.length,o=[...i,a],s=r(e,o);if(i.length>0&&s>t){n.push({timelineItems:i,estimatedByteLength:r(e,i)}),i=[a];continue}i=o}return n.push({timelineItems:i,estimatedByteLength:r(n.length,i)}),n},kL=(e,t)=>{let n=new Map(e.map(e=>[e.requestId,JSON.stringify(e)])),r=new Map(t.map(e=>[e.requestId,JSON.stringify(e)]));return{upserts:t.filter(e=>n.get(e.requestId)!==r.get(e.requestId)),removals:e.filter(e=>!r.has(e.requestId)).map(e=>e.requestId)}},AL=(e,t)=>{let n=new Map(e.map(e=>[e.requestId,JSON.stringify(e)])),r=new Map(t.map(e=>[e.requestId,JSON.stringify(e)]));return{upserts:t.filter(e=>n.get(e.requestId)!==r.get(e.requestId)),removals:e.filter(e=>!r.has(e.requestId)).map(e=>e.requestId)}},jL=(e,t,n,r)=>{let i={},a=om(e,[t]),o=a.find(e=>e.type===`thread.title.updated`),s=a.find(e=>e.type===`turn.started`||e.type===`turn.completed`||e.type===`turn.failed`);if(o){let e=sL(oL(o.payload.raw),`title`);e&&(i.title=e)}return s&&(i.updatedAt=s.ts,i.status=s.type===`turn.started`?`running`:`idle`,i.interactionLockReason=void 0,s.type===`turn.started`&&(i.activeStartedAt=s.ts)),n.pendingApprovals.length!==r.pendingApprovals.length&&(i.pendingApprovals=r.pendingApprovals.length),n.pendingUserInputs.length!==r.pendingUserInputs.length&&(i.pendingUserInputs=r.pendingUserInputs.length),n.pendingApprovals.length+n.pendingUserInputs.length!==r.pendingApprovals.length+r.pendingUserInputs.length&&(i.pendingActions=r.pendingApprovals.length+r.pendingUserInputs.length),Object.keys(i).length>0?i:void 0};function ML(e){let t,n=e.previousState;for(let r of e.envelopes){let i=fL(n,r),a=jL(e.sessionId,r,n,i);a&&(t={...t??{},...a}),n=i}return t}const NL=e=>{if(!e)return{stateFound:!1};let t=tL(e.rawEvents),n=nL(e.rawEvents),r=iL(e);return{stateFound:!0,kind:e.kind,sessionId:e.sessionId,projectId:e.projectId,provider:e.provider,detailLevel:e.detailLevel,rawEventCount:e.rawEvents.length,detailTransportRawEventCount:e.detailTransportRawEvents.length,firstRawSeq:e.rawEvents[0]?.rawSeq??null,lastRawSeq:r??null,rawEventMaxRawSeq:t??null,orderedLastRawSeq:n??null,rawSeqOrderMismatch:t!==n,rawSeqCoverageMismatch:r!==t,timelineItemCount:e.timelineItems.length,pendingApprovalCount:e.pendingApprovals.length,pendingUserInputCount:e.pendingUserInputs.length,hasContextUsage:!!e.contextUsage}},PL=e=>e?e.kind===`ready`?NL(e):{stateFound:!0,kind:e.kind,sessionId:e.sessionId,queuedEnvelopeCount:e.queuedEnvelopes.length,previousReadyState:NL(e.previousReadyState)}:{stateFound:!1},FL=(e,t)=>{let n,r,i;try{n=Rc(e.previousState.timelineItems,e.nextState.timelineItems),r=kL(e.previousState.pendingApprovals,e.nextState.pendingApprovals),i=AL(e.previousState.pendingUserInputs,e.nextState.pendingUserInputs)}catch(n){throw t?.(`stream.readable.delta.build.error`,{sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,previousState:NL(e.previousState),nextState:NL(e.nextState),sessionSummaryKeys:e.sessionSummary?Object.keys(e.sessionSummary):[],errorMessage:n instanceof Error?n.message:String(n)}),n}let a=JSON.stringify(e.previousState.contextUsage??null)!==JSON.stringify(e.nextState.contextUsage??null);if(n.upserts.length===0&&n.removals.length===0&&n.textDeltaPatches.length===0&&r.upserts.length===0&&r.removals.length===0&&i.upserts.length===0&&i.removals.length===0&&!a&&!e.sessionSummary)return null;let o=iL(e.nextState);return o===void 0?null:{provider:e.previousState.provider,sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,fromRawSeq:iL(e.previousState),toRawSeq:o,timelineUpserts:n.upserts,timelineRemovals:n.removals,timelineTextDeltaPatches:n.textDeltaPatches,pendingApprovalUpserts:r.upserts,pendingApprovalRemovals:r.removals,pendingUserInputUpserts:i.upserts,pendingUserInputRemovals:i.removals,sessionSummary:e.sessionSummary,contextUsage:a?e.nextState.contextUsage:void 0}};function IL(e){return e?{sessionFound:!0,sessionId:e.id,projectId:e.projectId,nativeSessionId:e.nativeSessionId??null,provider:e.provider,providerMode:e.providerMode,source:e.source??null,status:e.status,interactionLockReason:e.interactionLockReason??null,updatedAt:e.updatedAt,activeStartedAt:e.activeStartedAt??null,lastHydratedExternalUpdatedAt:e.lastHydratedExternalUpdatedAt??null}:{sessionFound:!1}}function LL(e){return e===`external_turn_running`?e:void 0}function RL(e){return{status:e.status,...e.updatedAt?{updatedAt:e.updatedAt}:{},...e.activeStartedAt?{activeStartedAt:e.activeStartedAt}:{},...e.interactionLockReason?{interactionLockReason:e.interactionLockReason}:{}}}var zL=class{stateByClientSession=new Map;pendingDeltaByClientSession=new Map;itemDetailCache=new Map;constructor(e,t,n,r,i=512){this.sessionHub=e,this.sessionManager=t,this.readableLiveDeltaCoalesceMs=n,this.log=r,this.itemDetailCacheMaxEntries=i}shutdown(){for(let e of this.pendingDeltaByClientSession.values())clearTimeout(e.timer);this.pendingDeltaByClientSession.clear(),this.stateByClientSession.clear(),this.itemDetailCache.clear()}handleSessionStreamSubscribeCommand=async(e,t,n)=>{let r=Date.now(),i=eL(t),a=new Set(i.map(e=>e.sessionId)),o=this.sessionHub.getSubscriptions(e);this.log(`stream.subscribe.received`,{clientId:e,replace:n,incomingSubscriptionCount:t.length,dedupedSubscriptionCount:i.length,subscriptions:i.map(e=>({sessionId:e.sessionId,projectId:e.projectId??null,purpose:e.purpose??null,detailLevel:e.detailLevel??null,bootstrapMode:e.bootstrapMode??null,cursorKind:e.cursor.kind,rawSeq:e.cursor.kind===`raw_seq`?e.cursor.rawSeq:null}))}),this.primeReadableBootstrapForSubscriptions(e,i);for(let t of a)this.sessionHub.pauseSession(e,t);this.sessionHub.replaceSubscriptions(e,i,n),this.syncReadableLiveProjectionSubscriptions(e,o,i,n);try{for(let t of i){let n=Date.now();try{await this.syncSessionStreamSubscription(e,t),this.log(`stream.subscribe.subscription_synced`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId??null,purpose:t.purpose??null,detailLevel:t.detailLevel??null,bootstrapMode:t.bootstrapMode??null,cursorKind:t.cursor.kind,rawSeq:t.cursor.kind===`raw_seq`?t.cursor.rawSeq:null,durationMs:Date.now()-n})}catch(n){throw $I(t)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}}}finally{for(let t of a)this.sessionHub.resumeSession(e,t);this.log(`stream.subscribe.completed`,{clientId:e,replace:n,dedupedSubscriptionCount:i.length,totalDurationMs:Date.now()-r})}};clearState=(e,t)=>{let n=QI(e,t),r=this.stateByClientSession.get(n);this.stateByClientSession.delete(n);let i=this.pendingDeltaByClientSession.get(n);i&&(clearTimeout(i.timer),this.pendingDeltaByClientSession.delete(n)),(r||i)&&this.log(`readable.state.cleared`,{clientId:e,sessionId:t,hadState:!!r,previousState:PL(r),hadPendingDelta:!!i,pendingDeltaFromRawSeq:i?iL(i.previousState)??null:null,pendingDeltaToRawSeq:i?iL(i.nextState)??null:null})};clearStatesForClient=e=>{let t=`${e}::`;for(let e of this.stateByClientSession.keys())e.startsWith(t)&&this.stateByClientSession.delete(e);for(let[e,n]of this.pendingDeltaByClientSession)e.startsWith(t)&&(clearTimeout(n.timer),this.pendingDeltaByClientSession.delete(e))};getReadableItemDetailResult=async e=>{let t=this.getLatestReadableReadyStateForSession(e.projectId,e.sessionId),n=t?CI(t.timelineItems,e.itemId):null,r=n&&`deferredDetail`in n&&n.deferredDetail!==void 0;if(n&&!r){let r=wI(n);return r&&this.setReadableItemDetailCacheEntry({projectId:e.projectId,sessionId:e.sessionId,itemId:r,item:n}),this.log(`readable.item_detail.cache_hit`,{projectId:e.projectId,sessionId:e.sessionId,itemId:e.itemId,source:`live_state`,lastRawSeq:t?iL(t)??null:null}),{item:n}}let i=this.getReadableItemDetailCacheEntry(e.projectId,e.sessionId,e.itemId);if(i)return this.log(`readable.item_detail.cache_hit`,{projectId:e.projectId,sessionId:e.sessionId,itemId:e.itemId,source:`item_cache`}),{item:i.item};let a=await this.sessionManager.getProjectSessionRawEvents(e.projectId,e.sessionId,2**53-1),o=TI({sessionId:e.sessionId,rawEvents:a}),s=this.seedReadableItemDetailCache({projectId:e.projectId,sessionId:e.sessionId,timelineItems:o.timelineItems}),c=CI(o.timelineItems,e.itemId);return this.log(`readable.item_detail.projection_rebuilt`,{projectId:e.projectId,sessionId:e.sessionId,itemId:e.itemId,source:t?`session_history_after_live_state`:`session_history`,lastRawSeq:o.lastRawSeq,timelineItemCount:o.timelineItems.length,cachedItemCount:s,found:!!c}),c?{item:c}:null};routeReadableLiveDelta=e=>{let t=this.sessionHub.getClientSubscriptionsForSession(e.sessionId,`detail_view`);if(t.length!==0)for(let{clientId:n,subscription:r}of t){if(!$I(r))continue;let t=QI(n,e.sessionId),i=this.stateByClientSession.get(t);if(!i)continue;if(i.kind===`bootstrapping`){i.queuedEnvelopes.push(e);continue}let a=EL(i,e);if(a){this.flushPendingReadableLiveDelta(n,e.sessionId),this.stateByClientSession.set(t,a.nextState),this.sessionHub.sendSessionMessageToClient(n,e.sessionId,JI(a.messageInput)),this.log(`stream.readable.live_patch.sent`,{clientId:n,sessionId:e.sessionId,projectId:i.projectId,provider:i.provider,fromRawSeq:a.messageInput.fromRawSeq??null,toRawSeq:a.messageInput.toRawSeq,timelineTextDeltaPatchCount:a.messageInput.timelineTextDeltaPatches?.length??0});continue}let o=fL(i,e);this.stateByClientSession.set(t,o);let s=jL(e.sessionId,e,i,o);this.enqueueReadableLiveDelta({clientId:n,previousState:i,nextState:o,sessionSummary:s})}};refreshDetailSessionSnapshots=async e=>{let t=this.sessionHub.getClientSubscriptionsForSession(e.sessionId,`detail_view`);for(let{clientId:n,subscription:r}of t){let t=r.projectId?.trim()??``;if(!(t&&t!==e.projectId)){this.sessionHub.pauseSession(n,e.sessionId);try{let t=await this.resolveSessionStreamTarget(r);if(t.bootstrapMode===`readable`){let r=this.getReadableRefreshDeltaBase({clientId:n,sessionId:e.sessionId,projectId:e.projectId,detailLevel:t.detailLevel,refreshMode:e.refreshMode,reason:e.reason});if(r){this.startReadableLiveProjectionBootstrap({clientId:n,sessionId:e.sessionId,previousReadyState:r.previousReadyState}),await this.sendSessionReadableResumeDelta(n,t,r.cursor,r.reason);continue}this.startReadableLiveProjectionBootstrap({clientId:n,sessionId:e.sessionId}),await this.sendSessionReadableSnapshot(n,t,e.reason)}else await this.sendSessionSnapshot(n,t,e.reason)}catch(t){throw $I(r)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:n,sessionId:e.sessionId}),t}finally{this.sessionHub.resumeSession(n,e.sessionId)}}}};sendSessionSnapshot=async(e,t,n)=>{let r=`snap_${DT(12)}`,{compactedRawEvents:i,detailTransportRawEvents:a,lastRawSeq:o,slimReadableProjection:s,pendingApprovals:c,pendingUserInputs:l}=await this.buildReadableSnapshotProjection(t),u=RL(t);this.sessionHub.sendStreamMessage(e,GI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,...o===void 0?{}:{toRawSeq:o}}));let d=XI(a,ZI),f=t.purpose===`detail_view`?XI(s.timelineItems,ZI):[],p=t.purpose===`detail_view`?`raw+readable`:`raw`,m=Math.max(d.length,f.length,1);this.log(`stream.snapshot.prepared`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,provider:t.provider,detailLevel:t.detailLevel,reason:n,snapshotId:r,snapshotFormat:p,compactedEventCount:i.length,detailTransportEventCount:a.length,readableTimelineItemCount:s.timelineItems.length,totalChunks:m,firstRawSeq:a[0]?.rawSeq??null,lastRawSeq:o??null,orderedLastRawSeq:nL(i)??null,rawSeqOrderMismatch:o!==nL(i)});for(let n=0;n<m;n+=1){let i=d[n]??[],a=f[n]??[];this.sessionHub.sendStreamMessage(e,KI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,chunkIndex:n,totalChunks:m,events:i,timelineItems:t.purpose===`detail_view`?a:void 0,sessionSummary:n===0?u:void 0}))}};sendSessionReadableSnapshot=async(e,t,n)=>{let r=Date.now(),i=`snap_${DT(12)}`,a=this.startReadableLiveProjectionBootstrap({clientId:e,sessionId:t.sessionId});try{let{compactedRawEvents:o,detailTransportRawEvents:s,contextUsage:c,lastRawSeq:l,slimReadableProjection:u,pendingApprovals:d,pendingUserInputs:f}=await this.buildReadableSnapshotProjection(t),p=Date.now()-r,m=this.sessionHub.getSubscriptions(e).find(e=>e.sessionId===t.sessionId),h=m?.projectId?.trim()??``;if(!m||!$I(m)||h&&h!==t.projectId||(m.detailLevel??`full`)!==t.detailLevel){this.clearState(e,t.sessionId);return}let g=RL(t),_=aL({target:t,rawEvents:o,coveredToRawSeq:l,detailTransportRawEvents:s,contextUsage:c,timelineItems:u.timelineItems,pendingApprovals:d,pendingUserInputs:f}),v=this.stateByClientSession.get(a),y=BI(v?.kind===`bootstrapping`?v.queuedEnvelopes:[],l),b=ML({sessionId:t.sessionId,previousState:_,envelopes:y});for(let e of y)_=fL(_,e);let x={...g,...b??{}};this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:_.rawEvents,coveredToRawSeq:iL(_),detailTransportRawEvents:_.detailTransportRawEvents,contextUsage:_.contextUsage,timelineItems:_.timelineItems,pendingApprovals:_.pendingApprovals,pendingUserInputs:_.pendingUserInputs});let S=iL(_),C=nL(_.rawEvents);this.sessionHub.sendStreamMessage(e,GI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:i,...S===void 0?{}:{toRawSeq:S}}));let w=Date.now(),T=OL({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:i,timelineItems:_.timelineItems,pendingApprovals:_.pendingApprovals,pendingUserInputs:_.pendingUserInputs,contextUsage:_.contextUsage,sessionSummary:x}),E=Date.now()-w,D=Math.max(T.length,1);this.log(`stream.snapshot.prepared`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,provider:t.provider,detailLevel:t.detailLevel,bootstrapMode:t.bootstrapMode,reason:n,snapshotId:i,snapshotFormat:`readable`,compactedEventCount:o.length,canonicalRawEventCount:_.rawEvents.length,detailTransportRawEventCount:_.detailTransportRawEvents.length,readableTimelineItemCount:_.timelineItems.length,bufferedReadableDeltaCount:y.length,readableChunkTargetBytes:524288,readableChunkItemCounts:T.map(e=>e.timelineItems.length),readableChunkEstimatedBytes:T.map(e=>e.estimatedByteLength),projectionBuildDurationMs:p,chunkPlanDurationMs:E,totalPrepareDurationMs:Date.now()-r,totalChunks:D,firstRawSeq:_.rawEvents[0]?.rawSeq??null,lastRawSeq:S??null,orderedLastRawSeq:C??null,rawSeqOrderMismatch:S!==C});for(let n=0;n<D;n+=1){let r=T[n];this.sessionHub.sendStreamMessage(e,qI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:i,chunkIndex:n,totalChunks:D,timelineItems:r?.timelineItems??[],pendingApprovals:n===0?_.pendingApprovals:void 0,pendingUserInputs:n===0?_.pendingUserInputs:void 0,contextUsage:n===0?_.contextUsage:void 0,sessionSummary:n===0?x:void 0}))}}catch(n){throw this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}};sendSessionReadableResumeDelta=async(e,t,n,r)=>{let i=Date.now(),a=QI(e,t.sessionId),o=Date.now(),s=await this.sessionManager.getProjectSessionRawEventsWithCoverage(t.projectId,t.sessionId,2**53-1),c=Date.now()-o,l=s.rawEvents,u=s.coveredToRawSeq,d=Date.now(),{baseRawEvents:f,nextRawEvents:p}=HI({rawEvents:l,cursorRawSeq:n}),m=Date.now()-d,h=Date.now(),g=dL({target:t,rawEvents:f,coveredToRawSeq:n}),_=Date.now()-h,v=Date.now(),y=dL({target:t,rawEvents:p,coveredToRawSeq:Math.max(n,u??0)}),b=Date.now()-v,x=iL(y),S=this.stateByClientSession.get(a),C=BI(S?.kind===`bootstrapping`?S.queuedEnvelopes:[],x),w=Date.now();for(let e of C)y=fL(y,e);let T=Date.now()-w,E=iL(g),D=nL(g.rawEvents),O=iL(y),k=nL(y.rawEvents),A=Date.now(),j=ML({sessionId:t.sessionId,previousState:g,envelopes:[...p.filter(e=>e.rawSeq>n),...C]}),M=Date.now()-A;this.log(`stream.readable.resume.prepared`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,provider:t.provider,detailLevel:t.detailLevel,reason:r,cursorRawSeq:n,rawEventCount:l.length,baseRawEventCount:f.length,nextRawEventCount:p.length,previousMaxRawSeq:E??null,previousOrderedLastRawSeq:D??null,nextMaxRawSeq:O??null,nextOrderedLastRawSeq:k??null,rawSeqOrderMismatch:E!==D||O!==k,bootstrapState:PL(S),bufferedEnvelopeCount:C.length,previousState:NL(g),nextState:NL(y),sessionSummaryKeys:j?Object.keys(j):[],sessionSummaryStatus:j?.status??null,sessionSummaryUpdatedAt:j?.updatedAt??null,historyReadDurationMs:c,splitDurationMs:m,previousProjectionDurationMs:_,nextProjectionDurationMs:b,bufferedApplyDurationMs:T,summaryDurationMs:M,prepareDurationMs:Date.now()-i}),this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:y.rawEvents,coveredToRawSeq:iL(y),detailTransportRawEvents:y.detailTransportRawEvents,contextUsage:y.contextUsage,timelineItems:y.timelineItems,pendingApprovals:y.pendingApprovals,pendingUserInputs:y.pendingUserInputs});let N=iL(y)??n;this.sessionHub.sendStreamMessage(e,GI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`delta`,reason:r,fromRawSeq:n,...N===void 0?{}:{toRawSeq:N}}));let P=Date.now(),F=FL({previousState:g,nextState:y,sessionSummary:j},this.log),I=Date.now()-P;this.log(`stream.readable.resume.delta`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,reason:r,cursorRawSeq:n,emittedDelta:!!F,deltaFromRawSeq:F?.fromRawSeq??n,deltaToRawSeq:F?.toRawSeq??N??null,timelineUpsertCount:F?.timelineUpserts.length??0,timelineRemovalCount:F?.timelineRemovals.length??0,timelineTextDeltaPatchCount:F?.timelineTextDeltaPatches.length??0,pendingApprovalUpsertCount:F?.pendingApprovalUpserts.length??0,pendingUserInputUpsertCount:F?.pendingUserInputUpserts.length??0,sessionSummaryStatus:F?.sessionSummary?.status??null,sessionSummaryUpdatedAt:F?.sessionSummary?.updatedAt??null,historyReadDurationMs:c,splitDurationMs:m,previousProjectionDurationMs:_,nextProjectionDurationMs:b,bufferedApplyDurationMs:T,summaryDurationMs:M,deltaBuildDurationMs:I,totalDurationMs:Date.now()-i}),this.sessionHub.sendSessionMessageToClient(e,t.sessionId,JI(F??{provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,fromRawSeq:n,toRawSeq:N,timelineUpserts:[],timelineRemovals:[]}))};getReadableItemDetailCacheKey(e,t,n){return`${e}::${t}::${n}`}getReadableItemDetailCacheEntry(e,t,n){let r=this.getReadableItemDetailCacheKey(e,t,n),i=this.itemDetailCache.get(r);return i?(this.itemDetailCache.delete(r),this.itemDetailCache.set(r,i),i):null}setReadableItemDetailCacheEntry(e){let t=this.getReadableItemDetailCacheKey(e.projectId,e.sessionId,e.itemId);for(this.itemDetailCache.has(t)&&this.itemDetailCache.delete(t),this.itemDetailCache.set(t,e);this.itemDetailCache.size>Math.max(1,this.itemDetailCacheMaxEntries);){let e=this.itemDetailCache.keys().next().value;if(!e)break;this.itemDetailCache.delete(e)}}seedReadableItemDetailCache(e){let t=0;for(let n of e.timelineItems){let r=wI(n);r&&(this.setReadableItemDetailCacheEntry({projectId:e.projectId,sessionId:e.sessionId,itemId:r,item:n}),t+=1)}return t}getLatestReadableReadyStateForSession(e,t){let n=null,r=-1,i=i=>{if(!i||i.projectId!==e||i.sessionId!==t)return;let a=iL(i)??-1;a<r||(n=i,r=a)};for(let e of this.stateByClientSession.values())e.kind===`ready`&&i(e);for(let e of this.pendingDeltaByClientSession.values())i(e.nextState);return n}syncReadableLiveProjectionSubscriptions(e,t,n,r){let i=new Set(n.filter($I).map(e=>e.sessionId));if(r)for(let n of t)i.has(n.sessionId)||this.clearState(e,n.sessionId);for(let t of n)$I(t)||this.clearState(e,t.sessionId)}startReadableLiveProjectionBootstrap(e){let t=QI(e.clientId,e.sessionId),n=this.stateByClientSession.get(t),r=this.pendingDeltaByClientSession.get(t),i=e.previousReadyState??(n?.kind===`bootstrapping`?n.previousReadyState:this.getReadableDeliveredReadyState(e.clientId,e.sessionId)),a=this.getReadablePendingDeltaReplayEnvelopes(i,r);r&&(clearTimeout(r.timer),this.pendingDeltaByClientSession.delete(t));let o=n?.kind===`bootstrapping`?n:i,s=UI(e.sessionId,o);if(a.length>0){let e=new Set(s.queuedEnvelopes.map(e=>e.rawSeq));for(let t of a)e.has(t.rawSeq)||(s.queuedEnvelopes.push(t),e.add(t.rawSeq))}return this.stateByClientSession.set(t,s),this.log(`readable.bootstrap.started`,{clientId:e.clientId,sessionId:e.sessionId,replacedState:PL(n),clearedPendingDelta:!!r,carriedPendingEnvelopeCount:a.length}),t}getReadableDeliveredReadyState(e,t){let n=QI(e,t),r=this.pendingDeltaByClientSession.get(n);if(r)return r.previousState;let i=this.stateByClientSession.get(n);return i?.kind===`ready`?i:null}getReadablePendingDeltaReplayEnvelopes(e,t){return t?BI(t.nextState.rawEvents,e?iL(e):void 0):[]}getReadableRefreshDeltaBase(e){let t=this.getReadableRefreshDeltaReason(e.reason);if(!t||e.refreshMode!==`delta`)return null;let n=this.getReadableDeliveredReadyState(e.clientId,e.sessionId);if(!n||n.projectId!==e.projectId||n.detailLevel!==e.detailLevel)return null;let r=iL(n);return typeof r==`number`?{cursor:r,previousReadyState:n,reason:t}:null}getReadableRefreshDeltaReason(e){return e===`external_history_updated`||e===`explicit_history_sync`?`${e}_delta`:null}seedReadableLiveProjectionState(e){let t=aL(e);this.stateByClientSession.set(QI(e.clientId,e.target.sessionId),t),this.log(`readable.state.seeded`,{clientId:e.clientId,sessionId:e.target.sessionId,projectId:e.target.projectId,provider:e.target.provider,detailLevel:e.target.detailLevel,state:NL(t)})}primeReadableBootstrapForSubscriptions(e,t){for(let n of t)$I(n)&&this.startReadableLiveProjectionBootstrap({clientId:e,sessionId:n.sessionId})}async syncSessionStreamSubscription(e,t){let n=await this.resolveSessionStreamTarget(t);if(n.bootstrapMode===`readable`){if(t.cursor.kind===`all`){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`all`,requestedRawSeq:null,decision:`snapshot`,reason:`readable_bootstrap_snapshot`}),await this.sendSessionReadableSnapshot(e,n,`readable_bootstrap_snapshot`);return}let r=await this.sessionManager.getProjectSessionRawSeqRange(n.projectId,n.sessionId);if(!r){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:t.cursor.rawSeq,decision:`snapshot`,reason:`readable_empty_history_snapshot`,rangeMin:null,rangeMax:null}),await this.sendSessionReadableSnapshot(e,n,`readable_empty_history_snapshot`);return}let i=t.cursor.rawSeq,a=Math.max(0,r.min-1);if(i<a||i>r.max){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:i,decision:`snapshot`,reason:`readable_cursor_out_of_range_snapshot`,rangeMin:r.min,rangeMax:r.max,minExpectedCursor:a}),await this.sendSessionReadableSnapshot(e,n,`readable_cursor_out_of_range_snapshot`);return}let o=n.status===`running`?`readable_cursor_resumed_delta`:`readable_session_idle_delta`;this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:i,decision:`delta`,reason:o,rangeMin:r.min,rangeMax:r.max,minExpectedCursor:a}),await this.sendSessionReadableResumeDelta(e,n,i,o);return}if(t.cursor.kind===`all`){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`all`,requestedRawSeq:null,decision:`snapshot`,reason:`cursor_all`}),await this.sendSessionSnapshot(e,n,`cursor_all`);return}let r=await this.sessionManager.getProjectSessionRawSeqRange(n.projectId,n.sessionId);if(!r){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:t.cursor.rawSeq,decision:`snapshot`,reason:`empty_history_snapshot`,rangeMin:null,rangeMax:null}),await this.sendSessionSnapshot(e,n,`empty_history_snapshot`);return}let i=t.cursor.rawSeq,a=Math.max(0,r.min-1);if(i<a||i>r.max){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:i,decision:`snapshot`,reason:`cursor_out_of_range_snapshot`,rangeMin:r.min,rangeMax:r.max,minExpectedCursor:a}),await this.sendSessionSnapshot(e,n,`cursor_out_of_range_snapshot`);return}let o=await this.sessionManager.getProjectSessionRawEventsSinceSeq(n.projectId,n.sessionId,i,2**53-1),s=o[o.length-1]?.rawSeq??i;this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:i,decision:`delta`,reason:n.status===`running`?`cursor_resumed_delta`:`session_idle_delta`,rangeMin:r.min,rangeMax:r.max,minExpectedCursor:a,backlogCount:o.length,backlogFirstRawSeq:o[0]?.rawSeq??null,backlogLastRawSeq:s}),this.sessionHub.sendStreamMessage(e,GI({provider:n.provider,sessionId:n.sessionId,projectId:n.projectId,decision:`delta`,reason:n.status===`running`?`cursor_resumed_delta`:`session_idle_delta`,fromRawSeq:i,toRawSeq:s}));for(let t of o)this.sessionHub.sendStreamMessage(e,t)}async resolveSessionStreamTarget(e){let t=e.sessionId;if(!t)throw Error(`session.stream.subscribe requires sessionId`);let n=e.projectId?.trim()??``;if(n){let r=await this.sessionManager.getProjectSessionSummary(n,t);if(!r)throw RT(n,t);let i={sessionId:t,projectId:n,provider:r.provider,status:r.status,updatedAt:r.updatedAt,activeStartedAt:r.activeStartedAt,interactionLockReason:LL(r.interactionLockReason),detailLevel:e.detailLevel??`full`,purpose:e.purpose??null,bootstrapMode:e.bootstrapMode??`stream`};return this.log(`stream.subscribe.target.resolved`,{sessionId:t,requestedProjectId:n,resolvedProjectId:i.projectId,purpose:i.purpose,detailLevel:i.detailLevel,bootstrapMode:i.bootstrapMode,targetProvider:i.provider,targetStatus:i.status,resolvedViaExecutionContext:!1,summary:IL(r)}),i}let r=this.sessionManager.getSessionExecutionContext(t),i=await this.sessionManager.getProjectSessionSummary(r.projectId,t),a={sessionId:t,projectId:r.projectId,provider:i?.provider??r.provider,status:i?.status??`idle`,updatedAt:i?.updatedAt,activeStartedAt:i?.activeStartedAt,interactionLockReason:LL(i?.interactionLockReason),detailLevel:e.detailLevel??`full`,purpose:e.purpose??null,bootstrapMode:e.bootstrapMode??`stream`};return this.log(`stream.subscribe.target.resolved`,{sessionId:t,requestedProjectId:null,resolvedProjectId:a.projectId,purpose:a.purpose,detailLevel:a.detailLevel,bootstrapMode:a.bootstrapMode,targetProvider:a.provider,targetStatus:a.status,resolvedViaExecutionContext:!0,executionContextProvider:r.provider,summary:IL(i)}),a}async buildReadableSnapshotProjection(e){let t=Date.now(),n=Date.now(),r=await this.sessionManager.getProjectSessionRawEventsCompactedWithCoverage(e.projectId,e.sessionId,2**53-1),i=Date.now()-n,a=r.rawEvents,o=Date.now(),s=pL({rawEvents:a,detailLevel:e.detailLevel}),c=Date.now()-o,l=Date.now(),u=uL({target:e,rawEvents:s,rawEventsAlreadyMatchDetailTransport:!0}),d=Date.now()-l,f=rL(a,r.coveredToRawSeq)??void 0;return this.log(`stream.readable.snapshot.projection`,{sessionId:e.sessionId,projectId:e.projectId,provider:e.provider,detailLevel:e.detailLevel,compactedRawEventCount:a.length,detailTransportRawEventCount:s.length,timelineItemCount:u.timelineItems.length,pendingApprovalCount:u.pendingApprovals.length,pendingUserInputCount:u.pendingUserInputs.length,coveredToRawSeq:r.coveredToRawSeq,lastRawSeq:f??null,historyReadDurationMs:i,detailTransportDurationMs:c,projectionDurationMs:d,totalDurationMs:Date.now()-t}),{compactedRawEvents:a,detailTransportRawEvents:s,contextUsage:u.contextUsage,lastRawSeq:f,slimReadableProjection:{timelineItems:u.timelineItems,consumedMessageIds:[]},pendingApprovals:u.pendingApprovals,pendingUserInputs:u.pendingUserInputs}}restoreReadableLiveProjectionAfterBootstrapFailure(e){let t=QI(e.clientId,e.sessionId),n=this.stateByClientSession.get(t);if(!n||n.kind!==`bootstrapping`)return;let r=this.sessionHub.getSubscriptions(e.clientId).find(t=>t.sessionId===e.sessionId),i=r?.projectId?.trim()??``,a=WI(n,fL);if(!a.previousReadyState||!r||!$I(r)||i&&i!==a.previousReadyState.projectId||(r.detailLevel??`full`)!==a.previousReadyState.detailLevel||!a.nextReadyState){this.log(`readable.bootstrap.recovery.discarded`,{clientId:e.clientId,sessionId:e.sessionId,bootstrapState:PL(n),currentSubscriptionFound:!!r,currentSubscriptionProjectId:i||null,currentSubscriptionDetailLevel:r?.detailLevel??null,previousReadyState:NL(a.previousReadyState),nextReadyState:NL(a.nextReadyState)}),this.clearState(e.clientId,e.sessionId);return}if(this.stateByClientSession.set(t,a.nextReadyState),a.replayedEnvelopes.length===0){this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:0,nextReadyState:NL(a.nextReadyState)});return}let o=ML({sessionId:e.sessionId,previousState:a.previousReadyState,envelopes:a.replayedEnvelopes}),s=FL({previousState:a.previousReadyState,nextState:a.nextReadyState,sessionSummary:o},this.log);if(!s){this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:NL(a.nextReadyState),emittedDelta:!1});return}this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:NL(a.nextReadyState),emittedDelta:!0,deltaFromRawSeq:s.fromRawSeq??null,deltaToRawSeq:s.toRawSeq}),this.sessionHub.sendSessionMessageToClient(e.clientId,a.previousReadyState.sessionId,JI(s))}sendReadableLiveDeltaNow(e){let t=FL({previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary},this.log);t&&this.sessionHub.sendSessionMessageToClient(e.clientId,e.previousState.sessionId,JI(t))}flushPendingReadableLiveDelta(e,t){let n=QI(e,t),r=this.pendingDeltaByClientSession.get(n);r&&(clearTimeout(r.timer),this.pendingDeltaByClientSession.delete(n),this.sendReadableLiveDeltaNow({clientId:e,previousState:r.previousState,nextState:r.nextState,sessionSummary:r.sessionSummary}))}enqueueReadableLiveDelta(e){if(this.readableLiveDeltaCoalesceMs<=0){this.sendReadableLiveDeltaNow(e);return}let t=QI(e.clientId,e.previousState.sessionId),n=this.pendingDeltaByClientSession.get(t);if(n){let t=BL({existing:{previousState:n.previousState,nextState:n.nextState,sessionSummary:n.sessionSummary},next:{previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary}});n.previousState=t.previousState,n.nextState=t.nextState,n.sessionSummary=t.sessionSummary;return}let r=setTimeout(()=>{this.flushPendingReadableLiveDelta(e.clientId,e.previousState.sessionId)},this.readableLiveDeltaCoalesceMs);r.unref?.(),this.pendingDeltaByClientSession.set(t,{clientId:e.clientId,sessionId:e.previousState.sessionId,previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary,timer:r})}};function BL(e){let t=(e,t)=>{let n={...e??{},...t??{}};return Object.keys(n).length>0?n:void 0};return e.existing?{previousState:e.existing.previousState,nextState:e.next.nextState,sessionSummary:t(e.existing.sessionSummary,e.next.sessionSummary)}:{previousState:e.next.previousState,nextState:e.next.nextState,sessionSummary:t(void 0,e.next.sessionSummary)}}function VL(e){return e.sendProviderRaw?`relay_ws`:`direct_ws`}function HL(e){let t=performance.now(),n=JSON.stringify(e);return{payload:n,byteLength:Buffer.byteLength(n),serializeDurationMs:Number((performance.now()-t).toFixed(3))}}function UL(e){return e.kind===`session.readable.snapshot.chunk`?{snapshotId:e.payload.readable.snapshotId,chunkIndex:e.payload.readable.chunkIndex,totalChunks:e.payload.readable.totalChunks,snapshotFormat:`readable`,chunkEventCount:null,chunkTimelineItemCount:e.payload.readable.timelineItems.length}:e.kind===`session.stream.snapshot.chunk`?{snapshotId:e.payload.raw.snapshotId,chunkIndex:e.payload.raw.chunkIndex,totalChunks:e.payload.raw.totalChunks,snapshotFormat:e.payload.readable?`raw+readable`:`raw`,chunkEventCount:e.payload.raw.events.length,chunkTimelineItemCount:e.payload.readable?.timelineItems?.length??null}:null}var WL=class{clients=new Map;clientIdsBySessionId=new Map;deliveryStateByClientSession=new Map;addClient(e,t){let n=`ws_${DT(10)}`;return this.clients.set(n,{id:n,deviceId:e,socket:t,subscriptionsBySessionId:new Map}),n}removeClient(e){let t=this.clients.get(e);t&&(this.removeClientFromSessionIndexes(e,t.subscriptionsBySessionId.keys()),this.removeClientDeliveryState(e),this.clients.delete(e))}replaceSubscriptions(e,t,n=!0){let r=this.clients.get(e);if(!r)return[];n&&(this.removeClientFromSessionIndexes(e,r.subscriptionsBySessionId.keys()),this.removeClientSessionDeliveryState(e,r.subscriptionsBySessionId.keys()),r.subscriptionsBySessionId.clear());let i=new Map;for(let e of t)i.set(e.sessionId,e);for(let[t,n]of i){r.subscriptionsBySessionId.set(t,n);let i=this.clientIdsBySessionId.get(t)??new Set;i.add(e),this.clientIdsBySessionId.set(t,i),this.ensureClientSessionDeliveryState(e,t)}return[...r.subscriptionsBySessionId.values()]}getSubscriptions(e){let t=this.clients.get(e);return t?[...t.subscriptionsBySessionId.values()]:[]}getWatchSubscriptions(e){let t=new Map;for(let n of this.clients.values())for(let r of n.subscriptionsBySessionId.values())r.purpose===e&&t.set(r.sessionId,r);return[...t.values()]}getClientSubscriptionsForSession(e,t){let n=this.clientIdsBySessionId.get(e);if(!n||n.size===0)return[];let r=[];for(let i of n){let n=this.clients.get(i),a=n?.subscriptionsBySessionId.get(e);!n||!a||t&&a.purpose!==t||r.push({clientId:i,subscription:a})}return r}routeProviderRaw(e){let t=this.clientIdsBySessionId.get(e.sessionId);if(!t||t.size===0)return;let n=null;for(let r of t){let t=this.clients.get(r),i=t?.subscriptionsBySessionId.get(e.sessionId);if(!t||!i||!this.shouldDeliverProviderRaw(i))continue;let a=this.deliveryStateByClientSession.get(this.clientSessionKey(r,e.sessionId));if(a?.paused){a.queued.push({message:e});continue}if(t.socket.readyState===t.socket.OPEN){if(t.socket.sendProviderRaw){t.socket.sendProviderRaw(e);continue}n??=JSON.stringify(e),t.socket.send(n)}}}routeSessionMessage(e,t){let n=this.clientIdsBySessionId.get(e.sessionId);if(!n||n.size===0)return;let r=null;for(let i of n){let n=this.clients.get(i),a=n?.subscriptionsBySessionId.get(e.sessionId);if(!n||!a||!t(a))continue;let o=this.deliveryStateByClientSession.get(this.clientSessionKey(i,e.sessionId));if(o?.paused){o.queued.push({message:e});continue}n.socket.readyState===n.socket.OPEN&&(r=this.sendGatewayStreamMessage(n,e,r))}}sendSessionMessageToClient(e,t,n){let r=this.clients.get(e),i=r?.subscriptionsBySessionId.get(t);if(!r||!i)return;let a=this.deliveryStateByClientSession.get(this.clientSessionKey(e,t));if(a?.paused){a.queued.push({message:n});return}r.socket.readyState===r.socket.OPEN&&this.sendGatewayStreamMessage(r,n)}pauseSession(e,t){let n=this.ensureClientSessionDeliveryState(e,t);n.paused=!0}resumeSession(e,t){let n=this.clientSessionKey(e,t),r=this.deliveryStateByClientSession.get(n);if(!r||(r.paused=!1,r.queued.length===0))return;let i=this.clients.get(e);if(!i||i.socket.readyState!==i.socket.OPEN){r.queued=[];return}let a=[...r.queued];r.queued=[];for(let e of a){if(e.message.kind===`provider.raw`&&i.socket.sendProviderRaw){i.socket.sendProviderRaw(e.message);continue}this.sendGatewayStreamMessage(i,e.message)}}sendStreamMessage(e,t){let n=this.clients.get(e);!n||n.socket.readyState!==n.socket.OPEN||this.sendGatewayStreamMessage(n,t)}sendBroadcastMessage(e,t){let n=null;for(let r of this.clients.values())if(r.socket.readyState===r.socket.OPEN){if(t?.sessionId){let e=r.subscriptionsBySessionId.get(t.sessionId);if(!e||t.purpose&&e.purpose!==t.purpose)continue}n=this.sendGatewayStreamMessage(r,e,n)}}sendSystemMessage(e,t){let n=this.clients.get(e);!n||n.socket.readyState!==n.socket.OPEN||n.socket.send(JSON.stringify(t))}broadcastSystemMessage(e){let t=JSON.stringify(e);for(let e of this.clients.values())e.socket.readyState===e.socket.OPEN&&e.socket.send(t)}count(){return this.clients.size}sendGatewayStreamMessage(e,t,n=null){let r=n??HL(t),i=UL(t);return i&&vM(`stream.snapshot.chunk.outbound`,{clientId:e.id,deviceId:e.deviceId,transport:VL(e.socket),provider:t.provider,sessionId:t.sessionId,projectId:t.projectId??null,messageKind:t.kind,messageType:t.type,snapshotId:i.snapshotId,chunkIndex:i.chunkIndex,totalChunks:i.totalChunks,snapshotFormat:i.snapshotFormat,chunkEventCount:i.chunkEventCount,chunkTimelineItemCount:i.chunkTimelineItemCount,serializedByteLength:r.byteLength,serializeDurationMs:r.serializeDurationMs}),e.socket.send(r.payload),r}removeClientFromSessionIndexes(e,t){for(let n of t){let t=this.clientIdsBySessionId.get(n);t&&(t.delete(e),t.size===0&&this.clientIdsBySessionId.delete(n))}}clientSessionKey(e,t){return`${e}::${t}`}ensureClientSessionDeliveryState(e,t){let n=this.clientSessionKey(e,t),r=this.deliveryStateByClientSession.get(n);if(r)return r;let i={paused:!1,queued:[]};return this.deliveryStateByClientSession.set(n,i),i}removeClientSessionDeliveryState(e,t){for(let n of t)this.deliveryStateByClientSession.delete(this.clientSessionKey(e,n))}removeClientDeliveryState(e){let t=`${e}::`;for(let e of this.deliveryStateByClientSession.keys())e.startsWith(t)&&this.deliveryStateByClientSession.delete(e)}shouldDeliverProviderRaw(e){return!(e.purpose===`detail_view`&&e.bootstrapMode===`readable`)}};const GL=1200,KL=process.env.NATIVE_SESSION_WATCH_DEBUG===`1`||process.env.EXPO_PUBLIC_NATIVE_SESSION_WATCH_DEBUG===`1`;var qL=class{statesByKey=new Map;targetsByClientId=new Map;constructor(e){this.options=e}getClientWatchTargets(e){let t=this.targetsByClientId.get(e);return t?[...t.values()]:[]}setClientWatchTargets(e,t,n){let r=new Map;for(let e of t){let t=e.sessionId.trim(),n=e.projectId?.trim()??``;!t||!n||r.set(this.stateKey(n,t),{sessionId:t,projectId:n})}let i=this.targetsByClientId.get(e)??new Map,a=n?new Map:new Map(i);for(let[e,t]of r)a.set(e,t);for(let[t,n]of i)a.has(t)||this.removeClientFromState(e,n.projectId??``,n.sessionId);for(let[t,n]of a)i.get(t)||this.addClientToState(e,n.projectId??``,n.sessionId);return this.targetsByClientId.set(e,a),[...a.values()]}removeClient(e){let t=this.targetsByClientId.get(e);if(t){for(let n of t.values())this.removeClientFromState(e,n.projectId??``,n.sessionId);this.targetsByClientId.delete(e)}}close(){for(let e of this.statesByKey.values())this.disposeState(e);this.statesByKey.clear(),this.targetsByClientId.clear()}logDebug(e,t){KL&&(console.log(`[native-watch][gateway]`,e,t),this.options.logger.info?.({event:e,...t},`native session watch debug`))}addClientToState(e,t,n){if(!t||!n)return;let r=this.stateKey(t,n),i=this.statesByKey.get(r);i||(i={provider:`codex`,sessionId:n,projectId:t,ownerClientIds:new Set,fileWatcher:null,debounceTimer:null,catchupRetryTimer:null,reconcileTimer:setInterval(()=>{this.requestSync(r,`reconcile`)},25e3),syncInFlight:!1,rerunRequested:!1,stableIdleSyncCount:0,watchCatchupRetryCount:0,lastObservedRawSeq:0,lastObservedRawEventCount:0,lastSentConfigSummary:void 0,lastTriggeredAt:0,lastSyncStartedAt:null,lastSyncCompletedAt:null},this.statesByKey.set(r,i),this.logDebug(`state.created`,{clientId:e,projectId:t,sessionId:n})),i.ownerClientIds.add(e),this.logDebug(`lease.added`,{clientId:e,projectId:t,sessionId:n,ownerClientCount:i.ownerClientIds.size}),this.requestSync(r,`lease_added`)}removeClientFromState(e,t,n){let r=this.statesByKey.get(this.stateKey(t,n));r&&(r.ownerClientIds.delete(e),this.logDebug(`lease.removed`,{clientId:e,projectId:t,sessionId:n,ownerClientCount:r.ownerClientIds.size}),!(r.ownerClientIds.size>0)&&(this.disposeState(r),this.statesByKey.delete(this.stateKey(t,n))))}disposeState(e){e.debounceTimer&&=(clearTimeout(e.debounceTimer),null),this.clearCatchupRetry(e,{resetAttempts:!0}),clearInterval(e.reconcileTimer),e.fileWatcher?.close(),e.fileWatcher=null,this.logDebug(`state.disposed`,{projectId:e.projectId,sessionId:e.sessionId,watchedPath:e.watchedPath})}async requestSync(e,t){let n=this.statesByKey.get(e);if(!n)return;if(n.lastTriggeredAt=Date.now(),n.syncInFlight){n.rerunRequested=!0;return}n.syncInFlight=!0,n.rerunRequested=!1,n.lastSyncStartedAt=Date.now();let r=n.lastSyncStartedAt;this.logDebug(`sync.begin`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,ownerClientCount:n.ownerClientIds.size,watchedPath:n.watchedPath,watchedDir:n.watchedDir,watchedBaseName:n.watchedBaseName,stableIdleSyncCount:n.stableIdleSyncCount});try{let i=Date.now(),a=await this.options.sessionManager.getProjectSessionSummary(n.projectId,n.sessionId),o=Date.now()-i;if(!a||a.providerMode!==`native`||a.provider!==`codex`&&a.provider!==`claude`){this.logDebug(`sync.stop.unwatchable_summary`,{projectId:n.projectId,sessionId:n.sessionId,summarySource:a?.source,summaryProvider:a?.provider,summaryProviderMode:a?.providerMode,summaryStatus:a?.status,summaryDurationMs:o,totalDurationMs:Date.now()-r}),this.stopState(e);return}if(n.provider=a.provider,this.isGatewayOwnedRuntimeLive(n.projectId,n.sessionId,a)||!xI(a)){this.clearCatchupRetry(n,{resetAttempts:!0}),n.stableIdleSyncCount=0,this.logDebug(`sync.skip.gateway_live`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,summaryStatus:a.status,interactionLockReason:a.interactionLockReason,watchedPath:n.watchedPath,ownerClientCount:n.ownerClientIds.size,summaryDurationMs:o,totalDurationMs:Date.now()-r});return}let s=Date.now(),c=await this.options.sessionManager.syncProjectSessionHistory(n.projectId,n.sessionId),l=Date.now()-s;n.lastSyncCompletedAt=Date.now();let u=Date.now();this.applyWatchPath(n,c.nativeWatchPath);let d=Date.now()-u,f=this.isGatewayOwnedRuntimeLive(n.projectId,n.sessionId,c.session),p=n.lastObservedRawSeq,m=n.lastObservedRawEventCount,h=this.resolveObservedRawSeq(c),g=h>p||c.rawEvents.length>m;if(g?this.clearCatchupRetry(n,{resetAttempts:!0}):this.maybeScheduleWatchCatchupRetry(e,n,t,c,{previousObservedRawSeq:p,previousObservedRawEventCount:m,nextObservedRawSeq:h,nextObservedRawEventCount:c.rawEvents.length}),n.lastObservedRawSeq=Math.max(n.lastObservedRawSeq,h),n.lastObservedRawEventCount=Math.max(n.lastObservedRawEventCount,c.rawEvents.length),f){this.clearCatchupRetry(n,{resetAttempts:!0}),n.stableIdleSyncCount=0,this.logDebug(`sync.result.stand_down.gateway_live`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,status:c.session.status,interactionLockReason:c.session.interactionLockReason,historyUpdated:c.historyUpdated,statusChanged:c.statusChanged,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,nativeWatchPath:c.nativeWatchPath,rawEventCount:c.rawEvents.length,summaryDurationMs:o,historySyncDurationMs:l,applyWatchPathDurationMs:d,totalDurationMs:Date.now()-r});return}c.session.status!==`running`&&!c.historyUpdated?n.stableIdleSyncCount+=1:n.stableIdleSyncCount=0,this.logDebug(`sync.result`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,status:c.session.status,interactionLockReason:c.session.interactionLockReason,historyUpdated:c.historyUpdated,statusChanged:c.statusChanged,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,nativeWatchPath:c.nativeWatchPath,rawEventCount:c.rawEvents.length,cursorAdvanced:g,previousObservedRawSeq:p,previousObservedRawEventCount:m,nextObservedRawSeq:h,nextObservedRawEventCount:c.rawEvents.length,watchCatchupRetryCount:n.watchCatchupRetryCount,stableIdleSyncCount:n.stableIdleSyncCount,summaryDurationMs:o,historySyncDurationMs:l,applyWatchPathDurationMs:d,totalDurationMs:Date.now()-r});let _=JL(c.session),v=ZL(_);if(c.historyUpdated||c.statusChanged||YL(t)&&QL(t,n.lastSentConfigSummary,v)){let e=this.options.createExternalUpdateMessage({provider:c.session.provider,sessionId:c.session.id,projectId:c.session.projectId,updatedAt:c.session.updatedAt,status:c.session.status,interactionLockReason:c.session.interactionLockReason,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,historyUpdated:c.historyUpdated,statusChanged:c.statusChanged,sessionSummary:_});for(let t of n.ownerClientIds)this.options.sendStreamMessage(t,e);v&&(n.lastSentConfigSummary=v)}if(c.historyUpdated){let e=Date.now();await this.options.refreshDetailSessionSnapshots?.({projectId:n.projectId,sessionId:n.sessionId,reason:`external_history_updated`,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq}),this.logDebug(`sync.refresh_detail_snapshots`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,durationMs:Date.now()-e})}}catch(e){this.options.logger.warn({err:e,projectId:n.projectId,sessionId:n.sessionId,reason:t},`native session watch sync failed`)}finally{let n=this.statesByKey.get(e);if(!n)return;n.syncInFlight=!1,n.rerunRequested&&(this.logDebug(`sync.rerun`,{projectId:n.projectId,sessionId:n.sessionId,reason:t}),n.rerunRequested=!1,this.requestSync(e,`rerun`))}}stopState(e){let t=this.statesByKey.get(e);if(t){this.disposeState(t),this.statesByKey.delete(e);for(let t of this.targetsByClientId.values())t.delete(e)}}applyWatchPath(e,t){let n=t?.trim()??``;if(!n)return;let r=p.default.resolve(n);if(e.watchedPath===r&&e.fileWatcher)return;let i=p.default.dirname(r),a=p.default.basename(r);e.fileWatcher?.close(),e.fileWatcher=null,e.watchedPath=r,e.watchedDir=i,e.watchedBaseName=a,this.logDebug(`watch.path.applied`,{projectId:e.projectId,sessionId:e.sessionId,watchedPath:r,watchedDir:i,watchedBaseName:a});try{e.fileWatcher=this.createPathWatcher(r,(t,n)=>{let i=n?Buffer.isBuffer(n)?n.toString(`utf8`):n:void 0;this.logDebug(`watch.fs.event`,{projectId:e.projectId,sessionId:e.sessionId,watchedPath:r,eventType:t,filename:i}),this.scheduleDebouncedSync(this.stateKey(e.projectId,e.sessionId))}),e.fileWatcher.on(`error`,t=>{this.options.logger.warn({err:t,projectId:e.projectId,sessionId:e.sessionId,watchedPath:r},`native session watcher error`)})}catch(t){this.options.logger.warn({err:t,projectId:e.projectId,sessionId:e.sessionId,watchedPath:r},`failed to start native session watcher`)}}createPathWatcher(e,t){return this.options.createWatcher?this.options.createWatcher(e,t):(0,u.watch)(e,(e,n)=>{t(e,n)})}scheduleDebouncedSync(e){let t=this.statesByKey.get(e);if(!t)return;let n=!!t.debounceTimer;t.debounceTimer&&clearTimeout(t.debounceTimer),this.clearCatchupRetry(t,{resetAttempts:!0}),this.logDebug(`watch.debounce.scheduled`,{projectId:t.projectId,sessionId:t.sessionId,watchedPath:t.watchedPath,delayMs:300,replacedExistingTimer:n}),t.debounceTimer=setTimeout(()=>{t.debounceTimer=null,this.logDebug(`watch.debounce.fired`,{projectId:t.projectId,sessionId:t.sessionId,watchedPath:t.watchedPath}),this.requestSync(e,`watch`)},300)}resolveObservedRawSeq(e){let t=e.rawEvents[e.rawEvents.length-1],n=t&&typeof t==`object`&&t&&`rawSeq`in t&&typeof t.rawSeq==`number`?t.rawSeq:void 0;return e.toRawSeq??n??0}clearCatchupRetry(e,t){e.catchupRetryTimer&&=(clearTimeout(e.catchupRetryTimer),null),t?.resetAttempts&&(e.watchCatchupRetryCount=0)}maybeScheduleWatchCatchupRetry(e,t,n,r,i){n!==`watch`&&n!==`watch_catchup`||t.ownerClientIds.size!==0&&(t.watchCatchupRetryCount>=2||(t.catchupRetryTimer||=(t.watchCatchupRetryCount+=1,this.logDebug(`watch.catchup.scheduled`,{projectId:t.projectId,sessionId:t.sessionId,reason:n,delayMs:GL,historyUpdated:r.historyUpdated,refreshMode:r.refreshMode,previousObservedRawSeq:i.previousObservedRawSeq,previousObservedRawEventCount:i.previousObservedRawEventCount,nextObservedRawSeq:i.nextObservedRawSeq,nextObservedRawEventCount:i.nextObservedRawEventCount,watchCatchupRetryCount:t.watchCatchupRetryCount}),setTimeout(()=>{t.catchupRetryTimer=null,this.logDebug(`watch.catchup.fired`,{projectId:t.projectId,sessionId:t.sessionId,watchCatchupRetryCount:t.watchCatchupRetryCount}),this.requestSync(e,`watch_catchup`)},GL))))}stateKey(e,t){return JSON.stringify([e,t])}isGatewayOwnedRuntimeLive(e,t,n){return this.options.sessionManager.isGatewayOwnedRuntimeLive?.(e,t)?!0:n?n.status===`running`&&n.interactionLockReason!==`external_turn_running`:!1}};function JL(e){return{updatedAt:e.updatedAt,status:e.status,interactionLockReason:e.interactionLockReason,...e.model?{model:e.model}:e.sessionTurnConfig?.model===null?{model:null}:{},...e.sessionTurnConfig?{sessionTurnConfig:e.sessionTurnConfig}:{},...e.sessionTurnConfigUpdatedAt?{sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt}:{}}}function YL(e){return e===`lease_added`||e===`watch`||e===`watch_catchup`||e===`reconcile`||e===`rerun`}function XL(e){return!!(e&&Object.prototype.hasOwnProperty.call(e,`model`)||e?.sessionTurnConfig||e?.sessionTurnConfigUpdatedAt)}function ZL(e){if(XL(e))return{...e&&Object.prototype.hasOwnProperty.call(e,`model`)?{model:e.model??null}:{},...e?.sessionTurnConfig?{sessionTurnConfig:e.sessionTurnConfig}:{},...e?.sessionTurnConfigUpdatedAt?{sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt}:{}}}function QL(e,t,n){return n?e===`lease_added`?!0:!$L(t,n):!1}function $L(e,t){if(!e||!t)return e===t;let n=Object.prototype.hasOwnProperty.call(e,`model`);return n!==Object.prototype.hasOwnProperty.call(t,`model`)||n&&e.model!==t.model||e.sessionTurnConfigUpdatedAt!==t.sessionTurnConfigUpdatedAt?!1:eR(e.sessionTurnConfig,t.sessionTurnConfig)}function eR(e,t){return!e||!t?e===t:e.mode===t.mode&&e.model===t.model&&e.reasoningEffort===t.reasoningEffort&&(e.execution?.codex?.approvalPolicy??null)===(t.execution?.codex?.approvalPolicy??null)&&(e.execution?.codex?.sandboxMode??null)===(t.execution?.codex?.sandboxMode??null)&&(e.execution?.claude?.permissionMode??null)===(t.execution?.claude?.permissionMode??null)}var tR=class{constructor(e){this.config=e}issue(e){let t=nR(e.sizeBytes??0),n=vT.default.sign({sub:e.deviceId,type:`workspace_preview`,gatewayId:this.config.gatewayId,path:e.canonicalPath,disposition:e.disposition},this.config.accessSecret,{expiresIn:t}),r=vT.default.decode(n);return{ticket:n,expiresAt:r?.exp?new Date(r.exp*1e3).toISOString():new Date().toISOString()}}getExpiresAt(e){let t=vT.default.decode(e);return t?.exp?new Date(t.exp*1e3).toISOString():new Date().toISOString()}verify(e){let t;try{t=vT.default.verify(e,this.config.accessSecret)}catch(e){if(e instanceof Error){if(e.name===`TokenExpiredError`)throw IT();if(e.name===`JsonWebTokenError`||e.name===`NotBeforeError`)throw FT()}throw e}if(t.type!==`workspace_preview`||t.gatewayId!==this.config.gatewayId)throw FT();return t}};function nR(e){return e>20971520?7200:600}var rR=class{constructor(e){this.dependencies=e}async listEntries(e,t=200){if(e.kind===`absolute`)return this.dependencies.fsService.listEntriesAbsolute(e.path,t);let n=await this.requireProject(e.projectId);return this.dependencies.fsService.listEntriesProjectRelative(n.path,e.path??`.`,t)}async resolveFile(e){return{file:(await this.resolveLocator(e)).descriptor}}async readTextFile(e,t={}){let n=await this.resolveLocator(e),r=await this.dependencies.fsService.readTextFile(n.canonicalPath,t);return{file:n.descriptor,...r}}async preparePreview(e,t){let n=await this.resolveLocator(e),r=t.disposition??(n.descriptor.preferredPreviewAction===`share_sheet`||n.descriptor.preferredPreviewAction===`download`?`attachment`:`inline`),i=this.dependencies.previewTicketService.issue({canonicalPath:n.canonicalPath,deviceId:t.deviceId??``,disposition:r,sizeBytes:n.descriptor.sizeBytes}),a=i.ticket,o=i.expiresAt;return{file:n.descriptor,preview:{url:t.buildPreviewUrl(a),expiresAt:o,supportsRange:n.descriptor.capabilities.supportsRange,contentType:n.descriptor.mimeType,contentDisposition:r}}}async readPreviewContent(e,t={}){let n=this.dependencies.previewTicketService.verify(e),r=await this.dependencies.fsService.resolveAbsoluteFile(n.path),i=await this.dependencies.fsService.readFileContentRange(r.canonicalPath,{rangeHeader:t.rangeHeader,includeBody:t.includeBody});return{statusCode:i.statusCode,headers:{contentType:r.mimeType,contentDisposition:aR(n.disposition,r.displayName),contentLength:i.contentLength,etag:i.etag,...r.capabilities.supportsRange?{acceptRanges:`bytes`}:{},...i.contentRange?{contentRange:i.contentRange}:{},...i.lastModified?{lastModified:i.lastModified}:{},cacheControl:`private, max-age=300`},body:i.buffer}}async openPreviewContentStream(e,t={}){let n=this.dependencies.previewTicketService.verify(e),r=await this.dependencies.fsService.resolveAbsoluteFile(n.path),i=await this.dependencies.fsService.openFileContentRangeStream(r.canonicalPath,{rangeHeader:t.rangeHeader,includeBody:t.includeBody});return{statusCode:i.statusCode,headers:{contentType:r.mimeType,contentDisposition:aR(n.disposition,r.displayName),contentLength:i.contentLength,etag:i.etag,...r.capabilities.supportsRange?{acceptRanges:`bytes`}:{},...i.contentRange?{contentRange:i.contentRange}:{},...i.lastModified?{lastModified:i.lastModified}:{},cacheControl:`private, max-age=300`},bodyStream:i.stream}}async resolveLocator(e){if(e.kind===`absolute`){let t=await this.dependencies.fsService.resolveAbsoluteFile(e.path);return{canonicalPath:t.canonicalPath,descriptor:{locator:{kind:`absolute`,path:t.canonicalPath},canonicalPath:t.canonicalPath,displayName:t.displayName,kind:`file`,sizeBytes:t.sizeBytes,mimeType:t.mimeType,extension:t.extension,updatedAt:t.updatedAt,etag:t.etag,previewCategory:t.previewCategory,preferredPreviewAction:t.preferredPreviewAction,capabilities:t.capabilities}}}if(e.kind===`project_relative`){let t=await this.requireProject(e.projectId),n=await this.dependencies.fsService.resolveProjectRelativeFile(t.path,e.path),r=iR(p.default.relative(t.path,n.canonicalPath));return{canonicalPath:n.canonicalPath,descriptor:{locator:{kind:`project_relative`,projectId:t.id,path:r},canonicalPath:n.canonicalPath,displayName:n.displayName,projectId:t.id,relativePath:r,kind:`file`,sizeBytes:n.sizeBytes,mimeType:n.mimeType,extension:n.extension,updatedAt:n.updatedAt,etag:n.etag,previewCategory:n.previewCategory,preferredPreviewAction:n.preferredPreviewAction,capabilities:n.capabilities}}}let t=this.dependencies.sessionManager.getSessionExecutionContext(e.sessionId),n=await this.dependencies.fsService.resolveProjectRelativeFile(t.projectPath,e.path),r=iR(p.default.relative(t.projectPath,n.canonicalPath));return{canonicalPath:n.canonicalPath,descriptor:{locator:{kind:`session_relative`,sessionId:e.sessionId,path:r},canonicalPath:n.canonicalPath,displayName:n.displayName,projectId:t.projectId,relativePath:r,kind:`file`,sizeBytes:n.sizeBytes,mimeType:n.mimeType,extension:n.extension,updatedAt:n.updatedAt,etag:n.etag,previewCategory:n.previewCategory,preferredPreviewAction:n.preferredPreviewAction,capabilities:n.capabilities}}}async requireProject(e){let t=await this.dependencies.sessionManager.getProject(e);if(!t)throw LT(e);return t}};function iR(e){return e.split(p.default.sep).join(`/`)}function aR(e,t){return`${e}; filename="${t.replace(/["\\]/g,`_`)}"`}function oR(e,t){let n=process.env[e];if(!n)return t;let r=Number(n);return Number.isInteger(r)&&r>0?r:t}function sR(e){let t=e.intervalMs??oR(`GATEWAY_EVENT_LOOP_STALL_INTERVAL_MS`,250),n=e.thresholdMs??oR(`GATEWAY_EVENT_LOOP_STALL_THRESHOLD_MS`,1e3),r=k.performance.now()+t,i=k.performance.now(),a=process.cpuUsage(),o=setInterval(()=>{let o=k.performance.now(),s=o-r;r=o+t;let c=o-i,l=process.cpuUsage(a);if(i=o,a=process.cpuUsage(),s<n)return;let u=process.memoryUsage();e.logger.warn?.({event:`gateway.event_loop.stall`,stallMs:Math.round(s),elapsedSinceLastTickMs:Math.round(c),intervalMs:t,thresholdMs:n,cpuUserMs:Math.round(l.user/1e3),cpuSystemMs:Math.round(l.system/1e3),rssMb:Math.round(u.rss/1024/1024),heapUsedMb:Math.round(u.heapUsed/1024/1024),externalMb:Math.round(u.external/1024/1024)},`gateway event loop stall detected`)},t);return o.unref?.(),{stop:()=>clearInterval(o)}}function cR(e){return e.map(e=>({sessionId:e.sessionId,projectId:e.projectId,cursor:e.cursor.kind===`raw_seq`?{kind:`raw_seq`,rawSeq:e.cursor.rawSeq}:{kind:`all`},purpose:e.purpose,detailLevel:e.detailLevel,bootstrapMode:e.bootstrapMode}))}const lR=process.env.NATIVE_SESSION_WATCH_DEBUG===`1`||process.env.EXPO_PUBLIC_NATIVE_SESSION_WATCH_DEBUG===`1`;process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG;const uR=`[redacted:image-data]`;let dR=null;const fR={perMessageDeflate:{threshold:1024}},pR={globalDecompression:!1,threshold:1024,customTypes:/^text\/(?!event-stream)|(?:\+|\/)json(?:;|$)|(?:\+|\/)text(?:;|$)|(?:\+|\/)xml(?:;|$)/u},mR=4096;function hR(e){if(Array.isArray(e))return e.map(e=>hR(e));if(!e||typeof e!=`object`)return e;let t={};for(let[n,r]of Object.entries(e))t[n]=n===`dataBase64`||n===`data_base64`?uR:hR(r);return t}function gR(e,t){if(e)try{return JSON.stringify(hR(e))}catch{}return t.replace(/("(?:dataBase64|data_base64)"\s*:\s*")([^"]*)(")/gu,`$1${uR}$3`)}function _R(e){return p.default.join(p.default.dirname(e),`session-attachments`)}function vR(e,t){lR&&(console.log(`[native-watch][gateway]`,e,t),dR?.info({event:e,...t},`native session watch debug`))}function yR(e){return e?typeof e==`string`?e:e.toString(`utf8`):``}function bR(e){return{sessionId:e.sessionId,projectId:e.projectId??null,purpose:e.purpose??null,detailLevel:e.detailLevel??null,bootstrapMode:e.bootstrapMode??null,cursorKind:e.cursor.kind,rawSeq:e.cursor.kind===`raw_seq`?e.cursor.rawSeq:null}}async function xR(e){let t=e.limit??300,n=e.detailLevel??`full`,r=(r,i)=>{vM(`raw-events.list`,{requestSource:e.requestSource,projectId:e.projectId,sessionId:e.sessionId,limit:t,detailLevel:n,requestedCursor:e.fromRawSeqExclusive??null,decision:r.decision,reason:r.reason,fromRawSeqExclusive:r.fromRawSeqExclusive??null,toRawSeq:r.toRawSeq??null,returnedCount:r.events.length,returnedFirstRawSeq:r.events[0]?.rawSeq??null,returnedLastRawSeq:r.events[r.events.length-1]?.rawSeq??null,...i})};if(e.fromRawSeqExclusive===void 0){let i=await e.sessionManager.getProjectSessionRawEvents(e.projectId,e.sessionId,t),a={decision:`snapshot`,reason:i.length===0?`empty_history_snapshot`:`initial_snapshot`,toRawSeq:i[i.length-1]?.rawSeq,events:xD(i,n)};return r(a),a}let i=await e.sessionManager.getProjectSessionRawSeqRange(e.projectId,e.sessionId);if(!i){let e={decision:`snapshot`,reason:`empty_history_snapshot`,events:[]};return r(e,{rangeMin:null,rangeMax:null,minExpectedCursor:null}),e}let a=Math.max(0,i.min-1);if(e.fromRawSeqExclusive<a||e.fromRawSeqExclusive>i.max){let o=await e.sessionManager.getProjectSessionRawEvents(e.projectId,e.sessionId,t),s={decision:`snapshot`,reason:`cursor_out_of_range`,toRawSeq:o[o.length-1]?.rawSeq,events:xD(o,n)};return r(s,{rangeMin:i.min,rangeMax:i.max,minExpectedCursor:a}),s}let o=await e.sessionManager.getProjectSessionRawEventsSinceSeq(e.projectId,e.sessionId,e.fromRawSeqExclusive,t),s={decision:`delta`,reason:`cursor_valid_delta`,fromRawSeqExclusive:e.fromRawSeqExclusive,toRawSeq:o[o.length-1]?.rawSeq??e.fromRawSeqExclusive,events:xD(o,n)};return r(s,{rangeMin:i.min,rangeMax:i.max,minExpectedCursor:a}),s}async function SR(e,t={}){await F_(e.gatewayLogPath);let n=wR(e,t),r=CR(e,n.instance);_M(r.log),dR=r.log,await r.register(bT.default,{origin:!0}),await r.register(xT.default,pR),await r.register(yT.default,{options:fR});let i=process.env.NODE_ENV!==`production`,a=4e3,o=`[unserializable payload]`,s=new XT(e);await s.init();let c=new oE(e.auditLogPath),l=new WL,u=new KE,d=new UD(e.projectStoreDir),f=new qF(e.sessionHistoryDir,{logDebug:vM});await f.init();let m=sR({logger:r.log}),h=new rM(p.default.join(e.sessionHistoryDir,`discovery-v1`));await h.init();let g=new Wj({store:h});await g.init();let _,v=null,y=new Map,b=await fh(e.authStoreDir),x=new tR(e),S=e.relayEnabled?Ng({relayUrl:e.relayUrl,gatewayHost:e.host}):``,C=e=>{let t=y.get(e);t&&(clearTimeout(t.timeout),y.delete(e),t.resolve())},w=(e,t)=>{let n=y.get(e);n&&(clearTimeout(n.timeout),y.delete(e),n.reject(t instanceof Error?t:Error(String(t))))},T=(e,t)=>new Promise((n,r)=>{w(e,Error(`Duplicate pending relay file upload start for request ${e}`));let i=setTimeout(()=>{y.delete(e),r(Error(`Relay file upload start timed out for request ${e}`))},t);y.set(e,{resolve:n,reject:r,timeout:i})}),E=new kP({preferNativeProviders:e.enableNativeProviders,requireNativeCodex:e.requireNativeCodex,auditLogger:c,projectStore:d,historyStore:f,logger:r.log,attachmentStoreDir:_R(e.sessionHistoryDir),runtimeLifecycle:{idleTtlMs:e.runtimeIdleTtlMs,sweepIntervalMs:e.runtimeSweepIntervalMs,maxSessions:e.runtimeMaxSessions,maxCodexSessions:e.runtimeMaxCodexSessions,maxClaudeSessions:e.runtimeMaxClaudeSessions},onEnvelope:e=>{l.routeProviderRaw(e),O.routeReadableLiveDelta(e)}}),D=new rR({fsService:u,sessionManager:E,previewTicketService:x}),O=new zL(l,E,e.readableLiveDeltaCoalesceMs,vM),k=new qL({sessionManager:E,logger:r.log,sendStreamMessage:(e,t)=>{l.sendStreamMessage(e,t)},createExternalUpdateMessage:e=>YI(e),refreshDetailSessionSnapshots:e=>O.refreshDetailSessionSnapshots(e)});E.warmStartupProviderCapabilities().catch(e=>{r.log.warn({err:e},`startup provider capability warmup failed`)});let A=new Hg({packageName:z.packageName,currentVersion:z.version,sessionHub:l,logger:r.log,consoleWrite:e=>{console.log(e)},getRunningSessionCount:async()=>E.getRunningRuntimeSessionCount(),requestPreparedUpdate:t.onUpdatePrepared});r.addHook(`onClose`,async()=>{r.log.info({hasRelayClient:!!v},`gateway shutdown starting`);try{O.shutdown(),k.close(),m.stop(),v?.close(),N.close(),await A.shutdown(),await E.shutdown(),await f.shutdown();for(let[e,t]of y.entries())clearTimeout(t.timeout),t.reject(Error(`Gateway shutting down`)),y.delete(e);r.log.info(`gateway shutdown completed`)}catch(e){throw r.log.error({err:e},`gateway shutdown failed`),e}finally{_M(null),dR=null,n.close()}}),i&&r.addHook(`onSend`,async(e,t,n)=>(r.log.info({method:e.method,url:e.url,statusCode:t.statusCode,responseBody:R(n)},`gateway response (dev)`),n)),r.get(`/health`,async()=>({ok:!0,service:`desktop-gateway`,now:new Date().toISOString(),wsClients:l.count(),gatewayName:e.name,machineName:vh(),gatewayIdentity:b.identity})),r.get(`/api/pairing/descriptor`,async()=>Tg({gatewayId:e.gatewayId,gatewayName:e.name,machineName:vh(),relayBaseUrl:S,directBaseUrls:jg({protocol:e.httpsEnabled?`https`:`http`,host:e.host,port:e.httpsEnabled?e.httpsPort:e.port}),relayTransportSecurityLevel:e.relayEnabled?e.relayTransportSecurityLevel:void 0,gatewayIdentity:b.identity})),r.post(`/api/pairing/start`,async(t,n)=>{if(!L(t))return n.code(401).send({error:`Unauthorized`});try{let t=await s.createPairingCode(e.pairingCodeTtlSeconds);return await c.record({ts:new Date().toISOString(),action:`pairing.start`,detail:{expiresAt:t.expiresAt,source:`api`,ttlSeconds:e.pairingCodeTtlSeconds}}),t}catch(e){return r.log.error({err:e},`failed to generate pairing code via API`),n.code(500).send({error:`Failed to generate pairing code`,detail:String(e)})}}),r.post(`/api/pairing/claim`,async(t,n)=>{let r=ru.safeParse(t.body);if(!r.success)return n.code(400).send({error:`Invalid request`,detail:r.error.flatten()});try{let t=he(r.data.deviceName),n=await s.claimPairingCode(r.data.code,t,r.data.deviceIdentity);return await c.record({ts:new Date().toISOString(),action:`pairing.claim`,deviceId:n.deviceId,detail:{deviceName:t}}),NI(b,{...n,gatewayName:e.name,machineName:vh()},r.data.code,r.data.deviceIdentity)}catch(e){return n.code(400).send({error:String(e)})}}),r.post(`/api/auth/refresh`,async(e,t)=>{let n=ou.safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await OI({authService:s,execute:()=>s.refreshAccessToken(n.data.refreshToken),logger:r.log,refreshToken:n.data.refreshToken,source:`direct_http`})}catch(e){return t.code(401).send({error:String(e)})}});let j=()=>rf.parse({name:e.name,machineName:vh()}),M=async n=>{let r=rf.pick({name:!0}).parse(n);if(!t.configPath)throw Error(`Gateway config path is unavailable`);return e.name=await Nh(t.configPath,r.name),j()};r.get(`/api/gateway/settings`,async(e,t)=>{if(ne(e,t))return j()}),r.post(`/api/gateway/settings`,async(e,t)=>{if(!ne(e,t))return;let n=rf.pick({name:!0}).safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await M(n.data)}catch(e){return t.code(500).send({error:String(e)})}}),r.get(`/api/projects`,async(e,t)=>{if(ne(e,t))return{projects:await E.listProjects()}}),r.get(`/api/gateway/update`,async(e,t)=>{if(ne(e,t))try{return await A.getOrCheckInfo(`mobile`)}catch(e){return t.code(500).send({error:String(e)})}}),r.post(`/api/gateway/update/check`,async(e,t)=>{if(!ne(e,t))return;let n=e.body,r=Bd.safeParse(n?.requestedBy);try{return await A.checkForUpdates(r.success?r.data:`mobile`)}catch(e){return t.code(500).send({error:String(e)})}}),r.post(`/api/gateway/update/apply`,async(e,t)=>{if(!ne(e,t))return;let n=e.body,r=Bd.safeParse(n?.requestedBy);try{let e=await A.applyUpdate(r.success?r.data:`mobile`);return Gd.parse(e)}catch(e){let n=String(e),r=n.includes(`already up to date`)||n.includes(`does not support self-update`)||n.includes(`requires idle runtime`)?409:500;return t.code(r).send({error:n})}}),r.post(`/api/codex/app-server/restart`,async(e,t)=>{if(ne(e,t))try{return gu.parse(await E.restartCodexAppServer())}catch(e){let n=kT(e)?e.status:500;return t.code(n).send({error:String(e)})}}),r.get(`/api/codex/accounts`,async(e,t)=>{if(ne(e,t))try{return fu.parse(await E.getCodexAccounts())}catch(e){return re(t,e)}}),r.post(`/api/codex/accounts/save`,async(e,t)=>{if(ne(e,t))try{return pu.parse(await E.saveCurrentCodexAccount())}catch(e){return re(t,e)}}),r.post(`/api/codex/accounts/switch`,async(e,t)=>{if(!ne(e,t))return;let n=e.body;if(typeof n?.accountId!=`string`||!n.accountId.trim())return t.code(400).send({error:`accountId is required and must be a non-empty string`});try{return mu.parse(await E.switchCodexAccount(n.accountId))}catch(e){return re(t,e)}}),r.post(`/api/codex/accounts/delete`,async(e,t)=>{if(!ne(e,t))return;let n=e.body;if(typeof n?.accountId!=`string`||!n.accountId.trim())return t.code(400).send({error:`accountId is required and must be a non-empty string`});try{return hu.parse(await E.deleteSavedCodexAccount(n.accountId))}catch(e){return re(t,e)}}),r.get(`/api/discovery/projects`,async(e,t)=>{if(ne(e,t))try{return await g.getProjects()}catch(e){return t.code(500).send({error:String(e)})}}),r.post(`/api/discovery/projects/refresh`,async(e,t)=>{if(ne(e,t))try{return await g.refreshProjects()}catch(e){return t.code(500).send({error:String(e)})}}),r.get(`/api/discovery/projects/sessions`,async(e,t)=>{if(!ne(e,t))return;let n=e.query;if(typeof n.projectPath!=`string`||!n.projectPath.trim())return t.code(400).send({error:`projectPath is required and must be a non-empty string`});try{return await g.listProjectSessions(n.projectPath)}catch(e){let n=e instanceof Error?e.message:String(e);return kT(e)&&e.code===`DISCOVERED_PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):zI(n)?t.code(400).send({error:n}):t.code(500).send({error:n})}}),r.get(`/api/workspace/directories`,async(e,t)=>{if(!ne(e,t))return;let n=e.query,r=Number(n.limit??200),i=Number.isFinite(r)?Math.min(500,Math.max(1,r)):200;try{return await u.listDirectoriesUnrestricted(typeof n.path==`string`?n.path:void 0,i)}catch(e){return t.code(400).send({error:String(e)})}}),r.post(`/api/workspace/directories`,async(e,t)=>{if(!ne(e,t))return;let n=e.body;if(typeof n?.path!=`string`||!n.path.trim())return t.code(400).send({error:`path is required and must be a non-empty string`});if(typeof n.name!=`string`||!n.name.trim())return t.code(400).send({error:`name is required and must be a non-empty string`});try{return await u.createDirectoryUnrestricted(n.path,n.name,200)}catch(e){return t.code(400).send({error:String(e)})}}),r.get(`/api/workspace/entries`,async(e,t)=>{if(!ne(e,t))return;let n=e.query,r=Number(n.limit??200),i=Number.isFinite(r)?Math.min(500,Math.max(1,r)):200;try{let t=ie(e.query);return await D.listEntries(t,i)}catch(e){return re(t,e)}}),r.get(`/api/workspace/files/resolve`,async(e,t)=>{if(ne(e,t))try{let t=ae(e.query);return await D.resolveFile(t)}catch(e){return re(t,e)}}),r.get(`/api/workspace/files/text`,async(e,t)=>{if(!ne(e,t))return;let n=e.query,r=n.startLine?Number(n.startLine):void 0,i=n.maxLines?Number(n.maxLines):void 0,a=n.maxBytes?Number(n.maxBytes):void 0;try{let t=ae(e.query);return await D.readTextFile(t,{startLine:typeof r==`number`&&Number.isFinite(r)?r:void 0,maxLines:typeof i==`number`&&Number.isFinite(i)?i:void 0,maxBytes:typeof a==`number`&&Number.isFinite(a)?a:void 0})}catch(e){return re(t,e)}}),r.post(`/api/workspace/files/preview`,async(e,t)=>{let n=ne(e,t);if(!n)return;let r=e.body,i=Ja.safeParse(r?.locator);if(!i.success)return t.code(400).send({error:i.error.issues[0]?.message??`Invalid workspace file locator`});let a;if(r?.disposition!==void 0){let e=io.safeParse(r.disposition);if(!e.success)return t.code(400).send({error:e.error.issues[0]?.message??`Invalid preview disposition`});a=e.data}try{return await D.preparePreview(i.data,{deviceId:n.sub,disposition:a,buildPreviewUrl:t=>`${oe(e)}/api/workspace/files/content/${encodeURIComponent(t)}`})}catch(e){return re(t,e)}}),r.route({method:[`GET`,`HEAD`],url:`/api/workspace/files/content/:ticket`,handler:async(e,t)=>{let n=e.params.ticket?.trim()??``;if(!n)return t.code(400).send({error:`ticket is required`});try{let r=await D.readPreviewContent(n,{rangeHeader:typeof e.headers.range==`string`?e.headers.range:void 0,includeBody:e.method!==`HEAD`});return t.code(r.statusCode),t.header(`Content-Type`,r.headers.contentType),t.header(`Content-Disposition`,r.headers.contentDisposition),t.header(`Content-Length`,String(r.headers.contentLength)),t.header(`ETag`,r.headers.etag),t.header(`Cache-Control`,r.headers.cacheControl),r.headers.acceptRanges&&t.header(`Accept-Ranges`,r.headers.acceptRanges),r.headers.contentRange&&t.header(`Content-Range`,r.headers.contentRange),r.headers.lastModified&&t.header(`Last-Modified`,r.headers.lastModified),e.method===`HEAD`||!r.body?t.send():t.send(r.body)}catch(e){return re(t,e)}}}),r.get(`/api/providers/:provider/capabilities`,async(e,t)=>{if(!ne(e,t))return;let n=le(e,t);if(n)try{return{capabilities:await E.getProviderCapabilities(n.provider,n.projectId,n.agentVersion)}}catch(e){return kT(e)&&e.code===`PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):t.code(400).send({error:String(e)})}}),r.post(`/api/providers/:provider/execution-defaults`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=Pa.safeParse(n.provider);if(!r.success)return t.code(400).send({error:`Invalid provider`});let i=Ha.safeParse({...e.body&&typeof e.body==`object`&&!Array.isArray(e.body)?e.body:{},provider:r.data});if(!i.success)return t.code(400).send({error:i.error.message});try{return{defaults:await E.updateProviderExecutionDefaults(i.data)}}catch(e){return t.code(400).send({error:String(e)})}}),r.get(`/api/agents/:provider/config`,async(e,t)=>{if(!ne(e,t))return;let n=le(e,t);if(n)try{return await E.getAgentConfig(n.provider,{projectId:n.projectId,agentVersion:n.agentVersion})}catch(e){return kT(e)&&e.code===`PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):t.code(400).send({error:String(e)})}}),r.post(`/api/projects`,async(e,t)=>{if(!ne(e,t))return;let n=e.body;if(typeof n.path!=`string`||!n.path.trim())return t.code(400).send({error:`path is required and must be a non-empty string`});try{return{project:await E.createProject({path:n.path,title:typeof n.title==`string`?n.title:void 0})}}catch(e){return t.code(400).send({error:String(e)})}}),r.delete(`/api/projects/:projectId`,async(e,t)=>{if(!ne(e,t))return;let n=e.params;try{return await E.deleteProject(n.projectId)?{removed:!0}:t.code(404).send({error:`Project not found`})}catch(e){return t.code(409).send({error:String(e)})}}),r.get(`/api/projects/:projectId/sessions`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=e.query,i=se(r.status,t);if(!i)return;let a=ce(r.syncExternal);try{return{sessions:await E.listProjectSessions(n.projectId,i,{syncExternal:a})}}catch(e){return kT(e)&&e.code===`PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):t.code(500).send({error:String(e)})}}),r.get(`/api/projects/:projectId/sessions/:sessionId`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=await E.getProjectSessionSummary(n.projectId,n.sessionId);return r?{session:r}:t.code(404).send({error:`Session not found`})}),r.get(`/api/projects/:projectId/sessions/:sessionId/config`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=await E.getProjectSessionConfig(n.projectId,n.sessionId);return r?{session:r}:t.code(404).send({error:`Session not found`})}),r.post(`/api/projects/:projectId/sessions/:sessionId/history-sync`,async(e,t)=>{if(!ne(e,t))return;let n=e.params;try{let e=await E.syncProjectSessionHistory(n.projectId,n.sessionId);return e.historyUpdated&&await O.refreshDetailSessionSnapshots({projectId:n.projectId,sessionId:n.sessionId,reason:`explicit_history_sync`,refreshMode:e.refreshMode,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}),{session:e.session,rawEventCount:e.rawEvents.length,historyUpdated:e.historyUpdated,statusChanged:e.statusChanged,refreshMode:e.refreshMode,...e.fromRawSeq===void 0?{}:{fromRawSeq:e.fromRawSeq},...e.toRawSeq===void 0?{}:{toRawSeq:e.toRawSeq}}}catch(e){return kT(e)&&(e.code===`PROJECT_NOT_FOUND`||e.code===`PROJECT_SESSION_NOT_FOUND`)?t.code(e.status).send({error:String(e)}):t.code(500).send({error:String(e)})}}),r.get(`/api/projects/:projectId/sessions/:sessionId/events`,async(e,t)=>t.code(410).send({error:`Session events endpoint is deprecated. Use /api/projects/:projectId/sessions/:sessionId/raw-events`})),r.get(`/api/projects/:projectId/sessions/:sessionId/raw-events`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=e.query,i=(typeof r.limit==`string`?r.limit.trim().toLowerCase():``)===`all`?2**53-1:(()=>{let e=Number(r.limit??300);return Number.isFinite(e)?Math.min(2e3,Math.max(1,e)):300})(),a=typeof r.fromRawSeqExclusive==`string`?Number(r.fromRawSeqExclusive):void 0,o=rl.safeParse(r.detailLevel).success?rl.parse(r.detailLevel):`full`;try{return await ee(n.projectId,n.sessionId,i,typeof a==`number`&&Number.isFinite(a)?Math.max(0,Math.floor(a)):void 0,o,`http`)}catch(e){return kT(e)&&(e.code===`PROJECT_NOT_FOUND`||e.code===`PROJECT_SESSION_NOT_FOUND`)?t.code(e.status).send({error:String(e)}):t.code(500).send({error:String(e)})}}),r.get(`/api/projects/:projectId/sessions/:sessionId/readable-items/:itemId`,async(e,t)=>{if(!ne(e,t))return;let n=e.params;try{return await EI({sessionManager:E,readableItemDetailLookup:O,projectId:n.projectId,sessionId:n.sessionId,itemId:n.itemId})||t.code(404).send({error:`Readable item not found`})}catch(e){return kT(e)&&(e.code===`PROJECT_NOT_FOUND`||e.code===`PROJECT_SESSION_NOT_FOUND`)?t.code(e.status).send({error:String(e)}):t.code(500).send({error:String(e)})}}),r.get(`/api/projects/:projectId/fs/tree`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=e.query,i=await E.getProject(n.projectId);if(!i)return t.code(404).send({error:`Project not found`});try{return await u.listTree(i.path,r.path??`.`)}catch(e){return t.code(400).send({error:String(e)})}}),r.get(`/api/sessions`,async(e,t)=>t.code(410).send({error:`Use /api/projects/:projectId/sessions`})),r.get(`/api/sessions/:sessionId`,async(e,t)=>t.code(410).send({error:`Use /api/projects/:projectId/sessions/:sessionId`})),r.get(`/api/sessions/:sessionId/events`,async(e,t)=>t.code(410).send({error:`Use /api/projects/:projectId/sessions/:sessionId/raw-events`})),r.get(`/api/fs/tree`,async(e,t)=>t.code(410).send({error:`Use /api/projects/:projectId/fs/tree`})),r.get(`/api/devices`,async(e,t)=>L(e)?{devices:s.listDevices()}:t.code(401).send({error:`Unauthorized`})),r.post(`/api/devices/:deviceId/revoke`,async(e,t)=>{if(!L(e))return t.code(401).send({error:`Unauthorized`});let n=e.params;return await s.revokeDevice(n.deviceId)?(await c.record({ts:new Date().toISOString(),action:`device.revoke`,deviceId:n.deviceId}),{revoked:!0}):t.code(404).send({error:`Device not found`})}),r.get(`/ws`,{websocket:!0},(e,t)=>{let n=ue(t.headers.authorization)??de(t.url);if(!n){e.close(1008,`Missing access token`);return}let i;try{i=s.verifyAccessToken(n)}catch(t){e.close(1008,`Unauthorized: ${String(t)}`);return}let a=l.addClient(i.sub,e);e.on(`message`,async e=>{let t=e.toString(),n;try{let e=JSON.parse(t);e&&typeof e==`object`&&(n=e),await F(_l(e),i.sub,a)}catch(e){await I({deviceId:i.sub,clientId:a,rawCommand:gR(n,t),parsedInput:n,error:e})}}),e.on(`close`,(e,t)=>{let n=l.getSubscriptions(a),o=k.getClientWatchTargets(a);r.log.info({clientId:a,deviceId:i.sub,transport:`direct`,closeCode:typeof e==`number`?e:null,closeReason:yR(t),streamSubscriptionCount:n.length,streamSubscriptions:n.map(bR),externalWatchTargetCount:o.length,externalWatchTargets:o},`gateway websocket client disconnected`),k.removeClient(a),l.removeClient(a),O.clearStatesForClient(a)})});let N=new xM({gatewayId:e.gatewayId,relayTransportSecurityLevel:e.relayEnabled?e.relayTransportSecurityLevel:`plaintext-relay`,gatewayIdentity:b.identity,gatewayIdentityPrivateKeyPem:b.privateKeyPem,sessionHub:l,logger:r.log,describeClientState:e=>{let t=l.getSubscriptions(e),n=k.getClientWatchTargets(e);return{streamSubscriptionCount:t.length,streamSubscriptions:t.map(bR),externalWatchTargetCount:n.length,externalWatchTargets:n}},handlePairingClaim:async t=>{let n=he(t.deviceName);return NI(b,{...await s.claimPairingCode(t.code,n,t.deviceIdentity),gatewayName:e.name,machineName:vh()},t.code,t.deviceIdentity)},handleRefresh:async t=>{let n=await OI({authService:s,execute:()=>s.refreshAccessToken(t.refreshToken),logger:r.log,refreshToken:t.refreshToken,requestedDeviceId:t.deviceId,source:`relay_http_forward`});return DI(t.deviceId,n.deviceId),{gatewayId:e.gatewayId,...n}},handleFileContentRequest:async(e,t)=>{if(t.method===`GET`&&t.responseMode===`stream_upload`){let n=await D.openPreviewContentStream(t.ticket,{rangeHeader:t.rangeHeader,includeBody:!0});if(n.bodyStream&&t.uploadUrl&&t.uploadToken){let i=T(e,15e3),a=ER({uploadUrl:t.uploadUrl,uploadToken:t.uploadToken,contentLength:n.headers.contentLength,bodyStream:n.bodyStream});a.completed.catch(n=>{w(e,n),r.log.warn({err:n,requestId:e,ticket:t.ticket},`relay workspace preview upload failed`)});try{await i}catch(e){throw a.abort(e),e}}return ep.parse({status:n.statusCode,headers:n.headers,...n.bodyStream?{bodyTransport:`stream_upload`}:{}})}let n=await D.readPreviewContent(t.ticket,{rangeHeader:t.rangeHeader,includeBody:t.method===`GET`});return ep.parse({status:n.statusCode,headers:n.headers,...n.body?{bodyBase64:n.body.toString(`base64`)}:{}})},verifyDeviceIdentityBinding:async(e,t)=>s.verifyDeviceIdentityBinding(e,t),handleRpcRequest:async(t,n)=>FI(t,{gatewayId:e.gatewayId,relayPreviewBaseUrl:S,authService:s,logger:r.log,sessionManager:E,projectDiscoveryService:g,fsService:u,workspaceFileService:D,updateService:A,gatewaySettings:{get:j,update:M},relayDeviceId:n.deviceId,readableItemDetailLookup:O,refreshDetailSessionSnapshots:e=>O.refreshDetailSessionSnapshots(e),buildRawEventsListResult:xR}),handleFileContentUploadStarted:C,sendFrame:e=>v?.send(e)??!1,dispatchCommand:async(e,t,n)=>{try{await F(e,t,n)}catch(r){await I({deviceId:t,clientId:n,rawCommand:gR(e,JSON.stringify(e)),parsedInput:e,error:r})}}}),P=async(e,t,n)=>{switch(e.type){case`session.start`:{let r=await E.startSession({...e.payload,deviceId:t});l.sendSystemMessage(n,{type:`command.ack`,commandType:e.type,commandId:e.commandId,payload:r});return}case`turn.input`:await E.sendInput(e.payload.sessionId,e.payload.text,t,{model:e.payload.model,sessionConfig:e.payload.sessionConfig,mode:e.payload.mode,config:e.payload.config,attachments:e.payload.attachments,commandId:e.commandId});return;case`review.start`:await E.startReview(e.payload.sessionId,e.payload.config,t,{input:e.payload.input,turnConfig:e.payload.turnConfig});return;case`tool.approval.respond`:await E.respondToolPermission(e.payload.sessionId,e.payload.requestId,e.payload.decision,e.payload.reason,t);return;case`user.input.respond`:await E.respondUserInput(e.payload.sessionId,e.payload.requestId,e.payload.answers,t);return;case`session.interrupt`:await E.interruptSession(e.payload.sessionId,t);return;case`session.close`:throw Error(`session.close is deprecated. Use session.interrupt instead.`);case`session.external.watch.set`:{vR(`command.received`,{clientId:n,deviceId:t,replace:e.payload.replace,sessionCount:e.payload.sessions.length,sessions:e.payload.sessions}),r.log.info({clientId:n,deviceId:t,replace:e.payload.replace,sessionCount:e.payload.sessions.length,sessions:e.payload.sessions},`received session.external.watch.set`);let i=k.setClientWatchTargets(n,e.payload.sessions,e.payload.replace);vR(`command.applied`,{clientId:n,deviceId:t,replace:e.payload.replace,requestedSessionCount:e.payload.sessions.length,targetCount:i.length,targets:i}),r.log.info({clientId:n,deviceId:t,replace:e.payload.replace,requestedSessionCount:e.payload.sessions.length,targetCount:i.length,targets:i},`applied session.external.watch.set`),l.sendSystemMessage(n,{type:`command.ack`,commandType:e.type,commandId:e.commandId,payload:{replace:e.payload.replace,sessions:i.map(e=>e.sessionId)}});return}case`session.stream.subscribe`:{let t=cR(e.payload.sessions);await O.handleSessionStreamSubscribeCommand(n,t,e.payload.replace),l.sendSystemMessage(n,{type:`command.ack`,commandType:e.type,commandId:e.commandId,payload:{replace:e.payload.replace,sessions:t.map(e=>e.sessionId)}});return}case`fs.read`:{let t=E.getSessionExecutionContext(e.payload.sessionId),n=await u.readFile(t.projectPath,e.payload.path);await E.emitExternalEvent({provider:t.provider,sessionId:e.payload.sessionId,projectId:t.projectId,type:`file.changed`,raw:{path:n.path,content:n.content}});return}case`fs.diff`:{let t=E.getSessionExecutionContext(e.payload.sessionId),n=await u.diffFile(t.projectPath,e.payload.path,e.payload.baseContent??``);await E.emitExternalEvent({provider:t.provider,sessionId:e.payload.sessionId,projectId:t.projectId,type:`file.diff.ready`,raw:{path:n.path,diff:n.diff,currentContent:n.currentContent}});return}default:{let t=e;throw Error(`Unhandled command: ${JSON.stringify(t)}`)}}},F=async(e,t,n)=>{await P(e,t,n)},I=async e=>{r.log.warn({deviceId:e.deviceId,rawCommand:e.rawCommand,err:e.error},`ws command failed`);let t=typeof e.parsedInput?.commandId==`string`?e.parsedInput.commandId:void 0,n=typeof e.parsedInput?.type==`string`?e.parsedInput.type:void 0;l.sendSystemMessage(e.clientId,{type:`command.error`,commandId:t,commandType:n,message:String(e.error)}),await E.emitExternalEvent({provider:`codex`,sessionId:`system`,type:`error.runtime`,raw:{message:String(e.error),source:`ws.command`}})},ee=async(e,t,n=300,r,i=`full`,a=`http`)=>xR({sessionManager:E,projectId:e,sessionId:t,limit:n,fromRawSeqExclusive:r,detailLevel:i,requestSource:a}),L=t=>t.headers[`x-api-key`]===e.apiKey,R=e=>{if(e==null)return e;if(typeof e==`string`){let t=B(e);return t===void 0?V(e,a):U(H(t))}if(Buffer.isBuffer(e)){let t=e.toString(`utf8`),n=B(t);return n===void 0?V(t,a):U(H(n))}return typeof e==`object`?U(H(e)):String(e)},B=e=>{try{return JSON.parse(e)}catch{return}},V=(e,t)=>e.length<=t?e:`${e.slice(0,t)}...<truncated>`,H=e=>{if(Array.isArray(e))return e.map(e=>H(e));if(e&&typeof e==`object`){let t=e,n={};for(let[e,r]of Object.entries(t)){let t=e.toLowerCase();t.includes(`token`)||t.includes(`secret`)||t.includes(`password`)||t.includes(`authorization`)?n[e]=`[REDACTED]`:n[e]=H(r)}return n}return e},U=e=>{let t=te(e);return t===o?t:t.length<=a?e:{truncated:!0,preview:V(t,a)}},te=e=>{try{return JSON.stringify(e,(e,t)=>typeof t==`bigint`?t.toString():t)}catch{return o}},ne=(e,t)=>{let n=ue(e.headers.authorization);if(!n)return t.code(401).send({error:`Missing bearer token`}),null;try{return s.verifyAccessToken(n)}catch(e){return t.code(401).send({error:String(e)}),null}},re=(e,t)=>{let n=kT(t)?t.status:500;return kT(t)?e.code(n).send({error:String(t),code:t.code,...t.details===void 0?{}:{details:t.details}}):e.code(n).send({error:String(t)})},ie=e=>{let t=e&&typeof e==`object`?e:{},n=Ya.safeParse({kind:typeof t.locatorKind==`string`?t.locatorKind:void 0,projectId:typeof t.projectId==`string`?t.projectId:void 0,path:typeof t.path==`string`?t.path:void 0});if(!n.success)throw Error(n.error.issues[0]?.message??`Invalid workspace entries locator`);return n.data},ae=e=>{let t=e&&typeof e==`object`?e:{},n=Ja.safeParse({kind:typeof t.locatorKind==`string`?t.locatorKind:void 0,sessionId:typeof t.sessionId==`string`?t.sessionId:void 0,projectId:typeof t.projectId==`string`?t.projectId:void 0,path:typeof t.path==`string`?t.path:void 0});if(!n.success)throw Error(n.error.issues[0]?.message??`Invalid workspace file locator`);return n.data},oe=t=>{let n=t.headers.host?.trim();return n?`${t.protocol}://${n}`.replace(/\/+$/,``):`${e.httpsEnabled?`https`:`http`}://${e.host}:${e.httpsEnabled?e.httpsPort:e.port}`},se=(e,t)=>{let n=e??`all`;return[`running`,`idle`,`all`].includes(n)?n:(t.code(400).send({error:`Invalid status filter`}),null)},ce=e=>{let t=e?.trim().toLowerCase();return t===`true`||t===`1`},le=(e,t)=>{let n=e.params,r=e.query,i=Pa.safeParse(n.provider);return i.success?{provider:i.data,projectId:typeof r.projectId==`string`?r.projectId:void 0,agentVersion:typeof r.agentVersion==`string`?r.agentVersion:void 0}:(t.code(400).send({error:`Invalid provider`}),null)},ue=e=>{if(!e)return null;let[t,n]=e.split(` `);return t?.toLowerCase()!==`bearer`||!n?null:n},de=e=>{try{return new URL(e,`http://localhost`).searchParams.get(`token`)}catch{return null}},fe=e.httpsEnabled?e.httpsPort:e.port,pe=e.httpsEnabled?`https`:`http`,me=vh(),he=e=>e?.trim()||`Craby mobile`;await r.listen({host:e.host,port:fe});let ge=r.server.address(),_e=typeof ge==`object`&&ge?ge.port:fe;if(r.log.info({host:e.host,port:_e,protocol:pe,machineName:me},TR(pe,e.host,_e)),e.relayEnabled&&(v=new FM({gatewayId:e.gatewayId,machineName:e.name,relayUrl:e.relayUrl,relayTransportSecurityLevel:e.relayTransportSecurityLevel,relayGatewayAccessToken:e.relayGatewayAccessToken,resolveRelayGatewayAccessToken:e.relayGatewayAccessToken.trim()?void 0:()=>BM({gatewayId:e.gatewayId,relayUrl:e.relayUrl,gatewayIdentity:b.identity,privateKeyPem:b.privateKeyPem}),gatewayIdentity:b.identity,directBaseUrls:jg({protocol:pe,host:e.host,port:_e}),logger:r.log,onFrame:async e=>{await N.handleFrame(e)}}),v.start()),e.bootstrapPairingCodeOnStart)try{let t=await s.createPairingCode(e.pairingCodeTtlSeconds);_={code:t.code,expiresAt:t.expiresAt},await c.record({ts:new Date().toISOString(),action:`pairing.start`,detail:{expiresAt:t.expiresAt,source:`startup`,ttlSeconds:e.pairingCodeTtlSeconds}}),r.log.info({expiresAt:t.expiresAt},`startup pairing code generated`)}catch(e){r.log.error({err:e},`failed to generate startup pairing code`)}return await A.start(),{protocol:pe,listenPort:_e,gatewayName:e.name,machineName:me,gatewayIdentity:b.identity,close:()=>r.close(),getGatewayUpdateInfo:()=>A.getInfo(),requestGatewayUpdate:(e=`console`)=>A.applyUpdate(e),requestCodexAppServerRestart:async(e=`console`)=>E.restartCodexAppServer(),startupPairingCode:_}}function CR(e,t){let n=t;if(!e.httpsEnabled)return(0,ST.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:mR}});if(!e.tlsKeyPath||!e.tlsCertPath)throw Error(`TLS key/cert path is required when HTTPS is enabled.`);let r={key:(0,u.readFileSync)(e.tlsKeyPath),cert:(0,u.readFileSync)(e.tlsCertPath),...e.tlsCaPath?{ca:(0,u.readFileSync)(e.tlsCaPath)}:{}};return(0,ST.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:mR},https:r})}function wR(e,t){let n=process.env.NODE_ENV!==`production`,r=CT.default.destination({dest:e.gatewayLogPath,mkdir:!0,sync:!1}),i=t.logToConsole?CT.default.multistream([{stream:r},{stream:process.stdout}]):r;return{instance:(0,CT.default)({level:n?`debug`:`info`},i),close:()=>{try{r.flushSync()}catch{}r.end()}}}function TR(e,t,n){return`desktop-gateway listening on ${e}://${t}:${n}`}function ER(e){let t=new URL(e.uploadUrl),n=t.protocol===`https:`?S.request:t.protocol===`http:`?x.request:null;if(!n)throw Error(`Unsupported relay preview upload protocol: ${t.protocol}`);let r=null,i=e=>{};return{completed:new Promise((a,o)=>{let s=!1,c=t=>{if(s)return;if(s=!0,!t){a();return}let n=t instanceof Error?t:Error(String(t));e.bodyStream.destroy(n),r?.destroy(n),o(n)};r=n(t,{method:`PUT`,headers:{"content-type":`application/octet-stream`,"content-length":String(e.contentLength),"x-relay-upload-token":e.uploadToken}},e=>{let t=[];e.on(`data`,e=>{t.push(Buffer.isBuffer(e)?e:Buffer.from(e))}),e.on(`error`,c),e.on(`end`,()=>{let n=e.statusCode??0;if(n>=200&&n<300){c();return}c(Error(`Relay preview upload failed (${n}): ${Buffer.concat(t).toString(`utf8`)}`))})}),i=e=>{c(e??Error(`Relay preview upload aborted`))},r.on(`error`,c),(0,C.pipeline)(e.bodyStream,r).catch(c)}),abort:i}}function DR(e){return e instanceof Error?e.stack??`${e.name}: ${e.message}`:(0,b.inspect)(e,{depth:6,breakLength:120})}async function OR(e){let t=await kh({configPath:e.configPath,ensureConfigFile:!0});Ph(t.config);let n=await SR(t.config,{configPath:t.configPath,logToConsole:e.logToConsole,onUpdatePrepared:async e=>{AR({type:`worker.update.prepared`,payload:e})}});AR({type:`worker.ready`,payload:kR(n)});let r=null,i=e=>r||(r=Promise.resolve(n.close?.()).catch(e=>{console.error(`[gateway] worker shutdown failed: ${String(e)}`)}).finally(()=>{process.exit(e)}),r);process.on(`message`,e=>{let t=jR(e);if(t)switch(t.type){case`supervisor.request`:a(t);return;case`supervisor.shutdown`:i(0);return}}),process.on(`disconnect`,()=>{i(0)}),process.on(`SIGINT`,()=>{i(0)}),process.on(`SIGTERM`,()=>{i(0)}),process.on(`uncaughtException`,e=>{console.error(`[gateway] worker uncaught exception: ${DR(e)}`),i(1)}),process.on(`unhandledRejection`,e=>{console.error(`[gateway] worker unhandled rejection: ${DR(e)}`),i(1)});async function a(e){try{switch(e.method){case`gateway.update.apply`:{if(!n.requestGatewayUpdate)throw Error(`gateway update is unavailable`);let t=await n.requestGatewayUpdate(e.requestedBy);AR({type:`worker.response`,id:e.id,method:e.method,ok:!0,result:t});return}case`codex.appServer.restart`:{if(!n.requestCodexAppServerRestart)throw Error(`codex app-server restart is unavailable`);let t=await n.requestCodexAppServerRestart(e.requestedBy);AR({type:`worker.response`,id:e.id,method:e.method,ok:!0,result:t});return}}}catch(t){AR({type:`worker.response`,id:e.id,method:e.method,ok:!1,error:String(t)})}}await new Promise(()=>{})}function kR(e){return{protocol:e.protocol,listenPort:e.listenPort,gatewayName:e.gatewayName,machineName:e.machineName,gatewayIdentity:e.gatewayIdentity,startupPairingCode:e.startupPairingCode}}function AR(e){process.send&&process.send(e)}function jR(e){if(!MR(e)||typeof e.type!=`string`)return null;switch(e.type){case`supervisor.shutdown`:return e.reason!==`signal`&&e.reason!==`update`&&e.reason!==`restart`?null:{type:`supervisor.shutdown`,reason:e.reason};case`supervisor.request`:return typeof e.id!=`string`||e.method!==`gateway.update.apply`&&e.method!==`codex.appServer.restart`||e.requestedBy!==`console`&&e.requestedBy!==`mobile`&&e.requestedBy!==`system`?null:{type:`supervisor.request`,id:e.id,method:e.method,requestedBy:e.requestedBy};default:return null}}function MR(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}NR(process.argv.slice(2)).catch(e=>{console.error(String(e)),process.exit(1)});async function NR(e){let t=B(e);switch(t.command){case`help`:RR();return;case`version`:console.log(z.version);return;case`init`:await FR(t);return;case`doctor`:await IR(t);return;case`start`:await PR(t);return;case`__worker`:await LR(t);return;default:{let e=t.command;throw Error(`Unsupported command: ${e}`)}}}async function PR(e){let t=await kh({configPath:e.configPath,ensureConfigFile:!0});Ph(t.config);let n=await $h({configPath:t.configPath,configExists:t.configExists,config:t.config});try{await __({args:e,loaded:t,doctorReport:n})}catch(e){throw Error(I_(e,t.config))}eg(n)&&console.warn(`[doctor] startup continued despite bundled runtime check failures.`)}async function FR(e){let t=await Oh({configPath:e.configPath,overwrite:e.force});t.created?console.log(`[gateway] wrote config to ${t.configPath}`):(console.log(`[gateway] config already exists at ${t.configPath}`),console.log(`[gateway] rerun with --force to overwrite`));let n=await kh({configPath:t.configPath,ensureConfigFile:!1}),r=await $h({configPath:n.configPath,configExists:n.configExists,config:n.config});console.log(tg(r))}async function IR(e){let t=await kh({configPath:Dh(e.configPath),ensureConfigFile:!1,syncGatewayIdentityConfig:!1}),n=await $h({configPath:t.configPath,configExists:t.configExists,config:t.configExists?t.config:void 0});console.log(tg(n)),eg(n)&&(process.exitCode=1)}async function LR(e){try{await OR(e)}catch(t){let n=await kh({configPath:e.configPath,ensureConfigFile:!0});throw Error(I_(t,n.config))}}function RR(){console.log(`${z.cliName} ${z.version}`),console.log(``),console.log(`Usage:`),console.log(` ${z.cliName} [start] [--config <path>] [--log]`),console.log(` ${z.cliName} init [--config <path>] [--force]`),console.log(` ${z.cliName} doctor [--config <path>]`),console.log(` ${z.cliName} --version`)}exports.runCli=NR;
527
+ `)}function qN(e,t){let n=e.provider===`codex`?e.codex:void 0;if(!n)throw Error(`Codex review config is required`);let r=n.target,i=r.type===`baseBranch`?`Please review the code changes against the base branch ${r.branch}.`:r.type===`commit`?`Please review the code changes introduced by commit ${YN(r.sha,r.title)}.`:r.type===`custom`?r.instructions:`Please review my uncommitted changes.`,a=XN(t);return a?`${i}\n\nAdditional review instructions:\n${a}`:i}function JN(e){return e.type===`baseBranch`?`Review the code changes against the base branch ${e.branch} and provide prioritized, actionable findings.`:e.type===`commit`?`Review the code changes introduced by commit ${YN(e.sha,e.title)} and provide prioritized, actionable findings.`:e.type===`custom`?`Review the requested code changes and provide prioritized, actionable findings.`:`Review the current code changes (staged, unstaged, and untracked files) and provide prioritized, actionable findings.`}function YN(e,t){let n=XN(t);return n?`${e} (${JSON.stringify(n)})`:e}function XN(e){return e?.trim()||void 0}async function ZN(e){let t=e.attachments??[];if(t.length===0)return{attachments:[],totalSizeBytes:0};if(t.length>5)throw Error(`Too many image attachments; maximum is 5`);let n=p.default.join(e.rootDir,eP(e.sessionId),eP(e.commandId??`turn_${DT(10)}`));await d.default.mkdir(n,{recursive:!0,mode:448});let r=0,i=[];for(let[e,a]of t.entries()){if(a.kind!==`image`)continue;let t=Buffer.from(a.dataBase64,`base64`);if(t.length===0)throw Error(`Image attachment is empty`);if(t.length>8388608)throw Error(`Image attachment exceeds 8388608 bytes`);if(r+=t.length,r>20971520)throw Error(`Image attachments exceed 20971520 bytes in total`);if(!$N(t,a.mimeType))throw Error(`Image attachment MIME/content mismatch: ${a.mimeType}`);let o=QN(a.mimeType),s=(0,l.createHash)(`sha256`).update(t).digest(`hex`).slice(0,16),c=`${String(e+1).padStart(2,`0`)}-${s}.${o}`,u=p.default.join(n,c);await d.default.writeFile(u,t,{mode:384}),i.push({id:a.id,kind:`image`,mimeType:a.mimeType,localPath:u,fileName:a.fileName,width:a.width,height:a.height,sizeBytes:t.length,dataBase64:a.dataBase64})}return{attachments:i,totalSizeBytes:r}}function QN(e){return e===`image/jpeg`?`jpg`:e===`image/webp`?`webp`:`png`}function $N(e,t){return t===`image/png`?e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10:t===`image/jpeg`?e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255:e.length>=12&&e.toString(`ascii`,0,4)===`RIFF`&&e.toString(`ascii`,8,12)===`WEBP`}function eP(e){return e.replace(/[^a-zA-Z0-9._-]+/g,`_`).slice(0,80)||`unknown`}const tP=Symbol(`dispatchRollbackHandled`),nP=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;function rP(e){return e.lastHydratedExternalUpdatedAt||e.updatedAt||e.createdAt}function iP(e,t){if(!t||e.status===`running`)return!0;if(t.interactionLockReason===`external_turn_running`)return!1;let n=e.updatedAt||e.createdAt,r=t.updatedAt||t.createdAt;return e.status===t.status?!1:n>=r}function aP(e){return e.historyUpdated||e.externallyRunning||e.observedUpdatedAt.localeCompare(e.session.updatedAt)<0?e.observedUpdatedAt:e.session.updatedAt}function oP(e){if(e.historyUpdated||e.externallyRunning)return e.observedUpdatedAt;let t=e.session.lastHydratedExternalUpdatedAt??e.session.updatedAt;return e.observedUpdatedAt.localeCompare(t)<0?e.observedUpdatedAt:t}function sP(e,t){nP&&(!e.startsWith(`config.get`)&&!e.startsWith(`raw-events`)&&!e.startsWith(`sync-external`)&&!e.endsWith(`.error`)||console.log(`[session-fetch][gateway] ${e}`,t))}function cP(e){return e?{sessionFound:!0,sessionId:e.id,nativeSessionId:e.nativeSessionId??null,sessionSource:e.source??null,sessionModel:e.model??null,sessionUpdatedAt:e.updatedAt,sessionActiveStartedAt:e.activeStartedAt??null,sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt??null,sessionTurnConfigModel:e.sessionTurnConfig?.model??null,sessionTurnConfigReasoningEffort:e.sessionTurnConfig?.reasoningEffort??null,sessionTurnConfigApprovalPolicy:e.sessionTurnConfig?.execution?.codex?.approvalPolicy??null,sessionTurnConfigSandboxMode:e.sessionTurnConfig?.execution?.codex?.sandboxMode??null,lastHydratedExternalUpdatedAt:e.lastHydratedExternalUpdatedAt??null,lastHydratedExternalConfigFreshnessAt:e.lastHydratedExternalConfigFreshnessAt??null,codexExternalConfigHydrationVersion:e.codexExternalConfigHydrationVersion??null}:{sessionFound:!1}}function lP(e,t,n,r){let i=KM(e,n);if(!t)return dP(e,i,r);let a=KM(e,t);return dP(e,{mode:i.mode??a.mode,model:i.model===void 0?a.model:i.model,reasoningEffort:i.reasoningEffort===void 0?a.reasoningEffort:i.reasoningEffort},r)}function uP(e){return e.observedModel===void 0?e.observedSessionTurnConfig?.model===void 0?e.currentModel:dN(e.observedSessionTurnConfig.model??void 0):dN(e.observedModel)}function dP(e,t,n){let r=KM(e,t);return{mode:r.mode,model:r.model,reasoningEffort:e===`claude`&&n?.preserveReasoningEffort===!1?null:r.reasoningEffort}}function fP(e){return e.provider!==`claude`||e.source===`gateway`}function pP(e){return!e||e.provider!==`claude`||e.source===`gateway`||!e.sessionTurnConfig?e:{...e,sessionTurnConfig:dP(`claude`,e.sessionTurnConfig,{preserveReasoningEffort:!1})}}function mP(e,t){return hP(e)?{status:`running`}:t?{status:`running`,interactionLockReason:`external_turn_running`}:{status:`idle`}}function hP(e){return!!(e&&(e.status===`running`||e.dispatchInFlight))}function gP(e){return e.status===`active`?!0:e.turns.some(e=>e.status===`inProgress`||e.status===`in_progress`)}function _P(e,t){if(!t)return gP(e);for(let n of e.turns)if(!(n.status!==`inProgress`&&n.status!==`in_progress`)&&!t.terminalTurnStatusById.has(n.id))return!0;return!1}function vP(e){return e.startsWith(`sess_`)}function yP(e){return e.source===`native_discovered`?!0:e.providerMode===`native`&&(e.provider===`codex`||e.provider===`claude`)}function bP(e){return e.nativeSessionId?.trim()??``?!0:e.provider===`codex`&&!vP(e.id)}function xP(e){return vP(e.id)?e.nativeSessionId??e.id:e.id}function SP(e){return e.provider!==`codex`&&e.provider!==`claude`||e.providerMode!==`native`?!1:bP(e)}function CP(e){return e instanceof Error&&/^Session .+ is closed$/i.test(e.message)}function wP(e,t){if(e.provider!==`codex`||t.type!==`error.runtime`)return!1;if(KF(t.source)?.startsWith(`codex.app_server`))return!0;let n=KF(t.message)??``;return/\bclosed\b/i.test(n)}function TP(e,t){return t.type===`error.runtime`?!0:e.provider===`claude`&&t.type===`error`}function EP(e){if(e&&(typeof e==`object`||typeof e==`function`))try{return Object.defineProperty(e,tP,{value:!0,configurable:!0}),e}catch{}let t=Error(e instanceof Error?e.message:String(e));return Object.defineProperty(t,tP,{value:!0,configurable:!0}),Object.defineProperty(t,`cause`,{value:e,configurable:!0}),t}function DP(e){return!!(e&&(typeof e==`object`||typeof e==`function`)&&tP in e)}function OP(e){return DP(e)&&e&&(typeof e==`object`||typeof e==`function`)&&`cause`in e&&e.cause!==void 0?e.cause:e}const kP={idleTtlMs:900*1e3,sweepIntervalMs:60*1e3,maxSessions:24,maxCodexSessions:8,maxClaudeSessions:16};function AP(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(1,Math.trunc(n)):t}function jP(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(0,Math.trunc(n)):t}var MP=class{sessions=new Map;providerCapabilities;codexAccounts;nextRawSeqBySession=new Map;preparingRuntimeDispatches=new Set;queuedInterruptsBeforeDispatch=new Set;runtimeLifecycle;attachmentStoreDir;sweepTimer;lastRawEnvelopeTimestampMs=0;shuttingDown=!1;constructor(e){if(this.options=e,this.providerCapabilities=new vN({preferNativeProviders:e.preferNativeProviders,projectStore:e.projectStore,logger:e.logger,providerExecutionPreferencesDir:e.providerExecutionPreferencesDir}),this.codexAccounts=e.codexAccountService??new CN,this.attachmentStoreDir=e.attachmentStoreDir??p.default.join(f.default.tmpdir(),`craby-session-attachments`),this.runtimeLifecycle={idleTtlMs:AP(e.runtimeLifecycle?.idleTtlMs,kP.idleTtlMs),sweepIntervalMs:jP(e.runtimeLifecycle?.sweepIntervalMs,kP.sweepIntervalMs),maxSessions:AP(e.runtimeLifecycle?.maxSessions,kP.maxSessions),maxCodexSessions:AP(e.runtimeLifecycle?.maxCodexSessions,kP.maxCodexSessions),maxClaudeSessions:AP(e.runtimeLifecycle?.maxClaudeSessions,kP.maxClaudeSessions)},this.runtimeLifecycle.sweepIntervalMs<=0){this.sweepTimer=null;return}this.sweepTimer=setInterval(()=>{this.sweepRuntimeSessions().catch(e=>{console.error(`[session-runtime] sweep failed: ${String(e)}`)})},this.runtimeLifecycle.sweepIntervalMs),this.sweepTimer.unref?.()}async shutdown(){this.shuttingDown=!0,this.sweepTimer&&clearInterval(this.sweepTimer);let e=[...this.sessions.keys()];this.options.logger?.info?.({sessionCount:e.length,sessionIds:e},`session manager shutdown starting`),await Promise.allSettled(e.map(e=>this.closeRuntimeSession(e,`shutdown`))),await DO(),this.options.logger?.info?.({sessionCount:e.length,sessionIds:e},`session manager shutdown completed`)}async listProjects(){let e=await this.options.projectStore.list(),t=this.buildProjectStatsMap();return e.map(e=>this.attachProjectStats(e,t))}async createProject(e){let t=await this.options.projectStore.upsertByPath(e.path,e.title);return this.attachProjectStats(t,this.buildProjectStatsMap())}async deleteProject(e){if(this.listProjectSessionsWithRuntime(e,`running`).length>0)throw VT(e);return this.options.projectStore.remove(e)}async restartCodexAppServer(){let e=this.getRunningRuntimeSessionCount();if(e>0)throw HT(e);let t=[...this.sessions.values()].filter(e=>e.provider===`codex`).map(e=>e.id);return await Promise.allSettled(t.map(e=>this.closeRuntimeSession(e,`codex_restart`))),await OO(),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`codex.app_server.restart`,detail:{closedRuntimeSessionCount:t.length}}),{restarted:!0,closedRuntimeSessionCount:t.length}}async getCodexAccounts(){return this.codexAccounts.getAccountsOverview()}async saveCurrentCodexAccount(){let e=await this.codexAccounts.saveCurrentAccount();return await this.options.auditLogger.record({ts:new Date().toISOString(),action:`codex.account.save`,detail:{currentAccountId:e.current?.accountId??null,savedAccountCount:e.savedAccounts.length}}),{saved:!0,accounts:e}}async switchCodexAccount(e){let t=await this.codexAccounts.getCurrentAccount();if(t?.accountId===e)return{switched:!0,closedRuntimeSessionCount:0,accounts:t.accountType===`chatgpt`?await this.codexAccounts.saveCurrentAccount():await this.codexAccounts.getAccountsOverview()};let n=this.getRunningRuntimeSessionCount();if(n>0)throw HT(n);let r=[...this.sessions.values()].filter(e=>e.provider===`codex`).map(e=>e.id);await Promise.allSettled(r.map(e=>this.closeRuntimeSession(e,`codex_restart`))),t?.accountType===`chatgpt`&&await this.codexAccounts.saveCurrentAccount(),await DO();let i=null;try{i=await this.codexAccounts.applySavedAccount(e),await OO()}catch(e){if(i?.previousRawContent)try{await this.codexAccounts.restoreCurrentAuthFile(i.previousRawContent),await OO()}catch{}throw e}let a=await this.codexAccounts.getAccountsOverview();return await this.options.auditLogger.record({ts:new Date().toISOString(),action:`codex.account.switch`,detail:{previousAccountId:t?.accountId??null,nextAccountId:a.current?.accountId??e,closedRuntimeSessionCount:r.length}}),{switched:!0,closedRuntimeSessionCount:r.length,accounts:a}}async deleteSavedCodexAccount(e){let t=await this.codexAccounts.deleteSavedAccount(e);return await this.options.auditLogger.record({ts:new Date().toISOString(),action:`codex.account.delete`,detail:{deletedAccountId:e,currentAccountId:t.current?.accountId??null,savedAccountCount:t.savedAccounts.length}}),{deleted:!0,accounts:t}}async getProject(e){return this.options.projectStore.getById(e)}getRunningRuntimeSessionCount(){let e=0;for(let t of this.sessions.values())t.status===`running`&&(e+=1);return e}buildProjectStatsMap(){let e=new Map,t=this.listAllSessionsWithRuntime(`all`);for(let n of t){let t=e.get(n.projectId)??{runningCount:0,idleCount:0,totalCount:0,lastSessionAt:void 0};n.status===`running`?t.runningCount+=1:t.idleCount+=1,t.totalCount+=1;let r=n.updatedAt||n.createdAt;(!t.lastSessionAt||r>t.lastSessionAt)&&(t.lastSessionAt=r),e.set(n.projectId,t)}return e}attachProjectStats(e,t){let n=t.get(e.id),r=n?.idleCount??0;return{...e,lastSessionAt:n?.lastSessionAt,runningCount:n?.runningCount??0,idleCount:r,totalCount:n?.totalCount??0,endedCount:r}}async getProviderCapabilities(e,t,n){return this.providerCapabilities.getProviderCapabilities(e,t,n)}async getAgentConfig(e,t){return this.providerCapabilities.getAgentConfig(e,t)}async updateProviderExecutionDefaults(e){return this.providerCapabilities.updateProviderExecutionDefaults(e)}async warmStartupProviderCapabilities(){if(!this.shuttingDown)return this.providerCapabilities.warmStartupProviderCapabilities()}async getProviderDefaults(e,t,n){return this.providerCapabilities.getProviderDefaults(e,t,n)}async resolveCodexAppServerTransport(e){if(e.provider===`codex`)return(await this.getProviderCapabilities(`codex`,e.projectId)).defaults.codexAppServerTransport}async listProjectSessions(e,t=`all`,n){let r=await this.options.projectStore.getById(e);if(!r)throw LT(e);if(n?.syncExternal){let e=Date.now(),n=this.options.historyStore.listProjectSessions(r.id,`all`).length;this.options.logger?.info?.({projectId:r.id,projectPath:r.path,requestedStatus:t,sessionCountBeforeSync:n},`project external session sync started`);let[i,a]=await Promise.all([this.syncCodexSessionsForProject(r),this.syncClaudeSessionsForProject(r)]);this.options.logger?.info?.({projectId:r.id,projectPath:r.path,requestedStatus:t,sessionCountBeforeSync:n,sessionCountAfterSync:this.options.historyStore.listProjectSessions(r.id,`all`).length,totalDurationMs:Date.now()-e,codexSync:i,claudeSync:a},`project external session sync completed`)}return this.listProjectSessionsWithRuntime(e,t)}async getProjectSessionSummary(e,t){let n=this.options.historyStore.getProjectSession(e,t);return this.getRuntimeSessionSummary(e,t,n)||pP(n)}isGatewayOwnedRuntimeLive(e,t){let n=this.sessions.get(t);if(n&&n.projectId===e&&hP(n))return!0;if(!this.preparingRuntimeDispatches.has(t))return!1;let r=this.options.historyStore.getProjectSession(e,t);return!!(r&&r.source===`gateway`&&r.providerMode===`native`)}async getProjectSessionConfig(e,t){let n=this.options.historyStore.getProjectSession(e,t),r=this.getRuntimeSessionSummary(e,t,n);if(sP(`config.get.begin`,{projectId:e,sessionId:t,shouldHydrate:n?this.shouldHydrateCodexExternalSessionConfig(n):!1,persisted:cP(n),runtime:cP(r)}),r)return sP(`config.get.result`,{projectId:e,sessionId:t,resultSource:`runtime`,...cP(r)}),r;let i=n?.provider===`codex`?await this.maybeHydrateCodexExternalSessionConfig(n):pP(n);return sP(`config.get.result`,{projectId:e,sessionId:t,resultSource:i===n?`persisted`:`hydrated`,...cP(i)}),i}async syncProjectSessionHistory(e,t){let n=await this.options.projectStore.getById(e);if(!n)throw LT(e);let r=this.options.historyStore.getProjectSession(e,t);if(!r&&this.options.preferNativeProviders&&(await this.syncCodexSessionsForProject(n),await this.syncClaudeSessionsForProject(n),r=this.options.historyStore.getProjectSession(e,t)),!r)throw RT(e,t);let i=Date.now(),a=Date.now(),o=await this.options.historyStore.getSessionRawEvents(r.id,2**53-1),s=Date.now()-a,c=Date.now(),l=await this.options.historyStore.getSessionStoredRawEvents(r.id,2**53-1),u=Date.now()-c,d=Date.now(),f=await this.syncExternalRawHistory(r,e,o,l),p=Date.now()-d,m=f.session??this.options.historyStore.getProjectSession(e,r.id)??r,h=Date.now(),g=TF(o,f.rawEvents),_=Date.now()-h;sP(`sync-external.classify`,wF({projectId:e,sessionId:t,session:m,previousEvents:o,nextEvents:f.rawEvents,classification:g})),sP(`sync-external.timing`,{projectId:e,sessionId:t,provider:m.provider,source:m.source,providerMode:m.providerMode,localEventCount:o.length,localStoredEventCount:l.length,nextEventCount:f.rawEvents.length,historyUpdated:g.historyUpdated,refreshMode:g.refreshMode,fromRawSeq:g.fromRawSeq??null,toRawSeq:g.toRawSeq??null,localEventsDurationMs:s,localStoredEventsDurationMs:u,externalSyncDurationMs:p,classifyDurationMs:_,totalDurationMs:Date.now()-i});let v=m.status!==r.status||(m.interactionLockReason??``)!==(r.interactionLockReason??``);return{session:m,rawEvents:f.rawEvents,historyUpdated:g.historyUpdated,statusChanged:v,refreshMode:g.refreshMode,fromRawSeq:g.fromRawSeq,toRawSeq:g.toRawSeq,nativeWatchPath:f.nativeWatchPath}}async getProjectSessionRawEvents(e,t,n=300){return(await this.getProjectSessionRawEventsWithCoverage(e,t,n)).rawEvents}async getProjectSessionRawEventsWithCoverage(e,t,n=300){let r=Date.now();if(!await this.options.projectStore.getById(e))throw LT(e);let i=0,a=0,o,s=(s,c)=>{sP(`raw-events.read`,{projectId:e,sessionId:t,limit:n,provider:o?.provider,source:o?.source,providerMode:o?.providerMode,localReadDurationMs:i,finalCount:a,outcome:s,totalDurationMs:Date.now()-r,...c})},c=this.options.historyStore.getProjectSession(e,t);if(!c&&this.getRuntimeSessionSummary(e,t))return s(`runtime_session_empty`),{rawEvents:[],coveredToRawSeq:null};if(!c)throw RT(e,t);o=c;let l=Date.now(),u=await this.options.historyStore.getSessionRawEventsWithCoverage(c.id,Math.max(n,300)),d=u.rawEvents.slice(-Math.max(1,n));return i=Date.now()-l,a=d.length,s(`local_only_cached`,{localEventCount:u.rawEvents.length,coveredToRawSeq:u.coveredToRawSeq}),{rawEvents:d,coveredToRawSeq:u.coveredToRawSeq}}async getProjectSessionRawEventsCompacted(e,t,n=300){return(await this.getProjectSessionRawEventsCompactedWithCoverage(e,t,n)).rawEvents}async getProjectSessionRawEventsCompactedWithCoverage(e,t,n=300){let r=await this.resolveProjectSessionForRawRead(e,t);return this.options.historyStore.getSessionRawEventsCompactedWithCoverage(r.id,n)}async getProjectSessionRawEventsSinceSeq(e,t,n,r=2e3){let i=await this.resolveProjectSessionForRawRead(e,t);return this.options.historyStore.getSessionRawEventsSinceSeq(i.id,n,r)}async getProjectSessionRawSeqRange(e,t){let n=await this.resolveProjectSessionForRawRead(e,t);return this.options.historyStore.getSessionRawSeqRange(n.id)}async resolveProjectSessionForRawRead(e,t){if(!await this.options.projectStore.getById(e))throw LT(e);let n=this.options.historyStore.getProjectSession(e,t);if(n||=this.getRuntimeSessionSummary(e,t),!n)throw RT(e,t);return n}async startSession(e){let t=await this.resolveProjectForSessionStart(e.projectId,e.cwd),n=`sess_${DT(10)}`,r=e.provider===`codex`&&this.options.requireNativeCodex,i=$A(e.provider,{preferNative:this.options.preferNativeProviders,requireNative:r}),a=await this.getProviderDefaults(e.provider,t.id),o=await this.resolveCodexAppServerTransport({provider:e.provider,projectId:t.id}),s=e.sessionTurnConfig?KM(e.provider,e.sessionTurnConfig):JM({provider:e.provider,legacyModel:e.model,legacySessionConfig:e.sessionConfig}),c=YM({provider:e.provider,providerDefaults:a,currentSessionTurnConfig:s}),l=dP(e.provider,s),u=await i.createSession({sessionId:n,model:c.model,cwd:t.path,sessionConfig:c.sessionConfig,codexAppServerTransport:o,metadata:e.metadata,logger:this.options.logger});if(r&&u.providerMode!==`native`)throw await u.close(),Error(`Native Codex provider is required, but adapter fell back to mock. Check ENABLE_NATIVE_PROVIDERS and Codex app-server availability.`);let d=this.resolveCanonicalSessionId(e.provider,u,n),f=this.resolveNativeSessionId(e.provider,u,d),p=new Date().toISOString(),m=await this.attachRuntimeSession({id:d,nativeSessionId:f,source:`gateway`,projectId:t.id,projectPath:t.path,provider:e.provider,providerMode:u.providerMode,model:c.model,title:void 0,sessionTurnConfig:l,sessionTurnConfigUpdatedAt:p,createdAt:p,updatedAt:p,activeStartedAt:void 0,status:`idle`,providerSession:u,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!1,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return this.markSessionStreamReady(m),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.start`,deviceId:e.deviceId,sessionId:m.id,detail:{provider:e.provider,model:c.model,sessionConfig:e.sessionConfig,sessionTurnConfig:l,codexAppServerTransport:o,projectId:t.id,projectPath:t.path}}),{sessionId:m.id,projectId:t.id}}async sendInput(e,t,n,r){let i=t??``,a=r?.attachments??[];if(!i.trim()&&a.length===0)throw Error(`turn.input requires text or image attachments`);let o=this.options.historyStore.getSession(e),s=this.sessions.get(e);if(s?.dispatchInFlight)throw BT(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!s&&this.preparingRuntimeDispatches.has(e))throw BT(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(o?.interactionLockReason===`external_turn_running`)throw BT(e,`an external native turn is still running`,{reason:`external_turn_running`,status:o.status,interactionLockReason:o.interactionLockReason,provider:o.provider,providerMode:o.providerMode});if(s?.status===`running`)throw BT(e,`the current turn is still running`,{reason:`runtime_running`,provider:s.provider,providerMode:s.providerMode});if(!s&&o?.status===`running`&&yP(o))throw BT(e,`the native session is still running`,{reason:`persisted_running`,status:o.status,provider:o.provider,providerMode:o.providerMode,source:o.source});let c=!s,l=s,u=!1,d=!1,f=!1;try{if(c&&this.preparingRuntimeDispatches.add(e),l=s??await this.resumeSessionFromHistory(e),!l)throw zT(e);let t=await this.getProviderDefaults(l.provider,l.projectId),o=YM({provider:l.provider,providerDefaults:t,currentSessionTurnConfig:l.sessionTurnConfig,legacyModel:r?.model,legacySessionConfig:r?.sessionConfig,mode:r?.mode,config:r?.config});if(l.dispatchInFlight=!0,this.touchSession(l),a.length>0&&(await this.getProviderCapabilities(l.provider,l.projectId,o.model)).support.imageInput!==!0)throw Error(`${l.provider} does not support image input`);let p=await ZN({rootDir:this.attachmentStoreDir,sessionId:e,commandId:r?.commandId,attachments:a}),m={text:i,attachments:p.attachments};if(await this.options.auditLogger.record({ts:new Date().toISOString(),action:`turn.input`,deviceId:n,sessionId:e,detail:{text:i,attachments:p.attachments.map(e=>({id:e.id,kind:e.kind,mimeType:e.mimeType,fileName:e.fileName,width:e.width,height:e.height,sizeBytes:e.sizeBytes})),attachmentCount:p.attachments.length,attachmentTotalSizeBytes:p.totalSizeBytes,model:o.model,sessionConfig:r?.sessionConfig,mode:o.mode,config:r?.config,resolvedSessionConfig:o.sessionConfig}}),this.consumeQueuedInterruptBeforeDispatch(e)||(await this.persistGatewayOwnedDispatchStart(l),f=!0,this.consumeQueuedInterruptBeforeDispatch(e)))throw u=!0,this.createInterruptedBeforeDispatchError(e);if(l=await this.sendInputWithRuntimeRecovery(e,l,m,{model:o.model,sessionConfig:o.sessionConfig,mode:o.mode}),d=!0,!l.title){let e=WF(i)??(p.attachments.length>0?`图片消息`:void 0);e&&this.setSessionTitle(l,e)}let h=new Date().toISOString();l.sessionTurnConfig=dP(l.provider,o.sessionTurnConfig),l.sessionTurnConfigUpdatedAt=h,o.model&&l.model!==o.model&&(l.model=o.model),l.updatedAt=h,await this.persistSessionSnapshot(l)}catch(e){throw!DP(e)&&!d&&f&&l&&await this.restoreUnacceptedGatewayOwnedDispatch(l),OP(e)}finally{c&&this.preparingRuntimeDispatches.delete(e),this.queuedInterruptsBeforeDispatch.delete(e);let t=!1;u&&c&&l&&(await this.closeRuntimeSession(l.id,`dispatch_cancelled`,{suppressAudit:!0}),t=!0),!t&&l&&(l.dispatchInFlight=!1,this.touchSession(l))}}async startReview(e,t,n,r){let i=this.options.historyStore.getSession(e),a=this.sessions.get(e);if(a?.dispatchInFlight)throw BT(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!a&&this.preparingRuntimeDispatches.has(e))throw BT(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(i?.interactionLockReason===`external_turn_running`)throw BT(e,`an external native turn is still running`,{reason:`external_turn_running`,status:i.status,interactionLockReason:i.interactionLockReason,provider:i.provider,providerMode:i.providerMode});if(a?.status===`running`)throw BT(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&yP(i))throw BT(e,`the native session is still running`,{reason:`persisted_running`,status:i.status,provider:i.provider,providerMode:i.providerMode,source:i.source});let o=!a,s=a,c=!1,l=!1,u=!1;try{if(o&&this.preparingRuntimeDispatches.add(e),s=a??await this.resumeSessionFromHistory(e),!s)throw zT(e);if(s.provider!==t.provider)throw Error(`Review provider mismatch for session ${e}`);if(t.provider!==`codex`||!t.codex)throw Error(`Only Codex review is currently supported`);let i=await this.getProviderDefaults(s.provider,s.projectId),d=YM({provider:s.provider,providerDefaults:i,currentSessionTurnConfig:s.sessionTurnConfig,config:r?.turnConfig});if(s.dispatchInFlight=!0,this.touchSession(s),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`review.start`,deviceId:n,sessionId:e,detail:{input:r?.input,config:t,turnConfig:r?.turnConfig,resolvedModel:d.model,resolvedSessionConfig:d.sessionConfig}}),this.consumeQueuedInterruptBeforeDispatch(e)||(await this.persistGatewayOwnedDispatchStart(s),u=!0,this.consumeQueuedInterruptBeforeDispatch(e)))throw c=!0,this.createInterruptedBeforeDispatchError(e);let f=KN(t,r?.input);if(s=await this.sendInputWithRuntimeRecovery(e,s,f,{model:d.model,sessionConfig:d.sessionConfig}),l=!0,!s.title){let e=GF(t,r?.input);e&&this.setSessionTitle(s,e)}let p=new Date().toISOString();s.sessionTurnConfig=dP(s.provider,d.sessionTurnConfig),s.sessionTurnConfigUpdatedAt=p,d.model&&s.model!==d.model&&(s.model=d.model),s.updatedAt=p,await this.persistSessionSnapshot(s)}catch(e){throw!DP(e)&&!l&&u&&s&&await this.restoreUnacceptedGatewayOwnedDispatch(s),OP(e)}finally{o&&this.preparingRuntimeDispatches.delete(e),this.queuedInterruptsBeforeDispatch.delete(e);let t=!1;c&&o&&s&&(await this.closeRuntimeSession(s.id,`dispatch_cancelled`,{suppressAudit:!0}),t=!0),!t&&s&&(s.dispatchInFlight=!1,this.touchSession(s))}}async sendInputWithRuntimeRecovery(e,t,n,r){try{return await t.providerSession.sendInput(n,r),t}catch(i){if(!CP(i))throw i;let a=i;this.options.logger?.warn?.({sessionId:e,runtimeSessionId:t.id,nativeSessionId:t.nativeSessionId,provider:t.provider,providerMode:t.providerMode,projectId:t.projectId,projectPath:t.projectPath,model:t.model,error:a.message},`provider runtime session sendInput hit closed session; resuming from history`),await this.closeRuntimeSession(t.id,`provider_error`,{suppressAudit:!0});let o=await this.resumeSessionFromHistory(e);if(!o)throw a;o.dispatchInFlight=!0,await this.persistGatewayOwnedDispatchStart(o);try{await o.providerSession.sendInput(n,r)}catch(e){throw await this.restoreUnacceptedGatewayOwnedDispatch(o),EP(e)}return o}}async respondToolPermission(e,t,n,r,i){let a=this.mustGetSession(e);if(!a.pendingToolApprovals.has(t))throw Error(`Unknown tool approval request: ${t}`);if(typeof a.providerSession.respondToolPermission!=`function`){a.pendingToolApprovals.delete(t),a.updatedAt=new Date().toISOString(),await this.persistSessionSnapshot(a);return}await a.providerSession.respondToolPermission(t,n,r),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`tool.approval.respond`,deviceId:i,sessionId:e,detail:{requestId:t,decision:n,reason:r}})}async respondUserInput(e,t,n,r){let i=this.mustGetSession(e);if(!i.pendingUserInputs.has(t))throw Error(`Unknown user input request: ${t}`);if(typeof i.providerSession.respondUserInput!=`function`){i.pendingUserInputs.delete(t),i.updatedAt=new Date().toISOString(),await this.persistSessionSnapshot(i);return}await i.providerSession.respondUserInput(t,n),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`user.input.respond`,deviceId:r,sessionId:e,detail:{requestId:t,answeredCount:qF(n)}})}async interruptSession(e,t){let n=this.sessions.get(e),r=this.preparingRuntimeDispatches.has(e)||!!n?.dispatchInFlight;r&&this.queuedInterruptsBeforeDispatch.add(e),n&&await n.providerSession.interrupt(),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.interrupt`,deviceId:t,sessionId:e,detail:{runtimeSessionFound:!!n,queuedBeforeDispatch:r}})}async closeSession(e){throw Error(`session.close is deprecated. Use session.interrupt instead.`)}getSessionExecutionContext(e){let t=this.sessions.get(e);if(t)return{provider:t.provider,projectId:t.projectId,projectPath:t.projectPath};let n=this.options.historyStore.getSession(e);if(!n)throw zT(e);return{provider:n.provider,projectId:n.projectId,projectPath:n.projectPath}}async emitExternalEvent(e){let t=this.options.historyStore.getSession(e.sessionId),n={v:`1.0`,kind:`provider.raw`,rawSeq:await this.nextRawSeq(e.sessionId),provider:e.provider,sessionId:e.sessionId,projectId:e.projectId??t?.projectId,eventId:`raw_${DT(12)}`,ts:this.nextRawEnvelopeTimestamp(),type:e.type,payload:{raw:{...e.raw,type:e.type}}};this.options.onEnvelope(n),this.options.historyStore.appendRawEvent(n).catch(e=>{console.error(`[session-history] append raw event failed: ${String(e)}`)})}async resumeSessionFromHistory(e){let t=this.options.historyStore.getSession(e);if(!t)return;let n=t.provider===`codex`&&this.options.requireNativeCodex,r=$A(t.provider,{preferNative:this.options.preferNativeProviders,requireNative:n}),i=await this.getProviderDefaults(t.provider,t.projectId),a=dP(t.provider,t.sessionTurnConfig,{preserveReasoningEffort:fP(t)}),o=YM({provider:t.provider,providerDefaults:i,currentSessionTurnConfig:a}),s=t.provider===`claude`?xP(t):t.nativeSessionId??t.id,c=await this.resolveCodexAppServerTransport({provider:t.provider,projectId:t.projectId}),l=await r.createSession({sessionId:t.id,model:o.model??t.model,cwd:t.projectPath,resumeSessionId:s,sessionConfig:o.sessionConfig,codexAppServerTransport:c,metadata:{resumeFromHistory:!0,codexAppServerTransport:c},logger:this.options.logger});if(n&&l.providerMode!==`native`)throw await l.close(),Error(`Native Codex provider is required, but adapter fell back to mock. Check ENABLE_NATIVE_PROVIDERS and Codex app-server availability.`);let u=this.resolveCanonicalSessionId(t.provider,l,t.id),d=this.resolveNativeSessionId(t.provider,l,t.nativeSessionId),f=await this.attachRuntimeSession({id:u,nativeSessionId:d,source:t.source??`gateway`,projectId:t.projectId,projectPath:t.projectPath,provider:t.provider,providerMode:l.providerMode,model:o.model??t.model,title:t.title,sessionTurnConfig:a,sessionTurnConfigUpdatedAt:t.sessionTurnConfigUpdatedAt,createdAt:t.createdAt,updatedAt:t.updatedAt||new Date().toISOString(),activeStartedAt:t.activeStartedAt,status:`idle`,providerSession:l,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!0,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return await this.persistSessionSnapshot(f),f}consumeQueuedInterruptBeforeDispatch(e){return this.queuedInterruptsBeforeDispatch.delete(e)}createInterruptedBeforeDispatchError(e){return BT(e,`the pending turn was interrupted before provider dispatch started`,{reason:`interrupt_requested_before_dispatch`})}async syncCodexSessionsForProject(e){let t=Date.now();if(!this.options.preferNativeProviders)return{provider:`codex`,status:`disabled`,discoveredCount:0,staleRemovedCount:0,upsertedCount:0,catalogDurationMs:0,applyDurationMs:0,totalDurationMs:Date.now()-t};let n=Date.now(),r,i=Math.floor((Date.now()-14400*60*1e3)/1e3);try{r=await Hk(e.path,{maxThreads:100,sortKey:`updated_at`,updatedAfterUnixSeconds:i})}catch(r){let i={provider:`codex`,status:`error`,discoveredCount:0,staleRemovedCount:0,upsertedCount:0,catalogDurationMs:Date.now()-n,applyDurationMs:0,totalDurationMs:Date.now()-t,error:r instanceof Error?r.message:String(r)};return this.options.logger?.warn?.({projectId:e.id,projectPath:e.path,...i},`project external session sync provider failed`),i}let a=Date.now()-n,o=new Map(this.options.historyStore.listProjectSessions(e.id,`all`).map(e=>[e.id,e])),s=Date.now(),c=0;for(let t of r){if(t.cwd!==e.path)continue;let n=[...o.values()].find(e=>e.provider===`codex`&&(e.id===t.id||e.nativeSessionId===t.id)),r=n?.id??t.id,i=this.sessions.get(r)??this.sessions.get(t.id),a=JF(t.createdAt),s=JF(t.updatedAt),l=mP(i,gP(t)),u=l.status,d=u===`running`?i?.pendingToolApprovals.size??0:0,f=u===`running`?i?.pendingUserInputs.size??0:0,p={id:r,nativeSessionId:t.id,source:n?.source??`native_discovered`,projectId:e.id,projectPath:e.path,provider:`codex`,providerMode:i?.providerMode??n?.providerMode??`native`,model:fN({runtimeModel:i?.model,discoveredModel:t.model,existingModel:n?.model,modelProvider:t.modelProvider}),title:i?.title??WF(t.name??t.preview)??n?.title,sessionTurnConfig:i?.sessionTurnConfig??(n?.sessionTurnConfig?dP(`codex`,n.sessionTurnConfig):void 0),sessionTurnConfigUpdatedAt:i?.sessionTurnConfigUpdatedAt??n?.sessionTurnConfigUpdatedAt,createdAt:n?.createdAt??a,updatedAt:u===`running`?i?.updatedAt??s:s,status:u,interactionLockReason:l.interactionLockReason,pendingApprovals:d,pendingUserInputs:f,pendingActions:d+f};await this.options.historyStore.upsertSession(p),o.set(r,p),c+=1}let l={provider:`codex`,status:`ok`,discoveredCount:r.filter(t=>t.cwd===e.path).length,staleRemovedCount:0,upsertedCount:c,catalogDurationMs:a,applyDurationMs:Date.now()-s,totalDurationMs:Date.now()-t};return this.options.logger?.info?.({projectId:e.id,projectPath:e.path,maxThreads:100,lookbackDays:10,...l},`project external session sync provider completed`),l}async syncClaudeSessionsForProject(e){let t=Date.now();if(!this.options.preferNativeProviders)return{provider:`claude`,status:`disabled`,discoveredCount:0,staleRemovedCount:0,upsertedCount:0,catalogDurationMs:0,applyDurationMs:0,totalDurationMs:Date.now()-t};let n=Date.now(),r,i=Date.now()-14400*60*1e3;try{r=await ij(e.path,{maxSessions:100,updatedAfterMs:i})}catch(r){let i={provider:`claude`,status:`error`,discoveredCount:0,staleRemovedCount:0,upsertedCount:0,catalogDurationMs:Date.now()-n,applyDurationMs:0,totalDurationMs:Date.now()-t,error:r instanceof Error?r.message:String(r)};return this.options.logger?.warn?.({projectId:e.id,projectPath:e.path,...i},`project external session sync provider failed`),i}let a=Date.now()-n,o=new Map(this.options.historyStore.listProjectSessions(e.id,`all`).map(e=>[e.id,e])),s=Date.now(),c=0;for(let t of r){let n=[...o.values()].find(e=>e.provider===`claude`&&(e.id===t.nativeSessionId||e.nativeSessionId===t.nativeSessionId)),r=n?.id??t.nativeSessionId,i=this.sessions.get(r),a=mP(i,t.status===`running`),s=a.status,l=s===`running`?i?.pendingToolApprovals.size??0:0,u=s===`running`?i?.pendingUserInputs.size??0:0,d={id:r,nativeSessionId:t.nativeSessionId,source:n?.source??`native_discovered`,projectId:e.id,projectPath:e.path,provider:`claude`,providerMode:i?.providerMode??n?.providerMode??`native`,model:i?.model??n?.model??t.model,title:i?.title??t.title??n?.title,sessionTurnConfig:i?.sessionTurnConfig??(n?.sessionTurnConfig?dP(`claude`,n.sessionTurnConfig,{preserveReasoningEffort:fP(n)}):void 0),sessionTurnConfigUpdatedAt:i?.sessionTurnConfigUpdatedAt??n?.sessionTurnConfigUpdatedAt,createdAt:n?.createdAt??t.createdAt,updatedAt:s===`running`?i?.updatedAt??t.updatedAt:t.updatedAt,status:s,interactionLockReason:a.interactionLockReason,pendingApprovals:l,pendingUserInputs:u,pendingActions:l+u};await this.options.historyStore.upsertSession(d),o.set(r,d),c+=1}let l={provider:`claude`,status:`ok`,discoveredCount:r.length,staleRemovedCount:0,upsertedCount:c,catalogDurationMs:a,applyDurationMs:Date.now()-s,totalDurationMs:Date.now()-t};return this.options.logger?.info?.({projectId:e.id,projectPath:e.path,maxSessions:100,lookbackDays:10,...l},`project external session sync provider completed`),l}async maybeHydrateCodexExternalSessionConfig(e){if(!e||!this.shouldHydrateCodexExternalSessionConfig(e))return e;let t=rP(e),n=fF([e.nativeSessionId,e.id]);for(let r of n)try{sP(`config.get.probe.begin`,{projectId:e.projectId,sessionId:e.id,threadId:r,...cP(e)});let n=await Gk(r);if(!n){sP(`config.get.probe.empty`,{projectId:e.projectId,sessionId:e.id,threadId:r});continue}let i=n.sessionTurnConfig?lP(e.provider,e.sessionTurnConfig,n.sessionTurnConfig):e.sessionTurnConfig,a={...e,model:uP({currentModel:e.model,observedModel:n.model,observedSessionTurnConfig:i}),sessionTurnConfig:i,sessionTurnConfigUpdatedAt:n.sessionTurnConfigUpdatedAt,codexExternalConfigHydrationVersion:3,...t?{lastHydratedExternalConfigFreshnessAt:t}:{}};return await this.options.historyStore.upsertSession(a),sP(`config.get.probe.result`,{projectId:e.projectId,sessionId:e.id,threadId:r,snapshotModel:n.model??null,snapshotSessionTurnConfigModel:n.sessionTurnConfig?.model??null,snapshotReasoningEffort:n.sessionTurnConfig?.reasoningEffort??null,snapshotApprovalPolicy:n.sessionTurnConfig?.execution?.codex?.approvalPolicy??null,snapshotSandboxMode:n.sessionTurnConfig?.execution?.codex?.sandboxMode??null,snapshotUpdatedAt:n.sessionTurnConfigUpdatedAt,next:cP(a)}),this.options.historyStore.getProjectSession(e.projectId,e.id)??a}catch(t){sP(`config.get.probe.error`,{projectId:e.projectId,sessionId:e.id,threadId:r,error:String(t)})}return e}shouldHydrateCodexExternalSessionConfig(e){if(!this.options.preferNativeProviders||e.provider!==`codex`||!SP(e)||this.sessions.has(e.id)||e.nativeSessionId&&this.sessions.has(e.nativeSessionId))return!1;let t=rP(e),n=e.sessionTurnConfigUpdatedAt||``;if(!e.sessionTurnConfig||!dN(e.model)||!n||e.codexExternalConfigHydrationVersion!==3)return!0;if(!t)return!1;let r=e.lastHydratedExternalConfigFreshnessAt;return r?t.localeCompare(r)>0:!0}async resolveProjectForSessionStart(e,t){if(!e&&!t)throw Error(`session.start requires projectId or cwd`);if(e&&t){let n=await this.options.projectStore.getById(e);if(!n)throw LT(e);if((await this.options.projectStore.upsertByPath(t)).id!==n.id)throw Error(`projectId (${e}) does not match cwd (${t})`);return await YF(n.path),n}if(e){let t=await this.options.projectStore.getById(e);if(!t)throw LT(e);return await YF(t.path),t}return this.options.projectStore.upsertByPath(t)}async attachRuntimeSession(e){let t=this.sessions.get(e.id);t&&await this.closeRuntimeSession(t.id,`replaced`,{suppressAudit:!0});let n={...e,unsubscribe:()=>{}};return await this.initializeRawSeqCursor(n.id),n.unsubscribe=n.providerSession.onEvent(e=>{if(!n.streamReady){n.bufferedProviderEvents.push(e);return}this.handleProviderEvent(n,e)}),this.sessions.set(n.id,n),n}handleProviderEvent(e,t){let n=this.ensureProviderRequestId(t);this.emitRawEnvelope(e,n),this.maybePersistUpdatedNativeSessionId(e);let r=new Date().toISOString();if(e.updatedAt=r,this.touchSession(e),n.type===`thread.title.updated`){let t=KF(n.title);t&&this.setSessionTitle(e,t);return}if(n.type===`turn.started`){e.status=`running`,e.activeStartedAt=e.activeStartedAt??r,e.dispatchInFlight=!1,this.persistSessionSnapshot(e);return}if(n.type===`turn.completed`||n.type===`turn.failed`){e.status=`idle`,e.dispatchInFlight=!1,this.persistSessionSnapshot(e),e.provider===`claude`&&this.closeRuntimeSession(e.id,`turn_terminal`);return}if(TP(e,n)){let t=KF(n.message);e.status!==`idle`&&this.options.logger?.warn?.({sessionId:e.id,nativeSessionId:e.nativeSessionId,provider:e.provider,providerMode:e.providerMode,projectId:e.projectId,projectPath:e.projectPath,model:e.model,previousStatus:e.status,nextStatus:`idle`,eventType:n.type,errorMessage:t},`provider session forced idle after error event`),e.status=`idle`,e.dispatchInFlight=!1,this.persistSessionSnapshot(e),wP(e,n)&&this.closeRuntimeSession(e.id,`provider_error`,{suppressAudit:!0});return}if(n.type===`tool.permission.requested`){let t=typeof n.requestId==`string`?n.requestId:``;if(!t)return;e.pendingToolApprovals.add(t),this.persistSessionSnapshot(e);return}if(n.type===`tool.permission.resolved`&&typeof n.requestId==`string`){e.pendingToolApprovals.delete(n.requestId),this.persistSessionSnapshot(e);return}if(n.type===`user.input.requested`){let t=typeof n.requestId==`string`?n.requestId:``;if(!t)return;e.pendingUserInputs.add(t),this.persistSessionSnapshot(e);return}if(n.type===`user.input.resolved`&&typeof n.requestId==`string`){e.pendingUserInputs.delete(n.requestId),this.persistSessionSnapshot(e);return}}emitRawEnvelope(e,t){let n={v:`1.0`,kind:`provider.raw`,rawSeq:this.nextRawSeqSync(e.id),provider:e.provider,sessionId:e.id,projectId:e.projectId,eventId:`raw_${DT(12)}`,ts:this.nextRawEnvelopeTimestamp(),type:t.type,payload:{raw:t}};this.options.onEnvelope(n),this.options.historyStore.appendRawEvent(n).catch(e=>{console.error(`[session-history] append raw event failed: ${String(e)}`)})}nextRawEnvelopeTimestamp(){let e=Date.now(),t=e>this.lastRawEnvelopeTimestampMs?e:this.lastRawEnvelopeTimestampMs+1;return this.lastRawEnvelopeTimestampMs=t,new Date(t).toISOString()}async initializeRawSeqCursor(e){if(this.nextRawSeqBySession.has(e))return;let t=await this.options.historyStore.getSessionRawSeqRange(e),n=t?t.max+1:1;this.nextRawSeqBySession.set(e,n)}async nextRawSeq(e){return await this.initializeRawSeqCursor(e),this.nextRawSeqSync(e)}nextRawSeqSync(e){let t=this.nextRawSeqBySession.get(e)??1;return this.nextRawSeqBySession.set(e,t+1),t}touchSession(e){e.lastActiveAtMs=Date.now()}isSessionEvictable(e){return!(e.closing||e.status!==`idle`||e.pendingToolApprovals.size>0||e.pendingUserInputs.size>0||e.dispatchInFlight)}async closeRuntimeSession(e,t,n){let r=this.sessions.get(e);if(!r||r.closing)return!1;r.closing=!0;let i=Date.now();this.options.logger?.info?.({sessionId:e,nativeSessionId:r.nativeSessionId,provider:r.provider,providerMode:r.providerMode,reason:t,statusBefore:r.status,projectId:r.projectId,projectPath:r.projectPath,model:r.model,pendingApprovalCount:r.pendingToolApprovals.size,pendingUserInputCount:r.pendingUserInputs.size,dispatchInFlight:r.dispatchInFlight},`provider runtime session close starting`);try{r.unsubscribe()}catch{}let a;try{await r.providerSession.close()}catch(n){a=n,console.error(`[session-runtime] failed closing session ${e}:`,n),this.options.logger?.error?.({sessionId:e,nativeSessionId:r.nativeSessionId,provider:r.provider,providerMode:r.providerMode,reason:t,projectId:r.projectId,projectPath:r.projectPath,model:r.model,error:String(n),err:n},`provider runtime session close failed`)}finally{r.status=`idle`,r.updatedAt=new Date().toISOString(),r.pendingToolApprovals.clear(),r.pendingUserInputs.clear();let t=this.sessions.get(e);if(!(t&&t!==r))try{await this.persistSessionSnapshot(r)}catch(t){console.error(`[session-runtime] failed persisting closed session ${e}: ${String(t)}`)}this.sessions.get(e)===r&&this.sessions.delete(e),r.dispatchInFlight=!1,r.closing=!1}if(this.options.logger?.info?.({sessionId:e,nativeSessionId:r.nativeSessionId,provider:r.provider,providerMode:r.providerMode,reason:t,projectId:r.projectId,projectPath:r.projectPath,model:r.model,result:a?`error`:`success`,durationMs:Date.now()-i},`provider runtime session close completed`),!n?.suppressAudit)try{await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.runtime.close`,sessionId:e,detail:{reason:t,provider:r.provider}})}catch(e){console.error(`[session-runtime] failed to record runtime close audit log: ${String(e)}`)}return!0}async sweepRuntimeSessions(){if(this.shuttingDown||this.sessions.size===0)return;let e=Date.now(),t=this.runtimeLifecycle.idleTtlMs,n=[...this.sessions.values()].filter(e=>this.isSessionEvictable(e)).sort((e,t)=>e.lastActiveAtMs-t.lastActiveAtMs);for(let r of n)e-r.lastActiveAtMs<t||await this.closeRuntimeSession(r.id,`idle_ttl`);await this.enforceProviderSessionCap(`codex`,this.runtimeLifecycle.maxCodexSessions),await this.enforceProviderSessionCap(`claude`,this.runtimeLifecycle.maxClaudeSessions),await this.enforceGlobalSessionCap(this.runtimeLifecycle.maxSessions)}async enforceProviderSessionCap(e,t){let n=[...this.sessions.values()].filter(t=>t.provider===e);if(n.length<=t)return;let r=n.length-t,i=n.filter(e=>this.isSessionEvictable(e)).sort((e,t)=>e.lastActiveAtMs-t.lastActiveAtMs),a=0;for(let e of i){if(a>=r)break;await this.closeRuntimeSession(e.id,`lru_cap`)&&(a+=1)}a<r&&console.warn(`[session-runtime] ${e} sessions exceed cap (${n.length}/${t}), no more idle sessions to evict`)}async enforceGlobalSessionCap(e){if(this.sessions.size<=e)return;let t=this.sessions.size-e,n=[...this.sessions.values()].filter(e=>this.isSessionEvictable(e)).sort((e,t)=>e.lastActiveAtMs-t.lastActiveAtMs),r=0;for(let e of n){if(r>=t)break;await this.closeRuntimeSession(e.id,`lru_cap`)&&(r+=1)}r<t&&console.warn(`[session-runtime] session count exceeds cap (${this.sessions.size}/${e}), no more idle sessions to evict`)}ensureProviderRequestId(e){return e.type===`tool.permission.requested`||e.type===`user.input.requested`?typeof e.requestId==`string`&&e.requestId.trim()?e:{...e,requestId:`req_${DT(8)}`}:e}async maybePersistSyncedExternalRawEvents(e,t,n,r){if(!r)return n;let i=await this.options.historyStore.mergeSessionRawEvents(e.id,n,{replaceMissing:!0,baseEventIds:t.map(e=>e.eventId)}),a=i[i.length-1]?.rawSeq;return typeof a==`number`&&Number.isFinite(a)&&a>0&&this.nextRawSeqBySession.set(e.id,a+1),i}async syncExternalRawHistory(e,t,n,r=n){if(e.provider===`claude`){let i=mF(e);if(!i)return{rawEvents:n};try{let a=Date.now(),o=await aj({projectPath:e.projectPath,nativeSessionId:i,provider:e.provider,sessionId:e.id,projectId:t}),s=Date.now(),c=await this.finalizeExternalRawHistorySync(e,r,o.rawEvents),l=TF(n,c),u=o.status===`running`,d=aP({session:e,observedUpdatedAt:o.updatedAt,historyUpdated:l.historyUpdated,externallyRunning:u}),f=oP({session:e,observedUpdatedAt:o.updatedAt,historyUpdated:l.historyUpdated,externallyRunning:u});await this.markExternalHistoryHydrated(e.id,f);let p=await this.patchObservedExternalSessionSummary(e,{updatedAt:d,externallyRunning:u,model:o.model,sessionTurnConfig:o.sessionTurnConfig,sessionTurnConfigUpdatedAt:o.sessionTurnConfigUpdatedAt});return sP(`sync-external.claude`,{projectId:t,sessionId:e.id,source:e.source,localEventCount:n.length,localStoredEventCount:r.length,historyEventCount:o.rawEvents.length,resultEventCount:c.length,historyUpdated:l.historyUpdated,observedUpdatedAt:d,hydratedExternalUpdatedAt:f,readHistoryDurationMs:s-a,finalizeDurationMs:Date.now()-s}),{rawEvents:c,session:p,nativeWatchPath:o.nativeWatchPath}}catch(i){return e.source===`native_discovered`&&pF(i)&&await this.markExternalHistoryHydrated(e.id,e.updatedAt),sP(`sync-external.claude.error`,{projectId:t,sessionId:e.id,source:e.source,localEventCount:n.length,localStoredEventCount:r.length,error:i instanceof Error?i.message:String(i)}),{rawEvents:n}}}if(e.provider!==`codex`)return{rawEvents:n};let i=WP(n,(this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0))?.status===`running`),a=fF([e.nativeSessionId,e.id]);for(let o of a)try{let a=Date.now(),s=await Wk(o,!0),c=Date.now(),l,u;if(e.source===`gateway`&&n.length>0)l=LF({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n,localCodexLiveTurnState:i}),u=`gateway_incremental`;else if(e.source===`native_discovered`&&n.length>0){let r=DF({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n});r?(l=r,u=`native_tail_incremental`):(l=EF({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`)}else l=EF({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`;let d=Date.now(),f=JF(s.updatedAt),p=await this.finalizeExternalRawHistorySync(e,r,l,i),m=TF(n,p),h=e.source===`gateway`?_P(s,i):gP(s),g=aP({session:e,observedUpdatedAt:f,historyUpdated:m.historyUpdated,externallyRunning:h}),_=oP({session:e,observedUpdatedAt:f,historyUpdated:m.historyUpdated,externallyRunning:h});await this.markExternalHistoryHydrated(e.id,_);let v=await this.patchObservedExternalSessionSummary(e,{updatedAt:g,externallyRunning:h});return sP(`sync-external.codex`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,threadStatus:s.status,threadUpdatedAt:f,threadTurnCount:s.turns.length,threadTurns:s.turns.slice(-3).map(e=>({id:e.id,status:e.status,itemCount:e.items.length,lastItemId:e.items[e.items.length-1]?.id??null,lastItemType:e.items[e.items.length-1]?.type??null})),externallyRunning:h,localEventCount:n.length,localStoredEventCount:r.length,historyBuildMode:u,historyEventCount:l.length,resultEventCount:p.length,historyUpdated:m.historyUpdated,observedUpdatedAt:g,hydratedExternalUpdatedAt:_,readThreadDurationMs:c-a,buildHistoryDurationMs:d-c,finalizeDurationMs:Date.now()-d}),{rawEvents:p,session:v,nativeWatchPath:s.path??void 0}}catch(i){sP(`sync-external.codex.read.error`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,localEventCount:n.length,localStoredEventCount:r.length,error:i instanceof Error?i.message:String(i)})}return sP(`sync-external.codex.read.exhausted`,{projectId:t,sessionId:e.id,source:e.source,attemptedThreadIds:a,localEventCount:n.length}),{rawEvents:n}}async finalizeExternalRawHistorySync(e,t,n,r){let i=Date.now(),a=PP(e.provider,t,n,r),o=Date.now(),s=await this.maybePersistSyncedExternalRawEvents(e,t,a,!0);return sP(`sync-external.finalize`,{sessionId:e.id,provider:e.provider,source:e.source,localEventCount:t.length,historyEventCount:n.length,mergedEventCount:a.length,persistedEventCount:s.length,mergeDurationMs:o-i,persistDurationMs:Date.now()-o}),s}async patchObservedExternalSessionSummary(e,t){let n=this.options.historyStore.getSession(e.id)??e,r=this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0),i=fP(n),a=t.sessionTurnConfig?lP(e.provider,n.sessionTurnConfig,t.sessionTurnConfig,{preserveReasoningEffort:i}):void 0,o=mP(r,t.externallyRunning),s=o.status===`running`?r?.pendingToolApprovals.size??0:0,c=o.status===`running`?r?.pendingUserInputs.size??0:0,l={...n,updatedAt:o.status===`running`?r?.updatedAt??t.updatedAt:t.updatedAt,status:o.status,model:r?.model??uP({currentModel:n.model,observedModel:t.model,observedSessionTurnConfig:a}),sessionTurnConfig:r?.sessionTurnConfig??a??(n.sessionTurnConfig?dP(e.provider,n.sessionTurnConfig,{preserveReasoningEffort:i}):void 0),sessionTurnConfigUpdatedAt:r?.sessionTurnConfigUpdatedAt??(a?t.sessionTurnConfigUpdatedAt??t.updatedAt:void 0)??n.sessionTurnConfigUpdatedAt,interactionLockReason:o.interactionLockReason,pendingApprovals:s,pendingUserInputs:c,pendingActions:s+c,...e.provider===`codex`&&a?{codexExternalConfigHydrationVersion:3}:{}};return await this.options.historyStore.upsertSession(l),this.options.historyStore.getSession(e.id)??l}async markExternalHistoryHydrated(e,t){await this.options.historyStore.patchSession(e,{lastHydratedExternalUpdatedAt:t})}mustGetSession(e){let t=this.sessions.get(e);if(!t)throw zT(e);return t}markSessionStreamReady(e){if(e.streamReady||(e.streamReady=!0,e.bufferedProviderEvents.length===0))return;let t=[...e.bufferedProviderEvents];e.bufferedProviderEvents.length=0;for(let n of t)this.handleProviderEvent(e,n)}async persistSessionSnapshot(e){await this.options.historyStore.upsertSession(this.toSessionSummary(e))}async persistGatewayOwnedDispatchStart(e){e.status=`running`;let t=new Date().toISOString();e.updatedAt=t,e.activeStartedAt=t,this.touchSession(e),await this.persistSessionSnapshot(e)}async restoreUnacceptedGatewayOwnedDispatch(e){e.status=`idle`,e.dispatchInFlight=!1,e.updatedAt=new Date().toISOString(),this.touchSession(e),await this.persistSessionSnapshot(e)}listAllSessionsWithRuntime(e=`all`){let t=new Map(this.options.historyStore.listSessions(`all`).map(e=>[e.id,e]));for(let e of this.sessions.values())iP(e,t.get(e.id))&&t.set(e.id,this.toSessionSummary(e));return[...t.values()].filter(t=>e===`all`||t.status===e).sort((e,t)=>{let n=e.updatedAt||e.createdAt;return(t.updatedAt||t.createdAt).localeCompare(n)})}listProjectSessionsWithRuntime(e,t=`all`){return this.listAllSessionsWithRuntime(t).filter(t=>t.projectId===e)}getRuntimeSessionSummary(e,t,n){let r=this.sessions.get(t);if(!(!r||r.projectId!==e)&&iP(r,n))return this.toSessionSummary(r)}toSessionSummary(e){return{id:e.id,nativeSessionId:e.nativeSessionId,source:e.source,...e.source===`gateway`?{lastHydratedExternalUpdatedAt:e.updatedAt}:{},projectId:e.projectId,projectPath:e.projectPath,provider:e.provider,providerMode:e.providerMode,model:e.model,title:e.title,sessionTurnConfig:e.sessionTurnConfig,sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt,createdAt:e.createdAt,updatedAt:e.updatedAt,activeStartedAt:e.activeStartedAt,status:e.status,interactionLockReason:void 0,pendingApprovals:e.pendingToolApprovals.size,pendingUserInputs:e.pendingUserInputs.size,pendingActions:e.pendingToolApprovals.size+e.pendingUserInputs.size}}setSessionTitle(e,t){let n=UF(t);!n||n===e.title||(e.title=n,e.updatedAt=new Date().toISOString(),this.persistSessionSnapshot(e))}resolveCanonicalSessionId(e,t,n){return e===`codex`&&t.getNativeSessionId?.()||n}resolveNativeSessionId(e,t,n){return e!==`codex`&&e!==`claude`?n:t.getNativeSessionId?.()||n}maybePersistUpdatedNativeSessionId(e){let t=this.resolveNativeSessionId(e.provider,e.providerSession,e.nativeSessionId);!t||t===e.nativeSessionId||this.shouldPersistNativeSessionId(e,t)&&(e.nativeSessionId=t,e.updatedAt=new Date().toISOString(),this.persistSessionSnapshot(e))}shouldPersistNativeSessionId(e,t){return e.source===`native_discovered`?!1:e.nativeSessionId?e.nativeSessionId===e.id&&e.id.startsWith(`sess_`)?t!==e.nativeSessionId:!1:!0}};const NP=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]);function PP(e,t,n,r){if(e===`claude`)return IP(e,qP(t,n),n);if(e!==`codex`)return IP(e,t,n);if(t.length===0)return n.slice().sort((e,t)=>e.ts.localeCompare(t.ts));let i=r??WP(t),a=FP(e,t.filter(e=>!BP(e))),o=ZP(e),s=t.filter(t=>{if(UP(t,i))return!1;if(!BP(t))return!0;let n=QP(e,t,o);if(n.length===0||n.some(e=>(a.get(e)??0)<=0))return!0;for(let e of n){let t=(a.get(e)??0)-1;t>0?a.set(e,t):a.delete(e)}return!1}),c=new Map,l=new Map,u=new Set,d=ZP(e),f=ZP(e),p=KP(t)??KP(n)??Date.now();for(let[t,n]of s.entries()){c.set(n.eventId,n),l.set(n.eventId,t);for(let t of QP(e,n,d))u.add(t)}for(let t of n){if(UP(t,i))continue;let n=QP(e,t,f);if(!c.has(t.eventId)&&n.length>0&&n.every(e=>u.has(e)))continue;let r=c.get(t.eventId);if(r){if(!LP(r,t))continue;let e=l.get(t.eventId),n=GP(r,t);e!==void 0&&(s[e]=n),c.set(n.eventId,n)}else{p+=1;let e={...t,ts:new Date(p).toISOString()};c.set(e.eventId,e),l.set(e.eventId,s.length),s.push(e)}for(let e of n)u.add(e)}return s}function FP(e,t){let n=new Map,r=ZP(e);for(let i of t)for(let t of QP(e,i,r))n.set(t,(n.get(t)??0)+1);return n}function IP(e,t,n){let r=new Map,i=new Set,a=ZP(e),o=ZP(e);for(let n of t){r.set(n.eventId,n);for(let t of QP(e,n,a))i.add(t)}for(let t of n){let n=QP(e,t,o);if(!(!r.has(t.eventId)&&n.length>0&&n.every(e=>i.has(e)))){r.set(t.eventId,t);for(let e of n)i.add(e)}}return[...r.values()].sort((e,t)=>e.ts.localeCompare(t.ts))}function LP(e,t){return RP(e)&&RP(t)}function RP(e){return e.type===`native.raw`?$(cF(e.payload.raw).source)===`codex.history.thread_read`:!1}function zP(e){return e===`codex.history.thread_read`||e===`codex.history.thread_read.incremental`}function BP(e){let t=cF(e.payload.raw),n=$(t.source);return t.historyReplay===!0||zP(n)}function VP(e){let t=cF(e.payload.raw),n=cF(t.item),r=cF(t.turn);if(e.type===`turn.started`||e.type===`turn.completed`||e.type===`turn.failed`)return $(t.turn_id)??$(t.turnId)??$(r.id)??$(n.turn_id)??$(n.turnId);if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`)return $(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId)??$(r.id);if(e.type!==`native.raw`)return;let i=$(t.source),a=cF(t.message);if(i===`codex.app_server`){let e=$(a.method),t=cF(a.params);return e===`turn/started`||e===`turn/completed`||e===`turn/failed`||e===`turn/interrupted`?$(cF(t.turn).id)??$(t.turn_id)??$(t.turnId):e===`item/started`||e===`item/updated`||e===`item/completed`?$(t.turn_id)??$(t.turnId)??$(cF(t.item).turn_id)??$(cF(t.item).turnId):void 0}if(i!==`codex.history.thread_read`)return;let o=$(a.scope);if(o===`turn`)return $(cF(a.turn).id);if(o===`item`)return $(a.turn_id)??$(cF(a.item).turn_id)}function HP(e){let t=cF(e.payload.raw);if(e.type===`turn.completed`||e.type===`turn.failed`){let n=$(t.status)??(e.type===`turn.completed`?`completed`:`failed`);return n&&VF(n)?n:void 0}if(e.type!==`native.raw`)return;let n=$(t.source),r=cF(t.message);if(n===`codex.app_server`){let e=$(r.method);if(e!==`turn/completed`&&e!==`turn/failed`&&e!==`turn/interrupted`)return;let t=$(cF(cF(r.params).turn).status)??(e===`turn/completed`?`completed`:e===`turn/interrupted`?`interrupted`:`failed`);return t&&VF(t)?t:void 0}if(n!==`codex.history.thread_read`||$(r.scope)!==`turn`)return;let i=$(cF(r.turn).status);return i&&VF(i)?i:void 0}function UP(e,t){if(!BP(e))return!1;let n=VP(e),r=HP(e);return!n||!r?!1:HF(t.terminalTurnStatusById.get(n),r)}function WP(e,t=!1){let n=new Set,r=new Map;for(let t of e){if(BP(t))continue;let e=VP(t);e&&n.add(e);let i=HP(t);e&&i&&r.set(e,i)}let i=new Set;if(t)for(let e of n)r.has(e)||i.add(e);return{activeTurnIds:i,terminalTurnStatusById:r}}function GP(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function KP(e){let t;for(let n of e){let e=Date.parse(n.ts);Number.isFinite(e)&&(t=t===void 0?e:Math.max(t,e))}return t}function qP(e,t){let n=JP(e);if(n.size===0)return e;let r=new Set(e.map(e=>e.eventId)),i=new Set;for(let e of t){if(r.has(e.eventId))continue;let t=XP(e);if(!t)continue;let a=n.get(t.text);if(!a||a.length===0)continue;let o,s=1/0;for(let e of a){if(e.consumed)continue;let n=t.tsMs-e.tsMs;if(n>3e4||n<0)continue;let r=Math.abs(n);r>=s||(o=e,s=r)}if(o){o.consumed=!0;for(let e of o.eventIds)i.add(e)}}return i.size===0?e:e.filter(e=>!i.has(e.eventId))}function JP(e){let t=new Map,n=new Map;for(let r of e){let e=YP(r);if(!e)continue;let i=t.get(e.text)??[],a=e.syntheticMessageId?`${e.text}\u0000${e.syntheticMessageId}`:``,o=a?n.get(a):void 0;if(o)o.tsMs=Math.min(o.tsMs,e.tsMs),o.eventIds.push(r.eventId);else{let t={text:e.text,tsMs:e.tsMs,eventIds:[r.eventId],consumed:!1};i.push(t),a&&n.set(a,t)}t.set(e.text,i)}return t}function YP(e){let t=Date.parse(e.ts);if(!Number.isFinite(t))return;if(e.type===`item.completed`){let n=cF(cF(e.payload.raw).item);if($(n.type)!==`user_message`||$(n.source_event_type)!==`claude.synthetic.user_input`)return;let r=uF(n);return r?{text:r,tsMs:t,syntheticMessageId:KF(n.id)??KF(n.item_id)??KF(n.itemId)}:void 0}if(e.type!==`native.raw`)return;let n=cF(e.payload.raw);if($(n.source)!==`claude.synthetic.user_input`||($(n.native_type)??$(cF(n.message).type))!==`user`)return;let r=dF(cF(cF(n.message).message));if(r)return{text:r,tsMs:t,syntheticMessageId:KF(cF(n.message).uuid)}}function XP(e){if(e.type!==`native.raw`)return;let t=Date.parse(e.ts);if(!Number.isFinite(t))return;let n=cF(e.payload.raw),r=$(n.source);if(!r||!NP.has(r))return;let i=cF(n.message);if(($(n.native_type)??$(i.type))!==`user`)return;let a=dF(cF(i.message));if(a)return{text:a,tsMs:t}}function ZP(e){if(e===`codex`)return{codexTurnScopedItemOccurrences:new Map}}function QP(e,t,n){return e===`codex`?$P(t,n):e===`claude`?aF(t):[]}function $P(e,t){let n=cF(e.payload.raw),r=new Set,i=oF(e.type,n);if(i){let a=eF(e.type,n);a?r.add(rF(a,t,n)):r.add(i)}if(e.type!==`native.raw`)return[...r];let a=$(n.source);if(a===`codex.app_server`){let e=cF(n.message),i=$(e.method),a=cF(e.params);if(i===`turn/started`)return r.add(sF(`turn.started`,{turn:cF(a.turn)})),[...r];if(i===`turn/completed`)return r.add(sF(`turn.completed`,{status:`completed`,turn:cF(a.turn)})),[...r];if(i===`turn/failed`||i===`turn/interrupted`)return r.add(sF(`turn.failed`,{status:i===`turn/interrupted`?`interrupted`:`failed`,turn:cF(a.turn)})),[...r];if(i===`item/started`||i===`item/updated`||i===`item/completed`){let e=i.replace(`/`,`.`),n={turn_id:$(a.turn_id)??$(a.turnId)??$(cF(a.item).turn_id),item:cF(a.item)},o=eF(e,n);return o?r.add(rF(o,t,n)):r.add(sF(e,n)),[...r]}return[...r]}if(a!==`codex.history.thread_read`)return[...r];let o=cF(n.message),s=$(o.scope);if(s===`thread`){let e=cF(o.thread),t=$(e.id);t&&r.add(sF(`thread.started`,{thread_id:t,thread:e}));let n=WF(lF(e.preview)??lF(e.name)??``);return n&&r.add(sF(`thread.title.updated`,{title:n,thread_id:t})),[...r]}if(s===`turn`){let e=cF(o.turn),t=$(e.status);return r.add(sF(`turn.started`,{turn:e})),t===`completed`?r.add(sF(`turn.completed`,{status:t,turn:e})):(t===`failed`||t===`interrupted`)&&r.add(sF(`turn.failed`,{status:t,turn:e})),[...r]}if(s===`item`){let e={turn_id:$(o.turn_id)??$(cF(o.item).turn_id),item:cF(o.item),...o.semantic_occurrence===void 0?{}:{semantic_occurrence:o.semantic_occurrence}},n=eF(`item.completed`,e);return n?r.add(rF(n,t,e)):r.add(sF(`item.completed`,e)),[...r]}return[...r]}function eF(e,t){if(!e.startsWith(`item.`))return;let n=cF(t.item),r=$(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId),i=tF($(n.type));if(!(!r||!i))return[`codex`,e,r,i,nF(i,$(n.phase)),$(n.status)??``,SF($(n.command)),SF(uF(n))].join(`|`)}function tF(e){if(!e)return;let t=e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).replace(/[\s-]+/g,`_`).toLowerCase();return t.length>0?t:void 0}function nF(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function rF(e,t,n){let r=iF(n);if(r!==void 0)return`${e}|${r}`;let i=t?.codexTurnScopedItemOccurrences;if(!i)return e;let a=(i.get(e)??0)+1;return i.set(e,a),`${e}|${a}`}function iF(e){if(!e)return;let t=e.semantic_occurrence??e.semanticOccurrence;if(typeof t==`number`&&Number.isInteger(t)&&t>0)return t;if(typeof t==`string`){let e=Number.parseInt(t,10);if(Number.isInteger(e)&&e>0)return e}}function aF(e){let t=cF(e.payload.raw),n=oF(e.type,t);if(n)return[n];if(e.type!==`native.raw`)return[];let r=$(t.source);if(!r||!NP.has(r))return[];let i=cF(t.message),a=$(t.native_type)??$(i.type),o=cF(i.message);if(a===`user`){let e=dF(o),t=$(i.uuid);return!e||!t?[]:[sF(`item.completed`,{item:{id:t,type:`user_message`,text:e}})]}if(a===`assistant`){let e=dF(o),t=$(o.id)??$(i.uuid);return!e||!t?[]:[sF(`item.completed`,{item:{id:t,type:`agent_message`,text:e}})]}return[]}function oF(e,t){switch(e){case`thread.started`:case`thread.title.updated`:case`turn.started`:case`turn.completed`:case`turn.failed`:case`item.started`:case`item.updated`:case`item.completed`:return sF(e,t);default:return}}function sF(e,t){let n=cF(t.item),r=cF(t.turn),i=cF(t.thread),a=$(n.id)??``,o=$(t.turn_id)??$(t.turnId)??$(r.id)??$(n.turn_id)??``,s=$(r.status)??$(t.status)??``,c=$(t.thread_id)??$(t.threadId)??$(i.id)??``,l=$(n.type)??``,u=$(n.phase)??``,d=$(n.status)??``,f=SF($(n.command)),p=SF(uF(n)),m=SF(lF(t.message)),h=SF(lF(t.title));return e.startsWith(`item.`)?[e,a,l,u,d,f,p||m].join(`|`):e.startsWith(`turn.`)?[e,o,s].join(`|`):e===`thread.title.updated`?[e,c,h].join(`|`):[e,c,o,a,l,h||m].join(`|`)}function cF(e){return typeof e==`object`&&e?e:{}}function $(e){return typeof e==`string`&&e.trim()||void 0}function lF(e){if(typeof e==`string`)return e.length>0?e:void 0}function uF(e){let t=lF(e.text);if(t)return t;let n=Array.isArray(e.content)?e.content:[];if(n.length>0){let e=[];for(let t of n){let n=lF(cF(t).text);n&&e.push(n)}if(e.length>0)return e.join(`
528
+ `)}let r=Array.isArray(e.summary)?e.summary:[];if(r.length>0){let e=r.map(e=>lF(e)).filter(e=>!!e);if(e.length>0)return e.join(`
529
+ `)}return``}function dF(e){let t=$(e.content);if(t)return t;let n=$(e.text)??$(e.prompt);if(n)return n;let r=Array.isArray(e.content)?e.content:[],i=[];for(let e of r){if(typeof e==`string`){let t=e.trim();t&&i.push(t);continue}let t=cF(e),n=$(t.type);if(n&&n!==`text`)continue;let r=$(t.text)??$(t.content);r&&i.push(r)}if(i.length!==0)return i.join(`
530
+ `)}function fF(e){let t=new Set;for(let n of e)n&&t.add(n);return[...t]}function pF(e){return String(e).includes(`returned no messages from getSessionMessages`)}function mF(e){return xP(e)}function hF(e){return e?{rawSeq:e.rawSeq,type:e.type,eventId:e.eventId,ts:e.ts}:null}function gF(e,t){let n=Math.min(e.length,t.length);for(let r=0;r<n;r+=1){let n=e[r],i=t[r];if(!_F(n,i))return r}return e.length===t.length?null:n}function _F(e,t){return bF(vF(e))===bF(vF(t))}function vF(e){let{ts:t,...n}=e;return n}function yF(e){if(typeof e==`string`)return xF(e);if(Array.isArray(e))return e.map(e=>yF(e));if(!e||typeof e!=`object`)return e;let t=e,n={};for(let e of Object.keys(t).sort())n[e]=yF(t[e]);return n}function bF(e){return JSON.stringify(yF(e))}function xF(e){return e.length<=4096?e:{__type:`hashed_text`,length:e.length,sha256:(0,l.createHash)(`sha256`).update(e).digest(`hex`)}}function SF(e){if(!e)return``;let t=xF(e);return typeof t==`string`?t:`sha256:${t.length}:${t.sha256}`}function CF(e,t,n,r){if(!n.historyUpdated)return`unchanged`;if(n.refreshMode===`delta`)return`append_only_delta`;if(t.length<e.length)return`history_shrunk`;let i=Math.min(e.length,t.length);return r!==null&&r<i?`prefix_rewrite`:`snapshot_fallback`}function wF(e){let t=e.previousEvents[e.previousEvents.length-1]?.rawSeq??null,n=e.nextEvents[e.nextEvents.length-1]?.rawSeq??null,r=gF(e.previousEvents,e.nextEvents),i=r??Math.min(e.previousEvents.length,e.nextEvents.length);return{projectId:e.projectId,sessionId:e.sessionId,provider:e.session.provider,source:e.session.source,providerMode:e.session.providerMode,decision:e.classification.refreshMode,reason:CF(e.previousEvents,e.nextEvents,e.classification,r),historyUpdated:e.classification.historyUpdated,fromRawSeq:e.classification.fromRawSeq??null,toRawSeq:e.classification.toRawSeq??null,previousEventCount:e.previousEvents.length,nextEventCount:e.nextEvents.length,sharedPrefixCount:i,appendedCount:Math.max(0,e.nextEvents.length-e.previousEvents.length),firstMismatchIndex:r,previousLastRawSeq:t,nextLastRawSeq:n,previousMismatchEvent:hF(r===null?void 0:e.previousEvents[r]),nextMismatchEvent:hF(r===null?void 0:e.nextEvents[r])}}function TF(e,t){let n=e[e.length-1]?.rawSeq,r=t[t.length-1]?.rawSeq;return e.length===t.length&&e.every((e,n)=>{let r=t[n];return r!==void 0&&_F(e,r)})?{historyUpdated:!1,refreshMode:`snapshot`,...r===void 0?{}:{toRawSeq:r}}:t.length>e.length&&e.every((e,n)=>{let r=t[n];return r!==void 0&&_F(e,r)})?{historyUpdated:!0,refreshMode:`delta`,fromRawSeq:n??0,toRawSeq:r??n??0}:{historyUpdated:!0,refreshMode:`snapshot`,...r===void 0?{}:{toRawSeq:r}}}function EF(e){let t=[],n=e.thread.createdAt>0?e.thread.createdAt*1e3:Date.now(),r=0,i=()=>(r+=1,n+=1,new Date(n).toISOString()),a=(n,a)=>{let o=t.length+1;t.push({v:`1.0`,kind:`provider.raw`,rawSeq:o,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:IF(e.sessionId,r,a),ts:i(),type:`native.raw`,payload:{raw:{source:`codex.history.thread_read`,native_type:`thread.read.snapshot`,message:n,historyReplay:!0,replaySynthetic:!0}}})};a({scope:`thread`,thread:{id:e.thread.id,preview:e.thread.preview,model_provider:e.thread.modelProvider,created_at:e.thread.createdAt,updated_at:e.thread.updatedAt,path:e.thread.path,cwd:e.thread.cwd,cli_version:e.thread.cliVersion,source:e.thread.source,git_info:e.thread.gitInfo}},[`thread`,e.thread.id,e.thread.updatedAt]);for(let t of e.thread.turns){let n=e.localCodexLiveTurnState?e.localCodexLiveTurnState.terminalTurnStatusById.has(t.id)||e.localCodexLiveTurnState.activeTurnIds.has(t.id):!1,r=e.localCodexLiveTurnState?.terminalTurnStatusById.get(t.id);(VF(t.status)?!HF(r,t.status):!n)&&a({scope:`turn`,thread_id:e.thread.id,turn:{id:t.id,status:t.status,error:t.error}},[`turn`,t.id,t.status]);for(let n of t.items)a({scope:`item`,thread_id:e.thread.id,turn_id:t.id,item:n},[`item`,t.id,KF(n.id)??null])}return t}function DF(e){let t=OF(e.localEvents);if(!t.hasHistoryReplay||!t.hasThreadEnvelope)return null;let n=e.thread.turns.map(e=>e.id);if(t.turnOrder.length>n.length)return null;for(let[e,r]of t.turnOrder.entries())if(n[e]!==r)return null;let r=[],i=Math.max(KP(e.localEvents)??0,e.thread.updatedAt>0?e.thread.updatedAt*1e3:Date.now()),a=0,o=()=>(a+=1,i+=1,new Date(i).toISOString()),s=(t,n)=>{r.push({v:`1.0`,kind:`provider.raw`,rawSeq:r.length+1,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:IF(e.sessionId,a,n),ts:o(),type:`native.raw`,payload:{raw:{source:`codex.history.thread_read`,native_type:`thread.read.snapshot`,message:t,historyReplay:!0,replaySynthetic:!0}}})},c=t.turnOrder.length-1;for(let[n,r]of e.thread.turns.entries()){let i=t.turnsById.get(r.id);if(!i){s({scope:`turn`,thread_id:e.thread.id,turn:{id:r.id,status:r.status,error:r.error}},[`turn`,r.id,r.status]);for(let t of r.items)s({scope:`item`,thread_id:e.thread.id,turn_id:r.id,item:t},[`item`,r.id,KF(t.id)??null]);continue}let a=n!==c,o=AF(i,r);if(!o.safe||a&&(o.appendedItems.length>0||o.statusChanged))return null;if(!a){o.statusChanged&&s({scope:`turn`,thread_id:e.thread.id,turn:{id:r.id,status:r.status,error:r.error}},[`turn`,r.id,r.status]);for(let t of o.appendedItems)s({scope:`item`,thread_id:e.thread.id,turn_id:r.id,item:t},[`item`,r.id,KF(t.id)??null])}}return r}function OF(e){let t={hasHistoryReplay:!1,hasThreadEnvelope:!1,turnOrder:[],turnsById:new Map};for(let n of e){if(n.type!==`native.raw`)continue;let e=cF(n.payload.raw);if($(e.source)!==`codex.history.thread_read`)continue;let r=cF(e.message),i=$(r.scope);if(t.hasHistoryReplay=!0,i===`thread`){t.hasThreadEnvelope=!0;continue}if(i===`turn`){let e=cF(r.turn),n=$(e.id);if(!n)continue;let i=kF(t,n),a=$(e.status);a&&(i.status=a),i.fingerprint=PF(e);continue}if(i!==`item`)continue;let a=cF(r.item),o=$(r.turn_id)??$(a.turn_id);if(!o)continue;let s=kF(t,o),c=jF(o,a,void 0,s.itemOccurrenceByBaseKey);c&&(s.itemFingerprintByKey.has(c)||s.itemOrder.push(c),s.itemFingerprintByKey.set(c,NF(a)))}return t}function kF(e,t){let n=e.turnsById.get(t);if(n)return n;let r={itemOrder:[],itemFingerprintByKey:new Map,itemOccurrenceByBaseKey:new Map};return e.turnsById.set(t,r),e.turnOrder.push(t),r}function AF(e,t){if(t.items.length<e.itemOrder.length)return{safe:!1,appendedItems:[],statusChanged:!1};let n=new Map;for(let[r,i]of e.itemOrder.entries()){let a=t.items[r];if(!a||jF(t.id,a,r,n)!==i||e.itemFingerprintByKey.get(i)!==NF(a))return{safe:!1,appendedItems:[],statusChanged:!1}}return e.fingerprint!==void 0&&e.fingerprint!==PF(t)&&(e.status??``)===t.status?{safe:!1,appendedItems:[],statusChanged:!1}:{safe:!0,appendedItems:t.items.slice(e.itemOrder.length),statusChanged:(e.status??``)!==t.status}}function jF(e,t,n,r){let i=MF(e,t,n);if(!i)return;let a=iF(t);if(a!==void 0)return`${i}|${a}`;if(!r)return i;let o=(r.get(i)??0)+1;return r.set(i,o),`${i}|${o}`}function MF(e,t,n){let r=eF(`item.completed`,{turn_id:e,item:t});if(r)return r;let i=KF(t.id);if(i)return`id:${i}`;if(n!==void 0)return`${e}::${n}`}function NF(e){let t=tF($(e.type)),n=t?nF(t,$(e.phase)):$(e.phase),r={};for(let[i,a]of Object.entries(e))if(!(i===`id`||i===`turn_id`||i===`turnId`)){if(i===`type`){t&&(r.type=t);continue}if(i===`phase`){n&&(r.phase=n);continue}r[i]=a}return t&&r.type===void 0&&(r.type=t),bF(r)}function PF(e){return bF({status:$(e.status)??null,error:cF(e.error)})}function FF(e){return String(e??``).replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)}function IF(e,t,n){let r=n.map(FF).filter(e=>e.length>0);return r.length===0?`raw_hist_codex_${e}_${t.toString().padStart(6,`0`)}`:`raw_hist_codex_${e}_${r.join(`_`)}`}function LF(e){let t=e.localCodexLiveTurnState??WP(e.localEvents),n=new Set,r=RF(e.localEvents),i=new Map(t.terminalTurnStatusById),a=0,o=1;for(let t of e.localEvents){let e=Date.parse(t.ts);Number.isFinite(e)&&(a=Math.max(a,e)),o=Math.max(o,t.rawSeq+1);let r=cF(t.payload.raw),s=$(r.source),c=s===`codex.history.thread_read.incremental`;if(t.type===`turn.started`){let e=$(r.turn_id)??$(cF(r.turn).id);e&&!c&&n.add(e);continue}if(t.type===`turn.completed`||t.type===`turn.failed`){let e=$(r.turn_id)??$(cF(r.turn).id);if(!e)continue;c||n.add(e);let a=$(r.status)??(t.type===`turn.completed`?`completed`:`failed`);i.set(e,a)}if(t.type!==`native.raw`)continue;if(s===`codex.app_server`){let e=cF(r.message),t=cF(e.params),i=$(e.method),a=$(cF(t.turn).id)??$(t.turn_id)??$(t.turnId);a&&(i===`turn/started`||i===`turn/completed`||i===`turn/failed`||i===`turn/interrupted`)&&n.add(a);continue}if(s!==`codex.history.thread_read`)continue;let l=cF(r.message);if($(l.scope)===`turn`){let e=cF(l.turn),t=$(e.id);if(!t)continue;let n=$(e.status);n&&VF(n)&&i.set(t,n);continue}}let s=Math.max(a,e.thread.createdAt>0?e.thread.createdAt*1e3:Date.now()),c=0,l=e=>String(e??``).replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``),u=t=>{let n=t.map(l).filter(e=>e.length>0);return n.length===0?`raw_sync_codex_${e.sessionId}_${o.toString().padStart(6,`0`)}`:`raw_sync_codex_${e.sessionId}_${n.join(`_`)}`},d=()=>(c+=1,new Date(s+c).toISOString()),f=[],p=(t,n)=>{let r=d();f.push({v:`1.0`,kind:`provider.raw`,rawSeq:o,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:u(n),ts:r,type:`native.raw`,payload:{raw:{source:`codex.history.thread_read`,native_type:`thread.read.snapshot`,message:t,historyReplay:!0,replaySynthetic:!0}}}),o+=1};for(let a of e.thread.turns){let s=i.get(a.id),c=HF(s,a.status);(!(n.has(a.id)||t.activeTurnIds.has(a.id))&&!c||VF(a.status)&&s!==a.status)&&p({scope:`turn`,thread_id:e.thread.id,turn:{id:a.id,status:a.status,error:a.error}},[`turn`,a.id,a.status]);let l=new Map;for(let t of a.items){let n=$(t.id),i=jF(a.id,t,void 0,l);if(i&&r.has(i))continue;let s=i?zF(i):void 0;p({scope:`item`,thread_id:e.thread.id,turn_id:a.id,item:t,...s?{semantic_occurrence:s}:{}},[`item`,a.id,n??`seq_${o}`])}}return f}function RF(e){let t=new Set,n=new Map;for(let r of e){let e=BF(r);if(!e)continue;let i=jF(e.turnId,e.item,void 0,n);i&&t.add(i)}return t}function zF(e){let t=e.lastIndexOf(`|`);if(t<0||t===e.length-1)return;let n=Number.parseInt(e.slice(t+1),10);return Number.isInteger(n)&&n>0?n:void 0}function BF(e){let t=cF(e.payload.raw);if(e.type===`item.completed`){let e=cF(t.item),n=$(t.turn_id)??$(t.turnId)??$(e.turn_id)??$(e.turnId);return!n||Object.keys(e).length===0?null:{turnId:n,item:e}}if(e.type!==`native.raw`)return null;let n=$(t.source);if(n===`codex.app_server`){let e=cF(t.message);if($(e.method)!==`item/completed`)return null;let n=cF(e.params),r=cF(n.item),i=$(n.turn_id)??$(n.turnId)??$(r.turn_id)??$(r.turnId);return!i||Object.keys(r).length===0?null:{turnId:i,item:r}}if(n===`codex.history.thread_read`){let e=cF(t.message);if($(e.scope)!==`item`)return null;let n={...cF(e.item),...e.semantic_occurrence===void 0?{}:{semantic_occurrence:e.semantic_occurrence}},r=$(e.turn_id)??$(n.turn_id)??$(n.turnId);return!r||Object.keys(n).length===0?null:{turnId:r,item:n}}return null}function VF(e){return e===`completed`||e===`failed`||e===`interrupted`}function HF(e,t){return e===t&&VF(t)}function UF(e){let t=e.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g,``).replace(/\s+/g,` `).trim();if(t)return t}function WF(e,t=60){let n=UF(e);if(!n)return;let r=Array.from(n);return r.length<=t?n:r.slice(0,t).join(``).trimEnd()}function GF(e,t){if(t){let e=WF(t);if(e)return e}if(e.provider!==`codex`||!e.codex)return WF(`代码审查`);let n=e.codex.target;return n.type===`baseBranch`?WF(`审查 ${n.branch} 分支改动`):n.type===`custom`?WF(n.instructions):n.type===`commit`?WF(n.title||`审查提交 ${n.sha.slice(0,12)}`):WF(`审查未提交更改`)}function KF(e){if(typeof e!=`string`)return;let t=UF(e);if(t)return t}function qF(e){let t=0;for(let n of Object.values(e))n.some(e=>e.trim().length>0)&&(t+=1);return t}function JF(e){return!Number.isFinite(e)||e<=0?new Date().toISOString():new Date(e*1e3).toISOString()}async function YF(e){if(!(await d.default.stat(e)).isDirectory())throw Error(`Project path is not a directory: ${e}`)}var XF=class{indexPath;eventsDir;sessions=new Map;rawEventsCacheBySession=new Map;compactedRawEventsCacheBySession=new Map;pendingRawMutationsBySession=new Map;ready;writeQueue=Promise.resolve();constructor(e,t={}){this.baseDir=e,this.options=t,this.indexPath=p.default.join(e,`session-index.json`),this.eventsDir=p.default.join(e,`session-events`),this.ready=this.loadFromDisk()}async init(){await this.ready}logDebug(e,t){this.options.logDebug?.(`history-store.${e}`,t)}async flushRawCompactions(e){await this.ready}async shutdown(){await this.ready}async upsertSession(e){await this.ready;let t=ZF(e),n=this.sessions.get(t.id);this.sessions.set(t.id,{...n,...t}),await this.enqueueWrite(async()=>{await this.persistIndex()})}async patchSession(e,t){await this.ready;let n=this.sessions.get(e);return n?(this.sessions.set(e,ZF({...n,...t})),await this.enqueueWrite(async()=>{await this.persistIndex()}),!0):!1}async setSessionStatus(e,t,n){await this.ready;let r=this.sessions.get(e);r&&(this.sessions.set(e,{...r,status:t,updatedAt:n,interactionLockReason:void 0,pendingApprovals:t===`running`?r.pendingApprovals:0,pendingUserInputs:t===`running`?r.pendingUserInputs:0,pendingActions:t===`running`?r.pendingActions:0}),await this.enqueueWrite(async()=>{await this.persistIndex()}))}async removeSession(e){if(await this.ready,!this.sessions.has(e))return;this.sessions.delete(e),this.rawEventsCacheBySession.delete(e),this.compactedRawEventsCacheBySession.delete(e);let t=p.default.join(this.eventsDir,`${e}.jsonl`),n=p.default.join(this.eventsDir,`${e}.raw.jsonl`);await this.enqueueWrite(async()=>{await Promise.all([this.persistIndex(),d.default.rm(t,{force:!0}),d.default.rm(n,{force:!0})])})}hasSession(e){return this.sessions.has(e)}getSession(e){return this.sessions.get(e)}getProjectSession(e,t){let n=this.sessions.get(t);if(!(!n||n.projectId!==e))return n}listSessions(e=`all`){return[...this.sessions.values()].filter(t=>e===`all`||t.status===e).sort((e,t)=>{let n=e.updatedAt||e.createdAt;return(t.updatedAt||t.createdAt).localeCompare(n)})}listProjectSessions(e,t=`all`){return this.listSessions(t).filter(t=>t.projectId===e)}async appendRawEvent(e){await this.ready;let t=this.normalizeRawEventProjectIdentity(e);this.sessions.has(t.sessionId)&&(vI(t)||await this.enqueueRawSessionWrite(t.sessionId,async()=>{if(uI(t)){let e=_I([...await this.readSessionRawEventsLocked(t.sessionId),t]);await this.replaceRawEventFile(t.sessionId,e),this.rawEventsCacheBySession.set(t.sessionId,e),this.compactedRawEventsCacheBySession.set(t.sessionId,iI(e));return}await this.appendRawEventLine(t),this.appendRawEventToCache(t)}))}async mergeSessionRawEvents(e,t,n){if(await this.ready,!this.sessions.has(e))return[];let r=t.filter(t=>t.sessionId===e).map(e=>this.normalizeRawEventProjectIdentity(e)),i=[];return await this.enqueueRawSessionWrite(e,async()=>{let t=dI(await this.readSessionRawEventsLocked(e),r,n);await this.replaceRawEventFile(e,t);let a=iI(t);i=aI(a),this.rawEventsCacheBySession.set(e,t),this.compactedRawEventsCacheBySession.set(e,a)}),i}async getSessionRawEvents(e,t=300){return(await this.getSessionRawEventsWithCoverage(e,t)).rawEvents}async getSessionRawEventsWithCoverage(e,t=300){return this.getSessionRawEventsCompactedWithCoverage(e,t)}async getSessionStoredRawEvents(e,t=300){let n=Date.now();if(await this.ready,!this.sessions.has(e))return[];let r=Math.max(1,t),i=this.readSessionRawEventsFromCache(e);if(i!==void 0){let a=i.slice(-r);return this.logDebug(`stored-raw-read`,{sessionId:e,limit:t,normalizedLimit:r,cacheHit:!0,rawEventCount:i.length,returnedEventCount:a.length,totalDurationMs:Date.now()-n}),a}let a=[],o=0,s=Date.now();return await this.enqueueWrite(async()=>{o=Date.now()-s,a=(await this.readSessionRawEventsLocked(e)).slice(-r)}),this.logDebug(`stored-raw-read`,{sessionId:e,limit:t,normalizedLimit:r,cacheHit:!1,queueWaitDurationMs:o,returnedEventCount:a.length,totalDurationMs:Date.now()-n}),a}async getSessionRawEventsCompacted(e,t=300){return(await this.getSessionRawEventsCompactedWithCoverage(e,t)).rawEvents}async getSessionRawEventsCompactedWithCoverage(e,t=300){let n=Date.now();if(await this.ready,!this.sessions.has(e))return{rawEvents:[],coveredToRawSeq:null};let r=Math.max(1,t),i=this.readSessionRawEventsCompactedWithCoverageFromCache(e);if(i!==void 0){let a=nI(i,r);return this.logDebug(`compacted-read`,{sessionId:e,limit:t,normalizedLimit:r,cacheHit:!0,compactedEventCount:i.rawEvents.length,returnedEventCount:a.rawEvents.length,coveredToRawSeq:a.coveredToRawSeq,totalDurationMs:Date.now()-n}),a}let a={rawEvents:[],coveredToRawSeq:null},o=0,s=Date.now();return await this.enqueueWrite(async()=>{o=Date.now()-s,a=nI(await this.readSessionRawEventsCompactedWithCoverageLocked(e),r)}),this.logDebug(`compacted-read`,{sessionId:e,limit:t,normalizedLimit:r,cacheHit:!1,queueWaitDurationMs:o,returnedEventCount:a.rawEvents.length,coveredToRawSeq:a.coveredToRawSeq,totalDurationMs:Date.now()-n}),a}async getSessionRawEventsSinceSeq(e,t,n=2e3){if(await this.ready,!this.sessions.has(e))return[];let r=Math.max(1,n),i=this.readSessionRawEventsFromCache(e);if(i!==void 0)return Um(i.filter(e=>e.rawSeq>t)).slice(0,r);let a=[];return await this.enqueueWrite(async()=>{a=Um((await this.readSessionRawEventsLocked(e)).filter(e=>e.rawSeq>t)).slice(0,r)}),a}async getSessionRawSeqRange(e){if(await this.ready,!this.sessions.has(e))return null;let t=this.readSessionRawEventsFromCache(e);if(t!==void 0)return tI(t);let n=null;return await this.enqueueWrite(async()=>{n=tI(await this.readSessionRawEventsLocked(e))}),n}async loadFromDisk(){await d.default.mkdir(this.eventsDir,{recursive:!0});try{let e=await d.default.readFile(this.indexPath,`utf8`),t=JSON.parse(e);if(t.v!==1||!Array.isArray(t.sessions))return;for(let e of t.sessions)if(e?.id&&e?.provider&&e?.createdAt&&e?.updatedAt&&e?.status&&e?.projectId&&e?.projectPath){if(e.projectId!==e.projectPath)throw Error(`Legacy session project ids are no longer supported in ${this.indexPath}; clear the session history store and restart the gateway.`);this.sessions.set(e.id,{...e,status:`idle`,interactionLockReason:void 0,pendingApprovals:0,pendingUserInputs:0,pendingActions:0})}}catch(e){if(e.code!==`ENOENT`)throw e}}async persistIndex(){await d.default.mkdir(this.baseDir,{recursive:!0});let e={v:1,sessions:[...this.sessions.values()].sort((e,t)=>{let n=e.updatedAt||e.createdAt;return(t.updatedAt||t.createdAt).localeCompare(n)})};await d.default.writeFile(this.indexPath,`${JSON.stringify(e,null,2)}\n`,`utf8`)}enqueueWrite(e){return this.writeQueue=this.writeQueue.then(e,e),this.writeQueue}async enqueueRawSessionWrite(e,t){this.incrementPendingRawMutation(e);try{let e;return await this.enqueueWrite(async()=>{e=await t()}),e}finally{this.decrementPendingRawMutation(e)}}async appendRawEventLine(e){let t=p.default.join(this.eventsDir,`${e.sessionId}.raw.jsonl`),n=`${eI(e)}\n`;await d.default.appendFile(t,n,`utf8`)}async replaceRawEventFile(e,t){let n=p.default.join(this.eventsDir,`${e}.raw.jsonl`),r=t.map(e=>eI(e)).join(`
531
+ `);await rI(n,r?`${r}\n`:``)}appendRawEventToCache(e){let t=this.rawEventsCacheBySession.get(e.sessionId),n=t?.[t.length-1];t&&t.push(e);let r=this.compactedRawEventsCacheBySession.get(e.sessionId);if(r){if(lI(e)){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}if(n&&cI(e,n)<0){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}sI(r,e)}}async readSessionRawEventsCompactedLocked(e){return(await this.readSessionRawEventsCompactedWithCoverageLocked(e)).rawEvents}async readSessionRawEventsCompactedWithCoverageLocked(e){let t=this.compactedRawEventsCacheBySession.get(e);if(t)return oI(t);let n=Date.now(),r=await this.readSessionRawEventsLocked(e),i=Date.now(),a=iI(r),o=Date.now()-i;this.compactedRawEventsCacheBySession.set(e,a);let s=oI(a);return this.logDebug(`compact-build`,{sessionId:e,rawEventCount:r.length,compactedEventCount:s.rawEvents.length,coveredToRawSeq:s.coveredToRawSeq,compactDurationMs:o,totalDurationMs:Date.now()-n}),s}async readSessionRawEventsLocked(e){let t=this.rawEventsCacheBySession.get(e);if(t)return t;let n=p.default.join(this.eventsDir,`${e}.raw.jsonl`),r,i=Date.now();try{r=await d.default.readFile(n,`utf8`)}catch(t){if(t.code===`ENOENT`)return this.rawEventsCacheBySession.set(e,[]),this.logDebug(`raw-file-read`,{sessionId:e,fileExists:!1,readDurationMs:Date.now()-i,totalDurationMs:Date.now()-i}),[];throw t}let a=Date.now()-i,o=Date.now(),s=r.split(`
532
+ `).map(e=>e.trim()).filter(Boolean),c=[];for(let e of s)try{let t=JSON.parse(e);if(!QF(t)||t.kind!==`provider.raw`)continue;let n=$F(t.rawSeq);c.push({value:t,...n===void 0?{}:{rawSeq:n}})}catch{}let l=Date.now()-o;if(c.length===0)return this.rawEventsCacheBySession.set(e,[]),this.logDebug(`raw-file-read`,{sessionId:e,fileExists:!0,fileBytes:Buffer.byteLength(r,`utf8`),lineCount:s.length,parsedEventCount:0,readDurationMs:a,parseDurationMs:l,totalDurationMs:Date.now()-i}),[];let u=Date.now(),f=c.some(e=>e.rawSeq===void 0),m=c.map((e,t)=>({...e.value,rawSeq:e.rawSeq??t+1})),h=[];for(let t of m){let n=Kl.safeParse(t);if(n.success){let t=this.normalizeRawEventProjectIdentity(n.data);if(t.projectId!==n.data.projectId)throw Error(`Legacy raw event project ids are no longer supported for session ${e}; clear the session history store and restart the gateway.`);h.push(t)}}let g=Date.now()-u,_=0;if(f){let e=Date.now(),t=h.map(e=>eI(e)).join(`
533
+ `),r=t?`${t}\n`:``;await d.default.writeFile(n,r,`utf8`),_=Date.now()-e}return this.rawEventsCacheBySession.set(e,h),this.logDebug(`raw-file-read`,{sessionId:e,fileExists:!0,fileBytes:Buffer.byteLength(r,`utf8`),lineCount:s.length,parsedEventCount:c.length,normalizedEventCount:h.length,needsBackfill:f,readDurationMs:a,parseDurationMs:l,normalizeDurationMs:g,backfillWriteDurationMs:_,totalDurationMs:Date.now()-i}),h}normalizeRawEventProjectIdentity(e){let t=this.sessions.get(e.sessionId);return!t||!t.projectId||e.projectId===t.projectId?e:{...e,projectId:t.projectId}}readSessionRawEventsFromCache(e){if(!this.hasPendingRawMutation(e))return this.rawEventsCacheBySession.get(e)}readSessionRawEventsCompactedFromCache(e){return this.readSessionRawEventsCompactedWithCoverageFromCache(e)?.rawEvents}readSessionRawEventsCompactedWithCoverageFromCache(e){if(this.hasPendingRawMutation(e))return;let t=this.compactedRawEventsCacheBySession.get(e);if(t)return oI(t);let n=this.rawEventsCacheBySession.get(e);if(!n)return;let r=Date.now(),i=iI(n);this.compactedRawEventsCacheBySession.set(e,i);let a=oI(i);return this.logDebug(`compact-build-from-raw-cache`,{sessionId:e,rawEventCount:n.length,compactedEventCount:a.rawEvents.length,coveredToRawSeq:a.coveredToRawSeq,totalDurationMs:Date.now()-r}),a}incrementPendingRawMutation(e){this.pendingRawMutationsBySession.set(e,(this.pendingRawMutationsBySession.get(e)??0)+1)}decrementPendingRawMutation(e){let t=(this.pendingRawMutationsBySession.get(e)??0)-1;if(t>0){this.pendingRawMutationsBySession.set(e,t);return}this.pendingRawMutationsBySession.delete(e)}hasPendingRawMutation(e){return(this.pendingRawMutationsBySession.get(e)??0)>0}};function ZF(e){let t=e.projectPath?.trim()||e.projectId;return t===e.projectId?e:{...e,projectId:t}}function QF(e){return typeof e==`object`&&!!e}function $F(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<=0))return e}function eI(e){let t=new WeakSet;return JSON.stringify(e,(e,n)=>{if(typeof n==`bigint`)return n.toString();if(typeof n==`function`)return`[Function ${n.name||`anonymous`}]`;if(typeof n==`object`&&n){if(t.has(n))return`[Circular]`;t.add(n)}return n})}function tI(e){if(e.length===0)return null;let t=null,n=null;for(let r of e)t=t===null?r.rawSeq:Math.min(t,r.rawSeq),n=n===null?r.rawSeq:Math.max(n,r.rawSeq);return t===null||n===null?null:{min:t,max:n}}function nI(e,t){return{rawEvents:e.rawEvents.slice(-Math.max(1,t)),coveredToRawSeq:e.coveredToRawSeq}}async function rI(e,t){await d.default.mkdir(p.default.dirname(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;try{await d.default.writeFile(n,t,`utf8`),await d.default.rename(n,e)}catch(e){try{await d.default.rm(n,{force:!0})}catch{}throw e}}function iI(e){let t=Hm(e),n=t.map(e=>e),r=new Map;for(let[e,t]of n.entries()){let n=Gm(t);n&&r.set(n.key,e)}return{slots:n,indexByKey:r,dense:t,coveredToRawSeq:tI(e)?.max??null}}function aI(e){return e.dense||=e.slots.filter(e=>e!==null),e.dense}function oI(e){return{rawEvents:aI(e),coveredToRawSeq:e.coveredToRawSeq}}function sI(e,t){e.coveredToRawSeq=e.coveredToRawSeq===null?t.rawSeq:Math.max(e.coveredToRawSeq,t.rawSeq);let n=Gm(t);if(!n){e.slots.push(t),e.dense=null;return}let r=e.indexByKey.get(n.key);if(r===void 0){e.slots.push(t),e.indexByKey.set(n.key,e.slots.length-1),e.dense=null;return}let i=e.slots[r];if(!i){e.slots.push(t),e.indexByKey.set(n.key,e.slots.length-1),e.dense=null;return}let a=Km(i,t);if(!a){e.slots.push(t),e.indexByKey.set(n.key,e.slots.length-1),e.dense=null;return}e.slots[r]=null,e.slots.push(a),e.indexByKey.set(n.key,e.slots.length-1),e.dense=null}function cI(e,t){let n=e.ts.localeCompare(t.ts);return n===0?e.eventId.localeCompare(t.eventId):n}function lI(e){if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=QF(e.payload.raw)?e.payload.raw:{},n=QF(t.message)?t.message:{};return(typeof n.method==`string`?n.method:typeof t.method==`string`?t.method:``)===`item/completed`}function uI(e){if(lI(e)||e.type===`turn.completed`||e.type===`turn.failed`)return!0;if(e.type!==`native.raw`)return!1;let t=QF(e.payload.raw)?e.payload.raw:{},n=QF(t.message)?t.message:{},r=typeof n.method==`string`?n.method:typeof t.method==`string`?t.method:``;return r===`turn/completed`||r===`turn/failed`||r===`turn/interrupted`}function dI(e,t,n){if(n?.replaceMissing)return fI(e,t,n);let r=[...e].sort(gI),i=new Map,a=1;for(let[e,t]of r.entries())i.set(t.eventId,e),a=Math.max(a,t.rawSeq+1);for(let e of t){let t=i.get(e.eventId);if(t!==void 0){let n=r[t];n&&pI(n,e)&&(r[t]=hI(n,e));continue}let n={...e,rawSeq:a};a+=1,i.set(n.eventId,r.length),r.push(n)}return _I(r.sort(gI)).sort(gI)}function fI(e,t,n){let r=new Map(e.map(e=>[e.eventId,e])),i=new Set(t.map(e=>e.eventId)),a=n?.baseEventIds?new Set(n.baseEventIds):null,o=a?e.filter(e=>!a.has(e.eventId)&&!i.has(e.eventId)):[],s=[...t,...o].sort(gI),c=1;for(let t of e)c=Math.max(c,t.rawSeq+1);return _I(s.map(e=>{let t=r.get(e.eventId);if(t)return pI(t,e)?hI(t,e):{...e,rawSeq:t.rawSeq};let n={...e,rawSeq:c};return c+=1,n})).sort(gI)}function pI(e,t){return mI(e)&&mI(t)}function mI(e){return e.type===`native.raw`?CI((QF(e.payload.raw)?e.payload.raw:{}).source)===`codex.history.thread_read`:!1}function hI(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function gI(e,t){let n=e.rawSeq-t.rawSeq;if(n!==0)return n;let r=e.ts.localeCompare(t.ts);return r===0?e.eventId.localeCompare(t.eventId):r}function _I(e){let t=Wm(e).filter(e=>!vI(e)),n=new Set;for(let e of t){let t=yI(e);t&&n.add(t)}return n.size===0?t:t.filter(e=>{let t=bI(e);return!t||!n.has(t)})}function vI(e){let t=QF(e.payload.raw)?e.payload.raw:{},n=CI(t.source)??``;if(e.type!==`native.raw`&&(t.historyReplay===!0||n.startsWith(`codex.history.thread_read`)))return!0;if(e.type!==`native.raw`||n!==`codex.app_server`)return!1;let r=QF(t.message)?t.message:{};return CI(r.method)??CI(t.method)?!1:QF((QF(r.result)?r.result:{}).turn)}function yI(e){if(e.type===`item.completed`){let t=QF(e.payload.raw)?e.payload.raw:{},n=QF(t.item)?t.item:{};return xI(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=QF(e.payload.raw)?e.payload.raw:{},n=QF(t.message)?t.message:{},r=QF(n.params)?n.params:{};if((CI(n.method)??CI(t.method))!==`item/completed`)return null;let i=QF(r.item)?r.item:{};return xI(e.sessionId,i)}function bI(e){if(e.type===`item.updated`){let t=QF(e.payload.raw)?e.payload.raw:{},n=QF(t.item)?t.item:{},r=CI(n.original_method)??CI(n.originalMethod)??``,i=QF(n.payload)?n.payload:{};return!(typeof i.delta==`string`||typeof i.output_delta==`string`||typeof i.outputDelta==`string`||typeof n.output_delta==`string`||typeof n.outputDelta==`string`||typeof n.text==`string`)&&!SI(r)?null:xI(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=QF(e.payload.raw)?e.payload.raw:{},n=QF(t.message)?t.message:{},r=QF(n.params)?n.params:{};if(!SI(CI(n.method)??CI(t.method)??``))return null;let i=QF(r.msg)?r.msg:{},a=CI(r.itemId)??CI(r.item_id)??CI(i.itemId)??CI(i.item_id);return a?`${e.sessionId}|${a}`:null}function xI(e,t){let n=CI(t.id)??CI(t.item_id)??CI(t.itemId);return n?`${e}|${n}`:null}function SI(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function CI(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function wI(e){return!e||e.providerMode!==`native`?!1:e.interactionLockReason===`external_turn_running`?!0:e.status!==`running`}const TI=e=>e.filter(e=>!(e.kind===`system`&&e.title===`Turn Usage`)),EI=(e,t)=>e.find(e=>e.itemId===t||e.id===t)??null,DI=e=>e.kind!==`tool_card`&&e.kind!==`file_change_card`&&e.kind!==`terminal_card`||e.status!==void 0||`deferredDetail`in e&&e.deferredDetail!==void 0?null:e.itemId??e.id,OI=e=>{let t=TI(sm(e.sessionId,e.rawEvents,[]));return{timelineItems:Uo({rawEvents:e.rawEvents,messages:t,deferCompletedToolDetails:!1}).timelineItems,lastRawSeq:e.rawEvents[e.rawEvents.length-1]?.rawSeq??null}};async function kI(e){if(e.readableItemDetailLookup)return e.readableItemDetailLookup.getReadableItemDetailResult({projectId:e.projectId,sessionId:e.sessionId,itemId:e.itemId});let t=await e.sessionManager.getProjectSessionRawEvents(e.projectId,e.sessionId,2**53-1),n=EI(OI({sessionId:e.sessionId,rawEvents:t}).timelineItems,e.itemId);return n?{item:n}:null}function AI(e,t){if(e&&e!==t)throw PT()}async function jI(e){let t=MI(e.authService,e.refreshToken);e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:NI(t)},`auth refresh attempt`);try{let t=await e.execute(),n=MI(e.authService,e.refreshToken),r=MI(e.authService,t.refreshToken);return e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshedDeviceId:t.deviceId,previousRefreshToken:NI(n),nextRefreshToken:NI(r)},`auth refresh succeeded`),t}catch(t){let n=MI(e.authService,e.refreshToken);throw e.logger?.warn?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:NI(n),error:PI(t)},`auth refresh failed`),t}}function MI(e,t){return e.inspectRefreshToken?.(t)??{tokenRecordState:`missing`}}function NI(e){return{claimDeviceId:e.claimDeviceId??null,claimExpAt:e.claimExpAt??null,claimIssuedAt:e.claimIssuedAt??null,claimJtiSuffix:FI(e.claimJti),claimType:e.claimType??null,latestActiveTokenCreatedAt:e.latestActiveTokenCreatedAt??null,latestActiveTokenJtiSuffix:FI(e.latestActiveTokenJti),tokenRecordCreatedAt:e.tokenRecordCreatedAt??null,tokenRecordDeviceId:e.tokenRecordDeviceId??null,tokenRecordRevokedAt:e.tokenRecordRevokedAt??null,tokenRecordState:e.tokenRecordState}}function PI(e){return kT(e)?{code:e.code,message:String(e),status:e.status}:e instanceof Error?{message:e.message,name:e.name}:{message:String(e)}}function FI(e){return e?e.slice(-8):null}function II(e,t,n,r){if(!r)return t;let i={gatewayId:t.gatewayId,deviceId:t.deviceId,mobilePublicKey:r.publicKey,pairingContext:{pairingCode:LI(n),signedAt:new Date().toISOString()}};return{...t,gatewayIdentity:e.identity,pairingConfirmation:hh(e.identity,e.privateKeyPem,i)}}function LI(e){return e.replace(/\s+/gu,``).toUpperCase()}async function RI(e,t){try{let n=np.parse(e);switch(n.method){case`auth.refresh`:{let e=await jI({authService:t.authService,execute:()=>t.authService.refreshAccessToken(n.params.refreshToken),logger:t.logger,refreshToken:n.params.refreshToken,requestedDeviceId:n.params.deviceId??t.relayDeviceId,source:`relay_rpc`});return AI(n.params.deviceId??t.relayDeviceId,e.deviceId),rp.parse({method:n.method,result:e})}case`projects.list`:{let e=await t.sessionManager.listProjects();return rp.parse({method:n.method,result:{projects:e}})}case`codex.accounts.get`:{let e=await t.sessionManager.getCodexAccounts();return rp.parse({method:n.method,result:e})}case`codex.accounts.save`:{let e=await t.sessionManager.saveCurrentCodexAccount();return rp.parse({method:n.method,result:e})}case`codex.accounts.switch`:{let e=await t.sessionManager.switchCodexAccount(n.params.accountId);return rp.parse({method:n.method,result:e})}case`codex.accounts.delete`:{let e=await t.sessionManager.deleteSavedCodexAccount(n.params.accountId);return rp.parse({method:n.method,result:e})}case`gateway.settings.get`:return rp.parse({method:n.method,result:t.gatewaySettings.get()});case`gateway.settings.update`:{let e=await t.gatewaySettings.update(n.params);return rp.parse({method:n.method,result:e})}case`gateway.update.get`:{let e=await t.updateService.getOrCheckInfo(`mobile`);return rp.parse({method:n.method,result:e})}case`gateway.update.check`:{let e=await t.updateService.checkForUpdates(n.params.requestedBy??`mobile`);return rp.parse({method:n.method,result:e})}case`codex.appServer.restart`:{let e=await t.sessionManager.restartCodexAppServer();return rp.parse({method:n.method,result:e})}case`gateway.update.apply`:{let e=await t.updateService.applyUpdate(n.params.requestedBy??`mobile`);return rp.parse({method:n.method,result:e})}case`projects.discovery.get`:{let e=await t.projectDiscoveryService.getProjects();return rp.parse({method:n.method,result:e})}case`projects.discovery.refresh`:{let e=await t.projectDiscoveryService.refreshProjects();return rp.parse({method:n.method,result:e})}case`projects.create`:{let e=await t.sessionManager.createProject({path:n.params.path,title:n.params.title});return rp.parse({method:n.method,result:{project:e}})}case`projects.delete`:if(!await t.sessionManager.deleteProject(n.params.projectId))throw BI(n.method,`NOT_FOUND`,404,`Project not found`);return rp.parse({method:n.method,result:{removed:!0}});case`workspace.directories.list`:{let e=await t.fsService.listDirectoriesUnrestricted(n.params.path,n.params.limit??200);return rp.parse({method:n.method,result:e})}case`workspace.directories.create`:{let e=await t.fsService.createDirectoryUnrestricted(n.params.path,n.params.name,200);return rp.parse({method:n.method,result:e})}case`workspace.entries.list`:{let e=await t.workspaceFileService.listEntries(n.params.locator,n.params.limit??200);return rp.parse({method:n.method,result:e})}case`workspace.files.resolve`:{let e=await t.workspaceFileService.resolveFile(n.params.locator);return rp.parse({method:n.method,result:e})}case`workspace.files.readText`:{let e=await t.workspaceFileService.readTextFile(n.params.locator,{startLine:n.params.startLine,maxLines:n.params.maxLines,maxBytes:n.params.maxBytes});return rp.parse({method:n.method,result:e})}case`workspace.files.preparePreview`:{let e=t.relayPreviewBaseUrl?.trim(),r=t.gatewayId?.trim();if(!e||!r)throw BI(n.method,`BAD_REQUEST`,400,`Relay preview base url is not configured`);let i=await t.workspaceFileService.preparePreview(n.params.locator,{deviceId:t.relayDeviceId,disposition:n.params.disposition,buildPreviewUrl:t=>`${e.replace(/\/+$/,``)}/api/gateways/${encodeURIComponent(r)}/workspace/files/content/${encodeURIComponent(t)}`});return rp.parse({method:n.method,result:i})}case`sessions.list`:{let e=await t.sessionManager.listProjectSessions(n.params.projectId,n.params.status??`all`,{syncExternal:n.params.syncExternal});return rp.parse({method:n.method,result:{sessions:e}})}case`sessions.discovery.list`:{let e=await t.projectDiscoveryService.listProjectSessions(n.params.projectPath);return rp.parse({method:n.method,result:e})}case`sessions.get`:{let e=await t.sessionManager.getProjectSessionSummary(n.params.projectId,n.params.sessionId);if(!e)throw BI(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return rp.parse({method:n.method,result:{session:e}})}case`sessions.config.get`:{let e=await t.sessionManager.getProjectSessionConfig(n.params.projectId,n.params.sessionId);if(!e)throw BI(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return rp.parse({method:n.method,result:{session:e}})}case`sessions.history.sync`:{let e=await t.sessionManager.syncProjectSessionHistory(n.params.projectId,n.params.sessionId);return e.historyUpdated&&await t.refreshDetailSessionSnapshots?.({projectId:n.params.projectId,sessionId:n.params.sessionId,reason:`explicit_history_sync`,refreshMode:e.refreshMode,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}),rp.parse({method:n.method,result:{session:e.session,rawEventCount:e.rawEvents.length,historyUpdated:e.historyUpdated,statusChanged:e.statusChanged,refreshMode:e.refreshMode,...e.fromRawSeq===void 0?{}:{fromRawSeq:e.fromRawSeq},...e.toRawSeq===void 0?{}:{toRawSeq:e.toRawSeq}}})}case`sessions.rawEvents.list`:{let e=n.params.limit===`all`?2**53-1:n.params.limit,r=await t.buildRawEventsListResult({sessionManager:t.sessionManager,projectId:n.params.projectId,sessionId:n.params.sessionId,limit:e,fromRawSeqExclusive:n.params.fromRawSeqExclusive,detailLevel:n.params.detailLevel,requestSource:`rpc`});return rp.parse({method:n.method,result:r})}case`sessions.readableItem.get`:{let e=await kI({sessionManager:t.sessionManager,readableItemDetailLookup:t.readableItemDetailLookup,projectId:n.params.projectId,sessionId:n.params.sessionId,itemId:n.params.itemId});if(!e)throw BI(n.method,`NOT_FOUND`,404,`Readable item ${n.params.itemId} not found`);return rp.parse({method:n.method,result:e})}case`providers.capabilities.get`:{let e=Date.now();t.logger?.info?.({relayDeviceId:t.relayDeviceId??null,rpcMethod:n.method,provider:n.params.provider,projectId:n.params.projectId??null,agentVersion:n.params.agentVersion??null},`relay rpc provider capabilities request started`);try{let r=await t.sessionManager.getProviderCapabilities(n.params.provider,n.params.projectId??void 0,n.params.agentVersion??void 0),i=r&&typeof r==`object`&&!Array.isArray(r)?r:null;return t.logger?.info?.({relayDeviceId:t.relayDeviceId??null,rpcMethod:n.method,provider:n.params.provider,projectId:n.params.projectId??null,agentVersion:n.params.agentVersion??null,durationMs:Date.now()-e,source:typeof i?.source==`string`?i.source:void 0,modelCount:Array.isArray(i?.models)?i.models.length:void 0},`relay rpc provider capabilities request completed`),rp.parse({method:n.method,result:{capabilities:r}})}catch(r){throw t.logger?.warn?.({relayDeviceId:t.relayDeviceId??null,rpcMethod:n.method,provider:n.params.provider,projectId:n.params.projectId??null,agentVersion:n.params.agentVersion??null,durationMs:Date.now()-e,err:r},`relay rpc provider capabilities request failed`),r}}case`providers.execution.update`:{let e=await t.sessionManager.updateProviderExecutionDefaults(n.params);return rp.parse({method:n.method,result:{defaults:e}})}case`agents.config.get`:{let e=await t.sessionManager.getAgentConfig(n.params.provider,{projectId:n.params.projectId??void 0,agentVersion:n.params.agentVersion??void 0});return rp.parse({method:n.method,result:e})}case`devices.list`:return rp.parse({method:n.method,result:{devices:t.authService.listDevices()}});case`devices.revoke`:if(!await t.authService.revokeDevice(n.params.deviceId))throw BI(n.method,`NOT_FOUND`,404,`Device ${n.params.deviceId} not found`);return rp.parse({method:n.method,result:{revoked:!0}});default:{let e=n;throw BI(void 0,`INTERNAL`,500,`Unhandled relay RPC method: ${JSON.stringify(e)}`)}}}catch(e){throw zI(e)}}function zI(e){if(kT(e))switch(e.code){case`REFRESH_TOKEN_REVOKED`:case`DEVICE_REVOKED`:case`REFRESH_TOKEN_DEVICE_MISMATCH`:return BI(`UNAUTHORIZED`,e.status,String(e),e.details);case`PROJECT_NOT_FOUND`:case`DISCOVERED_PROJECT_NOT_FOUND`:case`PROJECT_SESSION_NOT_FOUND`:case`SESSION_NOT_FOUND`:case`CODEX_ACCOUNT_NOT_FOUND`:return BI(`NOT_FOUND`,e.status,String(e),e.details);case`SESSION_TURN_CONFLICT`:case`PROJECT_DELETE_CONFLICT`:case`CODEX_APP_SERVER_RESTART_CONFLICT`:return BI(`BAD_REQUEST`,e.status,String(e),e.details);default:return BI(e.status>=500?`INTERNAL`:`BAD_REQUEST`,e.status,String(e),e.details)}let t=ap.safeParse(e);if(t.success)return t.data;let n=ip.safeParse(e);if(n.success)return BI(void 0,n.data.code,n.data.status,n.data.message,n.data.details);if(e&&typeof e==`object`&&`code`in e&&`status`in e&&`message`in e&&typeof e.code==`string`&&typeof e.status==`number`&&typeof e.message==`string`){let t=e;return BI(t.code,t.status,t.message,t.details)}let r=String(e);return e instanceof Error&&e.name===`ZodError`?BI(`BAD_REQUEST`,400,r):VI(e)?BI(`UNAUTHORIZED`,401,r):HI(r)?BI(`BAD_REQUEST`,400,r):BI(`INTERNAL`,500,r)}function BI(e,t,n,r,i){let a=typeof t==`string`,o=a?e:void 0,s=a?t:e,c=a?n:t,l=a?r:n,u=a?i:r;return ap.parse({...o?{method:o}:{},code:s,status:c,message:l,...u===void 0?{}:{details:u}})}function VI(e){return kT(e)&&(e.code===`REFRESH_TOKEN_REVOKED`||e.code===`DEVICE_REVOKED`||e.code===`REFRESH_TOKEN_DEVICE_MISMATCH`)||YT(e)}function HI(e){let t=e.trim();return t===`Invalid provider`||t.startsWith(`Invalid provider:`)||t.startsWith(`Project path must be absolute:`)||t.startsWith(`Project path does not exist:`)||t.startsWith(`Project path is not a directory:`)||t.startsWith(`ZodError:`)}function UI(e,t){return e.length===0?[]:t===void 0?[...e]:e.filter(e=>e.rawSeq>t)}function WI(e){let t=e.coveredToRawSeq??void 0;for(let n of e.rawEvents)(t===void 0||n.rawSeq>t)&&(t=n.rawSeq);return t}function GI(e){return{baseRawEvents:Hm(e.rawEvents.filter(t=>t.rawSeq<=e.cursorRawSeq)),nextRawEvents:Hm(e.rawEvents)}}function KI(e,t){return t&&`kind`in t&&t.kind===`bootstrapping`?t:{kind:`bootstrapping`,sessionId:e,previousReadyState:t??null,queuedEnvelopes:[]}}function qI(e,t){let n=e.previousReadyState;if(!n)return{previousReadyState:null,nextReadyState:null,replayedEnvelopes:[]};let r=UI(e.queuedEnvelopes,WI(n)),i=n;for(let e of r)i=t(i,e);return{previousReadyState:n,nextReadyState:i,replayedEnvelopes:r}}function JI(e){return{v:`1.0`,kind:`session.stream.sync`,type:`session.stream.sync`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`stream_sync_${DT(12)}`,ts:new Date().toISOString(),payload:{raw:{decision:e.decision,reason:e.reason,snapshotId:e.snapshotId,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}}}}function YI(e){return{v:`1.0`,kind:`session.stream.snapshot.chunk`,type:`session.stream.snapshot.chunk`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`stream_snapshot_${e.snapshotId}_${e.chunkIndex}`,ts:new Date().toISOString(),payload:{raw:{snapshotId:e.snapshotId,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,events:e.events,...e.sessionSummary?{sessionSummary:e.sessionSummary}:{}},...e.timelineItems?{readable:{snapshotId:e.snapshotId,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,...e.timelineItems?{timelineItems:e.timelineItems}:{}}}:{}}}}function XI(e){return{v:`1.0`,kind:`session.readable.snapshot.chunk`,type:`session.readable.snapshot.chunk`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`readable_snapshot_${e.snapshotId}_${e.chunkIndex}`,ts:new Date().toISOString(),payload:{readable:{snapshotId:e.snapshotId,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,timelineItems:e.timelineItems,...e.pendingApprovals?{pendingApprovals:e.pendingApprovals}:{},...e.pendingUserInputs?{pendingUserInputs:e.pendingUserInputs}:{},...e.contextUsage===void 0?{}:{contextUsage:e.contextUsage},...e.sessionSummary?{sessionSummary:e.sessionSummary}:{}}}}}function ZI(e){return{v:`1.0`,kind:`session.readable.delta`,type:`session.readable.delta`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`readable_delta_${e.sessionId}_${e.toRawSeq}`,ts:new Date().toISOString(),payload:{readable:{...e.fromRawSeq===void 0?{}:{fromRawSeq:e.fromRawSeq},toRawSeq:e.toRawSeq,timelineUpserts:e.timelineUpserts,timelineRemovals:e.timelineRemovals,...e.timelineTextDeltaPatches&&e.timelineTextDeltaPatches.length>0?{timelineTextDeltaPatches:e.timelineTextDeltaPatches}:{},...e.pendingApprovalUpserts&&e.pendingApprovalUpserts.length>0?{pendingApprovalUpserts:e.pendingApprovalUpserts}:{},...e.pendingApprovalRemovals&&e.pendingApprovalRemovals.length>0?{pendingApprovalRemovals:e.pendingApprovalRemovals}:{},...e.pendingUserInputUpserts&&e.pendingUserInputUpserts.length>0?{pendingUserInputUpserts:e.pendingUserInputUpserts}:{},...e.pendingUserInputRemovals&&e.pendingUserInputRemovals.length>0?{pendingUserInputRemovals:e.pendingUserInputRemovals}:{},...e.sessionSummary?{sessionSummary:e.sessionSummary}:{},...e.contextUsage===void 0?{}:{contextUsage:e.contextUsage}}}}}function QI(e){return{v:`1.0`,kind:`session.external.update`,type:`session.external.update`,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:`session_external_update_${DT(12)}`,ts:new Date().toISOString(),payload:{raw:{updatedAt:e.updatedAt,status:e.status,interactionLockReason:e.interactionLockReason,refreshMode:e.refreshMode,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq,historyUpdated:e.historyUpdated,statusChanged:e.statusChanged,...e.sessionSummary?{sessionSummary:e.sessionSummary}:{}}}}}function $I(e,t){if(e.length===0)return[[]];let n=Math.max(1,Math.floor(t)),r=[];for(let t=0;t<e.length;t+=n)r.push(e.slice(t,t+n));return r}const eL=1e3,tL=(e,t)=>`${e}::${t}`,nL=e=>e.purpose===`detail_view`&&e.bootstrapMode===`readable`,rL=e=>{let t=new Map;for(let n of e)t.set(n.sessionId,n);return[...t.values()]},iL=e=>{let t;for(let n of e)(t===void 0||n.rawSeq>t)&&(t=n.rawSeq);return t},aL=e=>e[e.length-1]?.rawSeq,oL=(e,t)=>{let n=iL(e);return t==null?n??null:n===void 0?t:Math.max(t,n)},sL=e=>oL(e.rawEvents,e.coveredToRawSeq)??void 0,cL=e=>{let t=oL(e.rawEvents,e.coveredToRawSeq);return{kind:`ready`,sessionId:e.target.sessionId,projectId:e.target.projectId,provider:e.target.provider,detailLevel:e.target.detailLevel,rawEvents:[...e.rawEvents],coveredToRawSeq:t,detailTransportRawEvents:[...e.detailTransportRawEvents??e.rawEvents],contextUsage:e.contextUsage??null,timelineItems:[...e.timelineItems],pendingApprovals:[...e.pendingApprovals],pendingUserInputs:[...e.pendingUserInputs]}},lL=e=>typeof e==`object`&&e?e:{},uL=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}},dL=e=>{if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=lL(n),r=uL(e,`id`),i=uL(e,`header`),a=uL(e,`question`);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=lL(e),n=uL(t,`label`);if(!n)return null;let r=uL(t,`description`)??n,i=uL(t,`markdown`);return{label:n,description:r,...i?{markdown:i}:{}}}).filter(e=>e!==null):null;t.push({id:r,header:i,question:a,multiSelect:e.multiSelect===!0,isOther:e.isOther===!0,isSecret:e.isSecret===!0,options:o})}return t},fL=(e,t)=>{let n=om(e,t),r=new Map,i=new Map;for(let e of n){if(e.type===`tool.permission.requested`){let t=lL(e.payload.raw),n=uL(t,`requestId`,`request_id`);if(!n)continue;let i=lL(t.rawParams??t.raw_params),a=lL(i.networkApprovalContext??i.network_approval_context);r.set(n,{requestId:n,sessionId:e.sessionId,...uL(t,`toolName`,`tool_name`)?{toolName:uL(t,`toolName`,`tool_name`)}:{},...uL(t,`reason`)?{reason:uL(t,`reason`)}:{},...uL(i,`command`)?{command:uL(i,`command`)}:{},...uL(i,`cwd`)?{cwd:uL(i,`cwd`)}:{},...uL(i,`grantRoot`,`grant_root`)?{grantRoot:uL(i,`grantRoot`,`grant_root`)}:{},...uL(a,`host`)?{networkHost:uL(a,`host`)}:{},...uL(a,`protocol`)?{networkProtocol:uL(a,`protocol`)}:{},...uL(t,`itemId`,`item_id`)?{itemId:uL(t,`itemId`,`item_id`)}:{},...uL(t,`turnId`,`turn_id`)?{turnId:uL(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`tool.permission.resolved`){let t=uL(lL(e.payload.raw),`requestId`,`request_id`);t&&r.delete(t);continue}if(e.type===`user.input.requested`){let t=lL(e.payload.raw),n=uL(t,`requestId`,`request_id`);if(!n)continue;i.set(n,{requestId:n,sessionId:e.sessionId,questions:dL(t.questions),...uL(t,`itemId`,`item_id`)?{itemId:uL(t,`itemId`,`item_id`)}:{},...uL(t,`turnId`,`turn_id`)?{turnId:uL(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`user.input.resolved`){let t=uL(lL(e.payload.raw),`requestId`,`request_id`);t&&i.delete(t)}}return{pendingApprovals:[...r.values()],pendingUserInputs:[...i.values()]}},pL=e=>{let t=e.rawEventsAlreadyMatchDetailTransport===!0?e.rawEvents:gL({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=e.target.purpose===`detail_view`?Cl({provider:e.target.provider,rawEvents:t}):null,r=e.target.purpose===`detail_view`?TI(sm(e.target.sessionId,t,[])):[],i=e.target.purpose===`detail_view`?Uo({rawEvents:t,messages:r,deferCompletedToolDetails:!0}):{timelineItems:[],consumedMessageIds:[]},a=e.target.purpose===`detail_view`?fL(e.target.sessionId,t):{pendingApprovals:[],pendingUserInputs:[]};return{detailTransportRawEvents:t,contextUsage:n,timelineItems:i.timelineItems,pendingApprovals:a.pendingApprovals,pendingUserInputs:a.pendingUserInputs}},mL=e=>{let t=gL({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=pL({target:e.target,rawEvents:t,rawEventsAlreadyMatchDetailTransport:!0});return cL({target:e.target,rawEvents:e.rawEvents,coveredToRawSeq:e.coveredToRawSeq,detailTransportRawEvents:t,contextUsage:n.contextUsage,timelineItems:n.timelineItems,pendingApprovals:n.pendingApprovals,pendingUserInputs:n.pendingUserInputs})},hL=(e,t)=>{let n=wL(e.rawEvents,t),r=oL(n,sL(e)),i=gL({rawEvents:wL(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),a=pL({target:{sessionId:e.sessionId,provider:e.provider,detailLevel:e.detailLevel,purpose:`detail_view`},rawEvents:i,rawEventsAlreadyMatchDetailTransport:!0});return{...e,rawEvents:n,coveredToRawSeq:r,detailTransportRawEvents:i,contextUsage:a.contextUsage,timelineItems:a.timelineItems,pendingApprovals:a.pendingApprovals,pendingUserInputs:a.pendingUserInputs}},gL=e=>{if(e.detailLevel!==`compact`||e.rawEvents.length===0)return e.rawEvents;let t=_L(e.rawEvents[0]?.sessionId??``,e.rawEvents);return xD(e.rawEvents,e.detailLevel,{preserveIncompleteCommandOutput:!0,additionalCompletedCommandItemKeys:t})},_L=(e,t)=>{if(!e||t.length===0)return new Set;let n=new Set,r=sm(e,t,[]);for(let t of r){if(t.itemType!==`command_execution`||!t.itemId||t.status!==`completed`&&t.status!==`failed`)continue;let r=xL(e,t.itemId);r&&n.add(r)}return n},vL=e=>uL(e,`id`,`itemId`,`item_id`)??null,yL=e=>{if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`)return vL(lL(lL(e.payload.raw).item));if(e.type!==`native.raw`)return null;let t=lL(lL(e.payload.raw).message),n=lL(t.params),r=lL(n.item),i=lL(n.msg);return vL(r)??vL(lL(t.item))??uL(n,`itemId`,`item_id`)??uL(i,`itemId`,`item_id`)??null},bL=e=>{if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=lL(e.payload.raw);return(uL(lL(t.message),`method`)??uL(t,`method`))===`item/completed`},xL=(e,t)=>t?`${e}|${t}`:null,SL=e=>xL(e.sessionId,yL(e)),CL=e=>{let t=SL(e);if(t)return`item:${t}`;let n=Gm(e);return n?`delta:${n.key}`:null},wL=(e,t)=>{let n=[...e],r=SL(t),i=CL(t),a=Gm(t),o=t;if(i&&a)for(let e=n.length-1;e>=0;--e){let r=n[e];if(!r||CL(r)!==i||!Gm(r))continue;let a=Km(r,t);if(a){n[e]=null,o=a;break}}return n.push(o),!r||!bL(t)?n.filter(e=>e!==null):n.filter(e=>e!==null&&(e.eventId===o.eventId||SL(e)!==r||!Gm(e)))},TL=e=>{let t=EL(e);if(!t)return null;let n=vL(t),r=lL(t.payload),i=uL(t,`output_delta`,`outputDelta`)??uL(r,`output_delta`,`outputDelta`);return!n||!i?null:{itemId:n,delta:i}},EL=e=>{if(e.type===`item.updated`){let t=lL(lL(e.payload.raw).item);return DL(t)?t:null}if(e.type!==`native.raw`)return null;let t=lL(e.payload.raw),n=lL(t.message);if((uL(n,`method`)??uL(t,`method`))!==`item/updated`)return null;let r=lL(lL(n.params).item);return DL(r)?r:null},DL=e=>{let t=uL(e,`type`);return t===`commandExecution`||t===`command_execution`},OL=e=>e.includes(`[compact history preview:`),kL=(e,t)=>{let n=TL(t);if(!n)return null;let r=e.timelineItems.findIndex(e=>e.kind===`terminal_card`&&e.itemId===n.itemId&&typeof e.output==`string`);if(r<0)return null;let i=e.timelineItems[r];if(!i||i.kind!==`terminal_card`||OL(i.output))return null;let a=wL(e.rawEvents,t),o=gL({rawEvents:wL(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),s={...i,output:`${i.output}${n.delta}`},c=[...e.timelineItems];c[r]=s;let l=sL(e),u=oL(a,l)??t.rawSeq;return{nextState:{...e,rawEvents:a,coveredToRawSeq:u,detailTransportRawEvents:o,timelineItems:c},messageInput:{provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,fromRawSeq:l,toRawSeq:u,timelineUpserts:[],timelineRemovals:[],timelineTextDeltaPatches:[{id:i.id,field:`output`,delta:n.delta}]}}},AL=e=>Buffer.byteLength(JSON.stringify(XI(e)),`utf8`),jL=e=>{let t=Math.max(1,Math.floor(e.maxChunkBytes??524288)),n=[],r=(t,n)=>AL({provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,snapshotId:e.snapshotId,chunkIndex:t,totalChunks:1,timelineItems:n,pendingApprovals:t===0?e.pendingApprovals:void 0,pendingUserInputs:t===0?e.pendingUserInputs:void 0,contextUsage:t===0?e.contextUsage:void 0,sessionSummary:t===0?e.sessionSummary:void 0});if(e.timelineItems.length===0)return[{timelineItems:[],estimatedByteLength:r(0,[])}];let i=[];for(let a of e.timelineItems){let e=n.length,o=[...i,a],s=r(e,o);if(i.length>0&&s>t){n.push({timelineItems:i,estimatedByteLength:r(e,i)}),i=[a];continue}i=o}return n.push({timelineItems:i,estimatedByteLength:r(n.length,i)}),n},ML=(e,t)=>{let n=new Map(e.map(e=>[e.requestId,JSON.stringify(e)])),r=new Map(t.map(e=>[e.requestId,JSON.stringify(e)]));return{upserts:t.filter(e=>n.get(e.requestId)!==r.get(e.requestId)),removals:e.filter(e=>!r.has(e.requestId)).map(e=>e.requestId)}},NL=(e,t)=>{let n=new Map(e.map(e=>[e.requestId,JSON.stringify(e)])),r=new Map(t.map(e=>[e.requestId,JSON.stringify(e)]));return{upserts:t.filter(e=>n.get(e.requestId)!==r.get(e.requestId)),removals:e.filter(e=>!r.has(e.requestId)).map(e=>e.requestId)}},PL=(e,t,n,r)=>{let i={},a=om(e,[t]),o=a.find(e=>e.type===`thread.title.updated`),s=a.find(e=>e.type===`turn.started`||e.type===`turn.completed`||e.type===`turn.failed`);if(o){let e=uL(lL(o.payload.raw),`title`);e&&(i.title=e)}return s&&(i.updatedAt=s.ts,i.status=s.type===`turn.started`?`running`:`idle`,i.interactionLockReason=void 0,s.type===`turn.started`&&(i.activeStartedAt=s.ts)),n.pendingApprovals.length!==r.pendingApprovals.length&&(i.pendingApprovals=r.pendingApprovals.length),n.pendingUserInputs.length!==r.pendingUserInputs.length&&(i.pendingUserInputs=r.pendingUserInputs.length),n.pendingApprovals.length+n.pendingUserInputs.length!==r.pendingApprovals.length+r.pendingUserInputs.length&&(i.pendingActions=r.pendingApprovals.length+r.pendingUserInputs.length),Object.keys(i).length>0?i:void 0};function FL(e){let t,n=e.previousState;for(let r of e.envelopes){let i=hL(n,r),a=PL(e.sessionId,r,n,i);a&&(t={...t??{},...a}),n=i}return t}const IL=e=>{if(!e)return{stateFound:!1};let t=iL(e.rawEvents),n=aL(e.rawEvents),r=sL(e);return{stateFound:!0,kind:e.kind,sessionId:e.sessionId,projectId:e.projectId,provider:e.provider,detailLevel:e.detailLevel,rawEventCount:e.rawEvents.length,detailTransportRawEventCount:e.detailTransportRawEvents.length,firstRawSeq:e.rawEvents[0]?.rawSeq??null,lastRawSeq:r??null,rawEventMaxRawSeq:t??null,orderedLastRawSeq:n??null,rawSeqOrderMismatch:t!==n,rawSeqCoverageMismatch:r!==t,timelineItemCount:e.timelineItems.length,pendingApprovalCount:e.pendingApprovals.length,pendingUserInputCount:e.pendingUserInputs.length,hasContextUsage:!!e.contextUsage}},LL=e=>e?e.kind===`ready`?IL(e):{stateFound:!0,kind:e.kind,sessionId:e.sessionId,queuedEnvelopeCount:e.queuedEnvelopes.length,previousReadyState:IL(e.previousReadyState)}:{stateFound:!1},RL=(e,t)=>{let n,r,i;try{n=Rc(e.previousState.timelineItems,e.nextState.timelineItems),r=ML(e.previousState.pendingApprovals,e.nextState.pendingApprovals),i=NL(e.previousState.pendingUserInputs,e.nextState.pendingUserInputs)}catch(n){throw t?.(`stream.readable.delta.build.error`,{sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,previousState:IL(e.previousState),nextState:IL(e.nextState),sessionSummaryKeys:e.sessionSummary?Object.keys(e.sessionSummary):[],errorMessage:n instanceof Error?n.message:String(n)}),n}let a=JSON.stringify(e.previousState.contextUsage??null)!==JSON.stringify(e.nextState.contextUsage??null);if(n.upserts.length===0&&n.removals.length===0&&n.textDeltaPatches.length===0&&r.upserts.length===0&&r.removals.length===0&&i.upserts.length===0&&i.removals.length===0&&!a&&!e.sessionSummary)return null;let o=sL(e.nextState);return o===void 0?null:{provider:e.previousState.provider,sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,fromRawSeq:sL(e.previousState),toRawSeq:o,timelineUpserts:n.upserts,timelineRemovals:n.removals,timelineTextDeltaPatches:n.textDeltaPatches,pendingApprovalUpserts:r.upserts,pendingApprovalRemovals:r.removals,pendingUserInputUpserts:i.upserts,pendingUserInputRemovals:i.removals,sessionSummary:e.sessionSummary,contextUsage:a?e.nextState.contextUsage:void 0}};function zL(e){return e?{sessionFound:!0,sessionId:e.id,projectId:e.projectId,nativeSessionId:e.nativeSessionId??null,provider:e.provider,providerMode:e.providerMode,source:e.source??null,status:e.status,interactionLockReason:e.interactionLockReason??null,updatedAt:e.updatedAt,activeStartedAt:e.activeStartedAt??null,lastHydratedExternalUpdatedAt:e.lastHydratedExternalUpdatedAt??null}:{sessionFound:!1}}function BL(e){return e===`external_turn_running`?e:void 0}function VL(e){return{status:e.status,...e.updatedAt?{updatedAt:e.updatedAt}:{},...e.activeStartedAt?{activeStartedAt:e.activeStartedAt}:{},...e.interactionLockReason?{interactionLockReason:e.interactionLockReason}:{}}}var HL=class{stateByClientSession=new Map;pendingDeltaByClientSession=new Map;itemDetailCache=new Map;constructor(e,t,n,r,i=512){this.sessionHub=e,this.sessionManager=t,this.readableLiveDeltaCoalesceMs=n,this.log=r,this.itemDetailCacheMaxEntries=i}shutdown(){for(let e of this.pendingDeltaByClientSession.values())clearTimeout(e.timer);this.pendingDeltaByClientSession.clear(),this.stateByClientSession.clear(),this.itemDetailCache.clear()}handleSessionStreamSubscribeCommand=async(e,t,n)=>{let r=Date.now(),i=rL(t),a=new Set(i.map(e=>e.sessionId)),o=this.sessionHub.getSubscriptions(e);this.log(`stream.subscribe.received`,{clientId:e,replace:n,incomingSubscriptionCount:t.length,dedupedSubscriptionCount:i.length,subscriptions:i.map(e=>({sessionId:e.sessionId,projectId:e.projectId??null,purpose:e.purpose??null,detailLevel:e.detailLevel??null,bootstrapMode:e.bootstrapMode??null,cursorKind:e.cursor.kind,rawSeq:e.cursor.kind===`raw_seq`?e.cursor.rawSeq:null}))}),this.primeReadableBootstrapForSubscriptions(e,i);for(let t of a)this.sessionHub.pauseSession(e,t);this.sessionHub.replaceSubscriptions(e,i,n),this.syncReadableLiveProjectionSubscriptions(e,o,i,n);try{for(let t of i){let n=Date.now();try{await this.syncSessionStreamSubscription(e,t),this.log(`stream.subscribe.subscription_synced`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId??null,purpose:t.purpose??null,detailLevel:t.detailLevel??null,bootstrapMode:t.bootstrapMode??null,cursorKind:t.cursor.kind,rawSeq:t.cursor.kind===`raw_seq`?t.cursor.rawSeq:null,durationMs:Date.now()-n})}catch(n){throw nL(t)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}}}finally{for(let t of a)this.sessionHub.resumeSession(e,t);this.log(`stream.subscribe.completed`,{clientId:e,replace:n,dedupedSubscriptionCount:i.length,totalDurationMs:Date.now()-r})}};clearState=(e,t)=>{let n=tL(e,t),r=this.stateByClientSession.get(n);this.stateByClientSession.delete(n);let i=this.pendingDeltaByClientSession.get(n);i&&(clearTimeout(i.timer),this.pendingDeltaByClientSession.delete(n)),(r||i)&&this.log(`readable.state.cleared`,{clientId:e,sessionId:t,hadState:!!r,previousState:LL(r),hadPendingDelta:!!i,pendingDeltaFromRawSeq:i?sL(i.previousState)??null:null,pendingDeltaToRawSeq:i?sL(i.nextState)??null:null})};clearStatesForClient=e=>{let t=`${e}::`;for(let e of this.stateByClientSession.keys())e.startsWith(t)&&this.stateByClientSession.delete(e);for(let[e,n]of this.pendingDeltaByClientSession)e.startsWith(t)&&(clearTimeout(n.timer),this.pendingDeltaByClientSession.delete(e))};getReadableItemDetailResult=async e=>{let t=this.getLatestReadableReadyStateForSession(e.projectId,e.sessionId),n=t?EI(t.timelineItems,e.itemId):null,r=n&&`deferredDetail`in n&&n.deferredDetail!==void 0;if(n&&!r){let r=DI(n);return r&&this.setReadableItemDetailCacheEntry({projectId:e.projectId,sessionId:e.sessionId,itemId:r,item:n}),this.log(`readable.item_detail.cache_hit`,{projectId:e.projectId,sessionId:e.sessionId,itemId:e.itemId,source:`live_state`,lastRawSeq:t?sL(t)??null:null}),{item:n}}let i=this.getReadableItemDetailCacheEntry(e.projectId,e.sessionId,e.itemId);if(i)return this.log(`readable.item_detail.cache_hit`,{projectId:e.projectId,sessionId:e.sessionId,itemId:e.itemId,source:`item_cache`}),{item:i.item};let a=await this.sessionManager.getProjectSessionRawEvents(e.projectId,e.sessionId,2**53-1),o=OI({sessionId:e.sessionId,rawEvents:a}),s=this.seedReadableItemDetailCache({projectId:e.projectId,sessionId:e.sessionId,timelineItems:o.timelineItems}),c=EI(o.timelineItems,e.itemId);return this.log(`readable.item_detail.projection_rebuilt`,{projectId:e.projectId,sessionId:e.sessionId,itemId:e.itemId,source:t?`session_history_after_live_state`:`session_history`,lastRawSeq:o.lastRawSeq,timelineItemCount:o.timelineItems.length,cachedItemCount:s,found:!!c}),c?{item:c}:null};routeReadableLiveDelta=e=>{let t=this.sessionHub.getClientSubscriptionsForSession(e.sessionId,`detail_view`);if(t.length!==0)for(let{clientId:n,subscription:r}of t){if(!nL(r))continue;let t=tL(n,e.sessionId),i=this.stateByClientSession.get(t);if(!i)continue;if(i.kind===`bootstrapping`){i.queuedEnvelopes.push(e);continue}let a=kL(i,e);if(a){this.flushPendingReadableLiveDelta(n,e.sessionId),this.stateByClientSession.set(t,a.nextState),this.sessionHub.sendSessionMessageToClient(n,e.sessionId,ZI(a.messageInput)),this.log(`stream.readable.live_patch.sent`,{clientId:n,sessionId:e.sessionId,projectId:i.projectId,provider:i.provider,fromRawSeq:a.messageInput.fromRawSeq??null,toRawSeq:a.messageInput.toRawSeq,timelineTextDeltaPatchCount:a.messageInput.timelineTextDeltaPatches?.length??0});continue}let o=hL(i,e);this.stateByClientSession.set(t,o);let s=PL(e.sessionId,e,i,o);this.enqueueReadableLiveDelta({clientId:n,previousState:i,nextState:o,sessionSummary:s})}};refreshDetailSessionSnapshots=async e=>{let t=this.sessionHub.getClientSubscriptionsForSession(e.sessionId,`detail_view`);for(let{clientId:n,subscription:r}of t){let t=r.projectId?.trim()??``;if(!(t&&t!==e.projectId)){this.sessionHub.pauseSession(n,e.sessionId);try{let t=await this.resolveSessionStreamTarget(r);if(t.bootstrapMode===`readable`){let r=this.getReadableRefreshDeltaBase({clientId:n,sessionId:e.sessionId,projectId:e.projectId,detailLevel:t.detailLevel,refreshMode:e.refreshMode,reason:e.reason});if(r){this.startReadableLiveProjectionBootstrap({clientId:n,sessionId:e.sessionId,previousReadyState:r.previousReadyState}),await this.sendSessionReadableResumeDelta(n,t,r.cursor,r.reason);continue}this.startReadableLiveProjectionBootstrap({clientId:n,sessionId:e.sessionId}),await this.sendSessionReadableSnapshot(n,t,e.reason)}else await this.sendSessionSnapshot(n,t,e.reason)}catch(t){throw nL(r)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:n,sessionId:e.sessionId}),t}finally{this.sessionHub.resumeSession(n,e.sessionId)}}}};sendSessionSnapshot=async(e,t,n)=>{let r=`snap_${DT(12)}`,{compactedRawEvents:i,detailTransportRawEvents:a,lastRawSeq:o,slimReadableProjection:s,pendingApprovals:c,pendingUserInputs:l}=await this.buildReadableSnapshotProjection(t),u=VL(t);this.sessionHub.sendStreamMessage(e,JI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,...o===void 0?{}:{toRawSeq:o}}));let d=$I(a,eL),f=t.purpose===`detail_view`?$I(s.timelineItems,eL):[],p=t.purpose===`detail_view`?`raw+readable`:`raw`,m=Math.max(d.length,f.length,1);this.log(`stream.snapshot.prepared`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,provider:t.provider,detailLevel:t.detailLevel,reason:n,snapshotId:r,snapshotFormat:p,compactedEventCount:i.length,detailTransportEventCount:a.length,readableTimelineItemCount:s.timelineItems.length,totalChunks:m,firstRawSeq:a[0]?.rawSeq??null,lastRawSeq:o??null,orderedLastRawSeq:aL(i)??null,rawSeqOrderMismatch:o!==aL(i)});for(let n=0;n<m;n+=1){let i=d[n]??[],a=f[n]??[];this.sessionHub.sendStreamMessage(e,YI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,chunkIndex:n,totalChunks:m,events:i,timelineItems:t.purpose===`detail_view`?a:void 0,sessionSummary:n===0?u:void 0}))}};sendSessionReadableSnapshot=async(e,t,n)=>{let r=Date.now(),i=`snap_${DT(12)}`,a=this.startReadableLiveProjectionBootstrap({clientId:e,sessionId:t.sessionId});try{let{compactedRawEvents:o,detailTransportRawEvents:s,contextUsage:c,lastRawSeq:l,slimReadableProjection:u,pendingApprovals:d,pendingUserInputs:f}=await this.buildReadableSnapshotProjection(t),p=Date.now()-r,m=this.sessionHub.getSubscriptions(e).find(e=>e.sessionId===t.sessionId),h=m?.projectId?.trim()??``;if(!m||!nL(m)||h&&h!==t.projectId||(m.detailLevel??`full`)!==t.detailLevel){this.clearState(e,t.sessionId);return}let g=VL(t),_=cL({target:t,rawEvents:o,coveredToRawSeq:l,detailTransportRawEvents:s,contextUsage:c,timelineItems:u.timelineItems,pendingApprovals:d,pendingUserInputs:f}),v=this.stateByClientSession.get(a),y=UI(v?.kind===`bootstrapping`?v.queuedEnvelopes:[],l),b=FL({sessionId:t.sessionId,previousState:_,envelopes:y});for(let e of y)_=hL(_,e);let x={...g,...b??{}};this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:_.rawEvents,coveredToRawSeq:sL(_),detailTransportRawEvents:_.detailTransportRawEvents,contextUsage:_.contextUsage,timelineItems:_.timelineItems,pendingApprovals:_.pendingApprovals,pendingUserInputs:_.pendingUserInputs});let S=sL(_),C=aL(_.rawEvents);this.sessionHub.sendStreamMessage(e,JI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:i,...S===void 0?{}:{toRawSeq:S}}));let w=Date.now(),T=jL({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:i,timelineItems:_.timelineItems,pendingApprovals:_.pendingApprovals,pendingUserInputs:_.pendingUserInputs,contextUsage:_.contextUsage,sessionSummary:x}),E=Date.now()-w,D=Math.max(T.length,1);this.log(`stream.snapshot.prepared`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,provider:t.provider,detailLevel:t.detailLevel,bootstrapMode:t.bootstrapMode,reason:n,snapshotId:i,snapshotFormat:`readable`,compactedEventCount:o.length,canonicalRawEventCount:_.rawEvents.length,detailTransportRawEventCount:_.detailTransportRawEvents.length,readableTimelineItemCount:_.timelineItems.length,bufferedReadableDeltaCount:y.length,readableChunkTargetBytes:524288,readableChunkItemCounts:T.map(e=>e.timelineItems.length),readableChunkEstimatedBytes:T.map(e=>e.estimatedByteLength),projectionBuildDurationMs:p,chunkPlanDurationMs:E,totalPrepareDurationMs:Date.now()-r,totalChunks:D,firstRawSeq:_.rawEvents[0]?.rawSeq??null,lastRawSeq:S??null,orderedLastRawSeq:C??null,rawSeqOrderMismatch:S!==C});for(let n=0;n<D;n+=1){let r=T[n];this.sessionHub.sendStreamMessage(e,XI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:i,chunkIndex:n,totalChunks:D,timelineItems:r?.timelineItems??[],pendingApprovals:n===0?_.pendingApprovals:void 0,pendingUserInputs:n===0?_.pendingUserInputs:void 0,contextUsage:n===0?_.contextUsage:void 0,sessionSummary:n===0?x:void 0}))}}catch(n){throw this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}};sendSessionReadableResumeDelta=async(e,t,n,r)=>{let i=Date.now(),a=tL(e,t.sessionId),o=Date.now(),s=await this.sessionManager.getProjectSessionRawEventsWithCoverage(t.projectId,t.sessionId,2**53-1),c=Date.now()-o,l=s.rawEvents,u=s.coveredToRawSeq,d=Date.now(),{baseRawEvents:f,nextRawEvents:p}=GI({rawEvents:l,cursorRawSeq:n}),m=Date.now()-d,h=Date.now(),g=mL({target:t,rawEvents:f,coveredToRawSeq:n}),_=Date.now()-h,v=Date.now(),y=mL({target:t,rawEvents:p,coveredToRawSeq:Math.max(n,u??0)}),b=Date.now()-v,x=sL(y),S=this.stateByClientSession.get(a),C=UI(S?.kind===`bootstrapping`?S.queuedEnvelopes:[],x),w=Date.now();for(let e of C)y=hL(y,e);let T=Date.now()-w,E=sL(g),D=aL(g.rawEvents),O=sL(y),k=aL(y.rawEvents),A=Date.now(),j=FL({sessionId:t.sessionId,previousState:g,envelopes:[...p.filter(e=>e.rawSeq>n),...C]}),M=Date.now()-A;this.log(`stream.readable.resume.prepared`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,provider:t.provider,detailLevel:t.detailLevel,reason:r,cursorRawSeq:n,rawEventCount:l.length,baseRawEventCount:f.length,nextRawEventCount:p.length,previousMaxRawSeq:E??null,previousOrderedLastRawSeq:D??null,nextMaxRawSeq:O??null,nextOrderedLastRawSeq:k??null,rawSeqOrderMismatch:E!==D||O!==k,bootstrapState:LL(S),bufferedEnvelopeCount:C.length,previousState:IL(g),nextState:IL(y),sessionSummaryKeys:j?Object.keys(j):[],sessionSummaryStatus:j?.status??null,sessionSummaryUpdatedAt:j?.updatedAt??null,historyReadDurationMs:c,splitDurationMs:m,previousProjectionDurationMs:_,nextProjectionDurationMs:b,bufferedApplyDurationMs:T,summaryDurationMs:M,prepareDurationMs:Date.now()-i}),this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:y.rawEvents,coveredToRawSeq:sL(y),detailTransportRawEvents:y.detailTransportRawEvents,contextUsage:y.contextUsage,timelineItems:y.timelineItems,pendingApprovals:y.pendingApprovals,pendingUserInputs:y.pendingUserInputs});let N=sL(y)??n;this.sessionHub.sendStreamMessage(e,JI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`delta`,reason:r,fromRawSeq:n,...N===void 0?{}:{toRawSeq:N}}));let P=Date.now(),F=RL({previousState:g,nextState:y,sessionSummary:j},this.log),I=Date.now()-P;this.log(`stream.readable.resume.delta`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,reason:r,cursorRawSeq:n,emittedDelta:!!F,deltaFromRawSeq:F?.fromRawSeq??n,deltaToRawSeq:F?.toRawSeq??N??null,timelineUpsertCount:F?.timelineUpserts.length??0,timelineRemovalCount:F?.timelineRemovals.length??0,timelineTextDeltaPatchCount:F?.timelineTextDeltaPatches.length??0,pendingApprovalUpsertCount:F?.pendingApprovalUpserts.length??0,pendingUserInputUpsertCount:F?.pendingUserInputUpserts.length??0,sessionSummaryStatus:F?.sessionSummary?.status??null,sessionSummaryUpdatedAt:F?.sessionSummary?.updatedAt??null,historyReadDurationMs:c,splitDurationMs:m,previousProjectionDurationMs:_,nextProjectionDurationMs:b,bufferedApplyDurationMs:T,summaryDurationMs:M,deltaBuildDurationMs:I,totalDurationMs:Date.now()-i}),this.sessionHub.sendSessionMessageToClient(e,t.sessionId,ZI(F??{provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,fromRawSeq:n,toRawSeq:N,timelineUpserts:[],timelineRemovals:[]}))};getReadableItemDetailCacheKey(e,t,n){return`${e}::${t}::${n}`}getReadableItemDetailCacheEntry(e,t,n){let r=this.getReadableItemDetailCacheKey(e,t,n),i=this.itemDetailCache.get(r);return i?(this.itemDetailCache.delete(r),this.itemDetailCache.set(r,i),i):null}setReadableItemDetailCacheEntry(e){let t=this.getReadableItemDetailCacheKey(e.projectId,e.sessionId,e.itemId);for(this.itemDetailCache.has(t)&&this.itemDetailCache.delete(t),this.itemDetailCache.set(t,e);this.itemDetailCache.size>Math.max(1,this.itemDetailCacheMaxEntries);){let e=this.itemDetailCache.keys().next().value;if(!e)break;this.itemDetailCache.delete(e)}}seedReadableItemDetailCache(e){let t=0;for(let n of e.timelineItems){let r=DI(n);r&&(this.setReadableItemDetailCacheEntry({projectId:e.projectId,sessionId:e.sessionId,itemId:r,item:n}),t+=1)}return t}getLatestReadableReadyStateForSession(e,t){let n=null,r=-1,i=i=>{if(!i||i.projectId!==e||i.sessionId!==t)return;let a=sL(i)??-1;a<r||(n=i,r=a)};for(let e of this.stateByClientSession.values())e.kind===`ready`&&i(e);for(let e of this.pendingDeltaByClientSession.values())i(e.nextState);return n}syncReadableLiveProjectionSubscriptions(e,t,n,r){let i=new Set(n.filter(nL).map(e=>e.sessionId));if(r)for(let n of t)i.has(n.sessionId)||this.clearState(e,n.sessionId);for(let t of n)nL(t)||this.clearState(e,t.sessionId)}startReadableLiveProjectionBootstrap(e){let t=tL(e.clientId,e.sessionId),n=this.stateByClientSession.get(t),r=this.pendingDeltaByClientSession.get(t),i=e.previousReadyState??(n?.kind===`bootstrapping`?n.previousReadyState:this.getReadableDeliveredReadyState(e.clientId,e.sessionId)),a=this.getReadablePendingDeltaReplayEnvelopes(i,r);r&&(clearTimeout(r.timer),this.pendingDeltaByClientSession.delete(t));let o=n?.kind===`bootstrapping`?n:i,s=KI(e.sessionId,o);if(a.length>0){let e=new Set(s.queuedEnvelopes.map(e=>e.rawSeq));for(let t of a)e.has(t.rawSeq)||(s.queuedEnvelopes.push(t),e.add(t.rawSeq))}return this.stateByClientSession.set(t,s),this.log(`readable.bootstrap.started`,{clientId:e.clientId,sessionId:e.sessionId,replacedState:LL(n),clearedPendingDelta:!!r,carriedPendingEnvelopeCount:a.length}),t}getReadableDeliveredReadyState(e,t){let n=tL(e,t),r=this.pendingDeltaByClientSession.get(n);if(r)return r.previousState;let i=this.stateByClientSession.get(n);return i?.kind===`ready`?i:null}getReadablePendingDeltaReplayEnvelopes(e,t){return t?UI(t.nextState.rawEvents,e?sL(e):void 0):[]}getReadableRefreshDeltaBase(e){let t=this.getReadableRefreshDeltaReason(e.reason);if(!t||e.refreshMode!==`delta`)return null;let n=this.getReadableDeliveredReadyState(e.clientId,e.sessionId);if(!n||n.projectId!==e.projectId||n.detailLevel!==e.detailLevel)return null;let r=sL(n);return typeof r==`number`?{cursor:r,previousReadyState:n,reason:t}:null}getReadableRefreshDeltaReason(e){return e===`external_history_updated`||e===`explicit_history_sync`?`${e}_delta`:null}seedReadableLiveProjectionState(e){let t=cL(e);this.stateByClientSession.set(tL(e.clientId,e.target.sessionId),t),this.log(`readable.state.seeded`,{clientId:e.clientId,sessionId:e.target.sessionId,projectId:e.target.projectId,provider:e.target.provider,detailLevel:e.target.detailLevel,state:IL(t)})}primeReadableBootstrapForSubscriptions(e,t){for(let n of t)nL(n)&&this.startReadableLiveProjectionBootstrap({clientId:e,sessionId:n.sessionId})}async syncSessionStreamSubscription(e,t){let n=await this.resolveSessionStreamTarget(t);if(n.bootstrapMode===`readable`){if(t.cursor.kind===`all`){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`all`,requestedRawSeq:null,decision:`snapshot`,reason:`readable_bootstrap_snapshot`}),await this.sendSessionReadableSnapshot(e,n,`readable_bootstrap_snapshot`);return}let r=await this.sessionManager.getProjectSessionRawSeqRange(n.projectId,n.sessionId);if(!r){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:t.cursor.rawSeq,decision:`snapshot`,reason:`readable_empty_history_snapshot`,rangeMin:null,rangeMax:null}),await this.sendSessionReadableSnapshot(e,n,`readable_empty_history_snapshot`);return}let i=t.cursor.rawSeq,a=Math.max(0,r.min-1);if(i<a||i>r.max){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:i,decision:`snapshot`,reason:`readable_cursor_out_of_range_snapshot`,rangeMin:r.min,rangeMax:r.max,minExpectedCursor:a}),await this.sendSessionReadableSnapshot(e,n,`readable_cursor_out_of_range_snapshot`);return}let o=n.status===`running`?`readable_cursor_resumed_delta`:`readable_session_idle_delta`;this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:i,decision:`delta`,reason:o,rangeMin:r.min,rangeMax:r.max,minExpectedCursor:a}),await this.sendSessionReadableResumeDelta(e,n,i,o);return}if(t.cursor.kind===`all`){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`all`,requestedRawSeq:null,decision:`snapshot`,reason:`cursor_all`}),await this.sendSessionSnapshot(e,n,`cursor_all`);return}let r=await this.sessionManager.getProjectSessionRawSeqRange(n.projectId,n.sessionId);if(!r){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:t.cursor.rawSeq,decision:`snapshot`,reason:`empty_history_snapshot`,rangeMin:null,rangeMax:null}),await this.sendSessionSnapshot(e,n,`empty_history_snapshot`);return}let i=t.cursor.rawSeq,a=Math.max(0,r.min-1);if(i<a||i>r.max){this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:i,decision:`snapshot`,reason:`cursor_out_of_range_snapshot`,rangeMin:r.min,rangeMax:r.max,minExpectedCursor:a}),await this.sendSessionSnapshot(e,n,`cursor_out_of_range_snapshot`);return}let o=await this.sessionManager.getProjectSessionRawEventsSinceSeq(n.projectId,n.sessionId,i,2**53-1),s=o[o.length-1]?.rawSeq??i;this.log(`stream.subscribe.decision`,{clientId:e,sessionId:n.sessionId,projectId:n.projectId,provider:n.provider,purpose:t.purpose??null,detailLevel:n.detailLevel,bootstrapMode:n.bootstrapMode,targetStatus:n.status,cursorKind:`raw_seq`,requestedRawSeq:i,decision:`delta`,reason:n.status===`running`?`cursor_resumed_delta`:`session_idle_delta`,rangeMin:r.min,rangeMax:r.max,minExpectedCursor:a,backlogCount:o.length,backlogFirstRawSeq:o[0]?.rawSeq??null,backlogLastRawSeq:s}),this.sessionHub.sendStreamMessage(e,JI({provider:n.provider,sessionId:n.sessionId,projectId:n.projectId,decision:`delta`,reason:n.status===`running`?`cursor_resumed_delta`:`session_idle_delta`,fromRawSeq:i,toRawSeq:s}));for(let t of o)this.sessionHub.sendStreamMessage(e,t)}async resolveSessionStreamTarget(e){let t=e.sessionId;if(!t)throw Error(`session.stream.subscribe requires sessionId`);let n=e.projectId?.trim()??``;if(n){let r=await this.sessionManager.getProjectSessionSummary(n,t);if(!r)throw RT(n,t);let i={sessionId:t,projectId:n,provider:r.provider,status:r.status,updatedAt:r.updatedAt,activeStartedAt:r.activeStartedAt,interactionLockReason:BL(r.interactionLockReason),detailLevel:e.detailLevel??`full`,purpose:e.purpose??null,bootstrapMode:e.bootstrapMode??`stream`};return this.log(`stream.subscribe.target.resolved`,{sessionId:t,requestedProjectId:n,resolvedProjectId:i.projectId,purpose:i.purpose,detailLevel:i.detailLevel,bootstrapMode:i.bootstrapMode,targetProvider:i.provider,targetStatus:i.status,resolvedViaExecutionContext:!1,summary:zL(r)}),i}let r=this.sessionManager.getSessionExecutionContext(t),i=await this.sessionManager.getProjectSessionSummary(r.projectId,t),a={sessionId:t,projectId:r.projectId,provider:i?.provider??r.provider,status:i?.status??`idle`,updatedAt:i?.updatedAt,activeStartedAt:i?.activeStartedAt,interactionLockReason:BL(i?.interactionLockReason),detailLevel:e.detailLevel??`full`,purpose:e.purpose??null,bootstrapMode:e.bootstrapMode??`stream`};return this.log(`stream.subscribe.target.resolved`,{sessionId:t,requestedProjectId:null,resolvedProjectId:a.projectId,purpose:a.purpose,detailLevel:a.detailLevel,bootstrapMode:a.bootstrapMode,targetProvider:a.provider,targetStatus:a.status,resolvedViaExecutionContext:!0,executionContextProvider:r.provider,summary:zL(i)}),a}async buildReadableSnapshotProjection(e){let t=Date.now(),n=Date.now(),r=await this.sessionManager.getProjectSessionRawEventsCompactedWithCoverage(e.projectId,e.sessionId,2**53-1),i=Date.now()-n,a=r.rawEvents,o=Date.now(),s=gL({rawEvents:a,detailLevel:e.detailLevel}),c=Date.now()-o,l=Date.now(),u=pL({target:e,rawEvents:s,rawEventsAlreadyMatchDetailTransport:!0}),d=Date.now()-l,f=oL(a,r.coveredToRawSeq)??void 0;return this.log(`stream.readable.snapshot.projection`,{sessionId:e.sessionId,projectId:e.projectId,provider:e.provider,detailLevel:e.detailLevel,compactedRawEventCount:a.length,detailTransportRawEventCount:s.length,timelineItemCount:u.timelineItems.length,pendingApprovalCount:u.pendingApprovals.length,pendingUserInputCount:u.pendingUserInputs.length,coveredToRawSeq:r.coveredToRawSeq,lastRawSeq:f??null,historyReadDurationMs:i,detailTransportDurationMs:c,projectionDurationMs:d,totalDurationMs:Date.now()-t}),{compactedRawEvents:a,detailTransportRawEvents:s,contextUsage:u.contextUsage,lastRawSeq:f,slimReadableProjection:{timelineItems:u.timelineItems,consumedMessageIds:[]},pendingApprovals:u.pendingApprovals,pendingUserInputs:u.pendingUserInputs}}restoreReadableLiveProjectionAfterBootstrapFailure(e){let t=tL(e.clientId,e.sessionId),n=this.stateByClientSession.get(t);if(!n||n.kind!==`bootstrapping`)return;let r=this.sessionHub.getSubscriptions(e.clientId).find(t=>t.sessionId===e.sessionId),i=r?.projectId?.trim()??``,a=qI(n,hL);if(!a.previousReadyState||!r||!nL(r)||i&&i!==a.previousReadyState.projectId||(r.detailLevel??`full`)!==a.previousReadyState.detailLevel||!a.nextReadyState){this.log(`readable.bootstrap.recovery.discarded`,{clientId:e.clientId,sessionId:e.sessionId,bootstrapState:LL(n),currentSubscriptionFound:!!r,currentSubscriptionProjectId:i||null,currentSubscriptionDetailLevel:r?.detailLevel??null,previousReadyState:IL(a.previousReadyState),nextReadyState:IL(a.nextReadyState)}),this.clearState(e.clientId,e.sessionId);return}if(this.stateByClientSession.set(t,a.nextReadyState),a.replayedEnvelopes.length===0){this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:0,nextReadyState:IL(a.nextReadyState)});return}let o=FL({sessionId:e.sessionId,previousState:a.previousReadyState,envelopes:a.replayedEnvelopes}),s=RL({previousState:a.previousReadyState,nextState:a.nextReadyState,sessionSummary:o},this.log);if(!s){this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:IL(a.nextReadyState),emittedDelta:!1});return}this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:IL(a.nextReadyState),emittedDelta:!0,deltaFromRawSeq:s.fromRawSeq??null,deltaToRawSeq:s.toRawSeq}),this.sessionHub.sendSessionMessageToClient(e.clientId,a.previousReadyState.sessionId,ZI(s))}sendReadableLiveDeltaNow(e){let t=RL({previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary},this.log);t&&this.sessionHub.sendSessionMessageToClient(e.clientId,e.previousState.sessionId,ZI(t))}flushPendingReadableLiveDelta(e,t){let n=tL(e,t),r=this.pendingDeltaByClientSession.get(n);r&&(clearTimeout(r.timer),this.pendingDeltaByClientSession.delete(n),this.sendReadableLiveDeltaNow({clientId:e,previousState:r.previousState,nextState:r.nextState,sessionSummary:r.sessionSummary}))}enqueueReadableLiveDelta(e){if(this.readableLiveDeltaCoalesceMs<=0){this.sendReadableLiveDeltaNow(e);return}let t=tL(e.clientId,e.previousState.sessionId),n=this.pendingDeltaByClientSession.get(t);if(n){let t=UL({existing:{previousState:n.previousState,nextState:n.nextState,sessionSummary:n.sessionSummary},next:{previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary}});n.previousState=t.previousState,n.nextState=t.nextState,n.sessionSummary=t.sessionSummary;return}let r=setTimeout(()=>{this.flushPendingReadableLiveDelta(e.clientId,e.previousState.sessionId)},this.readableLiveDeltaCoalesceMs);r.unref?.(),this.pendingDeltaByClientSession.set(t,{clientId:e.clientId,sessionId:e.previousState.sessionId,previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary,timer:r})}};function UL(e){let t=(e,t)=>{let n={...e??{},...t??{}};return Object.keys(n).length>0?n:void 0};return e.existing?{previousState:e.existing.previousState,nextState:e.next.nextState,sessionSummary:t(e.existing.sessionSummary,e.next.sessionSummary)}:{previousState:e.next.previousState,nextState:e.next.nextState,sessionSummary:t(void 0,e.next.sessionSummary)}}function WL(e){return e.sendProviderRaw?`relay_ws`:`direct_ws`}function GL(e){let t=performance.now(),n=JSON.stringify(e);return{payload:n,byteLength:Buffer.byteLength(n),serializeDurationMs:Number((performance.now()-t).toFixed(3))}}function KL(e){return e.kind===`session.readable.snapshot.chunk`?{snapshotId:e.payload.readable.snapshotId,chunkIndex:e.payload.readable.chunkIndex,totalChunks:e.payload.readable.totalChunks,snapshotFormat:`readable`,chunkEventCount:null,chunkTimelineItemCount:e.payload.readable.timelineItems.length}:e.kind===`session.stream.snapshot.chunk`?{snapshotId:e.payload.raw.snapshotId,chunkIndex:e.payload.raw.chunkIndex,totalChunks:e.payload.raw.totalChunks,snapshotFormat:e.payload.readable?`raw+readable`:`raw`,chunkEventCount:e.payload.raw.events.length,chunkTimelineItemCount:e.payload.readable?.timelineItems?.length??null}:null}var qL=class{clients=new Map;clientIdsBySessionId=new Map;deliveryStateByClientSession=new Map;addClient(e,t){let n=`ws_${DT(10)}`;return this.clients.set(n,{id:n,deviceId:e,socket:t,subscriptionsBySessionId:new Map}),n}removeClient(e){let t=this.clients.get(e);t&&(this.removeClientFromSessionIndexes(e,t.subscriptionsBySessionId.keys()),this.removeClientDeliveryState(e),this.clients.delete(e))}replaceSubscriptions(e,t,n=!0){let r=this.clients.get(e);if(!r)return[];n&&(this.removeClientFromSessionIndexes(e,r.subscriptionsBySessionId.keys()),this.removeClientSessionDeliveryState(e,r.subscriptionsBySessionId.keys()),r.subscriptionsBySessionId.clear());let i=new Map;for(let e of t)i.set(e.sessionId,e);for(let[t,n]of i){r.subscriptionsBySessionId.set(t,n);let i=this.clientIdsBySessionId.get(t)??new Set;i.add(e),this.clientIdsBySessionId.set(t,i),this.ensureClientSessionDeliveryState(e,t)}return[...r.subscriptionsBySessionId.values()]}getSubscriptions(e){let t=this.clients.get(e);return t?[...t.subscriptionsBySessionId.values()]:[]}getWatchSubscriptions(e){let t=new Map;for(let n of this.clients.values())for(let r of n.subscriptionsBySessionId.values())r.purpose===e&&t.set(r.sessionId,r);return[...t.values()]}getClientSubscriptionsForSession(e,t){let n=this.clientIdsBySessionId.get(e);if(!n||n.size===0)return[];let r=[];for(let i of n){let n=this.clients.get(i),a=n?.subscriptionsBySessionId.get(e);!n||!a||t&&a.purpose!==t||r.push({clientId:i,subscription:a})}return r}routeProviderRaw(e){let t=this.clientIdsBySessionId.get(e.sessionId);if(!t||t.size===0)return;let n=null;for(let r of t){let t=this.clients.get(r),i=t?.subscriptionsBySessionId.get(e.sessionId);if(!t||!i||!this.shouldDeliverProviderRaw(i))continue;let a=this.deliveryStateByClientSession.get(this.clientSessionKey(r,e.sessionId));if(a?.paused){a.queued.push({message:e});continue}if(t.socket.readyState===t.socket.OPEN){if(t.socket.sendProviderRaw){t.socket.sendProviderRaw(e);continue}n??=JSON.stringify(e),t.socket.send(n)}}}routeSessionMessage(e,t){let n=this.clientIdsBySessionId.get(e.sessionId);if(!n||n.size===0)return;let r=null;for(let i of n){let n=this.clients.get(i),a=n?.subscriptionsBySessionId.get(e.sessionId);if(!n||!a||!t(a))continue;let o=this.deliveryStateByClientSession.get(this.clientSessionKey(i,e.sessionId));if(o?.paused){o.queued.push({message:e});continue}n.socket.readyState===n.socket.OPEN&&(r=this.sendGatewayStreamMessage(n,e,r))}}sendSessionMessageToClient(e,t,n){let r=this.clients.get(e),i=r?.subscriptionsBySessionId.get(t);if(!r||!i)return;let a=this.deliveryStateByClientSession.get(this.clientSessionKey(e,t));if(a?.paused){a.queued.push({message:n});return}r.socket.readyState===r.socket.OPEN&&this.sendGatewayStreamMessage(r,n)}pauseSession(e,t){let n=this.ensureClientSessionDeliveryState(e,t);n.paused=!0}resumeSession(e,t){let n=this.clientSessionKey(e,t),r=this.deliveryStateByClientSession.get(n);if(!r||(r.paused=!1,r.queued.length===0))return;let i=this.clients.get(e);if(!i||i.socket.readyState!==i.socket.OPEN){r.queued=[];return}let a=[...r.queued];r.queued=[];for(let e of a){if(e.message.kind===`provider.raw`&&i.socket.sendProviderRaw){i.socket.sendProviderRaw(e.message);continue}this.sendGatewayStreamMessage(i,e.message)}}sendStreamMessage(e,t){let n=this.clients.get(e);!n||n.socket.readyState!==n.socket.OPEN||this.sendGatewayStreamMessage(n,t)}sendBroadcastMessage(e,t){let n=null;for(let r of this.clients.values())if(r.socket.readyState===r.socket.OPEN){if(t?.sessionId){let e=r.subscriptionsBySessionId.get(t.sessionId);if(!e||t.purpose&&e.purpose!==t.purpose)continue}n=this.sendGatewayStreamMessage(r,e,n)}}sendSystemMessage(e,t){let n=this.clients.get(e);!n||n.socket.readyState!==n.socket.OPEN||n.socket.send(JSON.stringify(t))}broadcastSystemMessage(e){let t=JSON.stringify(e);for(let e of this.clients.values())e.socket.readyState===e.socket.OPEN&&e.socket.send(t)}count(){return this.clients.size}sendGatewayStreamMessage(e,t,n=null){let r=n??GL(t),i=KL(t);return i&&vM(`stream.snapshot.chunk.outbound`,{clientId:e.id,deviceId:e.deviceId,transport:WL(e.socket),provider:t.provider,sessionId:t.sessionId,projectId:t.projectId??null,messageKind:t.kind,messageType:t.type,snapshotId:i.snapshotId,chunkIndex:i.chunkIndex,totalChunks:i.totalChunks,snapshotFormat:i.snapshotFormat,chunkEventCount:i.chunkEventCount,chunkTimelineItemCount:i.chunkTimelineItemCount,serializedByteLength:r.byteLength,serializeDurationMs:r.serializeDurationMs}),e.socket.send(r.payload),r}removeClientFromSessionIndexes(e,t){for(let n of t){let t=this.clientIdsBySessionId.get(n);t&&(t.delete(e),t.size===0&&this.clientIdsBySessionId.delete(n))}}clientSessionKey(e,t){return`${e}::${t}`}ensureClientSessionDeliveryState(e,t){let n=this.clientSessionKey(e,t),r=this.deliveryStateByClientSession.get(n);if(r)return r;let i={paused:!1,queued:[]};return this.deliveryStateByClientSession.set(n,i),i}removeClientSessionDeliveryState(e,t){for(let n of t)this.deliveryStateByClientSession.delete(this.clientSessionKey(e,n))}removeClientDeliveryState(e){let t=`${e}::`;for(let e of this.deliveryStateByClientSession.keys())e.startsWith(t)&&this.deliveryStateByClientSession.delete(e)}shouldDeliverProviderRaw(e){return!(e.purpose===`detail_view`&&e.bootstrapMode===`readable`)}};const JL=1200,YL=process.env.NATIVE_SESSION_WATCH_DEBUG===`1`||process.env.EXPO_PUBLIC_NATIVE_SESSION_WATCH_DEBUG===`1`;var XL=class{statesByKey=new Map;targetsByClientId=new Map;constructor(e){this.options=e}getClientWatchTargets(e){let t=this.targetsByClientId.get(e);return t?[...t.values()]:[]}setClientWatchTargets(e,t,n){let r=new Map;for(let e of t){let t=e.sessionId.trim(),n=e.projectId?.trim()??``;!t||!n||r.set(this.stateKey(n,t),{sessionId:t,projectId:n})}let i=this.targetsByClientId.get(e)??new Map,a=n?new Map:new Map(i);for(let[e,t]of r)a.set(e,t);for(let[t,n]of i)a.has(t)||this.removeClientFromState(e,n.projectId??``,n.sessionId);for(let[t,n]of a)i.get(t)||this.addClientToState(e,n.projectId??``,n.sessionId);return this.targetsByClientId.set(e,a),[...a.values()]}removeClient(e){let t=this.targetsByClientId.get(e);if(t){for(let n of t.values())this.removeClientFromState(e,n.projectId??``,n.sessionId);this.targetsByClientId.delete(e)}}close(){for(let e of this.statesByKey.values())this.disposeState(e);this.statesByKey.clear(),this.targetsByClientId.clear()}logDebug(e,t){YL&&(console.log(`[native-watch][gateway]`,e,t),this.options.logger.info?.({event:e,...t},`native session watch debug`))}addClientToState(e,t,n){if(!t||!n)return;let r=this.stateKey(t,n),i=this.statesByKey.get(r);i||(i={provider:`codex`,sessionId:n,projectId:t,ownerClientIds:new Set,fileWatcher:null,debounceTimer:null,catchupRetryTimer:null,reconcileTimer:setInterval(()=>{this.requestSync(r,`reconcile`)},25e3),syncInFlight:!1,rerunRequested:!1,stableIdleSyncCount:0,watchCatchupRetryCount:0,lastObservedRawSeq:0,lastObservedRawEventCount:0,lastSentConfigSummary:void 0,lastTriggeredAt:0,lastSyncStartedAt:null,lastSyncCompletedAt:null},this.statesByKey.set(r,i),this.logDebug(`state.created`,{clientId:e,projectId:t,sessionId:n})),i.ownerClientIds.add(e),this.logDebug(`lease.added`,{clientId:e,projectId:t,sessionId:n,ownerClientCount:i.ownerClientIds.size}),this.requestSync(r,`lease_added`)}removeClientFromState(e,t,n){let r=this.statesByKey.get(this.stateKey(t,n));r&&(r.ownerClientIds.delete(e),this.logDebug(`lease.removed`,{clientId:e,projectId:t,sessionId:n,ownerClientCount:r.ownerClientIds.size}),!(r.ownerClientIds.size>0)&&(this.disposeState(r),this.statesByKey.delete(this.stateKey(t,n))))}disposeState(e){e.debounceTimer&&=(clearTimeout(e.debounceTimer),null),this.clearCatchupRetry(e,{resetAttempts:!0}),clearInterval(e.reconcileTimer),e.fileWatcher?.close(),e.fileWatcher=null,this.logDebug(`state.disposed`,{projectId:e.projectId,sessionId:e.sessionId,watchedPath:e.watchedPath})}async requestSync(e,t){let n=this.statesByKey.get(e);if(!n)return;if(n.lastTriggeredAt=Date.now(),n.syncInFlight){n.rerunRequested=!0;return}n.syncInFlight=!0,n.rerunRequested=!1,n.lastSyncStartedAt=Date.now();let r=n.lastSyncStartedAt;this.logDebug(`sync.begin`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,ownerClientCount:n.ownerClientIds.size,watchedPath:n.watchedPath,watchedDir:n.watchedDir,watchedBaseName:n.watchedBaseName,stableIdleSyncCount:n.stableIdleSyncCount});try{let i=Date.now(),a=await this.options.sessionManager.getProjectSessionSummary(n.projectId,n.sessionId),o=Date.now()-i;if(!a||a.providerMode!==`native`||a.provider!==`codex`&&a.provider!==`claude`){this.logDebug(`sync.stop.unwatchable_summary`,{projectId:n.projectId,sessionId:n.sessionId,summarySource:a?.source,summaryProvider:a?.provider,summaryProviderMode:a?.providerMode,summaryStatus:a?.status,summaryDurationMs:o,totalDurationMs:Date.now()-r}),this.stopState(e);return}if(n.provider=a.provider,this.isGatewayOwnedRuntimeLive(n.projectId,n.sessionId,a)||!wI(a)){this.clearCatchupRetry(n,{resetAttempts:!0}),n.stableIdleSyncCount=0,this.logDebug(`sync.skip.gateway_live`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,summaryStatus:a.status,interactionLockReason:a.interactionLockReason,watchedPath:n.watchedPath,ownerClientCount:n.ownerClientIds.size,summaryDurationMs:o,totalDurationMs:Date.now()-r});return}let s=Date.now(),c=await this.options.sessionManager.syncProjectSessionHistory(n.projectId,n.sessionId),l=Date.now()-s;n.lastSyncCompletedAt=Date.now();let u=Date.now();this.applyWatchPath(n,c.nativeWatchPath);let d=Date.now()-u,f=this.isGatewayOwnedRuntimeLive(n.projectId,n.sessionId,c.session),p=n.lastObservedRawSeq,m=n.lastObservedRawEventCount,h=this.resolveObservedRawSeq(c),g=h>p||c.rawEvents.length>m;if(g?this.clearCatchupRetry(n,{resetAttempts:!0}):this.maybeScheduleWatchCatchupRetry(e,n,t,c,{previousObservedRawSeq:p,previousObservedRawEventCount:m,nextObservedRawSeq:h,nextObservedRawEventCount:c.rawEvents.length}),n.lastObservedRawSeq=Math.max(n.lastObservedRawSeq,h),n.lastObservedRawEventCount=Math.max(n.lastObservedRawEventCount,c.rawEvents.length),f){this.clearCatchupRetry(n,{resetAttempts:!0}),n.stableIdleSyncCount=0,this.logDebug(`sync.result.stand_down.gateway_live`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,status:c.session.status,interactionLockReason:c.session.interactionLockReason,historyUpdated:c.historyUpdated,statusChanged:c.statusChanged,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,nativeWatchPath:c.nativeWatchPath,rawEventCount:c.rawEvents.length,summaryDurationMs:o,historySyncDurationMs:l,applyWatchPathDurationMs:d,totalDurationMs:Date.now()-r});return}c.session.status!==`running`&&!c.historyUpdated?n.stableIdleSyncCount+=1:n.stableIdleSyncCount=0,this.logDebug(`sync.result`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,status:c.session.status,interactionLockReason:c.session.interactionLockReason,historyUpdated:c.historyUpdated,statusChanged:c.statusChanged,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,nativeWatchPath:c.nativeWatchPath,rawEventCount:c.rawEvents.length,cursorAdvanced:g,previousObservedRawSeq:p,previousObservedRawEventCount:m,nextObservedRawSeq:h,nextObservedRawEventCount:c.rawEvents.length,watchCatchupRetryCount:n.watchCatchupRetryCount,stableIdleSyncCount:n.stableIdleSyncCount,summaryDurationMs:o,historySyncDurationMs:l,applyWatchPathDurationMs:d,totalDurationMs:Date.now()-r});let _=ZL(c.session),v=eR(_);if(c.historyUpdated||c.statusChanged||QL(t)&&tR(t,n.lastSentConfigSummary,v)){let e=this.options.createExternalUpdateMessage({provider:c.session.provider,sessionId:c.session.id,projectId:c.session.projectId,updatedAt:c.session.updatedAt,status:c.session.status,interactionLockReason:c.session.interactionLockReason,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,historyUpdated:c.historyUpdated,statusChanged:c.statusChanged,sessionSummary:_});for(let t of n.ownerClientIds)this.options.sendStreamMessage(t,e);v&&(n.lastSentConfigSummary=v)}if(c.historyUpdated){let e=Date.now();await this.options.refreshDetailSessionSnapshots?.({projectId:n.projectId,sessionId:n.sessionId,reason:`external_history_updated`,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq}),this.logDebug(`sync.refresh_detail_snapshots`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,durationMs:Date.now()-e})}}catch(e){this.options.logger.warn({err:e,projectId:n.projectId,sessionId:n.sessionId,reason:t},`native session watch sync failed`)}finally{let n=this.statesByKey.get(e);if(!n)return;n.syncInFlight=!1,n.rerunRequested&&(this.logDebug(`sync.rerun`,{projectId:n.projectId,sessionId:n.sessionId,reason:t}),n.rerunRequested=!1,this.requestSync(e,`rerun`))}}stopState(e){let t=this.statesByKey.get(e);if(t){this.disposeState(t),this.statesByKey.delete(e);for(let t of this.targetsByClientId.values())t.delete(e)}}applyWatchPath(e,t){let n=t?.trim()??``;if(!n)return;let r=p.default.resolve(n);if(e.watchedPath===r&&e.fileWatcher)return;let i=p.default.dirname(r),a=p.default.basename(r);e.fileWatcher?.close(),e.fileWatcher=null,e.watchedPath=r,e.watchedDir=i,e.watchedBaseName=a,this.logDebug(`watch.path.applied`,{projectId:e.projectId,sessionId:e.sessionId,watchedPath:r,watchedDir:i,watchedBaseName:a});try{e.fileWatcher=this.createPathWatcher(r,(t,n)=>{let i=n?Buffer.isBuffer(n)?n.toString(`utf8`):n:void 0;this.logDebug(`watch.fs.event`,{projectId:e.projectId,sessionId:e.sessionId,watchedPath:r,eventType:t,filename:i}),this.scheduleDebouncedSync(this.stateKey(e.projectId,e.sessionId))}),e.fileWatcher.on(`error`,t=>{this.options.logger.warn({err:t,projectId:e.projectId,sessionId:e.sessionId,watchedPath:r},`native session watcher error`)})}catch(t){this.options.logger.warn({err:t,projectId:e.projectId,sessionId:e.sessionId,watchedPath:r},`failed to start native session watcher`)}}createPathWatcher(e,t){return this.options.createWatcher?this.options.createWatcher(e,t):(0,u.watch)(e,(e,n)=>{t(e,n)})}scheduleDebouncedSync(e){let t=this.statesByKey.get(e);if(!t)return;let n=!!t.debounceTimer;t.debounceTimer&&clearTimeout(t.debounceTimer),this.clearCatchupRetry(t,{resetAttempts:!0}),this.logDebug(`watch.debounce.scheduled`,{projectId:t.projectId,sessionId:t.sessionId,watchedPath:t.watchedPath,delayMs:300,replacedExistingTimer:n}),t.debounceTimer=setTimeout(()=>{t.debounceTimer=null,this.logDebug(`watch.debounce.fired`,{projectId:t.projectId,sessionId:t.sessionId,watchedPath:t.watchedPath}),this.requestSync(e,`watch`)},300)}resolveObservedRawSeq(e){let t=e.rawEvents[e.rawEvents.length-1],n=t&&typeof t==`object`&&t&&`rawSeq`in t&&typeof t.rawSeq==`number`?t.rawSeq:void 0;return e.toRawSeq??n??0}clearCatchupRetry(e,t){e.catchupRetryTimer&&=(clearTimeout(e.catchupRetryTimer),null),t?.resetAttempts&&(e.watchCatchupRetryCount=0)}maybeScheduleWatchCatchupRetry(e,t,n,r,i){n!==`watch`&&n!==`watch_catchup`||t.ownerClientIds.size!==0&&(t.watchCatchupRetryCount>=2||(t.catchupRetryTimer||=(t.watchCatchupRetryCount+=1,this.logDebug(`watch.catchup.scheduled`,{projectId:t.projectId,sessionId:t.sessionId,reason:n,delayMs:JL,historyUpdated:r.historyUpdated,refreshMode:r.refreshMode,previousObservedRawSeq:i.previousObservedRawSeq,previousObservedRawEventCount:i.previousObservedRawEventCount,nextObservedRawSeq:i.nextObservedRawSeq,nextObservedRawEventCount:i.nextObservedRawEventCount,watchCatchupRetryCount:t.watchCatchupRetryCount}),setTimeout(()=>{t.catchupRetryTimer=null,this.logDebug(`watch.catchup.fired`,{projectId:t.projectId,sessionId:t.sessionId,watchCatchupRetryCount:t.watchCatchupRetryCount}),this.requestSync(e,`watch_catchup`)},JL))))}stateKey(e,t){return JSON.stringify([e,t])}isGatewayOwnedRuntimeLive(e,t,n){return this.options.sessionManager.isGatewayOwnedRuntimeLive?.(e,t)?!0:n?n.status===`running`&&n.interactionLockReason!==`external_turn_running`:!1}};function ZL(e){return{updatedAt:e.updatedAt,status:e.status,interactionLockReason:e.interactionLockReason,...e.model?{model:e.model}:e.sessionTurnConfig?.model===null?{model:null}:{},...e.sessionTurnConfig?{sessionTurnConfig:e.sessionTurnConfig}:{},...e.sessionTurnConfigUpdatedAt?{sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt}:{}}}function QL(e){return e===`lease_added`||e===`watch`||e===`watch_catchup`||e===`reconcile`||e===`rerun`}function $L(e){return!!(e&&Object.prototype.hasOwnProperty.call(e,`model`)||e?.sessionTurnConfig||e?.sessionTurnConfigUpdatedAt)}function eR(e){if($L(e))return{...e&&Object.prototype.hasOwnProperty.call(e,`model`)?{model:e.model??null}:{},...e?.sessionTurnConfig?{sessionTurnConfig:e.sessionTurnConfig}:{},...e?.sessionTurnConfigUpdatedAt?{sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt}:{}}}function tR(e,t,n){return n?e===`lease_added`?!0:!nR(t,n):!1}function nR(e,t){if(!e||!t)return e===t;let n=Object.prototype.hasOwnProperty.call(e,`model`);return n!==Object.prototype.hasOwnProperty.call(t,`model`)||n&&e.model!==t.model||e.sessionTurnConfigUpdatedAt!==t.sessionTurnConfigUpdatedAt?!1:rR(e.sessionTurnConfig,t.sessionTurnConfig)}function rR(e,t){return!e||!t?e===t:e.mode===t.mode&&e.model===t.model&&e.reasoningEffort===t.reasoningEffort&&(e.execution?.codex?.approvalPolicy??null)===(t.execution?.codex?.approvalPolicy??null)&&(e.execution?.codex?.sandboxMode??null)===(t.execution?.codex?.sandboxMode??null)&&(e.execution?.claude?.permissionMode??null)===(t.execution?.claude?.permissionMode??null)}var iR=class{constructor(e){this.config=e}issue(e){let t=aR(e.sizeBytes??0),n=vT.default.sign({sub:e.deviceId,type:`workspace_preview`,gatewayId:this.config.gatewayId,path:e.canonicalPath,disposition:e.disposition},this.config.accessSecret,{expiresIn:t}),r=vT.default.decode(n);return{ticket:n,expiresAt:r?.exp?new Date(r.exp*1e3).toISOString():new Date().toISOString()}}getExpiresAt(e){let t=vT.default.decode(e);return t?.exp?new Date(t.exp*1e3).toISOString():new Date().toISOString()}verify(e){let t;try{t=vT.default.verify(e,this.config.accessSecret)}catch(e){if(e instanceof Error){if(e.name===`TokenExpiredError`)throw IT();if(e.name===`JsonWebTokenError`||e.name===`NotBeforeError`)throw FT()}throw e}if(t.type!==`workspace_preview`||t.gatewayId!==this.config.gatewayId)throw FT();return t}};function aR(e){return e>20971520?7200:600}var oR=class{constructor(e){this.dependencies=e}async listEntries(e,t=200){if(e.kind===`absolute`)return this.dependencies.fsService.listEntriesAbsolute(e.path,t);let n=await this.requireProject(e.projectId);return this.dependencies.fsService.listEntriesProjectRelative(n.path,e.path??`.`,t)}async resolveFile(e){return{file:(await this.resolveLocator(e)).descriptor}}async readTextFile(e,t={}){let n=await this.resolveLocator(e),r=await this.dependencies.fsService.readTextFile(n.canonicalPath,t);return{file:n.descriptor,...r}}async preparePreview(e,t){let n=await this.resolveLocator(e),r=t.disposition??(n.descriptor.preferredPreviewAction===`share_sheet`||n.descriptor.preferredPreviewAction===`download`?`attachment`:`inline`),i=this.dependencies.previewTicketService.issue({canonicalPath:n.canonicalPath,deviceId:t.deviceId??``,disposition:r,sizeBytes:n.descriptor.sizeBytes}),a=i.ticket,o=i.expiresAt;return{file:n.descriptor,preview:{url:t.buildPreviewUrl(a),expiresAt:o,supportsRange:n.descriptor.capabilities.supportsRange,contentType:n.descriptor.mimeType,contentDisposition:r}}}async readPreviewContent(e,t={}){let n=this.dependencies.previewTicketService.verify(e),r=await this.dependencies.fsService.resolveAbsoluteFile(n.path),i=await this.dependencies.fsService.readFileContentRange(r.canonicalPath,{rangeHeader:t.rangeHeader,includeBody:t.includeBody});return{statusCode:i.statusCode,headers:{contentType:r.mimeType,contentDisposition:cR(n.disposition,r.displayName),contentLength:i.contentLength,etag:i.etag,...r.capabilities.supportsRange?{acceptRanges:`bytes`}:{},...i.contentRange?{contentRange:i.contentRange}:{},...i.lastModified?{lastModified:i.lastModified}:{},cacheControl:`private, max-age=300`},body:i.buffer}}async openPreviewContentStream(e,t={}){let n=this.dependencies.previewTicketService.verify(e),r=await this.dependencies.fsService.resolveAbsoluteFile(n.path),i=await this.dependencies.fsService.openFileContentRangeStream(r.canonicalPath,{rangeHeader:t.rangeHeader,includeBody:t.includeBody});return{statusCode:i.statusCode,headers:{contentType:r.mimeType,contentDisposition:cR(n.disposition,r.displayName),contentLength:i.contentLength,etag:i.etag,...r.capabilities.supportsRange?{acceptRanges:`bytes`}:{},...i.contentRange?{contentRange:i.contentRange}:{},...i.lastModified?{lastModified:i.lastModified}:{},cacheControl:`private, max-age=300`},bodyStream:i.stream}}async resolveLocator(e){if(e.kind===`absolute`){let t=await this.dependencies.fsService.resolveAbsoluteFile(e.path);return{canonicalPath:t.canonicalPath,descriptor:{locator:{kind:`absolute`,path:t.canonicalPath},canonicalPath:t.canonicalPath,displayName:t.displayName,kind:`file`,sizeBytes:t.sizeBytes,mimeType:t.mimeType,extension:t.extension,updatedAt:t.updatedAt,etag:t.etag,previewCategory:t.previewCategory,preferredPreviewAction:t.preferredPreviewAction,capabilities:t.capabilities}}}if(e.kind===`project_relative`){let t=await this.requireProject(e.projectId),n=await this.dependencies.fsService.resolveProjectRelativeFile(t.path,e.path),r=sR(p.default.relative(t.path,n.canonicalPath));return{canonicalPath:n.canonicalPath,descriptor:{locator:{kind:`project_relative`,projectId:t.id,path:r},canonicalPath:n.canonicalPath,displayName:n.displayName,projectId:t.id,relativePath:r,kind:`file`,sizeBytes:n.sizeBytes,mimeType:n.mimeType,extension:n.extension,updatedAt:n.updatedAt,etag:n.etag,previewCategory:n.previewCategory,preferredPreviewAction:n.preferredPreviewAction,capabilities:n.capabilities}}}let t=this.dependencies.sessionManager.getSessionExecutionContext(e.sessionId),n=await this.dependencies.fsService.resolveProjectRelativeFile(t.projectPath,e.path),r=sR(p.default.relative(t.projectPath,n.canonicalPath));return{canonicalPath:n.canonicalPath,descriptor:{locator:{kind:`session_relative`,sessionId:e.sessionId,path:r},canonicalPath:n.canonicalPath,displayName:n.displayName,projectId:t.projectId,relativePath:r,kind:`file`,sizeBytes:n.sizeBytes,mimeType:n.mimeType,extension:n.extension,updatedAt:n.updatedAt,etag:n.etag,previewCategory:n.previewCategory,preferredPreviewAction:n.preferredPreviewAction,capabilities:n.capabilities}}}async requireProject(e){let t=await this.dependencies.sessionManager.getProject(e);if(!t)throw LT(e);return t}};function sR(e){return e.split(p.default.sep).join(`/`)}function cR(e,t){return`${e}; filename="${t.replace(/["\\]/g,`_`)}"`}function lR(e,t){let n=process.env[e];if(!n)return t;let r=Number(n);return Number.isInteger(r)&&r>0?r:t}function uR(e){let t=e.intervalMs??lR(`GATEWAY_EVENT_LOOP_STALL_INTERVAL_MS`,250),n=e.thresholdMs??lR(`GATEWAY_EVENT_LOOP_STALL_THRESHOLD_MS`,1e3),r=k.performance.now()+t,i=k.performance.now(),a=process.cpuUsage(),o=setInterval(()=>{let o=k.performance.now(),s=o-r;r=o+t;let c=o-i,l=process.cpuUsage(a);if(i=o,a=process.cpuUsage(),s<n)return;let u=process.memoryUsage();e.logger.warn?.({event:`gateway.event_loop.stall`,stallMs:Math.round(s),elapsedSinceLastTickMs:Math.round(c),intervalMs:t,thresholdMs:n,cpuUserMs:Math.round(l.user/1e3),cpuSystemMs:Math.round(l.system/1e3),rssMb:Math.round(u.rss/1024/1024),heapUsedMb:Math.round(u.heapUsed/1024/1024),externalMb:Math.round(u.external/1024/1024)},`gateway event loop stall detected`)},t);return o.unref?.(),{stop:()=>clearInterval(o)}}function dR(e){return e.map(e=>({sessionId:e.sessionId,projectId:e.projectId,cursor:e.cursor.kind===`raw_seq`?{kind:`raw_seq`,rawSeq:e.cursor.rawSeq}:{kind:`all`},purpose:e.purpose,detailLevel:e.detailLevel,bootstrapMode:e.bootstrapMode}))}const fR=process.env.NATIVE_SESSION_WATCH_DEBUG===`1`||process.env.EXPO_PUBLIC_NATIVE_SESSION_WATCH_DEBUG===`1`;process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG;const pR=`[redacted:image-data]`;let mR=null;const hR={perMessageDeflate:{threshold:1024}},gR={globalDecompression:!1,threshold:1024,customTypes:/^text\/(?!event-stream)|(?:\+|\/)json(?:;|$)|(?:\+|\/)text(?:;|$)|(?:\+|\/)xml(?:;|$)/u},_R=4096;function vR(e){if(Array.isArray(e))return e.map(e=>vR(e));if(!e||typeof e!=`object`)return e;let t={};for(let[n,r]of Object.entries(e))t[n]=n===`dataBase64`||n===`data_base64`?pR:vR(r);return t}function yR(e,t){if(e)try{return JSON.stringify(vR(e))}catch{}return t.replace(/("(?:dataBase64|data_base64)"\s*:\s*")([^"]*)(")/gu,`$1${pR}$3`)}function bR(e){return p.default.join(p.default.dirname(e),`session-attachments`)}function xR(e,t){fR&&(console.log(`[native-watch][gateway]`,e,t),mR?.info({event:e,...t},`native session watch debug`))}function SR(e){return e?typeof e==`string`?e:e.toString(`utf8`):``}function CR(e){return{sessionId:e.sessionId,projectId:e.projectId??null,purpose:e.purpose??null,detailLevel:e.detailLevel??null,bootstrapMode:e.bootstrapMode??null,cursorKind:e.cursor.kind,rawSeq:e.cursor.kind===`raw_seq`?e.cursor.rawSeq:null}}async function wR(e){let t=e.limit??300,n=e.detailLevel??`full`,r=(r,i)=>{vM(`raw-events.list`,{requestSource:e.requestSource,projectId:e.projectId,sessionId:e.sessionId,limit:t,detailLevel:n,requestedCursor:e.fromRawSeqExclusive??null,decision:r.decision,reason:r.reason,fromRawSeqExclusive:r.fromRawSeqExclusive??null,toRawSeq:r.toRawSeq??null,returnedCount:r.events.length,returnedFirstRawSeq:r.events[0]?.rawSeq??null,returnedLastRawSeq:r.events[r.events.length-1]?.rawSeq??null,...i})};if(e.fromRawSeqExclusive===void 0){let i=await e.sessionManager.getProjectSessionRawEvents(e.projectId,e.sessionId,t),a={decision:`snapshot`,reason:i.length===0?`empty_history_snapshot`:`initial_snapshot`,toRawSeq:i[i.length-1]?.rawSeq,events:xD(i,n)};return r(a),a}let i=await e.sessionManager.getProjectSessionRawSeqRange(e.projectId,e.sessionId);if(!i){let e={decision:`snapshot`,reason:`empty_history_snapshot`,events:[]};return r(e,{rangeMin:null,rangeMax:null,minExpectedCursor:null}),e}let a=Math.max(0,i.min-1);if(e.fromRawSeqExclusive<a||e.fromRawSeqExclusive>i.max){let o=await e.sessionManager.getProjectSessionRawEvents(e.projectId,e.sessionId,t),s={decision:`snapshot`,reason:`cursor_out_of_range`,toRawSeq:o[o.length-1]?.rawSeq,events:xD(o,n)};return r(s,{rangeMin:i.min,rangeMax:i.max,minExpectedCursor:a}),s}let o=await e.sessionManager.getProjectSessionRawEventsSinceSeq(e.projectId,e.sessionId,e.fromRawSeqExclusive,t),s={decision:`delta`,reason:`cursor_valid_delta`,fromRawSeqExclusive:e.fromRawSeqExclusive,toRawSeq:o[o.length-1]?.rawSeq??e.fromRawSeqExclusive,events:xD(o,n)};return r(s,{rangeMin:i.min,rangeMax:i.max,minExpectedCursor:a}),s}async function TR(e,t={}){await F_(e.gatewayLogPath);let n=DR(e,t),r=ER(e,n.instance);_M(r.log),mR=r.log,await r.register(bT.default,{origin:!0}),await r.register(xT.default,gR),await r.register(yT.default,{options:hR});let i=process.env.NODE_ENV!==`production`,a=4e3,o=`[unserializable payload]`,s=new XT(e);await s.init();let c=new oE(e.auditLogPath),l=new qL,u=new KE,d=new UD(e.projectStoreDir),f=new XF(e.sessionHistoryDir,{logDebug:vM});await f.init();let m=uR({logger:r.log}),h=new rM(p.default.join(e.sessionHistoryDir,`discovery-v1`));await h.init();let g=new Wj({store:h});await g.init();let _,v=null,y=new Map,b=await fh(e.authStoreDir),x=new iR(e),S=e.relayEnabled?Ng({relayUrl:e.relayUrl,gatewayHost:e.host}):``,C=e=>{let t=y.get(e);t&&(clearTimeout(t.timeout),y.delete(e),t.resolve())},w=(e,t)=>{let n=y.get(e);n&&(clearTimeout(n.timeout),y.delete(e),n.reject(t instanceof Error?t:Error(String(t))))},T=(e,t)=>new Promise((n,r)=>{w(e,Error(`Duplicate pending relay file upload start for request ${e}`));let i=setTimeout(()=>{y.delete(e),r(Error(`Relay file upload start timed out for request ${e}`))},t);y.set(e,{resolve:n,reject:r,timeout:i})}),E=new MP({preferNativeProviders:e.enableNativeProviders,requireNativeCodex:e.requireNativeCodex,auditLogger:c,projectStore:d,historyStore:f,logger:r.log,attachmentStoreDir:bR(e.sessionHistoryDir),runtimeLifecycle:{idleTtlMs:e.runtimeIdleTtlMs,sweepIntervalMs:e.runtimeSweepIntervalMs,maxSessions:e.runtimeMaxSessions,maxCodexSessions:e.runtimeMaxCodexSessions,maxClaudeSessions:e.runtimeMaxClaudeSessions},onEnvelope:e=>{l.routeProviderRaw(e),O.routeReadableLiveDelta(e)}}),D=new oR({fsService:u,sessionManager:E,previewTicketService:x}),O=new HL(l,E,e.readableLiveDeltaCoalesceMs,vM),k=new XL({sessionManager:E,logger:r.log,sendStreamMessage:(e,t)=>{l.sendStreamMessage(e,t)},createExternalUpdateMessage:e=>QI(e),refreshDetailSessionSnapshots:e=>O.refreshDetailSessionSnapshots(e)});E.warmStartupProviderCapabilities().catch(e=>{r.log.warn({err:e},`startup provider capability warmup failed`)});let A=new Hg({packageName:z.packageName,currentVersion:z.version,sessionHub:l,logger:r.log,consoleWrite:e=>{console.log(e)},getRunningSessionCount:async()=>E.getRunningRuntimeSessionCount(),requestPreparedUpdate:t.onUpdatePrepared});r.addHook(`onClose`,async()=>{r.log.info({hasRelayClient:!!v},`gateway shutdown starting`);try{O.shutdown(),k.close(),m.stop(),v?.close(),N.close(),await A.shutdown(),await E.shutdown(),await f.shutdown();for(let[e,t]of y.entries())clearTimeout(t.timeout),t.reject(Error(`Gateway shutting down`)),y.delete(e);r.log.info(`gateway shutdown completed`)}catch(e){throw r.log.error({err:e},`gateway shutdown failed`),e}finally{_M(null),mR=null,n.close()}}),i&&r.addHook(`onSend`,async(e,t,n)=>(r.log.info({method:e.method,url:e.url,statusCode:t.statusCode,responseBody:R(n)},`gateway response (dev)`),n)),r.get(`/health`,async()=>({ok:!0,service:`desktop-gateway`,now:new Date().toISOString(),wsClients:l.count(),gatewayName:e.name,machineName:vh(),gatewayIdentity:b.identity})),r.get(`/api/pairing/descriptor`,async()=>Tg({gatewayId:e.gatewayId,gatewayName:e.name,machineName:vh(),relayBaseUrl:S,directBaseUrls:jg({protocol:e.httpsEnabled?`https`:`http`,host:e.host,port:e.httpsEnabled?e.httpsPort:e.port}),relayTransportSecurityLevel:e.relayEnabled?e.relayTransportSecurityLevel:void 0,gatewayIdentity:b.identity})),r.post(`/api/pairing/start`,async(t,n)=>{if(!L(t))return n.code(401).send({error:`Unauthorized`});try{let t=await s.createPairingCode(e.pairingCodeTtlSeconds);return await c.record({ts:new Date().toISOString(),action:`pairing.start`,detail:{expiresAt:t.expiresAt,source:`api`,ttlSeconds:e.pairingCodeTtlSeconds}}),t}catch(e){return r.log.error({err:e},`failed to generate pairing code via API`),n.code(500).send({error:`Failed to generate pairing code`,detail:String(e)})}}),r.post(`/api/pairing/claim`,async(t,n)=>{let r=ru.safeParse(t.body);if(!r.success)return n.code(400).send({error:`Invalid request`,detail:r.error.flatten()});try{let t=he(r.data.deviceName),n=await s.claimPairingCode(r.data.code,t,r.data.deviceIdentity);return await c.record({ts:new Date().toISOString(),action:`pairing.claim`,deviceId:n.deviceId,detail:{deviceName:t}}),II(b,{...n,gatewayName:e.name,machineName:vh()},r.data.code,r.data.deviceIdentity)}catch(e){return n.code(400).send({error:String(e)})}}),r.post(`/api/auth/refresh`,async(e,t)=>{let n=ou.safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await jI({authService:s,execute:()=>s.refreshAccessToken(n.data.refreshToken),logger:r.log,refreshToken:n.data.refreshToken,source:`direct_http`})}catch(e){return t.code(401).send({error:String(e)})}});let j=()=>rf.parse({name:e.name,machineName:vh()}),M=async n=>{let r=rf.pick({name:!0}).parse(n);if(!t.configPath)throw Error(`Gateway config path is unavailable`);return e.name=await Nh(t.configPath,r.name),j()};r.get(`/api/gateway/settings`,async(e,t)=>{if(ne(e,t))return j()}),r.post(`/api/gateway/settings`,async(e,t)=>{if(!ne(e,t))return;let n=rf.pick({name:!0}).safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await M(n.data)}catch(e){return t.code(500).send({error:String(e)})}}),r.get(`/api/projects`,async(e,t)=>{if(ne(e,t))return{projects:await E.listProjects()}}),r.get(`/api/gateway/update`,async(e,t)=>{if(ne(e,t))try{return await A.getOrCheckInfo(`mobile`)}catch(e){return t.code(500).send({error:String(e)})}}),r.post(`/api/gateway/update/check`,async(e,t)=>{if(!ne(e,t))return;let n=e.body,r=Bd.safeParse(n?.requestedBy);try{return await A.checkForUpdates(r.success?r.data:`mobile`)}catch(e){return t.code(500).send({error:String(e)})}}),r.post(`/api/gateway/update/apply`,async(e,t)=>{if(!ne(e,t))return;let n=e.body,r=Bd.safeParse(n?.requestedBy);try{let e=await A.applyUpdate(r.success?r.data:`mobile`);return Gd.parse(e)}catch(e){let n=String(e),r=n.includes(`already up to date`)||n.includes(`does not support self-update`)||n.includes(`requires idle runtime`)?409:500;return t.code(r).send({error:n})}}),r.post(`/api/codex/app-server/restart`,async(e,t)=>{if(ne(e,t))try{return gu.parse(await E.restartCodexAppServer())}catch(e){let n=kT(e)?e.status:500;return t.code(n).send({error:String(e)})}}),r.get(`/api/codex/accounts`,async(e,t)=>{if(ne(e,t))try{return fu.parse(await E.getCodexAccounts())}catch(e){return re(t,e)}}),r.post(`/api/codex/accounts/save`,async(e,t)=>{if(ne(e,t))try{return pu.parse(await E.saveCurrentCodexAccount())}catch(e){return re(t,e)}}),r.post(`/api/codex/accounts/switch`,async(e,t)=>{if(!ne(e,t))return;let n=e.body;if(typeof n?.accountId!=`string`||!n.accountId.trim())return t.code(400).send({error:`accountId is required and must be a non-empty string`});try{return mu.parse(await E.switchCodexAccount(n.accountId))}catch(e){return re(t,e)}}),r.post(`/api/codex/accounts/delete`,async(e,t)=>{if(!ne(e,t))return;let n=e.body;if(typeof n?.accountId!=`string`||!n.accountId.trim())return t.code(400).send({error:`accountId is required and must be a non-empty string`});try{return hu.parse(await E.deleteSavedCodexAccount(n.accountId))}catch(e){return re(t,e)}}),r.get(`/api/discovery/projects`,async(e,t)=>{if(ne(e,t))try{return await g.getProjects()}catch(e){return t.code(500).send({error:String(e)})}}),r.post(`/api/discovery/projects/refresh`,async(e,t)=>{if(ne(e,t))try{return await g.refreshProjects()}catch(e){return t.code(500).send({error:String(e)})}}),r.get(`/api/discovery/projects/sessions`,async(e,t)=>{if(!ne(e,t))return;let n=e.query;if(typeof n.projectPath!=`string`||!n.projectPath.trim())return t.code(400).send({error:`projectPath is required and must be a non-empty string`});try{return await g.listProjectSessions(n.projectPath)}catch(e){let n=e instanceof Error?e.message:String(e);return kT(e)&&e.code===`DISCOVERED_PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):HI(n)?t.code(400).send({error:n}):t.code(500).send({error:n})}}),r.get(`/api/workspace/directories`,async(e,t)=>{if(!ne(e,t))return;let n=e.query,r=Number(n.limit??200),i=Number.isFinite(r)?Math.min(500,Math.max(1,r)):200;try{return await u.listDirectoriesUnrestricted(typeof n.path==`string`?n.path:void 0,i)}catch(e){return t.code(400).send({error:String(e)})}}),r.post(`/api/workspace/directories`,async(e,t)=>{if(!ne(e,t))return;let n=e.body;if(typeof n?.path!=`string`||!n.path.trim())return t.code(400).send({error:`path is required and must be a non-empty string`});if(typeof n.name!=`string`||!n.name.trim())return t.code(400).send({error:`name is required and must be a non-empty string`});try{return await u.createDirectoryUnrestricted(n.path,n.name,200)}catch(e){return t.code(400).send({error:String(e)})}}),r.get(`/api/workspace/entries`,async(e,t)=>{if(!ne(e,t))return;let n=e.query,r=Number(n.limit??200),i=Number.isFinite(r)?Math.min(500,Math.max(1,r)):200;try{let t=ie(e.query);return await D.listEntries(t,i)}catch(e){return re(t,e)}}),r.get(`/api/workspace/files/resolve`,async(e,t)=>{if(ne(e,t))try{let t=ae(e.query);return await D.resolveFile(t)}catch(e){return re(t,e)}}),r.get(`/api/workspace/files/text`,async(e,t)=>{if(!ne(e,t))return;let n=e.query,r=n.startLine?Number(n.startLine):void 0,i=n.maxLines?Number(n.maxLines):void 0,a=n.maxBytes?Number(n.maxBytes):void 0;try{let t=ae(e.query);return await D.readTextFile(t,{startLine:typeof r==`number`&&Number.isFinite(r)?r:void 0,maxLines:typeof i==`number`&&Number.isFinite(i)?i:void 0,maxBytes:typeof a==`number`&&Number.isFinite(a)?a:void 0})}catch(e){return re(t,e)}}),r.post(`/api/workspace/files/preview`,async(e,t)=>{let n=ne(e,t);if(!n)return;let r=e.body,i=Ja.safeParse(r?.locator);if(!i.success)return t.code(400).send({error:i.error.issues[0]?.message??`Invalid workspace file locator`});let a;if(r?.disposition!==void 0){let e=io.safeParse(r.disposition);if(!e.success)return t.code(400).send({error:e.error.issues[0]?.message??`Invalid preview disposition`});a=e.data}try{return await D.preparePreview(i.data,{deviceId:n.sub,disposition:a,buildPreviewUrl:t=>`${oe(e)}/api/workspace/files/content/${encodeURIComponent(t)}`})}catch(e){return re(t,e)}}),r.route({method:[`GET`,`HEAD`],url:`/api/workspace/files/content/:ticket`,handler:async(e,t)=>{let n=e.params.ticket?.trim()??``;if(!n)return t.code(400).send({error:`ticket is required`});try{let r=await D.readPreviewContent(n,{rangeHeader:typeof e.headers.range==`string`?e.headers.range:void 0,includeBody:e.method!==`HEAD`});return t.code(r.statusCode),t.header(`Content-Type`,r.headers.contentType),t.header(`Content-Disposition`,r.headers.contentDisposition),t.header(`Content-Length`,String(r.headers.contentLength)),t.header(`ETag`,r.headers.etag),t.header(`Cache-Control`,r.headers.cacheControl),r.headers.acceptRanges&&t.header(`Accept-Ranges`,r.headers.acceptRanges),r.headers.contentRange&&t.header(`Content-Range`,r.headers.contentRange),r.headers.lastModified&&t.header(`Last-Modified`,r.headers.lastModified),e.method===`HEAD`||!r.body?t.send():t.send(r.body)}catch(e){return re(t,e)}}}),r.get(`/api/providers/:provider/capabilities`,async(e,t)=>{if(!ne(e,t))return;let n=le(e,t);if(n)try{return{capabilities:await E.getProviderCapabilities(n.provider,n.projectId,n.agentVersion)}}catch(e){return kT(e)&&e.code===`PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):t.code(400).send({error:String(e)})}}),r.post(`/api/providers/:provider/execution-defaults`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=Pa.safeParse(n.provider);if(!r.success)return t.code(400).send({error:`Invalid provider`});let i=Ha.safeParse({...e.body&&typeof e.body==`object`&&!Array.isArray(e.body)?e.body:{},provider:r.data});if(!i.success)return t.code(400).send({error:i.error.message});try{return{defaults:await E.updateProviderExecutionDefaults(i.data)}}catch(e){return t.code(400).send({error:String(e)})}}),r.get(`/api/agents/:provider/config`,async(e,t)=>{if(!ne(e,t))return;let n=le(e,t);if(n)try{return await E.getAgentConfig(n.provider,{projectId:n.projectId,agentVersion:n.agentVersion})}catch(e){return kT(e)&&e.code===`PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):t.code(400).send({error:String(e)})}}),r.post(`/api/projects`,async(e,t)=>{if(!ne(e,t))return;let n=e.body;if(typeof n.path!=`string`||!n.path.trim())return t.code(400).send({error:`path is required and must be a non-empty string`});try{return{project:await E.createProject({path:n.path,title:typeof n.title==`string`?n.title:void 0})}}catch(e){return t.code(400).send({error:String(e)})}}),r.delete(`/api/projects/:projectId`,async(e,t)=>{if(!ne(e,t))return;let n=e.params;try{return await E.deleteProject(n.projectId)?{removed:!0}:t.code(404).send({error:`Project not found`})}catch(e){return t.code(409).send({error:String(e)})}}),r.get(`/api/projects/:projectId/sessions`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=e.query,i=se(r.status,t);if(!i)return;let a=ce(r.syncExternal);try{return{sessions:await E.listProjectSessions(n.projectId,i,{syncExternal:a})}}catch(e){return kT(e)&&e.code===`PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):t.code(500).send({error:String(e)})}}),r.get(`/api/projects/:projectId/sessions/:sessionId`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=await E.getProjectSessionSummary(n.projectId,n.sessionId);return r?{session:r}:t.code(404).send({error:`Session not found`})}),r.get(`/api/projects/:projectId/sessions/:sessionId/config`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=await E.getProjectSessionConfig(n.projectId,n.sessionId);return r?{session:r}:t.code(404).send({error:`Session not found`})}),r.post(`/api/projects/:projectId/sessions/:sessionId/history-sync`,async(e,t)=>{if(!ne(e,t))return;let n=e.params;try{let e=await E.syncProjectSessionHistory(n.projectId,n.sessionId);return e.historyUpdated&&await O.refreshDetailSessionSnapshots({projectId:n.projectId,sessionId:n.sessionId,reason:`explicit_history_sync`,refreshMode:e.refreshMode,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}),{session:e.session,rawEventCount:e.rawEvents.length,historyUpdated:e.historyUpdated,statusChanged:e.statusChanged,refreshMode:e.refreshMode,...e.fromRawSeq===void 0?{}:{fromRawSeq:e.fromRawSeq},...e.toRawSeq===void 0?{}:{toRawSeq:e.toRawSeq}}}catch(e){return kT(e)&&(e.code===`PROJECT_NOT_FOUND`||e.code===`PROJECT_SESSION_NOT_FOUND`)?t.code(e.status).send({error:String(e)}):t.code(500).send({error:String(e)})}}),r.get(`/api/projects/:projectId/sessions/:sessionId/events`,async(e,t)=>t.code(410).send({error:`Session events endpoint is deprecated. Use /api/projects/:projectId/sessions/:sessionId/raw-events`})),r.get(`/api/projects/:projectId/sessions/:sessionId/raw-events`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=e.query,i=(typeof r.limit==`string`?r.limit.trim().toLowerCase():``)===`all`?2**53-1:(()=>{let e=Number(r.limit??300);return Number.isFinite(e)?Math.min(2e3,Math.max(1,e)):300})(),a=typeof r.fromRawSeqExclusive==`string`?Number(r.fromRawSeqExclusive):void 0,o=rl.safeParse(r.detailLevel).success?rl.parse(r.detailLevel):`full`;try{return await ee(n.projectId,n.sessionId,i,typeof a==`number`&&Number.isFinite(a)?Math.max(0,Math.floor(a)):void 0,o,`http`)}catch(e){return kT(e)&&(e.code===`PROJECT_NOT_FOUND`||e.code===`PROJECT_SESSION_NOT_FOUND`)?t.code(e.status).send({error:String(e)}):t.code(500).send({error:String(e)})}}),r.get(`/api/projects/:projectId/sessions/:sessionId/readable-items/:itemId`,async(e,t)=>{if(!ne(e,t))return;let n=e.params;try{return await kI({sessionManager:E,readableItemDetailLookup:O,projectId:n.projectId,sessionId:n.sessionId,itemId:n.itemId})||t.code(404).send({error:`Readable item not found`})}catch(e){return kT(e)&&(e.code===`PROJECT_NOT_FOUND`||e.code===`PROJECT_SESSION_NOT_FOUND`)?t.code(e.status).send({error:String(e)}):t.code(500).send({error:String(e)})}}),r.get(`/api/projects/:projectId/fs/tree`,async(e,t)=>{if(!ne(e,t))return;let n=e.params,r=e.query,i=await E.getProject(n.projectId);if(!i)return t.code(404).send({error:`Project not found`});try{return await u.listTree(i.path,r.path??`.`)}catch(e){return t.code(400).send({error:String(e)})}}),r.get(`/api/sessions`,async(e,t)=>t.code(410).send({error:`Use /api/projects/:projectId/sessions`})),r.get(`/api/sessions/:sessionId`,async(e,t)=>t.code(410).send({error:`Use /api/projects/:projectId/sessions/:sessionId`})),r.get(`/api/sessions/:sessionId/events`,async(e,t)=>t.code(410).send({error:`Use /api/projects/:projectId/sessions/:sessionId/raw-events`})),r.get(`/api/fs/tree`,async(e,t)=>t.code(410).send({error:`Use /api/projects/:projectId/fs/tree`})),r.get(`/api/devices`,async(e,t)=>L(e)?{devices:s.listDevices()}:t.code(401).send({error:`Unauthorized`})),r.post(`/api/devices/:deviceId/revoke`,async(e,t)=>{if(!L(e))return t.code(401).send({error:`Unauthorized`});let n=e.params;return await s.revokeDevice(n.deviceId)?(await c.record({ts:new Date().toISOString(),action:`device.revoke`,deviceId:n.deviceId}),{revoked:!0}):t.code(404).send({error:`Device not found`})}),r.get(`/ws`,{websocket:!0},(e,t)=>{let n=ue(t.headers.authorization)??de(t.url);if(!n){e.close(1008,`Missing access token`);return}let i;try{i=s.verifyAccessToken(n)}catch(t){e.close(1008,`Unauthorized: ${String(t)}`);return}let a=l.addClient(i.sub,e);e.on(`message`,async e=>{let t=e.toString(),n;try{let e=JSON.parse(t);e&&typeof e==`object`&&(n=e),await F(_l(e),i.sub,a)}catch(e){await I({deviceId:i.sub,clientId:a,rawCommand:yR(n,t),parsedInput:n,error:e})}}),e.on(`close`,(e,t)=>{let n=l.getSubscriptions(a),o=k.getClientWatchTargets(a);r.log.info({clientId:a,deviceId:i.sub,transport:`direct`,closeCode:typeof e==`number`?e:null,closeReason:SR(t),streamSubscriptionCount:n.length,streamSubscriptions:n.map(CR),externalWatchTargetCount:o.length,externalWatchTargets:o},`gateway websocket client disconnected`),k.removeClient(a),l.removeClient(a),O.clearStatesForClient(a)})});let N=new xM({gatewayId:e.gatewayId,relayTransportSecurityLevel:e.relayEnabled?e.relayTransportSecurityLevel:`plaintext-relay`,gatewayIdentity:b.identity,gatewayIdentityPrivateKeyPem:b.privateKeyPem,sessionHub:l,logger:r.log,describeClientState:e=>{let t=l.getSubscriptions(e),n=k.getClientWatchTargets(e);return{streamSubscriptionCount:t.length,streamSubscriptions:t.map(CR),externalWatchTargetCount:n.length,externalWatchTargets:n}},handlePairingClaim:async t=>{let n=he(t.deviceName);return II(b,{...await s.claimPairingCode(t.code,n,t.deviceIdentity),gatewayName:e.name,machineName:vh()},t.code,t.deviceIdentity)},handleRefresh:async t=>{let n=await jI({authService:s,execute:()=>s.refreshAccessToken(t.refreshToken),logger:r.log,refreshToken:t.refreshToken,requestedDeviceId:t.deviceId,source:`relay_http_forward`});return AI(t.deviceId,n.deviceId),{gatewayId:e.gatewayId,...n}},handleFileContentRequest:async(e,t)=>{if(t.method===`GET`&&t.responseMode===`stream_upload`){let n=await D.openPreviewContentStream(t.ticket,{rangeHeader:t.rangeHeader,includeBody:!0});if(n.bodyStream&&t.uploadUrl&&t.uploadToken){let i=T(e,15e3),a=kR({uploadUrl:t.uploadUrl,uploadToken:t.uploadToken,contentLength:n.headers.contentLength,bodyStream:n.bodyStream});a.completed.catch(n=>{w(e,n),r.log.warn({err:n,requestId:e,ticket:t.ticket},`relay workspace preview upload failed`)});try{await i}catch(e){throw a.abort(e),e}}return ep.parse({status:n.statusCode,headers:n.headers,...n.bodyStream?{bodyTransport:`stream_upload`}:{}})}let n=await D.readPreviewContent(t.ticket,{rangeHeader:t.rangeHeader,includeBody:t.method===`GET`});return ep.parse({status:n.statusCode,headers:n.headers,...n.body?{bodyBase64:n.body.toString(`base64`)}:{}})},verifyDeviceIdentityBinding:async(e,t)=>s.verifyDeviceIdentityBinding(e,t),handleRpcRequest:async(t,n)=>RI(t,{gatewayId:e.gatewayId,relayPreviewBaseUrl:S,authService:s,logger:r.log,sessionManager:E,projectDiscoveryService:g,fsService:u,workspaceFileService:D,updateService:A,gatewaySettings:{get:j,update:M},relayDeviceId:n.deviceId,readableItemDetailLookup:O,refreshDetailSessionSnapshots:e=>O.refreshDetailSessionSnapshots(e),buildRawEventsListResult:wR}),handleFileContentUploadStarted:C,sendFrame:e=>v?.send(e)??!1,dispatchCommand:async(e,t,n)=>{try{await F(e,t,n)}catch(r){await I({deviceId:t,clientId:n,rawCommand:yR(e,JSON.stringify(e)),parsedInput:e,error:r})}}}),P=async(e,t,n)=>{switch(e.type){case`session.start`:{let r=await E.startSession({...e.payload,deviceId:t});l.sendSystemMessage(n,{type:`command.ack`,commandType:e.type,commandId:e.commandId,payload:r});return}case`turn.input`:await E.sendInput(e.payload.sessionId,e.payload.text,t,{model:e.payload.model,sessionConfig:e.payload.sessionConfig,mode:e.payload.mode,config:e.payload.config,attachments:e.payload.attachments,commandId:e.commandId});return;case`review.start`:await E.startReview(e.payload.sessionId,e.payload.config,t,{input:e.payload.input,turnConfig:e.payload.turnConfig});return;case`tool.approval.respond`:await E.respondToolPermission(e.payload.sessionId,e.payload.requestId,e.payload.decision,e.payload.reason,t);return;case`user.input.respond`:await E.respondUserInput(e.payload.sessionId,e.payload.requestId,e.payload.answers,t);return;case`session.interrupt`:await E.interruptSession(e.payload.sessionId,t);return;case`session.close`:throw Error(`session.close is deprecated. Use session.interrupt instead.`);case`session.external.watch.set`:{xR(`command.received`,{clientId:n,deviceId:t,replace:e.payload.replace,sessionCount:e.payload.sessions.length,sessions:e.payload.sessions}),r.log.info({clientId:n,deviceId:t,replace:e.payload.replace,sessionCount:e.payload.sessions.length,sessions:e.payload.sessions},`received session.external.watch.set`);let i=k.setClientWatchTargets(n,e.payload.sessions,e.payload.replace);xR(`command.applied`,{clientId:n,deviceId:t,replace:e.payload.replace,requestedSessionCount:e.payload.sessions.length,targetCount:i.length,targets:i}),r.log.info({clientId:n,deviceId:t,replace:e.payload.replace,requestedSessionCount:e.payload.sessions.length,targetCount:i.length,targets:i},`applied session.external.watch.set`),l.sendSystemMessage(n,{type:`command.ack`,commandType:e.type,commandId:e.commandId,payload:{replace:e.payload.replace,sessions:i.map(e=>e.sessionId)}});return}case`session.stream.subscribe`:{let t=dR(e.payload.sessions);await O.handleSessionStreamSubscribeCommand(n,t,e.payload.replace),l.sendSystemMessage(n,{type:`command.ack`,commandType:e.type,commandId:e.commandId,payload:{replace:e.payload.replace,sessions:t.map(e=>e.sessionId)}});return}case`fs.read`:{let t=E.getSessionExecutionContext(e.payload.sessionId),n=await u.readFile(t.projectPath,e.payload.path);await E.emitExternalEvent({provider:t.provider,sessionId:e.payload.sessionId,projectId:t.projectId,type:`file.changed`,raw:{path:n.path,content:n.content}});return}case`fs.diff`:{let t=E.getSessionExecutionContext(e.payload.sessionId),n=await u.diffFile(t.projectPath,e.payload.path,e.payload.baseContent??``);await E.emitExternalEvent({provider:t.provider,sessionId:e.payload.sessionId,projectId:t.projectId,type:`file.diff.ready`,raw:{path:n.path,diff:n.diff,currentContent:n.currentContent}});return}default:{let t=e;throw Error(`Unhandled command: ${JSON.stringify(t)}`)}}},F=async(e,t,n)=>{await P(e,t,n)},I=async e=>{r.log.warn({deviceId:e.deviceId,rawCommand:e.rawCommand,err:e.error},`ws command failed`);let t=typeof e.parsedInput?.commandId==`string`?e.parsedInput.commandId:void 0,n=typeof e.parsedInput?.type==`string`?e.parsedInput.type:void 0;l.sendSystemMessage(e.clientId,{type:`command.error`,commandId:t,commandType:n,message:String(e.error)}),await E.emitExternalEvent({provider:`codex`,sessionId:`system`,type:`error.runtime`,raw:{message:String(e.error),source:`ws.command`}})},ee=async(e,t,n=300,r,i=`full`,a=`http`)=>wR({sessionManager:E,projectId:e,sessionId:t,limit:n,fromRawSeqExclusive:r,detailLevel:i,requestSource:a}),L=t=>t.headers[`x-api-key`]===e.apiKey,R=e=>{if(e==null)return e;if(typeof e==`string`){let t=B(e);return t===void 0?V(e,a):U(H(t))}if(Buffer.isBuffer(e)){let t=e.toString(`utf8`),n=B(t);return n===void 0?V(t,a):U(H(n))}return typeof e==`object`?U(H(e)):String(e)},B=e=>{try{return JSON.parse(e)}catch{return}},V=(e,t)=>e.length<=t?e:`${e.slice(0,t)}...<truncated>`,H=e=>{if(Array.isArray(e))return e.map(e=>H(e));if(e&&typeof e==`object`){let t=e,n={};for(let[e,r]of Object.entries(t)){let t=e.toLowerCase();t.includes(`token`)||t.includes(`secret`)||t.includes(`password`)||t.includes(`authorization`)?n[e]=`[REDACTED]`:n[e]=H(r)}return n}return e},U=e=>{let t=te(e);return t===o?t:t.length<=a?e:{truncated:!0,preview:V(t,a)}},te=e=>{try{return JSON.stringify(e,(e,t)=>typeof t==`bigint`?t.toString():t)}catch{return o}},ne=(e,t)=>{let n=ue(e.headers.authorization);if(!n)return t.code(401).send({error:`Missing bearer token`}),null;try{return s.verifyAccessToken(n)}catch(e){return t.code(401).send({error:String(e)}),null}},re=(e,t)=>{let n=kT(t)?t.status:500;return kT(t)?e.code(n).send({error:String(t),code:t.code,...t.details===void 0?{}:{details:t.details}}):e.code(n).send({error:String(t)})},ie=e=>{let t=e&&typeof e==`object`?e:{},n=Ya.safeParse({kind:typeof t.locatorKind==`string`?t.locatorKind:void 0,projectId:typeof t.projectId==`string`?t.projectId:void 0,path:typeof t.path==`string`?t.path:void 0});if(!n.success)throw Error(n.error.issues[0]?.message??`Invalid workspace entries locator`);return n.data},ae=e=>{let t=e&&typeof e==`object`?e:{},n=Ja.safeParse({kind:typeof t.locatorKind==`string`?t.locatorKind:void 0,sessionId:typeof t.sessionId==`string`?t.sessionId:void 0,projectId:typeof t.projectId==`string`?t.projectId:void 0,path:typeof t.path==`string`?t.path:void 0});if(!n.success)throw Error(n.error.issues[0]?.message??`Invalid workspace file locator`);return n.data},oe=t=>{let n=t.headers.host?.trim();return n?`${t.protocol}://${n}`.replace(/\/+$/,``):`${e.httpsEnabled?`https`:`http`}://${e.host}:${e.httpsEnabled?e.httpsPort:e.port}`},se=(e,t)=>{let n=e??`all`;return[`running`,`idle`,`all`].includes(n)?n:(t.code(400).send({error:`Invalid status filter`}),null)},ce=e=>{let t=e?.trim().toLowerCase();return t===`true`||t===`1`},le=(e,t)=>{let n=e.params,r=e.query,i=Pa.safeParse(n.provider);return i.success?{provider:i.data,projectId:typeof r.projectId==`string`?r.projectId:void 0,agentVersion:typeof r.agentVersion==`string`?r.agentVersion:void 0}:(t.code(400).send({error:`Invalid provider`}),null)},ue=e=>{if(!e)return null;let[t,n]=e.split(` `);return t?.toLowerCase()!==`bearer`||!n?null:n},de=e=>{try{return new URL(e,`http://localhost`).searchParams.get(`token`)}catch{return null}},fe=e.httpsEnabled?e.httpsPort:e.port,pe=e.httpsEnabled?`https`:`http`,me=vh(),he=e=>e?.trim()||`Craby mobile`;await r.listen({host:e.host,port:fe});let ge=r.server.address(),_e=typeof ge==`object`&&ge?ge.port:fe;if(r.log.info({host:e.host,port:_e,protocol:pe,machineName:me},OR(pe,e.host,_e)),e.relayEnabled&&(v=new FM({gatewayId:e.gatewayId,machineName:e.name,relayUrl:e.relayUrl,relayTransportSecurityLevel:e.relayTransportSecurityLevel,relayGatewayAccessToken:e.relayGatewayAccessToken,resolveRelayGatewayAccessToken:e.relayGatewayAccessToken.trim()?void 0:()=>BM({gatewayId:e.gatewayId,relayUrl:e.relayUrl,gatewayIdentity:b.identity,privateKeyPem:b.privateKeyPem}),gatewayIdentity:b.identity,directBaseUrls:jg({protocol:pe,host:e.host,port:_e}),logger:r.log,onFrame:async e=>{await N.handleFrame(e)}}),v.start()),e.bootstrapPairingCodeOnStart)try{let t=await s.createPairingCode(e.pairingCodeTtlSeconds);_={code:t.code,expiresAt:t.expiresAt},await c.record({ts:new Date().toISOString(),action:`pairing.start`,detail:{expiresAt:t.expiresAt,source:`startup`,ttlSeconds:e.pairingCodeTtlSeconds}}),r.log.info({expiresAt:t.expiresAt},`startup pairing code generated`)}catch(e){r.log.error({err:e},`failed to generate startup pairing code`)}return await A.start(),{protocol:pe,listenPort:_e,gatewayName:e.name,machineName:me,gatewayIdentity:b.identity,close:()=>r.close(),getGatewayUpdateInfo:()=>A.getInfo(),requestGatewayUpdate:(e=`console`)=>A.applyUpdate(e),requestCodexAppServerRestart:async(e=`console`)=>E.restartCodexAppServer(),startupPairingCode:_}}function ER(e,t){let n=t;if(!e.httpsEnabled)return(0,ST.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:_R}});if(!e.tlsKeyPath||!e.tlsCertPath)throw Error(`TLS key/cert path is required when HTTPS is enabled.`);let r={key:(0,u.readFileSync)(e.tlsKeyPath),cert:(0,u.readFileSync)(e.tlsCertPath),...e.tlsCaPath?{ca:(0,u.readFileSync)(e.tlsCaPath)}:{}};return(0,ST.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:_R},https:r})}function DR(e,t){let n=process.env.NODE_ENV!==`production`,r=CT.default.destination({dest:e.gatewayLogPath,mkdir:!0,sync:!1}),i=t.logToConsole?CT.default.multistream([{stream:r},{stream:process.stdout}]):r;return{instance:(0,CT.default)({level:n?`debug`:`info`},i),close:()=>{try{r.flushSync()}catch{}r.end()}}}function OR(e,t,n){return`desktop-gateway listening on ${e}://${t}:${n}`}function kR(e){let t=new URL(e.uploadUrl),n=t.protocol===`https:`?S.request:t.protocol===`http:`?x.request:null;if(!n)throw Error(`Unsupported relay preview upload protocol: ${t.protocol}`);let r=null,i=e=>{};return{completed:new Promise((a,o)=>{let s=!1,c=t=>{if(s)return;if(s=!0,!t){a();return}let n=t instanceof Error?t:Error(String(t));e.bodyStream.destroy(n),r?.destroy(n),o(n)};r=n(t,{method:`PUT`,headers:{"content-type":`application/octet-stream`,"content-length":String(e.contentLength),"x-relay-upload-token":e.uploadToken}},e=>{let t=[];e.on(`data`,e=>{t.push(Buffer.isBuffer(e)?e:Buffer.from(e))}),e.on(`error`,c),e.on(`end`,()=>{let n=e.statusCode??0;if(n>=200&&n<300){c();return}c(Error(`Relay preview upload failed (${n}): ${Buffer.concat(t).toString(`utf8`)}`))})}),i=e=>{c(e??Error(`Relay preview upload aborted`))},r.on(`error`,c),(0,C.pipeline)(e.bodyStream,r).catch(c)}),abort:i}}function AR(e){return e instanceof Error?e.stack??`${e.name}: ${e.message}`:(0,b.inspect)(e,{depth:6,breakLength:120})}async function jR(e){let t=await kh({configPath:e.configPath,ensureConfigFile:!0});Ph(t.config);let n=await TR(t.config,{configPath:t.configPath,logToConsole:e.logToConsole,onUpdatePrepared:async e=>{NR({type:`worker.update.prepared`,payload:e})}});NR({type:`worker.ready`,payload:MR(n)});let r=null,i=e=>r||(r=Promise.resolve(n.close?.()).catch(e=>{console.error(`[gateway] worker shutdown failed: ${String(e)}`)}).finally(()=>{process.exit(e)}),r);process.on(`message`,e=>{let t=PR(e);if(t)switch(t.type){case`supervisor.request`:a(t);return;case`supervisor.shutdown`:i(0);return}}),process.on(`disconnect`,()=>{i(0)}),process.on(`SIGINT`,()=>{i(0)}),process.on(`SIGTERM`,()=>{i(0)}),process.on(`uncaughtException`,e=>{console.error(`[gateway] worker uncaught exception: ${AR(e)}`),i(1)}),process.on(`unhandledRejection`,e=>{console.error(`[gateway] worker unhandled rejection: ${AR(e)}`),i(1)});async function a(e){try{switch(e.method){case`gateway.update.apply`:{if(!n.requestGatewayUpdate)throw Error(`gateway update is unavailable`);let t=await n.requestGatewayUpdate(e.requestedBy);NR({type:`worker.response`,id:e.id,method:e.method,ok:!0,result:t});return}case`codex.appServer.restart`:{if(!n.requestCodexAppServerRestart)throw Error(`codex app-server restart is unavailable`);let t=await n.requestCodexAppServerRestart(e.requestedBy);NR({type:`worker.response`,id:e.id,method:e.method,ok:!0,result:t});return}}}catch(t){NR({type:`worker.response`,id:e.id,method:e.method,ok:!1,error:String(t)})}}await new Promise(()=>{})}function MR(e){return{protocol:e.protocol,listenPort:e.listenPort,gatewayName:e.gatewayName,machineName:e.machineName,gatewayIdentity:e.gatewayIdentity,startupPairingCode:e.startupPairingCode}}function NR(e){process.send&&process.send(e)}function PR(e){if(!FR(e)||typeof e.type!=`string`)return null;switch(e.type){case`supervisor.shutdown`:return e.reason!==`signal`&&e.reason!==`update`&&e.reason!==`restart`?null:{type:`supervisor.shutdown`,reason:e.reason};case`supervisor.request`:return typeof e.id!=`string`||e.method!==`gateway.update.apply`&&e.method!==`codex.appServer.restart`||e.requestedBy!==`console`&&e.requestedBy!==`mobile`&&e.requestedBy!==`system`?null:{type:`supervisor.request`,id:e.id,method:e.method,requestedBy:e.requestedBy};default:return null}}function FR(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}IR(process.argv.slice(2)).catch(e=>{console.error(String(e)),process.exit(1)});async function IR(e){let t=B(e);switch(t.command){case`help`:VR();return;case`version`:console.log(z.version);return;case`init`:await RR(t);return;case`doctor`:await zR(t);return;case`start`:await LR(t);return;case`__worker`:await BR(t);return;default:{let e=t.command;throw Error(`Unsupported command: ${e}`)}}}async function LR(e){let t=await kh({configPath:e.configPath,ensureConfigFile:!0});Ph(t.config);let n=await $h({configPath:t.configPath,configExists:t.configExists,config:t.config});try{await __({args:e,loaded:t,doctorReport:n})}catch(e){throw Error(I_(e,t.config))}eg(n)&&console.warn(`[doctor] startup continued despite bundled runtime check failures.`)}async function RR(e){let t=await Oh({configPath:e.configPath,overwrite:e.force});t.created?console.log(`[gateway] wrote config to ${t.configPath}`):(console.log(`[gateway] config already exists at ${t.configPath}`),console.log(`[gateway] rerun with --force to overwrite`));let n=await kh({configPath:t.configPath,ensureConfigFile:!1}),r=await $h({configPath:n.configPath,configExists:n.configExists,config:n.config});console.log(tg(r))}async function zR(e){let t=await kh({configPath:Dh(e.configPath),ensureConfigFile:!1,syncGatewayIdentityConfig:!1}),n=await $h({configPath:t.configPath,configExists:t.configExists,config:t.configExists?t.config:void 0});console.log(tg(n)),eg(n)&&(process.exitCode=1)}async function BR(e){try{await jR(e)}catch(t){let n=await kh({configPath:e.configPath,ensureConfigFile:!0});throw Error(I_(t,n.config))}}function VR(){console.log(`${z.cliName} ${z.version}`),console.log(``),console.log(`Usage:`),console.log(` ${z.cliName} [start] [--config <path>] [--log]`),console.log(` ${z.cliName} init [--config <path>] [--force]`),console.log(` ${z.cliName} doctor [--config <path>]`),console.log(` ${z.cliName} --version`)}exports.runCli=IR;