craby-gateway 0.25.5 → 0.25.7

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.25.5`,description:`Craby desktop gateway CLI`,type:`module`,bin:{"craby-gateway":`dist-sea/gateway.cjs`},files:[`dist-sea`,`README.md`],publishConfig:{access:`public`,registry:`https://registry.npmjs.org/`},engines:{node:`>=20`},repository:{type:`git`,url:`git+https://github.com/wuyongzhi/anycoding.git`,directory:`apps/desktop-gateway`},scripts:{dev:`GATEWAY_PORT=18787 GATEWAY_HTTPS_PORT=18787 GATEWAY_AUDIT_LOG_PATH=./logs/audit.log GATEWAY_LOG_PATH=./logs/gateway.log GATEWAY_SESSION_HISTORY_DIR=./logs/sessions-v2 GATEWAY_PROJECT_STORE_DIR=./logs/projects GATEWAY_AUTH_STORE_DIR=./logs/auth tsx watch src/index.ts --config ./logs/gateway.dev.yaml`,build:`tsup src/index.ts --format esm --dts`,"build:bundle":`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`,"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.92`,"@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.25.7`,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:bundle":`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`,"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.92`,"@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:{...Go(`claude-command-output:${e.eventId}`,e
132
132
  `).trim();return t.length>0?t:void 0}function ks(e){return ro.test(e)}function As(e){return e===`failed`?`error`:e===`streaming`?`accent`:e===`waiting_approval`||e===`waiting_input`?`warning`:`success`}function js(e){let t=Bs(e.payload.raw);return Hs(t,[`turn_id`,`turnId`])||Hs(Bs(t.item),[`turn_id`,`turnId`])||Hs(Bs(t.turn),[`id`,`turn_id`,`turnId`])||Hs(Bs(Bs(t.message).params),[`turnId`,`turn_id`])}function Ms(e){return e.type===`native.raw`?Hs(Bs(Bs(e.payload.raw).message),[`method`]):e.type}function Ns(e){let t=Bs(e.payload.raw),n=Bs(t.item);return Object.keys(n).length>0?n:Bs(Bs(Bs(t.message).params).item)}function Ps(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 Fs(e){let t=Ms(e);return t!==`item.started`&&t!==`item.completed`&&t!==`item/started`&&t!==`item/completed`?!1:Ps(Hs(Ns(e),[`type`]))===`user_message`}function Is(e){let t=Ms(e);return t!==`item.started`&&t!==`item.completed`&&t!==`item/started`&&t!==`item/completed`?!1:Ps(Hs(Ns(e),[`type`]))===`reasoning`}function Ls(e){if(e.type===`turn.completed`||e.type===`turn.failed`)return!0;let t=Hs(Bs(Bs(e.payload.raw).message),[`method`]);return t===`turn/completed`||t===`turn/failed`||t===`turn/interrupted`}function Rs(e){let t=Bs(Bs(e.payload.raw).item),n=Hs(t,[`type`]);if(n&&(n===`command_execution`||n===`file_change`||n===`web_search`))return t}function zs(e){let t=Hs(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=Hs(Bs(e),[`type`]);t===`read`||t===`listFiles`||t===`list_files`?n=!0:t===`search`&&(r=!0)}return r?`正在搜索`:n?`正在浏览`:`正在运行命令`}return`正在思考`}function Bs(e){return typeof e==`object`&&e?e:{}}function Vs(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Hs(e,t){let n=e??{};for(let e of t){let t=n[e];if(typeof t==`string`&&t.trim())return t}}function Us(e,t){let n=e??{};for(let e of t){let t=n[e];if(typeof t==`number`&&Number.isFinite(t))return t}}function Ws(e){let t=new Set,n=[];for(let r of e)!r||t.has(r)||(t.add(r),n.push(r));return n}function Gs(e){let t=e.replace(/\\/g,`/`).split(`/`);return t[t.length-1]??e}function Ks(e){return e?e.replace(/\r\n/g,`
133
133
  `).split(`
134
134
  `):[]}var qs=X([`text`,`output`]),Js=J({id:K().min(1),field:qs,delta:K()});function Ys(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(ec(t)===ec(e))continue;let r=Xs(t,e);if(!r){a.push(e);continue}o.push(...r)}return{upserts:a,removals:i,textDeltaPatches:o}}function Xs(e,t){if(e.kind!==t.kind)return null;let n=Zs(e);if(n.length===0||tc($s(e))!==tc($s(t)))return null;let r=[];for(let i of n){let n=Qs(e,i),a=Qs(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 Zs(e){switch(e.kind){case`agent_commentary`:case`activity_summary`:return[`text`];case`terminal_card`:case`command_strip`:return[`output`];default:return[]}}function Qs(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 $s(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 ec(e){return JSON.stringify(e)}function tc(e){return JSON.stringify(e)}var nc=K().trim().min(1).nullable(),rc=X([`default`,`plan`]),ic=J({approvalPolicy:Fa.nullable(),sandboxMode:Ia.nullable()}),ac=J({permissionMode:La.nullable()}),oc=J({codex:ic.optional(),claude:ac.optional()}),sc=tr(Zn());J({modeDefault:rc,model:K().trim().min(1).optional(),reasoningEffort:Pa.optional(),execution:oc.optional()});var cc=J({mode:rc,model:nc,reasoningEffort:Pa.nullable(),execution:oc.optional()});J({provider:Na,model:nc,reasoningEffort:Pa.nullable(),execution:oc.optional()});var lc=J({model:nc,reasoningEffort:Pa.nullable(),execution:oc.optional(),context:sc.optional()}),uc=J({target:er(`type`,[J({type:Y(`uncommittedChanges`)}),J({type:Y(`baseBranch`),branch:K().trim().min(1)}),J({type:Y(`commit`),sha:K().trim().min(1),title:K().trim().min(1).optional()}),J({type:Y(`custom`),instructions:K().trim().min(1)})])}),dc=J({preset:X([`general`,`security`,`performance`,`style`]),scope:X([`workingTree`,`staged`,`selection`,`custom`]).optional(),instructions:K().trim().min(1).optional()}),fc=J({provider:Na,codex:uc.optional(),claude:dc.optional()}).superRefine((e,t)=>{if(e.provider===`codex`){e.codex||t.addIssue({code:W.custom,path:[`codex`],message:`codex review config is required when provider is codex`}),e.claude&&t.addIssue({code:W.custom,path:[`claude`],message:`claude review config must be omitted when provider is codex`});return}e.claude||t.addIssue({code:W.custom,path:[`claude`],message:`claude review config is required when provider is claude`}),e.codex&&t.addIssue({code:W.custom,path:[`codex`],message:`codex review config must be omitted when provider is claude`})}),pc=K().min(1).regex(/^[A-Za-z0-9+/=]+$/u),mc=J({v:Y(`1.0`),provider:Na,sessionId:K().min(1),projectId:K().min(1).optional(),eventId:K().min(1),ts:K().datetime(),type:K().min(1),payload:J({raw:Zn()}).passthrough()}).passthrough(),hc=X([`compact`,`full`]),gc=J({commandId:K().min(1).optional()}),_c=gc.extend({type:Y(`session.start`),payload:J({provider:Na,model:K().min(1).optional(),projectId:K().min(1).optional(),cwd:K().min(1).optional(),sessionConfig:Ra.optional(),sessionTurnConfig:cc.optional(),metadata:tr(Zn()).optional()})}),vc=gc.extend({type:Y(`turn.input`),payload:J({sessionId:K().min(1),text:K().min(1),model:K().min(1).optional(),sessionConfig:Ra.optional(),mode:rc.optional(),config:lc.optional()})}),yc=gc.extend({type:Y(`review.start`),payload:J({sessionId:K().min(1),input:K().min(1).optional(),config:fc,turnConfig:lc})}),bc=gc.extend({type:Y(`tool.approval.respond`),payload:J({sessionId:K().min(1),requestId:K().min(1),decision:X([`allow`,`deny`]),reason:K().min(1).optional()})}),xc=gc.extend({type:Y(`user.input.respond`),payload:J({sessionId:K().min(1),requestId:K().min(1),answers:tr(Qn(K()))})}),Sc=gc.extend({type:Y(`session.interrupt`),payload:J({sessionId:K().min(1)})}),Cc=gc.extend({type:Y(`session.close`),payload:J({sessionId:K().min(1)})}),wc=er(`kind`,[J({kind:Y(`all`)}),J({kind:Y(`raw_seq`),rawSeq:q().int().nonnegative()})]),Tc=J({sessionId:K().min(1),projectId:K().min(1).optional(),cursor:wc,purpose:X([`detail_view`,`live_follow`]).optional(),detailLevel:hc.optional(),bootstrapMode:X([`stream`,`readable`]).optional()}),Ec=gc.extend({type:Y(`session.stream.subscribe`),payload:J({replace:Xn().default(!0),sessions:Qn(Tc)})}),Dc=J({sessionId:K().min(1),projectId:K().min(1).optional()}),Oc=er(`type`,[_c,vc,yc,bc,xc,Sc,Cc,gc.extend({type:Y(`session.external.watch.set`),payload:J({replace:Xn().default(!0),sessions:Qn(Dc)})}),Ec,gc.extend({type:Y(`fs.read`),payload:J({sessionId:K().min(1),path:K().min(1)})}),gc.extend({type:Y(`fs.diff`),payload:J({sessionId:K().min(1),path:K().min(1),baseContent:K().optional()})})]);function kc(e){let t=Oc.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 Ac(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
- `):void 0}var jc=J({inputTokens:q().int().nonnegative(),cachedInputTokens:q().int().nonnegative(),outputTokens:q().int().nonnegative(),reasoningOutputTokens:q().int().nonnegative(),totalTokens:q().int().nonnegative()}),Mc=J({usedPercent:q(),windowMinutes:q().int().nonnegative().nullable(),resetsAt:q().nonnegative().nullable()}),Nc=J({primary:Mc.nullable().optional(),secondary:Mc.nullable().optional(),planType:K().min(1).nullable().optional(),creditsBalance:K().min(1).nullable().optional()}),Pc=J({provider:Na,usage:J({currentUsage:jc,latestTurnUsage:jc.nullable(),contextWindow:q().int().nonnegative().nullable(),sourceLabel:K().min(1),note:K().min(1).optional()}).nullable(),rateLimits:Nc.optional()});function Fc(e){return e.provider===`claude`?Lc(e.rawEvents):Ic(e.rawEvents)}function Ic(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=null;for(let c of Xc(e)){let e=tl(c.payload.raw),l=c.type===`native.raw`?Rc(e):null;l?.usage&&((qc(l.usage)||!t)&&(t=l.usage),Jc(l.usage.latestTurnUsage)?n=l.usage.latestTurnUsage:Jc(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=zc(c);if(u){let e=u.latestTurnUsage??u.currentUsage;Jc(e)&&(n=e),r=u.contextWindow??r,!t&&(qc(u)||u.contextWindow)&&(t=u)}}let c=t?{...t,latestTurnUsage:Jc(n)?n:Jc(t.latestTurnUsage)?t.latestTurnUsage:Jc(t.currentUsage)?t.currentUsage:null,contextWindow:t.contextWindow??r}:null,l=Vc({primary:i,secondary:a,planType:o,creditsBalance:s});return!c&&!l?null:{provider:`codex`,usage:c,...l?{rateLimits:l}:{}}}function Lc(e){let t=null;for(let n of Xc(e)){let e=zc(n);e&&(t=e)}return t?{provider:`claude`,usage:t}:null}function Rc(e){if(e.source===`codex.history.thread_read`){let t=tl(e.message),n=tl(t.turn),r=Wc(n.usage??t.usage),i=$c(n.model_context_window??t.model_context_window);return!r&&i===void 0?null:{usage:{currentUsage:r??Yc(),latestTurnUsage:r??null,contextWindow:i??null,sourceLabel:`codex.history.thread_read`,note:`当前来自 Codex history replay 快照。`}}}let t=Zc(e);if(!t)return null;let n=tl(tl(e.message).params);if(t===`thread/tokenUsage/updated`){let e=tl(n.tokenUsage??n.token_usage),t=Wc(e.total??e.total_token_usage);return t?{usage:{currentUsage:t,latestTurnUsage:Wc(e.last??e.last_token_usage),contextWindow:$c(e.modelContextWindow??e.model_context_window)??null,sourceLabel:`thread/tokenUsage/updated`}}:null}if(t===`account/rateLimits/updated`){let e=Bc(n.rateLimits??n.rate_limits);return e?{rateLimits:e}:null}if(t===`codex/event/token_count`){let e=tl(n.msg),t=tl(e.info),r=Wc(t.total_token_usage??t.totalTokenUsage),i=Bc(e.rate_limits??e.rateLimits);return!r&&!i?null:{usage:r?{currentUsage:r,latestTurnUsage:Wc(t.last_token_usage??t.lastTokenUsage),contextWindow:$c(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=tl(n.msg),t=$c(e.model_context_window??e.modelContextWindow);return t===void 0?null:{usage:{currentUsage:Yc(),latestTurnUsage:null,contextWindow:t,sourceLabel:`codex/event/task_started`,note:`目前只拿到了 context window,尚未拿到 thread token usage 快照。`}}}return null}function zc(e){if(e.type!==`turn.completed`&&e.type!==`turn.failed`&&e.type!==`turn.started`)return null;let t=tl(e.payload.raw),n=Uc(t.usage??tl(t.turn).usage),r=$c(t.model_context_window??tl(t.turn).model_context_window);return!n&&r===void 0?null:{currentUsage:n??Yc(),latestTurnUsage:n??null,contextWindow:r??null,sourceLabel:e.type}}function Bc(e){let t=tl(e),n=Hc(t.primary),r=Hc(t.secondary),i=el(t.plan_type??t.planType)??null,a=el(tl(t.credits).balance)??null;return!n&&!r&&!i&&!a?null:{primary:n,secondary:r,planType:i,creditsBalance:a}}function Vc(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 Hc(e){let t=tl(e),n=$c(t.used_percent??t.usedPercent);return n===void 0?null:{usedPercent:n,windowMinutes:$c(t.window_minutes??t.windowDurationMins)??null,resetsAt:$c(t.resets_at??t.resetsAt)??null}}function Uc(e){return Gc(e)}function Wc(e){return Gc(e,{totalFallback:`input_plus_output`})}function Gc(e,t){let n=tl(e),r=$c(n.input_tokens??n.inputTokens),i=$c(n.cached_input_tokens??n.cachedInputTokens??n.cache_read_input_tokens??n.cacheReadInputTokens),a=$c(n.output_tokens??n.outputTokens),o=$c(n.reasoning_output_tokens??n.reasoningOutputTokens)??0,s=$c(n.total_tokens??n.totalTokens)??Kc(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 Kc(e,t,n,r,i){return i?.totalFallback===`input_plus_output`?Qc(e,n):Qc(e,t,n,r)}function qc(e){return Jc(e.latestTurnUsage)||Jc(e.currentUsage)}function Jc(e){return e?e.inputTokens>0||e.cachedInputTokens>0||e.outputTokens>0||e.reasoningOutputTokens>0||e.totalTokens>0:!1}function Yc(){return{inputTokens:0,cachedInputTokens:0,outputTokens:0,reasoningOutputTokens:0,totalTokens:0}}function Xc(e){return[...e].sort((e,t)=>{let n=e.ts.localeCompare(t.ts);return n===0?e.rawSeq-t.rawSeq:n})}function Zc(e){return el(tl(e.message).method)??el(e.method)??null}function Qc(...e){let t=e.filter(e=>typeof e==`number`);if(t.length!==0)return t.reduce((e,t)=>e+t,0)}function $c(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 el(e){return typeof e==`string`&&e.trim()?e:void 0}function tl(e){return typeof e==`object`&&e?e:{}}var nl=X([`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`]),rl=mc.extend({type:nl}),il=mc.extend({kind:Y(`provider.raw`),rawSeq:q().int().positive(),type:K().min(1)});rl.extend({kind:Y(`gateway.control`).optional(),derivedFrom:K().min(1).optional()});var al=mc.extend({kind:Y(`session.stream.sync`),type:Y(`session.stream.sync`),payload:J({raw:J({decision:X([`delta`,`snapshot`]),reason:K().min(1),snapshotId:K().min(1).optional(),fromRawSeq:q().int().nonnegative().optional(),toRawSeq:q().int().nonnegative().optional()}).passthrough()}).passthrough()}),ol=mc.extend({kind:Y(`session.stream.snapshot.chunk`),type:Y(`session.stream.snapshot.chunk`),payload:J({raw:J({snapshotId:K().min(1),chunkIndex:q().int().nonnegative(),totalChunks:q().int().positive(),events:Qn(il)}).passthrough(),readable:J({snapshotId:K().min(1),chunkIndex:q().int().nonnegative(),totalChunks:q().int().positive(),timelineItems:Qn(vo).optional()}).passthrough().optional()}).passthrough()}),sl=mc.extend({kind:Y(`session.readable.snapshot.chunk`),type:Y(`session.readable.snapshot.chunk`),payload:J({readable:J({snapshotId:K().min(1),chunkIndex:q().int().nonnegative(),totalChunks:q().int().positive(),timelineItems:Qn(vo),pendingApprovals:Qn(mo).optional(),pendingUserInputs:Qn(_o).optional(),contextUsage:Pc.nullable().optional()}).passthrough()}).passthrough()}),cl=J({updatedAt:K().datetime().optional(),status:X([`running`,`idle`]).optional(),interactionLockReason:X([`external_turn_running`]).optional(),model:K().min(1).optional(),sessionTurnConfig:cc.optional(),sessionTurnConfigUpdatedAt:K().datetime().optional(),title:K().min(1).optional(),pendingApprovals:q().int().nonnegative().optional(),pendingUserInputs:q().int().nonnegative().optional(),pendingActions:q().int().nonnegative().optional()}),ll=$n([il,al,ol,sl,mc.extend({kind:Y(`session.readable.delta`),type:Y(`session.readable.delta`),payload:J({readable:J({fromRawSeq:q().int().nonnegative().optional(),toRawSeq:q().int().nonnegative(),timelineUpserts:Qn(vo),timelineRemovals:Qn(K().min(1)),timelineTextDeltaPatches:Qn(Js).optional(),pendingApprovalUpserts:Qn(mo).optional(),pendingApprovalRemovals:Qn(K().min(1)).optional(),pendingUserInputUpserts:Qn(_o).optional(),pendingUserInputRemovals:Qn(K().min(1)).optional(),sessionSummary:cl.optional(),contextUsage:Pc.nullable().optional()}).passthrough()}).passthrough()}),mc.extend({kind:Y(`session.external.update`),type:Y(`session.external.update`),payload:J({raw:J({updatedAt:K().datetime(),status:X([`running`,`idle`]),interactionLockReason:X([`external_turn_running`]).optional(),refreshMode:X([`delta`,`snapshot`]),fromRawSeq:q().int().nonnegative().optional(),toRawSeq:q().int().nonnegative().optional(),historyUpdated:Xn(),statusChanged:Xn(),sessionSummary:cl.optional()}).passthrough()}).passthrough()})]),ul=J({algorithm:X([`ed25519`]),publicKey:pc,publicKeyFingerprint:K().min(1),keyVersion:q().int().min(1),createdAt:K().datetime()});J({code:K().min(4),expiresAt:K().datetime()});var dl=X([`ed25519`]),fl=X([`active`,`revoked`,`rotating`,`unknown`]),pl=J({algorithm:dl,publicKey:pc,publicKeyFingerprint:K().min(1)}),ml=J({pairingCode:K().min(4),signedAt:K().datetime()}),hl=J({gatewayId:K().min(1),deviceId:K().min(1),mobilePublicKey:pc,pairingContext:ml}),gl=J({algorithm:Y(`ed25519`),gatewayPublicKeyFingerprint:K().min(1),payload:hl,signature:pc}),_l=J({code:K().min(4),deviceName:nr(e=>{if(e==null)return;if(typeof e!=`string`)return e;let t=e.trim();return t.length>0?t:void 0},K().min(1).optional()),deviceIdentity:pl.optional()}),vl=J({accessToken:K().min(1),refreshToken:K().min(1),expiresInSeconds:q().int().positive()}),yl=vl.extend({gatewayId:K().min(1),gatewayName:K().min(1).optional(),machineName:K().min(1).optional(),deviceId:K().min(1),gatewayIdentity:ul.optional(),deviceIdentityFingerprint:K().min(1).optional(),deviceIdentityStatus:fl.optional(),pairingConfirmation:gl.optional()}),bl=J({refreshToken:K().min(1)}),xl=vl.extend({deviceId:K().min(1),deviceIdentityFingerprint:K().min(1).optional(),deviceIdentityStatus:fl.optional()});function Sl(e){return JSON.stringify([e.gatewayId,e.deviceId,e.mobilePublicKey,e.pairingContext.pairingCode,e.pairingContext.signedAt])}var Cl=X([`missing`,`current`,`stale`]),wl=J({accountId:K().min(1),accountType:X([`chatgpt`,`apiKey`,`unknown`]),authMode:K().min(1),planType:K().min(1).nullable(),lastRefreshAt:K().datetime().nullable(),hasSavedSnapshot:Xn(),snapshotStatus:Cl,rateLimits:Nc.nullable()}),Tl=J({accountId:K().min(1),accountType:X([`chatgpt`,`apiKey`,`unknown`]),authMode:K().min(1),planType:K().min(1).nullable(),lastRefreshAt:K().datetime().nullable(),savedAt:K().datetime(),isCurrent:Xn(),rateLimits:Nc.nullable()}),El=J({current:wl.nullable(),savedAccounts:Qn(Tl)}),Dl=J({saved:Y(!0),accounts:El}),Ol=J({switched:Y(!0),closedRuntimeSessionCount:q().int().nonnegative(),accounts:El}),kl=J({restarted:Y(!0),closedRuntimeSessionCount:q().int().nonnegative()}),Al=15e3,jl=12e4;function Ml(e){return{sessionId:e,messages:new Map,itemToMessageKey:new Map,requestToMessageKey:new Map,turnToLastToolMessageKey:new Map,codexSemanticMessageKeyToMessageKeys:new Map,codexHistoryReplaySemanticOccurrenceByKey:new Map}}function Nl(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 Pl(e,t){if(t.sessionId===e.sessionId){if(t.type===`item.started`||t.type===`item.updated`||t.type===`item.completed`){Rl(e,t);return}if(t.type===`tool.permission.requested`||t.type===`tool.permission.resolved`){zl(e,t);return}if(t.type===`user.input.requested`||t.type===`user.input.resolved`){Bl(e,t);return}if(t.type===`turn.completed`){Ul(e,t);return}(t.type===`turn.failed`||t.type===`error`||t.type===`error.runtime`)&&Wl(e,t)}}function Fl(e){return[...e.messages.values()].map(Eu).sort((e,t)=>{let n=e.ts.localeCompare(t.ts);return n===0?e.id.localeCompare(t.id):n})}function Il(e,t,n){let r=Ml(e),i=t[0]?.provider??`codex`,a=[...n].sort((e,t)=>e.ts.localeCompare(t.ts));for(let e of a)Nl(r,e,i);let o=[...t].filter(t=>t.sessionId===e).sort((e,t)=>e.ts.localeCompare(t.ts));for(let e of o)Pl(r,e);return r}function Ll(e,t,n){return Fl(Il(e,t,n))}function Rl(e,t){let n=fu(t.payload.raw),r=fu(n.item),i=ou(r,[`type`]),a=ou(r,[`phase`]),o=iu(n,r),s=ou(r,[`id`]),c=au(r),l=Yl(t.provider,o,i,a,c),u=l?$l(n):void 0,d=ru(n)&&l?Zl(e,l,u):void 0;if(!i){let r=au(n);if(!r)return;let i=Kl(t,`assistant`,o),a=Gl(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=hu(a.text,r)),wu(a,t);return}let f=Jl(i);if(f===`user`&&!c)return;let p=d??(s?`item:${s}`:Kl(t,i,o)),m=ql(f,i),h=f===`tool`?du(r,c):void 0,g=Gl(e,p,{id:p,sessionId:e.sessionId,provider:t.provider,kind:f,status:`streaming`,ts:t.ts,updatedAt:t.ts,source:`event`,title:m,details:[],itemType:i,itemId:s,turnId:o,collapsible:f===`reasoning`,collapsedByDefault:f===`reasoning`,debug:{eventTypes:[],rawItemType:i,...a?{rawItemPhase:a}:{}}});s&&e.itemToMessageKey.set(s,p),l&&Xl(e,l,p),o&&f===`tool`&&e.turnToLastToolMessageKey.set(o,p),g.provider=t.provider,g.itemType=i,g.debug.rawItemPhase=a??g.debug.rawItemPhase,d&&g.itemId&&s&&g.itemId!==s||(g.itemId=s??g.itemId),g.turnId=o??g.turnId,g.title=h?.title??m,g.updatedAt=t.ts,g.collapsible=f===`reasoning`,g.collapsedByDefault=f===`reasoning`,h&&(g.toolCardData=h);let _=ou(r,[`source_event_type`]);if(_&&nu(f)&&!h&&Su(g,`source: ${_}`),f===`tool`&&!h)for(let e of Cu(r))Su(g,e);t.type===`item.started`?(g.status=f===`user`?`completed`:`streaming`,c&&(g.text=gu(f)?_u(g.text,c,r):hu(g.text,c))):t.type===`item.updated`?(g.status=f===`user`?`completed`:g.status===`waiting_approval`||g.status===`waiting_input`?g.status:`streaming`,c&&(g.text=gu(f)?_u(g.text,c,r):hu(g.text,c))):t.type===`item.completed`&&(g.status=f===`error`?`failed`:`completed`,c&&(g.text=c)),wu(g,t),l&&ru(n)&&Ql(e,l,u),f===`user`&&g.text&&Tu(e,g.text,g.ts)}function zl(e,t){let n=fu(t.payload.raw),r=ou(n,[`requestId`,`request_id`]);if(!r)return;let i=ou(n,[`itemId`,`item_id`]),a=ou(n,[`turnId`,`turn_id`]),o=ou(n,[`toolName`,`tool_name`])??`tool`,s=ou(n,[`reason`]),c=ou(n,[`decision`]),l=fu(n.rawParams??n.raw_params),u=fu(l.networkApprovalContext??l.network_approval_context),d=ou(l,[`command`]),f=ou(l,[`cwd`]),p=ou(l,[`grantRoot`,`grant_root`]),m=ou(u,[`host`]),h=ou(u,[`protocol`]),g=Vl(e,r,`approval`),_=Gl(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`,Su(_,`tool: ${o}`),s&&Su(_,`reason: ${s}`),d&&Su(_,`command: ${ku(d,200)}`),f&&Su(_,`cwd: ${ku(f,200)}`),p&&Su(_,`grant_root: ${ku(p,200)}`),m&&Su(_,`network: ${ku(h?`${h}://${m}`:m,200)}`)):(_.status=c===`deny`?`failed`:`completed`,_.text=c===`deny`?`工具审批已拒绝`:`工具审批已通过`,c&&Su(_,`decision: ${c}`),s&&Su(_,`reason: ${s}`)),Hl(e,g,r,i,a),wu(_,t)}function Bl(e,t){let n=fu(t.payload.raw),r=ou(n,[`requestId`,`request_id`]);if(!r)return;let i=ou(n,[`itemId`,`item_id`]),a=ou(n,[`turnId`,`turn_id`]),o=ou(n,[`status`]),s=cu(n,[`answeredCount`,`answered_count`]),c=lu(n.questions),l=uu(n.answers),u=Vl(e,r,`user-input`),d=Gl(e,u,{id:u,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:c,debug:{eventTypes:[],rawItemType:`request_user_input`}});if(d.provider=t.provider,d.updatedAt=t.ts,d.requestId=r,d.itemId=i??d.itemId,d.turnId=a??d.turnId,d.title=`Plan Question`,t.type===`user.input.requested`)d.status=`waiting_input`,d.text=c.length>0?`\u9700\u8981\u56DE\u7B54 ${c.length} \u4E2A\u95EE\u9898`:`需要回答问题`,d.userInputQuestions=c,d.userInputAnswers=void 0,Su(d,`request_id: ${r}`);else{d.status=o===`dismissed`||o===`expired`?`failed`:`completed`;let e=s??0;d.text=`\u5DF2\u63D0\u4EA4 ${e} \u9879\u56DE\u7B54`,Su(d,`status: ${o??`submitted`}`),Su(d,`answered_count: ${e}`),c.length>0&&(d.userInputQuestions=c),l&&(d.userInputAnswers=l)}Hl(e,u,r,i,a),wu(d,t)}function Vl(e,t,n){return e.requestToMessageKey.get(t)??`${n}:${t}`}function Hl(e,t,n,r,i){e.requestToMessageKey.set(n,t),r&&e.itemToMessageKey.set(r,t),i&&e.turnToLastToolMessageKey.set(i,t)}function Ul(e,t){let n=fu(t.payload.raw),r=iu(n,void 0),i=fu(n.usage),a=fu(fu(n.turn).usage),o=cu(i,[`input_tokens`]),s=cu(i,[`output_tokens`]),c=cu(a,[`input_tokens`]),l=cu(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}`:Kl(t,`turn.usage`,r),i=Gl(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&&Su(i,`input_tokens: ${u}`),d!==void 0&&Su(i,`output_tokens: ${d}`),wu(i,t)}}function Wl(e,t){let n=fu(t.payload.raw),r=au(fu(n.error))??au(n);if(!r)return;let i=iu(n,void 0),a=i?`turn-error:${i}`:`error:${t.eventId}`,o=Gl(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,wu(o,t)}function Gl(e,t,n){return e.messages.get(t)||(e.messages.set(t,n),n)}function Kl(e,t,n){let r=Date.parse(e.ts),i=Number.isFinite(r)?Math.floor(r/Al):Math.floor(ju(e.ts)/Al);return`fallback:${e.provider}:${n??`no_turn`}:${t}:${i}`}function ql(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 Jl(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 Yl(e,t,n,r,i){if(e!==`codex`||!t||!i)return;let a=eu(n);if(!(a!==`user_message`&&a!==`agent_message`))return`${t}|${a}|${tu(a,r)}|${i}`}function Xl(e,t,n){let r=e.codexSemanticMessageKeyToMessageKeys.get(t);if(!r){e.codexSemanticMessageKeyToMessageKeys.set(t,[n]);return}r.includes(n)||r.push(n)}function Zl(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 Ql(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 $l(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 eu(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 tu(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function nu(e){return e===`tool`}function ru(e){if(e.historyReplay===!0)return!0;let t=ou(e,[`source`]);return t===`codex.history.thread_read`||t===`codex.history.thread_read.incremental`}function iu(e,t){return ou(e,[`turn_id`,`turnId`])??ou(fu(e.turn),[`id`,`turn_id`,`turnId`])??ou(t??{},[`turn_id`,`turnId`])}function au(e){return su(fu(e.payload),[`delta`,`output_delta`,`outputDelta`])||su(e,[`text`,`message`,`output`,`response`,`reason`,`output_delta`,`aggregated_output`])||pu(e)}function ou(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}}function su(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function cu(e,t){for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t}}function lu(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=fu(n),r=ou(e,[`id`]),i=ou(e,[`header`]),a=ou(e,[`question`]);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=fu(e),n=ou(t,[`label`]),r=ou(t,[`description`])??n,i=ou(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 uu(e){let t=fu(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 du(e,t){if(ou(e,[`display_as`])!==`tool_card`)return;let n=ou(e,[`title`])??t,r=ou(e,[`status_label`])??t;if(!n||!r)return;let i=[],a=ou(e,[`prompt`]),o=ou(e,[`response`]),s=ou(e,[`response_label`])??`Response`;a&&i.push({label:`Prompt`,body:a}),o&&i.push({label:s,body:o});let c=[],l=ou(e,[`file_path`]),u=cu(e,[`total_tool_uses`]),d=cu(e,[`total_tokens`]),f=cu(e,[`duration_ms`]);return l&&c.push(l),typeof u==`number`&&c.push(`${u} tool uses`),typeof d==`number`&&c.push(`${Du(d)} tokens`),typeof f==`number`&&c.push(Ou(f)),{title:n,statusLabel:r,compactText:t?Au(t):void 0,sections:i,details:c}}function fu(e){return typeof e==`object`&&e?e:{}}function pu(e){return Ac(e,mu)}function mu(e){if(typeof e==`string`&&e.length>0)return e;let t=fu(e),n=su(t,[`text`,`message`,`output`,`response`,`reason`]);if(n)return n;let r=su(fu(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=su(fu(e),[`text`,`value`]);t&&i.push(t)}return i.length>0?i.join(``):void 0}function hu(e,t){return!e||t.startsWith(e)?t:e.endsWith(t)?e:`${e}${t}`}function gu(e){return e===`assistant`||e===`reasoning`}function _u(e,t,n){return e?t===e?e:t.startsWith(e)?t:e.endsWith(t)?e:vu(n)?`${e}${t}`:bu(e,t)?t:`${e}${t}`:t}function vu(e){let t=fu(e.payload);return xu(t.delta)||xu(t.output_delta)||xu(t.outputDelta)||xu(e.output_delta)||xu(e.outputDelta)?!0:yu(ou(e,[`original_method`,`originalMethod`]))}function yu(e){return e?e===`item/agentMessage/delta`||e===`codex/event/agent_message_content_delta`:!1}function bu(e,t){return t.length===0||t.length<24?!1:t.length>=Math.floor(e.length*.7)}function xu(e){return typeof e==`string`&&e.length>0}function Su(e,t){t.trim()&&(e.details.includes(t)||e.details.push(t))}function Cu(e){let t=[],n=ou(e,[`command`]),r=ou(e,[`tool_name`,`tool`]),i=ou(e,[`server`]),a=ou(e,[`status`]),o=ou(e,[`query`]),s=ou(e,[`output_delta`,`aggregated_output`]),c=e.history_output_omitted===!0||e.historyOutputOmitted===!0,l=cu(e,[`history_output_byte_length`,`historyOutputByteLength`]),u=cu(e,[`exit_code`]),d=ou(fu(e.error),[`message`]);if(n&&t.push(`command: ${ku(n,200)}`),r&&t.push(`tool: ${r}`),i&&t.push(`server: ${i}`),a&&t.push(`status: ${a}`),o&&t.push(`query: ${ku(o,200)}`),u!==void 0&&t.push(`exit_code: ${u}`),d&&t.push(`error: ${ku(d,200)}`),s?t.push(`output: ${ku(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=fu(e),r=ou(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=fu(e),r=ou(n,[`path`])??`unknown`,i=ou(n,[`kind`])??`update`;t.push(`${i}: ${r}`)}}return t}function wu(e,t){e.debug.eventTypes.includes(t.type)||e.debug.eventTypes.push(t.type)}function Tu(e,t,n){let r=Au(t),i=Date.parse(n);for(let[t,n]of e.messages.entries()){if(n.kind!==`user`||n.source!==`optimistic`||Au(n.text??``)!==r)continue;let a=Date.parse(n.ts);if(!(Number.isFinite(i)&&Number.isFinite(a)&&Math.abs(i-a)>jl)){e.messages.delete(t);return}}}function Eu(e){return{...e,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 Du(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}function Ou(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 ku(e,t){return e.length<=t?e:`${e.slice(0,t)}...`}function Au(e){return e.trim().replace(/\s+/g,` `)}function ju(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t}var Mu=X([`unknown`,`checking`,`up_to_date`,`available`,`unsupported_install`,`updating`,`restarting`,`failed`]),Nu=X([`npm`,`pnpm`,`yarn`,`unknown`]),Pu=X([`global_registry`,`global_file`,`dev_workspace`,`standalone_binary`,`unknown`]),Fu=X([`console`,`mobile`,`system`]),Iu=J({manager:Nu,installType:Pu,packageName:K().min(1),packageRoot:K().min(1).optional(),binPath:K().min(1).optional(),canSelfUpdate:Xn(),reason:K().min(1).optional()}),Lu=J({id:K().min(1),targetVersion:K().min(1),requestedBy:Fu,requestedAt:K().datetime(),startedAt:K().datetime().optional()}),Ru=J({packageName:K().min(1),currentVersion:K().min(1),latestVersion:K().min(1).optional(),available:Xn(),canApply:Xn(),status:Mu,checkedAt:K().datetime().optional(),install:Iu,job:Lu.optional(),lastError:K().min(1).optional()}),zu=J({type:Y(`gateway.update.status`),payload:Ru}),Bu=J({started:Xn(),update:Ru}),Vu=er(`kind`,[J({kind:Y(`session_relative`),sessionId:K().min(1),path:K().min(1)}),J({kind:Y(`project_relative`),projectId:K().min(1),path:K().min(1)}),J({kind:Y(`absolute`),path:K().min(1)})]),Hu=er(`kind`,[J({kind:Y(`project_relative`),projectId:K().min(1),path:K().min(1).optional()}),J({kind:Y(`absolute`),path:K().min(1).optional()})]),Uu=X([`text`,`code`,`markdown`,`image`,`video`,`audio`,`pdf`,`office`,`archive`,`binary`,`unknown`]),Wu=X([`inline_text`,`inline_media`,`browser`,`share_sheet`,`download`]),Gu=J({canReadText:Xn(),canPreparePreview:Xn(),supportsRange:Xn()}),Ku=J({locator:Vu,canonicalPath:K().min(1),displayName:K().min(1),projectId:K().min(1).optional(),relativePath:K().min(1).optional(),kind:Y(`file`),sizeBytes:q().int().nonnegative(),mimeType:K().min(1),extension:K().min(1),updatedAt:K().datetime().optional(),etag:K().min(1),previewCategory:Uu,preferredPreviewAction:Wu,capabilities:Gu}),qu=J({name:K().min(1),path:K().min(1),kind:X([`file`,`dir`]),sizeBytes:q().int().nonnegative().optional(),mimeType:K().min(1).optional(),extension:K().min(1).optional(),updatedAt:K().datetime().optional(),previewCategory:Uu.optional()}),Ju=J({rootPath:K().min(1),currentPath:K().min(1),parentPath:K().min(1).nullable(),entries:Qn(qu)}),Yu=J({file:Ku}),Xu=J({file:Ku,content:K(),encoding:Y(`utf8`),startLine:q().int().positive(),endLineExclusive:q().int().positive(),totalLines:q().int().positive().optional(),totalBytes:q().int().nonnegative(),truncated:Xn()}),Zu=X([`inline`,`attachment`]),Qu=J({file:Ku,preview:J({url:K().min(1),expiresAt:K().datetime(),supportsRange:Xn(),contentType:K().min(1),contentDisposition:Zu})}),$u=nr(e=>{if(typeof e!=`string`)return e;let t=e.trim();return t.length>0?t:e},K().trim().min(1)),ed=J({id:K().min(1),title:K().min(1),path:K().min(1),createdAt:K().datetime(),updatedAt:K().datetime(),lastSessionAt:K().datetime().optional(),runningCount:q().int().nonnegative(),idleCount:q().int().nonnegative().optional(),totalCount:q().int().nonnegative().optional(),endedCount:q().int().nonnegative()}),td=J({name:K().min(1),path:K().min(1)}),nd=J({kind:X([`home`,`desktop`,`documents`,`downloads`,`root`]),path:K().min(1)}),rd=J({rootPath:K().min(1),currentPath:K().min(1),parentPath:K().min(1).nullable(),shortcuts:Qn(nd).default([]),directories:Qn(td)}),id=X([`running`,`idle`]),ad=X([`running`,`idle`,`all`]),od=X([`external_turn_running`]),sd=X([`delta`,`snapshot`]),cd=J({id:K().min(1),nativeSessionId:K().min(1).optional(),source:X([`gateway`,`native_discovered`]).optional(),projectId:K().min(1),projectPath:K().min(1),provider:Na,providerMode:X([`native`,`mock`]).optional(),model:K().min(1).optional(),title:K().min(1).optional(),sessionTurnConfig:cc.optional(),sessionTurnConfigUpdatedAt:K().datetime().optional(),createdAt:K().datetime(),updatedAt:K().datetime(),status:id,interactionLockReason:od.optional(),pendingApprovals:q().int().nonnegative(),pendingUserInputs:q().int().nonnegative(),pendingActions:q().int().nonnegative()}),ld=J({id:K().min(1),name:K().min(1),createdAt:K().datetime(),revokedAt:K().datetime().optional(),identityAlgorithm:X([`ed25519`]).optional(),publicKeyFingerprint:K().min(1).optional(),identityStatus:fl.optional(),lastVerifiedAt:K().datetime().optional()}),ud=J({name:$u,machineName:K().min(1)}),dd=J({agent:J({provider:Na,requestedVersion:K().min(1).nullable(),resolvedVersion:K().min(1)}),capabilities:Va}),fd=J({scannedAt:K().datetime(),sessionCount:q().int().nonnegative(),status:X([`ready`,`partial`,`failed`]),error:K().min(1).optional()}),pd=J({codex:fd.optional(),claude:fd.optional()}),md=J({key:K().min(1),path:K().min(1),title:K().min(1),lastSessionAt:K().datetime().optional(),sessionCount:q().int().nonnegative(),providerCounts:J({codex:q().int().nonnegative(),claude:q().int().nonnegative()}),lastDiscoveryAt:K().datetime()}),hd=J({provider:Na,nativeSessionId:K().min(1),title:K().min(1).optional(),model:K().min(1).optional(),createdAt:K().datetime().optional(),updatedAt:K().datetime()}),gd=J({generatedAt:K().datetime(),source:X([`cache`,`fresh_scan`]),providers:pd,projects:Qn(md)}),_d=J({canonicalProjectPath:K().min(1),project:md,providers:pd,sessions:Qn(hd)}),vd=X(`auth.refresh,codex.accounts.get,codex.accounts.save,codex.accounts.switch,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(`,`)),yd=J({}).strict(),bd=er(`method`,[J({method:Y(`auth.refresh`),params:bl.extend({deviceId:K().min(1).optional()})}),J({method:Y(`codex.accounts.get`),params:yd}),J({method:Y(`codex.accounts.save`),params:yd}),J({method:Y(`codex.accounts.switch`),params:J({accountId:K().min(1)})}),J({method:Y(`codex.appServer.restart`),params:J({requestedBy:Fu.optional()})}),J({method:Y(`gateway.settings.get`),params:yd}),J({method:Y(`gateway.settings.update`),params:J({name:$u})}),J({method:Y(`gateway.update.get`),params:yd}),J({method:Y(`gateway.update.apply`),params:J({requestedBy:Fu.optional()})}),J({method:Y(`projects.list`),params:yd}),J({method:Y(`projects.discovery.get`),params:yd}),J({method:Y(`projects.discovery.refresh`),params:yd}),J({method:Y(`projects.create`),params:J({path:$u,title:K().min(1).optional()})}),J({method:Y(`projects.delete`),params:J({projectId:K().min(1)})}),J({method:Y(`workspace.directories.list`),params:J({path:K().min(1).optional(),limit:q().int().positive().max(500).optional()})}),J({method:Y(`workspace.directories.create`),params:J({path:$u,name:$u})}),J({method:Y(`workspace.entries.list`),params:J({locator:Hu,limit:q().int().positive().max(500).optional()})}),J({method:Y(`workspace.files.resolve`),params:J({locator:Vu})}),J({method:Y(`workspace.files.readText`),params:J({locator:Vu,encoding:Y(`utf8`).optional(),startLine:q().int().positive().optional(),maxLines:q().int().positive().max(5e3).optional(),maxBytes:q().int().positive().max(1024*1024).optional()})}),J({method:Y(`workspace.files.preparePreview`),params:J({locator:Vu,disposition:Zu.optional()})}),J({method:Y(`sessions.list`),params:J({projectId:K().min(1),status:ad.optional(),syncExternal:Xn().optional()})}),J({method:Y(`sessions.discovery.list`),params:J({projectPath:$u})}),J({method:Y(`sessions.get`),params:J({projectId:K().min(1),sessionId:K().min(1)})}),J({method:Y(`sessions.config.get`),params:J({projectId:K().min(1),sessionId:K().min(1)})}),J({method:Y(`sessions.history.sync`),params:J({projectId:K().min(1),sessionId:K().min(1)})}),J({method:Y(`sessions.rawEvents.list`),params:J({projectId:K().min(1),sessionId:K().min(1),limit:$n([q().int().positive().max(2e3),Y(`all`)]).optional(),fromRawSeqExclusive:q().int().nonnegative().optional(),detailLevel:hc.optional()})}),J({method:Y(`sessions.readableItem.get`),params:J({projectId:K().min(1),sessionId:K().min(1),itemId:K().min(1)})}),J({method:Y(`providers.capabilities.get`),params:J({provider:Na,projectId:K().min(1).optional(),agentVersion:K().min(1).optional()})}),J({method:Y(`providers.execution.update`),params:za}),J({method:Y(`agents.config.get`),params:J({provider:Na,projectId:K().min(1).optional(),agentVersion:K().min(1).optional()})}),J({method:Y(`devices.list`),params:yd}),J({method:Y(`devices.revoke`),params:J({deviceId:K().min(1)})})]),xd=er(`method`,[J({method:Y(`auth.refresh`),result:xl.extend({relayToken:K().min(1).optional()})}),J({method:Y(`codex.accounts.get`),result:El}),J({method:Y(`codex.accounts.save`),result:Dl}),J({method:Y(`codex.accounts.switch`),result:Ol}),J({method:Y(`codex.appServer.restart`),result:kl}),J({method:Y(`gateway.settings.get`),result:ud}),J({method:Y(`gateway.settings.update`),result:ud}),J({method:Y(`gateway.update.get`),result:Ru}),J({method:Y(`gateway.update.apply`),result:Bu}),J({method:Y(`projects.list`),result:J({projects:Qn(ed)})}),J({method:Y(`projects.discovery.get`),result:gd}),J({method:Y(`projects.discovery.refresh`),result:gd}),J({method:Y(`projects.create`),result:J({project:ed})}),J({method:Y(`projects.delete`),result:J({removed:Y(!0)})}),J({method:Y(`workspace.directories.list`),result:rd}),J({method:Y(`workspace.directories.create`),result:rd}),J({method:Y(`workspace.entries.list`),result:Ju}),J({method:Y(`workspace.files.resolve`),result:Yu}),J({method:Y(`workspace.files.readText`),result:Xu}),J({method:Y(`workspace.files.preparePreview`),result:Qu}),J({method:Y(`sessions.list`),result:J({sessions:Qn(cd)})}),J({method:Y(`sessions.discovery.list`),result:_d}),J({method:Y(`sessions.get`),result:J({session:cd})}),J({method:Y(`sessions.config.get`),result:J({session:cd})}),J({method:Y(`sessions.history.sync`),result:J({session:cd,rawEventCount:q().int().nonnegative(),historyUpdated:Xn(),statusChanged:Xn(),refreshMode:sd,fromRawSeq:q().int().nonnegative().optional(),toRawSeq:q().int().nonnegative().optional()})}),J({method:Y(`sessions.rawEvents.list`),result:er(`decision`,[J({decision:Y(`delta`),reason:X([`cursor_valid_delta`]),fromRawSeqExclusive:q().int().nonnegative(),toRawSeq:q().int().nonnegative(),events:Qn(Zn())}),J({decision:Y(`snapshot`),reason:X([`cursor_out_of_range`,`initial_snapshot`,`empty_history_snapshot`]),toRawSeq:q().int().nonnegative().optional(),events:Qn(Zn())})])}),J({method:Y(`sessions.readableItem.get`),result:J({item:vo})}),J({method:Y(`providers.capabilities.get`),result:J({capabilities:Va})}),J({method:Y(`providers.execution.update`),result:J({defaults:za})}),J({method:Y(`agents.config.get`),result:dd}),J({method:Y(`devices.list`),result:J({devices:Qn(ld)})}),J({method:Y(`devices.revoke`),result:J({revoked:Y(!0)})})]),Sd=`json-utf8`,Cd=X([Sd]),wd=X([`identity`,`gzip`]),Td=J({version:Y(1),compression:Y(`gzip`),payloadEncoding:Cd.default(Sd),uncompressedByteLength:q().int().positive(),compressedByteLength:q().int().positive(),data:pc});function Ed(e){let t=kd(e.payload),n=t.byteLength;if(n<(e.compressionThresholdBytes??1/0))return{payloadEncoding:Sd,compression:`identity`,payloadBytes:t,uncompressedByteLength:n,compressedByteLength:n};let r=ti(t);return r.byteLength>=n?{payloadEncoding:Sd,compression:`identity`,payloadBytes:t,uncompressedByteLength:n,compressedByteLength:n}:{payloadEncoding:Sd,compression:`gzip`,payloadBytes:r,uncompressedByteLength:n,compressedByteLength:r.byteLength}}function Dd(e){return e.compression===`gzip`?Td.parse({version:1,compression:`gzip`,payloadEncoding:e.payloadEncoding,uncompressedByteLength:e.uncompressedByteLength,compressedByteLength:e.compressedByteLength,data:Md(e.payloadBytes)}):null}function Od(e){let t=wd.parse(e.compression??`identity`),n=e.payloadBytes;if(t===`gzip`)try{n=ni(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(jd(n))}catch{throw Error(`compressed_payload_invalid`)}return e.parse(r)}function kd(e){return Ad(JSON.stringify(e))}function Ad(e){return new TextEncoder().encode(e)}function jd(e){return new TextDecoder().decode(e)}function Md(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 Nd=K().url(),Pd=$n([Nd,Y(``)]),Fd=K().min(1).regex(/^[A-Za-z0-9_-]+$/u),Id=X([`plaintext-relay`,`e2ee-relay`]),Ld=X([`plain`,`crypt`]);function Rd(e){if(e===`plain`||e===`crypt`)return e;if(e===`plaintext-relay`)return`plain`;if(e===`e2ee-relay`)return`crypt`}function zd(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let t=e,n=Rd(t.tsl??t.transportSecurityLevel);return n?{...t,tsl:n}:t}function Bd(e){return e.trim()}var Vd=X([`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`]),Hd=q().int().positive(),Ud=q().int().min(0).max(2**53-1),Wd=X([`identity_mismatch`,`device_revoked`,`transcript_invalid`,`counter_replay`,`counter_gap_too_large`,`key_epoch_mismatch`,`decrypt_failed`,`unsupported_version`]),Gd=X([`guest`,`account`,`self_hosted`]);J({type:Y(`relay.gateway`),grantType:Gd,gatewayId:K().min(1),subjectId:K().min(1),gatewayIdentityFingerprint:K().min(1).optional(),jti:K().min(1),iss:K().min(1),aud:K().min(1),iat:q().int().nonnegative(),exp:q().int().positive()}),J({type:Y(`relay.mobile`),gatewayId:K().min(1),deviceId:K().min(1),iat:q().int().nonnegative(),exp:q().int().positive()});var Kd=J({v:Y(1),gw:K().min(1),name:K().min(1),machineName:K().min(1).optional(),relay:Pd.optional(),direct:Qn(Nd).default([]),pc:K().min(1),tsl:Ld.optional(),gatewayIdentity:ul.optional()});nr(zd,Kd);var qd=nr(zd,Kd.omit({pc:!0}));nr(zd,J({v:Y(1),gw:K().min(1),relay:Pd.optional(),direct:Pd.optional(),pc:K().min(1),tsl:Ld.optional(),gatewayIdentity:ul.optional()}));var Jd=nr(zd,J({v:Y(1),gw:K().min(1),relay:Pd.optional(),direct:Nd,pc:K().min(1),pkf:Fd,tsl:Ld.optional()})),Yd=J({name:K().min(1),relayBaseUrl:Pd.optional(),directBaseUrls:Qn(Nd).default([]),transportSecurityLevel:Id.default(`plaintext-relay`),gatewayIdentity:ul.optional(),gatewayAccessToken:K().min(1).optional(),connectedAt:K().datetime().optional()}),Xd=J({gatewayId:K().min(1),deviceId:K().min(1),connectedAt:K().datetime().optional()}),Zd=J({version:Y(1),securityLevel:Y(`e2ee-relay`),cipherSuite:Vd,deviceId:K().min(1),deviceIdentity:pl,clientNonce:pc}),Qd=J({version:Y(1),securityLevel:Y(`e2ee-relay`),cipherSuite:Vd,gatewayId:K().min(1),deviceId:K().min(1),clientNonce:pc,gatewayNonce:pc,gatewayPublicKeyFingerprint:K().min(1),gatewayEphemeralPublicKey:pc,signatureAlgorithm:Y(`ed25519`),signature:pc}),$d=J({version:Y(1),gatewayId:K().min(1),deviceId:K().min(1),deviceIdentityFingerprint:K().min(1),clientEphemeralPublicKey:pc,signatureAlgorithm:Y(`ed25519`),signature:pc}),ef=J({version:Y(1),securityLevel:Y(`e2ee-relay`),cipherSuite:Vd,gatewayId:K().min(1),deviceId:K().min(1),keyEpoch:Hd,deviceIdentityFingerprint:K().min(1),deviceIdentityStatus:fl}),tf=X([`gateway_restarted`,`gateway_available`]),nf=J({version:Y(1),gatewayId:K().min(1),deviceId:K().min(1),reason:tf,retryable:Y(!0)}),rf=J({ticket:K().min(1),method:X([`GET`,`HEAD`]),rangeHeader:K().min(1).optional(),responseMode:X([`inline_base64`,`stream_upload`]).optional(),uploadUrl:K().url().optional(),uploadToken:K().min(1).optional()}).superRefine((e,t)=>{e.responseMode===`stream_upload`&&(e.uploadUrl||t.addIssue({code:W.custom,path:[`uploadUrl`],message:`uploadUrl is required when responseMode is stream_upload`}),e.uploadToken||t.addIssue({code:W.custom,path:[`uploadToken`],message:`uploadToken is required when responseMode is stream_upload`}))}),af=J({status:$n([Y(200),Y(206),Y(416)]),headers:J({contentType:K().min(1),contentDisposition:K().min(1),contentLength:q().int().nonnegative(),etag:K().min(1),acceptRanges:Y(`bytes`).optional(),contentRange:K().min(1).optional(),lastModified:K().min(1).optional(),cacheControl:K().min(1)}),bodyTransport:X([`inline_base64`,`stream_upload`]).optional(),bodyBase64:pc.optional()}),of=J({}),sf=af,cf=J({version:Y(1),gatewayId:K().min(1),deviceId:K().min(1).optional(),code:Wd,message:K().min(1),retryable:Xn().optional()}),lf=bd,uf=xd,df=J({code:X([`BAD_REQUEST`,`NOT_FOUND`,`UNAUTHORIZED`,`TIMEOUT`,`INTERNAL`,`GATEWAY_OFFLINE`,`TOKEN_INVALID`,`TOKEN_EXPIRED`,`GATEWAY_MISMATCH`,`GATEWAY_REVOKED`]),message:K().min(1),status:q().int().min(400).max(599),details:Zn().optional()}),ff=df.extend({method:vd.optional()}),pf=_l.extend({gatewayId:K().min(1)}),mf=yl.extend({relayToken:K().min(1).optional()}),hf=bl.extend({gatewayId:K().min(1),deviceId:K().min(1).optional()}),gf=xl.extend({gatewayId:K().min(1),relayToken:K().min(1).optional()}),_f=J({gatewayId:K().min(1),gatewayIdentity:ul,requestedAt:K().datetime()});J({grantType:Y(`guest`),payload:_f,signatureAlgorithm:Y(`ed25519`),signature:pc});var vf=J({grantType:Gd,token:K().min(1),expiresInSeconds:q().int().positive()}),yf=X([`rpc`,`command`,`event`,`system`]),bf=Sd,xf=Cd,Sf=J({version:Y(1),keyEpoch:Hd,counter:Ud,iv:pc,ciphertext:pc,authTag:pc,plaintextEncoding:xf.default(bf),compression:wd.default(`identity`),uncompressedByteLength:q().int().positive().optional(),compressedByteLength:q().int().positive().optional()});X([`from_mobile`,`to_mobile`,`rpc.request`,`rpc.response`,`rpc.error`]);function Cf(e){return{payload:e.optional(),encryptedPayload:Sf.optional()}}function wf(e){return{payload:e.optional(),compressedPayload:Td.optional(),encryptedPayload:Sf.optional()}}var Tf=J({gatewayId:K().min(1),mobileId:K().min(1).optional(),messageType:yf,requestId:K().min(1).optional()}),Ef=X([`fresh_connect`,`gateway_replay`]),Df=J({deviceId:K().min(1),deliveryMode:Ef,gatewayAvailableAtConnect:Xn()}),Of=J({deviceId:K().min(1)}),kf=$n([ll,zu,J({type:Y(`command.ack`),commandType:K().min(1),commandId:K().min(1).optional(),payload:Zn().optional()}),J({type:Y(`command.error`),commandType:K().min(1).optional(),commandId:K().min(1).optional(),message:K().min(1)}),J({type:Y(`relay.error`),error:df})]),Af=er(`type`,[Tf.extend({type:Y(`gateway.hello`),messageType:Y(`system`),payload:Yd}),Tf.extend({type:Y(`mobile.hello`),messageType:Y(`system`),payload:Xd}),Tf.extend({type:Y(`secure.client_hello`),messageType:Y(`system`),payload:Zd}),Tf.extend({type:Y(`secure.gateway_hello`),mobileId:K().min(1),messageType:Y(`system`),payload:Qd}),Tf.extend({type:Y(`secure.client_auth`),messageType:Y(`system`),payload:$d}),Tf.extend({type:Y(`secure.ready`),mobileId:K().min(1),messageType:Y(`system`),payload:ef}),Tf.extend({type:Y(`secure.handshake_required`),mobileId:K().min(1),messageType:Y(`system`),payload:nf}),Tf.extend({type:Y(`secure.error`),mobileId:K().min(1),messageType:Y(`system`),payload:cf}),Tf.extend({type:Y(`mobile.connected`),messageType:Y(`system`),payload:Df}),Tf.extend({type:Y(`mobile.disconnected`),messageType:Y(`system`),payload:Of}),Tf.extend({type:Y(`from_mobile`),messageType:Y(`command`),mobileId:K().min(1),...Cf(Oc)}),Tf.extend({type:Y(`to_mobile`),messageType:Y(`event`),mobileId:K().min(1),...wf(kf)}),Tf.extend({type:Y(`rpc.request`),messageType:Y(`rpc`),requestId:K().min(1),mobileId:K().min(1),...Cf(lf)}),Tf.extend({type:Y(`rpc.response`),messageType:Y(`rpc`),requestId:K().min(1),mobileId:K().min(1),...wf(uf)}),Tf.extend({type:Y(`rpc.error`),messageType:Y(`rpc`),requestId:K().min(1),mobileId:K().min(1),...wf(ff)}),Tf.extend({type:Y(`broadcast`),messageType:Y(`event`),payload:ll}),Tf.extend({type:Y(`pairing.claim.forward`),messageType:Y(`system`),requestId:K().min(1),payload:pf}),Tf.extend({type:Y(`pairing.claim.result`),messageType:Y(`system`),requestId:K().min(1),payload:mf}),Tf.extend({type:Y(`auth.refresh.forward`),messageType:Y(`system`),requestId:K().min(1),payload:hf}),Tf.extend({type:Y(`auth.refresh.result`),messageType:Y(`system`),requestId:K().min(1),payload:gf}),Tf.extend({type:Y(`file.content.forward`),messageType:Y(`system`),requestId:K().min(1),payload:rf}),Tf.extend({type:Y(`file.content.result`),messageType:Y(`system`),requestId:K().min(1),payload:af}),Tf.extend({type:Y(`file.content.upload.started`),messageType:Y(`system`),requestId:K().min(1),payload:of}),Tf.extend({type:Y(`relay.error`),messageType:Y(`system`),payload:df})]);function jf(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 Mf(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 Nf(e){return JSON.stringify([`relay-secure-gateway-hello-v1`,Mf(e)])}function Pf(e){return JSON.stringify([`relay-secure-client-auth-v1`,Mf(e),e.clientAuth.clientEphemeralPublicKey])}function Ff(e){let t=Hd.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 If(e){let t=e.clientHello.cipherSuite;if(t!==`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`)throw Error(`unsupported cipher suite: ${t}`);let n=Hd.parse(e.keyEpoch??1),r=Jf(Zf(Ff({gatewayId:e.gatewayId,clientHello:e.clientHello,gatewayHello:e.gatewayHello,clientAuth:e.clientAuth,keyEpoch:n}))),i=Jf(Xf(Zf(`relay-secure-hkdf-salt-v1`),r)),a=Zf(JSON.stringify([`relay-secure-key-schedule-v1`,e.gatewayId,e.clientHello.deviceId,t,n])),o=qf(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 Lf(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 Rf(e,t){let n=Ud.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($f(n),4),r}function zf(e,t){let n=Ud.parse(t);if(e===null)return;let r=Ud.parse(e);if(n<=r)throw Error(`counter_replay`);if(n-r>1e3)throw Error(`counter_gap_too_large`)}function Bf(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 Vf(e){Yf(e.session.cipherSuite);let t=e.session.outboundCounter,n=Rf(e.session.outboundNoncePrefix,t),r=e.preparedPayload.payloadBytes,i=Zf(Bf({metadata:e.metadata,encryptedPayload:{version:1,keyEpoch:e.session.keyEpoch,counter:t}})),a=Ki(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,Sf.parse({version:1,keyEpoch:e.session.keyEpoch,counter:t,iv:Uf(n),ciphertext:Uf(o),authTag:Uf(s),plaintextEncoding:bf,compression:e.preparedPayload.compression,...e.preparedPayload.compression===`gzip`?{uncompressedByteLength:e.preparedPayload.uncompressedByteLength,compressedByteLength:e.preparedPayload.compressedByteLength}:{}})}function Hf(e){Yf(e.session.cipherSuite);let t=Sf.parse(e.encryptedPayload);if(t.keyEpoch!==e.session.keyEpoch)throw Error(`key_epoch_mismatch`);zf(e.session.highestInboundCounter,t.counter);let n=Rf(e.session.inboundNoncePrefix,t.counter),r=Wf(t.iv);if(!Qf(r,n))throw Error(`decrypt_failed`);let i=Zf(Bf({metadata:e.metadata,encryptedPayload:t})),a=Xf(Wf(t.ciphertext),Wf(t.authTag)),o;try{o=Ki(e.session.inboundKey,r,i).decrypt(a)}catch{throw Error(`decrypt_failed`)}e.session.highestInboundCounter=t.counter;try{return Od({payloadBytes:o,compression:t.compression,expectedUncompressedByteLength:t.uncompressedByteLength,parse:e.parse})}catch{throw Error(`decrypt_failed`)}}function Uf(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 Wf(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 Gf(e){return Uf(e).replace(/\+/gu,`-`).replace(/\//gu,`_`).replace(/=+$/u,``)}function Kf(e){return Wf(e.replace(/-/gu,`+`).replace(/_/gu,`/`).padEnd(Math.ceil(e.length/4)*4,`=`))}function qf(e,t,n,r){return r<=0?new Uint8Array:new Uint8Array(va(Ma,e,t.length>0?t:new Uint8Array(32),n,r))}function Jf(e){return new Uint8Array(Ma(e))}function Yf(e){if(e!==`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`)throw Error(`unsupported cipher suite: ${e}`)}function Xf(...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 Zf(e){return new TextEncoder().encode(e)}function Qf(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 $f(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 ep(e){return Gf(Ma(Wf(e)).subarray(0,16))}function tp(e){if(e.type!==`native.raw`)return null;let t=sp(e.payload.raw),n=sp(t.message),r=sp(n.params),i=sp(r.msg),a=cp(n.method)??cp(t.method);if(!a)return null;let o=cp(i.type)??``;if(!ap(a)&&!op(o))return null;let s=ip(t);if(!s||!s.delta)return null;let c=cp(r.conversationId)??cp(r.conversation_id)??``,l=cp(i.thread_id)??cp(i.threadId)??cp(r.threadId)??cp(r.thread_id)??``,u=cp(i.turn_id)??cp(i.turnId)??cp(r.turnId)??cp(r.turn_id)??``,d=cp(i.item_id)??cp(i.itemId)??cp(r.itemId)??cp(r.item_id)??``,f=cp(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 np(e,t){let n=tp(e),r=tp(t);if(!n||!r||n.key!==r.key)return null;let i=`${n.delta}${r.delta}`,a=sp(t.payload.raw),o=ip(a)?.location??ip(sp(e.payload.raw))?.location;return o?{...t,eventId:e.eventId,ts:t.ts,payload:{...t.payload,raw:rp(a,o,i)}}:null}function rp(e,t,n){if(t===`raw.delta`)return{...e,delta:n};let r=sp(e.message),i=sp(r.params);if(t===`params.delta`)return{...e,message:{...r,params:{...i,delta:n}}};let a=sp(i.msg);return{...e,message:{...r,params:{...i,msg:{...a,delta:n}}}}}function ip(e){let t=sp(sp(e.message).params),n=sp(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 ap(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function op(e){return e.endsWith(`_delta`)||e.endsWith(`Delta`)}function sp(e){return typeof e==`object`&&e?e:{}}function cp(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():cp(e)??``}var up=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]),dp=/\u001B\[[0-?]*[ -/]*[@-~]/g,fp={"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 pp(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=nl.safeParse(e.type);if(t.success){n.push(vp(e,t.data,Dp(e.payload.raw),e.eventId));continue}if(e.type!==`native.raw`)continue;let r=Dp(e.payload.raw),i=hp(e,r);if(i.length>0&&n.push(...i),r.historyReplay!==!0)continue;let o=Z(r.source);if(o?.startsWith(`codex.history.thread_read`)){n.push(...gp(e,r));continue}o&&up.has(o)&&a.push(e)}a.length>0&&n.push(..._p(a,o));let s=new Map,c=new Map;for(let e of n){let t=Sp(e);if(!t){s.set(e.eventId,e);continue}let n=Cp(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=Gp(e.type)-Gp(t.type);return r===0?e.eventId.localeCompare(t.eventId):r})}function mp(e,t,n){return Ll(e,pp(e,t),n)}function hp(e,t){if(e.type!==`native.raw`||Z(t.source)!==`codex.app_server`)return[];let n=Dp(t.message),r=Dp(n.params),i=Z(n.method)??Z(t.method);if(!i)return[];if(i===`turn/started`||i===`turn/completed`||i===`turn/failed`||i===`turn/interrupted`){let t=bp(Dp(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=Z(t.status)??(i===`turn/completed`?`completed`:i===`turn/interrupted`?`interrupted`:`failed`),o=Dp(t.error);return[vp(e,n,{turn:t,status:a,turn_id:Z(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=yp(Dp(r.item));if(Object.keys(t).length===0)return[];let n=Z(r.turn_id)??Z(r.turnId)??Z(Dp(r.turn).id)??Z(t.turn_id)??Z(t.turnId);return[vp(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 gp(e,t){let n=[],r=Dp(t.message),i=Z(r.scope);if(i===`thread`){let t=Dp(r.thread),i=Z(t.id);n.push(vp(e,`thread.started`,{thread_id:i,thread:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:thread_started`));let a=kp(Z(t.preview));return a&&n.push(vp(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=Dp(r.turn),i=Z(t.status);return n.push(vp(e,`turn.started`,{turn:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_started`)),i===`completed`||i===`interrupted`?n.push(vp(e,`turn.completed`,{status:i,turn:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_completed`)):i===`failed`&&n.push(vp(e,`turn.failed`,{status:i,turn:t,error:Dp(t.error),source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_failed`)),n}if(i===`item`){let t=Dp(r.item),i=Z(r.turn_id)??Z(t.turn_id);n.push(vp(e,`item.completed`,{turn_id:i,item:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:item_completed`))}return n}function _p(e,t){let n=[],r=e[0];if(!r)return n;let i=Dp(r.payload.raw),a=Dp(i.message),o=Z(i.native_session_id)??Z(a.session_id)??r.sessionId,s=new Map,c=!1,l=0,u;n.push(vp(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(vp(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(vp(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(vp(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=Dp(r.payload.raw),i=Dp(e.message),a=Z(e.native_type)??Z(i.type),l=Dp(i.message),u=Z(e.source)??`claude.history.getSessionMessages`,m=Wp(e.source_line);if(a===`user`){let e=Ap(l),a=Mp(l);if(e){if(!c){let t=kp(e);t&&(n.push(vp(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 a=d(r,u,m);n.push(vp(r,`item.completed`,{item:{id:Z(i.uuid)??t(),type:`user_message`,text:e,turn_id:a.id,source_event_type:u},source_line:m},`${r.eventId}:item_completed_user`))}a.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(vp(r,`item.completed`,{item:Fp(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);jp(l).forEach((e,i)=>{e.id&&s.set(e.id,e),!e.skipReplay&&n.push(vp(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=Ap(l);g&&n.push(vp(r,`item.completed`,{item:{id:Z(l.id)??Z(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 _=Up(Z(i.error));_&&p(r,u,m,_)}let m=e[e.length-1];if(m){let e=Dp(m.payload.raw);f(m,Z(e.source)??`claude.history.getSessionMessages`,Wp(e.source_line))}return n}function vp(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 yp(e){let t=wp(e),n=Z(e.type);return n&&(t.type=xp(n)),t}function bp(e,t){let n=wp(e),r=Z(e.id)??Z(t.turn_id)??Z(t.turnId);return r&&(n.id=r),n}function xp(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 Ep(e)}}function Sp(e){if(e.type!==`item.started`&&e.type!==`item.completed`)return;let t=Dp(e.payload.raw),n=Dp(t.item),r=Z(n.id)??Z(n.item_id)??Z(n.itemId);if(!r)return;let i=Z(t.turn_id)??Z(t.turnId)??Z(n.turn_id)??Z(n.turnId)??``;return[e.type,e.sessionId,i,r].join(`|`)}function Cp(e){return Array.isArray(e)?e.reduce((e,t)=>e+Cp(t),0):e&&typeof e==`object`?Object.entries(e).reduce((e,[t,n])=>e+t.length+Cp(n),1):typeof e==`string`?e.length:typeof e==`number`||typeof e==`boolean`?1:0}function wp(e){let t={};for(let[n,r]of Object.entries(e))t[Ep(n)]=Tp(r);return t}function Tp(e){return Array.isArray(e)?e.map(e=>Tp(e)):typeof e==`object`&&e?wp(e):e}function Ep(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).toLowerCase()}function Dp(e){return typeof e==`object`&&e?e:{}}function Z(e){return typeof e==`string`&&e.trim()||void 0}function Op(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function kp(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 Ap(e){let t=Z(e.content);if(t)return Up(t);let n=Z(e.text)??Z(e.prompt);if(n)return Up(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=Dp(e),n=Z(t.type);if(n&&n!==`text`)continue;let r=Z(t.text)??Z(t.content)??Hp(t);r&&i.push(r)}if(i.length!==0)return Up(i.join(`
135
+ `):void 0}var jc=J({inputTokens:q().int().nonnegative(),cachedInputTokens:q().int().nonnegative(),outputTokens:q().int().nonnegative(),reasoningOutputTokens:q().int().nonnegative(),totalTokens:q().int().nonnegative()}),Mc=J({usedPercent:q(),windowMinutes:q().int().nonnegative().nullable(),resetsAt:q().nonnegative().nullable()}),Nc=J({primary:Mc.nullable().optional(),secondary:Mc.nullable().optional(),planType:K().min(1).nullable().optional(),creditsBalance:K().min(1).nullable().optional()}),Pc=J({provider:Na,usage:J({currentUsage:jc,latestTurnUsage:jc.nullable(),contextWindow:q().int().nonnegative().nullable(),sourceLabel:K().min(1),note:K().min(1).optional()}).nullable(),rateLimits:Nc.optional()});function Fc(e){return e.provider===`claude`?Lc(e.rawEvents):Ic(e.rawEvents)}function Ic(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=null;for(let c of Xc(e)){let e=tl(c.payload.raw),l=c.type===`native.raw`?Rc(e):null;l?.usage&&((qc(l.usage)||!t)&&(t=l.usage),Jc(l.usage.latestTurnUsage)?n=l.usage.latestTurnUsage:Jc(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=zc(c);if(u){let e=u.latestTurnUsage??u.currentUsage;Jc(e)&&(n=e),r=u.contextWindow??r,!t&&(qc(u)||u.contextWindow)&&(t=u)}}let c=t?{...t,latestTurnUsage:Jc(n)?n:Jc(t.latestTurnUsage)?t.latestTurnUsage:Jc(t.currentUsage)?t.currentUsage:null,contextWindow:t.contextWindow??r}:null,l=Vc({primary:i,secondary:a,planType:o,creditsBalance:s});return!c&&!l?null:{provider:`codex`,usage:c,...l?{rateLimits:l}:{}}}function Lc(e){let t=null;for(let n of Xc(e)){let e=zc(n);e&&(t=e)}return t?{provider:`claude`,usage:t}:null}function Rc(e){if(e.source===`codex.history.thread_read`){let t=tl(e.message),n=tl(t.turn),r=Wc(n.usage??t.usage),i=$c(n.model_context_window??t.model_context_window);return!r&&i===void 0?null:{usage:{currentUsage:r??Yc(),latestTurnUsage:r??null,contextWindow:i??null,sourceLabel:`codex.history.thread_read`,note:`当前来自 Codex history replay 快照。`}}}let t=Zc(e);if(!t)return null;let n=tl(tl(e.message).params);if(t===`thread/tokenUsage/updated`){let e=tl(n.tokenUsage??n.token_usage),t=Wc(e.total??e.total_token_usage);return t?{usage:{currentUsage:t,latestTurnUsage:Wc(e.last??e.last_token_usage),contextWindow:$c(e.modelContextWindow??e.model_context_window)??null,sourceLabel:`thread/tokenUsage/updated`}}:null}if(t===`account/rateLimits/updated`){let e=Bc(n.rateLimits??n.rate_limits);return e?{rateLimits:e}:null}if(t===`codex/event/token_count`){let e=tl(n.msg),t=tl(e.info),r=Wc(t.total_token_usage??t.totalTokenUsage),i=Bc(e.rate_limits??e.rateLimits);return!r&&!i?null:{usage:r?{currentUsage:r,latestTurnUsage:Wc(t.last_token_usage??t.lastTokenUsage),contextWindow:$c(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=tl(n.msg),t=$c(e.model_context_window??e.modelContextWindow);return t===void 0?null:{usage:{currentUsage:Yc(),latestTurnUsage:null,contextWindow:t,sourceLabel:`codex/event/task_started`,note:`目前只拿到了 context window,尚未拿到 thread token usage 快照。`}}}return null}function zc(e){if(e.type!==`turn.completed`&&e.type!==`turn.failed`&&e.type!==`turn.started`)return null;let t=tl(e.payload.raw),n=Uc(t.usage??tl(t.turn).usage),r=$c(t.model_context_window??tl(t.turn).model_context_window);return!n&&r===void 0?null:{currentUsage:n??Yc(),latestTurnUsage:n??null,contextWindow:r??null,sourceLabel:e.type}}function Bc(e){let t=tl(e),n=Hc(t.primary),r=Hc(t.secondary),i=el(t.plan_type??t.planType)??null,a=el(tl(t.credits).balance)??null;return!n&&!r&&!i&&!a?null:{primary:n,secondary:r,planType:i,creditsBalance:a}}function Vc(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 Hc(e){let t=tl(e),n=$c(t.used_percent??t.usedPercent);return n===void 0?null:{usedPercent:n,windowMinutes:$c(t.window_minutes??t.windowDurationMins)??null,resetsAt:$c(t.resets_at??t.resetsAt)??null}}function Uc(e){return Gc(e)}function Wc(e){return Gc(e,{totalFallback:`input_plus_output`})}function Gc(e,t){let n=tl(e),r=$c(n.input_tokens??n.inputTokens),i=$c(n.cached_input_tokens??n.cachedInputTokens??n.cache_read_input_tokens??n.cacheReadInputTokens),a=$c(n.output_tokens??n.outputTokens),o=$c(n.reasoning_output_tokens??n.reasoningOutputTokens)??0,s=$c(n.total_tokens??n.totalTokens)??Kc(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 Kc(e,t,n,r,i){return i?.totalFallback===`input_plus_output`?Qc(e,n):Qc(e,t,n,r)}function qc(e){return Jc(e.latestTurnUsage)||Jc(e.currentUsage)}function Jc(e){return e?e.inputTokens>0||e.cachedInputTokens>0||e.outputTokens>0||e.reasoningOutputTokens>0||e.totalTokens>0:!1}function Yc(){return{inputTokens:0,cachedInputTokens:0,outputTokens:0,reasoningOutputTokens:0,totalTokens:0}}function Xc(e){return[...e].sort((e,t)=>{let n=e.ts.localeCompare(t.ts);return n===0?e.rawSeq-t.rawSeq:n})}function Zc(e){return el(tl(e.message).method)??el(e.method)??null}function Qc(...e){let t=e.filter(e=>typeof e==`number`);if(t.length!==0)return t.reduce((e,t)=>e+t,0)}function $c(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 el(e){return typeof e==`string`&&e.trim()?e:void 0}function tl(e){return typeof e==`object`&&e?e:{}}var nl=X([`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`]),rl=mc.extend({type:nl}),il=mc.extend({kind:Y(`provider.raw`),rawSeq:q().int().positive(),type:K().min(1)});rl.extend({kind:Y(`gateway.control`).optional(),derivedFrom:K().min(1).optional()});var al=mc.extend({kind:Y(`session.stream.sync`),type:Y(`session.stream.sync`),payload:J({raw:J({decision:X([`delta`,`snapshot`]),reason:K().min(1),snapshotId:K().min(1).optional(),fromRawSeq:q().int().nonnegative().optional(),toRawSeq:q().int().nonnegative().optional()}).passthrough()}).passthrough()}),ol=mc.extend({kind:Y(`session.stream.snapshot.chunk`),type:Y(`session.stream.snapshot.chunk`),payload:J({raw:J({snapshotId:K().min(1),chunkIndex:q().int().nonnegative(),totalChunks:q().int().positive(),events:Qn(il)}).passthrough(),readable:J({snapshotId:K().min(1),chunkIndex:q().int().nonnegative(),totalChunks:q().int().positive(),timelineItems:Qn(vo).optional()}).passthrough().optional()}).passthrough()}),sl=mc.extend({kind:Y(`session.readable.snapshot.chunk`),type:Y(`session.readable.snapshot.chunk`),payload:J({readable:J({snapshotId:K().min(1),chunkIndex:q().int().nonnegative(),totalChunks:q().int().positive(),timelineItems:Qn(vo),pendingApprovals:Qn(mo).optional(),pendingUserInputs:Qn(_o).optional(),contextUsage:Pc.nullable().optional()}).passthrough()}).passthrough()}),cl=J({updatedAt:K().datetime().optional(),status:X([`running`,`idle`]).optional(),interactionLockReason:X([`external_turn_running`]).optional(),model:K().min(1).nullable().optional(),sessionTurnConfig:cc.optional(),sessionTurnConfigUpdatedAt:K().datetime().optional(),title:K().min(1).optional(),pendingApprovals:q().int().nonnegative().optional(),pendingUserInputs:q().int().nonnegative().optional(),pendingActions:q().int().nonnegative().optional()}),ll=$n([il,al,ol,sl,mc.extend({kind:Y(`session.readable.delta`),type:Y(`session.readable.delta`),payload:J({readable:J({fromRawSeq:q().int().nonnegative().optional(),toRawSeq:q().int().nonnegative(),timelineUpserts:Qn(vo),timelineRemovals:Qn(K().min(1)),timelineTextDeltaPatches:Qn(Js).optional(),pendingApprovalUpserts:Qn(mo).optional(),pendingApprovalRemovals:Qn(K().min(1)).optional(),pendingUserInputUpserts:Qn(_o).optional(),pendingUserInputRemovals:Qn(K().min(1)).optional(),sessionSummary:cl.optional(),contextUsage:Pc.nullable().optional()}).passthrough()}).passthrough()}),mc.extend({kind:Y(`session.external.update`),type:Y(`session.external.update`),payload:J({raw:J({updatedAt:K().datetime(),status:X([`running`,`idle`]),interactionLockReason:X([`external_turn_running`]).optional(),refreshMode:X([`delta`,`snapshot`]),fromRawSeq:q().int().nonnegative().optional(),toRawSeq:q().int().nonnegative().optional(),historyUpdated:Xn(),statusChanged:Xn(),sessionSummary:cl.optional()}).passthrough()}).passthrough()})]),ul=J({algorithm:X([`ed25519`]),publicKey:pc,publicKeyFingerprint:K().min(1),keyVersion:q().int().min(1),createdAt:K().datetime()});J({code:K().min(4),expiresAt:K().datetime()});var dl=X([`ed25519`]),fl=X([`active`,`revoked`,`rotating`,`unknown`]),pl=J({algorithm:dl,publicKey:pc,publicKeyFingerprint:K().min(1)}),ml=J({pairingCode:K().min(4),signedAt:K().datetime()}),hl=J({gatewayId:K().min(1),deviceId:K().min(1),mobilePublicKey:pc,pairingContext:ml}),gl=J({algorithm:Y(`ed25519`),gatewayPublicKeyFingerprint:K().min(1),payload:hl,signature:pc}),_l=J({code:K().min(4),deviceName:nr(e=>{if(e==null)return;if(typeof e!=`string`)return e;let t=e.trim();return t.length>0?t:void 0},K().min(1).optional()),deviceIdentity:pl.optional()}),vl=J({accessToken:K().min(1),refreshToken:K().min(1),expiresInSeconds:q().int().positive()}),yl=vl.extend({gatewayId:K().min(1),gatewayName:K().min(1).optional(),machineName:K().min(1).optional(),deviceId:K().min(1),gatewayIdentity:ul.optional(),deviceIdentityFingerprint:K().min(1).optional(),deviceIdentityStatus:fl.optional(),pairingConfirmation:gl.optional()}),bl=J({refreshToken:K().min(1)}),xl=vl.extend({deviceId:K().min(1),deviceIdentityFingerprint:K().min(1).optional(),deviceIdentityStatus:fl.optional()});function Sl(e){return JSON.stringify([e.gatewayId,e.deviceId,e.mobilePublicKey,e.pairingContext.pairingCode,e.pairingContext.signedAt])}var Cl=X([`missing`,`current`,`stale`]),wl=J({accountId:K().min(1),accountType:X([`chatgpt`,`apiKey`,`unknown`]),authMode:K().min(1),planType:K().min(1).nullable(),lastRefreshAt:K().datetime().nullable(),hasSavedSnapshot:Xn(),snapshotStatus:Cl,rateLimits:Nc.nullable()}),Tl=J({accountId:K().min(1),accountType:X([`chatgpt`,`apiKey`,`unknown`]),authMode:K().min(1),planType:K().min(1).nullable(),lastRefreshAt:K().datetime().nullable(),savedAt:K().datetime(),isCurrent:Xn(),rateLimits:Nc.nullable()}),El=J({current:wl.nullable(),savedAccounts:Qn(Tl)}),Dl=J({saved:Y(!0),accounts:El}),Ol=J({switched:Y(!0),closedRuntimeSessionCount:q().int().nonnegative(),accounts:El}),kl=J({restarted:Y(!0),closedRuntimeSessionCount:q().int().nonnegative()}),Al=15e3,jl=12e4;function Ml(e){return{sessionId:e,messages:new Map,itemToMessageKey:new Map,requestToMessageKey:new Map,turnToLastToolMessageKey:new Map,codexSemanticMessageKeyToMessageKeys:new Map,codexHistoryReplaySemanticOccurrenceByKey:new Map}}function Nl(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 Pl(e,t){if(t.sessionId===e.sessionId){if(t.type===`item.started`||t.type===`item.updated`||t.type===`item.completed`){Rl(e,t);return}if(t.type===`tool.permission.requested`||t.type===`tool.permission.resolved`){zl(e,t);return}if(t.type===`user.input.requested`||t.type===`user.input.resolved`){Bl(e,t);return}if(t.type===`turn.completed`){Ul(e,t);return}(t.type===`turn.failed`||t.type===`error`||t.type===`error.runtime`)&&Wl(e,t)}}function Fl(e){return[...e.messages.values()].map(Eu).sort((e,t)=>{let n=e.ts.localeCompare(t.ts);return n===0?e.id.localeCompare(t.id):n})}function Il(e,t,n){let r=Ml(e),i=t[0]?.provider??`codex`,a=[...n].sort((e,t)=>e.ts.localeCompare(t.ts));for(let e of a)Nl(r,e,i);let o=[...t].filter(t=>t.sessionId===e).sort((e,t)=>e.ts.localeCompare(t.ts));for(let e of o)Pl(r,e);return r}function Ll(e,t,n){return Fl(Il(e,t,n))}function Rl(e,t){let n=fu(t.payload.raw),r=fu(n.item),i=ou(r,[`type`]),a=ou(r,[`phase`]),o=iu(n,r),s=ou(r,[`id`]),c=au(r),l=Yl(t.provider,o,i,a,c),u=l?$l(n):void 0,d=ru(n)&&l?Zl(e,l,u):void 0;if(!i){let r=au(n);if(!r)return;let i=Kl(t,`assistant`,o),a=Gl(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=hu(a.text,r)),wu(a,t);return}let f=Jl(i);if(f===`user`&&!c)return;let p=d??(s?`item:${s}`:Kl(t,i,o)),m=ql(f,i),h=f===`tool`?du(r,c):void 0,g=Gl(e,p,{id:p,sessionId:e.sessionId,provider:t.provider,kind:f,status:`streaming`,ts:t.ts,updatedAt:t.ts,source:`event`,title:m,details:[],itemType:i,itemId:s,turnId:o,collapsible:f===`reasoning`,collapsedByDefault:f===`reasoning`,debug:{eventTypes:[],rawItemType:i,...a?{rawItemPhase:a}:{}}});s&&e.itemToMessageKey.set(s,p),l&&Xl(e,l,p),o&&f===`tool`&&e.turnToLastToolMessageKey.set(o,p),g.provider=t.provider,g.itemType=i,g.debug.rawItemPhase=a??g.debug.rawItemPhase,d&&g.itemId&&s&&g.itemId!==s||(g.itemId=s??g.itemId),g.turnId=o??g.turnId,g.title=h?.title??m,g.updatedAt=t.ts,g.collapsible=f===`reasoning`,g.collapsedByDefault=f===`reasoning`,h&&(g.toolCardData=h);let _=ou(r,[`source_event_type`]);if(_&&nu(f)&&!h&&Su(g,`source: ${_}`),f===`tool`&&!h)for(let e of Cu(r))Su(g,e);t.type===`item.started`?(g.status=f===`user`?`completed`:`streaming`,c&&(g.text=gu(f)?_u(g.text,c,r):hu(g.text,c))):t.type===`item.updated`?(g.status=f===`user`?`completed`:g.status===`waiting_approval`||g.status===`waiting_input`?g.status:`streaming`,c&&(g.text=gu(f)?_u(g.text,c,r):hu(g.text,c))):t.type===`item.completed`&&(g.status=f===`error`?`failed`:`completed`,c&&(g.text=c)),wu(g,t),l&&ru(n)&&Ql(e,l,u),f===`user`&&g.text&&Tu(e,g.text,g.ts)}function zl(e,t){let n=fu(t.payload.raw),r=ou(n,[`requestId`,`request_id`]);if(!r)return;let i=ou(n,[`itemId`,`item_id`]),a=ou(n,[`turnId`,`turn_id`]),o=ou(n,[`toolName`,`tool_name`])??`tool`,s=ou(n,[`reason`]),c=ou(n,[`decision`]),l=fu(n.rawParams??n.raw_params),u=fu(l.networkApprovalContext??l.network_approval_context),d=ou(l,[`command`]),f=ou(l,[`cwd`]),p=ou(l,[`grantRoot`,`grant_root`]),m=ou(u,[`host`]),h=ou(u,[`protocol`]),g=Vl(e,r,`approval`),_=Gl(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`,Su(_,`tool: ${o}`),s&&Su(_,`reason: ${s}`),d&&Su(_,`command: ${ku(d,200)}`),f&&Su(_,`cwd: ${ku(f,200)}`),p&&Su(_,`grant_root: ${ku(p,200)}`),m&&Su(_,`network: ${ku(h?`${h}://${m}`:m,200)}`)):(_.status=c===`deny`?`failed`:`completed`,_.text=c===`deny`?`工具审批已拒绝`:`工具审批已通过`,c&&Su(_,`decision: ${c}`),s&&Su(_,`reason: ${s}`)),Hl(e,g,r,i,a),wu(_,t)}function Bl(e,t){let n=fu(t.payload.raw),r=ou(n,[`requestId`,`request_id`]);if(!r)return;let i=ou(n,[`itemId`,`item_id`]),a=ou(n,[`turnId`,`turn_id`]),o=ou(n,[`status`]),s=cu(n,[`answeredCount`,`answered_count`]),c=lu(n.questions),l=uu(n.answers),u=Vl(e,r,`user-input`),d=Gl(e,u,{id:u,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:c,debug:{eventTypes:[],rawItemType:`request_user_input`}});if(d.provider=t.provider,d.updatedAt=t.ts,d.requestId=r,d.itemId=i??d.itemId,d.turnId=a??d.turnId,d.title=`Plan Question`,t.type===`user.input.requested`)d.status=`waiting_input`,d.text=c.length>0?`\u9700\u8981\u56DE\u7B54 ${c.length} \u4E2A\u95EE\u9898`:`需要回答问题`,d.userInputQuestions=c,d.userInputAnswers=void 0,Su(d,`request_id: ${r}`);else{d.status=o===`dismissed`||o===`expired`?`failed`:`completed`;let e=s??0;d.text=`\u5DF2\u63D0\u4EA4 ${e} \u9879\u56DE\u7B54`,Su(d,`status: ${o??`submitted`}`),Su(d,`answered_count: ${e}`),c.length>0&&(d.userInputQuestions=c),l&&(d.userInputAnswers=l)}Hl(e,u,r,i,a),wu(d,t)}function Vl(e,t,n){return e.requestToMessageKey.get(t)??`${n}:${t}`}function Hl(e,t,n,r,i){e.requestToMessageKey.set(n,t),r&&e.itemToMessageKey.set(r,t),i&&e.turnToLastToolMessageKey.set(i,t)}function Ul(e,t){let n=fu(t.payload.raw),r=iu(n,void 0),i=fu(n.usage),a=fu(fu(n.turn).usage),o=cu(i,[`input_tokens`]),s=cu(i,[`output_tokens`]),c=cu(a,[`input_tokens`]),l=cu(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}`:Kl(t,`turn.usage`,r),i=Gl(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&&Su(i,`input_tokens: ${u}`),d!==void 0&&Su(i,`output_tokens: ${d}`),wu(i,t)}}function Wl(e,t){let n=fu(t.payload.raw),r=au(fu(n.error))??au(n);if(!r)return;let i=iu(n,void 0),a=i?`turn-error:${i}`:`error:${t.eventId}`,o=Gl(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,wu(o,t)}function Gl(e,t,n){return e.messages.get(t)||(e.messages.set(t,n),n)}function Kl(e,t,n){let r=Date.parse(e.ts),i=Number.isFinite(r)?Math.floor(r/Al):Math.floor(ju(e.ts)/Al);return`fallback:${e.provider}:${n??`no_turn`}:${t}:${i}`}function ql(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 Jl(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 Yl(e,t,n,r,i){if(e!==`codex`||!t||!i)return;let a=eu(n);if(!(a!==`user_message`&&a!==`agent_message`))return`${t}|${a}|${tu(a,r)}|${i}`}function Xl(e,t,n){let r=e.codexSemanticMessageKeyToMessageKeys.get(t);if(!r){e.codexSemanticMessageKeyToMessageKeys.set(t,[n]);return}r.includes(n)||r.push(n)}function Zl(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 Ql(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 $l(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 eu(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 tu(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function nu(e){return e===`tool`}function ru(e){if(e.historyReplay===!0)return!0;let t=ou(e,[`source`]);return t===`codex.history.thread_read`||t===`codex.history.thread_read.incremental`}function iu(e,t){return ou(e,[`turn_id`,`turnId`])??ou(fu(e.turn),[`id`,`turn_id`,`turnId`])??ou(t??{},[`turn_id`,`turnId`])}function au(e){return su(fu(e.payload),[`delta`,`output_delta`,`outputDelta`])||su(e,[`text`,`message`,`output`,`response`,`reason`,`output_delta`,`aggregated_output`])||pu(e)}function ou(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}}function su(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function cu(e,t){for(let n of t){let t=e[n];if(typeof t==`number`&&Number.isFinite(t))return t}}function lu(e){if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=fu(n),r=ou(e,[`id`]),i=ou(e,[`header`]),a=ou(e,[`question`]);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=fu(e),n=ou(t,[`label`]),r=ou(t,[`description`])??n,i=ou(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 uu(e){let t=fu(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 du(e,t){if(ou(e,[`display_as`])!==`tool_card`)return;let n=ou(e,[`title`])??t,r=ou(e,[`status_label`])??t;if(!n||!r)return;let i=[],a=ou(e,[`prompt`]),o=ou(e,[`response`]),s=ou(e,[`response_label`])??`Response`;a&&i.push({label:`Prompt`,body:a}),o&&i.push({label:s,body:o});let c=[],l=ou(e,[`file_path`]),u=cu(e,[`total_tool_uses`]),d=cu(e,[`total_tokens`]),f=cu(e,[`duration_ms`]);return l&&c.push(l),typeof u==`number`&&c.push(`${u} tool uses`),typeof d==`number`&&c.push(`${Du(d)} tokens`),typeof f==`number`&&c.push(Ou(f)),{title:n,statusLabel:r,compactText:t?Au(t):void 0,sections:i,details:c}}function fu(e){return typeof e==`object`&&e?e:{}}function pu(e){return Ac(e,mu)}function mu(e){if(typeof e==`string`&&e.length>0)return e;let t=fu(e),n=su(t,[`text`,`message`,`output`,`response`,`reason`]);if(n)return n;let r=su(fu(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=su(fu(e),[`text`,`value`]);t&&i.push(t)}return i.length>0?i.join(``):void 0}function hu(e,t){return!e||t.startsWith(e)?t:e.endsWith(t)?e:`${e}${t}`}function gu(e){return e===`assistant`||e===`reasoning`}function _u(e,t,n){return e?t===e?e:t.startsWith(e)?t:e.endsWith(t)?e:vu(n)?`${e}${t}`:bu(e,t)?t:`${e}${t}`:t}function vu(e){let t=fu(e.payload);return xu(t.delta)||xu(t.output_delta)||xu(t.outputDelta)||xu(e.output_delta)||xu(e.outputDelta)?!0:yu(ou(e,[`original_method`,`originalMethod`]))}function yu(e){return e?e===`item/agentMessage/delta`||e===`codex/event/agent_message_content_delta`:!1}function bu(e,t){return t.length===0||t.length<24?!1:t.length>=Math.floor(e.length*.7)}function xu(e){return typeof e==`string`&&e.length>0}function Su(e,t){t.trim()&&(e.details.includes(t)||e.details.push(t))}function Cu(e){let t=[],n=ou(e,[`command`]),r=ou(e,[`tool_name`,`tool`]),i=ou(e,[`server`]),a=ou(e,[`status`]),o=ou(e,[`query`]),s=ou(e,[`output_delta`,`aggregated_output`]),c=e.history_output_omitted===!0||e.historyOutputOmitted===!0,l=cu(e,[`history_output_byte_length`,`historyOutputByteLength`]),u=cu(e,[`exit_code`]),d=ou(fu(e.error),[`message`]);if(n&&t.push(`command: ${ku(n,200)}`),r&&t.push(`tool: ${r}`),i&&t.push(`server: ${i}`),a&&t.push(`status: ${a}`),o&&t.push(`query: ${ku(o,200)}`),u!==void 0&&t.push(`exit_code: ${u}`),d&&t.push(`error: ${ku(d,200)}`),s?t.push(`output: ${ku(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=fu(e),r=ou(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=fu(e),r=ou(n,[`path`])??`unknown`,i=ou(n,[`kind`])??`update`;t.push(`${i}: ${r}`)}}return t}function wu(e,t){e.debug.eventTypes.includes(t.type)||e.debug.eventTypes.push(t.type)}function Tu(e,t,n){let r=Au(t),i=Date.parse(n);for(let[t,n]of e.messages.entries()){if(n.kind!==`user`||n.source!==`optimistic`||Au(n.text??``)!==r)continue;let a=Date.parse(n.ts);if(!(Number.isFinite(i)&&Number.isFinite(a)&&Math.abs(i-a)>jl)){e.messages.delete(t);return}}}function Eu(e){return{...e,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 Du(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}function Ou(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 ku(e,t){return e.length<=t?e:`${e.slice(0,t)}...`}function Au(e){return e.trim().replace(/\s+/g,` `)}function ju(e){let t=0;for(let n=0;n<e.length;n+=1)t=t*31+e.charCodeAt(n)>>>0;return t}var Mu=X([`unknown`,`checking`,`up_to_date`,`available`,`unsupported_install`,`updating`,`restarting`,`failed`]),Nu=X([`npm`,`pnpm`,`yarn`,`unknown`]),Pu=X([`global_registry`,`global_file`,`dev_workspace`,`standalone_binary`,`unknown`]),Fu=X([`console`,`mobile`,`system`]),Iu=J({manager:Nu,installType:Pu,packageName:K().min(1),packageRoot:K().min(1).optional(),binPath:K().min(1).optional(),canSelfUpdate:Xn(),reason:K().min(1).optional()}),Lu=J({id:K().min(1),targetVersion:K().min(1),requestedBy:Fu,requestedAt:K().datetime(),startedAt:K().datetime().optional()}),Ru=J({packageName:K().min(1),currentVersion:K().min(1),latestVersion:K().min(1).optional(),available:Xn(),canApply:Xn(),status:Mu,checkedAt:K().datetime().optional(),install:Iu,job:Lu.optional(),lastError:K().min(1).optional()}),zu=J({type:Y(`gateway.update.status`),payload:Ru}),Bu=J({started:Xn(),update:Ru}),Vu=er(`kind`,[J({kind:Y(`session_relative`),sessionId:K().min(1),path:K().min(1)}),J({kind:Y(`project_relative`),projectId:K().min(1),path:K().min(1)}),J({kind:Y(`absolute`),path:K().min(1)})]),Hu=er(`kind`,[J({kind:Y(`project_relative`),projectId:K().min(1),path:K().min(1).optional()}),J({kind:Y(`absolute`),path:K().min(1).optional()})]),Uu=X([`text`,`code`,`markdown`,`image`,`video`,`audio`,`pdf`,`office`,`archive`,`binary`,`unknown`]),Wu=X([`inline_text`,`inline_media`,`browser`,`share_sheet`,`download`]),Gu=J({canReadText:Xn(),canPreparePreview:Xn(),supportsRange:Xn()}),Ku=J({locator:Vu,canonicalPath:K().min(1),displayName:K().min(1),projectId:K().min(1).optional(),relativePath:K().min(1).optional(),kind:Y(`file`),sizeBytes:q().int().nonnegative(),mimeType:K().min(1),extension:K().min(1),updatedAt:K().datetime().optional(),etag:K().min(1),previewCategory:Uu,preferredPreviewAction:Wu,capabilities:Gu}),qu=J({name:K().min(1),path:K().min(1),kind:X([`file`,`dir`]),sizeBytes:q().int().nonnegative().optional(),mimeType:K().min(1).optional(),extension:K().min(1).optional(),updatedAt:K().datetime().optional(),previewCategory:Uu.optional()}),Ju=J({rootPath:K().min(1),currentPath:K().min(1),parentPath:K().min(1).nullable(),entries:Qn(qu)}),Yu=J({file:Ku}),Xu=J({file:Ku,content:K(),encoding:Y(`utf8`),startLine:q().int().positive(),endLineExclusive:q().int().positive(),totalLines:q().int().positive().optional(),totalBytes:q().int().nonnegative(),truncated:Xn()}),Zu=X([`inline`,`attachment`]),Qu=J({file:Ku,preview:J({url:K().min(1),expiresAt:K().datetime(),supportsRange:Xn(),contentType:K().min(1),contentDisposition:Zu})}),$u=nr(e=>{if(typeof e!=`string`)return e;let t=e.trim();return t.length>0?t:e},K().trim().min(1)),ed=J({id:K().min(1),title:K().min(1),path:K().min(1),createdAt:K().datetime(),updatedAt:K().datetime(),lastSessionAt:K().datetime().optional(),runningCount:q().int().nonnegative(),idleCount:q().int().nonnegative().optional(),totalCount:q().int().nonnegative().optional(),endedCount:q().int().nonnegative()}),td=J({name:K().min(1),path:K().min(1)}),nd=J({kind:X([`home`,`desktop`,`documents`,`downloads`,`root`]),path:K().min(1)}),rd=J({rootPath:K().min(1),currentPath:K().min(1),parentPath:K().min(1).nullable(),shortcuts:Qn(nd).default([]),directories:Qn(td)}),id=X([`running`,`idle`]),ad=X([`running`,`idle`,`all`]),od=X([`external_turn_running`]),sd=X([`delta`,`snapshot`]),cd=J({id:K().min(1),nativeSessionId:K().min(1).optional(),source:X([`gateway`,`native_discovered`]).optional(),projectId:K().min(1),projectPath:K().min(1),provider:Na,providerMode:X([`native`,`mock`]).optional(),model:K().min(1).optional(),title:K().min(1).optional(),sessionTurnConfig:cc.optional(),sessionTurnConfigUpdatedAt:K().datetime().optional(),createdAt:K().datetime(),updatedAt:K().datetime(),status:id,interactionLockReason:od.optional(),pendingApprovals:q().int().nonnegative(),pendingUserInputs:q().int().nonnegative(),pendingActions:q().int().nonnegative()}),ld=J({id:K().min(1),name:K().min(1),createdAt:K().datetime(),revokedAt:K().datetime().optional(),identityAlgorithm:X([`ed25519`]).optional(),publicKeyFingerprint:K().min(1).optional(),identityStatus:fl.optional(),lastVerifiedAt:K().datetime().optional()}),ud=J({name:$u,machineName:K().min(1)}),dd=J({agent:J({provider:Na,requestedVersion:K().min(1).nullable(),resolvedVersion:K().min(1)}),capabilities:Va}),fd=J({scannedAt:K().datetime(),sessionCount:q().int().nonnegative(),status:X([`ready`,`partial`,`failed`]),error:K().min(1).optional()}),pd=J({codex:fd.optional(),claude:fd.optional()}),md=J({key:K().min(1),path:K().min(1),title:K().min(1),lastSessionAt:K().datetime().optional(),sessionCount:q().int().nonnegative(),providerCounts:J({codex:q().int().nonnegative(),claude:q().int().nonnegative()}),lastDiscoveryAt:K().datetime()}),hd=J({provider:Na,nativeSessionId:K().min(1),title:K().min(1).optional(),model:K().min(1).optional(),createdAt:K().datetime().optional(),updatedAt:K().datetime()}),gd=J({generatedAt:K().datetime(),source:X([`cache`,`fresh_scan`]),providers:pd,projects:Qn(md)}),_d=J({canonicalProjectPath:K().min(1),project:md,providers:pd,sessions:Qn(hd)}),vd=X(`auth.refresh,codex.accounts.get,codex.accounts.save,codex.accounts.switch,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(`,`)),yd=J({}).strict(),bd=er(`method`,[J({method:Y(`auth.refresh`),params:bl.extend({deviceId:K().min(1).optional()})}),J({method:Y(`codex.accounts.get`),params:yd}),J({method:Y(`codex.accounts.save`),params:yd}),J({method:Y(`codex.accounts.switch`),params:J({accountId:K().min(1)})}),J({method:Y(`codex.appServer.restart`),params:J({requestedBy:Fu.optional()})}),J({method:Y(`gateway.settings.get`),params:yd}),J({method:Y(`gateway.settings.update`),params:J({name:$u})}),J({method:Y(`gateway.update.get`),params:yd}),J({method:Y(`gateway.update.apply`),params:J({requestedBy:Fu.optional()})}),J({method:Y(`projects.list`),params:yd}),J({method:Y(`projects.discovery.get`),params:yd}),J({method:Y(`projects.discovery.refresh`),params:yd}),J({method:Y(`projects.create`),params:J({path:$u,title:K().min(1).optional()})}),J({method:Y(`projects.delete`),params:J({projectId:K().min(1)})}),J({method:Y(`workspace.directories.list`),params:J({path:K().min(1).optional(),limit:q().int().positive().max(500).optional()})}),J({method:Y(`workspace.directories.create`),params:J({path:$u,name:$u})}),J({method:Y(`workspace.entries.list`),params:J({locator:Hu,limit:q().int().positive().max(500).optional()})}),J({method:Y(`workspace.files.resolve`),params:J({locator:Vu})}),J({method:Y(`workspace.files.readText`),params:J({locator:Vu,encoding:Y(`utf8`).optional(),startLine:q().int().positive().optional(),maxLines:q().int().positive().max(5e3).optional(),maxBytes:q().int().positive().max(1024*1024).optional()})}),J({method:Y(`workspace.files.preparePreview`),params:J({locator:Vu,disposition:Zu.optional()})}),J({method:Y(`sessions.list`),params:J({projectId:K().min(1),status:ad.optional(),syncExternal:Xn().optional()})}),J({method:Y(`sessions.discovery.list`),params:J({projectPath:$u})}),J({method:Y(`sessions.get`),params:J({projectId:K().min(1),sessionId:K().min(1)})}),J({method:Y(`sessions.config.get`),params:J({projectId:K().min(1),sessionId:K().min(1)})}),J({method:Y(`sessions.history.sync`),params:J({projectId:K().min(1),sessionId:K().min(1)})}),J({method:Y(`sessions.rawEvents.list`),params:J({projectId:K().min(1),sessionId:K().min(1),limit:$n([q().int().positive().max(2e3),Y(`all`)]).optional(),fromRawSeqExclusive:q().int().nonnegative().optional(),detailLevel:hc.optional()})}),J({method:Y(`sessions.readableItem.get`),params:J({projectId:K().min(1),sessionId:K().min(1),itemId:K().min(1)})}),J({method:Y(`providers.capabilities.get`),params:J({provider:Na,projectId:K().min(1).optional(),agentVersion:K().min(1).optional()})}),J({method:Y(`providers.execution.update`),params:za}),J({method:Y(`agents.config.get`),params:J({provider:Na,projectId:K().min(1).optional(),agentVersion:K().min(1).optional()})}),J({method:Y(`devices.list`),params:yd}),J({method:Y(`devices.revoke`),params:J({deviceId:K().min(1)})})]),xd=er(`method`,[J({method:Y(`auth.refresh`),result:xl.extend({relayToken:K().min(1).optional()})}),J({method:Y(`codex.accounts.get`),result:El}),J({method:Y(`codex.accounts.save`),result:Dl}),J({method:Y(`codex.accounts.switch`),result:Ol}),J({method:Y(`codex.appServer.restart`),result:kl}),J({method:Y(`gateway.settings.get`),result:ud}),J({method:Y(`gateway.settings.update`),result:ud}),J({method:Y(`gateway.update.get`),result:Ru}),J({method:Y(`gateway.update.apply`),result:Bu}),J({method:Y(`projects.list`),result:J({projects:Qn(ed)})}),J({method:Y(`projects.discovery.get`),result:gd}),J({method:Y(`projects.discovery.refresh`),result:gd}),J({method:Y(`projects.create`),result:J({project:ed})}),J({method:Y(`projects.delete`),result:J({removed:Y(!0)})}),J({method:Y(`workspace.directories.list`),result:rd}),J({method:Y(`workspace.directories.create`),result:rd}),J({method:Y(`workspace.entries.list`),result:Ju}),J({method:Y(`workspace.files.resolve`),result:Yu}),J({method:Y(`workspace.files.readText`),result:Xu}),J({method:Y(`workspace.files.preparePreview`),result:Qu}),J({method:Y(`sessions.list`),result:J({sessions:Qn(cd)})}),J({method:Y(`sessions.discovery.list`),result:_d}),J({method:Y(`sessions.get`),result:J({session:cd})}),J({method:Y(`sessions.config.get`),result:J({session:cd})}),J({method:Y(`sessions.history.sync`),result:J({session:cd,rawEventCount:q().int().nonnegative(),historyUpdated:Xn(),statusChanged:Xn(),refreshMode:sd,fromRawSeq:q().int().nonnegative().optional(),toRawSeq:q().int().nonnegative().optional()})}),J({method:Y(`sessions.rawEvents.list`),result:er(`decision`,[J({decision:Y(`delta`),reason:X([`cursor_valid_delta`]),fromRawSeqExclusive:q().int().nonnegative(),toRawSeq:q().int().nonnegative(),events:Qn(Zn())}),J({decision:Y(`snapshot`),reason:X([`cursor_out_of_range`,`initial_snapshot`,`empty_history_snapshot`]),toRawSeq:q().int().nonnegative().optional(),events:Qn(Zn())})])}),J({method:Y(`sessions.readableItem.get`),result:J({item:vo})}),J({method:Y(`providers.capabilities.get`),result:J({capabilities:Va})}),J({method:Y(`providers.execution.update`),result:J({defaults:za})}),J({method:Y(`agents.config.get`),result:dd}),J({method:Y(`devices.list`),result:J({devices:Qn(ld)})}),J({method:Y(`devices.revoke`),result:J({revoked:Y(!0)})})]),Sd=`json-utf8`,Cd=X([Sd]),wd=X([`identity`,`gzip`]),Td=J({version:Y(1),compression:Y(`gzip`),payloadEncoding:Cd.default(Sd),uncompressedByteLength:q().int().positive(),compressedByteLength:q().int().positive(),data:pc});function Ed(e){let t=kd(e.payload),n=t.byteLength;if(n<(e.compressionThresholdBytes??1/0))return{payloadEncoding:Sd,compression:`identity`,payloadBytes:t,uncompressedByteLength:n,compressedByteLength:n};let r=ti(t);return r.byteLength>=n?{payloadEncoding:Sd,compression:`identity`,payloadBytes:t,uncompressedByteLength:n,compressedByteLength:n}:{payloadEncoding:Sd,compression:`gzip`,payloadBytes:r,uncompressedByteLength:n,compressedByteLength:r.byteLength}}function Dd(e){return e.compression===`gzip`?Td.parse({version:1,compression:`gzip`,payloadEncoding:e.payloadEncoding,uncompressedByteLength:e.uncompressedByteLength,compressedByteLength:e.compressedByteLength,data:Md(e.payloadBytes)}):null}function Od(e){let t=wd.parse(e.compression??`identity`),n=e.payloadBytes;if(t===`gzip`)try{n=ni(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(jd(n))}catch{throw Error(`compressed_payload_invalid`)}return e.parse(r)}function kd(e){return Ad(JSON.stringify(e))}function Ad(e){return new TextEncoder().encode(e)}function jd(e){return new TextDecoder().decode(e)}function Md(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 Nd=K().url(),Pd=$n([Nd,Y(``)]),Fd=K().min(1).regex(/^[A-Za-z0-9_-]+$/u),Id=X([`plaintext-relay`,`e2ee-relay`]),Ld=X([`plain`,`crypt`]);function Rd(e){if(e===`plain`||e===`crypt`)return e;if(e===`plaintext-relay`)return`plain`;if(e===`e2ee-relay`)return`crypt`}function zd(e){if(!e||typeof e!=`object`||Array.isArray(e))return e;let t=e,n=Rd(t.tsl??t.transportSecurityLevel);return n?{...t,tsl:n}:t}function Bd(e){return e.trim()}var Vd=X([`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`]),Hd=q().int().positive(),Ud=q().int().min(0).max(2**53-1),Wd=X([`identity_mismatch`,`device_revoked`,`transcript_invalid`,`counter_replay`,`counter_gap_too_large`,`key_epoch_mismatch`,`decrypt_failed`,`unsupported_version`]),Gd=X([`guest`,`account`,`self_hosted`]);J({type:Y(`relay.gateway`),grantType:Gd,gatewayId:K().min(1),subjectId:K().min(1),gatewayIdentityFingerprint:K().min(1).optional(),jti:K().min(1),iss:K().min(1),aud:K().min(1),iat:q().int().nonnegative(),exp:q().int().positive()}),J({type:Y(`relay.mobile`),gatewayId:K().min(1),deviceId:K().min(1),iat:q().int().nonnegative(),exp:q().int().positive()});var Kd=J({v:Y(1),gw:K().min(1),name:K().min(1),machineName:K().min(1).optional(),relay:Pd.optional(),direct:Qn(Nd).default([]),pc:K().min(1),tsl:Ld.optional(),gatewayIdentity:ul.optional()});nr(zd,Kd);var qd=nr(zd,Kd.omit({pc:!0}));nr(zd,J({v:Y(1),gw:K().min(1),relay:Pd.optional(),direct:Pd.optional(),pc:K().min(1),tsl:Ld.optional(),gatewayIdentity:ul.optional()}));var Jd=nr(zd,J({v:Y(1),gw:K().min(1),relay:Pd.optional(),direct:Nd,pc:K().min(1),pkf:Fd,tsl:Ld.optional()})),Yd=J({name:K().min(1),relayBaseUrl:Pd.optional(),directBaseUrls:Qn(Nd).default([]),transportSecurityLevel:Id.default(`plaintext-relay`),gatewayIdentity:ul.optional(),gatewayAccessToken:K().min(1).optional(),connectedAt:K().datetime().optional()}),Xd=J({gatewayId:K().min(1),deviceId:K().min(1),connectedAt:K().datetime().optional()}),Zd=J({version:Y(1),securityLevel:Y(`e2ee-relay`),cipherSuite:Vd,deviceId:K().min(1),deviceIdentity:pl,clientNonce:pc}),Qd=J({version:Y(1),securityLevel:Y(`e2ee-relay`),cipherSuite:Vd,gatewayId:K().min(1),deviceId:K().min(1),clientNonce:pc,gatewayNonce:pc,gatewayPublicKeyFingerprint:K().min(1),gatewayEphemeralPublicKey:pc,signatureAlgorithm:Y(`ed25519`),signature:pc}),$d=J({version:Y(1),gatewayId:K().min(1),deviceId:K().min(1),deviceIdentityFingerprint:K().min(1),clientEphemeralPublicKey:pc,signatureAlgorithm:Y(`ed25519`),signature:pc}),ef=J({version:Y(1),securityLevel:Y(`e2ee-relay`),cipherSuite:Vd,gatewayId:K().min(1),deviceId:K().min(1),keyEpoch:Hd,deviceIdentityFingerprint:K().min(1),deviceIdentityStatus:fl}),tf=X([`gateway_restarted`,`gateway_available`]),nf=J({version:Y(1),gatewayId:K().min(1),deviceId:K().min(1),reason:tf,retryable:Y(!0)}),rf=J({ticket:K().min(1),method:X([`GET`,`HEAD`]),rangeHeader:K().min(1).optional(),responseMode:X([`inline_base64`,`stream_upload`]).optional(),uploadUrl:K().url().optional(),uploadToken:K().min(1).optional()}).superRefine((e,t)=>{e.responseMode===`stream_upload`&&(e.uploadUrl||t.addIssue({code:W.custom,path:[`uploadUrl`],message:`uploadUrl is required when responseMode is stream_upload`}),e.uploadToken||t.addIssue({code:W.custom,path:[`uploadToken`],message:`uploadToken is required when responseMode is stream_upload`}))}),af=J({status:$n([Y(200),Y(206),Y(416)]),headers:J({contentType:K().min(1),contentDisposition:K().min(1),contentLength:q().int().nonnegative(),etag:K().min(1),acceptRanges:Y(`bytes`).optional(),contentRange:K().min(1).optional(),lastModified:K().min(1).optional(),cacheControl:K().min(1)}),bodyTransport:X([`inline_base64`,`stream_upload`]).optional(),bodyBase64:pc.optional()}),of=J({}),sf=af,cf=J({version:Y(1),gatewayId:K().min(1),deviceId:K().min(1).optional(),code:Wd,message:K().min(1),retryable:Xn().optional()}),lf=bd,uf=xd,df=J({code:X([`BAD_REQUEST`,`NOT_FOUND`,`UNAUTHORIZED`,`TIMEOUT`,`INTERNAL`,`GATEWAY_OFFLINE`,`TOKEN_INVALID`,`TOKEN_EXPIRED`,`GATEWAY_MISMATCH`,`GATEWAY_REVOKED`]),message:K().min(1),status:q().int().min(400).max(599),details:Zn().optional()}),ff=df.extend({method:vd.optional()}),pf=_l.extend({gatewayId:K().min(1)}),mf=yl.extend({relayToken:K().min(1).optional()}),hf=bl.extend({gatewayId:K().min(1),deviceId:K().min(1).optional()}),gf=xl.extend({gatewayId:K().min(1),relayToken:K().min(1).optional()}),_f=J({gatewayId:K().min(1),gatewayIdentity:ul,requestedAt:K().datetime()});J({grantType:Y(`guest`),payload:_f,signatureAlgorithm:Y(`ed25519`),signature:pc});var vf=J({grantType:Gd,token:K().min(1),expiresInSeconds:q().int().positive()}),yf=X([`rpc`,`command`,`event`,`system`]),bf=Sd,xf=Cd,Sf=J({version:Y(1),keyEpoch:Hd,counter:Ud,iv:pc,ciphertext:pc,authTag:pc,plaintextEncoding:xf.default(bf),compression:wd.default(`identity`),uncompressedByteLength:q().int().positive().optional(),compressedByteLength:q().int().positive().optional()});X([`from_mobile`,`to_mobile`,`rpc.request`,`rpc.response`,`rpc.error`]);function Cf(e){return{payload:e.optional(),encryptedPayload:Sf.optional()}}function wf(e){return{payload:e.optional(),compressedPayload:Td.optional(),encryptedPayload:Sf.optional()}}var Tf=J({gatewayId:K().min(1),mobileId:K().min(1).optional(),messageType:yf,requestId:K().min(1).optional()}),Ef=X([`fresh_connect`,`gateway_replay`]),Df=J({deviceId:K().min(1),deliveryMode:Ef,gatewayAvailableAtConnect:Xn()}),Of=J({deviceId:K().min(1)}),kf=$n([ll,zu,J({type:Y(`command.ack`),commandType:K().min(1),commandId:K().min(1).optional(),payload:Zn().optional()}),J({type:Y(`command.error`),commandType:K().min(1).optional(),commandId:K().min(1).optional(),message:K().min(1)}),J({type:Y(`relay.error`),error:df})]),Af=er(`type`,[Tf.extend({type:Y(`gateway.hello`),messageType:Y(`system`),payload:Yd}),Tf.extend({type:Y(`mobile.hello`),messageType:Y(`system`),payload:Xd}),Tf.extend({type:Y(`secure.client_hello`),messageType:Y(`system`),payload:Zd}),Tf.extend({type:Y(`secure.gateway_hello`),mobileId:K().min(1),messageType:Y(`system`),payload:Qd}),Tf.extend({type:Y(`secure.client_auth`),messageType:Y(`system`),payload:$d}),Tf.extend({type:Y(`secure.ready`),mobileId:K().min(1),messageType:Y(`system`),payload:ef}),Tf.extend({type:Y(`secure.handshake_required`),mobileId:K().min(1),messageType:Y(`system`),payload:nf}),Tf.extend({type:Y(`secure.error`),mobileId:K().min(1),messageType:Y(`system`),payload:cf}),Tf.extend({type:Y(`mobile.connected`),messageType:Y(`system`),payload:Df}),Tf.extend({type:Y(`mobile.disconnected`),messageType:Y(`system`),payload:Of}),Tf.extend({type:Y(`from_mobile`),messageType:Y(`command`),mobileId:K().min(1),...Cf(Oc)}),Tf.extend({type:Y(`to_mobile`),messageType:Y(`event`),mobileId:K().min(1),...wf(kf)}),Tf.extend({type:Y(`rpc.request`),messageType:Y(`rpc`),requestId:K().min(1),mobileId:K().min(1),...Cf(lf)}),Tf.extend({type:Y(`rpc.response`),messageType:Y(`rpc`),requestId:K().min(1),mobileId:K().min(1),...wf(uf)}),Tf.extend({type:Y(`rpc.error`),messageType:Y(`rpc`),requestId:K().min(1),mobileId:K().min(1),...wf(ff)}),Tf.extend({type:Y(`broadcast`),messageType:Y(`event`),payload:ll}),Tf.extend({type:Y(`pairing.claim.forward`),messageType:Y(`system`),requestId:K().min(1),payload:pf}),Tf.extend({type:Y(`pairing.claim.result`),messageType:Y(`system`),requestId:K().min(1),payload:mf}),Tf.extend({type:Y(`auth.refresh.forward`),messageType:Y(`system`),requestId:K().min(1),payload:hf}),Tf.extend({type:Y(`auth.refresh.result`),messageType:Y(`system`),requestId:K().min(1),payload:gf}),Tf.extend({type:Y(`file.content.forward`),messageType:Y(`system`),requestId:K().min(1),payload:rf}),Tf.extend({type:Y(`file.content.result`),messageType:Y(`system`),requestId:K().min(1),payload:af}),Tf.extend({type:Y(`file.content.upload.started`),messageType:Y(`system`),requestId:K().min(1),payload:of}),Tf.extend({type:Y(`relay.error`),messageType:Y(`system`),payload:df})]);function jf(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 Mf(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 Nf(e){return JSON.stringify([`relay-secure-gateway-hello-v1`,Mf(e)])}function Pf(e){return JSON.stringify([`relay-secure-client-auth-v1`,Mf(e),e.clientAuth.clientEphemeralPublicKey])}function Ff(e){let t=Hd.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 If(e){let t=e.clientHello.cipherSuite;if(t!==`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`)throw Error(`unsupported cipher suite: ${t}`);let n=Hd.parse(e.keyEpoch??1),r=Jf(Zf(Ff({gatewayId:e.gatewayId,clientHello:e.clientHello,gatewayHello:e.gatewayHello,clientAuth:e.clientAuth,keyEpoch:n}))),i=Jf(Xf(Zf(`relay-secure-hkdf-salt-v1`),r)),a=Zf(JSON.stringify([`relay-secure-key-schedule-v1`,e.gatewayId,e.clientHello.deviceId,t,n])),o=qf(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 Lf(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 Rf(e,t){let n=Ud.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($f(n),4),r}function zf(e,t){let n=Ud.parse(t);if(e===null)return;let r=Ud.parse(e);if(n<=r)throw Error(`counter_replay`);if(n-r>1e3)throw Error(`counter_gap_too_large`)}function Bf(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 Vf(e){Yf(e.session.cipherSuite);let t=e.session.outboundCounter,n=Rf(e.session.outboundNoncePrefix,t),r=e.preparedPayload.payloadBytes,i=Zf(Bf({metadata:e.metadata,encryptedPayload:{version:1,keyEpoch:e.session.keyEpoch,counter:t}})),a=Ki(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,Sf.parse({version:1,keyEpoch:e.session.keyEpoch,counter:t,iv:Uf(n),ciphertext:Uf(o),authTag:Uf(s),plaintextEncoding:bf,compression:e.preparedPayload.compression,...e.preparedPayload.compression===`gzip`?{uncompressedByteLength:e.preparedPayload.uncompressedByteLength,compressedByteLength:e.preparedPayload.compressedByteLength}:{}})}function Hf(e){Yf(e.session.cipherSuite);let t=Sf.parse(e.encryptedPayload);if(t.keyEpoch!==e.session.keyEpoch)throw Error(`key_epoch_mismatch`);zf(e.session.highestInboundCounter,t.counter);let n=Rf(e.session.inboundNoncePrefix,t.counter),r=Wf(t.iv);if(!Qf(r,n))throw Error(`decrypt_failed`);let i=Zf(Bf({metadata:e.metadata,encryptedPayload:t})),a=Xf(Wf(t.ciphertext),Wf(t.authTag)),o;try{o=Ki(e.session.inboundKey,r,i).decrypt(a)}catch{throw Error(`decrypt_failed`)}e.session.highestInboundCounter=t.counter;try{return Od({payloadBytes:o,compression:t.compression,expectedUncompressedByteLength:t.uncompressedByteLength,parse:e.parse})}catch{throw Error(`decrypt_failed`)}}function Uf(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 Wf(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 Gf(e){return Uf(e).replace(/\+/gu,`-`).replace(/\//gu,`_`).replace(/=+$/u,``)}function Kf(e){return Wf(e.replace(/-/gu,`+`).replace(/_/gu,`/`).padEnd(Math.ceil(e.length/4)*4,`=`))}function qf(e,t,n,r){return r<=0?new Uint8Array:new Uint8Array(va(Ma,e,t.length>0?t:new Uint8Array(32),n,r))}function Jf(e){return new Uint8Array(Ma(e))}function Yf(e){if(e!==`ed25519-x25519-hkdf-sha256-aes-256-gcm-v1`)throw Error(`unsupported cipher suite: ${e}`)}function Xf(...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 Zf(e){return new TextEncoder().encode(e)}function Qf(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 $f(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 ep(e){return Gf(Ma(Wf(e)).subarray(0,16))}function tp(e){if(e.type!==`native.raw`)return null;let t=sp(e.payload.raw),n=sp(t.message),r=sp(n.params),i=sp(r.msg),a=cp(n.method)??cp(t.method);if(!a)return null;let o=cp(i.type)??``;if(!ap(a)&&!op(o))return null;let s=ip(t);if(!s||!s.delta)return null;let c=cp(r.conversationId)??cp(r.conversation_id)??``,l=cp(i.thread_id)??cp(i.threadId)??cp(r.threadId)??cp(r.thread_id)??``,u=cp(i.turn_id)??cp(i.turnId)??cp(r.turnId)??cp(r.turn_id)??``,d=cp(i.item_id)??cp(i.itemId)??cp(r.itemId)??cp(r.item_id)??``,f=cp(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 np(e,t){let n=tp(e),r=tp(t);if(!n||!r||n.key!==r.key)return null;let i=`${n.delta}${r.delta}`,a=sp(t.payload.raw),o=ip(a)?.location??ip(sp(e.payload.raw))?.location;return o?{...t,eventId:e.eventId,ts:t.ts,payload:{...t.payload,raw:rp(a,o,i)}}:null}function rp(e,t,n){if(t===`raw.delta`)return{...e,delta:n};let r=sp(e.message),i=sp(r.params);if(t===`params.delta`)return{...e,message:{...r,params:{...i,delta:n}}};let a=sp(i.msg);return{...e,message:{...r,params:{...i,msg:{...a,delta:n}}}}}function ip(e){let t=sp(sp(e.message).params),n=sp(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 ap(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function op(e){return e.endsWith(`_delta`)||e.endsWith(`Delta`)}function sp(e){return typeof e==`object`&&e?e:{}}function cp(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():cp(e)??``}var up=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]),dp=/\u001B\[[0-?]*[ -/]*[@-~]/g,fp={"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 pp(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=nl.safeParse(e.type);if(t.success){n.push(vp(e,t.data,Dp(e.payload.raw),e.eventId));continue}if(e.type!==`native.raw`)continue;let r=Dp(e.payload.raw),i=hp(e,r);if(i.length>0&&n.push(...i),r.historyReplay!==!0)continue;let o=Z(r.source);if(o?.startsWith(`codex.history.thread_read`)){n.push(...gp(e,r));continue}o&&up.has(o)&&a.push(e)}a.length>0&&n.push(..._p(a,o));let s=new Map,c=new Map;for(let e of n){let t=Sp(e);if(!t){s.set(e.eventId,e);continue}let n=Cp(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=Gp(e.type)-Gp(t.type);return r===0?e.eventId.localeCompare(t.eventId):r})}function mp(e,t,n){return Ll(e,pp(e,t),n)}function hp(e,t){if(e.type!==`native.raw`||Z(t.source)!==`codex.app_server`)return[];let n=Dp(t.message),r=Dp(n.params),i=Z(n.method)??Z(t.method);if(!i)return[];if(i===`turn/started`||i===`turn/completed`||i===`turn/failed`||i===`turn/interrupted`){let t=bp(Dp(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=Z(t.status)??(i===`turn/completed`?`completed`:i===`turn/interrupted`?`interrupted`:`failed`),o=Dp(t.error);return[vp(e,n,{turn:t,status:a,turn_id:Z(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=yp(Dp(r.item));if(Object.keys(t).length===0)return[];let n=Z(r.turn_id)??Z(r.turnId)??Z(Dp(r.turn).id)??Z(t.turn_id)??Z(t.turnId);return[vp(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 gp(e,t){let n=[],r=Dp(t.message),i=Z(r.scope);if(i===`thread`){let t=Dp(r.thread),i=Z(t.id);n.push(vp(e,`thread.started`,{thread_id:i,thread:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:thread_started`));let a=kp(Z(t.preview));return a&&n.push(vp(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=Dp(r.turn),i=Z(t.status);return n.push(vp(e,`turn.started`,{turn:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_started`)),i===`completed`||i===`interrupted`?n.push(vp(e,`turn.completed`,{status:i,turn:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_completed`)):i===`failed`&&n.push(vp(e,`turn.failed`,{status:i,turn:t,error:Dp(t.error),source_event_type:`codex.history.thread_read`},`${e.eventId}:turn_failed`)),n}if(i===`item`){let t=Dp(r.item),i=Z(r.turn_id)??Z(t.turn_id);n.push(vp(e,`item.completed`,{turn_id:i,item:t,source_event_type:`codex.history.thread_read`},`${e.eventId}:item_completed`))}return n}function _p(e,t){let n=[],r=e[0];if(!r)return n;let i=Dp(r.payload.raw),a=Dp(i.message),o=Z(i.native_session_id)??Z(a.session_id)??r.sessionId,s=new Map,c=!1,l=0,u;n.push(vp(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(vp(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(vp(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(vp(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=Dp(r.payload.raw),i=Dp(e.message),a=Z(e.native_type)??Z(i.type),l=Dp(i.message),u=Z(e.source)??`claude.history.getSessionMessages`,m=Wp(e.source_line);if(a===`user`){let e=Ap(l),a=Mp(l);if(e){if(!c){let t=kp(e);t&&(n.push(vp(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 a=d(r,u,m);n.push(vp(r,`item.completed`,{item:{id:Z(i.uuid)??t(),type:`user_message`,text:e,turn_id:a.id,source_event_type:u},source_line:m},`${r.eventId}:item_completed_user`))}a.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(vp(r,`item.completed`,{item:Fp(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);jp(l).forEach((e,i)=>{e.id&&s.set(e.id,e),!e.skipReplay&&n.push(vp(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=Ap(l);g&&n.push(vp(r,`item.completed`,{item:{id:Z(l.id)??Z(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 _=Up(Z(i.error));_&&p(r,u,m,_)}let m=e[e.length-1];if(m){let e=Dp(m.payload.raw);f(m,Z(e.source)??`claude.history.getSessionMessages`,Wp(e.source_line))}return n}function vp(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 yp(e){let t=wp(e),n=Z(e.type);return n&&(t.type=xp(n)),t}function bp(e,t){let n=wp(e),r=Z(e.id)??Z(t.turn_id)??Z(t.turnId);return r&&(n.id=r),n}function xp(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 Ep(e)}}function Sp(e){if(e.type!==`item.started`&&e.type!==`item.completed`)return;let t=Dp(e.payload.raw),n=Dp(t.item),r=Z(n.id)??Z(n.item_id)??Z(n.itemId);if(!r)return;let i=Z(t.turn_id)??Z(t.turnId)??Z(n.turn_id)??Z(n.turnId)??``;return[e.type,e.sessionId,i,r].join(`|`)}function Cp(e){return Array.isArray(e)?e.reduce((e,t)=>e+Cp(t),0):e&&typeof e==`object`?Object.entries(e).reduce((e,[t,n])=>e+t.length+Cp(n),1):typeof e==`string`?e.length:typeof e==`number`||typeof e==`boolean`?1:0}function wp(e){let t={};for(let[n,r]of Object.entries(e))t[Ep(n)]=Tp(r);return t}function Tp(e){return Array.isArray(e)?e.map(e=>Tp(e)):typeof e==`object`&&e?wp(e):e}function Ep(e){return e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).toLowerCase()}function Dp(e){return typeof e==`object`&&e?e:{}}function Z(e){return typeof e==`string`&&e.trim()||void 0}function Op(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}}function kp(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 Ap(e){let t=Z(e.content);if(t)return Up(t);let n=Z(e.text)??Z(e.prompt);if(n)return Up(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=Dp(e),n=Z(t.type);if(n&&n!==`text`)continue;let r=Z(t.text)??Z(t.content)??Hp(t);r&&i.push(r)}if(i.length!==0)return Up(i.join(`
136
136
  `))}function jp(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=Dp(e);if(Z(t.type)!==`tool_use`)continue;let r=Dp(t.input),i=Z(t.name)??`tool`;n.push({id:Z(t.id),name:i,...Np(i,r)})}return n}function Mp(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=Dp(e);Z(t.type)===`tool_result`&&n.push({toolUseId:Z(t.tool_use_id)??Z(t.toolUseId),toolName:Z(t.tool_name)??Z(t.toolName),text:Lp(t),isError:t.is_error===!0})}return n}function Np(e,t){if(e===`Task`){let e=Z(t.subagent_type),n=Z(t.description)??e??`任务`;return{title:`${e??`Task`}(${n})`,pendingStatusLabel:`运行中`,responseLabel:`Response`,prompt:Z(t.prompt)}}if(e===`Read`)return{title:`Read 1 file`,pendingStatusLabel:`运行中`,responseLabel:`Preview`,filePath:Z(t.file_path)};if(e===`Write`){let e=Z(t.file_path);return{title:Rp(e),pendingStatusLabel:`运行中`,responseLabel:`Preview`,filePath:e,writeContent:Op(t,[`content`])}}if(e===`Edit`){let e=Z(t.file_path);return{title:e?`Update(${e})`:`Edit`,pendingStatusLabel:`运行中`,responseLabel:`Preview`,filePath:e,skipReplay:!0}}return{title:e,pendingStatusLabel:`运行中`,responseLabel:`Response`,prompt:Pp(t),filePath:Z(t.file_path)}}function Pp(e){let t=Z(e.command);if(t)return t;let n=Z(e.prompt);if(n)return n;let r=Z(e.query);if(r)return r;let i=Z(e.pattern),a=Z(e.glob);return i&&a?`pattern: ${i}
137
137
  glob: ${a}`:i||Up(Z(e.description))}function Fp(e,t,n,r){let i=e?.name??t.toolName??`tool`,a=e?.name===`Write`?e.writeContent:t.text,o=Ip(e,t,a);return{id:t.toolUseId??r(),type:`tool_status`,turn_id:n,tool_name:i,title:e?.title??i,text:o,status:t.isError?`failed`:`completed`,status_label:o,display_as:`tool_card`,response:a,response_label:e?.responseLabel??`Response`,prompt:e?.prompt,file_path:e?.filePath,source_event_type:`claude.history.tool_result`}}function Ip(e,t,n){return t.isError?`Failed`:e?.name===`Write`?zp(Vp(n),e.filePath):`Done`}function Lp(e){let t=Up(Z(e.content)??Z(Dp(e.toolUseResult).stdout)??Z(Dp(e.tool_use_result).stdout)??Z(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=Dp(e),n=Up(Z(t.text)??Z(t.content)??Z(t.value)??Z(t.tool_name)??Z(t.toolName));n&&r.push(n)}if(r.length!==0)return r.join(`
138
138
  `)}function Rp(e){return typeof e==`string`&&e.includes(`/.claude/plans/`)?`Updated plan`:typeof e==`string`?`Write(${Bp(e)})`:`Write`}function zp(e,t){let n=typeof e==`number`?`Wrote ${e} lines`:`Wrote file`;return t?`${n} to ${t}`:n}function Bp(e){let t=e.split(`/`);return t[t.length-1]||e}function Vp(e){if(e)return e.split(`
@@ -517,11 +517,11 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
517
517
  `).length}function VO(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}function HO(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 UO(e){return GO(YO(e.message))||(ZO(e.result)??``)}function WO(e){if(typeof e.parent_tool_use_id==`string`&&e.parent_tool_use_id.length>0||e.isSidechain===!0)return!1;let t=YO(e.message);return!(Array.isArray(t.content)?t.content:[]).some(e=>YO(e).type===`tool_result`)}function GO(e){let t=ZO(e.content);if(t)return t;let n=ZO(e.text)??ZO(e.prompt);if(n)return n;let r=Array.isArray(e.content)?e.content:[],i=[];for(let e of r){let t=YO(e);t.type===`text`&&typeof t.text==`string`&&t.text.length>0&&i.push(t.text)}if(i.length>0)return i.join(`
518
518
  `)}function KO(e){let t=YO(YO(e.event).delta);if(typeof t.text==`string`&&t.text.length>0)return t.text}function qO(e){let t=Array.isArray(e.errors)?e.errors.filter(e=>typeof e==`string`):[];return t.length>0?t.join(`; `):XO(e.subtype)||`Claude turn failed`}function JO(e){let t=YO(e);return{input_tokens:$O(t.input_tokens)??$O(t.inputTokens)??0,cached_input_tokens:$O(t.cached_input_tokens)??$O(t.cache_read_input_tokens)??$O(t.cacheReadInputTokens)??0,output_tokens:$O(t.output_tokens)??$O(t.outputTokens)??0}}function YO(e){return typeof e==`object`&&e?e:{}}function XO(e){if(typeof e==`string`&&e.trim())return e}function ZO(e){if(typeof e==`string`&&e.length>0)return e}function QO(e){if(Array.isArray(e)){for(let t of e)if(typeof t==`string`&&t.trim())return t}}function $O(e){if(typeof e==`number`&&Number.isFinite(e))return e}function ek(e){let t=XO(YO(e.message).id);if(t)return t;let n=XO(YO(YO(e.event).message).id);if(n)return n}function tk(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`_`);return t?t.replace(/^_+|_+$/g,``):`tool`}var nk=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){if(typeof this.nativeSession?.sendInput==`function`){await this.nativeSession.sendInput(e);return}if(typeof this.nativeSession?.input==`function`){await this.nativeSession.input(e);return}if(typeof this.nativeSession?.turn==`function`){await this.nativeSession.turn({input:e});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=rk(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 rk(e){return typeof e==`object`&&e&&`type`in e?e:{type:`status.progress`,nativeEvent:e}}var ik=`@anthropic-ai/claude-agent-sdk`,ak=`claude-sonnet-4-6`,ok=1e4,sk=class{constructor(e,t){this.preferNative=e,this.requireNative=t}provider=`claude`;async isNativeAvailable(){try{return await import(ik),!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(ik),n=await ck(lk(t,e),ok,`Claude native query session creation timed out`);if(n)return n;let r=await ck(uk(t,e),ok,`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 ck(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 lk(e,t){let n=dk(e);if(!n)return null;let r=t.model??ak;return new TO(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=fk(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 uk(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 nk(`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 nk(`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 nk(`claude`,t.sessionId,t.model,n)}return null}function dk(e){if(typeof e?.query==`function`)return e.query;if(typeof e?.default?.query==`function`)return e.default.query}function fk(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 pk(e,t={}){let n=t.preferNative??!1,r=t.requireNative??!1;return e===`codex`?new lO(n,r):new sk(n,r)}const mk=p.default.join(`.claude`,`projects`),hk=/\u001B\[[0-?]*[ -/]*[@-~]/g,gk=[`default`,`acceptEdits`,`bypassPermissions`,`plan`,`dontAsk`],_k=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];async function vk(e){return(await(0,O.listSessions)(typeof e==`number`?{limit:e}:void 0)).map(e=>Tk(e)).filter(e=>typeof e.cwd==`string`).sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt))}async function yk(e,t){let n=Ck(e,t?.homeDir),r=p.default.resolve(e);try{let i=await Ek(e,n,r,{maxSessions:cA(t?.maxSessions),updatedAfterMs:sA(t?.updatedAfterMs)});if(i.length>0)return i}catch{}return Dk(n,{maxSessions:cA(t?.maxSessions),updatedAfterMs:sA(t?.updatedAfterMs)})}async function bk(e){let t=await Kk(e.nativeSessionId,e.projectPath),n=await qk({projectPath:e.projectPath,nativeSessionId:e.nativeSessionId,homeDir:e.homeDir}),r=await Jk(e.projectPath,e.nativeSessionId,e.homeDir),i=Ak(t,{createdAtFallbackMs:r.birthtimeMs,updatedAtFallbackMs:r.mtimeMs}),a=Lk(i.updatedAt,r.mtimeMs),o=n.length>0?n:t,s=n.length>0?Ak(n,{createdAtFallbackMs:r.birthtimeMs,updatedAtFallbackMs:r.mtimeMs}):i,c=jk(o,i.model??s.model);return{rawEvents:xk({rows:t,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,nativeSessionId:e.nativeSessionId,createdAtFallbackMs:r.birthtimeMs,updatedAtFallbackMs:r.mtimeMs}),model:i.model,sessionTurnConfig:c,sessionTurnConfigUpdatedAt:c?a:void 0,updatedAt:a,status:Rk(t),nativeWatchPath:Sk(e.projectPath,e.nativeSessionId,e.homeDir)}}function xk(e){let t=[],n=Ak(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 Sk(e,t,n){return p.default.join(Ck(e,n),`${t}.jsonl`)}function Ck(e,t){let n=t??f.default.homedir();return p.default.join(n,mk,wk(e))}function wk(e){let t=p.default.resolve(e).replace(/\\/g,`/`).replace(/:/g,`-`).replace(/\//g,`-`);return t.startsWith(`-`)?t:`-${t}`}function Tk(e){let t=rA(e.customTitle)??rA(e.summary)??rA(e.firstPrompt),n=Wk(e.createdAt??e.lastModified),r=Wk(e.lastModified);return{nativeSessionId:e.sessionId,cwd:Uk(e.cwd),title:t,createdAt:n,updatedAt:r,status:`idle`}}async function Ek(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=sA(e.lastModified);if(r.updatedAfterMs!==void 0&&i!==void 0&&i<r.updatedAfterMs){s=!0;break}let o=Tk(e);if(typeof o.cwd!=`string`||p.default.resolve(o.cwd)!==n)continue;let c=await Ok(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 kk(a,r)}async function Dk(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 Ok(e,{nativeSessionId:t.name.slice(0,-6)});n&&r.push(n)}return kk(r,t)}async function Ok(e,t){let n=p.default.join(e,`${t.nativeSessionId}.jsonl`),r;try{r=await Gk(n)}catch(e){if(e.code===`ENOENT`)return t.sdkSession;throw e}if(!Hk(r))return;let i=await d.default.stat(n),a=t.sdkSession?.createdAt?oA(t.sdkSession.createdAt):void 0,o=t.sdkSession?.updatedAt?oA(t.sdkSession.updatedAt):void 0,s=Ak(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:Rk(r)}}function kk(e,t){let n=e.filter(e=>{if(t.updatedAfterMs===void 0)return!0;let n=oA(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 Ak(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=eA(Qk(tA(t.raw.message))));let e=Mk(t);e&&(n=e)}let o=i??sA(t.createdAtFallbackMs)??0,s=a??sA(t.updatedAtFallbackMs)??o;return{model:n,title:r,createdAt:new Date(o).toISOString(),updatedAt:new Date(s).toISOString()}}function jk(e,t){let n=t,r,i;for(let t of e){let e=Mk(t);e&&(n=e);let a=Nk(t);a&&(r=a);let o=Fk(t);o&&(i=o)}if(!(!n&&!r&&!i))return{mode:r===`plan`?`plan`:`default`,model:n??null,reasoningEffort:i??null,...r?{execution:{claude:{permissionMode:r}}}:{}}}function Mk(e){return Uk(tA(e.raw.message).model)??Uk(e.raw.model)}function Nk(e){let t=tA(e.raw.message),n=tA(e.raw.options),r=[e.raw.permissionMode,e.raw.permission_mode,t.permissionMode,t.permission_mode,n.permissionMode,n.permission_mode];for(let e of r){let t=Pk(e);if(t)return t}}function Pk(e){let t=Uk(e);if(t)return gk.includes(t)?t:void 0}function Fk(e){let t=tA(e.raw.message),n=tA(e.raw.options),r=[e.raw.reasoningEffort,e.raw.reasoning_effort,e.raw.effort,e.raw.effortLevel,e.raw.effort_level,t.reasoningEffort,t.reasoning_effort,t.effort,t.effortLevel,t.effort_level,n.reasoningEffort,n.reasoning_effort,n.effort,n.effortLevel,n.effort_level];for(let e of r){let t=Ik(e);if(t)return t}}function Ik(e){let t=Uk(e);if(t)return _k.includes(t)?t:void 0}function Lk(e,t){let n=oA(e)??0,r=sA(t)??0;return new Date(Math.max(n,r)).toISOString()}function Rk(e,t=Date.now()){let n=null;for(let t of e){let e=zk(t);e&&(n=e)}return!n?.unresolved||n.timestampMs!==void 0&&t-n.timestampMs>6e5?`idle`:`running`}function zk(e){let t=e.timestampMs??oA(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 Bk(e.raw,t);default:return null}}function Bk(e,t){let n=tA(e);if(n.isMeta===!0)return null;let r=tA(n.message);if(Zk(r).length>0)return{unresolved:!0,timestampMs:t};let i=Qk(r);return i?Vk(i)?{unresolved:!1,timestampMs:t}:{unresolved:!0,timestampMs:t}:null}function Vk(e){let t=e.toLowerCase();return 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 Hk(e){for(let t of e){if(t.type===`user`){let e=tA(t.raw.message);if(Qk(e)||Zk(e).length>0)return!0;continue}if(t.type!==`assistant`)continue;let e=tA(t.raw.message);if(Qk(e)||Xk(e).length>0||nA(t.raw.error))return!0}return!1}function Uk(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Wk(e){return Number.isFinite(e)?new Date(e).toISOString():new Date(0).toISOString()}async function Gk(e){let t=(await d.default.readFile(e,`utf8`)).split(`
519
519
  `),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=tA(i),o=nA(a.timestamp),s=o?oA(o):void 0;n.push({line:e+1,raw:a,type:nA(a.type),timestamp:o,timestampMs:s})}return n}async function Kk(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)=>Yk(e,t+1))}async function qk(e){try{return await Gk(Sk(e.projectPath,e.nativeSessionId,e.homeDir))}catch{return[]}}async function Jk(e,t,n){let r=Sk(e,t,n);try{return await d.default.stat(r)}catch{let e=Date.now();return{birthtimeMs:e,mtimeMs:e}}}function Yk(e,t){let n=tA(e),r=tA(n.message),i=nA(n.timestamp)??nA(r.timestamp)??nA(r.created_at)??nA(r.createdAt);return{line:t,raw:{...n,message:r},type:nA(n.type),timestamp:i,timestampMs:i?oA(i):void 0}}function Xk(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=tA(e);if(nA(t.type)!==`tool_use`)continue;let r=tA(t.input),i=nA(r.command),a=nA(t.name)??`tool`,o=nA(r.description);n.push({id:nA(t.id),name:a,command:i,summary:o??i??`${a} started`})}return n}function Zk(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=tA(e);if(nA(t.type)!==`tool_result`)continue;let r=iA(nA(t.content)??nA(tA(t.toolUseResult).stdout)??nA(tA(t.tool_use_result).stdout)??nA(t.text));n.push({toolUseId:nA(t.tool_use_id)??nA(t.toolUseId),toolName:nA(t.tool_name)??nA(t.toolName),text:r,isError:t.is_error===!0})}return n}function Qk(e){let t=nA(e.content);if(t)return iA(t);let n=nA(e.text)??nA(e.prompt);if(n)return iA(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=tA(e),n=nA(t.type);if(n&&n!==`text`)continue;let r=nA(t.text)??nA(t.content)??$k(t);r&&i.push(r)}if(i.length!==0)return iA(i.join(`
520
- `))}function $k(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=tA(e),r=nA(t.text)??nA(t.value);r&&n.push(r)}return n.length>0?n.join(``):void 0}function eA(e,t=60){if(!e)return;let n=aA(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 tA(e){return typeof e==`object`&&e?e:{}}function nA(e){return typeof e==`string`&&e.trim()||void 0}function rA(e){if(typeof e==`string`)return iA(e)}function iA(e){if(!e)return;let t=aA(e).trim();return t.length>0?t:void 0}function aA(e){return e.replace(hk,``)}function oA(e){let t=Date.parse(e);if(Number.isFinite(t))return t}function sA(e){if(!(e===void 0||!Number.isFinite(e)||e<=0))return Math.round(e)}function cA(e){if(e===void 0||!Number.isFinite(e))return;let t=Math.floor(e);return t>0?t:void 0}var lA=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}=dA(r,[t,n]);if(fA(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=mA(await this.refreshProjects()),r=!0);let i=await pA(n.projects,t);if(!i)throw Lw(t);let a=await this.options.store.getProject(i.key);if(!a&&!r){if(n=mA(await this.refreshProjects()),i=await pA(n.projects,t),!i)throw Lw(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 dO({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 uA({sessions:[...n.values()],canonicalPathCache:e,getRawPath:e=>_A(e.cwd),mapSession:e=>{let t=vA(e.createdAt),n=vA(e.updatedAt,t);return{provider:`codex`,nativeSessionId:e.id,title:_A(e.name)??_A(e.preview),model:_A(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 uA({sessions:await vk(),canonicalPathCache:e,getRawPath:e=>_A(e.cwd),mapSession:e=>({provider:`claude`,nativeSessionId:e.nativeSessionId,title:_A(e.title),model:_A(e.model),createdAt:_A(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 uA(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 hA(i,e.canonicalPathCache);t.push({canonicalProjectPath:n,session:e.mapSession(r)})}catch{n+=1}}return{records:t,skippedCount:n}}function dA(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:gA(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=yA(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(xA)})).sort((e,t)=>bA(e.project,t.project));return{projects:r.map(e=>e.project),projectSessions:r}}function fA(e){return Object.values(e).some(e=>e?.status===`failed`)}async function pA(e,t){let n=e.find(e=>e.path===t);if(n)return n;let r=await RE(t);return e.find(e=>e.path===r)}function mA(e){return{v:1,generatedAt:e.generatedAt,providers:e.providers,projects:e.projects}}async function hA(e,t){let n=t.get(e);return n||(n=RE(e),t.set(e,n)),n}function gA(e){return(0,l.createHash)(`sha256`).update(e).digest(`hex`).slice(0,16)}function _A(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function vA(e,t){return!Number.isFinite(e)||e<=0?t??new Date(0).toISOString():new Date(e*1e3).toISOString()}function yA(e,t){return e&&e.updatedAt>=t.updatedAt?e:t}function bA(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 xA(e,t){return e.updatedAt===t.updatedAt?`${e.provider}:${e.nativeSessionId}`.localeCompare(`${t.provider}:${t.nativeSessionId}`):t.updatedAt.localeCompare(e.updatedAt)}var SA=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 CA(this.getProjectPath(e),EA);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 wA(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 wA(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 CA(this.indexPath,TA)}getProjectPath(e){return p.default.join(this.projectsDir,`${e}.json`)}enqueueWrite(e){return this.writeQueue=this.writeQueue.then(e,e),this.writeQueue}};async function CA(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 wA(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 TA(e){return!DA(e)||e.v!==1||typeof e.generatedAt!=`string`||!pd.safeParse(e.providers).success||!Array.isArray(e.projects)?!1:e.projects.every(e=>md.safeParse(e).success)}function EA(e){return!DA(e)||e.v!==1||typeof e.projectKey!=`string`||e.projectKey.length===0||typeof e.canonicalProjectPath!=`string`||e.canonicalProjectPath.length===0||!md.safeParse(e.project).success||!pd.safeParse(e.providers).success||!Array.isArray(e.sessions)?!1:e.sessions.every(e=>hd.safeParse(e).success)}function DA(e){return typeof e==`object`&&!!e}const OA=Buffer.from([48,42,48,5,6,3,43,101,112,3,33,0]);function kA(e){let t=Zd.parse(e.clientHello),n=(0,l.randomBytes)(32).toString(`base64`),{privateKey:r,publicKey:i}=(0,l.generateKeyPairSync)(`x25519`),a=Uf(Kf(NA(i.export({format:`jwk`})))),o=Nf({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:Qd.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 AA(e){let t=Zd.parse(e.clientHello),n=Qd.parse(e.gatewayHello),r=$d.parse(e.clientAuth);if(t.version!==n.version||r.version!==t.version||!Vd.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([OA,Wf(t.deviceIdentity.publicKey)])});if(!(0,l.verify)(null,Buffer.from(Pf({gatewayId:e.gatewayId,clientHello:t,gatewayHello:{gatewayNonce:n.gatewayNonce,gatewayPublicKeyFingerprint:n.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:n.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:r.clientEphemeralPublicKey}}),`utf8`),i,Wf(r.signature)))throw Error(`transcript_invalid`)}function jA(e){let t=Qd.parse(e.gatewayHello),n=$d.parse(e.clientAuth),r=(0,l.createPublicKey)({key:{crv:`X25519`,kty:`OKP`,x:Gf(Wf(n.clientEphemeralPublicKey))},format:`jwk`}),i=(0,l.diffieHellman)({privateKey:e.gatewayEphemeralPrivateKey,publicKey:r});return Lf({role:`gateway`,keySchedule:If({gatewayId:e.gatewayId,clientHello:Zd.parse(e.clientHello),gatewayHello:{gatewayNonce:t.gatewayNonce,gatewayPublicKeyFingerprint:t.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:t.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:n.clientEphemeralPublicKey},sharedSecret:new Uint8Array(i),keyEpoch:1})})}function MA(e){return cf.parse({version:1,gatewayId:e.gatewayId,deviceId:e.deviceId,code:e.code,message:e.message,retryable:e.retryable})}function NA(e){if(typeof e.x!=`string`||e.x.length===0)throw Error(`x25519 public key export missing x`);return e.x}const PA=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;let FA=null;function IA(e){FA=e}function LA(e,t){PA&&(console.log(`[session-fetch][gateway] ${e}`,t),FA?.info({event:e,...t},`session fetch debug`))}const RA=64*1024;var zA=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}},BA=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(Af.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=>Oc.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=Oc.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(Af.parse({type:`pairing.claim.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...KA(t,`pairing.claim`)})}}async handleRefresh(e,t){try{let n=await this.dependencies.handleRefresh(t);this.dependencies.sendFrame(Af.parse({type:`auth.refresh.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...KA(t,`auth.refresh`)})}}async handleFileContent(e,t){try{let n=await this.dependencies.handleFileContentRequest(e,t);this.dependencies.sendFrame(Af.parse({type:`file.content.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...KA(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:{...GA(`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(Af.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=ff.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:GA(`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:GA(`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(Af.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=ff.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:GA(`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=kA({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(Af.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{AA({gatewayId:this.dependencies.gatewayId,clientHello:n.handshake.clientHello,gatewayHello:n.handshake.gatewayHello,clientAuth:t})}catch(t){this.sendSecureError(e,n.deviceId,qA(t),String(t));return}try{let r=await this.dependencies.verifyDeviceIdentityBinding(n.deviceId,n.handshake.clientHello.deviceIdentity),i=jA({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(Af.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,YA(t),String(t))}}ensureReadyMobileClient(e){if(e.clientId&&e.socket)return;let t=new zA(t=>{try{let n=Af.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,JA(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:MA({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:GA(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 Hf({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,JA(t),`relay secure payload failed: ${String(t)}`),null}}createRelayBusinessPayloadFields(e,t,n){let r=Ed({payload:n,compressionThresholdBytes:VA(t.frameType,n)?RA:void 0});if(HA(n)){let i=UA(n),a=WA(n);LA(`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:RA,uncompressedByteLength:r.uncompressedByteLength,compressedByteLength:r.compressedByteLength})}if(e.handshake.status!==`ready`){let e=Dd(r);return e?{compressedPayload:e}:{payload:n}}return{encryptedPayload:Vf({session:e.handshake.session,metadata:{frameType:t.frameType,messageType:t.messageType,gatewayId:this.dependencies.gatewayId,...t.requestId?{requestId:t.requestId}:{}},preparedPayload:r})}}};function VA(e,t){return e===`to_mobile`&&HA(t)}function HA(e){return typeof e==`object`&&!!e&&`kind`in e&&(e.kind===`session.stream.snapshot.chunk`||e.kind===`session.readable.snapshot.chunk`)}function UA(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 WA(e){return e.kind===`session.readable.snapshot.chunk`||`readable`in e.payload?e.payload.readable:void 0}function GA(e,t,n){return ff.parse({code:e,status:t,message:n})}function KA(e,t){if(xw(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=XA(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`||Vw(e))||t===`file.content`&&Vw(e)?{code:`UNAUTHORIZED`,status:401,message:n}:{code:`INTERNAL`,status:500,message:n}}function qA(e){return ZA(e,[`identity_mismatch`,`counter_replay`,`unsupported_version`,`transcript_invalid`])??`transcript_invalid`}function JA(e){return ZA(e,[`counter_gap_too_large`,`counter_replay`,`key_epoch_mismatch`,`decrypt_failed`])??`decrypt_failed`}function YA(e){if(xw(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=XA(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 XA(e){return e instanceof Error?e.message:typeof e==`string`?e:String(e)}function ZA(e,t){let n=XA(e);return t.find(e=>e===n)}function QA(e){return e?e.readyState:null}function $A(e){return(typeof e.extensions==`string`?e.extensions.trim():``)||null}var ej=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??rj}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=QA(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=Af.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=tj(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:$A(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=Af.parse(JSON.parse(nj(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 tj(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 nj(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 rj(e){return new $E(e,void 0,{perMessageDeflate:!0})}function ij(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(jf(t),`utf8`),(0,l.createPrivateKey)(e.privateKeyPem)).toString(`base64`)}}async function aj(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(oj(e.relayUrl),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(ij({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 vf.parse(JSON.parse(r)).token}function oj(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 sj(e){return e?.trim()||void 0}function cj(e){if(e)return{codex:e.codex?{approvalPolicy:e.codex.approvalPolicy,sandboxMode:e.codex.sandboxMode}:void 0,claude:e.claude?{permissionMode:e.claude.permissionMode}:void 0}}function lj(e,t){return{modeDefault:`default`,model:sj(t.defaults.model),reasoningEffort:t.defaults.reasoningEffort,execution:e===`codex`?{codex:{approvalPolicy:t.defaults.approvalPolicy??null,sandboxMode:t.defaults.sandboxMode??null}}:{claude:{permissionMode:t.defaults.permissionMode??null}}}}function uj(e){return{mode:`default`,model:null,reasoningEffort:null,execution:e===`codex`?{codex:{approvalPolicy:null,sandboxMode:null}}:{claude:{permissionMode:null}}}}function dj(e,t){let n=uj(e);return t?e===`codex`?{mode:t.mode,model:t.model,reasoningEffort:t.reasoningEffort,execution:{codex:{approvalPolicy:t.execution?.codex?.approvalPolicy??null,sandboxMode:t.execution?.codex?.sandboxMode??null}}}:{mode:t.mode,model:t.model,reasoningEffort:t.reasoningEffort,execution:{claude:{permissionMode:t.execution?.claude?.permissionMode??null}}}:n}function fj(e,t){return e===`claude`&&t?.permissionMode===`plan`?`plan`:`default`}function pj(e){let t=dj(e.provider,e.sessionTurnConfig);return e.sessionTurnConfig!==void 0||sj(e.legacyModel)!==void 0||e.legacySessionConfig!==void 0?mj({provider:e.provider,providerDefaults:{modeDefault:`default`},currentSessionTurnConfig:t,legacyModel:e.legacyModel,legacySessionConfig:e.legacySessionConfig}).sessionTurnConfig:t}function mj(e){let t=dj(e.provider,e.currentSessionTurnConfig),n=e.mode??(e.legacySessionConfig?fj(e.provider,e.legacySessionConfig):void 0)??t.mode??e.providerDefaults.modeDefault,r=dj(e.provider,{...t,mode:n});e.config&&(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&&(r.execution={codex:{approvalPolicy:e.config.execution.codex.approvalPolicy,sandboxMode:e.config.execution.codex.sandboxMode}}),e.provider===`claude`&&e.config.execution?.claude&&(r.execution={claude:{permissionMode:e.config.execution.claude.permissionMode}}));let i=sj(e.legacyModel);i&&(r.model=i),e.legacySessionConfig?.reasoningEffort!==void 0&&(r.reasoningEffort=e.legacySessionConfig.reasoningEffort),e.provider===`codex`&&e.legacySessionConfig&&(r.execution={codex:{approvalPolicy:e.legacySessionConfig.approvalPolicy??r.execution?.codex?.approvalPolicy??null,sandboxMode:e.legacySessionConfig.sandboxMode??r.execution?.codex?.sandboxMode??null}}),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??sj(e.providerDefaults.model),o={},s=r.reasoningEffort??e.providerDefaults.reasoningEffort;if(s&&(o.reasoningEffort=s),e.provider===`codex`){let t=r.execution?.codex?.approvalPolicy??e.providerDefaults.execution?.codex?.approvalPolicy??void 0,n=r.execution?.codex?.sandboxMode??e.providerDefaults.execution?.codex?.sandboxMode??void 0;t&&(o.approvalPolicy=t),n&&(o.sandboxMode=n)}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:cj(r.execution)}}}function hj(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t;if(e===`codex`){let e=typeof n.approvalPolicy==`string`?n.approvalPolicy:null,t=typeof n.sandboxMode==`string`?n.sandboxMode:null;return!e||!t?void 0:{approvalPolicy:e,sandboxMode:t}}let r=typeof n.permissionMode==`string`?n.permissionMode:null;if(r)return{permissionMode:r}}var gj=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}=e;return this.preferences[t]=n,await this.enqueueWrite(async()=>{await this.persist()}),e}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=hj(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 _j=[],vj=[{id:`default`,label:`Default`,isDefault:!0,supportedReasoningEfforts:[`low`,`medium`,`high`,`max`]}],yj=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`],bj=Fa.options,xj=[`read-only`,`workspace-write`,`danger-full-access`],Sj=[`default`,`acceptEdits`,`bypassPermissions`,`plan`,`dontAsk`],Cj={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 wj(e,t){let n=t?.trim().toLowerCase();return n?(Cj[e]??[]).find(e=>n===e.version.toLowerCase())??null:null}function Tj(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:yj}:{}},...e.map(e=>({...e,isDefault:!1}))]}function Ej(e){return e===`none`||e===`minimal`||e===`low`||e===`medium`||e===`high`||e===`xhigh`||e===`max`?e:null}function Dj(e){let t=new Set;for(let n of e){let e=Ej(n);e&&t.add(e)}return[...t]}function Oj(e){return e?.trim()||void 0}function kj(e){let t=Oj(e.runtimeModel);if(t)return t;let n=Oj(e.discoveredModel);if(n)return n;let r=Oj(e.existingModel),i=Oj(e.modelProvider)?.toLowerCase();if(r&&(!i||r.toLowerCase()!==i))return r}function Aj(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:Dj(e.supportedReasoningEfforts)}));return t.length===0?_j:(t.some(e=>e.isDefault)||(t[0]={...t[0],isDefault:!0}),t)}async function jj(e){let t=Date.now();try{let n=Aj(await mO());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 Mj(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(Am(),`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=Pj(e.description,e.displayName,t),a=e.supportsEffort===!1?[]:e.supportsEffort||n?Dj(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 Nj(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 Pj(...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 Fj=class{cache=new Map;inFlight=new Map;cacheEpochByProvider=new Map;executionPreferences;constructor(e){this.options=e,this.executionPreferences=new gj(this.options.providerExecutionPreferencesDir??p.default.join(Am(),`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=Cj.claude.length>0?Cj.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 lj(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 kw(t);let r=wj(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=pk(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 jj(this.options.logger)??_j:_j,l=e===`claude`&&a?await Mj(this.options.logger)??vj:vj,u=Dj(l.flatMap(e=>e.supportedReasoningEfforts??[])),f=e===`codex`?{provider:e,source:o,models:c,support:{reasoningEffort:!0,approvalPolicy:!0,sandboxMode:!0,permissionMode:!1},options:{reasoningEfforts:yj,approvalPolicies:bj,sandboxModes:xj,permissionModes:[]},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},options:{reasoningEfforts:u,approvalPolicies:[],sandboxModes:[],permissionModes:Sj},defaults:{model:l.find(e=>e.isDefault)?.id??l[0]?.id,reasoningEffort:Nj(l),permissionMode:`default`}},p=await this.executionPreferences.get(e),m={...f.defaults,...r?.defaults??{},...p?.provider===`codex`?{approvalPolicy:p.approvalPolicy,sandboxMode:p.sandboxMode}:{},...p?.provider===`claude`?{permissionMode:p.permissionMode}:{}},h=m.model?.trim(),g=o===`native`?f.models:h?Tj(f.models,h,e):f.models;if(!r){let e={capabilities:{...f,models:g,defaults:m},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 _={capabilities:{...f,models:g,defaults:m},resolvedAgentVersion:r.version};return this.options.logger?.info?.({...s,cacheStatus:`miss`,durationMs:Date.now()-d,source:_.capabilities.source,modelCount:_.capabilities.models.length},`provider capabilities resolved`),_})();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 Ij=`.meta.json`;function Lj(){let e=process.env.CODEX_HOME?.trim();return e?p.default.resolve(e):p.default.join(f.default.homedir(),`.codex`)}function Rj(){return p.default.join(Lj(),`auth.json`)}function zj(){return p.default.join(Am(),`codex-accounts`)}var Bj=class{currentAuthFilePath;snapshotsDir;readAccountMetadata;constructor(e={}){this.currentAuthFilePath=e.currentAuthFilePath??Rj(),this.snapshotsDir=e.snapshotsDir??zj(),this.readAccountMetadata=e.readAccountMetadata??Uj}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 oM(this.currentAuthFilePath),n=await this.readSavedSnapshot(e);return await sM(this.currentAuthFilePath,n.rawContent),{previousRawContent:t}}async restoreCurrentAuthFile(e){await sM(this.currentAuthFilePath,e)}async listSavedAccounts(e){let t=await aM(this.snapshotsDir);return(await Promise.all(t.filter(e=>e.isFile()&&iM(e.name)).map(async t=>{let n=rM(t.name);if(!n)return null;let r=p.default.join(this.snapshotsDir,t.name);try{let t=Vj(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 oM(this.getSnapshotPath(e));if(n===null)return`missing`;try{return Vj(n,this.getSnapshotPath(e)).canonicalContent===t?`current`:`stale`}catch{return`stale`}}async writeSnapshot(e,t,n){let r=new Date().toISOString();await sM(this.getSnapshotPath(e),t.rawContent),await sM(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 oM(t);if(n===null)throw Fw(e);return Vj(n,t)}async readSnapshotMetadata(e){let t=await oM(this.getSnapshotMetadataPath(e));if(t===null)return null;try{return Hj(t)}catch{return null}}async readCurrentAuthFile(){let e=await this.readCurrentAuthFileOrNull();if(!e)throw Iw(`Current Codex auth.json is missing or unreadable`);return e}async readCurrentAuthFileOrNull(){let e=await oM(this.currentAuthFilePath);if(e===null)return null;try{return Vj(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 Iw(`Current Codex account does not expose a ChatGPT email via account/read`);return e}getSnapshotPath(e){return p.default.join(this.snapshotsDir,`${nM(e)}.json`)}getSnapshotMetadataPath(e){return p.default.join(this.snapshotsDir,`${nM(e)}${Ij}`)}};function Vj(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Iw(`Codex auth file is not valid JSON: ${t}`,{error:String(e)})}if(!n||typeof n!=`object`||Array.isArray(n))throw Iw(`Codex auth file is not an object: ${t}`);let r=n;return{authMode:Wj(r.auth_mode),lastRefreshAt:Jj(r.last_refresh),rawContent:e,canonicalContent:eM(n)}}function Hj(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`invalid snapshot metadata`);let n=t,r=Kj(n.accountId);if(!r)throw Error(`missing snapshot metadata accountId`);return{accountId:r,accountType:qj(n.accountType),planType:Gj(n.planType),rateLimits:Yj(n.rateLimits),savedAt:Jj(n.savedAt)??new Date(0).toISOString()}}async function Uj(){return LD(async e=>{let t=$j(await e.sendRequest(`account/read`,{refreshToken:!1}));if(!t)return null;let n=$j(t.account);if(!n)return null;let r=null;try{let t=$j(await e.sendRequest(`account/rateLimits/read`,void 0));r=t?Yj($j(t.rateLimits)):null}catch{r=null}let i=qj(n.type);if(i===`chatgpt`){let e=Kj(n.email);return e?{accountId:e,accountType:i,planType:Gj(n.planType)??r?.planType??null,rateLimits:r}:null}return i===`apiKey`?{accountId:`API Key`,accountType:i,planType:Gj(n.planType)??r?.planType??null,rateLimits:r}:null})}function Wj(e){return typeof e==`string`&&e.trim()?e.trim():`unknown`}function Gj(e){return typeof e==`string`&&e.trim()?e.trim():null}function Kj(e){return typeof e==`string`&&e.trim()?e.trim().toLowerCase():null}function qj(e){return e===`chatgpt`||e===`apiKey`?e:`unknown`}function Jj(e){if(typeof e!=`string`||!e.trim())return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function Yj(e){let t=$j(e);if(!t)return null;let n=Xj(t.primary),r=Xj(t.secondary),i=Gj(t.planType??t.plan_type),a=$j(t.credits),o=Gj(t.creditsBalance??a?.balance);return!n&&!r&&!i&&!o?null:{...n?{primary:n}:{},...r?{secondary:r}:{},...i?{planType:i}:{},...o?{creditsBalance:o}:{}}}function Xj(e){let t=$j(e);if(!t)return null;let n=Zj(t.usedPercent??t.used_percent);return n===null?null:{usedPercent:n,windowMinutes:Qj(t.windowMinutes??t.windowDurationMins??t.window_minutes),resetsAt:Zj(t.resetsAt??t.resets_at)}}function Zj(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function Qj(e){return typeof e==`number`&&Number.isFinite(e)?Math.trunc(e):null}function $j(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function eM(e){return JSON.stringify(tM(e))}function tM(e){return Array.isArray(e)?e.map(e=>tM(e)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,tM(t)])):e}function nM(e){let t=Kj(e);if(!t)throw Iw(`Codex account identifier cannot be empty`);return encodeURIComponent(t)}function rM(e){if(!iM(e))return null;try{return Kj(decodeURIComponent(e.slice(0,-5)))}catch{return null}}function iM(e){return e.endsWith(`.json`)&&!e.endsWith(Ij)}async function aM(e){try{return await d.default.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function oM(e){try{return await d.default.readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function sM(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 cM=[`## 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 lM(e,t){let n=e.provider===`codex`?e.codex:void 0;if(!n)throw Error(`Codex review config is required`);return[...cM,``,dM(n.target),`## My request for Codex:`,uM(e,t)].join(`
520
+ `))}function $k(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=tA(e),r=nA(t.text)??nA(t.value);r&&n.push(r)}return n.length>0?n.join(``):void 0}function eA(e,t=60){if(!e)return;let n=aA(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 tA(e){return typeof e==`object`&&e?e:{}}function nA(e){return typeof e==`string`&&e.trim()||void 0}function rA(e){if(typeof e==`string`)return iA(e)}function iA(e){if(!e)return;let t=aA(e).trim();return t.length>0?t:void 0}function aA(e){return e.replace(hk,``)}function oA(e){let t=Date.parse(e);if(Number.isFinite(t))return t}function sA(e){if(!(e===void 0||!Number.isFinite(e)||e<=0))return Math.round(e)}function cA(e){if(e===void 0||!Number.isFinite(e))return;let t=Math.floor(e);return t>0?t:void 0}var lA=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}=dA(r,[t,n]);if(fA(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=mA(await this.refreshProjects()),r=!0);let i=await pA(n.projects,t);if(!i)throw Lw(t);let a=await this.options.store.getProject(i.key);if(!a&&!r){if(n=mA(await this.refreshProjects()),i=await pA(n.projects,t),!i)throw Lw(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 dO({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 uA({sessions:[...n.values()],canonicalPathCache:e,getRawPath:e=>_A(e.cwd),mapSession:e=>{let t=vA(e.createdAt),n=vA(e.updatedAt,t);return{provider:`codex`,nativeSessionId:e.id,title:_A(e.name)??_A(e.preview),model:_A(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 uA({sessions:await vk(),canonicalPathCache:e,getRawPath:e=>_A(e.cwd),mapSession:e=>({provider:`claude`,nativeSessionId:e.nativeSessionId,title:_A(e.title),model:_A(e.model),createdAt:_A(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 uA(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 hA(i,e.canonicalPathCache);t.push({canonicalProjectPath:n,session:e.mapSession(r)})}catch{n+=1}}return{records:t,skippedCount:n}}function dA(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:gA(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=yA(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(xA)})).sort((e,t)=>bA(e.project,t.project));return{projects:r.map(e=>e.project),projectSessions:r}}function fA(e){return Object.values(e).some(e=>e?.status===`failed`)}async function pA(e,t){let n=e.find(e=>e.path===t);if(n)return n;let r=await RE(t);return e.find(e=>e.path===r)}function mA(e){return{v:1,generatedAt:e.generatedAt,providers:e.providers,projects:e.projects}}async function hA(e,t){let n=t.get(e);return n||(n=RE(e),t.set(e,n)),n}function gA(e){return(0,l.createHash)(`sha256`).update(e).digest(`hex`).slice(0,16)}function _A(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function vA(e,t){return!Number.isFinite(e)||e<=0?t??new Date(0).toISOString():new Date(e*1e3).toISOString()}function yA(e,t){return e&&e.updatedAt>=t.updatedAt?e:t}function bA(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 xA(e,t){return e.updatedAt===t.updatedAt?`${e.provider}:${e.nativeSessionId}`.localeCompare(`${t.provider}:${t.nativeSessionId}`):t.updatedAt.localeCompare(e.updatedAt)}var SA=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 CA(this.getProjectPath(e),EA);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 wA(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 wA(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 CA(this.indexPath,TA)}getProjectPath(e){return p.default.join(this.projectsDir,`${e}.json`)}enqueueWrite(e){return this.writeQueue=this.writeQueue.then(e,e),this.writeQueue}};async function CA(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 wA(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 TA(e){return!DA(e)||e.v!==1||typeof e.generatedAt!=`string`||!pd.safeParse(e.providers).success||!Array.isArray(e.projects)?!1:e.projects.every(e=>md.safeParse(e).success)}function EA(e){return!DA(e)||e.v!==1||typeof e.projectKey!=`string`||e.projectKey.length===0||typeof e.canonicalProjectPath!=`string`||e.canonicalProjectPath.length===0||!md.safeParse(e.project).success||!pd.safeParse(e.providers).success||!Array.isArray(e.sessions)?!1:e.sessions.every(e=>hd.safeParse(e).success)}function DA(e){return typeof e==`object`&&!!e}const OA=Buffer.from([48,42,48,5,6,3,43,101,112,3,33,0]);function kA(e){let t=Zd.parse(e.clientHello),n=(0,l.randomBytes)(32).toString(`base64`),{privateKey:r,publicKey:i}=(0,l.generateKeyPairSync)(`x25519`),a=Uf(Kf(NA(i.export({format:`jwk`})))),o=Nf({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:Qd.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 AA(e){let t=Zd.parse(e.clientHello),n=Qd.parse(e.gatewayHello),r=$d.parse(e.clientAuth);if(t.version!==n.version||r.version!==t.version||!Vd.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([OA,Wf(t.deviceIdentity.publicKey)])});if(!(0,l.verify)(null,Buffer.from(Pf({gatewayId:e.gatewayId,clientHello:t,gatewayHello:{gatewayNonce:n.gatewayNonce,gatewayPublicKeyFingerprint:n.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:n.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:r.clientEphemeralPublicKey}}),`utf8`),i,Wf(r.signature)))throw Error(`transcript_invalid`)}function jA(e){let t=Qd.parse(e.gatewayHello),n=$d.parse(e.clientAuth),r=(0,l.createPublicKey)({key:{crv:`X25519`,kty:`OKP`,x:Gf(Wf(n.clientEphemeralPublicKey))},format:`jwk`}),i=(0,l.diffieHellman)({privateKey:e.gatewayEphemeralPrivateKey,publicKey:r});return Lf({role:`gateway`,keySchedule:If({gatewayId:e.gatewayId,clientHello:Zd.parse(e.clientHello),gatewayHello:{gatewayNonce:t.gatewayNonce,gatewayPublicKeyFingerprint:t.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:t.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:n.clientEphemeralPublicKey},sharedSecret:new Uint8Array(i),keyEpoch:1})})}function MA(e){return cf.parse({version:1,gatewayId:e.gatewayId,deviceId:e.deviceId,code:e.code,message:e.message,retryable:e.retryable})}function NA(e){if(typeof e.x!=`string`||e.x.length===0)throw Error(`x25519 public key export missing x`);return e.x}const PA=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;let FA=null;function IA(e){FA=e}function LA(e,t){PA&&(console.log(`[session-fetch][gateway] ${e}`,t),FA?.info({event:e,...t},`session fetch debug`))}const RA=64*1024;var zA=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}},BA=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(Af.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=>Oc.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=Oc.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(Af.parse({type:`pairing.claim.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...KA(t,`pairing.claim`)})}}async handleRefresh(e,t){try{let n=await this.dependencies.handleRefresh(t);this.dependencies.sendFrame(Af.parse({type:`auth.refresh.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...KA(t,`auth.refresh`)})}}async handleFileContent(e,t){try{let n=await this.dependencies.handleFileContentRequest(e,t);this.dependencies.sendFrame(Af.parse({type:`file.content.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...KA(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:{...GA(`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(Af.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=ff.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:GA(`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:GA(`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(Af.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=ff.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:GA(`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=kA({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(Af.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{AA({gatewayId:this.dependencies.gatewayId,clientHello:n.handshake.clientHello,gatewayHello:n.handshake.gatewayHello,clientAuth:t})}catch(t){this.sendSecureError(e,n.deviceId,qA(t),String(t));return}try{let r=await this.dependencies.verifyDeviceIdentityBinding(n.deviceId,n.handshake.clientHello.deviceIdentity),i=jA({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(Af.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,YA(t),String(t))}}ensureReadyMobileClient(e){if(e.clientId&&e.socket)return;let t=new zA(t=>{try{let n=Af.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,JA(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:MA({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:GA(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 Hf({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,JA(t),`relay secure payload failed: ${String(t)}`),null}}createRelayBusinessPayloadFields(e,t,n){let r=Ed({payload:n,compressionThresholdBytes:VA(t.frameType,n)?RA:void 0});if(HA(n)){let i=UA(n),a=WA(n);LA(`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:RA,uncompressedByteLength:r.uncompressedByteLength,compressedByteLength:r.compressedByteLength})}if(e.handshake.status!==`ready`){let e=Dd(r);return e?{compressedPayload:e}:{payload:n}}return{encryptedPayload:Vf({session:e.handshake.session,metadata:{frameType:t.frameType,messageType:t.messageType,gatewayId:this.dependencies.gatewayId,...t.requestId?{requestId:t.requestId}:{}},preparedPayload:r})}}};function VA(e,t){return e===`to_mobile`&&HA(t)}function HA(e){return typeof e==`object`&&!!e&&`kind`in e&&(e.kind===`session.stream.snapshot.chunk`||e.kind===`session.readable.snapshot.chunk`)}function UA(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 WA(e){return e.kind===`session.readable.snapshot.chunk`||`readable`in e.payload?e.payload.readable:void 0}function GA(e,t,n){return ff.parse({code:e,status:t,message:n})}function KA(e,t){if(xw(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=XA(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`||Vw(e))||t===`file.content`&&Vw(e)?{code:`UNAUTHORIZED`,status:401,message:n}:{code:`INTERNAL`,status:500,message:n}}function qA(e){return ZA(e,[`identity_mismatch`,`counter_replay`,`unsupported_version`,`transcript_invalid`])??`transcript_invalid`}function JA(e){return ZA(e,[`counter_gap_too_large`,`counter_replay`,`key_epoch_mismatch`,`decrypt_failed`])??`decrypt_failed`}function YA(e){if(xw(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=XA(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 XA(e){return e instanceof Error?e.message:typeof e==`string`?e:String(e)}function ZA(e,t){let n=XA(e);return t.find(e=>e===n)}function QA(e){return e?e.readyState:null}function $A(e){return(typeof e.extensions==`string`?e.extensions.trim():``)||null}var ej=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??rj}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=QA(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=Af.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=tj(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:$A(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=Af.parse(JSON.parse(nj(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 tj(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 nj(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 rj(e){return new $E(e,void 0,{perMessageDeflate:!0})}function ij(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(jf(t),`utf8`),(0,l.createPrivateKey)(e.privateKeyPem)).toString(`base64`)}}async function aj(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(oj(e.relayUrl),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(ij({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 vf.parse(JSON.parse(r)).token}function oj(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 sj(e){return e?.trim()||void 0}function cj(e){if(e)return{codex:e.codex?{approvalPolicy:e.codex.approvalPolicy,sandboxMode:e.codex.sandboxMode}:void 0,claude:e.claude?{permissionMode:e.claude.permissionMode}:void 0}}function lj(e,t){return{modeDefault:`default`,model:sj(t.defaults.model),reasoningEffort:t.defaults.reasoningEffort,execution:e===`codex`?{codex:{approvalPolicy:t.defaults.approvalPolicy??null,sandboxMode:t.defaults.sandboxMode??null}}:{claude:{permissionMode:t.defaults.permissionMode??null}}}}function uj(e){return{mode:`default`,model:null,reasoningEffort:null,execution:e===`codex`?{codex:{approvalPolicy:null,sandboxMode:null}}:{claude:{permissionMode:null}}}}function dj(e,t){let n=uj(e);return t?e===`codex`?{mode:t.mode,model:t.model,reasoningEffort:t.reasoningEffort,execution:{codex:{approvalPolicy:t.execution?.codex?.approvalPolicy??null,sandboxMode:t.execution?.codex?.sandboxMode??null}}}:{mode:t.mode,model:t.model,reasoningEffort:t.reasoningEffort,execution:{claude:{permissionMode:t.execution?.claude?.permissionMode??null}}}:n}function fj(e,t){return e===`claude`&&t?.permissionMode===`plan`?`plan`:`default`}function pj(e){let t=dj(e.provider,e.sessionTurnConfig);return e.sessionTurnConfig!==void 0||sj(e.legacyModel)!==void 0||e.legacySessionConfig!==void 0?mj({provider:e.provider,providerDefaults:{modeDefault:`default`},currentSessionTurnConfig:t,legacyModel:e.legacyModel,legacySessionConfig:e.legacySessionConfig}).sessionTurnConfig:t}function mj(e){let t=dj(e.provider,e.currentSessionTurnConfig),n=e.mode??(e.legacySessionConfig?fj(e.provider,e.legacySessionConfig):void 0)??t.mode??e.providerDefaults.modeDefault,r=dj(e.provider,{...t,mode:n});e.config&&(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&&(r.execution={codex:{approvalPolicy:e.config.execution.codex.approvalPolicy,sandboxMode:e.config.execution.codex.sandboxMode}}),e.provider===`claude`&&e.config.execution?.claude&&(r.execution={claude:{permissionMode:e.config.execution.claude.permissionMode}}));let i=sj(e.legacyModel);i&&(r.model=i),e.legacySessionConfig?.reasoningEffort!==void 0&&(r.reasoningEffort=e.legacySessionConfig.reasoningEffort),e.provider===`codex`&&e.legacySessionConfig&&(r.execution={codex:{approvalPolicy:e.legacySessionConfig.approvalPolicy??r.execution?.codex?.approvalPolicy??null,sandboxMode:e.legacySessionConfig.sandboxMode??r.execution?.codex?.sandboxMode??null}}),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??sj(e.providerDefaults.model),o={},s=r.reasoningEffort??e.providerDefaults.reasoningEffort;if(s&&(o.reasoningEffort=s),e.provider===`codex`){let t=r.execution?.codex?.approvalPolicy??e.providerDefaults.execution?.codex?.approvalPolicy??void 0,n=r.execution?.codex?.sandboxMode??e.providerDefaults.execution?.codex?.sandboxMode??void 0;t&&(o.approvalPolicy=t),n&&(o.sandboxMode=n)}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:cj(r.execution)}}}function hj(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t;if(e===`codex`){let e=typeof n.approvalPolicy==`string`?n.approvalPolicy:null,t=typeof n.sandboxMode==`string`?n.sandboxMode:null;return!e||!t?void 0:{approvalPolicy:e,sandboxMode:t}}let r=typeof n.permissionMode==`string`?n.permissionMode:null;if(r)return{permissionMode:r}}var gj=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}=e;return await this.enqueueWrite(async()=>{let e=this.preferences[t];this.preferences[t]=n;try{await this.persist()}catch(n){throw e?this.preferences[t]=e:delete this.preferences[t],n}}),e}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=hj(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 _j=[],vj=[{id:`default`,label:`Default`,isDefault:!0,supportedReasoningEfforts:[`low`,`medium`,`high`,`max`]}],yj=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`],bj=Fa.options,xj=[`read-only`,`workspace-write`,`danger-full-access`],Sj=[`default`,`acceptEdits`,`bypassPermissions`,`plan`,`dontAsk`],Cj={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 wj(e,t){let n=t?.trim().toLowerCase();return n?(Cj[e]??[]).find(e=>n===e.version.toLowerCase())??null:null}function Tj(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:yj}:{}},...e.map(e=>({...e,isDefault:!1}))]}function Ej(e){return e===`none`||e===`minimal`||e===`low`||e===`medium`||e===`high`||e===`xhigh`||e===`max`?e:null}function Dj(e){let t=new Set;for(let n of e){let e=Ej(n);e&&t.add(e)}return[...t]}function Oj(e){return e?.trim()||void 0}function kj(e){let t=Oj(e.runtimeModel);if(t)return t;let n=Oj(e.discoveredModel);if(n)return n;let r=Oj(e.existingModel),i=Oj(e.modelProvider)?.toLowerCase();if(r&&(!i||r.toLowerCase()!==i))return r}function Aj(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:Dj(e.supportedReasoningEfforts)}));return t.length===0?_j:(t.some(e=>e.isDefault)||(t[0]={...t[0],isDefault:!0}),t)}async function jj(e){let t=Date.now();try{let n=Aj(await mO());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 Mj(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(Am(),`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=Pj(e.description,e.displayName,t),a=e.supportsEffort===!1?[]:e.supportsEffort||n?Dj(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 Nj(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 Pj(...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 Fj=class{cache=new Map;inFlight=new Map;cacheEpochByProvider=new Map;executionPreferences;constructor(e){this.options=e,this.executionPreferences=new gj(this.options.providerExecutionPreferencesDir??p.default.join(Am(),`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=Cj.claude.length>0?Cj.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 lj(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 kw(t);let r=wj(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=pk(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 jj(this.options.logger)??_j:_j,l=e===`claude`&&a?await Mj(this.options.logger)??vj:vj,u=Dj(l.flatMap(e=>e.supportedReasoningEfforts??[])),f=e===`codex`?{provider:e,source:o,models:c,support:{reasoningEffort:!0,approvalPolicy:!0,sandboxMode:!0,permissionMode:!1},options:{reasoningEfforts:yj,approvalPolicies:bj,sandboxModes:xj,permissionModes:[]},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},options:{reasoningEfforts:u,approvalPolicies:[],sandboxModes:[],permissionModes:Sj},defaults:{model:l.find(e=>e.isDefault)?.id??l[0]?.id,reasoningEffort:Nj(l),permissionMode:`default`}},p=await this.executionPreferences.get(e),m={...f.defaults,...r?.defaults??{},...p?.provider===`codex`?{approvalPolicy:p.approvalPolicy,sandboxMode:p.sandboxMode}:{},...p?.provider===`claude`?{permissionMode:p.permissionMode}:{}},h=m.model?.trim(),g=o===`native`?f.models:h?Tj(f.models,h,e):f.models;if(!r){let e={capabilities:{...f,models:g,defaults:m},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 _={capabilities:{...f,models:g,defaults:m},resolvedAgentVersion:r.version};return this.options.logger?.info?.({...s,cacheStatus:`miss`,durationMs:Date.now()-d,source:_.capabilities.source,modelCount:_.capabilities.models.length},`provider capabilities resolved`),_})();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 Ij=`.meta.json`;function Lj(){let e=process.env.CODEX_HOME?.trim();return e?p.default.resolve(e):p.default.join(f.default.homedir(),`.codex`)}function Rj(){return p.default.join(Lj(),`auth.json`)}function zj(){return p.default.join(Am(),`codex-accounts`)}var Bj=class{currentAuthFilePath;snapshotsDir;readAccountMetadata;constructor(e={}){this.currentAuthFilePath=e.currentAuthFilePath??Rj(),this.snapshotsDir=e.snapshotsDir??zj(),this.readAccountMetadata=e.readAccountMetadata??Uj}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 oM(this.currentAuthFilePath),n=await this.readSavedSnapshot(e);return await sM(this.currentAuthFilePath,n.rawContent),{previousRawContent:t}}async restoreCurrentAuthFile(e){await sM(this.currentAuthFilePath,e)}async listSavedAccounts(e){let t=await aM(this.snapshotsDir);return(await Promise.all(t.filter(e=>e.isFile()&&iM(e.name)).map(async t=>{let n=rM(t.name);if(!n)return null;let r=p.default.join(this.snapshotsDir,t.name);try{let t=Vj(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 oM(this.getSnapshotPath(e));if(n===null)return`missing`;try{return Vj(n,this.getSnapshotPath(e)).canonicalContent===t?`current`:`stale`}catch{return`stale`}}async writeSnapshot(e,t,n){let r=new Date().toISOString();await sM(this.getSnapshotPath(e),t.rawContent),await sM(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 oM(t);if(n===null)throw Fw(e);return Vj(n,t)}async readSnapshotMetadata(e){let t=await oM(this.getSnapshotMetadataPath(e));if(t===null)return null;try{return Hj(t)}catch{return null}}async readCurrentAuthFile(){let e=await this.readCurrentAuthFileOrNull();if(!e)throw Iw(`Current Codex auth.json is missing or unreadable`);return e}async readCurrentAuthFileOrNull(){let e=await oM(this.currentAuthFilePath);if(e===null)return null;try{return Vj(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 Iw(`Current Codex account does not expose a ChatGPT email via account/read`);return e}getSnapshotPath(e){return p.default.join(this.snapshotsDir,`${nM(e)}.json`)}getSnapshotMetadataPath(e){return p.default.join(this.snapshotsDir,`${nM(e)}${Ij}`)}};function Vj(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Iw(`Codex auth file is not valid JSON: ${t}`,{error:String(e)})}if(!n||typeof n!=`object`||Array.isArray(n))throw Iw(`Codex auth file is not an object: ${t}`);let r=n;return{authMode:Wj(r.auth_mode),lastRefreshAt:Jj(r.last_refresh),rawContent:e,canonicalContent:eM(n)}}function Hj(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`invalid snapshot metadata`);let n=t,r=Kj(n.accountId);if(!r)throw Error(`missing snapshot metadata accountId`);return{accountId:r,accountType:qj(n.accountType),planType:Gj(n.planType),rateLimits:Yj(n.rateLimits),savedAt:Jj(n.savedAt)??new Date(0).toISOString()}}async function Uj(){return LD(async e=>{let t=$j(await e.sendRequest(`account/read`,{refreshToken:!1}));if(!t)return null;let n=$j(t.account);if(!n)return null;let r=null;try{let t=$j(await e.sendRequest(`account/rateLimits/read`,void 0));r=t?Yj($j(t.rateLimits)):null}catch{r=null}let i=qj(n.type);if(i===`chatgpt`){let e=Kj(n.email);return e?{accountId:e,accountType:i,planType:Gj(n.planType)??r?.planType??null,rateLimits:r}:null}return i===`apiKey`?{accountId:`API Key`,accountType:i,planType:Gj(n.planType)??r?.planType??null,rateLimits:r}:null})}function Wj(e){return typeof e==`string`&&e.trim()?e.trim():`unknown`}function Gj(e){return typeof e==`string`&&e.trim()?e.trim():null}function Kj(e){return typeof e==`string`&&e.trim()?e.trim().toLowerCase():null}function qj(e){return e===`chatgpt`||e===`apiKey`?e:`unknown`}function Jj(e){if(typeof e!=`string`||!e.trim())return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function Yj(e){let t=$j(e);if(!t)return null;let n=Xj(t.primary),r=Xj(t.secondary),i=Gj(t.planType??t.plan_type),a=$j(t.credits),o=Gj(t.creditsBalance??a?.balance);return!n&&!r&&!i&&!o?null:{...n?{primary:n}:{},...r?{secondary:r}:{},...i?{planType:i}:{},...o?{creditsBalance:o}:{}}}function Xj(e){let t=$j(e);if(!t)return null;let n=Zj(t.usedPercent??t.used_percent);return n===null?null:{usedPercent:n,windowMinutes:Qj(t.windowMinutes??t.windowDurationMins??t.window_minutes),resetsAt:Zj(t.resetsAt??t.resets_at)}}function Zj(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function Qj(e){return typeof e==`number`&&Number.isFinite(e)?Math.trunc(e):null}function $j(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function eM(e){return JSON.stringify(tM(e))}function tM(e){return Array.isArray(e)?e.map(e=>tM(e)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,tM(t)])):e}function nM(e){let t=Kj(e);if(!t)throw Iw(`Codex account identifier cannot be empty`);return encodeURIComponent(t)}function rM(e){if(!iM(e))return null;try{return Kj(decodeURIComponent(e.slice(0,-5)))}catch{return null}}function iM(e){return e.endsWith(`.json`)&&!e.endsWith(Ij)}async function aM(e){try{return await d.default.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function oM(e){try{return await d.default.readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function sM(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 cM=[`## 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 lM(e,t){let n=e.provider===`codex`?e.codex:void 0;if(!n)throw Error(`Codex review config is required`);return[...cM,``,dM(n.target),`## My request for Codex:`,uM(e,t)].join(`
521
521
  `)}function uM(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 ${fM(r.sha,r.title)}.`:r.type===`custom`?r.instructions:`Please review my uncommitted changes.`,a=pM(t);return a?`${i}\n\nAdditional review instructions:\n${a}`:i}function dM(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 ${fM(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 fM(e,t){let n=pM(t);return n?`${e} (${JSON.stringify(n)})`:e}function pM(e){return e?.trim()||void 0}const mM=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;function hM(e){return e.lastHydratedExternalUpdatedAt||e.updatedAt||e.createdAt}function gM(e,t){mM&&(!e.startsWith(`config.get`)&&!e.startsWith(`raw-events`)&&!e.startsWith(`sync-external`)&&!e.endsWith(`.error`)||console.log(`[session-fetch][gateway] ${e}`,t))}function _M(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 vM(e,t,n){let r=dj(e,n);if(!t)return bM(e,r);let i=dj(e,t);return bM(e,{mode:r.mode??i.mode,model:r.model===void 0?i.model:r.model,reasoningEffort:r.reasoningEffort===void 0?i.reasoningEffort:r.reasoningEffort})}function yM(e){return e.observedModel===void 0?e.observedSessionTurnConfig?.model===void 0?e.currentModel:Oj(e.observedSessionTurnConfig.model??void 0):Oj(e.observedModel)}function bM(e,t){let n=dj(e,t);return{mode:n.mode,model:n.model,reasoningEffort:n.reasoningEffort}}function xM(e,t){return e?.status===`running`?{status:`running`}:t?{status:`running`,interactionLockReason:`external_turn_running`}:{status:`idle`}}function SM(e){return e.status===`active`?!0:e.turns.some(e=>e.status===`inProgress`||e.status===`in_progress`)}function CM(e,t){if(!t)return SM(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 wM(e){return e.startsWith(`sess_`)}function TM(e){return e.source===`native_discovered`?!0:e.providerMode===`native`&&(e.provider===`codex`||e.provider===`claude`)}function EM(e){return e.nativeSessionId?.trim()??``?!0:e.provider===`codex`&&!wM(e.id)}function DM(e){return wM(e.id)?e.nativeSessionId??e.id:e.id}function OM(e){return e.provider!==`codex`&&e.provider!==`claude`||e.providerMode!==`native`?!1:EM(e)}function kM(e){return e instanceof Error&&/^Session .+ is closed$/i.test(e.message)}function AM(e,t){if(e.provider!==`codex`||t.type!==`error.runtime`)return!1;if(qN(t.source)?.startsWith(`codex.app_server`))return!0;let n=qN(t.message)??``;return/\bclosed\b/i.test(n)}const jM={idleTtlMs:900*1e3,sweepIntervalMs:60*1e3,maxSessions:24,maxCodexSessions:8,maxClaudeSessions:16};function MM(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(1,Math.trunc(n)):t}function NM(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(0,Math.trunc(n)):t}var PM=class{sessions=new Map;providerCapabilities;codexAccounts;nextRawSeqBySession=new Map;preparingRuntimeDispatches=new Set;queuedInterruptsBeforeDispatch=new Set;runtimeLifecycle;sweepTimer;lastRawEnvelopeTimestampMs=0;shuttingDown=!1;constructor(e){if(this.options=e,this.providerCapabilities=new Fj({preferNativeProviders:e.preferNativeProviders,projectStore:e.projectStore,logger:e.logger,providerExecutionPreferencesDir:e.providerExecutionPreferencesDir}),this.codexAccounts=e.codexAccountService??new Bj,this.runtimeLifecycle={idleTtlMs:MM(e.runtimeLifecycle?.idleTtlMs,jM.idleTtlMs),sweepIntervalMs:NM(e.runtimeLifecycle?.sweepIntervalMs,jM.sweepIntervalMs),maxSessions:MM(e.runtimeLifecycle?.maxSessions,jM.maxSessions),maxCodexSessions:MM(e.runtimeLifecycle?.maxCodexSessions,jM.maxCodexSessions),maxClaudeSessions:MM(e.runtimeLifecycle?.maxClaudeSessions,jM.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 yD(),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 Nw(e);return this.options.projectStore.remove(e)}async restartCodexAppServer(){let e=this.getRunningRuntimeSessionCount();if(e>0)throw Pw(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 bD(),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 Pw(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 yD();let i=null;try{i=await this.codexAccounts.applySavedAccount(e),await bD()}catch(e){if(i?.previousRawContent)try{await this.codexAccounts.restoreCurrentAuthFile(i.previousRawContent),await bD()}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 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 listProjectSessions(e,t=`all`,n){let r=await this.options.projectStore.getById(e);if(!r)throw kw(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)||n}async getProjectSessionConfig(e,t){let n=this.options.historyStore.getProjectSession(e,t),r=this.getRuntimeSessionSummary(e,t,n);if(gM(`config.get.begin`,{projectId:e,sessionId:t,shouldHydrate:n?this.shouldHydrateCodexExternalSessionConfig(n):!1,persisted:_M(n),runtime:_M(r)}),r)return gM(`config.get.result`,{projectId:e,sessionId:t,resultSource:`runtime`,..._M(r)}),r;let i=n?.provider===`codex`?await this.maybeHydrateCodexExternalSessionConfig(n):n;return gM(`config.get.result`,{projectId:e,sessionId:t,resultSource:i===n?`persisted`:`hydrated`,..._M(i)}),i}async syncProjectSessionHistory(e,t){let n=await this.options.projectStore.getById(e);if(!n)throw kw(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 Aw(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=EN(i,o.rawEvents);gM(`sync-external.classify`,TN({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){let r=Date.now();if(!await this.options.projectStore.getById(e))throw kw(e);let i=0,a=0,o,s=(s,c)=>{gM(`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`),[];if(!c)throw Aw(e,t);o=c;let l=Date.now(),u=await this.options.historyStore.getSessionRawEvents(c.id,Math.max(n,300));return i=Date.now()-l,a=u.slice(-Math.max(1,n)).length,s(`local_only_cached`,{localEventCount:u.length}),u.slice(-Math.max(1,n))}async getProjectSessionRawEventsCompacted(e,t,n=300){let r=await this.resolveProjectSessionForRawRead(e,t);return this.options.historyStore.getSessionRawEventsCompacted(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 kw(e);let n=this.options.historyStore.getProjectSession(e,t);if(n||=this.getRuntimeSessionSummary(e,t),!n)throw Aw(e,t);return n}async startSession(e){let t=await this.resolveProjectForSessionStart(e.projectId,e.cwd),n=`sess_${yw(10)}`,r=e.provider===`codex`&&this.options.requireNativeCodex,i=pk(e.provider,{preferNative:this.options.preferNativeProviders,requireNative:r}),a=await this.getProviderDefaults(e.provider,t.id),o=e.sessionTurnConfig?dj(e.provider,e.sessionTurnConfig):pj({provider:e.provider,legacyModel:e.model,legacySessionConfig:e.sessionConfig}),s=mj({provider:e.provider,providerDefaults:a,currentSessionTurnConfig:o}),c=bM(e.provider,o),l=await i.createSession({sessionId:n,model:s.model,cwd:t.path,sessionConfig:s.sessionConfig,metadata:e.metadata,logger:this.options.logger});if(r&&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(e.provider,l,n),d=this.resolveNativeSessionId(e.provider,l,u),f=new Date().toISOString(),p=await this.attachRuntimeSession({id:u,nativeSessionId:d,source:`gateway`,projectId:t.id,projectPath:t.path,provider:e.provider,providerMode:l.providerMode,model:s.model,title:void 0,sessionTurnConfig:c,sessionTurnConfigUpdatedAt:f,createdAt:f,updatedAt:f,status:`idle`,providerSession:l,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!1,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return this.markSessionStreamReady(p),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.start`,deviceId:e.deviceId,sessionId:p.id,detail:{provider:e.provider,model:s.model,sessionConfig:e.sessionConfig,sessionTurnConfig:c,projectId:t.id,projectPath:t.path}}),{sessionId:p.id,projectId:t.id}}async sendInput(e,t,n,r){let i=this.options.historyStore.getSession(e),a=this.sessions.get(e);if(a?.dispatchInFlight)throw Mw(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!a&&this.preparingRuntimeDispatches.has(e))throw Mw(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(i?.interactionLockReason===`external_turn_running`)throw Mw(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 Mw(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&TM(i))throw Mw(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 jw(e);let i=await this.getProviderDefaults(s.provider,s.projectId),l=mj({provider:s.provider,providerDefaults:i,currentSessionTurnConfig:s.sessionTurnConfig,legacyModel:r?.model,legacySessionConfig:r?.sessionConfig,mode:r?.mode,config:r?.config});if(s.dispatchInFlight=!0,this.touchSession(s),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`turn.input`,deviceId:n,sessionId:e,detail:{text:t,model:l.model,sessionConfig:r?.sessionConfig,mode:l.mode,config:r?.config,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);if(s=await this.sendInputWithRuntimeRecovery(e,s,t,{model:l.model,sessionConfig:l.sessionConfig,mode:l.mode}),!s.title){let e=GN(t);e&&this.setSessionTitle(s,e)}let u=new Date().toISOString();s.sessionTurnConfig=bM(s.provider,l.sessionTurnConfig),s.sessionTurnConfigUpdatedAt=u,l.model&&s.model!==l.model&&(s.model=l.model),s.updatedAt=u,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 startReview(e,t,n,r){let i=this.options.historyStore.getSession(e),a=this.sessions.get(e);if(a?.dispatchInFlight)throw Mw(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!a&&this.preparingRuntimeDispatches.has(e))throw Mw(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(i?.interactionLockReason===`external_turn_running`)throw Mw(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 Mw(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&TM(i))throw Mw(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 jw(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=mj({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=lM(t,r?.input);if(s=await this.sendInputWithRuntimeRecovery(e,s,u,{model:l.model,sessionConfig:l.sessionConfig}),!s.title){let e=KN(t,r?.input);e&&this.setSessionTitle(s,e)}let d=new Date().toISOString();s.sessionTurnConfig=bM(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(!kM(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:JN(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 jw(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_${yw(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=pk(t.provider,{preferNative:this.options.preferNativeProviders,requireNative:n}),i=await this.getProviderDefaults(t.provider,t.projectId),a=bM(t.provider,t.sessionTurnConfig),o=mj({provider:t.provider,providerDefaults:i,currentSessionTurnConfig:a}),s=t.provider===`claude`?DM(t):t.nativeSessionId??t.id,c=await r.createSession({sessionId:t.id,model:o.model??t.model,cwd:t.projectPath,resumeSessionId:s,sessionConfig:o.sessionConfig,metadata:{resumeFromHistory:!0},logger:this.options.logger});if(n&&c.providerMode!==`native`)throw await c.close(),Error(`Native Codex provider is required, but adapter fell back to mock. Check ENABLE_NATIVE_PROVIDERS and Codex app-server availability.`);let l=this.resolveCanonicalSessionId(t.provider,c,t.id),u=this.resolveNativeSessionId(t.provider,c,t.nativeSessionId),d=await this.attachRuntimeSession({id:l,nativeSessionId:u,source:t.source??`gateway`,projectId:t.projectId,projectPath:t.projectPath,provider:t.provider,providerMode:c.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:c,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!0,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return await this.persistSessionSnapshot(d),d}consumeQueuedInterruptBeforeDispatch(e){return this.queuedInterruptsBeforeDispatch.delete(e)}createInterruptedBeforeDispatchError(e){return Mw(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 uO(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=YN(t.createdAt),s=YN(t.updatedAt),l=xM(i,SM(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:kj({runtimeModel:i?.model,discoveredModel:t.model,existingModel:n?.model,modelProvider:t.modelProvider}),title:i?.title??GN(t.name??t.preview)??n?.title,sessionTurnConfig:i?.sessionTurnConfig??(n?.sessionTurnConfig?bM(`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 yk(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=xM(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?bM(`claude`,n.sessionTurnConfig):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=hM(e),n=pN([e.nativeSessionId,e.id]);for(let r of n)try{gM(`config.get.probe.begin`,{projectId:e.projectId,sessionId:e.id,threadId:r,..._M(e)});let n=await pO(r);if(!n){gM(`config.get.probe.empty`,{projectId:e.projectId,sessionId:e.id,threadId:r});continue}let i=n.sessionTurnConfig?vM(e.provider,e.sessionTurnConfig,n.sessionTurnConfig):e.sessionTurnConfig,a={...e,model:yM({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),gM(`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:_M(a)}),this.options.historyStore.getProjectSession(e.projectId,e.id)??a}catch(t){gM(`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`||!OM(e)||this.sessions.has(e.id)||e.nativeSessionId&&this.sessions.has(e.nativeSessionId))return!1;let t=hM(e),n=e.sessionTurnConfigUpdatedAt||``;if(!e.sessionTurnConfig||!Oj(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 kw(e);if((await this.options.projectStore.upsertByPath(t)).id!==n.id)throw Error(`projectId (${e}) does not match cwd (${t})`);return await XN(n.path),n}if(e){let t=await this.options.projectStore.getById(e);if(!t)throw kw(e);return await XN(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=qN(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);return}if(n.type===`error.runtime`){let t=qN(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),AM(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_${yw(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_${yw(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=hN(e);if(!i)return{rawEvents:n};try{let a=Date.now(),o=await bk({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 gM(`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`&&mN(i)&&await this.markExternalHistoryHydrated(e.id,e.updatedAt),gM(`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=KM(n,(this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0))?.status===`running`),a=pN([e.nativeSessionId,e.id]);for(let o of a)try{let a=Date.now(),s=await fO(o,!0),c=Date.now(),l,u;if(e.source===`gateway`&&n.length>0)l=RN({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=ON({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n});r?(l=r,u=`native_tail_incremental`):(l=DN({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`)}else l=DN({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,YN(s.updatedAt),i),p=await this.patchObservedExternalSessionSummary(e,{updatedAt:YN(s.updatedAt),externallyRunning:e.source===`gateway`?CM(s,i):SM(s)});return gM(`sync-external.codex`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,threadStatus:s.status,threadUpdatedAt:YN(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`?CM(s,i):SM(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){gM(`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 gM(`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=IM(e.provider,t,n,i),s=Date.now(),c=await this.maybePersistSyncedExternalRawEvents(e,t,o,!0);return await this.markExternalHistoryHydrated(e.id,r),gM(`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=t.sessionTurnConfig?vM(e.provider,n.sessionTurnConfig,t.sessionTurnConfig):void 0,a=xM(r,t.externallyRunning),o=a.status===`running`?r?.pendingToolApprovals.size??0:0,s=a.status===`running`?r?.pendingUserInputs.size??0:0,c={...n,updatedAt:a.status===`running`?r?.updatedAt??t.updatedAt:t.updatedAt,status:a.status,model:r?.model??yM({currentModel:n.model,observedModel:t.model,observedSessionTurnConfig:i}),sessionTurnConfig:r?.sessionTurnConfig??i??(n.sessionTurnConfig?bM(e.provider,n.sessionTurnConfig):void 0),sessionTurnConfigUpdatedAt:r?.sessionTurnConfigUpdatedAt??(i?t.sessionTurnConfigUpdatedAt??t.updatedAt:void 0)??n.sessionTurnConfigUpdatedAt,interactionLockReason:a.interactionLockReason,pendingApprovals:o,pendingUserInputs:s,pendingActions:o+s,...e.provider===`codex`&&i?{codexExternalConfigHydrationVersion:3}:{}};return await this.options.historyStore.upsertSession(c),this.options.historyStore.getSession(e.id)??c}async markExternalHistoryHydrated(e,t){await this.options.historyStore.patchSession(e,{lastHydratedExternalUpdatedAt:t})}mustGetSession(e){let t=this.sessions.get(e);if(!t)throw jw(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=WN(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 FM=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]);function IM(e,t,n,r){if(e===`claude`)return RM(e,YM(t,n),n);if(e!==`codex`)return RM(e,t,n);if(t.length===0)return n.slice().sort((e,t)=>e.ts.localeCompare(t.ts));let i=r??KM(t),a=LM(e,t.filter(e=>!HM(e))),o=$M(e),s=t.filter(t=>{if(GM(t,i))return!1;if(!HM(t))return!0;let n=eN(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=$M(e),f=$M(e),p=JM(t)??JM(n)??Date.now();for(let[t,n]of s.entries()){c.set(n.eventId,n),l.set(n.eventId,t);for(let t of eN(e,n,d))u.add(t)}for(let t of n){if(GM(t,i))continue;let n=eN(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(!zM(r,t))continue;let e=l.get(t.eventId),n=qM(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 LM(e,t){let n=new Map,r=$M(e);for(let i of t)for(let t of eN(e,i,r))n.set(t,(n.get(t)??0)+1);return n}function RM(e,t,n){let r=new Map,i=new Set,a=$M(e),o=$M(e);for(let n of t){r.set(n.eventId,n);for(let t of eN(e,n,a))i.add(t)}for(let t of n){let n=eN(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 zM(e,t){return BM(e)&&BM(t)}function BM(e){return e.type===`native.raw`?$(Q(e.payload.raw).source)===`codex.history.thread_read`:!1}function VM(e){return e===`codex.history.thread_read`||e===`codex.history.thread_read.incremental`}function HM(e){let t=Q(e.payload.raw),n=$(t.source);return t.historyReplay===!0||VM(n)}function UM(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 WM(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&&HN(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&&HN(t)?t:void 0}if(n!==`codex.history.thread_read`||$(r.scope)!==`turn`)return;let i=$(Q(r.turn).status);return i&&HN(i)?i:void 0}function GM(e,t){if(!HM(e))return!1;let n=UM(e),r=WM(e);return!n||!r?!1:UN(t.terminalTurnStatusById.get(n),r)}function KM(e,t=!1){let n=new Set,r=new Map;for(let t of e){if(HM(t))continue;let e=UM(t);e&&n.add(e);let i=WM(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 qM(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function JM(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 YM(e,t){let n=XM(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=QM(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 XM(e){let t=new Map,n=new Map;for(let r of e){let e=ZM(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 ZM(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=dN(n);return r?{text:r,tsMs:t,syntheticMessageId:qN(n.id)??qN(n.item_id)??qN(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=fN(Q(Q(n.message).message));if(r)return{text:r,tsMs:t,syntheticMessageId:qN(Q(n.message).uuid)}}function QM(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||!FM.has(r))return;let i=Q(n.message);if(($(n.native_type)??$(i.type))!==`user`)return;let a=fN(Q(i.message));if(a)return{text:a,tsMs:t}}function $M(e){if(e===`codex`)return{codexTurnScopedItemOccurrences:new Map}}function eN(e,t,n){return e===`codex`?tN(t,n):e===`claude`?sN(t):[]}function tN(e,t){let n=Q(e.payload.raw),r=new Set,i=cN(e.type,n);if(i){let a=nN(e.type,n);a?r.add(aN(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(lN(`turn.started`,{turn:Q(a.turn)})),[...r];if(i===`turn/completed`)return r.add(lN(`turn.completed`,{status:`completed`,turn:Q(a.turn)})),[...r];if(i===`turn/failed`||i===`turn/interrupted`)return r.add(lN(`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=nN(e,n);return o?r.add(aN(o,t,n)):r.add(lN(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(lN(`thread.started`,{thread_id:t,thread:e}));let n=GN(uN(e.preview)??uN(e.name)??``);return n&&r.add(lN(`thread.title.updated`,{title:n,thread_id:t})),[...r]}if(s===`turn`){let e=Q(o.turn),t=$(e.status);return r.add(lN(`turn.started`,{turn:e})),t===`completed`?r.add(lN(`turn.completed`,{status:t,turn:e})):(t===`failed`||t===`interrupted`)&&r.add(lN(`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=nN(`item.completed`,e);return n?r.add(aN(n,t,e)):r.add(lN(`item.completed`,e)),[...r]}return[...r]}function nN(e,t){if(!e.startsWith(`item.`))return;let n=Q(t.item),r=$(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId),i=rN($(n.type));if(!(!r||!i))return[`codex`,e,r,i,iN(i,$(n.phase)),$(n.status)??``,CN($(n.command)),CN(dN(n))].join(`|`)}function rN(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 iN(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function aN(e,t,n){let r=oN(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 oN(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 sN(e){let t=Q(e.payload.raw),n=cN(e.type,t);if(n)return[n];if(e.type!==`native.raw`)return[];let r=$(t.source);if(!r||!FM.has(r))return[];let i=Q(t.message),a=$(t.native_type)??$(i.type),o=Q(i.message);if(a===`user`){let e=fN(o),t=$(i.uuid);return!e||!t?[]:[lN(`item.completed`,{item:{id:t,type:`user_message`,text:e}})]}if(a===`assistant`){let e=fN(o),t=$(o.id)??$(i.uuid);return!e||!t?[]:[lN(`item.completed`,{item:{id:t,type:`agent_message`,text:e}})]}return[]}function cN(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 lN(e,t);default:return}}function lN(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=CN($(n.command)),p=CN(dN(n)),m=CN(uN(t.message)),h=CN(uN(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 uN(e){if(typeof e==`string`)return e.length>0?e:void 0}function dN(e){let t=uN(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=uN(Q(t).text);n&&e.push(n)}if(e.length>0)return e.join(`
522
522
  `)}let r=Array.isArray(e.summary)?e.summary:[];if(r.length>0){let e=r.map(e=>uN(e)).filter(e=>!!e);if(e.length>0)return e.join(`
523
523
  `)}return``}function fN(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(`
524
524
  `)}function pN(e){let t=new Set;for(let n of e)n&&t.add(n);return[...t]}function mN(e){return String(e).includes(`returned no messages from getSessionMessages`)}function hN(e){return DM(e)}function gN(e){return e?{rawSeq:e.rawSeq,type:e.type,eventId:e.eventId,ts:e.ts}:null}function _N(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(!vN(n,i))return r}return e.length===t.length?null:n}function vN(e,t){return xN(yN(e))===xN(yN(t))}function yN(e){let{ts:t,...n}=e;return n}function bN(e){if(typeof e==`string`)return SN(e);if(Array.isArray(e))return e.map(e=>bN(e));if(!e||typeof e!=`object`)return e;let t=e,n={};for(let e of Object.keys(t).sort())n[e]=bN(t[e]);return n}function xN(e){return JSON.stringify(bN(e))}function SN(e){return e.length<=4096?e:{__type:`hashed_text`,length:e.length,sha256:(0,l.createHash)(`sha256`).update(e).digest(`hex`)}}function CN(e){if(!e)return``;let t=SN(e);return typeof t==`string`?t:`sha256:${t.length}:${t.sha256}`}function wN(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 TN(e){let t=e.previousEvents[e.previousEvents.length-1]?.rawSeq??null,n=e.nextEvents[e.nextEvents.length-1]?.rawSeq??null,r=_N(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:wN(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:gN(r===null?void 0:e.previousEvents[r]),nextMismatchEvent:gN(r===null?void 0:e.nextEvents[r])}}function EN(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&&vN(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&&vN(e,r)})?{historyUpdated:!0,refreshMode:`delta`,fromRawSeq:n??0,toRawSeq:r??n??0}:{historyUpdated:!0,refreshMode:`snapshot`,...r===void 0?{}:{toRawSeq:r}}}function DN(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:LN(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);(HN(t.status)?!UN(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,qN(n.id)??null])}return t}function ON(e){let t=kN(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(JM(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:LN(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,qN(t.id)??null]);continue}let a=n!==c,o=jN(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,qN(t.id)??null])}}return r}function kN(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=AN(t,n),a=$(e.status);a&&(i.status=a),i.fingerprint=FN(e);continue}if(i!==`item`)continue;let a=Q(r.item),o=$(r.turn_id)??$(a.turn_id);if(!o)continue;let s=AN(t,o),c=MN(o,a,void 0,s.itemOccurrenceByBaseKey);c&&(s.itemFingerprintByKey.has(c)||s.itemOrder.push(c),s.itemFingerprintByKey.set(c,PN(a)))}return t}function AN(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 jN(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||MN(t.id,a,r,n)!==i||e.itemFingerprintByKey.get(i)!==PN(a))return{safe:!1,appendedItems:[],statusChanged:!1}}return e.fingerprint!==void 0&&e.fingerprint!==FN(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 MN(e,t,n,r){let i=NN(e,t,n);if(!i)return;let a=oN(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 NN(e,t,n){let r=nN(`item.completed`,{turn_id:e,item:t});if(r)return r;let i=qN(t.id);if(i)return`id:${i}`;if(n!==void 0)return`${e}::${n}`}function PN(e){let t=rN($(e.type)),n=t?iN(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),xN(r)}function FN(e){return xN({status:$(e.status)??null,error:Q(e.error)})}function IN(e){return String(e??``).replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)}function LN(e,t,n){let r=n.map(IN).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 RN(e){let t=e.localCodexLiveTurnState??KM(e.localEvents),n=new Set,r=zN(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&&HN(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=UN(s,a.status);(!(n.has(a.id)||t.activeTurnIds.has(a.id))&&!c||HN(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=MN(a.id,t,void 0,l);if(i&&r.has(i))continue;let s=i?BN(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 zN(e){let t=new Set,n=new Map;for(let r of e){let e=VN(r);if(!e)continue;let i=MN(e.turnId,e.item,void 0,n);i&&t.add(i)}return t}function BN(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 VN(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 HN(e){return e===`completed`||e===`failed`||e===`interrupted`}function UN(e,t){return e===t&&HN(t)}function WN(e){let t=e.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g,``).replace(/\s+/g,` `).trim();if(t)return t}function GN(e,t=60){let n=WN(e);if(!n)return;let r=Array.from(n);return r.length<=t?n:r.slice(0,t).join(``).trimEnd()}function KN(e,t){if(t){let e=GN(t);if(e)return e}if(e.provider!==`codex`||!e.codex)return GN(`代码审查`);let n=e.codex.target;return n.type===`baseBranch`?GN(`审查 ${n.branch} 分支改动`):n.type===`custom`?GN(n.instructions):n.type===`commit`?GN(n.title||`审查提交 ${n.sha.slice(0,12)}`):GN(`审查未提交更改`)}function qN(e){if(typeof e!=`string`)return;let t=WN(e);if(t)return t}function JN(e){let t=0;for(let n of Object.values(e))n.some(e=>e.trim().length>0)&&(t+=1);return t}function YN(e){return!Number.isFinite(e)||e<=0?new Date().toISOString():new Date(e*1e3).toISOString()}async function XN(e){if(!(await d.default.stat(e)).isDirectory())throw Error(`Project path is not a directory: ${e}`)}var ZN=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=QN(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,QN({...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)&&(_P(t)||await this.enqueueRawSessionWrite(t.sessionId,async()=>{if(lP(t)){let e=gP([...await this.readSessionRawEventsLocked(t.sessionId),t]);await this.replaceRawEventFile(t.sessionId,e),this.rawEventsCacheBySession.set(t.sessionId,e),this.compactedRawEventsCacheBySession.set(t.sessionId,iP(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=uP(await this.readSessionRawEventsLocked(e),r,n);await this.replaceRawEventFile(e,t);let a=iP(t);i=aP(a),this.rawEventsCacheBySession.set(e,t),this.compactedRawEventsCacheBySession.set(e,a)}),i}async getSessionRawEvents(e,t=300){return this.getSessionRawEventsCompacted(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){if(await this.ready,!this.sessions.has(e))return[];let n=Math.max(1,t),r=this.readSessionRawEventsCompactedFromCache(e);if(r!==void 0)return r.slice(-n);let i=[];return await this.enqueueWrite(async()=>{i=(await this.readSessionRawEventsCompactedLocked(e)).slice(-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 qp(i.filter(e=>e.rawSeq>t)).slice(0,r);let a=[];return await this.enqueueWrite(async()=>{a=qp((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 nP(t);let n=null;return await this.enqueueWrite(async()=>{n=nP(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=`${tP(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=>tP(e)).join(`
525
525
  `);await rP(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(cP(e)){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}if(n&&sP(e,n)<0){this.compactedRawEventsCacheBySession.delete(e.sessionId);return}oP(r,e)}}async readSessionRawEventsCompactedLocked(e){let t=this.compactedRawEventsCacheBySession.get(e);if(t)return aP(t);let n=iP(await this.readSessionRawEventsLocked(e));return this.compactedRawEventsCacheBySession.set(e,n),aP(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(`
526
526
  `).map(e=>e.trim()).filter(Boolean),a=[];for(let e of i)try{let t=JSON.parse(e);if(!$N(t)||t.kind!==`provider.raw`)continue;let n=eP(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=il.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=>tP(e)).join(`
527
- `),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){if(this.hasPendingRawMutation(e))return;let t=this.compactedRawEventsCacheBySession.get(e);if(t)return aP(t);let n=this.rawEventsCacheBySession.get(e);if(!n)return;let r=iP(n);return this.compactedRawEventsCacheBySession.set(e,r),aP(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 QN(e){let t=e.projectPath?.trim()||e.projectId;return t===e.projectId?e:{...e,projectId:t}}function $N(e){return typeof e==`object`&&!!e}function eP(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<=0))return e}function tP(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 nP(e){if(e.length===0)return null;let t=e[0],n=e[e.length-1];return!t||!n?null:{min:t.rawSeq,max:n.rawSeq}}async function rP(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 iP(e){let t=Kp(e),n=t.map(e=>e),r=new Map;for(let[e,t]of n.entries()){let n=Yp(t);n&&r.set(n.key,e)}return{slots:n,indexByKey:r,dense:t}}function aP(e){return e.dense||=e.slots.filter(e=>e!==null),e.dense}function oP(e,t){let n=Yp(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=Xp(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 sP(e,t){let n=e.ts.localeCompare(t.ts);return n===0?e.eventId.localeCompare(t.eventId):n}function cP(e){if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.message)?t.message:{};return(typeof n.method==`string`?n.method:typeof t.method==`string`?t.method:``)===`item/completed`}function lP(e){if(cP(e)||e.type===`turn.completed`||e.type===`turn.failed`)return!0;if(e.type!==`native.raw`)return!1;let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(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 uP(e,t,n){if(n?.replaceMissing)return dP(e,t,n);let r=[...e].sort(hP),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&&fP(n,e)&&(r[t]=mP(n,e));continue}let n={...e,rawSeq:a};a+=1,i.set(n.eventId,r.length),r.push(n)}return gP(r.sort(hP)).sort(hP)}function dP(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(hP),c=1;for(let t of e)c=Math.max(c,t.rawSeq+1);return gP(s.map(e=>{let t=r.get(e.eventId);if(t)return fP(t,e)?mP(t,e):{...e,rawSeq:t.rawSeq};let n={...e,rawSeq:c};return c+=1,n})).sort(hP)}function fP(e,t){return pP(e)&&pP(t)}function pP(e){return e.type===`native.raw`?SP(($N(e.payload.raw)?e.payload.raw:{}).source)===`codex.history.thread_read`:!1}function mP(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function hP(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 gP(e){let t=Jp(e).filter(e=>!_P(e)),n=new Set;for(let e of t){let t=vP(e);t&&n.add(t)}return n.size===0?t:t.filter(e=>{let t=yP(e);return!t||!n.has(t)})}function _P(e){let t=$N(e.payload.raw)?e.payload.raw:{},n=SP(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=$N(t.message)?t.message:{};return SP(r.method)??SP(t.method)?!1:$N(($N(r.result)?r.result:{}).turn)}function vP(e){if(e.type===`item.completed`){let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.item)?t.item:{};return bP(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.message)?t.message:{},r=$N(n.params)?n.params:{};if((SP(n.method)??SP(t.method))!==`item/completed`)return null;let i=$N(r.item)?r.item:{};return bP(e.sessionId,i)}function yP(e){if(e.type===`item.updated`){let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.item)?t.item:{},r=SP(n.original_method)??SP(n.originalMethod)??``,i=$N(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`)&&!xP(r)?null:bP(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.message)?t.message:{},r=$N(n.params)?n.params:{};if(!xP(SP(n.method)??SP(t.method)??``))return null;let i=$N(r.msg)?r.msg:{},a=SP(r.itemId)??SP(r.item_id)??SP(i.itemId)??SP(i.item_id);return a?`${e.sessionId}|${a}`:null}function bP(e,t){let n=SP(t.id)??SP(t.item_id)??SP(t.itemId);return n?`${e}|${n}`:null}function xP(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function SP(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function CP(e){return!e||e.providerMode!==`native`?!1:e.interactionLockReason===`external_turn_running`?!0:e.status!==`running`}const wP=e=>e.filter(e=>!(e.kind===`system`&&e.title===`Turn Usage`)),TP=(e,t)=>e.find(e=>e.itemId===t||e.id===t)??null,EP=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,DP=e=>{let t=wP(mp(e.sessionId,e.rawEvents,[]));return{timelineItems:yo({rawEvents:e.rawEvents,messages:t,deferCompletedToolDetails:!1}).timelineItems,lastRawSeq:e.rawEvents[e.rawEvents.length-1]?.rawSeq??null}};async function OP(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=TP(DP({sessionId:e.sessionId,rawEvents:t}).timelineItems,e.itemId);return n?{item:n}:null}function kP(e,t){if(e&&e!==t)throw Ew()}async function AP(e){let t=jP(e.authService,e.refreshToken);e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:MP(t)},`auth refresh attempt`);try{let t=await e.execute(),n=jP(e.authService,e.refreshToken),r=jP(e.authService,t.refreshToken);return e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshedDeviceId:t.deviceId,previousRefreshToken:MP(n),nextRefreshToken:MP(r)},`auth refresh succeeded`),t}catch(t){let n=jP(e.authService,e.refreshToken);throw e.logger?.warn?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:MP(n),error:NP(t)},`auth refresh failed`),t}}function jP(e,t){return e.inspectRefreshToken?.(t)??{tokenRecordState:`missing`}}function MP(e){return{claimDeviceId:e.claimDeviceId??null,claimExpAt:e.claimExpAt??null,claimIssuedAt:e.claimIssuedAt??null,claimJtiSuffix:PP(e.claimJti),claimType:e.claimType??null,latestActiveTokenCreatedAt:e.latestActiveTokenCreatedAt??null,latestActiveTokenJtiSuffix:PP(e.latestActiveTokenJti),tokenRecordCreatedAt:e.tokenRecordCreatedAt??null,tokenRecordDeviceId:e.tokenRecordDeviceId??null,tokenRecordRevokedAt:e.tokenRecordRevokedAt??null,tokenRecordState:e.tokenRecordState}}function NP(e){return xw(e)?{code:e.code,message:String(e),status:e.status}:e instanceof Error?{message:e.message,name:e.name}:{message:String(e)}}function PP(e){return e?e.slice(-8):null}function FP(e,t,n,r){if(!r)return t;let i={gatewayId:t.gatewayId,deviceId:t.deviceId,mobilePublicKey:r.publicKey,pairingContext:{pairingCode:IP(n),signedAt:new Date().toISOString()}};return{...t,gatewayIdentity:e.identity,pairingConfirmation:ym(e.identity,e.privateKeyPem,i)}}function IP(e){return e.replace(/\s+/gu,``).toUpperCase()}async function LP(e,t){try{let n=lf.parse(e);switch(n.method){case`auth.refresh`:{let e=await AP({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 kP(n.params.deviceId??t.relayDeviceId,e.deviceId),uf.parse({method:n.method,result:e})}case`projects.list`:{let e=await t.sessionManager.listProjects();return uf.parse({method:n.method,result:{projects:e}})}case`codex.accounts.get`:{let e=await t.sessionManager.getCodexAccounts();return uf.parse({method:n.method,result:e})}case`codex.accounts.save`:{let e=await t.sessionManager.saveCurrentCodexAccount();return uf.parse({method:n.method,result:e})}case`codex.accounts.switch`:{let e=await t.sessionManager.switchCodexAccount(n.params.accountId);return uf.parse({method:n.method,result:e})}case`gateway.settings.get`:return uf.parse({method:n.method,result:t.gatewaySettings.get()});case`gateway.settings.update`:{let e=await t.gatewaySettings.update(n.params);return uf.parse({method:n.method,result:e})}case`gateway.update.get`:{let e=await t.updateService.getOrCheckInfo(`mobile`);return uf.parse({method:n.method,result:e})}case`codex.appServer.restart`:{let e=await t.sessionManager.restartCodexAppServer();return uf.parse({method:n.method,result:e})}case`gateway.update.apply`:{let e=await t.updateService.applyUpdate(n.params.requestedBy??`mobile`);return uf.parse({method:n.method,result:e})}case`projects.discovery.get`:{let e=await t.projectDiscoveryService.getProjects();return uf.parse({method:n.method,result:e})}case`projects.discovery.refresh`:{let e=await t.projectDiscoveryService.refreshProjects();return uf.parse({method:n.method,result:e})}case`projects.create`:{let e=await t.sessionManager.createProject({path:n.params.path,title:n.params.title});return uf.parse({method:n.method,result:{project:e}})}case`projects.delete`:if(!await t.sessionManager.deleteProject(n.params.projectId))throw zP(n.method,`NOT_FOUND`,404,`Project not found`);return uf.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 uf.parse({method:n.method,result:e})}case`workspace.directories.create`:{let e=await t.fsService.createDirectoryUnrestricted(n.params.path,n.params.name,200);return uf.parse({method:n.method,result:e})}case`workspace.entries.list`:{let e=await t.workspaceFileService.listEntries(n.params.locator,n.params.limit??200);return uf.parse({method:n.method,result:e})}case`workspace.files.resolve`:{let e=await t.workspaceFileService.resolveFile(n.params.locator);return uf.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 uf.parse({method:n.method,result:e})}case`workspace.files.preparePreview`:{let e=t.relayPreviewBaseUrl?.trim(),r=t.gatewayId?.trim();if(!e||!r)throw zP(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 uf.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 uf.parse({method:n.method,result:{sessions:e}})}case`sessions.discovery.list`:{let e=await t.projectDiscoveryService.listProjectSessions(n.params.projectPath);return uf.parse({method:n.method,result:e})}case`sessions.get`:{let e=await t.sessionManager.getProjectSessionSummary(n.params.projectId,n.params.sessionId);if(!e)throw zP(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return uf.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 zP(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return uf.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}),uf.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 uf.parse({method:n.method,result:r})}case`sessions.readableItem.get`:{let e=await OP({sessionManager:t.sessionManager,readableItemDetailLookup:t.readableItemDetailLookup,projectId:n.params.projectId,sessionId:n.params.sessionId,itemId:n.params.itemId});if(!e)throw zP(n.method,`NOT_FOUND`,404,`Readable item ${n.params.itemId} not found`);return uf.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`),uf.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 uf.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 uf.parse({method:n.method,result:e})}case`devices.list`:return uf.parse({method:n.method,result:{devices:t.authService.listDevices()}});case`devices.revoke`:if(!await t.authService.revokeDevice(n.params.deviceId))throw zP(n.method,`NOT_FOUND`,404,`Device ${n.params.deviceId} not found`);return uf.parse({method:n.method,result:{revoked:!0}});default:{let e=n;throw zP(void 0,`INTERNAL`,500,`Unhandled relay RPC method: ${JSON.stringify(e)}`)}}}catch(e){throw RP(e)}}function RP(e){if(xw(e))switch(e.code){case`REFRESH_TOKEN_REVOKED`:case`DEVICE_REVOKED`:case`REFRESH_TOKEN_DEVICE_MISMATCH`:return zP(`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 zP(`NOT_FOUND`,e.status,String(e),e.details);case`SESSION_TURN_CONFLICT`:case`PROJECT_DELETE_CONFLICT`:case`CODEX_APP_SERVER_RESTART_CONFLICT`:return zP(`BAD_REQUEST`,e.status,String(e),e.details);default:return zP(e.status>=500?`INTERNAL`:`BAD_REQUEST`,e.status,String(e),e.details)}let t=ff.safeParse(e);if(t.success)return t.data;let n=df.safeParse(e);if(n.success)return zP(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 zP(t.code,t.status,t.message,t.details)}let r=String(e);return e instanceof Error&&e.name===`ZodError`?zP(`BAD_REQUEST`,400,r):BP(e)?zP(`UNAUTHORIZED`,401,r):VP(r)?zP(`BAD_REQUEST`,400,r):zP(`INTERNAL`,500,r)}function zP(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 ff.parse({...o?{method:o}:{},code:s,status:c,message:l,...u===void 0?{}:{details:u}})}function BP(e){return xw(e)&&(e.code===`REFRESH_TOKEN_REVOKED`||e.code===`DEVICE_REVOKED`||e.code===`REFRESH_TOKEN_DEVICE_MISMATCH`)||Vw(e)}function VP(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 HP(e,t){return e.length===0?[]:t===void 0?[...e]:e.filter(e=>e.rawSeq>t)}function UP(e){return{baseRawEvents:Kp(e.rawEvents.filter(t=>t.rawSeq<=e.cursorRawSeq)),nextRawEvents:Kp(e.rawEvents)}}function WP(e,t){return t&&`kind`in t&&t.kind===`bootstrapping`?t:{kind:`bootstrapping`,sessionId:e,previousReadyState:t??null,queuedEnvelopes:[]}}function GP(e,t){let n=e.previousReadyState;if(!n)return{previousReadyState:null,nextReadyState:null,replayedEnvelopes:[]};let r=HP(e.queuedEnvelopes,n.rawEvents[n.rawEvents.length-1]?.rawSeq),i=n;for(let e of r)i=t(i,e);return{previousReadyState:n,nextReadyState:i,replayedEnvelopes:r}}function KP(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_${yw(12)}`,ts:new Date().toISOString(),payload:{raw:{decision:e.decision,reason:e.reason,snapshotId:e.snapshotId,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}}}}function qP(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.timelineItems?{readable:{snapshotId:e.snapshotId,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,...e.timelineItems?{timelineItems:e.timelineItems}:{}}}:{}}}}function JP(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}}}}}function YP(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 XP(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_${yw(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 ZP(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 QP=1e3,$P=(e,t)=>`${e}::${t}`,eF=e=>e.purpose===`detail_view`&&e.bootstrapMode===`readable`,tF=e=>{let t=new Map;for(let n of e)t.set(n.sessionId,n);return[...t.values()]},nF=e=>({kind:`ready`,sessionId:e.target.sessionId,projectId:e.target.projectId,provider:e.target.provider,detailLevel:e.target.detailLevel,rawEvents:[...e.rawEvents],detailTransportRawEvents:[...e.detailTransportRawEvents??e.rawEvents],contextUsage:e.contextUsage??null,timelineItems:[...e.timelineItems],pendingApprovals:[...e.pendingApprovals],pendingUserInputs:[...e.pendingUserInputs]}),rF=e=>typeof e==`object`&&e?e:{},iF=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}},aF=e=>{if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=rF(n),r=iF(e,`id`),i=iF(e,`header`),a=iF(e,`question`);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=rF(e),n=iF(t,`label`);if(!n)return null;let r=iF(t,`description`)??n,i=iF(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},oF=(e,t)=>{let n=pp(e,t),r=new Map,i=new Map;for(let e of n){if(e.type===`tool.permission.requested`){let t=rF(e.payload.raw),n=iF(t,`requestId`,`request_id`);if(!n)continue;let i=rF(t.rawParams??t.raw_params),a=rF(i.networkApprovalContext??i.network_approval_context);r.set(n,{requestId:n,sessionId:e.sessionId,...iF(t,`toolName`,`tool_name`)?{toolName:iF(t,`toolName`,`tool_name`)}:{},...iF(t,`reason`)?{reason:iF(t,`reason`)}:{},...iF(i,`command`)?{command:iF(i,`command`)}:{},...iF(i,`cwd`)?{cwd:iF(i,`cwd`)}:{},...iF(i,`grantRoot`,`grant_root`)?{grantRoot:iF(i,`grantRoot`,`grant_root`)}:{},...iF(a,`host`)?{networkHost:iF(a,`host`)}:{},...iF(a,`protocol`)?{networkProtocol:iF(a,`protocol`)}:{},...iF(t,`itemId`,`item_id`)?{itemId:iF(t,`itemId`,`item_id`)}:{},...iF(t,`turnId`,`turn_id`)?{turnId:iF(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`tool.permission.resolved`){let t=iF(rF(e.payload.raw),`requestId`,`request_id`);t&&r.delete(t);continue}if(e.type===`user.input.requested`){let t=rF(e.payload.raw),n=iF(t,`requestId`,`request_id`);if(!n)continue;i.set(n,{requestId:n,sessionId:e.sessionId,questions:aF(t.questions),...iF(t,`itemId`,`item_id`)?{itemId:iF(t,`itemId`,`item_id`)}:{},...iF(t,`turnId`,`turn_id`)?{turnId:iF(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`user.input.resolved`){let t=iF(rF(e.payload.raw),`requestId`,`request_id`);t&&i.delete(t)}}return{pendingApprovals:[...r.values()],pendingUserInputs:[...i.values()]}},sF=e=>{let t=e.rawEventsAlreadyMatchDetailTransport===!0?e.rawEvents:uF({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=e.target.purpose===`detail_view`?Fc({provider:e.target.provider,rawEvents:t}):null,r=e.target.purpose===`detail_view`?wP(mp(e.target.sessionId,t,[])):[],i=e.target.purpose===`detail_view`?yo({rawEvents:t,messages:r,deferCompletedToolDetails:!0}):{timelineItems:[],consumedMessageIds:[]},a=e.target.purpose===`detail_view`?oF(e.target.sessionId,t):{pendingApprovals:[],pendingUserInputs:[]};return{detailTransportRawEvents:t,contextUsage:n,timelineItems:i.timelineItems,pendingApprovals:a.pendingApprovals,pendingUserInputs:a.pendingUserInputs}},cF=e=>{let t=uF({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=sF({target:e.target,rawEvents:t,rawEventsAlreadyMatchDetailTransport:!0});return nF({target:e.target,rawEvents:e.rawEvents,detailTransportRawEvents:t,contextUsage:n.contextUsage,timelineItems:n.timelineItems,pendingApprovals:n.pendingApprovals,pendingUserInputs:n.pendingUserInputs})},lF=(e,t)=>{let n=vF(e.rawEvents,t),r=uF({rawEvents:vF(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),i=sF({target:{sessionId:e.sessionId,provider:e.provider,detailLevel:e.detailLevel,purpose:`detail_view`},rawEvents:r,rawEventsAlreadyMatchDetailTransport:!0});return{...e,rawEvents:n,detailTransportRawEvents:r,contextUsage:i.contextUsage,timelineItems:i.timelineItems,pendingApprovals:i.pendingApprovals,pendingUserInputs:i.pendingUserInputs}},uF=e=>{if(e.detailLevel!==`compact`||e.rawEvents.length===0)return e.rawEvents;let t=dF(e.rawEvents[0]?.sessionId??``,e.rawEvents);return pE(e.rawEvents,e.detailLevel,{preserveIncompleteCommandOutput:!0,additionalCompletedCommandItemKeys:t})},dF=(e,t)=>{if(!e||t.length===0)return new Set;let n=new Set,r=mp(e,t,[]);for(let t of r){if(t.itemType!==`command_execution`||!t.itemId||t.status!==`completed`&&t.status!==`failed`)continue;let r=hF(e,t.itemId);r&&n.add(r)}return n},fF=e=>iF(e,`id`,`itemId`,`item_id`)??null,pF=e=>{if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`)return fF(rF(rF(e.payload.raw).item));if(e.type!==`native.raw`)return null;let t=rF(rF(e.payload.raw).message),n=rF(t.params),r=rF(n.item),i=rF(n.msg);return fF(r)??fF(rF(t.item))??iF(n,`itemId`,`item_id`)??iF(i,`itemId`,`item_id`)??null},mF=e=>{if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=rF(e.payload.raw);return(iF(rF(t.message),`method`)??iF(t,`method`))===`item/completed`},hF=(e,t)=>t?`${e}|${t}`:null,gF=e=>hF(e.sessionId,pF(e)),_F=e=>{let t=gF(e);if(t)return`item:${t}`;let n=Yp(e);return n?`delta:${n.key}`:null},vF=(e,t)=>{let n=[...e],r=gF(t),i=_F(t),a=Yp(t),o=t;if(i&&a)for(let e=n.length-1;e>=0;--e){let r=n[e];if(!r||_F(r)!==i||!Yp(r))continue;let a=Xp(r,t);if(a){n[e]=null,o=a;break}}return n.push(o),!r||!mF(t)?n.filter(e=>e!==null):n.filter(e=>e!==null&&(e.eventId===o.eventId||gF(e)!==r||!Yp(e)))},yF=e=>{let t=bF(e);if(!t)return null;let n=fF(t),r=rF(t.payload),i=iF(t,`output_delta`,`outputDelta`)??iF(r,`output_delta`,`outputDelta`);return!n||!i?null:{itemId:n,delta:i}},bF=e=>{if(e.type===`item.updated`){let t=rF(rF(e.payload.raw).item);return xF(t)?t:null}if(e.type!==`native.raw`)return null;let t=rF(e.payload.raw),n=rF(t.message);if((iF(n,`method`)??iF(t,`method`))!==`item/updated`)return null;let r=rF(rF(n.params).item);return xF(r)?r:null},xF=e=>{let t=iF(e,`type`);return t===`commandExecution`||t===`command_execution`},SF=e=>e.includes(`[compact history preview:`),CF=(e,t)=>{let n=yF(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`||SF(i.output))return null;let a=vF(e.rawEvents,t),o=uF({rawEvents:vF(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),s={...i,output:`${i.output}${n.delta}`},c=[...e.timelineItems];c[r]=s;let l=a[a.length-1]?.rawSeq??t.rawSeq;return{nextState:{...e,rawEvents:a,detailTransportRawEvents:o,timelineItems:c},messageInput:{provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,fromRawSeq:e.rawEvents[e.rawEvents.length-1]?.rawSeq,toRawSeq:l,timelineUpserts:[],timelineRemovals:[],timelineTextDeltaPatches:[{id:i.id,field:`output`,delta:n.delta}]}}},wF=e=>Buffer.byteLength(JSON.stringify(JP(e)),`utf8`),TF=e=>{let t=Math.max(1,Math.floor(e.maxChunkBytes??524288)),n=[],r=(t,n)=>wF({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});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},EF=(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)}},DF=(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)}},OF=(e,t,n,r)=>{let i={},a=pp(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=iF(rF(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},kF=e=>e?{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:e.rawEvents[e.rawEvents.length-1]?.rawSeq??null,timelineItemCount:e.timelineItems.length,pendingApprovalCount:e.pendingApprovals.length,pendingUserInputCount:e.pendingUserInputs.length,hasContextUsage:!!e.contextUsage}:{stateFound:!1},AF=e=>e?e.kind===`ready`?kF(e):{stateFound:!0,kind:e.kind,sessionId:e.sessionId,queuedEnvelopeCount:e.queuedEnvelopes.length,previousReadyState:kF(e.previousReadyState)}:{stateFound:!1},jF=(e,t)=>{let n,r,i;try{n=Ys(e.previousState.timelineItems,e.nextState.timelineItems),r=EF(e.previousState.pendingApprovals,e.nextState.pendingApprovals),i=DF(e.previousState.pendingUserInputs,e.nextState.pendingUserInputs)}catch(n){throw t?.(`stream.readable.delta.build.error`,{sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,previousState:kF(e.previousState),nextState:kF(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=e.nextState.rawEvents[e.nextState.rawEvents.length-1]?.rawSeq;return o===void 0?null:{provider:e.previousState.provider,sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,fromRawSeq:e.previousState.rawEvents[e.previousState.rawEvents.length-1]?.rawSeq,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 MF(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}}var NF=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=tF(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 eF(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=$P(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:AF(r),hadPendingDelta:!!i,pendingDeltaFromRawSeq:i?.previousState.rawEvents[i.previousState.rawEvents.length-1]?.rawSeq??null,pendingDeltaToRawSeq:i?.nextState.rawEvents[i.nextState.rawEvents.length-1]?.rawSeq??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?TP(t.timelineItems,e.itemId):null,r=n&&`deferredDetail`in n&&n.deferredDetail!==void 0;if(n&&!r){let r=EP(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?.rawEvents[t.rawEvents.length-1]?.rawSeq??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=DP({sessionId:e.sessionId,rawEvents:a}),s=this.seedReadableItemDetailCache({projectId:e.projectId,sessionId:e.sessionId,timelineItems:o.timelineItems}),c=TP(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(!eF(r))continue;let t=$P(n,e.sessionId),i=this.stateByClientSession.get(t);if(!i)continue;if(i.kind===`bootstrapping`){i.queuedEnvelopes.push(e);continue}let a=CF(i,e);if(a){this.flushPendingReadableLiveDelta(n,e.sessionId),this.stateByClientSession.set(t,a.nextState),this.sessionHub.sendSessionMessageToClient(n,e.sessionId,YP(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=lF(i,e);this.stateByClientSession.set(t,o);let s=OF(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 eF(r)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:n,sessionId:e.sessionId}),t}finally{this.sessionHub.resumeSession(n,e.sessionId)}}}};sendSessionSnapshot=async(e,t,n)=>{let r=`snap_${yw(12)}`,{compactedRawEvents:i,detailTransportRawEvents:a,lastRawSeq:o,slimReadableProjection:s,pendingApprovals:c,pendingUserInputs:l}=await this.buildReadableSnapshotProjection(t);this.sessionHub.sendStreamMessage(e,KP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,...o===void 0?{}:{toRawSeq:o}}));let u=ZP(a,QP),d=t.purpose===`detail_view`?ZP(s.timelineItems,QP):[],f=t.purpose===`detail_view`?`raw+readable`:`raw`,p=Math.max(u.length,d.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:f,compactedEventCount:i.length,detailTransportEventCount:a.length,readableTimelineItemCount:s.timelineItems.length,totalChunks:p,firstRawSeq:a[0]?.rawSeq??null,lastRawSeq:o??null});for(let n=0;n<p;n+=1){let i=u[n]??[],a=d[n]??[];this.sessionHub.sendStreamMessage(e,qP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,chunkIndex:n,totalChunks:p,events:i,timelineItems:t.purpose===`detail_view`?a:void 0}))}};sendSessionReadableSnapshot=async(e,t,n)=>{let r=`snap_${yw(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||!eF(f)||p&&p!==t.projectId||(f.detailLevel??`full`)!==t.detailLevel){this.clearState(e,t.sessionId);return}let m=nF({target:t,rawEvents:a,detailTransportRawEvents:o,contextUsage:s,timelineItems:l.timelineItems,pendingApprovals:u,pendingUserInputs:d}),h=this.stateByClientSession.get(i),g=HP(h?.kind===`bootstrapping`?h.queuedEnvelopes:[],c);for(let e of g)m=lF(m,e);this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:m.rawEvents,detailTransportRawEvents:m.detailTransportRawEvents,contextUsage:m.contextUsage,timelineItems:m.timelineItems,pendingApprovals:m.pendingApprovals,pendingUserInputs:m.pendingUserInputs});let _=m.rawEvents[m.rawEvents.length-1]?.rawSeq;this.sessionHub.sendStreamMessage(e,KP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,..._===void 0?{}:{toRawSeq:_}}));let v=TF({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,timelineItems:m.timelineItems,pendingApprovals:m.pendingApprovals,pendingUserInputs:m.pendingUserInputs,contextUsage:m.contextUsage}),y=Math.max(v.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:m.rawEvents.length,detailTransportRawEventCount:m.detailTransportRawEvents.length,readableTimelineItemCount:m.timelineItems.length,bufferedReadableDeltaCount:g.length,readableChunkTargetBytes:524288,readableChunkItemCounts:v.map(e=>e.timelineItems.length),readableChunkEstimatedBytes:v.map(e=>e.estimatedByteLength),totalChunks:y,firstRawSeq:m.rawEvents[0]?.rawSeq??null,lastRawSeq:_??null});for(let n=0;n<y;n+=1){let i=v[n];this.sessionHub.sendStreamMessage(e,JP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,chunkIndex:n,totalChunks:y,timelineItems:i?.timelineItems??[],pendingApprovals:n===0?m.pendingApprovals:void 0,pendingUserInputs:n===0?m.pendingUserInputs:void 0,contextUsage:n===0?m.contextUsage:void 0}))}}catch(n){throw this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}};sendSessionReadableResumeDelta=async(e,t,n,r)=>{let i=$P(e,t.sessionId),a=await this.sessionManager.getProjectSessionRawEvents(t.projectId,t.sessionId,2**53-1),{baseRawEvents:o,nextRawEvents:s}=UP({rawEvents:a,cursorRawSeq:n}),c=cF({target:t,rawEvents:o}),l=cF({target:t,rawEvents:s}),u=this.stateByClientSession.get(i),d=HP(u?.kind===`bootstrapping`?u.queuedEnvelopes:[],l.rawEvents[l.rawEvents.length-1]?.rawSeq);for(let e of d)l=lF(l,e);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:a.length,baseRawEventCount:o.length,nextRawEventCount:s.length,bootstrapState:AF(u),bufferedEnvelopeCount:d.length,previousState:kF(c),nextState:kF(l)}),this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:l.rawEvents,detailTransportRawEvents:l.detailTransportRawEvents,contextUsage:l.contextUsage,timelineItems:l.timelineItems,pendingApprovals:l.pendingApprovals,pendingUserInputs:l.pendingUserInputs});let f=l.rawEvents[l.rawEvents.length-1]?.rawSeq??n;this.sessionHub.sendStreamMessage(e,KP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`delta`,reason:r,fromRawSeq:n,...f===void 0?{}:{toRawSeq:f}}));let p=jF({previousState:c,nextState:l},this.log);this.log(`stream.readable.resume.delta`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,reason:r,cursorRawSeq:n,emittedDelta:!!p,deltaFromRawSeq:p?.fromRawSeq??n,deltaToRawSeq:p?.toRawSeq??f??null,timelineUpsertCount:p?.timelineUpserts.length??0,timelineRemovalCount:p?.timelineRemovals.length??0,timelineTextDeltaPatchCount:p?.timelineTextDeltaPatches.length??0,pendingApprovalUpsertCount:p?.pendingApprovalUpserts.length??0,pendingUserInputUpsertCount:p?.pendingUserInputUpserts.length??0}),this.sessionHub.sendSessionMessageToClient(e,t.sessionId,YP(p??{provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,fromRawSeq:n,toRawSeq:f,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=EP(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=i.rawEvents[i.rawEvents.length-1]?.rawSeq??-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(eF).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)eF(t)||this.clearState(e,t.sessionId)}startReadableLiveProjectionBootstrap(e){let t=$P(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=WP(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:AF(n),clearedPendingDelta:!!r,carriedPendingEnvelopeCount:a.length}),t}getReadableDeliveredReadyState(e,t){let n=$P(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?HP(t.nextState.rawEvents,e?.rawEvents[e.rawEvents.length-1]?.rawSeq):[]}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=n.rawEvents[n.rawEvents.length-1]?.rawSeq;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=nF(e);this.stateByClientSession.set($P(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:kF(t)})}primeReadableBootstrapForSubscriptions(e,t){for(let n of t)eF(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,KP({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 Aw(n,t);let i={sessionId:t,projectId:n,provider:r.provider,status:r.status,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:MF(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`,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:MF(i)}),a}async buildReadableSnapshotProjection(e){let t=await this.sessionManager.getProjectSessionRawEventsCompacted(e.projectId,e.sessionId,2**53-1),n=uF({rawEvents:t,detailLevel:e.detailLevel}),r=sF({target:e,rawEvents:n,rawEventsAlreadyMatchDetailTransport:!0}),i=t[t.length-1]?.rawSeq;return{compactedRawEvents:t,detailTransportRawEvents:n,contextUsage:r.contextUsage,lastRawSeq:i,slimReadableProjection:{timelineItems:r.timelineItems,consumedMessageIds:[]},pendingApprovals:r.pendingApprovals,pendingUserInputs:r.pendingUserInputs}}restoreReadableLiveProjectionAfterBootstrapFailure(e){let t=$P(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=GP(n,lF);if(!a.previousReadyState||!r||!eF(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:AF(n),currentSubscriptionFound:!!r,currentSubscriptionProjectId:i||null,currentSubscriptionDetailLevel:r?.detailLevel??null,previousReadyState:kF(a.previousReadyState),nextReadyState:kF(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:kF(a.nextReadyState)});return}let o,s=a.previousReadyState;for(let t of a.replayedEnvelopes){let n=lF(s,t),r=OF(e.sessionId,t,s,n);r&&(o={...o??{},...r}),s=n}let c=jF({previousState:a.previousReadyState,nextState:a.nextReadyState,sessionSummary:o},this.log);if(!c){this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:kF(a.nextReadyState),emittedDelta:!1});return}this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:kF(a.nextReadyState),emittedDelta:!0,deltaFromRawSeq:c.fromRawSeq??null,deltaToRawSeq:c.toRawSeq}),this.sessionHub.sendSessionMessageToClient(e.clientId,a.previousReadyState.sessionId,YP(c))}sendReadableLiveDeltaNow(e){let t=jF({previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary},this.log);t&&this.sessionHub.sendSessionMessageToClient(e.clientId,e.previousState.sessionId,YP(t))}flushPendingReadableLiveDelta(e,t){let n=$P(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=$P(e.clientId,e.previousState.sessionId),n=this.pendingDeltaByClientSession.get(t);if(n){let t=PF({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 PF(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 FF(e){return e.sendProviderRaw?`relay_ws`:`direct_ws`}function IF(e){let t=performance.now(),n=JSON.stringify(e);return{payload:n,byteLength:Buffer.byteLength(n),serializeDurationMs:Number((performance.now()-t).toFixed(3))}}function LF(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 RF=class{clients=new Map;clientIdsBySessionId=new Map;deliveryStateByClientSession=new Map;addClient(e,t){let n=`ws_${yw(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??IF(t),i=LF(t);return i&&LA(`stream.snapshot.chunk.outbound`,{clientId:e.id,deviceId:e.deviceId,transport:FF(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 zF=1200,BF=process.env.NATIVE_SESSION_WATCH_DEBUG===`1`||process.env.EXPO_PUBLIC_NATIVE_SESSION_WATCH_DEBUG===`1`;var VF=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){BF&&(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,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,!CP(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=HF(i.session);if(i.historyUpdated||i.statusChanged||UF(t)&&WF(l)){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)}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:zF,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`)},zF))))}stateKey(e,t){return JSON.stringify([e,t])}};function HF(e){return{updatedAt:e.updatedAt,status:e.status,interactionLockReason:e.interactionLockReason,...e.model?{model:e.model}:{},...e.sessionTurnConfig?{sessionTurnConfig:e.sessionTurnConfig}:{},...e.sessionTurnConfigUpdatedAt?{sessionTurnConfigUpdatedAt:e.sessionTurnConfigUpdatedAt}:{}}}function UF(e){return e===`lease_added`||e===`watch`||e===`watch_catchup`}function WF(e){return!!(e?.model||e?.sessionTurnConfig||e?.sessionTurnConfigUpdatedAt)}var GF=class{constructor(e){this.config=e}issue(e){let t=KF(e.sizeBytes??0),n=uw.default.sign({sub:e.deviceId,type:`workspace_preview`,gatewayId:this.config.gatewayId,path:e.canonicalPath,disposition:e.disposition},this.config.accessSecret,{expiresIn:t}),r=uw.default.decode(n);return{ticket:n,expiresAt:r?.exp?new Date(r.exp*1e3).toISOString():new Date().toISOString()}}getExpiresAt(e){let t=uw.default.decode(e);return t?.exp?new Date(t.exp*1e3).toISOString():new Date().toISOString()}verify(e){let t;try{t=uw.default.verify(e,this.config.accessSecret)}catch(e){if(e instanceof Error){if(e.name===`TokenExpiredError`)throw Ow();if(e.name===`JsonWebTokenError`||e.name===`NotBeforeError`)throw Dw()}throw e}if(t.type!==`workspace_preview`||t.gatewayId!==this.config.gatewayId)throw Dw();return t}};function KF(e){return e>20971520?7200:600}var qF=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:YF(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:YF(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=JF(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=JF(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 kw(e);return t}};function JF(e){return e.split(p.default.sep).join(`/`)}function YF(e,t){return`${e}; filename="${t.replace(/["\\]/g,`_`)}"`}function XF(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 ZF=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;let QF=null;const $F={perMessageDeflate:{threshold:1024}},eI={globalDecompression:!1,threshold:1024,customTypes:/^text\/(?!event-stream)|(?:\+|\/)json(?:;|$)|(?:\+|\/)text(?:;|$)|(?:\+|\/)xml(?:;|$)/u},tI=4096;function nI(e,t){ZF&&(console.log(`[native-watch][gateway]`,e,t),QF?.info({event:e,...t},`native session watch debug`))}function rI(e){return e?typeof e==`string`?e:e.toString(`utf8`):``}function iI(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 aI(e){let t=e.limit??300,n=e.detailLevel??`full`,r=(r,i)=>{LA(`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:pE(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:pE(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:pE(o,n)};return r(s,{rangeMin:i.min,rangeMax:i.max,minExpectedCursor:a}),s}async function oI(e,t={}){await Dg(e.gatewayLogPath);let n=cI(e,t),r=sI(e,n.instance);IA(r.log),QF=r.log,await r.register(fw.default,{origin:!0}),await r.register(pw.default,eI),await r.register(dw.default,{options:$F});let i=process.env.NODE_ENV!==`production`,a=4e3,o=`[unserializable payload]`,s=new Hw(e);await s.init();let c=new Qw(e.auditLogPath),l=new RF,u=new RT,d=new FE(e.projectStoreDir),f=new ZN(e.sessionHistoryDir);await f.init();let m=new SA(p.default.join(e.sessionHistoryDir,`discovery-v1`));await m.init();let h=new lA({store:m});await h.init();let g,_=null,v=new Map,y=await gm(e.authStoreDir),b=new GF(e),x=e.relayEnabled?Lh({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 PM({preferNativeProviders:e.enableNativeProviders,requireNativeCodex:e.requireNativeCodex,auditLogger:c,projectStore:d,historyStore:f,logger:r.log,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 qF({fsService:u,sessionManager:T,previewTicketService:b}),D=new NF(l,T,e.readableLiveDeltaCoalesceMs,LA),O=new VF({sessionManager:T,logger:r.log,sendStreamMessage:(e,t)=>{l.sendStreamMessage(e,t)},createExternalUpdateMessage:e=>XP(e),refreshDetailSessionSnapshots:e=>D.refreshDetailSessionSnapshots(e)});T.warmStartupProviderCapabilities().catch(e=>{r.log.warn({err:e},`startup provider capability warmup failed`)});let k=new Kh({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{IA(null),QF=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:Sm(),gatewayIdentity:y.identity})),r.get(`/api/pairing/descriptor`,async()=>kh({gatewayId:e.gatewayId,gatewayName:e.name,machineName:Sm(),relayBaseUrl:x,directBaseUrls:Fh({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=_l.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}}),FP(y,{...n,gatewayName:e.name,machineName:Sm()},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=bl.safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await AP({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=()=>ud.parse({name:e.name,machineName:Sm()}),j=async n=>{let r=ud.pick({name:!0}).parse(n);if(!t.configPath)throw Error(`Gateway config path is unavailable`);return e.name=await Lm(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=ud.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=Fu.safeParse(n?.requestedBy);try{let e=await k.applyUpdate(r.success?r.data:`mobile`);return Bu.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 kl.parse(await T.restartCodexAppServer())}catch(e){let n=xw(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 El.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 Dl.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 Ol.parse(await T.switchCodexAccount(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 xw(e)&&e.code===`DISCOVERED_PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):VP(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=Vu.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=Zu.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 xw(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=Na.safeParse(n.provider);if(!r.success)return t.code(400).send({error:`Invalid provider`});let i=za.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 xw(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 xw(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 xw(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=hc.safeParse(r.detailLevel).success?hc.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 xw(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 OP({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 xw(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(kc(e),i.sub,a)}catch(e){await F({deviceId:i.sub,clientId:a,rawCommand: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:rI(t),streamSubscriptionCount:n.length,streamSubscriptions:n.map(iI),externalWatchTargetCount:o.length,externalWatchTargets:o},`gateway websocket client disconnected`),O.removeClient(a),l.removeClient(a),D.clearStatesForClient(a)})});let M=new BA({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(iI),externalWatchTargetCount:n.length,externalWatchTargets:n}},handlePairingClaim:async t=>{let n=he(t.deviceName);return FP(y,{...await s.claimPairingCode(t.code,n,t.deviceIdentity),gatewayName:e.name,machineName:Sm()},t.code,t.deviceIdentity)},handleRefresh:async t=>{let n=await AP({authService:s,execute:()=>s.refreshAccessToken(t.refreshToken),logger:r.log,refreshToken:t.refreshToken,requestedDeviceId:t.deviceId,source:`relay_http_forward`});return kP(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=uI({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 sf.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 sf.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)=>LP(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:aI}),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: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});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`:{nI(`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);nI(`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=XF(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`)=>aI({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=xw(t)?t.status:500;return xw(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=Hu.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=Vu.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=Na.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=Sm(),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},lI(pe,e.host,_e)),e.relayEnabled&&(_=new ej({gatewayId:e.gatewayId,machineName:e.name,relayUrl:e.relayUrl,relayTransportSecurityLevel:e.relayTransportSecurityLevel,relayGatewayAccessToken:e.relayGatewayAccessToken,resolveRelayGatewayAccessToken:e.relayGatewayAccessToken.trim()?void 0:()=>aj({gatewayId:e.gatewayId,relayUrl:e.relayUrl,gatewayIdentity:y.identity,privateKeyPem:y.privateKeyPem}),gatewayIdentity:y.identity,directBaseUrls:Fh({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 sI(e,t){let n=t;if(!e.httpsEnabled)return(0,mw.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:tI}});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,mw.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:tI},https:r})}function cI(e,t){let n=process.env.NODE_ENV!==`production`,r=hw.default.destination({dest:e.gatewayLogPath,mkdir:!0,sync:!1}),i=t.logToConsole?hw.default.multistream([{stream:r},{stream:process.stdout}]):r;return{instance:(0,hw.default)({level:n?`debug`:`info`},i),close:()=>{try{r.flushSync()}catch{}r.end()}}}function lI(e,t,n){return`desktop-gateway listening on ${e}://${t}:${n}`}function uI(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 dI(e){return e instanceof Error?e.stack??`${e.name}: ${e.message}`:(0,b.inspect)(e,{depth:6,breakLength:120})}async function fI(e){let t=await Nm({configPath:e.configPath,ensureConfigFile:!0});Rm(t.config);let n=await oI(t.config,{configPath:t.configPath,logToConsole:e.logToConsole,onUpdatePrepared:async e=>{mI({type:`worker.update.prepared`,payload:e})}});mI({type:`worker.ready`,payload:pI(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=hI(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: ${dI(e)}`),i(1)}),process.on(`unhandledRejection`,e=>{console.error(`[gateway] worker unhandled rejection: ${dI(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);mI({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);mI({type:`worker.response`,id:e.id,method:e.method,ok:!0,result:t});return}}}catch(t){mI({type:`worker.response`,id:e.id,method:e.method,ok:!1,error:String(t)})}}await new Promise(()=>{})}function pI(e){return{protocol:e.protocol,listenPort:e.listenPort,gatewayName:e.gatewayName,machineName:e.machineName,gatewayIdentity:e.gatewayIdentity,startupPairingCode:e.startupPairingCode}}function mI(e){process.send&&process.send(e)}function hI(e){if(!gI(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 gI(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}_I(process.argv.slice(2)).catch(e=>{console.error(String(e)),process.exit(1)});async function _I(e){let t=ee(e);switch(t.command){case`help`:SI();return;case`version`:console.log(z.version);return;case`init`:await yI(t);return;case`doctor`:await bI(t);return;case`start`:await vI(t);return;case`__worker`:await xI(t);return;default:{let e=t.command;throw Error(`Unsupported command: ${e}`)}}}async function vI(e){let t=await Nm({configPath:e.configPath,ensureConfigFile:!0});Rm(t.config);let n=await rh({configPath:t.configPath,configExists:t.configExists,config:t.config});try{await yg({args:e,loaded:t,doctorReport:n})}catch(e){throw Error(Og(e,t.config))}ih(n)&&console.warn(`[doctor] startup continued despite bundled runtime check failures.`)}async function yI(e){let t=await Mm({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 Nm({configPath:t.configPath,ensureConfigFile:!1}),r=await rh({configPath:n.configPath,configExists:n.configExists,config:n.config});console.log(ah(r))}async function bI(e){let t=await Nm({configPath:jm(e.configPath),ensureConfigFile:!1,syncGatewayIdentityConfig:!1}),n=await rh({configPath:t.configPath,configExists:t.configExists,config:t.configExists?t.config:void 0});console.log(ah(n)),ih(n)&&(process.exitCode=1)}async function xI(e){try{await fI(e)}catch(t){let n=await Nm({configPath:e.configPath,ensureConfigFile:!0});throw Error(Og(t,n.config))}}function SI(){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=_I;
527
+ `),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){if(this.hasPendingRawMutation(e))return;let t=this.compactedRawEventsCacheBySession.get(e);if(t)return aP(t);let n=this.rawEventsCacheBySession.get(e);if(!n)return;let r=iP(n);return this.compactedRawEventsCacheBySession.set(e,r),aP(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 QN(e){let t=e.projectPath?.trim()||e.projectId;return t===e.projectId?e:{...e,projectId:t}}function $N(e){return typeof e==`object`&&!!e}function eP(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<=0))return e}function tP(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 nP(e){if(e.length===0)return null;let t=e[0],n=e[e.length-1];return!t||!n?null:{min:t.rawSeq,max:n.rawSeq}}async function rP(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 iP(e){let t=Kp(e),n=t.map(e=>e),r=new Map;for(let[e,t]of n.entries()){let n=Yp(t);n&&r.set(n.key,e)}return{slots:n,indexByKey:r,dense:t}}function aP(e){return e.dense||=e.slots.filter(e=>e!==null),e.dense}function oP(e,t){let n=Yp(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=Xp(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 sP(e,t){let n=e.ts.localeCompare(t.ts);return n===0?e.eventId.localeCompare(t.eventId):n}function cP(e){if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.message)?t.message:{};return(typeof n.method==`string`?n.method:typeof t.method==`string`?t.method:``)===`item/completed`}function lP(e){if(cP(e)||e.type===`turn.completed`||e.type===`turn.failed`)return!0;if(e.type!==`native.raw`)return!1;let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(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 uP(e,t,n){if(n?.replaceMissing)return dP(e,t,n);let r=[...e].sort(hP),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&&fP(n,e)&&(r[t]=mP(n,e));continue}let n={...e,rawSeq:a};a+=1,i.set(n.eventId,r.length),r.push(n)}return gP(r.sort(hP)).sort(hP)}function dP(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(hP),c=1;for(let t of e)c=Math.max(c,t.rawSeq+1);return gP(s.map(e=>{let t=r.get(e.eventId);if(t)return fP(t,e)?mP(t,e):{...e,rawSeq:t.rawSeq};let n={...e,rawSeq:c};return c+=1,n})).sort(hP)}function fP(e,t){return pP(e)&&pP(t)}function pP(e){return e.type===`native.raw`?SP(($N(e.payload.raw)?e.payload.raw:{}).source)===`codex.history.thread_read`:!1}function mP(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function hP(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 gP(e){let t=Jp(e).filter(e=>!_P(e)),n=new Set;for(let e of t){let t=vP(e);t&&n.add(t)}return n.size===0?t:t.filter(e=>{let t=yP(e);return!t||!n.has(t)})}function _P(e){let t=$N(e.payload.raw)?e.payload.raw:{},n=SP(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=$N(t.message)?t.message:{};return SP(r.method)??SP(t.method)?!1:$N(($N(r.result)?r.result:{}).turn)}function vP(e){if(e.type===`item.completed`){let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.item)?t.item:{};return bP(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.message)?t.message:{},r=$N(n.params)?n.params:{};if((SP(n.method)??SP(t.method))!==`item/completed`)return null;let i=$N(r.item)?r.item:{};return bP(e.sessionId,i)}function yP(e){if(e.type===`item.updated`){let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.item)?t.item:{},r=SP(n.original_method)??SP(n.originalMethod)??``,i=$N(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`)&&!xP(r)?null:bP(e.sessionId,n)}if(e.type!==`native.raw`)return null;let t=$N(e.payload.raw)?e.payload.raw:{},n=$N(t.message)?t.message:{},r=$N(n.params)?n.params:{};if(!xP(SP(n.method)??SP(t.method)??``))return null;let i=$N(r.msg)?r.msg:{},a=SP(r.itemId)??SP(r.item_id)??SP(i.itemId)??SP(i.item_id);return a?`${e.sessionId}|${a}`:null}function bP(e,t){let n=SP(t.id)??SP(t.item_id)??SP(t.itemId);return n?`${e}|${n}`:null}function xP(e){return e.includes(`_delta`)||e.endsWith(`/delta`)||e.endsWith(`Delta`)||e.includes(`/delta/`)}function SP(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function CP(e){return!e||e.providerMode!==`native`?!1:e.interactionLockReason===`external_turn_running`?!0:e.status!==`running`}const wP=e=>e.filter(e=>!(e.kind===`system`&&e.title===`Turn Usage`)),TP=(e,t)=>e.find(e=>e.itemId===t||e.id===t)??null,EP=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,DP=e=>{let t=wP(mp(e.sessionId,e.rawEvents,[]));return{timelineItems:yo({rawEvents:e.rawEvents,messages:t,deferCompletedToolDetails:!1}).timelineItems,lastRawSeq:e.rawEvents[e.rawEvents.length-1]?.rawSeq??null}};async function OP(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=TP(DP({sessionId:e.sessionId,rawEvents:t}).timelineItems,e.itemId);return n?{item:n}:null}function kP(e,t){if(e&&e!==t)throw Ew()}async function AP(e){let t=jP(e.authService,e.refreshToken);e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:MP(t)},`auth refresh attempt`);try{let t=await e.execute(),n=jP(e.authService,e.refreshToken),r=jP(e.authService,t.refreshToken);return e.logger?.info?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshedDeviceId:t.deviceId,previousRefreshToken:MP(n),nextRefreshToken:MP(r)},`auth refresh succeeded`),t}catch(t){let n=jP(e.authService,e.refreshToken);throw e.logger?.warn?.({source:e.source,requestedDeviceId:e.requestedDeviceId??null,refreshToken:MP(n),error:NP(t)},`auth refresh failed`),t}}function jP(e,t){return e.inspectRefreshToken?.(t)??{tokenRecordState:`missing`}}function MP(e){return{claimDeviceId:e.claimDeviceId??null,claimExpAt:e.claimExpAt??null,claimIssuedAt:e.claimIssuedAt??null,claimJtiSuffix:PP(e.claimJti),claimType:e.claimType??null,latestActiveTokenCreatedAt:e.latestActiveTokenCreatedAt??null,latestActiveTokenJtiSuffix:PP(e.latestActiveTokenJti),tokenRecordCreatedAt:e.tokenRecordCreatedAt??null,tokenRecordDeviceId:e.tokenRecordDeviceId??null,tokenRecordRevokedAt:e.tokenRecordRevokedAt??null,tokenRecordState:e.tokenRecordState}}function NP(e){return xw(e)?{code:e.code,message:String(e),status:e.status}:e instanceof Error?{message:e.message,name:e.name}:{message:String(e)}}function PP(e){return e?e.slice(-8):null}function FP(e,t,n,r){if(!r)return t;let i={gatewayId:t.gatewayId,deviceId:t.deviceId,mobilePublicKey:r.publicKey,pairingContext:{pairingCode:IP(n),signedAt:new Date().toISOString()}};return{...t,gatewayIdentity:e.identity,pairingConfirmation:ym(e.identity,e.privateKeyPem,i)}}function IP(e){return e.replace(/\s+/gu,``).toUpperCase()}async function LP(e,t){try{let n=lf.parse(e);switch(n.method){case`auth.refresh`:{let e=await AP({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 kP(n.params.deviceId??t.relayDeviceId,e.deviceId),uf.parse({method:n.method,result:e})}case`projects.list`:{let e=await t.sessionManager.listProjects();return uf.parse({method:n.method,result:{projects:e}})}case`codex.accounts.get`:{let e=await t.sessionManager.getCodexAccounts();return uf.parse({method:n.method,result:e})}case`codex.accounts.save`:{let e=await t.sessionManager.saveCurrentCodexAccount();return uf.parse({method:n.method,result:e})}case`codex.accounts.switch`:{let e=await t.sessionManager.switchCodexAccount(n.params.accountId);return uf.parse({method:n.method,result:e})}case`gateway.settings.get`:return uf.parse({method:n.method,result:t.gatewaySettings.get()});case`gateway.settings.update`:{let e=await t.gatewaySettings.update(n.params);return uf.parse({method:n.method,result:e})}case`gateway.update.get`:{let e=await t.updateService.getOrCheckInfo(`mobile`);return uf.parse({method:n.method,result:e})}case`codex.appServer.restart`:{let e=await t.sessionManager.restartCodexAppServer();return uf.parse({method:n.method,result:e})}case`gateway.update.apply`:{let e=await t.updateService.applyUpdate(n.params.requestedBy??`mobile`);return uf.parse({method:n.method,result:e})}case`projects.discovery.get`:{let e=await t.projectDiscoveryService.getProjects();return uf.parse({method:n.method,result:e})}case`projects.discovery.refresh`:{let e=await t.projectDiscoveryService.refreshProjects();return uf.parse({method:n.method,result:e})}case`projects.create`:{let e=await t.sessionManager.createProject({path:n.params.path,title:n.params.title});return uf.parse({method:n.method,result:{project:e}})}case`projects.delete`:if(!await t.sessionManager.deleteProject(n.params.projectId))throw zP(n.method,`NOT_FOUND`,404,`Project not found`);return uf.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 uf.parse({method:n.method,result:e})}case`workspace.directories.create`:{let e=await t.fsService.createDirectoryUnrestricted(n.params.path,n.params.name,200);return uf.parse({method:n.method,result:e})}case`workspace.entries.list`:{let e=await t.workspaceFileService.listEntries(n.params.locator,n.params.limit??200);return uf.parse({method:n.method,result:e})}case`workspace.files.resolve`:{let e=await t.workspaceFileService.resolveFile(n.params.locator);return uf.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 uf.parse({method:n.method,result:e})}case`workspace.files.preparePreview`:{let e=t.relayPreviewBaseUrl?.trim(),r=t.gatewayId?.trim();if(!e||!r)throw zP(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 uf.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 uf.parse({method:n.method,result:{sessions:e}})}case`sessions.discovery.list`:{let e=await t.projectDiscoveryService.listProjectSessions(n.params.projectPath);return uf.parse({method:n.method,result:e})}case`sessions.get`:{let e=await t.sessionManager.getProjectSessionSummary(n.params.projectId,n.params.sessionId);if(!e)throw zP(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return uf.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 zP(n.method,`NOT_FOUND`,404,`Session ${n.params.sessionId} not found in project ${n.params.projectId}`);return uf.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}),uf.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 uf.parse({method:n.method,result:r})}case`sessions.readableItem.get`:{let e=await OP({sessionManager:t.sessionManager,readableItemDetailLookup:t.readableItemDetailLookup,projectId:n.params.projectId,sessionId:n.params.sessionId,itemId:n.params.itemId});if(!e)throw zP(n.method,`NOT_FOUND`,404,`Readable item ${n.params.itemId} not found`);return uf.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`),uf.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 uf.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 uf.parse({method:n.method,result:e})}case`devices.list`:return uf.parse({method:n.method,result:{devices:t.authService.listDevices()}});case`devices.revoke`:if(!await t.authService.revokeDevice(n.params.deviceId))throw zP(n.method,`NOT_FOUND`,404,`Device ${n.params.deviceId} not found`);return uf.parse({method:n.method,result:{revoked:!0}});default:{let e=n;throw zP(void 0,`INTERNAL`,500,`Unhandled relay RPC method: ${JSON.stringify(e)}`)}}}catch(e){throw RP(e)}}function RP(e){if(xw(e))switch(e.code){case`REFRESH_TOKEN_REVOKED`:case`DEVICE_REVOKED`:case`REFRESH_TOKEN_DEVICE_MISMATCH`:return zP(`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 zP(`NOT_FOUND`,e.status,String(e),e.details);case`SESSION_TURN_CONFLICT`:case`PROJECT_DELETE_CONFLICT`:case`CODEX_APP_SERVER_RESTART_CONFLICT`:return zP(`BAD_REQUEST`,e.status,String(e),e.details);default:return zP(e.status>=500?`INTERNAL`:`BAD_REQUEST`,e.status,String(e),e.details)}let t=ff.safeParse(e);if(t.success)return t.data;let n=df.safeParse(e);if(n.success)return zP(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 zP(t.code,t.status,t.message,t.details)}let r=String(e);return e instanceof Error&&e.name===`ZodError`?zP(`BAD_REQUEST`,400,r):BP(e)?zP(`UNAUTHORIZED`,401,r):VP(r)?zP(`BAD_REQUEST`,400,r):zP(`INTERNAL`,500,r)}function zP(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 ff.parse({...o?{method:o}:{},code:s,status:c,message:l,...u===void 0?{}:{details:u}})}function BP(e){return xw(e)&&(e.code===`REFRESH_TOKEN_REVOKED`||e.code===`DEVICE_REVOKED`||e.code===`REFRESH_TOKEN_DEVICE_MISMATCH`)||Vw(e)}function VP(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 HP(e,t){return e.length===0?[]:t===void 0?[...e]:e.filter(e=>e.rawSeq>t)}function UP(e){return{baseRawEvents:Kp(e.rawEvents.filter(t=>t.rawSeq<=e.cursorRawSeq)),nextRawEvents:Kp(e.rawEvents)}}function WP(e,t){return t&&`kind`in t&&t.kind===`bootstrapping`?t:{kind:`bootstrapping`,sessionId:e,previousReadyState:t??null,queuedEnvelopes:[]}}function GP(e,t){let n=e.previousReadyState;if(!n)return{previousReadyState:null,nextReadyState:null,replayedEnvelopes:[]};let r=HP(e.queuedEnvelopes,n.rawEvents[n.rawEvents.length-1]?.rawSeq),i=n;for(let e of r)i=t(i,e);return{previousReadyState:n,nextReadyState:i,replayedEnvelopes:r}}function KP(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_${yw(12)}`,ts:new Date().toISOString(),payload:{raw:{decision:e.decision,reason:e.reason,snapshotId:e.snapshotId,fromRawSeq:e.fromRawSeq,toRawSeq:e.toRawSeq}}}}function qP(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.timelineItems?{readable:{snapshotId:e.snapshotId,chunkIndex:e.chunkIndex,totalChunks:e.totalChunks,...e.timelineItems?{timelineItems:e.timelineItems}:{}}}:{}}}}function JP(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}}}}}function YP(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 XP(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_${yw(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 ZP(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 QP=1e3,$P=(e,t)=>`${e}::${t}`,eF=e=>e.purpose===`detail_view`&&e.bootstrapMode===`readable`,tF=e=>{let t=new Map;for(let n of e)t.set(n.sessionId,n);return[...t.values()]},nF=e=>({kind:`ready`,sessionId:e.target.sessionId,projectId:e.target.projectId,provider:e.target.provider,detailLevel:e.target.detailLevel,rawEvents:[...e.rawEvents],detailTransportRawEvents:[...e.detailTransportRawEvents??e.rawEvents],contextUsage:e.contextUsage??null,timelineItems:[...e.timelineItems],pendingApprovals:[...e.pendingApprovals],pendingUserInputs:[...e.pendingUserInputs]}),rF=e=>typeof e==`object`&&e?e:{},iF=(e,...t)=>{for(let n of t){let t=e[n];if(typeof t==`string`&&t.length>0)return t}},aF=e=>{if(!Array.isArray(e))return[];let t=[];for(let n of e){let e=rF(n),r=iF(e,`id`),i=iF(e,`header`),a=iF(e,`question`);if(!r||!i||!a)continue;let o=Array.isArray(e.options)?e.options.map(e=>{let t=rF(e),n=iF(t,`label`);if(!n)return null;let r=iF(t,`description`)??n,i=iF(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},oF=(e,t)=>{let n=pp(e,t),r=new Map,i=new Map;for(let e of n){if(e.type===`tool.permission.requested`){let t=rF(e.payload.raw),n=iF(t,`requestId`,`request_id`);if(!n)continue;let i=rF(t.rawParams??t.raw_params),a=rF(i.networkApprovalContext??i.network_approval_context);r.set(n,{requestId:n,sessionId:e.sessionId,...iF(t,`toolName`,`tool_name`)?{toolName:iF(t,`toolName`,`tool_name`)}:{},...iF(t,`reason`)?{reason:iF(t,`reason`)}:{},...iF(i,`command`)?{command:iF(i,`command`)}:{},...iF(i,`cwd`)?{cwd:iF(i,`cwd`)}:{},...iF(i,`grantRoot`,`grant_root`)?{grantRoot:iF(i,`grantRoot`,`grant_root`)}:{},...iF(a,`host`)?{networkHost:iF(a,`host`)}:{},...iF(a,`protocol`)?{networkProtocol:iF(a,`protocol`)}:{},...iF(t,`itemId`,`item_id`)?{itemId:iF(t,`itemId`,`item_id`)}:{},...iF(t,`turnId`,`turn_id`)?{turnId:iF(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`tool.permission.resolved`){let t=iF(rF(e.payload.raw),`requestId`,`request_id`);t&&r.delete(t);continue}if(e.type===`user.input.requested`){let t=rF(e.payload.raw),n=iF(t,`requestId`,`request_id`);if(!n)continue;i.set(n,{requestId:n,sessionId:e.sessionId,questions:aF(t.questions),...iF(t,`itemId`,`item_id`)?{itemId:iF(t,`itemId`,`item_id`)}:{},...iF(t,`turnId`,`turn_id`)?{turnId:iF(t,`turnId`,`turn_id`)}:{}});continue}if(e.type===`user.input.resolved`){let t=iF(rF(e.payload.raw),`requestId`,`request_id`);t&&i.delete(t)}}return{pendingApprovals:[...r.values()],pendingUserInputs:[...i.values()]}},sF=e=>{let t=e.rawEventsAlreadyMatchDetailTransport===!0?e.rawEvents:uF({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=e.target.purpose===`detail_view`?Fc({provider:e.target.provider,rawEvents:t}):null,r=e.target.purpose===`detail_view`?wP(mp(e.target.sessionId,t,[])):[],i=e.target.purpose===`detail_view`?yo({rawEvents:t,messages:r,deferCompletedToolDetails:!0}):{timelineItems:[],consumedMessageIds:[]},a=e.target.purpose===`detail_view`?oF(e.target.sessionId,t):{pendingApprovals:[],pendingUserInputs:[]};return{detailTransportRawEvents:t,contextUsage:n,timelineItems:i.timelineItems,pendingApprovals:a.pendingApprovals,pendingUserInputs:a.pendingUserInputs}},cF=e=>{let t=uF({rawEvents:e.rawEvents,detailLevel:e.target.detailLevel}),n=sF({target:e.target,rawEvents:t,rawEventsAlreadyMatchDetailTransport:!0});return nF({target:e.target,rawEvents:e.rawEvents,detailTransportRawEvents:t,contextUsage:n.contextUsage,timelineItems:n.timelineItems,pendingApprovals:n.pendingApprovals,pendingUserInputs:n.pendingUserInputs})},lF=(e,t)=>{let n=vF(e.rawEvents,t),r=uF({rawEvents:vF(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),i=sF({target:{sessionId:e.sessionId,provider:e.provider,detailLevel:e.detailLevel,purpose:`detail_view`},rawEvents:r,rawEventsAlreadyMatchDetailTransport:!0});return{...e,rawEvents:n,detailTransportRawEvents:r,contextUsage:i.contextUsage,timelineItems:i.timelineItems,pendingApprovals:i.pendingApprovals,pendingUserInputs:i.pendingUserInputs}},uF=e=>{if(e.detailLevel!==`compact`||e.rawEvents.length===0)return e.rawEvents;let t=dF(e.rawEvents[0]?.sessionId??``,e.rawEvents);return pE(e.rawEvents,e.detailLevel,{preserveIncompleteCommandOutput:!0,additionalCompletedCommandItemKeys:t})},dF=(e,t)=>{if(!e||t.length===0)return new Set;let n=new Set,r=mp(e,t,[]);for(let t of r){if(t.itemType!==`command_execution`||!t.itemId||t.status!==`completed`&&t.status!==`failed`)continue;let r=hF(e,t.itemId);r&&n.add(r)}return n},fF=e=>iF(e,`id`,`itemId`,`item_id`)??null,pF=e=>{if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`)return fF(rF(rF(e.payload.raw).item));if(e.type!==`native.raw`)return null;let t=rF(rF(e.payload.raw).message),n=rF(t.params),r=rF(n.item),i=rF(n.msg);return fF(r)??fF(rF(t.item))??iF(n,`itemId`,`item_id`)??iF(i,`itemId`,`item_id`)??null},mF=e=>{if(e.type===`item.completed`)return!0;if(e.type!==`native.raw`)return!1;let t=rF(e.payload.raw);return(iF(rF(t.message),`method`)??iF(t,`method`))===`item/completed`},hF=(e,t)=>t?`${e}|${t}`:null,gF=e=>hF(e.sessionId,pF(e)),_F=e=>{let t=gF(e);if(t)return`item:${t}`;let n=Yp(e);return n?`delta:${n.key}`:null},vF=(e,t)=>{let n=[...e],r=gF(t),i=_F(t),a=Yp(t),o=t;if(i&&a)for(let e=n.length-1;e>=0;--e){let r=n[e];if(!r||_F(r)!==i||!Yp(r))continue;let a=Xp(r,t);if(a){n[e]=null,o=a;break}}return n.push(o),!r||!mF(t)?n.filter(e=>e!==null):n.filter(e=>e!==null&&(e.eventId===o.eventId||gF(e)!==r||!Yp(e)))},yF=e=>{let t=bF(e);if(!t)return null;let n=fF(t),r=rF(t.payload),i=iF(t,`output_delta`,`outputDelta`)??iF(r,`output_delta`,`outputDelta`);return!n||!i?null:{itemId:n,delta:i}},bF=e=>{if(e.type===`item.updated`){let t=rF(rF(e.payload.raw).item);return xF(t)?t:null}if(e.type!==`native.raw`)return null;let t=rF(e.payload.raw),n=rF(t.message);if((iF(n,`method`)??iF(t,`method`))!==`item/updated`)return null;let r=rF(rF(n.params).item);return xF(r)?r:null},xF=e=>{let t=iF(e,`type`);return t===`commandExecution`||t===`command_execution`},SF=e=>e.includes(`[compact history preview:`),CF=(e,t)=>{let n=yF(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`||SF(i.output))return null;let a=vF(e.rawEvents,t),o=uF({rawEvents:vF(e.detailTransportRawEvents,t),detailLevel:e.detailLevel}),s={...i,output:`${i.output}${n.delta}`},c=[...e.timelineItems];c[r]=s;let l=a[a.length-1]?.rawSeq??t.rawSeq;return{nextState:{...e,rawEvents:a,detailTransportRawEvents:o,timelineItems:c},messageInput:{provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,fromRawSeq:e.rawEvents[e.rawEvents.length-1]?.rawSeq,toRawSeq:l,timelineUpserts:[],timelineRemovals:[],timelineTextDeltaPatches:[{id:i.id,field:`output`,delta:n.delta}]}}},wF=e=>Buffer.byteLength(JSON.stringify(JP(e)),`utf8`),TF=e=>{let t=Math.max(1,Math.floor(e.maxChunkBytes??524288)),n=[],r=(t,n)=>wF({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});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},EF=(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)}},DF=(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)}},OF=(e,t,n,r)=>{let i={},a=pp(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=iF(rF(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},kF=e=>e?{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:e.rawEvents[e.rawEvents.length-1]?.rawSeq??null,timelineItemCount:e.timelineItems.length,pendingApprovalCount:e.pendingApprovals.length,pendingUserInputCount:e.pendingUserInputs.length,hasContextUsage:!!e.contextUsage}:{stateFound:!1},AF=e=>e?e.kind===`ready`?kF(e):{stateFound:!0,kind:e.kind,sessionId:e.sessionId,queuedEnvelopeCount:e.queuedEnvelopes.length,previousReadyState:kF(e.previousReadyState)}:{stateFound:!1},jF=(e,t)=>{let n,r,i;try{n=Ys(e.previousState.timelineItems,e.nextState.timelineItems),r=EF(e.previousState.pendingApprovals,e.nextState.pendingApprovals),i=DF(e.previousState.pendingUserInputs,e.nextState.pendingUserInputs)}catch(n){throw t?.(`stream.readable.delta.build.error`,{sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,previousState:kF(e.previousState),nextState:kF(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=e.nextState.rawEvents[e.nextState.rawEvents.length-1]?.rawSeq;return o===void 0?null:{provider:e.previousState.provider,sessionId:e.previousState.sessionId,projectId:e.previousState.projectId,fromRawSeq:e.previousState.rawEvents[e.previousState.rawEvents.length-1]?.rawSeq,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 MF(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}}var NF=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=tF(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 eF(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=$P(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:AF(r),hadPendingDelta:!!i,pendingDeltaFromRawSeq:i?.previousState.rawEvents[i.previousState.rawEvents.length-1]?.rawSeq??null,pendingDeltaToRawSeq:i?.nextState.rawEvents[i.nextState.rawEvents.length-1]?.rawSeq??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?TP(t.timelineItems,e.itemId):null,r=n&&`deferredDetail`in n&&n.deferredDetail!==void 0;if(n&&!r){let r=EP(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?.rawEvents[t.rawEvents.length-1]?.rawSeq??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=DP({sessionId:e.sessionId,rawEvents:a}),s=this.seedReadableItemDetailCache({projectId:e.projectId,sessionId:e.sessionId,timelineItems:o.timelineItems}),c=TP(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(!eF(r))continue;let t=$P(n,e.sessionId),i=this.stateByClientSession.get(t);if(!i)continue;if(i.kind===`bootstrapping`){i.queuedEnvelopes.push(e);continue}let a=CF(i,e);if(a){this.flushPendingReadableLiveDelta(n,e.sessionId),this.stateByClientSession.set(t,a.nextState),this.sessionHub.sendSessionMessageToClient(n,e.sessionId,YP(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=lF(i,e);this.stateByClientSession.set(t,o);let s=OF(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 eF(r)&&this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:n,sessionId:e.sessionId}),t}finally{this.sessionHub.resumeSession(n,e.sessionId)}}}};sendSessionSnapshot=async(e,t,n)=>{let r=`snap_${yw(12)}`,{compactedRawEvents:i,detailTransportRawEvents:a,lastRawSeq:o,slimReadableProjection:s,pendingApprovals:c,pendingUserInputs:l}=await this.buildReadableSnapshotProjection(t);this.sessionHub.sendStreamMessage(e,KP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,...o===void 0?{}:{toRawSeq:o}}));let u=ZP(a,QP),d=t.purpose===`detail_view`?ZP(s.timelineItems,QP):[],f=t.purpose===`detail_view`?`raw+readable`:`raw`,p=Math.max(u.length,d.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:f,compactedEventCount:i.length,detailTransportEventCount:a.length,readableTimelineItemCount:s.timelineItems.length,totalChunks:p,firstRawSeq:a[0]?.rawSeq??null,lastRawSeq:o??null});for(let n=0;n<p;n+=1){let i=u[n]??[],a=d[n]??[];this.sessionHub.sendStreamMessage(e,qP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,chunkIndex:n,totalChunks:p,events:i,timelineItems:t.purpose===`detail_view`?a:void 0}))}};sendSessionReadableSnapshot=async(e,t,n)=>{let r=`snap_${yw(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||!eF(f)||p&&p!==t.projectId||(f.detailLevel??`full`)!==t.detailLevel){this.clearState(e,t.sessionId);return}let m=nF({target:t,rawEvents:a,detailTransportRawEvents:o,contextUsage:s,timelineItems:l.timelineItems,pendingApprovals:u,pendingUserInputs:d}),h=this.stateByClientSession.get(i),g=HP(h?.kind===`bootstrapping`?h.queuedEnvelopes:[],c);for(let e of g)m=lF(m,e);this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:m.rawEvents,detailTransportRawEvents:m.detailTransportRawEvents,contextUsage:m.contextUsage,timelineItems:m.timelineItems,pendingApprovals:m.pendingApprovals,pendingUserInputs:m.pendingUserInputs});let _=m.rawEvents[m.rawEvents.length-1]?.rawSeq;this.sessionHub.sendStreamMessage(e,KP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`snapshot`,reason:n,snapshotId:r,..._===void 0?{}:{toRawSeq:_}}));let v=TF({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,timelineItems:m.timelineItems,pendingApprovals:m.pendingApprovals,pendingUserInputs:m.pendingUserInputs,contextUsage:m.contextUsage}),y=Math.max(v.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:m.rawEvents.length,detailTransportRawEventCount:m.detailTransportRawEvents.length,readableTimelineItemCount:m.timelineItems.length,bufferedReadableDeltaCount:g.length,readableChunkTargetBytes:524288,readableChunkItemCounts:v.map(e=>e.timelineItems.length),readableChunkEstimatedBytes:v.map(e=>e.estimatedByteLength),totalChunks:y,firstRawSeq:m.rawEvents[0]?.rawSeq??null,lastRawSeq:_??null});for(let n=0;n<y;n+=1){let i=v[n];this.sessionHub.sendStreamMessage(e,JP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,snapshotId:r,chunkIndex:n,totalChunks:y,timelineItems:i?.timelineItems??[],pendingApprovals:n===0?m.pendingApprovals:void 0,pendingUserInputs:n===0?m.pendingUserInputs:void 0,contextUsage:n===0?m.contextUsage:void 0}))}}catch(n){throw this.restoreReadableLiveProjectionAfterBootstrapFailure({clientId:e,sessionId:t.sessionId}),n}};sendSessionReadableResumeDelta=async(e,t,n,r)=>{let i=$P(e,t.sessionId),a=await this.sessionManager.getProjectSessionRawEvents(t.projectId,t.sessionId,2**53-1),{baseRawEvents:o,nextRawEvents:s}=UP({rawEvents:a,cursorRawSeq:n}),c=cF({target:t,rawEvents:o}),l=cF({target:t,rawEvents:s}),u=this.stateByClientSession.get(i),d=HP(u?.kind===`bootstrapping`?u.queuedEnvelopes:[],l.rawEvents[l.rawEvents.length-1]?.rawSeq);for(let e of d)l=lF(l,e);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:a.length,baseRawEventCount:o.length,nextRawEventCount:s.length,bootstrapState:AF(u),bufferedEnvelopeCount:d.length,previousState:kF(c),nextState:kF(l)}),this.seedReadableLiveProjectionState({clientId:e,target:t,rawEvents:l.rawEvents,detailTransportRawEvents:l.detailTransportRawEvents,contextUsage:l.contextUsage,timelineItems:l.timelineItems,pendingApprovals:l.pendingApprovals,pendingUserInputs:l.pendingUserInputs});let f=l.rawEvents[l.rawEvents.length-1]?.rawSeq??n;this.sessionHub.sendStreamMessage(e,KP({provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,decision:`delta`,reason:r,fromRawSeq:n,...f===void 0?{}:{toRawSeq:f}}));let p=jF({previousState:c,nextState:l},this.log);this.log(`stream.readable.resume.delta`,{clientId:e,sessionId:t.sessionId,projectId:t.projectId,reason:r,cursorRawSeq:n,emittedDelta:!!p,deltaFromRawSeq:p?.fromRawSeq??n,deltaToRawSeq:p?.toRawSeq??f??null,timelineUpsertCount:p?.timelineUpserts.length??0,timelineRemovalCount:p?.timelineRemovals.length??0,timelineTextDeltaPatchCount:p?.timelineTextDeltaPatches.length??0,pendingApprovalUpsertCount:p?.pendingApprovalUpserts.length??0,pendingUserInputUpsertCount:p?.pendingUserInputUpserts.length??0}),this.sessionHub.sendSessionMessageToClient(e,t.sessionId,YP(p??{provider:t.provider,sessionId:t.sessionId,projectId:t.projectId,fromRawSeq:n,toRawSeq:f,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=EP(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=i.rawEvents[i.rawEvents.length-1]?.rawSeq??-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(eF).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)eF(t)||this.clearState(e,t.sessionId)}startReadableLiveProjectionBootstrap(e){let t=$P(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=WP(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:AF(n),clearedPendingDelta:!!r,carriedPendingEnvelopeCount:a.length}),t}getReadableDeliveredReadyState(e,t){let n=$P(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?HP(t.nextState.rawEvents,e?.rawEvents[e.rawEvents.length-1]?.rawSeq):[]}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=n.rawEvents[n.rawEvents.length-1]?.rawSeq;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=nF(e);this.stateByClientSession.set($P(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:kF(t)})}primeReadableBootstrapForSubscriptions(e,t){for(let n of t)eF(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,KP({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 Aw(n,t);let i={sessionId:t,projectId:n,provider:r.provider,status:r.status,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:MF(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`,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:MF(i)}),a}async buildReadableSnapshotProjection(e){let t=await this.sessionManager.getProjectSessionRawEventsCompacted(e.projectId,e.sessionId,2**53-1),n=uF({rawEvents:t,detailLevel:e.detailLevel}),r=sF({target:e,rawEvents:n,rawEventsAlreadyMatchDetailTransport:!0}),i=t[t.length-1]?.rawSeq;return{compactedRawEvents:t,detailTransportRawEvents:n,contextUsage:r.contextUsage,lastRawSeq:i,slimReadableProjection:{timelineItems:r.timelineItems,consumedMessageIds:[]},pendingApprovals:r.pendingApprovals,pendingUserInputs:r.pendingUserInputs}}restoreReadableLiveProjectionAfterBootstrapFailure(e){let t=$P(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=GP(n,lF);if(!a.previousReadyState||!r||!eF(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:AF(n),currentSubscriptionFound:!!r,currentSubscriptionProjectId:i||null,currentSubscriptionDetailLevel:r?.detailLevel??null,previousReadyState:kF(a.previousReadyState),nextReadyState:kF(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:kF(a.nextReadyState)});return}let o,s=a.previousReadyState;for(let t of a.replayedEnvelopes){let n=lF(s,t),r=OF(e.sessionId,t,s,n);r&&(o={...o??{},...r}),s=n}let c=jF({previousState:a.previousReadyState,nextState:a.nextReadyState,sessionSummary:o},this.log);if(!c){this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:kF(a.nextReadyState),emittedDelta:!1});return}this.log(`readable.bootstrap.recovered`,{clientId:e.clientId,sessionId:e.sessionId,replayedEnvelopeCount:a.replayedEnvelopes.length,nextReadyState:kF(a.nextReadyState),emittedDelta:!0,deltaFromRawSeq:c.fromRawSeq??null,deltaToRawSeq:c.toRawSeq}),this.sessionHub.sendSessionMessageToClient(e.clientId,a.previousReadyState.sessionId,YP(c))}sendReadableLiveDeltaNow(e){let t=jF({previousState:e.previousState,nextState:e.nextState,sessionSummary:e.sessionSummary},this.log);t&&this.sessionHub.sendSessionMessageToClient(e.clientId,e.previousState.sessionId,YP(t))}flushPendingReadableLiveDelta(e,t){let n=$P(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=$P(e.clientId,e.previousState.sessionId),n=this.pendingDeltaByClientSession.get(t);if(n){let t=PF({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 PF(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 FF(e){return e.sendProviderRaw?`relay_ws`:`direct_ws`}function IF(e){let t=performance.now(),n=JSON.stringify(e);return{payload:n,byteLength:Buffer.byteLength(n),serializeDurationMs:Number((performance.now()-t).toFixed(3))}}function LF(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 RF=class{clients=new Map;clientIdsBySessionId=new Map;deliveryStateByClientSession=new Map;addClient(e,t){let n=`ws_${yw(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??IF(t),i=LF(t);return i&&LA(`stream.snapshot.chunk.outbound`,{clientId:e.id,deviceId:e.deviceId,transport:FF(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 zF=1200,BF=process.env.NATIVE_SESSION_WATCH_DEBUG===`1`||process.env.EXPO_PUBLIC_NATIVE_SESSION_WATCH_DEBUG===`1`;var VF=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){BF&&(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,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,!CP(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=HF(i.session);if(i.historyUpdated||i.statusChanged||UF(t)&&WF(l)){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)}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:zF,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`)},zF))))}stateKey(e,t){return JSON.stringify([e,t])}};function HF(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 UF(e){return e===`lease_added`||e===`watch`||e===`watch_catchup`}function WF(e){return!!(e&&Object.prototype.hasOwnProperty.call(e,`model`)||e?.sessionTurnConfig||e?.sessionTurnConfigUpdatedAt)}var GF=class{constructor(e){this.config=e}issue(e){let t=KF(e.sizeBytes??0),n=uw.default.sign({sub:e.deviceId,type:`workspace_preview`,gatewayId:this.config.gatewayId,path:e.canonicalPath,disposition:e.disposition},this.config.accessSecret,{expiresIn:t}),r=uw.default.decode(n);return{ticket:n,expiresAt:r?.exp?new Date(r.exp*1e3).toISOString():new Date().toISOString()}}getExpiresAt(e){let t=uw.default.decode(e);return t?.exp?new Date(t.exp*1e3).toISOString():new Date().toISOString()}verify(e){let t;try{t=uw.default.verify(e,this.config.accessSecret)}catch(e){if(e instanceof Error){if(e.name===`TokenExpiredError`)throw Ow();if(e.name===`JsonWebTokenError`||e.name===`NotBeforeError`)throw Dw()}throw e}if(t.type!==`workspace_preview`||t.gatewayId!==this.config.gatewayId)throw Dw();return t}};function KF(e){return e>20971520?7200:600}var qF=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:YF(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:YF(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=JF(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=JF(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 kw(e);return t}};function JF(e){return e.split(p.default.sep).join(`/`)}function YF(e,t){return`${e}; filename="${t.replace(/["\\]/g,`_`)}"`}function XF(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 ZF=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;let QF=null;const $F={perMessageDeflate:{threshold:1024}},eI={globalDecompression:!1,threshold:1024,customTypes:/^text\/(?!event-stream)|(?:\+|\/)json(?:;|$)|(?:\+|\/)text(?:;|$)|(?:\+|\/)xml(?:;|$)/u},tI=4096;function nI(e,t){ZF&&(console.log(`[native-watch][gateway]`,e,t),QF?.info({event:e,...t},`native session watch debug`))}function rI(e){return e?typeof e==`string`?e:e.toString(`utf8`):``}function iI(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 aI(e){let t=e.limit??300,n=e.detailLevel??`full`,r=(r,i)=>{LA(`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:pE(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:pE(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:pE(o,n)};return r(s,{rangeMin:i.min,rangeMax:i.max,minExpectedCursor:a}),s}async function oI(e,t={}){await Dg(e.gatewayLogPath);let n=cI(e,t),r=sI(e,n.instance);IA(r.log),QF=r.log,await r.register(fw.default,{origin:!0}),await r.register(pw.default,eI),await r.register(dw.default,{options:$F});let i=process.env.NODE_ENV!==`production`,a=4e3,o=`[unserializable payload]`,s=new Hw(e);await s.init();let c=new Qw(e.auditLogPath),l=new RF,u=new RT,d=new FE(e.projectStoreDir),f=new ZN(e.sessionHistoryDir);await f.init();let m=new SA(p.default.join(e.sessionHistoryDir,`discovery-v1`));await m.init();let h=new lA({store:m});await h.init();let g,_=null,v=new Map,y=await gm(e.authStoreDir),b=new GF(e),x=e.relayEnabled?Lh({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 PM({preferNativeProviders:e.enableNativeProviders,requireNativeCodex:e.requireNativeCodex,auditLogger:c,projectStore:d,historyStore:f,logger:r.log,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 qF({fsService:u,sessionManager:T,previewTicketService:b}),D=new NF(l,T,e.readableLiveDeltaCoalesceMs,LA),O=new VF({sessionManager:T,logger:r.log,sendStreamMessage:(e,t)=>{l.sendStreamMessage(e,t)},createExternalUpdateMessage:e=>XP(e),refreshDetailSessionSnapshots:e=>D.refreshDetailSessionSnapshots(e)});T.warmStartupProviderCapabilities().catch(e=>{r.log.warn({err:e},`startup provider capability warmup failed`)});let k=new Kh({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{IA(null),QF=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:Sm(),gatewayIdentity:y.identity})),r.get(`/api/pairing/descriptor`,async()=>kh({gatewayId:e.gatewayId,gatewayName:e.name,machineName:Sm(),relayBaseUrl:x,directBaseUrls:Fh({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=_l.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}}),FP(y,{...n,gatewayName:e.name,machineName:Sm()},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=bl.safeParse(e.body);if(!n.success)return t.code(400).send({error:`Invalid request`,detail:n.error.flatten()});try{return await AP({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=()=>ud.parse({name:e.name,machineName:Sm()}),j=async n=>{let r=ud.pick({name:!0}).parse(n);if(!t.configPath)throw Error(`Gateway config path is unavailable`);return e.name=await Lm(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=ud.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=Fu.safeParse(n?.requestedBy);try{let e=await k.applyUpdate(r.success?r.data:`mobile`);return Bu.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 kl.parse(await T.restartCodexAppServer())}catch(e){let n=xw(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 El.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 Dl.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 Ol.parse(await T.switchCodexAccount(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 xw(e)&&e.code===`DISCOVERED_PROJECT_NOT_FOUND`?t.code(e.status).send({error:String(e)}):VP(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=Vu.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=Zu.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 xw(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=Na.safeParse(n.provider);if(!r.success)return t.code(400).send({error:`Invalid provider`});let i=za.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 xw(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 xw(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 xw(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=hc.safeParse(r.detailLevel).success?hc.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 xw(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 OP({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 xw(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(kc(e),i.sub,a)}catch(e){await F({deviceId:i.sub,clientId:a,rawCommand: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:rI(t),streamSubscriptionCount:n.length,streamSubscriptions:n.map(iI),externalWatchTargetCount:o.length,externalWatchTargets:o},`gateway websocket client disconnected`),O.removeClient(a),l.removeClient(a),D.clearStatesForClient(a)})});let M=new BA({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(iI),externalWatchTargetCount:n.length,externalWatchTargets:n}},handlePairingClaim:async t=>{let n=he(t.deviceName);return FP(y,{...await s.claimPairingCode(t.code,n,t.deviceIdentity),gatewayName:e.name,machineName:Sm()},t.code,t.deviceIdentity)},handleRefresh:async t=>{let n=await AP({authService:s,execute:()=>s.refreshAccessToken(t.refreshToken),logger:r.log,refreshToken:t.refreshToken,requestedDeviceId:t.deviceId,source:`relay_http_forward`});return kP(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=uI({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 sf.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 sf.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)=>LP(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:aI}),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: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});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`:{nI(`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);nI(`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=XF(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`)=>aI({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=xw(t)?t.status:500;return xw(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=Hu.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=Vu.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=Na.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=Sm(),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},lI(pe,e.host,_e)),e.relayEnabled&&(_=new ej({gatewayId:e.gatewayId,machineName:e.name,relayUrl:e.relayUrl,relayTransportSecurityLevel:e.relayTransportSecurityLevel,relayGatewayAccessToken:e.relayGatewayAccessToken,resolveRelayGatewayAccessToken:e.relayGatewayAccessToken.trim()?void 0:()=>aj({gatewayId:e.gatewayId,relayUrl:e.relayUrl,gatewayIdentity:y.identity,privateKeyPem:y.privateKeyPem}),gatewayIdentity:y.identity,directBaseUrls:Fh({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 sI(e,t){let n=t;if(!e.httpsEnabled)return(0,mw.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:tI}});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,mw.default)({disableRequestLogging:!0,loggerInstance:n,routerOptions:{maxParamLength:tI},https:r})}function cI(e,t){let n=process.env.NODE_ENV!==`production`,r=hw.default.destination({dest:e.gatewayLogPath,mkdir:!0,sync:!1}),i=t.logToConsole?hw.default.multistream([{stream:r},{stream:process.stdout}]):r;return{instance:(0,hw.default)({level:n?`debug`:`info`},i),close:()=>{try{r.flushSync()}catch{}r.end()}}}function lI(e,t,n){return`desktop-gateway listening on ${e}://${t}:${n}`}function uI(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 dI(e){return e instanceof Error?e.stack??`${e.name}: ${e.message}`:(0,b.inspect)(e,{depth:6,breakLength:120})}async function fI(e){let t=await Nm({configPath:e.configPath,ensureConfigFile:!0});Rm(t.config);let n=await oI(t.config,{configPath:t.configPath,logToConsole:e.logToConsole,onUpdatePrepared:async e=>{mI({type:`worker.update.prepared`,payload:e})}});mI({type:`worker.ready`,payload:pI(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=hI(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: ${dI(e)}`),i(1)}),process.on(`unhandledRejection`,e=>{console.error(`[gateway] worker unhandled rejection: ${dI(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);mI({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);mI({type:`worker.response`,id:e.id,method:e.method,ok:!0,result:t});return}}}catch(t){mI({type:`worker.response`,id:e.id,method:e.method,ok:!1,error:String(t)})}}await new Promise(()=>{})}function pI(e){return{protocol:e.protocol,listenPort:e.listenPort,gatewayName:e.gatewayName,machineName:e.machineName,gatewayIdentity:e.gatewayIdentity,startupPairingCode:e.startupPairingCode}}function mI(e){process.send&&process.send(e)}function hI(e){if(!gI(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 gI(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}_I(process.argv.slice(2)).catch(e=>{console.error(String(e)),process.exit(1)});async function _I(e){let t=ee(e);switch(t.command){case`help`:SI();return;case`version`:console.log(z.version);return;case`init`:await yI(t);return;case`doctor`:await bI(t);return;case`start`:await vI(t);return;case`__worker`:await xI(t);return;default:{let e=t.command;throw Error(`Unsupported command: ${e}`)}}}async function vI(e){let t=await Nm({configPath:e.configPath,ensureConfigFile:!0});Rm(t.config);let n=await rh({configPath:t.configPath,configExists:t.configExists,config:t.config});try{await yg({args:e,loaded:t,doctorReport:n})}catch(e){throw Error(Og(e,t.config))}ih(n)&&console.warn(`[doctor] startup continued despite bundled runtime check failures.`)}async function yI(e){let t=await Mm({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 Nm({configPath:t.configPath,ensureConfigFile:!1}),r=await rh({configPath:n.configPath,configExists:n.configExists,config:n.config});console.log(ah(r))}async function bI(e){let t=await Nm({configPath:jm(e.configPath),ensureConfigFile:!1,syncGatewayIdentityConfig:!1}),n=await rh({configPath:t.configPath,configExists:t.configExists,config:t.configExists?t.config:void 0});console.log(ah(n)),ih(n)&&(process.exitCode=1)}async function xI(e){try{await fI(e)}catch(t){let n=await Nm({configPath:e.configPath,ensureConfigFile:!0});throw Error(Og(t,n.config))}}function SI(){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=_I;