craby-gateway 0.30.1 → 0.30.2

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`);var k={name:`@remote-agent/desktop-gateway`,private:!0,version:`0.30.1`,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 A=/(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/;function j(e){let t=e.match(A);return t?t[0]:null}function M(e){return typeof e==`string`?j(e):null}function N(e,t){let n=F(e),r=F(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 P(e,t){return N(e,t)>=0}function F(e){let t=e.match(A);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:typeof t[4]==`string`?t[4]:null}:null}const I=k,L=I.dependencies??{};function R(e){return L[e]??``}const z={packageName:`craby-gateway`,cliName:`craby-gateway`,version:I.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:M(R(`@anthropic-ai/claude-agent-sdk`)),systemCommand:`claude`,versionArgs:[`--version`],systemCommandRequired:!1,displayName:`Claude Code`}]};function ee(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=B(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 B(e,t){let n=t?.trim();if(!n)throw Error(`${e} requires a value`);return n}var V=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})),te=o((e=>{var t=V();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})),H=o((e=>{var t=V(),n=te();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`);var k={name:`@remote-agent/desktop-gateway`,private:!0,version:`0.30.2`,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 A=/(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/;function j(e){let t=e.match(A);return t?t[0]:null}function M(e){return typeof e==`string`?j(e):null}function N(e,t){let n=F(e),r=F(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 P(e,t){return N(e,t)>=0}function F(e){let t=e.match(A);return t?{major:Number(t[1]),minor:Number(t[2]),patch:Number(t[3]),prerelease:typeof t[4]==`string`?t[4]:null}:null}const I=k,L=I.dependencies??{};function R(e){return L[e]??``}const z={packageName:`craby-gateway`,cliName:`craby-gateway`,version:I.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:M(R(`@anthropic-ai/claude-agent-sdk`)),systemCommand:`claude`,versionArgs:[`--version`],systemCommandRequired:!1,displayName:`Claude Code`}]};function ee(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=B(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 B(e,t){let n=t?.trim();if(!n)throw Error(`${e} requires a value`);return n}var V=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})),te=o((e=>{var t=V();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})),H=o((e=>{var t=V(),n=te();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=V(),n=te();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=V();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=V(),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=te(),r=V(),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=V(),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=V(),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=V(),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
  `)?`
@@ -132,7 +132,7 @@ ${n.output}`:n.output:t.push({item:{...bs(`claude-command-output:${e.eventId}`,e
132
132
  `)}function ic(e,t){return ac(e.match(RegExp(`<${t}>([\\s\\S]*?)</${t}>`,`i`))?.[1])??null}function ac(e){if(typeof e!=`string`)return;let t=e.replace(Ao,``).replace(/\r\n/g,`
133
133
  `).trim();return t.length>0?t:void 0}function oc(e){return Do.test(e)}function sc(e){return e===`failed`?`error`:e===`streaming`?`accent`:e===`waiting_approval`||e===`waiting_input`?`warning`:`success`}function cc(e){let t=_c(e.payload.raw);return yc(t,[`turn_id`,`turnId`])||yc(_c(t.item),[`turn_id`,`turnId`])||yc(_c(t.turn),[`id`,`turn_id`,`turnId`])||yc(_c(_c(t.message).params),[`turnId`,`turn_id`])}function lc(e){return e.type===`native.raw`?yc(_c(_c(e.payload.raw).message),[`method`]):e.type}function uc(e){let t=_c(e.payload.raw),n=_c(t.item);return Object.keys(n).length>0?n:_c(_c(_c(t.message).params).item)}function dc(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 fc(e){let t=lc(e);return t!==`item.started`&&t!==`item.completed`&&t!==`item/started`&&t!==`item/completed`?!1:dc(yc(uc(e),[`type`]))===`user_message`}function pc(e){let t=lc(e);return t!==`item.started`&&t!==`item.completed`&&t!==`item/started`&&t!==`item/completed`?!1:dc(yc(uc(e),[`type`]))===`reasoning`}function mc(e){if(e.type===`turn.completed`||e.type===`turn.failed`)return!0;let t=yc(_c(_c(e.payload.raw).message),[`method`]);return t===`turn/completed`||t===`turn/failed`||t===`turn/interrupted`}function hc(e){let t=_c(_c(e.payload.raw).item),n=yc(t,[`type`]);if(n&&(n===`command_execution`||n===`file_change`||n===`web_search`))return t}function gc(e){let t=yc(e,[`type`]);if(t===`file_change`)return`正在编辑`;if(t===`web_search`)return`正在搜索`;if(t===`command_execution`){let t=Array.isArray(e?.command_actions)?e.command_actions:Array.isArray(e?.commandActions)?e.commandActions:[],n=!1,r=!1;for(let e of t){let t=yc(_c(e),[`type`]);t===`read`||t===`listFiles`||t===`list_files`?n=!0:t===`search`&&(r=!0)}return r?`正在搜索`:n?`正在浏览`:`正在运行命令`}return`正在思考`}function _c(e){return typeof e==`object`&&e?e:{}}function vc(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function yc(e,t){let n=e??{};for(let e of t){let t=n[e];if(typeof t==`string`&&t.trim())return t}}function bc(e,t){let n=e??{};for(let e of t){let t=n[e];if(typeof t==`number`&&Number.isFinite(t))return t}}function xc(e){let t=new Set,n=[];for(let r of e)!r||t.has(r)||(t.add(r),n.push(r));return n}function Sc(e){let t=e.replace(/\\/g,`/`).split(`/`);return t[t.length-1]??e}function Cc(e){return e?e.replace(/\r\n/g,`
134
134
  `).split(`
135
- `):[]}var wc=Y([`text`,`output`]),Tc=q({id:G().min(1),field:wc,delta:G()});function Ec(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,e])),i=e.filter(e=>!r.has(e.id)).map(e=>e.id),a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t){a.push(e);continue}if(jc(t)===jc(e))continue;let r=Dc(t,e);if(!r){a.push(e);continue}o.push(...r)}return{upserts:a,removals:i,textDeltaPatches:o}}function Dc(e,t){if(e.kind!==t.kind)return null;let n=Oc(e);if(n.length===0||Mc(Ac(e))!==Mc(Ac(t)))return null;let r=[];for(let i of n){let n=kc(e,i),a=kc(t,i);if(n!==a){if(typeof n!=`string`||typeof a!=`string`||!a.startsWith(n)||a.length<=n.length)return null;r.push({id:t.id,field:i,delta:a.slice(n.length)})}}return r.length>0?r:null}function Oc(e){switch(e.kind){case`agent_commentary`:case`activity_summary`:return[`text`];case`terminal_card`:case`command_strip`:return[`output`];default:return[]}}function kc(e,t){return t===`text`?`text`in e&&typeof e.text==`string`?e.text:void 0:`output`in e&&typeof e.output==`string`?e.output:void 0}function Ac(e){if(e.kind===`agent_commentary`||e.kind===`activity_summary`){let{text:t,...n}=e;return n}if(e.kind===`terminal_card`||e.kind===`command_strip`){let{output:t,...n}=e;return n}return e}function jc(e){return JSON.stringify(e)}function Mc(e){return JSON.stringify(e)}var Nc=G().trim().min(1).nullable(),Pc=Y([`default`,`plan`]),Fc=q({approvalPolicy:Ia.nullable(),sandboxMode:La.nullable()}),Ic=q({permissionMode:Ra.nullable()}),Lc=q({codex:Fc.optional(),claude:Ic.optional()}),Rc=nr(Qn());q({modeDefault:Pc,model:G().trim().min(1).optional(),reasoningEffort:Fa.optional(),execution:Lc.optional()});var zc=q({mode:Pc,model:Nc,reasoningEffort:Fa.nullable(),execution:Lc.optional()});q({provider:Pa,model:Nc,reasoningEffort:Fa.nullable(),execution:Lc.optional()});var Bc=q({model:Nc,reasoningEffort:Fa.nullable(),execution:Lc.optional(),context:Rc.optional()}),Vc=q({target:tr(`type`,[q({type:J(`uncommittedChanges`)}),q({type:J(`baseBranch`),branch:G().trim().min(1)}),q({type:J(`commit`),sha:G().trim().min(1),title:G().trim().min(1).optional()}),q({type:J(`custom`),instructions:G().trim().min(1)})])}),Hc=q({preset:Y([`general`,`security`,`performance`,`style`]),scope:Y([`workingTree`,`staged`,`selection`,`custom`]).optional(),instructions:G().trim().min(1).optional()}),Uc=q({provider:Pa,codex:Vc.optional(),claude:Hc.optional()}).superRefine((e,t)=>{if(e.provider===`codex`){e.codex||t.addIssue({code:U.custom,path:[`codex`],message:`codex review config is required when provider is codex`}),e.claude&&t.addIssue({code:U.custom,path:[`claude`],message:`claude review config must be omitted when provider is codex`});return}e.claude||t.addIssue({code:U.custom,path:[`claude`],message:`claude review config is required when provider is claude`}),e.codex&&t.addIssue({code:U.custom,path:[`codex`],message:`codex review config must be omitted when provider is claude`})}),Wc=q({v:J(`1.0`),provider:Pa,sessionId:G().min(1),projectId:G().min(1).optional(),eventId:G().min(1),ts:G().datetime(),type:G().min(1),payload:q({raw:Qn()}).passthrough()}).passthrough(),Gc=Y([`compact`,`full`]),Kc=q({commandId:G().min(1).optional()}),qc=Kc.extend({type:J(`session.start`),payload:q({provider:Pa,model:G().min(1).optional(),projectId:G().min(1).optional(),cwd:G().min(1).optional(),sessionConfig:Va.optional(),sessionTurnConfig:zc.optional(),codexAppServerTransport:Ba.optional(),metadata:nr(Qn()).optional()})}),Jc=Kc.extend({type:J(`turn.input`),payload:q({sessionId:G().min(1),text:G().optional(),attachments:$n(so).max(5).optional(),model:G().min(1).optional(),sessionConfig:Va.optional(),mode:Pc.optional(),config:Bc.optional(),codexAppServerTransport:Ba.optional()}).superRefine((e,t)=>{let n=typeof e.text==`string`&&e.text.trim().length>0,r=(e.attachments?.length??0)>0;!n&&!r&&t.addIssue({code:U.custom,path:[`text`],message:`turn.input requires text or at least one attachment`})})}),Yc=Kc.extend({type:J(`review.start`),payload:q({sessionId:G().min(1),input:G().min(1).optional(),config:Uc,turnConfig:Bc,codexAppServerTransport:Ba.optional()})}),Xc=Kc.extend({type:J(`tool.approval.respond`),payload:q({sessionId:G().min(1),requestId:G().min(1),decision:Y([`allow`,`deny`]),reason:G().min(1).optional()})}),Zc=Kc.extend({type:J(`user.input.respond`),payload:q({sessionId:G().min(1),requestId:G().min(1),answers:nr($n(G()))})}),Qc=Kc.extend({type:J(`session.interrupt`),payload:q({sessionId:G().min(1)})}),$c=Kc.extend({type:J(`session.close`),payload:q({sessionId:G().min(1)})}),el=tr(`kind`,[q({kind:J(`all`)}),q({kind:J(`raw_seq`),rawSeq:K().int().nonnegative()})]),tl=q({sessionId:G().min(1),projectId:G().min(1).optional(),cursor:el,purpose:Y([`detail_view`,`live_follow`]).optional(),detailLevel:Gc.optional(),bootstrapMode:Y([`stream`,`readable`]).optional()}),nl=Kc.extend({type:J(`session.stream.subscribe`),payload:q({replace:Zn().default(!0),sessions:$n(tl)})}),rl=q({sessionId:G().min(1),projectId:G().min(1).optional()}),il=tr(`type`,[qc,Jc,Yc,Xc,Zc,Qc,$c,Kc.extend({type:J(`session.external.watch.set`),payload:q({replace:Zn().default(!0),sessions:$n(rl)})}),nl,Kc.extend({type:J(`fs.read`),payload:q({sessionId:G().min(1),path:G().min(1)})}),Kc.extend({type:J(`fs.diff`),payload:q({sessionId:G().min(1),path:G().min(1),baseContent:G().optional()})})]);function al(e){let t=il.parse(e);if(t.type===`session.start`&&!t.payload.projectId&&!t.payload.cwd)throw Error(`session.start requires at least one of projectId or cwd`);return t}function ol(e,t){if(!Array.isArray(e.content))return;let n=[];for(let r of e.content){let e=t(r);e&&n.push(e)}return n.length>0?n.join(`
135
+ `):[]}var wc=Y([`text`,`output`]),Tc=q({id:G().min(1),field:wc,delta:G()});function Ec(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Map(t.map(e=>[e.id,e])),i=e.filter(e=>!r.has(e.id)).map(e=>e.id),a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t){a.push(e);continue}if(jc(t)===jc(e))continue;let r=Dc(t,e);if(!r){a.push(e);continue}o.push(...r)}return{upserts:a,removals:i,textDeltaPatches:o}}function Dc(e,t){if(e.kind!==t.kind)return null;let n=Oc(e);if(n.length===0||Mc(Ac(e))!==Mc(Ac(t)))return null;let r=[];for(let i of n){let n=kc(e,i),a=kc(t,i);if(n!==a){if(typeof n!=`string`||typeof a!=`string`||!a.startsWith(n)||a.length<=n.length)return null;r.push({id:t.id,field:i,delta:a.slice(n.length)})}}return r.length>0?r:null}function Oc(e){switch(e.kind){case`agent_commentary`:case`activity_summary`:return[`text`];case`terminal_card`:case`command_strip`:return[`output`];default:return[]}}function kc(e,t){return t===`text`?`text`in e&&typeof e.text==`string`?e.text:void 0:`output`in e&&typeof e.output==`string`?e.output:void 0}function Ac(e){if(e.kind===`agent_commentary`||e.kind===`activity_summary`){let{text:t,...n}=e;return n}if(e.kind===`terminal_card`||e.kind===`command_strip`){let{output:t,...n}=e;return n}return e}function jc(e){return JSON.stringify(e)}function Mc(e){return JSON.stringify(e)}var Nc=G().trim().min(1).nullable(),Pc=Y([`default`,`plan`]),Fc=q({approvalPolicy:Ia.nullable(),sandboxMode:La.nullable()}),Ic=q({permissionMode:Ra.nullable()}),Lc=q({codex:Fc.optional(),claude:Ic.optional()}),Rc=nr(Qn());q({modeDefault:Pc,model:G().trim().min(1).optional(),reasoningEffort:Fa.optional(),execution:Lc.optional()});var zc=q({mode:Pc,model:Nc,reasoningEffort:Fa.nullable(),execution:Lc.optional()});q({provider:Pa,model:Nc,reasoningEffort:Fa.nullable(),execution:Lc.optional()});var Bc=q({model:Nc,reasoningEffort:Fa.nullable(),execution:Lc.optional(),context:Rc.optional()}),Vc=q({target:tr(`type`,[q({type:J(`uncommittedChanges`)}),q({type:J(`baseBranch`),branch:G().trim().min(1)}),q({type:J(`commit`),sha:G().trim().min(1),title:G().trim().min(1).optional()}),q({type:J(`custom`),instructions:G().trim().min(1)})])}),Hc=q({preset:Y([`general`,`security`,`performance`,`style`]),scope:Y([`workingTree`,`staged`,`selection`,`custom`]).optional(),instructions:G().trim().min(1).optional()}),Uc=q({provider:Pa,codex:Vc.optional(),claude:Hc.optional()}).superRefine((e,t)=>{if(e.provider===`codex`){e.codex||t.addIssue({code:U.custom,path:[`codex`],message:`codex review config is required when provider is codex`}),e.claude&&t.addIssue({code:U.custom,path:[`claude`],message:`claude review config must be omitted when provider is codex`});return}e.claude||t.addIssue({code:U.custom,path:[`claude`],message:`claude review config is required when provider is claude`}),e.codex&&t.addIssue({code:U.custom,path:[`codex`],message:`codex review config must be omitted when provider is claude`})}),Wc=q({v:J(`1.0`),provider:Pa,sessionId:G().min(1),projectId:G().min(1).optional(),eventId:G().min(1),ts:G().datetime(),type:G().min(1),payload:q({raw:Qn()}).passthrough()}).passthrough(),Gc=Y([`compact`,`full`]),Kc=q({commandId:G().min(1).optional()}),qc=Kc.extend({type:J(`session.start`),payload:q({provider:Pa,model:G().min(1).optional(),projectId:G().min(1).optional(),cwd:G().min(1).optional(),sessionConfig:Va.optional(),sessionTurnConfig:zc.optional(),metadata:nr(Qn()).optional()})}),Jc=Kc.extend({type:J(`turn.input`),payload:q({sessionId:G().min(1),text:G().optional(),attachments:$n(so).max(5).optional(),model:G().min(1).optional(),sessionConfig:Va.optional(),mode:Pc.optional(),config:Bc.optional()}).superRefine((e,t)=>{let n=typeof e.text==`string`&&e.text.trim().length>0,r=(e.attachments?.length??0)>0;!n&&!r&&t.addIssue({code:U.custom,path:[`text`],message:`turn.input requires text or at least one attachment`})})}),Yc=Kc.extend({type:J(`review.start`),payload:q({sessionId:G().min(1),input:G().min(1).optional(),config:Uc,turnConfig:Bc})}),Xc=Kc.extend({type:J(`tool.approval.respond`),payload:q({sessionId:G().min(1),requestId:G().min(1),decision:Y([`allow`,`deny`]),reason:G().min(1).optional()})}),Zc=Kc.extend({type:J(`user.input.respond`),payload:q({sessionId:G().min(1),requestId:G().min(1),answers:nr($n(G()))})}),Qc=Kc.extend({type:J(`session.interrupt`),payload:q({sessionId:G().min(1)})}),$c=Kc.extend({type:J(`session.close`),payload:q({sessionId:G().min(1)})}),el=tr(`kind`,[q({kind:J(`all`)}),q({kind:J(`raw_seq`),rawSeq:K().int().nonnegative()})]),tl=q({sessionId:G().min(1),projectId:G().min(1).optional(),cursor:el,purpose:Y([`detail_view`,`live_follow`]).optional(),detailLevel:Gc.optional(),bootstrapMode:Y([`stream`,`readable`]).optional()}),nl=Kc.extend({type:J(`session.stream.subscribe`),payload:q({replace:Zn().default(!0),sessions:$n(tl)})}),rl=q({sessionId:G().min(1),projectId:G().min(1).optional()}),il=tr(`type`,[qc,Jc,Yc,Xc,Zc,Qc,$c,Kc.extend({type:J(`session.external.watch.set`),payload:q({replace:Zn().default(!0),sessions:$n(rl)})}),nl,Kc.extend({type:J(`fs.read`),payload:q({sessionId:G().min(1),path:G().min(1)})}),Kc.extend({type:J(`fs.diff`),payload:q({sessionId:G().min(1),path:G().min(1),baseContent:G().optional()})})]);function al(e){let t=il.parse(e);if(t.type===`session.start`&&!t.payload.projectId&&!t.payload.cwd)throw Error(`session.start requires at least one of projectId or cwd`);return t}function ol(e,t){if(!Array.isArray(e.content))return;let n=[];for(let r of e.content){let e=t(r);e&&n.push(e)}return n.length>0?n.join(`
136
136
  `):void 0}var sl=q({inputTokens:K().int().nonnegative(),cachedInputTokens:K().int().nonnegative(),outputTokens:K().int().nonnegative(),reasoningOutputTokens:K().int().nonnegative(),totalTokens:K().int().nonnegative()}),cl=q({usedPercent:K(),windowMinutes:K().int().nonnegative().nullable(),resetsAt:K().nonnegative().nullable()}),ll=q({primary:cl.nullable().optional(),secondary:cl.nullable().optional(),planType:G().min(1).nullable().optional(),creditsBalance:G().min(1).nullable().optional()}),ul=q({provider:Pa,usage:q({currentUsage:sl,latestTurnUsage:sl.nullable(),contextWindow:K().int().nonnegative().nullable(),sourceLabel:G().min(1),note:G().min(1).optional()}).nullable(),rateLimits:ll.optional()});function dl(e){return e.provider===`claude`?pl(e.rawEvents):fl(e.rawEvents)}function fl(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=null;for(let c of El(e)){let e=jl(c.payload.raw),l=c.type===`native.raw`?ml(e):null;l?.usage&&((Cl(l.usage)||!t)&&(t=l.usage),wl(l.usage.latestTurnUsage)?n=l.usage.latestTurnUsage:wl(l.usage.currentUsage)&&!n&&(n=l.usage.currentUsage),r=l.usage.contextWindow??r),l?.rateLimits&&(i=l.rateLimits.primary??i,a=l.rateLimits.secondary??a,o=l.rateLimits.planType??o,s=l.rateLimits.creditsBalance??s);let u=hl(c);if(u){let e=u.latestTurnUsage??u.currentUsage;wl(e)&&(n=e),r=u.contextWindow??r,!t&&(Cl(u)||u.contextWindow)&&(t=u)}}let c=t?{...t,latestTurnUsage:wl(n)?n:wl(t.latestTurnUsage)?t.latestTurnUsage:wl(t.currentUsage)?t.currentUsage:null,contextWindow:t.contextWindow??r}:null,l=_l({primary:i,secondary:a,planType:o,creditsBalance:s});return!c&&!l?null:{provider:`codex`,usage:c,...l?{rateLimits:l}:{}}}function pl(e){let t=null;for(let n of El(e)){let e=hl(n);e&&(t=e)}return t?{provider:`claude`,usage:t}:null}function ml(e){if(e.source===`codex.history.thread_read`){let t=jl(e.message),n=jl(t.turn),r=bl(n.usage??t.usage),i=kl(n.model_context_window??t.model_context_window);return!r&&i===void 0?null:{usage:{currentUsage:r??Tl(),latestTurnUsage:r??null,contextWindow:i??null,sourceLabel:`codex.history.thread_read`,note:`当前来自 Codex history replay 快照。`}}}let t=Dl(e);if(!t)return null;let n=jl(jl(e.message).params);if(t===`thread/tokenUsage/updated`){let e=jl(n.tokenUsage??n.token_usage),t=bl(e.total??e.total_token_usage);return t?{usage:{currentUsage:t,latestTurnUsage:bl(e.last??e.last_token_usage),contextWindow:kl(e.modelContextWindow??e.model_context_window)??null,sourceLabel:`thread/tokenUsage/updated`}}:null}if(t===`account/rateLimits/updated`){let e=gl(n.rateLimits??n.rate_limits);return e?{rateLimits:e}:null}if(t===`codex/event/token_count`){let e=jl(n.msg),t=jl(e.info),r=bl(t.total_token_usage??t.totalTokenUsage),i=gl(e.rate_limits??e.rateLimits);return!r&&!i?null:{usage:r?{currentUsage:r,latestTurnUsage:bl(t.last_token_usage??t.lastTokenUsage),contextWindow:kl(t.model_context_window??t.modelContextWindow)??null,sourceLabel:`codex/event/token_count`}:void 0,...i?{rateLimits:i}:{}}}if(t===`codex/event/task_started`){let e=jl(n.msg),t=kl(e.model_context_window??e.modelContextWindow);return t===void 0?null:{usage:{currentUsage:Tl(),latestTurnUsage:null,contextWindow:t,sourceLabel:`codex/event/task_started`,note:`目前只拿到了 context window,尚未拿到 thread token usage 快照。`}}}return null}function hl(e){if(e.type!==`turn.completed`&&e.type!==`turn.failed`&&e.type!==`turn.started`)return null;let t=jl(e.payload.raw),n=yl(t.usage??jl(t.turn).usage),r=kl(t.model_context_window??jl(t.turn).model_context_window);return!n&&r===void 0?null:{currentUsage:n??Tl(),latestTurnUsage:n??null,contextWindow:r??null,sourceLabel:e.type}}function gl(e){let t=jl(e),n=vl(t.primary),r=vl(t.secondary),i=Al(t.plan_type??t.planType)??null,a=Al(jl(t.credits).balance)??null;return!n&&!r&&!i&&!a?null:{primary:n,secondary:r,planType:i,creditsBalance:a}}function _l(e){if(!(!e.primary&&!e.secondary&&!e.planType&&!e.creditsBalance))return{...e.primary?{primary:e.primary}:{},...e.secondary?{secondary:e.secondary}:{},...e.planType?{planType:e.planType}:{},...e.creditsBalance?{creditsBalance:e.creditsBalance}:{}}}function vl(e){let t=jl(e),n=kl(t.used_percent??t.usedPercent);return n===void 0?null:{usedPercent:n,windowMinutes:kl(t.window_minutes??t.windowDurationMins)??null,resetsAt:kl(t.resets_at??t.resetsAt)??null}}function yl(e){return xl(e)}function bl(e){return xl(e,{totalFallback:`input_plus_output`})}function xl(e,t){let n=jl(e),r=kl(n.input_tokens??n.inputTokens),i=kl(n.cached_input_tokens??n.cachedInputTokens??n.cache_read_input_tokens??n.cacheReadInputTokens),a=kl(n.output_tokens??n.outputTokens),o=kl(n.reasoning_output_tokens??n.reasoningOutputTokens)??0,s=kl(n.total_tokens??n.totalTokens)??Sl(r,i,a,o,t);return r===void 0&&i===void 0&&a===void 0&&s===void 0?null:{inputTokens:r??0,cachedInputTokens:i??0,outputTokens:a??0,reasoningOutputTokens:o,totalTokens:s??0}}function Sl(e,t,n,r,i){return i?.totalFallback===`input_plus_output`?Ol(e,n):Ol(e,t,n,r)}function Cl(e){return wl(e.latestTurnUsage)||wl(e.currentUsage)}function wl(e){return e?e.inputTokens>0||e.cachedInputTokens>0||e.outputTokens>0||e.reasoningOutputTokens>0||e.totalTokens>0:!1}function Tl(){return{inputTokens:0,cachedInputTokens:0,outputTokens:0,reasoningOutputTokens:0,totalTokens:0}}function El(e){return[...e].sort((e,t)=>{let n=e.ts.localeCompare(t.ts);return n===0?e.rawSeq-t.rawSeq:n})}function Dl(e){return Al(jl(e.message).method)??Al(e.method)??null}function Ol(...e){let t=e.filter(e=>typeof e==`number`);if(t.length!==0)return t.reduce((e,t)=>e+t,0)}function kl(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e==`bigint`)return Number(e);if(typeof e==`string`&&e.trim()){let t=Number(e);if(Number.isFinite(t))return t}}function Al(e){return typeof e==`string`&&e.trim()?e:void 0}function jl(e){return typeof e==`object`&&e?e:{}}var Ml=Y([`session.started`,`thread.started`,`thread.title.updated`,`turn.started`,`turn.completed`,`turn.failed`,`item.started`,`item.updated`,`item.completed`,`tool.permission.requested`,`tool.permission.resolved`,`user.input.requested`,`user.input.resolved`,`file.changed`,`file.diff.ready`,`status.progress`,`error`,`error.runtime`]),Nl=Wc.extend({type:Ml}),Pl=Wc.extend({kind:J(`provider.raw`),rawSeq:K().int().positive(),type:G().min(1)});Nl.extend({kind:J(`gateway.control`).optional(),derivedFrom:G().min(1).optional()});var Fl=Wc.extend({kind:J(`session.stream.sync`),type:J(`session.stream.sync`),payload:q({raw:q({decision:Y([`delta`,`snapshot`]),reason:G().min(1),snapshotId:G().min(1).optional(),fromRawSeq:K().int().nonnegative().optional(),toRawSeq:K().int().nonnegative().optional()}).passthrough()}).passthrough()}),Il=q({updatedAt:G().datetime().optional(),status:Y([`running`,`idle`]).optional(),interactionLockReason:Y([`external_turn_running`]).optional(),model:G().min(1).nullable().optional(),sessionTurnConfig:zc.optional(),sessionTurnConfigUpdatedAt:G().datetime().optional(),title:G().min(1).optional(),pendingApprovals:K().int().nonnegative().optional(),pendingUserInputs:K().int().nonnegative().optional(),pendingActions:K().int().nonnegative().optional()}),Ll=er([Pl,Fl,Wc.extend({kind:J(`session.stream.snapshot.chunk`),type:J(`session.stream.snapshot.chunk`),payload:q({raw:q({snapshotId:G().min(1),chunkIndex:K().int().nonnegative(),totalChunks:K().int().positive(),events:$n(Pl),sessionSummary:Il.optional()}).passthrough(),readable:q({snapshotId:G().min(1),chunkIndex:K().int().nonnegative(),totalChunks:K().int().positive(),timelineItems:$n(Ho).optional(),sessionSummary:Il.optional()}).passthrough().optional()}).passthrough()}),Wc.extend({kind:J(`session.readable.snapshot.chunk`),type:J(`session.readable.snapshot.chunk`),payload:q({readable:q({snapshotId:G().min(1),chunkIndex:K().int().nonnegative(),totalChunks:K().int().positive(),timelineItems:$n(Ho),pendingApprovals:$n(Ro).optional(),pendingUserInputs:$n(Vo).optional(),contextUsage:ul.nullable().optional(),sessionSummary:Il.optional()}).passthrough()}).passthrough()}),Wc.extend({kind:J(`session.readable.delta`),type:J(`session.readable.delta`),payload:q({readable:q({fromRawSeq:K().int().nonnegative().optional(),toRawSeq:K().int().nonnegative(),timelineUpserts:$n(Ho),timelineRemovals:$n(G().min(1)),timelineTextDeltaPatches:$n(Tc).optional(),pendingApprovalUpserts:$n(Ro).optional(),pendingApprovalRemovals:$n(G().min(1)).optional(),pendingUserInputUpserts:$n(Vo).optional(),pendingUserInputRemovals:$n(G().min(1)).optional(),sessionSummary:Il.optional(),contextUsage:ul.nullable().optional()}).passthrough()}).passthrough()}),Wc.extend({kind:J(`session.external.update`),type:J(`session.external.update`),payload:q({raw:q({updatedAt:G().datetime(),status:Y([`running`,`idle`]),interactionLockReason:Y([`external_turn_running`]).optional(),refreshMode:Y([`delta`,`snapshot`]),fromRawSeq:K().int().nonnegative().optional(),toRawSeq:K().int().nonnegative().optional(),historyUpdated:Zn(),statusChanged:Zn(),sessionSummary:Il.optional()}).passthrough()}).passthrough()})]),Rl=q({algorithm:Y([`ed25519`]),publicKey:qa,publicKeyFingerprint:G().min(1),keyVersion:K().int().min(1),createdAt:G().datetime()});q({code:G().min(4),expiresAt:G().datetime()});var zl=Y([`ed25519`]),Bl=Y([`active`,`revoked`,`rotating`,`unknown`]),Vl=q({algorithm:zl,publicKey:qa,publicKeyFingerprint:G().min(1)}),Hl=q({pairingCode:G().min(4),signedAt:G().datetime()}),Ul=q({gatewayId:G().min(1),deviceId:G().min(1),mobilePublicKey:qa,pairingContext:Hl}),Wl=q({algorithm:J(`ed25519`),gatewayPublicKeyFingerprint:G().min(1),payload:Ul,signature:qa}),Gl=q({code:G().min(4),deviceName:rr(e=>{if(e==null)return;if(typeof e!=`string`)return e;let t=e.trim();return t.length>0?t:void 0},G().min(1).optional()),deviceIdentity:Vl.optional()}),Kl=q({accessToken:G().min(1),refreshToken:G().min(1),expiresInSeconds:K().int().positive()}),ql=Kl.extend({gatewayId:G().min(1),gatewayName:G().min(1).optional(),machineName:G().min(1).optional(),deviceId:G().min(1),gatewayIdentity:Rl.optional(),deviceIdentityFingerprint:G().min(1).optional(),deviceIdentityStatus:Bl.optional(),pairingConfirmation:Wl.optional()}),Jl=q({refreshToken:G().min(1)}),Yl=Kl.extend({deviceId:G().min(1),deviceIdentityFingerprint:G().min(1).optional(),deviceIdentityStatus:Bl.optional()});function Xl(e){return JSON.stringify([e.gatewayId,e.deviceId,e.mobilePublicKey,e.pairingContext.pairingCode,e.pairingContext.signedAt])}var Zl=Y([`missing`,`current`,`stale`]),Ql=q({accountId:G().min(1),accountType:Y([`chatgpt`,`apiKey`,`unknown`]),authMode:G().min(1),planType:G().min(1).nullable(),lastRefreshAt:G().datetime().nullable(),hasSavedSnapshot:Zn(),snapshotStatus:Zl,rateLimits:ll.nullable()}),$l=q({accountId:G().min(1),accountType:Y([`chatgpt`,`apiKey`,`unknown`]),authMode:G().min(1),planType:G().min(1).nullable(),lastRefreshAt:G().datetime().nullable(),savedAt:G().datetime(),isCurrent:Zn(),rateLimits:ll.nullable()}),eu=q({current:Ql.nullable(),savedAccounts:$n($l)}),tu=q({saved:J(!0),accounts:eu}),nu=q({switched:J(!0),closedRuntimeSessionCount:K().int().nonnegative(),accounts:eu}),ru=q({deleted:J(!0),accounts:eu}),iu=q({restarted:J(!0),closedRuntimeSessionCount:K().int().nonnegative()}),au=15e3,ou=12e4;function su(e){return{sessionId:e,messages:new Map,itemToMessageKey:new Map,requestToMessageKey:new Map,turnToLastToolMessageKey:new Map,codexSemanticMessageKeyToMessageKeys:new Map,codexHistoryReplaySemanticOccurrenceByKey:new Map}}function cu(e,t,n=`codex`){if(t.sessionId!==e.sessionId)return;let r=`optimistic:${t.id}`;e.messages.has(r)||e.messages.set(r,{id:r,sessionId:e.sessionId,provider:n,kind:`user`,status:`completed`,ts:t.ts,updatedAt:t.ts,source:`optimistic`,title:`User`,text:t.text,details:[],debug:{eventTypes:[`optimistic.prompt`]}})}function lu(e,t){if(t.sessionId===e.sessionId){if(t.type===`item.started`||t.type===`item.updated`||t.type===`item.completed`){pu(e,t);return}if(t.type===`tool.permission.requested`||t.type===`tool.permission.resolved`){mu(e,t);return}if(t.type===`user.input.requested`||t.type===`user.input.resolved`){hu(e,t);return}if(t.type===`turn.completed`){vu(e,t);return}(t.type===`turn.failed`||t.type===`error`||t.type===`error.runtime`)&&yu(e,t)}}function uu(e){return[...e.messages.values()].map(fd).sort((e,t)=>{let n=e.ts.localeCompare(t.ts);return n===0?e.id.localeCompare(t.id):n})}function du(e,t,n){let r=su(e),i=t[0]?.provider??`codex`,a=[...n].sort((e,t)=>e.ts.localeCompare(t.ts));for(let e of a)cu(r,e,i);let o=[...t].filter(t=>t.sessionId===e).sort((e,t)=>e.ts.localeCompare(t.ts));for(let e of o)lu(r,e);return r}function fu(e,t,n){return uu(du(e,t,n))}function pu(e,t){let n=Qu(t.payload.raw),r=Qu(n.item),i=Fu(r,[`type`]),a=Fu(r,[`phase`]),o=Nu(n,r),s=Fu(r,[`id`]),c=Wu(Fu(r,[`status`])),l=Pu(r),u=Iu(r),d=wu(t.provider,o,i,a,l,u),f=d?Ou(n):void 0,p=Mu(n)&&d?Eu(e,d,f):void 0;if(!i){let r=Pu(n);if(!r)return;let i=xu(t,`assistant`,o),a=bu(e,i,{id:i,sessionId:e.sessionId,provider:t.provider,kind:`assistant`,status:`streaming`,ts:t.ts,updatedAt:t.ts,source:`event`,title:`Assistant`,details:[],turnId:o,debug:{eventTypes:[]}});t.type===`item.completed`?(a.status=`completed`,a.text=r):(a.status=`streaming`,a.text=td(a.text,r)),ud(a,t);return}let m=Cu(i);if(m===`user`&&!l&&u.length===0)return;let h=p??(s?`item:${s}`:xu(t,i,o)),g=Su(m,i),_=m===`tool`?Zu(r,l):void 0,v=bu(e,h,{id:h,sessionId:e.sessionId,provider:t.provider,kind:m,status:`streaming`,ts:t.ts,updatedAt:t.ts,source:`event`,title:g,details:[],itemType:i,itemId:s,turnId:o,collapsible:m===`reasoning`,collapsedByDefault:m===`reasoning`,debug:{eventTypes:[],rawItemType:i,...a?{rawItemPhase:a}:{}}});s&&e.itemToMessageKey.set(s,h),d&&Tu(e,d,h),o&&m===`tool`&&e.turnToLastToolMessageKey.set(o,h),v.provider=t.provider,v.itemType=i,v.debug.rawItemPhase=a??v.debug.rawItemPhase,p&&v.itemId&&s&&v.itemId!==s||(v.itemId=s??v.itemId),v.turnId=o??v.turnId,v.title=_?.title??g,v.updatedAt=t.ts,v.collapsible=m===`reasoning`,v.collapsedByDefault=m===`reasoning`,_&&(v.toolCardData=_),u.length>0&&(v.attachments=Vu(v.attachments,u));let y=Fu(r,[`source_event_type`]);if(y&&ju(m)&&!_&&cd(v,`source: ${y}`),m===`tool`&&!_)for(let e of ld(r))cd(v,e);t.type===`item.started`?(v.status=m===`user`?`completed`:`streaming`,l&&(v.text=nd(m)?rd(v.text,l,r):td(v.text,l))):t.type===`item.updated`?(v.status=m===`user`?`completed`:v.status===`waiting_approval`||v.status===`waiting_input`?v.status:`streaming`,l&&(v.text=nd(m)?rd(v.text,l,r):td(v.text,l))):t.type===`item.completed`&&(v.status=m===`error`?`failed`:c??`completed`,l&&(v.text=l)),ud(v,t),d&&Mu(n)&&Du(e,d,f),m===`user`&&v.text&&dd(e,v.text,v.ts)}function mu(e,t){let n=Qu(t.payload.raw),r=Fu(n,[`requestId`,`request_id`]);if(!r)return;let i=Fu(n,[`itemId`,`item_id`]),a=Fu(n,[`turnId`,`turn_id`]),o=Fu(n,[`toolName`,`tool_name`])??`tool`,s=Fu(n,[`reason`]),c=Fu(n,[`decision`]),l=Qu(n.rawParams??n.raw_params),u=Qu(l.networkApprovalContext??l.network_approval_context),d=Fu(l,[`command`]),f=Fu(l,[`cwd`]),p=Fu(l,[`grantRoot`,`grant_root`]),m=Fu(u,[`host`]),h=Fu(u,[`protocol`]),g=gu(e,r,`approval`),_=bu(e,g,{id:g,sessionId:e.sessionId,provider:t.provider,kind:`tool`,status:`waiting_approval`,ts:t.ts,updatedAt:t.ts,source:`event`,title:`Tool Approval`,details:[],itemType:`tool_status`,itemId:i??void 0,turnId:a??void 0,requestId:r,debug:{eventTypes:[],rawItemType:`tool_status`}});_.provider=t.provider,_.updatedAt=t.ts,_.requestId=r,_.itemId=i??_.itemId,_.turnId=a??_.turnId,_.title=_.title||`Tool Approval`,t.type===`tool.permission.requested`?(_.status=`waiting_approval`,_.text=d?`等待命令执行审批`:`${o} \u9700\u8981\u5BA1\u6279`,cd(_,`tool: ${o}`),s&&cd(_,`reason: ${s}`),d&&cd(_,`command: ${hd(d,200)}`),f&&cd(_,`cwd: ${hd(f,200)}`),p&&cd(_,`grant_root: ${hd(p,200)}`),m&&cd(_,`network: ${hd(h?`${h}://${m}`:m,200)}`)):(_.status=c===`deny`?`failed`:`completed`,_.text=c===`deny`?`工具审批已拒绝`:`工具审批已通过`,c&&cd(_,`decision: ${c}`),s&&cd(_,`reason: ${s}`)),_u(e,g,r,i,a),ud(_,t)}function hu(e,t){let n=Qu(t.payload.raw),r=Fu(n,[`requestId`,`request_id`]);if(!r)return;let i=Fu(n,[`itemId`,`item_id`]),a=Fu(n,[`turnId`,`turn_id`]),o=Fu(n,[`status`]),s=Fu(n,[`reason`]),c=Ju(n,[`answeredCount`,`answered_count`]),l=Yu(n.questions),u=Xu(n.answers),d=gu(e,r,`user-input`),f=bu(e,d,{id:d,sessionId:e.sessionId,provider:t.provider,kind:`tool`,status:`waiting_input`,ts:t.ts,updatedAt:t.ts,source:`event`,title:`Plan Question`,details:[],itemType:`request_user_input`,itemId:i??void 0,turnId:a??void 0,requestId:r,userInputQuestions:l,debug:{eventTypes:[],rawItemType:`request_user_input`}});if(f.provider=t.provider,f.updatedAt=t.ts,f.requestId=r,f.itemId=i??f.itemId,f.turnId=a??f.turnId,f.title=`Plan Question`,t.type===`user.input.requested`)f.status=`waiting_input`,f.text=l.length>0?`\u9700\u8981\u56DE\u7B54 ${l.length} \u4E2A\u95EE\u9898`:`需要回答问题`,f.userInputQuestions=l,f.userInputAnswers=void 0,cd(f,`request_id: ${r}`);else{f.status=Gu(o);let e=c??0;f.text=Ku(o,e),cd(f,`status: ${o??`submitted`}`),cd(f,`answered_count: ${e}`),s&&cd(f,`reason: ${s}`),l.length>0&&(f.userInputQuestions=l),u&&(f.userInputAnswers=u)}_u(e,d,r,i,a),ud(f,t)}function gu(e,t,n){return e.requestToMessageKey.get(t)??`${n}:${t}`}function _u(e,t,n,r,i){e.requestToMessageKey.set(n,t),r&&e.itemToMessageKey.set(r,t),i&&e.turnToLastToolMessageKey.set(i,t)}function vu(e,t){let n=Qu(t.payload.raw),r=Nu(n,void 0),i=Qu(n.usage),a=Qu(Qu(n.turn).usage),o=Ju(i,[`input_tokens`]),s=Ju(i,[`output_tokens`]),c=Ju(a,[`input_tokens`]),l=Ju(a,[`output_tokens`]),u=o??c,d=s??l;if(r)for(let n of e.messages.values())n.turnId===r&&n.status===`streaming`&&(n.status=`completed`,n.updatedAt=t.ts);if(u!==void 0||d!==void 0){let n=r?`turn-usage:${r}`:xu(t,`turn.usage`,r),i=bu(e,n,{id:n,sessionId:e.sessionId,provider:t.provider,kind:`system`,status:`completed`,ts:t.ts,updatedAt:t.ts,source:`event`,title:`Turn Usage`,details:[],turnId:r,debug:{eventTypes:[]}});i.provider=t.provider,i.status=`completed`,i.updatedAt=t.ts,i.text=`Token usage`,u!==void 0&&cd(i,`input_tokens: ${u}`),d!==void 0&&cd(i,`output_tokens: ${d}`),ud(i,t)}}function yu(e,t){let n=Qu(t.payload.raw),r=Pu(Qu(n.error))??Pu(n);if(!r)return;let i=Nu(n,void 0),a=i?`turn-error:${i}`:`error:${t.eventId}`,o=bu(e,a,{id:a,sessionId:e.sessionId,provider:t.provider,kind:`error`,status:`failed`,ts:t.ts,updatedAt:t.ts,source:`event`,title:`Error`,text:r,details:[],turnId:i,debug:{eventTypes:[]}});o.provider=t.provider,o.status=`failed`,o.updatedAt=t.ts,o.text=r,o.turnId=i??o.turnId,ud(o,t)}function bu(e,t,n){return e.messages.get(t)||(e.messages.set(t,n),n)}function xu(e,t,n){let r=Date.parse(e.ts),i=Number.isFinite(r)?Math.floor(r/au):Math.floor(_d(e.ts)/au);return`fallback:${e.provider}:${n??`no_turn`}:${t}:${i}`}function Su(e,t){return t===`plan`?`Plan`:e===`assistant`?`Assistant`:e===`user`?`User`:e===`tool`?t===`command_execution`?`Command`:t===`file_change`?`File Change`:t===`mcp_tool_call`?`MCP Tool`:t===`web_search`?`Web Search`:`Tool`:e===`reasoning`?t===`todo_list`?`Todo`:t===`plan`?`Plan`:`Reasoning`:e===`error`?`Error`:`System`}function Cu(e){return e===`user_message`?`user`:e===`agent_message`||e===`plan`?`assistant`:e===`command_execution`||e===`file_change`||e===`mcp_tool_call`||e===`web_search`||e===`tool_status`||e===`collab_tool_call`?`tool`:e===`reasoning`||e===`todo_list`?`reasoning`:e===`error`?`error`:`system`}function wu(e,t,n,r,i,a){let o=Hu(a);if(e!==`codex`||!t||!i&&!o)return;let s=ku(n);if(!(s!==`user_message`&&s!==`agent_message`))return`${t}|${s}|${Au(s,r)}|${i??``}|${o}`}function Tu(e,t,n){let r=e.codexSemanticMessageKeyToMessageKeys.get(t);if(!r){e.codexSemanticMessageKeyToMessageKeys.set(t,[n]);return}r.includes(n)||r.push(n)}function Eu(e,t,n){let r=e.codexSemanticMessageKeyToMessageKeys.get(t);if(!(!r||r.length===0))return r[n===void 0?e.codexHistoryReplaySemanticOccurrenceByKey.get(t)??0:n-1]}function Du(e,t,n){let r=n??(e.codexHistoryReplaySemanticOccurrenceByKey.get(t)??0)+1,i=e.codexHistoryReplaySemanticOccurrenceByKey.get(t)??0;e.codexHistoryReplaySemanticOccurrenceByKey.set(t,Math.max(i,r))}function Ou(e){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 ku(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 Au(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function ju(e){return e===`tool`}function Mu(e){if(e.historyReplay===!0)return!0;let t=Fu(e,[`source`]);return t===`codex.history.thread_read`||t===`codex.history.thread_read.incremental`}function Nu(e,t){return Fu(e,[`turn_id`,`turnId`])??Fu(Qu(e.turn),[`id`,`turn_id`,`turnId`])??Fu(t??{},[`turn_id`,`turnId`])}function Pu(e){return qu(Qu(e.payload),[`delta`,`output_delta`,`outputDelta`])||qu(e,[`text`,`message`,`output`,`response`,`reason`,`output_delta`,`aggregated_output`])||$u(e)}function Fu(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}}function Iu(e){return[...Lu(e.attachments),...Lu(e.content),...Lu(e.input)]}function Lu(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Qu(n),r=Qu(e.remote_agent_attachment),i=Fu(e,[`type`]),a=Fu(e,[`kind`]),o=Qu(e.source),s=Qu(r.locator),c=Fu(e,[`path`])??Fu(o,[`path`])??Fu(s,[`path`]),l=Ru(Fu(r,[`mimeType`,`mime_type`])??Fu(e,[`mimeType`,`mime_type`])??Fu(o,[`media_type`,`mediaType`]));if(i!==`image`&&i!==`localImage`&&i!==`local_image`&&a!==`image`&&!c&&Object.keys(r).length===0)continue;let u=Fu(r,[`id`])??Fu(e,[`id`])??c??`image-${t.length+1}`;t.push({id:u,kind:`image`,...l?{mimeType:l}:{},fileName:Fu(r,[`fileName`,`file_name`])??Fu(e,[`fileName`,`file_name`]),width:zu(r.width??e.width),height:zu(r.height??e.height),sizeBytes:Bu(r.sizeBytes??r.size_bytes??e.sizeBytes??e.size_bytes),...c?{locator:{kind:`absolute`,path:c}}:{}})}return t}function Ru(e){if(e===`image/png`||e===`image/jpeg`||e===`image/webp`)return e}function zu(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Math.round(e):void 0}function Bu(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0?Math.round(e):void 0}function Vu(e,t){let n=new Map;for(let r of[...e??[],...t])n.set(Uu(r),r);return[...n.values()]}function Hu(e){return!e||e.length===0?``:e.map(Uu).sort().join(`,`)}function Uu(e){return e.locator?.kind===`absolute`?`path:${e.locator.path}`:`id:${e.id}`}function Wu(e){if(e===`streaming`||e===`waiting_approval`||e===`waiting_input`||e===`completed`||e===`failed`)return e;if(e===`running`)return`streaming`}function Gu(e){return!e||e===`submitted`?`completed`:`failed`}function Ku(e,t){return!e||e===`submitted`?`\u5DF2\u63D0\u4EA4 ${t} \u9879\u56DE\u7B54`:e===`interrupted`?t>0?`\u5DF2\u4E2D\u65AD\uFF0C\u5DF2\u63D0\u4EA4 ${t} \u9879\u56DE\u7B54`:`未回答,提问已中断`:e===`cancelled`?t>0?`\u5DF2\u53D6\u6D88\uFF0C\u5DF2\u63D0\u4EA4 ${t} \u9879\u56DE\u7B54`:`未回答,提问已取消`:e===`expired`?t>0?`\u5DF2\u8FC7\u671F\uFF0C\u5DF2\u63D0\u4EA4 ${t} \u9879\u56DE\u7B54`:`未回答,提问已过期`:e===`dismissed`?t>0?`\u5DF2\u5173\u95ED\uFF0C\u5DF2\u63D0\u4EA4 ${t} \u9879\u56DE\u7B54`:`未回答,提问已关闭`:t>0?`\u672A\u5B8C\u6210\uFF0C\u5DF2\u63D0\u4EA4 ${t} \u9879\u56DE\u7B54`:`未回答,提问未完成`}function qu(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function Ju(e,t){for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t}}function Yu(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=Qu(n),r=Fu(e,[`id`]),i=Fu(e,[`header`]),a=Fu(e,[`question`]);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=Qu(e),n=Fu(t,[`label`]),r=Fu(t,[`description`])??n,i=Fu(t,[`markdown`]);return n?{label:n,description:r,...i?{markdown:i}:{}}:null}).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}function Xu(e){let t=Qu(e),n=Object.entries(t);if(n.length===0)return;let r={};for(let[e,t]of n)if(e){if(!Array.isArray(t)){r[e]=[];continue}r[e]=t.map(e=>typeof e==`string`?e:void 0).filter(e=>typeof e==`string`&&e.length>0)}return Object.keys(r).length>0?r:void 0}function Zu(e,t){if(Fu(e,[`display_as`])!==`tool_card`)return;let n=Fu(e,[`title`])??t,r=Fu(e,[`status_label`])??t;if(!n||!r)return;let i=[],a=Fu(e,[`prompt`]),o=Fu(e,[`response`]),s=Fu(e,[`response_label`])??`Response`;a&&i.push({label:`Prompt`,body:a}),o&&i.push({label:s,body:o});let c=[],l=Fu(e,[`file_path`]),u=Ju(e,[`exit_code`,`exitCode`]),d=Ju(e,[`total_tool_uses`]),f=Ju(e,[`total_tokens`]),p=Ju(e,[`duration_ms`]);return l&&c.push(l),typeof u==`number`&&c.push(`exit_code: ${u}`),typeof d==`number`&&c.push(`${d} tool uses`),typeof f==`number`&&c.push(`${pd(f)} tokens`),typeof p==`number`&&c.push(md(p)),{title:n,statusLabel:r,compactText:t?gd(t):void 0,sections:i,details:c}}function Qu(e){return typeof e==`object`&&e?e:{}}function $u(e){return ol(e,ed)}function ed(e){if(typeof e==`string`&&e.length>0)return e;let t=Qu(e),n=qu(t,[`text`,`message`,`output`,`response`,`reason`]);if(n)return n;let r=qu(Qu(t.data),[`text`,`message`,`output`,`response`,`reason`]);if(r)return r;if(!Array.isArray(t.text_elements))return;let i=[];for(let e of t.text_elements){let t=qu(Qu(e),[`text`,`value`]);t&&i.push(t)}return i.length>0?i.join(``):void 0}function td(e,t){return!e||t.startsWith(e)?t:e.endsWith(t)?e:`${e}${t}`}function nd(e){return e===`assistant`||e===`reasoning`}function rd(e,t,n){return e?t===e?e:t.startsWith(e)?t:e.endsWith(t)?e:id(n)?`${e}${t}`:od(e,t)?t:`${e}${t}`:t}function id(e){let t=Qu(e.payload);return sd(t.delta)||sd(t.output_delta)||sd(t.outputDelta)||sd(e.output_delta)||sd(e.outputDelta)?!0:ad(Fu(e,[`original_method`,`originalMethod`]))}function ad(e){return e?e===`item/agentMessage/delta`||e===`codex/event/agent_message_content_delta`:!1}function od(e,t){return t.length===0||t.length<24?!1:t.length>=Math.floor(e.length*.7)}function sd(e){return typeof e==`string`&&e.length>0}function cd(e,t){t.trim()&&(e.details.includes(t)||e.details.push(t))}function ld(e){let t=[],n=Fu(e,[`command`]),r=Fu(e,[`tool_name`,`tool`]),i=Fu(e,[`server`]),a=Fu(e,[`status`]),o=Fu(e,[`query`]),s=Fu(e,[`output_delta`,`aggregated_output`]),c=e.history_output_omitted===!0||e.historyOutputOmitted===!0,l=Ju(e,[`history_output_byte_length`,`historyOutputByteLength`]),u=Ju(e,[`exit_code`]),d=Fu(Qu(e.error),[`message`]);if(n&&t.push(`command: ${hd(n,200)}`),r&&t.push(`tool: ${r}`),i&&t.push(`server: ${i}`),a&&t.push(`status: ${a}`),o&&t.push(`query: ${hd(o,200)}`),u!==void 0&&t.push(`exit_code: ${u}`),d&&t.push(`error: ${hd(d,200)}`),s?t.push(`output: ${hd(s,400)}`):c&&t.push(l===void 0?`output: omitted in compact history`:`output: omitted in compact history (${l.toLocaleString(`en-US`)} bytes)`),e.type===`todo_list`){let n=Array.isArray(e.items)?e.items:[];for(let e of n){let n=Qu(e),r=Fu(n,[`text`])??``,i=n.completed===!0;t.push(`${i?`[x]`:`[ ]`} ${r}`)}}if(e.type===`file_change`){let n=Array.isArray(e.changes)?e.changes:[];for(let e of n){let n=Qu(e),r=Fu(n,[`path`])??`unknown`,i=Fu(n,[`kind`])??`update`;t.push(`${i}: ${r}`)}}return t}function ud(e,t){e.debug.eventTypes.includes(t.type)||e.debug.eventTypes.push(t.type)}function dd(e,t,n){let r=gd(t),i=Date.parse(n);for(let[t,n]of e.messages.entries()){if(n.kind!==`user`||n.source!==`optimistic`||gd(n.text??``)!==r)continue;let a=Date.parse(n.ts);if(!(Number.isFinite(i)&&Number.isFinite(a)&&Math.abs(i-a)>ou)){e.messages.delete(t);return}}}function fd(e){return{...e,attachments:e.attachments?e.attachments.map(e=>({...e,locator:e.locator?{...e.locator}:void 0})):void 0,details:[...e.details],userInputQuestions:e.userInputQuestions?e.userInputQuestions.map(e=>({...e,options:e.options?e.options.map(e=>({...e})):null})):void 0,userInputAnswers:e.userInputAnswers?Object.fromEntries(Object.entries(e.userInputAnswers).map(([e,t])=>[e,[...t]])):void 0,toolCardData:e.toolCardData?{...e.toolCardData,sections:e.toolCardData.sections.map(e=>({...e})),details:[...e.toolCardData.details]}:void 0,debug:{...e.debug,eventTypes:[...e.debug.eventTypes]}}}function pd(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}function md(e){let t=Math.max(1,Math.round(e/1e3));if(t<60)return`${t}s`;let n=Math.floor(t/60),r=t%60;return r===0?`${n}m`:`${n}m ${r}s`}function hd(e,t){return e.length<=t?e:`${e.slice(0,t)}...`}function gd(e){return e.trim().replace(/\s+/g,` `)}function _d(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t}var vd=Y([`unknown`,`checking`,`up_to_date`,`available`,`unsupported_install`,`updating`,`restarting`,`failed`]),yd=Y([`npm`,`pnpm`,`yarn`,`unknown`]),bd=Y([`global_registry`,`global_file`,`dev_workspace`,`standalone_binary`,`unknown`]),xd=Y([`console`,`mobile`,`system`]),Sd=q({manager:yd,installType:bd,packageName:G().min(1),packageRoot:G().min(1).optional(),binPath:G().min(1).optional(),canSelfUpdate:Zn(),reason:G().min(1).optional()}),Cd=q({id:G().min(1),targetVersion:G().min(1),requestedBy:xd,requestedAt:G().datetime(),startedAt:G().datetime().optional()}),wd=q({packageName:G().min(1),currentVersion:G().min(1),latestVersion:G().min(1).optional(),available:Zn(),canApply:Zn(),status:vd,checkedAt:G().datetime().optional(),install:Sd,job:Cd.optional(),lastError:G().min(1).optional()}),Td=q({type:J(`gateway.update.status`),payload:wd}),Ed=q({started:Zn(),update:wd}),Dd=rr(e=>{if(typeof e!=`string`)return e;let t=e.trim();return t.length>0?t:e},G().trim().min(1)),Od=q({id:G().min(1),title:G().min(1),path:G().min(1),createdAt:G().datetime(),updatedAt:G().datetime(),lastSessionAt:G().datetime().optional(),runningCount:K().int().nonnegative(),idleCount:K().int().nonnegative().optional(),totalCount:K().int().nonnegative().optional(),endedCount:K().int().nonnegative()}),kd=q({name:G().min(1),path:G().min(1)}),Ad=q({kind:Y([`home`,`desktop`,`documents`,`downloads`,`root`]),path:G().min(1)}),jd=q({rootPath:G().min(1),currentPath:G().min(1),parentPath:G().min(1).nullable(),shortcuts:$n(Ad).default([]),directories:$n(kd)}),Md=Y([`running`,`idle`]),Nd=Y([`running`,`idle`,`all`]),Pd=Y([`external_turn_running`]),Fd=Y([`delta`,`snapshot`]),Id=q({id:G().min(1),nativeSessionId:G().min(1).optional(),source:Y([`gateway`,`native_discovered`]).optional(),projectId:G().min(1),projectPath:G().min(1),provider:Pa,providerMode:Y([`native`,`mock`]).optional(),model:G().min(1).optional(),title:G().min(1).optional(),sessionTurnConfig:zc.optional(),sessionTurnConfigUpdatedAt:G().datetime().optional(),createdAt:G().datetime(),updatedAt:G().datetime(),status:Md,interactionLockReason:Pd.optional(),pendingApprovals:K().int().nonnegative(),pendingUserInputs:K().int().nonnegative(),pendingActions:K().int().nonnegative()}),Ld=q({id:G().min(1),name:G().min(1),createdAt:G().datetime(),revokedAt:G().datetime().optional(),identityAlgorithm:Y([`ed25519`]).optional(),publicKeyFingerprint:G().min(1).optional(),identityStatus:Bl.optional(),lastVerifiedAt:G().datetime().optional()}),Rd=q({name:Dd,machineName:G().min(1)}),zd=q({agent:q({provider:Pa,requestedVersion:G().min(1).nullable(),resolvedVersion:G().min(1)}),capabilities:Wa}),Bd=q({scannedAt:G().datetime(),sessionCount:K().int().nonnegative(),status:Y([`ready`,`partial`,`failed`]),error:G().min(1).optional()}),Vd=q({codex:Bd.optional(),claude:Bd.optional()}),Hd=q({key:G().min(1),path:G().min(1),title:G().min(1),lastSessionAt:G().datetime().optional(),sessionCount:K().int().nonnegative(),providerCounts:q({codex:K().int().nonnegative(),claude:K().int().nonnegative()}),lastDiscoveryAt:G().datetime()}),Ud=q({provider:Pa,nativeSessionId:G().min(1),title:G().min(1).optional(),model:G().min(1).optional(),createdAt:G().datetime().optional(),updatedAt:G().datetime()}),Wd=q({generatedAt:G().datetime(),source:Y([`cache`,`fresh_scan`]),providers:Vd,projects:$n(Hd)}),Gd=q({canonicalProjectPath:G().min(1),project:Hd,providers:Vd,sessions:$n(Ud)}),Kd=Y(`auth.refresh,codex.accounts.get,codex.accounts.save,codex.accounts.switch,codex.accounts.delete,codex.appServer.restart,gateway.settings.get,gateway.settings.update,gateway.update.get,gateway.update.apply,projects.list,projects.discovery.get,projects.discovery.refresh,projects.create,projects.delete,workspace.directories.list,workspace.directories.create,workspace.entries.list,workspace.files.resolve,workspace.files.readText,workspace.files.preparePreview,sessions.list,sessions.discovery.list,sessions.get,sessions.config.get,sessions.history.sync,sessions.rawEvents.list,sessions.readableItem.get,providers.capabilities.get,providers.execution.update,agents.config.get,devices.list,devices.revoke`.split(`,`)),qd=q({}).strict(),Jd=tr(`method`,[q({method:J(`auth.refresh`),params:Jl.extend({deviceId:G().min(1).optional()})}),q({method:J(`codex.accounts.get`),params:qd}),q({method:J(`codex.accounts.save`),params:qd}),q({method:J(`codex.accounts.switch`),params:q({accountId:G().min(1)})}),q({method:J(`codex.accounts.delete`),params:q({accountId:G().min(1)})}),q({method:J(`codex.appServer.restart`),params:q({requestedBy:xd.optional()})}),q({method:J(`gateway.settings.get`),params:qd}),q({method:J(`gateway.settings.update`),params:q({name:Dd})}),q({method:J(`gateway.update.get`),params:qd}),q({method:J(`gateway.update.apply`),params:q({requestedBy:xd.optional()})}),q({method:J(`projects.list`),params:qd}),q({method:J(`projects.discovery.get`),params:qd}),q({method:J(`projects.discovery.refresh`),params:qd}),q({method:J(`projects.create`),params:q({path:Dd,title:G().min(1).optional()})}),q({method:J(`projects.delete`),params:q({projectId:G().min(1)})}),q({method:J(`workspace.directories.list`),params:q({path:G().min(1).optional(),limit:K().int().positive().max(500).optional()})}),q({method:J(`workspace.directories.create`),params:q({path:Dd,name:Dd})}),q({method:J(`workspace.entries.list`),params:q({locator:Ya,limit:K().int().positive().max(500).optional()})}),q({method:J(`workspace.files.resolve`),params:q({locator:Ja})}),q({method:J(`workspace.files.readText`),params:q({locator:Ja,encoding:J(`utf8`).optional(),startLine:K().int().positive().optional(),maxLines:K().int().positive().max(5e3).optional(),maxBytes:K().int().positive().max(1024*1024).optional()})}),q({method:J(`workspace.files.preparePreview`),params:q({locator:Ja,disposition:io.optional()})}),q({method:J(`sessions.list`),params:q({projectId:G().min(1),status:Nd.optional(),syncExternal:Zn().optional()})}),q({method:J(`sessions.discovery.list`),params:q({projectPath:Dd})}),q({method:J(`sessions.get`),params:q({projectId:G().min(1),sessionId:G().min(1)})}),q({method:J(`sessions.config.get`),params:q({projectId:G().min(1),sessionId:G().min(1)})}),q({method:J(`sessions.history.sync`),params:q({projectId:G().min(1),sessionId:G().min(1)})}),q({method:J(`sessions.rawEvents.list`),params:q({projectId:G().min(1),sessionId:G().min(1),limit:er([K().int().positive().max(2e3),J(`all`)]).optional(),fromRawSeqExclusive:K().int().nonnegative().optional(),detailLevel:Gc.optional()})}),q({method:J(`sessions.readableItem.get`),params:q({projectId:G().min(1),sessionId:G().min(1),itemId:G().min(1)})}),q({method:J(`providers.capabilities.get`),params:q({provider:Pa,projectId:G().min(1).optional(),agentVersion:G().min(1).optional()})}),q({method:J(`providers.execution.update`),params:Ha}),q({method:J(`agents.config.get`),params:q({provider:Pa,projectId:G().min(1).optional(),agentVersion:G().min(1).optional()})}),q({method:J(`devices.list`),params:qd}),q({method:J(`devices.revoke`),params:q({deviceId:G().min(1)})})]),Yd=tr(`method`,[q({method:J(`auth.refresh`),result:Yl.extend({relayToken:G().min(1).optional()})}),q({method:J(`codex.accounts.get`),result:eu}),q({method:J(`codex.accounts.save`),result:tu}),q({method:J(`codex.accounts.switch`),result:nu}),q({method:J(`codex.accounts.delete`),result:ru}),q({method:J(`codex.appServer.restart`),result:iu}),q({method:J(`gateway.settings.get`),result:Rd}),q({method:J(`gateway.settings.update`),result:Rd}),q({method:J(`gateway.update.get`),result:wd}),q({method:J(`gateway.update.apply`),result:Ed}),q({method:J(`projects.list`),result:q({projects:$n(Od)})}),q({method:J(`projects.discovery.get`),result:Wd}),q({method:J(`projects.discovery.refresh`),result:Wd}),q({method:J(`projects.create`),result:q({project:Od})}),q({method:J(`projects.delete`),result:q({removed:J(!0)})}),q({method:J(`workspace.directories.list`),result:jd}),q({method:J(`workspace.directories.create`),result:jd}),q({method:J(`workspace.entries.list`),result:to}),q({method:J(`workspace.files.resolve`),result:no}),q({method:J(`workspace.files.readText`),result:ro}),q({method:J(`workspace.files.preparePreview`),result:ao}),q({method:J(`sessions.list`),result:q({sessions:$n(Id)})}),q({method:J(`sessions.discovery.list`),result:Gd}),q({method:J(`sessions.get`),result:q({session:Id})}),q({method:J(`sessions.config.get`),result:q({session:Id})}),q({method:J(`sessions.history.sync`),result:q({session:Id,rawEventCount:K().int().nonnegative(),historyUpdated:Zn(),statusChanged:Zn(),refreshMode:Fd,fromRawSeq:K().int().nonnegative().optional(),toRawSeq:K().int().nonnegative().optional()})}),q({method:J(`sessions.rawEvents.list`),result:tr(`decision`,[q({decision:J(`delta`),reason:Y([`cursor_valid_delta`]),fromRawSeqExclusive:K().int().nonnegative(),toRawSeq:K().int().nonnegative(),events:$n(Qn())}),q({decision:J(`snapshot`),reason:Y([`cursor_out_of_range`,`initial_snapshot`,`empty_history_snapshot`]),toRawSeq:K().int().nonnegative().optional(),events:$n(Qn())})])}),q({method:J(`sessions.readableItem.get`),result:q({item:Ho})}),q({method:J(`providers.capabilities.get`),result:q({capabilities:Wa})}),q({method:J(`providers.execution.update`),result:q({defaults:Ha})}),q({method:J(`agents.config.get`),result:zd}),q({method:J(`devices.list`),result:q({devices:$n(Ld)})}),q({method:J(`devices.revoke`),result:q({revoked:J(!0)})})]),Xd=`json-utf8`,Zd=Y([Xd]),Qd=Y([`identity`,`gzip`]),$d=q({version:J(1),compression:J(`gzip`),payloadEncoding:Zd.default(Xd),uncompressedByteLength:K().int().positive(),compressedByteLength:K().int().positive(),data:qa});function ef(e){let t=rf(e.payload),n=t.byteLength;if(n<(e.compressionThresholdBytes??1/0))return{payloadEncoding:Xd,compression:`identity`,payloadBytes:t,uncompressedByteLength:n,compressedByteLength:n};let r=ni(t);return r.byteLength>=n?{payloadEncoding:Xd,compression:`identity`,payloadBytes:t,uncompressedByteLength:n,compressedByteLength:n}:{payloadEncoding:Xd,compression:`gzip`,payloadBytes:r,uncompressedByteLength:n,compressedByteLength:r.byteLength}}function tf(e){return e.compression===`gzip`?$d.parse({version:1,compression:`gzip`,payloadEncoding:e.payloadEncoding,uncompressedByteLength:e.uncompressedByteLength,compressedByteLength:e.compressedByteLength,data:sf(e.payloadBytes)}):null}function nf(e){let t=Qd.parse(e.compression??`identity`),n=e.payloadBytes;if(t===`gzip`)try{n=ri(e.payloadBytes)}catch{throw Error(`compressed_payload_invalid`)}if(typeof e.expectedUncompressedByteLength==`number`&&n.byteLength!==e.expectedUncompressedByteLength)throw Error(`compressed_payload_size_mismatch`);let r;try{r=JSON.parse(of(n))}catch{throw Error(`compressed_payload_invalid`)}return e.parse(r)}function rf(e){return af(JSON.stringify(e))}function af(e){return new TextEncoder().encode(e)}function of(e){return new TextDecoder().decode(e)}function sf(e){let t=globalThis.Buffer;if(t)return t.from(e).toString(`base64`);let n=``;for(let t of e)n+=String.fromCharCode(t);if(typeof btoa!=`function`)throw Error(`base64 encoder unavailable`);return btoa(n)}var cf=G().url(),lf=er([cf,J(``)]),uf=G().min(1).regex(/^[A-Za-z0-9_-]+$/u),df=Y([`plaintext-relay`,`e2ee-relay`]),ff=Y([`plain`,`crypt`]);function pf(e){if(e===`plain`||e===`crypt`)return e;if(e===`plaintext-relay`)return`plain`;if(e===`e2ee-relay`)return`crypt`}function mf(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let t=e,n=pf(t.tsl??t.transportSecurityLevel);return n?{...t,tsl:n}:t}function hf(e){return e.trim()}var gf=Y([`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`]),_f=K().int().positive(),vf=K().int().min(0).max(2**53-1),yf=Y([`identity_mismatch`,`device_revoked`,`transcript_invalid`,`counter_replay`,`counter_gap_too_large`,`key_epoch_mismatch`,`decrypt_failed`,`unsupported_version`]),bf=Y([`guest`,`account`,`self_hosted`]);q({type:J(`relay.gateway`),grantType:bf,gatewayId:G().min(1),subjectId:G().min(1),gatewayIdentityFingerprint:G().min(1).optional(),jti:G().min(1),iss:G().min(1),aud:G().min(1),iat:K().int().nonnegative(),exp:K().int().positive()}),q({type:J(`relay.mobile`),gatewayId:G().min(1),deviceId:G().min(1),iat:K().int().nonnegative(),exp:K().int().positive()});var xf=q({v:J(1),gw:G().min(1),name:G().min(1),machineName:G().min(1).optional(),relay:lf.optional(),direct:$n(cf).default([]),pc:G().min(1),tsl:ff.optional(),gatewayIdentity:Rl.optional()});rr(mf,xf);var Sf=rr(mf,xf.omit({pc:!0}));rr(mf,q({v:J(1),gw:G().min(1),relay:lf.optional(),direct:lf.optional(),pc:G().min(1),tsl:ff.optional(),gatewayIdentity:Rl.optional()}));var Cf=rr(mf,q({v:J(1),gw:G().min(1),relay:lf.optional(),direct:cf,pc:G().min(1),pkf:uf,tsl:ff.optional()})),wf=q({name:G().min(1),relayBaseUrl:lf.optional(),directBaseUrls:$n(cf).default([]),transportSecurityLevel:df.default(`e2ee-relay`),gatewayIdentity:Rl.optional(),gatewayAccessToken:G().min(1).optional(),connectedAt:G().datetime().optional()}),Tf=q({gatewayId:G().min(1),deviceId:G().min(1),connectedAt:G().datetime().optional()}),Ef=q({version:J(1),securityLevel:J(`e2ee-relay`),cipherSuite:gf,deviceId:G().min(1),deviceIdentity:Vl,clientNonce:qa}),Df=q({version:J(1),securityLevel:J(`e2ee-relay`),cipherSuite:gf,gatewayId:G().min(1),deviceId:G().min(1),clientNonce:qa,gatewayNonce:qa,gatewayPublicKeyFingerprint:G().min(1),gatewayEphemeralPublicKey:qa,signatureAlgorithm:J(`ed25519`),signature:qa}),Of=q({version:J(1),gatewayId:G().min(1),deviceId:G().min(1),deviceIdentityFingerprint:G().min(1),clientEphemeralPublicKey:qa,signatureAlgorithm:J(`ed25519`),signature:qa}),kf=q({version:J(1),securityLevel:J(`e2ee-relay`),cipherSuite:gf,gatewayId:G().min(1),deviceId:G().min(1),keyEpoch:_f,deviceIdentityFingerprint:G().min(1),deviceIdentityStatus:Bl}),Af=Y([`gateway_restarted`,`gateway_available`]),jf=q({version:J(1),gatewayId:G().min(1),deviceId:G().min(1),reason:Af,retryable:J(!0)}),Mf=q({ticket:G().min(1),method:Y([`GET`,`HEAD`]),rangeHeader:G().min(1).optional(),responseMode:Y([`inline_base64`,`stream_upload`]).optional(),uploadUrl:G().url().optional(),uploadToken:G().min(1).optional()}).superRefine((e,t)=>{e.responseMode===`stream_upload`&&(e.uploadUrl||t.addIssue({code:U.custom,path:[`uploadUrl`],message:`uploadUrl is required when responseMode is stream_upload`}),e.uploadToken||t.addIssue({code:U.custom,path:[`uploadToken`],message:`uploadToken is required when responseMode is stream_upload`}))}),Nf=q({status:er([J(200),J(206),J(416)]),headers:q({contentType:G().min(1),contentDisposition:G().min(1),contentLength:K().int().nonnegative(),etag:G().min(1),acceptRanges:J(`bytes`).optional(),contentRange:G().min(1).optional(),lastModified:G().min(1).optional(),cacheControl:G().min(1)}),bodyTransport:Y([`inline_base64`,`stream_upload`]).optional(),bodyBase64:qa.optional()}),Pf=q({}),Ff=Nf,If=q({version:J(1),gatewayId:G().min(1),deviceId:G().min(1).optional(),code:yf,message:G().min(1),retryable:Zn().optional()}),Lf=Jd,Rf=Yd,zf=q({code:Y([`BAD_REQUEST`,`NOT_FOUND`,`UNAUTHORIZED`,`TIMEOUT`,`INTERNAL`,`GATEWAY_OFFLINE`,`TOKEN_INVALID`,`TOKEN_EXPIRED`,`GATEWAY_MISMATCH`,`GATEWAY_REVOKED`]),message:G().min(1),status:K().int().min(400).max(599),details:Qn().optional()}),Bf=zf.extend({method:Kd.optional()}),Vf=Gl.extend({gatewayId:G().min(1)}),Hf=ql.extend({relayToken:G().min(1).optional()}),Uf=Jl.extend({gatewayId:G().min(1),deviceId:G().min(1).optional()}),Wf=Yl.extend({gatewayId:G().min(1),relayToken:G().min(1).optional()}),Gf=q({gatewayId:G().min(1),gatewayIdentity:Rl,requestedAt:G().datetime()});q({grantType:J(`guest`),payload:Gf,signatureAlgorithm:J(`ed25519`),signature:qa});var Kf=q({grantType:bf,token:G().min(1),expiresInSeconds:K().int().positive()}),qf=Y([`rpc`,`command`,`event`,`system`]),Jf=Xd,Yf=Zd,Xf=q({version:J(1),keyEpoch:_f,counter:vf,iv:qa,ciphertext:qa,authTag:qa,plaintextEncoding:Yf.default(Jf),compression:Qd.default(`identity`),uncompressedByteLength:K().int().positive().optional(),compressedByteLength:K().int().positive().optional()});Y([`from_mobile`,`to_mobile`,`rpc.request`,`rpc.response`,`rpc.error`]);function Zf(e){return{payload:e.optional(),encryptedPayload:Xf.optional()}}function Qf(e){return{payload:e.optional(),compressedPayload:$d.optional(),encryptedPayload:Xf.optional()}}var $f=q({gatewayId:G().min(1),mobileId:G().min(1).optional(),messageType:qf,requestId:G().min(1).optional()}),ep=Y([`fresh_connect`,`gateway_replay`]),tp=q({deviceId:G().min(1),deliveryMode:ep,gatewayAvailableAtConnect:Zn()}),np=q({deviceId:G().min(1)}),rp=er([Ll,Td,q({type:J(`command.ack`),commandType:G().min(1),commandId:G().min(1).optional(),payload:Qn().optional()}),q({type:J(`command.error`),commandType:G().min(1).optional(),commandId:G().min(1).optional(),message:G().min(1)}),q({type:J(`relay.error`),error:zf})]),ip=tr(`type`,[$f.extend({type:J(`gateway.hello`),messageType:J(`system`),payload:wf}),$f.extend({type:J(`mobile.hello`),messageType:J(`system`),payload:Tf}),$f.extend({type:J(`secure.client_hello`),messageType:J(`system`),payload:Ef}),$f.extend({type:J(`secure.gateway_hello`),mobileId:G().min(1),messageType:J(`system`),payload:Df}),$f.extend({type:J(`secure.client_auth`),messageType:J(`system`),payload:Of}),$f.extend({type:J(`secure.ready`),mobileId:G().min(1),messageType:J(`system`),payload:kf}),$f.extend({type:J(`secure.handshake_required`),mobileId:G().min(1),messageType:J(`system`),payload:jf}),$f.extend({type:J(`secure.error`),mobileId:G().min(1),messageType:J(`system`),payload:If}),$f.extend({type:J(`mobile.connected`),messageType:J(`system`),payload:tp}),$f.extend({type:J(`mobile.disconnected`),messageType:J(`system`),payload:np}),$f.extend({type:J(`from_mobile`),messageType:J(`command`),mobileId:G().min(1),...Zf(il)}),$f.extend({type:J(`to_mobile`),messageType:J(`event`),mobileId:G().min(1),...Qf(rp)}),$f.extend({type:J(`rpc.request`),messageType:J(`rpc`),requestId:G().min(1),mobileId:G().min(1),...Zf(Lf)}),$f.extend({type:J(`rpc.response`),messageType:J(`rpc`),requestId:G().min(1),mobileId:G().min(1),...Qf(Rf)}),$f.extend({type:J(`rpc.error`),messageType:J(`rpc`),requestId:G().min(1),mobileId:G().min(1),...Qf(Bf)}),$f.extend({type:J(`broadcast`),messageType:J(`event`),payload:Ll}),$f.extend({type:J(`pairing.claim.forward`),messageType:J(`system`),requestId:G().min(1),payload:Vf}),$f.extend({type:J(`pairing.claim.result`),messageType:J(`system`),requestId:G().min(1),payload:Hf}),$f.extend({type:J(`auth.refresh.forward`),messageType:J(`system`),requestId:G().min(1),payload:Uf}),$f.extend({type:J(`auth.refresh.result`),messageType:J(`system`),requestId:G().min(1),payload:Wf}),$f.extend({type:J(`file.content.forward`),messageType:J(`system`),requestId:G().min(1),payload:Mf}),$f.extend({type:J(`file.content.result`),messageType:J(`system`),requestId:G().min(1),payload:Nf}),$f.extend({type:J(`file.content.upload.started`),messageType:J(`system`),requestId:G().min(1),payload:Pf}),$f.extend({type:J(`relay.error`),messageType:J(`system`),payload:zf})]);function ap(e){return JSON.stringify([`relay-gateway-guest-token-v1`,e.gatewayId,e.gatewayIdentity.algorithm,e.gatewayIdentity.publicKey,e.gatewayIdentity.publicKeyFingerprint,e.gatewayIdentity.keyVersion,e.gatewayIdentity.createdAt,e.requestedAt])}function op(e){return JSON.stringify([e.gatewayId,e.clientHello.version,e.clientHello.securityLevel,e.clientHello.cipherSuite,e.clientHello.deviceId,e.clientHello.deviceIdentity.publicKey,e.clientHello.deviceIdentity.publicKeyFingerprint,e.clientHello.clientNonce,e.gatewayHello.gatewayNonce,e.gatewayHello.gatewayPublicKeyFingerprint,e.gatewayHello.gatewayEphemeralPublicKey])}function sp(e){return JSON.stringify([`relay-secure-gateway-hello-v1`,op(e)])}function cp(e){return JSON.stringify([`relay-secure-client-auth-v1`,op(e),e.clientAuth.clientEphemeralPublicKey])}function lp(e){let t=_f.parse(e.keyEpoch??1);return JSON.stringify([`relay-secure-session-v1`,e.gatewayId,e.clientHello.version,e.clientHello.securityLevel,e.clientHello.cipherSuite,e.clientHello.deviceId,e.clientHello.deviceIdentity.publicKey,e.clientHello.deviceIdentity.publicKeyFingerprint,e.clientHello.clientNonce,e.gatewayHello.gatewayNonce,e.gatewayHello.gatewayPublicKeyFingerprint,e.gatewayHello.gatewayEphemeralPublicKey,e.clientAuth.clientEphemeralPublicKey,t])}function up(e){let t=e.clientHello.cipherSuite;if(t!==`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`)throw Error(`unsupported cipher suite: ${t}`);let n=_f.parse(e.keyEpoch??1),r=Sp(Tp(lp({gatewayId:e.gatewayId,clientHello:e.clientHello,gatewayHello:e.gatewayHello,clientAuth:e.clientAuth,keyEpoch:n}))),i=Sp(wp(Tp(`relay-secure-hkdf-salt-v1`),r)),a=Tp(JSON.stringify([`relay-secure-key-schedule-v1`,e.gatewayId,e.clientHello.deviceId,t,n])),o=xp(e.sharedSecret,i,a,72);return{keyEpoch:n,cipherSuite:t,transcriptHash:r,clientToGatewayKey:o.slice(0,32),gatewayToClientKey:o.slice(32,64),clientToGatewayNoncePrefix:o.slice(64,68),gatewayToClientNoncePrefix:o.slice(68,72)}}function dp(e){return e.role===`client`?{role:`client`,keyEpoch:e.keySchedule.keyEpoch,cipherSuite:e.keySchedule.cipherSuite,transcriptHash:e.keySchedule.transcriptHash,outboundKey:e.keySchedule.clientToGatewayKey,inboundKey:e.keySchedule.gatewayToClientKey,outboundNoncePrefix:e.keySchedule.clientToGatewayNoncePrefix,inboundNoncePrefix:e.keySchedule.gatewayToClientNoncePrefix,outboundCounter:0,highestInboundCounter:null}:{role:`gateway`,keyEpoch:e.keySchedule.keyEpoch,cipherSuite:e.keySchedule.cipherSuite,transcriptHash:e.keySchedule.transcriptHash,outboundKey:e.keySchedule.gatewayToClientKey,inboundKey:e.keySchedule.clientToGatewayKey,outboundNoncePrefix:e.keySchedule.gatewayToClientNoncePrefix,inboundNoncePrefix:e.keySchedule.clientToGatewayNoncePrefix,outboundCounter:0,highestInboundCounter:null}}function fp(e,t){let n=vf.parse(t);if(e.length!==4)throw Error(`nonce prefix must be 4 bytes`);let r=new Uint8Array(12);return r.set(e,0),r.set(Dp(n),4),r}function pp(e,t){let n=vf.parse(t);if(e===null)return;let r=vf.parse(e);if(n<=r)throw Error(`counter_replay`);if(n-r>1e3)throw Error(`counter_gap_too_large`)}function mp(e){return JSON.stringify([`relay-secure-business-payload-v1`,e.metadata.frameType,e.metadata.messageType,e.metadata.gatewayId,e.metadata.requestId??``,e.encryptedPayload.version,e.encryptedPayload.keyEpoch,e.encryptedPayload.counter])}function hp(e){Cp(e.session.cipherSuite);let t=e.session.outboundCounter,n=fp(e.session.outboundNoncePrefix,t),r=e.preparedPayload.payloadBytes,i=Tp(mp({metadata:e.metadata,encryptedPayload:{version:1,keyEpoch:e.session.keyEpoch,counter:t}})),a=qi(e.session.outboundKey,n,i).encrypt(r),o=a.subarray(0,a.length-16),s=a.subarray(a.length-16);return e.session.outboundCounter=t+1,Xf.parse({version:1,keyEpoch:e.session.keyEpoch,counter:t,iv:_p(n),ciphertext:_p(o),authTag:_p(s),plaintextEncoding:Jf,compression:e.preparedPayload.compression,...e.preparedPayload.compression===`gzip`?{uncompressedByteLength:e.preparedPayload.uncompressedByteLength,compressedByteLength:e.preparedPayload.compressedByteLength}:{}})}function gp(e){Cp(e.session.cipherSuite);let t=Xf.parse(e.encryptedPayload);if(t.keyEpoch!==e.session.keyEpoch)throw Error(`key_epoch_mismatch`);pp(e.session.highestInboundCounter,t.counter);let n=fp(e.session.inboundNoncePrefix,t.counter),r=vp(t.iv);if(!Ep(r,n))throw Error(`decrypt_failed`);let i=Tp(mp({metadata:e.metadata,encryptedPayload:t})),a=wp(vp(t.ciphertext),vp(t.authTag)),o;try{o=qi(e.session.inboundKey,r,i).decrypt(a)}catch{throw Error(`decrypt_failed`)}e.session.highestInboundCounter=t.counter;try{return nf({payloadBytes:o,compression:t.compression,expectedUncompressedByteLength:t.uncompressedByteLength,parse:e.parse})}catch{throw Error(`decrypt_failed`)}}function _p(e){let t=globalThis.Buffer;if(t)return t.from(e).toString(`base64`);let n=``;for(let t of e)n+=String.fromCharCode(t);if(typeof btoa!=`function`)throw Error(`base64 encoder unavailable`);return btoa(n)}function vp(e){let t=globalThis.Buffer;if(t)return new Uint8Array(t.from(e,`base64`));if(typeof atob!=`function`)throw Error(`base64 decoder unavailable`);let n=atob(e),r=new Uint8Array(n.length);for(let e=0;e<n.length;e+=1)r[e]=n.charCodeAt(e);return r}function yp(e){return _p(e).replace(/\+/gu,`-`).replace(/\//gu,`_`).replace(/=+$/u,``)}function bp(e){return vp(e.replace(/-/gu,`+`).replace(/_/gu,`/`).padEnd(Math.ceil(e.length/4)*4,`=`))}function xp(e,t,n,r){return r<=0?new Uint8Array:new Uint8Array(ya(Na,e,t.length>0?t:new Uint8Array(32),n,r))}function Sp(e){return new Uint8Array(Na(e))}function Cp(e){if(e!==`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`)throw Error(`unsupported cipher suite: ${e}`)}function wp(...e){let t=e.reduce((e,t)=>e+t.length,0),n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.length;return n}function Tp(e){return new TextEncoder().encode(e)}function Ep(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1)if(e[n]!==t[n])return!1;return!0}function Dp(e){if(!Number.isSafeInteger(e))throw Error(`counter must be a safe integer`);let t=Math.floor(e/4294967296),n=e>>>0,r=new Uint8Array(8),i=new DataView(r.buffer);return i.setUint32(0,t),i.setUint32(4,n),r}function Op(e){return yp(Na(vp(e)).subarray(0,16))}function kp(e){if(e.type!==`native.raw`)return null;let t=Fp(e.payload.raw),n=Fp(t.message),r=Fp(n.params),i=Fp(r.msg),a=Ip(n.method)??Ip(t.method);if(!a)return null;let o=Ip(i.type)??``;if(!Np(a)&&!Pp(o))return null;let s=Mp(t);if(!s||!s.delta)return null;let c=Ip(r.conversationId)??Ip(r.conversation_id)??``,l=Ip(i.thread_id)??Ip(i.threadId)??Ip(r.threadId)??Ip(r.thread_id)??``,u=Ip(i.turn_id)??Ip(i.turnId)??Ip(r.turnId)??Ip(r.turn_id)??``,d=Ip(i.item_id)??Ip(i.itemId)??Ip(r.itemId)??Ip(r.item_id)??``,f=Ip(t.source)??``,p=Lp(i.summaryIndex??i.summary_index??r.summaryIndex??r.summary_index),m=Lp(i.contentIndex??i.content_index??r.contentIndex??r.content_index);return{key:[e.sessionId,f,a,c,l,u,d,o,p,m].join(`|`),delta:s.delta,method:a}}function Ap(e,t){let n=kp(e),r=kp(t);if(!n||!r||n.key!==r.key)return null;let i=`${n.delta}${r.delta}`,a=Fp(t.payload.raw),o=Mp(a)?.location??Mp(Fp(e.payload.raw))?.location;return o?{...t,eventId:e.eventId,ts:t.ts,payload:{...t.payload,raw:jp(a,o,i)}}:null}function jp(e,t,n){if(t===`raw.delta`)return{...e,delta:n};let r=Fp(e.message),i=Fp(r.params);if(t===`params.delta`)return{...e,message:{...r,params:{...i,delta:n}}};let a=Fp(i.msg);return{...e,message:{...r,params:{...i,msg:{...a,delta:n}}}}}function Mp(e){let t=Fp(Fp(e.message).params),n=Fp(t.msg);return typeof n.delta==`string`?{delta:n.delta,location:`msg.delta`}:typeof t.delta==`string`?{delta:t.delta,location:`params.delta`}:typeof e.delta==`string`?{delta:e.delta,location:`raw.delta`}:null}function Np(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function Pp(e){return e.endsWith(`_delta`)||e.endsWith(`Delta`)}function Fp(e){return typeof e==`object`&&e?e:{}}function Ip(e){return typeof e==`string`&&e.trim()||void 0}function Lp(e){return typeof e==`number`&&Number.isFinite(e)?String(e):typeof e==`bigint`?e.toString():Ip(e)??``}var Rp=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]),zp=/\u001B\[[0-?]*[ -/]*[@-~]/g,Bp={"thread.started":0,"thread.title.updated":1,"turn.started":2,"item.started":3,"item.updated":4,"item.completed":5,"turn.completed":6,"turn.failed":6,"tool.permission.requested":7,"user.input.requested":7};function Vp(e,t){let n=[],r=0,i=[...t].filter(t=>t.sessionId===e).sort((e,t)=>e.ts.localeCompare(t.ts)),a=[],o=()=>(r+=1,`raw_proj_item_${e}_${r}`);for(let e of i){let t=Ml.safeParse(e.type);if(t.success){n.push(Kp(e,t.data,tm(e.payload.raw),e.eventId));continue}if(e.type!==`native.raw`)continue;let r=tm(e.payload.raw),i=Up(e,r);if(i.length>0&&n.push(...i),r.historyReplay!==!0)continue;let o=X(r.source);if(o?.startsWith(`codex.history.thread_read`)){n.push(...Wp(e,r));continue}o&&Rp.has(o)&&a.push(e)}a.length>0&&n.push(...Gp(a,o));let s=new Map,c=new Map;for(let e of n){let t=Xp(e);if(!t){s.set(e.eventId,e);continue}let n=Zp(e.payload.raw),r=c.get(t);(!r||n>r.richness)&&c.set(t,{event:e,richness:n})}for(let{event:e}of c.values())s.set(e.eventId,e);return[...s.values()].sort((e,t)=>{let n=e.ts.localeCompare(t.ts);if(n!==0)return n;let r=Sm(e.type)-Sm(t.type);return r===0?e.eventId.localeCompare(t.eventId):r})}function Hp(e,t,n){return fu(e,Vp(e,t),n)}function Up(e,t){if(e.type!==`native.raw`||X(t.source)!==`codex.app_server`)return[];let n=tm(t.message),r=tm(n.params),i=X(n.method)??X(t.method);if(!i)return[];if(i===`turn/started`||i===`turn/completed`||i===`turn/failed`||i===`turn/interrupted`){let t=Jp(tm(r.turn),r);if(Object.keys(t).length===0)return[];let n=i===`turn/started`?`turn.started`:i===`turn/failed`?`turn.failed`:`turn.completed`,a=X(t.status)??(i===`turn/completed`?`completed`:i===`turn/interrupted`?`interrupted`:`failed`),o=tm(t.error);return[Kp(e,n,{turn:t,status:a,turn_id:X(t.id),source_event_type:`codex.app_server`,...n===`turn.failed`?{error:o}:{}},`${e.eventId}:${n.replace(`.`,`_`)}`)]}if(i===`item/started`||i===`item/completed`){let t=qp(tm(r.item));if(Object.keys(t).length===0)return[];let n=X(r.turn_id)??X(r.turnId)??X(tm(r.turn).id)??X(t.turn_id)??X(t.turnId);return[Kp(e,i===`item/started`?`item.started`:`item.completed`,{turn_id:n,item:t,source_event_type:`codex.app_server`},`${e.eventId}:${i===`item/started`?`item_started`:`item_completed`}`)]}return[]}function Wp(e,t){let n=[],r=tm(t.message),i=X(r.scope);if(i===`thread`){let t=tm(r.thread),i=X(t.id);n.push(Kp(e,`thread.started`,{thread_id:i,thread:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:thread_started`));let a=rm(X(t.preview));return a&&n.push(Kp(e,`thread.title.updated`,{title:a,source:`codex.history.thread_read`,thread_id:i},`${e.eventId}:thread_title_updated`)),n}if(i===`turn`){let t=tm(r.turn),i=X(t.status);return n.push(Kp(e,`turn.started`,{turn:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_started`)),i===`completed`||i===`interrupted`?n.push(Kp(e,`turn.completed`,{status:i,turn:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_completed`)):i===`failed`&&n.push(Kp(e,`turn.failed`,{status:i,turn:t,error:tm(t.error),source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_failed`)),n}if(i===`item`){let t=tm(r.item),i=X(r.turn_id)??X(t.turn_id);n.push(Kp(e,`item.completed`,{turn_id:i,item:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:item_completed`))}return n}function Gp(e,t){let n=[],r=e[0];if(!r)return n;let i=tm(r.payload.raw),a=tm(i.message),o=X(i.native_session_id)??X(a.session_id)??r.sessionId,s=new Map,c=!1,l=0,u;n.push(Kp(r,`thread.started`,{thread_id:o,source:`claude.history.getSessionMessages`},`${r.eventId}:thread_started`));let d=(e,t,r)=>u||(l+=1,u={id:`claude_hist_turn_${l}`,terminal:!1},n.push(Kp(e,`turn.started`,{turn_id:u.id,source_event_type:t,source_line:r},`${e.eventId}:turn_started:${u.id}`)),u),f=(e,t,r)=>{if(!u||u.terminal){u=void 0;return}u.terminal=!0,n.push(Kp(e,`turn.completed`,{turn_id:u.id,source_event_type:t,source_line:r},`${e.eventId}:turn_completed:${u.id}`)),u=void 0},p=(e,t,r,i)=>{let a=d(e,t,r);a.terminal||(a.terminal=!0,n.push(Kp(e,`turn.failed`,{turn_id:a.id,source_event_type:t,source_line:r,error:{message:i}},`${e.eventId}:turn_failed:${a.id}`)),u=void 0)};for(let r of e){let e=tm(r.payload.raw),i=tm(e.message),a=X(e.native_type)??X(i.type),l=tm(i.message),u=X(e.source)??`claude.history.getSessionMessages`,m=xm(e.source_line);if(a===`user`){let e=im(l),a=am(l),p=sm(l);if(e||a.length>0){if(e&&!c){let t=rm(e);t&&(n.push(Kp(r,`thread.title.updated`,{title:t,source:`claude.history.first_user_message`,thread_id:o},`${r.eventId}:thread_title_updated`)),c=!0)}f(r,u,m);let s=d(r,u,m);n.push(Kp(r,`item.completed`,{item:{id:X(i.uuid)??t(),type:`user_message`,...e?{text:e}:{},...a.length>0?{attachments:a}:{},turn_id:s.id,source_event_type:u},source_line:m},`${r.eventId}:item_completed_user`))}p.forEach((e,i)=>{let a=e.toolUseId?s.get(e.toolUseId):void 0;if(e.toolUseId&&s.delete(e.toolUseId),a?.skipReplay)return;let o=d(r,u,m);n.push(Kp(r,`item.completed`,{item:um(a,e,o.id,t),source_line:m},`${r.eventId}:item_completed_tool_result_${i+1}`))});continue}if(a!==`assistant`)continue;let h=d(r,u,m);om(l).forEach((e,i)=>{e.id&&s.set(e.id,e),!e.skipReplay&&n.push(Kp(r,`item.started`,{item:{id:e.id??t(),type:`tool_status`,status:`running`,tool_name:e.name,title:e.title,text:e.title,status_label:e.pendingStatusLabel,display_as:`tool_card`,response_label:e.responseLabel,prompt:e.prompt,file_path:e.filePath,turn_id:h.id,source_event_type:u},source_line:m},`${r.eventId}:item_started_tool_use_${i+1}`))});let g=im(l);g&&n.push(Kp(r,`item.completed`,{item:{id:X(l.id)??X(i.uuid)??t(),type:`agent_message`,text:g,turn_id:h.id,source_event_type:u},source_line:m},`${r.eventId}:item_completed_assistant`));let _=bm(X(i.error));_&&p(r,u,m,_)}let m=e[e.length-1];if(m){let e=tm(m.payload.raw);f(m,X(e.source)??`claude.history.getSessionMessages`,xm(e.source_line))}return n}function Kp(e,t,n,r){return{v:e.v,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:r,ts:e.ts,type:t,payload:{raw:n}}}function qp(e){let t=Qp(e),n=X(e.type);return n&&(t.type=Yp(n)),t}function Jp(e,t){let n=Qp(e),r=X(e.id)??X(t.turn_id)??X(t.turnId);return r&&(n.id=r),n}function Yp(e){switch(e){case`userMessage`:return`user_message`;case`agentMessage`:return`agent_message`;case`commandExecution`:return`command_execution`;case`fileChange`:return`file_change`;case`webSearch`:return`web_search`;case`mcpToolCall`:return`mcp_tool_call`;case`todoList`:return`todo_list`;case`contextCompaction`:return`context_compaction`;default:return em(e)}}function Xp(e){if(e.type!==`item.started`&&e.type!==`item.completed`)return;let t=tm(e.payload.raw),n=tm(t.item),r=X(n.id)??X(n.item_id)??X(n.itemId);if(!r)return;let i=X(t.turn_id)??X(t.turnId)??X(n.turn_id)??X(n.turnId)??``;return[e.type,e.sessionId,i,r].join(`|`)}function Zp(e){return Array.isArray(e)?e.reduce((e,t)=>e+Zp(t),0):e&&typeof e==`object`?Object.entries(e).reduce((e,[t,n])=>e+t.length+Zp(n),1):typeof e==`string`?e.length:typeof e==`number`||typeof e==`boolean`?1:0}function Qp(e){let t={};for(let[n,r]of Object.entries(e))t[em(n)]=$p(r);return t}function $p(e){return Array.isArray(e)?e.map(e=>$p(e)):typeof e==`object`&&e?Qp(e):e}function em(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).toLowerCase()}function tm(e){return typeof e==`object`&&e?e:{}}function X(e){return typeof e==`string`&&e.trim()||void 0}function nm(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function rm(e,t=60){if(!e)return;let n=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 im(e){let t=X(e.content);if(t)return bm(t);let n=X(e.text)??X(e.prompt);if(n)return bm(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=tm(e),n=X(t.type);if(n&&n!==`text`)continue;let r=X(t.text)??X(t.content)??ym(t);r&&i.push(r)}if(i.length!==0)return bm(i.join(`
137
137
  `))}function am(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=tm(e);if(X(t.type)!==`image`)continue;let r=tm(t.remote_agent_attachment);if(Object.keys(r).length>0){n.push(r);continue}let i=tm(t.source),a=X(i.path),o=X(i.media_type)??X(i.mediaType);n.push({id:X(t.id)??a??`claude_image_${n.length+1}`,kind:`image`,...o?{mimeType:o}:{},...a?{locator:{kind:`absolute`,path:a}}:{}})}return n}function om(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=tm(e);if(X(t.type)!==`tool_use`)continue;let r=tm(t.input),i=X(t.name)??`tool`;n.push({id:X(t.id),name:i,...cm(i,r)})}return n}function sm(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=tm(e);X(t.type)===`tool_result`&&n.push({toolUseId:X(t.tool_use_id)??X(t.toolUseId),toolName:X(t.tool_name)??X(t.toolName),text:mm(t),isError:t.is_error===!0})}return n}function cm(e,t){if(e===`Task`){let e=X(t.subagent_type),n=X(t.description)??e??`任务`;return{title:`${e??`Task`}(${n})`,pendingStatusLabel:`运行中`,responseLabel:`Response`,prompt:X(t.prompt)}}if(e===`Read`)return{title:`Read 1 file`,pendingStatusLabel:`运行中`,responseLabel:`Preview`,filePath:X(t.file_path)};if(e===`Write`){let e=X(t.file_path);return{title:hm(e),pendingStatusLabel:`运行中`,responseLabel:`Preview`,filePath:e,writeContent:nm(t,[`content`])}}if(e===`Edit`){let e=X(t.file_path);return{title:e?`Update(${e})`:`Edit`,pendingStatusLabel:`运行中`,responseLabel:`Preview`,filePath:e,skipReplay:!0}}return{title:e,pendingStatusLabel:`运行中`,responseLabel:`Response`,prompt:lm(t),filePath:X(t.file_path)}}function lm(e){let t=X(e.command);if(t)return t;let n=X(e.prompt);if(n)return n;let r=X(e.query);if(r)return r;let i=X(e.pattern),a=X(e.glob);return i&&a?`pattern: ${i}
138
138
  glob: ${a}`:i||bm(X(e.description))}function um(e,t,n,r){let i=e?.name??t.toolName??`tool`,a=e?.name===`Write`?e.writeContent:t.text,o=fm(i,a),s=o!==void 0,c=dm(e,t,a,s);return{id:t.toolUseId??r(),type:`tool_status`,turn_id:n,tool_name:i,title:e?.title??i,text:c,status:t.isError&&!s?`failed`:`completed`,status_label:c,display_as:`tool_card`,response:a,response_label:e?.responseLabel??`Response`,prompt:e?.prompt,file_path:e?.filePath,...o===void 0?{}:{exit_code:o},source_event_type:`claude.history.tool_result`}}function dm(e,t,n,r=!1){return t.isError&&!r?`Failed`:e?.name===`Write`?gm(vm(n),e.filePath):`Done`}function fm(e,t){if(!(!pm(e)||!t))return vo(t)}function pm(e){let t=e.trim().toLowerCase();return t===`bash`||t===`shell`}function mm(e){let t=bm(X(e.content)??X(tm(e.toolUseResult).stdout)??X(tm(e.tool_use_result).stdout)??X(e.text));if(t)return t;let n=Array.isArray(e.content)?e.content:[];if(n.length===0)return;let r=[];for(let e of n){if(typeof e==`string`&&e.trim().length>0){r.push(e.trim());continue}let t=tm(e),n=bm(X(t.text)??X(t.content)??X(t.value)??X(t.tool_name)??X(t.toolName));n&&r.push(n)}if(r.length!==0)return r.join(`
@@ -518,11 +518,11 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
518
518
  `).length}function Wk(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}function Gk(e){let t=Math.max(1,Math.round(e/1e3));if(t<60)return`${t}s`;let n=Math.floor(t/60),r=t%60;return r===0?`${n}m`:`${n}m ${r}s`}function Kk(e){return Jk(eA(e.message))||(nA(e.result)??``)}function qk(e){if(typeof e.parent_tool_use_id==`string`&&e.parent_tool_use_id.length>0||e.isSidechain===!0)return!1;let t=eA(e.message);return!(Array.isArray(t.content)?t.content:[]).some(e=>eA(e).type===`tool_result`)}function Jk(e){let t=nA(e.content);if(t)return t;let n=nA(e.text)??nA(e.prompt);if(n)return n;let r=Array.isArray(e.content)?e.content:[],i=[];for(let e of r){let t=eA(e);t.type===`text`&&typeof t.text==`string`&&t.text.length>0&&i.push(t.text)}if(i.length>0)return i.join(`
519
519
  `)}function Yk(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=eA(e);if(t.type!==`image`)continue;let r=eA(t.remote_agent_attachment);if(Object.keys(r).length>0){n.push(r);continue}let i=eA(t.source),a=tA(i.media_type)??tA(i.mediaType),o=tA(i.path);n.push({id:tA(t.id)??o??`claude_image_${n.length+1}`,kind:`image`,mimeType:a,...o?{locator:{kind:`absolute`,path:o}}:{}})}return n}function Xk(e){let t=eA(eA(e.event).delta);if(typeof t.text==`string`&&t.text.length>0)return t.text}function Zk(e,t=!1){if(t)return Ck;let n=Array.isArray(e.errors)?e.errors.filter(e=>typeof e==`string`):[];return n.length>0?n.join(`; `):tA(e.subtype)||`Claude turn failed`}function Qk(e,t){return t||(tA(e.terminal_reason)??tA(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 $k(e){let t=eA(e);return{input_tokens:iA(t.input_tokens)??iA(t.inputTokens)??0,cached_input_tokens:iA(t.cached_input_tokens)??iA(t.cache_read_input_tokens)??iA(t.cacheReadInputTokens)??0,output_tokens:iA(t.output_tokens)??iA(t.outputTokens)??0}}function eA(e){return typeof e==`object`&&e?e:{}}function tA(e){if(typeof e==`string`&&e.trim())return e}function nA(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 iA(e){if(typeof e==`number`&&Number.isFinite(e))return e}function aA(e){let t=tA(eA(e.message).id);if(t)return t;let n=tA(eA(eA(e.event).message).id);if(n)return n}function oA(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`_`);return t?t.replace(/^_+|_+$/g,``):`tool`}var sA=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=jD(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=cA(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 cA(e){return typeof e==`object`&&e&&`type`in e?e:{type:`status.progress`,nativeEvent:e}}var lA=`@anthropic-ai/claude-agent-sdk`,uA=`claude-sonnet-4-6`,dA=1e4,fA=class{constructor(e,t){this.preferNative=e,this.requireNative=t}provider=`claude`;async isNativeAvailable(){try{return await import(lA),!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(lA),n=await pA(mA(t,e),dA,`Claude native query session creation timed out`);if(n)return n;let r=await pA(hA(t,e),dA,`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 pA(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 mA(e,t){let n=gA(e);if(!n)return null;let r=t.model??uA;return new Ok(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=_A(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 hA(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 sA(`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 sA(`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 sA(`claude`,t.sessionId,t.model,n)}return null}function gA(e){if(typeof e?.query==`function`)return e.query;if(typeof e?.default?.query==`function`)return e.default.query}function _A(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 vA(e,t={}){let n=t.preferNative??!1,r=t.requireNative??!1;return e===`codex`?new ok(n,r):new fA(n,r)}const yA=p.default.join(`.claude`,`projects`),bA=/\u001B\[[0-?]*[ -/]*[@-~]/g;async function xA(e){return(await(0,O.listSessions)(typeof e==`number`?{limit:e}:void 0)).map(e=>OA(e)).filter(e=>typeof e.cwd==`string`).sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt))}async function SA(e,t){let n=EA(e,t?.homeDir),r=p.default.resolve(e);try{let i=await kA(e,n,r,{maxSessions:oj(t?.maxSessions),updatedAfterMs:aj(t?.updatedAfterMs)});if(i.length>0)return i}catch{}return AA(n,{maxSessions:oj(t?.maxSessions),updatedAfterMs:aj(t?.updatedAfterMs)})}async function CA(e){let t=await GA(e.nativeSessionId,e.projectPath),n=await KA(e.projectPath,e.nativeSessionId,e.homeDir),r=NA(t,{createdAtFallbackMs:n.birthtimeMs,updatedAtFallbackMs:n.mtimeMs}),i=IA(r.updatedAt,n.mtimeMs),a=PA(r.model);return{rawEvents:wA({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:LA(t),nativeWatchPath:TA(e.projectPath,e.nativeSessionId,e.homeDir)}}function wA(e){let t=[],n=NA(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 TA(e,t,n){return p.default.join(EA(e,n),`${t}.jsonl`)}function EA(e,t){let n=t??f.default.homedir();return p.default.join(n,yA,DA(e))}function DA(e){let t=p.default.resolve(e).replace(/\\/g,`/`).replace(/:/g,`-`).replace(/\//g,`-`);return t.startsWith(`-`)?t:`-${t}`}function OA(e){let t=tj(e.customTitle)??tj(e.summary)??tj(e.firstPrompt),n=UA(e.createdAt??e.lastModified),r=UA(e.lastModified);return{nativeSessionId:e.sessionId,cwd:HA(e.cwd),title:t,createdAt:n,updatedAt:r,status:`idle`}}async function kA(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=aj(e.lastModified);if(r.updatedAfterMs!==void 0&&i!==void 0&&i<r.updatedAfterMs){s=!0;break}let o=OA(e);if(typeof o.cwd!=`string`||p.default.resolve(o.cwd)!==n)continue;let c=await jA(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 MA(a,r)}async function AA(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 jA(e,{nativeSessionId:t.name.slice(0,-6)});n&&r.push(n)}return MA(r,t)}async function jA(e,t){let n=p.default.join(e,`${t.nativeSessionId}.jsonl`),r;try{r=await WA(n)}catch(e){if(e.code===`ENOENT`)return t.sdkSession;throw e}if(!VA(r))return;let i=await d.default.stat(n),a=t.sdkSession?.createdAt?ij(t.sdkSession.createdAt):void 0,o=t.sdkSession?.updatedAt?ij(t.sdkSession.updatedAt):void 0,s=NA(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:LA(r)}}function MA(e,t){let n=e.filter(e=>{if(t.updatedAfterMs===void 0)return!0;let n=ij(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 NA(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=QA(XA($A(t.raw.message))));let e=FA(t);e&&(n=e)}let o=i??aj(t.createdAtFallbackMs)??0,s=a??aj(t.updatedAtFallbackMs)??o;return{model:n,title:r,createdAt:new Date(o).toISOString(),updatedAt:new Date(s).toISOString()}}function PA(e){let t=HA(e);if(t)return{mode:`default`,model:t,reasoningEffort:null}}function FA(e){return HA($A(e.raw.message).model)??HA(e.raw.model)}function IA(e,t){let n=ij(e)??0,r=aj(t)??0;return new Date(Math.max(n,r)).toISOString()}function LA(e,t=Date.now()){let n=null;for(let t of e){let e=RA(t);e&&(n=e)}return!n?.unresolved||n.timestampMs!==void 0&&t-n.timestampMs>6e5?`idle`:`running`}function RA(e){let t=e.timestampMs??ij(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 zA(e.raw,t);default:return null}}function zA(e,t){let n=$A(e);if(n.isMeta===!0)return null;let r=$A(n.message);if(YA(r).length>0)return{unresolved:!0,timestampMs:t};let i=XA(r);return i?BA(i)?{unresolved:!1,timestampMs:t}:{unresolved:!0,timestampMs:t}:null}function BA(e){let t=e.toLowerCase();return t.includes(`[request interrupted by user]`)||t.includes(`[request interrupted by user for tool use]`)?!0:t.includes(`<command-name>/exit</command-name>`)||t.includes(`<command-message>exit</command-message>`)||t.includes(`<local-command-stdout>catch you later!</local-command-stdout>`)}function VA(e){for(let t of e){if(t.type===`user`){let e=$A(t.raw.message);if(XA(e)||YA(e).length>0)return!0;continue}if(t.type!==`assistant`)continue;let e=$A(t.raw.message);if(XA(e)||JA(e).length>0||ej(t.raw.error))return!0}return!1}function HA(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function UA(e){return Number.isFinite(e)?new Date(e).toISOString():new Date(0).toISOString()}async function WA(e){let t=(await d.default.readFile(e,`utf8`)).split(`
520
520
  `),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=$A(i),o=ej(a.timestamp),s=o?ij(o):void 0;n.push({line:e+1,raw:a,type:ej(a.type),timestamp:o,timestampMs:s})}return n}async function GA(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)=>qA(e,t+1))}async function KA(e,t,n){let r=TA(e,t,n);try{return await d.default.stat(r)}catch{let e=Date.now();return{birthtimeMs:e,mtimeMs:e}}}function qA(e,t){let n=$A(e),r=$A(n.message),i=ej(n.timestamp)??ej(r.timestamp)??ej(r.created_at)??ej(r.createdAt);return{line:t,raw:{...n,message:r},type:ej(n.type),timestamp:i,timestampMs:i?ij(i):void 0}}function JA(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=$A(e);if(ej(t.type)!==`tool_use`)continue;let r=$A(t.input),i=ej(r.command),a=ej(t.name)??`tool`,o=ej(r.description);n.push({id:ej(t.id),name:a,command:i,summary:o??i??`${a} started`})}return n}function YA(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=$A(e);if(ej(t.type)!==`tool_result`)continue;let r=nj(ej(t.content)??ej($A(t.toolUseResult).stdout)??ej($A(t.tool_use_result).stdout)??ej(t.text));n.push({toolUseId:ej(t.tool_use_id)??ej(t.toolUseId),toolName:ej(t.tool_name)??ej(t.toolName),text:r,isError:t.is_error===!0})}return n}function XA(e){let t=ej(e.content);if(t)return nj(t);let n=ej(e.text)??ej(e.prompt);if(n)return nj(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=$A(e),n=ej(t.type);if(n&&n!==`text`)continue;let r=ej(t.text)??ej(t.content)??ZA(t);r&&i.push(r)}if(i.length!==0)return nj(i.join(`
521
- `))}function ZA(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=$A(e),r=ej(t.text)??ej(t.value);r&&n.push(r)}return n.length>0?n.join(``):void 0}function QA(e,t=60){if(!e)return;let n=rj(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 $A(e){return typeof e==`object`&&e?e:{}}function ej(e){return typeof e==`string`&&e.trim()||void 0}function tj(e){if(typeof e==`string`)return nj(e)}function nj(e){if(!e)return;let t=rj(e).trim();return t.length>0?t:void 0}function rj(e){return e.replace(bA,``)}function ij(e){let t=Date.parse(e);if(Number.isFinite(t))return t}function aj(e){if(!(e===void 0||!Number.isFinite(e)||e<=0))return Math.round(e)}function oj(e){if(e===void 0||!Number.isFinite(e))return;let t=Math.floor(e);return t>0?t:void 0}var sj=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}=lj(r,[t,n]);if(uj(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=fj(await this.refreshProjects()),r=!0);let i=await dj(n.projects,t);if(!i)throw mT(t);let a=await this.options.store.getProject(i.key);if(!a&&!r){if(n=fj(await this.refreshProjects()),i=await dj(n.projects,t),!i)throw mT(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 ck({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 cj({sessions:[...n.values()],canonicalPathCache:e,getRawPath:e=>hj(e.cwd),mapSession:e=>{let t=gj(e.createdAt),n=gj(e.updatedAt,t);return{provider:`codex`,nativeSessionId:e.id,title:hj(e.name)??hj(e.preview),model:hj(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 cj({sessions:await xA(),canonicalPathCache:e,getRawPath:e=>hj(e.cwd),mapSession:e=>({provider:`claude`,nativeSessionId:e.nativeSessionId,title:hj(e.title),model:hj(e.model),createdAt:hj(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 cj(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 pj(i,e.canonicalPathCache);t.push({canonicalProjectPath:n,session:e.mapSession(r)})}catch{n+=1}}return{records:t,skippedCount:n}}function lj(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:mj(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=_j(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(yj)})).sort((e,t)=>vj(e.project,t.project));return{projects:r.map(e=>e.project),projectSessions:r}}function uj(e){return Object.values(e).some(e=>e?.status===`failed`)}async function dj(e,t){let n=e.find(e=>e.path===t);if(n)return n;let r=await hD(t);return e.find(e=>e.path===r)}function fj(e){return{v:1,generatedAt:e.generatedAt,providers:e.providers,projects:e.projects}}async function pj(e,t){let n=t.get(e);return n||(n=hD(e),t.set(e,n)),n}function mj(e){return(0,l.createHash)(`sha256`).update(e).digest(`hex`).slice(0,16)}function hj(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function gj(e,t){return!Number.isFinite(e)||e<=0?t??new Date(0).toISOString():new Date(e*1e3).toISOString()}function _j(e,t){return e&&e.updatedAt>=t.updatedAt?e:t}function vj(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 yj(e,t){return e.updatedAt===t.updatedAt?`${e.provider}:${e.nativeSessionId}`.localeCompare(`${t.provider}:${t.nativeSessionId}`):t.updatedAt.localeCompare(e.updatedAt)}var bj=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 xj(this.getProjectPath(e),wj);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 Sj(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 Sj(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 xj(this.indexPath,Cj)}getProjectPath(e){return p.default.join(this.projectsDir,`${e}.json`)}enqueueWrite(e){return this.writeQueue=this.writeQueue.then(e,e),this.writeQueue}};async function xj(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 Sj(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 Cj(e){return!Tj(e)||e.v!==1||typeof e.generatedAt!=`string`||!Vd.safeParse(e.providers).success||!Array.isArray(e.projects)?!1:e.projects.every(e=>Hd.safeParse(e).success)}function wj(e){return!Tj(e)||e.v!==1||typeof e.projectKey!=`string`||e.projectKey.length===0||typeof e.canonicalProjectPath!=`string`||e.canonicalProjectPath.length===0||!Hd.safeParse(e.project).success||!Vd.safeParse(e.providers).success||!Array.isArray(e.sessions)?!1:e.sessions.every(e=>Ud.safeParse(e).success)}function Tj(e){return typeof e==`object`&&!!e}const Ej=Buffer.from([48,42,48,5,6,3,43,101,112,3,33,0]);function Dj(e){let t=Ef.parse(e.clientHello),n=(0,l.randomBytes)(32).toString(`base64`),{privateKey:r,publicKey:i}=(0,l.generateKeyPairSync)(`x25519`),a=_p(bp(jj(i.export({format:`jwk`})))),o=sp({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:Df.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 Oj(e){let t=Ef.parse(e.clientHello),n=Df.parse(e.gatewayHello),r=Of.parse(e.clientAuth);if(t.version!==n.version||r.version!==t.version||!gf.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([Ej,vp(t.deviceIdentity.publicKey)])});if(!(0,l.verify)(null,Buffer.from(cp({gatewayId:e.gatewayId,clientHello:t,gatewayHello:{gatewayNonce:n.gatewayNonce,gatewayPublicKeyFingerprint:n.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:n.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:r.clientEphemeralPublicKey}}),`utf8`),i,vp(r.signature)))throw Error(`transcript_invalid`)}function kj(e){let t=Df.parse(e.gatewayHello),n=Of.parse(e.clientAuth),r=(0,l.createPublicKey)({key:{crv:`X25519`,kty:`OKP`,x:yp(vp(n.clientEphemeralPublicKey))},format:`jwk`}),i=(0,l.diffieHellman)({privateKey:e.gatewayEphemeralPrivateKey,publicKey:r});return dp({role:`gateway`,keySchedule:up({gatewayId:e.gatewayId,clientHello:Ef.parse(e.clientHello),gatewayHello:{gatewayNonce:t.gatewayNonce,gatewayPublicKeyFingerprint:t.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:t.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:n.clientEphemeralPublicKey},sharedSecret:new Uint8Array(i),keyEpoch:1})})}function Aj(e){return If.parse({version:1,gatewayId:e.gatewayId,deviceId:e.deviceId,code:e.code,message:e.message,retryable:e.retryable})}function jj(e){if(typeof e.x!=`string`||e.x.length===0)throw Error(`x25519 public key export missing x`);return e.x}const Mj=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;let Nj=null;function Pj(e){Nj=e}function Fj(e,t){Mj&&(console.log(`[session-fetch][gateway] ${e}`,t),Nj?.info({event:e,...t},`session fetch debug`))}const Ij=64*1024;var Lj=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}},Rj=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(ip.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=>il.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=il.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(ip.parse({type:`pairing.claim.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...Wj(t,`pairing.claim`)})}}async handleRefresh(e,t){try{let n=await this.dependencies.handleRefresh(t);this.dependencies.sendFrame(ip.parse({type:`auth.refresh.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...Wj(t,`auth.refresh`)})}}async handleFileContent(e,t){try{let n=await this.dependencies.handleFileContentRequest(e,t);this.dependencies.sendFrame(ip.parse({type:`file.content.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...Wj(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:{...Uj(`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=>Lf.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(ip.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=Bf.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:Uj(`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:Uj(`BAD_REQUEST`,400,`plaintext relay payload missing`)});return}let i=Lf.parse(e.payload);try{let e=await this.dependencies.handleRpcRequest(i,{mobileId:t,deviceId:r.deviceId});this.dependencies.sendFrame(ip.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=Bf.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:Uj(`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=Dj({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(ip.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{Oj({gatewayId:this.dependencies.gatewayId,clientHello:n.handshake.clientHello,gatewayHello:n.handshake.gatewayHello,clientAuth:t})}catch(t){this.sendSecureError(e,n.deviceId,Gj(t),String(t));return}try{let r=await this.dependencies.verifyDeviceIdentityBinding(n.deviceId,n.handshake.clientHello.deviceIdentity),i=kj({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(ip.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,qj(t),String(t))}}ensureReadyMobileClient(e){if(e.clientId&&e.socket)return;let t=new Lj(t=>{try{let n=ip.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,Kj(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:Aj({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:Uj(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 gp({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,Kj(t),`relay secure payload failed: ${String(t)}`),null}}createRelayBusinessPayloadFields(e,t,n){let r=ef({payload:n,compressionThresholdBytes:zj(t.frameType,n)?Ij:void 0});if(Bj(n)){let i=Vj(n),a=Hj(n);Fj(`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:Ij,uncompressedByteLength:r.uncompressedByteLength,compressedByteLength:r.compressedByteLength})}if(e.handshake.status!==`ready`){let e=tf(r);return e?{compressedPayload:e}:{payload:n}}return{encryptedPayload:hp({session:e.handshake.session,metadata:{frameType:t.frameType,messageType:t.messageType,gatewayId:this.dependencies.gatewayId,...t.requestId?{requestId:t.requestId}:{}},preparedPayload:r})}}};function zj(e,t){return e===`to_mobile`&&Bj(t)}function Bj(e){return typeof e==`object`&&!!e&&`kind`in e&&(e.kind===`session.stream.snapshot.chunk`||e.kind===`session.readable.snapshot.chunk`)}function Vj(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 Hj(e){return e.kind===`session.readable.snapshot.chunk`||`readable`in e.payload?e.payload.readable:void 0}function Uj(e,t,n){return Bf.parse({code:e,status:t,message:n})}function Wj(e,t){if(Qw(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=Jj(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`||vT(e))||t===`file.content`&&vT(e)?{code:`UNAUTHORIZED`,status:401,message:n}:{code:`INTERNAL`,status:500,message:n}}function Gj(e){return Yj(e,[`identity_mismatch`,`counter_replay`,`unsupported_version`,`transcript_invalid`])??`transcript_invalid`}function Kj(e){return Yj(e,[`counter_gap_too_large`,`counter_replay`,`key_epoch_mismatch`,`decrypt_failed`])??`decrypt_failed`}function qj(e){if(Qw(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=Jj(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 Jj(e){return e instanceof Error?e.message:typeof e==`string`?e:String(e)}function Yj(e,t){let n=Jj(e);return t.find(e=>e===n)}function Xj(e){return e?e.readyState:null}function Zj(e){return(typeof e.extensions==`string`?e.extensions.trim():``)||null}var Qj=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??tM}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=Xj(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=ip.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=$j(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:Zj(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=ip.parse(JSON.parse(eM(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 $j(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 eM(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 tM(e){return new AD(e,void 0,{perMessageDeflate:!0})}function nM(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(ap(t),`utf8`),(0,l.createPrivateKey)(e.privateKeyPem)).toString(`base64`)}}async function rM(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(iM(e.relayUrl),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(nM({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 Kf.parse(JSON.parse(r)).token}function iM(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 aM(e){return e?.trim()||void 0}function oM(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 sM(e,t){let n=t.defaults.sandboxMode??null;return{modeDefault:`default`,model:aM(t.defaults.model),reasoningEffort:t.defaults.reasoningEffort,execution:e===`codex`?{codex:{approvalPolicy:Ga(n),sandboxMode:n}}:{claude:{permissionMode:t.defaults.permissionMode??null}}}}function cM(e){return{mode:`default`,model:null,reasoningEffort:null,execution:e===`codex`?{codex:{approvalPolicy:null,sandboxMode:null}}:{claude:{permissionMode:null}}}}function lM(e,t){let n=cM(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 uM(e,t){return e===`claude`&&t?.permissionMode===`plan`?`plan`:`default`}function dM(e){let t=lM(e.provider,e.sessionTurnConfig);return e.sessionTurnConfig!==void 0||aM(e.legacyModel)!==void 0||e.legacySessionConfig!==void 0?fM({provider:e.provider,providerDefaults:{modeDefault:`default`},currentSessionTurnConfig:t,legacyModel:e.legacyModel,legacySessionConfig:e.legacySessionConfig}).sessionTurnConfig:t}function fM(e){let t=lM(e.provider,e.currentSessionTurnConfig),n=e.mode??(e.legacySessionConfig?uM(e.provider,e.legacySessionConfig):void 0)??t.mode??e.providerDefaults.modeDefault,r=lM(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=aM(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??aM(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:oM(r.execution)}}}function pM(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}var mM=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 t=Ka(e),{provider:n,...r}=t;return await this.enqueueWrite(async()=>{let e=this.preferences[n];this.preferences[n]=r;try{await this.persist()}catch(t){throw e?this.preferences[n]=e:delete this.preferences[n],t}}),t}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=pM(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 hM=[],gM=[{id:`default`,label:`Default`,isDefault:!0,supportedReasoningEfforts:[`low`,`medium`,`high`,`max`]}],_M=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`],vM=Ia.options,yM=[`read-only`,`workspace-write`,`danger-full-access`],bM=[`websocket`,`stdio`],xM=[`default`,`acceptEdits`,`bypassPermissions`,`plan`,`dontAsk`],SM={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 CM(e,t){let n=t?.trim().toLowerCase();return n?(SM[e]??[]).find(e=>n===e.version.toLowerCase())??null:null}function wM(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:_M}:{}},...e.map(e=>({...e,isDefault:!1}))]}function TM(e){return e===`none`||e===`minimal`||e===`low`||e===`medium`||e===`high`||e===`xhigh`||e===`max`?e:null}function EM(e){let t=new Set;for(let n of e){let e=TM(n);e&&t.add(e)}return[...t]}function DM(e){return e?.trim()||void 0}function OM(e){let t=DM(e.runtimeModel);if(t)return t;let n=DM(e.discoveredModel);if(n)return n;let r=DM(e.existingModel),i=DM(e.modelProvider)?.toLowerCase();if(r&&(!i||r.toLowerCase()!==i))return r}function kM(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:EM(e.supportedReasoningEfforts)}));return t.length===0?hM:(t.some(e=>e.isDefault)||(t[0]={...t[0],isDefault:!0}),t)}async function AM(e){let t=Date.now();try{let n=kM(await dk());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 jM(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(sh(),`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=NM(e.description,e.displayName,t),a=e.supportsEffort===!1?[]:e.supportsEffort||n?EM(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 MM(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 NM(...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 PM=class{cache=new Map;inFlight=new Map;cacheEpochByProvider=new Map;executionPreferences;constructor(e){this.options=e,this.executionPreferences=new mM(this.options.providerExecutionPreferencesDir??p.default.join(sh(),`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=SM.claude.length>0?SM.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 sM(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 oT(t);let r=CM(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=vA(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 AM(this.options.logger)??hM:hM,l=e===`claude`&&a?await jM(this.options.logger)??gM:gM,u=EM(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:_M,approvalPolicies:vM,sandboxModes:yM,permissionModes:[],codexAppServerTransports:[...bM]},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:xM},defaults:{model:l.find(e=>e.isDefault)?.id??l[0]?.id,reasoningEffort:MM(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?wM(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 FM=`.meta.json`;function IM(){let e=process.env.CODEX_HOME?.trim();return e?p.default.resolve(e):p.default.join(f.default.homedir(),`.codex`)}function LM(){return p.default.join(IM(),`auth.json`)}function RM(){return p.default.join(sh(),`codex-accounts`)}var zM=class{currentAuthFilePath;snapshotsDir;readAccountMetadata;constructor(e={}){this.currentAuthFilePath=e.currentAuthFilePath??LM(),this.snapshotsDir=e.snapshotsDir??RM(),this.readAccountMetadata=e.readAccountMetadata??HM}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 aN(this.currentAuthFilePath),n=await this.readSavedSnapshot(e);return await oN(this.currentAuthFilePath,n.rawContent),{previousRawContent:t}}async deleteSavedAccount(e){let t=this.getSnapshotPath(e);if(await aN(t)===null)throw fT(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 oN(this.currentAuthFilePath,e)}async listSavedAccounts(e){let t=await iN(this.snapshotsDir);return(await Promise.all(t.filter(e=>e.isFile()&&rN(e.name)).map(async t=>{let n=nN(t.name);if(!n)return null;let r=p.default.join(this.snapshotsDir,t.name);try{let t=BM(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 aN(this.getSnapshotPath(e));if(n===null)return`missing`;try{return BM(n,this.getSnapshotPath(e)).canonicalContent===t?`current`:`stale`}catch{return`stale`}}async writeSnapshot(e,t,n){let r=new Date().toISOString();await oN(this.getSnapshotPath(e),t.rawContent),await oN(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 aN(t);if(n===null)throw fT(e);return BM(n,t)}async readSnapshotMetadata(e){let t=await aN(this.getSnapshotMetadataPath(e));if(t===null)return null;try{return VM(t)}catch{return null}}async readCurrentAuthFile(){let e=await this.readCurrentAuthFileOrNull();if(!e)throw pT(`Current Codex auth.json is missing or unreadable`);return e}async readCurrentAuthFileOrNull(){let e=await aN(this.currentAuthFilePath);if(e===null)return null;try{return BM(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 pT(`Current Codex account does not expose a ChatGPT email via account/read`);return e}getSnapshotPath(e){return p.default.join(this.snapshotsDir,`${tN(e)}.json`)}getSnapshotMetadataPath(e){return p.default.join(this.snapshotsDir,`${tN(e)}${FM}`)}};function BM(e,t){let n;try{n=JSON.parse(e)}catch(e){throw pT(`Codex auth file is not valid JSON: ${t}`,{error:String(e)})}if(!n||typeof n!=`object`||Array.isArray(n))throw pT(`Codex auth file is not an object: ${t}`);let r=n;return{authMode:UM(r.auth_mode),lastRefreshAt:qM(r.last_refresh),rawContent:e,canonicalContent:$M(n)}}function VM(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`invalid snapshot metadata`);let n=t,r=GM(n.accountId);if(!r)throw Error(`missing snapshot metadata accountId`);return{accountId:r,accountType:KM(n.accountType),planType:WM(n.planType),rateLimits:JM(n.rateLimits),savedAt:qM(n.savedAt)??new Date(0).toISOString()}}async function HM(){return mO(async e=>{let t=QM(await e.sendRequest(`account/read`,{refreshToken:!1}));if(!t)return null;let n=QM(t.account);if(!n)return null;let r=null;try{let t=QM(await e.sendRequest(`account/rateLimits/read`,void 0));r=t?JM(QM(t.rateLimits)):null}catch{r=null}let i=KM(n.type);if(i===`chatgpt`){let e=GM(n.email);return e?{accountId:e,accountType:i,planType:WM(n.planType)??r?.planType??null,rateLimits:r}:null}return i===`apiKey`?{accountId:`API Key`,accountType:i,planType:WM(n.planType)??r?.planType??null,rateLimits:r}:null})}function UM(e){return typeof e==`string`&&e.trim()?e.trim():`unknown`}function WM(e){return typeof e==`string`&&e.trim()?e.trim():null}function GM(e){return typeof e==`string`&&e.trim()?e.trim().toLowerCase():null}function KM(e){return e===`chatgpt`||e===`apiKey`?e:`unknown`}function qM(e){if(typeof e!=`string`||!e.trim())return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function JM(e){let t=QM(e);if(!t)return null;let n=YM(t.primary),r=YM(t.secondary),i=WM(t.planType??t.plan_type),a=QM(t.credits),o=WM(t.creditsBalance??a?.balance);return!n&&!r&&!i&&!o?null:{...n?{primary:n}:{},...r?{secondary:r}:{},...i?{planType:i}:{},...o?{creditsBalance:o}:{}}}function YM(e){let t=QM(e);if(!t)return null;let n=XM(t.usedPercent??t.used_percent);return n===null?null:{usedPercent:n,windowMinutes:ZM(t.windowMinutes??t.windowDurationMins??t.window_minutes),resetsAt:XM(t.resetsAt??t.resets_at)}}function XM(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function ZM(e){return typeof e==`number`&&Number.isFinite(e)?Math.trunc(e):null}function QM(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function $M(e){return JSON.stringify(eN(e))}function eN(e){return Array.isArray(e)?e.map(e=>eN(e)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,eN(t)])):e}function tN(e){let t=GM(e);if(!t)throw pT(`Codex account identifier cannot be empty`);return encodeURIComponent(t)}function nN(e){if(!rN(e))return null;try{return GM(decodeURIComponent(e.slice(0,-5)))}catch{return null}}function rN(e){return e.endsWith(`.json`)&&!e.endsWith(FM)}async function iN(e){try{return await d.default.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function aN(e){try{return await d.default.readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function oN(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 sN=[`## 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 cN(e,t){let n=e.provider===`codex`?e.codex:void 0;if(!n)throw Error(`Codex review config is required`);return[...sN,``,uN(n.target),`## My request for Codex:`,lN(e,t)].join(`
522
- `)}function lN(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 ${dN(r.sha,r.title)}.`:r.type===`custom`?r.instructions:`Please review my uncommitted changes.`,a=fN(t);return a?`${i}\n\nAdditional review instructions:\n${a}`:i}function uN(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 ${dN(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 dN(e,t){let n=fN(t);return n?`${e} (${JSON.stringify(n)})`:e}function fN(e){return e?.trim()||void 0}async function pN(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,gN(e.sessionId),gN(e.commandId??`turn_${Xw(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(!hN(t,a.mimeType))throw Error(`Image attachment MIME/content mismatch: ${a.mimeType}`);let o=mN(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 mN(e){return e===`image/jpeg`?`jpg`:e===`image/webp`?`webp`:`png`}function hN(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 gN(e){return e.replace(/[^a-zA-Z0-9._-]+/g,`_`).slice(0,80)||`unknown`}const _N=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;function vN(e){return e.lastHydratedExternalUpdatedAt||e.updatedAt||e.createdAt}function yN(e,t){_N&&(!e.startsWith(`config.get`)&&!e.startsWith(`raw-events`)&&!e.startsWith(`sync-external`)&&!e.endsWith(`.error`)||console.log(`[session-fetch][gateway] ${e}`,t))}function bN(e){return e?{sessionFound:!0,sessionId:e.id,nativeSessionId:e.nativeSessionId??null,sessionSource:e.source??null,sessionModel:e.model??null,sessionUpdatedAt:e.updatedAt,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 xN(e,t,n,r){let i=lM(e,n);if(!t)return CN(e,i,r);let a=lM(e,t);return CN(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 SN(e){return e.observedModel===void 0?e.observedSessionTurnConfig?.model===void 0?e.currentModel:DM(e.observedSessionTurnConfig.model??void 0):DM(e.observedModel)}function CN(e,t,n){let r=lM(e,t);return{mode:r.mode,model:r.model,reasoningEffort:e===`claude`&&n?.preserveReasoningEffort===!1?null:r.reasoningEffort}}function wN(e){return e.provider!==`claude`||e.source===`gateway`}function TN(e){return!e||e.provider!==`claude`||e.source===`gateway`||!e.sessionTurnConfig?e:{...e,sessionTurnConfig:CN(`claude`,e.sessionTurnConfig,{preserveReasoningEffort:!1})}}function EN(e,t){return e?.status===`running`?{status:`running`}:t?{status:`running`,interactionLockReason:`external_turn_running`}:{status:`idle`}}function DN(e){return e.status===`active`?!0:e.turns.some(e=>e.status===`inProgress`||e.status===`in_progress`)}function ON(e,t){if(!t)return DN(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 kN(e){return e.startsWith(`sess_`)}function AN(e){return e.source===`native_discovered`?!0:e.providerMode===`native`&&(e.provider===`codex`||e.provider===`claude`)}function jN(e){return e.nativeSessionId?.trim()??``?!0:e.provider===`codex`&&!kN(e.id)}function MN(e){return kN(e.id)?e.nativeSessionId??e.id:e.id}function NN(e){return e.provider!==`codex`&&e.provider!==`claude`||e.providerMode!==`native`?!1:jN(e)}function PN(e){return e instanceof Error&&/^Session .+ is closed$/i.test(e.message)}function FN(e,t){if(e.provider!==`codex`||t.type!==`error.runtime`)return!1;if(QP(t.source)?.startsWith(`codex.app_server`))return!0;let n=QP(t.message)??``;return/\bclosed\b/i.test(n)}const IN={idleTtlMs:900*1e3,sweepIntervalMs:60*1e3,maxSessions:24,maxCodexSessions:8,maxClaudeSessions:16};function LN(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(1,Math.trunc(n)):t}function RN(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(0,Math.trunc(n)):t}var zN=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 PM({preferNativeProviders:e.preferNativeProviders,projectStore:e.projectStore,logger:e.logger,providerExecutionPreferencesDir:e.providerExecutionPreferencesDir}),this.codexAccounts=e.codexAccountService??new zM,this.attachmentStoreDir=e.attachmentStoreDir??p.default.join(f.default.tmpdir(),`craby-session-attachments`),this.runtimeLifecycle={idleTtlMs:LN(e.runtimeLifecycle?.idleTtlMs,IN.idleTtlMs),sweepIntervalMs:RN(e.runtimeLifecycle?.sweepIntervalMs,IN.sweepIntervalMs),maxSessions:LN(e.runtimeLifecycle?.maxSessions,IN.maxSessions),maxCodexSessions:LN(e.runtimeLifecycle?.maxCodexSessions,IN.maxCodexSessions),maxClaudeSessions:LN(e.runtimeLifecycle?.maxClaudeSessions,IN.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 XD(),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 uT(e);return this.options.projectStore.remove(e)}async restartCodexAppServer(){let e=this.getRunningRuntimeSessionCount();if(e>0)throw dT(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 ZD(),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 dT(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 XD();let i=null;try{i=await this.codexAccounts.applySavedAccount(e),await ZD()}catch(e){if(i?.previousRawContent)try{await this.codexAccounts.restoreCurrentAuthFile(i.previousRawContent),await ZD()}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 e.requestedTransport?e.requestedTransport:(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 oT(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)||TN(n)}async getProjectSessionConfig(e,t){let n=this.options.historyStore.getProjectSession(e,t),r=this.getRuntimeSessionSummary(e,t,n);if(yN(`config.get.begin`,{projectId:e,sessionId:t,shouldHydrate:n?this.shouldHydrateCodexExternalSessionConfig(n):!1,persisted:bN(n),runtime:bN(r)}),r)return yN(`config.get.result`,{projectId:e,sessionId:t,resultSource:`runtime`,...bN(r)}),r;let i=n?.provider===`codex`?await this.maybeHydrateCodexExternalSessionConfig(n):TN(n);return yN(`config.get.result`,{projectId:e,sessionId:t,resultSource:i===n?`persisted`:`hydrated`,...bN(i)}),i}async syncProjectSessionHistory(e,t){let n=await this.options.projectStore.getById(e);if(!n)throw oT(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 sT(e,t);let i=await this.options.historyStore.getSessionRawEvents(r.id,2**53-1),a=await this.options.historyStore.getSessionStoredRawEvents(r.id,2**53-1),o=await this.syncExternalRawHistory(r,e,i,a),s=o.session??this.options.historyStore.getProjectSession(e,r.id)??r,c=jP(i,o.rawEvents);yN(`sync-external.classify`,AP({projectId:e,sessionId:t,session:s,previousEvents:i,nextEvents:o.rawEvents,classification:c}));let l=s.status!==r.status||(s.interactionLockReason??``)!==(r.interactionLockReason??``);return{session:s,rawEvents:o.rawEvents,historyUpdated:c.historyUpdated,statusChanged:l,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,nativeWatchPath:o.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 oT(e);let i=0,a=0,o,s=(s,c)=>{yN(`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 sT(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 oT(e);let n=this.options.historyStore.getProjectSession(e,t);if(n||=this.getRuntimeSessionSummary(e,t),!n)throw sT(e,t);return n}async startSession(e){let t=await this.resolveProjectForSessionStart(e.projectId,e.cwd),n=`sess_${Xw(10)}`,r=e.provider===`codex`&&this.options.requireNativeCodex,i=vA(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,requestedTransport:e.codexAppServerTransport}),s=e.sessionTurnConfig?lM(e.provider,e.sessionTurnConfig):dM({provider:e.provider,legacyModel:e.model,legacySessionConfig:e.sessionConfig}),c=fM({provider:e.provider,providerDefaults:a,currentSessionTurnConfig:s}),l=CN(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,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 lT(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!s&&this.preparingRuntimeDispatches.has(e))throw lT(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(o?.interactionLockReason===`external_turn_running`)throw lT(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 lT(e,`the current turn is still running`,{reason:`runtime_running`,provider:s.provider,providerMode:s.providerMode});if(!s&&o?.status===`running`&&AN(o))throw lT(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;try{if(c&&this.preparingRuntimeDispatches.add(e),l=s??await this.resumeSessionFromHistory(e,{codexAppServerTransport:r?.codexAppServerTransport}),!l)throw cT(e);let t=await this.getProviderDefaults(l.provider,l.projectId),o=fM({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 d=await pN({rootDir:this.attachmentStoreDir,sessionId:e,commandId:r?.commandId,attachments:a}),f={text:i,attachments:d.attachments};if(await this.options.auditLogger.record({ts:new Date().toISOString(),action:`turn.input`,deviceId:n,sessionId:e,detail:{text:i,attachments:d.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:d.attachments.length,attachmentTotalSizeBytes:d.totalSizeBytes,model:o.model,sessionConfig:r?.sessionConfig,mode:o.mode,config:r?.config,resolvedSessionConfig:o.sessionConfig,codexAppServerTransport:r?.codexAppServerTransport}}),this.consumeQueuedInterruptBeforeDispatch(e)||(this.options.historyStore.getSession(l.id)||await this.persistSessionSnapshot(l),this.consumeQueuedInterruptBeforeDispatch(e)))throw u=!0,this.createInterruptedBeforeDispatchError(e);if(l=await this.sendInputWithRuntimeRecovery(e,l,f,{model:o.model,sessionConfig:o.sessionConfig,mode:o.mode,codexAppServerTransport:r?.codexAppServerTransport}),!l.title){let e=XP(i)??(d.attachments.length>0?`图片消息`:void 0);e&&this.setSessionTitle(l,e)}let p=new Date().toISOString();l.sessionTurnConfig=CN(l.provider,o.sessionTurnConfig),l.sessionTurnConfigUpdatedAt=p,o.model&&l.model!==o.model&&(l.model=o.model),l.updatedAt=p,await this.persistSessionSnapshot(l)}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 lT(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!a&&this.preparingRuntimeDispatches.has(e))throw lT(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(i?.interactionLockReason===`external_turn_running`)throw lT(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 lT(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&AN(i))throw lT(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;try{if(o&&this.preparingRuntimeDispatches.add(e),s=a??await this.resumeSessionFromHistory(e,{codexAppServerTransport:r?.codexAppServerTransport}),!s)throw cT(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),l=fM({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:l.model,resolvedSessionConfig:l.sessionConfig,codexAppServerTransport:r?.codexAppServerTransport}}),this.consumeQueuedInterruptBeforeDispatch(e)||(this.options.historyStore.getSession(s.id)||await this.persistSessionSnapshot(s),this.consumeQueuedInterruptBeforeDispatch(e)))throw c=!0,this.createInterruptedBeforeDispatchError(e);let u=cN(t,r?.input);if(s=await this.sendInputWithRuntimeRecovery(e,s,u,{model:l.model,sessionConfig:l.sessionConfig,codexAppServerTransport:r?.codexAppServerTransport}),!s.title){let e=ZP(t,r?.input);e&&this.setSessionTitle(s,e)}let d=new Date().toISOString();s.sessionTurnConfig=CN(s.provider,l.sessionTurnConfig),s.sessionTurnConfigUpdatedAt=d,l.model&&s.model!==l.model&&(s.model=l.model),s.updatedAt=d,await this.persistSessionSnapshot(s)}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(!PN(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,{codexAppServerTransport:r.codexAppServerTransport});if(!o)throw a;return o.dispatchInFlight=!0,this.touchSession(o),await o.providerSession.sendInput(n,r),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:$P(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 cT(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_${Xw(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,t){let n=this.options.historyStore.getSession(e);if(!n)return;let r=n.provider===`codex`&&this.options.requireNativeCodex,i=vA(n.provider,{preferNative:this.options.preferNativeProviders,requireNative:r}),a=await this.getProviderDefaults(n.provider,n.projectId),o=CN(n.provider,n.sessionTurnConfig,{preserveReasoningEffort:wN(n)}),s=fM({provider:n.provider,providerDefaults:a,currentSessionTurnConfig:o}),c=n.provider===`claude`?MN(n):n.nativeSessionId??n.id,l=await this.resolveCodexAppServerTransport({provider:n.provider,projectId:n.projectId,requestedTransport:t?.codexAppServerTransport}),u=await i.createSession({sessionId:n.id,model:s.model??n.model,cwd:n.projectPath,resumeSessionId:c,sessionConfig:s.sessionConfig,codexAppServerTransport:l,metadata:{resumeFromHistory:!0,codexAppServerTransport:l},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(n.provider,u,n.id),f=this.resolveNativeSessionId(n.provider,u,n.nativeSessionId),p=await this.attachRuntimeSession({id:d,nativeSessionId:f,source:n.source??`gateway`,projectId:n.projectId,projectPath:n.projectPath,provider:n.provider,providerMode:u.providerMode,model:s.model??n.model,title:n.title,sessionTurnConfig:o,sessionTurnConfigUpdatedAt:n.sessionTurnConfigUpdatedAt,createdAt:n.createdAt,updatedAt:n.updatedAt||new Date().toISOString(),status:`idle`,providerSession:u,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!0,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return await this.persistSessionSnapshot(p),p}consumeQueuedInterruptBeforeDispatch(e){return this.queuedInterruptsBeforeDispatch.delete(e)}createInterruptedBeforeDispatchError(e){return lT(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 sk(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=eF(t.createdAt),s=eF(t.updatedAt),l=EN(i,DN(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:OM({runtimeModel:i?.model,discoveredModel:t.model,existingModel:n?.model,modelProvider:t.modelProvider}),title:i?.title??XP(t.name??t.preview)??n?.title,sessionTurnConfig:i?.sessionTurnConfig??(n?.sessionTurnConfig?CN(`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 SA(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=EN(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?CN(`claude`,n.sessionTurnConfig,{preserveReasoningEffort:wN(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=vN(e),n=vP([e.nativeSessionId,e.id]);for(let r of n)try{yN(`config.get.probe.begin`,{projectId:e.projectId,sessionId:e.id,threadId:r,...bN(e)});let n=await uk(r);if(!n){yN(`config.get.probe.empty`,{projectId:e.projectId,sessionId:e.id,threadId:r});continue}let i=n.sessionTurnConfig?xN(e.provider,e.sessionTurnConfig,n.sessionTurnConfig):e.sessionTurnConfig,a={...e,model:SN({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),yN(`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:bN(a)}),this.options.historyStore.getProjectSession(e.projectId,e.id)??a}catch(t){yN(`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`||!NN(e)||this.sessions.has(e.id)||e.nativeSessionId&&this.sessions.has(e.nativeSessionId))return!1;let t=vN(e),n=e.sessionTurnConfigUpdatedAt||``;if(!e.sessionTurnConfig||!DM(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 oT(e);if((await this.options.projectStore.upsertByPath(t)).id!==n.id)throw Error(`projectId (${e}) does not match cwd (${t})`);return await tF(n.path),n}if(e){let t=await this.options.projectStore.getById(e);if(!t)throw oT(e);return await tF(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);if(this.emitRawEnvelope(e,n),this.maybePersistUpdatedNativeSessionId(e),e.updatedAt=new Date().toISOString(),this.touchSession(e),n.type===`thread.title.updated`){let t=QP(n.title);t&&this.setSessionTitle(e,t);return}if(n.type===`turn.started`){e.status=`running`,this.persistSessionSnapshot(e);return}if(n.type===`turn.completed`||n.type===`turn.failed`){e.status=`idle`,this.persistSessionSnapshot(e),e.provider===`claude`&&this.closeRuntimeSession(e.id,`turn_terminal`);return}if(n.type===`error.runtime`){let t=QP(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`,this.persistSessionSnapshot(e),FN(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_${Xw(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_${Xw(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=bP(e);if(!i)return{rawEvents:n};try{let a=Date.now(),o=await CA({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 yN(`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`&&yP(i)&&await this.markExternalHistoryHydrated(e.id,e.updatedAt),yN(`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=ZN(n,(this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0))?.status===`running`),a=vP([e.nativeSessionId,e.id]);for(let o of a)try{let a=Date.now(),s=await lk(o,!0),c=Date.now(),l,u;if(e.source===`gateway`&&n.length>0)l=UP({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=NP({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n});r?(l=r,u=`native_tail_incremental`):(l=MP({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`)}else l=MP({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,eF(s.updatedAt),i),p=await this.patchObservedExternalSessionSummary(e,{updatedAt:eF(s.updatedAt),externallyRunning:e.source===`gateway`?ON(s,i):DN(s)});return yN(`sync-external.codex`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,threadStatus:s.status,threadUpdatedAt:eF(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`?ON(s,i):DN(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){yN(`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 yN(`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=VN(e.provider,t,n,i),s=Date.now(),c=await this.maybePersistSyncedExternalRawEvents(e,t,o,!0);return await this.markExternalHistoryHydrated(e.id,r),yN(`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=wN(n),a=t.sessionTurnConfig?xN(e.provider,n.sessionTurnConfig,t.sessionTurnConfig,{preserveReasoningEffort:i}):void 0,o=EN(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??SN({currentModel:n.model,observedModel:t.model,observedSessionTurnConfig:a}),sessionTurnConfig:r?.sessionTurnConfig??a??(n.sessionTurnConfig?CN(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 cT(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))}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,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=YP(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 BN=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]);function VN(e,t,n,r){if(e===`claude`)return UN(e,eP(t,n),n);if(e!==`codex`)return UN(e,t,n);if(t.length===0)return n.slice().sort((e,t)=>e.ts.localeCompare(t.ts));let i=r??ZN(t),a=HN(e,t.filter(e=>!qN(e))),o=iP(e),s=t.filter(t=>{if(XN(t,i))return!1;if(!qN(t))return!0;let n=aP(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=iP(e),f=iP(e),p=$N(t)??$N(n)??Date.now();for(let[t,n]of s.entries()){c.set(n.eventId,n),l.set(n.eventId,t);for(let t of aP(e,n,d))u.add(t)}for(let t of n){if(XN(t,i))continue;let n=aP(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(!WN(r,t))continue;let e=l.get(t.eventId),n=QN(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 HN(e,t){let n=new Map,r=iP(e);for(let i of t)for(let t of aP(e,i,r))n.set(t,(n.get(t)??0)+1);return n}function UN(e,t,n){let r=new Map,i=new Set,a=iP(e),o=iP(e);for(let n of t){r.set(n.eventId,n);for(let t of aP(e,n,a))i.add(t)}for(let t of n){let n=aP(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 WN(e,t){return GN(e)&&GN(t)}function GN(e){return e.type===`native.raw`?$(Q(e.payload.raw).source)===`codex.history.thread_read`:!1}function KN(e){return e===`codex.history.thread_read`||e===`codex.history.thread_read.incremental`}function qN(e){let t=Q(e.payload.raw),n=$(t.source);return t.historyReplay===!0||KN(n)}function JN(e){let t=Q(e.payload.raw),n=Q(t.item),r=Q(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=Q(t.message);if(i===`codex.app_server`){let e=$(a.method),t=Q(a.params);return e===`turn/started`||e===`turn/completed`||e===`turn/failed`||e===`turn/interrupted`?$(Q(t.turn).id)??$(t.turn_id)??$(t.turnId):e===`item/started`||e===`item/updated`||e===`item/completed`?$(t.turn_id)??$(t.turnId)??$(Q(t.item).turn_id)??$(Q(t.item).turnId):void 0}if(i!==`codex.history.thread_read`)return;let o=$(a.scope);if(o===`turn`)return $(Q(a.turn).id);if(o===`item`)return $(a.turn_id)??$(Q(a.item).turn_id)}function YN(e){let t=Q(e.payload.raw);if(e.type===`turn.completed`||e.type===`turn.failed`){let n=$(t.status)??(e.type===`turn.completed`?`completed`:`failed`);return n&&qP(n)?n:void 0}if(e.type!==`native.raw`)return;let n=$(t.source),r=Q(t.message);if(n===`codex.app_server`){let e=$(r.method);if(e!==`turn/completed`&&e!==`turn/failed`&&e!==`turn/interrupted`)return;let t=$(Q(Q(r.params).turn).status)??(e===`turn/completed`?`completed`:e===`turn/interrupted`?`interrupted`:`failed`);return t&&qP(t)?t:void 0}if(n!==`codex.history.thread_read`||$(r.scope)!==`turn`)return;let i=$(Q(r.turn).status);return i&&qP(i)?i:void 0}function XN(e,t){if(!qN(e))return!1;let n=JN(e),r=YN(e);return!n||!r?!1:JP(t.terminalTurnStatusById.get(n),r)}function ZN(e,t=!1){let n=new Set,r=new Map;for(let t of e){if(qN(t))continue;let e=JN(t);e&&n.add(e);let i=YN(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 QN(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function $N(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 eP(e,t){let n=tP(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=rP(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 tP(e){let t=new Map,n=new Map;for(let r of e){let e=nP(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 nP(e){let t=Date.parse(e.ts);if(!Number.isFinite(t))return;if(e.type===`item.completed`){let n=Q(Q(e.payload.raw).item);if($(n.type)!==`user_message`||$(n.source_event_type)!==`claude.synthetic.user_input`)return;let r=gP(n);return r?{text:r,tsMs:t,syntheticMessageId:QP(n.id)??QP(n.item_id)??QP(n.itemId)}:void 0}if(e.type!==`native.raw`)return;let n=Q(e.payload.raw);if($(n.source)!==`claude.synthetic.user_input`||($(n.native_type)??$(Q(n.message).type))!==`user`)return;let r=_P(Q(Q(n.message).message));if(r)return{text:r,tsMs:t,syntheticMessageId:QP(Q(n.message).uuid)}}function rP(e){if(e.type!==`native.raw`)return;let t=Date.parse(e.ts);if(!Number.isFinite(t))return;let n=Q(e.payload.raw),r=$(n.source);if(!r||!BN.has(r))return;let i=Q(n.message);if(($(n.native_type)??$(i.type))!==`user`)return;let a=_P(Q(i.message));if(a)return{text:a,tsMs:t}}function iP(e){if(e===`codex`)return{codexTurnScopedItemOccurrences:new Map}}function aP(e,t,n){return e===`codex`?oP(t,n):e===`claude`?fP(t):[]}function oP(e,t){let n=Q(e.payload.raw),r=new Set,i=pP(e.type,n);if(i){let a=sP(e.type,n);a?r.add(uP(a,t,n)):r.add(i)}if(e.type!==`native.raw`)return[...r];let a=$(n.source);if(a===`codex.app_server`){let e=Q(n.message),i=$(e.method),a=Q(e.params);if(i===`turn/started`)return r.add(mP(`turn.started`,{turn:Q(a.turn)})),[...r];if(i===`turn/completed`)return r.add(mP(`turn.completed`,{status:`completed`,turn:Q(a.turn)})),[...r];if(i===`turn/failed`||i===`turn/interrupted`)return r.add(mP(`turn.failed`,{status:i===`turn/interrupted`?`interrupted`:`failed`,turn:Q(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)??$(Q(a.item).turn_id),item:Q(a.item)},o=sP(e,n);return o?r.add(uP(o,t,n)):r.add(mP(e,n)),[...r]}return[...r]}if(a!==`codex.history.thread_read`)return[...r];let o=Q(n.message),s=$(o.scope);if(s===`thread`){let e=Q(o.thread),t=$(e.id);t&&r.add(mP(`thread.started`,{thread_id:t,thread:e}));let n=XP(hP(e.preview)??hP(e.name)??``);return n&&r.add(mP(`thread.title.updated`,{title:n,thread_id:t})),[...r]}if(s===`turn`){let e=Q(o.turn),t=$(e.status);return r.add(mP(`turn.started`,{turn:e})),t===`completed`?r.add(mP(`turn.completed`,{status:t,turn:e})):(t===`failed`||t===`interrupted`)&&r.add(mP(`turn.failed`,{status:t,turn:e})),[...r]}if(s===`item`){let e={turn_id:$(o.turn_id)??$(Q(o.item).turn_id),item:Q(o.item),...o.semantic_occurrence===void 0?{}:{semantic_occurrence:o.semantic_occurrence}},n=sP(`item.completed`,e);return n?r.add(uP(n,t,e)):r.add(mP(`item.completed`,e)),[...r]}return[...r]}function sP(e,t){if(!e.startsWith(`item.`))return;let n=Q(t.item),r=$(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId),i=cP($(n.type));if(!(!r||!i))return[`codex`,e,r,i,lP(i,$(n.phase)),$(n.status)??``,OP($(n.command)),OP(gP(n))].join(`|`)}function cP(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 lP(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function uP(e,t,n){let r=dP(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 dP(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 fP(e){let t=Q(e.payload.raw),n=pP(e.type,t);if(n)return[n];if(e.type!==`native.raw`)return[];let r=$(t.source);if(!r||!BN.has(r))return[];let i=Q(t.message),a=$(t.native_type)??$(i.type),o=Q(i.message);if(a===`user`){let e=_P(o),t=$(i.uuid);return!e||!t?[]:[mP(`item.completed`,{item:{id:t,type:`user_message`,text:e}})]}if(a===`assistant`){let e=_P(o),t=$(o.id)??$(i.uuid);return!e||!t?[]:[mP(`item.completed`,{item:{id:t,type:`agent_message`,text:e}})]}return[]}function pP(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 mP(e,t);default:return}}function mP(e,t){let n=Q(t.item),r=Q(t.turn),i=Q(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=OP($(n.command)),p=OP(gP(n)),m=OP(hP(t.message)),h=OP(hP(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 Q(e){return typeof e==`object`&&e?e:{}}function $(e){return typeof e==`string`&&e.trim()||void 0}function hP(e){if(typeof e==`string`)return e.length>0?e:void 0}function gP(e){let t=hP(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=hP(Q(t).text);n&&e.push(n)}if(e.length>0)return e.join(`
523
- `)}let r=Array.isArray(e.summary)?e.summary:[];if(r.length>0){let e=r.map(e=>hP(e)).filter(e=>!!e);if(e.length>0)return e.join(`
524
- `)}return``}function _P(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=Q(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(`
525
- `)}function vP(e){let t=new Set;for(let n of e)n&&t.add(n);return[...t]}function yP(e){return String(e).includes(`returned no messages from getSessionMessages`)}function bP(e){return MN(e)}function xP(e){return e?{rawSeq:e.rawSeq,type:e.type,eventId:e.eventId,ts:e.ts}:null}function SP(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(!CP(n,i))return r}return e.length===t.length?null:n}function CP(e,t){return EP(wP(e))===EP(wP(t))}function wP(e){let{ts:t,...n}=e;return n}function TP(e){if(typeof e==`string`)return DP(e);if(Array.isArray(e))return e.map(e=>TP(e));if(!e||typeof e!=`object`)return e;let t=e,n={};for(let e of Object.keys(t).sort())n[e]=TP(t[e]);return n}function EP(e){return JSON.stringify(TP(e))}function DP(e){return e.length<=4096?e:{__type:`hashed_text`,length:e.length,sha256:(0,l.createHash)(`sha256`).update(e).digest(`hex`)}}function OP(e){if(!e)return``;let t=DP(e);return typeof t==`string`?t:`sha256:${t.length}:${t.sha256}`}function kP(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 AP(e){let t=e.previousEvents[e.previousEvents.length-1]?.rawSeq??null,n=e.nextEvents[e.nextEvents.length-1]?.rawSeq??null,r=SP(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:kP(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:xP(r===null?void 0:e.previousEvents[r]),nextMismatchEvent:xP(r===null?void 0:e.nextEvents[r])}}function jP(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&&CP(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&&CP(e,r)})?{historyUpdated:!0,refreshMode:`delta`,fromRawSeq:n??0,toRawSeq:r??n??0}:{historyUpdated:!0,refreshMode:`snapshot`,...r===void 0?{}:{toRawSeq:r}}}function MP(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:HP(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);(qP(t.status)?!JP(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,QP(n.id)??null])}return t}function NP(e){let t=PP(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($N(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:HP(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,QP(t.id)??null]);continue}let a=n!==c,o=IP(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,QP(t.id)??null])}}return r}function PP(e){let t={hasHistoryReplay:!1,hasThreadEnvelope:!1,turnOrder:[],turnsById:new Map};for(let n of e){if(n.type!==`native.raw`)continue;let e=Q(n.payload.raw);if($(e.source)!==`codex.history.thread_read`)continue;let r=Q(e.message),i=$(r.scope);if(t.hasHistoryReplay=!0,i===`thread`){t.hasThreadEnvelope=!0;continue}if(i===`turn`){let e=Q(r.turn),n=$(e.id);if(!n)continue;let i=FP(t,n),a=$(e.status);a&&(i.status=a),i.fingerprint=BP(e);continue}if(i!==`item`)continue;let a=Q(r.item),o=$(r.turn_id)??$(a.turn_id);if(!o)continue;let s=FP(t,o),c=LP(o,a,void 0,s.itemOccurrenceByBaseKey);c&&(s.itemFingerprintByKey.has(c)||s.itemOrder.push(c),s.itemFingerprintByKey.set(c,zP(a)))}return t}function FP(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 IP(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||LP(t.id,a,r,n)!==i||e.itemFingerprintByKey.get(i)!==zP(a))return{safe:!1,appendedItems:[],statusChanged:!1}}return e.fingerprint!==void 0&&e.fingerprint!==BP(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 LP(e,t,n,r){let i=RP(e,t,n);if(!i)return;let a=dP(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 RP(e,t,n){let r=sP(`item.completed`,{turn_id:e,item:t});if(r)return r;let i=QP(t.id);if(i)return`id:${i}`;if(n!==void 0)return`${e}::${n}`}function zP(e){let t=cP($(e.type)),n=t?lP(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),EP(r)}function BP(e){return EP({status:$(e.status)??null,error:Q(e.error)})}function VP(e){return String(e??``).replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)}function HP(e,t,n){let r=n.map(VP).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 UP(e){let t=e.localCodexLiveTurnState??ZN(e.localEvents),n=new Set,r=WP(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=Q(t.payload.raw),s=$(r.source),c=s===`codex.history.thread_read.incremental`;if(t.type===`turn.started`){let e=$(r.turn_id)??$(Q(r.turn).id);e&&!c&&n.add(e);continue}if(t.type===`turn.completed`||t.type===`turn.failed`){let e=$(r.turn_id)??$(Q(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=Q(r.message),t=Q(e.params),i=$(e.method),a=$(Q(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=Q(r.message);if($(l.scope)===`turn`){let e=Q(l.turn),t=$(e.id);if(!t)continue;let n=$(e.status);n&&qP(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=JP(s,a.status);(!(n.has(a.id)||t.activeTurnIds.has(a.id))&&!c||qP(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=LP(a.id,t,void 0,l);if(i&&r.has(i))continue;let s=i?GP(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 WP(e){let t=new Set,n=new Map;for(let r of e){let e=KP(r);if(!e)continue;let i=LP(e.turnId,e.item,void 0,n);i&&t.add(i)}return t}function GP(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 KP(e){let t=Q(e.payload.raw);if(e.type===`item.completed`){let e=Q(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=Q(t.message);if($(e.method)!==`item/completed`)return null;let n=Q(e.params),r=Q(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=Q(t.message);if($(e.scope)!==`item`)return null;let n={...Q(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 qP(e){return e===`completed`||e===`failed`||e===`interrupted`}function JP(e,t){return e===t&&qP(t)}function YP(e){let t=e.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g,``).replace(/\s+/g,` `).trim();if(t)return t}function XP(e,t=60){let n=YP(e);if(!n)return;let r=Array.from(n);return r.length<=t?n:r.slice(0,t).join(``).trimEnd()}function ZP(e,t){if(t){let e=XP(t);if(e)return e}if(e.provider!==`codex`||!e.codex)return XP(`代码审查`);let n=e.codex.target;return n.type===`baseBranch`?XP(`审查 ${n.branch} 分支改动`):n.type===`custom`?XP(n.instructions):n.type===`commit`?XP(n.title||`审查提交 ${n.sha.slice(0,12)}`):XP(`审查未提交更改`)}function QP(e){if(typeof e!=`string`)return;let t=YP(e);if(t)return t}function $P(e){let t=0;for(let n of Object.values(e))n.some(e=>e.trim().length>0)&&(t+=1);return t}function eF(e){return!Number.isFinite(e)||e<=0?new Date().toISOString():new Date(e*1e3).toISOString()}async function tF(e){if(!(await d.default.stat(e)).isDirectory())throw Error(`Project path is not a directory: ${e}`)}var nF=class{indexPath;eventsDir;sessions=new Map;rawEventsCacheBySession=new Map;compactedRawEventsCacheBySession=new Map;pendingRawMutationsBySession=new Map;ready;writeQueue=Promise.resolve();constructor(e){this.baseDir=e,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}async flushRawCompactions(e){await this.ready}async shutdown(){await this.ready}async upsertSession(e){await this.ready;let t=rF(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,rF({...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)&&(wF(t)||await this.enqueueRawSessionWrite(t.sessionId,async()=>{if(gF(t)){let e=CF([...await this.readSessionRawEventsLocked(t.sessionId),t]);await this.replaceRawEventFile(t.sessionId,e),this.rawEventsCacheBySession.set(t.sessionId,e),this.compactedRawEventsCacheBySession.set(t.sessionId,uF(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=_F(await this.readSessionRawEventsLocked(e),r,n);await this.replaceRawEventFile(e,t);let a=uF(t);i=dF(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){if(await this.ready,!this.sessions.has(e))return[];let n=Math.max(1,t),r=this.readSessionRawEventsFromCache(e);if(r!==void 0)return r.slice(-n);let i=[];return await this.enqueueWrite(async()=>{i=(await this.readSessionRawEventsLocked(e)).slice(-n)}),i}async getSessionRawEventsCompacted(e,t=300){return(await this.getSessionRawEventsCompactedWithCoverage(e,t)).rawEvents}async getSessionRawEventsCompactedWithCoverage(e,t=300){if(await this.ready,!this.sessions.has(e))return{rawEvents:[],coveredToRawSeq:null};let n=Math.max(1,t),r=this.readSessionRawEventsCompactedWithCoverageFromCache(e);if(r!==void 0)return cF(r,n);let i={rawEvents:[],coveredToRawSeq:null};return await this.enqueueWrite(async()=>{i=cF(await this.readSessionRawEventsCompactedWithCoverageLocked(e),n)}),i}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 wm(i.filter(e=>e.rawSeq>t)).slice(0,r);let a=[];return await this.enqueueWrite(async()=>{a=wm((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 sF(t);let n=null;return await this.enqueueWrite(async()=>{n=sF(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=`${oF(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=>oF(e)).join(`
526
- `);await lF(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(hF(e)){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}if(n&&mF(e,n)<0){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}pF(r,e)}}async readSessionRawEventsCompactedLocked(e){return(await this.readSessionRawEventsCompactedWithCoverageLocked(e)).rawEvents}async readSessionRawEventsCompactedWithCoverageLocked(e){let t=this.compactedRawEventsCacheBySession.get(e);if(t)return fF(t);let n=uF(await this.readSessionRawEventsLocked(e));return this.compactedRawEventsCacheBySession.set(e,n),fF(n)}async readSessionRawEventsLocked(e){let t=this.rawEventsCacheBySession.get(e);if(t)return t;let n=p.default.join(this.eventsDir,`${e}.raw.jsonl`),r;try{r=await d.default.readFile(n,`utf8`)}catch(t){if(t.code===`ENOENT`)return this.rawEventsCacheBySession.set(e,[]),[];throw t}let i=r.split(`
527
- `).map(e=>e.trim()).filter(Boolean),a=[];for(let e of i)try{let t=JSON.parse(e);if(!iF(t)||t.kind!==`provider.raw`)continue;let n=aF(t.rawSeq);a.push({value:t,...n===void 0?{}:{rawSeq:n}})}catch{}if(a.length===0)return this.rawEventsCacheBySession.set(e,[]),[];let o=a.some(e=>e.rawSeq===void 0),s=a.map((e,t)=>({...e.value,rawSeq:e.rawSeq??t+1})),c=[];for(let t of s){let n=Pl.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.`);c.push(t)}}if(o){let e=c.map(e=>oF(e)).join(`
528
- `),t=e?`${e}\n`:``;await d.default.writeFile(n,t,`utf8`)}return this.rawEventsCacheBySession.set(e,c),c}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 fF(t);let n=this.rawEventsCacheBySession.get(e);if(!n)return;let r=uF(n);return this.compactedRawEventsCacheBySession.set(e,r),fF(r)}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 rF(e){let t=e.projectPath?.trim()||e.projectId;return t===e.projectId?e:{...e,projectId:t}}function iF(e){return typeof e==`object`&&!!e}function aF(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<=0))return e}function oF(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 sF(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 cF(e,t){return{rawEvents:e.rawEvents.slice(-Math.max(1,t)),coveredToRawSeq:e.coveredToRawSeq}}async function lF(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 uF(e){let t=Cm(e),n=t.map(e=>e),r=new Map;for(let[e,t]of n.entries()){let n=Em(t);n&&r.set(n.key,e)}return{slots:n,indexByKey:r,dense:t,coveredToRawSeq:sF(e)?.max??null}}function dF(e){return e.dense||=e.slots.filter(e=>e!==null),e.dense}function fF(e){return{rawEvents:dF(e),coveredToRawSeq:e.coveredToRawSeq}}function pF(e,t){e.coveredToRawSeq=e.coveredToRawSeq===null?t.rawSeq:Math.max(e.coveredToRawSeq,t.rawSeq);let n=Em(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=Dm(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 mF(e,t){let n=e.ts.localeCompare(t.ts);return n===0?e.eventId.localeCompare(t.eventId):n}function hF(e){if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=iF(e.payload.raw)?e.payload.raw:{},n=iF(t.message)?t.message:{};return(typeof n.method==`string`?n.method:typeof t.method==`string`?t.method:``)===`item/completed`}function gF(e){if(hF(e)||e.type===`turn.completed`||e.type===`turn.failed`)return!0;if(e.type!==`native.raw`)return!1;let t=iF(e.payload.raw)?e.payload.raw:{},n=iF(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 _F(e,t,n){if(n?.replaceMissing)return vF(e,t,n);let r=[...e].sort(SF),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&&yF(n,e)&&(r[t]=xF(n,e));continue}let n={...e,rawSeq:a};a+=1,i.set(n.eventId,r.length),r.push(n)}return CF(r.sort(SF)).sort(SF)}function vF(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(SF),c=1;for(let t of e)c=Math.max(c,t.rawSeq+1);return CF(s.map(e=>{let t=r.get(e.eventId);if(t)return yF(t,e)?xF(t,e):{...e,rawSeq:t.rawSeq};let n={...e,rawSeq:c};return c+=1,n})).sort(SF)}function yF(e,t){return bF(e)&&bF(t)}function bF(e){return e.type===`native.raw`?kF((iF(e.payload.raw)?e.payload.raw:{}).source)===`codex.history.thread_read`:!1}function xF(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function SF(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 CF(e){let t=Tm(e).filter(e=>!wF(e)),n=new Set;for(let e of t){let t=TF(e);t&&n.add(t)}return n.size===0?t:t.filter(e=>{let t=EF(e);return!t||!n.has(t)})}function wF(e){let t=iF(e.payload.raw)?e.payload.raw:{},n=kF(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=iF(t.message)?t.message:{};return kF(r.method)??kF(t.method)?!1:iF((iF(r.result)?r.result:{}).turn)}function TF(e){if(e.type===`item.completed`){let t=iF(e.payload.raw)?e.payload.raw:{},n=iF(t.item)?t.item:{};return DF(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=iF(e.payload.raw)?e.payload.raw:{},n=iF(t.message)?t.message:{},r=iF(n.params)?n.params:{};if((kF(n.method)??kF(t.method))!==`item/completed`)return null;let i=iF(r.item)?r.item:{};return DF(e.sessionId,i)}function EF(e){if(e.type===`item.updated`){let t=iF(e.payload.raw)?e.payload.raw:{},n=iF(t.item)?t.item:{},r=kF(n.original_method)??kF(n.originalMethod)??``,i=iF(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`)&&!OF(r)?null:DF(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=iF(e.payload.raw)?e.payload.raw:{},n=iF(t.message)?t.message:{},r=iF(n.params)?n.params:{};if(!OF(kF(n.method)??kF(t.method)??``))return null;let i=iF(r.msg)?r.msg:{},a=kF(r.itemId)??kF(r.item_id)??kF(i.itemId)??kF(i.item_id);return a?`${e.sessionId}|${a}`:null}function DF(e,t){let n=kF(t.id)??kF(t.item_id)??kF(t.itemId);return n?`${e}|${n}`:null}function OF(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function kF(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function AF(e){return!e||e.providerMode!==`native`?!1:e.interactionLockReason===`external_turn_running`?!0:e.status!==`running`}const jF=e=>e.filter(e=>!(e.kind===`system`&&e.title===`Turn Usage`)),MF=(e,t)=>e.find(e=>e.itemId===t||e.id===t)??null,NF=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,PF=e=>{let t=jF(Hp(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 FF(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=MF(PF({sessionId:e.sessionId,rawEvents:t}).timelineItems,e.itemId);return n?{item:n}:null}function IF(e,t){if(e&&e!==t)throw rT()}async function LF(e){let t=RF(e.authService,e.refreshToken);e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:zF(t)},`auth refresh attempt`);try{let t=await e.execute(),n=RF(e.authService,e.refreshToken),r=RF(e.authService,t.refreshToken);return e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshedDeviceId:t.deviceId,previousRefreshToken:zF(n),nextRefreshToken:zF(r)},`auth refresh succeeded`),t}catch(t){let n=RF(e.authService,e.refreshToken);throw e.logger?.warn?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:zF(n),error:BF(t)},`auth refresh failed`),t}}function RF(e,t){return e.inspectRefreshToken?.(t)??{tokenRecordState:`missing`}}function zF(e){return{claimDeviceId:e.claimDeviceId??null,claimExpAt:e.claimExpAt??null,claimIssuedAt:e.claimIssuedAt??null,claimJtiSuffix:VF(e.claimJti),claimType:e.claimType??null,latestActiveTokenCreatedAt:e.latestActiveTokenCreatedAt??null,latestActiveTokenJtiSuffix:VF(e.latestActiveTokenJti),tokenRecordCreatedAt:e.tokenRecordCreatedAt??null,tokenRecordDeviceId:e.tokenRecordDeviceId??null,tokenRecordRevokedAt:e.tokenRecordRevokedAt??null,tokenRecordState:e.tokenRecordState}}function BF(e){return Qw(e)?{code:e.code,message:String(e),status:e.status}:e instanceof Error?{message:e.message,name:e.name}:{message:String(e)}}function VF(e){return e?e.slice(-8):null}function HF(e,t,n,r){if(!r)return t;let i={gatewayId:t.gatewayId,deviceId:t.deviceId,mobilePublicKey:r.publicKey,pairingContext:{pairingCode:UF(n),signedAt:new Date().toISOString()}};return{...t,gatewayIdentity:e.identity,pairingConfirmation:Xm(e.identity,e.privateKeyPem,i)}}function UF(e){return e.replace(/\s+/gu,``).toUpperCase()}async function WF(e,t){try{let n=Lf.parse(e);switch(n.method){case`auth.refresh`:{let e=await LF({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 IF(n.params.deviceId??t.relayDeviceId,e.deviceId),Rf.parse({method:n.method,result:e})}case`projects.list`:{let e=await t.sessionManager.listProjects();return Rf.parse({method:n.method,result:{projects:e}})}case`codex.accounts.get`:{let e=await t.sessionManager.getCodexAccounts();return Rf.parse({method:n.method,result:e})}case`codex.accounts.save`:{let e=await t.sessionManager.saveCurrentCodexAccount();return Rf.parse({method:n.method,result:e})}case`codex.accounts.switch`:{let e=await t.sessionManager.switchCodexAccount(n.params.accountId);return Rf.parse({method:n.method,result:e})}case`codex.accounts.delete`:{let e=await t.sessionManager.deleteSavedCodexAccount(n.params.accountId);return Rf.parse({method:n.method,result:e})}case`gateway.settings.get`:return Rf.parse({method:n.method,result:t.gatewaySettings.get()});case`gateway.settings.update`:{let e=await t.gatewaySettings.update(n.params);return Rf.parse({method:n.method,result:e})}case`gateway.update.get`:{let e=await t.updateService.getOrCheckInfo(`mobile`);return Rf.parse({method:n.method,result:e})}case`codex.appServer.restart`:{let e=await t.sessionManager.restartCodexAppServer();return Rf.parse({method:n.method,result:e})}case`gateway.update.apply`:{let e=await t.updateService.applyUpdate(n.params.requestedBy??`mobile`);return Rf.parse({method:n.method,result:e})}case`projects.discovery.get`:{let e=await t.projectDiscoveryService.getProjects();return Rf.parse({method:n.method,result:e})}case`projects.discovery.refresh`:{let e=await t.projectDiscoveryService.refreshProjects();return Rf.parse({method:n.method,result:e})}case`projects.create`:{let e=await t.sessionManager.createProject({path:n.params.path,title:n.params.title});return Rf.parse({method:n.method,result:{project:e}})}case`projects.delete`:if(!await t.sessionManager.deleteProject(n.params.projectId))throw KF(n.method,`NOT_FOUND`,404,`Project not found`);return Rf.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 Rf.parse({method:n.method,result:e})}case`workspace.directories.create`:{let e=await t.fsService.createDirectoryUnrestricted(n.params.path,n.params.name,200);return Rf.parse({method:n.method,result:e})}case`workspace.entries.list`:{let e=await t.workspaceFileService.listEntries(n.params.locator,n.params.limit??200);return Rf.parse({method:n.method,result:e})}case`workspace.files.resolve`:{let e=await t.workspaceFileService.resolveFile(n.params.locator);return Rf.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 Rf.parse({method:n.method,result:e})}case`workspace.files.preparePreview`:{let e=t.relayPreviewBaseUrl?.trim(),r=t.gatewayId?.trim();if(!e||!r)throw KF(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 Rf.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 Rf.parse({method:n.method,result:{sessions:e}})}case`sessions.discovery.list`:{let e=await t.projectDiscoveryService.listProjectSessions(n.params.projectPath);return Rf.parse({method:n.method,result:e})}case`sessions.get`:{let e=await t.sessionManager.getProjectSessionSummary(n.params.projectId,n.params.sessionId);if(!e)throw KF(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return Rf.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 KF(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return Rf.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}),Rf.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 Rf.parse({method:n.method,result:r})}case`sessions.readableItem.get`:{let e=await FF({sessionManager:t.sessionManager,readableItemDetailLookup:t.readableItemDetailLookup,projectId:n.params.projectId,sessionId:n.params.sessionId,itemId:n.params.itemId});if(!e)throw KF(n.method,`NOT_FOUND`,404,`Readable item ${n.params.itemId} not found`);return Rf.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`),Rf.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 Rf.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 Rf.parse({method:n.method,result:e})}case`devices.list`:return Rf.parse({method:n.method,result:{devices:t.authService.listDevices()}});case`devices.revoke`:if(!await t.authService.revokeDevice(n.params.deviceId))throw KF(n.method,`NOT_FOUND`,404,`Device ${n.params.deviceId} not found`);return Rf.parse({method:n.method,result:{revoked:!0}});default:{let e=n;throw KF(void 0,`INTERNAL`,500,`Unhandled relay RPC method: ${JSON.stringify(e)}`)}}}catch(e){throw GF(e)}}function GF(e){if(Qw(e))switch(e.code){case`REFRESH_TOKEN_REVOKED`:case`DEVICE_REVOKED`:case`REFRESH_TOKEN_DEVICE_MISMATCH`:return KF(`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 KF(`NOT_FOUND`,e.status,String(e),e.details);case`SESSION_TURN_CONFLICT`:case`PROJECT_DELETE_CONFLICT`:case`CODEX_APP_SERVER_RESTART_CONFLICT`:return KF(`BAD_REQUEST`,e.status,String(e),e.details);default:return KF(e.status>=500?`INTERNAL`:`BAD_REQUEST`,e.status,String(e),e.details)}let t=Bf.safeParse(e);if(t.success)return t.data;let n=zf.safeParse(e);if(n.success)return KF(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 KF(t.code,t.status,t.message,t.details)}let r=String(e);return e instanceof Error&&e.name===`ZodError`?KF(`BAD_REQUEST`,400,r):qF(e)?KF(`UNAUTHORIZED`,401,r):JF(r)?KF(`BAD_REQUEST`,400,r):KF(`INTERNAL`,500,r)}function KF(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 Bf.parse({...o?{method:o}:{},code:s,status:c,message:l,...u===void 0?{}:{details:u}})}function qF(e){return Qw(e)&&(e.code===`REFRESH_TOKEN_REVOKED`||e.code===`DEVICE_REVOKED`||e.code===`REFRESH_TOKEN_DEVICE_MISMATCH`)||vT(e)}function JF(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 YF(e,t){return e.length===0?[]:t===void 0?[...e]:e.filter(e=>e.rawSeq>t)}function XF(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 ZF(e){return{baseRawEvents:Cm(e.rawEvents.filter(t=>t.rawSeq<=e.cursorRawSeq)),nextRawEvents:Cm(e.rawEvents)}}function QF(e,t){return t&&`kind`in t&&t.kind===`bootstrapping`?t:{kind:`bootstrapping`,sessionId:e,previousReadyState:t??null,queuedEnvelopes:[]}}function $F(e,t){let n=e.previousReadyState;if(!n)return{previousReadyState:null,nextReadyState:null,replayedEnvelopes:[]};let r=YF(e.queuedEnvelopes,XF(n)),i=n;for(let e of r)i=t(i,e);return{previousReadyState:n,nextReadyState:i,replayedEnvelopes:r}}function eI(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_${Xw(12)}`,ts:new Date().toISOString(),payload:{raw:{decision:e.decision,reason:e.reason,snapshotId:e.snapshotId,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}}}}function tI(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 nI(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 rI(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 iI(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_${Xw(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 aI(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 oI=1e3,sI=(e,t)=>`${e}::${t}`,cI=e=>e.purpose===`detail_view`&&e.bootstrapMode===`readable`,lI=e=>{let t=new Map;for(let n of e)t.set(n.sessionId,n);return[...t.values()]},uI=e=>{let t;for(let n of e)(t===void 0||n.rawSeq>t)&&(t=n.rawSeq);return t},dI=e=>e[e.length-1]?.rawSeq,fI=(e,t)=>{let n=uI(e);return t==null?n??null:n===void 0?t:Math.max(t,n)},pI=e=>fI(e.rawEvents,e.coveredToRawSeq)??void 0,mI=e=>{let t=fI(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]}},hI=e=>typeof e==`object`&&e?e:{},gI=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}},_I=e=>{if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=hI(n),r=gI(e,`id`),i=gI(e,`header`),a=gI(e,`question`);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=hI(e),n=gI(t,`label`);if(!n)return null;let r=gI(t,`description`)??n,i=gI(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},vI=(e,t)=>{let n=Vp(e,t),r=new Map,i=new Map;for(let e of n){if(e.type===`tool.permission.requested`){let t=hI(e.payload.raw),n=gI(t,`requestId`,`request_id`);if(!n)continue;let i=hI(t.rawParams??t.raw_params),a=hI(i.networkApprovalContext??i.network_approval_context);r.set(n,{requestId:n,sessionId:e.sessionId,...gI(t,`toolName`,`tool_name`)?{toolName:gI(t,`toolName`,`tool_name`)}:{},...gI(t,`reason`)?{reason:gI(t,`reason`)}:{},...gI(i,`command`)?{command:gI(i,`command`)}:{},...gI(i,`cwd`)?{cwd:gI(i,`cwd`)}:{},...gI(i,`grantRoot`,`grant_root`)?{grantRoot:gI(i,`grantRoot`,`grant_root`)}:{},...gI(a,`host`)?{networkHost:gI(a,`host`)}:{},...gI(a,`protocol`)?{networkProtocol:gI(a,`protocol`)}:{},...gI(t,`itemId`,`item_id`)?{itemId:gI(t,`itemId`,`item_id`)}:{},...gI(t,`turnId`,`turn_id`)?{turnId:gI(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`tool.permission.resolved`){let t=gI(hI(e.payload.raw),`requestId`,`request_id`);t&&r.delete(t);continue}if(e.type===`user.input.requested`){let t=hI(e.payload.raw),n=gI(t,`requestId`,`request_id`);if(!n)continue;i.set(n,{requestId:n,sessionId:e.sessionId,questions:_I(t.questions),...gI(t,`itemId`,`item_id`)?{itemId:gI(t,`itemId`,`item_id`)}:{},...gI(t,`turnId`,`turn_id`)?{turnId:gI(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`user.input.resolved`){let t=gI(hI(e.payload.raw),`requestId`,`request_id`);t&&i.delete(t)}}return{pendingApprovals:[...r.values()],pendingUserInputs:[...i.values()]}},yI=e=>{let t=e.rawEventsAlreadyMatchDetailTransport===!0?e.rawEvents:SI({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=e.target.purpose===`detail_view`?dl({provider:e.target.provider,rawEvents:t}):null,r=e.target.purpose===`detail_view`?jF(Hp(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`?vI(e.target.sessionId,t):{pendingApprovals:[],pendingUserInputs:[]};return{detailTransportRawEvents:t,contextUsage:n,timelineItems:i.timelineItems,pendingApprovals:a.pendingApprovals,pendingUserInputs:a.pendingUserInputs}},bI=e=>{let t=SI({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=yI({target:e.target,rawEvents:t,rawEventsAlreadyMatchDetailTransport:!0});return mI({target:e.target,rawEvents:e.rawEvents,coveredToRawSeq:e.coveredToRawSeq,detailTransportRawEvents:t,contextUsage:n.contextUsage,timelineItems:n.timelineItems,pendingApprovals:n.pendingApprovals,pendingUserInputs:n.pendingUserInputs})},xI=(e,t)=>{let n=AI(e.rawEvents,t),r=fI(n,pI(e)),i=SI({rawEvents:AI(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),a=yI({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}},SI=e=>{if(e.detailLevel!==`compact`||e.rawEvents.length===0)return e.rawEvents;let t=CI(e.rawEvents[0]?.sessionId??``,e.rawEvents);return WE(e.rawEvents,e.detailLevel,{preserveIncompleteCommandOutput:!0,additionalCompletedCommandItemKeys:t})},CI=(e,t)=>{if(!e||t.length===0)return new Set;let n=new Set,r=Hp(e,t,[]);for(let t of r){if(t.itemType!==`command_execution`||!t.itemId||t.status!==`completed`&&t.status!==`failed`)continue;let r=DI(e,t.itemId);r&&n.add(r)}return n},wI=e=>gI(e,`id`,`itemId`,`item_id`)??null,TI=e=>{if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`)return wI(hI(hI(e.payload.raw).item));if(e.type!==`native.raw`)return null;let t=hI(hI(e.payload.raw).message),n=hI(t.params),r=hI(n.item),i=hI(n.msg);return wI(r)??wI(hI(t.item))??gI(n,`itemId`,`item_id`)??gI(i,`itemId`,`item_id`)??null},EI=e=>{if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=hI(e.payload.raw);return(gI(hI(t.message),`method`)??gI(t,`method`))===`item/completed`},DI=(e,t)=>t?`${e}|${t}`:null,OI=e=>DI(e.sessionId,TI(e)),kI=e=>{let t=OI(e);if(t)return`item:${t}`;let n=Em(e);return n?`delta:${n.key}`:null},AI=(e,t)=>{let n=[...e],r=OI(t),i=kI(t),a=Em(t),o=t;if(i&&a)for(let e=n.length-1;e>=0;--e){let r=n[e];if(!r||kI(r)!==i||!Em(r))continue;let a=Dm(r,t);if(a){n[e]=null,o=a;break}}return n.push(o),!r||!EI(t)?n.filter(e=>e!==null):n.filter(e=>e!==null&&(e.eventId===o.eventId||OI(e)!==r||!Em(e)))},jI=e=>{let t=MI(e);if(!t)return null;let n=wI(t),r=hI(t.payload),i=gI(t,`output_delta`,`outputDelta`)??gI(r,`output_delta`,`outputDelta`);return!n||!i?null:{itemId:n,delta:i}},MI=e=>{if(e.type===`item.updated`){let t=hI(hI(e.payload.raw).item);return NI(t)?t:null}if(e.type!==`native.raw`)return null;let t=hI(e.payload.raw),n=hI(t.message);if((gI(n,`method`)??gI(t,`method`))!==`item/updated`)return null;let r=hI(hI(n.params).item);return NI(r)?r:null},NI=e=>{let t=gI(e,`type`);return t===`commandExecution`||t===`command_execution`},PI=e=>e.includes(`[compact history preview:`),FI=(e,t)=>{let n=jI(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`||PI(i.output))return null;let a=AI(e.rawEvents,t),o=SI({rawEvents:AI(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),s={...i,output:`${i.output}${n.delta}`},c=[...e.timelineItems];c[r]=s;let l=pI(e),u=fI(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}]}}},II=e=>Buffer.byteLength(JSON.stringify(nI(e)),`utf8`),LI=e=>{let t=Math.max(1,Math.floor(e.maxChunkBytes??524288)),n=[],r=(t,n)=>II({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},RI=(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)}},zI=(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)}},BI=(e,t,n,r)=>{let i={},a=Vp(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=gI(hI(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),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 VI(e){let t,n=e.previousState;for(let r of e.envelopes){let i=xI(n,r),a=BI(e.sessionId,r,n,i);a&&(t={...t??{},...a}),n=i}return t}const HI=e=>{if(!e)return{stateFound:!1};let t=uI(e.rawEvents),n=dI(e.rawEvents),r=pI(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}},UI=e=>e?e.kind===`ready`?HI(e):{stateFound:!0,kind:e.kind,sessionId:e.sessionId,queuedEnvelopeCount:e.queuedEnvelopes.length,previousReadyState:HI(e.previousReadyState)}:{stateFound:!1},WI=(e,t)=>{let n,r,i;try{n=Ec(e.previousState.timelineItems,e.nextState.timelineItems),r=RI(e.previousState.pendingApprovals,e.nextState.pendingApprovals),i=zI(e.previousState.pendingUserInputs,e.nextState.pendingUserInputs)}catch(n){throw t?.(`stream.readable.delta.build.error`,{sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,previousState:HI(e.previousState),nextState:HI(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=pI(e.nextState);return o===void 0?null:{provider:e.previousState.provider,sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,fromRawSeq:pI(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 GI(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,lastHydratedExternalUpdatedAt:e.lastHydratedExternalUpdatedAt??null}:{sessionFound:!1}}function KI(e){return e===`external_turn_running`?e:void 0}function qI(e){return{status:e.status,...e.updatedAt?{updatedAt:e.updatedAt}:{},...e.interactionLockReason?{interactionLockReason:e.interactionLockReason}:{}}}var JI=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=lI(t),i=new Set(r.map(e=>e.sessionId)),a=this.sessionHub.getSubscriptions(e);this.log(`stream.subscribe.received`,{clientId:e,replace:n,incomingSubscriptionCount:t.length,dedupedSubscriptionCount:r.length,subscriptions:r.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,r);for(let t of i)this.sessionHub.pauseSession(e,t);this.sessionHub.replaceSubscriptions(e,r,n),this.syncReadableLiveProjectionSubscriptions(e,a,r,n);try{for(let t of r)try{await this.syncSessionStreamSubscription(e,t)}catch(n){throw cI(t)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}}finally{for(let t of i)this.sessionHub.resumeSession(e,t)}};clearState=(e,t)=>{let n=sI(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:UI(r),hadPendingDelta:!!i,pendingDeltaFromRawSeq:i?pI(i.previousState)??null:null,pendingDeltaToRawSeq:i?pI(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?MF(t.timelineItems,e.itemId):null,r=n&&`deferredDetail`in n&&n.deferredDetail!==void 0;if(n&&!r){let r=NF(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?pI(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=PF({sessionId:e.sessionId,rawEvents:a}),s=this.seedReadableItemDetailCache({projectId:e.projectId,sessionId:e.sessionId,timelineItems:o.timelineItems}),c=MF(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(!cI(r))continue;let t=sI(n,e.sessionId),i=this.stateByClientSession.get(t);if(!i)continue;if(i.kind===`bootstrapping`){i.queuedEnvelopes.push(e);continue}let a=FI(i,e);if(a){this.flushPendingReadableLiveDelta(n,e.sessionId),this.stateByClientSession.set(t,a.nextState),this.sessionHub.sendSessionMessageToClient(n,e.sessionId,rI(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=xI(i,e);this.stateByClientSession.set(t,o);let s=BI(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 cI(r)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:n,sessionId:e.sessionId}),t}finally{this.sessionHub.resumeSession(n,e.sessionId)}}}};sendSessionSnapshot=async(e,t,n)=>{let r=`snap_${Xw(12)}`,{compactedRawEvents:i,detailTransportRawEvents:a,lastRawSeq:o,slimReadableProjection:s,pendingApprovals:c,pendingUserInputs:l}=await this.buildReadableSnapshotProjection(t),u=qI(t);this.sessionHub.sendStreamMessage(e,eI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,...o===void 0?{}:{toRawSeq:o}}));let d=aI(a,oI),f=t.purpose===`detail_view`?aI(s.timelineItems,oI):[],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:dI(i)??null,rawSeqOrderMismatch:o!==dI(i)});for(let n=0;n<m;n+=1){let i=d[n]??[],a=f[n]??[];this.sessionHub.sendStreamMessage(e,tI({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=`snap_${Xw(12)}`,i=this.startReadableLiveProjectionBootstrap({clientId:e,sessionId:t.sessionId});try{let{compactedRawEvents:a,detailTransportRawEvents:o,contextUsage:s,lastRawSeq:c,slimReadableProjection:l,pendingApprovals:u,pendingUserInputs:d}=await this.buildReadableSnapshotProjection(t),f=this.sessionHub.getSubscriptions(e).find(e=>e.sessionId===t.sessionId),p=f?.projectId?.trim()??``;if(!f||!cI(f)||p&&p!==t.projectId||(f.detailLevel??`full`)!==t.detailLevel){this.clearState(e,t.sessionId);return}let m=qI(t),h=mI({target:t,rawEvents:a,coveredToRawSeq:c,detailTransportRawEvents:o,contextUsage:s,timelineItems:l.timelineItems,pendingApprovals:u,pendingUserInputs:d}),g=this.stateByClientSession.get(i),_=YF(g?.kind===`bootstrapping`?g.queuedEnvelopes:[],c),v=VI({sessionId:t.sessionId,previousState:h,envelopes:_});for(let e of _)h=xI(h,e);let y={...m,...v??{}};this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:h.rawEvents,coveredToRawSeq:pI(h),detailTransportRawEvents:h.detailTransportRawEvents,contextUsage:h.contextUsage,timelineItems:h.timelineItems,pendingApprovals:h.pendingApprovals,pendingUserInputs:h.pendingUserInputs});let b=pI(h),x=dI(h.rawEvents);this.sessionHub.sendStreamMessage(e,eI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,...b===void 0?{}:{toRawSeq:b}}));let S=LI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,timelineItems:h.timelineItems,pendingApprovals:h.pendingApprovals,pendingUserInputs:h.pendingUserInputs,contextUsage:h.contextUsage,sessionSummary:y}),C=Math.max(S.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:r,snapshotFormat:`readable`,compactedEventCount:a.length,canonicalRawEventCount:h.rawEvents.length,detailTransportRawEventCount:h.detailTransportRawEvents.length,readableTimelineItemCount:h.timelineItems.length,bufferedReadableDeltaCount:_.length,readableChunkTargetBytes:524288,readableChunkItemCounts:S.map(e=>e.timelineItems.length),readableChunkEstimatedBytes:S.map(e=>e.estimatedByteLength),totalChunks:C,firstRawSeq:h.rawEvents[0]?.rawSeq??null,lastRawSeq:b??null,orderedLastRawSeq:x??null,rawSeqOrderMismatch:b!==x});for(let n=0;n<C;n+=1){let i=S[n];this.sessionHub.sendStreamMessage(e,nI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,chunkIndex:n,totalChunks:C,timelineItems:i?.timelineItems??[],pendingApprovals:n===0?h.pendingApprovals:void 0,pendingUserInputs:n===0?h.pendingUserInputs:void 0,contextUsage:n===0?h.contextUsage:void 0,sessionSummary:n===0?y:void 0}))}}catch(n){throw this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}};sendSessionReadableResumeDelta=async(e,t,n,r)=>{let i=sI(e,t.sessionId),a=await this.sessionManager.getProjectSessionRawEventsWithCoverage(t.projectId,t.sessionId,2**53-1),o=a.rawEvents,s=a.coveredToRawSeq,{baseRawEvents:c,nextRawEvents:l}=ZF({rawEvents:o,cursorRawSeq:n}),u=bI({target:t,rawEvents:c,coveredToRawSeq:n}),d=bI({target:t,rawEvents:l,coveredToRawSeq:Math.max(n,s??0)}),f=pI(d),p=this.stateByClientSession.get(i),m=YF(p?.kind===`bootstrapping`?p.queuedEnvelopes:[],f);for(let e of m)d=xI(d,e);let h=pI(u),g=dI(u.rawEvents),_=pI(d),v=dI(d.rawEvents),y=VI({sessionId:t.sessionId,previousState:u,envelopes:[...l.filter(e=>e.rawSeq>n),...m]});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:o.length,baseRawEventCount:c.length,nextRawEventCount:l.length,previousMaxRawSeq:h??null,previousOrderedLastRawSeq:g??null,nextMaxRawSeq:_??null,nextOrderedLastRawSeq:v??null,rawSeqOrderMismatch:h!==g||_!==v,bootstrapState:UI(p),bufferedEnvelopeCount:m.length,previousState:HI(u),nextState:HI(d),sessionSummaryKeys:y?Object.keys(y):[],sessionSummaryStatus:y?.status??null,sessionSummaryUpdatedAt:y?.updatedAt??null}),this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:d.rawEvents,coveredToRawSeq:pI(d),detailTransportRawEvents:d.detailTransportRawEvents,contextUsage:d.contextUsage,timelineItems:d.timelineItems,pendingApprovals:d.pendingApprovals,pendingUserInputs:d.pendingUserInputs});let b=pI(d)??n;this.sessionHub.sendStreamMessage(e,eI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`delta`,reason:r,fromRawSeq:n,...b===void 0?{}:{toRawSeq:b}}));let x=WI({previousState:u,nextState:d,sessionSummary:y},this.log);this.log(`stream.readable.resume.delta`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,reason:r,cursorRawSeq:n,emittedDelta:!!x,deltaFromRawSeq:x?.fromRawSeq??n,deltaToRawSeq:x?.toRawSeq??b??null,timelineUpsertCount:x?.timelineUpserts.length??0,timelineRemovalCount:x?.timelineRemovals.length??0,timelineTextDeltaPatchCount:x?.timelineTextDeltaPatches.length??0,pendingApprovalUpsertCount:x?.pendingApprovalUpserts.length??0,pendingUserInputUpsertCount:x?.pendingUserInputUpserts.length??0,sessionSummaryStatus:x?.sessionSummary?.status??null,sessionSummaryUpdatedAt:x?.sessionSummary?.updatedAt??null}),this.sessionHub.sendSessionMessageToClient(e,t.sessionId,rI(x??{provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,fromRawSeq:n,toRawSeq:b,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=NF(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=pI(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(cI).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)cI(t)||this.clearState(e,t.sessionId)}startReadableLiveProjectionBootstrap(e){let t=sI(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=QF(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:UI(n),clearedPendingDelta:!!r,carriedPendingEnvelopeCount:a.length}),t}getReadableDeliveredReadyState(e,t){let n=sI(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?YF(t.nextState.rawEvents,e?pI(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=pI(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=mI(e);this.stateByClientSession.set(sI(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:HI(t)})}primeReadableBootstrapForSubscriptions(e,t){for(let n of t)cI(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,eI({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 sT(n,t);let i={sessionId:t,projectId:n,provider:r.provider,status:r.status,updatedAt:r.updatedAt,interactionLockReason:KI(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:GI(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,interactionLockReason:KI(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:GI(i)}),a}async buildReadableSnapshotProjection(e){let t=await this.sessionManager.getProjectSessionRawEventsCompactedWithCoverage(e.projectId,e.sessionId,2**53-1),n=t.rawEvents,r=SI({rawEvents:n,detailLevel:e.detailLevel}),i=yI({target:e,rawEvents:r,rawEventsAlreadyMatchDetailTransport:!0}),a=fI(n,t.coveredToRawSeq)??void 0;return{compactedRawEvents:n,detailTransportRawEvents:r,contextUsage:i.contextUsage,lastRawSeq:a,slimReadableProjection:{timelineItems:i.timelineItems,consumedMessageIds:[]},pendingApprovals:i.pendingApprovals,pendingUserInputs:i.pendingUserInputs}}restoreReadableLiveProjectionAfterBootstrapFailure(e){let t=sI(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=$F(n,xI);if(!a.previousReadyState||!r||!cI(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:UI(n),currentSubscriptionFound:!!r,currentSubscriptionProjectId:i||null,currentSubscriptionDetailLevel:r?.detailLevel??null,previousReadyState:HI(a.previousReadyState),nextReadyState:HI(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:HI(a.nextReadyState)});return}let o=VI({sessionId:e.sessionId,previousState:a.previousReadyState,envelopes:a.replayedEnvelopes}),s=WI({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:HI(a.nextReadyState),emittedDelta:!1});return}this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:HI(a.nextReadyState),emittedDelta:!0,deltaFromRawSeq:s.fromRawSeq??null,deltaToRawSeq:s.toRawSeq}),this.sessionHub.sendSessionMessageToClient(e.clientId,a.previousReadyState.sessionId,rI(s))}sendReadableLiveDeltaNow(e){let t=WI({previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary},this.log);t&&this.sessionHub.sendSessionMessageToClient(e.clientId,e.previousState.sessionId,rI(t))}flushPendingReadableLiveDelta(e,t){let n=sI(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=sI(e.clientId,e.previousState.sessionId),n=this.pendingDeltaByClientSession.get(t);if(n){let t=YI({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 YI(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 XI(e){return e.sendProviderRaw?`relay_ws`:`direct_ws`}function ZI(e){let t=performance.now(),n=JSON.stringify(e);return{payload:n,byteLength:Buffer.byteLength(n),serializeDurationMs:Number((performance.now()-t).toFixed(3))}}function QI(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 $I=class{clients=new Map;clientIdsBySessionId=new Map;deliveryStateByClientSession=new Map;addClient(e,t){let n=`ws_${Xw(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??ZI(t),i=QI(t);return i&&Fj(`stream.snapshot.chunk.outbound`,{clientId:e.id,deviceId:e.deviceId,transport:XI(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 eL=1200,tL=process.env.NATIVE_SESSION_WATCH_DEBUG===`1`||process.env.EXPO_PUBLIC_NATIVE_SESSION_WATCH_DEBUG===`1`;var nL=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){tL&&(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){if(n.lastTriggeredAt=Date.now(),n.syncInFlight){n.rerunRequested=!0;return}n.syncInFlight=!0,n.rerunRequested=!1,n.lastSyncStartedAt=Date.now(),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 r=await this.options.sessionManager.getProjectSessionSummary(n.projectId,n.sessionId);if(!r||r.providerMode!==`native`||r.provider!==`codex`&&r.provider!==`claude`){this.logDebug(`sync.stop.unwatchable_summary`,{projectId:n.projectId,sessionId:n.sessionId,summarySource:r?.source,summaryProvider:r?.provider,summaryProviderMode:r?.providerMode,summaryStatus:r?.status}),this.stopState(e);return}if(n.provider=r.provider,!AF(r)){this.clearCatchupRetry(n,{resetAttempts:!0}),n.stableIdleSyncCount=0,this.logDebug(`sync.skip.gateway_live`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,summaryStatus:r.status,interactionLockReason:r.interactionLockReason,watchedPath:n.watchedPath,ownerClientCount:n.ownerClientIds.size});return}let i=await this.options.sessionManager.syncProjectSessionHistory(n.projectId,n.sessionId);n.lastSyncCompletedAt=Date.now(),this.applyWatchPath(n,i.nativeWatchPath);let a=n.lastObservedRawSeq,o=n.lastObservedRawEventCount,s=this.resolveObservedRawSeq(i),c=s>a||i.rawEvents.length>o;c?this.clearCatchupRetry(n,{resetAttempts:!0}):this.maybeScheduleWatchCatchupRetry(e,n,t,i,{previousObservedRawSeq:a,previousObservedRawEventCount:o,nextObservedRawSeq:s,nextObservedRawEventCount:i.rawEvents.length}),n.lastObservedRawSeq=Math.max(n.lastObservedRawSeq,s),n.lastObservedRawEventCount=Math.max(n.lastObservedRawEventCount,i.rawEvents.length),i.session.status!==`running`&&!i.historyUpdated?n.stableIdleSyncCount+=1:n.stableIdleSyncCount=0,this.logDebug(`sync.result`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,status:i.session.status,interactionLockReason:i.session.interactionLockReason,historyUpdated:i.historyUpdated,statusChanged:i.statusChanged,refreshMode:i.refreshMode,fromRawSeq:i.fromRawSeq,toRawSeq:i.toRawSeq,nativeWatchPath:i.nativeWatchPath,rawEventCount:i.rawEvents.length,cursorAdvanced:c,previousObservedRawSeq:a,previousObservedRawEventCount:o,nextObservedRawSeq:s,nextObservedRawEventCount:i.rawEvents.length,watchCatchupRetryCount:n.watchCatchupRetryCount,stableIdleSyncCount:n.stableIdleSyncCount});let l=rL(i.session),u=oL(l);if(i.historyUpdated||i.statusChanged||iL(t)&&sL(t,n.lastSentConfigSummary,u)){let e=this.options.createExternalUpdateMessage({provider:i.session.provider,sessionId:i.session.id,projectId:i.session.projectId,updatedAt:i.session.updatedAt,status:i.session.status,interactionLockReason:i.session.interactionLockReason,refreshMode:i.refreshMode,fromRawSeq:i.fromRawSeq,toRawSeq:i.toRawSeq,historyUpdated:i.historyUpdated,statusChanged:i.statusChanged,sessionSummary:l});for(let t of n.ownerClientIds)this.options.sendStreamMessage(t,e);u&&(n.lastSentConfigSummary=u)}i.historyUpdated&&await this.options.refreshDetailSessionSnapshots?.({projectId:n.projectId,sessionId:n.sessionId,reason:`external_history_updated`,refreshMode:i.refreshMode,fromRawSeq:i.fromRawSeq,toRawSeq:i.toRawSeq})}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:eL,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`)},eL))))}stateKey(e,t){return JSON.stringify([e,t])}};function rL(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 iL(e){return e===`lease_added`||e===`watch`||e===`watch_catchup`||e===`reconcile`||e===`rerun`}function aL(e){return!!(e&&Object.prototype.hasOwnProperty.call(e,`model`)||e?.sessionTurnConfig||e?.sessionTurnConfigUpdatedAt)}function oL(e){if(aL(e))return{...e&&Object.prototype.hasOwnProperty.call(e,`model`)?{model:e.model??null}:{},...e?.sessionTurnConfig?{sessionTurnConfig:e.sessionTurnConfig}:{},...e?.sessionTurnConfigUpdatedAt?{sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt}:{}}}function sL(e,t,n){return n?e===`lease_added`?!0:!cL(t,n):!1}function cL(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:lL(e.sessionTurnConfig,t.sessionTurnConfig)}function lL(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 uL=class{constructor(e){this.config=e}issue(e){let t=dL(e.sizeBytes??0),n=Vw.default.sign({sub:e.deviceId,type:`workspace_preview`,gatewayId:this.config.gatewayId,path:e.canonicalPath,disposition:e.disposition},this.config.accessSecret,{expiresIn:t}),r=Vw.default.decode(n);return{ticket:n,expiresAt:r?.exp?new Date(r.exp*1e3).toISOString():new Date().toISOString()}}getExpiresAt(e){let t=Vw.default.decode(e);return t?.exp?new Date(t.exp*1e3).toISOString():new Date().toISOString()}verify(e){let t;try{t=Vw.default.verify(e,this.config.accessSecret)}catch(e){if(e instanceof Error){if(e.name===`TokenExpiredError`)throw aT();if(e.name===`JsonWebTokenError`||e.name===`NotBeforeError`)throw iT()}throw e}if(t.type!==`workspace_preview`||t.gatewayId!==this.config.gatewayId)throw iT();return t}};function dL(e){return e>20971520?7200:600}var fL=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:mL(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:mL(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=pL(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=pL(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 oT(e);return t}};function pL(e){return e.split(p.default.sep).join(`/`)}function mL(e,t){return`${e}; filename="${t.replace(/["\\]/g,`_`)}"`}function hL(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 gL=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 _L=`[redacted:image-data]`;let vL=null;const yL={perMessageDeflate:{threshold:1024}},bL={globalDecompression:!1,threshold:1024,customTypes:/^text\/(?!event-stream)|(?:\+|\/)json(?:;|$)|(?:\+|\/)text(?:;|$)|(?:\+|\/)xml(?:;|$)/u},xL=4096;function SL(e){if(Array.isArray(e))return e.map(e=>SL(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`?_L:SL(r);return t}function CL(e,t){if(e)try{return JSON.stringify(SL(e))}catch{}return t.replace(/("(?:dataBase64|data_base64)"\s*:\s*")([^"]*)(")/gu,`$1${_L}$3`)}function wL(e){return p.default.join(p.default.dirname(e),`session-attachments`)}function TL(e,t){gL&&(console.log(`[native-watch][gateway]`,e,t),vL?.info({event:e,...t},`native session watch debug`))}function EL(e){return e?typeof e==`string`?e:e.toString(`utf8`):``}function DL(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 OL(e){let t=e.limit??300,n=e.detailLevel??`full`,r=(r,i)=>{Fj(`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:WE(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:WE(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:WE(o,n)};return r(s,{rangeMin:i.min,rangeMax:i.max,minExpectedCursor:a}),s}async function kL(e,t={}){await i_(e.gatewayLogPath);let n=jL(e,t),r=AL(e,n.instance);Pj(r.log),vL=r.log,await r.register(Uw.default,{origin:!0}),await r.register(Ww.default,bL),await r.register(Hw.default,{options:yL});let i=process.env.NODE_ENV!==`production`,a=4e3,o=`[unserializable payload]`,s=new yT(e);await s.init();let c=new kT(e.auditLogPath),l=new $I,u=new hE,d=new fD(e.projectStoreDir),f=new nF(e.sessionHistoryDir);await f.init();let m=new bj(p.default.join(e.sessionHistoryDir,`discovery-v1`));await m.init();let h=new sj({store:m});await h.init();let g,_=null,v=new Map,y=await qm(e.authStoreDir),b=new uL(e),x=e.relayEnabled?mg({relayUrl:e.relayUrl,gatewayHost:e.host}):``,S=e=>{let t=v.get(e);t&&(clearTimeout(t.timeout),v.delete(e),t.resolve())},C=(e,t)=>{let n=v.get(e);n&&(clearTimeout(n.timeout),v.delete(e),n.reject(t instanceof Error?t:Error(String(t))))},w=(e,t)=>new Promise((n,r)=>{C(e,Error(`Duplicate pending relay file upload start for request ${e}`));let i=setTimeout(()=>{v.delete(e),r(Error(`Relay file upload start timed out for request ${e}`))},t);v.set(e,{resolve:n,reject:r,timeout:i})}),T=new zN({preferNativeProviders:e.enableNativeProviders,requireNativeCodex:e.requireNativeCodex,auditLogger:c,projectStore:d,historyStore:f,logger:r.log,attachmentStoreDir:wL(e.sessionHistoryDir),runtimeLifecycle:{idleTtlMs:e.runtimeIdleTtlMs,sweepIntervalMs:e.runtimeSweepIntervalMs,maxSessions:e.runtimeMaxSessions,maxCodexSessions:e.runtimeMaxCodexSessions,maxClaudeSessions:e.runtimeMaxClaudeSessions},onEnvelope:e=>{l.routeProviderRaw(e),D.routeReadableLiveDelta(e)}}),E=new fL({fsService:u,sessionManager:T,previewTicketService:b}),D=new JI(l,T,e.readableLiveDeltaCoalesceMs,Fj),O=new nL({sessionManager:T,logger:r.log,sendStreamMessage:(e,t)=>{l.sendStreamMessage(e,t)},createExternalUpdateMessage:e=>iI(e),refreshDetailSessionSnapshots:e=>D.refreshDetailSessionSnapshots(e)});T.warmStartupProviderCapabilities().catch(e=>{r.log.warn({err:e},`startup provider capability warmup failed`)});let k=new Cg({packageName:z.packageName,currentVersion:z.version,sessionHub:l,logger:r.log,consoleWrite:e=>{console.log(e)},getRunningSessionCount:async()=>T.getRunningRuntimeSessionCount(),requestPreparedUpdate:t.onUpdatePrepared});r.addHook(`onClose`,async()=>{r.log.info({hasRelayClient:!!_},`gateway shutdown starting`);try{D.shutdown(),O.close(),_?.close(),M.close(),await k.shutdown(),await T.shutdown(),await f.shutdown();for(let[e,t]of v.entries())clearTimeout(t.timeout),t.reject(Error(`Gateway shutting down`)),v.delete(e);r.log.info(`gateway shutdown completed`)}catch(e){throw r.log.error({err:e},`gateway shutdown failed`),e}finally{Pj(null),vL=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:$m(),gatewayIdentity:y.identity})),r.get(`/api/pairing/descriptor`,async()=>og({gatewayId:e.gatewayId,gatewayName:e.name,machineName:$m(),relayBaseUrl:x,directBaseUrls:fg({protocol:e.httpsEnabled?`https`:`http`,host:e.host,port:e.httpsEnabled?e.httpsPort:e.port}),relayTransportSecurityLevel:e.relayEnabled?e.relayTransportSecurityLevel:void 0,gatewayIdentity:y.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=Gl.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}}),HF(y,{...n,gatewayName:e.name,machineName:$m()},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=Jl.safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await LF({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 A=()=>Rd.parse({name:e.name,machineName:$m()}),j=async n=>{let r=Rd.pick({name:!0}).parse(n);if(!t.configPath)throw Error(`Gateway config path is unavailable`);return e.name=await mh(t.configPath,r.name),A()};r.get(`/api/gateway/settings`,async(e,t)=>{if(ne(e,t))return A()}),r.post(`/api/gateway/settings`,async(e,t)=>{if(!ne(e,t))return;let n=Rd.pick({name:!0}).safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await j(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 T.listProjects()}}),r.get(`/api/gateway/update`,async(e,t)=>{if(ne(e,t))try{return await k.getOrCheckInfo(`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=xd.safeParse(n?.requestedBy);try{let e=await k.applyUpdate(r.success?r.data:`mobile`);return Ed.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 iu.parse(await T.restartCodexAppServer())}catch(e){let n=Qw(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 eu.parse(await T.getCodexAccounts())}catch(e){return re(t,e)}}),r.post(`/api/codex/accounts/save`,async(e,t)=>{if(ne(e,t))try{return tu.parse(await T.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 nu.parse(await T.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 ru.parse(await T.deleteSavedCodexAccount(n.accountId))}catch(e){return re(t,e)}}),r.get(`/api/discovery/projects`,async(e,t)=>{if(ne(e,t))try{return await h.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 h.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 h.listProjectSessions(n.projectPath)}catch(e){let n=e instanceof Error?e.message:String(e);return Qw(e)&&e.code===`DISCOVERED_PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):JF(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 E.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 E.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 E.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 E.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 E.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 T.getProviderCapabilities(n.provider,n.projectId,n.agentVersion)}}catch(e){return Qw(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 T.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 T.getAgentConfig(n.provider,{projectId:n.projectId,agentVersion:n.agentVersion})}catch(e){return Qw(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 T.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 T.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 T.listProjectSessions(n.projectId,i,{syncExternal:a})}}catch(e){return Qw(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 T.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 T.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 T.syncProjectSessionHistory(n.projectId,n.sessionId);return e.historyUpdated&&await D.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 Qw(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=Gc.safeParse(r.detailLevel).success?Gc.parse(r.detailLevel):`full`;try{return await I(n.projectId,n.sessionId,i,typeof a==`number`&&Number.isFinite(a)?Math.max(0,Math.floor(a)):void 0,o,`http`)}catch(e){return Qw(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 FF({sessionManager:T,readableItemDetailLookup:D,projectId:n.projectId,sessionId:n.sessionId,itemId:n.itemId})||t.code(404).send({error:`Readable item not found`})}catch(e){return Qw(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 T.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 P(al(e),i.sub,a)}catch(e){await F({deviceId:i.sub,clientId:a,rawCommand:CL(n,t),parsedInput:n,error:e})}}),e.on(`close`,(e,t)=>{let n=l.getSubscriptions(a),o=O.getClientWatchTargets(a);r.log.info({clientId:a,deviceId:i.sub,transport:`direct`,closeCode:typeof e==`number`?e:null,closeReason:EL(t),streamSubscriptionCount:n.length,streamSubscriptions:n.map(DL),externalWatchTargetCount:o.length,externalWatchTargets:o},`gateway websocket client disconnected`),O.removeClient(a),l.removeClient(a),D.clearStatesForClient(a)})});let M=new Rj({gatewayId:e.gatewayId,relayTransportSecurityLevel:e.relayEnabled?e.relayTransportSecurityLevel:`plaintext-relay`,gatewayIdentity:y.identity,gatewayIdentityPrivateKeyPem:y.privateKeyPem,sessionHub:l,logger:r.log,describeClientState:e=>{let t=l.getSubscriptions(e),n=O.getClientWatchTargets(e);return{streamSubscriptionCount:t.length,streamSubscriptions:t.map(DL),externalWatchTargetCount:n.length,externalWatchTargets:n}},handlePairingClaim:async t=>{let n=he(t.deviceName);return HF(y,{...await s.claimPairingCode(t.code,n,t.deviceIdentity),gatewayName:e.name,machineName:$m()},t.code,t.deviceIdentity)},handleRefresh:async t=>{let n=await LF({authService:s,execute:()=>s.refreshAccessToken(t.refreshToken),logger:r.log,refreshToken:t.refreshToken,requestedDeviceId:t.deviceId,source:`relay_http_forward`});return IF(t.deviceId,n.deviceId),{gatewayId:e.gatewayId,...n}},handleFileContentRequest:async(e,t)=>{if(t.method===`GET`&&t.responseMode===`stream_upload`){let n=await E.openPreviewContentStream(t.ticket,{rangeHeader:t.rangeHeader,includeBody:!0});if(n.bodyStream&&t.uploadUrl&&t.uploadToken){let i=w(e,15e3),a=NL({uploadUrl:t.uploadUrl,uploadToken:t.uploadToken,contentLength:n.headers.contentLength,bodyStream:n.bodyStream});a.completed.catch(n=>{C(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 Ff.parse({status:n.statusCode,headers:n.headers,...n.bodyStream?{bodyTransport:`stream_upload`}:{}})}let n=await E.readPreviewContent(t.ticket,{rangeHeader:t.rangeHeader,includeBody:t.method===`GET`});return Ff.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)=>WF(t,{gatewayId:e.gatewayId,relayPreviewBaseUrl:x,authService:s,logger:r.log,sessionManager:T,projectDiscoveryService:h,fsService:u,workspaceFileService:E,updateService:k,gatewaySettings:{get:A,update:j},relayDeviceId:n.deviceId,readableItemDetailLookup:D,refreshDetailSessionSnapshots:e=>D.refreshDetailSessionSnapshots(e),buildRawEventsListResult:OL}),handleFileContentUploadStarted:S,sendFrame:e=>_?.send(e)??!1,dispatchCommand:async(e,t,n)=>{try{await P(e,t,n)}catch(r){await F({deviceId:t,clientId:n,rawCommand:CL(e,JSON.stringify(e)),parsedInput:e,error:r})}}}),N=async(e,t,n)=>{switch(e.type){case`session.start`:{let r=await T.startSession({...e.payload,deviceId:t});l.sendSystemMessage(n,{type:`command.ack`,commandType:e.type,commandId:e.commandId,payload:r});return}case`turn.input`:await T.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,codexAppServerTransport:e.payload.codexAppServerTransport,commandId:e.commandId});return;case`review.start`:await T.startReview(e.payload.sessionId,e.payload.config,t,{input:e.payload.input,turnConfig:e.payload.turnConfig,codexAppServerTransport:e.payload.codexAppServerTransport});return;case`tool.approval.respond`:await T.respondToolPermission(e.payload.sessionId,e.payload.requestId,e.payload.decision,e.payload.reason,t);return;case`user.input.respond`:await T.respondUserInput(e.payload.sessionId,e.payload.requestId,e.payload.answers,t);return;case`session.interrupt`:await T.interruptSession(e.payload.sessionId,t);return;case`session.close`:throw Error(`session.close is deprecated. Use session.interrupt instead.`);case`session.external.watch.set`:{TL(`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=O.setClientWatchTargets(n,e.payload.sessions,e.payload.replace);TL(`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=hL(e.payload.sessions);await D.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=T.getSessionExecutionContext(e.payload.sessionId),n=await u.readFile(t.projectPath,e.payload.path);await T.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=T.getSessionExecutionContext(e.payload.sessionId),n=await u.diffFile(t.projectPath,e.payload.path,e.payload.baseContent??``);await T.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)}`)}}},P=async(e,t,n)=>{await N(e,t,n)},F=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 T.emitExternalEvent({provider:`codex`,sessionId:`system`,type:`error.runtime`,raw:{message:String(e.error),source:`ws.command`}})},I=async(e,t,n=300,r,i=`full`,a=`http`)=>OL({sessionManager:T,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=ee(e);return t===void 0?B(e,a):te(V(t))}if(Buffer.isBuffer(e)){let t=e.toString(`utf8`),n=ee(t);return n===void 0?B(t,a):te(V(n))}return typeof e==`object`?te(V(e)):String(e)},ee=e=>{try{return JSON.parse(e)}catch{return}},B=(e,t)=>e.length<=t?e:`${e.slice(0,t)}...<truncated>`,V=e=>{if(Array.isArray(e))return e.map(e=>V(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]=V(r)}return n}return e},te=e=>{let t=H(e);return t===o?t:t.length<=a?e:{truncated:!0,preview:B(t,a)}},H=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=Qw(t)?t.status:500;return Qw(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=$m(),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},ML(pe,e.host,_e)),e.relayEnabled&&(_=new Qj({gatewayId:e.gatewayId,machineName:e.name,relayUrl:e.relayUrl,relayTransportSecurityLevel:e.relayTransportSecurityLevel,relayGatewayAccessToken:e.relayGatewayAccessToken,resolveRelayGatewayAccessToken:e.relayGatewayAccessToken.trim()?void 0:()=>rM({gatewayId:e.gatewayId,relayUrl:e.relayUrl,gatewayIdentity:y.identity,privateKeyPem:y.privateKeyPem}),gatewayIdentity:y.identity,directBaseUrls:fg({protocol:pe,host:e.host,port:_e}),logger:r.log,onFrame:async e=>{await M.handleFrame(e)}}),_.start()),e.bootstrapPairingCodeOnStart)try{let t=await s.createPairingCode(e.pairingCodeTtlSeconds);g={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 k.start(),{protocol:pe,listenPort:_e,gatewayName:e.name,machineName:me,gatewayIdentity:y.identity,close:()=>r.close(),getGatewayUpdateInfo:()=>k.getInfo(),requestGatewayUpdate:(e=`console`)=>k.applyUpdate(e),requestCodexAppServerRestart:async(e=`console`)=>T.restartCodexAppServer(),startupPairingCode:g}}function AL(e,t){let n=t;if(!e.httpsEnabled)return(0,Gw.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:xL}});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,Gw.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:xL},https:r})}function jL(e,t){let n=process.env.NODE_ENV!==`production`,r=Kw.default.destination({dest:e.gatewayLogPath,mkdir:!0,sync:!1}),i=t.logToConsole?Kw.default.multistream([{stream:r},{stream:process.stdout}]):r;return{instance:(0,Kw.default)({level:n?`debug`:`info`},i),close:()=>{try{r.flushSync()}catch{}r.end()}}}function ML(e,t,n){return`desktop-gateway listening on ${e}://${t}:${n}`}function NL(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 PL(e){return e instanceof Error?e.stack??`${e.name}: ${e.message}`:(0,b.inspect)(e,{depth:6,breakLength:120})}async function FL(e){let t=await uh({configPath:e.configPath,ensureConfigFile:!0});hh(t.config);let n=await kL(t.config,{configPath:t.configPath,logToConsole:e.logToConsole,onUpdatePrepared:async e=>{LL({type:`worker.update.prepared`,payload:e})}});LL({type:`worker.ready`,payload:IL(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=RL(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: ${PL(e)}`),i(1)}),process.on(`unhandledRejection`,e=>{console.error(`[gateway] worker unhandled rejection: ${PL(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);LL({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);LL({type:`worker.response`,id:e.id,method:e.method,ok:!0,result:t});return}}}catch(t){LL({type:`worker.response`,id:e.id,method:e.method,ok:!1,error:String(t)})}}await new Promise(()=>{})}function IL(e){return{protocol:e.protocol,listenPort:e.listenPort,gatewayName:e.gatewayName,machineName:e.machineName,gatewayIdentity:e.gatewayIdentity,startupPairingCode:e.startupPairingCode}}function LL(e){process.send&&process.send(e)}function RL(e){if(!zL(e)||typeof e.type!=`string`)return null;switch(e.type){case`supervisor.shutdown`:return e.reason!==`signal`&&e.reason!==`update`?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 zL(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}BL(process.argv.slice(2)).catch(e=>{console.error(String(e)),process.exit(1)});async function BL(e){let t=ee(e);switch(t.command){case`help`:GL();return;case`version`:console.log(z.version);return;case`init`:await HL(t);return;case`doctor`:await UL(t);return;case`start`:await VL(t);return;case`__worker`:await WL(t);return;default:{let e=t.command;throw Error(`Unsupported command: ${e}`)}}}async function VL(e){let t=await uh({configPath:e.configPath,ensureConfigFile:!0});hh(t.config);let n=await Ph({configPath:t.configPath,configExists:t.configExists,config:t.config});try{await Xg({args:e,loaded:t,doctorReport:n})}catch(e){throw Error(a_(e,t.config))}Fh(n)&&console.warn(`[doctor] startup continued despite bundled runtime check failures.`)}async function HL(e){let t=await lh({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 uh({configPath:t.configPath,ensureConfigFile:!1}),r=await Ph({configPath:n.configPath,configExists:n.configExists,config:n.config});console.log(Ih(r))}async function UL(e){let t=await uh({configPath:ch(e.configPath),ensureConfigFile:!1,syncGatewayIdentityConfig:!1}),n=await Ph({configPath:t.configPath,configExists:t.configExists,config:t.configExists?t.config:void 0});console.log(Ih(n)),Fh(n)&&(process.exitCode=1)}async function WL(e){try{await FL(e)}catch(t){let n=await uh({configPath:e.configPath,ensureConfigFile:!0});throw Error(a_(t,n.config))}}function GL(){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=BL;
521
+ `))}function ZA(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=$A(e),r=ej(t.text)??ej(t.value);r&&n.push(r)}return n.length>0?n.join(``):void 0}function QA(e,t=60){if(!e)return;let n=rj(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 $A(e){return typeof e==`object`&&e?e:{}}function ej(e){return typeof e==`string`&&e.trim()||void 0}function tj(e){if(typeof e==`string`)return nj(e)}function nj(e){if(!e)return;let t=rj(e).trim();return t.length>0?t:void 0}function rj(e){return e.replace(bA,``)}function ij(e){let t=Date.parse(e);if(Number.isFinite(t))return t}function aj(e){if(!(e===void 0||!Number.isFinite(e)||e<=0))return Math.round(e)}function oj(e){if(e===void 0||!Number.isFinite(e))return;let t=Math.floor(e);return t>0?t:void 0}var sj=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}=lj(r,[t,n]);if(uj(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=fj(await this.refreshProjects()),r=!0);let i=await dj(n.projects,t);if(!i)throw mT(t);let a=await this.options.store.getProject(i.key);if(!a&&!r){if(n=fj(await this.refreshProjects()),i=await dj(n.projects,t),!i)throw mT(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 ck({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 cj({sessions:[...n.values()],canonicalPathCache:e,getRawPath:e=>hj(e.cwd),mapSession:e=>{let t=gj(e.createdAt),n=gj(e.updatedAt,t);return{provider:`codex`,nativeSessionId:e.id,title:hj(e.name)??hj(e.preview),model:hj(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 cj({sessions:await xA(),canonicalPathCache:e,getRawPath:e=>hj(e.cwd),mapSession:e=>({provider:`claude`,nativeSessionId:e.nativeSessionId,title:hj(e.title),model:hj(e.model),createdAt:hj(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 cj(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 pj(i,e.canonicalPathCache);t.push({canonicalProjectPath:n,session:e.mapSession(r)})}catch{n+=1}}return{records:t,skippedCount:n}}function lj(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:mj(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=_j(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(yj)})).sort((e,t)=>vj(e.project,t.project));return{projects:r.map(e=>e.project),projectSessions:r}}function uj(e){return Object.values(e).some(e=>e?.status===`failed`)}async function dj(e,t){let n=e.find(e=>e.path===t);if(n)return n;let r=await hD(t);return e.find(e=>e.path===r)}function fj(e){return{v:1,generatedAt:e.generatedAt,providers:e.providers,projects:e.projects}}async function pj(e,t){let n=t.get(e);return n||(n=hD(e),t.set(e,n)),n}function mj(e){return(0,l.createHash)(`sha256`).update(e).digest(`hex`).slice(0,16)}function hj(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function gj(e,t){return!Number.isFinite(e)||e<=0?t??new Date(0).toISOString():new Date(e*1e3).toISOString()}function _j(e,t){return e&&e.updatedAt>=t.updatedAt?e:t}function vj(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 yj(e,t){return e.updatedAt===t.updatedAt?`${e.provider}:${e.nativeSessionId}`.localeCompare(`${t.provider}:${t.nativeSessionId}`):t.updatedAt.localeCompare(e.updatedAt)}var bj=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 xj(this.getProjectPath(e),wj);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 Sj(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 Sj(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 xj(this.indexPath,Cj)}getProjectPath(e){return p.default.join(this.projectsDir,`${e}.json`)}enqueueWrite(e){return this.writeQueue=this.writeQueue.then(e,e),this.writeQueue}};async function xj(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 Sj(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 Cj(e){return!Tj(e)||e.v!==1||typeof e.generatedAt!=`string`||!Vd.safeParse(e.providers).success||!Array.isArray(e.projects)?!1:e.projects.every(e=>Hd.safeParse(e).success)}function wj(e){return!Tj(e)||e.v!==1||typeof e.projectKey!=`string`||e.projectKey.length===0||typeof e.canonicalProjectPath!=`string`||e.canonicalProjectPath.length===0||!Hd.safeParse(e.project).success||!Vd.safeParse(e.providers).success||!Array.isArray(e.sessions)?!1:e.sessions.every(e=>Ud.safeParse(e).success)}function Tj(e){return typeof e==`object`&&!!e}const Ej=Buffer.from([48,42,48,5,6,3,43,101,112,3,33,0]);function Dj(e){let t=Ef.parse(e.clientHello),n=(0,l.randomBytes)(32).toString(`base64`),{privateKey:r,publicKey:i}=(0,l.generateKeyPairSync)(`x25519`),a=_p(bp(jj(i.export({format:`jwk`})))),o=sp({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:Df.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 Oj(e){let t=Ef.parse(e.clientHello),n=Df.parse(e.gatewayHello),r=Of.parse(e.clientAuth);if(t.version!==n.version||r.version!==t.version||!gf.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([Ej,vp(t.deviceIdentity.publicKey)])});if(!(0,l.verify)(null,Buffer.from(cp({gatewayId:e.gatewayId,clientHello:t,gatewayHello:{gatewayNonce:n.gatewayNonce,gatewayPublicKeyFingerprint:n.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:n.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:r.clientEphemeralPublicKey}}),`utf8`),i,vp(r.signature)))throw Error(`transcript_invalid`)}function kj(e){let t=Df.parse(e.gatewayHello),n=Of.parse(e.clientAuth),r=(0,l.createPublicKey)({key:{crv:`X25519`,kty:`OKP`,x:yp(vp(n.clientEphemeralPublicKey))},format:`jwk`}),i=(0,l.diffieHellman)({privateKey:e.gatewayEphemeralPrivateKey,publicKey:r});return dp({role:`gateway`,keySchedule:up({gatewayId:e.gatewayId,clientHello:Ef.parse(e.clientHello),gatewayHello:{gatewayNonce:t.gatewayNonce,gatewayPublicKeyFingerprint:t.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:t.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:n.clientEphemeralPublicKey},sharedSecret:new Uint8Array(i),keyEpoch:1})})}function Aj(e){return If.parse({version:1,gatewayId:e.gatewayId,deviceId:e.deviceId,code:e.code,message:e.message,retryable:e.retryable})}function jj(e){if(typeof e.x!=`string`||e.x.length===0)throw Error(`x25519 public key export missing x`);return e.x}const Mj=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;let Nj=null;function Pj(e){Nj=e}function Fj(e,t){Mj&&(console.log(`[session-fetch][gateway] ${e}`,t),Nj?.info({event:e,...t},`session fetch debug`))}const Ij=64*1024;var Lj=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}},Rj=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(ip.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=>il.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=il.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(ip.parse({type:`pairing.claim.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...Wj(t,`pairing.claim`)})}}async handleRefresh(e,t){try{let n=await this.dependencies.handleRefresh(t);this.dependencies.sendFrame(ip.parse({type:`auth.refresh.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...Wj(t,`auth.refresh`)})}}async handleFileContent(e,t){try{let n=await this.dependencies.handleFileContentRequest(e,t);this.dependencies.sendFrame(ip.parse({type:`file.content.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...Wj(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:{...Uj(`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=>Lf.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(ip.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=Bf.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:Uj(`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:Uj(`BAD_REQUEST`,400,`plaintext relay payload missing`)});return}let i=Lf.parse(e.payload);try{let e=await this.dependencies.handleRpcRequest(i,{mobileId:t,deviceId:r.deviceId});this.dependencies.sendFrame(ip.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=Bf.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:Uj(`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=Dj({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(ip.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{Oj({gatewayId:this.dependencies.gatewayId,clientHello:n.handshake.clientHello,gatewayHello:n.handshake.gatewayHello,clientAuth:t})}catch(t){this.sendSecureError(e,n.deviceId,Gj(t),String(t));return}try{let r=await this.dependencies.verifyDeviceIdentityBinding(n.deviceId,n.handshake.clientHello.deviceIdentity),i=kj({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(ip.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,qj(t),String(t))}}ensureReadyMobileClient(e){if(e.clientId&&e.socket)return;let t=new Lj(t=>{try{let n=ip.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,Kj(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:Aj({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:Uj(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 gp({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,Kj(t),`relay secure payload failed: ${String(t)}`),null}}createRelayBusinessPayloadFields(e,t,n){let r=ef({payload:n,compressionThresholdBytes:zj(t.frameType,n)?Ij:void 0});if(Bj(n)){let i=Vj(n),a=Hj(n);Fj(`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:Ij,uncompressedByteLength:r.uncompressedByteLength,compressedByteLength:r.compressedByteLength})}if(e.handshake.status!==`ready`){let e=tf(r);return e?{compressedPayload:e}:{payload:n}}return{encryptedPayload:hp({session:e.handshake.session,metadata:{frameType:t.frameType,messageType:t.messageType,gatewayId:this.dependencies.gatewayId,...t.requestId?{requestId:t.requestId}:{}},preparedPayload:r})}}};function zj(e,t){return e===`to_mobile`&&Bj(t)}function Bj(e){return typeof e==`object`&&!!e&&`kind`in e&&(e.kind===`session.stream.snapshot.chunk`||e.kind===`session.readable.snapshot.chunk`)}function Vj(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 Hj(e){return e.kind===`session.readable.snapshot.chunk`||`readable`in e.payload?e.payload.readable:void 0}function Uj(e,t,n){return Bf.parse({code:e,status:t,message:n})}function Wj(e,t){if(Qw(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=Jj(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`||vT(e))||t===`file.content`&&vT(e)?{code:`UNAUTHORIZED`,status:401,message:n}:{code:`INTERNAL`,status:500,message:n}}function Gj(e){return Yj(e,[`identity_mismatch`,`counter_replay`,`unsupported_version`,`transcript_invalid`])??`transcript_invalid`}function Kj(e){return Yj(e,[`counter_gap_too_large`,`counter_replay`,`key_epoch_mismatch`,`decrypt_failed`])??`decrypt_failed`}function qj(e){if(Qw(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=Jj(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 Jj(e){return e instanceof Error?e.message:typeof e==`string`?e:String(e)}function Yj(e,t){let n=Jj(e);return t.find(e=>e===n)}function Xj(e){return e?e.readyState:null}function Zj(e){return(typeof e.extensions==`string`?e.extensions.trim():``)||null}var Qj=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??tM}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=Xj(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=ip.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=$j(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:Zj(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=ip.parse(JSON.parse(eM(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 $j(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 eM(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 tM(e){return new AD(e,void 0,{perMessageDeflate:!0})}function nM(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(ap(t),`utf8`),(0,l.createPrivateKey)(e.privateKeyPem)).toString(`base64`)}}async function rM(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(iM(e.relayUrl),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(nM({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 Kf.parse(JSON.parse(r)).token}function iM(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 aM(e){return e?.trim()||void 0}function oM(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 sM(e,t){let n=t.defaults.sandboxMode??null;return{modeDefault:`default`,model:aM(t.defaults.model),reasoningEffort:t.defaults.reasoningEffort,execution:e===`codex`?{codex:{approvalPolicy:Ga(n),sandboxMode:n}}:{claude:{permissionMode:t.defaults.permissionMode??null}}}}function cM(e){return{mode:`default`,model:null,reasoningEffort:null,execution:e===`codex`?{codex:{approvalPolicy:null,sandboxMode:null}}:{claude:{permissionMode:null}}}}function lM(e,t){let n=cM(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 uM(e,t){return e===`claude`&&t?.permissionMode===`plan`?`plan`:`default`}function dM(e){let t=lM(e.provider,e.sessionTurnConfig);return e.sessionTurnConfig!==void 0||aM(e.legacyModel)!==void 0||e.legacySessionConfig!==void 0?fM({provider:e.provider,providerDefaults:{modeDefault:`default`},currentSessionTurnConfig:t,legacyModel:e.legacyModel,legacySessionConfig:e.legacySessionConfig}).sessionTurnConfig:t}function fM(e){let t=lM(e.provider,e.currentSessionTurnConfig),n=e.mode??(e.legacySessionConfig?uM(e.provider,e.legacySessionConfig):void 0)??t.mode??e.providerDefaults.modeDefault,r=lM(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=aM(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??aM(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:oM(r.execution)}}}function pM(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 mM(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 hM=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=mM(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=pM(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 gM=[],_M=[{id:`default`,label:`Default`,isDefault:!0,supportedReasoningEfforts:[`low`,`medium`,`high`,`max`]}],vM=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`],yM=Ia.options,bM=[`read-only`,`workspace-write`,`danger-full-access`],xM=[`websocket`,`stdio`],SM=[`default`,`acceptEdits`,`bypassPermissions`,`plan`,`dontAsk`],CM={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 wM(e,t){let n=t?.trim().toLowerCase();return n?(CM[e]??[]).find(e=>n===e.version.toLowerCase())??null:null}function TM(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:vM}:{}},...e.map(e=>({...e,isDefault:!1}))]}function EM(e){return e===`none`||e===`minimal`||e===`low`||e===`medium`||e===`high`||e===`xhigh`||e===`max`?e:null}function DM(e){let t=new Set;for(let n of e){let e=EM(n);e&&t.add(e)}return[...t]}function OM(e){return e?.trim()||void 0}function kM(e){let t=OM(e.runtimeModel);if(t)return t;let n=OM(e.discoveredModel);if(n)return n;let r=OM(e.existingModel),i=OM(e.modelProvider)?.toLowerCase();if(r&&(!i||r.toLowerCase()!==i))return r}function AM(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:DM(e.supportedReasoningEfforts)}));return t.length===0?gM:(t.some(e=>e.isDefault)||(t[0]={...t[0],isDefault:!0}),t)}async function jM(e){let t=Date.now();try{let n=AM(await dk());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 MM(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(sh(),`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=PM(e.description,e.displayName,t),a=e.supportsEffort===!1?[]:e.supportsEffort||n?DM(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 NM(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 PM(...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 FM=class{cache=new Map;inFlight=new Map;cacheEpochByProvider=new Map;executionPreferences;constructor(e){this.options=e,this.executionPreferences=new hM(this.options.providerExecutionPreferencesDir??p.default.join(sh(),`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=CM.claude.length>0?CM.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 sM(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 oT(t);let r=wM(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=vA(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 jM(this.options.logger)??gM:gM,l=e===`claude`&&a?await MM(this.options.logger)??_M:_M,u=DM(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:vM,approvalPolicies:yM,sandboxModes:bM,permissionModes:[],codexAppServerTransports:[...xM]},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:SM},defaults:{model:l.find(e=>e.isDefault)?.id??l[0]?.id,reasoningEffort:NM(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?TM(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 IM=`.meta.json`;function LM(){let e=process.env.CODEX_HOME?.trim();return e?p.default.resolve(e):p.default.join(f.default.homedir(),`.codex`)}function RM(){return p.default.join(LM(),`auth.json`)}function zM(){return p.default.join(sh(),`codex-accounts`)}var BM=class{currentAuthFilePath;snapshotsDir;readAccountMetadata;constructor(e={}){this.currentAuthFilePath=e.currentAuthFilePath??RM(),this.snapshotsDir=e.snapshotsDir??zM(),this.readAccountMetadata=e.readAccountMetadata??UM}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 oN(this.currentAuthFilePath),n=await this.readSavedSnapshot(e);return await sN(this.currentAuthFilePath,n.rawContent),{previousRawContent:t}}async deleteSavedAccount(e){let t=this.getSnapshotPath(e);if(await oN(t)===null)throw fT(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 sN(this.currentAuthFilePath,e)}async listSavedAccounts(e){let t=await aN(this.snapshotsDir);return(await Promise.all(t.filter(e=>e.isFile()&&iN(e.name)).map(async t=>{let n=rN(t.name);if(!n)return null;let r=p.default.join(this.snapshotsDir,t.name);try{let t=VM(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 oN(this.getSnapshotPath(e));if(n===null)return`missing`;try{return VM(n,this.getSnapshotPath(e)).canonicalContent===t?`current`:`stale`}catch{return`stale`}}async writeSnapshot(e,t,n){let r=new Date().toISOString();await sN(this.getSnapshotPath(e),t.rawContent),await sN(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 oN(t);if(n===null)throw fT(e);return VM(n,t)}async readSnapshotMetadata(e){let t=await oN(this.getSnapshotMetadataPath(e));if(t===null)return null;try{return HM(t)}catch{return null}}async readCurrentAuthFile(){let e=await this.readCurrentAuthFileOrNull();if(!e)throw pT(`Current Codex auth.json is missing or unreadable`);return e}async readCurrentAuthFileOrNull(){let e=await oN(this.currentAuthFilePath);if(e===null)return null;try{return VM(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 pT(`Current Codex account does not expose a ChatGPT email via account/read`);return e}getSnapshotPath(e){return p.default.join(this.snapshotsDir,`${nN(e)}.json`)}getSnapshotMetadataPath(e){return p.default.join(this.snapshotsDir,`${nN(e)}${IM}`)}};function VM(e,t){let n;try{n=JSON.parse(e)}catch(e){throw pT(`Codex auth file is not valid JSON: ${t}`,{error:String(e)})}if(!n||typeof n!=`object`||Array.isArray(n))throw pT(`Codex auth file is not an object: ${t}`);let r=n;return{authMode:WM(r.auth_mode),lastRefreshAt:JM(r.last_refresh),rawContent:e,canonicalContent:eN(n)}}function HM(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`invalid snapshot metadata`);let n=t,r=KM(n.accountId);if(!r)throw Error(`missing snapshot metadata accountId`);return{accountId:r,accountType:qM(n.accountType),planType:GM(n.planType),rateLimits:YM(n.rateLimits),savedAt:JM(n.savedAt)??new Date(0).toISOString()}}async function UM(){return mO(async e=>{let t=$M(await e.sendRequest(`account/read`,{refreshToken:!1}));if(!t)return null;let n=$M(t.account);if(!n)return null;let r=null;try{let t=$M(await e.sendRequest(`account/rateLimits/read`,void 0));r=t?YM($M(t.rateLimits)):null}catch{r=null}let i=qM(n.type);if(i===`chatgpt`){let e=KM(n.email);return e?{accountId:e,accountType:i,planType:GM(n.planType)??r?.planType??null,rateLimits:r}:null}return i===`apiKey`?{accountId:`API Key`,accountType:i,planType:GM(n.planType)??r?.planType??null,rateLimits:r}:null})}function WM(e){return typeof e==`string`&&e.trim()?e.trim():`unknown`}function GM(e){return typeof e==`string`&&e.trim()?e.trim():null}function KM(e){return typeof e==`string`&&e.trim()?e.trim().toLowerCase():null}function qM(e){return e===`chatgpt`||e===`apiKey`?e:`unknown`}function JM(e){if(typeof e!=`string`||!e.trim())return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function YM(e){let t=$M(e);if(!t)return null;let n=XM(t.primary),r=XM(t.secondary),i=GM(t.planType??t.plan_type),a=$M(t.credits),o=GM(t.creditsBalance??a?.balance);return!n&&!r&&!i&&!o?null:{...n?{primary:n}:{},...r?{secondary:r}:{},...i?{planType:i}:{},...o?{creditsBalance:o}:{}}}function XM(e){let t=$M(e);if(!t)return null;let n=ZM(t.usedPercent??t.used_percent);return n===null?null:{usedPercent:n,windowMinutes:QM(t.windowMinutes??t.windowDurationMins??t.window_minutes),resetsAt:ZM(t.resetsAt??t.resets_at)}}function ZM(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function QM(e){return typeof e==`number`&&Number.isFinite(e)?Math.trunc(e):null}function $M(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function eN(e){return JSON.stringify(tN(e))}function tN(e){return Array.isArray(e)?e.map(e=>tN(e)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,tN(t)])):e}function nN(e){let t=KM(e);if(!t)throw pT(`Codex account identifier cannot be empty`);return encodeURIComponent(t)}function rN(e){if(!iN(e))return null;try{return KM(decodeURIComponent(e.slice(0,-5)))}catch{return null}}function iN(e){return e.endsWith(`.json`)&&!e.endsWith(IM)}async function aN(e){try{return await d.default.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function oN(e){try{return await d.default.readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function sN(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 cN=[`## 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 lN(e,t){let n=e.provider===`codex`?e.codex:void 0;if(!n)throw Error(`Codex review config is required`);return[...cN,``,dN(n.target),`## My request for Codex:`,uN(e,t)].join(`
522
+ `)}function uN(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 ${fN(r.sha,r.title)}.`:r.type===`custom`?r.instructions:`Please review my uncommitted changes.`,a=pN(t);return a?`${i}\n\nAdditional review instructions:\n${a}`:i}function dN(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 ${fN(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 fN(e,t){let n=pN(t);return n?`${e} (${JSON.stringify(n)})`:e}function pN(e){return e?.trim()||void 0}async function mN(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,_N(e.sessionId),_N(e.commandId??`turn_${Xw(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(!gN(t,a.mimeType))throw Error(`Image attachment MIME/content mismatch: ${a.mimeType}`);let o=hN(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 hN(e){return e===`image/jpeg`?`jpg`:e===`image/webp`?`webp`:`png`}function gN(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 _N(e){return e.replace(/[^a-zA-Z0-9._-]+/g,`_`).slice(0,80)||`unknown`}const vN=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;function yN(e){return e.lastHydratedExternalUpdatedAt||e.updatedAt||e.createdAt}function bN(e,t){vN&&(!e.startsWith(`config.get`)&&!e.startsWith(`raw-events`)&&!e.startsWith(`sync-external`)&&!e.endsWith(`.error`)||console.log(`[session-fetch][gateway] ${e}`,t))}function xN(e){return e?{sessionFound:!0,sessionId:e.id,nativeSessionId:e.nativeSessionId??null,sessionSource:e.source??null,sessionModel:e.model??null,sessionUpdatedAt:e.updatedAt,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 SN(e,t,n,r){let i=lM(e,n);if(!t)return wN(e,i,r);let a=lM(e,t);return wN(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 CN(e){return e.observedModel===void 0?e.observedSessionTurnConfig?.model===void 0?e.currentModel:OM(e.observedSessionTurnConfig.model??void 0):OM(e.observedModel)}function wN(e,t,n){let r=lM(e,t);return{mode:r.mode,model:r.model,reasoningEffort:e===`claude`&&n?.preserveReasoningEffort===!1?null:r.reasoningEffort}}function TN(e){return e.provider!==`claude`||e.source===`gateway`}function EN(e){return!e||e.provider!==`claude`||e.source===`gateway`||!e.sessionTurnConfig?e:{...e,sessionTurnConfig:wN(`claude`,e.sessionTurnConfig,{preserveReasoningEffort:!1})}}function DN(e,t){return e?.status===`running`?{status:`running`}:t?{status:`running`,interactionLockReason:`external_turn_running`}:{status:`idle`}}function ON(e){return e.status===`active`?!0:e.turns.some(e=>e.status===`inProgress`||e.status===`in_progress`)}function kN(e,t){if(!t)return ON(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 AN(e){return e.startsWith(`sess_`)}function jN(e){return e.source===`native_discovered`?!0:e.providerMode===`native`&&(e.provider===`codex`||e.provider===`claude`)}function MN(e){return e.nativeSessionId?.trim()??``?!0:e.provider===`codex`&&!AN(e.id)}function NN(e){return AN(e.id)?e.nativeSessionId??e.id:e.id}function PN(e){return e.provider!==`codex`&&e.provider!==`claude`||e.providerMode!==`native`?!1:MN(e)}function FN(e){return e instanceof Error&&/^Session .+ is closed$/i.test(e.message)}function IN(e,t){if(e.provider!==`codex`||t.type!==`error.runtime`)return!1;if($P(t.source)?.startsWith(`codex.app_server`))return!0;let n=$P(t.message)??``;return/\bclosed\b/i.test(n)}const LN={idleTtlMs:900*1e3,sweepIntervalMs:60*1e3,maxSessions:24,maxCodexSessions:8,maxClaudeSessions:16};function RN(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(1,Math.trunc(n)):t}function zN(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(0,Math.trunc(n)):t}var BN=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 FM({preferNativeProviders:e.preferNativeProviders,projectStore:e.projectStore,logger:e.logger,providerExecutionPreferencesDir:e.providerExecutionPreferencesDir}),this.codexAccounts=e.codexAccountService??new BM,this.attachmentStoreDir=e.attachmentStoreDir??p.default.join(f.default.tmpdir(),`craby-session-attachments`),this.runtimeLifecycle={idleTtlMs:RN(e.runtimeLifecycle?.idleTtlMs,LN.idleTtlMs),sweepIntervalMs:zN(e.runtimeLifecycle?.sweepIntervalMs,LN.sweepIntervalMs),maxSessions:RN(e.runtimeLifecycle?.maxSessions,LN.maxSessions),maxCodexSessions:RN(e.runtimeLifecycle?.maxCodexSessions,LN.maxCodexSessions),maxClaudeSessions:RN(e.runtimeLifecycle?.maxClaudeSessions,LN.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 XD(),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 uT(e);return this.options.projectStore.remove(e)}async restartCodexAppServer(){let e=this.getRunningRuntimeSessionCount();if(e>0)throw dT(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 ZD(),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 dT(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 XD();let i=null;try{i=await this.codexAccounts.applySavedAccount(e),await ZD()}catch(e){if(i?.previousRawContent)try{await this.codexAccounts.restoreCurrentAuthFile(i.previousRawContent),await ZD()}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 oT(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)||EN(n)}async getProjectSessionConfig(e,t){let n=this.options.historyStore.getProjectSession(e,t),r=this.getRuntimeSessionSummary(e,t,n);if(bN(`config.get.begin`,{projectId:e,sessionId:t,shouldHydrate:n?this.shouldHydrateCodexExternalSessionConfig(n):!1,persisted:xN(n),runtime:xN(r)}),r)return bN(`config.get.result`,{projectId:e,sessionId:t,resultSource:`runtime`,...xN(r)}),r;let i=n?.provider===`codex`?await this.maybeHydrateCodexExternalSessionConfig(n):EN(n);return bN(`config.get.result`,{projectId:e,sessionId:t,resultSource:i===n?`persisted`:`hydrated`,...xN(i)}),i}async syncProjectSessionHistory(e,t){let n=await this.options.projectStore.getById(e);if(!n)throw oT(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 sT(e,t);let i=await this.options.historyStore.getSessionRawEvents(r.id,2**53-1),a=await this.options.historyStore.getSessionStoredRawEvents(r.id,2**53-1),o=await this.syncExternalRawHistory(r,e,i,a),s=o.session??this.options.historyStore.getProjectSession(e,r.id)??r,c=MP(i,o.rawEvents);bN(`sync-external.classify`,jP({projectId:e,sessionId:t,session:s,previousEvents:i,nextEvents:o.rawEvents,classification:c}));let l=s.status!==r.status||(s.interactionLockReason??``)!==(r.interactionLockReason??``);return{session:s,rawEvents:o.rawEvents,historyUpdated:c.historyUpdated,statusChanged:l,refreshMode:c.refreshMode,fromRawSeq:c.fromRawSeq,toRawSeq:c.toRawSeq,nativeWatchPath:o.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 oT(e);let i=0,a=0,o,s=(s,c)=>{bN(`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 sT(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 oT(e);let n=this.options.historyStore.getProjectSession(e,t);if(n||=this.getRuntimeSessionSummary(e,t),!n)throw sT(e,t);return n}async startSession(e){let t=await this.resolveProjectForSessionStart(e.projectId,e.cwd),n=`sess_${Xw(10)}`,r=e.provider===`codex`&&this.options.requireNativeCodex,i=vA(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?lM(e.provider,e.sessionTurnConfig):dM({provider:e.provider,legacyModel:e.model,legacySessionConfig:e.sessionConfig}),c=fM({provider:e.provider,providerDefaults:a,currentSessionTurnConfig:s}),l=wN(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,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 lT(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!s&&this.preparingRuntimeDispatches.has(e))throw lT(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(o?.interactionLockReason===`external_turn_running`)throw lT(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 lT(e,`the current turn is still running`,{reason:`runtime_running`,provider:s.provider,providerMode:s.providerMode});if(!s&&o?.status===`running`&&jN(o))throw lT(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;try{if(c&&this.preparingRuntimeDispatches.add(e),l=s??await this.resumeSessionFromHistory(e),!l)throw cT(e);let t=await this.getProviderDefaults(l.provider,l.projectId),o=fM({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 d=await mN({rootDir:this.attachmentStoreDir,sessionId:e,commandId:r?.commandId,attachments:a}),f={text:i,attachments:d.attachments};if(await this.options.auditLogger.record({ts:new Date().toISOString(),action:`turn.input`,deviceId:n,sessionId:e,detail:{text:i,attachments:d.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:d.attachments.length,attachmentTotalSizeBytes:d.totalSizeBytes,model:o.model,sessionConfig:r?.sessionConfig,mode:o.mode,config:r?.config,resolvedSessionConfig:o.sessionConfig}}),this.consumeQueuedInterruptBeforeDispatch(e)||(this.options.historyStore.getSession(l.id)||await this.persistSessionSnapshot(l),this.consumeQueuedInterruptBeforeDispatch(e)))throw u=!0,this.createInterruptedBeforeDispatchError(e);if(l=await this.sendInputWithRuntimeRecovery(e,l,f,{model:o.model,sessionConfig:o.sessionConfig,mode:o.mode}),!l.title){let e=ZP(i)??(d.attachments.length>0?`图片消息`:void 0);e&&this.setSessionTitle(l,e)}let p=new Date().toISOString();l.sessionTurnConfig=wN(l.provider,o.sessionTurnConfig),l.sessionTurnConfigUpdatedAt=p,o.model&&l.model!==o.model&&(l.model=o.model),l.updatedAt=p,await this.persistSessionSnapshot(l)}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 lT(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!a&&this.preparingRuntimeDispatches.has(e))throw lT(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(i?.interactionLockReason===`external_turn_running`)throw lT(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 lT(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&jN(i))throw lT(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;try{if(o&&this.preparingRuntimeDispatches.add(e),s=a??await this.resumeSessionFromHistory(e),!s)throw cT(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),l=fM({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:l.model,resolvedSessionConfig:l.sessionConfig}}),this.consumeQueuedInterruptBeforeDispatch(e)||(this.options.historyStore.getSession(s.id)||await this.persistSessionSnapshot(s),this.consumeQueuedInterruptBeforeDispatch(e)))throw c=!0,this.createInterruptedBeforeDispatchError(e);let u=lN(t,r?.input);if(s=await this.sendInputWithRuntimeRecovery(e,s,u,{model:l.model,sessionConfig:l.sessionConfig}),!s.title){let e=QP(t,r?.input);e&&this.setSessionTitle(s,e)}let d=new Date().toISOString();s.sessionTurnConfig=wN(s.provider,l.sessionTurnConfig),s.sessionTurnConfigUpdatedAt=d,l.model&&s.model!==l.model&&(s.model=l.model),s.updatedAt=d,await this.persistSessionSnapshot(s)}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(!FN(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;return o.dispatchInFlight=!0,this.touchSession(o),await o.providerSession.sendInput(n,r),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:eF(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 cT(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_${Xw(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=vA(t.provider,{preferNative:this.options.preferNativeProviders,requireNative:n}),i=await this.getProviderDefaults(t.provider,t.projectId),a=wN(t.provider,t.sessionTurnConfig,{preserveReasoningEffort:TN(t)}),o=fM({provider:t.provider,providerDefaults:i,currentSessionTurnConfig:a}),s=t.provider===`claude`?NN(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(),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 lT(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 sk(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=tF(t.createdAt),s=tF(t.updatedAt),l=DN(i,ON(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:kM({runtimeModel:i?.model,discoveredModel:t.model,existingModel:n?.model,modelProvider:t.modelProvider}),title:i?.title??ZP(t.name??t.preview)??n?.title,sessionTurnConfig:i?.sessionTurnConfig??(n?.sessionTurnConfig?wN(`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 SA(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=DN(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?wN(`claude`,n.sessionTurnConfig,{preserveReasoningEffort:TN(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=yN(e),n=yP([e.nativeSessionId,e.id]);for(let r of n)try{bN(`config.get.probe.begin`,{projectId:e.projectId,sessionId:e.id,threadId:r,...xN(e)});let n=await uk(r);if(!n){bN(`config.get.probe.empty`,{projectId:e.projectId,sessionId:e.id,threadId:r});continue}let i=n.sessionTurnConfig?SN(e.provider,e.sessionTurnConfig,n.sessionTurnConfig):e.sessionTurnConfig,a={...e,model:CN({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),bN(`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:xN(a)}),this.options.historyStore.getProjectSession(e.projectId,e.id)??a}catch(t){bN(`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`||!PN(e)||this.sessions.has(e.id)||e.nativeSessionId&&this.sessions.has(e.nativeSessionId))return!1;let t=yN(e),n=e.sessionTurnConfigUpdatedAt||``;if(!e.sessionTurnConfig||!OM(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 oT(e);if((await this.options.projectStore.upsertByPath(t)).id!==n.id)throw Error(`projectId (${e}) does not match cwd (${t})`);return await nF(n.path),n}if(e){let t=await this.options.projectStore.getById(e);if(!t)throw oT(e);return await nF(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);if(this.emitRawEnvelope(e,n),this.maybePersistUpdatedNativeSessionId(e),e.updatedAt=new Date().toISOString(),this.touchSession(e),n.type===`thread.title.updated`){let t=$P(n.title);t&&this.setSessionTitle(e,t);return}if(n.type===`turn.started`){e.status=`running`,this.persistSessionSnapshot(e);return}if(n.type===`turn.completed`||n.type===`turn.failed`){e.status=`idle`,this.persistSessionSnapshot(e),e.provider===`claude`&&this.closeRuntimeSession(e.id,`turn_terminal`);return}if(n.type===`error.runtime`){let t=$P(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`,this.persistSessionSnapshot(e),IN(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_${Xw(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_${Xw(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=xP(e);if(!i)return{rawEvents:n};try{let a=Date.now(),o=await CA({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 bN(`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`&&bP(i)&&await this.markExternalHistoryHydrated(e.id,e.updatedAt),bN(`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=QN(n,(this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0))?.status===`running`),a=yP([e.nativeSessionId,e.id]);for(let o of a)try{let a=Date.now(),s=await lk(o,!0),c=Date.now(),l,u;if(e.source===`gateway`&&n.length>0)l=WP({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=PP({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n});r?(l=r,u=`native_tail_incremental`):(l=NP({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`)}else l=NP({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,tF(s.updatedAt),i),p=await this.patchObservedExternalSessionSummary(e,{updatedAt:tF(s.updatedAt),externallyRunning:e.source===`gateway`?kN(s,i):ON(s)});return bN(`sync-external.codex`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,threadStatus:s.status,threadUpdatedAt:tF(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`?kN(s,i):ON(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){bN(`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 bN(`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=HN(e.provider,t,n,i),s=Date.now(),c=await this.maybePersistSyncedExternalRawEvents(e,t,o,!0);return await this.markExternalHistoryHydrated(e.id,r),bN(`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=TN(n),a=t.sessionTurnConfig?SN(e.provider,n.sessionTurnConfig,t.sessionTurnConfig,{preserveReasoningEffort:i}):void 0,o=DN(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??CN({currentModel:n.model,observedModel:t.model,observedSessionTurnConfig:a}),sessionTurnConfig:r?.sessionTurnConfig??a??(n.sessionTurnConfig?wN(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 cT(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))}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,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=XP(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 VN=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]);function HN(e,t,n,r){if(e===`claude`)return WN(e,tP(t,n),n);if(e!==`codex`)return WN(e,t,n);if(t.length===0)return n.slice().sort((e,t)=>e.ts.localeCompare(t.ts));let i=r??QN(t),a=UN(e,t.filter(e=>!JN(e))),o=aP(e),s=t.filter(t=>{if(ZN(t,i))return!1;if(!JN(t))return!0;let n=oP(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=aP(e),f=aP(e),p=eP(t)??eP(n)??Date.now();for(let[t,n]of s.entries()){c.set(n.eventId,n),l.set(n.eventId,t);for(let t of oP(e,n,d))u.add(t)}for(let t of n){if(ZN(t,i))continue;let n=oP(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(!GN(r,t))continue;let e=l.get(t.eventId),n=$N(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 UN(e,t){let n=new Map,r=aP(e);for(let i of t)for(let t of oP(e,i,r))n.set(t,(n.get(t)??0)+1);return n}function WN(e,t,n){let r=new Map,i=new Set,a=aP(e),o=aP(e);for(let n of t){r.set(n.eventId,n);for(let t of oP(e,n,a))i.add(t)}for(let t of n){let n=oP(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 GN(e,t){return KN(e)&&KN(t)}function KN(e){return e.type===`native.raw`?$(Q(e.payload.raw).source)===`codex.history.thread_read`:!1}function qN(e){return e===`codex.history.thread_read`||e===`codex.history.thread_read.incremental`}function JN(e){let t=Q(e.payload.raw),n=$(t.source);return t.historyReplay===!0||qN(n)}function YN(e){let t=Q(e.payload.raw),n=Q(t.item),r=Q(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=Q(t.message);if(i===`codex.app_server`){let e=$(a.method),t=Q(a.params);return e===`turn/started`||e===`turn/completed`||e===`turn/failed`||e===`turn/interrupted`?$(Q(t.turn).id)??$(t.turn_id)??$(t.turnId):e===`item/started`||e===`item/updated`||e===`item/completed`?$(t.turn_id)??$(t.turnId)??$(Q(t.item).turn_id)??$(Q(t.item).turnId):void 0}if(i!==`codex.history.thread_read`)return;let o=$(a.scope);if(o===`turn`)return $(Q(a.turn).id);if(o===`item`)return $(a.turn_id)??$(Q(a.item).turn_id)}function XN(e){let t=Q(e.payload.raw);if(e.type===`turn.completed`||e.type===`turn.failed`){let n=$(t.status)??(e.type===`turn.completed`?`completed`:`failed`);return n&&JP(n)?n:void 0}if(e.type!==`native.raw`)return;let n=$(t.source),r=Q(t.message);if(n===`codex.app_server`){let e=$(r.method);if(e!==`turn/completed`&&e!==`turn/failed`&&e!==`turn/interrupted`)return;let t=$(Q(Q(r.params).turn).status)??(e===`turn/completed`?`completed`:e===`turn/interrupted`?`interrupted`:`failed`);return t&&JP(t)?t:void 0}if(n!==`codex.history.thread_read`||$(r.scope)!==`turn`)return;let i=$(Q(r.turn).status);return i&&JP(i)?i:void 0}function ZN(e,t){if(!JN(e))return!1;let n=YN(e),r=XN(e);return!n||!r?!1:YP(t.terminalTurnStatusById.get(n),r)}function QN(e,t=!1){let n=new Set,r=new Map;for(let t of e){if(JN(t))continue;let e=YN(t);e&&n.add(e);let i=XN(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 $N(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function eP(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 tP(e,t){let n=nP(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=iP(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 nP(e){let t=new Map,n=new Map;for(let r of e){let e=rP(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 rP(e){let t=Date.parse(e.ts);if(!Number.isFinite(t))return;if(e.type===`item.completed`){let n=Q(Q(e.payload.raw).item);if($(n.type)!==`user_message`||$(n.source_event_type)!==`claude.synthetic.user_input`)return;let r=_P(n);return r?{text:r,tsMs:t,syntheticMessageId:$P(n.id)??$P(n.item_id)??$P(n.itemId)}:void 0}if(e.type!==`native.raw`)return;let n=Q(e.payload.raw);if($(n.source)!==`claude.synthetic.user_input`||($(n.native_type)??$(Q(n.message).type))!==`user`)return;let r=vP(Q(Q(n.message).message));if(r)return{text:r,tsMs:t,syntheticMessageId:$P(Q(n.message).uuid)}}function iP(e){if(e.type!==`native.raw`)return;let t=Date.parse(e.ts);if(!Number.isFinite(t))return;let n=Q(e.payload.raw),r=$(n.source);if(!r||!VN.has(r))return;let i=Q(n.message);if(($(n.native_type)??$(i.type))!==`user`)return;let a=vP(Q(i.message));if(a)return{text:a,tsMs:t}}function aP(e){if(e===`codex`)return{codexTurnScopedItemOccurrences:new Map}}function oP(e,t,n){return e===`codex`?sP(t,n):e===`claude`?pP(t):[]}function sP(e,t){let n=Q(e.payload.raw),r=new Set,i=mP(e.type,n);if(i){let a=cP(e.type,n);a?r.add(dP(a,t,n)):r.add(i)}if(e.type!==`native.raw`)return[...r];let a=$(n.source);if(a===`codex.app_server`){let e=Q(n.message),i=$(e.method),a=Q(e.params);if(i===`turn/started`)return r.add(hP(`turn.started`,{turn:Q(a.turn)})),[...r];if(i===`turn/completed`)return r.add(hP(`turn.completed`,{status:`completed`,turn:Q(a.turn)})),[...r];if(i===`turn/failed`||i===`turn/interrupted`)return r.add(hP(`turn.failed`,{status:i===`turn/interrupted`?`interrupted`:`failed`,turn:Q(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)??$(Q(a.item).turn_id),item:Q(a.item)},o=cP(e,n);return o?r.add(dP(o,t,n)):r.add(hP(e,n)),[...r]}return[...r]}if(a!==`codex.history.thread_read`)return[...r];let o=Q(n.message),s=$(o.scope);if(s===`thread`){let e=Q(o.thread),t=$(e.id);t&&r.add(hP(`thread.started`,{thread_id:t,thread:e}));let n=ZP(gP(e.preview)??gP(e.name)??``);return n&&r.add(hP(`thread.title.updated`,{title:n,thread_id:t})),[...r]}if(s===`turn`){let e=Q(o.turn),t=$(e.status);return r.add(hP(`turn.started`,{turn:e})),t===`completed`?r.add(hP(`turn.completed`,{status:t,turn:e})):(t===`failed`||t===`interrupted`)&&r.add(hP(`turn.failed`,{status:t,turn:e})),[...r]}if(s===`item`){let e={turn_id:$(o.turn_id)??$(Q(o.item).turn_id),item:Q(o.item),...o.semantic_occurrence===void 0?{}:{semantic_occurrence:o.semantic_occurrence}},n=cP(`item.completed`,e);return n?r.add(dP(n,t,e)):r.add(hP(`item.completed`,e)),[...r]}return[...r]}function cP(e,t){if(!e.startsWith(`item.`))return;let n=Q(t.item),r=$(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId),i=lP($(n.type));if(!(!r||!i))return[`codex`,e,r,i,uP(i,$(n.phase)),$(n.status)??``,kP($(n.command)),kP(_P(n))].join(`|`)}function lP(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 uP(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function dP(e,t,n){let r=fP(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 fP(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 pP(e){let t=Q(e.payload.raw),n=mP(e.type,t);if(n)return[n];if(e.type!==`native.raw`)return[];let r=$(t.source);if(!r||!VN.has(r))return[];let i=Q(t.message),a=$(t.native_type)??$(i.type),o=Q(i.message);if(a===`user`){let e=vP(o),t=$(i.uuid);return!e||!t?[]:[hP(`item.completed`,{item:{id:t,type:`user_message`,text:e}})]}if(a===`assistant`){let e=vP(o),t=$(o.id)??$(i.uuid);return!e||!t?[]:[hP(`item.completed`,{item:{id:t,type:`agent_message`,text:e}})]}return[]}function mP(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 hP(e,t);default:return}}function hP(e,t){let n=Q(t.item),r=Q(t.turn),i=Q(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=kP($(n.command)),p=kP(_P(n)),m=kP(gP(t.message)),h=kP(gP(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 Q(e){return typeof e==`object`&&e?e:{}}function $(e){return typeof e==`string`&&e.trim()||void 0}function gP(e){if(typeof e==`string`)return e.length>0?e:void 0}function _P(e){let t=gP(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=gP(Q(t).text);n&&e.push(n)}if(e.length>0)return e.join(`
523
+ `)}let r=Array.isArray(e.summary)?e.summary:[];if(r.length>0){let e=r.map(e=>gP(e)).filter(e=>!!e);if(e.length>0)return e.join(`
524
+ `)}return``}function vP(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=Q(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(`
525
+ `)}function yP(e){let t=new Set;for(let n of e)n&&t.add(n);return[...t]}function bP(e){return String(e).includes(`returned no messages from getSessionMessages`)}function xP(e){return NN(e)}function SP(e){return e?{rawSeq:e.rawSeq,type:e.type,eventId:e.eventId,ts:e.ts}:null}function CP(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(!wP(n,i))return r}return e.length===t.length?null:n}function wP(e,t){return DP(TP(e))===DP(TP(t))}function TP(e){let{ts:t,...n}=e;return n}function EP(e){if(typeof e==`string`)return OP(e);if(Array.isArray(e))return e.map(e=>EP(e));if(!e||typeof e!=`object`)return e;let t=e,n={};for(let e of Object.keys(t).sort())n[e]=EP(t[e]);return n}function DP(e){return JSON.stringify(EP(e))}function OP(e){return e.length<=4096?e:{__type:`hashed_text`,length:e.length,sha256:(0,l.createHash)(`sha256`).update(e).digest(`hex`)}}function kP(e){if(!e)return``;let t=OP(e);return typeof t==`string`?t:`sha256:${t.length}:${t.sha256}`}function AP(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 jP(e){let t=e.previousEvents[e.previousEvents.length-1]?.rawSeq??null,n=e.nextEvents[e.nextEvents.length-1]?.rawSeq??null,r=CP(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:AP(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:SP(r===null?void 0:e.previousEvents[r]),nextMismatchEvent:SP(r===null?void 0:e.nextEvents[r])}}function MP(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&&wP(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&&wP(e,r)})?{historyUpdated:!0,refreshMode:`delta`,fromRawSeq:n??0,toRawSeq:r??n??0}:{historyUpdated:!0,refreshMode:`snapshot`,...r===void 0?{}:{toRawSeq:r}}}function NP(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:UP(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);(JP(t.status)?!YP(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,$P(n.id)??null])}return t}function PP(e){let t=FP(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(eP(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:UP(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,$P(t.id)??null]);continue}let a=n!==c,o=LP(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,$P(t.id)??null])}}return r}function FP(e){let t={hasHistoryReplay:!1,hasThreadEnvelope:!1,turnOrder:[],turnsById:new Map};for(let n of e){if(n.type!==`native.raw`)continue;let e=Q(n.payload.raw);if($(e.source)!==`codex.history.thread_read`)continue;let r=Q(e.message),i=$(r.scope);if(t.hasHistoryReplay=!0,i===`thread`){t.hasThreadEnvelope=!0;continue}if(i===`turn`){let e=Q(r.turn),n=$(e.id);if(!n)continue;let i=IP(t,n),a=$(e.status);a&&(i.status=a),i.fingerprint=VP(e);continue}if(i!==`item`)continue;let a=Q(r.item),o=$(r.turn_id)??$(a.turn_id);if(!o)continue;let s=IP(t,o),c=RP(o,a,void 0,s.itemOccurrenceByBaseKey);c&&(s.itemFingerprintByKey.has(c)||s.itemOrder.push(c),s.itemFingerprintByKey.set(c,BP(a)))}return t}function IP(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 LP(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||RP(t.id,a,r,n)!==i||e.itemFingerprintByKey.get(i)!==BP(a))return{safe:!1,appendedItems:[],statusChanged:!1}}return e.fingerprint!==void 0&&e.fingerprint!==VP(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 RP(e,t,n,r){let i=zP(e,t,n);if(!i)return;let a=fP(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 zP(e,t,n){let r=cP(`item.completed`,{turn_id:e,item:t});if(r)return r;let i=$P(t.id);if(i)return`id:${i}`;if(n!==void 0)return`${e}::${n}`}function BP(e){let t=lP($(e.type)),n=t?uP(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),DP(r)}function VP(e){return DP({status:$(e.status)??null,error:Q(e.error)})}function HP(e){return String(e??``).replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)}function UP(e,t,n){let r=n.map(HP).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 WP(e){let t=e.localCodexLiveTurnState??QN(e.localEvents),n=new Set,r=GP(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=Q(t.payload.raw),s=$(r.source),c=s===`codex.history.thread_read.incremental`;if(t.type===`turn.started`){let e=$(r.turn_id)??$(Q(r.turn).id);e&&!c&&n.add(e);continue}if(t.type===`turn.completed`||t.type===`turn.failed`){let e=$(r.turn_id)??$(Q(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=Q(r.message),t=Q(e.params),i=$(e.method),a=$(Q(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=Q(r.message);if($(l.scope)===`turn`){let e=Q(l.turn),t=$(e.id);if(!t)continue;let n=$(e.status);n&&JP(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=YP(s,a.status);(!(n.has(a.id)||t.activeTurnIds.has(a.id))&&!c||JP(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=RP(a.id,t,void 0,l);if(i&&r.has(i))continue;let s=i?KP(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 GP(e){let t=new Set,n=new Map;for(let r of e){let e=qP(r);if(!e)continue;let i=RP(e.turnId,e.item,void 0,n);i&&t.add(i)}return t}function KP(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 qP(e){let t=Q(e.payload.raw);if(e.type===`item.completed`){let e=Q(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=Q(t.message);if($(e.method)!==`item/completed`)return null;let n=Q(e.params),r=Q(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=Q(t.message);if($(e.scope)!==`item`)return null;let n={...Q(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 JP(e){return e===`completed`||e===`failed`||e===`interrupted`}function YP(e,t){return e===t&&JP(t)}function XP(e){let t=e.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g,``).replace(/\s+/g,` `).trim();if(t)return t}function ZP(e,t=60){let n=XP(e);if(!n)return;let r=Array.from(n);return r.length<=t?n:r.slice(0,t).join(``).trimEnd()}function QP(e,t){if(t){let e=ZP(t);if(e)return e}if(e.provider!==`codex`||!e.codex)return ZP(`代码审查`);let n=e.codex.target;return n.type===`baseBranch`?ZP(`审查 ${n.branch} 分支改动`):n.type===`custom`?ZP(n.instructions):n.type===`commit`?ZP(n.title||`审查提交 ${n.sha.slice(0,12)}`):ZP(`审查未提交更改`)}function $P(e){if(typeof e!=`string`)return;let t=XP(e);if(t)return t}function eF(e){let t=0;for(let n of Object.values(e))n.some(e=>e.trim().length>0)&&(t+=1);return t}function tF(e){return!Number.isFinite(e)||e<=0?new Date().toISOString():new Date(e*1e3).toISOString()}async function nF(e){if(!(await d.default.stat(e)).isDirectory())throw Error(`Project path is not a directory: ${e}`)}var rF=class{indexPath;eventsDir;sessions=new Map;rawEventsCacheBySession=new Map;compactedRawEventsCacheBySession=new Map;pendingRawMutationsBySession=new Map;ready;writeQueue=Promise.resolve();constructor(e){this.baseDir=e,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}async flushRawCompactions(e){await this.ready}async shutdown(){await this.ready}async upsertSession(e){await this.ready;let t=iF(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,iF({...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)&&(TF(t)||await this.enqueueRawSessionWrite(t.sessionId,async()=>{if(_F(t)){let e=wF([...await this.readSessionRawEventsLocked(t.sessionId),t]);await this.replaceRawEventFile(t.sessionId,e),this.rawEventsCacheBySession.set(t.sessionId,e),this.compactedRawEventsCacheBySession.set(t.sessionId,dF(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=vF(await this.readSessionRawEventsLocked(e),r,n);await this.replaceRawEventFile(e,t);let a=dF(t);i=fF(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){if(await this.ready,!this.sessions.has(e))return[];let n=Math.max(1,t),r=this.readSessionRawEventsFromCache(e);if(r!==void 0)return r.slice(-n);let i=[];return await this.enqueueWrite(async()=>{i=(await this.readSessionRawEventsLocked(e)).slice(-n)}),i}async getSessionRawEventsCompacted(e,t=300){return(await this.getSessionRawEventsCompactedWithCoverage(e,t)).rawEvents}async getSessionRawEventsCompactedWithCoverage(e,t=300){if(await this.ready,!this.sessions.has(e))return{rawEvents:[],coveredToRawSeq:null};let n=Math.max(1,t),r=this.readSessionRawEventsCompactedWithCoverageFromCache(e);if(r!==void 0)return lF(r,n);let i={rawEvents:[],coveredToRawSeq:null};return await this.enqueueWrite(async()=>{i=lF(await this.readSessionRawEventsCompactedWithCoverageLocked(e),n)}),i}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 wm(i.filter(e=>e.rawSeq>t)).slice(0,r);let a=[];return await this.enqueueWrite(async()=>{a=wm((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 cF(t);let n=null;return await this.enqueueWrite(async()=>{n=cF(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=`${sF(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=>sF(e)).join(`
526
+ `);await uF(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(gF(e)){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}if(n&&hF(e,n)<0){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}mF(r,e)}}async readSessionRawEventsCompactedLocked(e){return(await this.readSessionRawEventsCompactedWithCoverageLocked(e)).rawEvents}async readSessionRawEventsCompactedWithCoverageLocked(e){let t=this.compactedRawEventsCacheBySession.get(e);if(t)return pF(t);let n=dF(await this.readSessionRawEventsLocked(e));return this.compactedRawEventsCacheBySession.set(e,n),pF(n)}async readSessionRawEventsLocked(e){let t=this.rawEventsCacheBySession.get(e);if(t)return t;let n=p.default.join(this.eventsDir,`${e}.raw.jsonl`),r;try{r=await d.default.readFile(n,`utf8`)}catch(t){if(t.code===`ENOENT`)return this.rawEventsCacheBySession.set(e,[]),[];throw t}let i=r.split(`
527
+ `).map(e=>e.trim()).filter(Boolean),a=[];for(let e of i)try{let t=JSON.parse(e);if(!aF(t)||t.kind!==`provider.raw`)continue;let n=oF(t.rawSeq);a.push({value:t,...n===void 0?{}:{rawSeq:n}})}catch{}if(a.length===0)return this.rawEventsCacheBySession.set(e,[]),[];let o=a.some(e=>e.rawSeq===void 0),s=a.map((e,t)=>({...e.value,rawSeq:e.rawSeq??t+1})),c=[];for(let t of s){let n=Pl.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.`);c.push(t)}}if(o){let e=c.map(e=>sF(e)).join(`
528
+ `),t=e?`${e}\n`:``;await d.default.writeFile(n,t,`utf8`)}return this.rawEventsCacheBySession.set(e,c),c}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 pF(t);let n=this.rawEventsCacheBySession.get(e);if(!n)return;let r=dF(n);return this.compactedRawEventsCacheBySession.set(e,r),pF(r)}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 iF(e){let t=e.projectPath?.trim()||e.projectId;return t===e.projectId?e:{...e,projectId:t}}function aF(e){return typeof e==`object`&&!!e}function oF(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<=0))return e}function sF(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 cF(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 lF(e,t){return{rawEvents:e.rawEvents.slice(-Math.max(1,t)),coveredToRawSeq:e.coveredToRawSeq}}async function uF(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 dF(e){let t=Cm(e),n=t.map(e=>e),r=new Map;for(let[e,t]of n.entries()){let n=Em(t);n&&r.set(n.key,e)}return{slots:n,indexByKey:r,dense:t,coveredToRawSeq:cF(e)?.max??null}}function fF(e){return e.dense||=e.slots.filter(e=>e!==null),e.dense}function pF(e){return{rawEvents:fF(e),coveredToRawSeq:e.coveredToRawSeq}}function mF(e,t){e.coveredToRawSeq=e.coveredToRawSeq===null?t.rawSeq:Math.max(e.coveredToRawSeq,t.rawSeq);let n=Em(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=Dm(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 hF(e,t){let n=e.ts.localeCompare(t.ts);return n===0?e.eventId.localeCompare(t.eventId):n}function gF(e){if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=aF(e.payload.raw)?e.payload.raw:{},n=aF(t.message)?t.message:{};return(typeof n.method==`string`?n.method:typeof t.method==`string`?t.method:``)===`item/completed`}function _F(e){if(gF(e)||e.type===`turn.completed`||e.type===`turn.failed`)return!0;if(e.type!==`native.raw`)return!1;let t=aF(e.payload.raw)?e.payload.raw:{},n=aF(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 vF(e,t,n){if(n?.replaceMissing)return yF(e,t,n);let r=[...e].sort(CF),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&&bF(n,e)&&(r[t]=SF(n,e));continue}let n={...e,rawSeq:a};a+=1,i.set(n.eventId,r.length),r.push(n)}return wF(r.sort(CF)).sort(CF)}function yF(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(CF),c=1;for(let t of e)c=Math.max(c,t.rawSeq+1);return wF(s.map(e=>{let t=r.get(e.eventId);if(t)return bF(t,e)?SF(t,e):{...e,rawSeq:t.rawSeq};let n={...e,rawSeq:c};return c+=1,n})).sort(CF)}function bF(e,t){return xF(e)&&xF(t)}function xF(e){return e.type===`native.raw`?AF((aF(e.payload.raw)?e.payload.raw:{}).source)===`codex.history.thread_read`:!1}function SF(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function CF(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 wF(e){let t=Tm(e).filter(e=>!TF(e)),n=new Set;for(let e of t){let t=EF(e);t&&n.add(t)}return n.size===0?t:t.filter(e=>{let t=DF(e);return!t||!n.has(t)})}function TF(e){let t=aF(e.payload.raw)?e.payload.raw:{},n=AF(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=aF(t.message)?t.message:{};return AF(r.method)??AF(t.method)?!1:aF((aF(r.result)?r.result:{}).turn)}function EF(e){if(e.type===`item.completed`){let t=aF(e.payload.raw)?e.payload.raw:{},n=aF(t.item)?t.item:{};return OF(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=aF(e.payload.raw)?e.payload.raw:{},n=aF(t.message)?t.message:{},r=aF(n.params)?n.params:{};if((AF(n.method)??AF(t.method))!==`item/completed`)return null;let i=aF(r.item)?r.item:{};return OF(e.sessionId,i)}function DF(e){if(e.type===`item.updated`){let t=aF(e.payload.raw)?e.payload.raw:{},n=aF(t.item)?t.item:{},r=AF(n.original_method)??AF(n.originalMethod)??``,i=aF(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`)&&!kF(r)?null:OF(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=aF(e.payload.raw)?e.payload.raw:{},n=aF(t.message)?t.message:{},r=aF(n.params)?n.params:{};if(!kF(AF(n.method)??AF(t.method)??``))return null;let i=aF(r.msg)?r.msg:{},a=AF(r.itemId)??AF(r.item_id)??AF(i.itemId)??AF(i.item_id);return a?`${e.sessionId}|${a}`:null}function OF(e,t){let n=AF(t.id)??AF(t.item_id)??AF(t.itemId);return n?`${e}|${n}`:null}function kF(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function AF(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function jF(e){return!e||e.providerMode!==`native`?!1:e.interactionLockReason===`external_turn_running`?!0:e.status!==`running`}const MF=e=>e.filter(e=>!(e.kind===`system`&&e.title===`Turn Usage`)),NF=(e,t)=>e.find(e=>e.itemId===t||e.id===t)??null,PF=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,FF=e=>{let t=MF(Hp(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 IF(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=NF(FF({sessionId:e.sessionId,rawEvents:t}).timelineItems,e.itemId);return n?{item:n}:null}function LF(e,t){if(e&&e!==t)throw rT()}async function RF(e){let t=zF(e.authService,e.refreshToken);e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:BF(t)},`auth refresh attempt`);try{let t=await e.execute(),n=zF(e.authService,e.refreshToken),r=zF(e.authService,t.refreshToken);return e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshedDeviceId:t.deviceId,previousRefreshToken:BF(n),nextRefreshToken:BF(r)},`auth refresh succeeded`),t}catch(t){let n=zF(e.authService,e.refreshToken);throw e.logger?.warn?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:BF(n),error:VF(t)},`auth refresh failed`),t}}function zF(e,t){return e.inspectRefreshToken?.(t)??{tokenRecordState:`missing`}}function BF(e){return{claimDeviceId:e.claimDeviceId??null,claimExpAt:e.claimExpAt??null,claimIssuedAt:e.claimIssuedAt??null,claimJtiSuffix:HF(e.claimJti),claimType:e.claimType??null,latestActiveTokenCreatedAt:e.latestActiveTokenCreatedAt??null,latestActiveTokenJtiSuffix:HF(e.latestActiveTokenJti),tokenRecordCreatedAt:e.tokenRecordCreatedAt??null,tokenRecordDeviceId:e.tokenRecordDeviceId??null,tokenRecordRevokedAt:e.tokenRecordRevokedAt??null,tokenRecordState:e.tokenRecordState}}function VF(e){return Qw(e)?{code:e.code,message:String(e),status:e.status}:e instanceof Error?{message:e.message,name:e.name}:{message:String(e)}}function HF(e){return e?e.slice(-8):null}function UF(e,t,n,r){if(!r)return t;let i={gatewayId:t.gatewayId,deviceId:t.deviceId,mobilePublicKey:r.publicKey,pairingContext:{pairingCode:WF(n),signedAt:new Date().toISOString()}};return{...t,gatewayIdentity:e.identity,pairingConfirmation:Xm(e.identity,e.privateKeyPem,i)}}function WF(e){return e.replace(/\s+/gu,``).toUpperCase()}async function GF(e,t){try{let n=Lf.parse(e);switch(n.method){case`auth.refresh`:{let e=await RF({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 LF(n.params.deviceId??t.relayDeviceId,e.deviceId),Rf.parse({method:n.method,result:e})}case`projects.list`:{let e=await t.sessionManager.listProjects();return Rf.parse({method:n.method,result:{projects:e}})}case`codex.accounts.get`:{let e=await t.sessionManager.getCodexAccounts();return Rf.parse({method:n.method,result:e})}case`codex.accounts.save`:{let e=await t.sessionManager.saveCurrentCodexAccount();return Rf.parse({method:n.method,result:e})}case`codex.accounts.switch`:{let e=await t.sessionManager.switchCodexAccount(n.params.accountId);return Rf.parse({method:n.method,result:e})}case`codex.accounts.delete`:{let e=await t.sessionManager.deleteSavedCodexAccount(n.params.accountId);return Rf.parse({method:n.method,result:e})}case`gateway.settings.get`:return Rf.parse({method:n.method,result:t.gatewaySettings.get()});case`gateway.settings.update`:{let e=await t.gatewaySettings.update(n.params);return Rf.parse({method:n.method,result:e})}case`gateway.update.get`:{let e=await t.updateService.getOrCheckInfo(`mobile`);return Rf.parse({method:n.method,result:e})}case`codex.appServer.restart`:{let e=await t.sessionManager.restartCodexAppServer();return Rf.parse({method:n.method,result:e})}case`gateway.update.apply`:{let e=await t.updateService.applyUpdate(n.params.requestedBy??`mobile`);return Rf.parse({method:n.method,result:e})}case`projects.discovery.get`:{let e=await t.projectDiscoveryService.getProjects();return Rf.parse({method:n.method,result:e})}case`projects.discovery.refresh`:{let e=await t.projectDiscoveryService.refreshProjects();return Rf.parse({method:n.method,result:e})}case`projects.create`:{let e=await t.sessionManager.createProject({path:n.params.path,title:n.params.title});return Rf.parse({method:n.method,result:{project:e}})}case`projects.delete`:if(!await t.sessionManager.deleteProject(n.params.projectId))throw qF(n.method,`NOT_FOUND`,404,`Project not found`);return Rf.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 Rf.parse({method:n.method,result:e})}case`workspace.directories.create`:{let e=await t.fsService.createDirectoryUnrestricted(n.params.path,n.params.name,200);return Rf.parse({method:n.method,result:e})}case`workspace.entries.list`:{let e=await t.workspaceFileService.listEntries(n.params.locator,n.params.limit??200);return Rf.parse({method:n.method,result:e})}case`workspace.files.resolve`:{let e=await t.workspaceFileService.resolveFile(n.params.locator);return Rf.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 Rf.parse({method:n.method,result:e})}case`workspace.files.preparePreview`:{let e=t.relayPreviewBaseUrl?.trim(),r=t.gatewayId?.trim();if(!e||!r)throw qF(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 Rf.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 Rf.parse({method:n.method,result:{sessions:e}})}case`sessions.discovery.list`:{let e=await t.projectDiscoveryService.listProjectSessions(n.params.projectPath);return Rf.parse({method:n.method,result:e})}case`sessions.get`:{let e=await t.sessionManager.getProjectSessionSummary(n.params.projectId,n.params.sessionId);if(!e)throw qF(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return Rf.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 qF(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return Rf.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}),Rf.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 Rf.parse({method:n.method,result:r})}case`sessions.readableItem.get`:{let e=await IF({sessionManager:t.sessionManager,readableItemDetailLookup:t.readableItemDetailLookup,projectId:n.params.projectId,sessionId:n.params.sessionId,itemId:n.params.itemId});if(!e)throw qF(n.method,`NOT_FOUND`,404,`Readable item ${n.params.itemId} not found`);return Rf.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`),Rf.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 Rf.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 Rf.parse({method:n.method,result:e})}case`devices.list`:return Rf.parse({method:n.method,result:{devices:t.authService.listDevices()}});case`devices.revoke`:if(!await t.authService.revokeDevice(n.params.deviceId))throw qF(n.method,`NOT_FOUND`,404,`Device ${n.params.deviceId} not found`);return Rf.parse({method:n.method,result:{revoked:!0}});default:{let e=n;throw qF(void 0,`INTERNAL`,500,`Unhandled relay RPC method: ${JSON.stringify(e)}`)}}}catch(e){throw KF(e)}}function KF(e){if(Qw(e))switch(e.code){case`REFRESH_TOKEN_REVOKED`:case`DEVICE_REVOKED`:case`REFRESH_TOKEN_DEVICE_MISMATCH`:return qF(`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 qF(`NOT_FOUND`,e.status,String(e),e.details);case`SESSION_TURN_CONFLICT`:case`PROJECT_DELETE_CONFLICT`:case`CODEX_APP_SERVER_RESTART_CONFLICT`:return qF(`BAD_REQUEST`,e.status,String(e),e.details);default:return qF(e.status>=500?`INTERNAL`:`BAD_REQUEST`,e.status,String(e),e.details)}let t=Bf.safeParse(e);if(t.success)return t.data;let n=zf.safeParse(e);if(n.success)return qF(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 qF(t.code,t.status,t.message,t.details)}let r=String(e);return e instanceof Error&&e.name===`ZodError`?qF(`BAD_REQUEST`,400,r):JF(e)?qF(`UNAUTHORIZED`,401,r):YF(r)?qF(`BAD_REQUEST`,400,r):qF(`INTERNAL`,500,r)}function qF(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 Bf.parse({...o?{method:o}:{},code:s,status:c,message:l,...u===void 0?{}:{details:u}})}function JF(e){return Qw(e)&&(e.code===`REFRESH_TOKEN_REVOKED`||e.code===`DEVICE_REVOKED`||e.code===`REFRESH_TOKEN_DEVICE_MISMATCH`)||vT(e)}function YF(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 XF(e,t){return e.length===0?[]:t===void 0?[...e]:e.filter(e=>e.rawSeq>t)}function ZF(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 QF(e){return{baseRawEvents:Cm(e.rawEvents.filter(t=>t.rawSeq<=e.cursorRawSeq)),nextRawEvents:Cm(e.rawEvents)}}function $F(e,t){return t&&`kind`in t&&t.kind===`bootstrapping`?t:{kind:`bootstrapping`,sessionId:e,previousReadyState:t??null,queuedEnvelopes:[]}}function eI(e,t){let n=e.previousReadyState;if(!n)return{previousReadyState:null,nextReadyState:null,replayedEnvelopes:[]};let r=XF(e.queuedEnvelopes,ZF(n)),i=n;for(let e of r)i=t(i,e);return{previousReadyState:n,nextReadyState:i,replayedEnvelopes:r}}function tI(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_${Xw(12)}`,ts:new Date().toISOString(),payload:{raw:{decision:e.decision,reason:e.reason,snapshotId:e.snapshotId,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}}}}function nI(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 rI(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 iI(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 aI(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_${Xw(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 oI(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 sI=1e3,cI=(e,t)=>`${e}::${t}`,lI=e=>e.purpose===`detail_view`&&e.bootstrapMode===`readable`,uI=e=>{let t=new Map;for(let n of e)t.set(n.sessionId,n);return[...t.values()]},dI=e=>{let t;for(let n of e)(t===void 0||n.rawSeq>t)&&(t=n.rawSeq);return t},fI=e=>e[e.length-1]?.rawSeq,pI=(e,t)=>{let n=dI(e);return t==null?n??null:n===void 0?t:Math.max(t,n)},mI=e=>pI(e.rawEvents,e.coveredToRawSeq)??void 0,hI=e=>{let t=pI(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]}},gI=e=>typeof e==`object`&&e?e:{},_I=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}},vI=e=>{if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=gI(n),r=_I(e,`id`),i=_I(e,`header`),a=_I(e,`question`);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=gI(e),n=_I(t,`label`);if(!n)return null;let r=_I(t,`description`)??n,i=_I(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},yI=(e,t)=>{let n=Vp(e,t),r=new Map,i=new Map;for(let e of n){if(e.type===`tool.permission.requested`){let t=gI(e.payload.raw),n=_I(t,`requestId`,`request_id`);if(!n)continue;let i=gI(t.rawParams??t.raw_params),a=gI(i.networkApprovalContext??i.network_approval_context);r.set(n,{requestId:n,sessionId:e.sessionId,..._I(t,`toolName`,`tool_name`)?{toolName:_I(t,`toolName`,`tool_name`)}:{},..._I(t,`reason`)?{reason:_I(t,`reason`)}:{},..._I(i,`command`)?{command:_I(i,`command`)}:{},..._I(i,`cwd`)?{cwd:_I(i,`cwd`)}:{},..._I(i,`grantRoot`,`grant_root`)?{grantRoot:_I(i,`grantRoot`,`grant_root`)}:{},..._I(a,`host`)?{networkHost:_I(a,`host`)}:{},..._I(a,`protocol`)?{networkProtocol:_I(a,`protocol`)}:{},..._I(t,`itemId`,`item_id`)?{itemId:_I(t,`itemId`,`item_id`)}:{},..._I(t,`turnId`,`turn_id`)?{turnId:_I(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`tool.permission.resolved`){let t=_I(gI(e.payload.raw),`requestId`,`request_id`);t&&r.delete(t);continue}if(e.type===`user.input.requested`){let t=gI(e.payload.raw),n=_I(t,`requestId`,`request_id`);if(!n)continue;i.set(n,{requestId:n,sessionId:e.sessionId,questions:vI(t.questions),..._I(t,`itemId`,`item_id`)?{itemId:_I(t,`itemId`,`item_id`)}:{},..._I(t,`turnId`,`turn_id`)?{turnId:_I(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`user.input.resolved`){let t=_I(gI(e.payload.raw),`requestId`,`request_id`);t&&i.delete(t)}}return{pendingApprovals:[...r.values()],pendingUserInputs:[...i.values()]}},bI=e=>{let t=e.rawEventsAlreadyMatchDetailTransport===!0?e.rawEvents:CI({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=e.target.purpose===`detail_view`?dl({provider:e.target.provider,rawEvents:t}):null,r=e.target.purpose===`detail_view`?MF(Hp(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`?yI(e.target.sessionId,t):{pendingApprovals:[],pendingUserInputs:[]};return{detailTransportRawEvents:t,contextUsage:n,timelineItems:i.timelineItems,pendingApprovals:a.pendingApprovals,pendingUserInputs:a.pendingUserInputs}},xI=e=>{let t=CI({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=bI({target:e.target,rawEvents:t,rawEventsAlreadyMatchDetailTransport:!0});return hI({target:e.target,rawEvents:e.rawEvents,coveredToRawSeq:e.coveredToRawSeq,detailTransportRawEvents:t,contextUsage:n.contextUsage,timelineItems:n.timelineItems,pendingApprovals:n.pendingApprovals,pendingUserInputs:n.pendingUserInputs})},SI=(e,t)=>{let n=jI(e.rawEvents,t),r=pI(n,mI(e)),i=CI({rawEvents:jI(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),a=bI({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}},CI=e=>{if(e.detailLevel!==`compact`||e.rawEvents.length===0)return e.rawEvents;let t=wI(e.rawEvents[0]?.sessionId??``,e.rawEvents);return WE(e.rawEvents,e.detailLevel,{preserveIncompleteCommandOutput:!0,additionalCompletedCommandItemKeys:t})},wI=(e,t)=>{if(!e||t.length===0)return new Set;let n=new Set,r=Hp(e,t,[]);for(let t of r){if(t.itemType!==`command_execution`||!t.itemId||t.status!==`completed`&&t.status!==`failed`)continue;let r=OI(e,t.itemId);r&&n.add(r)}return n},TI=e=>_I(e,`id`,`itemId`,`item_id`)??null,EI=e=>{if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`)return TI(gI(gI(e.payload.raw).item));if(e.type!==`native.raw`)return null;let t=gI(gI(e.payload.raw).message),n=gI(t.params),r=gI(n.item),i=gI(n.msg);return TI(r)??TI(gI(t.item))??_I(n,`itemId`,`item_id`)??_I(i,`itemId`,`item_id`)??null},DI=e=>{if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=gI(e.payload.raw);return(_I(gI(t.message),`method`)??_I(t,`method`))===`item/completed`},OI=(e,t)=>t?`${e}|${t}`:null,kI=e=>OI(e.sessionId,EI(e)),AI=e=>{let t=kI(e);if(t)return`item:${t}`;let n=Em(e);return n?`delta:${n.key}`:null},jI=(e,t)=>{let n=[...e],r=kI(t),i=AI(t),a=Em(t),o=t;if(i&&a)for(let e=n.length-1;e>=0;--e){let r=n[e];if(!r||AI(r)!==i||!Em(r))continue;let a=Dm(r,t);if(a){n[e]=null,o=a;break}}return n.push(o),!r||!DI(t)?n.filter(e=>e!==null):n.filter(e=>e!==null&&(e.eventId===o.eventId||kI(e)!==r||!Em(e)))},MI=e=>{let t=NI(e);if(!t)return null;let n=TI(t),r=gI(t.payload),i=_I(t,`output_delta`,`outputDelta`)??_I(r,`output_delta`,`outputDelta`);return!n||!i?null:{itemId:n,delta:i}},NI=e=>{if(e.type===`item.updated`){let t=gI(gI(e.payload.raw).item);return PI(t)?t:null}if(e.type!==`native.raw`)return null;let t=gI(e.payload.raw),n=gI(t.message);if((_I(n,`method`)??_I(t,`method`))!==`item/updated`)return null;let r=gI(gI(n.params).item);return PI(r)?r:null},PI=e=>{let t=_I(e,`type`);return t===`commandExecution`||t===`command_execution`},FI=e=>e.includes(`[compact history preview:`),II=(e,t)=>{let n=MI(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`||FI(i.output))return null;let a=jI(e.rawEvents,t),o=CI({rawEvents:jI(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),s={...i,output:`${i.output}${n.delta}`},c=[...e.timelineItems];c[r]=s;let l=mI(e),u=pI(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}]}}},LI=e=>Buffer.byteLength(JSON.stringify(rI(e)),`utf8`),RI=e=>{let t=Math.max(1,Math.floor(e.maxChunkBytes??524288)),n=[],r=(t,n)=>LI({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},zI=(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)}},BI=(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)}},VI=(e,t,n,r)=>{let i={},a=Vp(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=_I(gI(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),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 HI(e){let t,n=e.previousState;for(let r of e.envelopes){let i=SI(n,r),a=VI(e.sessionId,r,n,i);a&&(t={...t??{},...a}),n=i}return t}const UI=e=>{if(!e)return{stateFound:!1};let t=dI(e.rawEvents),n=fI(e.rawEvents),r=mI(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}},WI=e=>e?e.kind===`ready`?UI(e):{stateFound:!0,kind:e.kind,sessionId:e.sessionId,queuedEnvelopeCount:e.queuedEnvelopes.length,previousReadyState:UI(e.previousReadyState)}:{stateFound:!1},GI=(e,t)=>{let n,r,i;try{n=Ec(e.previousState.timelineItems,e.nextState.timelineItems),r=zI(e.previousState.pendingApprovals,e.nextState.pendingApprovals),i=BI(e.previousState.pendingUserInputs,e.nextState.pendingUserInputs)}catch(n){throw t?.(`stream.readable.delta.build.error`,{sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,previousState:UI(e.previousState),nextState:UI(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=mI(e.nextState);return o===void 0?null:{provider:e.previousState.provider,sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,fromRawSeq:mI(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 KI(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,lastHydratedExternalUpdatedAt:e.lastHydratedExternalUpdatedAt??null}:{sessionFound:!1}}function qI(e){return e===`external_turn_running`?e:void 0}function JI(e){return{status:e.status,...e.updatedAt?{updatedAt:e.updatedAt}:{},...e.interactionLockReason?{interactionLockReason:e.interactionLockReason}:{}}}var YI=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=uI(t),i=new Set(r.map(e=>e.sessionId)),a=this.sessionHub.getSubscriptions(e);this.log(`stream.subscribe.received`,{clientId:e,replace:n,incomingSubscriptionCount:t.length,dedupedSubscriptionCount:r.length,subscriptions:r.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,r);for(let t of i)this.sessionHub.pauseSession(e,t);this.sessionHub.replaceSubscriptions(e,r,n),this.syncReadableLiveProjectionSubscriptions(e,a,r,n);try{for(let t of r)try{await this.syncSessionStreamSubscription(e,t)}catch(n){throw lI(t)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}}finally{for(let t of i)this.sessionHub.resumeSession(e,t)}};clearState=(e,t)=>{let n=cI(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:WI(r),hadPendingDelta:!!i,pendingDeltaFromRawSeq:i?mI(i.previousState)??null:null,pendingDeltaToRawSeq:i?mI(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?NF(t.timelineItems,e.itemId):null,r=n&&`deferredDetail`in n&&n.deferredDetail!==void 0;if(n&&!r){let r=PF(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?mI(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=FF({sessionId:e.sessionId,rawEvents:a}),s=this.seedReadableItemDetailCache({projectId:e.projectId,sessionId:e.sessionId,timelineItems:o.timelineItems}),c=NF(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(!lI(r))continue;let t=cI(n,e.sessionId),i=this.stateByClientSession.get(t);if(!i)continue;if(i.kind===`bootstrapping`){i.queuedEnvelopes.push(e);continue}let a=II(i,e);if(a){this.flushPendingReadableLiveDelta(n,e.sessionId),this.stateByClientSession.set(t,a.nextState),this.sessionHub.sendSessionMessageToClient(n,e.sessionId,iI(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=SI(i,e);this.stateByClientSession.set(t,o);let s=VI(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 lI(r)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:n,sessionId:e.sessionId}),t}finally{this.sessionHub.resumeSession(n,e.sessionId)}}}};sendSessionSnapshot=async(e,t,n)=>{let r=`snap_${Xw(12)}`,{compactedRawEvents:i,detailTransportRawEvents:a,lastRawSeq:o,slimReadableProjection:s,pendingApprovals:c,pendingUserInputs:l}=await this.buildReadableSnapshotProjection(t),u=JI(t);this.sessionHub.sendStreamMessage(e,tI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,...o===void 0?{}:{toRawSeq:o}}));let d=oI(a,sI),f=t.purpose===`detail_view`?oI(s.timelineItems,sI):[],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:fI(i)??null,rawSeqOrderMismatch:o!==fI(i)});for(let n=0;n<m;n+=1){let i=d[n]??[],a=f[n]??[];this.sessionHub.sendStreamMessage(e,nI({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=`snap_${Xw(12)}`,i=this.startReadableLiveProjectionBootstrap({clientId:e,sessionId:t.sessionId});try{let{compactedRawEvents:a,detailTransportRawEvents:o,contextUsage:s,lastRawSeq:c,slimReadableProjection:l,pendingApprovals:u,pendingUserInputs:d}=await this.buildReadableSnapshotProjection(t),f=this.sessionHub.getSubscriptions(e).find(e=>e.sessionId===t.sessionId),p=f?.projectId?.trim()??``;if(!f||!lI(f)||p&&p!==t.projectId||(f.detailLevel??`full`)!==t.detailLevel){this.clearState(e,t.sessionId);return}let m=JI(t),h=hI({target:t,rawEvents:a,coveredToRawSeq:c,detailTransportRawEvents:o,contextUsage:s,timelineItems:l.timelineItems,pendingApprovals:u,pendingUserInputs:d}),g=this.stateByClientSession.get(i),_=XF(g?.kind===`bootstrapping`?g.queuedEnvelopes:[],c),v=HI({sessionId:t.sessionId,previousState:h,envelopes:_});for(let e of _)h=SI(h,e);let y={...m,...v??{}};this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:h.rawEvents,coveredToRawSeq:mI(h),detailTransportRawEvents:h.detailTransportRawEvents,contextUsage:h.contextUsage,timelineItems:h.timelineItems,pendingApprovals:h.pendingApprovals,pendingUserInputs:h.pendingUserInputs});let b=mI(h),x=fI(h.rawEvents);this.sessionHub.sendStreamMessage(e,tI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,...b===void 0?{}:{toRawSeq:b}}));let S=RI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,timelineItems:h.timelineItems,pendingApprovals:h.pendingApprovals,pendingUserInputs:h.pendingUserInputs,contextUsage:h.contextUsage,sessionSummary:y}),C=Math.max(S.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:r,snapshotFormat:`readable`,compactedEventCount:a.length,canonicalRawEventCount:h.rawEvents.length,detailTransportRawEventCount:h.detailTransportRawEvents.length,readableTimelineItemCount:h.timelineItems.length,bufferedReadableDeltaCount:_.length,readableChunkTargetBytes:524288,readableChunkItemCounts:S.map(e=>e.timelineItems.length),readableChunkEstimatedBytes:S.map(e=>e.estimatedByteLength),totalChunks:C,firstRawSeq:h.rawEvents[0]?.rawSeq??null,lastRawSeq:b??null,orderedLastRawSeq:x??null,rawSeqOrderMismatch:b!==x});for(let n=0;n<C;n+=1){let i=S[n];this.sessionHub.sendStreamMessage(e,rI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,chunkIndex:n,totalChunks:C,timelineItems:i?.timelineItems??[],pendingApprovals:n===0?h.pendingApprovals:void 0,pendingUserInputs:n===0?h.pendingUserInputs:void 0,contextUsage:n===0?h.contextUsage:void 0,sessionSummary:n===0?y:void 0}))}}catch(n){throw this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}};sendSessionReadableResumeDelta=async(e,t,n,r)=>{let i=cI(e,t.sessionId),a=await this.sessionManager.getProjectSessionRawEventsWithCoverage(t.projectId,t.sessionId,2**53-1),o=a.rawEvents,s=a.coveredToRawSeq,{baseRawEvents:c,nextRawEvents:l}=QF({rawEvents:o,cursorRawSeq:n}),u=xI({target:t,rawEvents:c,coveredToRawSeq:n}),d=xI({target:t,rawEvents:l,coveredToRawSeq:Math.max(n,s??0)}),f=mI(d),p=this.stateByClientSession.get(i),m=XF(p?.kind===`bootstrapping`?p.queuedEnvelopes:[],f);for(let e of m)d=SI(d,e);let h=mI(u),g=fI(u.rawEvents),_=mI(d),v=fI(d.rawEvents),y=HI({sessionId:t.sessionId,previousState:u,envelopes:[...l.filter(e=>e.rawSeq>n),...m]});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:o.length,baseRawEventCount:c.length,nextRawEventCount:l.length,previousMaxRawSeq:h??null,previousOrderedLastRawSeq:g??null,nextMaxRawSeq:_??null,nextOrderedLastRawSeq:v??null,rawSeqOrderMismatch:h!==g||_!==v,bootstrapState:WI(p),bufferedEnvelopeCount:m.length,previousState:UI(u),nextState:UI(d),sessionSummaryKeys:y?Object.keys(y):[],sessionSummaryStatus:y?.status??null,sessionSummaryUpdatedAt:y?.updatedAt??null}),this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:d.rawEvents,coveredToRawSeq:mI(d),detailTransportRawEvents:d.detailTransportRawEvents,contextUsage:d.contextUsage,timelineItems:d.timelineItems,pendingApprovals:d.pendingApprovals,pendingUserInputs:d.pendingUserInputs});let b=mI(d)??n;this.sessionHub.sendStreamMessage(e,tI({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`delta`,reason:r,fromRawSeq:n,...b===void 0?{}:{toRawSeq:b}}));let x=GI({previousState:u,nextState:d,sessionSummary:y},this.log);this.log(`stream.readable.resume.delta`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,reason:r,cursorRawSeq:n,emittedDelta:!!x,deltaFromRawSeq:x?.fromRawSeq??n,deltaToRawSeq:x?.toRawSeq??b??null,timelineUpsertCount:x?.timelineUpserts.length??0,timelineRemovalCount:x?.timelineRemovals.length??0,timelineTextDeltaPatchCount:x?.timelineTextDeltaPatches.length??0,pendingApprovalUpsertCount:x?.pendingApprovalUpserts.length??0,pendingUserInputUpsertCount:x?.pendingUserInputUpserts.length??0,sessionSummaryStatus:x?.sessionSummary?.status??null,sessionSummaryUpdatedAt:x?.sessionSummary?.updatedAt??null}),this.sessionHub.sendSessionMessageToClient(e,t.sessionId,iI(x??{provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,fromRawSeq:n,toRawSeq:b,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=PF(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=mI(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(lI).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)lI(t)||this.clearState(e,t.sessionId)}startReadableLiveProjectionBootstrap(e){let t=cI(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=$F(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:WI(n),clearedPendingDelta:!!r,carriedPendingEnvelopeCount:a.length}),t}getReadableDeliveredReadyState(e,t){let n=cI(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?XF(t.nextState.rawEvents,e?mI(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=mI(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=hI(e);this.stateByClientSession.set(cI(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:UI(t)})}primeReadableBootstrapForSubscriptions(e,t){for(let n of t)lI(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,tI({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 sT(n,t);let i={sessionId:t,projectId:n,provider:r.provider,status:r.status,updatedAt:r.updatedAt,interactionLockReason:qI(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:KI(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,interactionLockReason:qI(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:KI(i)}),a}async buildReadableSnapshotProjection(e){let t=await this.sessionManager.getProjectSessionRawEventsCompactedWithCoverage(e.projectId,e.sessionId,2**53-1),n=t.rawEvents,r=CI({rawEvents:n,detailLevel:e.detailLevel}),i=bI({target:e,rawEvents:r,rawEventsAlreadyMatchDetailTransport:!0}),a=pI(n,t.coveredToRawSeq)??void 0;return{compactedRawEvents:n,detailTransportRawEvents:r,contextUsage:i.contextUsage,lastRawSeq:a,slimReadableProjection:{timelineItems:i.timelineItems,consumedMessageIds:[]},pendingApprovals:i.pendingApprovals,pendingUserInputs:i.pendingUserInputs}}restoreReadableLiveProjectionAfterBootstrapFailure(e){let t=cI(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=eI(n,SI);if(!a.previousReadyState||!r||!lI(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:WI(n),currentSubscriptionFound:!!r,currentSubscriptionProjectId:i||null,currentSubscriptionDetailLevel:r?.detailLevel??null,previousReadyState:UI(a.previousReadyState),nextReadyState:UI(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:UI(a.nextReadyState)});return}let o=HI({sessionId:e.sessionId,previousState:a.previousReadyState,envelopes:a.replayedEnvelopes}),s=GI({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:UI(a.nextReadyState),emittedDelta:!1});return}this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:UI(a.nextReadyState),emittedDelta:!0,deltaFromRawSeq:s.fromRawSeq??null,deltaToRawSeq:s.toRawSeq}),this.sessionHub.sendSessionMessageToClient(e.clientId,a.previousReadyState.sessionId,iI(s))}sendReadableLiveDeltaNow(e){let t=GI({previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary},this.log);t&&this.sessionHub.sendSessionMessageToClient(e.clientId,e.previousState.sessionId,iI(t))}flushPendingReadableLiveDelta(e,t){let n=cI(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=cI(e.clientId,e.previousState.sessionId),n=this.pendingDeltaByClientSession.get(t);if(n){let t=XI({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 XI(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 ZI(e){return e.sendProviderRaw?`relay_ws`:`direct_ws`}function QI(e){let t=performance.now(),n=JSON.stringify(e);return{payload:n,byteLength:Buffer.byteLength(n),serializeDurationMs:Number((performance.now()-t).toFixed(3))}}function $I(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 eL=class{clients=new Map;clientIdsBySessionId=new Map;deliveryStateByClientSession=new Map;addClient(e,t){let n=`ws_${Xw(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??QI(t),i=$I(t);return i&&Fj(`stream.snapshot.chunk.outbound`,{clientId:e.id,deviceId:e.deviceId,transport:ZI(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 tL=1200,nL=process.env.NATIVE_SESSION_WATCH_DEBUG===`1`||process.env.EXPO_PUBLIC_NATIVE_SESSION_WATCH_DEBUG===`1`;var rL=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){nL&&(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){if(n.lastTriggeredAt=Date.now(),n.syncInFlight){n.rerunRequested=!0;return}n.syncInFlight=!0,n.rerunRequested=!1,n.lastSyncStartedAt=Date.now(),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 r=await this.options.sessionManager.getProjectSessionSummary(n.projectId,n.sessionId);if(!r||r.providerMode!==`native`||r.provider!==`codex`&&r.provider!==`claude`){this.logDebug(`sync.stop.unwatchable_summary`,{projectId:n.projectId,sessionId:n.sessionId,summarySource:r?.source,summaryProvider:r?.provider,summaryProviderMode:r?.providerMode,summaryStatus:r?.status}),this.stopState(e);return}if(n.provider=r.provider,!jF(r)){this.clearCatchupRetry(n,{resetAttempts:!0}),n.stableIdleSyncCount=0,this.logDebug(`sync.skip.gateway_live`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,summaryStatus:r.status,interactionLockReason:r.interactionLockReason,watchedPath:n.watchedPath,ownerClientCount:n.ownerClientIds.size});return}let i=await this.options.sessionManager.syncProjectSessionHistory(n.projectId,n.sessionId);n.lastSyncCompletedAt=Date.now(),this.applyWatchPath(n,i.nativeWatchPath);let a=n.lastObservedRawSeq,o=n.lastObservedRawEventCount,s=this.resolveObservedRawSeq(i),c=s>a||i.rawEvents.length>o;c?this.clearCatchupRetry(n,{resetAttempts:!0}):this.maybeScheduleWatchCatchupRetry(e,n,t,i,{previousObservedRawSeq:a,previousObservedRawEventCount:o,nextObservedRawSeq:s,nextObservedRawEventCount:i.rawEvents.length}),n.lastObservedRawSeq=Math.max(n.lastObservedRawSeq,s),n.lastObservedRawEventCount=Math.max(n.lastObservedRawEventCount,i.rawEvents.length),i.session.status!==`running`&&!i.historyUpdated?n.stableIdleSyncCount+=1:n.stableIdleSyncCount=0,this.logDebug(`sync.result`,{projectId:n.projectId,sessionId:n.sessionId,reason:t,status:i.session.status,interactionLockReason:i.session.interactionLockReason,historyUpdated:i.historyUpdated,statusChanged:i.statusChanged,refreshMode:i.refreshMode,fromRawSeq:i.fromRawSeq,toRawSeq:i.toRawSeq,nativeWatchPath:i.nativeWatchPath,rawEventCount:i.rawEvents.length,cursorAdvanced:c,previousObservedRawSeq:a,previousObservedRawEventCount:o,nextObservedRawSeq:s,nextObservedRawEventCount:i.rawEvents.length,watchCatchupRetryCount:n.watchCatchupRetryCount,stableIdleSyncCount:n.stableIdleSyncCount});let l=iL(i.session),u=sL(l);if(i.historyUpdated||i.statusChanged||aL(t)&&cL(t,n.lastSentConfigSummary,u)){let e=this.options.createExternalUpdateMessage({provider:i.session.provider,sessionId:i.session.id,projectId:i.session.projectId,updatedAt:i.session.updatedAt,status:i.session.status,interactionLockReason:i.session.interactionLockReason,refreshMode:i.refreshMode,fromRawSeq:i.fromRawSeq,toRawSeq:i.toRawSeq,historyUpdated:i.historyUpdated,statusChanged:i.statusChanged,sessionSummary:l});for(let t of n.ownerClientIds)this.options.sendStreamMessage(t,e);u&&(n.lastSentConfigSummary=u)}i.historyUpdated&&await this.options.refreshDetailSessionSnapshots?.({projectId:n.projectId,sessionId:n.sessionId,reason:`external_history_updated`,refreshMode:i.refreshMode,fromRawSeq:i.fromRawSeq,toRawSeq:i.toRawSeq})}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:tL,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`)},tL))))}stateKey(e,t){return JSON.stringify([e,t])}};function iL(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 aL(e){return e===`lease_added`||e===`watch`||e===`watch_catchup`||e===`reconcile`||e===`rerun`}function oL(e){return!!(e&&Object.prototype.hasOwnProperty.call(e,`model`)||e?.sessionTurnConfig||e?.sessionTurnConfigUpdatedAt)}function sL(e){if(oL(e))return{...e&&Object.prototype.hasOwnProperty.call(e,`model`)?{model:e.model??null}:{},...e?.sessionTurnConfig?{sessionTurnConfig:e.sessionTurnConfig}:{},...e?.sessionTurnConfigUpdatedAt?{sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt}:{}}}function cL(e,t,n){return n?e===`lease_added`?!0:!lL(t,n):!1}function lL(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:uL(e.sessionTurnConfig,t.sessionTurnConfig)}function uL(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 dL=class{constructor(e){this.config=e}issue(e){let t=fL(e.sizeBytes??0),n=Vw.default.sign({sub:e.deviceId,type:`workspace_preview`,gatewayId:this.config.gatewayId,path:e.canonicalPath,disposition:e.disposition},this.config.accessSecret,{expiresIn:t}),r=Vw.default.decode(n);return{ticket:n,expiresAt:r?.exp?new Date(r.exp*1e3).toISOString():new Date().toISOString()}}getExpiresAt(e){let t=Vw.default.decode(e);return t?.exp?new Date(t.exp*1e3).toISOString():new Date().toISOString()}verify(e){let t;try{t=Vw.default.verify(e,this.config.accessSecret)}catch(e){if(e instanceof Error){if(e.name===`TokenExpiredError`)throw aT();if(e.name===`JsonWebTokenError`||e.name===`NotBeforeError`)throw iT()}throw e}if(t.type!==`workspace_preview`||t.gatewayId!==this.config.gatewayId)throw iT();return t}};function fL(e){return e>20971520?7200:600}var pL=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:hL(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:hL(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=mL(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=mL(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 oT(e);return t}};function mL(e){return e.split(p.default.sep).join(`/`)}function hL(e,t){return`${e}; filename="${t.replace(/["\\]/g,`_`)}"`}function gL(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 _L=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 vL=`[redacted:image-data]`;let yL=null;const bL={perMessageDeflate:{threshold:1024}},xL={globalDecompression:!1,threshold:1024,customTypes:/^text\/(?!event-stream)|(?:\+|\/)json(?:;|$)|(?:\+|\/)text(?:;|$)|(?:\+|\/)xml(?:;|$)/u},SL=4096;function CL(e){if(Array.isArray(e))return e.map(e=>CL(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`?vL:CL(r);return t}function wL(e,t){if(e)try{return JSON.stringify(CL(e))}catch{}return t.replace(/("(?:dataBase64|data_base64)"\s*:\s*")([^"]*)(")/gu,`$1${vL}$3`)}function TL(e){return p.default.join(p.default.dirname(e),`session-attachments`)}function EL(e,t){_L&&(console.log(`[native-watch][gateway]`,e,t),yL?.info({event:e,...t},`native session watch debug`))}function DL(e){return e?typeof e==`string`?e:e.toString(`utf8`):``}function OL(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 kL(e){let t=e.limit??300,n=e.detailLevel??`full`,r=(r,i)=>{Fj(`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:WE(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:WE(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:WE(o,n)};return r(s,{rangeMin:i.min,rangeMax:i.max,minExpectedCursor:a}),s}async function AL(e,t={}){await i_(e.gatewayLogPath);let n=ML(e,t),r=jL(e,n.instance);Pj(r.log),yL=r.log,await r.register(Uw.default,{origin:!0}),await r.register(Ww.default,xL),await r.register(Hw.default,{options:bL});let i=process.env.NODE_ENV!==`production`,a=4e3,o=`[unserializable payload]`,s=new yT(e);await s.init();let c=new kT(e.auditLogPath),l=new eL,u=new hE,d=new fD(e.projectStoreDir),f=new rF(e.sessionHistoryDir);await f.init();let m=new bj(p.default.join(e.sessionHistoryDir,`discovery-v1`));await m.init();let h=new sj({store:m});await h.init();let g,_=null,v=new Map,y=await qm(e.authStoreDir),b=new dL(e),x=e.relayEnabled?mg({relayUrl:e.relayUrl,gatewayHost:e.host}):``,S=e=>{let t=v.get(e);t&&(clearTimeout(t.timeout),v.delete(e),t.resolve())},C=(e,t)=>{let n=v.get(e);n&&(clearTimeout(n.timeout),v.delete(e),n.reject(t instanceof Error?t:Error(String(t))))},w=(e,t)=>new Promise((n,r)=>{C(e,Error(`Duplicate pending relay file upload start for request ${e}`));let i=setTimeout(()=>{v.delete(e),r(Error(`Relay file upload start timed out for request ${e}`))},t);v.set(e,{resolve:n,reject:r,timeout:i})}),T=new BN({preferNativeProviders:e.enableNativeProviders,requireNativeCodex:e.requireNativeCodex,auditLogger:c,projectStore:d,historyStore:f,logger:r.log,attachmentStoreDir:TL(e.sessionHistoryDir),runtimeLifecycle:{idleTtlMs:e.runtimeIdleTtlMs,sweepIntervalMs:e.runtimeSweepIntervalMs,maxSessions:e.runtimeMaxSessions,maxCodexSessions:e.runtimeMaxCodexSessions,maxClaudeSessions:e.runtimeMaxClaudeSessions},onEnvelope:e=>{l.routeProviderRaw(e),D.routeReadableLiveDelta(e)}}),E=new pL({fsService:u,sessionManager:T,previewTicketService:b}),D=new YI(l,T,e.readableLiveDeltaCoalesceMs,Fj),O=new rL({sessionManager:T,logger:r.log,sendStreamMessage:(e,t)=>{l.sendStreamMessage(e,t)},createExternalUpdateMessage:e=>aI(e),refreshDetailSessionSnapshots:e=>D.refreshDetailSessionSnapshots(e)});T.warmStartupProviderCapabilities().catch(e=>{r.log.warn({err:e},`startup provider capability warmup failed`)});let k=new Cg({packageName:z.packageName,currentVersion:z.version,sessionHub:l,logger:r.log,consoleWrite:e=>{console.log(e)},getRunningSessionCount:async()=>T.getRunningRuntimeSessionCount(),requestPreparedUpdate:t.onUpdatePrepared});r.addHook(`onClose`,async()=>{r.log.info({hasRelayClient:!!_},`gateway shutdown starting`);try{D.shutdown(),O.close(),_?.close(),M.close(),await k.shutdown(),await T.shutdown(),await f.shutdown();for(let[e,t]of v.entries())clearTimeout(t.timeout),t.reject(Error(`Gateway shutting down`)),v.delete(e);r.log.info(`gateway shutdown completed`)}catch(e){throw r.log.error({err:e},`gateway shutdown failed`),e}finally{Pj(null),yL=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:$m(),gatewayIdentity:y.identity})),r.get(`/api/pairing/descriptor`,async()=>og({gatewayId:e.gatewayId,gatewayName:e.name,machineName:$m(),relayBaseUrl:x,directBaseUrls:fg({protocol:e.httpsEnabled?`https`:`http`,host:e.host,port:e.httpsEnabled?e.httpsPort:e.port}),relayTransportSecurityLevel:e.relayEnabled?e.relayTransportSecurityLevel:void 0,gatewayIdentity:y.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=Gl.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}}),UF(y,{...n,gatewayName:e.name,machineName:$m()},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=Jl.safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await RF({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 A=()=>Rd.parse({name:e.name,machineName:$m()}),j=async n=>{let r=Rd.pick({name:!0}).parse(n);if(!t.configPath)throw Error(`Gateway config path is unavailable`);return e.name=await mh(t.configPath,r.name),A()};r.get(`/api/gateway/settings`,async(e,t)=>{if(ne(e,t))return A()}),r.post(`/api/gateway/settings`,async(e,t)=>{if(!ne(e,t))return;let n=Rd.pick({name:!0}).safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await j(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 T.listProjects()}}),r.get(`/api/gateway/update`,async(e,t)=>{if(ne(e,t))try{return await k.getOrCheckInfo(`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=xd.safeParse(n?.requestedBy);try{let e=await k.applyUpdate(r.success?r.data:`mobile`);return Ed.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 iu.parse(await T.restartCodexAppServer())}catch(e){let n=Qw(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 eu.parse(await T.getCodexAccounts())}catch(e){return re(t,e)}}),r.post(`/api/codex/accounts/save`,async(e,t)=>{if(ne(e,t))try{return tu.parse(await T.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 nu.parse(await T.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 ru.parse(await T.deleteSavedCodexAccount(n.accountId))}catch(e){return re(t,e)}}),r.get(`/api/discovery/projects`,async(e,t)=>{if(ne(e,t))try{return await h.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 h.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 h.listProjectSessions(n.projectPath)}catch(e){let n=e instanceof Error?e.message:String(e);return Qw(e)&&e.code===`DISCOVERED_PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):YF(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 E.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 E.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 E.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 E.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 E.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 T.getProviderCapabilities(n.provider,n.projectId,n.agentVersion)}}catch(e){return Qw(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 T.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 T.getAgentConfig(n.provider,{projectId:n.projectId,agentVersion:n.agentVersion})}catch(e){return Qw(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 T.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 T.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 T.listProjectSessions(n.projectId,i,{syncExternal:a})}}catch(e){return Qw(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 T.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 T.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 T.syncProjectSessionHistory(n.projectId,n.sessionId);return e.historyUpdated&&await D.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 Qw(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=Gc.safeParse(r.detailLevel).success?Gc.parse(r.detailLevel):`full`;try{return await I(n.projectId,n.sessionId,i,typeof a==`number`&&Number.isFinite(a)?Math.max(0,Math.floor(a)):void 0,o,`http`)}catch(e){return Qw(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 IF({sessionManager:T,readableItemDetailLookup:D,projectId:n.projectId,sessionId:n.sessionId,itemId:n.itemId})||t.code(404).send({error:`Readable item not found`})}catch(e){return Qw(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 T.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 P(al(e),i.sub,a)}catch(e){await F({deviceId:i.sub,clientId:a,rawCommand:wL(n,t),parsedInput:n,error:e})}}),e.on(`close`,(e,t)=>{let n=l.getSubscriptions(a),o=O.getClientWatchTargets(a);r.log.info({clientId:a,deviceId:i.sub,transport:`direct`,closeCode:typeof e==`number`?e:null,closeReason:DL(t),streamSubscriptionCount:n.length,streamSubscriptions:n.map(OL),externalWatchTargetCount:o.length,externalWatchTargets:o},`gateway websocket client disconnected`),O.removeClient(a),l.removeClient(a),D.clearStatesForClient(a)})});let M=new Rj({gatewayId:e.gatewayId,relayTransportSecurityLevel:e.relayEnabled?e.relayTransportSecurityLevel:`plaintext-relay`,gatewayIdentity:y.identity,gatewayIdentityPrivateKeyPem:y.privateKeyPem,sessionHub:l,logger:r.log,describeClientState:e=>{let t=l.getSubscriptions(e),n=O.getClientWatchTargets(e);return{streamSubscriptionCount:t.length,streamSubscriptions:t.map(OL),externalWatchTargetCount:n.length,externalWatchTargets:n}},handlePairingClaim:async t=>{let n=he(t.deviceName);return UF(y,{...await s.claimPairingCode(t.code,n,t.deviceIdentity),gatewayName:e.name,machineName:$m()},t.code,t.deviceIdentity)},handleRefresh:async t=>{let n=await RF({authService:s,execute:()=>s.refreshAccessToken(t.refreshToken),logger:r.log,refreshToken:t.refreshToken,requestedDeviceId:t.deviceId,source:`relay_http_forward`});return LF(t.deviceId,n.deviceId),{gatewayId:e.gatewayId,...n}},handleFileContentRequest:async(e,t)=>{if(t.method===`GET`&&t.responseMode===`stream_upload`){let n=await E.openPreviewContentStream(t.ticket,{rangeHeader:t.rangeHeader,includeBody:!0});if(n.bodyStream&&t.uploadUrl&&t.uploadToken){let i=w(e,15e3),a=PL({uploadUrl:t.uploadUrl,uploadToken:t.uploadToken,contentLength:n.headers.contentLength,bodyStream:n.bodyStream});a.completed.catch(n=>{C(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 Ff.parse({status:n.statusCode,headers:n.headers,...n.bodyStream?{bodyTransport:`stream_upload`}:{}})}let n=await E.readPreviewContent(t.ticket,{rangeHeader:t.rangeHeader,includeBody:t.method===`GET`});return Ff.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)=>GF(t,{gatewayId:e.gatewayId,relayPreviewBaseUrl:x,authService:s,logger:r.log,sessionManager:T,projectDiscoveryService:h,fsService:u,workspaceFileService:E,updateService:k,gatewaySettings:{get:A,update:j},relayDeviceId:n.deviceId,readableItemDetailLookup:D,refreshDetailSessionSnapshots:e=>D.refreshDetailSessionSnapshots(e),buildRawEventsListResult:kL}),handleFileContentUploadStarted:S,sendFrame:e=>_?.send(e)??!1,dispatchCommand:async(e,t,n)=>{try{await P(e,t,n)}catch(r){await F({deviceId:t,clientId:n,rawCommand:wL(e,JSON.stringify(e)),parsedInput:e,error:r})}}}),N=async(e,t,n)=>{switch(e.type){case`session.start`:{let r=await T.startSession({...e.payload,deviceId:t});l.sendSystemMessage(n,{type:`command.ack`,commandType:e.type,commandId:e.commandId,payload:r});return}case`turn.input`:await T.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 T.startReview(e.payload.sessionId,e.payload.config,t,{input:e.payload.input,turnConfig:e.payload.turnConfig});return;case`tool.approval.respond`:await T.respondToolPermission(e.payload.sessionId,e.payload.requestId,e.payload.decision,e.payload.reason,t);return;case`user.input.respond`:await T.respondUserInput(e.payload.sessionId,e.payload.requestId,e.payload.answers,t);return;case`session.interrupt`:await T.interruptSession(e.payload.sessionId,t);return;case`session.close`:throw Error(`session.close is deprecated. Use session.interrupt instead.`);case`session.external.watch.set`:{EL(`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=O.setClientWatchTargets(n,e.payload.sessions,e.payload.replace);EL(`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=gL(e.payload.sessions);await D.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=T.getSessionExecutionContext(e.payload.sessionId),n=await u.readFile(t.projectPath,e.payload.path);await T.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=T.getSessionExecutionContext(e.payload.sessionId),n=await u.diffFile(t.projectPath,e.payload.path,e.payload.baseContent??``);await T.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)}`)}}},P=async(e,t,n)=>{await N(e,t,n)},F=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 T.emitExternalEvent({provider:`codex`,sessionId:`system`,type:`error.runtime`,raw:{message:String(e.error),source:`ws.command`}})},I=async(e,t,n=300,r,i=`full`,a=`http`)=>kL({sessionManager:T,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=ee(e);return t===void 0?B(e,a):te(V(t))}if(Buffer.isBuffer(e)){let t=e.toString(`utf8`),n=ee(t);return n===void 0?B(t,a):te(V(n))}return typeof e==`object`?te(V(e)):String(e)},ee=e=>{try{return JSON.parse(e)}catch{return}},B=(e,t)=>e.length<=t?e:`${e.slice(0,t)}...<truncated>`,V=e=>{if(Array.isArray(e))return e.map(e=>V(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]=V(r)}return n}return e},te=e=>{let t=H(e);return t===o?t:t.length<=a?e:{truncated:!0,preview:B(t,a)}},H=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=Qw(t)?t.status:500;return Qw(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=$m(),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},NL(pe,e.host,_e)),e.relayEnabled&&(_=new Qj({gatewayId:e.gatewayId,machineName:e.name,relayUrl:e.relayUrl,relayTransportSecurityLevel:e.relayTransportSecurityLevel,relayGatewayAccessToken:e.relayGatewayAccessToken,resolveRelayGatewayAccessToken:e.relayGatewayAccessToken.trim()?void 0:()=>rM({gatewayId:e.gatewayId,relayUrl:e.relayUrl,gatewayIdentity:y.identity,privateKeyPem:y.privateKeyPem}),gatewayIdentity:y.identity,directBaseUrls:fg({protocol:pe,host:e.host,port:_e}),logger:r.log,onFrame:async e=>{await M.handleFrame(e)}}),_.start()),e.bootstrapPairingCodeOnStart)try{let t=await s.createPairingCode(e.pairingCodeTtlSeconds);g={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 k.start(),{protocol:pe,listenPort:_e,gatewayName:e.name,machineName:me,gatewayIdentity:y.identity,close:()=>r.close(),getGatewayUpdateInfo:()=>k.getInfo(),requestGatewayUpdate:(e=`console`)=>k.applyUpdate(e),requestCodexAppServerRestart:async(e=`console`)=>T.restartCodexAppServer(),startupPairingCode:g}}function jL(e,t){let n=t;if(!e.httpsEnabled)return(0,Gw.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:SL}});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,Gw.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:SL},https:r})}function ML(e,t){let n=process.env.NODE_ENV!==`production`,r=Kw.default.destination({dest:e.gatewayLogPath,mkdir:!0,sync:!1}),i=t.logToConsole?Kw.default.multistream([{stream:r},{stream:process.stdout}]):r;return{instance:(0,Kw.default)({level:n?`debug`:`info`},i),close:()=>{try{r.flushSync()}catch{}r.end()}}}function NL(e,t,n){return`desktop-gateway listening on ${e}://${t}:${n}`}function PL(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 FL(e){return e instanceof Error?e.stack??`${e.name}: ${e.message}`:(0,b.inspect)(e,{depth:6,breakLength:120})}async function IL(e){let t=await uh({configPath:e.configPath,ensureConfigFile:!0});hh(t.config);let n=await AL(t.config,{configPath:t.configPath,logToConsole:e.logToConsole,onUpdatePrepared:async e=>{RL({type:`worker.update.prepared`,payload:e})}});RL({type:`worker.ready`,payload:LL(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=zL(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: ${FL(e)}`),i(1)}),process.on(`unhandledRejection`,e=>{console.error(`[gateway] worker unhandled rejection: ${FL(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);RL({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);RL({type:`worker.response`,id:e.id,method:e.method,ok:!0,result:t});return}}}catch(t){RL({type:`worker.response`,id:e.id,method:e.method,ok:!1,error:String(t)})}}await new Promise(()=>{})}function LL(e){return{protocol:e.protocol,listenPort:e.listenPort,gatewayName:e.gatewayName,machineName:e.machineName,gatewayIdentity:e.gatewayIdentity,startupPairingCode:e.startupPairingCode}}function RL(e){process.send&&process.send(e)}function zL(e){if(!BL(e)||typeof e.type!=`string`)return null;switch(e.type){case`supervisor.shutdown`:return e.reason!==`signal`&&e.reason!==`update`?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 BL(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}VL(process.argv.slice(2)).catch(e=>{console.error(String(e)),process.exit(1)});async function VL(e){let t=ee(e);switch(t.command){case`help`:KL();return;case`version`:console.log(z.version);return;case`init`:await UL(t);return;case`doctor`:await WL(t);return;case`start`:await HL(t);return;case`__worker`:await GL(t);return;default:{let e=t.command;throw Error(`Unsupported command: ${e}`)}}}async function HL(e){let t=await uh({configPath:e.configPath,ensureConfigFile:!0});hh(t.config);let n=await Ph({configPath:t.configPath,configExists:t.configExists,config:t.config});try{await Xg({args:e,loaded:t,doctorReport:n})}catch(e){throw Error(a_(e,t.config))}Fh(n)&&console.warn(`[doctor] startup continued despite bundled runtime check failures.`)}async function UL(e){let t=await lh({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 uh({configPath:t.configPath,ensureConfigFile:!1}),r=await Ph({configPath:n.configPath,configExists:n.configExists,config:n.config});console.log(Ih(r))}async function WL(e){let t=await uh({configPath:ch(e.configPath),ensureConfigFile:!1,syncGatewayIdentityConfig:!1}),n=await Ph({configPath:t.configPath,configExists:t.configExists,config:t.configExists?t.config:void 0});console.log(Ih(n)),Fh(n)&&(process.exitCode=1)}async function GL(e){try{await IL(e)}catch(t){let n=await uh({configPath:e.configPath,ensureConfigFile:!0});throw Error(a_(t,n.config))}}function KL(){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=VL;