@task-handoff/thctl 0.0.38 → 0.0.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/thctl.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e=require("commander"),t=require("node:fs"),n=require("node:os"),i=require("node:path"),o=require("zod"),a=require("node:crypto"),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});
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,D=512e3,L=D,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:D;(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."})}),De=_e.extend({attachments:o.z.array(be).max(6).default([]),references:Te}).strict(),Le=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),modelUpstreamName:o.z.string().trim().min(1).max(240).optional()}).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:Le,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=De.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(),Dt=ft.omit({userMessages:!0}),Lt=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(Dt).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(Lt).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(Lt).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(),Dn=Rn.extend({worktreeId:Zt,confirm:o.z.literal(!0)}).strict(),Ln=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:Le}).strict(),o.z.object({cwd:Le,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:Le,gitSelection:Fe,workspaceSelection:o.z.never().optional()}).strict(),Ve.safeExtend({cwd:Le,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=Lt,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 Di(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=De.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 Li=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:Li.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(),Do=To.extend({identities:o.z.array(Po),accessGrant:Uo}).strict(),Lo=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:Lo}).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:Lo}).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:Lo.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(Lo),{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(Do),{signal:n}).then(e=>e.data),create:t=>e.request("/api/users",ja(Do),$i("POST",t)).then(e=>e.data),update:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}`,ja(Do),$i("PATCH",Eo.parse(n))).then(e=>e.data),setAccess:(t,n)=>e.request(`/api/users/${encodeURIComponent(t)}/access`,ja(Do),$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(Do),$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(),Da=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(Da).default([])}).strict();const La=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:La.optional()}).strip(),o.z.object({instanceId:o.z.string().trim().min(1).max(160),sessionId:o.z.string().trim().min(1).max(160),configHash: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=Da.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),unknownModelPolicy:o.z.boolean().default(!1)}).strip().default(()=>({protocols:[],streaming:!1,unknownModelPolicy:!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(),Ds=Us.omit({combinations:!0}).extend({combinations:o.z.array(o.z.unknown()).default([])}).strip(),Ls=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=Ls.safeParse({...t,agentExecution:void 0}),i=n.success?n.data:{},o=Ds.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),stableIdentity:o.z.boolean().default(!1)}).strip().default({selectModelAtCreate:!1,selectProviderAtCreate:!1,selectModelAtResume:!1,selectProviderAtResume:!1,switchModelWithinProvider:!1,switchProviderDuringSession:!1,stableIdentity:!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),modelUpstreamName:o.z.string().trim().min(1).max(240).optional()}).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"]),Dr=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(),Lr=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.enum(["update-available","up-to-date","unknown","unsupported"]),Fr=o.z.object({status:Br,installedVersion:o.z.string().trim().max(120).optional(),latestVersion:o.z.string().trim().max(120).optional(),checkedAt:cr,reason:o.z.string().trim().max(500).optional()}).strict(),Hr=Fr.extend({appId:dr}).strict(),Vr=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:Lr,managementSource:qr,version:o.z.string().trim().max(120).optional(),canInstall:o.z.boolean(),canUninstall:o.z.boolean(),canUpdate:o.z.boolean().optional(),installReason:Mr.optional(),uninstallReason:Mr.optional(),updateReason:Mr.optional(),updateCheck:Fr.optional(),activeJobId:dr.optional()}).strict(),Gr=o.z.enum(["install","uninstall","update"]),Wr=o.z.enum(["queued","running","succeeded","failed","cancelled","interrupted"]),Yr=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"]}),Kr=o.z.object({executable:o.z.string().trim().min(1).max(4096),args:o.z.array(o.z.string().max(4096)).max(128)}).strict(),Jr=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(),Zr=o.z.object({id:dr,requestId:dr.optional(),appId:dr,operation:Gr,state:Wr,phase:o.z.string().trim().min(1).max(120).optional(),progress:Yr.optional(),command:Kr.optional(),logTail:o.z.string().max(32768).optional(),logTruncated:o.z.boolean().optional(),error:Jr.optional(),requestedAt:cr,startedAt:cr.optional(),finishedAt:cr.optional(),updatedAt:cr}).strict(),Qr=o.z.object({streamId:dr,sequence:o.z.number().int().nonnegative(),capabilities:Dr,apps:o.z.array(Vr).max(256),activeJobs:o.z.array(Zr).max(256),recentJobs:o.z.array(Zr).max(256),observedAt:cr}).strict(),Xr=o.z.object({requestId:dr.optional()}).strict(),ed=o.z.object({job:Zr}).strict(),td=o.z.object({check:Hr}).strict();o.z.object({type:o.z.literal("app-management"),streamId:dr,sequence:o.z.number().int().nonnegative(),observedAt:cr,job:Zr.optional(),snapshot:Qr.optional()}).strict().refine(e=>void 0!==e.job||void 0!==e.snapshot,{message:"An app management event requires a job or snapshot."});const nd=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:nd.extend({component:o.z.literal("control-plane"),packageVersion:o.z.string().trim().min(1).max(80)}).loose(),serverTime:cr}).loose()}).loose();const id=o.z.enum(["stable","beta","alpha"]),od=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(),ad=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(),sd=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:ad.optional()}).strict(),rd=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(),dd=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(),cd=o.z.object({channel:id.default("stable")}).strict(),ld=o.z.object({source:o.z.literal("npm"),channel:id,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(od).default([]),impact:rd,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(),md=o.z.object({id:dr,nodeId:dr,source:o.z.literal("npm"),channel:id,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(od).default([]),impact:rd,rollout:dd,status:o.z.enum(["queued","updating-node","restarting-node","converging-instances","succeeded","degraded","failed"]),error:ad.optional(),startedAt:cr.optional(),completedAt:cr.optional(),createdAt:cr,updatedAt:cr}).strict(),pd=o.z.object({channel:id,targetVersion:o.z.string().trim().min(1).max(240),preflightToken:o.z.string().trim().min(16).max(240)}).strict(),ud=o.z.object({type:o.z.enum(["branch","tag"]),name:o.z.string().trim().min(1).max(240)}).strict(),gd=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(),hd=o.z.discriminatedUnion("type",[ud,gd]),zd=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(),fd=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:hd.default({type:"branch",name:"main"}),auth:zd.default({type:"none"}),clone:fd.default({submodules:!1,lfs:!1,subdirectory:""}),defaultImageSelection:wr.optional(),labels:lr,createdAt:cr,updatedAt:cr}).strict();const yd=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(),Id=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:hd.default({type:"branch",name:"main"}),auth:zd.default({type:"none"}),clone:fd.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:hd.default({type:"branch",name:"main"}),auth:zd.default({type:"none"}),clone:fd.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()]),bd=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(),wd=o.z.enum(["codex","claude","opencode"]),vd=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(),xd=o.z.array(vd).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)}),Ad=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(),kd=o.z.array(Ad).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)}),Sd=kd.default([]),Cd=o.z.object({id:dr,name:o.z.string().trim().min(1).max(160),source:Id,defaultImageSelection:wr.optional(),defaultNodeId:dr.optional(),workspacePolicy:bd,labels:lr,createdAt:cr,updatedAt:cr}).strict(),jd=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:xd,mappings:Sd,protocols:o.z.array($s).max(3).default([]),app:wd,enabled:o.z.boolean().default(!0),order:o.z.number().int().min(0).max(1e6).default(0),labels:lr,createdAt:cr,updatedAt:cr}).strict(),Rd=jd.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();Rd.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 Td=o.z.discriminatedUnion("type",[o.z.object({type:o.z.literal("control-plane"),name:jd.shape.name,enabled:jd.shape.enabled,order:jd.shape.order,revision:o.z.string().trim().min(1).max(160).optional()}).strict(),o.z.object({type:o.z.literal("node"),nodeId:dr,name:jd.shape.name,enabled:jd.shape.enabled,order:jd.shape.order,referenceCount:o.z.number().int().min(0),revision:o.z.string().trim().min(1).max(160).optional()}).strict()]),$d=o.z.object({id:dr,model:Rd,locations:o.z.array(Td).min(1),referenceCount:o.z.number().int().min(0).default(0)}).strict(),Ed=o.z.object({nodeId:dr,code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2e3)}).strict(),Pd=o.z.object({models:o.z.array($d),nodeDiagnostics:o.z.array(Ed).default([]),updatedAt:cr}).strict();jd.omit({id:!0,createdAt:!0,updatedAt:!0}).extend({mappings:kd.optional()}).strict().partial().strict();const Od=o.z.enum(["synced","pending","unsupported","error"]),Nd=o.z.object({nodeId:dr,state:Od,code:o.z.string().trim().min(1).max(120).optional(),message:o.z.string().trim().min(1).max(2e3).optional()}).strict(),_d=o.z.object({model:Rd,locations:o.z.array(Nd).default([])}).strict();o.z.object({targetModelId:dr}).strict(),o.z.object({merged:o.z.literal(!0),reassignedInstances:o.z.array(dr).default([])}).strict();const Ud=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(),Dd=o.z.object({modelId:dr,targetModelId:dr,merged:o.z.boolean(),locations:o.z.array(Ud).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 Ld=o.z.enum(["market","custom"]),qd=o.z.enum(["active","deprecated","yanked"]),Md=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()]),Bd=o.z.array(o.z.string().trim().min(1).max(80)).default([]),Fd=o.z.array(o.z.string().trim().min(1).max(120)).default([]),Hd=o.z.record(o.z.string().trim().min(2).max(35),o.z.string().trim().min(1).max(4096)),Vd=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(),Gd=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(Vd).default([]),status:qd.default("active")}).strict(),Wd=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:Hd.optional(),cover:Md.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(Gd).min(1),capabilities:Bd,optionalApps:Fd,defaultEnv:mr,labels:lr,status:qd.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."})}),Yd=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(Wd)}).strict(),Kd=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(),Jd=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:Hd.optional(),cover:Md.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:Bd,optionalApps:Fd,defaultEnv:mr,labels:lr,createdAt:cr,updatedAt:cr}).strict(),Zd=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:qd}).strict(),Qd=o.z.object({id:dr,origin:Ld,name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:Hd.optional(),cover:Md,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(Zd),reference:yr,digest:Ir.optional(),downloadSizeBytes:o.z.number().int().positive().optional(),unpackedSizeBytes:o.z.number().int().positive().optional(),capabilities:Bd,optionalApps:Fd,defaultEnv:mr,labels:lr,readOnly:o.z.boolean(),lifecycleStatus:qd.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(),Xd=o.z.object({id:dr,origin:Ld,name:o.z.string().trim().min(1).max(160),description:o.z.string().trim().max(4096).optional(),localizedDescriptions:Hd.optional(),cover:Md.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:Bd,optionalApps:Fd,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(),ec=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(),tc=o.z.object({instanceId:dr,generation:o.z.number().int().nonnegative(),requestedReference:yr,sequence:o.z.number().int().nonnegative(),observedAt:cr}).strict();tc.extend({data:o.z.string().min(1).max(65536),replay:o.z.boolean().optional()}).strict(),tc.extend({outcome:o.z.enum(["succeeded","failed"])}).strict(),tc.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 nc=o.z.enum(["pending","cloning","checking-out","submodules","lfs","finalizing","ready","failed"]),ic=o.z.object({phase:nc,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(),oc=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();oc.extend({data:o.z.string().min(1).max(65536),replay:o.z.boolean().optional()}).strict(),oc.extend({outcome:o.z.enum(["succeeded","failed"])}).strict(),oc.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 ac=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()]),sc=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 rc=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()]),dc=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(),cc=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:ac.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:dc.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:sc.nullable(),proxyState:dc.nullable()}).strict();const lc=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 mc=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:Ls.optional(),build:nd.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:mc.optional(),serverTime:cr.optional()}).strip();const pc=o.z.object({bindScope:o.z.enum(["loopback","all-ipv4"]),port:o.z.number().int().min(1).max(65535)}).strict(),uc=pc.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(),gc=pc,hc=o.z.enum(["passthrough","reject"]),zc=o.z.object({enabled:o.z.boolean(),unknownModelPolicy:hc.optional()}).strict(),fc=o.z.object({enabled:o.z.boolean(),unknownModelPolicy:hc.optional(),source:o.z.enum(["default","persisted"])}).strip(),yc=zc,Ic=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 bc=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 wc=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(),vc=o.z.object({pairing:bc,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(),xc=o.z.object({deleted:o.z.boolean().optional()}).passthrough(),Ac=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(),kc=o.z.object({image:Qd,status:o.z.enum(["available","pull-required","unknown"]),localImage:Ac.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(),Sc=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(Sc)}).passthrough()),Cc=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 jc=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(),Rc=o.z.object({...jc.shape}).strict(),Tc=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"}),$c=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:ic.optional()}).passthrough(),Ec=o.z.object({id:dr,name:o.z.string().trim().min(1).max(160),projectId:dr.optional(),source:Id,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:Xd.optional(),imageProvisioning:ec.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:nd.optional(),runtimeVersion:sd.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(L)}).strict().default({autoImportAgentConfigs:!0,codexConfigEnabled:!0,codexHomeMode:"taskhandoff",defaultCodexPermissionMode:"ask",aiSessionHistoryLimit:50,aiSessionAttachmentRetentionDays:30,aiSessionMaxFileAttachmentBytes:L}),workspace:$c.default({status:"unknown"}),target:jc.default({strategy:"direct-port",status:"unknown"}),access:Tc,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(Da).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(),Pc=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(),Oc=o.z.object({name:Ec.shape.name.optional(),config:Pc.optional(),modelSelection:Ec.shape.modelSelection.unwrap().optional()}).strict(),Nc=o.z.object({id:Ec.shape.id.optional(),name:Ec.shape.name.optional(),projectId:Ec.shape.projectId,source:Id.optional(),sourceSnapshot:o.z.record(o.z.string(),o.z.unknown()).optional(),nodeId:Ec.shape.nodeId.optional(),runtimeId:Ec.shape.runtimeId.optional(),environmentSource:vr.optional(),imageSelection:Ec.shape.imageSelection,config:Pc.optional(),modelSelection:Ec.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(),Uc=o.z.object({...Ec.omit({registrationToken:!0}).shape,startOutcome:_c}).strict(),Dc=o.z.union([Ec.transform(e=>({instance:e,gitWorkspaceProvisioningOperationId:void 0})),o.z.object({instance:Ec,gitWorkspaceProvisioningOperationId:dr.optional()}).strict()]);function Lc(e,t){if(!e||"object"!=typeof e||Array.isArray(e))return e;const n=e,i=new Set(Object.keys(Ec.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=Bc(e,["id","name","kind","source","availability","diagnosticCode"]);return!t||"object"!=typeof t||Array.isArray(t)?t:{...t,capabilities:Bc(e.capabilities,["automation","supportsCwdSelection","supportsProfiles"])}}):t.items,issues:Array.isArray(t.issues)?t.issues.map(e=>Bc(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=Id.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=Bc(t,o);if("local-folder"!==n){const e=function(e){const t=e&&"object"==typeof e&&!Array.isArray(e)?e:void 0,n=hd.safeParse(Bc(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?hd.safeParse({type:"commit",commit:i}):o?hd.safeParse({type:"tag"===t?.type?"tag":"branch",name:o}):hd.safeParse({type:"branch",name:"main"});return a.success?a.data:void 0}(t.ref),n=qc(zd,Bc(t.auth,["type","secretId"])),i=qc(fd,Bc(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=qc(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=qc(nd,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=qc(Lt,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=qc(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=Bc(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=Bc(e,i)}return n.action=Bc(t.action,["promptTemplate"]),n.policy=Bc(t.policy,["cooldownMs","maxConcurrentRuns","whenBusy"]),qc(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,Da)}}(n.triggers,"string"==typeof n.id&&n.id),o.apps=qc(Ec.shape.apps.unwrap(),Bc(n.apps,["runningCount","problemCount","updatedAt","revision"]),0,0,"string"==typeof n.id&&n.id)||{runningCount:0,problemCount:0},o.config=qc(Ec.shape.config.unwrap(),Bc(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:L},o.modelSelection=qc(br.unwrap(),Bc(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:Bc(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?Bc(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=Bc(n.imageSelection,["imageId","tag"]);o.imageSelection=s||(a?{imageId:a,tag:o.imageSnapshot?.tag}:void 0),o.imageProvisioning=qc(ec,Bc(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(sd.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(ad.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=qc($c,n.workspace,0,0,"string"==typeof n.id&&n.id)||{status:"unknown"},o.environmentSource=qc(vr,n.environmentSource,0,0,"string"==typeof n.id&&n.id),o.environmentTemplateOrigin=qc(Cr,n.environmentTemplateOrigin,0,0,"string"==typeof n.id&&n.id),o.runtime=qc(Ec.shape.runtime.unwrap(),n.runtime,0,0,"string"==typeof n.id&&n.id)||{labels:{}},o.target=qc(jc,Bc(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=qc(Tc,Bc(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(Ec.shape))Object.prototype.hasOwnProperty.call(o,e)&&!t.safeParse(o[e]).success&&t.safeParse(void 0).success&&delete o[e];return o}function qc(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=Mc(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=Mc(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 Mc(e,t){let n=e;for(const e of t){if(!n||"object"!=typeof n)return;n=n[e]}return n}function Bc(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:Lc(t.instance),..."string"==typeof t.gitWorkspaceProvisioningOperationId?{gitWorkspaceProvisioningOperationId:t.gitWorkspaceProvisioningOperationId}:{}}:Lc(t)},Dc),o.z.object({instanceId:Ec.shape.id,revision:o.z.number().int().min(0),updatedAt:cr,status:Ec.shape.status.unwrap(),health:Ec.shape.health.unwrap(),connectionStatus:Ec.shape.connectionStatus.unwrap(),accessStatus:o.z.enum(["reachable","endpoint-unreachable"]),imageProvisioning:ec.optional(),workspace:$c,runtime:Ec.shape.runtime.unwrap(),runtimeVersion:sd.optional(),ready:o.z.boolean(),lastHeartbeatAt:cr.optional()}).strict(),o.z.object({instanceId:dr.optional(),projectId:dr.optional(),source:Id.optional(),nodeId:dr.optional(),runtimeId:dr.optional(),imageSelection:wr.optional(),instanceVersion:o.z.string().trim().max(80).optional(),protocolVersion:Ys,build:nd.optional(),controlMode:o.z.enum(["standalone","controlled"]).default("controlled"),capabilities:sr.default(er),appInventory:Or.optional(),target:Rc.optional(),workspace:$c.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:Ec.shape.status.optional(),health:Ec.shape.health.optional(),protocolVersion:Ys,build:nd.optional(),capabilities:Ec.shape.capabilities.optional(),appInventory:Or.optional(),apps:Ec.shape.apps.optional(),aiSessions:Ec.shape.aiSessions.optional(),triggers:Ec.shape.triggers.optional(),workspace:$c.optional(),target:Rc.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 Fc=o.z.enum(["web","telegram","wechat","dingding","lark"]),Hc=o.z.object({id:dr,channel:Fc,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(),Vc=o.z.object({id:dr,channel:Fc,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:Fc,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 Gc=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 \\."),Wc=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 \\."),Yc=o.z.object({publicBaseUrl:o.z.string().trim().max(2048).optional(),updateChannel:id.default("stable"),mentionTrigger:Gc.default("@"),commandTrigger:Wc.default("/"),diagnosticLogs:o.z.boolean().default(!1)}).strict().refine(e=>e.mentionTrigger!==e.commandTrigger,{path:["commandTrigger"],message:"Command and mention triggers must be different."}),Kc=o.z.object({publicBaseUrl:o.z.string().trim().max(2048).optional(),updateChannel:id.optional(),mentionTrigger:Gc.optional(),commandTrigger:Wc.optional(),diagnosticLogs:o.z.boolean().optional()}).strict(),Jc=o.z.object({id:Cd.shape.id.optional(),name:Cd.shape.name,source:Id,defaultImageSelection:Cd.shape.defaultImageSelection,defaultNodeId:Cd.shape.defaultNodeId,workspacePolicy:bd.optional(),labels:Cd.shape.labels.optional()}),Zc={defaultRuntimeId:lc.shape.id.optional()};Jc.extend(Zc).strict().transform(({defaultRuntimeId:e,...t})=>({...t,source:Id.parse(t.source)})),Jc.omit({id:!0}).partial().extend(Zc).strict().transform(({defaultRuntimeId:e,...t})=>({...t,...t.source?{source:Id.parse(t.source)}:{}})),o.z.object({id:Jd.shape.id.optional(),name:Jd.shape.name,description:Jd.shape.description,cover:Jd.shape.cover,reference:Jd.shape.reference,pullPolicy:Jd.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:Jd.shape.defaultEnv.optional(),labels:Jd.shape.labels.optional()}).strict().omit({id:!0}).partial().strict();const Qc=o.z.object({name:jd.shape.name,endpoint:jd.shape.endpoint,key:jd.shape.key,model:jd.shape.model,modelNames:jd.shape.modelNames.optional(),mappings:kd.optional(),protocols:jd.shape.protocols.optional(),app:jd.shape.app,enabled:jd.shape.enabled.optional(),order:jd.shape.order.optional(),labels:jd.shape.labels.optional()}).strict();Qc.omit({key:!0}).extend({key:jd.shape.key.optional()}).strict(),Qc.partial().strict(),o.z.object({endpoint:jd.shape.endpoint,key:jd.shape.key.optional(),existingModelId:jd.shape.id.optional()}).strict().extend({model:jd.shape.model,app:jd.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 Xc=o.z.object({mode:o.z.enum(["local-static-key","paired-hmac","proxy-binding"]).default("local-static-key"),keyId:cc.shape.id.optional(),secret:o.z.string().trim().max(4096).optional(),pairedAt:cc.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:cc.shape.createdAt.optional()}).strict().optional()}).strict();o.z.object({id:cc.shape.id.optional(),name:cc.shape.name.optional(),connectionMode:cc.shape.connectionMode.optional(),connectionPath:cc.shape.connectionPath.optional(),connectionEnabled:cc.shape.connectionEnabled.optional(),auth:Xc.optional(),joinToken:o.z.string().trim().min(1).max(4096).optional(),endpoint:cc.shape.endpoint,controlEndpoint:cc.shape.controlEndpoint,containerEndpoint:cc.shape.containerEndpoint,publicWebBase:cc.shape.publicWebBase,status:o.z.enum(["unknown","online","offline","degraded"]).optional(),health:o.z.enum(["unknown","ok","degraded","failed"]).optional(),capabilities:cc.shape.capabilities.optional(),labels:cc.shape.labels.optional(),lastSeenAt:cc.shape.lastSeenAt}).strict(),o.z.object({name:cc.shape.name.optional(),connectionMode:cc.shape.connectionMode.unwrap().optional(),connectionPath:cc.shape.connectionPath.unwrap().optional(),connectionEnabled:cc.shape.connectionEnabled.unwrap().optional(),auth:Xc.optional(),endpoint:cc.shape.endpoint,controlEndpoint:cc.shape.controlEndpoint,containerEndpoint:cc.shape.containerEndpoint,publicWebBase:cc.shape.publicWebBase,status:cc.shape.status.unwrap().optional(),health:cc.shape.health.unwrap().optional(),capabilities:cc.shape.capabilities.unwrap().optional(),labels:cc.shape.labels.unwrap().optional(),lastSeenAt:cc.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 el=256,tl=o.z.string().trim().min(1).max(80).regex(/^[a-z0-9][a-z0-9._-]*$/),nl=o.z.string().trim().min(1).max(512).refine(e=>!/\s/.test(e)&&!/[;&|<>`$]/.test(e),"Command must be a single executable path or name."),il=o.z.object({id:tl,name:o.z.string().trim().min(1).max(120),kind:o.z.enum(["tty","gui","web"]),description:o.z.string().max(500).optional(),command:nl,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(il).max(el);const ol=o.z.object({id:tl,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(),al=o.z.object({items:o.z.array(ol).max(el)}).strict(),sl=o.z.object({schemaVersion:o.z.literal(1),items:o.z.array(il).max(el)}).strict(),rl=o.z.object({items:o.z.array(il).max(el)}).strict();function dl(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=Xr.parse(a?{requestId:a}:{});return n(`${t(e)}/${encodeURIComponent(i)}/${o}`,ed,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(s)})};return{management:(e,i)=>n(`${t(e)}/management`,Qr,{signal:i}),install:(e,t,n)=>i(e,t,"install",n),uninstall:(e,t,n)=>i(e,t,"uninstall",n),update:(e,t,n)=>i(e,t,"update",n),updateCheck:(e,i)=>n(`${t(e)}/${encodeURIComponent(i)}/update-check`,td,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}),job:(e,i,o)=>n(`${t(e)}/jobs/${encodeURIComponent(i)}`,ed,{signal:o}),catalog:(e,i)=>n(`${t(e)}/catalog`,al,{signal:i}),customCatalog:(e,i)=>n(`${t(e)}/catalog/custom`,sl,{signal:i}),updateCustomCatalog:(e,i)=>n(`${t(e)}/catalog/custom`,sl,{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(rl.parse(i))})}}const cl=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),ll=o.z.string().datetime(),ml=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 pl=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(),ul=o.z.object({aiSessionTimeline:ml.default(function(){return{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),aiSessionConversationAttachments:pl.optional(),aiSessionProviders:Gs.optional(),browserTunnel:o.z.boolean().optional(),aiSessionQueuePause:o.z.boolean().optional()}).passthrough(),gl=o.z.enum(["connecting","handshaking","healthy","reconnecting","suspect","offline"]),hl=o.z.enum(["start","stop","restart","retry-image","retry-git"]);o.z.object({instanceId:cl,revision:o.z.number().int().nonnegative(),updatedAt:ll,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:ll.optional()}).strip();const zl=o.z.object({code:o.z.string().trim().min(1).max(120),message:o.z.string().trim().min(1).max(2048)}).strict(),fl=o.z.enum(["instances","runtimes","models"]),yl=o.z.enum(["uninitialized","loading","ready","stale","error"]),Il=o.z.object({nodeId:cl,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(),bl=o.z.object({nodeId:cl,resource:fl,phase:yl,revision:o.z.number().int().nonnegative().optional(),updatedAt:ll.optional(),error:Il.optional()}).strict();bl.extend({contentChanged:o.z.boolean().optional()}).strict();const wl=o.z.object({nodeStates:o.z.array(bl).default([])}).passthrough(),vl=o.z.object({id:cl,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:gl.optional(),lastSeenAt:ll.optional(),observedAt:ll,capabilities:o.z.array(o.z.string().trim().min(1).max(120)).max(256),error:zl.optional()}).strict(),xl=o.z.array(vl),Al=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(),kl=o.z.object({modelEntityIds:o.z.array(cl).max(64).transform(e=>[...new Set(e)]).optional(),codexModelHash:cl.nullable().optional(),claudeModelHash:cl.nullable().optional(),opencodeModelHash:cl.nullable().optional()}).strict().default({}),Sl=o.z.object({id:cl,name:o.z.string().trim().min(1).max(160),nodeId:cl,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:ul.default({aiSessionTimeline:{sessionReadAgents:[],turnReadAgents:[],liveItemAgents:[]}}),config:o.z.object({defaultCodexPermissionMode:ve.default("ask"),aiSessionMaxFileAttachmentBytes:o.z.number().int().positive().default(L)}).strict().default({defaultCodexPermissionMode:"ask",aiSessionMaxFileAttachmentBytes:L}),modelSelection:kl,lastHeartbeatAt:ll.optional(),heartbeatAgeMs:o.z.number().int().nonnegative().optional(),observedAt:ll,runtime:o.z.object({id:cl,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(hl).max(4).default([]),availableApps:o.z.array(Al).max(256).default([]),availableAgents:o.z.array(Al).max(256),error:zl.optional()}).strict(),Cl=o.z.array(Sl),jl=e=>o.z.object({data:e}).passthrough(),Rl=o.z.object({data:Cl,meta:wl.optional()}).passthrough(),Tl=o.z.object({config:o.z.object({defaultCodexPermissionMode:ve}).passthrough()}).passthrough(),$l=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(),El=o.z.object({id:o.z.string().trim().min(1).max(160),name:o.z.string().trim().min(1).max(160)}),Pl=o.z.object({id:o.z.string().trim().min(1).max(160),capabilities:o.z.record(o.z.string(),o.z.unknown()).default({})}).passthrough(),Ol=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(),Nl=o.z.object({models:o.z.array(Ol)}).passthrough(),_l=o.z.object({id:o.z.string().trim().min(1).max(160),status:o.z.string().trim().min(1).max(80)}).strip(),Ul=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 Dl(e){const t=async(t,n,i)=>(await e.request(t,jl(n),{signal:i})).data;return{nodes:e=>t("/api/nodes?projection=directory",xl,e),node:(e,n)=>t(`/api/nodes/${encodeURIComponent(e)}`,Pl,n),instanceBoard:e=>t("/api/instance-board?projection=directory",Cl,e),instanceDirectory:t=>e.request("/api/instance-board?projection=directory&progressive=true",Rl,{signal:t}),models:e=>t("/api/models",Nl,e),instanceWorkspaceSource:async(e,n)=>(await t(`/api/controlled-instances/${encodeURIComponent(e)}`,$l,n)).source,updateInstanceName:async(t,n)=>(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,jl(El),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify({name:n})})).data,async updateInstance(t,n){const i=Oc.parse(n);return(await e.request(`/api/controlled-instances/${encodeURIComponent(t)}`,jl(Ec),{method:"PATCH",headers:{"content-type":"application/json"},body:JSON.stringify(i)})).data},updateNodeName:async(t,n)=>(await e.request(`/api/nodes/${encodeURIComponent(t)}`,jl(El),{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)}`,jl(Tl),{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",jl(Uc),{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)}`,jl($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(Ul),n),instanceAction(t,n){const i=hl.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}`,jl(_l),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({})}).then(e=>e.data)}}}const Ll=Oa.extend({id:Oa.shape.configHash}).strip(),ql=o.z.object({config:Oa,deployment:_a,runtime:Ua.optional()}).strip(),Ml=o.z.object({previousConfigHash:Oa.shape.configHash.optional(),trigger:Ll.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(),Bl=o.z.object({configHash:Oa.shape.configHash,results:o.z.array(o.z.unknown()).default([])}).passthrough();function Fl(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",Ll,$i("POST",Ha.parse(e))),update:(e,n)=>t(`/api/triggers/${encodeURIComponent(e)}`,Ml,$i("PUT",Ha.parse(n))),remove:e=>t(`/api/triggers/${encodeURIComponent(e)}`,Ml,$i("DELETE")),apply:(e,n)=>t(`/api/triggers/${encodeURIComponent(e)}/apply`,Bl,$i("POST",n)),bindSession:(e,n,i)=>t(`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(n)}/triggers`,ql,$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 Hl=2e3,Vl=32e3,Gl=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),Wl=Gl,Yl=o.z.string().regex(/^[a-f0-9]{64}$/),Kl=o.z.enum(["overlay-copy-on-write","worktree"]),Jl=o.z.enum(["instance","container","local-runtime"]),Zl=o.z.object({workspaceMaterializer:Kl.default("overlay-copy-on-write"),processSandbox:Jl.default("instance")}).strict(),Ql=o.z.object({id:Wl,revision:Yl,name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(Hl).default(""),appendedPrompt:o.z.string().max(Vl).default(""),targetInstanceId:Gl,cwdFolderId:Gl,providerId:Gl,modelEntityId:Gl.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),modelUpstreamName:o.z.string().trim().min(1).max(240).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:Zl,createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),Xl={name:o.z.string().trim().min(1).max(120),description:o.z.string().trim().max(Hl).default(""),appendedPrompt:o.z.string().max(Vl).default(""),targetInstanceId:Gl,cwdFolderId:Gl,providerId:Gl,modelEntityId:Gl.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),modelUpstreamName:o.z.string().trim().min(1).max(240).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:Zl.optional()},em=o.z.object(Xl).strict(),tm=o.z.object({expectedRevision:Yl,name:Xl.name.optional(),description:o.z.string().trim().max(Hl).nullable().optional(),appendedPrompt:o.z.string().max(Vl).nullable().optional(),targetInstanceId:Xl.targetInstanceId.optional(),cwdFolderId:Xl.cwdFolderId.optional(),providerId:Xl.providerId.optional(),modelEntityId:Gl.nullable().optional(),modelName:o.z.string().trim().min(1).max(120).nullable().optional(),modelUpstreamName:o.z.string().trim().min(1).max(240).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:Xl.executionPolicy}).strict();o.z.object({agents:o.z.array(Ql)}).strict();const nm=o.z.object({id:Wl,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:Gl,agent:Ql}).strict()),unavailableNodeIds:o.z.array(Gl).default([])}).strict();const im=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"]),om=o.z.object({code:o.z.literal("AGENT_DEFINITION_REVISION_CONFLICT"),expectedRevision:Yl,actualRevision:Yl}).strict();o.z.union([om,o.z.object({code:im}).strict()]);const am=o.z.object({agentId:Wl,change:o.z.enum(["created","updated","deleted"]),revision:Yl.optional(),definition:Ql.optional()}).strict();o.z.object({nodeId:Gl,event:am}).strict();const sm=Ql.strip().extend({executionPolicy:Zl.strip()});o.z.object({agents:o.z.array(sm)}).strip();const rm=o.z.object({agents:o.z.array(o.z.object({nodeId:Gl,agent:sm}).strip()),unavailableNodeIds:o.z.array(o.z.string().trim().min(1).max(120)).default([])}).strip(),dm=o.z.object({agentId:Wl,change:o.z.enum(["created","updated","deleted"]),revision:Yl.optional(),definition:sm.optional()}).strip();function cm(e){return sm.parse(e)}o.z.object({nodeId:Gl,event:dm}).strip();const lm=200,mm=o.z.string().trim().min(1).max(160).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),pm=mm,um=o.z.string().regex(/^[a-f0-9]{64}$/),gm=o.z.object({fromAgentId:Wl,toAgentId:Wl}).strict(),hm=o.z.object({id:pm,revision:um,name:o.z.string().trim().min(1).max(120),agentIds:o.z.array(Wl).min(1).max(50),edges:o.z.array(gm).max(lm),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime()}).strict(),zm=o.z.object({name:o.z.string().trim().min(1).max(120),agentIds:o.z.array(Wl).min(1).max(50),edges:o.z.array(gm).max(lm).default([])}).strict(),fm=o.z.object({expectedRevision:um,name:o.z.string().trim().min(1).max(120).optional(),agentIds:o.z.array(Wl).min(1).max(50).optional(),edges:o.z.array(gm).max(lm).optional()}).strict();o.z.object({orchestrations:o.z.array(hm)}).strict();const ym=o.z.object({id:pm,deleted:o.z.literal(!0)}).strict();o.z.object({orchestrations:o.z.array(o.z.object({nodeId:mm,orchestration:hm}).strict()),unavailableNodeIds:o.z.array(mm).default([])}).strict();const Im=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"]),bm=o.z.object({code:o.z.literal("AGENT_ORCHESTRATION_CYCLE"),cycle:o.z.array(Wl).min(2)}).strict(),wm=o.z.object({code:o.z.literal("AGENT_ORCHESTRATION_REVISION_CONFLICT"),expectedRevision:um,actualRevision:um}).strict();o.z.union([bm,wm,o.z.object({code:Im}).strict()]);const vm=o.z.object({orchestrationId:pm,change:o.z.enum(["created","updated","deleted"]),revision:um.optional(),orchestration:hm.optional()}).strict();o.z.object({nodeId:mm,event:vm}).strict();const xm=hm.strip().extend({agentIds:o.z.array(Wl).max(50).default([]),edges:o.z.array(gm).max(lm).default([])});o.z.object({orchestrations:o.z.array(xm)}).strip();const Am=o.z.object({orchestrations:o.z.array(o.z.object({nodeId:o.z.string().trim().min(1).max(160),orchestration:xm}).strip()),unavailableNodeIds:o.z.array(o.z.string().trim().min(1).max(160)).default([])}).strip(),km=o.z.object({orchestrationId:pm,change:o.z.enum(["created","updated","deleted"]),revision:um.optional(),orchestration:xm.optional()}).strip();function Sm(e){return xm.parse(e)}o.z.object({nodeId:o.z.string().trim().min(1).max(160),event:km}).strip();const Cm=o.z.string().trim().min(1).max(120).regex(/^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/),jm=Cm,Rm=Cm,Tm=o.z.number().int().nonnegative(),$m=o.z.enum(["queued","preparing","running","finalizing","completed","failed","cancelled"]),Em=o.z.object({kind:o.z.enum(["control-plane-user","standalone-operator"]),subjectId:Cm,authorizationRevision:o.z.number().int().nonnegative().optional()}).strict(),Pm=o.z.object({source:o.z.literal("story-session").optional(),initiatingInstanceId:Cm,initiatingAiSessionId:Cm,storyId:Cm,authorizationSubject:Em.optional()}).strict(),Om=o.z.object({source:o.z.literal("control-plane"),authorizationSubject:Em.optional()}).strict(),Nm=o.z.union([Pm,Om]),_m=o.z.object({maxMembers:o.z.number().int().positive(),maxDepth:o.z.number().int().nonnegative(),maxConcurrency:o.z.number().int().positive()}).strict(),Um=o.z.object({prompt:o.z.string().trim().min(1).max(128e3)}).strict(),Dm=o.z.object({agentRevision:Yl,targetInstanceId:Cm,cwdFolderId:Cm,appendedPrompt:o.z.string().max(32e3),providerId:Cm,modelEntityId:Cm.optional(),modelName:o.z.string().trim().min(1).max(120).optional(),modelUpstreamName:o.z.string().trim().min(1).max(240).optional(),reasoningEffort:o.z.string().trim().min(1).max(120).optional(),permissionMode:o.z.string().trim().min(1).max(120).optional(),executionPolicy:Zl}).strict(),Lm=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(),qm=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(),Mm=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:Lm.optional()}).strict();o.z.object({runId:jm,status:o.z.enum(["completed","failed","cancelled"]),result:o.z.object({text:o.z.string().max(32e3),truncated:o.z.boolean()}).strict().optional(),error:Lm.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 Bm=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(),Fm=o.z.object({runtimeId:Cm,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(),Hm=o.z.object({memberId:Rm,runId:jm,agentId:Wl,parentMemberId:Rm.optional(),instanceId:Cm,aiSessionId:Cm.optional(),role:o.z.enum(["root","callee"]),depth:o.z.number().int().nonnegative(),status:$m,input:Um.optional(),executionSnapshot:Dm,result:qm.optional(),error:Lm.optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict(),Vm=o.z.object({runId:jm,sequence:o.z.number().int().positive(),timestamp:o.z.string().datetime(),kind:o.z.string().trim().min(1).max(120),memberId:Rm.optional(),data:o.z.record(o.z.string(),o.z.unknown()).default({})}).strict(),Gm=o.z.object({runId:jm,clientRequestId:Cm,revision:Tm,status:$m,input:Um.optional(),provenance:Nm,orchestrationId:pm,rootMemberId:Rm,budget:_m,result:qm.optional(),resultDelivery:Mm.optional(),error:Lm.optional(),cleanup:Bm.optional(),sharedSpace:Fm.optional(),members:o.z.array(Hm).optional(),timeline:o.z.array(Vm).optional(),createdAt:o.z.string().datetime(),updatedAt:o.z.string().datetime(),completedAt:o.z.string().datetime().optional()}).strict(),Wm=o.z.object({clientRequestId:Cm,orchestrationId:pm,entryAgentId:Wl.optional(),input:Um,provenance:Nm,budget:_m.optional()}).strict(),Ym=o.z.object({clientRequestId:Cm,orchestrationId:pm,entryAgentId:Wl.optional(),input:Um,budget:_m.optional()}).strict(),Km=o.z.object({expectedRevision:Tm.optional()}).strict();o.z.object({runs:o.z.array(Gm)}).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 Jm=o.z.object({runId:jm,revision:Tm,run:Gm}).strict(),Zm=o.z.object({runId:jm,memberId:Rm,revision:Tm,member:Hm}).strict();o.z.object({runs:o.z.array(o.z.object({nodeId:Cm,run:Gm}).strict()),unavailableNodeIds:o.z.array(Cm).default([])}).strict(),o.z.object({nodeId:Cm,event:o.z.union([Jm,Zm])}).strict();const Qm=Hm.strip().extend({input:Um.strip().optional(),executionSnapshot:Dm.strip(),result:qm.strip().optional(),error:Lm.strip().optional()}),Xm=Vm.strip(),ep=Gm.strip().extend({orchestrationId:pm.optional(),input:Um.strip().optional(),provenance:o.z.union([Pm.strip().extend({authorizationSubject:Em.strip().optional()}),Om.strip().extend({authorizationSubject:Em.strip().optional()})]),budget:_m.strip(),result:qm.strip().optional(),resultDelivery:Mm.strip().extend({error:Lm.strip().optional()}).optional(),error:Lm.strip().optional(),cleanup:Bm.strip().optional(),sharedSpace:Fm.strip().optional(),members:o.z.array(Qm).optional(),timeline:o.z.array(Xm).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:${Wl.parse(n)}`;var n})();return{...e,orchestrationId:t}}),tp=o.z.object({runId:jm,revision:Tm,run:ep}).strip(),np=o.z.object({runId:jm,memberId:Rm,revision:Tm,member:Qm}).strip();function ip(e){return ep.parse(e)}o.z.object({nodeId:Cm,event:o.z.union([tp,np])}).strip();const op=["agent_run"],ap=o.z.enum(op),sp=o.z.object({agentId:Wl,orchestrationId:pm}).strict(),rp=o.z.object({enabledTools:o.z.array(ap).max(op.length),allowedTargets:o.z.array(sp).max(50)}).strict(),dp=o.z.object({agentId:Wl,orchestrationId:pm.optional(),prompt:o.z.string().trim().min(1).max(128e3),budget:_m.optional()}).strict();o.z.object({clientRequestId:O,input:dp}).strict(),o.z.object({enabledTools:o.z.array(o.z.string()).max(100).optional(),allowedTargets:o.z.array(sp).max(50).optional()}).strip(),o.z.enum(["content","actions","automations","aiSessions","decisions"]);const cp=o.z.object({content:o.z.boolean(),actions:o.z.boolean(),automations:o.z.boolean(),aiSessions:o.z.boolean(),decisions:o.z.boolean()}).strict();cp.strip().partial();const lp=["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"],mp=o.z.enum(lp),pp=o.z.object({policy:cp,revision:o.z.string().regex(/^[a-f0-9]{64}$/)}).strict(),up=o.z.object({policy:cp}).strict();pp.extend({storyId:_,enabledTools:o.z.array(mp).max(lp.length),agentInvocation:rp}).strict(),o.z.object({storyId:_,revision:pp.shape.revision}).strict();const gp=o.z.object({policy:cp.extend({decisions:o.z.boolean().default(!1)}).strip(),revision:pp.shape.revision}).strip();function hp(e){return pp.parse(gp.parse(e))}gp.extend({storyId:_,enabledTools:o.z.array(o.z.string()).max(100),agentInvocation:o.z.unknown().optional()}).strip();const zp=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(),fp=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:fp}).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 yp=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:yp.optional()}).strict()).max(100),pagination:fp}).strict();const Ip=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:zp.shape.page,pageSize:zp.shape.pageSize}).strict(),o.z.object({deleted:o.z.boolean()}).strict();const bp=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(),wp=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:bp.optional()}).strict();o.z.object({automations:o.z.array(wp).max(100),pagination:fp}).strict(),o.z.object({runs:o.z.array(bp).max(100),pagination:fp}).strict();const vp=o.z.object({instanceId:o.z.string().trim().min(1).max(120),sessionId:o.z.string().trim().min(1).max(120)}).strict(),xp=vp.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(xp).max(100),pagination:fp}).strict(),vp.extend({page:zp.shape.page,pageSize:o.z.number().int().min(1).max(50).default(10)}).strict(),o.z.object({detail:bt,turnIndex:vt}).strict();const Ap=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(),kp=yt.pick({id:!0,status:!0,phase:!0,updatedAt:!0,completedAt:!0}).strict(),Sp=yt.pick({id:!0,status:!0,phase:!0,contextCompactions:!0,startedAt:!0,updatedAt:!0,completedAt:!0}).strict();o.z.object({ref:vp,session:Ap,turns:o.z.array(kp).max(50),pagination:fp}).strict(),vp.extend({turnId:o.z.string().trim().min(1).max(240),page:zp.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 Cp=o.z.array(o.z.enum(["text","summary","input","output","paths"])).max(5).optional(),jp=o.z.object({id:o.z.string().trim().min(1).max(240),truncatedFields:Cp}).strict(),Rp=jp.extend({type:o.z.literal("user-message"),text:o.z.string().max(32e3),attachments:o.z.array(K).max(6).optional()}).strict(),Tp=jp.extend({type:o.z.literal("ai-message"),text:o.z.string().max(32e3)}).strict(),$p=jp.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(),Ep=o.z.discriminatedUnion("type",[Rp,Tp,$p]);function Pp(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 pp.parse(hp(i))},async updateAgentToolSettings(e,n,i){const a=up.parse({policy:i}),s=await t(`/api/stories/${encodeURIComponent(e)}/settings/agent-tools`,o.z.unknown(),$i("PUT",{nodeId:n,input:a}));return pp.parse(hp(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=Ip.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:vp,turn:Sp,items:o.z.array(Ep).max(50),pagination:fp}).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 Op=o.z.object({agentId:Wl,orchestrationId:pm,status:o.z.enum(["available","missing-reference"])}).strict(),Np=o.z.object({storyId:_,revision:Yl,entries:o.z.array(Op)}).strict(),_p=o.z.object({expectedRevision:Yl,entries:o.z.array(o.z.object({agentId:Wl,orchestrationId:pm.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 Up=Op.strip(),Dp=Np.strip().extend({entries:o.z.array(Up)});function Lp(e){return Dp.parse(e)}function qp(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}),rm.parse(i);var i},get:async(e,n,i)=>cm(await t(`/api/agents/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),create:async(e,n)=>cm(await t("/api/agents",o.z.unknown(),$i("POST",{nodeId:e,input:em.parse(n)}))),update:async(e,n,i)=>cm(await t(`/api/agents/${encodeURIComponent(e)}`,o.z.unknown(),$i("PATCH",{nodeId:n,input:tm.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()}`,nm,{method:"DELETE"})},async listOrchestrations(e,n){return i=await t("/api/agent-orchestrations"+(e?`?nodeId=${encodeURIComponent(e)}`:""),o.z.unknown(),{signal:n}),Am.parse(i);var i},getOrchestration:async(e,n,i)=>Sm(await t(`/api/agent-orchestrations/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),createOrchestration:async(e,n)=>Sm(await t("/api/agent-orchestrations",o.z.unknown(),$i("POST",{nodeId:e,input:zm.parse(n)}))),updateOrchestration:async(e,n,i)=>Sm(await t(`/api/agent-orchestrations/${encodeURIComponent(e)}`,o.z.unknown(),$i("PATCH",{nodeId:n,input:fm.parse(i)}))),removeOrchestration:(e,n)=>t(`/api/agent-orchestrations/${encodeURIComponent(e)}?nodeId=${encodeURIComponent(n)}`,ym,{method:"DELETE"}),storyEntries:async(e,n,i)=>Lp(await t(`/api/stories/${encodeURIComponent(e)}/agent-entries?nodeId=${encodeURIComponent(n)}`,o.z.unknown(),{signal:i})),updateStoryEntries:async(e,n,i)=>Lp(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:ip(t)}))}},getRun:async(e,n,i)=>ip(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}),Qm.parse(s);var s},createRun:async(e,n)=>ip(await t("/api/agent-runs",o.z.unknown(),$i("POST",{nodeId:e,input:Wm.parse(n)}))),createManualRun:async(e,n)=>ip(await t("/api/agent-runs/manual",o.z.unknown(),$i("POST",{nodeId:e,input:Ym.parse(n)}))),cancelRun:async(e,n,i={})=>ip(await t(`/api/agent-runs/${encodeURIComponent(e)}/cancel`,o.z.unknown(),$i("POST",{nodeId:n,input:Km.parse(i)})))}}function Mp(e){const t="ai-session"===e.sessionKind?"ai-sessions":"apps/sessions";return`/instances/${encodeURIComponent(e.instanceId)}/api/${t}/${encodeURIComponent(e.sessionId)}/repository`}function Bp(e,t){const n=`/api/controlled-instances/${encodeURIComponent(e.instanceId)}/repository/${t}`;return e.cwdFolderId?`${n}?${new URLSearchParams({cwdFolderId:e.cwdFolderId})}`:n}function Fp(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(Bp(e,"worktrees"),un,{signal:i?.signal})}catch(o){return n(e,e=>t(`${Mp(e)}/worktrees`,un,{signal:i?.signal}))(o)}},async createWorktree(e,i,o){const a=$n.parse(i);try{return await t(Bp(e,"worktrees"),Pn,$i("POST",a,o?.signal))}catch(i){return n(e,e=>t(`${Mp(e)}/worktrees`,Pn,$i("POST",a,o?.signal)))(i)}},async removeWorktree(e,i,o){const a=En.parse(i);try{return await t(Bp(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(`${Mp(e)}/worktrees/remove`,On,$i("POST",a,o?.signal))})(i)}},async moveWorktreeToMainPreflight(e,n,i){const o=_n.parse(n);return await t(Bp(e,"worktrees/move-to-main/preflight"),Un,$i("POST",o,i?.signal))},async moveWorktreeToMain(e,n,i){const o=Dn.parse(n);return t(Bp(e,"worktrees/move-to-main"),Ln,$i("POST",o,i?.signal))},async branches(e,i){try{return await t(Bp(e,"branches"),Cn,{signal:i?.signal})}catch(o){return n(e,e=>t(`${Mp(e)}/branches`,Cn,{signal:i?.signal}))(o)}}}}const Hp=o.z.object({deleted:o.z.boolean()}).strict(),Vp=o.z.array(Cd),Gp=o.z.array(Jd),Wp=o.z.array(Qd),Yp=o.z.object({id:o.z.string().trim().min(1),ownedBy:o.z.string().optional()}).passthrough(),Kp=o.z.object({models:o.z.array(Yp),latencyMs:o.z.number()}).passthrough(),Jp=o.z.object({success:o.z.literal(!0),latencyMs:o.z.number()}).passthrough(),Zp=o.z.object({catalog:Yd,status:Kd}).strict(),Qp=Rd.extend({referenceCount:o.z.number().int().min(0).optional()}).passthrough();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/models/${encodeURIComponent(e)}`,i=(e,t)=>`/api/nodes/${encodeURIComponent(e)}/models${void 0===t?"":`/${encodeURIComponent(t)}`}`;return{listProjects:e=>t("/api/projects",Vp,{signal:e}),getProject:(e,n)=>t(`/api/projects/${encodeURIComponent(e)}`,Cd,{signal:n}),createProject:e=>t("/api/projects",Cd,$i("POST",e)),updateProject:(e,n)=>t(`/api/projects/${encodeURIComponent(e)}`,Cd,$i("PATCH",n)),removeProject:e=>t(`/api/projects/${encodeURIComponent(e)}`,Hp,$i("DELETE")),listModels(e={}){const n=e.progressive?"?progressive=true":"";return t(`/api/models${n}`,Pd,{signal:e.signal})},getModel:(e,i)=>t(n(e),Rd,{signal:i}),createModel:e=>t("/api/models",Rd,$i("POST",e)),copyModel:(e,i)=>t(`${n(e)}/copy`,Rd,$i("POST",i)),discoverModels:e=>t("/api/models/discover",Kp,$i("POST",e)),testModel:e=>t("/api/models/test",Jp,$i("POST",e)),reorderModels:e=>t("/api/models/reorder",o.z.array(Rd),$i("POST",{ids:[...e]})),updateModel:(e,i)=>t(n(e),_d,$i("PATCH",i)),syncModel:e=>t(`${n(e)}/sync`,_d,$i("POST",{})),mergeModel:(e,i)=>t(`${n(e)}/merge`,Dd,$i("POST",i)),removeModel:e=>t(n(e),Hp,$i("DELETE")),createModelOnNode:(e,n)=>t(i(e),Qp,$i("POST",n)),discoverModelsOnNode:(e,n)=>t(`${i(e)}/discover`,Kp,$i("POST",n)),testModelOnNode:(e,n)=>t(`${i(e)}/test`,Jp,$i("POST",n)),updateModelOnNode:(e,n,o)=>t(i(e,n),Qp,$i("PATCH",o)),removeModelOnNode:(e,n)=>t(i(e,n),Hp,$i("DELETE")),marketCatalog:e=>t("/api/market/catalog",Zp,{signal:e}),refreshMarketCatalog:()=>t("/api/market/refresh",Zp,$i("POST",{})),imageOptions:e=>t("/api/image-options",Wp,{signal:e}),listImages:e=>t("/api/images",Gp,{signal:e}),getImage:(e,n)=>t(`/api/images/${encodeURIComponent(e)}`,Jd,{signal:n}),createImage:e=>t("/api/images",Jd,$i("POST",e)),updateImage:(e,n)=>t(`/api/images/${encodeURIComponent(e)}`,Jd,$i("PATCH",n)),removeImage:e=>t(`/api/images/${encodeURIComponent(e)}`,Hp,$i("DELETE"))}}const eu=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(),tu=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(),nu=o.z.object({data:o.z.array(lc),meta:o.z.object({nodeErrors:o.z.array(Il).default([]),nodeStates:o.z.array(bl).default([])}).passthrough().optional()}).passthrough(),iu=o.z.object({id:o.z.string().trim().min(1),joinToken:o.z.string().trim().min(1),expiresAt:o.z.string()}).strict(),ou=cc.transform(e=>{const{secret:t,...n}=e.auth;return{...e,auth:n}});function au(e){const t=async(t,n,i)=>(await e.request(t,(e=>o.z.object({data:e}).passthrough())(n),i)).data,n=e=>`/api/nodes/${encodeURIComponent(e)}`,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",ou,$i("POST",e)),updateNode:(e,i)=>t(n(e),ou,$i("PATCH",i)),removeNode(e,i={}){const o=i.force?"?force=true":"";return t(`${n(e)}${o}`,tu,$i("DELETE"))},checkNode:e=>t(`${n(e)}/check`,eu,$i("POST",{})),syncLocalNode:()=>t("/api/nodes/local/sync",ou,$i("POST",{})),listFolders:(e,n)=>t(a(e),o.z.array(yd),{signal:n}),listFolderPlaces:(e,i)=>t(`${n(e)}/folders/places`,o.z.array(Cc),{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(Sc),{signal:a})},createFolder:(e,n)=>t(a(e),yd,$i("POST",n)),updateFolder:(e,n,i)=>t(a(e,n),yd,$i("PATCH",i)),removeFolder:(e,n)=>t(a(e,n),xc,$i("DELETE")),listAllRuntimes(t={}){const n=t.progressive?"?progressive=true":"";return e.request(`/api/node-runtimes${n}`,nu,{signal:t.signal})},listRuntimes:(e,n)=>t(i(e),o.z.array(lc),{signal:n}),createRuntime:(e,n)=>t(i(e),lc,$i("POST",n)),updateRuntime:(e,n,o)=>t(i(e,n),lc,$i("PATCH",o)),removeRuntime:(e,n)=>t(i(e,n),xc,$i("DELETE")),checkRuntime:(e,n)=>t(`${i(e,n)}/check`,lc,$i("POST",{})),listDockerImages:(e,i)=>t(`${n(e)}/docker/images`,o.z.array(Ac),{signal:i}),imageOptions:(e,i)=>t(`${n(e)}/image-options`,o.z.array(kc),{signal:i}),getExternalListener:(e,i)=>t(`${n(e)}/settings/external-listener`,uc,{signal:i}),updateExternalListener(e,i){const o=gc.parse(i);return t(`${n(e)}/settings/external-listener`,uc,$i("PATCH",o))},getModelRelay:(e,i)=>t(`${n(e)}/settings/model-relay`,fc,{signal:i}),updateModelRelay(e,i){const o=yc.parse(i);return t(`${n(e)}/settings/model-relay`,fc,$i("PATCH",o))},updateJobs:(e,i)=>t(`${n(e)}/updates/jobs`,o.z.array(md),{signal:i}),checkUpdate(e,i={}){const o=cd.parse(i);return t(`${n(e)}/updates/check`,ld,$i("POST",o))},applyUpdate(e,i){const o=pd.parse(i);return t(`${n(e)}/updates/apply`,md,$i("POST",o))},createPairingInvite:(e,i={})=>t(`${n(e)}/pairing/invites`,Ic,$i("POST",i)),listControlPlanePairings:(e,i)=>t(`${n(e)}/control-plane-pairings`,o.z.array(bc),{signal:i}),removeControlPlanePairing:(e,i)=>t(`${n(e)}/control-plane-pairings/${encodeURIComponent(i)}`,xc,$i("DELETE")),listControlPlaneConnections:(e,i)=>t(`${n(e)}/control-plane-connections`,o.z.array(wc),{signal:i}),createControlPlaneConnection:(e,i)=>t(`${n(e)}/control-plane-connections`,vc,$i("POST",i)),removeControlPlaneConnection:(e,i)=>t(`${n(e)}/control-plane-connections/${encodeURIComponent(i)}`,xc,$i("DELETE")),createJoinInvite:(e={})=>t("/api/node-join/invites",iu,$i("POST",e)),joinInviteStatus:(e,n)=>t(`/api/node-join/invites/${encodeURIComponent(e)}`,rc,{signal:n}),completeJoin:e=>t("/api/node-join/complete",ou,$i("POST",e))}}const su=o.z.object({deleted:o.z.boolean()}).strict(),ru=o.z.object({revoked:o.z.boolean()}).strict(),du=o.z.object({credentialId:o.z.string().trim().min(1).max(120)}).strict();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/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),su,$i("DELETE")),listInstanceAssignments:(e,n)=>t(i(e),o.z.array(js),{signal:n}),assignToInstance(e,n){const o=du.parse(n);return t(i(e),js,$i("POST",o))},unassignFromInstance:(e,n)=>t(`${i(e)}/${encodeURIComponent(n)}`,ru,$i("DELETE"))}}const lu=o.z.object({deleted:o.z.boolean(),templateId:o.z.string().trim().min(1).max(120)}).strict();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/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)}`,lu,$i("DELETE"))}}const pu=Hc.omit({token:!0}).extend({tokenSet:o.z.boolean().optional()}).strip(),uu=o.z.object({running:o.z.boolean(),bridges:o.z.array(o.z.object({id:o.z.string(),channel:Fc,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 gu(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",uu,{signal:e}),listBridges:e=>t("/api/chat-gateway/bridges",o.z.array(pu),{signal:e}),createBridge:e=>t("/api/chat-gateway/bridges",pu,$i("POST",e)),updateBridge:(e,i)=>t(n(e),pu,$i("PATCH",i)),startBridge:e=>t(`${n(e)}/start`,uu,$i("POST",{})),stopBridge:e=>t(`${n(e)}/stop`,uu,$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(Vc),{signal:e}),getSession:(e,n)=>t(`/api/chat/sessions/${encodeURIComponent(e)}`,Vc,{signal:n})}}const hu=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(),zu=o.z.object({controlPlaneId:o.z.string(),algorithm:o.z.literal("Ed25519"),publicKey:o.z.string(),fingerprint:o.z.string()}).strict(),fu=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:zu,hasBackgroundCredential:o.z.boolean(),remoteResult:o.z.enum(["confirmed","unknown"]).optional()}).strict(),yu=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(),Iu=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(),bu=o.z.record(o.z.string(),o.z.unknown());function wu(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",hu,{signal:e}),getSettings:e=>t("/api/control-plane/settings",Yc,{signal:e}),updateSettings(e){const n=Kc.parse(e);return t("/api/control-plane/settings",Yc,$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",fu,{signal:e}),createCloudChallenge:()=>t("/api/cloud-connectivity/challenges",yu,$i("POST",{})),setCloudRemoteAccess:e=>t("/api/cloud-connectivity/remote-access",fu,$i("POST",{enabled:e})),disconnectCloud:()=>t("/api/cloud-connectivity/disconnect",fu,$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(Iu),{signal:e}),pendingProxyClaims:e=>t("/api/control-plane-proxy/pending-claims",o.z.array(ls),{signal:e}),resumeProxyClaim:e=>t(`${n(e)}/resume`,bu,$i("POST",{})),cancelProxyClaim(e,i={}){const o=i.force?"?force=true":"";return t(`${n(e)}${o}`,bu,$i("DELETE"))}}}const vu=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"]),xu=o.z.object({field:o.z.string(),value:o.z.string()}),Au=o.z.object({id:o.z.string(),operation:vu,targetId:o.z.string(),details:o.z.array(xu).optional(),createdAt:o.z.string().datetime(),expiresAt:o.z.string().datetime()}),ku=o.z.object({id:o.z.string(),status:o.z.enum(["pending","approved","denied"]),expiresAt:o.z.string().datetime()}),Su=ku.extend({kind:o.z.literal("operation-approval")}),Cu=o.z.object({revision:o.z.number().int(),requests:o.z.array(Au)});o.z.object({request:Au,status:o.z.enum(["pending","approved","denied","expired","consumed","cancelled"]),revision:o.z.number().int()});const ju=e=>o.z.object({data:e}).passthrough(),Ru=o.z.object({supported:o.z.literal(!0)});function Tu(e){return{support:async()=>(await e.request("/api/operation-approvals/support",ju(Ru))).data,status:async t=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}/status`,ju(ku))).data,cancel:async t=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}`,ju(o.z.object({cancelled:o.z.boolean()})),{method:"DELETE"})).data,snapshot:async()=>(await e.request("/api/operation-approvals",ju(Cu))).data,decide:async(t,n)=>(await e.request(`/api/operation-approvals/${encodeURIComponent(t)}/decision`,ju(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)}`,ju($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":""}`,ju(tu),{method:"DELETE"})).data}}function $u(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:Tu(t),auth:Ca(t),users:Ra(t),aiSessions:Di(t),appSessions:io(t),appProfiles:co(t),apps:dl(t),browser:mo(t),resources:Dl(t),triggers:Fl(t),stories:Pp(t),agents:qp(t),repository:Fp(t),catalog:Xp(t),nodeAdmin:au(t),gitCredentials:cu(t),environmentTemplates:mu(t),chatGateway:gu(t),admin:wu(t)}}const Eu=o.z.object({nodeId:o.z.string().optional(),instanceId:o.z.string().optional()}).passthrough(),Pu=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:Eu.optional()}).passthrough(),Ou=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:Eu.optional()}).passthrough(),Nu=o.z.discriminatedUnion("v",[Pu,Ou]);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"]),Uu=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(),Du=o.z.object({protocolVersion:o.z.literal(1),streams:o.z.array(Uu)}).strict();function Lu(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 qu(e){if(e)try{return i.dirname(t.realpathSync(e))}catch{return}}function Mu(){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=[qu(s),r,process.cwd()].filter(e=>Boolean(e));for(const t of new Set(d)){let n=t;for(;;){const t=Lu(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=Lu(i.join(t,"packages",a,"package.json"),n);if(e)return e}c||=Lu(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 Bu=Mu();function Fu(){const e="darwin"===process.platform||"linux"===process.platform||"win32"===process.platform?process.platform:"linux";return{name:n.hostname()||"thctl",platform:e,version:Bu}}async function Hu(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 Vu(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 Gu=Buffer.from("302a300506032b6570032100","hex"),Wu=o.z.object({error:o.z.object({code:o.z.string().min(1),message:o.z.string().min(1),details:o.z.record(o.z.string(),o.z.unknown()).optional(),retryable:o.z.boolean().optional()}).loose()}).loose();function Yu(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 Ku(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([Gu,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 Ju(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(Yu(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=Wu.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:Su}).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 Vu(a,e.approvalWait,async()=>(await t.request(`${r}/status`,o.z.object({data:ku}))).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(Yu(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=Wu.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 Zu(e,t){const n=$u(Ju({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:Ku(i),origin:e}}function Qu(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 Xu(e){const{profile:t,identity:n,fetchImpl:i,secrets:o}=e;if(!Go(n.payload.capabilities))return;if(!Qu(t.origin))return;const a=$u(Ju({origin:t.origin,fetchImpl:i})),s=await a.auth.cliLocalSession({client:Fu()}),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 eg(e){const{store:t,profile:n,fetchImpl:i}=e,o=await Zu(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)&&Qu(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 Xu({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=Ju({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 Xu({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=$u(c);if("local-trust"===s?.mode&&!r){const e=await m.auth.session();e.authenticated&&e.user||await Xu({profile:n,identity:o,fetchImpl:i,secrets:a})}return{profile:l,identity:o,client:m,store:t}}var tg,ng,ig=function(){if(ng)return tg;ng=1;const e=t,{spawnSync:n}=r;return tg={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 og(e){return Number.isInteger(e)&&Number(e)>0}const ag="local";function sg(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 rg=new Set(["127.0.0.1","localhost","::1","[::1]"]),dg=new Set(["0.0.0.0","::","[::]"]);async function cg(e){const o=sg(e.env),a=function(e){try{const o=JSON.parse(t.readFileSync(function(e){return i.join(e,"owner.json")}(e),"utf8"));if(og(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(!(og(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(!og(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=ig.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||!rg.has(n)&&!dg.has(n))return;const i=n.startsWith("[")&&n.endsWith("]")?n.slice(1,-1):n;return`http://${rg.has(n)?i.includes(":")?`[${i}]`:i:"127.0.0.1"}:${t}`}(a);if(s)try{return{origin:s,identity:await Zu(s,e.fetchImpl),lockPath:o,...a.dataDir?{dataDir:a.dataDir}:{}}}catch{return}}function lg(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(ag))return ag;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 mg=/(token|secret|password|passwd|credential|credentials|apikey|privatekey)$/i,pg=new Set(["key","token","secret","password","credentials","credential"]);function ug(e){return pg.has(e.toLowerCase())||mg.test(e)}const gg=new Set;function hg(e){if("string"!=typeof e)return;const t=e.trim();t.length>=4&&gg.add(t)}function zg(e){let t=e;for(const e of gg)t=t.split(e).join("***");return t}function fg(e){return yg(e)}function yg(e){if("string"==typeof e)return zg(e);if(Array.isArray(e))return e.map(yg);if(!e||"object"!=typeof e)return e;const t={};for(const[n,i]of Object.entries(e))t[n]=ug(n)?"***":yg(i);return t}function Ig(e){if(Array.isArray(e))for(const t of e)Ig(t);else if(e&&"object"==typeof e)for(const[t,n]of Object.entries(e))ug(t)?hg(n):Ig(n)}async function bg(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 wg(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 cg({env:e.env,fetchImpl:e.fetchImpl});if(i)return lg(e.store,i);throw new h("CLI_PROFILE_MISSING",`No Control Plane profile configured and no local Control Plane was detected (lock: ${sg(e.env)}). Start the desktop Control Plane or run \`thctl profile add <origin>\`.`,7)}async function vg(e,t={}){let n,i=t.profile??await wg(e);try{n=await xg(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 cg({env:e.env,fetchImpl:e.fetchImpl});return i&&i.origin!==t.origin?lg(e.store,i):void 0}(e,i,o);if(!a)throw o;i=a,n=await xg(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>Ag)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 xg(e,t,n){return eg({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 Ag=6048e5;async function kg(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 Sg(e,t,n,i){const o=n(),a=o.steps??[o];if(!e.dryRun){for(const e of a)Ig(e.body);return await kg(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:fg(o.body)}}:{dryRun:!0,steps:a.map(e=>({method:e.method,path:e.path,...void 0===e.body?{}:{body:fg(e.body)}}))})}function Cg(e){if(e.aborted)throw new h("CLI_CANCELLED","The operation was cancelled.",g)}function jg(e,t){const n=e.args[t]?.trim();if(!n)throw z("CLI_ARGUMENT_MISSING",`Missing required argument <${t}>.`,{argument:t});return n}function Rg(e,t){const n=e.options[t];if("string"==typeof n)return n.trim()||void 0}function Tg(e,t){const n=Rg(e,t);if(!n)throw z("CLI_OPTION_MISSING",`Missing required option --${t}.`,{option:t});return n}function $g(e,t){const n=e.options[t];return Array.isArray(n)?n.filter(e=>"string"==typeof e).map(e=>e.trim()).filter(Boolean):[]}function Eg(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 Pg(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 Eg(n,a,`${i} \`${e}\``)}function Og(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 Ng(e,t="request body"){const n=Tg(e,"config"),i=Pg(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 hg(i),i}const Ug=[{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"}],Dg=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/${encodeURIComponent(t)}`,Lg=e=>`/api/controlled-instances/${encodeURIComponent(e)}/ai-sessions/workspace`,qg=[{key:"availability",header:"availability"},{key:"currentBranch",header:"branch"},{key:"dirty",header:"dirty"},{key:"repositoryContextId",header:"context"}];function Mg(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 Bg=[{key:"type",header:"type"},{key:"turn",header:"turn",width:40},{key:"title",header:"title",width:24},{key:"detail",header:"detail",width:60}],Fg=[{key:"kind",header:"kind"},{key:"name",header:"name",width:30},{key:"path",header:"path",width:50}],Hg={".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 Vg(e,t){return async(n,i)=>{const o=jg(i,"instanceId"),a=jg(i,"sessionId"),s=jg(i,"queueId"),r=await vg(n),d=await Sg(n,e,()=>"remove"===t?{method:"DELETE",path:`${Dg(o,a)}/queue/${encodeURIComponent(s)}`}:{method:"POST",path:`${Dg(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 Gg=Vg("ai-session queue steer","steer"),Wg=Vg("ai-session queue retry","retry"),Yg=Vg("ai-session queue remove","remove");async function Kg(e,t,n,i,o){const a=Rg(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=Og(await t.client.aiSessions.detail(n,i,void 0,e.signal),i);return s.queue?.revision??0}function Jg(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 Zg(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 Eg(Re,n,`--reference ${e}`)}function Qg(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 Xg=[{key:"storyPath",header:"path",width:48},{key:"title",header:"title",width:32}],eh=[{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"}],th=o.z.string().trim().min(1).max(120),nh=[{key:"mode",header:"mode"},{key:"url",header:"url"},{key:"expiresAt",header:"expires"},{key:"token",header:"token"}],ih=(e,t)=>`/api/controlled-instances/${encodeURIComponent(e)}/apps/sessions/${encodeURIComponent(t)}`,oh=[{key:"path",header:"path",width:50},{key:"size",header:"size"},{key:"contentType",header:"content type"}],ah=o.z.string().trim().min(1).max(60),sh=[{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 rh(e){return{instanceId:jg(e,"instanceId"),appId:jg(e,"appId")}}function dh(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 ch{retryNumber=0;random;constructor(e=Math.random){this.random=e}get attempts(){return this.retryNumber}next(){return this.retryNumber+=1,{attempt:this.retryNumber,delay:dh(this.retryNumber,this.random)}}reset(){this.retryNumber=0}}const lh=({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{}}}},mh={"ai-sessions":"ai.sessions","app-sessions":"app.sessions"};function ph(e,t){const n=new URL(Yu(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 uh(e){return`${e.code}${e.reason?`: ${e.reason}`:""}`}async function gh(e,t){if(e.signal.aborted)return;const n=e.createEventSocket??lh,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 ch;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 Du.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 ${uh(e)}).`}):f(o,{error:b(`The Control Plane closed the event stream before the session-stream handshake (code ${uh(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 hh(e){const t=e.args.instanceId?.trim();if(!t)throw new h("CLI_ARGUMENT_MISSING","Missing required argument <instanceId>.",2);return t}const zh=[{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 fh(e){return async(t,n)=>{const i=hh(n),o=await vg(t),a=await Sg(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 yh=fh("start"),Ih=fh("stop"),bh=fh("restart"),wh=[{key:"id",header:"instance"},{key:"name",header:"name",width:24},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"startOutcome.status",header:"start"}],vh=[{key:"instanceId",header:"instance"},{key:"containerDeleted",header:"container"},{key:"completed",header:"completed"}],xh=[{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"}],Ah=[{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:"canUpdate",header:"update"},{key:"canUninstall",header:"uninstall"},{key:"activeJobId",header:"job"}],kh=[{key:"id",header:"job"},{key:"appId",header:"app"},{key:"operation",header:"operation"},{key:"state",header:"state"},{key:"phase",header:"phase"},{key:"updatedAt",header:"updated"}],Sh=new Set(["succeeded","failed","cancelled","interrupted"]);async function Ch(e,t,n,i){let o=i;const a=Date.now()+18e5;for(;!Sh.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),Cg(e.signal),o=(await t.client.apps.job(n,o.id,e.signal)).job}return o}function jh(e){return async(t,n)=>{const i=hh(n),o=jg(n,"appId"),s=Rg(n,"request-id")??a.randomUUID(),r=!0===n.options.wait,d=await vg(t),c=await Sg(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 Ph(0,r?await Ch(t,d,i,c.job):c.job,!0===n.options.logs)}}const Rh=jh("install"),Th=jh("uninstall"),$h=jh("update"),Eh=[{key:"id",header:"app"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"description",header:"description",width:60}];function Ph(e,t,n=!1){const i=function(e){return"succeeded"===e.state?`App \`${e.appId}\` ${e.operation} succeeded.`:Sh.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:kh,message:`${i}\n${t.logTail.trimEnd()}`}:{data:t,columns:kh,message:i}}const Oh=[{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}],Nh=[{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 _h(e){return e.map(e=>({...e,capabilities:Array.isArray(e.capabilities)?e.capabilities.join(","):"",lastSeenAt:"string"==typeof e.lastSeenAt?e.lastSeenAt:""}))}function Uh(e,t){if("string"!=typeof e||!e.trim())throw new h("CLI_ARGUMENT_MISSING",`Missing required argument <${t}>.`,2);return e.trim()}function Dh(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 Lh(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 qh(e){const t=e.store.select(e.profileLabel);return eg({store:e.store,profile:t,fetchImpl:e.fetchImpl,withSession:!1})}async function Mh(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 Bh(e){const{store:t,fetchImpl:n,output:i}=e,o=await qh({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(Dh("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(Dh("Authorization complete","You can close this tab and return to the terminal.")),void(s||(s=!0,i({code:r,state:d})))):(t.end(Dh("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:Fu(),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??Lh)(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 Mh(o,c,"browser"),{profile:o.profile,session:c.session}}finally{s.close()}}function Fh(e){const t=(e.args??[]).map(e=>e.required?`<${e.name}>`:`[${e.name}]`);return["thctl",e.id,...t].join(" ")}function Hh(e){return{id:e.id,group:e.group,summary:e.summary,stage:e.stage,implemented:Boolean(e.handler),write:Boolean(e.write),usage:Fh(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 Vh(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 Gh=[{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"}],Wh=[{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 Yh(e,t){return e.output.json?{data:t}:{data:Kh([t])[0],columns:Gh}}function Kh(e){return e.map(e=>({...e,documents:Array.isArray(e.documents)?`${e.documents.length}`:"0",archivedAt:"string"==typeof e.archivedAt?e.archivedAt:""}))}async function Jh(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 Zh(e){return async(t,n)=>{const i=jg(n,"storyId"),o=await vg(t),a=await Jh(o,i,Rg(n,"node"));if("remove"===e){const e=await Sg(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 Sg(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{...Yh(t,s),message:`Story \`${i}\` ${"archive"===e?"archived":"restored"}.`}}}const Qh=Zh("archive"),Xh=Zh("restore"),ez=Zh("remove"),tz=[{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 nz(e,t){return e.output.json?{data:t}:{data:t,columns:tz}}const iz=ti.omit({storyId:!0});function oz(e){return async(t,n)=>{const i=jg(n,"storyId"),o=jg(n,"automationId"),a=await vg(t),s=await Jh(a,i,Rg(n,"node")),r=await Sg(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 az=oz(!0),sz=oz(!1);function rz(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 dz=[{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 cz(e){return{...e,deploymentCount:Array.isArray(e.deployments)?e.deployments.length:0}}const lz={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===Ls.safeParse(e).data?.folderPlaces}},localFolderNameUpdate:{name:"localFolderNameUpdate",check:function(e){return!0===Ls.safeParse(e).data?.localFolderNameUpdate}}};function mz(e){const t=e?.capabilities?.agent;if(t&&"object"==typeof t&&!Array.isArray(t))return t.capabilities}async function pz(e,t,n){return{nodeId:t,capabilities:mz(await e.resources.node(t,n))}}function uz(e,t,n){if(t&&!n.check(t.capabilities))throw f(e,n.name,{nodeId:t.nodeId,scope:"node"})}async function gz(e,t,n,i,o){const a=(await e.resources.instanceBoard(o)).find(e=>e.id===t);a&&uz(n,await pz(e,a.nodeId,o),i)}const hz={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}}},zz=[{key:"id",header:"user"},{key:"displayName",header:"name",width:24},{key:"primaryUsername",header:"username"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],fz=[{key:"id",header:"session"},{key:"clientType",header:"client"},{key:"createdAt",header:"created"},{key:"expiresAt",header:"expires"},{key:"lastUsedAt",header:"last used"}],yz=[{key:"id",header:"role"},{key:"name",header:"name",width:24},{key:"builtin",header:"builtin"},{key:"updatedAt",header:"updated"}],Iz=[{key:"id",header:"permission"},{key:"description",header:"description",width:48}],bz=[{key:"id",header:"provider"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"enabled",header:"enabled"}],wz=[{key:"id",header:"approval"},{key:"displayName",header:"name",width:24},{key:"email",header:"email",width:30},{key:"status",header:"status"}];async function vz(e,t,n){const i=await vg(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 xz(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 Az(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 kz(e){const t=e.trim();return t.endsWith("/")?t:`${t}/`}const Sz="taskhandoff",Cz=["task-handoff","task-handoff-nodes"],jz="SKILL.md",Rz=".thandoff-skill.json",Tz=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(),$z=o.z.object({skills:o.z.array(Tz).min(1).max(100)}).loose(),Ez=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 Pz(e){return a.createHash("sha256").update(e).digest("hex")}function Oz(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 Nz(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,Sz)}}const r="user"===s?i.join(o,".agents","skills"):i.join(e,".agents","skills");return{scope:s,root:r,directory:i.join(r,Sz)}}function _z(e,t={},i=n.homedir()){return t.dir?.trim()||t.scope?.trim()?[Nz(e,t,i)]:[Nz(e,{scope:"user"},i),Nz(e,{scope:"project"},i)]}async function Uz(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=$z.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===Sz);if(!a)throw I(`The skill index ${t} does not publish \`${Sz}\`; the CLI and the published skill are out of sync.`,{indexUrl:t,expected:Sz});const s=[...new Set(a.files.map(Oz))];if(!s.includes(jz))throw I(`The skill index entry for \`${Sz}\` does not declare ${jz}.`,{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 Dz(e,t){if(e.thctl&&!Lz(t,e.thctl))throw new h("CLI_SKILL_REQUIRES_NEWER_CLI",`Skill \`${Sz}\` ${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 Lz(e,t){return!t||!xz(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 qz(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=Pz(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 Mz(e){if(!t.existsSync(e))return{directory:e,exists:!1,managed:!1,modified:null};const n=function(e){try{const n=Ez.safeParse(JSON.parse(t.readFileSync(function(e){return i.join(e,Rz)}(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,jz),"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:Hz(e,n),contentSignature:Bz(n.files)}}function Bz(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 Fz(e,t){if(!e.exists)return!1;const n=Bz(t.integrity),i=e.contentSignature;return void 0!==n&&void 0!==i?n!==i:void 0===e.version||Az(e.version,t.version)}function Hz(e,n){const o=new Set(Object.keys(n.files));for(const[o,a]of Object.entries(n.files))try{if(Pz(t.readFileSync(i.join(e,...o.split("/"))))!==a)return!0}catch{return!0}try{return Vz(e).some(e=>!o.has(e))}catch{return!0}}function Vz(e,n=""){const o=t.readdirSync(i.join(e,n),{withFileTypes:!0}),a=[];for(const t of o){if(t.name===Rz)continue;const i=n?`${n}/${t.name}`:t.name;t.isDirectory()?a.push(...Vz(e,i)):a.push(i)}return a}function Gz(e){return Cz.map(t=>i.join(e,t)).filter(e=>t.existsSync(e))}function Wz(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-${Sz}-`)),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:Sz,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,Rz),`${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 Yz(e,t){const n=e.options[t];return"string"==typeof n&&n.trim()?n.trim():void 0}function Kz(e){return{scope:Yz(e,"scope"),dir:Yz(e,"dir")}}function Jz(e){return Uz({fetchImpl:e.fetchImpl,env:e.env,timeoutMs:5e3})}function Zz(e,t,n,i,o){const a=n?Lz(i,n.entry.thctl):void 0,s=void 0!==n&&t.exists&&Fz(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 Qz(e){const t=Gz(e.root);return t.length?` Legacy skill directories remain: ${t.join(", ")}; remove them after verifying the new copy.`:""}const Xz=o.z.looseObject({}),ef=o.z.object({}).strict();function tf(e){return o.z.object(e).strict()}function nf(e,t,n,i={}){return{name:e,summary:t,leaves:n,...i.flat?{flat:!0}:{}}}const of=[{key:"id",header:"node"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"health",header:"health"},{key:"connectionMode",header:"connection"}],af=[{key:"id",header:"folder"},{key:"name",header:"name",width:24},{key:"path",header:"path",width:48},{key:"updatedAt",header:"updated"}],sf=[{key:"id",header:"runtime"},{key:"name",header:"name",width:24},{key:"type",header:"type"},{key:"status",header:"status"},{key:"version",header:"version"}],rf=[{key:"reference",header:"reference",width:48},{key:"id",header:"image id",width:24},{key:"sizeBytes",header:"size"},{key:"createdAt",header:"created"}],df=[{key:"id",header:"job"},{key:"status",header:"status"},{key:"fromVersion",header:"from"},{key:"toVersion",header:"to"},{key:"updatedAt",header:"updated"}],cf=[{key:"keyId",header:"key id"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"}],lf=[{key:"id",header:"connection"},{key:"controlPlaneName",header:"control plane",width:24},{key:"controlPlaneUrl",header:"url",width:40},{key:"status",header:"status"}];function mf(e){return jg(e,"nodeId")}async function pf(e,t,n,i){const o=await vg(e);if(i.length){const a=await pz(o.client,t,e.signal);for(const e of i)uz(n,a,e)}return o}const uf=new Set(["succeeded","degraded","failed"]),gf={folders:o.z.array(yd),folderTree:o.z.array(Sc),folderPlaces:o.z.array(Cc),runtimes:o.z.array(lc),dockerImages:o.z.array(o.z.looseObject({reference:o.z.string().optional(),id:o.z.string().optional()})),imageOptions:o.z.array(kc),externalListener:uc,modelRelay:fc,updateJobs:o.z.array(md),pairingInvite:Ic,pairings:o.z.array(bc),connections:o.z.array(wc),connectionCreate:vc,nodeRemove:xc};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 hf={name:"nodeId",description:"Node ID",required:!0},zf={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},ff=[{id:"node create",group:"node",name:"create",stage:"B",write:!0,summary:"Create a node record from a JSON request body",options:[zf],input:tf({config:o.z.string()}),output:gf.nodeRemove,outputPinned:!1,handler:async function(e,t){const n=Ng(t,"Node create request"),i=await vg(e),o=await Sg(e,"node create",()=>({method:"POST",path:"/api/nodes",body:n}),()=>i.client.nodeAdmin.createNode(n));if(o)return{data:o,columns:of,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:[hf],options:[{flags:"--force",description:"Force removal when the node is still reachable"}],input:tf({nodeId:o.z.string(),force:o.z.boolean().optional()}),output:gf.nodeRemove,handler:async function(e,t){const n=mf(t),i=!0===t.options.force,o=await vg(e),a=await Sg(e,"node remove",()=>({method:"DELETE",path:`/api/nodes/${encodeURIComponent(n)}${i?"?force=true":""}`}),()=>Hu(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:[hf],input:tf({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=mf(t),i=await vg(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:ef,output:Xz,outputPinned:!1,handler:async function(e){const t=await vg(e),n=await Sg(e,"node sync-local",()=>({method:"POST",path:"/api/nodes/local/sync"}),()=>t.client.nodeAdmin.syncLocalNode());if(n)return{data:n,columns:of,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:[hf],input:tf({nodeId:o.z.string()}),output:o.z.array(yd),handler:async function(e,t){const n=mf(t),i=await vg(e),o=await i.client.nodeAdmin.listFolders(n,e.signal);return e.output.json?{data:o}:{data:o,columns:af,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:[hf],options:[{flags:"--path <path>",description:"Subtree root inside the node filesystem"},{flags:"--depth <depth>",description:"Maximum tree depth"}],input:tf({nodeId:o.z.string(),path:o.z.string().optional(),depth:o.z.string().optional()}),output:o.z.array(Sc),handler:async function(e,t){const n=mf(t),i=Rg(t,"path"),o=Rg(t,"depth"),a=await vg(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:[hf],options:[zf],input:tf({nodeId:o.z.string(),config:o.z.string()}),output:yd,handler:async function(e,t){const n=mf(t),i=Ng(t,"Folder create request"),o=await pf(e,n,"node folders add",[lz.localFolderPlaces]),a=await Sg(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:af,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:[hf,{name:"folderId",description:"Local folder ID",required:!0}],options:[zf],input:tf({nodeId:o.z.string(),folderId:o.z.string(),config:o.z.string()}),output:yd,handler:async function(e,t){const n=mf(t),i=jg(t,"folderId"),o=Ng(t,"Folder update request"),a=await pf(e,n,"node folders update",[lz.localFolderPlaces,lz.localFolderNameUpdate]),s=await Sg(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:af,message:`Folder \`${i}\` updated.`}}},{id:"node folders remove",group:"node",name:"folders remove",stage:"B",write:!0,summary:"Remove a node local folder",args:[hf,{name:"folderId",description:"Local folder ID",required:!0}],input:tf({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=mf(t),i=jg(t,"folderId"),o=await pf(e,n,"node folders remove",[lz.localFolderPlaces]),a=await Sg(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:[hf],input:tf({nodeId:o.z.string()}),output:o.z.array(lc),handler:async function(e,t){const n=mf(t),i=await vg(e),o=await i.client.nodeAdmin.listRuntimes(n,e.signal);return e.output.json?{data:o}:{data:o,columns:sf,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:[hf],options:[zf],input:tf({nodeId:o.z.string(),config:o.z.string()}),output:lc,handler:async function(e,t){const n=mf(t),i=Ng(t,"Runtime create request"),o=await vg(e),a=await Sg(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:sf,message:`Runtime \`${a.id}\` created.`}}},{id:"node runtimes update",group:"node",name:"runtimes update",stage:"B",write:!0,summary:"Update a node runtime",args:[hf,{name:"runtimeId",description:"Runtime ID",required:!0}],options:[zf],input:tf({nodeId:o.z.string(),runtimeId:o.z.string(),config:o.z.string()}),output:lc,handler:async function(e,t){const n=mf(t),i=jg(t,"runtimeId"),o=Ng(t,"Runtime update request"),a=await vg(e),s=await Sg(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:sf,message:`Runtime \`${i}\` updated.`}}},{id:"node runtimes remove",group:"node",name:"runtimes remove",stage:"B",write:!0,summary:"Remove a node runtime",args:[hf,{name:"runtimeId",description:"Runtime ID",required:!0}],input:tf({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=mf(t),i=jg(t,"runtimeId"),o=await vg(e),a=await Sg(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:[hf,{name:"runtimeId",description:"Runtime ID",required:!0}],input:tf({nodeId:o.z.string(),runtimeId:o.z.string()}),output:lc,outputPinned:!1,handler:async function(e,t){const n=mf(t),i=jg(t,"runtimeId"),o=await vg(e),a=await o.client.nodeAdmin.checkRuntime(n,i);return e.output.json?{data:a}:{data:a,columns:sf}}},{id:"node docker images",group:"node",name:"docker images",stage:"B",summary:"List docker images available on a node",args:[hf],input:tf({nodeId:o.z.string()}),output:gf.dockerImages,outputPinned:!1,handler:async function(e,t){const n=mf(t),i=await vg(e),o=await i.client.nodeAdmin.listDockerImages(n,e.signal);return e.output.json?{data:o}:{data:o,columns:rf,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:[hf],input:tf({nodeId:o.z.string()}),output:gf.imageOptions,handler:async function(e,t){const n=mf(t),i=await vg(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:[hf],input:tf({nodeId:o.z.string()}),output:gf.externalListener,handler:async function(e,t){const n=mf(t),i=await vg(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:[hf],options:[zf],input:tf({nodeId:o.z.string(),config:o.z.string()}),output:gf.externalListener,handler:async function(e,t){const n=mf(t),i=Ng(t,"External listener update request"),o=await vg(e),a=await Sg(e,"node settings external-listener set",()=>({method:"PATCH",path:`/api/nodes/${encodeURIComponent(n)}/settings/external-listener`,body:i}),()=>Hu(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:[hf],input:tf({nodeId:o.z.string()}),output:gf.modelRelay,handler:async function(e,t){const n=mf(t),i=await vg(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:"unknownModelPolicy",header:"unknownModelPolicy"}]}}},{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:[hf],options:[zf],input:tf({nodeId:o.z.string(),config:o.z.string()}),output:gf.modelRelay,handler:async function(e,t){const n=mf(t),i=Ng(t,"Model relay update request"),o=await pf(e,n,"node settings model-relay set",[lz.modelRelay]),a=await Sg(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:[hf],input:tf({nodeId:o.z.string()}),output:o.z.array(md),handler:async function(e,t){const n=mf(t),i=await vg(e),o=await i.client.nodeAdmin.updateJobs(n,e.signal);return e.output.json?{data:o}:{data:o,columns:df,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:[hf],options:[{flags:"--config <file>",description:"Update check request JSON (optional)"}],input:tf({nodeId:o.z.string(),config:o.z.string().optional()}),output:ld,handler:async function(e,t){const n=mf(t),i=Rg(t,"config")?Ng(t,"Update check request"):{},o=await vg(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:[hf],options:[zf,{flags:"--wait",description:"Poll the update job until it reaches a terminal state"}],input:tf({nodeId:o.z.string(),config:o.z.string(),wait:o.z.boolean().optional()}),output:md,handler:async function(e,t){const n=mf(t),i=Ng(t,"Update apply request"),o=!0===t.options.wait,a=await vg(e),s=await Sg(e,"node updates apply",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/updates/apply`,body:i}),()=>Hu(a,()=>a.client.nodeAdmin.applyUpdate(n,i)));if(!s)return;if(!o)return{data:s,columns:df,message:`Update job \`${s.id}\` queued (status ${s.status}).`};let r=s;for(;;){if(uf.has(r.status))return{data:r,columns:df,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:[hf],options:[{flags:"--config <file>",description:"Pairing invite request JSON (optional)"}],input:tf({nodeId:o.z.string(),config:o.z.string().optional()}),output:gf.pairingInvite,handler:async function(e,t){const n=mf(t),i=Rg(t,"config")?Ng(t,"Pairing invite request"):{},o=await vg(e),a=await Sg(e,"node pairing invite",()=>({method:"POST",path:`/api/nodes/${encodeURIComponent(n)}/pairing/invites`,body:i}),()=>o.client.nodeAdmin.createPairingInvite(n,i));if(a)return hg(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:[hf],input:tf({nodeId:o.z.string()}),output:gf.pairings,handler:async function(e,t){const n=mf(t),i=await vg(e),o=await i.client.nodeAdmin.listControlPlanePairings(n,e.signal);return e.output.json?{data:o}:{data:o,columns:cf,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:[hf,{name:"keyId",description:"Pairing key ID",required:!0}],input:tf({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=mf(t),i=jg(t,"keyId"),o=await vg(e),a=await Sg(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:[hf],input:tf({nodeId:o.z.string()}),output:gf.connections,handler:async function(e,t){const n=mf(t),i=await vg(e),o=await i.client.nodeAdmin.listControlPlaneConnections(n,e.signal);return e.output.json?{data:o}:{data:o,columns:lf,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:[hf],options:[zf],input:tf({nodeId:o.z.string(),config:o.z.string()}),output:gf.connectionCreate,handler:async function(e,t){const n=mf(t),i=Ng(t,"Connection create request"),o=await vg(e),a=await Sg(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:lf,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:[hf,{name:"connectionId",description:"Connection ID",required:!0}],input:tf({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=mf(t),i=jg(t,"connectionId"),o=await vg(e),a=await Sg(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}\`.`}}}],yf=nf("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:tf({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=Rg(t,"config")?Ng(t,"Join invite request"):{},i=await vg(e),o=await Sg(e,"node-join invite",()=>({method:"POST",path:"/api/node-join/invites",body:n}),()=>i.client.nodeAdmin.createJoinInvite(n));if(o)return hg(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:tf({inviteId:o.z.string()}),output:rc,handler:async function(e,t){const n=jg(t,"inviteId"),i=await vg(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:[zf],input:tf({config:o.z.string()}),output:Xz,outputPinned:!1,handler:async function(e,t){const n=Ng(t,"Join completion request"),i=await vg(e),o=await Sg(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.`}}}]),If=[{key:"id",header:"project"},{key:"name",header:"name",width:24},{key:"defaultNodeId",header:"node"},{key:"updatedAt",header:"updated"}],bf=[{key:"id",header:"image"},{key:"name",header:"name",width:24},{key:"reference",header:"reference",width:40},{key:"pullPolicy",header:"pull"}],wf=[{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"}],vf=[{key:"id",header:"model"},{key:"name",header:"name",width:24},{key:"model",header:"model id",width:30},{key:"referenceCount",header:"refs"}],xf=[{key:"id",header:"template"},{key:"name",header:"name",width:24},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],Af=[{key:"id",header:"credential"},{key:"name",header:"name",width:24},{key:"kind",header:"kind"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],kf=[{key:"credentialId",header:"credential"},{key:"instanceId",header:"instance"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}];async function Sf(e,t,n){return!0!==e.options["token-stdin"]||n(t,await _g(e)),t}const Cf=[{key:"id",header:"bridge"},{key:"channel",header:"channel"},{key:"name",header:"name",width:24},{key:"running",header:"running"},{key:"tokenSet",header:"token"}],jf=[{key:"id",header:"session"},{key:"channel",header:"channel"},{key:"bridgeId",header:"bridge"},{key:"chatId",header:"chat"},{key:"updatedAt",header:"updated"}],Rf=[{key:"id",header:"session"},{key:"userAgent",header:"client",width:30},{key:"createdAt",header:"created"},{key:"expiresAt",header:"expires"}];async function Tf(e,t){const n=Ng(e,t);if(!0===e.options["token-stdin"]){const t=await _g(e);n.token=t,hg(t)}return n}const $f=[{key:"publicBaseUrl",header:"public base url",width:40},{key:"updateChannel",header:"channel"},{key:"mentionTrigger",header:"mention"},{key:"commandTrigger",header:"command"},{key:"diagnosticLogs",header:"logs"}],Ef=[{key:"id",header:"invite"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"},{key:"createdAt",header:"created"}],Pf=[{key:"id",header:"binding"},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"updatedAt",header:"updated"}],Of=[{key:"id",header:"claim"},{key:"nodeId",header:"node"},{key:"status",header:"status"},{key:"expiresAt",header:"expires"}],Nf=[{key:"bindingId",header:"binding"},{key:"activeHttp",header:"http"},{key:"activeStreams",header:"streams"},{key:"activeWebSockets",header:"websockets"}],_f={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},Uf={output:Xz,outputPinned:!1},Df=nf("project","Manage catalog projects",[{id:"project list",group:"project",name:"list",stage:"B",summary:"List projects",input:ef,output:o.z.array(Cd),handler:async function(e){const t=await vg(e),n=await t.client.catalog.listProjects(e.signal);return e.output.json?{data:n}:{data:n,columns:If,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:tf({projectId:o.z.string()}),output:Cd,handler:async function(e,t){const n=jg(t,"projectId"),i=await vg(e),o=await i.client.catalog.getProject(n,e.signal);return e.output.json?{data:o}:{data:o,columns:If}}},{id:"project create",group:"project",name:"create",stage:"B",write:!0,summary:"Create a project from a JSON request body",options:[_f],input:tf({config:o.z.string()}),output:Cd,handler:async function(e,t){const n=Ng(t,"Project create request"),i=await vg(e),o=await Sg(e,"project create",()=>({method:"POST",path:"/api/projects",body:n}),()=>i.client.catalog.createProject(n));if(o)return{data:o,columns:If,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:[_f],input:tf({projectId:o.z.string(),config:o.z.string()}),output:Cd,handler:async function(e,t){const n=jg(t,"projectId"),i=Ng(t,"Project update request"),o=await vg(e),a=await Sg(e,"project update",()=>({method:"PATCH",path:`/api/projects/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateProject(n,i));if(a)return{data:a,columns:If,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:tf({projectId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"projectId"),i=await vg(e),o=await Sg(e,"project remove",()=>({method:"DELETE",path:`/api/projects/${encodeURIComponent(n)}`}),()=>i.client.catalog.removeProject(n));if(o)return{data:o,message:`Project \`${n}\` removed.`}}}]),Lf=nf("image","Manage custom images",[{id:"image list",group:"image",name:"list",stage:"B",summary:"List custom images",input:ef,output:o.z.array(Jd),handler:async function(e){const t=await vg(e),n=await t.client.catalog.listImages(e.signal);return e.output.json?{data:n}:{data:n,columns:bf,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:tf({imageId:o.z.string()}),output:Jd,handler:async function(e,t){const n=jg(t,"imageId"),i=await vg(e),o=await i.client.catalog.getImage(n,e.signal);return e.output.json?{data:o}:{data:o,columns:bf}}},{id:"image create",group:"image",name:"create",stage:"B",write:!0,summary:"Create a custom image from a JSON request body",options:[_f],input:tf({config:o.z.string()}),output:Jd,handler:async function(e,t){const n=Ng(t,"Image create request"),i=await vg(e),o=await Sg(e,"image create",()=>({method:"POST",path:"/api/images",body:n}),()=>i.client.catalog.createImage(n));if(o)return{data:o,columns:bf,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:[_f],input:tf({imageId:o.z.string(),config:o.z.string()}),output:Jd,handler:async function(e,t){const n=jg(t,"imageId"),i=Ng(t,"Image update request"),o=await vg(e),a=await Sg(e,"image update",()=>({method:"PATCH",path:`/api/images/${encodeURIComponent(n)}`,body:i}),()=>o.client.catalog.updateImage(n,i));if(a)return{data:a,columns:bf,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:tf({imageId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"imageId"),i=await vg(e),o=await Sg(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:ef,...Uf,handler:async function(e){const t=await vg(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}]}}}]),qf=nf("market","Inspect the market catalog",[{id:"market catalog",group:"market",name:"catalog",stage:"B",summary:"Show the market catalog snapshot",input:ef,...Uf,handler:async function(e){const t=await vg(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:ef,...Uf,handler:async function(e){const t=await vg(e),n=await Sg(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).`}}}]),Mf=[{id:"model create",group:"model",name:"create",stage:"B",write:!0,summary:"Create a model from a JSON request body",options:[_f],input:tf({config:o.z.string()}),...Uf,handler:async function(e,t){const n=Ng(t,"Model create request"),i=await vg(e),o=await Sg(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:[_f],input:tf({modelId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"modelId"),i=Ng(t,"Model copy request"),o=await vg(e),a=await Sg(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:[_f],input:tf({config:o.z.string()}),...Uf,handler:async function(e,t){const n=Ng(t,"Model discovery request"),i=await vg(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:[_f],input:tf({config:o.z.string()}),...Uf,handler:async function(e,t){const n=Ng(t,"Model test request"),i=await vg(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:tf({id:o.z.array(o.z.string()).optional()}),...Uf,handler:async function(e,t){const n=$g(t,"id");if(!n.length)throw Tg(t,"id");const i=await vg(e),o=await Sg(e,"model reorder",()=>({method:"POST",path:"/api/models/reorder",body:{ids:n}}),()=>i.client.catalog.reorderModels(n));if(o)return{data:o,columns:wf,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:[_f],input:tf({modelId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"modelId"),i=Ng(t,"Model update request"),o=await vg(e),a=await Sg(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:tf({modelId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"modelId"),i=await vg(e),o=await Sg(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:[_f],input:tf({modelId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"modelId"),i=Ng(t,"Model merge request"),o=await vg(e),a=await Sg(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:tf({modelId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"modelId"),i=await vg(e),o=await Sg(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:tf({nodeId:o.z.string()}),output:o.z.array(Rd),handler:async function(e,t){const n=jg(t,"nodeId"),i=await vg(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:vf,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:[_f],input:tf({nodeId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"nodeId"),i=Ng(t,"Node model create request"),o=await vg(e),a=await Sg(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:[_f],input:tf({nodeId:o.z.string(),modelId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"nodeId"),i=jg(t,"modelId"),o=Ng(t,"Node model update request"),a=await vg(e),s=await Sg(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:tf({nodeId:o.z.string(),modelId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"nodeId"),i=jg(t,"modelId"),o=await vg(e),a=await Sg(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:[_f],input:tf({nodeId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"nodeId"),i=Ng(t,"Node model discovery request"),o=await vg(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:[_f],input:tf({nodeId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"nodeId"),i=Ng(t,"Node model test request"),o=await vg(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.`}}}],Bf=[Df,Lf,qf,nf("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:tf({nodeId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"nodeId"),i=await vg(e),o=await i.client.environmentTemplates.listForNode(n,e.signal);return e.output.json?{data:o}:{data:o,columns:xf,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:tf({nodeId:o.z.string(),templateId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"nodeId"),i=jg(t,"templateId"),o=await vg(e),a=await o.client.environmentTemplates.get(n,i,e.signal);return e.output.json?{data:a}:{data:a,columns:xf}}},{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:[_f],input:tf({instanceId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"instanceId"),i=Ng(t,"Environment template create request"),o=await vg(e),a=await Sg(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:xf,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:tf({nodeId:o.z.string(),templateId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"nodeId"),i=jg(t,"templateId"),o=await vg(e),a=await Sg(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}\`.`}}}]),nf("git-credential","Manage managed git credentials",[{id:"git-credential list",group:"git-credential",name:"list",stage:"B",summary:"List git credentials",input:ef,output:o.z.looseObject({items:o.z.array(xs)}),handler:async function(e){const t=await vg(e),n=await t.client.gitCredentials.listCredentials(e.signal);return e.output.json?{data:n}:{data:n.items,columns:Af,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:tf({credentialId:o.z.string()}),output:xs,handler:async function(e,t){const n=jg(t,"credentialId"),i=await vg(e),o=await i.client.gitCredentials.getCredential(n,e.signal);return e.output.json?{data:o}:{data:o,columns:Af}}},{id:"git-credential create",group:"git-credential",name:"create",stage:"B",write:!0,summary:"Create a git credential from a JSON request body",options:[_f],input:tf({config:o.z.string()}),output:xs,handler:async function(e,t){const n=await Sf(t,Ng(t,"Git credential create request"),(e,t)=>{const n=e.secret&&"object"==typeof e.secret?e.secret:{};e.secret={...n,token:t}}),i=await vg(e),o=await Sg(e,"git-credential create",()=>({method:"POST",path:"/api/git-credentials",body:n}),()=>i.client.gitCredentials.createCredential(n));if(o)return{data:o,columns:Af,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:[_f],input:tf({credentialId:o.z.string(),config:o.z.string()}),output:xs,handler:async function(e,t){const n=jg(t,"credentialId"),i=await Sf(t,Ng(t,"Git credential update request"),(e,t)=>{const n=e.secret&&"object"==typeof e.secret?e.secret:{};e.secret={...n,token:t}}),o=await vg(e),a=await Sg(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:Af,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:tf({credentialId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"credentialId"),i=await vg(e),o=await Sg(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:tf({instanceId:o.z.string()}),output:o.z.array(js),handler:async function(e,t){const n=jg(t,"instanceId"),i=await vg(e);await gz(i.client,n,"git-credential assignments list",lz.managedGitCredentials,e.signal);const o=await i.client.gitCredentials.listInstanceAssignments(n,e.signal);return e.output.json?{data:o}:{data:o,columns:kf,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:tf({instanceId:o.z.string(),credential:o.z.string()}),output:js,handler:async function(e,t){const n=jg(t,"instanceId"),i=Tg(t,"credential"),o=await vg(e);await gz(o.client,n,"git-credential assignments assign",lz.managedGitCredentials,e.signal);const a=await Sg(e,"git-credential assignments assign",()=>({method:"POST",path:`/api/controlled-instances/${encodeURIComponent(n)}/git-credential-assignments`,body:{credentialId:i}}),()=>Hu(o,()=>o.client.gitCredentials.assignToInstance(n,{credentialId:i})));if(a)return{data:a,columns:kf,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:tf({instanceId:o.z.string(),credentialId:o.z.string()}),output:o.z.looseObject({revoked:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"credentialId"),o=await vg(e);await gz(o.client,n,"git-credential assignments unassign",lz.managedGitCredentials,e.signal);const a=await Sg(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}\`.`}}}]),nf("chat","Manage the chat gateway",[{id:"chat status",group:"chat",name:"status",stage:"B",summary:"Show the chat gateway status",input:ef,...Uf,handler:async function(e){const t=await vg(e),n=await t.client.chatGateway.status(e.signal);return e.output.json?{data:n}:{data:n.bridges,columns:Cf,message:`Chat gateway ${n.running?"running":"stopped"}.`}}},{id:"chat bridges list",group:"chat",name:"bridges list",stage:"B",summary:"List chat bridges",input:ef,...Uf,handler:async function(e){const t=await vg(e),n=await t.client.chatGateway.listBridges(e.signal);return e.output.json?{data:n}:{data:n,columns:Cf,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:[_f],input:tf({config:o.z.string()}),...Uf,handler:async function(e,t){const n=await Tf(t,"Chat bridge create request"),i=await vg(e),o=await Sg(e,"chat bridges create",()=>({method:"POST",path:"/api/chat-gateway/bridges",body:n}),()=>i.client.chatGateway.createBridge(n));if(o)return{data:o,columns:Cf,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:[_f],input:tf({bridgeId:o.z.string(),config:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"bridgeId"),i=await Tf(t,"Chat bridge update request"),o=await vg(e),a=await Sg(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:Cf,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:tf({bridgeId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"bridgeId"),i=await vg(e),o=await Sg(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:tf({bridgeId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"bridgeId"),i=await vg(e),o=await Sg(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:tf({bridgeId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"bridgeId"),i=await vg(e),o=await Sg(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:ef,...Uf,handler:async function(e){const t=await vg(e),n=await t.client.chatGateway.listSessions(e.signal);return e.output.json?{data:n}:{data:n,columns:jf,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:tf({sessionId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"sessionId"),i=await vg(e),o=await i.client.chatGateway.getSession(n,e.signal);return e.output.json?{data:o}:{data:o,columns:jf}}}]),nf("mobile-session","Manage mobile sessions",[{id:"mobile-session list",group:"mobile-session",name:"list",stage:"B",summary:"List mobile sessions",input:ef,output:o.z.array(Qo),handler:async function(e){const t=await vg(e),n=await t.client.auth.mobileSessions(e.signal);return e.output.json?{data:n}:{data:n,columns:Rf,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:tf({sessionId:o.z.string()}),output:o.z.looseObject({revoked:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"sessionId"),i=await vg(e),o=await Sg(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.`}}}]),nf("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:ef,...Uf,handler:async function(e){const t=await vg(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:ef,...Uf,handler:async function(e){const t=await vg(e),n=await t.client.admin.getSettings(e.signal);return e.output.json?{data:n}:{data:n,columns:$f}}},{id:"control-plane settings update",group:"control-plane",name:"settings update",stage:"B",write:!0,summary:"Update Control Plane settings",options:[_f],input:tf({config:o.z.string()}),...Uf,handler:async function(e,t){const n=Ng(t,"Control Plane settings update request"),i=await vg(e),o=await Sg(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:$f,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:tf({out:o.z.string()}),output:o.z.looseObject({file:o.z.string(),bytes:o.z.number()}),handler:async function(e,n){const o=Tg(n,"out"),a=await vg(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).`}}}]),nf("cloud","Manage the cloud connectivity binding",[{id:"cloud show",group:"cloud",name:"show",stage:"B",summary:"Show cloud connectivity state",input:ef,...Uf,handler:async function(e){const t=await vg(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:ef,...Uf,handler:async function(e){const t=await vg(e),n=await Sg(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:tf({enabled:o.z.string()}),...Uf,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 vg(e),o=await Sg(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:ef,...Uf,handler:async function(e){const t=await vg(e),n=await Sg(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}.`}}}]),nf("proxy","Manage the control-plane proxy",[{id:"proxy invites list",group:"proxy",name:"invites list",stage:"B",summary:"List proxy invites",input:ef,...Uf,handler:async function(e){const t=await vg(e),n=await t.client.admin.proxyInvites(e.signal);return e.output.json?{data:n}:{data:n,columns:Ef,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:[_f],input:tf({config:o.z.string()}),...Uf,handler:async function(e,t){const n=Ng(t,"Proxy invite create request"),i=await vg(e),o=await Sg(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:Ef,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:tf({inviteId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"inviteId"),i=await vg(e),o=await Sg(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:ef,...Uf,handler:async function(e){const t=await vg(e),n=await t.client.admin.proxyBindings(e.signal);return e.output.json?{data:n}:{data:n,columns:Pf,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:tf({bindingId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"bindingId"),i=await vg(e),o=await Sg(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:ef,...Uf,handler:async function(e){const t=await vg(e),n=await t.client.admin.proxyDiagnostics(e.signal);return e.output.json?{data:n}:{data:n,columns:Nf,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:ef,...Uf,handler:async function(e){const t=await vg(e),n=await t.client.admin.pendingProxyClaims(e.signal);return e.output.json?{data:n}:{data:n,columns:Of,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:tf({claimId:o.z.string()}),...Uf,handler:async function(e,t){const n=jg(t,"claimId"),i=await vg(e),o=await Sg(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:tf({claimId:o.z.string(),force:o.z.boolean().optional()}),...Uf,handler:async function(e,t){const n=jg(t,"claimId"),i=!0===t.options.force,o=await vg(e),a=await Sg(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.`}}}])],Ff={flags:"--config <file>",description:"Request body as a JSON file (Control Plane wire body)"},Hf=[{id:"user create",group:"user",name:"create",stage:"B",write:!0,summary:"Create a local user",options:[Ff],input:tf({config:o.z.string()}),output:Do,handler:async function(e,t){const n=Ng(t,"User create request"),i=await vz(e,"user create",hz.userManagement),o=await Sg(e,"user create",()=>({method:"POST",path:"/api/users",body:n}),()=>i.client.users.create(n));if(o)return{data:o,columns:zz,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:[Ff],input:tf({userId:o.z.string(),config:o.z.string()}),output:Do,handler:async function(e,t){const n=jg(t,"userId"),i=Ng(t,"User update request"),o=await vz(e,"user update",hz.userManagement),a=await Sg(e,"user update",()=>({method:"PATCH",path:`/api/users/${encodeURIComponent(n)}`,body:i}),()=>o.client.users.update(n,i));if(a)return{data:a,columns:zz,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:[Ff],input:tf({userId:o.z.string(),config:o.z.string()}),output:Do,handler:async function(e,t){const n=jg(t,"userId"),i=Ng(t,"User access request"),o=await vz(e,"user access",hz.userManagement),a=await Sg(e,"user access",()=>({method:"PUT",path:`/api/users/${encodeURIComponent(n)}/access`,body:i}),()=>Hu(o,()=>o.client.users.setAccess(n,i)));if(a)return{data:a,columns:zz,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:tf({userId:o.z.string(),requireChange:o.z.boolean().optional()}),output:Xz,outputPinned:!1,handler:async function(e,t){const n=jg(t,"userId"),i=await _g(t),o=!0===t.options["require-change"],a=await vz(e,"user password-reset",hz.userManagement),s={password:i,...o?{requirePasswordChange:!0}:{}},r=await Sg(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:tf({}),output:o.z.array(_o),handler:async function(e){const t=await vz(e,"user role list",hz.customRoles),n=await t.client.users.roles(e.signal);return e.output.json?{data:n}:{data:n,columns:yz,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:[Ff],input:tf({config:o.z.string()}),output:_o,handler:async function(e,t){const n=Ng(t,"Role create request"),i=await vz(e,"user role create",hz.customRoles),o=await Sg(e,"user role create",()=>({method:"POST",path:"/api/roles",body:n}),()=>i.client.users.createRole(n));if(o)return{data:o,columns:yz,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:[Ff],input:tf({roleId:o.z.string(),config:o.z.string()}),output:_o,handler:async function(e,t){const n=jg(t,"roleId"),i=Ng(t,"Role update request"),o=await vz(e,"user role update",hz.customRoles),a=await Sg(e,"user role update",()=>({method:"PATCH",path:`/api/roles/${encodeURIComponent(n)}`,body:i}),()=>Hu(o,()=>o.client.users.updateRole(n,i)));if(a)return{data:a,columns:yz,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:tf({roleId:o.z.string()}),output:_o,handler:async function(e,t){const n=jg(t,"roleId"),i=await vz(e,"user role remove",hz.customRoles),o=await Sg(e,"user role remove",()=>({method:"DELETE",path:`/api/roles/${encodeURIComponent(n)}`}),()=>Hu(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:tf({}),output:o.z.array(jo),handler:async function(e){const t=await vz(e,"user permission list",hz.customRoles),n=await t.client.users.permissions(e.signal);return e.output.json?{data:n}:{data:n,columns:Iz,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:tf({}),output:o.z.array(qo),handler:async function(e){const t=await vz(e,"user identity-provider list",hz.externalIdentityLogin),n=await t.client.users.providers(e.signal);return e.output.json?{data:n}:{data:n,columns:bz,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:[Ff],input:tf({config:o.z.string()}),output:qo,handler:async function(e,t){const n=Ng(t,"Identity provider create request"),i=await vz(e,"user identity-provider create",hz.externalIdentityLogin),o=await Sg(e,"user identity-provider create",()=>({method:"POST",path:"/api/identity-providers",body:n}),()=>i.client.users.createProvider(n));if(o)return{data:o,columns:bz,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:[Ff],input:tf({providerId:o.z.string(),config:o.z.string()}),output:qo,handler:async function(e,t){const n=jg(t,"providerId"),i=Ng(t,"Identity provider update request"),o=await vz(e,"user identity-provider update",hz.externalIdentityLogin),a=await Sg(e,"user identity-provider update",()=>({method:"PATCH",path:`/api/identity-providers/${encodeURIComponent(n)}`,body:i}),()=>Hu(o,()=>o.client.users.updateProvider(n,i)));if(a)return{data:a,columns:bz,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:tf({providerId:o.z.string()}),output:o.z.looseObject({deleted:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"providerId"),i=await vz(e,"user identity-provider remove",hz.externalIdentityLogin),o=await Sg(e,"user identity-provider remove",()=>({method:"DELETE",path:`/api/identity-providers/${encodeURIComponent(n)}`}),()=>Hu(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:tf({}),output:o.z.array(Mo),handler:async function(e){const t=await vz(e,"user external-identity list",hz.externalIdentityLogin),n=await t.client.users.approvals(e.signal);return e.output.json?{data:n}:{data:n,columns:wz,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:tf({approvalId:o.z.string(),config:o.z.string().optional()}),output:Do,handler:async function(e,t){const n=jg(t,"approvalId"),i=Rg(t,"config")?Ng(t,"Identity approval request"):{},o=await vz(e,"user external-identity approve",hz.externalIdentityLogin),a=await Sg(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:zz,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:tf({approvalId:o.z.string()}),output:Xz,outputPinned:!1,handler:async function(e,t){const n=jg(t,"approvalId"),i=await vz(e,"user external-identity reject",hz.externalIdentityLogin),o=await Sg(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.`}}}],Vf=tf({origin:o.z.string(),label:o.z.string().optional()}),Gf=tf({label:o.z.string()}),Wf=nf("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:Vf,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}(Uh(t.args.origin,"origin")),i=await Zu(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:ef,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:Gf,output:o.z.object({defaultProfile:o.z.string()}),handler:async function(e,t){const n=Uh(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:tf({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:Gf,output:o.z.object({label:o.z.string(),removed:o.z.boolean()}),handler:async function(e,t){const n=Uh(t.args.label,"label");if(!e.store.get(n))throw new h("CLI_PROFILE_UNKNOWN",`Unknown profile \`${n}\`.`,7,{profile:n});return Sg(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:Gf,output:k,handler:async function(e,t){const n=Uh(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 Zu(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 Sg(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}.`}})}}]),Yf=nf("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:tf({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 wg(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 qh({store:t,profileLabel:e.profileLabel,fetchImpl:n}),s=await a.client.auth.cliAuthorize({mode:"device",client:Fu()});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 Mh(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):Bh(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:ef,output:o.z.object({profile:o.z.string(),revoked:o.z.boolean()}),handler:async function(e){const t=await wg(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 vg(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:ef,output:o.z.looseObject({}),handler:async function(e){const t=await wg(e),n=await vg(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}),Kf={name:"instanceId",description:"Controlled instance ID",required:!0},Jf=nf("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:tf({node:o.z.string().optional()}),output:Cl,handler:async function(e,t){const n=await vg(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:zh,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:[Kf],input:tf({instanceId:o.z.string()}),output:Sl,handler:async function(e,t){const n=hh(t),i=await vg(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:zh}}},{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:tf({config:o.z.string(),name:o.z.string().optional(),node:o.z.string().optional(),start:o.z.boolean().optional()}),output:Uc,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=Pg(Tg(t,"config"),Nc,"instance config"),i=Rg(t,"name"),o=Rg(t,"node"),a={...n,...i?{name:i}:{},...o?{nodeId:o}:{},...!0===t.options.start?{start:!0}:{}},s=await vg(e),r=await Sg(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:wh,message:d}}},{id:"instance delete",group:"instance",name:"delete",stage:"B",write:!0,summary:"Delete a controlled instance, optionally deleting its volumes",args:[Kf],options:[{flags:"--volumes",description:"Also delete the instance's managed volumes (irreversible)"}],input:tf({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=hh(t),i=Rr.parse({deleteVolumes:!0===t.options.volumes}),o=await vg(e),a=await Sg(e,`instance delete ${n}`,()=>({method:"DELETE",path:`/api/controlled-instances/${encodeURIComponent(n)}`,body:i}),()=>Hu(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:vh,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:[Kf],input:tf({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:yh},{id:"instance stop",group:"instance",name:"stop",stage:"A",write:!0,summary:"Stop a controlled instance",args:[Kf],input:tf({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:Ih},{id:"instance restart",group:"instance",name:"restart",stage:"A",write:!0,summary:"Restart a controlled instance",args:[Kf],input:tf({instanceId:o.z.string()}),output:o.z.object({id:o.z.string(),status:o.z.string()}),handler:bh},{id:"instance logs",group:"instance",name:"logs",stage:"C",summary:"Stream instance logs (planned with the events stream work)",args:[Kf],options:[{flags:"--follow",description:"Keep streaming new log lines"}],input:tf({instanceId:o.z.string(),follow:o.z.boolean().optional()}),output:Xz,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:tf({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=hh(t),i=t.args.name?.trim();if(!i)throw new h("CLI_ARGUMENT_MISSING","Missing required argument <name>.",2);const o=await vg(e),a=await Sg(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:[Kf],options:[{flags:"--config <file>",description:"Instance update request JSON (Control Plane wire body)"}],input:tf({instanceId:o.z.string(),config:o.z.string()}),output:Ec,examples:["thctl instance update <instanceId> --config ./instance-settings.json"],handler:async function(e,t){const n=hh(t),i=Pg(Tg(t,"config"),Oc,"instance update config"),o=await vg(e),a=await Sg(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:xh,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:[Kf],input:tf({instanceId:o.z.string()}),output:Qr,handler:async function(e,t){const n=hh(t),i=await vg(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:Ah,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:tf({instanceId:o.z.string(),appId:o.z.string(),requestId:o.z.string().optional(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Zr,examples:["thctl instance app install <instanceId> codex --wait","thctl instance app install <instanceId> codex --json"],handler:Rh},{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:tf({instanceId:o.z.string(),appId:o.z.string(),requestId:o.z.string().optional(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Zr,handler:Th},{id:"instance app update",group:"instance",name:"app update",stage:"B",write:!0,summary:"Update a managed app to the latest version from its built-in recipe (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:tf({instanceId:o.z.string(),appId:o.z.string(),requestId:o.z.string().optional(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Zr,examples:["thctl instance app update <instanceId> codex --wait","thctl instance app update <instanceId> codex --json"],handler:$h},{id:"instance app check-update",group:"instance",name:"app check-update",stage:"B",summary:"Check whether a managed app has an available update (read-only)",args:[{name:"instanceId",description:"Controlled instance ID",required:!0},{name:"appId",description:"App ID",required:!0}],input:tf({instanceId:o.z.string(),appId:o.z.string()}),output:Hr,examples:["thctl instance app check-update <instanceId> codex","thctl instance app check-update <instanceId> codex --json"],handler:async function(e,t){const n=hh(t),i=jg(t,"appId"),o=await vg(e),a=(await o.client.apps.updateCheck(n,i)).check;return{data:a,columns:[{key:"appId",header:"app"},{key:"status",header:"status"},{key:"installedVersion",header:"installed"},{key:"latestVersion",header:"latest"},{key:"checkedAt",header:"checked"}],message:"update-available"===a.status?`App \`${i}\` has an update available${a.installedVersion||a.latestVersion?` (${a.installedVersion||"?"} → ${a.latestVersion||"?"})`:""}.`:`App \`${i}\` update check: ${a.status}${a.reason?` (${a.reason})`:""}.`}}},{id:"instance app job",group:"instance",name:"app job",stage:"B",summary:"Show an app install/update/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:tf({instanceId:o.z.string(),jobId:o.z.string(),wait:o.z.boolean().optional(),logs:o.z.boolean().optional()}),output:Zr,handler:async function(e,t){const n=hh(t),i=jg(t,"jobId"),o=!0===t.options.wait,a=await vg(e);let s=(await a.client.apps.job(n,i,e.signal)).job;return o&&(s=await Ch(e,a,n,s)),Ph(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:[Kf],input:tf({instanceId:o.z.string()}),output:al,handler:async function(e,t){const n=hh(t),i=await vg(e),o=await i.client.apps.catalog(n,e.signal);return e.output.json?{data:o}:{data:o.items,columns:Eh,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:[Kf],input:tf({instanceId:o.z.string()}),output:sl,handler:async function(e,t){const n=hh(t),i=await vg(e),o=await i.client.apps.customCatalog(n,e.signal);return e.output.json?{data:o}:{data:o.items,columns:Eh,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:[Kf],options:[{flags:"--config <file>",description:'Custom app catalog JSON body: { "items": [...] }'}],input:tf({instanceId:o.z.string(),config:o.z.string()}),output:sl,examples:["thctl instance app catalog custom update <instanceId> --config ./custom-apps.json"],handler:async function(e,t){const n=hh(t),i=Pg(Tg(t,"config"),rl,"custom app catalog config"),o=await vg(e),a=await Sg(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:Eh,message:`Custom app catalog updated with ${a.items.length} app(s).`}}}]),Zf=nf("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:tf({instance:o.z.string().optional()}),output:_i,handler:async function(e,t){const n=await vg(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:Ug,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:tf({instanceId:o.z.string(),sessionId:o.z.string()}),output:St,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=await vg(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:tf({instanceId:o.z.string(),agent:o.z.array(o.z.string()).optional()}),output:Ot,handler:async function(e,t){const n=jg(t,"instanceId"),i=$g(t,"agent"),o=await vg(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:tf({instanceId:o.z.string(),sessionId:o.z.string(),revision:o.z.string().optional()}),output:Ct,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Rg(t,"revision"),a=await vg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=jg(t,"turnId"),a=Rg(t,"revision"),s=await vg(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:tf({instanceId:o.z.string(),sessionId:o.z.string()}),output:se,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=await vg(e),a=await o.client.aiSessions.timeline(n,i,e.signal);return e.output.json?{data:a}:{data:Mg(a.items),columns:Bg,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:tf({instanceId:o.z.string(),sessionId:o.z.string(),turnId:o.z.string()}),output:re,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=jg(t,"turnId"),a=await vg(e),s=await a.client.aiSessions.turnTimeline(n,i,o,e.signal);return e.output.json?{data:s}:{data:Mg(s.items),columns:Bg,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 display label or stable upstream name within the entity"},{flags:"--request-id <id>",description:"Client request ID for retry-safe creation"}],input:tf({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=jg(t,"instanceId"),i=Rg(t,"model-entity"),o=Rg(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=Rg(t,"permission-mode"),r=Rg(t,"reasoning"),d={agent:Tg(t,"agent"),message:Tg(t,"prompt"),clientRequestId:Rg(t,"request-id")??a.randomUUID(),attachments:[],references:[],...Rg(t,"cwd-folder")?{cwdFolderId:Rg(t,"cwd-folder")}:{},...Rg(t,"story")?{storyId:Rg(t,"story")}:{},...s?{permissionMode:Jg(s)}:{},...r?{reasoningEffort:Qg(r,"reasoning")}:{},...i&&o?{modelSelection:{modelEntityId:i,modelName:o}}:{}},c=await vg(e),l=await Sg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=jg(t,"message"),a=Rg(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=Rg(t,"permission-mode"),d=r?Jg(r):void 0,c=$g(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=$g(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(Zg),u={message:o,...s?{mode:s}:{},...d?{permissionMode:d}:{},...m.length?{attachments:m}:{},...p.length?{references:p}:{}},g=await vg(e),f=await Sg(e,"ai-session send",()=>({method:"POST",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string()}),output:Et,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=await vg(e),a=await Sg(e,"ai-session interrupt",()=>({method:"POST",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string(),decision:o.z.enum(["allow","deny","skip"])}),output:Et,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(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}(Tg(t,"decision")),a=await vg(e),s=await Sg(e,"ai-session approval",()=>({method:"POST",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string()}),output:Ut,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=await vg(e),a=await Sg(e,"ai-session resume",()=>({method:"POST",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string()}),output:Qe,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=await vg(e),a=await Sg(e,"ai-session read",()=>({method:"POST",path:`${Dg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o={title:Tg(t,"title"),clientRequestId:Rg(t,"request-id")??a.randomUUID()},s=await vg(e),r=await Sg(e,"ai-session rename",()=>({method:"PUT",path:`${Dg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Rg(t,"through-turn"),s=Rg(t,"workspace"),r=Eg(nt,{clientRequestId:Rg(t,"request-id")??a.randomUUID(),...o?{throughTurnId:o}:{},...s?{workspace:{mode:s}}:{}},"fork input"),d=await vg(e),c=await Sg(e,"ai-session fork",()=>({method:"POST",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string(),requestId:o.z.string().optional()}),output:rt,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Rg(t,"request-id")??a.randomUUID(),s=await vg(e),r=await Sg(e,"ai-session close",()=>({method:"POST",path:`${Dg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Rg(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 vg(e),r=await Sg(e,"ai-session story",()=>({method:"PUT",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string(),requestId:o.z.string().optional()}),output:at,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Rg(t,"request-id")??a.randomUUID(),s=await vg(e),r=await Sg(e,"ai-session open-app",()=>({method:"POST",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string(),app:o.z.string().optional()}),output:Gi,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Rg(t,"app")??"terminal-tty",a=await vg(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 Sg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=jg(t,"command"),a=Rg(t,"argument"),s=Eg(Ae,{command:o,...a?{argument:a}:{}},"AI session command"),r=await vg(e),d=await Sg(e,"ai-session command",()=>({method:"POST",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string(),kind:o.z.string().optional()}),output:Oe,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Rg(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 vg(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:Fg,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:tf({instanceId:o.z.string(),sessionId:o.z.string(),query:o.z.string().optional()}),output:Ne,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=t.args.query?.trim()??"",a=await vg(e),s=await a.client.aiSessions.searchMentionFiles(n,i,o,e.signal);return e.output.json?{data:s}:{data:s.candidates,columns:Fg,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:tf({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=jg(n,"instanceId"),a=jg(n,"sessionId"),s=i.resolve(jg(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=Rg(n,"name")??i.basename(s),c=Rg(n,"mime")??function(e){return Hg[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 vg(e),u=await Sg(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:tf({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=jg(n,"instanceId"),a=jg(n,"sessionId"),s=jg(n,"messageId"),r=jg(n,"attachmentId"),d=await vg(e),c=await d.client.aiSessions.attachmentContent(o,a,s,r),l=c.filename?i.basename(c.filename):r,m=Rg(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 display label or stable upstream name within the entity"},{flags:"--request-id <id>",description:"Client request ID for retry-safe switching"}],input:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o={modelEntityId:Tg(t,"entity"),modelName:Tg(t,"name")},s=Rg(t,"request-id")??a.randomUUID(),r=await vg(e),d=await Sg(e,"ai-session model",()=>({method:"PUT",path:`${Dg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Qg(Tg(t,"effort")),s=Rg(t,"request-id")??a.randomUUID(),r=await vg(e),d=await Sg(e,"ai-session reasoning",()=>({method:"PUT",path:`${Dg(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:tf({instanceId:o.z.string(),sessionId:o.z.string()}),output:gt,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=await vg(e),a=Og(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:tf({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:Et,handler:Gg},{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:tf({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:$t,handler:Wg},{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:tf({instanceId:o.z.string(),sessionId:o.z.string(),queueId:o.z.string()}),output:$t,handler:Yg},{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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=jg(t,"queueId"),a=Tg(t,"message"),s=await vg(e),r={expectedRevision:await Kg(e,s,n,i,t),message:a},d=await Sg(e,"ai-session queue edit",()=>({method:"PATCH",path:`${Dg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=$g(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 vg(e),s={expectedRevision:await Kg(e,a,n,i,t),queueIds:o},r=await Sg(e,"ai-session queue reorder",()=>({method:"PATCH",path:`${Dg(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:[Kf],options:[{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder to inspect"}],input:tf({instanceId:o.z.string(),cwdFolder:o.z.string().optional()}),output:Bn,handler:async function(e,t){const n=jg(t,"instanceId"),i=Rg(t,"cwd-folder"),o=await vg(e);return{data:await o.client.aiSessions.workspace(n,i,e.signal),columns:qg}}},{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:[Kf],options:[{flags:"--branch <branch>",description:"Branch to check out"},{flags:"--cwd-folder <cwdFolderId>",description:"Instance folder that owns the workspace"}],input:tf({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=jg(t,"instanceId"),i=Tg(t,"branch"),o=Rg(t,"cwd-folder"),a={branch:i,...o?{cwdFolderId:o}:{}},s=await vg(e),r=await Sg(e,"ai-session checkout",()=>({method:"POST",path:`${Lg(n)}/checkout`,body:a}),()=>s.client.aiSessions.checkoutWorkspaceBranch(n,a));if(r)return{data:r,columns:qg,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:tf({instanceId:o.z.string(),sessionId:o.z.string(),tail:o.z.number().optional()}),output:Xe,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(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}(Rg(t,"tail"),"tail"),a=await vg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=await vg(e),a=await o.client.aiSessions.storyContent(n,i,e.signal);return e.output.json?{data:a}:{data:a.documents,columns:Xg,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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Tg(t,"path"),a=await vg(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).`}}}]),Qf=nf("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:tf({instance:o.z.string().optional()}),output:no,handler:async function(e,t){const n=Rg(t,"instance"),i=await vg(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:eh,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:tf({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gi,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"appSessionId"),o=await vg(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:eh}}},{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:tf({instanceId:o.z.string(),appId:o.z.string(),cwdFolder:o.z.string().optional()}),output:Gi,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"appId"),o=Rg(t,"cwd-folder"),a={appId:i,...o?{cwdFolderId:o}:{}},s=await vg(e),r=await Sg(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:tf({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gi,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"appSessionId"),o=await vg(e),a=await Sg(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:tf({instanceId:o.z.string(),appSessionId:o.z.string(),title:o.z.string()}),output:Gi,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"appSessionId"),o=Eg(th,jg(t,"title"),"title"),a=await vg(e),s=await Sg(e,"app-session rename",()=>({method:"PATCH",path:ih(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:tf({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Mi,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"appSessionId"),o=await vg(e),a=await Sg(e,"app-session access",()=>({method:"POST",path:`${ih(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:nh,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:tf({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=jg(t,"instanceId"),i=jg(t,"appSessionId"),o=await _g(t),a=await vg(e),s=await Sg(e,"app-session revoke-access",()=>({method:"DELETE",path:`${ih(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:tf({instanceId:o.z.string(),appSessionId:o.z.string()}),output:Gi,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"appSessionId"),o=await vg(e),a=await Sg(e,"app-session restart",()=>({method:"POST",path:`${ih(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:tf({instanceId:o.z.string(),appSessionId:o.z.string(),maxBytes:o.z.number().optional()}),output:Hi,handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(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}(Rg(t,"max-bytes"),"max-bytes"),a=await vg(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:tf({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=jg(n,"instanceId"),a=jg(n,"appSessionId"),s=await vg(e),r=await s.client.appSessions.screenshot(o,a,e.signal),d=Rg(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:oh,message:`Saved screenshot of app session \`${a}\` to \`${c}\`.`}}}]),Xf=nf("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:tf({instanceId:o.z.string(),appId:o.z.string()}),output:so,handler:async function(e,t){const{instanceId:n,appId:i}=rh(t),o=await vg(e),a=await o.client.appProfiles.list(n,i,e.signal);return e.output.json?{data:a}:{data:a.profiles,columns:sh,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:tf({instanceId:o.z.string(),appId:o.z.string(),name:o.z.string()}),output:ao,handler:async function(e,t){const{instanceId:n,appId:i}=rh(t),o=Eg(ah,Tg(t,"name"),"--name"),a=await vg(e),s=await Sg(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:sh,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:tf({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}=rh(t),o=jg(t,"profileId"),a=Eg(ah,Tg(t,"name"),"--name"),s=await vg(e),r=await Sg(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:sh,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:tf({instanceId:o.z.string(),appId:o.z.string(),profileId:o.z.string()}),output:ao,handler:async function(e,t){const{instanceId:n,appId:i}=rh(t),o=jg(t,"profileId"),a=await vg(e),s=await Sg(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:sh,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:tf({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}=rh(t),o=jg(t,"profileId"),a=await vg(e),s=await Sg(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}\`.`}}}]),ey=nf("node","Inspect nodes",[{id:"node list",group:"node",name:"list",stage:"B",summary:"List nodes in the fleet directory",input:ef,output:xl,handler:async function(e){const t=await vg(e),n=await t.client.resources.nodes(e.signal);return e.output.json?{data:n}:{data:_h(n),columns:Nh,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:tf({nodeId:o.z.string()}),output:vl,handler:async function(e,t){const n=jg(t,"nodeId"),i=await vg(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:Nh}}},{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:tf({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=jg(t,"nodeId"),i=jg(t,"name"),o=await vg(e),a=await Sg(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}\`.`}}},...ff]),ty={flags:"--node <nodeId>",description:"Node that owns the story (resolved from the directory when omitted)"},ny=[{name:"storyId",description:"Story ID",required:!0},{name:"automationId",description:"Automation ID",required:!0}],iy=tf({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional()}),oy={flags:"--config <file>",description:"Story automation JSON file"},ay=tf({storyId:o.z.string(),node:o.z.string().optional(),config:o.z.string()}),sy=tf({storyId:o.z.string(),automationId:o.z.string(),node:o.z.string().optional(),config:o.z.string()}),ry=nf("story","Work with stories, documents and automations",[{id:"story list",group:"story",name:"list",stage:"B",summary:"List stories across visible nodes",input:ef,output:o.z.object({stories:o.z.array(Ii),unavailableNodeIds:o.z.array(o.z.string())}),handler:async function(e){const t=await vg(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:Kh(n.stories),columns:Gh,message:i}}},{id:"story show",group:"story",name:"show",stage:"B",summary:"Show one story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[ty],input:tf({storyId:o.z.string(),node:o.z.string().optional()}),output:Ii,handler:async function(e,t){const n=jg(t,"storyId"),i=await vg(e),o=await Jh(i,n,Rg(t,"node"));return Yh(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:[ty,{flags:"--description <description>",description:"Story description"},{flags:"--max-idle-ai-sessions <count>",description:"Idle AI session retention limit"}],input:tf({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=jg(t,"title"),i=Rg(t,"description"),o=Rg(t,"max-idle-ai-sessions"),a={title:n,...i?{description:i}:{},...o?{maxIdleAiSessions:rz(o,"max-idle-ai-sessions")}:{}},s=await vg(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,Rg(t,"node")),d=await Sg(e,"story create",()=>({method:"POST",path:"/api/stories",body:{nodeId:r,input:a}}),()=>s.client.stories.create(r,a));if(d)return{...Yh(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:[ty,{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:tf({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=jg(t,"storyId"),i=Rg(t,"title"),o=Rg(t,"description"),a=Rg(t,"max-idle-ai-sessions"),s={...i?{title:i}:{},...o?{description:o}:{},...a?{maxIdleAiSessions:rz(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 vg(e),d=await Jh(r,n,Rg(t,"node")),c=await Sg(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{...Yh(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:[ty],input:tf({storyId:o.z.string(),node:o.z.string().optional()}),output:Ii,handler:Qh},{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:[ty],input:tf({storyId:o.z.string(),node:o.z.string().optional()}),output:Ii,handler:Xh},{id:"story remove",group:"story",name:"remove",stage:"B",write:!0,summary:"Remove a story",args:[{name:"storyId",description:"Story ID",required:!0}],options:[ty],input:tf({storyId:o.z.string(),node:o.z.string().optional()}),output:o.z.object({deleted:o.z.boolean()}),handler:ez},{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:[ty,{flags:"--title <title>",description:"New document title"},{flags:"--new-path <path>",description:"Move the document to this story path"}],input:tf({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=jg(t,"storyId"),i=jg(t,"path"),o=Rg(t,"title"),a=Rg(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 vg(e),d=await Jh(r,n,Rg(t,"node")),c=await Sg(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{...Yh(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:[ty],input:tf({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=jg(t,"storyId"),i=jg(t,"path"),o=await vg(e),a=await Jh(o,n,Rg(t,"node")),s=await Sg(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:[ty],input:tf({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=jg(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 vg(e),a=await Jh(o,n,Rg(t,"node")),s={storyPaths:i},r=await Sg(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{...Yh(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:[ty],input:tf({storyId:o.z.string(),node:o.z.string().optional()}),output:ci,handler:async function(e,t){const n=jg(t,"storyId"),i=await vg(e),o=await Jh(i,n,Rg(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:ny,options:[ty],input:iy,output:di,handler:async function(e,t){const n=jg(t,"storyId"),i=jg(t,"automationId"),o=await vg(e),a=await Jh(o,n,Rg(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:[ty,oy],input:ay,output:di,handler:async function(e,t){const n=jg(t,"storyId"),i=Pg(Tg(t,"config"),iz,"story automation config"),o=await vg(e),a=await Jh(o,n,Rg(t,"node")),s={storyId:n,...i},r=await Sg(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{...nz(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:ny,options:[ty,oy],input:sy,output:di,handler:async function(e,t){const n=jg(t,"storyId"),i=jg(t,"automationId"),o=Pg(Tg(t,"config"),ii,"story automation update config"),a=await vg(e),s=await Jh(a,n,Rg(t,"node")),r=await Sg(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{...nz(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:ny,options:[ty],input:iy,output:o.z.object({deleted:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"storyId"),i=jg(t,"automationId"),o=await vg(e),a=await Jh(o,n,Rg(t,"node")),s=await Sg(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:ny,options:[ty],input:iy,output:di,handler:az},{id:"story automation disable",group:"story",name:"automation disable",stage:"B",write:!0,summary:"Disable a story automation",args:ny,options:[ty],input:iy,output:di,handler:sz},{id:"story automation run",group:"story",name:"automation run",stage:"B",write:!0,summary:"Run a story automation now",args:ny,options:[ty,{flags:"--request-id <id>",description:"Client request ID for retry-safe runs"}],input:tf({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=jg(t,"storyId"),i=jg(t,"automationId"),o=Rg(t,"request-id")??a.randomUUID(),s=await vg(e),r=await Jh(s,n,Rg(t,"node")),d={clientRequestId:o},c=await Sg(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:Wh,message:`Automation \`${i}\` run ${c.status}.`}}},{id:"story automation runs",group:"story",name:"automation runs",stage:"B",summary:"List recent automation runs",args:ny,options:[ty],input:iy,output:li,handler:async function(e,t){const n=jg(t,"storyId"),i=jg(t,"automationId"),o=await vg(e),a=await Jh(o,n,Rg(t,"node")),s=await o.client.stories.automationRuns(n,i,a);return e.output.json?{data:s}:{data:s.runs,columns:Wh,message:s.runs.length?void 0:"No runs matched."}}}]),dy=nf("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:tf({instance:o.z.string().optional()}),output:Fa,handler:async function(e,t){const n=Rg(t,"instance"),i=await vg(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(cz),columns:dz,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:tf({configHash:o.z.string(),instance:o.z.string().optional()}),output:Ba,handler:async function(e,t){const n=jg(t,"configHash"),i=Rg(t,"instance"),o=await vg(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:cz(s),columns:dz}}},{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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=Pg(Tg(t,"config"),Ha,"trigger config"),a=await vg(e),s=await Sg(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:dz,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:tf({configHash:o.z.string(),config:o.z.string()}),output:o.z.looseObject({}),handler:async function(e,t){const n=jg(t,"configHash"),i=Pg(Tg(t,"config"),Ha,"trigger config"),o=await vg(e),a=await Sg(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:tf({configHash:o.z.string()}),output:o.z.looseObject({}),handler:async function(e,t){const n=jg(t,"configHash"),i=await vg(e),o=await Sg(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:tf({instanceId:o.z.string(),configHash:o.z.string(),deployment:o.z.string().optional()}),output:o.z.unknown(),handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"configHash"),o=Rg(t,"deployment"),a=await vg(e),s=await Sg(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:tf({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=jg(t,"instanceId"),i=jg(t,"sessionId"),o=jg(t,"configHash"),a=await vg(e),s=await Sg(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:tf({instanceId:o.z.string(),sessionId:o.z.string(),configHash:o.z.string()}),output:o.z.unknown(),handler:async function(e,t){const n=jg(t,"instanceId"),i=jg(t,"sessionId"),o=jg(t,"configHash"),a=await vg(e),s=await Sg(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:tf({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=jg(t,"configHash"),i=Tg(t,"session"),o=[...new Set($g(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 vg(e),r=await Sg(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).`}}}]),cy=nf("model","Inspect the model registry",[{id:"model list",group:"model",name:"list",stage:"B",summary:"List models in the public registry",input:ef,output:Nl,handler:async function(e){const t=await vg(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:Oh,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:tf({modelId:o.z.string()}),output:Ol,handler:async function(e,t){const n=jg(t,"modelId"),i=await vg(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:Oh}}},...Mf]),ly=nf("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:tf({includeArchived:o.z.boolean().optional()}),output:o.z.array(To),handler:async function(e,t){const n=!0===t.options["include-archived"],i=await vg(e),o=await i.client.users.list({includeArchived:n},e.signal);return e.output.json?{data:o}:{data:o,columns:zz,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:tf({userId:o.z.string()}),output:Do,handler:async function(e,t){const n=jg(t,"userId"),i=await vg(e),o=await i.client.users.detail(n,e.signal);return e.output.json?{data:o}:{data:o,columns:zz}}},{id:"user sessions",group:"user",name:"sessions",stage:"B",summary:"List sessions of a user",args:[{name:"userId",description:"User ID",required:!0}],input:tf({userId:o.z.string()}),output:o.z.array(No),handler:async function(e,t){const n=jg(t,"userId"),i=await vg(e),o=await i.client.users.sessions(n,e.signal);return e.output.json?{data:o}:{data:o,columns:fz,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:tf({userId:o.z.string(),sessionId:o.z.string()}),output:o.z.object({revoked:o.z.boolean()}),handler:async function(e,t){const n=jg(t,"userId"),i=jg(t,"sessionId"),o=await vg(e),a=await Sg(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.`}}}},...Hf]),my=[{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"}],py={scope:o.z.enum(["project","user"]).optional(),dir:o.z.string().optional()},uy=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()}),gy=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()}),hy=nf("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:[...my],input:tf(py),output:o.z.array(uy),examples:["thctl skill status","thctl skill status --scope project --json"],handler:async function(e,t){const n=Kz(t),i=Boolean(n.dir||n.scope),o=_z(process.cwd(),n),a=e=>n.dir?`--dir ${e.root}`:`--scope ${e.scope}`,s=Mu();let r,d;try{r=await Jz(e)}catch(e){d=e instanceof Error?e.message:String(e)}const c=[];for(const e of o){const t=Mz(e.directory),n=Gz(e.root);if(i||t.exists||0!==n.length){c.push(Zz(e,t,r,s,a(e)));for(const t of n){const n=Mz(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 \`${Sz}\` 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:[...my],input:tf(py),output:gy,examples:["thctl skill install","thctl skill install --scope project --yes"],handler:async function(e,t){const n=Nz(process.cwd(),Kz(t)),i=Mz(n.directory);if(i.exists)throw new h("CLI_SKILL_ALREADY_INSTALLED",`Skill \`${Sz}\` is already installed at ${n.directory}${i.version?` (v${i.version})`:""}. Run \`thctl skill update\`.`,8,{directory:n.directory});const o=await Jz(e),a=Mu();Dz(o.entry,a);const s=await qz(o,{fetchImpl:e.fetchImpl});if(e.dryRun)return{data:{dryRun:!0,name:Sz,version:o.entry.version,directory:n.directory,files:o.entry.files},message:`Would install skill \`${Sz}\` ${o.entry.version} to ${n.directory}.`};await kg(e,"skill install",`Install skill \`${Sz}\` ${o.entry.version} to ${n.directory}?`);const r=Wz({target:n,release:o,files:s,cliVersion:a});return{data:{name:Sz,version:r.version,scope:n.scope,directory:n.directory,files:o.entry.files,verified:!0===r.verified},message:`Installed skill \`${Sz}\` ${r.version} to ${n.directory}.${Qz(n)}`}}},{id:"skill update",group:"skill",name:"update",stage:"A",write:!0,summary:"Update the installed TaskHandoff skill to the published release",options:[...my,{flags:"--force",description:"Replace a locally modified installed copy"}],input:tf({...py,force:o.z.boolean().optional()}),output:gy,examples:["thctl skill update","thctl skill update --force --yes"],handler:async function(e,t){const n=Nz(process.cwd(),Kz(t)),i=Mz(n.directory);if(!i.exists){const e=Gz(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 \`${Sz}\` 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 \`${Sz}\` 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 Jz(e),s=Mu();if(Dz(a.entry,s),i.managed&&!Fz(i,a.entry)&&!o)return{data:{name:Sz,version:i.version,directory:n.directory,updated:!1},message:`Skill \`${Sz}\` is already at ${i.version??"the published release"}; nothing to do.`};const r=await qz(a,{fetchImpl:e.fetchImpl});if(e.dryRun)return{data:{dryRun:!0,name:Sz,from:i.version,to:a.entry.version,directory:n.directory,files:a.entry.files},message:`Would update skill \`${Sz}\` ${i.version??"unknown"} → ${a.entry.version} at ${n.directory}.`};await kg(e,"skill update",`Update skill \`${Sz}\` ${i.version??"unknown"} → ${a.entry.version} at ${n.directory}?`);const d=Wz({target:n,release:a,files:r,cliVersion:s});return{data:{name:Sz,from:i.version,version:d.version,scope:n.scope,directory:n.directory,files:a.entry.files,verified:!0===d.verified},message:`Updated skill \`${Sz}\` to ${d.version} at ${n.directory}.${Qz(n)}`}}}]),zy=nf("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:tf({topic:o.z.array(o.z.string()).optional(),instance:o.z.string().optional()}),output:Nu,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=>mh[e]??e);return t.length?[...new Set(t)]:["*"]}(t.options.topic??[]),i="string"==typeof t.options.instance?t.options.instance.trim():"",o=await wg(e),a=await vg(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 gh(e,{url:ph(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}),fy=nf("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:tf({group:o.z.string().optional(),leaf:o.z.string().optional(),format:o.z.enum(["json","md"]).optional(),out:o.z.string().optional()}),output:Xz,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&&by(o))r={leaf:by(o)};else if(!a&&function(e){return Iy.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=by(`${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?Iy.filter(t=>t.group===e.group):Iy,n=(e?.leaf?yy.filter(t=>t.name===e.leaf?.group):e?.group?yy.filter(t=>t.name===e.group):yy).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:Bu,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(Hh)}}(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(Vh(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}),yy=[Wf,Yf,Jf,Zf,Qf,Xf,ey,yf,ry,dy,cy,...Bf,ly,hy,zy,fy],Iy=yy.flatMap(e=>e.leaves);function by(e){const t=e.trim().replace(/\s+/g," ");return Iy.find(e=>e.id===t)}function wy(e){return null==e?"":Array.isArray(e)?e.length?e.map(wy).join(", "):"":"object"==typeof e?JSON.stringify(e):String(e)}class vy{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=wy(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(`${zg(e)}\n`)}error(e){this.json?this.streams.stderr(`${JSON.stringify({error:{code:e.code,message:zg(e.message),...e.details?{details:fg(e.details)}:{}}})}\n`):this.streams.stderr(`${e.code}: ${zg(e.message)}\n`)}}const xy="TASK_HANDOFF_CLI_UPDATE_CHECK",Ay="__update-check",ky=864e5,Sy=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(),Cy=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(),jy=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:Sy.optional(),skill:Cy.optional(),noticeShownAt:o.z.string().optional(),noticeShownKey:o.z.string().optional()}).loose();function Ry(e){return i.join(e.store.directory,"update-check.json")}function Ty(e){try{const n=jy.safeParse(JSON.parse(t.readFileSync(e,"utf8")));if(n.success)return n.data}catch{}return{schemaVersion:1}}function $y(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 Ey(e){const t=e?.trim().toLowerCase();if(t)return!["0","false","off","no"].includes(t)&&(!!["1","true","on","yes"].includes(t)||void 0)}function Py(e,t=[]){return!!t.includes("--no-update-check")||!1===Ey(e[xy])}function Oy(e){return!0===Ey(e[xy])}function Ny(e){const t=e.TASK_HANDOFF_CLI_UPDATE_CHECK_INTERVAL?.trim();if(!t)return ky;const n=Number(t);return Number.isFinite(n)&&n>0?1e3*n:ky}function _y(e,t){r.spawn(e,t,{detached:!0,stdio:"ignore",windowsHide:!0}).unref()}async function Uy(e){const o=Mu();if(!Oy(e.env)&&!xz(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 kz(a);const s=e.npm_config_registry?.trim();if(s)return kz(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?kz(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 Dy(e){const t=await Uz({fetchImpl:e.fetchImpl,env:e.env,timeoutMs:4e3}),n=Bz(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 Ly=[["--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 qy(e){for(const[t,n]of Ly)e.option(t,n);return e}function My(e,t=[]){return[...t,e]}function By(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 Fy(e){return e.handler?e.summary:`${e.summary} (not implemented — planned stage ${e.stage})`}function Hy(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 Vy(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 vy(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??bg,openUrl:e.openUrl??Lh,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]===Ay)return await async function(e){const t=Ry(e),n=Ty(t),[i,o]=await Promise.allSettled([Uy(e),Dy(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{$y(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(Py(e.env,n))return;const i=process.argv[1];if(!i)return;const o=t.now??Date.now(),a=Ry(e),s=Ty(a),r=s.lastAttemptAt?Date.parse(s.lastAttemptAt):Number.NaN,d=!1===s.lastAttemptOk?Math.min(36e5,Ny(e.env)):Ny(e.env);if(!(Number.isFinite(r)&&o-r<d)){try{$y(a,{...s,schemaVersion:1,lastAttemptAt:new Date(o).toISOString()})}catch{return}try{(t.spawnDetached??_y)(process.execPath,[i,Ay])}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(Bu,"--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)}),qy(n),n.configureHelp({sortSubcommands:!1});for(const e of yy){const i=e.flat?n:n.command(e.name).description(e.summary);for(const n of e.leaves){const e=Hy(i,n).command(By(n)).description(Fy(n));qy(e);for(const t of n.options??[])t.repeatable?e.option(t.flags,t.description,My,[]):e.option(t.flags,t.description);e.action(async()=>{await Vy(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(Py(e.env,n))return;const i=Oy(e.env);if(!i&&(!e.isTty||e.output.json))return;const o=t.now??Date.now(),a=Ry(e),s=Ty(a),r=t.cliVersion??Mu(),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||xz(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=_z(t.cwd??process.cwd(),{},t.home).map(e=>Mz(e.directory)).filter(e=>e.exists).filter(t=>void 0!==e&&void 0!==t.contentSignature?t.contentSignature!==e:void 0!==t.version&&Az(t.version,c));if(n.length>0){const e=[...new Set(n.map(e=>e.version??"unknown"))].join(", ");s.skill?.thctl&&!Lz(r,s.skill.thctl)?m.push(`skill ${Sz} ${e} → ${c} needs thctl ${s.skill.thctl}: update the CLI first`):m.push(`skill ${Sz} ${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{$y(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});