@task-handoff/thctl 0.0.36 → 0.0.38

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.
Files changed (2) hide show
  1. package/dist/thctl.js +1 -1
  2. package/package.json +1 -1
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"),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});
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(160),N=O.optional(),_=o.z.string().trim().min(1).max(120),U=20971520,L=512e3,D=L,q=U,M=41943040,B=o.z.string().trim().min(1).max(80),F=o.z.enum(["app-session","ai-session"]),H=o.z.enum(["image","file"]),V={scopeType:o.z.enum(["session","create-request"]),scopeId:o.z.string().trim().min(1).max(160),kind:H,name:o.z.string().trim().min(1).max(240),mime:o.z.string().trim().min(1).max(120)};o.z.object({...V,size:o.z.coerce.number().int().positive().max(U)}).strict();const G=o.z.string().regex(/^cia_[a-f0-9]{24}$/);o.z.object({attachmentId:G,...V,size:o.z.number().int().positive().max(U)}).strict(),o.z.object({offset:o.z.coerce.number().int().nonnegative()}).strict(),o.z.object({attachmentId:G,offset:o.z.number().int().nonnegative()}),o.z.object({id:G,kind:H,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(U),expiresAt:o.z.string().datetime()});const W=o.z.object({id:o.z.string().trim().min(1).max(120),kind:H,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)}),Y=o.z.enum(["available","expired","missing"]),K=W.extend({contentState:Y.default("available")}).strict(),J=o.z.object({id:o.z.string().trim().min(1).max(240),text:o.z.string(),attachments:o.z.array(K).max(6).default([])}).strict(),Z=o.z.enum(["running","waiting","idle","failed"]),Q=o.z.enum(["thinking","tool","editing","approval","responding","unknown"]),X=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(),ee=o.z.enum(["running","completed","failed","waiting"]),te=o.z.object({id:o.z.string().trim().min(1).max(240),turnId:o.z.string().trim().min(1).max(240)}).strict(),ne=te.extend({type:o.z.literal("user-message"),text:o.z.string(),attachments:o.z.array(K).max(6).optional()}).strict(),ie=te.extend({type:o.z.literal("ai-message"),text:o.z.string()}).strict(),oe=te.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:ee.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(),ae=o.z.discriminatedUnion("type",[ne,ie,oe]),se=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(ae),generatedAt:o.z.string().datetime()}).strict(),re=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(ae),generatedAt:o.z.string().datetime()}).strict(),de=o.z.enum(["pending-init","running","interrupted","completed","errored","shutdown","not-found"]),ce=o.z.enum(["started","interacted","interrupted"]),le=o.z.object({threadId:o.z.string().trim().min(1).max(240),path:o.z.string().trim().max(4096).optional(),status:de,activity:ce.optional(),message:o.z.string().trim().max(1e3).optional(),updatedAt:o.z.string().datetime()}).strict();function me(e){return"completed"!==e.status}const pe=o.z.array(le).max(50).transform(e=>e.filter(me)),ue=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}),ge=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()}),he=o.z.string().trim().min(1).max(240),ze=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("fork"),parentProviderSessionId:he,throughTurnId:o.z.string().trim().min(1).max(240).optional()}).strict(),o.z.object({kind:o.z.literal("subagent"),parentProviderSessionId:he}).strict()]),fe=o.z.preprocess(function(e){if(!e||"object"!=typeof e||Array.isArray(e))return;const t=e;if("fork"===t.kind){const e=ze.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=ze.safeParse({kind:"subagent",parentProviderSessionId:t.parentProviderSessionId});return e.success?e.data:void 0}},ze.optional()),ye=o.z.union([W.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?U:L;(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.`})}),W.extend({source:o.z.object({type:o.z.literal("runtime-path"),path:o.z.string().trim().min(1).max(4096)}).strict()}).strict()]),Ie=W.extend({sourceType:o.z.enum(["inline","runtime-path"])}).strict(),be=o.z.union([o.z.object({id:o.z.string().trim().min(1).max(120),kind:H.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:H,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()]),we=o.z.enum(["auto","queue","steer","immediate"]),ve=o.z.enum(["ask","auto-review","full-access"]),xe=o.z.enum(["review","rename","goal","compact"]),Ae=o.z.object({command:xe,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.`})}),ke=o.z.object({command:xe,value:o.z.string().max(4e3).optional(),turnId:o.z.string().trim().min(1).max(240).optional()}).strict(),Se=o.z.object({title:o.z.string().trim().max(120),expectedTitle:o.z.string().trim().max(240).optional(),clientRequestId:O}).strict(),Ce=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 je=o.z.object({name:o.z.string().trim().min(1).max(240),path:o.z.string().trim().min(1).max(4096)}),Re=o.z.discriminatedUnion("kind",[je.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(),je.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(),je.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()]),Te=o.z.array(Re).max(20).default([]),$e=o.z.enum(["plugin","skill","file","directory","app"]),Ee=o.z.object({kind:$e,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."})}),Pe=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(),Oe=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(Ee).max(1e3).default([]),diagnostics:o.z.array(Pe).max(20).default([])}).strict();o.z.object({query:o.z.string().trim().max(240).default("")}).strict();const Ne=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(Ee.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(),_e=o.z.object({message:o.z.string().trim().min(1).max(2e4),mode:we.optional(),permissionMode:ve.optional(),clientRequestId:N}),Ue=_e.extend({attachments:o.z.array(ye).max(6).default([]),references:Te}).strict().superRefine((e,t)=>{e.attachments.reduce((e,t)=>e+("inline"===t.source.type?t.size:0),0)>M&&t.addIssue({code:o.z.ZodIssueCode.custom,path:["attachments"],message:"Inline attachments must be 41943040 bytes or less in total."})}),Le=_e.extend({attachments:o.z.array(be).max(6).default([]),references:Te}).strict(),De=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(),qe=o.z.object({modelEntityId:o.z.string().trim().min(1).max(120),modelName:o.z.string().trim().min(1).max(240)}).strict(),Me=o.z.enum(["none","minimal","low","medium","high","xhigh","max","ultra"]),Be=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()]),Fe=o.z.object({mode:o.z.enum(["current-folder","worktree"]),branch:o.z.string().trim().min(1).max(1024)}).strict(),He=Ue.safeExtend({agent:B,cwd:De,cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Fe.optional(),workspaceSelection:Be.optional(),clientRequestId:O,modelSelection:qe.optional(),reasoningEffort:Me.optional(),storyId:_.optional()}).strict(),Ve=Le.extend({agent:B,cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Fe.optional(),workspaceSelection:Be.optional(),clientRequestId:O,modelSelection:qe.optional(),reasoningEffort:Me.optional(),storyId:_.optional()}).strict(),Ge=o.z.object({clientRequestId:O,modelSelection:qe}).strict(),We=o.z.object({sessionId:o.z.string().trim().min(1).max(120),accepted:o.z.literal(!0)}).strict(),Ye=o.z.object({clientRequestId:O,reasoningEffort:Me}).strict(),Ke=o.z.object({cwdFolderId:o.z.string().trim().min(1).max(120).optional(),branch:o.z.string().trim().min(1).max(1024)}).strict(),Je=o.z.object({sessionId:o.z.string().trim().min(1).max(120),accepted:o.z.literal(!0)}).strict();o.z.object({storyId:_.nullable()}).strict();const Ze=o.z.object({sessionId:o.z.string().trim().min(1).max(120),storyId:_.optional()}).strict(),Qe=o.z.object({sessionId:o.z.string().trim().min(1).max(120),unread:o.z.boolean()}).strict(),Xe=o.z.object({path:o.z.string().trim().min(1).max(4096),lineCount:o.z.number().int().nonnegative(),tail:o.z.string()}).strict(),et=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(),tt=o.z.object({mode:o.z.enum(["current","managed-worktree"]).default("current")}).strict().default({mode:"current"}),nt=o.z.object({clientRequestId:O,throughTurnId:o.z.string().trim().min(1).max(240).optional(),workspace:tt.optional().default({mode:"current"})}).strict(),it=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(),ot=o.z.object({clientRequestId:O}).strict(),at=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:F}).strict(),st=o.z.object({clientRequestId:O}).strict(),rt=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:F}).strict(),dt=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 ct=o.z.object({decision:o.z.enum(["allow","deny","skip"])}).strict(),lt=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(),mt=o.z.object({paused:o.z.boolean()}).strict(),pt=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(),be])).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 ut=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(Ie).max(6).default([]),references:Te,permissionMode:ve.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(),gt=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(ut).max(100).default([])}).strict().default({revision:0,pendingCount:0,items:[]}),ht=o.z.enum(["control","realtime","adapter-snapshot","transcript-tail","transcript-scan","process-scan","app-session"]),zt=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(),ft=o.z.object({id:o.z.string().trim().min(1).max(240),providerTurnId:o.z.string().trim().max(240).optional(),source:ht.optional(),userPrompt:o.z.string().trim().optional(),userMessages:o.z.array(J).max(100).optional(),status:o.z.enum(["queued","running","waiting","completed","failed"]).default("running"),phase:Q.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(zt).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(),yt=ft.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(),It=o.z.object({id:o.z.string().trim().min(1).max(120),agent:B,creationSource:F.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:fe,providerMeta:o.z.record(o.z.string(),o.z.unknown()).optional(),modelSelection:qe.optional(),reasoningEffort:Me.optional(),storyId:_.optional(),appBindingKeys:o.z.array(o.z.string().trim().min(1).max(240)).max(20).optional(),actions:ge.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(ft).max(50).optional(),status:Z.default("running"),phase:Q.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:X.optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).default(0),subAgents:pe.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:ue,queue:gt,unread:o.z.boolean().default(!1)}).strict(),bt=It.pick({id:!0,appBindingKeys:!0,cwd:!0,error:!0,providerMeta:!0,modelSelection:!0,reasoningEffort:!0,queue:!0,subAgents:!0}).strict(),wt=ft.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(),vt=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(wt).max(50)}).strict(),xt=o.z.object({sessionId:o.z.string().trim().min(1).max(120),revision:o.z.string().trim().min(1).max(64),turn:ft}).strict(),At=o.z.string().trim().min(1).max(64),kt=o.z.object({kind:o.z.literal("not-modified"),revision:At}).strict(),St=o.z.discriminatedUnion("kind",[kt,o.z.object({kind:o.z.literal("updated"),revision:At,detail:bt}).strict()]),Ct=o.z.discriminatedUnion("kind",[kt,o.z.object({kind:o.z.literal("updated"),revision:At,index:vt}).strict()]),jt=o.z.discriminatedUnion("kind",[kt,o.z.object({kind:o.z.literal("updated"),revision:At,body:xt}).strict()]),Rt=o.z.object({session:It,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(),Tt=Rt.omit({session:!0}).extend({sessionId:o.z.string().trim().min(1).max(120),messageId:o.z.string().trim().min(1).max(240).optional()}).strict(),$t=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(),Et=o.z.union([Tt,Rt.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 Tt.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}:{}})})]),Pt=o.z.object({id:o.z.string().trim().min(1).max(120),agent:B,creationSource:F,providerSessionId:o.z.string().trim().min(1).max(240),lineage:fe,modelSelection:qe.optional(),reasoningEffort:Me.optional(),storyId:_.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(Pt).max(1e4).default([])}).strict();const Ot=o.z.object({items:o.z.array(Pt).max(1e4).default([])}).strict(),Nt=o.z.object({item:Pt,turns:o.z.array(yt).max(50).default([])}).strict(),_t=o.z.object({modelSelection:qe.optional()}).strict(),Ut=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:F}).strict(),Lt=ft.omit({userMessages:!0}),Dt=It.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(Lt).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:ft.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(),qt=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(Dt).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:qt}).strict();const Mt=qt.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()}),Bt=o.z.enum(["provider-event","app-session-created","app-session-updated","app-session-deleted","discovery-scan","control-action","heartbeat-sync","startup"]),Ft=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:Bt}).strict(),Ht=o.z.object({meta:Ft,snapshot:qt}).strict(),Vt=o.z.object({meta:Ft,upserted:o.z.array(Dt).default([]),removed:o.z.array(o.z.string().trim().min(1).max(120)).default([])}).strict(),Gt=o.z.object({meta:Ft,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:ae,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 Wt=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:Ht}).strict(),o.z.object({type:o.z.literal("ai-session.patch"),payload:Vt}).strict(),o.z.object({type:o.z.literal("ai-session.removed"),payload:Gt}).strict()])).default([])}).strict(),Yt=o.z.object({source:ht,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(),Kt=Yt.extend({type:o.z.literal("snapshot"),agent:o.z.string().trim().min(1).max(80),creationSource:F.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:ze.optional(),providerMeta:o.z.record(o.z.string(),o.z.unknown()).optional(),modelSelection:qe.optional(),reasoningEffort:Me.optional(),storyId:_.optional(),appBindingKeys:o.z.array(o.z.string().trim().min(1).max(240)).max(20).optional(),actions:ge.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(ft).max(50).optional(),status:Z.optional(),phase:Q.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:X.optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).optional(),subAgents:pe.optional(),transcriptPath:o.z.string().trim().max(4096).optional(),transcriptSize:o.z.number().int().min(0).optional(),replaceActivity:o.z.boolean().optional()}).strict(),Jt=Yt.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:qe.optional(),reasoningEffort:Me.optional(),activeTurnId:o.z.string().trim().max(240).optional(),providerTurnId:o.z.string().trim().max(240).optional(),userPrompt:o.z.string().trim().optional(),userMessage:J.optional(),text:o.z.string().optional(),itemId:o.z.string().trim().max(240).optional(),status:Z.optional(),phase:Q.optional(),summary:o.z.string().trim().max(1e3).optional(),error:o.z.string().trim().max(4e3).optional(),currentTool:X.nullable().optional(),toolCallsSinceLastMessage:o.z.number().int().min(0).optional(),subAgents:pe.optional(),contextCompaction:zt.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",[Kt,Jt]);const Zt=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Qt=o.z.string().datetime(),Xt=o.z.string().trim().min(1).max(255).refine(e=>!(/[\u0000-\u001f\u007f ~^:?*[\\]/.test(e)||e.includes("..")||e.endsWith(".")||e.endsWith("/")),"Invalid Git name."),en=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."),tn=o.z.enum(["ai-session","app-session"]),nn=o.z.enum(["available","session-not-found","session-inactive","cwd-missing","cwd-inaccessible","git-unavailable","not-worktree"]),on=o.z.enum(["branch","detached","unborn"]),an=o.z.enum(["review-changes","resolve-conflicts","publish-branch","push","pull","diverged","up-to-date"]),sn=o.z.enum(["conflict","staged","unstaged","untracked"]),rn=o.z.enum(["added","modified","deleted","renamed","copied","type-changed","unmerged","untracked"]),dn=o.z.object({state:on,oid:o.z.string().regex(/^[0-9a-f]{40,64}$/).optional(),branch:o.z.string().min(1).max(1024).optional()}).strict(),cn=o.z.object({ref:o.z.string().min(1).max(2048),remote:Xt,branch:o.z.string().min(1).max(1024),ahead:o.z.number().int().nonnegative(),behind:o.z.number().int().nonnegative()}).strict(),ln=o.z.object({id:Zt,isCurrent:o.z.boolean(),isMain:o.z.boolean(),managed:o.z.boolean(),head:dn,dirty:o.z.boolean(),locked:o.z.boolean(),lockReason:o.z.string().max(1e3).optional(),prunable:o.z.boolean(),activeAiSessionIds:o.z.array(Zt).max(256).default([]),activeAppSessionIds:o.z.array(Zt).max(256).default([])}).strict(),mn=o.z.enum(["main-worktree","external-worktree","outside-workspace-roots","dirty","locked","prunable","session-occupied","path-inaccessible"]),pn=ln.extend({canCreateAiSession:o.z.boolean(),canRemove:o.z.boolean(),createAiSessionBlockers:o.z.array(mn).max(16).default([]),removeBlockers:o.z.array(mn).max(16).default([])}).strict(),un=o.z.object({repositoryId:Zt,repositoryContextId:Zt,snapshotId:Zt,items:o.z.array(pn).max(1e4)}).strict(),gn=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(),hn=o.z.object({name:Xt,fetchUrl:o.z.string().max(4096).optional(),pushUrl:o.z.string().max(4096).optional()}).strict(),zn=o.z.object({availability:nn,sessionKind:tn,sessionId:Zt,observedAt:Qt,snapshotId:Zt.optional(),repositoryId:Zt.optional(),repositoryContextId:Zt.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:dn.optional(),upstream:cn.optional(),currentWorktree:ln.optional(),changes:gn.optional(),remotes:o.z.array(hn).max(128).optional(),primaryAction:an.optional()}).strict(),fn=o.z.enum(["directory","file","symlink","submodule","nested-repository","special"]),yn=o.z.object({executable:o.z.boolean(),gitMode:o.z.enum(["100644","100755","120000","160000"]).optional()}).strict(),In=o.z.object({name:o.z.string().min(1).max(1024),path:en,kind:fn,traversable:o.z.boolean(),editable:o.z.boolean(),size:o.z.number().int().nonnegative().optional(),mode:yn.optional()}).strict();o.z.object({path:o.z.string().max(4096),entries:o.z.array(In).max(1e4),snapshotId:Zt}).strict();const bn=o.z.object({name:o.z.string().min(1).max(1024),path:en,kind:o.z.enum(["directory","file"])}).strict();o.z.object({entries:o.z.array(bn).max(200),truncated:o.z.boolean()}).strict();const wn=o.z.string().min(16).max(160).regex(/^[a-zA-Z0-9_.:-]+$/),vn=o.z.object({path:en,content:o.z.string(),byteLength:o.z.number().int().nonnegative(),version:wn,mode:yn}).strict(),xn=o.z.object({path:en,oldPath:en.optional(),scope:sn,status:rn,version:wn,binary:o.z.boolean().default(!1)}).strict(),An=o.z.object({snapshotId:Zt,summary:gn,entries:o.z.array(xn).max(1e5)}).strict();o.z.object({file:vn.optional(),snapshotId:Zt,context:zn,changes:An}).strict();const kn=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:en,oldPath:en.optional(),scope:sn,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(kn).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(kn).max(6e3),startLineCount:o.z.number().int().nonnegative().max(3e3),hasMore:o.z.boolean()}).strict()).max(2e4),version:wn,snapshotId:Zt}).strict();const Sn=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(Zt).max(256).default([])}).strict(),Cn=o.z.object({snapshotId:Zt,branches:o.z.array(Sn).max(1e5)}).strict();o.z.object({snapshotId:Zt,context:zn,branches:Cn}).strict(),o.z.object({ok:o.z.literal(!0),snapshotId:Zt,context:zn,changes:An.optional(),commitOid:o.z.string().regex(/^[0-9a-f]{40,64}$/).optional()}).strict();const jn=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:jn,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 Rn=o.z.object({expectedSnapshotId:Zt}).strict(),Tn=o.z.object({path:en,expectedVersion:wn}).strict();o.z.object({path:en,content:o.z.string().max(4194304),expectedAbsent:o.z.literal(!0),expectedSnapshotId:Zt}).strict(),o.z.object({path:en,content:o.z.string().max(4194304),expectedVersion:wn,expectedSnapshotId:Zt}).strict(),o.z.object({path:en,destination:en,expectedVersion:wn,expectedDestinationAbsent:o.z.literal(!0),expectedSnapshotId:Zt}).strict(),o.z.object({path:en,expectedVersion:wn,expectedSnapshotId:Zt,confirm:o.z.literal(!0)}).strict(),Rn.extend({paths:o.z.array(Tn).min(1).max(1e3)}).strict(),Rn.extend({paths:o.z.array(Tn).min(1).max(1e3)}).strict(),Rn.extend({paths:o.z.array(Tn).min(1).max(1e3),confirm:o.z.literal(!0)}).strict(),Rn.extend({paths:o.z.array(Tn).min(1).max(1e3),confirm:o.z.literal(!0)}).strict(),Rn.extend({message:o.z.string().trim().min(1).max(65536)}).strict();const $n=o.z.discriminatedUnion("mode",[o.z.object({mode:o.z.literal("new-branch"),branchName:Xt,startRef:o.z.string().trim().min(1).max(2048),expectedSnapshotId:Zt}).strict(),o.z.object({mode:o.z.literal("existing-branch"),branchName:Xt,expectedSnapshotId:Zt}).strict()]),En=Rn.extend({worktreeId:Zt,confirm:o.z.literal(!0)}).strict(),Pn=o.z.object({worktreeId:Zt,worktrees:un}).strict(),On=o.z.object({removedWorktreeId:Zt,branchRetained:o.z.boolean(),worktrees:un}).strict(),Nn=o.z.enum(["main-worktree","outside-workspace-roots","path-inaccessible","locked","prunable","session-occupied","main-session-occupied","detached-head","unborn-head","main-dirty"]),_n=o.z.object({worktreeId:Zt}).strict(),Un=o.z.object({worktreeId:Zt,canMove:o.z.boolean(),blockers:o.z.array(Nn).max(16).default([]),targetBranch:o.z.string().min(1).max(1024).optional(),targetChanges:gn.default({conflicts:0,staged:0,unstaged:0,untracked:0}),mainWorktreeId:Zt,mainBranch:o.z.string().min(1).max(1024).optional()}).strict(),Ln=Rn.extend({worktreeId:Zt,confirm:o.z.literal(!0)}).strict(),Dn=o.z.object({movedWorktreeId:Zt,adoptedBranch:o.z.string().min(1).max(1024),previousHead:o.z.string().regex(/^[0-9a-f]{40,64}$/),carriedChanges:o.z.boolean(),worktrees:un}).strict(),qn=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("current")}).strict(),o.z.object({type:o.z.literal("worktree"),repositoryContextId:Zt,worktreeId:Zt}).strict()]);o.z.object({agent:o.z.enum(["codex","claude","opencode"]),workspaceSelection:qn,message:o.z.string().trim().min(1).max(2e4),clientRequestId:O,permissionMode:o.z.enum(["ask","auto-review","full-access"]).optional()}).strict(),o.z.object({agent:o.z.enum(["codex","claude","opencode"]),worktree:$n,message:o.z.string().trim().min(1).max(2e4),clientRequestId:O,permissionMode:o.z.enum(["ask","auto-review","full-access"]).optional()}).strict(),o.z.object({aiSessionId:Zt,providerSessionId:o.z.string().trim().min(1).max(240),worktreeId:Zt,disposition:o.z.literal("started")}).strict();const Mn=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(),Bn=o.z.object({availability:nn,currentBranch:o.z.string().min(1).max(1024).optional(),dirty:o.z.boolean().default(!1),branches:o.z.array(Mn).max(1e5).default([]),repositoryContextId:Zt.optional(),snapshotId:Zt.optional(),worktrees:o.z.array(pn).max(1e4).default([])}).strict();o.z.object({cwd:De}).strict(),o.z.object({cwd:De,branch:Xt}).strict(),o.z.union([He.safeExtend({gitSelection:Fe,workspaceSelection:o.z.never().optional()}).strict(),He.safeExtend({gitSelection:o.z.never().optional(),workspaceSelection:Be}).strict()]),o.z.union([Ve.safeExtend({cwd:De,gitSelection:Fe,workspaceSelection:o.z.never().optional()}).strict(),Ve.safeExtend({cwd:De,gitSelection:o.z.never().optional(),workspaceSelection:Be}).strict()]),Rn.extend({name:Xt}).strict(),Rn.extend({branch:o.z.string().trim().min(1).max(2048)}).strict(),Rn.extend({name:Xt,remoteTrackingRef:o.z.string().trim().min(1).max(2048)}).strict(),Rn.extend({name:Xt,confirm:o.z.literal(!0)}).strict(),Rn.extend({remote:Xt}).strict(),Rn.extend({remote:Xt,sourceBranch:Xt,targetBranch:Xt,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"]}),Rn.extend({remote:Xt,sourceBranch:Xt,targetBranch:Xt}).strict();const Fn=o.z.object({maxIdleAiSessions:o.z.number().int().min(1).max(50).default(5)}).strict(),Hn=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."),Vn=o.z.string().regex(/^[a-f0-9]{64}$/),Gn=o.z.object({title:o.z.string().trim().min(1).max(240),storyPath:Hn,revision:Vn}).strict(),Wn=o.z.object({agent:B.optional(),mode:we.optional(),permissionMode:ve.optional(),modelSelection:qe.optional(),reasoningEffort:Me.optional(),cwdFolderId:o.z.string().trim().min(1).max(120).optional(),gitSelection:Fe.optional(),workspaceSelection:Be.optional()}).strict().refine(e=>!(e.gitSelection&&e.workspaceSelection),{message:"gitSelection and workspaceSelection are mutually exclusive.",path:["workspaceSelection"]}),Yn=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:Wn.optional()}).strict(),Kn=Yn.omit({id:!0,targetInstanceId:!0}).extend({targetInstanceId:Yn.shape.targetInstanceId.unwrap()}).strict(),Jn=Kn.extend({id:Yn.shape.id.optional()}).strict(),Zn=o.z.object({targetInstanceId:o.z.string().trim().min(1).max(120),aiSessionId:o.z.string().trim().min(1).max(120)}).strict(),Qn=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()]),Xn=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(),ei=o.z.object({id:o.z.string().trim().min(1).max(120),storyId:_,actionId:Yn.shape.id,schedule:Qn,enabled:o.z.boolean().default(!0),policy:Xn.default({maxConcurrentRuns:1,whenBusy:"skip"}),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),ti=ei.omit({id:!0,createdAt:!0,updatedAt:!0}).strict(),ni=o.z.object({action:Yn.extend({targetInstanceId:Yn.shape.targetInstanceId.unwrap()}).strict(),automation:ti.omit({storyId:!0,actionId:!0}).strict()}).strict(),ii=o.z.object({actionId:ei.shape.actionId.optional(),schedule:Qn.optional(),enabled:o.z.boolean().optional(),policy:Xn.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one Automation field is required."),oi=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),ai=o.z.enum(["queued","dispatching","running","completed","failed","skipped"]),si=o.z.object({id:o.z.string().trim().min(1).max(160),automationId:ei.shape.id,eventType:o.z.enum(["manual","schedule"]),status:ai,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:oi.optional(),queuedAt:o.z.string().datetime(),startedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),ri=o.z.enum(["disabled","blocked","scheduled","running","error"]),di=o.z.object({automation:ei,effectiveStatus:ri,blockedReason:oi.optional(),nextRunAt:o.z.string().datetime().optional(),currentRuns:o.z.array(si).max(20).default([]),lastRun:si.optional()}).strict(),ci=o.z.object({automations:o.z.array(di).default([])}).strict(),li=o.z.object({runs:o.z.array(si).max(120).default([])}).strict(),mi=o.z.object({clientRequestId:O}).strict();o.z.object({storyId:_,automationId:ei.shape.id,change:o.z.enum(["created","updated","deleted","status","run"]),status:di.optional(),run:si.optional()}).strict();const pi=o.z.enum(["pending","decided","cancelled","expired"]),ui=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(),gi=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),hi=o.z.object({id:o.z.string().trim().min(1).max(160),storyId:_,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(ui).max(20).default([]),allowFreeText:o.z.boolean().default(!0),context:o.z.string().trim().max(8e3).optional(),status:pi,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:gi.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(ui).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 zi=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"]}),fi=o.z.object({expectedRevision:o.z.number().int().min(1)}).strict(),yi=o.z.object({decisions:o.z.array(hi).default([])}).strict();hi.strip(),o.z.object({decisions:o.z.array(o.z.unknown()).default([])}).strip(),o.z.object({storyId:_,decisionId:hi.shape.id,revision:o.z.number().int().min(1),change:o.z.enum(["created","decided","cancelled","expired"]),decision:hi.optional()}).strict();const Ii=o.z.object({id:_,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(Gn).max(500).default([]),actions:o.z.array(Yn).max(50).default([]),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),archivedAt:o.z.string().datetime().optional()}).strict(),bi=o.z.object({stories:o.z.array(Ii).default([])}).strict(),wi=o.z.object({title:Ii.shape.title,description:Ii.shape.description,actions:o.z.array(Kn).max(50).optional(),maxIdleAiSessions:Fn.shape.maxIdleAiSessions.optional()}).strict(),vi=o.z.object({title:Ii.shape.title.optional(),description:Ii.shape.description.nullable().optional(),actions:o.z.array(Jn).max(50).optional(),maxIdleAiSessions:Fn.shape.maxIdleAiSessions.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one Story field is required."),xi=o.z.object({title:Gn.shape.title.optional(),storyPath:Hn.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one document field is required."),Ai=o.z.object({storyPaths:o.z.array(Hn).max(500)}).strict();o.z.object({storyPath:Hn,title:Gn.shape.title.optional(),expectedRevision:Vn.optional()}).strict();const ki=o.z.object({documents:o.z.array(Gn).max(500)}).strict(),Si=o.z.union([o.z.number(),o.z.string().regex(/^\d+$/).transform(Number)]);o.z.object({page:Si.pipe(o.z.number().int().min(1).max(500)).default(1),pageSize:Si.pipe(o.z.number().int().min(1).max(100)).default(20)}).strict();const Ci=o.z.object({title:Gn.shape.title,storyPath:Hn}).strict(),ji=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:Ii.shape.createdAt,documents:o.z.array(Ci).max(100),pagination:ji}).strict(),o.z.object({storyCreatedAt:Ii.shape.createdAt,documents:o.z.array(Ci.strip()).max(100),pagination:ji.strip()}).strip();const Ri=o.z.object({storyPath:Hn,revision:Vn,content:o.z.string(),size:o.z.number().int().nonnegative()}).strict();o.z.object({storyPaths:o.z.array(Hn).min(1).max(20),destinationPath:o.z.string().trim().min(1).max(4096)}).strict(),o.z.object({storyPath:Hn,title:Gn.shape.title.optional(),sourcePath:o.z.string().trim().min(1).max(4096),expectedRevision:Vn.optional()}).strict();const Ti=o.z.object({storyPath:Hn,path:o.z.string().trim().min(1).max(4096).optional(),revision:Vn.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 $i(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 Ei(){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(Ti).min(1).max(20)}).strict(),o.z.object({storyId:_,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:Hn.optional()}).strict();const Pi=e=>o.z.object({data:e}).strict(),Oi=Dt,Ni=qt.extend({sessions:o.z.array(Oi)}),_i=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:Ni,revision:o.z.number().int().nonnegative().optional(),lastEventAt:o.z.string().datetime().optional()}).strict())}).strict(),Ui=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 Li(e){const t=async(t,n,i)=>(await e.request(t,Pi(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}`,_i,{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}`,_i,{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}`,Wt,{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}`,Ot,{signal:n})},historyDetail:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/history/${encodeURIComponent(n)}?hierarchy=subagents`,Nt,{signal:i}),detail(e,i,o,a){const s=o?`?revision=${encodeURIComponent(o)}`:"";return t(`${n(e,i)}${s}`,St,{signal:a})},turnIndex(e,i,o,a){const s=o?`?revision=${encodeURIComponent(o)}`:"";return t(`${n(e,i)}/turns${s}`,Ct,{signal:a})},turnBody(e,i,o,a,s){const r=a?`?revision=${encodeURIComponent(a)}`:"";return t(`${n(e,i)}/turns/${encodeURIComponent(o)}${r}`,jt,{signal:s})},timeline:(e,i,o)=>t(`${n(e,i)}/timeline`,se,{signal:o}),turnTimeline:(e,i,o,a)=>t(`${n(e,i)}/turns/${encodeURIComponent(o)}/timeline`,re,{signal:a}),resume:(e,i,o={})=>t(`${n(e,i)}/resume`,Ut,$i("POST",_t.parse(o))),create:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions`,et,$i("POST",Ve.parse(n))),updateModelSelection(e,i,o,a){const s=Ge.parse({clientRequestId:o,modelSelection:a});return t(`${n(e,i)}/model-selection`,We,$i("PUT",s))},updateReasoningEffort(e,i,o,a){const s=Ye.parse({clientRequestId:o,reasoningEffort:a});return t(`${n(e,i)}/reasoning-effort`,Je,$i("PUT",s))},rename:(e,i,o)=>t(`${n(e,i)}/title`,Ce,$i("PUT",Se.parse(o))),fork:(e,i,o)=>t(`${n(e,i)}/fork`,it,$i("POST",nt.parse(o))),workspace(e,n,i){const o=n?`?${new URLSearchParams({cwdFolderId:n})}`:"";return t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace${o}`,Bn,{signal:i})},checkoutWorkspaceBranch(e,n){const i=Ke.parse(n);return t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace/checkout`,Bn,$i("POST",i))},openApp:(e,i,o)=>t(`${n(e,i)}/open-app`,at,$i("POST",ot.parse({clientRequestId:o}))),close:(e,i,o)=>t(`${n(e,i)}/close`,rt,$i("POST",st.parse({clientRequestId:o}))),clear:(e,i)=>t(n(e,i),dt,{method:"DELETE"}),executeCommand:(e,i,o)=>t(`${n(e,i)}/commands`,ke,$i("POST",Ae.parse(o))),markRead:(e,i)=>t(`${n(e,i)}/read`,Qe,$i("POST",{})),sendMessage(e,i,o){const a=Le.parse({...o,attachments:o.attachments??[],references:o.references??[]});return t(`${n(e,i)}/messages`,Et,$i("POST",a))},approval:(e,i,o)=>t(`${n(e,i)}/approval`,Et,$i("POST",ct.parse({decision:o}))),interrupt:(e,i)=>t(`${n(e,i)}/interrupt`,Et,$i("POST",{})),steerQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}/steer`,Et,$i("POST",{})),retryQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}/retry`,$t,$i("POST",{})),removeQueue:(e,i,o)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}`,$t,{method:"DELETE"}),editQueue:(e,i,o,a)=>t(`${n(e,i)}/queue/${encodeURIComponent(o)}`,$t,$i("PATCH",pt.parse(a))),reorderQueue:(e,i,o)=>t(`${n(e,i)}/queue/reorder`,$t,$i("PATCH",lt.parse(o))),pauseQueue:(e,i,o)=>t(`${n(e,i)}/queue/pause`,$t,$i("POST",mt.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}`,Pi(Ui),{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",Pi(Ui),$i("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`,Oe,{signal:o}),transcript(e,i,o,a){const s=void 0===o?"":`?tail=${encodeURIComponent(String(o))}`;return t(`${n(e,i)}/transcript${s}`,Xe,{signal:a})},storyContent:(e,i,a)=>t(`${n(e,i)}/story-content`,o.z.object({storyId:o.z.string().trim().min(1),documents:ki.shape.documents}).strict(),{signal:a}),storyContentPreview:(e,i,o,a)=>t(`${n(e,i)}/story-content/preview?storyPath=${encodeURIComponent(o)}`,Ri,{signal:a}),searchMentionFiles:(e,i,o,a)=>t(`${n(e,i)}/mentions/files`,Ne,$i("POST",{query:o},a)),async attachmentContent(t,i,o,a){if(!e.requestBinary)throw Ei();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 Di=o.z.enum(["created","starting","running","stopping","stopped","exited","failed","closed","terminated","unknown"]),qi=o.z.enum(["tty","vnc","web"]),Mi=o.z.object({mode:qi,url:o.z.string().trim().min(1).max(4096),token:o.z.string().trim().min(1).max(512),expiresAt:o.z.string().datetime()}).strict(),Bi=o.z.object({revoked:o.z.boolean()}).strict(),Fi=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(),Hi=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(Fi).max(256)}).strict(),Vi=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(),Gi=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:Di.default("unknown"),bindings:o.z.array(Vi).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()})),Wi=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(Gi).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:Wi}).strict(),Wi.pick({runningCount:!0,problemCount:!0,updatedAt:!0}).extend({revision:o.z.number().int().min(0).optional()});const Yi=o.z.enum(["app-session-created","app-session-updated","app-session-deleted","app-session-recovered","control-action","heartbeat-sync","startup"]),Ki=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:Yi}).strict(),Ji=o.z.object({meta:Ki,snapshot:Wi}).strict(),Zi=o.z.object({meta:Ki,session:Gi}).strict(),Qi=o.z.object({meta:Ki,sessionId:o.z.string().trim().min(1).max(160),tombstone:Gi.optional(),expiresAt:o.z.string().datetime().optional()}).strict(),Xi=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:Ji}).strict(),o.z.object({type:o.z.literal("app-session.patch"),payload:Zi}).strict(),o.z.object({type:o.z.literal("app-session.removed"),payload:Qi}).strict()])).default([])}).strict(),eo=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(),to=o.z.object({title:o.z.string().trim().min(1).max(120)}).strict(),no=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:Wi,revision:o.z.number().int().nonnegative().optional(),lastEventAt:o.z.string().datetime().optional()}).strict())}).strict();function io(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}`,no,{signal:e})},refresh(e,n){const i=new URLSearchParams({refresh:"true"});return n&&i.set("instanceId",n),t(`/api/app-sessions?${i}`,no,{signal:e})},launch(e,n){const{cwd:i,...o}=eo.parse(n),a={...o,...i?{options:{cwd:i}}:{}};return t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions`,Gi,{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`,Gi,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),restart:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}/restart`,Gi,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),rename(e,n,i){const o=to.parse({title:i});return t(`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(n)}`,Gi,{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`,Mi,{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`,Bi,{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}`,Hi,{signal:o})},async screenshot(t,n,i){if(!e.requestBinary)throw Ei();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}`,Xi,{signal:o})}}}const oo=o.z.string().trim().min(1).max(60),ao=o.z.object({id:o.z.string().trim().min(1).max(120),name:oo,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(),so=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(ao).max(200),observedAt:o.z.string().datetime()}).strict();o.z.object({name:oo}).strict(),o.z.object({name:oo}).strict();const ro=o.z.object({removed:o.z.literal(!0)}).strict();function co(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),so,{method:"GET",signal:o}),create:(e,i,o)=>n(t(e,i),ao,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:o})}),rename:(e,i,o,a)=>n(`${t(e,i)}/${encodeURIComponent(o)}`,ao,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:a})}),setDefault:(e,i,o)=>n(`${t(e,i)}/${encodeURIComponent(o)}/default`,ao,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),remove:(e,i,o)=>n(`${t(e,i)}/${encodeURIComponent(o)}`,ro,{method:"DELETE"})}}const lo=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 mo(e){return{async access(t){var n;return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}/browser-access`,(n=lo,o.z.object({data:n}).strict()),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})})).data}}}function po(e,t){let n=zo(t);for(let t=0;t<100;t+=1){const t=e.safeParse(n);if(t.success)return t;const i=uo(t.error.issues);let o=!1;for(const e of i){const t=ho(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 uo(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)=>go(t)<go(e)?t:e);n.push(...uo(o,[...t,...i.path]))}return n}function go(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(go)):1)},0)}function ho(e,t){let n=e;for(const e of t){if(!n||"object"!=typeof n)return;n=n[e]}return n}function zo(e){return Array.isArray(e)?e.map(zo):e&&"object"==typeof e?Object.getPrototypeOf(e)!==Object.prototype&&null!==Object.getPrototypeOf(e)?e:Object.fromEntries(Object.entries(e).map(([e,t])=>[e,zo(t)])):e}const fo=["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"],yo=o.z.enum(fo),Io=o.z.enum(["active","disabled","archived"]),bo=o.z.enum(["local-password","oidc","oauth","local-trust"]),wo=o.z.enum(["active","archived"]),vo=o.z.enum(["oidc","github"]),xo=o.z.enum(["enabled","disabled"]),Ao=o.z.enum(["existing-only","admin-approved-create"]),ko=o.z.enum(["pending","approved","rejected","expired"]),So=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()]),Co=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()]),jo=o.z.object({id:yo,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(),Ro=new Set(["users","roles","identity-providers","settings","secrets","chat-bridges","public-directory"]);fo.map(e=>{const[t,n]=e.split(":");return jo.parse({id:e,resource:t,action:n,nodeScoped:!Ro.has(t),name:e,translationKey:`settings.userAccess.permissionLabels.${t}.${n}`})});const To=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:Io,createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),lastLoginAt:o.z.string().datetime().optional()}).strict(),$o=o.z.string().trim().min(1).max(80).regex(/^[a-zA-Z0-9_.@-]+$/),Eo=o.z.object({displayName:o.z.string().trim().min(1).max(160).optional(),username:$o.optional(),status:Io.optional()}).strict().refine(e=>Object.values(e).some(e=>void 0!==e),{message:"At least one user field must be updated."}),Po=o.z.object({id:o.z.string().trim().min(1),userId:o.z.string().trim().min(1),kind:bo,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."})}),Oo=o.z.enum(["web","mobile","cli"]),No=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:Oo,createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime(),lastSeenAt:o.z.string().datetime().optional(),current:o.z.boolean().optional()}).strict(),_o=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:wo,permissionIds:o.z.array(yo).max(fo.length),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Uo=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:So,instanceScope:Co.default({kind:"inherit-node-scope"}),authorizationRevision:o.z.number().int().positive(),updatedAt:o.z.string().datetime()}).strict(),Lo=To.extend({identities:o.z.array(Po),accessGrant:Uo}).strict(),Do=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(yo).max(fo.length),nodeScope:So,instanceScope:Co.default({kind:"inherit-node-scope"}),authorizationRevision:o.z.number().int().positive()}).strict(),qo=o.z.object({id:o.z.string().trim().min(1),name:o.z.string().trim().min(1).max(120),kind:vo,status:xo,loginPolicy:Ao,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."})}),Mo=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:ko,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(),Bo=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(vo).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(),Fo=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:Bo.optional()}).strict();function Ho(e){const t=po(Fo,e);return t.success?t.data:void 0}function Vo(e){return Ho(e)?.accessManagement}function Go(e){return!0===Ho(e)?.localCliSessions}const Wo=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:Fo,protocolVersion:o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/),issuedAt:o.z.string().datetime(),expiresAt:o.z.string().datetime()}).strict(),Yo=o.z.object({data:o.z.object({payload:Wo,signature:o.z.string().regex(/^[A-Za-z0-9_-]{86}$/)}).strict()}).strict(),Ko=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(),Jo=o.z.object({username:o.z.string().trim().min(1).max(80),password:o.z.string().min(1).max(4096),device:Ko}).strict(),Zo=To,Qo=No.extend({device:Ko,user:To}).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 Xo=o.z.object({data:o.z.object({sessionToken:o.z.string().trim().min(32),session:Qo,authorization:Do}).strict()}).strict(),ea=o.z.object({data:o.z.array(Qo)}).strict(),ta=o.z.object({data:o.z.object({revoked:o.z.boolean()}).strict()}).strict(),na=o.z.object({data:o.z.object({expiresAt:o.z.string().datetime()}).strict()}).strict(),ia=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(),oa=o.z.string().trim().min(1).max(200),aa=o.z.string().trim().regex(/^[A-Za-z0-9\-._~]{16,200}$/),sa=o.z.string().regex(/^[A-Za-z0-9_-]{43}$/),ra=o.z.string().regex(/^[A-Za-z0-9\-._~]{43,128}$/),da=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."),ca=o.z.object({mode:o.z.literal("browser"),client:ia,redirectUri:da,state:aa,codeChallenge:sa,codeChallengeMethod:o.z.literal("S256")}).strict(),la=o.z.object({mode:o.z.literal("device"),client:ia}).strict(),ma=o.z.discriminatedUnion("mode",[ca,la]),pa=o.z.discriminatedUnion("mode",[o.z.object({mode:o.z.literal("browser"),requestId:oa,verificationUri:o.z.string().trim().url().max(2048),expiresAt:o.z.string().datetime()}).strict(),o.z.object({mode:o.z.literal("device"),requestId:oa,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()]),ua=o.z.object({data:pa}).strict(),ga=o.z.enum(["pending","approved","denied","consumed","expired"]),ha=o.z.object({requestId:oa,mode:o.z.enum(["browser","device"]),status:ga,client:ia,createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime(),redirectUri:da.optional(),userCode:o.z.string().trim().min(1).max(40).optional(),decidedAt:o.z.string().datetime().optional()}).strict(),za=o.z.object({data:ha}).strict(),fa=o.z.object({data:o.z.object({mode:o.z.enum(["browser","device"]),redirectUri:o.z.string().trim().url().max(2048).optional()}).strict()}).strict(),ya=o.z.object({data:o.z.object({ok:o.z.boolean()}).strict()}).strict(),Ia=o.z.discriminatedUnion("grantType",[o.z.object({grantType:o.z.literal("authorization_code"),requestId:oa,code:o.z.string().trim().min(1).max(400),codeVerifier:ra}).strict(),o.z.object({grantType:o.z.literal("urn:ietf:params:oauth:grant-type:device_code"),requestId:oa}).strict()]),ba=No.extend({clientType:o.z.literal("cli"),client:ia,user:To}).strict(),wa=o.z.object({data:o.z.object({sessionToken:o.z.string().trim().min(32),session:ba,authorization:Do}).strict()}).strict(),va=o.z.object({client:ia}).strict(),xa=o.z.object({data:o.z.array(ba)}).strict(),Aa=o.z.object({data:o.z.object({revoked:o.z.boolean()}).strict()}).strict(),ka=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 Sa=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:Zo.optional(),authorization:Do.optional()}).strict();function Ca(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",Yo),session:e=>t("/api/auth/session",Sa,{signal:e}),bootstrapAdmin:e=>t("/api/auth/bootstrap-admin",Zo,n(e)),login:e=>t("/api/auth/login",o.z.object({user:Zo}).strict(),n(e)),changePassword(e){return t("/api/auth/password",o.z.object({user:Zo}).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",na,{...n(),signal:t}).then(e=>e.data),loginMobile:async t=>(await e.request("/api/auth/mobile/login",Xo,n(Jo.parse(t)))).data,cliAuthorize:t=>e.request("/api/auth/cli/authorize",ua,n(ma.parse(t))).then(e=>e.data),cliToken:t=>e.request("/api/auth/cli/token",wa,n(Ia.parse(t))).then(e=>e.data),cliLocalSession:t=>e.request("/api/auth/cli/local",wa,n(va.parse(t))).then(e=>e.data),cliAuthorizationRequest:(t,n)=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}`,za,{signal:n}).then(e=>e.data),cliAuthorizationRequestByUserCode:(t,n)=>e.request(`/api/auth/cli/requests?userCode=${encodeURIComponent(t)}`,za,{signal:n}).then(e=>e.data),approveCliAuthorization:t=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}/approve`,fa,n()).then(e=>e.data),denyCliAuthorization:t=>e.request(`/api/auth/cli/requests/${encodeURIComponent(t)}/deny`,ya,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",ka,{...n(),signal:t}).then(e=>e.data),cliSessions:t=>e.request("/api/auth/cli/sessions",xa,{signal:t}).then(e=>e.data),revokeCliSession:t=>e.request(`/api/auth/cli/sessions/${encodeURIComponent(t)}`,Aa,{method:"DELETE"}).then(e=>e.data),mobileSessions:t=>e.request("/api/auth/mobile/sessions",ea,{signal:t}).then(e=>e.data),revokeMobileSession:t=>e.request(`/api/auth/mobile/sessions/${encodeURIComponent(t)}`,ta,{method:"DELETE"}).then(e=>e.data)}}const ja=e=>o.z.object({data:e}).strict();function Ra(e){return{currentAuthorization:t=>e.request("/api/access/me",ja(Do),{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}`:""),ja(o.z.array(To)),{signal:n}).then(e=>e.data)},detail:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}`,ja(Lo),{signal:n}).then(e=>e.data),create:t=>e.request("/api/users",ja(Lo),$i("POST",t)).then(e=>e.data),update:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}`,ja(Lo),$i("PATCH",Eo.parse(n))).then(e=>e.data),setAccess:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/access`,ja(Lo),$i("PUT",n)).then(e=>e.data),resetPassword:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/password-reset`,ja(Po),$i("POST",n)).then(e=>e.data),unbindExternalIdentity:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/identities/${encodeURIComponent(n)}`,ja(o.z.object({unbound:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),sessions:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/sessions`,ja(o.z.array(No)),{signal:n}).then(e=>e.data),revokeSession:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/sessions/${encodeURIComponent(n)}`,ja(o.z.object({revoked:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),revokeAllSessions:t=>e.request(`/api/users/${encodeURIComponent(t)}/sessions`,ja(o.z.object({revokedSessions:o.z.number().int().nonnegative()}).strict()),{method:"DELETE"}).then(e=>e.data),roles:t=>e.request("/api/roles",ja(o.z.array(_o)),{signal:t}).then(e=>e.data),permissions:t=>e.request("/api/permissions",ja(o.z.array(jo)),{signal:t}).then(e=>e.data),createRole:t=>e.request("/api/roles",ja(_o),$i("POST",t)).then(e=>e.data),updateRole:(t,n)=>e.request(`/api/roles/${encodeURIComponent(t)}`,ja(_o),$i("PATCH",n)).then(e=>e.data),archiveRole:t=>e.request(`/api/roles/${encodeURIComponent(t)}`,ja(_o),{method:"DELETE"}).then(e=>e.data),providers:t=>e.request("/api/identity-providers",ja(o.z.array(qo)),{signal:t}).then(e=>e.data),createProvider:t=>e.request("/api/identity-providers",ja(qo),$i("POST",t)).then(e=>e.data),updateProvider:(t,n)=>e.request(`/api/identity-providers/${encodeURIComponent(t)}`,ja(qo),$i("PATCH",n)).then(e=>e.data),removeProvider:t=>e.request(`/api/identity-providers/${encodeURIComponent(t)}`,ja(o.z.object({deleted:o.z.boolean()}).strict()),{method:"DELETE"}).then(e=>e.data),approvals:t=>e.request("/api/external-identity-approvals",ja(o.z.array(Mo)),{signal:t}).then(e=>e.data),approveIdentity:(t,n)=>e.request(`/api/external-identity-approvals/${encodeURIComponent(t)}/approve`,ja(Lo),$i("POST",n)).then(e=>e.data),rejectIdentity:t=>e.request(`/api/external-identity-approvals/${encodeURIComponent(t)}/reject`,ja(o.z.object({rejected:o.z.boolean()}).strict()),$i("POST",{})).then(e=>e.data)}}const 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()]),$a=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()]),Ea=o.z.object({promptTemplate:o.z.string().trim().min(1).max(2e4)}).strict(),Pa=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(),Oa=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:$a,action:Ea,policy:Pa.default({maxConcurrentRuns:1,whenBusy:"skip"}),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Na=o.z.object({type:o.z.literal("ai-session"),aiSessionId:o.z.string().trim().min(1).max(160)}).strict(),_a=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:Na,localName:o.z.string().trim().min(1).max(160).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Ua=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(),La=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:Na,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(Oa).default([]),deployments:o.z.array(_a).default([]),runtime:o.z.array(Ua).default([]),recentRuns:o.z.array(La).default([])}).strict();const Da=o.z.object({config:Oa,deployment:_a,runtime:Ua.optional()}).strict();o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(160),mutation:Da.optional()}).strip(),o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(160),configHash:Oa.shape.configHash}).strip();const qa=o.z.object({instanceId:o.z.string().trim().min(1).max(160),instanceName:o.z.string().trim().min(1).max(160),deployment:_a,runtime:Ua.optional()}).strip(),Ma=La.extend({instanceName:o.z.string().trim().min(1).max(160).optional()}).strip(),Ba=o.z.object({configHash:o.z.string().trim().min(8).max(80),config:Oa,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(qa),recentRuns:o.z.array(Ma)}).strip(),Fa=o.z.object({updatedAt:o.z.string().datetime(),triggers:o.z.array(Ba)}).strip(),Ha=o.z.object({name:Oa.shape.name,description:Oa.shape.description,source:$a,action:Ea,policy:Pa.partial().optional()}).strict(),Va=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(),Ga=o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Proxy protocol version must use YYYY-MM-DD format."),Wa=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Ya=o.z.string().datetime(),Ka=o.z.string().trim().min(32).max(4096),Ja=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 Za=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"})),Qa=o.z.object({code:Za,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(),Xa=o.z.enum(["active","revoked"]),es=o.z.object({id:Wa,targetNodeId:Wa,status:Xa,createdBy:Wa,expiresAt:Ya,revokedAt:Ya.optional(),createdAt:Ya,updatedAt:Ya}).strict(),ts=o.z.object({targetNodeId:Wa,expiresInSeconds:o.z.number().int().min(60).max(3600).default(600)}).strict(),ns=o.z.object({invite:es,token:o.z.string().trim().min(24).max(512),proxyOrigin:Ja,protocolVersion:Ga}).strict(),is=o.z.enum(["active","revoked"]),os=o.z.object({id:Wa,claimId:Wa,sourceControlPlaneId:Wa,targetNodeId:Wa,bindingKeyId:Wa,status:is,revision:o.z.number().int().positive(),lastError:Qa.optional(),revokedAt:Ya.optional(),createdAt:Ya,updatedAt:Ya}).strict();o.z.object({protocolVersion:Ga,inviteToken:o.z.string().trim().min(24).max(512).optional(),claimId:Wa,sourceControlPlaneId:Wa,targetNodeId:Wa.optional(),bindingKeyId:Wa,credential:Ka}).strict(),o.z.object({sourceControlPlaneId:Wa,bindingKeyId:Wa,credential:Ka}).strict();const as=o.z.object({id:Wa,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:Ya.optional(),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({})}).strict(),ss=o.z.object({protocolVersion:Ga,binding:os,streamId:Wa,revision:o.z.number().int().nonnegative(),observedAt:Ya,target:as}).strict(),rs=o.z.object({type:o.z.literal("control-plane-proxy.event"),protocolVersion:Ga,streamId:Wa,bindingId:Wa,sourceControlPlaneId:Wa,targetNodeId:Wa,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:as,event:o.z.object({type:o.z.string().trim().min(1).max(240),topic:o.z.string().trim().min(1).max(240),createdAt:Ya}).strict()}).strict(),ds=o.z.object({type:o.z.literal("control-plane-proxy.events.ready"),protocolVersion:Ga,streamId:Wa,bindingId:Wa,sourceControlPlaneId:Wa,targetNodeId:Wa,latestRevision:o.z.number().int().nonnegative(),earliestRetainedRevision:o.z.number().int().nonnegative()}).strict(),cs=o.z.object({type:o.z.literal("control-plane-proxy.snapshot-required"),protocolVersion:Ga,streamId:Wa,bindingId:Wa,sourceControlPlaneId:Wa,targetNodeId:Wa,sinceRevision:o.z.number().int().nonnegative(),latestRevision:o.z.number().int().nonnegative(),earliestRetainedRevision:o.z.number().int().nonnegative(),error:Qa}).strict();o.z.discriminatedUnion("type",[rs,ds,cs]),o.z.object({protocolVersion:Ga,binding:os,target:ss.shape.target}).strict();const ls=o.z.object({id:Wa,claimId:Wa,proxyOrigin:Ja,requestedName:o.z.string().trim().min(1).max(160).optional(),sourceControlPlaneId:Wa,targetNodeId:Wa.optional(),bindingKeyId:Wa,credential:Ka,status:o.z.enum(["pending","compensation-required"]),createdAt:Ya,updatedAt:Ya,expiresAt:Ya}).strict().omit({credential:!0});o.z.object({id:Wa,nodeId:Wa,proxyOrigin:Ja,proxyBindingId:Wa,targetNodeId:Wa,sourceControlPlaneId:Wa,bindingKeyId:Wa,credential:Ka,createdAt:Ya,updatedAt:Ya}).strict();const ms=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),ps=o.z.string().datetime(),us=o.z.number().int().nonnegative(),gs=o.z.enum(["https-token","ssh-key"]),hs=o.z.enum(["operation-only","instance-retained"]),zs=o.z.enum(["enabled","disabled"]),fs=o.z.enum(["pending","synced","deferred","revoking","revoked"]),ys=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 Is(e){throw new Error(`Invalid Git credential scope: ${e}`)}function bs(e){const t=e.trim().replace(/^\[|\]$/g,"");(!t||t.includes("*")||/[/?#@\s]/.test(t))&&Is("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("*"))&&Is("host is invalid"),e}catch{Is("host is invalid")}}function ws(e){try{return decodeURIComponent(e)}catch{Is("path contains invalid percent encoding")}}function vs(e){const t=e?.trim()||"/";(t.includes("?")||t.includes("#")||t.includes("\\")||t.includes("\0"))&&Is("path contains an unsupported delimiter");const n=(t.startsWith("/")?t:`/${t}`).split("/").filter(Boolean);for(const e of n){const t=ws(e);("."===t||".."===t||t.includes("/")||t.includes("\\")||t.includes("\0"))&&Is("path contains an unsafe segment")}return 0===n.length?"/":`/${n.join("/")}/`}const xs=o.z.object({id:ms,name:o.z.string().trim().min(1).max(160),kind:gs,scope:ys,secretSet:o.z.literal(!0),status:zs,revision:us,createdAt:ps,updatedAt:ps}).strict(),As=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(),ks=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(),Ss=o.z.discriminatedUnion("kind",[As,ks]);o.z.object({name:o.z.string().trim().min(1).max(160),scope:ys,secret:Ss}).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=ys.parse(e),n="https"===t.scheme?443:22;ys.parse({scheme:t.scheme,host:bs(t.host),...void 0===t.port||t.port===n?{}:{port:t.port},pathPrefix:vs(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:ys.optional(),secret:Ss.optional(),status:zs.optional()}).strict().refine(e=>Object.keys(e).length>0,"At least one credential field must be updated.");const Cs=o.z.object({items:o.z.array(xs).max(1e4)}).strict(),js=o.z.object({instanceId:ms,credentialId:ms,credentialRevision:us,assignmentRevision:us,status:fs,authorizedAt:ps,updatedAt:ps}).strict(),Rs=o.z.object({credential:xs,secret:Ss}).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:ms,generation:us,credentialIds:o.z.array(ms).max(256).transform(e=>[...new Set(e)].sort()),updatedAt:ps}).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:ms,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:ms,frame:o.z.string().min(1).max(1048576)}).strict(),o.z.object({frame:o.z.string().min(1).max(1048576)}).strict();const Ts=o.z.object({operationId:ms,retention:hs,payload:Rs}).strict();o.z.object({operationId:ms,instanceId:ms,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(Ts).max(256).default([])}).strict();const $s=o.z.enum(["openai-responses","openai-chat-completions","anthropic-messages"]);o.z.object({}).strict();const Es=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(),Ps=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($s).max(3).default([]),streaming:o.z.boolean().default(!1)}).strip().default(()=>({protocols:[],streaming:!1}))}).strip(),Os=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(),Ns=o.z.object({enabled:o.z.boolean().default(!1),agentTools:o.z.boolean().default(!1),agentToolCapabilities:Os.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(),_s=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(),Us=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(_s).default([])}).strip(),Ls=Us.omit({combinations:!0}).extend({combinations:o.z.array(o.z.unknown()).default([])}).strip(),Ds=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:Es.optional(),managedModels:Ps.optional(),stories:Ns.optional(),codexManagedSettings:o.z.boolean().optional(),agentExecution:Us.optional()}).strip();function qs(e){const t=e&&"object"==typeof e&&!Array.isArray(e)?e:{},n=Ds.safeParse({...t,agentExecution:void 0}),i=n.success?n.data:{},o=Ls.safeParse(t.agentExecution),a=o.success?Us.parse({...o.data,combinations:o.data.combinations.flatMap(e=>{const t=_s.safeParse(e);return t.success?[t.data]:[]})}):Us.parse({});return{...i,managedGitCredentials:Es.parse(i.managedGitCredentials||{}),managedModels:Ps.parse(i.managedModels||{}),agentExecution:a,stories:{...Ns.parse(i.stories||{}),agentToolCapabilities:Os.parse(i.stories?.agentToolCapabilities||{})}}}const Ms=o.z.string().trim().min(1).max(120),Bs=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}),Fs=o.z.object({selectAtCreate:o.z.boolean().default(!1),updateDuringSession:o.z.boolean().default(!1)}).strip().default({selectAtCreate:!1,updateDuringSession:!1}),Hs=o.z.object({subagents:o.z.boolean().default(!1)}).strip().default({subagents:!1}),Vs=o.z.object({agent:Ms,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:Bs.optional(),reasoningEffort:Fs.optional(),hierarchy:Hs.optional()}).passthrough(),Gs=o.z.array(Vs).max(100).default([]),Ws=new Set(["2026-08-01","2026-08-16","2026-08-17","2026-08-20","2026-09-24","2026-09-29","2026-10-02"]),Ys=o.z.string().regex(/^\d{4}-\d{2}-\d{2}$/,"Protocol version must use YYYY-MM-DD format."),Ks=o.z.string().trim().min(1).max(120),Js=o.z.enum(["low","medium","high"]),Zs=o.z.enum(["none","friendly","pragmatic"]),Qs=o.z.object({modelEntityId:o.z.string().trim().min(1).max(120),modelName:o.z.string().trim().min(1).max(240)}).strict(),Xs=o.z.object({modelVerbosity:Js.optional(),personality:Zs.optional(),multiAgent:o.z.object({enabled:o.z.boolean().default(!0),maxConcurrentThreads:o.z.number().int().min(1).max(64).optional(),defaultModel:Qs.optional(),defaultReasoningEffort:Me.optional()}).strict().default({enabled:!0})}).strict();function er(){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 tr=o.z.object({sessionReadAgents:o.z.array(Ks).max(100).default([]),turnReadAgents:o.z.array(Ks).max(100).default([]),liveItemAgents:o.z.array(Ks).max(100).default([])}).passthrough(),nr=o.z.object({metadataAgents:o.z.array(Ks).max(100).default([]),contentAgents:o.z.array(Ks).max(100).default([]),uploadAgents:o.z.array(Ks).max(100).default([]),retentionSettings:o.z.boolean().default(!1),fileSizeLimitSettings:o.z.boolean().default(!1)}).passthrough(),ir=o.z.object({protocols:o.z.array($s).max(3).default([]),streaming:o.z.boolean().default(!1)}).strip(),or=o.z.object({openCodeConfig:o.z.boolean().default(!1)}).strip(),ar=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:tr.default(function(){return{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),aiSessionConversationAttachments:nr.optional(),aiSessionProviders:Gs.optional(),modelRelay:ir.optional(),managedModelEnvironment:or.optional()}).passthrough(),sr=o.z.object({features:ar.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 rr(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=tr.safeParse(a.aiSessionTimeline);r.success&&(s.aiSessionTimeline=r.data);const d=nr.safeParse(a.aiSessionConversationAttachments);d.success&&(s.aiSessionConversationAttachments=d.data);const c=Gs.safeParse(a.aiSessionProviders);c.success&&(s.aiSessionProviders=c.data);const l=ir.safeParse(a.modelRelay);l.success&&(s.modelRelay=l.data);const m=or.safeParse(a.managedModelEnvironment);return m.success&&(s.managedModelEnvironment=m.data),sr.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 dr=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),cr=o.z.string().datetime(),lr=o.z.record(o.z.string(),o.z.string()).default({}),mr=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 pr=/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,ur=/^sha256:([a-fA-F0-9]{64})$/,gr=/^(?:localhost|[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?)(?::[1-9][0-9]{0,4})?$/,hr=/^[a-z0-9]+(?:(?:[._]|__|-+)[a-z0-9]+)*$/;function zr(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?ur.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&&!pr.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&&!gr.test(m[0].toLowerCase()))throw new Error("Docker image registry host or port is invalid.");if(!u.length||u.some(e=>!hr.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 fr(e){const t=zr(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 yr=o.z.string().trim().min(1).max(512).transform((e,t)=>{try{return zr(e)}catch(e){return t.addIssue({code:"custom",message:e instanceof Error?e.message:String(e)}),o.z.NEVER}}),Ir=o.z.string().trim().transform((e,t)=>{const n=ur.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)}),br=o.z.object({modelEntityIds:o.z.array(dr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:dr.nullable().optional(),claudeModelHash:dr.nullable().optional(),opencodeModelHash:dr.nullable().optional()}).strict().default({}),wr=o.z.object({imageId:dr,tag:o.z.string().trim().min(1).max(128).regex(pr).optional()}).strict(),vr=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("image"),imageSelection:wr}).strict(),o.z.object({type:o.z.literal("template"),environmentTemplateId:dr}).strict()]),xr=o.z.enum(["creating","ready","failed","deleting"]),Ar=o.z.enum(["linux","darwin","win32","freebsd","openbsd","aix","sunos","unknown"]),kr=o.z.enum(["x64","arm64","arm","ia32","ppc64","s390x","riscv64","unknown"]),Sr=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(),Cr=o.z.object({templateId:dr,nodeId:dr,imageId:Ir,name:o.z.string().trim().min(1).max(160),platform:Ar,architecture:kr}).strict(),jr=o.z.enum(["data","agent-home","workspace"]),Rr=o.z.object({deleteVolumes:o.z.boolean()}).strict(),Tr=o.z.object({role:jr,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(),$r=o.z.object({instanceId:dr,containerDeleted:o.z.boolean(),completed:o.z.boolean(),deletedVolumes:o.z.array(Tr),retainedVolumes:o.z.array(Tr),volumeResults:o.z.array(Tr)}).strict(),Er=o.z.object({id:dr,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(),Pr=o.z.object({code:o.z.enum(["APP_CATALOG_INVALID"]),message:o.z.string().trim().min(1).max(500)}).strict(),Or=o.z.object({items:o.z.array(Er).max(256),observedAt:cr,issues:o.z.array(Pr).max(32).default([])}).strict(),Nr=o.z.object({id:dr,name:o.z.string().trim().min(1).max(160),sourceInstanceId:dr,nodeId:dr,imageId:Ir.optional(),internalTag:o.z.string().trim().min(1).max(512).optional(),platform:Ar.optional(),architecture:kr.optional(),sizeBytes:o.z.number().int().nonnegative().optional(),status:xr,error:Sr.optional(),createdAt:cr,updatedAt:cr}).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."})}),_r=o.z.enum(["apt","dnf","brew","npm"]),Ur=o.z.enum(["user","passwordless-sudo","root"]),Lr=o.z.object({platform:Ar,arch:kr,installers:o.z.array(_r).max(8),privilege:Ur,installerAccess:o.z.object({npmGlobalWritable:o.z.boolean().optional()}).strict().optional()}).strict(),Dr=o.z.enum(["installed","not-installed","broken","unsupported"]),qr=o.z.enum(["recipe","bundled","external","none"]),Mr=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(),Br=o.z.object({id:dr,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:Dr,managementSource:qr,version:o.z.string().trim().max(120).optional(),canInstall:o.z.boolean(),canUninstall:o.z.boolean(),installReason:Mr.optional(),uninstallReason:Mr.optional(),activeJobId:dr.optional()}).strict(),Fr=o.z.enum(["install","uninstall"]),Hr=o.z.enum(["queued","running","succeeded","failed","cancelled","interrupted"]),Vr=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"]}),Gr=o.z.object({executable:o.z.string().trim().min(1).max(4096),args:o.z.array(o.z.string().max(4096)).max(128)}).strict(),Wr=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(dr).max(64).optional()}).strict(),Yr=o.z.object({id:dr,requestId:dr.optional(),appId:dr,operation:Fr,state:Hr,phase:o.z.string().trim().min(1).max(120).optional(),progress:Vr.optional(),command:Gr.optional(),logTail:o.z.string().max(32768).optional(),logTruncated:o.z.boolean().optional(),error:Wr.optional(),requestedAt:cr,startedAt:cr.optional(),finishedAt:cr.optional(),updatedAt:cr}).strict(),Kr=o.z.object({streamId:dr,sequence:o.z.number().int().nonnegative(),capabilities:Lr,apps:o.z.array(Br).max(256),activeJobs:o.z.array(Yr).max(256),recentJobs:o.z.array(Yr).max(256),observedAt:cr}).strict(),Jr=o.z.object({requestId:dr.optional()}).strict(),Zr=o.z.object({job:Yr}).strict();o.z.object({type:o.z.literal("app-management"),streamId:dr,sequence:o.z.number().int().nonnegative(),observedAt:cr,job:Yr.optional(),snapshot:Kr.optional()}).strict().refine(e=>void 0!==e.job||void 0!==e.snapshot,{message:"An app management event requires a job or snapshot."});const Qr=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:Ys.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:Ys,build:Qr.extend({component:o.z.literal("control-plane"),packageVersion:o.z.string().trim().min(1).max(80)}).loose(),serverTime:cr}).loose()}).loose();const Xr=o.z.enum(["stable","beta","alpha"]),ed=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(),td=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(),nd=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:cr.optional(),matchedAt:cr.optional(),error:td.optional()}).strict(),id=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(dr).max(1024).default([]),stoppedInstanceIds:o.z.array(dr).max(1024).default([]),activeInstanceIds:o.z.array(dr).max(1024).default([])}).strict(),od=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(dr).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(),ad=o.z.object({channel:Xr.default("stable")}).strict(),sd=o.z.object({source:o.z.literal("npm"),channel:Xr,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(ed).default([]),impact:id,updateAvailable:o.z.boolean(),supported:o.z.boolean().default(!0),reason:o.z.string().trim().max(2048).optional(),checkedAt:cr,preflightToken:o.z.string().trim().min(16).max(240).optional()}).strict(),rd=o.z.object({id:dr,nodeId:dr,source:o.z.literal("npm"),channel:Xr,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(ed).default([]),impact:id,rollout:od,status:o.z.enum(["queued","updating-node","restarting-node","converging-instances","succeeded","degraded","failed"]),error:td.optional(),startedAt:cr.optional(),completedAt:cr.optional(),createdAt:cr,updatedAt:cr}).strict(),dd=o.z.object({channel:Xr,targetVersion:o.z.string().trim().min(1).max(240),preflightToken:o.z.string().trim().min(16).max(240)}).strict(),cd=o.z.object({type:o.z.enum(["branch","tag"]),name:o.z.string().trim().min(1).max(240)}).strict(),ld=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(),md=o.z.discriminatedUnion("type",[cd,ld]),pd=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(),ud=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:dr,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:md.default({type:"branch",name:"main"}),auth:pd.default({type:"none"}),clone:ud.default({submodules:!1,lfs:!1,subdirectory:""}),defaultImageSelection:wr.optional(),labels:lr,createdAt:cr,updatedAt:cr}).strict();const gd=o.z.object({id:dr,nodeId:dr,name:o.z.string().trim().min(1).max(160),path:o.z.string().trim().min(1).max(4096),defaultImageSelection:wr.optional(),labels:lr,createdAt:cr,updatedAt:cr}).strict(),hd=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("git-repository"),repositoryId:dr.optional(),url:o.z.string().trim().min(1).max(2048),provider:o.z.string().trim().max(80).optional(),ref:md.default({type:"branch",name:"main"}),auth:pd.default({type:"none"}),clone:ud.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:md.default({type:"branch",name:"main"}),auth:pd.default({type:"none"}),clone:ud.default({submodules:!1,lfs:!1,subdirectory:""})}).strict(),o.z.object({type:o.z.literal("local-folder"),localFolderId:dr.optional(),path:o.z.string().trim().min(1).max(4096),ownerNodeId:dr.optional()}).strict()]),zd=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(),fd=o.z.enum(["codex","claude","opencode"]),yd=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(),Id=o.z.array(yd).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)}),bd=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(),wd=o.z.array(bd).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)}),vd=wd.default([]),xd=o.z.object({id:dr,name:o.z.string().trim().min(1).max(160),source:hd,defaultImageSelection:wr.optional(),defaultNodeId:dr.optional(),workspacePolicy:zd,labels:lr,createdAt:cr,updatedAt:cr}).strict(),Ad=o.z.object({id:dr,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:Id,mappings:vd,protocols:o.z.array($s).max(3).default([]),app:fd,enabled:o.z.boolean().default(!0),order:o.z.number().int().min(0).max(1e6).default(0),labels:lr,createdAt:cr,updatedAt:cr}).strict(),kd=Ad.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();kd.extend({referenceCount:o.z.number().int().min(0)}).strict(),o.z.object({instanceId:dr,modelEntityIds:o.z.array(dr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:dr.optional(),claudeModelHash:dr.optional(),opencodeModelHash:dr.optional(),updatedAt:cr}).strict().transform(e=>({...e,modelEntityIds:void 0!==e.modelEntityIds?e.modelEntityIds:[...new Set([e.codexModelHash,e.claudeModelHash,e.opencodeModelHash].filter(e=>Boolean(e)))]}));const Sd=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("control-plane"),name:Ad.shape.name,enabled:Ad.shape.enabled,order:Ad.shape.order,revision:o.z.string().trim().min(1).max(160).optional()}).strict(),o.z.object({type:o.z.literal("node"),nodeId:dr,name:Ad.shape.name,enabled:Ad.shape.enabled,order:Ad.shape.order,referenceCount:o.z.number().int().min(0),revision:o.z.string().trim().min(1).max(160).optional()}).strict()]),Cd=o.z.object({id:dr,model:kd,locations:o.z.array(Sd).min(1),referenceCount:o.z.number().int().min(0).default(0)}).strict(),jd=o.z.object({nodeId:dr,code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),Rd=o.z.object({models:o.z.array(Cd),nodeDiagnostics:o.z.array(jd).default([]),updatedAt:cr}).strict();Ad.omit({id:!0,createdAt:!0,updatedAt:!0}).extend({mappings:wd.optional()}).strict().partial().strict();const Td=o.z.enum(["synced","pending","unsupported","error"]),$d=o.z.object({nodeId:dr,state:Td,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({model:kd,locations:o.z.array($d).default([])}).strict();o.z.object({targetModelId:dr}).strict(),o.z.object({merged:o.z.literal(!0),reassignedInstances:o.z.array(dr).default([])}).strict();const Pd=o.z.object({nodeId:dr,merged:o.z.boolean(),reassignedInstances:o.z.array(dr).default([]),code:o.z.string().trim().min(1).max(120).optional(),message:o.z.string().trim().min(1).max(2e3).optional()}).strict(),Od=o.z.object({modelId:dr,targetModelId:dr,merged:o.z.boolean(),locations:o.z.array(Pd).default([])}).strict();o.z.object({modelSelection:br,modelEntityIds:o.z.array(dr).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:dr.optional(),claudeModelHash:dr.optional(),opencodeModelHash:dr.optional()}).strict().transform(e=>({...e,modelEntityIds:e.modelEntityIds||e.modelSelection.modelEntityIds||[...new Set([e.codexModelHash,e.claudeModelHash,e.opencodeModelHash].filter(e=>Boolean(e)))]}));const Nd=o.z.enum(["market","custom"]),_d=o.z.enum(["active","deprecated","yanked"]),Ud=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:Ir.optional()}).strict()]),Ld=o.z.array(o.z.string().trim().min(1).max(80)).default([]),Dd=o.z.array(o.z.string().trim().min(1).max(120)).default([]),qd=o.z.record(o.z.string().trim().min(2).max(35),o.z.string().trim().min(1).max(4096)),Md=o.z.object({os:o.z.string().trim().min(1).max(40),architecture:o.z.string().trim().min(1).max(40),digest:Ir.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional()}).strict(),Bd=o.z.object({name:o.z.string().trim().min(1).max(128).regex(pr),version:o.z.string().trim().min(1).max(160).optional(),reference:yr,manifestDigest:Ir.optional(),publishedAt:cr.optional(),platforms:o.z.array(Md).default([]),status:_d.default("active")}).strict(),Fd=o.z.object({id:dr,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:qd.optional(),cover:Ud.optional(),repository:o.z.string().trim().min(1).max(512),defaultTag:o.z.string().trim().min(1).max(128).regex(pr),tags:o.z.array(Bd).min(1),capabilities:Ld,optionalApps:Dd,defaultEnv:mr,labels:lr,status:_d.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."})}),Hd=o.z.object({protocolVersion:Ys,catalogId:dr,revision:o.z.string().trim().min(1).max(240),source:o.z.enum(["embedded","remote","cache"]),generatedAt:cr,expiresAt:cr.optional(),items:o.z.array(Fd)}).strict(),Vd=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:cr,error:o.z.string().trim().max(4096).optional()}).strict(),Gd=o.z.object({id:dr,origin:o.z.literal("custom"),name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:qd.optional(),cover:Ud.optional(),reference:yr,repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(pr).optional(),pullPolicy:o.z.literal("if-not-present").default("if-not-present"),capabilities:Ld,optionalApps:Dd,defaultEnv:mr,labels:lr,createdAt:cr,updatedAt:cr}).strict(),Wd=o.z.object({name:o.z.string().trim().min(1).max(128).regex(pr),version:o.z.string().trim().min(1).max(160).optional(),reference:yr,manifestDigest:Ir.optional(),status:_d}).strict(),Yd=o.z.object({id:dr,origin:Nd,name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:qd.optional(),cover:Ud,repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(pr).optional(),availableTags:o.z.array(Wd),reference:yr,digest:Ir.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional(),capabilities:Ld,optionalApps:Dd,defaultEnv:mr,labels:lr,readOnly:o.z.boolean(),lifecycleStatus:_d.optional(),market:o.z.object({catalogId:dr,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(),Kd=o.z.object({id:dr,origin:Nd,name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:qd.optional(),cover:Ud.optional(),repository:o.z.string().trim().min(1).max(512),tag:o.z.string().trim().min(1).max(128).regex(pr).optional(),requestedReference:yr,resolvedDigest:Ir.optional(),resolvedReference:yr.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),pullPolicy:o.z.literal("if-not-present").default("if-not-present"),capabilities:Ld,optionalApps:Dd,defaultEnv:mr,labels:lr,market:o.z.object({catalogId:dr,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:cr,updatedAt:cr}).strict(),Jd=o.z.object({phase:o.z.enum(["checking-image","pulling-image","resolving-image","ready","failed"]),requestedReference:yr,generation:o.z.number().int().nonnegative().default(0),error:o.z.string().trim().max(4096).optional(),startedAt:cr,updatedAt:cr}).strict(),Zd=o.z.object({instanceId:dr,generation:o.z.number().int().nonnegative(),requestedReference:yr,sequence:o.z.number().int().nonnegative(),observedAt:cr}).strict();Zd.extend({data:o.z.string().min(1).max(65536),replay:o.z.boolean().optional()}).strict(),Zd.extend({outcome:o.z.enum(["succeeded","failed"])}).strict(),Zd.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 Qd=o.z.enum(["pending","cloning","checking-out","submodules","lfs","finalizing","ready","failed"]),Xd=o.z.object({phase:Qd,remoteUrl:o.z.string().trim().min(1).max(2048),generation:o.z.number().int().nonnegative().default(0),error:o.z.string().trim().max(4096).optional(),startedAt:cr,updatedAt:cr}).strict(),ec=o.z.object({instanceId:dr,generation:o.z.number().int().nonnegative(),remoteUrl:o.z.string().trim().min(1).max(2048),sequence:o.z.number().int().nonnegative(),observedAt:cr}).strict();ec.extend({data:o.z.string().min(1).max(65536),replay:o.z.boolean().optional()}).strict(),ec.extend({outcome:o.z.enum(["succeeded","failed"])}).strict(),ec.extend({status:o.z.enum(["connecting","cloning","checking-out","submodules","lfs","finalizing","complete","failed"]),objects:o.z.object({received:o.z.number().int().nonnegative(),total:o.z.number().int().nonnegative()}).strict().optional(),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 tc=o.z.discriminatedUnion("kind",[o.z.object({kind:o.z.literal("direct")}).strict(),o.z.object({kind:o.z.literal("control-plane-proxy"),proxyId:dr,proxyBindingId:dr,targetNodeId:dr}).strict()]),nc=o.z.object({pingRttMs:o.z.number().nonnegative().optional(),pingRttP95Ms:o.z.number().nonnegative().optional(),consecutiveReconnects:o.z.number().int().nonnegative(),nextRetryAt:cr.optional()}).strict();o.z.object({nodeId:dr,inviteId:dr.optional()}).strict();const ic=o.z.discriminatedUnion("status",[o.z.object({id:dr,status:o.z.literal("pending")}).strict(),o.z.object({id:dr,status:o.z.literal("completed"),nodeId:dr}).strict()]),oc=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:cr.optional(),target:as.optional(),lastError:Qa.optional(),updatedAt:cr}).strict(),ac=o.z.object({id:dr,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:tc.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:dr.optional(),secret:o.z.string().trim().max(4096).optional(),pairedAt:cr.optional(),pairing:o.z.object({status:o.z.enum(["pending","paired","expired"]).default("pending"),joinToken:o.z.string().trim().max(4096).optional(),expiresAt:cr.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:oc.optional(),appInventory:Or.optional(),labels:lr,lastSeenAt:cr.optional(),createdAt:cr,updatedAt:cr}).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:dr,status:o.z.enum(["unknown","online","offline","degraded"]),health:o.z.enum(["unknown","ok","degraded","failed"]),lastSeenAt:cr.nullable(),connectionPhase:o.z.enum(["connecting","handshaking","healthy","reconnecting","suspect","offline"]).nullable(),connectionDiagnostics:nc.nullable(),proxyState:oc.nullable()}).strict();const sc=o.z.object({id:dr,nodeId:dr,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:lr,createdAt:cr,updatedAt:cr}).strict();o.z.object({instanceId:dr,runtimeKind:o.z.literal("docker"),state:o.z.enum(["pending","available","stopped","unavailable"]),sampledAt:cr,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 rc=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:cr.optional(),lastCongestedAt:cr.optional()}).strip();o.z.object({ok:o.z.boolean().optional(),role:o.z.string().optional(),nodeId:dr.optional(),hostname:o.z.string().trim().min(1).max(255).optional(),platform:Ar.optional(),arch:kr.optional(),protocolVersion:Ys.optional(),capabilities:Ds.optional(),build:Qr.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:rc.optional(),serverTime:cr.optional()}).strip();const dc=o.z.object({bindScope:o.z.enum(["loopback","all-ipv4"]),port:o.z.number().int().min(1).max(65535)}).strict(),cc=dc.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(),lc=dc,mc=o.z.object({enabled:o.z.boolean()}).strict(),pc=o.z.object({enabled:o.z.boolean(),source:o.z.enum(["default","persisted"])}).strip(),uc=mc,gc=o.z.object({nodeId:dr,joinToken:o.z.string().trim().min(1),expiresAt:cr}).passthrough();o.z.object({nodeId:dr,keyId:dr,secret:o.z.string().regex(/^[A-Za-z0-9_-]{32,128}$/),pairedAt:cr}).strict();const hc=o.z.object({id:dr,keyId:dr,name:o.z.string().trim().min(1).max(160).optional(),pairedAt:cr,updatedAt:cr,current:o.z.boolean()}).passthrough();o.z.object({keyId:dr,revoked:o.z.literal(!0),revokedAt:cr}).strict();const zc=o.z.object({id:dr,pairingKeyId:dr,url:o.z.string().trim().min(1).max(2048),name:o.z.string().trim().min(1).max(160).optional(),enabled:o.z.boolean(),createdAt:cr,updatedAt:cr,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:cr.optional(),lastConnectedAt:cr.optional(),lastDisconnectedAt:cr.optional(),error:o.z.string().optional()}).passthrough(),fc=o.z.object({pairing:hc,connection:o.z.object({id:dr,pairingKeyId:dr,url:o.z.string().trim().min(1).max(2048),name:o.z.string().trim().min(1).max(160).optional(),enabled:o.z.boolean(),createdAt:cr,updatedAt:cr}).passthrough(),tunnel:o.z.object({status:o.z.enum(["disabled","saved","connecting","connected","failed"]),error:o.z.string().trim().max(2048).optional()}).passthrough()}).passthrough(),yc=o.z.object({deleted:o.z.boolean().optional()}).passthrough(),Ic=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(),bc=o.z.object({image:Yd,status:o.z.enum(["available","pull-required","unknown"]),localImage:Ic.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(),wc=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(wc)}).passthrough()),vc=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 xc=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(),Ac=o.z.object({...xc.shape}).strict(),kc=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"}),Sc=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(),gitProvisioning:Xd.optional()}).passthrough(),Cc=o.z.object({id:dr,name:o.z.string().trim().min(1).max(160),projectId:dr.optional(),source:hd,sourceSnapshot:o.z.record(o.z.string(),o.z.unknown()).default({}),modelSelection:br,nodeId:dr,runtimeId:dr,imageSelection:wr.optional(),environmentSource:vr.optional(),environmentTemplateOrigin:Cr.optional(),imageSnapshot:Kd.optional(),imageProvisioning:Jd.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:Ys.optional(),instanceVersion:o.z.string().trim().max(80).optional(),build:Qr.optional(),runtimeVersion:nd.optional(),ready:o.z.boolean().default(!1),capabilities:sr.default(er),appInventory:Or.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:ve.default("ask"),codexSettings:Xs.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(q).default(D)}).strict().default({autoImportAgentConfigs:!0,codexConfigEnabled:!0,codexHomeMode:"taskhandoff",defaultCodexPermissionMode:"ask",aiSessionHistoryLimit:50,aiSessionAttachmentRetentionDays:30,aiSessionMaxFileAttachmentBytes:D}),workspace:Sc.default({status:"unknown"}),target:xc.default({strategy:"direct-port",status:"unknown"}),access:kc,apps:o.z.object({runningCount:o.z.number().int().min(0).default(0),problemCount:o.z.number().int().min(0).default(0),updatedAt:cr.optional(),revision:o.z.number().int().min(0).optional()}).strict().default({runningCount:0,problemCount:0}),aiSessions:qt.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:Oa,deployments:o.z.array(_a).default([]),runtime:o.z.array(Ua).default([])}).strict()).default([]),recentRuns:o.z.array(La).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:cr.optional(),createdAt:cr,updatedAt:cr}).strict(),jc=o.z.object({autoImportAgentConfigs:o.z.boolean().optional(),codexConfigEnabled:o.z.boolean().optional(),codexHomeMode:o.z.enum(["default","taskhandoff"]).optional(),defaultCodexPermissionMode:ve.optional(),codexSettings:Xs.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(q).optional()}).strict(),Rc=o.z.object({name:Cc.shape.name.optional(),config:jc.optional(),modelSelection:Cc.shape.modelSelection.unwrap().optional()}).strict(),Tc=o.z.object({id:Cc.shape.id.optional(),name:Cc.shape.name.optional(),projectId:Cc.shape.projectId,source:hd.optional(),sourceSnapshot:o.z.record(o.z.string(),o.z.unknown()).optional(),nodeId:Cc.shape.nodeId.optional(),runtimeId:Cc.shape.runtimeId.optional(),environmentSource:vr.optional(),imageSelection:Cc.shape.imageSelection,config:jc.optional(),modelSelection:Cc.shape.modelSelection.optional(),gitCredentialRetention:hs.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."})}),$c=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(),Ec=o.z.object({...Cc.omit({registrationToken:!0}).shape,startOutcome:$c}).strict(),Pc=o.z.union([Cc.transform(e=>({instance:e,gitWorkspaceProvisioningOperationId:void 0})),o.z.object({instance:Cc,gitWorkspaceProvisioningOperationId:dr.optional()}).strict()]);function Oc(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return e;const n=e,i=new Set(Object.keys(Cc.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=rr(e)}else o.capabilities=rr(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=Uc(e,["id","name","kind","source","availability","diagnosticCode"]);return!t||"object"!=typeof t||Array.isArray(t)?t:{...t,capabilities:Uc(e.capabilities,["automation","supportsCwdSelection","supportsProfiles"])}}):t.items,issues:Array.isArray(t.issues)?t.issues.map(e=>Uc(e,["code","message"])):t.issues},i=Or.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=hd.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=Uc(t,o);if("local-folder"!==n){const e=function(e){const t=e&&"object"==typeof e&&!Array.isArray(e)?e:void 0,n=md.safeParse(Uc(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?md.safeParse({type:"commit",commit:i}):o?md.safeParse({type:"tag"===t?.type?"tag":"branch",name:o}):md.safeParse({type:"branch",name:"main"});return a.success?a.data:void 0}(t.ref),n=Nc(pd,Uc(t.auth,["type","secretId"])),i=Nc(ud,Uc(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=Nc(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=Nc(Qr,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=Nc(Dt,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:cr.safeParse(t.updatedAt).success?t.updatedAt:(new Date).toISOString()};return Object.keys(t).some(e=>!["runningCount","waitingCount","staleCount","sessions","updatedAt"].includes(e)),qt.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=Nc(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=Uc(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=Uc(e,i)}return n.action=Uc(t.action,["promptTemplate"]),n.policy=Uc(t.policy,["cooldownMs","maxConcurrentRuns","whenBusy"]),Nc(Oa,n)}(i.config);return"string"==typeof i.configHash&&o?[{configHash:i.configHash,config:o,deployments:n(i.deployments,_a),runtime:n(i.runtime,Ua)}]:[]}):[];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,La)}}(n.triggers,"string"==typeof n.id&&n.id),o.apps=Nc(Cc.shape.apps.unwrap(),Uc(n.apps,["runningCount","problemCount","updatedAt","revision"]),0,0,"string"==typeof n.id&&n.id)||{runningCount:0,problemCount:0},o.config=Nc(Cc.shape.config.unwrap(),Uc(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:D},o.modelSelection=Nc(br.unwrap(),Uc(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=zr(a)}catch{if(!a.includes("@")&&a.lastIndexOf(":")<=a.lastIndexOf("/"))try{a=zr(`${a}:latest`)}catch{}}try{o=a?fr(a):void 0}catch{}return{id:t.id,origin:"custom",name:t.name,description:t.description,localizedDescriptions:t.localizedDescriptions,cover:Uc(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?fr(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?Uc(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=Uc(n.imageSelection,["imageId","tag"]);o.imageSelection=s||(a?{imageId:a,tag:o.imageSnapshot?.tag}:void 0),o.imageProvisioning=Nc(Jd,Uc(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(nd.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(td.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=cr.safeParse(t.lastAttemptAt),l=cr.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=Nc(Sc,n.workspace,0,0,"string"==typeof n.id&&n.id)||{status:"unknown"},o.environmentSource=Nc(vr,n.environmentSource,0,0,"string"==typeof n.id&&n.id),o.environmentTemplateOrigin=Nc(Cr,n.environmentTemplateOrigin,0,0,"string"==typeof n.id&&n.id),o.runtime=Nc(Cc.shape.runtime.unwrap(),n.runtime,0,0,"string"==typeof n.id&&n.id)||{labels:{}},o.target=Nc(xc,Uc(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=Nc(kc,Uc(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(Cc.shape))Object.prototype.hasOwnProperty.call(o,e)&&!t.safeParse(o[e]).success&&t.safeParse(void 0).success&&delete o[e];return o}function Nc(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 Uc(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:Oc(t.instance),..."string"==typeof t.gitWorkspaceProvisioningOperationId?{gitWorkspaceProvisioningOperationId:t.gitWorkspaceProvisioningOperationId}:{}}:Oc(t)},Pc),o.z.object({instanceId:Cc.shape.id,revision:o.z.number().int().min(0),updatedAt:cr,status:Cc.shape.status.unwrap(),health:Cc.shape.health.unwrap(),connectionStatus:Cc.shape.connectionStatus.unwrap(),accessStatus:o.z.enum(["reachable","endpoint-unreachable"]),imageProvisioning:Jd.optional(),workspace:Sc,runtime:Cc.shape.runtime.unwrap(),runtimeVersion:nd.optional(),ready:o.z.boolean(),lastHeartbeatAt:cr.optional()}).strict(),o.z.object({instanceId:dr.optional(),projectId:dr.optional(),source:hd.optional(),nodeId:dr.optional(),runtimeId:dr.optional(),imageSelection:wr.optional(),instanceVersion:o.z.string().trim().max(80).optional(),protocolVersion:Ys,build:Qr.optional(),controlMode:o.z.enum(["standalone","controlled"]).default("controlled"),capabilities:sr.default(er),appInventory:Or.optional(),target:Ac.optional(),workspace:Sc.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)=>{Ws.has(e.protocolVersion)&&!e.appInventory&&t.addIssue({code:"custom",path:["appInventory"],message:"Current protocol register payload requires appInventory."})}),o.z.object({status:Cc.shape.status.optional(),health:Cc.shape.health.optional(),protocolVersion:Ys,build:Qr.optional(),capabilities:Cc.shape.capabilities.optional(),appInventory:Or.optional(),apps:Cc.shape.apps.optional(),aiSessions:Cc.shape.aiSessions.optional(),triggers:Cc.shape.triggers.optional(),workspace:Sc.optional(),target:Ac.optional(),processIncarnationId:o.z.string().trim().min(1).max(120).optional()}).strict().superRefine((e,t)=>{Ws.has(e.protocolVersion)&&!e.appInventory&&t.addIssue({code:"custom",path:["appInventory"],message:"Current protocol heartbeat payload requires appInventory."})});const Lc=o.z.enum(["web","telegram","wechat","dingding","lark"]),Dc=o.z.object({id:dr,channel:Lc,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:cr,updatedAt:cr}).strict(),qc=o.z.object({id:dr,channel:Lc,bridgeId:dr.optional(),chatSessionId:o.z.string().trim().min(1).max(240),userId:o.z.string().trim().max(240).optional(),activeProjectId:dr.optional(),activeInstanceId:dr.optional(),activeAiSessionId:o.z.string().trim().min(1).max(120).optional(),lastUsedAt:cr,createdAt:cr,updatedAt:cr}).strict();o.z.object({source:o.z.object({type:o.z.literal("chat-gateway").default("chat-gateway"),channel:Lc,bridgeId:dr.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(ye).max(6).default([])}).strict().superRefine((e,t)=>{e.attachments.reduce((e,t)=>e+("inline"===t.source.type?t.size:0),0)>M&&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:dr,aiSessionId:o.z.string().trim().min(1).max(120)}).strict().optional()}).strict(),o.z.object({id:dr,instanceId:dr,projectId:dr.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:cr}).strict();const Mc=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 \\."),Bc=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 \\."),Fc=o.z.object({publicBaseUrl:o.z.string().trim().max(2048).optional(),updateChannel:Xr.default("stable"),mentionTrigger:Mc.default("@"),commandTrigger:Bc.default("/"),diagnosticLogs:o.z.boolean().default(!1)}).strict().refine(e=>e.mentionTrigger!==e.commandTrigger,{path:["commandTrigger"],message:"Command and mention triggers must be different."}),Hc=o.z.object({publicBaseUrl:o.z.string().trim().max(2048).optional(),updateChannel:Xr.optional(),mentionTrigger:Mc.optional(),commandTrigger:Bc.optional(),diagnosticLogs:o.z.boolean().optional()}).strict(),Vc=o.z.object({id:xd.shape.id.optional(),name:xd.shape.name,source:hd,defaultImageSelection:xd.shape.defaultImageSelection,defaultNodeId:xd.shape.defaultNodeId,workspacePolicy:zd.optional(),labels:xd.shape.labels.optional()}),Gc={defaultRuntimeId:sc.shape.id.optional()};Vc.extend(Gc).strict().transform(({defaultRuntimeId:e,...t})=>({...t,source:hd.parse(t.source)})),Vc.omit({id:!0}).partial().extend(Gc).strict().transform(({defaultRuntimeId:e,...t})=>({...t,...t.source?{source:hd.parse(t.source)}:{}})),o.z.object({id:Gd.shape.id.optional(),name:Gd.shape.name,description:Gd.shape.description,cover:Gd.shape.cover,reference:Gd.shape.reference,pullPolicy:Gd.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:Gd.shape.defaultEnv.optional(),labels:Gd.shape.labels.optional()}).strict().omit({id:!0}).partial().strict();const Wc=o.z.object({name:Ad.shape.name,endpoint:Ad.shape.endpoint,key:Ad.shape.key,model:Ad.shape.model,modelNames:Ad.shape.modelNames.optional(),mappings:wd.optional(),protocols:Ad.shape.protocols.optional(),app:Ad.shape.app,enabled:Ad.shape.enabled.optional(),order:Ad.shape.order.optional(),labels:Ad.shape.labels.optional()}).strict();Wc.omit({key:!0}).extend({key:Ad.shape.key.optional()}).strict(),Wc.partial().strict(),o.z.object({endpoint:Ad.shape.endpoint,key:Ad.shape.key.optional(),existingModelId:Ad.shape.id.optional()}).strict().extend({model:Ad.shape.model,app:Ad.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 Yc=o.z.object({mode:o.z.enum(["local-static-key","paired-hmac","proxy-binding"]).default("local-static-key"),keyId:ac.shape.id.optional(),secret:o.z.string().trim().max(4096).optional(),pairedAt:ac.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:ac.shape.createdAt.optional()}).strict().optional()}).strict();o.z.object({id:ac.shape.id.optional(),name:ac.shape.name.optional(),connectionMode:ac.shape.connectionMode.optional(),connectionPath:ac.shape.connectionPath.optional(),connectionEnabled:ac.shape.connectionEnabled.optional(),auth:Yc.optional(),joinToken:o.z.string().trim().min(1).max(4096).optional(),endpoint:ac.shape.endpoint,controlEndpoint:ac.shape.controlEndpoint,containerEndpoint:ac.shape.containerEndpoint,publicWebBase:ac.shape.publicWebBase,status:o.z.enum(["unknown","online","offline","degraded"]).optional(),health:o.z.enum(["unknown","ok","degraded","failed"]).optional(),capabilities:ac.shape.capabilities.optional(),labels:ac.shape.labels.optional(),lastSeenAt:ac.shape.lastSeenAt}).strict(),o.z.object({name:ac.shape.name.optional(),connectionMode:ac.shape.connectionMode.unwrap().optional(),connectionPath:ac.shape.connectionPath.unwrap().optional(),connectionEnabled:ac.shape.connectionEnabled.unwrap().optional(),auth:Yc.optional(),endpoint:ac.shape.endpoint,controlEndpoint:ac.shape.controlEndpoint,containerEndpoint:ac.shape.containerEndpoint,publicWebBase:ac.shape.publicWebBase,status:ac.shape.status.unwrap().optional(),health:ac.shape.health.unwrap().optional(),capabilities:ac.shape.capabilities.unwrap().optional(),labels:ac.shape.labels.unwrap().optional(),lastSeenAt:ac.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 Kc=256,Jc=o.z.string().trim().min(1).max(80).regex(/^[a-z0-9][a-z0-9._-]*$/),Zc=o.z.string().trim().min(1).max(512).refine(e=>!/\s/.test(e)&&!/[;&|<>`$]/.test(e),"Command must be a single executable path or name."),Qc=o.z.object({id:Jc,name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),description:o.z.string().max(500).optional(),command:Zc,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(Qc).max(Kc);const Xc=o.z.object({id:Jc,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(),el=o.z.object({items:o.z.array(Xc).max(Kc)}).strict(),tl=o.z.object({schemaVersion:o.z.literal(1),items:o.z.array(Qc).max(Kc)}).strict(),nl=o.z.object({items:o.z.array(Qc).max(Kc)}).strict();function il(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=Jr.parse(a?{requestId:a}:{});return n(`${t(e)}/${encodeURIComponent(i)}/${o}`,Zr,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})};return{management:(e,i)=>n(`${t(e)}/management`,Kr,{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)}`,Zr,{signal:o}),catalog:(e,i)=>n(`${t(e)}/catalog`,el,{signal:i}),customCatalog:(e,i)=>n(`${t(e)}/catalog/custom`,tl,{signal:i}),updateCustomCatalog:(e,i)=>n(`${t(e)}/catalog/custom`,tl,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(nl.parse(i))})}}const ol=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),al=o.z.string().datetime(),sl=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 rl=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(),dl=o.z.object({aiSessionTimeline:sl.default(function(){return{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),aiSessionConversationAttachments:rl.optional(),aiSessionProviders:Gs.optional(),browserTunnel:o.z.boolean().optional(),aiSessionQueuePause:o.z.boolean().optional()}).passthrough(),cl=o.z.enum(["connecting","handshaking","healthy","reconnecting","suspect","offline"]),ll=o.z.enum(["start","stop","restart","retry-image","retry-git"]);o.z.object({instanceId:ol,revision:o.z.number().int().nonnegative(),updatedAt:al,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:al.optional()}).strip();const ml=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048)}).strict(),pl=o.z.enum(["instances","runtimes","models"]),ul=o.z.enum(["uninitialized","loading","ready","stale","error"]),gl=o.z.object({nodeId:ol,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(),hl=o.z.object({nodeId:ol,resource:pl,phase:ul,revision:o.z.number().int().nonnegative().optional(),updatedAt:al.optional(),error:gl.optional()}).strict();hl.extend({contentChanged:o.z.boolean().optional()}).strict();const zl=o.z.object({nodeStates:o.z.array(hl).default([])}).passthrough(),fl=o.z.object({id:ol,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:cl.optional(),lastSeenAt:al.optional(),observedAt:al,capabilities:o.z.array(o.z.string().trim().min(1).max(120)).max(256),error:ml.optional()}).strict(),yl=o.z.array(fl),Il=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(),bl=o.z.object({modelEntityIds:o.z.array(ol).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:ol.nullable().optional(),claudeModelHash:ol.nullable().optional(),opencodeModelHash:ol.nullable().optional()}).strict().default({}),wl=o.z.object({id:ol,name:o.z.string().trim().min(1).max(160),nodeId:ol,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:dl.default({aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),config:o.z.object({defaultCodexPermissionMode:ve.default("ask"),aiSessionMaxFileAttachmentBytes:o.z.number().int().positive().default(D)}).strict().default({defaultCodexPermissionMode:"ask",aiSessionMaxFileAttachmentBytes:D}),modelSelection:bl,lastHeartbeatAt:al.optional(),heartbeatAgeMs:o.z.number().int().nonnegative().optional(),observedAt:al,runtime:o.z.object({id:ol,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:Mt,availableActions:o.z.array(ll).max(4).default([]),availableApps:o.z.array(Il).max(256).default([]),availableAgents:o.z.array(Il).max(256),error:ml.optional()}).strict(),vl=o.z.array(wl),xl=e=>o.z.object({data:e}).passthrough(),Al=o.z.object({data:vl,meta:zl.optional()}).passthrough(),kl=o.z.object({config:o.z.object({defaultCodexPermissionMode:ve}).passthrough()}).passthrough(),Sl=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(),Cl=o.z.object({id:o.z.string().trim().min(1).max(160),name:o.z.string().trim().min(1).max(160)}),jl=o.z.object({id:o.z.string().trim().min(1).max(160),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({})}).passthrough(),Rl=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(),Tl=o.z.object({models:o.z.array(Rl)}).passthrough(),$l=o.z.object({id:o.z.string().trim().min(1).max(160),status:o.z.string().trim().min(1).max(80)}).strip(),El=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 Pl(e){const t=async(t,n,i)=>(await e.request(t,xl(n),{signal:i})).data;return{nodes:e=>t("/api/nodes?projection=directory",yl,e),node:(e,n)=>t(`/api/nodes/${encodeURIComponent(e)}`,jl,n),instanceBoard:e=>t("/api/instance-board?projection=directory",vl,e),instanceDirectory:t=>e.request("/api/instance-board?projection=directory&progressive=true",Al,{signal:t}),models:e=>t("/api/models",Tl,e),instanceWorkspaceSource:async(e,n)=>(await t(`/api/controlled-instances/${encodeURIComponent(e)}`,Sl,n)).source,updateInstanceName:async(t,n)=>(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,xl(Cl),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:n})})).data,async updateInstance(t,n){const i=Rc.parse(n);return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,xl(Cc),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(i)})).data},updateNodeName:async(t,n)=>(await e.request(`/api/nodes/${encodeURIComponent(t)}`,xl(Cl),{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)}`,xl(kl),{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",xl(Ec),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(t)})).data,async deleteInstance(t,n){const i=Rr.parse(n);return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,xl($r),{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(El),n),instanceAction(t,n){const i=ll.parse(n),o="retry-image"===i?"image-provisioning/retry":"retry-git"===i?"git-provisioning/retry":i;return e.request(`/api/controlled-instances/${encodeURIComponent(t)}/${o}`,xl($l),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}).then(e=>e.data)}}}const Ol=Oa.extend({id:Oa.shape.configHash}).strip(),Nl=o.z.object({config:Oa,deployment:_a,runtime:Ua.optional()}).strip(),_l=o.z.object({previousConfigHash:Oa.shape.configHash.optional(),trigger:Ol.optional(),configHash:Oa.shape.configHash.optional(),deletedTemplate:o.z.boolean().optional(),results:o.z.array(o.z.unknown()).optional(),partialFailures:o.z.array(Va).default([])}).strip(),Ul=o.z.object({configHash:Oa.shape.configHash,results:o.z.array(o.z.unknown()).default([])}).passthrough();function Ll(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",Fa,{signal:e}),create:e=>t("/api/triggers",Ol,$i("POST",Ha.parse(e))),update:(e,n)=>t(`/api/triggers/${encodeURIComponent(e)}`,_l,$i("PUT",Ha.parse(n))),remove:e=>t(`/api/triggers/${encodeURIComponent(e)}`,_l,$i("DELETE")),apply:(e,n)=>t(`/api/triggers/${encodeURIComponent(e)}/apply`,Ul,$i("POST",n)),bindSession:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/triggers`,Nl,$i("POST",{configHash:i})),unbindSession:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/triggers/${encodeURIComponent(i)}`,o.z.unknown(),$i("DELETE")),run:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/triggers/${encodeURIComponent(n)}/run`,o.z.unknown(),$i("POST",i?{deploymentId:i}:{}))}}const Dl=2e3,ql=32e3,Ml=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Bl=Ml,Fl=o.z.string().regex(/^[a-f0-9]{64}$/),Hl=o.z.enum(["overlay-copy-on-write","worktree"]),Vl=o.z.enum(["instance","container","local-runtime"]),Gl=o.z.object({workspaceMaterializer:Hl.default("overlay-copy-on-write"),processSandbox:Vl.default("instance")}).strict(),Wl=o.z.object({id:Bl,revision:Fl,name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(Dl).default(""),appendedPrompt:o.z.string().max(ql).default(""),targetInstanceId:Ml,cwdFolderId:Ml,providerId:Ml,modelEntityId:Ml.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:Gl,createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Yl={name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(Dl).default(""),appendedPrompt:o.z.string().max(ql).default(""),targetInstanceId:Ml,cwdFolderId:Ml,providerId:Ml,modelEntityId:Ml.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:Gl.optional()},Kl=o.z.object(Yl).strict(),Jl=o.z.object({expectedRevision:Fl,name:Yl.name.optional(),description:o.z.string().trim().max(Dl).nullable().optional(),appendedPrompt:o.z.string().max(ql).nullable().optional(),targetInstanceId:Yl.targetInstanceId.optional(),cwdFolderId:Yl.cwdFolderId.optional(),providerId:Yl.providerId.optional(),modelEntityId:Ml.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:Yl.executionPolicy}).strict();o.z.object({agents:o.z.array(Wl)}).strict();const Zl=o.z.object({id:Bl,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:Ml,agent:Wl}).strict()),unavailableNodeIds:o.z.array(Ml).default([])}).strict();const Ql=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"]),Xl=o.z.object({code:o.z.literal("AGENT_DEFINITION_REVISION_CONFLICT"),expectedRevision:Fl,actualRevision:Fl}).strict();o.z.union([Xl,o.z.object({code:Ql}).strict()]);const em=o.z.object({agentId:Bl,change:o.z.enum(["created","updated","deleted"]),revision:Fl.optional(),definition:Wl.optional()}).strict();o.z.object({nodeId:Ml,event:em}).strict();const tm=Wl.strip().extend({executionPolicy:Gl.strip()});o.z.object({agents:o.z.array(tm)}).strip();const nm=o.z.object({agents:o.z.array(o.z.object({nodeId:Ml,agent:tm}).strip()),unavailableNodeIds:o.z.array(o.z.string().trim().min(1).max(120)).default([])}).strip(),im=o.z.object({agentId:Bl,change:o.z.enum(["created","updated","deleted"]),revision:Fl.optional(),definition:tm.optional()}).strip();function om(e){return tm.parse(e)}o.z.object({nodeId:Ml,event:im}).strip();const am=200,sm=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),rm=sm,dm=o.z.string().regex(/^[a-f0-9]{64}$/),cm=o.z.object({fromAgentId:Bl,toAgentId:Bl}).strict(),lm=o.z.object({id:rm,revision:dm,name:o.z.string().trim().min(1).max(120),agentIds:o.z.array(Bl).min(1).max(50),edges:o.z.array(cm).max(am),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),mm=o.z.object({name:o.z.string().trim().min(1).max(120),agentIds:o.z.array(Bl).min(1).max(50),edges:o.z.array(cm).max(am).default([])}).strict(),pm=o.z.object({expectedRevision:dm,name:o.z.string().trim().min(1).max(120).optional(),agentIds:o.z.array(Bl).min(1).max(50).optional(),edges:o.z.array(cm).max(am).optional()}).strict();o.z.object({orchestrations:o.z.array(lm)}).strict();const um=o.z.object({id:rm,deleted:o.z.literal(!0)}).strict();o.z.object({orchestrations:o.z.array(o.z.object({nodeId:sm,orchestration:lm}).strict()),unavailableNodeIds:o.z.array(sm).default([])}).strict();const gm=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"]),hm=o.z.object({code:o.z.literal("AGENT_ORCHESTRATION_CYCLE"),cycle:o.z.array(Bl).min(2)}).strict(),zm=o.z.object({code:o.z.literal("AGENT_ORCHESTRATION_REVISION_CONFLICT"),expectedRevision:dm,actualRevision:dm}).strict();o.z.union([hm,zm,o.z.object({code:gm}).strict()]);const fm=o.z.object({orchestrationId:rm,change:o.z.enum(["created","updated","deleted"]),revision:dm.optional(),orchestration:lm.optional()}).strict();o.z.object({nodeId:sm,event:fm}).strict();const ym=lm.strip().extend({agentIds:o.z.array(Bl).max(50).default([]),edges:o.z.array(cm).max(am).default([])});o.z.object({orchestrations:o.z.array(ym)}).strip();const Im=o.z.object({orchestrations:o.z.array(o.z.object({nodeId:o.z.string().trim().min(1).max(160),orchestration:ym}).strip()),unavailableNodeIds:o.z.array(o.z.string().trim().min(1).max(160)).default([])}).strip(),bm=o.z.object({orchestrationId:rm,change:o.z.enum(["created","updated","deleted"]),revision:dm.optional(),orchestration:ym.optional()}).strip();function wm(e){return ym.parse(e)}o.z.object({nodeId:o.z.string().trim().min(1).max(160),event:bm}).strip();const vm=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),xm=vm,Am=vm,km=o.z.number().int().nonnegative(),Sm=o.z.enum(["queued","preparing","running","finalizing","completed","failed","cancelled"]),Cm=o.z.object({kind:o.z.enum(["control-plane-user","standalone-operator"]),subjectId:vm,authorizationRevision:o.z.number().int().nonnegative().optional()}).strict(),jm=o.z.object({source:o.z.literal("story-session").optional(),initiatingInstanceId:vm,initiatingAiSessionId:vm,storyId:vm,authorizationSubject:Cm.optional()}).strict(),Rm=o.z.object({source:o.z.literal("control-plane"),authorizationSubject:Cm.optional()}).strict(),Tm=o.z.union([jm,Rm]),$m=o.z.object({maxMembers:o.z.number().int().positive(),maxDepth:o.z.number().int().nonnegative(),maxConcurrency:o.z.number().int().positive()}).strict(),Em=o.z.object({prompt:o.z.string().trim().min(1).max(128e3)}).strict(),Pm=o.z.object({agentRevision:Fl,targetInstanceId:vm,cwdFolderId:vm,appendedPrompt:o.z.string().max(32e3),providerId:vm,modelEntityId:vm.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:Gl}).strict(),Om=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(),Nm=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:Om.optional()}).strict();o.z.object({runId:xm,status:o.z.enum(["completed","failed","cancelled"]),result:o.z.object({text:o.z.string().max(32e3),truncated:o.z.boolean()}).strict().optional(),error:Om.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 Um=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(),Lm=o.z.object({runtimeId:vm,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(),Dm=o.z.object({memberId:Am,runId:xm,agentId:Bl,parentMemberId:Am.optional(),instanceId:vm,aiSessionId:vm.optional(),role:o.z.enum(["root","callee"]),depth:o.z.number().int().nonnegative(),status:Sm,input:Em.optional(),executionSnapshot:Pm,result:Nm.optional(),error:Om.optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict(),qm=o.z.object({runId:xm,sequence:o.z.number().int().positive(),timestamp:o.z.string().datetime(),kind:o.z.string().trim().min(1).max(120),memberId:Am.optional(),data:o.z.record(o.z.string(),o.z.unknown()).default({})}).strict(),Mm=o.z.object({runId:xm,clientRequestId:vm,revision:km,status:Sm,input:Em.optional(),provenance:Tm,orchestrationId:rm,rootMemberId:Am,budget:$m,result:Nm.optional(),resultDelivery:_m.optional(),error:Om.optional(),cleanup:Um.optional(),sharedSpace:Lm.optional(),members:o.z.array(Dm).optional(),timeline:o.z.array(qm).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict(),Bm=o.z.object({clientRequestId:vm,orchestrationId:rm,entryAgentId:Bl.optional(),input:Em,provenance:Tm,budget:$m.optional()}).strict(),Fm=o.z.object({clientRequestId:vm,orchestrationId:rm,entryAgentId:Bl.optional(),input:Em,budget:$m.optional()}).strict(),Hm=o.z.object({expectedRevision:km.optional()}).strict();o.z.object({runs:o.z.array(Mm)}).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 Vm=o.z.object({runId:xm,revision:km,run:Mm}).strict(),Gm=o.z.object({runId:xm,memberId:Am,revision:km,member:Dm}).strict();o.z.object({runs:o.z.array(o.z.object({nodeId:vm,run:Mm}).strict()),unavailableNodeIds:o.z.array(vm).default([])}).strict(),o.z.object({nodeId:vm,event:o.z.union([Vm,Gm])}).strict();const Wm=Dm.strip().extend({input:Em.strip().optional(),executionSnapshot:Pm.strip(),result:Nm.strip().optional(),error:Om.strip().optional()}),Ym=qm.strip(),Km=Mm.strip().extend({orchestrationId:rm.optional(),input:Em.strip().optional(),provenance:o.z.union([jm.strip().extend({authorizationSubject:Cm.strip().optional()}),Rm.strip().extend({authorizationSubject:Cm.strip().optional()})]),budget:$m.strip(),result:Nm.strip().optional(),resultDelivery:_m.strip().extend({error:Om.strip().optional()}).optional(),error:Om.strip().optional(),cleanup:Um.strip().optional(),sharedSpace:Lm.strip().optional(),members:o.z.array(Wm).optional(),timeline:o.z.array(Ym).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:${Bl.parse(n)}`;var n})();return{...e,orchestrationId:t}}),Jm=o.z.object({runId:xm,revision:km,run:Km}).strip(),Zm=o.z.object({runId:xm,memberId:Am,revision:km,member:Wm}).strip();function Qm(e){return Km.parse(e)}o.z.object({nodeId:vm,event:o.z.union([Jm,Zm])}).strip();const Xm=["agent_run"],ep=o.z.enum(Xm),tp=o.z.object({agentId:Bl,orchestrationId:rm}).strict(),np=o.z.object({enabledTools:o.z.array(ep).max(Xm.length),allowedTargets:o.z.array(tp).max(50)}).strict(),ip=o.z.object({agentId:Bl,orchestrationId:rm.optional(),prompt:o.z.string().trim().min(1).max(128e3),budget:$m.optional()}).strict();o.z.object({clientRequestId:O,input:ip}).strict(),o.z.object({enabledTools:o.z.array(o.z.string()).max(100).optional(),allowedTargets:o.z.array(tp).max(50).optional()}).strip(),o.z.enum(["content","actions","automations","aiSessions","decisions"]);const op=o.z.object({content:o.z.boolean(),actions:o.z.boolean(),automations:o.z.boolean(),aiSessions:o.z.boolean(),decisions:o.z.boolean()}).strict();op.strip().partial();const ap=["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"],sp=o.z.enum(ap),rp=o.z.object({policy:op,revision:o.z.string().regex(/^[a-f0-9]{64}$/)}).strict(),dp=o.z.object({policy:op}).strict();rp.extend({storyId:_,enabledTools:o.z.array(sp).max(ap.length),agentInvocation:np}).strict(),o.z.object({storyId:_,revision:rp.shape.revision}).strict();const cp=o.z.object({policy:op.extend({decisions:o.z.boolean().default(!1)}).strip(),revision:rp.shape.revision}).strip();function lp(e){return rp.parse(cp.parse(e))}cp.extend({storyId:_,enabledTools:o.z.array(o.z.string()).max(100),agentInvocation:o.z.unknown().optional()}).strip();const mp=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(),pp=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:Gn.shape.title,storyPath:Hn}).strict()).max(100),pagination:pp}).strict(),o.z.object({items:o.z.array(o.z.object({storyPath:Hn,path:o.z.string().trim().min(1).max(4096).optional(),revision:Vn.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:Gn.shape.title,storyPath:Hn,revision:Vn,size:o.z.number().int().nonnegative()}).strict();const up=o.z.enum(["STORY_ARCHIVED","STORY_ACTION_TARGET_REQUIRED","STORY_ACTION_TARGET_UNAVAILABLE"]);o.z.object({actions:o.z.array(o.z.object({id:Yn.shape.id,title:Yn.shape.title,promptPreview:o.z.string().max(500),promptTruncated:o.z.boolean(),executable:o.z.boolean(),unavailableReason:up.optional()}).strict()).max(100),pagination:pp}).strict();const gp=o.z.object({actionId:Yn.shape.id,clientRequestId:O}).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:Yn.shape.id,schedule:Qn,enabled:o.z.boolean().default(!0),policy:Xn.default({maxConcurrentRuns:1,whenBusy:"skip"})}).strict(),o.z.object({automationId:o.z.string().trim().min(1).max(120),expectedUpdatedAt:o.z.string().datetime(),actionId:Yn.shape.id.optional(),schedule:Qn.optional(),enabled:o.z.boolean().optional(),policy:Xn.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}).strict(),o.z.object({automationId:o.z.string().trim().min(1).max(120),page:mp.shape.page,pageSize:mp.shape.pageSize}).strict(),o.z.object({deleted:o.z.boolean()}).strict();const hp=o.z.object({id:o.z.string().trim().min(1).max(160),eventType:o.z.enum(["manual","schedule"]),status:ai,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:oi.optional(),startedAt:o.z.string().datetime().optional(),completedAt:o.z.string().datetime().optional()}).strict(),zp=o.z.object({id:o.z.string().trim().min(1).max(120),actionId:Yn.shape.id,schedule:Qn,enabled:o.z.boolean(),policy:Xn,updatedAt:o.z.string().datetime(),effectiveStatus:ri,blockedReason:oi.optional(),nextRunAt:o.z.string().datetime().optional(),activeRunCount:o.z.number().int().nonnegative(),lastRun:hp.optional()}).strict();o.z.object({automations:o.z.array(zp).max(100),pagination:pp}).strict(),o.z.object({runs:o.z.array(hp).max(100),pagination:pp}).strict();const fp=o.z.object({instanceId:o.z.string().trim().min(1).max(120),sessionId:o.z.string().trim().min(1).max(120)}).strict(),yp=fp.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(yp).max(100),pagination:pp}).strict(),fp.extend({page:mp.shape.page,pageSize:o.z.number().int().min(1).max(50).default(10)}).strict(),o.z.object({detail:bt,turnIndex:vt}).strict();const Ip=o.z.object({cwd:bt.shape.cwd,modelName:o.z.string().trim().min(1).max(240).optional(),reasoningEffort:bt.shape.reasoningEffort,error:bt.shape.error}).strict(),bp=yt.pick({id:!0,status:!0,phase:!0,updatedAt:!0,completedAt:!0}).strict(),wp=yt.pick({id:!0,status:!0,phase:!0,contextCompactions:!0,startedAt:!0,updatedAt:!0,completedAt:!0}).strict();o.z.object({ref:fp,session:Ip,turns:o.z.array(bp).max(50),pagination:pp}).strict(),fp.extend({turnId:o.z.string().trim().min(1).max(240),page:mp.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 vp=o.z.array(o.z.enum(["text","summary","input","output","paths"])).max(5).optional(),xp=o.z.object({id:o.z.string().trim().min(1).max(240),truncatedFields:vp}).strict(),Ap=xp.extend({type:o.z.literal("user-message"),text:o.z.string().max(32e3),attachments:o.z.array(K).max(6).optional()}).strict(),kp=xp.extend({type:o.z.literal("ai-message"),text:o.z.string().max(32e3)}).strict(),Sp=xp.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(),Cp=o.z.discriminatedUnion("type",[Ap,kp,Sp]);function jp(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:bi.shape.stories,unavailableNodeIds:o.z.array(o.z.string()).default([])}).strict(),{signal:n}),get:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,Ii),preview:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/content/preview?nodeId=${encodeURIComponent(n)}&storyPath=${encodeURIComponent(i)}`,Ri,{signal:o}),create:(e,n)=>t("/api/stories",Ii,$i("POST",{nodeId:e,input:wi.parse(n)})),update:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}`,Ii,$i("PATCH",{nodeId:n,input:vi.parse(i)})),retentionSettings:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/settings?nodeId=${encodeURIComponent(n)}`,Fn),async agentToolSettings(e,n){const i=await t(`/api/stories/${encodeURIComponent(e)}/settings/agent-tools?nodeId=${encodeURIComponent(n)}`,o.z.unknown());return rp.parse(lp(i))},async updateAgentToolSettings(e,n,i){const a=dp.parse({policy:i}),s=await t(`/api/stories/${encodeURIComponent(e)}/settings/agent-tools`,o.z.unknown(),$i("PUT",{nodeId:n,input:a}));return rp.parse(lp(s))},listDecisions:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/decisions?nodeId=${encodeURIComponent(n)}`,yi,{signal:i}),getDecision:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/decisions/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,hi,{signal:o}),decideStory:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/decisions/${encodeURIComponent(n)}/decide`,hi,$i("POST",{nodeId:i,input:zi.parse(o)})),cancelDecision:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/decisions/${encodeURIComponent(n)}/cancel`,hi,$i("POST",{nodeId:i,input:fi.parse(o)})),runAction(e,n,i,o){const a=gp.omit({actionId:!0}).parse({clientRequestId:o});return t(`/api/stories/${encodeURIComponent(e)}/actions/${encodeURIComponent(n)}/run`,Zn,$i("POST",{nodeId:i,input:a}))},archive:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/archive`,Ii,$i("POST",{nodeId:n})),restore:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/restore`,Ii,$i("POST",{nodeId:n})),remove:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.object({deleted:o.z.boolean()}).strict(),$i("DELETE")),listAutomations:(e,n)=>t(`/api/stories/${encodeURIComponent(e)}/automations?nodeId=${encodeURIComponent(n)}`,ci),getAutomation:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}?nodeId=${encodeURIComponent(i)}`,di),createAutomation:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations`,di,$i("POST",{nodeId:n,input:ti.parse(i)})),createAutomationWithAction:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/with-action`,di,$i("POST",{nodeId:n,input:ni.parse(i)})),updateAutomation:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}`,di,$i("PATCH",{nodeId:i,input:ii.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(),$i("DELETE")),setAutomationEnabled:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/${o?"enable":"disable"}`,di,$i("POST",{nodeId:i})),runAutomation:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/run`,si,$i("POST",{nodeId:i,input:mi.parse(o)})),automationRuns:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/automations/${encodeURIComponent(n)}/runs?nodeId=${encodeURIComponent(i)}`,li),updateDocument:(e,n,i,o)=>t(`/api/stories/${encodeURIComponent(e)}/documents/${encodeURIComponent(i)}`,Ii,$i("PATCH",{nodeId:n,input:xi.parse(o)})),removeDocument:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/documents/${encodeURIComponent(i)}`,o.z.object({deleted:o.z.boolean()}).strict(),$i("DELETE",{nodeId:n})),reorderDocuments:(e,n,i)=>t(`/api/stories/${encodeURIComponent(e)}/documents/order`,Ii,$i("POST",{nodeId:n,input:Ai.parse(i)})),setSessionStory:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/story`,o.z.unknown(),$i("PUT",{storyId:i}))}}o.z.object({ref:fp,turn:wp,items:o.z.array(Cp).max(50),pagination:pp}).strict(),o.z.object({body:xt,timeline:re}).strict(),o.z.object({detail:bt.strip(),turnIndex:vt.strip()}).strip(),o.z.object({body:xt.strip(),timeline:re.strip()}).strip(),o.z.object({decisionId:o.z.string().trim().min(1).max(160),status:pi}).strict();const Rp=o.z.object({agentId:Bl,orchestrationId:rm,status:o.z.enum(["available","missing-reference"])}).strict(),Tp=o.z.object({storyId:_,revision:Fl,entries:o.z.array(Rp)}).strict(),$p=o.z.object({expectedRevision:Fl,entries:o.z.array(o.z.object({agentId:Bl,orchestrationId:rm.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 Ep=Rp.strip(),Pp=Tp.strip().extend({entries:o.z.array(Ep)});function Op(e){return Pp.parse(e)}function Np(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}),nm.parse(i);var i},get:async(e,n,i)=>om(await t(`/api/agents/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),create:async(e,n)=>om(await t("/api/agents",o.z.unknown(),$i("POST",{nodeId:e,input:Kl.parse(n)}))),update:async(e,n,i)=>om(await t(`/api/agents/${encodeURIComponent(e)}`,o.z.unknown(),$i("PATCH",{nodeId:n,input:Jl.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}),Im.parse(i);var i},getOrchestration:async(e,n,i)=>wm(await t(`/api/agent-orchestrations/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),createOrchestration:async(e,n)=>wm(await t("/api/agent-orchestrations",o.z.unknown(),$i("POST",{nodeId:e,input:mm.parse(n)}))),updateOrchestration:async(e,n,i)=>wm(await t(`/api/agent-orchestrations/${encodeURIComponent(e)}`,o.z.unknown(),$i("PATCH",{nodeId:n,input:pm.parse(i)}))),removeOrchestration:(e,n)=>t(`/api/agent-orchestrations/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,um,{method:"DELETE"}),storyEntries:async(e,n,i)=>Op(await t(`/api/stories/${encodeURIComponent(e)}/agent-entries?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),updateStoryEntries:async(e,n,i)=>Op(await t(`/api/stories/${encodeURIComponent(e)}/agent-entries`,o.z.unknown(),$i("PUT",{nodeId:n,input:$p.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:Qm(t)}))}},getRun:async(e,n,i)=>Qm(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}),Wm.parse(s);var s},createRun:async(e,n)=>Qm(await t("/api/agent-runs",o.z.unknown(),$i("POST",{nodeId:e,input:Bm.parse(n)}))),createManualRun:async(e,n)=>Qm(await t("/api/agent-runs/manual",o.z.unknown(),$i("POST",{nodeId:e,input:Fm.parse(n)}))),cancelRun:async(e,n,i={})=>Qm(await t(`/api/agent-runs/${encodeURIComponent(e)}/cancel`,o.z.unknown(),$i("POST",{nodeId:n,input:Hm.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 Up(e,t){const n=`/api/controlled-instances/${encodeURIComponent(e.instanceId)}/repository/${t}`;return e.cwdFolderId?`${n}?${new URLSearchParams({cwdFolderId:e.cwdFolderId})}`:n}function Lp(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(Up(e,"worktrees"),un,{signal:i?.signal})}catch(o){return n(e,e=>t(`${_p(e)}/worktrees`,un,{signal:i?.signal}))(o)}},async createWorktree(e,i,o){const a=$n.parse(i);try{return await t(Up(e,"worktrees"),Pn,$i("POST",a,o?.signal))}catch(i){return n(e,e=>t(`${_p(e)}/worktrees`,Pn,$i("POST",a,o?.signal)))(i)}},async removeWorktree(e,i,o){const a=En.parse(i);try{return await t(Up(e,"worktrees/remove"),On,$i("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`,On,$i("POST",a,o?.signal))})(i)}},async moveWorktreeToMainPreflight(e,n,i){const o=_n.parse(n);return await t(Up(e,"worktrees/move-to-main/preflight"),Un,$i("POST",o,i?.signal))},async moveWorktreeToMain(e,n,i){const o=Ln.parse(n);return t(Up(e,"worktrees/move-to-main"),Dn,$i("POST",o,i?.signal))},async branches(e,i){try{return await t(Up(e,"branches"),Cn,{signal:i?.signal})}catch(o){return n(e,e=>t(`${_p(e)}/branches`,Cn,{signal:i?.signal}))(o)}}}}const Dp=o.z.object({deleted:o.z.boolean()}).strict(),qp=o.z.array(xd),Mp=o.z.array(Gd),Bp=o.z.array(Yd),Fp=o.z.object({id:o.z.string().trim().min(1),ownedBy:o.z.string().optional()}).passthrough(),Hp=o.z.object({models:o.z.array(Fp),latencyMs:o.z.number()}).passthrough(),Vp=o.z.object({success:o.z.literal(!0),latencyMs:o.z.number()}).passthrough(),Gp=o.z.object({catalog:Hd,status:Vd}).strict(),Wp=kd.extend({referenceCount:o.z.number().int().min(0).optional()}).passthrough();function Yp(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",qp,{signal:e}),getProject:(e,n)=>t(`/api/projects/${encodeURIComponent(e)}`,xd,{signal:n}),createProject:e=>t("/api/projects",xd,$i("POST",e)),updateProject:(e,n)=>t(`/api/projects/${encodeURIComponent(e)}`,xd,$i("PATCH",n)),removeProject:e=>t(`/api/projects/${encodeURIComponent(e)}`,Dp,$i("DELETE")),listModels(e={}){const n=e.progressive?"?progressive=true":"";return t(`/api/models${n}`,Rd,{signal:e.signal})},getModel:(e,i)=>t(n(e),kd,{signal:i}),createModel:e=>t("/api/models",kd,$i("POST",e)),copyModel:(e,i)=>t(`${n(e)}/copy`,kd,$i("POST",i)),discoverModels:e=>t("/api/models/discover",Hp,$i("POST",e)),testModel:e=>t("/api/models/test",Vp,$i("POST",e)),reorderModels:e=>t("/api/models/reorder",o.z.array(kd),$i("POST",{ids:[...e]})),updateModel:(e,i)=>t(n(e),Ed,$i("PATCH",i)),syncModel:e=>t(`${n(e)}/sync`,Ed,$i("POST",{})),mergeModel:(e,i)=>t(`${n(e)}/merge`,Od,$i("POST",i)),removeModel:e=>t(n(e),Dp,$i("DELETE")),createModelOnNode:(e,n)=>t(i(e),Wp,$i("POST",n)),discoverModelsOnNode:(e,n)=>t(`${i(e)}/discover`,Hp,$i("POST",n)),testModelOnNode:(e,n)=>t(`${i(e)}/test`,Vp,$i("POST",n)),updateModelOnNode:(e,n,o)=>t(i(e,n),Wp,$i("PATCH",o)),removeModelOnNode:(e,n)=>t(i(e,n),Dp,$i("DELETE")),marketCatalog:e=>t("/api/market/catalog",Gp,{signal:e}),refreshMarketCatalog:()=>t("/api/market/refresh",Gp,$i("POST",{})),imageOptions:e=>t("/api/image-options",Bp,{signal:e}),listImages:e=>t("/api/images",Mp,{signal:e}),getImage:(e,n)=>t(`/api/images/${encodeURIComponent(e)}`,Gd,{signal:n}),createImage:e=>t("/api/images",Gd,$i("POST",e)),updateImage:(e,n)=>t(`/api/images/${encodeURIComponent(e)}`,Gd,$i("PATCH",n)),removeImage:e=>t(`/api/images/${encodeURIComponent(e)}`,Dp,$i("DELETE"))}}const Kp=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(),Jp=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(),Zp=o.z.object({data:o.z.array(sc),meta:o.z.object({nodeErrors:o.z.array(gl).default([]),nodeStates:o.z.array(hl).default([])}).passthrough().optional()}).passthrough(),Qp=o.z.object({id:o.z.string().trim().min(1),joinToken:o.z.string().trim().min(1),expiresAt:o.z.string()}).strict(),Xp=ac.transform(e=>{const{secret:t,...n}=e.auth;return{...e,auth:n}});function eu(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",Xp,$i("POST",e)),updateNode:(e,i)=>t(n(e),Xp,$i("PATCH",i)),removeNode(e,i={}){const o=i.force?"?force=true":"";return t(`${n(e)}${o}`,Jp,$i("DELETE"))},checkNode:e=>t(`${n(e)}/check`,Kp,$i("POST",{})),syncLocalNode:()=>t("/api/nodes/local/sync",Xp,$i("POST",{})),listFolders:(e,n)=>t(a(e),o.z.array(gd),{signal:n}),listFolderPlaces:(e,i)=>t(`${n(e)}/folders/places`,o.z.array(vc),{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(wc),{signal:a})},createFolder:(e,n)=>t(a(e),gd,$i("POST",n)),updateFolder:(e,n,i)=>t(a(e,n),gd,$i("PATCH",i)),removeFolder:(e,n)=>t(a(e,n),yc,$i("DELETE")),listAllRuntimes(t={}){const n=t.progressive?"?progressive=true":"";return e.request(`/api/node-runtimes${n}`,Zp,{signal:t.signal})},listRuntimes:(e,n)=>t(i(e),o.z.array(sc),{signal:n}),createRuntime:(e,n)=>t(i(e),sc,$i("POST",n)),updateRuntime:(e,n,o)=>t(i(e,n),sc,$i("PATCH",o)),removeRuntime:(e,n)=>t(i(e,n),yc,$i("DELETE")),checkRuntime:(e,n)=>t(`${i(e,n)}/check`,sc,$i("POST",{})),listDockerImages:(e,i)=>t(`${n(e)}/docker/images`,o.z.array(Ic),{signal:i}),imageOptions:(e,i)=>t(`${n(e)}/image-options`,o.z.array(bc),{signal:i}),getExternalListener:(e,i)=>t(`${n(e)}/settings/external-listener`,cc,{signal:i}),updateExternalListener(e,i){const o=lc.parse(i);return t(`${n(e)}/settings/external-listener`,cc,$i("PATCH",o))},getModelRelay:(e,i)=>t(`${n(e)}/settings/model-relay`,pc,{signal:i}),updateModelRelay(e,i){const o=uc.parse(i);return t(`${n(e)}/settings/model-relay`,pc,$i("PATCH",o))},updateJobs:(e,i)=>t(`${n(e)}/updates/jobs`,o.z.array(rd),{signal:i}),checkUpdate(e,i={}){const o=ad.parse(i);return t(`${n(e)}/updates/check`,sd,$i("POST",o))},applyUpdate(e,i){const o=dd.parse(i);return t(`${n(e)}/updates/apply`,rd,$i("POST",o))},createPairingInvite:(e,i={})=>t(`${n(e)}/pairing/invites`,gc,$i("POST",i)),listControlPlanePairings:(e,i)=>t(`${n(e)}/control-plane-pairings`,o.z.array(hc),{signal:i}),removeControlPlanePairing:(e,i)=>t(`${n(e)}/control-plane-pairings/${encodeURIComponent(i)}`,yc,$i("DELETE")),listControlPlaneConnections:(e,i)=>t(`${n(e)}/control-plane-connections`,o.z.array(zc),{signal:i}),createControlPlaneConnection:(e,i)=>t(`${n(e)}/control-plane-connections`,fc,$i("POST",i)),removeControlPlaneConnection:(e,i)=>t(`${n(e)}/control-plane-connections/${encodeURIComponent(i)}`,yc,$i("DELETE")),createJoinInvite:(e={})=>t("/api/node-join/invites",Qp,$i("POST",e)),joinInviteStatus:(e,n)=>t(`/api/node-join/invites/${encodeURIComponent(e)}`,ic,{signal:n}),completeJoin:e=>t("/api/node-join/complete",Xp,$i("POST",e))}}const tu=o.z.object({deleted:o.z.boolean()}).strict(),nu=o.z.object({revoked:o.z.boolean()}).strict(),iu=o.z.object({credentialId:o.z.string().trim().min(1).max(120)}).strict();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/git-credentials/${encodeURIComponent(e)}`,i=e=>`/api/controlled-instances/${encodeURIComponent(e)}/git-credential-assignments`;return{listCredentials:e=>t("/api/git-credentials",Cs,{signal:e}),getCredential:(e,i)=>t(n(e),xs,{signal:i}),createCredential:e=>t("/api/git-credentials",xs,$i("POST",e)),updateCredential:(e,i)=>t(n(e),xs,$i("PATCH",i)),removeCredential:e=>t(n(e),tu,$i("DELETE")),listInstanceAssignments:(e,n)=>t(i(e),o.z.array(js),{signal:n}),assignToInstance(e,n){const o=iu.parse(n);return t(i(e),js,$i("POST",o))},unassignFromInstance:(e,n)=>t(`${i(e)}/${encodeURIComponent(n)}`,nu,$i("DELETE"))}}const au=o.z.object({deleted:o.z.boolean(),templateId:o.z.string().trim().min(1).max(120)}).strict();function su(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(Nr),{signal:i}),get:(e,i,o)=>t(`${n(e)}/${encodeURIComponent(i)}`,Nr,{signal:o}),createFromInstance:(e,n)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/environment-templates`,Nr,$i("POST",n)),remove:(e,i)=>t(`${n(e)}/${encodeURIComponent(i)}`,au,$i("DELETE"))}}const ru=Dc.omit({token:!0}).extend({tokenSet:o.z.boolean().optional()}).strip(),du=o.z.object({running:o.z.boolean(),bridges:o.z.array(o.z.object({id:o.z.string(),channel:Lc,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 cu(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",du,{signal:e}),listBridges:e=>t("/api/chat-gateway/bridges",o.z.array(ru),{signal:e}),createBridge:e=>t("/api/chat-gateway/bridges",ru,$i("POST",e)),updateBridge:(e,i)=>t(n(e),ru,$i("PATCH",i)),startBridge:e=>t(`${n(e)}/start`,du,$i("POST",{})),stopBridge:e=>t(`${n(e)}/stop`,du,$i("POST",{})),removeBridge:e=>t(n(e),o.z.object({deleted:o.z.boolean()}).strict(),$i("DELETE")),listSessions:e=>t("/api/chat/sessions",o.z.array(qc),{signal:e}),getSession:(e,n)=>t(`/api/chat/sessions/${encodeURIComponent(e)}`,qc,{signal:n})}}const lu=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(),mu=o.z.object({controlPlaneId:o.z.string(),algorithm:o.z.literal("Ed25519"),publicKey:o.z.string(),fingerprint:o.z.string()}).strict(),pu=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:mu,hasBackgroundCredential:o.z.boolean(),remoteResult:o.z.enum(["confirmed","unknown"]).optional()}).strict(),uu=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(),gu=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(),hu=o.z.record(o.z.string(),o.z.unknown());function zu(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",lu,{signal:e}),getSettings:e=>t("/api/control-plane/settings",Fc,{signal:e}),updateSettings(e){const n=Hc.parse(e);return t("/api/control-plane/settings",Fc,$i("PATCH",n))},async exportDiagnosticLogs(){if(!e.requestBinary)throw Ei();return e.requestBinary("/api/control-plane/diagnostic-logs/export")},cloudConnectivity:e=>t("/api/cloud-connectivity",pu,{signal:e}),createCloudChallenge:()=>t("/api/cloud-connectivity/challenges",uu,$i("POST",{})),setCloudRemoteAccess:e=>t("/api/cloud-connectivity/remote-access",pu,$i("POST",{enabled:e})),disconnectCloud:()=>t("/api/cloud-connectivity/disconnect",pu,$i("POST",{})),proxyInvites:e=>t("/api/control-plane-proxy/invites",o.z.array(es),{signal:e}),createProxyInvite(e){const n=ts.parse(e);return t("/api/control-plane-proxy/invites",ns,$i("POST",n))},revokeProxyInvite:e=>t((e=>`/api/control-plane-proxy/invites/${encodeURIComponent(e)}`)(e),es,$i("DELETE")),proxyBindings:e=>t("/api/control-plane-proxy/bindings",o.z.array(os),{signal:e}),revokeProxyBinding:e=>t((e=>`/api/control-plane-proxy/bindings/${encodeURIComponent(e)}`)(e),os,$i("DELETE")),proxyDiagnostics:e=>t("/api/control-plane-proxy/diagnostics",o.z.array(gu),{signal:e}),pendingProxyClaims:e=>t("/api/control-plane-proxy/pending-claims",o.z.array(ls),{signal:e}),resumeProxyClaim:e=>t(`${n(e)}/resume`,hu,$i("POST",{})),cancelProxyClaim(e,i={}){const o=i.force?"?force=true":"";return t(`${n(e)}${o}`,hu,$i("DELETE"))}}}const fu=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"]),yu=o.z.object({field:o.z.string(),value:o.z.string()}),Iu=o.z.object({id:o.z.string(),operation:fu,targetId:o.z.string(),details:o.z.array(yu).optional(),createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime()}),bu=o.z.object({id:o.z.string(),status:o.z.enum(["pending","approved","denied"]),expiresAt:o.z.string().datetime()}),wu=bu.extend({kind:o.z.literal("operation-approval")}),vu=o.z.object({revision:o.z.number().int(),requests:o.z.array(Iu)});o.z.object({request:Iu,status:o.z.enum(["pending","approved","denied","expired","consumed","cancelled"]),revision:o.z.number().int()});const xu=e=>o.z.object({data:e}).passthrough(),Au=o.z.object({supported:o.z.literal(!0)});function ku(e){return{support:async()=>(await e.request("/api/operation-approvals/support",xu(Au))).data,status:async t=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}/status`,xu(bu))).data,cancel:async t=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}`,xu(o.z.object({cancelled:o.z.boolean()})),{method:"DELETE"})).data,snapshot:async()=>(await e.request("/api/operation-approvals",xu(vu))).data,decide:async(t,n)=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}/decision`,xu(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)}`,xu($r),{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify(Rr.parse(n))})).data,removeNode:async(t,n)=>(await e.request(`/api/nodes/${encodeURIComponent(t)}${n?"?force=true":""}`,xu(Jp),{method:"DELETE"})).data}}function Su(e){const t={request:(t,n,i,a)=>e.request(t,function(e){return o.z.unknown().transform((t,n)=>{const i=po(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:ku(t),auth:Ca(t),users:Ra(t),aiSessions:Li(t),appSessions:io(t),appProfiles:co(t),apps:il(t),browser:mo(t),resources:Pl(t),triggers:Ll(t),stories:jp(t),agents:Np(t),repository:Lp(t),catalog:Yp(t),nodeAdmin:eu(t),gitCredentials:ou(t),environmentTemplates:su(t),chatGateway:cu(t),admin:zu(t)}}const Cu=o.z.object({nodeId:o.z.string().optional(),instanceId:o.z.string().optional()}).passthrough(),ju=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:Cu.optional()}).passthrough(),Ru=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:Cu.optional()}).passthrough(),Tu=o.z.discriminatedUnion("v",[ju,Ru]);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 $u=o.z.enum(["ai.sessions","app.sessions"]),Eu=o.z.object({topic:$u,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(),Pu=o.z.object({protocolVersion:o.z.literal(1),streams:o.z.array(Eu)}).strict();function Ou(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 Nu(e){if(e)try{return i.dirname(t.realpathSync(e))}catch{return}}function _u(){return function(e,t=process.env,n=e){const o={...t};return delete o.TASK_HANDOFF_VERSION,function(e,t=process.env,n=e){let o;return()=>{const a=t.TASK_HANDOFF_VERSION?.trim();return a||(o||=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=[Nu(s),r,process.cwd()].filter(e=>Boolean(e));for(const t of new Set(d)){let n=t;for(;;){const t=Ou(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=Ou(i.join(t,"packages",a,"package.json"),n);if(e)return e}c||=Ou(i.join(t,"package.json"));const e=i.dirname(t);if(e===t)break;t=e}}return c||"unknown"}(e,t,n),o)}}(e,o,n)}("@task-handoff/thctl")()}const Uu=_u();function Lu(){const e="darwin"===process.platform||"linux"===process.platform||"win32"===process.platform?process.platform:"linux";return{name:n.hostname()||"thctl",platform:e,version:Uu}}async function Du(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 qu(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 Mu=Buffer.from("302a300506032b6570032100","hex"),Bu=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 Fu(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 Hu(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([Mu,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(Wo.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 Vu(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(Fu(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=Bu.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:wu}).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 qu(a,e.approvalWait,async()=>(await t.request(`${r}/status`,o.z.object({data:bu}))).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(Fu(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=Bu.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 Gu(e,t){const n=Su(Vu({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:Hu(i),origin:e}}function Wu(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 Yu(e){const{profile:t,identity:n,fetchImpl:i,secrets:o}=e;if(!Go(n.payload.capabilities))return;if(!Wu(t.origin))return;const a=Su(Vu({origin:t.origin,fetchImpl:i})),s=await a.auth.cliLocalSession({client:Lu()}),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 Ku(e){const{store:t,profile:n,fetchImpl:i}=e,o=await Gu(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===Ho(e)?.cliSessions}(n)||Go(n)&&Wu(e.origin))){if(Go(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 Yu({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=Vu({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 Yu({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=Su(c);if("local-trust"===s?.mode&&!r){const e=await m.auth.session();e.authenticated&&e.user||await Yu({profile:n,identity:o,fetchImpl:i,secrets:a})}return{profile:l,identity:o,client:m,store:t}}var Ju,Zu,Qu=function(){if(Zu)return Ju;Zu=1;const e=t,{spawnSync:n}=r;return Ju={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 Xu(e){return Number.isInteger(e)&&Number(e)>0}const eg="local";function tg(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 ng=new Set(["127.0.0.1","localhost","::1","[::1]"]),ig=new Set(["0.0.0.0","::","[::]"]);async function og(e){const o=tg(e.env),a=function(e){try{const o=JSON.parse(t.readFileSync(function(e){return i.join(e,"owner.json")}(e),"utf8"));if(Xu(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(!(Xu(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(!Xu(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=Qu.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||!ng.has(n)&&!ig.has(n))return;const i=n.startsWith("[")&&n.endsWith("]")?n.slice(1,-1):n;return`http://${ng.has(n)?i.includes(":")?`[${i}]`:i:"127.0.0.1"}:${t}`}(a);if(s)try{return{origin:s,identity:await Gu(s,e.fetchImpl),lockPath:o,...a.dataDir?{dataDir:a.dataDir}:{}}}catch{return}}function ag(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(eg))return eg;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 sg=/(token|secret|password|passwd|credential|credentials|apikey|privatekey)$/i,rg=new Set(["key","token","secret","password","credentials","credential"]);function dg(e){return rg.has(e.toLowerCase())||sg.test(e)}const cg=new Set;function lg(e){if("string"!=typeof e)return;const t=e.trim();t.length>=4&&cg.add(t)}function mg(e){let t=e;for(const e of cg)t=t.split(e).join("***");return t}function pg(e){return ug(e)}function ug(e){if("string"==typeof e)return mg(e);if(Array.isArray(e))return e.map(ug);if(!e||"object"!=typeof e)return e;const t={};for(const[n,i]of Object.entries(e))t[n]=dg(n)?"***":ug(i);return t}function gg(e){if(Array.isArray(e))for(const t of e)gg(t);else if(e&&"object"==typeof e)for(const[t,n]of Object.entries(e))dg(t)?lg(n):gg(n)}async function hg(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 zg(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 og({env:e.env,fetchImpl:e.fetchImpl});if(i)return ag(e.store,i);throw new h("CLI_PROFILE_MISSING",`No Control Plane profile configured and no local Control Plane was detected (lock: ${tg(e.env)}). Start the desktop Control Plane or run \`thctl profile add <origin>\`.`,7)}async function fg(e,t={}){let n,i=t.profile??await zg(e);try{n=await yg(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 og({env:e.env,fetchImpl:e.fetchImpl});return i&&i.origin!==t.origin?ag(e.store,i):void 0}(e,i,o);if(!a)throw o;i=a,n=await yg(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>Ig)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 yg(e,t,n){return Ku({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 Ig=6048e5;async function bg(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 wg(e,t,n,i){const o=n(),a=o.steps??[o];if(!e.dryRun){for(const e of a)gg(e.body);return await bg(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:pg(o.body)}}:{dryRun:!0,steps:a.map(e=>({method:e.method,path:e.path,...void 0===e.body?{}:{body:pg(e.body)}}))})}function vg(e){if(e.aborted)throw new h("CLI_CANCELLED","The operation was cancelled.",g)}function xg(e,t){const n=e.args[t]?.trim();if(!n)throw z("CLI_ARGUMENT_MISSING",`Missing required argument <${t}>.`,{argument:t});return n}function Ag(e,t){const n=e.options[t];if("string"==typeof n)return n.trim()||void 0}function kg(e,t){const n=Ag(e,t);if(!n)throw z("CLI_OPTION_MISSING",`Missing required option --${t}.`,{option:t});return n}function Sg(e,t){const n=e.options[t];return Array.isArray(n)?n.filter(e=>"string"==typeof e).map(e=>e.trim()).filter(Boolean):[]}function Cg(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 jg(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 Cg(n,a,`${i} \`${e}\``)}function Rg(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 Tg(e,t="request body"){const n=kg(e,"config"),i=jg(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 $g(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 lg(i),i}const Eg=[{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"}],Pg=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(t)}`,Og=e=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace`,Ng=[{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 Ug=[{key:"type",header:"type"},{key:"turn",header:"turn",width:40},{key:"title",header:"title",width:24},{key:"detail",header:"detail",width:60}],Lg=[{key:"kind",header:"kind"},{key:"name",header:"name",width:30},{key:"path",header:"path",width:50}],Dg={".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 qg(e,t){return async(n,i)=>{const o=xg(i,"instanceId"),a=xg(i,"sessionId"),s=xg(i,"queueId"),r=await fg(n),d=await wg(n,e,()=>"remove"===t?{method:"DELETE",path:`${Pg(o,a)}/queue/${encodeURIComponent(s)}`}:{method:"POST",path:`${Pg(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 Mg=qg("ai-session queue steer","steer"),Bg=qg("ai-session queue retry","retry"),Fg=qg("ai-session queue remove","remove");async function Hg(e,t,n,i,o){const a=Ag(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=Rg(await t.client.aiSessions.detail(n,i,void 0,e.signal),i);return s.queue?.revision??0}function Vg(e){const t=ve.safeParse(e);if(!t.success)throw new h("CLI_INVALID_OPTION",`--permission-mode must be one of: ${ve.options.join(", ")}.`,2,{option:"permission-mode",value:e});return t.data}function Gg(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 Cg(Re,n,`--reference ${e}`)}function Wg(e,t="effort"){const n=Me.safeParse(e);if(!n.success)throw new h("CLI_INVALID_OPTION",`--${t} must be one of: ${Me.options.join(", ")}.`,2,{option:t,value:e});return n.data}const Yg=[{key:"storyPath",header:"path",width:48},{key:"title",header:"title",width:32}],Kg=[{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"}],Jg=o.z.string().trim().min(1).max(120),Zg=[{key:"mode",header:"mode"},{key:"url",header:"url"},{key:"expiresAt",header:"expires"},{key:"token",header:"token"}],Qg=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(t)}`,Xg=[{key:"path",header:"path",width:50},{key:"size",header:"size"},{key:"contentType",header:"content type"}],eh=o.z.string().trim().min(1).max(60),th=[{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 nh(e){return{instanceId:xg(e,"instanceId"),appId:xg(e,"appId")}}function ih(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 oh{retryNumber=0;random;constructor(e=Math.random){this.random=e}get attempts(){return this.retryNumber}next(){return this.retryNumber+=1,{attempt:this.retryNumber,delay:ih(this.retryNumber,this.random)}}reset(){this.retryNumber=0}}const ah=({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{}}}},sh={"ai-sessions":"ai.sessions","app-sessions":"app.sessions"};function rh(e,t){const n=new URL(Fu(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 dh(e){return`${e.code}${e.reason?`: ${e.reason}`:""}`}async function ch(e,t){if(e.signal.aborted)return;const n=e.createEventSocket??ah,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 oh;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 Pu.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 ${dh(e)}).`}):f(o,{error:b(`The Control Plane closed the event stream before the session-stream handshake (code ${dh(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 lh(e){const t=e.args.instanceId?.trim();if(!t)throw new h("CLI_ARGUMENT_MISSING","Missing required argument <instanceId>.",2);return t}const mh=[{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 ph(e){return async(t,n)=>{const i=lh(n),o=await fg(t),a=await wg(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 uh=ph("start"),gh=ph("stop"),hh=ph("restart"),zh=[{key:"id",header:"instance"},{key:"name",header:"name",width:24},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"startOutcome.status",header:"start"}],fh=[{key:"instanceId",header:"instance"},{key:"containerDeleted",header:"container"},{key:"completed",header:"completed"}],yh=[{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"}],Ih=[{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"}],bh=[{key:"id",header:"job"},{key:"appId",header:"app"},{key:"operation",header:"operation"},{key:"state",header:"state"},{key:"phase",header:"phase"},{key:"updatedAt",header:"updated"}],wh=new Set(["succeeded","failed","cancelled","interrupted"]);async function vh(e,t,n,i){let o=i;const a=Date.now()+18e5;for(;!wh.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),vg(e.signal),o=(await t.client.apps.job(n,o.id,e.signal)).job}return o}function xh(e){return async(t,n)=>{const i=lh(n),o=xg(n,"appId"),s=Ag(n,"request-id")??a.randomUUID(),r=!0===n.options.wait,d=await fg(t),c=await wg(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 Ch(0,r?await vh(t,d,i,c.job):c.job,!0===n.options.logs)}}const Ah=xh("install"),kh=xh("uninstall"),Sh=[{key:"id",header:"app"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"description",header:"description",width:60}];function Ch(e,t,n=!1){const i=function(e){return"succeeded"===e.state?`App \`${e.appId}\` ${e.operation} succeeded.`:wh.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:bh,message:`${i}\n${t.logTail.trimEnd()}`}:{data:t,columns:bh,message:i}}const jh=[{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}],Rh=[{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 Th(e){return e.map(e=>({...e,capabilities:Array.isArray(e.capabilities)?e.capabilities.join(","):"",lastSeenAt:"string"==typeof e.lastSeenAt?e.lastSeenAt:""}))}function $h(e,t){if("string"!=typeof e||!e.trim())throw new h("CLI_ARGUMENT_MISSING",`Missing required argument <${t}>.`,2);return e.trim()}function Eh(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 Ph(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 Oh(e){const t=e.store.select(e.profileLabel);return Ku({store:e.store,profile:t,fetchImpl:e.fetchImpl,withSession:!1})}async function Nh(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 Oh({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(Eh("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(Eh("Authorization complete","You can close this tab and return to the terminal.")),void(s||(s=!0,i({code:r,state:d})))):(t.end(Eh("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:Lu(),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??Ph)(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 Nh(o,c,"browser"),{profile:o.profile,session:c.session}}finally{s.close()}}function Uh(e){const t=(e.args??[]).map(e=>e.required?`<${e.name}>`:`[${e.name}]`);return["thctl",e.id,...t].join(" ")}function Lh(e){return{id:e.id,group:e.group,summary:e.summary,stage:e.stage,implemented:Boolean(e.handler),write:Boolean(e.write),usage:Uh(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 Dh(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 qh=[{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"}],Mh=[{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 Bh(e,t){return e.output.json?{data:t}:{data:Fh([t])[0],columns:qh}}function Fh(e){return e.map(e=>({...e,documents:Array.isArray(e.documents)?`${e.documents.length}`:"0",archivedAt:"string"==typeof e.archivedAt?e.archivedAt:""}))}async function Hh(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 Vh(e){return async(t,n)=>{const i=xg(n,"storyId"),o=await fg(t),a=await Hh(o,i,Ag(n,"node"));if("remove"===e){const e=await wg(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 wg(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{...Bh(t,s),message:`Story \`${i}\` ${"archive"===e?"archived":"restored"}.`}}}const Gh=Vh("archive"),Wh=Vh("restore"),Yh=Vh("remove"),Kh=[{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 Jh(e,t){return e.output.json?{data:t}:{data:t,columns:Kh}}const Zh=ti.omit({storyId:!0});function Qh(e){return async(t,n)=>{const i=xg(n,"storyId"),o=xg(n,"automationId"),a=await fg(t),s=await Hh(a,i,Ag(n,"node")),r=await wg(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 Xh=Qh(!0),ez=Qh(!1);function tz(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 nz=[{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 iz(e){return{...e,deploymentCount:Array.isArray(e.deployments)?e.deployments.length:0}}const oz={modelRelay:{name:"modelRelay",check:function(e){return function(e){return qs(e).managedModels.modelRelay}(e).protocols.length>0}},managedGitCredentials:{name:"managedGitCredentials",check:function(e){return qs(e).managedGitCredentials.registry}},localFolderPlaces:{name:"localFolderPlaces",check:function(e){return!0===Ds.safeParse(e).data?.folderPlaces}},localFolderNameUpdate:{name:"localFolderNameUpdate",check:function(e){return!0===Ds.safeParse(e).data?.localFolderNameUpdate}}};function az(e){const t=e?.capabilities?.agent;if(t&&"object"==typeof t&&!Array.isArray(t))return t.capabilities}async function sz(e,t,n){return{nodeId:t,capabilities:az(await e.resources.node(t,n))}}function rz(e,t,n){if(t&&!n.check(t.capabilities))throw f(e,n.name,{nodeId:t.nodeId,scope:"node"})}async function dz(e,t,n,i,o){const a=(await e.resources.instanceBoard(o)).find(e=>e.id===t);a&&rz(n,await sz(e,a.nodeId,o),i)}const cz={userManagement:{name:"userManagement",check:function(e){return!0===Vo(e)?.userManagement.users}},customRoles:{name:"customRoles",check:function(e){return!0===Vo(e)?.authorization.customRoles}},externalIdentityLogin:{name:"externalIdentityLogin",check:function(e){return void 0!==Vo(e)?.authentication.externalIdentity}}},lz=[{key:"id",header:"user"},{key:"displayName",header:"name",width:24},{key:"primaryUsername",header:"username"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],mz=[{key:"id",header:"session"},{key:"clientType",header:"client"},{key:"createdAt",header:"created"},{key:"expiresAt",header:"expires"},{key:"lastUsedAt",header:"last used"}],pz=[{key:"id",header:"role"},{key:"name",header:"name",width:24},{key:"builtin",header:"builtin"},{key:"updatedAt",header:"updated"}],uz=[{key:"id",header:"permission"},{key:"description",header:"description",width:48}],gz=[{key:"id",header:"provider"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"enabled",header:"enabled"}],hz=[{key:"id",header:"approval"},{key:"displayName",header:"name",width:24},{key:"email",header:"email",width:30},{key:"status",header:"status"}];async function zz(e,t,n){const i=await fg(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 fz(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 yz(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 Iz(e){const t=e.trim();return t.endsWith("/")?t:`${t}/`}const bz="taskhandoff",wz=["task-handoff","task-handoff-nodes"],vz="SKILL.md",xz=".thandoff-skill.json",Az=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(),kz=o.z.object({skills:o.z.array(Az).min(1).max(100)}).loose(),Sz=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 Cz(e){return a.createHash("sha256").update(e).digest("hex")}function jz(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 Rz(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,bz)}}const r="user"===s?i.join(o,".agents","skills"):i.join(e,".agents","skills");return{scope:s,root:r,directory:i.join(r,bz)}}function Tz(e,t={},i=n.homedir()){return t.dir?.trim()||t.scope?.trim()?[Rz(e,t,i)]:[Rz(e,{scope:"user"},i),Rz(e,{scope:"project"},i)]}async function $z(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=kz.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===bz);if(!a)throw I(`The skill index ${t} does not publish \`${bz}\`; the CLI and the published skill are out of sync.`,{indexUrl:t,expected:bz});const s=[...new Set(a.files.map(jz))];if(!s.includes(vz))throw I(`The skill index entry for \`${bz}\` does not declare ${vz}.`,{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 Ez(e,t){if(e.thctl&&!Pz(t,e.thctl))throw new h("CLI_SKILL_REQUIRES_NEWER_CLI",`Skill \`${bz}\` ${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 Pz(e,t){return!t||!fz(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 Oz(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=Cz(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 Nz(e){if(!t.existsSync(e))return{directory:e,exists:!1,managed:!1,modified:null};const n=function(e){try{const n=Sz.safeParse(JSON.parse(t.readFileSync(function(e){return i.join(e,xz)}(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,vz),"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:Lz(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 Uz(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||yz(e.version,t.version)}function Lz(e,n){const o=new Set(Object.keys(n.files));for(const[o,a]of Object.entries(n.files))try{if(Cz(t.readFileSync(i.join(e,...o.split("/"))))!==a)return!0}catch{return!0}try{return Dz(e).some(e=>!o.has(e))}catch{return!0}}function Dz(e,n=""){const o=t.readdirSync(i.join(e,n),{withFileTypes:!0}),a=[];for(const t of o){if(t.name===xz)continue;const i=n?`${n}/${t.name}`:t.name;t.isDirectory()?a.push(...Dz(e,i)):a.push(i)}return a}function qz(e){return wz.map(t=>i.join(e,t)).filter(e=>t.existsSync(e))}function Mz(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-${bz}-`)),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:bz,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,xz),`${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 Bz(e,t){const n=e.options[t];return"string"==typeof n&&n.trim()?n.trim():void 0}function Fz(e){return{scope:Bz(e,"scope"),dir:Bz(e,"dir")}}function Hz(e){return $z({fetchImpl:e.fetchImpl,env:e.env,timeoutMs:5e3})}function Vz(e,t,n,i,o){const a=n?Pz(i,n.entry.thctl):void 0,s=void 0!==n&&t.exists&&Uz(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 Gz(e){const t=qz(e.root);return t.length?` Legacy skill directories remain: ${t.join(", ")}; remove them after verifying the new copy.`:""}const Wz=o.z.looseObject({}),Yz=o.z.object({}).strict();function Kz(e){return o.z.object(e).strict()}function Jz(e,t,n,i={}){return{name:e,summary:t,leaves:n,...i.flat?{flat:!0}:{}}}const Zz=[{key:"id",header:"node"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"health",header:"health"},{key:"connectionMode",header:"connection"}],Qz=[{key:"id",header:"folder"},{key:"name",header:"name",width:24},{key:"path",header:"path",width:48},{key:"updatedAt",header:"updated"}],Xz=[{key:"id",header:"runtime"},{key:"name",header:"name",width:24},{key:"type",header:"type"},{key:"status",header:"status"},{key:"version",header:"version"}],ef=[{key:"reference",header:"reference",width:48},{key:"id",header:"image id",width:24},{key:"sizeBytes",header:"size"},{key:"createdAt",header:"created"}],tf=[{key:"id",header:"job"},{key:"status",header:"status"},{key:"fromVersion",header:"from"},{key:"toVersion",header:"to"},{key:"updatedAt",header:"updated"}],nf=[{key:"keyId",header:"key id"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"}],of=[{key:"id",header:"connection"},{key:"controlPlaneName",header:"control plane",width:24},{key:"controlPlaneUrl",header:"url",width:40},{key:"status",header:"status"}];function af(e){return xg(e,"nodeId")}async function sf(e,t,n,i){const o=await fg(e);if(i.length){const a=await sz(o.client,t,e.signal);for(const e of i)rz(n,a,e)}return o}const rf=new Set(["succeeded","degraded","failed"]),df={folders:o.z.array(gd),folderTree:o.z.array(wc),folderPlaces:o.z.array(vc),runtimes:o.z.array(sc),dockerImages:o.z.array(o.z.looseObject({reference:o.z.string().optional(),id:o.z.string().optional()})),imageOptions:o.z.array(bc),externalListener:cc,modelRelay:pc,updateJobs:o.z.array(rd),pairingInvite:gc,pairings:o.z.array(hc),connections:o.z.array(zc),connectionCreate:fc,nodeRemove:yc};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 cf={name:"nodeId",description:"Node ID",required:!0},lf={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},mf=[{id:"node create",group:"node",name:"create",stage:"B",write:!0,summary:"Create a node record from a JSON request body",options:[lf],input:Kz({config:o.z.string()}),output:df.nodeRemove,outputPinned:!1,handler:async function(e,t){const n=Tg(t,"Node create request"),i=await fg(e),o=await wg(e,"node create",()=>({method:"POST",path:"/api/nodes",body:n}),()=>i.client.nodeAdmin.createNode(n));if(o)return{data:o,columns:Zz,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:[cf],options:[{flags:"--force",description:"Force removal when the node is still reachable"}],input:Kz({nodeId:o.z.string(),force:o.z.boolean().optional()}),output:df.nodeRemove,handler:async function(e,t){const n=af(t),i=!0===t.options.force,o=await fg(e),a=await wg(e,"node remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}${i?"?force=true":""}`}),()=>Du(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:[cf],input:Kz({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=af(t),i=await fg(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:Yz,output:Wz,outputPinned:!1,handler:async function(e){const t=await fg(e),n=await wg(e,"node sync-local",()=>({method:"POST",path:"/api/nodes/local/sync"}),()=>t.client.nodeAdmin.syncLocalNode());if(n)return{data:n,columns:Zz,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:[cf],input:Kz({nodeId:o.z.string()}),output:o.z.array(gd),handler:async function(e,t){const n=af(t),i=await fg(e),o=await i.client.nodeAdmin.listFolders(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Qz,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:[cf],options:[{flags:"--path <path>",description:"Subtree root inside the node filesystem"},{flags:"--depth <depth>",description:"Maximum tree depth"}],input:Kz({nodeId:o.z.string(),path:o.z.string().optional(),depth:o.z.string().optional()}),output:o.z.array(wc),handler:async function(e,t){const n=af(t),i=Ag(t,"path"),o=Ag(t,"depth"),a=await fg(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:[cf],options:[lf],input:Kz({nodeId:o.z.string(),config:o.z.string()}),output:gd,handler:async function(e,t){const n=af(t),i=Tg(t,"Folder create request"),o=await sf(e,n,"node folders add",[oz.localFolderPlaces]),a=await wg(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:Qz,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:[cf,{name:"folderId",description:"Local folder ID",required:!0}],options:[lf],input:Kz({nodeId:o.z.string(),folderId:o.z.string(),config:o.z.string()}),output:gd,handler:async function(e,t){const n=af(t),i=xg(t,"folderId"),o=Tg(t,"Folder update request"),a=await sf(e,n,"node folders update",[oz.localFolderPlaces,oz.localFolderNameUpdate]),s=await wg(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:Qz,message:`Folder \`${i}\` updated.`}}},{id:"node folders remove",group:"node",name:"folders remove",stage:"B",write:!0,summary:"Remove a node local folder",args:[cf,{name:"folderId",description:"Local folder ID",required:!0}],input:Kz({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=af(t),i=xg(t,"folderId"),o=await sf(e,n,"node folders remove",[oz.localFolderPlaces]),a=await wg(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:[cf],input:Kz({nodeId:o.z.string()}),output:o.z.array(sc),handler:async function(e,t){const n=af(t),i=await fg(e),o=await i.client.nodeAdmin.listRuntimes(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Xz,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:[cf],options:[lf],input:Kz({nodeId:o.z.string(),config:o.z.string()}),output:sc,handler:async function(e,t){const n=af(t),i=Tg(t,"Runtime create request"),o=await fg(e),a=await wg(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:Xz,message:`Runtime \`${a.id}\` created.`}}},{id:"node runtimes update",group:"node",name:"runtimes update",stage:"B",write:!0,summary:"Update a node runtime",args:[cf,{name:"runtimeId",description:"Runtime ID",required:!0}],options:[lf],input:Kz({nodeId:o.z.string(),runtimeId:o.z.string(),config:o.z.string()}),output:sc,handler:async function(e,t){const n=af(t),i=xg(t,"runtimeId"),o=Tg(t,"Runtime update request"),a=await fg(e),s=await wg(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:Xz,message:`Runtime \`${i}\` updated.`}}},{id:"node runtimes remove",group:"node",name:"runtimes remove",stage:"B",write:!0,summary:"Remove a node runtime",args:[cf,{name:"runtimeId",description:"Runtime ID",required:!0}],input:Kz({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=af(t),i=xg(t,"runtimeId"),o=await fg(e),a=await wg(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:[cf,{name:"runtimeId",description:"Runtime ID",required:!0}],input:Kz({nodeId:o.z.string(),runtimeId:o.z.string()}),output:sc,outputPinned:!1,handler:async function(e,t){const n=af(t),i=xg(t,"runtimeId"),o=await fg(e),a=await o.client.nodeAdmin.checkRuntime(n,i);return e.output.json?{data:a}:{data:a,columns:Xz}}},{id:"node docker images",group:"node",name:"docker images",stage:"B",summary:"List docker images available on a node",args:[cf],input:Kz({nodeId:o.z.string()}),output:df.dockerImages,outputPinned:!1,handler:async function(e,t){const n=af(t),i=await fg(e),o=await i.client.nodeAdmin.listDockerImages(n,e.signal);return e.output.json?{data:o}:{data:o,columns:ef,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:[cf],input:Kz({nodeId:o.z.string()}),output:df.imageOptions,handler:async function(e,t){const n=af(t),i=await fg(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:[cf],input:Kz({nodeId:o.z.string()}),output:df.externalListener,handler:async function(e,t){const n=af(t),i=await fg(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:[cf],options:[lf],input:Kz({nodeId:o.z.string(),config:o.z.string()}),output:df.externalListener,handler:async function(e,t){const n=af(t),i=Tg(t,"External listener update request"),o=await fg(e),a=await wg(e,"node settings external-listener set",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/settings/external-listener`,body:i}),()=>Du(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:[cf],input:Kz({nodeId:o.z.string()}),output:df.modelRelay,handler:async function(e,t){const n=af(t),i=await fg(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:[cf],options:[lf],input:Kz({nodeId:o.z.string(),config:o.z.string()}),output:df.modelRelay,handler:async function(e,t){const n=af(t),i=Tg(t,"Model relay update request"),o=await sf(e,n,"node settings model-relay set",[oz.modelRelay]),a=await wg(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:[cf],input:Kz({nodeId:o.z.string()}),output:o.z.array(rd),handler:async function(e,t){const n=af(t),i=await fg(e),o=await i.client.nodeAdmin.updateJobs(n,e.signal);return e.output.json?{data:o}:{data:o,columns:tf,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:[cf],options:[{flags:"--config <file>",description:"Update check request JSON (optional)"}],input:Kz({nodeId:o.z.string(),config:o.z.string().optional()}),output:sd,handler:async function(e,t){const n=af(t),i=Ag(t,"config")?Tg(t,"Update check request"):{},o=await fg(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:[cf],options:[lf,{flags:"--wait",description:"Poll the update job until it reaches a terminal state"}],input:Kz({nodeId:o.z.string(),config:o.z.string(),wait:o.z.boolean().optional()}),output:rd,handler:async function(e,t){const n=af(t),i=Tg(t,"Update apply request"),o=!0===t.options.wait,a=await fg(e),s=await wg(e,"node updates apply",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/updates/apply`,body:i}),()=>Du(a,()=>a.client.nodeAdmin.applyUpdate(n,i)));if(!s)return;if(!o)return{data:s,columns:tf,message:`Update job \`${s.id}\` queued (status ${s.status}).`};let r=s;for(;;){if(rf.has(r.status))return{data:r,columns:tf,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:[cf],options:[{flags:"--config <file>",description:"Pairing invite request JSON (optional)"}],input:Kz({nodeId:o.z.string(),config:o.z.string().optional()}),output:df.pairingInvite,handler:async function(e,t){const n=af(t),i=Ag(t,"config")?Tg(t,"Pairing invite request"):{},o=await fg(e),a=await wg(e,"node pairing invite",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/pairing/invites`,body:i}),()=>o.client.nodeAdmin.createPairingInvite(n,i));if(a)return lg(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:[cf],input:Kz({nodeId:o.z.string()}),output:df.pairings,handler:async function(e,t){const n=af(t),i=await fg(e),o=await i.client.nodeAdmin.listControlPlanePairings(n,e.signal);return e.output.json?{data:o}:{data:o,columns:nf,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:[cf,{name:"keyId",description:"Pairing key ID",required:!0}],input:Kz({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=af(t),i=xg(t,"keyId"),o=await fg(e),a=await wg(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:[cf],input:Kz({nodeId:o.z.string()}),output:df.connections,handler:async function(e,t){const n=af(t),i=await fg(e),o=await i.client.nodeAdmin.listControlPlaneConnections(n,e.signal);return e.output.json?{data:o}:{data:o,columns:of,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:[cf],options:[lf],input:Kz({nodeId:o.z.string(),config:o.z.string()}),output:df.connectionCreate,handler:async function(e,t){const n=af(t),i=Tg(t,"Connection create request"),o=await fg(e),a=await wg(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:of,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:[cf,{name:"connectionId",description:"Connection ID",required:!0}],input:Kz({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=af(t),i=xg(t,"connectionId"),o=await fg(e),a=await wg(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}\`.`}}}],pf=Jz("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:Kz({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=Ag(t,"config")?Tg(t,"Join invite request"):{},i=await fg(e),o=await wg(e,"node-join invite",()=>({method:"POST",path:"/api/node-join/invites",body:n}),()=>i.client.nodeAdmin.createJoinInvite(n));if(o)return lg(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:Kz({inviteId:o.z.string()}),output:ic,handler:async function(e,t){const n=xg(t,"inviteId"),i=await fg(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:[lf],input:Kz({config:o.z.string()}),output:Wz,outputPinned:!1,handler:async function(e,t){const n=Tg(t,"Join completion request"),i=await fg(e),o=await wg(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.`}}}]),uf=[{key:"id",header:"project"},{key:"name",header:"name",width:24},{key:"defaultNodeId",header:"node"},{key:"updatedAt",header:"updated"}],gf=[{key:"id",header:"image"},{key:"name",header:"name",width:24},{key:"reference",header:"reference",width:40},{key:"pullPolicy",header:"pull"}],hf=[{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"}],zf=[{key:"id",header:"model"},{key:"name",header:"name",width:24},{key:"model",header:"model id",width:30},{key:"referenceCount",header:"refs"}],ff=[{key:"id",header:"template"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],yf=[{key:"id",header:"credential"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],If=[{key:"credentialId",header:"credential"},{key:"instanceId",header:"instance"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}];async function bf(e,t,n){return!0!==e.options["token-stdin"]||n(t,await $g(e)),t}const wf=[{key:"id",header:"bridge"},{key:"channel",header:"channel"},{key:"name",header:"name",width:24},{key:"running",header:"running"},{key:"tokenSet",header:"token"}],vf=[{key:"id",header:"session"},{key:"channel",header:"channel"},{key:"bridgeId",header:"bridge"},{key:"chatId",header:"chat"},{key:"updatedAt",header:"updated"}],xf=[{key:"id",header:"session"},{key:"userAgent",header:"client",width:30},{key:"createdAt",header:"created"},{key:"expiresAt",header:"expires"}];async function Af(e,t){const n=Tg(e,t);if(!0===e.options["token-stdin"]){const t=await $g(e);n.token=t,lg(t)}return n}const kf=[{key:"publicBaseUrl",header:"public base url",width:40},{key:"updateChannel",header:"channel"},{key:"mentionTrigger",header:"mention"},{key:"commandTrigger",header:"command"},{key:"diagnosticLogs",header:"logs"}],Sf=[{key:"id",header:"invite"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"},{key:"createdAt",header:"created"}],Cf=[{key:"id",header:"binding"},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],jf=[{key:"id",header:"claim"},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"}],Rf=[{key:"bindingId",header:"binding"},{key:"activeHttp",header:"http"},{key:"activeStreams",header:"streams"},{key:"activeWebSockets",header:"websockets"}],Tf={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},$f={output:Wz,outputPinned:!1},Ef=Jz("project","Manage catalog projects",[{id:"project list",group:"project",name:"list",stage:"B",summary:"List projects",input:Yz,output:o.z.array(xd),handler:async function(e){const t=await fg(e),n=await t.client.catalog.listProjects(e.signal);return e.output.json?{data:n}:{data:n,columns:uf,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:Kz({projectId:o.z.string()}),output:xd,handler:async function(e,t){const n=xg(t,"projectId"),i=await fg(e),o=await i.client.catalog.getProject(n,e.signal);return e.output.json?{data:o}:{data:o,columns:uf}}},{id:"project create",group:"project",name:"create",stage:"B",write:!0,summary:"Create a project from a JSON request body",options:[Tf],input:Kz({config:o.z.string()}),output:xd,handler:async function(e,t){const n=Tg(t,"Project create request"),i=await fg(e),o=await wg(e,"project create",()=>({method:"POST",path:"/api/projects",body:n}),()=>i.client.catalog.createProject(n));if(o)return{data:o,columns:uf,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:[Tf],input:Kz({projectId:o.z.string(),config:o.z.string()}),output:xd,handler:async function(e,t){const n=xg(t,"projectId"),i=Tg(t,"Project update request"),o=await fg(e),a=await wg(e,"project update",()=>({method:"PATCH",path:`/api/projects/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateProject(n,i));if(a)return{data:a,columns:uf,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:Kz({projectId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"projectId"),i=await fg(e),o=await wg(e,"project remove",()=>({method:"DELETE",path:`/api/projects/${encodeURIComponent(n)}`}),()=>i.client.catalog.removeProject(n));if(o)return{data:o,message:`Project \`${n}\` removed.`}}}]),Pf=Jz("image","Manage custom images",[{id:"image list",group:"image",name:"list",stage:"B",summary:"List custom images",input:Yz,output:o.z.array(Gd),handler:async function(e){const t=await fg(e),n=await t.client.catalog.listImages(e.signal);return e.output.json?{data:n}:{data:n,columns:gf,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:Kz({imageId:o.z.string()}),output:Gd,handler:async function(e,t){const n=xg(t,"imageId"),i=await fg(e),o=await i.client.catalog.getImage(n,e.signal);return e.output.json?{data:o}:{data:o,columns:gf}}},{id:"image create",group:"image",name:"create",stage:"B",write:!0,summary:"Create a custom image from a JSON request body",options:[Tf],input:Kz({config:o.z.string()}),output:Gd,handler:async function(e,t){const n=Tg(t,"Image create request"),i=await fg(e),o=await wg(e,"image create",()=>({method:"POST",path:"/api/images",body:n}),()=>i.client.catalog.createImage(n));if(o)return{data:o,columns:gf,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:[Tf],input:Kz({imageId:o.z.string(),config:o.z.string()}),output:Gd,handler:async function(e,t){const n=xg(t,"imageId"),i=Tg(t,"Image update request"),o=await fg(e),a=await wg(e,"image update",()=>({method:"PATCH",path:`/api/images/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateImage(n,i));if(a)return{data:a,columns:gf,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:Kz({imageId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"imageId"),i=await fg(e),o=await wg(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:Yz,...$f,handler:async function(e){const t=await fg(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}]}}}]),Of=Jz("market","Inspect the market catalog",[{id:"market catalog",group:"market",name:"catalog",stage:"B",summary:"Show the market catalog snapshot",input:Yz,...$f,handler:async function(e){const t=await fg(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:Yz,...$f,handler:async function(e){const t=await fg(e),n=await wg(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).`}}}]),Nf=[{id:"model create",group:"model",name:"create",stage:"B",write:!0,summary:"Create a model from a JSON request body",options:[Tf],input:Kz({config:o.z.string()}),...$f,handler:async function(e,t){const n=Tg(t,"Model create request"),i=await fg(e),o=await wg(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:[Tf],input:Kz({modelId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"modelId"),i=Tg(t,"Model copy request"),o=await fg(e),a=await wg(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:[Tf],input:Kz({config:o.z.string()}),...$f,handler:async function(e,t){const n=Tg(t,"Model discovery request"),i=await fg(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:[Tf],input:Kz({config:o.z.string()}),...$f,handler:async function(e,t){const n=Tg(t,"Model test request"),i=await fg(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:Kz({id:o.z.array(o.z.string()).optional()}),...$f,handler:async function(e,t){const n=Sg(t,"id");if(!n.length)throw kg(t,"id");const i=await fg(e),o=await wg(e,"model reorder",()=>({method:"POST",path:"/api/models/reorder",body:{ids:n}}),()=>i.client.catalog.reorderModels(n));if(o)return{data:o,columns:hf,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:[Tf],input:Kz({modelId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"modelId"),i=Tg(t,"Model update request"),o=await fg(e),a=await wg(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:Kz({modelId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"modelId"),i=await fg(e),o=await wg(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:[Tf],input:Kz({modelId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"modelId"),i=Tg(t,"Model merge request"),o=await fg(e),a=await wg(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:Kz({modelId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"modelId"),i=await fg(e),o=await wg(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:Kz({nodeId:o.z.string()}),output:o.z.array(kd),handler:async function(e,t){const n=xg(t,"nodeId"),i=await fg(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:zf,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:[Tf],input:Kz({nodeId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"nodeId"),i=Tg(t,"Node model create request"),o=await fg(e),a=await wg(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:[Tf],input:Kz({nodeId:o.z.string(),modelId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"nodeId"),i=xg(t,"modelId"),o=Tg(t,"Node model update request"),a=await fg(e),s=await wg(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:Kz({nodeId:o.z.string(),modelId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"nodeId"),i=xg(t,"modelId"),o=await fg(e),a=await wg(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:[Tf],input:Kz({nodeId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"nodeId"),i=Tg(t,"Node model discovery request"),o=await fg(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:[Tf],input:Kz({nodeId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"nodeId"),i=Tg(t,"Node model test request"),o=await fg(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=[Ef,Pf,Of,Jz("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:Kz({nodeId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"nodeId"),i=await fg(e),o=await i.client.environmentTemplates.listForNode(n,e.signal);return e.output.json?{data:o}:{data:o,columns:ff,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:Kz({nodeId:o.z.string(),templateId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"nodeId"),i=xg(t,"templateId"),o=await fg(e),a=await o.client.environmentTemplates.get(n,i,e.signal);return e.output.json?{data:a}:{data:a,columns:ff}}},{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:[Tf],input:Kz({instanceId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"instanceId"),i=Tg(t,"Environment template create request"),o=await fg(e),a=await wg(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:ff,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:Kz({nodeId:o.z.string(),templateId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"nodeId"),i=xg(t,"templateId"),o=await fg(e),a=await wg(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}\`.`}}}]),Jz("git-credential","Manage managed git credentials",[{id:"git-credential list",group:"git-credential",name:"list",stage:"B",summary:"List git credentials",input:Yz,output:o.z.looseObject({items:o.z.array(xs)}),handler:async function(e){const t=await fg(e),n=await t.client.gitCredentials.listCredentials(e.signal);return e.output.json?{data:n}:{data:n.items,columns:yf,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:Kz({credentialId:o.z.string()}),output:xs,handler:async function(e,t){const n=xg(t,"credentialId"),i=await fg(e),o=await i.client.gitCredentials.getCredential(n,e.signal);return e.output.json?{data:o}:{data:o,columns:yf}}},{id:"git-credential create",group:"git-credential",name:"create",stage:"B",write:!0,summary:"Create a git credential from a JSON request body",options:[Tf],input:Kz({config:o.z.string()}),output:xs,handler:async function(e,t){const n=await bf(t,Tg(t,"Git credential create request"),(e,t)=>{const n=e.secret&&"object"==typeof e.secret?e.secret:{};e.secret={...n,token:t}}),i=await fg(e),o=await wg(e,"git-credential create",()=>({method:"POST",path:"/api/git-credentials",body:n}),()=>i.client.gitCredentials.createCredential(n));if(o)return{data:o,columns:yf,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:[Tf],input:Kz({credentialId:o.z.string(),config:o.z.string()}),output:xs,handler:async function(e,t){const n=xg(t,"credentialId"),i=await bf(t,Tg(t,"Git credential update request"),(e,t)=>{const n=e.secret&&"object"==typeof e.secret?e.secret:{};e.secret={...n,token:t}}),o=await fg(e),a=await wg(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:yf,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:Kz({credentialId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"credentialId"),i=await fg(e),o=await wg(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:Kz({instanceId:o.z.string()}),output:o.z.array(js),handler:async function(e,t){const n=xg(t,"instanceId"),i=await fg(e);await dz(i.client,n,"git-credential assignments list",oz.managedGitCredentials,e.signal);const o=await i.client.gitCredentials.listInstanceAssignments(n,e.signal);return e.output.json?{data:o}:{data:o,columns:If,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:Kz({instanceId:o.z.string(),credential:o.z.string()}),output:js,handler:async function(e,t){const n=xg(t,"instanceId"),i=kg(t,"credential"),o=await fg(e);await dz(o.client,n,"git-credential assignments assign",oz.managedGitCredentials,e.signal);const a=await wg(e,"git-credential assignments assign",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/git-credential-assignments`,body:{credentialId:i}}),()=>Du(o,()=>o.client.gitCredentials.assignToInstance(n,{credentialId:i})));if(a)return{data:a,columns:If,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:Kz({instanceId:o.z.string(),credentialId:o.z.string()}),output:o.z.looseObject({revoked:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"credentialId"),o=await fg(e);await dz(o.client,n,"git-credential assignments unassign",oz.managedGitCredentials,e.signal);const a=await wg(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}\`.`}}}]),Jz("chat","Manage the chat gateway",[{id:"chat status",group:"chat",name:"status",stage:"B",summary:"Show the chat gateway status",input:Yz,...$f,handler:async function(e){const t=await fg(e),n=await t.client.chatGateway.status(e.signal);return e.output.json?{data:n}:{data:n.bridges,columns:wf,message:`Chat gateway ${n.running?"running":"stopped"}.`}}},{id:"chat bridges list",group:"chat",name:"bridges list",stage:"B",summary:"List chat bridges",input:Yz,...$f,handler:async function(e){const t=await fg(e),n=await t.client.chatGateway.listBridges(e.signal);return e.output.json?{data:n}:{data:n,columns:wf,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:[Tf],input:Kz({config:o.z.string()}),...$f,handler:async function(e,t){const n=await Af(t,"Chat bridge create request"),i=await fg(e),o=await wg(e,"chat bridges create",()=>({method:"POST",path:"/api/chat-gateway/bridges",body:n}),()=>i.client.chatGateway.createBridge(n));if(o)return{data:o,columns:wf,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:[Tf],input:Kz({bridgeId:o.z.string(),config:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"bridgeId"),i=await Af(t,"Chat bridge update request"),o=await fg(e),a=await wg(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:wf,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:Kz({bridgeId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"bridgeId"),i=await fg(e),o=await wg(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:Kz({bridgeId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"bridgeId"),i=await fg(e),o=await wg(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:Kz({bridgeId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"bridgeId"),i=await fg(e),o=await wg(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:Yz,...$f,handler:async function(e){const t=await fg(e),n=await t.client.chatGateway.listSessions(e.signal);return e.output.json?{data:n}:{data:n,columns:vf,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:Kz({sessionId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"sessionId"),i=await fg(e),o=await i.client.chatGateway.getSession(n,e.signal);return e.output.json?{data:o}:{data:o,columns:vf}}}]),Jz("mobile-session","Manage mobile sessions",[{id:"mobile-session list",group:"mobile-session",name:"list",stage:"B",summary:"List mobile sessions",input:Yz,output:o.z.array(Qo),handler:async function(e){const t=await fg(e),n=await t.client.auth.mobileSessions(e.signal);return e.output.json?{data:n}:{data:n,columns:xf,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:Kz({sessionId:o.z.string()}),output:o.z.looseObject({revoked:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"sessionId"),i=await fg(e),o=await wg(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.`}}}]),Jz("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:Yz,...$f,handler:async function(e){const t=await fg(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:Yz,...$f,handler:async function(e){const t=await fg(e),n=await t.client.admin.getSettings(e.signal);return e.output.json?{data:n}:{data:n,columns:kf}}},{id:"control-plane settings update",group:"control-plane",name:"settings update",stage:"B",write:!0,summary:"Update Control Plane settings",options:[Tf],input:Kz({config:o.z.string()}),...$f,handler:async function(e,t){const n=Tg(t,"Control Plane settings update request"),i=await fg(e),o=await wg(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:kf,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:Kz({out:o.z.string()}),output:o.z.looseObject({file:o.z.string(),bytes:o.z.number()}),handler:async function(e,n){const o=kg(n,"out"),a=await fg(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).`}}}]),Jz("cloud","Manage the cloud connectivity binding",[{id:"cloud show",group:"cloud",name:"show",stage:"B",summary:"Show cloud connectivity state",input:Yz,...$f,handler:async function(e){const t=await fg(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:Yz,...$f,handler:async function(e){const t=await fg(e),n=await wg(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:Kz({enabled:o.z.string()}),...$f,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 fg(e),o=await wg(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:Yz,...$f,handler:async function(e){const t=await fg(e),n=await wg(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}.`}}}]),Jz("proxy","Manage the control-plane proxy",[{id:"proxy invites list",group:"proxy",name:"invites list",stage:"B",summary:"List proxy invites",input:Yz,...$f,handler:async function(e){const t=await fg(e),n=await t.client.admin.proxyInvites(e.signal);return e.output.json?{data:n}:{data:n,columns:Sf,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:[Tf],input:Kz({config:o.z.string()}),...$f,handler:async function(e,t){const n=Tg(t,"Proxy invite create request"),i=await fg(e),o=await wg(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:Sf,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:Kz({inviteId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"inviteId"),i=await fg(e),o=await wg(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:Yz,...$f,handler:async function(e){const t=await fg(e),n=await t.client.admin.proxyBindings(e.signal);return e.output.json?{data:n}:{data:n,columns:Cf,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:Kz({bindingId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"bindingId"),i=await fg(e),o=await wg(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:Yz,...$f,handler:async function(e){const t=await fg(e),n=await t.client.admin.proxyDiagnostics(e.signal);return e.output.json?{data:n}:{data:n,columns:Rf,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:Yz,...$f,handler:async function(e){const t=await fg(e),n=await t.client.admin.pendingProxyClaims(e.signal);return e.output.json?{data:n}:{data:n,columns:jf,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:Kz({claimId:o.z.string()}),...$f,handler:async function(e,t){const n=xg(t,"claimId"),i=await fg(e),o=await wg(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:Kz({claimId:o.z.string(),force:o.z.boolean().optional()}),...$f,handler:async function(e,t){const n=xg(t,"claimId"),i=!0===t.options.force,o=await fg(e),a=await wg(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.`}}}])],Uf={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},Lf=[{id:"user create",group:"user",name:"create",stage:"B",write:!0,summary:"Create a local user",options:[Uf],input:Kz({config:o.z.string()}),output:Lo,handler:async function(e,t){const n=Tg(t,"User create request"),i=await zz(e,"user create",cz.userManagement),o=await wg(e,"user create",()=>({method:"POST",path:"/api/users",body:n}),()=>i.client.users.create(n));if(o)return{data:o,columns:lz,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:[Uf],input:Kz({userId:o.z.string(),config:o.z.string()}),output:Lo,handler:async function(e,t){const n=xg(t,"userId"),i=Tg(t,"User update request"),o=await zz(e,"user update",cz.userManagement),a=await wg(e,"user update",()=>({method:"PATCH",path:`/api/users/${encodeURIComponent(n)}`,body:i}),()=>o.client.users.update(n,i));if(a)return{data:a,columns:lz,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:[Uf],input:Kz({userId:o.z.string(),config:o.z.string()}),output:Lo,handler:async function(e,t){const n=xg(t,"userId"),i=Tg(t,"User access request"),o=await zz(e,"user access",cz.userManagement),a=await wg(e,"user access",()=>({method:"PUT",path:`/api/users/${encodeURIComponent(n)}/access`,body:i}),()=>Du(o,()=>o.client.users.setAccess(n,i)));if(a)return{data:a,columns:lz,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:Kz({userId:o.z.string(),requireChange:o.z.boolean().optional()}),output:Wz,outputPinned:!1,handler:async function(e,t){const n=xg(t,"userId"),i=await $g(t),o=!0===t.options["require-change"],a=await zz(e,"user password-reset",cz.userManagement),s={password:i,...o?{requirePasswordChange:!0}:{}},r=await wg(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:Kz({}),output:o.z.array(_o),handler:async function(e){const t=await zz(e,"user role list",cz.customRoles),n=await t.client.users.roles(e.signal);return e.output.json?{data:n}:{data:n,columns:pz,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:[Uf],input:Kz({config:o.z.string()}),output:_o,handler:async function(e,t){const n=Tg(t,"Role create request"),i=await zz(e,"user role create",cz.customRoles),o=await wg(e,"user role create",()=>({method:"POST",path:"/api/roles",body:n}),()=>i.client.users.createRole(n));if(o)return{data:o,columns:pz,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:[Uf],input:Kz({roleId:o.z.string(),config:o.z.string()}),output:_o,handler:async function(e,t){const n=xg(t,"roleId"),i=Tg(t,"Role update request"),o=await zz(e,"user role update",cz.customRoles),a=await wg(e,"user role update",()=>({method:"PATCH",path:`/api/roles/${encodeURIComponent(n)}`,body:i}),()=>Du(o,()=>o.client.users.updateRole(n,i)));if(a)return{data:a,columns:pz,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:Kz({roleId:o.z.string()}),output:_o,handler:async function(e,t){const n=xg(t,"roleId"),i=await zz(e,"user role remove",cz.customRoles),o=await wg(e,"user role remove",()=>({method:"DELETE",path:`/api/roles/${encodeURIComponent(n)}`}),()=>Du(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:Kz({}),output:o.z.array(jo),handler:async function(e){const t=await zz(e,"user permission list",cz.customRoles),n=await t.client.users.permissions(e.signal);return e.output.json?{data:n}:{data:n,columns:uz,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:Kz({}),output:o.z.array(qo),handler:async function(e){const t=await zz(e,"user identity-provider list",cz.externalIdentityLogin),n=await t.client.users.providers(e.signal);return e.output.json?{data:n}:{data:n,columns:gz,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:[Uf],input:Kz({config:o.z.string()}),output:qo,handler:async function(e,t){const n=Tg(t,"Identity provider create request"),i=await zz(e,"user identity-provider create",cz.externalIdentityLogin),o=await wg(e,"user identity-provider create",()=>({method:"POST",path:"/api/identity-providers",body:n}),()=>i.client.users.createProvider(n));if(o)return{data:o,columns:gz,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:[Uf],input:Kz({providerId:o.z.string(),config:o.z.string()}),output:qo,handler:async function(e,t){const n=xg(t,"providerId"),i=Tg(t,"Identity provider update request"),o=await zz(e,"user identity-provider update",cz.externalIdentityLogin),a=await wg(e,"user identity-provider update",()=>({method:"PATCH",path:`/api/identity-providers/${encodeURIComponent(n)}`,body:i}),()=>Du(o,()=>o.client.users.updateProvider(n,i)));if(a)return{data:a,columns:gz,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:Kz({providerId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"providerId"),i=await zz(e,"user identity-provider remove",cz.externalIdentityLogin),o=await wg(e,"user identity-provider remove",()=>({method:"DELETE",path:`/api/identity-providers/${encodeURIComponent(n)}`}),()=>Du(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:Kz({}),output:o.z.array(Mo),handler:async function(e){const t=await zz(e,"user external-identity list",cz.externalIdentityLogin),n=await t.client.users.approvals(e.signal);return e.output.json?{data:n}:{data:n,columns:hz,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:Kz({approvalId:o.z.string(),config:o.z.string().optional()}),output:Lo,handler:async function(e,t){const n=xg(t,"approvalId"),i=Ag(t,"config")?Tg(t,"Identity approval request"):{},o=await zz(e,"user external-identity approve",cz.externalIdentityLogin),a=await wg(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:lz,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:Kz({approvalId:o.z.string()}),output:Wz,outputPinned:!1,handler:async function(e,t){const n=xg(t,"approvalId"),i=await zz(e,"user external-identity reject",cz.externalIdentityLogin),o=await wg(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.`}}}],Df=Kz({origin:o.z.string(),label:o.z.string().optional()}),qf=Kz({label:o.z.string()}),Mf=Jz("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:Df,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}($h(t.args.origin,"origin")),i=await Gu(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:Yz,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:qf,output:o.z.object({defaultProfile:o.z.string()}),handler:async function(e,t){const n=$h(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:Kz({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:qf,output:o.z.object({label:o.z.string(),removed:o.z.boolean()}),handler:async function(e,t){const n=$h(t.args.label,"label");if(!e.store.get(n))throw new h("CLI_PROFILE_UNKNOWN",`Unknown profile \`${n}\`.`,7,{profile:n});return wg(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:qf,output:k,handler:async function(e,t){const n=$h(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 Gu(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 wg(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}.`}})}}]),Bf=Jz("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:Kz({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 zg(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 Oh({store:t,profileLabel:e.profileLabel,fetchImpl:n}),s=await a.client.auth.cliAuthorize({mode:"device",client:Lu()});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 Nh(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:Yz,output:o.z.object({profile:o.z.string(),revoked:o.z.boolean()}),handler:async function(e){const t=await zg(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 fg(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:Yz,output:o.z.looseObject({}),handler:async function(e){const t=await zg(e),n=await fg(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}),Ff={name:"instanceId",description:"Controlled instance ID",required:!0},Hf=Jz("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:Kz({node:o.z.string().optional()}),output:vl,handler:async function(e,t){const n=await fg(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:mh,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:[Ff],input:Kz({instanceId:o.z.string()}),output:wl,handler:async function(e,t){const n=lh(t),i=await fg(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:mh}}},{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:Kz({config:o.z.string(),name:o.z.string().optional(),node:o.z.string().optional(),start:o.z.boolean().optional()}),output:Ec,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=jg(kg(t,"config"),Tc,"instance config"),i=Ag(t,"name"),o=Ag(t,"node"),a={...n,...i?{name:i}:{},...o?{nodeId:o}:{},...!0===t.options.start?{start:!0}:{}},s=await fg(e),r=await wg(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:zh,message:d}}},{id:"instance delete",group:"instance",name:"delete",stage:"B",write:!0,summary:"Delete a controlled instance, optionally deleting its volumes",args:[Ff],options:[{flags:"--volumes",description:"Also delete the instance's managed volumes (irreversible)"}],input:Kz({instanceId:o.z.string(),volumes:o.z.boolean().optional()}),output:$r,examples:["thctl instance delete <instanceId> --yes","thctl instance delete <instanceId> --volumes --yes"],handler:async function(e,t){const n=lh(t),i=Rr.parse({deleteVolumes:!0===t.options.volumes}),o=await fg(e),a=await wg(e,`instance delete ${n}`,()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}`,body:i}),()=>Du(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:fh,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:[Ff],input:Kz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:uh},{id:"instance stop",group:"instance",name:"stop",stage:"A",write:!0,summary:"Stop a controlled instance",args:[Ff],input:Kz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:gh},{id:"instance restart",group:"instance",name:"restart",stage:"A",write:!0,summary:"Restart a controlled instance",args:[Ff],input:Kz({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:hh},{id:"instance logs",group:"instance",name:"logs",stage:"C",summary:"Stream instance logs (planned with the events stream work)",args:[Ff],options:[{flags:"--follow",description:"Keep streaming new log lines"}],input:Kz({instanceId:o.z.string(),follow:o.z.boolean().optional()}),output:Wz,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:Kz({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=lh(t),i=t.args.name?.trim();if(!i)throw new h("CLI_ARGUMENT_MISSING","Missing required argument <name>.",2);const o=await fg(e),a=await wg(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:[Ff],options:[{flags:"--config <file>",description:"Instance update request JSON (Control Plane wire body)"}],input:Kz({instanceId:o.z.string(),config:o.z.string()}),output:Cc,examples:["thctl instance update <instanceId> --config ./instance-settings.json"],handler:async function(e,t){const n=lh(t),i=jg(kg(t,"config"),Rc,"instance update config"),o=await fg(e),a=await wg(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:yh,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:[Ff],input:Kz({instanceId:o.z.string()}),output:Kr,handler:async function(e,t){const n=lh(t),i=await fg(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:Ih,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:Kz({instanceId:o.z.string(),appId:o.z.string(),requestId:o.z.string().optional(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Yr,examples:["thctl instance app install <instanceId> codex --wait","thctl instance app install <instanceId> codex --json"],handler:Ah},{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:Kz({instanceId:o.z.string(),appId:o.z.string(),requestId:o.z.string().optional(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Yr,handler:kh},{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:Kz({instanceId:o.z.string(),jobId:o.z.string(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Yr,handler:async function(e,t){const n=lh(t),i=xg(t,"jobId"),o=!0===t.options.wait,a=await fg(e);let s=(await a.client.apps.job(n,i,e.signal)).job;return o&&(s=await vh(e,a,n,s)),Ch(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:[Ff],input:Kz({instanceId:o.z.string()}),output:el,handler:async function(e,t){const n=lh(t),i=await fg(e),o=await i.client.apps.catalog(n,e.signal);return e.output.json?{data:o}:{data:o.items,columns:Sh,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:[Ff],input:Kz({instanceId:o.z.string()}),output:tl,handler:async function(e,t){const n=lh(t),i=await fg(e),o=await i.client.apps.customCatalog(n,e.signal);return e.output.json?{data:o}:{data:o.items,columns:Sh,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:[Ff],options:[{flags:"--config <file>",description:'Custom app catalog JSON body: { "items": [...] }'}],input:Kz({instanceId:o.z.string(),config:o.z.string()}),output:tl,examples:["thctl instance app catalog custom update <instanceId> --config ./custom-apps.json"],handler:async function(e,t){const n=lh(t),i=jg(kg(t,"config"),nl,"custom app catalog config"),o=await fg(e),a=await wg(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:Sh,message:`Custom app catalog updated with ${a.items.length} app(s).`}}}]),Vf=Jz("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:Kz({instance:o.z.string().optional()}),output:_i,handler:async function(e,t){const n=await fg(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:Eg,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:Kz({instanceId:o.z.string(),sessionId:o.z.string()}),output:St,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=await fg(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:Kz({instanceId:o.z.string(),agent:o.z.array(o.z.string()).optional()}),output:Ot,handler:async function(e,t){const n=xg(t,"instanceId"),i=Sg(t,"agent"),o=await fg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),revision:o.z.string().optional()}),output:Ct,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Ag(t,"revision"),a=await fg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),turnId:o.z.string(),revision:o.z.string().optional()}),output:jt,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=xg(t,"turnId"),a=Ag(t,"revision"),s=await fg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string()}),output:se,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=await fg(e),a=await o.client.aiSessions.timeline(n,i,e.signal);return e.output.json?{data:a}:{data:_g(a.items),columns:Ug,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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),turnId:o.z.string()}),output:re,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=xg(t,"turnId"),a=await fg(e),s=await a.client.aiSessions.turnTimeline(n,i,o,e.signal);return e.output.json?{data:s}:{data:_g(s.items),columns:Ug,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:Kz({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:et,handler:async function(e,t){const n=xg(t,"instanceId"),i=Ag(t,"model-entity"),o=Ag(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=Ag(t,"permission-mode"),r=Ag(t,"reasoning"),d={agent:kg(t,"agent"),message:kg(t,"prompt"),clientRequestId:Ag(t,"request-id")??a.randomUUID(),attachments:[],references:[],...Ag(t,"cwd-folder")?{cwdFolderId:Ag(t,"cwd-folder")}:{},...Ag(t,"story")?{storyId:Ag(t,"story")}:{},...s?{permissionMode:Vg(s)}:{},...r?{reasoningEffort:Wg(r,"reasoning")}:{},...i&&o?{modelSelection:{modelEntityId:i,modelName:o}}:{}},c=await fg(e),l=await wg(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:Kz({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:Et,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=xg(t,"message"),a=Ag(t,"mode"),s=a?function(e){const t=we.safeParse(e);if(!t.success)throw new h("CLI_INVALID_OPTION",`--mode must be one of: ${we.options.join(", ")}.`,2,{option:"mode",value:e});return t.data}(a):void 0,r=Ag(t,"permission-mode"),d=r?Vg(r):void 0,c=Sg(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=Sg(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(Gg),u={message:o,...s?{mode:s}:{},...d?{permissionMode:d}:{},...m.length?{attachments:m}:{},...p.length?{references:p}:{}},g=await fg(e),f=await wg(e,"ai-session send",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string()}),output:Et,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=await fg(e),a=await wg(e,"ai-session interrupt",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),decision:o.z.enum(["allow","deny","skip"])}),output:Et,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=function(e){const t=ct.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}(kg(t,"decision")),a=await fg(e),s=await wg(e,"ai-session approval",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string()}),output:Ut,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=await fg(e),a=await wg(e,"ai-session resume",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string()}),output:Qe,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=await fg(e),a=await wg(e,"ai-session read",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),title:o.z.string(),requestId:o.z.string().optional()}),output:Ce,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o={title:kg(t,"title"),clientRequestId:Ag(t,"request-id")??a.randomUUID()},s=await fg(e),r=await wg(e,"ai-session rename",()=>({method:"PUT",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),throughTurn:o.z.string().optional(),workspace:o.z.string().optional(),requestId:o.z.string().optional()}),output:it,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Ag(t,"through-turn"),s=Ag(t,"workspace"),r=Cg(nt,{clientRequestId:Ag(t,"request-id")??a.randomUUID(),...o?{throughTurnId:o}:{},...s?{workspace:{mode:s}}:{}},"fork input"),d=await fg(e),c=await wg(e,"ai-session fork",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),requestId:o.z.string().optional()}),output:rt,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Ag(t,"request-id")??a.randomUUID(),s=await fg(e),r=await wg(e,"ai-session close",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),story:o.z.string().optional(),detach:o.z.boolean().optional()}),output:Ze,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Ag(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 fg(e),r=await wg(e,"ai-session story",()=>({method:"PUT",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),requestId:o.z.string().optional()}),output:at,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Ag(t,"request-id")??a.randomUUID(),s=await fg(e),r=await wg(e,"ai-session open-app",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),app:o.z.string().optional()}),output:Gi,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Ag(t,"app")??"terminal-tty",a=await fg(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 wg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),command:o.z.string(),argument:o.z.string().optional()}),output:ke,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=xg(t,"command"),a=Ag(t,"argument"),s=Cg(Ae,{command:o,...a?{argument:a}:{}},"AI session command"),r=await fg(e),d=await wg(e,"ai-session command",()=>({method:"POST",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),kind:o.z.string().optional()}),output:Oe,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Ag(t,"kind"),a=o?function(e){const t=$e.safeParse(e);if(!t.success)throw z("CLI_INVALID_OPTION",`--kind must be one of: ${$e.options.join(", ")}.`,{option:"kind",value:e});return t.data}(o):void 0,s=await fg(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:Lg,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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),query:o.z.string().optional()}),output:Ne,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=t.args.query?.trim()??"",a=await fg(e),s=await a.client.aiSessions.searchMentionFiles(n,i,o,e.signal);return e.output.json?{data:s}:{data:s.candidates,columns:Lg,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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),file:o.z.string(),name:o.z.string().optional(),mime:o.z.string().optional()}),output:Ui,handler:async function(e,n){const o=xg(n,"instanceId"),a=xg(n,"sessionId"),s=i.resolve(xg(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>U)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=Ag(n,"name")??i.basename(s),c=Ag(n,"mime")??function(e){return Dg[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 fg(e),u=await wg(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:Kz({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=xg(n,"instanceId"),a=xg(n,"sessionId"),s=xg(n,"messageId"),r=xg(n,"attachmentId"),d=await fg(e),c=await d.client.aiSessions.attachmentContent(o,a,s,r),l=c.filename?i.basename(c.filename):r,m=Ag(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),entity:o.z.string(),name:o.z.string(),requestId:o.z.string().optional()}),output:We,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o={modelEntityId:kg(t,"entity"),modelName:kg(t,"name")},s=Ag(t,"request-id")??a.randomUUID(),r=await fg(e),d=await wg(e,"ai-session model",()=>({method:"PUT",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),effort:o.z.string(),requestId:o.z.string().optional()}),output:Je,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Wg(kg(t,"effort")),s=Ag(t,"request-id")??a.randomUUID(),r=await fg(e),d=await wg(e,"ai-session reasoning",()=>({method:"PUT",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string()}),output:gt,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=await fg(e),a=Rg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:Et,handler:Mg},{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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:$t,handler:Bg},{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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:$t,handler:Fg},{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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string(),message:o.z.string(),expectedRevision:o.z.string().optional()}),output:$t,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=xg(t,"queueId"),a=kg(t,"message"),s=await fg(e),r={expectedRevision:await Hg(e,s,n,i,t),message:a},d=await wg(e,"ai-session queue edit",()=>({method:"PATCH",path:`${Pg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),queue:o.z.array(o.z.string()).optional(),expectedRevision:o.z.string().optional()}),output:$t,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=Sg(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 fg(e),s={expectedRevision:await Hg(e,a,n,i,t),queueIds:o},r=await wg(e,"ai-session queue reorder",()=>({method:"PATCH",path:`${Pg(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:[Ff],options:[{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder to inspect"}],input:Kz({instanceId:o.z.string(),cwdFolder:o.z.string().optional()}),output:Bn,handler:async function(e,t){const n=xg(t,"instanceId"),i=Ag(t,"cwd-folder"),o=await fg(e);return{data:await o.client.aiSessions.workspace(n,i,e.signal),columns:Ng}}},{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:[Ff],options:[{flags:"--branch <branch>",description:"Branch to check out"},{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder that owns the workspace"}],input:Kz({instanceId:o.z.string(),branch:o.z.string(),cwdFolder:o.z.string().optional()}),output:Bn,examples:["thctl ai-session checkout <instanceId> --branch feature/demo"],handler:async function(e,t){const n=xg(t,"instanceId"),i=kg(t,"branch"),o=Ag(t,"cwd-folder"),a={branch:i,...o?{cwdFolderId:o}:{}},s=await fg(e),r=await wg(e,"ai-session checkout",()=>({method:"POST",path:`${Og(n)}/checkout`,body:a}),()=>s.client.aiSessions.checkoutWorkspaceBranch(n,a));if(r)return{data:r,columns:Ng,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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),tail:o.z.number().optional()}),output:Xe,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(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}(Ag(t,"tail"),"tail"),a=await fg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string()}),output:o.z.object({storyId:o.z.string(),documents:ki.shape.documents}),handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=await fg(e),a=await o.client.aiSessions.storyContent(n,i,e.signal);return e.output.json?{data:a}:{data:a.documents,columns:Yg,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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),path:o.z.string()}),output:Ri,examples:["thctl ai-session story-content read <instanceId> <sessionId> --path docs/design.md"],handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=kg(t,"path"),a=await fg(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).`}}}]),Gf=Jz("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:Kz({instance:o.z.string().optional()}),output:no,handler:async function(e,t){const n=Ag(t,"instance"),i=await fg(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:Kg,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:Kz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gi,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"appSessionId"),o=await fg(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:Kg}}},{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:Kz({instanceId:o.z.string(),appId:o.z.string(),cwdFolder:o.z.string().optional()}),output:Gi,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"appId"),o=Ag(t,"cwd-folder"),a={appId:i,...o?{cwdFolderId:o}:{}},s=await fg(e),r=await wg(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:Kz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gi,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"appSessionId"),o=await fg(e),a=await wg(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:Kz({instanceId:o.z.string(),appSessionId:o.z.string(),title:o.z.string()}),output:Gi,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"appSessionId"),o=Cg(Jg,xg(t,"title"),"title"),a=await fg(e),s=await wg(e,"app-session rename",()=>({method:"PATCH",path:Qg(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:Kz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Mi,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"appSessionId"),o=await fg(e),a=await wg(e,"app-session access",()=>({method:"POST",path:`${Qg(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:Zg,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:Kz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Bi,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=xg(t,"instanceId"),i=xg(t,"appSessionId"),o=await $g(t),a=await fg(e),s=await wg(e,"app-session revoke-access",()=>({method:"DELETE",path:`${Qg(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:Kz({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gi,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"appSessionId"),o=await fg(e),a=await wg(e,"app-session restart",()=>({method:"POST",path:`${Qg(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:Kz({instanceId:o.z.string(),appSessionId:o.z.string(),maxBytes:o.z.number().optional()}),output:Hi,handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(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}(Ag(t,"max-bytes"),"max-bytes"),a=await fg(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:Kz({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=xg(n,"instanceId"),a=xg(n,"appSessionId"),s=await fg(e),r=await s.client.appSessions.screenshot(o,a,e.signal),d=Ag(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:Xg,message:`Saved screenshot of app session \`${a}\` to \`${c}\`.`}}}]),Wf=Jz("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:Kz({instanceId:o.z.string(),appId:o.z.string()}),output:so,handler:async function(e,t){const{instanceId:n,appId:i}=nh(t),o=await fg(e),a=await o.client.appProfiles.list(n,i,e.signal);return e.output.json?{data:a}:{data:a.profiles,columns:th,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:Kz({instanceId:o.z.string(),appId:o.z.string(),name:o.z.string()}),output:ao,handler:async function(e,t){const{instanceId:n,appId:i}=nh(t),o=Cg(eh,kg(t,"name"),"--name"),a=await fg(e),s=await wg(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:th,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:Kz({instanceId:o.z.string(),appId:o.z.string(),profileId:o.z.string(),name:o.z.string()}),output:ao,handler:async function(e,t){const{instanceId:n,appId:i}=nh(t),o=xg(t,"profileId"),a=Cg(eh,kg(t,"name"),"--name"),s=await fg(e),r=await wg(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:th,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:Kz({instanceId:o.z.string(),appId:o.z.string(),profileId:o.z.string()}),output:ao,handler:async function(e,t){const{instanceId:n,appId:i}=nh(t),o=xg(t,"profileId"),a=await fg(e),s=await wg(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:th,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:Kz({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}=nh(t),o=xg(t,"profileId"),a=await fg(e),s=await wg(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}\`.`}}}]),Yf=Jz("node","Inspect nodes",[{id:"node list",group:"node",name:"list",stage:"B",summary:"List nodes in the fleet directory",input:Yz,output:yl,handler:async function(e){const t=await fg(e),n=await t.client.resources.nodes(e.signal);return e.output.json?{data:n}:{data:Th(n),columns:Rh,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:Kz({nodeId:o.z.string()}),output:fl,handler:async function(e,t){const n=xg(t,"nodeId"),i=await fg(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:Rh}}},{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:Kz({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=xg(t,"nodeId"),i=xg(t,"name"),o=await fg(e),a=await wg(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}\`.`}}},...mf]),Kf={flags:"--node <nodeId>",description:"Node that owns the story (resolved from the directory when omitted)"},Jf=[{name:"storyId",description:"Story ID",required:!0},{name:"automationId",description:"Automation ID",required:!0}],Zf=Kz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional()}),Qf={flags:"--config <file>",description:"Story automation JSON file"},Xf=Kz({storyId:o.z.string(),node:o.z.string().optional(),config:o.z.string()}),ey=Kz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional(),config:o.z.string()}),ty=Jz("story","Work with stories, documents and automations",[{id:"story list",group:"story",name:"list",stage:"B",summary:"List stories across visible nodes",input:Yz,output:o.z.object({stories:o.z.array(Ii),unavailableNodeIds:o.z.array(o.z.string())}),handler:async function(e){const t=await fg(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:Fh(n.stories),columns:qh,message:i}}},{id:"story show",group:"story",name:"show",stage:"B",summary:"Show one story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Kf],input:Kz({storyId:o.z.string(),node:o.z.string().optional()}),output:Ii,handler:async function(e,t){const n=xg(t,"storyId"),i=await fg(e),o=await Hh(i,n,Ag(t,"node"));return Bh(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:[Kf,{flags:"--description <description>",description:"Story description"},{flags:"--max-idle-ai-sessions <count>",description:"Idle AI session retention limit"}],input:Kz({title:o.z.string(),node:o.z.string().optional(),description:o.z.string().optional(),maxIdleAiSessions:o.z.number().int().nonnegative().optional()}),output:Ii,handler:async function(e,t){const n=xg(t,"title"),i=Ag(t,"description"),o=Ag(t,"max-idle-ai-sessions"),a={title:n,...i?{description:i}:{},...o?{maxIdleAiSessions:tz(o,"max-idle-ai-sessions")}:{}},s=await fg(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,Ag(t,"node")),d=await wg(e,"story create",()=>({method:"POST",path:"/api/stories",body:{nodeId:r,input:a}}),()=>s.client.stories.create(r,a));if(d)return{...Bh(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:[Kf,{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:Kz({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:Ii,handler:async function(e,t){const n=xg(t,"storyId"),i=Ag(t,"title"),o=Ag(t,"description"),a=Ag(t,"max-idle-ai-sessions"),s={...i?{title:i}:{},...o?{description:o}:{},...a?{maxIdleAiSessions:tz(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 fg(e),d=await Hh(r,n,Ag(t,"node")),c=await wg(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{...Bh(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:[Kf],input:Kz({storyId:o.z.string(),node:o.z.string().optional()}),output:Ii,handler:Gh},{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:[Kf],input:Kz({storyId:o.z.string(),node:o.z.string().optional()}),output:Ii,handler:Wh},{id:"story remove",group:"story",name:"remove",stage:"B",write:!0,summary:"Remove a story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[Kf],input:Kz({storyId:o.z.string(),node:o.z.string().optional()}),output:o.z.object({deleted:o.z.boolean()}),handler:Yh},{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:[Kf,{flags:"--title <title>",description:"New document title"},{flags:"--new-path <path>",description:"Move the document to this story path"}],input:Kz({storyId:o.z.string(),path:o.z.string(),node:o.z.string().optional(),title:o.z.string().optional(),newPath:o.z.string().optional()}),output:Ii,handler:async function(e,t){const n=xg(t,"storyId"),i=xg(t,"path"),o=Ag(t,"title"),a=Ag(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 fg(e),d=await Hh(r,n,Ag(t,"node")),c=await wg(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{...Bh(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:[Kf],input:Kz({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=xg(t,"storyId"),i=xg(t,"path"),o=await fg(e),a=await Hh(o,n,Ag(t,"node")),s=await wg(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:[Kf],input:Kz({storyId:o.z.string(),path:o.z.array(o.z.string()),node:o.z.string().optional()}),output:Ii,handler:async function(e,t){const n=xg(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 fg(e),a=await Hh(o,n,Ag(t,"node")),s={storyPaths:i},r=await wg(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{...Bh(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:[Kf],input:Kz({storyId:o.z.string(),node:o.z.string().optional()}),output:ci,handler:async function(e,t){const n=xg(t,"storyId"),i=await fg(e),o=await Hh(i,n,Ag(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:Jf,options:[Kf],input:Zf,output:di,handler:async function(e,t){const n=xg(t,"storyId"),i=xg(t,"automationId"),o=await fg(e),a=await Hh(o,n,Ag(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:[Kf,Qf],input:Xf,output:di,handler:async function(e,t){const n=xg(t,"storyId"),i=jg(kg(t,"config"),Zh,"story automation config"),o=await fg(e),a=await Hh(o,n,Ag(t,"node")),s={storyId:n,...i},r=await wg(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{...Jh(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:Jf,options:[Kf,Qf],input:ey,output:di,handler:async function(e,t){const n=xg(t,"storyId"),i=xg(t,"automationId"),o=jg(kg(t,"config"),ii,"story automation update config"),a=await fg(e),s=await Hh(a,n,Ag(t,"node")),r=await wg(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{...Jh(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:Jf,options:[Kf],input:Zf,output:o.z.object({deleted:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"storyId"),i=xg(t,"automationId"),o=await fg(e),a=await Hh(o,n,Ag(t,"node")),s=await wg(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:Jf,options:[Kf],input:Zf,output:di,handler:Xh},{id:"story automation disable",group:"story",name:"automation disable",stage:"B",write:!0,summary:"Disable a story automation",args:Jf,options:[Kf],input:Zf,output:di,handler:ez},{id:"story automation run",group:"story",name:"automation run",stage:"B",write:!0,summary:"Run a story automation now",args:Jf,options:[Kf,{flags:"--request-id <id>",description:"Client request ID for retry-safe runs"}],input:Kz({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional(),requestId:o.z.string().optional()}),output:si,handler:async function(e,t){const n=xg(t,"storyId"),i=xg(t,"automationId"),o=Ag(t,"request-id")??a.randomUUID(),s=await fg(e),r=await Hh(s,n,Ag(t,"node")),d={clientRequestId:o},c=await wg(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:Mh,message:`Automation \`${i}\` run ${c.status}.`}}},{id:"story automation runs",group:"story",name:"automation runs",stage:"B",summary:"List recent automation runs",args:Jf,options:[Kf],input:Zf,output:li,handler:async function(e,t){const n=xg(t,"storyId"),i=xg(t,"automationId"),o=await fg(e),a=await Hh(o,n,Ag(t,"node")),s=await o.client.stories.automationRuns(n,i,a);return e.output.json?{data:s}:{data:s.runs,columns:Mh,message:s.runs.length?void 0:"No runs matched."}}}]),ny=Jz("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:Kz({instance:o.z.string().optional()}),output:Fa,handler:async function(e,t){const n=Ag(t,"instance"),i=await fg(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(iz),columns:nz,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:Kz({configHash:o.z.string(),instance:o.z.string().optional()}),output:Ba,handler:async function(e,t){const n=xg(t,"configHash"),i=Ag(t,"instance"),o=await fg(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:iz(s),columns:nz}}},{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:Kz({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=xg(t,"instanceId"),i=xg(t,"sessionId"),o=jg(kg(t,"config"),Ha,"trigger config"),a=await fg(e),s=await wg(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:nz,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:Kz({configHash:o.z.string(),config:o.z.string()}),output:o.z.looseObject({}),handler:async function(e,t){const n=xg(t,"configHash"),i=jg(kg(t,"config"),Ha,"trigger config"),o=await fg(e),a=await wg(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:Kz({configHash:o.z.string()}),output:o.z.looseObject({}),handler:async function(e,t){const n=xg(t,"configHash"),i=await fg(e),o=await wg(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:Kz({instanceId:o.z.string(),configHash:o.z.string(),deployment:o.z.string().optional()}),output:o.z.unknown(),handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"configHash"),o=Ag(t,"deployment"),a=await fg(e),s=await wg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),configHash:o.z.string()}),output:o.z.object({config:Oa,deployment:_a,runtime:Ua.optional()}),handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=xg(t,"configHash"),a=await fg(e),s=await wg(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:Kz({instanceId:o.z.string(),sessionId:o.z.string(),configHash:o.z.string()}),output:o.z.unknown(),handler:async function(e,t){const n=xg(t,"instanceId"),i=xg(t,"sessionId"),o=xg(t,"configHash"),a=await fg(e),s=await wg(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:Kz({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=xg(t,"configHash"),i=kg(t,"session"),o=[...new Set(Sg(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 fg(e),r=await wg(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).`}}}]),iy=Jz("model","Inspect the model registry",[{id:"model list",group:"model",name:"list",stage:"B",summary:"List models in the public registry",input:Yz,output:Tl,handler:async function(e){const t=await fg(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:jh,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:Kz({modelId:o.z.string()}),output:Rl,handler:async function(e,t){const n=xg(t,"modelId"),i=await fg(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:jh}}},...Nf]),oy=Jz("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:Kz({includeArchived:o.z.boolean().optional()}),output:o.z.array(To),handler:async function(e,t){const n=!0===t.options["include-archived"],i=await fg(e),o=await i.client.users.list({includeArchived:n},e.signal);return e.output.json?{data:o}:{data:o,columns:lz,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:Kz({userId:o.z.string()}),output:Lo,handler:async function(e,t){const n=xg(t,"userId"),i=await fg(e),o=await i.client.users.detail(n,e.signal);return e.output.json?{data:o}:{data:o,columns:lz}}},{id:"user sessions",group:"user",name:"sessions",stage:"B",summary:"List sessions of a user",args:[{name:"userId",description:"User ID",required:!0}],input:Kz({userId:o.z.string()}),output:o.z.array(No),handler:async function(e,t){const n=xg(t,"userId"),i=await fg(e),o=await i.client.users.sessions(n,e.signal);return e.output.json?{data:o}:{data:o,columns:mz,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:Kz({userId:o.z.string(),sessionId:o.z.string()}),output:o.z.object({revoked:o.z.boolean()}),handler:async function(e,t){const n=xg(t,"userId"),i=xg(t,"sessionId"),o=await fg(e),a=await wg(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.`}}}},...Lf]),ay=[{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"}],sy={scope:o.z.enum(["project","user"]).optional(),dir:o.z.string().optional()},ry=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()}),dy=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()}),cy=Jz("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:[...ay],input:Kz(sy),output:o.z.array(ry),examples:["thctl skill status","thctl skill status --scope project --json"],handler:async function(e,t){const n=Fz(t),i=Boolean(n.dir||n.scope),o=Tz(process.cwd(),n),a=e=>n.dir?`--dir ${e.root}`:`--scope ${e.scope}`,s=_u();let r,d;try{r=await Hz(e)}catch(e){d=e instanceof Error?e.message:String(e)}const c=[];for(const e of o){const t=Nz(e.directory),n=qz(e.root);if(i||t.exists||0!==n.length){c.push(Vz(e,t,r,s,a(e)));for(const t of n){const n=Nz(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 \`${bz}\` 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:[...ay],input:Kz(sy),output:dy,examples:["thctl skill install","thctl skill install --scope project --yes"],handler:async function(e,t){const n=Rz(process.cwd(),Fz(t)),i=Nz(n.directory);if(i.exists)throw new h("CLI_SKILL_ALREADY_INSTALLED",`Skill \`${bz}\` is already installed at ${n.directory}${i.version?` (v${i.version})`:""}. Run \`thctl skill update\`.`,8,{directory:n.directory});const o=await Hz(e),a=_u();Ez(o.entry,a);const s=await Oz(o,{fetchImpl:e.fetchImpl});if(e.dryRun)return{data:{dryRun:!0,name:bz,version:o.entry.version,directory:n.directory,files:o.entry.files},message:`Would install skill \`${bz}\` ${o.entry.version} to ${n.directory}.`};await bg(e,"skill install",`Install skill \`${bz}\` ${o.entry.version} to ${n.directory}?`);const r=Mz({target:n,release:o,files:s,cliVersion:a});return{data:{name:bz,version:r.version,scope:n.scope,directory:n.directory,files:o.entry.files,verified:!0===r.verified},message:`Installed skill \`${bz}\` ${r.version} to ${n.directory}.${Gz(n)}`}}},{id:"skill update",group:"skill",name:"update",stage:"A",write:!0,summary:"Update the installed TaskHandoff skill to the published release",options:[...ay,{flags:"--force",description:"Replace a locally modified installed copy"}],input:Kz({...sy,force:o.z.boolean().optional()}),output:dy,examples:["thctl skill update","thctl skill update --force --yes"],handler:async function(e,t){const n=Rz(process.cwd(),Fz(t)),i=Nz(n.directory);if(!i.exists){const e=qz(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 \`${bz}\` 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 \`${bz}\` 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 Hz(e),s=_u();if(Ez(a.entry,s),i.managed&&!Uz(i,a.entry)&&!o)return{data:{name:bz,version:i.version,directory:n.directory,updated:!1},message:`Skill \`${bz}\` is already at ${i.version??"the published release"}; nothing to do.`};const r=await Oz(a,{fetchImpl:e.fetchImpl});if(e.dryRun)return{data:{dryRun:!0,name:bz,from:i.version,to:a.entry.version,directory:n.directory,files:a.entry.files},message:`Would update skill \`${bz}\` ${i.version??"unknown"} → ${a.entry.version} at ${n.directory}.`};await bg(e,"skill update",`Update skill \`${bz}\` ${i.version??"unknown"} → ${a.entry.version} at ${n.directory}?`);const d=Mz({target:n,release:a,files:r,cliVersion:s});return{data:{name:bz,from:i.version,version:d.version,scope:n.scope,directory:n.directory,files:a.entry.files,verified:!0===d.verified},message:`Updated skill \`${bz}\` to ${d.version} at ${n.directory}.${Gz(n)}`}}}]),ly=Jz("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:Kz({topic:o.z.array(o.z.string()).optional(),instance:o.z.string().optional()}),output:Tu,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=>sh[e]??e);return t.length?[...new Set(t)]:["*"]}(t.options.topic??[]),i="string"==typeof t.options.instance?t.options.instance.trim():"",o=await zg(e),a=await fg(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 ch(e,{url:rh(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}),my=Jz("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:Kz({group:o.z.string().optional(),leaf:o.z.string().optional(),format:o.z.enum(["json","md"]).optional(),out:o.z.string().optional()}),output:Wz,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&&gy(o))r={leaf:gy(o)};else if(!a&&function(e){return uy.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=gy(`${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?uy.filter(t=>t.group===e.group):uy,n=(e?.leaf?py.filter(t=>t.name===e.leaf?.group):e?.group?py.filter(t=>t.name===e.group):py).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:Uu,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(Lh)}}(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(Dh(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}),py=[Mf,Bf,Hf,Vf,Gf,Wf,Yf,pf,ty,ny,iy,..._f,oy,cy,ly,my],uy=py.flatMap(e=>e.leaves);function gy(e){const t=e.trim().replace(/\s+/g," ");return uy.find(e=>e.id===t)}function hy(e){return null==e?"":Array.isArray(e)?e.length?e.map(hy).join(", "):"":"object"==typeof e?JSON.stringify(e):String(e)}class zy{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=hy(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(`${mg(e)}\n`)}error(e){this.json?this.streams.stderr(`${JSON.stringify({error:{code:e.code,message:mg(e.message),...e.details?{details:pg(e.details)}:{}}})}\n`):this.streams.stderr(`${e.code}: ${mg(e.message)}\n`)}}const fy="TASK_HANDOFF_CLI_UPDATE_CHECK",yy="__update-check",Iy=864e5,by=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(),wy=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(),vy=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:by.optional(),skill:wy.optional(),noticeShownAt:o.z.string().optional(),noticeShownKey:o.z.string().optional()}).loose();function xy(e){return i.join(e.store.directory,"update-check.json")}function Ay(e){try{const n=vy.safeParse(JSON.parse(t.readFileSync(e,"utf8")));if(n.success)return n.data}catch{}return{schemaVersion:1}}function ky(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 Sy(e){const t=e?.trim().toLowerCase();if(t)return!["0","false","off","no"].includes(t)&&(!!["1","true","on","yes"].includes(t)||void 0)}function Cy(e,t=[]){return!!t.includes("--no-update-check")||!1===Sy(e[fy])}function jy(e){return!0===Sy(e[fy])}function Ry(e){const t=e.TASK_HANDOFF_CLI_UPDATE_CHECK_INTERVAL?.trim();if(!t)return Iy;const n=Number(t);return Number.isFinite(n)&&n>0?1e3*n:Iy}function Ty(e,t){r.spawn(e,t,{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}async function $y(e){const o=_u();if(!jy(e.env)&&!fz(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 Iz(a);const s=e.npm_config_registry?.trim();if(s)return Iz(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?Iz(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 Ey(e){const t=await $z({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 Py=[["--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 Oy(e){for(const[t,n]of Py)e.option(t,n);return e}function Ny(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 Uy(e){return e.handler?e.summary:`${e.summary} (not implemented — planned stage ${e.stage})`}function Ly(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 Dy(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 zy(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??hg,openUrl:e.openUrl??Ph,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]===yy)return await async function(e){const t=xy(e),n=Ay(t),[i,o]=await Promise.allSettled([$y(e),Ey(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{ky(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(Cy(e.env,n))return;const i=process.argv[1];if(!i)return;const o=t.now??Date.now(),a=xy(e),s=Ay(a),r=s.lastAttemptAt?Date.parse(s.lastAttemptAt):Number.NaN,d=!1===s.lastAttemptOk?Math.min(36e5,Ry(e.env)):Ry(e.env);if(!(Number.isFinite(r)&&o-r<d)){try{ky(a,{...s,schemaVersion:1,lastAttemptAt:new Date(o).toISOString()})}catch{return}try{(t.spawnDetached??Ty)(process.execPath,[i,yy])}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(Uu,"--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)}),Oy(n),n.configureHelp({sortSubcommands:!1});for(const e of py){const i=e.flat?n:n.command(e.name).description(e.summary);for(const n of e.leaves){const e=Ly(i,n).command(_y(n)).description(Uy(n));Oy(e);for(const t of n.options??[])t.repeatable?e.option(t.flags,t.description,Ny,[]):e.option(t.flags,t.description);e.action(async()=>{await Dy(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(Cy(e.env,n))return;const i=jy(e.env);if(!i&&(!e.isTty||e.output.json))return;const o=t.now??Date.now(),a=xy(e),s=Ay(a),r=t.cliVersion??_u(),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||fz(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=Tz(t.cwd??process.cwd(),{},t.home).map(e=>Nz(e.directory)).filter(e=>e.exists).filter(t=>void 0!==e&&void 0!==t.contentSignature?t.contentSignature!==e:void 0!==t.version&&yz(t.version,c));if(n.length>0){const e=[...new Set(n.map(e=>e.version??"unknown"))].join(", ");s.skill?.thctl&&!Pz(r,s.skill.thctl)?m.push(`skill ${bz} ${e} → ${c} needs thctl ${s.skill.thctl}: update the CLI first`):m.push(`skill ${bz} ${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{ky(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});