craby-gateway 0.23.2 → 0.23.4

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.23.2`,description:`Craby desktop gateway CLI`,type:`module`,bin:{"craby-gateway":`dist-sea/gateway.cjs`},files:[`dist-sea`,`README.md`],publishConfig:{access:`public`,registry:`https://registry.npmjs.org/`},engines:{node:`>=20`},repository:{type:`git`,url:`git+https://github.com/wuyongzhi/anycoding.git`,directory:`apps/desktop-gateway`},scripts:{dev:`GATEWAY_PORT=18787 GATEWAY_HTTPS_PORT=18787 GATEWAY_AUDIT_LOG_PATH=./logs/audit.log GATEWAY_LOG_PATH=./logs/gateway.log GATEWAY_SESSION_HISTORY_DIR=./logs/sessions-v2 GATEWAY_PROJECT_STORE_DIR=./logs/projects GATEWAY_AUTH_STORE_DIR=./logs/auth tsx watch src/index.ts --config ./logs/gateway.dev.yaml`,build:`tsup src/index.ts --format esm --dts`,"build: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.23.4`,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
  `)?`
@@ -121,7 +121,7 @@ function ii(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.construc
121
121
  `).trim();return t.length>0?t:void 0}var to=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]),no=/^(Recalled \d+ memory|Searched for \d+ patterns|Read [^:\n]+|已浏览 \d+ 个文件|已编辑 .+ \+\d+ -\d+)/i,ro=/^<(command-name|command-message|command-args|local-command-stdout|local-command-caveat|bash-input|bash-stdout|bash-stderr)>([\s\S]*?)<\/\1>\s*/i,io=/\u001B\[[0-?]*[ -/]*[@-~]/g,ao=X([`streaming`,`waiting_approval`,`waiting_input`,`failed`]),oo=X([`neutral`,`accent`,`success`,`warning`,`error`]),so=J({id:K().min(1),ts:K().datetime(),status:ao.optional(),itemId:K().min(1).optional(),turnId:K().min(1).optional(),requestId:K().min(1).optional(),sourceMessageId:K().min(1).optional()}),co=Qn(K()),lo=J({label:K().min(1),body:K()}),uo=J({id:K().min(1),header:K().min(1),question:K().min(1),answers:co}),fo=J({requestId:K().min(1),sessionId:K().min(1),toolName:K().min(1).optional(),reason:K().min(1).optional(),command:K().min(1).optional(),cwd:K().min(1).optional(),grantRoot:K().min(1).optional(),networkHost:K().min(1).optional(),networkProtocol:K().min(1).optional(),itemId:K().min(1).optional(),turnId:K().min(1).optional()}),po=J({label:K().min(1),description:K().min(1),markdown:K().min(1).optional()}),mo=J({id:K().min(1),header:K().min(1),question:K().min(1),multiSelect:Xn(),isOther:Xn(),isSecret:Xn(),options:Qn(po).nullable()}),ho=J({requestId:K().min(1),sessionId:K().min(1),questions:Qn(mo),itemId:K().min(1).optional(),turnId:K().min(1).optional()}),go=er(`kind`,[so.extend({kind:Y(`user_prompt`),text:K().min(1),hiddenPromptTitle:K().min(1).optional(),hiddenPromptSummary:K().min(1).optional(),hiddenPromptText:K().min(1).optional()}),so.extend({kind:Y(`agent_commentary`),text:K().min(1),details:co}),so.extend({kind:Y(`activity_summary`),text:K().min(1),tone:oo,details:co,isTransientStatus:Y(!0).optional()}),so.extend({kind:Y(`tool_card`),title:K().min(1),statusLabel:K().min(1),compactText:K().min(1).optional(),sections:Qn(lo),details:co}),so.extend({kind:Y(`command_strip`),command:K().min(1),label:K().min(1).optional(),args:K().min(1).optional(),output:K().min(1).optional()}),so.extend({kind:Y(`file_change_card`),title:K().min(1),filePath:K().min(1),addedLines:q().int().nonnegative(),removedLines:q().int().nonnegative(),hasLineCounts:Xn().optional(),summary:K().min(1).optional(),details:co,patchPreview:K().min(1).optional()}),so.extend({kind:Y(`terminal_card`),title:K().min(1),statusLabel:K().min(1),toolName:K().min(1),command:K().min(1).optional(),compactText:K().min(1).optional(),output:K(),details:co}),so.extend({kind:Y(`approval_card`),title:K().min(1),text:K().min(1).optional(),details:co}),so.extend({kind:Y(`question_card`),title:K().min(1),text:K().min(1).optional(),details:co}),so.extend({kind:Y(`question_answer_card`),title:K().min(1),summaryText:K().min(1),entries:Qn(uo)}),so.extend({kind:Y(`review_finding_card`),title:K().min(1),body:K().min(1),priorityLabel:X([`P0`,`P1`,`P2`,`P3`]).optional(),confidenceScore:q().min(0).max(1).optional(),filePath:K().min(1).optional(),lineStart:q().int().positive().optional(),lineEnd:q().int().positive().optional()})]);function _o(e){let t=Ho(e.rawEvents),n=Uo(e.rawEvents,e.messages),r=[];for(let i of e.messages){if(vo(r,i)||yo(r,i,n))continue;let e=bo(i,i.itemId?t.get(i.itemId):void 0);e&&r.push(e)}r.push(...Oo(e.rawEvents)),r.push(...ko(e.rawEvents,r));let i=[...new Set(r.flatMap(e=>e.sourceMessageIds))];return{timelineItems:Ao([...r].sort(jo)).map(({item:e,sourceMessageIds:t})=>({...e,...t.length===1?{sourceMessageId:t[0]}:{}})),consumedMessageIds:i}}function vo(e,t){if(t.provider!==`claude`||t.kind!==`user`)return!1;let n=hs(t.text);if(!n||!n.startsWith(`<`)||!n.endsWith(`>`))return!1;let r=_s(n);return r?r.kind===`ignored_meta`?!0:r.kind===`command_output`?(e.push({item:{...No(t),kind:`activity_summary`,text:r.output,tone:`neutral`,details:[]},sourceMessageIds:[t.id]}),!0):(e.push({item:{...No(t),kind:`user_prompt`,text:r.command},sourceMessageIds:[t.id]}),r.output&&e.push({item:{...Po(`${t.id}:output`,t.ts,t.status),kind:`activity_summary`,text:r.output,tone:`neutral`,details:[]},sourceMessageIds:[t.id]}),!0):!1}function yo(e,t,n){if(t.provider!==`codex`)return!1;if(t.kind===`user`){let n=Ja(t.text);return n?(e.push({item:{...No(t),kind:`user_prompt`,text:n.text,hiddenPromptTitle:n.hiddenPromptTitle,hiddenPromptSummary:n.hiddenPromptSummary,hiddenPromptText:n.hiddenPromptText},sourceMessageIds:[t.id]}),!0):!1}if(t.kind!==`assistant`||!t.turnId||!n.has(t.turnId))return!1;let r=Io(t.text);return r?r.findings.length===0?(e.push({item:{...No(t),kind:`activity_summary`,text:zo(r),tone:`neutral`,details:[]},sourceMessageIds:[t.id]}),!0):(r.findings.forEach((n,r)=>{e.push({item:{...Po(`${t.id}:review:${r}`,t.ts,t.status,{itemId:t.itemId,turnId:t.turnId,requestId:t.requestId}),kind:`review_finding_card`,title:n.title,body:n.body,...n.priorityLabel?{priorityLabel:n.priorityLabel}:{},...typeof n.confidenceScore==`number`?{confidenceScore:n.confidenceScore}:{},...n.filePath?{filePath:n.filePath}:{},...typeof n.lineStart==`number`?{lineStart:n.lineStart}:{},...typeof n.lineEnd==`number`?{lineEnd:n.lineEnd}:{}},sourceMessageIds:[t.id]})}),!0):!1}function bo(e,t){if(xo(e))return null;if(e.itemType===`tool_status`&&e.status===`waiting_approval`)return{item:{...No(e),kind:`approval_card`,title:e.title||`需要审批`,...hs(e.text)?{text:hs(e.text)}:{},details:[...e.details]},sourceMessageIds:[e.id]};if(e.itemType===`request_user_input`)return e.status===`completed`||e.status===`failed`?To(e):{item:{...No(e),kind:`question_card`,title:e.title||`请回答问题`,...hs(e.text)?{text:hs(e.text)}:{},details:[...e.details]},sourceMessageIds:[e.id]};if(e.kind===`user`){let t=hs(e.text);return t?{item:{...No(e),kind:`user_prompt`,text:t},sourceMessageIds:[e.id]}:null}if(e.kind===`assistant`)return So(e);if(e.kind===`reasoning`)return e.status===`streaming`?{item:{...No(e),kind:`activity_summary`,text:`正在思考`,tone:`neutral`,details:[],isTransientStatus:!0},sourceMessageIds:[e.id]}:null;if(e.kind===`tool`)return Co(e,t);if(e.kind===`error`){let t=hs(e.text)??`执行失败`;return{item:{...No(e),kind:`agent_commentary`,text:t,details:[...e.details]},sourceMessageIds:[e.id]}}let n=hs(e.text);return!n&&e.details.length===0?null:{item:{...No(e),kind:`agent_commentary`,text:n??e.details.join(`
122
122
  `),details:[...e.details]},sourceMessageIds:[e.id]}}function xo(e){return e.kind===`system`&&e.title===`Turn Usage`}function So(e){let t=hs(e.text);return!t&&e.details.length===0?null:t&&Ss(t)?{item:{...No(e),kind:`activity_summary`,text:t,tone:Cs(e.status),details:[...e.details]},sourceMessageIds:[e.id]}:{item:{...No(e),kind:`agent_commentary`,text:t??e.details.join(`
123
123
  `),details:[...e.details]},sourceMessageIds:[e.id]}}function Co(e,t){let n=wo(e,t);if(n)return n;if(e.itemType===`file_change`)return Do(e,t);if(e.itemType===`command_execution`)return Eo(e,t);let r=ss(e);return r?{item:{...No(e),kind:`activity_summary`,text:r,tone:Cs(e.status),details:[...e.details]},sourceMessageIds:[e.id]}:null}function wo(e,t){let n=e.toolCardData??us(t?.item,e);return n?{item:{...No(e),kind:`tool_card`,title:n.title,statusLabel:n.statusLabel,...n.compactText?{compactText:n.compactText}:{},sections:n.sections,details:n.details},sourceMessageIds:[e.id]}:null}function To(e){let t=e.userInputQuestions??[],n=e.userInputAnswers??{},r=t.map(e=>({id:e.id,header:e.header,question:e.question,answers:n[e.id]??[]})),i=r.length>0?r.map(e=>`${e.id} -> ${e.answers.length>0?e.answers.join(`、`):`未回答`}`).join(` · `):hs(e.text)??`已提交回答`;return{item:{...No(e),kind:`question_answer_card`,title:`已回答 Claude 的问题`,summaryText:i,entries:r},sourceMessageIds:[e.id]}}function Eo(e,t){let n=Ns(t?.item,[`command`])??ms(e.details,`command`),r=hs(e.text)??Ns(t?.item,[`output_delta`,`aggregated_output`])??ms(e.details,`output`),i=qo(t?.item,e),a=Jo(t?.item,e.status),o=Yo(t?.item),s=Xo(t?.item,n,r);if(i&&!n&&!r)return{item:{...No(e),kind:`activity_summary`,text:i.text,tone:Cs(e.status),details:[...e.details]},sourceMessageIds:[e.id],aggregateMeta:{groupKey:`${e.turnId??`no-turn`}:command-actions`,readCount:i.readCount,listCount:i.listCount,searchCount:i.searchCount}};if(!n&&!r){let t=ss(e);return t?{item:{...No(e),kind:`activity_summary`,text:t,tone:Cs(e.status),details:[...e.details]},sourceMessageIds:[e.id]}:null}return{item:{...No(e),kind:`terminal_card`,title:`Shell`,statusLabel:a,toolName:o,...n?{command:n}:{},...s?{compactText:s}:{},output:r??``,details:$o(e.details)},sourceMessageIds:[e.id]}}function Do(e,t){let n=cs(t?.item)??ps(e.details)??hs(e.text)??`unknown`,r=ns(t?.item),i=ts(t?.item),a=ss(e),o=os(e.provider,n,i.addedLines,i.removedLines),s=es(e.details);return{item:{...No(e),kind:`file_change_card`,title:o,filePath:n,addedLines:i.addedLines,removedLines:i.removedLines,...i.hasLineCounts?{hasLineCounts:!0}:{},...a&&a!==o?{summary:a}:{},details:s,...r?{patchPreview:r}:{}},sourceMessageIds:[e.id]}}function Oo(e){let t=[],n=[...e].sort(Mo),r=null;for(let e of n){let n=js(e.payload.raw),i=Ms(n.source),a=js(n.message),o=Ms(a.type),s=Ms(a.subtype);if(!i||!to.has(i))continue;let c=Ms(a.content);if(o===`system`&&s===`local_command`&&c){let n=_s(c);if(n?.kind===`command_strip`){let i={...Po(`claude-command:${e.eventId}`,e.ts,`completed`),kind:`command_strip`,command:n.command,...n.label?{label:n.label}:{},...n.args?{args:n.args}:{},...n.output?{output:n.output}:{}};t.push({item:i,sourceMessageIds:[]}),r=i;continue}if(n?.kind===`command_output`){r?r.output=r.output?`${r.output}
124
- ${n.output}`:n.output:t.push({item:{...Po(`claude-command-output:${e.eventId}`,e.ts,`completed`),kind:`activity_summary`,text:n.output,tone:`neutral`,details:[]},sourceMessageIds:[]});continue}continue}if(o!==`assistant`)continue;let l=js(a.message),u=Array.isArray(l.content)?l.content:[];for(let n of u){let r=js(n);if(Ms(r.type)!==`tool_use`||Ms(r.name)!==`Edit`)continue;let i=js(r.input),a=Ns(i,[`file_path`])??`unknown`,o=Ns(i,[`old_string`])??``,s=Ns(i,[`new_string`])??``,c=is(o,s);t.push({item:{...Po(`claude-edit:${e.eventId}:${Ms(r.id)??a}`,e.ts,`completed`),kind:`file_change_card`,title:os(`claude`,a,c.addedLines,c.removedLines),filePath:a,addedLines:c.addedLines,removedLines:c.removedLines,hasLineCounts:!0,summary:`文件已更新`,details:[],patchPreview:rs(o,s)},sourceMessageIds:[]})}}return t}function ko(e,t){let n=new Map;for(let t of[...e].sort(Mo)){let e=ws(t);if(!e)continue;if(Es(t)){let r=Ts(t);if(r&&Os(r)){n.delete(e);continue}n.set(e,{ts:t.ts,latestActivity:ks(t)});continue}let r=n.get(e);if(!r)continue;r.ts=t.ts;let i=ks(t);i&&(r.latestActivity=i),Ds(t)&&n.delete(e)}return n.size===0||t.some(e=>e.item.status===`streaming`||e.item.status===`waiting_approval`||e.item.status===`waiting_input`)?[]:[...n.entries()].map(([e,t])=>({item:{...Po(`zzz:thinking:${e}`,t.ts,`streaming`),turnId:e,kind:`activity_summary`,text:As(t.latestActivity),tone:`neutral`,details:[],isTransientStatus:!0},sourceMessageIds:[]}))}function Ao(e){let t=[];for(let n of e){let e=t[t.length-1];if(e&&e.item.kind===`activity_summary`&&n.item.kind===`activity_summary`&&e.aggregateMeta&&n.aggregateMeta&&e.aggregateMeta.groupKey===n.aggregateMeta.groupKey){e.aggregateMeta.readCount+=n.aggregateMeta.readCount,e.aggregateMeta.listCount+=n.aggregateMeta.listCount,e.aggregateMeta.searchCount+=n.aggregateMeta.searchCount,e.item.text=Zo(e.aggregateMeta.readCount,e.aggregateMeta.listCount,e.aggregateMeta.searchCount,n.item.status??`completed`),e.item.tone=Cs(n.item.status??`completed`),e.item.details=Fs([...e.item.details,...n.item.details]),e.item.status=n.item.status,e.sourceMessageIds=Fs([...e.sourceMessageIds,...n.sourceMessageIds]);continue}t.push({...n,sourceMessageIds:[...n.sourceMessageIds],item:Fo(n.item)})}return t}function jo(e,t){let n=e.item.ts.localeCompare(t.item.ts);return n===0?e.item.id.localeCompare(t.item.id):n}function Mo(e,t){let n=e.ts.localeCompare(t.ts);return n===0?e.eventId.localeCompare(t.eventId):n}function No(e){return Po(e.id,e.ts,e.status,{itemId:e.itemId,turnId:e.turnId,requestId:e.requestId})}function Po(e,t,n,r){return{id:e,ts:t,...n===`completed`?{}:{status:ao.parse(n)},...r?.itemId?{itemId:r.itemId}:{},...r?.turnId?{turnId:r.turnId}:{},...r?.requestId?{requestId:r.requestId}:{}}}function Fo(e){switch(e.kind){case`user_prompt`:case`approval_card`:case`question_card`:case`command_strip`:return{...e};case`agent_commentary`:case`activity_summary`:case`tool_card`:case`file_change_card`:case`terminal_card`:case`question_answer_card`:case`review_finding_card`:return JSON.parse(JSON.stringify(e));default:return e}}function Io(e){let t=hs(e);if(!t||!t.startsWith(`{`)||!t.includes(`"findings"`))return null;let n;try{n=JSON.parse(t)}catch{return null}let r=js(n),i=r.findings;if(!Array.isArray(i))return null;let a=Ms(r.overall_correctness);return a?{findings:i.map(Lo).filter(e=>e!==null),overallCorrectness:a,overallExplanation:Ms(r.overall_explanation)}:null}function Lo(e){let t=js(e),n=Ms(t.title),r=Ms(t.body);if(!n||!r)return null;let i=Ro(n,Ps(t,[`priority`])),a=js(t.code_location),o=js(a.line_range),s=Bo(Ps(o,[`start`])),c=Bo(Ps(o,[`end`]))??s,l=Vo(Ps(t,[`confidence_score`]));return{title:i.title,body:r,...i.priorityLabel?{priorityLabel:i.priorityLabel}:{},...typeof l==`number`?{confidenceScore:l}:{},...Ms(a.absolute_file_path)?{filePath:Ms(a.absolute_file_path)}:{},...typeof s==`number`?{lineStart:s}:{},...typeof c==`number`?{lineEnd:c}:{}}}function Ro(e,t){let n=e.match(/^\[(P[0-3])\]\s*(.+)$/u);return n?.[1]&&n[2]?{title:n[2].trim(),priorityLabel:n[1]}:t!==void 0&&Number.isInteger(t)&&t>=0&&t<=3?{title:e,priorityLabel:`P${t}`}:{title:e}}function zo(e){return`未报告任何结果。`}function Bo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<=0))return e}function Vo(e){if(!(typeof e!=`number`||Number.isNaN(e)||e<0||e>1))return e}function Ho(e){let t=new Map;for(let n of e){let e=js(js(n.payload.raw).item),r=Ns(e,[`id`]);r&&t.set(r,{envelope:n,item:e})}return t}function Uo(e,t){let n=new Set;for(let t of e){if(t.provider!==`codex`)continue;let e=Wo(t);!e?.turnId||!Ko(e.itemType)||n.add(e.turnId)}for(let e of t){if(e.provider!==`codex`||e.kind!==`user`||!e.turnId)continue;let t=Ja(e.text);!t||t.hiddenPromptKind!==`review_prompt`||n.add(e.turnId)}return n}function Wo(e){let t=js(e.payload.raw);if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`){let e=js(t.item);return{itemType:Go(Ns(e,[`type`])),turnId:Ns(t,[`turn_id`,`turnId`])??Ns(js(t.turn),[`id`,`turn_id`,`turnId`])??Ns(e,[`turn_id`,`turnId`])}}if(e.type!==`native.raw`)return null;let n=js(t.message),r=js(n.params),i=Ns(n,[`method`])??Ns(t,[`method`]);if(i===`item/started`||i===`item/updated`||i===`item/completed`){let e=js(r.item);return{itemType:Go(Ns(e,[`type`])),turnId:Ns(r,[`turn_id`,`turnId`])??Ns(js(r.turn),[`id`,`turn_id`,`turnId`])??Ns(e,[`turn_id`,`turnId`])}}if(!(Ns(t,[`source`])??``).startsWith(`codex.history.thread_read`)||Ns(n,[`scope`])!==`item`)return null;let a=js(n.item);return{itemType:Go(Ns(a,[`type`])),turnId:Ns(n,[`turn_id`,`turnId`])??Ns(js(n.turn),[`id`,`turn_id`,`turnId`])??Ns(a,[`turn_id`,`turnId`])}}function Go(e){if(!e)return;let t=e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).replace(/[\s-]+/g,`_`).toLowerCase().trim();return t.length>0?t:void 0}function Ko(e){return e===`entered_review_mode`||e===`exited_review_mode`}function qo(e,t){let{readCount:n,listCount:r,searchCount:i}=Qo(e);if(n===0&&r===0&&i===0){let e=hs(t.text);return e&&Ss(e)?{text:e,readCount:0,listCount:0,searchCount:0}:null}return{text:Zo(n,r,i,t.status),readCount:n,listCount:r,searchCount:i}}function Jo(e,t){let{readCount:n,listCount:r,searchCount:i}=Qo(e),a=t===`streaming`?`正在`:`已`;return n>0&&r===0&&i===0?`${a}\u8BFB\u53D6 ${n} \u4E2A\u6587\u4EF6`:i>0&&n===0&&r===0?`${a}\u641C\u7D22`:n>0||r>0?`${a}\u6D4F\u89C8`:`${a}\u8FD0\u884C\u547D\u4EE4`}function Yo(e){let{readCount:t,listCount:n,searchCount:r}=Qo(e);return t>0&&n===0&&r===0?`Read`:r>0&&t===0&&n===0?`Search`:`Shell`}function Xo(e,t,n){let r=Array.isArray(e?.command_actions)?e.command_actions:Array.isArray(e?.commandActions)?e.commandActions:[];if(r.length===1){let e=js(r[0]);if(Ns(e,[`type`])===`read`)return Ns(e,[`path`,`file_path`,`filePath`,`name`])??t??gs(n)}return t??gs(n)}function Zo(e,t,n,r){return r===`streaming`?n>0?`正在搜索`:e>0||t>0?`正在浏览`:`正在运行命令`:t>0&&e===0&&n===0&&r===`completed`?t===1?`Listed files`:`Listed ${t} file lists`:t>0&&e===0&&n===0?`\u5DF2\u6D4F\u89C8 ${t} \u4E2A\u5217\u8868`:e>0&&t===0&&n===0?`\u5DF2\u6D4F\u89C8 ${e} \u4E2A\u6587\u4EF6`:e+t>0&&n>0?`\u5DF2\u6D4F\u89C8 ${e+t} \u4E2A\u9879\u76EE\uFF0C${n} \u4E2A\u641C\u7D22`:e+t>0?`\u5DF2\u6D4F\u89C8 ${e+t} \u4E2A\u9879\u76EE`:`\u5DF2\u6267\u884C ${n} \u4E2A\u641C\u7D22`}function Qo(e){let t=Array.isArray(e?.command_actions)?e.command_actions:Array.isArray(e?.commandActions)?e.commandActions:[],n=0,r=0,i=0;for(let e of t){let t=Ms(js(e).type);t===`read`?n+=1:t===`listFiles`||t===`list_files`?r+=1:t===`search`&&(i+=1)}return{readCount:n,listCount:r,searchCount:i}}function $o(e){return e.filter(e=>{let t=e.trim().toLowerCase();return!(t.startsWith(`command:`)||t.startsWith(`output:`)||t.startsWith(`status:`)||t.startsWith(`exit_code:`)||t.startsWith(`command_actions:`))})}function es(e){return e.filter(e=>{let t=e.trim().toLowerCase();return!(t.startsWith(`status:`)||t.startsWith(`output:`)||t.startsWith(`update:`))})}function ts(e){let t=Ps(e,[`added_lines`,`addedLines`]),n=Ps(e,[`removed_lines`,`removedLines`]);if(t!==void 0||n!==void 0)return{addedLines:t??0,removedLines:n??0,hasLineCounts:!0};let r=Ns(e,[`old_string`,`oldString`])??``,i=Ns(e,[`new_string`,`newString`])??``;if(r||i)return{...is(r,i),hasLineCounts:!0};let a=Ns(e,[`patch`,`structuredPatch`,`structured_patch`,`diff`]);if(a)return{...as(a),hasLineCounts:!0};let o=Array.isArray(e?.changes)?e.changes:[],s=0,c=0,l=!1;for(let e of o){let t=js(e),n=Ps(t,[`added_lines`,`addedLines`]),r=Ps(t,[`removed_lines`,`removedLines`]);if(n!==void 0||r!==void 0){s+=n??0,c+=r??0,l=!0;continue}let i=Ns(t,[`diff`,`patch`,`structuredPatch`,`structured_patch`,`unified_diff`]);if(i){let e=as(i);s+=e.addedLines,c+=e.removedLines,l=!0}}return l?{addedLines:s,removedLines:c,hasLineCounts:!0}:{addedLines:0,removedLines:0,hasLineCounts:!1}}function ns(e){let t=Ns(e,[`patch`,`structuredPatch`,`structured_patch`,`diff`]);if(t)return t;let n=Ns(e,[`old_string`,`oldString`]),r=Ns(e,[`new_string`,`newString`]);if(!n&&!r){let t=(Array.isArray(e?.changes)?e.changes:[]).map(e=>Ns(js(e),[`diff`,`patch`,`structuredPatch`,`structured_patch`,`unified_diff`])).filter(e=>typeof e==`string`&&e.length>0);return t.length>0?t.join(`
124
+ ${n.output}`:n.output:t.push({item:{...Po(`claude-command-output:${e.eventId}`,e.ts,`completed`),kind:`activity_summary`,text:n.output,tone:`neutral`,details:[]},sourceMessageIds:[]});continue}continue}if(o!==`assistant`)continue;let l=js(a.message),u=Array.isArray(l.content)?l.content:[];for(let n of u){let r=js(n);if(Ms(r.type)!==`tool_use`||Ms(r.name)!==`Edit`)continue;let i=js(r.input),a=Ns(i,[`file_path`])??`unknown`,o=Ns(i,[`old_string`])??``,s=Ns(i,[`new_string`])??``,c=is(o,s);t.push({item:{...Po(`claude-edit:${e.eventId}:${Ms(r.id)??a}`,e.ts,`completed`),kind:`file_change_card`,title:os(`claude`,a,c.addedLines,c.removedLines),filePath:a,addedLines:c.addedLines,removedLines:c.removedLines,hasLineCounts:!0,summary:`文件已更新`,details:[],patchPreview:rs(o,s)},sourceMessageIds:[]})}}return t}function ko(e,t){let n=new Map;for(let t of[...e].sort(Mo)){let e=ws(t);if(!e)continue;if(Es(t)){let r=Ts(t);if(r&&Os(r)){n.delete(e);continue}n.set(e,{ts:t.ts,latestActivity:ks(t)});continue}let r=n.get(e);if(!r)continue;r.ts=t.ts;let i=ks(t);i&&(r.latestActivity=i),Ds(t)&&n.delete(e)}return n.size===0||t.some(e=>e.item.status===`streaming`||e.item.status===`waiting_approval`||e.item.status===`waiting_input`)?[]:[...n.entries()].map(([e,t])=>({item:{...Po(`zzz:thinking:${e}`,t.ts,`streaming`),turnId:e,kind:`activity_summary`,text:As(t.latestActivity),tone:`neutral`,details:[],isTransientStatus:!0},sourceMessageIds:[]}))}function Ao(e){let t=[];for(let n of e){let e=t[t.length-1];if(e&&e.item.kind===`activity_summary`&&n.item.kind===`activity_summary`&&e.aggregateMeta&&n.aggregateMeta&&e.aggregateMeta.groupKey===n.aggregateMeta.groupKey){e.aggregateMeta.readCount+=n.aggregateMeta.readCount,e.aggregateMeta.listCount+=n.aggregateMeta.listCount,e.aggregateMeta.searchCount+=n.aggregateMeta.searchCount,e.item.text=Zo(e.aggregateMeta.readCount,e.aggregateMeta.listCount,e.aggregateMeta.searchCount,n.item.status??`completed`),e.item.tone=Cs(n.item.status??`completed`),e.item.details=Fs([...e.item.details,...n.item.details]),e.item.status=n.item.status,e.sourceMessageIds=Fs([...e.sourceMessageIds,...n.sourceMessageIds]);continue}t.push({...n,sourceMessageIds:[...n.sourceMessageIds],item:Fo(n.item)})}return t}function jo(e,t){let n=e.item.ts.localeCompare(t.item.ts);return n===0?e.item.id.localeCompare(t.item.id):n}function Mo(e,t){let n=e.ts.localeCompare(t.ts);return n===0?e.eventId.localeCompare(t.eventId):n}function No(e){return Po(e.id,e.ts,e.status,{itemId:e.itemId,turnId:e.turnId,requestId:e.requestId})}function Po(e,t,n,r){return{id:e,ts:t,...n===`completed`?{}:{status:ao.parse(n)},...r?.itemId?{itemId:r.itemId}:{},...r?.turnId?{turnId:r.turnId}:{},...r?.requestId?{requestId:r.requestId}:{}}}function Fo(e){switch(e.kind){case`user_prompt`:case`approval_card`:case`question_card`:case`command_strip`:return{...e};case`agent_commentary`:case`activity_summary`:case`tool_card`:case`file_change_card`:case`terminal_card`:case`question_answer_card`:case`review_finding_card`:return JSON.parse(JSON.stringify(e));default:return e}}function Io(e){let t=hs(e);if(!t||!t.startsWith(`{`)||!t.includes(`"findings"`))return null;let n;try{n=JSON.parse(t)}catch{return null}let r=js(n),i=r.findings;if(!Array.isArray(i))return null;let a=Ms(r.overall_correctness);return a?{findings:i.map(Lo).filter(e=>e!==null),overallCorrectness:a,overallExplanation:Ms(r.overall_explanation)}:null}function Lo(e){let t=js(e),n=Ms(t.title),r=Ms(t.body);if(!n||!r)return null;let i=Ro(n,Ps(t,[`priority`])),a=js(t.code_location),o=js(a.line_range),s=Bo(Ps(o,[`start`])),c=Bo(Ps(o,[`end`]))??s,l=Vo(Ps(t,[`confidence_score`]));return{title:i.title,body:r,...i.priorityLabel?{priorityLabel:i.priorityLabel}:{},...typeof l==`number`?{confidenceScore:l}:{},...Ms(a.absolute_file_path)?{filePath:Ms(a.absolute_file_path)}:{},...typeof s==`number`?{lineStart:s}:{},...typeof c==`number`?{lineEnd:c}:{}}}function Ro(e,t){let n=e.match(/^\[(P[0-3])\]\s*(.+)$/u);return n?.[1]&&n[2]?{title:n[2].trim(),priorityLabel:n[1]}:t!==void 0&&Number.isInteger(t)&&t>=0&&t<=3?{title:e,priorityLabel:`P${t}`}:{title:e}}function zo(e){return e.overallCorrectness===`patch is correct`?`未发现需要修复的问题。`:hs(e.overallExplanation)??`审查已完成。`}function Bo(e){if(!(typeof e!=`number`||!Number.isInteger(e)||e<=0))return e}function Vo(e){if(!(typeof e!=`number`||Number.isNaN(e)||e<0||e>1))return e}function Ho(e){let t=new Map;for(let n of e){let e=js(js(n.payload.raw).item),r=Ns(e,[`id`]);r&&t.set(r,{envelope:n,item:e})}return t}function Uo(e,t){let n=new Set;for(let t of e){if(t.provider!==`codex`)continue;let e=Wo(t);!e?.turnId||!Ko(e.itemType)||n.add(e.turnId)}for(let e of t){if(e.provider!==`codex`||e.kind!==`user`||!e.turnId)continue;let t=Ja(e.text);!t||t.hiddenPromptKind!==`review_prompt`||n.add(e.turnId)}return n}function Wo(e){let t=js(e.payload.raw);if(e.type===`item.started`||e.type===`item.updated`||e.type===`item.completed`){let e=js(t.item);return{itemType:Go(Ns(e,[`type`])),turnId:Ns(t,[`turn_id`,`turnId`])??Ns(js(t.turn),[`id`,`turn_id`,`turnId`])??Ns(e,[`turn_id`,`turnId`])}}if(e.type!==`native.raw`)return null;let n=js(t.message),r=js(n.params),i=Ns(n,[`method`])??Ns(t,[`method`]);if(i===`item/started`||i===`item/updated`||i===`item/completed`){let e=js(r.item);return{itemType:Go(Ns(e,[`type`])),turnId:Ns(r,[`turn_id`,`turnId`])??Ns(js(r.turn),[`id`,`turn_id`,`turnId`])??Ns(e,[`turn_id`,`turnId`])}}if(!(Ns(t,[`source`])??``).startsWith(`codex.history.thread_read`)||Ns(n,[`scope`])!==`item`)return null;let a=js(n.item);return{itemType:Go(Ns(a,[`type`])),turnId:Ns(n,[`turn_id`,`turnId`])??Ns(js(n.turn),[`id`,`turn_id`,`turnId`])??Ns(a,[`turn_id`,`turnId`])}}function Go(e){if(!e)return;let t=e.replace(/([a-z0-9])([A-Z])/g,`$1_$2`).replace(/[\s-]+/g,`_`).toLowerCase().trim();return t.length>0?t:void 0}function Ko(e){return e===`entered_review_mode`||e===`exited_review_mode`}function qo(e,t){let{readCount:n,listCount:r,searchCount:i}=Qo(e);if(n===0&&r===0&&i===0){let e=hs(t.text);return e&&Ss(e)?{text:e,readCount:0,listCount:0,searchCount:0}:null}return{text:Zo(n,r,i,t.status),readCount:n,listCount:r,searchCount:i}}function Jo(e,t){let{readCount:n,listCount:r,searchCount:i}=Qo(e),a=t===`streaming`?`正在`:`已`;return n>0&&r===0&&i===0?`${a}\u8BFB\u53D6 ${n} \u4E2A\u6587\u4EF6`:i>0&&n===0&&r===0?`${a}\u641C\u7D22`:n>0||r>0?`${a}\u6D4F\u89C8`:`${a}\u8FD0\u884C\u547D\u4EE4`}function Yo(e){let{readCount:t,listCount:n,searchCount:r}=Qo(e);return t>0&&n===0&&r===0?`Read`:r>0&&t===0&&n===0?`Search`:`Shell`}function Xo(e,t,n){let r=Array.isArray(e?.command_actions)?e.command_actions:Array.isArray(e?.commandActions)?e.commandActions:[];if(r.length===1){let e=js(r[0]);if(Ns(e,[`type`])===`read`)return Ns(e,[`path`,`file_path`,`filePath`,`name`])??t??gs(n)}return t??gs(n)}function Zo(e,t,n,r){return r===`streaming`?n>0?`正在搜索`:e>0||t>0?`正在浏览`:`正在运行命令`:t>0&&e===0&&n===0&&r===`completed`?t===1?`Listed files`:`Listed ${t} file lists`:t>0&&e===0&&n===0?`\u5DF2\u6D4F\u89C8 ${t} \u4E2A\u5217\u8868`:e>0&&t===0&&n===0?`\u5DF2\u6D4F\u89C8 ${e} \u4E2A\u6587\u4EF6`:e+t>0&&n>0?`\u5DF2\u6D4F\u89C8 ${e+t} \u4E2A\u9879\u76EE\uFF0C${n} \u4E2A\u641C\u7D22`:e+t>0?`\u5DF2\u6D4F\u89C8 ${e+t} \u4E2A\u9879\u76EE`:`\u5DF2\u6267\u884C ${n} \u4E2A\u641C\u7D22`}function Qo(e){let t=Array.isArray(e?.command_actions)?e.command_actions:Array.isArray(e?.commandActions)?e.commandActions:[],n=0,r=0,i=0;for(let e of t){let t=Ms(js(e).type);t===`read`?n+=1:t===`listFiles`||t===`list_files`?r+=1:t===`search`&&(i+=1)}return{readCount:n,listCount:r,searchCount:i}}function $o(e){return e.filter(e=>{let t=e.trim().toLowerCase();return!(t.startsWith(`command:`)||t.startsWith(`output:`)||t.startsWith(`status:`)||t.startsWith(`exit_code:`)||t.startsWith(`command_actions:`))})}function es(e){return e.filter(e=>{let t=e.trim().toLowerCase();return!(t.startsWith(`status:`)||t.startsWith(`output:`)||t.startsWith(`update:`))})}function ts(e){let t=Ps(e,[`added_lines`,`addedLines`]),n=Ps(e,[`removed_lines`,`removedLines`]);if(t!==void 0||n!==void 0)return{addedLines:t??0,removedLines:n??0,hasLineCounts:!0};let r=Ns(e,[`old_string`,`oldString`])??``,i=Ns(e,[`new_string`,`newString`])??``;if(r||i)return{...is(r,i),hasLineCounts:!0};let a=Ns(e,[`patch`,`structuredPatch`,`structured_patch`,`diff`]);if(a)return{...as(a),hasLineCounts:!0};let o=Array.isArray(e?.changes)?e.changes:[],s=0,c=0,l=!1;for(let e of o){let t=js(e),n=Ps(t,[`added_lines`,`addedLines`]),r=Ps(t,[`removed_lines`,`removedLines`]);if(n!==void 0||r!==void 0){s+=n??0,c+=r??0,l=!0;continue}let i=Ns(t,[`diff`,`patch`,`structuredPatch`,`structured_patch`,`unified_diff`]);if(i){let e=as(i);s+=e.addedLines,c+=e.removedLines,l=!0}}return l?{addedLines:s,removedLines:c,hasLineCounts:!0}:{addedLines:0,removedLines:0,hasLineCounts:!1}}function ns(e){let t=Ns(e,[`patch`,`structuredPatch`,`structured_patch`,`diff`]);if(t)return t;let n=Ns(e,[`old_string`,`oldString`]),r=Ns(e,[`new_string`,`newString`]);if(!n&&!r){let t=(Array.isArray(e?.changes)?e.changes:[]).map(e=>Ns(js(e),[`diff`,`patch`,`structuredPatch`,`structured_patch`,`unified_diff`])).filter(e=>typeof e==`string`&&e.length>0);return t.length>0?t.join(`
125
125
 
126
126
  `):void 0}return rs(n??``,r??``)}function rs(e,t){let n=Ls(e),r=Ls(t),i=n.map(e=>`- ${e}`),a=r.map(e=>`+ ${e}`);return[...i,...a].join(`
127
127
  `)}function is(e,t){let n=Ls(e),r=Ls(t),i=0;for(;i<n.length&&i<r.length&&n[i]===r[i];)i+=1;let a=n.length-1,o=r.length-1;for(;a>=i&&o>=i&&n[a]===r[o];)--a,--o;return{removedLines:Math.max(a-i+1,0),addedLines:Math.max(o-i+1,0)}}function as(e){let t=Ls(e),n=0,r=0;for(let e of t)e.startsWith(`+++`)||e.startsWith(`---`)||e.startsWith(`@@`)||(e.startsWith(`+`)?n+=1:e.startsWith(`-`)&&(r+=1));return{addedLines:n,removedLines:r}}function os(e,t,n,r){return e===`claude`?`Update(${t})`:n===0&&r===0?`\u5DF2\u7F16\u8F91 ${Is(t)}`:`\u5DF2\u7F16\u8F91 ${Is(t)} +${n} -${r}`}function ss(e){let t=hs(e.text);if(t)return t;let n=e.details[0];return n?hs(n):void 0}function cs(e){let t=Ns(e,[`path`,`file_path`,`filePath`]);if(t)return t;let n=Array.isArray(e?.changes)?e.changes:[];for(let e of n){let t=Ns(js(e),[`path`,`file_path`,`filePath`]);if(t)return t}}function ls(e){let t=[],n=Ns(e??{},[`file_path`]),r=Ps(e??{},[`total_tokens`]),i=Ps(e??{},[`total_tool_uses`]),a=Ps(e??{},[`duration_ms`]);return n&&t.push(n),typeof i==`number`&&t.push(`${i} tool uses`),typeof r==`number`&&t.push(`${ds(r)} tokens`),typeof a==`number`&&t.push(fs(a)),Fs(t)}function us(e,t){if(Ns(e??{},[`display_as`])!==`tool_card`)return;let n=Ns(e??{},[`title`])??ss(t),r=Ns(e??{},[`status_label`])??hs(t.text);if(!n||!r)return;let i=[],a=Ns(e??{},[`prompt`]),o=Ns(e??{},[`response`]),s=Ns(e??{},[`response_label`])??`Response`;return a&&i.push({label:`Prompt`,body:a}),o&&i.push({label:s,body:o}),{title:n,statusLabel:r,compactText:hs(t.text),sections:i,details:ls(e)}}function ds(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:`${e}`}function fs(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 ps(e){for(let t of e){let e=t.replace(/^[a-z_]+:\s*/i,``).trim();if(e.includes(`/`)||e.includes(`.tsx`)||e.includes(`.ts`))return e}}function ms(e,t){let n=`${t}:`;for(let t of e)if(t.startsWith(n))return hs(t.slice(n.length))}function hs(e){if(typeof e!=`string`)return;let t=e.replace(/\r\n/g,`
@@ -501,7 +501,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
501
501
  `).map(function(e){return e+`
502
502
  `});return t?n.pop():n.push(n.pop().slice(0,-1)),n}const DT=1024*1024;var OT=class{async listDirectories(e,t,n=200){let r=await d.default.realpath(p.default.resolve(e));return IT(r,await PT(r,t),n)}async listDirectoriesUnrestricted(e,t=200,n=f.default.homedir()){let r=await FT(e,n),i=p.default.parse(r).root;return IT(i,r,t)}async readFile(e,t){let{absolutePath:n,normalizedPath:r}=await kT(e,t);return{path:r,absolutePath:n,content:await d.default.readFile(n,`utf8`)}}async diffFile(e,t,n=``){let{absolutePath:r,normalizedPath:i}=await kT(e,t),a=await d.default.readFile(r,`utf8`);return{path:i,absolutePath:r,diff:TT(i,i,n,a,`base`,`current`),currentContent:a}}async listTree(e,t=`.`,n=500){let r=await d.default.realpath(p.default.resolve(e)),i=AT(t),a=await jT(r,i),o=[];async function s(e,t){let r=await d.default.readdir(e,{withFileTypes:!0});for(let i of r){if(o.length>=n)return;let r=p.default.join(e,i.name),a=t?p.default.join(t,i.name):i.name;i.isSymbolicLink()||(i.isDirectory()?(o.push({path:a,kind:`dir`}),await s(r,a)):o.push({path:a,kind:`file`}))}}return await s(a,``),{root:i,entries:o}}async resolveProjectRelativeFile(e,t){let{absolutePath:n}=await kT(e,t);return RT(n)}async resolveAbsoluteFile(e){let t=e.trim();if(!t)throw Error(`Path is required`);if(!p.default.isAbsolute(t))throw Error(`Path must be absolute: ${e}`);return RT(t)}async readTextFile(e,t={}){let n=await this.resolveAbsoluteFile(e);if(!n.capabilities.canReadText)throw Error(`File is not readable as text: ${n.canonicalPath}`);let r=Math.max(1,Math.floor(t.startLine??1)),i=Math.min(5e3,Math.max(1,Math.floor(t.maxLines??400))),a=Math.min(DT,Math.max(1,Math.floor(t.maxBytes??DT))),o=await d.default.stat(n.canonicalPath),{content:s,endLineExclusive:c,totalLines:l,truncated:u}=await BT(n.canonicalPath,{startLine:r,maxLines:i,maxBytes:a,totalBytes:o.size});return{content:s,encoding:`utf8`,startLine:r,endLineExclusive:c,...l===void 0?{}:{totalLines:l},totalBytes:o.size,truncated:u}}async readFileContentRange(e,t={}){let n=await this.resolveAbsoluteFile(e),r=await d.default.stat(n.canonicalPath),i=r.size,a=zT(r),o=r.mtime.toISOString(),s=t.includeBody!==!1,c=t.rangeHeader?.trim();if(!c)return{statusCode:200,totalSize:i,contentLength:i,buffer:s?await d.default.readFile(n.canonicalPath):void 0,etag:a,lastModified:o};let l=qT(c,i);if(!l)return{statusCode:416,totalSize:i,contentLength:0,contentRange:`bytes */${i}`,etag:a,lastModified:o};let{start:u,end:f}=l,p=f-u+1,m=s?await d.default.open(n.canonicalPath,`r`):null;try{let e;return m&&(e=Buffer.alloc(p),await m.read(e,0,p,u)),{statusCode:206,totalSize:i,contentLength:p,start:u,end:f,contentRange:`bytes ${u}-${f}/${i}`,buffer:e,etag:a,lastModified:o}}finally{await m?.close()}}async openFileContentRangeStream(e,t={}){let n=await this.resolveAbsoluteFile(e),r=await d.default.stat(n.canonicalPath),i=r.size,a=zT(r),o=r.mtime.toISOString(),s=t.includeBody!==!1,c=t.rangeHeader?.trim();if(!c)return{statusCode:200,totalSize:i,contentLength:i,stream:s?(0,u.createReadStream)(n.canonicalPath):void 0,etag:a,lastModified:o};let l=qT(c,i);if(!l)return{statusCode:416,totalSize:i,contentLength:0,contentRange:`bytes */${i}`,etag:a,lastModified:o};let{start:f,end:p}=l;return{statusCode:206,totalSize:i,contentLength:p-f+1,start:f,end:p,contentRange:`bytes ${f}-${p}/${i}`,stream:s?(0,u.createReadStream)(n.canonicalPath,{start:f,end:p}):void 0,etag:a,lastModified:o}}async listEntriesProjectRelative(e,t=`.`,n=200){let r=await d.default.realpath(p.default.resolve(e));return LT(r,await PT(r,t.trim()||`.`),n,r)}async listEntriesAbsolute(e,t=200,n=f.default.homedir()){let r=await FT(e,n);return LT(p.default.parse(r).root,r,t)}};async function kT(e,t){let n=await d.default.realpath(p.default.resolve(e)),r=AT(t),i=await jT(n,r),a=await d.default.realpath(i);return MT(n,a,r),{absolutePath:a,normalizedPath:r}}function AT(e){let t=e.trim();if(!t)throw Error(`Path is required`);return t}async function jT(e,t){if(p.default.isAbsolute(t))throw Error(`Path must be relative to project root: ${t}`);let n=p.default.resolve(e,t);return MT(e,n,t),n}function MT(e,t,n){let r=NT(e),i=NT(t);if(t!==e&&!i.startsWith(r))throw Error(`Path outside project root is not allowed: ${n}`)}function NT(e){return e.endsWith(p.default.sep)?e:`${e}${p.default.sep}`}async function PT(e,t){let n=t?.trim(),r=n?p.default.isAbsolute(n)?p.default.resolve(n):p.default.resolve(e,n):e;MT(e,r,n??`.`);let i=await d.default.realpath(r);if(MT(e,i,n??`.`),!(await d.default.stat(i)).isDirectory())throw Error(`Path is not a directory: ${i}`);return i}async function FT(e,t=f.default.homedir()){let n=e?.trim(),r=p.default.resolve(t),i=n?p.default.isAbsolute(n)?p.default.resolve(n):p.default.resolve(r,n):r,a=await d.default.realpath(i);if(!(await d.default.stat(a)).isDirectory())throw Error(`Path is not a directory: ${a}`);return a}async function IT(e,t,n){let r=(await d.default.readdir(t,{withFileTypes:!0})).filter(e=>e.isDirectory()&&!e.isSymbolicLink()).sort((e,t)=>e.name.localeCompare(t.name)).slice(0,Math.max(1,n)).map(e=>({name:e.name,path:p.default.join(t,e.name)}));return{rootPath:e,currentPath:t,parentPath:t===e?null:p.default.dirname(t),directories:r}}async function LT(e,t,n,r){let i=[...await d.default.readdir(t,{withFileTypes:!0})].filter(e=>!e.isSymbolicLink()).sort((e,t)=>e.isDirectory()===t.isDirectory()?e.name.localeCompare(t.name):e.isDirectory()?-1:1).slice(0,Math.max(1,n)),a=await Promise.all(i.map(async e=>{let n=p.default.join(t,e.name),i=await d.default.stat(n);if(e.isDirectory())return{name:e.name,path:r?p.default.relative(r,n)||`.`:n,kind:`dir`,updatedAt:i.mtime.toISOString()};let a=await RT(n);return{name:e.name,path:r?p.default.relative(r,a.canonicalPath)||e.name:a.canonicalPath,kind:`file`,sizeBytes:a.sizeBytes,mimeType:a.mimeType,extension:a.extension,updatedAt:a.updatedAt,previewCategory:a.previewCategory}}));return{rootPath:e,currentPath:t,parentPath:t===e?null:p.default.dirname(t),entries:a}}async function RT(e){let t=await d.default.realpath(p.default.resolve(e)),n=await d.default.stat(t);if(!n.isFile())throw Error(`Path is not a regular file: ${t}`);let r=p.default.extname(t).replace(/^\./,``).toLowerCase()||`bin`,i=HT(r),a=UT(r,i),o=WT(a);return{canonicalPath:t,displayName:p.default.basename(t),sizeBytes:n.size,mimeType:i,extension:r,updatedAt:n.mtime.toISOString(),etag:zT(n),previewCategory:a,preferredPreviewAction:o,capabilities:{canReadText:GT(a,i),canPreparePreview:!0,supportsRange:KT(a)}}}function zT(e){return`${e.size}-${Math.floor(e.mtimeMs)}`}async function BT(e,t){let n=t.startLine+t.maxLines,r=new T.StringDecoder(`utf8`),i=Buffer.allocUnsafe(65536),a=[],o=0,s=1,c=t.startLine,l=0,u=!1,f=!1,p=!1,m=``,h=await d.default.open(e,`r`),g=e=>e>=t.startLine&&e<n,_=e=>{if(!e)return!0;let n=VT(e,t.maxBytes-o);return n&&(a.push(n),o+=Buffer.byteLength(n,`utf8`)),Buffer.byteLength(n,`utf8`)<Buffer.byteLength(e,`utf8`)?(u=!0,!1):!0},v=()=>{g(s)&&(c=Math.max(c,s+1))},y=(e,r=!1)=>{let i=`${m}${e}`;m=``,!r&&i.endsWith(`\r`)&&(m=`\r`,i=i.slice(0,-1));let a=0;for(;a<i.length&&!u&&!f;){let e=i.indexOf(`
503
503
  `,a),t=e===-1?i.length:e,r=i.slice(a,t).replace(/\r$/u,``);if(g(s)&&!_(r))return;if(e===-1)break;v();let o=s+1;if(g(s)&&o<n&&!_(`
504
- `))return;s+=1,a=e+1,s>=n&&(f=!0)}r&&t.totalBytes>0&&!u&&!f&&v()};try{for(;!u&&!f;){let{bytesRead:e}=await h.read(i,0,i.length,null);if(e===0){y(r.end(),!0),p=!0;break}l+=e,y(r.write(i.subarray(0,e))),s>=n&&l<t.totalBytes&&(f=!0)}}finally{await h.close()}return{content:a.join(``),endLineExclusive:a.length===0?t.startLine:c,...p?{totalLines:s}:{},truncated:u||f||!p}}function VT(e,t){if(t<=0||e.length===0)return``;if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=0,r=[];for(let i of e){let e=Buffer.byteLength(i,`utf8`);if(n+e>t)break;r.push(i),n+=e}return r.join(``)}function HT(e){switch(e){case`ts`:case`tsx`:return`text/typescript`;case`js`:case`jsx`:case`mjs`:case`cjs`:return`text/javascript`;case`json`:return`application/json`;case`md`:case`markdown`:return`text/markdown`;case`txt`:case`log`:case`yaml`:case`yml`:case`xml`:case`csv`:case`sh`:case`zsh`:case`bash`:case`py`:case`rb`:case`go`:case`rs`:case`java`:case`kt`:case`swift`:case`css`:case`scss`:case`html`:return`text/plain`;case`png`:return`image/png`;case`jpg`:case`jpeg`:return`image/jpeg`;case`gif`:return`image/gif`;case`webp`:return`image/webp`;case`svg`:return`image/svg+xml`;case`mp4`:return`video/mp4`;case`mov`:return`video/quicktime`;case`m4v`:return`video/x-m4v`;case`webm`:return`video/webm`;case`mp3`:return`audio/mpeg`;case`wav`:return`audio/wav`;case`m4a`:return`audio/mp4`;case`pdf`:return`application/pdf`;case`doc`:return`application/msword`;case`docx`:return`application/vnd.openxmlformats-officedocument.wordprocessingml.document`;case`xls`:return`application/vnd.ms-excel`;case`xlsx`:return`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`;case`ppt`:return`application/vnd.ms-powerpoint`;case`pptx`:return`application/vnd.openxmlformats-officedocument.presentationml.presentation`;case`zip`:return`application/zip`;case`tar`:return`application/x-tar`;case`gz`:return`application/gzip`;default:return`application/octet-stream`}}function UT(e,t){return t.startsWith(`image/`)?`image`:t.startsWith(`video/`)?`video`:t.startsWith(`audio/`)?`audio`:t===`application/pdf`?`pdf`:t===`application/msword`||t.includes(`officedocument`)||t.includes(`ms-excel`)||t.includes(`ms-powerpoint`)?`office`:e===`md`||e===`markdown`?`markdown`:JT.has(e)?`code`:YT.has(e)||t.startsWith(`text/`)||t===`application/json`?`text`:XT.has(e)?`archive`:`binary`}function WT(e){switch(e){case`text`:case`code`:case`markdown`:return`inline_text`;case`image`:case`video`:case`audio`:return`inline_media`;case`pdf`:return`browser`;case`office`:return`share_sheet`;case`archive`:case`binary`:case`unknown`:return`download`}}function GT(e,t){return e===`text`||e===`code`||e===`markdown`||t.startsWith(`text/`)||t===`application/json`}function KT(e){return e!==`text`&&e!==`code`&&e!==`markdown`}function qT(e,t){if(!e.startsWith(`bytes=`))return null;let n=e.slice(6).trim();if(!n||n.includes(`,`))return null;let[r,i]=n.split(`-`,2);if(r===void 0||i===void 0)return null;let a,o;if(r.length===0){let e=Number(i);if(!Number.isFinite(e)||e<=0)return null;a=Math.max(0,t-e),o=Math.max(0,t-1)}else a=Number(r),o=i.length>0?Number(i):t-1;return!Number.isFinite(a)||!Number.isFinite(o)||a<0||o<a||a>=t?null:(o=Math.min(o,t-1),{start:a,end:o})}const JT=new Set([`ts`,`tsx`,`js`,`jsx`,`mjs`,`cjs`,`py`,`rb`,`go`,`rs`,`java`,`kt`,`swift`,`css`,`scss`,`html`,`sql`,`toml`,`ini`]),YT=new Set([`txt`,`log`,`yaml`,`yml`,`xml`,`csv`,`json`,`sh`,`zsh`,`bash`]),XT=new Set([`zip`,`tar`,`gz`,`tgz`,`bz2`,`xz`,`7z`]),ZT=new Set([`thread/status/changed`,`skills/changed`,`mcpServer/startupStatus/updated`]),QT=16*1024;function $T(e,t=`full`){if(t!==`compact`||e.length===0)return e;let n=eE(e),r=[];for(let t of e)tE(t,n)||r.push(nE(t));return r}function eE(e){let t=new Set;for(let n of e){let e=uE(n);e?.phase===`completed`&&e.itemKey&&t.add(e.itemKey)}return t}function tE(e,t){let n=dE(e);if(n&&ZT.has(n)||fE(e))return!0;let r=uE(e);if(!r)return!1;let i=mE(r.item);return i?r.phase===`started`?i===`userMessage`||i===`user_message`||i===`agentMessage`||i===`agent_message`||i===`reasoning`&&hE(r.item)?!!(r.itemKey&&t.has(r.itemKey)):!1:i===`reasoning`&&hE(r.item):!1}function nE(e){let t=sE(e);if(!t)return e;let n=lE(t.item);return n?t.replace(rE(t.item,n)):e}function rE(e,t){let n=Buffer.byteLength(t,`utf8`),r=t.split(`
504
+ `))return;s+=1,a=e+1,s>=n&&(f=!0)}r&&t.totalBytes>0&&!u&&!f&&v()};try{for(;!u&&!f;){let{bytesRead:e}=await h.read(i,0,i.length,null);if(e===0){y(r.end(),!0),p=!0;break}l+=e,y(r.write(i.subarray(0,e))),s>=n&&l<t.totalBytes&&(f=!0)}}finally{await h.close()}return{content:a.join(``),endLineExclusive:a.length===0?t.startLine:c,...p?{totalLines:s}:{},truncated:u||f||!p}}function VT(e,t){if(t<=0||e.length===0)return``;if(Buffer.byteLength(e,`utf8`)<=t)return e;let n=0,r=[];for(let i of e){let e=Buffer.byteLength(i,`utf8`);if(n+e>t)break;r.push(i),n+=e}return r.join(``)}function HT(e){switch(e){case`ts`:case`tsx`:return`text/typescript`;case`js`:case`jsx`:case`mjs`:case`cjs`:return`text/javascript`;case`json`:return`application/json`;case`jsonl`:return`application/x-ndjson`;case`md`:case`markdown`:return`text/markdown`;case`txt`:case`log`:case`yaml`:case`yml`:case`xml`:case`csv`:case`sh`:case`zsh`:case`bash`:case`py`:case`rb`:case`go`:case`rs`:case`java`:case`kt`:case`swift`:case`css`:case`scss`:case`html`:return`text/plain`;case`png`:return`image/png`;case`jpg`:case`jpeg`:return`image/jpeg`;case`gif`:return`image/gif`;case`webp`:return`image/webp`;case`svg`:return`image/svg+xml`;case`mp4`:return`video/mp4`;case`mov`:return`video/quicktime`;case`m4v`:return`video/x-m4v`;case`webm`:return`video/webm`;case`mp3`:return`audio/mpeg`;case`wav`:return`audio/wav`;case`m4a`:return`audio/mp4`;case`pdf`:return`application/pdf`;case`doc`:return`application/msword`;case`docx`:return`application/vnd.openxmlformats-officedocument.wordprocessingml.document`;case`xls`:return`application/vnd.ms-excel`;case`xlsx`:return`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`;case`ppt`:return`application/vnd.ms-powerpoint`;case`pptx`:return`application/vnd.openxmlformats-officedocument.presentationml.presentation`;case`zip`:return`application/zip`;case`tar`:return`application/x-tar`;case`gz`:return`application/gzip`;default:return`application/octet-stream`}}function UT(e,t){return t.startsWith(`image/`)?`image`:t.startsWith(`video/`)?`video`:t.startsWith(`audio/`)?`audio`:t===`application/pdf`?`pdf`:t===`application/msword`||t.includes(`officedocument`)||t.includes(`ms-excel`)||t.includes(`ms-powerpoint`)?`office`:e===`md`||e===`markdown`?`markdown`:JT.has(e)?`code`:YT.has(e)||t.startsWith(`text/`)||t===`application/json`||t===`application/x-ndjson`?`text`:XT.has(e)?`archive`:`binary`}function WT(e){switch(e){case`text`:case`code`:case`markdown`:return`inline_text`;case`image`:case`video`:case`audio`:return`inline_media`;case`pdf`:return`browser`;case`office`:return`share_sheet`;case`archive`:case`binary`:case`unknown`:return`download`}}function GT(e,t){return e===`text`||e===`code`||e===`markdown`||t.startsWith(`text/`)||t===`application/json`||t===`application/x-ndjson`}function KT(e){return e!==`text`&&e!==`code`&&e!==`markdown`}function qT(e,t){if(!e.startsWith(`bytes=`))return null;let n=e.slice(6).trim();if(!n||n.includes(`,`))return null;let[r,i]=n.split(`-`,2);if(r===void 0||i===void 0)return null;let a,o;if(r.length===0){let e=Number(i);if(!Number.isFinite(e)||e<=0)return null;a=Math.max(0,t-e),o=Math.max(0,t-1)}else a=Number(r),o=i.length>0?Number(i):t-1;return!Number.isFinite(a)||!Number.isFinite(o)||a<0||o<a||a>=t?null:(o=Math.min(o,t-1),{start:a,end:o})}const JT=new Set([`ts`,`tsx`,`js`,`jsx`,`mjs`,`cjs`,`py`,`rb`,`go`,`rs`,`java`,`kt`,`swift`,`css`,`scss`,`html`,`sql`,`toml`,`ini`]),YT=new Set([`txt`,`log`,`yaml`,`yml`,`xml`,`csv`,`json`,`jsonl`,`sh`,`zsh`,`bash`]),XT=new Set([`zip`,`tar`,`gz`,`tgz`,`bz2`,`xz`,`7z`]),ZT=new Set([`thread/status/changed`,`skills/changed`,`mcpServer/startupStatus/updated`]),QT=16*1024;function $T(e,t=`full`){if(t!==`compact`||e.length===0)return e;let n=eE(e),r=[];for(let t of e)tE(t,n)||r.push(nE(t));return r}function eE(e){let t=new Set;for(let n of e){let e=uE(n);e?.phase===`completed`&&e.itemKey&&t.add(e.itemKey)}return t}function tE(e,t){let n=dE(e);if(n&&ZT.has(n)||fE(e))return!0;let r=uE(e);if(!r)return!1;let i=mE(r.item);return i?r.phase===`started`?i===`userMessage`||i===`user_message`||i===`agentMessage`||i===`agent_message`||i===`reasoning`&&hE(r.item)?!!(r.itemKey&&t.has(r.itemKey)):!1:i===`reasoning`&&hE(r.item):!1}function nE(e){let t=sE(e);if(!t)return e;let n=lE(t.item);return n?t.replace(rE(t.item,n)):e}function rE(e,t){let n=Buffer.byteLength(t,`utf8`),r=t.split(`
505
505
  `).length,i=iE(t,n,r),a=gE(e.payload),o={...e};if(delete o.aggregatedOutput,delete o.aggregated_output,delete o.output_delta,delete o.outputDelta,o.history_detail_level=`compact`,o.historyDetailLevel=`compact`,o.output_delta=i,Object.keys(a).length>0){let e={...a};delete e.output_delta,delete e.outputDelta,o.payload=e}return i!==t&&(o.history_detail_omitted=!0,o.history_output_omitted=!0,o.history_output_byte_length=n,o.history_output_line_count=r,o.historyDetailOmitted=!0,o.historyOutputOmitted=!0,o.historyOutputByteLength=n,o.historyOutputLineCount=r),o}function iE(e,t,n){if(t<=QT)return e;let r=Math.floor(QT/2),i=QT-r,a=aE(e,0,r),o=oE(e,i),s=Buffer.byteLength(a,`utf8`)+Buffer.byteLength(o,`utf8`);return[`[compact history preview: omitted ${Math.max(0,t-s).toLocaleString(`en-US`)} of ${t.toLocaleString(`en-US`)} bytes across ${n.toLocaleString(`en-US`)} lines]`,``,a,``,`[...]`,``,o].join(`
506
506
  `)}function aE(e,t,n){return Buffer.from(e,`utf8`).subarray(t,n).toString(`utf8`)}function oE(e,t){let n=Buffer.from(e,`utf8`);return n.subarray(Math.max(0,n.length-t)).toString(`utf8`)}function sE(e){if(e.type===`item.completed`||e.type===`item.updated`){let t=gE(e.payload.raw),n=gE(t.item);return cE(n)?{item:n,replace:n=>({...e,payload:{...e.payload,raw:{...t,item:n}}})}:null}if(e.type!==`native.raw`)return null;let t=gE(e.payload.raw),n=gE(t.message),r=gE(n.params),i=_E(n.method)??_E(t.method);if(i===`item/completed`||i===`item/updated`){let i=gE(r.item);return cE(i)?{item:i,replace:i=>({...e,payload:{...e.payload,raw:{...t,message:{...n,params:{...r,item:i}}}}})}:null}if((_E(t.source)??``).startsWith(`codex.history.thread_read`)&&_E(n.scope)===`item`){let r=gE(n.item);return cE(r)?{item:r,replace:r=>({...e,payload:{...e.payload,raw:{...t,message:{...n,item:r}}}})}:null}return null}function cE(e){let t=mE(e);return t===`commandExecution`||t===`command_execution`}function lE(e){let t=gE(e.payload);return _E(e.aggregatedOutput)??_E(e.aggregated_output)??_E(e.output_delta)??_E(e.outputDelta)??_E(t.output_delta)??_E(t.outputDelta)??null}function uE(e){if(e.type===`item.started`||e.type===`item.completed`){let t=gE(gE(e.payload.raw).item);return{phase:e.type===`item.started`?`started`:`completed`,item:t,itemKey:pE(e.sessionId,t)}}if(e.type!==`native.raw`)return null;let t=gE(e.payload.raw),n=gE(t.message),r=gE(n.params),i=_E(n.method)??_E(t.method);if(i===`item/started`||i===`item/completed`){let t=gE(r.item);return{phase:i===`item/started`?`started`:`completed`,item:t,itemKey:pE(e.sessionId,t),nativeMethod:i,nativeMessage:n,nativeParams:r,nativeItemLocation:`params.item`}}if((_E(t.source)??``).startsWith(`codex.history.thread_read`)&&_E(n.scope)===`item`){let t=gE(n.item);return{phase:`completed`,item:t,itemKey:pE(e.sessionId,t),nativeMessage:n,nativeItemLocation:`message.item`}}return null}function dE(e){if(e.type!==`native.raw`)return null;let t=gE(e.payload.raw);return _E(gE(t.message).method)??_E(t.method)??null}function fE(e){if(e.type!==`native.raw`)return!1;let t=gE(e.payload.raw);if(_E(t.source)!==`codex.app_server`)return!1;let n=gE(t.message);return _E(n.method)??_E(t.method)?!1:!!_E(gE(gE(n.result).turn).id)}function pE(e,t){let n=_E(t.id)??_E(t.item_id)??_E(t.itemId);return n?`${e}|${n}`:null}function mE(e){return _E(e.type)??null}function hE(e){let t=Array.isArray(e.summary)?e.summary:[],n=Array.isArray(e.content)?e.content:[];return t.length===0&&n.length===0}function gE(e){return typeof e==`object`&&e?e:{}}function _E(e){return typeof e==`string`&&e.length>0?e:void 0}var vE=class{indexPath;projects=new Map;projectByPath=new Map;ready;writeQueue=Promise.resolve();constructor(e){this.baseDir=e,this.indexPath=p.default.join(e,`project-index.json`),this.ready=this.loadFromDisk()}async upsertByPath(e,t){await this.ready;let n=await xE(e),r=this.projectByPath.get(n),i=new Date().toISOString(),a=bE({existing:r,canonicalPath:n,title:yE(t)??void 0,now:i});return r&&r.id!==a.id&&this.projects.delete(r.id),this.projects.set(a.id,a),this.projectByPath.set(n,a),await this.enqueueWrite(async()=>{await this.persistIndex()}),a}async list(){return await this.ready,[...this.projects.values()].sort((e,t)=>e.title.localeCompare(t.title))}async getById(e){return await this.ready,this.projects.get(e)}async getByPath(e){await this.ready;let t=await xE(e);return this.projectByPath.get(t)}async remove(e){await this.ready;let t=this.projects.get(e);return t?(this.projects.delete(e),this.projectByPath.delete(t.path),await this.enqueueWrite(async()=>{await this.persistIndex()}),!0):!1}async loadFromDisk(){await d.default.mkdir(this.baseDir,{recursive:!0});try{let e=await d.default.readFile(this.indexPath,`utf8`),t=JSON.parse(e);if(t.v!==1||!Array.isArray(t.projects))return;for(let e of t.projects)if(!(typeof e?.id!=`string`||typeof e?.title!=`string`||typeof e?.path!=`string`||typeof e?.createdAt!=`string`||typeof e?.updatedAt!=`string`)){if(e.id!==e.path)throw Error(`Legacy tracked project ids are no longer supported in ${this.indexPath}; clear the project store and restart the gateway.`);this.projects.set(e.id,e),this.projectByPath.set(e.path,e)}}catch(e){if(e.code!==`ENOENT`)throw e}}async persistIndex(){await d.default.mkdir(this.baseDir,{recursive:!0});let e={v:1,projects:[...this.projects.values()].sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt))};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}};function yE(e){if(typeof e==`string`)return e.replace(/\s+/g,` `).trim()||void 0}function bE(e){let t=p.default.basename(e.canonicalPath)||e.canonicalPath;return e.existing?{...e.existing,id:e.canonicalPath,path:e.canonicalPath,title:e.title??yE(e.existing.title)??t,updatedAt:e.now}:{id:e.canonicalPath,title:e.title??t,path:e.canonicalPath,createdAt:e.now,updatedAt:e.now}}async function xE(e){if(!p.default.isAbsolute(e))throw Error(`Project path must be absolute: ${e}`);let t=p.default.resolve(e),n;try{n=await d.default.stat(t)}catch(e){throw Error(`Project path does not exist: ${t}; ${String(e)}`)}if(!n.isDirectory())throw Error(`Project path is not a directory: ${t}`);return d.default.realpath(t)}var SE=o(((e,t)=>{let n=[`nodebuffer`,`arraybuffer`,`fragments`],r=typeof Blob<`u`;r&&n.push(`blob`),t.exports={BINARY_TYPES:n,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:`258EAFA5-E914-47DA-95CA-C5AB0DC85B11`,hasBlob:r,kForOnEventAttribute:Symbol(`kIsForOnEventAttribute`),kListener:Symbol(`kListener`),kStatusCode:Symbol(`status-code`),kWebSocket:Symbol(`websocket`),NOOP:()=>{}}})),CE=o(((e,t)=>{let{EMPTY_BUFFER:n}=SE(),r=Buffer[Symbol.species];function i(e,t){if(e.length===0)return n;if(e.length===1)return e[0];let i=Buffer.allocUnsafe(t),a=0;for(let t=0;t<e.length;t++){let n=e[t];i.set(n,a),a+=n.length}return a<t?new r(i.buffer,i.byteOffset,a):i}function a(e,t,n,r,i){for(let a=0;a<i;a++)n[r+a]=e[a]^t[a&3]}function o(e,t){for(let n=0;n<e.length;n++)e[n]^=t[n&3]}function s(e){return e.length===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.length)}function c(e){if(c.readOnly=!0,Buffer.isBuffer(e))return e;let t;return e instanceof ArrayBuffer?t=new r(e):ArrayBuffer.isView(e)?t=new r(e.buffer,e.byteOffset,e.byteLength):(t=Buffer.from(e),c.readOnly=!1),t}if(t.exports={concat:i,mask:a,toArrayBuffer:s,toBuffer:c,unmask:o},!process.env.WS_NO_BUFFER_UTIL)try{let e=require(`bufferutil`);t.exports.mask=function(t,n,r,i,o){o<48?a(t,n,r,i,o):e.mask(t,n,r,i,o)},t.exports.unmask=function(t,n){t.length<32?o(t,n):e.unmask(t,n)}}catch{}})),wE=o(((e,t)=>{let n=Symbol(`kDone`),r=Symbol(`kRun`);t.exports=class{constructor(e){this[n]=()=>{this.pending--,this[r]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[r]()}[r](){if(this.pending!==this.concurrency&&this.jobs.length){let e=this.jobs.shift();this.pending++,e(this[n])}}}})),TE=o(((e,t)=>{let n=require(`zlib`),r=CE(),i=wE(),{kStatusCode:a}=SE(),o=Buffer[Symbol.species],s=Buffer.from([0,0,255,255]),c=Symbol(`permessage-deflate`),l=Symbol(`total-length`),u=Symbol(`callback`),d=Symbol(`buffers`),f=Symbol(`error`),p;t.exports=class{constructor(e,t,n){this._maxPayload=n|0,this._options=e||{},this._threshold=this._options.threshold===void 0?1024:this._options.threshold,this._isServer=!!t,this._deflate=null,this._inflate=null,this.params=null,p||=new i(this._options.concurrencyLimit===void 0?10:this._options.concurrencyLimit)}static get extensionName(){return`permessage-deflate`}offer(){let e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits??(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&=(this._inflate.close(),null),this._deflate){let e=this._deflate[u];this._deflate.close(),this._deflate=null,e&&e(Error(`The deflate stream was closed while data was being processed`))}}acceptAsServer(e){let t=this._options,n=e.find(e=>!(t.serverNoContextTakeover===!1&&e.server_no_context_takeover||e.server_max_window_bits&&(t.serverMaxWindowBits===!1||typeof t.serverMaxWindowBits==`number`&&t.serverMaxWindowBits>e.server_max_window_bits)||typeof t.clientMaxWindowBits==`number`&&!e.client_max_window_bits));if(!n)throw Error(`None of the extension offers can be accepted`);return t.serverNoContextTakeover&&(n.server_no_context_takeover=!0),t.clientNoContextTakeover&&(n.client_no_context_takeover=!0),typeof t.serverMaxWindowBits==`number`&&(n.server_max_window_bits=t.serverMaxWindowBits),typeof t.clientMaxWindowBits==`number`?n.client_max_window_bits=t.clientMaxWindowBits:(n.client_max_window_bits===!0||t.clientMaxWindowBits===!1)&&delete n.client_max_window_bits,n}acceptAsClient(e){let t=e[0];if(this._options.clientNoContextTakeover===!1&&t.client_no_context_takeover)throw Error(`Unexpected parameter "client_no_context_takeover"`);if(!t.client_max_window_bits)typeof this._options.clientMaxWindowBits==`number`&&(t.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits==`number`&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw Error(`Unexpected or invalid parameter "client_max_window_bits"`);return t}normalizeParams(e){return e.forEach(e=>{Object.keys(e).forEach(t=>{let n=e[t];if(n.length>1)throw Error(`Parameter "${t}" must have only a single value`);if(n=n[0],t===`client_max_window_bits`){if(n!==!0){let e=+n;if(!Number.isInteger(e)||e<8||e>15)throw TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(!this._isServer)throw TypeError(`Invalid value for parameter "${t}": ${n}`)}else if(t===`server_max_window_bits`){let e=+n;if(!Number.isInteger(e)||e<8||e>15)throw TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(t===`client_no_context_takeover`||t===`server_no_context_takeover`){if(n!==!0)throw TypeError(`Invalid value for parameter "${t}": ${n}`)}else throw Error(`Unknown parameter "${t}"`);e[t]=n})}),e}decompress(e,t,n){p.add(r=>{this._decompress(e,t,(e,t)=>{r(),n(e,t)})})}compress(e,t,n){p.add(r=>{this._compress(e,t,(e,t)=>{r(),n(e,t)})})}_decompress(e,t,i){let a=this._isServer?`client`:`server`;if(!this._inflate){let e=`${a}_max_window_bits`,t=typeof this.params[e]==`number`?this.params[e]:n.Z_DEFAULT_WINDOWBITS;this._inflate=n.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t}),this._inflate[c]=this,this._inflate[l]=0,this._inflate[d]=[],this._inflate.on(`error`,g),this._inflate.on(`data`,h)}this._inflate[u]=i,this._inflate.write(e),t&&this._inflate.write(s),this._inflate.flush(()=>{let e=this._inflate[f];if(e){this._inflate.close(),this._inflate=null,i(e);return}let n=r.concat(this._inflate[d],this._inflate[l]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[l]=0,this._inflate[d]=[],t&&this.params[`${a}_no_context_takeover`]&&this._inflate.reset()),i(null,n)})}_compress(e,t,i){let a=this._isServer?`server`:`client`;if(!this._deflate){let e=`${a}_max_window_bits`,t=typeof this.params[e]==`number`?this.params[e]:n.Z_DEFAULT_WINDOWBITS;this._deflate=n.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t}),this._deflate[l]=0,this._deflate[d]=[],this._deflate.on(`data`,m)}this._deflate[u]=i,this._deflate.write(e),this._deflate.flush(n.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let e=r.concat(this._deflate[d],this._deflate[l]);t&&(e=new o(e.buffer,e.byteOffset,e.length-4)),this._deflate[u]=null,this._deflate[l]=0,this._deflate[d]=[],t&&this.params[`${a}_no_context_takeover`]&&this._deflate.reset(),i(null,e)})}};function m(e){this[d].push(e),this[l]+=e.length}function h(e){if(this[l]+=e.length,this[c]._maxPayload<1||this[l]<=this[c]._maxPayload){this[d].push(e);return}this[f]=RangeError(`Max payload size exceeded`),this[f].code=`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`,this[f][a]=1009,this.removeListener(`data`,h),this.reset()}function g(e){if(this[c]._inflate=null,this[f]){this[u](this[f]);return}e[a]=1007,this[u](e)}})),EE=o(((e,t)=>{let{isUtf8:n}=require(`buffer`),{hasBlob:r}=SE(),i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function a(e){return e>=1e3&&e<=1014&&e!==1004&&e!==1005&&e!==1006||e>=3e3&&e<=4999}function o(e){let t=e.length,n=0;for(;n<t;)if(!(e[n]&128))n++;else if((e[n]&224)==192){if(n+1===t||(e[n+1]&192)!=128||(e[n]&254)==192)return!1;n+=2}else if((e[n]&240)==224){if(n+2>=t||(e[n+1]&192)!=128||(e[n+2]&192)!=128||e[n]===224&&(e[n+1]&224)==128||e[n]===237&&(e[n+1]&224)==160)return!1;n+=3}else if((e[n]&248)==240){if(n+3>=t||(e[n+1]&192)!=128||(e[n+2]&192)!=128||(e[n+3]&192)!=128||e[n]===240&&(e[n+1]&240)==128||e[n]===244&&e[n+1]>143||e[n]>244)return!1;n+=4}else return!1;return!0}function s(e){return r&&typeof e==`object`&&typeof e.arrayBuffer==`function`&&typeof e.type==`string`&&typeof e.stream==`function`&&(e[Symbol.toStringTag]===`Blob`||e[Symbol.toStringTag]===`File`)}if(t.exports={isBlob:s,isValidStatusCode:a,isValidUTF8:o,tokenChars:i},n)t.exports.isValidUTF8=function(e){return e.length<24?o(e):n(e)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let e=require(`utf-8-validate`);t.exports.isValidUTF8=function(t){return t.length<32?o(t):e(t)}}catch{}})),DE=o(((e,t)=>{let{Writable:n}=require(`stream`),r=TE(),{BINARY_TYPES:i,EMPTY_BUFFER:a,kStatusCode:o,kWebSocket:s}=SE(),{concat:c,toArrayBuffer:l,unmask:u}=CE(),{isValidStatusCode:d,isValidUTF8:f}=EE(),p=Buffer[Symbol.species];t.exports=class extends n{constructor(e={}){super(),this._allowSynchronousEvents=e.allowSynchronousEvents===void 0?!0:e.allowSynchronousEvents,this._binaryType=e.binaryType||i[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=e.maxPayload|0,this._skipUTF8Validation=!!e.skipUTF8Validation,this[s]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=0}_write(e,t,n){if(this._opcode===8&&this._state==0)return n();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(n)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){let t=this._buffers[0];return this._buffers[0]=new p(t.buffer,t.byteOffset+e,t.length-e),new p(t.buffer,t.byteOffset,e)}let t=Buffer.allocUnsafe(e);do{let n=this._buffers[0],r=t.length-e;e>=n.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(n.buffer,n.byteOffset,e),r),this._buffers[0]=new p(n.buffer,n.byteOffset+e,n.length-e)),e-=n.length}while(e>0);return t}startLoop(e){this._loop=!0;do switch(this._state){case 0:this.getInfo(e);break;case 1:this.getPayloadLength16(e);break;case 2:this.getPayloadLength64(e);break;case 3:this.getMask();break;case 4:this.getData(e);break;case 5:case 6:this._loop=!1;return}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2){this._loop=!1;return}let t=this.consume(2);if(t[0]&48){e(this.createError(RangeError,`RSV2 and RSV3 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_2_3`));return}let n=(t[0]&64)==64;if(n&&!this._extensions[r.extensionName]){e(this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`));return}if(this._fin=(t[0]&128)==128,this._opcode=t[0]&15,this._payloadLength=t[1]&127,this._opcode===0){if(n){e(this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`));return}if(!this._fragmented){e(this.createError(RangeError,`invalid opcode 0`,!0,1002,`WS_ERR_INVALID_OPCODE`));return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,`WS_ERR_INVALID_OPCODE`));return}this._compressed=n}else if(this._opcode>7&&this._opcode<11){if(!this._fin){e(this.createError(RangeError,`FIN must be set`,!0,1002,`WS_ERR_EXPECTED_FIN`));return}if(n){e(this.createError(RangeError,`RSV1 must be clear`,!0,1002,`WS_ERR_UNEXPECTED_RSV_1`));return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){e(this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,`WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH`));return}}else{e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,`WS_ERR_INVALID_OPCODE`));return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(t[1]&128)==128,this._isServer){if(!this._masked){e(this.createError(RangeError,`MASK must be set`,!0,1002,`WS_ERR_EXPECTED_MASK`));return}}else if(this._masked){e(this.createError(RangeError,`MASK must be clear`,!0,1002,`WS_ERR_UNEXPECTED_MASK`));return}this._payloadLength===126?this._state=1:this._payloadLength===127?this._state=2:this.haveLength(e)}getPayloadLength16(e){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e)}getPayloadLength64(e){if(this._bufferedBytes<8){this._loop=!1;return}let t=this.consume(8),n=t.readUInt32BE(0);if(n>2**21-1){e(this.createError(RangeError,`Unsupported WebSocket frame: payload length > 2^53 - 1`,!1,1009,`WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH`));return}this._payloadLength=n*2**32+t.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){e(this.createError(RangeError,`Max payload size exceeded`,!1,1009,`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`));return}this._masked?this._state=3:this._state=4}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=4}getData(e){let t=a;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}t=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&u(t,this._mask)}if(this._opcode>7){this.controlMessage(t,e);return}if(this._compressed){this._state=5,this.decompress(t,e);return}t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage(e)}decompress(e,t){this._extensions[r.extensionName].decompress(e,this._fin,(e,n)=>{if(e)return t(e);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0){t(this.createError(RangeError,`Max payload size exceeded`,!1,1009,`WS_ERR_UNSUPPORTED_MESSAGE_LENGTH`));return}this._fragments.push(n)}this.dataMessage(t),this._state===0&&this.startLoop(t)})}dataMessage(e){if(!this._fin){this._state=0;return}let t=this._messageLength,n=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let r;r=this._binaryType===`nodebuffer`?c(n,t):this._binaryType===`arraybuffer`?l(c(n,t)):this._binaryType===`blob`?new Blob(n):n,this._allowSynchronousEvents?(this.emit(`message`,r,!0),this._state=0):(this._state=6,setImmediate(()=>{this.emit(`message`,r,!0),this._state=0,this.startLoop(e)}))}else{let r=c(n,t);if(!this._skipUTF8Validation&&!f(r)){e(this.createError(Error,`invalid UTF-8 sequence`,!0,1007,`WS_ERR_INVALID_UTF8`));return}this._state===5||this._allowSynchronousEvents?(this.emit(`message`,r,!1),this._state=0):(this._state=6,setImmediate(()=>{this.emit(`message`,r,!1),this._state=0,this.startLoop(e)}))}}controlMessage(e,t){if(this._opcode===8){if(e.length===0)this._loop=!1,this.emit(`conclude`,1005,a),this.end();else{let n=e.readUInt16BE(0);if(!d(n)){t(this.createError(RangeError,`invalid status code ${n}`,!0,1002,`WS_ERR_INVALID_CLOSE_CODE`));return}let r=new p(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!f(r)){t(this.createError(Error,`invalid UTF-8 sequence`,!0,1007,`WS_ERR_INVALID_UTF8`));return}this._loop=!1,this.emit(`conclude`,n,r),this.end()}this._state=0;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?`ping`:`pong`,e),this._state=0):(this._state=6,setImmediate(()=>{this.emit(this._opcode===9?`ping`:`pong`,e),this._state=0,this.startLoop(t)}))}createError(e,t,n,r,i){this._loop=!1,this._errored=!0;let a=new e(n?`Invalid WebSocket frame: ${t}`:t);return Error.captureStackTrace(a,this.createError),a.code=i,a[o]=r,a}}})),OE=o(((e,t)=>{let{Duplex:n}=require(`stream`),{randomFillSync:r}=require(`crypto`),i=TE(),{EMPTY_BUFFER:a,kWebSocket:o,NOOP:s}=SE(),{isBlob:c,isValidStatusCode:l}=EE(),{mask:u,toBuffer:d}=CE(),f=Symbol(`kByteLength`),p=Buffer.alloc(4),m=8*1024,h,g=m;t.exports=class e{constructor(e,t,n){this._extensions=t||{},n&&(this._generateMask=n,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=0,this.onerror=s,this[o]=void 0}static frame(e,t){let n,i=!1,a=2,o=!1;t.mask&&(n=t.maskBuffer||p,t.generateMask?t.generateMask(n):(g===m&&(h===void 0&&(h=Buffer.alloc(m)),r(h,0,m),g=0),n[0]=h[g++],n[1]=h[g++],n[2]=h[g++],n[3]=h[g++]),o=(n[0]|n[1]|n[2]|n[3])===0,a=6);let s;typeof e==`string`?(!t.mask||o)&&t[f]!==void 0?s=t[f]:(e=Buffer.from(e),s=e.length):(s=e.length,i=t.mask&&t.readOnly&&!o);let c=s;s>=65536?(a+=8,c=127):s>125&&(a+=2,c=126);let l=Buffer.allocUnsafe(i?s+a:a);return l[0]=t.fin?t.opcode|128:t.opcode,t.rsv1&&(l[0]|=64),l[1]=c,c===126?l.writeUInt16BE(s,2):c===127&&(l[2]=l[3]=0,l.writeUIntBE(s,4,6)),!t.mask||(l[1]|=128,l[a-4]=n[0],l[a-3]=n[1],l[a-2]=n[2],l[a-1]=n[3],o)?[l,e]:i?(u(e,n,l,a,s),[l]):(u(e,n,e,0,s),[l,e])}close(t,n,r,i){let o;if(t===void 0)o=a;else if(typeof t!=`number`||!l(t))throw TypeError(`First argument must be a valid error code number`);else if(n===void 0||!n.length)o=Buffer.allocUnsafe(2),o.writeUInt16BE(t,0);else{let e=Buffer.byteLength(n);if(e>123)throw RangeError(`The message must not be greater than 123 bytes`);o=Buffer.allocUnsafe(2+e),o.writeUInt16BE(t,0),typeof n==`string`?o.write(n,2):o.set(n,2)}let s={[f]:o.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state===0?this.sendFrame(e.frame(o,s),i):this.enqueue([this.dispatch,o,!1,s,i])}ping(t,n,r){let i,a;if(typeof t==`string`?(i=Buffer.byteLength(t),a=!1):c(t)?(i=t.size,a=!1):(t=d(t),i=t.length,a=d.readOnly),i>125)throw RangeError(`The data size must not be greater than 125 bytes`);let o={[f]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:9,readOnly:a,rsv1:!1};c(t)?this._state===0?this.getBlobData(t,!1,o,r):this.enqueue([this.getBlobData,t,!1,o,r]):this._state===0?this.sendFrame(e.frame(t,o),r):this.enqueue([this.dispatch,t,!1,o,r])}pong(t,n,r){let i,a;if(typeof t==`string`?(i=Buffer.byteLength(t),a=!1):c(t)?(i=t.size,a=!1):(t=d(t),i=t.length,a=d.readOnly),i>125)throw RangeError(`The data size must not be greater than 125 bytes`);let o={[f]:i,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:10,readOnly:a,rsv1:!1};c(t)?this._state===0?this.getBlobData(t,!1,o,r):this.enqueue([this.getBlobData,t,!1,o,r]):this._state===0?this.sendFrame(e.frame(t,o),r):this.enqueue([this.dispatch,t,!1,o,r])}send(e,t,n){let r=this._extensions[i.extensionName],a=t.binary?2:1,o=t.compress,s,l;typeof e==`string`?(s=Buffer.byteLength(e),l=!1):c(e)?(s=e.size,l=!1):(e=d(e),s=e.length,l=d.readOnly),this._firstFragment?(this._firstFragment=!1,o&&r&&r.params[r._isServer?`server_no_context_takeover`:`client_no_context_takeover`]&&(o=s>=r._threshold),this._compress=o):(o=!1,a=0),t.fin&&(this._firstFragment=!0);let u={[f]:s,fin:t.fin,generateMask:this._generateMask,mask:t.mask,maskBuffer:this._maskBuffer,opcode:a,readOnly:l,rsv1:o};c(e)?this._state===0?this.getBlobData(e,this._compress,u,n):this.enqueue([this.getBlobData,e,this._compress,u,n]):this._state===0?this.dispatch(e,this._compress,u,n):this.enqueue([this.dispatch,e,this._compress,u,n])}getBlobData(t,n,r,i){this._bufferedBytes+=r[f],this._state=2,t.arrayBuffer().then(t=>{if(this._socket.destroyed){let e=Error(`The socket was closed while the blob was being read`);process.nextTick(_,this,e,i);return}this._bufferedBytes-=r[f];let a=d(t);n?this.dispatch(a,n,r,i):(this._state=0,this.sendFrame(e.frame(a,r),i),this.dequeue())}).catch(e=>{process.nextTick(v,this,e,i)})}dispatch(t,n,r,a){if(!n){this.sendFrame(e.frame(t,r),a);return}let o=this._extensions[i.extensionName];this._bufferedBytes+=r[f],this._state=1,o.compress(t,r.fin,(t,n)=>{if(this._socket.destroyed){_(this,Error(`The socket was closed while data was being compressed`),a);return}this._bufferedBytes-=r[f],this._state=0,r.readOnly=!1,this.sendFrame(e.frame(n,r),a),this.dequeue()})}dequeue(){for(;this._state===0&&this._queue.length;){let e=this._queue.shift();this._bufferedBytes-=e[3][f],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][f],this._queue.push(e)}sendFrame(e,t){e.length===2?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],t),this._socket.uncork()):this._socket.write(e[0],t)}};function _(e,t,n){typeof n==`function`&&n(t);for(let n=0;n<e._queue.length;n++){let r=e._queue[n],i=r[r.length-1];typeof i==`function`&&i(t)}}function v(e,t,n){_(e,t,n),e.onerror(t)}})),kE=o(((e,t)=>{let{kForOnEventAttribute:n,kListener:r}=SE(),i=Symbol(`kCode`),a=Symbol(`kData`),o=Symbol(`kError`),s=Symbol(`kMessage`),c=Symbol(`kReason`),l=Symbol(`kTarget`),u=Symbol(`kType`),d=Symbol(`kWasClean`);var f=class{constructor(e){this[l]=null,this[u]=e}get target(){return this[l]}get type(){return this[u]}};Object.defineProperty(f.prototype,`target`,{enumerable:!0}),Object.defineProperty(f.prototype,`type`,{enumerable:!0});var p=class extends f{constructor(e,t={}){super(e),this[i]=t.code===void 0?0:t.code,this[c]=t.reason===void 0?``:t.reason,this[d]=t.wasClean===void 0?!1:t.wasClean}get code(){return this[i]}get reason(){return this[c]}get wasClean(){return this[d]}};Object.defineProperty(p.prototype,`code`,{enumerable:!0}),Object.defineProperty(p.prototype,`reason`,{enumerable:!0}),Object.defineProperty(p.prototype,`wasClean`,{enumerable:!0});var m=class extends f{constructor(e,t={}){super(e),this[o]=t.error===void 0?null:t.error,this[s]=t.message===void 0?``:t.message}get error(){return this[o]}get message(){return this[s]}};Object.defineProperty(m.prototype,`error`,{enumerable:!0}),Object.defineProperty(m.prototype,`message`,{enumerable:!0});var h=class extends f{constructor(e,t={}){super(e),this[a]=t.data===void 0?null:t.data}get data(){return this[a]}};Object.defineProperty(h.prototype,`data`,{enumerable:!0}),t.exports={CloseEvent:p,ErrorEvent:m,Event:f,EventTarget:{addEventListener(e,t,i={}){for(let a of this.listeners(e))if(!i[n]&&a[r]===t&&!a[n])return;let a;if(e===`message`)a=function(e,n){let r=new h(`message`,{data:n?e:e.toString()});r[l]=this,g(t,this,r)};else if(e===`close`)a=function(e,n){let r=new p(`close`,{code:e,reason:n.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[l]=this,g(t,this,r)};else if(e===`error`)a=function(e){let n=new m(`error`,{error:e,message:e.message});n[l]=this,g(t,this,n)};else if(e===`open`)a=function(){let e=new f(`open`);e[l]=this,g(t,this,e)};else return;a[n]=!!i[n],a[r]=t,i.once?this.once(e,a):this.on(e,a)},removeEventListener(e,t){for(let i of this.listeners(e))if(i[r]===t&&!i[n]){this.removeListener(e,i);break}}},MessageEvent:h};function g(e,t,n){typeof e==`object`&&e.handleEvent?e.handleEvent.call(e,n):e.call(t,n)}})),AE=o(((e,t)=>{let{tokenChars:n}=EE();function r(e,t,n){e[t]===void 0?e[t]=[n]:e[t].push(n)}function i(e){let t=Object.create(null),i=Object.create(null),a=!1,o=!1,s=!1,c,l,u=-1,d=-1,f=-1,p=0;for(;p<e.length;p++)if(d=e.charCodeAt(p),c===void 0)if(f===-1&&n[d]===1)u===-1&&(u=p);else if(p!==0&&(d===32||d===9))f===-1&&u!==-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p);let n=e.slice(u,f);d===44?(r(t,n,i),i=Object.create(null)):c=n,u=f=-1}else throw SyntaxError(`Unexpected character at index ${p}`);else if(l===void 0)if(f===-1&&n[d]===1)u===-1&&(u=p);else if(d===32||d===9)f===-1&&u!==-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p),r(i,e.slice(u,f),!0),d===44&&(r(t,c,i),i=Object.create(null),c=void 0),u=f=-1}else if(d===61&&u!==-1&&f===-1)l=e.slice(u,p),u=f=-1;else throw SyntaxError(`Unexpected character at index ${p}`);else if(o){if(n[d]!==1)throw SyntaxError(`Unexpected character at index ${p}`);u===-1?u=p:a||=!0,o=!1}else if(s)if(n[d]===1)u===-1&&(u=p);else if(d===34&&u!==-1)s=!1,f=p;else if(d===92)o=!0;else throw SyntaxError(`Unexpected character at index ${p}`);else if(d===34&&e.charCodeAt(p-1)===61)s=!0;else if(f===-1&&n[d]===1)u===-1&&(u=p);else if(u!==-1&&(d===32||d===9))f===-1&&(f=p);else if(d===59||d===44){if(u===-1)throw SyntaxError(`Unexpected character at index ${p}`);f===-1&&(f=p);let n=e.slice(u,f);a&&=(n=n.replace(/\\/g,``),!1),r(i,l,n),d===44&&(r(t,c,i),i=Object.create(null),c=void 0),l=void 0,u=f=-1}else throw SyntaxError(`Unexpected character at index ${p}`);if(u===-1||s||d===32||d===9)throw SyntaxError(`Unexpected end of input`);f===-1&&(f=p);let m=e.slice(u,f);return c===void 0?r(t,m,i):(l===void 0?r(i,m,!0):a?r(i,l,m.replace(/\\/g,``)):r(i,l,m),r(t,c,i)),t}function a(e){return Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>[t].concat(Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>e===!0?t:`${t}=${e}`).join(`; `)})).join(`; `)).join(`, `)}).join(`, `)}t.exports={format:a,parse:i}})),jE=o(((e,t)=>{let n=require(`events`),r=require(`https`),i=require(`http`),a=require(`net`),o=require(`tls`),{randomBytes:s,createHash:c}=require(`crypto`),{Duplex:l,Readable:u}=require(`stream`),{URL:d}=require(`url`),f=TE(),p=DE(),m=OE(),{isBlob:h}=EE(),{BINARY_TYPES:g,CLOSE_TIMEOUT:_,EMPTY_BUFFER:v,GUID:y,kForOnEventAttribute:b,kListener:x,kStatusCode:S,kWebSocket:C,NOOP:w}=SE(),{EventTarget:{addEventListener:T,removeEventListener:E}}=kE(),{format:D,parse:O}=AE(),{toBuffer:k}=CE(),A=Symbol(`kAborted`),j=[8,13],M=[`CONNECTING`,`OPEN`,`CLOSING`,`CLOSED`],N=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;var P=class e extends n{constructor(t,n,r){super(),this._binaryType=g[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=v,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol=``,this._readyState=e.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,t===null?(this._autoPong=r.autoPong,this._closeTimeout=r.closeTimeout,this._isServer=!0):(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,n===void 0?n=[]:Array.isArray(n)||(typeof n==`object`&&n?(r=n,n=[]):n=[n]),F(this,t,n,r))}get binaryType(){return this._binaryType}set binaryType(e){g.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(t,n,r){let i=new p({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),a=new m(t,this._extensions,r.generateMask);this._receiver=i,this._sender=a,this._socket=t,i[C]=this,a[C]=this,t[C]=this,i.on(`conclude`,B),i.on(`drain`,V),i.on(`error`,te),i.on(`message`,ne),i.on(`ping`,re),i.on(`pong`,ie),a.onerror=oe,t.setTimeout&&t.setTimeout(0),t.setNoDelay&&t.setNoDelay(),n.length>0&&t.unshift(n),t.on(`close`,ce),t.on(`data`,le),t.on(`end`,ue),t.on(`error`,de),this._readyState=e.OPEN,this.emit(`open`)}emitClose(){if(!this._socket){this._readyState=e.CLOSED,this.emit(`close`,this._closeCode,this._closeMessage);return}this._extensions[f.extensionName]&&this._extensions[f.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=e.CLOSED,this.emit(`close`,this._closeCode,this._closeMessage)}close(t,n){if(this.readyState!==e.CLOSED){if(this.readyState===e.CONNECTING){z(this,this._req,`WebSocket was closed before the connection was established`);return}if(this.readyState===e.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=e.CLOSING,this._sender.close(t,n,!this._isServer,e=>{e||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),se(this)}}pause(){this.readyState===e.CONNECTING||this.readyState===e.CLOSED||(this._paused=!0,this._socket.pause())}ping(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof t==`function`?(r=t,t=n=void 0):typeof n==`function`&&(r=n,n=void 0),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){ee(this,t,r);return}n===void 0&&(n=!this._isServer),this._sender.ping(t||v,n,r)}pong(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof t==`function`?(r=t,t=n=void 0):typeof n==`function`&&(r=n,n=void 0),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){ee(this,t,r);return}n===void 0&&(n=!this._isServer),this._sender.pong(t||v,n,r)}resume(){this.readyState===e.CONNECTING||this.readyState===e.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(t,n,r){if(this.readyState===e.CONNECTING)throw Error(`WebSocket is not open: readyState 0 (CONNECTING)`);if(typeof n==`function`&&(r=n,n={}),typeof t==`number`&&(t=t.toString()),this.readyState!==e.OPEN){ee(this,t,r);return}let i={binary:typeof t!=`string`,mask:!this._isServer,compress:!0,fin:!0,...n};this._extensions[f.extensionName]||(i.compress=!1),this._sender.send(t||v,i,r)}terminate(){if(this.readyState!==e.CLOSED){if(this.readyState===e.CONNECTING){z(this,this._req,`WebSocket was closed before the connection was established`);return}this._socket&&(this._readyState=e.CLOSING,this._socket.destroy())}}};Object.defineProperty(P,`CONNECTING`,{enumerable:!0,value:M.indexOf(`CONNECTING`)}),Object.defineProperty(P.prototype,`CONNECTING`,{enumerable:!0,value:M.indexOf(`CONNECTING`)}),Object.defineProperty(P,`OPEN`,{enumerable:!0,value:M.indexOf(`OPEN`)}),Object.defineProperty(P.prototype,`OPEN`,{enumerable:!0,value:M.indexOf(`OPEN`)}),Object.defineProperty(P,`CLOSING`,{enumerable:!0,value:M.indexOf(`CLOSING`)}),Object.defineProperty(P.prototype,`CLOSING`,{enumerable:!0,value:M.indexOf(`CLOSING`)}),Object.defineProperty(P,`CLOSED`,{enumerable:!0,value:M.indexOf(`CLOSED`)}),Object.defineProperty(P.prototype,`CLOSED`,{enumerable:!0,value:M.indexOf(`CLOSED`)}),[`binaryType`,`bufferedAmount`,`extensions`,`isPaused`,`protocol`,`readyState`,`url`].forEach(e=>{Object.defineProperty(P.prototype,e,{enumerable:!0})}),[`open`,`error`,`close`,`message`].forEach(e=>{Object.defineProperty(P.prototype,`on${e}`,{enumerable:!0,get(){for(let t of this.listeners(e))if(t[b])return t[x];return null},set(t){for(let t of this.listeners(e))if(t[b]){this.removeListener(e,t);break}typeof t==`function`&&this.addEventListener(e,t,{[b]:!0})}})}),P.prototype.addEventListener=T,P.prototype.removeEventListener=E,t.exports=P;function F(e,t,n,a){let o={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:_,protocolVersion:j[1],maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...a,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:`GET`,host:void 0,path:void 0,port:void 0};if(e._autoPong=o.autoPong,e._closeTimeout=o.closeTimeout,!j.includes(o.protocolVersion))throw RangeError(`Unsupported protocol version: ${o.protocolVersion} (supported versions: ${j.join(`, `)})`);let l;if(t instanceof d)l=t;else try{l=new d(t)}catch{throw SyntaxError(`Invalid URL: ${t}`)}l.protocol===`http:`?l.protocol=`ws:`:l.protocol===`https:`&&(l.protocol=`wss:`),e._url=l.href;let u=l.protocol===`wss:`,p=l.protocol===`ws+unix:`,m;if(l.protocol!==`ws:`&&!u&&!p?m=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:p&&!l.pathname?m=`The URL's pathname is empty`:l.hash&&(m=`The URL contains a fragment identifier`),m){let t=SyntaxError(m);if(e._redirects===0)throw t;I(e,t);return}let h=u?443:80,g=s(16).toString(`base64`),v=u?r.request:i.request,b=new Set,x;if(o.createConnection=o.createConnection||(u?R:L),o.defaultPort=o.defaultPort||h,o.port=l.port||h,o.host=l.hostname.startsWith(`[`)?l.hostname.slice(1,-1):l.hostname,o.headers={...o.headers,"Sec-WebSocket-Version":o.protocolVersion,"Sec-WebSocket-Key":g,Connection:`Upgrade`,Upgrade:`websocket`},o.path=l.pathname+l.search,o.timeout=o.handshakeTimeout,o.perMessageDeflate&&(x=new f(o.perMessageDeflate===!0?{}:o.perMessageDeflate,!1,o.maxPayload),o.headers[`Sec-WebSocket-Extensions`]=D({[f.extensionName]:x.offer()})),n.length){for(let e of n){if(typeof e!=`string`||!N.test(e)||b.has(e))throw SyntaxError(`An invalid or duplicated subprotocol was specified`);b.add(e)}o.headers[`Sec-WebSocket-Protocol`]=n.join(`,`)}if(o.origin&&(o.protocolVersion<13?o.headers[`Sec-WebSocket-Origin`]=o.origin:o.headers.Origin=o.origin),(l.username||l.password)&&(o.auth=`${l.username}:${l.password}`),p){let e=o.path.split(`:`);o.socketPath=e[0],o.path=e[1]}let S;if(o.followRedirects){if(e._redirects===0){e._originalIpc=p,e._originalSecure=u,e._originalHostOrSocketPath=p?o.socketPath:l.host;let t=a&&a.headers;if(a={...a,headers:{}},t)for(let[e,n]of Object.entries(t))a.headers[e.toLowerCase()]=n}else if(e.listenerCount(`redirect`)===0){let t=p?e._originalIpc?o.socketPath===e._originalHostOrSocketPath:!1:e._originalIpc?!1:l.host===e._originalHostOrSocketPath;(!t||e._originalSecure&&!u)&&(delete o.headers.authorization,delete o.headers.cookie,t||delete o.headers.host,o.auth=void 0)}o.auth&&!a.headers.authorization&&(a.headers.authorization=`Basic `+Buffer.from(o.auth).toString(`base64`)),S=e._req=v(o),e._redirects&&e.emit(`redirect`,e.url,S)}else S=e._req=v(o);o.timeout&&S.on(`timeout`,()=>{z(e,S,`Opening handshake has timed out`)}),S.on(`error`,t=>{S===null||S[A]||(S=e._req=null,I(e,t))}),S.on(`response`,r=>{let i=r.headers.location,s=r.statusCode;if(i&&o.followRedirects&&s>=300&&s<400){if(++e._redirects>o.maxRedirects){z(e,S,`Maximum redirects exceeded`);return}S.abort();let r;try{r=new d(i,t)}catch{I(e,SyntaxError(`Invalid URL: ${i}`));return}F(e,r,n,a)}else e.emit(`unexpected-response`,S,r)||z(e,S,`Unexpected server response: ${r.statusCode}`)}),S.on(`upgrade`,(t,n,r)=>{if(e.emit(`upgrade`,t),e.readyState!==P.CONNECTING)return;S=e._req=null;let i=t.headers.upgrade;if(i===void 0||i.toLowerCase()!==`websocket`){z(e,n,`Invalid Upgrade header`);return}let a=c(`sha1`).update(g+y).digest(`base64`);if(t.headers[`sec-websocket-accept`]!==a){z(e,n,`Invalid Sec-WebSocket-Accept header`);return}let s=t.headers[`sec-websocket-protocol`],l;if(s===void 0?b.size&&(l=`Server sent no subprotocol`):b.size?b.has(s)||(l=`Server sent an invalid subprotocol`):l=`Server sent a subprotocol but none was requested`,l){z(e,n,l);return}s&&(e._protocol=s);let u=t.headers[`sec-websocket-extensions`];if(u!==void 0){if(!x){z(e,n,`Server sent a Sec-WebSocket-Extensions header but no extension was requested`);return}let t;try{t=O(u)}catch{z(e,n,`Invalid Sec-WebSocket-Extensions header`);return}let r=Object.keys(t);if(r.length!==1||r[0]!==f.extensionName){z(e,n,`Server indicated an extension that was not requested`);return}try{x.accept(t[f.extensionName])}catch{z(e,n,`Invalid Sec-WebSocket-Extensions header`);return}e._extensions[f.extensionName]=x}e.setSocket(n,r,{allowSynchronousEvents:o.allowSynchronousEvents,generateMask:o.generateMask,maxPayload:o.maxPayload,skipUTF8Validation:o.skipUTF8Validation})}),o.finishRequest?o.finishRequest(S,e):S.end()}function I(e,t){e._readyState=P.CLOSING,e._errorEmitted=!0,e.emit(`error`,t),e.emitClose()}function L(e){return e.path=e.socketPath,a.connect(e)}function R(e){return e.path=void 0,!e.servername&&e.servername!==``&&(e.servername=a.isIP(e.host)?``:e.host),o.connect(e)}function z(e,t,n){e._readyState=P.CLOSING;let r=Error(n);Error.captureStackTrace(r,z),t.setHeader?(t[A]=!0,t.abort(),t.socket&&!t.socket.destroyed&&t.socket.destroy(),process.nextTick(I,e,r)):(t.destroy(r),t.once(`error`,e.emit.bind(e,`error`)),t.once(`close`,e.emitClose.bind(e)))}function ee(e,t,n){if(t){let n=h(t)?t.size:k(t).length;e._socket?e._sender._bufferedBytes+=n:e._bufferedAmount+=n}if(n){let t=Error(`WebSocket is not open: readyState ${e.readyState} (${M[e.readyState]})`);process.nextTick(n,t)}}function B(e,t){let n=this[C];n._closeFrameReceived=!0,n._closeMessage=t,n._closeCode=e,n._socket[C]!==void 0&&(n._socket.removeListener(`data`,le),process.nextTick(ae,n._socket),e===1005?n.close():n.close(e,t))}function V(){let e=this[C];e.isPaused||e._socket.resume()}function te(e){let t=this[C];t._socket[C]!==void 0&&(t._socket.removeListener(`data`,le),process.nextTick(ae,t._socket),t.close(e[S])),t._errorEmitted||(t._errorEmitted=!0,t.emit(`error`,e))}function H(){this[C].emitClose()}function ne(e,t){this[C].emit(`message`,e,t)}function re(e){let t=this[C];t._autoPong&&t.pong(e,!this._isServer,w),t.emit(`ping`,e)}function ie(e){this[C].emit(`pong`,e)}function ae(e){e.resume()}function oe(e){let t=this[C];t.readyState!==P.CLOSED&&(t.readyState===P.OPEN&&(t._readyState=P.CLOSING,se(t)),this._socket.end(),t._errorEmitted||(t._errorEmitted=!0,t.emit(`error`,e)))}function se(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),e._closeTimeout)}function ce(){let e=this[C];if(this.removeListener(`close`,ce),this.removeListener(`data`,le),this.removeListener(`end`,ue),e._readyState=P.CLOSING,!this._readableState.endEmitted&&!e._closeFrameReceived&&!e._receiver._writableState.errorEmitted&&this._readableState.length!==0){let t=this.read(this._readableState.length);e._receiver.write(t)}e._receiver.end(),this[C]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on(`error`,H),e._receiver.on(`finish`,H))}function le(e){this[C]._receiver.write(e)||this.pause()}function ue(){let e=this[C];e._readyState=P.CLOSING,e._receiver.end(),this.end()}function de(){let e=this[C];this.removeListener(`error`,de),this.on(`error`,w),e&&(e._readyState=P.CLOSING,this.destroy())}})),ME=o(((e,t)=>{jE();let{Duplex:n}=require(`stream`);function r(e){e.emit(`close`)}function i(){!this.destroyed&&this._writableState.finished&&this.destroy()}function a(e){this.removeListener(`error`,a),this.destroy(),this.listenerCount(`error`)===0&&this.emit(`error`,e)}function o(e,t){let o=!0,s=new n({...t,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return e.on(`message`,function(t,n){let r=!n&&s._readableState.objectMode?t.toString():t;s.push(r)||e.pause()}),e.once(`error`,function(e){s.destroyed||(o=!1,s.destroy(e))}),e.once(`close`,function(){s.destroyed||s.push(null)}),s._destroy=function(t,n){if(e.readyState===e.CLOSED){n(t),process.nextTick(r,s);return}let i=!1;e.once(`error`,function(e){i=!0,n(e)}),e.once(`close`,function(){i||n(t),process.nextTick(r,s)}),o&&e.terminate()},s._final=function(t){if(e.readyState===e.CONNECTING){e.once(`open`,function(){s._final(t)});return}e._socket!==null&&(e._socket._writableState.finished?(t(),s._readableState.endEmitted&&s.destroy()):(e._socket.once(`finish`,function(){t()}),e.close()))},s._read=function(){e.isPaused&&e.resume()},s._write=function(t,n,r){if(e.readyState===e.CONNECTING){e.once(`open`,function(){s._write(t,n,r)});return}e.send(t,r)},s.on(`end`,i),s.on(`error`,a),s}t.exports=o})),NE=o(((e,t)=>{let{tokenChars:n}=EE();function r(e){let t=new Set,r=-1,i=-1,a=0;for(;a<e.length;a++){let o=e.charCodeAt(a);if(i===-1&&n[o]===1)r===-1&&(r=a);else if(a!==0&&(o===32||o===9))i===-1&&r!==-1&&(i=a);else if(o===44){if(r===-1)throw SyntaxError(`Unexpected character at index ${a}`);i===-1&&(i=a);let n=e.slice(r,i);if(t.has(n))throw SyntaxError(`The "${n}" subprotocol is duplicated`);t.add(n),r=i=-1}else throw SyntaxError(`Unexpected character at index ${a}`)}if(r===-1||i!==-1)throw SyntaxError(`Unexpected end of input`);let o=e.slice(r,a);if(t.has(o))throw SyntaxError(`The "${o}" subprotocol is duplicated`);return t.add(o),t}t.exports={parse:r}})),PE=o(((e,t)=>{let n=require(`events`),r=require(`http`),{Duplex:i}=require(`stream`),{createHash:a}=require(`crypto`),o=AE(),s=TE(),c=NE(),l=jE(),{CLOSE_TIMEOUT:u,GUID:d,kWebSocket:f}=SE(),p=/^[+/0-9A-Za-z]{22}==$/;t.exports=class extends n{constructor(e,t){if(super(),e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:u,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:l,...e},e.port==null&&!e.server&&!e.noServer||e.port!=null&&(e.server||e.noServer)||e.server&&e.noServer)throw TypeError(`One and only one of the "port", "server", or "noServer" options must be specified`);if(e.port==null?e.server&&(this._server=e.server):(this._server=r.createServer((e,t)=>{let n=r.STATUS_CODES[426];t.writeHead(426,{"Content-Length":n.length,"Content-Type":`text/plain`}),t.end(n)}),this._server.listen(e.port,e.host,e.backlog,t)),this._server){let e=this.emit.bind(this,`connection`);this._removeListeners=m(this._server,{listening:this.emit.bind(this,`listening`),error:this.emit.bind(this,`error`),upgrade:(t,n,r)=>{this.handleUpgrade(t,n,r,e)}})}e.perMessageDeflate===!0&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=0}address(){if(this.options.noServer)throw Error(`The server is operating in "noServer" mode`);return this._server?this._server.address():null}close(e){if(this._state===2){e&&this.once(`close`,()=>{e(Error(`The server is not running`))}),process.nextTick(h,this);return}if(e&&this.once(`close`,e),this._state!==1)if(this._state=1,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(h,this);else{let e=this._server;this._removeListeners(),this._removeListeners=this._server=null,e.close(()=>{h(this)})}}shouldHandle(e){if(this.options.path){let t=e.url.indexOf(`?`);if((t===-1?e.url:e.url.slice(0,t))!==this.options.path)return!1}return!0}handleUpgrade(e,t,n,r){t.on(`error`,g);let i=e.headers[`sec-websocket-key`],a=e.headers.upgrade,l=+e.headers[`sec-websocket-version`];if(e.method!==`GET`){v(this,e,t,405,`Invalid HTTP method`);return}if(a===void 0||a.toLowerCase()!==`websocket`){v(this,e,t,400,`Invalid Upgrade header`);return}if(i===void 0||!p.test(i)){v(this,e,t,400,`Missing or invalid Sec-WebSocket-Key header`);return}if(l!==13&&l!==8){v(this,e,t,400,`Missing or invalid Sec-WebSocket-Version header`,{"Sec-WebSocket-Version":`13, 8`});return}if(!this.shouldHandle(e)){_(t,400);return}let u=e.headers[`sec-websocket-protocol`],d=new Set;if(u!==void 0)try{d=c.parse(u)}catch{v(this,e,t,400,`Invalid Sec-WebSocket-Protocol header`);return}let f=e.headers[`sec-websocket-extensions`],m={};if(this.options.perMessageDeflate&&f!==void 0){let n=new s(this.options.perMessageDeflate,!0,this.options.maxPayload);try{let e=o.parse(f);e[s.extensionName]&&(n.accept(e[s.extensionName]),m[s.extensionName]=n)}catch{v(this,e,t,400,`Invalid or unacceptable Sec-WebSocket-Extensions header`);return}}if(this.options.verifyClient){let a={origin:e.headers[`${l===8?`sec-websocket-origin`:`origin`}`],secure:!!(e.socket.authorized||e.socket.encrypted),req:e};if(this.options.verifyClient.length===2){this.options.verifyClient(a,(a,o,s,c)=>{if(!a)return _(t,o||401,s,c);this.completeUpgrade(m,i,d,e,t,n,r)});return}if(!this.options.verifyClient(a))return _(t,401)}this.completeUpgrade(m,i,d,e,t,n,r)}completeUpgrade(e,t,n,r,i,c,l){if(!i.readable||!i.writable)return i.destroy();if(i[f])throw Error(`server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration`);if(this._state>0)return _(i,503);let u=[`HTTP/1.1 101 Switching Protocols`,`Upgrade: websocket`,`Connection: Upgrade`,`Sec-WebSocket-Accept: ${a(`sha1`).update(t+d).digest(`base64`)}`],p=new this.options.WebSocket(null,void 0,this.options);if(n.size){let e=this.options.handleProtocols?this.options.handleProtocols(n,r):n.values().next().value;e&&(u.push(`Sec-WebSocket-Protocol: ${e}`),p._protocol=e)}if(e[s.extensionName]){let t=e[s.extensionName].params,n=o.format({[s.extensionName]:[t]});u.push(`Sec-WebSocket-Extensions: ${n}`),p._extensions=e}this.emit(`headers`,u,r),i.write(u.concat(`\r
507
507
  `).join(`\r
@@ -516,7 +516,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
516
516
  `)}function NO(e){let t=IO(IO(e.event).delta);if(typeof t.text==`string`&&t.text.length>0)return t.text}function PO(e){let t=Array.isArray(e.errors)?e.errors.filter(e=>typeof e==`string`):[];return t.length>0?t.join(`; `):LO(e.subtype)||`Claude turn failed`}function FO(e){let t=IO(e);return{input_tokens:BO(t.input_tokens)??BO(t.inputTokens)??0,cached_input_tokens:BO(t.cached_input_tokens)??BO(t.cache_read_input_tokens)??BO(t.cacheReadInputTokens)??0,output_tokens:BO(t.output_tokens)??BO(t.outputTokens)??0}}function IO(e){return typeof e==`object`&&e?e:{}}function LO(e){if(typeof e==`string`&&e.trim())return e}function RO(e){if(typeof e==`string`&&e.length>0)return e}function zO(e){if(Array.isArray(e)){for(let t of e)if(typeof t==`string`&&t.trim())return t}}function BO(e){if(typeof e==`number`&&Number.isFinite(e))return e}function VO(e){let t=LO(IO(e.message).id);if(t)return t;let n=LO(IO(IO(e.event).message).id);if(n)return n}function HO(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`_`);return t?t.replace(/^_+|_+$/g,``):`tool`}var UO=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=WO(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 WO(e){return typeof e==`object`&&e&&`type`in e?e:{type:`status.progress`,nativeEvent:e}}var GO=`@anthropic-ai/claude-agent-sdk`,KO=`claude-sonnet-4-6`,qO=1e4,JO=class{constructor(e,t){this.preferNative=e,this.requireNative=t}provider=`claude`;async isNativeAvailable(){try{return await import(GO),!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(GO),n=await YO(XO(t,e),qO,`Claude native query session creation timed out`);if(n)return n;let r=await YO(ZO(t,e),qO,`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 YO(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 XO(e,t){let n=QO(e);if(!n)return null;let r=t.model??KO;return new fO(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=$O(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 ZO(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 UO(`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 UO(`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 UO(`claude`,t.sessionId,t.model,n)}return null}function QO(e){if(typeof e?.query==`function`)return e.query;if(typeof e?.default?.query==`function`)return e.default.query}function $O(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 ek(e,t={}){let n=t.preferNative??!1,r=t.requireNative??!1;return e===`codex`?new YD(n,r):new JO(n,r)}const tk=p.default.join(`.claude`,`projects`),nk=/\u001B\[[0-?]*[ -/]*[@-~]/g;async function rk(e){return(await(0,O.listSessions)(typeof e==`number`?{limit:e}:void 0)).map(e=>uk(e)).filter(e=>typeof e.cwd==`string`).sort((e,t)=>t.updatedAt.localeCompare(e.updatedAt))}async function ik(e,t){let n=ck(e,t?.homeDir),r=p.default.resolve(e);try{let i=await dk(e,n,r,{maxSessions:Bk(t?.maxSessions),updatedAfterMs:zk(t?.updatedAfterMs)});if(i.length>0)return i}catch{}return fk(n,{maxSessions:Bk(t?.maxSessions),updatedAfterMs:zk(t?.updatedAfterMs)})}async function ak(e){let t=await Tk(e.nativeSessionId,e.projectPath),n=await Ek(e.projectPath,e.nativeSessionId,e.homeDir),r=hk(t,{createdAtFallbackMs:n.birthtimeMs,updatedAtFallbackMs:n.mtimeMs}),i=gk(r.updatedAt,n.mtimeMs);return{rawEvents:ok({rows:t,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,nativeSessionId:e.nativeSessionId,createdAtFallbackMs:n.birthtimeMs,updatedAtFallbackMs:n.mtimeMs}),model:r.model,updatedAt:i,status:_k(t),nativeWatchPath:sk(e.projectPath,e.nativeSessionId,e.homeDir)}}function ok(e){let t=[],n=hk(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)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,tk,lk(e))}function lk(e){let t=p.default.resolve(e).replace(/\\/g,`/`).replace(/:/g,`-`).replace(/\//g,`-`);return t.startsWith(`-`)?t:`-${t}`}function uk(e){let t=Fk(e.customTitle)??Fk(e.summary)??Fk(e.firstPrompt),n=Ck(e.createdAt??e.lastModified),r=Ck(e.lastModified);return{nativeSessionId:e.sessionId,cwd:Sk(e.cwd),title:t,createdAt:n,updatedAt:r,status:`idle`}}async function dk(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=zk(e.lastModified);if(r.updatedAfterMs!==void 0&&i!==void 0&&i<r.updatedAfterMs){s=!0;break}let o=uk(e);if(typeof o.cwd!=`string`||p.default.resolve(o.cwd)!==n)continue;let c=await pk(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 mk(a,r)}async function fk(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 pk(e,{nativeSessionId:t.name.slice(0,-6)});n&&r.push(n)}return mk(r,t)}async function pk(e,t){let n=p.default.join(e,`${t.nativeSessionId}.jsonl`),r;try{r=await wk(n)}catch(e){if(e.code===`ENOENT`)return t.sdkSession;throw e}if(!xk(r))return;let i=await d.default.stat(n),a=t.sdkSession?.createdAt?Rk(t.sdkSession.createdAt):void 0,o=t.sdkSession?.updatedAt?Rk(t.sdkSession.updatedAt):void 0,s=hk(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:_k(r)}}function mk(e,t){let n=e.filter(e=>{if(t.updatedAfterMs===void 0)return!0;let n=Rk(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 hk(e,t){let n,r,i,a;for(let t of e)if(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=Mk(Ak(Nk(t.raw.message)))),t.type===`assistant`){let e=Pk(Nk(t.raw.message).model);e&&(n=e)}let o=i??zk(t.createdAtFallbackMs)??0,s=a??zk(t.updatedAtFallbackMs)??o;return{model:n,title:r,createdAt:new Date(o).toISOString(),updatedAt:new Date(s).toISOString()}}function gk(e,t){let n=Rk(e)??0,r=zk(t)??0;return new Date(Math.max(n,r)).toISOString()}function _k(e,t=Date.now()){let n=null;for(let t of e){let e=vk(t);e&&(n=e)}return!n?.unresolved||n.timestampMs!==void 0&&t-n.timestampMs>6e5?`idle`:`running`}function vk(e){let t=e.timestampMs??Rk(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 yk(e.raw,t);default:return null}}function yk(e,t){let n=Nk(e);if(n.isMeta===!0)return null;let r=Nk(n.message);if(kk(r).length>0)return{unresolved:!0,timestampMs:t};let i=Ak(r);return i?bk(i)?{unresolved:!1,timestampMs:t}:{unresolved:!0,timestampMs:t}:null}function bk(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 xk(e){for(let t of e){if(t.type===`user`){let e=Nk(t.raw.message);if(Ak(e)||kk(e).length>0)return!0;continue}if(t.type!==`assistant`)continue;let e=Nk(t.raw.message);if(Ak(e)||Ok(e).length>0||Pk(t.raw.error))return!0}return!1}function Sk(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Ck(e){return Number.isFinite(e)?new Date(e).toISOString():new Date(0).toISOString()}async function wk(e){let t=(await d.default.readFile(e,`utf8`)).split(`
517
517
  `),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=Nk(i),o=Pk(a.timestamp),s=o?Rk(o):void 0;n.push({line:e+1,raw:a,type:Pk(a.type),timestamp:o,timestampMs:s})}return n}async function Tk(e,t){let n=await(0,O.getSessionMessages)(e,{dir:t});if(n.length===0)throw Error(`Claude session ${e} returned no messages from getSessionMessages`);return n.map((e,t)=>Dk(e,t+1))}async function Ek(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 Dk(e,t){let n=Nk(e),r=Nk(n.message),i=Pk(n.timestamp)??Pk(r.timestamp)??Pk(r.created_at)??Pk(r.createdAt);return{line:t,raw:{...n,message:r},type:Pk(n.type),timestamp:i,timestampMs:i?Rk(i):void 0}}function Ok(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=Nk(e);if(Pk(t.type)!==`tool_use`)continue;let r=Nk(t.input),i=Pk(r.command),a=Pk(t.name)??`tool`,o=Pk(r.description);n.push({id:Pk(t.id),name:a,command:i,summary:o??i??`${a} started`})}return n}function kk(e){let t=Array.isArray(e.content)?e.content:[],n=[];for(let e of t){let t=Nk(e);if(Pk(t.type)!==`tool_result`)continue;let r=Ik(Pk(t.content)??Pk(Nk(t.toolUseResult).stdout)??Pk(Nk(t.tool_use_result).stdout)??Pk(t.text));n.push({toolUseId:Pk(t.tool_use_id)??Pk(t.toolUseId),toolName:Pk(t.tool_name)??Pk(t.toolName),text:r,isError:t.is_error===!0})}return n}function Ak(e){let t=Pk(e.content);if(t)return Ik(t);let n=Pk(e.text)??Pk(e.prompt);if(n)return Ik(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=Nk(e),n=Pk(t.type);if(n&&n!==`text`)continue;let r=Pk(t.text)??Pk(t.content)??jk(t);r&&i.push(r)}if(i.length!==0)return Ik(i.join(`
518
518
  `))}function jk(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=Nk(e),r=Pk(t.text)??Pk(t.value);r&&n.push(r)}return n.length>0?n.join(``):void 0}function Mk(e,t=60){if(!e)return;let n=Lk(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 Nk(e){return typeof e==`object`&&e?e:{}}function Pk(e){return typeof e==`string`&&e.trim()||void 0}function Fk(e){if(typeof e==`string`)return Ik(e)}function Ik(e){if(!e)return;let t=Lk(e).trim();return t.length>0?t:void 0}function Lk(e){return e.replace(nk,``)}function Rk(e){let t=Date.parse(e);if(Number.isFinite(t))return t}function zk(e){if(!(e===void 0||!Number.isFinite(e)||e<=0))return Math.round(e)}function Bk(e){if(e===void 0||!Number.isFinite(e))return;let t=Math.floor(e);return t>0?t:void 0}var Vk=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}=Uk(r,[t,n]);if(Wk(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=Kk(await this.refreshProjects()),r=!0);let i=await Gk(n.projects,t);if(!i)throw Dw(t);let a=await this.options.store.getProject(i.key);if(!a&&!r){if(n=Kk(await this.refreshProjects()),i=await Gk(n.projects,t),!i)throw Dw(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 ZD({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 Hk({sessions:[...n.values()],canonicalPathCache:e,getRawPath:e=>Yk(e.cwd),mapSession:e=>{let t=Xk(e.createdAt),n=Xk(e.updatedAt,t);return{provider:`codex`,nativeSessionId:e.id,title:Yk(e.name)??Yk(e.preview),model:Yk(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 Hk({sessions:await rk(),canonicalPathCache:e,getRawPath:e=>Yk(e.cwd),mapSession:e=>({provider:`claude`,nativeSessionId:e.nativeSessionId,title:Yk(e.title),model:Yk(e.model),createdAt:Yk(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 Hk(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 qk(i,e.canonicalPathCache);t.push({canonicalProjectPath:n,session:e.mapSession(r)})}catch{n+=1}}return{records:t,skippedCount:n}}function Uk(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:Jk(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=Zk(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($k)})).sort((e,t)=>Qk(e.project,t.project));return{projects:r.map(e=>e.project),projectSessions:r}}function Wk(e){return Object.values(e).some(e=>e?.status===`failed`)}async function Gk(e,t){let n=e.find(e=>e.path===t);if(n)return n;let r=await xE(t);return e.find(e=>e.path===r)}function Kk(e){return{v:1,generatedAt:e.generatedAt,providers:e.providers,projects:e.projects}}async function qk(e,t){let n=t.get(e);return n||(n=xE(e),t.set(e,n)),n}function Jk(e){return(0,l.createHash)(`sha256`).update(e).digest(`hex`).slice(0,16)}function Yk(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function Xk(e,t){return!Number.isFinite(e)||e<=0?t??new Date(0).toISOString():new Date(e*1e3).toISOString()}function Zk(e,t){return e&&e.updatedAt>=t.updatedAt?e:t}function Qk(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 $k(e,t){return e.updatedAt===t.updatedAt?`${e.provider}:${e.nativeSessionId}`.localeCompare(`${t.provider}:${t.nativeSessionId}`):t.updatedAt.localeCompare(e.updatedAt)}var eA=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 tA(this.getProjectPath(e),iA);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 nA(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 nA(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 tA(this.indexPath,rA)}getProjectPath(e){return p.default.join(this.projectsDir,`${e}.json`)}enqueueWrite(e){return this.writeQueue=this.writeQueue.then(e,e),this.writeQueue}};async function tA(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 nA(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 rA(e){return!aA(e)||e.v!==1||typeof e.generatedAt!=`string`||!rd.safeParse(e.providers).success||!Array.isArray(e.projects)?!1:e.projects.every(e=>id.safeParse(e).success)}function iA(e){return!aA(e)||e.v!==1||typeof e.projectKey!=`string`||e.projectKey.length===0||typeof e.canonicalProjectPath!=`string`||e.canonicalProjectPath.length===0||!id.safeParse(e.project).success||!rd.safeParse(e.providers).success||!Array.isArray(e.sessions)?!1:e.sessions.every(e=>ad.safeParse(e).success)}function aA(e){return typeof e==`object`&&!!e}const oA=Buffer.from([48,42,48,5,6,3,43,101,112,3,33,0]);function sA(e){let t=Vd.parse(e.clientHello),n=(0,l.randomBytes)(32).toString(`base64`),{privateKey:r,publicKey:i}=(0,l.generateKeyPairSync)(`x25519`),a=Nf(If(dA(i.export({format:`jwk`})))),o=Cf({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:Hd.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 cA(e){let t=Vd.parse(e.clientHello),n=Hd.parse(e.gatewayHello),r=Ud.parse(e.clientAuth);if(t.version!==n.version||r.version!==t.version||!jd.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,Pf(t.deviceIdentity.publicKey)])});if(!(0,l.verify)(null,Buffer.from(wf({gatewayId:e.gatewayId,clientHello:t,gatewayHello:{gatewayNonce:n.gatewayNonce,gatewayPublicKeyFingerprint:n.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:n.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:r.clientEphemeralPublicKey}}),`utf8`),i,Pf(r.signature)))throw Error(`transcript_invalid`)}function lA(e){let t=Hd.parse(e.gatewayHello),n=Ud.parse(e.clientAuth),r=(0,l.createPublicKey)({key:{crv:`X25519`,kty:`OKP`,x:Ff(Pf(n.clientEphemeralPublicKey))},format:`jwk`}),i=(0,l.diffieHellman)({privateKey:e.gatewayEphemeralPrivateKey,publicKey:r});return Df({role:`gateway`,keySchedule:Ef({gatewayId:e.gatewayId,clientHello:Vd.parse(e.clientHello),gatewayHello:{gatewayNonce:t.gatewayNonce,gatewayPublicKeyFingerprint:t.gatewayPublicKeyFingerprint,gatewayEphemeralPublicKey:t.gatewayEphemeralPublicKey},clientAuth:{clientEphemeralPublicKey:n.clientEphemeralPublicKey},sharedSecret:new Uint8Array(i),keyEpoch:1})})}function uA(e){return Zd.parse({version:1,gatewayId:e.gatewayId,deviceId:e.deviceId,code:e.code,message:e.message,retryable:e.retryable})}function dA(e){if(typeof e.x!=`string`||e.x.length===0)throw Error(`x25519 public key export missing x`);return e.x}const fA=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;let pA=null;function mA(e){pA=e}function hA(e,t){fA&&(console.log(`[session-fetch][gateway] ${e}`,t),pA?.info({event:e,...t},`session fetch debug`))}const gA=64*1024;var _A=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}},vA=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(bf.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=>yc.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=yc.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(bf.parse({type:`pairing.claim.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...wA(t,`pairing.claim`)})}}async handleRefresh(e,t){try{let n=await this.dependencies.handleRefresh(t);this.dependencies.sendFrame(bf.parse({type:`auth.refresh.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...wA(t,`auth.refresh`)})}}async handleFileContent(e,t){try{let n=await this.dependencies.handleFileContentRequest(e,t);this.dependencies.sendFrame(bf.parse({type:`file.content.result`,gatewayId:this.dependencies.gatewayId,requestId:e,messageType:`system`,payload:n}))}catch(t){this.sendRelayError({requestId:e,...wA(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:{...CA(`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=>Qd.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(bf.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=tf.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:CA(`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:CA(`BAD_REQUEST`,400,`plaintext relay payload missing`)});return}let i=Qd.parse(e.payload);try{let e=await this.dependencies.handleRpcRequest(i,{mobileId:t,deviceId:r.deviceId});this.dependencies.sendFrame(bf.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=tf.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:CA(`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=sA({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(bf.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{cA({gatewayId:this.dependencies.gatewayId,clientHello:n.handshake.clientHello,gatewayHello:n.handshake.gatewayHello,clientAuth:t})}catch(t){this.sendSecureError(e,n.deviceId,TA(t),String(t));return}try{let r=await this.dependencies.verifyDeviceIdentityBinding(n.deviceId,n.handshake.clientHello.deviceIdentity),i=lA({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(bf.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,DA(t),String(t))}}ensureReadyMobileClient(e){if(e.clientId&&e.socket)return;let t=new _A(t=>{try{let n=bf.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,EA(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:uA({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:CA(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 Mf({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,EA(t),`relay secure payload failed: ${String(t)}`),null}}createRelayBusinessPayloadFields(e,t,n){let r=gd({payload:n,compressionThresholdBytes:yA(t.frameType,n)?gA:void 0});if(bA(n)){let i=xA(n),a=SA(n);hA(`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:gA,uncompressedByteLength:r.uncompressedByteLength,compressedByteLength:r.compressedByteLength})}if(e.handshake.status!==`ready`){let e=_d(r);return e?{compressedPayload:e}:{payload:n}}return{encryptedPayload:jf({session:e.handshake.session,metadata:{frameType:t.frameType,messageType:t.messageType,gatewayId:this.dependencies.gatewayId,...t.requestId?{requestId:t.requestId}:{}},preparedPayload:r})}}};function yA(e,t){return e===`to_mobile`&&bA(t)}function bA(e){return typeof e==`object`&&!!e&&`kind`in e&&(e.kind===`session.stream.snapshot.chunk`||e.kind===`session.readable.snapshot.chunk`)}function xA(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 SA(e){return e.kind===`session.readable.snapshot.chunk`||`readable`in e.payload?e.payload.readable:void 0}function CA(e,t,n){return tf.parse({code:e,status:t,message:n})}function wA(e,t){if(dw(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=OA(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`||jw(e))||t===`file.content`&&jw(e)?{code:`UNAUTHORIZED`,status:401,message:n}:{code:`INTERNAL`,status:500,message:n}}function TA(e){return kA(e,[`identity_mismatch`,`counter_replay`,`unsupported_version`,`transcript_invalid`])??`transcript_invalid`}function EA(e){return kA(e,[`counter_gap_too_large`,`counter_replay`,`key_epoch_mismatch`,`decrypt_failed`])??`decrypt_failed`}function DA(e){if(dw(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=OA(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 OA(e){return e instanceof Error?e.message:typeof e==`string`?e:String(e)}function kA(e,t){let n=OA(e);return t.find(e=>e===n)}function AA(e){return e?e.readyState:null}function jA(e){return(typeof e.extensions==`string`?e.extensions.trim():``)||null}var MA=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??FA}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=AA(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=bf.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=NA(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:jA(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=bf.parse(JSON.parse(PA(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 NA(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 PA(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 FA(e){return new IE(e,void 0,{perMessageDeflate:!0})}function IA(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(xf(t),`utf8`),(0,l.createPrivateKey)(e.privateKeyPem)).toString(`base64`)}}async function LA(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(RA(e.relayUrl),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(IA({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 cf.parse(JSON.parse(r)).token}function RA(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 zA(e){return e?.trim()||void 0}function BA(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 VA(e,t){return{modeDefault:`default`,model:zA(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 HA(e){return{mode:`default`,model:null,reasoningEffort:null,execution:e===`codex`?{codex:{approvalPolicy:null,sandboxMode:null}}:{claude:{permissionMode:null}}}}function UA(e,t){let n=HA(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 WA(e,t){return e===`claude`&&t?.permissionMode===`plan`?`plan`:`default`}function GA(e){let t=UA(e.provider,e.sessionTurnConfig);return e.sessionTurnConfig!==void 0||zA(e.legacyModel)!==void 0||e.legacySessionConfig!==void 0?KA({provider:e.provider,providerDefaults:{modeDefault:`default`},currentSessionTurnConfig:t,legacyModel:e.legacyModel,legacySessionConfig:e.legacySessionConfig}).sessionTurnConfig:t}function KA(e){let t=UA(e.provider,e.currentSessionTurnConfig),n=e.mode??(e.legacySessionConfig?WA(e.provider,e.legacySessionConfig):void 0)??t.mode??e.providerDefaults.modeDefault,r=UA(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=zA(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??zA(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:BA(r.execution)}}}const qA=[],JA=[{id:`default`,label:`Default`,isDefault:!0,supportedReasoningEfforts:[`low`,`medium`,`high`,`max`]}],YA=[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`],XA=Fa.options,ZA=[`read-only`,`workspace-write`,`danger-full-access`],QA=[`default`,`acceptEdits`,`bypassPermissions`,`plan`,`dontAsk`],$A={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 ej(e,t){let n=t?.trim().toLowerCase();return n?($A[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:YA}:{}},...e.map(e=>({...e,isDefault:!1}))]}function nj(e){return e===`none`||e===`minimal`||e===`low`||e===`medium`||e===`high`||e===`xhigh`||e===`max`?e:null}function rj(e){let t=new Set;for(let n of e){let e=nj(n);e&&t.add(e)}return[...t]}function ij(e){return e?.trim()||void 0}function aj(e){let t=ij(e.runtimeModel);if(t)return t;let n=ij(e.discoveredModel);if(n)return n;let r=ij(e.existingModel),i=ij(e.modelProvider)?.toLowerCase();if(r&&(!i||r.toLowerCase()!==i))return r}function oj(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:rj(e.supportedReasoningEfforts)}));return t.length===0?qA:(t.some(e=>e.isDefault)||(t[0]={...t[0],isDefault:!0}),t)}async function sj(e){let t=Date.now();try{let n=oj(await eO());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 cj(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(bm(),`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=uj(e.description,e.displayName,t),a=e.supportsEffort===!1?[]:e.supportsEffort||n?rj(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 lj(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 uj(...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 dj=class{cache=new Map;inFlight=new Map;constructor(e){this.options=e}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=$A.claude.length>0?$A.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 VA(e,await this.getProviderCapabilities(e,t,n))}async resolveProviderCapabilities(e,t,n){if(t&&!await this.options.projectStore.getById(t))throw yw(t);let r=ej(e,n),i=r?.version??`default`,a=`${e}::${i}`,o={provider:e,projectId:t??null,requestedAgentVersion:n?.trim()||null,resolvedAgentVersion:i},s=Date.now(),c=this.cache.get(a);if(c){if(c.expiresAt>s)return this.options.logger?.info?.({...o,cacheStatus:`hit`,source:c.value.capabilities.source,modelCount:c.value.capabilities.models.length},`provider capabilities cache hit`),c.value;this.cache.delete(a)}let l=this.inFlight.get(a);if(l)return this.options.logger?.info?.({...o,cacheStatus:`in_flight`},`provider capabilities awaiting in-flight load`),l;let u=Date.now(),d=(async()=>{let t=ek(e,{preferNative:this.options.preferNativeProviders,requireNative:!1}),n=Date.now(),a=this.options.preferNativeProviders?await t.isNativeAvailable().catch(()=>!1):!1;this.options.logger?.info?.({...o,cacheStatus:`miss`,nativeAvailable:a,durationMs:Date.now()-n},`provider capabilities native availability checked`);let s=a?`native`:`fallback`,c=e===`codex`&&a?await sj(this.options.logger)??qA:qA,l=e===`claude`&&a?await cj(this.options.logger)??JA:JA,d=rj(l.flatMap(e=>e.supportedReasoningEfforts??[])),f=e===`codex`?{provider:e,source:s,models:c,support:{reasoningEffort:!0,approvalPolicy:!0,sandboxMode:!0,permissionMode:!1},options:{reasoningEfforts:YA,approvalPolicies:XA,sandboxModes:ZA,permissionModes:[]},defaults:{model:c.find(e=>e.isDefault)?.id??c[0]?.id,reasoningEffort:`medium`,approvalPolicy:`on-request`,sandboxMode:`workspace-write`}}:{provider:e,source:s,models:l,support:{reasoningEffort:d.length>0,approvalPolicy:!1,sandboxMode:!1,permissionMode:!0},options:{reasoningEfforts:d,approvalPolicies:[],sandboxModes:[],permissionModes:QA},defaults:{model:l.find(e=>e.isDefault)?.id??l[0]?.id,reasoningEffort:lj(l),permissionMode:`default`}};if(!r){let e={capabilities:f,resolvedAgentVersion:i};return this.options.logger?.info?.({...o,cacheStatus:`miss`,durationMs:Date.now()-u,source:e.capabilities.source,modelCount:e.capabilities.models.length},`provider capabilities resolved`),e}let p={...f.defaults,...r.defaults},m=p.model?.trim(),h=s===`native`?f.models:m?tj(f.models,m,e):f.models,g={capabilities:{...f,models:h,defaults:p},resolvedAgentVersion:r.version};return this.options.logger?.info?.({...o,cacheStatus:`miss`,durationMs:Date.now()-u,source:g.capabilities.source,modelCount:g.capabilities.models.length},`provider capabilities resolved`),g})();this.inFlight.set(a,d);try{let e=await d;return this.cache.set(a,{value:e,expiresAt:Date.now()+864e5}),e}catch(e){throw this.options.logger?.warn?.({...o,cacheStatus:`miss`,durationMs:Date.now()-u,err:e},`provider capabilities resolution failed`),e}finally{this.inFlight.delete(a)}}};const fj=`.meta.json`;function pj(){let e=process.env.CODEX_HOME?.trim();return e?p.default.resolve(e):p.default.join(f.default.homedir(),`.codex`)}function mj(){return p.default.join(pj(),`auth.json`)}function hj(){return p.default.join(bm(),`codex-accounts`)}var gj=class{currentAuthFilePath;snapshotsDir;readAccountMetadata;constructor(e={}){this.currentAuthFilePath=e.currentAuthFilePath??mj(),this.snapshotsDir=e.snapshotsDir??hj(),this.readAccountMetadata=e.readAccountMetadata??yj}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 Ij(this.currentAuthFilePath),n=await this.readSavedSnapshot(e);return await Lj(this.currentAuthFilePath,n.rawContent),{previousRawContent:t}}async restoreCurrentAuthFile(e){await Lj(this.currentAuthFilePath,e)}async listSavedAccounts(e){let t=await Fj(this.snapshotsDir);return(await Promise.all(t.filter(e=>e.isFile()&&Pj(e.name)).map(async t=>{let n=Nj(t.name);if(!n)return null;let r=p.default.join(this.snapshotsDir,t.name);try{let t=_j(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 Ij(this.getSnapshotPath(e));if(n===null)return`missing`;try{return _j(n,this.getSnapshotPath(e)).canonicalContent===t?`current`:`stale`}catch{return`stale`}}async writeSnapshot(e,t,n){let r=new Date().toISOString();await Lj(this.getSnapshotPath(e),t.rawContent),await Lj(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 Ij(t);if(n===null)throw Tw(e);return _j(n,t)}async readSnapshotMetadata(e){let t=await Ij(this.getSnapshotMetadataPath(e));if(t===null)return null;try{return vj(t)}catch{return null}}async readCurrentAuthFile(){let e=await this.readCurrentAuthFileOrNull();if(!e)throw Ew(`Current Codex auth.json is missing or unreadable`);return e}async readCurrentAuthFileOrNull(){let e=await Ij(this.currentAuthFilePath);if(e===null)return null;try{return _j(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 Ew(`Current Codex account does not expose a ChatGPT email via account/read`);return e}getSnapshotPath(e){return p.default.join(this.snapshotsDir,`${Mj(e)}.json`)}getSnapshotMetadataPath(e){return p.default.join(this.snapshotsDir,`${Mj(e)}${fj}`)}};function _j(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Ew(`Codex auth file is not valid JSON: ${t}`,{error:String(e)})}if(!n||typeof n!=`object`||Array.isArray(n))throw Ew(`Codex auth file is not an object: ${t}`);let r=n;return{authMode:bj(r.auth_mode),lastRefreshAt:wj(r.last_refresh),rawContent:e,canonicalContent:Aj(n)}}function vj(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`invalid snapshot metadata`);let n=t,r=Sj(n.accountId);if(!r)throw Error(`missing snapshot metadata accountId`);return{accountId:r,accountType:Cj(n.accountType),planType:xj(n.planType),rateLimits:Tj(n.rateLimits),savedAt:wj(n.savedAt)??new Date(0).toISOString()}}async function yj(){return yD(async e=>{let t=kj(await e.sendRequest(`account/read`,{refreshToken:!1}));if(!t)return null;let n=kj(t.account);if(!n)return null;let r=null;try{let t=kj(await e.sendRequest(`account/rateLimits/read`,void 0));r=t?Tj(kj(t.rateLimits)):null}catch{r=null}let i=Cj(n.type);if(i===`chatgpt`){let e=Sj(n.email);return e?{accountId:e,accountType:i,planType:xj(n.planType)??r?.planType??null,rateLimits:r}:null}return i===`apiKey`?{accountId:`API Key`,accountType:i,planType:xj(n.planType)??r?.planType??null,rateLimits:r}:null})}function bj(e){return typeof e==`string`&&e.trim()?e.trim():`unknown`}function xj(e){return typeof e==`string`&&e.trim()?e.trim():null}function Sj(e){return typeof e==`string`&&e.trim()?e.trim().toLowerCase():null}function Cj(e){return e===`chatgpt`||e===`apiKey`?e:`unknown`}function wj(e){if(typeof e!=`string`||!e.trim())return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function Tj(e){let t=kj(e);if(!t)return null;let n=Ej(t.primary),r=Ej(t.secondary),i=xj(t.planType??t.plan_type),a=kj(t.credits),o=xj(t.creditsBalance??a?.balance);return!n&&!r&&!i&&!o?null:{...n?{primary:n}:{},...r?{secondary:r}:{},...i?{planType:i}:{},...o?{creditsBalance:o}:{}}}function Ej(e){let t=kj(e);if(!t)return null;let n=Dj(t.usedPercent??t.used_percent);return n===null?null:{usedPercent:n,windowMinutes:Oj(t.windowMinutes??t.windowDurationMins??t.window_minutes),resetsAt:Dj(t.resetsAt??t.resets_at)}}function Dj(e){return typeof e==`number`&&Number.isFinite(e)?e:null}function Oj(e){return typeof e==`number`&&Number.isFinite(e)?Math.trunc(e):null}function kj(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:null}function Aj(e){return JSON.stringify(jj(e))}function jj(e){return Array.isArray(e)?e.map(e=>jj(e)):e&&typeof e==`object`?Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,jj(t)])):e}function Mj(e){let t=Sj(e);if(!t)throw Ew(`Codex account identifier cannot be empty`);return encodeURIComponent(t)}function Nj(e){if(!Pj(e))return null;try{return Sj(decodeURIComponent(e.slice(0,-5)))}catch{return null}}function Pj(e){return e.endsWith(`.json`)&&!e.endsWith(fj)}async function Fj(e){try{return await d.default.readdir(e,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}}async function Ij(e){try{return await d.default.readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return null;throw e}}async function Lj(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 Rj=[`## 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 zj(e,t){let n=e.provider===`codex`?e.codex:void 0;if(!n)throw Error(`Codex review config is required`);return[...Rj,``,Vj(n.target),`## My request for Codex:`,Bj(e,t)].join(`
519
- `)}function Bj(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 ${Hj(r.sha,r.title)}.`:r.type===`custom`?r.instructions:`Please review my uncommitted changes.`,a=Uj(t);return a?`${i}\n\nAdditional review instructions:\n${a}`:i}function Vj(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 ${Hj(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 Hj(e,t){let n=Uj(t);return n?`${e} (${JSON.stringify(n)})`:e}function Uj(e){return e?.trim()||void 0}const Wj=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;function Gj(e){return e.lastHydratedExternalUpdatedAt||e.updatedAt||e.createdAt}function Kj(e,t){Wj&&(!e.startsWith(`config.get`)&&!e.startsWith(`raw-events`)&&!e.startsWith(`sync-external`)&&!e.endsWith(`.error`)||console.log(`[session-fetch][gateway] ${e}`,t))}function qj(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}:{sessionFound:!1}}function Jj(e,t){return e?.status===`running`?{status:`running`}:t?{status:`running`,interactionLockReason:`external_turn_running`}:{status:`idle`}}function Yj(e){return e.status===`active`?!0:e.turns.some(e=>e.status===`inProgress`||e.status===`in_progress`)}function Xj(e,t){if(!t)return Yj(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 Zj(e){return e.startsWith(`sess_`)}function Qj(e){return e.source===`native_discovered`?!0:e.providerMode===`native`&&(e.provider===`codex`||e.provider===`claude`)}function $j(e){return e.nativeSessionId?.trim()??``?!0:e.provider===`codex`&&!Zj(e.id)}function eM(e){return Zj(e.id)?e.nativeSessionId??e.id:e.id}function tM(e){return e.provider!==`codex`&&e.provider!==`claude`||e.providerMode!==`native`?!1:$j(e)}function nM(e){return e instanceof Error&&/^Session .+ is closed$/i.test(e.message)}function rM(e,t){if(e.provider!==`codex`||t.type!==`error.runtime`)return!1;if(xN(t.source)?.startsWith(`codex.app_server`))return!0;let n=xN(t.message)??``;return/\bclosed\b/i.test(n)}const iM={idleTtlMs:900*1e3,sweepIntervalMs:60*1e3,maxSessions:24,maxCodexSessions:8,maxClaudeSessions:16};function aM(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(1,Math.trunc(n)):t}function oM(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(0,Math.trunc(n)):t}var sM=class{sessions=new Map;providerCapabilities;codexAccounts;nextRawSeqBySession=new Map;runtimeLifecycle;sweepTimer;lastRawEnvelopeTimestampMs=0;shuttingDown=!1;constructor(e){if(this.options=e,this.providerCapabilities=new dj({preferNativeProviders:e.preferNativeProviders,projectStore:e.projectStore,logger:e.logger}),this.codexAccounts=e.codexAccountService??new gj,this.runtimeLifecycle={idleTtlMs:aM(e.runtimeLifecycle?.idleTtlMs,iM.idleTtlMs),sweepIntervalMs:oM(e.runtimeLifecycle?.sweepIntervalMs,iM.sweepIntervalMs),maxSessions:aM(e.runtimeLifecycle?.maxSessions,iM.maxSessions),maxCodexSessions:aM(e.runtimeLifecycle?.maxCodexSessions,iM.maxCodexSessions),maxClaudeSessions:aM(e.runtimeLifecycle?.maxClaudeSessions,iM.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 tD(),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 Cw(e);return this.options.projectStore.remove(e)}async restartCodexAppServer(){let e=this.getRunningRuntimeSessionCount();if(e>0)throw ww(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 nD(),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 ww(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 tD();let i=null;try{i=await this.codexAccounts.applySavedAccount(e),await nD()}catch(e){if(i?.previousRawContent)try{await this.codexAccounts.restoreCurrentAuthFile(i.previousRawContent),await nD()}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 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 yw(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)||this.maybeHydrateClaudeExternalSessionSummary(n)}async getProjectSessionConfig(e,t){let n=this.options.historyStore.getProjectSession(e,t),r=this.getRuntimeSessionSummary(e,t,n);if(Kj(`config.get.begin`,{projectId:e,sessionId:t,shouldHydrate:n?this.shouldHydrateCodexExternalSessionConfig(n):!1,persisted:qj(n),runtime:qj(r)}),r)return Kj(`config.get.result`,{projectId:e,sessionId:t,resultSource:`runtime`,...qj(r)}),r;let i=await this.maybeHydrateCodexExternalSessionConfig(n);return Kj(`config.get.result`,{projectId:e,sessionId:t,resultSource:i===n?`persisted`:`hydrated`,...qj(i)}),i}async syncProjectSessionHistory(e,t){let n=await this.options.projectStore.getById(e);if(!n)throw yw(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 bw(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);Kj(`sync-external.classify`,$M({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 yw(e);let i=0,a=0,o,s=(s,c)=>{Kj(`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 bw(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 yw(e);let n=this.options.historyStore.getProjectSession(e,t);if(n||=this.getRuntimeSessionSummary(e,t),!n)throw bw(e,t);return n}async startSession(e){let t=await this.resolveProjectForSessionStart(e.projectId,e.cwd),n=`sess_${lw(10)}`,r=e.provider===`codex`&&this.options.requireNativeCodex,i=ek(e.provider,{preferNative:this.options.preferNativeProviders,requireNative:r}),a=await this.getProviderDefaults(e.provider,t.id),o=e.sessionTurnConfig?UA(e.provider,e.sessionTurnConfig):GA({provider:e.provider,legacyModel:e.model,legacySessionConfig:e.sessionConfig}),s=KA({provider:e.provider,providerDefaults:a,currentSessionTurnConfig:o}),c=await i.createSession({sessionId:n,model:s.model,cwd:t.path,sessionConfig:s.sessionConfig,metadata:e.metadata,logger:this.options.logger});if(r&&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(e.provider,c,n),u=this.resolveNativeSessionId(e.provider,c,l),d=new Date().toISOString(),f=await this.attachRuntimeSession({id:l,nativeSessionId:u,source:`gateway`,projectId:t.id,projectPath:t.path,provider:e.provider,providerMode:c.providerMode,model:s.model,title:void 0,sessionTurnConfig:o,sessionTurnConfigUpdatedAt:d,createdAt:d,updatedAt:d,status:`idle`,providerSession:c,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!1,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return this.markSessionStreamReady(f),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.start`,deviceId:e.deviceId,sessionId:f.id,detail:{provider:e.provider,model:s.model,sessionConfig:e.sessionConfig,sessionTurnConfig:o,projectId:t.id,projectPath:t.path}}),{sessionId:f.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 Sw(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(i?.interactionLockReason===`external_turn_running`)throw Sw(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 Sw(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&Qj(i))throw Sw(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??await this.resumeSessionFromHistory(e);if(!o)throw xw(e);let s=await this.getProviderDefaults(o.provider,o.projectId),c=KA({provider:o.provider,providerDefaults:s,currentSessionTurnConfig:o.sessionTurnConfig,legacyModel:r?.model,legacySessionConfig:r?.sessionConfig,mode:r?.mode,config:r?.config});o.dispatchInFlight=!0,this.touchSession(o);try{if(await this.options.auditLogger.record({ts:new Date().toISOString(),action:`turn.input`,deviceId:n,sessionId:e,detail:{text:t,model:c.model,sessionConfig:r?.sessionConfig,mode:c.mode,config:r?.config,resolvedSessionConfig:c.sessionConfig}}),this.options.historyStore.getSession(o.id)||await this.persistSessionSnapshot(o),o=await this.sendInputWithRuntimeRecovery(e,o,t,{model:c.model,sessionConfig:c.sessionConfig,mode:c.mode}),!o.title){let e=yN(t);e&&this.setSessionTitle(o,e)}let i=new Date().toISOString();o.sessionTurnConfig=UA(o.provider,c.sessionTurnConfig),o.sessionTurnConfigUpdatedAt=i,c.model&&o.model!==c.model&&(o.model=c.model),o.updatedAt=i,await this.persistSessionSnapshot(o)}finally{o.dispatchInFlight=!1,this.touchSession(o)}}async startReview(e,t,n,r){let i=this.options.historyStore.getSession(e),a=this.sessions.get(e);if(a?.dispatchInFlight)throw Sw(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(i?.interactionLockReason===`external_turn_running`)throw Sw(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 Sw(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&Qj(i))throw Sw(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??await this.resumeSessionFromHistory(e);if(!o)throw xw(e);if(o.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 s=await this.getProviderDefaults(o.provider,o.projectId),c=KA({provider:o.provider,providerDefaults:s,currentSessionTurnConfig:o.sessionTurnConfig,config:r?.turnConfig});o.dispatchInFlight=!0,this.touchSession(o);try{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:c.model,resolvedSessionConfig:c.sessionConfig}}),this.options.historyStore.getSession(o.id)||await this.persistSessionSnapshot(o);let i=zj(t,r?.input);if(o=await this.sendInputWithRuntimeRecovery(e,o,i,{model:c.model,sessionConfig:c.sessionConfig}),!o.title){let e=bN(t,r?.input);e&&this.setSessionTitle(o,e)}let a=new Date().toISOString();o.sessionTurnConfig=UA(o.provider,c.sessionTurnConfig),o.sessionTurnConfigUpdatedAt=a,c.model&&o.model!==c.model&&(o.model=c.model),o.updatedAt=a,await this.persistSessionSnapshot(o)}finally{o.dispatchInFlight=!1,this.touchSession(o)}}async sendInputWithRuntimeRecovery(e,t,n,r){try{return await t.providerSession.sendInput(n,r),t}catch(i){if(!nM(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:SN(n)}})}async interruptSession(e,t){let n=this.sessions.get(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}})}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 xw(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_${lw(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=ek(t.provider,{preferNative:this.options.preferNativeProviders,requireNative:n}),i=await this.getProviderDefaults(t.provider,t.projectId),a=UA(t.provider,t.sessionTurnConfig),o=KA({provider:t.provider,providerDefaults:i,currentSessionTurnConfig:a}),s=t.provider===`claude`?eM(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}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 XD(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=CN(t.createdAt),s=CN(t.updatedAt),l=Jj(i,Yj(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:aj({runtimeModel:i?.model,discoveredModel:t.model,existingModel:n?.model,modelProvider:t.modelProvider}),title:i?.title??yN(t.name??t.preview)??n?.title,sessionTurnConfig:i?.sessionTurnConfig??n?.sessionTurnConfig,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 ik(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=Jj(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,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=Gj(e),n=VM([e.nativeSessionId,e.id]);for(let r of n)try{Kj(`config.get.probe.begin`,{projectId:e.projectId,sessionId:e.id,threadId:r,...qj(e)});let n=await $D(r);if(!n){Kj(`config.get.probe.empty`,{projectId:e.projectId,sessionId:e.id,threadId:r});continue}let i={...e,model:ij(n.model)??e.model,sessionTurnConfig:n.sessionTurnConfig??e.sessionTurnConfig,sessionTurnConfigUpdatedAt:n.sessionTurnConfigUpdatedAt,...t?{lastHydratedExternalConfigFreshnessAt:t}:{}};return await this.options.historyStore.upsertSession(i),Kj(`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:qj(i)}),this.options.historyStore.getProjectSession(e.projectId,e.id)??i}catch(t){Kj(`config.get.probe.error`,{projectId:e.projectId,sessionId:e.id,threadId:r,error:String(t)})}return e}async maybeHydrateClaudeExternalSessionSummary(e){if(!e||e.provider!==`claude`||!Qj(e)||!$j(e))return e;let t=UM(e);if(!t)return e;try{let n=await ak({projectPath:e.projectPath,nativeSessionId:t,provider:e.provider,sessionId:e.id,projectId:e.projectId});return this.patchObservedExternalSessionSummary(e,{updatedAt:n.updatedAt,externallyRunning:n.status===`running`,model:n.model})}catch(t){if(e.source===`native_discovered`&&HM(t))return e;throw t}}shouldHydrateCodexExternalSessionConfig(e){if(!this.options.preferNativeProviders||e.provider!==`codex`||!tM(e)||this.sessions.has(e.id)||e.nativeSessionId&&this.sessions.has(e.nativeSessionId))return!1;let t=Gj(e),n=e.sessionTurnConfigUpdatedAt||``;if(!e.sessionTurnConfig||!ij(e.model)||!n)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 yw(e);if((await this.options.projectStore.upsertByPath(t)).id!==n.id)throw Error(`projectId (${e}) does not match cwd (${t})`);return await wN(n.path),n}if(e){let t=await this.options.projectStore.getById(e);if(!t)throw yw(e);return await wN(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=xN(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=xN(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),rM(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_${lw(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_${lw(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=UM(e);if(!i)return{rawEvents:n};try{let a=Date.now(),o=await ak({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});return Kj(`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`&&HM(i)&&await this.markExternalHistoryHydrated(e.id,e.updatedAt),Kj(`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=yM(n,(this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0))?.status===`running`),a=VM([e.nativeSessionId,e.id]);for(let o of a)try{let a=Date.now(),s=await QD(o,!0),c=Date.now(),l,u;if(e.source===`gateway`&&n.length>0)l=fN({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=nN({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n});r?(l=r,u=`native_tail_incremental`):(l=tN({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`)}else l=tN({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,CN(s.updatedAt),i),p=await this.patchObservedExternalSessionSummary(e,{updatedAt:CN(s.updatedAt),externallyRunning:e.source===`gateway`?Xj(s,i):Yj(s)});return Kj(`sync-external.codex`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,threadStatus:s.status,threadUpdatedAt:CN(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`?Xj(s,i):Yj(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){Kj(`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 Kj(`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=lM(e.provider,t,n,i),s=Date.now(),c=await this.maybePersistSyncedExternalRawEvents(e,t,o,!0);return await this.markExternalHistoryHydrated(e.id,r),Kj(`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=Jj(r,t.externallyRunning),a=i.status===`running`?r?.pendingToolApprovals.size??0:0,o=i.status===`running`?r?.pendingUserInputs.size??0:0,s={...n,updatedAt:i.status===`running`?r?.updatedAt??t.updatedAt:t.updatedAt,status:i.status,model:r?.model??ij(t.model)??n.model,interactionLockReason:i.interactionLockReason,pendingApprovals:a,pendingUserInputs:o,pendingActions:a+o};return await this.options.historyStore.upsertSession(s),this.options.historyStore.getSession(e.id)??s}async markExternalHistoryHydrated(e,t){await this.options.historyStore.patchSession(e,{lastHydratedExternalUpdatedAt:t})}mustGetSession(e){let t=this.sessions.get(e);if(!t)throw xw(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=vN(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 cM=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]);function lM(e,t,n,r){if(e===`claude`)return dM(e,SM(t,n),n);if(e!==`codex`)return dM(e,t,n);if(t.length===0)return n.slice().sort((e,t)=>e.ts.localeCompare(t.ts));let i=r??yM(t),a=uM(e,t.filter(e=>!hM(e))),o=EM(e),s=t.filter(t=>{if(vM(t,i))return!1;if(!hM(t))return!0;let n=DM(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=EM(e),f=EM(e),p=xM(t)??xM(n)??Date.now();for(let[t,n]of s.entries()){c.set(n.eventId,n),l.set(n.eventId,t);for(let t of DM(e,n,d))u.add(t)}for(let t of n){if(vM(t,i))continue;let n=DM(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(!fM(r,t))continue;let e=l.get(t.eventId),n=bM(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 uM(e,t){let n=new Map,r=EM(e);for(let i of t)for(let t of DM(e,i,r))n.set(t,(n.get(t)??0)+1);return n}function dM(e,t,n){let r=new Map,i=new Set,a=EM(e),o=EM(e);for(let n of t){r.set(n.eventId,n);for(let t of DM(e,n,a))i.add(t)}for(let t of n){let n=DM(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 fM(e,t){return pM(e)&&pM(t)}function pM(e){return e.type===`native.raw`?$(LM(e.payload.raw).source)===`codex.history.thread_read`:!1}function mM(e){return e===`codex.history.thread_read`||e===`codex.history.thread_read.incremental`}function hM(e){let t=LM(e.payload.raw),n=$(t.source);return t.historyReplay===!0||mM(n)}function gM(e){let t=LM(e.payload.raw),n=LM(t.item),r=LM(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=LM(t.message);if(i===`codex.app_server`){let e=$(a.method),t=LM(a.params);return e===`turn/started`||e===`turn/completed`||e===`turn/failed`||e===`turn/interrupted`?$(LM(t.turn).id)??$(t.turn_id)??$(t.turnId):e===`item/started`||e===`item/updated`||e===`item/completed`?$(t.turn_id)??$(t.turnId)??$(LM(t.item).turn_id)??$(LM(t.item).turnId):void 0}if(i!==`codex.history.thread_read`)return;let o=$(a.scope);if(o===`turn`)return $(LM(a.turn).id);if(o===`item`)return $(a.turn_id)??$(LM(a.item).turn_id)}function _M(e){let t=LM(e.payload.raw);if(e.type===`turn.completed`||e.type===`turn.failed`){let n=$(t.status)??(e.type===`turn.completed`?`completed`:`failed`);return n&&gN(n)?n:void 0}if(e.type!==`native.raw`)return;let n=$(t.source),r=LM(t.message);if(n===`codex.app_server`){let e=$(r.method);if(e!==`turn/completed`&&e!==`turn/failed`&&e!==`turn/interrupted`)return;let t=$(LM(LM(r.params).turn).status)??(e===`turn/completed`?`completed`:e===`turn/interrupted`?`interrupted`:`failed`);return t&&gN(t)?t:void 0}if(n!==`codex.history.thread_read`||$(r.scope)!==`turn`)return;let i=$(LM(r.turn).status);return i&&gN(i)?i:void 0}function vM(e,t){if(!hM(e))return!1;let n=gM(e),r=_M(e);return!n||!r?!1:_N(t.terminalTurnStatusById.get(n),r)}function yM(e,t=!1){let n=new Set,r=new Map;for(let t of e){if(hM(t))continue;let e=gM(t);e&&n.add(e);let i=_M(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 bM(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function xM(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 SM(e,t){let n=CM(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=TM(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 CM(e){let t=new Map,n=new Map;for(let r of e){let e=wM(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 wM(e){let t=Date.parse(e.ts);if(!Number.isFinite(t))return;if(e.type===`item.completed`){let n=LM(LM(e.payload.raw).item);if($(n.type)!==`user_message`||$(n.source_event_type)!==`claude.synthetic.user_input`)return;let r=zM(n);return r?{text:r,tsMs:t,syntheticMessageId:xN(n.id)??xN(n.item_id)??xN(n.itemId)}:void 0}if(e.type!==`native.raw`)return;let n=LM(e.payload.raw);if($(n.source)!==`claude.synthetic.user_input`||($(n.native_type)??$(LM(n.message).type))!==`user`)return;let r=BM(LM(LM(n.message).message));if(r)return{text:r,tsMs:t,syntheticMessageId:xN(LM(n.message).uuid)}}function TM(e){if(e.type!==`native.raw`)return;let t=Date.parse(e.ts);if(!Number.isFinite(t))return;let n=LM(e.payload.raw),r=$(n.source);if(!r||!cM.has(r))return;let i=LM(n.message);if(($(n.native_type)??$(i.type))!==`user`)return;let a=BM(LM(i.message));if(a)return{text:a,tsMs:t}}function EM(e){if(e===`codex`)return{codexTurnScopedItemOccurrences:new Map}}function DM(e,t,n){return e===`codex`?OM(t,n):e===`claude`?PM(t):[]}function OM(e,t){let n=LM(e.payload.raw),r=new Set,i=FM(e.type,n);if(i){let a=kM(e.type,n);a?r.add(MM(a,t,n)):r.add(i)}if(e.type!==`native.raw`)return[...r];let a=$(n.source);if(a===`codex.app_server`){let e=LM(n.message),i=$(e.method),a=LM(e.params);if(i===`turn/started`)return r.add(IM(`turn.started`,{turn:LM(a.turn)})),[...r];if(i===`turn/completed`)return r.add(IM(`turn.completed`,{status:`completed`,turn:LM(a.turn)})),[...r];if(i===`turn/failed`||i===`turn/interrupted`)return r.add(IM(`turn.failed`,{status:i===`turn/interrupted`?`interrupted`:`failed`,turn:LM(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)??$(LM(a.item).turn_id),item:LM(a.item)},o=kM(e,n);return o?r.add(MM(o,t,n)):r.add(IM(e,n)),[...r]}return[...r]}if(a!==`codex.history.thread_read`)return[...r];let o=LM(n.message),s=$(o.scope);if(s===`thread`){let e=LM(o.thread),t=$(e.id);t&&r.add(IM(`thread.started`,{thread_id:t,thread:e}));let n=yN(RM(e.preview)??RM(e.name)??``);return n&&r.add(IM(`thread.title.updated`,{title:n,thread_id:t})),[...r]}if(s===`turn`){let e=LM(o.turn),t=$(e.status);return r.add(IM(`turn.started`,{turn:e})),t===`completed`?r.add(IM(`turn.completed`,{status:t,turn:e})):(t===`failed`||t===`interrupted`)&&r.add(IM(`turn.failed`,{status:t,turn:e})),[...r]}if(s===`item`){let e={turn_id:$(o.turn_id)??$(LM(o.item).turn_id),item:LM(o.item)},n=kM(`item.completed`,e);return n?r.add(MM(n,t,e)):r.add(IM(`item.completed`,e)),[...r]}return[...r]}function kM(e,t){if(!e.startsWith(`item.`))return;let n=LM(t.item),r=$(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId),i=AM($(n.type));if(!(!r||!i))return[`codex`,e,r,i,jM(i,$(n.phase)),$(n.status)??``,ZM($(n.command)),ZM(zM(n))].join(`|`)}function AM(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 jM(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function MM(e,t,n){let r=NM(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 NM(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 PM(e){let t=LM(e.payload.raw),n=FM(e.type,t);if(n)return[n];if(e.type!==`native.raw`)return[];let r=$(t.source);if(!r||!cM.has(r))return[];let i=LM(t.message),a=$(t.native_type)??$(i.type),o=LM(i.message);if(a===`user`){let e=BM(o),t=$(i.uuid);return!e||!t?[]:[IM(`item.completed`,{item:{id:t,type:`user_message`,text:e}})]}if(a===`assistant`){let e=BM(o),t=$(o.id)??$(i.uuid);return!e||!t?[]:[IM(`item.completed`,{item:{id:t,type:`agent_message`,text:e}})]}return[]}function FM(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 IM(e,t);default:return}}function IM(e,t){let n=LM(t.item),r=LM(t.turn),i=LM(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=ZM($(n.command)),p=ZM(zM(n)),m=ZM(RM(t.message)),h=ZM(RM(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 LM(e){return typeof e==`object`&&e?e:{}}function $(e){return typeof e==`string`&&e.trim()||void 0}function RM(e){if(typeof e==`string`)return e.length>0?e:void 0}function zM(e){let t=RM(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=RM(LM(t).text);n&&e.push(n)}if(e.length>0)return e.join(`
519
+ `)}function Bj(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 ${Hj(r.sha,r.title)}.`:r.type===`custom`?r.instructions:`Please review my uncommitted changes.`,a=Uj(t);return a?`${i}\n\nAdditional review instructions:\n${a}`:i}function Vj(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 ${Hj(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 Hj(e,t){let n=Uj(t);return n?`${e} (${JSON.stringify(n)})`:e}function Uj(e){return e?.trim()||void 0}const Wj=process.env.SESSION_FETCH_DEBUG===`1`||process.env.EXPO_PUBLIC_SESSION_FETCH_DEBUG===`1`;function Gj(e){return e.lastHydratedExternalUpdatedAt||e.updatedAt||e.createdAt}function Kj(e,t){Wj&&(!e.startsWith(`config.get`)&&!e.startsWith(`raw-events`)&&!e.startsWith(`sync-external`)&&!e.endsWith(`.error`)||console.log(`[session-fetch][gateway] ${e}`,t))}function qj(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}:{sessionFound:!1}}function Jj(e,t){return e?.status===`running`?{status:`running`}:t?{status:`running`,interactionLockReason:`external_turn_running`}:{status:`idle`}}function Yj(e){return e.status===`active`?!0:e.turns.some(e=>e.status===`inProgress`||e.status===`in_progress`)}function Xj(e,t){if(!t)return Yj(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 Zj(e){return e.startsWith(`sess_`)}function Qj(e){return e.source===`native_discovered`?!0:e.providerMode===`native`&&(e.provider===`codex`||e.provider===`claude`)}function $j(e){return e.nativeSessionId?.trim()??``?!0:e.provider===`codex`&&!Zj(e.id)}function eM(e){return Zj(e.id)?e.nativeSessionId??e.id:e.id}function tM(e){return e.provider!==`codex`&&e.provider!==`claude`||e.providerMode!==`native`?!1:$j(e)}function nM(e){return e instanceof Error&&/^Session .+ is closed$/i.test(e.message)}function rM(e,t){if(e.provider!==`codex`||t.type!==`error.runtime`)return!1;if(xN(t.source)?.startsWith(`codex.app_server`))return!0;let n=xN(t.message)??``;return/\bclosed\b/i.test(n)}const iM={idleTtlMs:900*1e3,sweepIntervalMs:60*1e3,maxSessions:24,maxCodexSessions:8,maxClaudeSessions:16};function aM(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(1,Math.trunc(n)):t}function oM(e,t){let n=Number(e);return Number.isFinite(n)?Math.max(0,Math.trunc(n)):t}var sM=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 dj({preferNativeProviders:e.preferNativeProviders,projectStore:e.projectStore,logger:e.logger}),this.codexAccounts=e.codexAccountService??new gj,this.runtimeLifecycle={idleTtlMs:aM(e.runtimeLifecycle?.idleTtlMs,iM.idleTtlMs),sweepIntervalMs:oM(e.runtimeLifecycle?.sweepIntervalMs,iM.sweepIntervalMs),maxSessions:aM(e.runtimeLifecycle?.maxSessions,iM.maxSessions),maxCodexSessions:aM(e.runtimeLifecycle?.maxCodexSessions,iM.maxCodexSessions),maxClaudeSessions:aM(e.runtimeLifecycle?.maxClaudeSessions,iM.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 tD(),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 Cw(e);return this.options.projectStore.remove(e)}async restartCodexAppServer(){let e=this.getRunningRuntimeSessionCount();if(e>0)throw ww(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 nD(),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 ww(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 tD();let i=null;try{i=await this.codexAccounts.applySavedAccount(e),await nD()}catch(e){if(i?.previousRawContent)try{await this.codexAccounts.restoreCurrentAuthFile(i.previousRawContent),await nD()}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 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 yw(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)||this.maybeHydrateClaudeExternalSessionSummary(n)}async getProjectSessionConfig(e,t){let n=this.options.historyStore.getProjectSession(e,t),r=this.getRuntimeSessionSummary(e,t,n);if(Kj(`config.get.begin`,{projectId:e,sessionId:t,shouldHydrate:n?this.shouldHydrateCodexExternalSessionConfig(n):!1,persisted:qj(n),runtime:qj(r)}),r)return Kj(`config.get.result`,{projectId:e,sessionId:t,resultSource:`runtime`,...qj(r)}),r;let i=await this.maybeHydrateCodexExternalSessionConfig(n);return Kj(`config.get.result`,{projectId:e,sessionId:t,resultSource:i===n?`persisted`:`hydrated`,...qj(i)}),i}async syncProjectSessionHistory(e,t){let n=await this.options.projectStore.getById(e);if(!n)throw yw(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 bw(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);Kj(`sync-external.classify`,$M({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 yw(e);let i=0,a=0,o,s=(s,c)=>{Kj(`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 bw(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 yw(e);let n=this.options.historyStore.getProjectSession(e,t);if(n||=this.getRuntimeSessionSummary(e,t),!n)throw bw(e,t);return n}async startSession(e){let t=await this.resolveProjectForSessionStart(e.projectId,e.cwd),n=`sess_${lw(10)}`,r=e.provider===`codex`&&this.options.requireNativeCodex,i=ek(e.provider,{preferNative:this.options.preferNativeProviders,requireNative:r}),a=await this.getProviderDefaults(e.provider,t.id),o=e.sessionTurnConfig?UA(e.provider,e.sessionTurnConfig):GA({provider:e.provider,legacyModel:e.model,legacySessionConfig:e.sessionConfig}),s=KA({provider:e.provider,providerDefaults:a,currentSessionTurnConfig:o}),c=await i.createSession({sessionId:n,model:s.model,cwd:t.path,sessionConfig:s.sessionConfig,metadata:e.metadata,logger:this.options.logger});if(r&&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(e.provider,c,n),u=this.resolveNativeSessionId(e.provider,c,l),d=new Date().toISOString(),f=await this.attachRuntimeSession({id:l,nativeSessionId:u,source:`gateway`,projectId:t.id,projectPath:t.path,provider:e.provider,providerMode:c.providerMode,model:s.model,title:void 0,sessionTurnConfig:o,sessionTurnConfigUpdatedAt:d,createdAt:d,updatedAt:d,status:`idle`,providerSession:c,pendingToolApprovals:new Set,pendingUserInputs:new Set,streamReady:!1,bufferedProviderEvents:[],lastActiveAtMs:Date.now(),dispatchInFlight:!1,closing:!1});return this.markSessionStreamReady(f),await this.options.auditLogger.record({ts:new Date().toISOString(),action:`session.start`,deviceId:e.deviceId,sessionId:f.id,detail:{provider:e.provider,model:s.model,sessionConfig:e.sessionConfig,sessionTurnConfig:o,projectId:t.id,projectPath:t.path}}),{sessionId:f.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 Sw(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!a&&this.preparingRuntimeDispatches.has(e))throw Sw(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(i?.interactionLockReason===`external_turn_running`)throw Sw(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 Sw(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&Qj(i))throw Sw(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 xw(e);let i=await this.getProviderDefaults(s.provider,s.projectId),l=KA({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=yN(t);e&&this.setSessionTitle(s,e)}let u=new Date().toISOString();s.sessionTurnConfig=UA(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 Sw(e,`the previous turn is still being dispatched`,{reason:`dispatch_in_flight`});if(!a&&this.preparingRuntimeDispatches.has(e))throw Sw(e,`the previous turn is still being dispatched`,{reason:`dispatch_preparing`});if(i?.interactionLockReason===`external_turn_running`)throw Sw(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 Sw(e,`the current turn is still running`,{reason:`runtime_running`,provider:a.provider,providerMode:a.providerMode});if(!a&&i?.status===`running`&&Qj(i))throw Sw(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 xw(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=KA({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=zj(t,r?.input);if(s=await this.sendInputWithRuntimeRecovery(e,s,u,{model:l.model,sessionConfig:l.sessionConfig}),!s.title){let e=bN(t,r?.input);e&&this.setSessionTitle(s,e)}let d=new Date().toISOString();s.sessionTurnConfig=UA(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(!nM(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:SN(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 xw(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_${lw(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=ek(t.provider,{preferNative:this.options.preferNativeProviders,requireNative:n}),i=await this.getProviderDefaults(t.provider,t.projectId),a=UA(t.provider,t.sessionTurnConfig),o=KA({provider:t.provider,providerDefaults:i,currentSessionTurnConfig:a}),s=t.provider===`claude`?eM(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 Sw(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 XD(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=CN(t.createdAt),s=CN(t.updatedAt),l=Jj(i,Yj(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:aj({runtimeModel:i?.model,discoveredModel:t.model,existingModel:n?.model,modelProvider:t.modelProvider}),title:i?.title??yN(t.name??t.preview)??n?.title,sessionTurnConfig:i?.sessionTurnConfig??n?.sessionTurnConfig,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 ik(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=Jj(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,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=Gj(e),n=VM([e.nativeSessionId,e.id]);for(let r of n)try{Kj(`config.get.probe.begin`,{projectId:e.projectId,sessionId:e.id,threadId:r,...qj(e)});let n=await $D(r);if(!n){Kj(`config.get.probe.empty`,{projectId:e.projectId,sessionId:e.id,threadId:r});continue}let i={...e,model:ij(n.model)??e.model,sessionTurnConfig:n.sessionTurnConfig??e.sessionTurnConfig,sessionTurnConfigUpdatedAt:n.sessionTurnConfigUpdatedAt,...t?{lastHydratedExternalConfigFreshnessAt:t}:{}};return await this.options.historyStore.upsertSession(i),Kj(`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:qj(i)}),this.options.historyStore.getProjectSession(e.projectId,e.id)??i}catch(t){Kj(`config.get.probe.error`,{projectId:e.projectId,sessionId:e.id,threadId:r,error:String(t)})}return e}async maybeHydrateClaudeExternalSessionSummary(e){if(!e||e.provider!==`claude`||!Qj(e)||!$j(e))return e;let t=UM(e);if(!t)return e;try{let n=await ak({projectPath:e.projectPath,nativeSessionId:t,provider:e.provider,sessionId:e.id,projectId:e.projectId});return this.patchObservedExternalSessionSummary(e,{updatedAt:n.updatedAt,externallyRunning:n.status===`running`,model:n.model})}catch(t){if(e.source===`native_discovered`&&HM(t))return e;throw t}}shouldHydrateCodexExternalSessionConfig(e){if(!this.options.preferNativeProviders||e.provider!==`codex`||!tM(e)||this.sessions.has(e.id)||e.nativeSessionId&&this.sessions.has(e.nativeSessionId))return!1;let t=Gj(e),n=e.sessionTurnConfigUpdatedAt||``;if(!e.sessionTurnConfig||!ij(e.model)||!n)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 yw(e);if((await this.options.projectStore.upsertByPath(t)).id!==n.id)throw Error(`projectId (${e}) does not match cwd (${t})`);return await wN(n.path),n}if(e){let t=await this.options.projectStore.getById(e);if(!t)throw yw(e);return await wN(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=xN(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=xN(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),rM(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_${lw(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_${lw(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=UM(e);if(!i)return{rawEvents:n};try{let a=Date.now(),o=await ak({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});return Kj(`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`&&HM(i)&&await this.markExternalHistoryHydrated(e.id,e.updatedAt),Kj(`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=yM(n,(this.sessions.get(e.id)??(e.nativeSessionId?this.sessions.get(e.nativeSessionId):void 0))?.status===`running`),a=VM([e.nativeSessionId,e.id]);for(let o of a)try{let a=Date.now(),s=await QD(o,!0),c=Date.now(),l,u;if(e.source===`gateway`&&n.length>0)l=fN({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=nN({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localEvents:n});r?(l=r,u=`native_tail_incremental`):(l=tN({thread:s,provider:e.provider,sessionId:e.id,projectId:t,localCodexLiveTurnState:i}),u=`full`)}else l=tN({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,CN(s.updatedAt),i),p=await this.patchObservedExternalSessionSummary(e,{updatedAt:CN(s.updatedAt),externallyRunning:e.source===`gateway`?Xj(s,i):Yj(s)});return Kj(`sync-external.codex`,{projectId:t,sessionId:e.id,source:e.source,threadId:o,threadStatus:s.status,threadUpdatedAt:CN(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`?Xj(s,i):Yj(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){Kj(`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 Kj(`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=lM(e.provider,t,n,i),s=Date.now(),c=await this.maybePersistSyncedExternalRawEvents(e,t,o,!0);return await this.markExternalHistoryHydrated(e.id,r),Kj(`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=Jj(r,t.externallyRunning),a=i.status===`running`?r?.pendingToolApprovals.size??0:0,o=i.status===`running`?r?.pendingUserInputs.size??0:0,s={...n,updatedAt:i.status===`running`?r?.updatedAt??t.updatedAt:t.updatedAt,status:i.status,model:r?.model??ij(t.model)??n.model,interactionLockReason:i.interactionLockReason,pendingApprovals:a,pendingUserInputs:o,pendingActions:a+o};return await this.options.historyStore.upsertSession(s),this.options.historyStore.getSession(e.id)??s}async markExternalHistoryHydrated(e,t){await this.options.historyStore.patchSession(e,{lastHydratedExternalUpdatedAt:t})}mustGetSession(e){let t=this.sessions.get(e);if(!t)throw xw(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=vN(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 cM=new Set([`claude.history.getSessionMessages`,`claude.history.jsonl`]);function lM(e,t,n,r){if(e===`claude`)return dM(e,SM(t,n),n);if(e!==`codex`)return dM(e,t,n);if(t.length===0)return n.slice().sort((e,t)=>e.ts.localeCompare(t.ts));let i=r??yM(t),a=uM(e,t.filter(e=>!hM(e))),o=EM(e),s=t.filter(t=>{if(vM(t,i))return!1;if(!hM(t))return!0;let n=DM(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=EM(e),f=EM(e),p=xM(t)??xM(n)??Date.now();for(let[t,n]of s.entries()){c.set(n.eventId,n),l.set(n.eventId,t);for(let t of DM(e,n,d))u.add(t)}for(let t of n){if(vM(t,i))continue;let n=DM(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(!fM(r,t))continue;let e=l.get(t.eventId),n=bM(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 uM(e,t){let n=new Map,r=EM(e);for(let i of t)for(let t of DM(e,i,r))n.set(t,(n.get(t)??0)+1);return n}function dM(e,t,n){let r=new Map,i=new Set,a=EM(e),o=EM(e);for(let n of t){r.set(n.eventId,n);for(let t of DM(e,n,a))i.add(t)}for(let t of n){let n=DM(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 fM(e,t){return pM(e)&&pM(t)}function pM(e){return e.type===`native.raw`?$(LM(e.payload.raw).source)===`codex.history.thread_read`:!1}function mM(e){return e===`codex.history.thread_read`||e===`codex.history.thread_read.incremental`}function hM(e){let t=LM(e.payload.raw),n=$(t.source);return t.historyReplay===!0||mM(n)}function gM(e){let t=LM(e.payload.raw),n=LM(t.item),r=LM(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=LM(t.message);if(i===`codex.app_server`){let e=$(a.method),t=LM(a.params);return e===`turn/started`||e===`turn/completed`||e===`turn/failed`||e===`turn/interrupted`?$(LM(t.turn).id)??$(t.turn_id)??$(t.turnId):e===`item/started`||e===`item/updated`||e===`item/completed`?$(t.turn_id)??$(t.turnId)??$(LM(t.item).turn_id)??$(LM(t.item).turnId):void 0}if(i!==`codex.history.thread_read`)return;let o=$(a.scope);if(o===`turn`)return $(LM(a.turn).id);if(o===`item`)return $(a.turn_id)??$(LM(a.item).turn_id)}function _M(e){let t=LM(e.payload.raw);if(e.type===`turn.completed`||e.type===`turn.failed`){let n=$(t.status)??(e.type===`turn.completed`?`completed`:`failed`);return n&&gN(n)?n:void 0}if(e.type!==`native.raw`)return;let n=$(t.source),r=LM(t.message);if(n===`codex.app_server`){let e=$(r.method);if(e!==`turn/completed`&&e!==`turn/failed`&&e!==`turn/interrupted`)return;let t=$(LM(LM(r.params).turn).status)??(e===`turn/completed`?`completed`:e===`turn/interrupted`?`interrupted`:`failed`);return t&&gN(t)?t:void 0}if(n!==`codex.history.thread_read`||$(r.scope)!==`turn`)return;let i=$(LM(r.turn).status);return i&&gN(i)?i:void 0}function vM(e,t){if(!hM(e))return!1;let n=gM(e),r=_M(e);return!n||!r?!1:_N(t.terminalTurnStatusById.get(n),r)}function yM(e,t=!1){let n=new Set,r=new Map;for(let t of e){if(hM(t))continue;let e=gM(t);e&&n.add(e);let i=_M(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 bM(e,t){return{...t,rawSeq:e.rawSeq,ts:e.ts}}function xM(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 SM(e,t){let n=CM(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=TM(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 CM(e){let t=new Map,n=new Map;for(let r of e){let e=wM(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 wM(e){let t=Date.parse(e.ts);if(!Number.isFinite(t))return;if(e.type===`item.completed`){let n=LM(LM(e.payload.raw).item);if($(n.type)!==`user_message`||$(n.source_event_type)!==`claude.synthetic.user_input`)return;let r=zM(n);return r?{text:r,tsMs:t,syntheticMessageId:xN(n.id)??xN(n.item_id)??xN(n.itemId)}:void 0}if(e.type!==`native.raw`)return;let n=LM(e.payload.raw);if($(n.source)!==`claude.synthetic.user_input`||($(n.native_type)??$(LM(n.message).type))!==`user`)return;let r=BM(LM(LM(n.message).message));if(r)return{text:r,tsMs:t,syntheticMessageId:xN(LM(n.message).uuid)}}function TM(e){if(e.type!==`native.raw`)return;let t=Date.parse(e.ts);if(!Number.isFinite(t))return;let n=LM(e.payload.raw),r=$(n.source);if(!r||!cM.has(r))return;let i=LM(n.message);if(($(n.native_type)??$(i.type))!==`user`)return;let a=BM(LM(i.message));if(a)return{text:a,tsMs:t}}function EM(e){if(e===`codex`)return{codexTurnScopedItemOccurrences:new Map}}function DM(e,t,n){return e===`codex`?OM(t,n):e===`claude`?PM(t):[]}function OM(e,t){let n=LM(e.payload.raw),r=new Set,i=FM(e.type,n);if(i){let a=kM(e.type,n);a?r.add(MM(a,t,n)):r.add(i)}if(e.type!==`native.raw`)return[...r];let a=$(n.source);if(a===`codex.app_server`){let e=LM(n.message),i=$(e.method),a=LM(e.params);if(i===`turn/started`)return r.add(IM(`turn.started`,{turn:LM(a.turn)})),[...r];if(i===`turn/completed`)return r.add(IM(`turn.completed`,{status:`completed`,turn:LM(a.turn)})),[...r];if(i===`turn/failed`||i===`turn/interrupted`)return r.add(IM(`turn.failed`,{status:i===`turn/interrupted`?`interrupted`:`failed`,turn:LM(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)??$(LM(a.item).turn_id),item:LM(a.item)},o=kM(e,n);return o?r.add(MM(o,t,n)):r.add(IM(e,n)),[...r]}return[...r]}if(a!==`codex.history.thread_read`)return[...r];let o=LM(n.message),s=$(o.scope);if(s===`thread`){let e=LM(o.thread),t=$(e.id);t&&r.add(IM(`thread.started`,{thread_id:t,thread:e}));let n=yN(RM(e.preview)??RM(e.name)??``);return n&&r.add(IM(`thread.title.updated`,{title:n,thread_id:t})),[...r]}if(s===`turn`){let e=LM(o.turn),t=$(e.status);return r.add(IM(`turn.started`,{turn:e})),t===`completed`?r.add(IM(`turn.completed`,{status:t,turn:e})):(t===`failed`||t===`interrupted`)&&r.add(IM(`turn.failed`,{status:t,turn:e})),[...r]}if(s===`item`){let e={turn_id:$(o.turn_id)??$(LM(o.item).turn_id),item:LM(o.item)},n=kM(`item.completed`,e);return n?r.add(MM(n,t,e)):r.add(IM(`item.completed`,e)),[...r]}return[...r]}function kM(e,t){if(!e.startsWith(`item.`))return;let n=LM(t.item),r=$(t.turn_id)??$(t.turnId)??$(n.turn_id)??$(n.turnId),i=AM($(n.type));if(!(!r||!i))return[`codex`,e,r,i,jM(i,$(n.phase)),$(n.status)??``,ZM($(n.command)),ZM(zM(n))].join(`|`)}function AM(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 jM(e,t){return e===`agent_message`&&(!t||t===`final_answer`)?``:t??``}function MM(e,t,n){let r=NM(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 NM(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 PM(e){let t=LM(e.payload.raw),n=FM(e.type,t);if(n)return[n];if(e.type!==`native.raw`)return[];let r=$(t.source);if(!r||!cM.has(r))return[];let i=LM(t.message),a=$(t.native_type)??$(i.type),o=LM(i.message);if(a===`user`){let e=BM(o),t=$(i.uuid);return!e||!t?[]:[IM(`item.completed`,{item:{id:t,type:`user_message`,text:e}})]}if(a===`assistant`){let e=BM(o),t=$(o.id)??$(i.uuid);return!e||!t?[]:[IM(`item.completed`,{item:{id:t,type:`agent_message`,text:e}})]}return[]}function FM(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 IM(e,t);default:return}}function IM(e,t){let n=LM(t.item),r=LM(t.turn),i=LM(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=ZM($(n.command)),p=ZM(zM(n)),m=ZM(RM(t.message)),h=ZM(RM(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 LM(e){return typeof e==`object`&&e?e:{}}function $(e){return typeof e==`string`&&e.trim()||void 0}function RM(e){if(typeof e==`string`)return e.length>0?e:void 0}function zM(e){let t=RM(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=RM(LM(t).text);n&&e.push(n)}if(e.length>0)return e.join(`
520
520
  `)}let r=Array.isArray(e.summary)?e.summary:[];if(r.length>0){let e=r.map(e=>RM(e)).filter(e=>!!e);if(e.length>0)return e.join(`
521
521
  `)}return``}function BM(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=LM(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(`
522
522
  `)}function VM(e){let t=new Set;for(let n of e)n&&t.add(n);return[...t]}function HM(e){return String(e).includes(`returned no messages from getSessionMessages`)}function UM(e){return eM(e)}function WM(e){return e?{rawSeq:e.rawSeq,type:e.type,eventId:e.eventId,ts:e.ts}:null}function GM(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(!KM(n,i))return r}return e.length===t.length?null:n}function KM(e,t){return YM(qM(e))===YM(qM(t))}function qM(e){let{ts:t,...n}=e;return n}function JM(e){if(typeof e==`string`)return XM(e);if(Array.isArray(e))return e.map(e=>JM(e));if(!e||typeof e!=`object`)return e;let t=e,n={};for(let e of Object.keys(t).sort())n[e]=JM(t[e]);return n}function YM(e){return JSON.stringify(JM(e))}function XM(e){return e.length<=4096?e:{__type:`hashed_text`,length:e.length,sha256:(0,l.createHash)(`sha256`).update(e).digest(`hex`)}}function ZM(e){if(!e)return``;let t=XM(e);return typeof t==`string`?t:`sha256:${t.length}:${t.sha256}`}function QM(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 $M(e){let t=e.previousEvents[e.previousEvents.length-1]?.rawSeq??null,n=e.nextEvents[e.nextEvents.length-1]?.rawSeq??null,r=GM(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:QM(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:WM(r===null?void 0:e.previousEvents[r]),nextMismatchEvent:WM(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&&KM(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&&KM(e,r)})?{historyUpdated:!0,refreshMode:`delta`,fromRawSeq:n??0,toRawSeq:r??n??0}:{historyUpdated:!0,refreshMode:`snapshot`,...r===void 0?{}:{toRawSeq:r}}}function tN(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:dN(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);(gN(t.status)?!_N(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,xN(n.id)??null])}return t}function nN(e){let t=rN(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(xM(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:dN(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,xN(t.id)??null]);continue}let a=n!==c,o=aN(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,xN(t.id)??null])}}return r}function rN(e){let t={hasHistoryReplay:!1,hasThreadEnvelope:!1,turnOrder:[],turnsById:new Map};for(let n of e){if(n.type!==`native.raw`)continue;let e=LM(n.payload.raw);if($(e.source)!==`codex.history.thread_read`)continue;let r=LM(e.message),i=$(r.scope);if(t.hasHistoryReplay=!0,i===`thread`){t.hasThreadEnvelope=!0;continue}if(i===`turn`){let e=LM(r.turn),n=$(e.id);if(!n)continue;let i=iN(t,n),a=$(e.status);a&&(i.status=a),i.fingerprint=lN(e);continue}if(i!==`item`)continue;let a=LM(r.item),o=$(r.turn_id)??$(a.turn_id);if(!o)continue;let s=iN(t,o),c=oN(o,a,void 0,s.itemOccurrenceByBaseKey);c&&(s.itemFingerprintByKey.has(c)||s.itemOrder.push(c),s.itemFingerprintByKey.set(c,cN(a)))}return t}function iN(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 aN(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||oN(t.id,a,r,n)!==i||e.itemFingerprintByKey.get(i)!==cN(a))return{safe:!1,appendedItems:[],statusChanged:!1}}return e.fingerprint!==void 0&&e.fingerprint!==lN(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 oN(e,t,n,r){let i=sN(e,t,n);if(!i)return;if(!r)return i;let a=(r.get(i)??0)+1;return r.set(i,a),`${i}|${a}`}function sN(e,t,n){let r=kM(`item.completed`,{turn_id:e,item:t});if(r)return r;let i=xN(t.id);if(i)return`id:${i}`;if(n!==void 0)return`${e}::${n}`}function cN(e){let t=AM($(e.type)),n=t?jM(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),YM(r)}function lN(e){return YM({status:$(e.status)??null,error:LM(e.error)})}function uN(e){return String(e??``).replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/^_+|_+$/g,``)}function dN(e,t,n){let r=n.map(uN).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 fN(e){let t=e.localCodexLiveTurnState??yM(e.localEvents),n=new Set,r=pN(e.localEvents),i=new Map,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=LM(t.payload.raw),s=$(r.source),c=s===`codex.history.thread_read.incremental`;if(t.type===`turn.started`){let e=$(r.turn_id)??$(LM(r.turn).id);e&&!c&&n.add(e);continue}if(t.type===`turn.completed`||t.type===`turn.failed`){let e=$(r.turn_id)??$(LM(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`||s!==`codex.history.thread_read`)continue;let l=LM(r.message);if($(l.scope)===`turn`){let e=LM(l.turn),t=$(e.id);if(!t)continue;let n=$(e.status);n&&gN(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,r)=>{let i=d();f.push({v:`1.0`,kind:`provider.raw`,rawSeq:o,provider:e.provider,sessionId:e.sessionId,projectId:e.projectId,eventId:u(r),ts:i,type:t,payload:{raw:{...n,historyReplay:!0,replaySynthetic:!0,source:`codex.history.thread_read.incremental`}}}),o+=1};for(let a of e.thread.turns){let e=i.get(a.id),s=_N(e,a.status);!(n.has(a.id)||t.activeTurnIds.has(a.id))&&!s&&p(`turn.started`,{type:`turn.started`,turn:{id:a.id,status:a.status,items:[],error:a.error}},[`turn_started`,a.id]);let c=new Map;for(let e of a.items){let t=$(e.id),n=oN(a.id,e,void 0,c);if(n&&r.has(n))continue;let i=n?mN(n):void 0;p(`item.completed`,{type:`item.completed`,turn_id:a.id,item:e,...i?{semantic_occurrence:i}:{}},[`item_completed`,a.id,t??`seq_${o}`])}if(gN(a.status)&&e!==a.status){if(a.status===`completed`){p(`turn.completed`,{type:`turn.completed`,status:a.status,turn:{id:a.id,status:a.status,items:[],error:a.error}},[`turn_terminal`,a.id]);continue}p(`turn.failed`,{type:`turn.failed`,status:a.status,turn:{id:a.id,status:a.status,items:[],error:a.error},...a.error?{error:a.error}:{}},[`turn_terminal`,a.id])}}return f}function pN(e){let t=new Set,n=new Map;for(let r of e){let e=hN(r);if(!e)continue;let i=oN(e.turnId,e.item,void 0,n);i&&t.add(i)}return t}function mN(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 hN(e){let t=LM(e.payload.raw);if(e.type===`item.completed`){let e=LM(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=LM(t.message);if($(e.method)!==`item/completed`)return null;let n=LM(e.params),r=LM(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=LM(t.message);if($(e.scope)!==`item`)return null;let n=LM(e.item),r=$(e.turn_id)??$(n.turn_id)??$(n.turnId);return!r||Object.keys(n).length===0?null:{turnId:r,item:n}}return null}function gN(e){return e===`completed`||e===`failed`||e===`interrupted`}function _N(e,t){return e===t&&gN(t)}function vN(e){let t=e.replace(/\u001B\[[0-?]*[ -/]*[@-~]/g,``).replace(/\s+/g,` `).trim();if(t)return t}function yN(e,t=60){let n=vN(e);if(!n)return;let r=Array.from(n);return r.length<=t?n:r.slice(0,t).join(``).trimEnd()}function bN(e,t){if(t){let e=yN(t);if(e)return e}if(e.provider!==`codex`||!e.codex)return yN(`代码审查`);let n=e.codex.target;return n.type===`baseBranch`?yN(`审查 ${n.branch} 分支改动`):n.type===`custom`?yN(n.instructions):n.type===`commit`?yN(n.title||`审查提交 ${n.sha.slice(0,12)}`):yN(`审查未提交更改`)}function xN(e){if(typeof e!=`string`)return;let t=vN(e);if(t)return t}function SN(e){let t=0;for(let n of Object.values(e))n.some(e=>e.trim().length>0)&&(t+=1);return t}function CN(e){return!Number.isFinite(e)||e<=0?new Date().toISOString():new Date(e*1e3).toISOString()}async function wN(e){if(!(await d.default.stat(e)).isDirectory())throw Error(`Project path is not a directory: ${e}`)}var TN=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=EN(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,EN({...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)&&(GN(t)||await this.enqueueRawSessionWrite(t.sessionId,async()=>{if(LN(t)){let e=WN([...await this.readSessionRawEventsLocked(t.sessionId),t]);await this.replaceRawEventFile(t.sessionId,e),this.rawEventsCacheBySession.set(t.sessionId,e),this.compactedRawEventsCacheBySession.set(t.sessionId,MN(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=RN(await this.readSessionRawEventsLocked(e),r,n);await this.replaceRawEventFile(e,t);let a=MN(t);i=NN(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 Lp(i.filter(e=>e.rawSeq>t)).slice(0,r);let a=[];return await this.enqueueWrite(async()=>{a=Lp((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 AN(t);let n=null;return await this.enqueueWrite(async()=>{n=AN(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=`${kN(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=>kN(e)).join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "craby-gateway",
3
- "version": "0.23.2",
3
+ "version": "0.23.4",
4
4
  "description": "Craby desktop gateway CLI",
5
5
  "bin": {
6
6
  "craby-gateway": "dist-sea/gateway.cjs"