@task-handoff/thctl 0.0.35 → 0.0.36

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/dist/thctl.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("commander"),t=require("node:fs"),n=require("node:os"),i=require("node:path"),o=require("zod"),a=require("node:crypto"),r=require("node:readline/promises"),s=require("node:child_process"),d=require("ws"),c=require("node:http");const l=13;class m extends Error{code;exitCode;details;constructor(e,t,n=12,i){super(t),this.name="ThctlError",this.code=e,this.exitCode=n,this.details=i}}function u(e,t,n){return new m(e,t,2,n)}function p(e,t,n){return new m("CLI_CAPABILITY_MISSING",`\`${e}\` requires capability \`${t}\`, which the connected Control Plane or node does not declare. Upgrade it or pick a supported command.`,14,{command:e,capability:t,...n})}function g(e,t,n){return new m("CLI_ROUTE_MISSING",`The Control Plane does not expose \`${t} ${n}\` (HTTP ${e}); this server version predates the command.`,14,{path:n,status:e,method:t})}function z(e,t){return new m("CLI_PROTOCOL_ERROR",e,11,t)}function h(e,t){return new m("CLI_NETWORK_ERROR",e,10,t)}const y={400:2,401:5,403:6,404:7,409:8,410:7,429:9},f=new Set(["CONTROL_PLANE_AUTH_REQUIRED","AUTH_PASSWORD_CHANGE_REQUIRED","CLI_AUTHORIZATION_PENDING","CLI_AUTHORIZATION_SLOW_DOWN","CLI_AUTHORIZATION_DENIED","CLI_AUTHORIZATION_EXPIRED","CLI_AUTHORIZATION_INVALID_GRANT","CLI_AUTHORIZATION_FAILED","CLI_AUTHORIZATION_REQUEST_UNKNOWN"]);function I(e,t,n,i){const o=f.has(t)?5:y[e]??12;return new m(t,n,o,i)}const b="TASK_HANDOFF_CLI_PROFILE",w=o.z.object({label:o.z.string().trim().min(1).max(120),origin:o.z.string().trim().url().max(2048),controlPlaneId:o.z.string().trim().min(1).max(160),fingerprint:o.z.string().regex(/^sha256:[A-Za-z0-9_-]{43}$/),protocolVersion:o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/),capabilities:o.z.unknown().optional(),loginMode:o.z.enum(["browser","device"]).optional(),source:o.z.enum(["manual","local-discovery"]).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),trustedAt:o.z.string().datetime(),lastUsedAt:o.z.string().datetime().optional(),identityChangedAt:o.z.string().datetime().optional(),replacedFingerprint:o.z.string().regex(/^sha256:[A-Za-z0-9_-]{43}$/).optional()}),v=o.z.object({version:o.z.number().int().positive(),defaultProfile:o.z.string().trim().min(1).max(120).optional(),profiles:o.z.array(w).default([])}),x=o.z.object({version:o.z.number().int().positive(),credentials:o.z.record(o.z.string(),o.z.object({sessionToken:o.z.string().trim().min(32),sessionId:o.z.string().trim().min(1).optional(),expiresAt:o.z.string().datetime().optional(),mode:o.z.enum(["authorization","local-trust"]).optional(),savedAt:o.z.string().datetime()})).default({})});function A(e=process.env){const t=e.TASK_HANDOFF_CLI_CONFIG_DIR?.trim();if(t)return i.resolve(t);const o=e.XDG_CONFIG_HOME?.trim();return i.join(o&&i.isAbsolute(o)?o:i.join(n.homedir(),".config"),"task-handoff","cli")}function S(e,n){!function(e){t.mkdirSync(e,{recursive:!0,mode:448});try{t.chmodSync(e,448)}catch{}}(i.dirname(e));const o=`${e}.${process.pid}.tmp`;t.writeFileSync(o,`${JSON.stringify(n,null,2)}\n`,{mode:384}),t.renameSync(o,e);try{t.chmodSync(e,384)}catch{}}function C(e){try{return JSON.parse(t.readFileSync(e,"utf8"))}catch(e){return void e.code}}class k{file;credentialFile;warnings=[];directory;constructor(e){this.directory=e,this.file=i.join(e,"profiles.json"),this.credentialFile=i.join(e,"credentials.json")}list(){return this.#e().profiles}defaultProfile(){return this.#e().defaultProfile}get(e){return this.#e().profiles.find(t=>t.label===e)}findByOrigin(e){return this.#e().profiles.find(t=>t.origin===e)}findByControlPlane(e,t){return this.#e().profiles.find(n=>n.controlPlaneId===e&&n.fingerprint===t)}save(e){const t=w.parse(e),n=this.#e(),i=[...n.profiles.filter(e=>e.label!==t.label),t];return this.#t({...n,profiles:i}),t}remove(e){const t=this.#e(),n=t.profiles.filter(t=>t.label!==e);return n.length!==t.profiles.length&&(this.#t({...t,profiles:n,defaultProfile:t.defaultProfile===e?n[0]?.label:t.defaultProfile}),this.secrets().remove(e),!0)}setDefault(e){const t=this.#e();if(!t.profiles.some(t=>t.label===e))throw new m("CLI_PROFILE_UNKNOWN",`Unknown profile \`${e}\`. Run \`thctl profile list\` to see configured profiles.`,7,{profile:e});this.#t({...t,defaultProfile:e})}select(e,t=process.env){const n=this.#e(),i=e?.trim()||t[b]?.trim()||n.defaultProfile;if(i){const e=n.profiles.find(e=>e.label===i);if(!e)throw new m("CLI_PROFILE_UNKNOWN",`Unknown profile \`${i}\`. Run \`thctl profile list\` to see configured profiles.`,7,{profile:i});return e}if(1===n.profiles.length)return n.profiles[0];if(0===n.profiles.length)throw new m("CLI_PROFILE_MISSING","No Control Plane profile configured. Run `thctl profile add <origin>` first.",7);throw u("CLI_PROFILE_REQUIRED","Multiple profiles are configured. Select one with `--profile <label>` or `thctl profile use <label>`.")}markUsed(e){return this.save({...e,lastUsedAt:(new Date).toISOString(),updatedAt:(new Date).toISOString()})}secrets(){return new j(this.credentialFile,this.warnings)}#e(){const e=C(this.file);if(void 0===e)return{version:1,profiles:[]};const t=v.safeParse(e);return t.success?{...t.data,profiles:t.data.profiles.filter(e=>""!==e.label)}:(this.warnings.push(`Ignoring unreadable profile file ${this.file}; run \`thctl profile add\` to recreate it.`),{version:1,profiles:[]})}#t(e){S(this.file,{version:1,...e.defaultProfile?{defaultProfile:e.defaultProfile}:{},profiles:e.profiles})}}class j{file;warnings;constructor(e,t){this.file=e,this.warnings=t}read(e){return this.#e().credentials[e]}write(e,t){const n=this.#e();n.credentials[e]=t,this.#t(n)}remove(e){const t=this.#e();e in t.credentials&&(delete t.credentials[e],this.#t(t))}#e(){const e=C(this.file);if(void 0===e)return{version:1,credentials:{}};const t=x.safeParse(e);return t.success?t.data:(this.warnings.push(`Ignoring unreadable credential file ${this.file}; sign in again with \`thctl login\`.`),{version:1,credentials:{}})}#t(e){S(this.file,e)}}function R(e){const t=new URL(e);return(`${"127.0.0.1"===t.hostname||"localhost"===t.hostname||"::1"===t.hostname?"local":t.hostname}${t.port?`-${t.port}`:""}`.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"control-plane").slice(0,64)}const T=o.z.string().trim().min(1).max(120),E=20971520,P=512e3,O=P,$=E,N=41943040,_=o.z.string().trim().min(1).max(80),U=o.z.enum(["app-session","ai-session"]),q=o.z.enum(["image","file"]),L={scopeType:o.z.enum(["session","create-request"]),scopeId:o.z.string().trim().min(1).max(160),kind:q,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120)};o.z.object({...L,size:o.z.coerce.number().int().positive().max(E)}).strict();const D=o.z.string().regex(/^cia_[a-f0-9]{24}$/);o.z.object({attachmentId:D,...L,size:o.z.number().int().positive().max(E)}).strict(),o.z.object({offset:o.z.coerce.number().int().nonnegative()}).strict(),o.z.object({attachmentId:D,offset:o.z.number().int().nonnegative()}),o.z.object({id:D,kind:q,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120),size:o.z.number().int().positive().max(E),expiresAt:o.z.string().datetime()});const M=o.z.object({id:o.z.string().trim().min(1).max(120),kind:q,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120),size:o.z.number().int().min(0).max(Number.MAX_SAFE_INTEGER)}),B=o.z.enum(["available","expired","missing"]),H=M.extend({contentState:B.default("available")}).strict(),F=o.z.object({id:o.z.string().trim().min(1).max(240),text:o.z.string(),attachments:o.z.array(H).max(6).default([])}).strict(),V=o.z.enum(["running","waiting","idle","failed"]),G=o.z.enum(["thinking","tool","editing","approval","responding","unknown"]),Y=o.z.object({id:o.z.string().trim().min(1).max(240).optional(),kind:o.z.string().trim().min(1).max(80).optional(),name:o.z.string().trim().min(1).max(120),inputPreview:o.z.string().trim().max(500).optional(),startedAt:o.z.string().datetime().optional()}).strict(),W=o.z.enum(["running","completed","failed","waiting"]),K=o.z.object({id:o.z.string().trim().min(1).max(240),turnId:o.z.string().trim().min(1).max(240)}).strict(),J=K.extend({type:o.z.literal("user-message"),text:o.z.string(),attachments:o.z.array(H).max(6).optional()}).strict(),Z=K.extend({type:o.z.literal("ai-message"),text:o.z.string()}).strict(),Q=K.extend({type:o.z.literal("activity"),activityKind:o.z.string().trim().min(1).max(120),title:o.z.string().trim().min(1).max(240),status:W.optional(),summary:o.z.string().max(4e3).optional(),input:o.z.string().max(1e5).optional(),output:o.z.string().max(1e6).optional(),paths:o.z.array(o.z.string().trim().min(1).max(4096)).max(500).optional(),exitCode:o.z.number().int().optional(),durationMs:o.z.number().int().nonnegative().optional()}).strict(),X=o.z.discriminatedUnion("type",[J,Z,Q]),ee=o.z.object({sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),items:o.z.array(X),generatedAt:o.z.string().datetime()}).strict(),te=o.z.object({sessionId:o.z.string().trim().min(1).max(120),turnId:o.z.string().trim().min(1).max(240),items:o.z.array(X),generatedAt:o.z.string().datetime()}).strict(),ne=o.z.enum(["pending-init","running","interrupted","completed","errored","shutdown","not-found"]),ie=o.z.enum(["started","interacted","interrupted"]),oe=o.z.object({threadId:o.z.string().trim().min(1).max(240),path:o.z.string().trim().max(4096).optional(),status:ne,activity:ie.optional(),message:o.z.string().trim().max(1e3).optional(),updatedAt:o.z.string().datetime()}).strict();function ae(e){return"completed"!==e.status}const re=o.z.array(oe).max(50).transform(e=>e.filter(ae)),se=o.z.object({toolCalls:o.z.number().int().min(0).default(0),edits:o.z.number().int().min(0).default(0),approvals:o.z.number().int().min(0).default(0)}).strict().default({toolCalls:0,edits:0,approvals:0}),de=o.z.object({send:o.z.boolean().optional(),interrupt:o.z.boolean().optional(),approval:o.z.boolean().optional(),fork:o.z.boolean().optional(),rename:o.z.boolean().optional(),openApp:o.z.boolean().optional(),close:o.z.boolean().optional()}),ce=o.z.string().trim().min(1).max(240),le=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("fork"),parentProviderSessionId:ce,throughTurnId:o.z.string().trim().min(1).max(240).optional()}).strict(),o.z.object({kind:o.z.literal("subagent"),parentProviderSessionId:ce}).strict()]),me=o.z.preprocess(function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e;if("fork"===t.kind){const e=le.safeParse({kind:"fork",parentProviderSessionId:t.parentProviderSessionId,..."string"==typeof t.throughTurnId?{throughTurnId:t.throughTurnId}:{}});return e.success?e.data:void 0}if("subagent"===t.kind){const e=le.safeParse({kind:"subagent",parentProviderSessionId:t.parentProviderSessionId});return e.success?e.data:void 0}},le.optional()),ue=o.z.union([M.extend({source:o.z.object({type:o.z.literal("inline"),encoding:o.z.literal("base64"),data:o.z.string().min(1).max(31457280)}).strict()}).strict().superRefine((e,t)=>{const n="image"===e.kind?E:P;(e.size<=0||("file"===e.kind?e.size>=n:e.size>n))&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["size"],message:`Inline ${e.kind} must be between 1 byte and ${n} bytes.`})}),M.extend({source:o.z.object({type:o.z.literal("runtime-path"),path:o.z.string().trim().min(1).max(4096)}).strict()}).strict()]),pe=M.extend({sourceType:o.z.enum(["inline","runtime-path"])}).strict(),ge=o.z.union([o.z.object({id:o.z.string().trim().min(1).max(120),kind:q.optional(),source:o.z.object({type:o.z.literal("upload-ref")}).strict().default({type:"upload-ref"})}).strict(),o.z.object({id:o.z.string().trim().min(1).max(120),kind:q,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120),size:o.z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),source:o.z.object({type:o.z.literal("runtime-path"),path:o.z.string().trim().min(1).max(4096)}).strict()}).strict()]),ze=o.z.enum(["auto","queue","steer","immediate"]),he=o.z.enum(["ask","auto-review","full-access"]),ye=o.z.enum(["review","rename","goal","compact"]),fe=o.z.object({command:ye,argument:o.z.string().trim().max(4e3).optional()}).strict().superRefine((e,t)=>{"rename"!==e.command||e.argument||t.addIssue({code:"custom",path:["argument"],message:"Rename requires a thread name."}),"review"!==e.command&&"compact"!==e.command||!e.argument||t.addIssue({code:"custom",path:["argument"],message:`${e.command} does not accept an argument.`})}),Ie=o.z.object({command:ye,value:o.z.string().max(4e3).optional(),turnId:o.z.string().trim().min(1).max(240).optional()}).strict(),be=o.z.object({title:o.z.string().trim().max(120),expectedTitle:o.z.string().trim().max(240).optional(),clientRequestId:o.z.string().trim().min(1).max(160)}).strict(),we=o.z.object({disposition:o.z.enum(["renamed","already-named"]),aiSessionId:o.z.string().trim().min(1).max(120),appSessionId:o.z.string().trim().min(1).max(120).optional(),title:o.z.string().trim().max(120)}).strict();o.z.enum(["skill","app","plugin"]);const ve=o.z.object({name:o.z.string().trim().min(1).max(240),path:o.z.string().trim().min(1).max(4096)}),xe=o.z.discriminatedUnion("kind",[ve.extend({kind:o.z.literal("skill"),path:o.z.string().trim().min(1).max(4096).refine(e=>e.startsWith("/"),"Skill paths must be absolute.")}).strict(),ve.extend({kind:o.z.literal("app"),path:o.z.string().trim().min(7).max(4096).regex(/^app:\/\/[^\s/]+$/,"App paths must use app://<id>.")}).strict(),ve.extend({kind:o.z.literal("plugin"),path:o.z.string().trim().min(10).max(4096).regex(/^plugin:\/\/[^\s/]+$/,"Plugin paths must use plugin://<id>.")}).strict()]),Ae=o.z.array(xe).max(20).default([]),Se=o.z.enum(["plugin","skill","file","directory","app"]),Ce=o.z.object({kind:Se,name:o.z.string().trim().min(1).max(240),description:o.z.string().trim().max(1e3).optional(),path:o.z.string().trim().min(1).max(4096),icon:o.z.string().trim().max(4096).optional()}).strict().superRefine((e,t)=>{"skill"!==e.kind||e.path.startsWith("/")||t.addIssue({code:"custom",path:["path"],message:"Skill paths must be absolute."}),"app"!==e.kind||/^app:\/\/[^\s/]+$/.test(e.path)||t.addIssue({code:"custom",path:["path"],message:"App paths must use app://<id>."}),"plugin"!==e.kind||/^plugin:\/\/[^\s/]+$/.test(e.path)||t.addIssue({code:"custom",path:["path"],message:"Plugin paths must use plugin://<id>."}),"file"!==e.kind&&"directory"!==e.kind||!e.path.startsWith("/")&&!e.path.split(/[\\/]+/).includes("..")||t.addIssue({code:"custom",path:["path"],message:"File and directory paths must be relative to the session cwd."})}),ke=o.z.object({category:o.z.enum(["skills","plugins","apps","files"]),code:o.z.string().trim().min(1).max(160),message:o.z.string().trim().min(1).max(2e3)}).strict(),je=o.z.object({sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),cwd:o.z.string().trim().min(1).max(4096),candidates:o.z.array(Ce).max(1e3).default([]),diagnostics:o.z.array(ke).max(20).default([])}).strict();o.z.object({query:o.z.string().trim().max(240).default("")}).strict();const Re=o.z.object({sessionId:o.z.string().trim().min(1).max(120),cwd:o.z.string().trim().min(1).max(4096),query:o.z.string().trim().max(240),requestId:o.z.string().trim().min(1).max(160),candidates:o.z.array(Ce.refine(e=>"file"===e.kind||"directory"===e.kind,"File search only returns files and directories.")).max(200).default([]),complete:o.z.boolean().default(!1)}).strict(),Te=o.z.object({message:o.z.string().trim().min(1).max(2e4),mode:ze.optional(),permissionMode:he.optional()}),Ee=Te.extend({attachments:o.z.array(ue).max(6).default([]),references:Ae}).strict().superRefine((e,t)=>{e.attachments.reduce((e,t)=>e+("inline"===t.source.type?t.size:0),0)>N&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["attachments"],message:"Inline attachments must be 41943040 bytes or less in total."})}),Pe=Te.extend({attachments:o.z.array(ge).max(6).default([]),references:Ae}).strict(),Oe=o.z.object({type:o.z.literal("runtime-path"),path:o.z.string().trim().min(1).max(4096).refine(e=>e.startsWith("/")||/^[A-Za-z]:[\\/]/.test(e),"Runtime paths must be absolute in the target controlled instance.")}).strict(),$e=o.z.object({modelEntityId:o.z.string().trim().min(1).max(120),modelName:o.z.string().trim().min(1).max(240)}).strict(),Ne=o.z.enum(["none","minimal","low","medium","high","xhigh","max","ultra"]),_e=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("current-folder"),branch:o.z.string().trim().min(1).max(1024)}).strict(),o.z.object({type:o.z.literal("existing-worktree"),repositoryContextId:o.z.string().trim().min(1).max(160),worktreeId:o.z.string().trim().min(1).max(160)}).strict(),o.z.object({type:o.z.literal("new-worktree"),branchName:o.z.string().trim().min(1).max(255),startRef:o.z.string().trim().min(1).max(2048),expectedSnapshotId:o.z.string().trim().min(1).max(160)}).strict()]),Ue=o.z.object({mode:o.z.enum(["current-folder","worktree"]),branch:o.z.string().trim().min(1).max(1024)}).strict(),qe=Ee.extend({agent:_,cwd:Oe,cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Ue.optional(),workspaceSelection:_e.optional(),clientRequestId:o.z.string().trim().min(1).max(160),modelSelection:$e.optional(),reasoningEffort:Ne.optional(),storyId:T.optional()}).strict(),Le=Pe.extend({agent:_,cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Ue.optional(),workspaceSelection:_e.optional(),clientRequestId:o.z.string().trim().min(1).max(160),modelSelection:$e.optional(),reasoningEffort:Ne.optional(),storyId:T.optional()}).strict(),De=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160),modelSelection:$e}).strict(),Me=o.z.object({sessionId:o.z.string().trim().min(1).max(120),accepted:o.z.literal(!0)}).strict(),Be=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160),reasoningEffort:Ne}).strict(),He=o.z.object({cwdFolderId:o.z.string().trim().min(1).max(120).optional(),branch:o.z.string().trim().min(1).max(1024)}).strict(),Fe=o.z.object({sessionId:o.z.string().trim().min(1).max(120),accepted:o.z.literal(!0)}).strict();o.z.object({storyId:T.nullable()}).strict(),o.z.object({sessionId:o.z.string().trim().min(1).max(120),storyId:T.optional()}).strict();const Ve=o.z.object({sessionId:o.z.string().trim().min(1).max(120),unread:o.z.boolean()}).strict(),Ge=o.z.object({disposition:o.z.enum(["created","already-created"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),creationSource:o.z.literal("ai-session")}).strict(),Ye=o.z.object({mode:o.z.enum(["current","managed-worktree"]).default("current")}).strict().default({mode:"current"}),We=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160),throughTurnId:o.z.string().trim().min(1).max(240).optional(),workspace:Ye.optional().default({mode:"current"})}).strict(),Ke=o.z.object({disposition:o.z.enum(["created","already-created"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),creationSource:o.z.literal("ai-session")}).strict(),Je=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160)}).strict(),Ze=o.z.object({disposition:o.z.enum(["opened","already-open"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),appSessionId:o.z.string().trim().min(1).max(120),creationSource:U}).strict(),Qe=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160)}).strict(),Xe=o.z.object({disposition:o.z.enum(["closed","already-closed"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),creationSource:U}).strict(),et=o.z.object({disposition:o.z.enum(["cleared","already-cleared"]),aiSessionId:o.z.string().trim().min(1).max(120),clearedSessionIds:o.z.array(o.z.string().trim().min(1).max(120))}).strict();o.z.object({code:o.z.enum(["invalid-request","not-found","unsupported","provider-unavailable","materialization-failed","open-app-failed","close-failed","conflict"]),message:o.z.string().trim().min(1).max(4e3),retryable:o.z.boolean().default(!1),aiSessionId:o.z.string().trim().min(1).max(120).optional(),providerSessionId:o.z.string().trim().min(1).max(240).optional()}).strict();const tt=o.z.object({decision:o.z.enum(["allow","deny","skip"])}).strict(),nt=o.z.object({expectedRevision:o.z.number().int().min(0),queueIds:o.z.array(o.z.string().trim().min(1).max(120)).max(100)}).strict(),it=o.z.object({expectedRevision:o.z.number().int().min(0),message:o.z.string().trim().min(1).max(2e4),attachments:o.z.array(o.z.union([o.z.object({id:o.z.string().trim().min(1).max(120),source:o.z.object({type:o.z.literal("retained")}).strict()}).strict(),ge])).max(6).optional()}).strict();o.z.object({code:o.z.string().trim().min(1).max(160),message:o.z.string(),instanceId:o.z.string().trim().min(1).max(160).optional(),nodeId:o.z.string().trim().min(1).max(160).optional(),route:o.z.string().trim().min(1).max(4096).optional()}).strict();const ot=o.z.object({id:o.z.string().trim().min(1).max(120),messageId:o.z.string().trim().min(1).max(240).optional(),message:o.z.string().trim().min(1).max(2e4),attachments:o.z.array(pe).max(6).default([]),references:Ae,permissionMode:he.optional(),status:o.z.enum(["queued","sending","failed"]).default("queued"),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),error:o.z.string().trim().max(4e3).optional()}).strict(),at=o.z.object({revision:o.z.number().int().min(0).default(0),pendingCount:o.z.number().int().min(0).default(0),items:o.z.array(ot).max(100).default([])}).strict().default({revision:0,pendingCount:0,items:[]}),rt=o.z.enum(["control","realtime","adapter-snapshot","transcript-tail","transcript-scan","process-scan","app-session"]),st=o.z.object({id:o.z.string().trim().min(1).max(240),status:o.z.enum(["running","completed"]),startedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),dt=o.z.object({id:o.z.string().trim().min(1).max(240),providerTurnId:o.z.string().trim().max(240).optional(),source:rt.optional(),userPrompt:o.z.string().trim().optional(),userMessages:o.z.array(F).max(100).optional(),status:o.z.enum(["queued","running","waiting","completed","failed"]).default("running"),phase:G.optional(),summary:o.z.string().trim().max(1e3).optional(),lastMessage:o.z.string().trim().optional(),lastMessageItemId:o.z.string().trim().max(240).optional(),contextCompactions:o.z.array(st).max(20).optional(),revision:o.z.number().int().min(0).default(0),sourcePriority:o.z.number().int().min(0).max(100).optional(),snapshotVersion:o.z.number().int().min(0).optional(),observedAt:o.z.string().datetime().optional(),startedAt:o.z.string().datetime().optional(),updatedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),ct=dt.pick({id:!0,providerTurnId:!0,userPrompt:!0,userMessages:!0,status:!0,phase:!0,summary:!0,lastMessage:!0,contextCompactions:!0,startedAt:!0,updatedAt:!0,completedAt:!0}).strict(),lt=o.z.object({id:o.z.string().trim().min(1).max(120),agent:_,creationSource:U.default("app-session"),appSessionId:o.z.string().trim().max(120).optional(),appId:o.z.string().trim().max(120).optional(),providerSessionId:o.z.string().trim().max(240).optional(),lineage:me,providerMeta:o.z.record(o.z.string(),o.z.unknown()).optional(),modelSelection:$e.optional(),reasoningEffort:Ne.optional(),storyId:T.optional(),appBindingKeys:o.z.array(o.z.string().trim().min(1).max(240)).max(20).optional(),actions:de.optional(),activeTurnId:o.z.string().trim().max(240).optional(),title:o.z.string().trim().max(240).optional(),cwd:o.z.string().trim().max(4096).optional(),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),userPrompt:o.z.string().trim().optional(),turns:o.z.array(dt).max(50).optional(),status:V.default("running"),phase:G.default("unknown"),summary:o.z.string().trim().max(1e3).optional(),lastMessage:o.z.string().trim().optional(),lastMessageItemId:o.z.string().trim().max(240).optional(),currentTool:Y.optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).default(0),subAgents:re.default([]),transcriptPath:o.z.string().trim().max(4096).optional(),transcriptSize:o.z.number().int().min(0).optional(),startedAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional(),error:o.z.string().trim().max(4e3).optional(),counters:se,queue:at,unread:o.z.boolean().default(!1)}).strict(),mt=lt.pick({id:!0,appBindingKeys:!0,cwd:!0,error:!0,providerMeta:!0,modelSelection:!0,reasoningEffort:!0,queue:!0,subAgents:!0}).strict(),ut=dt.pick({id:!0,providerTurnId:!0,status:!0,phase:!0,revision:!0,startedAt:!0,updatedAt:!0,completedAt:!0}).extend({bodyRevision:o.z.string().trim().min(1).max(64)}).strict(),pt=o.z.object({sessionId:o.z.string().trim().min(1).max(120),revision:o.z.string().trim().min(1).max(64),turns:o.z.array(ut).max(50)}).strict(),gt=o.z.object({sessionId:o.z.string().trim().min(1).max(120),revision:o.z.string().trim().min(1).max(64),turn:dt}).strict(),zt=o.z.string().trim().min(1).max(64),ht=o.z.object({kind:o.z.literal("not-modified"),revision:zt}).strict(),yt=o.z.discriminatedUnion("kind",[ht,o.z.object({kind:o.z.literal("updated"),revision:zt,detail:mt}).strict()]),ft=o.z.discriminatedUnion("kind",[ht,o.z.object({kind:o.z.literal("updated"),revision:zt,index:pt}).strict()]),It=o.z.discriminatedUnion("kind",[ht,o.z.object({kind:o.z.literal("updated"),revision:zt,body:gt}).strict()]),bt=o.z.object({session:lt,provider:o.z.string().trim().min(1).max(80),action:o.z.enum(["send","queue","steer","interrupt","approval"]),decision:o.z.enum(["allow","deny","skip"]).optional(),turnId:o.z.string().trim().min(1).max(240).optional(),providerTurnId:o.z.string().trim().min(1).max(240).optional(),queueId:o.z.string().trim().min(1).max(120).optional()}).strict(),wt=bt.omit({session:!0}).extend({sessionId:o.z.string().trim().min(1).max(120),messageId:o.z.string().trim().min(1).max(240).optional()}).strict(),vt=o.z.object({sessionId:o.z.string().trim().min(1).max(120),queueRevision:o.z.number().int().min(0),action:o.z.enum(["retry","remove","edit","reorder"]),queueId:o.z.string().trim().min(1).max(120).optional()}).strict(),xt=o.z.union([wt,bt.transform(function(e){const t=e.session.turns?.at(-1),n=(e.queueId?e.session.queue?.items.find(t=>t.id===e.queueId)?.messageId:void 0)||("send"===e.action||"queue"===e.action||"steer"===e.action?t?.userMessages?.at(-1)?.id:void 0);return wt.parse({sessionId:e.session.id,provider:e.provider,action:e.action,...e.decision?{decision:e.decision}:{},...e.turnId||e.session.activeTurnId||t?.id?{turnId:e.turnId||e.session.activeTurnId||t?.id}:{},...e.providerTurnId||t?.providerTurnId?{providerTurnId:e.providerTurnId||t?.providerTurnId}:{},...e.queueId?{queueId:e.queueId}:{},...n?{messageId:n}:{}})})]),At=o.z.object({id:o.z.string().trim().min(1).max(120),agent:_,creationSource:U,providerSessionId:o.z.string().trim().min(1).max(240),lineage:me,modelSelection:$e.optional(),reasoningEffort:Ne.optional(),storyId:T.optional(),title:o.z.string().trim().max(240).optional(),userPrompt:o.z.string().trim().optional(),lastMessage:o.z.string().trim().optional(),cwd:o.z.string().trim().min(1).max(4096),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),lastActiveAt:o.z.string().datetime(),archivedAt:o.z.string().datetime()}).strict();o.z.object({schemaVersion:o.z.literal(1).default(1),items:o.z.array(At).max(1e4).default([])}).strict();const St=o.z.object({items:o.z.array(At).max(1e4).default([])}).strict(),Ct=o.z.object({item:At,turns:o.z.array(ct).max(50).default([])}).strict(),kt=o.z.object({modelSelection:$e.optional()}).strict(),jt=o.z.object({disposition:o.z.enum(["resumed","already-open"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),appSessionId:o.z.string().trim().min(1).max(120).optional(),creationSource:U}).strict(),Rt=dt.omit({userMessages:!0}),Tt=lt.pick({id:!0,agent:!0,creationSource:!0,appSessionId:!0,appId:!0,providerSessionId:!0,lineage:!0,providerMeta:!0,modelSelection:!0,reasoningEffort:!0,storyId:!0,appBindingKeys:!0,actions:!0,activeTurnId:!0,title:!0,cwd:!0,cwdFolderId:!0,userPrompt:!0,turns:!0,status:!0,phase:!0,summary:!0,lastMessage:!0,lastMessageItemId:!0,currentTool:!0,toolCallsSinceLastMessage:!0,subAgents:!0,queue:!0,startedAt:!0,updatedAt:!0,error:!0,unread:!0}).extend({turns:o.z.array(Rt).max(50).optional(),detailRevision:o.z.string().trim().min(1).max(64).optional(),turnsRevision:o.z.string().trim().min(1).max(64).optional(),latestTurnRef:o.z.object({id:dt.shape.id,bodyRevision:o.z.string().trim().min(1).max(64)}).strict().optional(),turnCount:o.z.number().int().min(0).optional(),subAgentCount:o.z.number().int().min(0).optional(),lastUserMessageAt:o.z.string().datetime().optional()}).strict(),Et=o.z.object({runningCount:o.z.number().int().min(0).default(0),waitingCount:o.z.number().int().min(0).default(0),staleCount:o.z.number().int().min(0).default(0),sessions:o.z.array(Tt).default([]),updatedAt:o.z.string().datetime()}).strict();o.z.object({streamId:o.z.string().trim().min(1).max(240),revision:o.z.number().int().min(0),lastEventAt:o.z.string().datetime(),snapshot:Et}).strict();const Pt=Et.pick({runningCount:!0,waitingCount:!0,staleCount:!0,updatedAt:!0}).extend({idleCount:o.z.number().int().min(0).default(0),problemCount:o.z.number().int().min(0).default(0),revision:o.z.number().int().min(0).optional()}),Ot=o.z.enum(["provider-event","app-session-created","app-session-updated","app-session-deleted","discovery-scan","control-action","heartbeat-sync","startup"]),$t=o.z.object({streamId:o.z.string().trim().min(1).max(240),instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),revision:o.z.number().int().min(0),previousRevision:o.z.number().int().min(0).optional(),traceId:o.z.string().trim().min(1).max(160),generatedAt:o.z.string().datetime(),reason:Ot}).strict(),Nt=o.z.object({meta:$t,snapshot:Et}).strict(),_t=o.z.object({meta:$t,upserted:o.z.array(Tt).default([]),removed:o.z.array(o.z.string().trim().min(1).max(120)).default([])}).strict(),Ut=o.z.object({meta:$t,sessionIds:o.z.array(o.z.string().trim().min(1).max(120)).default([]),expiresAt:o.z.string().datetime()}).strict();o.z.object({instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240).optional(),turnId:o.z.string().trim().min(1).max(240),itemId:o.z.string().trim().min(1).max(240),delta:o.z.string().min(1),generatedAt:o.z.string().datetime()}).strict().omit({instanceId:!0,nodeId:!0,providerSessionId:!0}).strict(),o.z.object({instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),item:X,generatedAt:o.z.string().datetime()}).strict(),o.z.object({instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240).optional(),turnId:o.z.string().trim().min(1).max(240),itemId:o.z.string().trim().min(1).max(240),field:o.z.literal("output"),delta:o.z.string().min(1),generatedAt:o.z.string().datetime()}).strict().omit({instanceId:!0,nodeId:!0,providerSessionId:!0}).strict();const qt=o.z.object({streamId:o.z.string().trim().min(1).max(240),instanceId:o.z.string().trim().min(1).max(160),sinceRevision:o.z.number().int().min(0),latestRevision:o.z.number().int().min(0),earliestRetainedRevision:o.z.number().int().min(0),syncRequired:o.z.boolean().default(!1),events:o.z.array(o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("ai-session.snapshot"),payload:Nt}).strict(),o.z.object({type:o.z.literal("ai-session.patch"),payload:_t}).strict(),o.z.object({type:o.z.literal("ai-session.removed"),payload:Ut}).strict()])).default([])}).strict(),Lt=o.z.object({source:rt,sourcePriority:o.z.number().int().min(0).max(100).optional(),observedAt:o.z.string().datetime().optional(),snapshotVersion:o.z.number().int().min(0).optional()}).strict(),Dt=Lt.extend({type:o.z.literal("snapshot"),agent:o.z.string().trim().min(1).max(80),creationSource:U.optional(),appSessionId:o.z.string().trim().max(120).optional(),appId:o.z.string().trim().max(120).optional(),providerSessionId:o.z.string().trim().max(240).optional(),lineage:le.optional(),providerMeta:o.z.record(o.z.string(),o.z.unknown()).optional(),modelSelection:$e.optional(),reasoningEffort:Ne.optional(),storyId:T.optional(),appBindingKeys:o.z.array(o.z.string().trim().min(1).max(240)).max(20).optional(),actions:de.optional(),title:o.z.string().trim().max(240).optional(),cwd:o.z.string().trim().max(4096).optional(),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),activeTurnId:o.z.string().trim().max(240).optional(),userPrompt:o.z.string().trim().optional(),turns:o.z.array(dt).max(50).optional(),status:V.optional(),phase:G.optional(),summary:o.z.string().trim().max(1e3).optional(),lastMessage:o.z.string().trim().optional(),lastMessageItemId:o.z.string().trim().max(240).optional(),error:o.z.string().trim().max(4e3).optional(),currentTool:Y.optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).optional(),subAgents:re.optional(),transcriptPath:o.z.string().trim().max(4096).optional(),transcriptSize:o.z.number().int().min(0).optional(),replaceActivity:o.z.boolean().optional()}).strict(),Mt=Lt.extend({type:o.z.literal("event"),sessionId:o.z.string().trim().min(1).max(120),kind:o.z.enum(["lifecycle","send-ack","turn-started","user-message","assistant-message","approval-requested","turn-completed","session-error","tool-activity","sub-agent-activity","context-compaction","model-selection","reasoning-effort"]),modelSelection:$e.optional(),reasoningEffort:Ne.optional(),activeTurnId:o.z.string().trim().max(240).optional(),providerTurnId:o.z.string().trim().max(240).optional(),userPrompt:o.z.string().trim().optional(),userMessage:F.optional(),text:o.z.string().optional(),itemId:o.z.string().trim().max(240).optional(),status:V.optional(),phase:G.optional(),summary:o.z.string().trim().max(1e3).optional(),error:o.z.string().trim().max(4e3).optional(),currentTool:Y.nullable().optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).optional(),subAgents:re.optional(),contextCompaction:st.optional(),counters:o.z.object({toolCalls:o.z.number().int().min(0).optional(),edits:o.z.number().int().min(0).optional(),approvals:o.z.number().int().min(0).optional()}).strict().optional()}).strict().superRefine((e,t)=>{if("model-selection"===e.kind?e.modelSelection||t.addIssue({code:"custom",path:["modelSelection"],message:"model-selection events require modelSelection"}):void 0!==e.modelSelection&&t.addIssue({code:"custom",path:["modelSelection"],message:"modelSelection is only valid for model-selection events"}),"reasoning-effort"===e.kind?e.reasoningEffort||t.addIssue({code:"custom",path:["reasoningEffort"],message:"reasoning-effort events require reasoningEffort"}):void 0!==e.reasoningEffort&&t.addIssue({code:"custom",path:["reasoningEffort"],message:"reasoningEffort is only valid for reasoning-effort events"}),"session-error"!==e.kind||e.error||t.addIssue({code:"custom",path:["error"],message:"session-error events require error"}),"context-compaction"===e.kind?e.contextCompaction||t.addIssue({code:"custom",path:["contextCompaction"],message:"context-compaction events require contextCompaction"}):void 0!==e.contextCompaction&&t.addIssue({code:"custom",path:["contextCompaction"],message:"contextCompaction is only valid for context-compaction events"}),"send-ack"!==e.kind&&"user-message"!==e.kind&&void 0!==e.userMessage&&t.addIssue({code:"custom",path:["userMessage"],message:"userMessage is only valid for send-ack and user-message events"}),"sub-agent-activity"===e.kind?e.subAgents||t.addIssue({code:"custom",path:["subAgents"],message:"sub-agent-activity events require subAgents"}):void 0!==e.subAgents&&t.addIssue({code:"custom",path:["subAgents"],message:"subAgents is only valid for sub-agent-activity events"}),"tool-activity"!==e.kind)return void 0!==e.currentTool&&t.addIssue({code:"custom",path:["currentTool"],message:"currentTool is only valid for tool-activity events"}),void(void 0!==e.toolCallsSinceLastMessage&&t.addIssue({code:"custom",path:["toolCallsSinceLastMessage"],message:"toolCallsSinceLastMessage is only valid for tool-activity events"}));"currentTool"in e||t.addIssue({code:"custom",path:["currentTool"],message:"tool-activity events require currentTool"}),void 0===e.toolCallsSinceLastMessage&&t.addIssue({code:"custom",path:["toolCallsSinceLastMessage"],message:"tool-activity events require toolCallsSinceLastMessage"})});o.z.discriminatedUnion("type",[Dt,Mt]);const Bt=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Ht=o.z.string().datetime(),Ft=o.z.string().trim().min(1).max(255).refine(e=>!(/[\u0000-\u001f\u007f ~^:?*[\\]/.test(e)||e.includes("..")||e.endsWith(".")||e.endsWith("/")),"Invalid Git name."),Vt=o.z.string().min(1).max(4096).refine(e=>!(e.includes("\0")||e.startsWith("/")||e.startsWith("\\")||/^[a-zA-Z]:[\\/]/.test(e))&&e.split("/").every(e=>e.length>0&&"."!==e&&".."!==e&&".git"!==e),"Path must be a safe repository-relative path."),Gt=o.z.enum(["ai-session","app-session"]),Yt=o.z.enum(["available","session-not-found","session-inactive","cwd-missing","cwd-inaccessible","git-unavailable","not-worktree"]),Wt=o.z.enum(["branch","detached","unborn"]),Kt=o.z.enum(["review-changes","resolve-conflicts","publish-branch","push","pull","diverged","up-to-date"]),Jt=o.z.enum(["conflict","staged","unstaged","untracked"]),Zt=o.z.enum(["added","modified","deleted","renamed","copied","type-changed","unmerged","untracked"]),Qt=o.z.object({state:Wt,oid:o.z.string().regex(/^[0-9a-f]{40,64}$/).optional(),branch:o.z.string().min(1).max(1024).optional()}).strict(),Xt=o.z.object({ref:o.z.string().min(1).max(2048),remote:Ft,branch:o.z.string().min(1).max(1024),ahead:o.z.number().int().nonnegative(),behind:o.z.number().int().nonnegative()}).strict(),en=o.z.object({id:Bt,isCurrent:o.z.boolean(),isMain:o.z.boolean(),managed:o.z.boolean(),head:Qt,dirty:o.z.boolean(),locked:o.z.boolean(),lockReason:o.z.string().max(1e3).optional(),prunable:o.z.boolean(),activeAiSessionIds:o.z.array(Bt).max(256).default([]),activeAppSessionIds:o.z.array(Bt).max(256).default([])}).strict(),tn=o.z.enum(["main-worktree","external-worktree","outside-workspace-roots","dirty","locked","prunable","session-occupied","path-inaccessible"]),nn=en.extend({canCreateAiSession:o.z.boolean(),canRemove:o.z.boolean(),createAiSessionBlockers:o.z.array(tn).max(16).default([]),removeBlockers:o.z.array(tn).max(16).default([])}).strict(),on=o.z.object({repositoryId:Bt,repositoryContextId:Bt,snapshotId:Bt,items:o.z.array(nn).max(1e4)}).strict(),an=o.z.object({conflicts:o.z.number().int().nonnegative(),staged:o.z.number().int().nonnegative(),unstaged:o.z.number().int().nonnegative(),untracked:o.z.number().int().nonnegative()}).strict(),rn=o.z.object({name:Ft,fetchUrl:o.z.string().max(4096).optional(),pushUrl:o.z.string().max(4096).optional()}).strict(),sn=o.z.object({availability:Yt,sessionKind:Gt,sessionId:Bt,observedAt:Ht,snapshotId:Bt.optional(),repositoryId:Bt.optional(),repositoryContextId:Bt.optional(),repositoryRoot:o.z.string().min(1).max(4096).optional(),displayName:o.z.string().trim().min(1).max(255).optional(),cwdRelativePath:o.z.string().max(4096).optional(),head:Qt.optional(),upstream:Xt.optional(),currentWorktree:en.optional(),changes:an.optional(),remotes:o.z.array(rn).max(128).optional(),primaryAction:Kt.optional()}).strict(),dn=o.z.enum(["directory","file","symlink","submodule","nested-repository","special"]),cn=o.z.object({executable:o.z.boolean(),gitMode:o.z.enum(["100644","100755","120000","160000"]).optional()}).strict(),ln=o.z.object({name:o.z.string().min(1).max(1024),path:Vt,kind:dn,traversable:o.z.boolean(),editable:o.z.boolean(),size:o.z.number().int().nonnegative().optional(),mode:cn.optional()}).strict();o.z.object({path:o.z.string().max(4096),entries:o.z.array(ln).max(1e4),snapshotId:Bt}).strict();const mn=o.z.object({name:o.z.string().min(1).max(1024),path:Vt,kind:o.z.enum(["directory","file"])}).strict();o.z.object({entries:o.z.array(mn).max(200),truncated:o.z.boolean()}).strict();const un=o.z.string().min(16).max(160).regex(/^[a-zA-Z0-9_.:-]+$/),pn=o.z.object({path:Vt,content:o.z.string(),byteLength:o.z.number().int().nonnegative(),version:un,mode:cn}).strict(),gn=o.z.object({path:Vt,oldPath:Vt.optional(),scope:Jt,status:Zt,version:un,binary:o.z.boolean().default(!1)}).strict(),zn=o.z.object({snapshotId:Bt,summary:an,entries:o.z.array(gn).max(1e5)}).strict();o.z.object({file:pn.optional(),snapshotId:Bt,context:sn,changes:zn}).strict();const hn=o.z.object({kind:o.z.enum(["metadata","hunk","context","addition","deletion"]),content:o.z.string(),oldLine:o.z.number().int().positive().optional(),newLine:o.z.number().int().positive().optional(),oldStart:o.z.number().int().nonnegative().optional(),oldCount:o.z.number().int().nonnegative().optional(),newStart:o.z.number().int().nonnegative().optional(),newCount:o.z.number().int().nonnegative().optional(),heading:o.z.string().optional(),hunkId:o.z.string().min(1).max(200).optional()}).strict();o.z.object({path:Vt,oldPath:Vt.optional(),scope:Jt,binary:o.z.boolean(),complete:o.z.boolean(),truncated:o.z.boolean(),byteLimit:o.z.number().int().positive(),content:o.z.string(),lines:o.z.array(hn).max(2e5),contextGaps:o.z.array(o.z.object({gapId:o.z.string().min(1).max(500),beforeHunkId:o.z.string().min(1).max(200).optional(),afterHunkId:o.z.string().min(1).max(200).optional(),lines:o.z.array(hn).max(6e3),startLineCount:o.z.number().int().nonnegative().max(3e3),hasMore:o.z.boolean()}).strict()).max(2e4),version:un,snapshotId:Bt}).strict();const yn=o.z.object({name:o.z.string().min(1).max(1024),oid:o.z.string().regex(/^[0-9a-f]{40,64}$/),kind:o.z.enum(["local","remote-tracking"]),current:o.z.boolean(),upstream:o.z.string().min(1).max(2048).optional(),ahead:o.z.number().int().nonnegative().optional(),behind:o.z.number().int().nonnegative().optional(),checkedOutWorktreeIds:o.z.array(Bt).max(256).default([])}).strict(),fn=o.z.object({snapshotId:Bt,branches:o.z.array(yn).max(1e5)}).strict();o.z.object({snapshotId:Bt,context:sn,branches:fn}).strict(),o.z.object({ok:o.z.literal(!0),snapshotId:Bt,context:sn,changes:zn.optional(),commitOid:o.z.string().regex(/^[0-9a-f]{40,64}$/).optional()}).strict();const In=o.z.enum(["REPOSITORY_REQUEST_INVALID","REPOSITORY_SESSION_NOT_FOUND","REPOSITORY_SESSION_INACTIVE","REPOSITORY_CWD_MISSING","REPOSITORY_CWD_INACCESSIBLE","REPOSITORY_GIT_UNAVAILABLE","REPOSITORY_NOT_WORKTREE","REPOSITORY_PATH_INVALID","REPOSITORY_PATH_FORBIDDEN","REPOSITORY_FILE_NOT_FOUND","REPOSITORY_FILE_EXISTS","REPOSITORY_FILE_UNSUPPORTED","REPOSITORY_FILE_TOO_LARGE","REPOSITORY_FILE_BINARY","REPOSITORY_FILE_STALE","REPOSITORY_STATE_STALE","REPOSITORY_WORKTREE_NOT_FOUND","REPOSITORY_WORKTREE_OCCUPIED","REPOSITORY_WORKTREE_UNSAFE","REPOSITORY_BRANCH_INVALID","REPOSITORY_BRANCH_OCCUPIED","REPOSITORY_BRANCH_UNMERGED","REPOSITORY_CONFLICT","REPOSITORY_DIRTY","REPOSITORY_NOTHING_TO_COMMIT","REPOSITORY_IDENTITY_MISSING","REPOSITORY_HOOK_FAILED","REPOSITORY_SIGNING_FAILED","REPOSITORY_AUTHENTICATION_FAILED","REPOSITORY_CREDENTIAL_MISSING","REPOSITORY_CREDENTIAL_AMBIGUOUS","REPOSITORY_REMOTE_UNSUPPORTED","REPOSITORY_HOST_KEY_REQUIRED","REPOSITORY_AUTHENTICATION_REJECTED","REPOSITORY_NON_FAST_FORWARD","REPOSITORY_UPSTREAM_MISSING","REPOSITORY_COMMAND_TIMEOUT","REPOSITORY_OUTPUT_LIMIT","REPOSITORY_OPERATION_ABORTED","REPOSITORY_OPERATION_FAILED"]);o.z.object({ok:o.z.literal(!1),error:o.z.object({code:In,message:o.z.string().trim().min(1).max(2e3),retryable:o.z.boolean(),details:o.z.record(o.z.string(),o.z.union([o.z.string(),o.z.number(),o.z.boolean()])).optional()}).strict()}).strict();const bn=o.z.object({expectedSnapshotId:Bt}).strict(),wn=o.z.object({path:Vt,expectedVersion:un}).strict();o.z.object({path:Vt,content:o.z.string().max(4194304),expectedAbsent:o.z.literal(!0),expectedSnapshotId:Bt}).strict(),o.z.object({path:Vt,content:o.z.string().max(4194304),expectedVersion:un,expectedSnapshotId:Bt}).strict(),o.z.object({path:Vt,destination:Vt,expectedVersion:un,expectedDestinationAbsent:o.z.literal(!0),expectedSnapshotId:Bt}).strict(),o.z.object({path:Vt,expectedVersion:un,expectedSnapshotId:Bt,confirm:o.z.literal(!0)}).strict(),bn.extend({paths:o.z.array(wn).min(1).max(1e3)}).strict(),bn.extend({paths:o.z.array(wn).min(1).max(1e3)}).strict(),bn.extend({paths:o.z.array(wn).min(1).max(1e3),confirm:o.z.literal(!0)}).strict(),bn.extend({paths:o.z.array(wn).min(1).max(1e3),confirm:o.z.literal(!0)}).strict(),bn.extend({message:o.z.string().trim().min(1).max(65536)}).strict();const vn=o.z.discriminatedUnion("mode",[o.z.object({mode:o.z.literal("new-branch"),branchName:Ft,startRef:o.z.string().trim().min(1).max(2048),expectedSnapshotId:Bt}).strict(),o.z.object({mode:o.z.literal("existing-branch"),branchName:Ft,expectedSnapshotId:Bt}).strict()]),xn=bn.extend({worktreeId:Bt,confirm:o.z.literal(!0)}).strict(),An=o.z.object({worktreeId:Bt,worktrees:on}).strict(),Sn=o.z.object({removedWorktreeId:Bt,branchRetained:o.z.boolean(),worktrees:on}).strict(),Cn=o.z.enum(["main-worktree","outside-workspace-roots","path-inaccessible","locked","prunable","session-occupied","main-session-occupied","detached-head","unborn-head","main-dirty"]),kn=o.z.object({worktreeId:Bt}).strict(),jn=o.z.object({worktreeId:Bt,canMove:o.z.boolean(),blockers:o.z.array(Cn).max(16).default([]),targetBranch:o.z.string().min(1).max(1024).optional(),targetChanges:an.default({conflicts:0,staged:0,unstaged:0,untracked:0}),mainWorktreeId:Bt,mainBranch:o.z.string().min(1).max(1024).optional()}).strict(),Rn=bn.extend({worktreeId:Bt,confirm:o.z.literal(!0)}).strict(),Tn=o.z.object({movedWorktreeId:Bt,adoptedBranch:o.z.string().min(1).max(1024),previousHead:o.z.string().regex(/^[0-9a-f]{40,64}$/),carriedChanges:o.z.boolean(),worktrees:on}).strict(),En=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("current")}).strict(),o.z.object({type:o.z.literal("worktree"),repositoryContextId:Bt,worktreeId:Bt}).strict()]);o.z.object({agent:o.z.enum(["codex","claude","opencode"]),workspaceSelection:En,message:o.z.string().trim().min(1).max(2e4),clientRequestId:Bt,permissionMode:o.z.enum(["ask","auto-review","full-access"]).optional()}).strict(),o.z.object({agent:o.z.enum(["codex","claude","opencode"]),worktree:vn,message:o.z.string().trim().min(1).max(2e4),clientRequestId:Bt,permissionMode:o.z.enum(["ask","auto-review","full-access"]).optional()}).strict(),o.z.object({aiSessionId:Bt,providerSessionId:o.z.string().trim().min(1).max(240),worktreeId:Bt,disposition:o.z.literal("started")}).strict();const Pn=o.z.object({name:o.z.string().min(1).max(1024),kind:o.z.enum(["branch","head"]).default("branch"),current:o.z.boolean(),currentFolderSelectable:o.z.boolean(),worktreeSelectable:o.z.boolean(),worktreeCheckout:o.z.enum(["attached","detached"]).default("attached"),currentFolderReason:o.z.enum(["dirty","session-occupied","branch-occupied"]).optional(),worktreeReason:o.z.enum(["current-branch","branch-occupied","worktree-unavailable"]).optional()}).strict(),On=o.z.object({availability:Yt,currentBranch:o.z.string().min(1).max(1024).optional(),dirty:o.z.boolean().default(!1),branches:o.z.array(Pn).max(1e5).default([]),repositoryContextId:Bt.optional(),snapshotId:Bt.optional(),worktrees:o.z.array(nn).max(1e4).default([])}).strict();function $n(e,t,n){return void 0===t?void 0===n?{method:e}:{method:e,signal:n}:{method:e,...void 0===n?{}:{signal:n},headers:{"content-type":"application/json"},body:JSON.stringify(t)}}o.z.object({cwd:Oe}).strict(),o.z.object({cwd:Oe,branch:Ft}).strict(),o.z.union([qe.safeExtend({gitSelection:Ue,workspaceSelection:o.z.never().optional()}).strict(),qe.safeExtend({gitSelection:o.z.never().optional(),workspaceSelection:_e}).strict()]),o.z.union([Le.safeExtend({cwd:Oe,gitSelection:Ue,workspaceSelection:o.z.never().optional()}).strict(),Le.safeExtend({cwd:Oe,gitSelection:o.z.never().optional(),workspaceSelection:_e}).strict()]),bn.extend({name:Ft}).strict(),bn.extend({branch:o.z.string().trim().min(1).max(2048)}).strict(),bn.extend({name:Ft,remoteTrackingRef:o.z.string().trim().min(1).max(2048)}).strict(),bn.extend({name:Ft,confirm:o.z.literal(!0)}).strict(),bn.extend({remote:Ft}).strict(),bn.extend({remote:Ft,sourceBranch:Ft,targetBranch:Ft,setUpstream:o.z.boolean(),confirmSetUpstream:o.z.boolean().optional()}).strict().refine(e=>!e.setUpstream||!0===e.confirmSetUpstream,{message:"Setting an upstream requires explicit confirmation.",path:["confirmSetUpstream"]}),bn.extend({remote:Ft,sourceBranch:Ft,targetBranch:Ft}).strict();const Nn=e=>o.z.object({data:e}).strict(),_n=Tt,Un=Et.extend({sessions:o.z.array(_n)}),qn=o.z.object({updatedAt:o.z.string().datetime(),instances:o.z.array(o.z.object({instanceId:o.z.string().trim().min(1).max(160),streamId:o.z.string().trim().min(1).max(240),aiSessions:Un,revision:o.z.number().int().nonnegative().optional(),lastEventAt:o.z.string().datetime().optional()}).strict())}).strict(),Ln=o.z.object({id:o.z.string().trim().min(1),kind:o.z.enum(["image","file"]),name:o.z.string(),mime:o.z.string(),size:o.z.number().int().nonnegative(),expiresAt:o.z.string().datetime().optional()}).strict();function Dn(e){const t=async(t,n,i)=>(await e.request(t,Nn(n),i)).data,n=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(t)}`;return{list(e,n){const i=new URLSearchParams({hierarchy:"subagents"});return n&&i.set("instanceId",n),t(`/api/ai-sessions?${i}`,qn,{signal:e})},refresh(e,n){const i=new URLSearchParams({refresh:"true"});return i.set("hierarchy","subagents"),n&&i.set("instanceId",n),t(`/api/ai-sessions?${i}`,qn,{signal:e})},delta(e,n,i,o){const a=new URLSearchParams({instanceId:e,streamId:n,sinceRevision:String(i),hierarchy:"subagents"});return t(`/api/ai-sessions?${a}`,qt,{signal:o})},history(e,n,i=["codex","claude","opencode"]){const o=new URLSearchParams({hierarchy:"subagents"});return i.length&&o.set("agents",i.join(",")),t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/history?${o}`,St,{signal:n})},historyDetail:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/history/${encodeURIComponent(n)}?hierarchy=subagents`,Ct,{signal:i}),detail(e,i,o,a){const r=o?`?revision=${encodeURIComponent(o)}`:"";return t(`${n(e,i)}${r}`,yt,{signal:a})},turnIndex(e,i,o,a){const r=o?`?revision=${encodeURIComponent(o)}`:"";return t(`${n(e,i)}/turns${r}`,ft,{signal:a})},turnBody(e,i,o,a,r){const s=a?`?revision=${encodeURIComponent(a)}`:"";return t(`${n(e,i)}/turns/${encodeURIComponent(o)}${s}`,It,{signal:r})},timeline:(e,i,o)=>t(`${n(e,i)}/timeline`,ee,{signal:o}),turnTimeline:(e,i,o,a)=>t(`${n(e,i)}/turns/${encodeURIComponent(o)}/timeline`,te,{signal:a}),resume:(e,i,o={})=>t(`${n(e,i)}/resume`,jt,$n("POST",kt.parse(o))),create:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions`,Ge,$n("POST",Le.parse(n))),updateModelSelection(e,i,o,a){const r=De.parse({clientRequestId:o,modelSelection:a});return t(`${n(e,i)}/model-selection`,Me,$n("PUT",r))},updateReasoningEffort(e,i,o,a){const r=Be.parse({clientRequestId:o,reasoningEffort:a});return t(`${n(e,i)}/reasoning-effort`,Fe,$n("PUT",r))},rename:(e,i,o)=>t(`${n(e,i)}/title`,we,$n("PUT",be.parse(o))),fork:(e,i,o)=>t(`${n(e,i)}/fork`,Ke,$n("POST",We.parse(o))),workspace(e,n,i){const o=n?`?${new URLSearchParams({cwdFolderId:n})}`:"";return t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace${o}`,On,{signal:i})},checkoutWorkspaceBranch(e,n){const i=He.parse(n);return t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace/checkout`,On,$n("POST",i))},openApp:(e,i,o)=>t(`${n(e,i)}/open-app`,Ze,$n("POST",Je.parse({clientRequestId:o}))),close:(e,i,o)=>t(`${n(e,i)}/close`,Xe,$n("POST",Qe.parse({clientRequestId:o}))),clear:(e,i)=>t(n(e,i),et,{method:"DELETE"}),executeCommand:(e,i,o)=>t(`${n(e,i)}/commands`,Ie,$n("POST",fe.parse(o))),markRead:(e,i)=>t(`${n(e,i)}/read`,Ve,$n("POST",{})),sendMessage(e,i,o){const a=Pe.parse({...o,attachments:o.attachments??[],references:o.references??[]});return t(`${n(e,i)}/messages`,xt,$n("POST",a))},approval:(e,i,o)=>t(`${n(e,i)}/approval`,xt,$n("POST",tt.parse({decision:o}))),interrupt:(e,i)=>t(`${n(e,i)}/interrupt`,xt,$n("POST",{})),steerQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}/steer`,xt,$n("POST",{})),retryQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}/retry`,vt,$n("POST",{})),removeQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}`,vt,{method:"DELETE"}),editQueue:(e,i,o,a)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}`,vt,$n("PATCH",it.parse(a))),reorderQueue:(e,i,o)=>t(`${n(e,i)}/queue/reorder`,vt,$n("PATCH",nt.parse(o))),async uploadAttachment(t,n){n?.(0);const i=await fetch(t.data).then(e=>e.arrayBuffer()),o=new URLSearchParams({scopeType:t.scopeType||"session",scopeId:t.sessionId,kind:t.kind,name:t.name,mime:t.mime,size:String(i.byteLength)});let a;try{a=await e.request(`/api/controlled-instances/${encodeURIComponent(t.instanceId)}/ai-session-attachments/drafts?${o}`,Nn(Ln),{method:"POST",headers:{"content-type":"application/octet-stream"},body:i},n)}catch(i){if(!function(e){if(!e||"object"!=typeof e)return!1;const t=e;return 404===t.status||405===t.status||"ROUTE_NOT_FOUND"===t.code||"HTTP_404"===t.code}(i))throw i;a=await e.request("/api/ai-session-attachments",Nn(Ln),$n("POST",{instanceId:t.instanceId,sessionId:t.sessionId,kind:t.kind,name:t.name,mime:t.mime,data:t.data}),n)}return n?.(1),a.data},mentionCatalog:(e,i,o)=>t(`${n(e,i)}/mentions`,je,{signal:o}),searchMentionFiles:(e,i,o,a)=>t(`${n(e,i)}/mentions/files`,Re,$n("POST",{query:o},a))}}o.z.object({type:o.z.literal("snapshot"),data:o.z.string(),pendingEscape:o.z.string(),cols:o.z.number().int().positive(),rows:o.z.number().int().positive()}).passthrough();const Mn=o.z.enum(["created","starting","running","stopping","stopped","exited","failed","closed","terminated","unknown"]),Bn=o.z.enum(["tty","vnc","web"]),Hn=o.z.object({mode:Bn,url:o.z.string().trim().min(1).max(4096),token:o.z.string().trim().min(1).max(512),expiresAt:o.z.string().datetime()}).strict(),Fn=o.z.object({revoked:o.z.boolean()}).strict(),Vn=o.z.object({type:o.z.enum(["app-session","provider-session","adapter-key"]),id:o.z.string().trim().min(1).max(240),agent:o.z.string().trim().min(1).max(80).optional(),adapter:o.z.string().trim().min(1).max(80).optional(),key:o.z.string().trim().min(1).max(240).optional()}).strict(),Gn=o.z.record(o.z.string(),o.z.unknown()).and(o.z.object({id:o.z.string().trim().min(1).max(160),appId:o.z.string().trim().min(1).max(160).optional(),title:o.z.string().trim().max(240).optional(),kind:o.z.string().trim().max(80).optional(),status:Mn.default("unknown"),bindings:o.z.array(Vn).max(40).default([]),workspace:o.z.object({cwd:o.z.string().trim().max(4096).optional()}).strict().optional(),createdAt:o.z.string().datetime().optional(),updatedAt:o.z.string().datetime().optional()})),Yn=o.z.object({runningCount:o.z.number().int().min(0).default(0),problemCount:o.z.number().int().min(0).default(0),sessions:o.z.array(Gn).default([]),updatedAt:o.z.string().datetime()}).strict();o.z.object({streamId:o.z.string().trim().min(1).max(240),revision:o.z.number().int().min(0),lastEventAt:o.z.string().datetime(),snapshot:Yn}).strict(),Yn.pick({runningCount:!0,problemCount:!0,updatedAt:!0}).extend({revision:o.z.number().int().min(0).optional()});const Wn=o.z.enum(["app-session-created","app-session-updated","app-session-deleted","app-session-recovered","control-action","heartbeat-sync","startup"]),Kn=o.z.object({streamId:o.z.string().trim().min(1).max(240),instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),revision:o.z.number().int().min(0),previousRevision:o.z.number().int().min(0).optional(),traceId:o.z.string().trim().min(1).max(160),generatedAt:o.z.string().datetime(),reason:Wn}).strict(),Jn=o.z.object({meta:Kn,snapshot:Yn}).strict(),Zn=o.z.object({meta:Kn,session:Gn}).strict(),Qn=o.z.object({meta:Kn,sessionId:o.z.string().trim().min(1).max(160),tombstone:Gn.optional(),expiresAt:o.z.string().datetime().optional()}).strict(),Xn=o.z.object({streamId:o.z.string().trim().min(1).max(240),instanceId:o.z.string().trim().min(1).max(160),sinceRevision:o.z.number().int().min(0),latestRevision:o.z.number().int().min(0),earliestRetainedRevision:o.z.number().int().min(0),syncRequired:o.z.boolean().default(!1),events:o.z.array(o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("app-session.snapshot"),payload:Jn}).strict(),o.z.object({type:o.z.literal("app-session.patch"),payload:Zn}).strict(),o.z.object({type:o.z.literal("app-session.removed"),payload:Qn}).strict()])).default([])}).strict(),ei=o.z.object({appId:o.z.string().trim().min(1).max(120),cwdFolderId:o.z.string().trim().min(1).max(120).optional()}).strict(),ti=o.z.object({title:o.z.string().trim().min(1).max(120)}).strict(),ni=o.z.object({updatedAt:o.z.string().datetime(),instances:o.z.array(o.z.object({instanceId:o.z.string().trim().min(1).max(160),streamId:o.z.string().trim().min(1).max(240),appSessions:Yn,revision:o.z.number().int().nonnegative().optional(),lastEventAt:o.z.string().datetime().optional()}).strict())}).strict();function ii(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data;return{list(e,n){const i=n?`?instanceId=${encodeURIComponent(n)}`:"";return t(`/api/app-sessions${i}`,ni,{signal:e})},refresh(e,n){const i=new URLSearchParams({refresh:"true"});return n&&i.set("instanceId",n),t(`/api/app-sessions?${i}`,ni,{signal:e})},launch(e,n){const i=ei.parse(n);return t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions`,Gn,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i)})},stop:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/stop`,Gn,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),restart:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/restart`,Gn,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),rename(e,n,i){const o=ti.parse({title:i});return t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}`,Gn,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(o)})},access:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/access`,Hn,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),revokeAccess:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/access`,Fn,{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({token:i})}),delta(e,n,i,o){const a=new URLSearchParams({instanceId:e,streamId:n,sinceRevision:String(i)});return t(`/api/app-sessions?${a}`,Xn,{signal:o})}}}const oi=o.z.string().trim().min(1).max(60),ai=o.z.object({id:o.z.string().trim().min(1).max(120),name:oi,isDefault:o.z.boolean(),runningSessionId:o.z.string().trim().min(1).max(160).optional(),diskUsageBytes:o.z.number().int().nonnegative().optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),ri=o.z.object({appId:o.z.string().trim().min(1).max(120),defaultProfileId:o.z.string().trim().min(1).max(120),profiles:o.z.array(ai).max(200),observedAt:o.z.string().datetime()}).strict();o.z.object({name:oi}).strict(),o.z.object({name:oi}).strict();const si=o.z.object({removed:o.z.literal(!0)}).strict();function di(e){const t=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/apps/${encodeURIComponent(t)}/profiles`,n=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data;return{list:(e,i,o)=>n(t(e,i),ri,{method:"GET",signal:o}),create:(e,i,o)=>n(t(e,i),ai,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:o})}),rename:(e,i,o,a)=>n(`${t(e,i)}/${encodeURIComponent(o)}`,ai,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:a})}),setDefault:(e,i,o)=>n(`${t(e,i)}/${encodeURIComponent(o)}/default`,ai,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),remove:(e,i,o)=>n(`${t(e,i)}/${encodeURIComponent(o)}`,si,{method:"DELETE"})}}const ci=o.z.object({accessId:o.z.string().trim().min(1).max(120),token:o.z.string().trim().min(32).max(512),expiresAt:o.z.string().datetime(),relayPath:o.z.literal("/browser-relay")}).strict();function li(e){return{async access(t){var n;return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}/browser-access`,(n=ci,o.z.object({data:n}).strict()),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})})).data}}}function mi(e,t){let n=zi(t);for(let t=0;t<100;t+=1){const t=e.safeParse(n);if(t.success)return t;const i=ui(t.error.issues);let o=!1;for(const e of i){const t=gi(n,e.path);if(t&&"object"==typeof t&&!Array.isArray(t))for(const n of e.keys)Object.prototype.hasOwnProperty.call(t,n)&&(delete t[n],o=!0)}if(!o)return t}return e.safeParse(n)}function ui(e,t=[]){const n=[];for(const i of e){if("unrecognized_keys"===i.code){n.push({code:"unrecognized_keys",keys:i.keys,path:[...t,...i.path]});continue}if("invalid_union"!==i.code||!Array.isArray(i.errors))continue;const e=i.errors.filter(e=>Array.isArray(e));if(!e.length)continue;const o=e.reduce((e,t)=>pi(t)<pi(e)?t:e);n.push(...ui(o,[...t,...i.path]))}return n}function pi(e){return e.reduce((e,t)=>{if("unrecognized_keys"===t.code)return e;if("invalid_union"!==t.code||!Array.isArray(t.errors))return e+1;const n=t.errors.filter(e=>Array.isArray(e));return e+(n.length?Math.min(...n.map(pi)):1)},0)}function gi(e,t){let n=e;for(const e of t){if(!n||"object"!=typeof n)return;n=n[e]}return n}function zi(e){return Array.isArray(e)?e.map(zi):e&&"object"==typeof e?Object.getPrototypeOf(e)!==Object.prototype&&null!==Object.getPrototypeOf(e)?e:Object.fromEntries(Object.entries(e).map(([e,t])=>[e,zi(t)])):e}const hi=["users:read","users:manage","roles:read","roles:manage","identity-providers:read","identity-providers:manage","nodes:read","nodes:manage","projects:read","projects:manage","runtimes:read","runtimes:manage","templates:read","templates:manage","instances:read","instances:manage","instances:interactive","app-sessions:read","app-sessions:manage","app-sessions:interactive","ai-sessions:read","ai-sessions:manage","ai-sessions:interactive","triggers:read","triggers:manage","repositories:read","repositories:manage","attachments:read","attachments:manage","images:read","images:manage","models:read","models:manage","settings:read","settings:manage","secrets:manage","chat-bridges:read","chat-bridges:manage","public-directory:read"],yi=o.z.enum(hi),fi=o.z.enum(["active","disabled","archived"]),Ii=o.z.enum(["local-password","oidc","oauth","local-trust"]),bi=o.z.enum(["active","archived"]),wi=o.z.enum(["oidc","github"]),vi=o.z.enum(["enabled","disabled"]),xi=o.z.enum(["existing-only","admin-approved-create"]),Ai=o.z.enum(["pending","approved","rejected","expired"]),Si=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("all")}).strict(),o.z.object({kind:o.z.literal("selected"),nodeIds:o.z.array(o.z.string().trim().min(1)).max(1e4)}).strict()]),Ci=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("inherit-node-scope")}).strict(),o.z.object({kind:o.z.literal("selected"),instanceIds:o.z.array(o.z.string().trim().min(1)).max(1e4)}).strict()]),ki=o.z.object({id:yi,resource:o.z.string().trim().min(1).max(80),action:o.z.string().trim().min(1).max(80),nodeScoped:o.z.boolean(),name:o.z.string().trim().min(1).max(160),translationKey:o.z.string().trim().min(1).max(200).optional(),description:o.z.string().trim().min(1).max(500).optional()}).strict(),ji=new Set(["users","roles","identity-providers","settings","secrets","chat-bridges","public-directory"]);hi.map(e=>{const[t,n]=e.split(":");return ki.parse({id:e,resource:t,action:n,nodeScoped:!ji.has(t),name:e,translationKey:`settings.userAccess.permissionLabels.${t}.${n}`})});const Ri=o.z.object({id:o.z.string().trim().min(1),displayName:o.z.string().trim().min(1).max(160),primaryUsername:o.z.string().trim().min(1).max(80).optional(),status:fi,createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),lastLoginAt:o.z.string().datetime().optional()}).strict(),Ti=o.z.string().trim().min(1).max(80).regex(/^[a-zA-Z0-9_.@-]+$/),Ei=o.z.object({displayName:o.z.string().trim().min(1).max(160).optional(),username:Ti.optional(),status:fi.optional()}).strict().refine(e=>Object.values(e).some(e=>void 0!==e),{message:"At least one user field must be updated."}),Pi=o.z.object({id:o.z.string().trim().min(1),userId:o.z.string().trim().min(1),kind:Ii,providerId:o.z.string().trim().min(1).optional(),loginName:o.z.string().trim().min(1).max(160).optional(),subject:o.z.string().trim().min(1).max(500).optional(),verifiedEmail:o.z.string().email().optional(),requiresPasswordChange:o.z.boolean().optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),lastUsedAt:o.z.string().datetime().optional()}).strict().superRefine((e,t)=>{"local-password"!==e.kind||e.loginName||t.addIssue({code:"custom",path:["loginName"],message:"Local password identities require loginName."}),"local-password"===e.kind||"local-trust"===e.kind||e.providerId&&e.subject||t.addIssue({code:"custom",path:["providerId"],message:"External identities require providerId and subject."})}),Oi=o.z.enum(["web","mobile","cli"]),$i=o.z.object({id:o.z.string().trim().min(1),userId:o.z.string().trim().min(1),identityId:o.z.string().trim().min(1),clientType:Oi,createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime(),lastSeenAt:o.z.string().datetime().optional(),current:o.z.boolean().optional()}).strict(),Ni=o.z.object({id:o.z.string().trim().min(1),name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(500).optional(),system:o.z.boolean(),status:bi,permissionIds:o.z.array(yi).max(hi.length),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),_i=o.z.object({userId:o.z.string().trim().min(1),roleIds:o.z.array(o.z.string().trim().min(1)).min(1).max(100),nodeScope:Si,instanceScope:Ci.default({kind:"inherit-node-scope"}),authorizationRevision:o.z.number().int().positive(),updatedAt:o.z.string().datetime()}).strict(),Ui=Ri.extend({identities:o.z.array(Pi),accessGrant:_i}).strict(),qi=o.z.object({userId:o.z.string().trim().min(1),identityId:o.z.string().trim().min(1),roleIds:o.z.array(o.z.string().trim().min(1)).min(1).max(100),permissionIds:o.z.array(yi).max(hi.length),nodeScope:Si,instanceScope:Ci.default({kind:"inherit-node-scope"}),authorizationRevision:o.z.number().int().positive()}).strict(),Li=o.z.object({id:o.z.string().trim().min(1),name:o.z.string().trim().min(1).max(120),kind:wi,status:vi,loginPolicy:xi,issuer:o.z.string().url().optional(),clientId:o.z.string().trim().min(1).max(500),callbackUrl:o.z.string().url(),clientSecretConfigured:o.z.boolean(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict().superRefine((e,t)=>{"oidc"!==e.kind||e.issuer||t.addIssue({code:"custom",path:["issuer"],message:"OIDC providers require issuer."})}),Di=o.z.object({id:o.z.string().trim().min(1),providerId:o.z.string().trim().min(1),subject:o.z.string().trim().min(1).max(500),verifiedEmail:o.z.string().email().optional(),displayName:o.z.string().trim().min(1).max(160).optional(),status:Ai,expiresAt:o.z.string().datetime(),decidedAt:o.z.string().datetime().optional(),decidedByUserId:o.z.string().trim().min(1).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Mi=o.z.object({userManagement:o.z.object({users:o.z.literal(!0),identities:o.z.literal(!0),sessions:o.z.literal(!0)}).strict(),authentication:o.z.object({externalIdentity:o.z.object({oidc:o.z.boolean(),oauthAdapters:o.z.array(wi).max(20)}).strict().optional()}).strict(),authorization:o.z.object({customRoles:o.z.boolean(),nodeScopes:o.z.literal(!0),instanceScopes:o.z.literal(!0).optional(),authorizationRevisions:o.z.literal(!0)}).strict()}).strict(),Bi=o.z.object({authentication:o.z.enum(["required","disabled"]),aiSessions:o.z.boolean(),nodes:o.z.boolean(),instanceBoard:o.z.boolean(),triggers:o.z.boolean().optional(),stories:o.z.boolean().optional(),cliSessions:o.z.boolean().optional(),localCliSessions:o.z.boolean().optional(),accessManagement:Mi.optional()}).strict();function Hi(e){const t=mi(Bi,e);return t.success?t.data:void 0}function Fi(e){return Hi(e)?.accessManagement}function Vi(e){return!0===Hi(e)?.localCliSessions}const Gi=o.z.object({version:o.z.literal(1),kind:o.z.literal("control-plane"),controlPlaneId:o.z.string().trim().min(1).max(160),publicKey:o.z.object({algorithm:o.z.literal("Ed25519"),encoding:o.z.literal("base64url"),value:o.z.string().regex(/^[A-Za-z0-9_-]{43}$/),fingerprint:o.z.string().regex(/^sha256:[A-Za-z0-9_-]{43}$/)}).strict(),capabilities:Bi,protocolVersion:o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/),issuedAt:o.z.string().datetime(),expiresAt:o.z.string().datetime()}).strict(),Yi=o.z.object({data:o.z.object({payload:Gi,signature:o.z.string().regex(/^[A-Za-z0-9_-]{86}$/)}).strict()}).strict(),Wi=o.z.object({id:o.z.string().trim().min(8).max(160),name:o.z.string().trim().min(1).max(160),platform:o.z.enum(["ios","android"]),appVersion:o.z.string().trim().min(1).max(80).optional()}).strict(),Ki=o.z.object({username:o.z.string().trim().min(1).max(80),password:o.z.string().min(1).max(4096),device:Wi}).strict(),Ji=Ri,Zi=$i.extend({device:Wi,user:Ri}).strict();o.z.enum(["CONTROL_PLANE_FORBIDDEN","CONTROL_PLANE_AUTH_REQUIRED","AUTH_PASSWORD_CHANGE_REQUIRED","CONTROL_PLANE_USER_DISABLED","CONTROL_PLANE_AUTHORIZATION_REVISION_CONFLICT","CONTROL_PLANE_LAST_ACTIVE_ADMIN","CONTROL_PLANE_USERNAME_CONFLICT","CONTROL_PLANE_EXTERNAL_IDENTITY_CONFLICT","CONTROL_PLANE_IDENTITY_PROVIDER_NAMESPACE_IMMUTABLE","CONTROL_PLANE_IDENTITY_PROVIDER_UNAVAILABLE","USER_STORE_REINITIALIZATION_REQUIRED"]);const Qi=o.z.object({data:o.z.object({sessionToken:o.z.string().trim().min(32),session:Zi,authorization:qi}).strict()}).strict(),Xi=o.z.object({data:o.z.array(Zi)}).strict(),eo=o.z.object({data:o.z.object({revoked:o.z.boolean()}).strict()}).strict(),to=o.z.object({data:o.z.object({expiresAt:o.z.string().datetime()}).strict()}).strict(),no=o.z.object({name:o.z.string().trim().min(1).max(160),platform:o.z.enum(["darwin","linux","win32"]),version:o.z.string().trim().min(1).max(80).optional()}).strict(),io=o.z.string().trim().min(1).max(200),oo=o.z.string().trim().regex(/^[A-Za-z0-9\-._~]{16,200}$/),ao=o.z.string().regex(/^[A-Za-z0-9_-]{43}$/),ro=o.z.string().regex(/^[A-Za-z0-9\-._~]{43,128}$/),so=o.z.string().trim().min(1).max(2048).refine(e=>void 0!==function(e){if("string"!=typeof e||e.length<1||e.length>2048)return;let t;try{t=new URL(e)}catch{return}if("http:"!==t.protocol||t.username||t.password)return;if("127.0.0.1"!==t.hostname&&"[::1]"!==t.hostname)return;if("/callback"!==t.pathname||t.search||t.hash)return;const n=Number(t.port);return Number.isInteger(n)&&n>=1&&n<=65535?t:void 0}(e),"CLI redirect URIs must target an http loopback /callback address."),co=o.z.object({mode:o.z.literal("browser"),client:no,redirectUri:so,state:oo,codeChallenge:ao,codeChallengeMethod:o.z.literal("S256")}).strict(),lo=o.z.object({mode:o.z.literal("device"),client:no}).strict(),mo=o.z.discriminatedUnion("mode",[co,lo]),uo=o.z.discriminatedUnion("mode",[o.z.object({mode:o.z.literal("browser"),requestId:io,verificationUri:o.z.string().trim().url().max(2048),expiresAt:o.z.string().datetime()}).strict(),o.z.object({mode:o.z.literal("device"),requestId:io,verificationUri:o.z.string().trim().url().max(2048),verificationUriComplete:o.z.string().trim().url().max(2048),userCode:o.z.string().trim().min(1).max(40),intervalSeconds:o.z.number().int().min(1).max(300),expiresAt:o.z.string().datetime()}).strict()]),po=o.z.object({data:uo}).strict(),go=o.z.enum(["pending","approved","denied","consumed","expired"]),zo=o.z.object({requestId:io,mode:o.z.enum(["browser","device"]),status:go,client:no,createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime(),redirectUri:so.optional(),userCode:o.z.string().trim().min(1).max(40).optional(),decidedAt:o.z.string().datetime().optional()}).strict(),ho=o.z.object({data:zo}).strict(),yo=o.z.object({data:o.z.object({mode:o.z.enum(["browser","device"]),redirectUri:o.z.string().trim().url().max(2048).optional()}).strict()}).strict(),fo=o.z.object({data:o.z.object({ok:o.z.boolean()}).strict()}).strict(),Io=o.z.discriminatedUnion("grantType",[o.z.object({grantType:o.z.literal("authorization_code"),requestId:io,code:o.z.string().trim().min(1).max(400),codeVerifier:ro}).strict(),o.z.object({grantType:o.z.literal("urn:ietf:params:oauth:grant-type:device_code"),requestId:io}).strict()]),bo=$i.extend({clientType:o.z.literal("cli"),client:no,user:Ri}).strict(),wo=o.z.object({data:o.z.object({sessionToken:o.z.string().trim().min(32),session:bo,authorization:qi}).strict()}).strict(),vo=o.z.object({client:no}).strict(),xo=o.z.object({data:o.z.array(bo)}).strict(),Ao=o.z.object({data:o.z.object({revoked:o.z.boolean()}).strict()}).strict(),So=o.z.object({data:o.z.object({expiresAt:o.z.string().datetime()}).strict()}).strict();o.z.enum(["CLI_AUTHORIZATION_REQUEST_UNKNOWN","CLI_AUTHORIZATION_PENDING","CLI_AUTHORIZATION_SLOW_DOWN","CLI_AUTHORIZATION_EXPIRED","CLI_AUTHORIZATION_DENIED","CLI_AUTHORIZATION_ALREADY_USED","CLI_AUTHORIZATION_INVALID_GRANT","CLI_AUTHORIZATION_RATE_LIMITED"]);const Co=o.z.object({mode:o.z.enum(["disabled","password"]),enabled:o.z.boolean(),requiresBootstrap:o.z.boolean(),authenticated:o.z.boolean(),requiresPasswordChange:o.z.boolean().optional(),user:Ji.optional(),authorization:qi.optional()}).strict();function ko(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data,n=e=>({method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e??{})});return{identity:()=>e.request("/api/control-plane/identity",Yi),session:e=>t("/api/auth/session",Co,{signal:e}),bootstrapAdmin:e=>t("/api/auth/bootstrap-admin",Ji,n(e)),login:e=>t("/api/auth/login",o.z.object({user:Ji}).strict(),n(e)),changePassword(e){return t("/api/auth/password",o.z.object({user:Ji}).strict(),(n=e,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(n)}));var n},logout:()=>t("/api/auth/logout",o.z.object({ok:o.z.boolean()}).strict(),n()),logoutMobile:()=>t("/api/auth/mobile/logout",o.z.object({ok:o.z.boolean()}).strict(),n()),renewMobileSession:t=>e.request("/api/auth/mobile/renew",to,{...n(),signal:t}).then(e=>e.data),loginMobile:async t=>(await e.request("/api/auth/mobile/login",Qi,n(Ki.parse(t)))).data,cliAuthorize:t=>e.request("/api/auth/cli/authorize",po,n(mo.parse(t))).then(e=>e.data),cliToken:t=>e.request("/api/auth/cli/token",wo,n(Io.parse(t))).then(e=>e.data),cliLocalSession:t=>e.request("/api/auth/cli/local",wo,n(vo.parse(t))).then(e=>e.data),cliAuthorizationRequest:(t,n)=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}`,ho,{signal:n}).then(e=>e.data),cliAuthorizationRequestByUserCode:(t,n)=>e.request(`/api/auth/cli/requests?userCode=${encodeURIComponent(t)}`,ho,{signal:n}).then(e=>e.data),approveCliAuthorization:t=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}/approve`,yo,n()).then(e=>e.data),denyCliAuthorization:t=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}/deny`,fo,n()).then(e=>e.data),logoutCli:()=>t("/api/auth/cli/logout",o.z.object({ok:o.z.boolean()}).strict(),n()),renewCliSession:t=>e.request("/api/auth/cli/renew",So,{...n(),signal:t}).then(e=>e.data),cliSessions:t=>e.request("/api/auth/cli/sessions",xo,{signal:t}).then(e=>e.data),revokeCliSession:t=>e.request(`/api/auth/cli/sessions/${encodeURIComponent(t)}`,Ao,{method:"DELETE"}).then(e=>e.data),mobileSessions:t=>e.request("/api/auth/mobile/sessions",Xi,{signal:t}).then(e=>e.data),revokeMobileSession:t=>e.request(`/api/auth/mobile/sessions/${encodeURIComponent(t)}`,eo,{method:"DELETE"}).then(e=>e.data)}}const jo=e=>o.z.object({data:e}).strict();function Ro(e){return{currentAuthorization:t=>e.request("/api/access/me",jo(qi),{signal:t}).then(e=>e.data),list(t={},n){const i=new URLSearchParams;return t.search&&i.set("search",t.search),t.includeArchived&&i.set("includeArchived","true"),e.request("/api/users"+(i.size?`?${i}`:""),jo(o.z.array(Ri)),{signal:n}).then(e=>e.data)},detail:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}`,jo(Ui),{signal:n}).then(e=>e.data),create:t=>e.request("/api/users",jo(Ui),$n("POST",t)).then(e=>e.data),update:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}`,jo(Ui),$n("PATCH",Ei.parse(n))).then(e=>e.data),setAccess:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/access`,jo(Ui),$n("PUT",n)).then(e=>e.data),resetPassword:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/password-reset`,jo(Pi),$n("POST",n)).then(e=>e.data),unbindExternalIdentity:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/identities/${encodeURIComponent(n)}`,jo(o.z.object({unbound:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),sessions:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/sessions`,jo(o.z.array($i)),{signal:n}).then(e=>e.data),revokeSession:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/sessions/${encodeURIComponent(n)}`,jo(o.z.object({revoked:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),revokeAllSessions:t=>e.request(`/api/users/${encodeURIComponent(t)}/sessions`,jo(o.z.object({revokedSessions:o.z.number().int().nonnegative()}).strict()),{method:"DELETE"}).then(e=>e.data),roles:t=>e.request("/api/roles",jo(o.z.array(Ni)),{signal:t}).then(e=>e.data),permissions:t=>e.request("/api/permissions",jo(o.z.array(ki)),{signal:t}).then(e=>e.data),createRole:t=>e.request("/api/roles",jo(Ni),$n("POST",t)).then(e=>e.data),updateRole:(t,n)=>e.request(`/api/roles/${encodeURIComponent(t)}`,jo(Ni),$n("PATCH",n)).then(e=>e.data),archiveRole:t=>e.request(`/api/roles/${encodeURIComponent(t)}`,jo(Ni),{method:"DELETE"}).then(e=>e.data),providers:t=>e.request("/api/identity-providers",jo(o.z.array(Li)),{signal:t}).then(e=>e.data),createProvider:t=>e.request("/api/identity-providers",jo(Li),$n("POST",t)).then(e=>e.data),updateProvider:(t,n)=>e.request(`/api/identity-providers/${encodeURIComponent(t)}`,jo(Li),$n("PATCH",n)).then(e=>e.data),removeProvider:t=>e.request(`/api/identity-providers/${encodeURIComponent(t)}`,jo(o.z.object({deleted:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),approvals:t=>e.request("/api/external-identity-approvals",jo(o.z.array(Di)),{signal:t}).then(e=>e.data),approveIdentity:(t,n)=>e.request(`/api/external-identity-approvals/${encodeURIComponent(t)}/approve`,jo(Ui),$n("POST",n)).then(e=>e.data),rejectIdentity:t=>e.request(`/api/external-identity-approvals/${encodeURIComponent(t)}/reject`,jo(o.z.object({rejected:o.z.boolean()}).strict()),$n("POST",{})).then(e=>e.data)}}const To=o.z.string().trim().min(1).max(120),Eo=o.z.object({selectModelAtCreate:o.z.boolean().default(!1),selectProviderAtCreate:o.z.boolean().default(!1),selectModelAtResume:o.z.boolean().default(!1),selectProviderAtResume:o.z.boolean().default(!1),switchModelWithinProvider:o.z.boolean().default(!1),switchProviderDuringSession:o.z.boolean().default(!1)}).strip().default({selectModelAtCreate:!1,selectProviderAtCreate:!1,selectModelAtResume:!1,selectProviderAtResume:!1,switchModelWithinProvider:!1,switchProviderDuringSession:!1}),Po=o.z.object({selectAtCreate:o.z.boolean().default(!1),updateDuringSession:o.z.boolean().default(!1)}).strip().default({selectAtCreate:!1,updateDuringSession:!1}),Oo=o.z.object({subagents:o.z.boolean().default(!1)}).strip().default({subagents:!1}),$o=o.z.object({agent:To,actions:o.z.object({create:o.z.boolean().default(!1),send:o.z.boolean().default(!1),queue:o.z.boolean().default(!1),steer:o.z.boolean().default(!1),interrupt:o.z.boolean().default(!1),archive:o.z.boolean().default(!1),delete:o.z.boolean().default(!1),fork:o.z.boolean().default(!1),rename:o.z.boolean().default(!1),approvalDecisions:o.z.array(o.z.enum(["allow","deny","skip"])).max(3).default([])}).passthrough(),permissionModes:o.z.array(o.z.enum(["ask","auto-review","full-access"])).max(3).default([]),timeline:o.z.object({sessionRead:o.z.boolean().default(!1),turnRead:o.z.boolean().default(!1),liveItems:o.z.boolean().default(!1)}).passthrough(),modelSelection:Eo.optional(),reasoningEffort:Po.optional(),hierarchy:Oo.optional()}).passthrough(),No=o.z.array($o).max(100).default([]),_o=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Uo=o.z.string().datetime(),qo=o.z.object({sessionReadAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),turnReadAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),liveItemAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([])}).passthrough();const Lo=o.z.object({metadataAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),contentAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),uploadAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),retentionSettings:o.z.boolean().default(!1)}).passthrough(),Do=o.z.object({aiSessionTimeline:qo.default(function(){return{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),aiSessionConversationAttachments:Lo.optional(),aiSessionProviders:No.optional(),browserTunnel:o.z.boolean().optional()}).passthrough(),Mo=o.z.enum(["connecting","handshaking","healthy","reconnecting","suspect","offline"]),Bo=o.z.enum(["start","stop","restart","retry-image"]);o.z.object({instanceId:_o,revision:o.z.number().int().nonnegative(),updatedAt:Uo,status:o.z.enum(["created","provisioning","starting","registering","registered","running","stopping","stopped","deleting","failed","unhealthy"]),health:o.z.enum(["unknown","ok","degraded","failed"]),connectionStatus:o.z.enum(["unknown","online","offline","endpoint-unreachable"]),ready:o.z.boolean(),lastHeartbeatAt:Uo.optional()}).strip();const Ho=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048)}).strict(),Fo=o.z.enum(["instances","runtimes","models"]),Vo=o.z.enum(["uninitialized","loading","ready","stale","error"]),Go=o.z.object({nodeId:_o,route:o.z.string().trim().min(1).max(500),method:o.z.string().trim().min(1).max(20),code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(4096),statusCode:o.z.number().int().optional(),issues:o.z.array(o.z.object({path:o.z.array(o.z.union([o.z.string(),o.z.number()])).optional(),message:o.z.string()}).passthrough()).optional()}).passthrough(),Yo=o.z.object({nodeId:_o,resource:Fo,phase:Vo,revision:o.z.number().int().nonnegative().optional(),updatedAt:Uo.optional(),error:Go.optional()}).strict();Yo.extend({contentChanged:o.z.boolean().optional()}).strict();const Wo=o.z.object({nodeStates:o.z.array(Yo).default([])}).passthrough(),Ko=o.z.object({id:_o,name:o.z.string().trim().min(1).max(160),status:o.z.enum(["unknown","online","offline","degraded"]),health:o.z.enum(["unknown","ok","degraded","failed"]),connectionMode:o.z.enum(["local-ipc","local-loopback","direct-http","reverse-wss","control-plane-proxy"]),connectionPhase:Mo.optional(),lastSeenAt:Uo.optional(),observedAt:Uo,capabilities:o.z.array(o.z.string().trim().min(1).max(120)).max(256),error:Ho.optional()}).strict(),Jo=o.z.array(Ko),Zo=o.z.object({id:o.z.string().trim().min(1).max(120),name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),supportsCwdSelection:o.z.boolean()}).strict(),Qo=o.z.object({modelEntityIds:o.z.array(_o).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:_o.nullable().optional(),claudeModelHash:_o.nullable().optional(),opencodeModelHash:_o.nullable().optional()}).strict().default({}),Xo=o.z.object({id:_o,name:o.z.string().trim().min(1).max(160),nodeId:_o,status:o.z.enum(["created","provisioning","starting","registering","registered","running","stopping","stopped","deleting","failed","unhealthy"]),health:o.z.enum(["unknown","ok","degraded","failed"]),connectionStatus:o.z.enum(["unknown","online","offline","endpoint-unreachable"]),ready:o.z.boolean(),capabilities:Do.default({aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),config:o.z.object({defaultCodexPermissionMode:he.default("ask"),aiSessionMaxFileAttachmentBytes:o.z.number().int().positive().default(O)}).strict().default({defaultCodexPermissionMode:"ask",aiSessionMaxFileAttachmentBytes:O}),modelSelection:Qo,lastHeartbeatAt:Uo.optional(),heartbeatAgeMs:o.z.number().int().nonnegative().optional(),observedAt:Uo,runtime:o.z.object({id:_o,name:o.z.string().trim().min(1).max(160).optional(),type:o.z.enum(["docker","kubernetes","local"]).optional()}).strict(),workspace:o.z.object({status:o.z.enum(["unknown","pending","ready","failed"]),path:o.z.string().trim().max(4096).optional()}).strict(),protocol:o.z.object({version:o.z.string().optional(),compatible:o.z.boolean(),warning:o.z.string().trim().min(1).max(500).optional()}).strict(),aiSessions:Pt,availableActions:o.z.array(Bo).max(4).default([]),availableApps:o.z.array(Zo).max(256).default([]),availableAgents:o.z.array(Zo).max(256),error:Ho.optional()}).strict(),ea=o.z.array(Xo),ta=o.z.union([o.z.object({type:o.z.literal("schedule"),scheduleKind:o.z.literal("interval").default("interval"),intervalMs:o.z.number().int().min(1e3)}).strict(),o.z.object({type:o.z.literal("schedule"),scheduleKind:o.z.literal("daily"),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict(),o.z.object({type:o.z.literal("schedule"),scheduleKind:o.z.literal("weekly"),weekdays:o.z.array(o.z.number().int().min(0).max(6)).min(1).max(7),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict()]),na=o.z.union([ta,o.z.object({type:o.z.literal("file-change"),roots:o.z.array(o.z.string().trim().min(1).max(4096)).min(1).max(50),globs:o.z.array(o.z.string().trim().min(1).max(500)).min(1).max(100),ignore:o.z.array(o.z.string().trim().min(1).max(500)).max(100).optional(),debounceMs:o.z.number().int().min(100).max(6e4).default(1500)}).strict(),o.z.object({type:o.z.literal("ai-session"),agent:o.z.string().trim().min(1).max(80).optional(),statuses:o.z.array(o.z.enum(["running","waiting","idle","failed"])).max(20).optional(),phases:o.z.array(o.z.enum(["thinking","tool","editing","approval","responding","unknown"])).max(20).optional()}).strict()]),ia=o.z.object({promptTemplate:o.z.string().trim().min(1).max(2e4)}).strict(),oa=o.z.object({cooldownMs:o.z.number().int().min(0).max(864e5).optional(),maxConcurrentRuns:o.z.number().int().min(1).max(20).default(1),whenBusy:o.z.enum(["skip","queue"]).default("skip")}).strict(),aa=o.z.object({configHash:o.z.string().trim().min(8).max(80),name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(1e3).optional(),source:na,action:ia,policy:oa.default({maxConcurrentRuns:1,whenBusy:"skip"}),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),ra=o.z.object({type:o.z.literal("ai-session"),aiSessionId:o.z.string().trim().min(1).max(160)}).strict(),sa=o.z.object({configHash:o.z.string().trim().min(8).max(80),deploymentId:o.z.string().trim().min(1).max(240).optional(),instanceId:o.z.string().trim().min(1).max(160),origin:o.z.enum(["control-plane","controlled-instance"]).default("controlled-instance"),enabled:o.z.boolean().default(!0),target:ra,localName:o.z.string().trim().min(1).max(160).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),da=o.z.object({configHash:o.z.string().trim().min(8).max(80),deploymentId:o.z.string().trim().min(1).max(240).optional(),instanceId:o.z.string().trim().min(1).max(160),status:o.z.enum(["idle","running","disabled","error"]).default("idle"),lastTriggeredAt:o.z.string().datetime().optional(),lastCompletedAt:o.z.string().datetime().optional(),lastSkippedAt:o.z.string().datetime().optional(),lastError:o.z.string().trim().max(4e3).optional(),runCount:o.z.number().int().min(0).default(0),skippedCount:o.z.number().int().min(0).default(0)}).strict(),ca=o.z.object({id:o.z.string().trim().min(1).max(160),configHash:o.z.string().trim().min(8).max(80),deploymentId:o.z.string().trim().min(1).max(240).optional(),instanceId:o.z.string().trim().min(1).max(160),eventType:o.z.enum(["manual","schedule","file-change","ai-session"]),status:o.z.enum(["started","completed","failed","skipped"]),target:ra,promptPreview:o.z.string().trim().max(500),eventSummary:o.z.string().trim().max(1e3).optional(),error:o.z.string().trim().max(4e3).optional(),startedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict();o.z.object({schemaVersion:o.z.literal(1).default(1),configs:o.z.array(aa).default([]),deployments:o.z.array(sa).default([]),runtime:o.z.array(da).default([]),recentRuns:o.z.array(ca).default([])}).strict();const la=o.z.object({config:aa,deployment:sa,runtime:da.optional()}).strict();o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(160),mutation:la.optional()}).strip(),o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(160),configHash:aa.shape.configHash}).strip();const ma=o.z.object({instanceId:o.z.string().trim().min(1).max(160),instanceName:o.z.string().trim().min(1).max(160),deployment:sa,runtime:da.optional()}).strip(),ua=ca.extend({instanceName:o.z.string().trim().min(1).max(160).optional()}).strip(),pa=o.z.object({configHash:o.z.string().trim().min(8).max(80),config:aa,deploymentCount:o.z.number().int().min(0),enabledCount:o.z.number().int().min(0),runningCount:o.z.number().int().min(0),errorCount:o.z.number().int().min(0),ownedByControlPlane:o.z.boolean(),controlPlaneDeploymentCount:o.z.number().int().min(0),deployments:o.z.array(ma),recentRuns:o.z.array(ua)}).strip(),ga=o.z.object({updatedAt:o.z.string().datetime(),triggers:o.z.array(pa)}).strip(),za=o.z.object({name:aa.shape.name,description:aa.shape.description,source:na,action:ia,policy:oa.partial().optional()}).strict(),ha=o.z.object({scope:o.z.enum(["node","instance"]),nodeId:o.z.string().trim().min(1).max(160).optional(),instanceId:o.z.string().trim().min(1).max(160).optional(),code:o.z.string().trim().min(1).max(160),message:o.z.string().trim().min(1).max(4e3)}).strip(),ya=o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Proxy protocol version must use YYYY-MM-DD format."),fa=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Ia=o.z.string().datetime(),ba=o.z.string().trim().min(32).max(4096),wa=o.z.string().trim().max(2048).transform((e,t)=>{try{return function(e){const t=new URL(e.trim());if("https:"!==t.protocol||t.username||t.password||"/"!==t.pathname||t.search||t.hash)throw new Error("Proxy origin must be an HTTPS origin without credentials, path, query, or fragment.");return t.origin}(e)}catch(e){return t.addIssue({code:"custom",message:e instanceof Error?e.message:String(e)}),o.z.NEVER}});o.z.string().trim().min(1).max(4096).transform((e,t)=>{try{return function(e){const t=e.trim();if(!t.startsWith("/")||t.startsWith("//")||t.includes("\\")||/%25/i.test(t))throw new Error("Proxy route must be a single-encoded node-agent relative route.");const n=t.split("?",1)[0];let i,o;try{i=n.split("/").map(e=>decodeURIComponent(e))}catch{throw new Error("Proxy route contains invalid percent encoding.")}if(i.some(e=>".."===e||"."===e))throw new Error("Proxy route cannot traverse outside the node-agent API.");try{o=new URL(t,"https://node-agent.invalid")}catch{throw new Error("Proxy route is invalid.")}if("https://node-agent.invalid"!==o.origin||o.username||o.password)throw new Error("Proxy route cannot select an absolute upstream URL.");return`${o.pathname}${o.search}`}(e)}catch(e){return t.addIssue({code:"custom",message:e instanceof Error?e.message:String(e)}),o.z.NEVER}});const va=o.z.enum(Object.values({ProtocolUnsupported:"CONTROL_PLANE_PROXY_PROTOCOL_UNSUPPORTED",InviteInvalid:"CONTROL_PLANE_PROXY_INVITE_INVALID",InviteExpired:"CONTROL_PLANE_PROXY_INVITE_EXPIRED",InviteConsumed:"CONTROL_PLANE_PROXY_INVITE_CONSUMED",InviteRevoked:"CONTROL_PLANE_PROXY_INVITE_REVOKED",TargetUnavailable:"CONTROL_PLANE_PROXY_TARGET_UNAVAILABLE",TargetMismatch:"CONTROL_PLANE_PROXY_TARGET_MISMATCH",BindingUnknown:"CONTROL_PLANE_PROXY_BINDING_UNKNOWN",BindingRevoked:"CONTROL_PLANE_PROXY_BINDING_REVOKED",BindingIdentityConflict:"CONTROL_PLANE_PROXY_BINDING_IDENTITY_CONFLICT",AuthenticationFailed:"CONTROL_PLANE_PROXY_AUTHENTICATION_FAILED",RouteInvalid:"CONTROL_PLANE_PROXY_ROUTE_INVALID",HeaderInvalid:"CONTROL_PLANE_PROXY_HEADER_INVALID",ResourceLimit:"CONTROL_PLANE_PROXY_RESOURCE_LIMIT",SnapshotRequired:"CONTROL_PLANE_PROXY_SNAPSHOT_REQUIRED",Unavailable:"CONTROL_PLANE_PROXY_UNAVAILABLE",TransportFailed:"CONTROL_PLANE_PROXY_TRANSPORT_FAILED"})),xa=o.z.object({code:va,message:o.z.string().trim().min(1).max(2048),retryable:o.z.boolean(),details:o.z.record(o.z.string(),o.z.unknown()).optional()}).strict(),Aa=o.z.enum(["active","revoked"]),Sa=o.z.object({id:fa,targetNodeId:fa,status:Aa,createdBy:fa,expiresAt:Ia,revokedAt:Ia.optional(),createdAt:Ia,updatedAt:Ia}).strict(),Ca=o.z.object({targetNodeId:fa,expiresInSeconds:o.z.number().int().min(60).max(3600).default(600)}).strict(),ka=o.z.object({invite:Sa,token:o.z.string().trim().min(24).max(512),proxyOrigin:wa,protocolVersion:ya}).strict(),ja=o.z.enum(["active","revoked"]),Ra=o.z.object({id:fa,claimId:fa,sourceControlPlaneId:fa,targetNodeId:fa,bindingKeyId:fa,status:ja,revision:o.z.number().int().positive(),lastError:xa.optional(),revokedAt:Ia.optional(),createdAt:Ia,updatedAt:Ia}).strict();o.z.object({protocolVersion:ya,inviteToken:o.z.string().trim().min(24).max(512).optional(),claimId:fa,sourceControlPlaneId:fa,targetNodeId:fa.optional(),bindingKeyId:fa,credential:ba}).strict(),o.z.object({sourceControlPlaneId:fa,bindingKeyId:fa,credential:ba}).strict();const Ta=o.z.object({id:fa,name:o.z.string().trim().min(1).max(160),status:o.z.enum(["unknown","online","offline","degraded"]),health:o.z.enum(["unknown","ok","degraded","failed"]),lastSeenAt:Ia.optional(),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({})}).strict(),Ea=o.z.object({protocolVersion:ya,binding:Ra,streamId:fa,revision:o.z.number().int().nonnegative(),observedAt:Ia,target:Ta}).strict(),Pa=o.z.object({type:o.z.literal("control-plane-proxy.event"),protocolVersion:ya,streamId:fa,bindingId:fa,sourceControlPlaneId:fa,targetNodeId:fa,revision:o.z.number().int().positive(),source:o.z.object({id:o.z.string().trim().min(1).max(512),seq:o.z.number().int().nonnegative()}).strict(),target:Ta,event:o.z.object({type:o.z.string().trim().min(1).max(240),topic:o.z.string().trim().min(1).max(240),createdAt:Ia}).strict()}).strict(),Oa=o.z.object({type:o.z.literal("control-plane-proxy.events.ready"),protocolVersion:ya,streamId:fa,bindingId:fa,sourceControlPlaneId:fa,targetNodeId:fa,latestRevision:o.z.number().int().nonnegative(),earliestRetainedRevision:o.z.number().int().nonnegative()}).strict(),$a=o.z.object({type:o.z.literal("control-plane-proxy.snapshot-required"),protocolVersion:ya,streamId:fa,bindingId:fa,sourceControlPlaneId:fa,targetNodeId:fa,sinceRevision:o.z.number().int().nonnegative(),latestRevision:o.z.number().int().nonnegative(),earliestRetainedRevision:o.z.number().int().nonnegative(),error:xa}).strict();o.z.discriminatedUnion("type",[Pa,Oa,$a]),o.z.object({protocolVersion:ya,binding:Ra,target:Ea.shape.target}).strict();const Na=o.z.object({id:fa,claimId:fa,proxyOrigin:wa,requestedName:o.z.string().trim().min(1).max(160).optional(),sourceControlPlaneId:fa,targetNodeId:fa.optional(),bindingKeyId:fa,credential:ba,status:o.z.enum(["pending","compensation-required"]),createdAt:Ia,updatedAt:Ia,expiresAt:Ia}).strict().omit({credential:!0});o.z.object({id:fa,nodeId:fa,proxyOrigin:wa,proxyBindingId:fa,targetNodeId:fa,sourceControlPlaneId:fa,bindingKeyId:fa,credential:ba,createdAt:Ia,updatedAt:Ia}).strict();const _a=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Ua=o.z.string().datetime(),qa=o.z.number().int().nonnegative(),La=o.z.enum(["https-token","ssh-key"]),Da=o.z.enum(["operation-only","instance-retained"]),Ma=o.z.enum(["enabled","disabled"]),Ba=o.z.enum(["pending","synced","deferred","revoking","revoked"]),Ha=o.z.object({scheme:o.z.enum(["https","ssh"]),host:o.z.string().trim().min(1).max(253),port:o.z.number().int().min(1).max(65535).optional(),pathPrefix:o.z.string().min(1).max(2048).default("/")}).strict();function Fa(e){throw new Error(`Invalid Git credential scope: ${e}`)}function Va(e){const t=e.trim().replace(/^\[|\]$/g,"");(!t||t.includes("*")||/[/?#@\s]/.test(t))&&Fa("host is invalid");try{const e=new URL(t.includes(":")?`http://[${t}]/`:`http://${t}/`).hostname.replace(/^\[|\]$/g,"").toLowerCase();return(!e||e.length>253||e.includes("*"))&&Fa("host is invalid"),e}catch{Fa("host is invalid")}}function Ga(e){try{return decodeURIComponent(e)}catch{Fa("path contains invalid percent encoding")}}function Ya(e){const t=e?.trim()||"/";(t.includes("?")||t.includes("#")||t.includes("\\")||t.includes("\0"))&&Fa("path contains an unsupported delimiter");const n=(t.startsWith("/")?t:`/${t}`).split("/").filter(Boolean);for(const e of n){const t=Ga(e);("."===t||".."===t||t.includes("/")||t.includes("\\")||t.includes("\0"))&&Fa("path contains an unsafe segment")}return 0===n.length?"/":`/${n.join("/")}/`}const Wa=o.z.object({id:_a,name:o.z.string().trim().min(1).max(160),kind:La,scope:Ha,secretSet:o.z.literal(!0),status:Ma,revision:qa,createdAt:Ua,updatedAt:Ua}).strict(),Ka=o.z.object({kind:o.z.literal("https-token"),username:o.z.string().trim().min(1).max(240),token:o.z.string().min(1).max(8192)}).strict(),Ja=o.z.object({kind:o.z.literal("ssh-key"),privateKey:o.z.string().min(1).max(131072),passphrase:o.z.string().max(8192).optional(),pinnedKnownHosts:o.z.string().min(1).max(131072)}).strict(),Za=o.z.discriminatedUnion("kind",[Ka,Ja]);o.z.object({name:o.z.string().trim().min(1).max(160),scope:Ha,secret:Za}).strict().superRefine((e,t)=>{"https"===e.scope.scheme!=("https-token"===e.secret.kind)&&t.addIssue({code:"custom",path:["scope","scheme"],message:"Credential kind must match the remote scheme."});try{!function(e){const t=Ha.parse(e),n="https"===t.scheme?443:22;Ha.parse({scheme:t.scheme,host:Va(t.host),...void 0===t.port||t.port===n?{}:{port:t.port},pathPrefix:Ya(t.pathPrefix)})}(e.scope)}catch(e){t.addIssue({code:"custom",path:["scope"],message:e instanceof Error?e.message:"Invalid Git scope."})}}),o.z.object({name:o.z.string().trim().min(1).max(160).optional(),scope:Ha.optional(),secret:Za.optional(),status:Ma.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one credential field must be updated.");const Qa=o.z.object({items:o.z.array(Wa).max(1e4)}).strict(),Xa=o.z.object({instanceId:_a,credentialId:_a,credentialRevision:qa,assignmentRevision:qa,status:Ba,authorizedAt:Ua,updatedAt:Ua}).strict(),er=o.z.object({credential:Wa,secret:Za}).strict().superRefine((e,t)=>{e.credential.kind!==e.secret.kind&&t.addIssue({code:"custom",path:["secret","kind"],message:"Credential payload kind mismatch."})});o.z.object({instanceId:_a,generation:qa,credentialIds:o.z.array(_a).max(256).transform(e=>[...new Set(e)].sort()),updatedAt:Ua}).strict(),o.z.object({remoteUrl:o.z.string().trim().min(1).max(4096)}).strict(),o.z.discriminatedUnion("status",[o.z.object({status:o.z.literal("ok"),username:o.z.string().min(1).max(240),password:o.z.string().min(1).max(8192)}).strict(),o.z.object({status:o.z.enum(["none","ambiguous","unsupported","missing-host-key","rejected"])}).strict()]),o.z.object({remoteUrl:o.z.string().trim().min(1).max(4096)}).strict(),o.z.discriminatedUnion("status",[o.z.object({status:o.z.literal("ok"),invocationId:_a,publicIdentity:o.z.string().min(1).max(131072),pinnedKnownHosts:o.z.string().min(1).max(131072)}).strict(),o.z.object({status:o.z.enum(["none","ambiguous","unsupported","missing-host-key","rejected"])}).strict()]),o.z.object({invocationId:_a,frame:o.z.string().min(1).max(1048576)}).strict(),o.z.object({frame:o.z.string().min(1).max(1048576)}).strict();const tr=o.z.object({operationId:_a,retention:Da,payload:er}).strict();o.z.object({operationId:_a,instanceId:_a,remoteUrl:o.z.string().trim().min(1).max(4096),ref:o.z.discriminatedUnion("type",[o.z.object({type:o.z.enum(["branch","tag"]),name:o.z.string().trim().min(1).max(240)}).strict(),o.z.object({type:o.z.literal("commit"),commit:o.z.string().trim().regex(/^[0-9a-fA-F]{4,64}$/,"commit must be a hexadecimal Git object id")}).strict()]),clone:o.z.object({depth:o.z.number().int().positive().max(1e5).optional(),submodules:o.z.boolean().default(!1),lfs:o.z.boolean().default(!1),subdirectory:o.z.string().trim().max(240).refine(e=>!e.startsWith("/")&&!e.split("/").some(e=>".."===e),"subdirectory must be a relative path within the repository").transform(e=>e.split("/").filter(e=>e&&"."!==e).join("/")).default("")}).strict(),credentials:o.z.array(tr).max(256).default([])}).strict();const nr=o.z.enum(["openai-responses","openai-chat-completions","anthropic-messages"]);o.z.object({}).strict();const ir=o.z.object({registry:o.z.boolean().default(!1),runtimeBroker:o.z.boolean().default(!1),workspaceProvisioning:o.z.object({docker:o.z.boolean().default(!1),kubernetes:o.z.boolean().default(!1),local:o.z.boolean().default(!1)}).strip().default({docker:!1,kubernetes:!1,local:!1})}).strip(),or=o.z.object({multiEntityAssignment:o.z.boolean().default(!1),privateModelCatalog:o.z.boolean().default(!1),stableModelIdentity:o.z.boolean().default(!1),requestMappings:o.z.boolean().default(!1),modelRelay:o.z.object({protocols:o.z.array(nr).max(3).default([]),streaming:o.z.boolean().default(!1)}).strip().default(()=>({protocols:[],streaming:!1}))}).strip(),ar=o.z.object({policy:o.z.boolean().default(!1),actions:o.z.boolean().default(!1),automations:o.z.boolean().default(!1),aiSessionRead:o.z.boolean().default(!1)}).strip(),rr=o.z.object({enabled:o.z.boolean().default(!1),agentTools:o.z.boolean().default(!1),agentToolCapabilities:ar.optional(),sessionRetention:o.z.boolean().default(!1),maxFileBytes:o.z.number().int().positive().default(33554432),maxBatchPaths:o.z.number().int().min(1).max(100).default(20)}).strip(),sr=o.z.object({runtime:o.z.enum(["docker","local"]),workspaceMaterializer:o.z.enum(["overlay-copy-on-write","worktree"]),processSandbox:o.z.enum(["instance","container","local-runtime"]),providerId:o.z.string().trim().min(1).max(120)}).strip(),dr=o.z.object({definitions:o.z.boolean().default(!1),runs:o.z.boolean().default(!1),orchestration:o.z.object({storyEntryAuthorization:o.z.boolean().default(!1),orchestrations:o.z.boolean().default(!1),runMembers:o.z.boolean().default(!1),manualRuns:o.z.boolean().default(!1)}).strip().default({storyEntryAuthorization:!1,orchestrations:!1,runMembers:!1,manualRuns:!1}),sharedSpace:o.z.object({enabled:o.z.boolean().default(!1),runtimes:o.z.array(o.z.enum(["docker","local"])).default([])}).strip().default({enabled:!1,runtimes:[]}),combinations:o.z.array(sr).default([])}).strip(),cr=dr.omit({combinations:!0}).extend({combinations:o.z.array(o.z.unknown()).default([])}).strip(),lr=o.z.object({modelEndpointProbe:o.z.boolean().optional(),aiSessionHistoryLimit:o.z.boolean().optional(),aiSessionAttachmentRetention:o.z.boolean().optional(),aiSessionFileAttachmentLimit:o.z.boolean().optional(),folderPlaces:o.z.boolean().optional(),localFolderNameUpdate:o.z.boolean().optional(),managedGitCredentials:ir.optional(),managedModels:or.optional(),stories:rr.optional(),codexManagedSettings:o.z.boolean().optional(),agentExecution:dr.optional()}).strip();function mr(e){const t=e&&"object"==typeof e&&!Array.isArray(e)?e:{},n=lr.safeParse({...t,agentExecution:void 0}),i=n.success?n.data:{},o=cr.safeParse(t.agentExecution),a=o.success?dr.parse({...o.data,combinations:o.data.combinations.flatMap(e=>{const t=sr.safeParse(e);return t.success?[t.data]:[]})}):dr.parse({});return{...i,managedGitCredentials:ir.parse(i.managedGitCredentials||{}),managedModels:or.parse(i.managedModels||{}),agentExecution:a,stories:{...rr.parse(i.stories||{}),agentToolCapabilities:ar.parse(i.stories?.agentToolCapabilities||{})}}}const ur=new Set(["2026-08-01","2026-08-16","2026-08-17","2026-08-20","2026-09-24","2026-09-29","2026-10-02"]),pr=o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Protocol version must use YYYY-MM-DD format."),gr=o.z.string().trim().min(1).max(120),zr=o.z.enum(["low","medium","high"]),hr=o.z.enum(["none","friendly","pragmatic"]),yr=o.z.object({modelEntityId:o.z.string().trim().min(1).max(120),modelName:o.z.string().trim().min(1).max(240)}).strict(),fr=o.z.object({modelVerbosity:zr.optional(),personality:hr.optional(),multiAgent:o.z.object({enabled:o.z.boolean().default(!0),maxConcurrentThreads:o.z.number().int().min(1).max(64).optional(),defaultModel:yr.optional(),defaultReasoningEffort:Ne.optional()}).strict().default({enabled:!0})}).strict();function Ir(){return{features:{appRuntime:!1,tty:!1,gui:!1,browser:!1,browserTunnel:!1,screenshots:!1,logs:!1,aiSessionWorkspaceSelection:!1,aiSessionWorkspaceCheckout:!1,aiSessionPersistenceSettings:!1,privateModelCatalog:!1,codexManagedSettings:!1,nodeAgentConnectionUpdate:!1,gitCliCredentialBroker:!1,gitCredentialProxy:!1,repositoryPathSearch:!1,repositoryWorktreeMoveToMain:!1,modelRelay:{protocols:[],streaming:!1},aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]},aiSessionConversationAttachments:{metadataAgents:[],contentAgents:[],uploadAgents:[],retentionSettings:!1,fileSizeLimitSettings:!1},aiSessionProviders:[]}}}const br=o.z.object({sessionReadAgents:o.z.array(gr).max(100).default([]),turnReadAgents:o.z.array(gr).max(100).default([]),liveItemAgents:o.z.array(gr).max(100).default([])}).passthrough(),wr=o.z.object({metadataAgents:o.z.array(gr).max(100).default([]),contentAgents:o.z.array(gr).max(100).default([]),uploadAgents:o.z.array(gr).max(100).default([]),retentionSettings:o.z.boolean().default(!1),fileSizeLimitSettings:o.z.boolean().default(!1)}).passthrough(),vr=o.z.object({protocols:o.z.array(nr).max(3).default([]),streaming:o.z.boolean().default(!1)}).strip(),xr=o.z.object({appRuntime:o.z.boolean().default(!1),tty:o.z.boolean().default(!1),gui:o.z.boolean().default(!1),browser:o.z.boolean().default(!1),browserTunnel:o.z.boolean().optional(),screenshots:o.z.boolean().default(!1),logs:o.z.boolean().default(!1),aiSessionWorkspaceSelection:o.z.boolean().default(!1),aiSessionWorkspaceCheckout:o.z.boolean().optional(),aiSessionPersistenceSettings:o.z.boolean().default(!1),privateModelCatalog:o.z.boolean().optional(),codexManagedSettings:o.z.boolean().optional(),nodeAgentConnectionUpdate:o.z.boolean().optional(),gitCliCredentialBroker:o.z.boolean().optional(),gitCredentialProxy:o.z.boolean().optional(),repositoryPathSearch:o.z.boolean().optional(),repositoryWorktreeMoveToMain:o.z.boolean().optional(),aiSessionTimeline:br.default(function(){return{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),aiSessionConversationAttachments:wr.optional(),aiSessionProviders:No.optional(),modelRelay:vr.optional()}).passthrough(),Ar=o.z.object({features:xr.default(function(){return{appRuntime:!1,tty:!1,gui:!1,browser:!1,browserTunnel:!1,screenshots:!1,logs:!1,aiSessionWorkspaceSelection:!1,aiSessionWorkspaceCheckout:!1,aiSessionPersistenceSettings:!1,privateModelCatalog:!1,codexManagedSettings:!1,nodeAgentConnectionUpdate:!1,gitCliCredentialBroker:!1,gitCredentialProxy:!1,repositoryPathSearch:!1,repositoryWorktreeMoveToMain:!1,modelRelay:{protocols:[],streaming:!1},aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]},aiSessionConversationAttachments:{metadataAgents:[],contentAgents:[],uploadAgents:[],retentionSettings:!1,fileSizeLimitSettings:!1},aiSessionProviders:[]}})}).passthrough();function Sr(e){const t={features:{appRuntime:!1,tty:!1,gui:!1,browser:!1,browserTunnel:!1,screenshots:!1,logs:!1,aiSessionWorkspaceSelection:!1,aiSessionWorkspaceCheckout:!1,aiSessionPersistenceSettings:!1,privateModelCatalog:!1,codexManagedSettings:!1,nodeAgentConnectionUpdate:!1,gitCliCredentialBroker:!1,gitCredentialProxy:!1,repositoryPathSearch:!1,repositoryWorktreeMoveToMain:!1,modelRelay:{protocols:[],streaming:!1},aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]},aiSessionConversationAttachments:{metadataAgents:[],contentAgents:[],uploadAgents:[],retentionSettings:!1,fileSizeLimitSettings:!1},aiSessionProviders:[]}};if(!e||"object"!=typeof e||Array.isArray(e))return t;const n=e,i=n.features;if(!i||"object"!=typeof i||Array.isArray(i))return t;const a=i,r={appRuntime:!1,tty:!1,gui:!1,browser:!1,browserTunnel:!1,screenshots:!1,logs:!1,aiSessionWorkspaceSelection:!1,aiSessionWorkspaceCheckout:!1,aiSessionPersistenceSettings:!1,privateModelCatalog:!1,codexManagedSettings:!1,nodeAgentConnectionUpdate:!1,gitCliCredentialBroker:!1,gitCredentialProxy:!1,repositoryPathSearch:!1,repositoryWorktreeMoveToMain:!1,modelRelay:{protocols:[],streaming:!1},aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]},aiSessionConversationAttachments:{metadataAgents:[],contentAgents:[],uploadAgents:[],retentionSettings:!1,fileSizeLimitSettings:!1},aiSessionProviders:[]};for(const e of["appRuntime","tty","gui","browser","browserTunnel","screenshots","logs","aiSessionWorkspaceSelection","aiSessionWorkspaceCheckout","aiSessionPersistenceSettings","privateModelCatalog","codexManagedSettings","nodeAgentConnectionUpdate","gitCliCredentialBroker","gitCredentialProxy","repositoryPathSearch","repositoryWorktreeMoveToMain"]){const t=o.z.boolean().safeParse(a[e]);t.success&&(r[e]=t.data)}const s=br.safeParse(a.aiSessionTimeline);s.success&&(r.aiSessionTimeline=s.data);const d=wr.safeParse(a.aiSessionConversationAttachments);d.success&&(r.aiSessionConversationAttachments=d.data);const c=No.safeParse(a.aiSessionProviders);c.success&&(r.aiSessionProviders=c.data);const l=vr.safeParse(a.modelRelay);return l.success&&(r.modelRelay=l.data),Ar.parse({...n,features:{...a,...r}})}o.z.object({nodeAgentUrl:o.z.string().trim().url().max(2048).refine(e=>{const t=new URL(e);return/^https?:$/.test(t.protocol)&&!t.username&&!t.password&&"/"===t.pathname&&!t.search&&!t.hash},"Node agent URL must be an HTTP(S) origin.")}).strict();const Cr=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),kr=o.z.string().datetime(),jr=o.z.record(o.z.string(),o.z.string()).default({}),Rr=o.z.record(o.z.string(),o.z.string()).default({});o.z.object({encoding:o.z.enum(["utf8","base64"]),data:o.z.string()}).strict().superRefine((e,t)=>{"base64"===e.encoding&&Buffer.from(e.data,"base64").toString("base64")!==e.data&&t.addIssue({code:"custom",path:["data"],message:"Node tunnel binary body must use canonical base64 encoding."})});const Tr=/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,Er=/^sha256:([a-fA-F0-9]{64})$/,Pr=/^(?:localhost|[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?)(?::[1-9][0-9]{0,4})?$/,Or=/^[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*$/;function $r(e){const t=e.trim();if(!t||t.length>512||t.includes("://")||/\s/.test(t))throw new Error("Docker image reference must not contain a URL scheme or whitespace.");const n=t.indexOf("@");if(-1!==n&&n!==t.lastIndexOf("@"))throw new Error("Docker image reference contains more than one digest separator.");const i=-1===n?void 0:t.slice(n+1),o=-1===n?t:t.slice(0,n),a=i?Er.exec(i):void 0;if(i&&!a)throw new Error("Docker image digest must use sha256 followed by 64 hexadecimal characters.");const r=o.lastIndexOf("/"),s=o.lastIndexOf(":"),d=s>r,c=d?o.slice(s+1):void 0,l=d?o.slice(0,s):o;if(c&&!Tr.test(c))throw new Error("Docker image tag is invalid.");if(!c&&!a)throw new Error("Docker image reference must include an explicit tag or sha256 digest.");const m=l.split("/");if(!m.length||m.some(e=>!e))throw new Error("Docker image repository path is invalid.");const u=m.length>1&&(m[0].includes(".")||m[0].includes(":")||"localhost"===m[0]),p=u?m.slice(1):m;if(u&&!Pr.test(m[0].toLowerCase()))throw new Error("Docker image registry host or port is invalid.");if(!p.length||p.some(e=>!Or.test(e)))throw new Error("Docker image repository names must be lowercase and use valid separators.");const g=m.map((e,t)=>u&&0===t?e.toLowerCase():e).join("/"),z=a?`sha256:${a[1].toLowerCase()}`:void 0;return`${g}${c?`:${c}`:""}${z?`@${z}`:""}`}function Nr(e){const t=$r(e),n=t.indexOf("@"),i=-1===n?void 0:t.slice(n+1),o=-1===n?t:t.slice(0,n),a=o.lastIndexOf("/"),r=o.lastIndexOf(":"),s=r>a;return{reference:t,repository:s?o.slice(0,r):o,tag:s?o.slice(r+1):void 0,digest:i}}const _r=o.z.string().trim().min(1).max(512).transform((e,t)=>{try{return $r(e)}catch(e){return t.addIssue({code:"custom",message:e instanceof Error?e.message:String(e)}),o.z.NEVER}}),Ur=o.z.string().trim().transform((e,t)=>{const n=Er.exec(e);return n?`sha256:${n[1].toLowerCase()}`:(t.addIssue({code:"custom",message:"Docker image digest must use sha256 followed by 64 hexadecimal characters."}),o.z.NEVER)}),qr=o.z.object({modelEntityIds:o.z.array(Cr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:Cr.nullable().optional(),claudeModelHash:Cr.nullable().optional(),opencodeModelHash:Cr.nullable().optional()}).strict().default({}),Lr=o.z.object({imageId:Cr,tag:o.z.string().trim().min(1).max(128).regex(Tr).optional()}).strict(),Dr=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("image"),imageSelection:Lr}).strict(),o.z.object({type:o.z.literal("template"),environmentTemplateId:Cr}).strict()]),Mr=o.z.enum(["creating","ready","failed","deleting"]),Br=o.z.enum(["linux","darwin","win32","freebsd","openbsd","aix","sunos","unknown"]),Hr=o.z.enum(["x64","arm64","arm","ia32","ppc64","s390x","riscv64","unknown"]),Fr=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048),phase:o.z.enum(["validate","commit","inspect","security-check","persist","delete","recovery"]).optional()}).strict(),Vr=o.z.object({templateId:Cr,nodeId:Cr,imageId:Ur,name:o.z.string().trim().min(1).max(160),platform:Br,architecture:Hr}).strict(),Gr=o.z.enum(["data","agent-home","workspace"]),Yr=o.z.object({deleteVolumes:o.z.boolean()}).strict(),Wr=o.z.object({role:Gr,name:o.z.string().trim().min(1).max(255),mountPath:o.z.string().trim().startsWith("/").max(4096),status:o.z.enum(["deleted","retained","missing","failed"]),error:o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048)}).strict().optional()}).strict(),Kr=o.z.object({instanceId:Cr,containerDeleted:o.z.boolean(),completed:o.z.boolean(),deletedVolumes:o.z.array(Wr),retainedVolumes:o.z.array(Wr),volumeResults:o.z.array(Wr)}).strict(),Jr=o.z.object({id:Cr,name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),source:o.z.enum(["builtin","custom"]),availability:o.z.enum(["available","missing-dependency"]),capabilities:o.z.object({automation:o.z.enum(["cdp"]).optional(),supportsCwdSelection:o.z.boolean().default(!1),supportsProfiles:o.z.boolean().default(!1)}).strict().default({supportsCwdSelection:!1,supportsProfiles:!1}),diagnosticCode:o.z.enum(["APP_EXECUTABLE_NOT_FOUND"]).optional()}).strict(),Zr=o.z.object({code:o.z.enum(["APP_CATALOG_INVALID"]),message:o.z.string().trim().min(1).max(500)}).strict(),Qr=o.z.object({items:o.z.array(Jr).max(256),observedAt:kr,issues:o.z.array(Zr).max(32).default([])}).strict(),Xr=o.z.object({id:Cr,name:o.z.string().trim().min(1).max(160),sourceInstanceId:Cr,nodeId:Cr,imageId:Ur.optional(),internalTag:o.z.string().trim().min(1).max(512).optional(),platform:Br.optional(),architecture:Hr.optional(),sizeBytes:o.z.number().int().nonnegative().optional(),status:Mr,error:Fr.optional(),createdAt:kr,updatedAt:kr}).strict().superRefine((e,t)=>{if("ready"===e.status)for(const n of["imageId","internalTag","platform","architecture","sizeBytes"])void 0===e[n]&&t.addIssue({code:"custom",path:[n],message:`Ready environment template requires ${n}.`});"failed"!==e.status||e.error||t.addIssue({code:"custom",path:["error"],message:"Failed environment template requires an error diagnostic."})}),es=o.z.enum(["apt","dnf","brew","npm"]),ts=o.z.enum(["user","passwordless-sudo","root"]),ns=o.z.object({platform:Br,arch:Hr,installers:o.z.array(es).max(8),privilege:ts,installerAccess:o.z.object({npmGlobalWritable:o.z.boolean().optional()}).strict().optional()}).strict(),is=o.z.enum(["installed","not-installed","broken","unsupported"]),os=o.z.enum(["recipe","bundled","external","none"]),as=o.z.object({code:o.z.enum(["BUNDLED","EXTERNALLY_MANAGED","ALREADY_INSTALLED","NOT_INSTALLED","UNSUPPORTED_PLATFORM","INSTALLER_UNAVAILABLE","INSTALLER_NOT_WRITABLE","INSUFFICIENT_PRIVILEGE","OPERATION_IN_PROGRESS"]),message:o.z.string().trim().min(1).max(500)}).strict(),rs=o.z.object({id:Cr,name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),description:o.z.string().trim().max(500).optional(),state:is,managementSource:os,version:o.z.string().trim().max(120).optional(),canInstall:o.z.boolean(),canUninstall:o.z.boolean(),installReason:as.optional(),uninstallReason:as.optional(),activeJobId:Cr.optional()}).strict(),ss=o.z.enum(["install","uninstall"]),ds=o.z.enum(["queued","running","succeeded","failed","cancelled","interrupted"]),cs=o.z.object({current:o.z.number().finite().nonnegative().optional(),total:o.z.number().finite().positive().optional(),unit:o.z.string().trim().min(1).max(40).optional()}).strict().refine(e=>void 0===e.total||void 0===e.current||e.current<=e.total,{message:"Progress current must not exceed total.",path:["current"]}),ls=o.z.object({executable:o.z.string().trim().min(1).max(4096),args:o.z.array(o.z.string().max(4096)).max(128)}).strict(),ms=o.z.object({code:o.z.string().trim().min(1).max(120).regex(/^[a-z0-9][a-z0-9._-]*$/),message:o.z.string().trim().min(1).max(4096),retryable:o.z.boolean(),sessionIds:o.z.array(Cr).max(64).optional()}).strict(),us=o.z.object({id:Cr,requestId:Cr.optional(),appId:Cr,operation:ss,state:ds,phase:o.z.string().trim().min(1).max(120).optional(),progress:cs.optional(),command:ls.optional(),logTail:o.z.string().max(32768).optional(),logTruncated:o.z.boolean().optional(),error:ms.optional(),requestedAt:kr,startedAt:kr.optional(),finishedAt:kr.optional(),updatedAt:kr}).strict(),ps=o.z.object({streamId:Cr,sequence:o.z.number().int().nonnegative(),capabilities:ns,apps:o.z.array(rs).max(256),activeJobs:o.z.array(us).max(256),recentJobs:o.z.array(us).max(256),observedAt:kr}).strict();o.z.object({requestId:Cr.optional()}).strict(),o.z.object({job:us}).strict(),o.z.object({type:o.z.literal("app-management"),streamId:Cr,sequence:o.z.number().int().nonnegative(),observedAt:kr,job:us.optional(),snapshot:ps.optional()}).strict().refine(e=>void 0!==e.job||void 0!==e.snapshot,{message:"An app management event requires a job or snapshot."});const gs=o.z.object({component:o.z.enum(["control-plane","node-agent","controlled-instance"]),packageName:o.z.string().trim().max(160).optional(),packageVersion:o.z.string().trim().max(80).optional(),protocolVersion:pr.optional(),buildId:o.z.string().trim().max(160).optional(),builtAt:o.z.string().trim().max(120).optional(),gitCommit:o.z.string().trim().max(120).optional(),imageRef:o.z.string().trim().max(512).optional(),imageDigest:o.z.string().trim().max(240).optional()}).strict();o.z.object({data:o.z.object({ok:o.z.literal(!0),role:o.z.literal("control-plane"),protocolVersion:pr,build:gs.extend({component:o.z.literal("control-plane"),packageVersion:o.z.string().trim().min(1).max(80)}).loose(),serverTime:kr}).loose()}).loose();const zs=o.z.enum(["stable","beta","alpha"]),hs=o.z.object({packageName:o.z.literal("@task-handoff/controlled-instance"),version:o.z.string().trim().min(1).max(80),platform:o.z.string().trim().min(1).max(40),arch:o.z.string().trim().min(1).max(40),formatVersion:o.z.number().int().positive(),launcherAbi:o.z.number().int().positive(),entrypoint:o.z.string().trim().min(1).max(512),sha256:o.z.string().regex(/^[a-f0-9]{64}$/)}).strict(),ys=o.z.object({code:o.z.enum(["INSTANCE_RUNTIME_VERSION_MISMATCH","INSTANCE_RUNTIME_ARTIFACT_UNAVAILABLE","INSTANCE_RUNTIME_ARTIFACT_INVALID","INSTANCE_RUNTIME_INSTALL_FAILED","INSTANCE_RUNTIME_RESTART_FAILED","INSTANCE_RUNTIME_VERIFICATION_FAILED","INSTANCE_BASE_RUNTIME_INCOMPATIBLE","NODE_UPDATE_PREFLIGHT_FAILED","NODE_UPDATE_FAILED","LEGACY_INSTANCE_UPDATE_RETIRED"]),message:o.z.string().trim().min(1).max(4096),expectedVersion:o.z.string().trim().min(1).max(80).optional(),actualVersion:o.z.string().trim().min(1).max(80).optional(),retryable:o.z.boolean().default(!1)}).strict(),fs=o.z.object({desiredVersion:o.z.string().trim().min(1).max(80),actualVersion:o.z.string().trim().min(1).max(80).optional(),phase:o.z.enum(["pending","draining","installing","restarting","verifying","matched","failed"]),attempt:o.z.number().int().nonnegative().default(0),lastAttemptAt:kr.optional(),matchedAt:kr.optional(),error:ys.optional()}).strict(),Is=o.z.object({runningInstanceCount:o.z.number().int().nonnegative(),stoppedInstanceCount:o.z.number().int().nonnegative(),activeInstanceCount:o.z.number().int().nonnegative(),restartInstanceCount:o.z.number().int().nonnegative(),runningInstanceIds:o.z.array(Cr).max(1024).default([]),stoppedInstanceIds:o.z.array(Cr).max(1024).default([]),activeInstanceIds:o.z.array(Cr).max(1024).default([])}).strict(),bs=o.z.object({phase:o.z.enum(["queued","updating-node","restarting-node","converging-instances","succeeded","degraded","failed"]),desiredVersion:o.z.string().trim().min(1).max(80),nodeVersion:o.z.string().trim().min(1).max(80).optional(),expectedInstanceIds:o.z.array(Cr).max(1024).default([]),expectedInstanceCount:o.z.number().int().nonnegative(),matchedInstanceCount:o.z.number().int().nonnegative(),pendingInstanceCount:o.z.number().int().nonnegative(),failedInstanceCount:o.z.number().int().nonnegative(),deferredInstanceCount:o.z.number().int().nonnegative().default(0)}).strict(),ws=o.z.object({channel:zs.default("stable")}).strict(),vs=o.z.object({source:o.z.literal("npm"),channel:zs,currentVersion:o.z.string().trim().max(240).optional(),availableVersion:o.z.string().trim().min(1).max(240),artifactRef:o.z.string().trim().min(1).max(512).optional(),runtimeArtifacts:o.z.array(hs).default([]),impact:Is,updateAvailable:o.z.boolean(),supported:o.z.boolean().default(!0),reason:o.z.string().trim().max(2048).optional(),checkedAt:kr,preflightToken:o.z.string().trim().min(16).max(240).optional()}).strict(),xs=o.z.object({id:Cr,nodeId:Cr,source:o.z.literal("npm"),channel:zs,fromVersion:o.z.string().trim().max(240).optional(),toVersion:o.z.string().trim().min(1).max(240),artifactRef:o.z.string().trim().min(1).max(512).optional(),runtimeArtifacts:o.z.array(hs).default([]),impact:Is,rollout:bs,status:o.z.enum(["queued","updating-node","restarting-node","converging-instances","succeeded","degraded","failed"]),error:ys.optional(),startedAt:kr.optional(),completedAt:kr.optional(),createdAt:kr,updatedAt:kr}).strict(),As=o.z.object({channel:zs,targetVersion:o.z.string().trim().min(1).max(240),preflightToken:o.z.string().trim().min(16).max(240)}).strict(),Ss=o.z.object({type:o.z.enum(["branch","tag"]),name:o.z.string().trim().min(1).max(240)}).strict(),Cs=o.z.object({type:o.z.literal("commit"),commit:o.z.string().trim().regex(/^[0-9a-fA-F]{4,64}$/,"commit must be a hexadecimal Git object id")}).strict(),ks=o.z.discriminatedUnion("type",[Ss,Cs]),js=o.z.object({type:o.z.enum(["none","ssh-key","https-token"]).default("none"),secretId:o.z.string().trim().min(1).max(120).optional()}).strict(),Rs=o.z.object({depth:o.z.number().int().positive().max(1e5).optional(),submodules:o.z.boolean().default(!1),lfs:o.z.boolean().default(!1),subdirectory:o.z.string().trim().max(240).refine(e=>!e.startsWith("/")&&!e.split("/").some(e=>".."===e),"subdirectory must be a relative path within the repository").transform(e=>e.split("/").filter(e=>e&&"."!==e).join("/")).default("")}).strict();o.z.object({id:Cr,name:o.z.string().trim().min(1).max(160),url:o.z.string().trim().min(1).max(2048),provider:o.z.string().trim().max(80).optional(),ref:ks.default({type:"branch",name:"main"}),auth:js.default({type:"none"}),clone:Rs.default({submodules:!1,lfs:!1,subdirectory:""}),defaultImageSelection:Lr.optional(),labels:jr,createdAt:kr,updatedAt:kr}).strict();const Ts=o.z.object({id:Cr,nodeId:Cr,name:o.z.string().trim().min(1).max(160),path:o.z.string().trim().min(1).max(4096),defaultImageSelection:Lr.optional(),labels:jr,createdAt:kr,updatedAt:kr}).strict(),Es=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("git-repository"),repositoryId:Cr.optional(),url:o.z.string().trim().min(1).max(2048),provider:o.z.string().trim().max(80).optional(),ref:ks.default({type:"branch",name:"main"}),auth:js.default({type:"none"}),clone:Rs.default({submodules:!1,lfs:!1,subdirectory:""})}).strict(),o.z.object({type:o.z.literal("git-template"),url:o.z.string().trim().min(1).max(2048),templateId:o.z.string().trim().min(1).max(120).optional(),ref:ks.default({type:"branch",name:"main"}),auth:js.default({type:"none"}),clone:Rs.default({submodules:!1,lfs:!1,subdirectory:""})}).strict(),o.z.object({type:o.z.literal("local-folder"),localFolderId:Cr.optional(),path:o.z.string().trim().min(1).max(4096),ownerNodeId:Cr.optional()}).strict()]),Ps=o.z.object({mode:o.z.enum(["local-bind","git-clone","empty-volume","persistent-volume"]),path:o.z.string().trim().min(1).max(4096).default("/workspace"),volumeName:o.z.string().trim().max(240).optional(),readOnly:o.z.boolean().default(!1)}).strict(),Os=o.z.enum(["codex","claude","opencode"]),$s=o.z.object({name:o.z.string().trim().min(1).max(240),upstreamName:o.z.string().trim().min(1).max(240).optional(),order:o.z.number().int().min(0).max(1e6).default(0)}).strict(),Ns=o.z.array($s).max(256).default([]).superRefine((e,t)=>{const n=new Set;for(const[i,o]of e.entries())n.has(o.name)&&t.addIssue({code:"custom",path:[i,"name"],message:`Duplicate model name ${o.name}.`}),n.add(o.name)}),_s=o.z.object({name:o.z.string().trim().min(1).max(240),upstreamName:o.z.string().trim().min(1).max(240),order:o.z.number().int().min(0).max(1e6).default(0)}).strict(),Us=o.z.array(_s).max(64).superRefine((e,t)=>{const n=new Set;for(const[i,o]of e.entries())n.has(o.name)&&t.addIssue({code:"custom",path:[i,"name"],message:`Duplicate request mapping ${o.name}.`}),n.add(o.name)}),qs=Us.default([]),Ls=o.z.object({id:Cr,name:o.z.string().trim().min(1).max(160),source:Es,defaultImageSelection:Lr.optional(),defaultNodeId:Cr.optional(),workspacePolicy:Ps,labels:jr,createdAt:kr,updatedAt:kr}).strict(),Ds=o.z.object({id:Cr,name:o.z.string().trim().min(1).max(160),endpoint:o.z.string().trim().min(1).max(2048),key:o.z.string().trim().min(1).max(4096),model:o.z.string().trim().min(1).max(240),modelNames:Ns,mappings:qs,protocols:o.z.array(nr).max(3).default([]),app:Os,enabled:o.z.boolean().default(!0),order:o.z.number().int().min(0).max(1e6).default(0),labels:jr,createdAt:kr,updatedAt:kr}).strict(),Ms=Ds.omit({key:!0}).extend({keyPreview:o.z.string().trim().min(1).max(160),keySet:o.z.boolean(),revision:o.z.string().trim().min(1).max(160).optional()}).strict();Ms.extend({referenceCount:o.z.number().int().min(0)}).strict(),o.z.object({instanceId:Cr,modelEntityIds:o.z.array(Cr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:Cr.optional(),claudeModelHash:Cr.optional(),opencodeModelHash:Cr.optional(),updatedAt:kr}).strict().transform(e=>({...e,modelEntityIds:void 0!==e.modelEntityIds?e.modelEntityIds:[...new Set([e.codexModelHash,e.claudeModelHash,e.opencodeModelHash].filter(e=>Boolean(e)))]}));const Bs=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("control-plane"),name:Ds.shape.name,enabled:Ds.shape.enabled,order:Ds.shape.order,revision:o.z.string().trim().min(1).max(160).optional()}).strict(),o.z.object({type:o.z.literal("node"),nodeId:Cr,name:Ds.shape.name,enabled:Ds.shape.enabled,order:Ds.shape.order,referenceCount:o.z.number().int().min(0),revision:o.z.string().trim().min(1).max(160).optional(),replicaId:Cr.optional()}).strict()]),Hs=o.z.object({id:Cr,model:Ms,locations:o.z.array(Bs).min(1),referenceCount:o.z.number().int().min(0).default(0)}).strict(),Fs=o.z.object({nodeId:Cr,code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),Vs=o.z.object({models:o.z.array(Hs),nodeDiagnostics:o.z.array(Fs).default([]),updatedAt:kr}).strict();Ds.omit({id:!0,createdAt:!0,updatedAt:!0}).extend({mappings:Us.optional()}).strict().partial().strict();const Gs=o.z.enum(["synced","pending","unsupported","error"]),Ys=o.z.object({nodeId:Cr,state:Gs,code:o.z.string().trim().min(1).max(120).optional(),message:o.z.string().trim().min(1).max(2e3).optional()}).strict(),Ws=o.z.object({model:Ms,locations:o.z.array(Ys).default([])}).strict();o.z.object({targetModelId:Cr}).strict(),o.z.object({merged:o.z.literal(!0),reassignedInstances:o.z.array(Cr).default([])}).strict();const Ks=o.z.object({nodeId:Cr,merged:o.z.boolean(),reassignedInstances:o.z.array(Cr).default([]),code:o.z.string().trim().min(1).max(120).optional(),message:o.z.string().trim().min(1).max(2e3).optional()}).strict(),Js=o.z.object({modelId:Cr,targetModelId:Cr,merged:o.z.boolean(),locations:o.z.array(Ks).default([])}).strict();o.z.object({modelSelection:qr,modelEntityIds:o.z.array(Cr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:Cr.optional(),claudeModelHash:Cr.optional(),opencodeModelHash:Cr.optional()}).strict().transform(e=>({...e,modelEntityIds:e.modelEntityIds||e.modelSelection.modelEntityIds||[...new Set([e.codexModelHash,e.claudeModelHash,e.opencodeModelHash].filter(e=>Boolean(e)))]}));const Zs=o.z.enum(["market","custom"]),Qs=o.z.enum(["active","deprecated","yanked"]),Xs=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("builtin"),key:o.z.string().trim().min(1).max(120)}).strict(),o.z.object({kind:o.z.literal("remote"),url:o.z.string().trim().url().max(2048),mediaType:o.z.enum(["image/png","image/jpeg","image/webp"]).optional(),digest:Ur.optional()}).strict()]),ed=o.z.array(o.z.string().trim().min(1).max(80)).default([]),td=o.z.array(o.z.string().trim().min(1).max(120)).default([]),nd=o.z.record(o.z.string().trim().min(2).max(35),o.z.string().trim().min(1).max(4096)),id=o.z.object({os:o.z.string().trim().min(1).max(40),architecture:o.z.string().trim().min(1).max(40),digest:Ur.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional()}).strict(),od=o.z.object({name:o.z.string().trim().min(1).max(128).regex(Tr),version:o.z.string().trim().min(1).max(160).optional(),reference:_r,manifestDigest:Ur.optional(),publishedAt:kr.optional(),platforms:o.z.array(id).default([]),status:Qs.default("active")}).strict(),ad=o.z.object({id:Cr,publisher:o.z.string().trim().min(1).max(160),slug:o.z.string().trim().min(1).max(160),name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().min(1).max(4096),localizedDescriptions:nd.optional(),cover:Xs.optional(),repository:o.z.string().trim().min(1).max(512),defaultTag:o.z.string().trim().min(1).max(128).regex(Tr),tags:o.z.array(od).min(1),capabilities:ed,optionalApps:td,defaultEnv:Rr,labels:jr,status:Qs.default("active")}).strict().superRefine((e,t)=>{e.tags.some(t=>t.name===e.defaultTag)||t.addIssue({code:"custom",path:["defaultTag"],message:"Market defaultTag must identify one of the image tags."})}),rd=o.z.object({protocolVersion:pr,catalogId:Cr,revision:o.z.string().trim().min(1).max(240),source:o.z.enum(["embedded","remote","cache"]),generatedAt:kr,expiresAt:kr.optional(),items:o.z.array(ad)}).strict(),sd=o.z.object({source:o.z.enum(["embedded","remote","cache"]),state:o.z.enum(["ready","refreshing","stale","failed"]),revision:o.z.string().trim().min(1).max(240),updatedAt:kr,error:o.z.string().trim().max(4096).optional()}).strict(),dd=o.z.object({id:Cr,origin:o.z.literal("custom"),name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:nd.optional(),cover:Xs.optional(),reference:_r,repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(Tr).optional(),pullPolicy:o.z.literal("if-not-present").default("if-not-present"),capabilities:ed,optionalApps:td,defaultEnv:Rr,labels:jr,createdAt:kr,updatedAt:kr}).strict(),cd=o.z.object({name:o.z.string().trim().min(1).max(128).regex(Tr),version:o.z.string().trim().min(1).max(160).optional(),reference:_r,manifestDigest:Ur.optional(),status:Qs}).strict(),ld=o.z.object({id:Cr,origin:Zs,name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:nd.optional(),cover:Xs,repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(Tr).optional(),availableTags:o.z.array(cd),reference:_r,digest:Ur.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional(),capabilities:ed,optionalApps:td,defaultEnv:Rr,labels:jr,readOnly:o.z.boolean(),lifecycleStatus:Qs.optional(),market:o.z.object({catalogId:Cr,catalogRevision:o.z.string().trim().min(1).max(240),publisher:o.z.string().trim().min(1).max(160),version:o.z.string().trim().min(1).max(160).optional()}).strict().optional()}).strict(),md=o.z.object({id:Cr,origin:Zs,name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:nd.optional(),cover:Xs.optional(),repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(Tr).optional(),requestedReference:_r,resolvedDigest:Ur.optional(),resolvedReference:_r.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),pullPolicy:o.z.literal("if-not-present").default("if-not-present"),capabilities:ed,optionalApps:td,defaultEnv:Rr,labels:jr,market:o.z.object({catalogId:Cr,catalogRevision:o.z.string().trim().min(1).max(240),publisher:o.z.string().trim().min(1).max(160),version:o.z.string().trim().min(1).max(160).optional()}).strict().optional(),createdAt:kr,updatedAt:kr}).strict(),ud=o.z.object({phase:o.z.enum(["checking-image","pulling-image","resolving-image","ready","failed"]),requestedReference:_r,generation:o.z.number().int().nonnegative().default(0),error:o.z.string().trim().max(4096).optional(),startedAt:kr,updatedAt:kr}).strict(),pd=o.z.object({instanceId:Cr,generation:o.z.number().int().nonnegative(),requestedReference:_r,sequence:o.z.number().int().nonnegative(),observedAt:kr}).strict();pd.extend({data:o.z.string().min(1).max(65536),replay:o.z.boolean().optional()}).strict(),pd.extend({outcome:o.z.enum(["succeeded","failed"])}).strict(),pd.extend({status:o.z.enum(["connecting","pulling","extracting","complete","failed"]),layers:o.z.object({total:o.z.number().int().nonnegative(),completed:o.z.number().int().nonnegative(),downloaded:o.z.number().int().nonnegative(),downloading:o.z.number().int().nonnegative(),extracting:o.z.number().int().nonnegative()}).strict(),bytes:o.z.object({current:o.z.number().finite().nonnegative(),total:o.z.number().finite().positive()}).strict().optional(),percent:o.z.number().finite().min(0).max(100).optional(),message:o.z.string().trim().min(1).max(500),terminalTail:o.z.string().max(262144).optional(),terminalTruncated:o.z.boolean().optional()}).strict();const gd=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("direct")}).strict(),o.z.object({kind:o.z.literal("control-plane-proxy"),proxyId:Cr,proxyBindingId:Cr,targetNodeId:Cr}).strict()]),zd=o.z.object({pingRttMs:o.z.number().nonnegative().optional(),pingRttP95Ms:o.z.number().nonnegative().optional(),consecutiveReconnects:o.z.number().int().nonnegative(),nextRetryAt:kr.optional()}).strict();o.z.object({nodeId:Cr,inviteId:Cr.optional()}).strict();const hd=o.z.discriminatedUnion("status",[o.z.object({id:Cr,status:o.z.literal("pending")}).strict(),o.z.object({id:Cr,status:o.z.literal("completed"),nodeId:Cr}).strict()]),yd=o.z.object({reachability:o.z.enum(["unknown","reachable","unreachable"]),bindingStatus:o.z.enum(["unknown","active","revoked"]),bindingRevision:o.z.number().int().positive().optional(),streamId:o.z.string().trim().min(1).max(160).optional(),revision:o.z.number().int().nonnegative().optional(),observedAt:kr.optional(),target:Ta.optional(),lastError:xa.optional(),updatedAt:kr}).strict(),fd=o.z.object({id:Cr,name:o.z.string().trim().min(1).max(160),connectionMode:o.z.enum(["local-ipc","local-loopback","direct-http","reverse-wss","control-plane-proxy"]).default("direct-http"),connectionPath:gd.default({kind:"direct"}),connectionEnabled:o.z.boolean().default(!0),auth:o.z.object({mode:o.z.enum(["local-static-key","paired-hmac","proxy-binding"]).default("local-static-key"),keyId:Cr.optional(),secret:o.z.string().trim().max(4096).optional(),pairedAt:kr.optional(),pairing:o.z.object({status:o.z.enum(["pending","paired","expired"]).default("pending"),joinToken:o.z.string().trim().max(4096).optional(),expiresAt:kr.optional()}).strict().optional()}).strict().default({mode:"local-static-key"}),endpoint:o.z.string().trim().max(2048).optional(),controlEndpoint:o.z.string().trim().max(2048).optional(),containerEndpoint:o.z.string().trim().max(2048).optional(),publicWebBase:o.z.string().trim().max(2048).optional(),status:o.z.enum(["unknown","online","offline","degraded"]).default("unknown"),health:o.z.enum(["unknown","ok","degraded","failed"]).default("unknown"),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({}),proxyState:yd.optional(),appInventory:Qr.optional(),labels:jr,lastSeenAt:kr.optional(),createdAt:kr,updatedAt:kr}).strict().superRefine((e,t)=>{"control-plane-proxy"===e.connectionPath.kind&&"control-plane-proxy"!==e.connectionMode&&t.addIssue({code:"custom",path:["connectionPath"],message:"Control-plane proxy paths require control-plane-proxy connection mode."}),"control-plane-proxy"===e.connectionMode&&"control-plane-proxy"!==e.connectionPath.kind&&t.addIssue({code:"custom",path:["connectionPath"],message:"Control-plane proxy nodes require a control-plane-proxy connection path."})});o.z.object({nodeId:Cr,status:o.z.enum(["unknown","online","offline","degraded"]),health:o.z.enum(["unknown","ok","degraded","failed"]),lastSeenAt:kr.nullable(),connectionPhase:o.z.enum(["connecting","handshaking","healthy","reconnecting","suspect","offline"]).nullable(),connectionDiagnostics:zd.nullable(),proxyState:yd.nullable()}).strict();const Id=o.z.object({id:Cr,nodeId:Cr,name:o.z.string().trim().min(1).max(160),type:o.z.enum(["docker","kubernetes","local"]),status:o.z.enum(["unknown","online","offline","degraded"]).default("unknown"),accessStrategy:o.z.enum(["node-proxy","direct-port","kubernetes-ingress","kubernetes-port-forward"]).default("node-proxy"),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({}),labels:jr,createdAt:kr,updatedAt:kr}).strict();o.z.object({instanceId:Cr,runtimeKind:o.z.literal("docker"),state:o.z.enum(["pending","available","stopped","unavailable"]),sampledAt:kr,cpu:o.z.object({usagePercent:o.z.number().nonnegative()}).strict().optional(),memory:o.z.object({usageBytes:o.z.number().nonnegative(),limitBytes:o.z.number().nonnegative().optional(),usagePercent:o.z.number().nonnegative().optional()}).strict().optional(),network:o.z.object({rxBytes:o.z.number().nonnegative(),txBytes:o.z.number().nonnegative()}).strict().optional(),blockIo:o.z.object({readBytes:o.z.number().nonnegative(),writeBytes:o.z.number().nonnegative()}).strict().optional(),pids:o.z.number().int().nonnegative().optional(),error:o.z.string().trim().max(2048).optional()}).strict();const bd=o.z.object({status:o.z.enum(["healthy","congested","recovering"]),activeOutputs:o.z.number().int().nonnegative(),bufferedBytes:o.z.number().int().nonnegative(),peakBufferedBytes:o.z.number().int().nonnegative(),coalescedEvents:o.z.number().int().nonnegative(),oversizedEvents:o.z.number().int().nonnegative().optional(),peakEventBytes:o.z.number().int().nonnegative().optional(),congestedSince:kr.optional(),lastCongestedAt:kr.optional()}).strip();o.z.object({ok:o.z.boolean().optional(),role:o.z.string().optional(),nodeId:Cr.optional(),platform:Br.optional(),arch:Hr.optional(),protocolVersion:pr.optional(),capabilities:lr.optional(),build:gs.strip().optional(),process:o.z.object({pid:o.z.number().int().positive(),startIdentity:o.z.string().trim().min(1).optional()}).strip().optional(),listener:o.z.object({host:o.z.string().trim().min(1),port:o.z.number().int().min(1).max(65535)}).strip().optional(),instanceProxy:o.z.object({requests:o.z.number().int().nonnegative(),active:o.z.number().int().nonnegative(),completed:o.z.number().int().nonnegative(),aborted:o.z.number().int().nonnegative(),limitRejected:o.z.number().int().nonnegative(),responseBytes:o.z.number().nonnegative(),totalDurationMs:o.z.number().nonnegative(),maxResponseBytes:o.z.number().int().nonnegative()}).partial().strip().optional(),eventTransport:bd.optional(),serverTime:kr.optional()}).strip();const wd=o.z.object({bindScope:o.z.enum(["loopback","all-ipv4"]),port:o.z.number().int().min(1).max(65535)}).strict(),vd=wd.extend({host:o.z.enum(["127.0.0.1","0.0.0.0"]),status:o.z.enum(["listening","error"]),source:o.z.enum(["bootstrap","persisted"]),error:o.z.string().trim().max(2048).optional()}).strict(),xd=wd,Ad=o.z.object({enabled:o.z.boolean()}).strict(),Sd=o.z.object({enabled:o.z.boolean(),source:o.z.enum(["default","persisted"])}).strip(),Cd=Ad,kd=o.z.object({nodeId:Cr,joinToken:o.z.string().trim().min(1),expiresAt:kr}).passthrough();o.z.object({nodeId:Cr,keyId:Cr,secret:o.z.string().regex(/^[A-Za-z0-9_-]{32,128}$/),pairedAt:kr}).strict();const jd=o.z.object({id:Cr,keyId:Cr,name:o.z.string().trim().min(1).max(160).optional(),pairedAt:kr,updatedAt:kr,current:o.z.boolean()}).passthrough();o.z.object({keyId:Cr,revoked:o.z.literal(!0),revokedAt:kr}).strict();const Rd=o.z.object({id:Cr,pairingKeyId:Cr,url:o.z.string().trim().min(1).max(2048),name:o.z.string().trim().min(1).max(160).optional(),enabled:o.z.boolean(),createdAt:kr,updatedAt:kr,status:o.z.enum(["disabled","connecting","connected","reconnecting","failed"]),pingRttMs:o.z.number().nonnegative().optional(),pingRttP95Ms:o.z.number().nonnegative().optional(),consecutiveReconnects:o.z.number().int().nonnegative().optional(),nextRetryAt:kr.optional(),lastConnectedAt:kr.optional(),lastDisconnectedAt:kr.optional(),error:o.z.string().optional()}).passthrough(),Td=o.z.object({pairing:jd,connection:o.z.object({id:Cr,pairingKeyId:Cr,url:o.z.string().trim().min(1).max(2048),name:o.z.string().trim().min(1).max(160).optional(),enabled:o.z.boolean(),createdAt:kr,updatedAt:kr}).passthrough(),tunnel:o.z.object({status:o.z.enum(["disabled","saved","connecting","connected","failed"]),error:o.z.string().trim().max(2048).optional()}).passthrough()}).passthrough(),Ed=o.z.object({deleted:o.z.boolean().optional()}).passthrough(),Pd=o.z.object({repository:o.z.string().trim().optional(),tag:o.z.string().trim().optional(),id:o.z.string().trim(),createdSince:o.z.string().trim().optional(),size:o.z.string().trim().optional(),sizeBytes:o.z.number().int().nonnegative().optional(),reference:o.z.string().trim().min(1),repoDigests:o.z.array(o.z.string().trim().min(1).max(512)).default([])}).passthrough(),Od=o.z.object({image:ld,status:o.z.enum(["available","pull-required","unknown"]),localImage:Pd.optional(),localSizeBytes:o.z.number().int().nonnegative().optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional(),error:o.z.string().trim().max(2048).optional()}).strict(),$d=o.z.lazy(()=>o.z.object({name:o.z.string().trim().min(1),path:o.z.string().trim().min(1).max(4096),children:o.z.array($d)}).passthrough()),Nd=o.z.object({kind:o.z.enum(["home","root"]),name:o.z.string().trim().min(1),path:o.z.string().trim().min(1).max(4096)}).passthrough();o.z.object({status:o.z.number().int().min(100).max(599).optional(),headers:o.z.record(o.z.string(),o.z.string()).optional(),bodyBase64:o.z.string().optional()}).passthrough();const _d=o.z.object({strategy:o.z.enum(["node-proxy","direct-port","kubernetes-ingress","kubernetes-port-forward"]).default("node-proxy"),web:o.z.string().trim().max(2048).optional(),api:o.z.string().trim().max(2048).optional(),vnc:o.z.string().trim().max(2048).optional(),tty:o.z.string().trim().max(2048).optional(),logs:o.z.string().trim().max(2048).optional(),status:o.z.enum(["unknown","reachable","endpoint-unreachable"]).default("unknown")}).strict(),Ud=o.z.object({..._d.shape}).strict(),qd=o.z.object({strategy:o.z.enum(["control-plane-proxy","direct-port","node-proxy","kubernetes-ingress","kubernetes-port-forward"]).default("control-plane-proxy"),web:o.z.string().trim().max(2048).optional(),api:o.z.string().trim().max(2048).optional(),ws:o.z.string().trim().max(2048).optional(),status:o.z.enum(["unknown","reachable","endpoint-unreachable"]).default("unknown")}).strict().default({strategy:"control-plane-proxy",status:"unknown"}),Ld=o.z.object({mode:o.z.enum(["local-bind","git-clone","empty-volume","persistent-volume"]).optional(),status:o.z.enum(["unknown","pending","ready","failed"]).default("unknown"),path:o.z.string().trim().max(4096).optional(),resolvedCommit:o.z.string().trim().max(120).optional(),error:o.z.string().trim().max(2048).optional()}).passthrough(),Dd=o.z.object({id:Cr,name:o.z.string().trim().min(1).max(160),projectId:Cr.optional(),source:Es,sourceSnapshot:o.z.record(o.z.string(),o.z.unknown()).default({}),modelSelection:qr,nodeId:Cr,runtimeId:Cr,imageSelection:Lr.optional(),environmentSource:Dr.optional(),environmentTemplateOrigin:Vr.optional(),imageSnapshot:md.optional(),imageProvisioning:ud.optional(),stateRevision:o.z.number().int().min(0).default(0),processIncarnationId:o.z.string().trim().min(1).max(120).optional(),status:o.z.enum(["created","provisioning","starting","registering","registered","running","stopping","stopped","deleting","failed","unhealthy"]).default("created"),health:o.z.enum(["unknown","ok","degraded","failed"]).default("unknown"),connectionStatus:o.z.enum(["unknown","online","offline","endpoint-unreachable"]).default("unknown"),agentStatus:o.z.enum(["unknown","online","offline"]).default("unknown"),targetStatus:o.z.enum(["unknown","reachable","endpoint-unreachable"]).default("unknown"),uiAccessStatus:o.z.enum(["unknown","reachable","endpoint-unreachable"]).default("unknown"),controlMode:o.z.enum(["standalone","controlled"]).default("controlled"),protocolVersion:pr.optional(),instanceVersion:o.z.string().trim().max(80).optional(),build:gs.optional(),runtimeVersion:fs.optional(),ready:o.z.boolean().default(!1),capabilities:Ar.default(Ir),appInventory:Qr.optional(),config:o.z.object({autoImportAgentConfigs:o.z.boolean().default(!0),codexConfigEnabled:o.z.boolean().default(!0),codexHomeMode:o.z.enum(["default","taskhandoff"]).default("taskhandoff"),defaultCodexPermissionMode:he.default("ask"),codexSettings:fr.optional(),aiSessionHistoryLimit:o.z.number().int().min(1).max(500).default(50),aiSessionAttachmentRetentionDays:o.z.number().int().min(0).max(365).default(30),aiSessionMaxFileAttachmentBytes:o.z.number().int().positive().max($).default(O)}).strict().default({autoImportAgentConfigs:!0,codexConfigEnabled:!0,codexHomeMode:"taskhandoff",defaultCodexPermissionMode:"ask",aiSessionHistoryLimit:50,aiSessionAttachmentRetentionDays:30,aiSessionMaxFileAttachmentBytes:O}),workspace:Ld.default({status:"unknown"}),target:_d.default({strategy:"direct-port",status:"unknown"}),access:qd,apps:o.z.object({runningCount:o.z.number().int().min(0).default(0),problemCount:o.z.number().int().min(0).default(0),updatedAt:kr.optional(),revision:o.z.number().int().min(0).optional()}).strict().default({runningCount:0,problemCount:0}),aiSessions:Et.default(()=>({runningCount:0,waitingCount:0,staleCount:0,sessions:[],updatedAt:(new Date).toISOString()})),triggers:o.z.object({enabledCount:o.z.number().int().min(0).default(0),runningCount:o.z.number().int().min(0).default(0),errorCount:o.z.number().int().min(0).default(0),configs:o.z.array(o.z.object({configHash:o.z.string().trim().min(1),config:aa,deployments:o.z.array(sa).default([]),runtime:o.z.array(da).default([])}).strict()).default([]),recentRuns:o.z.array(ca).default([])}).strict().optional(),runtime:o.z.object({kind:o.z.string().trim().max(80).optional(),containerName:o.z.string().trim().max(240).optional(),containerId:o.z.string().trim().max(240).optional(),workspacePath:o.z.string().trim().max(4096).optional(),pid:o.z.number().int().positive().optional(),port:o.z.number().int().positive().max(65535).optional(),labels:o.z.record(o.z.string(),o.z.string()).default({})}).strict().default({labels:{}}),registrationToken:o.z.string().trim().min(1).max(240).optional(),lastHeartbeatAt:kr.optional(),createdAt:kr,updatedAt:kr}).strict(),Md=o.z.object({autoImportAgentConfigs:o.z.boolean().optional(),codexConfigEnabled:o.z.boolean().optional(),codexHomeMode:o.z.enum(["default","taskhandoff"]).optional(),defaultCodexPermissionMode:he.optional(),codexSettings:fr.optional(),aiSessionHistoryLimit:o.z.number().int().min(1).max(500).optional(),aiSessionAttachmentRetentionDays:o.z.number().int().min(0).max(365).optional(),aiSessionMaxFileAttachmentBytes:o.z.number().int().positive().max($).optional()}).strict(),Bd=o.z.object({id:Dd.shape.id.optional(),name:Dd.shape.name.optional(),projectId:Dd.shape.projectId,source:Es.optional(),sourceSnapshot:o.z.record(o.z.string(),o.z.unknown()).optional(),nodeId:Dd.shape.nodeId.optional(),runtimeId:Dd.shape.runtimeId.optional(),environmentSource:Dr.optional(),imageSelection:Dd.shape.imageSelection,config:Md.optional(),modelSelection:Dd.shape.modelSelection.optional(),gitCredentialRetention:Da.optional(),start:o.z.boolean().default(!1)}).strict().superRefine((e,t)=>{e.environmentSource&&e.imageSelection&&t.addIssue({code:"custom",path:["environmentSource"],message:"environmentSource and imageSelection are mutually exclusive."}),e.gitCredentialRetention&&"local-folder"===e.source?.type&&t.addIssue({code:"custom",path:["gitCredentialRetention"],message:"Git credential retention requires a Git source."})}),Hd=o.z.object({status:o.z.enum(["not-requested","started","failed"]),error:o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048)}).strict().optional()}).strict(),Fd=o.z.object({...Dd.omit({registrationToken:!0}).shape,startOutcome:Hd}).strict(),Vd=o.z.union([Dd.transform(e=>({instance:e,gitWorkspaceProvisioningOperationId:void 0})),o.z.object({instance:Dd,gitWorkspaceProvisioningOperationId:Cr.optional()}).strict()]);function Gd(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return e;const n=e,i=new Set(Object.keys(Dd.shape)),o={};for(const[e,t]of Object.entries(n))i.has(e)&&(o[e]=t);if(n.capabilities&&"object"==typeof n.capabilities&&!Array.isArray(n.capabilities)){const e={...n.capabilities};Object.prototype.hasOwnProperty.call(e,"apps")&&delete e.apps,o.capabilities=Sr(e)}else o.capabilities=Sr(void 0);o.appInventory=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e;Object.keys(t).some(e=>!["observedAt","items","issues"].includes(e));const n={observedAt:t.observedAt,items:Array.isArray(t.items)?t.items.map(e=>{e&&"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).some(e=>!["id","name","kind","source","availability","capabilities","diagnosticCode"].includes(e));const t=Kd(e,["id","name","kind","source","availability","diagnosticCode"]);return!t||"object"!=typeof t||Array.isArray(t)?t:{...t,capabilities:Kd(e.capabilities,["automation","supportsCwdSelection","supportsProfiles"])}}):t.items,issues:Array.isArray(t.issues)?t.issues.map(e=>Kd(e,["code","message"])):t.issues},i=Qr.safeParse(n);return i.success?i.data:void 0}(n.appInventory,"string"==typeof n.id&&n.id),o.source=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return e;const t=e,n=t.type,i=Es.options.find(e=>e.shape.type.value===n);if(!i)return e;const o="local-folder"===n?["type","localFolderId","path","ownerNodeId"]:"git-template"===n?["type","url","templateId","ref","auth","clone"]:["type","repositoryId","url","provider","ref","auth","clone"],a=Kd(t,o);if("local-folder"!==n){const e=function(e){const t=e&&"object"==typeof e&&!Array.isArray(e)?e:void 0,n=ks.safeParse(Kd(t,["type","name","commit"]));if(n.success)return n.data;const i="string"==typeof t?.commit?t.commit.trim():"",o="string"==typeof t?.name?t.name.trim():"",a=i?ks.safeParse({type:"commit",commit:i}):o?ks.safeParse({type:"tag"===t?.type?"tag":"branch",name:o}):ks.safeParse({type:"branch",name:"main"});return a.success?a.data:void 0}(t.ref),n=Yd(js,Kd(t.auth,["type","secretId"])),i=Yd(Rs,Kd(t.clone,["depth","submodules","lfs","subdirectory"]));e?a.ref=e:delete a.ref,n?a.auth=n:delete a.auth,i?a.clone=i:delete a.clone}const r=Yd(i,a);return r?(Object.keys(t).some(e=>!o.includes(e)),r):a}(n.source,"string"==typeof n.id&&n.id),o.sourceSnapshot=n.sourceSnapshot&&"object"==typeof n.sourceSnapshot&&!Array.isArray(n.sourceSnapshot)?n.sourceSnapshot:{},o.build=Yd(gs,n.build,0,0,"string"==typeof n.id&&n.id),o.aiSessions=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e,n=Array.isArray(t.sessions)?t.sessions.flatMap((e,t)=>{const n=Yd(Tt,e);return n?[n]:[]}):[],i={runningCount:"number"==typeof t.runningCount&&Number.isInteger(t.runningCount)&&t.runningCount>=0?t.runningCount:0,waitingCount:"number"==typeof t.waitingCount&&Number.isInteger(t.waitingCount)&&t.waitingCount>=0?t.waitingCount:0,staleCount:"number"==typeof t.staleCount&&Number.isInteger(t.staleCount)&&t.staleCount>=0?t.staleCount:0,sessions:n,updatedAt:kr.safeParse(t.updatedAt).success?t.updatedAt:(new Date).toISOString()};return Object.keys(t).some(e=>!["runningCount","waitingCount","staleCount","sessions","updatedAt"].includes(e)),Et.parse(i)}(n.aiSessions,"string"==typeof n.id&&n.id),o.triggers=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e;Object.keys(t).some(e=>!["enabledCount","runningCount","errorCount","configs","recentRuns"].includes(e));const n=(e,t,n)=>Array.isArray(e)?e.flatMap((e,n)=>{const i=Yd(t,e);return i?[i]:[]}):[],i=Array.isArray(t.configs)?t.configs.flatMap((e,t)=>{if(!e||"object"!=typeof e||Array.isArray(e))return[];const i=e;Object.keys(i).some(e=>!["configHash","config","deployments","runtime"].includes(e));const o=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e,n=Kd(t,["configHash","name","description","createdAt","updatedAt"]);if(t.source&&"object"==typeof t.source&&!Array.isArray(t.source)){const e=t.source,i="schedule"===e.type?"interval"===e.scheduleKind?["type","scheduleKind","intervalMs"]:"daily"===e.scheduleKind?["type","scheduleKind","timeOfDay","timezone"]:["type","scheduleKind","weekdays","timeOfDay","timezone"]:"file-change"===e.type?["type","roots","globs","ignore","debounceMs"]:["type","agent","statuses","phases"];n.source=Kd(e,i)}return n.action=Kd(t.action,["promptTemplate"]),n.policy=Kd(t.policy,["cooldownMs","maxConcurrentRuns","whenBusy"]),Yd(aa,n)}(i.config);return"string"==typeof i.configHash&&o?[{configHash:i.configHash,config:o,deployments:n(i.deployments,sa),runtime:n(i.runtime,da)}]:[]}):[];return{enabledCount:"number"==typeof t.enabledCount&&Number.isInteger(t.enabledCount)&&t.enabledCount>=0?t.enabledCount:0,runningCount:"number"==typeof t.runningCount&&Number.isInteger(t.runningCount)&&t.runningCount>=0?t.runningCount:0,errorCount:"number"==typeof t.errorCount&&Number.isInteger(t.errorCount)&&t.errorCount>=0?t.errorCount:0,configs:i,recentRuns:n(t.recentRuns,ca)}}(n.triggers,"string"==typeof n.id&&n.id),o.apps=Yd(Dd.shape.apps.unwrap(),Kd(n.apps,["runningCount","problemCount","updatedAt","revision"]),0,0,"string"==typeof n.id&&n.id)||{runningCount:0,problemCount:0},o.config=Yd(Dd.shape.config.unwrap(),Kd(n.config,["autoImportAgentConfigs","codexConfigEnabled","codexHomeMode","defaultCodexPermissionMode","codexSettings","aiSessionHistoryLimit","aiSessionAttachmentRetentionDays","aiSessionMaxFileAttachmentBytes"]),0,0,"string"==typeof n.id&&n.id)||{autoImportAgentConfigs:!0,codexConfigEnabled:!0,codexHomeMode:"taskhandoff",defaultCodexPermissionMode:"ask",aiSessionHistoryLimit:50,aiSessionAttachmentRetentionDays:30,aiSessionMaxFileAttachmentBytes:O},o.modelSelection=Yd(qr.unwrap(),Kd(n.modelSelection,["modelEntityIds","codexModelHash","claudeModelHash","opencodeModelHash"]),0,0,"string"==typeof n.id&&n.id)||{},o.imageSnapshot=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return e;const n=e,i=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return e;const t=e,n=new Set(["id","origin","name","description","localizedDescriptions","cover","reference","repository","tag","image","registry","pullPolicy","capabilities","optionalApps","defaultEnv","labels","createdAt","updatedAt"]);for(const e of Object.keys(t))n.has(e);"string"==typeof t.id&&t.id;const i="string"==typeof t.image?t.image:void 0;Object.prototype.hasOwnProperty.call(t,"registry");let o,a="string"==typeof t.reference?t.reference:i;if(a)try{a=$r(a)}catch{if(!a.includes("@")&&a.lastIndexOf(":")<=a.lastIndexOf("/"))try{a=$r(`${a}:latest`)}catch{}}try{o=a?Nr(a):void 0}catch{}return{id:t.id,origin:"custom",name:t.name,description:t.description,localizedDescriptions:t.localizedDescriptions,cover:Kd(t.cover,["kind","key","url","mediaType","digest"]),reference:o?.reference??a,repository:o?.repository??t.repository,tag:o?.tag??t.tag,pullPolicy:t.pullPolicy??"if-not-present",capabilities:t.capabilities,optionalApps:t.optionalApps,defaultEnv:t.defaultEnv,labels:t.labels,createdAt:t.createdAt,updatedAt:t.updatedAt}}(n),{reference:o,...a}=i,r=n.requestedReference??o;let s;try{s="string"==typeof r?Nr(r):void 0}catch{}const d={img_default:"market_taskhandoff_browser",img_codex:"market_taskhandoff_codex",img_ai:"market_taskhandoff_ai"},c="string"==typeof n.id?n.id:"string"==typeof t?t:void 0,l="market"===n.origin||c&&d[c]?"market":"custom";return void 0!==n.image||n.reference,{...a,id:c&&d[c]?d[c]:c,origin:l,repository:s?.repository??n.repository,tag:s?.tag??n.tag,requestedReference:s?.reference??r,resolvedDigest:n.resolvedDigest,resolvedReference:n.resolvedReference,downloadSizeBytes:n.downloadSizeBytes,market:"market"===l?Kd(n.market,["catalogId","catalogRevision","publisher","version"])??{catalogId:"task_handoff_embedded",catalogRevision:"legacy",publisher:"task-handoff"}:void 0}}(n.imageSnapshot,n.imageId,0,"string"==typeof n.id&&n.id);const a="string"==typeof n.imageId?{img_default:"market_taskhandoff_browser",img_codex:"market_taskhandoff_codex",img_ai:"market_taskhandoff_ai"}[n.imageId]||n.imageId:void 0,r=Kd(n.imageSelection,["imageId","tag"]);o.imageSelection=r||(a?{imageId:a,tag:o.imageSnapshot?.tag}:void 0),o.imageProvisioning=Yd(ud,Kd(n.imageProvisioning,["phase","requestedReference","generation","error","startedAt","updatedAt"]),0,0,"string"==typeof n.id&&n.id),o.runtimeVersion=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e,n=e=>{if("string"!=typeof e)return;const t=e.trim();return t&&t.length<=80?t:void 0},i=n(t.desiredVersion);if(!i)return;const o=new Set(fs.shape.phase.options),a="string"==typeof t.phase?t.phase:"pending",r=o.has(a)?a:{idle:"pending",queued:"pending",checking:"pending",downloading:"installing",updating:"installing",completed:"matched",succeeded:"matched",ready:"matched",error:"failed"}[a]||"pending";let s;if(t.error&&"object"==typeof t.error&&!Array.isArray(t.error)){const e=t.error,i="string"==typeof e.message?e.message.trim().slice(0,4096):"";if(i){const t=new Set(ys.shape.code.options),o="string"==typeof e.code&&t.has(e.code)?e.code:"INSTANCE_RUNTIME_INSTALL_FAILED";e.code;const a=n(e.expectedVersion),r=n(e.actualVersion);s={code:o,message:i,...a?{expectedVersion:a}:{},...r?{actualVersion:r}:{},retryable:!0===e.retryable}}}"string"==typeof t.error&&t.error.trim()&&(s={code:"INSTANCE_RUNTIME_INSTALL_FAILED",message:t.error.trim().slice(0,4096),expectedVersion:i,...n(t.actualVersion)?{actualVersion:n(t.actualVersion)}:{},retryable:!1});const d=n(t.actualVersion),c=kr.safeParse(t.lastAttemptAt),l=kr.safeParse(t.matchedAt);return void 0!==t.lastAttemptAt&&c.success,void 0!==t.matchedAt&&l.success,{desiredVersion:i,...d?{actualVersion:d}:{},phase:r,attempt:"number"==typeof t.attempt&&Number.isInteger(t.attempt)&&t.attempt>=0?t.attempt:0,...c.success?{lastAttemptAt:c.data}:{},...l.success?{matchedAt:l.data}:{},...s?{error:s}:{}}}(n.runtimeVersion,"string"==typeof n.id&&n.id),o.workspace=Yd(Ld,n.workspace,0,0,"string"==typeof n.id&&n.id)||{status:"unknown"},o.environmentSource=Yd(Dr,n.environmentSource,0,0,"string"==typeof n.id&&n.id),o.environmentTemplateOrigin=Yd(Vr,n.environmentTemplateOrigin,0,0,"string"==typeof n.id&&n.id),o.runtime=Yd(Dd.shape.runtime.unwrap(),n.runtime,0,0,"string"==typeof n.id&&n.id)||{labels:{}},o.target=Yd(_d,Kd(n.target??n.endpoints,["strategy","web","api","vnc","tty","logs","status"]),0,0,"string"==typeof n.id&&n.id)||{strategy:"direct-port",status:"unknown"},o.access=Yd(qd,Kd(n.access,["strategy","web","api","ws","status"]),0,0,"string"==typeof n.id&&n.id)||{strategy:"control-plane-proxy",status:"unknown"};for(const[e,t]of Object.entries(Dd.shape))Object.prototype.hasOwnProperty.call(o,e)&&!t.safeParse(o[e]).success&&t.safeParse(void 0).success&&delete o[e];return o}function Yd(e,t,n,i,o){if(!t||"object"!=typeof t||Array.isArray(t))return;let a=structuredClone(t);for(let t=0;t<20;t+=1){const t=e.safeParse(a);if(t.success)return t.data;let n=!1;for(const e of t.error.issues){if("unrecognized_keys"!==e.code)continue;const t=Wd(a,e.path);if(t&&"object"==typeof t&&!Array.isArray(t))for(const i of e.keys)Object.prototype.hasOwnProperty.call(t,i)&&(delete t[i],n=!0)}if(!n){const n=structuredClone(a);let i=!1;for(const e of t.error.issues){if(!e.path.length||"string"!=typeof e.path.at(-1))continue;const t=Wd(n,e.path.slice(0,-1)),o=e.path.at(-1);t&&"object"==typeof t&&!Array.isArray(t)&&Object.prototype.hasOwnProperty.call(t,o)&&(delete t[o],i=!0)}if(i){const t=e.safeParse(n);if(t.success)return t.data}break}}}function Wd(e,t){let n=e;for(const e of t){if(!n||"object"!=typeof n)return;n=n[e]}return n}function Kd(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return e;const n=e;return Object.fromEntries(t.filter(e=>Object.prototype.hasOwnProperty.call(n,e)).map(e=>[e,n[e]]))}o.z.preprocess(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return e;const t=e;return t.instance&&"object"==typeof t.instance&&!Array.isArray(t.instance)?{instance:Gd(t.instance),..."string"==typeof t.gitWorkspaceProvisioningOperationId?{gitWorkspaceProvisioningOperationId:t.gitWorkspaceProvisioningOperationId}:{}}:Gd(t)},Vd),o.z.object({instanceId:Dd.shape.id,revision:o.z.number().int().min(0),updatedAt:kr,status:Dd.shape.status.unwrap(),health:Dd.shape.health.unwrap(),connectionStatus:Dd.shape.connectionStatus.unwrap(),accessStatus:o.z.enum(["reachable","endpoint-unreachable"]),imageProvisioning:ud.optional(),workspace:Ld,runtime:Dd.shape.runtime.unwrap(),runtimeVersion:fs.optional(),ready:o.z.boolean(),lastHeartbeatAt:kr.optional()}).strict(),o.z.object({instanceId:Cr.optional(),projectId:Cr.optional(),source:Es.optional(),nodeId:Cr.optional(),runtimeId:Cr.optional(),imageSelection:Lr.optional(),instanceVersion:o.z.string().trim().max(80).optional(),protocolVersion:pr,build:gs.optional(),controlMode:o.z.enum(["standalone","controlled"]).default("controlled"),capabilities:Ar.default(Ir),appInventory:Qr.optional(),target:Ud.optional(),workspace:Ld.default({status:"unknown"}),registrationToken:o.z.string().trim().max(240).optional(),processIncarnationId:o.z.string().trim().min(1).max(120).optional()}).strict().superRefine((e,t)=>{ur.has(e.protocolVersion)&&!e.appInventory&&t.addIssue({code:"custom",path:["appInventory"],message:"Current protocol register payload requires appInventory."})}),o.z.object({status:Dd.shape.status.optional(),health:Dd.shape.health.optional(),protocolVersion:pr,build:gs.optional(),capabilities:Dd.shape.capabilities.optional(),appInventory:Qr.optional(),apps:Dd.shape.apps.optional(),aiSessions:Dd.shape.aiSessions.optional(),triggers:Dd.shape.triggers.optional(),workspace:Ld.optional(),target:Ud.optional(),processIncarnationId:o.z.string().trim().min(1).max(120).optional()}).strict().superRefine((e,t)=>{ur.has(e.protocolVersion)&&!e.appInventory&&t.addIssue({code:"custom",path:["appInventory"],message:"Current protocol heartbeat payload requires appInventory."})});const Jd=o.z.enum(["web","telegram","wechat","dingding","lark"]),Zd=o.z.object({id:Cr,channel:Jd,name:o.z.string().trim().min(1).max(160),enabled:o.z.boolean().default(!1),token:o.z.string().trim().max(4096).optional(),defaultChatId:o.z.string().trim().max(240).optional(),allowedUserIds:o.z.array(o.z.string().trim().min(1).max(240)).default([]),pollIntervalMs:o.z.number().int().positive().max(6e4).default(3e3),settings:o.z.record(o.z.string(),o.z.unknown()).default({}),createdAt:kr,updatedAt:kr}).strict(),Qd=o.z.object({id:Cr,channel:Jd,bridgeId:Cr.optional(),chatSessionId:o.z.string().trim().min(1).max(240),userId:o.z.string().trim().max(240).optional(),activeProjectId:Cr.optional(),activeInstanceId:Cr.optional(),activeAiSessionId:o.z.string().trim().min(1).max(120).optional(),lastUsedAt:kr,createdAt:kr,updatedAt:kr}).strict();o.z.object({source:o.z.object({type:o.z.literal("chat-gateway").default("chat-gateway"),channel:Jd,bridgeId:Cr.optional(),chatSessionId:o.z.string().trim().min(1).max(240),userId:o.z.string().trim().max(240).optional()}).strict(),message:o.z.object({text:o.z.string().trim().max(2e4).default(""),attachments:o.z.array(ue).max(6).default([])}).strict().superRefine((e,t)=>{e.attachments.reduce((e,t)=>e+("inline"===t.source.type?t.size:0),0)>N&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["attachments"],message:"Inline attachments must be 41943040 bytes or less in total."})}),target:o.z.object({instanceId:Cr,aiSessionId:o.z.string().trim().min(1).max(120)}).strict().optional()}).strict(),o.z.object({id:Cr,instanceId:Cr,projectId:Cr.optional(),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().max(240).optional(),result:o.z.string().default(""),timeoutMs:o.z.number().positive().optional(),source:o.z.string().trim().max(120).optional(),kind:o.z.enum(["task","approval"]).default("task"),status:o.z.enum(["pending","unreachable"]).default("pending"),error:o.z.string().trim().max(2048).optional(),lastSeenAt:kr}).strict();const Xd=o.z.string().refine(function(e){return 1===Array.from(e).length&&!/[\p{L}\p{N}\s]/u.test(e)&&"/"!==e&&"\\"!==e},"Mention trigger must be one printable non-alphanumeric character other than / or \\."),ec=o.z.string().refine(function(e){return 1===Array.from(e).length&&!/[\p{L}\p{N}\s]/u.test(e)&&"\\"!==e},"Command trigger must be one printable non-alphanumeric character other than \\."),tc=o.z.object({publicBaseUrl:o.z.string().trim().max(2048).optional(),updateChannel:zs.default("stable"),mentionTrigger:Xd.default("@"),commandTrigger:ec.default("/"),diagnosticLogs:o.z.boolean().default(!1)}).strict().refine(e=>e.mentionTrigger!==e.commandTrigger,{path:["commandTrigger"],message:"Command and mention triggers must be different."}),nc=o.z.object({publicBaseUrl:o.z.string().trim().max(2048).optional(),updateChannel:zs.optional(),mentionTrigger:Xd.optional(),commandTrigger:ec.optional(),diagnosticLogs:o.z.boolean().optional()}).strict(),ic=o.z.object({id:Ls.shape.id.optional(),name:Ls.shape.name,source:Es,defaultImageSelection:Ls.shape.defaultImageSelection,defaultNodeId:Ls.shape.defaultNodeId,workspacePolicy:Ps.optional(),labels:Ls.shape.labels.optional()}),oc={defaultRuntimeId:Id.shape.id.optional()};ic.extend(oc).strict().transform(({defaultRuntimeId:e,...t})=>({...t,source:Es.parse(t.source)})),ic.omit({id:!0}).partial().extend(oc).strict().transform(({defaultRuntimeId:e,...t})=>({...t,...t.source?{source:Es.parse(t.source)}:{}})),o.z.object({id:dd.shape.id.optional(),name:dd.shape.name,description:dd.shape.description,cover:dd.shape.cover,reference:dd.shape.reference,pullPolicy:dd.shape.pullPolicy.optional(),capabilities:o.z.array(o.z.string().trim().min(1).max(80)).optional(),optionalApps:o.z.array(o.z.string().trim().min(1).max(120)).optional(),defaultEnv:dd.shape.defaultEnv.optional(),labels:dd.shape.labels.optional()}).strict().omit({id:!0}).partial().strict();const ac=o.z.object({name:Ds.shape.name,endpoint:Ds.shape.endpoint,key:Ds.shape.key,model:Ds.shape.model,modelNames:Ds.shape.modelNames.optional(),mappings:Us.optional(),protocols:Ds.shape.protocols.optional(),app:Ds.shape.app,enabled:Ds.shape.enabled.optional(),order:Ds.shape.order.optional(),labels:Ds.shape.labels.optional()}).strict();ac.omit({key:!0}).extend({key:Ds.shape.key.optional()}).strict(),ac.partial().strict(),o.z.object({endpoint:Ds.shape.endpoint,key:Ds.shape.key.optional(),existingModelId:Ds.shape.id.optional()}).strict().extend({model:Ds.shape.model,app:Ds.shape.app.optional(),protocol:o.z.enum(["openai-responses","openai-chat-completions","anthropic-messages"]).optional()}).strict().refine(e=>Boolean(e.protocol||e.app),{message:"A model protocol is required.",path:["protocol"]});const rc=o.z.object({mode:o.z.enum(["local-static-key","paired-hmac","proxy-binding"]).default("local-static-key"),keyId:fd.shape.id.optional(),secret:o.z.string().trim().max(4096).optional(),pairedAt:fd.shape.createdAt.optional(),pairing:o.z.object({status:o.z.enum(["pending","paired","expired"]).default("pending"),joinToken:o.z.string().trim().max(4096).optional(),expiresAt:fd.shape.createdAt.optional()}).strict().optional()}).strict();o.z.object({id:fd.shape.id.optional(),name:fd.shape.name,connectionMode:fd.shape.connectionMode.optional(),connectionPath:fd.shape.connectionPath.optional(),connectionEnabled:fd.shape.connectionEnabled.optional(),auth:rc.optional(),joinToken:o.z.string().trim().min(1).max(4096).optional(),endpoint:fd.shape.endpoint,controlEndpoint:fd.shape.controlEndpoint,containerEndpoint:fd.shape.containerEndpoint,publicWebBase:fd.shape.publicWebBase,status:o.z.enum(["unknown","online","offline","degraded"]).optional(),health:o.z.enum(["unknown","ok","degraded","failed"]).optional(),capabilities:fd.shape.capabilities.optional(),labels:fd.shape.labels.optional(),lastSeenAt:fd.shape.lastSeenAt}).strict(),o.z.object({name:fd.shape.name.optional(),connectionMode:fd.shape.connectionMode.unwrap().optional(),connectionPath:fd.shape.connectionPath.unwrap().optional(),connectionEnabled:fd.shape.connectionEnabled.unwrap().optional(),auth:rc.optional(),endpoint:fd.shape.endpoint,controlEndpoint:fd.shape.controlEndpoint,containerEndpoint:fd.shape.containerEndpoint,publicWebBase:fd.shape.publicWebBase,status:fd.shape.status.unwrap().optional(),health:fd.shape.health.unwrap().optional(),capabilities:fd.shape.capabilities.unwrap().optional(),labels:fd.shape.labels.unwrap().optional(),lastSeenAt:fd.shape.lastSeenAt}).strict(),o.z.object({controlPlaneUrl:o.z.string().trim().url().max(2048),joinToken:o.z.string().trim().min(1).max(4096),controlPlaneName:o.z.string().trim().min(1).max(160).optional(),activate:o.z.boolean().optional()}).strict(),o.z.object({nodeName:o.z.string().trim().min(1).max(160).optional(),expiresInMs:o.z.number().int().positive().max(36e5).optional()}).strict();const sc=e=>o.z.object({data:e}).passthrough(),dc=o.z.object({data:ea,meta:Wo.optional()}).passthrough(),cc=o.z.object({config:o.z.object({defaultCodexPermissionMode:he}).passthrough()}).passthrough(),lc=o.z.object({source:o.z.object({type:o.z.string().trim().min(1).max(80),localFolderId:o.z.string().trim().min(1).max(120).optional(),path:o.z.string().trim().min(1).max(4096).optional()}).passthrough()}).passthrough(),mc=o.z.object({id:o.z.string().trim().min(1).max(160),name:o.z.string().trim().min(1).max(160)}),uc=o.z.object({id:o.z.string().trim().min(1).max(160),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({})}).passthrough(),pc=o.z.object({id:o.z.string().trim().min(1).max(120),model:o.z.object({id:o.z.string().trim().min(1).max(120),name:o.z.string().trim().min(1).max(160),model:o.z.string().trim().min(1).max(240),modelNames:o.z.array(o.z.object({name:o.z.string(),upstreamName:o.z.string().optional(),order:o.z.number().int()}).strip()).default([]),protocols:o.z.array(o.z.string()).default([]),app:o.z.string().optional(),enabled:o.z.boolean(),order:o.z.number().int()}).passthrough(),locations:o.z.array(o.z.object({type:o.z.enum(["control-plane","node"]),nodeId:o.z.string().optional(),enabled:o.z.boolean()}).passthrough())}).passthrough(),gc=o.z.object({models:o.z.array(pc)}).passthrough(),zc=o.z.object({id:o.z.string().trim().min(1).max(160),status:o.z.string().trim().min(1).max(80)}).strip(),hc=o.z.object({id:o.z.string().trim().min(1).max(120),nodeId:o.z.string().trim().min(1).max(120),name:o.z.string().trim().min(1).max(160),path:o.z.string().trim().min(1).max(4096),labels:o.z.record(o.z.string(),o.z.string()),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).passthrough();function yc(e){const t=async(t,n,i)=>(await e.request(t,sc(n),{signal:i})).data;return{nodes:e=>t("/api/nodes?projection=directory",Jo,e),node:(e,n)=>t(`/api/nodes/${encodeURIComponent(e)}`,uc,n),instanceBoard:e=>t("/api/instance-board?projection=directory",ea,e),instanceDirectory:t=>e.request("/api/instance-board?projection=directory&progressive=true",dc,{signal:t}),models:e=>t("/api/models",gc,e),instanceWorkspaceSource:async(e,n)=>(await t(`/api/controlled-instances/${encodeURIComponent(e)}`,lc,n)).source,updateInstanceName:async(t,n)=>(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,sc(mc),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:n})})).data,updateNodeName:async(t,n)=>(await e.request(`/api/nodes/${encodeURIComponent(t)}`,sc(mc),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:n})})).data,updateInstanceDefaultPermissionMode:async(t,n)=>(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,sc(cc),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({config:{defaultCodexPermissionMode:n}})})).data.config.defaultCodexPermissionMode,createInstance:async t=>(await e.request("/api/controlled-instances",sc(Fd),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)})).data,async deleteInstance(t,n){const i=Yr.parse(n);return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,sc(Kr),{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify(i)})).data},nodeLocalFolders:(e,n)=>t(`/api/nodes/${encodeURIComponent(e)}/local-folders`,o.z.array(hc),n),instanceAction(t,n){const i=Bo.parse(n),o="retry-image"===i?"image-provisioning/retry":i;return e.request(`/api/controlled-instances/${encodeURIComponent(t)}/${o}`,sc(zc),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}).then(e=>e.data)}}}const fc=aa.extend({id:aa.shape.configHash}).strip(),Ic=o.z.object({config:aa,deployment:sa,runtime:da.optional()}).strip(),bc=o.z.object({previousConfigHash:aa.shape.configHash.optional(),trigger:fc.optional(),configHash:aa.shape.configHash.optional(),deletedTemplate:o.z.boolean().optional(),results:o.z.array(o.z.unknown()).optional(),partialFailures:o.z.array(ha).default([])}).strip(),wc=o.z.object({configHash:aa.shape.configHash,results:o.z.array(o.z.unknown()).default([])}).passthrough();function vc(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data;return{list:e=>t("/api/triggers",ga,{signal:e}),create:e=>t("/api/triggers",fc,$n("POST",za.parse(e))),update:(e,n)=>t(`/api/triggers/${encodeURIComponent(e)}`,bc,$n("PUT",za.parse(n))),remove:e=>t(`/api/triggers/${encodeURIComponent(e)}`,bc,$n("DELETE")),apply:(e,n)=>t(`/api/triggers/${encodeURIComponent(e)}/apply`,wc,$n("POST",n)),bindSession:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/triggers`,Ic,$n("POST",{configHash:i})),unbindSession:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/triggers/${encodeURIComponent(i)}`,o.z.unknown(),$n("DELETE")),run:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/triggers/${encodeURIComponent(n)}/run`,o.z.unknown(),$n("POST",i?{deploymentId:i}:{}))}}const xc=o.z.object({maxIdleAiSessions:o.z.number().int().min(1).max(50).default(5)}).strict(),Ac=o.z.string().trim().min(1).max(1024).refine(e=>!e.startsWith("/")&&!e.includes("\\")&&e.split("/").every(e=>e.length>0&&"."!==e&&".."!==e),"Story paths must be normalized relative POSIX paths."),Sc=o.z.string().regex(/^[a-f0-9]{64}$/),Cc=o.z.object({title:o.z.string().trim().min(1).max(240),storyPath:Ac,revision:Sc}).strict(),kc=o.z.object({agent:_.optional(),mode:ze.optional(),permissionMode:he.optional(),modelSelection:$e.optional(),reasoningEffort:Ne.optional(),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Ue.optional(),workspaceSelection:_e.optional()}).strict().refine(e=>!(e.gitSelection&&e.workspaceSelection),{message:"gitSelection and workspaceSelection are mutually exclusive.",path:["workspaceSelection"]}),jc=o.z.object({id:o.z.string().trim().min(1).max(120),title:o.z.string().trim().min(1).max(120),promptTemplate:o.z.string().trim().min(1).max(32e3),targetInstanceId:o.z.string().trim().min(1).max(120).optional(),sessionPreset:kc.optional()}).strict(),Rc=jc.omit({id:!0,targetInstanceId:!0}).extend({targetInstanceId:jc.shape.targetInstanceId.unwrap()}).strict(),Tc=Rc.extend({id:jc.shape.id.optional()}).strict(),Ec=o.z.object({targetInstanceId:o.z.string().trim().min(1).max(120),aiSessionId:o.z.string().trim().min(1).max(120)}).strict(),Pc=o.z.discriminatedUnion("scheduleKind",[o.z.object({scheduleKind:o.z.literal("interval"),intervalMs:o.z.number().int().min(6e4)}).strict(),o.z.object({scheduleKind:o.z.literal("daily"),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict(),o.z.object({scheduleKind:o.z.literal("weekly"),weekdays:o.z.array(o.z.number().int().min(0).max(6)).min(1).max(7).refine(e=>new Set(e).size===e.length,"Weekdays must be unique."),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict(),o.z.object({scheduleKind:o.z.literal("monthly"),dayOfMonth:o.z.number().int().min(-3).max(31).refine(e=>0!==e,"Day of month must not be zero."),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict()]),Oc=o.z.object({cooldownMs:o.z.number().int().min(0).max(864e5).optional(),maxConcurrentRuns:o.z.number().int().min(1).max(20).default(1),whenBusy:o.z.enum(["skip","queue"]).default("skip")}).strict(),$c=o.z.object({id:o.z.string().trim().min(1).max(120),storyId:T,actionId:jc.shape.id,schedule:Pc,enabled:o.z.boolean().default(!0),policy:Oc.default({maxConcurrentRuns:1,whenBusy:"skip"}),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Nc=$c.omit({id:!0,createdAt:!0,updatedAt:!0}).strict(),_c=o.z.object({action:jc.extend({targetInstanceId:jc.shape.targetInstanceId.unwrap()}).strict(),automation:Nc.omit({storyId:!0,actionId:!0}).strict()}).strict(),Uc=o.z.object({actionId:$c.shape.actionId.optional(),schedule:Pc.optional(),enabled:o.z.boolean().optional(),policy:Oc.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one Automation field is required."),qc=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),Lc=o.z.enum(["queued","dispatching","running","completed","failed","skipped"]),Dc=o.z.object({id:o.z.string().trim().min(1).max(160),automationId:$c.shape.id,eventType:o.z.enum(["manual","schedule"]),status:Lc,scheduledFor:o.z.string().datetime(),targetInstanceId:o.z.string().trim().min(1).max(120),aiSessionId:o.z.string().trim().min(1).max(120).optional(),error:qc.optional(),queuedAt:o.z.string().datetime(),startedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),Mc=o.z.enum(["disabled","blocked","scheduled","running","error"]),Bc=o.z.object({automation:$c,effectiveStatus:Mc,blockedReason:qc.optional(),nextRunAt:o.z.string().datetime().optional(),currentRuns:o.z.array(Dc).max(20).default([]),lastRun:Dc.optional()}).strict(),Hc=o.z.object({automations:o.z.array(Bc).default([])}).strict(),Fc=o.z.object({runs:o.z.array(Dc).max(120).default([])}).strict(),Vc=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160)}).strict();o.z.object({storyId:T,automationId:$c.shape.id,change:o.z.enum(["created","updated","deleted","status","run"]),status:Bc.optional(),run:Dc.optional()}).strict();const Gc=o.z.object({id:T,ownerNodeId:o.z.string().trim().min(1).max(120),title:o.z.string().trim().min(1).max(240),description:o.z.string().trim().max(4e3).optional(),documents:o.z.array(Cc).max(500).default([]),actions:o.z.array(jc).max(50).default([]),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),archivedAt:o.z.string().datetime().optional()}).strict(),Yc=o.z.object({stories:o.z.array(Gc).default([])}).strict(),Wc=o.z.object({title:Gc.shape.title,description:Gc.shape.description,actions:o.z.array(Rc).max(50).optional(),maxIdleAiSessions:xc.shape.maxIdleAiSessions.optional()}).strict(),Kc=o.z.object({title:Gc.shape.title.optional(),description:Gc.shape.description.nullable().optional(),actions:o.z.array(Tc).max(50).optional(),maxIdleAiSessions:xc.shape.maxIdleAiSessions.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one Story field is required."),Jc=o.z.object({title:Cc.shape.title.optional(),storyPath:Ac.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one document field is required."),Zc=o.z.object({storyPaths:o.z.array(Ac).max(500)}).strict();o.z.object({storyPath:Ac,title:Cc.shape.title.optional(),expectedRevision:Sc.optional()}).strict(),o.z.object({documents:o.z.array(Cc).max(500)}).strict();const Qc=o.z.union([o.z.number(),o.z.string().regex(/^\d+$/).transform(Number)]);o.z.object({page:Qc.pipe(o.z.number().int().min(1).max(500)).default(1),pageSize:Qc.pipe(o.z.number().int().min(1).max(100)).default(20)}).strict();const Xc=o.z.object({title:Cc.shape.title,storyPath:Ac}).strict(),el=o.z.object({page:o.z.number().int().min(1).max(500),pageSize:o.z.number().int().min(1).max(100),totalItems:o.z.number().int().nonnegative(),totalPages:o.z.number().int().nonnegative(),hasMore:o.z.boolean()}).strict();o.z.object({storyCreatedAt:Gc.shape.createdAt,documents:o.z.array(Xc).max(100),pagination:el}).strict(),o.z.object({storyCreatedAt:Gc.shape.createdAt,documents:o.z.array(Xc.strip()).max(100),pagination:el.strip()}).strip();const tl=o.z.object({storyPath:Ac,revision:Sc,content:o.z.string(),size:o.z.number().int().nonnegative()}).strict();o.z.object({storyPaths:o.z.array(Ac).min(1).max(20),destinationPath:o.z.string().trim().min(1).max(4096)}).strict(),o.z.object({storyPath:Ac,title:Cc.shape.title.optional(),sourcePath:o.z.string().trim().min(1).max(4096),expectedRevision:Sc.optional()}).strict();const nl=o.z.object({storyPath:Ac,path:o.z.string().trim().min(1).max(4096).optional(),revision:Sc.optional(),error:o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict().optional()}).strict();o.z.object({items:o.z.array(nl).min(1).max(20)}).strict(),o.z.object({storyId:T,nodeId:o.z.string().trim().min(1).max(120),change:o.z.enum(["created","updated","archived","restored","deleted","content.written","document.updated","document.reordered","document.deleted"]).optional(),storyPath:Ac.optional()}).strict();const il=2e3,ol=32e3,al=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),rl=al,sl=o.z.string().regex(/^[a-f0-9]{64}$/),dl=o.z.enum(["overlay-copy-on-write","worktree"]),cl=o.z.enum(["instance","container","local-runtime"]),ll=o.z.object({workspaceMaterializer:dl.default("overlay-copy-on-write"),processSandbox:cl.default("instance")}).strict(),ml=o.z.object({id:rl,revision:sl,name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(il).default(""),appendedPrompt:o.z.string().max(ol).default(""),targetInstanceId:al,cwdFolderId:al,providerId:al,modelEntityId:al.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:ll,createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),ul={name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(il).default(""),appendedPrompt:o.z.string().max(ol).default(""),targetInstanceId:al,cwdFolderId:al,providerId:al,modelEntityId:al.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:ll.optional()},pl=o.z.object(ul).strict(),gl=o.z.object({expectedRevision:sl,name:ul.name.optional(),description:o.z.string().trim().max(il).nullable().optional(),appendedPrompt:o.z.string().max(ol).nullable().optional(),targetInstanceId:ul.targetInstanceId.optional(),cwdFolderId:ul.cwdFolderId.optional(),providerId:ul.providerId.optional(),modelEntityId:al.nullable().optional(),modelName:o.z.string().trim().min(1).max(120).nullable().optional(),reasoningEffort:o.z.string().trim().min(1).max(120).nullable().optional(),permissionMode:o.z.string().trim().min(1).max(120).nullable().optional(),executionPolicy:ul.executionPolicy}).strict();o.z.object({agents:o.z.array(ml)}).strict();const zl=o.z.object({id:rl,deleted:o.z.literal(!0),deletedOrchestrationIds:o.z.array(o.z.string().trim().min(1).max(160)).default([])}).strict();o.z.object({agents:o.z.array(o.z.object({nodeId:al,agent:ml}).strict()),unavailableNodeIds:o.z.array(al).default([])}).strict();const hl=o.z.enum(["AGENT_DEFINITION_INVALID_INPUT","AGENT_DEFINITION_NOT_FOUND","AGENT_DEFINITION_REVISION_CONFLICT","AGENT_DEFINITION_TARGET_INSTANCE_UNKNOWN","AGENT_DEFINITION_FOLDER_UNKNOWN","AGENT_DEFINITION_PROVIDER_UNSUPPORTED","AGENT_DEFINITION_POLICY_UNSUPPORTED"]),yl=o.z.object({code:o.z.literal("AGENT_DEFINITION_REVISION_CONFLICT"),expectedRevision:sl,actualRevision:sl}).strict();o.z.union([yl,o.z.object({code:hl}).strict()]);const fl=o.z.object({agentId:rl,change:o.z.enum(["created","updated","deleted"]),revision:sl.optional(),definition:ml.optional()}).strict();o.z.object({nodeId:al,event:fl}).strict();const Il=ml.strip().extend({executionPolicy:ll.strip()});o.z.object({agents:o.z.array(Il)}).strip();const bl=o.z.object({agents:o.z.array(o.z.object({nodeId:al,agent:Il}).strip()),unavailableNodeIds:o.z.array(o.z.string().trim().min(1).max(120)).default([])}).strip(),wl=o.z.object({agentId:rl,change:o.z.enum(["created","updated","deleted"]),revision:sl.optional(),definition:Il.optional()}).strip();function vl(e){return Il.parse(e)}o.z.object({nodeId:al,event:wl}).strip();const xl=200,Al=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Sl=Al,Cl=o.z.string().regex(/^[a-f0-9]{64}$/),kl=o.z.object({fromAgentId:rl,toAgentId:rl}).strict(),jl=o.z.object({id:Sl,revision:Cl,name:o.z.string().trim().min(1).max(120),agentIds:o.z.array(rl).min(1).max(50),edges:o.z.array(kl).max(xl),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Rl=o.z.object({name:o.z.string().trim().min(1).max(120),agentIds:o.z.array(rl).min(1).max(50),edges:o.z.array(kl).max(xl).default([])}).strict(),Tl=o.z.object({expectedRevision:Cl,name:o.z.string().trim().min(1).max(120).optional(),agentIds:o.z.array(rl).min(1).max(50).optional(),edges:o.z.array(kl).max(xl).optional()}).strict();o.z.object({orchestrations:o.z.array(jl)}).strict();const El=o.z.object({id:Sl,deleted:o.z.literal(!0)}).strict();o.z.object({orchestrations:o.z.array(o.z.object({nodeId:Al,orchestration:jl}).strict()),unavailableNodeIds:o.z.array(Al).default([])}).strict();const Pl=o.z.enum(["AGENT_ORCHESTRATION_NOT_FOUND","AGENT_ORCHESTRATION_REVISION_CONFLICT","AGENT_ORCHESTRATION_INVALID_GRAPH","AGENT_ORCHESTRATION_AGENT_UNKNOWN","AGENT_ORCHESTRATION_CYCLE","AGENT_ORCHESTRATION_DEFAULT_PROTECTED"]),Ol=o.z.object({code:o.z.literal("AGENT_ORCHESTRATION_CYCLE"),cycle:o.z.array(rl).min(2)}).strict(),$l=o.z.object({code:o.z.literal("AGENT_ORCHESTRATION_REVISION_CONFLICT"),expectedRevision:Cl,actualRevision:Cl}).strict();o.z.union([Ol,$l,o.z.object({code:Pl}).strict()]);const Nl=o.z.object({orchestrationId:Sl,change:o.z.enum(["created","updated","deleted"]),revision:Cl.optional(),orchestration:jl.optional()}).strict();o.z.object({nodeId:Al,event:Nl}).strict();const _l=jl.strip().extend({agentIds:o.z.array(rl).max(50).default([]),edges:o.z.array(kl).max(xl).default([])});o.z.object({orchestrations:o.z.array(_l)}).strip();const Ul=o.z.object({orchestrations:o.z.array(o.z.object({nodeId:o.z.string().trim().min(1).max(160),orchestration:_l}).strip()),unavailableNodeIds:o.z.array(o.z.string().trim().min(1).max(160)).default([])}).strip(),ql=o.z.object({orchestrationId:Sl,change:o.z.enum(["created","updated","deleted"]),revision:Cl.optional(),orchestration:_l.optional()}).strip();function Ll(e){return _l.parse(e)}o.z.object({nodeId:o.z.string().trim().min(1).max(160),event:ql}).strip();const Dl=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Ml=Dl,Bl=Dl,Hl=o.z.number().int().nonnegative(),Fl=o.z.enum(["queued","preparing","running","finalizing","completed","failed","cancelled"]),Vl=o.z.object({kind:o.z.enum(["control-plane-user","standalone-operator"]),subjectId:Dl,authorizationRevision:o.z.number().int().nonnegative().optional()}).strict(),Gl=o.z.object({source:o.z.literal("story-session").optional(),initiatingInstanceId:Dl,initiatingAiSessionId:Dl,storyId:Dl,authorizationSubject:Vl.optional()}).strict(),Yl=o.z.object({source:o.z.literal("control-plane"),authorizationSubject:Vl.optional()}).strict(),Wl=o.z.union([Gl,Yl]),Kl=o.z.object({maxMembers:o.z.number().int().positive(),maxDepth:o.z.number().int().nonnegative(),maxConcurrency:o.z.number().int().positive()}).strict(),Jl=o.z.object({prompt:o.z.string().trim().min(1).max(128e3)}).strict(),Zl=o.z.object({agentRevision:sl,targetInstanceId:Dl,cwdFolderId:Dl,appendedPrompt:o.z.string().max(32e3),providerId:Dl,modelEntityId:Dl.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:ll}).strict(),Ql=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(4e3),retryable:o.z.boolean().default(!1),details:o.z.record(o.z.string(),o.z.unknown()).optional()}).strict(),Xl=o.z.object({text:o.z.string().max(128e3),truncated:o.z.boolean().default(!1),source:o.z.literal("provider-final-message").default("provider-final-message")}).strict(),em=o.z.object({status:o.z.enum(["pending","delivered","failed"]),attempts:o.z.number().int().nonnegative(),updatedAt:o.z.string().datetime(),deliveredAt:o.z.string().datetime().optional(),error:Ql.optional()}).strict();o.z.object({runId:Ml,status:o.z.enum(["completed","failed","cancelled"]),result:o.z.object({text:o.z.string().max(32e3),truncated:o.z.boolean()}).strict().optional(),error:Ql.optional()}).strict().superRefine((e,t)=>{"completed"!==e.status||e.result||t.addIssue({code:o.z.ZodIssueCode.custom,message:"A completed Agent Run tool result requires result text."}),"completed"===e.status||e.error||t.addIssue({code:o.z.ZodIssueCode.custom,message:"A failed or cancelled Agent Run tool result requires an error."})});const tm=o.z.object({status:o.z.enum(["pending","completed","retrying","manual-intervention"]),attempts:o.z.number().int().nonnegative(),message:o.z.string().max(4e3).optional(),updatedAt:o.z.string().datetime()}).strict(),nm=o.z.object({runtimeId:Dl,state:o.z.enum(["preparing","active","retained","expiring","delete-retrying","expired","manual-intervention"]),usageBytes:o.z.number().int().nonnegative(),quotaBytes:o.z.number().int().positive(),expiresAt:o.z.string().datetime().optional()}).strict(),im=o.z.object({memberId:Bl,runId:Ml,agentId:rl,parentMemberId:Bl.optional(),instanceId:Dl,aiSessionId:Dl.optional(),role:o.z.enum(["root","callee"]),depth:o.z.number().int().nonnegative(),status:Fl,input:Jl.optional(),executionSnapshot:Zl,result:Xl.optional(),error:Ql.optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict(),om=o.z.object({runId:Ml,sequence:o.z.number().int().positive(),timestamp:o.z.string().datetime(),kind:o.z.string().trim().min(1).max(120),memberId:Bl.optional(),data:o.z.record(o.z.string(),o.z.unknown()).default({})}).strict(),am=o.z.object({runId:Ml,clientRequestId:Dl,revision:Hl,status:Fl,input:Jl.optional(),provenance:Wl,orchestrationId:Sl,rootMemberId:Bl,budget:Kl,result:Xl.optional(),resultDelivery:em.optional(),error:Ql.optional(),cleanup:tm.optional(),sharedSpace:nm.optional(),members:o.z.array(im).optional(),timeline:o.z.array(om).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict(),rm=o.z.object({clientRequestId:Dl,orchestrationId:Sl,entryAgentId:rl.optional(),input:Jl,provenance:Wl,budget:Kl.optional()}).strict(),sm=o.z.object({clientRequestId:Dl,orchestrationId:Sl,entryAgentId:rl.optional(),input:Jl,budget:Kl.optional()}).strict(),dm=o.z.object({expectedRevision:Hl.optional()}).strict();o.z.object({runs:o.z.array(am)}).strict(),o.z.enum(["AGENT_RUN_NOT_FOUND","AGENT_RUN_MEMBER_NOT_FOUND","AGENT_RUN_IDEMPOTENCY_CONFLICT","AGENT_RUN_REVISION_CONFLICT","AGENT_RUN_INITIATING_INSTANCE_UNKNOWN","AGENT_RUN_ORCHESTRATION_UNKNOWN","AGENT_RUN_ENTRY_REQUIRED","AGENT_RUN_ENTRY_INVALID","AGENT_RUN_INVOCATION_FORBIDDEN","AGENT_RUN_EXECUTION_UNSUPPORTED","AGENT_RUN_ALREADY_TERMINAL"]);const cm=o.z.object({runId:Ml,revision:Hl,run:am}).strict(),lm=o.z.object({runId:Ml,memberId:Bl,revision:Hl,member:im}).strict();o.z.object({runs:o.z.array(o.z.object({nodeId:Dl,run:am}).strict()),unavailableNodeIds:o.z.array(Dl).default([])}).strict(),o.z.object({nodeId:Dl,event:o.z.union([cm,lm])}).strict();const mm=im.strip().extend({input:Jl.strip().optional(),executionSnapshot:Zl.strip(),result:Xl.strip().optional(),error:Ql.strip().optional()}),um=om.strip(),pm=am.strip().extend({orchestrationId:Sl.optional(),input:Jl.strip().optional(),provenance:o.z.union([Gl.strip().extend({authorizationSubject:Vl.strip().optional()}),Yl.strip().extend({authorizationSubject:Vl.strip().optional()})]),budget:Kl.strip(),result:Xl.strip().optional(),resultDelivery:em.strip().extend({error:Ql.strip().optional()}).optional(),error:Ql.strip().optional(),cleanup:tm.strip().optional(),sharedSpace:nm.strip().optional(),members:o.z.array(mm).optional(),timeline:o.z.array(um).optional()}).transform(e=>{const t=e.orchestrationId??(()=>{const t=(e.members??[]).find(t=>t.memberId===e.rootMemberId);if(!t)throw new Error("An Agent Run without an orchestration binding requires its root member to normalize.");return n=t.agentId,`default:${rl.parse(n)}`;var n})();return{...e,orchestrationId:t}}),gm=o.z.object({runId:Ml,revision:Hl,run:pm}).strip(),zm=o.z.object({runId:Ml,memberId:Bl,revision:Hl,member:mm}).strip();function hm(e){return pm.parse(e)}o.z.object({nodeId:Dl,event:o.z.union([gm,zm])}).strip();const ym=["agent_run"],fm=o.z.enum(ym),Im=o.z.object({agentId:rl,orchestrationId:Sl}).strict(),bm=o.z.object({enabledTools:o.z.array(fm).max(ym.length),allowedTargets:o.z.array(Im).max(50)}).strict(),wm=o.z.object({agentId:rl,orchestrationId:Sl.optional(),prompt:o.z.string().trim().min(1).max(128e3),budget:Kl.optional()}).strict();o.z.object({clientRequestId:o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),input:wm}).strict(),o.z.object({enabledTools:o.z.array(o.z.string()).max(100).optional(),allowedTargets:o.z.array(Im).max(50).optional()}).strip(),o.z.enum(["content","actions","automations","aiSessions"]);const vm=o.z.object({content:o.z.boolean(),actions:o.z.boolean(),automations:o.z.boolean(),aiSessions:o.z.boolean()}).strict();vm.strip().partial();const xm=["story_list_content","story_get_content","story_set_content","story_list_actions","story_run_action","story_list_automations","story_create_automation","story_update_automation","story_delete_automation","story_run_automation","story_list_automation_runs","story_list_ai_sessions","story_get_ai_session","story_get_ai_session_turn"],Am=o.z.enum(xm),Sm=o.z.object({policy:vm,revision:o.z.string().regex(/^[a-f0-9]{64}$/)}).strict(),Cm=o.z.object({policy:vm}).strict();Sm.extend({storyId:T,enabledTools:o.z.array(Am).max(xm.length),agentInvocation:bm}).strict(),o.z.object({storyId:T,revision:Sm.shape.revision}).strict();const km=o.z.object({policy:vm.strip(),revision:Sm.shape.revision}).strip();function jm(e){return km.parse(e)}km.extend({storyId:T,enabledTools:o.z.array(o.z.string()).max(100),agentInvocation:o.z.unknown().optional()}).strip();const Rm=o.z.object({page:o.z.number().int().min(1).max(500).default(1),pageSize:o.z.number().int().min(1).max(100).default(20)}).strict(),Tm=o.z.object({totalItems:o.z.number().int().nonnegative(),nextPage:o.z.number().int().min(2).max(500).optional()}).strict();o.z.object({documents:o.z.array(o.z.object({title:Cc.shape.title,storyPath:Ac}).strict()).max(100),pagination:Tm}).strict(),o.z.object({items:o.z.array(o.z.object({storyPath:Ac,path:o.z.string().trim().min(1).max(4096).optional(),revision:Sc.optional(),error:o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict().optional()}).strict()).min(1).max(20)}).strict(),o.z.object({title:Cc.shape.title,storyPath:Ac,revision:Sc,size:o.z.number().int().nonnegative()}).strict();const Em=o.z.enum(["STORY_ARCHIVED","STORY_ACTION_TARGET_REQUIRED","STORY_ACTION_TARGET_UNAVAILABLE"]);o.z.object({actions:o.z.array(o.z.object({id:jc.shape.id,title:jc.shape.title,promptPreview:o.z.string().max(500),promptTruncated:o.z.boolean(),executable:o.z.boolean(),unavailableReason:Em.optional()}).strict()).max(100),pagination:Tm}).strict();const Pm=o.z.object({actionId:jc.shape.id,clientRequestId:o.z.string().trim().min(1).max(160)}).strict();o.z.object({session:o.z.object({instanceId:o.z.string().trim().min(1).max(120),sessionId:o.z.string().trim().min(1).max(120)}).strict()}).strict(),o.z.object({actionId:jc.shape.id,schedule:Pc,enabled:o.z.boolean().default(!0),policy:Oc.default({maxConcurrentRuns:1,whenBusy:"skip"})}).strict(),o.z.object({automationId:o.z.string().trim().min(1).max(120),expectedUpdatedAt:o.z.string().datetime(),actionId:jc.shape.id.optional(),schedule:Pc.optional(),enabled:o.z.boolean().optional(),policy:Oc.optional()}).strict().refine(e=>Object.keys(e).some(e=>!["automationId","expectedUpdatedAt"].includes(e)),"At least one Automation field is required."),o.z.object({automationId:o.z.string().trim().min(1).max(120),expectedUpdatedAt:o.z.string().datetime()}).strict(),o.z.object({automationId:o.z.string().trim().min(1).max(120),clientRequestId:o.z.string().trim().min(1).max(160)}).strict(),o.z.object({automationId:o.z.string().trim().min(1).max(120),page:Rm.shape.page,pageSize:Rm.shape.pageSize}).strict(),o.z.object({deleted:o.z.boolean()}).strict();const Om=o.z.object({id:o.z.string().trim().min(1).max(160),eventType:o.z.enum(["manual","schedule"]),status:Lc,scheduledFor:o.z.string().datetime(),session:o.z.object({instanceId:o.z.string().trim().min(1).max(120),sessionId:o.z.string().trim().min(1).max(120)}).strict().optional(),error:qc.optional(),startedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),$m=o.z.object({id:o.z.string().trim().min(1).max(120),actionId:jc.shape.id,schedule:Pc,enabled:o.z.boolean(),policy:Oc,updatedAt:o.z.string().datetime(),effectiveStatus:Mc,blockedReason:qc.optional(),nextRunAt:o.z.string().datetime().optional(),activeRunCount:o.z.number().int().nonnegative(),lastRun:Om.optional()}).strict();o.z.object({automations:o.z.array($m).max(100),pagination:Tm}).strict(),o.z.object({runs:o.z.array(Om).max(100),pagination:Tm}).strict();const Nm=o.z.object({instanceId:o.z.string().trim().min(1).max(120),sessionId:o.z.string().trim().min(1).max(120)}).strict(),_m=Nm.extend({title:o.z.string().trim().max(240).optional(),agent:o.z.string().trim().min(1).max(120),status:o.z.enum(["running","waiting","idle"]),updatedAt:o.z.string().datetime()}).strict();o.z.object({sessions:o.z.array(_m).max(100),pagination:Tm}).strict(),Nm.extend({page:Rm.shape.page,pageSize:o.z.number().int().min(1).max(50).default(10)}).strict(),o.z.object({detail:mt,turnIndex:pt}).strict();const Um=o.z.object({cwd:mt.shape.cwd,modelName:o.z.string().trim().min(1).max(240).optional(),reasoningEffort:mt.shape.reasoningEffort,error:mt.shape.error}).strict(),qm=ct.pick({id:!0,status:!0,phase:!0,updatedAt:!0,completedAt:!0}).strict(),Lm=ct.pick({id:!0,status:!0,phase:!0,contextCompactions:!0,startedAt:!0,updatedAt:!0,completedAt:!0}).strict();o.z.object({ref:Nm,session:Um,turns:o.z.array(qm).max(50),pagination:Tm}).strict(),Nm.extend({turnId:o.z.string().trim().min(1).max(240),page:Rm.shape.page,pageSize:o.z.number().int().min(1).max(50).default(20),maxTextChars:o.z.number().int().min(256).max(32e3).default(8e3)}).strict();const Dm=o.z.array(o.z.enum(["text","summary","input","output","paths"])).max(5).optional(),Mm=o.z.object({id:o.z.string().trim().min(1).max(240),truncatedFields:Dm}).strict(),Bm=Mm.extend({type:o.z.literal("user-message"),text:o.z.string().max(32e3),attachments:o.z.array(H).max(6).optional()}).strict(),Hm=Mm.extend({type:o.z.literal("ai-message"),text:o.z.string().max(32e3)}).strict(),Fm=Mm.extend({type:o.z.literal("activity"),activityKind:o.z.string().trim().min(1).max(120),title:o.z.string().trim().min(1).max(240),status:o.z.enum(["running","completed","failed","waiting"]).optional(),summary:o.z.string().max(32e3).optional(),input:o.z.string().max(32e3).optional(),output:o.z.string().max(32e3).optional(),paths:o.z.array(o.z.string().trim().min(1).max(4096)).max(100).optional(),exitCode:o.z.number().int().optional(),durationMs:o.z.number().int().nonnegative().optional()}).strict(),Vm=o.z.discriminatedUnion("type",[Bm,Hm,Fm]);function Gm(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data;return{list:(e,n)=>t("/api/stories"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.object({stories:Yc.shape.stories,unavailableNodeIds:o.z.array(o.z.string()).default([])}).strict(),{signal:n}),get:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,Gc),preview:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/content/preview?nodeId=${encodeURIComponent(n)}&storyPath=${encodeURIComponent(i)}`,tl,{signal:o}),create:(e,n)=>t("/api/stories",Gc,$n("POST",{nodeId:e,input:Wc.parse(n)})),update:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}`,Gc,$n("PATCH",{nodeId:n,input:Kc.parse(i)})),retentionSettings:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/settings?nodeId=${encodeURIComponent(n)}`,xc),async agentToolSettings(e,n){const i=await t(`/api/stories/${encodeURIComponent(e)}/settings/agent-tools?nodeId=${encodeURIComponent(n)}`,o.z.unknown());return Sm.parse(jm(i))},async updateAgentToolSettings(e,n,i){const a=Cm.parse({policy:i}),r=await t(`/api/stories/${encodeURIComponent(e)}/settings/agent-tools`,o.z.unknown(),$n("PUT",{nodeId:n,input:a}));return Sm.parse(jm(r))},runAction(e,n,i,o){const a=Pm.omit({actionId:!0}).parse({clientRequestId:o});return t(`/api/stories/${encodeURIComponent(e)}/actions/${encodeURIComponent(n)}/run`,Ec,$n("POST",{nodeId:i,input:a}))},archive:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/archive`,Gc,$n("POST",{nodeId:n})),restore:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/restore`,Gc,$n("POST",{nodeId:n})),remove:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.object({deleted:o.z.boolean()}).strict(),$n("DELETE")),listAutomations:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/automations?nodeId=${encodeURIComponent(n)}`,Hc),getAutomation:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,Bc),createAutomation:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations`,Bc,$n("POST",{nodeId:n,input:Nc.parse(i)})),createAutomationWithAction:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/with-action`,Bc,$n("POST",{nodeId:n,input:_c.parse(i)})),updateAutomation:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}`,Bc,$n("PATCH",{nodeId:i,input:Uc.parse(o)})),removeAutomation:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,o.z.object({deleted:o.z.boolean()}).strict(),$n("DELETE")),setAutomationEnabled:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/${o?"enable":"disable"}`,Bc,$n("POST",{nodeId:i})),runAutomation:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/run`,Dc,$n("POST",{nodeId:i,input:Vc.parse(o)})),automationRuns:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/runs?nodeId=${encodeURIComponent(i)}`,Fc),updateDocument:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/documents/${encodeURIComponent(i)}`,Gc,$n("PATCH",{nodeId:n,input:Jc.parse(o)})),removeDocument:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/documents/${encodeURIComponent(i)}`,o.z.object({deleted:o.z.boolean()}).strict(),$n("DELETE",{nodeId:n})),reorderDocuments:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/documents/order`,Gc,$n("POST",{nodeId:n,input:Zc.parse(i)})),setSessionStory:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/story`,o.z.unknown(),$n("PUT",{storyId:i}))}}o.z.object({ref:Nm,turn:Lm,items:o.z.array(Vm).max(50),pagination:Tm}).strict(),o.z.object({body:gt,timeline:te}).strict(),o.z.object({detail:mt.strip(),turnIndex:pt.strip()}).strip(),o.z.object({body:gt.strip(),timeline:te.strip()}).strip();const Ym=o.z.object({agentId:rl,orchestrationId:Sl,status:o.z.enum(["available","missing-reference"])}).strict(),Wm=o.z.object({storyId:T,revision:sl,entries:o.z.array(Ym)}).strict(),Km=o.z.object({expectedRevision:sl,entries:o.z.array(o.z.object({agentId:rl,orchestrationId:Sl.optional()}).strict()).max(50)}).strict();o.z.enum(["STORY_AGENT_ENTRY_STORY_NOT_FOUND","STORY_AGENT_ENTRY_AGENT_NOT_FOUND","STORY_AGENT_ENTRY_ORCHESTRATION_NOT_FOUND","STORY_AGENT_ENTRY_ORCHESTRATION_MISMATCH","STORY_AGENT_ENTRY_REVISION_CONFLICT"]);const Jm=Ym.strip(),Zm=Wm.strip().extend({entries:o.z.array(Jm)});function Qm(e){return Zm.parse(e)}function Xm(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data;return{async list(e,n){return i=await t("/api/agents"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.unknown(),{signal:n}),bl.parse(i);var i},get:async(e,n,i)=>vl(await t(`/api/agents/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),create:async(e,n)=>vl(await t("/api/agents",o.z.unknown(),$n("POST",{nodeId:e,input:pl.parse(n)}))),update:async(e,n,i)=>vl(await t(`/api/agents/${encodeURIComponent(e)}`,o.z.unknown(),$n("PATCH",{nodeId:n,input:gl.parse(i)}))),remove(e,n,i={}){const o=new URLSearchParams({nodeId:n});return i.referencingOrchestrations&&o.set("referencingOrchestrations",i.referencingOrchestrations),t(`/api/agents/${encodeURIComponent(e)}?${o.toString()}`,zl,{method:"DELETE"})},async listOrchestrations(e,n){return i=await t("/api/agent-orchestrations"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.unknown(),{signal:n}),Ul.parse(i);var i},getOrchestration:async(e,n,i)=>Ll(await t(`/api/agent-orchestrations/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),createOrchestration:async(e,n)=>Ll(await t("/api/agent-orchestrations",o.z.unknown(),$n("POST",{nodeId:e,input:Rl.parse(n)}))),updateOrchestration:async(e,n,i)=>Ll(await t(`/api/agent-orchestrations/${encodeURIComponent(e)}`,o.z.unknown(),$n("PATCH",{nodeId:n,input:Tl.parse(i)}))),removeOrchestration:(e,n)=>t(`/api/agent-orchestrations/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,El,{method:"DELETE"}),storyEntries:async(e,n,i)=>Qm(await t(`/api/stories/${encodeURIComponent(e)}/agent-entries?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),updateStoryEntries:async(e,n,i)=>Qm(await t(`/api/stories/${encodeURIComponent(e)}/agent-entries`,o.z.unknown(),$n("PUT",{nodeId:n,input:Km.parse(i)}))),async listRuns(e,n){const i=await t("/api/agent-runs"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.object({runs:o.z.array(o.z.object({nodeId:o.z.string(),run:o.z.unknown()}).strip()),unavailableNodeIds:o.z.array(o.z.string()).default([])}).strip(),{signal:n});return{unavailableNodeIds:i.unavailableNodeIds,runs:i.runs.map(({nodeId:e,run:t})=>({nodeId:e,run:hm(t)}))}},getRun:async(e,n,i)=>hm(await t(`/api/agent-runs/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),async getRunMember(e,n,i,a){return r=await t(`/api/agent-runs/${encodeURIComponent(e)}/members/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,o.z.unknown(),{signal:a}),mm.parse(r);var r},createRun:async(e,n)=>hm(await t("/api/agent-runs",o.z.unknown(),$n("POST",{nodeId:e,input:rm.parse(n)}))),createManualRun:async(e,n)=>hm(await t("/api/agent-runs/manual",o.z.unknown(),$n("POST",{nodeId:e,input:sm.parse(n)}))),cancelRun:async(e,n,i={})=>hm(await t(`/api/agent-runs/${encodeURIComponent(e)}/cancel`,o.z.unknown(),$n("POST",{nodeId:n,input:dm.parse(i)})))}}function eu(e){const t="ai-session"===e.sessionKind?"ai-sessions":"apps/sessions";return`/instances/${encodeURIComponent(e.instanceId)}/api/${t}/${encodeURIComponent(e.sessionId)}/repository`}function tu(e,t){const n=`/api/controlled-instances/${encodeURIComponent(e.instanceId)}/repository/${t}`;return e.cwdFolderId?`${n}?${new URLSearchParams({cwdFolderId:e.cwdFolderId})}`:n}function nu(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data,n=(e,t)=>async n=>{if(!function(e){return Boolean(e&&"object"==typeof e&&404===e.status)}(n)||!e.legacySession)throw n;return t(e.legacySession)};return{async worktrees(e,i){try{return await t(tu(e,"worktrees"),on,{signal:i?.signal})}catch(o){return n(e,e=>t(`${eu(e)}/worktrees`,on,{signal:i?.signal}))(o)}},async createWorktree(e,i,o){const a=vn.parse(i);try{return await t(tu(e,"worktrees"),An,$n("POST",a,o?.signal))}catch(i){return n(e,e=>t(`${eu(e)}/worktrees`,An,$n("POST",a,o?.signal)))(i)}},async removeWorktree(e,i,o){const a=xn.parse(i);try{return await t(tu(e,"worktrees/remove"),Sn,$n("POST",a,o?.signal))}catch(i){return n(e,e=>{if("ai-session"!==e.sessionKind)throw new Error("Worktrees can only be removed from an AI session repository context.");return t(`${eu(e)}/worktrees/remove`,Sn,$n("POST",a,o?.signal))})(i)}},async moveWorktreeToMainPreflight(e,n,i){const o=kn.parse(n);return await t(tu(e,"worktrees/move-to-main/preflight"),jn,$n("POST",o,i?.signal))},async moveWorktreeToMain(e,n,i){const o=Rn.parse(n);return t(tu(e,"worktrees/move-to-main"),Tn,$n("POST",o,i?.signal))},async branches(e,i){try{return await t(tu(e,"branches"),fn,{signal:i?.signal})}catch(o){return n(e,e=>t(`${eu(e)}/branches`,fn,{signal:i?.signal}))(o)}}}}const iu=o.z.object({deleted:o.z.boolean()}).strict(),ou=o.z.array(Ls),au=o.z.array(dd),ru=o.z.array(ld),su=o.z.object({id:o.z.string().trim().min(1),ownedBy:o.z.string().optional()}).passthrough(),du=o.z.object({models:o.z.array(su),latencyMs:o.z.number()}).passthrough(),cu=o.z.object({success:o.z.literal(!0),latencyMs:o.z.number()}).passthrough(),lu=o.z.object({catalog:rd,status:sd}).strict(),mu=Ms.extend({referenceCount:o.z.number().int().min(0).optional()}).passthrough();function uu(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/models/${encodeURIComponent(e)}`,i=(e,t)=>`/api/nodes/${encodeURIComponent(e)}/models${void 0===t?"":`/${encodeURIComponent(t)}`}`;return{listProjects:e=>t("/api/projects",ou,{signal:e}),getProject:(e,n)=>t(`/api/projects/${encodeURIComponent(e)}`,Ls,{signal:n}),createProject:e=>t("/api/projects",Ls,$n("POST",e)),updateProject:(e,n)=>t(`/api/projects/${encodeURIComponent(e)}`,Ls,$n("PATCH",n)),removeProject:e=>t(`/api/projects/${encodeURIComponent(e)}`,iu,$n("DELETE")),listModels(e={}){const n=e.progressive?"?progressive=true":"";return t(`/api/models${n}`,Vs,{signal:e.signal})},getModel:(e,i)=>t(n(e),Ms,{signal:i}),createModel:e=>t("/api/models",Ms,$n("POST",e)),copyModel:(e,i)=>t(`${n(e)}/copy`,Ms,$n("POST",i)),discoverModels:e=>t("/api/models/discover",du,$n("POST",e)),testModel:e=>t("/api/models/test",cu,$n("POST",e)),reorderModels:e=>t("/api/models/reorder",o.z.array(Ms),$n("POST",{ids:[...e]})),updateModel:(e,i)=>t(n(e),Ws,$n("PATCH",i)),syncModel:e=>t(`${n(e)}/sync`,Ws,$n("POST",{})),mergeModel:(e,i)=>t(`${n(e)}/merge`,Js,$n("POST",i)),removeModel:e=>t(n(e),iu,$n("DELETE")),createModelOnNode:(e,n)=>t(i(e),mu,$n("POST",n)),discoverModelsOnNode:(e,n)=>t(`${i(e)}/discover`,du,$n("POST",n)),testModelOnNode:(e,n)=>t(`${i(e)}/test`,cu,$n("POST",n)),updateModelOnNode:(e,n,o)=>t(i(e,n),mu,$n("PATCH",o)),removeModelOnNode:(e,n)=>t(i(e,n),iu,$n("DELETE")),marketCatalog:e=>t("/api/market/catalog",lu,{signal:e}),refreshMarketCatalog:()=>t("/api/market/refresh",lu,$n("POST",{})),imageOptions:e=>t("/api/image-options",ru,{signal:e}),listImages:e=>t("/api/images",au,{signal:e}),getImage:(e,n)=>t(`/api/images/${encodeURIComponent(e)}`,dd,{signal:n}),createImage:e=>t("/api/images",dd,$n("POST",e)),updateImage:(e,n)=>t(`/api/images/${encodeURIComponent(e)}`,dd,$n("PATCH",n)),removeImage:e=>t(`/api/images/${encodeURIComponent(e)}`,iu,$n("DELETE"))}}const pu=o.z.object({id:o.z.string().trim().min(1),status:o.z.enum(["online","offline"]),checkedAt:o.z.string(),agent:o.z.record(o.z.string(),o.z.unknown()).optional(),error:o.z.string().optional()}).passthrough(),gu=o.z.object({deleted:o.z.boolean(),revoke:o.z.object({mode:o.z.enum(["not-proxied","revoked","forced"]),orphanRisk:o.z.boolean()}).strict()}).strict(),zu=o.z.object({data:o.z.array(Id),meta:o.z.object({nodeErrors:o.z.array(Go).default([]),nodeStates:o.z.array(Yo).default([])}).passthrough().optional()}).passthrough(),hu=o.z.object({id:o.z.string().trim().min(1),joinToken:o.z.string().trim().min(1),expiresAt:o.z.string()}).strict(),yu=fd.transform(e=>{const{secret:t,...n}=e.auth;return{...e,auth:n}});function fu(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/nodes/${encodeURIComponent(e)}`,i=(e,t)=>`${n(e)}/runtimes${void 0===t?"":`/${encodeURIComponent(t)}`}`,a=(e,t)=>`${n(e)}/local-folders${void 0===t?"":`/${encodeURIComponent(t)}`}`;return{createNode:e=>t("/api/nodes",yu,$n("POST",e)),updateNode:(e,i)=>t(n(e),yu,$n("PATCH",i)),removeNode(e,i={}){const o=i.force?"?force=true":"";return t(`${n(e)}${o}`,gu,$n("DELETE"))},checkNode:e=>t(`${n(e)}/check`,pu,$n("POST",{})),syncLocalNode:()=>t("/api/nodes/local/sync",yu,$n("POST",{})),listFolders:(e,n)=>t(a(e),o.z.array(Ts),{signal:n}),listFolderPlaces:(e,i)=>t(`${n(e)}/folders/places`,o.z.array(Nd),{signal:i}),listFolderTree(e,i={},a){const r=new URLSearchParams;return i.path&&r.set("path",i.path),void 0!==i.depth&&r.set("depth",String(i.depth)),t(`${n(e)}/folders/tree${r.size?`?${r}`:""}`,o.z.array($d),{signal:a})},createFolder:(e,n)=>t(a(e),Ts,$n("POST",n)),updateFolder:(e,n,i)=>t(a(e,n),Ts,$n("PATCH",i)),removeFolder:(e,n)=>t(a(e,n),Ed,$n("DELETE")),listAllRuntimes(t={}){const n=t.progressive?"?progressive=true":"";return e.request(`/api/node-runtimes${n}`,zu,{signal:t.signal})},listRuntimes:(e,n)=>t(i(e),o.z.array(Id),{signal:n}),createRuntime:(e,n)=>t(i(e),Id,$n("POST",n)),updateRuntime:(e,n,o)=>t(i(e,n),Id,$n("PATCH",o)),removeRuntime:(e,n)=>t(i(e,n),Ed,$n("DELETE")),checkRuntime:(e,n)=>t(`${i(e,n)}/check`,Id,$n("POST",{})),listDockerImages:(e,i)=>t(`${n(e)}/docker/images`,o.z.array(Pd),{signal:i}),imageOptions:(e,i)=>t(`${n(e)}/image-options`,o.z.array(Od),{signal:i}),getExternalListener:(e,i)=>t(`${n(e)}/settings/external-listener`,vd,{signal:i}),updateExternalListener(e,i){const o=xd.parse(i);return t(`${n(e)}/settings/external-listener`,vd,$n("PATCH",o))},getModelRelay:(e,i)=>t(`${n(e)}/settings/model-relay`,Sd,{signal:i}),updateModelRelay(e,i){const o=Cd.parse(i);return t(`${n(e)}/settings/model-relay`,Sd,$n("PATCH",o))},updateJobs:(e,i)=>t(`${n(e)}/updates/jobs`,o.z.array(xs),{signal:i}),checkUpdate(e,i={}){const o=ws.parse(i);return t(`${n(e)}/updates/check`,vs,$n("POST",o))},applyUpdate(e,i){const o=As.parse(i);return t(`${n(e)}/updates/apply`,xs,$n("POST",o))},createPairingInvite:(e,i={})=>t(`${n(e)}/pairing/invites`,kd,$n("POST",i)),listControlPlanePairings:(e,i)=>t(`${n(e)}/control-plane-pairings`,o.z.array(jd),{signal:i}),removeControlPlanePairing:(e,i)=>t(`${n(e)}/control-plane-pairings/${encodeURIComponent(i)}`,Ed,$n("DELETE")),listControlPlaneConnections:(e,i)=>t(`${n(e)}/control-plane-connections`,o.z.array(Rd),{signal:i}),createControlPlaneConnection:(e,i)=>t(`${n(e)}/control-plane-connections`,Td,$n("POST",i)),removeControlPlaneConnection:(e,i)=>t(`${n(e)}/control-plane-connections/${encodeURIComponent(i)}`,Ed,$n("DELETE")),createJoinInvite:(e={})=>t("/api/node-join/invites",hu,$n("POST",e)),joinInviteStatus:(e,n)=>t(`/api/node-join/invites/${encodeURIComponent(e)}`,hd,{signal:n}),completeJoin:e=>t("/api/node-join/complete",yu,$n("POST",e))}}const Iu=o.z.object({deleted:o.z.boolean()}).strict(),bu=o.z.object({revoked:o.z.boolean()}).strict(),wu=o.z.object({credentialId:o.z.string().trim().min(1).max(120)}).strict();function vu(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/git-credentials/${encodeURIComponent(e)}`,i=e=>`/api/controlled-instances/${encodeURIComponent(e)}/git-credential-assignments`;return{listCredentials:e=>t("/api/git-credentials",Qa,{signal:e}),getCredential:(e,i)=>t(n(e),Wa,{signal:i}),createCredential:e=>t("/api/git-credentials",Wa,$n("POST",e)),updateCredential:(e,i)=>t(n(e),Wa,$n("PATCH",i)),removeCredential:e=>t(n(e),Iu,$n("DELETE")),listInstanceAssignments:(e,n)=>t(i(e),o.z.array(Xa),{signal:n}),assignToInstance(e,n){const o=wu.parse(n);return t(i(e),Xa,$n("POST",o))},unassignFromInstance:(e,n)=>t(`${i(e)}/${encodeURIComponent(n)}`,bu,$n("DELETE"))}}const xu=o.z.object({deleted:o.z.boolean(),templateId:o.z.string().trim().min(1).max(120)}).strict();function Au(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/nodes/${encodeURIComponent(e)}/environment-templates`;return{listForNode:(e,i)=>t(n(e),o.z.array(Xr),{signal:i}),get:(e,i,o)=>t(`${n(e)}/${encodeURIComponent(i)}`,Xr,{signal:o}),createFromInstance:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/environment-templates`,Xr,$n("POST",n)),remove:(e,i)=>t(`${n(e)}/${encodeURIComponent(i)}`,xu,$n("DELETE"))}}const Su=Zd.omit({token:!0}).extend({tokenSet:o.z.boolean().optional()}).strip(),Cu=o.z.object({running:o.z.boolean(),bridges:o.z.array(o.z.object({id:o.z.string(),channel:Jd,name:o.z.string(),running:o.z.boolean(),tokenSet:o.z.boolean(),defaultChatId:o.z.string().optional(),lastUpdateId:o.z.number().optional(),error:o.z.string().optional()}).strip()).default([])}).strip();function ku(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/chat-gateway/bridges/${encodeURIComponent(e)}`;return{status:e=>t("/api/chat-gateway/status",Cu,{signal:e}),listBridges:e=>t("/api/chat-gateway/bridges",o.z.array(Su),{signal:e}),createBridge:e=>t("/api/chat-gateway/bridges",Su,$n("POST",e)),updateBridge:(e,i)=>t(n(e),Su,$n("PATCH",i)),startBridge:e=>t(`${n(e)}/start`,Cu,$n("POST",{})),stopBridge:e=>t(`${n(e)}/stop`,Cu,$n("POST",{})),removeBridge:e=>t(n(e),o.z.object({deleted:o.z.boolean()}).strict(),$n("DELETE")),listSessions:e=>t("/api/chat/sessions",o.z.array(Qd),{signal:e}),getSession:(e,n)=>t(`/api/chat/sessions/${encodeURIComponent(e)}`,Qd,{signal:n})}}const ju=o.z.object({protocolVersion:o.z.string(),build:o.z.record(o.z.string(),o.z.unknown()).optional(),storage:o.z.record(o.z.string(),o.z.string())}).passthrough(),Ru=o.z.object({controlPlaneId:o.z.string(),algorithm:o.z.literal("Ed25519"),publicKey:o.z.string(),fingerprint:o.z.string()}).strict(),Tu=o.z.object({version:o.z.literal(1),serviceOrigin:o.z.string(),status:o.z.enum(["unbound","pending-claim","active","pending-revocation","clone-conflict"]),remoteAccessEnabled:o.z.boolean(),accountId:o.z.string().optional(),bindingId:o.z.string().optional(),bindingRevision:o.z.number().int().optional(),updatedAt:o.z.string(),identity:Ru,hasBackgroundCredential:o.z.boolean(),remoteResult:o.z.enum(["confirmed","unknown"]).optional()}).strict(),Eu=o.z.object({challengeCode:o.z.string(),authorizationUrl:o.z.string(),payload:o.z.object({controlPlaneId:o.z.string(),publicKeyFingerprint:o.z.string(),expiresAt:o.z.string()}).strict(),signature:o.z.string()}).strict(),Pu=o.z.object({bindingId:o.z.string(),activeHttp:o.z.number().int().nonnegative(),activeStreams:o.z.number().int().nonnegative(),activeWebSockets:o.z.number().int().nonnegative()}).strict(),Ou=o.z.record(o.z.string(),o.z.unknown());function $u(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/control-plane-proxy/pending-claims/${encodeURIComponent(e)}`;return{status:e=>t("/api/control-plane/status",ju,{signal:e}),getSettings:e=>t("/api/control-plane/settings",tc,{signal:e}),updateSettings(e){const n=nc.parse(e);return t("/api/control-plane/settings",tc,$n("PATCH",n))},async exportDiagnosticLogs(){if(!e.requestBinary)throw function(){const e=new Error("This client transport cannot download binary responses.");return Object.assign(e,{code:"CLIENT_BINARY_UNSUPPORTED"}),e}();return e.requestBinary("/api/control-plane/diagnostic-logs/export")},cloudConnectivity:e=>t("/api/cloud-connectivity",Tu,{signal:e}),createCloudChallenge:()=>t("/api/cloud-connectivity/challenges",Eu,$n("POST",{})),setCloudRemoteAccess:e=>t("/api/cloud-connectivity/remote-access",Tu,$n("POST",{enabled:e})),disconnectCloud:()=>t("/api/cloud-connectivity/disconnect",Tu,$n("POST",{})),proxyInvites:e=>t("/api/control-plane-proxy/invites",o.z.array(Sa),{signal:e}),createProxyInvite(e){const n=Ca.parse(e);return t("/api/control-plane-proxy/invites",ka,$n("POST",n))},revokeProxyInvite:e=>t((e=>`/api/control-plane-proxy/invites/${encodeURIComponent(e)}`)(e),Sa,$n("DELETE")),proxyBindings:e=>t("/api/control-plane-proxy/bindings",o.z.array(Ra),{signal:e}),revokeProxyBinding:e=>t((e=>`/api/control-plane-proxy/bindings/${encodeURIComponent(e)}`)(e),Ra,$n("DELETE")),proxyDiagnostics:e=>t("/api/control-plane-proxy/diagnostics",o.z.array(Pu),{signal:e}),pendingProxyClaims:e=>t("/api/control-plane-proxy/pending-claims",o.z.array(Na),{signal:e}),resumeProxyClaim:e=>t(`${n(e)}/resume`,Ou,$n("POST",{})),cancelProxyClaim(e,i={}){const o=i.force?"?force=true":"";return t(`${n(e)}${o}`,Ou,$n("DELETE"))}}}function Nu(e){const t={request:(t,n,i,a)=>e.request(t,function(e){return o.z.unknown().transform((t,n)=>{const i=mi(e,t);if(i.success)return i.data;for(const e of i.error.issues)n.addIssue({...e});return o.z.NEVER})}(n),i,a),...e.requestBinary?{requestBinary:(t,n)=>e.requestBinary(t,n)}:{}};return{auth:ko(t),users:Ro(t),aiSessions:Dn(t),appSessions:ii(t),appProfiles:di(t),browser:li(t),resources:yc(t),triggers:vc(t),stories:Gm(t),agents:Xm(t),repository:nu(t),catalog:uu(t),nodeAdmin:fu(t),gitCredentials:vu(t),environmentTemplates:Au(t),chatGateway:ku(t),admin:$u(t)}}const _u=o.z.object({nodeId:o.z.string().optional(),instanceId:o.z.string().optional()}).passthrough(),Uu=o.z.object({v:o.z.literal(1),id:o.z.string().min(1),seq:o.z.number().finite(),type:o.z.string().min(1),topic:o.z.string().min(1),createdAt:o.z.string().datetime(),payload:o.z.unknown(),replay:o.z.literal(!0).optional(),scope:_u.optional()}).passthrough(),qu=o.z.object({v:o.z.literal("2026-08-25"),id:o.z.string().min(1),type:o.z.string().min(1),createdAt:o.z.string().datetime(),payload:o.z.unknown(),topic:o.z.string().min(1).optional(),replay:o.z.literal(!0).optional(),scope:_u.optional()}).passthrough(),Lu=o.z.discriminatedUnion("v",[Uu,qu]);o.z.object({v:o.z.literal(1),type:o.z.literal("ping"),sentAt:o.z.string().datetime()}).strict(),o.z.object({v:o.z.literal(1),type:o.z.literal("pong"),sentAt:o.z.string().datetime(),receivedAt:o.z.string().datetime()}).strict(),o.z.object({replaySince:o.z.string().datetime().optional(),messageDeltas:o.z.object({allInstances:o.z.boolean().default(!1),instanceIds:o.z.array(o.z.string().trim().min(1).max(160)).max(1e3).default([])}).default({allInstances:!1,instanceIds:[]}),timelineAllSessions:o.z.boolean().default(!1),timelineSessions:o.z.array(o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(120)})).max(1e3).default([])});const Du=o.z.enum(["ai.sessions","app.sessions"]),Mu=o.z.object({topic:Du,instanceId:o.z.string().trim().min(1).max(160),streamId:o.z.string().trim().min(1).max(240),latestRevision:o.z.number().int().min(0),earliestRetainedRevision:o.z.number().int().min(0)}).strict(),Bu=o.z.object({protocolVersion:o.z.literal(1),streams:o.z.array(Mu)}).strict();function Hu(e,n){try{const i=JSON.parse(t.readFileSync(e,"utf8"));if(n&&i.name!==n)return;return"string"==typeof i.version&&i.version.trim()?i.version.trim():void 0}catch{return}}function Fu(e){if(e)try{return i.dirname(t.realpathSync(e))}catch{return}}const Vu=function(e,t=process.env,n=e){const o=t.TASK_HANDOFF_VERSION?.trim();if(o)return o;const a=n.split("/").at(-1),r=process.argv[1]?i.resolve(process.argv[1]):void 0,s=r?i.dirname(r):void 0,d=[Fu(r),s,process.cwd()].filter(e=>Boolean(e));for(const t of new Set(d)){let n=t;for(;;){const t=Hu(i.join(n,"package.json"),e);if(t)return t;const o=i.dirname(n);if(o===n)break;n=o}}let c;for(const e of new Set(d)){let t=e;for(;;){if(a){const e=Hu(i.join(t,"packages",a,"package.json"),n);if(e)return e}c||=Hu(i.join(t,"package.json"));const e=i.dirname(t);if(e===t)break;t=e}}return c||"unknown"}("@task-handoff/thctl");function Gu(){const e="darwin"===process.platform||"linux"===process.platform||"win32"===process.platform?process.platform:"linux";return{name:n.hostname()||"thctl",platform:e,version:Vu}}const Yu=Buffer.from("302a300506032b6570032100","hex"),Wu=o.z.object({error:o.z.object({code:o.z.string().min(1),message:o.z.string().min(1),details:o.z.record(o.z.string(),o.z.unknown()).optional(),retryable:o.z.boolean().optional()}).loose()}).loose();function Ku(e,t){if(!t.startsWith("/")||t.startsWith("//"))throw z("Control Plane routes must be same-origin absolute paths.",{route:t});const n=new URL(t,e);if(n.origin!==e)throw z("A thctl request cannot leave its verified Control Plane origin.",{route:t,origin:e});return n.toString()}function Ju(e,t=Date.now()){const{payload:n,signature:i}=e.data,o=Date.parse(n.issuedAt),r=Date.parse(n.expiresAt);if(o>t+6e4||r<=t||r<=o)throw new m("CLI_IDENTITY_STALE","The Control Plane identity document is expired or its clock is invalid.",l);const s=Buffer.from(n.publicKey.value,"base64url");if(`sha256:${a.createHash("sha256").update(s).digest("base64url")}`!==n.publicKey.fingerprint)throw new m("CLI_IDENTITY_FINGERPRINT_INVALID","The Control Plane public key fingerprint is invalid.",l);let d;try{d=a.createPublicKey({key:Buffer.concat([Yu,s]),format:"der",type:"spki"})}catch{throw new m("CLI_IDENTITY_KEY_INVALID","The Control Plane public key is not a valid Ed25519 key.",l)}const c=Buffer.from((u=n,JSON.stringify(Gi.parse(u))),"utf8");var u;if(!a.verify(null,c,d,Buffer.from(i,"base64url")))throw new m("CLI_IDENTITY_SIGNATURE_INVALID","The Control Plane identity signature is invalid.",l);return n}function Zu(e){return{async request(t,n,i={}){let o=!1;for(;;){const a=new Headers(i.headers);a.set("accept","application/json");const r=e.sessionToken?.();let s;r&&a.set("authorization",`Bearer ${r}`);try{s=await e.fetchImpl(Ku(e.origin,t),{...i,headers:a,redirect:"error"})}catch(t){if(t instanceof m)throw t;throw h(`Could not reach ${e.origin}: ${t instanceof Error?t.message:String(t)}`,{origin:e.origin})}const d=await s.text().catch(()=>"");let c;if(d)try{c=JSON.parse(d)}catch{throw z("The Control Plane returned a non-JSON response.",{status:s.status,path:t})}if(!s.ok){const n=Wu.safeParse(c);if(401===s.status&&(e.onUnauthorized?.(),!o&&e.refreshCredential&&await e.refreshCredential())){o=!0;continue}if(!n.success){const e=(i.method??"GET").toUpperCase();if(404===s.status||405===s.status||501===s.status)throw g(s.status,e,t);throw I(s.status,`HTTP_${s.status}`,`Control Plane request failed with HTTP ${s.status}.`,{path:t})}const{code:a,message:r,details:d,retryable:l}=n.data.error;throw I(s.status,a,r,{...d,...void 0===l?{}:{retryable:l},path:t})}const l=n.safeParse(c);if(!l.success)throw z("The Control Plane response does not match the expected protocol schema.",{path:t,issues:l.error.issues.slice(0,5).map(e=>({path:e.path.join("."),code:e.code,message:e.message}))});return l.data}},async requestBinary(t,n={}){const i=new Headers(n.headers);i.set("accept","application/octet-stream, application/gzip, */*");const o=e.sessionToken?.();let a;o&&i.set("authorization",`Bearer ${o}`);try{a=await e.fetchImpl(Ku(e.origin,t),{...n,headers:i,redirect:"error"})}catch(t){if(t instanceof m)throw t;throw h(`Could not reach ${e.origin}: ${t instanceof Error?t.message:String(t)}`,{origin:e.origin})}if(!a.ok){if(404===a.status||405===a.status||501===a.status)throw g(a.status,(n.method??"GET").toUpperCase(),t);throw I(a.status,`HTTP_${a.status}`,`Control Plane request failed with HTTP ${a.status}.`,{path:t})}const r=a.headers.get("content-disposition")??"",s=/filename\*?=(?:UTF-8''|")?([^";]+)/i.exec(r)?.[1];return{body:new Uint8Array(await a.arrayBuffer()),...s?{filename:decodeURIComponent(s)}:{},...a.headers.get("content-type")?{contentType:a.headers.get("content-type")}:{}}}}}async function Qu(e,t){const n=Nu(Zu({origin:e,fetchImpl:t}));let i;try{i=await n.auth.identity()}catch(t){if(t instanceof m&&(7===t.exitCode||"CLI_ROUTE_MISSING"===t.code))throw new m("CLI_IDENTITY_UNAVAILABLE",`${e} did not return a Control Plane identity document. Check the address and that the Control Plane is running.`,l);throw t}return{payload:Ju(i),origin:e}}function Xu(e){try{const t=new URL(e);return"http:"===t.protocol&&("127.0.0.1"===t.hostname||"localhost"===t.hostname||"[::1]"===t.hostname)}catch{return!1}}async function ep(e){const{profile:t,identity:n,fetchImpl:i,secrets:o}=e;if(!Vi(n.payload.capabilities))return;if(!Xu(t.origin))return;const a=Nu(Zu({origin:t.origin,fetchImpl:i})),r=await a.auth.cliLocalSession({client:Gu()}),s={sessionToken:r.sessionToken,sessionId:r.session.id,expiresAt:r.session.expiresAt,mode:"local-trust",savedAt:(new Date).toISOString()};return o.write(t.label,s),s}async function tp(e){const{store:t,profile:n,fetchImpl:i}=e,o=await Qu(n.origin,i);!function(e,t){const{payload:n}=t;if(e.origin!==t.origin)throw new m("CLI_PROFILE_ORIGIN_CHANGED",`Profile \`${e.label}\` points at ${e.origin}, not ${t.origin}.`,l);if(e.controlPlaneId!==n.controlPlaneId||e.fingerprint!==n.publicKey.fingerprint)throw new m("CLI_IDENTITY_CHANGED",`The Control Plane identity for \`${e.label}\` changed. Run \`thctl profile trust ${e.label} --yes\` after verifying the new fingerprint ${n.publicKey.fingerprint}.`,l,{profile:e.label,expectedControlPlaneId:e.controlPlaneId,expectedFingerprint:e.fingerprint,actualControlPlaneId:n.controlPlaneId,actualFingerprint:n.publicKey.fingerprint})}(n,o),function(e,t){const n=t.payload.capabilities;if(!(function(e){return!0===Hi(e)?.cliSessions}(n)||Vi(n)&&Xu(e.origin))){if(Vi(n))throw new m("CLI_LOCAL_SESSION_UNAVAILABLE_REMOTE",`${e.origin} runs with Control Plane authentication disabled and only issues CLI sessions to clients on the same machine. Run thctl on that machine, or enable user management to sign in with \`thctl login\`.`,14,{profile:e.label,origin:e.origin,protocolVersion:t.payload.protocolVersion});throw new m("CLI_CAPABILITY_MISSING",`The Control Plane at ${e.origin} does not declare the \`cliSessions\` capability. Upgrade it to the release that ships the Control Plane CLI endpoints.`,14,{profile:e.label,origin:e.origin,protocolVersion:t.payload.protocolVersion})}}(n,o);const a=t.secrets();let r=!1===e.withSession?void 0:a.read(n.label);r?.expiresAt&&Date.parse(r.expiresAt)<=Date.now()&&(a.remove(n.label),r=void 0);let s=!1;if(!1===e.withSession||r||(r=await ep({profile:n,identity:o,fetchImpl:i,secrets:a}),s=Boolean(r)),!1!==e.withSession&&!r)throw new m("CLI_NOT_AUTHENTICATED",`No CLI session stored for \`${n.label}\`. Run \`thctl login\`.`,5,{profile:n.label});const d="local-trust"===r?.mode,c=Zu({origin:n.origin,fetchImpl:i,sessionToken:r?()=>a.read(n.label)?.sessionToken:void 0,onUnauthorized:r?()=>a.remove(n.label):void 0,...d?{refreshCredential:async()=>{a.remove(n.label);const e=await ep({profile:n,identity:o,fetchImpl:i,secrets:a});return Boolean(e)}}:{}}),u=function(e,t){const n=t.payload.protocolVersion,i=t.payload.capabilities;if(!(e.protocolVersion!==n||JSON.stringify(e.capabilities??null)!==JSON.stringify(i??null)))return e;const o=(new Date).toISOString();return{...e,protocolVersion:n,capabilities:i,lastUsedAt:o,updatedAt:o}}(n,o),p=Nu(c);if("local-trust"===r?.mode&&!s){const e=await p.auth.session();e.authenticated&&e.user||await ep({profile:n,identity:o,fetchImpl:i,secrets:a})}return{profile:u,identity:o,client:p,store:t}}var np,ip,op=function(){if(ip)return np;ip=1;const e=t,{spawnSync:n}=s;return np={processStartIdentity:function(t,i=process.platform){if(Number.isInteger(t)&&!(t<=0)){if("linux"===i)try{const n=e.readFileSync(`/proc/${t}/stat`,"utf8"),i=n.lastIndexOf(")");if(i<0)return;const o=n.slice(i+2).trim().split(/\s+/)[19];return o?`linux:${o}`:void 0}catch{return}if(["darwin","freebsd","openbsd","aix","sunos"].includes(i)){const e=n("ps",["-o","lstart=","-p",String(t)],{encoding:"utf8",timeout:1e3}),o=0===e.status?e.stdout.trim().replace(/\s+/g," "):"";return o?`${i}:${o}`:void 0}if("win32"===i){const e=n("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-Process -Id ${t} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks`],{encoding:"utf8",timeout:2e3}),i=0===e.status?e.stdout.trim():"";return/^\d+$/.test(i)?`win32:${i}`:void 0}}}}}();function ap(e){return Number.isInteger(e)&&Number(e)>0}const rp="local";function sp(e=process.env){const t=e.TASK_HANDOFF_CONTROL_PLANE_LOCK_PATH?.trim();return t?i.resolve(t):i.join(n.tmpdir(),`task-handoff-control-plane-${process.getuid?.()??"user"}.lock`)}const dp=new Set(["127.0.0.1","localhost","::1","[::1]"]),cp=new Set(["0.0.0.0","::","[::]"]);async function lp(e){const o=sp(e.env),a=function(e){try{const o=JSON.parse(t.readFileSync(function(e){return i.join(e,"owner.json")}(e),"utf8"));if(ap(o.pid)&&"string"==typeof o.startTime){const e=o;return{pid:e.pid,hostname:"string"==typeof e.hostname&&e.hostname?e.hostname:n.hostname(),component:e.component||"server-update",command:"string"==typeof e.command?e.command:"",acquiredAt:"string"==typeof e.createdAt&&Number.isFinite(Date.parse(e.createdAt))?e.createdAt:new Date(0).toISOString(),token:"string"==typeof e.token&&e.token?e.token:`legacy:${e.pid}:${e.startTime}`,startIdentity:e.startTime.startsWith("linux:")?e.startTime:`linux:${e.startTime}`}}if(!(ap(o.pid)&&"string"==typeof o.hostname&&o.hostname&&"string"==typeof o.command&&"string"==typeof o.acquiredAt&&Number.isFinite(Date.parse(o.acquiredAt))&&"string"==typeof o.token&&o.token))return;return o}catch{return}}(o);if(!a)return;if(a.component&&"control-plane"!==a.component)return;if(!function(e){if(!e||!function(e){if(!ap(e))return!1;try{return process.kill(Number(e),0),!0}catch(e){return"EPERM"===e.code}}(e.pid))return!1;if(!e.startIdentity)return!0;const t=op.processStartIdentity(e.pid);return void 0===t||t===e.startIdentity}(a))return;const r=function(e){const t=e.port;if(!Number.isInteger(t)||t<1||t>65535)return;const n=e.host?.trim().toLowerCase();if(!n||!dp.has(n)&&!cp.has(n))return;const i=n.startsWith("[")&&n.endsWith("]")?n.slice(1,-1):n;return`http://${dp.has(n)?i.includes(":")?`[${i}]`:i:"127.0.0.1"}:${t}`}(a);if(r)try{return{origin:r,identity:await Qu(r,e.fetchImpl),lockPath:o,...a.dataDir?{dataDir:a.dataDir}:{}}}catch{return}}function mp(e,t){const{origin:n,identity:i}=t,o=e.findByOrigin(n);if(o)return o;const a=(new Date).toISOString(),r=e.list().find(e=>"local-discovery"===e.source);if(r){const t=r.controlPlaneId!==i.payload.controlPlaneId||r.fingerprint!==i.payload.publicKey.fingerprint;return e.save({...r,origin:n,controlPlaneId:i.payload.controlPlaneId,fingerprint:i.payload.publicKey.fingerprint,protocolVersion:i.payload.protocolVersion,capabilities:i.payload.capabilities,updatedAt:a,lastUsedAt:a,...t?{trustedAt:a,identityChangedAt:a,replacedFingerprint:r.fingerprint}:{}})}const s=function(e,t){if(!e.get(rp))return rp;const n=R(t);let i=n,o=2;for(;e.get(i);)i=`${n}-${o++}`;return i}(e,n),d=w.parse({label:s,origin:n,controlPlaneId:i.payload.controlPlaneId,fingerprint:i.payload.publicKey.fingerprint,protocolVersion:i.payload.protocolVersion,capabilities:i.payload.capabilities,source:"local-discovery",createdAt:a,updatedAt:a,trustedAt:a,lastUsedAt:a}),c=e.save(d);return e.defaultProfile()||e.setDefault(c.label),c}const up=/(token|secret|password|passwd|credential|credentials|apikey|privatekey)$/i,pp=new Set(["key","token","secret","password","credentials","credential"]);function gp(e){return pp.has(e.toLowerCase())||up.test(e)}const zp=new Set;function hp(e){if("string"!=typeof e)return;const t=e.trim();t.length>=4&&zp.add(t)}function yp(e){let t=e;for(const e of zp)t=t.split(e).join("***");return t}function fp(e){return Ip(e)}function Ip(e){if("string"==typeof e)return yp(e);if(Array.isArray(e))return e.map(Ip);if(!e||"object"!=typeof e)return e;const t={};for(const[n,i]of Object.entries(e))t[n]=gp(n)?"***":Ip(i);return t}function bp(e){if(Array.isArray(e))for(const t of e)bp(t);else if(e&&"object"==typeof e)for(const[t,n]of Object.entries(e))gp(t)?hp(n):bp(n)}async function wp(e){const t=r.createInterface({input:process.stdin,output:process.stderr});try{const n=await t.question(`${e} [y/N] `);return/^y(es)?$/i.test(n.trim())}finally{t.close()}}async function vp(e,t){const n=e.profile?.trim()||e.env[b]?.trim();if(n)return e.store.select(n,e.env);if(e.store.list().length>0)return e.store.select(void 0,e.env);const i=await lp({env:e.env,fetchImpl:e.fetchImpl});if(i)return mp(e.store,i);throw new m("CLI_PROFILE_MISSING",`No Control Plane profile configured and no local Control Plane was detected (lock: ${sp(e.env)}). Start the desktop Control Plane or run \`thctl profile add <origin>\`.`,7)}async function xp(e,t={}){let n,i=t.profile??await vp(e);try{n=await Ap(e,i,t.withSession)}catch(o){const a=await async function(e,t,n){if("local-discovery"!==t.source)return;if(!(n instanceof m&&["CLI_NETWORK_ERROR","CLI_IDENTITY_UNAVAILABLE"].includes(n.code)))return;const i=await lp({env:e.env,fetchImpl:e.fetchImpl});return i&&i.origin!==t.origin?mp(e.store,i):void 0}(e,i,o);if(!a)throw o;i=a,n=await Ap(e,i,t.withSession)}return function(e,t){const n=e.get(t.label);n&&n.updatedAt===t.updatedAt||e.save(t)}(e.store,n.profile),!1!==t.withSession&&await async function(e,t){const n=e.store.secrets(),i=n.read(t.profile.label);if(!i?.expiresAt)return;if("local-trust"===i.mode)return;const o=Date.parse(i.expiresAt)-Date.now();if(!Number.isFinite(o)||o>Sp)return;const a=await t.client.auth.renewCliSession();n.write(t.profile.label,{...i,expiresAt:a.expiresAt,savedAt:(new Date).toISOString()})}(e,n),n}function Ap(e,t,n){return tp({store:e.store,profile:t,fetchImpl:e.fetchImpl,...void 0===n?{}:{withSession:n}})}const Sp=6048e5;async function Cp(e,t,n,i){const o=n(),a=o.steps??[o];if(!e.dryRun){for(const e of a)bp(e.body);return await async function(e,t,n){if(e.yes)return!0;if(!e.isTty)throw function(e){return new m("CLI_CONFIRMATION_REQUIRED",`\`${e}\` changes remote state. Re-run with --yes to confirm, or --dry-run to preview the request.`,4,{command:e})}(t);if(!await e.confirm(n))throw new m("CLI_CANCELLED","The operation was cancelled.",15);return!0}(e,t,1===a.length?`${o.method} ${o.path} — continue?`:`${a.length} requests will be sent (${a.map(e=>`${e.method} ${e.path}`).join(", ")}) — continue?`),i()}e.output.data(1===a.length?{dryRun:!0,method:o.method,path:o.path,...void 0===o.body?{}:{body:fp(o.body)}}:{dryRun:!0,steps:a.map(e=>({method:e.method,path:e.path,...void 0===e.body?{}:{body:fp(e.body)}}))})}function kp(e,t){const n=e.args[t]?.trim();if(!n)throw u("CLI_ARGUMENT_MISSING",`Missing required argument <${t}>.`,{argument:t});return n}function jp(e,t){const n=e.options[t];if("string"==typeof n)return n.trim()||void 0}function Rp(e,t){const n=jp(e,t);if(!n)throw u("CLI_OPTION_MISSING",`Missing required option --${t}.`,{option:t});return n}function Tp(e,t){const n=e.options[t];return Array.isArray(n)?n.filter(e=>"string"==typeof e).map(e=>e.trim()).filter(Boolean):[]}function Ep(e,t,n){const i=e.safeParse(t);if(!i.success)throw u("CLI_INVALID_INPUT",`${n} does not match the expected schema.`,{issues:i.error.issues.map(e=>({path:e.path.join("."),message:e.message}))});return i.data}function Pp(e,n,i){let o,a;try{o=t.readFileSync(e,"utf8")}catch(t){throw u("CLI_FILE_UNREADABLE",`Cannot read ${i} \`${e}\`: ${t instanceof Error?t.message:String(t)}`,{file:e})}try{a=JSON.parse(o)}catch(t){throw u("CLI_FILE_INVALID_JSON",`${i} \`${e}\` is not valid JSON: ${t instanceof Error?t.message:String(t)}`,{file:e})}return Ep(n,a,`${i} \`${e}\``)}function Op(e,t){if("not-modified"===e.kind)throw z(`AI session \`${t}\` is unchanged at revision ${e.revision}; no projection is available locally.`,{sessionId:t,revision:e.revision});return e.detail}function $p(e,t="request body"){const n=Rp(e,"config"),i=Pp(n,o.z.unknown(),t);if(!i||"object"!=typeof i||Array.isArray(i))throw u("CLI_INVALID_INPUT",`${t} \`${n}\` must be a JSON object.`,{file:n});return i}async function Np(e){if(!0!==e.options.tokenStdin)throw u("CLI_TOKEN_STDIN_REQUIRED","Provide the secret on stdin and re-run with --token-stdin.");const t=[];let n=0;for await(const e of process.stdin){const i=Buffer.isBuffer(e)?e:Buffer.from(String(e));if(n+=i.length,n>1048576)throw u("CLI_TOKEN_STDIN_TOO_LARGE","The secret on stdin is too large.");t.push(i)}const i=Buffer.concat(t).toString("utf8").trim();if(!i)throw u("CLI_TOKEN_STDIN_EMPTY","No secret was provided on stdin.");return hp(i),i}const _p=[{key:"instanceId",header:"instance"},{key:"id",header:"session"},{key:"agent",header:"agent"},{key:"status",header:"status"},{key:"phase",header:"phase"},{key:"title",header:"title",width:40},{key:"updatedAt",header:"updated"}],Up=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(t)}`;function qp(e){return e.map(e=>"activity"===e.type?{type:e.activityKind,turn:e.turnId,title:e.title,detail:e.output??e.summary??e.input??""}:{type:e.type,turn:e.turnId,title:"",detail:e.text})}const Lp=[{key:"type",header:"type"},{key:"turn",header:"turn",width:40},{key:"title",header:"title",width:24},{key:"detail",header:"detail",width:60}];function Dp(e,t){return async(n,i)=>{const o=kp(i,"instanceId"),a=kp(i,"sessionId"),r=kp(i,"queueId"),s=await xp(n),d=await Cp(n,e,()=>"remove"===t?{method:"DELETE",path:`${Up(o,a)}/queue/${encodeURIComponent(r)}`}:{method:"POST",path:`${Up(o,a)}/queue/${encodeURIComponent(r)}/${t}`},async()=>"steer"===t?await s.client.aiSessions.steerQueue(o,a,r):"retry"===t?await s.client.aiSessions.retryQueue(o,a,r):await s.client.aiSessions.removeQueue(o,a,r));if(d)return{data:d,message:`Queued message \`${r}\` ${"remove"===t?"removed":`${t} requested`}.`}}}const Mp=Dp("ai-session queue steer","steer"),Bp=Dp("ai-session queue retry","retry"),Hp=Dp("ai-session queue remove","remove");async function Fp(e,t,n,i,o){const a=jp(o,"expected-revision");if(void 0!==a){const e=Number(a);if(!Number.isInteger(e)||e<0)throw new m("CLI_INVALID_OPTION","--expected-revision must be a non-negative integer.",2,{option:"expected-revision",value:a});return e}const r=Op(await t.client.aiSessions.detail(n,i,void 0,e.signal),i);return r.queue?.revision??0}const Vp=[{key:"instanceId",header:"instance"},{key:"id",header:"app session"},{key:"appId",header:"app"},{key:"title",header:"title",width:30},{key:"kind",header:"kind"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],Gp=o.z.string().trim().min(1).max(120),Yp=[{key:"mode",header:"mode"},{key:"url",header:"url"},{key:"expiresAt",header:"expires"},{key:"token",header:"token"}],Wp=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(t)}`;function Kp(e,t=Math.random){const n=Math.max(1,Math.floor(e));if(1===n)return 0;if(2===n)return 250;const i=Math.min(6e4,250*2**(n-2));return Math.min(6e4,Math.round(i*(.75+.5*t())))}class Jp{retryNumber=0;random;constructor(e=Math.random){this.random=e}get attempts(){return this.retryNumber}next(){return this.retryNumber+=1,{attempt:this.retryNumber,delay:Kp(this.retryNumber,this.random)}}reset(){this.retryNumber=0}}const Zp=({url:e,authorization:t,handlers:n})=>{const i=new d(e,{headers:{authorization:t}});return i.on("open",()=>n.opened()),i.on("message",e=>n.message(function(e){return"string"==typeof e?e:Buffer.isBuffer(e)?e.toString("utf8"):Array.isArray(e)?Buffer.concat(e).toString("utf8"):e instanceof ArrayBuffer?Buffer.from(e).toString("utf8"):String(e)}(e))),i.on("close",(e,t)=>n.closed({code:e,reason:t?.toString("utf8")??""})),i.on("error",e=>n.failed(e instanceof Error?e:new Error(String(e)))),i.on("unexpected-response",(e,t)=>{const i=t.statusCode??0;t.resume(),n.rejected(i)}),{send:e=>i.send(e),close:(e,t)=>{try{i.close(e,t)}catch{}}}},Qp={"ai-sessions":"ai.sessions","app-sessions":"app.sessions"};function Xp(e,t){const n=new URL(Ku(e,"/api/events"));return n.protocol="https:"===n.protocol?"wss:":"ws:",n.searchParams.set("aiSessionTransient","1"),n.searchParams.set("resourceMetricsScope","1"),t&&n.searchParams.set("instanceId",t),n.toString()}function eg(e){return`${e.code}${e.reason?`: ${e.reason}`:""}`}async function tg(e,t){if(e.signal.aborted)return;const n=e.createEventSocket??Zp,i=function(e){return{v:1,type:"subscribe",topics:[...e.topics],...e.instanceId?{instanceIds:[e.instanceId]}:{},metricInstanceIds:[],aiSessionTransient:{messageDeltas:{allInstances:!1,instanceIds:[]},timelineAllSessions:!1,timelineSessions:[]},aiSessionHierarchy:{subagents:!0}}}(t);await new Promise((o,a)=>{const r=new Set,s=new Jp;let d,c,l,u=!1,p=!1;const g=()=>{c&&clearInterval(c),c=void 0},y=t=>{if(p)return;p=!0,e.signal.removeEventListener("abort",f),g(),l&&clearTimeout(l),l=void 0;const n=d;d=void 0,n?.socket.close(1e3,"thctl stopped the event stream."),t?a(t):o()},f=()=>y(),b=(t,n)=>{if(!p&&d===t){d=void 0,g();try{t.socket.close(1e3,n.error?"thctl stopped the event stream.":"thctl is reconnecting the event stream.")}catch{}n.error?y(n.error):(n.warning&&e.output.warn(n.warning),(()=>{if(p||l)return;const{attempt:t,delay:n}=s.next();e.output.warn(`Event stream disconnected; reconnecting (attempt ${t}, in ${n}ms).`),l=setTimeout(()=>{l=void 0,w()},n)})())}},w=()=>{if(p)return;const o={socket:void 0,authoritative:!1};o.socket=n({url:t.url,authorization:t.authorization,handlers:{opened:()=>{p||d!==o||(o.socket.send(JSON.stringify(i)),g(),c=setInterval(()=>{if(!p&&d===o)try{o.socket.send(JSON.stringify({v:1,type:"ping",sentAt:(new Date).toISOString()}))}catch{}},2e4))},message:n=>{p||d!==o||((n,i)=>{const o=function(e){try{const t=JSON.parse(e);if(!t||"object"!=typeof t||Array.isArray(t))return;return t}catch{return}}(i);if(!o)return void e.output.warn("Ignoring an unreadable event frame.");if("pong"===o.type)return;if("streams.hello"===o.type)return Bu.safeParse(o.payload).success?(n.authoritative=!0,u=!0,void s.reset()):void y(z("The Control Plane sent an incompatible session stream handshake.",{url:t.url}));if(!n.authoritative)return;const a="string"==typeof o.id?o.id:void 0;if(a){if(r.has(a))return;if(r.add(a),r.size>1e4){const e=r.values().next().value;void 0!==e&&r.delete(e)}}e.output.streams.stdout(`${JSON.stringify(o)}\n`)})(o,n)},closed:e=>{p||d!==o||(4003!==e.code?1002!==e.code?o.authoritative?b(o,{warning:`Event stream closed (code ${eg(e)}).`}):b(o,{error:h(`The Control Plane closed the event stream before the session-stream handshake (code ${eg(e)}).`,{url:t.url,closeCode:e.code})}):b(o,{error:z("The Control Plane closed the event stream because the protocol is incompatible.",{url:t.url,closeCode:e.code})}):b(o,{error:new m("CLI_EVENT_STREAM_SCOPE_NOT_VISIBLE","The requested event scope is not visible to this account.",6,{url:t.url,closeCode:e.code})}))},failed:e=>{p||d!==o||b(o,u?{warning:`Event stream error: ${e.message}`}:{error:h(`Could not open the event stream at ${t.url}: ${e.message}`,{url:t.url})})},rejected:e=>{if(p||d!==o)return;const n=function(e,t){return 401===e?(t.onUnauthorized?.(),{fatal:!0,error:new m("CLI_EVENT_STREAM_UNAUTHORIZED","The Control Plane rejected the event stream credential (HTTP 401). Run `thctl login` to authorize this CLI again.",5,{url:t.url,status:e})}):403===e?{fatal:!0,error:new m("CLI_EVENT_STREAM_FORBIDDEN","The Control Plane refused the event stream (HTTP 403).",6,{url:t.url,status:e})}:{fatal:!1,error:I(e,"CLI_EVENT_STREAM_UPGRADE_FAILED",`The Control Plane refused the event stream (HTTP ${e}).`,{url:t.url})}}(e,t);!n.fatal&&u?b(o,{warning:`${n.error.message} Retrying.`}):b(o,{error:n.error})}}}),d=o};e.signal.addEventListener("abort",f,{once:!0}),w()})}function ng(e){const t=e.args.instanceId?.trim();if(!t)throw new m("CLI_ARGUMENT_MISSING","Missing required argument <instanceId>.",2);return t}const ig=[{key:"id",header:"instance"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"health",header:"health"},{key:"connectionStatus",header:"connection"},{key:"nodeId",header:"node"},{key:"runtime.type",header:"runtime"},{key:"workspace.status",header:"workspace"},{key:"aiSessions.runningCount",header:"running"}];function og(e){return async(t,n)=>{const i=ng(n),o=await xp(t),a=await Cp(t,`instance ${e} ${i}`,()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(i)}/${e}`,body:{}}),()=>o.client.resources.instanceAction(i,e));if(a)return{data:a,columns:[{key:"id",header:"instance"},{key:"status",header:"status"}],message:`Instance \`${i}\` is ${a.status}.`}}}const ag=og("start"),rg=og("stop"),sg=og("restart"),dg=[{key:"id",header:"instance"},{key:"name",header:"name",width:24},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"startOutcome.status",header:"start"}],cg=[{key:"instanceId",header:"instance"},{key:"containerDeleted",header:"container"},{key:"completed",header:"completed"}],lg=[{key:"id",header:"model"},{key:"model.name",header:"name",width:24},{key:"model.model",header:"model id",width:30},{key:"model.app",header:"app"},{key:"model.protocols",header:"protocols",width:20},{key:"model.enabled",header:"enabled"},{key:"locations",header:"locations",width:30}],mg=[{key:"id",header:"node"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"health",header:"health"},{key:"connectionMode",header:"connection"},{key:"lastSeenAt",header:"last seen"},{key:"capabilities",header:"capabilities",width:30}];function ug(e){return e.map(e=>({...e,capabilities:Array.isArray(e.capabilities)?e.capabilities.join(","):"",lastSeenAt:"string"==typeof e.lastSeenAt?e.lastSeenAt:""}))}function pg(e,t){if("string"!=typeof e||!e.trim())throw new m("CLI_ARGUMENT_MISSING",`Missing required argument <${t}>.`,2);return e.trim()}function gg(e,t){return`<!doctype html><html lang="en"><head><meta charset="utf-8"><title>${e}</title></head><body style="font-family:system-ui,sans-serif;margin:0;display:grid;place-items:center;min-height:100vh;background:#0b0b0c;color:#f5f5f5"><main style="max-width:32rem;padding:2rem;text-align:center"><h1 style="font-size:1.1rem;font-weight:500">${e}</h1><p style="color:#a1a1aa;font-size:.9rem">${t}</p></main></body></html>`}function zg(e){const t="darwin"===process.platform?"open":"win32"===process.platform?"cmd":"xdg-open",n="win32"===process.platform?["/c","start","",e]:[e];return new Promise((e,i)=>{const o=s.spawn(t,n,{stdio:"ignore",detached:"win32"!==process.platform});o.once("error",i),o.once("spawn",()=>{o.unref(),e()})})}async function hg(e){const t=e.store.select(e.profileLabel);return tp({store:e.store,profile:t,fetchImpl:e.fetchImpl,withSession:!1})}async function yg(e,t,n){e.store.secrets().write(e.profile.label,{sessionToken:t.sessionToken,sessionId:t.session.id,expiresAt:t.session.expiresAt,mode:"authorization",savedAt:(new Date).toISOString()}),e.store.save({...e.profile,loginMode:n,lastUsedAt:(new Date).toISOString(),updatedAt:(new Date).toISOString()})}async function fg(e){const{store:t,fetchImpl:n,output:i}=e,o=await hg({store:t,profileLabel:e.profileLabel,fetchImpl:n}),r=await async function(){let e;for(let t=0;t<5;t+=1){const t=c.createServer();try{await new Promise((e,n)=>{t.once("error",n),t.listen(0,"127.0.0.1",()=>{t.off("error",n),e()})})}catch(n){e=n,t.close();continue}const n=t.address();if(!n||"string"==typeof n){t.close(),e=new Error("Loopback callback did not expose a TCP port.");continue}let i=()=>{},o=()=>{};const a=new Promise((e,t)=>{i=e,o=t});a.catch(()=>{});let r=!1;return t.on("request",(e,t)=>{const a=new URL(e.url||"/",`http://127.0.0.1:${n.port}`);if("/callback"!==a.pathname)return t.writeHead(404,{"content-type":"text/plain; charset=utf-8"}),void t.end("Not found");const s=a.searchParams.get("code")||"",d=a.searchParams.get("state")||"",c=a.searchParams.get("error")||"";return t.writeHead(200,{"content-type":"text/html; charset=utf-8"}),c?(t.end(gg("Authorization failed",`The Control Plane reported ${c}. Return to the terminal and try again.`)),void(r||(r=!0,o(new m("CLI_AUTHORIZATION_FAILED",`The Control Plane rejected the CLI authorization: ${c}.`,5))))):s&&d?(t.end(gg("Authorization complete","You can close this tab and return to the terminal.")),void(r||(r=!0,i({code:s,state:d})))):(t.end(gg("Authorization failed","The callback did not include a usable authorization code. Return to the terminal and try again.")),void(r||(r=!0,o(z("The loopback callback did not include a code and state.")))))}),{port:n.port,redirectUri:`http://127.0.0.1:${n.port}/callback`,waitForCode:a,close:()=>{r||(r=!0,o(new m("CLI_LOGIN_CANCELLED","The CLI login was cancelled.",15))),t.close(),t.closeAllConnections?.()}}}throw new m("CLI_LOOPBACK_UNAVAILABLE",`Could not bind a local callback port (${e instanceof Error?e.message:String(e)}). Retry with \`thctl login --device\` to authorize from another device.`,10)}(),{verifier:s,challenge:d}=function(){const e=a.randomBytes(32).toString("base64url");return{verifier:e,challenge:a.createHash("sha256").update(e).digest("base64url")}}(),u=a.randomBytes(24).toString("base64url");try{const t=await o.client.auth.cliAuthorize({mode:"browser",client:Gu(),redirectUri:r.redirectUri,state:u,codeChallenge:d,codeChallengeMethod:"S256"});if("browser"!==t.mode)throw z("The Control Plane returned a device authorization for a browser request.");i.message(`Open this URL to approve the CLI session:\n${t.verificationUri}`);try{await(e.openUrl??zg)(t.verificationUri)}catch{i.warn("Could not open a browser automatically; open the URL above manually.")}const n=e.loginTimeoutMs??6e5,a=await function(e,t){return new Promise((n,i)=>{const o=setTimeout(()=>i(new m("CLI_LOGIN_TIMEOUT","Timed out waiting for the browser authorization.",15)),t);o.unref?.(),e.then(e=>{clearTimeout(o),n(e)},e=>{clearTimeout(o),i(e)})})}(r.waitForCode,n);if(a.state!==u)throw new m("CLI_LOGIN_STATE_MISMATCH","The browser callback state did not match this login attempt. The authorization code was discarded.",l);const c=await o.client.auth.cliToken({grantType:"authorization_code",requestId:t.requestId,code:a.code,codeVerifier:s});return await yg(o,c,"browser"),{profile:o.profile,session:c.session}}finally{r.close()}}function Ig(e){const t=(e.args??[]).map(e=>e.required?`<${e.name}>`:`[${e.name}]`);return["thctl",e.id,...t].join(" ")}function bg(e){return{id:e.id,group:e.group,summary:e.summary,stage:e.stage,implemented:Boolean(e.handler),write:Boolean(e.write),usage:Ig(e),arguments:(e.args??[]).map(e=>({...e,required:Boolean(e.required),variadic:Boolean(e.variadic)})),options:e.options??[],examples:e.examples??[],inputSchema:o.z.toJSONSchema(e.input,{io:"input",unrepresentable:"any"}),outputSchema:o.z.toJSONSchema(e.output,{io:"output",unrepresentable:"any"}),outputPinned:!1!==e.outputPinned,outputMode:e.outputMode??"document"}}function wg(e){const t=[];if(t.push(`### \`${e.id}\``,"",e.summary,""),t.push(`- stage: ${e.stage}`,"- implemented: "+(e.implemented?"yes":"no"),"- write: "+(e.write?"yes":"no"),`- usage: \`${e.usage}\``,""),e.arguments.length){t.push("| argument | required | description |","| --- | --- | --- |");for(const n of e.arguments)t.push(`| \`${n.name}\` | ${n.required?"yes":"no"} | ${n.description} |`);t.push("")}if(e.options.length){t.push("| option | description |","| --- | --- |");for(const n of e.options)t.push(`| \`${n.flags}\` | ${n.description} |`);t.push("")}return e.examples.length&&t.push("Examples:","",...e.examples.map(e=>`- \`${e}\``),""),t.push("Input JSON Schema:","","```json",JSON.stringify(e.inputSchema,null,2),"```",""),t.push("Output JSON Schema:","","```json",JSON.stringify(e.outputSchema,null,2),"```",""),t.join("\n")}const vg=[{key:"id",header:"story"},{key:"title",header:"title",width:30},{key:"ownerNodeId",header:"node"},{key:"documents",header:"docs"},{key:"archivedAt",header:"archived"},{key:"updatedAt",header:"updated"}],xg=[{key:"id",header:"run"},{key:"eventType",header:"event"},{key:"status",header:"status"},{key:"scheduledFor",header:"scheduled"},{key:"aiSessionId",header:"session"},{key:"startedAt",header:"started"}];function Ag(e,t){return e.output.json?{data:t}:{data:Sg([t])[0],columns:vg}}function Sg(e){return e.map(e=>({...e,documents:Array.isArray(e.documents)?`${e.documents.length}`:"0",archivedAt:"string"==typeof e.archivedAt?e.archivedAt:""}))}async function Cg(e,t,n){if(n)return n;const i=await e.client.stories.list(),o=i.stories.find(e=>e.id===t);if(!o)throw new m("CLI_STORY_NOT_FOUND",`No story \`${t}\` is visible in the authoritative directory${i.unavailableNodeIds.length?` (unavailable nodes: ${i.unavailableNodeIds.join(", ")})`:""}.`,7,{storyId:t,unavailableNodeIds:i.unavailableNodeIds});return o.ownerNodeId}function kg(e){return async(t,n)=>{const i=kp(n,"storyId"),o=await xp(t),a=await Cg(o,i,jp(n,"node"));if("remove"===e){const e=await Cp(t,"story remove",()=>({method:"DELETE",path:`/api/stories/${encodeURIComponent(i)}?nodeId=${encodeURIComponent(a)}`}),()=>o.client.stories.remove(i,a));if(!e)return;if(!e.deleted)throw new m("CLI_STORY_NOT_REMOVED",`Story \`${i}\` was not removed.`,8,{storyId:i});return{data:e,message:`Story \`${i}\` removed.`}}const r=await Cp(t,`story ${e}`,()=>({method:"POST",path:`/api/stories/${encodeURIComponent(i)}/${e}`,body:{nodeId:a}}),()=>"archive"===e?o.client.stories.archive(i,a):o.client.stories.restore(i,a));if(r)return{...Ag(t,r),message:`Story \`${i}\` ${"archive"===e?"archived":"restored"}.`}}}const jg=kg("archive"),Rg=kg("restore"),Tg=kg("remove"),Eg=[{key:"automation.id",header:"automation"},{key:"automation.enabled",header:"enabled"},{key:"effectiveStatus",header:"status"},{key:"automation.actionId",header:"action"},{key:"nextRunAt",header:"next run"}];function Pg(e,t){return e.output.json?{data:t}:{data:t,columns:Eg}}const Og=Nc.omit({storyId:!0});function $g(e){return async(t,n)=>{const i=kp(n,"storyId"),o=kp(n,"automationId"),a=await xp(t),r=await Cg(a,i,jp(n,"node")),s=await Cp(t,e?"story automation enable":"story automation disable",()=>({method:"POST",path:`/api/stories/${encodeURIComponent(i)}/automations/${encodeURIComponent(o)}/${e?"enable":"disable"}`,body:{nodeId:r}}),()=>a.client.stories.setAutomationEnabled(i,o,r,e));if(s)return{data:s,message:`Automation \`${o}\` ${e?"enabled":"disabled"}.`}}}const Ng=$g(!0),_g=$g(!1);function Ug(e,t){const n=Number(e);if(!Number.isInteger(n)||n<0)throw u("CLI_INVALID_OPTION",`--${t} must be a non-negative integer.`,{option:t,value:e});return n}const qg=[{key:"configHash",header:"trigger"},{key:"config.name",header:"name",width:24},{key:"config.source.type",header:"source"},{key:"deploymentCount",header:"deployments"},{key:"enabledCount",header:"enabled"},{key:"runningCount",header:"running"},{key:"errorCount",header:"errors"}];function Lg(e){return{...e,deploymentCount:Array.isArray(e.deployments)?e.deployments.length:0}}const Dg={modelRelay:{name:"modelRelay",check:function(e){return function(e){return mr(e).managedModels.modelRelay}(e).protocols.length>0}},managedGitCredentials:{name:"managedGitCredentials",check:function(e){return mr(e).managedGitCredentials.registry}},localFolderPlaces:{name:"localFolderPlaces",check:function(e){return!0===lr.safeParse(e).data?.folderPlaces}},localFolderNameUpdate:{name:"localFolderNameUpdate",check:function(e){return!0===lr.safeParse(e).data?.localFolderNameUpdate}}};function Mg(e){const t=e?.capabilities?.agent;if(t&&"object"==typeof t&&!Array.isArray(t))return t.capabilities}async function Bg(e,t,n){return{nodeId:t,capabilities:Mg(await e.resources.node(t,n))}}function Hg(e,t,n){if(t&&!n.check(t.capabilities))throw p(e,n.name,{nodeId:t.nodeId,scope:"node"})}async function Fg(e,t,n,i,o){const a=(await e.resources.instanceBoard(o)).find(e=>e.id===t);a&&Hg(n,await Bg(e,a.nodeId,o),i)}const Vg={userManagement:{name:"userManagement",check:function(e){return!0===Fi(e)?.userManagement.users}},customRoles:{name:"customRoles",check:function(e){return!0===Fi(e)?.authorization.customRoles}},externalIdentityLogin:{name:"externalIdentityLogin",check:function(e){return void 0!==Fi(e)?.authentication.externalIdentity}}},Gg=[{key:"id",header:"user"},{key:"displayName",header:"name",width:24},{key:"primaryUsername",header:"username"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],Yg=[{key:"id",header:"session"},{key:"clientType",header:"client"},{key:"createdAt",header:"created"},{key:"expiresAt",header:"expires"},{key:"lastUsedAt",header:"last used"}],Wg=[{key:"id",header:"role"},{key:"name",header:"name",width:24},{key:"builtin",header:"builtin"},{key:"updatedAt",header:"updated"}],Kg=[{key:"id",header:"permission"},{key:"description",header:"description",width:48}],Jg=[{key:"id",header:"provider"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"enabled",header:"enabled"}],Zg=[{key:"id",header:"approval"},{key:"displayName",header:"name",width:24},{key:"email",header:"email",width:30},{key:"status",header:"status"}];async function Qg(e,t,n){const i=await xp(e);return function(e,t,n){if(!n.check(t.payload.capabilities))throw p(e,n.name,{origin:t.origin,protocolVersion:t.payload.protocolVersion,scope:"control-plane"})}(t,i.identity,n),i}const Xg=o.z.looseObject({}),ez=o.z.object({}).strict();function tz(e){return o.z.object(e).strict()}function nz(e,t,n,i={}){return{name:e,summary:t,leaves:n,...i.flat?{flat:!0}:{}}}const iz=[{key:"id",header:"node"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"health",header:"health"},{key:"connectionMode",header:"connection"}],oz=[{key:"id",header:"folder"},{key:"name",header:"name",width:24},{key:"path",header:"path",width:48},{key:"updatedAt",header:"updated"}],az=[{key:"id",header:"runtime"},{key:"name",header:"name",width:24},{key:"type",header:"type"},{key:"status",header:"status"},{key:"version",header:"version"}],rz=[{key:"reference",header:"reference",width:48},{key:"id",header:"image id",width:24},{key:"sizeBytes",header:"size"},{key:"createdAt",header:"created"}],sz=[{key:"id",header:"job"},{key:"status",header:"status"},{key:"fromVersion",header:"from"},{key:"toVersion",header:"to"},{key:"updatedAt",header:"updated"}],dz=[{key:"keyId",header:"key id"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"}],cz=[{key:"id",header:"connection"},{key:"controlPlaneName",header:"control plane",width:24},{key:"controlPlaneUrl",header:"url",width:40},{key:"status",header:"status"}];function lz(e){return kp(e,"nodeId")}async function mz(e,t,n,i){const o=await xp(e);if(i.length){const a=await Bg(o.client,t,e.signal);for(const e of i)Hg(n,a,e)}return o}const uz=new Set(["succeeded","degraded","failed"]),pz={folders:o.z.array(Ts),folderTree:o.z.array($d),folderPlaces:o.z.array(Nd),runtimes:o.z.array(Id),dockerImages:o.z.array(o.z.looseObject({reference:o.z.string().optional(),id:o.z.string().optional()})),imageOptions:o.z.array(Od),externalListener:vd,modelRelay:Sd,updateJobs:o.z.array(xs),pairingInvite:kd,pairings:o.z.array(jd),connections:o.z.array(Rd),connectionCreate:Td,nodeRemove:Ed};o.z.looseObject({id:o.z.string(),joinToken:o.z.string().optional(),expiresAt:o.z.string().optional()}),o.z.looseObject({node:o.z.looseObject({id:o.z.string()}).optional()});const gz={name:"nodeId",description:"Node ID",required:!0},zz={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},hz=[{id:"node create",group:"node",name:"create",stage:"B",write:!0,summary:"Create a node record from a JSON request body",options:[zz],input:tz({config:o.z.string()}),output:pz.nodeRemove,outputPinned:!1,handler:async function(e,t){const n=$p(t,"Node create request"),i=await xp(e),o=await Cp(e,"node create",()=>({method:"POST",path:"/api/nodes",body:n}),()=>i.client.nodeAdmin.createNode(n));if(o)return{data:o,columns:iz,message:`Node \`${o.id}\` created.`}}},{id:"node remove",group:"node",name:"remove",stage:"B",write:!0,summary:"Remove a node and revoke its proxied pairing",args:[gz],options:[{flags:"--force",description:"Force removal when the node is still reachable"}],input:tz({nodeId:o.z.string(),force:o.z.boolean().optional()}),output:pz.nodeRemove,handler:async function(e,t){const n=lz(t),i=!0===t.options.force,o=await xp(e),a=await Cp(e,"node remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}${i?"?force=true":""}`}),()=>o.client.nodeAdmin.removeNode(n,i?{force:!0}:{}));if(a)return{data:a,message:`Node \`${n}\` removed (revoke: ${a.revoke.mode}${a.revoke.orphanRisk?", orphan risk":""}).`}}},{id:"node check",group:"node",name:"check",stage:"B",summary:"Probe a node's agent and report its health",args:[gz],input:tz({nodeId:o.z.string()}),output:o.z.looseObject({id:o.z.string(),status:o.z.string(),checkedAt:o.z.string()}),outputPinned:!1,handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.checkNode(n);return e.output.json?{data:o}:{data:o,columns:[{key:"id",header:"node"},{key:"status",header:"status"},{key:"checkedAt",header:"checked"}]}}},{id:"node sync-local",group:"node",name:"sync-local",stage:"B",write:!0,summary:"Register or refresh the local node connection",input:ez,output:Xg,outputPinned:!1,handler:async function(e){const t=await xp(e),n=await Cp(e,"node sync-local",()=>({method:"POST",path:"/api/nodes/local/sync"}),()=>t.client.nodeAdmin.syncLocalNode());if(n)return{data:n,columns:iz,message:`Local node \`${n.id}\` synced.`}}},{id:"node folders list",group:"node",name:"folders list",stage:"B",summary:"List the local folders a node exposes",args:[gz],input:tz({nodeId:o.z.string()}),output:o.z.array(Ts),handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.listFolders(n,e.signal);return e.output.json?{data:o}:{data:o,columns:oz,message:o.length?void 0:"No folders matched."}}},{id:"node folders tree",group:"node",name:"folders tree",stage:"B",summary:"Show a node's local folder tree",args:[gz],options:[{flags:"--path <path>",description:"Subtree root inside the node filesystem"},{flags:"--depth <depth>",description:"Maximum tree depth"}],input:tz({nodeId:o.z.string(),path:o.z.string().optional(),depth:o.z.string().optional()}),output:o.z.array($d),handler:async function(e,t){const n=lz(t),i=jp(t,"path"),o=jp(t,"depth"),a=await xp(e),r=await a.client.nodeAdmin.listFolderTree(n,{...i?{path:i}:{},...o?{depth:Number(o)}:{}},e.signal);return e.output.json?{data:r}:{data:r,columns:[{key:"path",header:"path",width:60},{key:"name",header:"name",width:24},{key:"type",header:"type"}]}}},{id:"node folders add",group:"node",name:"folders add",stage:"B",write:!0,summary:"Register a local folder on a node",args:[gz],options:[zz],input:tz({nodeId:o.z.string(),config:o.z.string()}),output:Ts,handler:async function(e,t){const n=lz(t),i=$p(t,"Folder create request"),o=await mz(e,n,"node folders add",[Dg.localFolderPlaces]),a=await Cp(e,"node folders add",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/local-folders`,body:i}),()=>o.client.nodeAdmin.createFolder(n,i));if(a)return{data:a,columns:oz,message:`Folder \`${a.id}\` added.`}}},{id:"node folders update",group:"node",name:"folders update",stage:"B",write:!0,summary:"Update a node local folder",args:[gz,{name:"folderId",description:"Local folder ID",required:!0}],options:[zz],input:tz({nodeId:o.z.string(),folderId:o.z.string(),config:o.z.string()}),output:Ts,handler:async function(e,t){const n=lz(t),i=kp(t,"folderId"),o=$p(t,"Folder update request"),a=await mz(e,n,"node folders update",[Dg.localFolderPlaces,Dg.localFolderNameUpdate]),r=await Cp(e,"node folders update",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/local-folders/${encodeURIComponent(i)}`,body:o}),()=>a.client.nodeAdmin.updateFolder(n,i,o));if(r)return{data:r,columns:oz,message:`Folder \`${i}\` updated.`}}},{id:"node folders remove",group:"node",name:"folders remove",stage:"B",write:!0,summary:"Remove a node local folder",args:[gz,{name:"folderId",description:"Local folder ID",required:!0}],input:tz({nodeId:o.z.string(),folderId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),outputPinned:!1,handler:async function(e,t){const n=lz(t),i=kp(t,"folderId"),o=await mz(e,n,"node folders remove",[Dg.localFolderPlaces]),a=await Cp(e,"node folders remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/local-folders/${encodeURIComponent(i)}`}),()=>o.client.nodeAdmin.removeFolder(n,i));if(a)return{data:a,message:`Folder \`${i}\` removed.`}}},{id:"node runtimes list",group:"node",name:"runtimes list",stage:"B",summary:"List the container runtimes a node exposes",args:[gz],input:tz({nodeId:o.z.string()}),output:o.z.array(Id),handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.listRuntimes(n,e.signal);return e.output.json?{data:o}:{data:o,columns:az,message:o.length?void 0:"No runtimes matched."}}},{id:"node runtimes create",group:"node",name:"runtimes create",stage:"B",write:!0,summary:"Create a runtime on a node",args:[gz],options:[zz],input:tz({nodeId:o.z.string(),config:o.z.string()}),output:Id,handler:async function(e,t){const n=lz(t),i=$p(t,"Runtime create request"),o=await xp(e),a=await Cp(e,"node runtimes create",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/runtimes`,body:i}),()=>o.client.nodeAdmin.createRuntime(n,i));if(a)return{data:a,columns:az,message:`Runtime \`${a.id}\` created.`}}},{id:"node runtimes update",group:"node",name:"runtimes update",stage:"B",write:!0,summary:"Update a node runtime",args:[gz,{name:"runtimeId",description:"Runtime ID",required:!0}],options:[zz],input:tz({nodeId:o.z.string(),runtimeId:o.z.string(),config:o.z.string()}),output:Id,handler:async function(e,t){const n=lz(t),i=kp(t,"runtimeId"),o=$p(t,"Runtime update request"),a=await xp(e),r=await Cp(e,"node runtimes update",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/runtimes/${encodeURIComponent(i)}`,body:o}),()=>a.client.nodeAdmin.updateRuntime(n,i,o));if(r)return{data:r,columns:az,message:`Runtime \`${i}\` updated.`}}},{id:"node runtimes remove",group:"node",name:"runtimes remove",stage:"B",write:!0,summary:"Remove a node runtime",args:[gz,{name:"runtimeId",description:"Runtime ID",required:!0}],input:tz({nodeId:o.z.string(),runtimeId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),outputPinned:!1,handler:async function(e,t){const n=lz(t),i=kp(t,"runtimeId"),o=await xp(e),a=await Cp(e,"node runtimes remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/runtimes/${encodeURIComponent(i)}`}),()=>o.client.nodeAdmin.removeRuntime(n,i));if(a)return{data:a,message:`Runtime \`${i}\` removed.`}}},{id:"node runtimes check",group:"node",name:"runtimes check",stage:"B",summary:"Probe a node runtime and report its health",args:[gz,{name:"runtimeId",description:"Runtime ID",required:!0}],input:tz({nodeId:o.z.string(),runtimeId:o.z.string()}),output:Id,outputPinned:!1,handler:async function(e,t){const n=lz(t),i=kp(t,"runtimeId"),o=await xp(e),a=await o.client.nodeAdmin.checkRuntime(n,i);return e.output.json?{data:a}:{data:a,columns:az}}},{id:"node docker images",group:"node",name:"docker images",stage:"B",summary:"List docker images available on a node",args:[gz],input:tz({nodeId:o.z.string()}),output:pz.dockerImages,outputPinned:!1,handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.listDockerImages(n,e.signal);return e.output.json?{data:o}:{data:o,columns:rz,message:o.length?void 0:"No docker images matched."}}},{id:"node image-options",group:"node",name:"image-options",stage:"B",summary:"List image options a node can provision",args:[gz],input:tz({nodeId:o.z.string()}),output:pz.imageOptions,handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.imageOptions(n,e.signal);return e.output.json?{data:o}:{data:o,columns:[{key:"id",header:"image"},{key:"name",header:"name",width:24},{key:"reference",header:"reference",width:40}]}}},{id:"node settings external-listener show",group:"node",name:"settings external-listener show",stage:"B",summary:"Show a node's external listener settings",args:[gz],input:tz({nodeId:o.z.string()}),output:pz.externalListener,handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.getExternalListener(n,e.signal);return e.output.json?{data:o}:{data:o,columns:[{key:"bindScope",header:"bind scope"},{key:"port",header:"port"},{key:"enabled",header:"enabled"}]}}},{id:"node settings external-listener set",group:"node",name:"settings external-listener set",stage:"B",write:!0,summary:"Update a node's external listener settings",args:[gz],options:[zz],input:tz({nodeId:o.z.string(),config:o.z.string()}),output:pz.externalListener,handler:async function(e,t){const n=lz(t),i=$p(t,"External listener update request"),o=await xp(e),a=await Cp(e,"node settings external-listener set",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/settings/external-listener`,body:i}),()=>o.client.nodeAdmin.updateExternalListener(n,i));if(a)return{data:a,message:`External listener for \`${n}\` updated.`}}},{id:"node settings model-relay show",group:"node",name:"settings model-relay show",stage:"B",summary:"Show a node's model relay settings",args:[gz],input:tz({nodeId:o.z.string()}),output:pz.modelRelay,handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.getModelRelay(n,e.signal);return e.output.json?{data:o}:{data:o,columns:[{key:"enabled",header:"enabled"},{key:"source",header:"source"},{key:"endpoint",header:"endpoint",width:40}]}}},{id:"node settings model-relay set",group:"node",name:"settings model-relay set",stage:"B",write:!0,summary:"Update a node's model relay settings",args:[gz],options:[zz],input:tz({nodeId:o.z.string(),config:o.z.string()}),output:pz.modelRelay,handler:async function(e,t){const n=lz(t),i=$p(t,"Model relay update request"),o=await mz(e,n,"node settings model-relay set",[Dg.modelRelay]),a=await Cp(e,"node settings model-relay set",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/settings/model-relay`,body:i}),()=>o.client.nodeAdmin.updateModelRelay(n,i));if(a)return{data:a,message:`Model relay for \`${n}\` updated.`}}},{id:"node updates jobs",group:"node",name:"updates jobs",stage:"B",summary:"List node update jobs",args:[gz],input:tz({nodeId:o.z.string()}),output:o.z.array(xs),handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.updateJobs(n,e.signal);return e.output.json?{data:o}:{data:o,columns:sz,message:o.length?void 0:"No update jobs matched."}}},{id:"node updates check",group:"node",name:"updates check",stage:"B",summary:"Check whether a node update is available",args:[gz],options:[{flags:"--config <file>",description:"Update check request JSON (optional)"}],input:tz({nodeId:o.z.string(),config:o.z.string().optional()}),output:vs,handler:async function(e,t){const n=lz(t),i=jp(t,"config")?$p(t,"Update check request"):{},o=await xp(e),a=await o.client.nodeAdmin.checkUpdate(n,i);return e.output.json?{data:a}:{data:a,columns:[{key:"availableVersion",header:"available"},{key:"channel",header:"channel"},{key:"currentVersion",header:"current"}]}}},{id:"node updates apply",group:"node",name:"updates apply",stage:"B",write:!0,summary:"Apply a node update and optionally wait for it to finish",args:[gz],options:[zz,{flags:"--wait",description:"Poll the update job until it reaches a terminal state"}],input:tz({nodeId:o.z.string(),config:o.z.string(),wait:o.z.boolean().optional()}),output:xs,handler:async function(e,t){const n=lz(t),i=$p(t,"Update apply request"),o=!0===t.options.wait,a=await xp(e),r=await Cp(e,"node updates apply",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/updates/apply`,body:i}),()=>a.client.nodeAdmin.applyUpdate(n,i));if(!r)return;if(!o)return{data:r,columns:sz,message:`Update job \`${r.id}\` queued (status ${r.status}).`};let s=r;for(;;){if(uz.has(s.status))return{data:s,columns:sz,message:`Update job \`${s.id}\` finished with status ${s.status}.`};if(await e.sleep(2e3),e.signal.aborted)throw new m("CLI_CANCELLED","Stopped waiting for the update job; the job keeps running on the server.",15,{jobId:s.id});s=(await a.client.nodeAdmin.updateJobs(n,e.signal)).find(e=>e.id===r.id)??s}}},{id:"node pairing invite",group:"node",name:"pairing invite",stage:"B",write:!0,summary:"Create a pairing invite token for a node",args:[gz],options:[{flags:"--config <file>",description:"Pairing invite request JSON (optional)"}],input:tz({nodeId:o.z.string(),config:o.z.string().optional()}),output:pz.pairingInvite,handler:async function(e,t){const n=lz(t),i=jp(t,"config")?$p(t,"Pairing invite request"):{},o=await xp(e),a=await Cp(e,"node pairing invite",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/pairing/invites`,body:i}),()=>o.client.nodeAdmin.createPairingInvite(n,i));if(a)return hp(a.joinToken),{data:a,message:`Pairing invite for \`${n}\` created (expires ${a.expiresAt}).`}}},{id:"node pairings list",group:"node",name:"pairings list",stage:"B",summary:"List the control plane pairings registered on a node",args:[gz],input:tz({nodeId:o.z.string()}),output:pz.pairings,handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.listControlPlanePairings(n,e.signal);return e.output.json?{data:o}:{data:o,columns:dz,message:o.length?void 0:"No pairings matched."}}},{id:"node pairings remove",group:"node",name:"pairings remove",stage:"B",write:!0,summary:"Revoke a control plane pairing on a node",args:[gz,{name:"keyId",description:"Pairing key ID",required:!0}],input:tz({nodeId:o.z.string(),keyId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),outputPinned:!1,handler:async function(e,t){const n=lz(t),i=kp(t,"keyId"),o=await xp(e),a=await Cp(e,"node pairings remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/control-plane-pairings/${encodeURIComponent(i)}`}),()=>o.client.nodeAdmin.removeControlPlanePairing(n,i));if(a)return{data:a,message:`Pairing \`${i}\` removed from \`${n}\`.`}}},{id:"node connections list",group:"node",name:"connections list",stage:"B",summary:"List the control plane connections configured on a node",args:[gz],input:tz({nodeId:o.z.string()}),output:pz.connections,handler:async function(e,t){const n=lz(t),i=await xp(e),o=await i.client.nodeAdmin.listControlPlaneConnections(n,e.signal);return e.output.json?{data:o}:{data:o,columns:cz,message:o.length?void 0:"No connections matched."}}},{id:"node connections create",group:"node",name:"connections create",stage:"B",write:!0,summary:"Create a control plane connection on a node",args:[gz],options:[zz],input:tz({nodeId:o.z.string(),config:o.z.string()}),output:pz.connectionCreate,handler:async function(e,t){const n=lz(t),i=$p(t,"Connection create request"),o=await xp(e),a=await Cp(e,"node connections create",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/control-plane-connections`,body:i}),()=>o.client.nodeAdmin.createControlPlaneConnection(n,i));if(a)return{data:a,columns:cz,message:`Connection created for \`${n}\`.`}}},{id:"node connections remove",group:"node",name:"connections remove",stage:"B",write:!0,summary:"Remove a control plane connection from a node",args:[gz,{name:"connectionId",description:"Connection ID",required:!0}],input:tz({nodeId:o.z.string(),connectionId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),outputPinned:!1,handler:async function(e,t){const n=lz(t),i=kp(t,"connectionId"),o=await xp(e),a=await Cp(e,"node connections remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/control-plane-connections/${encodeURIComponent(i)}`}),()=>o.client.nodeAdmin.removeControlPlaneConnection(n,i));if(a)return{data:a,message:`Connection \`${i}\` removed from \`${n}\`.`}}}],yz=nz("node-join","Join a node to the Control Plane",[{id:"node-join invite",group:"node-join",name:"invite",stage:"B",write:!0,summary:"Create a node join invite token",options:[{flags:"--config <file>",description:"Join invite request JSON (optional)"}],input:tz({config:o.z.string().optional()}),output:o.z.looseObject({id:o.z.string(),expiresAt:o.z.string(),joinToken:o.z.string().optional()}),handler:async function(e,t){const n=jp(t,"config")?$p(t,"Join invite request"):{},i=await xp(e),o=await Cp(e,"node-join invite",()=>({method:"POST",path:"/api/node-join/invites",body:n}),()=>i.client.nodeAdmin.createJoinInvite(n));if(o)return hp(o.joinToken),{data:o,columns:[{key:"id",header:"invite"},{key:"expiresAt",header:"expires"}],message:`Join invite \`${o.id}\` created.`}}},{id:"node-join status",group:"node-join",name:"status",stage:"B",summary:"Show whether a node join invite was completed",args:[{name:"inviteId",description:"Join invite ID",required:!0}],input:tz({inviteId:o.z.string()}),output:hd,handler:async function(e,t){const n=kp(t,"inviteId"),i=await xp(e),o=await i.client.nodeAdmin.joinInviteStatus(n,e.signal);return e.output.json?{data:o}:{data:o,columns:[{key:"id",header:"invite"},{key:"status",header:"status"},{key:"nodeId",header:"node"}]}}},{id:"node-join complete",group:"node-join",name:"complete",stage:"B",write:!0,summary:"Complete a node join from a JSON request body",options:[zz],input:tz({config:o.z.string()}),output:Xg,outputPinned:!1,handler:async function(e,t){const n=$p(t,"Join completion request"),i=await xp(e),o=await Cp(e,"node-join complete",()=>({method:"POST",path:"/api/node-join/complete",body:n}),()=>i.client.nodeAdmin.completeJoin(n));if(o)return{data:o,columns:[{key:"id",header:"node"},{key:"name",header:"name",width:24},{key:"status",header:"status"}],message:`Node \`${o.id}\` joined the Control Plane.`}}}]),fz=[{key:"id",header:"project"},{key:"name",header:"name",width:24},{key:"defaultNodeId",header:"node"},{key:"updatedAt",header:"updated"}],Iz=[{key:"id",header:"image"},{key:"name",header:"name",width:24},{key:"reference",header:"reference",width:40},{key:"pullPolicy",header:"pull"}],bz=[{key:"id",header:"model"},{key:"name",header:"name",width:24},{key:"model",header:"model id",width:30},{key:"app",header:"app"},{key:"enabled",header:"enabled"}],wz=[{key:"id",header:"model"},{key:"name",header:"name",width:24},{key:"model",header:"model id",width:30},{key:"referenceCount",header:"refs"}],vz=[{key:"id",header:"template"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],xz=[{key:"id",header:"credential"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],Az=[{key:"credentialId",header:"credential"},{key:"instanceId",header:"instance"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}];async function Sz(e,t,n){return!0!==e.options.tokenStdin||n(t,await Np(e)),t}const Cz=[{key:"id",header:"bridge"},{key:"channel",header:"channel"},{key:"name",header:"name",width:24},{key:"running",header:"running"},{key:"tokenSet",header:"token"}],kz=[{key:"id",header:"session"},{key:"channel",header:"channel"},{key:"bridgeId",header:"bridge"},{key:"chatId",header:"chat"},{key:"updatedAt",header:"updated"}],jz=[{key:"id",header:"session"},{key:"userAgent",header:"client",width:30},{key:"createdAt",header:"created"},{key:"expiresAt",header:"expires"}];async function Rz(e,t){const n=$p(e,t);if(!0===e.options.tokenStdin){const t=await Np(e);n.token=t,hp(t)}return n}const Tz=[{key:"publicBaseUrl",header:"public base url",width:40},{key:"updateChannel",header:"channel"},{key:"mentionTrigger",header:"mention"},{key:"commandTrigger",header:"command"},{key:"diagnosticLogs",header:"logs"}],Ez=[{key:"id",header:"invite"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"},{key:"createdAt",header:"created"}],Pz=[{key:"id",header:"binding"},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],Oz=[{key:"id",header:"claim"},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"}],$z=[{key:"bindingId",header:"binding"},{key:"activeHttp",header:"http"},{key:"activeStreams",header:"streams"},{key:"activeWebSockets",header:"websockets"}],Nz={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},_z={output:Xg,outputPinned:!1},Uz=nz("project","Manage catalog projects",[{id:"project list",group:"project",name:"list",stage:"B",summary:"List projects",input:ez,output:o.z.array(Ls),handler:async function(e){const t=await xp(e),n=await t.client.catalog.listProjects(e.signal);return e.output.json?{data:n}:{data:n,columns:fz,message:n.length?void 0:"No projects matched."}}},{id:"project show",group:"project",name:"show",stage:"B",summary:"Show one project",args:[{name:"projectId",description:"Project ID",required:!0}],input:tz({projectId:o.z.string()}),output:Ls,handler:async function(e,t){const n=kp(t,"projectId"),i=await xp(e),o=await i.client.catalog.getProject(n,e.signal);return e.output.json?{data:o}:{data:o,columns:fz}}},{id:"project create",group:"project",name:"create",stage:"B",write:!0,summary:"Create a project from a JSON request body",options:[Nz],input:tz({config:o.z.string()}),output:Ls,handler:async function(e,t){const n=$p(t,"Project create request"),i=await xp(e),o=await Cp(e,"project create",()=>({method:"POST",path:"/api/projects",body:n}),()=>i.client.catalog.createProject(n));if(o)return{data:o,columns:fz,message:`Project \`${o.id}\` created.`}}},{id:"project update",group:"project",name:"update",stage:"B",write:!0,summary:"Update a project",args:[{name:"projectId",description:"Project ID",required:!0}],options:[Nz],input:tz({projectId:o.z.string(),config:o.z.string()}),output:Ls,handler:async function(e,t){const n=kp(t,"projectId"),i=$p(t,"Project update request"),o=await xp(e),a=await Cp(e,"project update",()=>({method:"PATCH",path:`/api/projects/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateProject(n,i));if(a)return{data:a,columns:fz,message:`Project \`${n}\` updated.`}}},{id:"project remove",group:"project",name:"remove",stage:"B",write:!0,summary:"Remove a project",args:[{name:"projectId",description:"Project ID",required:!0}],input:tz({projectId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"projectId"),i=await xp(e),o=await Cp(e,"project remove",()=>({method:"DELETE",path:`/api/projects/${encodeURIComponent(n)}`}),()=>i.client.catalog.removeProject(n));if(o)return{data:o,message:`Project \`${n}\` removed.`}}}]),qz=nz("image","Manage custom images",[{id:"image list",group:"image",name:"list",stage:"B",summary:"List custom images",input:ez,output:o.z.array(dd),handler:async function(e){const t=await xp(e),n=await t.client.catalog.listImages(e.signal);return e.output.json?{data:n}:{data:n,columns:Iz,message:n.length?void 0:"No images matched."}}},{id:"image show",group:"image",name:"show",stage:"B",summary:"Show one image",args:[{name:"imageId",description:"Image ID",required:!0}],input:tz({imageId:o.z.string()}),output:dd,handler:async function(e,t){const n=kp(t,"imageId"),i=await xp(e),o=await i.client.catalog.getImage(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Iz}}},{id:"image create",group:"image",name:"create",stage:"B",write:!0,summary:"Create a custom image from a JSON request body",options:[Nz],input:tz({config:o.z.string()}),output:dd,handler:async function(e,t){const n=$p(t,"Image create request"),i=await xp(e),o=await Cp(e,"image create",()=>({method:"POST",path:"/api/images",body:n}),()=>i.client.catalog.createImage(n));if(o)return{data:o,columns:Iz,message:`Image \`${o.id}\` created.`}}},{id:"image update",group:"image",name:"update",stage:"B",write:!0,summary:"Update a custom image",args:[{name:"imageId",description:"Image ID",required:!0}],options:[Nz],input:tz({imageId:o.z.string(),config:o.z.string()}),output:dd,handler:async function(e,t){const n=kp(t,"imageId"),i=$p(t,"Image update request"),o=await xp(e),a=await Cp(e,"image update",()=>({method:"PATCH",path:`/api/images/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateImage(n,i));if(a)return{data:a,columns:Iz,message:`Image \`${n}\` updated.`}}},{id:"image remove",group:"image",name:"remove",stage:"B",write:!0,summary:"Remove a custom image",args:[{name:"imageId",description:"Image ID",required:!0}],input:tz({imageId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"imageId"),i=await xp(e),o=await Cp(e,"image remove",()=>({method:"DELETE",path:`/api/images/${encodeURIComponent(n)}`}),()=>i.client.catalog.removeImage(n));if(o)return{data:o,message:`Image \`${n}\` removed.`}}},{id:"image options",group:"image",name:"options",stage:"B",summary:"List selectable image options",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.catalog.imageOptions(e.signal);return e.output.json?{data:n}:{data:n,columns:[{key:"id",header:"image"},{key:"name",header:"name",width:24},{key:"reference",header:"reference",width:40}]}}}]),Lz=nz("market","Inspect the market catalog",[{id:"market catalog",group:"market",name:"catalog",stage:"B",summary:"Show the market catalog snapshot",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.catalog.marketCatalog(e.signal);return e.output.json?{data:n}:{data:n,columns:[{key:"image.id",header:"image"},{key:"image.name",header:"name",width:30},{key:"status",header:"status"}]}}},{id:"market refresh",group:"market",name:"refresh",stage:"B",write:!0,summary:"Refresh the market catalog from its source",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await Cp(e,"market refresh",()=>({method:"POST",path:"/api/market/refresh"}),()=>t.client.catalog.refreshMarketCatalog());if(n)return{data:n,message:`Market catalog refreshed (${n.catalog.items?.length??0} images).`}}}]),Dz=[{id:"model create",group:"model",name:"create",stage:"B",write:!0,summary:"Create a model from a JSON request body",options:[Nz],input:tz({config:o.z.string()}),..._z,handler:async function(e,t){const n=$p(t,"Model create request"),i=await xp(e),o=await Cp(e,"model create",()=>({method:"POST",path:"/api/models",body:n}),()=>i.client.catalog.createModel(n));if(o)return{data:o,message:`Model \`${o.id}\` created.`}}},{id:"model copy",group:"model",name:"copy",stage:"B",write:!0,summary:"Copy a model",args:[{name:"modelId",description:"Model entity ID",required:!0}],options:[Nz],input:tz({modelId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"modelId"),i=$p(t,"Model copy request"),o=await xp(e),a=await Cp(e,"model copy",()=>({method:"POST",path:`/api/models/${encodeURIComponent(n)}/copy`,body:i}),()=>o.client.catalog.copyModel(n,i));if(a)return{data:a,message:`Model \`${a.id}\` copied from \`${n}\`.`}}},{id:"model discover",group:"model",name:"discover",stage:"B",summary:"Discover models behind an endpoint",options:[Nz],input:tz({config:o.z.string()}),..._z,handler:async function(e,t){const n=$p(t,"Model discovery request"),i=await xp(e),o=await i.client.catalog.discoverModels(n);return e.output.json?{data:o}:{data:o.models,columns:[{key:"id",header:"model"},{key:"ownedBy",header:"owned by"}],message:o.models.length?void 0:"No models discovered."}}},{id:"model test",group:"model",name:"test",stage:"B",summary:"Test a model endpoint",options:[Nz],input:tz({config:o.z.string()}),..._z,handler:async function(e,t){const n=$p(t,"Model test request"),i=await xp(e),o=await i.client.catalog.testModel(n);return e.output.json?{data:o}:{data:o,message:`Model test succeeded in ${o.latencyMs}ms.`}}},{id:"model reorder",group:"model",name:"reorder",stage:"B",write:!0,summary:"Reorder models",options:[{flags:"--id <modelId>",description:"Model entity ID in the new order",repeatable:!0}],input:tz({id:o.z.array(o.z.string()).optional()}),..._z,handler:async function(e,t){const n=Tp(t,"id");if(!n.length)throw Rp(t,"id");const i=await xp(e),o=await Cp(e,"model reorder",()=>({method:"POST",path:"/api/models/reorder",body:{ids:n}}),()=>i.client.catalog.reorderModels(n));if(o)return{data:o,columns:bz,message:`${o.length} models reordered.`}}},{id:"model update",group:"model",name:"update",stage:"B",write:!0,summary:"Update a model",args:[{name:"modelId",description:"Model entity ID",required:!0}],options:[Nz],input:tz({modelId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"modelId"),i=$p(t,"Model update request"),o=await xp(e),a=await Cp(e,"model update",()=>({method:"PATCH",path:`/api/models/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateModel(n,i));if(a)return{data:a,message:`Model \`${n}\` updated.`}}},{id:"model sync",group:"model",name:"sync",stage:"B",write:!0,summary:"Sync a model to its assigned nodes",args:[{name:"modelId",description:"Model entity ID",required:!0}],input:tz({modelId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"modelId"),i=await xp(e),o=await Cp(e,"model sync",()=>({method:"POST",path:`/api/models/${encodeURIComponent(n)}/sync`}),()=>i.client.catalog.syncModel(n));if(o)return{data:o,message:`Model \`${n}\` synced.`}}},{id:"model merge",group:"model",name:"merge",stage:"B",write:!0,summary:"Merge duplicate model entities",args:[{name:"modelId",description:"Model entity ID",required:!0}],options:[Nz],input:tz({modelId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"modelId"),i=$p(t,"Model merge request"),o=await xp(e),a=await Cp(e,"model merge",()=>({method:"POST",path:`/api/models/${encodeURIComponent(n)}/merge`,body:i}),()=>o.client.catalog.mergeModel(n,i));if(a)return{data:a,message:`Model \`${n}\` merged.`}}},{id:"model remove",group:"model",name:"remove",stage:"B",write:!0,summary:"Remove a model",args:[{name:"modelId",description:"Model entity ID",required:!0}],input:tz({modelId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"modelId"),i=await xp(e),o=await Cp(e,"model remove",()=>({method:"DELETE",path:`/api/models/${encodeURIComponent(n)}`}),()=>i.client.catalog.removeModel(n));if(o)return{data:o,message:`Model \`${n}\` removed.`}}},{id:"model node list",group:"model",name:"node list",stage:"B",summary:"List models deployed to a node",args:[{name:"nodeId",description:"Node ID",required:!0}],input:tz({nodeId:o.z.string()}),output:o.z.array(Ms),handler:async function(e,t){const n=kp(t,"nodeId"),i=await xp(e),o=await i.client.catalog.listModels({signal:e.signal}),a=e=>"node"===e.type&&e.nodeId===n,r=o.models.filter(e=>e.locations.some(a)),s=r.map(e=>({id:e.id,name:e.model.name,model:e.model.model,referenceCount:e.locations.filter(a).length}));return e.output.json?{data:r}:{data:s,columns:wz,message:s.length?void 0:`No node-scoped models for \`${n}\`.`}}},{id:"model node create",group:"model",name:"node create",stage:"B",write:!0,summary:"Deploy a model to a node",args:[{name:"nodeId",description:"Node ID",required:!0}],options:[Nz],input:tz({nodeId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"nodeId"),i=$p(t,"Node model create request"),o=await xp(e),a=await Cp(e,"model node create",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/models`,body:i}),()=>o.client.catalog.createModelOnNode(n,i));if(a)return{data:a,message:`Model deployed to node \`${n}\`.`}}},{id:"model node update",group:"model",name:"node update",stage:"B",write:!0,summary:"Update a node-scoped model",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"modelId",description:"Model entity ID",required:!0}],options:[Nz],input:tz({nodeId:o.z.string(),modelId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"nodeId"),i=kp(t,"modelId"),o=$p(t,"Node model update request"),a=await xp(e),r=await Cp(e,"model node update",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/models/${encodeURIComponent(i)}`,body:o}),()=>a.client.catalog.updateModelOnNode(n,i,o));if(r)return{data:r,message:`Node \`${n}\` model \`${i}\` updated.`}}},{id:"model node remove",group:"model",name:"node remove",stage:"B",write:!0,summary:"Remove a node-scoped model",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"modelId",description:"Model entity ID",required:!0}],input:tz({nodeId:o.z.string(),modelId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"nodeId"),i=kp(t,"modelId"),o=await xp(e),a=await Cp(e,"model node remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/models/${encodeURIComponent(i)}`}),()=>o.client.catalog.removeModelOnNode(n,i));if(a)return{data:a,message:`Node \`${n}\` model \`${i}\` removed.`}}},{id:"model node discover",group:"model",name:"node discover",stage:"B",summary:"Discover models from a node",args:[{name:"nodeId",description:"Node ID",required:!0}],options:[Nz],input:tz({nodeId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"nodeId"),i=$p(t,"Node model discovery request"),o=await xp(e),a=await o.client.catalog.discoverModelsOnNode(n,i);return e.output.json?{data:a}:{data:a.models,columns:[{key:"id",header:"model"},{key:"ownedBy",header:"owned by"}],message:a.models.length?void 0:"No models discovered."}}},{id:"model node test",group:"model",name:"node test",stage:"B",summary:"Test a node model endpoint",args:[{name:"nodeId",description:"Node ID",required:!0}],options:[Nz],input:tz({nodeId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"nodeId"),i=$p(t,"Node model test request"),o=await xp(e),a=await o.client.catalog.testModelOnNode(n,i);return e.output.json?{data:a}:{data:a,message:`Node \`${n}\` model test succeeded in ${a.latencyMs}ms.`}}}],Mz=[Uz,qz,Lz,nz("env-template","Manage node environment templates",[{id:"env-template list",group:"env-template",name:"list",stage:"B",summary:"List environment templates for a node",args:[{name:"nodeId",description:"Node ID",required:!0}],input:tz({nodeId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"nodeId"),i=await xp(e),o=await i.client.environmentTemplates.listForNode(n,e.signal);return e.output.json?{data:o}:{data:o,columns:vz,message:o.length?void 0:"No environment templates matched."}}},{id:"env-template show",group:"env-template",name:"show",stage:"B",summary:"Show one environment template",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"templateId",description:"Environment template ID",required:!0}],input:tz({nodeId:o.z.string(),templateId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"nodeId"),i=kp(t,"templateId"),o=await xp(e),a=await o.client.environmentTemplates.get(n,i,e.signal);return e.output.json?{data:a}:{data:a,columns:vz}}},{id:"env-template create",group:"env-template",name:"create",stage:"B",write:!0,summary:"Create an environment template from an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],options:[Nz],input:tz({instanceId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"instanceId"),i=$p(t,"Environment template create request"),o=await xp(e),a=await Cp(e,"env-template create",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/environment-templates`,body:i}),()=>o.client.environmentTemplates.createFromInstance(n,i));if(a)return{data:a,columns:vz,message:`Environment template \`${a.id}\` created from \`${n}\`.`}}},{id:"env-template remove",group:"env-template",name:"remove",stage:"B",write:!0,summary:"Remove an environment template",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"templateId",description:"Environment template ID",required:!0}],input:tz({nodeId:o.z.string(),templateId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"nodeId"),i=kp(t,"templateId"),o=await xp(e),a=await Cp(e,"env-template remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/environment-templates/${encodeURIComponent(i)}`}),()=>o.client.environmentTemplates.remove(n,i));if(a)return{data:a,message:`Environment template \`${i}\` removed from \`${n}\`.`}}}]),nz("git-credential","Manage managed git credentials",[{id:"git-credential list",group:"git-credential",name:"list",stage:"B",summary:"List git credentials",input:ez,output:o.z.looseObject({items:o.z.array(Wa)}),handler:async function(e){const t=await xp(e),n=await t.client.gitCredentials.listCredentials(e.signal);return e.output.json?{data:n}:{data:n.items,columns:xz,message:n.items.length?void 0:"No git credentials matched."}}},{id:"git-credential show",group:"git-credential",name:"show",stage:"B",summary:"Show one git credential",args:[{name:"credentialId",description:"Git credential ID",required:!0}],input:tz({credentialId:o.z.string()}),output:Wa,handler:async function(e,t){const n=kp(t,"credentialId"),i=await xp(e),o=await i.client.gitCredentials.getCredential(n,e.signal);return e.output.json?{data:o}:{data:o,columns:xz}}},{id:"git-credential create",group:"git-credential",name:"create",stage:"B",write:!0,summary:"Create a git credential from a JSON request body",options:[Nz],input:tz({config:o.z.string()}),output:Wa,handler:async function(e,t){const n=await Sz(t,$p(t,"Git credential create request"),(e,t)=>{const n=e.secret&&"object"==typeof e.secret?e.secret:{};e.secret={...n,token:t}}),i=await xp(e),o=await Cp(e,"git-credential create",()=>({method:"POST",path:"/api/git-credentials",body:n}),()=>i.client.gitCredentials.createCredential(n));if(o)return{data:o,columns:xz,message:`Git credential \`${o.id}\` created.`}}},{id:"git-credential update",group:"git-credential",name:"update",stage:"B",write:!0,summary:"Update a git credential",args:[{name:"credentialId",description:"Git credential ID",required:!0}],options:[Nz],input:tz({credentialId:o.z.string(),config:o.z.string()}),output:Wa,handler:async function(e,t){const n=kp(t,"credentialId"),i=await Sz(t,$p(t,"Git credential update request"),(e,t)=>{const n=e.secret&&"object"==typeof e.secret?e.secret:{};e.secret={...n,token:t}}),o=await xp(e),a=await Cp(e,"git-credential update",()=>({method:"PATCH",path:`/api/git-credentials/${encodeURIComponent(n)}`,body:i}),()=>o.client.gitCredentials.updateCredential(n,i));if(a)return{data:a,columns:xz,message:`Git credential \`${n}\` updated.`}}},{id:"git-credential remove",group:"git-credential",name:"remove",stage:"B",write:!0,summary:"Remove a git credential",args:[{name:"credentialId",description:"Git credential ID",required:!0}],input:tz({credentialId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"credentialId"),i=await xp(e),o=await Cp(e,"git-credential remove",()=>({method:"DELETE",path:`/api/git-credentials/${encodeURIComponent(n)}`}),()=>i.client.gitCredentials.removeCredential(n));if(o)return{data:o,message:`Git credential \`${n}\` removed.`}}},{id:"git-credential assignments list",group:"git-credential",name:"assignments list",stage:"B",summary:"List git credential assignments of an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],input:tz({instanceId:o.z.string()}),output:o.z.array(Xa),handler:async function(e,t){const n=kp(t,"instanceId"),i=await xp(e);await Fg(i.client,n,"git-credential assignments list",Dg.managedGitCredentials,e.signal);const o=await i.client.gitCredentials.listInstanceAssignments(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Az,message:o.length?void 0:"No git credential assignments matched."}}},{id:"git-credential assignments assign",group:"git-credential",name:"assignments assign",stage:"B",write:!0,summary:"Assign a git credential to an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],options:[{flags:"--credential <credentialId>",description:"Git credential ID"}],input:tz({instanceId:o.z.string(),credential:o.z.string()}),output:Xa,handler:async function(e,t){const n=kp(t,"instanceId"),i=Rp(t,"credential"),o=await xp(e);await Fg(o.client,n,"git-credential assignments assign",Dg.managedGitCredentials,e.signal);const a=await Cp(e,"git-credential assignments assign",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/git-credential-assignments`,body:{credentialId:i}}),()=>o.client.gitCredentials.assignToInstance(n,{credentialId:i}));if(a)return{data:a,columns:Az,message:`Credential \`${i}\` assigned to \`${n}\`.`}}},{id:"git-credential assignments unassign",group:"git-credential",name:"assignments unassign",stage:"B",write:!0,summary:"Unassign a git credential from an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"credentialId",description:"Git credential ID",required:!0}],input:tz({instanceId:o.z.string(),credentialId:o.z.string()}),output:o.z.looseObject({revoked:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"credentialId"),o=await xp(e);await Fg(o.client,n,"git-credential assignments unassign",Dg.managedGitCredentials,e.signal);const a=await Cp(e,"git-credential assignments unassign",()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}/git-credential-assignments/${encodeURIComponent(i)}`}),()=>o.client.gitCredentials.unassignFromInstance(n,i));if(a)return{data:a,message:`Credential \`${i}\` unassigned from \`${n}\`.`}}}]),nz("chat","Manage the chat gateway",[{id:"chat status",group:"chat",name:"status",stage:"B",summary:"Show the chat gateway status",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.chatGateway.status(e.signal);return e.output.json?{data:n}:{data:n.bridges,columns:Cz,message:`Chat gateway ${n.running?"running":"stopped"}.`}}},{id:"chat bridges list",group:"chat",name:"bridges list",stage:"B",summary:"List chat bridges",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.chatGateway.listBridges(e.signal);return e.output.json?{data:n}:{data:n,columns:Cz,message:n.length?void 0:"No chat bridges matched."}}},{id:"chat bridges create",group:"chat",name:"bridges create",stage:"B",write:!0,summary:"Create a chat bridge from a JSON request body",options:[Nz],input:tz({config:o.z.string()}),..._z,handler:async function(e,t){const n=await Rz(t,"Chat bridge create request"),i=await xp(e),o=await Cp(e,"chat bridges create",()=>({method:"POST",path:"/api/chat-gateway/bridges",body:n}),()=>i.client.chatGateway.createBridge(n));if(o)return{data:o,columns:Cz,message:`Chat bridge \`${o.id}\` created.`}}},{id:"chat bridges update",group:"chat",name:"bridges update",stage:"B",write:!0,summary:"Update a chat bridge",args:[{name:"bridgeId",description:"Chat bridge ID",required:!0}],options:[Nz],input:tz({bridgeId:o.z.string(),config:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"bridgeId"),i=await Rz(t,"Chat bridge update request"),o=await xp(e),a=await Cp(e,"chat bridges update",()=>({method:"PATCH",path:`/api/chat-gateway/bridges/${encodeURIComponent(n)}`,body:i}),()=>o.client.chatGateway.updateBridge(n,i));if(a)return{data:a,columns:Cz,message:`Chat bridge \`${n}\` updated.`}}},{id:"chat bridges start",group:"chat",name:"bridges start",stage:"B",write:!0,summary:"Start a chat bridge",args:[{name:"bridgeId",description:"Chat bridge ID",required:!0}],input:tz({bridgeId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"bridgeId"),i=await xp(e),o=await Cp(e,"chat bridges start",()=>({method:"POST",path:`/api/chat-gateway/bridges/${encodeURIComponent(n)}/start`}),()=>i.client.chatGateway.startBridge(n));if(o)return{data:o,message:`Chat bridge \`${n}\` started (${o.running?"running":"not running"}).`}}},{id:"chat bridges stop",group:"chat",name:"bridges stop",stage:"B",write:!0,summary:"Stop a chat bridge",args:[{name:"bridgeId",description:"Chat bridge ID",required:!0}],input:tz({bridgeId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"bridgeId"),i=await xp(e),o=await Cp(e,"chat bridges stop",()=>({method:"POST",path:`/api/chat-gateway/bridges/${encodeURIComponent(n)}/stop`}),()=>i.client.chatGateway.stopBridge(n));if(o)return{data:o,message:`Chat bridge \`${n}\` stopped (${o.running?"running":"stopped"}).`}}},{id:"chat bridges remove",group:"chat",name:"bridges remove",stage:"B",write:!0,summary:"Remove a chat bridge",args:[{name:"bridgeId",description:"Chat bridge ID",required:!0}],input:tz({bridgeId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"bridgeId"),i=await xp(e),o=await Cp(e,"chat bridges remove",()=>({method:"DELETE",path:`/api/chat-gateway/bridges/${encodeURIComponent(n)}`}),()=>i.client.chatGateway.removeBridge(n));if(o)return{data:o,message:`Chat bridge \`${n}\` removed.`}}},{id:"chat sessions list",group:"chat",name:"sessions list",stage:"B",summary:"List chat sessions",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.chatGateway.listSessions(e.signal);return e.output.json?{data:n}:{data:n,columns:kz,message:n.length?void 0:"No chat sessions matched."}}},{id:"chat sessions show",group:"chat",name:"sessions show",stage:"B",summary:"Show one chat session",args:[{name:"sessionId",description:"Chat session ID",required:!0}],input:tz({sessionId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"sessionId"),i=await xp(e),o=await i.client.chatGateway.getSession(n,e.signal);return e.output.json?{data:o}:{data:o,columns:kz}}}]),nz("mobile-session","Manage mobile sessions",[{id:"mobile-session list",group:"mobile-session",name:"list",stage:"B",summary:"List mobile sessions",input:ez,output:o.z.array(Zi),handler:async function(e){const t=await xp(e),n=await t.client.auth.mobileSessions(e.signal);return e.output.json?{data:n}:{data:n,columns:jz,message:n.length?void 0:"No mobile sessions matched."}}},{id:"mobile-session revoke",group:"mobile-session",name:"revoke",stage:"B",write:!0,summary:"Revoke a mobile session",args:[{name:"sessionId",description:"Mobile session ID",required:!0}],input:tz({sessionId:o.z.string()}),output:o.z.looseObject({revoked:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"sessionId"),i=await xp(e),o=await Cp(e,"mobile-session revoke",()=>({method:"DELETE",path:`/api/auth/mobile/sessions/${encodeURIComponent(n)}`}),()=>i.client.auth.revokeMobileSession(n));if(o)return{data:o,message:`Mobile session \`${n}\` revoked.`}}}]),nz("control-plane","Inspect and configure the Control Plane",[{id:"control-plane status",group:"control-plane",name:"status",stage:"B",summary:"Show Control Plane status",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.admin.status(e.signal);return e.output.json?{data:n}:{data:n,columns:[{key:"protocolVersion",header:"protocol"},{key:"build.version",header:"version"},{key:"storage.driver",header:"storage"}]}}},{id:"control-plane settings show",group:"control-plane",name:"settings show",stage:"B",summary:"Show Control Plane settings",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.admin.getSettings(e.signal);return e.output.json?{data:n}:{data:n,columns:Tz}}},{id:"control-plane settings update",group:"control-plane",name:"settings update",stage:"B",write:!0,summary:"Update Control Plane settings",options:[Nz],input:tz({config:o.z.string()}),..._z,handler:async function(e,t){const n=$p(t,"Control Plane settings update request"),i=await xp(e),o=await Cp(e,"control-plane settings update",()=>({method:"PATCH",path:"/api/control-plane/settings",body:n}),()=>i.client.admin.updateSettings(n));if(o)return{data:o,columns:Tz,message:"Control Plane settings updated."}}},{id:"control-plane diagnostic-logs export",group:"control-plane",name:"diagnostic-logs export",stage:"B",summary:"Export diagnostic logs to a file",options:[{flags:"--out <file>",description:"Destination file for the downloaded archive"}],input:tz({out:o.z.string()}),output:o.z.looseObject({file:o.z.string(),bytes:o.z.number()}),handler:async function(e,n){const o=Rp(n,"out"),a=await xp(e),r=await a.client.admin.exportDiagnosticLogs(),s=i.resolve(o);try{t.writeFileSync(s,r.body)}catch(e){throw u("CLI_FILE_UNWRITABLE",`Cannot write \`${s}\`: ${e instanceof Error?e.message:String(e)}`,{file:s})}return{data:{file:s,bytes:r.body.byteLength},message:`Diagnostic logs written to \`${s}\` (${r.body.byteLength} bytes).`}}}]),nz("cloud","Manage the cloud connectivity binding",[{id:"cloud show",group:"cloud",name:"show",stage:"B",summary:"Show cloud connectivity state",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.admin.cloudConnectivity(e.signal);return e.output.json?{data:n}:{data:n,columns:[{key:"status",header:"status"},{key:"serviceOrigin",header:"service",width:40},{key:"accountId",header:"account"},{key:"remoteAccessEnabled",header:"remote access"}]}}},{id:"cloud challenge",group:"cloud",name:"challenge",stage:"B",write:!0,summary:"Create a cloud binding challenge (the challenge secret is never printed)",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await Cp(e,"cloud challenge",()=>({method:"POST",path:"/api/cloud-connectivity/challenges"}),()=>t.client.admin.createCloudChallenge());if(n)return{data:{authorizationUrl:n.authorizationUrl,expiresAt:n.payload.expiresAt,publicKeyFingerprint:n.payload.publicKeyFingerprint},message:`Cloud binding challenge created; open ${n.authorizationUrl} in the cloud console before ${n.payload.expiresAt}.`}}},{id:"cloud remote-access",group:"cloud",name:"remote-access",stage:"B",write:!0,summary:"Enable or disable cloud remote access",options:[{flags:"--enabled <true|false>",description:"Whether remote access should be enabled"}],input:tz({enabled:o.z.string()}),..._z,handler:async function(e,t){const n=function(e,t){const n=e.options[t];if(!0===n)return!0;if(!1===n)return!1;if("true"===n)return!0;if("false"===n)return!1;throw u("CLI_OPTION_MISSING",`Missing required option --${t} <true|false>.`,{option:t})}(t,"enabled"),i=await xp(e),o=await Cp(e,"cloud remote-access",()=>({method:"POST",path:"/api/cloud-connectivity/remote-access",body:{enabled:n}}),()=>i.client.admin.setCloudRemoteAccess(n));if(o)return{data:o,message:`Cloud remote access ${n?"enabled":"disabled"}.`}}},{id:"cloud disconnect",group:"cloud",name:"disconnect",stage:"B",write:!0,summary:"Disconnect the cloud binding",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await Cp(e,"cloud disconnect",()=>({method:"POST",path:"/api/cloud-connectivity/disconnect"}),()=>t.client.admin.disconnectCloud());if(n)return{data:n,message:`Cloud binding is now ${n.status}.`}}}]),nz("proxy","Manage the control-plane proxy",[{id:"proxy invites list",group:"proxy",name:"invites list",stage:"B",summary:"List proxy invites",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.admin.proxyInvites(e.signal);return e.output.json?{data:n}:{data:n,columns:Ez,message:n.length?void 0:"No proxy invites matched."}}},{id:"proxy invites create",group:"proxy",name:"invites create",stage:"B",write:!0,summary:"Create a proxy invite",options:[Nz],input:tz({config:o.z.string()}),..._z,handler:async function(e,t){const n=$p(t,"Proxy invite create request"),i=await xp(e),o=await Cp(e,"proxy invites create",()=>({method:"POST",path:"/api/control-plane-proxy/invites",body:n}),()=>i.client.admin.createProxyInvite(n));if(o)return{data:o,columns:Ez,message:"Proxy invite created."}}},{id:"proxy invites remove",group:"proxy",name:"invites remove",stage:"B",write:!0,summary:"Revoke a proxy invite",args:[{name:"inviteId",description:"Proxy invite ID",required:!0}],input:tz({inviteId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"inviteId"),i=await xp(e),o=await Cp(e,"proxy invites remove",()=>({method:"DELETE",path:`/api/control-plane-proxy/invites/${encodeURIComponent(n)}`}),()=>i.client.admin.revokeProxyInvite(n));if(o)return{data:o,message:`Proxy invite \`${n}\` revoked.`}}},{id:"proxy bindings list",group:"proxy",name:"bindings list",stage:"B",summary:"List proxy bindings",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.admin.proxyBindings(e.signal);return e.output.json?{data:n}:{data:n,columns:Pz,message:n.length?void 0:"No proxy bindings matched."}}},{id:"proxy bindings remove",group:"proxy",name:"bindings remove",stage:"B",write:!0,summary:"Revoke a proxy binding",args:[{name:"bindingId",description:"Proxy binding ID",required:!0}],input:tz({bindingId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"bindingId"),i=await xp(e),o=await Cp(e,"proxy bindings remove",()=>({method:"DELETE",path:`/api/control-plane-proxy/bindings/${encodeURIComponent(n)}`}),()=>i.client.admin.revokeProxyBinding(n));if(o)return{data:o,message:`Proxy binding \`${n}\` revoked.`}}},{id:"proxy diagnostics",group:"proxy",name:"diagnostics",stage:"B",summary:"Show proxy stream diagnostics",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.admin.proxyDiagnostics(e.signal);return e.output.json?{data:n}:{data:n,columns:$z,message:n.length?void 0:"No proxied bindings."}}},{id:"proxy pending-claims list",group:"proxy",name:"pending-claims list",stage:"B",summary:"List pending proxy claims",input:ez,..._z,handler:async function(e){const t=await xp(e),n=await t.client.admin.pendingProxyClaims(e.signal);return e.output.json?{data:n}:{data:n,columns:Oz,message:n.length?void 0:"No pending proxy claims."}}},{id:"proxy pending-claims resume",group:"proxy",name:"pending-claims resume",stage:"B",write:!0,summary:"Resume a pending proxy claim",args:[{name:"claimId",description:"Pending proxy claim ID",required:!0}],input:tz({claimId:o.z.string()}),..._z,handler:async function(e,t){const n=kp(t,"claimId"),i=await xp(e),o=await Cp(e,"proxy pending-claims resume",()=>({method:"POST",path:`/api/control-plane-proxy/pending-claims/${encodeURIComponent(n)}/resume`}),()=>i.client.admin.resumeProxyClaim(n));if(o)return{data:o,message:`Pending proxy claim \`${n}\` resumed.`}}},{id:"proxy pending-claims remove",group:"proxy",name:"pending-claims remove",stage:"B",write:!0,summary:"Cancel a pending proxy claim",args:[{name:"claimId",description:"Pending proxy claim ID",required:!0}],options:[{flags:"--force",description:"Force cancellation of a claim that is mid-resume"}],input:tz({claimId:o.z.string(),force:o.z.boolean().optional()}),..._z,handler:async function(e,t){const n=kp(t,"claimId"),i=!0===t.options.force,o=await xp(e),a=await Cp(e,"proxy pending-claims remove",()=>({method:"DELETE",path:`/api/control-plane-proxy/pending-claims/${encodeURIComponent(n)}${i?"?force=true":""}`}),()=>o.client.admin.cancelProxyClaim(n,i?{force:!0}:{}));if(a)return{data:a,message:`Pending proxy claim \`${n}\` cancelled.`}}}])],Bz={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},Hz=[{id:"user create",group:"user",name:"create",stage:"B",write:!0,summary:"Create a local user",options:[Bz],input:tz({config:o.z.string()}),output:Ui,handler:async function(e,t){const n=$p(t,"User create request"),i=await Qg(e,"user create",Vg.userManagement),o=await Cp(e,"user create",()=>({method:"POST",path:"/api/users",body:n}),()=>i.client.users.create(n));if(o)return{data:o,columns:Gg,message:`User \`${o.id}\` created.`}}},{id:"user update",group:"user",name:"update",stage:"B",write:!0,summary:"Update a user",args:[{name:"userId",description:"User ID",required:!0}],options:[Bz],input:tz({userId:o.z.string(),config:o.z.string()}),output:Ui,handler:async function(e,t){const n=kp(t,"userId"),i=$p(t,"User update request"),o=await Qg(e,"user update",Vg.userManagement),a=await Cp(e,"user update",()=>({method:"PATCH",path:`/api/users/${encodeURIComponent(n)}`,body:i}),()=>o.client.users.update(n,i));if(a)return{data:a,columns:Gg,message:`User \`${n}\` updated.`}}},{id:"user access",group:"user",name:"access",stage:"B",write:!0,summary:"Replace a user's access grant",args:[{name:"userId",description:"User ID",required:!0}],options:[Bz],input:tz({userId:o.z.string(),config:o.z.string()}),output:Ui,handler:async function(e,t){const n=kp(t,"userId"),i=$p(t,"User access request"),o=await Qg(e,"user access",Vg.userManagement),a=await Cp(e,"user access",()=>({method:"PUT",path:`/api/users/${encodeURIComponent(n)}/access`,body:i}),()=>o.client.users.setAccess(n,i));if(a)return{data:a,columns:Gg,message:`Access for \`${n}\` updated.`}}},{id:"user password-reset",group:"user",name:"password-reset",stage:"B",write:!0,summary:"Reset a user's password (password is read from stdin)",args:[{name:"userId",description:"User ID",required:!0}],options:[{flags:"--require-change",description:"Require the user to change the password at next sign-in"}],input:tz({userId:o.z.string(),requireChange:o.z.boolean().optional()}),output:Xg,outputPinned:!1,handler:async function(e,t){const n=kp(t,"userId"),i=await Np(t),o=!0===t.options["require-change"],a=await Qg(e,"user password-reset",Vg.userManagement),r={password:i,...o?{requirePasswordChange:!0}:{}},s=await Cp(e,"user password-reset",()=>({method:"POST",path:`/api/users/${encodeURIComponent(n)}/password-reset`,body:r}),()=>a.client.users.resetPassword(n,r));if(s)return{data:s,columns:[{key:"id",header:"user"},{key:"primaryUsername",header:"username"}],message:`Password for \`${n}\` reset.`}}},{id:"user role list",group:"user",name:"role list",stage:"B",summary:"List roles",input:tz({}),output:o.z.array(Ni),handler:async function(e){const t=await Qg(e,"user role list",Vg.customRoles),n=await t.client.users.roles(e.signal);return e.output.json?{data:n}:{data:n,columns:Wg,message:n.length?void 0:"No roles matched."}}},{id:"user role create",group:"user",name:"role create",stage:"B",write:!0,summary:"Create a custom role",options:[Bz],input:tz({config:o.z.string()}),output:Ni,handler:async function(e,t){const n=$p(t,"Role create request"),i=await Qg(e,"user role create",Vg.customRoles),o=await Cp(e,"user role create",()=>({method:"POST",path:"/api/roles",body:n}),()=>i.client.users.createRole(n));if(o)return{data:o,columns:Wg,message:`Role \`${o.id}\` created.`}}},{id:"user role update",group:"user",name:"role update",stage:"B",write:!0,summary:"Update a role",args:[{name:"roleId",description:"Role ID",required:!0}],options:[Bz],input:tz({roleId:o.z.string(),config:o.z.string()}),output:Ni,handler:async function(e,t){const n=kp(t,"roleId"),i=$p(t,"Role update request"),o=await Qg(e,"user role update",Vg.customRoles),a=await Cp(e,"user role update",()=>({method:"PATCH",path:`/api/roles/${encodeURIComponent(n)}`,body:i}),()=>o.client.users.updateRole(n,i));if(a)return{data:a,columns:Wg,message:`Role \`${n}\` updated.`}}},{id:"user role remove",group:"user",name:"role remove",stage:"B",write:!0,summary:"Archive a role",args:[{name:"roleId",description:"Role ID",required:!0}],input:tz({roleId:o.z.string()}),output:Ni,handler:async function(e,t){const n=kp(t,"roleId"),i=await Qg(e,"user role remove",Vg.customRoles),o=await Cp(e,"user role remove",()=>({method:"DELETE",path:`/api/roles/${encodeURIComponent(n)}`}),()=>i.client.users.archiveRole(n));if(o)return{data:o,message:`Role \`${n}\` archived.`}}},{id:"user permission list",group:"user",name:"permission list",stage:"B",summary:"List permission descriptors",input:tz({}),output:o.z.array(ki),handler:async function(e){const t=await Qg(e,"user permission list",Vg.customRoles),n=await t.client.users.permissions(e.signal);return e.output.json?{data:n}:{data:n,columns:Kg,message:n.length?void 0:"No permissions matched."}}},{id:"user identity-provider list",group:"user",name:"identity-provider list",stage:"B",summary:"List identity providers",input:tz({}),output:o.z.array(Li),handler:async function(e){const t=await Qg(e,"user identity-provider list",Vg.externalIdentityLogin),n=await t.client.users.providers(e.signal);return e.output.json?{data:n}:{data:n,columns:Jg,message:n.length?void 0:"No identity providers matched."}}},{id:"user identity-provider create",group:"user",name:"identity-provider create",stage:"B",write:!0,summary:"Create an identity provider",options:[Bz],input:tz({config:o.z.string()}),output:Li,handler:async function(e,t){const n=$p(t,"Identity provider create request"),i=await Qg(e,"user identity-provider create",Vg.externalIdentityLogin),o=await Cp(e,"user identity-provider create",()=>({method:"POST",path:"/api/identity-providers",body:n}),()=>i.client.users.createProvider(n));if(o)return{data:o,columns:Jg,message:`Identity provider \`${o.id}\` created.`}}},{id:"user identity-provider update",group:"user",name:"identity-provider update",stage:"B",write:!0,summary:"Update an identity provider",args:[{name:"providerId",description:"Identity provider ID",required:!0}],options:[Bz],input:tz({providerId:o.z.string(),config:o.z.string()}),output:Li,handler:async function(e,t){const n=kp(t,"providerId"),i=$p(t,"Identity provider update request"),o=await Qg(e,"user identity-provider update",Vg.externalIdentityLogin),a=await Cp(e,"user identity-provider update",()=>({method:"PATCH",path:`/api/identity-providers/${encodeURIComponent(n)}`,body:i}),()=>o.client.users.updateProvider(n,i));if(a)return{data:a,columns:Jg,message:`Identity provider \`${n}\` updated.`}}},{id:"user identity-provider remove",group:"user",name:"identity-provider remove",stage:"B",write:!0,summary:"Remove an identity provider",args:[{name:"providerId",description:"Identity provider ID",required:!0}],input:tz({providerId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"providerId"),i=await Qg(e,"user identity-provider remove",Vg.externalIdentityLogin),o=await Cp(e,"user identity-provider remove",()=>({method:"DELETE",path:`/api/identity-providers/${encodeURIComponent(n)}`}),()=>i.client.users.removeProvider(n));if(o)return{data:o,message:`Identity provider \`${n}\` removed.`}}},{id:"user external-identity list",group:"user",name:"external-identity list",stage:"B",summary:"List pending external identity approvals",input:tz({}),output:o.z.array(Di),handler:async function(e){const t=await Qg(e,"user external-identity list",Vg.externalIdentityLogin),n=await t.client.users.approvals(e.signal);return e.output.json?{data:n}:{data:n,columns:Zg,message:n.length?void 0:"No pending identity approvals."}}},{id:"user external-identity approve",group:"user",name:"external-identity approve",stage:"B",write:!0,summary:"Approve an external identity binding",args:[{name:"approvalId",description:"Approval ID",required:!0}],options:[{flags:"--config <file>",description:"Approval request JSON (optional)"}],input:tz({approvalId:o.z.string(),config:o.z.string().optional()}),output:Ui,handler:async function(e,t){const n=kp(t,"approvalId"),i=jp(t,"config")?$p(t,"Identity approval request"):{},o=await Qg(e,"user external-identity approve",Vg.externalIdentityLogin),a=await Cp(e,"user external-identity approve",()=>({method:"POST",path:`/api/external-identity-approvals/${encodeURIComponent(n)}/approve`,body:i}),()=>o.client.users.approveIdentity(n,i));if(a)return{data:a,columns:Gg,message:`Identity approval \`${n}\` approved.`}}},{id:"user external-identity reject",group:"user",name:"external-identity reject",stage:"B",write:!0,summary:"Reject an external identity binding",args:[{name:"approvalId",description:"Approval ID",required:!0}],input:tz({approvalId:o.z.string()}),output:Xg,outputPinned:!1,handler:async function(e,t){const n=kp(t,"approvalId"),i=await Qg(e,"user external-identity reject",Vg.externalIdentityLogin),o=await Cp(e,"user external-identity reject",()=>({method:"POST",path:`/api/external-identity-approvals/${encodeURIComponent(n)}/reject`,body:{}}),()=>i.client.users.rejectIdentity(n));if(o)return{data:o,message:`Identity approval \`${n}\` rejected.`}}}],Fz=tz({origin:o.z.string(),label:o.z.string().optional()}),Vz=tz({label:o.z.string()}),Gz=nz("profile","Manage Control Plane profiles",[{id:"profile add",group:"profile",name:"add",stage:"A",summary:"Add a Control Plane profile and pin its identity fingerprint",args:[{name:"origin",description:"Control Plane origin, for example https://control.example.com",required:!0}],options:[{flags:"--label <label>",description:"Profile label (defaults to the host name)"}],input:Fz,output:w,examples:["thctl profile add https://control.example.com","thctl profile add http://127.0.0.1:8787 --label local"],handler:async function(e,t){const n=function(e){let t;try{t=new URL(e.trim())}catch{throw u("CLI_ORIGIN_INVALID","Enter a Control Plane URL such as `https://control.example.com`.")}if(t.username||t.password||t.search||t.hash)throw u("CLI_ORIGIN_INVALID","The Control Plane address cannot contain credentials, query parameters, or a fragment.");if("/"!==t.pathname&&""!==t.pathname)throw u("CLI_ORIGIN_INVALID","Enter the Control Plane origin without a page or API path.");return t.origin}(pg(t.args.origin,"origin")),i=await Qu(n,e.fetchImpl),o=e.store.findByOrigin(n);if(o&&(o.controlPlaneId!==i.payload.controlPlaneId||o.fingerprint!==i.payload.publicKey.fingerprint))throw new m("CLI_IDENTITY_CHANGED",`Profile \`${o.label}\` is pinned to a different identity. Run \`thctl profile trust ${o.label}\` after verifying the new fingerprint ${i.payload.publicKey.fingerprint}.`,13,{profile:o.label});const a=o??e.store.findByControlPlane(i.payload.controlPlaneId,i.payload.publicKey.fingerprint),r=t.options.label?.trim()||a?.label||R(n),s=(new Date).toISOString(),d=w.parse({label:r,origin:n,controlPlaneId:i.payload.controlPlaneId,fingerprint:i.payload.publicKey.fingerprint,protocolVersion:i.payload.protocolVersion,capabilities:i.payload.capabilities,createdAt:a?.createdAt??s,updatedAt:s,trustedAt:s,lastUsedAt:s,...a?.loginMode?{loginMode:a.loginMode}:{}});return e.store.save(d),e.store.defaultProfile()||e.store.setDefault(r),{data:d,columns:[{key:"label",header:"profile"},{key:"origin",header:"origin"},{key:"fingerprint",header:"fingerprint"}],message:a?`Reused existing profile \`${d.label}\` for ${n}.`:`Added profile \`${d.label}\` for ${n}.`}}},{id:"profile list",group:"profile",name:"list",stage:"A",summary:"List configured Control Plane profiles",input:ez,output:o.z.array(w.extend({default:o.z.boolean()})),handler:async function(e){const t=e.store.list(),n=e.store.defaultProfile();return{data:t.map(e=>({...e,default:e.label===n})),columns:[{key:"label",header:"profile"},{key:"origin",header:"origin"},{key:"controlPlaneId",header:"controlPlaneId"},{key:"protocolVersion",header:"protocol"},{key:"fingerprint",header:"fingerprint",width:28},{key:"default",header:"default"}]}}},{id:"profile use",group:"profile",name:"use",stage:"A",summary:"Set the default profile",args:[{name:"label",description:"Profile label",required:!0}],input:Vz,output:o.z.object({defaultProfile:o.z.string()}),handler:async function(e,t){const n=pg(t.args.label,"label");return e.store.setDefault(n),{data:{defaultProfile:n},message:`Default profile is now \`${n}\`.`}}},{id:"profile show",group:"profile",name:"show",stage:"A",summary:"Show one profile, its pinned identity and local sign-in state",args:[{name:"label",description:"Profile label (defaults to the selected profile)"}],input:tz({label:o.z.string().optional()}),output:w.extend({signedIn:o.z.boolean(),sessionExpiresAt:o.z.string().optional()}),handler:async function(e,t){const n=t.args.label?.trim(),i=n?e.store.get(n):e.store.select(e.profile,e.env);if(!i)throw new m("CLI_PROFILE_UNKNOWN",`Unknown profile \`${n}\`.`,7,{profile:n});const o=e.store.secrets().read(i.label);return{data:{...i,signedIn:Boolean(o),...o?.expiresAt?{sessionExpiresAt:o.expiresAt}:{}}}}},{id:"profile remove",group:"profile",name:"remove",stage:"A",write:!0,summary:"Remove a profile and its local credentials",args:[{name:"label",description:"Profile label",required:!0}],input:Vz,output:o.z.object({label:o.z.string(),removed:o.z.boolean()}),handler:async function(e,t){const n=pg(t.args.label,"label");if(!e.store.get(n))throw new m("CLI_PROFILE_UNKNOWN",`Unknown profile \`${n}\`.`,7,{profile:n});return Cp(e,`profile remove ${n}`,()=>({method:"DELETE",path:`local:profiles/${n}`}),async()=>{const t=e.store.remove(n);return{data:{label:n,removed:t},message:t?`Removed profile \`${n}\`.`:void 0}})}},{id:"profile trust",group:"profile",name:"trust",stage:"A",write:!0,summary:"Re-pin the identity fingerprint of an existing profile after verifying it",args:[{name:"label",description:"Profile label",required:!0}],input:Vz,output:w,handler:async function(e,t){const n=pg(t.args.label,"label"),i=e.store.get(n);if(!i)throw new m("CLI_PROFILE_UNKNOWN",`Unknown profile \`${n}\`.`,7,{profile:n});const o=await Qu(i.origin,e.fetchImpl),a=o.payload.publicKey.fingerprint,r=i.fingerprint;if(e.output.warn(`Pinned fingerprint: ${r}\nPresented fingerprint: ${a}`),r===a)return{data:{label:n,fingerprint:a,trusted:!0,changed:!1},message:`Profile \`${n}\` already trusts this Control Plane identity.`};if(o.payload.controlPlaneId!==i.controlPlaneId)throw new m("CLI_IDENTITY_MISMATCH",`Profile \`${n}\` is pinned to Control Plane ${i.controlPlaneId}, but ${i.origin} now presents ${o.payload.controlPlaneId}. Refusing to re-trust a different Control Plane; add it as a new profile instead.`,13);return Cp(e,`profile trust ${n}`,()=>({method:"PATCH",path:`local:profiles/${n}`,body:{fingerprint:a}}),async()=>{const t=(new Date).toISOString();return{data:e.store.save({...i,fingerprint:a,protocolVersion:o.payload.protocolVersion,capabilities:o.payload.capabilities,trustedAt:t,updatedAt:t,identityChangedAt:t,replacedFingerprint:r}),message:`Profile \`${n}\` now trusts ${a}.`}})}}]),Yz=nz("auth","Authenticate the CLI against a Control Plane",[{id:"login",group:"auth",name:"login",stage:"A",summary:"Authorize this CLI through the Control Plane web login",options:[{flags:"--device",description:"Use the device authorization flow for machines without a browser"}],input:tz({device:o.z.boolean().optional()}),output:o.z.object({profile:o.z.string(),sessionId:o.z.string(),expiresAt:o.z.string(),loginMode:o.z.enum(["browser","device"])}),examples:["thctl login","thctl login --device --profile prod"],handler:async function(e,t){const n=await vp(e),i=t.options.device?"device":"browser",o=await async function(e){return"device"===e.mode?async function(e){const{store:t,fetchImpl:n,output:i}=e,o=e.sleep??(e=>new Promise(t=>setTimeout(t,e))),a=await hg({store:t,profileLabel:e.profileLabel,fetchImpl:n}),r=await a.client.auth.cliAuthorize({mode:"device",client:Gu()});if("device"!==r.mode)throw z("The Control Plane returned a browser authorization for a device request.");i.message(`Open this URL on any device and confirm the code:\n${r.verificationUri}\nUser code: ${r.userCode}`);let s=1e3*Math.max(1,r.intervalSeconds);const d=Date.parse(r.expiresAt);for(;;){if(Date.now()>=d)throw new m("CLI_AUTHORIZATION_EXPIRED","The device authorization expired before it was approved. Run `thctl login --device` again.",5);await o(e.pollIntervalMs??s);try{const e=await a.client.auth.cliToken({grantType:"urn:ietf:params:oauth:grant-type:device_code",requestId:r.requestId});return await yg(a,e,"device"),{profile:a.profile,session:e.session}}catch(e){if(!(e instanceof m))throw e;if("CLI_AUTHORIZATION_PENDING"===e.code)continue;if("CLI_AUTHORIZATION_SLOW_DOWN"===e.code){const t=Number(e.details?.intervalSeconds);s=Math.max(s+5e3,Number.isFinite(t)?1e3*t:0);continue}throw e}}}(e):fg(e)}({profileLabel:n.label,mode:i,store:e.store,fetchImpl:e.fetchImpl,output:e.output,openUrl:e.openUrl,sleep:e.sleep});return{data:{profile:o.profile.label,sessionId:o.session.id,expiresAt:o.session.expiresAt,loginMode:i},message:`Signed in to ${o.profile.origin} as ${o.session.user.primaryUsername||o.session.user.displayName}.`}}},{id:"logout",group:"auth",name:"logout",stage:"A",summary:"Revoke the stored CLI session on the server and locally",input:ez,output:o.z.object({profile:o.z.string(),revoked:o.z.boolean()}),handler:async function(e){const t=await vp(e);if(!e.store.secrets().read(t.label))return{data:{profile:t.label,revoked:!1},message:`No stored CLI session for \`${t.label}\`.`};let n=!1;try{const i=await xp(e,{profile:t});n=(await i.client.auth.logoutCli()).ok}catch(e){if(!(e instanceof m)||5!==e.exitCode)throw e}finally{e.store.secrets().remove(t.label)}return{data:{profile:t.label,revoked:n},message:n?`Signed out of ${t.origin}.`:`Local CLI credentials for \`${t.label}\` were cleared.`}}},{id:"whoami",group:"auth",name:"whoami",stage:"A",summary:"Show the signed-in user, profile and pinned Control Plane identity",input:ez,output:o.z.looseObject({}),handler:async function(e){const t=await vp(e),n=await xp(e,{profile:t}),i=e.store.secrets().read(t.label),o=await n.client.auth.session();if(!o.authenticated||!o.user)throw new m("CLI_NOT_AUTHENTICATED",`The stored CLI session for \`${t.label}\` is not valid. Run \`thctl login\`.`,5);return{data:{profile:t.label,origin:t.origin,controlPlaneId:n.identity.payload.controlPlaneId,protocolVersion:n.identity.payload.protocolVersion,user:o.user,authorization:o.authorization,...i?.mode?{sessionMode:i.mode}:{},...i?.sessionId?{sessionId:i.sessionId}:{},...i?.expiresAt?{sessionExpiresAt:i.expiresAt}:{}},columns:[{key:"profile",header:"profile"},{key:"origin",header:"origin"},{key:"controlPlaneId",header:"controlPlaneId"},{key:"sessionExpiresAt",header:"expires"}],message:"local-trust"===i?.mode?`Connected to the local Control Plane at ${t.origin} as ${o.user.displayName} (local trust session).`:`Signed in to ${t.origin} as ${o.user.primaryUsername||o.user.displayName}.`}}}],{flat:!0}),Wz={name:"instanceId",description:"Controlled instance ID",required:!0},Kz=nz("instance","Inspect and control instances",[{id:"instance list",group:"instance",name:"list",stage:"A",summary:"List controlled instances from the authoritative directory projection",options:[{flags:"--node <nodeId>",description:"Only instances on this node"}],input:tz({node:o.z.string().optional()}),output:ea,handler:async function(e,t){const n=await xp(e),i=await n.client.resources.instanceBoard(e.signal),o="string"==typeof t.options.node?t.options.node.trim():"",a=o?i.filter(e=>e.nodeId===o):i;return{data:a,columns:ig,message:a.length?void 0:"No controlled instances matched."}}},{id:"instance show",group:"instance",name:"show",stage:"A",summary:"Show one controlled instance from the authoritative directory projection",args:[Wz],input:tz({instanceId:o.z.string()}),output:Xo,handler:async function(e,t){const n=ng(t),i=await xp(e),o=(await i.client.resources.instanceBoard(e.signal)).find(e=>e.id===n);if(!o)throw new m("CLI_INSTANCE_NOT_FOUND",`No controlled instance \`${n}\` is visible to this account.`,7,{instanceId:n});return{data:o,columns:ig}}},{id:"instance create",group:"instance",name:"create",stage:"B",write:!0,summary:"Create a controlled instance from a JSON request body",options:[{flags:"--config <file>",description:"Instance create request JSON (Control Plane wire body)"},{flags:"--name <name>",description:"Override the instance display name"},{flags:"--node <nodeId>",description:"Override the target node"},{flags:"--start",description:"Set start: true (server default is false)"}],input:tz({config:o.z.string(),name:o.z.string().optional(),node:o.z.string().optional(),start:o.z.boolean().optional()}),output:Fd,examples:["thctl instance create --config ./instance.json --start","thctl instance create --config ./instance.json --name demo --node node_x --dry-run"],handler:async function(e,t){const n=Pp(Rp(t,"config"),Bd,"instance config"),i=jp(t,"name"),o=jp(t,"node"),a={...n,...i?{name:i}:{},...o?{nodeId:o}:{},...!0===t.options.start?{start:!0}:{}},r=await xp(e),s=await Cp(e,"instance create",()=>({method:"POST",path:"/api/controlled-instances",body:a}),()=>r.client.resources.createInstance(a));if(!s)return;const d="failed"===s.startOutcome.status?`Instance \`${s.id}\` created but start failed: ${s.startOutcome.error?.message??"unknown error"}.`:"started"===s.startOutcome.status?`Instance \`${s.id}\` created; start requested (status: ${s.status}).`:`Instance \`${s.id}\` created (status: ${s.status}).`;return{data:s,columns:dg,message:d}}},{id:"instance delete",group:"instance",name:"delete",stage:"B",write:!0,summary:"Delete a controlled instance, optionally deleting its volumes",args:[Wz],options:[{flags:"--volumes",description:"Also delete the instance's managed volumes (irreversible)"}],input:tz({instanceId:o.z.string(),volumes:o.z.boolean().optional()}),output:Kr,examples:["thctl instance delete <instanceId> --yes","thctl instance delete <instanceId> --volumes --yes"],handler:async function(e,t){const n=ng(t),i=Yr.parse({deleteVolumes:!0===t.options.volumes}),o=await xp(e),a=await Cp(e,`instance delete ${n}`,()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}`,body:i}),()=>o.client.resources.deleteInstance(n,i));if(a){if(!a.completed)throw new m("CLI_INSTANCE_DELETE_INCOMPLETE",`Instance \`${n}\` deletion is incomplete; re-run the same command after resolving the failed volumes.`,8,{instanceId:n,volumeResults:a.volumeResults});return{data:a,columns:cg,message:a.retainedVolumes.length?`Instance \`${n}\` deleted; ${a.retainedVolumes.length} volume(s) retained (pass --volumes to delete them).`:`Instance \`${n}\` deleted.`}}}},{id:"instance start",group:"instance",name:"start",stage:"A",write:!0,summary:"Start a controlled instance",args:[Wz],input:tz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:ag},{id:"instance stop",group:"instance",name:"stop",stage:"A",write:!0,summary:"Stop a controlled instance",args:[Wz],input:tz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:rg},{id:"instance restart",group:"instance",name:"restart",stage:"A",write:!0,summary:"Restart a controlled instance",args:[Wz],input:tz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:sg},{id:"instance logs",group:"instance",name:"logs",stage:"C",summary:"Stream instance logs (planned with the events stream work)",args:[Wz],options:[{flags:"--follow",description:"Keep streaming new log lines"}],input:tz({instanceId:o.z.string(),follow:o.z.boolean().optional()}),output:Xg,outputPinned:!1},{id:"instance rename",group:"instance",name:"rename",stage:"B",write:!0,summary:"Rename a controlled instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"name",description:"New display name",required:!0}],input:tz({instanceId:o.z.string(),name:o.z.string()}),output:o.z.object({id:o.z.string(),name:o.z.string()}),handler:async function(e,t){const n=ng(t),i=t.args.name?.trim();if(!i)throw new m("CLI_ARGUMENT_MISSING","Missing required argument <name>.",2);const o=await xp(e),a=await Cp(e,`instance rename ${n}`,()=>({method:"PATCH",path:`/api/controlled-instances/${encodeURIComponent(n)}`,body:{name:i}}),()=>o.client.resources.updateInstanceName(n,i));if(a)return{data:a,columns:[{key:"id",header:"instance"},{key:"name",header:"name",width:24}],message:`Instance \`${n}\` renamed to \`${a.name}\`.`}}}]),Jz=nz("ai-session","Inspect and drive AI sessions",[{id:"ai-session list",group:"ai-session",name:"list",stage:"A",summary:"List AI sessions across visible instances",options:[{flags:"--instance <instanceId>",description:"Only sessions of this instance"}],input:tz({instance:o.z.string().optional()}),output:qn,handler:async function(e,t){const n=await xp(e),i="string"==typeof t.options.instance?t.options.instance.trim():"",o=await n.client.aiSessions.list(e.signal,i||void 0);if(e.output.json)return{data:o};const a=o.instances.flatMap(e=>e.aiSessions.sessions.map(t=>({...t,instanceId:e.instanceId,title:t.title||t.userPrompt||t.summary||t.id})));return{data:a,columns:_p,message:a.length?void 0:"No AI sessions matched."}}},{id:"ai-session show",group:"ai-session",name:"show",stage:"A",summary:"Show one AI session projection",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string()}),output:yt,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=await xp(e),a=await o.client.aiSessions.detail(n,i,void 0,e.signal);if(e.output.json)return{data:a};if("not-modified"===a.kind)return{data:a,message:`Session \`${i}\` is unchanged at revision ${a.revision}.`};const r=a.detail;return{data:{id:r.id,cwd:r.cwd??"",model:r.modelSelection?.modelName??"",queued:r.queue?.pendingCount??0,subAgents:r.subAgents?.length??0,error:r.error??""},columns:[{key:"id",header:"session"},{key:"cwd",header:"cwd",width:40},{key:"model",header:"model"},{key:"queued",header:"queued"},{key:"subAgents",header:"subagents"},{key:"error",header:"error",width:40}]}}},{id:"ai-session history",group:"ai-session",name:"history",stage:"B",summary:"List provider session history for an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],options:[{flags:"--agent <agent>",description:"Restrict to one agent",repeatable:!0}],input:tz({instanceId:o.z.string(),agent:o.z.array(o.z.string()).optional()}),output:St,handler:async function(e,t){const n=kp(t,"instanceId"),i=Tp(t,"agent"),o=await xp(e),a=await o.client.aiSessions.history(n,e.signal,i.length?i:void 0);if(e.output.json)return{data:a};const r=a.items.map(e=>({...e,title:e.title||e.userPrompt||e.lastMessage||e.providerSessionId}));return{data:r,columns:[{key:"id",header:"session"},{key:"agent",header:"agent"},{key:"title",header:"title",width:40},{key:"cwd",header:"cwd",width:30},{key:"lastActiveAt",header:"last active"}],message:r.length?void 0:"No provider session history matched."}}},{id:"ai-session turns",group:"ai-session",name:"turns",stage:"B",summary:"List turn index entries of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--revision <revision>",description:"Return not-modified when this revision already matches"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),revision:o.z.string().optional()}),output:ft,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=jp(t,"revision"),a=await xp(e),r=await a.client.aiSessions.turnIndex(n,i,o,e.signal);return e.output.json?{data:r}:"not-modified"===r.kind?{data:r,message:`Turn index for \`${i}\` is unchanged at revision ${r.revision}.`}:{data:r.index.turns,columns:[{key:"id",header:"turn",width:40},{key:"status",header:"status"},{key:"phase",header:"phase"},{key:"startedAt",header:"started"},{key:"completedAt",header:"completed"}],message:r.index.turns.length?void 0:`AI session \`${i}\` has no turns yet.`}}},{id:"ai-session turn",group:"ai-session",name:"turn",stage:"B",summary:"Show one turn body of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"turnId",description:"Turn ID",required:!0}],options:[{flags:"--revision <revision>",description:"Return not-modified when this revision already matches"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),turnId:o.z.string(),revision:o.z.string().optional()}),output:It,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=kp(t,"turnId"),a=jp(t,"revision"),r=await xp(e),s=await r.client.aiSessions.turnBody(n,i,o,a,e.signal);if(e.output.json)return{data:s};if("not-modified"===s.kind)return{data:s,message:`Turn \`${o}\` is unchanged at revision ${s.revision}.`};const d=s.body.turn;return{data:[...(d.userMessages??[]).map(e=>({kind:"user",message:e.id,text:e.text})),...d.lastMessage?[{kind:"assistant",message:d.lastMessageItemId??"",text:d.lastMessage}]:[]],columns:[{key:"kind",header:"kind"},{key:"message",header:"message",width:24},{key:"text",header:"text",width:60}],message:`Turn \`${o}\` is ${d.status}.`}}},{id:"ai-session timeline",group:"ai-session",name:"timeline",stage:"B",summary:"Show the conversation timeline of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string()}),output:ee,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=await xp(e),a=await o.client.aiSessions.timeline(n,i,e.signal);return e.output.json?{data:a}:{data:qp(a.items),columns:Lp,message:a.items.length?void 0:`AI session \`${i}\` has no timeline items.`}}},{id:"ai-session turn-timeline",group:"ai-session",name:"turn-timeline",stage:"B",summary:"Show the timeline of one AI session turn",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"turnId",description:"Turn ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),turnId:o.z.string()}),output:te,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=kp(t,"turnId"),a=await xp(e),r=await a.client.aiSessions.turnTimeline(n,i,o,e.signal);return e.output.json?{data:r}:{data:qp(r.items),columns:Lp,message:r.items.length?void 0:`Turn \`${o}\` has no timeline items.`}}},{id:"ai-session create",group:"ai-session",name:"create",stage:"B",write:!0,summary:"Create an AI session on an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],options:[{flags:"--prompt <text>",description:"Initial prompt"},{flags:"--agent <agent>",description:"Agent kind (codex, claude, opencode)"},{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder to run in"},{flags:"--story <storyId>",description:"Story to attach the session to"},{flags:"--request-id <id>",description:"Client request ID for retry-safe creation"}],input:tz({instanceId:o.z.string(),prompt:o.z.string(),agent:o.z.string(),cwdFolder:o.z.string().optional(),story:o.z.string().optional(),requestId:o.z.string().optional()}),output:Ge,handler:async function(e,t){const n=kp(t,"instanceId"),i={agent:Rp(t,"agent"),message:Rp(t,"prompt"),clientRequestId:jp(t,"request-id")??a.randomUUID(),attachments:[],references:[],...jp(t,"cwd-folder")?{cwdFolderId:jp(t,"cwd-folder")}:{},...jp(t,"story")?{storyId:jp(t,"story")}:{}},o=await xp(e),r=await Cp(e,"ai-session create",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/ai-sessions`,body:i}),()=>o.client.aiSessions.create(n,i));if(r)return{data:r,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"providerSessionId",header:"provider session"}],message:`AI session \`${r.aiSessionId}\` is ${r.disposition}.`}}},{id:"ai-session send",group:"ai-session",name:"send",stage:"B",write:!0,summary:"Send a message to an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"message",description:"Message text",required:!0}],options:[{flags:"--mode <auto|queue|steer|immediate>",description:"Delivery mode"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),message:o.z.string(),mode:o.z.string().optional()}),output:xt,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=kp(t,"message"),a=jp(t,"mode"),r=a?function(e){const t=ze.safeParse(e);if(!t.success)throw new m("CLI_INVALID_OPTION",`--mode must be one of: ${ze.options.join(", ")}.`,2,{option:"mode",value:e});return t.data}(a):void 0,s={message:o,...r?{mode:r}:{}},d=await xp(e),c=await Cp(e,"ai-session send",()=>({method:"POST",path:`${Up(n,i)}/messages`,body:s}),()=>d.client.aiSessions.sendMessage(n,i,s));if(c)return{data:c,message:`Message sent to AI session \`${i}\`.`}}},{id:"ai-session interrupt",group:"ai-session",name:"interrupt",stage:"B",write:!0,summary:"Interrupt the active turn of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string()}),output:xt,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=await xp(e),a=await Cp(e,"ai-session interrupt",()=>({method:"POST",path:`${Up(n,i)}/interrupt`}),()=>o.client.aiSessions.interrupt(n,i));if(a)return{data:a,message:`Interrupt requested for AI session \`${i}\`.`}}},{id:"ai-session approval",group:"ai-session",name:"approval",stage:"B",write:!0,summary:"Answer a pending approval request of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--decision <allow|deny|skip>",description:"Approval decision"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),decision:o.z.enum(["allow","deny","skip"])}),output:xt,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=function(e){const t=tt.safeParse({decision:e});if(!t.success)throw new m("CLI_INVALID_OPTION","--decision must be one of: allow, deny, skip.",2,{option:"decision",value:e});return t.data}(Rp(t,"decision")),a=await xp(e),r=await Cp(e,"ai-session approval",()=>({method:"POST",path:`${Up(n,i)}/approval`,body:o}),()=>a.client.aiSessions.approval(n,i,o.decision));if(r)return{data:r,message:`Approval \`${o.decision}\` submitted for AI session \`${i}\`.`}}},{id:"ai-session resume",group:"ai-session",name:"resume",stage:"B",write:!0,summary:"Resume a suspended AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string()}),output:jt,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=await xp(e),a=await Cp(e,"ai-session resume",()=>({method:"POST",path:`${Up(n,i)}/resume`,body:{}}),()=>o.client.aiSessions.resume(n,i,{}));if(a)return{data:a,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"providerSessionId",header:"provider session"}],message:`AI session \`${i}\` is ${a.disposition}.`}}},{id:"ai-session read",group:"ai-session",name:"read",stage:"B",write:!0,summary:"Mark an AI session as read",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string()}),output:Ve,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=await xp(e),a=await Cp(e,"ai-session read",()=>({method:"POST",path:`${Up(n,i)}/read`}),()=>o.client.aiSessions.markRead(n,i));if(a)return{data:a,message:`AI session \`${i}\` marked as read.`}}},{id:"ai-session rename",group:"ai-session",name:"rename",stage:"B",write:!0,summary:"Rename an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--title <title>",description:"New session title"},{flags:"--request-id <id>",description:"Client request ID for retry-safe rename"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),title:o.z.string(),requestId:o.z.string().optional()}),output:we,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o={title:Rp(t,"title"),clientRequestId:jp(t,"request-id")??a.randomUUID()},r=await xp(e),s=await Cp(e,"ai-session rename",()=>({method:"PUT",path:`${Up(n,i)}/title`,body:o}),()=>r.client.aiSessions.rename(n,i,o));if(s)return{data:s,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"title",header:"title",width:40}],message:`AI session \`${s.aiSessionId}\` is ${s.disposition}.`}}},{id:"ai-session fork",group:"ai-session",name:"fork",stage:"B",write:!0,summary:"Fork an AI session into a new session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--through-turn <turnId>",description:"Fork after this turn"},{flags:"--workspace <current|managed-worktree>",description:"Workspace mode for the fork"},{flags:"--request-id <id>",description:"Client request ID for retry-safe fork"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),throughTurn:o.z.string().optional(),workspace:o.z.string().optional(),requestId:o.z.string().optional()}),output:Ke,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=jp(t,"through-turn"),r=jp(t,"workspace"),s=Ep(We,{clientRequestId:jp(t,"request-id")??a.randomUUID(),...o?{throughTurnId:o}:{},...r?{workspace:{mode:r}}:{}},"fork input"),d=await xp(e),c=await Cp(e,"ai-session fork",()=>({method:"POST",path:`${Up(n,i)}/fork`,body:s}),()=>d.client.aiSessions.fork(n,i,s));if(c)return{data:c,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"providerSessionId",header:"provider session"}],message:`AI session \`${c.aiSessionId}\` is ${c.disposition}.`}}},{id:"ai-session close",group:"ai-session",name:"close",stage:"B",write:!0,summary:"Close an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--request-id <id>",description:"Client request ID for retry-safe close"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),requestId:o.z.string().optional()}),output:Xe,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=jp(t,"request-id")??a.randomUUID(),r=await xp(e),s=await Cp(e,"ai-session close",()=>({method:"POST",path:`${Up(n,i)}/close`,body:{clientRequestId:o}}),()=>r.client.aiSessions.close(n,i,o));if(s)return{data:s,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"providerSessionId",header:"provider session"}],message:`AI session \`${s.aiSessionId}\` is ${s.disposition}.`}}},{id:"ai-session model",group:"ai-session",name:"model",stage:"B",write:!0,summary:"Switch the model of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--entity <modelEntityId>",description:"Model entity ID"},{flags:"--name <modelName>",description:"Model name within the entity"},{flags:"--request-id <id>",description:"Client request ID for retry-safe switching"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),entity:o.z.string(),name:o.z.string(),requestId:o.z.string().optional()}),output:Me,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o={modelEntityId:Rp(t,"entity"),modelName:Rp(t,"name")},r=jp(t,"request-id")??a.randomUUID(),s=await xp(e),d=await Cp(e,"ai-session model",()=>({method:"PUT",path:`${Up(n,i)}/model-selection`,body:{clientRequestId:r,modelSelection:o}}),()=>s.client.aiSessions.updateModelSelection(n,i,r,o));if(d)return{data:d,columns:[{key:"sessionId",header:"session"},{key:"accepted",header:"accepted"}],message:`Model selection for AI session \`${i}\` updated.`}}},{id:"ai-session reasoning",group:"ai-session",name:"reasoning",stage:"B",write:!0,summary:"Set the reasoning effort of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--effort <none|minimal|low|medium|high|xhigh|max|ultra>",description:"Reasoning effort"},{flags:"--request-id <id>",description:"Client request ID for retry-safe updates"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),effort:o.z.string(),requestId:o.z.string().optional()}),output:Fe,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=Rp(t,"effort"),r=Ne.safeParse(o);if(!r.success)throw new m("CLI_INVALID_OPTION",`--effort must be one of: ${Ne.options.join(", ")}.`,2,{option:"effort",value:o});const s=jp(t,"request-id")??a.randomUUID(),d=await xp(e),c=await Cp(e,"ai-session reasoning",()=>({method:"PUT",path:`${Up(n,i)}/reasoning-effort`,body:{clientRequestId:s,reasoningEffort:r.data}}),()=>d.client.aiSessions.updateReasoningEffort(n,i,s,r.data));if(c)return{data:c,columns:[{key:"sessionId",header:"session"},{key:"accepted",header:"accepted"}],message:`Reasoning effort for AI session \`${i}\` updated.`}}},{id:"ai-session queue list",group:"ai-session",name:"queue list",stage:"B",summary:"List queued messages of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string()}),output:at,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=await xp(e),a=Op(await o.client.aiSessions.detail(n,i,void 0,e.signal),i).queue;return e.output.json?{data:a}:{data:a.items,columns:[{key:"id",header:"queue"},{key:"status",header:"status"},{key:"message",header:"message",width:50},{key:"createdAt",header:"created"}],message:a.items.length?void 0:"No queued messages."}}},{id:"ai-session queue steer",group:"ai-session",name:"queue steer",stage:"B",write:!0,summary:"Steer a queued message into the active turn",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"queueId",description:"Queued message ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:xt,handler:Mp},{id:"ai-session queue retry",group:"ai-session",name:"queue retry",stage:"B",write:!0,summary:"Retry a failed queued message",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"queueId",description:"Queued message ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:vt,handler:Bp},{id:"ai-session queue remove",group:"ai-session",name:"queue remove",stage:"B",write:!0,summary:"Remove a queued message",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"queueId",description:"Queued message ID",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:vt,handler:Hp},{id:"ai-session queue edit",group:"ai-session",name:"queue edit",stage:"B",write:!0,summary:"Edit a queued message of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"queueId",description:"Queued message ID",required:!0}],options:[{flags:"--message <text>",description:"Replacement message text"},{flags:"--expected-revision <revision>",description:"Queue revision for optimistic concurrency (defaults to the current queue)"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string(),message:o.z.string(),expectedRevision:o.z.string().optional()}),output:vt,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=kp(t,"queueId"),a=Rp(t,"message"),r=await xp(e),s={expectedRevision:await Fp(e,r,n,i,t),message:a},d=await Cp(e,"ai-session queue edit",()=>({method:"PATCH",path:`${Up(n,i)}/queue/${encodeURIComponent(o)}`,body:s}),()=>r.client.aiSessions.editQueue(n,i,o,s));if(d)return{data:d,message:`Queued message \`${o}\` updated.`}}},{id:"ai-session queue reorder",group:"ai-session",name:"queue reorder",stage:"B",write:!0,summary:"Reorder queued messages of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--queue <queueId>",description:"Queued message ID in the new order",repeatable:!0},{flags:"--expected-revision <revision>",description:"Queue revision for optimistic concurrency (defaults to the current queue)"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),queue:o.z.array(o.z.string()).optional(),expectedRevision:o.z.string().optional()}),output:vt,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=Tp(t,"queue");if(!o.length)throw new m("CLI_OPTION_MISSING","Pass at least one --queue <queueId> to reorder.",2,{option:"queue"});const a=await xp(e),r={expectedRevision:await Fp(e,a,n,i,t),queueIds:o},s=await Cp(e,"ai-session queue reorder",()=>({method:"PATCH",path:`${Up(n,i)}/queue/reorder`,body:r}),()=>a.client.aiSessions.reorderQueue(n,i,r));if(s)return{data:s,message:`Queue for AI session \`${i}\` reordered.`}}}]),Zz=nz("app-session","Inspect and control app sessions",[{id:"app-session list",group:"app-session",name:"list",stage:"B",summary:"List app sessions across visible instances",options:[{flags:"--instance <instanceId>",description:"Only sessions of this instance"}],input:tz({instance:o.z.string().optional()}),output:ni,handler:async function(e,t){const n=jp(t,"instance"),i=await xp(e),o=await i.client.appSessions.list(e.signal,n);if(e.output.json)return{data:o};const a=o.instances.flatMap(e=>e.appSessions.sessions.map(t=>({...t,instanceId:e.instanceId})));return{data:a,columns:Vp,message:a.length?void 0:"No app sessions matched."}}},{id:"app-session show",group:"app-session",name:"show",stage:"B",summary:"Show one app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:tz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gn,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"appSessionId"),o=await xp(e),a=(await o.client.appSessions.list(e.signal,n)).instances.filter(e=>e.instanceId===n).flatMap(e=>e.appSessions.sessions).find(e=>e.id===i);if(!a)throw new m("CLI_APP_SESSION_NOT_FOUND",`No app session \`${i}\` is visible on instance \`${n}\`.`,7,{instanceId:n,appSessionId:i});return{data:a,columns:Vp}}},{id:"app-session start",group:"app-session",name:"start",stage:"B",write:!0,summary:"Start an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0}],options:[{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder to launch in"}],input:tz({instanceId:o.z.string(),appId:o.z.string(),cwdFolder:o.z.string().optional()}),output:Gn,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"appId"),o=jp(t,"cwd-folder"),a={appId:i,...o?{cwdFolderId:o}:{}},r=await xp(e),s=await Cp(e,"app-session start",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/sessions`,body:a}),()=>r.client.appSessions.launch(n,a));if(s)return{data:s,columns:[{key:"id",header:"app session"},{key:"appId",header:"app"},{key:"status",header:"status"}],message:`App session \`${s.id}\` started.`}}},{id:"app-session stop",group:"app-session",name:"stop",stage:"B",write:!0,summary:"Stop an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:tz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gn,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"appSessionId"),o=await xp(e),a=await Cp(e,"app-session stop",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/sessions/${encodeURIComponent(i)}/stop`,body:{}}),()=>o.client.appSessions.stop(n,i));if(a)return{data:a,columns:[{key:"id",header:"app session"},{key:"status",header:"status"}],message:`App session \`${i}\` is ${a.status}.`}}},{id:"app-session rename",group:"app-session",name:"rename",stage:"B",write:!0,summary:"Rename an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0},{name:"title",description:"New session title",required:!0}],input:tz({instanceId:o.z.string(),appSessionId:o.z.string(),title:o.z.string()}),output:Gn,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"appSessionId"),o=Ep(Gp,kp(t,"title"),"title"),a=await xp(e),r=await Cp(e,"app-session rename",()=>({method:"PATCH",path:Wp(n,i),body:{title:o}}),()=>a.client.appSessions.rename(n,i,o));if(r)return{data:r,columns:[{key:"id",header:"app session"},{key:"title",header:"title",width:40},{key:"status",header:"status"}],message:`App session \`${r.id}\` renamed to \`${r.title??o}\`.`}}},{id:"app-session access",group:"app-session",name:"access",stage:"B",write:!0,summary:"Create a terminal or VNC access lease for an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:tz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Hn,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"appSessionId"),o=await xp(e),a=await Cp(e,"app-session access",()=>({method:"POST",path:`${Wp(n,i)}/access`,body:{}}),()=>o.client.appSessions.access(n,i));if(a)return e.output.json?{data:a}:{data:{...a,url:new URL(a.url,o.identity.origin).toString()},columns:Yp,message:`${a.mode.toUpperCase()} access lease expires at ${a.expiresAt}.`}}},{id:"app-session restart",group:"app-session",name:"restart",stage:"B",write:!0,summary:"Restart an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:tz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gn,handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"appSessionId"),o=await xp(e),a=await Cp(e,"app-session restart",()=>({method:"POST",path:`${Wp(n,i)}/restart`,body:{}}),()=>o.client.appSessions.restart(n,i));if(a)return{data:a,columns:[{key:"id",header:"app session"},{key:"appId",header:"app"},{key:"status",header:"status"}],message:`App session \`${i}\` restarted as \`${a.id}\`.`}}}]),Qz=nz("node","Inspect nodes",[{id:"node list",group:"node",name:"list",stage:"B",summary:"List nodes in the fleet directory",input:ez,output:Jo,handler:async function(e){const t=await xp(e),n=await t.client.resources.nodes(e.signal);return e.output.json?{data:n}:{data:ug(n),columns:mg,message:n.length?void 0:"No nodes matched."}}},{id:"node show",group:"node",name:"show",stage:"B",summary:"Show one node from the fleet directory",args:[{name:"nodeId",description:"Node ID",required:!0}],input:tz({nodeId:o.z.string()}),output:Ko,handler:async function(e,t){const n=kp(t,"nodeId"),i=await xp(e),o=(await i.client.resources.nodes(e.signal)).find(e=>e.id===n);if(!o)throw new m("CLI_NODE_NOT_FOUND",`No node \`${n}\` is visible in the fleet directory.`,7,{nodeId:n});return{data:o,columns:mg}}},{id:"node rename",group:"node",name:"rename",stage:"B",write:!0,summary:"Rename a node",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"name",description:"New display name",required:!0}],input:tz({nodeId:o.z.string(),name:o.z.string()}),output:o.z.object({id:o.z.string(),name:o.z.string()}),handler:async function(e,t){const n=kp(t,"nodeId"),i=kp(t,"name"),o=await xp(e),a=await Cp(e,"node rename",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}`,body:{name:i}}),()=>o.client.resources.updateNodeName(n,i));if(a)return{data:a,columns:[{key:"id",header:"node"},{key:"name",header:"name"}],message:`Node \`${n}\` renamed to \`${a.name}\`.`}}},...hz]),Xz={flags:"--node <nodeId>",description:"Node that owns the story (resolved from the directory when omitted)"},eh=[{name:"storyId",description:"Story ID",required:!0},{name:"automationId",description:"Automation ID",required:!0}],th=tz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional()}),nh={flags:"--config <file>",description:"Story automation JSON file"},ih=tz({storyId:o.z.string(),node:o.z.string().optional(),config:o.z.string()}),oh=tz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional(),config:o.z.string()}),ah=nz("story","Work with stories, documents and automations",[{id:"story list",group:"story",name:"list",stage:"B",summary:"List stories across visible nodes",input:ez,output:o.z.object({stories:o.z.array(Gc),unavailableNodeIds:o.z.array(o.z.string())}),handler:async function(e){const t=await xp(e),n=await t.client.stories.list(void 0,e.signal);if(e.output.json)return{data:n};const i=n.unavailableNodeIds.length?`Unavailable nodes: ${n.unavailableNodeIds.join(", ")}`:n.stories.length?void 0:"No stories matched.";return{data:Sg(n.stories),columns:vg,message:i}}},{id:"story show",group:"story",name:"show",stage:"B",summary:"Show one story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Xz],input:tz({storyId:o.z.string(),node:o.z.string().optional()}),output:Gc,handler:async function(e,t){const n=kp(t,"storyId"),i=await xp(e),o=await Cg(i,n,jp(t,"node"));return Ag(e,await i.client.stories.get(n,o))}},{id:"story create",group:"story",name:"create",stage:"B",write:!0,summary:"Create a story",args:[{name:"title",description:"Story title",required:!0}],options:[Xz,{flags:"--description <description>",description:"Story description"},{flags:"--max-idle-ai-sessions <count>",description:"Idle AI session retention limit"}],input:tz({title:o.z.string(),node:o.z.string().optional(),description:o.z.string().optional(),maxIdleAiSessions:o.z.number().int().nonnegative().optional()}),output:Gc,handler:async function(e,t){const n=kp(t,"title"),i=jp(t,"description"),o=jp(t,"max-idle-ai-sessions"),a={title:n,...i?{description:i}:{},...o?{maxIdleAiSessions:Ug(o,"max-idle-ai-sessions")}:{}},r=await xp(e),s=await async function(e,t){if(t)return t;const n=await e.client.resources.nodes();if(1===n.length)return n[0].id;throw u("CLI_NODE_REQUIRED",0===n.length?"No node is registered; register a node before creating stories.":`More than one node is registered (${n.map(e=>e.id).join(", ")}); pass --node <nodeId>.`,{nodeIds:n.map(e=>e.id)})}(r,jp(t,"node")),d=await Cp(e,"story create",()=>({method:"POST",path:"/api/stories",body:{nodeId:s,input:a}}),()=>r.client.stories.create(s,a));if(d)return{...Ag(e,d),message:`Story \`${d.id}\` created on node \`${s}\`.`}}},{id:"story update",group:"story",name:"update",stage:"B",write:!0,summary:"Update story metadata",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Xz,{flags:"--title <title>",description:"New title"},{flags:"--description <description>",description:"New description"},{flags:"--max-idle-ai-sessions <count>",description:"Idle AI session retention limit"}],input:tz({storyId:o.z.string(),node:o.z.string().optional(),title:o.z.string().optional(),description:o.z.string().optional(),maxIdleAiSessions:o.z.number().int().nonnegative().optional()}),output:Gc,handler:async function(e,t){const n=kp(t,"storyId"),i=jp(t,"title"),o=jp(t,"description"),a=jp(t,"max-idle-ai-sessions"),r={...i?{title:i}:{},...o?{description:o}:{},...a?{maxIdleAiSessions:Ug(a,"max-idle-ai-sessions")}:{}};if(0===Object.keys(r).length)throw u("CLI_OPTION_MISSING","Provide at least one of --title, --description or --max-idle-ai-sessions.",{command:"story update"});const s=await xp(e),d=await Cg(s,n,jp(t,"node")),c=await Cp(e,"story update",()=>({method:"PATCH",path:`/api/stories/${encodeURIComponent(n)}`,body:{nodeId:d,input:r}}),()=>s.client.stories.update(n,d,r));if(c)return{...Ag(e,c),message:`Story \`${n}\` updated.`}}},{id:"story archive",group:"story",name:"archive",stage:"B",write:!0,summary:"Archive a story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Xz],input:tz({storyId:o.z.string(),node:o.z.string().optional()}),output:Gc,handler:jg},{id:"story restore",group:"story",name:"restore",stage:"B",write:!0,summary:"Restore an archived story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Xz],input:tz({storyId:o.z.string(),node:o.z.string().optional()}),output:Gc,handler:Rg},{id:"story remove",group:"story",name:"remove",stage:"B",write:!0,summary:"Remove a story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Xz],input:tz({storyId:o.z.string(),node:o.z.string().optional()}),output:o.z.object({deleted:o.z.boolean()}),handler:Tg},{id:"story document update",group:"story",name:"document update",stage:"B",write:!0,summary:"Update story document metadata",args:[{name:"storyId",description:"Story ID",required:!0},{name:"path",description:"Document path inside the story",required:!0}],options:[Xz,{flags:"--title <title>",description:"New document title"},{flags:"--new-path <path>",description:"Move the document to this story path"}],input:tz({storyId:o.z.string(),path:o.z.string(),node:o.z.string().optional(),title:o.z.string().optional(),newPath:o.z.string().optional()}),output:Gc,handler:async function(e,t){const n=kp(t,"storyId"),i=kp(t,"path"),o=jp(t,"title"),a=jp(t,"new-path"),r={...o?{title:o}:{},...a?{storyPath:a}:{}};if(0===Object.keys(r).length)throw u("CLI_OPTION_MISSING","Provide --title or --new-path.",{command:"story document update"});const s=await xp(e),d=await Cg(s,n,jp(t,"node")),c=await Cp(e,"story document update",()=>({method:"PATCH",path:`/api/stories/${encodeURIComponent(n)}/documents/${encodeURIComponent(i)}`,body:{nodeId:d,input:r}}),()=>s.client.stories.updateDocument(n,d,i,r));if(c)return{...Ag(e,c),message:`Document \`${i}\` updated on story \`${n}\`.`}}},{id:"story document remove",group:"story",name:"document remove",stage:"B",write:!0,summary:"Remove a story document",args:[{name:"storyId",description:"Story ID",required:!0},{name:"path",description:"Document path inside the story",required:!0}],options:[Xz],input:tz({storyId:o.z.string(),path:o.z.string(),node:o.z.string().optional()}),output:o.z.object({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"storyId"),i=kp(t,"path"),o=await xp(e),a=await Cg(o,n,jp(t,"node")),r=await Cp(e,"story document remove",()=>({method:"DELETE",path:`/api/stories/${encodeURIComponent(n)}/documents/${encodeURIComponent(i)}`,body:{nodeId:a}}),()=>o.client.stories.removeDocument(n,a,i));if(r)return{data:r,message:`Document \`${i}\` removed from story \`${n}\`.`}}},{id:"story document reorder",group:"story",name:"document reorder",stage:"B",write:!0,summary:"Reorder story documents",args:[{name:"storyId",description:"Story ID",required:!0},{name:"path",description:"Document paths in the new order",required:!0,variadic:!0}],options:[Xz],input:tz({storyId:o.z.string(),path:o.z.array(o.z.string()),node:o.z.string().optional()}),output:Gc,handler:async function(e,t){const n=kp(t,"storyId"),i=(t.rawArgs??[]).slice(1).map(e=>e.trim()).filter(Boolean);if(0===i.length)throw u("CLI_ARGUMENT_MISSING","Missing required argument <path...>.",{argument:"path"});const o=await xp(e),a=await Cg(o,n,jp(t,"node")),r={storyPaths:i},s=await Cp(e,"story document reorder",()=>({method:"POST",path:`/api/stories/${encodeURIComponent(n)}/documents/order`,body:{nodeId:a,input:r}}),()=>o.client.stories.reorderDocuments(n,a,r));if(s)return{...Ag(e,s),message:`Documents reordered on story \`${n}\`.`}}},{id:"story automation list",group:"story",name:"automation list",stage:"B",summary:"List story automations",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Xz],input:tz({storyId:o.z.string(),node:o.z.string().optional()}),output:Hc,handler:async function(e,t){const n=kp(t,"storyId"),i=await xp(e),o=await Cg(i,n,jp(t,"node")),a=await i.client.stories.listAutomations(n,o);return e.output.json?{data:a}:{data:a.automations,columns:[{key:"automation.id",header:"automation"},{key:"automation.enabled",header:"enabled"},{key:"effectiveStatus",header:"status"},{key:"automation.actionId",header:"action"},{key:"nextRunAt",header:"next run"}],message:a.automations.length?void 0:"No automations matched."}}},{id:"story automation show",group:"story",name:"automation show",stage:"B",summary:"Show one story automation",args:eh,options:[Xz],input:th,output:Bc,handler:async function(e,t){const n=kp(t,"storyId"),i=kp(t,"automationId"),o=await xp(e),a=await Cg(o,n,jp(t,"node")),r=await o.client.stories.getAutomation(n,i,a);return e.output.json?{data:r}:{data:r,columns:[{key:"automation.id",header:"automation"},{key:"automation.enabled",header:"enabled"},{key:"effectiveStatus",header:"status"},{key:"lastRun.status",header:"last run"},{key:"nextRunAt",header:"next run"}]}}},{id:"story automation create",group:"story",name:"automation create",stage:"B",write:!0,summary:"Create a story automation from a JSON config file",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Xz,nh],input:ih,output:Bc,handler:async function(e,t){const n=kp(t,"storyId"),i=Pp(Rp(t,"config"),Og,"story automation config"),o=await xp(e),a=await Cg(o,n,jp(t,"node")),r={storyId:n,...i},s=await Cp(e,"story automation create",()=>({method:"POST",path:`/api/stories/${encodeURIComponent(n)}/automations`,body:{nodeId:a,input:r}}),()=>o.client.stories.createAutomation(n,a,r));if(s)return{...Pg(e,s),message:`Automation \`${s.automation.id}\` created on story \`${n}\`.`}}},{id:"story automation update",group:"story",name:"automation update",stage:"B",write:!0,summary:"Update a story automation from a JSON config file",args:eh,options:[Xz,nh],input:oh,output:Bc,handler:async function(e,t){const n=kp(t,"storyId"),i=kp(t,"automationId"),o=Pp(Rp(t,"config"),Uc,"story automation update config"),a=await xp(e),r=await Cg(a,n,jp(t,"node")),s=await Cp(e,"story automation update",()=>({method:"PATCH",path:`/api/stories/${encodeURIComponent(n)}/automations/${encodeURIComponent(i)}`,body:{nodeId:r,input:o}}),()=>a.client.stories.updateAutomation(n,i,r,o));if(s)return{...Pg(e,s),message:`Automation \`${i}\` on story \`${n}\` updated.`}}},{id:"story automation remove",group:"story",name:"automation remove",stage:"B",write:!0,summary:"Remove a story automation",args:eh,options:[Xz],input:th,output:o.z.object({deleted:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"storyId"),i=kp(t,"automationId"),o=await xp(e),a=await Cg(o,n,jp(t,"node")),r=await Cp(e,"story automation remove",()=>({method:"DELETE",path:`/api/stories/${encodeURIComponent(n)}/automations/${encodeURIComponent(i)}?nodeId=${encodeURIComponent(a)}`}),()=>o.client.stories.removeAutomation(n,i,a));if(r){if(!r.deleted)throw new m("CLI_STORY_AUTOMATION_NOT_REMOVED",`Automation \`${i}\` on story \`${n}\` was not removed.`,8,{storyId:n,automationId:i});return{data:r,message:`Automation \`${i}\` removed from story \`${n}\`.`}}}},{id:"story automation enable",group:"story",name:"automation enable",stage:"B",write:!0,summary:"Enable a story automation",args:eh,options:[Xz],input:th,output:Bc,handler:Ng},{id:"story automation disable",group:"story",name:"automation disable",stage:"B",write:!0,summary:"Disable a story automation",args:eh,options:[Xz],input:th,output:Bc,handler:_g},{id:"story automation run",group:"story",name:"automation run",stage:"B",write:!0,summary:"Run a story automation now",args:eh,options:[Xz,{flags:"--request-id <id>",description:"Client request ID for retry-safe runs"}],input:tz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional(),requestId:o.z.string().optional()}),output:Dc,handler:async function(e,t){const n=kp(t,"storyId"),i=kp(t,"automationId"),o=jp(t,"request-id")??a.randomUUID(),r=await xp(e),s=await Cg(r,n,jp(t,"node")),d={clientRequestId:o},c=await Cp(e,"story automation run",()=>({method:"POST",path:`/api/stories/${encodeURIComponent(n)}/automations/${encodeURIComponent(i)}/run`,body:{nodeId:s,input:d}}),()=>r.client.stories.runAutomation(n,i,s,d));if(c)return{data:c,columns:xg,message:`Automation \`${i}\` run ${c.status}.`}}},{id:"story automation runs",group:"story",name:"automation runs",stage:"B",summary:"List recent automation runs",args:eh,options:[Xz],input:th,output:Fc,handler:async function(e,t){const n=kp(t,"storyId"),i=kp(t,"automationId"),o=await xp(e),a=await Cg(o,n,jp(t,"node")),r=await o.client.stories.automationRuns(n,i,a);return e.output.json?{data:r}:{data:r.runs,columns:xg,message:r.runs.length?void 0:"No runs matched."}}}]),rh=nz("trigger","Inspect and run instance triggers",[{id:"trigger list",group:"trigger",name:"list",stage:"B",summary:"List triggers from the control plane registry",options:[{flags:"--instance <instanceId>",description:"Only triggers deployed to this instance"}],input:tz({instance:o.z.string().optional()}),output:ga,handler:async function(e,t){const n=jp(t,"instance"),i=await xp(e),o=await i.client.triggers.list(e.signal),a=n?o.triggers.filter(e=>e.deployments.some(e=>e.instanceId===n)):o.triggers;return e.output.json?{data:{...o,triggers:a}}:{data:a.map(Lg),columns:qg,message:a.length?void 0:"No triggers matched."}}},{id:"trigger show",group:"trigger",name:"show",stage:"B",summary:"Show one trigger and its deployments",args:[{name:"configHash",description:"Trigger config hash",required:!0}],options:[{flags:"--instance <instanceId>",description:"Only deployments on this instance"}],input:tz({configHash:o.z.string(),instance:o.z.string().optional()}),output:pa,handler:async function(e,t){const n=kp(t,"configHash"),i=jp(t,"instance"),o=await xp(e),a=(await o.client.triggers.list(e.signal)).triggers.find(e=>e.configHash===n);if(!a)throw new m("CLI_TRIGGER_NOT_FOUND",`No trigger \`${n}\` is visible in the control plane registry.`,7,{configHash:n});const r=i?{...a,deployments:a.deployments.filter(e=>e.instanceId===i)}:a;if(i&&0===r.deployments.length)throw new m("CLI_TRIGGER_DEPLOYMENT_NOT_FOUND",`Trigger \`${n}\` has no deployment on instance \`${i}\`.`,7,{configHash:n,instanceId:i});return e.output.json?{data:r}:{data:Lg(r),columns:qg}}},{id:"trigger create",group:"trigger",name:"create",stage:"B",write:!0,summary:"Create a trigger template and bind it to an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--config <file>",description:"Trigger template JSON file"}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),config:o.z.string()}),output:o.z.looseObject({trigger:o.z.looseObject({configHash:o.z.string()}),binding:o.z.unknown()}),handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=Pp(Rp(t,"config"),za,"trigger config"),a=await xp(e),r=await Cp(e,"trigger create",()=>{return{...(e=[{method:"POST",path:"/api/triggers",body:o},{method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/ai-sessions/${encodeURIComponent(i)}/triggers`,body:{configHash:"<created>"}}])[0],steps:e};var e},async()=>{const e=await a.client.triggers.create(o);return{trigger:e,binding:await a.client.triggers.bindSession(n,i,e.configHash)}});if(r)return{data:r,columns:qg,message:`Trigger \`${r.trigger.configHash}\` created and bound to AI session \`${i}\`.`}}},{id:"trigger update",group:"trigger",name:"update",stage:"B",write:!0,summary:"Update a trigger template and fan out to its deployments",args:[{name:"configHash",description:"Trigger config hash",required:!0}],options:[{flags:"--config <file>",description:"Trigger template JSON file"}],input:tz({configHash:o.z.string(),config:o.z.string()}),output:o.z.looseObject({}),handler:async function(e,t){const n=kp(t,"configHash"),i=Pp(Rp(t,"config"),za,"trigger config"),o=await xp(e),a=await Cp(e,"trigger update",()=>({method:"PUT",path:`/api/triggers/${encodeURIComponent(n)}`,body:i}),()=>o.client.triggers.update(n,i));if(a)return{data:a,message:`Trigger \`${n}\` updated.`}}},{id:"trigger remove",group:"trigger",name:"remove",stage:"B",write:!0,summary:"Remove a trigger template and its deployments",args:[{name:"configHash",description:"Trigger config hash",required:!0}],input:tz({configHash:o.z.string()}),output:o.z.looseObject({}),handler:async function(e,t){const n=kp(t,"configHash"),i=await xp(e),o=await Cp(e,"trigger remove",()=>({method:"DELETE",path:`/api/triggers/${encodeURIComponent(n)}`}),()=>i.client.triggers.remove(n));if(o)return{data:o,message:`Trigger \`${n}\` removed.`}}},{id:"trigger run",group:"trigger",name:"run",stage:"B",write:!0,summary:"Run a trigger on an instance now",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"configHash",description:"Trigger config hash",required:!0}],options:[{flags:"--deployment <deploymentId>",description:"Specific deployment to run"}],input:tz({instanceId:o.z.string(),configHash:o.z.string(),deployment:o.z.string().optional()}),output:o.z.unknown(),handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"configHash"),o=jp(t,"deployment"),a=await xp(e),r=await Cp(e,"trigger run",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/triggers/${encodeURIComponent(i)}/run`,body:o?{deploymentId:o}:{}}),()=>a.client.triggers.run(n,i,o));if(r)return{data:r,message:`Trigger \`${i}\` run requested on instance \`${n}\`.`}}},{id:"trigger bind",group:"trigger",name:"bind",stage:"B",write:!0,summary:"Bind a trigger template to an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"configHash",description:"Trigger config hash",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),configHash:o.z.string()}),output:o.z.object({config:aa,deployment:sa,runtime:da.optional()}),handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=kp(t,"configHash"),a=await xp(e),r=await Cp(e,"trigger bind",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/ai-sessions/${encodeURIComponent(i)}/triggers`,body:{configHash:o}}),()=>a.client.triggers.bindSession(n,i,o));if(r)return{data:r,message:`Trigger \`${o}\` bound to AI session \`${i}\` on instance \`${n}\`.`}}},{id:"trigger unbind",group:"trigger",name:"unbind",stage:"B",write:!0,summary:"Unbind a trigger template from an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"configHash",description:"Trigger config hash",required:!0}],input:tz({instanceId:o.z.string(),sessionId:o.z.string(),configHash:o.z.string()}),output:o.z.unknown(),handler:async function(e,t){const n=kp(t,"instanceId"),i=kp(t,"sessionId"),o=kp(t,"configHash"),a=await xp(e),r=await Cp(e,"trigger unbind",()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}/ai-sessions/${encodeURIComponent(i)}/triggers/${encodeURIComponent(o)}`}),()=>a.client.triggers.unbindSession(n,i,o));if(r)return{data:r,message:`Trigger \`${o}\` unbound from AI session \`${i}\` on instance \`${n}\`.`}}},{id:"trigger apply",group:"trigger",name:"apply",stage:"B",write:!0,summary:"Apply a trigger template to instances targeting an AI session",args:[{name:"configHash",description:"Trigger config hash",required:!0}],options:[{flags:"--instance <instanceId>",description:"Instance to deploy to (repeatable)",repeatable:!0},{flags:"--session <sessionId>",description:"Target AI session ID"},{flags:"--disabled",description:"Create the deployment disabled"}],input:tz({configHash:o.z.string(),instance:o.z.array(o.z.string()).min(1),session:o.z.string(),disabled:o.z.boolean().optional()}),output:o.z.looseObject({configHash:o.z.string(),results:o.z.array(o.z.unknown())}),handler:async function(e,t){const n=kp(t,"configHash"),i=Rp(t,"session"),o=[...new Set(Tp(t,"instance"))];if(!o.length)throw new m("CLI_OPTION_MISSING","Pass at least one --instance <instanceId> to apply.",2,{option:"instance"});const a={instanceIds:o,target:{type:"ai-session",aiSessionId:i},enabled:!0!==t.options.disabled},r=await xp(e),s=await Cp(e,"trigger apply",()=>({method:"POST",path:`/api/triggers/${encodeURIComponent(n)}/apply`,body:a}),()=>r.client.triggers.apply(n,a));if(s)return{data:s,message:`Trigger \`${n}\` applied to ${o.length} instance(s).`}}}]),sh=nz("model","Inspect the model registry",[{id:"model list",group:"model",name:"list",stage:"B",summary:"List models in the public registry",input:ez,output:gc,handler:async function(e){const t=await xp(e),n=await t.client.resources.models(e.signal);if(e.output.json)return{data:n};const i=n.models.map(e=>({...e,model:{...e.model,protocols:e.model.protocols.join(",")},locations:e.locations.map(e=>`${e.type}${e.nodeId?`:${e.nodeId}`:""}${e.enabled?"":"(disabled)"}`).join(",")}));return{data:i,columns:lg,message:i.length?void 0:"No models matched."}}},{id:"model show",group:"model",name:"show",stage:"B",summary:"Show one model",args:[{name:"modelId",description:"Model entity ID",required:!0}],input:tz({modelId:o.z.string()}),output:pc,handler:async function(e,t){const n=kp(t,"modelId"),i=await xp(e),o=(await i.client.resources.models(e.signal)).models.find(e=>e.id===n||e.model.id===n);if(!o)throw new m("CLI_MODEL_NOT_FOUND",`No model \`${n}\` is visible in the public registry.`,7,{modelId:n});return e.output.json?{data:o}:{data:{...o,model:{...o.model,protocols:o.model.protocols.join(",")}},columns:lg}}},...Dz]),dh=nz("user","Inspect users and their sessions",[{id:"user list",group:"user",name:"list",stage:"B",summary:"List Control Plane users",options:[{flags:"--include-archived",description:"Include archived users"}],input:tz({includeArchived:o.z.boolean().optional()}),output:o.z.array(Ri),handler:async function(e,t){const n=!0===t.options["include-archived"],i=await xp(e),o=await i.client.users.list({includeArchived:n},e.signal);return e.output.json?{data:o}:{data:o,columns:Gg,message:o.length?void 0:"No users matched."}}},{id:"user show",group:"user",name:"show",stage:"B",summary:"Show one user",args:[{name:"userId",description:"User ID",required:!0}],input:tz({userId:o.z.string()}),output:Ui,handler:async function(e,t){const n=kp(t,"userId"),i=await xp(e),o=await i.client.users.detail(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Gg}}},{id:"user sessions",group:"user",name:"sessions",stage:"B",summary:"List sessions of a user",args:[{name:"userId",description:"User ID",required:!0}],input:tz({userId:o.z.string()}),output:o.z.array($i),handler:async function(e,t){const n=kp(t,"userId"),i=await xp(e),o=await i.client.users.sessions(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Yg,message:o.length?void 0:"No sessions matched."}}},{id:"user session-revoke",group:"user",name:"session-revoke",stage:"B",write:!0,summary:"Revoke one session of a user",args:[{name:"userId",description:"User ID",required:!0},{name:"sessionId",description:"Session ID",required:!0}],input:tz({userId:o.z.string(),sessionId:o.z.string()}),output:o.z.object({revoked:o.z.boolean()}),handler:async function(e,t){const n=kp(t,"userId"),i=kp(t,"sessionId"),o=await xp(e),a=await Cp(e,"user session-revoke",()=>({method:"DELETE",path:`/api/users/${encodeURIComponent(n)}/sessions/${encodeURIComponent(i)}`}),()=>o.client.users.revokeSession(n,i));if(a){if(!a.revoked)throw new m("CLI_SESSION_NOT_REVOKED",`Session \`${i}\` was not revoked.`,8,{userId:n,sessionId:i});return{data:a,message:`Session \`${i}\` revoked.`}}}},...Hz]),ch=nz("events","Stream Control Plane events",[{id:"events",group:"events",name:"events",stage:"C",summary:"Subscribe to the Control Plane event stream as JSON Lines",options:[{flags:"--topic <topic>",description:"Event topic to subscribe to",repeatable:!0},{flags:"--instance <instanceId>",description:"Only events of this instance"}],input:tz({topic:o.z.array(o.z.string()).optional(),instance:o.z.string().optional()}),output:Lu,outputMode:"json-lines",examples:["thctl events","thctl events --topic ai.sessions --instance <instanceId>","thctl events --json"],handler:async function(e,t){const n=function(e=[]){const t=e.map(e=>String(e).trim()).filter(Boolean).map(e=>Qp[e]??e);return t.length?[...new Set(t)]:["*"]}(t.options.topic??[]),i="string"==typeof t.options.instance?t.options.instance.trim():"",o=await vp(e),a=await xp(e,{profile:o}),r=e.store.secrets().read(a.profile.label);if(!r)throw new m("CLI_NOT_AUTHENTICATED",`No CLI session stored for \`${a.profile.label}\`. Run \`thctl login\`.`,5,{profile:a.profile.label});await tg(e,{url:Xp(a.profile.origin,i||void 0),authorization:`Bearer ${r.sessionToken}`,topics:n,...i?{instanceId:i}:{},onUnauthorized:()=>e.store.secrets().remove(a.profile.label)})}}],{flat:!0}),lh=nz("schema","Export the machine-readable CLI contract",[{id:"schema",group:"schema",name:"schema",stage:"A",summary:"Export the declared leaf command contracts as JSON Schema or Markdown",args:[{name:"group",description:"Command group"},{name:"leaf",description:"Leaf command name inside the group"}],options:[{flags:"--format <json|md>",description:"Output format (default json)"},{flags:"--out <file>",description:"Write the export to a file"}],input:tz({group:o.z.string().optional(),leaf:o.z.string().optional(),format:o.z.enum(["json","md"]).optional(),out:o.z.string().optional()}),output:Xg,examples:["thctl schema --format json","thctl schema instance stop","thctl schema instance --format md --out instance.md"],handler:async function(e,n){const o=n.args.group?.trim(),a=n.args.leaf?.trim(),r="md"===String(n.options.format??"json")?"md":"json";let s;if(o||a)if(!a&&ph(o))s={leaf:ph(o)};else if(!a&&function(e){return uh.filter(t=>t.group===e)}(o).length)s={group:o};else{if(!o||!a)throw new m("CLI_SCHEMA_TARGET_UNKNOWN",`No command group \`${o}\` is declared.`,7,{group:o});{const e=ph(`${o} ${a}`);if(!e)throw new m("CLI_SCHEMA_TARGET_UNKNOWN",`No leaf command \`${o} ${a}\` is declared.`,7,{group:o,leaf:a});s={leaf:e}}}else s=void 0;const d=function(e){const t=e?.leaf?[e.leaf]:e?.group?uh.filter(t=>t.group===e.group):uh,n=(e?.leaf?mh.filter(t=>t.name===e.leaf?.group):e?.group?mh.filter(t=>t.name===e.group):mh).map(e=>({name:e.name,summary:e.summary,flat:Boolean(e.flat),leaves:e.leaves.filter(e=>t.includes(e)).map(e=>e.id)}));return{cli:"thctl",version:Vu,contractVersion:"1",globalOptions:[{flags:"--profile <label>",description:"Profile to use (overrides TASK_HANDOFF_CLI_PROFILE)"},{flags:"--json",description:"Emit machine-readable JSON on stdout"},{flags:"--yes",description:"Skip interactive confirmation for write commands"},{flags:"--dry-run",description:"Print the request a write command would send without sending it"},{flags:"--token-stdin",description:"Read a secret (token, join token, credential) from stdin instead of a flag"}],groups:n.map(e=>({...e,leaves:e.leaves})),commands:t.map(bg)}}(s),c="md"===r?function(e){const t=[`# thctl contract (v${e.version}, contract ${e.contractVersion})`,"","Global options:","",...e.globalOptions.map(e=>`- \`${e.flags}\` — ${e.description}`),"","## Commands",""];for(const n of e.groups)t.push(`### ${n.name}`,"",n.summary,""),n.flat?t.push(...n.leaves.map(e=>`- \`${e}\``),""):t.push(`\`thctl ${n.name} <command>\``,"",...n.leaves.map(e=>`- \`${e}\``),"");for(const n of e.commands)t.push(wg(n),"");return`${t.join("\n").trimEnd()}\n`}(d):function(e){return`${JSON.stringify(e,null,2)}\n`}(d),l="string"==typeof n.options.out?n.options.out.trim():"";if(l){const e=i.resolve(l);return t.writeFileSync(e,c,{mode:420}),{data:{out:e,format:r,commands:d.commands.length},message:`Wrote ${d.commands.length} contracts to ${e}.`}}return e.output.streams.stdout(c),{data:void 0}}}],{flat:!0}),mh=[Gz,Yz,Kz,Jz,Zz,Qz,yz,ah,rh,sh,...Mz,dh,ch,lh],uh=mh.flatMap(e=>e.leaves);function ph(e){const t=e.trim().replace(/\s+/g," ");return uh.find(e=>e.id===t)}function gh(e){return null==e?"":Array.isArray(e)?e.length?e.map(gh).join(", "):"":"object"==typeof e?JSON.stringify(e):String(e)}class zh{streams;json;constructor(e,t){this.streams=e,this.json=t}data(e,t){if(this.json)this.streams.stdout(`${JSON.stringify(e,null,2)}\n`);else{if(t){const n=function(e,t){if(0===t.length)return"";const n=t.map(t=>e.map(e=>{return n=gh(function(e,t){if(!t.includes("."))return e[t];let n=e;for(const e of t.split(".")){if(!n||"object"!=typeof n)return;n=n[e]}return n}(t,e.key)),!(i=e.width)||n.length<=i?n:`${n.slice(0,Math.max(0,i-1))}…`;var n,i})),i=e.map((e,t)=>Math.max(e.header.length,...n.map(e=>(e[t]??"").length))),o=e=>e.map((e,t)=>e.padEnd(i[t])).join(" ").trimEnd();return[o(e.map(e=>e.header)),...n.map(o)].join("\n")}(t,Array.isArray(e)?e:[e]);return void this.streams.stdout(n?`${n}\n`:"\n")}this.streams.stdout(`${"string"==typeof e?e:JSON.stringify(e,null,2)}\n`)}}message(e){this.json||this.streams.stdout(`${e}\n`)}warn(e){this.streams.stderr(`${yp(e)}\n`)}error(e){this.json?this.streams.stderr(`${JSON.stringify({error:{code:e.code,message:yp(e.message),...e.details?{details:fp(e.details)}:{}}})}\n`):this.streams.stderr(`${e.code}: ${yp(e.message)}\n`)}}const hh=[["--profile <label>","Profile to use (overrides TASK_HANDOFF_CLI_PROFILE)"],["--json","Emit machine-readable JSON on stdout"],["--yes","Skip interactive confirmation for write commands"],["--dry-run","Print the request a write command would send without sending it"],["--token-stdin","Read a secret (token, join token, credential) from stdin instead of a flag"]];function yh(e){for(const[t,n]of hh)e.option(t,n);return e}function fh(e,t=[]){return[...t,e]}function Ih(e){return[e.name.split(" ").at(-1),...(e.args??[]).map(e=>e.variadic?e.required?`<${e.name}...>`:`[${e.name}...]`:e.required?`<${e.name}>`:`[${e.name}]`)].join(" ")}function bh(e){return e.handler?e.summary:`${e.summary} (not implemented — planned stage ${e.stage})`}function wh(e,t){const n=t.name.split(" ");let i=e;for(const e of n.slice(0,-1)){const n=i.commands.find(t=>t.name()===e);i=n??i.command(e).description(`${t.group} ${e} commands`)}return i}async function vh(e,t,n){const i={};(e.args??[]).forEach((e,t)=>{const o=n.args[t];i[e.name]=e.variadic?n.args.slice(t).join(" ")||void 0:o});const o=n.optsWithGlobals();t.output.json=!0===o.json;const a={...t,profile:"string"==typeof o.profile?o.profile:t.profile,yes:!0===o.yes,dryRun:!0===o.dryRun};if(!e.handler)throw r=e.id,s=e.stage,new m("CLI_COMMAND_NOT_IMPLEMENTED",`\`${r}\` is declared but not implemented yet (planned stage ${s}).`,3,{command:r,stage:s});var r,s;let d;try{d=await e.handler(a,{args:i,options:o,rawArgs:n.args})}catch(t){if(t instanceof m&&"CLI_ROUTE_MISSING"===t.code)throw new m("CLI_CAPABILITY_MISSING",`${t.message} \`${e.id}\` is unavailable on this server version.`,t.exitCode,{...t.details,command:e.id});throw t}d&&(void 0!==d.data&&a.output.data(d.data,d.columns),d.message&&a.output.message(d.message))}(async function(t,n={}){const i=function(e={}){const t=e.env??process.env,n=e.streams??{stdout:e=>process.stdout.write(e),stderr:e=>process.stderr.write(e)};return{store:e.store??new k(A(t)),output:new zh(n,!1),fetchImpl:e.fetchImpl??fetch,env:t,yes:!1,dryRun:!1,isTty:e.isTty??Boolean(process.stdin.isTTY&&process.stdout.isTTY),confirm:e.confirm??wp,openUrl:e.openUrl??zg,sleep:e.sleep??(e=>new Promise(t=>setTimeout(t,e))),signal:e.signal??(new AbortController).signal,...e.createEventSocket?{createEventSocket:e.createEventSocket}:{}}}(n),o=new AbortController,a=()=>{o.abort(),i.output.warn("Cancelling…")},r=n.signal,s=()=>o.abort();r&&(r.aborted?o.abort():r.addEventListener("abort",s,{once:!0})),process.on("SIGINT",a),process.on("SIGTERM",a);try{const n=function(t){const n=new e.Command;n.name("thctl").description("TaskHandoff Control Plane command line client.").version(Vu,"--version","Print the CLI version").exitOverride().showHelpAfterError(!1).showSuggestionAfterError(!1).configureOutput({writeOut:e=>t.output.streams.stdout(e),writeErr:e=>t.output.streams.stderr(e)}),yh(n),n.configureHelp({sortSubcommands:!1});for(const e of mh){const i=e.flat?n:n.command(e.name).description(e.summary);for(const n of e.leaves){const e=wh(i,n).command(Ih(n)).description(bh(n));yh(e);for(const t of n.options??[])t.repeatable?e.option(t.flags,t.description,fh,[]):e.option(t.flags,t.description);e.action(async()=>{await vh(n,t,e)})}}return n}({...i,signal:o.signal});return await n.parseAsync(t),0}catch(t){if(t instanceof e.CommanderError){if("commander.helpDisplayed"===t.code||"commander.help"===t.code||"commander.version"===t.code)return 0;const e=new m("CLI_USAGE_ERROR",t.message,2);return i.output.error(e),e.exitCode}const n=function(e){if(e instanceof m)return e;const t=e instanceof Error?e.message:String(e);return new m("CLI_INTERNAL_ERROR",t,12)}(t);return i.output.error(n),n.exitCode}finally{process.off("SIGINT",a),process.off("SIGTERM",a),r?.removeEventListener("abort",s)}})(process.argv).then(e=>{process.exitCode=e});
1
+ "use strict";var e=require("commander"),t=require("node:fs"),n=require("node:os"),i=require("node:path"),o=require("zod"),a=require("node:crypto"),s=require("node:readline/promises"),r=require("node:child_process"),d=require("ws"),c=require("node:http"),l=require("semver");const m=10,p=13,u=14,g=15;class h extends Error{code;exitCode;details;constructor(e,t,n=12,i){super(t),this.name="ThctlError",this.code=e,this.exitCode=n,this.details=i}}function z(e,t,n){return new h(e,t,2,n)}function f(e,t,n){return new h("CLI_CAPABILITY_MISSING",`\`${e}\` requires capability \`${t}\`, which the connected Control Plane or node does not declare. Upgrade it or pick a supported command.`,u,{command:e,capability:t,...n})}function y(e,t,n){return new h("CLI_ROUTE_MISSING",`The Control Plane does not expose \`${t} ${n}\` (HTTP ${e}); this server version predates the command.`,u,{path:n,status:e,method:t})}function I(e,t){return new h("CLI_PROTOCOL_ERROR",e,11,t)}function b(e,t){return new h("CLI_NETWORK_ERROR",e,m,t)}const w={400:2,401:5,403:6,404:7,409:8,410:7,429:9},v=new Set(["CONTROL_PLANE_AUTH_REQUIRED","AUTH_PASSWORD_CHANGE_REQUIRED","CLI_AUTHORIZATION_PENDING","CLI_AUTHORIZATION_SLOW_DOWN","CLI_AUTHORIZATION_DENIED","CLI_AUTHORIZATION_EXPIRED","CLI_AUTHORIZATION_INVALID_GRANT","CLI_AUTHORIZATION_FAILED","CLI_AUTHORIZATION_REQUEST_UNKNOWN"]);function x(e,t,n,i){const o=v.has(t)?5:w[e]??12;return new h(t,n,o,i)}const A="TASK_HANDOFF_CLI_PROFILE",k=o.z.object({label:o.z.string().trim().min(1).max(120),origin:o.z.string().trim().url().max(2048),controlPlaneId:o.z.string().trim().min(1).max(160),fingerprint:o.z.string().regex(/^sha256:[A-Za-z0-9_-]{43}$/),protocolVersion:o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/),capabilities:o.z.unknown().optional(),loginMode:o.z.enum(["browser","device"]).optional(),source:o.z.enum(["manual","local-discovery"]).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),trustedAt:o.z.string().datetime(),lastUsedAt:o.z.string().datetime().optional(),identityChangedAt:o.z.string().datetime().optional(),replacedFingerprint:o.z.string().regex(/^sha256:[A-Za-z0-9_-]{43}$/).optional()}),S=o.z.object({version:o.z.number().int().positive(),defaultProfile:o.z.string().trim().min(1).max(120).optional(),profiles:o.z.array(k).default([])}),C=o.z.object({version:o.z.number().int().positive(),credentials:o.z.record(o.z.string(),o.z.object({sessionToken:o.z.string().trim().min(32),sessionId:o.z.string().trim().min(1).optional(),expiresAt:o.z.string().datetime().optional(),mode:o.z.enum(["authorization","local-trust"]).optional(),savedAt:o.z.string().datetime()})).default({})});function j(e=process.env){const t=e.TASK_HANDOFF_CLI_CONFIG_DIR?.trim();if(t)return i.resolve(t);const o=e.XDG_CONFIG_HOME?.trim();return i.join(o&&i.isAbsolute(o)?o:i.join(n.homedir(),".config"),"task-handoff","cli")}function R(e,n){!function(e){t.mkdirSync(e,{recursive:!0,mode:448});try{t.chmodSync(e,448)}catch{}}(i.dirname(e));const o=`${e}.${process.pid}.tmp`;t.writeFileSync(o,`${JSON.stringify(n,null,2)}\n`,{mode:384}),t.renameSync(o,e);try{t.chmodSync(e,384)}catch{}}function T(e){try{return JSON.parse(t.readFileSync(e,"utf8"))}catch(e){return void e.code}}class ${file;credentialFile;warnings=[];directory;constructor(e){this.directory=e,this.file=i.join(e,"profiles.json"),this.credentialFile=i.join(e,"credentials.json")}list(){return this.#e().profiles}defaultProfile(){return this.#e().defaultProfile}get(e){return this.#e().profiles.find(t=>t.label===e)}findByOrigin(e){return this.#e().profiles.find(t=>t.origin===e)}findByControlPlane(e,t){return this.#e().profiles.find(n=>n.controlPlaneId===e&&n.fingerprint===t)}save(e){const t=k.parse(e),n=this.#e(),i=[...n.profiles.filter(e=>e.label!==t.label),t];return this.#t({...n,profiles:i}),t}remove(e){const t=this.#e(),n=t.profiles.filter(t=>t.label!==e);return n.length!==t.profiles.length&&(this.#t({...t,profiles:n,defaultProfile:t.defaultProfile===e?n[0]?.label:t.defaultProfile}),this.secrets().remove(e),!0)}setDefault(e){const t=this.#e();if(!t.profiles.some(t=>t.label===e))throw new h("CLI_PROFILE_UNKNOWN",`Unknown profile \`${e}\`. Run \`thctl profile list\` to see configured profiles.`,7,{profile:e});this.#t({...t,defaultProfile:e})}select(e,t=process.env){const n=this.#e(),i=e?.trim()||t[A]?.trim()||n.defaultProfile;if(i){const e=n.profiles.find(e=>e.label===i);if(!e)throw new h("CLI_PROFILE_UNKNOWN",`Unknown profile \`${i}\`. Run \`thctl profile list\` to see configured profiles.`,7,{profile:i});return e}if(1===n.profiles.length)return n.profiles[0];if(0===n.profiles.length)throw new h("CLI_PROFILE_MISSING","No Control Plane profile configured. Run `thctl profile add <origin>` first.",7);throw z("CLI_PROFILE_REQUIRED","Multiple profiles are configured. Select one with `--profile <label>` or `thctl profile use <label>`.")}markUsed(e){return this.save({...e,lastUsedAt:(new Date).toISOString(),updatedAt:(new Date).toISOString()})}secrets(){return new E(this.credentialFile,this.warnings)}#e(){const e=T(this.file);if(void 0===e)return{version:1,profiles:[]};const t=S.safeParse(e);return t.success?{...t.data,profiles:t.data.profiles.filter(e=>""!==e.label)}:(this.warnings.push(`Ignoring unreadable profile file ${this.file}; run \`thctl profile add\` to recreate it.`),{version:1,profiles:[]})}#t(e){R(this.file,{version:1,...e.defaultProfile?{defaultProfile:e.defaultProfile}:{},profiles:e.profiles})}}class E{file;warnings;constructor(e,t){this.file=e,this.warnings=t}read(e){return this.#e().credentials[e]}write(e,t){const n=this.#e();n.credentials[e]=t,this.#t(n)}remove(e){const t=this.#e();e in t.credentials&&(delete t.credentials[e],this.#t(t))}#e(){const e=T(this.file);if(void 0===e)return{version:1,credentials:{}};const t=C.safeParse(e);return t.success?t.data:(this.warnings.push(`Ignoring unreadable credential file ${this.file}; sign in again with \`thctl login\`.`),{version:1,credentials:{}})}#t(e){R(this.file,e)}}function P(e){const t=new URL(e);return(`${"127.0.0.1"===t.hostname||"localhost"===t.hostname||"::1"===t.hostname?"local":t.hostname}${t.port?`-${t.port}`:""}`.replace(/[^A-Za-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"control-plane").slice(0,64)}const O=o.z.string().trim().min(1).max(120),N=20971520,_=512e3,U=_,L=N,D=41943040,q=o.z.string().trim().min(1).max(80),M=o.z.enum(["app-session","ai-session"]),B=o.z.enum(["image","file"]),F={scopeType:o.z.enum(["session","create-request"]),scopeId:o.z.string().trim().min(1).max(160),kind:B,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120)};o.z.object({...F,size:o.z.coerce.number().int().positive().max(N)}).strict();const H=o.z.string().regex(/^cia_[a-f0-9]{24}$/);o.z.object({attachmentId:H,...F,size:o.z.number().int().positive().max(N)}).strict(),o.z.object({offset:o.z.coerce.number().int().nonnegative()}).strict(),o.z.object({attachmentId:H,offset:o.z.number().int().nonnegative()}),o.z.object({id:H,kind:B,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120),size:o.z.number().int().positive().max(N),expiresAt:o.z.string().datetime()});const V=o.z.object({id:o.z.string().trim().min(1).max(120),kind:B,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120),size:o.z.number().int().min(0).max(Number.MAX_SAFE_INTEGER)}),G=o.z.enum(["available","expired","missing"]),W=V.extend({contentState:G.default("available")}).strict(),Y=o.z.object({id:o.z.string().trim().min(1).max(240),text:o.z.string(),attachments:o.z.array(W).max(6).default([])}).strict(),K=o.z.enum(["running","waiting","idle","failed"]),J=o.z.enum(["thinking","tool","editing","approval","responding","unknown"]),Z=o.z.object({id:o.z.string().trim().min(1).max(240).optional(),kind:o.z.string().trim().min(1).max(80).optional(),name:o.z.string().trim().min(1).max(120),inputPreview:o.z.string().trim().max(500).optional(),startedAt:o.z.string().datetime().optional()}).strict(),Q=o.z.enum(["running","completed","failed","waiting"]),X=o.z.object({id:o.z.string().trim().min(1).max(240),turnId:o.z.string().trim().min(1).max(240)}).strict(),ee=X.extend({type:o.z.literal("user-message"),text:o.z.string(),attachments:o.z.array(W).max(6).optional()}).strict(),te=X.extend({type:o.z.literal("ai-message"),text:o.z.string()}).strict(),ne=X.extend({type:o.z.literal("activity"),activityKind:o.z.string().trim().min(1).max(120),title:o.z.string().trim().min(1).max(240),status:Q.optional(),summary:o.z.string().max(4e3).optional(),input:o.z.string().max(1e5).optional(),output:o.z.string().max(1e6).optional(),paths:o.z.array(o.z.string().trim().min(1).max(4096)).max(500).optional(),exitCode:o.z.number().int().optional(),durationMs:o.z.number().int().nonnegative().optional()}).strict(),ie=o.z.discriminatedUnion("type",[ee,te,ne]),oe=o.z.object({sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),items:o.z.array(ie),generatedAt:o.z.string().datetime()}).strict(),ae=o.z.object({sessionId:o.z.string().trim().min(1).max(120),turnId:o.z.string().trim().min(1).max(240),items:o.z.array(ie),generatedAt:o.z.string().datetime()}).strict(),se=o.z.enum(["pending-init","running","interrupted","completed","errored","shutdown","not-found"]),re=o.z.enum(["started","interacted","interrupted"]),de=o.z.object({threadId:o.z.string().trim().min(1).max(240),path:o.z.string().trim().max(4096).optional(),status:se,activity:re.optional(),message:o.z.string().trim().max(1e3).optional(),updatedAt:o.z.string().datetime()}).strict();function ce(e){return"completed"!==e.status}const le=o.z.array(de).max(50).transform(e=>e.filter(ce)),me=o.z.object({toolCalls:o.z.number().int().min(0).default(0),edits:o.z.number().int().min(0).default(0),approvals:o.z.number().int().min(0).default(0)}).strict().default({toolCalls:0,edits:0,approvals:0}),pe=o.z.object({send:o.z.boolean().optional(),interrupt:o.z.boolean().optional(),approval:o.z.boolean().optional(),fork:o.z.boolean().optional(),rename:o.z.boolean().optional(),openApp:o.z.boolean().optional(),close:o.z.boolean().optional()}),ue=o.z.string().trim().min(1).max(240),ge=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("fork"),parentProviderSessionId:ue,throughTurnId:o.z.string().trim().min(1).max(240).optional()}).strict(),o.z.object({kind:o.z.literal("subagent"),parentProviderSessionId:ue}).strict()]),he=o.z.preprocess(function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e;if("fork"===t.kind){const e=ge.safeParse({kind:"fork",parentProviderSessionId:t.parentProviderSessionId,..."string"==typeof t.throughTurnId?{throughTurnId:t.throughTurnId}:{}});return e.success?e.data:void 0}if("subagent"===t.kind){const e=ge.safeParse({kind:"subagent",parentProviderSessionId:t.parentProviderSessionId});return e.success?e.data:void 0}},ge.optional()),ze=o.z.union([V.extend({source:o.z.object({type:o.z.literal("inline"),encoding:o.z.literal("base64"),data:o.z.string().min(1).max(31457280)}).strict()}).strict().superRefine((e,t)=>{const n="image"===e.kind?N:_;(e.size<=0||("file"===e.kind?e.size>=n:e.size>n))&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["size"],message:`Inline ${e.kind} must be between 1 byte and ${n} bytes.`})}),V.extend({source:o.z.object({type:o.z.literal("runtime-path"),path:o.z.string().trim().min(1).max(4096)}).strict()}).strict()]),fe=V.extend({sourceType:o.z.enum(["inline","runtime-path"])}).strict(),ye=o.z.union([o.z.object({id:o.z.string().trim().min(1).max(120),kind:B.optional(),source:o.z.object({type:o.z.literal("upload-ref")}).strict().default({type:"upload-ref"})}).strict(),o.z.object({id:o.z.string().trim().min(1).max(120),kind:B,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120),size:o.z.number().int().min(0).max(Number.MAX_SAFE_INTEGER),source:o.z.object({type:o.z.literal("runtime-path"),path:o.z.string().trim().min(1).max(4096)}).strict()}).strict()]),Ie=o.z.enum(["auto","queue","steer","immediate"]),be=o.z.enum(["ask","auto-review","full-access"]),we=o.z.enum(["review","rename","goal","compact"]),ve=o.z.object({command:we,argument:o.z.string().trim().max(4e3).optional()}).strict().superRefine((e,t)=>{"rename"!==e.command||e.argument||t.addIssue({code:"custom",path:["argument"],message:"Rename requires a thread name."}),"review"!==e.command&&"compact"!==e.command||!e.argument||t.addIssue({code:"custom",path:["argument"],message:`${e.command} does not accept an argument.`})}),xe=o.z.object({command:we,value:o.z.string().max(4e3).optional(),turnId:o.z.string().trim().min(1).max(240).optional()}).strict(),Ae=o.z.object({title:o.z.string().trim().max(120),expectedTitle:o.z.string().trim().max(240).optional(),clientRequestId:o.z.string().trim().min(1).max(160)}).strict(),ke=o.z.object({disposition:o.z.enum(["renamed","already-named"]),aiSessionId:o.z.string().trim().min(1).max(120),appSessionId:o.z.string().trim().min(1).max(120).optional(),title:o.z.string().trim().max(120)}).strict();o.z.enum(["skill","app","plugin"]);const Se=o.z.object({name:o.z.string().trim().min(1).max(240),path:o.z.string().trim().min(1).max(4096)}),Ce=o.z.discriminatedUnion("kind",[Se.extend({kind:o.z.literal("skill"),path:o.z.string().trim().min(1).max(4096).refine(e=>e.startsWith("/"),"Skill paths must be absolute.")}).strict(),Se.extend({kind:o.z.literal("app"),path:o.z.string().trim().min(7).max(4096).regex(/^app:\/\/[^\s/]+$/,"App paths must use app://<id>.")}).strict(),Se.extend({kind:o.z.literal("plugin"),path:o.z.string().trim().min(10).max(4096).regex(/^plugin:\/\/[^\s/]+$/,"Plugin paths must use plugin://<id>.")}).strict()]),je=o.z.array(Ce).max(20).default([]),Re=o.z.enum(["plugin","skill","file","directory","app"]),Te=o.z.object({kind:Re,name:o.z.string().trim().min(1).max(240),description:o.z.string().trim().max(1e3).optional(),path:o.z.string().trim().min(1).max(4096),icon:o.z.string().trim().max(4096).optional()}).strict().superRefine((e,t)=>{"skill"!==e.kind||e.path.startsWith("/")||t.addIssue({code:"custom",path:["path"],message:"Skill paths must be absolute."}),"app"!==e.kind||/^app:\/\/[^\s/]+$/.test(e.path)||t.addIssue({code:"custom",path:["path"],message:"App paths must use app://<id>."}),"plugin"!==e.kind||/^plugin:\/\/[^\s/]+$/.test(e.path)||t.addIssue({code:"custom",path:["path"],message:"Plugin paths must use plugin://<id>."}),"file"!==e.kind&&"directory"!==e.kind||!e.path.startsWith("/")&&!e.path.split(/[\\/]+/).includes("..")||t.addIssue({code:"custom",path:["path"],message:"File and directory paths must be relative to the session cwd."})}),$e=o.z.object({category:o.z.enum(["skills","plugins","apps","files"]),code:o.z.string().trim().min(1).max(160),message:o.z.string().trim().min(1).max(2e3)}).strict(),Ee=o.z.object({sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),cwd:o.z.string().trim().min(1).max(4096),candidates:o.z.array(Te).max(1e3).default([]),diagnostics:o.z.array($e).max(20).default([])}).strict();o.z.object({query:o.z.string().trim().max(240).default("")}).strict();const Pe=o.z.object({sessionId:o.z.string().trim().min(1).max(120),cwd:o.z.string().trim().min(1).max(4096),query:o.z.string().trim().max(240),requestId:o.z.string().trim().min(1).max(160),candidates:o.z.array(Te.refine(e=>"file"===e.kind||"directory"===e.kind,"File search only returns files and directories.")).max(200).default([]),complete:o.z.boolean().default(!1)}).strict(),Oe=o.z.object({message:o.z.string().trim().min(1).max(2e4),mode:Ie.optional(),permissionMode:be.optional(),clientRequestId:o.z.string().trim().min(1).max(160).optional()}),Ne=Oe.extend({attachments:o.z.array(ze).max(6).default([]),references:je}).strict().superRefine((e,t)=>{e.attachments.reduce((e,t)=>e+("inline"===t.source.type?t.size:0),0)>D&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["attachments"],message:"Inline attachments must be 41943040 bytes or less in total."})}),_e=Oe.extend({attachments:o.z.array(ye).max(6).default([]),references:je}).strict(),Ue=o.z.object({type:o.z.literal("runtime-path"),path:o.z.string().trim().min(1).max(4096).refine(e=>e.startsWith("/")||/^[A-Za-z]:[\\/]/.test(e),"Runtime paths must be absolute in the target controlled instance.")}).strict(),Le=o.z.object({modelEntityId:o.z.string().trim().min(1).max(120),modelName:o.z.string().trim().min(1).max(240)}).strict(),De=o.z.enum(["none","minimal","low","medium","high","xhigh","max","ultra"]),qe=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("current-folder"),branch:o.z.string().trim().min(1).max(1024)}).strict(),o.z.object({type:o.z.literal("existing-worktree"),repositoryContextId:o.z.string().trim().min(1).max(160),worktreeId:o.z.string().trim().min(1).max(160)}).strict(),o.z.object({type:o.z.literal("new-worktree"),branchName:o.z.string().trim().min(1).max(255),startRef:o.z.string().trim().min(1).max(2048),expectedSnapshotId:o.z.string().trim().min(1).max(160)}).strict()]),Me=o.z.object({mode:o.z.enum(["current-folder","worktree"]),branch:o.z.string().trim().min(1).max(1024)}).strict(),Be=Ne.safeExtend({agent:q,cwd:Ue,cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Me.optional(),workspaceSelection:qe.optional(),clientRequestId:o.z.string().trim().min(1).max(160),modelSelection:Le.optional(),reasoningEffort:De.optional(),storyId:O.optional()}).strict(),Fe=_e.extend({agent:q,cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Me.optional(),workspaceSelection:qe.optional(),clientRequestId:o.z.string().trim().min(1).max(160),modelSelection:Le.optional(),reasoningEffort:De.optional(),storyId:O.optional()}).strict(),He=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160),modelSelection:Le}).strict(),Ve=o.z.object({sessionId:o.z.string().trim().min(1).max(120),accepted:o.z.literal(!0)}).strict(),Ge=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160),reasoningEffort:De}).strict(),We=o.z.object({cwdFolderId:o.z.string().trim().min(1).max(120).optional(),branch:o.z.string().trim().min(1).max(1024)}).strict(),Ye=o.z.object({sessionId:o.z.string().trim().min(1).max(120),accepted:o.z.literal(!0)}).strict();o.z.object({storyId:O.nullable()}).strict();const Ke=o.z.object({sessionId:o.z.string().trim().min(1).max(120),storyId:O.optional()}).strict(),Je=o.z.object({sessionId:o.z.string().trim().min(1).max(120),unread:o.z.boolean()}).strict(),Ze=o.z.object({path:o.z.string().trim().min(1).max(4096),lineCount:o.z.number().int().nonnegative(),tail:o.z.string()}).strict(),Qe=o.z.object({disposition:o.z.enum(["created","already-created"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),creationSource:o.z.literal("ai-session")}).strict(),Xe=o.z.object({mode:o.z.enum(["current","managed-worktree"]).default("current")}).strict().default({mode:"current"}),et=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160),throughTurnId:o.z.string().trim().min(1).max(240).optional(),workspace:Xe.optional().default({mode:"current"})}).strict(),tt=o.z.object({disposition:o.z.enum(["created","already-created"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),creationSource:o.z.literal("ai-session")}).strict(),nt=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160)}).strict(),it=o.z.object({disposition:o.z.enum(["opened","already-open"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),appSessionId:o.z.string().trim().min(1).max(120),creationSource:M}).strict(),ot=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160)}).strict(),at=o.z.object({disposition:o.z.enum(["closed","already-closed"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),creationSource:M}).strict(),st=o.z.object({disposition:o.z.enum(["cleared","already-cleared"]),aiSessionId:o.z.string().trim().min(1).max(120),clearedSessionIds:o.z.array(o.z.string().trim().min(1).max(120))}).strict();o.z.object({code:o.z.enum(["invalid-request","not-found","unsupported","provider-unavailable","materialization-failed","open-app-failed","close-failed","conflict"]),message:o.z.string().trim().min(1).max(4e3),retryable:o.z.boolean().default(!1),aiSessionId:o.z.string().trim().min(1).max(120).optional(),providerSessionId:o.z.string().trim().min(1).max(240).optional()}).strict();const rt=o.z.object({decision:o.z.enum(["allow","deny","skip"])}).strict(),dt=o.z.object({expectedRevision:o.z.number().int().min(0),queueIds:o.z.array(o.z.string().trim().min(1).max(120)).max(100)}).strict(),ct=o.z.object({paused:o.z.boolean()}).strict(),lt=o.z.object({expectedRevision:o.z.number().int().min(0),message:o.z.string().trim().min(1).max(2e4),attachments:o.z.array(o.z.union([o.z.object({id:o.z.string().trim().min(1).max(120),source:o.z.object({type:o.z.literal("retained")}).strict()}).strict(),ye])).max(6).optional()}).strict();o.z.object({code:o.z.string().trim().min(1).max(160),message:o.z.string(),instanceId:o.z.string().trim().min(1).max(160).optional(),nodeId:o.z.string().trim().min(1).max(160).optional(),route:o.z.string().trim().min(1).max(4096).optional()}).strict();const mt=o.z.object({id:o.z.string().trim().min(1).max(120),messageId:o.z.string().trim().min(1).max(240).optional(),message:o.z.string().trim().min(1).max(2e4),attachments:o.z.array(fe).max(6).default([]),references:je,permissionMode:be.optional(),status:o.z.enum(["queued","sending","failed"]).default("queued"),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),error:o.z.string().trim().max(4e3).optional()}).strict(),pt=o.z.object({revision:o.z.number().int().min(0).default(0),pendingCount:o.z.number().int().min(0).default(0),paused:o.z.boolean().optional(),items:o.z.array(mt).max(100).default([])}).strict().default({revision:0,pendingCount:0,items:[]}),ut=o.z.enum(["control","realtime","adapter-snapshot","transcript-tail","transcript-scan","process-scan","app-session"]),gt=o.z.object({id:o.z.string().trim().min(1).max(240),status:o.z.enum(["running","completed"]),startedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),ht=o.z.object({id:o.z.string().trim().min(1).max(240),providerTurnId:o.z.string().trim().max(240).optional(),source:ut.optional(),userPrompt:o.z.string().trim().optional(),userMessages:o.z.array(Y).max(100).optional(),status:o.z.enum(["queued","running","waiting","completed","failed"]).default("running"),phase:J.optional(),summary:o.z.string().trim().max(1e3).optional(),lastMessage:o.z.string().trim().optional(),lastMessageItemId:o.z.string().trim().max(240).optional(),contextCompactions:o.z.array(gt).max(20).optional(),revision:o.z.number().int().min(0).default(0),sourcePriority:o.z.number().int().min(0).max(100).optional(),snapshotVersion:o.z.number().int().min(0).optional(),observedAt:o.z.string().datetime().optional(),startedAt:o.z.string().datetime().optional(),updatedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),zt=ht.pick({id:!0,providerTurnId:!0,userPrompt:!0,userMessages:!0,status:!0,phase:!0,summary:!0,lastMessage:!0,contextCompactions:!0,startedAt:!0,updatedAt:!0,completedAt:!0}).strict(),ft=o.z.object({id:o.z.string().trim().min(1).max(120),agent:q,creationSource:M.default("app-session"),appSessionId:o.z.string().trim().max(120).optional(),appId:o.z.string().trim().max(120).optional(),providerSessionId:o.z.string().trim().max(240).optional(),lineage:he,providerMeta:o.z.record(o.z.string(),o.z.unknown()).optional(),modelSelection:Le.optional(),reasoningEffort:De.optional(),storyId:O.optional(),appBindingKeys:o.z.array(o.z.string().trim().min(1).max(240)).max(20).optional(),actions:pe.optional(),activeTurnId:o.z.string().trim().max(240).optional(),title:o.z.string().trim().max(240).optional(),cwd:o.z.string().trim().max(4096).optional(),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),userPrompt:o.z.string().trim().optional(),turns:o.z.array(ht).max(50).optional(),status:K.default("running"),phase:J.default("unknown"),summary:o.z.string().trim().max(1e3).optional(),lastMessage:o.z.string().trim().optional(),lastMessageItemId:o.z.string().trim().max(240).optional(),currentTool:Z.optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).default(0),subAgents:le.default([]),transcriptPath:o.z.string().trim().max(4096).optional(),transcriptSize:o.z.number().int().min(0).optional(),startedAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional(),error:o.z.string().trim().max(4e3).optional(),counters:me,queue:pt,unread:o.z.boolean().default(!1)}).strict(),yt=ft.pick({id:!0,appBindingKeys:!0,cwd:!0,error:!0,providerMeta:!0,modelSelection:!0,reasoningEffort:!0,queue:!0,subAgents:!0}).strict(),It=ht.pick({id:!0,providerTurnId:!0,status:!0,phase:!0,revision:!0,startedAt:!0,updatedAt:!0,completedAt:!0}).extend({bodyRevision:o.z.string().trim().min(1).max(64)}).strict(),bt=o.z.object({sessionId:o.z.string().trim().min(1).max(120),revision:o.z.string().trim().min(1).max(64),turns:o.z.array(It).max(50)}).strict(),wt=o.z.object({sessionId:o.z.string().trim().min(1).max(120),revision:o.z.string().trim().min(1).max(64),turn:ht}).strict(),vt=o.z.string().trim().min(1).max(64),xt=o.z.object({kind:o.z.literal("not-modified"),revision:vt}).strict(),At=o.z.discriminatedUnion("kind",[xt,o.z.object({kind:o.z.literal("updated"),revision:vt,detail:yt}).strict()]),kt=o.z.discriminatedUnion("kind",[xt,o.z.object({kind:o.z.literal("updated"),revision:vt,index:bt}).strict()]),St=o.z.discriminatedUnion("kind",[xt,o.z.object({kind:o.z.literal("updated"),revision:vt,body:wt}).strict()]),Ct=o.z.object({session:ft,provider:o.z.string().trim().min(1).max(80),action:o.z.enum(["send","queue","steer","interrupt","approval"]),decision:o.z.enum(["allow","deny","skip"]).optional(),turnId:o.z.string().trim().min(1).max(240).optional(),providerTurnId:o.z.string().trim().min(1).max(240).optional(),queueId:o.z.string().trim().min(1).max(120).optional()}).strict(),jt=Ct.omit({session:!0}).extend({sessionId:o.z.string().trim().min(1).max(120),messageId:o.z.string().trim().min(1).max(240).optional()}).strict(),Rt=o.z.object({sessionId:o.z.string().trim().min(1).max(120),queueRevision:o.z.number().int().min(0),action:o.z.enum(["retry","remove","edit","reorder","pause"]),queueId:o.z.string().trim().min(1).max(120).optional()}).strict(),Tt=o.z.union([jt,Ct.transform(function(e){const t=e.session.turns?.at(-1),n=(e.queueId?e.session.queue?.items.find(t=>t.id===e.queueId)?.messageId:void 0)||("send"===e.action||"queue"===e.action||"steer"===e.action?t?.userMessages?.at(-1)?.id:void 0);return jt.parse({sessionId:e.session.id,provider:e.provider,action:e.action,...e.decision?{decision:e.decision}:{},...e.turnId||e.session.activeTurnId||t?.id?{turnId:e.turnId||e.session.activeTurnId||t?.id}:{},...e.providerTurnId||t?.providerTurnId?{providerTurnId:e.providerTurnId||t?.providerTurnId}:{},...e.queueId?{queueId:e.queueId}:{},...n?{messageId:n}:{}})})]),$t=o.z.object({id:o.z.string().trim().min(1).max(120),agent:q,creationSource:M,providerSessionId:o.z.string().trim().min(1).max(240),lineage:he,modelSelection:Le.optional(),reasoningEffort:De.optional(),storyId:O.optional(),title:o.z.string().trim().max(240).optional(),userPrompt:o.z.string().trim().optional(),lastMessage:o.z.string().trim().optional(),cwd:o.z.string().trim().min(1).max(4096),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),lastActiveAt:o.z.string().datetime(),archivedAt:o.z.string().datetime()}).strict();o.z.object({schemaVersion:o.z.literal(1).default(1),items:o.z.array($t).max(1e4).default([])}).strict();const Et=o.z.object({items:o.z.array($t).max(1e4).default([])}).strict(),Pt=o.z.object({item:$t,turns:o.z.array(zt).max(50).default([])}).strict(),Ot=o.z.object({modelSelection:Le.optional()}).strict(),Nt=o.z.object({disposition:o.z.enum(["resumed","already-open"]),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),appSessionId:o.z.string().trim().min(1).max(120).optional(),creationSource:M}).strict(),_t=ht.omit({userMessages:!0}),Ut=ft.pick({id:!0,agent:!0,creationSource:!0,appSessionId:!0,appId:!0,providerSessionId:!0,lineage:!0,providerMeta:!0,modelSelection:!0,reasoningEffort:!0,storyId:!0,appBindingKeys:!0,actions:!0,activeTurnId:!0,title:!0,cwd:!0,cwdFolderId:!0,userPrompt:!0,turns:!0,status:!0,phase:!0,summary:!0,lastMessage:!0,lastMessageItemId:!0,currentTool:!0,toolCallsSinceLastMessage:!0,subAgents:!0,queue:!0,startedAt:!0,updatedAt:!0,error:!0,unread:!0}).extend({turns:o.z.array(_t).max(50).optional(),detailRevision:o.z.string().trim().min(1).max(64).optional(),turnsRevision:o.z.string().trim().min(1).max(64).optional(),latestTurnRef:o.z.object({id:ht.shape.id,bodyRevision:o.z.string().trim().min(1).max(64)}).strict().optional(),turnCount:o.z.number().int().min(0).optional(),subAgentCount:o.z.number().int().min(0).optional(),lastUserMessageAt:o.z.string().datetime().optional()}).strict(),Lt=o.z.object({runningCount:o.z.number().int().min(0).default(0),waitingCount:o.z.number().int().min(0).default(0),staleCount:o.z.number().int().min(0).default(0),sessions:o.z.array(Ut).default([]),updatedAt:o.z.string().datetime()}).strict();o.z.object({streamId:o.z.string().trim().min(1).max(240),revision:o.z.number().int().min(0),lastEventAt:o.z.string().datetime(),snapshot:Lt}).strict();const Dt=Lt.pick({runningCount:!0,waitingCount:!0,staleCount:!0,updatedAt:!0}).extend({idleCount:o.z.number().int().min(0).default(0),problemCount:o.z.number().int().min(0).default(0),revision:o.z.number().int().min(0).optional()}),qt=o.z.enum(["provider-event","app-session-created","app-session-updated","app-session-deleted","discovery-scan","control-action","heartbeat-sync","startup"]),Mt=o.z.object({streamId:o.z.string().trim().min(1).max(240),instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),revision:o.z.number().int().min(0),previousRevision:o.z.number().int().min(0).optional(),traceId:o.z.string().trim().min(1).max(160),generatedAt:o.z.string().datetime(),reason:qt}).strict(),Bt=o.z.object({meta:Mt,snapshot:Lt}).strict(),Ft=o.z.object({meta:Mt,upserted:o.z.array(Ut).default([]),removed:o.z.array(o.z.string().trim().min(1).max(120)).default([])}).strict(),Ht=o.z.object({meta:Mt,sessionIds:o.z.array(o.z.string().trim().min(1).max(120)).default([]),expiresAt:o.z.string().datetime()}).strict();o.z.object({instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240).optional(),turnId:o.z.string().trim().min(1).max(240),itemId:o.z.string().trim().min(1).max(240),delta:o.z.string().min(1),generatedAt:o.z.string().datetime()}).strict().omit({instanceId:!0,nodeId:!0,providerSessionId:!0}).strict(),o.z.object({instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240),item:ie,generatedAt:o.z.string().datetime()}).strict(),o.z.object({instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),sessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().min(1).max(240).optional(),turnId:o.z.string().trim().min(1).max(240),itemId:o.z.string().trim().min(1).max(240),field:o.z.literal("output"),delta:o.z.string().min(1),generatedAt:o.z.string().datetime()}).strict().omit({instanceId:!0,nodeId:!0,providerSessionId:!0}).strict();const Vt=o.z.object({streamId:o.z.string().trim().min(1).max(240),instanceId:o.z.string().trim().min(1).max(160),sinceRevision:o.z.number().int().min(0),latestRevision:o.z.number().int().min(0),earliestRetainedRevision:o.z.number().int().min(0),syncRequired:o.z.boolean().default(!1),events:o.z.array(o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("ai-session.snapshot"),payload:Bt}).strict(),o.z.object({type:o.z.literal("ai-session.patch"),payload:Ft}).strict(),o.z.object({type:o.z.literal("ai-session.removed"),payload:Ht}).strict()])).default([])}).strict(),Gt=o.z.object({source:ut,sourcePriority:o.z.number().int().min(0).max(100).optional(),observedAt:o.z.string().datetime().optional(),snapshotVersion:o.z.number().int().min(0).optional()}).strict(),Wt=Gt.extend({type:o.z.literal("snapshot"),agent:o.z.string().trim().min(1).max(80),creationSource:M.optional(),appSessionId:o.z.string().trim().max(120).optional(),appId:o.z.string().trim().max(120).optional(),providerSessionId:o.z.string().trim().max(240).optional(),lineage:ge.optional(),providerMeta:o.z.record(o.z.string(),o.z.unknown()).optional(),modelSelection:Le.optional(),reasoningEffort:De.optional(),storyId:O.optional(),appBindingKeys:o.z.array(o.z.string().trim().min(1).max(240)).max(20).optional(),actions:pe.optional(),title:o.z.string().trim().max(240).optional(),cwd:o.z.string().trim().max(4096).optional(),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),activeTurnId:o.z.string().trim().max(240).optional(),userPrompt:o.z.string().trim().optional(),turns:o.z.array(ht).max(50).optional(),status:K.optional(),phase:J.optional(),summary:o.z.string().trim().max(1e3).optional(),lastMessage:o.z.string().trim().optional(),lastMessageItemId:o.z.string().trim().max(240).optional(),error:o.z.string().trim().max(4e3).optional(),currentTool:Z.optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).optional(),subAgents:le.optional(),transcriptPath:o.z.string().trim().max(4096).optional(),transcriptSize:o.z.number().int().min(0).optional(),replaceActivity:o.z.boolean().optional()}).strict(),Yt=Gt.extend({type:o.z.literal("event"),sessionId:o.z.string().trim().min(1).max(120),kind:o.z.enum(["lifecycle","send-ack","turn-started","user-message","assistant-message","approval-requested","turn-completed","session-error","tool-activity","sub-agent-activity","context-compaction","model-selection","reasoning-effort"]),modelSelection:Le.optional(),reasoningEffort:De.optional(),activeTurnId:o.z.string().trim().max(240).optional(),providerTurnId:o.z.string().trim().max(240).optional(),userPrompt:o.z.string().trim().optional(),userMessage:Y.optional(),text:o.z.string().optional(),itemId:o.z.string().trim().max(240).optional(),status:K.optional(),phase:J.optional(),summary:o.z.string().trim().max(1e3).optional(),error:o.z.string().trim().max(4e3).optional(),currentTool:Z.nullable().optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).optional(),subAgents:le.optional(),contextCompaction:gt.optional(),counters:o.z.object({toolCalls:o.z.number().int().min(0).optional(),edits:o.z.number().int().min(0).optional(),approvals:o.z.number().int().min(0).optional()}).strict().optional()}).strict().superRefine((e,t)=>{if("model-selection"===e.kind?e.modelSelection||t.addIssue({code:"custom",path:["modelSelection"],message:"model-selection events require modelSelection"}):void 0!==e.modelSelection&&t.addIssue({code:"custom",path:["modelSelection"],message:"modelSelection is only valid for model-selection events"}),"reasoning-effort"===e.kind?e.reasoningEffort||t.addIssue({code:"custom",path:["reasoningEffort"],message:"reasoning-effort events require reasoningEffort"}):void 0!==e.reasoningEffort&&t.addIssue({code:"custom",path:["reasoningEffort"],message:"reasoningEffort is only valid for reasoning-effort events"}),"session-error"!==e.kind||e.error||t.addIssue({code:"custom",path:["error"],message:"session-error events require error"}),"context-compaction"===e.kind?e.contextCompaction||t.addIssue({code:"custom",path:["contextCompaction"],message:"context-compaction events require contextCompaction"}):void 0!==e.contextCompaction&&t.addIssue({code:"custom",path:["contextCompaction"],message:"contextCompaction is only valid for context-compaction events"}),"send-ack"!==e.kind&&"user-message"!==e.kind&&void 0!==e.userMessage&&t.addIssue({code:"custom",path:["userMessage"],message:"userMessage is only valid for send-ack and user-message events"}),"sub-agent-activity"===e.kind?e.subAgents||t.addIssue({code:"custom",path:["subAgents"],message:"sub-agent-activity events require subAgents"}):void 0!==e.subAgents&&t.addIssue({code:"custom",path:["subAgents"],message:"subAgents is only valid for sub-agent-activity events"}),"tool-activity"!==e.kind)return void 0!==e.currentTool&&t.addIssue({code:"custom",path:["currentTool"],message:"currentTool is only valid for tool-activity events"}),void(void 0!==e.toolCallsSinceLastMessage&&t.addIssue({code:"custom",path:["toolCallsSinceLastMessage"],message:"toolCallsSinceLastMessage is only valid for tool-activity events"}));"currentTool"in e||t.addIssue({code:"custom",path:["currentTool"],message:"tool-activity events require currentTool"}),void 0===e.toolCallsSinceLastMessage&&t.addIssue({code:"custom",path:["toolCallsSinceLastMessage"],message:"tool-activity events require toolCallsSinceLastMessage"})});o.z.discriminatedUnion("type",[Wt,Yt]);const Kt=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Jt=o.z.string().datetime(),Zt=o.z.string().trim().min(1).max(255).refine(e=>!(/[\u0000-\u001f\u007f ~^:?*[\\]/.test(e)||e.includes("..")||e.endsWith(".")||e.endsWith("/")),"Invalid Git name."),Qt=o.z.string().min(1).max(4096).refine(e=>!(e.includes("\0")||e.startsWith("/")||e.startsWith("\\")||/^[a-zA-Z]:[\\/]/.test(e))&&e.split("/").every(e=>e.length>0&&"."!==e&&".."!==e&&".git"!==e),"Path must be a safe repository-relative path."),Xt=o.z.enum(["ai-session","app-session"]),en=o.z.enum(["available","session-not-found","session-inactive","cwd-missing","cwd-inaccessible","git-unavailable","not-worktree"]),tn=o.z.enum(["branch","detached","unborn"]),nn=o.z.enum(["review-changes","resolve-conflicts","publish-branch","push","pull","diverged","up-to-date"]),on=o.z.enum(["conflict","staged","unstaged","untracked"]),an=o.z.enum(["added","modified","deleted","renamed","copied","type-changed","unmerged","untracked"]),sn=o.z.object({state:tn,oid:o.z.string().regex(/^[0-9a-f]{40,64}$/).optional(),branch:o.z.string().min(1).max(1024).optional()}).strict(),rn=o.z.object({ref:o.z.string().min(1).max(2048),remote:Zt,branch:o.z.string().min(1).max(1024),ahead:o.z.number().int().nonnegative(),behind:o.z.number().int().nonnegative()}).strict(),dn=o.z.object({id:Kt,isCurrent:o.z.boolean(),isMain:o.z.boolean(),managed:o.z.boolean(),head:sn,dirty:o.z.boolean(),locked:o.z.boolean(),lockReason:o.z.string().max(1e3).optional(),prunable:o.z.boolean(),activeAiSessionIds:o.z.array(Kt).max(256).default([]),activeAppSessionIds:o.z.array(Kt).max(256).default([])}).strict(),cn=o.z.enum(["main-worktree","external-worktree","outside-workspace-roots","dirty","locked","prunable","session-occupied","path-inaccessible"]),ln=dn.extend({canCreateAiSession:o.z.boolean(),canRemove:o.z.boolean(),createAiSessionBlockers:o.z.array(cn).max(16).default([]),removeBlockers:o.z.array(cn).max(16).default([])}).strict(),mn=o.z.object({repositoryId:Kt,repositoryContextId:Kt,snapshotId:Kt,items:o.z.array(ln).max(1e4)}).strict(),pn=o.z.object({conflicts:o.z.number().int().nonnegative(),staged:o.z.number().int().nonnegative(),unstaged:o.z.number().int().nonnegative(),untracked:o.z.number().int().nonnegative()}).strict(),un=o.z.object({name:Zt,fetchUrl:o.z.string().max(4096).optional(),pushUrl:o.z.string().max(4096).optional()}).strict(),gn=o.z.object({availability:en,sessionKind:Xt,sessionId:Kt,observedAt:Jt,snapshotId:Kt.optional(),repositoryId:Kt.optional(),repositoryContextId:Kt.optional(),repositoryRoot:o.z.string().min(1).max(4096).optional(),displayName:o.z.string().trim().min(1).max(255).optional(),cwdRelativePath:o.z.string().max(4096).optional(),head:sn.optional(),upstream:rn.optional(),currentWorktree:dn.optional(),changes:pn.optional(),remotes:o.z.array(un).max(128).optional(),primaryAction:nn.optional()}).strict(),hn=o.z.enum(["directory","file","symlink","submodule","nested-repository","special"]),zn=o.z.object({executable:o.z.boolean(),gitMode:o.z.enum(["100644","100755","120000","160000"]).optional()}).strict(),fn=o.z.object({name:o.z.string().min(1).max(1024),path:Qt,kind:hn,traversable:o.z.boolean(),editable:o.z.boolean(),size:o.z.number().int().nonnegative().optional(),mode:zn.optional()}).strict();o.z.object({path:o.z.string().max(4096),entries:o.z.array(fn).max(1e4),snapshotId:Kt}).strict();const yn=o.z.object({name:o.z.string().min(1).max(1024),path:Qt,kind:o.z.enum(["directory","file"])}).strict();o.z.object({entries:o.z.array(yn).max(200),truncated:o.z.boolean()}).strict();const In=o.z.string().min(16).max(160).regex(/^[a-zA-Z0-9_.:-]+$/),bn=o.z.object({path:Qt,content:o.z.string(),byteLength:o.z.number().int().nonnegative(),version:In,mode:zn}).strict(),wn=o.z.object({path:Qt,oldPath:Qt.optional(),scope:on,status:an,version:In,binary:o.z.boolean().default(!1)}).strict(),vn=o.z.object({snapshotId:Kt,summary:pn,entries:o.z.array(wn).max(1e5)}).strict();o.z.object({file:bn.optional(),snapshotId:Kt,context:gn,changes:vn}).strict();const xn=o.z.object({kind:o.z.enum(["metadata","hunk","context","addition","deletion"]),content:o.z.string(),oldLine:o.z.number().int().positive().optional(),newLine:o.z.number().int().positive().optional(),oldStart:o.z.number().int().nonnegative().optional(),oldCount:o.z.number().int().nonnegative().optional(),newStart:o.z.number().int().nonnegative().optional(),newCount:o.z.number().int().nonnegative().optional(),heading:o.z.string().optional(),hunkId:o.z.string().min(1).max(200).optional()}).strict();o.z.object({path:Qt,oldPath:Qt.optional(),scope:on,binary:o.z.boolean(),complete:o.z.boolean(),truncated:o.z.boolean(),byteLimit:o.z.number().int().positive(),content:o.z.string(),lines:o.z.array(xn).max(2e5),contextGaps:o.z.array(o.z.object({gapId:o.z.string().min(1).max(500),beforeHunkId:o.z.string().min(1).max(200).optional(),afterHunkId:o.z.string().min(1).max(200).optional(),lines:o.z.array(xn).max(6e3),startLineCount:o.z.number().int().nonnegative().max(3e3),hasMore:o.z.boolean()}).strict()).max(2e4),version:In,snapshotId:Kt}).strict();const An=o.z.object({name:o.z.string().min(1).max(1024),oid:o.z.string().regex(/^[0-9a-f]{40,64}$/),kind:o.z.enum(["local","remote-tracking"]),current:o.z.boolean(),upstream:o.z.string().min(1).max(2048).optional(),ahead:o.z.number().int().nonnegative().optional(),behind:o.z.number().int().nonnegative().optional(),checkedOutWorktreeIds:o.z.array(Kt).max(256).default([])}).strict(),kn=o.z.object({snapshotId:Kt,branches:o.z.array(An).max(1e5)}).strict();o.z.object({snapshotId:Kt,context:gn,branches:kn}).strict(),o.z.object({ok:o.z.literal(!0),snapshotId:Kt,context:gn,changes:vn.optional(),commitOid:o.z.string().regex(/^[0-9a-f]{40,64}$/).optional()}).strict();const Sn=o.z.enum(["REPOSITORY_REQUEST_INVALID","REPOSITORY_SESSION_NOT_FOUND","REPOSITORY_SESSION_INACTIVE","REPOSITORY_CWD_MISSING","REPOSITORY_CWD_INACCESSIBLE","REPOSITORY_GIT_UNAVAILABLE","REPOSITORY_NOT_WORKTREE","REPOSITORY_PATH_INVALID","REPOSITORY_PATH_FORBIDDEN","REPOSITORY_FILE_NOT_FOUND","REPOSITORY_FILE_EXISTS","REPOSITORY_FILE_UNSUPPORTED","REPOSITORY_FILE_TOO_LARGE","REPOSITORY_FILE_BINARY","REPOSITORY_FILE_STALE","REPOSITORY_STATE_STALE","REPOSITORY_WORKTREE_NOT_FOUND","REPOSITORY_WORKTREE_OCCUPIED","REPOSITORY_WORKTREE_UNSAFE","REPOSITORY_BRANCH_INVALID","REPOSITORY_BRANCH_OCCUPIED","REPOSITORY_BRANCH_UNMERGED","REPOSITORY_CONFLICT","REPOSITORY_DIRTY","REPOSITORY_NOTHING_TO_COMMIT","REPOSITORY_IDENTITY_MISSING","REPOSITORY_HOOK_FAILED","REPOSITORY_SIGNING_FAILED","REPOSITORY_AUTHENTICATION_FAILED","REPOSITORY_CREDENTIAL_MISSING","REPOSITORY_CREDENTIAL_AMBIGUOUS","REPOSITORY_REMOTE_UNSUPPORTED","REPOSITORY_HOST_KEY_REQUIRED","REPOSITORY_AUTHENTICATION_REJECTED","REPOSITORY_NON_FAST_FORWARD","REPOSITORY_UPSTREAM_MISSING","REPOSITORY_COMMAND_TIMEOUT","REPOSITORY_OUTPUT_LIMIT","REPOSITORY_OPERATION_ABORTED","REPOSITORY_OPERATION_FAILED"]);o.z.object({ok:o.z.literal(!1),error:o.z.object({code:Sn,message:o.z.string().trim().min(1).max(2e3),retryable:o.z.boolean(),details:o.z.record(o.z.string(),o.z.union([o.z.string(),o.z.number(),o.z.boolean()])).optional()}).strict()}).strict();const Cn=o.z.object({expectedSnapshotId:Kt}).strict(),jn=o.z.object({path:Qt,expectedVersion:In}).strict();o.z.object({path:Qt,content:o.z.string().max(4194304),expectedAbsent:o.z.literal(!0),expectedSnapshotId:Kt}).strict(),o.z.object({path:Qt,content:o.z.string().max(4194304),expectedVersion:In,expectedSnapshotId:Kt}).strict(),o.z.object({path:Qt,destination:Qt,expectedVersion:In,expectedDestinationAbsent:o.z.literal(!0),expectedSnapshotId:Kt}).strict(),o.z.object({path:Qt,expectedVersion:In,expectedSnapshotId:Kt,confirm:o.z.literal(!0)}).strict(),Cn.extend({paths:o.z.array(jn).min(1).max(1e3)}).strict(),Cn.extend({paths:o.z.array(jn).min(1).max(1e3)}).strict(),Cn.extend({paths:o.z.array(jn).min(1).max(1e3),confirm:o.z.literal(!0)}).strict(),Cn.extend({paths:o.z.array(jn).min(1).max(1e3),confirm:o.z.literal(!0)}).strict(),Cn.extend({message:o.z.string().trim().min(1).max(65536)}).strict();const Rn=o.z.discriminatedUnion("mode",[o.z.object({mode:o.z.literal("new-branch"),branchName:Zt,startRef:o.z.string().trim().min(1).max(2048),expectedSnapshotId:Kt}).strict(),o.z.object({mode:o.z.literal("existing-branch"),branchName:Zt,expectedSnapshotId:Kt}).strict()]),Tn=Cn.extend({worktreeId:Kt,confirm:o.z.literal(!0)}).strict(),$n=o.z.object({worktreeId:Kt,worktrees:mn}).strict(),En=o.z.object({removedWorktreeId:Kt,branchRetained:o.z.boolean(),worktrees:mn}).strict(),Pn=o.z.enum(["main-worktree","outside-workspace-roots","path-inaccessible","locked","prunable","session-occupied","main-session-occupied","detached-head","unborn-head","main-dirty"]),On=o.z.object({worktreeId:Kt}).strict(),Nn=o.z.object({worktreeId:Kt,canMove:o.z.boolean(),blockers:o.z.array(Pn).max(16).default([]),targetBranch:o.z.string().min(1).max(1024).optional(),targetChanges:pn.default({conflicts:0,staged:0,unstaged:0,untracked:0}),mainWorktreeId:Kt,mainBranch:o.z.string().min(1).max(1024).optional()}).strict(),_n=Cn.extend({worktreeId:Kt,confirm:o.z.literal(!0)}).strict(),Un=o.z.object({movedWorktreeId:Kt,adoptedBranch:o.z.string().min(1).max(1024),previousHead:o.z.string().regex(/^[0-9a-f]{40,64}$/),carriedChanges:o.z.boolean(),worktrees:mn}).strict(),Ln=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("current")}).strict(),o.z.object({type:o.z.literal("worktree"),repositoryContextId:Kt,worktreeId:Kt}).strict()]);o.z.object({agent:o.z.enum(["codex","claude","opencode"]),workspaceSelection:Ln,message:o.z.string().trim().min(1).max(2e4),clientRequestId:Kt,permissionMode:o.z.enum(["ask","auto-review","full-access"]).optional()}).strict(),o.z.object({agent:o.z.enum(["codex","claude","opencode"]),worktree:Rn,message:o.z.string().trim().min(1).max(2e4),clientRequestId:Kt,permissionMode:o.z.enum(["ask","auto-review","full-access"]).optional()}).strict(),o.z.object({aiSessionId:Kt,providerSessionId:o.z.string().trim().min(1).max(240),worktreeId:Kt,disposition:o.z.literal("started")}).strict();const Dn=o.z.object({name:o.z.string().min(1).max(1024),kind:o.z.enum(["branch","head"]).default("branch"),current:o.z.boolean(),currentFolderSelectable:o.z.boolean(),worktreeSelectable:o.z.boolean(),worktreeCheckout:o.z.enum(["attached","detached"]).default("attached"),currentFolderReason:o.z.enum(["dirty","session-occupied","branch-occupied"]).optional(),worktreeReason:o.z.enum(["current-branch","branch-occupied","worktree-unavailable"]).optional()}).strict(),qn=o.z.object({availability:en,currentBranch:o.z.string().min(1).max(1024).optional(),dirty:o.z.boolean().default(!1),branches:o.z.array(Dn).max(1e5).default([]),repositoryContextId:Kt.optional(),snapshotId:Kt.optional(),worktrees:o.z.array(ln).max(1e4).default([])}).strict();o.z.object({cwd:Ue}).strict(),o.z.object({cwd:Ue,branch:Zt}).strict(),o.z.union([Be.safeExtend({gitSelection:Me,workspaceSelection:o.z.never().optional()}).strict(),Be.safeExtend({gitSelection:o.z.never().optional(),workspaceSelection:qe}).strict()]),o.z.union([Fe.safeExtend({cwd:Ue,gitSelection:Me,workspaceSelection:o.z.never().optional()}).strict(),Fe.safeExtend({cwd:Ue,gitSelection:o.z.never().optional(),workspaceSelection:qe}).strict()]),Cn.extend({name:Zt}).strict(),Cn.extend({branch:o.z.string().trim().min(1).max(2048)}).strict(),Cn.extend({name:Zt,remoteTrackingRef:o.z.string().trim().min(1).max(2048)}).strict(),Cn.extend({name:Zt,confirm:o.z.literal(!0)}).strict(),Cn.extend({remote:Zt}).strict(),Cn.extend({remote:Zt,sourceBranch:Zt,targetBranch:Zt,setUpstream:o.z.boolean(),confirmSetUpstream:o.z.boolean().optional()}).strict().refine(e=>!e.setUpstream||!0===e.confirmSetUpstream,{message:"Setting an upstream requires explicit confirmation.",path:["confirmSetUpstream"]}),Cn.extend({remote:Zt,sourceBranch:Zt,targetBranch:Zt}).strict();const Mn=o.z.object({maxIdleAiSessions:o.z.number().int().min(1).max(50).default(5)}).strict(),Bn=o.z.string().trim().min(1).max(1024).refine(e=>!e.startsWith("/")&&!e.includes("\\")&&e.split("/").every(e=>e.length>0&&"."!==e&&".."!==e),"Story paths must be normalized relative POSIX paths."),Fn=o.z.string().regex(/^[a-f0-9]{64}$/),Hn=o.z.object({title:o.z.string().trim().min(1).max(240),storyPath:Bn,revision:Fn}).strict(),Vn=o.z.object({agent:q.optional(),mode:Ie.optional(),permissionMode:be.optional(),modelSelection:Le.optional(),reasoningEffort:De.optional(),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Me.optional(),workspaceSelection:qe.optional()}).strict().refine(e=>!(e.gitSelection&&e.workspaceSelection),{message:"gitSelection and workspaceSelection are mutually exclusive.",path:["workspaceSelection"]}),Gn=o.z.object({id:o.z.string().trim().min(1).max(120),title:o.z.string().trim().min(1).max(120),promptTemplate:o.z.string().trim().min(1).max(32e3),targetInstanceId:o.z.string().trim().min(1).max(120).optional(),sessionPreset:Vn.optional()}).strict(),Wn=Gn.omit({id:!0,targetInstanceId:!0}).extend({targetInstanceId:Gn.shape.targetInstanceId.unwrap()}).strict(),Yn=Wn.extend({id:Gn.shape.id.optional()}).strict(),Kn=o.z.object({targetInstanceId:o.z.string().trim().min(1).max(120),aiSessionId:o.z.string().trim().min(1).max(120)}).strict(),Jn=o.z.discriminatedUnion("scheduleKind",[o.z.object({scheduleKind:o.z.literal("interval"),intervalMs:o.z.number().int().min(6e4)}).strict(),o.z.object({scheduleKind:o.z.literal("daily"),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict(),o.z.object({scheduleKind:o.z.literal("weekly"),weekdays:o.z.array(o.z.number().int().min(0).max(6)).min(1).max(7).refine(e=>new Set(e).size===e.length,"Weekdays must be unique."),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict(),o.z.object({scheduleKind:o.z.literal("monthly"),dayOfMonth:o.z.number().int().min(-3).max(31).refine(e=>0!==e,"Day of month must not be zero."),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict()]),Zn=o.z.object({cooldownMs:o.z.number().int().min(0).max(864e5).optional(),maxConcurrentRuns:o.z.number().int().min(1).max(20).default(1),whenBusy:o.z.enum(["skip","queue"]).default("skip")}).strict(),Qn=o.z.object({id:o.z.string().trim().min(1).max(120),storyId:O,actionId:Gn.shape.id,schedule:Jn,enabled:o.z.boolean().default(!0),policy:Zn.default({maxConcurrentRuns:1,whenBusy:"skip"}),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Xn=Qn.omit({id:!0,createdAt:!0,updatedAt:!0}).strict(),ei=o.z.object({action:Gn.extend({targetInstanceId:Gn.shape.targetInstanceId.unwrap()}).strict(),automation:Xn.omit({storyId:!0,actionId:!0}).strict()}).strict(),ti=o.z.object({actionId:Qn.shape.actionId.optional(),schedule:Jn.optional(),enabled:o.z.boolean().optional(),policy:Zn.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one Automation field is required."),ni=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),ii=o.z.enum(["queued","dispatching","running","completed","failed","skipped"]),oi=o.z.object({id:o.z.string().trim().min(1).max(160),automationId:Qn.shape.id,eventType:o.z.enum(["manual","schedule"]),status:ii,scheduledFor:o.z.string().datetime(),targetInstanceId:o.z.string().trim().min(1).max(120),aiSessionId:o.z.string().trim().min(1).max(120).optional(),error:ni.optional(),queuedAt:o.z.string().datetime(),startedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),ai=o.z.enum(["disabled","blocked","scheduled","running","error"]),si=o.z.object({automation:Qn,effectiveStatus:ai,blockedReason:ni.optional(),nextRunAt:o.z.string().datetime().optional(),currentRuns:o.z.array(oi).max(20).default([]),lastRun:oi.optional()}).strict(),ri=o.z.object({automations:o.z.array(si).default([])}).strict(),di=o.z.object({runs:o.z.array(oi).max(120).default([])}).strict(),ci=o.z.object({clientRequestId:o.z.string().trim().min(1).max(160)}).strict();o.z.object({storyId:O,automationId:Qn.shape.id,change:o.z.enum(["created","updated","deleted","status","run"]),status:si.optional(),run:oi.optional()}).strict();const li=o.z.enum(["pending","decided","cancelled","expired"]),mi=o.z.object({id:o.z.string().trim().min(1).max(120),label:o.z.string().trim().min(1).max(240),description:o.z.string().trim().max(2e3).optional()}).strict(),pi=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),ui=o.z.object({id:o.z.string().trim().min(1).max(160),storyId:O,sessionId:o.z.string().trim().min(1).max(120),turnId:o.z.string().trim().min(1).max(240).optional(),question:o.z.string().trim().min(1).max(32e3),options:o.z.array(mi).max(20).default([]),allowFreeText:o.z.boolean().default(!0),context:o.z.string().trim().max(8e3).optional(),status:li,revision:o.z.number().int().min(1),response:o.z.string().trim().max(2e4).optional(),selectedOptionId:o.z.string().trim().min(1).max(120).optional(),decidedTurnId:o.z.string().trim().min(1).max(240).optional(),expiredReason:pi.optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),decidedAt:o.z.string().datetime().optional()}).strict();o.z.object({question:o.z.string().trim().min(1).max(32e3),options:o.z.array(mi).max(20).optional(),allowFreeText:o.z.boolean().optional(),context:o.z.string().trim().max(8e3).optional()}).strict().superRefine((e,t)=>{const n=e.options||[];new Set(n.map(e=>e.id)).size!==n.length&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["options"],message:"Decision option ids must be unique."}),!1===e.allowFreeText&&0===n.length&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["allowFreeText"],message:"A decision without free text requires at least one option."})});const gi=o.z.object({optionId:o.z.string().trim().min(1).max(120).optional(),response:o.z.string().trim().min(1).max(2e4).optional(),expectedRevision:o.z.number().int().min(1),retry:o.z.boolean().optional()}).strict().refine(e=>Boolean(e.optionId)||Boolean(e.response),{message:"A decision requires a selected option or a free-text response.",path:["response"]}),hi=o.z.object({expectedRevision:o.z.number().int().min(1)}).strict(),zi=o.z.object({decisions:o.z.array(ui).default([])}).strict();ui.strip(),o.z.object({decisions:o.z.array(o.z.unknown()).default([])}).strip(),o.z.object({storyId:O,decisionId:ui.shape.id,revision:o.z.number().int().min(1),change:o.z.enum(["created","decided","cancelled","expired"]),decision:ui.optional()}).strict();const fi=o.z.object({id:O,ownerNodeId:o.z.string().trim().min(1).max(120),title:o.z.string().trim().min(1).max(240),description:o.z.string().trim().max(4e3).optional(),documents:o.z.array(Hn).max(500).default([]),actions:o.z.array(Gn).max(50).default([]),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),archivedAt:o.z.string().datetime().optional()}).strict(),yi=o.z.object({stories:o.z.array(fi).default([])}).strict(),Ii=o.z.object({title:fi.shape.title,description:fi.shape.description,actions:o.z.array(Wn).max(50).optional(),maxIdleAiSessions:Mn.shape.maxIdleAiSessions.optional()}).strict(),bi=o.z.object({title:fi.shape.title.optional(),description:fi.shape.description.nullable().optional(),actions:o.z.array(Yn).max(50).optional(),maxIdleAiSessions:Mn.shape.maxIdleAiSessions.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one Story field is required."),wi=o.z.object({title:Hn.shape.title.optional(),storyPath:Bn.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one document field is required."),vi=o.z.object({storyPaths:o.z.array(Bn).max(500)}).strict();o.z.object({storyPath:Bn,title:Hn.shape.title.optional(),expectedRevision:Fn.optional()}).strict();const xi=o.z.object({documents:o.z.array(Hn).max(500)}).strict(),Ai=o.z.union([o.z.number(),o.z.string().regex(/^\d+$/).transform(Number)]);o.z.object({page:Ai.pipe(o.z.number().int().min(1).max(500)).default(1),pageSize:Ai.pipe(o.z.number().int().min(1).max(100)).default(20)}).strict();const ki=o.z.object({title:Hn.shape.title,storyPath:Bn}).strict(),Si=o.z.object({page:o.z.number().int().min(1).max(500),pageSize:o.z.number().int().min(1).max(100),totalItems:o.z.number().int().nonnegative(),totalPages:o.z.number().int().nonnegative(),hasMore:o.z.boolean()}).strict();o.z.object({storyCreatedAt:fi.shape.createdAt,documents:o.z.array(ki).max(100),pagination:Si}).strict(),o.z.object({storyCreatedAt:fi.shape.createdAt,documents:o.z.array(ki.strip()).max(100),pagination:Si.strip()}).strip();const Ci=o.z.object({storyPath:Bn,revision:Fn,content:o.z.string(),size:o.z.number().int().nonnegative()}).strict();o.z.object({storyPaths:o.z.array(Bn).min(1).max(20),destinationPath:o.z.string().trim().min(1).max(4096)}).strict(),o.z.object({storyPath:Bn,title:Hn.shape.title.optional(),sourcePath:o.z.string().trim().min(1).max(4096),expectedRevision:Fn.optional()}).strict();const ji=o.z.object({storyPath:Bn,path:o.z.string().trim().min(1).max(4096).optional(),revision:Fn.optional(),error:o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict().optional()}).strict();function Ri(e,t,n){return void 0===t?void 0===n?{method:e}:{method:e,signal:n}:{method:e,...void 0===n?{}:{signal:n},headers:{"content-type":"application/json"},body:JSON.stringify(t)}}function Ti(){const e=new Error("This client transport cannot download binary responses.");return Object.assign(e,{code:"CLIENT_BINARY_UNSUPPORTED"}),e}o.z.object({items:o.z.array(ji).min(1).max(20)}).strict(),o.z.object({storyId:O,nodeId:o.z.string().trim().min(1).max(120),change:o.z.enum(["created","updated","archived","restored","deleted","content.written","document.updated","document.reordered","document.deleted"]).optional(),storyPath:Bn.optional()}).strict();const $i=e=>o.z.object({data:e}).strict(),Ei=Ut,Pi=Lt.extend({sessions:o.z.array(Ei)}),Oi=o.z.object({updatedAt:o.z.string().datetime(),instances:o.z.array(o.z.object({instanceId:o.z.string().trim().min(1).max(160),streamId:o.z.string().trim().min(1).max(240),aiSessions:Pi,revision:o.z.number().int().nonnegative().optional(),lastEventAt:o.z.string().datetime().optional()}).strict())}).strict(),Ni=o.z.object({id:o.z.string().trim().min(1),kind:o.z.enum(["image","file"]),name:o.z.string(),mime:o.z.string(),size:o.z.number().int().nonnegative(),expiresAt:o.z.string().datetime().optional()}).strict();function _i(e){const t=async(t,n,i)=>(await e.request(t,$i(n),i)).data,n=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(t)}`;return{list(e,n){const i=new URLSearchParams({hierarchy:"subagents"});return n&&i.set("instanceId",n),t(`/api/ai-sessions?${i}`,Oi,{signal:e})},refresh(e,n){const i=new URLSearchParams({refresh:"true"});return i.set("hierarchy","subagents"),n&&i.set("instanceId",n),t(`/api/ai-sessions?${i}`,Oi,{signal:e})},delta(e,n,i,o){const a=new URLSearchParams({instanceId:e,streamId:n,sinceRevision:String(i),hierarchy:"subagents"});return t(`/api/ai-sessions?${a}`,Vt,{signal:o})},history(e,n,i=["codex","claude","opencode"]){const o=new URLSearchParams({hierarchy:"subagents"});return i.length&&o.set("agents",i.join(",")),t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/history?${o}`,Et,{signal:n})},historyDetail:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/history/${encodeURIComponent(n)}?hierarchy=subagents`,Pt,{signal:i}),detail(e,i,o,a){const s=o?`?revision=${encodeURIComponent(o)}`:"";return t(`${n(e,i)}${s}`,At,{signal:a})},turnIndex(e,i,o,a){const s=o?`?revision=${encodeURIComponent(o)}`:"";return t(`${n(e,i)}/turns${s}`,kt,{signal:a})},turnBody(e,i,o,a,s){const r=a?`?revision=${encodeURIComponent(a)}`:"";return t(`${n(e,i)}/turns/${encodeURIComponent(o)}${r}`,St,{signal:s})},timeline:(e,i,o)=>t(`${n(e,i)}/timeline`,oe,{signal:o}),turnTimeline:(e,i,o,a)=>t(`${n(e,i)}/turns/${encodeURIComponent(o)}/timeline`,ae,{signal:a}),resume:(e,i,o={})=>t(`${n(e,i)}/resume`,Nt,Ri("POST",Ot.parse(o))),create:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions`,Qe,Ri("POST",Fe.parse(n))),updateModelSelection(e,i,o,a){const s=He.parse({clientRequestId:o,modelSelection:a});return t(`${n(e,i)}/model-selection`,Ve,Ri("PUT",s))},updateReasoningEffort(e,i,o,a){const s=Ge.parse({clientRequestId:o,reasoningEffort:a});return t(`${n(e,i)}/reasoning-effort`,Ye,Ri("PUT",s))},rename:(e,i,o)=>t(`${n(e,i)}/title`,ke,Ri("PUT",Ae.parse(o))),fork:(e,i,o)=>t(`${n(e,i)}/fork`,tt,Ri("POST",et.parse(o))),workspace(e,n,i){const o=n?`?${new URLSearchParams({cwdFolderId:n})}`:"";return t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace${o}`,qn,{signal:i})},checkoutWorkspaceBranch(e,n){const i=We.parse(n);return t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace/checkout`,qn,Ri("POST",i))},openApp:(e,i,o)=>t(`${n(e,i)}/open-app`,it,Ri("POST",nt.parse({clientRequestId:o}))),close:(e,i,o)=>t(`${n(e,i)}/close`,at,Ri("POST",ot.parse({clientRequestId:o}))),clear:(e,i)=>t(n(e,i),st,{method:"DELETE"}),executeCommand:(e,i,o)=>t(`${n(e,i)}/commands`,xe,Ri("POST",ve.parse(o))),markRead:(e,i)=>t(`${n(e,i)}/read`,Je,Ri("POST",{})),sendMessage(e,i,o){const a=_e.parse({...o,attachments:o.attachments??[],references:o.references??[]});return t(`${n(e,i)}/messages`,Tt,Ri("POST",a))},approval:(e,i,o)=>t(`${n(e,i)}/approval`,Tt,Ri("POST",rt.parse({decision:o}))),interrupt:(e,i)=>t(`${n(e,i)}/interrupt`,Tt,Ri("POST",{})),steerQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}/steer`,Tt,Ri("POST",{})),retryQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}/retry`,Rt,Ri("POST",{})),removeQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}`,Rt,{method:"DELETE"}),editQueue:(e,i,o,a)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}`,Rt,Ri("PATCH",lt.parse(a))),reorderQueue:(e,i,o)=>t(`${n(e,i)}/queue/reorder`,Rt,Ri("PATCH",dt.parse(o))),pauseQueue:(e,i,o)=>t(`${n(e,i)}/queue/pause`,Rt,Ri("POST",ct.parse(o))),async uploadAttachment(t,n){n?.(0);const i=await fetch(t.data).then(e=>e.arrayBuffer()),o=new URLSearchParams({scopeType:t.scopeType||"session",scopeId:t.sessionId,kind:t.kind,name:t.name,mime:t.mime,size:String(i.byteLength)});let a;try{a=await e.request(`/api/controlled-instances/${encodeURIComponent(t.instanceId)}/ai-session-attachments/drafts?${o}`,$i(Ni),{method:"POST",headers:{"content-type":"application/octet-stream"},body:i},n)}catch(i){if(!function(e){if(!e||"object"!=typeof e)return!1;const t=e;return 404===t.status||405===t.status||"ROUTE_NOT_FOUND"===t.code||"HTTP_404"===t.code}(i))throw i;a=await e.request("/api/ai-session-attachments",$i(Ni),Ri("POST",{instanceId:t.instanceId,sessionId:t.sessionId,kind:t.kind,name:t.name,mime:t.mime,data:t.data}),n)}return n?.(1),a.data},mentionCatalog:(e,i,o)=>t(`${n(e,i)}/mentions`,Ee,{signal:o}),transcript(e,i,o,a){const s=void 0===o?"":`?tail=${encodeURIComponent(String(o))}`;return t(`${n(e,i)}/transcript${s}`,Ze,{signal:a})},storyContent:(e,i,a)=>t(`${n(e,i)}/story-content`,o.z.object({storyId:o.z.string().trim().min(1),documents:xi.shape.documents}).strict(),{signal:a}),storyContentPreview:(e,i,o,a)=>t(`${n(e,i)}/story-content/preview?storyPath=${encodeURIComponent(o)}`,Ci,{signal:a}),searchMentionFiles:(e,i,o,a)=>t(`${n(e,i)}/mentions/files`,Pe,Ri("POST",{query:o},a)),async attachmentContent(t,i,o,a){if(!e.requestBinary)throw Ti();return e.requestBinary(`${n(t,i)}/messages/${encodeURIComponent(o)}/attachments/${encodeURIComponent(a)}/content`)}}}o.z.object({type:o.z.literal("snapshot"),data:o.z.string(),pendingEscape:o.z.string(),cols:o.z.number().int().positive(),rows:o.z.number().int().positive()}).passthrough();const Ui=o.z.enum(["created","starting","running","stopping","stopped","exited","failed","closed","terminated","unknown"]),Li=o.z.enum(["tty","vnc","web"]),Di=o.z.object({mode:Li,url:o.z.string().trim().min(1).max(4096),token:o.z.string().trim().min(1).max(512),expiresAt:o.z.string().datetime()}).strict(),qi=o.z.object({revoked:o.z.boolean()}).strict(),Mi=o.z.object({name:o.z.string().trim().min(1).max(240),size:o.z.number().int().nonnegative(),updatedAt:o.z.string().datetime(),truncated:o.z.boolean(),content:o.z.string()}).strict(),Bi=o.z.object({sessionId:o.z.string().trim().min(1).max(160),logDir:o.z.string().trim().min(1).max(1024),maxBytes:o.z.number().int().positive(),files:o.z.array(Mi).max(256)}).strict(),Fi=o.z.object({type:o.z.enum(["app-session","provider-session","adapter-key"]),id:o.z.string().trim().min(1).max(240),agent:o.z.string().trim().min(1).max(80).optional(),adapter:o.z.string().trim().min(1).max(80).optional(),key:o.z.string().trim().min(1).max(240).optional()}).strict(),Hi=o.z.record(o.z.string(),o.z.unknown()).and(o.z.object({id:o.z.string().trim().min(1).max(160),appId:o.z.string().trim().min(1).max(160).optional(),title:o.z.string().trim().max(240).optional(),kind:o.z.string().trim().max(80).optional(),status:Ui.default("unknown"),bindings:o.z.array(Fi).max(40).default([]),workspace:o.z.object({cwd:o.z.string().trim().max(4096).optional()}).strict().optional(),createdAt:o.z.string().datetime().optional(),updatedAt:o.z.string().datetime().optional()})),Vi=o.z.object({runningCount:o.z.number().int().min(0).default(0),problemCount:o.z.number().int().min(0).default(0),sessions:o.z.array(Hi).default([]),updatedAt:o.z.string().datetime()}).strict();o.z.object({streamId:o.z.string().trim().min(1).max(240),revision:o.z.number().int().min(0),lastEventAt:o.z.string().datetime(),snapshot:Vi}).strict(),Vi.pick({runningCount:!0,problemCount:!0,updatedAt:!0}).extend({revision:o.z.number().int().min(0).optional()});const Gi=o.z.enum(["app-session-created","app-session-updated","app-session-deleted","app-session-recovered","control-action","heartbeat-sync","startup"]),Wi=o.z.object({streamId:o.z.string().trim().min(1).max(240),instanceId:o.z.string().trim().min(1).max(160),nodeId:o.z.string().trim().min(1).max(160).optional(),revision:o.z.number().int().min(0),previousRevision:o.z.number().int().min(0).optional(),traceId:o.z.string().trim().min(1).max(160),generatedAt:o.z.string().datetime(),reason:Gi}).strict(),Yi=o.z.object({meta:Wi,snapshot:Vi}).strict(),Ki=o.z.object({meta:Wi,session:Hi}).strict(),Ji=o.z.object({meta:Wi,sessionId:o.z.string().trim().min(1).max(160),tombstone:Hi.optional(),expiresAt:o.z.string().datetime().optional()}).strict(),Zi=o.z.object({streamId:o.z.string().trim().min(1).max(240),instanceId:o.z.string().trim().min(1).max(160),sinceRevision:o.z.number().int().min(0),latestRevision:o.z.number().int().min(0),earliestRetainedRevision:o.z.number().int().min(0),syncRequired:o.z.boolean().default(!1),events:o.z.array(o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("app-session.snapshot"),payload:Yi}).strict(),o.z.object({type:o.z.literal("app-session.patch"),payload:Ki}).strict(),o.z.object({type:o.z.literal("app-session.removed"),payload:Ji}).strict()])).default([])}).strict(),Qi=o.z.object({appId:o.z.string().trim().min(1).max(120),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),cwd:o.z.string().trim().min(1).max(512).optional()}).strict(),Xi=o.z.object({title:o.z.string().trim().min(1).max(120)}).strict(),eo=o.z.object({updatedAt:o.z.string().datetime(),instances:o.z.array(o.z.object({instanceId:o.z.string().trim().min(1).max(160),streamId:o.z.string().trim().min(1).max(240),appSessions:Vi,revision:o.z.number().int().nonnegative().optional(),lastEventAt:o.z.string().datetime().optional()}).strict())}).strict();function to(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data;return{list(e,n){const i=n?`?instanceId=${encodeURIComponent(n)}`:"";return t(`/api/app-sessions${i}`,eo,{signal:e})},refresh(e,n){const i=new URLSearchParams({refresh:"true"});return n&&i.set("instanceId",n),t(`/api/app-sessions?${i}`,eo,{signal:e})},launch(e,n){const{cwd:i,...o}=Qi.parse(n),a={...o,...i?{options:{cwd:i}}:{}};return t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions`,Hi,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(a)})},stop:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/stop`,Hi,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),restart:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/restart`,Hi,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),rename(e,n,i){const o=Xi.parse({title:i});return t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}`,Hi,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(o)})},access:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/access`,Di,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),revokeAccess:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/access`,qi,{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({token:i})}),logs(e,n,i,o){const a=void 0===i?"":`?maxBytes=${encodeURIComponent(String(i))}`;return t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/logs${a}`,Bi,{signal:o})},async screenshot(t,n,i){if(!e.requestBinary)throw Ti();return e.requestBinary(`/api/controlled-instances/${encodeURIComponent(t)}/apps/sessions/${encodeURIComponent(n)}/screenshot`,{signal:i})},delta(e,n,i,o){const a=new URLSearchParams({instanceId:e,streamId:n,sinceRevision:String(i)});return t(`/api/app-sessions?${a}`,Zi,{signal:o})}}}const no=o.z.string().trim().min(1).max(60),io=o.z.object({id:o.z.string().trim().min(1).max(120),name:no,isDefault:o.z.boolean(),runningSessionId:o.z.string().trim().min(1).max(160).optional(),diskUsageBytes:o.z.number().int().nonnegative().optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),oo=o.z.object({appId:o.z.string().trim().min(1).max(120),defaultProfileId:o.z.string().trim().min(1).max(120),profiles:o.z.array(io).max(200),observedAt:o.z.string().datetime()}).strict();o.z.object({name:no}).strict(),o.z.object({name:no}).strict();const ao=o.z.object({removed:o.z.literal(!0)}).strict();function so(e){const t=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/apps/${encodeURIComponent(t)}/profiles`,n=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data;return{list:(e,i,o)=>n(t(e,i),oo,{method:"GET",signal:o}),create:(e,i,o)=>n(t(e,i),io,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:o})}),rename:(e,i,o,a)=>n(`${t(e,i)}/${encodeURIComponent(o)}`,io,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:a})}),setDefault:(e,i,o)=>n(`${t(e,i)}/${encodeURIComponent(o)}/default`,io,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),remove:(e,i,o)=>n(`${t(e,i)}/${encodeURIComponent(o)}`,ao,{method:"DELETE"})}}const ro=o.z.object({accessId:o.z.string().trim().min(1).max(120),token:o.z.string().trim().min(32).max(512),expiresAt:o.z.string().datetime(),relayPath:o.z.literal("/browser-relay")}).strict();function co(e){return{async access(t){var n;return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}/browser-access`,(n=ro,o.z.object({data:n}).strict()),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})})).data}}}function lo(e,t){let n=go(t);for(let t=0;t<100;t+=1){const t=e.safeParse(n);if(t.success)return t;const i=mo(t.error.issues);let o=!1;for(const e of i){const t=uo(n,e.path);if(t&&"object"==typeof t&&!Array.isArray(t))for(const n of e.keys)Object.prototype.hasOwnProperty.call(t,n)&&(delete t[n],o=!0)}if(!o)return t}return e.safeParse(n)}function mo(e,t=[]){const n=[];for(const i of e){if("unrecognized_keys"===i.code){n.push({code:"unrecognized_keys",keys:i.keys,path:[...t,...i.path]});continue}if("invalid_union"!==i.code||!Array.isArray(i.errors))continue;const e=i.errors.filter(e=>Array.isArray(e));if(!e.length)continue;const o=e.reduce((e,t)=>po(t)<po(e)?t:e);n.push(...mo(o,[...t,...i.path]))}return n}function po(e){return e.reduce((e,t)=>{if("unrecognized_keys"===t.code)return e;if("invalid_union"!==t.code||!Array.isArray(t.errors))return e+1;const n=t.errors.filter(e=>Array.isArray(e));return e+(n.length?Math.min(...n.map(po)):1)},0)}function uo(e,t){let n=e;for(const e of t){if(!n||"object"!=typeof n)return;n=n[e]}return n}function go(e){return Array.isArray(e)?e.map(go):e&&"object"==typeof e?Object.getPrototypeOf(e)!==Object.prototype&&null!==Object.getPrototypeOf(e)?e:Object.fromEntries(Object.entries(e).map(([e,t])=>[e,go(t)])):e}const ho=["users:read","users:manage","roles:read","roles:manage","identity-providers:read","identity-providers:manage","nodes:read","nodes:manage","projects:read","projects:manage","runtimes:read","runtimes:manage","templates:read","templates:manage","instances:read","instances:manage","instances:interactive","app-sessions:read","app-sessions:manage","app-sessions:interactive","ai-sessions:read","ai-sessions:manage","ai-sessions:interactive","triggers:read","triggers:manage","repositories:read","repositories:manage","attachments:read","attachments:manage","images:read","images:manage","models:read","models:manage","settings:read","settings:manage","secrets:manage","chat-bridges:read","chat-bridges:manage","public-directory:read"],zo=o.z.enum(ho),fo=o.z.enum(["active","disabled","archived"]),yo=o.z.enum(["local-password","oidc","oauth","local-trust"]),Io=o.z.enum(["active","archived"]),bo=o.z.enum(["oidc","github"]),wo=o.z.enum(["enabled","disabled"]),vo=o.z.enum(["existing-only","admin-approved-create"]),xo=o.z.enum(["pending","approved","rejected","expired"]),Ao=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("all")}).strict(),o.z.object({kind:o.z.literal("selected"),nodeIds:o.z.array(o.z.string().trim().min(1)).max(1e4)}).strict()]),ko=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("inherit-node-scope")}).strict(),o.z.object({kind:o.z.literal("selected"),instanceIds:o.z.array(o.z.string().trim().min(1)).max(1e4)}).strict()]),So=o.z.object({id:zo,resource:o.z.string().trim().min(1).max(80),action:o.z.string().trim().min(1).max(80),nodeScoped:o.z.boolean(),name:o.z.string().trim().min(1).max(160),translationKey:o.z.string().trim().min(1).max(200).optional(),description:o.z.string().trim().min(1).max(500).optional()}).strict(),Co=new Set(["users","roles","identity-providers","settings","secrets","chat-bridges","public-directory"]);ho.map(e=>{const[t,n]=e.split(":");return So.parse({id:e,resource:t,action:n,nodeScoped:!Co.has(t),name:e,translationKey:`settings.userAccess.permissionLabels.${t}.${n}`})});const jo=o.z.object({id:o.z.string().trim().min(1),displayName:o.z.string().trim().min(1).max(160),primaryUsername:o.z.string().trim().min(1).max(80).optional(),status:fo,createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),lastLoginAt:o.z.string().datetime().optional()}).strict(),Ro=o.z.string().trim().min(1).max(80).regex(/^[a-zA-Z0-9_.@-]+$/),To=o.z.object({displayName:o.z.string().trim().min(1).max(160).optional(),username:Ro.optional(),status:fo.optional()}).strict().refine(e=>Object.values(e).some(e=>void 0!==e),{message:"At least one user field must be updated."}),$o=o.z.object({id:o.z.string().trim().min(1),userId:o.z.string().trim().min(1),kind:yo,providerId:o.z.string().trim().min(1).optional(),loginName:o.z.string().trim().min(1).max(160).optional(),subject:o.z.string().trim().min(1).max(500).optional(),verifiedEmail:o.z.string().email().optional(),requiresPasswordChange:o.z.boolean().optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),lastUsedAt:o.z.string().datetime().optional()}).strict().superRefine((e,t)=>{"local-password"!==e.kind||e.loginName||t.addIssue({code:"custom",path:["loginName"],message:"Local password identities require loginName."}),"local-password"===e.kind||"local-trust"===e.kind||e.providerId&&e.subject||t.addIssue({code:"custom",path:["providerId"],message:"External identities require providerId and subject."})}),Eo=o.z.enum(["web","mobile","cli"]),Po=o.z.object({id:o.z.string().trim().min(1),userId:o.z.string().trim().min(1),identityId:o.z.string().trim().min(1),clientType:Eo,createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime(),lastSeenAt:o.z.string().datetime().optional(),current:o.z.boolean().optional()}).strict(),Oo=o.z.object({id:o.z.string().trim().min(1),name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(500).optional(),system:o.z.boolean(),status:Io,permissionIds:o.z.array(zo).max(ho.length),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),No=o.z.object({userId:o.z.string().trim().min(1),roleIds:o.z.array(o.z.string().trim().min(1)).min(1).max(100),nodeScope:Ao,instanceScope:ko.default({kind:"inherit-node-scope"}),authorizationRevision:o.z.number().int().positive(),updatedAt:o.z.string().datetime()}).strict(),_o=jo.extend({identities:o.z.array($o),accessGrant:No}).strict(),Uo=o.z.object({userId:o.z.string().trim().min(1),identityId:o.z.string().trim().min(1),roleIds:o.z.array(o.z.string().trim().min(1)).min(1).max(100),permissionIds:o.z.array(zo).max(ho.length),nodeScope:Ao,instanceScope:ko.default({kind:"inherit-node-scope"}),authorizationRevision:o.z.number().int().positive()}).strict(),Lo=o.z.object({id:o.z.string().trim().min(1),name:o.z.string().trim().min(1).max(120),kind:bo,status:wo,loginPolicy:vo,issuer:o.z.string().url().optional(),clientId:o.z.string().trim().min(1).max(500),callbackUrl:o.z.string().url(),clientSecretConfigured:o.z.boolean(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict().superRefine((e,t)=>{"oidc"!==e.kind||e.issuer||t.addIssue({code:"custom",path:["issuer"],message:"OIDC providers require issuer."})}),Do=o.z.object({id:o.z.string().trim().min(1),providerId:o.z.string().trim().min(1),subject:o.z.string().trim().min(1).max(500),verifiedEmail:o.z.string().email().optional(),displayName:o.z.string().trim().min(1).max(160).optional(),status:xo,expiresAt:o.z.string().datetime(),decidedAt:o.z.string().datetime().optional(),decidedByUserId:o.z.string().trim().min(1).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),qo=o.z.object({userManagement:o.z.object({users:o.z.literal(!0),identities:o.z.literal(!0),sessions:o.z.literal(!0)}).strict(),authentication:o.z.object({externalIdentity:o.z.object({oidc:o.z.boolean(),oauthAdapters:o.z.array(bo).max(20)}).strict().optional()}).strict(),authorization:o.z.object({customRoles:o.z.boolean(),nodeScopes:o.z.literal(!0),instanceScopes:o.z.literal(!0).optional(),authorizationRevisions:o.z.literal(!0)}).strict()}).strict(),Mo=o.z.object({authentication:o.z.enum(["required","disabled"]),aiSessions:o.z.boolean(),nodes:o.z.boolean(),instanceBoard:o.z.boolean(),triggers:o.z.boolean().optional(),stories:o.z.boolean().optional(),cliSessions:o.z.boolean().optional(),localCliSessions:o.z.boolean().optional(),accessManagement:qo.optional()}).strict();function Bo(e){const t=lo(Mo,e);return t.success?t.data:void 0}function Fo(e){return Bo(e)?.accessManagement}function Ho(e){return!0===Bo(e)?.localCliSessions}const Vo=o.z.object({version:o.z.literal(1),kind:o.z.literal("control-plane"),controlPlaneId:o.z.string().trim().min(1).max(160),publicKey:o.z.object({algorithm:o.z.literal("Ed25519"),encoding:o.z.literal("base64url"),value:o.z.string().regex(/^[A-Za-z0-9_-]{43}$/),fingerprint:o.z.string().regex(/^sha256:[A-Za-z0-9_-]{43}$/)}).strict(),capabilities:Mo,protocolVersion:o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/),issuedAt:o.z.string().datetime(),expiresAt:o.z.string().datetime()}).strict(),Go=o.z.object({data:o.z.object({payload:Vo,signature:o.z.string().regex(/^[A-Za-z0-9_-]{86}$/)}).strict()}).strict(),Wo=o.z.object({id:o.z.string().trim().min(8).max(160),name:o.z.string().trim().min(1).max(160),platform:o.z.enum(["ios","android"]),appVersion:o.z.string().trim().min(1).max(80).optional()}).strict(),Yo=o.z.object({username:o.z.string().trim().min(1).max(80),password:o.z.string().min(1).max(4096),device:Wo}).strict(),Ko=jo,Jo=Po.extend({device:Wo,user:jo}).strict();o.z.enum(["CONTROL_PLANE_FORBIDDEN","CONTROL_PLANE_AUTH_REQUIRED","AUTH_PASSWORD_CHANGE_REQUIRED","CONTROL_PLANE_USER_DISABLED","CONTROL_PLANE_AUTHORIZATION_REVISION_CONFLICT","CONTROL_PLANE_LAST_ACTIVE_ADMIN","CONTROL_PLANE_USERNAME_CONFLICT","CONTROL_PLANE_EXTERNAL_IDENTITY_CONFLICT","CONTROL_PLANE_IDENTITY_PROVIDER_NAMESPACE_IMMUTABLE","CONTROL_PLANE_IDENTITY_PROVIDER_UNAVAILABLE","USER_STORE_REINITIALIZATION_REQUIRED"]);const Zo=o.z.object({data:o.z.object({sessionToken:o.z.string().trim().min(32),session:Jo,authorization:Uo}).strict()}).strict(),Qo=o.z.object({data:o.z.array(Jo)}).strict(),Xo=o.z.object({data:o.z.object({revoked:o.z.boolean()}).strict()}).strict(),ea=o.z.object({data:o.z.object({expiresAt:o.z.string().datetime()}).strict()}).strict(),ta=o.z.object({name:o.z.string().trim().min(1).max(160),platform:o.z.enum(["darwin","linux","win32"]),version:o.z.string().trim().min(1).max(80).optional()}).strict(),na=o.z.string().trim().min(1).max(200),ia=o.z.string().trim().regex(/^[A-Za-z0-9\-._~]{16,200}$/),oa=o.z.string().regex(/^[A-Za-z0-9_-]{43}$/),aa=o.z.string().regex(/^[A-Za-z0-9\-._~]{43,128}$/),sa=o.z.string().trim().min(1).max(2048).refine(e=>void 0!==function(e){if("string"!=typeof e||e.length<1||e.length>2048)return;let t;try{t=new URL(e)}catch{return}if("http:"!==t.protocol||t.username||t.password)return;if("127.0.0.1"!==t.hostname&&"[::1]"!==t.hostname)return;if("/callback"!==t.pathname||t.search||t.hash)return;const n=Number(t.port);return Number.isInteger(n)&&n>=1&&n<=65535?t:void 0}(e),"CLI redirect URIs must target an http loopback /callback address."),ra=o.z.object({mode:o.z.literal("browser"),client:ta,redirectUri:sa,state:ia,codeChallenge:oa,codeChallengeMethod:o.z.literal("S256")}).strict(),da=o.z.object({mode:o.z.literal("device"),client:ta}).strict(),ca=o.z.discriminatedUnion("mode",[ra,da]),la=o.z.discriminatedUnion("mode",[o.z.object({mode:o.z.literal("browser"),requestId:na,verificationUri:o.z.string().trim().url().max(2048),expiresAt:o.z.string().datetime()}).strict(),o.z.object({mode:o.z.literal("device"),requestId:na,verificationUri:o.z.string().trim().url().max(2048),verificationUriComplete:o.z.string().trim().url().max(2048),userCode:o.z.string().trim().min(1).max(40),intervalSeconds:o.z.number().int().min(1).max(300),expiresAt:o.z.string().datetime()}).strict()]),ma=o.z.object({data:la}).strict(),pa=o.z.enum(["pending","approved","denied","consumed","expired"]),ua=o.z.object({requestId:na,mode:o.z.enum(["browser","device"]),status:pa,client:ta,createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime(),redirectUri:sa.optional(),userCode:o.z.string().trim().min(1).max(40).optional(),decidedAt:o.z.string().datetime().optional()}).strict(),ga=o.z.object({data:ua}).strict(),ha=o.z.object({data:o.z.object({mode:o.z.enum(["browser","device"]),redirectUri:o.z.string().trim().url().max(2048).optional()}).strict()}).strict(),za=o.z.object({data:o.z.object({ok:o.z.boolean()}).strict()}).strict(),fa=o.z.discriminatedUnion("grantType",[o.z.object({grantType:o.z.literal("authorization_code"),requestId:na,code:o.z.string().trim().min(1).max(400),codeVerifier:aa}).strict(),o.z.object({grantType:o.z.literal("urn:ietf:params:oauth:grant-type:device_code"),requestId:na}).strict()]),ya=Po.extend({clientType:o.z.literal("cli"),client:ta,user:jo}).strict(),Ia=o.z.object({data:o.z.object({sessionToken:o.z.string().trim().min(32),session:ya,authorization:Uo}).strict()}).strict(),ba=o.z.object({client:ta}).strict(),wa=o.z.object({data:o.z.array(ya)}).strict(),va=o.z.object({data:o.z.object({revoked:o.z.boolean()}).strict()}).strict(),xa=o.z.object({data:o.z.object({expiresAt:o.z.string().datetime()}).strict()}).strict();o.z.enum(["CLI_AUTHORIZATION_REQUEST_UNKNOWN","CLI_AUTHORIZATION_PENDING","CLI_AUTHORIZATION_SLOW_DOWN","CLI_AUTHORIZATION_EXPIRED","CLI_AUTHORIZATION_DENIED","CLI_AUTHORIZATION_ALREADY_USED","CLI_AUTHORIZATION_INVALID_GRANT","CLI_AUTHORIZATION_RATE_LIMITED"]);const Aa=o.z.object({mode:o.z.enum(["disabled","password"]),enabled:o.z.boolean(),requiresBootstrap:o.z.boolean(),authenticated:o.z.boolean(),requiresPasswordChange:o.z.boolean().optional(),user:Ko.optional(),authorization:Uo.optional()}).strict();function ka(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data,n=e=>({method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e??{})});return{identity:()=>e.request("/api/control-plane/identity",Go),session:e=>t("/api/auth/session",Aa,{signal:e}),bootstrapAdmin:e=>t("/api/auth/bootstrap-admin",Ko,n(e)),login:e=>t("/api/auth/login",o.z.object({user:Ko}).strict(),n(e)),changePassword(e){return t("/api/auth/password",o.z.object({user:Ko}).strict(),(n=e,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(n)}));var n},logout:()=>t("/api/auth/logout",o.z.object({ok:o.z.boolean()}).strict(),n()),logoutMobile:()=>t("/api/auth/mobile/logout",o.z.object({ok:o.z.boolean()}).strict(),n()),renewMobileSession:t=>e.request("/api/auth/mobile/renew",ea,{...n(),signal:t}).then(e=>e.data),loginMobile:async t=>(await e.request("/api/auth/mobile/login",Zo,n(Yo.parse(t)))).data,cliAuthorize:t=>e.request("/api/auth/cli/authorize",ma,n(ca.parse(t))).then(e=>e.data),cliToken:t=>e.request("/api/auth/cli/token",Ia,n(fa.parse(t))).then(e=>e.data),cliLocalSession:t=>e.request("/api/auth/cli/local",Ia,n(ba.parse(t))).then(e=>e.data),cliAuthorizationRequest:(t,n)=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}`,ga,{signal:n}).then(e=>e.data),cliAuthorizationRequestByUserCode:(t,n)=>e.request(`/api/auth/cli/requests?userCode=${encodeURIComponent(t)}`,ga,{signal:n}).then(e=>e.data),approveCliAuthorization:t=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}/approve`,ha,n()).then(e=>e.data),denyCliAuthorization:t=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}/deny`,za,n()).then(e=>e.data),logoutCli:()=>t("/api/auth/cli/logout",o.z.object({ok:o.z.boolean()}).strict(),n()),renewCliSession:t=>e.request("/api/auth/cli/renew",xa,{...n(),signal:t}).then(e=>e.data),cliSessions:t=>e.request("/api/auth/cli/sessions",wa,{signal:t}).then(e=>e.data),revokeCliSession:t=>e.request(`/api/auth/cli/sessions/${encodeURIComponent(t)}`,va,{method:"DELETE"}).then(e=>e.data),mobileSessions:t=>e.request("/api/auth/mobile/sessions",Qo,{signal:t}).then(e=>e.data),revokeMobileSession:t=>e.request(`/api/auth/mobile/sessions/${encodeURIComponent(t)}`,Xo,{method:"DELETE"}).then(e=>e.data)}}const Sa=e=>o.z.object({data:e}).strict();function Ca(e){return{currentAuthorization:t=>e.request("/api/access/me",Sa(Uo),{signal:t}).then(e=>e.data),list(t={},n){const i=new URLSearchParams;return t.search&&i.set("search",t.search),t.includeArchived&&i.set("includeArchived","true"),e.request("/api/users"+(i.size?`?${i}`:""),Sa(o.z.array(jo)),{signal:n}).then(e=>e.data)},detail:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}`,Sa(_o),{signal:n}).then(e=>e.data),create:t=>e.request("/api/users",Sa(_o),Ri("POST",t)).then(e=>e.data),update:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}`,Sa(_o),Ri("PATCH",To.parse(n))).then(e=>e.data),setAccess:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/access`,Sa(_o),Ri("PUT",n)).then(e=>e.data),resetPassword:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/password-reset`,Sa($o),Ri("POST",n)).then(e=>e.data),unbindExternalIdentity:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/identities/${encodeURIComponent(n)}`,Sa(o.z.object({unbound:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),sessions:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/sessions`,Sa(o.z.array(Po)),{signal:n}).then(e=>e.data),revokeSession:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/sessions/${encodeURIComponent(n)}`,Sa(o.z.object({revoked:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),revokeAllSessions:t=>e.request(`/api/users/${encodeURIComponent(t)}/sessions`,Sa(o.z.object({revokedSessions:o.z.number().int().nonnegative()}).strict()),{method:"DELETE"}).then(e=>e.data),roles:t=>e.request("/api/roles",Sa(o.z.array(Oo)),{signal:t}).then(e=>e.data),permissions:t=>e.request("/api/permissions",Sa(o.z.array(So)),{signal:t}).then(e=>e.data),createRole:t=>e.request("/api/roles",Sa(Oo),Ri("POST",t)).then(e=>e.data),updateRole:(t,n)=>e.request(`/api/roles/${encodeURIComponent(t)}`,Sa(Oo),Ri("PATCH",n)).then(e=>e.data),archiveRole:t=>e.request(`/api/roles/${encodeURIComponent(t)}`,Sa(Oo),{method:"DELETE"}).then(e=>e.data),providers:t=>e.request("/api/identity-providers",Sa(o.z.array(Lo)),{signal:t}).then(e=>e.data),createProvider:t=>e.request("/api/identity-providers",Sa(Lo),Ri("POST",t)).then(e=>e.data),updateProvider:(t,n)=>e.request(`/api/identity-providers/${encodeURIComponent(t)}`,Sa(Lo),Ri("PATCH",n)).then(e=>e.data),removeProvider:t=>e.request(`/api/identity-providers/${encodeURIComponent(t)}`,Sa(o.z.object({deleted:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),approvals:t=>e.request("/api/external-identity-approvals",Sa(o.z.array(Do)),{signal:t}).then(e=>e.data),approveIdentity:(t,n)=>e.request(`/api/external-identity-approvals/${encodeURIComponent(t)}/approve`,Sa(_o),Ri("POST",n)).then(e=>e.data),rejectIdentity:t=>e.request(`/api/external-identity-approvals/${encodeURIComponent(t)}/reject`,Sa(o.z.object({rejected:o.z.boolean()}).strict()),Ri("POST",{})).then(e=>e.data)}}const ja=o.z.union([o.z.object({type:o.z.literal("schedule"),scheduleKind:o.z.literal("interval").default("interval"),intervalMs:o.z.number().int().min(1e3)}).strict(),o.z.object({type:o.z.literal("schedule"),scheduleKind:o.z.literal("daily"),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict(),o.z.object({type:o.z.literal("schedule"),scheduleKind:o.z.literal("weekly"),weekdays:o.z.array(o.z.number().int().min(0).max(6)).min(1).max(7),timeOfDay:o.z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),timezone:o.z.string().trim().min(1).max(120)}).strict()]),Ra=o.z.union([ja,o.z.object({type:o.z.literal("file-change"),roots:o.z.array(o.z.string().trim().min(1).max(4096)).min(1).max(50),globs:o.z.array(o.z.string().trim().min(1).max(500)).min(1).max(100),ignore:o.z.array(o.z.string().trim().min(1).max(500)).max(100).optional(),debounceMs:o.z.number().int().min(100).max(6e4).default(1500)}).strict(),o.z.object({type:o.z.literal("ai-session"),agent:o.z.string().trim().min(1).max(80).optional(),statuses:o.z.array(o.z.enum(["running","waiting","idle","failed"])).max(20).optional(),phases:o.z.array(o.z.enum(["thinking","tool","editing","approval","responding","unknown"])).max(20).optional()}).strict()]),Ta=o.z.object({promptTemplate:o.z.string().trim().min(1).max(2e4)}).strict(),$a=o.z.object({cooldownMs:o.z.number().int().min(0).max(864e5).optional(),maxConcurrentRuns:o.z.number().int().min(1).max(20).default(1),whenBusy:o.z.enum(["skip","queue"]).default("skip")}).strict(),Ea=o.z.object({configHash:o.z.string().trim().min(8).max(80),name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(1e3).optional(),source:Ra,action:Ta,policy:$a.default({maxConcurrentRuns:1,whenBusy:"skip"}),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Pa=o.z.object({type:o.z.literal("ai-session"),aiSessionId:o.z.string().trim().min(1).max(160)}).strict(),Oa=o.z.object({configHash:o.z.string().trim().min(8).max(80),deploymentId:o.z.string().trim().min(1).max(240).optional(),instanceId:o.z.string().trim().min(1).max(160),origin:o.z.enum(["control-plane","controlled-instance"]).default("controlled-instance"),enabled:o.z.boolean().default(!0),target:Pa,localName:o.z.string().trim().min(1).max(160).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Na=o.z.object({configHash:o.z.string().trim().min(8).max(80),deploymentId:o.z.string().trim().min(1).max(240).optional(),instanceId:o.z.string().trim().min(1).max(160),status:o.z.enum(["idle","running","disabled","error"]).default("idle"),lastTriggeredAt:o.z.string().datetime().optional(),lastCompletedAt:o.z.string().datetime().optional(),lastSkippedAt:o.z.string().datetime().optional(),lastError:o.z.string().trim().max(4e3).optional(),runCount:o.z.number().int().min(0).default(0),skippedCount:o.z.number().int().min(0).default(0)}).strict(),_a=o.z.object({id:o.z.string().trim().min(1).max(160),configHash:o.z.string().trim().min(8).max(80),deploymentId:o.z.string().trim().min(1).max(240).optional(),instanceId:o.z.string().trim().min(1).max(160),eventType:o.z.enum(["manual","schedule","file-change","ai-session"]),status:o.z.enum(["started","completed","failed","skipped"]),target:Pa,promptPreview:o.z.string().trim().max(500),eventSummary:o.z.string().trim().max(1e3).optional(),error:o.z.string().trim().max(4e3).optional(),startedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict();o.z.object({schemaVersion:o.z.literal(1).default(1),configs:o.z.array(Ea).default([]),deployments:o.z.array(Oa).default([]),runtime:o.z.array(Na).default([]),recentRuns:o.z.array(_a).default([])}).strict();const Ua=o.z.object({config:Ea,deployment:Oa,runtime:Na.optional()}).strict();o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(160),mutation:Ua.optional()}).strip(),o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(160),configHash:Ea.shape.configHash}).strip();const La=o.z.object({instanceId:o.z.string().trim().min(1).max(160),instanceName:o.z.string().trim().min(1).max(160),deployment:Oa,runtime:Na.optional()}).strip(),Da=_a.extend({instanceName:o.z.string().trim().min(1).max(160).optional()}).strip(),qa=o.z.object({configHash:o.z.string().trim().min(8).max(80),config:Ea,deploymentCount:o.z.number().int().min(0),enabledCount:o.z.number().int().min(0),runningCount:o.z.number().int().min(0),errorCount:o.z.number().int().min(0),ownedByControlPlane:o.z.boolean(),controlPlaneDeploymentCount:o.z.number().int().min(0),deployments:o.z.array(La),recentRuns:o.z.array(Da)}).strip(),Ma=o.z.object({updatedAt:o.z.string().datetime(),triggers:o.z.array(qa)}).strip(),Ba=o.z.object({name:Ea.shape.name,description:Ea.shape.description,source:Ra,action:Ta,policy:$a.partial().optional()}).strict(),Fa=o.z.object({scope:o.z.enum(["node","instance"]),nodeId:o.z.string().trim().min(1).max(160).optional(),instanceId:o.z.string().trim().min(1).max(160).optional(),code:o.z.string().trim().min(1).max(160),message:o.z.string().trim().min(1).max(4e3)}).strip(),Ha=o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Proxy protocol version must use YYYY-MM-DD format."),Va=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Ga=o.z.string().datetime(),Wa=o.z.string().trim().min(32).max(4096),Ya=o.z.string().trim().max(2048).transform((e,t)=>{try{return function(e){const t=new URL(e.trim());if("https:"!==t.protocol||t.username||t.password||"/"!==t.pathname||t.search||t.hash)throw new Error("Proxy origin must be an HTTPS origin without credentials, path, query, or fragment.");return t.origin}(e)}catch(e){return t.addIssue({code:"custom",message:e instanceof Error?e.message:String(e)}),o.z.NEVER}});o.z.string().trim().min(1).max(4096).transform((e,t)=>{try{return function(e){const t=e.trim();if(!t.startsWith("/")||t.startsWith("//")||t.includes("\\")||/%25/i.test(t))throw new Error("Proxy route must be a single-encoded node-agent relative route.");const n=t.split("?",1)[0];let i,o;try{i=n.split("/").map(e=>decodeURIComponent(e))}catch{throw new Error("Proxy route contains invalid percent encoding.")}if(i.some(e=>".."===e||"."===e))throw new Error("Proxy route cannot traverse outside the node-agent API.");try{o=new URL(t,"https://node-agent.invalid")}catch{throw new Error("Proxy route is invalid.")}if("https://node-agent.invalid"!==o.origin||o.username||o.password)throw new Error("Proxy route cannot select an absolute upstream URL.");return`${o.pathname}${o.search}`}(e)}catch(e){return t.addIssue({code:"custom",message:e instanceof Error?e.message:String(e)}),o.z.NEVER}});const Ka=o.z.enum(Object.values({ProtocolUnsupported:"CONTROL_PLANE_PROXY_PROTOCOL_UNSUPPORTED",InviteInvalid:"CONTROL_PLANE_PROXY_INVITE_INVALID",InviteExpired:"CONTROL_PLANE_PROXY_INVITE_EXPIRED",InviteConsumed:"CONTROL_PLANE_PROXY_INVITE_CONSUMED",InviteRevoked:"CONTROL_PLANE_PROXY_INVITE_REVOKED",TargetUnavailable:"CONTROL_PLANE_PROXY_TARGET_UNAVAILABLE",TargetMismatch:"CONTROL_PLANE_PROXY_TARGET_MISMATCH",BindingUnknown:"CONTROL_PLANE_PROXY_BINDING_UNKNOWN",BindingRevoked:"CONTROL_PLANE_PROXY_BINDING_REVOKED",BindingIdentityConflict:"CONTROL_PLANE_PROXY_BINDING_IDENTITY_CONFLICT",AuthenticationFailed:"CONTROL_PLANE_PROXY_AUTHENTICATION_FAILED",RouteInvalid:"CONTROL_PLANE_PROXY_ROUTE_INVALID",HeaderInvalid:"CONTROL_PLANE_PROXY_HEADER_INVALID",ResourceLimit:"CONTROL_PLANE_PROXY_RESOURCE_LIMIT",SnapshotRequired:"CONTROL_PLANE_PROXY_SNAPSHOT_REQUIRED",Unavailable:"CONTROL_PLANE_PROXY_UNAVAILABLE",TransportFailed:"CONTROL_PLANE_PROXY_TRANSPORT_FAILED"})),Ja=o.z.object({code:Ka,message:o.z.string().trim().min(1).max(2048),retryable:o.z.boolean(),details:o.z.record(o.z.string(),o.z.unknown()).optional()}).strict(),Za=o.z.enum(["active","revoked"]),Qa=o.z.object({id:Va,targetNodeId:Va,status:Za,createdBy:Va,expiresAt:Ga,revokedAt:Ga.optional(),createdAt:Ga,updatedAt:Ga}).strict(),Xa=o.z.object({targetNodeId:Va,expiresInSeconds:o.z.number().int().min(60).max(3600).default(600)}).strict(),es=o.z.object({invite:Qa,token:o.z.string().trim().min(24).max(512),proxyOrigin:Ya,protocolVersion:Ha}).strict(),ts=o.z.enum(["active","revoked"]),ns=o.z.object({id:Va,claimId:Va,sourceControlPlaneId:Va,targetNodeId:Va,bindingKeyId:Va,status:ts,revision:o.z.number().int().positive(),lastError:Ja.optional(),revokedAt:Ga.optional(),createdAt:Ga,updatedAt:Ga}).strict();o.z.object({protocolVersion:Ha,inviteToken:o.z.string().trim().min(24).max(512).optional(),claimId:Va,sourceControlPlaneId:Va,targetNodeId:Va.optional(),bindingKeyId:Va,credential:Wa}).strict(),o.z.object({sourceControlPlaneId:Va,bindingKeyId:Va,credential:Wa}).strict();const is=o.z.object({id:Va,name:o.z.string().trim().min(1).max(160),status:o.z.enum(["unknown","online","offline","degraded"]),health:o.z.enum(["unknown","ok","degraded","failed"]),lastSeenAt:Ga.optional(),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({})}).strict(),os=o.z.object({protocolVersion:Ha,binding:ns,streamId:Va,revision:o.z.number().int().nonnegative(),observedAt:Ga,target:is}).strict(),as=o.z.object({type:o.z.literal("control-plane-proxy.event"),protocolVersion:Ha,streamId:Va,bindingId:Va,sourceControlPlaneId:Va,targetNodeId:Va,revision:o.z.number().int().positive(),source:o.z.object({id:o.z.string().trim().min(1).max(512),seq:o.z.number().int().nonnegative()}).strict(),target:is,event:o.z.object({type:o.z.string().trim().min(1).max(240),topic:o.z.string().trim().min(1).max(240),createdAt:Ga}).strict()}).strict(),ss=o.z.object({type:o.z.literal("control-plane-proxy.events.ready"),protocolVersion:Ha,streamId:Va,bindingId:Va,sourceControlPlaneId:Va,targetNodeId:Va,latestRevision:o.z.number().int().nonnegative(),earliestRetainedRevision:o.z.number().int().nonnegative()}).strict(),rs=o.z.object({type:o.z.literal("control-plane-proxy.snapshot-required"),protocolVersion:Ha,streamId:Va,bindingId:Va,sourceControlPlaneId:Va,targetNodeId:Va,sinceRevision:o.z.number().int().nonnegative(),latestRevision:o.z.number().int().nonnegative(),earliestRetainedRevision:o.z.number().int().nonnegative(),error:Ja}).strict();o.z.discriminatedUnion("type",[as,ss,rs]),o.z.object({protocolVersion:Ha,binding:ns,target:os.shape.target}).strict();const ds=o.z.object({id:Va,claimId:Va,proxyOrigin:Ya,requestedName:o.z.string().trim().min(1).max(160).optional(),sourceControlPlaneId:Va,targetNodeId:Va.optional(),bindingKeyId:Va,credential:Wa,status:o.z.enum(["pending","compensation-required"]),createdAt:Ga,updatedAt:Ga,expiresAt:Ga}).strict().omit({credential:!0});o.z.object({id:Va,nodeId:Va,proxyOrigin:Ya,proxyBindingId:Va,targetNodeId:Va,sourceControlPlaneId:Va,bindingKeyId:Va,credential:Wa,createdAt:Ga,updatedAt:Ga}).strict();const cs=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),ls=o.z.string().datetime(),ms=o.z.number().int().nonnegative(),ps=o.z.enum(["https-token","ssh-key"]),us=o.z.enum(["operation-only","instance-retained"]),gs=o.z.enum(["enabled","disabled"]),hs=o.z.enum(["pending","synced","deferred","revoking","revoked"]),zs=o.z.object({scheme:o.z.enum(["https","ssh"]),host:o.z.string().trim().min(1).max(253),port:o.z.number().int().min(1).max(65535).optional(),pathPrefix:o.z.string().min(1).max(2048).default("/")}).strict();function fs(e){throw new Error(`Invalid Git credential scope: ${e}`)}function ys(e){const t=e.trim().replace(/^\[|\]$/g,"");(!t||t.includes("*")||/[/?#@\s]/.test(t))&&fs("host is invalid");try{const e=new URL(t.includes(":")?`http://[${t}]/`:`http://${t}/`).hostname.replace(/^\[|\]$/g,"").toLowerCase();return(!e||e.length>253||e.includes("*"))&&fs("host is invalid"),e}catch{fs("host is invalid")}}function Is(e){try{return decodeURIComponent(e)}catch{fs("path contains invalid percent encoding")}}function bs(e){const t=e?.trim()||"/";(t.includes("?")||t.includes("#")||t.includes("\\")||t.includes("\0"))&&fs("path contains an unsupported delimiter");const n=(t.startsWith("/")?t:`/${t}`).split("/").filter(Boolean);for(const e of n){const t=Is(e);("."===t||".."===t||t.includes("/")||t.includes("\\")||t.includes("\0"))&&fs("path contains an unsafe segment")}return 0===n.length?"/":`/${n.join("/")}/`}const ws=o.z.object({id:cs,name:o.z.string().trim().min(1).max(160),kind:ps,scope:zs,secretSet:o.z.literal(!0),status:gs,revision:ms,createdAt:ls,updatedAt:ls}).strict(),vs=o.z.object({kind:o.z.literal("https-token"),username:o.z.string().trim().min(1).max(240),token:o.z.string().min(1).max(8192)}).strict(),xs=o.z.object({kind:o.z.literal("ssh-key"),privateKey:o.z.string().min(1).max(131072),passphrase:o.z.string().max(8192).optional(),pinnedKnownHosts:o.z.string().min(1).max(131072)}).strict(),As=o.z.discriminatedUnion("kind",[vs,xs]);o.z.object({name:o.z.string().trim().min(1).max(160),scope:zs,secret:As}).strict().superRefine((e,t)=>{"https"===e.scope.scheme!=("https-token"===e.secret.kind)&&t.addIssue({code:"custom",path:["scope","scheme"],message:"Credential kind must match the remote scheme."});try{!function(e){const t=zs.parse(e),n="https"===t.scheme?443:22;zs.parse({scheme:t.scheme,host:ys(t.host),...void 0===t.port||t.port===n?{}:{port:t.port},pathPrefix:bs(t.pathPrefix)})}(e.scope)}catch(e){t.addIssue({code:"custom",path:["scope"],message:e instanceof Error?e.message:"Invalid Git scope."})}}),o.z.object({name:o.z.string().trim().min(1).max(160).optional(),scope:zs.optional(),secret:As.optional(),status:gs.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one credential field must be updated.");const ks=o.z.object({items:o.z.array(ws).max(1e4)}).strict(),Ss=o.z.object({instanceId:cs,credentialId:cs,credentialRevision:ms,assignmentRevision:ms,status:hs,authorizedAt:ls,updatedAt:ls}).strict(),Cs=o.z.object({credential:ws,secret:As}).strict().superRefine((e,t)=>{e.credential.kind!==e.secret.kind&&t.addIssue({code:"custom",path:["secret","kind"],message:"Credential payload kind mismatch."})});o.z.object({instanceId:cs,generation:ms,credentialIds:o.z.array(cs).max(256).transform(e=>[...new Set(e)].sort()),updatedAt:ls}).strict(),o.z.object({remoteUrl:o.z.string().trim().min(1).max(4096)}).strict(),o.z.discriminatedUnion("status",[o.z.object({status:o.z.literal("ok"),username:o.z.string().min(1).max(240),password:o.z.string().min(1).max(8192)}).strict(),o.z.object({status:o.z.enum(["none","ambiguous","unsupported","missing-host-key","rejected"])}).strict()]),o.z.object({remoteUrl:o.z.string().trim().min(1).max(4096)}).strict(),o.z.discriminatedUnion("status",[o.z.object({status:o.z.literal("ok"),invocationId:cs,publicIdentity:o.z.string().min(1).max(131072),pinnedKnownHosts:o.z.string().min(1).max(131072)}).strict(),o.z.object({status:o.z.enum(["none","ambiguous","unsupported","missing-host-key","rejected"])}).strict()]),o.z.object({invocationId:cs,frame:o.z.string().min(1).max(1048576)}).strict(),o.z.object({frame:o.z.string().min(1).max(1048576)}).strict();const js=o.z.object({operationId:cs,retention:us,payload:Cs}).strict();o.z.object({operationId:cs,instanceId:cs,remoteUrl:o.z.string().trim().min(1).max(4096),ref:o.z.discriminatedUnion("type",[o.z.object({type:o.z.enum(["branch","tag"]),name:o.z.string().trim().min(1).max(240)}).strict(),o.z.object({type:o.z.literal("commit"),commit:o.z.string().trim().regex(/^[0-9a-fA-F]{4,64}$/,"commit must be a hexadecimal Git object id")}).strict()]),clone:o.z.object({depth:o.z.number().int().positive().max(1e5).optional(),submodules:o.z.boolean().default(!1),lfs:o.z.boolean().default(!1),subdirectory:o.z.string().trim().max(240).refine(e=>!e.startsWith("/")&&!e.split("/").some(e=>".."===e),"subdirectory must be a relative path within the repository").transform(e=>e.split("/").filter(e=>e&&"."!==e).join("/")).default("")}).strict(),credentials:o.z.array(js).max(256).default([])}).strict();const Rs=o.z.enum(["openai-responses","openai-chat-completions","anthropic-messages"]);o.z.object({}).strict();const Ts=o.z.object({registry:o.z.boolean().default(!1),runtimeBroker:o.z.boolean().default(!1),workspaceProvisioning:o.z.object({docker:o.z.boolean().default(!1),kubernetes:o.z.boolean().default(!1),local:o.z.boolean().default(!1)}).strip().default({docker:!1,kubernetes:!1,local:!1})}).strip(),$s=o.z.object({multiEntityAssignment:o.z.boolean().default(!1),privateModelCatalog:o.z.boolean().default(!1),stableModelIdentity:o.z.boolean().default(!1),requestMappings:o.z.boolean().default(!1),modelRelay:o.z.object({protocols:o.z.array(Rs).max(3).default([]),streaming:o.z.boolean().default(!1)}).strip().default(()=>({protocols:[],streaming:!1}))}).strip(),Es=o.z.object({policy:o.z.boolean().default(!1),actions:o.z.boolean().default(!1),automations:o.z.boolean().default(!1),aiSessionRead:o.z.boolean().default(!1),decisions:o.z.boolean().default(!1)}).strip(),Ps=o.z.object({enabled:o.z.boolean().default(!1),agentTools:o.z.boolean().default(!1),agentToolCapabilities:Es.optional(),sessionRetention:o.z.boolean().default(!1),maxFileBytes:o.z.number().int().positive().default(33554432),maxBatchPaths:o.z.number().int().min(1).max(100).default(20)}).strip(),Os=o.z.object({runtime:o.z.enum(["docker","local"]),workspaceMaterializer:o.z.enum(["overlay-copy-on-write","worktree"]),processSandbox:o.z.enum(["instance","container","local-runtime"]),providerId:o.z.string().trim().min(1).max(120)}).strip(),Ns=o.z.object({definitions:o.z.boolean().default(!1),runs:o.z.boolean().default(!1),orchestration:o.z.object({storyEntryAuthorization:o.z.boolean().default(!1),orchestrations:o.z.boolean().default(!1),runMembers:o.z.boolean().default(!1),manualRuns:o.z.boolean().default(!1)}).strip().default({storyEntryAuthorization:!1,orchestrations:!1,runMembers:!1,manualRuns:!1}),sharedSpace:o.z.object({enabled:o.z.boolean().default(!1),runtimes:o.z.array(o.z.enum(["docker","local"])).default([])}).strip().default({enabled:!1,runtimes:[]}),combinations:o.z.array(Os).default([])}).strip(),_s=Ns.omit({combinations:!0}).extend({combinations:o.z.array(o.z.unknown()).default([])}).strip(),Us=o.z.object({modelEndpointProbe:o.z.boolean().optional(),aiSessionHistoryLimit:o.z.boolean().optional(),aiSessionAttachmentRetention:o.z.boolean().optional(),aiSessionFileAttachmentLimit:o.z.boolean().optional(),folderPlaces:o.z.boolean().optional(),localFolderNameUpdate:o.z.boolean().optional(),managedGitCredentials:Ts.optional(),managedModels:$s.optional(),stories:Ps.optional(),codexManagedSettings:o.z.boolean().optional(),agentExecution:Ns.optional()}).strip();function Ls(e){const t=e&&"object"==typeof e&&!Array.isArray(e)?e:{},n=Us.safeParse({...t,agentExecution:void 0}),i=n.success?n.data:{},o=_s.safeParse(t.agentExecution),a=o.success?Ns.parse({...o.data,combinations:o.data.combinations.flatMap(e=>{const t=Os.safeParse(e);return t.success?[t.data]:[]})}):Ns.parse({});return{...i,managedGitCredentials:Ts.parse(i.managedGitCredentials||{}),managedModels:$s.parse(i.managedModels||{}),agentExecution:a,stories:{...Ps.parse(i.stories||{}),agentToolCapabilities:Es.parse(i.stories?.agentToolCapabilities||{})}}}const Ds=o.z.string().trim().min(1).max(120),qs=o.z.object({selectModelAtCreate:o.z.boolean().default(!1),selectProviderAtCreate:o.z.boolean().default(!1),selectModelAtResume:o.z.boolean().default(!1),selectProviderAtResume:o.z.boolean().default(!1),switchModelWithinProvider:o.z.boolean().default(!1),switchProviderDuringSession:o.z.boolean().default(!1)}).strip().default({selectModelAtCreate:!1,selectProviderAtCreate:!1,selectModelAtResume:!1,selectProviderAtResume:!1,switchModelWithinProvider:!1,switchProviderDuringSession:!1}),Ms=o.z.object({selectAtCreate:o.z.boolean().default(!1),updateDuringSession:o.z.boolean().default(!1)}).strip().default({selectAtCreate:!1,updateDuringSession:!1}),Bs=o.z.object({subagents:o.z.boolean().default(!1)}).strip().default({subagents:!1}),Fs=o.z.object({agent:Ds,actions:o.z.object({create:o.z.boolean().default(!1),send:o.z.boolean().default(!1),queue:o.z.boolean().default(!1),steer:o.z.boolean().default(!1),interrupt:o.z.boolean().default(!1),archive:o.z.boolean().default(!1),delete:o.z.boolean().default(!1),fork:o.z.boolean().default(!1),rename:o.z.boolean().default(!1),approvalDecisions:o.z.array(o.z.enum(["allow","deny","skip"])).max(3).default([])}).passthrough(),permissionModes:o.z.array(o.z.enum(["ask","auto-review","full-access"])).max(3).default([]),timeline:o.z.object({sessionRead:o.z.boolean().default(!1),turnRead:o.z.boolean().default(!1),liveItems:o.z.boolean().default(!1)}).passthrough(),modelSelection:qs.optional(),reasoningEffort:Ms.optional(),hierarchy:Bs.optional()}).passthrough(),Hs=o.z.array(Fs).max(100).default([]),Vs=new Set(["2026-08-01","2026-08-16","2026-08-17","2026-08-20","2026-09-24","2026-09-29","2026-10-02"]),Gs=o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Protocol version must use YYYY-MM-DD format."),Ws=o.z.string().trim().min(1).max(120),Ys=o.z.enum(["low","medium","high"]),Ks=o.z.enum(["none","friendly","pragmatic"]),Js=o.z.object({modelEntityId:o.z.string().trim().min(1).max(120),modelName:o.z.string().trim().min(1).max(240)}).strict(),Zs=o.z.object({modelVerbosity:Ys.optional(),personality:Ks.optional(),multiAgent:o.z.object({enabled:o.z.boolean().default(!0),maxConcurrentThreads:o.z.number().int().min(1).max(64).optional(),defaultModel:Js.optional(),defaultReasoningEffort:De.optional()}).strict().default({enabled:!0})}).strict();function Qs(){return{features:{appRuntime:!1,tty:!1,gui:!1,browser:!1,browserTunnel:!1,screenshots:!1,logs:!1,aiSessionWorkspaceSelection:!1,aiSessionWorkspaceCheckout:!1,aiSessionPersistenceSettings:!1,privateModelCatalog:!1,codexManagedSettings:!1,nodeAgentConnectionUpdate:!1,gitCliCredentialBroker:!1,gitCredentialProxy:!1,repositoryPathSearch:!1,repositoryWorktreeMoveToMain:!1,modelRelay:{protocols:[],streaming:!1},managedModelEnvironment:{openCodeConfig:!1},aiSessionSendIdempotency:!1,aiSessionQueuePause:!1,aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]},aiSessionConversationAttachments:{metadataAgents:[],contentAgents:[],uploadAgents:[],retentionSettings:!1,fileSizeLimitSettings:!1},aiSessionProviders:[]}}}const Xs=o.z.object({sessionReadAgents:o.z.array(Ws).max(100).default([]),turnReadAgents:o.z.array(Ws).max(100).default([]),liveItemAgents:o.z.array(Ws).max(100).default([])}).passthrough(),er=o.z.object({metadataAgents:o.z.array(Ws).max(100).default([]),contentAgents:o.z.array(Ws).max(100).default([]),uploadAgents:o.z.array(Ws).max(100).default([]),retentionSettings:o.z.boolean().default(!1),fileSizeLimitSettings:o.z.boolean().default(!1)}).passthrough(),tr=o.z.object({protocols:o.z.array(Rs).max(3).default([]),streaming:o.z.boolean().default(!1)}).strip(),nr=o.z.object({openCodeConfig:o.z.boolean().default(!1)}).strip(),ir=o.z.object({appRuntime:o.z.boolean().default(!1),tty:o.z.boolean().default(!1),gui:o.z.boolean().default(!1),browser:o.z.boolean().default(!1),browserTunnel:o.z.boolean().optional(),screenshots:o.z.boolean().default(!1),logs:o.z.boolean().default(!1),aiSessionWorkspaceSelection:o.z.boolean().default(!1),aiSessionWorkspaceCheckout:o.z.boolean().optional(),aiSessionPersistenceSettings:o.z.boolean().default(!1),privateModelCatalog:o.z.boolean().optional(),codexManagedSettings:o.z.boolean().optional(),nodeAgentConnectionUpdate:o.z.boolean().optional(),gitCliCredentialBroker:o.z.boolean().optional(),gitCredentialProxy:o.z.boolean().optional(),repositoryPathSearch:o.z.boolean().optional(),repositoryWorktreeMoveToMain:o.z.boolean().optional(),aiSessionSendIdempotency:o.z.boolean().optional(),aiSessionQueuePause:o.z.boolean().optional(),aiSessionTimeline:Xs.default(function(){return{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),aiSessionConversationAttachments:er.optional(),aiSessionProviders:Hs.optional(),modelRelay:tr.optional(),managedModelEnvironment:nr.optional()}).passthrough(),or=o.z.object({features:ir.default(function(){return{appRuntime:!1,tty:!1,gui:!1,browser:!1,browserTunnel:!1,screenshots:!1,logs:!1,aiSessionWorkspaceSelection:!1,aiSessionWorkspaceCheckout:!1,aiSessionPersistenceSettings:!1,privateModelCatalog:!1,codexManagedSettings:!1,nodeAgentConnectionUpdate:!1,gitCliCredentialBroker:!1,gitCredentialProxy:!1,repositoryPathSearch:!1,repositoryWorktreeMoveToMain:!1,modelRelay:{protocols:[],streaming:!1},managedModelEnvironment:{openCodeConfig:!1},aiSessionSendIdempotency:!1,aiSessionQueuePause:!1,aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]},aiSessionConversationAttachments:{metadataAgents:[],contentAgents:[],uploadAgents:[],retentionSettings:!1,fileSizeLimitSettings:!1},aiSessionProviders:[]}})}).passthrough();function ar(e){const t={features:{appRuntime:!1,tty:!1,gui:!1,browser:!1,browserTunnel:!1,screenshots:!1,logs:!1,aiSessionWorkspaceSelection:!1,aiSessionWorkspaceCheckout:!1,aiSessionPersistenceSettings:!1,privateModelCatalog:!1,codexManagedSettings:!1,nodeAgentConnectionUpdate:!1,gitCliCredentialBroker:!1,gitCredentialProxy:!1,repositoryPathSearch:!1,repositoryWorktreeMoveToMain:!1,modelRelay:{protocols:[],streaming:!1},managedModelEnvironment:{openCodeConfig:!1},aiSessionSendIdempotency:!1,aiSessionQueuePause:!1,aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]},aiSessionConversationAttachments:{metadataAgents:[],contentAgents:[],uploadAgents:[],retentionSettings:!1,fileSizeLimitSettings:!1},aiSessionProviders:[]}};if(!e||"object"!=typeof e||Array.isArray(e))return t;const n=e,i=n.features;if(!i||"object"!=typeof i||Array.isArray(i))return t;const a=i,s={appRuntime:!1,tty:!1,gui:!1,browser:!1,browserTunnel:!1,screenshots:!1,logs:!1,aiSessionWorkspaceSelection:!1,aiSessionWorkspaceCheckout:!1,aiSessionPersistenceSettings:!1,privateModelCatalog:!1,codexManagedSettings:!1,nodeAgentConnectionUpdate:!1,gitCliCredentialBroker:!1,gitCredentialProxy:!1,repositoryPathSearch:!1,repositoryWorktreeMoveToMain:!1,modelRelay:{protocols:[],streaming:!1},managedModelEnvironment:{openCodeConfig:!1},aiSessionSendIdempotency:!1,aiSessionQueuePause:!1,aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]},aiSessionConversationAttachments:{metadataAgents:[],contentAgents:[],uploadAgents:[],retentionSettings:!1,fileSizeLimitSettings:!1},aiSessionProviders:[]};for(const e of["appRuntime","tty","gui","browser","browserTunnel","screenshots","logs","aiSessionWorkspaceSelection","aiSessionWorkspaceCheckout","aiSessionPersistenceSettings","privateModelCatalog","codexManagedSettings","nodeAgentConnectionUpdate","gitCliCredentialBroker","gitCredentialProxy","repositoryPathSearch","repositoryWorktreeMoveToMain","aiSessionSendIdempotency","aiSessionQueuePause"]){const t=o.z.boolean().safeParse(a[e]);t.success&&(s[e]=t.data)}const r=Xs.safeParse(a.aiSessionTimeline);r.success&&(s.aiSessionTimeline=r.data);const d=er.safeParse(a.aiSessionConversationAttachments);d.success&&(s.aiSessionConversationAttachments=d.data);const c=Hs.safeParse(a.aiSessionProviders);c.success&&(s.aiSessionProviders=c.data);const l=tr.safeParse(a.modelRelay);l.success&&(s.modelRelay=l.data);const m=nr.safeParse(a.managedModelEnvironment);return m.success&&(s.managedModelEnvironment=m.data),or.parse({...n,features:{...a,...s}})}o.z.object({nodeAgentUrl:o.z.string().trim().url().max(2048).refine(e=>{const t=new URL(e);return/^https?:$/.test(t.protocol)&&!t.username&&!t.password&&"/"===t.pathname&&!t.search&&!t.hash},"Node agent URL must be an HTTP(S) origin.")}).strict();const sr=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),rr=o.z.string().datetime(),dr=o.z.record(o.z.string(),o.z.string()).default({}),cr=o.z.record(o.z.string(),o.z.string()).default({});o.z.object({encoding:o.z.enum(["utf8","base64"]),data:o.z.string()}).strict().superRefine((e,t)=>{"base64"===e.encoding&&Buffer.from(e.data,"base64").toString("base64")!==e.data&&t.addIssue({code:"custom",path:["data"],message:"Node tunnel binary body must use canonical base64 encoding."})});const lr=/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,mr=/^sha256:([a-fA-F0-9]{64})$/,pr=/^(?:localhost|[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?)(?::[1-9][0-9]{0,4})?$/,ur=/^[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*$/;function gr(e){const t=e.trim();if(!t||t.length>512||t.includes("://")||/\s/.test(t))throw new Error("Docker image reference must not contain a URL scheme or whitespace.");const n=t.indexOf("@");if(-1!==n&&n!==t.lastIndexOf("@"))throw new Error("Docker image reference contains more than one digest separator.");const i=-1===n?void 0:t.slice(n+1),o=-1===n?t:t.slice(0,n),a=i?mr.exec(i):void 0;if(i&&!a)throw new Error("Docker image digest must use sha256 followed by 64 hexadecimal characters.");const s=o.lastIndexOf("/"),r=o.lastIndexOf(":"),d=r>s,c=d?o.slice(r+1):void 0,l=d?o.slice(0,r):o;if(c&&!lr.test(c))throw new Error("Docker image tag is invalid.");if(!c&&!a)throw new Error("Docker image reference must include an explicit tag or sha256 digest.");const m=l.split("/");if(!m.length||m.some(e=>!e))throw new Error("Docker image repository path is invalid.");const p=m.length>1&&(m[0].includes(".")||m[0].includes(":")||"localhost"===m[0]),u=p?m.slice(1):m;if(p&&!pr.test(m[0].toLowerCase()))throw new Error("Docker image registry host or port is invalid.");if(!u.length||u.some(e=>!ur.test(e)))throw new Error("Docker image repository names must be lowercase and use valid separators.");const g=m.map((e,t)=>p&&0===t?e.toLowerCase():e).join("/"),h=a?`sha256:${a[1].toLowerCase()}`:void 0;return`${g}${c?`:${c}`:""}${h?`@${h}`:""}`}function hr(e){const t=gr(e),n=t.indexOf("@"),i=-1===n?void 0:t.slice(n+1),o=-1===n?t:t.slice(0,n),a=o.lastIndexOf("/"),s=o.lastIndexOf(":"),r=s>a;return{reference:t,repository:r?o.slice(0,s):o,tag:r?o.slice(s+1):void 0,digest:i}}const zr=o.z.string().trim().min(1).max(512).transform((e,t)=>{try{return gr(e)}catch(e){return t.addIssue({code:"custom",message:e instanceof Error?e.message:String(e)}),o.z.NEVER}}),fr=o.z.string().trim().transform((e,t)=>{const n=mr.exec(e);return n?`sha256:${n[1].toLowerCase()}`:(t.addIssue({code:"custom",message:"Docker image digest must use sha256 followed by 64 hexadecimal characters."}),o.z.NEVER)}),yr=o.z.object({modelEntityIds:o.z.array(sr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:sr.nullable().optional(),claudeModelHash:sr.nullable().optional(),opencodeModelHash:sr.nullable().optional()}).strict().default({}),Ir=o.z.object({imageId:sr,tag:o.z.string().trim().min(1).max(128).regex(lr).optional()}).strict(),br=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("image"),imageSelection:Ir}).strict(),o.z.object({type:o.z.literal("template"),environmentTemplateId:sr}).strict()]),wr=o.z.enum(["creating","ready","failed","deleting"]),vr=o.z.enum(["linux","darwin","win32","freebsd","openbsd","aix","sunos","unknown"]),xr=o.z.enum(["x64","arm64","arm","ia32","ppc64","s390x","riscv64","unknown"]),Ar=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048),phase:o.z.enum(["validate","commit","inspect","security-check","persist","delete","recovery"]).optional()}).strict(),kr=o.z.object({templateId:sr,nodeId:sr,imageId:fr,name:o.z.string().trim().min(1).max(160),platform:vr,architecture:xr}).strict(),Sr=o.z.enum(["data","agent-home","workspace"]),Cr=o.z.object({deleteVolumes:o.z.boolean()}).strict(),jr=o.z.object({role:Sr,name:o.z.string().trim().min(1).max(255),mountPath:o.z.string().trim().startsWith("/").max(4096),status:o.z.enum(["deleted","retained","missing","failed"]),error:o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048)}).strict().optional()}).strict(),Rr=o.z.object({instanceId:sr,containerDeleted:o.z.boolean(),completed:o.z.boolean(),deletedVolumes:o.z.array(jr),retainedVolumes:o.z.array(jr),volumeResults:o.z.array(jr)}).strict(),Tr=o.z.object({id:sr,name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),source:o.z.enum(["builtin","custom"]),availability:o.z.enum(["available","missing-dependency"]),capabilities:o.z.object({automation:o.z.enum(["cdp"]).optional(),supportsCwdSelection:o.z.boolean().default(!1),supportsProfiles:o.z.boolean().default(!1)}).strict().default({supportsCwdSelection:!1,supportsProfiles:!1}),diagnosticCode:o.z.enum(["APP_EXECUTABLE_NOT_FOUND"]).optional()}).strict(),$r=o.z.object({code:o.z.enum(["APP_CATALOG_INVALID"]),message:o.z.string().trim().min(1).max(500)}).strict(),Er=o.z.object({items:o.z.array(Tr).max(256),observedAt:rr,issues:o.z.array($r).max(32).default([])}).strict(),Pr=o.z.object({id:sr,name:o.z.string().trim().min(1).max(160),sourceInstanceId:sr,nodeId:sr,imageId:fr.optional(),internalTag:o.z.string().trim().min(1).max(512).optional(),platform:vr.optional(),architecture:xr.optional(),sizeBytes:o.z.number().int().nonnegative().optional(),status:wr,error:Ar.optional(),createdAt:rr,updatedAt:rr}).strict().superRefine((e,t)=>{if("ready"===e.status)for(const n of["imageId","internalTag","platform","architecture","sizeBytes"])void 0===e[n]&&t.addIssue({code:"custom",path:[n],message:`Ready environment template requires ${n}.`});"failed"!==e.status||e.error||t.addIssue({code:"custom",path:["error"],message:"Failed environment template requires an error diagnostic."})}),Or=o.z.enum(["apt","dnf","brew","npm"]),Nr=o.z.enum(["user","passwordless-sudo","root"]),_r=o.z.object({platform:vr,arch:xr,installers:o.z.array(Or).max(8),privilege:Nr,installerAccess:o.z.object({npmGlobalWritable:o.z.boolean().optional()}).strict().optional()}).strict(),Ur=o.z.enum(["installed","not-installed","broken","unsupported"]),Lr=o.z.enum(["recipe","bundled","external","none"]),Dr=o.z.object({code:o.z.enum(["BUNDLED","EXTERNALLY_MANAGED","ALREADY_INSTALLED","NOT_INSTALLED","UNSUPPORTED_PLATFORM","INSTALLER_UNAVAILABLE","INSTALLER_NOT_WRITABLE","INSUFFICIENT_PRIVILEGE","OPERATION_IN_PROGRESS"]),message:o.z.string().trim().min(1).max(500)}).strict(),qr=o.z.object({id:sr,name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),description:o.z.string().trim().max(500).optional(),state:Ur,managementSource:Lr,version:o.z.string().trim().max(120).optional(),canInstall:o.z.boolean(),canUninstall:o.z.boolean(),installReason:Dr.optional(),uninstallReason:Dr.optional(),activeJobId:sr.optional()}).strict(),Mr=o.z.enum(["install","uninstall"]),Br=o.z.enum(["queued","running","succeeded","failed","cancelled","interrupted"]),Fr=o.z.object({current:o.z.number().finite().nonnegative().optional(),total:o.z.number().finite().positive().optional(),unit:o.z.string().trim().min(1).max(40).optional()}).strict().refine(e=>void 0===e.total||void 0===e.current||e.current<=e.total,{message:"Progress current must not exceed total.",path:["current"]}),Hr=o.z.object({executable:o.z.string().trim().min(1).max(4096),args:o.z.array(o.z.string().max(4096)).max(128)}).strict(),Vr=o.z.object({code:o.z.string().trim().min(1).max(120).regex(/^[a-z0-9][a-z0-9._-]*$/),message:o.z.string().trim().min(1).max(4096),retryable:o.z.boolean(),sessionIds:o.z.array(sr).max(64).optional()}).strict(),Gr=o.z.object({id:sr,requestId:sr.optional(),appId:sr,operation:Mr,state:Br,phase:o.z.string().trim().min(1).max(120).optional(),progress:Fr.optional(),command:Hr.optional(),logTail:o.z.string().max(32768).optional(),logTruncated:o.z.boolean().optional(),error:Vr.optional(),requestedAt:rr,startedAt:rr.optional(),finishedAt:rr.optional(),updatedAt:rr}).strict(),Wr=o.z.object({streamId:sr,sequence:o.z.number().int().nonnegative(),capabilities:_r,apps:o.z.array(qr).max(256),activeJobs:o.z.array(Gr).max(256),recentJobs:o.z.array(Gr).max(256),observedAt:rr}).strict(),Yr=o.z.object({requestId:sr.optional()}).strict(),Kr=o.z.object({job:Gr}).strict();o.z.object({type:o.z.literal("app-management"),streamId:sr,sequence:o.z.number().int().nonnegative(),observedAt:rr,job:Gr.optional(),snapshot:Wr.optional()}).strict().refine(e=>void 0!==e.job||void 0!==e.snapshot,{message:"An app management event requires a job or snapshot."});const Jr=o.z.object({component:o.z.enum(["control-plane","node-agent","controlled-instance"]),packageName:o.z.string().trim().max(160).optional(),packageVersion:o.z.string().trim().max(80).optional(),protocolVersion:Gs.optional(),buildId:o.z.string().trim().max(160).optional(),builtAt:o.z.string().trim().max(120).optional(),gitCommit:o.z.string().trim().max(120).optional(),imageRef:o.z.string().trim().max(512).optional(),imageDigest:o.z.string().trim().max(240).optional()}).strict();o.z.object({data:o.z.object({ok:o.z.literal(!0),role:o.z.literal("control-plane"),protocolVersion:Gs,build:Jr.extend({component:o.z.literal("control-plane"),packageVersion:o.z.string().trim().min(1).max(80)}).loose(),serverTime:rr}).loose()}).loose();const Zr=o.z.enum(["stable","beta","alpha"]),Qr=o.z.object({packageName:o.z.literal("@task-handoff/controlled-instance"),version:o.z.string().trim().min(1).max(80),platform:o.z.string().trim().min(1).max(40),arch:o.z.string().trim().min(1).max(40),formatVersion:o.z.number().int().positive(),launcherAbi:o.z.number().int().positive(),entrypoint:o.z.string().trim().min(1).max(512),sha256:o.z.string().regex(/^[a-f0-9]{64}$/)}).strict(),Xr=o.z.object({code:o.z.enum(["INSTANCE_RUNTIME_VERSION_MISMATCH","INSTANCE_RUNTIME_ARTIFACT_UNAVAILABLE","INSTANCE_RUNTIME_ARTIFACT_INVALID","INSTANCE_RUNTIME_INSTALL_FAILED","INSTANCE_RUNTIME_RESTART_FAILED","INSTANCE_RUNTIME_VERIFICATION_FAILED","INSTANCE_BASE_RUNTIME_INCOMPATIBLE","NODE_UPDATE_PREFLIGHT_FAILED","NODE_UPDATE_FAILED","LEGACY_INSTANCE_UPDATE_RETIRED"]),message:o.z.string().trim().min(1).max(4096),expectedVersion:o.z.string().trim().min(1).max(80).optional(),actualVersion:o.z.string().trim().min(1).max(80).optional(),retryable:o.z.boolean().default(!1)}).strict(),ed=o.z.object({desiredVersion:o.z.string().trim().min(1).max(80),actualVersion:o.z.string().trim().min(1).max(80).optional(),phase:o.z.enum(["pending","draining","installing","restarting","verifying","matched","failed"]),attempt:o.z.number().int().nonnegative().default(0),lastAttemptAt:rr.optional(),matchedAt:rr.optional(),error:Xr.optional()}).strict(),td=o.z.object({runningInstanceCount:o.z.number().int().nonnegative(),stoppedInstanceCount:o.z.number().int().nonnegative(),activeInstanceCount:o.z.number().int().nonnegative(),restartInstanceCount:o.z.number().int().nonnegative(),runningInstanceIds:o.z.array(sr).max(1024).default([]),stoppedInstanceIds:o.z.array(sr).max(1024).default([]),activeInstanceIds:o.z.array(sr).max(1024).default([])}).strict(),nd=o.z.object({phase:o.z.enum(["queued","updating-node","restarting-node","converging-instances","succeeded","degraded","failed"]),desiredVersion:o.z.string().trim().min(1).max(80),nodeVersion:o.z.string().trim().min(1).max(80).optional(),expectedInstanceIds:o.z.array(sr).max(1024).default([]),expectedInstanceCount:o.z.number().int().nonnegative(),matchedInstanceCount:o.z.number().int().nonnegative(),pendingInstanceCount:o.z.number().int().nonnegative(),failedInstanceCount:o.z.number().int().nonnegative(),deferredInstanceCount:o.z.number().int().nonnegative().default(0)}).strict(),id=o.z.object({channel:Zr.default("stable")}).strict(),od=o.z.object({source:o.z.literal("npm"),channel:Zr,currentVersion:o.z.string().trim().max(240).optional(),availableVersion:o.z.string().trim().min(1).max(240),artifactRef:o.z.string().trim().min(1).max(512).optional(),runtimeArtifacts:o.z.array(Qr).default([]),impact:td,updateAvailable:o.z.boolean(),supported:o.z.boolean().default(!0),reason:o.z.string().trim().max(2048).optional(),checkedAt:rr,preflightToken:o.z.string().trim().min(16).max(240).optional()}).strict(),ad=o.z.object({id:sr,nodeId:sr,source:o.z.literal("npm"),channel:Zr,fromVersion:o.z.string().trim().max(240).optional(),toVersion:o.z.string().trim().min(1).max(240),artifactRef:o.z.string().trim().min(1).max(512).optional(),runtimeArtifacts:o.z.array(Qr).default([]),impact:td,rollout:nd,status:o.z.enum(["queued","updating-node","restarting-node","converging-instances","succeeded","degraded","failed"]),error:Xr.optional(),startedAt:rr.optional(),completedAt:rr.optional(),createdAt:rr,updatedAt:rr}).strict(),sd=o.z.object({channel:Zr,targetVersion:o.z.string().trim().min(1).max(240),preflightToken:o.z.string().trim().min(16).max(240)}).strict(),rd=o.z.object({type:o.z.enum(["branch","tag"]),name:o.z.string().trim().min(1).max(240)}).strict(),dd=o.z.object({type:o.z.literal("commit"),commit:o.z.string().trim().regex(/^[0-9a-fA-F]{4,64}$/,"commit must be a hexadecimal Git object id")}).strict(),cd=o.z.discriminatedUnion("type",[rd,dd]),ld=o.z.object({type:o.z.enum(["none","ssh-key","https-token"]).default("none"),secretId:o.z.string().trim().min(1).max(120).optional()}).strict(),md=o.z.object({depth:o.z.number().int().positive().max(1e5).optional(),submodules:o.z.boolean().default(!1),lfs:o.z.boolean().default(!1),subdirectory:o.z.string().trim().max(240).refine(e=>!e.startsWith("/")&&!e.split("/").some(e=>".."===e),"subdirectory must be a relative path within the repository").transform(e=>e.split("/").filter(e=>e&&"."!==e).join("/")).default("")}).strict();o.z.object({id:sr,name:o.z.string().trim().min(1).max(160),url:o.z.string().trim().min(1).max(2048),provider:o.z.string().trim().max(80).optional(),ref:cd.default({type:"branch",name:"main"}),auth:ld.default({type:"none"}),clone:md.default({submodules:!1,lfs:!1,subdirectory:""}),defaultImageSelection:Ir.optional(),labels:dr,createdAt:rr,updatedAt:rr}).strict();const pd=o.z.object({id:sr,nodeId:sr,name:o.z.string().trim().min(1).max(160),path:o.z.string().trim().min(1).max(4096),defaultImageSelection:Ir.optional(),labels:dr,createdAt:rr,updatedAt:rr}).strict(),ud=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("git-repository"),repositoryId:sr.optional(),url:o.z.string().trim().min(1).max(2048),provider:o.z.string().trim().max(80).optional(),ref:cd.default({type:"branch",name:"main"}),auth:ld.default({type:"none"}),clone:md.default({submodules:!1,lfs:!1,subdirectory:""})}).strict(),o.z.object({type:o.z.literal("git-template"),url:o.z.string().trim().min(1).max(2048),templateId:o.z.string().trim().min(1).max(120).optional(),ref:cd.default({type:"branch",name:"main"}),auth:ld.default({type:"none"}),clone:md.default({submodules:!1,lfs:!1,subdirectory:""})}).strict(),o.z.object({type:o.z.literal("local-folder"),localFolderId:sr.optional(),path:o.z.string().trim().min(1).max(4096),ownerNodeId:sr.optional()}).strict()]),gd=o.z.object({mode:o.z.enum(["local-bind","git-clone","empty-volume","persistent-volume"]),path:o.z.string().trim().min(1).max(4096).default("/workspace"),volumeName:o.z.string().trim().max(240).optional(),readOnly:o.z.boolean().default(!1)}).strict(),hd=o.z.enum(["codex","claude","opencode"]),zd=o.z.object({name:o.z.string().trim().min(1).max(240),upstreamName:o.z.string().trim().min(1).max(240).optional(),order:o.z.number().int().min(0).max(1e6).default(0)}).strict(),fd=o.z.array(zd).max(256).default([]).superRefine((e,t)=>{const n=new Set;for(const[i,o]of e.entries())n.has(o.name)&&t.addIssue({code:"custom",path:[i,"name"],message:`Duplicate model name ${o.name}.`}),n.add(o.name)}),yd=o.z.object({name:o.z.string().trim().min(1).max(240),upstreamName:o.z.string().trim().min(1).max(240),order:o.z.number().int().min(0).max(1e6).default(0)}).strict(),Id=o.z.array(yd).max(64).superRefine((e,t)=>{const n=new Set;for(const[i,o]of e.entries())n.has(o.name)&&t.addIssue({code:"custom",path:[i,"name"],message:`Duplicate request mapping ${o.name}.`}),n.add(o.name)}),bd=Id.default([]),wd=o.z.object({id:sr,name:o.z.string().trim().min(1).max(160),source:ud,defaultImageSelection:Ir.optional(),defaultNodeId:sr.optional(),workspacePolicy:gd,labels:dr,createdAt:rr,updatedAt:rr}).strict(),vd=o.z.object({id:sr,name:o.z.string().trim().min(1).max(160),endpoint:o.z.string().trim().min(1).max(2048),key:o.z.string().trim().min(1).max(4096),model:o.z.string().trim().min(1).max(240),modelNames:fd,mappings:bd,protocols:o.z.array(Rs).max(3).default([]),app:hd,enabled:o.z.boolean().default(!0),order:o.z.number().int().min(0).max(1e6).default(0),labels:dr,createdAt:rr,updatedAt:rr}).strict(),xd=vd.omit({key:!0}).extend({keyPreview:o.z.string().trim().min(1).max(160),keySet:o.z.boolean(),revision:o.z.string().trim().min(1).max(160).optional()}).strict();xd.extend({referenceCount:o.z.number().int().min(0)}).strict(),o.z.object({instanceId:sr,modelEntityIds:o.z.array(sr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:sr.optional(),claudeModelHash:sr.optional(),opencodeModelHash:sr.optional(),updatedAt:rr}).strict().transform(e=>({...e,modelEntityIds:void 0!==e.modelEntityIds?e.modelEntityIds:[...new Set([e.codexModelHash,e.claudeModelHash,e.opencodeModelHash].filter(e=>Boolean(e)))]}));const Ad=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("control-plane"),name:vd.shape.name,enabled:vd.shape.enabled,order:vd.shape.order,revision:o.z.string().trim().min(1).max(160).optional()}).strict(),o.z.object({type:o.z.literal("node"),nodeId:sr,name:vd.shape.name,enabled:vd.shape.enabled,order:vd.shape.order,referenceCount:o.z.number().int().min(0),revision:o.z.string().trim().min(1).max(160).optional()}).strict()]),kd=o.z.object({id:sr,model:xd,locations:o.z.array(Ad).min(1),referenceCount:o.z.number().int().min(0).default(0)}).strict(),Sd=o.z.object({nodeId:sr,code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),Cd=o.z.object({models:o.z.array(kd),nodeDiagnostics:o.z.array(Sd).default([]),updatedAt:rr}).strict();vd.omit({id:!0,createdAt:!0,updatedAt:!0}).extend({mappings:Id.optional()}).strict().partial().strict();const jd=o.z.enum(["synced","pending","unsupported","error"]),Rd=o.z.object({nodeId:sr,state:jd,code:o.z.string().trim().min(1).max(120).optional(),message:o.z.string().trim().min(1).max(2e3).optional()}).strict(),Td=o.z.object({model:xd,locations:o.z.array(Rd).default([])}).strict();o.z.object({targetModelId:sr}).strict(),o.z.object({merged:o.z.literal(!0),reassignedInstances:o.z.array(sr).default([])}).strict();const $d=o.z.object({nodeId:sr,merged:o.z.boolean(),reassignedInstances:o.z.array(sr).default([]),code:o.z.string().trim().min(1).max(120).optional(),message:o.z.string().trim().min(1).max(2e3).optional()}).strict(),Ed=o.z.object({modelId:sr,targetModelId:sr,merged:o.z.boolean(),locations:o.z.array($d).default([])}).strict();o.z.object({modelSelection:yr,modelEntityIds:o.z.array(sr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:sr.optional(),claudeModelHash:sr.optional(),opencodeModelHash:sr.optional()}).strict().transform(e=>({...e,modelEntityIds:e.modelEntityIds||e.modelSelection.modelEntityIds||[...new Set([e.codexModelHash,e.claudeModelHash,e.opencodeModelHash].filter(e=>Boolean(e)))]}));const Pd=o.z.enum(["market","custom"]),Od=o.z.enum(["active","deprecated","yanked"]),Nd=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("builtin"),key:o.z.string().trim().min(1).max(120)}).strict(),o.z.object({kind:o.z.literal("remote"),url:o.z.string().trim().url().max(2048),mediaType:o.z.enum(["image/png","image/jpeg","image/webp"]).optional(),digest:fr.optional()}).strict()]),_d=o.z.array(o.z.string().trim().min(1).max(80)).default([]),Ud=o.z.array(o.z.string().trim().min(1).max(120)).default([]),Ld=o.z.record(o.z.string().trim().min(2).max(35),o.z.string().trim().min(1).max(4096)),Dd=o.z.object({os:o.z.string().trim().min(1).max(40),architecture:o.z.string().trim().min(1).max(40),digest:fr.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional()}).strict(),qd=o.z.object({name:o.z.string().trim().min(1).max(128).regex(lr),version:o.z.string().trim().min(1).max(160).optional(),reference:zr,manifestDigest:fr.optional(),publishedAt:rr.optional(),platforms:o.z.array(Dd).default([]),status:Od.default("active")}).strict(),Md=o.z.object({id:sr,publisher:o.z.string().trim().min(1).max(160),slug:o.z.string().trim().min(1).max(160),name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().min(1).max(4096),localizedDescriptions:Ld.optional(),cover:Nd.optional(),repository:o.z.string().trim().min(1).max(512),defaultTag:o.z.string().trim().min(1).max(128).regex(lr),tags:o.z.array(qd).min(1),capabilities:_d,optionalApps:Ud,defaultEnv:cr,labels:dr,status:Od.default("active")}).strict().superRefine((e,t)=>{e.tags.some(t=>t.name===e.defaultTag)||t.addIssue({code:"custom",path:["defaultTag"],message:"Market defaultTag must identify one of the image tags."})}),Bd=o.z.object({protocolVersion:Gs,catalogId:sr,revision:o.z.string().trim().min(1).max(240),source:o.z.enum(["embedded","remote","cache"]),generatedAt:rr,expiresAt:rr.optional(),items:o.z.array(Md)}).strict(),Fd=o.z.object({source:o.z.enum(["embedded","remote","cache"]),state:o.z.enum(["ready","refreshing","stale","failed"]),revision:o.z.string().trim().min(1).max(240),updatedAt:rr,error:o.z.string().trim().max(4096).optional()}).strict(),Hd=o.z.object({id:sr,origin:o.z.literal("custom"),name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:Ld.optional(),cover:Nd.optional(),reference:zr,repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(lr).optional(),pullPolicy:o.z.literal("if-not-present").default("if-not-present"),capabilities:_d,optionalApps:Ud,defaultEnv:cr,labels:dr,createdAt:rr,updatedAt:rr}).strict(),Vd=o.z.object({name:o.z.string().trim().min(1).max(128).regex(lr),version:o.z.string().trim().min(1).max(160).optional(),reference:zr,manifestDigest:fr.optional(),status:Od}).strict(),Gd=o.z.object({id:sr,origin:Pd,name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:Ld.optional(),cover:Nd,repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(lr).optional(),availableTags:o.z.array(Vd),reference:zr,digest:fr.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional(),capabilities:_d,optionalApps:Ud,defaultEnv:cr,labels:dr,readOnly:o.z.boolean(),lifecycleStatus:Od.optional(),market:o.z.object({catalogId:sr,catalogRevision:o.z.string().trim().min(1).max(240),publisher:o.z.string().trim().min(1).max(160),version:o.z.string().trim().min(1).max(160).optional()}).strict().optional()}).strict(),Wd=o.z.object({id:sr,origin:Pd,name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:Ld.optional(),cover:Nd.optional(),repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(lr).optional(),requestedReference:zr,resolvedDigest:fr.optional(),resolvedReference:zr.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),pullPolicy:o.z.literal("if-not-present").default("if-not-present"),capabilities:_d,optionalApps:Ud,defaultEnv:cr,labels:dr,market:o.z.object({catalogId:sr,catalogRevision:o.z.string().trim().min(1).max(240),publisher:o.z.string().trim().min(1).max(160),version:o.z.string().trim().min(1).max(160).optional()}).strict().optional(),createdAt:rr,updatedAt:rr}).strict(),Yd=o.z.object({phase:o.z.enum(["checking-image","pulling-image","resolving-image","ready","failed"]),requestedReference:zr,generation:o.z.number().int().nonnegative().default(0),error:o.z.string().trim().max(4096).optional(),startedAt:rr,updatedAt:rr}).strict(),Kd=o.z.object({instanceId:sr,generation:o.z.number().int().nonnegative(),requestedReference:zr,sequence:o.z.number().int().nonnegative(),observedAt:rr}).strict();Kd.extend({data:o.z.string().min(1).max(65536),replay:o.z.boolean().optional()}).strict(),Kd.extend({outcome:o.z.enum(["succeeded","failed"])}).strict(),Kd.extend({status:o.z.enum(["connecting","pulling","extracting","complete","failed"]),layers:o.z.object({total:o.z.number().int().nonnegative(),completed:o.z.number().int().nonnegative(),downloaded:o.z.number().int().nonnegative(),downloading:o.z.number().int().nonnegative(),extracting:o.z.number().int().nonnegative()}).strict(),bytes:o.z.object({current:o.z.number().finite().nonnegative(),total:o.z.number().finite().positive()}).strict().optional(),percent:o.z.number().finite().min(0).max(100).optional(),message:o.z.string().trim().min(1).max(500),terminalTail:o.z.string().max(262144).optional(),terminalTruncated:o.z.boolean().optional()}).strict();const Jd=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("direct")}).strict(),o.z.object({kind:o.z.literal("control-plane-proxy"),proxyId:sr,proxyBindingId:sr,targetNodeId:sr}).strict()]),Zd=o.z.object({pingRttMs:o.z.number().nonnegative().optional(),pingRttP95Ms:o.z.number().nonnegative().optional(),consecutiveReconnects:o.z.number().int().nonnegative(),nextRetryAt:rr.optional()}).strict();o.z.object({nodeId:sr,inviteId:sr.optional()}).strict();const Qd=o.z.discriminatedUnion("status",[o.z.object({id:sr,status:o.z.literal("pending")}).strict(),o.z.object({id:sr,status:o.z.literal("completed"),nodeId:sr}).strict()]),Xd=o.z.object({reachability:o.z.enum(["unknown","reachable","unreachable"]),bindingStatus:o.z.enum(["unknown","active","revoked"]),bindingRevision:o.z.number().int().positive().optional(),streamId:o.z.string().trim().min(1).max(160).optional(),revision:o.z.number().int().nonnegative().optional(),observedAt:rr.optional(),target:is.optional(),lastError:Ja.optional(),updatedAt:rr}).strict(),ec=o.z.object({id:sr,name:o.z.string().trim().min(1).max(160),connectionMode:o.z.enum(["local-ipc","local-loopback","direct-http","reverse-wss","control-plane-proxy"]).default("direct-http"),connectionPath:Jd.default({kind:"direct"}),connectionEnabled:o.z.boolean().default(!0),auth:o.z.object({mode:o.z.enum(["local-static-key","paired-hmac","proxy-binding"]).default("local-static-key"),keyId:sr.optional(),secret:o.z.string().trim().max(4096).optional(),pairedAt:rr.optional(),pairing:o.z.object({status:o.z.enum(["pending","paired","expired"]).default("pending"),joinToken:o.z.string().trim().max(4096).optional(),expiresAt:rr.optional()}).strict().optional()}).strict().default({mode:"local-static-key"}),endpoint:o.z.string().trim().max(2048).optional(),controlEndpoint:o.z.string().trim().max(2048).optional(),containerEndpoint:o.z.string().trim().max(2048).optional(),publicWebBase:o.z.string().trim().max(2048).optional(),status:o.z.enum(["unknown","online","offline","degraded"]).default("unknown"),health:o.z.enum(["unknown","ok","degraded","failed"]).default("unknown"),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({}),proxyState:Xd.optional(),appInventory:Er.optional(),labels:dr,lastSeenAt:rr.optional(),createdAt:rr,updatedAt:rr}).strict().superRefine((e,t)=>{"control-plane-proxy"===e.connectionPath.kind&&"control-plane-proxy"!==e.connectionMode&&t.addIssue({code:"custom",path:["connectionPath"],message:"Control-plane proxy paths require control-plane-proxy connection mode."}),"control-plane-proxy"===e.connectionMode&&"control-plane-proxy"!==e.connectionPath.kind&&t.addIssue({code:"custom",path:["connectionPath"],message:"Control-plane proxy nodes require a control-plane-proxy connection path."})});o.z.object({nodeId:sr,status:o.z.enum(["unknown","online","offline","degraded"]),health:o.z.enum(["unknown","ok","degraded","failed"]),lastSeenAt:rr.nullable(),connectionPhase:o.z.enum(["connecting","handshaking","healthy","reconnecting","suspect","offline"]).nullable(),connectionDiagnostics:Zd.nullable(),proxyState:Xd.nullable()}).strict();const tc=o.z.object({id:sr,nodeId:sr,name:o.z.string().trim().min(1).max(160),type:o.z.enum(["docker","kubernetes","local"]),status:o.z.enum(["unknown","online","offline","degraded"]).default("unknown"),accessStrategy:o.z.enum(["node-proxy","direct-port","kubernetes-ingress","kubernetes-port-forward"]).default("node-proxy"),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({}),labels:dr,createdAt:rr,updatedAt:rr}).strict();o.z.object({instanceId:sr,runtimeKind:o.z.literal("docker"),state:o.z.enum(["pending","available","stopped","unavailable"]),sampledAt:rr,cpu:o.z.object({usagePercent:o.z.number().nonnegative()}).strict().optional(),memory:o.z.object({usageBytes:o.z.number().nonnegative(),limitBytes:o.z.number().nonnegative().optional(),usagePercent:o.z.number().nonnegative().optional()}).strict().optional(),network:o.z.object({rxBytes:o.z.number().nonnegative(),txBytes:o.z.number().nonnegative()}).strict().optional(),blockIo:o.z.object({readBytes:o.z.number().nonnegative(),writeBytes:o.z.number().nonnegative()}).strict().optional(),pids:o.z.number().int().nonnegative().optional(),error:o.z.string().trim().max(2048).optional()}).strict();const nc=o.z.object({status:o.z.enum(["healthy","congested","recovering"]),activeOutputs:o.z.number().int().nonnegative(),bufferedBytes:o.z.number().int().nonnegative(),peakBufferedBytes:o.z.number().int().nonnegative(),coalescedEvents:o.z.number().int().nonnegative(),oversizedEvents:o.z.number().int().nonnegative().optional(),peakEventBytes:o.z.number().int().nonnegative().optional(),congestedSince:rr.optional(),lastCongestedAt:rr.optional()}).strip();o.z.object({ok:o.z.boolean().optional(),role:o.z.string().optional(),nodeId:sr.optional(),platform:vr.optional(),arch:xr.optional(),protocolVersion:Gs.optional(),capabilities:Us.optional(),build:Jr.strip().optional(),process:o.z.object({pid:o.z.number().int().positive(),startIdentity:o.z.string().trim().min(1).optional()}).strip().optional(),listener:o.z.object({host:o.z.string().trim().min(1),port:o.z.number().int().min(1).max(65535)}).strip().optional(),instanceProxy:o.z.object({requests:o.z.number().int().nonnegative(),active:o.z.number().int().nonnegative(),completed:o.z.number().int().nonnegative(),aborted:o.z.number().int().nonnegative(),limitRejected:o.z.number().int().nonnegative(),responseBytes:o.z.number().nonnegative(),totalDurationMs:o.z.number().nonnegative(),maxResponseBytes:o.z.number().int().nonnegative()}).partial().strip().optional(),eventTransport:nc.optional(),serverTime:rr.optional()}).strip();const ic=o.z.object({bindScope:o.z.enum(["loopback","all-ipv4"]),port:o.z.number().int().min(1).max(65535)}).strict(),oc=ic.extend({host:o.z.enum(["127.0.0.1","0.0.0.0"]),status:o.z.enum(["listening","error"]),source:o.z.enum(["bootstrap","persisted"]),error:o.z.string().trim().max(2048).optional()}).strict(),ac=ic,sc=o.z.object({enabled:o.z.boolean()}).strict(),rc=o.z.object({enabled:o.z.boolean(),source:o.z.enum(["default","persisted"])}).strip(),dc=sc,cc=o.z.object({nodeId:sr,joinToken:o.z.string().trim().min(1),expiresAt:rr}).passthrough();o.z.object({nodeId:sr,keyId:sr,secret:o.z.string().regex(/^[A-Za-z0-9_-]{32,128}$/),pairedAt:rr}).strict();const lc=o.z.object({id:sr,keyId:sr,name:o.z.string().trim().min(1).max(160).optional(),pairedAt:rr,updatedAt:rr,current:o.z.boolean()}).passthrough();o.z.object({keyId:sr,revoked:o.z.literal(!0),revokedAt:rr}).strict();const mc=o.z.object({id:sr,pairingKeyId:sr,url:o.z.string().trim().min(1).max(2048),name:o.z.string().trim().min(1).max(160).optional(),enabled:o.z.boolean(),createdAt:rr,updatedAt:rr,status:o.z.enum(["disabled","connecting","connected","reconnecting","failed"]),pingRttMs:o.z.number().nonnegative().optional(),pingRttP95Ms:o.z.number().nonnegative().optional(),consecutiveReconnects:o.z.number().int().nonnegative().optional(),nextRetryAt:rr.optional(),lastConnectedAt:rr.optional(),lastDisconnectedAt:rr.optional(),error:o.z.string().optional()}).passthrough(),pc=o.z.object({pairing:lc,connection:o.z.object({id:sr,pairingKeyId:sr,url:o.z.string().trim().min(1).max(2048),name:o.z.string().trim().min(1).max(160).optional(),enabled:o.z.boolean(),createdAt:rr,updatedAt:rr}).passthrough(),tunnel:o.z.object({status:o.z.enum(["disabled","saved","connecting","connected","failed"]),error:o.z.string().trim().max(2048).optional()}).passthrough()}).passthrough(),uc=o.z.object({deleted:o.z.boolean().optional()}).passthrough(),gc=o.z.object({repository:o.z.string().trim().optional(),tag:o.z.string().trim().optional(),id:o.z.string().trim(),createdSince:o.z.string().trim().optional(),size:o.z.string().trim().optional(),sizeBytes:o.z.number().int().nonnegative().optional(),reference:o.z.string().trim().min(1),repoDigests:o.z.array(o.z.string().trim().min(1).max(512)).default([])}).passthrough(),hc=o.z.object({image:Gd,status:o.z.enum(["available","pull-required","unknown"]),localImage:gc.optional(),localSizeBytes:o.z.number().int().nonnegative().optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional(),error:o.z.string().trim().max(2048).optional()}).strict(),zc=o.z.lazy(()=>o.z.object({name:o.z.string().trim().min(1),path:o.z.string().trim().min(1).max(4096),children:o.z.array(zc)}).passthrough()),fc=o.z.object({kind:o.z.enum(["home","root"]),name:o.z.string().trim().min(1),path:o.z.string().trim().min(1).max(4096)}).passthrough();o.z.object({status:o.z.number().int().min(100).max(599).optional(),headers:o.z.record(o.z.string(),o.z.string()).optional(),bodyBase64:o.z.string().optional()}).passthrough();const yc=o.z.object({strategy:o.z.enum(["node-proxy","direct-port","kubernetes-ingress","kubernetes-port-forward"]).default("node-proxy"),web:o.z.string().trim().max(2048).optional(),api:o.z.string().trim().max(2048).optional(),vnc:o.z.string().trim().max(2048).optional(),tty:o.z.string().trim().max(2048).optional(),logs:o.z.string().trim().max(2048).optional(),status:o.z.enum(["unknown","reachable","endpoint-unreachable"]).default("unknown")}).strict(),Ic=o.z.object({...yc.shape}).strict(),bc=o.z.object({strategy:o.z.enum(["control-plane-proxy","direct-port","node-proxy","kubernetes-ingress","kubernetes-port-forward"]).default("control-plane-proxy"),web:o.z.string().trim().max(2048).optional(),api:o.z.string().trim().max(2048).optional(),ws:o.z.string().trim().max(2048).optional(),status:o.z.enum(["unknown","reachable","endpoint-unreachable"]).default("unknown")}).strict().default({strategy:"control-plane-proxy",status:"unknown"}),wc=o.z.object({mode:o.z.enum(["local-bind","git-clone","empty-volume","persistent-volume"]).optional(),status:o.z.enum(["unknown","pending","ready","failed"]).default("unknown"),path:o.z.string().trim().max(4096).optional(),resolvedCommit:o.z.string().trim().max(120).optional(),error:o.z.string().trim().max(2048).optional()}).passthrough(),vc=o.z.object({id:sr,name:o.z.string().trim().min(1).max(160),projectId:sr.optional(),source:ud,sourceSnapshot:o.z.record(o.z.string(),o.z.unknown()).default({}),modelSelection:yr,nodeId:sr,runtimeId:sr,imageSelection:Ir.optional(),environmentSource:br.optional(),environmentTemplateOrigin:kr.optional(),imageSnapshot:Wd.optional(),imageProvisioning:Yd.optional(),stateRevision:o.z.number().int().min(0).default(0),processIncarnationId:o.z.string().trim().min(1).max(120).optional(),status:o.z.enum(["created","provisioning","starting","registering","registered","running","stopping","stopped","deleting","failed","unhealthy"]).default("created"),health:o.z.enum(["unknown","ok","degraded","failed"]).default("unknown"),connectionStatus:o.z.enum(["unknown","online","offline","endpoint-unreachable"]).default("unknown"),agentStatus:o.z.enum(["unknown","online","offline"]).default("unknown"),targetStatus:o.z.enum(["unknown","reachable","endpoint-unreachable"]).default("unknown"),uiAccessStatus:o.z.enum(["unknown","reachable","endpoint-unreachable"]).default("unknown"),controlMode:o.z.enum(["standalone","controlled"]).default("controlled"),protocolVersion:Gs.optional(),instanceVersion:o.z.string().trim().max(80).optional(),build:Jr.optional(),runtimeVersion:ed.optional(),ready:o.z.boolean().default(!1),capabilities:or.default(Qs),appInventory:Er.optional(),config:o.z.object({autoImportAgentConfigs:o.z.boolean().default(!0),codexConfigEnabled:o.z.boolean().default(!0),codexHomeMode:o.z.enum(["default","taskhandoff"]).default("taskhandoff"),defaultCodexPermissionMode:be.default("ask"),codexSettings:Zs.optional(),aiSessionHistoryLimit:o.z.number().int().min(1).max(500).default(50),aiSessionAttachmentRetentionDays:o.z.number().int().min(0).max(365).default(30),aiSessionMaxFileAttachmentBytes:o.z.number().int().positive().max(L).default(U)}).strict().default({autoImportAgentConfigs:!0,codexConfigEnabled:!0,codexHomeMode:"taskhandoff",defaultCodexPermissionMode:"ask",aiSessionHistoryLimit:50,aiSessionAttachmentRetentionDays:30,aiSessionMaxFileAttachmentBytes:U}),workspace:wc.default({status:"unknown"}),target:yc.default({strategy:"direct-port",status:"unknown"}),access:bc,apps:o.z.object({runningCount:o.z.number().int().min(0).default(0),problemCount:o.z.number().int().min(0).default(0),updatedAt:rr.optional(),revision:o.z.number().int().min(0).optional()}).strict().default({runningCount:0,problemCount:0}),aiSessions:Lt.default(()=>({runningCount:0,waitingCount:0,staleCount:0,sessions:[],updatedAt:(new Date).toISOString()})),triggers:o.z.object({enabledCount:o.z.number().int().min(0).default(0),runningCount:o.z.number().int().min(0).default(0),errorCount:o.z.number().int().min(0).default(0),configs:o.z.array(o.z.object({configHash:o.z.string().trim().min(1),config:Ea,deployments:o.z.array(Oa).default([]),runtime:o.z.array(Na).default([])}).strict()).default([]),recentRuns:o.z.array(_a).default([])}).strict().optional(),runtime:o.z.object({kind:o.z.string().trim().max(80).optional(),containerName:o.z.string().trim().max(240).optional(),containerId:o.z.string().trim().max(240).optional(),workspacePath:o.z.string().trim().max(4096).optional(),pid:o.z.number().int().positive().optional(),port:o.z.number().int().positive().max(65535).optional(),labels:o.z.record(o.z.string(),o.z.string()).default({})}).strict().default({labels:{}}),registrationToken:o.z.string().trim().min(1).max(240).optional(),lastHeartbeatAt:rr.optional(),createdAt:rr,updatedAt:rr}).strict(),xc=o.z.object({autoImportAgentConfigs:o.z.boolean().optional(),codexConfigEnabled:o.z.boolean().optional(),codexHomeMode:o.z.enum(["default","taskhandoff"]).optional(),defaultCodexPermissionMode:be.optional(),codexSettings:Zs.optional(),aiSessionHistoryLimit:o.z.number().int().min(1).max(500).optional(),aiSessionAttachmentRetentionDays:o.z.number().int().min(0).max(365).optional(),aiSessionMaxFileAttachmentBytes:o.z.number().int().positive().max(L).optional()}).strict(),Ac=o.z.object({name:vc.shape.name.optional(),config:xc.optional(),modelSelection:vc.shape.modelSelection.unwrap().optional()}).strict(),kc=o.z.object({id:vc.shape.id.optional(),name:vc.shape.name.optional(),projectId:vc.shape.projectId,source:ud.optional(),sourceSnapshot:o.z.record(o.z.string(),o.z.unknown()).optional(),nodeId:vc.shape.nodeId.optional(),runtimeId:vc.shape.runtimeId.optional(),environmentSource:br.optional(),imageSelection:vc.shape.imageSelection,config:xc.optional(),modelSelection:vc.shape.modelSelection.optional(),gitCredentialRetention:us.optional(),start:o.z.boolean().default(!1)}).strict().superRefine((e,t)=>{e.environmentSource&&e.imageSelection&&t.addIssue({code:"custom",path:["environmentSource"],message:"environmentSource and imageSelection are mutually exclusive."}),e.gitCredentialRetention&&"local-folder"===e.source?.type&&t.addIssue({code:"custom",path:["gitCredentialRetention"],message:"Git credential retention requires a Git source."})}),Sc=o.z.object({status:o.z.enum(["not-requested","started","failed"]),error:o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048)}).strict().optional()}).strict(),Cc=o.z.object({...vc.omit({registrationToken:!0}).shape,startOutcome:Sc}).strict(),jc=o.z.union([vc.transform(e=>({instance:e,gitWorkspaceProvisioningOperationId:void 0})),o.z.object({instance:vc,gitWorkspaceProvisioningOperationId:sr.optional()}).strict()]);function Rc(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return e;const n=e,i=new Set(Object.keys(vc.shape)),o={};for(const[e,t]of Object.entries(n))i.has(e)&&(o[e]=t);if(n.capabilities&&"object"==typeof n.capabilities&&!Array.isArray(n.capabilities)){const e={...n.capabilities};Object.prototype.hasOwnProperty.call(e,"apps")&&delete e.apps,o.capabilities=ar(e)}else o.capabilities=ar(void 0);o.appInventory=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e;Object.keys(t).some(e=>!["observedAt","items","issues"].includes(e));const n={observedAt:t.observedAt,items:Array.isArray(t.items)?t.items.map(e=>{e&&"object"==typeof e&&!Array.isArray(e)&&Object.keys(e).some(e=>!["id","name","kind","source","availability","capabilities","diagnosticCode"].includes(e));const t=Ec(e,["id","name","kind","source","availability","diagnosticCode"]);return!t||"object"!=typeof t||Array.isArray(t)?t:{...t,capabilities:Ec(e.capabilities,["automation","supportsCwdSelection","supportsProfiles"])}}):t.items,issues:Array.isArray(t.issues)?t.issues.map(e=>Ec(e,["code","message"])):t.issues},i=Er.safeParse(n);return i.success?i.data:void 0}(n.appInventory,"string"==typeof n.id&&n.id),o.source=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return e;const t=e,n=t.type,i=ud.options.find(e=>e.shape.type.value===n);if(!i)return e;const o="local-folder"===n?["type","localFolderId","path","ownerNodeId"]:"git-template"===n?["type","url","templateId","ref","auth","clone"]:["type","repositoryId","url","provider","ref","auth","clone"],a=Ec(t,o);if("local-folder"!==n){const e=function(e){const t=e&&"object"==typeof e&&!Array.isArray(e)?e:void 0,n=cd.safeParse(Ec(t,["type","name","commit"]));if(n.success)return n.data;const i="string"==typeof t?.commit?t.commit.trim():"",o="string"==typeof t?.name?t.name.trim():"",a=i?cd.safeParse({type:"commit",commit:i}):o?cd.safeParse({type:"tag"===t?.type?"tag":"branch",name:o}):cd.safeParse({type:"branch",name:"main"});return a.success?a.data:void 0}(t.ref),n=Tc(ld,Ec(t.auth,["type","secretId"])),i=Tc(md,Ec(t.clone,["depth","submodules","lfs","subdirectory"]));e?a.ref=e:delete a.ref,n?a.auth=n:delete a.auth,i?a.clone=i:delete a.clone}const s=Tc(i,a);return s?(Object.keys(t).some(e=>!o.includes(e)),s):a}(n.source,"string"==typeof n.id&&n.id),o.sourceSnapshot=n.sourceSnapshot&&"object"==typeof n.sourceSnapshot&&!Array.isArray(n.sourceSnapshot)?n.sourceSnapshot:{},o.build=Tc(Jr,n.build,0,0,"string"==typeof n.id&&n.id),o.aiSessions=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e,n=Array.isArray(t.sessions)?t.sessions.flatMap((e,t)=>{const n=Tc(Ut,e);return n?[n]:[]}):[],i={runningCount:"number"==typeof t.runningCount&&Number.isInteger(t.runningCount)&&t.runningCount>=0?t.runningCount:0,waitingCount:"number"==typeof t.waitingCount&&Number.isInteger(t.waitingCount)&&t.waitingCount>=0?t.waitingCount:0,staleCount:"number"==typeof t.staleCount&&Number.isInteger(t.staleCount)&&t.staleCount>=0?t.staleCount:0,sessions:n,updatedAt:rr.safeParse(t.updatedAt).success?t.updatedAt:(new Date).toISOString()};return Object.keys(t).some(e=>!["runningCount","waitingCount","staleCount","sessions","updatedAt"].includes(e)),Lt.parse(i)}(n.aiSessions,"string"==typeof n.id&&n.id),o.triggers=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e;Object.keys(t).some(e=>!["enabledCount","runningCount","errorCount","configs","recentRuns"].includes(e));const n=(e,t,n)=>Array.isArray(e)?e.flatMap((e,n)=>{const i=Tc(t,e);return i?[i]:[]}):[],i=Array.isArray(t.configs)?t.configs.flatMap((e,t)=>{if(!e||"object"!=typeof e||Array.isArray(e))return[];const i=e;Object.keys(i).some(e=>!["configHash","config","deployments","runtime"].includes(e));const o=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e,n=Ec(t,["configHash","name","description","createdAt","updatedAt"]);if(t.source&&"object"==typeof t.source&&!Array.isArray(t.source)){const e=t.source,i="schedule"===e.type?"interval"===e.scheduleKind?["type","scheduleKind","intervalMs"]:"daily"===e.scheduleKind?["type","scheduleKind","timeOfDay","timezone"]:["type","scheduleKind","weekdays","timeOfDay","timezone"]:"file-change"===e.type?["type","roots","globs","ignore","debounceMs"]:["type","agent","statuses","phases"];n.source=Ec(e,i)}return n.action=Ec(t.action,["promptTemplate"]),n.policy=Ec(t.policy,["cooldownMs","maxConcurrentRuns","whenBusy"]),Tc(Ea,n)}(i.config);return"string"==typeof i.configHash&&o?[{configHash:i.configHash,config:o,deployments:n(i.deployments,Oa),runtime:n(i.runtime,Na)}]:[]}):[];return{enabledCount:"number"==typeof t.enabledCount&&Number.isInteger(t.enabledCount)&&t.enabledCount>=0?t.enabledCount:0,runningCount:"number"==typeof t.runningCount&&Number.isInteger(t.runningCount)&&t.runningCount>=0?t.runningCount:0,errorCount:"number"==typeof t.errorCount&&Number.isInteger(t.errorCount)&&t.errorCount>=0?t.errorCount:0,configs:i,recentRuns:n(t.recentRuns,_a)}}(n.triggers,"string"==typeof n.id&&n.id),o.apps=Tc(vc.shape.apps.unwrap(),Ec(n.apps,["runningCount","problemCount","updatedAt","revision"]),0,0,"string"==typeof n.id&&n.id)||{runningCount:0,problemCount:0},o.config=Tc(vc.shape.config.unwrap(),Ec(n.config,["autoImportAgentConfigs","codexConfigEnabled","codexHomeMode","defaultCodexPermissionMode","codexSettings","aiSessionHistoryLimit","aiSessionAttachmentRetentionDays","aiSessionMaxFileAttachmentBytes"]),0,0,"string"==typeof n.id&&n.id)||{autoImportAgentConfigs:!0,codexConfigEnabled:!0,codexHomeMode:"taskhandoff",defaultCodexPermissionMode:"ask",aiSessionHistoryLimit:50,aiSessionAttachmentRetentionDays:30,aiSessionMaxFileAttachmentBytes:U},o.modelSelection=Tc(yr.unwrap(),Ec(n.modelSelection,["modelEntityIds","codexModelHash","claudeModelHash","opencodeModelHash"]),0,0,"string"==typeof n.id&&n.id)||{},o.imageSnapshot=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return e;const n=e,i=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return e;const t=e,n=new Set(["id","origin","name","description","localizedDescriptions","cover","reference","repository","tag","image","registry","pullPolicy","capabilities","optionalApps","defaultEnv","labels","createdAt","updatedAt"]);for(const e of Object.keys(t))n.has(e);"string"==typeof t.id&&t.id;const i="string"==typeof t.image?t.image:void 0;Object.prototype.hasOwnProperty.call(t,"registry");let o,a="string"==typeof t.reference?t.reference:i;if(a)try{a=gr(a)}catch{if(!a.includes("@")&&a.lastIndexOf(":")<=a.lastIndexOf("/"))try{a=gr(`${a}:latest`)}catch{}}try{o=a?hr(a):void 0}catch{}return{id:t.id,origin:"custom",name:t.name,description:t.description,localizedDescriptions:t.localizedDescriptions,cover:Ec(t.cover,["kind","key","url","mediaType","digest"]),reference:o?.reference??a,repository:o?.repository??t.repository,tag:o?.tag??t.tag,pullPolicy:t.pullPolicy??"if-not-present",capabilities:t.capabilities,optionalApps:t.optionalApps,defaultEnv:t.defaultEnv,labels:t.labels,createdAt:t.createdAt,updatedAt:t.updatedAt}}(n),{reference:o,...a}=i,s=n.requestedReference??o;let r;try{r="string"==typeof s?hr(s):void 0}catch{}const d={img_default:"market_taskhandoff_browser",img_codex:"market_taskhandoff_codex",img_ai:"market_taskhandoff_ai"},c="string"==typeof n.id?n.id:"string"==typeof t?t:void 0,l="market"===n.origin||c&&d[c]?"market":"custom";return void 0!==n.image||n.reference,{...a,id:c&&d[c]?d[c]:c,origin:l,repository:r?.repository??n.repository,tag:r?.tag??n.tag,requestedReference:r?.reference??s,resolvedDigest:n.resolvedDigest,resolvedReference:n.resolvedReference,downloadSizeBytes:n.downloadSizeBytes,market:"market"===l?Ec(n.market,["catalogId","catalogRevision","publisher","version"])??{catalogId:"task_handoff_embedded",catalogRevision:"legacy",publisher:"task-handoff"}:void 0}}(n.imageSnapshot,n.imageId,0,"string"==typeof n.id&&n.id);const a="string"==typeof n.imageId?{img_default:"market_taskhandoff_browser",img_codex:"market_taskhandoff_codex",img_ai:"market_taskhandoff_ai"}[n.imageId]||n.imageId:void 0,s=Ec(n.imageSelection,["imageId","tag"]);o.imageSelection=s||(a?{imageId:a,tag:o.imageSnapshot?.tag}:void 0),o.imageProvisioning=Tc(Yd,Ec(n.imageProvisioning,["phase","requestedReference","generation","error","startedAt","updatedAt"]),0,0,"string"==typeof n.id&&n.id),o.runtimeVersion=function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e,n=e=>{if("string"!=typeof e)return;const t=e.trim();return t&&t.length<=80?t:void 0},i=n(t.desiredVersion);if(!i)return;const o=new Set(ed.shape.phase.options),a="string"==typeof t.phase?t.phase:"pending",s=o.has(a)?a:{idle:"pending",queued:"pending",checking:"pending",downloading:"installing",updating:"installing",completed:"matched",succeeded:"matched",ready:"matched",error:"failed"}[a]||"pending";let r;if(t.error&&"object"==typeof t.error&&!Array.isArray(t.error)){const e=t.error,i="string"==typeof e.message?e.message.trim().slice(0,4096):"";if(i){const t=new Set(Xr.shape.code.options),o="string"==typeof e.code&&t.has(e.code)?e.code:"INSTANCE_RUNTIME_INSTALL_FAILED";e.code;const a=n(e.expectedVersion),s=n(e.actualVersion);r={code:o,message:i,...a?{expectedVersion:a}:{},...s?{actualVersion:s}:{},retryable:!0===e.retryable}}}"string"==typeof t.error&&t.error.trim()&&(r={code:"INSTANCE_RUNTIME_INSTALL_FAILED",message:t.error.trim().slice(0,4096),expectedVersion:i,...n(t.actualVersion)?{actualVersion:n(t.actualVersion)}:{},retryable:!1});const d=n(t.actualVersion),c=rr.safeParse(t.lastAttemptAt),l=rr.safeParse(t.matchedAt);return void 0!==t.lastAttemptAt&&c.success,void 0!==t.matchedAt&&l.success,{desiredVersion:i,...d?{actualVersion:d}:{},phase:s,attempt:"number"==typeof t.attempt&&Number.isInteger(t.attempt)&&t.attempt>=0?t.attempt:0,...c.success?{lastAttemptAt:c.data}:{},...l.success?{matchedAt:l.data}:{},...r?{error:r}:{}}}(n.runtimeVersion,"string"==typeof n.id&&n.id),o.workspace=Tc(wc,n.workspace,0,0,"string"==typeof n.id&&n.id)||{status:"unknown"},o.environmentSource=Tc(br,n.environmentSource,0,0,"string"==typeof n.id&&n.id),o.environmentTemplateOrigin=Tc(kr,n.environmentTemplateOrigin,0,0,"string"==typeof n.id&&n.id),o.runtime=Tc(vc.shape.runtime.unwrap(),n.runtime,0,0,"string"==typeof n.id&&n.id)||{labels:{}},o.target=Tc(yc,Ec(n.target??n.endpoints,["strategy","web","api","vnc","tty","logs","status"]),0,0,"string"==typeof n.id&&n.id)||{strategy:"direct-port",status:"unknown"},o.access=Tc(bc,Ec(n.access,["strategy","web","api","ws","status"]),0,0,"string"==typeof n.id&&n.id)||{strategy:"control-plane-proxy",status:"unknown"};for(const[e,t]of Object.entries(vc.shape))Object.prototype.hasOwnProperty.call(o,e)&&!t.safeParse(o[e]).success&&t.safeParse(void 0).success&&delete o[e];return o}function Tc(e,t,n,i,o){if(!t||"object"!=typeof t||Array.isArray(t))return;let a=structuredClone(t);for(let t=0;t<20;t+=1){const t=e.safeParse(a);if(t.success)return t.data;let n=!1;for(const e of t.error.issues){if("unrecognized_keys"!==e.code)continue;const t=$c(a,e.path);if(t&&"object"==typeof t&&!Array.isArray(t))for(const i of e.keys)Object.prototype.hasOwnProperty.call(t,i)&&(delete t[i],n=!0)}if(!n){const n=structuredClone(a);let i=!1;for(const e of t.error.issues){if(!e.path.length||"string"!=typeof e.path.at(-1))continue;const t=$c(n,e.path.slice(0,-1)),o=e.path.at(-1);t&&"object"==typeof t&&!Array.isArray(t)&&Object.prototype.hasOwnProperty.call(t,o)&&(delete t[o],i=!0)}if(i){const t=e.safeParse(n);if(t.success)return t.data}break}}}function $c(e,t){let n=e;for(const e of t){if(!n||"object"!=typeof n)return;n=n[e]}return n}function Ec(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return e;const n=e;return Object.fromEntries(t.filter(e=>Object.prototype.hasOwnProperty.call(n,e)).map(e=>[e,n[e]]))}o.z.preprocess(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return e;const t=e;return t.instance&&"object"==typeof t.instance&&!Array.isArray(t.instance)?{instance:Rc(t.instance),..."string"==typeof t.gitWorkspaceProvisioningOperationId?{gitWorkspaceProvisioningOperationId:t.gitWorkspaceProvisioningOperationId}:{}}:Rc(t)},jc),o.z.object({instanceId:vc.shape.id,revision:o.z.number().int().min(0),updatedAt:rr,status:vc.shape.status.unwrap(),health:vc.shape.health.unwrap(),connectionStatus:vc.shape.connectionStatus.unwrap(),accessStatus:o.z.enum(["reachable","endpoint-unreachable"]),imageProvisioning:Yd.optional(),workspace:wc,runtime:vc.shape.runtime.unwrap(),runtimeVersion:ed.optional(),ready:o.z.boolean(),lastHeartbeatAt:rr.optional()}).strict(),o.z.object({instanceId:sr.optional(),projectId:sr.optional(),source:ud.optional(),nodeId:sr.optional(),runtimeId:sr.optional(),imageSelection:Ir.optional(),instanceVersion:o.z.string().trim().max(80).optional(),protocolVersion:Gs,build:Jr.optional(),controlMode:o.z.enum(["standalone","controlled"]).default("controlled"),capabilities:or.default(Qs),appInventory:Er.optional(),target:Ic.optional(),workspace:wc.default({status:"unknown"}),registrationToken:o.z.string().trim().max(240).optional(),processIncarnationId:o.z.string().trim().min(1).max(120).optional()}).strict().superRefine((e,t)=>{Vs.has(e.protocolVersion)&&!e.appInventory&&t.addIssue({code:"custom",path:["appInventory"],message:"Current protocol register payload requires appInventory."})}),o.z.object({status:vc.shape.status.optional(),health:vc.shape.health.optional(),protocolVersion:Gs,build:Jr.optional(),capabilities:vc.shape.capabilities.optional(),appInventory:Er.optional(),apps:vc.shape.apps.optional(),aiSessions:vc.shape.aiSessions.optional(),triggers:vc.shape.triggers.optional(),workspace:wc.optional(),target:Ic.optional(),processIncarnationId:o.z.string().trim().min(1).max(120).optional()}).strict().superRefine((e,t)=>{Vs.has(e.protocolVersion)&&!e.appInventory&&t.addIssue({code:"custom",path:["appInventory"],message:"Current protocol heartbeat payload requires appInventory."})});const Pc=o.z.enum(["web","telegram","wechat","dingding","lark"]),Oc=o.z.object({id:sr,channel:Pc,name:o.z.string().trim().min(1).max(160),enabled:o.z.boolean().default(!1),token:o.z.string().trim().max(4096).optional(),defaultChatId:o.z.string().trim().max(240).optional(),allowedUserIds:o.z.array(o.z.string().trim().min(1).max(240)).default([]),pollIntervalMs:o.z.number().int().positive().max(6e4).default(3e3),settings:o.z.record(o.z.string(),o.z.unknown()).default({}),createdAt:rr,updatedAt:rr}).strict(),Nc=o.z.object({id:sr,channel:Pc,bridgeId:sr.optional(),chatSessionId:o.z.string().trim().min(1).max(240),userId:o.z.string().trim().max(240).optional(),activeProjectId:sr.optional(),activeInstanceId:sr.optional(),activeAiSessionId:o.z.string().trim().min(1).max(120).optional(),lastUsedAt:rr,createdAt:rr,updatedAt:rr}).strict();o.z.object({source:o.z.object({type:o.z.literal("chat-gateway").default("chat-gateway"),channel:Pc,bridgeId:sr.optional(),chatSessionId:o.z.string().trim().min(1).max(240),userId:o.z.string().trim().max(240).optional()}).strict(),message:o.z.object({text:o.z.string().trim().max(2e4).default(""),attachments:o.z.array(ze).max(6).default([])}).strict().superRefine((e,t)=>{e.attachments.reduce((e,t)=>e+("inline"===t.source.type?t.size:0),0)>D&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["attachments"],message:"Inline attachments must be 41943040 bytes or less in total."})}),target:o.z.object({instanceId:sr,aiSessionId:o.z.string().trim().min(1).max(120)}).strict().optional()}).strict(),o.z.object({id:sr,instanceId:sr,projectId:sr.optional(),aiSessionId:o.z.string().trim().min(1).max(120),providerSessionId:o.z.string().trim().max(240).optional(),result:o.z.string().default(""),timeoutMs:o.z.number().positive().optional(),source:o.z.string().trim().max(120).optional(),kind:o.z.enum(["task","approval"]).default("task"),status:o.z.enum(["pending","unreachable"]).default("pending"),error:o.z.string().trim().max(2048).optional(),lastSeenAt:rr}).strict();const _c=o.z.string().refine(function(e){return 1===Array.from(e).length&&!/[\p{L}\p{N}\s]/u.test(e)&&"/"!==e&&"\\"!==e},"Mention trigger must be one printable non-alphanumeric character other than / or \\."),Uc=o.z.string().refine(function(e){return 1===Array.from(e).length&&!/[\p{L}\p{N}\s]/u.test(e)&&"\\"!==e},"Command trigger must be one printable non-alphanumeric character other than \\."),Lc=o.z.object({publicBaseUrl:o.z.string().trim().max(2048).optional(),updateChannel:Zr.default("stable"),mentionTrigger:_c.default("@"),commandTrigger:Uc.default("/"),diagnosticLogs:o.z.boolean().default(!1)}).strict().refine(e=>e.mentionTrigger!==e.commandTrigger,{path:["commandTrigger"],message:"Command and mention triggers must be different."}),Dc=o.z.object({publicBaseUrl:o.z.string().trim().max(2048).optional(),updateChannel:Zr.optional(),mentionTrigger:_c.optional(),commandTrigger:Uc.optional(),diagnosticLogs:o.z.boolean().optional()}).strict(),qc=o.z.object({id:wd.shape.id.optional(),name:wd.shape.name,source:ud,defaultImageSelection:wd.shape.defaultImageSelection,defaultNodeId:wd.shape.defaultNodeId,workspacePolicy:gd.optional(),labels:wd.shape.labels.optional()}),Mc={defaultRuntimeId:tc.shape.id.optional()};qc.extend(Mc).strict().transform(({defaultRuntimeId:e,...t})=>({...t,source:ud.parse(t.source)})),qc.omit({id:!0}).partial().extend(Mc).strict().transform(({defaultRuntimeId:e,...t})=>({...t,...t.source?{source:ud.parse(t.source)}:{}})),o.z.object({id:Hd.shape.id.optional(),name:Hd.shape.name,description:Hd.shape.description,cover:Hd.shape.cover,reference:Hd.shape.reference,pullPolicy:Hd.shape.pullPolicy.optional(),capabilities:o.z.array(o.z.string().trim().min(1).max(80)).optional(),optionalApps:o.z.array(o.z.string().trim().min(1).max(120)).optional(),defaultEnv:Hd.shape.defaultEnv.optional(),labels:Hd.shape.labels.optional()}).strict().omit({id:!0}).partial().strict();const Bc=o.z.object({name:vd.shape.name,endpoint:vd.shape.endpoint,key:vd.shape.key,model:vd.shape.model,modelNames:vd.shape.modelNames.optional(),mappings:Id.optional(),protocols:vd.shape.protocols.optional(),app:vd.shape.app,enabled:vd.shape.enabled.optional(),order:vd.shape.order.optional(),labels:vd.shape.labels.optional()}).strict();Bc.omit({key:!0}).extend({key:vd.shape.key.optional()}).strict(),Bc.partial().strict(),o.z.object({endpoint:vd.shape.endpoint,key:vd.shape.key.optional(),existingModelId:vd.shape.id.optional()}).strict().extend({model:vd.shape.model,app:vd.shape.app.optional(),protocol:o.z.enum(["openai-responses","openai-chat-completions","anthropic-messages"]).optional()}).strict().refine(e=>Boolean(e.protocol||e.app),{message:"A model protocol is required.",path:["protocol"]});const Fc=o.z.object({mode:o.z.enum(["local-static-key","paired-hmac","proxy-binding"]).default("local-static-key"),keyId:ec.shape.id.optional(),secret:o.z.string().trim().max(4096).optional(),pairedAt:ec.shape.createdAt.optional(),pairing:o.z.object({status:o.z.enum(["pending","paired","expired"]).default("pending"),joinToken:o.z.string().trim().max(4096).optional(),expiresAt:ec.shape.createdAt.optional()}).strict().optional()}).strict();o.z.object({id:ec.shape.id.optional(),name:ec.shape.name,connectionMode:ec.shape.connectionMode.optional(),connectionPath:ec.shape.connectionPath.optional(),connectionEnabled:ec.shape.connectionEnabled.optional(),auth:Fc.optional(),joinToken:o.z.string().trim().min(1).max(4096).optional(),endpoint:ec.shape.endpoint,controlEndpoint:ec.shape.controlEndpoint,containerEndpoint:ec.shape.containerEndpoint,publicWebBase:ec.shape.publicWebBase,status:o.z.enum(["unknown","online","offline","degraded"]).optional(),health:o.z.enum(["unknown","ok","degraded","failed"]).optional(),capabilities:ec.shape.capabilities.optional(),labels:ec.shape.labels.optional(),lastSeenAt:ec.shape.lastSeenAt}).strict(),o.z.object({name:ec.shape.name.optional(),connectionMode:ec.shape.connectionMode.unwrap().optional(),connectionPath:ec.shape.connectionPath.unwrap().optional(),connectionEnabled:ec.shape.connectionEnabled.unwrap().optional(),auth:Fc.optional(),endpoint:ec.shape.endpoint,controlEndpoint:ec.shape.controlEndpoint,containerEndpoint:ec.shape.containerEndpoint,publicWebBase:ec.shape.publicWebBase,status:ec.shape.status.unwrap().optional(),health:ec.shape.health.unwrap().optional(),capabilities:ec.shape.capabilities.unwrap().optional(),labels:ec.shape.labels.unwrap().optional(),lastSeenAt:ec.shape.lastSeenAt}).strict(),o.z.object({controlPlaneUrl:o.z.string().trim().url().max(2048),joinToken:o.z.string().trim().min(1).max(4096),controlPlaneName:o.z.string().trim().min(1).max(160).optional(),activate:o.z.boolean().optional()}).strict(),o.z.object({nodeName:o.z.string().trim().min(1).max(160).optional(),expiresInMs:o.z.number().int().positive().max(36e5).optional()}).strict();const Hc=256,Vc=o.z.string().trim().min(1).max(80).regex(/^[a-z0-9][a-z0-9._-]*$/),Gc=o.z.string().trim().min(1).max(512).refine(e=>!/\s/.test(e)&&!/[;&|<>`$]/.test(e),"Command must be a single executable path or name."),Wc=o.z.object({id:Vc,name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),description:o.z.string().max(500).optional(),command:Gc,args:o.z.array(o.z.string().max(1024)).max(64).optional(),cwd:o.z.string().max(512).optional(),env:o.z.record(o.z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/),o.z.string().max(4096)).optional(),display:o.z.object({width:o.z.number().int().min(320).max(7680).optional(),height:o.z.number().int().min(240).max(4320).optional(),depth:o.z.union([o.z.literal(16),o.z.literal(24),o.z.literal(32)]).optional()}).strict().optional(),defaultDisplayTarget:o.z.object({mode:o.z.enum(["isolated","shared"]),id:o.z.string().trim().min(1).max(80).regex(/^[a-z0-9][a-z0-9._-]*$/).optional(),autoCreate:o.z.boolean().optional()}).strict().optional(),automation:o.z.object({type:o.z.literal("cdp"),portArg:o.z.string().optional(),endpointPath:o.z.string().optional()}).strict().optional(),web:o.z.object({portArg:o.z.string().optional(),readyPath:o.z.string().optional()}).strict().optional()}).strict();o.z.array(Wc).max(Hc);const Yc=o.z.object({id:Vc,name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),description:o.z.string().trim().max(500).optional()}).strict(),Kc=o.z.object({items:o.z.array(Yc).max(Hc)}).strict(),Jc=o.z.object({schemaVersion:o.z.literal(1),items:o.z.array(Wc).max(Hc)}).strict(),Zc=o.z.object({items:o.z.array(Wc).max(Hc)}).strict();function Qc(e){const t=e=>`/api/controlled-instances/${encodeURIComponent(e)}/apps`,n=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data,i=(e,i,o,a)=>{const s=Yr.parse(a?{requestId:a}:{});return n(`${t(e)}/${encodeURIComponent(i)}/${o}`,Kr,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})};return{management:(e,i)=>n(`${t(e)}/management`,Wr,{signal:i}),install:(e,t,n)=>i(e,t,"install",n),uninstall:(e,t,n)=>i(e,t,"uninstall",n),job:(e,i,o)=>n(`${t(e)}/jobs/${encodeURIComponent(i)}`,Kr,{signal:o}),catalog:(e,i)=>n(`${t(e)}/catalog`,Kc,{signal:i}),customCatalog:(e,i)=>n(`${t(e)}/catalog/custom`,Jc,{signal:i}),updateCustomCatalog:(e,i)=>n(`${t(e)}/catalog/custom`,Jc,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(Zc.parse(i))})}}const Xc=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),el=o.z.string().datetime(),tl=o.z.object({sessionReadAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),turnReadAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),liveItemAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([])}).passthrough();const nl=o.z.object({metadataAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),contentAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),uploadAgents:o.z.array(o.z.string().trim().min(1).max(120)).max(100).default([]),retentionSettings:o.z.boolean().default(!1)}).passthrough(),il=o.z.object({aiSessionTimeline:tl.default(function(){return{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),aiSessionConversationAttachments:nl.optional(),aiSessionProviders:Hs.optional(),browserTunnel:o.z.boolean().optional(),aiSessionQueuePause:o.z.boolean().optional()}).passthrough(),ol=o.z.enum(["connecting","handshaking","healthy","reconnecting","suspect","offline"]),al=o.z.enum(["start","stop","restart","retry-image"]);o.z.object({instanceId:Xc,revision:o.z.number().int().nonnegative(),updatedAt:el,status:o.z.enum(["created","provisioning","starting","registering","registered","running","stopping","stopped","deleting","failed","unhealthy"]),health:o.z.enum(["unknown","ok","degraded","failed"]),connectionStatus:o.z.enum(["unknown","online","offline","endpoint-unreachable"]),ready:o.z.boolean(),lastHeartbeatAt:el.optional()}).strip();const sl=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048)}).strict(),rl=o.z.enum(["instances","runtimes","models"]),dl=o.z.enum(["uninitialized","loading","ready","stale","error"]),cl=o.z.object({nodeId:Xc,route:o.z.string().trim().min(1).max(500),method:o.z.string().trim().min(1).max(20),code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(4096),statusCode:o.z.number().int().optional(),issues:o.z.array(o.z.object({path:o.z.array(o.z.union([o.z.string(),o.z.number()])).optional(),message:o.z.string()}).passthrough()).optional()}).passthrough(),ll=o.z.object({nodeId:Xc,resource:rl,phase:dl,revision:o.z.number().int().nonnegative().optional(),updatedAt:el.optional(),error:cl.optional()}).strict();ll.extend({contentChanged:o.z.boolean().optional()}).strict();const ml=o.z.object({nodeStates:o.z.array(ll).default([])}).passthrough(),pl=o.z.object({id:Xc,name:o.z.string().trim().min(1).max(160),status:o.z.enum(["unknown","online","offline","degraded"]),health:o.z.enum(["unknown","ok","degraded","failed"]),connectionMode:o.z.enum(["local-ipc","local-loopback","direct-http","reverse-wss","control-plane-proxy"]),connectionPhase:ol.optional(),lastSeenAt:el.optional(),observedAt:el,capabilities:o.z.array(o.z.string().trim().min(1).max(120)).max(256),error:sl.optional()}).strict(),ul=o.z.array(pl),gl=o.z.object({id:o.z.string().trim().min(1).max(120),name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),supportsCwdSelection:o.z.boolean()}).strict(),hl=o.z.object({modelEntityIds:o.z.array(Xc).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:Xc.nullable().optional(),claudeModelHash:Xc.nullable().optional(),opencodeModelHash:Xc.nullable().optional()}).strict().default({}),zl=o.z.object({id:Xc,name:o.z.string().trim().min(1).max(160),nodeId:Xc,status:o.z.enum(["created","provisioning","starting","registering","registered","running","stopping","stopped","deleting","failed","unhealthy"]),health:o.z.enum(["unknown","ok","degraded","failed"]),connectionStatus:o.z.enum(["unknown","online","offline","endpoint-unreachable"]),ready:o.z.boolean(),capabilities:il.default({aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),config:o.z.object({defaultCodexPermissionMode:be.default("ask"),aiSessionMaxFileAttachmentBytes:o.z.number().int().positive().default(U)}).strict().default({defaultCodexPermissionMode:"ask",aiSessionMaxFileAttachmentBytes:U}),modelSelection:hl,lastHeartbeatAt:el.optional(),heartbeatAgeMs:o.z.number().int().nonnegative().optional(),observedAt:el,runtime:o.z.object({id:Xc,name:o.z.string().trim().min(1).max(160).optional(),type:o.z.enum(["docker","kubernetes","local"]).optional()}).strict(),workspace:o.z.object({status:o.z.enum(["unknown","pending","ready","failed"]),path:o.z.string().trim().max(4096).optional()}).strict(),protocol:o.z.object({version:o.z.string().optional(),compatible:o.z.boolean(),warning:o.z.string().trim().min(1).max(500).optional()}).strict(),aiSessions:Dt,availableActions:o.z.array(al).max(4).default([]),availableApps:o.z.array(gl).max(256).default([]),availableAgents:o.z.array(gl).max(256),error:sl.optional()}).strict(),fl=o.z.array(zl),yl=e=>o.z.object({data:e}).passthrough(),Il=o.z.object({data:fl,meta:ml.optional()}).passthrough(),bl=o.z.object({config:o.z.object({defaultCodexPermissionMode:be}).passthrough()}).passthrough(),wl=o.z.object({source:o.z.object({type:o.z.string().trim().min(1).max(80),localFolderId:o.z.string().trim().min(1).max(120).optional(),path:o.z.string().trim().min(1).max(4096).optional()}).passthrough()}).passthrough(),vl=o.z.object({id:o.z.string().trim().min(1).max(160),name:o.z.string().trim().min(1).max(160)}),xl=o.z.object({id:o.z.string().trim().min(1).max(160),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({})}).passthrough(),Al=o.z.object({id:o.z.string().trim().min(1).max(120),model:o.z.object({id:o.z.string().trim().min(1).max(120),name:o.z.string().trim().min(1).max(160),model:o.z.string().trim().min(1).max(240),modelNames:o.z.array(o.z.object({name:o.z.string(),upstreamName:o.z.string().optional(),order:o.z.number().int()}).strip()).default([]),protocols:o.z.array(o.z.string()).default([]),app:o.z.string().optional(),enabled:o.z.boolean(),order:o.z.number().int()}).passthrough(),locations:o.z.array(o.z.object({type:o.z.enum(["control-plane","node"]),nodeId:o.z.string().optional(),enabled:o.z.boolean()}).passthrough())}).passthrough(),kl=o.z.object({models:o.z.array(Al)}).passthrough(),Sl=o.z.object({id:o.z.string().trim().min(1).max(160),status:o.z.string().trim().min(1).max(80)}).strip(),Cl=o.z.object({id:o.z.string().trim().min(1).max(120),nodeId:o.z.string().trim().min(1).max(120),name:o.z.string().trim().min(1).max(160),path:o.z.string().trim().min(1).max(4096),labels:o.z.record(o.z.string(),o.z.string()),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).passthrough();function jl(e){const t=async(t,n,i)=>(await e.request(t,yl(n),{signal:i})).data;return{nodes:e=>t("/api/nodes?projection=directory",ul,e),node:(e,n)=>t(`/api/nodes/${encodeURIComponent(e)}`,xl,n),instanceBoard:e=>t("/api/instance-board?projection=directory",fl,e),instanceDirectory:t=>e.request("/api/instance-board?projection=directory&progressive=true",Il,{signal:t}),models:e=>t("/api/models",kl,e),instanceWorkspaceSource:async(e,n)=>(await t(`/api/controlled-instances/${encodeURIComponent(e)}`,wl,n)).source,updateInstanceName:async(t,n)=>(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,yl(vl),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:n})})).data,async updateInstance(t,n){const i=Ac.parse(n);return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,yl(vc),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(i)})).data},updateNodeName:async(t,n)=>(await e.request(`/api/nodes/${encodeURIComponent(t)}`,yl(vl),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:n})})).data,updateInstanceDefaultPermissionMode:async(t,n)=>(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,yl(bl),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({config:{defaultCodexPermissionMode:n}})})).data.config.defaultCodexPermissionMode,createInstance:async t=>(await e.request("/api/controlled-instances",yl(Cc),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)})).data,async deleteInstance(t,n){const i=Cr.parse(n);return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,yl(Rr),{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify(i)})).data},nodeLocalFolders:(e,n)=>t(`/api/nodes/${encodeURIComponent(e)}/local-folders`,o.z.array(Cl),n),instanceAction(t,n){const i=al.parse(n),o="retry-image"===i?"image-provisioning/retry":i;return e.request(`/api/controlled-instances/${encodeURIComponent(t)}/${o}`,yl(Sl),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}).then(e=>e.data)}}}const Rl=Ea.extend({id:Ea.shape.configHash}).strip(),Tl=o.z.object({config:Ea,deployment:Oa,runtime:Na.optional()}).strip(),$l=o.z.object({previousConfigHash:Ea.shape.configHash.optional(),trigger:Rl.optional(),configHash:Ea.shape.configHash.optional(),deletedTemplate:o.z.boolean().optional(),results:o.z.array(o.z.unknown()).optional(),partialFailures:o.z.array(Fa).default([])}).strip(),El=o.z.object({configHash:Ea.shape.configHash,results:o.z.array(o.z.unknown()).default([])}).passthrough();function Pl(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data;return{list:e=>t("/api/triggers",Ma,{signal:e}),create:e=>t("/api/triggers",Rl,Ri("POST",Ba.parse(e))),update:(e,n)=>t(`/api/triggers/${encodeURIComponent(e)}`,$l,Ri("PUT",Ba.parse(n))),remove:e=>t(`/api/triggers/${encodeURIComponent(e)}`,$l,Ri("DELETE")),apply:(e,n)=>t(`/api/triggers/${encodeURIComponent(e)}/apply`,El,Ri("POST",n)),bindSession:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/triggers`,Tl,Ri("POST",{configHash:i})),unbindSession:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/triggers/${encodeURIComponent(i)}`,o.z.unknown(),Ri("DELETE")),run:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/triggers/${encodeURIComponent(n)}/run`,o.z.unknown(),Ri("POST",i?{deploymentId:i}:{}))}}const Ol=2e3,Nl=32e3,_l=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Ul=_l,Ll=o.z.string().regex(/^[a-f0-9]{64}$/),Dl=o.z.enum(["overlay-copy-on-write","worktree"]),ql=o.z.enum(["instance","container","local-runtime"]),Ml=o.z.object({workspaceMaterializer:Dl.default("overlay-copy-on-write"),processSandbox:ql.default("instance")}).strict(),Bl=o.z.object({id:Ul,revision:Ll,name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(Ol).default(""),appendedPrompt:o.z.string().max(Nl).default(""),targetInstanceId:_l,cwdFolderId:_l,providerId:_l,modelEntityId:_l.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:Ml,createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Fl={name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(Ol).default(""),appendedPrompt:o.z.string().max(Nl).default(""),targetInstanceId:_l,cwdFolderId:_l,providerId:_l,modelEntityId:_l.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:Ml.optional()},Hl=o.z.object(Fl).strict(),Vl=o.z.object({expectedRevision:Ll,name:Fl.name.optional(),description:o.z.string().trim().max(Ol).nullable().optional(),appendedPrompt:o.z.string().max(Nl).nullable().optional(),targetInstanceId:Fl.targetInstanceId.optional(),cwdFolderId:Fl.cwdFolderId.optional(),providerId:Fl.providerId.optional(),modelEntityId:_l.nullable().optional(),modelName:o.z.string().trim().min(1).max(120).nullable().optional(),reasoningEffort:o.z.string().trim().min(1).max(120).nullable().optional(),permissionMode:o.z.string().trim().min(1).max(120).nullable().optional(),executionPolicy:Fl.executionPolicy}).strict();o.z.object({agents:o.z.array(Bl)}).strict();const Gl=o.z.object({id:Ul,deleted:o.z.literal(!0),deletedOrchestrationIds:o.z.array(o.z.string().trim().min(1).max(160)).default([])}).strict();o.z.object({agents:o.z.array(o.z.object({nodeId:_l,agent:Bl}).strict()),unavailableNodeIds:o.z.array(_l).default([])}).strict();const Wl=o.z.enum(["AGENT_DEFINITION_INVALID_INPUT","AGENT_DEFINITION_NOT_FOUND","AGENT_DEFINITION_REVISION_CONFLICT","AGENT_DEFINITION_TARGET_INSTANCE_UNKNOWN","AGENT_DEFINITION_FOLDER_UNKNOWN","AGENT_DEFINITION_PROVIDER_UNSUPPORTED","AGENT_DEFINITION_POLICY_UNSUPPORTED"]),Yl=o.z.object({code:o.z.literal("AGENT_DEFINITION_REVISION_CONFLICT"),expectedRevision:Ll,actualRevision:Ll}).strict();o.z.union([Yl,o.z.object({code:Wl}).strict()]);const Kl=o.z.object({agentId:Ul,change:o.z.enum(["created","updated","deleted"]),revision:Ll.optional(),definition:Bl.optional()}).strict();o.z.object({nodeId:_l,event:Kl}).strict();const Jl=Bl.strip().extend({executionPolicy:Ml.strip()});o.z.object({agents:o.z.array(Jl)}).strip();const Zl=o.z.object({agents:o.z.array(o.z.object({nodeId:_l,agent:Jl}).strip()),unavailableNodeIds:o.z.array(o.z.string().trim().min(1).max(120)).default([])}).strip(),Ql=o.z.object({agentId:Ul,change:o.z.enum(["created","updated","deleted"]),revision:Ll.optional(),definition:Jl.optional()}).strip();function Xl(e){return Jl.parse(e)}o.z.object({nodeId:_l,event:Ql}).strip();const em=200,tm=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),nm=tm,im=o.z.string().regex(/^[a-f0-9]{64}$/),om=o.z.object({fromAgentId:Ul,toAgentId:Ul}).strict(),am=o.z.object({id:nm,revision:im,name:o.z.string().trim().min(1).max(120),agentIds:o.z.array(Ul).min(1).max(50),edges:o.z.array(om).max(em),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),sm=o.z.object({name:o.z.string().trim().min(1).max(120),agentIds:o.z.array(Ul).min(1).max(50),edges:o.z.array(om).max(em).default([])}).strict(),rm=o.z.object({expectedRevision:im,name:o.z.string().trim().min(1).max(120).optional(),agentIds:o.z.array(Ul).min(1).max(50).optional(),edges:o.z.array(om).max(em).optional()}).strict();o.z.object({orchestrations:o.z.array(am)}).strict();const dm=o.z.object({id:nm,deleted:o.z.literal(!0)}).strict();o.z.object({orchestrations:o.z.array(o.z.object({nodeId:tm,orchestration:am}).strict()),unavailableNodeIds:o.z.array(tm).default([])}).strict();const cm=o.z.enum(["AGENT_ORCHESTRATION_NOT_FOUND","AGENT_ORCHESTRATION_REVISION_CONFLICT","AGENT_ORCHESTRATION_INVALID_GRAPH","AGENT_ORCHESTRATION_AGENT_UNKNOWN","AGENT_ORCHESTRATION_CYCLE","AGENT_ORCHESTRATION_DEFAULT_PROTECTED"]),lm=o.z.object({code:o.z.literal("AGENT_ORCHESTRATION_CYCLE"),cycle:o.z.array(Ul).min(2)}).strict(),mm=o.z.object({code:o.z.literal("AGENT_ORCHESTRATION_REVISION_CONFLICT"),expectedRevision:im,actualRevision:im}).strict();o.z.union([lm,mm,o.z.object({code:cm}).strict()]);const pm=o.z.object({orchestrationId:nm,change:o.z.enum(["created","updated","deleted"]),revision:im.optional(),orchestration:am.optional()}).strict();o.z.object({nodeId:tm,event:pm}).strict();const um=am.strip().extend({agentIds:o.z.array(Ul).max(50).default([]),edges:o.z.array(om).max(em).default([])});o.z.object({orchestrations:o.z.array(um)}).strip();const gm=o.z.object({orchestrations:o.z.array(o.z.object({nodeId:o.z.string().trim().min(1).max(160),orchestration:um}).strip()),unavailableNodeIds:o.z.array(o.z.string().trim().min(1).max(160)).default([])}).strip(),hm=o.z.object({orchestrationId:nm,change:o.z.enum(["created","updated","deleted"]),revision:im.optional(),orchestration:um.optional()}).strip();function zm(e){return um.parse(e)}o.z.object({nodeId:o.z.string().trim().min(1).max(160),event:hm}).strip();const fm=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),ym=fm,Im=fm,bm=o.z.number().int().nonnegative(),wm=o.z.enum(["queued","preparing","running","finalizing","completed","failed","cancelled"]),vm=o.z.object({kind:o.z.enum(["control-plane-user","standalone-operator"]),subjectId:fm,authorizationRevision:o.z.number().int().nonnegative().optional()}).strict(),xm=o.z.object({source:o.z.literal("story-session").optional(),initiatingInstanceId:fm,initiatingAiSessionId:fm,storyId:fm,authorizationSubject:vm.optional()}).strict(),Am=o.z.object({source:o.z.literal("control-plane"),authorizationSubject:vm.optional()}).strict(),km=o.z.union([xm,Am]),Sm=o.z.object({maxMembers:o.z.number().int().positive(),maxDepth:o.z.number().int().nonnegative(),maxConcurrency:o.z.number().int().positive()}).strict(),Cm=o.z.object({prompt:o.z.string().trim().min(1).max(128e3)}).strict(),jm=o.z.object({agentRevision:Ll,targetInstanceId:fm,cwdFolderId:fm,appendedPrompt:o.z.string().max(32e3),providerId:fm,modelEntityId:fm.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:Ml}).strict(),Rm=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(4e3),retryable:o.z.boolean().default(!1),details:o.z.record(o.z.string(),o.z.unknown()).optional()}).strict(),Tm=o.z.object({text:o.z.string().max(128e3),truncated:o.z.boolean().default(!1),source:o.z.literal("provider-final-message").default("provider-final-message")}).strict(),$m=o.z.object({status:o.z.enum(["pending","delivered","failed"]),attempts:o.z.number().int().nonnegative(),updatedAt:o.z.string().datetime(),deliveredAt:o.z.string().datetime().optional(),error:Rm.optional()}).strict();o.z.object({runId:ym,status:o.z.enum(["completed","failed","cancelled"]),result:o.z.object({text:o.z.string().max(32e3),truncated:o.z.boolean()}).strict().optional(),error:Rm.optional()}).strict().superRefine((e,t)=>{"completed"!==e.status||e.result||t.addIssue({code:o.z.ZodIssueCode.custom,message:"A completed Agent Run tool result requires result text."}),"completed"===e.status||e.error||t.addIssue({code:o.z.ZodIssueCode.custom,message:"A failed or cancelled Agent Run tool result requires an error."})});const Em=o.z.object({status:o.z.enum(["pending","completed","retrying","manual-intervention"]),attempts:o.z.number().int().nonnegative(),message:o.z.string().max(4e3).optional(),updatedAt:o.z.string().datetime()}).strict(),Pm=o.z.object({runtimeId:fm,state:o.z.enum(["preparing","active","retained","expiring","delete-retrying","expired","manual-intervention"]),usageBytes:o.z.number().int().nonnegative(),quotaBytes:o.z.number().int().positive(),expiresAt:o.z.string().datetime().optional()}).strict(),Om=o.z.object({memberId:Im,runId:ym,agentId:Ul,parentMemberId:Im.optional(),instanceId:fm,aiSessionId:fm.optional(),role:o.z.enum(["root","callee"]),depth:o.z.number().int().nonnegative(),status:wm,input:Cm.optional(),executionSnapshot:jm,result:Tm.optional(),error:Rm.optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict(),Nm=o.z.object({runId:ym,sequence:o.z.number().int().positive(),timestamp:o.z.string().datetime(),kind:o.z.string().trim().min(1).max(120),memberId:Im.optional(),data:o.z.record(o.z.string(),o.z.unknown()).default({})}).strict(),_m=o.z.object({runId:ym,clientRequestId:fm,revision:bm,status:wm,input:Cm.optional(),provenance:km,orchestrationId:nm,rootMemberId:Im,budget:Sm,result:Tm.optional(),resultDelivery:$m.optional(),error:Rm.optional(),cleanup:Em.optional(),sharedSpace:Pm.optional(),members:o.z.array(Om).optional(),timeline:o.z.array(Nm).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict(),Um=o.z.object({clientRequestId:fm,orchestrationId:nm,entryAgentId:Ul.optional(),input:Cm,provenance:km,budget:Sm.optional()}).strict(),Lm=o.z.object({clientRequestId:fm,orchestrationId:nm,entryAgentId:Ul.optional(),input:Cm,budget:Sm.optional()}).strict(),Dm=o.z.object({expectedRevision:bm.optional()}).strict();o.z.object({runs:o.z.array(_m)}).strict(),o.z.enum(["AGENT_RUN_NOT_FOUND","AGENT_RUN_MEMBER_NOT_FOUND","AGENT_RUN_IDEMPOTENCY_CONFLICT","AGENT_RUN_REVISION_CONFLICT","AGENT_RUN_INITIATING_INSTANCE_UNKNOWN","AGENT_RUN_ORCHESTRATION_UNKNOWN","AGENT_RUN_ENTRY_REQUIRED","AGENT_RUN_ENTRY_INVALID","AGENT_RUN_INVOCATION_FORBIDDEN","AGENT_RUN_EXECUTION_UNSUPPORTED","AGENT_RUN_ALREADY_TERMINAL"]);const qm=o.z.object({runId:ym,revision:bm,run:_m}).strict(),Mm=o.z.object({runId:ym,memberId:Im,revision:bm,member:Om}).strict();o.z.object({runs:o.z.array(o.z.object({nodeId:fm,run:_m}).strict()),unavailableNodeIds:o.z.array(fm).default([])}).strict(),o.z.object({nodeId:fm,event:o.z.union([qm,Mm])}).strict();const Bm=Om.strip().extend({input:Cm.strip().optional(),executionSnapshot:jm.strip(),result:Tm.strip().optional(),error:Rm.strip().optional()}),Fm=Nm.strip(),Hm=_m.strip().extend({orchestrationId:nm.optional(),input:Cm.strip().optional(),provenance:o.z.union([xm.strip().extend({authorizationSubject:vm.strip().optional()}),Am.strip().extend({authorizationSubject:vm.strip().optional()})]),budget:Sm.strip(),result:Tm.strip().optional(),resultDelivery:$m.strip().extend({error:Rm.strip().optional()}).optional(),error:Rm.strip().optional(),cleanup:Em.strip().optional(),sharedSpace:Pm.strip().optional(),members:o.z.array(Bm).optional(),timeline:o.z.array(Fm).optional()}).transform(e=>{const t=e.orchestrationId??(()=>{const t=(e.members??[]).find(t=>t.memberId===e.rootMemberId);if(!t)throw new Error("An Agent Run without an orchestration binding requires its root member to normalize.");return n=t.agentId,`default:${Ul.parse(n)}`;var n})();return{...e,orchestrationId:t}}),Vm=o.z.object({runId:ym,revision:bm,run:Hm}).strip(),Gm=o.z.object({runId:ym,memberId:Im,revision:bm,member:Bm}).strip();function Wm(e){return Hm.parse(e)}o.z.object({nodeId:fm,event:o.z.union([Vm,Gm])}).strip();const Ym=["agent_run"],Km=o.z.enum(Ym),Jm=o.z.object({agentId:Ul,orchestrationId:nm}).strict(),Zm=o.z.object({enabledTools:o.z.array(Km).max(Ym.length),allowedTargets:o.z.array(Jm).max(50)}).strict(),Qm=o.z.object({agentId:Ul,orchestrationId:nm.optional(),prompt:o.z.string().trim().min(1).max(128e3),budget:Sm.optional()}).strict();o.z.object({clientRequestId:o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),input:Qm}).strict(),o.z.object({enabledTools:o.z.array(o.z.string()).max(100).optional(),allowedTargets:o.z.array(Jm).max(50).optional()}).strip(),o.z.enum(["content","actions","automations","aiSessions","decisions"]);const Xm=o.z.object({content:o.z.boolean(),actions:o.z.boolean(),automations:o.z.boolean(),aiSessions:o.z.boolean(),decisions:o.z.boolean()}).strict();Xm.strip().partial();const ep=["story_list_content","story_get_content","story_set_content","story_list_actions","story_run_action","story_list_automations","story_create_automation","story_update_automation","story_delete_automation","story_run_automation","story_list_automation_runs","story_list_ai_sessions","story_get_ai_session","story_get_ai_session_turn","story_request_decision"],tp=o.z.enum(ep),np=o.z.object({policy:Xm,revision:o.z.string().regex(/^[a-f0-9]{64}$/)}).strict(),ip=o.z.object({policy:Xm}).strict();np.extend({storyId:O,enabledTools:o.z.array(tp).max(ep.length),agentInvocation:Zm}).strict(),o.z.object({storyId:O,revision:np.shape.revision}).strict();const op=o.z.object({policy:Xm.extend({decisions:o.z.boolean().default(!1)}).strip(),revision:np.shape.revision}).strip();function ap(e){return np.parse(op.parse(e))}op.extend({storyId:O,enabledTools:o.z.array(o.z.string()).max(100),agentInvocation:o.z.unknown().optional()}).strip();const sp=o.z.object({page:o.z.number().int().min(1).max(500).default(1),pageSize:o.z.number().int().min(1).max(100).default(20)}).strict(),rp=o.z.object({totalItems:o.z.number().int().nonnegative(),nextPage:o.z.number().int().min(2).max(500).optional()}).strict();o.z.object({documents:o.z.array(o.z.object({title:Hn.shape.title,storyPath:Bn}).strict()).max(100),pagination:rp}).strict(),o.z.object({items:o.z.array(o.z.object({storyPath:Bn,path:o.z.string().trim().min(1).max(4096).optional(),revision:Fn.optional(),error:o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict().optional()}).strict()).min(1).max(20)}).strict(),o.z.object({title:Hn.shape.title,storyPath:Bn,revision:Fn,size:o.z.number().int().nonnegative()}).strict();const dp=o.z.enum(["STORY_ARCHIVED","STORY_ACTION_TARGET_REQUIRED","STORY_ACTION_TARGET_UNAVAILABLE"]);o.z.object({actions:o.z.array(o.z.object({id:Gn.shape.id,title:Gn.shape.title,promptPreview:o.z.string().max(500),promptTruncated:o.z.boolean(),executable:o.z.boolean(),unavailableReason:dp.optional()}).strict()).max(100),pagination:rp}).strict();const cp=o.z.object({actionId:Gn.shape.id,clientRequestId:o.z.string().trim().min(1).max(160)}).strict();o.z.object({session:o.z.object({instanceId:o.z.string().trim().min(1).max(120),sessionId:o.z.string().trim().min(1).max(120)}).strict()}).strict(),o.z.object({actionId:Gn.shape.id,schedule:Jn,enabled:o.z.boolean().default(!0),policy:Zn.default({maxConcurrentRuns:1,whenBusy:"skip"})}).strict(),o.z.object({automationId:o.z.string().trim().min(1).max(120),expectedUpdatedAt:o.z.string().datetime(),actionId:Gn.shape.id.optional(),schedule:Jn.optional(),enabled:o.z.boolean().optional(),policy:Zn.optional()}).strict().refine(e=>Object.keys(e).some(e=>!["automationId","expectedUpdatedAt"].includes(e)),"At least one Automation field is required."),o.z.object({automationId:o.z.string().trim().min(1).max(120),expectedUpdatedAt:o.z.string().datetime()}).strict(),o.z.object({automationId:o.z.string().trim().min(1).max(120),clientRequestId:o.z.string().trim().min(1).max(160)}).strict(),o.z.object({automationId:o.z.string().trim().min(1).max(120),page:sp.shape.page,pageSize:sp.shape.pageSize}).strict(),o.z.object({deleted:o.z.boolean()}).strict();const lp=o.z.object({id:o.z.string().trim().min(1).max(160),eventType:o.z.enum(["manual","schedule"]),status:ii,scheduledFor:o.z.string().datetime(),session:o.z.object({instanceId:o.z.string().trim().min(1).max(120),sessionId:o.z.string().trim().min(1).max(120)}).strict().optional(),error:ni.optional(),startedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),mp=o.z.object({id:o.z.string().trim().min(1).max(120),actionId:Gn.shape.id,schedule:Jn,enabled:o.z.boolean(),policy:Zn,updatedAt:o.z.string().datetime(),effectiveStatus:ai,blockedReason:ni.optional(),nextRunAt:o.z.string().datetime().optional(),activeRunCount:o.z.number().int().nonnegative(),lastRun:lp.optional()}).strict();o.z.object({automations:o.z.array(mp).max(100),pagination:rp}).strict(),o.z.object({runs:o.z.array(lp).max(100),pagination:rp}).strict();const pp=o.z.object({instanceId:o.z.string().trim().min(1).max(120),sessionId:o.z.string().trim().min(1).max(120)}).strict(),up=pp.extend({title:o.z.string().trim().max(240).optional(),agent:o.z.string().trim().min(1).max(120),status:o.z.enum(["running","waiting","idle"]),updatedAt:o.z.string().datetime()}).strict();o.z.object({sessions:o.z.array(up).max(100),pagination:rp}).strict(),pp.extend({page:sp.shape.page,pageSize:o.z.number().int().min(1).max(50).default(10)}).strict(),o.z.object({detail:yt,turnIndex:bt}).strict();const gp=o.z.object({cwd:yt.shape.cwd,modelName:o.z.string().trim().min(1).max(240).optional(),reasoningEffort:yt.shape.reasoningEffort,error:yt.shape.error}).strict(),hp=zt.pick({id:!0,status:!0,phase:!0,updatedAt:!0,completedAt:!0}).strict(),zp=zt.pick({id:!0,status:!0,phase:!0,contextCompactions:!0,startedAt:!0,updatedAt:!0,completedAt:!0}).strict();o.z.object({ref:pp,session:gp,turns:o.z.array(hp).max(50),pagination:rp}).strict(),pp.extend({turnId:o.z.string().trim().min(1).max(240),page:sp.shape.page,pageSize:o.z.number().int().min(1).max(50).default(20),maxTextChars:o.z.number().int().min(256).max(32e3).default(8e3)}).strict();const fp=o.z.array(o.z.enum(["text","summary","input","output","paths"])).max(5).optional(),yp=o.z.object({id:o.z.string().trim().min(1).max(240),truncatedFields:fp}).strict(),Ip=yp.extend({type:o.z.literal("user-message"),text:o.z.string().max(32e3),attachments:o.z.array(W).max(6).optional()}).strict(),bp=yp.extend({type:o.z.literal("ai-message"),text:o.z.string().max(32e3)}).strict(),wp=yp.extend({type:o.z.literal("activity"),activityKind:o.z.string().trim().min(1).max(120),title:o.z.string().trim().min(1).max(240),status:o.z.enum(["running","completed","failed","waiting"]).optional(),summary:o.z.string().max(32e3).optional(),input:o.z.string().max(32e3).optional(),output:o.z.string().max(32e3).optional(),paths:o.z.array(o.z.string().trim().min(1).max(4096)).max(100).optional(),exitCode:o.z.number().int().optional(),durationMs:o.z.number().int().nonnegative().optional()}).strict(),vp=o.z.discriminatedUnion("type",[Ip,bp,wp]);function xp(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data;return{list:(e,n)=>t("/api/stories"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.object({stories:yi.shape.stories,unavailableNodeIds:o.z.array(o.z.string()).default([])}).strict(),{signal:n}),get:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,fi),preview:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/content/preview?nodeId=${encodeURIComponent(n)}&storyPath=${encodeURIComponent(i)}`,Ci,{signal:o}),create:(e,n)=>t("/api/stories",fi,Ri("POST",{nodeId:e,input:Ii.parse(n)})),update:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}`,fi,Ri("PATCH",{nodeId:n,input:bi.parse(i)})),retentionSettings:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/settings?nodeId=${encodeURIComponent(n)}`,Mn),async agentToolSettings(e,n){const i=await t(`/api/stories/${encodeURIComponent(e)}/settings/agent-tools?nodeId=${encodeURIComponent(n)}`,o.z.unknown());return np.parse(ap(i))},async updateAgentToolSettings(e,n,i){const a=ip.parse({policy:i}),s=await t(`/api/stories/${encodeURIComponent(e)}/settings/agent-tools`,o.z.unknown(),Ri("PUT",{nodeId:n,input:a}));return np.parse(ap(s))},listDecisions:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/decisions?nodeId=${encodeURIComponent(n)}`,zi,{signal:i}),getDecision:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/decisions/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,ui,{signal:o}),decideStory:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/decisions/${encodeURIComponent(n)}/decide`,ui,Ri("POST",{nodeId:i,input:gi.parse(o)})),cancelDecision:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/decisions/${encodeURIComponent(n)}/cancel`,ui,Ri("POST",{nodeId:i,input:hi.parse(o)})),runAction(e,n,i,o){const a=cp.omit({actionId:!0}).parse({clientRequestId:o});return t(`/api/stories/${encodeURIComponent(e)}/actions/${encodeURIComponent(n)}/run`,Kn,Ri("POST",{nodeId:i,input:a}))},archive:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/archive`,fi,Ri("POST",{nodeId:n})),restore:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/restore`,fi,Ri("POST",{nodeId:n})),remove:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.object({deleted:o.z.boolean()}).strict(),Ri("DELETE")),listAutomations:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/automations?nodeId=${encodeURIComponent(n)}`,ri),getAutomation:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,si),createAutomation:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations`,si,Ri("POST",{nodeId:n,input:Xn.parse(i)})),createAutomationWithAction:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/with-action`,si,Ri("POST",{nodeId:n,input:ei.parse(i)})),updateAutomation:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}`,si,Ri("PATCH",{nodeId:i,input:ti.parse(o)})),removeAutomation:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,o.z.object({deleted:o.z.boolean()}).strict(),Ri("DELETE")),setAutomationEnabled:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/${o?"enable":"disable"}`,si,Ri("POST",{nodeId:i})),runAutomation:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/run`,oi,Ri("POST",{nodeId:i,input:ci.parse(o)})),automationRuns:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/runs?nodeId=${encodeURIComponent(i)}`,di),updateDocument:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/documents/${encodeURIComponent(i)}`,fi,Ri("PATCH",{nodeId:n,input:wi.parse(o)})),removeDocument:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/documents/${encodeURIComponent(i)}`,o.z.object({deleted:o.z.boolean()}).strict(),Ri("DELETE",{nodeId:n})),reorderDocuments:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/documents/order`,fi,Ri("POST",{nodeId:n,input:vi.parse(i)})),setSessionStory:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/story`,o.z.unknown(),Ri("PUT",{storyId:i}))}}o.z.object({ref:pp,turn:zp,items:o.z.array(vp).max(50),pagination:rp}).strict(),o.z.object({body:wt,timeline:ae}).strict(),o.z.object({detail:yt.strip(),turnIndex:bt.strip()}).strip(),o.z.object({body:wt.strip(),timeline:ae.strip()}).strip(),o.z.object({decisionId:o.z.string().trim().min(1).max(160),status:li}).strict();const Ap=o.z.object({agentId:Ul,orchestrationId:nm,status:o.z.enum(["available","missing-reference"])}).strict(),kp=o.z.object({storyId:O,revision:Ll,entries:o.z.array(Ap)}).strict(),Sp=o.z.object({expectedRevision:Ll,entries:o.z.array(o.z.object({agentId:Ul,orchestrationId:nm.optional()}).strict()).max(50)}).strict();o.z.enum(["STORY_AGENT_ENTRY_STORY_NOT_FOUND","STORY_AGENT_ENTRY_AGENT_NOT_FOUND","STORY_AGENT_ENTRY_ORCHESTRATION_NOT_FOUND","STORY_AGENT_ENTRY_ORCHESTRATION_MISMATCH","STORY_AGENT_ENTRY_REVISION_CONFLICT"]);const Cp=Ap.strip(),jp=kp.strip().extend({entries:o.z.array(Cp)});function Rp(e){return jp.parse(e)}function Tp(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data;return{async list(e,n){return i=await t("/api/agents"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.unknown(),{signal:n}),Zl.parse(i);var i},get:async(e,n,i)=>Xl(await t(`/api/agents/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),create:async(e,n)=>Xl(await t("/api/agents",o.z.unknown(),Ri("POST",{nodeId:e,input:Hl.parse(n)}))),update:async(e,n,i)=>Xl(await t(`/api/agents/${encodeURIComponent(e)}`,o.z.unknown(),Ri("PATCH",{nodeId:n,input:Vl.parse(i)}))),remove(e,n,i={}){const o=new URLSearchParams({nodeId:n});return i.referencingOrchestrations&&o.set("referencingOrchestrations",i.referencingOrchestrations),t(`/api/agents/${encodeURIComponent(e)}?${o.toString()}`,Gl,{method:"DELETE"})},async listOrchestrations(e,n){return i=await t("/api/agent-orchestrations"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.unknown(),{signal:n}),gm.parse(i);var i},getOrchestration:async(e,n,i)=>zm(await t(`/api/agent-orchestrations/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),createOrchestration:async(e,n)=>zm(await t("/api/agent-orchestrations",o.z.unknown(),Ri("POST",{nodeId:e,input:sm.parse(n)}))),updateOrchestration:async(e,n,i)=>zm(await t(`/api/agent-orchestrations/${encodeURIComponent(e)}`,o.z.unknown(),Ri("PATCH",{nodeId:n,input:rm.parse(i)}))),removeOrchestration:(e,n)=>t(`/api/agent-orchestrations/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,dm,{method:"DELETE"}),storyEntries:async(e,n,i)=>Rp(await t(`/api/stories/${encodeURIComponent(e)}/agent-entries?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),updateStoryEntries:async(e,n,i)=>Rp(await t(`/api/stories/${encodeURIComponent(e)}/agent-entries`,o.z.unknown(),Ri("PUT",{nodeId:n,input:Sp.parse(i)}))),async listRuns(e,n){const i=await t("/api/agent-runs"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.object({runs:o.z.array(o.z.object({nodeId:o.z.string(),run:o.z.unknown()}).strip()),unavailableNodeIds:o.z.array(o.z.string()).default([])}).strip(),{signal:n});return{unavailableNodeIds:i.unavailableNodeIds,runs:i.runs.map(({nodeId:e,run:t})=>({nodeId:e,run:Wm(t)}))}},getRun:async(e,n,i)=>Wm(await t(`/api/agent-runs/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),async getRunMember(e,n,i,a){return s=await t(`/api/agent-runs/${encodeURIComponent(e)}/members/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,o.z.unknown(),{signal:a}),Bm.parse(s);var s},createRun:async(e,n)=>Wm(await t("/api/agent-runs",o.z.unknown(),Ri("POST",{nodeId:e,input:Um.parse(n)}))),createManualRun:async(e,n)=>Wm(await t("/api/agent-runs/manual",o.z.unknown(),Ri("POST",{nodeId:e,input:Lm.parse(n)}))),cancelRun:async(e,n,i={})=>Wm(await t(`/api/agent-runs/${encodeURIComponent(e)}/cancel`,o.z.unknown(),Ri("POST",{nodeId:n,input:Dm.parse(i)})))}}function $p(e){const t="ai-session"===e.sessionKind?"ai-sessions":"apps/sessions";return`/instances/${encodeURIComponent(e.instanceId)}/api/${t}/${encodeURIComponent(e.sessionId)}/repository`}function Ep(e,t){const n=`/api/controlled-instances/${encodeURIComponent(e.instanceId)}/repository/${t}`;return e.cwdFolderId?`${n}?${new URLSearchParams({cwdFolderId:e.cwdFolderId})}`:n}function Pp(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).strict())(n),i)).data,n=(e,t)=>async n=>{if(!function(e){return Boolean(e&&"object"==typeof e&&404===e.status)}(n)||!e.legacySession)throw n;return t(e.legacySession)};return{async worktrees(e,i){try{return await t(Ep(e,"worktrees"),mn,{signal:i?.signal})}catch(o){return n(e,e=>t(`${$p(e)}/worktrees`,mn,{signal:i?.signal}))(o)}},async createWorktree(e,i,o){const a=Rn.parse(i);try{return await t(Ep(e,"worktrees"),$n,Ri("POST",a,o?.signal))}catch(i){return n(e,e=>t(`${$p(e)}/worktrees`,$n,Ri("POST",a,o?.signal)))(i)}},async removeWorktree(e,i,o){const a=Tn.parse(i);try{return await t(Ep(e,"worktrees/remove"),En,Ri("POST",a,o?.signal))}catch(i){return n(e,e=>{if("ai-session"!==e.sessionKind)throw new Error("Worktrees can only be removed from an AI session repository context.");return t(`${$p(e)}/worktrees/remove`,En,Ri("POST",a,o?.signal))})(i)}},async moveWorktreeToMainPreflight(e,n,i){const o=On.parse(n);return await t(Ep(e,"worktrees/move-to-main/preflight"),Nn,Ri("POST",o,i?.signal))},async moveWorktreeToMain(e,n,i){const o=_n.parse(n);return t(Ep(e,"worktrees/move-to-main"),Un,Ri("POST",o,i?.signal))},async branches(e,i){try{return await t(Ep(e,"branches"),kn,{signal:i?.signal})}catch(o){return n(e,e=>t(`${$p(e)}/branches`,kn,{signal:i?.signal}))(o)}}}}const Op=o.z.object({deleted:o.z.boolean()}).strict(),Np=o.z.array(wd),_p=o.z.array(Hd),Up=o.z.array(Gd),Lp=o.z.object({id:o.z.string().trim().min(1),ownedBy:o.z.string().optional()}).passthrough(),Dp=o.z.object({models:o.z.array(Lp),latencyMs:o.z.number()}).passthrough(),qp=o.z.object({success:o.z.literal(!0),latencyMs:o.z.number()}).passthrough(),Mp=o.z.object({catalog:Bd,status:Fd}).strict(),Bp=xd.extend({referenceCount:o.z.number().int().min(0).optional()}).passthrough();function Fp(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/models/${encodeURIComponent(e)}`,i=(e,t)=>`/api/nodes/${encodeURIComponent(e)}/models${void 0===t?"":`/${encodeURIComponent(t)}`}`;return{listProjects:e=>t("/api/projects",Np,{signal:e}),getProject:(e,n)=>t(`/api/projects/${encodeURIComponent(e)}`,wd,{signal:n}),createProject:e=>t("/api/projects",wd,Ri("POST",e)),updateProject:(e,n)=>t(`/api/projects/${encodeURIComponent(e)}`,wd,Ri("PATCH",n)),removeProject:e=>t(`/api/projects/${encodeURIComponent(e)}`,Op,Ri("DELETE")),listModels(e={}){const n=e.progressive?"?progressive=true":"";return t(`/api/models${n}`,Cd,{signal:e.signal})},getModel:(e,i)=>t(n(e),xd,{signal:i}),createModel:e=>t("/api/models",xd,Ri("POST",e)),copyModel:(e,i)=>t(`${n(e)}/copy`,xd,Ri("POST",i)),discoverModels:e=>t("/api/models/discover",Dp,Ri("POST",e)),testModel:e=>t("/api/models/test",qp,Ri("POST",e)),reorderModels:e=>t("/api/models/reorder",o.z.array(xd),Ri("POST",{ids:[...e]})),updateModel:(e,i)=>t(n(e),Td,Ri("PATCH",i)),syncModel:e=>t(`${n(e)}/sync`,Td,Ri("POST",{})),mergeModel:(e,i)=>t(`${n(e)}/merge`,Ed,Ri("POST",i)),removeModel:e=>t(n(e),Op,Ri("DELETE")),createModelOnNode:(e,n)=>t(i(e),Bp,Ri("POST",n)),discoverModelsOnNode:(e,n)=>t(`${i(e)}/discover`,Dp,Ri("POST",n)),testModelOnNode:(e,n)=>t(`${i(e)}/test`,qp,Ri("POST",n)),updateModelOnNode:(e,n,o)=>t(i(e,n),Bp,Ri("PATCH",o)),removeModelOnNode:(e,n)=>t(i(e,n),Op,Ri("DELETE")),marketCatalog:e=>t("/api/market/catalog",Mp,{signal:e}),refreshMarketCatalog:()=>t("/api/market/refresh",Mp,Ri("POST",{})),imageOptions:e=>t("/api/image-options",Up,{signal:e}),listImages:e=>t("/api/images",_p,{signal:e}),getImage:(e,n)=>t(`/api/images/${encodeURIComponent(e)}`,Hd,{signal:n}),createImage:e=>t("/api/images",Hd,Ri("POST",e)),updateImage:(e,n)=>t(`/api/images/${encodeURIComponent(e)}`,Hd,Ri("PATCH",n)),removeImage:e=>t(`/api/images/${encodeURIComponent(e)}`,Op,Ri("DELETE"))}}const Hp=o.z.object({id:o.z.string().trim().min(1),status:o.z.enum(["online","offline"]),checkedAt:o.z.string(),agent:o.z.record(o.z.string(),o.z.unknown()).optional(),error:o.z.string().optional()}).passthrough(),Vp=o.z.object({deleted:o.z.boolean(),revoke:o.z.object({mode:o.z.enum(["not-proxied","revoked","forced"]),orphanRisk:o.z.boolean()}).strict()}).strict(),Gp=o.z.object({data:o.z.array(tc),meta:o.z.object({nodeErrors:o.z.array(cl).default([]),nodeStates:o.z.array(ll).default([])}).passthrough().optional()}).passthrough(),Wp=o.z.object({id:o.z.string().trim().min(1),joinToken:o.z.string().trim().min(1),expiresAt:o.z.string()}).strict(),Yp=ec.transform(e=>{const{secret:t,...n}=e.auth;return{...e,auth:n}});function Kp(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/nodes/${encodeURIComponent(e)}`,i=(e,t)=>`${n(e)}/runtimes${void 0===t?"":`/${encodeURIComponent(t)}`}`,a=(e,t)=>`${n(e)}/local-folders${void 0===t?"":`/${encodeURIComponent(t)}`}`;return{createNode:e=>t("/api/nodes",Yp,Ri("POST",e)),updateNode:(e,i)=>t(n(e),Yp,Ri("PATCH",i)),removeNode(e,i={}){const o=i.force?"?force=true":"";return t(`${n(e)}${o}`,Vp,Ri("DELETE"))},checkNode:e=>t(`${n(e)}/check`,Hp,Ri("POST",{})),syncLocalNode:()=>t("/api/nodes/local/sync",Yp,Ri("POST",{})),listFolders:(e,n)=>t(a(e),o.z.array(pd),{signal:n}),listFolderPlaces:(e,i)=>t(`${n(e)}/folders/places`,o.z.array(fc),{signal:i}),listFolderTree(e,i={},a){const s=new URLSearchParams;return i.path&&s.set("path",i.path),void 0!==i.depth&&s.set("depth",String(i.depth)),t(`${n(e)}/folders/tree${s.size?`?${s}`:""}`,o.z.array(zc),{signal:a})},createFolder:(e,n)=>t(a(e),pd,Ri("POST",n)),updateFolder:(e,n,i)=>t(a(e,n),pd,Ri("PATCH",i)),removeFolder:(e,n)=>t(a(e,n),uc,Ri("DELETE")),listAllRuntimes(t={}){const n=t.progressive?"?progressive=true":"";return e.request(`/api/node-runtimes${n}`,Gp,{signal:t.signal})},listRuntimes:(e,n)=>t(i(e),o.z.array(tc),{signal:n}),createRuntime:(e,n)=>t(i(e),tc,Ri("POST",n)),updateRuntime:(e,n,o)=>t(i(e,n),tc,Ri("PATCH",o)),removeRuntime:(e,n)=>t(i(e,n),uc,Ri("DELETE")),checkRuntime:(e,n)=>t(`${i(e,n)}/check`,tc,Ri("POST",{})),listDockerImages:(e,i)=>t(`${n(e)}/docker/images`,o.z.array(gc),{signal:i}),imageOptions:(e,i)=>t(`${n(e)}/image-options`,o.z.array(hc),{signal:i}),getExternalListener:(e,i)=>t(`${n(e)}/settings/external-listener`,oc,{signal:i}),updateExternalListener(e,i){const o=ac.parse(i);return t(`${n(e)}/settings/external-listener`,oc,Ri("PATCH",o))},getModelRelay:(e,i)=>t(`${n(e)}/settings/model-relay`,rc,{signal:i}),updateModelRelay(e,i){const o=dc.parse(i);return t(`${n(e)}/settings/model-relay`,rc,Ri("PATCH",o))},updateJobs:(e,i)=>t(`${n(e)}/updates/jobs`,o.z.array(ad),{signal:i}),checkUpdate(e,i={}){const o=id.parse(i);return t(`${n(e)}/updates/check`,od,Ri("POST",o))},applyUpdate(e,i){const o=sd.parse(i);return t(`${n(e)}/updates/apply`,ad,Ri("POST",o))},createPairingInvite:(e,i={})=>t(`${n(e)}/pairing/invites`,cc,Ri("POST",i)),listControlPlanePairings:(e,i)=>t(`${n(e)}/control-plane-pairings`,o.z.array(lc),{signal:i}),removeControlPlanePairing:(e,i)=>t(`${n(e)}/control-plane-pairings/${encodeURIComponent(i)}`,uc,Ri("DELETE")),listControlPlaneConnections:(e,i)=>t(`${n(e)}/control-plane-connections`,o.z.array(mc),{signal:i}),createControlPlaneConnection:(e,i)=>t(`${n(e)}/control-plane-connections`,pc,Ri("POST",i)),removeControlPlaneConnection:(e,i)=>t(`${n(e)}/control-plane-connections/${encodeURIComponent(i)}`,uc,Ri("DELETE")),createJoinInvite:(e={})=>t("/api/node-join/invites",Wp,Ri("POST",e)),joinInviteStatus:(e,n)=>t(`/api/node-join/invites/${encodeURIComponent(e)}`,Qd,{signal:n}),completeJoin:e=>t("/api/node-join/complete",Yp,Ri("POST",e))}}const Jp=o.z.object({deleted:o.z.boolean()}).strict(),Zp=o.z.object({revoked:o.z.boolean()}).strict(),Qp=o.z.object({credentialId:o.z.string().trim().min(1).max(120)}).strict();function Xp(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/git-credentials/${encodeURIComponent(e)}`,i=e=>`/api/controlled-instances/${encodeURIComponent(e)}/git-credential-assignments`;return{listCredentials:e=>t("/api/git-credentials",ks,{signal:e}),getCredential:(e,i)=>t(n(e),ws,{signal:i}),createCredential:e=>t("/api/git-credentials",ws,Ri("POST",e)),updateCredential:(e,i)=>t(n(e),ws,Ri("PATCH",i)),removeCredential:e=>t(n(e),Jp,Ri("DELETE")),listInstanceAssignments:(e,n)=>t(i(e),o.z.array(Ss),{signal:n}),assignToInstance(e,n){const o=Qp.parse(n);return t(i(e),Ss,Ri("POST",o))},unassignFromInstance:(e,n)=>t(`${i(e)}/${encodeURIComponent(n)}`,Zp,Ri("DELETE"))}}const eu=o.z.object({deleted:o.z.boolean(),templateId:o.z.string().trim().min(1).max(120)}).strict();function tu(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/nodes/${encodeURIComponent(e)}/environment-templates`;return{listForNode:(e,i)=>t(n(e),o.z.array(Pr),{signal:i}),get:(e,i,o)=>t(`${n(e)}/${encodeURIComponent(i)}`,Pr,{signal:o}),createFromInstance:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/environment-templates`,Pr,Ri("POST",n)),remove:(e,i)=>t(`${n(e)}/${encodeURIComponent(i)}`,eu,Ri("DELETE"))}}const nu=Oc.omit({token:!0}).extend({tokenSet:o.z.boolean().optional()}).strip(),iu=o.z.object({running:o.z.boolean(),bridges:o.z.array(o.z.object({id:o.z.string(),channel:Pc,name:o.z.string(),running:o.z.boolean(),tokenSet:o.z.boolean(),defaultChatId:o.z.string().optional(),lastUpdateId:o.z.number().optional(),error:o.z.string().optional()}).strip()).default([])}).strip();function ou(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/chat-gateway/bridges/${encodeURIComponent(e)}`;return{status:e=>t("/api/chat-gateway/status",iu,{signal:e}),listBridges:e=>t("/api/chat-gateway/bridges",o.z.array(nu),{signal:e}),createBridge:e=>t("/api/chat-gateway/bridges",nu,Ri("POST",e)),updateBridge:(e,i)=>t(n(e),nu,Ri("PATCH",i)),startBridge:e=>t(`${n(e)}/start`,iu,Ri("POST",{})),stopBridge:e=>t(`${n(e)}/stop`,iu,Ri("POST",{})),removeBridge:e=>t(n(e),o.z.object({deleted:o.z.boolean()}).strict(),Ri("DELETE")),listSessions:e=>t("/api/chat/sessions",o.z.array(Nc),{signal:e}),getSession:(e,n)=>t(`/api/chat/sessions/${encodeURIComponent(e)}`,Nc,{signal:n})}}const au=o.z.object({protocolVersion:o.z.string(),build:o.z.record(o.z.string(),o.z.unknown()).optional(),storage:o.z.record(o.z.string(),o.z.string())}).passthrough(),su=o.z.object({controlPlaneId:o.z.string(),algorithm:o.z.literal("Ed25519"),publicKey:o.z.string(),fingerprint:o.z.string()}).strict(),ru=o.z.object({version:o.z.literal(1),serviceOrigin:o.z.string(),status:o.z.enum(["unbound","pending-claim","active","pending-revocation","clone-conflict"]),remoteAccessEnabled:o.z.boolean(),accountId:o.z.string().optional(),bindingId:o.z.string().optional(),bindingRevision:o.z.number().int().optional(),updatedAt:o.z.string(),identity:su,hasBackgroundCredential:o.z.boolean(),remoteResult:o.z.enum(["confirmed","unknown"]).optional()}).strict(),du=o.z.object({challengeCode:o.z.string(),authorizationUrl:o.z.string(),payload:o.z.object({controlPlaneId:o.z.string(),publicKeyFingerprint:o.z.string(),expiresAt:o.z.string()}).strict(),signature:o.z.string()}).strict(),cu=o.z.object({bindingId:o.z.string(),activeHttp:o.z.number().int().nonnegative(),activeStreams:o.z.number().int().nonnegative(),activeWebSockets:o.z.number().int().nonnegative()}).strict(),lu=o.z.record(o.z.string(),o.z.unknown());function mu(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/control-plane-proxy/pending-claims/${encodeURIComponent(e)}`;return{status:e=>t("/api/control-plane/status",au,{signal:e}),getSettings:e=>t("/api/control-plane/settings",Lc,{signal:e}),updateSettings(e){const n=Dc.parse(e);return t("/api/control-plane/settings",Lc,Ri("PATCH",n))},async exportDiagnosticLogs(){if(!e.requestBinary)throw Ti();return e.requestBinary("/api/control-plane/diagnostic-logs/export")},cloudConnectivity:e=>t("/api/cloud-connectivity",ru,{signal:e}),createCloudChallenge:()=>t("/api/cloud-connectivity/challenges",du,Ri("POST",{})),setCloudRemoteAccess:e=>t("/api/cloud-connectivity/remote-access",ru,Ri("POST",{enabled:e})),disconnectCloud:()=>t("/api/cloud-connectivity/disconnect",ru,Ri("POST",{})),proxyInvites:e=>t("/api/control-plane-proxy/invites",o.z.array(Qa),{signal:e}),createProxyInvite(e){const n=Xa.parse(e);return t("/api/control-plane-proxy/invites",es,Ri("POST",n))},revokeProxyInvite:e=>t((e=>`/api/control-plane-proxy/invites/${encodeURIComponent(e)}`)(e),Qa,Ri("DELETE")),proxyBindings:e=>t("/api/control-plane-proxy/bindings",o.z.array(ns),{signal:e}),revokeProxyBinding:e=>t((e=>`/api/control-plane-proxy/bindings/${encodeURIComponent(e)}`)(e),ns,Ri("DELETE")),proxyDiagnostics:e=>t("/api/control-plane-proxy/diagnostics",o.z.array(cu),{signal:e}),pendingProxyClaims:e=>t("/api/control-plane-proxy/pending-claims",o.z.array(ds),{signal:e}),resumeProxyClaim:e=>t(`${n(e)}/resume`,lu,Ri("POST",{})),cancelProxyClaim(e,i={}){const o=i.force?"?force=true":"";return t(`${n(e)}${o}`,lu,Ri("DELETE"))}}}const pu=o.z.enum(["instance.delete","node.remove","node.update.apply","node.external-listener.set","user.access.set","user.role.update","user.role.remove","identity-provider.update","identity-provider.remove","git-credential.assign"]),uu=o.z.object({field:o.z.string(),value:o.z.string()}),gu=o.z.object({id:o.z.string(),operation:pu,targetId:o.z.string(),details:o.z.array(uu).optional(),createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime()}),hu=o.z.object({id:o.z.string(),status:o.z.enum(["pending","approved","denied"]),expiresAt:o.z.string().datetime()}),zu=hu.extend({kind:o.z.literal("operation-approval")}),fu=o.z.object({revision:o.z.number().int(),requests:o.z.array(gu)});o.z.object({request:gu,status:o.z.enum(["pending","approved","denied","expired","consumed","cancelled"]),revision:o.z.number().int()});const yu=e=>o.z.object({data:e}).passthrough(),Iu=o.z.object({supported:o.z.literal(!0)});function bu(e){return{support:async()=>(await e.request("/api/operation-approvals/support",yu(Iu))).data,status:async t=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}/status`,yu(hu))).data,cancel:async t=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}`,yu(o.z.object({cancelled:o.z.boolean()})),{method:"DELETE"})).data,snapshot:async()=>(await e.request("/api/operation-approvals",yu(fu))).data,decide:async(t,n)=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}/decision`,yu(o.z.object({id:o.z.string(),status:o.z.enum(["approved","denied"])})),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({decision:n})})).data,deleteInstance:async(t,n)=>(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,yu(Rr),{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify(Cr.parse(n))})).data,removeNode:async(t,n)=>(await e.request(`/api/nodes/${encodeURIComponent(t)}${n?"?force=true":""}`,yu(Vp),{method:"DELETE"})).data}}function wu(e){const t={request:(t,n,i,a)=>e.request(t,function(e){return o.z.unknown().transform((t,n)=>{const i=lo(e,t);if(i.success)return i.data;for(const e of i.error.issues)n.addIssue({...e});return o.z.NEVER})}(n),i,a),...e.requestBinary?{requestBinary:(t,n)=>e.requestBinary(t,n)}:{}};return{approvals:bu(t),auth:ka(t),users:Ca(t),aiSessions:_i(t),appSessions:to(t),appProfiles:so(t),apps:Qc(t),browser:co(t),resources:jl(t),triggers:Pl(t),stories:xp(t),agents:Tp(t),repository:Pp(t),catalog:Fp(t),nodeAdmin:Kp(t),gitCredentials:Xp(t),environmentTemplates:tu(t),chatGateway:ou(t),admin:mu(t)}}const vu=o.z.object({nodeId:o.z.string().optional(),instanceId:o.z.string().optional()}).passthrough(),xu=o.z.object({v:o.z.literal(1),id:o.z.string().min(1),seq:o.z.number().finite(),type:o.z.string().min(1),topic:o.z.string().min(1),createdAt:o.z.string().datetime(),payload:o.z.unknown(),replay:o.z.literal(!0).optional(),scope:vu.optional()}).passthrough(),Au=o.z.object({v:o.z.literal("2026-08-25"),id:o.z.string().min(1),type:o.z.string().min(1),createdAt:o.z.string().datetime(),payload:o.z.unknown(),topic:o.z.string().min(1).optional(),replay:o.z.literal(!0).optional(),scope:vu.optional()}).passthrough(),ku=o.z.discriminatedUnion("v",[xu,Au]);o.z.object({v:o.z.literal(1),type:o.z.literal("ping"),sentAt:o.z.string().datetime()}).strict(),o.z.object({v:o.z.literal(1),type:o.z.literal("pong"),sentAt:o.z.string().datetime(),receivedAt:o.z.string().datetime()}).strict(),o.z.object({replaySince:o.z.string().datetime().optional(),messageDeltas:o.z.object({allInstances:o.z.boolean().default(!1),instanceIds:o.z.array(o.z.string().trim().min(1).max(160)).max(1e3).default([])}).default({allInstances:!1,instanceIds:[]}),timelineAllSessions:o.z.boolean().default(!1),timelineSessions:o.z.array(o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(120)})).max(1e3).default([])});const Su=o.z.enum(["ai.sessions","app.sessions"]),Cu=o.z.object({topic:Su,instanceId:o.z.string().trim().min(1).max(160),streamId:o.z.string().trim().min(1).max(240),latestRevision:o.z.number().int().min(0),earliestRetainedRevision:o.z.number().int().min(0)}).strict(),ju=o.z.object({protocolVersion:o.z.literal(1),streams:o.z.array(Cu)}).strict();function Ru(e,n){try{const i=JSON.parse(t.readFileSync(e,"utf8"));if(n&&i.name!==n)return;return"string"==typeof i.version&&i.version.trim()?i.version.trim():void 0}catch{return}}function Tu(e){if(e)try{return i.dirname(t.realpathSync(e))}catch{return}}const $u=function(e,t=process.env,n=e){const o=t.TASK_HANDOFF_VERSION?.trim();if(o)return o;const a=n.split("/").at(-1),s=process.argv[1]?i.resolve(process.argv[1]):void 0,r=s?i.dirname(s):void 0,d=[Tu(s),r,process.cwd()].filter(e=>Boolean(e));for(const t of new Set(d)){let n=t;for(;;){const t=Ru(i.join(n,"package.json"),e);if(t)return t;const o=i.dirname(n);if(o===n)break;n=o}}let c;for(const e of new Set(d)){let t=e;for(;;){if(a){const e=Ru(i.join(t,"packages",a,"package.json"),n);if(e)return e}c||=Ru(i.join(t,"package.json"));const e=i.dirname(t);if(e===t)break;t=e}}return c||"unknown"}("@task-handoff/thctl");function Eu(){const e=process.argv[1]?i.resolve(process.argv[1]):void 0;if(e){let n;try{n=i.dirname(t.realpathSync(e))}catch{n=i.dirname(e)}for(let e=0;e<8;e+=1){try{const e=JSON.parse(t.readFileSync(i.join(n,"package.json"),"utf8"));if("@task-handoff/thctl"===e.name&&"string"==typeof e.version&&e.version.trim())return e.version.trim()}catch{}const e=i.dirname(n);if(e===n)break;n=e}}return $u}function Pu(){const e="darwin"===process.platform||"linux"===process.platform||"win32"===process.platform?process.platform:"linux";return{name:n.hostname()||"thctl",platform:e,version:$u}}async function Ou(e,t){try{await e.client.approvals.support()}catch(e){throw new h("CLI_APPROVAL_UNAVAILABLE","Approval protocol is unavailable; the protected request was not sent.",u,{cause:e instanceof Error?e.message:String(e)})}return t()}async function Nu(e,t,n,i){const o=Date.parse(e.expiresAt);if(!Number.isFinite(o))throw new h("CLI_APPROVAL_INVALID","The approval deadline is invalid.",11);const a=Math.min(o,Date.now()+3e5);t.notify?.(e.id);try{for(;;){if(t.signal.aborted)throw new h("CLI_CANCELLED","The operation was cancelled.",g);if(Date.now()>=a)throw new h("CLI_APPROVAL_EXPIRED","The approval expired without a decision.",g);const e=await n().catch(e=>{if(e instanceof h&&"OPERATION_APPROVAL_NOT_FOUND"===e.code)throw new h("CLI_APPROVAL_EXPIRED","The approval request expired or was cancelled.",g);throw e});if("denied"===e.status)throw new h("CLI_APPROVAL_DENIED","The operation was denied.",6);if("approved"===e.status)break;await t.sleep(Math.min(1e3,Math.max(0,a-Date.now())))}if(t.signal.aborted)throw new h("CLI_CANCELLED","The operation was cancelled.",g)}catch(e){throw t.signal.aborted&&await i().catch(()=>{}),e}}const _u=Buffer.from("302a300506032b6570032100","hex"),Uu=o.z.object({error:o.z.object({code:o.z.string().min(1),message:o.z.string().min(1),details:o.z.record(o.z.string(),o.z.unknown()).optional(),retryable:o.z.boolean().optional()}).loose()}).loose();function Lu(e,t){if(!t.startsWith("/")||t.startsWith("//"))throw I("Control Plane routes must be same-origin absolute paths.",{route:t});const n=new URL(t,e);if(n.origin!==e)throw I("A thctl request cannot leave its verified Control Plane origin.",{route:t,origin:e});return n.toString()}function Du(e,t=Date.now()){const{payload:n,signature:i}=e.data,o=Date.parse(n.issuedAt),s=Date.parse(n.expiresAt);if(o>t+6e4||s<=t||s<=o)throw new h("CLI_IDENTITY_STALE","The Control Plane identity document is expired or its clock is invalid.",p);const r=Buffer.from(n.publicKey.value,"base64url");if(`sha256:${a.createHash("sha256").update(r).digest("base64url")}`!==n.publicKey.fingerprint)throw new h("CLI_IDENTITY_FINGERPRINT_INVALID","The Control Plane public key fingerprint is invalid.",p);let d;try{d=a.createPublicKey({key:Buffer.concat([_u,r]),format:"der",type:"spki"})}catch{throw new h("CLI_IDENTITY_KEY_INVALID","The Control Plane public key is not a valid Ed25519 key.",p)}const c=Buffer.from((l=n,JSON.stringify(Vo.parse(l))),"utf8");var l;if(!a.verify(null,c,d,Buffer.from(i,"base64url")))throw new h("CLI_IDENTITY_SIGNATURE_INVALID","The Control Plane identity signature is invalid.",p);return n}function qu(e){const t={async request(n,i,a={}){let s,r=!1;for(;;){const d=new Headers(a.headers);d.set("accept","application/json"),s&&d.set("x-task-handoff-approval-id",s);const c=e.sessionToken?.();let l;c&&d.set("authorization",`Bearer ${c}`);try{l=await e.fetchImpl(Lu(e.origin,n),{...a,headers:d,redirect:"error"})}catch(t){if(t instanceof h)throw t;throw b(`Could not reach ${e.origin}: ${t instanceof Error?t.message:String(t)}`,{origin:e.origin})}const m=await l.text().catch(()=>"");let p;if(m)try{p=JSON.parse(m)}catch{throw I("The Control Plane returned a non-JSON response.",{status:l.status,path:n})}if(!l.ok){const t=Uu.safeParse(p);if(401===l.status&&(e.onUnauthorized?.(),!r&&e.refreshCredential&&await e.refreshCredential())){r=!0;continue}if(!t.success){const e=(a.method??"GET").toUpperCase();if(404===l.status||405===l.status||501===l.status)throw y(l.status,e,n);throw x(l.status,`HTTP_${l.status}`,`Control Plane request failed with HTTP ${l.status}.`,{path:n})}const{code:i,message:o,details:s,retryable:d}=t.data.error;throw x(l.status,i,o,{...s,...void 0===d?{}:{retryable:d},path:n})}if(202===l.status&&"GET"!==(a.method??"GET").toUpperCase()){const i=o.z.object({data:zu}).safeParse(p);if(i.success){if(s||!e.approvalWait)throw I("The Control Plane returned an unsupported or repeated approval request.",{path:n});const a=i.data.data,r=`/api/operation-approvals/${encodeURIComponent(a.id)}`;await Nu(a,e.approvalWait,async()=>(await t.request(`${r}/status`,o.z.object({data:hu}))).data,()=>t.request(r,o.z.object({data:o.z.object({cancelled:o.z.boolean()})}),{method:"DELETE"})),s=a.id;continue}}const u=i.safeParse(p);if(!u.success)throw I("The Control Plane response does not match the expected protocol schema.",{path:n,issues:u.error.issues.slice(0,5).map(e=>({path:e.path.join("."),code:e.code,message:e.message}))});return u.data}},async requestBinary(t,n={}){const i=new Headers(n.headers);i.set("accept","application/octet-stream, application/gzip, */*");const o=e.sessionToken?.();let a;o&&i.set("authorization",`Bearer ${o}`);try{a=await e.fetchImpl(Lu(e.origin,t),{...n,headers:i,redirect:"error"})}catch(t){if(t instanceof h)throw t;throw b(`Could not reach ${e.origin}: ${t instanceof Error?t.message:String(t)}`,{origin:e.origin})}if(!a.ok){const i=await a.text().catch(()=>"");let o;if(i)try{o=JSON.parse(i)}catch{}401===a.status&&e.onUnauthorized?.();const s=Uu.safeParse(o);if(s.success){const{code:e,message:n,details:i,retryable:o}=s.data.error;throw x(a.status,e,n,{...i,...void 0===o?{}:{retryable:o},path:t})}if(404===a.status||405===a.status||501===a.status)throw y(a.status,(n.method??"GET").toUpperCase(),t);throw x(a.status,`HTTP_${a.status}`,`Control Plane request failed with HTTP ${a.status}.`,{path:t})}const s=a.headers.get("content-disposition")??"",r=/filename\*?=(?:UTF-8''|")?([^";]+)/i.exec(s)?.[1];return{body:new Uint8Array(await a.arrayBuffer()),...r?{filename:decodeURIComponent(r)}:{},...a.headers.get("content-type")?{contentType:a.headers.get("content-type")}:{}}}};return t}async function Mu(e,t){const n=wu(qu({origin:e,fetchImpl:t}));let i;try{i=await n.auth.identity()}catch(t){if(t instanceof h&&(7===t.exitCode||"CLI_ROUTE_MISSING"===t.code))throw new h("CLI_IDENTITY_UNAVAILABLE",`${e} did not return a Control Plane identity document. Check the address and that the Control Plane is running.`,p);throw t}return{payload:Du(i),origin:e}}function Bu(e){try{const t=new URL(e);return"http:"===t.protocol&&("127.0.0.1"===t.hostname||"localhost"===t.hostname||"[::1]"===t.hostname)}catch{return!1}}async function Fu(e){const{profile:t,identity:n,fetchImpl:i,secrets:o}=e;if(!Ho(n.payload.capabilities))return;if(!Bu(t.origin))return;const a=wu(qu({origin:t.origin,fetchImpl:i})),s=await a.auth.cliLocalSession({client:Pu()}),r={sessionToken:s.sessionToken,sessionId:s.session.id,expiresAt:s.session.expiresAt,mode:"local-trust",savedAt:(new Date).toISOString()};return o.write(t.label,r),r}async function Hu(e){const{store:t,profile:n,fetchImpl:i}=e,o=await Mu(n.origin,i);!function(e,t){const{payload:n}=t;if(e.origin!==t.origin)throw new h("CLI_PROFILE_ORIGIN_CHANGED",`Profile \`${e.label}\` points at ${e.origin}, not ${t.origin}.`,p);if(e.controlPlaneId!==n.controlPlaneId||e.fingerprint!==n.publicKey.fingerprint)throw new h("CLI_IDENTITY_CHANGED",`The Control Plane identity for \`${e.label}\` changed. Run \`thctl profile trust ${e.label} --yes\` after verifying the new fingerprint ${n.publicKey.fingerprint}.`,p,{profile:e.label,expectedControlPlaneId:e.controlPlaneId,expectedFingerprint:e.fingerprint,actualControlPlaneId:n.controlPlaneId,actualFingerprint:n.publicKey.fingerprint})}(n,o),function(e,t){const n=t.payload.capabilities;if(!(function(e){return!0===Bo(e)?.cliSessions}(n)||Ho(n)&&Bu(e.origin))){if(Ho(n))throw new h("CLI_LOCAL_SESSION_UNAVAILABLE_REMOTE",`${e.origin} runs with Control Plane authentication disabled and only issues CLI sessions to clients on the same machine. Run thctl on that machine, or enable user management to sign in with \`thctl login\`.`,u,{profile:e.label,origin:e.origin,protocolVersion:t.payload.protocolVersion});throw new h("CLI_CAPABILITY_MISSING",`The Control Plane at ${e.origin} does not declare the \`cliSessions\` capability. Upgrade it to the release that ships the Control Plane CLI endpoints.`,u,{profile:e.label,origin:e.origin,protocolVersion:t.payload.protocolVersion})}}(n,o);const a=t.secrets();let s=!1===e.withSession?void 0:a.read(n.label);s?.expiresAt&&Date.parse(s.expiresAt)<=Date.now()&&(a.remove(n.label),s=void 0);let r=!1;if(!1===e.withSession||s||(s=await Fu({profile:n,identity:o,fetchImpl:i,secrets:a}),r=Boolean(s)),!1!==e.withSession&&!s)throw new h("CLI_NOT_AUTHENTICATED",`No CLI session stored for \`${n.label}\`. Run \`thctl login\`.`,5,{profile:n.label});const d="local-trust"===s?.mode,c=qu({origin:n.origin,fetchImpl:i,approvalWait:e.approvalWait,sessionToken:s?()=>a.read(n.label)?.sessionToken:void 0,onUnauthorized:s?()=>a.remove(n.label):void 0,...d?{refreshCredential:async()=>{a.remove(n.label);const e=await Fu({profile:n,identity:o,fetchImpl:i,secrets:a});return Boolean(e)}}:{}}),l=function(e,t){const n=t.payload.protocolVersion,i=t.payload.capabilities;if(!(e.protocolVersion!==n||JSON.stringify(e.capabilities??null)!==JSON.stringify(i??null)))return e;const o=(new Date).toISOString();return{...e,protocolVersion:n,capabilities:i,lastUsedAt:o,updatedAt:o}}(n,o),m=wu(c);if("local-trust"===s?.mode&&!r){const e=await m.auth.session();e.authenticated&&e.user||await Fu({profile:n,identity:o,fetchImpl:i,secrets:a})}return{profile:l,identity:o,client:m,store:t}}var Vu,Gu,Wu=function(){if(Gu)return Vu;Gu=1;const e=t,{spawnSync:n}=r;return Vu={processStartIdentity:function(t,i=process.platform){if(Number.isInteger(t)&&!(t<=0)){if("linux"===i)try{const n=e.readFileSync(`/proc/${t}/stat`,"utf8"),i=n.lastIndexOf(")");if(i<0)return;const o=n.slice(i+2).trim().split(/\s+/)[19];return o?`linux:${o}`:void 0}catch{return}if(["darwin","freebsd","openbsd","aix","sunos"].includes(i)){const e=n("ps",["-o","lstart=","-p",String(t)],{encoding:"utf8",timeout:1e3}),o=0===e.status?e.stdout.trim().replace(/\s+/g," "):"";return o?`${i}:${o}`:void 0}if("win32"===i){const e=n("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-Process -Id ${t} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks`],{encoding:"utf8",timeout:2e3}),i=0===e.status?e.stdout.trim():"";return/^\d+$/.test(i)?`win32:${i}`:void 0}}}}}();function Yu(e){return Number.isInteger(e)&&Number(e)>0}const Ku="local";function Ju(e=process.env){const t=e.TASK_HANDOFF_CONTROL_PLANE_LOCK_PATH?.trim();return t?i.resolve(t):i.join(n.tmpdir(),`task-handoff-control-plane-${process.getuid?.()??"user"}.lock`)}const Zu=new Set(["127.0.0.1","localhost","::1","[::1]"]),Qu=new Set(["0.0.0.0","::","[::]"]);async function Xu(e){const o=Ju(e.env),a=function(e){try{const o=JSON.parse(t.readFileSync(function(e){return i.join(e,"owner.json")}(e),"utf8"));if(Yu(o.pid)&&"string"==typeof o.startTime){const e=o;return{pid:e.pid,hostname:"string"==typeof e.hostname&&e.hostname?e.hostname:n.hostname(),component:e.component||"server-update",command:"string"==typeof e.command?e.command:"",acquiredAt:"string"==typeof e.createdAt&&Number.isFinite(Date.parse(e.createdAt))?e.createdAt:new Date(0).toISOString(),token:"string"==typeof e.token&&e.token?e.token:`legacy:${e.pid}:${e.startTime}`,startIdentity:e.startTime.startsWith("linux:")?e.startTime:`linux:${e.startTime}`}}if(!(Yu(o.pid)&&"string"==typeof o.hostname&&o.hostname&&"string"==typeof o.command&&"string"==typeof o.acquiredAt&&Number.isFinite(Date.parse(o.acquiredAt))&&"string"==typeof o.token&&o.token))return;return o}catch{return}}(o);if(!a)return;if(a.component&&"control-plane"!==a.component)return;if(!function(e){if(!e||!function(e){if(!Yu(e))return!1;try{return process.kill(Number(e),0),!0}catch(e){return"EPERM"===e.code}}(e.pid))return!1;if(!e.startIdentity)return!0;const t=Wu.processStartIdentity(e.pid);return void 0===t||t===e.startIdentity}(a))return;const s=function(e){const t=e.port;if(!Number.isInteger(t)||t<1||t>65535)return;const n=e.host?.trim().toLowerCase();if(!n||!Zu.has(n)&&!Qu.has(n))return;const i=n.startsWith("[")&&n.endsWith("]")?n.slice(1,-1):n;return`http://${Zu.has(n)?i.includes(":")?`[${i}]`:i:"127.0.0.1"}:${t}`}(a);if(s)try{return{origin:s,identity:await Mu(s,e.fetchImpl),lockPath:o,...a.dataDir?{dataDir:a.dataDir}:{}}}catch{return}}function eg(e,t){const{origin:n,identity:i}=t,o=e.findByOrigin(n);if(o)return o;const a=(new Date).toISOString(),s=e.list().find(e=>"local-discovery"===e.source);if(s){const t=s.controlPlaneId!==i.payload.controlPlaneId||s.fingerprint!==i.payload.publicKey.fingerprint;return e.save({...s,origin:n,controlPlaneId:i.payload.controlPlaneId,fingerprint:i.payload.publicKey.fingerprint,protocolVersion:i.payload.protocolVersion,capabilities:i.payload.capabilities,updatedAt:a,lastUsedAt:a,...t?{trustedAt:a,identityChangedAt:a,replacedFingerprint:s.fingerprint}:{}})}const r=function(e,t){if(!e.get(Ku))return Ku;const n=P(t);let i=n,o=2;for(;e.get(i);)i=`${n}-${o++}`;return i}(e,n),d=k.parse({label:r,origin:n,controlPlaneId:i.payload.controlPlaneId,fingerprint:i.payload.publicKey.fingerprint,protocolVersion:i.payload.protocolVersion,capabilities:i.payload.capabilities,source:"local-discovery",createdAt:a,updatedAt:a,trustedAt:a,lastUsedAt:a}),c=e.save(d);return e.defaultProfile()||e.setDefault(c.label),c}const tg=/(token|secret|password|passwd|credential|credentials|apikey|privatekey)$/i,ng=new Set(["key","token","secret","password","credentials","credential"]);function ig(e){return ng.has(e.toLowerCase())||tg.test(e)}const og=new Set;function ag(e){if("string"!=typeof e)return;const t=e.trim();t.length>=4&&og.add(t)}function sg(e){let t=e;for(const e of og)t=t.split(e).join("***");return t}function rg(e){return dg(e)}function dg(e){if("string"==typeof e)return sg(e);if(Array.isArray(e))return e.map(dg);if(!e||"object"!=typeof e)return e;const t={};for(const[n,i]of Object.entries(e))t[n]=ig(n)?"***":dg(i);return t}function cg(e){if(Array.isArray(e))for(const t of e)cg(t);else if(e&&"object"==typeof e)for(const[t,n]of Object.entries(e))ig(t)?ag(n):cg(n)}async function lg(e){const t=s.createInterface({input:process.stdin,output:process.stderr});try{const n=await t.question(`${e} [y/N] `);return/^y(es)?$/i.test(n.trim())}finally{t.close()}}async function mg(e,t){const n=e.profile?.trim()||e.env[A]?.trim();if(n)return e.store.select(n,e.env);if(e.store.list().length>0)return e.store.select(void 0,e.env);const i=await Xu({env:e.env,fetchImpl:e.fetchImpl});if(i)return eg(e.store,i);throw new h("CLI_PROFILE_MISSING",`No Control Plane profile configured and no local Control Plane was detected (lock: ${Ju(e.env)}). Start the desktop Control Plane or run \`thctl profile add <origin>\`.`,7)}async function pg(e,t={}){let n,i=t.profile??await mg(e);try{n=await ug(e,i,t.withSession)}catch(o){const a=await async function(e,t,n){if("local-discovery"!==t.source)return;if(!(n instanceof h&&["CLI_NETWORK_ERROR","CLI_IDENTITY_UNAVAILABLE"].includes(n.code)))return;const i=await Xu({env:e.env,fetchImpl:e.fetchImpl});return i&&i.origin!==t.origin?eg(e.store,i):void 0}(e,i,o);if(!a)throw o;i=a,n=await ug(e,i,t.withSession)}return function(e,t){const n=e.get(t.label);n&&n.updatedAt===t.updatedAt||e.save(t)}(e.store,n.profile),!1!==t.withSession&&await async function(e,t){const n=e.store.secrets(),i=n.read(t.profile.label);if(!i?.expiresAt)return;if("local-trust"===i.mode)return;const o=Date.parse(i.expiresAt)-Date.now();if(!Number.isFinite(o)||o>gg)return;const a=await t.client.auth.renewCliSession();n.write(t.profile.label,{...i,expiresAt:a.expiresAt,savedAt:(new Date).toISOString()})}(e,n),n}function ug(e,t,n){return Hu({store:e.store,profile:t,fetchImpl:e.fetchImpl,approvalWait:{signal:e.signal,sleep:e.sleep,notify:t=>{e.output.json||e.output.warn(`Waiting for your Web approval (${t}); expires in at most five minutes.`)}},...void 0===n?{}:{withSession:n}})}const gg=6048e5;async function hg(e,t,n){if(e.yes)return!0;if(!e.isTty)throw function(e){return new h("CLI_CONFIRMATION_REQUIRED",`\`${e}\` changes remote state. Re-run with --yes to confirm, or --dry-run to preview the request.`,4,{command:e})}(t);if(!await e.confirm(n))throw new h("CLI_CANCELLED","The operation was cancelled.",g);return!0}async function zg(e,t,n,i){const o=n(),a=o.steps??[o];if(!e.dryRun){for(const e of a)cg(e.body);return await hg(e,t,1===a.length?`${o.method} ${o.path} — continue?`:`${a.length} requests will be sent (${a.map(e=>`${e.method} ${e.path}`).join(", ")}) — continue?`),i()}e.output.data(1===a.length?{dryRun:!0,method:o.method,path:o.path,...void 0===o.body?{}:{body:rg(o.body)}}:{dryRun:!0,steps:a.map(e=>({method:e.method,path:e.path,...void 0===e.body?{}:{body:rg(e.body)}}))})}function fg(e){if(e.aborted)throw new h("CLI_CANCELLED","The operation was cancelled.",g)}function yg(e,t){const n=e.args[t]?.trim();if(!n)throw z("CLI_ARGUMENT_MISSING",`Missing required argument <${t}>.`,{argument:t});return n}function Ig(e,t){const n=e.options[t];if("string"==typeof n)return n.trim()||void 0}function bg(e,t){const n=Ig(e,t);if(!n)throw z("CLI_OPTION_MISSING",`Missing required option --${t}.`,{option:t});return n}function wg(e,t){const n=e.options[t];return Array.isArray(n)?n.filter(e=>"string"==typeof e).map(e=>e.trim()).filter(Boolean):[]}function vg(e,t,n){const i=e.safeParse(t);if(!i.success)throw z("CLI_INVALID_INPUT",`${n} does not match the expected schema.`,{issues:i.error.issues.map(e=>({path:e.path.join("."),message:e.message}))});return i.data}function xg(e,n,i){let o,a;try{o=t.readFileSync(e,"utf8")}catch(t){throw z("CLI_FILE_UNREADABLE",`Cannot read ${i} \`${e}\`: ${t instanceof Error?t.message:String(t)}`,{file:e})}try{a=JSON.parse(o)}catch(t){throw z("CLI_FILE_INVALID_JSON",`${i} \`${e}\` is not valid JSON: ${t instanceof Error?t.message:String(t)}`,{file:e})}return vg(n,a,`${i} \`${e}\``)}function Ag(e,t){if("not-modified"===e.kind)throw I(`AI session \`${t}\` is unchanged at revision ${e.revision}; no projection is available locally.`,{sessionId:t,revision:e.revision});return e.detail}function kg(e,t="request body"){const n=bg(e,"config"),i=xg(n,o.z.unknown(),t);if(!i||"object"!=typeof i||Array.isArray(i))throw z("CLI_INVALID_INPUT",`${t} \`${n}\` must be a JSON object.`,{file:n});return i}async function Sg(e){if(!0!==e.options["token-stdin"])throw z("CLI_TOKEN_STDIN_REQUIRED","Provide the secret on stdin and re-run with --token-stdin.");const t=[];let n=0;for await(const e of process.stdin){const i=Buffer.isBuffer(e)?e:Buffer.from(String(e));if(n+=i.length,n>1048576)throw z("CLI_TOKEN_STDIN_TOO_LARGE","The secret on stdin is too large.");t.push(i)}const i=Buffer.concat(t).toString("utf8").trim();if(!i)throw z("CLI_TOKEN_STDIN_EMPTY","No secret was provided on stdin.");return ag(i),i}const Cg=[{key:"instanceId",header:"instance"},{key:"id",header:"session"},{key:"agent",header:"agent"},{key:"status",header:"status"},{key:"phase",header:"phase"},{key:"title",header:"title",width:40},{key:"updatedAt",header:"updated"}],jg=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(t)}`,Rg=e=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace`,Tg=[{key:"availability",header:"availability"},{key:"currentBranch",header:"branch"},{key:"dirty",header:"dirty"},{key:"repositoryContextId",header:"context"}];function $g(e){return e.map(e=>"activity"===e.type?{type:e.activityKind,turn:e.turnId,title:e.title,detail:e.output??e.summary??e.input??""}:{type:e.type,turn:e.turnId,title:"",detail:e.text})}const Eg=[{key:"type",header:"type"},{key:"turn",header:"turn",width:40},{key:"title",header:"title",width:24},{key:"detail",header:"detail",width:60}],Pg=[{key:"kind",header:"kind"},{key:"name",header:"name",width:30},{key:"path",header:"path",width:50}],Og={".bmp":"image/bmp",".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".svg":"image/svg+xml",".webp":"image/webp",".csv":"text/csv",".json":"application/json",".log":"text/plain",".md":"text/markdown",".pdf":"application/pdf",".txt":"text/plain",".yaml":"application/yaml",".yml":"application/yaml",".tar":"application/x-tar",".gz":"application/gzip",".zip":"application/zip"};function Ng(e,t){return async(n,i)=>{const o=yg(i,"instanceId"),a=yg(i,"sessionId"),s=yg(i,"queueId"),r=await pg(n),d=await zg(n,e,()=>"remove"===t?{method:"DELETE",path:`${jg(o,a)}/queue/${encodeURIComponent(s)}`}:{method:"POST",path:`${jg(o,a)}/queue/${encodeURIComponent(s)}/${t}`},async()=>"steer"===t?await r.client.aiSessions.steerQueue(o,a,s):"retry"===t?await r.client.aiSessions.retryQueue(o,a,s):await r.client.aiSessions.removeQueue(o,a,s));if(d)return{data:d,message:`Queued message \`${s}\` ${"remove"===t?"removed":`${t} requested`}.`}}}const _g=Ng("ai-session queue steer","steer"),Ug=Ng("ai-session queue retry","retry"),Lg=Ng("ai-session queue remove","remove");async function Dg(e,t,n,i,o){const a=Ig(o,"expected-revision");if(void 0!==a){const e=Number(a);if(!Number.isInteger(e)||e<0)throw new h("CLI_INVALID_OPTION","--expected-revision must be a non-negative integer.",2,{option:"expected-revision",value:a});return e}const s=Ag(await t.client.aiSessions.detail(n,i,void 0,e.signal),i);return s.queue?.revision??0}function qg(e){const t=be.safeParse(e);if(!t.success)throw new h("CLI_INVALID_OPTION",`--permission-mode must be one of: ${be.options.join(", ")}.`,2,{option:"permission-mode",value:e});return t.data}function Mg(e){const t=/^(app|plugin):\/\/[^\s/]+$/.exec(e),n=t?{kind:t[1],name:e.slice(t[1].length+3),path:e}:e.startsWith("/")?{kind:"skill",name:i.basename(e),path:e}:void 0;if(!n)throw z("CLI_INVALID_OPTION","Each --reference must be an absolute skill path or an app:// or plugin:// URI.",{option:"reference",value:e});return vg(Ce,n,`--reference ${e}`)}function Bg(e,t="effort"){const n=De.safeParse(e);if(!n.success)throw new h("CLI_INVALID_OPTION",`--${t} must be one of: ${De.options.join(", ")}.`,2,{option:t,value:e});return n.data}const Fg=[{key:"storyPath",header:"path",width:48},{key:"title",header:"title",width:32}],Hg=[{key:"instanceId",header:"instance"},{key:"id",header:"app session"},{key:"appId",header:"app"},{key:"title",header:"title",width:30},{key:"kind",header:"kind"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],Vg=o.z.string().trim().min(1).max(120),Gg=[{key:"mode",header:"mode"},{key:"url",header:"url"},{key:"expiresAt",header:"expires"},{key:"token",header:"token"}],Wg=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(t)}`,Yg=[{key:"path",header:"path",width:50},{key:"size",header:"size"},{key:"contentType",header:"content type"}],Kg=o.z.string().trim().min(1).max(60),Jg=[{key:"id",header:"profile"},{key:"name",header:"name",width:24},{key:"isDefault",header:"default"},{key:"runningSessionId",header:"session"},{key:"diskUsageBytes",header:"disk"},{key:"updatedAt",header:"updated"}];function Zg(e){return{instanceId:yg(e,"instanceId"),appId:yg(e,"appId")}}function Qg(e,t=Math.random){const n=Math.max(1,Math.floor(e));if(1===n)return 0;if(2===n)return 250;const i=Math.min(6e4,250*2**(n-2));return Math.min(6e4,Math.round(i*(.75+.5*t())))}class Xg{retryNumber=0;random;constructor(e=Math.random){this.random=e}get attempts(){return this.retryNumber}next(){return this.retryNumber+=1,{attempt:this.retryNumber,delay:Qg(this.retryNumber,this.random)}}reset(){this.retryNumber=0}}const eh=({url:e,authorization:t,handlers:n})=>{const i=new d(e,{headers:{authorization:t}});return i.on("open",()=>n.opened()),i.on("message",e=>n.message(function(e){return"string"==typeof e?e:Buffer.isBuffer(e)?e.toString("utf8"):Array.isArray(e)?Buffer.concat(e).toString("utf8"):e instanceof ArrayBuffer?Buffer.from(e).toString("utf8"):String(e)}(e))),i.on("close",(e,t)=>n.closed({code:e,reason:t?.toString("utf8")??""})),i.on("error",e=>n.failed(e instanceof Error?e:new Error(String(e)))),i.on("unexpected-response",(e,t)=>{const i=t.statusCode??0;t.resume(),n.rejected(i)}),{send:e=>i.send(e),close:(e,t)=>{try{i.close(e,t)}catch{}}}},th={"ai-sessions":"ai.sessions","app-sessions":"app.sessions"};function nh(e,t){const n=new URL(Lu(e,"/api/events"));return n.protocol="https:"===n.protocol?"wss:":"ws:",n.searchParams.set("aiSessionTransient","1"),n.searchParams.set("resourceMetricsScope","1"),t&&n.searchParams.set("instanceId",t),n.toString()}function ih(e){return`${e.code}${e.reason?`: ${e.reason}`:""}`}async function oh(e,t){if(e.signal.aborted)return;const n=e.createEventSocket??eh,i=function(e){return{v:1,type:"subscribe",topics:[...e.topics],...e.instanceId?{instanceIds:[e.instanceId]}:{},metricInstanceIds:[],aiSessionTransient:{messageDeltas:{allInstances:!1,instanceIds:[]},timelineAllSessions:!1,timelineSessions:[]},aiSessionHierarchy:{subagents:!0}}}(t);await new Promise((o,a)=>{const s=new Set,r=new Xg;let d,c,l,m=!1,p=!1;const u=()=>{c&&clearInterval(c),c=void 0},g=t=>{if(p)return;p=!0,e.signal.removeEventListener("abort",z),u(),l&&clearTimeout(l),l=void 0;const n=d;d=void 0,n?.socket.close(1e3,"thctl stopped the event stream."),t?a(t):o()},z=()=>g(),f=(t,n)=>{if(!p&&d===t){d=void 0,u();try{t.socket.close(1e3,n.error?"thctl stopped the event stream.":"thctl is reconnecting the event stream.")}catch{}n.error?g(n.error):(n.warning&&e.output.warn(n.warning),(()=>{if(p||l)return;const{attempt:t,delay:n}=r.next();e.output.warn(`Event stream disconnected; reconnecting (attempt ${t}, in ${n}ms).`),l=setTimeout(()=>{l=void 0,y()},n)})())}},y=()=>{if(p)return;const o={socket:void 0,authoritative:!1};o.socket=n({url:t.url,authorization:t.authorization,handlers:{opened:()=>{p||d!==o||(o.socket.send(JSON.stringify(i)),u(),c=setInterval(()=>{if(!p&&d===o)try{o.socket.send(JSON.stringify({v:1,type:"ping",sentAt:(new Date).toISOString()}))}catch{}},2e4))},message:n=>{p||d!==o||((n,i)=>{const o=function(e){try{const t=JSON.parse(e);if(!t||"object"!=typeof t||Array.isArray(t))return;return t}catch{return}}(i);if(!o)return void e.output.warn("Ignoring an unreadable event frame.");if("pong"===o.type)return;if("streams.hello"===o.type)return ju.safeParse(o.payload).success?(n.authoritative=!0,m=!0,void r.reset()):void g(I("The Control Plane sent an incompatible session stream handshake.",{url:t.url}));if(!n.authoritative)return;const a="string"==typeof o.id?o.id:void 0;if(a){if(s.has(a))return;if(s.add(a),s.size>1e4){const e=s.values().next().value;void 0!==e&&s.delete(e)}}e.output.streams.stdout(`${JSON.stringify(o)}\n`)})(o,n)},closed:e=>{p||d!==o||(4003!==e.code?1002!==e.code?o.authoritative?f(o,{warning:`Event stream closed (code ${ih(e)}).`}):f(o,{error:b(`The Control Plane closed the event stream before the session-stream handshake (code ${ih(e)}).`,{url:t.url,closeCode:e.code})}):f(o,{error:I("The Control Plane closed the event stream because the protocol is incompatible.",{url:t.url,closeCode:e.code})}):f(o,{error:new h("CLI_EVENT_STREAM_SCOPE_NOT_VISIBLE","The requested event scope is not visible to this account.",6,{url:t.url,closeCode:e.code})}))},failed:e=>{p||d!==o||f(o,m?{warning:`Event stream error: ${e.message}`}:{error:b(`Could not open the event stream at ${t.url}: ${e.message}`,{url:t.url})})},rejected:e=>{if(p||d!==o)return;const n=function(e,t){return 401===e?(t.onUnauthorized?.(),{fatal:!0,error:new h("CLI_EVENT_STREAM_UNAUTHORIZED","The Control Plane rejected the event stream credential (HTTP 401). Run `thctl login` to authorize this CLI again.",5,{url:t.url,status:e})}):403===e?{fatal:!0,error:new h("CLI_EVENT_STREAM_FORBIDDEN","The Control Plane refused the event stream (HTTP 403).",6,{url:t.url,status:e})}:{fatal:!1,error:x(e,"CLI_EVENT_STREAM_UPGRADE_FAILED",`The Control Plane refused the event stream (HTTP ${e}).`,{url:t.url})}}(e,t);!n.fatal&&m?f(o,{warning:`${n.error.message} Retrying.`}):f(o,{error:n.error})}}}),d=o};e.signal.addEventListener("abort",z,{once:!0}),y()})}function ah(e){const t=e.args.instanceId?.trim();if(!t)throw new h("CLI_ARGUMENT_MISSING","Missing required argument <instanceId>.",2);return t}const sh=[{key:"id",header:"instance"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"health",header:"health"},{key:"connectionStatus",header:"connection"},{key:"nodeId",header:"node"},{key:"runtime.type",header:"runtime"},{key:"workspace.status",header:"workspace"},{key:"aiSessions.runningCount",header:"running"}];function rh(e){return async(t,n)=>{const i=ah(n),o=await pg(t),a=await zg(t,`instance ${e} ${i}`,()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(i)}/${e}`,body:{}}),()=>o.client.resources.instanceAction(i,e));if(a)return{data:a,columns:[{key:"id",header:"instance"},{key:"status",header:"status"}],message:`Instance \`${i}\` is ${a.status}.`}}}const dh=rh("start"),ch=rh("stop"),lh=rh("restart"),mh=[{key:"id",header:"instance"},{key:"name",header:"name",width:24},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"startOutcome.status",header:"start"}],ph=[{key:"instanceId",header:"instance"},{key:"containerDeleted",header:"container"},{key:"completed",header:"completed"}],uh=[{key:"id",header:"instance"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"connectionStatus",header:"connection"},{key:"nodeId",header:"node"},{key:"config.defaultCodexPermissionMode",header:"permission"},{key:"config.aiSessionHistoryLimit",header:"history"},{key:"config.aiSessionAttachmentRetentionDays",header:"retention"}],gh=[{key:"id",header:"app"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"state",header:"state"},{key:"managementSource",header:"source"},{key:"version",header:"version"},{key:"canInstall",header:"install"},{key:"canUninstall",header:"uninstall"},{key:"activeJobId",header:"job"}],hh=[{key:"id",header:"job"},{key:"appId",header:"app"},{key:"operation",header:"operation"},{key:"state",header:"state"},{key:"phase",header:"phase"},{key:"updatedAt",header:"updated"}],zh=new Set(["succeeded","failed","cancelled","interrupted"]);async function fh(e,t,n,i){let o=i;const a=Date.now()+18e5;for(;!zh.has(o.state);){if(Date.now()>=a)throw new h("CLI_APP_JOB_TIMEOUT",`Timed out waiting for app ${o.operation} job \`${o.id}\` (state: ${o.state}).`,8,{instanceId:n,jobId:o.id,state:o.state});await e.sleep(1e3),fg(e.signal),o=(await t.client.apps.job(n,o.id,e.signal)).job}return o}function yh(e){return async(t,n)=>{const i=ah(n),o=yg(n,"appId"),s=Ig(n,"request-id")??a.randomUUID(),r=!0===n.options.wait,d=await pg(t),c=await zg(t,`instance app ${e} ${i}`,()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(i)}/apps/${encodeURIComponent(o)}/${e}`,body:{requestId:s}}),()=>d.client.apps[e](i,o,s));if(c)return vh(0,r?await fh(t,d,i,c.job):c.job,!0===n.options.logs)}}const Ih=yh("install"),bh=yh("uninstall"),wh=[{key:"id",header:"app"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"description",header:"description",width:60}];function vh(e,t,n=!1){const i=function(e){return"succeeded"===e.state?`App \`${e.appId}\` ${e.operation} succeeded.`:zh.has(e.state)?`App \`${e.appId}\` ${e.operation} ${e.state}${e.error?`: ${e.error.message}`:"."}`:`App \`${e.appId}\` ${e.operation} job \`${e.id}\` is ${e.state}${e.phase?` (${e.phase})`:""}; pass --wait to follow it to completion.`}(t);return n&&t.logTail?{data:t,columns:hh,message:`${i}\n${t.logTail.trimEnd()}`}:{data:t,columns:hh,message:i}}const xh=[{key:"id",header:"model"},{key:"model.name",header:"name",width:24},{key:"model.model",header:"model id",width:30},{key:"model.app",header:"app"},{key:"model.protocols",header:"protocols",width:20},{key:"model.enabled",header:"enabled"},{key:"locations",header:"locations",width:30}],Ah=[{key:"id",header:"node"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"health",header:"health"},{key:"connectionMode",header:"connection"},{key:"lastSeenAt",header:"last seen"},{key:"capabilities",header:"capabilities",width:30}];function kh(e){return e.map(e=>({...e,capabilities:Array.isArray(e.capabilities)?e.capabilities.join(","):"",lastSeenAt:"string"==typeof e.lastSeenAt?e.lastSeenAt:""}))}function Sh(e,t){if("string"!=typeof e||!e.trim())throw new h("CLI_ARGUMENT_MISSING",`Missing required argument <${t}>.`,2);return e.trim()}function Ch(e,t){return`<!doctype html><html lang="en"><head><meta charset="utf-8"><title>${e}</title></head><body style="font-family:system-ui,sans-serif;margin:0;display:grid;place-items:center;min-height:100vh;background:#0b0b0c;color:#f5f5f5"><main style="max-width:32rem;padding:2rem;text-align:center"><h1 style="font-size:1.1rem;font-weight:500">${e}</h1><p style="color:#a1a1aa;font-size:.9rem">${t}</p></main></body></html>`}function jh(e){const t="darwin"===process.platform?"open":"win32"===process.platform?"cmd":"xdg-open",n="win32"===process.platform?["/c","start","",e]:[e];return new Promise((e,i)=>{const o=r.spawn(t,n,{stdio:"ignore",detached:"win32"!==process.platform});o.once("error",i),o.once("spawn",()=>{o.unref(),e()})})}async function Rh(e){const t=e.store.select(e.profileLabel);return Hu({store:e.store,profile:t,fetchImpl:e.fetchImpl,withSession:!1})}async function Th(e,t,n){e.store.secrets().write(e.profile.label,{sessionToken:t.sessionToken,sessionId:t.session.id,expiresAt:t.session.expiresAt,mode:"authorization",savedAt:(new Date).toISOString()}),e.store.save({...e.profile,loginMode:n,lastUsedAt:(new Date).toISOString(),updatedAt:(new Date).toISOString()})}async function $h(e){const{store:t,fetchImpl:n,output:i}=e,o=await Rh({store:t,profileLabel:e.profileLabel,fetchImpl:n}),s=await async function(){let e;for(let t=0;t<5;t+=1){const t=c.createServer();try{await new Promise((e,n)=>{t.once("error",n),t.listen(0,"127.0.0.1",()=>{t.off("error",n),e()})})}catch(n){e=n,t.close();continue}const n=t.address();if(!n||"string"==typeof n){t.close(),e=new Error("Loopback callback did not expose a TCP port.");continue}let i=()=>{},o=()=>{};const a=new Promise((e,t)=>{i=e,o=t});a.catch(()=>{});let s=!1;return t.on("request",(e,t)=>{const a=new URL(e.url||"/",`http://127.0.0.1:${n.port}`);if("/callback"!==a.pathname)return t.writeHead(404,{"content-type":"text/plain; charset=utf-8"}),void t.end("Not found");const r=a.searchParams.get("code")||"",d=a.searchParams.get("state")||"",c=a.searchParams.get("error")||"";return t.writeHead(200,{"content-type":"text/html; charset=utf-8"}),c?(t.end(Ch("Authorization failed",`The Control Plane reported ${c}. Return to the terminal and try again.`)),void(s||(s=!0,o(new h("CLI_AUTHORIZATION_FAILED",`The Control Plane rejected the CLI authorization: ${c}.`,5))))):r&&d?(t.end(Ch("Authorization complete","You can close this tab and return to the terminal.")),void(s||(s=!0,i({code:r,state:d})))):(t.end(Ch("Authorization failed","The callback did not include a usable authorization code. Return to the terminal and try again.")),void(s||(s=!0,o(I("The loopback callback did not include a code and state.")))))}),{port:n.port,redirectUri:`http://127.0.0.1:${n.port}/callback`,waitForCode:a,close:()=>{s||(s=!0,o(new h("CLI_LOGIN_CANCELLED","The CLI login was cancelled.",g))),t.close(),t.closeAllConnections?.()}}}throw new h("CLI_LOOPBACK_UNAVAILABLE",`Could not bind a local callback port (${e instanceof Error?e.message:String(e)}). Retry with \`thctl login --device\` to authorize from another device.`,m)}(),{verifier:r,challenge:d}=function(){const e=a.randomBytes(32).toString("base64url");return{verifier:e,challenge:a.createHash("sha256").update(e).digest("base64url")}}(),l=a.randomBytes(24).toString("base64url");try{const t=await o.client.auth.cliAuthorize({mode:"browser",client:Pu(),redirectUri:s.redirectUri,state:l,codeChallenge:d,codeChallengeMethod:"S256"});if("browser"!==t.mode)throw I("The Control Plane returned a device authorization for a browser request.");i.message(`Open this URL to approve the CLI session:\n${t.verificationUri}`);try{await(e.openUrl??jh)(t.verificationUri)}catch{i.warn("Could not open a browser automatically; open the URL above manually.")}const n=e.loginTimeoutMs??6e5,a=await function(e,t){return new Promise((n,i)=>{const o=setTimeout(()=>i(new h("CLI_LOGIN_TIMEOUT","Timed out waiting for the browser authorization.",g)),t);o.unref?.(),e.then(e=>{clearTimeout(o),n(e)},e=>{clearTimeout(o),i(e)})})}(s.waitForCode,n);if(a.state!==l)throw new h("CLI_LOGIN_STATE_MISMATCH","The browser callback state did not match this login attempt. The authorization code was discarded.",p);const c=await o.client.auth.cliToken({grantType:"authorization_code",requestId:t.requestId,code:a.code,codeVerifier:r});return await Th(o,c,"browser"),{profile:o.profile,session:c.session}}finally{s.close()}}function Eh(e){const t=(e.args??[]).map(e=>e.required?`<${e.name}>`:`[${e.name}]`);return["thctl",e.id,...t].join(" ")}function Ph(e){return{id:e.id,group:e.group,summary:e.summary,stage:e.stage,implemented:Boolean(e.handler),write:Boolean(e.write),usage:Eh(e),arguments:(e.args??[]).map(e=>({...e,required:Boolean(e.required),variadic:Boolean(e.variadic)})),options:e.options??[],examples:e.examples??[],inputSchema:o.z.toJSONSchema(e.input,{io:"input",unrepresentable:"any"}),outputSchema:o.z.toJSONSchema(e.output,{io:"output",unrepresentable:"any"}),outputPinned:!1!==e.outputPinned,outputMode:e.outputMode??"document"}}function Oh(e){const t=[];if(t.push(`### \`${e.id}\``,"",e.summary,""),t.push(`- stage: ${e.stage}`,"- implemented: "+(e.implemented?"yes":"no"),"- write: "+(e.write?"yes":"no"),`- usage: \`${e.usage}\``,""),e.arguments.length){t.push("| argument | required | description |","| --- | --- | --- |");for(const n of e.arguments)t.push(`| \`${n.name}\` | ${n.required?"yes":"no"} | ${n.description} |`);t.push("")}if(e.options.length){t.push("| option | description |","| --- | --- |");for(const n of e.options)t.push(`| \`${n.flags}\` | ${n.description} |`);t.push("")}return e.examples.length&&t.push("Examples:","",...e.examples.map(e=>`- \`${e}\``),""),t.push("Input JSON Schema:","","```json",JSON.stringify(e.inputSchema,null,2),"```",""),t.push("Output JSON Schema:","","```json",JSON.stringify(e.outputSchema,null,2),"```",""),t.join("\n")}const Nh=[{key:"id",header:"story"},{key:"title",header:"title",width:30},{key:"ownerNodeId",header:"node"},{key:"documents",header:"docs"},{key:"archivedAt",header:"archived"},{key:"updatedAt",header:"updated"}],_h=[{key:"id",header:"run"},{key:"eventType",header:"event"},{key:"status",header:"status"},{key:"scheduledFor",header:"scheduled"},{key:"aiSessionId",header:"session"},{key:"startedAt",header:"started"}];function Uh(e,t){return e.output.json?{data:t}:{data:Lh([t])[0],columns:Nh}}function Lh(e){return e.map(e=>({...e,documents:Array.isArray(e.documents)?`${e.documents.length}`:"0",archivedAt:"string"==typeof e.archivedAt?e.archivedAt:""}))}async function Dh(e,t,n){if(n)return n;const i=await e.client.stories.list(),o=i.stories.find(e=>e.id===t);if(!o)throw new h("CLI_STORY_NOT_FOUND",`No story \`${t}\` is visible in the authoritative directory${i.unavailableNodeIds.length?` (unavailable nodes: ${i.unavailableNodeIds.join(", ")})`:""}.`,7,{storyId:t,unavailableNodeIds:i.unavailableNodeIds});return o.ownerNodeId}function qh(e){return async(t,n)=>{const i=yg(n,"storyId"),o=await pg(t),a=await Dh(o,i,Ig(n,"node"));if("remove"===e){const e=await zg(t,"story remove",()=>({method:"DELETE",path:`/api/stories/${encodeURIComponent(i)}?nodeId=${encodeURIComponent(a)}`}),()=>o.client.stories.remove(i,a));if(!e)return;if(!e.deleted)throw new h("CLI_STORY_NOT_REMOVED",`Story \`${i}\` was not removed.`,8,{storyId:i});return{data:e,message:`Story \`${i}\` removed.`}}const s=await zg(t,`story ${e}`,()=>({method:"POST",path:`/api/stories/${encodeURIComponent(i)}/${e}`,body:{nodeId:a}}),()=>"archive"===e?o.client.stories.archive(i,a):o.client.stories.restore(i,a));if(s)return{...Uh(t,s),message:`Story \`${i}\` ${"archive"===e?"archived":"restored"}.`}}}const Mh=qh("archive"),Bh=qh("restore"),Fh=qh("remove"),Hh=[{key:"automation.id",header:"automation"},{key:"automation.enabled",header:"enabled"},{key:"effectiveStatus",header:"status"},{key:"automation.actionId",header:"action"},{key:"nextRunAt",header:"next run"}];function Vh(e,t){return e.output.json?{data:t}:{data:t,columns:Hh}}const Gh=Xn.omit({storyId:!0});function Wh(e){return async(t,n)=>{const i=yg(n,"storyId"),o=yg(n,"automationId"),a=await pg(t),s=await Dh(a,i,Ig(n,"node")),r=await zg(t,e?"story automation enable":"story automation disable",()=>({method:"POST",path:`/api/stories/${encodeURIComponent(i)}/automations/${encodeURIComponent(o)}/${e?"enable":"disable"}`,body:{nodeId:s}}),()=>a.client.stories.setAutomationEnabled(i,o,s,e));if(r)return{data:r,message:`Automation \`${o}\` ${e?"enabled":"disabled"}.`}}}const Yh=Wh(!0),Kh=Wh(!1);function Jh(e,t){const n=Number(e);if(!Number.isInteger(n)||n<0)throw z("CLI_INVALID_OPTION",`--${t} must be a non-negative integer.`,{option:t,value:e});return n}const Zh=[{key:"configHash",header:"trigger"},{key:"config.name",header:"name",width:24},{key:"config.source.type",header:"source"},{key:"deploymentCount",header:"deployments"},{key:"enabledCount",header:"enabled"},{key:"runningCount",header:"running"},{key:"errorCount",header:"errors"}];function Qh(e){return{...e,deploymentCount:Array.isArray(e.deployments)?e.deployments.length:0}}const Xh={modelRelay:{name:"modelRelay",check:function(e){return function(e){return Ls(e).managedModels.modelRelay}(e).protocols.length>0}},managedGitCredentials:{name:"managedGitCredentials",check:function(e){return Ls(e).managedGitCredentials.registry}},localFolderPlaces:{name:"localFolderPlaces",check:function(e){return!0===Us.safeParse(e).data?.folderPlaces}},localFolderNameUpdate:{name:"localFolderNameUpdate",check:function(e){return!0===Us.safeParse(e).data?.localFolderNameUpdate}}};function ez(e){const t=e?.capabilities?.agent;if(t&&"object"==typeof t&&!Array.isArray(t))return t.capabilities}async function tz(e,t,n){return{nodeId:t,capabilities:ez(await e.resources.node(t,n))}}function nz(e,t,n){if(t&&!n.check(t.capabilities))throw f(e,n.name,{nodeId:t.nodeId,scope:"node"})}async function iz(e,t,n,i,o){const a=(await e.resources.instanceBoard(o)).find(e=>e.id===t);a&&nz(n,await tz(e,a.nodeId,o),i)}const oz={userManagement:{name:"userManagement",check:function(e){return!0===Fo(e)?.userManagement.users}},customRoles:{name:"customRoles",check:function(e){return!0===Fo(e)?.authorization.customRoles}},externalIdentityLogin:{name:"externalIdentityLogin",check:function(e){return void 0!==Fo(e)?.authentication.externalIdentity}}},az=[{key:"id",header:"user"},{key:"displayName",header:"name",width:24},{key:"primaryUsername",header:"username"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],sz=[{key:"id",header:"session"},{key:"clientType",header:"client"},{key:"createdAt",header:"created"},{key:"expiresAt",header:"expires"},{key:"lastUsedAt",header:"last used"}],rz=[{key:"id",header:"role"},{key:"name",header:"name",width:24},{key:"builtin",header:"builtin"},{key:"updatedAt",header:"updated"}],dz=[{key:"id",header:"permission"},{key:"description",header:"description",width:48}],cz=[{key:"id",header:"provider"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"enabled",header:"enabled"}],lz=[{key:"id",header:"approval"},{key:"displayName",header:"name",width:24},{key:"email",header:"email",width:30},{key:"status",header:"status"}];async function mz(e,t,n){const i=await pg(e);return function(e,t,n){if(!n.check(t.payload.capabilities))throw f(e,n.name,{origin:t.origin,protocolVersion:t.payload.protocolVersion,scope:"control-plane"})}(t,i.identity,n),i}function pz(e){const t=l.parse(e);if(!t)return!1;if(0===t.prerelease.length)return!0;const n=t.prerelease[0];return"alpha"===n||"beta"===n}function uz(e,t){const n=e?.trim(),i=t?.trim();return!(!n||!i||n===i)&&(/^\d+$/.test(n)&&/^\d+$/.test(i)?Number(i)>Number(n):!(!l.valid(n)||!l.valid(i))&&l.gt(i,n))}function gz(e){const t=e.trim();return t.endsWith("/")?t:`${t}/`}const hz="taskhandoff",zz=["task-handoff","task-handoff-nodes"],fz="SKILL.md",yz=".thandoff-skill.json",Iz=o.z.object({name:o.z.string().trim().min(1).max(64),description:o.z.string().trim().max(2048).optional(),version:o.z.union([o.z.string().trim().min(1).max(120),o.z.number()]).transform(e=>String(e)),thctl:o.z.string().trim().min(1).max(240).optional(),files:o.z.array(o.z.string().trim().min(1).max(512)).min(1).max(200),integrity:o.z.record(o.z.string(),o.z.string().trim().min(1).max(200)).optional()}).loose(),bz=o.z.object({skills:o.z.array(Iz).min(1).max(100)}).loose(),wz=o.z.object({schemaVersion:o.z.literal(1),name:o.z.string().trim().min(1).max(64),version:o.z.string().trim().min(1).max(120),thctl:o.z.string().trim().max(240).optional(),source:o.z.literal("index"),indexUrl:o.z.string().trim().min(1).max(2048),installedAt:o.z.string().datetime(),cliVersion:o.z.string().trim().min(1).max(120),verified:o.z.boolean().optional(),files:o.z.record(o.z.string(),o.z.string().trim().min(1).max(128))}).loose();function vz(e){return a.createHash("sha256").update(e).digest("hex")}function xz(e){const t=e.trim().replace(/\\/g,"/").replace(/^\.\//,""),n=t.split("/");if(!t||t.startsWith("/")||/^[A-Za-z]:/.test(t)||n.some(e=>!e||"."===e||".."===e))throw I(`The skill index contains an unsafe file path: ${e}`);return n.join("/")}function Az(e,t={},o=n.homedir()){const a=t.dir?.trim(),s=function(e){const t=e?.trim()||"user";if("project"!==t&&"user"!==t)throw z("CLI_ARGUMENT_INVALID",`Unknown --scope \`${t}\`; expected project or user.`,{scope:t});return t}(t.scope);if(a){const t=i.resolve(e,a);return{scope:s,root:t,directory:i.join(t,hz)}}const r="user"===s?i.join(o,".agents","skills"):i.join(e,".agents","skills");return{scope:s,root:r,directory:i.join(r,hz)}}function kz(e,t={},i=n.homedir()){return t.dir?.trim()||t.scope?.trim()?[Az(e,t,i)]:[Az(e,{scope:"user"},i),Az(e,{scope:"project"},i)]}async function Sz(e){const t=(e.indexUrl??e.env?.TASK_HANDOFF_SKILLS_INDEX_URL??"https://docs.thandoff.com/.well-known/skills/index.json").trim();let n,i;try{n=await e.fetchImpl(t,{headers:{accept:"application/json"},signal:AbortSignal.timeout(e.timeoutMs??5e3)})}catch(e){throw new h("CLI_SKILL_INDEX_UNAVAILABLE",`Could not reach the skill index ${t}: ${e instanceof Error?e.message:String(e)}`,m,{indexUrl:t})}if(!n.ok)throw new h("CLI_SKILL_INDEX_UNAVAILABLE",`The skill index ${t} answered HTTP ${n.status}.`,m,{indexUrl:t,status:n.status});try{i=await n.json()}catch{throw I(`The skill index ${t} is not valid JSON.`,{indexUrl:t})}const o=bz.safeParse(i);if(!o.success)throw I(`The skill index ${t} does not match the published schema.`,{indexUrl:t});const a=o.data.skills.find(e=>e.name===hz);if(!a)throw I(`The skill index ${t} does not publish \`${hz}\`; the CLI and the published skill are out of sync.`,{indexUrl:t,expected:hz});const s=[...new Set(a.files.map(xz))];if(!s.includes(fz))throw I(`The skill index entry for \`${hz}\` does not declare ${fz}.`,{indexUrl:t});if(void 0!==a.thctl&&(r=a.thctl,null===l.validRange(r.trim())))throw I(`The skill index declares an invalid thctl range: ${a.thctl}`,{indexUrl:t,thctl:a.thctl});var r;return{entry:{...a,files:s},indexUrl:t,baseUrl:t.replace(/[^/]*$/,"")}}function Cz(e,t){if(e.thctl&&!jz(t,e.thctl))throw new h("CLI_SKILL_REQUIRES_NEWER_CLI",`Skill \`${hz}\` ${e.version} requires thctl ${e.thctl}, but this CLI is ${t}. Update the CLI first: npm install -g @task-handoff/thctl@latest`,u,{command:"skill install",requiredThctl:e.thctl,cliVersion:t})}function jz(e,t){return!t||!pz(e)||function(e,t){if(!t)return!0;if(!e)return!1;try{return l.satisfies(e,t,{includePrerelease:!0})}catch{return!1}}(e,t)}async function Rz(e,t){const n=[];for(const i of e.entry.files){const o=new URL(i,e.baseUrl).toString();let a;try{a=await t.fetchImpl(o,{signal:AbortSignal.timeout(t.timeoutMs??5e3)})}catch(e){throw new h("CLI_SKILL_DOWNLOAD_FAILED",`Could not download ${i}: ${e instanceof Error?e.message:String(e)}`,m,{path:i,url:o})}if(!a.ok)throw new h("CLI_SKILL_DOWNLOAD_FAILED",`The skill file ${o} answered HTTP ${a.status}.`,m,{path:i,status:a.status});const s=Buffer.from(await a.arrayBuffer()),r=vz(s),d=e.entry.integrity?.[i];if(void 0!==d){const e=d.trim().toLowerCase().replace(/^sha256:/,"");if(!/^[a-f0-9]{64}$/.test(e))throw I(`The skill index integrity for ${i} is not a sha256 digest.`,{path:i});if(e!==r)throw I(`The downloaded ${i} does not match the published sha256.`,{path:i,expected:e,actual:r})}n.push({path:i,content:s,sha256:r})}return n}function Tz(e){if(!t.existsSync(e))return{directory:e,exists:!1,managed:!1,modified:null};const n=function(e){try{const n=wz.safeParse(JSON.parse(t.readFileSync(function(e){return i.join(e,yz)}(e),"utf8")));return n.success?n.data:void 0}catch{return}}(e);if(!n){let n;try{n=function(e){const t=/^---\r?\n([\s\S]*?)\r?\n---/.exec(e);if(!t)return;let n=!1;for(const e of t[1].split(/\r?\n/)){const t=e.replace(/\s+$/,"");if(!t.trim())continue;const i=t.length-t.trimStart().length,o=t.trim();if(0===i){n=/^metadata:\s*$/.test(o);continue}if(!n)continue;const a=/^version:\s*"?([^"\s]+)"?\s*$/.exec(o);if(a)return a[1]}}(t.readFileSync(i.join(e,fz),"utf8"))}catch{n=void 0}return{directory:e,exists:!0,...n?{version:n}:{},managed:!1,modified:null}}return{directory:e,exists:!0,version:n.version,managed:!0,modified:Pz(e,n),contentSignature:$z(n.files)}}function $z(e){if(!e)return;const t=Object.entries(e).map(([e,t])=>[e,t.trim().toLowerCase().replace(/^sha256:/,"")]).filter(([,e])=>e.length>0).sort(([e],[t])=>e<t?-1:e>t?1:0);return 0!==t.length?a.createHash("sha256").update(t.map(([e,t])=>`${e}:${t}`).join("\n")).digest("hex"):void 0}function Ez(e,t){if(!e.exists)return!1;const n=$z(t.integrity),i=e.contentSignature;return void 0!==n&&void 0!==i?n!==i:void 0===e.version||uz(e.version,t.version)}function Pz(e,n){const o=new Set(Object.keys(n.files));for(const[o,a]of Object.entries(n.files))try{if(vz(t.readFileSync(i.join(e,...o.split("/"))))!==a)return!0}catch{return!0}try{return Oz(e).some(e=>!o.has(e))}catch{return!0}}function Oz(e,n=""){const o=t.readdirSync(i.join(e,n),{withFileTypes:!0}),a=[];for(const t of o){if(t.name===yz)continue;const i=n?`${n}/${t.name}`:t.name;t.isDirectory()?a.push(...Oz(e,i)):a.push(i)}return a}function Nz(e){return zz.map(t=>i.join(e,t)).filter(e=>t.existsSync(e))}function _z(e){const{target:n,release:o,files:a}=e;t.mkdirSync(n.root,{recursive:!0,mode:493});const s=t.mkdtempSync(i.join(n.root,`.taskhandoff-${hz}-`)),r=`${n.directory}.backup-${process.pid}`;try{for(const e of a){const n=i.join(s,...e.path.split("/"));t.mkdirSync(i.dirname(n),{recursive:!0,mode:493}),t.writeFileSync(n,e.content,{mode:420})}const d={schemaVersion:1,name:hz,version:o.entry.version,...o.entry.thctl?{thctl:o.entry.thctl}:{},source:"index",indexUrl:o.indexUrl,installedAt:(e.now??new Date).toISOString(),cliVersion:e.cliVersion,verified:a.every(e=>void 0!==o.entry.integrity?.[e.path]),files:Object.fromEntries(a.map(e=>[e.path,e.sha256]))};t.writeFileSync(i.join(s,yz),`${JSON.stringify(d,null,2)}\n`,{mode:384}),t.existsSync(n.directory)&&t.renameSync(n.directory,r);try{t.renameSync(s,n.directory)}catch(e){throw t.existsSync(r)&&!t.existsSync(n.directory)&&t.renameSync(r,n.directory),e}return t.rmSync(r,{recursive:!0,force:!0}),d}catch(e){throw t.rmSync(s,{recursive:!0,force:!0}),e}}function Uz(e,t){const n=e.options[t];return"string"==typeof n&&n.trim()?n.trim():void 0}function Lz(e){return{scope:Uz(e,"scope"),dir:Uz(e,"dir")}}function Dz(e){return Sz({fetchImpl:e.fetchImpl,env:e.env,timeoutMs:5e3})}function qz(e,t,n,i,o){const a=n?jz(i,n.entry.thctl):void 0,s=void 0!==n&&t.exists&&Ez(t,n.entry);let r,d;return t.exists?t.managed&&t.modified?(r="local-modified",d=`thctl skill update ${o} --force`):s&&!1===a?(r="cli-too-old",d="npm install -g @task-handoff/thctl@latest"):s?(r="update-available",d=`thctl skill update ${o}`):r=n?"current":"unknown":(r="not-installed",d=`thctl skill install ${o}`),{scope:e.scope,directory:e.directory,status:r,...t.version?{version:t.version}:{},...n?{latestVersion:n.entry.version}:{},...t.exists?{managed:t.managed,modified:t.modified}:{},...d?{command:d}:{}}}function Mz(e){const t=Nz(e.root);return t.length?` Legacy skill directories remain: ${t.join(", ")}; remove them after verifying the new copy.`:""}const Bz=o.z.looseObject({}),Fz=o.z.object({}).strict();function Hz(e){return o.z.object(e).strict()}function Vz(e,t,n,i={}){return{name:e,summary:t,leaves:n,...i.flat?{flat:!0}:{}}}const Gz=[{key:"id",header:"node"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"health",header:"health"},{key:"connectionMode",header:"connection"}],Wz=[{key:"id",header:"folder"},{key:"name",header:"name",width:24},{key:"path",header:"path",width:48},{key:"updatedAt",header:"updated"}],Yz=[{key:"id",header:"runtime"},{key:"name",header:"name",width:24},{key:"type",header:"type"},{key:"status",header:"status"},{key:"version",header:"version"}],Kz=[{key:"reference",header:"reference",width:48},{key:"id",header:"image id",width:24},{key:"sizeBytes",header:"size"},{key:"createdAt",header:"created"}],Jz=[{key:"id",header:"job"},{key:"status",header:"status"},{key:"fromVersion",header:"from"},{key:"toVersion",header:"to"},{key:"updatedAt",header:"updated"}],Zz=[{key:"keyId",header:"key id"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"}],Qz=[{key:"id",header:"connection"},{key:"controlPlaneName",header:"control plane",width:24},{key:"controlPlaneUrl",header:"url",width:40},{key:"status",header:"status"}];function Xz(e){return yg(e,"nodeId")}async function ef(e,t,n,i){const o=await pg(e);if(i.length){const a=await tz(o.client,t,e.signal);for(const e of i)nz(n,a,e)}return o}const tf=new Set(["succeeded","degraded","failed"]),nf={folders:o.z.array(pd),folderTree:o.z.array(zc),folderPlaces:o.z.array(fc),runtimes:o.z.array(tc),dockerImages:o.z.array(o.z.looseObject({reference:o.z.string().optional(),id:o.z.string().optional()})),imageOptions:o.z.array(hc),externalListener:oc,modelRelay:rc,updateJobs:o.z.array(ad),pairingInvite:cc,pairings:o.z.array(lc),connections:o.z.array(mc),connectionCreate:pc,nodeRemove:uc};o.z.looseObject({id:o.z.string(),joinToken:o.z.string().optional(),expiresAt:o.z.string().optional()}),o.z.looseObject({node:o.z.looseObject({id:o.z.string()}).optional()});const of={name:"nodeId",description:"Node ID",required:!0},af={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},sf=[{id:"node create",group:"node",name:"create",stage:"B",write:!0,summary:"Create a node record from a JSON request body",options:[af],input:Hz({config:o.z.string()}),output:nf.nodeRemove,outputPinned:!1,handler:async function(e,t){const n=kg(t,"Node create request"),i=await pg(e),o=await zg(e,"node create",()=>({method:"POST",path:"/api/nodes",body:n}),()=>i.client.nodeAdmin.createNode(n));if(o)return{data:o,columns:Gz,message:`Node \`${o.id}\` created.`}}},{id:"node remove",group:"node",name:"remove",stage:"B",write:!0,summary:"Remove a node and revoke its proxied pairing",args:[of],options:[{flags:"--force",description:"Force removal when the node is still reachable"}],input:Hz({nodeId:o.z.string(),force:o.z.boolean().optional()}),output:nf.nodeRemove,handler:async function(e,t){const n=Xz(t),i=!0===t.options.force,o=await pg(e),a=await zg(e,"node remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}${i?"?force=true":""}`}),()=>Ou(o,()=>o.client.approvals.removeNode(n,i)));if(a)return{data:a,message:`Node \`${n}\` removed (revoke: ${a.revoke.mode}${a.revoke.orphanRisk?", orphan risk":""}).`}}},{id:"node check",group:"node",name:"check",stage:"B",summary:"Probe a node's agent and report its health",args:[of],input:Hz({nodeId:o.z.string()}),output:o.z.looseObject({id:o.z.string(),status:o.z.string(),checkedAt:o.z.string()}),outputPinned:!1,handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.checkNode(n);return e.output.json?{data:o}:{data:o,columns:[{key:"id",header:"node"},{key:"status",header:"status"},{key:"checkedAt",header:"checked"}]}}},{id:"node sync-local",group:"node",name:"sync-local",stage:"B",write:!0,summary:"Register or refresh the local node connection",input:Fz,output:Bz,outputPinned:!1,handler:async function(e){const t=await pg(e),n=await zg(e,"node sync-local",()=>({method:"POST",path:"/api/nodes/local/sync"}),()=>t.client.nodeAdmin.syncLocalNode());if(n)return{data:n,columns:Gz,message:`Local node \`${n.id}\` synced.`}}},{id:"node folders list",group:"node",name:"folders list",stage:"B",summary:"List the local folders a node exposes",args:[of],input:Hz({nodeId:o.z.string()}),output:o.z.array(pd),handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.listFolders(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Wz,message:o.length?void 0:"No folders matched."}}},{id:"node folders tree",group:"node",name:"folders tree",stage:"B",summary:"Show a node's local folder tree",args:[of],options:[{flags:"--path <path>",description:"Subtree root inside the node filesystem"},{flags:"--depth <depth>",description:"Maximum tree depth"}],input:Hz({nodeId:o.z.string(),path:o.z.string().optional(),depth:o.z.string().optional()}),output:o.z.array(zc),handler:async function(e,t){const n=Xz(t),i=Ig(t,"path"),o=Ig(t,"depth"),a=await pg(e),s=await a.client.nodeAdmin.listFolderTree(n,{...i?{path:i}:{},...o?{depth:Number(o)}:{}},e.signal);return e.output.json?{data:s}:{data:s,columns:[{key:"path",header:"path",width:60},{key:"name",header:"name",width:24},{key:"type",header:"type"}]}}},{id:"node folders add",group:"node",name:"folders add",stage:"B",write:!0,summary:"Register a local folder on a node",args:[of],options:[af],input:Hz({nodeId:o.z.string(),config:o.z.string()}),output:pd,handler:async function(e,t){const n=Xz(t),i=kg(t,"Folder create request"),o=await ef(e,n,"node folders add",[Xh.localFolderPlaces]),a=await zg(e,"node folders add",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/local-folders`,body:i}),()=>o.client.nodeAdmin.createFolder(n,i));if(a)return{data:a,columns:Wz,message:`Folder \`${a.id}\` added.`}}},{id:"node folders update",group:"node",name:"folders update",stage:"B",write:!0,summary:"Update a node local folder",args:[of,{name:"folderId",description:"Local folder ID",required:!0}],options:[af],input:Hz({nodeId:o.z.string(),folderId:o.z.string(),config:o.z.string()}),output:pd,handler:async function(e,t){const n=Xz(t),i=yg(t,"folderId"),o=kg(t,"Folder update request"),a=await ef(e,n,"node folders update",[Xh.localFolderPlaces,Xh.localFolderNameUpdate]),s=await zg(e,"node folders update",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/local-folders/${encodeURIComponent(i)}`,body:o}),()=>a.client.nodeAdmin.updateFolder(n,i,o));if(s)return{data:s,columns:Wz,message:`Folder \`${i}\` updated.`}}},{id:"node folders remove",group:"node",name:"folders remove",stage:"B",write:!0,summary:"Remove a node local folder",args:[of,{name:"folderId",description:"Local folder ID",required:!0}],input:Hz({nodeId:o.z.string(),folderId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),outputPinned:!1,handler:async function(e,t){const n=Xz(t),i=yg(t,"folderId"),o=await ef(e,n,"node folders remove",[Xh.localFolderPlaces]),a=await zg(e,"node folders remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/local-folders/${encodeURIComponent(i)}`}),()=>o.client.nodeAdmin.removeFolder(n,i));if(a)return{data:a,message:`Folder \`${i}\` removed.`}}},{id:"node runtimes list",group:"node",name:"runtimes list",stage:"B",summary:"List the container runtimes a node exposes",args:[of],input:Hz({nodeId:o.z.string()}),output:o.z.array(tc),handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.listRuntimes(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Yz,message:o.length?void 0:"No runtimes matched."}}},{id:"node runtimes create",group:"node",name:"runtimes create",stage:"B",write:!0,summary:"Create a runtime on a node",args:[of],options:[af],input:Hz({nodeId:o.z.string(),config:o.z.string()}),output:tc,handler:async function(e,t){const n=Xz(t),i=kg(t,"Runtime create request"),o=await pg(e),a=await zg(e,"node runtimes create",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/runtimes`,body:i}),()=>o.client.nodeAdmin.createRuntime(n,i));if(a)return{data:a,columns:Yz,message:`Runtime \`${a.id}\` created.`}}},{id:"node runtimes update",group:"node",name:"runtimes update",stage:"B",write:!0,summary:"Update a node runtime",args:[of,{name:"runtimeId",description:"Runtime ID",required:!0}],options:[af],input:Hz({nodeId:o.z.string(),runtimeId:o.z.string(),config:o.z.string()}),output:tc,handler:async function(e,t){const n=Xz(t),i=yg(t,"runtimeId"),o=kg(t,"Runtime update request"),a=await pg(e),s=await zg(e,"node runtimes update",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/runtimes/${encodeURIComponent(i)}`,body:o}),()=>a.client.nodeAdmin.updateRuntime(n,i,o));if(s)return{data:s,columns:Yz,message:`Runtime \`${i}\` updated.`}}},{id:"node runtimes remove",group:"node",name:"runtimes remove",stage:"B",write:!0,summary:"Remove a node runtime",args:[of,{name:"runtimeId",description:"Runtime ID",required:!0}],input:Hz({nodeId:o.z.string(),runtimeId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),outputPinned:!1,handler:async function(e,t){const n=Xz(t),i=yg(t,"runtimeId"),o=await pg(e),a=await zg(e,"node runtimes remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/runtimes/${encodeURIComponent(i)}`}),()=>o.client.nodeAdmin.removeRuntime(n,i));if(a)return{data:a,message:`Runtime \`${i}\` removed.`}}},{id:"node runtimes check",group:"node",name:"runtimes check",stage:"B",summary:"Probe a node runtime and report its health",args:[of,{name:"runtimeId",description:"Runtime ID",required:!0}],input:Hz({nodeId:o.z.string(),runtimeId:o.z.string()}),output:tc,outputPinned:!1,handler:async function(e,t){const n=Xz(t),i=yg(t,"runtimeId"),o=await pg(e),a=await o.client.nodeAdmin.checkRuntime(n,i);return e.output.json?{data:a}:{data:a,columns:Yz}}},{id:"node docker images",group:"node",name:"docker images",stage:"B",summary:"List docker images available on a node",args:[of],input:Hz({nodeId:o.z.string()}),output:nf.dockerImages,outputPinned:!1,handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.listDockerImages(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Kz,message:o.length?void 0:"No docker images matched."}}},{id:"node image-options",group:"node",name:"image-options",stage:"B",summary:"List image options a node can provision",args:[of],input:Hz({nodeId:o.z.string()}),output:nf.imageOptions,handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.imageOptions(n,e.signal);return e.output.json?{data:o}:{data:o,columns:[{key:"id",header:"image"},{key:"name",header:"name",width:24},{key:"reference",header:"reference",width:40}]}}},{id:"node settings external-listener show",group:"node",name:"settings external-listener show",stage:"B",summary:"Show a node's external listener settings",args:[of],input:Hz({nodeId:o.z.string()}),output:nf.externalListener,handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.getExternalListener(n,e.signal);return e.output.json?{data:o}:{data:o,columns:[{key:"bindScope",header:"bind scope"},{key:"port",header:"port"},{key:"enabled",header:"enabled"}]}}},{id:"node settings external-listener set",group:"node",name:"settings external-listener set",stage:"B",write:!0,summary:"Update a node's external listener settings",args:[of],options:[af],input:Hz({nodeId:o.z.string(),config:o.z.string()}),output:nf.externalListener,handler:async function(e,t){const n=Xz(t),i=kg(t,"External listener update request"),o=await pg(e),a=await zg(e,"node settings external-listener set",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/settings/external-listener`,body:i}),()=>Ou(o,()=>o.client.nodeAdmin.updateExternalListener(n,i)));if(a)return{data:a,message:`External listener for \`${n}\` updated.`}}},{id:"node settings model-relay show",group:"node",name:"settings model-relay show",stage:"B",summary:"Show a node's model relay settings",args:[of],input:Hz({nodeId:o.z.string()}),output:nf.modelRelay,handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.getModelRelay(n,e.signal);return e.output.json?{data:o}:{data:o,columns:[{key:"enabled",header:"enabled"},{key:"source",header:"source"},{key:"endpoint",header:"endpoint",width:40}]}}},{id:"node settings model-relay set",group:"node",name:"settings model-relay set",stage:"B",write:!0,summary:"Update a node's model relay settings",args:[of],options:[af],input:Hz({nodeId:o.z.string(),config:o.z.string()}),output:nf.modelRelay,handler:async function(e,t){const n=Xz(t),i=kg(t,"Model relay update request"),o=await ef(e,n,"node settings model-relay set",[Xh.modelRelay]),a=await zg(e,"node settings model-relay set",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/settings/model-relay`,body:i}),()=>o.client.nodeAdmin.updateModelRelay(n,i));if(a)return{data:a,message:`Model relay for \`${n}\` updated.`}}},{id:"node updates jobs",group:"node",name:"updates jobs",stage:"B",summary:"List node update jobs",args:[of],input:Hz({nodeId:o.z.string()}),output:o.z.array(ad),handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.updateJobs(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Jz,message:o.length?void 0:"No update jobs matched."}}},{id:"node updates check",group:"node",name:"updates check",stage:"B",summary:"Check whether a node update is available",args:[of],options:[{flags:"--config <file>",description:"Update check request JSON (optional)"}],input:Hz({nodeId:o.z.string(),config:o.z.string().optional()}),output:od,handler:async function(e,t){const n=Xz(t),i=Ig(t,"config")?kg(t,"Update check request"):{},o=await pg(e),a=await o.client.nodeAdmin.checkUpdate(n,i);return e.output.json?{data:a}:{data:a,columns:[{key:"availableVersion",header:"available"},{key:"channel",header:"channel"},{key:"currentVersion",header:"current"}]}}},{id:"node updates apply",group:"node",name:"updates apply",stage:"B",write:!0,summary:"Apply a node update and optionally wait for it to finish",args:[of],options:[af,{flags:"--wait",description:"Poll the update job until it reaches a terminal state"}],input:Hz({nodeId:o.z.string(),config:o.z.string(),wait:o.z.boolean().optional()}),output:ad,handler:async function(e,t){const n=Xz(t),i=kg(t,"Update apply request"),o=!0===t.options.wait,a=await pg(e),s=await zg(e,"node updates apply",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/updates/apply`,body:i}),()=>Ou(a,()=>a.client.nodeAdmin.applyUpdate(n,i)));if(!s)return;if(!o)return{data:s,columns:Jz,message:`Update job \`${s.id}\` queued (status ${s.status}).`};let r=s;for(;;){if(tf.has(r.status))return{data:r,columns:Jz,message:`Update job \`${r.id}\` finished with status ${r.status}.`};if(await e.sleep(2e3),e.signal.aborted)throw new h("CLI_CANCELLED","Stopped waiting for the update job; the job keeps running on the server.",15,{jobId:r.id});r=(await a.client.nodeAdmin.updateJobs(n,e.signal)).find(e=>e.id===s.id)??r}}},{id:"node pairing invite",group:"node",name:"pairing invite",stage:"B",write:!0,summary:"Create a pairing invite token for a node",args:[of],options:[{flags:"--config <file>",description:"Pairing invite request JSON (optional)"}],input:Hz({nodeId:o.z.string(),config:o.z.string().optional()}),output:nf.pairingInvite,handler:async function(e,t){const n=Xz(t),i=Ig(t,"config")?kg(t,"Pairing invite request"):{},o=await pg(e),a=await zg(e,"node pairing invite",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/pairing/invites`,body:i}),()=>o.client.nodeAdmin.createPairingInvite(n,i));if(a)return ag(a.joinToken),{data:a,message:`Pairing invite for \`${n}\` created (expires ${a.expiresAt}).`}}},{id:"node pairings list",group:"node",name:"pairings list",stage:"B",summary:"List the control plane pairings registered on a node",args:[of],input:Hz({nodeId:o.z.string()}),output:nf.pairings,handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.listControlPlanePairings(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Zz,message:o.length?void 0:"No pairings matched."}}},{id:"node pairings remove",group:"node",name:"pairings remove",stage:"B",write:!0,summary:"Revoke a control plane pairing on a node",args:[of,{name:"keyId",description:"Pairing key ID",required:!0}],input:Hz({nodeId:o.z.string(),keyId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),outputPinned:!1,handler:async function(e,t){const n=Xz(t),i=yg(t,"keyId"),o=await pg(e),a=await zg(e,"node pairings remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/control-plane-pairings/${encodeURIComponent(i)}`}),()=>o.client.nodeAdmin.removeControlPlanePairing(n,i));if(a)return{data:a,message:`Pairing \`${i}\` removed from \`${n}\`.`}}},{id:"node connections list",group:"node",name:"connections list",stage:"B",summary:"List the control plane connections configured on a node",args:[of],input:Hz({nodeId:o.z.string()}),output:nf.connections,handler:async function(e,t){const n=Xz(t),i=await pg(e),o=await i.client.nodeAdmin.listControlPlaneConnections(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Qz,message:o.length?void 0:"No connections matched."}}},{id:"node connections create",group:"node",name:"connections create",stage:"B",write:!0,summary:"Create a control plane connection on a node",args:[of],options:[af],input:Hz({nodeId:o.z.string(),config:o.z.string()}),output:nf.connectionCreate,handler:async function(e,t){const n=Xz(t),i=kg(t,"Connection create request"),o=await pg(e),a=await zg(e,"node connections create",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/control-plane-connections`,body:i}),()=>o.client.nodeAdmin.createControlPlaneConnection(n,i));if(a)return{data:a,columns:Qz,message:`Connection created for \`${n}\`.`}}},{id:"node connections remove",group:"node",name:"connections remove",stage:"B",write:!0,summary:"Remove a control plane connection from a node",args:[of,{name:"connectionId",description:"Connection ID",required:!0}],input:Hz({nodeId:o.z.string(),connectionId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),outputPinned:!1,handler:async function(e,t){const n=Xz(t),i=yg(t,"connectionId"),o=await pg(e),a=await zg(e,"node connections remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/control-plane-connections/${encodeURIComponent(i)}`}),()=>o.client.nodeAdmin.removeControlPlaneConnection(n,i));if(a)return{data:a,message:`Connection \`${i}\` removed from \`${n}\`.`}}}],rf=Vz("node-join","Join a node to the Control Plane",[{id:"node-join invite",group:"node-join",name:"invite",stage:"B",write:!0,summary:"Create a node join invite token",options:[{flags:"--config <file>",description:"Join invite request JSON (optional)"}],input:Hz({config:o.z.string().optional()}),output:o.z.looseObject({id:o.z.string(),expiresAt:o.z.string(),joinToken:o.z.string().optional()}),handler:async function(e,t){const n=Ig(t,"config")?kg(t,"Join invite request"):{},i=await pg(e),o=await zg(e,"node-join invite",()=>({method:"POST",path:"/api/node-join/invites",body:n}),()=>i.client.nodeAdmin.createJoinInvite(n));if(o)return ag(o.joinToken),{data:o,columns:[{key:"id",header:"invite"},{key:"expiresAt",header:"expires"}],message:`Join invite \`${o.id}\` created.`}}},{id:"node-join status",group:"node-join",name:"status",stage:"B",summary:"Show whether a node join invite was completed",args:[{name:"inviteId",description:"Join invite ID",required:!0}],input:Hz({inviteId:o.z.string()}),output:Qd,handler:async function(e,t){const n=yg(t,"inviteId"),i=await pg(e),o=await i.client.nodeAdmin.joinInviteStatus(n,e.signal);return e.output.json?{data:o}:{data:o,columns:[{key:"id",header:"invite"},{key:"status",header:"status"},{key:"nodeId",header:"node"}]}}},{id:"node-join complete",group:"node-join",name:"complete",stage:"B",write:!0,summary:"Complete a node join from a JSON request body",options:[af],input:Hz({config:o.z.string()}),output:Bz,outputPinned:!1,handler:async function(e,t){const n=kg(t,"Join completion request"),i=await pg(e),o=await zg(e,"node-join complete",()=>({method:"POST",path:"/api/node-join/complete",body:n}),()=>i.client.nodeAdmin.completeJoin(n));if(o)return{data:o,columns:[{key:"id",header:"node"},{key:"name",header:"name",width:24},{key:"status",header:"status"}],message:`Node \`${o.id}\` joined the Control Plane.`}}}]),df=[{key:"id",header:"project"},{key:"name",header:"name",width:24},{key:"defaultNodeId",header:"node"},{key:"updatedAt",header:"updated"}],cf=[{key:"id",header:"image"},{key:"name",header:"name",width:24},{key:"reference",header:"reference",width:40},{key:"pullPolicy",header:"pull"}],lf=[{key:"id",header:"model"},{key:"name",header:"name",width:24},{key:"model",header:"model id",width:30},{key:"app",header:"app"},{key:"enabled",header:"enabled"}],mf=[{key:"id",header:"model"},{key:"name",header:"name",width:24},{key:"model",header:"model id",width:30},{key:"referenceCount",header:"refs"}],pf=[{key:"id",header:"template"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],uf=[{key:"id",header:"credential"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],gf=[{key:"credentialId",header:"credential"},{key:"instanceId",header:"instance"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}];async function hf(e,t,n){return!0!==e.options["token-stdin"]||n(t,await Sg(e)),t}const zf=[{key:"id",header:"bridge"},{key:"channel",header:"channel"},{key:"name",header:"name",width:24},{key:"running",header:"running"},{key:"tokenSet",header:"token"}],ff=[{key:"id",header:"session"},{key:"channel",header:"channel"},{key:"bridgeId",header:"bridge"},{key:"chatId",header:"chat"},{key:"updatedAt",header:"updated"}],yf=[{key:"id",header:"session"},{key:"userAgent",header:"client",width:30},{key:"createdAt",header:"created"},{key:"expiresAt",header:"expires"}];async function If(e,t){const n=kg(e,t);if(!0===e.options["token-stdin"]){const t=await Sg(e);n.token=t,ag(t)}return n}const bf=[{key:"publicBaseUrl",header:"public base url",width:40},{key:"updateChannel",header:"channel"},{key:"mentionTrigger",header:"mention"},{key:"commandTrigger",header:"command"},{key:"diagnosticLogs",header:"logs"}],wf=[{key:"id",header:"invite"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"},{key:"createdAt",header:"created"}],vf=[{key:"id",header:"binding"},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],xf=[{key:"id",header:"claim"},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"}],Af=[{key:"bindingId",header:"binding"},{key:"activeHttp",header:"http"},{key:"activeStreams",header:"streams"},{key:"activeWebSockets",header:"websockets"}],kf={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},Sf={output:Bz,outputPinned:!1},Cf=Vz("project","Manage catalog projects",[{id:"project list",group:"project",name:"list",stage:"B",summary:"List projects",input:Fz,output:o.z.array(wd),handler:async function(e){const t=await pg(e),n=await t.client.catalog.listProjects(e.signal);return e.output.json?{data:n}:{data:n,columns:df,message:n.length?void 0:"No projects matched."}}},{id:"project show",group:"project",name:"show",stage:"B",summary:"Show one project",args:[{name:"projectId",description:"Project ID",required:!0}],input:Hz({projectId:o.z.string()}),output:wd,handler:async function(e,t){const n=yg(t,"projectId"),i=await pg(e),o=await i.client.catalog.getProject(n,e.signal);return e.output.json?{data:o}:{data:o,columns:df}}},{id:"project create",group:"project",name:"create",stage:"B",write:!0,summary:"Create a project from a JSON request body",options:[kf],input:Hz({config:o.z.string()}),output:wd,handler:async function(e,t){const n=kg(t,"Project create request"),i=await pg(e),o=await zg(e,"project create",()=>({method:"POST",path:"/api/projects",body:n}),()=>i.client.catalog.createProject(n));if(o)return{data:o,columns:df,message:`Project \`${o.id}\` created.`}}},{id:"project update",group:"project",name:"update",stage:"B",write:!0,summary:"Update a project",args:[{name:"projectId",description:"Project ID",required:!0}],options:[kf],input:Hz({projectId:o.z.string(),config:o.z.string()}),output:wd,handler:async function(e,t){const n=yg(t,"projectId"),i=kg(t,"Project update request"),o=await pg(e),a=await zg(e,"project update",()=>({method:"PATCH",path:`/api/projects/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateProject(n,i));if(a)return{data:a,columns:df,message:`Project \`${n}\` updated.`}}},{id:"project remove",group:"project",name:"remove",stage:"B",write:!0,summary:"Remove a project",args:[{name:"projectId",description:"Project ID",required:!0}],input:Hz({projectId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"projectId"),i=await pg(e),o=await zg(e,"project remove",()=>({method:"DELETE",path:`/api/projects/${encodeURIComponent(n)}`}),()=>i.client.catalog.removeProject(n));if(o)return{data:o,message:`Project \`${n}\` removed.`}}}]),jf=Vz("image","Manage custom images",[{id:"image list",group:"image",name:"list",stage:"B",summary:"List custom images",input:Fz,output:o.z.array(Hd),handler:async function(e){const t=await pg(e),n=await t.client.catalog.listImages(e.signal);return e.output.json?{data:n}:{data:n,columns:cf,message:n.length?void 0:"No images matched."}}},{id:"image show",group:"image",name:"show",stage:"B",summary:"Show one image",args:[{name:"imageId",description:"Image ID",required:!0}],input:Hz({imageId:o.z.string()}),output:Hd,handler:async function(e,t){const n=yg(t,"imageId"),i=await pg(e),o=await i.client.catalog.getImage(n,e.signal);return e.output.json?{data:o}:{data:o,columns:cf}}},{id:"image create",group:"image",name:"create",stage:"B",write:!0,summary:"Create a custom image from a JSON request body",options:[kf],input:Hz({config:o.z.string()}),output:Hd,handler:async function(e,t){const n=kg(t,"Image create request"),i=await pg(e),o=await zg(e,"image create",()=>({method:"POST",path:"/api/images",body:n}),()=>i.client.catalog.createImage(n));if(o)return{data:o,columns:cf,message:`Image \`${o.id}\` created.`}}},{id:"image update",group:"image",name:"update",stage:"B",write:!0,summary:"Update a custom image",args:[{name:"imageId",description:"Image ID",required:!0}],options:[kf],input:Hz({imageId:o.z.string(),config:o.z.string()}),output:Hd,handler:async function(e,t){const n=yg(t,"imageId"),i=kg(t,"Image update request"),o=await pg(e),a=await zg(e,"image update",()=>({method:"PATCH",path:`/api/images/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateImage(n,i));if(a)return{data:a,columns:cf,message:`Image \`${n}\` updated.`}}},{id:"image remove",group:"image",name:"remove",stage:"B",write:!0,summary:"Remove a custom image",args:[{name:"imageId",description:"Image ID",required:!0}],input:Hz({imageId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"imageId"),i=await pg(e),o=await zg(e,"image remove",()=>({method:"DELETE",path:`/api/images/${encodeURIComponent(n)}`}),()=>i.client.catalog.removeImage(n));if(o)return{data:o,message:`Image \`${n}\` removed.`}}},{id:"image options",group:"image",name:"options",stage:"B",summary:"List selectable image options",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.catalog.imageOptions(e.signal);return e.output.json?{data:n}:{data:n,columns:[{key:"id",header:"image"},{key:"name",header:"name",width:24},{key:"reference",header:"reference",width:40}]}}}]),Rf=Vz("market","Inspect the market catalog",[{id:"market catalog",group:"market",name:"catalog",stage:"B",summary:"Show the market catalog snapshot",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.catalog.marketCatalog(e.signal);return e.output.json?{data:n}:{data:n,columns:[{key:"image.id",header:"image"},{key:"image.name",header:"name",width:30},{key:"status",header:"status"}]}}},{id:"market refresh",group:"market",name:"refresh",stage:"B",write:!0,summary:"Refresh the market catalog from its source",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await zg(e,"market refresh",()=>({method:"POST",path:"/api/market/refresh"}),()=>t.client.catalog.refreshMarketCatalog());if(n)return{data:n,message:`Market catalog refreshed (${n.catalog.items?.length??0} images).`}}}]),Tf=[{id:"model create",group:"model",name:"create",stage:"B",write:!0,summary:"Create a model from a JSON request body",options:[kf],input:Hz({config:o.z.string()}),...Sf,handler:async function(e,t){const n=kg(t,"Model create request"),i=await pg(e),o=await zg(e,"model create",()=>({method:"POST",path:"/api/models",body:n}),()=>i.client.catalog.createModel(n));if(o)return{data:o,message:`Model \`${o.id}\` created.`}}},{id:"model copy",group:"model",name:"copy",stage:"B",write:!0,summary:"Copy a model",args:[{name:"modelId",description:"Model entity ID",required:!0}],options:[kf],input:Hz({modelId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"modelId"),i=kg(t,"Model copy request"),o=await pg(e),a=await zg(e,"model copy",()=>({method:"POST",path:`/api/models/${encodeURIComponent(n)}/copy`,body:i}),()=>o.client.catalog.copyModel(n,i));if(a)return{data:a,message:`Model \`${a.id}\` copied from \`${n}\`.`}}},{id:"model discover",group:"model",name:"discover",stage:"B",summary:"Discover models behind an endpoint",options:[kf],input:Hz({config:o.z.string()}),...Sf,handler:async function(e,t){const n=kg(t,"Model discovery request"),i=await pg(e),o=await i.client.catalog.discoverModels(n);return e.output.json?{data:o}:{data:o.models,columns:[{key:"id",header:"model"},{key:"ownedBy",header:"owned by"}],message:o.models.length?void 0:"No models discovered."}}},{id:"model test",group:"model",name:"test",stage:"B",summary:"Test a model endpoint",options:[kf],input:Hz({config:o.z.string()}),...Sf,handler:async function(e,t){const n=kg(t,"Model test request"),i=await pg(e),o=await i.client.catalog.testModel(n);return e.output.json?{data:o}:{data:o,message:`Model test succeeded in ${o.latencyMs}ms.`}}},{id:"model reorder",group:"model",name:"reorder",stage:"B",write:!0,summary:"Reorder models",options:[{flags:"--id <modelId>",description:"Model entity ID in the new order",repeatable:!0}],input:Hz({id:o.z.array(o.z.string()).optional()}),...Sf,handler:async function(e,t){const n=wg(t,"id");if(!n.length)throw bg(t,"id");const i=await pg(e),o=await zg(e,"model reorder",()=>({method:"POST",path:"/api/models/reorder",body:{ids:n}}),()=>i.client.catalog.reorderModels(n));if(o)return{data:o,columns:lf,message:`${o.length} models reordered.`}}},{id:"model update",group:"model",name:"update",stage:"B",write:!0,summary:"Update a model",args:[{name:"modelId",description:"Model entity ID",required:!0}],options:[kf],input:Hz({modelId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"modelId"),i=kg(t,"Model update request"),o=await pg(e),a=await zg(e,"model update",()=>({method:"PATCH",path:`/api/models/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateModel(n,i));if(a)return{data:a,message:`Model \`${n}\` updated.`}}},{id:"model sync",group:"model",name:"sync",stage:"B",write:!0,summary:"Sync a model to its assigned nodes",args:[{name:"modelId",description:"Model entity ID",required:!0}],input:Hz({modelId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"modelId"),i=await pg(e),o=await zg(e,"model sync",()=>({method:"POST",path:`/api/models/${encodeURIComponent(n)}/sync`}),()=>i.client.catalog.syncModel(n));if(o)return{data:o,message:`Model \`${n}\` synced.`}}},{id:"model merge",group:"model",name:"merge",stage:"B",write:!0,summary:"Merge duplicate model entities",args:[{name:"modelId",description:"Model entity ID",required:!0}],options:[kf],input:Hz({modelId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"modelId"),i=kg(t,"Model merge request"),o=await pg(e),a=await zg(e,"model merge",()=>({method:"POST",path:`/api/models/${encodeURIComponent(n)}/merge`,body:i}),()=>o.client.catalog.mergeModel(n,i));if(a)return{data:a,message:`Model \`${n}\` merged.`}}},{id:"model remove",group:"model",name:"remove",stage:"B",write:!0,summary:"Remove a model",args:[{name:"modelId",description:"Model entity ID",required:!0}],input:Hz({modelId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"modelId"),i=await pg(e),o=await zg(e,"model remove",()=>({method:"DELETE",path:`/api/models/${encodeURIComponent(n)}`}),()=>i.client.catalog.removeModel(n));if(o)return{data:o,message:`Model \`${n}\` removed.`}}},{id:"model node list",group:"model",name:"node list",stage:"B",summary:"List models deployed to a node",args:[{name:"nodeId",description:"Node ID",required:!0}],input:Hz({nodeId:o.z.string()}),output:o.z.array(xd),handler:async function(e,t){const n=yg(t,"nodeId"),i=await pg(e),o=await i.client.catalog.listModels({signal:e.signal}),a=e=>"node"===e.type&&e.nodeId===n,s=o.models.filter(e=>e.locations.some(a)),r=s.map(e=>({id:e.id,name:e.model.name,model:e.model.model,referenceCount:e.locations.filter(a).length}));return e.output.json?{data:s}:{data:r,columns:mf,message:r.length?void 0:`No node-scoped models for \`${n}\`.`}}},{id:"model node create",group:"model",name:"node create",stage:"B",write:!0,summary:"Deploy a model to a node",args:[{name:"nodeId",description:"Node ID",required:!0}],options:[kf],input:Hz({nodeId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"nodeId"),i=kg(t,"Node model create request"),o=await pg(e),a=await zg(e,"model node create",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/models`,body:i}),()=>o.client.catalog.createModelOnNode(n,i));if(a)return{data:a,message:`Model deployed to node \`${n}\`.`}}},{id:"model node update",group:"model",name:"node update",stage:"B",write:!0,summary:"Update a node-scoped model",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"modelId",description:"Model entity ID",required:!0}],options:[kf],input:Hz({nodeId:o.z.string(),modelId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"nodeId"),i=yg(t,"modelId"),o=kg(t,"Node model update request"),a=await pg(e),s=await zg(e,"model node update",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/models/${encodeURIComponent(i)}`,body:o}),()=>a.client.catalog.updateModelOnNode(n,i,o));if(s)return{data:s,message:`Node \`${n}\` model \`${i}\` updated.`}}},{id:"model node remove",group:"model",name:"node remove",stage:"B",write:!0,summary:"Remove a node-scoped model",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"modelId",description:"Model entity ID",required:!0}],input:Hz({nodeId:o.z.string(),modelId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"nodeId"),i=yg(t,"modelId"),o=await pg(e),a=await zg(e,"model node remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/models/${encodeURIComponent(i)}`}),()=>o.client.catalog.removeModelOnNode(n,i));if(a)return{data:a,message:`Node \`${n}\` model \`${i}\` removed.`}}},{id:"model node discover",group:"model",name:"node discover",stage:"B",summary:"Discover models from a node",args:[{name:"nodeId",description:"Node ID",required:!0}],options:[kf],input:Hz({nodeId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"nodeId"),i=kg(t,"Node model discovery request"),o=await pg(e),a=await o.client.catalog.discoverModelsOnNode(n,i);return e.output.json?{data:a}:{data:a.models,columns:[{key:"id",header:"model"},{key:"ownedBy",header:"owned by"}],message:a.models.length?void 0:"No models discovered."}}},{id:"model node test",group:"model",name:"node test",stage:"B",summary:"Test a node model endpoint",args:[{name:"nodeId",description:"Node ID",required:!0}],options:[kf],input:Hz({nodeId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"nodeId"),i=kg(t,"Node model test request"),o=await pg(e),a=await o.client.catalog.testModelOnNode(n,i);return e.output.json?{data:a}:{data:a,message:`Node \`${n}\` model test succeeded in ${a.latencyMs}ms.`}}}],$f=[Cf,jf,Rf,Vz("env-template","Manage node environment templates",[{id:"env-template list",group:"env-template",name:"list",stage:"B",summary:"List environment templates for a node",args:[{name:"nodeId",description:"Node ID",required:!0}],input:Hz({nodeId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"nodeId"),i=await pg(e),o=await i.client.environmentTemplates.listForNode(n,e.signal);return e.output.json?{data:o}:{data:o,columns:pf,message:o.length?void 0:"No environment templates matched."}}},{id:"env-template show",group:"env-template",name:"show",stage:"B",summary:"Show one environment template",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"templateId",description:"Environment template ID",required:!0}],input:Hz({nodeId:o.z.string(),templateId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"nodeId"),i=yg(t,"templateId"),o=await pg(e),a=await o.client.environmentTemplates.get(n,i,e.signal);return e.output.json?{data:a}:{data:a,columns:pf}}},{id:"env-template create",group:"env-template",name:"create",stage:"B",write:!0,summary:"Create an environment template from an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],options:[kf],input:Hz({instanceId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"instanceId"),i=kg(t,"Environment template create request"),o=await pg(e),a=await zg(e,"env-template create",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/environment-templates`,body:i}),()=>o.client.environmentTemplates.createFromInstance(n,i));if(a)return{data:a,columns:pf,message:`Environment template \`${a.id}\` created from \`${n}\`.`}}},{id:"env-template remove",group:"env-template",name:"remove",stage:"B",write:!0,summary:"Remove an environment template",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"templateId",description:"Environment template ID",required:!0}],input:Hz({nodeId:o.z.string(),templateId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"nodeId"),i=yg(t,"templateId"),o=await pg(e),a=await zg(e,"env-template remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}/environment-templates/${encodeURIComponent(i)}`}),()=>o.client.environmentTemplates.remove(n,i));if(a)return{data:a,message:`Environment template \`${i}\` removed from \`${n}\`.`}}}]),Vz("git-credential","Manage managed git credentials",[{id:"git-credential list",group:"git-credential",name:"list",stage:"B",summary:"List git credentials",input:Fz,output:o.z.looseObject({items:o.z.array(ws)}),handler:async function(e){const t=await pg(e),n=await t.client.gitCredentials.listCredentials(e.signal);return e.output.json?{data:n}:{data:n.items,columns:uf,message:n.items.length?void 0:"No git credentials matched."}}},{id:"git-credential show",group:"git-credential",name:"show",stage:"B",summary:"Show one git credential",args:[{name:"credentialId",description:"Git credential ID",required:!0}],input:Hz({credentialId:o.z.string()}),output:ws,handler:async function(e,t){const n=yg(t,"credentialId"),i=await pg(e),o=await i.client.gitCredentials.getCredential(n,e.signal);return e.output.json?{data:o}:{data:o,columns:uf}}},{id:"git-credential create",group:"git-credential",name:"create",stage:"B",write:!0,summary:"Create a git credential from a JSON request body",options:[kf],input:Hz({config:o.z.string()}),output:ws,handler:async function(e,t){const n=await hf(t,kg(t,"Git credential create request"),(e,t)=>{const n=e.secret&&"object"==typeof e.secret?e.secret:{};e.secret={...n,token:t}}),i=await pg(e),o=await zg(e,"git-credential create",()=>({method:"POST",path:"/api/git-credentials",body:n}),()=>i.client.gitCredentials.createCredential(n));if(o)return{data:o,columns:uf,message:`Git credential \`${o.id}\` created.`}}},{id:"git-credential update",group:"git-credential",name:"update",stage:"B",write:!0,summary:"Update a git credential",args:[{name:"credentialId",description:"Git credential ID",required:!0}],options:[kf],input:Hz({credentialId:o.z.string(),config:o.z.string()}),output:ws,handler:async function(e,t){const n=yg(t,"credentialId"),i=await hf(t,kg(t,"Git credential update request"),(e,t)=>{const n=e.secret&&"object"==typeof e.secret?e.secret:{};e.secret={...n,token:t}}),o=await pg(e),a=await zg(e,"git-credential update",()=>({method:"PATCH",path:`/api/git-credentials/${encodeURIComponent(n)}`,body:i}),()=>o.client.gitCredentials.updateCredential(n,i));if(a)return{data:a,columns:uf,message:`Git credential \`${n}\` updated.`}}},{id:"git-credential remove",group:"git-credential",name:"remove",stage:"B",write:!0,summary:"Remove a git credential",args:[{name:"credentialId",description:"Git credential ID",required:!0}],input:Hz({credentialId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"credentialId"),i=await pg(e),o=await zg(e,"git-credential remove",()=>({method:"DELETE",path:`/api/git-credentials/${encodeURIComponent(n)}`}),()=>i.client.gitCredentials.removeCredential(n));if(o)return{data:o,message:`Git credential \`${n}\` removed.`}}},{id:"git-credential assignments list",group:"git-credential",name:"assignments list",stage:"B",summary:"List git credential assignments of an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],input:Hz({instanceId:o.z.string()}),output:o.z.array(Ss),handler:async function(e,t){const n=yg(t,"instanceId"),i=await pg(e);await iz(i.client,n,"git-credential assignments list",Xh.managedGitCredentials,e.signal);const o=await i.client.gitCredentials.listInstanceAssignments(n,e.signal);return e.output.json?{data:o}:{data:o,columns:gf,message:o.length?void 0:"No git credential assignments matched."}}},{id:"git-credential assignments assign",group:"git-credential",name:"assignments assign",stage:"B",write:!0,summary:"Assign a git credential to an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],options:[{flags:"--credential <credentialId>",description:"Git credential ID"}],input:Hz({instanceId:o.z.string(),credential:o.z.string()}),output:Ss,handler:async function(e,t){const n=yg(t,"instanceId"),i=bg(t,"credential"),o=await pg(e);await iz(o.client,n,"git-credential assignments assign",Xh.managedGitCredentials,e.signal);const a=await zg(e,"git-credential assignments assign",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/git-credential-assignments`,body:{credentialId:i}}),()=>Ou(o,()=>o.client.gitCredentials.assignToInstance(n,{credentialId:i})));if(a)return{data:a,columns:gf,message:`Credential \`${i}\` assigned to \`${n}\`.`}}},{id:"git-credential assignments unassign",group:"git-credential",name:"assignments unassign",stage:"B",write:!0,summary:"Unassign a git credential from an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"credentialId",description:"Git credential ID",required:!0}],input:Hz({instanceId:o.z.string(),credentialId:o.z.string()}),output:o.z.looseObject({revoked:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"credentialId"),o=await pg(e);await iz(o.client,n,"git-credential assignments unassign",Xh.managedGitCredentials,e.signal);const a=await zg(e,"git-credential assignments unassign",()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}/git-credential-assignments/${encodeURIComponent(i)}`}),()=>o.client.gitCredentials.unassignFromInstance(n,i));if(a)return{data:a,message:`Credential \`${i}\` unassigned from \`${n}\`.`}}}]),Vz("chat","Manage the chat gateway",[{id:"chat status",group:"chat",name:"status",stage:"B",summary:"Show the chat gateway status",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.chatGateway.status(e.signal);return e.output.json?{data:n}:{data:n.bridges,columns:zf,message:`Chat gateway ${n.running?"running":"stopped"}.`}}},{id:"chat bridges list",group:"chat",name:"bridges list",stage:"B",summary:"List chat bridges",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.chatGateway.listBridges(e.signal);return e.output.json?{data:n}:{data:n,columns:zf,message:n.length?void 0:"No chat bridges matched."}}},{id:"chat bridges create",group:"chat",name:"bridges create",stage:"B",write:!0,summary:"Create a chat bridge from a JSON request body",options:[kf],input:Hz({config:o.z.string()}),...Sf,handler:async function(e,t){const n=await If(t,"Chat bridge create request"),i=await pg(e),o=await zg(e,"chat bridges create",()=>({method:"POST",path:"/api/chat-gateway/bridges",body:n}),()=>i.client.chatGateway.createBridge(n));if(o)return{data:o,columns:zf,message:`Chat bridge \`${o.id}\` created.`}}},{id:"chat bridges update",group:"chat",name:"bridges update",stage:"B",write:!0,summary:"Update a chat bridge",args:[{name:"bridgeId",description:"Chat bridge ID",required:!0}],options:[kf],input:Hz({bridgeId:o.z.string(),config:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"bridgeId"),i=await If(t,"Chat bridge update request"),o=await pg(e),a=await zg(e,"chat bridges update",()=>({method:"PATCH",path:`/api/chat-gateway/bridges/${encodeURIComponent(n)}`,body:i}),()=>o.client.chatGateway.updateBridge(n,i));if(a)return{data:a,columns:zf,message:`Chat bridge \`${n}\` updated.`}}},{id:"chat bridges start",group:"chat",name:"bridges start",stage:"B",write:!0,summary:"Start a chat bridge",args:[{name:"bridgeId",description:"Chat bridge ID",required:!0}],input:Hz({bridgeId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"bridgeId"),i=await pg(e),o=await zg(e,"chat bridges start",()=>({method:"POST",path:`/api/chat-gateway/bridges/${encodeURIComponent(n)}/start`}),()=>i.client.chatGateway.startBridge(n));if(o)return{data:o,message:`Chat bridge \`${n}\` started (${o.running?"running":"not running"}).`}}},{id:"chat bridges stop",group:"chat",name:"bridges stop",stage:"B",write:!0,summary:"Stop a chat bridge",args:[{name:"bridgeId",description:"Chat bridge ID",required:!0}],input:Hz({bridgeId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"bridgeId"),i=await pg(e),o=await zg(e,"chat bridges stop",()=>({method:"POST",path:`/api/chat-gateway/bridges/${encodeURIComponent(n)}/stop`}),()=>i.client.chatGateway.stopBridge(n));if(o)return{data:o,message:`Chat bridge \`${n}\` stopped (${o.running?"running":"stopped"}).`}}},{id:"chat bridges remove",group:"chat",name:"bridges remove",stage:"B",write:!0,summary:"Remove a chat bridge",args:[{name:"bridgeId",description:"Chat bridge ID",required:!0}],input:Hz({bridgeId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"bridgeId"),i=await pg(e),o=await zg(e,"chat bridges remove",()=>({method:"DELETE",path:`/api/chat-gateway/bridges/${encodeURIComponent(n)}`}),()=>i.client.chatGateway.removeBridge(n));if(o)return{data:o,message:`Chat bridge \`${n}\` removed.`}}},{id:"chat sessions list",group:"chat",name:"sessions list",stage:"B",summary:"List chat sessions",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.chatGateway.listSessions(e.signal);return e.output.json?{data:n}:{data:n,columns:ff,message:n.length?void 0:"No chat sessions matched."}}},{id:"chat sessions show",group:"chat",name:"sessions show",stage:"B",summary:"Show one chat session",args:[{name:"sessionId",description:"Chat session ID",required:!0}],input:Hz({sessionId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"sessionId"),i=await pg(e),o=await i.client.chatGateway.getSession(n,e.signal);return e.output.json?{data:o}:{data:o,columns:ff}}}]),Vz("mobile-session","Manage mobile sessions",[{id:"mobile-session list",group:"mobile-session",name:"list",stage:"B",summary:"List mobile sessions",input:Fz,output:o.z.array(Jo),handler:async function(e){const t=await pg(e),n=await t.client.auth.mobileSessions(e.signal);return e.output.json?{data:n}:{data:n,columns:yf,message:n.length?void 0:"No mobile sessions matched."}}},{id:"mobile-session revoke",group:"mobile-session",name:"revoke",stage:"B",write:!0,summary:"Revoke a mobile session",args:[{name:"sessionId",description:"Mobile session ID",required:!0}],input:Hz({sessionId:o.z.string()}),output:o.z.looseObject({revoked:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"sessionId"),i=await pg(e),o=await zg(e,"mobile-session revoke",()=>({method:"DELETE",path:`/api/auth/mobile/sessions/${encodeURIComponent(n)}`}),()=>i.client.auth.revokeMobileSession(n));if(o)return{data:o,message:`Mobile session \`${n}\` revoked.`}}}]),Vz("control-plane","Inspect and configure the Control Plane",[{id:"control-plane status",group:"control-plane",name:"status",stage:"B",summary:"Show Control Plane status",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.admin.status(e.signal);return e.output.json?{data:n}:{data:n,columns:[{key:"protocolVersion",header:"protocol"},{key:"build.version",header:"version"},{key:"storage.driver",header:"storage"}]}}},{id:"control-plane settings show",group:"control-plane",name:"settings show",stage:"B",summary:"Show Control Plane settings",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.admin.getSettings(e.signal);return e.output.json?{data:n}:{data:n,columns:bf}}},{id:"control-plane settings update",group:"control-plane",name:"settings update",stage:"B",write:!0,summary:"Update Control Plane settings",options:[kf],input:Hz({config:o.z.string()}),...Sf,handler:async function(e,t){const n=kg(t,"Control Plane settings update request"),i=await pg(e),o=await zg(e,"control-plane settings update",()=>({method:"PATCH",path:"/api/control-plane/settings",body:n}),()=>i.client.admin.updateSettings(n));if(o)return{data:o,columns:bf,message:"Control Plane settings updated."}}},{id:"control-plane diagnostic-logs export",group:"control-plane",name:"diagnostic-logs export",stage:"B",summary:"Export diagnostic logs to a file",options:[{flags:"--out <file>",description:"Destination file for the downloaded archive"}],input:Hz({out:o.z.string()}),output:o.z.looseObject({file:o.z.string(),bytes:o.z.number()}),handler:async function(e,n){const o=bg(n,"out"),a=await pg(e),s=await a.client.admin.exportDiagnosticLogs(),r=i.resolve(o);try{t.writeFileSync(r,s.body)}catch(e){throw z("CLI_FILE_UNWRITABLE",`Cannot write \`${r}\`: ${e instanceof Error?e.message:String(e)}`,{file:r})}return{data:{file:r,bytes:s.body.byteLength},message:`Diagnostic logs written to \`${r}\` (${s.body.byteLength} bytes).`}}}]),Vz("cloud","Manage the cloud connectivity binding",[{id:"cloud show",group:"cloud",name:"show",stage:"B",summary:"Show cloud connectivity state",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.admin.cloudConnectivity(e.signal);return e.output.json?{data:n}:{data:n,columns:[{key:"status",header:"status"},{key:"serviceOrigin",header:"service",width:40},{key:"accountId",header:"account"},{key:"remoteAccessEnabled",header:"remote access"}]}}},{id:"cloud challenge",group:"cloud",name:"challenge",stage:"B",write:!0,summary:"Create a cloud binding challenge (the challenge secret is never printed)",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await zg(e,"cloud challenge",()=>({method:"POST",path:"/api/cloud-connectivity/challenges"}),()=>t.client.admin.createCloudChallenge());if(n)return{data:{authorizationUrl:n.authorizationUrl,expiresAt:n.payload.expiresAt,publicKeyFingerprint:n.payload.publicKeyFingerprint},message:`Cloud binding challenge created; open ${n.authorizationUrl} in the cloud console before ${n.payload.expiresAt}.`}}},{id:"cloud remote-access",group:"cloud",name:"remote-access",stage:"B",write:!0,summary:"Enable or disable cloud remote access",options:[{flags:"--enabled <true|false>",description:"Whether remote access should be enabled"}],input:Hz({enabled:o.z.string()}),...Sf,handler:async function(e,t){const n=function(e,t){const n=e.options[t];if(!0===n)return!0;if(!1===n)return!1;if("true"===n)return!0;if("false"===n)return!1;throw z("CLI_OPTION_MISSING",`Missing required option --${t} <true|false>.`,{option:t})}(t,"enabled"),i=await pg(e),o=await zg(e,"cloud remote-access",()=>({method:"POST",path:"/api/cloud-connectivity/remote-access",body:{enabled:n}}),()=>i.client.admin.setCloudRemoteAccess(n));if(o)return{data:o,message:`Cloud remote access ${n?"enabled":"disabled"}.`}}},{id:"cloud disconnect",group:"cloud",name:"disconnect",stage:"B",write:!0,summary:"Disconnect the cloud binding",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await zg(e,"cloud disconnect",()=>({method:"POST",path:"/api/cloud-connectivity/disconnect"}),()=>t.client.admin.disconnectCloud());if(n)return{data:n,message:`Cloud binding is now ${n.status}.`}}}]),Vz("proxy","Manage the control-plane proxy",[{id:"proxy invites list",group:"proxy",name:"invites list",stage:"B",summary:"List proxy invites",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.admin.proxyInvites(e.signal);return e.output.json?{data:n}:{data:n,columns:wf,message:n.length?void 0:"No proxy invites matched."}}},{id:"proxy invites create",group:"proxy",name:"invites create",stage:"B",write:!0,summary:"Create a proxy invite",options:[kf],input:Hz({config:o.z.string()}),...Sf,handler:async function(e,t){const n=kg(t,"Proxy invite create request"),i=await pg(e),o=await zg(e,"proxy invites create",()=>({method:"POST",path:"/api/control-plane-proxy/invites",body:n}),()=>i.client.admin.createProxyInvite(n));if(o)return{data:o,columns:wf,message:"Proxy invite created."}}},{id:"proxy invites remove",group:"proxy",name:"invites remove",stage:"B",write:!0,summary:"Revoke a proxy invite",args:[{name:"inviteId",description:"Proxy invite ID",required:!0}],input:Hz({inviteId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"inviteId"),i=await pg(e),o=await zg(e,"proxy invites remove",()=>({method:"DELETE",path:`/api/control-plane-proxy/invites/${encodeURIComponent(n)}`}),()=>i.client.admin.revokeProxyInvite(n));if(o)return{data:o,message:`Proxy invite \`${n}\` revoked.`}}},{id:"proxy bindings list",group:"proxy",name:"bindings list",stage:"B",summary:"List proxy bindings",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.admin.proxyBindings(e.signal);return e.output.json?{data:n}:{data:n,columns:vf,message:n.length?void 0:"No proxy bindings matched."}}},{id:"proxy bindings remove",group:"proxy",name:"bindings remove",stage:"B",write:!0,summary:"Revoke a proxy binding",args:[{name:"bindingId",description:"Proxy binding ID",required:!0}],input:Hz({bindingId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"bindingId"),i=await pg(e),o=await zg(e,"proxy bindings remove",()=>({method:"DELETE",path:`/api/control-plane-proxy/bindings/${encodeURIComponent(n)}`}),()=>i.client.admin.revokeProxyBinding(n));if(o)return{data:o,message:`Proxy binding \`${n}\` revoked.`}}},{id:"proxy diagnostics",group:"proxy",name:"diagnostics",stage:"B",summary:"Show proxy stream diagnostics",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.admin.proxyDiagnostics(e.signal);return e.output.json?{data:n}:{data:n,columns:Af,message:n.length?void 0:"No proxied bindings."}}},{id:"proxy pending-claims list",group:"proxy",name:"pending-claims list",stage:"B",summary:"List pending proxy claims",input:Fz,...Sf,handler:async function(e){const t=await pg(e),n=await t.client.admin.pendingProxyClaims(e.signal);return e.output.json?{data:n}:{data:n,columns:xf,message:n.length?void 0:"No pending proxy claims."}}},{id:"proxy pending-claims resume",group:"proxy",name:"pending-claims resume",stage:"B",write:!0,summary:"Resume a pending proxy claim",args:[{name:"claimId",description:"Pending proxy claim ID",required:!0}],input:Hz({claimId:o.z.string()}),...Sf,handler:async function(e,t){const n=yg(t,"claimId"),i=await pg(e),o=await zg(e,"proxy pending-claims resume",()=>({method:"POST",path:`/api/control-plane-proxy/pending-claims/${encodeURIComponent(n)}/resume`}),()=>i.client.admin.resumeProxyClaim(n));if(o)return{data:o,message:`Pending proxy claim \`${n}\` resumed.`}}},{id:"proxy pending-claims remove",group:"proxy",name:"pending-claims remove",stage:"B",write:!0,summary:"Cancel a pending proxy claim",args:[{name:"claimId",description:"Pending proxy claim ID",required:!0}],options:[{flags:"--force",description:"Force cancellation of a claim that is mid-resume"}],input:Hz({claimId:o.z.string(),force:o.z.boolean().optional()}),...Sf,handler:async function(e,t){const n=yg(t,"claimId"),i=!0===t.options.force,o=await pg(e),a=await zg(e,"proxy pending-claims remove",()=>({method:"DELETE",path:`/api/control-plane-proxy/pending-claims/${encodeURIComponent(n)}${i?"?force=true":""}`}),()=>o.client.admin.cancelProxyClaim(n,i?{force:!0}:{}));if(a)return{data:a,message:`Pending proxy claim \`${n}\` cancelled.`}}}])],Ef={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},Pf=[{id:"user create",group:"user",name:"create",stage:"B",write:!0,summary:"Create a local user",options:[Ef],input:Hz({config:o.z.string()}),output:_o,handler:async function(e,t){const n=kg(t,"User create request"),i=await mz(e,"user create",oz.userManagement),o=await zg(e,"user create",()=>({method:"POST",path:"/api/users",body:n}),()=>i.client.users.create(n));if(o)return{data:o,columns:az,message:`User \`${o.id}\` created.`}}},{id:"user update",group:"user",name:"update",stage:"B",write:!0,summary:"Update a user",args:[{name:"userId",description:"User ID",required:!0}],options:[Ef],input:Hz({userId:o.z.string(),config:o.z.string()}),output:_o,handler:async function(e,t){const n=yg(t,"userId"),i=kg(t,"User update request"),o=await mz(e,"user update",oz.userManagement),a=await zg(e,"user update",()=>({method:"PATCH",path:`/api/users/${encodeURIComponent(n)}`,body:i}),()=>o.client.users.update(n,i));if(a)return{data:a,columns:az,message:`User \`${n}\` updated.`}}},{id:"user access",group:"user",name:"access",stage:"B",write:!0,summary:"Replace a user's access grant",args:[{name:"userId",description:"User ID",required:!0}],options:[Ef],input:Hz({userId:o.z.string(),config:o.z.string()}),output:_o,handler:async function(e,t){const n=yg(t,"userId"),i=kg(t,"User access request"),o=await mz(e,"user access",oz.userManagement),a=await zg(e,"user access",()=>({method:"PUT",path:`/api/users/${encodeURIComponent(n)}/access`,body:i}),()=>Ou(o,()=>o.client.users.setAccess(n,i)));if(a)return{data:a,columns:az,message:`Access for \`${n}\` updated.`}}},{id:"user password-reset",group:"user",name:"password-reset",stage:"B",write:!0,summary:"Reset a user's password (password is read from stdin)",args:[{name:"userId",description:"User ID",required:!0}],options:[{flags:"--require-change",description:"Require the user to change the password at next sign-in"}],input:Hz({userId:o.z.string(),requireChange:o.z.boolean().optional()}),output:Bz,outputPinned:!1,handler:async function(e,t){const n=yg(t,"userId"),i=await Sg(t),o=!0===t.options["require-change"],a=await mz(e,"user password-reset",oz.userManagement),s={password:i,...o?{requirePasswordChange:!0}:{}},r=await zg(e,"user password-reset",()=>({method:"POST",path:`/api/users/${encodeURIComponent(n)}/password-reset`,body:s}),()=>a.client.users.resetPassword(n,s));if(r)return{data:r,columns:[{key:"id",header:"user"},{key:"primaryUsername",header:"username"}],message:`Password for \`${n}\` reset.`}}},{id:"user role list",group:"user",name:"role list",stage:"B",summary:"List roles",input:Hz({}),output:o.z.array(Oo),handler:async function(e){const t=await mz(e,"user role list",oz.customRoles),n=await t.client.users.roles(e.signal);return e.output.json?{data:n}:{data:n,columns:rz,message:n.length?void 0:"No roles matched."}}},{id:"user role create",group:"user",name:"role create",stage:"B",write:!0,summary:"Create a custom role",options:[Ef],input:Hz({config:o.z.string()}),output:Oo,handler:async function(e,t){const n=kg(t,"Role create request"),i=await mz(e,"user role create",oz.customRoles),o=await zg(e,"user role create",()=>({method:"POST",path:"/api/roles",body:n}),()=>i.client.users.createRole(n));if(o)return{data:o,columns:rz,message:`Role \`${o.id}\` created.`}}},{id:"user role update",group:"user",name:"role update",stage:"B",write:!0,summary:"Update a role",args:[{name:"roleId",description:"Role ID",required:!0}],options:[Ef],input:Hz({roleId:o.z.string(),config:o.z.string()}),output:Oo,handler:async function(e,t){const n=yg(t,"roleId"),i=kg(t,"Role update request"),o=await mz(e,"user role update",oz.customRoles),a=await zg(e,"user role update",()=>({method:"PATCH",path:`/api/roles/${encodeURIComponent(n)}`,body:i}),()=>Ou(o,()=>o.client.users.updateRole(n,i)));if(a)return{data:a,columns:rz,message:`Role \`${n}\` updated.`}}},{id:"user role remove",group:"user",name:"role remove",stage:"B",write:!0,summary:"Archive a role",args:[{name:"roleId",description:"Role ID",required:!0}],input:Hz({roleId:o.z.string()}),output:Oo,handler:async function(e,t){const n=yg(t,"roleId"),i=await mz(e,"user role remove",oz.customRoles),o=await zg(e,"user role remove",()=>({method:"DELETE",path:`/api/roles/${encodeURIComponent(n)}`}),()=>Ou(i,()=>i.client.users.archiveRole(n)));if(o)return{data:o,message:`Role \`${n}\` archived.`}}},{id:"user permission list",group:"user",name:"permission list",stage:"B",summary:"List permission descriptors",input:Hz({}),output:o.z.array(So),handler:async function(e){const t=await mz(e,"user permission list",oz.customRoles),n=await t.client.users.permissions(e.signal);return e.output.json?{data:n}:{data:n,columns:dz,message:n.length?void 0:"No permissions matched."}}},{id:"user identity-provider list",group:"user",name:"identity-provider list",stage:"B",summary:"List identity providers",input:Hz({}),output:o.z.array(Lo),handler:async function(e){const t=await mz(e,"user identity-provider list",oz.externalIdentityLogin),n=await t.client.users.providers(e.signal);return e.output.json?{data:n}:{data:n,columns:cz,message:n.length?void 0:"No identity providers matched."}}},{id:"user identity-provider create",group:"user",name:"identity-provider create",stage:"B",write:!0,summary:"Create an identity provider",options:[Ef],input:Hz({config:o.z.string()}),output:Lo,handler:async function(e,t){const n=kg(t,"Identity provider create request"),i=await mz(e,"user identity-provider create",oz.externalIdentityLogin),o=await zg(e,"user identity-provider create",()=>({method:"POST",path:"/api/identity-providers",body:n}),()=>i.client.users.createProvider(n));if(o)return{data:o,columns:cz,message:`Identity provider \`${o.id}\` created.`}}},{id:"user identity-provider update",group:"user",name:"identity-provider update",stage:"B",write:!0,summary:"Update an identity provider",args:[{name:"providerId",description:"Identity provider ID",required:!0}],options:[Ef],input:Hz({providerId:o.z.string(),config:o.z.string()}),output:Lo,handler:async function(e,t){const n=yg(t,"providerId"),i=kg(t,"Identity provider update request"),o=await mz(e,"user identity-provider update",oz.externalIdentityLogin),a=await zg(e,"user identity-provider update",()=>({method:"PATCH",path:`/api/identity-providers/${encodeURIComponent(n)}`,body:i}),()=>Ou(o,()=>o.client.users.updateProvider(n,i)));if(a)return{data:a,columns:cz,message:`Identity provider \`${n}\` updated.`}}},{id:"user identity-provider remove",group:"user",name:"identity-provider remove",stage:"B",write:!0,summary:"Remove an identity provider",args:[{name:"providerId",description:"Identity provider ID",required:!0}],input:Hz({providerId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"providerId"),i=await mz(e,"user identity-provider remove",oz.externalIdentityLogin),o=await zg(e,"user identity-provider remove",()=>({method:"DELETE",path:`/api/identity-providers/${encodeURIComponent(n)}`}),()=>Ou(i,()=>i.client.users.removeProvider(n)));if(o)return{data:o,message:`Identity provider \`${n}\` removed.`}}},{id:"user external-identity list",group:"user",name:"external-identity list",stage:"B",summary:"List pending external identity approvals",input:Hz({}),output:o.z.array(Do),handler:async function(e){const t=await mz(e,"user external-identity list",oz.externalIdentityLogin),n=await t.client.users.approvals(e.signal);return e.output.json?{data:n}:{data:n,columns:lz,message:n.length?void 0:"No pending identity approvals."}}},{id:"user external-identity approve",group:"user",name:"external-identity approve",stage:"B",write:!0,summary:"Approve an external identity binding",args:[{name:"approvalId",description:"Approval ID",required:!0}],options:[{flags:"--config <file>",description:"Approval request JSON (optional)"}],input:Hz({approvalId:o.z.string(),config:o.z.string().optional()}),output:_o,handler:async function(e,t){const n=yg(t,"approvalId"),i=Ig(t,"config")?kg(t,"Identity approval request"):{},o=await mz(e,"user external-identity approve",oz.externalIdentityLogin),a=await zg(e,"user external-identity approve",()=>({method:"POST",path:`/api/external-identity-approvals/${encodeURIComponent(n)}/approve`,body:i}),()=>o.client.users.approveIdentity(n,i));if(a)return{data:a,columns:az,message:`Identity approval \`${n}\` approved.`}}},{id:"user external-identity reject",group:"user",name:"external-identity reject",stage:"B",write:!0,summary:"Reject an external identity binding",args:[{name:"approvalId",description:"Approval ID",required:!0}],input:Hz({approvalId:o.z.string()}),output:Bz,outputPinned:!1,handler:async function(e,t){const n=yg(t,"approvalId"),i=await mz(e,"user external-identity reject",oz.externalIdentityLogin),o=await zg(e,"user external-identity reject",()=>({method:"POST",path:`/api/external-identity-approvals/${encodeURIComponent(n)}/reject`,body:{}}),()=>i.client.users.rejectIdentity(n));if(o)return{data:o,message:`Identity approval \`${n}\` rejected.`}}}],Of=Hz({origin:o.z.string(),label:o.z.string().optional()}),Nf=Hz({label:o.z.string()}),_f=Vz("profile","Manage Control Plane profiles",[{id:"profile add",group:"profile",name:"add",stage:"A",summary:"Add a Control Plane profile and pin its identity fingerprint",args:[{name:"origin",description:"Control Plane origin, for example https://control.example.com",required:!0}],options:[{flags:"--label <label>",description:"Profile label (defaults to the host name)"}],input:Of,output:k,examples:["thctl profile add https://control.example.com","thctl profile add http://127.0.0.1:8787 --label local"],handler:async function(e,t){const n=function(e){let t;try{t=new URL(e.trim())}catch{throw z("CLI_ORIGIN_INVALID","Enter a Control Plane URL such as `https://control.example.com`.")}if(t.username||t.password||t.search||t.hash)throw z("CLI_ORIGIN_INVALID","The Control Plane address cannot contain credentials, query parameters, or a fragment.");if("/"!==t.pathname&&""!==t.pathname)throw z("CLI_ORIGIN_INVALID","Enter the Control Plane origin without a page or API path.");return t.origin}(Sh(t.args.origin,"origin")),i=await Mu(n,e.fetchImpl),o=e.store.findByOrigin(n);if(o&&(o.controlPlaneId!==i.payload.controlPlaneId||o.fingerprint!==i.payload.publicKey.fingerprint))throw new h("CLI_IDENTITY_CHANGED",`Profile \`${o.label}\` is pinned to a different identity. Run \`thctl profile trust ${o.label}\` after verifying the new fingerprint ${i.payload.publicKey.fingerprint}.`,13,{profile:o.label});const a=o??e.store.findByControlPlane(i.payload.controlPlaneId,i.payload.publicKey.fingerprint),s=t.options.label?.trim()||a?.label||P(n),r=(new Date).toISOString(),d=k.parse({label:s,origin:n,controlPlaneId:i.payload.controlPlaneId,fingerprint:i.payload.publicKey.fingerprint,protocolVersion:i.payload.protocolVersion,capabilities:i.payload.capabilities,createdAt:a?.createdAt??r,updatedAt:r,trustedAt:r,lastUsedAt:r,...a?.loginMode?{loginMode:a.loginMode}:{}});return e.store.save(d),e.store.defaultProfile()||e.store.setDefault(s),{data:d,columns:[{key:"label",header:"profile"},{key:"origin",header:"origin"},{key:"fingerprint",header:"fingerprint"}],message:a?`Reused existing profile \`${d.label}\` for ${n}.`:`Added profile \`${d.label}\` for ${n}.`}}},{id:"profile list",group:"profile",name:"list",stage:"A",summary:"List configured Control Plane profiles",input:Fz,output:o.z.array(k.extend({default:o.z.boolean()})),handler:async function(e){const t=e.store.list(),n=e.store.defaultProfile();return{data:t.map(e=>({...e,default:e.label===n})),columns:[{key:"label",header:"profile"},{key:"origin",header:"origin"},{key:"controlPlaneId",header:"controlPlaneId"},{key:"protocolVersion",header:"protocol"},{key:"fingerprint",header:"fingerprint",width:28},{key:"default",header:"default"}]}}},{id:"profile use",group:"profile",name:"use",stage:"A",summary:"Set the default profile",args:[{name:"label",description:"Profile label",required:!0}],input:Nf,output:o.z.object({defaultProfile:o.z.string()}),handler:async function(e,t){const n=Sh(t.args.label,"label");return e.store.setDefault(n),{data:{defaultProfile:n},message:`Default profile is now \`${n}\`.`}}},{id:"profile show",group:"profile",name:"show",stage:"A",summary:"Show one profile, its pinned identity and local sign-in state",args:[{name:"label",description:"Profile label (defaults to the selected profile)"}],input:Hz({label:o.z.string().optional()}),output:k.extend({signedIn:o.z.boolean(),sessionExpiresAt:o.z.string().optional()}),handler:async function(e,t){const n=t.args.label?.trim(),i=n?e.store.get(n):e.store.select(e.profile,e.env);if(!i)throw new h("CLI_PROFILE_UNKNOWN",`Unknown profile \`${n}\`.`,7,{profile:n});const o=e.store.secrets().read(i.label);return{data:{...i,signedIn:Boolean(o),...o?.expiresAt?{sessionExpiresAt:o.expiresAt}:{}}}}},{id:"profile remove",group:"profile",name:"remove",stage:"A",write:!0,summary:"Remove a profile and its local credentials",args:[{name:"label",description:"Profile label",required:!0}],input:Nf,output:o.z.object({label:o.z.string(),removed:o.z.boolean()}),handler:async function(e,t){const n=Sh(t.args.label,"label");if(!e.store.get(n))throw new h("CLI_PROFILE_UNKNOWN",`Unknown profile \`${n}\`.`,7,{profile:n});return zg(e,`profile remove ${n}`,()=>({method:"DELETE",path:`local:profiles/${n}`}),async()=>{const t=e.store.remove(n);return{data:{label:n,removed:t},message:t?`Removed profile \`${n}\`.`:void 0}})}},{id:"profile trust",group:"profile",name:"trust",stage:"A",write:!0,summary:"Re-pin the identity fingerprint of an existing profile after verifying it",args:[{name:"label",description:"Profile label",required:!0}],input:Nf,output:k,handler:async function(e,t){const n=Sh(t.args.label,"label"),i=e.store.get(n);if(!i)throw new h("CLI_PROFILE_UNKNOWN",`Unknown profile \`${n}\`.`,7,{profile:n});const o=await Mu(i.origin,e.fetchImpl),a=o.payload.publicKey.fingerprint,s=i.fingerprint;if(e.output.warn(`Pinned fingerprint: ${s}\nPresented fingerprint: ${a}`),s===a)return{data:{label:n,fingerprint:a,trusted:!0,changed:!1},message:`Profile \`${n}\` already trusts this Control Plane identity.`};if(o.payload.controlPlaneId!==i.controlPlaneId)throw new h("CLI_IDENTITY_MISMATCH",`Profile \`${n}\` is pinned to Control Plane ${i.controlPlaneId}, but ${i.origin} now presents ${o.payload.controlPlaneId}. Refusing to re-trust a different Control Plane; add it as a new profile instead.`,13);return zg(e,`profile trust ${n}`,()=>({method:"PATCH",path:`local:profiles/${n}`,body:{fingerprint:a}}),async()=>{const t=(new Date).toISOString();return{data:e.store.save({...i,fingerprint:a,protocolVersion:o.payload.protocolVersion,capabilities:o.payload.capabilities,trustedAt:t,updatedAt:t,identityChangedAt:t,replacedFingerprint:s}),message:`Profile \`${n}\` now trusts ${a}.`}})}}]),Uf=Vz("auth","Authenticate the CLI against a Control Plane",[{id:"login",group:"auth",name:"login",stage:"A",summary:"Authorize this CLI through the Control Plane web login",options:[{flags:"--device",description:"Use the device authorization flow for machines without a browser"}],input:Hz({device:o.z.boolean().optional()}),output:o.z.object({profile:o.z.string(),sessionId:o.z.string(),expiresAt:o.z.string(),loginMode:o.z.enum(["browser","device"])}),examples:["thctl login","thctl login --device --profile prod"],handler:async function(e,t){const n=await mg(e),i=t.options.device?"device":"browser",o=await async function(e){return"device"===e.mode?async function(e){const{store:t,fetchImpl:n,output:i}=e,o=e.sleep??(e=>new Promise(t=>setTimeout(t,e))),a=await Rh({store:t,profileLabel:e.profileLabel,fetchImpl:n}),s=await a.client.auth.cliAuthorize({mode:"device",client:Pu()});if("device"!==s.mode)throw I("The Control Plane returned a browser authorization for a device request.");i.message(`Open this URL on any device and confirm the code:\n${s.verificationUri}\nUser code: ${s.userCode}`);let r=1e3*Math.max(1,s.intervalSeconds);const d=Date.parse(s.expiresAt);for(;;){if(Date.now()>=d)throw new h("CLI_AUTHORIZATION_EXPIRED","The device authorization expired before it was approved. Run `thctl login --device` again.",5);await o(e.pollIntervalMs??r);try{const e=await a.client.auth.cliToken({grantType:"urn:ietf:params:oauth:grant-type:device_code",requestId:s.requestId});return await Th(a,e,"device"),{profile:a.profile,session:e.session}}catch(e){if(!(e instanceof h))throw e;if("CLI_AUTHORIZATION_PENDING"===e.code)continue;if("CLI_AUTHORIZATION_SLOW_DOWN"===e.code){const t=Number(e.details?.intervalSeconds);r=Math.max(r+5e3,Number.isFinite(t)?1e3*t:0);continue}throw e}}}(e):$h(e)}({profileLabel:n.label,mode:i,store:e.store,fetchImpl:e.fetchImpl,output:e.output,openUrl:e.openUrl,sleep:e.sleep});return{data:{profile:o.profile.label,sessionId:o.session.id,expiresAt:o.session.expiresAt,loginMode:i},message:`Signed in to ${o.profile.origin} as ${o.session.user.primaryUsername||o.session.user.displayName}.`}}},{id:"logout",group:"auth",name:"logout",stage:"A",summary:"Revoke the stored CLI session on the server and locally",input:Fz,output:o.z.object({profile:o.z.string(),revoked:o.z.boolean()}),handler:async function(e){const t=await mg(e);if(!e.store.secrets().read(t.label))return{data:{profile:t.label,revoked:!1},message:`No stored CLI session for \`${t.label}\`.`};let n=!1;try{const i=await pg(e,{profile:t});n=(await i.client.auth.logoutCli()).ok}catch(e){if(!(e instanceof h)||5!==e.exitCode)throw e}finally{e.store.secrets().remove(t.label)}return{data:{profile:t.label,revoked:n},message:n?`Signed out of ${t.origin}.`:`Local CLI credentials for \`${t.label}\` were cleared.`}}},{id:"whoami",group:"auth",name:"whoami",stage:"A",summary:"Show the signed-in user, profile and pinned Control Plane identity",input:Fz,output:o.z.looseObject({}),handler:async function(e){const t=await mg(e),n=await pg(e,{profile:t}),i=e.store.secrets().read(t.label),o=await n.client.auth.session();if(!o.authenticated||!o.user)throw new h("CLI_NOT_AUTHENTICATED",`The stored CLI session for \`${t.label}\` is not valid. Run \`thctl login\`.`,5);return{data:{profile:t.label,origin:t.origin,controlPlaneId:n.identity.payload.controlPlaneId,protocolVersion:n.identity.payload.protocolVersion,user:o.user,authorization:o.authorization,...i?.mode?{sessionMode:i.mode}:{},...i?.sessionId?{sessionId:i.sessionId}:{},...i?.expiresAt?{sessionExpiresAt:i.expiresAt}:{}},columns:[{key:"profile",header:"profile"},{key:"origin",header:"origin"},{key:"controlPlaneId",header:"controlPlaneId"},{key:"sessionExpiresAt",header:"expires"}],message:"local-trust"===i?.mode?`Connected to the local Control Plane at ${t.origin} as ${o.user.displayName} (local trust session).`:`Signed in to ${t.origin} as ${o.user.primaryUsername||o.user.displayName}.`}}}],{flat:!0}),Lf={name:"instanceId",description:"Controlled instance ID",required:!0},Df=Vz("instance","Inspect and control instances",[{id:"instance list",group:"instance",name:"list",stage:"A",summary:"List controlled instances from the authoritative directory projection",options:[{flags:"--node <nodeId>",description:"Only instances on this node"}],input:Hz({node:o.z.string().optional()}),output:fl,handler:async function(e,t){const n=await pg(e),i=await n.client.resources.instanceBoard(e.signal),o="string"==typeof t.options.node?t.options.node.trim():"",a=o?i.filter(e=>e.nodeId===o):i;return{data:a,columns:sh,message:a.length?void 0:"No controlled instances matched."}}},{id:"instance show",group:"instance",name:"show",stage:"A",summary:"Show one controlled instance from the authoritative directory projection",args:[Lf],input:Hz({instanceId:o.z.string()}),output:zl,handler:async function(e,t){const n=ah(t),i=await pg(e),o=(await i.client.resources.instanceBoard(e.signal)).find(e=>e.id===n);if(!o)throw new h("CLI_INSTANCE_NOT_FOUND",`No controlled instance \`${n}\` is visible to this account.`,7,{instanceId:n});return{data:o,columns:sh}}},{id:"instance create",group:"instance",name:"create",stage:"B",write:!0,summary:"Create a controlled instance from a JSON request body",options:[{flags:"--config <file>",description:"Instance create request JSON (Control Plane wire body)"},{flags:"--name <name>",description:"Override the instance display name"},{flags:"--node <nodeId>",description:"Override the target node"},{flags:"--start",description:"Set start: true (server default is false)"}],input:Hz({config:o.z.string(),name:o.z.string().optional(),node:o.z.string().optional(),start:o.z.boolean().optional()}),output:Cc,examples:["thctl instance create --config ./instance.json --start","thctl instance create --config ./instance.json --name demo --node node_x --dry-run"],handler:async function(e,t){const n=xg(bg(t,"config"),kc,"instance config"),i=Ig(t,"name"),o=Ig(t,"node"),a={...n,...i?{name:i}:{},...o?{nodeId:o}:{},...!0===t.options.start?{start:!0}:{}},s=await pg(e),r=await zg(e,"instance create",()=>({method:"POST",path:"/api/controlled-instances",body:a}),()=>s.client.resources.createInstance(a));if(!r)return;const d="failed"===r.startOutcome.status?`Instance \`${r.id}\` created but start failed: ${r.startOutcome.error?.message??"unknown error"}.`:"started"===r.startOutcome.status?`Instance \`${r.id}\` created; start requested (status: ${r.status}).`:`Instance \`${r.id}\` created (status: ${r.status}).`;return{data:r,columns:mh,message:d}}},{id:"instance delete",group:"instance",name:"delete",stage:"B",write:!0,summary:"Delete a controlled instance, optionally deleting its volumes",args:[Lf],options:[{flags:"--volumes",description:"Also delete the instance's managed volumes (irreversible)"}],input:Hz({instanceId:o.z.string(),volumes:o.z.boolean().optional()}),output:Rr,examples:["thctl instance delete <instanceId> --yes","thctl instance delete <instanceId> --volumes --yes"],handler:async function(e,t){const n=ah(t),i=Cr.parse({deleteVolumes:!0===t.options.volumes}),o=await pg(e),a=await zg(e,`instance delete ${n}`,()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}`,body:i}),()=>Ou(o,()=>o.client.approvals.deleteInstance(n,i)));if(a){if(!a.completed)throw new h("CLI_INSTANCE_DELETE_INCOMPLETE",`Instance \`${n}\` deletion is incomplete; re-run the same command after resolving the failed volumes.`,8,{instanceId:n,volumeResults:a.volumeResults});return{data:a,columns:ph,message:a.retainedVolumes.length?`Instance \`${n}\` deleted; ${a.retainedVolumes.length} volume(s) retained (pass --volumes to delete them).`:`Instance \`${n}\` deleted.`}}}},{id:"instance start",group:"instance",name:"start",stage:"A",write:!0,summary:"Start a controlled instance",args:[Lf],input:Hz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:dh},{id:"instance stop",group:"instance",name:"stop",stage:"A",write:!0,summary:"Stop a controlled instance",args:[Lf],input:Hz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:ch},{id:"instance restart",group:"instance",name:"restart",stage:"A",write:!0,summary:"Restart a controlled instance",args:[Lf],input:Hz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:lh},{id:"instance logs",group:"instance",name:"logs",stage:"C",summary:"Stream instance logs (planned with the events stream work)",args:[Lf],options:[{flags:"--follow",description:"Keep streaming new log lines"}],input:Hz({instanceId:o.z.string(),follow:o.z.boolean().optional()}),output:Bz,outputPinned:!1},{id:"instance rename",group:"instance",name:"rename",stage:"B",write:!0,summary:"Rename a controlled instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"name",description:"New display name",required:!0}],input:Hz({instanceId:o.z.string(),name:o.z.string()}),output:o.z.object({id:o.z.string(),name:o.z.string()}),handler:async function(e,t){const n=ah(t),i=t.args.name?.trim();if(!i)throw new h("CLI_ARGUMENT_MISSING","Missing required argument <name>.",2);const o=await pg(e),a=await zg(e,`instance rename ${n}`,()=>({method:"PATCH",path:`/api/controlled-instances/${encodeURIComponent(n)}`,body:{name:i}}),()=>o.client.resources.updateInstanceName(n,i));if(a)return{data:a,columns:[{key:"id",header:"instance"},{key:"name",header:"name",width:24}],message:`Instance \`${n}\` renamed to \`${a.name}\`.`}}},{id:"instance update",group:"instance",name:"update",stage:"B",write:!0,summary:"Update instance settings from a JSON request body",args:[Lf],options:[{flags:"--config <file>",description:"Instance update request JSON (Control Plane wire body)"}],input:Hz({instanceId:o.z.string(),config:o.z.string()}),output:vc,examples:["thctl instance update <instanceId> --config ./instance-settings.json"],handler:async function(e,t){const n=ah(t),i=xg(bg(t,"config"),Ac,"instance update config"),o=await pg(e),a=await zg(e,`instance update ${n}`,()=>({method:"PATCH",path:`/api/controlled-instances/${encodeURIComponent(n)}`,body:i}),()=>o.client.resources.updateInstance(n,i));if(a)return{data:a,columns:uh,message:`Instance \`${n}\` updated.`}}},{id:"instance app list",group:"instance",name:"app list",stage:"B",summary:"List managed apps and their install state on an instance",args:[Lf],input:Hz({instanceId:o.z.string()}),output:Wr,handler:async function(e,t){const n=ah(t),i=await pg(e),o=await i.client.apps.management(n,e.signal);if(e.output.json)return{data:o};const a=o.activeJobs.length;return{data:o.apps,columns:gh,message:o.apps.length?a?`${a} app job(s) in progress.`:void 0:`No managed apps reported for instance \`${n}\`.`}}},{id:"instance app install",group:"instance",name:"app install",stage:"B",write:!0,summary:"Install a managed app (asynchronous job)",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0}],options:[{flags:"--request-id <requestId>",description:"Client request ID for idempotency (defaults to a random UUID)"},{flags:"--wait",description:"Poll the job until it reaches a terminal state"},{flags:"--logs",description:"Append the job log tail to the output"}],input:Hz({instanceId:o.z.string(),appId:o.z.string(),requestId:o.z.string().optional(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Gr,examples:["thctl instance app install <instanceId> codex --wait","thctl instance app install <instanceId> codex --json"],handler:Ih},{id:"instance app uninstall",group:"instance",name:"app uninstall",stage:"B",write:!0,summary:"Uninstall a managed app (asynchronous job)",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0}],options:[{flags:"--request-id <requestId>",description:"Client request ID for idempotency (defaults to a random UUID)"},{flags:"--wait",description:"Poll the job until it reaches a terminal state"},{flags:"--logs",description:"Append the job log tail to the output"}],input:Hz({instanceId:o.z.string(),appId:o.z.string(),requestId:o.z.string().optional(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Gr,handler:bh},{id:"instance app job",group:"instance",name:"app job",stage:"B",summary:"Show an app install/uninstall job",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"jobId",description:"App management job ID",required:!0}],options:[{flags:"--wait",description:"Poll the job until it reaches a terminal state"},{flags:"--logs",description:"Append the job log tail to the output"}],input:Hz({instanceId:o.z.string(),jobId:o.z.string(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Gr,handler:async function(e,t){const n=ah(t),i=yg(t,"jobId"),o=!0===t.options.wait,a=await pg(e);let s=(await a.client.apps.job(n,i,e.signal)).job;return o&&(s=await fh(e,a,n,s)),vh(0,s,!0===t.options.logs)}},{id:"instance app catalog",group:"instance",name:"app catalog",stage:"B",summary:"List launchable apps in the instance app catalog",args:[Lf],input:Hz({instanceId:o.z.string()}),output:Kc,handler:async function(e,t){const n=ah(t),i=await pg(e),o=await i.client.apps.catalog(n,e.signal);return e.output.json?{data:o}:{data:o.items,columns:wh,message:o.items.length?void 0:`Instance \`${n}\` reports no launchable apps.`}}},{id:"instance app catalog custom",group:"instance",name:"app catalog custom",stage:"B",summary:"Show the instance custom app catalog",args:[Lf],input:Hz({instanceId:o.z.string()}),output:Jc,handler:async function(e,t){const n=ah(t),i=await pg(e),o=await i.client.apps.customCatalog(n,e.signal);return e.output.json?{data:o}:{data:o.items,columns:wh,message:o.items.length?`Custom app catalog v${o.schemaVersion} has ${o.items.length} app(s).`:"The custom app catalog is empty."}}},{id:"instance app catalog custom update",group:"instance",name:"app catalog custom update",stage:"B",write:!0,summary:"Replace the instance custom app catalog from a JSON request body",args:[Lf],options:[{flags:"--config <file>",description:'Custom app catalog JSON body: { "items": [...] }'}],input:Hz({instanceId:o.z.string(),config:o.z.string()}),output:Jc,examples:["thctl instance app catalog custom update <instanceId> --config ./custom-apps.json"],handler:async function(e,t){const n=ah(t),i=xg(bg(t,"config"),Zc,"custom app catalog config"),o=await pg(e),a=await zg(e,`instance app catalog custom update ${n}`,()=>({method:"PATCH",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/catalog/custom`,body:i}),()=>o.client.apps.updateCustomCatalog(n,i));if(a)return e.output.json?{data:a}:{data:a.items,columns:wh,message:`Custom app catalog updated with ${a.items.length} app(s).`}}}]),qf=Vz("ai-session","Inspect and drive AI sessions",[{id:"ai-session list",group:"ai-session",name:"list",stage:"A",summary:"List AI sessions across visible instances",options:[{flags:"--instance <instanceId>",description:"Only sessions of this instance"}],input:Hz({instance:o.z.string().optional()}),output:Oi,handler:async function(e,t){const n=await pg(e),i="string"==typeof t.options.instance?t.options.instance.trim():"",o=await n.client.aiSessions.list(e.signal,i||void 0);if(e.output.json)return{data:o};const a=o.instances.flatMap(e=>e.aiSessions.sessions.map(t=>({...t,instanceId:e.instanceId,title:t.title||t.userPrompt||t.summary||t.id})));return{data:a,columns:Cg,message:a.length?void 0:"No AI sessions matched."}}},{id:"ai-session show",group:"ai-session",name:"show",stage:"A",summary:"Show one AI session projection",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string()}),output:At,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=await pg(e),a=await o.client.aiSessions.detail(n,i,void 0,e.signal);if(e.output.json)return{data:a};if("not-modified"===a.kind)return{data:a,message:`Session \`${i}\` is unchanged at revision ${a.revision}.`};const s=a.detail;return{data:{id:s.id,cwd:s.cwd??"",model:s.modelSelection?.modelName??"",queued:s.queue?.pendingCount??0,subAgents:s.subAgents?.length??0,error:s.error??""},columns:[{key:"id",header:"session"},{key:"cwd",header:"cwd",width:40},{key:"model",header:"model"},{key:"queued",header:"queued"},{key:"subAgents",header:"subagents"},{key:"error",header:"error",width:40}]}}},{id:"ai-session history",group:"ai-session",name:"history",stage:"B",summary:"List provider session history for an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],options:[{flags:"--agent <agent>",description:"Restrict to one agent",repeatable:!0}],input:Hz({instanceId:o.z.string(),agent:o.z.array(o.z.string()).optional()}),output:Et,handler:async function(e,t){const n=yg(t,"instanceId"),i=wg(t,"agent"),o=await pg(e),a=await o.client.aiSessions.history(n,e.signal,i.length?i:void 0);if(e.output.json)return{data:a};const s=a.items.map(e=>({...e,title:e.title||e.userPrompt||e.lastMessage||e.providerSessionId}));return{data:s,columns:[{key:"id",header:"session"},{key:"agent",header:"agent"},{key:"title",header:"title",width:40},{key:"cwd",header:"cwd",width:30},{key:"lastActiveAt",header:"last active"}],message:s.length?void 0:"No provider session history matched."}}},{id:"ai-session turns",group:"ai-session",name:"turns",stage:"B",summary:"List turn index entries of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--revision <revision>",description:"Return not-modified when this revision already matches"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),revision:o.z.string().optional()}),output:kt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=Ig(t,"revision"),a=await pg(e),s=await a.client.aiSessions.turnIndex(n,i,o,e.signal);return e.output.json?{data:s}:"not-modified"===s.kind?{data:s,message:`Turn index for \`${i}\` is unchanged at revision ${s.revision}.`}:{data:s.index.turns,columns:[{key:"id",header:"turn",width:40},{key:"status",header:"status"},{key:"phase",header:"phase"},{key:"startedAt",header:"started"},{key:"completedAt",header:"completed"}],message:s.index.turns.length?void 0:`AI session \`${i}\` has no turns yet.`}}},{id:"ai-session turn",group:"ai-session",name:"turn",stage:"B",summary:"Show one turn body of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"turnId",description:"Turn ID",required:!0}],options:[{flags:"--revision <revision>",description:"Return not-modified when this revision already matches"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),turnId:o.z.string(),revision:o.z.string().optional()}),output:St,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=yg(t,"turnId"),a=Ig(t,"revision"),s=await pg(e),r=await s.client.aiSessions.turnBody(n,i,o,a,e.signal);if(e.output.json)return{data:r};if("not-modified"===r.kind)return{data:r,message:`Turn \`${o}\` is unchanged at revision ${r.revision}.`};const d=r.body.turn;return{data:[...(d.userMessages??[]).map(e=>({kind:"user",message:e.id,text:e.text})),...d.lastMessage?[{kind:"assistant",message:d.lastMessageItemId??"",text:d.lastMessage}]:[]],columns:[{key:"kind",header:"kind"},{key:"message",header:"message",width:24},{key:"text",header:"text",width:60}],message:`Turn \`${o}\` is ${d.status}.`}}},{id:"ai-session timeline",group:"ai-session",name:"timeline",stage:"B",summary:"Show the conversation timeline of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string()}),output:oe,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=await pg(e),a=await o.client.aiSessions.timeline(n,i,e.signal);return e.output.json?{data:a}:{data:$g(a.items),columns:Eg,message:a.items.length?void 0:`AI session \`${i}\` has no timeline items.`}}},{id:"ai-session turn-timeline",group:"ai-session",name:"turn-timeline",stage:"B",summary:"Show the timeline of one AI session turn",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"turnId",description:"Turn ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),turnId:o.z.string()}),output:ae,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=yg(t,"turnId"),a=await pg(e),s=await a.client.aiSessions.turnTimeline(n,i,o,e.signal);return e.output.json?{data:s}:{data:$g(s.items),columns:Eg,message:s.items.length?void 0:`Turn \`${o}\` has no timeline items.`}}},{id:"ai-session create",group:"ai-session",name:"create",stage:"B",write:!0,summary:"Create an AI session on an instance",args:[{name:"instanceId",description:"Controlled instance ID",required:!0}],options:[{flags:"--prompt <text>",description:"Initial prompt"},{flags:"--agent <agent>",description:"Agent kind (codex, claude, opencode)"},{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder to run in"},{flags:"--story <storyId>",description:"Story to attach the session to"},{flags:"--permission-mode <ask|auto-review|full-access>",description:"Permission mode for the initial message"},{flags:"--reasoning <none|minimal|low|medium|high|xhigh|max|ultra>",description:"Reasoning effort for the session"},{flags:"--model-entity <modelEntityId>",description:"Model entity to start the session on"},{flags:"--model-name <modelName>",description:"Model name within the entity"},{flags:"--request-id <id>",description:"Client request ID for retry-safe creation"}],input:Hz({instanceId:o.z.string(),prompt:o.z.string(),agent:o.z.string(),cwdFolder:o.z.string().optional(),story:o.z.string().optional(),permissionMode:o.z.string().optional(),reasoning:o.z.string().optional(),modelEntity:o.z.string().optional(),modelName:o.z.string().optional(),requestId:o.z.string().optional()}),output:Qe,handler:async function(e,t){const n=yg(t,"instanceId"),i=Ig(t,"model-entity"),o=Ig(t,"model-name");if(Boolean(i)!==Boolean(o))throw z("CLI_OPTION_MISSING","Provide both --model-entity and --model-name to select a model.",{command:"ai-session create"});const s=Ig(t,"permission-mode"),r=Ig(t,"reasoning"),d={agent:bg(t,"agent"),message:bg(t,"prompt"),clientRequestId:Ig(t,"request-id")??a.randomUUID(),attachments:[],references:[],...Ig(t,"cwd-folder")?{cwdFolderId:Ig(t,"cwd-folder")}:{},...Ig(t,"story")?{storyId:Ig(t,"story")}:{},...s?{permissionMode:qg(s)}:{},...r?{reasoningEffort:Bg(r,"reasoning")}:{},...i&&o?{modelSelection:{modelEntityId:i,modelName:o}}:{}},c=await pg(e),l=await zg(e,"ai-session create",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/ai-sessions`,body:d}),()=>c.client.aiSessions.create(n,d));if(l)return{data:l,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"providerSessionId",header:"provider session"}],message:`AI session \`${l.aiSessionId}\` is ${l.disposition}.`}}},{id:"ai-session send",group:"ai-session",name:"send",stage:"B",write:!0,summary:"Send a message to an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"message",description:"Message text",required:!0}],options:[{flags:"--mode <auto|queue|steer|immediate>",description:"Delivery mode"},{flags:"--permission-mode <ask|auto-review|full-access>",description:"Permission mode for this message"},{flags:"--attachment <attachmentId>",description:"Uploaded attachment ID to include (repeatable)",repeatable:!0},{flags:"--reference <path>",description:"Skill, app or plugin reference to include (repeatable)",repeatable:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),message:o.z.string(),mode:o.z.string().optional(),permissionMode:o.z.string().optional(),attachment:o.z.array(o.z.string()).optional(),reference:o.z.array(o.z.string()).optional()}),output:Tt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=yg(t,"message"),a=Ig(t,"mode"),s=a?function(e){const t=Ie.safeParse(e);if(!t.success)throw new h("CLI_INVALID_OPTION",`--mode must be one of: ${Ie.options.join(", ")}.`,2,{option:"mode",value:e});return t.data}(a):void 0,r=Ig(t,"permission-mode"),d=r?qg(r):void 0,c=wg(t,"attachment");if(c.length>6)throw z("CLI_INVALID_OPTION","At most 6 --attachment options are allowed per message.",{option:"attachment",count:c.length});const l=wg(t,"reference");if(l.length>20)throw z("CLI_INVALID_OPTION","At most 20 --reference options are allowed per message.",{option:"reference",count:l.length});const m=c.map(e=>({id:e,source:{type:"upload-ref"}})),p=l.map(Mg),u={message:o,...s?{mode:s}:{},...d?{permissionMode:d}:{},...m.length?{attachments:m}:{},...p.length?{references:p}:{}},g=await pg(e),f=await zg(e,"ai-session send",()=>({method:"POST",path:`${jg(n,i)}/messages`,body:u}),()=>g.client.aiSessions.sendMessage(n,i,u));if(f)return{data:f,message:`Message sent to AI session \`${i}\`.`}}},{id:"ai-session interrupt",group:"ai-session",name:"interrupt",stage:"B",write:!0,summary:"Interrupt the active turn of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string()}),output:Tt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=await pg(e),a=await zg(e,"ai-session interrupt",()=>({method:"POST",path:`${jg(n,i)}/interrupt`}),()=>o.client.aiSessions.interrupt(n,i));if(a)return{data:a,message:`Interrupt requested for AI session \`${i}\`.`}}},{id:"ai-session approval",group:"ai-session",name:"approval",stage:"B",write:!0,summary:"Answer a pending approval request of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--decision <allow|deny|skip>",description:"Approval decision"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),decision:o.z.enum(["allow","deny","skip"])}),output:Tt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=function(e){const t=rt.safeParse({decision:e});if(!t.success)throw new h("CLI_INVALID_OPTION","--decision must be one of: allow, deny, skip.",2,{option:"decision",value:e});return t.data}(bg(t,"decision")),a=await pg(e),s=await zg(e,"ai-session approval",()=>({method:"POST",path:`${jg(n,i)}/approval`,body:o}),()=>a.client.aiSessions.approval(n,i,o.decision));if(s)return{data:s,message:`Approval \`${o.decision}\` submitted for AI session \`${i}\`.`}}},{id:"ai-session resume",group:"ai-session",name:"resume",stage:"B",write:!0,summary:"Resume a suspended AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string()}),output:Nt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=await pg(e),a=await zg(e,"ai-session resume",()=>({method:"POST",path:`${jg(n,i)}/resume`,body:{}}),()=>o.client.aiSessions.resume(n,i,{}));if(a)return{data:a,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"providerSessionId",header:"provider session"}],message:`AI session \`${i}\` is ${a.disposition}.`}}},{id:"ai-session read",group:"ai-session",name:"read",stage:"B",write:!0,summary:"Mark an AI session as read",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string()}),output:Je,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=await pg(e),a=await zg(e,"ai-session read",()=>({method:"POST",path:`${jg(n,i)}/read`}),()=>o.client.aiSessions.markRead(n,i));if(a)return{data:a,message:`AI session \`${i}\` marked as read.`}}},{id:"ai-session rename",group:"ai-session",name:"rename",stage:"B",write:!0,summary:"Rename an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--title <title>",description:"New session title"},{flags:"--request-id <id>",description:"Client request ID for retry-safe rename"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),title:o.z.string(),requestId:o.z.string().optional()}),output:ke,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o={title:bg(t,"title"),clientRequestId:Ig(t,"request-id")??a.randomUUID()},s=await pg(e),r=await zg(e,"ai-session rename",()=>({method:"PUT",path:`${jg(n,i)}/title`,body:o}),()=>s.client.aiSessions.rename(n,i,o));if(r)return{data:r,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"title",header:"title",width:40}],message:`AI session \`${r.aiSessionId}\` is ${r.disposition}.`}}},{id:"ai-session fork",group:"ai-session",name:"fork",stage:"B",write:!0,summary:"Fork an AI session into a new session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--through-turn <turnId>",description:"Fork after this turn"},{flags:"--workspace <current|managed-worktree>",description:"Workspace mode for the fork"},{flags:"--request-id <id>",description:"Client request ID for retry-safe fork"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),throughTurn:o.z.string().optional(),workspace:o.z.string().optional(),requestId:o.z.string().optional()}),output:tt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=Ig(t,"through-turn"),s=Ig(t,"workspace"),r=vg(et,{clientRequestId:Ig(t,"request-id")??a.randomUUID(),...o?{throughTurnId:o}:{},...s?{workspace:{mode:s}}:{}},"fork input"),d=await pg(e),c=await zg(e,"ai-session fork",()=>({method:"POST",path:`${jg(n,i)}/fork`,body:r}),()=>d.client.aiSessions.fork(n,i,r));if(c)return{data:c,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"providerSessionId",header:"provider session"}],message:`AI session \`${c.aiSessionId}\` is ${c.disposition}.`}}},{id:"ai-session close",group:"ai-session",name:"close",stage:"B",write:!0,summary:"Close an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--request-id <id>",description:"Client request ID for retry-safe close"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),requestId:o.z.string().optional()}),output:at,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=Ig(t,"request-id")??a.randomUUID(),s=await pg(e),r=await zg(e,"ai-session close",()=>({method:"POST",path:`${jg(n,i)}/close`,body:{clientRequestId:o}}),()=>s.client.aiSessions.close(n,i,o));if(r)return{data:r,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"providerSessionId",header:"provider session"}],message:`AI session \`${r.aiSessionId}\` is ${r.disposition}.`}}},{id:"ai-session story",group:"ai-session",name:"story",stage:"B",write:!0,summary:"Attach an AI session to a Story or detach it",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--story <storyId>",description:"Story to attach the session to"},{flags:"--detach",description:"Remove the session from its Story"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),story:o.z.string().optional(),detach:o.z.boolean().optional()}),output:Ke,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=Ig(t,"story"),a=!0===t.options.detach;if(Boolean(o)===a)throw z("CLI_OPTION_MISSING","Provide exactly one of --story <storyId> or --detach.",{command:"ai-session story"});const s=await pg(e),r=await zg(e,"ai-session story",()=>({method:"PUT",path:`${jg(n,i)}/story`,body:{storyId:o??null}}),()=>s.client.stories.setSessionStory(n,i,o??null));if(r)return{data:r,columns:[{key:"sessionId",header:"session"},{key:"storyId",header:"story"}],message:o?`AI session \`${i}\` assigned to Story \`${o}\`.`:`AI session \`${i}\` detached from its Story.`}}},{id:"ai-session open-app",group:"ai-session",name:"open-app",stage:"B",write:!0,summary:"Open the app session of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--request-id <id>",description:"Client request ID for retry-safe open"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),requestId:o.z.string().optional()}),output:it,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=Ig(t,"request-id")??a.randomUUID(),s=await pg(e),r=await zg(e,"ai-session open-app",()=>({method:"POST",path:`${jg(n,i)}/open-app`,body:{clientRequestId:o}}),()=>s.client.aiSessions.openApp(n,i,o));if(r)return{data:r,columns:[{key:"aiSessionId",header:"session"},{key:"disposition",header:"disposition"},{key:"appSessionId",header:"app session"}],message:`App session \`${r.appSessionId}\` is ${r.disposition} for AI session \`${i}\`.`}}},{id:"ai-session open-terminal",group:"ai-session",name:"open-terminal",stage:"B",write:!0,summary:"Open a terminal app session in the working directory of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--app <appId>",description:"Terminal app ID (defaults to terminal-tty)"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),app:o.z.string().optional()}),output:Hi,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=Ig(t,"app")??"terminal-tty",a=await pg(e),s=await a.client.aiSessions.detail(n,i,void 0,e.signal),r="not-modified"===s.kind?void 0:s.detail.cwd;if(!r)throw new h("CLI_SESSION_WORKSPACE_MISSING",`AI session \`${i}\` has no working directory to open a terminal in.`,8,{instanceId:n,sessionId:i});const d={appId:o,cwd:r},c=await zg(e,"ai-session open-terminal",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/sessions`,body:{appId:o,options:{cwd:r}}}),()=>a.client.appSessions.launch(n,d));if(c)return{data:c,columns:[{key:"id",header:"app session"},{key:"appId",header:"app"},{key:"status",header:"status"}],message:`Terminal app session \`${c.id}\` started in \`${r}\`.`}}},{id:"ai-session command",group:"ai-session",name:"command",stage:"B",write:!0,summary:"Run a provider command on an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"command",description:"Command name (review, rename, goal, compact)",required:!0}],options:[{flags:"--argument <text>",description:"Command argument (thread name for rename, objective for goal)"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),command:o.z.string(),argument:o.z.string().optional()}),output:xe,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=yg(t,"command"),a=Ig(t,"argument"),s=vg(ve,{command:o,...a?{argument:a}:{}},"AI session command"),r=await pg(e),d=await zg(e,"ai-session command",()=>({method:"POST",path:`${jg(n,i)}/commands`,body:s}),()=>r.client.aiSessions.executeCommand(n,i,s));if(d)return{data:d,columns:[{key:"command",header:"command"},{key:"value",header:"value",width:60}],message:`Command \`${d.command}\` completed for AI session \`${i}\`.`}}},{id:"ai-session mentions",group:"ai-session",name:"mentions",stage:"B",summary:"List mention candidates (skills, plugins, apps, files) of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--kind <plugin|skill|file|directory|app>",description:"Only show candidates of this kind"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),kind:o.z.string().optional()}),output:Ee,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=Ig(t,"kind"),a=o?function(e){const t=Re.safeParse(e);if(!t.success)throw z("CLI_INVALID_OPTION",`--kind must be one of: ${Re.options.join(", ")}.`,{option:"kind",value:e});return t.data}(o):void 0,s=await pg(e),r=await s.client.aiSessions.mentionCatalog(n,i,e.signal),d=a?r.candidates.filter(e=>e.kind===a):r.candidates;if(e.output.json)return{data:{...r,candidates:d}};const c=d.length?r.diagnostics.length?`${r.diagnostics.length} mention diagnostic(s) reported; re-run with --json for details.`:void 0:`No mention candidates${a?` of kind \`${a}\``:""} for session \`${i}\`.`;return{data:d,columns:Pg,message:c}}},{id:"ai-session mentions files",group:"ai-session",name:"mentions files",stage:"B",summary:"Search files and directories relative to the session working directory",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"query",description:"Search query (defaults to no filter)"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),query:o.z.string().optional()}),output:Pe,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=t.args.query?.trim()??"",a=await pg(e),s=await a.client.aiSessions.searchMentionFiles(n,i,o,e.signal);return e.output.json?{data:s}:{data:s.candidates,columns:Pg,message:s.candidates.length?void 0:`No files matched \`${o}\` in \`${s.cwd}\`.`}}},{id:"ai-session upload",group:"ai-session",name:"upload",stage:"B",write:!0,summary:"Upload a local file as a draft message attachment",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"file",description:"Local file to upload",required:!0}],options:[{flags:"--name <name>",description:"Attachment name (defaults to the file name)"},{flags:"--mime <mime>",description:"Attachment MIME type (defaults by extension)"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),file:o.z.string(),name:o.z.string().optional(),mime:o.z.string().optional()}),output:Ni,handler:async function(e,n){const o=yg(n,"instanceId"),a=yg(n,"sessionId"),s=i.resolve(yg(n,"file"));let r;try{const e=t.statSync(s);if(!e.isFile())throw new Error("not a regular file");if(0===e.size)throw new Error("file is empty");if(e.size>N)throw new Error("file is larger than 20971520 bytes");r=t.readFileSync(s)}catch(e){throw z("CLI_FILE_UNREADABLE",`Cannot read attachment \`${s}\`: ${e instanceof Error?e.message:String(e)}`,{file:s})}const d=Ig(n,"name")??i.basename(s),c=Ig(n,"mime")??function(e){return Og[i.extname(e).toLowerCase()]??"application/octet-stream"}(d),l=c.startsWith("image/")?"image":"file",m=new URLSearchParams({scopeType:"session",scopeId:a,kind:l,name:d,mime:c,size:String(r.byteLength)}),p=await pg(e),u=await zg(e,"ai-session upload",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(o)}/ai-session-attachments/drafts?${m}`,body:{contentType:"application/octet-stream",size:r.byteLength}}),()=>p.client.aiSessions.uploadAttachment({instanceId:o,sessionId:a,scopeType:"session",kind:l,name:d,mime:c,data:`data:${c};base64,${r.toString("base64")}`}));if(u)return{data:u,columns:[{key:"id",header:"attachment"},{key:"kind",header:"kind"},{key:"name",header:"name",width:30},{key:"size",header:"size"},{key:"expiresAt",header:"expires"}],message:`Uploaded \`${d}\` (${r.byteLength} bytes); send it with --attachment ${u.id}.`}}},{id:"ai-session attachment",group:"ai-session",name:"attachment",stage:"B",summary:"Download the content of a message attachment",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"messageId",description:"Message ID",required:!0},{name:"attachmentId",description:"Attachment ID",required:!0}],options:[{flags:"--output <file>",description:"Write to this file or directory (defaults to the attachment name)"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),messageId:o.z.string(),attachmentId:o.z.string(),output:o.z.string().optional()}),output:o.z.object({path:o.z.string(),size:o.z.number().int().nonnegative(),contentType:o.z.string().optional()}),handler:async function(e,n){const o=yg(n,"instanceId"),a=yg(n,"sessionId"),s=yg(n,"messageId"),r=yg(n,"attachmentId"),d=await pg(e),c=await d.client.aiSessions.attachmentContent(o,a,s,r),l=c.filename?i.basename(c.filename):r,m=Ig(n,"output");let p=i.resolve(m??l);if(m)try{t.statSync(p).isDirectory()&&(p=i.join(p,l))}catch{}try{t.writeFileSync(p,c.body,{mode:420})}catch(e){throw z("CLI_FILE_WRITE_FAILED",`Cannot write attachment to \`${p}\`: ${e instanceof Error?e.message:String(e)}`,{path:p})}return{data:{path:p,size:c.body.byteLength,...c.contentType?{contentType:c.contentType}:{}},columns:[{key:"path",header:"path",width:50},{key:"size",header:"size"},{key:"contentType",header:"content type"}],message:`Saved attachment \`${r}\` to \`${p}\`.`}}},{id:"ai-session model",group:"ai-session",name:"model",stage:"B",write:!0,summary:"Switch the model of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--entity <modelEntityId>",description:"Model entity ID"},{flags:"--name <modelName>",description:"Model name within the entity"},{flags:"--request-id <id>",description:"Client request ID for retry-safe switching"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),entity:o.z.string(),name:o.z.string(),requestId:o.z.string().optional()}),output:Ve,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o={modelEntityId:bg(t,"entity"),modelName:bg(t,"name")},s=Ig(t,"request-id")??a.randomUUID(),r=await pg(e),d=await zg(e,"ai-session model",()=>({method:"PUT",path:`${jg(n,i)}/model-selection`,body:{clientRequestId:s,modelSelection:o}}),()=>r.client.aiSessions.updateModelSelection(n,i,s,o));if(d)return{data:d,columns:[{key:"sessionId",header:"session"},{key:"accepted",header:"accepted"}],message:`Model selection for AI session \`${i}\` updated.`}}},{id:"ai-session reasoning",group:"ai-session",name:"reasoning",stage:"B",write:!0,summary:"Set the reasoning effort of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--effort <none|minimal|low|medium|high|xhigh|max|ultra>",description:"Reasoning effort"},{flags:"--request-id <id>",description:"Client request ID for retry-safe updates"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),effort:o.z.string(),requestId:o.z.string().optional()}),output:Ye,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=Bg(bg(t,"effort")),s=Ig(t,"request-id")??a.randomUUID(),r=await pg(e),d=await zg(e,"ai-session reasoning",()=>({method:"PUT",path:`${jg(n,i)}/reasoning-effort`,body:{clientRequestId:s,reasoningEffort:o}}),()=>r.client.aiSessions.updateReasoningEffort(n,i,s,o));if(d)return{data:d,columns:[{key:"sessionId",header:"session"},{key:"accepted",header:"accepted"}],message:`Reasoning effort for AI session \`${i}\` updated.`}}},{id:"ai-session queue list",group:"ai-session",name:"queue list",stage:"B",summary:"List queued messages of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string()}),output:pt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=await pg(e),a=Ag(await o.client.aiSessions.detail(n,i,void 0,e.signal),i).queue;return e.output.json?{data:a}:{data:a.items,columns:[{key:"id",header:"queue"},{key:"status",header:"status"},{key:"message",header:"message",width:50},{key:"createdAt",header:"created"}],message:a.items.length?void 0:"No queued messages."}}},{id:"ai-session queue steer",group:"ai-session",name:"queue steer",stage:"B",write:!0,summary:"Steer a queued message into the active turn",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"queueId",description:"Queued message ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:Tt,handler:_g},{id:"ai-session queue retry",group:"ai-session",name:"queue retry",stage:"B",write:!0,summary:"Retry a failed queued message",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"queueId",description:"Queued message ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:Rt,handler:Ug},{id:"ai-session queue remove",group:"ai-session",name:"queue remove",stage:"B",write:!0,summary:"Remove a queued message",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"queueId",description:"Queued message ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:Rt,handler:Lg},{id:"ai-session queue edit",group:"ai-session",name:"queue edit",stage:"B",write:!0,summary:"Edit a queued message of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"queueId",description:"Queued message ID",required:!0}],options:[{flags:"--message <text>",description:"Replacement message text"},{flags:"--expected-revision <revision>",description:"Queue revision for optimistic concurrency (defaults to the current queue)"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string(),message:o.z.string(),expectedRevision:o.z.string().optional()}),output:Rt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=yg(t,"queueId"),a=bg(t,"message"),s=await pg(e),r={expectedRevision:await Dg(e,s,n,i,t),message:a},d=await zg(e,"ai-session queue edit",()=>({method:"PATCH",path:`${jg(n,i)}/queue/${encodeURIComponent(o)}`,body:r}),()=>s.client.aiSessions.editQueue(n,i,o,r));if(d)return{data:d,message:`Queued message \`${o}\` updated.`}}},{id:"ai-session queue reorder",group:"ai-session",name:"queue reorder",stage:"B",write:!0,summary:"Reorder queued messages of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--queue <queueId>",description:"Queued message ID in the new order",repeatable:!0},{flags:"--expected-revision <revision>",description:"Queue revision for optimistic concurrency (defaults to the current queue)"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),queue:o.z.array(o.z.string()).optional(),expectedRevision:o.z.string().optional()}),output:Rt,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=wg(t,"queue");if(!o.length)throw new h("CLI_OPTION_MISSING","Pass at least one --queue <queueId> to reorder.",2,{option:"queue"});const a=await pg(e),s={expectedRevision:await Dg(e,a,n,i,t),queueIds:o},r=await zg(e,"ai-session queue reorder",()=>({method:"PATCH",path:`${jg(n,i)}/queue/reorder`,body:s}),()=>a.client.aiSessions.reorderQueue(n,i,s));if(r)return{data:r,message:`Queue for AI session \`${i}\` reordered.`}}},{id:"ai-session workspace",group:"ai-session",name:"workspace",stage:"B",summary:"Show the repository workspace and branch state an AI session would start from",args:[Lf],options:[{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder to inspect"}],input:Hz({instanceId:o.z.string(),cwdFolder:o.z.string().optional()}),output:qn,handler:async function(e,t){const n=yg(t,"instanceId"),i=Ig(t,"cwd-folder"),o=await pg(e);return{data:await o.client.aiSessions.workspace(n,i,e.signal),columns:Tg}}},{id:"ai-session checkout",group:"ai-session",name:"checkout",stage:"B",write:!0,summary:"Check out a branch in the repository workspace used by new AI sessions",args:[Lf],options:[{flags:"--branch <branch>",description:"Branch to check out"},{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder that owns the workspace"}],input:Hz({instanceId:o.z.string(),branch:o.z.string(),cwdFolder:o.z.string().optional()}),output:qn,examples:["thctl ai-session checkout <instanceId> --branch feature/demo"],handler:async function(e,t){const n=yg(t,"instanceId"),i=bg(t,"branch"),o=Ig(t,"cwd-folder"),a={branch:i,...o?{cwdFolderId:o}:{}},s=await pg(e),r=await zg(e,"ai-session checkout",()=>({method:"POST",path:`${Rg(n)}/checkout`,body:a}),()=>s.client.aiSessions.checkoutWorkspaceBranch(n,a));if(r)return{data:r,columns:Tg,message:`Workspace checked out to \`${i}\`.`}}},{id:"ai-session transcript",group:"ai-session",name:"transcript",stage:"B",summary:"Read the provider transcript tail of an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--tail <lines>",description:"Number of trailing lines to return (1..1000, default 200)"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),tail:o.z.number().optional()}),output:Ze,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=function(e,t){if(void 0===e)return;const n=Number(e);if(!Number.isInteger(n)||n<=0)throw z("CLI_INVALID_OPTION",`--${t} must be a positive integer.`,{option:t,value:e});return n}(Ig(t,"tail"),"tail"),a=await pg(e),s=await a.client.aiSessions.transcript(n,i,o,e.signal);return e.output.json?{data:s}:{data:s.tail,message:`${s.lineCount} line(s) in ${s.path}${o?`, showing the last ${o}`:""}.`}}},{id:"ai-session story-content",group:"ai-session",name:"story-content",stage:"B",summary:"List the Story documents of an AI session (read-only)",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string()}),output:o.z.object({storyId:o.z.string(),documents:xi.shape.documents}),handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=await pg(e),a=await o.client.aiSessions.storyContent(n,i,e.signal);return e.output.json?{data:a}:{data:a.documents,columns:Fg,message:a.documents.length?`Story \`${a.storyId}\` has ${a.documents.length} document(s); read one with \`ai-session story-content read\`.`:`Story \`${a.storyId}\` has no documents.`}}},{id:"ai-session story-content read",group:"ai-session",name:"story-content read",stage:"B",summary:"Read one Story document of an AI session (read-only)",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--path <storyPath>",description:"Story document path inside the Story"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),path:o.z.string()}),output:Ci,examples:["thctl ai-session story-content read <instanceId> <sessionId> --path docs/design.md"],handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=bg(t,"path"),a=await pg(e),s=await a.client.aiSessions.storyContentPreview(n,i,o,e.signal);return e.output.json?{data:s}:{data:s.content,message:`${s.storyPath} at revision ${s.revision} (${s.size} bytes).`}}}]),Mf=Vz("app-session","Inspect and control app sessions",[{id:"app-session list",group:"app-session",name:"list",stage:"B",summary:"List app sessions across visible instances",options:[{flags:"--instance <instanceId>",description:"Only sessions of this instance"}],input:Hz({instance:o.z.string().optional()}),output:eo,handler:async function(e,t){const n=Ig(t,"instance"),i=await pg(e),o=await i.client.appSessions.list(e.signal,n);if(e.output.json)return{data:o};const a=o.instances.flatMap(e=>e.appSessions.sessions.map(t=>({...t,instanceId:e.instanceId})));return{data:a,columns:Hg,message:a.length?void 0:"No app sessions matched."}}},{id:"app-session show",group:"app-session",name:"show",stage:"B",summary:"Show one app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:Hz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Hi,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"appSessionId"),o=await pg(e),a=(await o.client.appSessions.list(e.signal,n)).instances.filter(e=>e.instanceId===n).flatMap(e=>e.appSessions.sessions).find(e=>e.id===i);if(!a)throw new h("CLI_APP_SESSION_NOT_FOUND",`No app session \`${i}\` is visible on instance \`${n}\`.`,7,{instanceId:n,appSessionId:i});return{data:a,columns:Hg}}},{id:"app-session start",group:"app-session",name:"start",stage:"B",write:!0,summary:"Start an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0}],options:[{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder to launch in"}],input:Hz({instanceId:o.z.string(),appId:o.z.string(),cwdFolder:o.z.string().optional()}),output:Hi,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"appId"),o=Ig(t,"cwd-folder"),a={appId:i,...o?{cwdFolderId:o}:{}},s=await pg(e),r=await zg(e,"app-session start",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/sessions`,body:a}),()=>s.client.appSessions.launch(n,a));if(r)return{data:r,columns:[{key:"id",header:"app session"},{key:"appId",header:"app"},{key:"status",header:"status"}],message:`App session \`${r.id}\` started.`}}},{id:"app-session stop",group:"app-session",name:"stop",stage:"B",write:!0,summary:"Stop an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:Hz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Hi,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"appSessionId"),o=await pg(e),a=await zg(e,"app-session stop",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/sessions/${encodeURIComponent(i)}/stop`,body:{}}),()=>o.client.appSessions.stop(n,i));if(a)return{data:a,columns:[{key:"id",header:"app session"},{key:"status",header:"status"}],message:`App session \`${i}\` is ${a.status}.`}}},{id:"app-session rename",group:"app-session",name:"rename",stage:"B",write:!0,summary:"Rename an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0},{name:"title",description:"New session title",required:!0}],input:Hz({instanceId:o.z.string(),appSessionId:o.z.string(),title:o.z.string()}),output:Hi,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"appSessionId"),o=vg(Vg,yg(t,"title"),"title"),a=await pg(e),s=await zg(e,"app-session rename",()=>({method:"PATCH",path:Wg(n,i),body:{title:o}}),()=>a.client.appSessions.rename(n,i,o));if(s)return{data:s,columns:[{key:"id",header:"app session"},{key:"title",header:"title",width:40},{key:"status",header:"status"}],message:`App session \`${s.id}\` renamed to \`${s.title??o}\`.`}}},{id:"app-session access",group:"app-session",name:"access",stage:"B",write:!0,summary:"Create a terminal or VNC access lease for an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:Hz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Di,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"appSessionId"),o=await pg(e),a=await zg(e,"app-session access",()=>({method:"POST",path:`${Wg(n,i)}/access`,body:{}}),()=>o.client.appSessions.access(n,i));if(a)return e.output.json?{data:a}:{data:{...a,url:new URL(a.url,o.identity.origin).toString()},columns:Gg,message:`${a.mode.toUpperCase()} access lease expires at ${a.expiresAt}.`}}},{id:"app-session revoke-access",group:"app-session",name:"revoke-access",stage:"B",write:!0,summary:"Revoke an app session access lease (read the token from stdin)",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:Hz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:qi,examples:["thctl app-session access <instanceId> <appSessionId> --json | jq -r .token | thctl app-session revoke-access <instanceId> <appSessionId> --token-stdin --yes"],handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"appSessionId"),o=await Sg(t),a=await pg(e),s=await zg(e,"app-session revoke-access",()=>({method:"DELETE",path:`${Wg(n,i)}/access`,body:{token:o}}),()=>a.client.appSessions.revokeAccess(n,i,o));if(s)return{data:s,columns:[{key:"revoked",header:"revoked"}],message:`App session \`${i}\` access lease revoked.`}}},{id:"app-session restart",group:"app-session",name:"restart",stage:"B",write:!0,summary:"Restart an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],input:Hz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Hi,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"appSessionId"),o=await pg(e),a=await zg(e,"app-session restart",()=>({method:"POST",path:`${Wg(n,i)}/restart`,body:{}}),()=>o.client.appSessions.restart(n,i));if(a)return{data:a,columns:[{key:"id",header:"app session"},{key:"appId",header:"app"},{key:"status",header:"status"}],message:`App session \`${i}\` restarted as \`${a.id}\`.`}}},{id:"app-session logs",group:"app-session",name:"logs",stage:"B",summary:"Read the log files of an app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],options:[{flags:"--max-bytes <bytes>",description:"Tail size per log file (1024..524288, default 65536)"}],input:Hz({instanceId:o.z.string(),appSessionId:o.z.string(),maxBytes:o.z.number().optional()}),output:Bi,handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"appSessionId"),o=function(e,t){if(void 0===e)return;const n=Number(e);if(!Number.isInteger(n)||n<=0)throw z("CLI_INVALID_OPTION",`--${t} must be a positive integer.`,{option:t,value:e});return n}(Ig(t,"max-bytes"),"max-bytes"),a=await pg(e),s=await a.client.appSessions.logs(n,i,o,e.signal);return e.output.json?{data:s}:0===s.files.length?{data:"",message:`App session \`${i}\` has no log files.`}:{data:s.files.map(e=>`==> ${e.name}${e.truncated?" (truncated)":""} <==\n${e.content}`).join("\n"),message:`${s.files.length} log file(s) from ${s.logDir}, last ${s.maxBytes} bytes per file.`}}},{id:"app-session screenshot",group:"app-session",name:"screenshot",stage:"B",summary:"Save a PNG screenshot of a GUI app session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appSessionId",description:"App session ID",required:!0}],options:[{flags:"--out <file>",description:"Target file or directory (default <appSessionId>.png)"}],input:Hz({instanceId:o.z.string(),appSessionId:o.z.string(),out:o.z.string().optional()}),output:o.z.object({path:o.z.string(),size:o.z.number(),contentType:o.z.string().optional()}),examples:["thctl app-session screenshot <instanceId> <appSessionId> --out ./session.png"],handler:async function(e,n){const o=yg(n,"instanceId"),a=yg(n,"appSessionId"),s=await pg(e),r=await s.client.appSessions.screenshot(o,a,e.signal),d=Ig(n,"out");let c=i.resolve(d??`${a}.png`);if(d)try{t.statSync(c).isDirectory()&&(c=i.join(c,`${a}.png`))}catch{}try{t.writeFileSync(c,r.body,{mode:420})}catch(e){throw z("CLI_FILE_WRITE_FAILED",`Cannot write screenshot to \`${c}\`: ${e instanceof Error?e.message:String(e)}`,{path:c})}return{data:{path:c,size:r.body.byteLength,...r.contentType?{contentType:r.contentType}:{}},columns:Yg,message:`Saved screenshot of app session \`${a}\` to \`${c}\`.`}}}]),Bf=Vz("app-profile","Manage browser profiles for instance apps",[{id:"app-profile list",group:"app-profile",name:"list",stage:"B",summary:"List browser profiles of an instance app",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0}],input:Hz({instanceId:o.z.string(),appId:o.z.string()}),output:oo,handler:async function(e,t){const{instanceId:n,appId:i}=Zg(t),o=await pg(e),a=await o.client.appProfiles.list(n,i,e.signal);return e.output.json?{data:a}:{data:a.profiles,columns:Jg,message:a.profiles.length?void 0:`No browser profiles matched app \`${i}\`.`}}},{id:"app-profile create",group:"app-profile",name:"create",stage:"B",write:!0,summary:"Create a browser profile for an instance app",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0}],options:[{flags:"--name <name>",description:"Profile name"}],input:Hz({instanceId:o.z.string(),appId:o.z.string(),name:o.z.string()}),output:io,handler:async function(e,t){const{instanceId:n,appId:i}=Zg(t),o=vg(Kg,bg(t,"name"),"--name"),a=await pg(e),s=await zg(e,"app-profile create",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/${encodeURIComponent(i)}/profiles`,body:{name:o}}),()=>a.client.appProfiles.create(n,i,o));if(s)return{data:s,columns:Jg,message:`Browser profile \`${s.name}\` created for app \`${i}\`.`}}},{id:"app-profile rename",group:"app-profile",name:"rename",stage:"B",write:!0,summary:"Rename a browser profile",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0},{name:"profileId",description:"Browser profile ID",required:!0}],options:[{flags:"--name <name>",description:"New profile name"}],input:Hz({instanceId:o.z.string(),appId:o.z.string(),profileId:o.z.string(),name:o.z.string()}),output:io,handler:async function(e,t){const{instanceId:n,appId:i}=Zg(t),o=yg(t,"profileId"),a=vg(Kg,bg(t,"name"),"--name"),s=await pg(e),r=await zg(e,"app-profile rename",()=>({method:"PATCH",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/${encodeURIComponent(i)}/profiles/${encodeURIComponent(o)}`,body:{name:a}}),()=>s.client.appProfiles.rename(n,i,o,a));if(r)return{data:r,columns:Jg,message:`Browser profile \`${o}\` renamed to \`${r.name}\`.`}}},{id:"app-profile set-default",group:"app-profile",name:"set-default",stage:"B",write:!0,summary:"Set a browser profile as the app default",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0},{name:"profileId",description:"Browser profile ID",required:!0}],input:Hz({instanceId:o.z.string(),appId:o.z.string(),profileId:o.z.string()}),output:io,handler:async function(e,t){const{instanceId:n,appId:i}=Zg(t),o=yg(t,"profileId"),a=await pg(e),s=await zg(e,"app-profile set-default",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/${encodeURIComponent(i)}/profiles/${encodeURIComponent(o)}/default`,body:{}}),()=>a.client.appProfiles.setDefault(n,i,o));if(s)return{data:s,columns:Jg,message:`Browser profile \`${s.name}\` is now the default for app \`${i}\`.`}}},{id:"app-profile remove",group:"app-profile",name:"remove",stage:"B",write:!0,summary:"Delete a browser profile and its browsing data",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0},{name:"profileId",description:"Browser profile ID",required:!0}],input:Hz({instanceId:o.z.string(),appId:o.z.string(),profileId:o.z.string()}),output:o.z.object({removed:o.z.boolean()}),handler:async function(e,t){const{instanceId:n,appId:i}=Zg(t),o=yg(t,"profileId"),a=await pg(e),s=await zg(e,"app-profile remove",()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}/apps/${encodeURIComponent(i)}/profiles/${encodeURIComponent(o)}`}),()=>a.client.appProfiles.remove(n,i,o));if(s)return{data:s,columns:[{key:"removed",header:"removed"}],message:`Browser profile \`${o}\` removed from app \`${i}\`.`}}}]),Ff=Vz("node","Inspect nodes",[{id:"node list",group:"node",name:"list",stage:"B",summary:"List nodes in the fleet directory",input:Fz,output:ul,handler:async function(e){const t=await pg(e),n=await t.client.resources.nodes(e.signal);return e.output.json?{data:n}:{data:kh(n),columns:Ah,message:n.length?void 0:"No nodes matched."}}},{id:"node show",group:"node",name:"show",stage:"B",summary:"Show one node from the fleet directory",args:[{name:"nodeId",description:"Node ID",required:!0}],input:Hz({nodeId:o.z.string()}),output:pl,handler:async function(e,t){const n=yg(t,"nodeId"),i=await pg(e),o=(await i.client.resources.nodes(e.signal)).find(e=>e.id===n);if(!o)throw new h("CLI_NODE_NOT_FOUND",`No node \`${n}\` is visible in the fleet directory.`,7,{nodeId:n});return{data:o,columns:Ah}}},{id:"node rename",group:"node",name:"rename",stage:"B",write:!0,summary:"Rename a node",args:[{name:"nodeId",description:"Node ID",required:!0},{name:"name",description:"New display name",required:!0}],input:Hz({nodeId:o.z.string(),name:o.z.string()}),output:o.z.object({id:o.z.string(),name:o.z.string()}),handler:async function(e,t){const n=yg(t,"nodeId"),i=yg(t,"name"),o=await pg(e),a=await zg(e,"node rename",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}`,body:{name:i}}),()=>o.client.resources.updateNodeName(n,i));if(a)return{data:a,columns:[{key:"id",header:"node"},{key:"name",header:"name"}],message:`Node \`${n}\` renamed to \`${a.name}\`.`}}},...sf]),Hf={flags:"--node <nodeId>",description:"Node that owns the story (resolved from the directory when omitted)"},Vf=[{name:"storyId",description:"Story ID",required:!0},{name:"automationId",description:"Automation ID",required:!0}],Gf=Hz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional()}),Wf={flags:"--config <file>",description:"Story automation JSON file"},Yf=Hz({storyId:o.z.string(),node:o.z.string().optional(),config:o.z.string()}),Kf=Hz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional(),config:o.z.string()}),Jf=Vz("story","Work with stories, documents and automations",[{id:"story list",group:"story",name:"list",stage:"B",summary:"List stories across visible nodes",input:Fz,output:o.z.object({stories:o.z.array(fi),unavailableNodeIds:o.z.array(o.z.string())}),handler:async function(e){const t=await pg(e),n=await t.client.stories.list(void 0,e.signal);if(e.output.json)return{data:n};const i=n.unavailableNodeIds.length?`Unavailable nodes: ${n.unavailableNodeIds.join(", ")}`:n.stories.length?void 0:"No stories matched.";return{data:Lh(n.stories),columns:Nh,message:i}}},{id:"story show",group:"story",name:"show",stage:"B",summary:"Show one story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Hf],input:Hz({storyId:o.z.string(),node:o.z.string().optional()}),output:fi,handler:async function(e,t){const n=yg(t,"storyId"),i=await pg(e),o=await Dh(i,n,Ig(t,"node"));return Uh(e,await i.client.stories.get(n,o))}},{id:"story create",group:"story",name:"create",stage:"B",write:!0,summary:"Create a story",args:[{name:"title",description:"Story title",required:!0}],options:[Hf,{flags:"--description <description>",description:"Story description"},{flags:"--max-idle-ai-sessions <count>",description:"Idle AI session retention limit"}],input:Hz({title:o.z.string(),node:o.z.string().optional(),description:o.z.string().optional(),maxIdleAiSessions:o.z.number().int().nonnegative().optional()}),output:fi,handler:async function(e,t){const n=yg(t,"title"),i=Ig(t,"description"),o=Ig(t,"max-idle-ai-sessions"),a={title:n,...i?{description:i}:{},...o?{maxIdleAiSessions:Jh(o,"max-idle-ai-sessions")}:{}},s=await pg(e),r=await async function(e,t){if(t)return t;const n=await e.client.resources.nodes();if(1===n.length)return n[0].id;throw z("CLI_NODE_REQUIRED",0===n.length?"No node is registered; register a node before creating stories.":`More than one node is registered (${n.map(e=>e.id).join(", ")}); pass --node <nodeId>.`,{nodeIds:n.map(e=>e.id)})}(s,Ig(t,"node")),d=await zg(e,"story create",()=>({method:"POST",path:"/api/stories",body:{nodeId:r,input:a}}),()=>s.client.stories.create(r,a));if(d)return{...Uh(e,d),message:`Story \`${d.id}\` created on node \`${r}\`.`}}},{id:"story update",group:"story",name:"update",stage:"B",write:!0,summary:"Update story metadata",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Hf,{flags:"--title <title>",description:"New title"},{flags:"--description <description>",description:"New description"},{flags:"--max-idle-ai-sessions <count>",description:"Idle AI session retention limit"}],input:Hz({storyId:o.z.string(),node:o.z.string().optional(),title:o.z.string().optional(),description:o.z.string().optional(),maxIdleAiSessions:o.z.number().int().nonnegative().optional()}),output:fi,handler:async function(e,t){const n=yg(t,"storyId"),i=Ig(t,"title"),o=Ig(t,"description"),a=Ig(t,"max-idle-ai-sessions"),s={...i?{title:i}:{},...o?{description:o}:{},...a?{maxIdleAiSessions:Jh(a,"max-idle-ai-sessions")}:{}};if(0===Object.keys(s).length)throw z("CLI_OPTION_MISSING","Provide at least one of --title, --description or --max-idle-ai-sessions.",{command:"story update"});const r=await pg(e),d=await Dh(r,n,Ig(t,"node")),c=await zg(e,"story update",()=>({method:"PATCH",path:`/api/stories/${encodeURIComponent(n)}`,body:{nodeId:d,input:s}}),()=>r.client.stories.update(n,d,s));if(c)return{...Uh(e,c),message:`Story \`${n}\` updated.`}}},{id:"story archive",group:"story",name:"archive",stage:"B",write:!0,summary:"Archive a story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Hf],input:Hz({storyId:o.z.string(),node:o.z.string().optional()}),output:fi,handler:Mh},{id:"story restore",group:"story",name:"restore",stage:"B",write:!0,summary:"Restore an archived story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Hf],input:Hz({storyId:o.z.string(),node:o.z.string().optional()}),output:fi,handler:Bh},{id:"story remove",group:"story",name:"remove",stage:"B",write:!0,summary:"Remove a story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Hf],input:Hz({storyId:o.z.string(),node:o.z.string().optional()}),output:o.z.object({deleted:o.z.boolean()}),handler:Fh},{id:"story document update",group:"story",name:"document update",stage:"B",write:!0,summary:"Update story document metadata",args:[{name:"storyId",description:"Story ID",required:!0},{name:"path",description:"Document path inside the story",required:!0}],options:[Hf,{flags:"--title <title>",description:"New document title"},{flags:"--new-path <path>",description:"Move the document to this story path"}],input:Hz({storyId:o.z.string(),path:o.z.string(),node:o.z.string().optional(),title:o.z.string().optional(),newPath:o.z.string().optional()}),output:fi,handler:async function(e,t){const n=yg(t,"storyId"),i=yg(t,"path"),o=Ig(t,"title"),a=Ig(t,"new-path"),s={...o?{title:o}:{},...a?{storyPath:a}:{}};if(0===Object.keys(s).length)throw z("CLI_OPTION_MISSING","Provide --title or --new-path.",{command:"story document update"});const r=await pg(e),d=await Dh(r,n,Ig(t,"node")),c=await zg(e,"story document update",()=>({method:"PATCH",path:`/api/stories/${encodeURIComponent(n)}/documents/${encodeURIComponent(i)}`,body:{nodeId:d,input:s}}),()=>r.client.stories.updateDocument(n,d,i,s));if(c)return{...Uh(e,c),message:`Document \`${i}\` updated on story \`${n}\`.`}}},{id:"story document remove",group:"story",name:"document remove",stage:"B",write:!0,summary:"Remove a story document",args:[{name:"storyId",description:"Story ID",required:!0},{name:"path",description:"Document path inside the story",required:!0}],options:[Hf],input:Hz({storyId:o.z.string(),path:o.z.string(),node:o.z.string().optional()}),output:o.z.object({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"storyId"),i=yg(t,"path"),o=await pg(e),a=await Dh(o,n,Ig(t,"node")),s=await zg(e,"story document remove",()=>({method:"DELETE",path:`/api/stories/${encodeURIComponent(n)}/documents/${encodeURIComponent(i)}`,body:{nodeId:a}}),()=>o.client.stories.removeDocument(n,a,i));if(s)return{data:s,message:`Document \`${i}\` removed from story \`${n}\`.`}}},{id:"story document reorder",group:"story",name:"document reorder",stage:"B",write:!0,summary:"Reorder story documents",args:[{name:"storyId",description:"Story ID",required:!0},{name:"path",description:"Document paths in the new order",required:!0,variadic:!0}],options:[Hf],input:Hz({storyId:o.z.string(),path:o.z.array(o.z.string()),node:o.z.string().optional()}),output:fi,handler:async function(e,t){const n=yg(t,"storyId"),i=(t.rawArgs??[]).slice(1).map(e=>e.trim()).filter(Boolean);if(0===i.length)throw z("CLI_ARGUMENT_MISSING","Missing required argument <path...>.",{argument:"path"});const o=await pg(e),a=await Dh(o,n,Ig(t,"node")),s={storyPaths:i},r=await zg(e,"story document reorder",()=>({method:"POST",path:`/api/stories/${encodeURIComponent(n)}/documents/order`,body:{nodeId:a,input:s}}),()=>o.client.stories.reorderDocuments(n,a,s));if(r)return{...Uh(e,r),message:`Documents reordered on story \`${n}\`.`}}},{id:"story automation list",group:"story",name:"automation list",stage:"B",summary:"List story automations",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Hf],input:Hz({storyId:o.z.string(),node:o.z.string().optional()}),output:ri,handler:async function(e,t){const n=yg(t,"storyId"),i=await pg(e),o=await Dh(i,n,Ig(t,"node")),a=await i.client.stories.listAutomations(n,o);return e.output.json?{data:a}:{data:a.automations,columns:[{key:"automation.id",header:"automation"},{key:"automation.enabled",header:"enabled"},{key:"effectiveStatus",header:"status"},{key:"automation.actionId",header:"action"},{key:"nextRunAt",header:"next run"}],message:a.automations.length?void 0:"No automations matched."}}},{id:"story automation show",group:"story",name:"automation show",stage:"B",summary:"Show one story automation",args:Vf,options:[Hf],input:Gf,output:si,handler:async function(e,t){const n=yg(t,"storyId"),i=yg(t,"automationId"),o=await pg(e),a=await Dh(o,n,Ig(t,"node")),s=await o.client.stories.getAutomation(n,i,a);return e.output.json?{data:s}:{data:s,columns:[{key:"automation.id",header:"automation"},{key:"automation.enabled",header:"enabled"},{key:"effectiveStatus",header:"status"},{key:"lastRun.status",header:"last run"},{key:"nextRunAt",header:"next run"}]}}},{id:"story automation create",group:"story",name:"automation create",stage:"B",write:!0,summary:"Create a story automation from a JSON config file",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Hf,Wf],input:Yf,output:si,handler:async function(e,t){const n=yg(t,"storyId"),i=xg(bg(t,"config"),Gh,"story automation config"),o=await pg(e),a=await Dh(o,n,Ig(t,"node")),s={storyId:n,...i},r=await zg(e,"story automation create",()=>({method:"POST",path:`/api/stories/${encodeURIComponent(n)}/automations`,body:{nodeId:a,input:s}}),()=>o.client.stories.createAutomation(n,a,s));if(r)return{...Vh(e,r),message:`Automation \`${r.automation.id}\` created on story \`${n}\`.`}}},{id:"story automation update",group:"story",name:"automation update",stage:"B",write:!0,summary:"Update a story automation from a JSON config file",args:Vf,options:[Hf,Wf],input:Kf,output:si,handler:async function(e,t){const n=yg(t,"storyId"),i=yg(t,"automationId"),o=xg(bg(t,"config"),ti,"story automation update config"),a=await pg(e),s=await Dh(a,n,Ig(t,"node")),r=await zg(e,"story automation update",()=>({method:"PATCH",path:`/api/stories/${encodeURIComponent(n)}/automations/${encodeURIComponent(i)}`,body:{nodeId:s,input:o}}),()=>a.client.stories.updateAutomation(n,i,s,o));if(r)return{...Vh(e,r),message:`Automation \`${i}\` on story \`${n}\` updated.`}}},{id:"story automation remove",group:"story",name:"automation remove",stage:"B",write:!0,summary:"Remove a story automation",args:Vf,options:[Hf],input:Gf,output:o.z.object({deleted:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"storyId"),i=yg(t,"automationId"),o=await pg(e),a=await Dh(o,n,Ig(t,"node")),s=await zg(e,"story automation remove",()=>({method:"DELETE",path:`/api/stories/${encodeURIComponent(n)}/automations/${encodeURIComponent(i)}?nodeId=${encodeURIComponent(a)}`}),()=>o.client.stories.removeAutomation(n,i,a));if(s){if(!s.deleted)throw new h("CLI_STORY_AUTOMATION_NOT_REMOVED",`Automation \`${i}\` on story \`${n}\` was not removed.`,8,{storyId:n,automationId:i});return{data:s,message:`Automation \`${i}\` removed from story \`${n}\`.`}}}},{id:"story automation enable",group:"story",name:"automation enable",stage:"B",write:!0,summary:"Enable a story automation",args:Vf,options:[Hf],input:Gf,output:si,handler:Yh},{id:"story automation disable",group:"story",name:"automation disable",stage:"B",write:!0,summary:"Disable a story automation",args:Vf,options:[Hf],input:Gf,output:si,handler:Kh},{id:"story automation run",group:"story",name:"automation run",stage:"B",write:!0,summary:"Run a story automation now",args:Vf,options:[Hf,{flags:"--request-id <id>",description:"Client request ID for retry-safe runs"}],input:Hz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional(),requestId:o.z.string().optional()}),output:oi,handler:async function(e,t){const n=yg(t,"storyId"),i=yg(t,"automationId"),o=Ig(t,"request-id")??a.randomUUID(),s=await pg(e),r=await Dh(s,n,Ig(t,"node")),d={clientRequestId:o},c=await zg(e,"story automation run",()=>({method:"POST",path:`/api/stories/${encodeURIComponent(n)}/automations/${encodeURIComponent(i)}/run`,body:{nodeId:r,input:d}}),()=>s.client.stories.runAutomation(n,i,r,d));if(c)return{data:c,columns:_h,message:`Automation \`${i}\` run ${c.status}.`}}},{id:"story automation runs",group:"story",name:"automation runs",stage:"B",summary:"List recent automation runs",args:Vf,options:[Hf],input:Gf,output:di,handler:async function(e,t){const n=yg(t,"storyId"),i=yg(t,"automationId"),o=await pg(e),a=await Dh(o,n,Ig(t,"node")),s=await o.client.stories.automationRuns(n,i,a);return e.output.json?{data:s}:{data:s.runs,columns:_h,message:s.runs.length?void 0:"No runs matched."}}}]),Zf=Vz("trigger","Inspect and run instance triggers",[{id:"trigger list",group:"trigger",name:"list",stage:"B",summary:"List triggers from the control plane registry",options:[{flags:"--instance <instanceId>",description:"Only triggers deployed to this instance"}],input:Hz({instance:o.z.string().optional()}),output:Ma,handler:async function(e,t){const n=Ig(t,"instance"),i=await pg(e),o=await i.client.triggers.list(e.signal),a=n?o.triggers.filter(e=>e.deployments.some(e=>e.instanceId===n)):o.triggers;return e.output.json?{data:{...o,triggers:a}}:{data:a.map(Qh),columns:Zh,message:a.length?void 0:"No triggers matched."}}},{id:"trigger show",group:"trigger",name:"show",stage:"B",summary:"Show one trigger and its deployments",args:[{name:"configHash",description:"Trigger config hash",required:!0}],options:[{flags:"--instance <instanceId>",description:"Only deployments on this instance"}],input:Hz({configHash:o.z.string(),instance:o.z.string().optional()}),output:qa,handler:async function(e,t){const n=yg(t,"configHash"),i=Ig(t,"instance"),o=await pg(e),a=(await o.client.triggers.list(e.signal)).triggers.find(e=>e.configHash===n);if(!a)throw new h("CLI_TRIGGER_NOT_FOUND",`No trigger \`${n}\` is visible in the control plane registry.`,7,{configHash:n});const s=i?{...a,deployments:a.deployments.filter(e=>e.instanceId===i)}:a;if(i&&0===s.deployments.length)throw new h("CLI_TRIGGER_DEPLOYMENT_NOT_FOUND",`Trigger \`${n}\` has no deployment on instance \`${i}\`.`,7,{configHash:n,instanceId:i});return e.output.json?{data:s}:{data:Qh(s),columns:Zh}}},{id:"trigger create",group:"trigger",name:"create",stage:"B",write:!0,summary:"Create a trigger template and bind it to an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0}],options:[{flags:"--config <file>",description:"Trigger template JSON file"}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),config:o.z.string()}),output:o.z.looseObject({trigger:o.z.looseObject({configHash:o.z.string()}),binding:o.z.unknown()}),handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=xg(bg(t,"config"),Ba,"trigger config"),a=await pg(e),s=await zg(e,"trigger create",()=>{return{...(e=[{method:"POST",path:"/api/triggers",body:o},{method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/ai-sessions/${encodeURIComponent(i)}/triggers`,body:{configHash:"<created>"}}])[0],steps:e};var e},async()=>{const e=await a.client.triggers.create(o);return{trigger:e,binding:await a.client.triggers.bindSession(n,i,e.configHash)}});if(s)return{data:s,columns:Zh,message:`Trigger \`${s.trigger.configHash}\` created and bound to AI session \`${i}\`.`}}},{id:"trigger update",group:"trigger",name:"update",stage:"B",write:!0,summary:"Update a trigger template and fan out to its deployments",args:[{name:"configHash",description:"Trigger config hash",required:!0}],options:[{flags:"--config <file>",description:"Trigger template JSON file"}],input:Hz({configHash:o.z.string(),config:o.z.string()}),output:o.z.looseObject({}),handler:async function(e,t){const n=yg(t,"configHash"),i=xg(bg(t,"config"),Ba,"trigger config"),o=await pg(e),a=await zg(e,"trigger update",()=>({method:"PUT",path:`/api/triggers/${encodeURIComponent(n)}`,body:i}),()=>o.client.triggers.update(n,i));if(a)return{data:a,message:`Trigger \`${n}\` updated.`}}},{id:"trigger remove",group:"trigger",name:"remove",stage:"B",write:!0,summary:"Remove a trigger template and its deployments",args:[{name:"configHash",description:"Trigger config hash",required:!0}],input:Hz({configHash:o.z.string()}),output:o.z.looseObject({}),handler:async function(e,t){const n=yg(t,"configHash"),i=await pg(e),o=await zg(e,"trigger remove",()=>({method:"DELETE",path:`/api/triggers/${encodeURIComponent(n)}`}),()=>i.client.triggers.remove(n));if(o)return{data:o,message:`Trigger \`${n}\` removed.`}}},{id:"trigger run",group:"trigger",name:"run",stage:"B",write:!0,summary:"Run a trigger on an instance now",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"configHash",description:"Trigger config hash",required:!0}],options:[{flags:"--deployment <deploymentId>",description:"Specific deployment to run"}],input:Hz({instanceId:o.z.string(),configHash:o.z.string(),deployment:o.z.string().optional()}),output:o.z.unknown(),handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"configHash"),o=Ig(t,"deployment"),a=await pg(e),s=await zg(e,"trigger run",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/triggers/${encodeURIComponent(i)}/run`,body:o?{deploymentId:o}:{}}),()=>a.client.triggers.run(n,i,o));if(s)return{data:s,message:`Trigger \`${i}\` run requested on instance \`${n}\`.`}}},{id:"trigger bind",group:"trigger",name:"bind",stage:"B",write:!0,summary:"Bind a trigger template to an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"configHash",description:"Trigger config hash",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),configHash:o.z.string()}),output:o.z.object({config:Ea,deployment:Oa,runtime:Na.optional()}),handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=yg(t,"configHash"),a=await pg(e),s=await zg(e,"trigger bind",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/ai-sessions/${encodeURIComponent(i)}/triggers`,body:{configHash:o}}),()=>a.client.triggers.bindSession(n,i,o));if(s)return{data:s,message:`Trigger \`${o}\` bound to AI session \`${i}\` on instance \`${n}\`.`}}},{id:"trigger unbind",group:"trigger",name:"unbind",stage:"B",write:!0,summary:"Unbind a trigger template from an AI session",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"sessionId",description:"AI session ID",required:!0},{name:"configHash",description:"Trigger config hash",required:!0}],input:Hz({instanceId:o.z.string(),sessionId:o.z.string(),configHash:o.z.string()}),output:o.z.unknown(),handler:async function(e,t){const n=yg(t,"instanceId"),i=yg(t,"sessionId"),o=yg(t,"configHash"),a=await pg(e),s=await zg(e,"trigger unbind",()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}/ai-sessions/${encodeURIComponent(i)}/triggers/${encodeURIComponent(o)}`}),()=>a.client.triggers.unbindSession(n,i,o));if(s)return{data:s,message:`Trigger \`${o}\` unbound from AI session \`${i}\` on instance \`${n}\`.`}}},{id:"trigger apply",group:"trigger",name:"apply",stage:"B",write:!0,summary:"Apply a trigger template to instances targeting an AI session",args:[{name:"configHash",description:"Trigger config hash",required:!0}],options:[{flags:"--instance <instanceId>",description:"Instance to deploy to (repeatable)",repeatable:!0},{flags:"--session <sessionId>",description:"Target AI session ID"},{flags:"--disabled",description:"Create the deployment disabled"}],input:Hz({configHash:o.z.string(),instance:o.z.array(o.z.string()).min(1),session:o.z.string(),disabled:o.z.boolean().optional()}),output:o.z.looseObject({configHash:o.z.string(),results:o.z.array(o.z.unknown())}),handler:async function(e,t){const n=yg(t,"configHash"),i=bg(t,"session"),o=[...new Set(wg(t,"instance"))];if(!o.length)throw new h("CLI_OPTION_MISSING","Pass at least one --instance <instanceId> to apply.",2,{option:"instance"});const a={instanceIds:o,target:{type:"ai-session",aiSessionId:i},enabled:!0!==t.options.disabled},s=await pg(e),r=await zg(e,"trigger apply",()=>({method:"POST",path:`/api/triggers/${encodeURIComponent(n)}/apply`,body:a}),()=>s.client.triggers.apply(n,a));if(r)return{data:r,message:`Trigger \`${n}\` applied to ${o.length} instance(s).`}}}]),Qf=Vz("model","Inspect the model registry",[{id:"model list",group:"model",name:"list",stage:"B",summary:"List models in the public registry",input:Fz,output:kl,handler:async function(e){const t=await pg(e),n=await t.client.resources.models(e.signal);if(e.output.json)return{data:n};const i=n.models.map(e=>({...e,model:{...e.model,protocols:e.model.protocols.join(",")},locations:e.locations.map(e=>`${e.type}${e.nodeId?`:${e.nodeId}`:""}${e.enabled?"":"(disabled)"}`).join(",")}));return{data:i,columns:xh,message:i.length?void 0:"No models matched."}}},{id:"model show",group:"model",name:"show",stage:"B",summary:"Show one model",args:[{name:"modelId",description:"Model entity ID",required:!0}],input:Hz({modelId:o.z.string()}),output:Al,handler:async function(e,t){const n=yg(t,"modelId"),i=await pg(e),o=(await i.client.resources.models(e.signal)).models.find(e=>e.id===n||e.model.id===n);if(!o)throw new h("CLI_MODEL_NOT_FOUND",`No model \`${n}\` is visible in the public registry.`,7,{modelId:n});return e.output.json?{data:o}:{data:{...o,model:{...o.model,protocols:o.model.protocols.join(",")}},columns:xh}}},...Tf]),Xf=Vz("user","Inspect users and their sessions",[{id:"user list",group:"user",name:"list",stage:"B",summary:"List Control Plane users",options:[{flags:"--include-archived",description:"Include archived users"}],input:Hz({includeArchived:o.z.boolean().optional()}),output:o.z.array(jo),handler:async function(e,t){const n=!0===t.options["include-archived"],i=await pg(e),o=await i.client.users.list({includeArchived:n},e.signal);return e.output.json?{data:o}:{data:o,columns:az,message:o.length?void 0:"No users matched."}}},{id:"user show",group:"user",name:"show",stage:"B",summary:"Show one user",args:[{name:"userId",description:"User ID",required:!0}],input:Hz({userId:o.z.string()}),output:_o,handler:async function(e,t){const n=yg(t,"userId"),i=await pg(e),o=await i.client.users.detail(n,e.signal);return e.output.json?{data:o}:{data:o,columns:az}}},{id:"user sessions",group:"user",name:"sessions",stage:"B",summary:"List sessions of a user",args:[{name:"userId",description:"User ID",required:!0}],input:Hz({userId:o.z.string()}),output:o.z.array(Po),handler:async function(e,t){const n=yg(t,"userId"),i=await pg(e),o=await i.client.users.sessions(n,e.signal);return e.output.json?{data:o}:{data:o,columns:sz,message:o.length?void 0:"No sessions matched."}}},{id:"user session-revoke",group:"user",name:"session-revoke",stage:"B",write:!0,summary:"Revoke one session of a user",args:[{name:"userId",description:"User ID",required:!0},{name:"sessionId",description:"Session ID",required:!0}],input:Hz({userId:o.z.string(),sessionId:o.z.string()}),output:o.z.object({revoked:o.z.boolean()}),handler:async function(e,t){const n=yg(t,"userId"),i=yg(t,"sessionId"),o=await pg(e),a=await zg(e,"user session-revoke",()=>({method:"DELETE",path:`/api/users/${encodeURIComponent(n)}/sessions/${encodeURIComponent(i)}`}),()=>o.client.users.revokeSession(n,i));if(a){if(!a.revoked)throw new h("CLI_SESSION_NOT_REVOKED",`Session \`${i}\` was not revoked.`,8,{userId:n,sessionId:i});return{data:a,message:`Session \`${i}\` revoked.`}}}},...Pf]),ey=[{flags:"--scope <project|user>",description:"Skills scope: user (~/.agents/skills) or project (./.agents/skills), default user"},{flags:"--dir <path>",description:"Explicit skills root directory, overrides --scope"}],ty={scope:o.z.enum(["project","user"]).optional(),dir:o.z.string().optional()},ny=o.z.looseObject({scope:o.z.string(),directory:o.z.string(),status:o.z.string(),version:o.z.string().optional(),latestVersion:o.z.string().optional(),managed:o.z.boolean().optional(),modified:o.z.boolean().nullable().optional(),command:o.z.string().optional()}),iy=o.z.looseObject({name:o.z.string(),version:o.z.string(),from:o.z.string().optional(),scope:o.z.string().optional(),directory:o.z.string(),files:o.z.array(o.z.string()).optional(),verified:o.z.boolean().optional(),updated:o.z.boolean().optional(),dryRun:o.z.boolean().optional()}),oy=Vz("skill","Install and update the TaskHandoff Agent Skill",[{id:"skill status",group:"skill",name:"status",stage:"A",summary:"Show installed skill versions and the published release",options:[...ey],input:Hz(ty),output:o.z.array(ny),examples:["thctl skill status","thctl skill status --scope project --json"],handler:async function(e,t){const n=Lz(t),i=Boolean(n.dir||n.scope),o=kz(process.cwd(),n),a=e=>n.dir?`--dir ${e.root}`:`--scope ${e.scope}`,s=Eu();let r,d;try{r=await Dz(e)}catch(e){d=e instanceof Error?e.message:String(e)}const c=[];for(const e of o){const t=Tz(e.directory),n=Nz(e.root);if(i||t.exists||0!==n.length){c.push(qz(e,t,r,s,a(e)));for(const t of n){const n=Tz(t);c.push({scope:e.scope,directory:t,status:"legacy-name",...n.version?{version:n.version}:{},...r?{latestVersion:r.entry.version}:{},command:`thctl skill install ${a(e)}`})}}}return d&&e.output.warn(`Skill index is unavailable: ${d}`),0===c.length?{data:[],message:`Skill \`${hz}\` is not installed. Install it with \`thctl skill install\`.`}:{data:c,columns:[{key:"scope",header:"scope"},{key:"status",header:"status"},{key:"version",header:"version"},{key:"latestVersion",header:"latest"},{key:"directory",header:"directory",width:48}]}}},{id:"skill install",group:"skill",name:"install",stage:"A",write:!0,summary:"Install the TaskHandoff skill from the published index",options:[...ey],input:Hz(ty),output:iy,examples:["thctl skill install","thctl skill install --scope project --yes"],handler:async function(e,t){const n=Az(process.cwd(),Lz(t)),i=Tz(n.directory);if(i.exists)throw new h("CLI_SKILL_ALREADY_INSTALLED",`Skill \`${hz}\` is already installed at ${n.directory}${i.version?` (v${i.version})`:""}. Run \`thctl skill update\`.`,8,{directory:n.directory});const o=await Dz(e),a=Eu();Cz(o.entry,a);const s=await Rz(o,{fetchImpl:e.fetchImpl});if(e.dryRun)return{data:{dryRun:!0,name:hz,version:o.entry.version,directory:n.directory,files:o.entry.files},message:`Would install skill \`${hz}\` ${o.entry.version} to ${n.directory}.`};await hg(e,"skill install",`Install skill \`${hz}\` ${o.entry.version} to ${n.directory}?`);const r=_z({target:n,release:o,files:s,cliVersion:a});return{data:{name:hz,version:r.version,scope:n.scope,directory:n.directory,files:o.entry.files,verified:!0===r.verified},message:`Installed skill \`${hz}\` ${r.version} to ${n.directory}.${Mz(n)}`}}},{id:"skill update",group:"skill",name:"update",stage:"A",write:!0,summary:"Update the installed TaskHandoff skill to the published release",options:[...ey,{flags:"--force",description:"Replace a locally modified installed copy"}],input:Hz({...ty,force:o.z.boolean().optional()}),output:iy,examples:["thctl skill update","thctl skill update --force --yes"],handler:async function(e,t){const n=Az(process.cwd(),Lz(t)),i=Tz(n.directory);if(!i.exists){const e=Nz(n.root),t=e.length?` Found legacy directories: ${e.join(", ")}; run \`thctl skill install\` and remove them after verifying.`:"";throw new h("CLI_SKILL_NOT_INSTALLED",`Skill \`${hz}\` is not installed at ${n.directory}. Run \`thctl skill install\`.${t}`,7,{directory:n.directory})}const o=!0===t.options.force;if(i.managed&&i.modified&&!o)throw new h("CLI_SKILL_LOCALLY_MODIFIED",`Skill \`${hz}\` at ${n.directory} has local modifications. Re-run with --force to replace it, or keep the local copy.`,8,{directory:n.directory});const a=await Dz(e),s=Eu();if(Cz(a.entry,s),i.managed&&!Ez(i,a.entry)&&!o)return{data:{name:hz,version:i.version,directory:n.directory,updated:!1},message:`Skill \`${hz}\` is already at ${i.version??"the published release"}; nothing to do.`};const r=await Rz(a,{fetchImpl:e.fetchImpl});if(e.dryRun)return{data:{dryRun:!0,name:hz,from:i.version,to:a.entry.version,directory:n.directory,files:a.entry.files},message:`Would update skill \`${hz}\` ${i.version??"unknown"} → ${a.entry.version} at ${n.directory}.`};await hg(e,"skill update",`Update skill \`${hz}\` ${i.version??"unknown"} → ${a.entry.version} at ${n.directory}?`);const d=_z({target:n,release:a,files:r,cliVersion:s});return{data:{name:hz,from:i.version,version:d.version,scope:n.scope,directory:n.directory,files:a.entry.files,verified:!0===d.verified},message:`Updated skill \`${hz}\` to ${d.version} at ${n.directory}.${Mz(n)}`}}}]),ay=Vz("events","Stream Control Plane events",[{id:"events",group:"events",name:"events",stage:"C",summary:"Subscribe to the Control Plane event stream as JSON Lines",options:[{flags:"--topic <topic>",description:"Event topic to subscribe to",repeatable:!0},{flags:"--instance <instanceId>",description:"Only events of this instance"}],input:Hz({topic:o.z.array(o.z.string()).optional(),instance:o.z.string().optional()}),output:ku,outputMode:"json-lines",examples:["thctl events","thctl events --topic ai.sessions --instance <instanceId>","thctl events --json"],handler:async function(e,t){const n=function(e=[]){const t=e.map(e=>String(e).trim()).filter(Boolean).map(e=>th[e]??e);return t.length?[...new Set(t)]:["*"]}(t.options.topic??[]),i="string"==typeof t.options.instance?t.options.instance.trim():"",o=await mg(e),a=await pg(e,{profile:o}),s=e.store.secrets().read(a.profile.label);if(!s)throw new h("CLI_NOT_AUTHENTICATED",`No CLI session stored for \`${a.profile.label}\`. Run \`thctl login\`.`,5,{profile:a.profile.label});await oh(e,{url:nh(a.profile.origin,i||void 0),authorization:`Bearer ${s.sessionToken}`,topics:n,...i?{instanceId:i}:{},onUnauthorized:()=>e.store.secrets().remove(a.profile.label)})}}],{flat:!0}),sy=Vz("schema","Export the machine-readable CLI contract",[{id:"schema",group:"schema",name:"schema",stage:"A",summary:"Export the declared leaf command contracts as JSON Schema or Markdown",args:[{name:"group",description:"Command group"},{name:"leaf",description:"Leaf command name inside the group"}],options:[{flags:"--format <json|md>",description:"Output format (default json)"},{flags:"--out <file>",description:"Write the export to a file"}],input:Hz({group:o.z.string().optional(),leaf:o.z.string().optional(),format:o.z.enum(["json","md"]).optional(),out:o.z.string().optional()}),output:Bz,examples:["thctl schema --format json","thctl schema instance stop","thctl schema instance --format md --out instance.md"],handler:async function(e,n){const o=n.args.group?.trim(),a=n.args.leaf?.trim(),s="md"===String(n.options.format??"json")?"md":"json";let r;if(o||a)if(!a&&cy(o))r={leaf:cy(o)};else if(!a&&function(e){return dy.filter(t=>t.group===e)}(o).length)r={group:o};else{if(!o||!a)throw new h("CLI_SCHEMA_TARGET_UNKNOWN",`No command group \`${o}\` is declared.`,7,{group:o});{const e=cy(`${o} ${a}`);if(!e)throw new h("CLI_SCHEMA_TARGET_UNKNOWN",`No leaf command \`${o} ${a}\` is declared.`,7,{group:o,leaf:a});r={leaf:e}}}else r=void 0;const d=function(e){const t=e?.leaf?[e.leaf]:e?.group?dy.filter(t=>t.group===e.group):dy,n=(e?.leaf?ry.filter(t=>t.name===e.leaf?.group):e?.group?ry.filter(t=>t.name===e.group):ry).map(e=>({name:e.name,summary:e.summary,flat:Boolean(e.flat),leaves:e.leaves.filter(e=>t.includes(e)).map(e=>e.id)}));return{cli:"thctl",version:$u,contractVersion:"1",globalOptions:[{flags:"--profile <label>",description:"Profile to use (overrides TASK_HANDOFF_CLI_PROFILE)"},{flags:"--json",description:"Emit machine-readable JSON on stdout"},{flags:"--yes",description:"Skip interactive confirmation for write commands"},{flags:"--dry-run",description:"Print the request a write command would send without sending it"},{flags:"--token-stdin",description:"Read a secret (token, join token, credential) from stdin instead of a flag"},{flags:"--no-update-check",description:"Skip the background CLI and skill update check"}],groups:n.map(e=>({...e,leaves:e.leaves})),commands:t.map(Ph)}}(r),c="md"===s?function(e){const t=[`# thctl contract (v${e.version}, contract ${e.contractVersion})`,"","Global options:","",...e.globalOptions.map(e=>`- \`${e.flags}\` — ${e.description}`),"","## Commands",""];for(const n of e.groups)t.push(`### ${n.name}`,"",n.summary,""),n.flat?t.push(...n.leaves.map(e=>`- \`${e}\``),""):t.push(`\`thctl ${n.name} <command>\``,"",...n.leaves.map(e=>`- \`${e}\``),"");for(const n of e.commands)t.push(Oh(n),"");return`${t.join("\n").trimEnd()}\n`}(d):function(e){return`${JSON.stringify(e,null,2)}\n`}(d),l="string"==typeof n.options.out?n.options.out.trim():"";if(l){const e=i.resolve(l);return t.writeFileSync(e,c,{mode:420}),{data:{out:e,format:s,commands:d.commands.length},message:`Wrote ${d.commands.length} contracts to ${e}.`}}return e.output.streams.stdout(c),{data:void 0}}}],{flat:!0}),ry=[_f,Uf,Df,qf,Mf,Bf,Ff,rf,Jf,Zf,Qf,...$f,Xf,oy,ay,sy],dy=ry.flatMap(e=>e.leaves);function cy(e){const t=e.trim().replace(/\s+/g," ");return dy.find(e=>e.id===t)}function ly(e){return null==e?"":Array.isArray(e)?e.length?e.map(ly).join(", "):"":"object"==typeof e?JSON.stringify(e):String(e)}class my{streams;json;constructor(e,t){this.streams=e,this.json=t}data(e,t){if(this.json)this.streams.stdout(`${JSON.stringify(e,null,2)}\n`);else{if(t){const n=function(e,t){if(0===t.length)return"";const n=t.map(t=>e.map(e=>{return n=ly(function(e,t){if(!t.includes("."))return e[t];let n=e;for(const e of t.split(".")){if(!n||"object"!=typeof n)return;n=n[e]}return n}(t,e.key)),!(i=e.width)||n.length<=i?n:`${n.slice(0,Math.max(0,i-1))}…`;var n,i})),i=e.map((e,t)=>Math.max(e.header.length,...n.map(e=>(e[t]??"").length))),o=e=>e.map((e,t)=>e.padEnd(i[t])).join(" ").trimEnd();return[o(e.map(e=>e.header)),...n.map(o)].join("\n")}(t,Array.isArray(e)?e:[e]);return void this.streams.stdout(n?`${n}\n`:"\n")}this.streams.stdout(`${"string"==typeof e?e:JSON.stringify(e,null,2)}\n`)}}message(e){this.json||this.streams.stdout(`${e}\n`)}warn(e){this.streams.stderr(`${sg(e)}\n`)}error(e){this.json?this.streams.stderr(`${JSON.stringify({error:{code:e.code,message:sg(e.message),...e.details?{details:rg(e.details)}:{}}})}\n`):this.streams.stderr(`${e.code}: ${sg(e.message)}\n`)}}const py="TASK_HANDOFF_CLI_UPDATE_CHECK",uy="__update-check",gy=864e5,hy=o.z.object({channel:o.z.string().optional(),tag:o.z.string().optional(),registry:o.z.string().optional(),latestVersion:o.z.string().optional(),checkedAt:o.z.string().optional()}).loose(),zy=o.z.object({indexUrl:o.z.string().optional(),latestVersion:o.z.string().optional(),contentSignature:o.z.string().optional(),thctl:o.z.string().optional(),checkedAt:o.z.string().optional()}).loose(),fy=o.z.object({schemaVersion:o.z.number().int().positive().default(1),lastAttemptAt:o.z.string().optional(),lastAttemptOk:o.z.boolean().optional(),checkedAt:o.z.string().optional(),cli:hy.optional(),skill:zy.optional(),noticeShownAt:o.z.string().optional(),noticeShownKey:o.z.string().optional()}).loose();function yy(e){return i.join(e.store.directory,"update-check.json")}function Iy(e){try{const n=fy.safeParse(JSON.parse(t.readFileSync(e,"utf8")));if(n.success)return n.data}catch{}return{schemaVersion:1}}function by(e,n){t.mkdirSync(i.dirname(e),{recursive:!0,mode:448});const o=`${e}.${process.pid}.tmp`;t.writeFileSync(o,`${JSON.stringify(n,null,2)}\n`,{mode:384}),t.renameSync(o,e)}function wy(e){const t=e?.trim().toLowerCase();if(t)return!["0","false","off","no"].includes(t)&&(!!["1","true","on","yes"].includes(t)||void 0)}function vy(e,t=[]){return!!t.includes("--no-update-check")||!1===wy(e[py])}function xy(e){return!0===wy(e[py])}function Ay(e){const t=e.TASK_HANDOFF_CLI_UPDATE_CHECK_INTERVAL?.trim();if(!t)return gy;const n=Number(t);return Number.isFinite(n)&&n>0?1e3*n:gy}function ky(e,t){r.spawn(e,t,{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}async function Sy(e){const o=Eu();if(!xy(e.env)&&!pz(o))return;const a=function(e){const t=l.prerelease(e)?.[0];return"alpha"===t||"beta"===t?t:"stable"}(o),s=function(e){return"stable"===e?"latest":e}(a),r=function(e=process.env,o=n.homedir()){const a=e.TASK_HANDOFF_CLI_REGISTRY?.trim();if(a)return gz(a);const s=e.npm_config_registry?.trim();if(s)return gz(s);const r=function(e){try{for(const n of t.readFileSync(i.join(e,".npmrc"),"utf8").split(/\r?\n/)){const e=/^\s*registry\s*=\s*(.+?)\s*$/.exec(n);if(e)return e[1]}}catch{}}(o);return r?gz(r):"https://registry.npmjs.org/"}(e.env),d=await async function(e){const t=await e.fetchImpl((n=e.registry,i=e.packageName,`${n}${i.startsWith("@")?i.replace("/","%2f"):i}`),{headers:{accept:"application/vnd.npm.install-v1+json"},signal:AbortSignal.timeout(e.timeoutMs??3e3)});var n,i;if(!t.ok)return;const o=await t.json(),a=o?.["dist-tags"]?.[e.tag];return"string"==typeof a&&a.trim()?a.trim():void 0}({registry:r,packageName:"@task-handoff/thctl",tag:s,fetchImpl:e.fetchImpl,timeoutMs:4e3});return d?{channel:a,tag:s,registry:r,latestVersion:d,checkedAt:(new Date).toISOString()}:void 0}async function Cy(e){const t=await Sz({fetchImpl:e.fetchImpl,env:e.env,timeoutMs:4e3}),n=$z(t.entry.integrity);return{indexUrl:t.indexUrl,latestVersion:t.entry.version,...n?{contentSignature:n}:{},...t.entry.thctl?{thctl:t.entry.thctl}:{},checkedAt:(new Date).toISOString()}}const jy=[["--profile <label>","Profile to use (overrides TASK_HANDOFF_CLI_PROFILE)"],["--json","Emit machine-readable JSON on stdout"],["--yes","Skip interactive confirmation for write commands"],["--dry-run","Print the request a write command would send without sending it"],["--token-stdin","Read a secret (token, join token, credential) from stdin instead of a flag"],["--no-update-check","Skip the background CLI and skill update check"]];function Ry(e){for(const[t,n]of jy)e.option(t,n);return e}function Ty(e,t=[]){return[...t,e]}function $y(e){return[e.name.split(" ").at(-1),...(e.args??[]).map(e=>e.variadic?e.required?`<${e.name}...>`:`[${e.name}...]`:e.required?`<${e.name}>`:`[${e.name}]`)].join(" ")}function Ey(e){return e.handler?e.summary:`${e.summary} (not implemented — planned stage ${e.stage})`}function Py(e,t){const n=t.name.split(" ");let i=e;for(const e of n.slice(0,-1)){const n=i.commands.find(t=>t.name()===e);i=n??i.command(e).description(`${t.group} ${e} commands`)}return i}async function Oy(e,t,n){const i={};(e.args??[]).forEach((e,t)=>{const o=n.args[t];i[e.name]=e.variadic?n.args.slice(t).join(" ")||void 0:o});const o=function(e){const t={};for(const[n,i]of Object.entries(e))t[n.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)]=i;return t}(n.optsWithGlobals());t.output.json=!0===o.json;const a={...t,profile:"string"==typeof o.profile?o.profile:t.profile,yes:!0===o.yes,dryRun:!0===o["dry-run"]};if(!e.handler)throw s=e.id,r=e.stage,new h("CLI_COMMAND_NOT_IMPLEMENTED",`\`${s}\` is declared but not implemented yet (planned stage ${r}).`,3,{command:s,stage:r});var s,r;let d;try{d=await e.handler(a,{args:i,options:o,rawArgs:n.args})}catch(t){if(t instanceof h&&"CLI_ROUTE_MISSING"===t.code)throw new h("CLI_CAPABILITY_MISSING",`${t.message} \`${e.id}\` is unavailable on this server version.`,t.exitCode,{...t.details,command:e.id});throw t}d&&(void 0!==d.data&&a.output.data(d.data,d.columns),d.message&&a.output.message(d.message))}(async function(t,n={}){const i=function(e={}){const t=e.env??process.env,n=e.streams??{stdout:e=>process.stdout.write(e),stderr:e=>process.stderr.write(e)};return{store:e.store??new $(j(t)),output:new my(n,!1),fetchImpl:e.fetchImpl??fetch,env:t,yes:!1,dryRun:!1,isTty:e.isTty??Boolean(process.stdin.isTTY&&process.stdout.isTTY),confirm:e.confirm??lg,openUrl:e.openUrl??jh,sleep:e.sleep??(e=>new Promise(t=>setTimeout(t,e))),signal:e.signal??(new AbortController).signal,...e.createEventSocket?{createEventSocket:e.createEventSocket}:{}}}(n);if(t[2]===uy)return await async function(e){const t=yy(e),n=Iy(t),[i,o]=await Promise.allSettled([Sy(e),Cy(e)]),a={...n,schemaVersion:1,checkedAt:(new Date).toISOString(),lastAttemptOk:"fulfilled"===i.status||"fulfilled"===o.status};"fulfilled"===i.status&&i.value&&(a.cli=i.value),"fulfilled"===o.status&&o.value&&(a.skill=o.value);try{by(t,a)}catch{}}(i),0;const o=n.updateCheck??{},a=!0===o.enabled,s=new AbortController,r=()=>{s.abort(),i.output.warn("Cancelling…")},d=n.signal,c=()=>s.abort();d&&(d.aborted?s.abort():d.addEventListener("abort",c,{once:!0})),process.on("SIGINT",r),process.on("SIGTERM",r);try{a&&function(e,t={}){const n=t.argv??process.argv;if(vy(e.env,n))return;const i=process.argv[1];if(!i)return;const o=t.now??Date.now(),a=yy(e),s=Iy(a),r=s.lastAttemptAt?Date.parse(s.lastAttemptAt):Number.NaN,d=!1===s.lastAttemptOk?Math.min(36e5,Ay(e.env)):Ay(e.env);if(!(Number.isFinite(r)&&o-r<d)){try{by(a,{...s,schemaVersion:1,lastAttemptAt:new Date(o).toISOString()})}catch{return}try{(t.spawnDetached??ky)(process.execPath,[i,uy])}catch{}}}(i,{argv:t,...o.spawnDetached?{spawnDetached:o.spawnDetached}:{},...o.now?{now:o.now()}:{}});const n=function(t){const n=new e.Command;n.name("thctl").description("TaskHandoff Control Plane command line client.").version($u,"--version","Print the CLI version").exitOverride().showHelpAfterError(!1).showSuggestionAfterError(!1).configureOutput({writeOut:e=>t.output.streams.stdout(e),writeErr:e=>t.output.streams.stderr(e)}),Ry(n),n.configureHelp({sortSubcommands:!1});for(const e of ry){const i=e.flat?n:n.command(e.name).description(e.summary);for(const n of e.leaves){const e=Py(i,n).command($y(n)).description(Ey(n));Ry(e);for(const t of n.options??[])t.repeatable?e.option(t.flags,t.description,Ty,[]):e.option(t.flags,t.description);e.action(async()=>{await Oy(n,t,e)})}}return n}({...i,signal:s.signal});return await n.parseAsync(t),0}catch(t){if(t instanceof e.CommanderError){if("commander.helpDisplayed"===t.code||"commander.help"===t.code||"commander.version"===t.code)return 0;const e=new h("CLI_USAGE_ERROR",t.message,2);return i.output.error(e),e.exitCode}const n=function(e){if(e instanceof h)return e;const t=e instanceof Error?e.message:String(e);return new h("CLI_INTERNAL_ERROR",t,12)}(t);return i.output.error(n),n.exitCode}finally{if(process.off("SIGINT",r),process.off("SIGTERM",r),d?.removeEventListener("abort",c),a){const e=function(e,t={}){const n=t.argv??process.argv;if(vy(e.env,n))return;const i=xy(e.env);if(!i&&(!e.isTty||e.output.json))return;const o=t.now??Date.now(),a=yy(e),s=Iy(a),r=t.cliVersion??Eu(),d=s.cli?.latestVersion,c=s.skill?.latestVersion,m=[];if(d&&function(e,t){if(!e||!t)return!1;const n=l.parse(e),i=l.parse(t);if(!n||!i)return!1;if(l.eq(n,i))return!1;if(n.major===i.major&&n.minor===i.minor&&n.patch===i.patch&&n.prerelease.length>0&&0===i.prerelease.length){const e=n.prerelease[0];if("alpha"!==e&&"beta"!==e)return!1}return l.gt(i,n)}(r,d)&&(i||pz(r))){const e=s.cli?.tag??"latest";m.push(`thctl ${r} → ${d} is available: npm install -g @task-handoff/thctl@${e}`)}if(c){const e=s.skill?.contentSignature,n=kz(t.cwd??process.cwd(),{},t.home).map(e=>Tz(e.directory)).filter(e=>e.exists).filter(t=>void 0!==e&&void 0!==t.contentSignature?t.contentSignature!==e:void 0!==t.version&&uz(t.version,c));if(n.length>0){const e=[...new Set(n.map(e=>e.version??"unknown"))].join(", ");s.skill?.thctl&&!jz(r,s.skill.thctl)?m.push(`skill ${hz} ${e} → ${c} needs thctl ${s.skill.thctl}: update the CLI first`):m.push(`skill ${hz} ${e} → ${c} is available: thctl skill update`)}}if(0===m.length)return;const p=`${d??""}|${c??""}`,u=s.noticeShownAt?Date.parse(s.noticeShownAt):Number.NaN;if(!(s.noticeShownKey===p&&Number.isFinite(u)&&o-u<864e5)){try{by(a,{...s,noticeShownAt:new Date(o).toISOString(),noticeShownKey:p})}catch{}return m.join("\n")}}(i,{argv:t,...o.now?{now:o.now()}:{}});e&&i.output.warn(e)}}})(process.argv,{updateCheck:{enabled:!0}}).then(e=>{process.exitCode=e});