openclaw-code-agent 2.2.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -43,7 +43,7 @@ For the current version-pinned breakdown, see [docs/ACP-COMPARISON.md](docs/ACP-
43
43
 
44
44
  - **Multi-session management** — Run multiple concurrent coding agent sessions, each with a unique ID and human-readable name
45
45
  - **Plan → Execute workflow** — Claude Code sessions expose plan mode; Codex uses a soft first-turn planning prompt while staying externally in implement mode
46
- - **Real Codex approval policy support** — Codex sessions default to the real Codex SDK/CLI `approvalPolicy: "on-request"` and can be pinned back to `"never"` in plugin config
46
+ - **Real Codex approval policy support** — Codex sessions default to the real Codex SDK/CLI `approvalPolicy: "on-request"` and can be pinned back to `"never"` via `harnesses.codex.approvalPolicy`
47
47
  - **Thread-based routing** — Notifications go to the Telegram thread/topic where the session was launched
48
48
  - **Pause + auto-resume** — Non-question turn completion pauses sessions (`done`) and next `agent_respond` auto-resumes with context intact
49
49
  - **Turn-end wake signaling** — Every turn end emits a deterministic wake signal with output preview and waiting hint
@@ -83,7 +83,19 @@ Add to `~/.openclaw/openclaw.json` under `plugins.entries["openclaw-code-agent"]
83
83
  "enabled": true,
84
84
  "config": {
85
85
  "fallbackChannel": "telegram|my-bot|123456789",
86
- "maxSessions": 20
86
+ "maxSessions": 20,
87
+ "harnesses": {
88
+ "codex": {
89
+ "defaultModel": "gpt-5.4",
90
+ "allowedModels": ["gpt-5.4"],
91
+ "reasoningEffort": "medium",
92
+ "approvalPolicy": "on-request"
93
+ },
94
+ "claude-code": {
95
+ "defaultModel": "sonnet",
96
+ "allowedModels": ["sonnet", "opus"]
97
+ }
98
+ }
87
99
  }
88
100
  }
89
101
  }
@@ -164,13 +176,15 @@ The plugin sends targeted notifications to the originating Telegram thread:
164
176
  | Emoji | Event | Description |
165
177
  |-------|-------|-------------|
166
178
  | 🚀 | Launched | Session started with prompt summary |
167
- | 🔔 | Agent asks | Session is waiting for user input |
179
+ | | Waiting for input | Session is waiting for user input |
168
180
  | 📋 | Plan ready | Plan approval requested — reply "go" to approve |
169
- | 🔄 | Turn done | Turn completed, session paused (auto-resumable) |
181
+ | ⏸️ | Paused after turn | Turn completed, session paused (auto-resumable) |
182
+ | ↪️ | Redirected | Active work was intentionally interrupted and redirected in-place |
183
+ | ▶️ | Auto-resumed | Session resumed on the next `agent_respond` |
170
184
  | ✅ | Completed | Completion summary with cost and duration |
171
185
  | ❌ | Failed | Error notification with hint |
172
- | | Killed | Session terminated with kill reason |
173
- | 💤 | Idle-killed | Auto-resumes on next respond |
186
+ | 💤 | Idle timeout | Session timed out while waiting; auto-resumes on next respond |
187
+ | | Stopped | Session was stopped by user, shutdown, or another forced stop |
174
188
 
175
189
  ---
176
190
 
@@ -179,7 +193,7 @@ The plugin sends targeted notifications to the originating Telegram thread:
179
193
  - **Claude Code** starts in `plan` mode by default. Approve a pending plan with `agent_respond(..., approve=true)` and the session switches to `bypassPermissions`.
180
194
  - **Codex** does not surface `plan` or `awaiting-plan-approval` in session state. When launched with `permissionMode: "plan"`, its first turn is prompted to return a plan and ask whether to proceed, while the exposed session phase remains implementation-oriented.
181
195
  - For **Codex**, plugin `permissionMode` is a plugin-orchestrated planning/approval workflow. It is not the same thing as the Codex SDK/CLI `approvalPolicy`.
182
- - The real Codex SDK/CLI approval behavior is controlled by plugin config `codexApprovalPolicy`. Supported values are `"on-request"` (default) and `"never"`.
196
+ - The real Codex SDK/CLI approval behavior is controlled by `harnesses.codex.approvalPolicy`. Supported values are `"on-request"` (default) and `"never"`.
183
197
 
184
198
  On approval, the plugin prepends a system instruction telling the agent to exit plan mode and implement with full permissions.
185
199
 
@@ -219,11 +233,8 @@ Set values in `~/.openclaw/openclaw.json` under `plugins.entries["openclaw-code-
219
233
  | `sessionGcAgeMinutes` | `number` | `1440` | TTL for completed/failed/killed runtime sessions before GC eviction |
220
234
  | `maxPersistedSessions` | `number` | `10000` | Max completed sessions kept for resume; the 24h GC TTL (`sessionGcAgeMinutes`) is the primary retention control |
221
235
  | `planApproval` | `string` | `"delegate"` | `"approve"` (orchestrator can auto-approve) / `"ask"` (always forward to user) / `"delegate"` (orchestrator decides) |
222
- | `codexApprovalPolicy` | `string` | `"on-request"` | Codex-only real SDK/CLI approval policy: `"on-request"` by default, or `"never"` for fully non-interactive Codex approval behavior |
223
236
  | `defaultHarness` | `string` | `"claude-code"` | Default harness for new sessions (`"claude-code"` / `"codex"`) |
224
- | `model` | `string` | | Codex-only model override for new sessions (for example `"gpt-5.3-codex"`). Used when no explicit `model` is passed to `agent_launch`; falls back to `defaultModel` if unset |
225
- | `reasoningEffort` | `string` | `"medium"` | Codex-only reasoning effort: `"low"`, `"medium"`, or `"high"` |
226
- | `defaultModel` | `string` | — | Default model for new sessions (e.g. `"sonnet"`, `"opus"`) |
237
+ | `harnesses` | `object` | built-in defaults | Per-harness defaults and restrictions. Built-in defaults: `claude-code.defaultModel = "sonnet"`, `claude-code.allowedModels = ["sonnet","opus"]`, `codex.defaultModel = "gpt-5.4"`, `codex.allowedModels = ["gpt-5.4"]`, `codex.reasoningEffort = "medium"`, `codex.approvalPolicy = "on-request"` |
227
238
  | `defaultWorkdir` | `string` | — | Default working directory for new sessions |
228
239
 
229
240
  ### Permission Mode Mapping By Harness
@@ -234,8 +245,8 @@ Permission modes are shared at the plugin API, but each harness maps them differ
234
245
  - `default`, `plan`, `acceptEdits`, `bypassPermissions` are passed through the SDK
235
246
  - **Codex harness**
236
247
  - Always runs with SDK thread option `sandboxMode: "danger-full-access"`
237
- - Uses Codex SDK/CLI `approvalPolicy: "on-request"` by default, or `"never"` when `codexApprovalPolicy` is set
238
- - Supports plugin config `model`, `reasoningEffort`, and `codexApprovalPolicy` defaults for Codex SDK thread launches
248
+ - Uses Codex SDK/CLI `approvalPolicy: "on-request"` by default, or `"never"` when `harnesses.codex.approvalPolicy` is set
249
+ - Supports `harnesses.codex.defaultModel`, `harnesses.codex.allowedModels`, `harnesses.codex.reasoningEffort`, and `harnesses.codex.approvalPolicy`
239
250
  - In `bypassPermissions`, the harness adds filesystem root (`/` on POSIX) to Codex `additionalDirectories`, plus optional extras from `OPENCLAW_CODEX_BYPASS_ADDITIONAL_DIRS` (comma-separated)
240
251
  - `setPermissionMode()` is applied by recreating the thread on the next turn via `resumeThread` (same thread ID)
241
252
  - `plan` / `acceptEdits` remain plugin behavioral orchestration constraints (planning/approval flow), not Codex sandbox or SDK approval settings
@@ -264,10 +275,18 @@ Permission modes are shared at the plugin API, but each harness maps them differ
264
275
  "enabled": true,
265
276
  "config": {
266
277
  "maxSessions": 3,
267
- "model": "gpt-5.3-codex",
268
- "reasoningEffort": "high",
269
- "codexApprovalPolicy": "on-request",
270
- "defaultModel": "sonnet",
278
+ "harnesses": {
279
+ "codex": {
280
+ "defaultModel": "gpt-5.4",
281
+ "allowedModels": ["gpt-5.4"],
282
+ "reasoningEffort": "high",
283
+ "approvalPolicy": "on-request"
284
+ },
285
+ "claude-code": {
286
+ "defaultModel": "sonnet",
287
+ "allowedModels": ["sonnet", "opus"]
288
+ }
289
+ },
271
290
  "permissionMode": "plan",
272
291
  "fallbackChannel": "telegram|my-bot|123456789",
273
292
  "agentChannels": {
package/dist/index.js CHANGED
@@ -1,66 +1,66 @@
1
- var ma=Object.defineProperty;var Qr=(e,t)=>{for(var r in t)ma(e,r,{get:t[r],enumerable:!0})};import{existsSync as Bc}from"fs";var Q={};Qr(Q,{HasPropertyKey:()=>nr,IsArray:()=>K,IsAsyncIterator:()=>Zr,IsBigInt:()=>Ut,IsBoolean:()=>ve,IsDate:()=>rt,IsFunction:()=>en,IsIterator:()=>tn,IsNull:()=>rn,IsNumber:()=>ue,IsObject:()=>P,IsRegExp:()=>Nt,IsString:()=>M,IsSymbol:()=>nn,IsUint8Array:()=>Ke,IsUndefined:()=>L});function nr(e,t){return t in e}function Zr(e){return P(e)&&!K(e)&&!Ke(e)&&Symbol.asyncIterator in e}function K(e){return Array.isArray(e)}function Ut(e){return typeof e=="bigint"}function ve(e){return typeof e=="boolean"}function rt(e){return e instanceof globalThis.Date}function en(e){return typeof e=="function"}function tn(e){return P(e)&&!K(e)&&!Ke(e)&&Symbol.iterator in e}function rn(e){return e===null}function ue(e){return typeof e=="number"}function P(e){return typeof e=="object"&&e!==null}function Nt(e){return e instanceof globalThis.RegExp}function M(e){return typeof e=="string"}function nn(e){return typeof e=="symbol"}function Ke(e){return e instanceof globalThis.Uint8Array}function L(e){return e===void 0}function ca(e){return e.map(t=>or(t))}function pa(e){return new Date(e.getTime())}function la(e){return new Uint8Array(e)}function fa(e){return new RegExp(e.source,e.flags)}function ga(e){let t={};for(let r of Object.getOwnPropertyNames(e))t[r]=or(e[r]);for(let r of Object.getOwnPropertySymbols(e))t[r]=or(e[r]);return t}function or(e){return K(e)?ca(e):rt(e)?pa(e):Ke(e)?la(e):Nt(e)?fa(e):P(e)?ga(e):e}function F(e){return or(e)}function lt(e,t){return t===void 0?F(e):F({...t,...e})}function Jn(e){return e!==null&&typeof e=="object"}function Xn(e){return globalThis.Array.isArray(e)&&!globalThis.ArrayBuffer.isView(e)}function Qn(e){return e===void 0}function Zn(e){return typeof e=="number"}var sr;(function(e){e.InstanceMode="default",e.ExactOptionalPropertyTypes=!1,e.AllowArrayObject=!1,e.AllowNaN=!1,e.AllowNullVoid=!1;function t(i,m){return e.ExactOptionalPropertyTypes?m in i:i[m]!==void 0}e.IsExactOptionalProperty=t;function r(i){let m=Jn(i);return e.AllowArrayObject?m:m&&!Xn(i)}e.IsObjectLike=r;function n(i){return r(i)&&!(i instanceof Date)&&!(i instanceof Uint8Array)}e.IsRecordLike=n;function o(i){return e.AllowNaN?Zn(i):Number.isFinite(i)}e.IsNumberLike=o;function s(i){let m=Qn(i);return e.AllowNullVoid?m||i===null:m}e.IsVoidLike=s})(sr||(sr={}));function Ia(e){return globalThis.Object.freeze(e).map(t=>_t(t))}function ha(e){let t={};for(let r of Object.getOwnPropertyNames(e))t[r]=_t(e[r]);for(let r of Object.getOwnPropertySymbols(e))t[r]=_t(e[r]);return globalThis.Object.freeze(t)}function _t(e){return K(e)?Ia(e):rt(e)?e:Ke(e)?e:Nt(e)?e:P(e)?ha(e):e}function u(e,t){let r=t!==void 0?{...t,...e}:e;switch(sr.InstanceMode){case"freeze":return _t(r);case"clone":return F(r);default:return r}}var q=class extends Error{constructor(t){super(t)}};var G=Symbol.for("TypeBox.Transform"),Te=Symbol.for("TypeBox.Readonly"),J=Symbol.for("TypeBox.Optional"),ge=Symbol.for("TypeBox.Hint"),c=Symbol.for("TypeBox.Kind");function ft(e){return P(e)&&e[Te]==="Readonly"}function re(e){return P(e)&&e[J]==="Optional"}function on(e){return y(e,"Any")}function sn(e){return y(e,"Argument")}function be(e){return y(e,"Array")}function nt(e){return y(e,"AsyncIterator")}function ot(e){return y(e,"BigInt")}function Le(e){return y(e,"Boolean")}function Ae(e){return y(e,"Computed")}function we(e){return y(e,"Constructor")}function ya(e){return y(e,"Date")}function Pe(e){return y(e,"Function")}function Oe(e){return y(e,"Integer")}function U(e){return y(e,"Intersect")}function st(e){return y(e,"Iterator")}function y(e,t){return P(e)&&c in e&&e[c]===t}function ir(e){return ve(e)||ue(e)||M(e)}function de(e){return y(e,"Literal")}function me(e){return y(e,"MappedKey")}function $(e){return y(e,"MappedResult")}function Ve(e){return y(e,"Never")}function xa(e){return y(e,"Not")}function vt(e){return y(e,"Null")}function Re(e){return y(e,"Number")}function j(e){return y(e,"Object")}function it(e){return y(e,"Promise")}function at(e){return y(e,"Record")}function v(e){return y(e,"Ref")}function an(e){return y(e,"RegExp")}function je(e){return y(e,"String")}function Kt(e){return y(e,"Symbol")}function ce(e){return y(e,"TemplateLiteral")}function Sa(e){return y(e,"This")}function Be(e){return P(e)&&G in e}function pe(e){return y(e,"Tuple")}function Lt(e){return y(e,"Undefined")}function x(e){return y(e,"Union")}function Ta(e){return y(e,"Uint8Array")}function ba(e){return y(e,"Unknown")}function Aa(e){return y(e,"Unsafe")}function wa(e){return y(e,"Void")}function Pa(e){return P(e)&&c in e&&M(e[c])}function le(e){return on(e)||sn(e)||be(e)||Le(e)||ot(e)||nt(e)||Ae(e)||we(e)||ya(e)||Pe(e)||Oe(e)||U(e)||st(e)||de(e)||me(e)||$(e)||Ve(e)||xa(e)||vt(e)||Re(e)||j(e)||it(e)||at(e)||v(e)||an(e)||je(e)||Kt(e)||ce(e)||Sa(e)||pe(e)||Lt(e)||x(e)||Ta(e)||ba(e)||Aa(e)||wa(e)||Pa(e)}var a={};Qr(a,{IsAny:()=>no,IsArgument:()=>oo,IsArray:()=>so,IsAsyncIterator:()=>io,IsBigInt:()=>ao,IsBoolean:()=>uo,IsComputed:()=>mo,IsConstructor:()=>co,IsDate:()=>po,IsFunction:()=>lo,IsImport:()=>Ea,IsInteger:()=>fo,IsIntersect:()=>go,IsIterator:()=>Io,IsKind:()=>Go,IsKindOf:()=>I,IsLiteral:()=>Dt,IsLiteralBoolean:()=>Fa,IsLiteralNumber:()=>yo,IsLiteralString:()=>ho,IsLiteralValue:()=>xo,IsMappedKey:()=>So,IsMappedResult:()=>To,IsNever:()=>bo,IsNot:()=>Ao,IsNull:()=>wo,IsNumber:()=>Po,IsObject:()=>Oo,IsOptional:()=>ka,IsPromise:()=>Ro,IsProperties:()=>ar,IsReadonly:()=>Ma,IsRecord:()=>Co,IsRecursive:()=>$a,IsRef:()=>Mo,IsRegExp:()=>ko,IsSchema:()=>z,IsString:()=>Eo,IsSymbol:()=>Fo,IsTemplateLiteral:()=>$o,IsThis:()=>Uo,IsTransform:()=>No,IsTuple:()=>_o,IsUint8Array:()=>Ko,IsUndefined:()=>vo,IsUnion:()=>cn,IsUnionLiteral:()=>Ua,IsUnknown:()=>Lo,IsUnsafe:()=>jo,IsVoid:()=>Do,TypeGuardUnknownTypeError:()=>un});var un=class extends q{},Oa=["Argument","Any","Array","AsyncIterator","BigInt","Boolean","Computed","Constructor","Date","Enum","Function","Integer","Intersect","Iterator","Literal","MappedKey","MappedResult","Not","Null","Number","Object","Promise","Record","Ref","RegExp","String","Symbol","TemplateLiteral","This","Tuple","Undefined","Union","Uint8Array","Unknown","Void"];function eo(e){try{return new RegExp(e),!0}catch{return!1}}function dn(e){if(!M(e))return!1;for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r>=7&&r<=13||r===27||r===127)return!1}return!0}function to(e){return mn(e)||z(e)}function jt(e){return L(e)||Ut(e)}function k(e){return L(e)||ue(e)}function mn(e){return L(e)||ve(e)}function O(e){return L(e)||M(e)}function Ra(e){return L(e)||M(e)&&dn(e)&&eo(e)}function Ca(e){return L(e)||M(e)&&dn(e)}function ro(e){return L(e)||z(e)}function Ma(e){return P(e)&&e[Te]==="Readonly"}function ka(e){return P(e)&&e[J]==="Optional"}function no(e){return I(e,"Any")&&O(e.$id)}function oo(e){return I(e,"Argument")&&ue(e.index)}function so(e){return I(e,"Array")&&e.type==="array"&&O(e.$id)&&z(e.items)&&k(e.minItems)&&k(e.maxItems)&&mn(e.uniqueItems)&&ro(e.contains)&&k(e.minContains)&&k(e.maxContains)}function io(e){return I(e,"AsyncIterator")&&e.type==="AsyncIterator"&&O(e.$id)&&z(e.items)}function ao(e){return I(e,"BigInt")&&e.type==="bigint"&&O(e.$id)&&jt(e.exclusiveMaximum)&&jt(e.exclusiveMinimum)&&jt(e.maximum)&&jt(e.minimum)&&jt(e.multipleOf)}function uo(e){return I(e,"Boolean")&&e.type==="boolean"&&O(e.$id)}function mo(e){return I(e,"Computed")&&M(e.target)&&K(e.parameters)&&e.parameters.every(t=>z(t))}function co(e){return I(e,"Constructor")&&e.type==="Constructor"&&O(e.$id)&&K(e.parameters)&&e.parameters.every(t=>z(t))&&z(e.returns)}function po(e){return I(e,"Date")&&e.type==="Date"&&O(e.$id)&&k(e.exclusiveMaximumTimestamp)&&k(e.exclusiveMinimumTimestamp)&&k(e.maximumTimestamp)&&k(e.minimumTimestamp)&&k(e.multipleOfTimestamp)}function lo(e){return I(e,"Function")&&e.type==="Function"&&O(e.$id)&&K(e.parameters)&&e.parameters.every(t=>z(t))&&z(e.returns)}function Ea(e){return I(e,"Import")&&nr(e,"$defs")&&P(e.$defs)&&ar(e.$defs)&&nr(e,"$ref")&&M(e.$ref)&&e.$ref in e.$defs}function fo(e){return I(e,"Integer")&&e.type==="integer"&&O(e.$id)&&k(e.exclusiveMaximum)&&k(e.exclusiveMinimum)&&k(e.maximum)&&k(e.minimum)&&k(e.multipleOf)}function ar(e){return P(e)&&Object.entries(e).every(([t,r])=>dn(t)&&z(r))}function go(e){return I(e,"Intersect")&&!(M(e.type)&&e.type!=="object")&&K(e.allOf)&&e.allOf.every(t=>z(t)&&!No(t))&&O(e.type)&&(mn(e.unevaluatedProperties)||ro(e.unevaluatedProperties))&&O(e.$id)}function Io(e){return I(e,"Iterator")&&e.type==="Iterator"&&O(e.$id)&&z(e.items)}function I(e,t){return P(e)&&c in e&&e[c]===t}function ho(e){return Dt(e)&&M(e.const)}function yo(e){return Dt(e)&&ue(e.const)}function Fa(e){return Dt(e)&&ve(e.const)}function Dt(e){return I(e,"Literal")&&O(e.$id)&&xo(e.const)}function xo(e){return ve(e)||ue(e)||M(e)}function So(e){return I(e,"MappedKey")&&K(e.keys)&&e.keys.every(t=>ue(t)||M(t))}function To(e){return I(e,"MappedResult")&&ar(e.properties)}function bo(e){return I(e,"Never")&&P(e.not)&&Object.getOwnPropertyNames(e.not).length===0}function Ao(e){return I(e,"Not")&&z(e.not)}function wo(e){return I(e,"Null")&&e.type==="null"&&O(e.$id)}function Po(e){return I(e,"Number")&&e.type==="number"&&O(e.$id)&&k(e.exclusiveMaximum)&&k(e.exclusiveMinimum)&&k(e.maximum)&&k(e.minimum)&&k(e.multipleOf)}function Oo(e){return I(e,"Object")&&e.type==="object"&&O(e.$id)&&ar(e.properties)&&to(e.additionalProperties)&&k(e.minProperties)&&k(e.maxProperties)}function Ro(e){return I(e,"Promise")&&e.type==="Promise"&&O(e.$id)&&z(e.item)}function Co(e){return I(e,"Record")&&e.type==="object"&&O(e.$id)&&to(e.additionalProperties)&&P(e.patternProperties)&&(t=>{let r=Object.getOwnPropertyNames(t.patternProperties);return r.length===1&&eo(r[0])&&P(t.patternProperties)&&z(t.patternProperties[r[0]])})(e)}function $a(e){return P(e)&&ge in e&&e[ge]==="Recursive"}function Mo(e){return I(e,"Ref")&&O(e.$id)&&M(e.$ref)}function ko(e){return I(e,"RegExp")&&O(e.$id)&&M(e.source)&&M(e.flags)&&k(e.maxLength)&&k(e.minLength)}function Eo(e){return I(e,"String")&&e.type==="string"&&O(e.$id)&&k(e.minLength)&&k(e.maxLength)&&Ra(e.pattern)&&Ca(e.format)}function Fo(e){return I(e,"Symbol")&&e.type==="symbol"&&O(e.$id)}function $o(e){return I(e,"TemplateLiteral")&&e.type==="string"&&M(e.pattern)&&e.pattern[0]==="^"&&e.pattern[e.pattern.length-1]==="$"}function Uo(e){return I(e,"This")&&O(e.$id)&&M(e.$ref)}function No(e){return P(e)&&G in e}function _o(e){return I(e,"Tuple")&&e.type==="array"&&O(e.$id)&&ue(e.minItems)&&ue(e.maxItems)&&e.minItems===e.maxItems&&(L(e.items)&&L(e.additionalItems)&&e.minItems===0||K(e.items)&&e.items.every(t=>z(t)))}function vo(e){return I(e,"Undefined")&&e.type==="undefined"&&O(e.$id)}function Ua(e){return cn(e)&&e.anyOf.every(t=>ho(t)||yo(t))}function cn(e){return I(e,"Union")&&O(e.$id)&&P(e)&&K(e.anyOf)&&e.anyOf.every(t=>z(t))}function Ko(e){return I(e,"Uint8Array")&&e.type==="Uint8Array"&&O(e.$id)&&k(e.minByteLength)&&k(e.maxByteLength)}function Lo(e){return I(e,"Unknown")&&O(e.$id)}function jo(e){return I(e,"Unsafe")}function Do(e){return I(e,"Void")&&e.type==="void"&&O(e.$id)}function Go(e){return P(e)&&c in e&&M(e[c])&&!Oa.includes(e[c])}function z(e){return P(e)&&(no(e)||oo(e)||so(e)||uo(e)||ao(e)||io(e)||mo(e)||co(e)||po(e)||lo(e)||fo(e)||go(e)||Io(e)||Dt(e)||So(e)||To(e)||bo(e)||Ao(e)||wo(e)||Po(e)||Oo(e)||Ro(e)||Co(e)||Mo(e)||ko(e)||Eo(e)||Fo(e)||$o(e)||Uo(e)||_o(e)||vo(e)||cn(e)||Ko(e)||Lo(e)||jo(e)||Do(e)||Go(e))}var pn="(true|false)",Gt="(0|[1-9][0-9]*)",ln="(.*)",Na="(?!.*)",ff=`^${pn}$`,He=`^${Gt}$`,We=`^${ln}$`,Vo=`^${Na}$`;function Bo(e,t){return e.includes(t)}function Ho(e){return[...new Set(e)]}function _a(e,t){return e.filter(r=>t.includes(r))}function va(e,t){return e.reduce((r,n)=>_a(r,n),t)}function Wo(e){return e.length===1?e[0]:e.length>1?va(e.slice(1),e[0]):[]}function qo(e){let t=[];for(let r of e)t.push(...r);return t}function qe(e){return u({[c]:"Any"},e)}function gt(e,t){return u({[c]:"Array",type:"array",items:e},t)}function zo(e){return u({[c]:"Argument",index:e})}function It(e,t){return u({[c]:"AsyncIterator",type:"AsyncIterator",items:e},t)}function E(e,t,r){return u({[c]:"Computed",target:e,parameters:t},r)}function Ka(e,t){let{[t]:r,...n}=e;return n}function N(e,t){return t.reduce((r,n)=>Ka(r,n),e)}function S(e){return u({[c]:"Never",not:{}},e)}function T(e){return u({[c]:"MappedResult",properties:e})}function ht(e,t,r){return u({[c]:"Constructor",type:"Constructor",parameters:e,returns:t},r)}function $e(e,t,r){return u({[c]:"Function",type:"Function",parameters:e,returns:t},r)}function Vt(e,t){return u({[c]:"Union",anyOf:e},t)}function La(e){return e.some(t=>re(t))}function Yo(e){return e.map(t=>re(t)?ja(t):t)}function ja(e){return N(e,[J])}function Da(e,t){return La(e)?Z(Vt(Yo(e),t)):Vt(Yo(e),t)}function Ue(e,t){return e.length===1?u(e[0],t):e.length===0?S(t):Da(e,t)}function w(e,t){return e.length===0?S(t):e.length===1?u(e[0],t):Vt(e,t)}var ur=class extends q{};function Ga(e){return e.replace(/\\\$/g,"$").replace(/\\\*/g,"*").replace(/\\\^/g,"^").replace(/\\\|/g,"|").replace(/\\\(/g,"(").replace(/\\\)/g,")")}function fn(e,t,r){return e[t]===r&&e.charCodeAt(t-1)!==92}function Ge(e,t){return fn(e,t,"(")}function Bt(e,t){return fn(e,t,")")}function Jo(e,t){return fn(e,t,"|")}function Va(e){if(!(Ge(e,0)&&Bt(e,e.length-1)))return!1;let t=0;for(let r=0;r<e.length;r++)if(Ge(e,r)&&(t+=1),Bt(e,r)&&(t-=1),t===0&&r!==e.length-1)return!1;return!0}function Ba(e){return e.slice(1,e.length-1)}function Ha(e){let t=0;for(let r=0;r<e.length;r++)if(Ge(e,r)&&(t+=1),Bt(e,r)&&(t-=1),Jo(e,r)&&t===0)return!0;return!1}function Wa(e){for(let t=0;t<e.length;t++)if(Ge(e,t))return!0;return!1}function qa(e){let[t,r]=[0,0],n=[];for(let s=0;s<e.length;s++)if(Ge(e,s)&&(t+=1),Bt(e,s)&&(t-=1),Jo(e,s)&&t===0){let i=e.slice(r,s);i.length>0&&n.push(yt(i)),r=s+1}let o=e.slice(r);return o.length>0&&n.push(yt(o)),n.length===0?{type:"const",const:""}:n.length===1?n[0]:{type:"or",expr:n}}function za(e){function t(o,s){if(!Ge(o,s))throw new ur("TemplateLiteralParser: Index must point to open parens");let i=0;for(let m=s;m<o.length;m++)if(Ge(o,m)&&(i+=1),Bt(o,m)&&(i-=1),i===0)return[s,m];throw new ur("TemplateLiteralParser: Unclosed group parens in expression")}function r(o,s){for(let i=s;i<o.length;i++)if(Ge(o,i))return[s,i];return[s,o.length]}let n=[];for(let o=0;o<e.length;o++)if(Ge(e,o)){let[s,i]=t(e,o),m=e.slice(s,i+1);n.push(yt(m)),o=i}else{let[s,i]=r(e,o),m=e.slice(s,i);m.length>0&&n.push(yt(m)),o=i-1}return n.length===0?{type:"const",const:""}:n.length===1?n[0]:{type:"and",expr:n}}function yt(e){return Va(e)?yt(Ba(e)):Ha(e)?qa(e):Wa(e)?za(e):{type:"const",const:Ga(e)}}function xt(e){return yt(e.slice(1,e.length-1))}var gn=class extends q{};function Ya(e){return e.type==="or"&&e.expr.length===2&&e.expr[0].type==="const"&&e.expr[0].const==="0"&&e.expr[1].type==="const"&&e.expr[1].const==="[1-9][0-9]*"}function Ja(e){return e.type==="or"&&e.expr.length===2&&e.expr[0].type==="const"&&e.expr[0].const==="true"&&e.expr[1].type==="const"&&e.expr[1].const==="false"}function Xa(e){return e.type==="const"&&e.const===".*"}function ut(e){return Ya(e)||Xa(e)?!1:Ja(e)?!0:e.type==="and"?e.expr.every(t=>ut(t)):e.type==="or"?e.expr.every(t=>ut(t)):e.type==="const"?!0:(()=>{throw new gn("Unknown expression type")})()}function Xo(e){let t=xt(e.pattern);return ut(t)}var In=class extends q{};function*Qo(e){if(e.length===1)return yield*e[0];for(let t of e[0])for(let r of Qo(e.slice(1)))yield`${t}${r}`}function*Qa(e){return yield*Qo(e.expr.map(t=>[...Ht(t)]))}function*Za(e){for(let t of e.expr)yield*Ht(t)}function*eu(e){return yield e.const}function*Ht(e){return e.type==="and"?yield*Qa(e):e.type==="or"?yield*Za(e):e.type==="const"?yield*eu(e):(()=>{throw new In("Unknown expression")})()}function dr(e){let t=xt(e.pattern);return ut(t)?[...Ht(t)]:[]}function b(e,t){return u({[c]:"Literal",const:e,type:typeof e},t)}function mr(e){return u({[c]:"Boolean",type:"boolean"},e)}function St(e){return u({[c]:"BigInt",type:"bigint"},e)}function Ie(e){return u({[c]:"Number",type:"number"},e)}function Ce(e){return u({[c]:"String",type:"string"},e)}function*tu(e){let t=e.trim().replace(/"|'/g,"");return t==="boolean"?yield mr():t==="number"?yield Ie():t==="bigint"?yield St():t==="string"?yield Ce():yield(()=>{let r=t.split("|").map(n=>b(n.trim()));return r.length===0?S():r.length===1?r[0]:Ue(r)})()}function*ru(e){if(e[1]!=="{"){let t=b("$"),r=hn(e.slice(1));return yield*[t,...r]}for(let t=2;t<e.length;t++)if(e[t]==="}"){let r=tu(e.slice(2,t)),n=hn(e.slice(t+1));return yield*[...r,...n]}yield b(e)}function*hn(e){for(let t=0;t<e.length;t++)if(e[t]==="$"){let r=b(e.slice(0,t)),n=ru(e.slice(t));return yield*[r,...n]}yield b(e)}function Zo(e){return[...hn(e)]}var yn=class extends q{};function nu(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function es(e,t){return ce(e)?e.pattern.slice(1,e.pattern.length-1):x(e)?`(${e.anyOf.map(r=>es(r,t)).join("|")})`:Re(e)?`${t}${Gt}`:Oe(e)?`${t}${Gt}`:ot(e)?`${t}${Gt}`:je(e)?`${t}${ln}`:de(e)?`${t}${nu(e.const.toString())}`:Le(e)?`${t}${pn}`:(()=>{throw new yn(`Unexpected Kind '${e[c]}'`)})()}function xn(e){return`^${e.map(t=>es(t,"")).join("")}$`}function dt(e){let r=dr(e).map(n=>b(n));return Ue(r)}function cr(e,t){let r=M(e)?xn(Zo(e)):xn(e);return u({[c]:"TemplateLiteral",type:"string",pattern:r},t)}function ou(e){return dr(e).map(r=>r.toString())}function su(e){let t=[];for(let r of e)t.push(...ne(r));return t}function iu(e){return[e.toString()]}function ne(e){return[...new Set(ce(e)?ou(e):x(e)?su(e.anyOf):de(e)?iu(e.const):Re(e)?["[number]"]:Oe(e)?["[number]"]:[])]}function au(e,t,r){let n={};for(let o of Object.getOwnPropertyNames(t))n[o]=ze(e,ne(t[o]),r);return n}function uu(e,t,r){return au(e,t.properties,r)}function ts(e,t,r){let n=uu(e,t,r);return T(n)}function ns(e,t){return e.map(r=>os(r,t))}function du(e){return e.filter(t=>!Ve(t))}function mu(e,t){return pr(du(ns(e,t)))}function cu(e){return e.some(t=>Ve(t))?[]:e}function pu(e,t){return Ue(cu(ns(e,t)))}function lu(e,t){return t in e?e[t]:t==="[number]"?Ue(e):S()}function fu(e,t){return t==="[number]"?e:S()}function gu(e,t){return t in e?e[t]:S()}function os(e,t){return U(e)?mu(e.allOf,t):x(e)?pu(e.anyOf,t):pe(e)?lu(e.items??[],t):be(e)?fu(e.items,t):j(e)?gu(e.properties,t):S()}function Sn(e,t){return t.map(r=>os(e,r))}function rs(e,t){return Ue(Sn(e,t))}function ze(e,t,r){if(v(e)||v(t)){let n="Index types using Ref parameters require both Type and Key to be of TSchema";if(!le(e)||!le(t))throw new q(n);return E("Index",[e,t])}return $(t)?ts(e,t,r):me(t)?ss(e,t,r):u(le(t)?rs(e,ne(t)):rs(e,t),r)}function Iu(e,t,r){return{[t]:ze(e,[t],F(r))}}function hu(e,t,r){return t.reduce((n,o)=>({...n,...Iu(e,o,r)}),{})}function yu(e,t,r){return hu(e,t.keys,r)}function ss(e,t,r){let n=yu(e,t,r);return T(n)}function Tt(e,t){return u({[c]:"Iterator",type:"Iterator",items:e},t)}function xu(e){return globalThis.Object.keys(e).filter(t=>!re(e[t]))}function Su(e,t){let r=xu(e),n=r.length>0?{[c]:"Object",type:"object",required:r,properties:e}:{[c]:"Object",type:"object",properties:e};return u(n,t)}var R=Su;function lr(e,t){return u({[c]:"Promise",type:"Promise",item:e},t)}function Tu(e){return u(N(e,[Te]))}function bu(e){return u({...e,[Te]:"Readonly"})}function Au(e,t){return t===!1?Tu(e):bu(e)}function oe(e,t){let r=t??!0;return $(e)?is(e,r):Au(e,r)}function wu(e,t){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=oe(e[n],t);return r}function Pu(e,t){return wu(e.properties,t)}function is(e,t){let r=Pu(e,t);return T(r)}function he(e,t){return u(e.length>0?{[c]:"Tuple",type:"array",items:e,additionalItems:!1,minItems:e.length,maxItems:e.length}:{[c]:"Tuple",type:"array",minItems:e.length,maxItems:e.length},t)}function as(e,t){return e in t?ye(e,t[e]):T(t)}function Ou(e){return{[e]:b(e)}}function Ru(e){let t={};for(let r of e)t[r]=b(r);return t}function Cu(e,t){return Bo(t,e)?Ou(e):Ru(t)}function Mu(e,t){let r=Cu(e,t);return as(e,r)}function Wt(e,t){return t.map(r=>ye(e,r))}function ku(e,t){let r={};for(let n of globalThis.Object.getOwnPropertyNames(t))r[n]=ye(e,t[n]);return r}function ye(e,t){let r={...t};return re(t)?Z(ye(e,N(t,[J]))):ft(t)?oe(ye(e,N(t,[Te]))):$(t)?as(e,t.properties):me(t)?Mu(e,t.keys):we(t)?ht(Wt(e,t.parameters),ye(e,t.returns),r):Pe(t)?$e(Wt(e,t.parameters),ye(e,t.returns),r):nt(t)?It(ye(e,t.items),r):st(t)?Tt(ye(e,t.items),r):U(t)?ee(Wt(e,t.allOf),r):x(t)?w(Wt(e,t.anyOf),r):pe(t)?he(Wt(e,t.items??[]),r):j(t)?R(ku(e,t.properties),r):be(t)?gt(ye(e,t.items),r):it(t)?lr(ye(e,t.item),r):t}function Eu(e,t){let r={};for(let n of e)r[n]=ye(n,t);return r}function us(e,t,r){let n=le(e)?ne(e):e,o=t({[c]:"MappedKey",keys:n}),s=Eu(n,o);return R(s,r)}function Fu(e){return u(N(e,[J]))}function $u(e){return u({...e,[J]:"Optional"})}function Uu(e,t){return t===!1?Fu(e):$u(e)}function Z(e,t){let r=t??!0;return $(e)?ds(e,r):Uu(e,r)}function Nu(e,t){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=Z(e[n],t);return r}function _u(e,t){return Nu(e.properties,t)}function ds(e,t){let r=_u(e,t);return T(r)}function qt(e,t={}){let r=e.every(o=>j(o)),n=le(t.unevaluatedProperties)?{unevaluatedProperties:t.unevaluatedProperties}:{};return u(t.unevaluatedProperties===!1||le(t.unevaluatedProperties)||r?{...n,[c]:"Intersect",type:"object",allOf:e}:{...n,[c]:"Intersect",allOf:e},t)}function vu(e){return e.every(t=>re(t))}function Ku(e){return N(e,[J])}function ms(e){return e.map(t=>re(t)?Ku(t):t)}function Lu(e,t){return vu(e)?Z(qt(ms(e),t)):qt(ms(e),t)}function pr(e,t={}){if(e.length===1)return u(e[0],t);if(e.length===0)return S(t);if(e.some(r=>Be(r)))throw new Error("Cannot intersect transform types");return Lu(e,t)}function ee(e,t){if(e.length===1)return u(e[0],t);if(e.length===0)return S(t);if(e.some(r=>Be(r)))throw new Error("Cannot intersect transform types");return qt(e,t)}function Ne(...e){let[t,r]=typeof e[0]=="string"?[e[0],e[1]]:[e[0].$id,e[1]];if(typeof t!="string")throw new q("Ref: $ref must be a string");return u({[c]:"Ref",$ref:t},r)}function ju(e,t){return E("Awaited",[E(e,t)])}function Du(e){return E("Awaited",[Ne(e)])}function Gu(e){return ee(cs(e))}function Vu(e){return w(cs(e))}function Bu(e){return bt(e)}function cs(e){return e.map(t=>bt(t))}function bt(e,t){return u(Ae(e)?ju(e.target,e.parameters):U(e)?Gu(e.allOf):x(e)?Vu(e.anyOf):it(e)?Bu(e.item):v(e)?Du(e.$ref):e,t)}function ps(e){let t=[];for(let r of e)t.push(zt(r));return t}function Hu(e){let t=ps(e);return qo(t)}function Wu(e){let t=ps(e);return Wo(t)}function qu(e){return e.map((t,r)=>r.toString())}function zu(e){return["[number]"]}function Yu(e){return globalThis.Object.getOwnPropertyNames(e)}function Ju(e){return Xu?globalThis.Object.getOwnPropertyNames(e).map(r=>r[0]==="^"&&r[r.length-1]==="$"?r.slice(1,r.length-1):r):[]}function zt(e){return U(e)?Hu(e.allOf):x(e)?Wu(e.anyOf):pe(e)?qu(e.items??[]):be(e)?zu(e.items):j(e)?Yu(e.properties):at(e)?Ju(e.patternProperties):[]}var Xu=!1;function Qu(e,t){return E("KeyOf",[E(e,t)])}function Zu(e){return E("KeyOf",[Ne(e)])}function ed(e,t){let r=zt(e),n=td(r),o=Ue(n);return u(o,t)}function td(e){return e.map(t=>t==="[number]"?Ie():b(t))}function At(e,t){return Ae(e)?Qu(e.target,e.parameters):v(e)?Zu(e.$ref):$(e)?ls(e,t):ed(e,t)}function rd(e,t){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=At(e[n],F(t));return r}function nd(e,t){return rd(e.properties,t)}function ls(e,t){let r=nd(e,t);return T(r)}function od(e){let t=[];for(let r of e)t.push(...zt(r));return Ho(t)}function sd(e){return e.filter(t=>!Ve(t))}function id(e,t){let r=[];for(let n of e)r.push(...Sn(n,[t]));return sd(r)}function ad(e,t){let r={};for(let n of t)r[n]=pr(id(e,n));return r}function fs(e,t){let r=od(e),n=ad(e,r);return R(n,t)}function fr(e){return u({[c]:"Date",type:"Date"},e)}function gr(e){return u({[c]:"Null",type:"null"},e)}function Ir(e){return u({[c]:"Symbol",type:"symbol"},e)}function hr(e){return u({[c]:"Undefined",type:"undefined"},e)}function yr(e){return u({[c]:"Uint8Array",type:"Uint8Array"},e)}function Ye(e){return u({[c]:"Unknown"},e)}function ud(e){return e.map(t=>Tn(t,!1))}function dd(e){let t={};for(let r of globalThis.Object.getOwnPropertyNames(e))t[r]=oe(Tn(e[r],!1));return t}function xr(e,t){return t===!0?e:oe(e)}function Tn(e,t){return Zr(e)?xr(qe(),t):tn(e)?xr(qe(),t):K(e)?oe(he(ud(e))):Ke(e)?yr():rt(e)?fr():P(e)?xr(R(dd(e)),t):en(e)?xr($e([],Ye()),t):L(e)?hr():rn(e)?gr():nn(e)?Ir():Ut(e)?St():ue(e)?b(e):ve(e)?b(e):M(e)?b(e):R({})}function gs(e,t){return u(Tn(e,!0),t)}function Is(e,t){return we(e)?he(e.parameters,t):S(t)}function hs(e,t){if(L(e))throw new Error("Enum undefined or empty");let r=globalThis.Object.getOwnPropertyNames(e).filter(s=>isNaN(s)).map(s=>e[s]),o=[...new Set(r)].map(s=>b(s));return w(o,{...t,[ge]:"Enum"})}var An=class extends q{},d;(function(e){e[e.Union=0]="Union",e[e.True=1]="True",e[e.False=2]="False"})(d||(d={}));function xe(e){return e===d.False?e:d.True}function wt(e){throw new An(e)}function V(e){return a.IsNever(e)||a.IsIntersect(e)||a.IsUnion(e)||a.IsUnknown(e)||a.IsAny(e)}function B(e,t){return a.IsNever(t)?ws(e,t):a.IsIntersect(t)?Sr(e,t):a.IsUnion(t)?Rn(e,t):a.IsUnknown(t)?Cs(e,t):a.IsAny(t)?On(e,t):wt("StructuralRight")}function On(e,t){return d.True}function md(e,t){return a.IsIntersect(t)?Sr(e,t):a.IsUnion(t)&&t.anyOf.some(r=>a.IsAny(r)||a.IsUnknown(r))?d.True:a.IsUnion(t)?d.Union:a.IsUnknown(t)||a.IsAny(t)?d.True:d.Union}function cd(e,t){return a.IsUnknown(e)?d.False:a.IsAny(e)?d.Union:a.IsNever(e)?d.True:d.False}function pd(e,t){return a.IsObject(t)&&Tr(t)?d.True:V(t)?B(e,t):a.IsArray(t)?xe(C(e.items,t.items)):d.False}function ld(e,t){return V(t)?B(e,t):a.IsAsyncIterator(t)?xe(C(e.items,t.items)):d.False}function fd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsBigInt(t)?d.True:d.False}function bs(e,t){return a.IsLiteralBoolean(e)||a.IsBoolean(e)?d.True:d.False}function gd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsBoolean(t)?d.True:d.False}function Id(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsConstructor(t)?e.parameters.length>t.parameters.length?d.False:e.parameters.every((r,n)=>xe(C(t.parameters[n],r))===d.True)?xe(C(e.returns,t.returns)):d.False:d.False}function hd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsDate(t)?d.True:d.False}function yd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsFunction(t)?e.parameters.length>t.parameters.length?d.False:e.parameters.every((r,n)=>xe(C(t.parameters[n],r))===d.True)?xe(C(e.returns,t.returns)):d.False:d.False}function As(e,t){return a.IsLiteral(e)&&Q.IsNumber(e.const)||a.IsNumber(e)||a.IsInteger(e)?d.True:d.False}function xd(e,t){return a.IsInteger(t)||a.IsNumber(t)?d.True:V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):d.False}function Sr(e,t){return t.allOf.every(r=>C(e,r)===d.True)?d.True:d.False}function Sd(e,t){return e.allOf.some(r=>C(r,t)===d.True)?d.True:d.False}function Td(e,t){return V(t)?B(e,t):a.IsIterator(t)?xe(C(e.items,t.items)):d.False}function bd(e,t){return a.IsLiteral(t)&&t.const===e.const?d.True:V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsString(t)?Rs(e,t):a.IsNumber(t)?Ps(e,t):a.IsInteger(t)?As(e,t):a.IsBoolean(t)?bs(e,t):d.False}function ws(e,t){return d.False}function Ad(e,t){return d.True}function ys(e){let[t,r]=[e,0];for(;a.IsNot(t);)t=t.not,r+=1;return r%2===0?t:Ye()}function wd(e,t){return a.IsNot(e)?C(ys(e),t):a.IsNot(t)?C(e,ys(t)):wt("Invalid fallthrough for Not")}function Pd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsNull(t)?d.True:d.False}function Ps(e,t){return a.IsLiteralNumber(e)||a.IsNumber(e)||a.IsInteger(e)?d.True:d.False}function Od(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsInteger(t)||a.IsNumber(t)?d.True:d.False}function se(e,t){return Object.getOwnPropertyNames(e.properties).length===t}function xs(e){return Tr(e)}function Ss(e){return se(e,0)||se(e,1)&&"description"in e.properties&&a.IsUnion(e.properties.description)&&e.properties.description.anyOf.length===2&&(a.IsString(e.properties.description.anyOf[0])&&a.IsUndefined(e.properties.description.anyOf[1])||a.IsString(e.properties.description.anyOf[1])&&a.IsUndefined(e.properties.description.anyOf[0]))}function bn(e){return se(e,0)}function Ts(e){return se(e,0)}function Rd(e){return se(e,0)}function Cd(e){return se(e,0)}function Md(e){return Tr(e)}function kd(e){let t=Ie();return se(e,0)||se(e,1)&&"length"in e.properties&&xe(C(e.properties.length,t))===d.True}function Ed(e){return se(e,0)}function Tr(e){let t=Ie();return se(e,0)||se(e,1)&&"length"in e.properties&&xe(C(e.properties.length,t))===d.True}function Fd(e){let t=$e([qe()],qe());return se(e,0)||se(e,1)&&"then"in e.properties&&xe(C(e.properties.then,t))===d.True}function Os(e,t){return C(e,t)===d.False||a.IsOptional(e)&&!a.IsOptional(t)?d.False:d.True}function te(e,t){return a.IsUnknown(e)?d.False:a.IsAny(e)?d.Union:a.IsNever(e)||a.IsLiteralString(e)&&xs(t)||a.IsLiteralNumber(e)&&bn(t)||a.IsLiteralBoolean(e)&&Ts(t)||a.IsSymbol(e)&&Ss(t)||a.IsBigInt(e)&&Rd(t)||a.IsString(e)&&xs(t)||a.IsSymbol(e)&&Ss(t)||a.IsNumber(e)&&bn(t)||a.IsInteger(e)&&bn(t)||a.IsBoolean(e)&&Ts(t)||a.IsUint8Array(e)&&Md(t)||a.IsDate(e)&&Cd(t)||a.IsConstructor(e)&&Ed(t)||a.IsFunction(e)&&kd(t)?d.True:a.IsRecord(e)&&a.IsString(wn(e))?t[ge]==="Record"?d.True:d.False:a.IsRecord(e)&&a.IsNumber(wn(e))&&se(t,0)?d.True:d.False}function $d(e,t){return V(t)?B(e,t):a.IsRecord(t)?Se(e,t):a.IsObject(t)?(()=>{for(let r of Object.getOwnPropertyNames(t.properties)){if(!(r in e.properties)&&!a.IsOptional(t.properties[r]))return d.False;if(a.IsOptional(t.properties[r]))return d.True;if(Os(e.properties[r],t.properties[r])===d.False)return d.False}return d.True})():d.False}function Ud(e,t){return V(t)?B(e,t):a.IsObject(t)&&Fd(t)?d.True:a.IsPromise(t)?xe(C(e.item,t.item)):d.False}function wn(e){return He in e.patternProperties?Ie():We in e.patternProperties?Ce():wt("Unknown record key pattern")}function Pn(e){return He in e.patternProperties?e.patternProperties[He]:We in e.patternProperties?e.patternProperties[We]:wt("Unable to get record value schema")}function Se(e,t){let[r,n]=[wn(t),Pn(t)];return a.IsLiteralString(e)&&a.IsNumber(r)&&xe(C(e,n))===d.True?d.True:a.IsUint8Array(e)&&a.IsNumber(r)||a.IsString(e)&&a.IsNumber(r)||a.IsArray(e)&&a.IsNumber(r)?C(e,n):a.IsObject(e)?(()=>{for(let o of Object.getOwnPropertyNames(e.properties))if(Os(n,e.properties[o])===d.False)return d.False;return d.True})():d.False}function Nd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?C(Pn(e),Pn(t)):d.False}function _d(e,t){let r=a.IsRegExp(e)?Ce():e,n=a.IsRegExp(t)?Ce():t;return C(r,n)}function Rs(e,t){return a.IsLiteral(e)&&Q.IsString(e.const)||a.IsString(e)?d.True:d.False}function vd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsString(t)?d.True:d.False}function Kd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsSymbol(t)?d.True:d.False}function Ld(e,t){return a.IsTemplateLiteral(e)?C(dt(e),t):a.IsTemplateLiteral(t)?C(e,dt(t)):wt("Invalid fallthrough for TemplateLiteral")}function jd(e,t){return a.IsArray(t)&&e.items!==void 0&&e.items.every(r=>C(r,t.items)===d.True)}function Dd(e,t){return a.IsNever(e)?d.True:a.IsUnknown(e)?d.False:a.IsAny(e)?d.Union:d.False}function Gd(e,t){return V(t)?B(e,t):a.IsObject(t)&&Tr(t)||a.IsArray(t)&&jd(e,t)?d.True:a.IsTuple(t)?Q.IsUndefined(e.items)&&!Q.IsUndefined(t.items)||!Q.IsUndefined(e.items)&&Q.IsUndefined(t.items)?d.False:Q.IsUndefined(e.items)&&!Q.IsUndefined(t.items)||e.items.every((r,n)=>C(r,t.items[n])===d.True)?d.True:d.False:d.False}function Vd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsUint8Array(t)?d.True:d.False}function Bd(e,t){return V(t)?B(e,t):a.IsObject(t)?te(e,t):a.IsRecord(t)?Se(e,t):a.IsVoid(t)?qd(e,t):a.IsUndefined(t)?d.True:d.False}function Rn(e,t){return t.anyOf.some(r=>C(e,r)===d.True)?d.True:d.False}function Hd(e,t){return e.anyOf.every(r=>C(r,t)===d.True)?d.True:d.False}function Cs(e,t){return d.True}function Wd(e,t){return a.IsNever(t)?ws(e,t):a.IsIntersect(t)?Sr(e,t):a.IsUnion(t)?Rn(e,t):a.IsAny(t)?On(e,t):a.IsString(t)?Rs(e,t):a.IsNumber(t)?Ps(e,t):a.IsInteger(t)?As(e,t):a.IsBoolean(t)?bs(e,t):a.IsArray(t)?cd(e,t):a.IsTuple(t)?Dd(e,t):a.IsObject(t)?te(e,t):a.IsUnknown(t)?d.True:d.False}function qd(e,t){return a.IsUndefined(e)||a.IsUndefined(e)?d.True:d.False}function zd(e,t){return a.IsIntersect(t)?Sr(e,t):a.IsUnion(t)?Rn(e,t):a.IsUnknown(t)?Cs(e,t):a.IsAny(t)?On(e,t):a.IsObject(t)?te(e,t):a.IsVoid(t)?d.True:d.False}function C(e,t){return a.IsTemplateLiteral(e)||a.IsTemplateLiteral(t)?Ld(e,t):a.IsRegExp(e)||a.IsRegExp(t)?_d(e,t):a.IsNot(e)||a.IsNot(t)?wd(e,t):a.IsAny(e)?md(e,t):a.IsArray(e)?pd(e,t):a.IsBigInt(e)?fd(e,t):a.IsBoolean(e)?gd(e,t):a.IsAsyncIterator(e)?ld(e,t):a.IsConstructor(e)?Id(e,t):a.IsDate(e)?hd(e,t):a.IsFunction(e)?yd(e,t):a.IsInteger(e)?xd(e,t):a.IsIntersect(e)?Sd(e,t):a.IsIterator(e)?Td(e,t):a.IsLiteral(e)?bd(e,t):a.IsNever(e)?Ad(e,t):a.IsNull(e)?Pd(e,t):a.IsNumber(e)?Od(e,t):a.IsObject(e)?$d(e,t):a.IsRecord(e)?Nd(e,t):a.IsString(e)?vd(e,t):a.IsSymbol(e)?Kd(e,t):a.IsTuple(e)?Gd(e,t):a.IsPromise(e)?Ud(e,t):a.IsUint8Array(e)?Vd(e,t):a.IsUndefined(e)?Bd(e,t):a.IsUnion(e)?Hd(e,t):a.IsUnknown(e)?Wd(e,t):a.IsVoid(e)?zd(e,t):wt(`Unknown left type operand '${e[c]}'`)}function Je(e,t){return C(e,t)}function Yd(e,t,r,n,o){let s={};for(let i of globalThis.Object.getOwnPropertyNames(e))s[i]=Pt(e[i],t,r,n,F(o));return s}function Jd(e,t,r,n,o){return Yd(e.properties,t,r,n,o)}function Ms(e,t,r,n,o){let s=Jd(e,t,r,n,o);return T(s)}function Xd(e,t,r,n){let o=Je(e,t);return o===d.Union?w([r,n]):o===d.True?r:n}function Pt(e,t,r,n,o){return $(e)?Ms(e,t,r,n,o):me(e)?u(ks(e,t,r,n,o)):u(Xd(e,t,r,n),o)}function Qd(e,t,r,n,o){return{[e]:Pt(b(e),t,r,n,F(o))}}function Zd(e,t,r,n,o){return e.reduce((s,i)=>({...s,...Qd(i,t,r,n,o)}),{})}function em(e,t,r,n,o){return Zd(e.keys,t,r,n,o)}function ks(e,t,r,n,o){let s=em(e,t,r,n,o);return T(s)}function Es(e,t){return Ot(dt(e),t)}function tm(e,t){let r=e.filter(n=>Je(n,t)===d.False);return r.length===1?r[0]:w(r)}function Ot(e,t,r={}){return ce(e)?u(Es(e,t),r):$(e)?u(Fs(e,t),r):u(x(e)?tm(e.anyOf,t):Je(e,t)!==d.False?S():e,r)}function rm(e,t){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=Ot(e[n],t);return r}function nm(e,t){return rm(e.properties,t)}function Fs(e,t){let r=nm(e,t);return T(r)}function $s(e,t){return Rt(dt(e),t)}function om(e,t){let r=e.filter(n=>Je(n,t)!==d.False);return r.length===1?r[0]:w(r)}function Rt(e,t,r){return ce(e)?u($s(e,t),r):$(e)?u(Us(e,t),r):u(x(e)?om(e.anyOf,t):Je(e,t)!==d.False?e:S(),r)}function sm(e,t){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=Rt(e[n],t);return r}function im(e,t){return sm(e.properties,t)}function Us(e,t){let r=im(e,t);return T(r)}function Ns(e,t){return we(e)?u(e.returns,t):S(t)}function br(e){return oe(Z(e))}function mt(e,t,r){return u({[c]:"Record",type:"object",patternProperties:{[e]:t}},r)}function Cn(e,t,r){let n={};for(let o of e)n[o]=t;return R(n,{...r,[ge]:"Record"})}function am(e,t,r){return Xo(e)?Cn(ne(e),t,r):mt(e.pattern,t,r)}function um(e,t,r){return Cn(ne(w(e)),t,r)}function dm(e,t,r){return Cn([e.toString()],t,r)}function mm(e,t,r){return mt(e.source,t,r)}function cm(e,t,r){let n=L(e.pattern)?We:e.pattern;return mt(n,t,r)}function pm(e,t,r){return mt(We,t,r)}function lm(e,t,r){return mt(Vo,t,r)}function fm(e,t,r){return R({true:t,false:t},r)}function gm(e,t,r){return mt(He,t,r)}function Im(e,t,r){return mt(He,t,r)}function Ar(e,t,r={}){return x(e)?um(e.anyOf,t,r):ce(e)?am(e,t,r):de(e)?dm(e.const,t,r):Le(e)?fm(e,t,r):Oe(e)?gm(e,t,r):Re(e)?Im(e,t,r):an(e)?mm(e,t,r):je(e)?cm(e,t,r):on(e)?pm(e,t,r):Ve(e)?lm(e,t,r):S(r)}function wr(e){return globalThis.Object.getOwnPropertyNames(e.patternProperties)[0]}function _s(e){let t=wr(e);return t===We?Ce():t===He?Ie():Ce({pattern:t})}function Pr(e){return e.patternProperties[wr(e)]}function hm(e,t){return t.parameters=Yt(e,t.parameters),t.returns=Me(e,t.returns),t}function ym(e,t){return t.parameters=Yt(e,t.parameters),t.returns=Me(e,t.returns),t}function xm(e,t){return t.allOf=Yt(e,t.allOf),t}function Sm(e,t){return t.anyOf=Yt(e,t.anyOf),t}function Tm(e,t){return L(t.items)||(t.items=Yt(e,t.items)),t}function bm(e,t){return t.items=Me(e,t.items),t}function Am(e,t){return t.items=Me(e,t.items),t}function wm(e,t){return t.items=Me(e,t.items),t}function Pm(e,t){return t.item=Me(e,t.item),t}function Om(e,t){let r=km(e,t.properties);return{...t,...R(r)}}function Rm(e,t){let r=Me(e,_s(t)),n=Me(e,Pr(t)),o=Ar(r,n);return{...t,...o}}function Cm(e,t){return t.index in e?e[t.index]:Ye()}function Mm(e,t){let r=ft(t),n=re(t),o=Me(e,t);return r&&n?br(o):r&&!n?oe(o):!r&&n?Z(o):o}function km(e,t){return globalThis.Object.getOwnPropertyNames(t).reduce((r,n)=>({...r,[n]:Mm(e,t[n])}),{})}function Yt(e,t){return t.map(r=>Me(e,r))}function Me(e,t){return we(t)?hm(e,t):Pe(t)?ym(e,t):U(t)?xm(e,t):x(t)?Sm(e,t):pe(t)?Tm(e,t):be(t)?bm(e,t):nt(t)?Am(e,t):st(t)?wm(e,t):it(t)?Pm(e,t):j(t)?Om(e,t):at(t)?Rm(e,t):sn(t)?Cm(e,t):t}function vs(e,t){return Me(t,lt(e))}function Ks(e){return u({[c]:"Integer",type:"integer"},e)}function Em(e,t,r){return{[e]:ke(b(e),t,F(r))}}function Fm(e,t,r){return e.reduce((o,s)=>({...o,...Em(s,t,r)}),{})}function $m(e,t,r){return Fm(e.keys,t,r)}function Ls(e,t,r){let n=$m(e,t,r);return T(n)}function Um(e){let[t,r]=[e.slice(0,1),e.slice(1)];return[t.toLowerCase(),r].join("")}function Nm(e){let[t,r]=[e.slice(0,1),e.slice(1)];return[t.toUpperCase(),r].join("")}function _m(e){return e.toUpperCase()}function vm(e){return e.toLowerCase()}function Km(e,t,r){let n=xt(e.pattern);if(!ut(n))return{...e,pattern:js(e.pattern,t)};let i=[...Ht(n)].map(f=>b(f)),m=Ds(i,t),p=w(m);return cr([p],r)}function js(e,t){return typeof e=="string"?t==="Uncapitalize"?Um(e):t==="Capitalize"?Nm(e):t==="Uppercase"?_m(e):t==="Lowercase"?vm(e):e:e.toString()}function Ds(e,t){return e.map(r=>ke(r,t))}function ke(e,t,r={}){return me(e)?Ls(e,t,r):ce(e)?Km(e,t,r):x(e)?w(Ds(e.anyOf,t),r):de(e)?b(js(e.const,t),r):u(e,r)}function Gs(e,t={}){return ke(e,"Capitalize",t)}function Vs(e,t={}){return ke(e,"Lowercase",t)}function Bs(e,t={}){return ke(e,"Uncapitalize",t)}function Hs(e,t={}){return ke(e,"Uppercase",t)}function Lm(e,t,r){let n={};for(let o of globalThis.Object.getOwnPropertyNames(e))n[o]=Xe(e[o],t,F(r));return n}function jm(e,t,r){return Lm(e.properties,t,r)}function Ws(e,t,r){let n=jm(e,t,r);return T(n)}function Dm(e,t){return e.map(r=>Mn(r,t))}function Gm(e,t){return e.map(r=>Mn(r,t))}function Vm(e,t){let{[t]:r,...n}=e;return n}function Bm(e,t){return t.reduce((r,n)=>Vm(r,n),e)}function Hm(e,t,r){let n=N(e,[G,"$id","required","properties"]),o=Bm(r,t);return R(o,n)}function Wm(e){let t=e.reduce((r,n)=>ir(n)?[...r,b(n)]:r,[]);return w(t)}function Mn(e,t){return U(e)?ee(Dm(e.allOf,t)):x(e)?w(Gm(e.anyOf,t)):j(e)?Hm(e,t,e.properties):R({})}function Xe(e,t,r){let n=K(t)?Wm(t):t,o=le(t)?ne(t):t,s=v(e),i=v(t);return $(e)?Ws(e,o,r):me(t)?qs(e,t,r):s&&i?E("Omit",[e,n],r):!s&&i?E("Omit",[e,n],r):s&&!i?E("Omit",[e,n],r):u({...Mn(e,o),...r})}function qm(e,t,r){return{[t]:Xe(e,[t],F(r))}}function zm(e,t,r){return t.reduce((n,o)=>({...n,...qm(e,o,r)}),{})}function Ym(e,t,r){return zm(e,t.keys,r)}function qs(e,t,r){let n=Ym(e,t,r);return T(n)}function Jm(e,t,r){let n={};for(let o of globalThis.Object.getOwnPropertyNames(e))n[o]=Qe(e[o],t,F(r));return n}function Xm(e,t,r){return Jm(e.properties,t,r)}function zs(e,t,r){let n=Xm(e,t,r);return T(n)}function Qm(e,t){return e.map(r=>kn(r,t))}function Zm(e,t){return e.map(r=>kn(r,t))}function ec(e,t){let r={};for(let n of t)n in e&&(r[n]=e[n]);return r}function tc(e,t,r){let n=N(e,[G,"$id","required","properties"]),o=ec(r,t);return R(o,n)}function rc(e){let t=e.reduce((r,n)=>ir(n)?[...r,b(n)]:r,[]);return w(t)}function kn(e,t){return U(e)?ee(Qm(e.allOf,t)):x(e)?w(Zm(e.anyOf,t)):j(e)?tc(e,t,e.properties):R({})}function Qe(e,t,r){let n=K(t)?rc(t):t,o=le(t)?ne(t):t,s=v(e),i=v(t);return $(e)?zs(e,o,r):me(t)?Ys(e,t,r):s&&i?E("Pick",[e,n],r):!s&&i?E("Pick",[e,n],r):s&&!i?E("Pick",[e,n],r):u({...kn(e,o),...r})}function nc(e,t,r){return{[t]:Qe(e,[t],F(r))}}function oc(e,t,r){return t.reduce((n,o)=>({...n,...nc(e,o,r)}),{})}function sc(e,t,r){return oc(e,t.keys,r)}function Ys(e,t,r){let n=sc(e,t,r);return T(n)}function ic(e,t){return E("Partial",[E(e,t)])}function ac(e){return E("Partial",[Ne(e)])}function uc(e){let t={};for(let r of globalThis.Object.getOwnPropertyNames(e))t[r]=Z(e[r]);return t}function dc(e,t){let r=N(e,[G,"$id","required","properties"]),n=uc(t);return R(n,r)}function Js(e){return e.map(t=>Xs(t))}function Xs(e){return Ae(e)?ic(e.target,e.parameters):v(e)?ac(e.$ref):U(e)?ee(Js(e.allOf)):x(e)?w(Js(e.anyOf)):j(e)?dc(e,e.properties):ot(e)||Le(e)||Oe(e)||de(e)||vt(e)||Re(e)||je(e)||Kt(e)||Lt(e)?e:R({})}function Ct(e,t){return $(e)?Qs(e,t):u({...Xs(e),...t})}function mc(e,t){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=Ct(e[n],F(t));return r}function cc(e,t){return mc(e.properties,t)}function Qs(e,t){let r=cc(e,t);return T(r)}function pc(e,t){return E("Required",[E(e,t)])}function lc(e){return E("Required",[Ne(e)])}function fc(e){let t={};for(let r of globalThis.Object.getOwnPropertyNames(e))t[r]=N(e[r],[J]);return t}function gc(e,t){let r=N(e,[G,"$id","required","properties"]),n=fc(t);return R(n,r)}function Zs(e){return e.map(t=>ei(t))}function ei(e){return Ae(e)?pc(e.target,e.parameters):v(e)?lc(e.$ref):U(e)?ee(Zs(e.allOf)):x(e)?w(Zs(e.anyOf)):j(e)?gc(e,e.properties):ot(e)||Le(e)||Oe(e)||de(e)||vt(e)||Re(e)||je(e)||Kt(e)||Lt(e)?e:R({})}function Mt(e,t){return $(e)?ti(e,t):u({...ei(e),...t})}function Ic(e,t){let r={};for(let n of globalThis.Object.getOwnPropertyNames(e))r[n]=Mt(e[n],t);return r}function hc(e,t){return Ic(e.properties,t)}function ti(e,t){let r=hc(e,t);return T(r)}function yc(e,t){return t.map(r=>v(r)?En(e,r.$ref):fe(e,r))}function En(e,t){return t in e?v(e[t])?En(e,e[t].$ref):fe(e,e[t]):S()}function xc(e){return bt(e[0])}function Sc(e){return ze(e[0],e[1])}function Tc(e){return At(e[0])}function bc(e){return Ct(e[0])}function Ac(e){return Xe(e[0],e[1])}function wc(e){return Qe(e[0],e[1])}function Pc(e){return Mt(e[0])}function Oc(e,t,r){let n=yc(e,r);return t==="Awaited"?xc(n):t==="Index"?Sc(n):t==="KeyOf"?Tc(n):t==="Partial"?bc(n):t==="Omit"?Ac(n):t==="Pick"?wc(n):t==="Required"?Pc(n):S()}function Rc(e,t){return gt(fe(e,t))}function Cc(e,t){return It(fe(e,t))}function Mc(e,t,r){return ht(Jt(e,t),fe(e,r))}function kc(e,t,r){return $e(Jt(e,t),fe(e,r))}function Ec(e,t){return ee(Jt(e,t))}function Fc(e,t){return Tt(fe(e,t))}function $c(e,t){return R(globalThis.Object.keys(t).reduce((r,n)=>({...r,[n]:fe(e,t[n])}),{}))}function Uc(e,t){let[r,n]=[fe(e,Pr(t)),wr(t)],o=lt(t);return o.patternProperties[n]=r,o}function Nc(e,t){return v(t)?{...En(e,t.$ref),[G]:t[G]}:t}function _c(e,t){return he(Jt(e,t))}function vc(e,t){return w(Jt(e,t))}function Jt(e,t){return t.map(r=>fe(e,r))}function fe(e,t){return re(t)?u(fe(e,N(t,[J])),t):ft(t)?u(fe(e,N(t,[Te])),t):Be(t)?u(Nc(e,t),t):be(t)?u(Rc(e,t.items),t):nt(t)?u(Cc(e,t.items),t):Ae(t)?u(Oc(e,t.target,t.parameters)):we(t)?u(Mc(e,t.parameters,t.returns),t):Pe(t)?u(kc(e,t.parameters,t.returns),t):U(t)?u(Ec(e,t.allOf),t):st(t)?u(Fc(e,t.items),t):j(t)?u($c(e,t.properties),t):at(t)?u(Uc(e,t)):pe(t)?u(_c(e,t.items||[]),t):x(t)?u(vc(e,t.anyOf),t):t}function Kc(e,t){return t in e?fe(e,e[t]):S()}function ri(e){return globalThis.Object.getOwnPropertyNames(e).reduce((t,r)=>({...t,[r]:Kc(e,r)}),{})}var Fn=class{constructor(t){let r=ri(t),n=this.WithIdentifiers(r);this.$defs=n}Import(t,r){let n={...this.$defs,[t]:u(this.$defs[t],r)};return u({[c]:"Import",$defs:n,$ref:t})}WithIdentifiers(t){return globalThis.Object.getOwnPropertyNames(t).reduce((r,n)=>({...r,[n]:{...t[n],$id:n}}),{})}};function ni(e){return new Fn(e)}function oi(e,t){return u({[c]:"Not",not:e},t)}function si(e,t){return Pe(e)?he(e.parameters,t):S()}var Lc=0;function ii(e,t={}){L(t.$id)&&(t.$id=`T${Lc++}`);let r=lt(e({[c]:"This",$ref:`${t.$id}`}));return r.$id=t.$id,u({[ge]:"Recursive",...r},t)}function ai(e,t){let r=M(e)?new globalThis.RegExp(e):e;return u({[c]:"RegExp",type:"RegExp",source:r.source,flags:r.flags},t)}function jc(e){return U(e)?e.allOf:x(e)?e.anyOf:pe(e)?e.items??[]:[]}function ui(e){return jc(e)}function di(e,t){return Pe(e)?u(e.returns,t):S(t)}var $n=class{constructor(t){this.schema=t}Decode(t){return new Un(this.schema,t)}},Un=class{constructor(t,r){this.schema=t,this.decode=r}EncodeTransform(t,r){let s={Encode:i=>r[G].Encode(t(i)),Decode:i=>this.decode(r[G].Decode(i))};return{...r,[G]:s}}EncodeSchema(t,r){let n={Decode:this.decode,Encode:t};return{...r,[G]:n}}Encode(t){return Be(this.schema)?this.EncodeTransform(t,this.schema):this.EncodeSchema(t,this.schema)}};function mi(e){return new $n(e)}function ci(e={}){return u({[c]:e[c]??"Unsafe"},e)}function pi(e){return u({[c]:"Void",type:"void"},e)}var Nn={};Qr(Nn,{Any:()=>qe,Argument:()=>zo,Array:()=>gt,AsyncIterator:()=>It,Awaited:()=>bt,BigInt:()=>St,Boolean:()=>mr,Capitalize:()=>Gs,Composite:()=>fs,Const:()=>gs,Constructor:()=>ht,ConstructorParameters:()=>Is,Date:()=>fr,Enum:()=>hs,Exclude:()=>Ot,Extends:()=>Pt,Extract:()=>Rt,Function:()=>$e,Index:()=>ze,InstanceType:()=>Ns,Instantiate:()=>vs,Integer:()=>Ks,Intersect:()=>ee,Iterator:()=>Tt,KeyOf:()=>At,Literal:()=>b,Lowercase:()=>Vs,Mapped:()=>us,Module:()=>ni,Never:()=>S,Not:()=>oi,Null:()=>gr,Number:()=>Ie,Object:()=>R,Omit:()=>Xe,Optional:()=>Z,Parameters:()=>si,Partial:()=>Ct,Pick:()=>Qe,Promise:()=>lr,Readonly:()=>oe,ReadonlyOptional:()=>br,Record:()=>Ar,Recursive:()=>ii,Ref:()=>Ne,RegExp:()=>ai,Required:()=>Mt,Rest:()=>ui,ReturnType:()=>di,String:()=>Ce,Symbol:()=>Ir,TemplateLiteral:()=>cr,Transform:()=>mi,Tuple:()=>he,Uint8Array:()=>yr,Uncapitalize:()=>Bs,Undefined:()=>hr,Union:()=>w,Unknown:()=>Ye,Unsafe:()=>ci,Uppercase:()=>Hs,Void:()=>pi});var l=Nn;var g=null;function _n(e){g=e}import{readFileSync as Dc}from"fs";import{homedir as Gc}from"os";import{join as Vc}from"path";var Xt;function li(){if(Xt!==void 0)return Xt;try{let e=Dc(Vc(Gc(),".claude.json"),"utf-8");Xt=JSON.parse(e).mcpServers??{}}catch{Xt={}}return Xt}var h={maxSessions:20,idleTimeoutMinutes:15,sessionGcAgeMinutes:1440,maxPersistedSessions:1e4,maxAutoResponds:10,permissionMode:"plan",codexApprovalPolicy:"on-request",planApproval:"delegate",reasoningEffort:"medium"};function fi(e){h={maxSessions:e.maxSessions??20,defaultModel:e.defaultModel,model:e.model,reasoningEffort:e.reasoningEffort??"medium",defaultWorkdir:e.defaultWorkdir,idleTimeoutMinutes:e.idleTimeoutMinutes??15,sessionGcAgeMinutes:e.sessionGcAgeMinutes??1440,maxPersistedSessions:e.maxPersistedSessions??1e4,fallbackChannel:e.fallbackChannel,agentChannels:e.agentChannels,maxAutoResponds:e.maxAutoResponds??10,permissionMode:e.permissionMode??"plan",codexApprovalPolicy:e.codexApprovalPolicy??"on-request",planApproval:e.planApproval??"delegate",defaultHarness:e.defaultHarness}}function gi(e){if(e.messageChannel){let t=e.messageChannel.split("|");if(t.length>=3)return e.messageChannel;if(e.agentAccountId&&t.length>=2)return`${t[0]}|${e.agentAccountId}|${t.slice(1).join("|")}`;if(t.length===1&&e.chatId)return`${t[0]}|${e.chatId}`;if(t.length===1&&e.senderId)return`${t[0]}|${e.senderId}`}if(e.workspaceDir){let t=Qt(e.workspaceDir);if(t)return t}if(e.messageChannel&&e.messageChannel.includes("|"))return e.messageChannel}function kt(e,t){if(t&&String(t).includes("|"))return String(t);if(e?.channelId&&String(e.channelId).includes("|"))return String(e.channelId);if(e?.messageChannel){let r=String(e.messageChannel);if(r.includes("|"))return r;if(e.chatId)return`${r}|${e.chatId}`;if(e.senderId)return`${r}|${e.senderId}`}return e?.channel&&e?.chatId?`${e.channel}|${e.chatId}`:e?.channel&&e?.senderId?`${e.channel}|${e.senderId}`:e?.id&&/^-?\d+$/.test(String(e.id))?`telegram|${e.id}`:h.fallbackChannel??"unknown"}function Et(e){return e?.messageThreadId??void 0}function Qt(e){let t=h.agentChannels;if(!t)return;let r=s=>s.replace(/\/+$/,""),n=r(e),o=Object.entries(t).sort((s,i)=>i[0].length-s[0].length);for(let[s,i]of o)if(n===r(s)||n.startsWith(r(s)+"/"))return i}function Ii(e){if(!e)return;let t=e.match(/:topic:(\d+)$/);return t?parseInt(t[1],10):void 0}function Ft(e){let{requestedResumeSessionId:t,activeSession:r,persistedSession:n}=e;return t?r?{resumeSessionId:t,clearedPersistedCodexResume:!1}:n?.harness==="codex"?{resumeSessionId:void 0,clearedPersistedCodexResume:!0}:{resumeSessionId:t,clearedPersistedCodexResume:!1}:{resumeSessionId:void 0,clearedPersistedCodexResume:!1}}function Hc(e){return e instanceof Error?e.message:String(e)}function Wc(e){return!e||typeof e!="object"?!1:typeof e.prompt=="string"}function hi(e){return{name:"agent_launch",description:"Launch a coding agent session in background to execute a development task. Sessions are multi-turn by default \u2014 they stay open for follow-up messages via agent_respond. Set multi_turn_disabled: true for fire-and-forget sessions. Supports resuming previous sessions. Returns a session ID and name for tracking.",parameters:l.Object({prompt:l.String({description:"The task prompt to execute"}),name:l.Optional(l.String({description:"Short human-readable name for the session (kebab-case, e.g. 'fix-auth'). Auto-generated from prompt if omitted."})),workdir:l.Optional(l.String({description:"Working directory (defaults to cwd)"})),model:l.Optional(l.String({description:"Model name to use"})),system_prompt:l.Optional(l.String({description:"Additional system prompt"})),allowed_tools:l.Optional(l.Array(l.String(),{description:"List of allowed tools"})),resume_session_id:l.Optional(l.String({description:"Session ID to resume (from a previous session's harnessSessionId). Continues the conversation from where it left off."})),fork_session:l.Optional(l.Boolean({description:"When resuming, fork to a new session instead of continuing the existing one. Use with resume_session_id."})),multi_turn_disabled:l.Optional(l.Boolean({description:"Disable multi-turn mode. By default sessions stay open for follow-up messages. Set to true for fire-and-forget sessions."})),permission_mode:l.Optional(l.Union([l.Literal("default"),l.Literal("plan"),l.Literal("acceptEdits"),l.Literal("bypassPermissions")],{description:"Permission mode for the session. This is the plugin's orchestration mode, not the Codex SDK approval policy. Defaults to plugin config (plan by default)."})),harness:l.Optional(l.String({description:"Agent harness to use (e.g. 'claude-code'). Defaults to 'claude-code'."}))}),async execute(t,r){if(!g)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!Wc(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { prompt }."}]};r.agentId&&console.warn(`[agent_launch] \u26A0\uFE0F agentId="${r.agentId}" was passed as a parameter \u2014 this is WRONG. agentId is only for sessions_spawn (OpenClaw sub-agents), not agent_launch (CC sessions). The field is being ignored. ctx.agentId="${e.agentId}" will be used for origin routing instead.`);let n=r.workdir||e.workspaceDir||h.defaultWorkdir||process.cwd();if(!Bc(n))return{content:[{type:"text",text:`Error: Working directory does not exist: ${n}`}]};try{let o=r.harness??h.defaultHarness,s=o==="codex"?h.model??h.defaultModel:h.defaultModel,i=r.resume_session_id,m=i?g.resolve(i):void 0,p=i?g.getPersistedSession(i):void 0;if(i){let Fe=g.resolveHarnessSessionId(i);if(!Fe)return{content:[{type:"text",text:`Error: Could not resolve resume_session_id "${i}" to a session ID. Use agent_sessions to list available sessions.`}]};i=Fe}let{resumeSessionId:f,clearedPersistedCodexResume:A}=Ft({requestedResumeSessionId:i,activeSession:m?{harnessSessionId:m.harnessSessionId}:void 0,persistedSession:p?{harness:p.harness}:void 0}),_=gi(e),ie=kt(e,_||Qt(n)),Y=e.sessionKey||void 0;!Y&&e.agentId&&console.warn(`[agent_launch] ctx.sessionKey is not populated. ctx fields: agentId=${e.agentId}, messageChannel=${e.messageChannel}, agentAccountId=${e.agentAccountId}, workspaceDir=${e.workspaceDir}`);let H=g.spawn({prompt:r.prompt,name:r.name,workdir:n,model:r.model??s,reasoningEffort:h.reasoningEffort,systemPrompt:r.system_prompt,allowedTools:r.allowed_tools,resumeSessionId:f,forkSession:f?r.fork_session:!1,multiTurn:!r.multi_turn_disabled,permissionMode:r.permission_mode,codexApprovalPolicy:o==="codex"?h.codexApprovalPolicy:void 0,originChannel:ie,originThreadId:Ii(Y)??Et(e),originAgentId:e.agentId||void 0,originSessionKey:Y,harness:o}),W=r.prompt.length>80?r.prompt.slice(0,80)+"...":r.prompt,X=["Session launched successfully.",` Name: ${H.name}`,` ID: ${H.id}`,` Dir: ${n}`,` Model: ${H.model??"default"}`,` Prompt: "${W}"`];return o==="codex"&&X.push(` Codex approval policy: ${H.codexApprovalPolicy??h.codexApprovalPolicy}`),r.resume_session_id&&(X.push(` Resume: ${r.resume_session_id}${r.fork_session?" (forked)":""}`),A&&X.push(" Thread state: historical Codex state cleared; starting a fresh thread.")),X.push(r.multi_turn_disabled?" Mode: single-turn (fire-and-forget)":" Mode: multi-turn (use agent_respond to send follow-up messages)"),X.push("","Use agent_sessions to check status, agent_output to see output."),{content:[{type:"text",text:X.join(`
2
- `)}]}}catch(o){let s=Hc(o),i=s.includes("Max sessions")?"":`
1
+ var Ta=Object.defineProperty;var ir=(e,t)=>{for(var n in t)Ta(e,n,{get:t[n],enumerable:!0})};import{existsSync as tp}from"fs";var Z={};ir(Z,{HasPropertyKey:()=>cn,IsArray:()=>K,IsAsyncIterator:()=>ar,IsBigInt:()=>jt,IsBoolean:()=>Le,IsDate:()=>it,IsFunction:()=>ur,IsIterator:()=>dr,IsNull:()=>cr,IsNumber:()=>ue,IsObject:()=>A,IsRegExp:()=>Gt,IsString:()=>C,IsSymbol:()=>mr,IsUint8Array:()=>Ke,IsUndefined:()=>D});function cn(e,t){return t in e}function ar(e){return A(e)&&!K(e)&&!Ke(e)&&Symbol.asyncIterator in e}function K(e){return Array.isArray(e)}function jt(e){return typeof e=="bigint"}function Le(e){return typeof e=="boolean"}function it(e){return e instanceof globalThis.Date}function ur(e){return typeof e=="function"}function dr(e){return A(e)&&!K(e)&&!Ke(e)&&Symbol.iterator in e}function cr(e){return e===null}function ue(e){return typeof e=="number"}function A(e){return typeof e=="object"&&e!==null}function Gt(e){return e instanceof globalThis.RegExp}function C(e){return typeof e=="string"}function mr(e){return typeof e=="symbol"}function Ke(e){return e instanceof globalThis.Uint8Array}function D(e){return e===void 0}function ba(e){return e.map(t=>mn(t))}function wa(e){return new Date(e.getTime())}function Aa(e){return new Uint8Array(e)}function Pa(e){return new RegExp(e.source,e.flags)}function Ra(e){let t={};for(let n of Object.getOwnPropertyNames(e))t[n]=mn(e[n]);for(let n of Object.getOwnPropertySymbols(e))t[n]=mn(e[n]);return t}function mn(e){return K(e)?ba(e):it(e)?wa(e):Ke(e)?Aa(e):Gt(e)?Pa(e):A(e)?Ra(e):e}function $(e){return mn(e)}function xt(e,t){return t===void 0?$(e):$({...t,...e})}function oo(e){return e!==null&&typeof e=="object"}function so(e){return globalThis.Array.isArray(e)&&!globalThis.ArrayBuffer.isView(e)}function io(e){return e===void 0}function ao(e){return typeof e=="number"}var pn;(function(e){e.InstanceMode="default",e.ExactOptionalPropertyTypes=!1,e.AllowArrayObject=!1,e.AllowNaN=!1,e.AllowNullVoid=!1;function t(s,c){return e.ExactOptionalPropertyTypes?c in s:s[c]!==void 0}e.IsExactOptionalProperty=t;function n(s){let c=oo(s);return e.AllowArrayObject?c:c&&!so(s)}e.IsObjectLike=n;function r(s){return n(s)&&!(s instanceof Date)&&!(s instanceof Uint8Array)}e.IsRecordLike=r;function o(s){return e.AllowNaN?ao(s):Number.isFinite(s)}e.IsNumberLike=o;function i(s){let c=io(s);return e.AllowNullVoid?c||s===null:c}e.IsVoidLike=i})(pn||(pn={}));function Oa(e){return globalThis.Object.freeze(e).map(t=>Vt(t))}function Ca(e){let t={};for(let n of Object.getOwnPropertyNames(e))t[n]=Vt(e[n]);for(let n of Object.getOwnPropertySymbols(e))t[n]=Vt(e[n]);return globalThis.Object.freeze(t)}function Vt(e){return K(e)?Oa(e):it(e)?e:Ke(e)?e:Gt(e)?e:A(e)?Ca(e):e}function u(e,t){let n=t!==void 0?{...t,...e}:e;switch(pn.InstanceMode){case"freeze":return Vt(n);case"clone":return $(n);default:return n}}var q=class extends Error{constructor(t){super(t)}};var V=Symbol.for("TypeBox.Transform"),we=Symbol.for("TypeBox.Readonly"),J=Symbol.for("TypeBox.Optional"),Ie=Symbol.for("TypeBox.Hint"),m=Symbol.for("TypeBox.Kind");function St(e){return A(e)&&e[we]==="Readonly"}function oe(e){return A(e)&&e[J]==="Optional"}function pr(e){return h(e,"Any")}function lr(e){return h(e,"Argument")}function Ae(e){return h(e,"Array")}function at(e){return h(e,"AsyncIterator")}function ut(e){return h(e,"BigInt")}function De(e){return h(e,"Boolean")}function Pe(e){return h(e,"Computed")}function Re(e){return h(e,"Constructor")}function Ma(e){return h(e,"Date")}function Oe(e){return h(e,"Function")}function Ce(e){return h(e,"Integer")}function U(e){return h(e,"Intersect")}function dt(e){return h(e,"Iterator")}function h(e,t){return A(e)&&m in e&&e[m]===t}function ln(e){return Le(e)||ue(e)||C(e)}function de(e){return h(e,"Literal")}function ce(e){return h(e,"MappedKey")}function v(e){return h(e,"MappedResult")}function Be(e){return h(e,"Never")}function Ea(e){return h(e,"Not")}function Ht(e){return h(e,"Null")}function Me(e){return h(e,"Number")}function j(e){return h(e,"Object")}function ct(e){return h(e,"Promise")}function mt(e){return h(e,"Record")}function L(e){return h(e,"Ref")}function fr(e){return h(e,"RegExp")}function je(e){return h(e,"String")}function Bt(e){return h(e,"Symbol")}function me(e){return h(e,"TemplateLiteral")}function Fa(e){return h(e,"This")}function We(e){return A(e)&&V in e}function pe(e){return h(e,"Tuple")}function Wt(e){return h(e,"Undefined")}function y(e){return h(e,"Union")}function ka(e){return h(e,"Uint8Array")}function $a(e){return h(e,"Unknown")}function va(e){return h(e,"Unsafe")}function Na(e){return h(e,"Void")}function Ua(e){return A(e)&&m in e&&C(e[m])}function le(e){return pr(e)||lr(e)||Ae(e)||De(e)||ut(e)||at(e)||Pe(e)||Re(e)||Ma(e)||Oe(e)||Ce(e)||U(e)||dt(e)||de(e)||ce(e)||v(e)||Be(e)||Ea(e)||Ht(e)||Me(e)||j(e)||ct(e)||mt(e)||L(e)||fr(e)||je(e)||Bt(e)||me(e)||Fa(e)||pe(e)||Wt(e)||y(e)||ka(e)||$a(e)||va(e)||Na(e)||Ua(e)}var a={};ir(a,{IsAny:()=>po,IsArgument:()=>lo,IsArray:()=>fo,IsAsyncIterator:()=>go,IsBigInt:()=>Io,IsBoolean:()=>ho,IsComputed:()=>yo,IsConstructor:()=>xo,IsDate:()=>So,IsFunction:()=>To,IsImport:()=>Ga,IsInteger:()=>bo,IsIntersect:()=>wo,IsIterator:()=>Ao,IsKind:()=>Jo,IsKindOf:()=>I,IsLiteral:()=>zt,IsLiteralBoolean:()=>Va,IsLiteralNumber:()=>Ro,IsLiteralString:()=>Po,IsLiteralValue:()=>Oo,IsMappedKey:()=>Co,IsMappedResult:()=>Mo,IsNever:()=>Eo,IsNot:()=>Fo,IsNull:()=>ko,IsNumber:()=>$o,IsObject:()=>vo,IsOptional:()=>ja,IsPromise:()=>No,IsProperties:()=>fn,IsReadonly:()=>Da,IsRecord:()=>Uo,IsRecursive:()=>Ha,IsRef:()=>_o,IsRegExp:()=>Lo,IsSchema:()=>z,IsString:()=>Ko,IsSymbol:()=>Do,IsTemplateLiteral:()=>jo,IsThis:()=>Go,IsTransform:()=>Vo,IsTuple:()=>Ho,IsUint8Array:()=>Wo,IsUndefined:()=>Bo,IsUnion:()=>yr,IsUnionLiteral:()=>Ba,IsUnknown:()=>qo,IsUnsafe:()=>zo,IsVoid:()=>Yo,TypeGuardUnknownTypeError:()=>gr});var gr=class extends q{},_a=["Argument","Any","Array","AsyncIterator","BigInt","Boolean","Computed","Constructor","Date","Enum","Function","Integer","Intersect","Iterator","Literal","MappedKey","MappedResult","Not","Null","Number","Object","Promise","Record","Ref","RegExp","String","Symbol","TemplateLiteral","This","Tuple","Undefined","Union","Uint8Array","Unknown","Void"];function uo(e){try{return new RegExp(e),!0}catch{return!1}}function Ir(e){if(!C(e))return!1;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n>=7&&n<=13||n===27||n===127)return!1}return!0}function co(e){return hr(e)||z(e)}function qt(e){return D(e)||jt(e)}function M(e){return D(e)||ue(e)}function hr(e){return D(e)||Le(e)}function P(e){return D(e)||C(e)}function La(e){return D(e)||C(e)&&Ir(e)&&uo(e)}function Ka(e){return D(e)||C(e)&&Ir(e)}function mo(e){return D(e)||z(e)}function Da(e){return A(e)&&e[we]==="Readonly"}function ja(e){return A(e)&&e[J]==="Optional"}function po(e){return I(e,"Any")&&P(e.$id)}function lo(e){return I(e,"Argument")&&ue(e.index)}function fo(e){return I(e,"Array")&&e.type==="array"&&P(e.$id)&&z(e.items)&&M(e.minItems)&&M(e.maxItems)&&hr(e.uniqueItems)&&mo(e.contains)&&M(e.minContains)&&M(e.maxContains)}function go(e){return I(e,"AsyncIterator")&&e.type==="AsyncIterator"&&P(e.$id)&&z(e.items)}function Io(e){return I(e,"BigInt")&&e.type==="bigint"&&P(e.$id)&&qt(e.exclusiveMaximum)&&qt(e.exclusiveMinimum)&&qt(e.maximum)&&qt(e.minimum)&&qt(e.multipleOf)}function ho(e){return I(e,"Boolean")&&e.type==="boolean"&&P(e.$id)}function yo(e){return I(e,"Computed")&&C(e.target)&&K(e.parameters)&&e.parameters.every(t=>z(t))}function xo(e){return I(e,"Constructor")&&e.type==="Constructor"&&P(e.$id)&&K(e.parameters)&&e.parameters.every(t=>z(t))&&z(e.returns)}function So(e){return I(e,"Date")&&e.type==="Date"&&P(e.$id)&&M(e.exclusiveMaximumTimestamp)&&M(e.exclusiveMinimumTimestamp)&&M(e.maximumTimestamp)&&M(e.minimumTimestamp)&&M(e.multipleOfTimestamp)}function To(e){return I(e,"Function")&&e.type==="Function"&&P(e.$id)&&K(e.parameters)&&e.parameters.every(t=>z(t))&&z(e.returns)}function Ga(e){return I(e,"Import")&&cn(e,"$defs")&&A(e.$defs)&&fn(e.$defs)&&cn(e,"$ref")&&C(e.$ref)&&e.$ref in e.$defs}function bo(e){return I(e,"Integer")&&e.type==="integer"&&P(e.$id)&&M(e.exclusiveMaximum)&&M(e.exclusiveMinimum)&&M(e.maximum)&&M(e.minimum)&&M(e.multipleOf)}function fn(e){return A(e)&&Object.entries(e).every(([t,n])=>Ir(t)&&z(n))}function wo(e){return I(e,"Intersect")&&!(C(e.type)&&e.type!=="object")&&K(e.allOf)&&e.allOf.every(t=>z(t)&&!Vo(t))&&P(e.type)&&(hr(e.unevaluatedProperties)||mo(e.unevaluatedProperties))&&P(e.$id)}function Ao(e){return I(e,"Iterator")&&e.type==="Iterator"&&P(e.$id)&&z(e.items)}function I(e,t){return A(e)&&m in e&&e[m]===t}function Po(e){return zt(e)&&C(e.const)}function Ro(e){return zt(e)&&ue(e.const)}function Va(e){return zt(e)&&Le(e.const)}function zt(e){return I(e,"Literal")&&P(e.$id)&&Oo(e.const)}function Oo(e){return Le(e)||ue(e)||C(e)}function Co(e){return I(e,"MappedKey")&&K(e.keys)&&e.keys.every(t=>ue(t)||C(t))}function Mo(e){return I(e,"MappedResult")&&fn(e.properties)}function Eo(e){return I(e,"Never")&&A(e.not)&&Object.getOwnPropertyNames(e.not).length===0}function Fo(e){return I(e,"Not")&&z(e.not)}function ko(e){return I(e,"Null")&&e.type==="null"&&P(e.$id)}function $o(e){return I(e,"Number")&&e.type==="number"&&P(e.$id)&&M(e.exclusiveMaximum)&&M(e.exclusiveMinimum)&&M(e.maximum)&&M(e.minimum)&&M(e.multipleOf)}function vo(e){return I(e,"Object")&&e.type==="object"&&P(e.$id)&&fn(e.properties)&&co(e.additionalProperties)&&M(e.minProperties)&&M(e.maxProperties)}function No(e){return I(e,"Promise")&&e.type==="Promise"&&P(e.$id)&&z(e.item)}function Uo(e){return I(e,"Record")&&e.type==="object"&&P(e.$id)&&co(e.additionalProperties)&&A(e.patternProperties)&&(t=>{let n=Object.getOwnPropertyNames(t.patternProperties);return n.length===1&&uo(n[0])&&A(t.patternProperties)&&z(t.patternProperties[n[0]])})(e)}function Ha(e){return A(e)&&Ie in e&&e[Ie]==="Recursive"}function _o(e){return I(e,"Ref")&&P(e.$id)&&C(e.$ref)}function Lo(e){return I(e,"RegExp")&&P(e.$id)&&C(e.source)&&C(e.flags)&&M(e.maxLength)&&M(e.minLength)}function Ko(e){return I(e,"String")&&e.type==="string"&&P(e.$id)&&M(e.minLength)&&M(e.maxLength)&&La(e.pattern)&&Ka(e.format)}function Do(e){return I(e,"Symbol")&&e.type==="symbol"&&P(e.$id)}function jo(e){return I(e,"TemplateLiteral")&&e.type==="string"&&C(e.pattern)&&e.pattern[0]==="^"&&e.pattern[e.pattern.length-1]==="$"}function Go(e){return I(e,"This")&&P(e.$id)&&C(e.$ref)}function Vo(e){return A(e)&&V in e}function Ho(e){return I(e,"Tuple")&&e.type==="array"&&P(e.$id)&&ue(e.minItems)&&ue(e.maxItems)&&e.minItems===e.maxItems&&(D(e.items)&&D(e.additionalItems)&&e.minItems===0||K(e.items)&&e.items.every(t=>z(t)))}function Bo(e){return I(e,"Undefined")&&e.type==="undefined"&&P(e.$id)}function Ba(e){return yr(e)&&e.anyOf.every(t=>Po(t)||Ro(t))}function yr(e){return I(e,"Union")&&P(e.$id)&&A(e)&&K(e.anyOf)&&e.anyOf.every(t=>z(t))}function Wo(e){return I(e,"Uint8Array")&&e.type==="Uint8Array"&&P(e.$id)&&M(e.minByteLength)&&M(e.maxByteLength)}function qo(e){return I(e,"Unknown")&&P(e.$id)}function zo(e){return I(e,"Unsafe")}function Yo(e){return I(e,"Void")&&e.type==="void"&&P(e.$id)}function Jo(e){return A(e)&&m in e&&C(e[m])&&!_a.includes(e[m])}function z(e){return A(e)&&(po(e)||lo(e)||fo(e)||ho(e)||Io(e)||go(e)||yo(e)||xo(e)||So(e)||To(e)||bo(e)||wo(e)||Ao(e)||zt(e)||Co(e)||Mo(e)||Eo(e)||Fo(e)||ko(e)||$o(e)||vo(e)||No(e)||Uo(e)||_o(e)||Lo(e)||Ko(e)||Do(e)||jo(e)||Go(e)||Ho(e)||Bo(e)||yr(e)||Wo(e)||qo(e)||zo(e)||Yo(e)||Jo(e))}var xr="(true|false)",Yt="(0|[1-9][0-9]*)",Sr="(.*)",Wa="(?!.*)",Af=`^${xr}$`,qe=`^${Yt}$`,ze=`^${Sr}$`,Xo=`^${Wa}$`;function Qo(e,t){return e.includes(t)}function Zo(e){return[...new Set(e)]}function qa(e,t){return e.filter(n=>t.includes(n))}function za(e,t){return e.reduce((n,r)=>qa(n,r),t)}function es(e){return e.length===1?e[0]:e.length>1?za(e.slice(1),e[0]):[]}function ts(e){let t=[];for(let n of e)t.push(...n);return t}function Ye(e){return u({[m]:"Any"},e)}function Tt(e,t){return u({[m]:"Array",type:"array",items:e},t)}function ns(e){return u({[m]:"Argument",index:e})}function bt(e,t){return u({[m]:"AsyncIterator",type:"AsyncIterator",items:e},t)}function E(e,t,n){return u({[m]:"Computed",target:e,parameters:t},n)}function Ya(e,t){let{[t]:n,...r}=e;return r}function _(e,t){return t.reduce((n,r)=>Ya(n,r),e)}function x(e){return u({[m]:"Never",not:{}},e)}function S(e){return u({[m]:"MappedResult",properties:e})}function wt(e,t,n){return u({[m]:"Constructor",type:"Constructor",parameters:e,returns:t},n)}function ve(e,t,n){return u({[m]:"Function",type:"Function",parameters:e,returns:t},n)}function Jt(e,t){return u({[m]:"Union",anyOf:e},t)}function Ja(e){return e.some(t=>oe(t))}function rs(e){return e.map(t=>oe(t)?Xa(t):t)}function Xa(e){return _(e,[J])}function Qa(e,t){return Ja(e)?ee(Jt(rs(e),t)):Jt(rs(e),t)}function Ne(e,t){return e.length===1?u(e[0],t):e.length===0?x(t):Qa(e,t)}function w(e,t){return e.length===0?x(t):e.length===1?u(e[0],t):Jt(e,t)}var gn=class extends q{};function Za(e){return e.replace(/\\\$/g,"$").replace(/\\\*/g,"*").replace(/\\\^/g,"^").replace(/\\\|/g,"|").replace(/\\\(/g,"(").replace(/\\\)/g,")")}function Tr(e,t,n){return e[t]===n&&e.charCodeAt(t-1)!==92}function Ve(e,t){return Tr(e,t,"(")}function Xt(e,t){return Tr(e,t,")")}function os(e,t){return Tr(e,t,"|")}function eu(e){if(!(Ve(e,0)&&Xt(e,e.length-1)))return!1;let t=0;for(let n=0;n<e.length;n++)if(Ve(e,n)&&(t+=1),Xt(e,n)&&(t-=1),t===0&&n!==e.length-1)return!1;return!0}function tu(e){return e.slice(1,e.length-1)}function nu(e){let t=0;for(let n=0;n<e.length;n++)if(Ve(e,n)&&(t+=1),Xt(e,n)&&(t-=1),os(e,n)&&t===0)return!0;return!1}function ru(e){for(let t=0;t<e.length;t++)if(Ve(e,t))return!0;return!1}function ou(e){let[t,n]=[0,0],r=[];for(let i=0;i<e.length;i++)if(Ve(e,i)&&(t+=1),Xt(e,i)&&(t-=1),os(e,i)&&t===0){let s=e.slice(n,i);s.length>0&&r.push(At(s)),n=i+1}let o=e.slice(n);return o.length>0&&r.push(At(o)),r.length===0?{type:"const",const:""}:r.length===1?r[0]:{type:"or",expr:r}}function su(e){function t(o,i){if(!Ve(o,i))throw new gn("TemplateLiteralParser: Index must point to open parens");let s=0;for(let c=i;c<o.length;c++)if(Ve(o,c)&&(s+=1),Xt(o,c)&&(s-=1),s===0)return[i,c];throw new gn("TemplateLiteralParser: Unclosed group parens in expression")}function n(o,i){for(let s=i;s<o.length;s++)if(Ve(o,s))return[i,s];return[i,o.length]}let r=[];for(let o=0;o<e.length;o++)if(Ve(e,o)){let[i,s]=t(e,o),c=e.slice(i,s+1);r.push(At(c)),o=s}else{let[i,s]=n(e,o),c=e.slice(i,s);c.length>0&&r.push(At(c)),o=s-1}return r.length===0?{type:"const",const:""}:r.length===1?r[0]:{type:"and",expr:r}}function At(e){return eu(e)?At(tu(e)):nu(e)?ou(e):ru(e)?su(e):{type:"const",const:Za(e)}}function Pt(e){return At(e.slice(1,e.length-1))}var br=class extends q{};function iu(e){return e.type==="or"&&e.expr.length===2&&e.expr[0].type==="const"&&e.expr[0].const==="0"&&e.expr[1].type==="const"&&e.expr[1].const==="[1-9][0-9]*"}function au(e){return e.type==="or"&&e.expr.length===2&&e.expr[0].type==="const"&&e.expr[0].const==="true"&&e.expr[1].type==="const"&&e.expr[1].const==="false"}function uu(e){return e.type==="const"&&e.const===".*"}function pt(e){return iu(e)||uu(e)?!1:au(e)?!0:e.type==="and"?e.expr.every(t=>pt(t)):e.type==="or"?e.expr.every(t=>pt(t)):e.type==="const"?!0:(()=>{throw new br("Unknown expression type")})()}function ss(e){let t=Pt(e.pattern);return pt(t)}var wr=class extends q{};function*is(e){if(e.length===1)return yield*e[0];for(let t of e[0])for(let n of is(e.slice(1)))yield`${t}${n}`}function*du(e){return yield*is(e.expr.map(t=>[...Qt(t)]))}function*cu(e){for(let t of e.expr)yield*Qt(t)}function*mu(e){return yield e.const}function*Qt(e){return e.type==="and"?yield*du(e):e.type==="or"?yield*cu(e):e.type==="const"?yield*mu(e):(()=>{throw new wr("Unknown expression")})()}function In(e){let t=Pt(e.pattern);return pt(t)?[...Qt(t)]:[]}function T(e,t){return u({[m]:"Literal",const:e,type:typeof e},t)}function hn(e){return u({[m]:"Boolean",type:"boolean"},e)}function Rt(e){return u({[m]:"BigInt",type:"bigint"},e)}function he(e){return u({[m]:"Number",type:"number"},e)}function Ee(e){return u({[m]:"String",type:"string"},e)}function*pu(e){let t=e.trim().replace(/"|'/g,"");return t==="boolean"?yield hn():t==="number"?yield he():t==="bigint"?yield Rt():t==="string"?yield Ee():yield(()=>{let n=t.split("|").map(r=>T(r.trim()));return n.length===0?x():n.length===1?n[0]:Ne(n)})()}function*lu(e){if(e[1]!=="{"){let t=T("$"),n=Ar(e.slice(1));return yield*[t,...n]}for(let t=2;t<e.length;t++)if(e[t]==="}"){let n=pu(e.slice(2,t)),r=Ar(e.slice(t+1));return yield*[...n,...r]}yield T(e)}function*Ar(e){for(let t=0;t<e.length;t++)if(e[t]==="$"){let n=T(e.slice(0,t)),r=lu(e.slice(t));return yield*[n,...r]}yield T(e)}function as(e){return[...Ar(e)]}var Pr=class extends q{};function fu(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function us(e,t){return me(e)?e.pattern.slice(1,e.pattern.length-1):y(e)?`(${e.anyOf.map(n=>us(n,t)).join("|")})`:Me(e)?`${t}${Yt}`:Ce(e)?`${t}${Yt}`:ut(e)?`${t}${Yt}`:je(e)?`${t}${Sr}`:de(e)?`${t}${fu(e.const.toString())}`:De(e)?`${t}${xr}`:(()=>{throw new Pr(`Unexpected Kind '${e[m]}'`)})()}function Rr(e){return`^${e.map(t=>us(t,"")).join("")}$`}function lt(e){let n=In(e).map(r=>T(r));return Ne(n)}function yn(e,t){let n=C(e)?Rr(as(e)):Rr(e);return u({[m]:"TemplateLiteral",type:"string",pattern:n},t)}function gu(e){return In(e).map(n=>n.toString())}function Iu(e){let t=[];for(let n of e)t.push(...se(n));return t}function hu(e){return[e.toString()]}function se(e){return[...new Set(me(e)?gu(e):y(e)?Iu(e.anyOf):de(e)?hu(e.const):Me(e)?["[number]"]:Ce(e)?["[number]"]:[])]}function yu(e,t,n){let r={};for(let o of Object.getOwnPropertyNames(t))r[o]=Je(e,se(t[o]),n);return r}function xu(e,t,n){return yu(e,t.properties,n)}function ds(e,t,n){let r=xu(e,t,n);return S(r)}function ms(e,t){return e.map(n=>ps(n,t))}function Su(e){return e.filter(t=>!Be(t))}function Tu(e,t){return xn(Su(ms(e,t)))}function bu(e){return e.some(t=>Be(t))?[]:e}function wu(e,t){return Ne(bu(ms(e,t)))}function Au(e,t){return t in e?e[t]:t==="[number]"?Ne(e):x()}function Pu(e,t){return t==="[number]"?e:x()}function Ru(e,t){return t in e?e[t]:x()}function ps(e,t){return U(e)?Tu(e.allOf,t):y(e)?wu(e.anyOf,t):pe(e)?Au(e.items??[],t):Ae(e)?Pu(e.items,t):j(e)?Ru(e.properties,t):x()}function Or(e,t){return t.map(n=>ps(e,n))}function cs(e,t){return Ne(Or(e,t))}function Je(e,t,n){if(L(e)||L(t)){let r="Index types using Ref parameters require both Type and Key to be of TSchema";if(!le(e)||!le(t))throw new q(r);return E("Index",[e,t])}return v(t)?ds(e,t,n):ce(t)?ls(e,t,n):u(le(t)?cs(e,se(t)):cs(e,t),n)}function Ou(e,t,n){return{[t]:Je(e,[t],$(n))}}function Cu(e,t,n){return t.reduce((r,o)=>({...r,...Ou(e,o,n)}),{})}function Mu(e,t,n){return Cu(e,t.keys,n)}function ls(e,t,n){let r=Mu(e,t,n);return S(r)}function Ot(e,t){return u({[m]:"Iterator",type:"Iterator",items:e},t)}function Eu(e){return globalThis.Object.keys(e).filter(t=>!oe(e[t]))}function Fu(e,t){let n=Eu(e),r=n.length>0?{[m]:"Object",type:"object",required:n,properties:e}:{[m]:"Object",type:"object",properties:e};return u(r,t)}var R=Fu;function Sn(e,t){return u({[m]:"Promise",type:"Promise",item:e},t)}function ku(e){return u(_(e,[we]))}function $u(e){return u({...e,[we]:"Readonly"})}function vu(e,t){return t===!1?ku(e):$u(e)}function ie(e,t){let n=t??!0;return v(e)?fs(e,n):vu(e,n)}function Nu(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=ie(e[r],t);return n}function Uu(e,t){return Nu(e.properties,t)}function fs(e,t){let n=Uu(e,t);return S(n)}function ye(e,t){return u(e.length>0?{[m]:"Tuple",type:"array",items:e,additionalItems:!1,minItems:e.length,maxItems:e.length}:{[m]:"Tuple",type:"array",minItems:e.length,maxItems:e.length},t)}function gs(e,t){return e in t?xe(e,t[e]):S(t)}function _u(e){return{[e]:T(e)}}function Lu(e){let t={};for(let n of e)t[n]=T(n);return t}function Ku(e,t){return Qo(t,e)?_u(e):Lu(t)}function Du(e,t){let n=Ku(e,t);return gs(e,n)}function Zt(e,t){return t.map(n=>xe(e,n))}function ju(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(t))n[r]=xe(e,t[r]);return n}function xe(e,t){let n={...t};return oe(t)?ee(xe(e,_(t,[J]))):St(t)?ie(xe(e,_(t,[we]))):v(t)?gs(e,t.properties):ce(t)?Du(e,t.keys):Re(t)?wt(Zt(e,t.parameters),xe(e,t.returns),n):Oe(t)?ve(Zt(e,t.parameters),xe(e,t.returns),n):at(t)?bt(xe(e,t.items),n):dt(t)?Ot(xe(e,t.items),n):U(t)?te(Zt(e,t.allOf),n):y(t)?w(Zt(e,t.anyOf),n):pe(t)?ye(Zt(e,t.items??[]),n):j(t)?R(ju(e,t.properties),n):Ae(t)?Tt(xe(e,t.items),n):ct(t)?Sn(xe(e,t.item),n):t}function Gu(e,t){let n={};for(let r of e)n[r]=xe(r,t);return n}function Is(e,t,n){let r=le(e)?se(e):e,o=t({[m]:"MappedKey",keys:r}),i=Gu(r,o);return R(i,n)}function Vu(e){return u(_(e,[J]))}function Hu(e){return u({...e,[J]:"Optional"})}function Bu(e,t){return t===!1?Vu(e):Hu(e)}function ee(e,t){let n=t??!0;return v(e)?hs(e,n):Bu(e,n)}function Wu(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=ee(e[r],t);return n}function qu(e,t){return Wu(e.properties,t)}function hs(e,t){let n=qu(e,t);return S(n)}function en(e,t={}){let n=e.every(o=>j(o)),r=le(t.unevaluatedProperties)?{unevaluatedProperties:t.unevaluatedProperties}:{};return u(t.unevaluatedProperties===!1||le(t.unevaluatedProperties)||n?{...r,[m]:"Intersect",type:"object",allOf:e}:{...r,[m]:"Intersect",allOf:e},t)}function zu(e){return e.every(t=>oe(t))}function Yu(e){return _(e,[J])}function ys(e){return e.map(t=>oe(t)?Yu(t):t)}function Ju(e,t){return zu(e)?ee(en(ys(e),t)):en(ys(e),t)}function xn(e,t={}){if(e.length===1)return u(e[0],t);if(e.length===0)return x(t);if(e.some(n=>We(n)))throw new Error("Cannot intersect transform types");return Ju(e,t)}function te(e,t){if(e.length===1)return u(e[0],t);if(e.length===0)return x(t);if(e.some(n=>We(n)))throw new Error("Cannot intersect transform types");return en(e,t)}function Ue(...e){let[t,n]=typeof e[0]=="string"?[e[0],e[1]]:[e[0].$id,e[1]];if(typeof t!="string")throw new q("Ref: $ref must be a string");return u({[m]:"Ref",$ref:t},n)}function Xu(e,t){return E("Awaited",[E(e,t)])}function Qu(e){return E("Awaited",[Ue(e)])}function Zu(e){return te(xs(e))}function ed(e){return w(xs(e))}function td(e){return Ct(e)}function xs(e){return e.map(t=>Ct(t))}function Ct(e,t){return u(Pe(e)?Xu(e.target,e.parameters):U(e)?Zu(e.allOf):y(e)?ed(e.anyOf):ct(e)?td(e.item):L(e)?Qu(e.$ref):e,t)}function Ss(e){let t=[];for(let n of e)t.push(tn(n));return t}function nd(e){let t=Ss(e);return ts(t)}function rd(e){let t=Ss(e);return es(t)}function od(e){return e.map((t,n)=>n.toString())}function sd(e){return["[number]"]}function id(e){return globalThis.Object.getOwnPropertyNames(e)}function ad(e){return ud?globalThis.Object.getOwnPropertyNames(e).map(n=>n[0]==="^"&&n[n.length-1]==="$"?n.slice(1,n.length-1):n):[]}function tn(e){return U(e)?nd(e.allOf):y(e)?rd(e.anyOf):pe(e)?od(e.items??[]):Ae(e)?sd(e.items):j(e)?id(e.properties):mt(e)?ad(e.patternProperties):[]}var ud=!1;function dd(e,t){return E("KeyOf",[E(e,t)])}function cd(e){return E("KeyOf",[Ue(e)])}function md(e,t){let n=tn(e),r=pd(n),o=Ne(r);return u(o,t)}function pd(e){return e.map(t=>t==="[number]"?he():T(t))}function Mt(e,t){return Pe(e)?dd(e.target,e.parameters):L(e)?cd(e.$ref):v(e)?Ts(e,t):md(e,t)}function ld(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=Mt(e[r],$(t));return n}function fd(e,t){return ld(e.properties,t)}function Ts(e,t){let n=fd(e,t);return S(n)}function gd(e){let t=[];for(let n of e)t.push(...tn(n));return Zo(t)}function Id(e){return e.filter(t=>!Be(t))}function hd(e,t){let n=[];for(let r of e)n.push(...Or(r,[t]));return Id(n)}function yd(e,t){let n={};for(let r of t)n[r]=xn(hd(e,r));return n}function bs(e,t){let n=gd(e),r=yd(e,n);return R(r,t)}function Tn(e){return u({[m]:"Date",type:"Date"},e)}function bn(e){return u({[m]:"Null",type:"null"},e)}function wn(e){return u({[m]:"Symbol",type:"symbol"},e)}function An(e){return u({[m]:"Undefined",type:"undefined"},e)}function Pn(e){return u({[m]:"Uint8Array",type:"Uint8Array"},e)}function Xe(e){return u({[m]:"Unknown"},e)}function xd(e){return e.map(t=>Cr(t,!1))}function Sd(e){let t={};for(let n of globalThis.Object.getOwnPropertyNames(e))t[n]=ie(Cr(e[n],!1));return t}function Rn(e,t){return t===!0?e:ie(e)}function Cr(e,t){return ar(e)?Rn(Ye(),t):dr(e)?Rn(Ye(),t):K(e)?ie(ye(xd(e))):Ke(e)?Pn():it(e)?Tn():A(e)?Rn(R(Sd(e)),t):ur(e)?Rn(ve([],Xe()),t):D(e)?An():cr(e)?bn():mr(e)?wn():jt(e)?Rt():ue(e)?T(e):Le(e)?T(e):C(e)?T(e):R({})}function ws(e,t){return u(Cr(e,!0),t)}function As(e,t){return Re(e)?ye(e.parameters,t):x(t)}function Ps(e,t){if(D(e))throw new Error("Enum undefined or empty");let n=globalThis.Object.getOwnPropertyNames(e).filter(i=>isNaN(i)).map(i=>e[i]),o=[...new Set(n)].map(i=>T(i));return w(o,{...t,[Ie]:"Enum"})}var Er=class extends q{},d;(function(e){e[e.Union=0]="Union",e[e.True=1]="True",e[e.False=2]="False"})(d||(d={}));function Se(e){return e===d.False?e:d.True}function Et(e){throw new Er(e)}function H(e){return a.IsNever(e)||a.IsIntersect(e)||a.IsUnion(e)||a.IsUnknown(e)||a.IsAny(e)}function B(e,t){return a.IsNever(t)?ks(e,t):a.IsIntersect(t)?On(e,t):a.IsUnion(t)?vr(e,t):a.IsUnknown(t)?Us(e,t):a.IsAny(t)?$r(e,t):Et("StructuralRight")}function $r(e,t){return d.True}function Td(e,t){return a.IsIntersect(t)?On(e,t):a.IsUnion(t)&&t.anyOf.some(n=>a.IsAny(n)||a.IsUnknown(n))?d.True:a.IsUnion(t)?d.Union:a.IsUnknown(t)||a.IsAny(t)?d.True:d.Union}function bd(e,t){return a.IsUnknown(e)?d.False:a.IsAny(e)?d.Union:a.IsNever(e)?d.True:d.False}function wd(e,t){return a.IsObject(t)&&Cn(t)?d.True:H(t)?B(e,t):a.IsArray(t)?Se(O(e.items,t.items)):d.False}function Ad(e,t){return H(t)?B(e,t):a.IsAsyncIterator(t)?Se(O(e.items,t.items)):d.False}function Pd(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsBigInt(t)?d.True:d.False}function Es(e,t){return a.IsLiteralBoolean(e)||a.IsBoolean(e)?d.True:d.False}function Rd(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsBoolean(t)?d.True:d.False}function Od(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsConstructor(t)?e.parameters.length>t.parameters.length?d.False:e.parameters.every((n,r)=>Se(O(t.parameters[r],n))===d.True)?Se(O(e.returns,t.returns)):d.False:d.False}function Cd(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsDate(t)?d.True:d.False}function Md(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsFunction(t)?e.parameters.length>t.parameters.length?d.False:e.parameters.every((n,r)=>Se(O(t.parameters[r],n))===d.True)?Se(O(e.returns,t.returns)):d.False:d.False}function Fs(e,t){return a.IsLiteral(e)&&Z.IsNumber(e.const)||a.IsNumber(e)||a.IsInteger(e)?d.True:d.False}function Ed(e,t){return a.IsInteger(t)||a.IsNumber(t)?d.True:H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):d.False}function On(e,t){return t.allOf.every(n=>O(e,n)===d.True)?d.True:d.False}function Fd(e,t){return e.allOf.some(n=>O(n,t)===d.True)?d.True:d.False}function kd(e,t){return H(t)?B(e,t):a.IsIterator(t)?Se(O(e.items,t.items)):d.False}function $d(e,t){return a.IsLiteral(t)&&t.const===e.const?d.True:H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsString(t)?Ns(e,t):a.IsNumber(t)?$s(e,t):a.IsInteger(t)?Fs(e,t):a.IsBoolean(t)?Es(e,t):d.False}function ks(e,t){return d.False}function vd(e,t){return d.True}function Rs(e){let[t,n]=[e,0];for(;a.IsNot(t);)t=t.not,n+=1;return n%2===0?t:Xe()}function Nd(e,t){return a.IsNot(e)?O(Rs(e),t):a.IsNot(t)?O(e,Rs(t)):Et("Invalid fallthrough for Not")}function Ud(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsNull(t)?d.True:d.False}function $s(e,t){return a.IsLiteralNumber(e)||a.IsNumber(e)||a.IsInteger(e)?d.True:d.False}function _d(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsInteger(t)||a.IsNumber(t)?d.True:d.False}function ae(e,t){return Object.getOwnPropertyNames(e.properties).length===t}function Os(e){return Cn(e)}function Cs(e){return ae(e,0)||ae(e,1)&&"description"in e.properties&&a.IsUnion(e.properties.description)&&e.properties.description.anyOf.length===2&&(a.IsString(e.properties.description.anyOf[0])&&a.IsUndefined(e.properties.description.anyOf[1])||a.IsString(e.properties.description.anyOf[1])&&a.IsUndefined(e.properties.description.anyOf[0]))}function Mr(e){return ae(e,0)}function Ms(e){return ae(e,0)}function Ld(e){return ae(e,0)}function Kd(e){return ae(e,0)}function Dd(e){return Cn(e)}function jd(e){let t=he();return ae(e,0)||ae(e,1)&&"length"in e.properties&&Se(O(e.properties.length,t))===d.True}function Gd(e){return ae(e,0)}function Cn(e){let t=he();return ae(e,0)||ae(e,1)&&"length"in e.properties&&Se(O(e.properties.length,t))===d.True}function Vd(e){let t=ve([Ye()],Ye());return ae(e,0)||ae(e,1)&&"then"in e.properties&&Se(O(e.properties.then,t))===d.True}function vs(e,t){return O(e,t)===d.False||a.IsOptional(e)&&!a.IsOptional(t)?d.False:d.True}function ne(e,t){return a.IsUnknown(e)?d.False:a.IsAny(e)?d.Union:a.IsNever(e)||a.IsLiteralString(e)&&Os(t)||a.IsLiteralNumber(e)&&Mr(t)||a.IsLiteralBoolean(e)&&Ms(t)||a.IsSymbol(e)&&Cs(t)||a.IsBigInt(e)&&Ld(t)||a.IsString(e)&&Os(t)||a.IsSymbol(e)&&Cs(t)||a.IsNumber(e)&&Mr(t)||a.IsInteger(e)&&Mr(t)||a.IsBoolean(e)&&Ms(t)||a.IsUint8Array(e)&&Dd(t)||a.IsDate(e)&&Kd(t)||a.IsConstructor(e)&&Gd(t)||a.IsFunction(e)&&jd(t)?d.True:a.IsRecord(e)&&a.IsString(Fr(e))?t[Ie]==="Record"?d.True:d.False:a.IsRecord(e)&&a.IsNumber(Fr(e))&&ae(t,0)?d.True:d.False}function Hd(e,t){return H(t)?B(e,t):a.IsRecord(t)?Te(e,t):a.IsObject(t)?(()=>{for(let n of Object.getOwnPropertyNames(t.properties)){if(!(n in e.properties)&&!a.IsOptional(t.properties[n]))return d.False;if(a.IsOptional(t.properties[n]))return d.True;if(vs(e.properties[n],t.properties[n])===d.False)return d.False}return d.True})():d.False}function Bd(e,t){return H(t)?B(e,t):a.IsObject(t)&&Vd(t)?d.True:a.IsPromise(t)?Se(O(e.item,t.item)):d.False}function Fr(e){return qe in e.patternProperties?he():ze in e.patternProperties?Ee():Et("Unknown record key pattern")}function kr(e){return qe in e.patternProperties?e.patternProperties[qe]:ze in e.patternProperties?e.patternProperties[ze]:Et("Unable to get record value schema")}function Te(e,t){let[n,r]=[Fr(t),kr(t)];return a.IsLiteralString(e)&&a.IsNumber(n)&&Se(O(e,r))===d.True?d.True:a.IsUint8Array(e)&&a.IsNumber(n)||a.IsString(e)&&a.IsNumber(n)||a.IsArray(e)&&a.IsNumber(n)?O(e,r):a.IsObject(e)?(()=>{for(let o of Object.getOwnPropertyNames(e.properties))if(vs(r,e.properties[o])===d.False)return d.False;return d.True})():d.False}function Wd(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?O(kr(e),kr(t)):d.False}function qd(e,t){let n=a.IsRegExp(e)?Ee():e,r=a.IsRegExp(t)?Ee():t;return O(n,r)}function Ns(e,t){return a.IsLiteral(e)&&Z.IsString(e.const)||a.IsString(e)?d.True:d.False}function zd(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsString(t)?d.True:d.False}function Yd(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsSymbol(t)?d.True:d.False}function Jd(e,t){return a.IsTemplateLiteral(e)?O(lt(e),t):a.IsTemplateLiteral(t)?O(e,lt(t)):Et("Invalid fallthrough for TemplateLiteral")}function Xd(e,t){return a.IsArray(t)&&e.items!==void 0&&e.items.every(n=>O(n,t.items)===d.True)}function Qd(e,t){return a.IsNever(e)?d.True:a.IsUnknown(e)?d.False:a.IsAny(e)?d.Union:d.False}function Zd(e,t){return H(t)?B(e,t):a.IsObject(t)&&Cn(t)||a.IsArray(t)&&Xd(e,t)?d.True:a.IsTuple(t)?Z.IsUndefined(e.items)&&!Z.IsUndefined(t.items)||!Z.IsUndefined(e.items)&&Z.IsUndefined(t.items)?d.False:Z.IsUndefined(e.items)&&!Z.IsUndefined(t.items)||e.items.every((n,r)=>O(n,t.items[r])===d.True)?d.True:d.False:d.False}function ec(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsUint8Array(t)?d.True:d.False}function tc(e,t){return H(t)?B(e,t):a.IsObject(t)?ne(e,t):a.IsRecord(t)?Te(e,t):a.IsVoid(t)?oc(e,t):a.IsUndefined(t)?d.True:d.False}function vr(e,t){return t.anyOf.some(n=>O(e,n)===d.True)?d.True:d.False}function nc(e,t){return e.anyOf.every(n=>O(n,t)===d.True)?d.True:d.False}function Us(e,t){return d.True}function rc(e,t){return a.IsNever(t)?ks(e,t):a.IsIntersect(t)?On(e,t):a.IsUnion(t)?vr(e,t):a.IsAny(t)?$r(e,t):a.IsString(t)?Ns(e,t):a.IsNumber(t)?$s(e,t):a.IsInteger(t)?Fs(e,t):a.IsBoolean(t)?Es(e,t):a.IsArray(t)?bd(e,t):a.IsTuple(t)?Qd(e,t):a.IsObject(t)?ne(e,t):a.IsUnknown(t)?d.True:d.False}function oc(e,t){return a.IsUndefined(e)||a.IsUndefined(e)?d.True:d.False}function sc(e,t){return a.IsIntersect(t)?On(e,t):a.IsUnion(t)?vr(e,t):a.IsUnknown(t)?Us(e,t):a.IsAny(t)?$r(e,t):a.IsObject(t)?ne(e,t):a.IsVoid(t)?d.True:d.False}function O(e,t){return a.IsTemplateLiteral(e)||a.IsTemplateLiteral(t)?Jd(e,t):a.IsRegExp(e)||a.IsRegExp(t)?qd(e,t):a.IsNot(e)||a.IsNot(t)?Nd(e,t):a.IsAny(e)?Td(e,t):a.IsArray(e)?wd(e,t):a.IsBigInt(e)?Pd(e,t):a.IsBoolean(e)?Rd(e,t):a.IsAsyncIterator(e)?Ad(e,t):a.IsConstructor(e)?Od(e,t):a.IsDate(e)?Cd(e,t):a.IsFunction(e)?Md(e,t):a.IsInteger(e)?Ed(e,t):a.IsIntersect(e)?Fd(e,t):a.IsIterator(e)?kd(e,t):a.IsLiteral(e)?$d(e,t):a.IsNever(e)?vd(e,t):a.IsNull(e)?Ud(e,t):a.IsNumber(e)?_d(e,t):a.IsObject(e)?Hd(e,t):a.IsRecord(e)?Wd(e,t):a.IsString(e)?zd(e,t):a.IsSymbol(e)?Yd(e,t):a.IsTuple(e)?Zd(e,t):a.IsPromise(e)?Bd(e,t):a.IsUint8Array(e)?ec(e,t):a.IsUndefined(e)?tc(e,t):a.IsUnion(e)?nc(e,t):a.IsUnknown(e)?rc(e,t):a.IsVoid(e)?sc(e,t):Et(`Unknown left type operand '${e[m]}'`)}function Qe(e,t){return O(e,t)}function ic(e,t,n,r,o){let i={};for(let s of globalThis.Object.getOwnPropertyNames(e))i[s]=Ft(e[s],t,n,r,$(o));return i}function ac(e,t,n,r,o){return ic(e.properties,t,n,r,o)}function _s(e,t,n,r,o){let i=ac(e,t,n,r,o);return S(i)}function uc(e,t,n,r){let o=Qe(e,t);return o===d.Union?w([n,r]):o===d.True?n:r}function Ft(e,t,n,r,o){return v(e)?_s(e,t,n,r,o):ce(e)?u(Ls(e,t,n,r,o)):u(uc(e,t,n,r),o)}function dc(e,t,n,r,o){return{[e]:Ft(T(e),t,n,r,$(o))}}function cc(e,t,n,r,o){return e.reduce((i,s)=>({...i,...dc(s,t,n,r,o)}),{})}function mc(e,t,n,r,o){return cc(e.keys,t,n,r,o)}function Ls(e,t,n,r,o){let i=mc(e,t,n,r,o);return S(i)}function Ks(e,t){return kt(lt(e),t)}function pc(e,t){let n=e.filter(r=>Qe(r,t)===d.False);return n.length===1?n[0]:w(n)}function kt(e,t,n={}){return me(e)?u(Ks(e,t),n):v(e)?u(Ds(e,t),n):u(y(e)?pc(e.anyOf,t):Qe(e,t)!==d.False?x():e,n)}function lc(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=kt(e[r],t);return n}function fc(e,t){return lc(e.properties,t)}function Ds(e,t){let n=fc(e,t);return S(n)}function js(e,t){return $t(lt(e),t)}function gc(e,t){let n=e.filter(r=>Qe(r,t)!==d.False);return n.length===1?n[0]:w(n)}function $t(e,t,n){return me(e)?u(js(e,t),n):v(e)?u(Gs(e,t),n):u(y(e)?gc(e.anyOf,t):Qe(e,t)!==d.False?e:x(),n)}function Ic(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=$t(e[r],t);return n}function hc(e,t){return Ic(e.properties,t)}function Gs(e,t){let n=hc(e,t);return S(n)}function Vs(e,t){return Re(e)?u(e.returns,t):x(t)}function Mn(e){return ie(ee(e))}function ft(e,t,n){return u({[m]:"Record",type:"object",patternProperties:{[e]:t}},n)}function Nr(e,t,n){let r={};for(let o of e)r[o]=t;return R(r,{...n,[Ie]:"Record"})}function yc(e,t,n){return ss(e)?Nr(se(e),t,n):ft(e.pattern,t,n)}function xc(e,t,n){return Nr(se(w(e)),t,n)}function Sc(e,t,n){return Nr([e.toString()],t,n)}function Tc(e,t,n){return ft(e.source,t,n)}function bc(e,t,n){let r=D(e.pattern)?ze:e.pattern;return ft(r,t,n)}function wc(e,t,n){return ft(ze,t,n)}function Ac(e,t,n){return ft(Xo,t,n)}function Pc(e,t,n){return R({true:t,false:t},n)}function Rc(e,t,n){return ft(qe,t,n)}function Oc(e,t,n){return ft(qe,t,n)}function En(e,t,n={}){return y(e)?xc(e.anyOf,t,n):me(e)?yc(e,t,n):de(e)?Sc(e.const,t,n):De(e)?Pc(e,t,n):Ce(e)?Rc(e,t,n):Me(e)?Oc(e,t,n):fr(e)?Tc(e,t,n):je(e)?bc(e,t,n):pr(e)?wc(e,t,n):Be(e)?Ac(e,t,n):x(n)}function Fn(e){return globalThis.Object.getOwnPropertyNames(e.patternProperties)[0]}function Hs(e){let t=Fn(e);return t===ze?Ee():t===qe?he():Ee({pattern:t})}function kn(e){return e.patternProperties[Fn(e)]}function Cc(e,t){return t.parameters=nn(e,t.parameters),t.returns=Fe(e,t.returns),t}function Mc(e,t){return t.parameters=nn(e,t.parameters),t.returns=Fe(e,t.returns),t}function Ec(e,t){return t.allOf=nn(e,t.allOf),t}function Fc(e,t){return t.anyOf=nn(e,t.anyOf),t}function kc(e,t){return D(t.items)||(t.items=nn(e,t.items)),t}function $c(e,t){return t.items=Fe(e,t.items),t}function vc(e,t){return t.items=Fe(e,t.items),t}function Nc(e,t){return t.items=Fe(e,t.items),t}function Uc(e,t){return t.item=Fe(e,t.item),t}function _c(e,t){let n=jc(e,t.properties);return{...t,...R(n)}}function Lc(e,t){let n=Fe(e,Hs(t)),r=Fe(e,kn(t)),o=En(n,r);return{...t,...o}}function Kc(e,t){return t.index in e?e[t.index]:Xe()}function Dc(e,t){let n=St(t),r=oe(t),o=Fe(e,t);return n&&r?Mn(o):n&&!r?ie(o):!n&&r?ee(o):o}function jc(e,t){return globalThis.Object.getOwnPropertyNames(t).reduce((n,r)=>({...n,[r]:Dc(e,t[r])}),{})}function nn(e,t){return t.map(n=>Fe(e,n))}function Fe(e,t){return Re(t)?Cc(e,t):Oe(t)?Mc(e,t):U(t)?Ec(e,t):y(t)?Fc(e,t):pe(t)?kc(e,t):Ae(t)?$c(e,t):at(t)?vc(e,t):dt(t)?Nc(e,t):ct(t)?Uc(e,t):j(t)?_c(e,t):mt(t)?Lc(e,t):lr(t)?Kc(e,t):t}function Bs(e,t){return Fe(t,xt(e))}function Ws(e){return u({[m]:"Integer",type:"integer"},e)}function Gc(e,t,n){return{[e]:ke(T(e),t,$(n))}}function Vc(e,t,n){return e.reduce((o,i)=>({...o,...Gc(i,t,n)}),{})}function Hc(e,t,n){return Vc(e.keys,t,n)}function qs(e,t,n){let r=Hc(e,t,n);return S(r)}function Bc(e){let[t,n]=[e.slice(0,1),e.slice(1)];return[t.toLowerCase(),n].join("")}function Wc(e){let[t,n]=[e.slice(0,1),e.slice(1)];return[t.toUpperCase(),n].join("")}function qc(e){return e.toUpperCase()}function zc(e){return e.toLowerCase()}function Yc(e,t,n){let r=Pt(e.pattern);if(!pt(r))return{...e,pattern:zs(e.pattern,t)};let s=[...Qt(r)].map(f=>T(f)),c=Ys(s,t),p=w(c);return yn([p],n)}function zs(e,t){return typeof e=="string"?t==="Uncapitalize"?Bc(e):t==="Capitalize"?Wc(e):t==="Uppercase"?qc(e):t==="Lowercase"?zc(e):e:e.toString()}function Ys(e,t){return e.map(n=>ke(n,t))}function ke(e,t,n={}){return ce(e)?qs(e,t,n):me(e)?Yc(e,t,n):y(e)?w(Ys(e.anyOf,t),n):de(e)?T(zs(e.const,t),n):u(e,n)}function Js(e,t={}){return ke(e,"Capitalize",t)}function Xs(e,t={}){return ke(e,"Lowercase",t)}function Qs(e,t={}){return ke(e,"Uncapitalize",t)}function Zs(e,t={}){return ke(e,"Uppercase",t)}function Jc(e,t,n){let r={};for(let o of globalThis.Object.getOwnPropertyNames(e))r[o]=Ze(e[o],t,$(n));return r}function Xc(e,t,n){return Jc(e.properties,t,n)}function ei(e,t,n){let r=Xc(e,t,n);return S(r)}function Qc(e,t){return e.map(n=>Ur(n,t))}function Zc(e,t){return e.map(n=>Ur(n,t))}function em(e,t){let{[t]:n,...r}=e;return r}function tm(e,t){return t.reduce((n,r)=>em(n,r),e)}function nm(e,t,n){let r=_(e,[V,"$id","required","properties"]),o=tm(n,t);return R(o,r)}function rm(e){let t=e.reduce((n,r)=>ln(r)?[...n,T(r)]:n,[]);return w(t)}function Ur(e,t){return U(e)?te(Qc(e.allOf,t)):y(e)?w(Zc(e.anyOf,t)):j(e)?nm(e,t,e.properties):R({})}function Ze(e,t,n){let r=K(t)?rm(t):t,o=le(t)?se(t):t,i=L(e),s=L(t);return v(e)?ei(e,o,n):ce(t)?ti(e,t,n):i&&s?E("Omit",[e,r],n):!i&&s?E("Omit",[e,r],n):i&&!s?E("Omit",[e,r],n):u({...Ur(e,o),...n})}function om(e,t,n){return{[t]:Ze(e,[t],$(n))}}function sm(e,t,n){return t.reduce((r,o)=>({...r,...om(e,o,n)}),{})}function im(e,t,n){return sm(e,t.keys,n)}function ti(e,t,n){let r=im(e,t,n);return S(r)}function am(e,t,n){let r={};for(let o of globalThis.Object.getOwnPropertyNames(e))r[o]=et(e[o],t,$(n));return r}function um(e,t,n){return am(e.properties,t,n)}function ni(e,t,n){let r=um(e,t,n);return S(r)}function dm(e,t){return e.map(n=>_r(n,t))}function cm(e,t){return e.map(n=>_r(n,t))}function mm(e,t){let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function pm(e,t,n){let r=_(e,[V,"$id","required","properties"]),o=mm(n,t);return R(o,r)}function lm(e){let t=e.reduce((n,r)=>ln(r)?[...n,T(r)]:n,[]);return w(t)}function _r(e,t){return U(e)?te(dm(e.allOf,t)):y(e)?w(cm(e.anyOf,t)):j(e)?pm(e,t,e.properties):R({})}function et(e,t,n){let r=K(t)?lm(t):t,o=le(t)?se(t):t,i=L(e),s=L(t);return v(e)?ni(e,o,n):ce(t)?ri(e,t,n):i&&s?E("Pick",[e,r],n):!i&&s?E("Pick",[e,r],n):i&&!s?E("Pick",[e,r],n):u({..._r(e,o),...n})}function fm(e,t,n){return{[t]:et(e,[t],$(n))}}function gm(e,t,n){return t.reduce((r,o)=>({...r,...fm(e,o,n)}),{})}function Im(e,t,n){return gm(e,t.keys,n)}function ri(e,t,n){let r=Im(e,t,n);return S(r)}function hm(e,t){return E("Partial",[E(e,t)])}function ym(e){return E("Partial",[Ue(e)])}function xm(e){let t={};for(let n of globalThis.Object.getOwnPropertyNames(e))t[n]=ee(e[n]);return t}function Sm(e,t){let n=_(e,[V,"$id","required","properties"]),r=xm(t);return R(r,n)}function oi(e){return e.map(t=>si(t))}function si(e){return Pe(e)?hm(e.target,e.parameters):L(e)?ym(e.$ref):U(e)?te(oi(e.allOf)):y(e)?w(oi(e.anyOf)):j(e)?Sm(e,e.properties):ut(e)||De(e)||Ce(e)||de(e)||Ht(e)||Me(e)||je(e)||Bt(e)||Wt(e)?e:R({})}function vt(e,t){return v(e)?ii(e,t):u({...si(e),...t})}function Tm(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=vt(e[r],$(t));return n}function bm(e,t){return Tm(e.properties,t)}function ii(e,t){let n=bm(e,t);return S(n)}function wm(e,t){return E("Required",[E(e,t)])}function Am(e){return E("Required",[Ue(e)])}function Pm(e){let t={};for(let n of globalThis.Object.getOwnPropertyNames(e))t[n]=_(e[n],[J]);return t}function Rm(e,t){let n=_(e,[V,"$id","required","properties"]),r=Pm(t);return R(r,n)}function ai(e){return e.map(t=>ui(t))}function ui(e){return Pe(e)?wm(e.target,e.parameters):L(e)?Am(e.$ref):U(e)?te(ai(e.allOf)):y(e)?w(ai(e.anyOf)):j(e)?Rm(e,e.properties):ut(e)||De(e)||Ce(e)||de(e)||Ht(e)||Me(e)||je(e)||Bt(e)||Wt(e)?e:R({})}function Nt(e,t){return v(e)?di(e,t):u({...ui(e),...t})}function Om(e,t){let n={};for(let r of globalThis.Object.getOwnPropertyNames(e))n[r]=Nt(e[r],t);return n}function Cm(e,t){return Om(e.properties,t)}function di(e,t){let n=Cm(e,t);return S(n)}function Mm(e,t){return t.map(n=>L(n)?Lr(e,n.$ref):fe(e,n))}function Lr(e,t){return t in e?L(e[t])?Lr(e,e[t].$ref):fe(e,e[t]):x()}function Em(e){return Ct(e[0])}function Fm(e){return Je(e[0],e[1])}function km(e){return Mt(e[0])}function $m(e){return vt(e[0])}function vm(e){return Ze(e[0],e[1])}function Nm(e){return et(e[0],e[1])}function Um(e){return Nt(e[0])}function _m(e,t,n){let r=Mm(e,n);return t==="Awaited"?Em(r):t==="Index"?Fm(r):t==="KeyOf"?km(r):t==="Partial"?$m(r):t==="Omit"?vm(r):t==="Pick"?Nm(r):t==="Required"?Um(r):x()}function Lm(e,t){return Tt(fe(e,t))}function Km(e,t){return bt(fe(e,t))}function Dm(e,t,n){return wt(rn(e,t),fe(e,n))}function jm(e,t,n){return ve(rn(e,t),fe(e,n))}function Gm(e,t){return te(rn(e,t))}function Vm(e,t){return Ot(fe(e,t))}function Hm(e,t){return R(globalThis.Object.keys(t).reduce((n,r)=>({...n,[r]:fe(e,t[r])}),{}))}function Bm(e,t){let[n,r]=[fe(e,kn(t)),Fn(t)],o=xt(t);return o.patternProperties[r]=n,o}function Wm(e,t){return L(t)?{...Lr(e,t.$ref),[V]:t[V]}:t}function qm(e,t){return ye(rn(e,t))}function zm(e,t){return w(rn(e,t))}function rn(e,t){return t.map(n=>fe(e,n))}function fe(e,t){return oe(t)?u(fe(e,_(t,[J])),t):St(t)?u(fe(e,_(t,[we])),t):We(t)?u(Wm(e,t),t):Ae(t)?u(Lm(e,t.items),t):at(t)?u(Km(e,t.items),t):Pe(t)?u(_m(e,t.target,t.parameters)):Re(t)?u(Dm(e,t.parameters,t.returns),t):Oe(t)?u(jm(e,t.parameters,t.returns),t):U(t)?u(Gm(e,t.allOf),t):dt(t)?u(Vm(e,t.items),t):j(t)?u(Hm(e,t.properties),t):mt(t)?u(Bm(e,t)):pe(t)?u(qm(e,t.items||[]),t):y(t)?u(zm(e,t.anyOf),t):t}function Ym(e,t){return t in e?fe(e,e[t]):x()}function ci(e){return globalThis.Object.getOwnPropertyNames(e).reduce((t,n)=>({...t,[n]:Ym(e,n)}),{})}var Kr=class{constructor(t){let n=ci(t),r=this.WithIdentifiers(n);this.$defs=r}Import(t,n){let r={...this.$defs,[t]:u(this.$defs[t],n)};return u({[m]:"Import",$defs:r,$ref:t})}WithIdentifiers(t){return globalThis.Object.getOwnPropertyNames(t).reduce((n,r)=>({...n,[r]:{...t[r],$id:r}}),{})}};function mi(e){return new Kr(e)}function pi(e,t){return u({[m]:"Not",not:e},t)}function li(e,t){return Oe(e)?ye(e.parameters,t):x()}var Jm=0;function fi(e,t={}){D(t.$id)&&(t.$id=`T${Jm++}`);let n=xt(e({[m]:"This",$ref:`${t.$id}`}));return n.$id=t.$id,u({[Ie]:"Recursive",...n},t)}function gi(e,t){let n=C(e)?new globalThis.RegExp(e):e;return u({[m]:"RegExp",type:"RegExp",source:n.source,flags:n.flags},t)}function Xm(e){return U(e)?e.allOf:y(e)?e.anyOf:pe(e)?e.items??[]:[]}function Ii(e){return Xm(e)}function hi(e,t){return Oe(e)?u(e.returns,t):x(t)}var Dr=class{constructor(t){this.schema=t}Decode(t){return new jr(this.schema,t)}},jr=class{constructor(t,n){this.schema=t,this.decode=n}EncodeTransform(t,n){let i={Encode:s=>n[V].Encode(t(s)),Decode:s=>this.decode(n[V].Decode(s))};return{...n,[V]:i}}EncodeSchema(t,n){let r={Decode:this.decode,Encode:t};return{...n,[V]:r}}Encode(t){return We(this.schema)?this.EncodeTransform(t,this.schema):this.EncodeSchema(t,this.schema)}};function yi(e){return new Dr(e)}function xi(e={}){return u({[m]:e[m]??"Unsafe"},e)}function Si(e){return u({[m]:"Void",type:"void"},e)}var Gr={};ir(Gr,{Any:()=>Ye,Argument:()=>ns,Array:()=>Tt,AsyncIterator:()=>bt,Awaited:()=>Ct,BigInt:()=>Rt,Boolean:()=>hn,Capitalize:()=>Js,Composite:()=>bs,Const:()=>ws,Constructor:()=>wt,ConstructorParameters:()=>As,Date:()=>Tn,Enum:()=>Ps,Exclude:()=>kt,Extends:()=>Ft,Extract:()=>$t,Function:()=>ve,Index:()=>Je,InstanceType:()=>Vs,Instantiate:()=>Bs,Integer:()=>Ws,Intersect:()=>te,Iterator:()=>Ot,KeyOf:()=>Mt,Literal:()=>T,Lowercase:()=>Xs,Mapped:()=>Is,Module:()=>mi,Never:()=>x,Not:()=>pi,Null:()=>bn,Number:()=>he,Object:()=>R,Omit:()=>Ze,Optional:()=>ee,Parameters:()=>li,Partial:()=>vt,Pick:()=>et,Promise:()=>Sn,Readonly:()=>ie,ReadonlyOptional:()=>Mn,Record:()=>En,Recursive:()=>fi,Ref:()=>Ue,RegExp:()=>gi,Required:()=>Nt,Rest:()=>Ii,ReturnType:()=>hi,String:()=>Ee,Symbol:()=>wn,TemplateLiteral:()=>yn,Transform:()=>yi,Tuple:()=>ye,Uint8Array:()=>Pn,Uncapitalize:()=>Qs,Undefined:()=>An,Union:()=>w,Unknown:()=>Xe,Unsafe:()=>xi,Uppercase:()=>Zs,Void:()=>Si});var l=Gr;var g=null;function Vr(e){g=e}import{readFileSync as Qm}from"fs";import{homedir as Zm}from"os";import{join as ep}from"path";var on,Ti="claude-code",$n={"claude-code":{defaultModel:"sonnet",allowedModels:["sonnet","opus"]},codex:{defaultModel:"gpt-5.4",allowedModels:["gpt-5.4"],reasoningEffort:"medium",approvalPolicy:"on-request"}};function bi(){if(on!==void 0)return on;try{let e=Qm(ep(Zm(),".claude.json"),"utf-8");on=JSON.parse(e).mcpServers??{}}catch{on={}}return on}var F={maxSessions:20,idleTimeoutMinutes:15,sessionGcAgeMinutes:1440,maxPersistedSessions:1e4,maxAutoResponds:10,permissionMode:"plan",planApproval:"delegate",codexApprovalPolicy:"on-request",harnesses:{"claude-code":{...$n["claude-code"]},codex:{...$n.codex}}};function wi(e){let t=e.defaultHarness??Ti,n={};for(let[r,o]of Object.entries($n))n[r]={...o,allowedModels:o.allowedModels?[...o.allowedModels]:void 0};for(let[r,o]of Object.entries(e.harnesses??{})){let s={...n[r]??{},...o};o.allowedModels!==void 0?s.allowedModels=o.allowedModels?[...o.allowedModels]:o.allowedModels:o.defaultModel!==void 0&&(s.allowedModels=void 0),n[r]=s}if(e.defaultModel!==void 0){let r=n[t]??{};n[t]={...r,defaultModel:e.harnesses?.[t]?.defaultModel??e.defaultModel,allowedModels:e.harnesses?.[t]?.allowedModels!==void 0?r.allowedModels:e.allowedModels},console.warn(`[openclaw-code-agent] config.defaultModel is deprecated; use harnesses.${t}.defaultModel instead.`)}if(e.model!==void 0){let r=n.codex??{};n.codex={...r,defaultModel:e.harnesses?.codex?.defaultModel??e.model,allowedModels:e.harnesses?.codex?.allowedModels!==void 0?r.allowedModels:e.allowedModels},console.warn("[openclaw-code-agent] config.model is deprecated; use harnesses.codex.defaultModel instead.")}if(e.reasoningEffort!==void 0){let r=n.codex??{};n.codex={...r,reasoningEffort:e.harnesses?.codex?.reasoningEffort??e.reasoningEffort},console.warn("[openclaw-code-agent] config.reasoningEffort is deprecated; use harnesses.codex.reasoningEffort instead.")}if(e.codexApprovalPolicy!==void 0){let r=n.codex??{};n.codex={...r,approvalPolicy:e.harnesses?.codex?.approvalPolicy??e.codexApprovalPolicy},console.warn("[openclaw-code-agent] config.codexApprovalPolicy is deprecated; use harnesses.codex.approvalPolicy instead.")}if(e.allowedModels!==void 0){console.warn("[openclaw-code-agent] config.allowedModels is deprecated; use harnesses.<name>.allowedModels instead.");for(let[r,o]of Object.entries(n))e.harnesses?.[r]?.allowedModels===void 0&&(n[r]={...o,allowedModels:void 0})}F={maxSessions:e.maxSessions??20,defaultWorkdir:e.defaultWorkdir,idleTimeoutMinutes:e.idleTimeoutMinutes??15,sessionGcAgeMinutes:e.sessionGcAgeMinutes??1440,maxPersistedSessions:e.maxPersistedSessions??1e4,fallbackChannel:e.fallbackChannel,agentChannels:e.agentChannels,maxAutoResponds:e.maxAutoResponds??10,permissionMode:e.permissionMode??"plan",codexApprovalPolicy:e.codexApprovalPolicy??"on-request",planApproval:e.planApproval??"delegate",defaultHarness:t,harnesses:n,allowedModels:e.allowedModels}}function tt(){return F.defaultHarness??Ti}function Hr(e){let t=$n[e],n=F.harnesses[e];return{...t,...n,allowedModels:n?.allowedModels??t?.allowedModels}}function nt(e){return Hr(e).defaultModel}function Ai(e){return F.harnesses[e]?.allowedModels??F.allowedModels}function Ut(e){return Hr(e).reasoningEffort}function gt(e){return Hr(e).approvalPolicy}function Pi(e){if(e.messageChannel){let t=e.messageChannel.split("|");if(t.length>=3)return e.messageChannel;if(e.agentAccountId&&t.length>=2)return`${t[0]}|${e.agentAccountId}|${t.slice(1).join("|")}`;if(t.length===1&&e.chatId)return`${t[0]}|${e.chatId}`;if(t.length===1&&e.senderId)return`${t[0]}|${e.senderId}`}if(e.workspaceDir){let t=sn(e.workspaceDir);if(t)return t}if(e.messageChannel&&e.messageChannel.includes("|"))return e.messageChannel}function _t(e,t){if(t&&String(t).includes("|"))return String(t);if(e?.channelId&&String(e.channelId).includes("|"))return String(e.channelId);if(e?.messageChannel){let n=String(e.messageChannel);if(n.includes("|"))return n;if(e.chatId)return`${n}|${e.chatId}`;if(e.senderId)return`${n}|${e.senderId}`}return e?.channel&&e?.chatId?`${e.channel}|${e.chatId}`:e?.channel&&e?.senderId?`${e.channel}|${e.senderId}`:e?.id&&/^-?\d+$/.test(String(e.id))?`telegram|${e.id}`:F.fallbackChannel??"unknown"}function Lt(e){return e?.messageThreadId??void 0}function sn(e){let t=F.agentChannels;if(!t)return;let n=i=>i.replace(/\/+$/,""),r=n(e),o=Object.entries(t).sort((i,s)=>s[0].length-i[0].length);for(let[i,s]of o)if(r===n(i)||r.startsWith(n(i)+"/"))return s}function Ri(e){if(!e)return;let t=e.match(/:topic:(\d+)$/);return t?parseInt(t[1],10):void 0}function Kt(e){let{requestedResumeSessionId:t,activeSession:n,persistedSession:r}=e;return t?n?{resumeSessionId:t,clearedPersistedCodexResume:!1}:r?.harness==="codex"?{resumeSessionId:void 0,clearedPersistedCodexResume:!0}:{resumeSessionId:t,clearedPersistedCodexResume:!1}:{resumeSessionId:void 0,clearedPersistedCodexResume:!1}}function np(e){return e instanceof Error?e.message:String(e)}function rp(e){return!e||typeof e!="object"?!1:typeof e.prompt=="string"}function op(e,t){if(!t||t.length===0)return!0;if(!e)return!1;let n=e.toLowerCase();return t.some(r=>n.includes(r.toLowerCase()))}function Oi(e){return{name:"agent_launch",description:"Launch a coding agent session in background to execute a development task. Sessions are multi-turn by default \u2014 they stay open for follow-up messages via agent_respond. Set multi_turn_disabled: true for fire-and-forget sessions. Supports resuming previous sessions. Returns a session ID and name for tracking.",parameters:l.Object({prompt:l.String({description:"The task prompt to execute"}),name:l.Optional(l.String({description:"Short human-readable name for the session (kebab-case, e.g. 'fix-auth'). Auto-generated from prompt if omitted."})),workdir:l.Optional(l.String({description:"Working directory (defaults to cwd)"})),model:l.Optional(l.String({description:"Model name to use"})),system_prompt:l.Optional(l.String({description:"Additional system prompt"})),allowed_tools:l.Optional(l.Array(l.String(),{description:"List of allowed tools"})),resume_session_id:l.Optional(l.String({description:"Session ID to resume (from a previous session's harnessSessionId). Continues the conversation from where it left off."})),fork_session:l.Optional(l.Boolean({description:"When resuming, fork to a new session instead of continuing the existing one. Use with resume_session_id."})),multi_turn_disabled:l.Optional(l.Boolean({description:"Disable multi-turn mode. By default sessions stay open for follow-up messages. Set to true for fire-and-forget sessions."})),permission_mode:l.Optional(l.Union([l.Literal("default"),l.Literal("plan"),l.Literal("acceptEdits"),l.Literal("bypassPermissions")],{description:"Permission mode for the session. This is the plugin's orchestration mode, not the Codex SDK approval policy. Defaults to plugin config (plan by default)."})),harness:l.Optional(l.String({description:"Agent harness to use (e.g. 'claude-code'). Defaults to 'claude-code'."}))}),async execute(t,n){if(!g)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!rp(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { prompt }."}]};n.agentId&&console.warn(`[agent_launch] \u26A0\uFE0F agentId="${n.agentId}" was passed as a parameter \u2014 this is WRONG. agentId is only for sessions_spawn (OpenClaw sub-agents), not agent_launch (CC sessions). The field is being ignored. ctx.agentId="${e.agentId}" will be used for origin routing instead.`);let r=n.workdir||e.workspaceDir||F.defaultWorkdir||process.cwd();if(!tp(r))return{content:[{type:"text",text:`Error: Working directory does not exist: ${r}`}]};try{let o=n.harness??tt(),i=nt(o),s=n.model??i,c=n.model!==void 0;if(!s)return{content:[{type:"text",text:`Error: No default model configured for harness "${o}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${o}.defaultModel or pass model explicitly.`}]};let p=Ai(o);if(p&&p.length>0&&!op(s,p))return{content:[{type:"text",text:c?`Error: Model "${s}" is not allowed. Permitted models: ${p.join(", ")}`:`Error: Default model "${s||"undefined"}" is not in allowedModels (${p.join(", ")}). Update your plugin config to set a compatible defaultModel.`}]};let f=n.resume_session_id,b=f?g.resolve(f):void 0,k=f?g.getPersistedSession(f):void 0;if(f){let yt=g.resolveHarnessSessionId(f);if(!yt)return{content:[{type:"text",text:`Error: Could not resolve resume_session_id "${f}" to a session ID. Use agent_sessions to list available sessions.`}]};f=yt}let{resumeSessionId:X,clearedPersistedCodexResume:ge}=Kt({requestedResumeSessionId:f,activeSession:b?{harnessSessionId:b.harnessSessionId}:void 0,persistedSession:k?{harness:k.harness}:void 0}),Y=Pi(e),W=_t(e,Y||sn(r)),Q=e.sessionKey||void 0;!Q&&e.agentId&&console.warn(`[agent_launch] ctx.sessionKey is not populated. ctx fields: agentId=${e.agentId}, messageChannel=${e.messageChannel}, agentAccountId=${e.agentAccountId}, workspaceDir=${e.workspaceDir}`);let N=g.spawn({prompt:n.prompt,name:n.name,workdir:r,model:s,reasoningEffort:Ut(o),systemPrompt:n.system_prompt,allowedTools:n.allowed_tools,resumeSessionId:X,forkSession:X?n.fork_session:!1,multiTurn:!n.multi_turn_disabled,permissionMode:n.permission_mode,codexApprovalPolicy:o==="codex"?gt(o)??F.codexApprovalPolicy:void 0,originChannel:W,originThreadId:Ri(Q)??Lt(e),originAgentId:e.agentId||void 0,originSessionKey:Q,harness:o}),He=n.prompt.length>80?n.prompt.slice(0,80)+"...":n.prompt,be=["Session launched successfully.",` Name: ${N.name}`,` ID: ${N.id}`,` Dir: ${r}`,` Model: ${N.model??"default"}`,` Prompt: "${He}"`];return o==="codex"&&be.push(` Codex approval policy: ${N.codexApprovalPolicy??gt(o)??F.codexApprovalPolicy}`),n.resume_session_id&&(be.push(` Resume: ${n.resume_session_id}${n.fork_session?" (forked)":""}`),ge&&be.push(" Thread state: historical Codex state cleared; starting a fresh thread.")),be.push(n.multi_turn_disabled?" Mode: single-turn (fire-and-forget)":" Mode: multi-turn (use agent_respond to send follow-up messages)"),be.push("","Use agent_sessions to check status, agent_output to see output."),{content:[{type:"text",text:be.join(`
2
+ `)}]}}catch(o){let i=np(o),s=i.includes("Max sessions")?"":`
3
3
 
4
- Use agent_sessions to see active sessions and their status.`;return{content:[{type:"text",text:`Error launching session: ${s}${i}`}]}}}}}import{existsSync as Yc,readFileSync as Jc}from"fs";function _e(e){let t=Math.floor(e/1e3),r=Math.floor(t/60),n=t%60;return r>0?`${r}m${n}s`:`${n}s`}var qc=new Set(["a","an","the","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","need","must","i","me","my","we","our","you","your","it","its","he","she","to","of","in","for","on","with","at","by","from","as","into","through","about","that","this","these","those","and","or","but","if","then","so","not","no","please","just","also","very","all","some","any","each","make","write","create","build","implement","add","update"]);function yi(e){let r=e.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter(n=>n.length>1&&!qc.has(n)).slice(0,3);return r.length===0?"session":r.join("-")}var zc={starting:"\u{1F7E1}",running:"\u{1F7E2}",completed:"\u2705",failed:"\u274C",killed:"\u26D4"};function xi(e){let t=zc[e.status]??"\u2753",r=_e(e.duration),n=e.multiTurn?"multi-turn":"single",o=e.prompt.length>80?e.prompt.slice(0,80)+"...":e.prompt,s=e.costUsd>0?` | $${e.costUsd.toFixed(2)}`:"",i=[`${t} ${e.name} [${e.id}] (${r}${s}) \u2014 ${n}`,` \u{1F4C1} ${e.workdir}`,` \u{1F4DD} "${o}"`];return e.phase!==e.status&&i.push(` \u2699\uFE0F Phase: ${e.phase}`),e.harness&&i.push(` \u{1F9F0} Harness: ${e.harness}`),e.harnessSessionId&&i.push(` \u{1F517} Session ID: ${e.harnessSessionId}`),e.resumeSessionId&&i.push(` \u21A9\uFE0F Resumed from: ${e.resumeSessionId}${e.forkSession?" (forked)":""}`),i.join(`
5
- `)}function Or(e,t){let r=e.sessionsWithDuration>0?e.totalDurationMs/e.sessionsWithDuration:0,{completed:n,failed:o,killed:s}=e.sessionsByStatus,i=["\u{1F4CA} OpenClaw Code Agent Stats","","\u{1F4CB} Sessions",` Launched: ${e.totalLaunched}`,` Running: ${t}`,` Completed: ${n}`,` Failed: ${o}`,` Killed: ${s}`,"",`\u23F1\uFE0F Average duration: ${r>0?_e(r):"n/a"}`];if(e.mostExpensive){let m=e.mostExpensive;i.push("","\u{1F3C6} Notable session",` ${m.name} [${m.id}]`,` \u{1F4DD} "${m.prompt}"`)}return i.join(`
6
- `)}function Ze(e,t){return t<=0?"":e.length<=t?e:t<=3?".".repeat(t):e.slice(0,t-3)+"..."}function Si(e,t){let r=e.split(`
7
- `),n=[],o=0;for(let s=r.length-1;s>=0;s--){let i=r[s].length+(n.length>0?1:0);if(o+i>t&&n.length>0)break;n.unshift(r[s]),o+=i}return n.join(`
8
- `)}var Xc=50,Qc=1,Zc=new Set(["starting","running","completed","failed","killed"]),ep=5,tp=1440*60*1e3;function rp(e){let t=Number(e);return!Number.isFinite(t)||t<Qc?Xc:Math.floor(t)}function np(e){return typeof e=="string"&&Zc.has(e)}function op(e){let t=_e(e.duration),r=` | Cost: $${e.costUsd.toFixed(4)}`,n=e.status==="running"?` | Phase: ${e.phase}`:"";return[`Session: ${e.name} [${e.id}] | Status: ${e.status.toUpperCase()}${n}${r} | Duration: ${t}`,`${"\u2500".repeat(60)}`].join(`
9
- `)}function sp(e){return[`Session: ${e.name||e.harnessSessionId} | Status: ${e.status.toUpperCase()} | Cost: $${e.costUsd.toFixed(4)}`,`(retrieved from ${e.outputPath} \u2014 evicted from runtime cache \u2014 showing persisted output)`,`${"\u2500".repeat(60)}`].join(`
10
- `)}function ip(e){let t=[];return e.error&&t.push(`Error: ${e.error}`),e.result?.result&&t.push(`Result: ${e.result.result}`),e.result&&t.push(`Result status: ${e.result.subtype}`),t.length>0?`
4
+ Use agent_sessions to see active sessions and their status.`;return{content:[{type:"text",text:`Error launching session: ${i}${s}`}]}}}}}import{existsSync as ap,readFileSync as up}from"fs";function _e(e){let t=Math.floor(e/1e3),n=Math.floor(t/60),r=t%60;return n>0?`${n}m${r}s`:`${r}s`}var sp=new Set(["a","an","the","is","are","was","were","be","been","being","have","has","had","do","does","did","will","would","could","should","may","might","shall","can","need","must","i","me","my","we","our","you","your","it","its","he","she","to","of","in","for","on","with","at","by","from","as","into","through","about","that","this","these","those","and","or","but","if","then","so","not","no","please","just","also","very","all","some","any","each","make","write","create","build","implement","add","update"]);function Ci(e){let n=e.toLowerCase().replace(/[^a-z0-9\s-]/g," ").split(/\s+/).filter(r=>r.length>1&&!sp.has(r)).slice(0,3);return n.length===0?"session":n.join("-")}var ip={starting:"\u{1F7E1}",running:"\u{1F7E2}",completed:"\u2705",failed:"\u274C",killed:"\u26D4"};function Mi(e){let t=ip[e.status]??"\u2753",n=_e(e.duration),r=e.multiTurn?"multi-turn":"single",o=e.prompt.length>80?e.prompt.slice(0,80)+"...":e.prompt,i=e.costUsd>0?` | $${e.costUsd.toFixed(2)}`:"",s=[`${t} ${e.name} [${e.id}] (${n}${i}) \u2014 ${r}`,` \u{1F4C1} ${e.workdir}`,` \u{1F4DD} "${o}"`];return e.phase!==e.status&&s.push(` \u2699\uFE0F Phase: ${e.phase}`),e.harness&&s.push(` \u{1F9F0} Harness: ${e.harness}`),e.harnessSessionId&&s.push(` \u{1F517} Session ID: ${e.harnessSessionId}`),e.resumeSessionId&&s.push(` \u21A9\uFE0F Resumed from: ${e.resumeSessionId}${e.forkSession?" (forked)":""}`),s.join(`
5
+ `)}function vn(e,t){let n=e.sessionsWithDuration>0?e.totalDurationMs/e.sessionsWithDuration:0,{completed:r,failed:o,killed:i}=e.sessionsByStatus,s=["\u{1F4CA} OpenClaw Code Agent Stats","","\u{1F4CB} Sessions",` Launched: ${e.totalLaunched}`,` Running: ${t}`,` Completed: ${r}`,` Failed: ${o}`,` Killed: ${i}`,"",`\u23F1\uFE0F Average duration: ${n>0?_e(n):"n/a"}`];if(e.mostExpensive){let c=e.mostExpensive;s.push("","\u{1F3C6} Notable session",` ${c.name} [${c.id}]`,` \u{1F4DD} "${c.prompt}"`)}return s.join(`
6
+ `)}function rt(e,t){return t<=0?"":e.length<=t?e:t<=3?".".repeat(t):e.slice(0,t-3)+"..."}function Ei(e,t){let n=e.split(`
7
+ `),r=[],o=0;for(let i=n.length-1;i>=0;i--){let s=n[i].length+(r.length>0?1:0);if(o+s>t&&r.length>0)break;r.unshift(n[i]),o+=s}return r.join(`
8
+ `)}var dp=50,cp=1,mp=new Set(["starting","running","completed","failed","killed"]),pp=5,lp=1440*60*1e3;function fp(e){let t=Number(e);return!Number.isFinite(t)||t<cp?dp:Math.floor(t)}function gp(e){return typeof e=="string"&&mp.has(e)}function Ip(e){let t=_e(e.duration),n=` | Cost: $${e.costUsd.toFixed(4)}`,r=e.status==="running"?` | Phase: ${e.phase}`:"";return[`Session: ${e.name} [${e.id}] | Status: ${e.status.toUpperCase()}${r}${n} | Duration: ${t}`,`${"\u2500".repeat(60)}`].join(`
9
+ `)}function hp(e){return[`Session: ${e.name||e.harnessSessionId} | Status: ${e.status.toUpperCase()} | Cost: $${e.costUsd.toFixed(4)}`,`(retrieved from ${e.outputPath} \u2014 evicted from runtime cache \u2014 showing persisted output)`,`${"\u2500".repeat(60)}`].join(`
10
+ `)}function yp(e){let t=[];return e.error&&t.push(`Error: ${e.error}`),e.result?.result&&t.push(`Result: ${e.result.result}`),e.result&&t.push(`Result status: ${e.result.subtype}`),t.length>0?`
11
11
  (no output yet)
12
12
  ${t.join(`
13
13
  `)}`:`
14
- (no output yet)`}function Rr(e,t,r={}){let n=rp(r.lines),o=e.resolve(t);if(!o){let m=e.getPersistedSession(t);if(m?.outputPath&&Yc(m.outputPath))try{let p=Jc(m.outputPath,"utf-8"),f=p;!r.full&&p&&(f=p.split(`
15
- `).slice(-n).join(`
16
- `));let A=sp(m);return f?`${A}
17
- ${f}`:`${A}
18
- (output file was empty)`}catch(p){let f=p instanceof Error?p.message:String(p);return`Error: Session "${t}" was cleaned up (expired) and output file could not be read: ${f}`}return`Error: Session "${t}" not found.`}let s=r.full?o.getOutput():o.getOutput(n),i=op(o);return s.length===0?`${i}${ip(o)}`:`${i}
19
- ${s.join(`
20
- `)}`}function Cr(e,t="all",r,n={}){let o=e.listPersistedSessions()??[],i=ap(e.list("all"),o);if(t!=="all"&&(i=i.filter(m=>m.status===t)),r&&(i=i.filter(m=>m.originChannel===r)),n.full){let m=Date.now()-tp;i=i.filter(p=>(p.startedAt??0)>=m)}else i=i.slice(0,ep);return i.length===0?"No sessions found.":i.map(m=>xi(m)).join(`
14
+ (no output yet)`}function Nn(e,t,n={}){let r=fp(n.lines),o=e.resolve(t);if(!o){let c=e.getPersistedSession(t);if(c?.outputPath&&ap(c.outputPath))try{let p=up(c.outputPath,"utf-8"),f=p;!n.full&&p&&(f=p.split(`
15
+ `).slice(-r).join(`
16
+ `));let b=hp(c);return f?`${b}
17
+ ${f}`:`${b}
18
+ (output file was empty)`}catch(p){let f=p instanceof Error?p.message:String(p);return`Error: Session "${t}" was cleaned up (expired) and output file could not be read: ${f}`}return`Error: Session "${t}" not found.`}let i=n.full?o.getOutput():o.getOutput(r),s=Ip(o);return i.length===0?`${s}${yp(o)}`:`${s}
19
+ ${i.join(`
20
+ `)}`}function Un(e,t="all",n,r={}){let o=e.listPersistedSessions()??[],s=xp(e.list("all"),o);if(t!=="all"&&(s=s.filter(c=>c.status===t)),n&&(s=s.filter(c=>c.originChannel===n)),r.full){let c=Date.now()-lp;s=s.filter(p=>(p.startedAt??0)>=c)}else s=s.slice(0,pp);return s.length===0?"No sessions found.":s.map(c=>Mi(c)).join(`
21
21
 
22
- `)}function ap(e,t){let r=new Map;for(let n of t){if(!np(n.status))continue;let o=n.completedAt??Date.now(),s=n.createdAt??o,i=n.sessionId??`persisted:${n.harnessSessionId}`;r.set(i,{id:n.sessionId??n.harnessSessionId,name:n.name||n.harnessSessionId,status:n.status,startedAt:n.createdAt??0,completedAt:n.completedAt,duration:Math.max(0,o-s),prompt:n.prompt??"",workdir:n.workdir??"(unknown)",costUsd:n.costUsd??0,multiTurn:!0,phase:n.status,harness:n.harness,harnessSessionId:n.harnessSessionId,originChannel:n.originChannel,originThreadId:n.originThreadId})}for(let n of e)r.set(n.id,{id:n.id,name:n.name,status:n.status,startedAt:n.startedAt,completedAt:n.completedAt,duration:n.duration,prompt:n.prompt,workdir:n.workdir,costUsd:n.costUsd,multiTurn:n.multiTurn,phase:n.phase,harness:n.harnessName,harnessSessionId:n.harnessSessionId,originChannel:n.originChannel,originThreadId:n.originThreadId});return[...r.values()].sort((n,o)=>(o.startedAt??0)-(n.startedAt??0))}function up(e){if(!e||typeof e!="object")return"all";let t=e.status;switch(t){case"running":case"completed":case"failed":case"killed":case"all":return t;default:return"all"}}function Ti(e){return{name:"agent_sessions",description:"List coding agent sessions with their status and progress. By default, shows the 5 most recent sessions; set `full` to show all sessions from the last 24 hours.",parameters:l.Object({status:l.Optional(l.Union([l.Literal("all"),l.Literal("running"),l.Literal("completed"),l.Literal("failed"),l.Literal("killed")],{description:'Filter by status (default "all")'})),full:l.Optional(l.Boolean({description:"Show all sessions from the last 24h instead of just the most recent 5"}))}),async execute(t,r){if(!g)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let n=up(r),o=e?.workspaceDir?Qt(e.workspaceDir):void 0,s=!!(r&&typeof r=="object"&&r.full===!0);return{content:[{type:"text",text:Cr(g,n,o,{full:s})}]}}}}function Mr(e,t,r){let n=e.resolve(t);return n?n.status==="completed"||n.status==="failed"||n.status==="killed"?`Session ${n.name} [${n.id}] is already ${n.status}. No action needed.`:r==="completed"?(n.complete(),`Session ${n.name} [${n.id}] marked as completed.`):(e.kill(n.id),`Session ${n.name} [${n.id}] has been terminated.`):`Error: Session "${t}" not found.`}function dp(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.session!="string"?!1:t.reason===void 0?!0:t.reason==="completed"||t.reason==="killed"}function bi(e){return{name:"agent_kill",description:"Terminate or complete a running coding agent session by name or ID. Use reason='completed' to mark a session as successfully completed instead of killed.",parameters:l.Object({session:l.String({description:"Session name or ID to terminate"}),reason:l.Optional(l.Union([l.Literal("completed"),l.Literal("killed")],{description:"Reason for closing the session. 'completed' marks it as successfully done (sends \u2705 notification). 'killed' (default) terminates it."}))}),async execute(t,r){return g?dp(r)?{content:[{type:"text",text:Mr(g,r.session,r.reason)}]}:{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, reason? }."}]}:{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]}}}}function mp(e){return!e||typeof e!="object"?!1:typeof e.session=="string"}function Ai(e){return{name:"agent_output",description:"Show recent output from a coding agent session (by name or ID).",parameters:l.Object({session:l.String({description:"Session name or ID to get output from"}),lines:l.Optional(l.Number({description:"Number of recent lines to show (default 50)"})),full:l.Optional(l.Boolean({description:"Show all available output"}))}),async execute(t,r){return g?mp(r)?{content:[{type:"text",text:Rr(g,r.session,{full:r.full,lines:r.lines})}]}:{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, lines?, full? }."}]}:{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]}}}}var cp=new Set(["killed","completed","failed"]),pp=new Set(["startup-timeout"]),lp=10,fp=100,gp=/\b(change|swap|replace|remove|add|update|instead|don't|revise|modify)\b/i;function Zt(e){return e instanceof Error?e.message:String(e)}function Ip(e,t){switch(e){case"completed":return"completed";case"failed":return"failed";default:return t==="user"?"user-killed":t==="shutdown"?"shutdown-killed":"idle-kill"}}function wi(e){return"id"in e?e.id:e.sessionId??e.harnessSessionId}function hp(e){return e.status==="killed"&&e.completedAt==null}function yp(e,t){return cp.has(e.status)&&!!e.harnessSessionId&&(e.status==="failed"||e.status==="completed"&&e.killReason==="done"||e.status==="killed"&&(!pp.has(e.killReason??"")||t&&hp(e)))}function xp(e,t){if(!(t.trim().length<fp&&!gp.test(t)))return{text:["Cannot approve and revise in the same call.","Your message appears to contain revision feedback. Send it first WITHOUT approve=true:",` agent_respond(session='${e}', message='<your feedback>')`,"The agent will revise the plan. Then approve the revised plan."].join(`
23
- `),isError:!0}}async function Sp(e,t,r,n={}){if(yp(t,n.allowRecoveredRunningStub===!0))try{let o="harnessName"in t?t:void 0,s="harnessName"in t?void 0:t,{resumeSessionId:i}=Ft({requestedResumeSessionId:t.harnessSessionId,activeSession:o?{harnessSessionId:o.harnessSessionId}:void 0,persistedSession:s?{harness:s.harness}:void 0}),m={prompt:r,workdir:t.workdir,name:t.name,model:t.model,reasoningEffort:t.reasoningEffort,resumeSessionId:i,multiTurn:!0,originChannel:t.originChannel,originThreadId:t.originThreadId,originAgentId:t.originAgentId,originSessionKey:t.originSessionKey,permissionMode:t.currentPermissionMode,codexApprovalPolicy:t.codexApprovalPolicy,harness:"harnessName"in t?t.harnessName:t.harness},p=e.spawn(m),f=Ip(t.status,t.killReason);return e.notifySession(p,`\u{1F504} [${p.name}] Auto-resumed from ${f}`),{text:`Auto-resumed ${f} session ${p.name} [${p.id}]. Use agent_output to see the response.`}}catch(o){return{text:`Error auto-resuming session ${t.name} [${wi(t)}]: ${Zt(o)}`,isError:!0}}}function Tp(e,t,r){let n=t.lobsterResumeToken;if(!n)return;t.lobsterResumeToken=void 0;let o=t.pendingPlanApproval||t.currentPermissionMode==="acceptEdits"||t.currentPermissionMode==="default";if(r.approve&&o)return e.resumeLobsterApproval(n,!0).catch(s=>{console.error(`[Respond] Lobster resume failed, falling back to direct mode switch: ${Zt(s)}`),t.switchPermissionMode("bypassPermissions"),t.sendMessage(r.message).catch(i=>{console.error(`[Respond] Fallback sendMessage also failed: ${Zt(i)}`)})}),{text:`Plan approved. Lobster workflow resuming for session ${t.name} [${t.id}].`};e.resumeLobsterApproval(n,!1).catch(s=>{console.error(`[Respond] Lobster cancel failed (non-critical): ${Zt(s)}`)})}async function kr(e,t){let r=e.resolve(t.session),n=r?void 0:e.getPersistedSession(t.session);if(!r&&!n)return{text:`Error: Session "${t.session}" not found.`,isError:!0};let s=await Sp(e,r??n,t.message,{allowRecoveredRunningStub:!r});if(s)return s;if(!r)return{text:`Error: Session ${n.name} [${wi(n)}] is not running (status: ${n.status}). Cannot send a message to a non-running session.`,isError:!0};if(r.status!=="running")return{text:`Error: Session ${r.name} [${r.id}] is not running (status: ${r.status}). Cannot send a message to a non-running session.`,isError:!0};let i=h.maxAutoResponds??lp;if(t.userInitiated)r.resetAutoRespond();else if(r.autoRespondCount>=i)return{text:`\u26A0\uFE0F Auto-respond limit reached (${r.autoRespondCount}/${i}). Ask the user to provide the answer for session ${r.name}. Then call agent_respond with their answer and set userInitiated: true to reset the counter.`};let m=Tp(e,r,t);if(m)return m;try{t.interrupt&&await r.interrupt();let p="";if(t.approve&&r.pendingPlanApproval){let A=xp(r.name,t.message);if(A)return A;r.switchPermissionMode("bypassPermissions")}else t.approve&&(r.currentPermissionMode==="acceptEdits"||r.currentPermissionMode==="default")?r.switchPermissionMode("bypassPermissions"):t.approve&&r.currentPermissionMode==="bypassPermissions"?p=`
24
- \u2139\uFE0F approve=true was set but session is already in bypassPermissions mode.`:t.approve?p=`
25
- \u26A0\uFE0F approve=true was set but session has no pending plan approval.`:r.pendingPlanApproval&&(p=`
26
- \u2139\uFE0F Session has a pending plan \u2014 sending as revision feedback. The agent will revise and re-submit. Set approve=true to approve instead.`);await r.sendMessage(t.message),t.userInitiated||r.incrementAutoRespond();let f=Ze(t.message,80);return{text:[`Message sent to session ${r.name} [${r.id}].`,t.interrupt?" (interrupted current turn first)":"",` Message: "${f}"`,p,"Use agent_output to see the response."].filter(Boolean).join(`
27
- `)}}catch(p){return{text:`Error sending message to session ${r.name} [${r.id}]: ${Zt(p)}`,isError:!0}}}function bp(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.session=="string"&&typeof t.message=="string"}function Pi(e){return{name:"agent_respond",description:"Send a follow-up message to a running coding agent session. The session must be running. Sessions are multi-turn by default, so this works with any session unless it was launched with multi_turn_disabled: true.",parameters:l.Object({session:l.String({description:"Session name or ID to respond to"}),message:l.String({description:"The message to send to the session"}),interrupt:l.Optional(l.Boolean({description:"If true, interrupt the current turn before sending the message. Useful to redirect the session mid-response."})),userInitiated:l.Optional(l.Boolean({description:"Set to true when the message comes from the user (not auto-generated). Resets the auto-respond counter and bypasses the auto-respond limit."})),approve:l.Optional(l.Boolean({description:"Set to true to escalate session permissions to bypassPermissions. Works in two scenarios: (1) approve a pending plan in plan mode (after ExitPlanMode / set_permission_mode), or (2) escalate an acceptEdits or default mode session to skip all remaining permission prompts. No-op if already in bypassPermissions mode. In plan mode without a pending plan, this flag is ignored."}))}),async execute(t,r){if(!g)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!bp(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, message, interrupt?, userInitiated?, approve? }."}]};let n=await kr(g,r);return{isError:n.isError??!1,content:[{type:"text",text:n.text}]}}}}function Oi(e){return{name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics: session counts by status, average duration, and notable sessions.",parameters:l.Object({}),async execute(t,r){if(!g)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let n=g.getMetrics(),o=g.list("running").length;return{content:[{type:"text",text:Or(n,o)}]}}}}function Ap(e){return e instanceof Error?e.message:String(e)}function Ri(e){e.registerCommand({name:"agent",description:"Launch a coding agent session. Usage: /agent [--name <name>] <prompt>",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(t.args??"").trim();if(!r)return{text:"Usage: /agent [--name <name>] <prompt>"};let n,o=r.match(/^--name\s+(\S+)\s+/);o&&(n=o[1],r=r.slice(o[0].length).trim());let s=r;if(!s)return{text:"Usage: /agent [--name <name>] <prompt>"};try{let i=h.defaultHarness,m=i==="codex"?h.model??h.defaultModel:h.defaultModel,p=g.spawn({prompt:s,name:n,workdir:h.defaultWorkdir||process.cwd(),model:m,reasoningEffort:h.reasoningEffort,codexApprovalPolicy:h.codexApprovalPolicy,originChannel:kt(t),originThreadId:Et(t),harness:i}),f=s.length>80?s.slice(0,80)+"...":s;return{text:["Session launched.",` Name: ${p.name}`,` ID: ${p.id}`,` Prompt: "${f}"`,` Status: ${p.status}`].join(`
28
- `)}}catch(i){let m=Ap(i),p=m.includes("Max sessions")?"":`
22
+ `)}function xp(e,t){let n=new Map;for(let r of t){if(!gp(r.status))continue;let o=r.completedAt??Date.now(),i=r.createdAt??o,s=r.sessionId??`persisted:${r.harnessSessionId}`;n.set(s,{id:r.sessionId??r.harnessSessionId,name:r.name||r.harnessSessionId,status:r.status,startedAt:r.createdAt??0,completedAt:r.completedAt,duration:Math.max(0,o-i),prompt:r.prompt??"",workdir:r.workdir??"(unknown)",costUsd:r.costUsd??0,multiTurn:!0,phase:r.status,harness:r.harness,harnessSessionId:r.harnessSessionId,originChannel:r.originChannel,originThreadId:r.originThreadId})}for(let r of e)n.set(r.id,{id:r.id,name:r.name,status:r.status,startedAt:r.startedAt,completedAt:r.completedAt,duration:r.duration,prompt:r.prompt,workdir:r.workdir,costUsd:r.costUsd,multiTurn:r.multiTurn,phase:r.phase,harness:r.harnessName,harnessSessionId:r.harnessSessionId,originChannel:r.originChannel,originThreadId:r.originThreadId});return[...n.values()].sort((r,o)=>(o.startedAt??0)-(r.startedAt??0))}function Sp(e){if(!e||typeof e!="object")return"all";let t=e.status;switch(t){case"running":case"completed":case"failed":case"killed":case"all":return t;default:return"all"}}function Fi(e){return{name:"agent_sessions",description:"List coding agent sessions with their status and progress. By default, shows the 5 most recent sessions; set `full` to show all sessions from the last 24 hours.",parameters:l.Object({status:l.Optional(l.Union([l.Literal("all"),l.Literal("running"),l.Literal("completed"),l.Literal("failed"),l.Literal("killed")],{description:'Filter by status (default "all")'})),full:l.Optional(l.Boolean({description:"Show all sessions from the last 24h instead of just the most recent 5"}))}),async execute(t,n){if(!g)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let r=Sp(n),o=e?.workspaceDir?sn(e.workspaceDir):void 0,i=!!(n&&typeof n=="object"&&n.full===!0);return{content:[{type:"text",text:Un(g,r,o,{full:i})}]}}}}function _n(e,t,n){let r=e.resolve(t);return r?r.status==="completed"||r.status==="failed"||r.status==="killed"?`Session ${r.name} [${r.id}] is already ${r.status}. No action needed.`:n==="completed"?(r.complete(),`Session ${r.name} [${r.id}] marked as completed.`):(e.kill(r.id),`Session ${r.name} [${r.id}] has been terminated.`):`Error: Session "${t}" not found.`}function Tp(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.session!="string"?!1:t.reason===void 0?!0:t.reason==="completed"||t.reason==="killed"}function ki(e){return{name:"agent_kill",description:"Terminate or complete a running coding agent session by name or ID. Use reason='completed' to mark a session as successfully completed instead of killed.",parameters:l.Object({session:l.String({description:"Session name or ID to terminate"}),reason:l.Optional(l.Union([l.Literal("completed"),l.Literal("killed")],{description:"Reason for closing the session. 'completed' marks it as successfully done (sends \u2705 notification). 'killed' (default) terminates it."}))}),async execute(t,n){return g?Tp(n)?{content:[{type:"text",text:_n(g,n.session,n.reason)}]}:{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, reason? }."}]}:{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]}}}}function bp(e){return!e||typeof e!="object"?!1:typeof e.session=="string"}function $i(e){return{name:"agent_output",description:"Show recent output from a coding agent session (by name or ID).",parameters:l.Object({session:l.String({description:"Session name or ID to get output from"}),lines:l.Optional(l.Number({description:"Number of recent lines to show (default 50)"})),full:l.Optional(l.Boolean({description:"Show all available output"}))}),async execute(t,n){return g?bp(n)?{content:[{type:"text",text:Nn(g,n.session,{full:n.full,lines:n.lines})}]}:{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, lines?, full? }."}]}:{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]}}}}var wp=new Set(["killed","completed","failed"]),Ap=new Set(["startup-timeout"]),Pp=10,Rp=100,Op=/\b(change|swap|replace|remove|add|update|instead|don't|revise|modify)\b/i;function an(e){return e instanceof Error?e.message:String(e)}function vi(e){return"id"in e?e.id:e.sessionId??e.harnessSessionId}function Cp(e){return e.status==="killed"&&e.completedAt==null}function Mp(e,t){return wp.has(e.status)&&!!e.harnessSessionId&&(e.status==="failed"||e.status==="completed"&&e.killReason==="done"||e.status==="killed"&&(!Ap.has(e.killReason??"")||t&&Cp(e)))}function Ep(e,t){if(!(t.trim().length<Rp&&!Op.test(t)))return{text:["Cannot approve and revise in the same call.","Your message appears to contain revision feedback. Send it first WITHOUT approve=true:",` agent_respond(session='${e}', message='<your feedback>')`,"The agent will revise the plan. Then approve the revised plan."].join(`
23
+ `),isError:!0}}async function Fp(e,t,n,r={}){if(Mp(t,r.allowRecoveredRunningStub===!0))try{let o="harnessName"in t?t:void 0,i="harnessName"in t?void 0:t,{resumeSessionId:s}=Kt({requestedResumeSessionId:t.harnessSessionId,activeSession:o?{harnessSessionId:o.harnessSessionId}:void 0,persistedSession:i?{harness:i.harness}:void 0}),c={prompt:n,workdir:t.workdir,name:t.name,model:t.model,reasoningEffort:t.reasoningEffort,resumeSessionId:s,multiTurn:!0,originChannel:t.originChannel,originThreadId:t.originThreadId,originAgentId:t.originAgentId,originSessionKey:t.originSessionKey,permissionMode:t.currentPermissionMode,codexApprovalPolicy:t.codexApprovalPolicy,harness:"harnessName"in t?t.harnessName:t.harness},p=await e.spawnAndAwaitRunning(c,{notifyLaunch:!1});return e.notifySession(p,`\u25B6\uFE0F [${p.name}] Auto-resumed`),{text:`Auto-resumed session ${p.name} [${p.id}]. Use agent_output to see the response.`}}catch(o){return{text:`Error auto-resuming session ${t.name} [${vi(t)}]: ${an(o)}`,isError:!0}}}function kp(e,t,n){let r=t.lobsterResumeToken;if(!r)return;t.lobsterResumeToken=void 0;let o=t.pendingPlanApproval||t.currentPermissionMode==="acceptEdits"||t.currentPermissionMode==="default";if(n.approve&&o)return e.resumeLobsterApproval(r,!0).catch(i=>{console.error(`[Respond] Lobster resume failed, falling back to direct mode switch: ${an(i)}`),t.switchPermissionMode("bypassPermissions"),t.sendMessage(n.message).catch(s=>{console.error(`[Respond] Fallback sendMessage also failed: ${an(s)}`)})}),{text:`Plan approved. Lobster workflow resuming for session ${t.name} [${t.id}].`};e.resumeLobsterApproval(r,!1).catch(i=>{console.error(`[Respond] Lobster cancel failed (non-critical): ${an(i)}`)})}async function Ln(e,t){let n=e.resolve(t.session),r=n?void 0:e.getPersistedSession(t.session);if(!n&&!r)return{text:`Error: Session "${t.session}" not found.`,isError:!0};let i=await Fp(e,n??r,t.message,{allowRecoveredRunningStub:!n});if(i)return i;if(!n)return{text:`Error: Session ${r.name} [${vi(r)}] is not running (status: ${r.status}). Cannot send a message to a non-running session.`,isError:!0};if(n.status!=="running")return{text:`Error: Session ${n.name} [${n.id}] is not running (status: ${n.status}). Cannot send a message to a non-running session.`,isError:!0};let s=F.maxAutoResponds??Pp;if(t.userInitiated)n.resetAutoRespond();else if(n.autoRespondCount>=s)return{text:`\u26A0\uFE0F Auto-respond limit reached (${n.autoRespondCount}/${s}). Ask the user to provide the answer for session ${n.name}. Then call agent_respond with their answer and set userInitiated: true to reset the counter.`};let c=kp(e,n,t);if(c)return c;try{let p=!1;t.interrupt&&(p=await n.interrupt());let f="";if(t.approve&&n.pendingPlanApproval){let k=Ep(n.name,t.message);if(k)return k;n.switchPermissionMode("bypassPermissions")}else t.approve&&(n.currentPermissionMode==="acceptEdits"||n.currentPermissionMode==="default")?n.switchPermissionMode("bypassPermissions"):t.approve&&n.currentPermissionMode==="bypassPermissions"?f=`
24
+ \u2139\uFE0F approve=true was set but session is already in bypassPermissions mode.`:t.approve?f=`
25
+ \u26A0\uFE0F approve=true was set but session has no pending plan approval.`:n.pendingPlanApproval&&(f=`
26
+ \u2139\uFE0F Session has a pending plan \u2014 sending as revision feedback. The agent will revise and re-submit. Set approve=true to approve instead.`);await n.sendMessage(t.message),p&&e.notifySession(n,`\u21AA\uFE0F [${n.name}] Redirected`,"redirected"),t.userInitiated||n.incrementAutoRespond();let b=rt(t.message,80);return{text:[`Message sent to session ${n.name} [${n.id}].`,p?" (redirected active turn first)":t.interrupt?" (no active turn to interrupt)":"",` Message: "${b}"`,f,"Use agent_output to see the response."].filter(Boolean).join(`
27
+ `)}}catch(p){return{text:`Error sending message to session ${n.name} [${n.id}]: ${an(p)}`,isError:!0}}}function $p(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.session=="string"&&typeof t.message=="string"}function Ni(e){return{name:"agent_respond",description:"Send a follow-up message to a running coding agent session. The session must be running. Sessions are multi-turn by default, so this works with any session unless it was launched with multi_turn_disabled: true.",parameters:l.Object({session:l.String({description:"Session name or ID to respond to"}),message:l.String({description:"The message to send to the session"}),interrupt:l.Optional(l.Boolean({description:"If true, interrupt the current turn before sending the message. Useful to redirect the session mid-response."})),userInitiated:l.Optional(l.Boolean({description:"Set to true when the message comes from the user (not auto-generated). Resets the auto-respond counter and bypasses the auto-respond limit."})),approve:l.Optional(l.Boolean({description:"Set to true to escalate session permissions to bypassPermissions. Works in two scenarios: (1) approve a pending plan in plan mode (after ExitPlanMode / set_permission_mode), or (2) escalate an acceptEdits or default mode session to skip all remaining permission prompts. No-op if already in bypassPermissions mode. In plan mode without a pending plan, this flag is ignored."}))}),async execute(t,n){if(!g)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!$p(n))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, message, interrupt?, userInitiated?, approve? }."}]};let r=await Ln(g,n);return{isError:r.isError??!1,content:[{type:"text",text:r.text}]}}}}function Ui(e){return{name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics: session counts by status, average duration, and notable sessions.",parameters:l.Object({}),async execute(t,n){if(!g)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};let r=g.getMetrics(),o=g.list("running").length;return{content:[{type:"text",text:vn(r,o)}]}}}}function vp(e){return e instanceof Error?e.message:String(e)}function _i(e){e.registerCommand({name:"agent",description:"Launch a coding agent session. Usage: /agent [--name <name>] <prompt>",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let n=(t.args??"").trim();if(!n)return{text:"Usage: /agent [--name <name>] <prompt>"};let r,o=n.match(/^--name\s+(\S+)\s+/);o&&(r=o[1],n=n.slice(o[0].length).trim());let i=n;if(!i)return{text:"Usage: /agent [--name <name>] <prompt>"};try{let s=tt(),c=nt(s);if(!c)return{text:`Error: No default model configured for harness "${s}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${s}.defaultModel or pass model explicitly via agent_launch.`};let p=g.spawn({prompt:i,name:r,workdir:F.defaultWorkdir||process.cwd(),model:c,reasoningEffort:Ut(s),codexApprovalPolicy:s==="codex"?gt(s)??F.codexApprovalPolicy:void 0,originChannel:_t(t),originThreadId:Lt(t),harness:s}),f=i.length>80?i.slice(0,80)+"...":i;return{text:["Session launched.",` Name: ${p.name}`,` ID: ${p.id}`,` Prompt: "${f}"`,` Status: ${p.status}`].join(`
28
+ `)}}catch(s){let c=vp(s),p=c.includes("Max sessions")?"":`
29
29
 
30
- Use /agent_sessions to see active sessions.`;return{text:`Error launching session: ${m}${p}`}}}})}function Ci(e){e.registerCommand({name:"agent_sessions",description:"List coding agent sessions. Usage: /agent_sessions [--full]",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(t.args??"").split(/\s+/).includes("--full");return{text:Cr(g,"all",void 0,{full:r})}}})}function Mi(e){e.registerCommand({name:"agent_kill",description:"Kill a coding agent session by name or ID",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=t.args?.trim();return r?{text:Mr(g,r,"killed")}:{text:"Usage: /agent_kill <name-or-id>"}}})}function wp(e){return e instanceof Error?e.message:String(e)}function ki(e){e.registerCommand({name:"agent_resume",description:"Resume a previous coding agent session. Usage: /agent_resume <id-or-name> [prompt] or /agent_resume --list to see resumable sessions.",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(t.args??"").trim();if(!r)return{text:`Usage: /agent_resume <id-or-name> [prompt]
30
+ Use /agent_sessions to see active sessions.`;return{text:`Error launching session: ${c}${p}`}}}})}function Li(e){e.registerCommand({name:"agent_sessions",description:"List coding agent sessions. Usage: /agent_sessions [--full]",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let n=(t.args??"").split(/\s+/).includes("--full");return{text:Un(g,"all",void 0,{full:n})}}})}function Ki(e){e.registerCommand({name:"agent_kill",description:"Kill a coding agent session by name or ID",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let n=t.args?.trim();return n?{text:_n(g,n,"killed")}:{text:"Usage: /agent_kill <name-or-id>"}}})}function Np(e){return e instanceof Error?e.message:String(e)}function Di(e){e.registerCommand({name:"agent_resume",description:"Resume a previous coding agent session. Usage: /agent_resume <id-or-name> [prompt] or /agent_resume --list to see resumable sessions.",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let n=(t.args??"").trim();if(!n)return{text:`Usage: /agent_resume <id-or-name> [prompt]
31
31
  /agent_resume --list \u2014 list resumable sessions
32
- /agent_resume --fork <id-or-name> [prompt] \u2014 fork instead of continuing`};if(r==="--list"){let Y=g.listPersistedSessions();return Y.length===0?{text:"No resumable sessions found. Sessions are persisted after completion."}:{text:`Resumable sessions:
32
+ /agent_resume --fork <id-or-name> [prompt] \u2014 fork instead of continuing`};if(n==="--list"){let W=g.listPersistedSessions();return W.length===0?{text:"No resumable sessions found. Sessions are persisted after completion."}:{text:`Resumable sessions:
33
33
 
34
- ${Y.map(W=>{let X=W.prompt.length>60?W.prompt.slice(0,60)+"...":W.prompt,Fe=W.completedAt?`completed ${_e(Date.now()-W.completedAt)} ago`:W.status;return[` ${W.name} \u2014 ${Fe}`,` Session ID: ${W.harnessSessionId}`,` \u{1F4C1} ${W.workdir}`,` \u{1F4DD} "${X}"`].join(`
34
+ ${W.map(N=>{let He=N.prompt.length>60?N.prompt.slice(0,60)+"...":N.prompt,be=N.completedAt?`completed ${_e(Date.now()-N.completedAt)} ago`:N.status;return[` ${N.name} \u2014 ${be}`,` Session ID: ${N.harnessSessionId}`,` \u{1F4C1} ${N.workdir}`,` \u{1F4DD} "${He}"`].join(`
35
35
  `)}).join(`
36
36
 
37
- `)}`}}let n=!1;r.startsWith("--fork ")&&(n=!0,r=r.slice(7).trim());let o=r.indexOf(" "),s,i;o===-1?(s=r,i="Continue where you left off."):(s=r.slice(0,o),i=r.slice(o+1).trim()||"Continue where you left off.");let m=g.resolveHarnessSessionId(s);if(!m)return{text:`Error: Could not find a session ID for "${s}".
38
- Use /agent_resume --list to see available sessions.`};let p=g.resolve(s),f=g.getPersistedSession(s),{resumeSessionId:A,clearedPersistedCodexResume:_}=Ft({requestedResumeSessionId:m,activeSession:p?{harnessSessionId:p.harnessSessionId}:void 0,persistedSession:f?{harness:f.harness}:void 0}),ie=f?.workdir??process.cwd();try{let Y=g.spawn({prompt:i,workdir:ie,name:f?.name,model:f?.model,codexApprovalPolicy:p?.codexApprovalPolicy??f?.codexApprovalPolicy,resumeSessionId:A,forkSession:A?n:!1,originChannel:kt(t),originThreadId:Et(t)??f?.originThreadId,originAgentId:t?.agentId??f?.originAgentId,originSessionKey:t?.sessionKey??f?.originSessionKey,harness:f?.harness}),H=i.length>80?i.slice(0,80)+"...":i;return{text:[`Session resumed${n?" (forked)":""}.`,` Name: ${Y.name}`,` ID: ${Y.id}`,A?` Resume from: ${m}`:" Resume from: fresh thread",` Dir: ${ie}`,` Prompt: "${H}"`,_?" Note: cleared persisted Codex thread state after restart to avoid org-mismatch resume failures.":""].join(`
39
- `)}}catch(Y){let H=wp(Y),W=H.includes("Max sessions")?"":`
37
+ `)}`}}let r=!1;n.startsWith("--fork ")&&(r=!0,n=n.slice(7).trim());let o=n.indexOf(" "),i,s;o===-1?(i=n,s="Continue where you left off."):(i=n.slice(0,o),s=n.slice(o+1).trim()||"Continue where you left off.");let c=g.resolveHarnessSessionId(i);if(!c)return{text:`Error: Could not find a session ID for "${i}".
38
+ Use /agent_resume --list to see available sessions.`};let p=g.resolve(i),f=g.getPersistedSession(i),{resumeSessionId:b,clearedPersistedCodexResume:k}=Kt({requestedResumeSessionId:c,activeSession:p?{harnessSessionId:p.harnessSessionId}:void 0,persistedSession:f?{harness:f.harness}:void 0}),X=f?.workdir??process.cwd(),ge=f?.harness??tt(),Y=f?.model??nt(ge);try{if(!Y)return{text:`Error: No default model configured for harness "${ge}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${ge}.defaultModel or pass model explicitly when launching a fresh session.`};let W=g.spawn({prompt:s,workdir:X,name:f?.name,model:Y,codexApprovalPolicy:p?.codexApprovalPolicy??f?.codexApprovalPolicy,resumeSessionId:b,forkSession:b?r:!1,originChannel:_t(t),originThreadId:Lt(t)??f?.originThreadId,originAgentId:t?.agentId??f?.originAgentId,originSessionKey:t?.sessionKey??f?.originSessionKey,harness:ge}),Q=s.length>80?s.slice(0,80)+"...":s;return{text:[`Session resumed${r?" (forked)":""}.`,` Name: ${W.name}`,` ID: ${W.id}`,b?` Resume from: ${c}`:" Resume from: fresh thread",` Dir: ${X}`,` Prompt: "${Q}"`,k?" Note: cleared persisted Codex thread state after restart to avoid org-mismatch resume failures.":""].join(`
39
+ `)}}catch(W){let Q=Np(W),N=Q.includes("Max sessions")?"":`
40
40
 
41
- Use /agent_sessions to see active sessions or /agent_resume --list to see resumable sessions.`;return{text:`Error resuming session: ${H}${W}`}}}})}function Ei(e){e.registerCommand({name:"agent_respond",description:"Send a follow-up message to a running coding agent session. Usage: /agent_respond <id-or-name> <message>",acceptsArgs:!0,requireAuth:!0,handler:async t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(t.args??"").trim();if(!r)return{text:`Usage: /agent_respond <id-or-name> <message>
42
- /agent_respond --interrupt <id-or-name> <message>`};let n=!1,o=r;o.startsWith("--interrupt ")&&(n=!0,o=o.slice(12).trim());let s=o.indexOf(" ");if(s===-1)return{text:"Error: Missing message. Usage: /agent_respond <id-or-name> <message>"};let i=o.slice(0,s),m=o.slice(s+1).trim();return m?{text:(await kr(g,{session:i,message:m,interrupt:n,userInitiated:!0})).text}:{text:"Error: Empty message. Usage: /agent_respond <id-or-name> <message>"}}})}function Fi(e){e.registerCommand({name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics",acceptsArgs:!1,requireAuth:!0,handler:()=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let t=g.getMetrics(),r=g.list("running").length;return{text:Or(t,r)}}})}var Pp=50;function $i(e){e.registerCommand({name:"agent_output",description:"Show recent output from a coding agent session. Usage: /agent_output <id-or-name> [--full] [--lines N]",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let r=(t.args??"").trim();if(!r)return{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"};let n=r.split(/\s+/),o="",s=!1,i=Pp;for(let p=0;p<n.length;p++)if(n[p]==="--full")s=!0;else if(n[p]==="--lines"&&p+1<n.length){let f=parseInt(n[p+1],10);!isNaN(f)&&f>0&&(i=f),p++}else o||(o=n[p]);return o?{text:Rr(g,o,{full:s,lines:i})}:{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"}}})}import{execFile as oa}from"child_process";import{existsSync as jl}from"fs";import{fileURLToPath as sa}from"url";import{dirname as Dl,join as Dn}from"path";import{EventEmitter as pl}from"events";import Ni from"crypto";var Ui="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var Op=128,ct,$t,Rp=e=>{!ct||ct.length<e?(ct=Buffer.allocUnsafe(e*Op),Ni.randomFillSync(ct),$t=0):$t+e>ct.length&&(Ni.randomFillSync(ct),$t=0),$t+=e};var _i=(e=21)=>{Rp(e|=0);let t="";for(let r=$t-e;r<$t;r++)t+=Ui[ct[r]&63];return t};import{query as Cp}from"@anthropic-ai/claude-agent-sdk";var Er=class{name="claude-code";supportedPermissionModes=["default","plan","acceptEdits","bypassPermissions"];questionToolNames=["AskUserQuestion"];planApprovalToolNames=["ExitPlanMode","set_permission_mode"];launch(t){let r={cwd:t.cwd,model:t.model,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:!0,allowedTools:t.allowedTools,systemPrompt:t.systemPrompt,includePartialMessages:!0,abortController:t.abortController,mcpServers:t.mcpServers};t.resumeSessionId&&(r.resume=t.resumeSessionId,r.forkSession=t.forkSession??!1);let n=Cp({prompt:t.prompt,options:r});return{messages:this.adaptMessages(n),async setPermissionMode(o){typeof n.setPermissionMode=="function"&&await n.setPermissionMode(o)},async streamInput(o){typeof n.streamInput=="function"&&await n.streamInput(o)},async interrupt(){typeof n.interrupt=="function"&&await n.interrupt()}}}buildUserMessage(t,r){return{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:r}}async*adaptMessages(t){for await(let r of t){let n=r;if(n.type==="system"&&n.subtype==="init")yield{type:"init",session_id:n.session_id??""};else if(n.type==="system"&&n.subtype==="status"&&n.permissionMode)yield{type:"permission_mode_change",mode:n.permissionMode};else if(n.type==="assistant")for(let o of n.message?.content??[])o.type==="text"?yield{type:"text",text:o.text}:o.type==="tool_use"&&(yield{type:"tool_use",name:o.name,input:o.input});else n.type==="result"&&(yield{type:"result",data:{success:n.subtype==="success",duration_ms:n.duration_ms??0,total_cost_usd:n.total_cost_usd??0,num_turns:n.num_turns??0,result:n.result,session_id:n.session_id??""}})}}};import{parse as Xp,resolve as Qp}from"path";import{Codex as Hi}from"@openai/codex-sdk";import{randomUUID as Mp}from"node:crypto";import{lstat as kp,mkdir as vn,readFile as Li,readlink as Ep,realpath as Fp,rename as $p,rm as Fr,symlink as Up,writeFile as ji}from"node:fs/promises";import{homedir as Np,tmpdir as Di}from"node:os";import{dirname as _p,join as Ee,resolve as vp}from"node:path";var Kp=50,Lp=3e4,jp=Ee(Di(),"openclaw-codex-auth.lock");function Dp(e,t){let r={};for(let[n,o]of Object.entries(e))typeof o=="string"&&(r[n]=o);return r.HOME=t,r}function Gp(e){return new Promise(t=>setTimeout(t,e))}async function Gi(e){try{return await kp(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function vi(e,t){if(await Gi(t)){if(await Ep(t)===e)return;await Fr(t,{recursive:!0,force:!0})}await Up(e,t)}function Vp(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return null;let r=Number(t);if(Number.isFinite(r))return r;let n=Date.parse(t);if(Number.isFinite(n))return n}return null}async function Ki(e){let t;try{t=await Li(e,"utf8")}catch(r){return r.code==="ENOENT",null}try{let r=JSON.parse(t);if(!r||typeof r!="object")return null;let n=Vp(r.last_refresh);return n===null?null:{lastRefresh:n,raw:t}}catch{return null}}async function Vi(e,t){await vn(_p(e),{recursive:!0});let r=`${e}.tmp`;await ji(r,t,"utf8"),await $p(r,e)}async function Bp(e,t){try{let r=await Li(e,"utf8");await Vi(t,r)}catch(r){if(r.code!=="ENOENT")throw r;await Fr(t,{force:!0})}}async function Hp(e,t){let r=await Ki(e);if(!r)return;let n=await Ki(t);n&&r.lastRefresh<=n.lastRefresh||await Vi(t,r.raw)}async function Wp(e,t,r){let n=Date.now()+t;for(;;)try{await vn(e);break}catch(s){if(s.code!=="EEXIST")throw s;if(Date.now()>=n)throw new Error(`Timed out waiting for Codex auth lock at ${e}`);await Gp(r)}try{await ji(Ee(e,"holder.json"),JSON.stringify({pid:process.pid,acquired_at:new Date().toISOString()}),"utf8")}catch{}let o=!1;return async()=>{o||(o=!0,await Fr(e,{recursive:!0,force:!0}))}}async function Bi(e=process.env,t={}){let r=e.HOME??Np(),n=await Fp(r).catch(()=>vp(r)),o=Ee(n,".codex"),s=Ee(o,"auth.json"),i=Ee(o,"sessions"),m=Ee(o,"config.toml"),p=await Gi(m)?m:void 0,f=t.tempRootDir??Di(),A=Ee(f,`openclaw-codex-auth-${Mp()}`),_=Ee(A,".codex"),ie=Ee(_,"auth.json"),Y=t.lockDir??jp,H=t.lockTimeoutMs??Lp,W=t.lockRetryMs??Kp;return await vn(_,{recursive:!0}),await vi(i,Ee(_,"sessions")),p&&await vi(p,Ee(_,"config.toml")),{tempHome:A,tempCodexDir:_,canonicalHome:n,canonicalCodexDir:o,canonicalAuthPath:s,canonicalSessionsPath:i,canonicalConfigPath:p,env:Dp(e,A),async prepareForTurn(){let X=await Wp(Y,H,W);try{await Bp(s,ie)}catch(er){throw await X(),er}let Fe=!1;return async()=>{if(!Fe){Fe=!0;try{await Hp(ie,s)}finally{await X()}}}},async cleanup(){await Fr(A,{recursive:!0,force:!0})}}}var qp=["proceed","continue","implement","apply","run","merge","deploy","commit"],zp=["shall i proceed","do you want me to","would you like me to","please confirm","should i continue","can i proceed","should i proceed","should i go ahead","want me to continue","approve and i'll","confirm and i'll"],Yp=["why this failed was","why did this fail","what failed","what happened","how can i help","is this clear","any questions","anything else","let me know","would you like a summary"];function Jp(e){return e.toLowerCase().replace(/\s+/g," ").trim()}function $r(e){let t=Jp(e);if(!t||Yp.some(n=>t.includes(n)))return!1;let r=qp.some(n=>t.includes(n));return zp.some(n=>t.includes(n))?r||t.includes("confirm"):t.endsWith("?")?r:!1}var Wi=1e4,qi="codex:waiting-for-user",Zp=1.1/1e6,el=.275/1e6,tl=4.4/1e6,rl="OPENCLAW_CODEX_HEARTBEAT_MS",nl="OPENCLAW_CODEX_BYPASS_ADDITIONAL_DIRS",ol="OPENCLAW_CODEX_AUTH_STRATEGY";function sl(e){if(!e)return 0;let t=e.cached_input_tokens??0,r=Math.max(0,(e.input_tokens??0)-t),n=e.output_tokens??0;return r*Zp+t*el+n*tl}function zi(e,t={}){return{success:!1,duration_ms:0,total_cost_usd:0,num_turns:0,session_id:e,...t}}function il(e){if(typeof e=="string")return e;if(!e||typeof e!="object")return String(e);let t=e;return typeof t.message?.content=="string"?t.message.content:typeof t.text=="string"?t.text:String(e)}function al(e){return["[SYSTEM: First turn only. Do not implement yet.]","Start by producing a concise implementation plan only.","Then end your response with an explicit question asking whether you should proceed with implementation.","",e].join(`
43
- `)}function Yi(e){return e instanceof Error?e.message:String(e)}function ul(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function dl(e){return Xp(Qp(e)).root||"/"}function ml(e){let r=[dl(e)];return r.push(...ul(process.env[nl])),[...new Set(r)]}function cl(e,t){let n=(t??e.permissionMode)==="bypassPermissions"?ml(e.cwd):void 0;return{model:e.model,modelReasoningEffort:e.reasoningEffort,workingDirectory:e.cwd,sandboxMode:"danger-full-access",approvalPolicy:e.codexApprovalPolicy??"on-request",skipGitRepoCheck:!0,additionalDirectories:n}}var Ur=class{constructor(t={}){this.deps=t}name="codex";supportedPermissionModes=["default","plan","acceptEdits","bypassPermissions"];questionToolNames=[qi];planApprovalToolNames=[];activityHeartbeatMs(){let t=Number.parseInt(process.env[rl]??String(Wi),10);return!Number.isFinite(t)||t<=0?Wi:t}createCodexClient(t){return this.deps.createCodex?.({env:t})??(t?new Hi({env:t}):new Hi)}launch(t){let n=process.env[ol]==="legacy"?void 0:this.deps.createAuthWorkspace?.(process.env)??Bi(process.env),o=t.permissionMode==="plan",s=t.permissionMode==="plan"?"default":t.permissionMode,i=t.resumeSessionId,m=0,p=0,f=this.activityHeartbeatMs(),A,_,ie=!1,Y=!0,H,W=[],X=null,Fe=!1,er=!1;function Gn(){X&&(X(),X=null)}function et(D){W.push(D),Gn()}function Vn(){Fe=!0,Gn()}function Hr(D){!D||er||(er=!0,et({type:"init",session_id:D}))}async function*ia(){for(;;){for(;W.length>0;)yield W.shift();if(Fe)return;await new Promise(D=>{X=D})}}let tr=()=>cl(t,s),aa=D=>(A||(A=this.createCodexClient(D)),_||(Y&&t.resumeSessionId?_=A.resumeThread(t.resumeSessionId,tr()):i?_=A.resumeThread(i,tr()):_=A.startThread(tr())),ie&&i&&(_=A.resumeThread(i,tr()),ie=!1),Hr(_.id??i??void 0),_),Bn=async D=>{let qr=Date.now();p+=1;let Hn="",zr=!1,Yr,Jr,Wn=!1,ua=Y&&o?al(D):D,rr=tt=>{zr||(zr=!0,et({type:"result",data:zi(i??"",{duration_ms:Date.now()-qr,total_cost_usd:m,num_turns:p,...tt,session_id:i??""})}))},Xr=async()=>{!Jr||Wn||(Wn=!0,await Jr())};try{let tt=n?await n:void 0;tt&&(Jr=await tt.prepareForTurn());let qn=aa(tt?.env),zn=qn.id??i??void 0;zn&&(i=zn,Hr(i)),H=new AbortController,t.abortController?.signal.aborted&&H.abort(t.abortController.signal.reason),Yr=setInterval(()=>{et({type:"activity"})},f);let da=await qn.runStreamed(ua,{signal:H.signal});for await(let ae of da.events){if(await Xr(),ae.type==="thread.started"){i=ae.thread_id,Hr(i);continue}if(ae.type==="item.completed"){(ae.item.type==="agent_message"||ae.item.type==="reasoning")&&(Hn+=`${ae.item.text}
44
- `,et({type:"text",text:ae.item.text}));continue}if(ae.type==="error"){et({type:"text",text:`[codex:error] ${ae.message}`});continue}if(ae.type==="turn.failed"){rr({success:!1,result:ae.error.message,session_id:i??""});continue}if(ae.type==="turn.completed"){m+=sl(ae.usage);let Yn=Hn.slice(-500);$r(Yn)&&et({type:"tool_use",name:qi,input:{text:Yn}}),rr({success:!0,session_id:i??""})}}await Xr(),zr||rr({success:!1,result:"Codex turn ended without terminal event",session_id:i??""})}catch(tt){await Xr(),rr({success:!1,result:Yi(tt),session_id:i??""})}finally{Yr&&clearInterval(Yr),H=void 0,Y=!1}},Wr=()=>{H?.abort(t.abortController?.signal.reason??"interrupted")};return t.abortController?.signal&&t.abortController.signal.addEventListener("abort",Wr),(async()=>{try{let D=t.prompt;if(typeof D=="string"){await Bn(D);return}for await(let qr of D)if(t.abortController?.signal.aborted||(await Bn(il(qr)),t.abortController?.signal.aborted))break}finally{if(t.abortController?.signal.removeEventListener("abort",Wr),n)try{await(await n).cleanup()}catch{}Vn()}})().catch(D=>{et({type:"result",data:zi(i??"",{success:!1,result:Yi(D),total_cost_usd:m,num_turns:p,session_id:i??""})}),t.abortController?.signal.removeEventListener("abort",Wr),Vn()}),{messages:ia(),async setPermissionMode(D){s=D,ie=!0},async interrupt(){H?.abort("interrupted")}}}buildUserMessage(t,r){return{type:"user",text:t,session_id:r}}};var Kn=new Map;function Ji(e){Kn.set(e.name,e)}function Ln(e){let t=Kn.get(e);if(!t)throw new Error(`Unknown agent harness: "${e}". Available: ${[...Kn.keys()].join(", ")}`);return t}function Xi(){let e=h.defaultHarness??"claude-code";return Ln(e)}Ji(new Er);Ji(new Ur);var Qi=200,ll=120*1e3;function Nr(e){return e instanceof Error?e.message:String(e)}var fl={starting:["running","failed","killed"],running:["completed","failed","killed"],completed:[],failed:[],killed:[]},jn=class{queue=[];resolve=null;done=!1;hasPending(){return this.queue.length>0}push(t){this.queue.push(t),this.resolve&&(this.resolve(),this.resolve=null)}end(){this.done=!0,this.resolve&&(this.resolve(),this.resolve=null)}async*[Symbol.asyncIterator](){for(;;){for(;this.queue.length>0;)yield this.queue.shift();if(this.done)return;await new Promise(t=>{this.resolve=t})}}},_r=class extends pl{id;name;harnessSessionId;harness;harnessHandle;prompt;workdir;model;reasoningEffort;systemPrompt;allowedTools;permissionMode;codexApprovalPolicy;currentPermissionMode;pendingModeSwitch;resumeSessionId;forkSession;multiTurn;messageStream;_status="starting";error;startedAt;completedAt;abortController;outputBuffer=[];result;costUsd=0;originChannel;originThreadId;originAgentId;originSessionKey;pendingPlanApproval=!1;lobsterResumeToken;killReason="unknown";waitingForInputFired=!1;lastTurnHadQuestion=!1;planModeApproved=!1;autoRespondCount=0;timers=new Map;constructor(t,r){super(),this.id=_i(8),this.name=r,this.harness=t.harness?Ln(t.harness):Xi();let n=this.harness.name==="codex";this.prompt=t.prompt,this.workdir=t.workdir,this.model=t.model??(n?h.model:void 0)??h.defaultModel,this.reasoningEffort=t.reasoningEffort??(n?h.reasoningEffort:void 0),this.systemPrompt=t.systemPrompt,this.allowedTools=t.allowedTools,this.permissionMode=t.permissionMode??h.permissionMode,this.codexApprovalPolicy=n?t.codexApprovalPolicy??h.codexApprovalPolicy:void 0,this.currentPermissionMode=n&&this.permissionMode==="plan"?"default":this.permissionMode,this.originChannel=t.originChannel,this.originThreadId=t.originThreadId,this.originAgentId=t.originAgentId,this.originSessionKey=t.originSessionKey,this.resumeSessionId=t.resumeSessionId,this.forkSession=t.forkSession,this.multiTurn=t.multiTurn??!0,this.startedAt=Date.now(),this.abortController=new AbortController}get status(){return this._status}get harnessName(){return this.harness.name}get duration(){return(this.completedAt??Date.now())-this.startedAt}get phase(){return this._status!=="running"?this._status:this.harness.name==="codex"?"implementing":this.pendingPlanApproval?"awaiting-plan-approval":this.currentPermissionMode==="plan"?"planning":"implementing"}transition(t){if(!fl[this._status].includes(t))throw new Error(`Session state error: cannot transition from ${this._status} to ${t}. This is an internal error \u2014 please report it.`);let r=this._status;this._status=t,this.emit("statusChange",this,t,r)}setTimer(t,r,n){this.clearTimer(t),this.timers.set(t,setTimeout(n,r))}clearTimer(t){let r=this.timers.get(t);r&&(clearTimeout(r),this.timers.delete(t))}clearAllTimers(){for(let t of this.timers.values())clearTimeout(t);this.timers.clear()}async start(){try{let t;this.multiTurn?(this.messageStream=new jn,this.messageStream.push(this.harness.buildUserMessage(this.prompt,"")),t=this.messageStream):t=this.prompt;let r=this.harness.launch({prompt:t,cwd:this.workdir,model:this.model,reasoningEffort:this.reasoningEffort,permissionMode:this.permissionMode,codexApprovalPolicy:this.codexApprovalPolicy,systemPrompt:this.systemPrompt,allowedTools:this.allowedTools,resumeSessionId:this.resumeSessionId,forkSession:this.forkSession,abortController:this.abortController,mcpServers:li()});this.harnessHandle=r,this.setTimer("startup",ll,()=>{this._status==="starting"&&this.kill("startup-timeout")})}catch(t){let r=t instanceof Error?t.message:String(t);this.transitionToTerminal("failed",{error:r});return}this.consumeMessages(this.harnessHandle.messages).catch(t=>{let r=t instanceof Error?t.message:String(t),n=t instanceof Error?t.stack:void 0;console.error(`[Session ${this.id}] consumeMessages error: ${r}`,n),this.isActive&&this.transitionToTerminal("failed",{error:r})})}async sendMessage(t){if(this._status!=="running")throw new Error(`Session is not running (status: ${this._status})`);this.resetIdleTimer(),this.waitingForInputFired=!1;let r=t;if(this.pendingModeSwitch){let n=this.pendingModeSwitch,o=!1,s=!1;if(this.harnessHandle?.setPermissionMode)try{await this.harnessHandle.setPermissionMode(n),this.currentPermissionMode=n,this.pendingModeSwitch=void 0,s=!0,o=!0}catch(i){throw console.error(`[Session ${this.id}] setPermissionMode(${n}) FAILED: ${Nr(i)}`),this.pendingPlanApproval=!0,new Error(`Failed to switch permission mode to ${n}: ${Nr(i)}`)}else this.pendingModeSwitch=void 0,s=!0,o=!0,console.warn(`[Session ${this.id}] Cannot call setPermissionMode \u2014 falling back to text prefix only (currentPermissionMode remains ${this.currentPermissionMode})`);s&&(this.pendingPlanApproval=!1,n!=="plan"&&(this.planModeApproved=!0)),o&&(r=`[SYSTEM: The user has approved your plan. Exit plan mode immediately and implement the changes with full permissions. Do not ask for further confirmation.]
41
+ Use /agent_sessions to see active sessions or /agent_resume --list to see resumable sessions.`;return{text:`Error resuming session: ${Q}${N}`}}}})}function ji(e){e.registerCommand({name:"agent_respond",description:"Send a follow-up message to a running coding agent session. Usage: /agent_respond <id-or-name> <message>",acceptsArgs:!0,requireAuth:!0,handler:async t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let n=(t.args??"").trim();if(!n)return{text:`Usage: /agent_respond <id-or-name> <message>
42
+ /agent_respond --interrupt <id-or-name> <message>`};let r=!1,o=n;o.startsWith("--interrupt ")&&(r=!0,o=o.slice(12).trim());let i=o.indexOf(" ");if(i===-1)return{text:"Error: Missing message. Usage: /agent_respond <id-or-name> <message>"};let s=o.slice(0,i),c=o.slice(i+1).trim();return c?{text:(await Ln(g,{session:s,message:c,interrupt:r,userInitiated:!0})).text}:{text:"Error: Empty message. Usage: /agent_respond <id-or-name> <message>"}}})}function Gi(e){e.registerCommand({name:"agent_stats",description:"Show OpenClaw Code Agent usage metrics",acceptsArgs:!1,requireAuth:!0,handler:()=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let t=g.getMetrics(),n=g.list("running").length;return{text:vn(t,n)}}})}var Up=50;function Vi(e){e.registerCommand({name:"agent_output",description:"Show recent output from a coding agent session. Usage: /agent_output <id-or-name> [--full] [--lines N]",acceptsArgs:!0,requireAuth:!0,handler:t=>{if(!g)return{text:"Error: SessionManager not initialized. The code-agent service must be running."};let n=(t.args??"").trim();if(!n)return{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"};let r=n.split(/\s+/),o="",i=!1,s=Up;for(let p=0;p<r.length;p++)if(r[p]==="--full")i=!0;else if(r[p]==="--lines"&&p+1<r.length){let f=parseInt(r[p+1],10);!isNaN(f)&&f>0&&(s=f),p++}else o||(o=r[p]);return o?{text:Nn(g,o,{full:i,lines:s})}:{text:"Usage: /agent_output <id-or-name> [--full] [--lines N]"}}})}import{execFile as fa}from"child_process";import{existsSync as Xl}from"fs";import{fileURLToPath as ga}from"url";import{dirname as Ql,join as Yr}from"path";import{EventEmitter as wl}from"events";import Bi from"crypto";var Hi="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";var _p=128,It,Dt,Lp=e=>{!It||It.length<e?(It=Buffer.allocUnsafe(e*_p),Bi.randomFillSync(It),Dt=0):Dt+e>It.length&&(Bi.randomFillSync(It),Dt=0),Dt+=e};var Wi=(e=21)=>{Lp(e|=0);let t="";for(let n=Dt-e;n<Dt;n++)t+=Hi[It[n]&63];return t};import{query as Kp}from"@anthropic-ai/claude-agent-sdk";var Kn=class{name="claude-code";supportedPermissionModes=["default","plan","acceptEdits","bypassPermissions"];questionToolNames=["AskUserQuestion"];planApprovalToolNames=["ExitPlanMode","set_permission_mode"];launch(t){let n={cwd:t.cwd,model:t.model,permissionMode:t.permissionMode,allowDangerouslySkipPermissions:!0,allowedTools:t.allowedTools,systemPrompt:t.systemPrompt,includePartialMessages:!0,abortController:t.abortController,mcpServers:t.mcpServers};t.resumeSessionId&&(n.resume=t.resumeSessionId,n.forkSession=t.forkSession??!1);let r=Kp({prompt:t.prompt,options:n});return{messages:this.adaptMessages(r),async setPermissionMode(o){typeof r.setPermissionMode=="function"&&await r.setPermissionMode(o)},async streamInput(o){typeof r.streamInput=="function"&&await r.streamInput(o)},async interrupt(){typeof r.interrupt=="function"&&await r.interrupt()}}}buildUserMessage(t,n){return{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:n}}async*adaptMessages(t){for await(let n of t){let r=n;if(r.type==="system"&&r.subtype==="init")yield{type:"init",session_id:r.session_id??""};else if(r.type==="system"&&r.subtype==="status"&&r.permissionMode)yield{type:"permission_mode_change",mode:r.permissionMode};else if(r.type==="assistant")for(let o of r.message?.content??[])o.type==="text"?yield{type:"text",text:o.text}:o.type==="tool_use"&&(yield{type:"tool_use",name:o.name,input:o.input});else r.type==="result"&&(yield{type:"result",data:{success:r.subtype==="success",duration_ms:r.duration_ms??0,total_cost_usd:r.total_cost_usd??0,num_turns:r.num_turns??0,result:r.result,session_id:r.session_id??""}})}}};import{parse as ul,resolve as dl}from"path";import{Codex as ta}from"@openai/codex-sdk";import{randomUUID as Dp}from"node:crypto";import{lstat as jp,mkdir as Br,readFile as Yi,readlink as Gp,realpath as Vp,rename as Hp,rm as Dn,symlink as Bp,writeFile as Ji}from"node:fs/promises";import{homedir as Wp,tmpdir as Xi}from"node:os";import{dirname as qp,join as $e,resolve as zp}from"node:path";var Yp=50,Jp=3e4,Xp=$e(Xi(),"openclaw-codex-auth.lock");function Qp(e,t){let n={};for(let[r,o]of Object.entries(e))typeof o=="string"&&(n[r]=o);return n.HOME=t,n}function Zp(e){return new Promise(t=>setTimeout(t,e))}async function Qi(e){try{return await jp(e),!0}catch(t){if(t.code==="ENOENT")return!1;throw t}}async function qi(e,t){if(await Qi(t)){if(await Gp(t)===e)return;await Dn(t,{recursive:!0,force:!0})}await Bp(e,t)}function el(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=e.trim();if(!t)return null;let n=Number(t);if(Number.isFinite(n))return n;let r=Date.parse(t);if(Number.isFinite(r))return r}return null}async function zi(e){let t;try{t=await Yi(e,"utf8")}catch(n){return n.code==="ENOENT",null}try{let n=JSON.parse(t);if(!n||typeof n!="object")return null;let r=el(n.last_refresh);return r===null?null:{lastRefresh:r,raw:t}}catch{return null}}async function Zi(e,t){await Br(qp(e),{recursive:!0});let n=`${e}.tmp`;await Ji(n,t,"utf8"),await Hp(n,e)}async function tl(e,t){try{let n=await Yi(e,"utf8");await Zi(t,n)}catch(n){if(n.code!=="ENOENT")throw n;await Dn(t,{force:!0})}}async function nl(e,t){let n=await zi(e);if(!n)return;let r=await zi(t);r&&n.lastRefresh<=r.lastRefresh||await Zi(t,n.raw)}async function rl(e,t,n){let r=Date.now()+t;for(;;)try{await Br(e);break}catch(i){if(i.code!=="EEXIST")throw i;if(Date.now()>=r)throw new Error(`Timed out waiting for Codex auth lock at ${e}`);await Zp(n)}try{await Ji($e(e,"holder.json"),JSON.stringify({pid:process.pid,acquired_at:new Date().toISOString()}),"utf8")}catch{}let o=!1;return async()=>{o||(o=!0,await Dn(e,{recursive:!0,force:!0}))}}async function ea(e=process.env,t={}){let n=e.HOME??Wp(),r=await Vp(n).catch(()=>zp(n)),o=$e(r,".codex"),i=$e(o,"auth.json"),s=$e(o,"sessions"),c=$e(o,"config.toml"),p=await Qi(c)?c:void 0,f=t.tempRootDir??Xi(),b=$e(f,`openclaw-codex-auth-${Dp()}`),k=$e(b,".codex"),X=$e(k,"auth.json"),ge=t.lockDir??Xp,Y=t.lockTimeoutMs??Jp,W=t.lockRetryMs??Yp;return await Br(k,{recursive:!0}),await qi(s,$e(k,"sessions")),p&&await qi(p,$e(k,"config.toml")),{tempHome:b,tempCodexDir:k,canonicalHome:r,canonicalCodexDir:o,canonicalAuthPath:i,canonicalSessionsPath:s,canonicalConfigPath:p,env:Qp(e,b),async prepareForTurn(){let Q=await rl(ge,Y,W);try{await tl(i,X)}catch(He){throw await Q(),He}let N=!1;return async()=>{if(!N){N=!0;try{await nl(X,i)}finally{await Q()}}}},async cleanup(){await Dn(b,{recursive:!0,force:!0})}}}var ol=["proceed","continue","implement","apply","run","merge","deploy","commit"],sl=["shall i proceed","do you want me to","would you like me to","please confirm","should i continue","can i proceed","should i proceed","should i go ahead","want me to continue","approve and i'll","confirm and i'll"],il=["why this failed was","why did this fail","what failed","what happened","how can i help","is this clear","any questions","anything else","let me know","would you like a summary"];function al(e){return e.toLowerCase().replace(/\s+/g," ").trim()}function jn(e){let t=al(e);if(!t||il.some(r=>t.includes(r)))return!1;let n=ol.some(r=>t.includes(r));return sl.some(r=>t.includes(r))?n||t.includes("confirm"):t.endsWith("?")?n:!1}var na=1e4,ra="codex:waiting-for-user",cl=1.1/1e6,ml=.275/1e6,pl=4.4/1e6,ll="OPENCLAW_CODEX_HEARTBEAT_MS",fl="OPENCLAW_CODEX_BYPASS_ADDITIONAL_DIRS",gl="OPENCLAW_CODEX_AUTH_STRATEGY";function Il(e){if(!e)return 0;let t=e.cached_input_tokens??0,n=Math.max(0,(e.input_tokens??0)-t),r=e.output_tokens??0;return n*cl+t*ml+r*pl}function oa(e,t={}){return{success:!1,duration_ms:0,total_cost_usd:0,num_turns:0,session_id:e,...t}}function hl(e){if(typeof e=="string")return e;if(!e||typeof e!="object")return String(e);let t=e;return typeof t.message?.content=="string"?t.message.content:typeof t.text=="string"?t.text:String(e)}function yl(e){return["[SYSTEM: First turn only. Do not implement yet.]","Start by producing a concise implementation plan only.","Then end your response with an explicit question asking whether you should proceed with implementation.","",e].join(`
43
+ `)}function sa(e){return e instanceof Error?e.message:String(e)}function xl(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function Sl(e){return ul(dl(e)).root||"/"}function Tl(e){let n=[Sl(e)];return n.push(...xl(process.env[fl])),[...new Set(n)]}function bl(e,t){let r=(t??e.permissionMode)==="bypassPermissions"?Tl(e.cwd):void 0;return{model:e.model,modelReasoningEffort:e.reasoningEffort,workingDirectory:e.cwd,sandboxMode:"danger-full-access",approvalPolicy:e.codexApprovalPolicy??"on-request",skipGitRepoCheck:!0,additionalDirectories:r}}var Gn=class{constructor(t={}){this.deps=t}name="codex";supportedPermissionModes=["default","plan","acceptEdits","bypassPermissions"];questionToolNames=[ra];planApprovalToolNames=[];activityHeartbeatMs(){let t=Number.parseInt(process.env[ll]??String(na),10);return!Number.isFinite(t)||t<=0?na:t}createCodexClient(t){return this.deps.createCodex?.({env:t})??(t?new ta({env:t}):new ta)}launch(t){let r=process.env[gl]==="legacy"?void 0:this.deps.createAuthWorkspace?.(process.env)??ea(process.env),o=t.permissionMode==="plan",i=t.permissionMode==="plan"?"default":t.permissionMode,s=t.resumeSessionId,c=0,p=0,f=this.activityHeartbeatMs(),b,k,X=!1,ge=!0,Y,W=!1,Q=[],N=null,He=!1,be=!1;function yt(){N&&(N(),N=null)}function ot(G){Q.push(G),yt()}function Xr(){He=!0,yt()}function Ia(G){!G||be||(be=!0,ot({type:"init",session_id:G}))}async function*ha(){for(;;){for(;Q.length>0;)yield Q.shift();if(He)return;await new Promise(G=>{N=G})}}let un=()=>bl(t,i),ya=G=>(b||(b=this.createCodexClient(G)),k||(ge&&t.resumeSessionId?k=b.resumeThread(t.resumeSessionId,un()):s?k=b.resumeThread(s,un()):k=b.startThread(un())),X&&s&&(k=b.resumeThread(s,un()),X=!1),k),Qr=async G=>{let er=Date.now();p+=1;let Zr="",tr=!1,eo=!1,nr,rr,to=!1,xa=ge&&o?yl(G):G,dn=st=>{tr||(tr=!0,ot({type:"result",data:oa(s??"",{duration_ms:Date.now()-er,total_cost_usd:c,num_turns:p,...st,session_id:s??""})}))},or=async()=>{!rr||to||(to=!0,await rr())};try{let st=r?await r:void 0;st&&(rr=await st.prepareForTurn());let sr=ya(st?.env),no=sr.id??s??void 0;no&&(s=no),Y=new AbortController,t.abortController?.signal.aborted&&Y.abort(t.abortController.signal.reason),nr=setInterval(()=>{ot({type:"activity"})},f);let Sa=await sr.runStreamed(xa,{signal:Y.signal});for await(let re of Sa.events)if(await or(),re.type==="thread.started"&&(s=re.thread_id),Ia(s??sr.id??void 0),re.type!=="thread.started"){if(re.type==="item.completed"){(re.item.type==="agent_message"||re.item.type==="reasoning")&&(Zr+=`${re.item.text}
44
+ `,ot({type:"text",text:re.item.text}));continue}if(re.type==="error"){Y?.signal.aborted&&W||ot({type:"text",text:`[codex:error] ${re.message}`});continue}if(re.type==="turn.failed"){if(Y?.signal.aborted&&W){W=!1,eo=!0,X=!0;break}dn({success:!1,result:re.error.message,session_id:s??""});continue}if(re.type==="turn.completed"){c+=Il(re.usage);let ro=Zr.slice(-500);jn(ro)&&ot({type:"tool_use",name:ra,input:{text:ro}}),dn({success:!0,session_id:s??""})}}if(await or(),eo)return;tr||dn({success:!1,result:"Codex turn ended without terminal event",session_id:s??""})}catch(st){if(await or(),Y?.signal.aborted&&W){W=!1,X=!0;return}dn({success:!1,result:sa(st),session_id:s??""})}finally{nr&&clearInterval(nr),Y=void 0,ge=!1}},Zn=()=>{Y?.abort(t.abortController?.signal.reason??"interrupted")};return t.abortController?.signal&&t.abortController.signal.addEventListener("abort",Zn),(async()=>{try{let G=t.prompt;if(typeof G=="string"){await Qr(G);return}for await(let er of G)if(t.abortController?.signal.aborted||(await Qr(hl(er)),t.abortController?.signal.aborted))break}finally{if(t.abortController?.signal.removeEventListener("abort",Zn),r)try{await(await r).cleanup()}catch{}Xr()}})().catch(G=>{ot({type:"result",data:oa(s??"",{success:!1,result:sa(G),total_cost_usd:c,num_turns:p,session_id:s??""})}),t.abortController?.signal.removeEventListener("abort",Zn),Xr()}),{messages:ha(),async setPermissionMode(G){i=G,X=!0},async interrupt(){Y&&(W=!0,Y.abort("interrupted"))}}}buildUserMessage(t,n){return{type:"user",text:t,session_id:n}}};var Wr=new Map;function ia(e){Wr.set(e.name,e)}function qr(e){let t=Wr.get(e);if(!t)throw new Error(`Unknown agent harness: "${e}". Available: ${[...Wr.keys()].join(", ")}`);return t}function aa(){return qr(tt())}ia(new Kn);ia(new Gn);var ua=200,Al=120*1e3;function Vn(e){return e instanceof Error?e.message:String(e)}var Pl={starting:["running","failed","killed"],running:["completed","failed","killed"],completed:[],failed:[],killed:[]},zr=class{queue=[];resolve=null;done=!1;hasPending(){return this.queue.length>0}push(t){this.queue.push(t),this.resolve&&(this.resolve(),this.resolve=null)}end(){this.done=!0,this.resolve&&(this.resolve(),this.resolve=null)}async*[Symbol.asyncIterator](){for(;;){for(;this.queue.length>0;)yield this.queue.shift();if(this.done)return;await new Promise(t=>{this.resolve=t})}}},Hn=class extends wl{id;name;harnessSessionId;harness;harnessHandle;prompt;workdir;model;reasoningEffort;systemPrompt;allowedTools;permissionMode;codexApprovalPolicy;currentPermissionMode;pendingModeSwitch;resumeSessionId;forkSession;multiTurn;messageStream;_status="starting";error;startedAt;completedAt;abortController;outputBuffer=[];result;costUsd=0;originChannel;originThreadId;originAgentId;originSessionKey;pendingPlanApproval=!1;lobsterResumeToken;killReason="unknown";waitingForInputFired=!1;lastTurnHadQuestion=!1;planModeApproved=!1;turnInProgress=!0;autoRespondCount=0;timers=new Map;constructor(t,n){super(),this.id=Wi(8),this.name=n,this.harness=t.harness?qr(t.harness):aa(),this.prompt=t.prompt,this.workdir=t.workdir,this.model=t.model??nt(this.harness.name),this.reasoningEffort=t.reasoningEffort??Ut(this.harness.name),this.systemPrompt=t.systemPrompt,this.allowedTools=t.allowedTools,this.permissionMode=t.permissionMode??F.permissionMode,this.codexApprovalPolicy=this.harness.name==="codex"?t.codexApprovalPolicy??gt(this.harness.name)??F.codexApprovalPolicy:void 0,this.currentPermissionMode=this.harness.name==="codex"&&this.permissionMode==="plan"?"default":this.permissionMode,this.originChannel=t.originChannel,this.originThreadId=t.originThreadId,this.originAgentId=t.originAgentId,this.originSessionKey=t.originSessionKey,this.resumeSessionId=t.resumeSessionId,this.forkSession=t.forkSession,this.multiTurn=t.multiTurn??!0,this.startedAt=Date.now(),this.abortController=new AbortController}get status(){return this._status}get harnessName(){return this.harness.name}get duration(){return(this.completedAt??Date.now())-this.startedAt}get phase(){return this._status!=="running"?this._status:this.harness.name==="codex"?"implementing":this.pendingPlanApproval?"awaiting-plan-approval":this.currentPermissionMode==="plan"?"planning":"implementing"}transition(t){if(!Pl[this._status].includes(t))throw new Error(`Session state error: cannot transition from ${this._status} to ${t}. This is an internal error \u2014 please report it.`);let n=this._status;this._status=t,this.emit("statusChange",this,t,n)}setTimer(t,n,r){this.clearTimer(t),this.timers.set(t,setTimeout(r,n))}clearTimer(t){let n=this.timers.get(t);n&&(clearTimeout(n),this.timers.delete(t))}clearAllTimers(){for(let t of this.timers.values())clearTimeout(t);this.timers.clear()}async start(){try{let t;this.multiTurn?(this.messageStream=new zr,this.messageStream.push(this.harness.buildUserMessage(this.prompt,"")),t=this.messageStream):t=this.prompt;let n=this.harness.launch({prompt:t,cwd:this.workdir,model:this.model,reasoningEffort:this.reasoningEffort,permissionMode:this.permissionMode,codexApprovalPolicy:this.codexApprovalPolicy,systemPrompt:this.systemPrompt,allowedTools:this.allowedTools,resumeSessionId:this.resumeSessionId,forkSession:this.forkSession,abortController:this.abortController,mcpServers:bi()});this.harnessHandle=n,this.setTimer("startup",Al,()=>{this._status==="starting"&&this.kill("startup-timeout")})}catch(t){let n=t instanceof Error?t.message:String(t);this.transitionToTerminal("failed",{error:n});return}this.consumeMessages(this.harnessHandle.messages).catch(t=>{let n=t instanceof Error?t.message:String(t),r=t instanceof Error?t.stack:void 0;console.error(`[Session ${this.id}] consumeMessages error: ${n}`,r),this.isActive&&this.transitionToTerminal("failed",{error:n})})}async sendMessage(t){if(this._status!=="running")throw new Error(`Session is not running (status: ${this._status})`);this.resetIdleTimer(),this.waitingForInputFired=!1,this.turnInProgress=!0;let n=t;if(this.pendingModeSwitch){let r=this.pendingModeSwitch,o=!1,i=!1;if(this.harnessHandle?.setPermissionMode)try{await this.harnessHandle.setPermissionMode(r),this.currentPermissionMode=r,this.pendingModeSwitch=void 0,i=!0,o=!0}catch(s){throw console.error(`[Session ${this.id}] setPermissionMode(${r}) FAILED: ${Vn(s)}`),this.pendingPlanApproval=!0,new Error(`Failed to switch permission mode to ${r}: ${Vn(s)}`)}else this.pendingModeSwitch=void 0,i=!0,o=!0,console.warn(`[Session ${this.id}] Cannot call setPermissionMode \u2014 falling back to text prefix only (currentPermissionMode remains ${this.currentPermissionMode})`);i&&(this.pendingPlanApproval=!1,r!=="plan"&&(this.planModeApproved=!0)),o&&(n=`[SYSTEM: The user has approved your plan. Exit plan mode immediately and implement the changes with full permissions. Do not ask for further confirmation.]
45
45
 
46
- ${t}`)}else if(this.pendingPlanApproval&&!this.planModeApproved){let n=this.harness.planApprovalToolNames;if(r=`[SYSTEM: The user wants changes to your plan. Revise the plan based on their feedback below,${n.length>0?` then call ${n.join(" or ")} again to re-submit for approval.`:" then re-submit your revised plan for approval."} Do NOT start implementing yet.]
46
+ ${t}`)}else if(this.pendingPlanApproval&&!this.planModeApproved){let r=this.harness.planApprovalToolNames;if(n=`[SYSTEM: The user wants changes to your plan. Revise the plan based on their feedback below,${r.length>0?` then call ${r.join(" or ")} again to re-submit for approval.`:" then re-submit your revised plan for approval."} Do NOT start implementing yet.]
47
47
 
48
- ${t}`,this.harnessHandle?.setPermissionMode)try{await this.harnessHandle.setPermissionMode("plan"),this.currentPermissionMode="plan"}catch(s){console.warn(`[Session ${this.id}] Failed to re-assert plan mode: ${Nr(s)}`)}}if(this.multiTurn&&this.messageStream)this.messageStream.push(this.harness.buildUserMessage(r,this.harnessSessionId??""));else if(this.harnessHandle?.streamInput){let n=this.harness.buildUserMessage(r,this.harnessSessionId??"");async function*o(){yield n}await this.harnessHandle.streamInput(o())}else throw new Error("Session does not support follow-up messages (launched in single-turn mode).")}async interrupt(){this.harnessHandle?.interrupt&&await this.harnessHandle.interrupt()}switchPermissionMode(t){this.pendingModeSwitch=t}get isActive(){return this._status==="starting"||this._status==="running"}kill(t){this.transitionToTerminal("killed",{reason:t})}complete(t="done"){this.transitionToTerminal("completed",{reason:t})}incrementAutoRespond(){this.autoRespondCount++}resetAutoRespond(){this.autoRespondCount=0}getOutput(t){return t===void 0?this.outputBuffer.slice():this.outputBuffer.slice(-t)}resetIdleTimer(){if(!this.multiTurn)return;let t=(h.idleTimeoutMinutes??15)*60*1e3;this.setTimer("idle",t,()=>{this._status==="running"&&this.kill("idle-timeout")})}teardown(){this.clearAllTimers(),this.completedAt||(this.completedAt=Date.now()),this.messageStream&&this.messageStream.end(),this.harnessHandle?.interrupt&&this.harnessHandle.interrupt().catch(t=>{console.warn(`[Session ${this.id}] interrupt during teardown failed: ${Nr(t)}`)}),this.abortController.abort()}transitionToTerminal(t,r={}){this.isActive&&(r.reason&&(this.killReason=r.reason),r.error!==void 0&&(this.error=r.error),this.completedAt=Date.now(),this.transition(t),this.teardown())}async consumeMessages(t){for await(let r of t){if(!this.isActive)break;if(this.resetIdleTimer(),r.type==="init")this.clearTimer("startup"),this.harnessSessionId=r.session_id,this._status==="starting"&&this.transition("running");else if(r.type==="text")this.waitingForInputFired=!1,this.pendingPlanApproval||(this.lastTurnHadQuestion=!1),this.outputBuffer.push(r.text),this.outputBuffer.length>Qi&&this.outputBuffer.splice(0,this.outputBuffer.length-Qi),this.emit("output",this,r.text);else if(r.type==="tool_use")this.harness.questionToolNames.includes(r.name)?(this.lastTurnHadQuestion=!0,this.currentPermissionMode==="plan"&&!this.planModeApproved&&(this.pendingPlanApproval=!0)):this.harness.planApprovalToolNames.includes(r.name)&&!this.planModeApproved&&(this.lastTurnHadQuestion=!0,this.pendingPlanApproval=!0),this.emit("toolUse",this,r.name,r.input);else if(r.type==="permission_mode_change"){let n=this.currentPermissionMode;this.currentPermissionMode=r.mode,r.mode!=="plan"&&n==="plan"&&!this.planModeApproved&&(this.pendingPlanApproval=!0,this.lastTurnHadQuestion=!0)}else if(r.type==="result"){if(this.result={subtype:r.data.success?"success":"error",duration_ms:r.data.duration_ms,total_cost_usd:r.data.total_cost_usd,num_turns:r.data.num_turns,result:r.data.result,is_error:!r.data.success,session_id:r.data.session_id},this.costUsd=r.data.total_cost_usd,this.multiTurn&&this.messageStream&&r.data.success){this.resetIdleTimer(),this.currentPermissionMode==="plan"&&!this.pendingPlanApproval&&!this.planModeApproved&&(this.pendingPlanApproval=!0);let o=this.pendingPlanApproval||this.lastTurnHadQuestion,s=this.messageStream?.hasPending()===!0;o&&!this.waitingForInputFired?(this.waitingForInputFired=!0,this.emit("turnEnd",this,!0)):s||o||(this.emit("turnEnd",this,!1),this.complete("done"))}else this.transitionToTerminal(r.data.success?"completed":"failed");this.lastTurnHadQuestion=!1}else r.type}}};import{mkdirSync as gl,readFileSync as Il,readdirSync as hl,renameSync as yl,statSync as xl,unlinkSync as Sl,writeFileSync as Zi}from"fs";import{homedir as Tl,tmpdir as ea}from"os";import{dirname as bl,join as Kr}from"path";function Al(e){let t=e.OPENCLAW_HOME?.trim();return t||Kr(Tl(),".openclaw")}function wl(e){let t=e.OPENCLAW_CODE_AGENT_SESSIONS_PATH?.trim();return t||Kr(Al(e),"code-agent-sessions.json")}var Pl=new Set(["completed","failed","killed"]),Ol=new Set(["running","completed","failed","killed"]),Rl=1440*60*1e3;function ta(e){return e instanceof Error?e.message:String(e)}function Cl(e){return!!e&&typeof e=="object"}function vr(e,t=""){return typeof e=="string"&&e.trim().length>0?e:t}function pt(e){return typeof e=="string"&&e.trim().length>0?e:void 0}function ra(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Ml(e){return e==="low"||e==="medium"||e==="high"?e:void 0}function kl(e){return e==="default"||e==="plan"||e==="acceptEdits"||e==="bypassPermissions"?e:void 0}function El(e){return e==="never"||e==="on-request"?e:void 0}function Fl(e){return e==="user"||e==="idle-timeout"||e==="startup-timeout"||e==="shutdown"||e==="done"||e==="unknown"?e:void 0}function $l(e){if(typeof e=="string"&&Ol.has(e))return e==="running"?"killed":e}function Ul(e){if(!Cl(e))return;let t=vr(e.harnessSessionId);if(!t)return;let r=$l(e.status);if(r)return{sessionId:pt(e.sessionId),harnessSessionId:t,name:vr(e.name,t),prompt:vr(e.prompt),workdir:vr(e.workdir,"(unknown)"),model:pt(e.model),reasoningEffort:Ml(e.reasoningEffort),createdAt:ra(e.createdAt),completedAt:ra(e.completedAt),status:r,killReason:Fl(e.killReason),costUsd:typeof e.costUsd=="number"&&Number.isFinite(e.costUsd)?e.costUsd:0,originAgentId:pt(e.originAgentId),originChannel:pt(e.originChannel),originThreadId:typeof e.originThreadId=="string"||typeof e.originThreadId=="number"?e.originThreadId:void 0,originSessionKey:pt(e.originSessionKey),outputPath:pt(e.outputPath),harness:pt(e.harness),currentPermissionMode:kl(e.currentPermissionMode),codexApprovalPolicy:El(e.codexApprovalPolicy)}}var Lr=class{persisted=new Map;idIndex=new Map;nameIndex=new Map;indexPath;constructor(t={}){let r=t.env??process.env;this.indexPath=t.indexPath??wl(r),r.OPENCLAW_DEBUG_SESSION_STORE==="1"&&console.warn(`[SessionStore] index path: ${this.indexPath}`),this.loadIndex()}loadIndex(){try{let t=Il(this.indexPath,"utf-8"),r=JSON.parse(t);if(!Array.isArray(r))return;let n=!1;for(let o of r){let s=Ul(o);if(!s){n=!0;continue}this.persisted.set(s.harnessSessionId,s),s.sessionId&&this.idIndex.set(s.sessionId,s.harnessSessionId),s.name&&this.nameIndex.set(s.name,s.harnessSessionId)}n&&this.saveIndex()}catch{}}saveIndex(){try{gl(bl(this.indexPath),{recursive:!0});let t=this.indexPath+".tmp";Zi(t,JSON.stringify([...this.persisted.values()],null,2),"utf-8"),yl(t,this.indexPath)}catch(t){console.warn(`[SessionStore] Failed to save session index: ${ta(t)}`)}}markRunning(t){if(!t.harnessSessionId)return;let r={sessionId:t.id,harnessSessionId:t.harnessSessionId,name:t.name,prompt:t.prompt,workdir:t.workdir,model:t.model,reasoningEffort:t.reasoningEffort,createdAt:t.startedAt,status:"running",costUsd:0,originAgentId:t.originAgentId,originChannel:t.originChannel,originThreadId:t.originThreadId,originSessionKey:t.originSessionKey,harness:t.harnessName,currentPermissionMode:t.currentPermissionMode,codexApprovalPolicy:t.codexApprovalPolicy};this.persisted.set(r.harnessSessionId,r),this.idIndex.set(t.id,r.harnessSessionId),this.nameIndex.set(t.name,r.harnessSessionId),this.saveIndex()}hasRecordedSession(t){return this.idIndex.has(t)}persistTerminal(t){if(!t.harnessSessionId)return;let r;try{let o=Kr(ea(),`openclaw-agent-${t.id}.txt`),s=t.getOutput().join(`
49
- `);s.length>0&&(Zi(o,s,"utf-8"),r=o)}catch(o){console.warn(`[SessionStore] Failed to write output file for session ${t.id}: ${ta(o)}`)}let n={sessionId:t.id,harnessSessionId:t.harnessSessionId,name:t.name,prompt:t.prompt,workdir:t.workdir,model:t.model,reasoningEffort:t.reasoningEffort,createdAt:t.startedAt,completedAt:t.completedAt,status:t.status,killReason:t.killReason,costUsd:t.costUsd,originAgentId:t.originAgentId,originChannel:t.originChannel,originThreadId:t.originThreadId,originSessionKey:t.originSessionKey,outputPath:r,harness:t.harnessName,currentPermissionMode:t.currentPermissionMode,codexApprovalPolicy:t.codexApprovalPolicy};this.persisted.set(t.harnessSessionId,n),this.idIndex.set(t.id,t.harnessSessionId),this.nameIndex.set(t.name,t.harnessSessionId),this.saveIndex()}getLatestPersistedByName(t){let r,n=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,s=Number.NEGATIVE_INFINITY,i=0;for(let m of this.persisted.values()){if(m.name!==t){i++;continue}let p=m.createdAt??Number.NEGATIVE_INFINITY,f=m.completedAt??Number.NEGATIVE_INFINITY;(p>n||p===n&&f>o||p===n&&f===o&&i>s)&&(r=m,n=p,o=f,s=i),i++}return r}resolveHarnessSessionId(t,r){if(r)return r;let n=this.idIndex.get(t);if(n&&this.persisted.has(n))return n;let o=this.getLatestPersistedByName(t);if(o)return o.harnessSessionId;if(this.persisted.has(t)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t))return t}getPersistedSession(t){let r=this.persisted.get(t);if(r)return r;let n=this.idIndex.get(t);return n?this.persisted.get(n):this.getLatestPersistedByName(t)}listPersistedSessions(){return[...this.persisted.values()].sort((t,r)=>(r.completedAt??0)-(t.completedAt??0))}cleanupTmpOutputFiles(t){try{let r=ea(),n=hl(r).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of n)try{let s=Kr(r,o),i=xl(s).mtimeMs;t-i>Rl&&Sl(s)}catch{}}catch{}}evictOldestPersisted(t){let r=this.listPersistedSessions();if(r.length<=t)return;let n=r.slice(t);for(let o of n){this.persisted.delete(o.harnessSessionId);for(let[s,i]of this.idIndex)i===o.harnessSessionId&&this.idIndex.delete(s);for(let[s,i]of this.nameIndex)i===o.harnessSessionId&&this.nameIndex.delete(s)}this.saveIndex()}shouldGcActiveSession(t,r,n){return!t.completedAt||!Pl.has(t.status)?!1:r-t.completedAt>n}};var Nl=new Set(["completed","failed","killed"]),jr=class{metrics={totalCostUsd:0,costPerDay:new Map,sessionsByStatus:{completed:0,failed:0,killed:0},totalLaunched:0,totalDurationMs:0,sessionsWithDuration:0,mostExpensive:null};incrementLaunched(){this.metrics.totalLaunched++}recordSession(t){let r=t.costUsd??0,n=t.status;this.metrics.totalCostUsd+=r;let o=new Date(t.completedAt??t.startedAt).toISOString().slice(0,10);if(this.metrics.costPerDay.set(o,(this.metrics.costPerDay.get(o)??0)+r),Nl.has(n)&&this.metrics.sessionsByStatus[n]++,t.completedAt){let s=t.completedAt-t.startedAt;this.metrics.totalDurationMs+=s,this.metrics.sessionsWithDuration++}(!this.metrics.mostExpensive||r>this.metrics.mostExpensive.costUsd)&&(this.metrics.mostExpensive={id:t.id,name:t.name,costUsd:r,prompt:Ze(t.prompt,80)})}getMetrics(){return{totalCostUsd:this.metrics.totalCostUsd,costPerDay:new Map(this.metrics.costPerDay),sessionsByStatus:{...this.metrics.sessionsByStatus},totalLaunched:this.metrics.totalLaunched,totalDurationMs:this.metrics.totalDurationMs,sessionsWithDuration:this.metrics.sessionsWithDuration,mostExpensive:this.metrics.mostExpensive?{...this.metrics.mostExpensive}:null}}};import{execFile as _l}from"child_process";import{randomUUID as vl}from"crypto";var na=3e4,Kl=2e3,Ll=2e4,Dr=4,Gr=class{pendingRetryTimers=new Set;clearPendingRetries(){for(let t of this.pendingRetryTimers)clearTimeout(t);this.pendingRetryTimers.clear()}getOriginSessionKey(t){let r=t.originSessionKey?.trim();return r||void 0}getOriginThreadId(t){let r=t.originThreadId;return r==null?void 0:String(r).trim()||void 0}parseNotificationRoute(t){let r=t.originChannel?.trim(),n=this.getOriginThreadId(t);if(r){let i=r.split("|").map(m=>m.trim()).filter(Boolean);if(i.length>=2){let[m,p,f]=i,A=f??p,_=f?p:void 0;if(m&&A)return{channel:m,target:A,accountId:_,threadId:n??this.parseThreadIdFromSessionKey(t.originSessionKey)}}}let o=this.getOriginSessionKey(t);if(!o)return;let s=o.match(/^agent:[^:]+:telegram:(?:direct|dm|group|channel):([^:]+)(?::topic:(\d+))?$/i);if(s?.[1])return{channel:"telegram",target:s[1],threadId:n??s[2]}}parseThreadIdFromSessionKey(t){return t?t.match(/:topic:(\d+)$/)?.[1]:void 0}retryDelayMs(t){let r=Math.max(0,t-1),n=Kl*2**r;return Math.min(n,Ll)}executeWithRetries(t,r,n=1){let o=Date.now();console.info(`[WakeDispatcher] ${r.target} ${r.phase} started attempt ${n}/${Dr} for ${r.label} session=${r.sessionId}`),_l("openclaw",t,{timeout:na},s=>{let i=Date.now()-o;if(!s){console.info(`[WakeDispatcher] ${r.target} ${r.phase} completed attempt ${n}/${Dr} for ${r.label} session=${r.sessionId} in ${i}ms`);return}let m=`[WakeDispatcher] ${r.target} ${r.phase} failed`;if(n>=Dr){console.error(`${m} after ${n} attempts for ${r.label} session=${r.sessionId} in ${i}ms: ${s.message}`),r.onFinalFailure?.();return}let p=this.retryDelayMs(n);console.error(`${m} attempt ${n}/${Dr} for ${r.label} session=${r.sessionId} in ${i}ms: ${s.message}. Retrying in ${p}ms`);let f=setTimeout(()=>{this.pendingRetryTimers.delete(f),this.executeWithRetries(t,r,n+1)},p);this.pendingRetryTimers.add(f)})}fireChatSendWithRetry(t,r,n,o,s,i=!1,m){let p=["gateway","call","chat.send","--expect-final","--timeout",String(na),"--params",JSON.stringify({sessionKey:t,message:r,deliver:i,idempotencyKey:vl()})];this.executeWithRetries(p,{label:n,sessionId:o,target:"chat.send",phase:s,onFinalFailure:m})}fireDirectNotificationWithRetry(t,r,n,o,s){let i=["message","send","--channel",t.channel,"--target",t.target,"--message",r];t.accountId&&i.push("--account",t.accountId),t.threadId&&i.push("--thread-id",t.threadId),this.executeWithRetries(i,{label:n,sessionId:o,target:"message.send",phase:"notify",onFinalFailure:s})}fireSystemEventWithRetry(t,r,n,o){let s=["system","event","--text",t,"--mode","now"];this.executeWithRetries(s,{label:r,sessionId:n,target:"system.event",phase:o})}sendUserNotification(t,r,n,o){let s=this.parseNotificationRoute(t);if(!s){this.fireSystemEventWithRetry(r,`${n}-notify-system`,o,"notify");return}this.fireDirectNotificationWithRetry(s,r,`${n}-notify`,o,()=>{this.fireSystemEventWithRetry(r,`${n}-notify-fallback`,o,"notify")})}dispatchSessionNotification(t,r){let n=this.getOriginSessionKey(t),o=r.notifyUser??(r.wakeMessage?"on-wake-fallback":"always"),s=r.userMessage?.trim(),i=r.wakeMessage?.trim();if(o==="always"&&s&&this.sendUserNotification(t,s,r.label,t.id),!!i){if(!n){o==="on-wake-fallback"&&s&&this.sendUserNotification(t,s,r.label,t.id),this.fireSystemEventWithRetry(i,`${r.label}-wake-system`,t.id,"wake");return}this.fireChatSendWithRetry(n,i,`${r.label}-wake`,t.id,"wake",!0,()=>{this.fireSystemEventWithRetry(i,`${r.label}-wake-fallback`,t.id,"wake")})}}};function Gl(){let e=process.env.OPENCLAW_CODE_AGENT_PLAN_WORKFLOW_PATH?.trim();if(e)return e;let t=Dl(sa(import.meta.url)),r=[Dn(process.cwd(),"workflows","plan-approval.lobster"),Dn(t,"..","workflows","plan-approval.lobster"),Dn(t,"..","..","workflows","plan-approval.lobster")];for(let n of r)if(jl(n))return n;return sa(new URL("../workflows/plan-approval.lobster",import.meta.url))}var Vl=Gl(),Bl=new Set(["completed","failed","killed"]),Vr=new Set(["starting","running"]),Hl=5e3,Wl=3e4;function ql(e){let t=e.trim();if(!t)return;let r=s=>typeof s=="string"&&s.trim().length>0&&/^[A-Za-z0-9._:-]+$/.test(s.trim()),n=[t];for(let s of t.split(/\r?\n/)){let i=s.trim();i.startsWith("{")&&i.endsWith("}")&&n.push(i)}for(let s of n)try{let i=JSON.parse(s),m=i?.resumeToken??i?.requiresApproval?.resumeToken??i?.details?.requiresApproval?.resumeToken;if(r(m))return m.trim()}catch{}let o=t.match(/"resumeToken"\s*:\s*"([^"]+)"/);if(o&&r(o[1]))return o[1].trim()}var Br=class{sessions=new Map;maxSessions;maxPersistedSessions;lastWaitingEventTimestamps=new Map;lastTurnCompleteMarkers=new Map;lastTerminalWakeMarkers=new Map;store;metrics;wakeDispatcher;constructor(t=20,r=50){this.maxSessions=t,this.maxPersistedSessions=r,this.store=new Lr,this.metrics=new jr,this.wakeDispatcher=new Gr}get persisted(){return this.store.persisted}get idIndex(){return this.store.idIndex}get nameIndex(){return this.store.nameIndex}uniqueName(t){let r=new Set([...this.sessions.values()].filter(o=>Vr.has(o.status)).map(o=>o.name));if(!r.has(t))return t;let n=2;for(;r.has(`${t}-${n}`);)n++;return`${t}-${n}`}spawn(t){if([...this.sessions.values()].filter(m=>Vr.has(m.status)).length>=this.maxSessions)throw new Error(`Max sessions reached (${this.maxSessions}). Use agent_sessions to list active sessions and agent_kill to end one.`);let n=t.name||yi(t.prompt),o=this.uniqueName(n);o!==n&&console.warn(`[SessionManager] Name conflict: "${n}" \u2192 "${o}" (active session with same name exists)`);let s=new _r(t,o);this.sessions.set(s.id,s),this.metrics.incrementLaunched(),s.on("statusChange",(m,p)=>{p==="running"&&s.harnessSessionId?this.store.markRunning(s):Bl.has(p)&&this.onSessionTerminal(s)}),s.on("turnEnd",(m,p)=>{this.onTurnEnd(s,p)}),s.start();let i=`\u{1F680} [${s.name}] Launched | ${s.workdir} | ${s.model??"default"}`;return this.notifySession(s,i,"launch"),s}onSessionTerminal(t){if(this.persistSession(t),this.lastWaitingEventTimestamps.delete(t.id),t.killReason==="done")return;if(t.status==="completed"){if(!this.shouldEmitTerminalWake(t))return;this.triggerAgentEvent(t);return}if(t.status==="failed"){if(!this.shouldEmitTerminalWake(t))return;let m=t.error||t.result?.is_error&&t.result.result||t.result?.result||this.extractLastOutputLine(t)||`Session failed with no error details (session=${t.id}, subtype=${t.result?.subtype??"none"}, turns=${t.result?.num_turns??0})`,p=Ze(m,200);this.triggerFailedEvent(t,p);return}let r=`$${(t.costUsd??0).toFixed(2)}`,n=_e(t.duration),s={user:"by agent/user","idle-timeout":`idle ${h.idleTimeoutMinutes??15}min`,shutdown:"gateway shutdown",unknown:""}[t.killReason]||"",i=`Killed${s?` (${s})`:""}`;this.notifySession(t,`\u26D4 [${t.name}] ${i} | ${r} | ${n}`)}persistSession(t){this.store.hasRecordedSession(t.id)||this.metrics.recordSession(t),this.store.persistTerminal(t)}getMetrics(){return this.metrics.getMetrics()}recordSessionMetrics(t){this.metrics.recordSession(t)}notifySession(t,r,n="notification"){this.dispatchSessionNotification(t,{label:n,userMessage:r,notifyUser:"always"})}dispatchSessionNotification(t,r){this.wakeDispatcher.dispatchSessionNotification(t,r)}runLobsterApproval(t,r){let n=JSON.stringify({session_id:t.id,session_name:t.name,plan_summary:r}),o=["--json","invoke","--tool","lobster","--args-json",JSON.stringify({action:"run",pipeline:Vl,argsJson:n,timeoutMs:0})];oa("openclaw",o,{timeout:Wl},(s,i,m)=>{if(s){console.error(`[SessionManager] Lobster launch failed for session=${t.id}: ${s.message}`),this.notifySession(t,`\u{1F4CB} [${t.name}] Plan ready \u2014 Lobster gate failed, please review manually:
48
+ ${t}`,this.harnessHandle?.setPermissionMode)try{await this.harnessHandle.setPermissionMode("plan"),this.currentPermissionMode="plan"}catch(i){console.warn(`[Session ${this.id}] Failed to re-assert plan mode: ${Vn(i)}`)}}if(this.multiTurn&&this.messageStream)this.messageStream.push(this.harness.buildUserMessage(n,this.harnessSessionId??""));else if(this.harnessHandle?.streamInput){let r=this.harness.buildUserMessage(n,this.harnessSessionId??"");async function*o(){yield r}await this.harnessHandle.streamInput(o())}else throw new Error("Session does not support follow-up messages (launched in single-turn mode).")}async interrupt(){return!this.turnInProgress||!this.harnessHandle?.interrupt?!1:(await this.harnessHandle.interrupt(),!0)}switchPermissionMode(t){this.pendingModeSwitch=t}get isActive(){return this._status==="starting"||this._status==="running"}kill(t){this.transitionToTerminal("killed",{reason:t})}complete(t="done"){this.transitionToTerminal("completed",{reason:t})}incrementAutoRespond(){this.autoRespondCount++}resetAutoRespond(){this.autoRespondCount=0}getOutput(t){return t===void 0?this.outputBuffer.slice():this.outputBuffer.slice(-t)}resetIdleTimer(){if(!this.multiTurn)return;let t=(F.idleTimeoutMinutes??15)*60*1e3;this.setTimer("idle",t,()=>{this._status==="running"&&this.kill("idle-timeout")})}teardown(){this.clearAllTimers(),this.completedAt||(this.completedAt=Date.now()),this.messageStream&&this.messageStream.end(),this.harnessHandle?.interrupt&&this.harnessHandle.interrupt().catch(t=>{console.warn(`[Session ${this.id}] interrupt during teardown failed: ${Vn(t)}`)}),this.abortController.abort()}transitionToTerminal(t,n={}){this.isActive&&(this.turnInProgress=!1,n.reason&&(this.killReason=n.reason),n.error!==void 0&&(this.error=n.error),this.completedAt=Date.now(),this.transition(t),this.teardown())}async consumeMessages(t){for await(let n of t){if(!this.isActive)break;if(this.resetIdleTimer(),n.type==="init")this.clearTimer("startup"),this.harnessSessionId=n.session_id,this._status==="starting"&&this.transition("running");else if(n.type==="text")this.waitingForInputFired=!1,this.pendingPlanApproval||(this.lastTurnHadQuestion=!1),this.outputBuffer.push(n.text),this.outputBuffer.length>ua&&this.outputBuffer.splice(0,this.outputBuffer.length-ua),this.emit("output",this,n.text);else if(n.type==="tool_use")this.harness.questionToolNames.includes(n.name)?(this.lastTurnHadQuestion=!0,this.currentPermissionMode==="plan"&&!this.planModeApproved&&(this.pendingPlanApproval=!0)):this.harness.planApprovalToolNames.includes(n.name)&&!this.planModeApproved&&(this.lastTurnHadQuestion=!0,this.pendingPlanApproval=!0),this.emit("toolUse",this,n.name,n.input);else if(n.type==="permission_mode_change"){let r=this.currentPermissionMode;this.currentPermissionMode=n.mode,n.mode!=="plan"&&r==="plan"&&!this.planModeApproved&&(this.pendingPlanApproval=!0,this.lastTurnHadQuestion=!0)}else if(n.type==="result"){if(this.result={subtype:n.data.success?"success":"error",duration_ms:n.data.duration_ms,total_cost_usd:n.data.total_cost_usd,num_turns:n.data.num_turns,result:n.data.result,is_error:!n.data.success,session_id:n.data.session_id},this.costUsd=n.data.total_cost_usd,this.multiTurn&&this.messageStream&&n.data.success){this.resetIdleTimer(),this.currentPermissionMode==="plan"&&!this.pendingPlanApproval&&!this.planModeApproved&&(this.pendingPlanApproval=!0);let o=this.pendingPlanApproval||this.lastTurnHadQuestion,i=this.messageStream?.hasPending()===!0;this.turnInProgress=i,o&&!this.waitingForInputFired?(this.waitingForInputFired=!0,this.emit("turnEnd",this,!0)):i||o||(this.emit("turnEnd",this,!1),this.complete("done"))}else this.turnInProgress=!1,this.transitionToTerminal(n.data.success?"completed":"failed");this.lastTurnHadQuestion=!1}else n.type}}};import{mkdirSync as Rl,readFileSync as Ol,readdirSync as Cl,renameSync as Ml,statSync as El,unlinkSync as Fl,writeFileSync as da}from"fs";import{homedir as kl,tmpdir as ca}from"os";import{dirname as $l,join as Wn}from"path";function vl(e){let t=e.OPENCLAW_HOME?.trim();return t||Wn(kl(),".openclaw")}function Nl(e){let t=e.OPENCLAW_CODE_AGENT_SESSIONS_PATH?.trim();return t||Wn(vl(e),"code-agent-sessions.json")}var Ul=new Set(["completed","failed","killed"]),_l=new Set(["running","completed","failed","killed"]),Ll=1440*60*1e3;function ma(e){return e instanceof Error?e.message:String(e)}function Kl(e){return!!e&&typeof e=="object"}function Bn(e,t=""){return typeof e=="string"&&e.trim().length>0?e:t}function ht(e){return typeof e=="string"&&e.trim().length>0?e:void 0}function pa(e){return typeof e=="number"&&Number.isFinite(e)?e:void 0}function Dl(e){return e==="low"||e==="medium"||e==="high"?e:void 0}function jl(e){return e==="default"||e==="plan"||e==="acceptEdits"||e==="bypassPermissions"?e:void 0}function Gl(e){return e==="never"||e==="on-request"?e:void 0}function Vl(e){return e==="user"||e==="idle-timeout"||e==="startup-timeout"||e==="shutdown"||e==="done"||e==="unknown"?e:void 0}function Hl(e){if(typeof e=="string"&&_l.has(e))return e==="running"?"killed":e}function Bl(e){if(!Kl(e))return;let t=Bn(e.harnessSessionId);if(!t)return;let n=Hl(e.status);if(n)return{sessionId:ht(e.sessionId),harnessSessionId:t,name:Bn(e.name,t),prompt:Bn(e.prompt),workdir:Bn(e.workdir,"(unknown)"),model:ht(e.model),reasoningEffort:Dl(e.reasoningEffort),createdAt:pa(e.createdAt),completedAt:pa(e.completedAt),status:n,killReason:Vl(e.killReason),costUsd:typeof e.costUsd=="number"&&Number.isFinite(e.costUsd)?e.costUsd:0,originAgentId:ht(e.originAgentId),originChannel:ht(e.originChannel),originThreadId:typeof e.originThreadId=="string"||typeof e.originThreadId=="number"?e.originThreadId:void 0,originSessionKey:ht(e.originSessionKey),outputPath:ht(e.outputPath),harness:ht(e.harness),currentPermissionMode:jl(e.currentPermissionMode),codexApprovalPolicy:Gl(e.codexApprovalPolicy)}}var qn=class{persisted=new Map;idIndex=new Map;nameIndex=new Map;indexPath;constructor(t={}){let n=t.env??process.env;this.indexPath=t.indexPath??Nl(n),n.OPENCLAW_DEBUG_SESSION_STORE==="1"&&console.warn(`[SessionStore] index path: ${this.indexPath}`),this.loadIndex()}loadIndex(){try{let t=Ol(this.indexPath,"utf-8"),n=JSON.parse(t);if(!Array.isArray(n))return;let r=!1;for(let o of n){let i=Bl(o);if(!i){r=!0;continue}this.persisted.set(i.harnessSessionId,i),i.sessionId&&this.idIndex.set(i.sessionId,i.harnessSessionId),i.name&&this.nameIndex.set(i.name,i.harnessSessionId)}r&&this.saveIndex()}catch{}}saveIndex(){try{Rl($l(this.indexPath),{recursive:!0});let t=this.indexPath+".tmp";da(t,JSON.stringify([...this.persisted.values()],null,2),"utf-8"),Ml(t,this.indexPath)}catch(t){console.warn(`[SessionStore] Failed to save session index: ${ma(t)}`)}}markRunning(t){if(!t.harnessSessionId)return;let n={sessionId:t.id,harnessSessionId:t.harnessSessionId,name:t.name,prompt:t.prompt,workdir:t.workdir,model:t.model,reasoningEffort:t.reasoningEffort,createdAt:t.startedAt,status:"running",costUsd:0,originAgentId:t.originAgentId,originChannel:t.originChannel,originThreadId:t.originThreadId,originSessionKey:t.originSessionKey,harness:t.harnessName,currentPermissionMode:t.currentPermissionMode,codexApprovalPolicy:t.codexApprovalPolicy};this.persisted.set(n.harnessSessionId,n),this.idIndex.set(t.id,n.harnessSessionId),this.nameIndex.set(t.name,n.harnessSessionId),this.saveIndex()}hasRecordedSession(t){return this.idIndex.has(t)}persistTerminal(t){if(!t.harnessSessionId)return;let n;try{let o=Wn(ca(),`openclaw-agent-${t.id}.txt`),i=t.getOutput().join(`
49
+ `);i.length>0&&(da(o,i,"utf-8"),n=o)}catch(o){console.warn(`[SessionStore] Failed to write output file for session ${t.id}: ${ma(o)}`)}let r={sessionId:t.id,harnessSessionId:t.harnessSessionId,name:t.name,prompt:t.prompt,workdir:t.workdir,model:t.model,reasoningEffort:t.reasoningEffort,createdAt:t.startedAt,completedAt:t.completedAt,status:t.status,killReason:t.killReason,costUsd:t.costUsd,originAgentId:t.originAgentId,originChannel:t.originChannel,originThreadId:t.originThreadId,originSessionKey:t.originSessionKey,outputPath:n,harness:t.harnessName,currentPermissionMode:t.currentPermissionMode,codexApprovalPolicy:t.codexApprovalPolicy};this.persisted.set(t.harnessSessionId,r),this.idIndex.set(t.id,t.harnessSessionId),this.nameIndex.set(t.name,t.harnessSessionId),this.saveIndex()}getLatestPersistedByName(t){let n,r=Number.NEGATIVE_INFINITY,o=Number.NEGATIVE_INFINITY,i=Number.NEGATIVE_INFINITY,s=0;for(let c of this.persisted.values()){if(c.name!==t){s++;continue}let p=c.createdAt??Number.NEGATIVE_INFINITY,f=c.completedAt??Number.NEGATIVE_INFINITY;(p>r||p===r&&f>o||p===r&&f===o&&s>i)&&(n=c,r=p,o=f,i=s),s++}return n}resolveHarnessSessionId(t,n){if(n)return n;let r=this.idIndex.get(t);if(r&&this.persisted.has(r))return r;let o=this.getLatestPersistedByName(t);if(o)return o.harnessSessionId;if(this.persisted.has(t)||/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(t))return t}getPersistedSession(t){let n=this.persisted.get(t);if(n)return n;let r=this.idIndex.get(t);return r?this.persisted.get(r):this.getLatestPersistedByName(t)}listPersistedSessions(){return[...this.persisted.values()].sort((t,n)=>(n.completedAt??0)-(t.completedAt??0))}cleanupTmpOutputFiles(t){try{let n=ca(),r=Cl(n).filter(o=>o.startsWith("openclaw-agent-")&&o.endsWith(".txt"));for(let o of r)try{let i=Wn(n,o),s=El(i).mtimeMs;t-s>Ll&&Fl(i)}catch{}}catch{}}evictOldestPersisted(t){let n=this.listPersistedSessions();if(n.length<=t)return;let r=n.slice(t);for(let o of r){this.persisted.delete(o.harnessSessionId);for(let[i,s]of this.idIndex)s===o.harnessSessionId&&this.idIndex.delete(i);for(let[i,s]of this.nameIndex)s===o.harnessSessionId&&this.nameIndex.delete(i)}this.saveIndex()}shouldGcActiveSession(t,n,r){return!t.completedAt||!Ul.has(t.status)?!1:n-t.completedAt>r}};var Wl=new Set(["completed","failed","killed"]),zn=class{metrics={totalCostUsd:0,costPerDay:new Map,sessionsByStatus:{completed:0,failed:0,killed:0},totalLaunched:0,totalDurationMs:0,sessionsWithDuration:0,mostExpensive:null};incrementLaunched(){this.metrics.totalLaunched++}recordSession(t){let n=t.costUsd??0,r=t.status;this.metrics.totalCostUsd+=n;let o=new Date(t.completedAt??t.startedAt).toISOString().slice(0,10);if(this.metrics.costPerDay.set(o,(this.metrics.costPerDay.get(o)??0)+n),Wl.has(r)&&this.metrics.sessionsByStatus[r]++,t.completedAt){let i=t.completedAt-t.startedAt;this.metrics.totalDurationMs+=i,this.metrics.sessionsWithDuration++}(!this.metrics.mostExpensive||n>this.metrics.mostExpensive.costUsd)&&(this.metrics.mostExpensive={id:t.id,name:t.name,costUsd:n,prompt:rt(t.prompt,80)})}getMetrics(){return{totalCostUsd:this.metrics.totalCostUsd,costPerDay:new Map(this.metrics.costPerDay),sessionsByStatus:{...this.metrics.sessionsByStatus},totalLaunched:this.metrics.totalLaunched,totalDurationMs:this.metrics.totalDurationMs,sessionsWithDuration:this.metrics.sessionsWithDuration,mostExpensive:this.metrics.mostExpensive?{...this.metrics.mostExpensive}:null}}};import{execFile as ql}from"child_process";import{randomUUID as zl}from"crypto";var la=3e4,Yl=2e3,Jl=2e4,Yn=4,Jn=class{pendingRetryTimers=new Set;clearPendingRetries(){for(let t of this.pendingRetryTimers)clearTimeout(t);this.pendingRetryTimers.clear()}getOriginSessionKey(t){let n=t.originSessionKey?.trim();return n||void 0}getOriginThreadId(t){let n=t.originThreadId;return n==null?void 0:String(n).trim()||void 0}parseNotificationRoute(t){let n=t.originChannel?.trim(),r=this.getOriginThreadId(t);if(n){let s=n.split("|").map(c=>c.trim()).filter(Boolean);if(s.length>=2){let[c,p,f]=s,b=f??p,k=f?p:void 0;if(c&&b)return{channel:c,target:b,accountId:k,threadId:r??this.parseThreadIdFromSessionKey(t.originSessionKey)}}}let o=this.getOriginSessionKey(t);if(!o)return;let i=o.match(/^agent:[^:]+:telegram:(?:direct|dm|group|channel):([^:]+)(?::topic:(\d+))?$/i);if(i?.[1])return{channel:"telegram",target:i[1],threadId:r??i[2]}}parseThreadIdFromSessionKey(t){return t?t.match(/:topic:(\d+)$/)?.[1]:void 0}retryDelayMs(t){let n=Math.max(0,t-1),r=Yl*2**n;return Math.min(r,Jl)}executeWithRetries(t,n,r=1){let o=Date.now();console.info(`[WakeDispatcher] ${n.target} ${n.phase} started attempt ${r}/${Yn} for ${n.label} session=${n.sessionId}`),ql("openclaw",t,{timeout:la},i=>{let s=Date.now()-o;if(!i){console.info(`[WakeDispatcher] ${n.target} ${n.phase} completed attempt ${r}/${Yn} for ${n.label} session=${n.sessionId} in ${s}ms`);return}let c=`[WakeDispatcher] ${n.target} ${n.phase} failed`;if(r>=Yn){console.error(`${c} after ${r} attempts for ${n.label} session=${n.sessionId} in ${s}ms: ${i.message}`),n.onFinalFailure?.();return}let p=this.retryDelayMs(r);console.error(`${c} attempt ${r}/${Yn} for ${n.label} session=${n.sessionId} in ${s}ms: ${i.message}. Retrying in ${p}ms`);let f=setTimeout(()=>{this.pendingRetryTimers.delete(f),this.executeWithRetries(t,n,r+1)},p);this.pendingRetryTimers.add(f)})}fireChatSendWithRetry(t,n,r,o,i,s=!1,c){let p=["gateway","call","chat.send","--expect-final","--timeout",String(la),"--params",JSON.stringify({sessionKey:t,message:n,deliver:s,idempotencyKey:zl()})];this.executeWithRetries(p,{label:r,sessionId:o,target:"chat.send",phase:i,onFinalFailure:c})}fireDirectNotificationWithRetry(t,n,r,o,i){let s=["message","send","--channel",t.channel,"--target",t.target,"--message",n];t.accountId&&s.push("--account",t.accountId),t.threadId&&s.push("--thread-id",t.threadId),this.executeWithRetries(s,{label:r,sessionId:o,target:"message.send",phase:"notify",onFinalFailure:i})}fireSystemEventWithRetry(t,n,r,o){let i=["system","event","--text",t,"--mode","now"];this.executeWithRetries(i,{label:n,sessionId:r,target:"system.event",phase:o})}sendUserNotification(t,n,r,o){let i=this.parseNotificationRoute(t);if(!i){this.fireSystemEventWithRetry(n,`${r}-notify-system`,o,"notify");return}this.fireDirectNotificationWithRetry(i,n,`${r}-notify`,o,()=>{this.fireSystemEventWithRetry(n,`${r}-notify-fallback`,o,"notify")})}dispatchSessionNotification(t,n){let r=this.getOriginSessionKey(t),o=n.notifyUser??(n.wakeMessage?"on-wake-fallback":"always"),i=n.userMessage?.trim(),s=n.wakeMessage?.trim();if(o==="always"&&i&&this.sendUserNotification(t,i,n.label,t.id),!!s){if(!r){o==="on-wake-fallback"&&i&&this.sendUserNotification(t,i,n.label,t.id),this.fireSystemEventWithRetry(s,`${n.label}-wake-system`,t.id,"wake");return}this.fireChatSendWithRetry(r,s,`${n.label}-wake`,t.id,"wake",!0,()=>{this.fireSystemEventWithRetry(s,`${n.label}-wake-fallback`,t.id,"wake")})}}};function Zl(){let e=process.env.OPENCLAW_CODE_AGENT_PLAN_WORKFLOW_PATH?.trim();if(e)return e;let t=Ql(ga(import.meta.url)),n=[Yr(process.cwd(),"workflows","plan-approval.lobster"),Yr(t,"..","workflows","plan-approval.lobster"),Yr(t,"..","..","workflows","plan-approval.lobster")];for(let r of n)if(Xl(r))return r;return ga(new URL("../workflows/plan-approval.lobster",import.meta.url))}var ef=Zl(),Jr=new Set(["completed","failed","killed"]),Xn=new Set(["starting","running"]),tf=5e3,nf=3e4;function rf(e){let t=e.trim();if(!t)return;let n=i=>typeof i=="string"&&i.trim().length>0&&/^[A-Za-z0-9._:-]+$/.test(i.trim()),r=[t];for(let i of t.split(/\r?\n/)){let s=i.trim();s.startsWith("{")&&s.endsWith("}")&&r.push(s)}for(let i of r)try{let s=JSON.parse(i),c=s?.resumeToken??s?.requiresApproval?.resumeToken??s?.details?.requiresApproval?.resumeToken;if(n(c))return c.trim()}catch{}let o=t.match(/"resumeToken"\s*:\s*"([^"]+)"/);if(o&&n(o[1]))return o[1].trim()}var Qn=class{sessions=new Map;maxSessions;maxPersistedSessions;lastWaitingEventTimestamps=new Map;lastTurnCompleteMarkers=new Map;lastTerminalWakeMarkers=new Map;store;metrics;wakeDispatcher;constructor(t=20,n=50){this.maxSessions=t,this.maxPersistedSessions=n,this.store=new qn,this.metrics=new zn,this.wakeDispatcher=new Jn}get persisted(){return this.store.persisted}get idIndex(){return this.store.idIndex}get nameIndex(){return this.store.nameIndex}uniqueName(t){let n=new Set([...this.sessions.values()].filter(o=>Xn.has(o.status)).map(o=>o.name));if(!n.has(t))return t;let r=2;for(;n.has(`${t}-${r}`);)r++;return`${t}-${r}`}spawn(t,n={}){if([...this.sessions.values()].filter(c=>Xn.has(c.status)).length>=this.maxSessions)throw new Error(`Max sessions reached (${this.maxSessions}). Use agent_sessions to list active sessions and agent_kill to end one.`);let o=t.name||Ci(t.prompt),i=this.uniqueName(o);i!==o&&console.warn(`[SessionManager] Name conflict: "${o}" \u2192 "${i}" (active session with same name exists)`);let s=new Hn(t,i);if(this.sessions.set(s.id,s),this.metrics.incrementLaunched(),s.on("statusChange",(c,p)=>{p==="running"&&s.harnessSessionId?this.store.markRunning(s):Jr.has(p)&&this.onSessionTerminal(s)}),s.on("turnEnd",(c,p)=>{this.onTurnEnd(s,p)}),s.start(),n.notifyLaunch!==!1){let c=`\u{1F680} [${s.name}] Launched | ${s.workdir} | ${s.model??"default"}`;this.notifySession(s,c,"launch")}return s}async spawnAndAwaitRunning(t,n={}){let r=this.spawn(t,n);return await this.waitForRunningSession(r),r}async waitForRunningSession(t){if(t.status==="running")return;if(Jr.has(t.status))throw new Error(this.describeLaunchFailure(t));let n=t.on?.bind(t),r=t.off?.bind(t)??t.removeListener?.bind(t);if(!n||!r)throw new Error(`Session ${t.name} [${t.id}] did not expose lifecycle events during startup.`);await new Promise((o,i)=>{let s=(p,f)=>{if(f==="running"){c(),o();return}Jr.has(f)&&(c(),i(new Error(this.describeLaunchFailure(t))))},c=()=>{r("statusChange",s)};n("statusChange",s)})}describeLaunchFailure(t){let n=t.killReason?` (reason: ${t.killReason})`:"",r=t.error||t.result?.result||`status=${t.status}${n}`;return`Session ${t.name} [${t.id}] failed to start: ${r}`}onSessionTerminal(t){if(this.persistSession(t),this.lastWaitingEventTimestamps.delete(t.id),t.killReason==="done")return;if(t.status==="completed"){if(!this.shouldEmitTerminalWake(t))return;this.triggerAgentEvent(t);return}if(t.status==="failed"){if(!this.shouldEmitTerminalWake(t))return;let i=t.error||t.result?.is_error&&t.result.result||t.result?.result||this.extractLastOutputLine(t)||`Session failed with no error details (session=${t.id}, subtype=${t.result?.subtype??"none"}, turns=${t.result?.num_turns??0})`,s=rt(i,200);this.triggerFailedEvent(t,s);return}let n=`$${(t.costUsd??0).toFixed(2)}`,r=_e(t.duration);if(t.killReason==="idle-timeout"){this.notifySession(t,`\u{1F4A4} [${t.name}] Idle timeout | ${n} | ${r}`);return}let o=this.getStoppedStatusLabel(t.killReason);this.notifySession(t,`\u26D4 [${t.name}] ${o} | ${n} | ${r}`)}getStoppedStatusLabel(t){switch(t){case"user":return"Stopped by user";case"shutdown":return"Stopped by shutdown";case"startup-timeout":return"Stopped by startup timeout";case"unknown":case void 0:return"Stopped unexpectedly";default:return"Stopped"}}persistSession(t){this.store.hasRecordedSession(t.id)||this.metrics.recordSession(t),this.store.persistTerminal(t)}getMetrics(){return this.metrics.getMetrics()}recordSessionMetrics(t){this.metrics.recordSession(t)}notifySession(t,n,r="notification"){this.dispatchSessionNotification(t,{label:r,userMessage:n,notifyUser:"always"})}dispatchSessionNotification(t,n){this.wakeDispatcher.dispatchSessionNotification(t,n)}runLobsterApproval(t,n){let r=JSON.stringify({session_id:t.id,session_name:t.name,plan_summary:n}),o=["--json","invoke","--tool","lobster","--args-json",JSON.stringify({action:"run",pipeline:ef,argsJson:r,timeoutMs:0})];fa("openclaw",o,{timeout:nf},(i,s,c)=>{if(i){console.error(`[SessionManager] Lobster launch failed for session=${t.id}: ${i.message}`),this.notifySession(t,`\u{1F4CB} [${t.name}] Plan ready \u2014 Lobster gate failed, please review manually:
50
50
 
51
- ${Ze(r,800)}`);return}let p=typeof i=="string"?i:String(i??""),f=typeof m=="string"?m:String(m??""),A=ql(`${p}
52
- ${f}`);if(!A){let ie=`${p}
53
- ${f}`.trim().substring(0,200);console.warn(`[SessionManager] Lobster response missing resume token for session=${t.id}: ${ie}`)}A&&(t.lobsterResumeToken=A);let _=[`\u{1F4CB} [${t.name}] Plan ready for approval`,"",Ze(r,1200),"",`Session: ${t.name} (${t.id})`,"",'To approve: reply "approve"',"To reject: reply with feedback"];this.notifySession(t,_.join(`
54
- `))})}resumeLobsterApproval(t,r){let n=r?3e4:1e4;return new Promise((o,s)=>{let i=["--json","invoke","--tool","lobster","--args-json",JSON.stringify({action:"resume",token:t,approve:r})];oa("openclaw",i,{timeout:n},m=>{m?(console.error(`[SessionManager] Lobster resume failed (approve=${r}): ${m.message}`),s(m)):o()})})}debounceWaitingEvent(t){let r=Date.now(),n=this.lastWaitingEventTimestamps.get(t);return n&&r-n<Hl?!1:(this.lastWaitingEventTimestamps.set(t,r),!0)}originThreadLine(t){return t.originThreadId!=null?`Session origin thread: ${t.originThreadId}`:""}extractLastOutputLine(t){return t.getOutput(3).filter(o=>o.trim()).pop()?.trim()||void 0}getOutputPreview(t,r=1e3){let n=t.getOutput(20).join(`
55
- `);return n.length>r?Si(n,r):n}triggerAgentEvent(t){let r=this.getOutputPreview(t),n=["Coding agent session completed.",`Name: ${t.name} | ID: ${t.id}`,`Status: ${t.status}`,this.originThreadLine(t),"","Output preview:",r,"","[ACTION REQUIRED] Follow your autonomy rules for session completion:",`1. Use agent_output(session='${t.id}', full=true) to read the full result.`,"2. If this is part of a multi-phase pipeline, launch the next phase NOW \u2014 do not wait for user input.","3. Notify the user with a summary of what was done."].join(`
56
- `),o=`$${(t.costUsd??0).toFixed(2)}`,s=_e(t.duration),i=`\u2705 [${t.name}] Completed | ${o} | ${s}`;this.dispatchSessionNotification(t,{label:"completed",userMessage:i,wakeMessage:n,notifyUser:"always"})}triggerFailedEvent(t,r){let n=this.getOutputPreview(t),o=n.trim()?["","Output preview:",n]:[],s=["Coding agent session failed.",`Name: ${t.name} | ID: ${t.id}`,`Status: ${t.status}`,this.originThreadLine(t),"","Failure summary:",r,...o,"","[ACTION REQUIRED] Follow your autonomy rules for session failure:",`1. Use agent_output(session='${t.id}', full=true) to inspect the full failure context.`,"2. If the failure is a launch/config issue or other recoverable error, relaunch the task now or continue it yourself.","3. Notify the user with the failure cause and the next action you are taking."].join(`
57
- `),i=`$${(t.costUsd??0).toFixed(2)}`,m=_e(t.duration),p=[`\u274C [${t.name}] Failed | ${i} | ${m}`,` \u26A0\uFE0F ${r}`].join(`
58
- `);this.dispatchSessionNotification(t,{label:"failed",userMessage:p,wakeMessage:s,notifyUser:"always"})}triggerWaitingForInputEvent(t){if(!this.debounceWaitingEvent(t.id))return;let r=this.getOutputPreview(t),n=t.pendingPlanApproval,o=n?`\u{1F4CB} [${t.name}] Plan ready for review:
51
+ ${rt(n,800)}`);return}let p=typeof s=="string"?s:String(s??""),f=typeof c=="string"?c:String(c??""),b=rf(`${p}
52
+ ${f}`);if(!b){let X=`${p}
53
+ ${f}`.trim().substring(0,200);console.warn(`[SessionManager] Lobster response missing resume token for session=${t.id}: ${X}`)}b&&(t.lobsterResumeToken=b);let k=[`\u{1F4CB} [${t.name}] Plan ready for approval`,"",rt(n,1200),"",`Session: ${t.name} (${t.id})`,"",'To approve: reply "approve"',"To reject: reply with feedback"];this.notifySession(t,k.join(`
54
+ `))})}resumeLobsterApproval(t,n){let r=n?3e4:1e4;return new Promise((o,i)=>{let s=["--json","invoke","--tool","lobster","--args-json",JSON.stringify({action:"resume",token:t,approve:n})];fa("openclaw",s,{timeout:r},c=>{c?(console.error(`[SessionManager] Lobster resume failed (approve=${n}): ${c.message}`),i(c)):o()})})}debounceWaitingEvent(t){let n=Date.now(),r=this.lastWaitingEventTimestamps.get(t);return r&&n-r<tf?!1:(this.lastWaitingEventTimestamps.set(t,n),!0)}originThreadLine(t){return t.originThreadId!=null?`Session origin thread: ${t.originThreadId}`:""}extractLastOutputLine(t){return t.getOutput(3).filter(o=>o.trim()).pop()?.trim()||void 0}getOutputPreview(t,n=1e3){let r=t.getOutput(20).join(`
55
+ `);return r.length>n?Ei(r,n):r}triggerAgentEvent(t){let n=this.getOutputPreview(t),r=["Coding agent session completed.",`Name: ${t.name} | ID: ${t.id}`,`Status: ${t.status}`,this.originThreadLine(t),"","Output preview:",n,"","[ACTION REQUIRED] Follow your autonomy rules for session completion:",`1. Use agent_output(session='${t.id}', full=true) to read the full result.`,"2. If this is part of a multi-phase pipeline, launch the next phase NOW \u2014 do not wait for user input.","3. Notify the user with a summary of what was done."].join(`
56
+ `),o=`$${(t.costUsd??0).toFixed(2)}`,i=_e(t.duration),s=`\u2705 [${t.name}] Completed | ${o} | ${i}`;this.dispatchSessionNotification(t,{label:"completed",userMessage:s,wakeMessage:r,notifyUser:"always"})}triggerFailedEvent(t,n){let r=this.getOutputPreview(t),o=r.trim()?["","Output preview:",r]:[],i=["Coding agent session failed.",`Name: ${t.name} | ID: ${t.id}`,`Status: ${t.status}`,this.originThreadLine(t),"","Failure summary:",n,...o,"","[ACTION REQUIRED] Follow your autonomy rules for session failure:",`1. Use agent_output(session='${t.id}', full=true) to inspect the full failure context.`,"2. If the failure is a launch/config issue or other recoverable error, relaunch the task now or continue it yourself.","3. Notify the user with the failure cause and the next action you are taking."].join(`
57
+ `),s=`$${(t.costUsd??0).toFixed(2)}`,c=_e(t.duration),p=[`\u274C [${t.name}] Failed | ${s} | ${c}`,` \u26A0\uFE0F ${n}`].join(`
58
+ `);this.dispatchSessionNotification(t,{label:"failed",userMessage:p,wakeMessage:i,notifyUser:"always"})}triggerWaitingForInputEvent(t){if(!this.debounceWaitingEvent(t.id))return;let n=this.getOutputPreview(t),r=t.pendingPlanApproval,o=r?`\u{1F4CB} [${t.name}] Plan ready for review:
59
59
 
60
- ${r}
60
+ ${n}
61
61
 
62
- Reply to approve or provide feedback.`:`\u{1F514} [${t.name}] Waiting for input`,s;if(n){let i=h.planApproval??"delegate";if(i==="ask"){this.runLobsterApproval(t,r);return}else i==="delegate"?s=["[DELEGATED PLAN APPROVAL] Coding agent session has finished its plan and is requesting approval to implement.",`Name: ${t.name} | ID: ${t.id}`,this.originThreadLine(t),"Permission mode: plan \u2192 will switch to bypassPermissions on approval","","\u26A0\uFE0F YOU MUST COMPLETE THESE STEPS IN ORDER. Do NOT skip any step.","","\u2501\u2501\u2501 STEP 1 (MANDATORY): Read the full plan \u2501\u2501\u2501",`Call agent_output(session='${t.id}', full=true) to read the FULL plan output.`,"The preview below is truncated \u2014 you MUST read the full output before making any decision.","","Preview (truncated):",r,"","\u2501\u2501\u2501 STEP 2 (MANDATORY): Notify the user \u2501\u2501\u2501","After reading the full plan, use the message tool to send the user a summary that includes:","- What files/components will be changed","- Risk level (low/medium/high) and why","- Scope: does this match the original task or has it expanded?","- Any concerns or assumptions the plan makes","This message creates accountability \u2014 you cannot approve blindly.","","\u2501\u2501\u2501 STEP 3 (ONLY AFTER steps 1 and 2): Decide \u2501\u2501\u2501","You are the delegated decision-maker. Choose ONE:","","APPROVE the plan directly if ALL of the following are true:","- You have read the FULL plan (not just the preview)","- You have sent the user the summary message","- The plan scope matches the original task request","- The changes are low-risk (no destructive operations, no credential handling, no production deployments)","- The plan is clear and well-scoped (no ambiguous requirements or open design questions)","- No architectural decisions that the user should weigh in on","- The working directory and codebase are correct","","ESCALATE to the user and WAIT if ANY of the following are true:","- The plan involves destructive operations (deleting files, dropping tables, force-pushing)","- The plan involves credentials, secrets, or production environments","- The plan requires architectural decisions not covered by the original task","- The scope has expanded beyond the original request","- The requirements are ambiguous or the plan makes assumptions the user should confirm","- You are unsure \u2014 when in doubt, always escalate","",`If approving: agent_respond(session='${t.id}', message='Approved. Go ahead.', approve=true)`,"If escalating: tell the user you need their decision and WAIT for his explicit response.",`To request changes: agent_respond(session='${t.id}', message='<your feedback>') \u2014 do NOT set approve=true. The agent will revise the plan.`].join(`
63
- `):s=["[AUTO-APPROVE] Session has a plan ready. Approve it now:",`agent_respond(session='${t.id}', message='Approved. Go ahead.', approve=true)`].join(`
64
- `)}else s=[`[SYSTEM INSTRUCTION: Follow your auto-respond rules strictly. If this is a permission request or "should I continue?" \u2192 auto-respond. For ALL other questions \u2192 forward the agent's EXACT question to the user. Do NOT add your own analysis, commentary, or interpretation. Do NOT "nudge" or "poke" the session.]`,"",`${t.multiTurn?"Multi-turn session":"Session"} is waiting for input.`,`Name: ${t.name} | ID: ${t.id}`,this.originThreadLine(t),"","Last output:",r,"",`Use agent_respond(session='${t.id}', message='...') to send a reply, or agent_output(session='${t.id}', full: true) to see full context before deciding.`].join(`
65
- `);this.dispatchSessionNotification(t,{label:n?"plan-approval":"waiting",userMessage:o,wakeMessage:s,notifyUser:n?"always":"on-wake-fallback"})}onTurnEnd(t,r){if(r||t.pendingPlanApproval){this.triggerWaitingForInputEvent(t);return}this.shouldEmitTurnCompleteWake(t)&&this.triggerTurnCompleteEventWithSignal(t)}shouldEmitTurnCompleteWake(t){let r=`${t.result?.session_id??""}|${t.result?.num_turns??0}|${t.result?.duration_ms??0}`;return this.lastTurnCompleteMarkers.get(t.id)===r?!1:(this.lastTurnCompleteMarkers.set(t.id,r),!0)}shouldEmitTerminalWake(t){let r=`${t.status}|${t.completedAt??0}|${t.result?.session_id??""}|${t.result?.num_turns??0}|${t.killReason}`;return this.lastTerminalWakeMarkers.get(t.id)===r?!1:(this.lastTerminalWakeMarkers.set(t.id,r),!0)}triggerTurnCompleteEventWithSignal(t){let r=this.getOutputPreview(t),n=$r(r),o=`$${(t.costUsd??0).toFixed(2)}`,s=n?"yes":"no",i=`\u{1F504} [${t.name}] Turn done | ${o} | Waiting input: ${s}`,m=["Coding agent session turn ended.",`Name: ${t.name}`,`ID: ${t.id}`,`Status: ${t.status}`,"",`Looks like waiting for user input: ${s}`,"","Last output (~20 lines):",r,...this.originThreadLine(t)?["",this.originThreadLine(t)]:[]].join(`
66
- `);this.dispatchSessionNotification(t,{label:"turn-complete",userMessage:i,wakeMessage:m,notifyUser:"always"})}resolve(t){let r=this.sessions.get(t);if(r)return r;let n=[...this.sessions.values()].filter(s=>s.name===t);if(n.length===0)return;let o=n.filter(s=>Vr.has(s.status));return o.length>0?o.sort((s,i)=>i.startedAt-s.startedAt)[0]:n.sort((s,i)=>i.startedAt-s.startedAt)[0]}get(t){return this.sessions.get(t)}list(t){let r=[...this.sessions.values()];return t&&t!=="all"&&(r=r.filter(n=>n.status===t)),r.sort((n,o)=>o.startedAt-n.startedAt)}kill(t,r){let n=this.sessions.get(t);return n?(n.kill(r??"user"),!0):!1}killAll(t="user"){for(let r of this.sessions.values())Vr.has(r.status)&&this.kill(r.id,t);this.wakeDispatcher.clearPendingRetries()}resolveHarnessSessionId(t){let r=this.resolve(t);return this.store.resolveHarnessSessionId(t,r?.harnessSessionId)}getPersistedSession(t){return this.store.getPersistedSession(t)}listPersistedSessions(){return this.store.listPersistedSessions()}cleanup(){let t=Date.now(),r=(h.sessionGcAgeMinutes??1440)*6e4;for(let[n,o]of this.sessions)this.store.shouldGcActiveSession(o,t,r)&&(this.persistSession(o),this.sessions.delete(n),this.lastWaitingEventTimestamps.delete(n),this.lastTurnCompleteMarkers.delete(n),this.lastTerminalWakeMarkers.delete(n));this.store.cleanupTmpOutputFiles(t),this.store.evictOldestPersisted(this.maxPersistedSessions)}};function zO(e){let t=null,r=null;e.registerTool(n=>hi(n),{optional:!1}),e.registerTool(n=>Ti(n),{optional:!1}),e.registerTool(n=>bi(n),{optional:!1}),e.registerTool(n=>Ai(n),{optional:!1}),e.registerTool(n=>Pi(n),{optional:!1}),e.registerTool(n=>Oi(n),{optional:!1}),Ri(e),Ci(e),Mi(e),ki(e),Ei(e),Fi(e),$i(e),e.registerService({id:"openclaw-code-agent",start:n=>{let o=e.pluginConfig??e.getConfig?.()??{};fi(o),t=new Br(h.maxSessions,h.maxPersistedSessions),_n(t),r=setInterval(()=>t.cleanup(),300*1e3)},stop:()=>{t&&t.killAll("shutdown"),r&&clearInterval(r),r=null,t=null,_n(null)}})}export{zO as register};
62
+ Reply to approve or provide feedback.`:`\u2753 [${t.name}] Waiting for input`,i;if(r){let s=F.planApproval??"delegate";if(s==="ask"){this.runLobsterApproval(t,n);return}else s==="delegate"?i=["[DELEGATED PLAN APPROVAL] Coding agent session has finished its plan and is requesting approval to implement.",`Name: ${t.name} | ID: ${t.id}`,this.originThreadLine(t),"Permission mode: plan \u2192 will switch to bypassPermissions on approval","","\u26A0\uFE0F YOU MUST COMPLETE THESE STEPS IN ORDER. Do NOT skip any step.","","\u2501\u2501\u2501 STEP 1 (MANDATORY): Read the full plan \u2501\u2501\u2501",`Call agent_output(session='${t.id}', full=true) to read the FULL plan output.`,"The preview below is truncated \u2014 you MUST read the full output before making any decision.","","Preview (truncated):",n,"","\u2501\u2501\u2501 STEP 2 (MANDATORY): Notify the user \u2501\u2501\u2501","After reading the full plan, use the message tool to send the user a summary that includes:","- What files/components will be changed","- Risk level (low/medium/high) and why","- Scope: does this match the original task or has it expanded?","- Any concerns or assumptions the plan makes","This message creates accountability \u2014 you cannot approve blindly.","","\u2501\u2501\u2501 STEP 3 (ONLY AFTER steps 1 and 2): Decide \u2501\u2501\u2501","You are the delegated decision-maker. Choose ONE:","","APPROVE the plan directly if ALL of the following are true:","- You have read the FULL plan (not just the preview)","- You have sent the user the summary message","- The plan scope matches the original task request","- The changes are low-risk (no destructive operations, no credential handling, no production deployments)","- The plan is clear and well-scoped (no ambiguous requirements or open design questions)","- No architectural decisions that the user should weigh in on","- The working directory and codebase are correct","","ESCALATE to the user and WAIT if ANY of the following are true:","- The plan involves destructive operations (deleting files, dropping tables, force-pushing)","- The plan involves credentials, secrets, or production environments","- The plan requires architectural decisions not covered by the original task","- The scope has expanded beyond the original request","- The requirements are ambiguous or the plan makes assumptions the user should confirm","- You are unsure \u2014 when in doubt, always escalate","",`If approving: agent_respond(session='${t.id}', message='Approved. Go ahead.', approve=true)`,"If escalating: tell the user you need their decision and WAIT for his explicit response.",`To request changes: agent_respond(session='${t.id}', message='<your feedback>') \u2014 do NOT set approve=true. The agent will revise the plan.`].join(`
63
+ `):i=["[AUTO-APPROVE] Session has a plan ready. Approve it now:",`agent_respond(session='${t.id}', message='Approved. Go ahead.', approve=true)`].join(`
64
+ `)}else i=[`[SYSTEM INSTRUCTION: Follow your auto-respond rules strictly. If this is a permission request or "should I continue?" \u2192 auto-respond. For ALL other questions \u2192 forward the agent's EXACT question to the user. Do NOT add your own analysis, commentary, or interpretation. Do NOT "nudge" or "poke" the session.]`,"",`${t.multiTurn?"Multi-turn session":"Session"} is waiting for input.`,`Name: ${t.name} | ID: ${t.id}`,this.originThreadLine(t),"","Last output:",n,"",`Use agent_respond(session='${t.id}', message='...') to send a reply, or agent_output(session='${t.id}', full: true) to see full context before deciding.`].join(`
65
+ `);this.dispatchSessionNotification(t,{label:r?"plan-approval":"waiting",userMessage:o,wakeMessage:i,notifyUser:r?"always":"on-wake-fallback"})}onTurnEnd(t,n){if(n||t.pendingPlanApproval){this.triggerWaitingForInputEvent(t);return}this.shouldEmitTurnCompleteWake(t)&&this.triggerTurnCompleteEventWithSignal(t)}shouldEmitTurnCompleteWake(t){let n=`${t.result?.session_id??""}|${t.result?.num_turns??0}|${t.result?.duration_ms??0}`;return this.lastTurnCompleteMarkers.get(t.id)===n?!1:(this.lastTurnCompleteMarkers.set(t.id,n),!0)}shouldEmitTerminalWake(t){let n=`${t.status}|${t.completedAt??0}|${t.result?.session_id??""}|${t.result?.num_turns??0}|${t.killReason}`;return this.lastTerminalWakeMarkers.get(t.id)===n?!1:(this.lastTerminalWakeMarkers.set(t.id,n),!0)}triggerTurnCompleteEventWithSignal(t){let n=this.getOutputPreview(t),r=jn(n),o=`$${(t.costUsd??0).toFixed(2)}`,i=r?"yes":"no",s=`\u23F8\uFE0F [${t.name}] Paused after turn | Auto-resumable | ${o} | Waiting input: ${i}`,c=["Coding agent session turn ended.",`Name: ${t.name}`,`ID: ${t.id}`,`Status: ${t.status}`,"",`Looks like waiting for user input: ${i}`,"","Last output (~20 lines):",n,...this.originThreadLine(t)?["",this.originThreadLine(t)]:[]].join(`
66
+ `);this.dispatchSessionNotification(t,{label:"turn-complete",userMessage:s,wakeMessage:c,notifyUser:"always"})}resolve(t){let n=this.sessions.get(t);if(n)return n;let r=[...this.sessions.values()].filter(i=>i.name===t);if(r.length===0)return;let o=r.filter(i=>Xn.has(i.status));return o.length>0?o.sort((i,s)=>s.startedAt-i.startedAt)[0]:r.sort((i,s)=>s.startedAt-i.startedAt)[0]}get(t){return this.sessions.get(t)}list(t){let n=[...this.sessions.values()];return t&&t!=="all"&&(n=n.filter(r=>r.status===t)),n.sort((r,o)=>o.startedAt-r.startedAt)}kill(t,n){let r=this.sessions.get(t);return r?(r.kill(n??"user"),!0):!1}killAll(t="user"){for(let n of this.sessions.values())Xn.has(n.status)&&this.kill(n.id,t);this.wakeDispatcher.clearPendingRetries()}resolveHarnessSessionId(t){let n=this.resolve(t);return this.store.resolveHarnessSessionId(t,n?.harnessSessionId)}getPersistedSession(t){return this.store.getPersistedSession(t)}listPersistedSessions(){return this.store.listPersistedSessions()}cleanup(){let t=Date.now(),n=(F.sessionGcAgeMinutes??1440)*6e4;for(let[r,o]of this.sessions)this.store.shouldGcActiveSession(o,t,n)&&(this.persistSession(o),this.sessions.delete(r),this.lastWaitingEventTimestamps.delete(r),this.lastTurnCompleteMarkers.delete(r),this.lastTerminalWakeMarkers.delete(r));this.store.cleanupTmpOutputFiles(t),this.store.evictOldestPersisted(this.maxPersistedSessions)}};function oO(e){let t=null,n=null;e.registerTool(r=>Oi(r),{optional:!1}),e.registerTool(r=>Fi(r),{optional:!1}),e.registerTool(r=>ki(r),{optional:!1}),e.registerTool(r=>$i(r),{optional:!1}),e.registerTool(r=>Ni(r),{optional:!1}),e.registerTool(r=>Ui(r),{optional:!1}),_i(e),Li(e),Ki(e),Di(e),ji(e),Gi(e),Vi(e),e.registerService({id:"openclaw-code-agent",start:r=>{let o=e.pluginConfig??e.getConfig?.()??{};wi(o),t=new Qn(F.maxSessions,F.maxPersistedSessions),Vr(t),n=setInterval(()=>t.cleanup(),300*1e3)},stop:()=>{t&&t.killAll("shutdown"),n&&clearInterval(n),n=null,t=null,Vr(null)}})}export{oO as register};
@@ -2,7 +2,7 @@
2
2
  "id": "openclaw-code-agent",
3
3
  "name": "OpenClaw Code Agent",
4
4
  "description": "Orchestrate coding agent sessions from OpenClaw",
5
- "version": "2.0.5",
5
+ "version": "2.3.1",
6
6
  "configSchema": {
7
7
  "type": "object",
8
8
  "additionalProperties": false,
@@ -11,18 +11,77 @@
11
11
  "type": "number",
12
12
  "default": 20
13
13
  },
14
+ "harnesses": {
15
+ "type": "object",
16
+ "description": "Per-harness launch defaults and model restrictions.",
17
+ "default": {
18
+ "codex": {
19
+ "defaultModel": "gpt-5.4",
20
+ "allowedModels": [
21
+ "gpt-5.4"
22
+ ],
23
+ "reasoningEffort": "medium",
24
+ "approvalPolicy": "on-request"
25
+ },
26
+ "claude-code": {
27
+ "defaultModel": "sonnet",
28
+ "allowedModels": [
29
+ "sonnet",
30
+ "opus"
31
+ ]
32
+ }
33
+ },
34
+ "additionalProperties": {
35
+ "type": "object",
36
+ "additionalProperties": false,
37
+ "properties": {
38
+ "defaultModel": {
39
+ "type": "string",
40
+ "description": "Default model for this harness when agent_launch omits model."
41
+ },
42
+ "allowedModels": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "string"
46
+ },
47
+ "description": "Restrict which models can be used with this harness. Empty or omitted means no restriction."
48
+ },
49
+ "reasoningEffort": {
50
+ "type": "string",
51
+ "enum": [
52
+ "low",
53
+ "medium",
54
+ "high"
55
+ ],
56
+ "description": "Harness-specific reasoning effort. Currently used by Codex."
57
+ },
58
+ "approvalPolicy": {
59
+ "type": "string",
60
+ "enum": [
61
+ "never",
62
+ "on-request"
63
+ ],
64
+ "description": "Harness-specific approval policy. Currently used by Codex."
65
+ }
66
+ }
67
+ }
68
+ },
14
69
  "defaultModel": {
15
70
  "type": "string",
16
- "description": "Default model for new sessions (e.g. 'sonnet', 'opus')"
71
+ "description": "Deprecated legacy default model. Mapped to harnesses[defaultHarness].defaultModel."
17
72
  },
18
73
  "model": {
19
74
  "type": "string",
20
- "description": "Override model for all Codex sessions (e.g. 'gpt-5.3-codex', 'gpt-5.4'). Falls back to agent model config if not set."
75
+ "description": "Deprecated legacy Codex model override. Use harnesses.codex.defaultModel instead."
21
76
  },
22
77
  "reasoningEffort": {
23
78
  "type": "string",
24
- "enum": ["low", "medium", "high"],
25
- "description": "Reasoning effort for Codex sessions. 'high' for complex tasks, 'medium' (default) for balance, 'low' for speed."
79
+ "enum": [
80
+ "low",
81
+ "medium",
82
+ "high"
83
+ ],
84
+ "description": "Deprecated legacy Codex reasoning effort. Use harnesses.codex.reasoningEffort instead."
26
85
  },
27
86
  "defaultWorkdir": {
28
87
  "type": "string",
@@ -61,7 +120,10 @@
61
120
  "codexApprovalPolicy": {
62
121
  "type": "string",
63
122
  "default": "on-request",
64
- "enum": ["never", "on-request"],
123
+ "enum": [
124
+ "never",
125
+ "on-request"
126
+ ],
65
127
  "description": "Codex-only SDK/CLI approval policy. Defaults to 'on-request'. Set to 'never' to keep Codex from requesting approval for privileged actions. Distinct from plugin permissionMode / plan orchestration."
66
128
  },
67
129
  "agentChannels": {
@@ -79,14 +141,24 @@
79
141
  "planApproval": {
80
142
  "type": "string",
81
143
  "default": "delegate",
82
- "enum": ["approve", "ask", "delegate"],
144
+ "enum": [
145
+ "approve",
146
+ "ask",
147
+ "delegate"
148
+ ],
83
149
  "description": "Plan approval behavior. 'delegate' (default): orchestrator autonomously decides whether to approve low-risk plans or escalate to the user. 'approve': orchestrator can auto-approve after verification. 'ask': orchestrator always forwards plans to the user for approval."
84
150
  },
85
151
  "defaultHarness": {
86
152
  "type": "string",
87
153
  "default": "claude-code",
88
- "enum": ["claude-code", "codex"],
89
154
  "description": "Default agent harness when agent_launch omits the harness parameter."
155
+ },
156
+ "allowedModels": {
157
+ "type": "array",
158
+ "items": {
159
+ "type": "string"
160
+ },
161
+ "description": "Deprecated legacy global model restriction. Use harnesses.<name>.allowedModels instead."
90
162
  }
91
163
  }
92
164
  },
@@ -107,14 +179,18 @@
107
179
  "help": "Base directory used for new sessions when agent_launch does not provide a workdir.",
108
180
  "placeholder": "/home/user/project"
109
181
  },
182
+ "harnesses": {
183
+ "label": "Harness configuration",
184
+ "help": "Per-harness defaults and model restrictions. Default: {\"codex\":{\"defaultModel\":\"gpt-5.4\",\"allowedModels\":[\"gpt-5.4\"],\"reasoningEffort\":\"medium\",\"approvalPolicy\":\"on-request\"},\"claude-code\":{\"defaultModel\":\"sonnet\",\"allowedModels\":[\"sonnet\",\"opus\"]}}."
185
+ },
110
186
  "defaultModel": {
111
- "label": "Default model",
112
- "help": "Default model for new sessions when a harness-specific override is not set.",
187
+ "label": "Legacy default model",
188
+ "help": "Deprecated. Mapped to harnesses[defaultHarness].defaultModel during migration.",
113
189
  "placeholder": "sonnet"
114
190
  },
115
191
  "model": {
116
- "label": "Codex model override",
117
- "help": "Override model for all Codex sessions; falls back to the agent model config or defaultModel when unset.",
192
+ "label": "Legacy Codex model",
193
+ "help": "Deprecated. Use harnesses.codex.defaultModel instead.",
118
194
  "placeholder": "gpt-5.3-codex"
119
195
  },
120
196
  "maxSessions": {
@@ -131,12 +207,14 @@
131
207
  },
132
208
  "codexApprovalPolicy": {
133
209
  "label": "Codex approval policy",
134
- "help": "Real Codex SDK/CLI approval policy for Codex sessions. Defaults to 'on-request'; use 'never' to preserve fully non-interactive Codex approval behavior."
210
+ "help": "Deprecated. Use harnesses.codex.approvalPolicy instead."
135
211
  },
136
212
  "planApproval": {
137
213
  "label": "Plan approval policy",
138
214
  "help": "Choose whether plans are auto-approved, always escalated, or delegated to the orchestrator."
139
215
  }
140
216
  },
141
- "skills": ["./skills"]
217
+ "skills": [
218
+ "./skills"
219
+ ]
142
220
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-code-agent",
3
- "version": "2.2.0",
3
+ "version": "2.3.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -39,10 +39,44 @@ You orchestrate coding agent sessions via the `openclaw-code-agent`. Each sessio
39
39
  | `channel` | **Do NOT pass.** Resolved automatically via `agentChannels`. |
40
40
  | `workdir` | Always when the project is not in the `defaultWorkdir`. |
41
41
  | `multi_turn` | `true` by default unless explicitly one-shot. |
42
- | `model` | When you want to force a specific model (`"sonnet"`, `"opus"`). |
42
+ | `model` | When you want to force a specific model (`"sonnet"`, `"opus"`, `"gpt-5.4"`). Subject to `harnesses.<name>.allowedModels` restrictions if configured. |
43
43
  | `system_prompt` | To inject project-specific context. |
44
44
  | `permission_mode` | `"plan"` by default. `"bypassPermissions"` for trusted tasks. |
45
45
 
46
+ ### Harness-scoped model restrictions
47
+
48
+ The plugin config restricts models per harness via `harnesses.<name>.allowedModels`:
49
+
50
+ - **Matching:** Case-insensitive substring matching (e.g., `"sonnet"` matches `"claude-sonnet-4-6"`)
51
+ - **Explicit model blocked:** If a caller explicitly requests a model not in that harness's `allowedModels`, the launch fails with an error
52
+ - **Default model blocked:** If no model is specified and the resolved `harnesses.<name>.defaultModel` is not in `allowedModels`, the launch fails with a config error
53
+ - **Not configured:** If `allowedModels` is empty or undefined for that harness, all models are allowed for that harness
54
+
55
+ **Example configuration:**
56
+ ```json
57
+ {
58
+ "harnesses": {
59
+ "claude-code": {
60
+ "defaultModel": "sonnet",
61
+ "allowedModels": ["sonnet", "haiku"]
62
+ },
63
+ "codex": {
64
+ "defaultModel": "gpt-5.4",
65
+ "allowedModels": ["gpt-5.4"]
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ This configuration allows Claude models containing "sonnet" or "haiku" in their identifier, and restricts Codex launches to `gpt-5.4`.
72
+
73
+ **Interaction with harness compatibility:**
74
+ When both `harnesses.<name>.allowedModels` and harness compatibility constraints apply, you must satisfy BOTH:
75
+ 1. The model must be in `harnesses.<name>.allowedModels` (if configured)
76
+ 2. The model must be compatible with the chosen harness
77
+
78
+ Example: If `harnesses.claude-code.allowedModels = ["sonnet", "gpt-4"]` and you use the default `claude-code` harness, only "sonnet" will work because "gpt-4" is not a Claude-compatible model.
79
+
46
80
  ### Examples
47
81
 
48
82
  ```
@@ -83,6 +117,19 @@ agent_launch(
83
117
  )
84
118
  ```
85
119
 
120
+ ### Harness and model compatibility
121
+
122
+ | Harness | Supported Models | Examples |
123
+ |---------|-----------------|---------|
124
+ | `claude-code` | Anthropic only | `sonnet`, `opus`, `haiku`, `claude-sonnet-4-6` |
125
+ | `codex` | OpenAI only | `gpt-4`, `gpt-5`, `o1`, `o3-mini` |
126
+
127
+ - When user says "with sonnet/opus/haiku" → use `harness: "claude-code"` (or omit — it's the default)
128
+ - When user says "with gpt-4/o1/o3" → use `harness: "codex"`
129
+ - **Never** pass Anthropic models to codex harness or OpenAI models to claude-code harness
130
+
131
+ If `harnesses.<name>.allowedModels` is configured, both explicit model requests and default models outside that list are rejected with an error. When the default model is not allowed, the error message directs you to update the plugin config.
132
+
86
133
  ---
87
134
 
88
135
  ## 2. Anti-cascade rules (CRITICAL)
@@ -239,8 +286,11 @@ Notifications are routed to the Telegram thread/topic where the session was laun
239
286
  | Session starts | Silent (command response confirms launch) |
240
287
  | Session completed | Brief one-liner to originating thread |
241
288
  | Session failed | Error notification to originating thread |
242
- | Waiting for input | Wake event + "Agent asks" in thread (only when the agent actually asks a question) |
243
- | Session idle-killed | Brief notification with kill reason |
289
+ | Waiting for input | Wake event + `❓ Waiting for input` in thread (only when the agent actually asks a question) |
290
+ | Turn completes without a question | `⏸️ Paused after turn | Auto-resumable` |
291
+ | Session auto-resumes | `▶️ Auto-resumed` |
292
+ | Session idle-times out | `💤 Idle timeout` |
293
+ | Session is forcibly stopped | `⛔ Stopped ...` with the specific stop reason |
244
294
 
245
295
  ### Plan → Execute mode switch
246
296