@enhance-eng/enhance-dev 0.1.41-dev.sha-bc50fb27e791 → 0.1.41-dev.sha-4a76a9fc808c
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/{cli-output-identity.lib-DqtHQ0LE.mjs → cli-output-identity.lib-CfGYbAfN.mjs} +1 -1
- package/dist/main.mjs +5 -5
- package/dist/mcp-main.mjs +2 -2
- package/dist/{mcp-server.adapter-CKlwKz-w.mjs → mcp-server.adapter-AYEN3tEQ.mjs} +1 -1
- package/dist/mcp.mjs +1 -1
- package/dist/{mutation-key.adapter-DMx2N3NB.mjs → mutation-key.adapter-A347POmF.mjs} +1 -1
- package/package.json +1 -1
package/dist/main.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{$t as e,A as t,At as n,Bt as r,Dt as i,Ft as a,It as o,Lt as s,Mn as c,Mr as l,Mt as u,Nn as ee,Ot as te,Pt as ne,Qn as re,Rt as ie,Tt as ae,Xn as oe,Zn as se,_ as ce,_t as le,a as ue,ar as de,at as fe,c as pe,ct as me,f as he,fr as ge,gr as _e,h as ve,hr as ye,jt as be,kt as xe,m as Se,mr as Ce,n as we,nn as Te,o as Ee,p as De,pr as Oe,r as ke,s as Ae,t as je,tn as Me,tt as Ne,u as Pe,ur as Fe,ut as Ie,wn as Le,wt as Re,y as ze}from"./cli-output-identity.lib-
|
|
2
|
+
import{$t as e,A as t,At as n,Bt as r,Dt as i,Ft as a,It as o,Lt as s,Mn as c,Mr as l,Mt as u,Nn as ee,Ot as te,Pt as ne,Qn as re,Rt as ie,Tt as ae,Xn as oe,Zn as se,_ as ce,_t as le,a as ue,ar as de,at as fe,c as pe,ct as me,f as he,fr as ge,gr as _e,h as ve,hr as ye,jt as be,kt as xe,m as Se,mr as Ce,n as we,nn as Te,o as Ee,p as De,pr as Oe,r as ke,s as Ae,t as je,tn as Me,tt as Ne,u as Pe,ur as Fe,ut as Ie,wn as Le,wt as Re,y as ze}from"./cli-output-identity.lib-CfGYbAfN.mjs";import{C as Be,E as Ve,S as He,T as Ue,_ as We,b as Ge,c as Ke,f as d,g as qe,h as Je,i as Ye,l as Xe,m as Ze,n as Qe,o as $e,p as et,r as tt,s as nt,t as rt,u as it,v as at,w as ot,x as st,y as ct}from"./mutation-key.adapter-A347POmF.mjs";import{t as lt}from"./capability-inventory.mapper-B_GMS9z3.mjs";import f from"node:process";import{Command as ut}from"commander";import{createCli as dt,parseRouter as ft}from"trpc-cli";import{z as p}from"zod";import{z as m}from"zod/mini";import{hostname as pt,tmpdir as mt}from"node:os";import{createInterface as ht}from"node:readline";import{chmodSync as gt,createReadStream as _t,existsSync as vt,lstatSync as yt,mkdirSync as bt,openAsBlob as xt,readFileSync as St,readdirSync as Ct,statSync as wt,unlinkSync as Tt,writeFileSync as Et}from"node:fs";import h from"node:path";import{createHash as Dt,randomUUID as Ot}from"node:crypto";import{link as kt,mkdir as At,readFile as jt,rename as Mt,rm as Nt,stat as Pt,writeFile as Ft}from"node:fs/promises";import{pipeline as It}from"node:stream/promises";import{channel as Lt}from"node:diagnostics_channel";import{proxify as Rt}from"trpc-cli/dist/proxify.js";const zt=new Set([`cursive`,`emoji`,`fantasy`,`fangsong`,`math`,`monospace`,`sans-serif`,`serif`,`system-ui`,`ui-monospace`,`ui-rounded`,`ui-sans-serif`,`ui-serif`]),Bt=/^-?[_a-z][-\w]*$/iu,Vt=/^var\(--[-\w]+\)$/iu,Ht=e=>zt.has(e.toLowerCase()),Ut=e=>e.replaceAll(/\\(?:([\da-f]{1,6})(?:\r\n|[\t\n\f\r ])?|(\r\n|[\n\r\f])|([^\da-f]))/giu,(e,t,n,r)=>{if(n!==void 0)return``;if(t===void 0)return r??``;let i=Number.parseInt(t,16);return String.fromCodePoint(i===0||i>1114111||i>=55296&&i<=57343?65533:i)}),Wt=e=>{let t=e.trim(),n=t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`);return Ut(n?t.slice(1,-1):t)},Gt=e=>e.startsWith(`"`)&&Ht(Wt(e))?JSON.stringify(Wt(e)):Bt.test(e)||Vt.test(e)?e:JSON.stringify(e),Kt=e=>e===void 0?{}:{...e!==`auto`&&{direction:e},"unicode-bidi":e===`auto`?`plaintext`:`isolate`},qt=e=>[...new Set([e.family,...e.family===`Inter`?[`Inter Variable`]:[],...e.family===`JetBrains Mono`?[`JetBrains Mono Variable`]:[],...e.fallbackFamilies])].map(e=>Gt(e)).join(`, `),Jt=e=>Object.entries({...e.variations,...e.weight!==void 0&&{wght:e.weight},...e.opticalSize?.mode===`fixed`&&{opsz:e.opticalSize.value}}).toSorted(([e],[t])=>e.localeCompare(t,`en`,{caseFirst:`upper`})).map(([e,t])=>`${JSON.stringify(e)} ${String(t)}`).join(`, `),Yt=e=>{let t=Object.entries(e??{}).toSorted(([e],[t])=>e.localeCompare(t,`en`)).map(([e,t])=>`${JSON.stringify(e)} ${String(t)}`).join(`, `);return t===``?`normal`:t},Xt=e=>e.mode===`normal`?`normal`:e.mode===`percent`?String(e.value/100):e.value;function Zt(e){return{...e.lineHeight!==void 0&&{"line-height":Xt(e.lineHeight)},...e.letterSpacing!==void 0&&{"letter-spacing":typeof e.letterSpacing==`number`?e.letterSpacing:`${String(e.letterSpacing.value/100)}em`}}}const Qt=e=>e===void 0?`auto`:typeof e==`number`?e:e.mode===`font-default`?`from-font`:`${String(e.value)}%`,$t=e=>({"text-decoration-line":e.line,"text-decoration-style":e.style,"text-decoration-color":e.color===void 0?`currentColor`:Ue(e.color),"text-decoration-thickness":Qt(e.thickness),"text-underline-offset":Qt(e.offset),"text-decoration-skip-ink":e.skipInk??`auto`}),en=e=>`${JSON.stringify(e)}\n`,tn=e=>{if(e<1)throw RangeError(`a chunk has to be able to hold at least one character`);let t=``,n=[],r=!1,i=!1,a=()=>{let e={body:t,continues:r,eventCount:n.length-+!!r,firstEventMs:n.length===0?0:Math.min(...n),lastEventMs:n.length===0?0:Math.max(...n)};return r=!t.endsWith(`
|
|
3
3
|
`),t=``,n=r?[n.at(-1)??0]:[],e};return{pending:()=>t.length,add:r=>{let o=[],s=en(r.event);for(n.push(r.atMs),i=!0;t.length+s.length>=e;){let n=e-t.length;t+=s.slice(0,n),s=s.slice(n),o.push(a())}return t+=s,o},drain:()=>!i||t.length>0?[a()]:[]}},nn=(e,t)=>{let n=tn(t);return[...e.flatMap(e=>n.add(e)),...n.drain()]},rn=[`recording.start`,`recording.appendChunk`,`recording.complete`],an=e=>async t=>{let n=r.parse(await e.mutate(rn[0],{sourceUrl:t.sourceUrl,viewport:t.viewport,pageTitle:t.pageTitle,audio:null})),i=n.upload;try{let r=nn(t.entries,8388608);for(let[t,a]of r.entries()){let r=new TextEncoder().encode(a.body),o=await e.upload({url:i.url,headers:i.headers,body:r});i=s.parse(await e.mutate(rn[1],{recordingId:n.recordingId,index:t,firstEventMs:a.firstEventMs,lastEventMs:a.lastEventMs,eventCount:a.eventCount,continues:a.continues,bytes:r.byteLength,etag:o})).upload}let a=Math.max(0,...t.entries.map(e=>e.atMs));return ie.parse(await e.mutate(rn[2],{recordingId:n.recordingId,durationMs:a,viewport:t.viewport,sourceUrl:t.sourceUrl,interrupted:!1,...t.canvasId!==void 0&&{canvasId:t.canvasId},audioChunkCount:0,hasRecoverableBytes:!1}))}catch{throw new be(`Recording ${n.recordingId} began, but not every chunk was committed.`,`Run 'enhance recording discard --recording-id ${n.recordingId}' to remove the incomplete attempt before retrying the fixture.`)}},on=[`screen.create`,`screen.complete`],sn=e=>async t=>{let n=o.parse(await e.mutate(on[0],{clientToken:t.clientToken,provenance:t.provenance,route:t.route,pageTitle:t.pageTitle,viewport:t.viewport,bytes:t.body.byteLength}));try{let r=await e.upload({url:n.upload.url,headers:n.upload.headers,body:t.body}),i=a.parse(await e.mutate(on[1],{screenId:n.screenId,etag:r}));return{screenId:i.screenId,clientToken:t.clientToken,route:t.route,title:t.pageTitle,viewport:t.viewport,atMs:t.provenance?.atMs??null,sourceRecordingId:t.provenance?.sourceRecordingId??null,assetBundle:null,download:null,storedBytes:i.storedBytes}}catch{throw new be(`Screen ${n.screenId} was reserved, but its upload did not complete.`,`Retry 'enhance fixture screen' with the same --client-token ${t.clientToken}.`)}},cn=[`organisation.create`,`canvas.create`,`screen.create`,`screen.complete`,`canvas.document.get`,`canvas.document.save`],ln=(t,n)=>async r=>{let i=e.parse(await t.mutate(cn[0],{name:r.organisationName})).organisation,a=l.parse(await t.mutate(cn[1],{title:r.canvasTitle,organisationId:i.id,sourceUrl:null}));try{let e=[];for(let t of r.screens)e.push(await n(t));let o=se.parse(await t.query(cn[4],{canvasId:a.id})),s=Me();for(let[t,n]of e.entries())s=Te(s,{id:`fixture-screen-${String(t+1)}`,label:`Fixture screen ${String(t+1)}`,screenId:n.screenId,viewport:r.screens[t]?.viewport??{width:1440,height:900},at:{x:48+t*48,y:48+t*48}});let c=oe.parse(await t.mutate(cn[5],{canvasId:a.id,baseVersion:o.version,document:s,screenIds:e.map(e=>e.screenId)}));if(c.outcome===`conflict`)throw new be(`World canvas ${a.id} was created, but another writer changed its document.`,`Read 'enhance canvas document get --canvas-id ${a.id}' before adding the screens.`);return{organisationId:i.id,canvasId:a.id,screenIds:e.map(e=>e.screenId),documentVersion:c.version}}catch(e){throw e instanceof be?e:new be(`Organisation ${i.id} and canvas ${a.id} exist, but the world is incomplete.`,`Inspect 'enhance canvas get --canvas-id ${a.id}' before retrying any missing steps.`)}},un=async(e,t)=>{if(e!==void 0&&e!==``)return e.trim();if(f.stdin.isTTY)throw new u(`BAD_REQUEST`,`A token is required and interactive prompting is disabled.`,`Pass '--token <token>' or pipe one line to '${t}'.`);let n=ht({input:f.stdin,crlfDelay:1/0});for await(let e of n){n.close();let t=e.trim();if(t!==``)return t;break}throw new u(`BAD_REQUEST`,`A token is required.`,`Pass '--token <token>' or pipe one line to '${t}'.`)},dn=async e=>{if(e!==void 0)return e.trim();if(f.stdin.isTTY)return null;let t=ht({input:f.stdin,crlfDelay:1/0});for await(let e of t){t.close();let n=e.trim();return n===``?null:n}return null},fn=(e,t,n)=>{let r=e.command(`auth`).description(`Store and inspect the agent credential.`);r.command(`login`).description(`Authenticate in a browser, then store a revocable agent credential.`).option(`--token <token>`,`Use an existing agent token instead of browser authentication.`).option(`--no-open`,`Print the authorization URL without opening the browser.`).action(async e=>{let r=await dn(e.token);if(r!==null){n.result(await t.loginWithToken(r));return}n.result(await t.loginWithBrowser({label:`CLI on ${pt()}`.slice(0,120),openBrowser:e.open,onReady:e=>{n.result({status:`waiting_for_browser`,url:e})}}))}),r.command(`status`).description(`Resolve the stored token to its person, label, and expiry.`).action(async()=>{n.result(await t.status())}),r.command(`logout`).description(`Delete the local credential file; this does not revoke the server token.`).action(async()=>{n.result(await t.logout())})},pn=p.coerce.number().int().positive(),mn=p.coerce.number().positive(),hn=p.uuid(),gn=p.union([p.string(),p.number(),p.null()]),_n=p.record(p.string(),gn),vn=p.array(p.object({nodeId:p.string().min(1).max(200),textContent:p.string()})).min(1),yn=p.array(p.object({nodeId:p.string().min(1).max(200),name:p.string()})).min(1),bn=p.array(p.object({nodeIds:p.array(p.string().min(1).max(200)).min(1),styles:_n})).min(1),xn=p.array(p.object({id:p.string().min(1).max(200),parentId:p.string().min(1).max(200).optional()})).min(1),Sn=p.array(p.union([p.object({nodeId:p.string().min(1).max(200),before:p.string().min(1).max(200)}),p.object({nodeId:p.string().min(1).max(200),after:p.string().min(1).max(200)}),p.object({nodeId:p.string().min(1).max(200),parentId:p.string().min(1).max(200),index:p.number().int().nonnegative().optional()})])).min(1),Cn=p.array(p.string().min(1).max(200)).min(1),wn=p.coerce.number().int().min(0),Tn=p.uuid().nullable(),En=(e,t,n)=>{let r=e.safeParse(t);if(r.success)return r.data;throw new u(`BAD_REQUEST`,`${n} is invalid.`,`Run the command with --help.`)},Dn=e=>En(pn,e,`--base-version`),On=(e,t,n)=>{let r=Tn.safeParse(t??null);if(!r.success)throw new u(`BAD_REQUEST`,`--client-token must be a UUID.`,`Mint one UUID and reuse it only when retrying the exact same command.`);e.mutationKey.select(r.data,n)},kn=(e,t)=>e.mutationKey.current(`canvas.applyOperations`,{purpose:t}),An=async(e,t,r,i)=>{On(e,t.clientToken,!1);let a=n(t.canvas),o=Dn(t.baseVersion);return xe(a)&&Ze(a,await Je(e,a.canvasId,o),i),qe(e.remote).execute({canvasId:a.canvasId,mutationId:kn(e,r),baseVersion:o,operations:[...i]})},jn=async(e,t,r,i)=>{On(e,t.clientToken,!1);let a=n(t.canvas);return et(e.remote).execute({...a,baseVersion:Dn(t.baseVersion),mutationId:kn(e,`canvas.edit`),edits:r,...i!==void 0&&{idPrefix:i}})},Mn=(e,t)=>{if(!e.startsWith(`@`))return e;let n=e.slice(1);if(n===``)throw new u(`BAD_REQUEST`,`${t} @ must name a file.`,`Pass ${t} @/absolute/path/to/file or an inline value.`);let r=h.resolve(n);try{if(!wt(r).isFile())throw Error(`not a regular file`);return St(r,`utf8`)}catch{throw new u(`BAD_REQUEST`,`Could not read the file at ${r}.`,`Use a readable regular UTF-8 file.`)}},Nn=p.array(re).min(1),Pn=e=>{try{return JSON.parse(Mn(e,`--operations`))}catch(e){throw e instanceof u?e:new u(`BAD_REQUEST`,`--operations must be one valid JSON array.`,`Pass inline JSON or @/absolute/path/layout.json; run 'enhance canvas apply --help' for examples.`)}},Fn=e=>{let t=Pn(e),n=Nn.safeParse(t);if(!n.success){let e=n.error.issues[0];throw new u(`BAD_REQUEST`,`The canvas operation batch is invalid${e===void 0||e.path.length===0?``:` at ${e.path.join(`.`)}`}.`,`Correct the named operation; run 'enhance canvas apply --help' for the supported vocabulary.`)}return n.data},In=p.coerce.number().int().positive(),Ln=e=>{let t=In.safeParse(e);if(t.success)return t.data;throw new u(`BAD_REQUEST`,`--base-version is invalid.`,`Run 'enhance canvas apply --help'.`)},Rn=(e,t)=>{let n=p.uuid().nullable().safeParse(t??null);if(!n.success)throw new u(`BAD_REQUEST`,`--client-token must be a UUID.`,`Mint one UUID and reuse it only when retrying this exact operation batch.`);return e.mutationKey.select(n.data,!1),e.mutationKey.current(`canvas.applyOperations`,{})},zn=(e,t)=>{e.command(`apply`).description(`Apply an atomic canvas edit batch and return its affected bounds.`).summary(`Apply edits and return affected bounds.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact version returned by canvas inspect or tree.`).requiredOption(`--operations <json-or-@path>`,`JSON operation array inline, or @path to a JSON file.`).option(`--client-token <uuid>`,`Stable UUID to reuse only when retrying this exact batch.`).addHelpText(`after`,[``,`Supported operations: insertNode, insertText, insertPrototype, setText, editText, setBox, setLabel, setVisibility, setLocked, setConstraints, setStyles, setAppearance, setLayout, patchTypography, setTypography, patchAdditionalStyles, setAdditionalStyles, setProps, setParentage, move, remove.`,`Use editText for revision-aware character or range changes. setText replaces the whole text and is rejected if it conflicts with a newer text edit.`,`Example:`,` enhance canvas apply --canvas <url-or-id> --base-version 3 --operations '[{"op":"insertText","nodeId":"txt_summary","parentId":"root","text":"Checkout needs an address.","box":{"x":120,"y":594,"width":720,"height":80},"styles":{"font-size":24}}]'`].join(`
|
|
4
4
|
`)).action(async e=>{Rn(t,e.clientToken);let r=n(e.canvas),i=Ln(e.baseVersion),a=Fn(e.operations);xe(r)&&Ze(r,await Je(t,r.canvasId,i),a);let o=await t.invocation.invoke({capability:d(t.catalog(),`canvas.apply`),arguments:{canvasId:r.canvasId,baseVersion:i,operations:[...a]},clientToken:e.clientToken??null});t.output.result(o)})},Bn=e=>{try{return JSON.parse(e)}catch{return}},Vn=e=>{if(e===void 0)return null;let t=de.safeParse(Bn(e));if(t.success)return t.data;throw new u(`BAD_REQUEST`,`--bounds must be a positive world rectangle.`,`Pass JSON with x, y, width and height.`)},Hn=e=>e===void 0?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e!==``).slice(0,100),Un=(e,t)=>{e.command(`begin`).description(`Start visible agent activity.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID.`).requiredOption(`--phase <phase>`,`reading, writing, creating, deleting, or rendering.`).option(`--node-ids <ids>`,`Comma-separated stable node ids.`).option(`--bounds <json>`,`Optional world rectangle for not-yet-created content.`).action(async e=>{let n=ee.safeParse(e.phase);if(!n.success)throw new u(`BAD_REQUEST`,`--phase is invalid.`,`Use reading, writing, creating, deleting, or rendering.`);let r=te(e.canvas),i=c.parse(await t.remote.mutate(`canvas.realtime.activity.begin`,{canvasId:r,phase:n.data,nodeIds:Hn(e.nodeIds),bounds:Vn(e.bounds)}));t.output.result({...i,next:[`enhance canvas work update --canvas ${r} --activity-id ${i.activityId} --phase ${n.data}`,`enhance canvas finish-working-on-nodes --canvas ${r} --activity-id ${i.activityId}`]})})},Wn=(e,t)=>{e.command(`update`).description(`Move visible agent activity.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID.`).requiredOption(`--activity-id <uuid>`,`Lease id returned by work begin.`).requiredOption(`--phase <phase>`,`Current agent phase.`).option(`--node-ids <ids>`,`Comma-separated current stable node ids.`).option(`--bounds <json>`,`Optional current world rectangle.`).action(async e=>{t.output.result(c.parse(await t.remote.mutate(`canvas.realtime.activity.renew`,{canvasId:te(e.canvas),activityId:hn.parse(e.activityId),phase:ee.parse(e.phase),nodeIds:Hn(e.nodeIds),bounds:Vn(e.bounds)})))})},Gn=(e,t)=>{e.command(`finish-working-on-nodes`).description(`End visible agent activity.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID.`).requiredOption(`--activity-id <uuid>`,`Lease id returned by canvas work begin.`).action(async e=>{if(!await We(t.remote).finish(te(e.canvas),hn.parse(e.activityId)))throw new u(`NOT_FOUND`,`The activity could not be finished.`,`It may already have expired; run canvas work begin for new work.`);t.output.result({ended:!0,activityId:e.activityId})})},Kn=(e,t)=>{let n=e.command(`work`).description(`Manage visible agent activity.`);Un(n,t),Wn(n,t),Gn(e,t)},g=(e,t,n)=>{let r=(()=>{try{return JSON.parse(Mn(e,n))}catch(e){throw e instanceof u?e:new u(`BAD_REQUEST`,`${n} must be valid JSON.`,`Pass inline JSON or @/absolute/path/to/input.json; run the command with --help.`)}})(),i=t.safeParse(r);if(i.success)return i.data;let a=i.error.issues[0];throw new u(`BAD_REQUEST`,`${n} is invalid${a===void 0||a.path.length===0?``:` at ${a.path.join(`.`)}`}.`,a?.message??`Correct the JSON shape and retry.`)},qn=(e,t)=>{e.command(`set-text-content`).description(`Set Text node values.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact current canvas version.`).requiredOption(`--updates <json-or-@path>`,`Array of {nodeId,textContent} updates.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact batch.`).action(async e=>{let n=g(e.updates,vn,`--updates`).map(e=>({kind:`set_text`,nodeId:e.nodeId,text:e.textContent}));t.output.result(await jn(t,e,n))})},Jn=(e,t)=>{e.command(`rename-nodes`).description(`Rename layers.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact current canvas version.`).requiredOption(`--updates <json-or-@path>`,`Array of {nodeId,name} updates.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact batch.`).action(async e=>{let n=g(e.updates,yn,`--updates`).map(e=>({kind:`rename`,nodeId:e.nodeId,name:e.name}));t.output.result(await jn(t,e,n))})},Yn=(e,t)=>{e.command(`delete-nodes`).description(`Delete node subtrees.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact current canvas version.`).requiredOption(`--node-ids <json-or-@path>`,`JSON array of stable node ids.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact batch.`).action(async e=>{let n=g(e.nodeIds,Cn,`--node-ids`);t.output.result(await An(t,e,`delete-nodes`,n.map(e=>({op:`remove`,nodeId:e}))))})},Xn=(e,t)=>{e.command(`update-styles`).description(`Update visual and layout styles.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact current canvas version.`).requiredOption(`--updates <json-or-@path>`,`Array of {nodeIds,styles} updates.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact batch.`).action(async e=>{let n=g(e.updates,bn,`--updates`);t.output.result(await jn(t,e,n.map(e=>({kind:`set_styles`,...e}))))})},Zn=(e,t)=>{e.command(`edit`).description(`Apply an atomic canvas edit batch.`).requiredOption(`--canvas <url-or-id>`,`Canvas or selection URL, or canvas UUID.`).requiredOption(`--base-version <integer>`,`Canvas version to edit; use the previous write result to continue.`).requiredOption(`--edits <json-or-@path>`,`Array of edits with kind set_text, set_styles, rename, duplicate or move.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact batch.`).addHelpText(`after`,`
|
|
5
5
|
Edit shapes (combine related edits in one array):
|
|
@@ -15,8 +15,8 @@ Use input-version IDs. Duplicate mappings are returned for a subsequent call.
|
|
|
15
15
|
`),Lr=(e,t,n,r)=>{let i=kr(e,t),a=` `.repeat(n),o=[`data-node-id=${JSON.stringify(i.id)}`,`data-name=${JSON.stringify(i.label)}`,`style={${JSON.stringify(Dr(i,e))}}`];if(i.locked===!0&&o.push(`data-locked="true"`),i.component===`image`)return`${a}<img ${o.join(` `)} alt=${JSON.stringify(Ar(i,`alt`))} src=${JSON.stringify(Ar(i,`src`))} />`;if(i.component===`svg`)return`${a}<div ${o.join(` `)} data-component="svg" />`;let s=i.component===`text`?`span`:`div`,c=i.component===`text`?Ir(i,n+1):``,l=(n>=r?[]:Or(e,t)).map(t=>Lr(e,t,n+1,r));return c===``&&l.length===0?`${a}<${s} ${o.join(` `)} />`:[`${a}<${s} ${o.join(` `)}>`,...c===``?[]:[`${a} ${c}`],...l,`${a}</${s}>`].join(`
|
|
16
16
|
`)},Rr=(e,t,n)=>Lr(e,t,0,n),zr=(e,t)=>t.map(t=>{let n=kr(e,t);return{nodeId:t,name:n.label,component:n.component,box:n.box,css:Dr(n,e),layout:n.layout,appearance:n.appearance,typography:n.typography}}),Br={topic:`canvas-agent-authoring`,workflow:[`Keep the complete selection link as --canvas; only selected nodes and descendants are in scope.`,`Unknown state: canvas inspect. When nodeCount=0, use target root and its version to create a populated screen using write-html --review none. No blank pre-render or empty shell.`,`Multiple screens: publish each populated screen before authoring the next so users see progress. Prepare only what that screen needs; do not prepare the whole set before the first write.`,`Existing content: read only missing subtree structure or ids. Reuse useful context and product styles.`,`Batch related text, style, rename, duplicate and move changes with canvas edit --edits. Existing focused commands also work.`,`Use the version from the latest successful read or write as --base-version. After a conflict, reread and recompute the requested edit.`,`Render the affected screen when ready for review and inspect the PNG. Repeat after changes or a concrete discrepancy.`],html:{modes:[`insert-children`,`replace`],rules:[`Use inline concrete CSS; flex, padding and gap. Avoid margin, grid, tables and inline layout.`,`Give screen rows, cards and buttons explicit dimensions; avoid relying on implicit stretch. Use block frames for colored badges.`,`Name meaningful groups with layer-name; include content and structure together.`,`Styled text controls become frames with editable text children.`,`Scripts, event handlers, embedded documents, executable URLs and CSS imports are rejected.`]},completion:[`Natural hierarchy with the fewest useful editable primitives.`,`The committed version and affected ids match the request.`,`Inspect the final PNG for hierarchy, alignment, clipping and overflow.`,`Keep text, layout and appearance editable in the ordinary inspector.`]},Vr=async(e,t)=>{let n=se.parse(await e.remote.query(`canvas.document.get`,{canvasId:t}));return{held:n,document:Fe.parse(n.document)}},Hr=(e,t)=>{e.command(`guide`).description(`Agent design workflow.`).action(()=>{t.output.result(Br)}),e.command(`get-jsx`).description(`Read concise subtree JSX.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to inspect.`).requiredOption(`--node-id <id>`,`Stable subtree root id.`).option(`--depth <integer>`,`Maximum descendant depth from 0 to 20.`,`8`).action(async e=>{let r=n(e.canvas),i=r.canvasId,{held:a,document:o}=await Vr(t,i);ae(r,o,[e.nodeId]),t.output.result({canvasId:i,version:a.version,nodeId:e.nodeId,jsx:Rr(o,e.nodeId,En(wn,e.depth,`--depth`)),warning:`This is a structural reading projection. Use canvas render as the pixel authority.`})}),e.command(`get-computed-styles`).description(`Read effective node CSS.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to inspect.`).requiredOption(`--node-ids <json-or-@path>`,`JSON array of stable node ids.`).action(async e=>{let r=n(e.canvas),i=r.canvasId,{held:a,document:o}=await Vr(t,i),s=g(e.nodeIds,Cn,`--node-ids`);ae(r,o,s),t.output.result({canvasId:i,version:a.version,nodes:zr(o,s),warning:`These are authored CSS instructions, not measured browser dimensions. Use canvas render as the pixel authority.`})})},Ur=e=>{if(e===void 0)throw new u(`BAD_REQUEST`,`--client-token is required with --input.`,`Mint one UUID for this request and reuse it only when retrying the same --input.`);return p.uuid().parse(e)},Wr=async(e,t)=>{if(t.input!==void 0){if([t.canvas,t.baseVersion,t.nodes,t.idPrefix].some(e=>e!==void 0))throw new u(`BAD_REQUEST`,`Choose --input or the individual duplicate options.`,`Use --input with --client-token for native measured duplication.`);let n=d(e.catalog(),`canvas.duplicateNodes`);e.output.result(await e.invocation.invoke({capability:n,arguments:g(t.input,n.inputSchema,`--input`),clientToken:Ur(t.clientToken)}));return}if(t.canvas===void 0||t.baseVersion===void 0||t.nodes===void 0)throw TypeError(`The required-option check let duplicate-nodes run without --canvas, --base-version or --nodes.`);let n=g(t.nodes,xn,`--nodes`).map(e=>({kind:`duplicate`,nodeIds:[e.id],...e.parentId!==void 0&&{parentId:e.parentId}})),r=await jn(e,{canvas:t.canvas,baseVersion:t.baseVersion,...t.clientToken!==void 0&&{clientToken:t.clientToken}},n,t.idPrefix),{duplicatedNodes:i,...a}=r;e.output.result({...r,duplicatedNodes:i,apply:a})},Gr=(e,t)=>{e.command(`duplicate-nodes`).description(`Deep-clone node subtrees; --input uses native measured layout and durable copy receipts.`).option(`--input <json-or-@path>`,`Scoped native duplication request; requires --client-token.`).option(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).option(`--base-version <integer>`,`Exact current canvas version.`).option(`--nodes <json-or-@path>`,`Array of {id,parentId?} requests.`).option(`--id-prefix <prefix>`,`Stable namespace for cloned ids.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact batch.`).action(async e=>Wr(t,e))},Kr=(e,t)=>{e.command(`move-nodes`).description(`Reorder or reparent nodes.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact current canvas version.`).requiredOption(`--moves <json-or-@path>`,`Sequential before, after, or parent/index moves.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact batch.`).action(async e=>{let n=await jn(t,e,g(e.moves,Sn,`--moves`).map(e=>({kind:`move`,nodeId:e.nodeId,destination:`before`in e?{kind:`before`,nodeId:e.before}:`after`in e?{kind:`after`,nodeId:e.after}:{kind:`parent`,parentId:e.parentId,...e.index!==void 0&&{index:e.index}}}))),{moves:r,affectedParents:i,...a}=n;t.output.result({...n,moves:r,affectedParents:i,apply:a})})},qr=(e,t)=>{Gr(e,t),Kr(e,t)},Jr=e=>Mn(e,`--html`),Yr=new Set([`flex-grow`,`flex-shrink`,`font-weight`,`opacity`,`order`,`z-index`]),Xr=async(e,t)=>{if(![`insert-children`,`replace`].includes(t.mode))throw new u(`BAD_REQUEST`,`--mode must be insert-children or replace.`,`Choose one of the two documented modes.`);if(![`none`,`render`].includes(t.review))throw new u(`BAD_REQUEST`,`--review must be none or render.`,`Choose one of the documented review modes.`);On(e,t.clientToken,!0);let r=t.mode===`replace`?`replace`:`insert-children`,i=n(t.canvas),a=Dn(t.baseVersion);e.output.result(await e.invocation.invoke({capability:d(e.catalog(),`canvas.writeHtml`),arguments:{canvasId:i.canvasId,...i.pageId!==void 0&&{pageId:i.pageId},...i.nodeIds.length>0&&{selectionNodeIds:[...i.nodeIds]},targetNodeId:t.targetNodeId,mode:r,html:Jr(t.html),...t.idPrefix!==void 0&&{idPrefix:t.idPrefix},baseVersion:a,review:t.review,renderOutputPath:t.output??null,overwriteRender:t.force===!0,renderScale:En(mn,t.scale,`--scale`),renderTimeoutMs:En(pn,t.timeoutMs,`--timeout-ms`)},clientToken:t.clientToken??null}))},Zr=(e,t)=>{e.command(`write-html`).description(`Compile HTML/CSS primitives.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact current canvas version.`).requiredOption(`--target-node-id <id>`,`Container receiving children, or node to replace.`).requiredOption(`--html <html-or-@path>`,`Inline HTML fragment or @path to a UTF-8 file.`).option(`--mode <mode>`,`insert-children or replace.`,`insert-children`).option(`--review <mode>`,`none to return after commitment; render to include review pixels.`,`render`).option(`--id-prefix <prefix>`,`Fresh namespace for a new import/replacement; reuse only for an identical retry.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact write and review.`).option(`--output <path>`,`Write the review PNG to this path.`).option(`--force`,`Replace an existing --output file deliberately.`,!1).option(`--scale <number>`,`Review pixels per canvas unit, from 0.1 to 4.`,`1`).option(`--timeout-ms <integer>`,`Review render polling deadline.`,`120000`).addHelpText(`after`,`
|
|
17
17
|
Write one visual group at a time. Use --review none for a committed receipt, then render its version and inspect the PNG. Use flex, padding and gap; use targeted commands for later edits.
|
|
18
|
-
`).action(async e=>Xr(t,e))},Qr=e=>e.replaceAll(/([a-z\d])([A-Z])/gu,`$1-$2`).toLowerCase(),$r=(e,t)=>typeof t==`number`&&!Yr.has(e)?`${String(t)}px`:String(t),ei=e=>Object.entries(e).filter(([,e])=>e!==null).map(([e,t])=>{let n=Qr(e);return`${n}:${$r(n,t??``)}`}).join(`;`).replaceAll(`&`,`&`).replaceAll(`"`,`"`),ti=e=>e.length===0?0:Math.max(...e.map(e=>e.x+e.width))+80,ni=(e,t)=>{e.command(`create-artboard`).description(`Create a top-level frame.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact current canvas version.`).requiredOption(`--name <name>`,`Meaningful layer name.`).requiredOption(`--styles <json-or-@path>`,`CSSProperties with width and height.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact creation and review.`).option(`--output <path>`,`Review PNG path.`).option(`--force`,`Replace an existing review PNG.`,!1).action(async e=>{let n=g(e.styles,_n,`--styles`);if(n.width===void 0||n.height===void 0)throw new u(`BAD_REQUEST`,`--styles must include width and height.`,`Use explicit whole-pixel dimensions such as 1440px and 900px.`);On(t,e.clientToken,!0);let r=te(e.canvas),i=Dn(e.baseVersion),a=await Je(t,r,i),o=Object.entries(a.relationships).flatMap(([e,t])=>{let n=a.nodes[e]?.box;return n!==void 0&&t.parentId===`root`?[n]:[]}),s={display:`flex`,flexDirection:`column`,left:ti(o),top:0,...n,position:`absolute`},c=e.name.replaceAll(`&`,`&`).replaceAll(`"`,`"`);t.output.result(await it(t.remote,t.render).execute({canvasId:r,targetNodeId:`root`,mode:`insert-children`,html:`<div layer-name="${c}" data-enhance-kind="frame" style="${ei(s)}"></div>`,idPrefix:`artboard_${t.mutationKey.current(`canvas.render.importSource`,{canvasId:r})}`,baseVersion:i,renderClientToken:t.mutationKey.current(`canvas.render.create`,{purpose:`create-artboard-review`}),renderOutputPath:e.output??null,overwriteRender:e.force===!0,renderScale:1,renderTimeoutMs:12e4}))})},ri=(e,t)=>{Zr(e,t),ni(e,t)},ii=(e,t)=>{for(let n of[`canvas.insertHtml`,`canvas.makeEditable`,`canvas.capture`,`canvas.arrange`]){let r=d(t.catalog(),n),i=n===`canvas.insertHtml`?`insert-html`:n===`canvas.makeEditable`?`make-editable`:n.slice(7);e.command(i).description(r.guide.summary).requiredOption(`--input <json-or-@path>`,`Canvas reference, base version and explicit native authoring request.`).requiredOption(`--client-token <uuid>`,`Stable intent ID; reuse unchanged after an uncertain outcome.`).action(async e=>{t.output.result(await t.invocation.invoke({capability:r,arguments:g(e.input,r.inputSchema,`--input`),clientToken:p.uuid().parse(e.clientToken)}))})}},ai=(e,t)=>{e.command(`remove`).description(`Remove explicitly named canvas subtrees with scope, lock and revision checks.`).requiredOption(`--input <json-or-@path>`,`Request containing canvasRef, baseVersion and rootNodeIds.`).requiredOption(`--client-token <uuid>`,`Stable intent ID; reuse unchanged after an uncertain outcome.`).action(async e=>{t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.remove`),arguments:g(e.input,fe,`--input`),clientToken:p.uuid().parse(e.clientToken)}))})},oi=(e,t)=>{e.command(`read`).description(`Read complete editable content, bounded evidence, or the supplied reference.`).summary(`Read linked canvas content.`).option(`--input <json-or-@path>`,`Bounded read request containing canvasRef, view and target options.`).option(`--canvas <url-or-id>`,`Complete canvas, page or selection URL for comprehensive reads.`).option(`--node-id <id>`,`Subtree within --canvas; unavailable with --input.`).action(async e=>{if(e.input===void 0==(e.canvas===void 0)||e.input!==void 0&&e.nodeId!==void 0)throw new u(`BAD_REQUEST`,`Choose exactly one of --input or --canvas; --node-id requires --canvas.`,`Use --input for bounded views, or --canvas with an optional --node-id for comprehensive reads.`);let n=e.input===void 0?{canvas:e.canvas,...e.nodeId!==void 0&&{nodeId:e.nodeId}}:g(e.input,me,`--input`);t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.read`),arguments:n,clientToken:null}))})},si=(e,t)=>{e.command(`find`).description(`Find accessible canvases and existing creation destinations with bounded results.`).option(`--input <json-or-@path>`,`Search title, collection, limit and continuation cursor.`,`{}`).action(async e=>{t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.find`),arguments:g(e.input,le,`--input`),clientToken:null}))}),ai(e,t),oi(e,t),e.command(`update-html`).description(`Apply an identity-preserving edit from a complete HTML snapshot.`).requiredOption(`--input <json-or-@path>`,`Request containing canvasRef, snapshotToken, html and removeNodeIds.`).requiredOption(`--client-token <uuid>`,`Stable intent ID; reuse unchanged after an uncertain outcome.`).action(async e=>{let n=g(e.input,Ie,`--input`);t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.updateHtml`),arguments:n,clientToken:p.uuid().parse(e.clientToken)}))})},ci=(e,t)=>{let n=d(t.catalog(),`prototype.publishCanvas`);e.command(`publish-prototype`).description(n.guide.summary).requiredOption(`--input <json-or-@path>`,`Complete canvas reference, baseVersion, unpacked build directory or existing deployment, and bounded waitMs.`).requiredOption(`--client-token <uuid>`,`Stable attachment intent; reuse the same arguments after uncertainty, use a new token after replanning.`).action(async e=>{t.output.result(await t.invocation.invoke({capability:n,arguments:g(e.input,n.inputSchema,`--input`),clientToken:p.uuid().parse(e.clientToken)}))})},li=(e,t)=>{let n=d(t.catalog(),`canvas.importAsset`);e.command(`import-asset`).description(n.guide.summary).requiredOption(`--input <json-or-@path>`,`Canvas reference and selected local file source.`).requiredOption(`--client-token <uuid>`,`Stable import intent; reuse after uncertainty.`).action(async e=>{t.output.result(await t.invocation.invoke({capability:n,arguments:g(e.input,n.inputSchema,`--input`),clientToken:p.uuid().parse(e.clientToken)}))})},ui=(e,t)=>{si(e,t),ci(e,t),li(e,t),ii(e,t),Hr(e,t),ri(e,t),Qn(e,t),qr(e,t),Kn(e,t)},di=e=>{let t=e.getOptionValue(`canvas`),r=e.getOptionValue(`canvasId`);if(t!==void 0&&r!==void 0)throw new u(`BAD_REQUEST`,`--canvas and --canvas-id cannot be combined.`,`Pass the pasted URL or UUID through --canvas.`);let i=t??r;if(typeof i!=`string`)throw TypeError(`The required-option check let canvas ${e.name()} run without --canvas.`);return{reference:n(i),url:i}},fi=(e,t)=>{let n=e.getOptionValue(`nodeId`)??(t.nodeIds.length===1?t.nodeIds[0]:void 0);if(typeof n!=`string`||n===``)throw new u(`BAD_REQUEST`,`--node-id or a single-node selection link is required.`,`Choose one node, or use canvas tree to inspect the linked selection.`);return n},pi=async(e,t,n,r)=>{let i=e.name()===`node`?fi(e,n):void 0,a=await Xe(t.remote,{canvas:r,...i!==void 0&&{nodeId:i}});if(i===void 0)return a;let{nodes:o,...s}=a;return{...s,node:o.find(e=>e.id===i)}},mi=(e,t)=>{for(let n of[`inspect`,`tree`,`node`,`selection`]){let r=e.commands.find(e=>e.name()===n),i=r?.options.find(e=>e.long===`--canvas-id`);r!==void 0&&i!==void 0&&(i.makeOptionMandatory(!1),r.options.find(e=>e.long===`--node-id`)?.makeOptionMandatory(!1),r.option(`--canvas <url-or-id>`,`Pasted canvas URL or UUID. Selection links limit reads and edits to the linked subtree.`),r.action(async()=>{let{reference:e,url:i}=di(r),a=xe(e)?await pi(r,t,e,i):await t.remote.query(`canvas.${n}`,{canvasId:e.canvasId,...n===`node`&&{nodeId:fi(r,e)}});t.output.result(a)}))}},hi=e=>{if(e.input===void 0)return null;if(e.canvas!==void 0||e.nodeId!==void 0||e.bounds!==void 0||e.expectedVersion!==void 0||e.atMs!==void 0||e.output!==void 0||e.force===!0||e.scale!==`1`||e.timeoutMs!==`120000`)throw new u(`BAD_REQUEST`,`The bounded --input request cannot be combined with individual render options.`,`Put the entire scoped render request in --input.`);return{arguments:g(e.input,Ne,`--input`),clientToken:Ur(e.clientToken)}},gi=`canvas render --canvas 0b9f4c1e-5d2a-4e8b-9c3f-7a6d1e2b4c50`,_i={"canvas render":gi},vi=p.coerce.number().int().positive(),yi=p.coerce.number().int().nonnegative(),bi=p.coerce.number().positive(),xi=(e,t,n,r=`canvas render`)=>{let i=e.safeParse(t);if(!i.success)throw new u(`BAD_REQUEST`,`${n} is invalid.`,`Run 'enhance ${r} --help'.`);return i.data},Si=e=>{if(e===void 0)return null;try{let t=de.safeParse(JSON.parse(e));if(t.success)return t.data}catch{}throw new u(`BAD_REQUEST`,`--bounds must be a finite positive world rectangle.`,`Pass JSON such as '{"x":0,"y":0,"width":800,"height":600}'.`)},Ci=(e,t)=>e===void 0?t===null?{kind:`content`}:{kind:`bounds`,bounds:t}:{kind:`node`,nodeId:e},wi=e=>{if(!(typeof e!=`string`||!e.startsWith(`rec_`)))return p.uuid().safeParse(e.slice(4)).data},Ti=(e,t)=>{let n=p.uuid().nullable().safeParse(t??null);if(!n.success)throw new u(`BAD_REQUEST`,`--client-token must be a UUID.`,`Mint one UUID and reuse it only when retrying this exact render.`);return e.mutationKey.select(n.data,!1),e.mutationKey.current(`canvas.render.create`,{})},Ei=async(e,t)=>{let r=n(e.canvas??``),a=Ci(e.nodeId,Si(e.bounds)),o=e.expectedVersion===void 0?null:xi(vi,e.expectedVersion,`--expected-version`);if(!xe(r))return{target:a,expectedVersion:o};let s=se.parse(await t.remote.query(`canvas.document.get`,{canvasId:r.canvasId}));if(o!==null&&o!==s.version)throw new u(`CONFLICT`,`The canvas changed before rendering.`,`Read the linked page or selection and render its current version.`);return{target:i(r,Fe.parse(s.document),a),expectedVersion:s.version}},Di=async(e,t)=>{if(e.canvas===void 0)throw TypeError(`The required-option check let canvas render run without --canvas.`);if(e.nodeId!==void 0&&e.bounds!==void 0)throw new u(`BAD_REQUEST`,`--node-id and --bounds cannot be combined.`,`Choose one focused target, or omit both to render all authored content.`);let r=await Ei(e,t),i=r.target.kind===`node`?r.target.nodeId:void 0;if(i===void 0&&e.atMs!==void 0)throw new u(`BAD_REQUEST`,`--at-ms requires --node-id.`,"Render the stable recording node returned by `enhance canvas tree`.");let a=e.atMs===void 0?null:wi(i);if(a===void 0&&e.atMs!==void 0)throw new u(`BAD_REQUEST`,`--at-ms requires a stable recording node id such as rec_<recording-uuid>.`,"Run `enhance canvas tree --canvas <url-or-id>` and choose a recording node.");Ti(t,e.clientToken);let o=await t.invocation.invoke({capability:d(t.catalog(),`canvas.render`),arguments:{canvasId:n(e.canvas).canvasId,...r,sourceState:a==null?null:{kind:`recording`,recordingId:a,atMs:xi(yi,e.atMs??``,`--at-ms`)},scale:xi(bi,e.scale,`--scale`),outputPath:e.output??null,overwrite:e.force===!0,timeoutMs:xi(vi,e.timeoutMs,`--timeout-ms`)},clientToken:e.clientToken??null});t.output.result(o)},Oi=e=>e.parent===null?e:Oi(e.parent),ki=(e,t)=>{e.option(`--input <json-or-@path>`,`Bounded scoped render request; requires --client-token.`).option(`--canvas <url-or-id>`,`Canvas URL or UUID to render.`).option(`--node-id <id>`,`Render one stable canvas node instead of all authored content.`).option(`--bounds <json>`,`Render an explicit rectangle in canvas world coordinates.`).option(`--expected-version <integer>`,`Refuse pixels from any other document version.`).option(`--at-ms <integer>`,`Pause a recording node at this millisecond; inspect the PNG before snapshotting it.`).option(`--scale <number>`,`Output pixels per canvas unit, from 0.1 to 4.`,`1`).option(`--output <path>`,`Write the PNG to this path instead of a protected temporary file.`).option(`--force`,`Replace an existing --output file deliberately.`,!1).option(`--timeout-ms <integer>`,`Local polling deadline in milliseconds.`,`120000`).option(`--client-token <uuid>`,`Stable UUID to reuse only when retrying this render request.`).addHelpText(`after`,()=>`\nExample:\n ${Oi(e).name()} ${gi}\n\nFor transcript-led selection, inspect nearby --at-ms renders and reject transitions or duplicate states before running recording snapshot.\n`).action(async e=>{let n=hi(e);if(n===null)return Di(e,t);t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.render`),...n}))})},Ai=(e,t)=>{let n=e.commands.find(e=>e.name()===`canvas`);if(n===void 0)throw TypeError(`the API router did not supply canvas commands`);n.configureHelp({subcommandTerm:e=>e.name()});let r=n.commands.find(e=>e.name()===`render`);if(r===void 0)throw TypeError(`the API router did not supply canvas render`);let i=at(t.remote,Ke(t.configDirectory),t.now,t.output.result);zn(n,t),ui(n,{...t,render:i}),mi(n,t),ki(r,t)},v=p.string().trim().min(1).max(160),ji=p.string().regex(/^[a-f0-9]{64}$/u),Mi=p.number().int().positive(),Ni=p.strictObject({source:v,journey:v,step:v,variant:v}),Pi=p.strictObject({sha256:ji,bytes:p.number().int().positive(),mediaType:p.string().min(1).max(200)}),Fi=p.strictObject({organisationId:p.uuid().optional()}),Ii=p.strictObject({key:p.string().min(1),label:p.string().min(1),url:p.url().optional(),sequence:p.number().int().nonnegative(),attempt:p.number().int().nonnegative().default(0)}),Li=p.union([p.strictObject({runId:p.uuid()}),p.strictObject({reference:p.string().min(1),revision:p.string().min(1).optional()})]),Ri=p.strictObject({destination:Fi,context:Ii.optional(),revision:p.string().min(1).optional(),baselineRunId:p.uuid().nullable(),compareTo:Li.optional()}),zi=p.enum([`awaiting-review`,`approved`,`changes-requested`]),Bi=p.strictObject({format:p.literal(`enhance-capture`),version:p.literal(1),key:Ni,label:v,journeyLabel:v,order:p.number().int().nonnegative(),page:p.string().min(1).optional(),viewport:p.strictObject({width:Mi,height:Mi,deviceScaleFactor:p.number().positive()}),extent:p.enum([`viewport`,`full-page`]),source:p.strictObject({format:p.literal(`rrweb-screen`),version:p.literal(1),blob:Pi}),preview:p.strictObject({blob:Pi,width:Mi,height:Mi,pixelRatio:p.number().positive()}),assets:p.array(p.strictObject({url:p.url(),blob:Pi})),provenance:p.strictObject({adapter:v,sdkVersion:v,kernelVersion:v,browser:v,capturedAt:p.iso.datetime(),sourceUrl:p.url().optional(),commit:p.string().min(1).max(200).optional()}),issues:p.array(p.strictObject({code:v,message:p.string().min(1).max(500)}))}).superRefine((e,t)=>{(e.preview.width/e.preview.pixelRatio!==e.viewport.width||e.preview.height/e.preview.pixelRatio!==e.viewport.height)&&t.addIssue({code:`custom`,path:[`preview`],message:`The preview and captured CSS extent must match.`}),e.source.blob.mediaType!==`application/json`&&t.addIssue({code:`custom`,path:[`source`,`blob`,`mediaType`],message:`Capture sources must be frozen JSON.`}),e.preview.blob.mediaType!==`image/png`&&t.addIssue({code:`custom`,path:[`preview`,`blob`,`mediaType`],message:`Capture previews must be PNG.`}),new Set(e.assets.map(e=>e.url)).size!==e.assets.length&&t.addIssue({code:`custom`,path:[`assets`],message:`Capture resource URLs must be unique.`})}),Vi=p.strictObject({id:p.uuid(),canvasId:p.uuid(),source:v,runKey:v,generation:p.number().int().nonnegative(),participants:p.array(v).min(1),expiresAt:p.iso.datetime(),formatVersion:p.literal(1),review:Ri.optional()}),Hi={participant:v,retry:p.number().int().nonnegative(),status:p.enum([`passed`,`failed`,`skipped`,`interrupted`,`timedOut`]),title:p.string().min(1).optional(),location:p.strictObject({file:p.string().min(1),line:p.number().int()}).optional(),captures:p.array(Bi)},Ui=p.strictObject({runner:p.literal(`playwright`).optional(),testId:v,project:v,...Hi}),Wi=p.strictObject({runner:p.literal(`script`),...Hi}),Gi=p.union([Ui,Wi]),Ki=p.strictObject({key:Ni.optional(),testId:v.optional(),message:p.string().min(1).max(500)}),qi=p.strictObject({format:p.literal(`enhance-capture-run`),version:p.literal(1),run:Vi,participants:p.array(p.strictObject({id:v,status:p.enum([`passed`,`failed`,`interrupted`])})).min(1),attempts:p.array(Gi),ordering:p.enum([`partial`,`complete`]),leftOut:p.array(Ki).optional()}),Ji=p.strictObject({runId:p.uuid(),canvasId:p.uuid(),canvasUrl:p.url(),version:p.number().int().positive(),manifestDigest:ji,frames:p.array(p.strictObject({key:Ni,frameId:v,captureId:p.uuid()})),issues:p.array(p.strictObject({code:v,message:p.string().max(500)}))}),Yi=p.strictObject({canvasId:p.uuid().optional(),destination:Fi.optional(),title:p.string().trim().min(1).optional(),context:Ii.optional(),revision:p.string().min(1).optional(),compareTo:Li.optional(),source:v.default(`default`),runKey:v,participants:p.array(v).min(1).default([`local`]),formatVersion:p.literal(1).default(1)}).superRefine((e,t)=>{e.canvasId===void 0==(e.destination===void 0)&&t.addIssue({code:`custom`,message:`Choose either a canvas or a destination for this run.`}),e.canvasId!==void 0&&(e.context!==void 0||e.compareTo!==void 0)&&t.addIssue({code:`custom`,message:`Run review requires a destination.`})}),Xi=p.strictObject({run:Vi});p.strictObject({runId:p.uuid()});const Zi=p.enum([`collecting`,`sealed`,`converting`,`committed`,`failed`,`cancelled`]),Qi=p.strictObject({run:Vi,state:Zi,receipt:Ji.nullable(),verdict:zi.optional(),failure:p.strictObject({code:v,message:p.string().max(1e3)}).nullable()});p.strictObject({runId:p.uuid(),blobs:p.array(Pi).min(1).max(400)});const $i=p.strictObject({uploads:p.array(p.strictObject({sha256:ji,upload:p.strictObject({url:p.url(),headers:p.record(p.string(),p.string()),expiresAt:p.iso.datetime()}).nullable()})).max(400)});p.strictObject({canvasId:p.uuid(),frameId:p.string().min(1),captureId:p.uuid()});const ea=p.strictObject({captureId:p.uuid(),capturedAt:p.iso.datetime(),commit:p.string().max(200).optional(),url:p.string().min(1),width:p.number().positive(),height:p.number().positive(),pixelRatio:p.number().positive()});p.strictObject({frameId:p.string(),before:ea,after:ea});const ta=m.array(m.object({code:m.string().check(m.minLength(1),m.maxLength(160)),message:m.string().check(m.minLength(1),m.maxLength(500))})).check(m.maxLength(32));m.object({issues:m.optional(ta),prototype:m.optional(m.object({prototypeId:m.uuid(),deploymentId:m.uuid()}))});const na={unreadable:`its saved capture could not be read`,notACapture:`it is not an Enhance capture`,pictureMismatch:`its picture does not match the size of its page`,nothingArrived:`none of its files arrived`,notSaved:`it could not be saved on this machine`,noPicture:`it could not be compiled and has no picture`,anotherSource:`it was captured for another source`,outsideShards:`its test ran outside this run's shards`},ra=(e,t)=>e<t?-1:e===t?0:1,ia=(e,t)=>{let n=Object.keys(e).toSorted(ra);t.output.push(`{`),t.pending.push({text:`}`});for(let r=n.length-1;r>=0;r--){let i=n[r];i!==void 0&&(t.pending.push({value:Reflect.get(e,i)},{text:`${JSON.stringify(i)}:`}),r>0&&t.pending.push({text:`,`}))}},aa=(e,t)=>{if(e===null||typeof e==`boolean`||typeof e==`string`||typeof e==`number`&&Number.isFinite(e))return t.output.push(JSON.stringify(e)),!0;if(typeof e!=`object`||t.active.has(e)||!Array.isArray(e)&&Object.getPrototypeOf(e)!==Object.prototype)return!1;if(t.active.add(e),t.pending.push({leave:e}),Array.isArray(e)){t.output.push(`[`),t.pending.push({text:`]`});for(let n=e.length-1;n>=0;n--)t.pending.push({value:e[n]}),n>0&&t.pending.push({text:`,`})}else ia(e,t);return!0},oa=e=>{let t={pending:[{value:e}],active:new Set,output:[]};for(;t.pending.length>0;){let e=t.pending.pop();if(e===void 0)break;if(`text`in e)t.output.push(e.text);else if(`leave`in e)t.active.delete(e.leave);else if(!aa(e.value,t))return null}return t.output.join(``)},sa=e=>{let t=2166136261;for(let n of e)t^=n.codePointAt(0)??0,t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,`0`)},ca=e=>{let t=e.trim();return t.length<=160?t:`${t.slice(0,151).trimEnd()} ${sa(t)}`},la=e=>JSON.stringify([e.source,e.journey,e.step,e.variant]),ua=(e,t)=>e<t?-1:e===t?0:1,da=e=>{let t=new Set,n=[];for(let r of e)for(let e of[r.source.blob,r.preview.blob,...r.assets.map(e=>e.blob)])t.has(e.sha256)||(t.add(e.sha256),n.push(e));return n.toSorted((e,t)=>ua(e.sha256,t.sha256))},fa=`node`,pa=e=>`testId`in e&&e.testId!==fa?e.testId:void 0,y=e=>`testId`in e&&e.testId!==fa?JSON.stringify([e.participant,e.project,e.testId]):JSON.stringify([e.participant,`script`]),ma=(e,t)=>{let n=pa(e);return e.captures.map(e=>({key:e.key,...n!==void 0&&{testId:n},message:t}))},ha=(e,t)=>{let n=new Set(e.run.participants),r=new Set,i=new Map;for(let a of e.attempts){let e=JSON.stringify([y(a),a.retry]);if(!n.has(a.participant)){t.push(...ma(a,na.outsideShards));continue}if(r.has(e)||(r.add(e),a.captures.length===0))continue;let o=i.get(y(a));(o===void 0||o.retry<a.retry)&&i.set(y(a),a)}return e.attempts.filter(e=>i.get(y(e))===e)},ga=e=>JSON.stringify([e.key.journey,e.key.variant]),_a=(...e)=>e.find(e=>e!==0)??0,va=(e,t)=>_a(ua(e.artifact.key.journey,t.artifact.key.journey),ua(e.artifact.key.variant,t.artifact.key.variant),e.artifact.order-t.artifact.order,ua(e.attempt.location?.file??``,t.attempt.location?.file??``),(e.attempt.location?.line??0)-(t.attempt.location?.line??0),ua(y(e.attempt),y(t.attempt)),e.index-t.index),ya=e=>{let t=Map.groupBy(e,e=>la(e.artifact.key)),n=new Map;for(let e of t.values()){let t=Map.groupBy(e,e=>y(e.attempt));for(let e of t.values())for(let[r,i]of e.entries()){let e=t.size>1?` · ${i.attempt.title??pa(i.attempt)??`script`}`:``,a=r>0?` (${String(r+1)})`:``;n.set(i,`${e}${a}`)}}return n},ba=e=>{let t=ya(e),n=new Map(da(e.map(e=>e.artifact)).map(e=>[e.sha256,e])),r=e=>n.get(e.sha256)??e,i=new Map,a=new Map;return e.map(e=>{let{artifact:n}=e,o=ga(n);i.has(o)||i.set(o,n.page);let s=a.get(o)??0;a.set(o,s+1);let c=t.get(e)??``,l=i.get(o),u={...n};return delete u.page,{...u,...l!==void 0&&{page:l},key:{...n.key,step:ca(`${n.key.step}${c}`)},label:ca(`${n.label}${c}`),order:s,source:{...n.source,blob:r(n.source.blob)},preview:{...n.preview,blob:r(n.preview.blob)},assets:n.assets.map(e=>({...e,blob:r(e.blob)}))}})},xa=e=>{let t=qi.safeParse(e);if(!t.success)return{refusal:`Invalid capture manifest.`,leftOut:[]};let n=t.data,r=[...n.leftOut??[]],i=ha(n,r).flatMap(e=>e.captures.map((t,n)=>({artifact:t,attempt:e,index:n}))).filter(e=>{if(e.artifact.key.source===n.run.source)return!0;let t=pa(e.attempt);return r.push({key:e.artifact.key,...t!==void 0&&{testId:t},message:na.anotherSource}),!1}).toSorted(va);return i.length===0?{refusal:`A run must contain at least one capture.`,leftOut:r}:{captures:ba(i),leftOut:r}},Sa=(e,t)=>oa({...e,expiresAt:``})===oa({...t,expiresAt:``}),Ca=e=>{let t=oa(e);return t===null?null:`enhance-capture-run:v1\0${t}`},wa=(e,t)=>_a(ua(y(e),y(t)),e.retry-t.retry),Ta=e=>{let t=e[0];if(t===void 0)return`At least one participant manifest is required.`;let n=new Map,r=[],i=[];for(let a of e){if(!Sa(a.run,t.run)||a.ordering!==t.ordering)return`Participant manifests must belong to the same reserved run and ordering.`;if(!a.participants.some(e=>n.has(e.id))){for(let e of a.participants)n.set(e.id,e);i.push(...a.leftOut??[]);for(let e of a.attempts)a.participants.some(t=>t.id===e.participant)?r.push(e):i.push(...ma(e,na.outsideShards))}}let a={...t};return delete a.leftOut,{...a,participants:Array.from(n,([,e])=>e).toSorted((e,t)=>ua(e.id,t.id)),attempts:r.toSorted(wa),...i.length>0&&{leftOut:i}}},Ea=[`journey`,`step`,`variant`],Da=[`label`,`journeyLabel`],Oa=e=>typeof e==`string`?ca(e):e,ka=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return e;let t={...e};for(let e of Da)t[e]=Oa(t[e]);let n=t.key;if(typeof n==`object`&&n&&!Array.isArray(n)){let e={...n};for(let t of Ea)e[t]=Oa(e[t]);t.key=e}return t},Aa=e=>e.length>0&&e.every(e=>e.path.length===1&&e.path[0]===`preview`),ja=(e,t,n)=>{let r=typeof e==`object`&&e?Ni.safeParse(Reflect.get(e,`key`)):null;return{...r?.success===!0&&{key:r.data},...t!==void 0&&{testId:t},message:Aa(n)?na.pictureMismatch:na.notACapture}},Ma={captures:p.array(p.unknown())},Na=qi.extend({attempts:p.array(p.union([Ui.extend(Ma),Wi.extend(Ma)]))}).transform(e=>{let t=[...e.leftOut??[]],n=e.attempts.map(e=>({...e,captures:e.captures.flatMap(n=>{let r=ka(n),i=Bi.safeParse(r);return i.success?[i.data]:(t.push(ja(r,`testId`in e?e.testId:void 0,i.error.issues)),[])})}));return{...e,attempts:n,...t.length>0&&{leftOut:t}}});p.strictObject({manifest:Na}),p.strictObject({canvasId:p.uuid()}).extend({verdict:zi});const Pa=p.strictObject({canvasId:p.uuid(),name:p.string().min(1)}),Fa=p.strictObject({runId:p.uuid(),revision:p.string(),version:p.number().int().positive()}),Ia=Pa.extend({expectedVersion:p.number().int().nonnegative(),revision:p.string().min(1)}),La=p.strictObject({current:Qi,latest:Vi,related:p.array(p.strictObject({run:Vi,verdict:zi})),changes:p.array(p.strictObject({key:Ni,frameId:p.string(),label:p.string(),journeyLabel:p.string(),page:p.string().optional(),change:p.enum([`new`,`changed`,`unchanged`,`uncompared`])}))}),b=(e,t,n,r)=>Object.assign(Error(t),{code:e,...n!==void 0&&{runId:n},...r}),Ra=e=>e instanceof Error&&typeof Reflect.get(e,`code`)==`string`,za=e=>Dt(`sha256`).update(e).digest(`hex`),Ba=async e=>{let t=Dt(`sha256`);return await It(_t(e),async e=>{for await(let n of e)t.update(n)}),t.digest(`hex`)},Va=e=>{let t=Ca(e);if(t===null)throw Error(`A capture manifest must contain only finite JSON values.`);return Dt(`sha256`).update(t).digest(`hex`)},Ha=Lt(`enhance.capture.resources`),Ua=(e,t)=>{if(!/^[a-f0-9]{64}$/u.test(t))throw b(`artifact`,`Invalid capture blob digest.`);return h.join(h.resolve(e),`blobs`,t)},Wa=async(e,t)=>{for(let n of e)try{let e=Ua(n,t.sha256),r=await Pt(e);if(r.isFile()&&r.size===t.bytes&&await Ba(e)===t.sha256)return e}catch(e){Ha.publish({stage:`local-read`,sha256:t.sha256,error:e})}return null},Ga=e=>e instanceof Error&&Reflect.get(e,`code`)===`EEXIST`,Ka=async(e,t)=>{try{await kt(e,t)}catch(e){if(!Ga(e)||!(await Pt(t)).isFile())throw e}finally{await Nt(e,{force:!0})}},qa=async(e,t,n)=>{try{if(t.bytes!==n.byteLength||za(n)!==t.sha256)throw b(`artifact`,`Capture blob bytes do not match their descriptor.`);await At(h.join(e,`blobs`),{recursive:!0});let r=Ua(e,t.sha256),i=`${r}.${globalThis.crypto.randomUUID()}.tmp`;return await Ft(i,n,{flag:`wx`,mode:384}),await Ka(i,r),!0}catch(e){return Ha.publish({stage:`local-write`,sha256:t.sha256,error:e}),!1}},Ja=async(e,t)=>{let n=Bi.parse(t);if(await Wa([e],n.source.blob)===null&&await Wa([e],n.preview.blob)===null)throw b(`artifact`,`Neither the snapshot nor the preview of a capture is on disk.`);return n},Ya=async(e,t)=>{let n=`${e}.${globalThis.crypto.randomUUID()}.tmp`;await Ft(n,JSON.stringify(t),{mode:384}),await Mt(n,e)},Xa=async e=>{let t=JSON.parse(await jt(e,`utf8`));return Na.parse(t)},x={unversioned:void 0,v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8,v9:9,v10:10,v11:11,v12:12,v13:13,v14:14},Za={[x.v1]:`layout`,[x.v2]:`layout`,[x.v3]:`typography`,[x.v4]:`typography`,[x.v5]:`typography`,[x.v6]:`geometry`,[x.v7]:`geometry`,[x.v8]:`geometry`,[x.v9]:`geometry`,[x.v10]:`geometry`,[x.v11]:`css`,[x.v12]:`text-shadow-blend`,[x.v13]:`format-number`,[x.v14]:`format-number`},Qa=[`appearance-unsupported-component`,`styles-unsupported-component`,`text-shadow-blend-unsupported`,`recording-aspect-not-preserved`],S=e=>typeof e==`object`&&!!e&&!Array.isArray(e),$a=e=>Array.isArray(e)?e:void 0,C=(e,...t)=>Object.fromEntries(Object.entries(e).filter(([e])=>!t.includes(e))),eo=e=>`${e}~mask`,to={alpha:`alpha`,luminance:`luminance`,vector:`outline`},no=e=>{if(!S(e)||!S(e.compositing))return;let t=e.compositing.mask;return typeof t==`string`?to[t]:void 0},ro=e=>S(e)?C(e,`blendMode`,`blendSource`):e,io=e=>S(e)&&`paint`in e?{...C(e,`paint`,`alignment`),paints:[e.paint]}:e,ao=e=>{if(!S(e)||!S(e.progression))return e;let t=e.progression.startValue,n=e.value;return{...C(e,`progression`),value:typeof t==`number`&&typeof n==`number`?Math.max(t,n):n}},oo=e=>S(e)&&e.kind===`image`?C(e,`adjustments`):e,so=e=>$a(e)?.filter(e=>!S(e)||e.kind!==`inner`).map(e=>S(e)?{...e,spread:0}:e)??e,co=e=>{if(!S(e))return e;let t={...e,paint:ro(e.paint)};return e.alignment===`inside`?{...t,alignment:`center`}:t},lo=e=>{if(!S(e)||e.kind!==`span`)return e;let t=C(e,`decorationBlendMode`),n=$a(e.fills);n!==void 0&&(t.fills=n.map(e=>ro(e))),S(e.stroke)&&(t.stroke=co(e.stroke));let r=$a(e.children);return r!==void 0&&(t.children=r.map(e=>lo(e))),t},uo=(e,t)=>{let n=$a(t.fills);if(n===void 0)return;let[r]=n,i=S(r)?r.blendMode:void 0;typeof i==`string`&&n.length===1&&(e.blendMode??`normal`)===`normal`&&(t.blendMode=i),t.fills=n.map(e=>ro(e))},fo=(e,t)=>{let n={...e};`border`in e&&(n.border=io(e.border)),`outline`in e&&(n.outline=io(e.outline));let r=$a(e.fills);r!==void 0&&(n.fills=r.map(e=>oo(e)));let i=$a(e.filters);return i!==void 0&&(n.filters=i.map(e=>ao(e))),t?(`shadows`in e&&(n.shadows=so(e.shadows)),uo(e,n),n):n},po=e=>{let t=e.props;if(!S(t)||!S(t.paintFallback))return{...e};let n=t.paintFallback.mask;if(n===void 0)return{...e};let r=C(t.paintFallback,`mask`),i=Object.keys(r).length===0?C(t,`paintFallback`):{...t,paintFallback:r},a=e.styles,o=C(e,`props`);return S(n)&&S(a)&&(o.styles=Object.fromEntries(Object.entries(a).filter(([e,t])=>n[e]!==t))),Object.keys(i).length>0&&(o.props=i),o},mo=e=>{let t=e.compositing;return S(t)?t.groupMode===void 0?t.paintSemantics===`web`&&(e.component===`frame`||e.component===`group`):t.groupMode===`isolated`:!1},ho=e=>{let t={...e};return`stroke`in e&&(t.stroke=co(e.stroke)),S(e.decoration)&&(t.decoration=C(e.decoration,`blendMode`)),t},go=e=>{if(!S(e))return e;let t=C(po(e),`compositing`);mo(e)&&S(t.styles)&&(t.styles={...t.styles,isolation:`isolate`});let n=e.component===`text`;if(S(e.appearance)&&(t.appearance=fo(e.appearance,n)),!n)return t;S(e.typography)&&(t.typography=ho(e.typography));let r=t.props,i=S(r)?$a(r.richText):void 0;return i!==void 0&&S(r)&&(t.props={...r,richText:i.map(e=>lo(e))}),t},_o=e=>S(e)&&typeof e.sortKey==`string`?e.sortKey:``,vo=e=>{let t=new Map;for(let[n,r]of Object.entries(e)){if(!S(r)||typeof r.parentId!=`string`)continue;let e=t.get(r.parentId);e===void 0?t.set(r.parentId,[n]):e.push(n)}let n=t=>_o(e[t]),r=(e,t)=>n(e)<n(t)?-1:Number(n(e)>n(t));for(let e of t.values())e.sort(r);return t},yo=(e,t,n)=>({id:e,label:`Mask`,labelOrigin:`generated`,component:`group`,styles:{},geometry:{kind:`mask`,maskId:t,mode:n}}),bo=(e,t,n,r)=>{let i=``;for(let a of t){let t=no(e[a]);t!==void 0&&(i=eo(a),n[i]=yo(i,a,t),r[i]=r[a]);let o=r[a];i!==``&&S(o)&&(r[a]={...o,parentId:i})}},xo=(e,t,n)=>{for(let[r,i]of vo(n)){let a=i.filter(t=>no(e[t])!==void 0),[o]=i,s=t[r],c=no(e[o]);c!==void 0&&a.length===1&&S(s)&&s.component===`group`&&s.geometry===void 0?t[r]={...s,geometry:{kind:`mask`,maskId:o,mode:c}}:bo(e,i,t,n)}},So=e=>{let t=e.nodes;if(!S(t))return e;let n=Object.fromEntries(Object.entries(t).map(([e,t])=>[e,go(t)]));if(!S(e.relationships))return{...e,nodes:n};let r={...e.relationships};return xo(t,n,r),{...e,nodes:n,relationships:r}},Co=e=>typeof e==`object`&&!!e&&!Array.isArray(e),wo=e=>Array.isArray(e),To=e=>{if(!Co(e))return e;let t={...e};return Reflect.deleteProperty(t,`blendMode`),Reflect.deleteProperty(t,`blendSource`),t},Eo=e=>{if(!Co(e)||e.component!==`text`||!Co(e.appearance))return e;let t=e.appearance.shadows;return wo(t)?{...e,appearance:{...e.appearance,shadows:t.map(e=>To(e))}}:e},Do=e=>{let t=e.nodes;return Co(t)?{...e,nodes:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,Eo(t)]))}:e},Oo=new Set([...Object.values(x),15]),ko=e=>Oo.has(e),Ao=new Set([`format-number`,`text-shadow-blend`,`css`,`geometry`]),jo=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Mo=e=>{if(!jo(e))return e;let t=Object.fromEntries(Object.entries(e).filter(([e])=>e!==`gridTrack`)),n=t.container;jo(n)&&(t.container=Object.fromEntries(Object.entries(n).filter(([e])=>e!==`materialized`)));for(let e of[`horizontal`,`vertical`]){let n=t[e];jo(n)&&n.mode===`hug`&&(t[e]=Object.fromEntries(Object.entries(n).filter(([e])=>e!==`basis`)))}return t},No=e=>{let t=e.version;if(!ko(t))return null;if(t===15||!jo(e.nodes))return e;let n=Object.entries(Za).find(([e])=>Number(e)===t)?.[1];return Ao.has(n)?{...e,version:15}:Object.values(e.nodes).some(e=>jo(e)&&e.geometry!==void 0)?null:n===`typography`?{...e,version:15}:{...e,version:15,nodes:Object.fromEntries(Object.entries(e.nodes).map(([e,t])=>[e,jo(t)&&t.layout!==void 0?{...t,layout:Mo(t.layout)}:t]))}},Po=e=>{let t=No(e);return t===null||t===e||e.version===x.v13||e.version===x.v14?t:Do(e.version===x.v12?t:So(t))};p.strictObject({}),p.object({firstAgentWorkAt:p.iso.datetime().nullable()});const Fo=p.object({cursor:p.string().nullable().default(null),limit:p.number().int().min(1).max(100).default(20)}),w=e=>p.object({items:p.array(e),truncated:p.boolean()}),Io=2048,Lo=p.enum([`never-captured`,`capture-pending`,`extension-unavailable`,`capture-failed`,`source-mismatch`,`upload-incomplete`,`blob-missing`,`image-load-failed`,`unsupported-legacy-state`]),Ro=p.object({background:p.string().optional(),documentVersion:p.number().int().positive().optional(),thumbnailId:p.uuid(),url:p.string(),width:p.literal(528),height:p.literal(312),bytes:p.number().int().min(1).max(1048576)});p.object({canvasId:p.uuid(),thumbnailId:p.uuid(),clientReleaseIdentity:p.string().min(1).max(100),attemptedOperation:p.literal(`thumbnail-download`),recoveryOutcome:p.literal(`fallback-shown`)}),p.object({recorded:p.literal(!0)});const zo=p.enum([`invite-only`,`link-view`,`link-comment`,`link-edit`]),Bo=p.enum([`owner`,`can-edit`,`can-comment`,`can-view`]),Vo=p.enum([`can-edit`,`can-comment`,`can-view`]),Ho=p.object({read:p.boolean(),comment:p.enum([`yes`,`sign-in`,`no`]),edit:p.enum([`yes`,`sign-in`,`no`]).default(`no`),grants:p.array(p.object({source:p.enum([`direct`,`team`,`link`]),accessLevel:Bo})).default([]),grantableAccessLevels:p.array(Vo).default([]),share:p.boolean(),manage:p.boolean(),readHistory:p.boolean().default(!1)}),Uo=p.object({id:p.uuid(),title:p.string().min(1),accessState:zo,organisationId:p.uuid().nullable(),sourceUrl:p.string().nullable(),unresolvedCount:p.number().int().min(0),viewerCan:Ho,createdAt:p.iso.datetime(),lastActivityAt:p.iso.datetime()});p.object({title:p.string().trim().min(1),organisationId:p.uuid().nullable().default(null),sourceUrl:p.string().nullable().default(null)}),Uo.extend({version:p.number().int().positive()}),p.object({canvasId:p.uuid()});const Wo=p.union([p.literal(`own`),p.literal(`everything`),p.uuid()]);p.object({collection:Wo.default(`own`),title:p.string().trim().min(1).optional().describe(`Title text to match before returning canvas ids.`),deleted:p.boolean().default(!1),accessState:zo.optional(),scope:p.enum([`all`,`mine`,`shared`]).default(`all`),hasUnresolved:p.boolean().default(!1)});const Go=Uo.extend({screenCount:p.number().int().min(0),hasRecording:p.boolean(),lastViewedAt:p.iso.datetime().nullable()});w(p.union([Go.extend({thumbnail:Ro}),Go.extend({thumbnail:p.null(),thumbnailFallbackReason:Lo})])),p.object({canvasId:p.uuid(),title:p.string().trim().min(1)}),p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),deletedAt:p.iso.datetime()}),p.object({canvasId:p.uuid(),organisationId:p.union([p.uuid(),p.literal(`personal`)])}),p.object({canvas:Uo}),p.object({canvasId:p.uuid(),organisationId:p.union([p.uuid(),p.literal(`personal`)]),title:p.string().trim().min(1).optional()}),p.object({canvas:Uo}),p.object({canvasId:p.uuid(),sourceCanvasId:p.uuid().optional(),organisationId:p.union([p.uuid(),p.literal(`personal`)]),title:p.string().trim().min(1),document:p.record(p.string(),p.unknown()),screenIds:p.array(p.uuid())}),p.object({canvas:Uo,document:p.record(p.string(),p.unknown())}),p.object({canvasId:p.uuid(),confirmation:p.string().min(1)}),p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),accessState:zo}),p.object({canvas:Uo,widened:p.boolean()}),p.object({canvasId:p.uuid()}),p.object({lastViewedAt:p.iso.datetime().nullable()}),p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid()});const Ko=/javascript|vbscript|data\s*:\s*text\/html|expression\s*\(|@import/iu,qo=p.string().refine(e=>!Ko.test(e),`unsafe CSS value`),T=p.number(),E=p.number().nonnegative(),D=T,Jo=E,O=p.number().min(0).max(1),Yo=p.string().min(1),Xo=p.object({space:p.enum([`srgb`,`display-p3`]),red:O,green:O,blue:O,alpha:O,definitionId:Yo.optional()}),Zo=p.object({id:Yo,position:O,color:Xo}),Qo=p.object({id:Yo,visible:p.boolean()}),$o=Qo.extend({kind:p.literal(`blur`),value:Jo,parameter:p.enum([`radius`,`standard-deviation`]).optional()}),es=[Qo.extend({kind:p.literal(`brightness`),value:Jo}),Qo.extend({kind:p.literal(`contrast`),value:Jo}),Qo.extend({kind:p.literal(`grayscale`),value:O}),Qo.extend({kind:p.literal(`hue-rotate`),value:D}),Qo.extend({kind:p.literal(`invert`),value:O}),Qo.extend({kind:p.literal(`saturate`),value:Jo}),Qo.extend({kind:p.literal(`sepia`),value:O})],ts=p.discriminatedUnion(`kind`,[$o,...es]),ns=p.discriminatedUnion(`kind`,[$o.extend({progression:p.object({startValue:Jo,start:p.object({x:D,y:D}),end:p.object({x:D,y:D})}).optional()}),...es]),rs=p.tuple([D,D,D,D,D,D]).refine(([e,t,n,r])=>e*r!==t*n,`paint transform must be invertible`),is=p.enum([`normal`,`multiply`,`screen`,`overlay`,`darken`,`lighten`,`plus-lighter`,`color-dodge`,`color-burn`,`hard-light`,`soft-light`,`difference`,`exclusion`,`hue`,`saturation`,`color`,`luminosity`]),as=p.object({kind:p.literal(`figma`),originalMode:p.string(),mappedMode:is,sourceGuid:p.string().optional(),path:p.array(p.string())}),os=p.object({id:Yo,blendMode:is.optional(),blendSource:as.optional(),visible:p.boolean(),opacity:O}),ss=p.discriminatedUnion(`kind`,[os.extend({kind:p.literal(`solid`),color:Xo}),os.extend({kind:p.literal(`linear-gradient`),angle:D,transform:rs.optional(),stops:p.array(Zo).min(2)}),os.extend({kind:p.literal(`radial-gradient`),center:p.object({x:D,y:D}),radius:p.object({x:Jo,y:Jo}),transform:rs.optional(),stops:p.array(Zo).min(2)}),os.extend({kind:p.literal(`angular-gradient`),transform:rs,stops:p.array(Zo).min(2)}),os.extend({kind:p.literal(`diamond-gradient`),transform:rs,stops:p.array(Zo).min(2)}),os.extend({kind:p.literal(`image`),assetId:p.string().min(1),fit:p.enum([`fill`,`cover`,`fit`,`crop`,`tile`]),tileScale:D.positive().optional(),tileOrigin:p.enum([`center`,`top-left`]).optional(),rotation:p.union([p.literal(0),p.literal(90),p.literal(180),p.literal(270)]).optional(),crop:p.object({x:O,y:O,width:O,height:O}).optional(),transform:rs.optional(),filters:p.array(ts).optional(),naturalSize:p.object({width:D.positive(),height:D.positive()}).optional()}).refine(e=>e.crop===void 0||e.transform===void 0,{message:`image paint cannot have both a crop rectangle and an affine transform`,path:[`transform`]})]),cs=p.intersection(ss,p.object({alternatives:p.partialRecord(p.enum([`solid`,`linear-gradient`,`radial-gradient`,`angular-gradient`,`diamond-gradient`,`image`]),ss).optional(),recentGradient:p.enum([`linear-gradient`,`radial-gradient`,`angular-gradient`,`diamond-gradient`]).optional()})),ls=p.object({id:Yo,name:p.string().trim().min(1),value:p.union([Xo.omit({definitionId:!0}),p.object({definitionId:Yo})]),source:p.object({kind:p.literal(`figma`),key:Yo,modeId:Yo.optional()}).optional()}),us=p.object({op:p.literal(`setArtworkColor`),nodeId:p.literal(`root`),colorId:p.string().min(1),definition:ls.nullable()}).refine(e=>e.definition===null||e.definition.id===e.colorId,`colour identity must match`),ds=p.object({ratio:E,offset:T.optional()}),fs=p.object({min:E.optional(),max:E.optional(),minParent:ds.optional(),maxParent:ds.optional()}).refine(({min:e,max:t})=>e===void 0||t===void 0||e<=t,`size minimum cannot exceed maximum`),ps=p.discriminatedUnion(`mode`,[p.object({mode:p.literal(`fixed`),value:E}).strict(),fs.extend({mode:p.literal(`hug`),implicitExtent:E.optional()}).strict(),fs.extend({mode:p.literal(`fill`),offset:T.optional()}).strict()]),ms=p.object({top:E,right:E,bottom:E,left:E}),hs=p.union([p.literal(`auto`),T]),gs=p.object({top:hs,right:hs,bottom:hs,left:hs}),_s=p.object({mode:p.enum([`auto-fill`,`auto-fit`]),minimum:p.number().positive()}),vs=p.object({x:T,y:T}),ys=p.object({direction:p.enum([`row`,`column`]),alignItems:p.enum([`start`,`center`,`end`,`stretch`]),alignContent:p.enum([`start`,`center`,`end`,`stretch`,`space-between`,`space-around`,`space-evenly`]).optional(),justifyContent:p.enum([`start`,`center`,`end`,`space-between`,`space-around`,`space-evenly`]),gap:T,rowGap:T.optional(),columnGap:T.optional(),crossGapMode:p.literal(`auto`).optional(),wrap:p.enum([`nowrap`,`wrap`]).optional(),gridColumns:p.number().int().positive().optional(),gridAutoRepeat:_s.optional(),padding:ms}).strict(),bs=p.object({button:p.literal(!0).optional(),overflowClip:p.literal(!0).optional(),lineAboveBorderBottom:T.optional()}).strict(),xs=p.object({top:E.optional(),right:E.optional(),bottom:E.optional(),left:E.optional()}).strict(),Ss=p.object({ratio:T,offset:T.optional()}).strict(),Cs=p.object({x:Ss.optional(),y:Ss.optional()}).strict(),ws=p.object({rotation:T.optional(),flipHorizontal:p.boolean().optional(),flipVertical:p.boolean().optional(),aspectRatioLocked:p.boolean().optional(),aspectRatio:p.number().positive().optional(),horizontal:ps.optional(),vertical:ps.optional(),position:p.enum([`flow`,`absolute`]).optional(),retainedIgnore:p.literal(!0).optional(),gridParticipation:p.literal(`unassigned`).optional(),gridEmptyPlacement:p.literal(`manual`).optional(),gridAutoTrackPolicy:p.object({rows:p.literal(`extend-last`).optional(),columns:p.literal(`extend-last`).optional()}).strict().optional(),retainedFlexSpacing:p.object({gap:p.union([T,qo.min(1)]),counterGap:p.union([T,qo.min(1)]),crossGapMode:p.literal(`auto`).optional()}).strict().optional(),alignSelf:p.enum([`auto`,`start`,`center`,`end`,`stretch`]).optional(),flexGrow:E.optional(),flexShrink:E.optional(),flexBasis:p.union([p.literal(`auto`),E,ds]).optional(),flowOffset:vs.optional(),positionParent:Cs.optional(),order:T.int().optional(),margin:gs.partial().optional(),clipContent:p.boolean().optional(),baselineSource:bs.optional(),scrollbarGutter:xs.optional(),container:ys.partial().extend({padding:ms.partial().optional()}).optional()}).strict(),Ts=T,k=E,Es=p.number().min(0).max(1),Ds=p.string().min(1),Os=p.object({topLeft:k,topRight:k,bottomRight:k,bottomLeft:k,smoothing:Es.optional()}),ks=p.array(k).min(1),As=p.enum([`none`,`round`,`square`]),js=p.object({visible:p.boolean(),layoutInclusion:p.enum([`always`,`visible`,`none`]).optional(),width:p.object({top:k,right:k,bottom:k,left:k}),style:p.enum([`solid`,`dashed`,`dotted`]),paints:p.array(cs),dashPattern:ks.optional(),dashCap:As.optional(),dashOrigin:p.literal(`css`).optional(),alignment:p.enum([`inside`,`center`,`outside`]).optional()}),Ms=js.pick({width:!0,style:!0,layoutInclusion:!0}),Ns=p.object({visible:p.boolean(),width:k,offset:Ts,style:p.enum([`solid`,`dashed`,`dotted`]),paints:p.array(cs),dashPattern:ks.optional(),dashCap:As.optional()}),Ps=p.object({id:Ds,visible:p.boolean(),kind:p.enum([`outer`,`inner`]),color:Xo,offsetX:Ts,offsetY:Ts,blur:k,spread:Ts,blendMode:is.optional(),blendSource:as.optional(),isShownBehindNode:p.boolean().optional()}),Fs=p.object({opacity:Es,blendMode:is,fills:p.array(cs),border:js,retainedBorder:Ms.optional(),outline:Ns,radius:Os,shadows:p.array(Ps),filters:p.array(ts),backdropFilters:p.array(ns)}),Is=Fs.partial().refine(e=>Object.keys(e).length>0,`appearance values cannot be empty`),Ls=[`opacity`,`blendMode`,`fills`,`border`,`retainedBorder`,`outline`,`radius`,`shadows`,`filters`,`backdropFilters`],Rs=p.enum(Ls),zs=Fs.partial().extend({clear:p.array(Rs).min(1).max(Ls.length).optional()}).refine(e=>Object.keys(e).length>0,`appearance patch cannot be empty`).refine(({clear:e,...t})=>e===void 0||e.every(e=>t[e]===void 0),`appearance patch cannot set and clear the same property`),A=p.number(),j=p.number().nonnegative(),Bs=p.string().regex(/^[\u{20}-\u{7E}]{4}$/u),Vs=Bs.refine(e=>![`wght`,`opsz`].includes(e)),M=p.object({family:p.string().min(1),fallbackFamilies:p.array(p.string().min(1)),size:j,weight:p.number().min(1).max(1e3),variations:p.record(Vs,A).optional(),features:p.record(Bs,p.number().int().nonnegative().max(65535)).optional(),opticalSize:p.discriminatedUnion(`mode`,[p.object({mode:p.literal(`auto`)}),p.object({mode:p.literal(`font-default`)}),p.object({mode:p.literal(`fixed`),value:A})]).optional(),style:p.enum([`normal`,`italic`,`oblique`]),lineHeight:p.discriminatedUnion(`mode`,[p.object({mode:p.literal(`normal`)}),p.object({mode:p.literal(`fixed`),value:j}),p.object({mode:p.literal(`percent`),value:j})]),letterSpacing:p.union([A,p.object({mode:p.literal(`percent`),value:A})]),align:p.enum([`left`,`center`,`right`,`justify`]),direction:p.enum([`auto`,`ltr`,`rtl`]).optional(),verticalAlign:p.enum([`top`,`middle`,`bottom`]),verticalTrim:p.enum([`none`,`cap-height`]).optional(),transform:p.enum([`none`,`uppercase`,`lowercase`,`capitalize`]),decoration:p.object({line:p.enum([`none`,`underline`,`line-through`]),style:p.enum([`solid`,`double`,`dotted`,`dashed`,`wavy`]),color:Xo.optional(),blendMode:is.optional(),thickness:p.union([j,p.object({mode:p.literal(`percent`),value:j}),p.object({mode:p.literal(`font-default`)})]).optional(),offset:p.union([A,p.object({mode:p.literal(`percent`),value:A})]).optional(),skipInk:p.enum([`auto`,`none`,`all`]).optional()}),stroke:p.object({width:j,paint:cs,alignment:p.enum([`center`,`outside`]).optional()}).optional(),wrapping:p.enum([`wrap`,`nowrap`,`pre`,`pre-line`,`pre-wrap`,`break-spaces`]),wrapStyle:p.enum([`auto`,`pretty`,`balance`]).optional(),paragraphSpacing:j.optional(),paragraphIndent:j.optional(),listStyle:p.enum([`none`,`bulleted`,`numbered`]).optional(),listSpacing:j.optional(),hangingList:p.boolean().optional(),hangingPunctuation:p.boolean().optional(),truncation:p.object({mode:p.enum([`none`,`ellipsis`]),maxLines:p.number().int().min(1).nullable()}).optional(),insets:p.object({top:A,right:A,bottom:A,left:A}).optional()}),Hs=M.pick({align:!0,direction:!0,wrapStyle:!0,paragraphSpacing:!0,paragraphIndent:!0,listStyle:!0,listSpacing:!0,hangingList:!0}).partial().extend({listLevel:p.number().int().min(1).optional(),listStart:p.number().int().min(1).optional()}).strict(),Us=M.partial().strict(),Ws=M.keyof().options,Gs=Us.extend({featureChanges:p.object({set:M.shape.features,clear:p.array(Bs).optional(),removeIfEmpty:p.boolean().optional()}).strict().optional(),variationChanges:p.object({set:M.shape.variations,clear:p.array(Vs).optional(),removeIfEmpty:p.boolean().optional()}).strict().optional(),clear:p.array(M.keyof()).max(Ws.length).optional()}).refine(e=>e.clear?.every(t=>e[t]===void 0)??!0,`a typography property cannot be set and cleared in the same patch`).refine(e=>[`features`,`variations`].every(t=>{let n=e[t===`features`?`featureChanges`:`variationChanges`];return n===void 0||e[t]===void 0&&e.clear?.includes(t)!==!0&&(n.clear?.every(e=>n.set?.[e]===void 0)??!0)}),`font settings cannot be replaced and patched, or set and cleared, together`),Ks={"font-family":[`family`,`fallbackFamilies`],"font-size":[`size`],"font-weight":[`weight`],"font-variation-settings":[`weight`,`variations`,`opticalSize`],"font-optical-sizing":[`opticalSize`],"font-feature-settings":[`features`],"font-style":[`style`],"line-height":[`lineHeight`],"letter-spacing":[`letterSpacing`],"text-align":[`align`],direction:[`direction`],"unicode-bidi":[`direction`],"text-indent":[`paragraphIndent`],"hanging-punctuation":[`hangingPunctuation`],"align-content":[`verticalAlign`],"text-box":[`verticalTrim`],"text-box-trim":[`verticalTrim`],"text-box-edge":[`verticalTrim`],"text-transform":[`transform`],"text-decoration":[`decoration`],"text-decoration-line":[`decoration`],"text-decoration-style":[`decoration`],"text-decoration-color":[`decoration`],"text-decoration-thickness":[`decoration`],"text-underline-offset":[`decoration`],"text-decoration-skip-ink":[`decoration`],"-webkit-text-stroke":[`stroke`],"-webkit-text-stroke-width":[`stroke`],"-webkit-text-stroke-color":[`stroke`],"--canvas-text-stroke-alignment":[`stroke`],"paint-order":[`stroke`],"white-space":[`wrapping`],"text-wrap-style":[`wrapStyle`],"text-wrap":[`wrapStyle`]},qs=/^(?:behavior|-moz-binding)$/iu,Js=p.string().min(1).regex(/^(?:--[\w-]+|-(?:webkit|moz|ms|o)-[a-z][a-z\d-]*|[a-z][a-z\d-]*)$/iu).refine(e=>!qs.test(e),`unsafe CSS property`),N=p.object({id:p.string().min(1),property:Js,value:qo,enabled:p.boolean()}),Ys=p.object({declarations:p.array(N)}).refine(({declarations:e})=>new Set(e.map(e=>e.id)).size===e.length,`additional style ids must be unique`),Xs=p.array(N.shape.id).refine(e=>new Set(e).size===e.length,`declaration ids must be unique`),Zs=p.object({set:p.array(N).refine(e=>new Set(e.map(e=>e.id)).size===e.length,`declaration ids must be unique`).optional(),clear:Xs.optional(),order:Xs.optional(),empty:p.enum([`keep`,`remove`]).optional()}).strict().refine(e=>e.set?.every(t=>e.clear?.includes(t.id)!==!0)??!0,`a declaration cannot be set and cleared in the same patch`),Qs=M.pick({family:!0,fallbackFamilies:!0,size:!0,weight:!0,style:!0,variations:!0,opticalSize:!0,features:!0,lineHeight:!0,letterSpacing:!0,transform:!0,decoration:!0,paragraphSpacing:!0,paragraphIndent:!0,listSpacing:!0,hangingList:!0,hangingPunctuation:!0,verticalTrim:!0,wrapStyle:!0}).extend({decoration:M.shape.decoration.omit({blendMode:!0})}).strict(),$s=Qs.keyof().options,ec=p.object({id:p.string().min(1),name:p.string().trim().min(1),description:p.string().max(2e3),sortKey:p.string().min(1).optional(),sourceStyleId:p.string().min(1).optional(),sourceCanvasId:p.uuid().optional(),sourceRevision:p.number().int().positive().optional(),typography:Qs.extend({listStyle:M.shape.listStyle}).transform(e=>(Reflect.deleteProperty(e,`listStyle`),e))}).strict().refine(e=>e.sourceCanvasId===void 0||e.sourceStyleId!==void 0,{message:`A source canvas belongs to a reference snapshot.`,path:[`sourceCanvasId`]}).refine(e=>e.sourceRevision===void 0||e.sourceCanvasId!==void 0&&e.sourceStyleId!==void 0,{message:`A published revision belongs to a source style and canvas.`,path:[`sourceRevision`]});p.object({id:ec.shape.id,position:p.enum([`normal`,`subscript`,`superscript`]).optional(),overrides:p.partialRecord(p.enum([`fontWeight`,`fontStyle`,`fontVariationSettings`,`fontOpticalSizing`,`textDecorationLine`,`textDecorationStyle`,`textDecorationColor`,`textDecorationThickness`,`textUnderlineOffset`,`textDecorationSkipInk`]),p.union([p.string().max(1e3),p.number()])).optional()}).strict();const tc=cs.array().optional();p.object({fills:tc}),Hs.pick({paragraphSpacing:!0,paragraphIndent:!0,listSpacing:!0,wrapStyle:!0}).extend({hangingPunctuation:M.shape.hangingPunctuation,verticalTrim:M.shape.verticalTrim,stroke:M.shape.stroke.nullable(),decorationBlendMode:M.shape.decoration.shape.blendMode,backgroundBlendMode:is.optional()}).strip();const P=p.object({url:p.url(),expiresAt:p.iso.datetime(),headers:p.record(p.string(),p.string())}),nc=p.object({url:p.url(),expiresAt:p.iso.datetime(),bytes:p.number().int().min(0)}),rc=`/v1/canvas-assets/`,ic=[`image/avif`,`image/gif`,`image/jpeg`,`image/png`,`image/webp`],ac=p.string().regex(/^image\/[a-z0-9.+-]+$/u);p.object({canvasId:p.uuid(),contentType:p.enum(ic),bytes:p.number().int().positive()}),p.object({assetId:p.uuid(),path:p.string().startsWith(`/v1/canvas-assets/`),upload:P});const oc=(e,t)=>`${rc}${encodeURIComponent(e)}/${encodeURIComponent(t)}`,sc=p.tuple([p.uuid(),p.uuid()]),cc=e=>{if(!e.startsWith(`/v1/canvas-assets/`))return null;let t=sc.safeParse(e.slice(18).split(`/`)).data;return t===void 0?null:{canvasId:t[0],assetId:t[1]}},lc=[`font/ttf`,`font/otf`,`font/woff`,`font/woff2`,`font/collection`],uc=p.object({canvasId:p.uuid(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)});uc.extend({bytes:p.number().int().positive()}).extend({contentType:p.enum(lc)}),p.object({path:p.string().startsWith(`/v1/canvas-assets/`)}).extend({upload:P});const dc=(e,t)=>`${rc}${encodeURIComponent(e)}/fonts/${encodeURIComponent(t)}`;p.object({canvasId:p.uuid(),sources:p.array(uc).min(1)}),p.object({resources:p.array(p.object({source:uc,path:p.string()}))});const fc=1e3,pc=new Set(lc),mc=(e,t)=>e===`image`?ac.safeParse(t).success:pc.has(t),hc=p.strictObject({canvasId:p.uuid(),clientToken:p.uuid()});p.discriminatedUnion(`kind`,[hc.extend({kind:p.literal(`image`),contentType:p.enum(ic),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)}),hc.extend({kind:p.literal(`font`),contentType:p.enum(lc),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)})]);const gc=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`image`),width:p.number().int().positive(),height:p.number().int().positive()}),p.strictObject({kind:p.literal(`font`),family:p.string().min(1),subfamily:p.string(),style:p.enum([`normal`,`italic`,`oblique`]),minimumWeight:p.number().min(1).max(fc),maximumWeight:p.number().min(1).max(fc)}).refine(e=>e.minimumWeight<=e.maximumWeight,`Font weight bounds must be ordered.`)]);p.strictObject({canvasId:p.uuid(),clientToken:p.uuid(),assetId:p.uuid(),kind:p.enum([`image`,`font`]),contentType:p.string(),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u),path:p.string().startsWith(`/v1/canvas-assets/`),state:p.enum([`awaiting_upload`,`ready`]),metadata:gc.nullable()}).refine(e=>e.state===`ready`==(e.metadata!==null),`Readiness must match verified metadata.`).refine(e=>e.metadata===null||e.metadata.kind===e.kind,`Metadata must describe the reserved asset kind.`).refine(e=>mc(e.kind,e.contentType),`Content type must match the asset kind.`).refine(e=>e.path===(e.kind===`image`?oc(e.canvasId,e.assetId):dc(e.canvasId,e.sha256)),`The resource path must match its native identity.`).safeExtend({upload:P.nullable()}).refine(e=>e.state===`awaiting_upload`==(e.upload!==null),`Only pending uploads receive upload access.`);const _c=[`top`,`right`,`bottom`,`left`];_c.map(e=>`padding-${e}`),_c.map(e=>`margin-${e}`);const vc=p.enum([`png`,`jpeg`]),yc=p.number().positive(),bc=p.strictObject({format:vc.optional(),scale:yc.optional()}),xc=p.strictObject({format:vc.nullable().optional(),scale:yc.nullable().optional()}).refine(e=>e.format!==void 0||e.scale!==void 0),Sc=p.number(),Cc=Sc.nonnegative(),wc=p.string().min(1).max(200),Tc=p.string().regex(/^[MmLlHhVvCcSsQqTtAaZzEe\d\s.,+-]*$/u),Ec=p.strictObject({x:Sc,y:Sc,width:Cc,height:Cc}),Dc=p.strictObject({kind:p.literal(`path`),path:Tc.min(1),fillRule:p.enum([`nonzero`,`evenodd`]),viewBox:Ec.extend({width:Cc.positive(),height:Cc.positive()})}),Oc=p.strictObject({kind:p.literal(`polygon`),count:p.number().int().min(3),innerRatio:p.number().min(0).max(1).optional(),cornerRadius:Cc,cornerSmoothing:p.number().min(0).max(1)}),kc=p.enum([`union`,`subtract`,`intersect`,`exclude`]),Ac=p.strictObject({kind:p.literal(`boolean`),operation:kc,operandIds:p.array(wc).min(1).refine(e=>new Set(e).size===e.length),result:p.strictObject({path:Tc,fillRule:p.literal(`nonzero`),isEmpty:p.boolean(),bounds:Ec,inputKey:p.string().regex(/^[a-f0-9]{16}$/u)}).refine(e=>e.isEmpty===(e.path===``))}),jc=p.discriminatedUnion(`kind`,[Dc,Oc,p.strictObject({kind:p.literal(`mask`),maskId:wc,mode:p.enum([`alpha`,`luminance`,`outline`]).optional()}),Ac]),Mc=`Update Enhance: compositing is no longer supported. Use the isolation style or a mask group.`,Nc=p.literal(15,{error:`This editor uses an unsupported document format. Update the editor before changing this canvas.`});p.object({signature:p.string().regex(/^[a-f0-9]{16}$/u),image:p.string().refine(e=>e.startsWith(`data:image/jpeg;base64,`)||cc(e)!==null),families:p.array(p.string().min(1)).min(1)});const F=p.object({x:p.number(),y:p.number(),width:p.number().nonnegative(),height:p.number().nonnegative()}),Pc=p.enum([`start`,`center`,`end`,`stretch`,`scale`]),Fc=p.object({x:Pc,y:Pc}),Ic=p.enum([`source`,`generated`,`content`,`user`]),I=p.looseObject({id:p.string().min(1),label:p.string(),component:p.string().min(1),labelOrigin:Ic.optional(),visible:p.boolean().optional(),locked:p.boolean().optional(),constraints:Fc.optional(),styles:p.record(p.string(),p.union([p.string(),p.number()])),layout:ws.optional(),responsive:p.never().optional(),appearance:Is.optional(),exportSettings:bc.optional(),typography:Us.optional(),additionalStyles:Ys.optional(),geometry:jc.optional(),compositing:p.never({error:Mc}).optional(),props:p.record(p.string(),p.unknown()).optional(),box:F.optional()}),Lc=p.object({version:p.literal(15),nodes:p.record(p.string(),I),relationships:p.record(p.string(),p.object({parentId:p.string().min(1),sortKey:p.string().min(1)})),tombstones:p.record(p.string(),p.literal(!0)).default({})}),Rc=p.record(p.string(),p.unknown());p.preprocess(e=>{let t=Rc.safeParse(e).data;return t===void 0?e:Object.keys(t).length===0?zc():Po(t)},Lc);const zc=()=>({version:15,nodes:{root:{id:`root`,label:`Canvas`,component:`root`,labelOrigin:`generated`,visible:!0,locked:!1,styles:{}}},relationships:{},tombstones:{}}),Bc=p.string().min(1),Vc=p.object({code:p.enum([`asset-unavailable`,`content-omitted`,`cross-origin-frame`,`nodes-truncated`,`responsive-behavior-not-editable`,`style-degraded`,`unsupported-surface`]),message:p.string().min(1),temporaryId:Bc.optional()}),Hc=p.enum([`text-stroke-inside`,`text-stroke-outside-translucent`,`text-stroke-paints`,`text-inner-shadow`,`text-shadow-spread`,`text-shadow-blend`,`text-background-blur`,`progressive-layer-blur`,`progressive-background-blur`,`blend-plus-darker`,`blend-linear-burn`,`image-exposure`,`image-contrast`,`image-saturation`,`image-temperature`,`image-tint`,`image-highlights`,`image-shadows`,`effect-noise`,`effect-texture`,`effect-glass`]),Uc=p.object({nodeCount:p.number().int().positive(),unsupportedFeatures:p.array(p.object({feature:Hc,count:p.number().int().positive()})).optional(),sourceNodeCount:p.number().int().positive().optional(),collapsedNodeCount:p.number().int().nonnegative().optional(),collapsedWrapperNodeCount:p.number().int().nonnegative().optional(),collapsedNeutralWrapperNodeCount:p.number().int().nonnegative().optional(),collapsedTransferredWrapperNodeCount:p.number().int().nonnegative().optional(),layoutContainerCount:p.number().int().nonnegative().optional(),removedLeafNodeCount:p.number().int().nonnegative().optional(),retainedSemanticOwnerNodeCount:p.number().int().nonnegative().optional(),truncatedNodeCount:p.number().int().nonnegative().optional(),addedLayoutNodeCount:p.number().int().nonnegative().optional(),issues:p.array(Vc)}),Wc=I.omit({id:!0}).extend({temporaryId:Bc}),Gc=p.object({temporaryId:Bc,parentTemporaryId:Bc,sortKey:p.string().min(1)}),Kc=p.object({version:p.literal(1),rootTemporaryId:Bc,nodes:p.array(Wc).min(1),relationships:p.array(Gc),report:Uc.catch({nodeCount:0,issues:[]})}).transform(e=>({...e,report:{...e.report,nodeCount:e.nodes.length}}));p.object({canvasId:p.uuid(),documentFormatVersion:Nc,mutationId:p.uuid(),baseVersion:p.number().int().positive(),screenNodeId:p.string().min(1),draft:Kc});const qc=p.object({canvasId:p.uuid(),mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),rootNodeId:p.string().min(1),idMap:p.record(Bc,p.string().min(1)),insertedNodeIds:p.array(p.string().min(1)),removedNodeIds:p.array(p.string().min(1)),boxes:p.record(p.string().min(1),F),affectedBounds:F}),Jc=[`queued`,`claimed`,`grant`,`navigate`,`document`,`sources`,`fonts`,`layout`,`target`,`capture`,`serialize`,`compile`,`commit`,`upload`,`complete`],Yc=[`queued`,`running`,`succeeded`,`failed`,`cancelled`,`expired`],Xc=[`VERSION_CHANGED`,`TARGET_NOT_FOUND`,`TARGET_INVALID`,`OUTPUT_TOO_LARGE`,`READINESS_TIMEOUT`,`SOURCE_FAILED`,`BROWSER_CRASH`,`CAPTURE_FAILED`,`CONVERSION_FAILED`,`PREPARATION_FAILED`,`UPLOAD_FAILED`,`WORKER_UNAVAILABLE`,`CANCELLED`,`EXPIRED`,`INTERNAL`],Zc=[`ASSET_UNAVAILABLE`,`FONT_FALLBACK`,`LOCAL_FONT_FALLBACK`,`SOURCE_FALLBACK`,`SCALE_REDUCED`,`LAYOUT_FALLBACK`],Qc=p.number().int().positive(),L=p.object({x:p.number(),y:p.number(),width:p.number().positive(),height:p.number().positive()}),$c=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`content`)}),p.object({kind:p.literal(`page`),pageId:p.string().min(1)}),p.object({kind:p.literal(`node`),nodeId:p.string().min(1)}),p.object({kind:p.literal(`bounds`),bounds:L})]),el=p.object({kind:p.literal(`recording`),recordingId:p.uuid(),atMs:p.number().int().nonnegative()}),tl=p.object({kind:p.literal(`recording`),recordingId:p.uuid(),requestedAtMs:p.number().int().nonnegative(),settledAtMs:p.number().int().nonnegative()}),nl=p.object({recordingId:p.uuid(),atMs:p.number().int().nonnegative(),screenId:p.uuid(),screenNodeId:p.string().min(1),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()}),box:L,version:p.number().int().positive(),alreadyPresent:p.boolean()}),rl=p.object({canvasId:p.uuid(),expectedVersion:p.number().int().positive().optional(),scope:p.strictObject({pageId:p.string().min(1).optional(),nodeIds:p.array(p.string().min(1))}).optional(),target:$c.default({kind:`content`}),sourceState:el.optional(),scale:p.number().positive().default(1),maxOutputPixels:Qc.optional(),format:p.literal(`png`).default(`png`)}).refine(e=>e.sourceState===void 0||e.target.kind===`node`,{message:`a source state requires a node render target`,path:[`sourceState`]}),il=p.enum(Jc);p.enum(Yc);const al=p.enum(Xc),ol=p.enum(Zc),sl=p.object({code:ol,message:p.string().min(1).max(500),sourceId:p.string().min(1).nullable()}),R=p.object({reason:al,phase:il,message:p.string().min(1).max(500),retryable:p.boolean(),sourceId:p.string().min(1).nullable()}),cl=p.object({phase:il,durationMs:p.number().int().min(0)}),ll=p.object({canvasId:p.uuid(),requestedVersion:p.number().int().positive(),loadedVersion:p.number().int().positive(),target:$c,sourceState:tl.optional(),snapshot:nl.optional(),bounds:L,width:p.number().int().positive(),height:p.number().int().positive(),scale:p.number().positive(),contentType:p.literal(`image/png`),bytes:p.number().int().positive(),warnings:p.array(sl),timings:p.array(cl),expiresAt:p.iso.datetime()}),ul=p.object({id:p.uuid(),canvasId:p.uuid(),purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),phase:il,requestedVersion:p.number().int().positive(),target:$c,sourceState:el.optional(),scale:p.number().positive(),maxOutputPixels:Qc.optional(),format:p.literal(`png`),attempt:p.number().int().min(0),lastFailure:R.optional(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),dl=p.discriminatedUnion(`state`,[ul.extend({state:p.literal(`queued`),result:p.null(),failure:p.null()}),ul.extend({state:p.literal(`running`),result:p.null(),failure:p.null()}),ul.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:ll,failure:p.null()}),ul.extend({state:p.literal(`failed`),result:p.null(),failure:R}),ul.extend({state:p.literal(`cancelled`),result:p.null(),failure:R.extend({reason:p.literal(`CANCELLED`)})}),ul.extend({state:p.literal(`expired`),result:p.null(),failure:R.extend({reason:p.literal(`EXPIRED`)})})]);p.object({job:dl,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}).extend({waitMs:p.number().int().min(0).max(1e4).optional()}),p.object({job:dl}),p.object({jobId:p.uuid()}),p.object({job:dl});const fl=p.discriminatedUnion(`status`,[p.object({status:p.literal(`available`),version:p.number().int().positive(),format:p.literal(`enhance-scene-json`),code:p.string(),prototypes:p.array(p.object({nodeId:p.string(),prototypeId:p.uuid(),deploymentId:p.uuid(),capability:p.literal(`canvas.read`),canvasPath:p.string(),input:p.object({canvasRef:p.uuid(),view:p.literal(`source`),nodeId:p.string()}),guidance:p.string()})),guidance:p.string()}),p.object({status:p.literal(`unavailable`),guidance:p.string()})]);p.object({canvasId:p.uuid(),nodeId:p.string().min(1),expectedVersion:p.number().int().positive(),scale:p.number().positive()}),p.object({jobId:p.uuid()}),p.object({jobId:p.uuid(),download:nc,source:fl.optional()});const pl=p.strictObject({previewJobId:p.uuid(),scope:p.strictObject({pageId:p.string().min(1).optional(),nodeIds:p.array(p.string().min(1))}),placement:p.strictObject({kind:p.literal(`below-source`)})});p.object({canvasId:p.uuid(),recordingId:p.uuid(),atMs:p.number().int().nonnegative(),context:p.strictObject({expectedVersion:p.number().int().positive(),request:pl}).optional()}),p.object({job:dl,alreadyExists:p.boolean()});const ml=p.object({rootIds:p.array(p.string().min(1))}),hl=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`adjacent`)}),p.object({kind:p.literal(`insert-children`),pageId:p.string().min(1).optional(),targetNodeId:p.string().min(1)}),p.object({kind:p.literal(`replace`),targetNodeId:p.string().min(1)})]),gl=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`screen`),nodeId:p.string().min(1)}),p.object({kind:p.literal(`html`),html:p.string().min(1),label:p.string().min(1),idPrefix:p.string().min(1).regex(/^[\w-]+$/u).optional()})]),_l=p.object({source:gl,destination:hl,revisionPolicy:p.enum([`strict`,`rebase`]).optional()}).superRefine((e,t)=>{e.source.kind===`screen`&&e.destination.kind!==`adjacent`&&t.addIssue({code:`custom`,message:`stored screens convert beside their source`,path:[`destination`]}),e.source.kind===`html`&&e.destination.kind===`adjacent`&&t.addIssue({code:`custom`,message:`authored HTML requires an editable destination`,path:[`destination`]})}),vl=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`screen`),nodeId:p.string().min(1)}),p.object({kind:p.literal(`html`),label:p.string().min(1)})]),yl=p.object({id:p.uuid(),canvasId:p.uuid(),source:vl,destination:hl,phase:il,requestedVersion:p.number().int().positive(),attempt:p.number().int().nonnegative(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),bl=p.discriminatedUnion(`state`,[yl.extend({state:p.literal(`queued`),result:p.null(),failure:p.null()}),yl.extend({state:p.literal(`running`),result:p.null(),failure:p.null()}),yl.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:qc.extend({report:Uc}),failure:p.null()}),yl.extend({state:p.literal(`failed`),result:p.null(),failure:R}),yl.extend({state:p.literal(`cancelled`),result:p.null(),failure:R.extend({reason:p.literal(`CANCELLED`)})}),yl.extend({state:p.literal(`expired`),result:p.null(),failure:R.extend({reason:p.literal(`EXPIRED`)})})]);_l.and(p.object({canvasId:p.uuid(),expectedVersion:p.number().int().positive().optional(),mutationId:p.uuid().optional(),writeScope:ml.optional(),scope:rl.shape.scope})).refine(e=>e.scope===void 0&&e.revisionPolicy!==`strict`||e.expectedVersion!==void 0,{message:`scoped or strict conversion requires an expected version`,path:[`expectedVersion`]}),p.object({job:bl,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}),p.object({job:bl}),p.object({jobId:p.uuid()}),p.object({job:bl}),p.discriminatedUnion(`state`,[p.object({state:p.literal(`loading`),jobId:p.uuid()}),p.object({state:p.literal(`ready`),jobId:p.uuid(),loadedVersion:p.number().int().positive(),draft:Kc}),p.object({state:p.literal(`failed`),jobId:p.uuid(),message:p.string().min(1)})]);const xl=p.object({add:p.array(p.object({resourceId:p.string().min(1)}).catchall(p.unknown())),remove:p.array(p.string().min(1))}),z=p.union([p.string(),T]),B=p.union([N.shape.value,T]).nullable().optional(),Sl=p.strictObject({border:B,"border-block":B,"border-block-color":B,"border-block-style":B,"border-block-width":B,"border-block-end":B,"border-block-end-color":B,"border-block-end-style":B,"border-block-end-width":B,"border-block-start":B,"border-block-start-color":B,"border-block-start-style":B,"border-block-start-width":B,"border-bottom":B,"border-bottom-color":B,"border-bottom-style":B,"border-bottom-left-radius":z.optional(),"border-bottom-right-radius":z.optional(),"border-bottom-width":z.optional(),"border-color":p.string().nullable().optional(),"border-image":B,"border-image-source":B,"border-image-slice":B,"border-image-width":B,"border-image-outset":B,"border-image-repeat":B,"border-inline":B,"border-inline-color":B,"border-inline-style":B,"border-inline-width":B,"border-inline-end":B,"border-inline-end-color":B,"border-inline-end-style":B,"border-inline-end-width":B,"border-inline-start":B,"border-inline-start-color":B,"border-inline-start-style":B,"border-inline-start-width":B,"border-left":B,"border-left-color":B,"border-left-style":B,"border-left-width":z.optional(),"border-radius":z.nullable().optional(),"border-right":B,"border-right-color":B,"border-right-style":B,"border-right-width":z.optional(),"border-style":B,"border-top":B,"border-top-color":B,"border-top-style":B,"border-top-left-radius":z.optional(),"border-top-right-radius":z.optional(),"border-top-width":z.optional(),"border-width":z.nullable().optional(),outline:B,"outline-color":B,"outline-style":B,"outline-offset":z.optional(),"outline-width":z.optional()}),Cl=p.string().regex(/^(?:\d+(?:\.\d+)?|\.\d+)px$/u),wl=p.string().regex(/^-?(?:\d+(?:\.\d+)?|\.\d+)px$/u),Tl=N.shape.value.refine(e=>!/\burl\s*\(/iu.test(e),`invalid text colour`),El=p.union([M.shape.weight,p.enum([`normal`,`bold`,`bolder`,`lighter`]),p.string().regex(/^\d+(?:\.\d+)?$/u).refine(e=>M.shape.weight.safeParse(Number(e)).success)]),V={color:Tl,"font-family":N.shape.value,"font-size":p.union([E,Cl]),"font-weight":El,"font-style":p.enum([`normal`,`italic`,`oblique`]),"letter-spacing":T,"line-height":p.union([p.number().positive(),p.string().regex(/^(?:\d+(?:\.\d+)?(?:px|em|rem|%)?|normal)$/u)]),"text-align":p.enum([`left`,`center`,`right`]),"white-space":p.enum([`normal`,`nowrap`,`pre`,`pre-wrap`,`pre-line`,`break-spaces`])},Dl=p.strictObject({color:V.color.optional(),"font-family":V[`font-family`].optional(),"font-size":V[`font-size`].optional(),"font-weight":V[`font-weight`].optional(),"font-style":V[`font-style`].optional(),"letter-spacing":V[`letter-spacing`].optional(),"line-height":V[`line-height`].optional(),"text-align":V[`text-align`].optional(),"white-space":V[`white-space`].optional()}),Ol=p.union([N.shape.value,T]).nullable().optional(),kl=p.strictObject({"text-decoration":Ol,"text-decoration-line":Ol,"text-decoration-style":Ol,"text-decoration-color":Ol,"text-decoration-thickness":Ol,"text-underline-offset":Ol,"text-decoration-skip-ink":Ol,color:V.color.nullable().optional(),"font-family":V[`font-family`].nullable().optional(),"font-size":V[`font-size`].nullable().optional(),"font-weight":V[`font-weight`].nullable().optional(),"font-optical-sizing":p.enum([`auto`,`none`]).nullable().optional(),"font-variation-settings":N.shape.value.nullable().optional(),"font-feature-settings":N.shape.value.nullable().optional(),"text-wrap":N.shape.value.nullable().optional(),"text-wrap-mode":N.shape.value.nullable().optional(),"text-wrap-style":N.shape.value.nullable().optional(),"text-box":N.shape.value.nullable().optional(),"text-box-trim":N.shape.value.nullable().optional(),"text-box-edge":N.shape.value.nullable().optional(),"font-style":V[`font-style`].nullable().optional(),"font-stretch":p.union([p.enum([`normal`,`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`]),p.string().regex(/^\d+(?:\.\d+)?%$/u)]).nullable().optional(),"letter-spacing":p.union([T,wl,p.literal(`normal`)]).nullable().optional(),"line-height":V[`line-height`].nullable().optional(),"text-align":V[`text-align`].nullable().optional(),"text-indent":p.union([T,wl]).nullable().optional(),"white-space":V[`white-space`].nullable().optional(),"word-spacing":p.union([T,wl,p.literal(`normal`)]).nullable().optional()}),Al=N.shape.value,H=p.union([p.string(),T]),U=p.union([N.shape.value,T]).nullable().optional(),jl=kl.extend(Sl.shape).extend({"align-content":U,"align-items":U,"align-self":U,"aspect-ratio":U,"block-size":U,bottom:U,"box-sizing":U,display:U,flex:U,"flex-basis":U,"flex-direction":U,"flex-grow":U,"flex-shrink":U,"flex-wrap":U,grid:U,"grid-template":U,"grid-template-columns":U,"grid-template-rows":U,"grid-template-areas":U,"grid-auto-columns":U,"grid-auto-rows":U,"grid-auto-flow":U,"grid-row":U,"grid-column":U,"grid-area":U,"grid-row-start":U,"grid-row-end":U,"grid-column-start":U,"grid-column-end":U,"justify-items":U,"justify-self":U,"place-items":U,"place-self":U,"place-content":U,height:U,"inline-size":U,inset:U,"inset-block":U,"inset-block-end":U,"inset-block-start":U,"inset-inline":U,"inset-inline-end":U,"inset-inline-start":U,isolation:U,"justify-content":U,left:U,margin:U,"margin-block":U,"margin-block-end":U,"margin-block-start":U,"margin-inline":U,"margin-inline-end":U,"margin-inline-start":U,"max-block-size":U,"max-height":U,"max-inline-size":U,"max-width":U,"min-block-size":U,"min-height":U,"min-inline-size":U,"min-width":U,order:U,padding:U,"padding-block":U,"padding-block-end":U,"padding-block-start":U,"padding-inline":U,"padding-inline-end":U,"padding-inline-start":U,position:U,right:U,top:U,width:U,background:p.string().nullable().optional(),"background-color":p.string().nullable().optional(),"background-image":U,"background-size":U,"background-position":U,"background-repeat":U,"background-origin":U,"background-blend-mode":U,"box-shadow":p.string().nullable().optional(),"column-gap":H.optional(),gap:H.optional(),"margin-bottom":H.optional(),"margin-left":H.optional(),"margin-right":H.optional(),"margin-top":H.optional(),opacity:p.union([p.string(),p.number()]).nullable().optional(),overflow:Al.nullable().optional(),"overflow-x":Al.nullable().optional(),"overflow-y":Al.nullable().optional(),"padding-bottom":H.optional(),"padding-left":H.optional(),"padding-right":H.optional(),"padding-top":H.optional(),"row-gap":H.optional(),"stroke-width":H.optional()}),Ml=p.union([jl.keyof(),N.shape.property.refine(e=>e.startsWith(`--`))]),Nl=jl.catchall(U).refine(e=>Object.keys(e).every(e=>Ml.safeParse(e).success)),Pl=p.record(p.string(),p.unknown()),Fl=p.number().int().positive(),Il=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`retain`),count:Fl,attributes:Pl.optional(),shouldPreserveParagraph:p.boolean().optional()}),p.object({kind:p.literal(`delete`),count:Fl}),p.object({kind:p.literal(`insert`),text:p.string().min(1).refine(e=>e.isWellFormed()),attributes:Pl.optional(),shouldPreserveParagraph:p.boolean().optional()})]),Ll=p.object({baseLength:p.number().int().nonnegative(),representation:p.enum([`plain`,`rich`,`links`]).optional(),steps:p.array(Il),endAttributes:Pl.optional(),properties:Pl.refine(e=>[`text`,`richText`,`links`].every(t=>!Object.hasOwn(e,t))).optional()}).superRefine((e,t)=>{let n=0;for(let t of e.steps)t.kind!==`insert`&&(n+=t.count);n!==e.baseLength&&t.addIssue({code:`custom`,message:`text change must consume its exact base`})}),Rl=p.object({actionId:p.string().min(1),baseVersion:p.number().int().nonnegative(),isActive:p.boolean()}),zl=p.object({baseVersion:p.number().int().nonnegative(),after:p.array(p.string().min(1)),change:Ll}),Bl=p.object({actionId:p.string().min(1),baseVersion:p.number().int().nonnegative(),originalChange:Ll,inverse:Ll,history:Rl.optional(),source:zl.optional()}),Vl=p.object({op:p.literal(`editText`),nodeId:p.string().min(1),change:Ll,actionId:p.string().min(1).optional(),revision:Bl.optional(),history:Rl.optional(),source:zl.optional()}),Hl=2e3,Ul=p.object({title:p.string().trim().min(1).max(200)}).strict(),Wl=p.array(ec.shape.id),Gl=p.object({canvasId:p.uuid()}),Kl=p.object({definition:ec.refine(e=>e.sourceStyleId===void 0),revision:p.number().int().positive(),fontFaces:p.array(p.record(p.string(),p.unknown()))}),ql=p.object({styles:p.array(Kl).refine(e=>new Set(e.map(e=>e.definition.id)).size===e.length)});Gl.extend({revision:p.number().int().positive(),documentVersion:p.number().int().positive(),description:p.string().max(Hl),publishedAt:p.iso.datetime(),...ql.shape}),Gl.extend({mutationId:p.uuid(),expectedRevision:p.number().int().nonnegative(),documentVersion:p.number().int().positive(),publish:Wl,remove:Wl,description:p.string().trim().max(Hl)}).strict().refine(e=>{let t=[...e.publish,...e.remove];return t.length>0&&new Set(t).size===t.length},{message:`Select each changed style once.`});const Jl=p.object({canvasId:p.uuid(),title:p.string().max(200)});p.object({search:p.string().trim().max(200).default(``),cursor:Jl.nullable().default(null),limit:p.number().int().min(1).max(50).default(20)});const Yl=p.object({canvasId:p.uuid(),title:p.string(),organisationId:p.uuid().nullable(),revision:p.number().int().positive(),styleCount:p.number().int().positive(),publishedAt:p.iso.datetime()});p.object({items:p.array(Yl).max(50),nextCursor:Jl.nullable()});const Xl=p.object({parentId:p.string().min(1),sortKey:p.string().min(1)}),Zl=p.object({op:p.literal(`insertConvertedSubtree`),destination:hl,sourceNodeId:p.string().min(1).optional(),rootNodeId:p.string().min(1),nodes:p.record(p.string().min(1),I),relationships:p.record(p.string().min(1),Xl)}),W=p.string().min(1),Ql=F.extend({width:p.number().positive(),height:p.number().positive()}),$l=p.object({parentId:W,afterId:W.optional()}),eu=Xl,tu=p.object({op:p.literal(`setStyles`),nodeId:W,styles:Nl,clear:p.array(Ml).min(1).refine(e=>new Set(e).size===e.length).optional()}).refine(e=>(e.clear??[]).every(t=>!Object.hasOwn(e.styles,t))),nu=p.discriminatedUnion(`op`,[Zl,p.object({op:p.literal(`insertNode`),node:I,parentage:eu,prototypeSource:p.object({canvasId:p.uuid(),nodeId:W,documentVersion:p.number().int().nonnegative(),versionEntryId:p.uuid().optional()}).optional(),screenSource:p.object({canvasId:p.uuid()}).optional(),pageCopyBase:p.string().refine(e=>e.trim()!==``).optional()}),$l.extend({op:p.literal(`insertText`),nodeId:W,label:p.string().default(`Text`),text:p.string(),box:Ql,styles:Dl.default({})}),$l.extend({op:p.literal(`insertPrototype`),nodeId:W,label:p.string().default(`Prototype`),prototypeId:p.uuid(),deploymentId:p.uuid(),box:Ql,canvasPageId:W.optional()}),p.object({op:p.literal(`setPrototypeDeployment`),nodeId:W,prototypeId:p.uuid(),deploymentId:p.uuid(),expected:p.object({prototypeId:p.uuid(),deploymentId:p.uuid()}).optional()}),Vl,p.object({op:p.literal(`setText`),nodeId:W,text:p.string()}),p.object({op:p.literal(`setBox`),nodeId:W,box:p.union([F,p.literal(`default`)])}),p.object({op:p.literal(`setLabel`),nodeId:W,label:p.string().trim().min(1),labelOrigin:Ic.nullable().optional()}),p.object({op:p.literal(`setContainerKind`),nodeId:W,component:p.enum([`frame`,`group`])}),p.object({op:p.literal(`setVisibility`),nodeId:W,visible:p.boolean().nullable()}),p.object({op:p.literal(`setLocked`),nodeId:W,locked:p.boolean().nullable()}),p.object({op:p.literal(`setConstraints`),nodeId:W,constraints:Fc.nullable()}),tu,p.object({op:p.literal(`patchExportSettings`),nodeId:W,exportSettings:xc}),p.object({op:p.literal(`setAppearance`),nodeId:W,appearance:zs}),p.object({op:p.literal(`setLayout`),nodeId:W,layout:p.union([ws,p.literal(`default`)]),fields:p.array(ws.keyof()).optional()}),p.object({op:p.literal(`patchTypography`),nodeId:W,typography:Gs}),p.object({op:p.literal(`setTypography`),nodeId:W,typography:p.union([Us,p.literal(`default`)])}),p.object({op:p.literal(`patchAdditionalStyles`),nodeId:W,additionalStyles:Zs}),p.object({op:p.literal(`setAdditionalStyles`),nodeId:W,additionalStyles:p.union([Ys,p.literal(`default`)])}),us,p.object({op:p.literal(`setTextStyleLibrary`),nodeId:p.literal(`root`),sourceCanvasId:p.uuid(),library:Ul.nullable()}),p.object({op:p.literal(`patchFontLibrary`),nodeId:p.literal(`root`),fonts:xl}),p.object({op:p.literal(`setTextStyle`),nodeId:p.literal(`root`),styleId:ec.shape.id,textStyle:ec.nullable(),changedTextNodeIds:p.array(W).optional()}).refine(e=>e.textStyle===null||e.textStyle.id===e.styleId,`text style identity must match`),p.object({op:p.literal(`setGeometry`),nodeId:W,geometry:p.union([jc,p.literal(`default`)])}),p.object({op:p.literal(`setProps`),nodeId:W,props:p.union([p.record(p.string(),p.unknown()),p.literal(`default`)])}),p.object({op:p.literal(`setParentage`),nodeId:W,parentage:eu}),$l.extend({op:p.literal(`move`),nodeId:W}),p.object({op:p.literal(`remove`),nodeId:W,removedText:p.record(W,I.pick({props:!0})).optional()})]),ru=nu.options.map(e=>e.shape.op.value),iu=p.preprocess((e,t)=>typeof e!=`object`||!e||Reflect.get(e,`op`)!==`setCompositing`?e:(t.issues.push({code:`custom`,message:Mc,input:e}),p.NEVER),nu);qc.extend({operation:Zl,next:p.array(p.string().min(1))});const au=p.record(p.string(),p.unknown());p.object({canvasId:p.uuid(),afterVersion:p.number().int().positive().optional()});const ou=p.object({screenId:p.uuid(),clientToken:p.uuid(),route:p.string().nullable(),title:p.string().nullable(),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()}),atMs:p.number().int().min(0).nullable(),sourceRecordingId:p.uuid().nullable(),assetBundle:p.object({assetBundleId:p.uuid(),sourceUrl:p.string(),assets:p.array(p.object({url:p.string(),contentType:p.string(),path:p.string().startsWith(`/v1/recording-assets/`)})),missingAssetCount:p.number().int().min(0)}).nullable(),download:nc.nullable()}),su=p.object({mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(iu)});p.object({mutations:p.array(su).optional(),version:p.number().int().min(1),restoreFenceVersion:p.number().int().positive().optional(),document:au.optional(),screens:p.array(ou)}).extend({document:au}),p.object({canvasId:p.uuid(),baseVersion:p.number().int().min(1),document:au.refine(e=>Lc.safeParse(e).success,`A save requires a valid current-format canvas document.`),screenIds:p.array(p.uuid())}),p.discriminatedUnion(`outcome`,[p.object({outcome:p.literal(`saved`),version:p.number().int().min(1)}),p.object({outcome:p.literal(`conflict`),version:p.number().int().min(1),document:au})]);const cu=p.object({start:p.number().int().nonnegative(),end:p.number().int().positive(),href:p.url().refine(e=>[`http:`,`https:`].includes(new URL(e).protocol))});p.object({text:p.string(),links:p.array(cu).optional()});const lu=p.enum([`position`,`layout`,`clip`,`cornerRadius`,`blending`,`typography`,`nativeControl`,`textDecoration`,`fill`,`outline`,`textStroke`,`border`,`outerShadow`,`innerShadow`,`filters`,`additionalStyles`,`vector`,`export`,`source`]),uu=p.object({id:p.string().min(1),label:p.string().max(500),kind:p.string().min(1).max(100),parentId:p.string().min(1).nullable(),childCount:p.number().int().min(0),box:L.nullable(),propertySections:p.array(lu)});p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),openUrl:p.url(),title:p.string().min(1),version:p.number().int().positive(),nodeCount:p.number().int().min(0),rootChildCount:p.number().int().min(0),bounds:L.nullable(),kinds:p.record(p.string(),p.number().int().min(0)),next:p.array(p.string().min(1))}),p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),version:p.number().int().positive(),nodes:p.array(uu)}),p.object({canvasId:p.uuid(),nodeId:p.string().min(1)}),p.object({canvasId:p.uuid(),version:p.number().int().positive(),node:uu.extend({styles:p.record(p.string(),p.union([p.string(),p.number()])),layout:ws.optional(),appearance:Is.optional(),geometry:jc.optional(),typography:Us.optional(),additionalStyles:Ys.optional(),props:p.record(p.string(),p.unknown()),children:p.array(p.string().min(1))}),next:p.array(p.string().min(1))});const du=I.shape.id,fu=F.extend({width:p.number().positive(),height:p.number().positive()}),pu=p.record(du,du),mu=p.strictObject({fingerprint:p.string().regex(/^[a-f0-9]{64}$/u),revisionPolicy:p.enum([`strict`,`rebase`]),copiedNodeIds:pu.optional()});p.object({canvasId:p.uuid(),mutationId:p.uuid(),documentFormatVersion:Nc,baseVersion:p.number().int().positive(),operations:p.array(iu).min(1),requestContext:mu.optional(),writeScope:ml.optional()});const hu=p.object({canvasId:p.uuid(),mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(iu),insertedNodeIds:p.array(du),changedNodeIds:p.array(du),removedNodeIds:p.array(du),boxes:p.record(du,F),affectedBounds:fu.nullable(),copiedNodeIds:pu.optional(),next:p.array(p.string().min(1))});p.strictObject({canvasId:p.uuid(),mutationId:p.uuid(),fingerprint:mu.shape.fingerprint}),p.discriminatedUnion(`state`,[p.strictObject({state:p.literal(`not-found`)}),p.strictObject({state:p.literal(`committed`),result:hu})]);const gu={nodes:1e3,fields:20,id:200,label:500,value:1e3},_u=p.object({available:p.boolean(),omittedNodes:p.number().int().nonnegative(),nodes:p.array(p.object({nodeId:p.string().min(1),label:p.string().max(gu.label),kind:p.enum([`inserted`,`removed`,`changed`,`unchanged`,`unavailable`]),omittedFields:p.number().int().nonnegative(),fields:p.array(p.object({label:p.string().max(gu.id),before:p.string().max(gu.value).nullable(),after:p.string().max(gu.value).nullable(),truncated:p.boolean()})).max(gu.fields)})).max(gu.nodes)}),vu=[`position`,`layout`,`cornerRadius`,`blending`,`fill`,`outline`,`border`,`outerShadow`,`innerShadow`,`filters`,`additionalStyles`,`export`],yu=[`position`,`layout`,`clip`,...vu.filter(e=>e!==`position`&&e!==`layout`)],bu=[...vu,`vector`];Object.fromEntries([{objectKind:`prototype`,label:`Prototype`,category:`import`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},capture:{preservesHtmlCssAssets:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:[`position`,`layout`,`cornerRadius`,`blending`,`outline`,`outerShadow`,`innerShadow`,`filters`]},{objectKind:`root`,label:`Canvas`,category:`container`,capabilities:{canSelect:!1,canContainChildren:!0,canEditProperties:!1},selectionBehavior:{hitTarget:`children`},propertySections:[]},{objectKind:`page`,label:`Page`,category:`container`,capabilities:{canSelect:!1,canContainChildren:!1,canEditProperties:!1},selectionBehavior:{hitTarget:`children`},propertySections:[]},{objectKind:`screen`,label:`Screen`,category:`import`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!1,commentAnchor:`screen`},capture:{preservesHtmlCssAssets:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:[`position`,`layout`,`source`]},{objectKind:`frame`,label:`Frame`,category:`container`,capabilities:{canSelect:!0,canContainChildren:!0,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:yu},{objectKind:`group`,label:`Group`,category:`container`,capabilities:{canSelect:!0,canContainChildren:!0,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:[`position`,`layout`,`blending`,`filters`,`additionalStyles`,`export`]},{objectKind:`rectangle`,label:`Rectangle`,category:`primitive`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:vu},{objectKind:`image`,label:`Image`,category:`media`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`scale`,preservesAspect:!0,canLockAspectRatio:!0},propertySections:vu},{objectKind:`svg`,label:`SVG`,category:`primitive`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},capture:{preservesVectorData:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`scale`,preservesAspect:!0,canLockAspectRatio:!0},propertySections:bu},{objectKind:`boolean`,label:`Boolean`,category:`container`,capabilities:{canSelect:!0,canContainChildren:!0,canEditProperties:!0,commentAnchor:`node`},capture:{preservesVectorData:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`scale`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:bu},{objectKind:`recording`,label:`Recording`,category:`media`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!1},capture:{preservesAssets:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`scale`,preservesAspect:!0,canLockAspectRatio:!0},propertySections:[]},{objectKind:`text`,label:`Text`,category:`primitive`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`text`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!1},propertySections:[`position`,`layout`,`typography`,`nativeControl`,`textDecoration`,`textStroke`,`blending`,`fill`,`outerShadow`,`filters`,`additionalStyles`,`export`]}].map(e=>[e.objectKind,e]));const G=I.shape.id,xu=p.array(G).min(1),Su=p.strictObject({x:p.number(),y:p.number()}),Cu=p.strictObject({width:p.number().positive().optional(),height:p.number().positive().optional()}).refine(e=>e.width!==void 0||e.height!==void 0,{message:`Specify width, height, or both.`}),wu=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`position`),nodeId:G,parentPosition:Su}),p.strictObject({kind:p.literal(`resize`),nodeId:G,size:Cu}),p.strictObject({kind:p.literal(`relative-position`),nodeId:G,referenceNodeId:G,side:p.enum([`above`,`below`,`left`,`right`]),gap:p.number().nonnegative(),align:p.enum([`start`,`center`,`end`])}),p.strictObject({kind:p.literal(`move`),nodeIds:xu,targetNodeId:G,position:p.enum([`before`,`inside`,`after`])}),p.strictObject({kind:p.literal(`group`),nodeIds:xu,label:p.string().min(1).optional()}),p.strictObject({kind:p.literal(`ungroup`),nodeIds:xu}),p.strictObject({kind:p.literal(`label`),nodeId:G,label:p.string().min(1)}),p.strictObject({kind:p.literal(`visibility`),nodeId:G,visible:p.boolean()}),p.strictObject({kind:p.literal(`lock`),nodeId:G,locked:p.boolean()})]),Tu=p.strictObject({kind:p.literal(`arrange`),changes:p.array(wu).min(1)}),Eu=p.strictObject({kind:p.literal(`duplicate`),nodeIds:xu,destination:p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`native`)}),p.strictObject({kind:p.literal(`inside`),parentId:G})])}),Du=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`compile-screens`),sources:p.array(p.strictObject({screenId:p.uuid(),captureId:p.uuid(),label:p.string().min(1)})).min(1)}),Tu,Eu,p.strictObject({kind:p.literal(`compile-html`),contextOperations:p.array(iu).refine(e=>e.every(e=>`nodeId`in e&&![`remove`,`move`,`setParentage`,`insertText`,`insertPrototype`,`insertNode`,`insertConvertedSubtree`].includes(e.op)),`Compilation context may update retained fields only.`),fragments:p.array(p.strictObject({id:G,parentNodeId:G,html:p.string().min(1)})).min(1).refine(e=>new Set(e.map(e=>e.id)).size===e.length,`HTML fragment ids must be unique.`)})]),Ou=p.strictObject({pageId:G.optional(),nodeIds:p.array(G)}),ku=p.strictObject({request:Du,scope:Ou}),Au=p.strictObject({operations:p.array(iu),idMap:p.record(G,G),rootNodeIds:p.array(G)}),ju=Au.extend({compilations:p.array(p.strictObject({id:G,draft:Kc,warnings:p.array(sl).optional()})).optional()});p.discriminatedUnion(`state`,[p.object({state:p.literal(`loading`),jobId:p.uuid()}),p.object({state:p.literal(`ready`),jobId:p.uuid(),loadedVersion:p.number().int().positive(),plan:ju}),p.object({state:p.literal(`failed`),jobId:p.uuid(),message:p.string().min(1),reason:p.enum([`SOURCE_FAILED`,`PREPARATION_FAILED`]).optional(),retryable:p.boolean().optional()})]);const Mu=p.object({id:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),request:Du,scope:Ou,phase:il,attempt:p.number().int().nonnegative(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),Nu=p.discriminatedUnion(`state`,[Mu.extend({state:p.enum([`queued`,`running`]),result:p.null(),failure:p.null()}),Mu.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:Au.extend({loadedVersion:p.number().int().positive()}),failure:p.null()}),Mu.extend({state:p.enum([`failed`,`cancelled`,`expired`]),result:p.null(),failure:R})]);p.strictObject({canvasId:p.uuid(),expectedVersion:p.number().int().positive(),request:Du,scope:Ou}),p.object({job:Nu,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}),p.object({job:Nu});const Pu=p.string().trim().min(1).max(80).regex(/^[\w .+/-]+$/u),Fu=p.strictObject({path:p.enum([`local_mcp`,`hosted_mcp`,`direct_cli`]),name:Pu.optional(),version:Pu.optional()});Fu.pick({path:!0}).strip();const Iu=p.strictObject({agent_client:p.enum([`claude_code`,`codex`,`cursor`,`unknown`]),connection_path:Fu.shape.path,identity_source:p.enum([`mcp_client_info`,`documented_cli_fallback`,`unavailable`]),auth_method:p.enum([`personal_agent_token`,`mcp_oauth`]),agent_client_version:Pu.optional()}),Lu=p.enum([`green`,`blue`,`indigo`,`amber`,`lime`,`teal`,`cyan`,`sky`,`violet`,`purple`,`fuchsia`,`pink`]),Ru=p.string().regex(/^[0-9a-f]{32}$/),zu=p.object({viewKey:Ru.optional(),admissionOrder:p.number().int().nonnegative().optional(),followColour:Lu.optional()}),Bu=p.object({pageId:p.string().min(1).nullable().optional(),followingViewKey:Ru.nullable().optional()}),Vu=`enhance3.canvas.v1`,Hu=16384,Uu=p.enum([`blue`,`violet`,`green`,`amber`,`magenta`,`teal`,`red`,`orange`]),Wu=p.object({kind:p.literal(`person`),connectionId:p.uuid(),personId:p.uuid(),displayName:p.string().min(1).max(100),initials:p.string().min(1).max(8),avatarUrl:p.string().max(Io).nullable().optional(),colour:Uu}),Gu=Wu.extend(zu.shape),Ku=p.object({kind:p.literal(`guest`),connectionId:p.uuid(),displayName:p.string().min(1).max(100),initials:p.string().min(1).max(8),colour:Uu,...zu.shape}),qu=p.discriminatedUnion(`kind`,[Gu,Ku]),Ju=p.object({kind:p.literal(`agent`),personId:p.uuid(),displayName:p.string().min(1).max(100),initials:p.string().min(1).max(8),tokenLabel:p.string().min(1).max(100),agentAttribution:Iu.optional(),colour:Uu}),Yu=p.discriminatedUnion(`kind`,[Wu.omit({connectionId:!0,avatarUrl:!0}),Ju]),Xu=p.object({x:p.number(),y:p.number()}),Zu=F.extend({width:p.number().positive(),height:p.number().positive()}),Qu=p.object({count:p.number().int().positive(),bounds:Zu.nullable()}),$u=p.object({kind:p.enum([`drag`,`resize`]),baseVersion:p.number().int().positive(),boxes:p.record(p.string().min(1),Zu).refine(e=>Object.keys(e).length<=100&&new TextEncoder().encode(JSON.stringify(e)).byteLength<=16384),summary:Qu.optional()}),ed=p.object({cursor:Xu.nullable().optional(),input:p.enum([`pointer`,`touch`,`keyboard`]).optional(),focused:p.boolean().optional(),selectedNodeIds:p.array(p.string().min(1)).max(100).refine(e=>new TextEncoder().encode(JSON.stringify(e)).byteLength<=Hu).optional(),selectionSummary:Qu.nullable().optional(),visibleWorldBox:Zu.optional(),gesture:$u.nullable().optional(),cursorChat:p.string().max(140).nullable().optional(),...Bu.shape}).refine(e=>Object.keys(e).length>0,`presence patch cannot be empty`),td=p.object({actor:qu,seq:p.number().int().nonnegative(),cursor:Xu.nullable(),input:p.enum([`pointer`,`touch`,`keyboard`]),focused:p.boolean(),selectedNodeIds:p.array(p.string().min(1)).max(100).refine(e=>new TextEncoder().encode(JSON.stringify(e)).byteLength<=Hu),selectionSummary:Qu.nullable().optional(),visibleWorldBox:Zu.nullable(),gesture:$u.nullable(),cursorChat:p.string().max(140).nullable().default(null),...Bu.shape,followOrder:p.number().int().nonnegative().optional(),expiresAt:p.iso.datetime()}),nd=p.enum([`reading`,`writing`,`creating`,`deleting`,`rendering`]),rd=p.object({activityId:p.uuid(),canvasId:p.uuid(),actor:Ju,phase:nd,nodeIds:p.array(p.string().min(1)).max(100),bounds:Zu.nullable(),expiresAt:p.iso.datetime()}),id=p.object({canvasId:p.uuid(),phase:nd,nodeIds:p.array(p.string().min(1)).max(100).default([]),bounds:Zu.nullable().default(null)});p.object({activityId:p.uuid(),expiresAt:p.iso.datetime(),renewAfterMs:p.number().int().positive()}),id.extend({activityId:p.uuid()}),p.object({canvasId:p.uuid(),activityId:p.uuid()}),p.object({ended:p.literal(!0)});const K={v:p.literal(1),seq:p.number().int().nonnegative()};p.discriminatedUnion(`type`,[p.object({...K,type:p.literal(`access.changed`),payload:p.object({})}),p.object({...K,type:p.literal(`comments.changed`),payload:p.object({threadId:p.uuid()})}),p.object({...K,type:p.literal(`resources.changed`),payload:p.object({})}),p.object({...K,type:p.literal(`room.snapshot`),payload:p.object({connectionId:p.uuid(),viewKey:zu.shape.viewKey,peers:p.array(td),activities:p.array(rd),documentVersion:p.number().int().positive()})}),p.object({...K,type:p.literal(`presence.patch`),payload:td}),p.object({...K,type:p.literal(`presence.left`),payload:p.object({connectionId:p.uuid()})}),p.object({...K,type:p.literal(`agent.activity`),payload:p.object({activityId:p.uuid(),activity:rd.nullable()})}),p.object({...K,type:p.literal(`document.committed`),payload:p.object({mutationId:p.uuid(),actor:Yu,previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(iu).min(1)})}),p.object({...K,type:p.literal(`sync.required`),payload:p.object({version:p.number().int().positive(),reason:p.enum([`gap`,`relay`,`replace`,`history-restored`])})}),p.object({...K,type:p.literal(`room.ping`),payload:p.object({pingId:p.uuid(),sentAt:p.iso.datetime()})}),p.object({...K,type:p.literal(`room.error`),payload:p.object({code:p.enum([`auth`,`permission`,`protocol`,`payload`,`rate`,`unavailable`]),message:p.string().min(1).max(200)})})]),p.discriminatedUnion(`type`,[p.object({v:p.literal(1),type:p.literal(`presence.patch`),seq:p.number().int().nonnegative(),payload:ed}),p.object({v:p.literal(1),type:p.literal(`selection.chunk`),seq:p.number().int().nonnegative(),payload:p.object({transferId:p.uuid(),offset:p.number().int().nonnegative(),total:p.number().int().positive(),nodeIds:p.array(p.string().min(1)).min(1).max(1e3)})}),p.object({v:p.literal(1),type:p.literal(`selection.unavailable`),seq:p.number().int().nonnegative(),payload:p.object({count:p.number().int().positive()})}),p.object({v:p.literal(1),type:p.literal(`room.pong`),seq:p.number().int().nonnegative(),payload:p.object({pingId:p.uuid()})})]).refine(e=>e.type!==`selection.chunk`||e.payload.offset+e.payload.nodeIds.length<=e.payload.total&&new TextEncoder().encode(JSON.stringify(e)).byteLength<=49152),p.object({canvasId:p.uuid(),protocols:p.array(p.literal(Vu)).min(1).max(1),viewId:p.uuid().optional()}),p.object({endpoint:p.url(),ticket:p.string().min(1).max(4096),protocol:p.literal(Vu),expiresAt:p.iso.datetime()}),p.uuid();const ad=I.shape.id;p.array(ad),p.object({jobId:p.uuid()});const od=p.object({jobId:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),target:$c,sourceState:el.optional()});p.discriminatedUnion(`purpose`,[od.extend({purpose:p.literal(`preparation`),preparation:ku,screens:p.array(ou).optional(),attempts:p.strictObject({counted:p.number().int().nonnegative(),limit:p.number().int().positive()}).optional(),deadlineAt:p.iso.datetime().optional(),sourceState:p.undefined().optional(),scale:p.literal(1),format:p.literal(`json`)}),od.extend({purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),scale:p.number().positive(),maxOutputPixels:Qc.optional(),format:p.literal(`png`)}),od.extend({purpose:p.literal(`conversion`),target:p.object({kind:p.literal(`node`),nodeId:p.string().min(1)}),sourceState:p.undefined().optional(),conversion:_l,scale:p.literal(1),format:p.literal(`json`)})]),p.object({jobId:p.uuid()}),p.object({jobId:p.uuid()});const sd=p.object({jobId:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),grantToken:p.string().startsWith(`rgr_`).min(40).max(100),grantCookieName:p.string().min(1).max(100),renderUrl:p.url(),deadlineAt:p.iso.datetime().optional(),releaseIdentity:p.string().min(1).max(100)});p.discriminatedUnion(`purpose`,[sd.extend({purpose:p.literal(`preparation`),target:$c,preparation:ku,sourceState:p.undefined().optional(),scale:p.literal(1)}),sd.extend({purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),target:$c,sourceState:el.optional(),scale:p.number().positive(),maxOutputPixels:Qc.optional(),outputKey:p.string().min(1).max(500)}),sd.extend({purpose:p.literal(`conversion`),target:p.object({kind:p.literal(`node`),nodeId:p.string().min(1).max(200)}),sourceState:p.undefined().optional(),conversion:_l,scale:p.literal(1)})]),p.object({jobId:p.uuid(),loadedVersion:p.number().int().positive(),bounds:L,width:p.number().int().positive(),height:p.number().int().positive(),scale:p.number().positive(),bytes:p.number().int().positive(),storageKey:p.string().min(1).max(500),warnings:p.array(sl),timings:p.array(cl),sourceState:tl.optional(),snapshot:p.object({artifactBytes:p.number().int().positive(),artifactStorageKey:p.string().min(1).max(500),route:p.string().optional(),title:p.string().optional(),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()})}).optional()}),p.object({accepted:p.literal(!0)}),p.object({jobId:p.uuid(),loadedVersion:p.number().int().positive(),draft:Kc}),p.object({accepted:p.literal(!0)}),p.object({recordingId:p.uuid(),requestedAtMs:p.number().int().nonnegative(),settledAtMs:p.number().int().nonnegative(),artifact:p.string().min(1),route:p.string().optional(),title:p.string().optional(),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()})}),p.object({jobId:p.uuid(),failure:R}),p.object({accepted:p.literal(!0),willRetry:p.boolean()}),p.object({workerId:p.string().regex(/^[\w.-]+$/u).min(1).max(100),releaseIdentity:p.string().min(1).max(100),timestamp:p.coerce.number().int().nonnegative(),nonce:p.uuid(),mac:p.base64().min(32).max(200)});const cd=p.object({total:p.number().int().nonnegative(),loading:p.number().int().nonnegative(),unavailable:p.number().int().nonnegative()}),ld=p.object({jobId:p.uuid(),canvasId:p.uuid().nullable(),requestedVersion:p.number().int().positive().nullable(),loadedVersion:p.number().int().positive().nullable(),phase:il.exclude([`queued`,`claimed`,`capture`,`upload`,`complete`]),sources:cd,warnings:p.array(sl),timings:p.array(cl),sourceState:tl.optional()}),ud=p.object({selector:p.string().min(1).max(500),contentSelector:p.string().min(1).max(500).optional(),expectsPaint:p.boolean().optional(),bounds:L,width:p.number().int().positive(),height:p.number().int().positive(),scale:p.number().positive()});p.discriminatedUnion(`state`,[ld.extend({state:p.literal(`loading`),capture:p.null(),failure:p.null()}),ld.extend({state:p.literal(`ready`),phase:p.literal(`target`),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),loadedVersion:p.number().int().positive(),capture:ud,failure:p.null()}),ld.extend({state:p.literal(`failed`),failure:p.object({reason:al,message:p.string().min(1).max(500),sourceId:p.string().min(1).max(200).nullable(),overtaken:p.boolean().optional()}),capture:p.null()})]),p.object({jobId:p.uuid(),loadedVersion:p.number().int().positive(),plan:ju});const dd=p.string().min(1);p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),status:p.enum([`selected`,`none`,`offline`,`stale`,`updating`,`unsupported`]),documentVersion:p.number().int().positive(),selectionRevision:p.number().int().positive().nullable(),selectionChangedAt:p.iso.datetime().nullable(),selectedNodeIds:p.array(dd),missingNodeIds:p.array(dd),nodes:p.array(uu),contextRootId:dd.nullable(),visibleWorldBox:L.nullable(),next:p.array(p.string().min(1)).max(12)});const fd=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`recording`),recordingId:p.string()})]);p.object({html:p.string().optional(),viewport:p.object({width:p.number(),height:p.number()}),atMs:p.number(),screenId:p.string().nullable().default(null),sourceNodeId:p.string().optional(),provenance:fd.optional()}),p.object({provenance:fd.optional(),report:Uc.optional()}),p.object({recordingId:p.string()}),p.object({prototypeId:p.uuid(),deploymentId:p.uuid()}),p.object({preparedExperience:p.enum([`agent-connection`,`whisper-prototype`]),ownerPersonId:p.uuid(),resources:p.array(p.string().min(1))});const pd=new Set($s);new Set(Object.entries(Ks).flatMap(([e,t])=>t.some(e=>pd.has(e))?[e.replaceAll(/-([a-z])/gu,(e,t)=>t.toUpperCase())]:[]));const md=new Set($s);new Set(Object.entries(Ks).flatMap(([e,t])=>t.some(e=>md.has(e))?[e]:[]));const hd=1e3,gd=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`person`),personId:p.uuid(),displayName:p.string().min(1).max(200),initials:p.string().min(1).max(2)}),p.object({kind:p.literal(`agent`),personId:p.uuid(),displayName:p.string().min(1).max(200),initials:p.string().min(1).max(2),tokenLabel:p.string().min(1).max(200)})]),_d=p.object({id:p.uuid(),canvasId:p.uuid(),documentVersion:p.number().int().positive(),origin:p.enum([`automatic`,`manual`,`restore`]),restoreRole:p.enum([`before`,`result`]).nullable(),retention:p.enum([`automatic`,`named`,`restore-boundary`]),title:p.string().min(1).nullable(),description:p.string().max(hd).nullable(),actor:gd,sourceVersionEntryId:p.uuid().nullable(),expiresAt:p.iso.datetime().nullable(),checkpointAt:p.iso.datetime(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime(),screenCount:p.number().int().min(0)});p.object({canvasId:p.uuid(),limit:p.number().int().min(1).max(100).default(50),cursor:p.string().min(1).max(1e3).optional(),includeAutomatic:p.boolean().default(!1),actor:p.enum([`all`,`mine`]).default(`all`)}),p.object({current:p.object({documentVersion:p.number().int().positive(),updatedAt:p.iso.datetime()}),items:p.array(_d),nextCursor:p.string().min(1).nullable(),hasExpiredHistory:p.boolean()}),p.object({canvasId:p.uuid(),versionId:p.uuid()});const vd=p.object({outcome:p.literal(`ready`),entry:_d,document:au,screens:p.array(ou)}),yd=p.object({outcome:p.literal(`missing-resources`),entry:_d,document:au,screens:p.array(ou),missingScreenIds:p.array(p.uuid()).min(1)});p.discriminatedUnion(`outcome`,[vd,yd,p.object({outcome:p.literal(`corrupt`),entry:_d})]);const bd=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`current`),expectedVersion:p.number().int().positive()}),p.object({kind:p.literal(`version`),versionId:p.uuid()})]);p.object({canvasId:p.uuid(),target:bd,title:p.string().trim().min(1),description:p.string().trim().max(hd).nullable().default(null)}),p.object({canvasId:p.uuid(),versionId:p.uuid(),title:p.string().trim().min(1),description:p.string().trim().max(hd).nullable().default(null)}),p.object({canvasId:p.uuid(),versionId:p.uuid()}),p.object({entry:_d}),p.object({canvasId:p.uuid(),documentFormatVersion:Nc,versionId:p.uuid(),expectedVersion:p.number().int().positive()}),p.object({canvasId:p.uuid(),version:p.number().int().positive(),beforeVersionId:p.uuid(),restoredVersionId:p.uuid(),restoreFenceVersion:p.number().int().positive()}),p.object({canvasId:p.uuid(),documentFormatVersion:Nc,versionId:p.uuid(),organisationId:p.union([p.uuid(),p.literal(`personal`)]),title:p.string().trim().min(1).optional()}),p.object({canvasId:p.uuid(),title:p.string().min(1),version:p.literal(1)}),p.object({canvasId:p.uuid(),sourceCanvasId:p.uuid(),recordingIds:p.array(p.uuid()).min(1)}),p.object({copies:p.array(p.object({sourceRecordingId:p.uuid(),recordingId:p.uuid()}))});const xd=(e,t,n=1/0)=>{let r=e.split(` `).map(e=>Number(e.replace(`%`,``)));return r.every(e=>Number.isFinite(e)&&e>=t&&e<=n)&&(r.length===1||(r[0]??0)<=(r[1]??0))},Sd=p.string().regex(/^[a-f0-9]{64}$/u),Cd=p.string().trim().min(1),wd=p.object({organisationId:p.uuid().nullable()}),Td=p.object({family:p.string().regex(/^uploaded-font-[a-f0-9]{64}(?:-[a-f0-9]{12})?$/u),familyName:Cd,subfamilyName:Cd,version:Cd,weight:p.string().regex(/^\d+(?:\.\d+)?(?: \d+(?:\.\d+)?)?$/u).refine(e=>xd(e,1,1e3)),style:p.enum([`normal`,`italic`,`oblique`]),stretch:p.union([p.enum([`normal`,`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`]),p.string().regex(/^\d+(?:\.\d+)?%(?: \d+(?:\.\d+)?%)?$/u).refine(e=>xd(e,0))]),format:p.enum([`truetype`,`opentype`,`woff`,`woff2`])}),Ed=p.object({kind:p.enum([`personal`,`team`]),ownerId:p.uuid(),sha256:Sd}),Dd=wd.extend({sha256:Sd,bytes:p.number().int().positive(),contentType:p.enum(lc)});p.object({upload:P}),Dd.extend({metadata:Td,hasSharingRights:p.literal(!0)});const Od=Ed.extend({bytes:p.number().int().positive(),metadata:Td,createdAt:p.iso.datetime(),path:p.string().startsWith(`/v1/font-catalog/`)});p.object({entries:p.array(Od),canManage:p.boolean()}),wd.extend({sha256:Sd}),wd.extend({canvasId:p.uuid(),sha256:p.array(Sd).min(1)}),p.object({resources:p.array(p.object({entry:Od,path:p.string().startsWith(`/v1/canvas-assets/`)}))});const kd=p.object({inviteId:p.uuid(),email:p.string().max(254),accessLevel:Vo,sendCount:p.number().int().min(1),lastSentAt:p.iso.datetime(),expiresAt:p.iso.datetime(),state:p.enum([`pending`,`expired`]),deliveryState:p.enum([`queued`,`accepted`,`failed`]),deliveryError:p.string()});p.object({canvasTitle:p.string().min(1),invitedBy:p.string().min(1),email:p.string().max(254).pipe(p.email()),accessLevel:Vo,expiresAt:p.iso.datetime(),state:p.enum([`pending`,`accepted`]),hasAccount:p.boolean()}),p.object({canvasId:p.uuid(),email:p.string().max(254).transform(e=>e.trim().toLowerCase()).pipe(p.email()),accessLevel:Vo}),p.object({invite:kd,acceptToken:p.string().max(512).optional()}),p.object({canvasId:p.uuid()}),w(kd),p.object({canvasId:p.uuid(),inviteId:p.uuid()}),p.object({canvasId:p.uuid(),inviteId:p.uuid()});const Ad=p.string().min(1).max(512);p.object({token:Ad}),p.object({token:Ad}),p.object({canvasId:p.uuid(),accessLevel:Bo});const jd=p.object({personId:p.uuid().nullable(),email:p.string().max(254).nullable(),displayName:p.string().max(120).nullable(),initials:p.string().max(4).nullable(),avatarUrl:p.string().max(Io).nullable(),accessLevel:Bo,isPending:p.boolean(),reviewState:p.enum([`not-started`,`in-progress`,`done`]).nullable(),lastViewedAt:p.iso.datetime().nullable()});p.object({canvasId:p.uuid()}),w(jd),p.object({canvasId:p.uuid(),personId:p.uuid(),accessLevel:Vo}),p.object({canvasId:p.uuid(),personId:p.uuid()}),p.object({personId:p.uuid(),revoked:p.boolean()});const Md=p.object({canvasId:p.uuid(),reviewState:p.enum([`not-started`,`in-progress`,`done`])});p.object({reviewState:Md.shape.reviewState.nullable()});const Nd=Fo.extend({cursor:p.string().max(2048).nullable().default(null)}),Pd=p.object({selector:p.string().min(1),tagName:p.string().min(1),label:p.string().nullable(),source:p.object({file:p.string().min(1),line:p.number().int().min(0).nullable()}).nullable()}),Fd=p.object({x:p.number(),y:p.number()}),Id=p.object({x:p.number().min(0).max(1),y:p.number().min(0).max(1)}),Ld=p.object({x:p.number().min(0).max(1),y:p.number().min(0).max(1),width:p.number().min(0).max(1),height:p.number().min(0).max(1)}),Rd=Pd.extend({role:p.string().min(1).optional()}),zd=p.object({path:p.array(p.number().int().min(0)),offset:p.number().int().min(0)}),Bd=p.object({version:p.literal(1),kind:p.literal(`element`),locator:Rd,attachment:Id,fallbackBounds:Ld}),Vd=p.object({version:p.literal(1),kind:p.literal(`text`),root:Rd,quote:p.object({exact:p.string().min(1),prefix:p.string(),suffix:p.string()}),range:p.object({start:zd,end:zd}),attachment:Id,fallbackBounds:Ld}),Hd=p.object({version:p.literal(1),kind:p.literal(`elements`),members:p.array(Rd).min(2),truncated:p.boolean(),attachment:Id,fallbackBounds:Ld}),Ud=p.object({version:p.literal(1),kind:p.literal(`area`),bounds:Ld,attachment:Id}),Wd=p.discriminatedUnion(`kind`,[Bd,Vd,Hd,Ud]),Gd=p.discriminatedUnion(`on`,[p.object({on:p.literal(`canvas`),point:Fd,pageId:p.string().min(1).max(256).optional()}),p.object({on:p.literal(`node`),nodeId:p.string().min(1),point:Fd,element:p.null()}),p.object({on:p.literal(`screen`),nodeId:p.string().min(1),screenId:p.uuid(),point:Fd,element:Pd.nullable(),target:Wd.optional()})]),Kd=p.object({kind:p.enum([`person`,`agent`]),personId:p.uuid(),name:p.string().min(1).max(120),initials:p.string().min(1).max(4),avatarUrl:p.string().max(Io).nullable(),tokenLabel:p.string().max(120).nullable()}),qd=p.object({personId:p.uuid(),name:p.string().min(1).max(120)}),Jd=p.object({emoji:p.string().min(1).max(16),people:p.array(qd).min(1)}),Yd=p.object({messageId:p.uuid(),seq:p.number().int().min(1),body:p.string().min(1),isDeleted:p.boolean(),author:Kd,createdAt:p.iso.datetime(),editedAt:p.iso.datetime().nullable(),mentions:p.array(qd),reactions:p.array(Jd)}),Xd=p.object({kind:p.enum([`person`,`agent`]),personId:p.uuid(),name:p.string().min(1).max(120),tokenLabel:p.string().max(120).nullable()}),Zd=p.object({revision:p.number().int().positive(),threadId:p.uuid(),canvasId:p.uuid(),anchor:Gd,author:Kd,messages:p.array(Yd).min(1).max(50),messageCount:p.number().int().min(1),hasMoreMessages:p.boolean(),isResolved:p.boolean(),resolvedAt:p.iso.datetime().nullable(),resolvedBy:Xd.nullable(),createdAt:p.iso.datetime(),lastMessageAt:p.iso.datetime()}),Qd=p.strictObject({canvasRef:p.string().min(1),expectedVersion:p.number().int().positive()}),$d=Qd.extend({coordinateSpace:p.enum([`canvas-world`,`node-normalized`,`screen-normalized`])});p.object({context:Qd.optional(),page:Nd.optional(),canvasId:p.uuid(),filter:p.enum([`open`,`resolved`,`all`]).default(`open`),authorPersonId:p.uuid().optional(),agentActionable:p.boolean().default(!1),query:p.string().trim().max(200).optional()}),w(Zd).extend({nextCursor:p.string().nullable().optional()}),Nd.extend({context:Qd.optional(),canvasId:p.uuid(),threadId:p.uuid(),expectedRevision:p.number().int().positive().optional()}),p.object({thread:Zd.omit({messages:!0,hasMoreMessages:!0}),messages:p.array(Yd).max(100),nextCursor:p.string().nullable()}),p.object({context:$d.optional(),canvasId:p.uuid(),clientThreadId:p.uuid(),anchor:Gd,body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),p.object({context:Qd.optional(),canvasId:p.uuid(),threadId:p.uuid(),clientMessageId:p.uuid(),body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),Zd.extend({postedMessage:Yd}),p.object({canvasId:p.uuid(),threadId:p.uuid(),messageId:p.uuid(),body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),p.object({canvasId:p.uuid(),threadId:p.uuid(),messageId:p.uuid(),emoji:p.string().trim().min(1).max(16),reacted:p.boolean()}),p.object({canvasId:p.uuid(),threadId:p.uuid(),anchor:Gd}),p.object({context:Qd.optional(),expectedRevision:p.number().int().positive().optional(),canvasId:p.uuid(),threadId:p.uuid(),resolved:p.boolean()}),p.object({canvasId:p.uuid(),threadId:p.uuid(),messageId:p.uuid().optional()}),p.object({deletedThreadIds:p.array(p.uuid()),deletedMessageIds:p.array(p.uuid())});const q={shortText:200,name:100,label:500,page:50,cursor:64,questionOptions:3},J=p.uuid(),ef=p.string().min(1),tf=p.object({id:J,name:p.string().trim().min(1).max(q.name),content:p.string().trim().min(1),version:p.string().min(1).max(q.name)}),nf=p.object({canvasId:J,nodeId:ef,label:p.string(),role:p.enum([`target`,`reference`])}),rf=p.discriminatedUnion(`type`,[p.object({type:p.literal(`text`),text:p.string()}),nf.extend({type:p.literal(`object`)})]),af=p.object({revision:p.number().int().nonnegative(),text:p.string(),task:p.enum([`chat`,`rewrite`,`shorten`,`translate`,`replace`,`rename`]).default(`chat`),references:p.array(nf),contentVersion:p.literal(1).default(1),parts:p.array(rf).optional(),attachmentIds:p.array(J),model:p.enum([`default`,`sonnet`,`opus`,`haiku`]).default(`default`),effort:p.enum([`default`,`low`,`medium`,`high`]).default(`default`),instructions:p.array(p.object({name:p.string().max(q.name),content:p.string(),version:p.string().max(q.name)})).default([])}).transform(e=>{let t=e.parts??[...e.references.flatMap(e=>[{type:`object`,...e},{type:`text`,text:`
|
|
19
|
-
`}]),{type:`text`,text:e.text}],n=t.map(e=>e.type===`text`?e.text:e.label).join(``),r=new Map;for(let e of t){if(e.type===`text`)continue;let t=`${e.canvasId}:${e.nodeId}`,n=r.get(t);r.set(t,{canvasId:e.canvasId,nodeId:e.nodeId,label:e.label,role:n?.role===`target`?`target`:e.role})}return{...e,text:n,references:Array.from(r,([,e])=>e),parts:t}}),of=p.object({state:p.enum([`checking`,`not-installed`,`unsupported`,`signed-out`,`signing-in`,`connected`,`usage-limited`,`auth-expired`,`unavailable`]),version:p.string().nullable(),account:p.string().nullable(),issue:p.string().nullable()}),sf=p.object({canvasId:J,mutationId:J,previousVersion:p.number().int().positive(),version:p.number().int().positive(),nodeIds:p.array(ef),reverted:p.boolean().default(!1),review:_u.optional()}),cf=p.object({prompt:p.string().trim().min(1),options:p.array(p.string().trim().min(1).max(q.shortText)).max(q.questionOptions).refine(e=>new Set(e).size===e.length,`Options must be distinct.`).default([])}).extend({id:J,digest:p.string().min(1).max(q.name),state:p.enum([`pending`,`answered`,`cancelled`]),answer:p.string().nullable()}),lf=p.object({jobId:J,version:p.number().int().positive(),target:$c,state:p.enum([`rendered`,`checked`,`needs-review`]),summary:p.string().max(q.label)}),uf=p.object({parts:p.array(rf).optional(),id:p.string().min(1).max(q.shortText),role:p.enum([`user`,`assistant`,`tool`]),text:p.string(),tool:p.string().nullable().default(null),outcome:p.enum([`running`,`completed`,`denied`,`failed`]).nullable().default(null)}),df=p.object({id:p.string().min(1).max(q.shortText),tool:p.string().max(q.shortText),digest:p.string().max(q.name),input:p.record(p.string(),p.unknown())}),ff=p.object({mutationId:J,canvasId:J,procedure:p.enum([`canvas.applyOperations`,`canvas.render.importSource`]),input:p.record(p.string(),p.unknown()),state:p.enum([`recorded`,`accepted`,`unknown`,`refused`])}),pf=p.object({id:J,name:p.string().max(q.shortText),mediaType:p.enum([`image/png`,`image/jpeg`,`image/webp`]),width:p.number().int().positive(),height:p.number().int().positive(),bytes:p.number().int().positive(),preview:p.string().regex(/^data:image\/(?:png|jpeg|webp);base64,[A-Za-z0-9+/=]+$/u)}),mf=p.object({id:J,state:p.enum([`preparing`,`starting`,`running`,`waiting`,`stopping`,`reconciling`,`completed`,`stopped`,`failed`,`interrupted`,`needs-review`]),submittedDraft:af,attachments:p.array(pf).optional(),model:p.string().nullable().default(null),runtimeVersion:p.string().nullable().default(null),lastActivityAt:p.iso.datetime().optional(),stillWorking:p.boolean().default(!1),preparedContext:p.string().default(``),baseVersion:p.number().int().positive(),startedAt:p.iso.datetime(),endedAt:p.iso.datetime().nullable(),messages:p.array(uf),receipts:p.array(sf),inspections:p.array(lf).default([]),questions:p.array(cf).optional(),intents:p.array(ff).default([]),pending:df.nullable(),recoveryIssue:p.string().nullable().optional(),issue:p.string().nullable()}),hf=p.object({id:J,canvasId:J,ownerId:J,title:p.string().trim().min(1).max(q.shortText),titleSource:p.enum([`automatic`,`manual`]).optional(),visibility:p.enum([`private`,`shared`]),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime(),sessionId:J,hasSession:p.boolean(),draft:af,turns:p.array(mf),earlierMessages:p.number().int().nonnegative().optional(),sequence:p.number().int().nonnegative()}),Y=p.uuid(),gf=mf.pick({id:!0,state:!0,model:!0,runtimeVersion:!0,stillWorking:!0,startedAt:!0,endedAt:!0,messages:!0,attachments:!0,receipts:!0,inspections:!0,questions:!0,recoveryIssue:!0,issue:!0}),_f=p.object({canvasId:Y,chatId:Y,title:p.string().trim().min(1).max(q.shortText),visibility:p.enum([`private`,`shared`]),sequence:p.number().int().nonnegative(),mergeTurns:p.boolean().optional(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime(),turns:p.array(gf)}).omit({mergeTurns:!0}).extend({earlierMessages:p.number().int().nonnegative().optional(),ownerId:Y,ownerName:p.string().optional(),readSequence:p.number().int().nonnegative().optional(),unread:p.boolean().optional()});p.object({canvasId:Y,search:p.string().max(q.shortText).default(``),ownerId:Y.optional(),sort:p.enum([`date`,`unread`]).default(`date`),cursor:p.object({updatedAt:p.iso.datetime(),chatId:Y,unread:p.boolean().optional()}).optional(),limit:p.number().int().min(1).max(q.page).default(q.page)}),p.object({items:p.array(_f),next:p.object({updatedAt:p.iso.datetime(),chatId:Y,unread:p.boolean().optional()}).nullable()});const vf=p.object({canvasId:Y,chatId:Y});vf.extend({before:p.number().int().nonnegative().optional()}),p.object({chat:_f.nullable(),next:p.number().int().nonnegative().nullable()}),vf.extend({sequence:p.number().int().nonnegative()}),p.object({saved:p.boolean()}),p.object({canvasId:Y,cursor:p.string().max(q.cursor).default(``)}),p.object({cursor:p.string(),changed:p.boolean()});const yf=p.string().min(1),X=p.uuid();p.object({protocol:p.literal(4),shellVersion:p.string(),hostId:X.optional(),eventSequence:p.number().int().nonnegative().default(0),installationId:X,profileId:X.nullable(),credential:p.object({tokenId:X,expiresAt:p.iso.datetime()}).nullable().default(null),connection:of,chats:p.array(hf),chatPages:p.array(p.object({canvasId:X,hasMore:p.boolean()})).default([]),attachments:p.array(pf),instructions:p.array(tf).default([]),issue:p.string().nullable(),capabilities:p.object({images:p.boolean(),dictation:p.boolean()})});const bf=p.object({personId:X,tokenId:X,token:p.string().startsWith(`enh_`).max(q.label),expiresAt:p.iso.datetime()}),xf=p.object({canvasId:X,rootIds:p.array(yf),version:p.number().int().positive()});p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`desktop.describe`)}),p.object({kind:p.literal(`claude.status`)}),p.object({kind:p.literal(`claude.connect`)}),p.object({kind:p.literal(`claude.cancelConnection`)}),p.object({kind:p.literal(`claude.chooseExecutable`)}),p.object({kind:p.literal(`profile.connect`),profile:bf}),p.object({kind:p.literal(`profile.disconnect`)}),p.object({kind:p.literal(`instruction.import`),name:p.string().trim().min(1).max(q.name),content:p.string().trim().min(1)}),p.object({kind:p.literal(`instruction.remove`),instructionId:X}),p.object({kind:p.literal(`chat.list`),canvasId:X,more:p.boolean().optional()}),p.object({kind:p.literal(`chat.read`),chatId:X,more:p.boolean().optional()}),p.object({kind:p.literal(`chat.create`),canvasId:X,visibility:p.enum([`private`,`shared`])}),p.object({kind:p.literal(`chat.saveDraft`),chatId:X,expectedRevision:p.number().int().nonnegative(),draft:af}),p.object({kind:p.literal(`chat.rename`),chatId:X,title:p.string().trim().min(1).max(q.shortText)}),p.object({kind:p.literal(`chat.visibility`),chatId:X,visibility:p.enum([`private`,`shared`])}),p.object({kind:p.literal(`chat.delete`),chatId:X,stop:p.boolean()}),p.object({kind:p.literal(`turn.start`),chatId:X,draftRevision:p.number().int().nonnegative(),scope:xf}),p.object({kind:p.literal(`turn.stop`),chatId:X,turnId:X}),p.object({kind:p.literal(`turn.checkChanges`),chatId:X,turnId:X}),p.object({kind:p.literal(`turn.undo`),chatId:X,turnId:X}),p.object({kind:p.literal(`question.respond`),chatId:X,turnId:X,questionId:X,digest:p.string().min(1).max(q.name),answer:p.string().trim().min(1).nullable()}),p.object({kind:p.literal(`request.respond`),chatId:X,turnId:X,requestId:p.string().max(q.shortText),digest:p.string().max(q.name),allow:p.boolean()}),p.object({kind:p.literal(`attachment.choose`),chatId:X}),p.object({kind:p.literal(`attachment.prepare`),chatId:X,name:p.string().max(q.shortText),bytes:p.string()}),p.object({kind:p.literal(`attachment.remove`),chatId:X,attachmentId:X}),p.object({kind:p.literal(`desktop.update`)}),p.object({kind:p.literal(`desktop.retryHost`)}),p.object({kind:p.literal(`desktop.openHistory`)})]);const Sf=p.string().trim().min(1).max(2e3);p.object({message:Sf,diagnostics:p.unknown().optional(),workspaceId:p.uuid().optional(),canvasId:p.uuid().optional()}),p.object({status:p.enum([`sent`,`unavailable`,`unconfirmed`]),attemptId:p.uuid(),retryAfterSeconds:p.number().int().min(1).max(3600).optional()});const Cf=p.enum([`home`,`recents`,`shared`,`trash`,`team`,`canvas`,`invite`,`sign-in`,`sign-up`,`other`]),wf=p.enum([`Error`,`TypeError`,`RangeError`,`ReferenceError`,`SyntaxError`,`URIError`,`AbortError`,`NetworkError`,`SecurityError`,`UnhandledRejection`]),Tf=1e6,Ef=p.number().int().min(0).max(864e5),Df=p.object({name:wf,atMs:Ef,source:p.enum([`application`,`external`,`unknown`]),line:p.number().int().min(0).max(Tf).optional(),column:p.number().int().min(0).max(Tf).optional()}),Of=p.object({path:p.string().max(256).regex(/^(?:canvas|comment|organisation|person|prototype|recording|recordingAsset|screen|transcript|telemetry)(?:\.[A-Za-z]+){1,4}$/u),status:p.enum([`ok`,`refused`,`unavailable`,`cancelled`]),durationMs:Ef,atMs:Ef,correlationId:p.uuid().optional()}),kf=p.object({action:p.enum([`navigate`,`feedback.open`]),route:Cf,atMs:Ef}),Af=p.string().max(512).transform((e,t)=>{let n=URL.parse(e),r=n?.searchParams.get(`replay_id`),i=n?.searchParams.get(`distinct_id`),a=n?.searchParams.get(`token`);return typeof a!=`string`||n?.origin!==`https://mixpanel.com`||n.pathname!==`/projects/replay-redirect`||!p.uuid().safeParse(r).success||!p.uuid().safeParse(i).success||!/^[\da-f]{32}$/iu.test(a)?(t.addIssue({code:`custom`,message:`unsupported replay reference`}),p.NEVER):`https://mixpanel.com/projects/replay-redirect?${new URLSearchParams({replay_id:r??``,distinct_id:i??``,token:a}).toString()}`});p.object({route:Cf,environment:p.object({browser:p.enum([`Chrome`,`Edge`,`Firefox`,`Safari`,`Other`]),os:p.enum([`macOS`,`Windows`,`Linux`,`iOS`,`Android`,`Other`]),release:p.string().max(256).regex(/^[\w.+-]+$/u)}),errors:p.array(Df).max(10),api:p.array(Of).max(10),activity:p.array(kf).max(20),replayUrl:Af.optional().catch(void 0)});const jf=p.enum([`owner`,`admin`,`member`]),Mf=p.enum([`can-view`,`can-comment`,`can-edit`]),Nf=p.object({id:p.uuid(),name:p.string().min(1).max(120),role:jf});p.object({}),w(Nf),p.object({name:p.string().trim().min(1).max(120)}),p.object({organisation:Nf}),p.object({organisationId:p.uuid(),name:p.string().trim().min(1).max(120)}),p.object({organisationId:p.uuid()}),p.object({organisationId:p.uuid(),movedCanvasCount:p.number().int().min(0)});const Pf=p.object({personId:p.uuid(),displayName:p.string().max(120),initials:p.string().max(4),avatarUrl:p.string().max(Io).nullable().optional(),email:p.string().max(254).nullable(),contentAccess:Mf.default(`can-comment`),role:jf});p.object({organisationId:p.uuid()}),w(Pf),p.object({organisationId:p.uuid(),email:p.email().trim().toLowerCase().max(254),role:p.enum([`admin`,`member`]).default(`member`),contentAccess:Mf.default(`can-comment`)}),p.object({personId:p.uuid()}),p.object({organisationId:p.uuid(),personId:p.uuid(),role:p.enum([`admin`,`member`])}).pick({personId:!0,role:!0}),p.object({organisationId:p.uuid(),personId:p.uuid(),contentAccess:Mf}).pick({personId:!0,contentAccess:!0}),p.object({organisationId:p.uuid(),personId:p.uuid()}),p.object({personId:p.uuid(),removed:p.literal(!0)}),p.object({organisationId:p.uuid(),personId:p.uuid()}),p.object({ownerPersonId:p.uuid()});const Ff=p.object({inviteId:p.uuid(),email:p.string().max(254).pipe(p.email()),contentAccess:Mf.default(`can-comment`),role:p.enum([`admin`,`member`]),sendCount:p.number().int().min(1),lastSentAt:p.iso.datetime(),expiresAt:p.iso.datetime(),state:p.enum([`pending`,`expired`]),deliveryState:p.enum([`queued`,`accepted`,`failed`]),deliveryError:p.string()});p.object({organisationId:p.uuid(),email:p.string().trim().toLowerCase().max(254).pipe(p.email()),role:p.enum([`admin`,`member`]).default(`member`),contentAccess:Mf.default(`can-comment`)}),p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`member`),personId:p.uuid()}),p.object({kind:p.literal(`invitation`),invite:Ff})]),p.object({invite:Ff}),p.object({organisationId:p.uuid()}),w(Ff),p.object({organisationId:p.uuid(),inviteId:p.uuid()}).extend({});const If=p.string().min(1).max(512);p.object({token:If}),p.object({token:If}),p.object({teamName:p.string().min(1).max(120),invitedBy:p.string().min(1).max(120),email:p.string().max(254).pipe(p.email()),contentAccess:Mf.default(`can-comment`),role:p.enum([`admin`,`member`]),expiresAt:p.iso.datetime(),state:p.enum([`pending`,`accepted`]),hasAccount:p.boolean()}),p.object({organisationId:p.uuid()});const Lf=p.object({id:p.uuid(),label:p.string().min(1).max(120),createdAt:p.iso.datetime(),lastUsedAt:p.iso.datetime().nullable(),expiresAt:p.iso.datetime().nullable(),revoked:p.boolean()});p.object({label:p.string().trim().min(1).max(120).describe(`Label naming the agent.`),expiresAt:p.iso.datetime().nullable().describe(`Expiry timestamp, or null for a token that does not expire.`)}),p.object({token:p.string().startsWith(`enh_`),agentToken:Lf}),p.object({}),p.object({items:p.array(Lf),isConnected:p.boolean()}),p.object({tokenId:p.uuid()}),p.object({tokenId:p.uuid(),revoked:p.literal(!0)}),p.discriminatedUnion(`method`,[p.object({method:p.literal(`token`)}),p.object({method:p.literal(`browser`),issuer:p.url(),clientId:p.string().min(1),scope:p.literal(`openid`)})]);const Rf=p.object({id:p.uuid(),preparedCanvasId:p.uuid(),displayName:p.string().min(1).max(120),initials:p.string().min(1).max(4),avatarUrl:p.string().max(Io).nullable(),email:p.string().max(254).nullable(),createdAt:p.iso.datetime()});p.object({}),p.object({person:Rf.nullable(),authentication:p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`anonymous`)}),p.object({kind:p.literal(`person`)}),p.object({kind:p.literal(`agent`),tokenId:p.uuid(),tokenLabel:p.string(),expiresAt:p.iso.datetime().nullable()}),p.object({kind:p.literal(`oauth-agent`),tokenId:p.uuid(),tokenLabel:p.string(),clientId:p.string().min(1),scopes:p.array(p.string()),expiresAt:p.iso.datetime(),resource:p.url()})])}),p.object({displayName:p.string().trim().min(1).max(120)}),p.object({person:Rf});const zf=p.string().trim().toLowerCase().min(3).max(40).regex(/^[a-z0-9][a-z0-9._-]*$/,`letters, digits, dot, underscore and dash only`),Bf=p.enum([`cookie`,`token`]).default(`cookie`);p.object({username:zf,password:p.string().min(10).max(200),displayName:p.string().trim().min(1).max(120),deliver:Bf,email:p.string().max(254).transform(e=>e.trim().toLowerCase()).pipe(p.email())}),p.object({username:zf,password:p.string().min(1).max(200),deliver:Bf}),p.object({person:Rf,token:p.string().nullable()}).extend({preparedCanvasId:p.uuid()}),p.object({}),p.object({signedOut:p.literal(!0)});const Vf=p.enum([`image/jpeg`,`image/png`,`image/webp`]);p.object({contentType:Vf,bytes:p.number().int().positive()}),p.object({assetId:p.uuid(),upload:p.object({url:p.url(),headers:p.record(p.string(),p.string()),expiresAt:p.iso.datetime()})}),p.object({assetId:p.uuid()}),p.object({assetId:p.uuid(),previewUrl:p.url()}),p.object({abandoned:p.boolean()}),p.object({requestId:p.uuid(),displayName:p.string().trim().min(1).max(120),photoAssetId:p.uuid().optional()}),p.object({person:Rf});const Hf=p.string().max(254).pipe(p.email()),Uf=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`person`),personId:p.uuid(),displayName:p.string().min(1).max(120),initials:p.string().min(1).max(4),avatarUrl:p.string().max(Io).nullable().optional(),email:Hf}),p.object({kind:p.literal(`email`),email:Hf})]);p.object({query:p.string().trim().min(1).max(200)});const Wf=p.object({recipients:p.array(Uf).max(5)});p.object({}),Wf.extend({});const Gf=`enhance3:session-handoff`;p.union([p.object({kind:p.literal(Gf),body:p.object({token:p.string().min(1),displayName:p.string().min(1)})}),p.object({kind:p.literal(Gf),signedOut:p.literal(!0)})]);const Kf=p.string().length(64).refine(e=>{for(let t of e)if(!/[\da-f]/u.test(t))return!1;return!0}),qf=e=>{for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e===127||e<=31))return!0}return!1},Jf=p.string().min(1).refine(e=>e===e.normalize(`NFC`),{message:`prototype paths must use NFC Unicode normalization`}).refine(e=>!e.startsWith(`/`)&&!/^[A-Za-z]:\//u.test(e)&&!e.endsWith(`/`)&&!e.includes(`\\`)&&!qf(e)&&!e.startsWith(`__enhance/`)&&e.split(`/`).every(e=>e!==``&&e!==`.`&&e!==`..`),{message:`prototype paths must be portable relative file paths`}),Yf=p.object({path:Jf,contentType:p.string().trim().min(1).max(200).refine(e=>!qf(e)),bytes:p.number().int().nonnegative().max(2**53-1),sha256:Kf});p.object({version:p.literal(1),entryPath:Jf,files:p.array(Yf).min(1)});const Xf=p.object({artifactBytes:p.number().int().positive().max(2**53-1),expandedBytes:p.number().int().positive().optional(),fileBytes:p.number().int().positive().max(2**53-1),manifestBytes:p.number().int().positive().optional(),fileCount:p.number().int().positive().optional(),pathBytes:p.number().int().positive().max(2**53-1)});p.object({}),p.object({attachmentProtocolVersion:p.literal(1).optional(),protocolVersion:p.literal(1),format:p.literal(`zip`),limits:Xf});const Zf=p.object({protocolVersion:p.literal(1),format:p.literal(`zip`),bytes:p.number().int().positive().max(2**53-1),sha256:Kf,fileCount:p.number().int().positive().max(2**53-1),expandedBytes:p.number().int().positive().max(2**53-1)});p.object({canvasId:p.uuid(),targetMode:p.enum([`node`,`prototype`]).optional(),canvasPageId:p.string().min(1).optional(),prototypeId:p.uuid().optional(),clientToken:p.uuid(),nodeId:p.string().min(1),title:p.string().trim().min(1).max(200),entryPath:Jf,artifact:Zf,box:F.extend({width:p.number().positive(),height:p.number().positive()})});const Qf=p.enum([`uploading`,`queued`,`ingesting`,`ready`,`failed`,`abandoned`]),$f=p.array(p.object({path:p.string().min(1),code:p.string().min(1)})),ep=p.object({prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),alreadyExists:p.boolean(),artifact:Zf});p.discriminatedUnion(`state`,[ep.extend({state:p.literal(`uploading`),upload:P}),ep.extend({state:p.enum([`queued`,`ingesting`,`ready`,`failed`,`abandoned`])})]);const tp=p.object({canvasId:p.uuid(),deploymentId:p.uuid()});p.object({deploymentId:p.uuid(),state:Qf}),p.object(tp.shape);const np=p.object({prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),fileCount:p.number().int().nonnegative(),totalBytes:p.number().int().nonnegative().max(2**53-1),processedFiles:p.number().int().nonnegative(),unavailableFiles:$f.optional()});p.discriminatedUnion(`state`,[np.extend({state:p.literal(`failed`),failure:p.object({code:p.string().min(1),message:p.string().min(1),path:Jf.optional()})}),np.extend({state:p.enum([`uploading`,`queued`,`ingesting`,`ready`,`abandoned`])})]),p.object({canvasId:p.uuid(),deploymentId:p.uuid(),baseVersion:p.number().int().positive(),canvasPageId:p.string().min(1).optional(),attachment:p.object({clientToken:p.uuid(),scope:p.object({pageId:p.string().min(1).optional(),nodeIds:p.array(p.string().min(1))})}).optional()}),p.object({canvasId:p.uuid(),prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),version:p.number().int().positive(),state:p.literal(`ready`),origin:p.url(),openUrl:p.string().startsWith(`/c/`),canvasUrl:p.url().optional(),unavailableFiles:$f.optional(),attachment:p.discriminatedUnion(`outcome`,[p.object({outcome:p.literal(`committed`),mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive()}),p.object({outcome:p.literal(`no_op`),version:p.number().int().positive()})]).optional()});const rp=p.string().min(1).refine(e=>!e.startsWith(`/`)&&!e.endsWith(`/`)&&!e.includes(`\\`)&&!e.includes(`\0`)&&e.split(`/`).every(e=>e!==``&&e!==`.`&&e!==`..`),{message:`prototype paths must be portable relative file paths`}),ip=p.object({path:rp,contentType:p.string().min(1).max(200),bytes:p.number().int().nonnegative()}),ap=p.enum([`uploading`,`verifying`,`ready`,`failed`,`abandoned`]);p.object({canvasId:p.uuid(),prototypeId:p.uuid().optional(),clientToken:p.uuid(),nodeId:p.string().min(1),targetMode:p.enum([`node`,`prototype`]).optional(),canvasPageId:p.string().min(1).optional(),title:p.string().trim().min(1).max(200),entryPath:rp.default(`index.html`),files:p.array(ip).min(1),box:F.extend({width:p.number().positive(),height:p.number().positive()})}),p.object({prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),state:ap,alreadyExists:p.boolean(),fileCount:p.number().int().positive(),totalBytes:p.number().int().positive()}),p.object({canvasId:p.uuid(),deploymentId:p.uuid(),cursor:p.number().int().min(0).default(0)});const op=p.object({path:rp,upload:P});p.object({deploymentId:p.uuid(),uploads:p.array(op).max(50),nextCursor:p.number().int().min(0).optional()}),p.object({canvasId:p.uuid(),deploymentId:p.uuid(),baseVersion:p.number().int().positive(),canvasPageId:p.string().min(1).optional()}),p.object({canvasId:p.uuid(),prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),version:p.number().int().positive(),state:p.literal(`ready`),origin:p.url(),openUrl:p.string().startsWith(`/c/`),canvasUrl:p.url().optional(),unavailableFiles:$f.optional()}),p.object({context:p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`live`),nodeId:p.string().min(1)}),p.object({kind:p.literal(`version`),nodeId:p.string().min(1),versionEntryId:p.uuid()})]).optional(),canvasId:p.uuid(),prototypeId:p.uuid(),deploymentId:p.uuid()}),p.object({deploymentId:p.uuid(),origin:p.url(),bootUrl:p.url(),expiresAt:p.iso.datetime()});const sp=m.int().check(m.minimum(0),m.maximum(6e5)),cp=m.enum([`none`,`completed`,`background`,`failed`]);m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.gate`),generation:m.uuid(),nonce:m.uuid(),outcome:m.enum([`opening`,`migrating`,`accepted`,`expired-or-used`,`temporary-error`,`denied`]),timing:m.optional(m.object({exchangeMs:sp,migration:cp,migrationWaitMs:sp}))}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.capture`),requestId:m.uuid(),connectionId:m.optional(m.uuid()),documentId:m.optional(m.uuid()),format:m.optional(m.literal(`menu-svg`))});const lp=m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.connect`),connectionId:m.uuid()});m.extend(lp,{type:m.literal(`enhance.prototype.connected`),documentId:m.uuid(),capabilities:m.array(m.string()),release:m.string().check(m.minLength(1))}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.unloading`),documentId:m.uuid()}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.ready`),inputVersion:m.optional(m.int()),build:m.optional(m.string()),capabilities:m.optional(m.array(m.string()))});const up=m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.present`),generation:m.uuid(),nonce:m.uuid()});m.extend(up,{type:m.literal(`enhance.prototype.presented`),documentId:m.uuid()}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.escape`)}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.zoom`),deltaX:m.number(),deltaY:m.number(),deltaMode:m.union([m.literal(0),m.literal(1),m.literal(2)]),anchorX:m.number().check(m.minimum(0),m.maximum(1)),anchorY:m.number().check(m.minimum(0),m.maximum(1))}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.navigate`),direction:m.enum([`back`,`forward`,`reload`])}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.navigation`),path:m.optional(m.string()),canGoBack:m.boolean(),canGoForward:m.boolean(),isNavigating:m._default(m.boolean(),!1)});const dp=m.object({artifact:m.string().check(m.minLength(1)),viewport:m.object({width:m.number().check(m.positive()),height:m.number().check(m.positive())}),title:m.string(),files:m.optional(m.object({named:m.array(m.string()),fetched:m.array(m.object({url:m.string(),contentType:m.string(),bytes:m.custom(e=>Object.prototype.toString.call(e)===`[object ArrayBuffer]`)}))}))}),fp=m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.captured`),requestId:m.uuid(),connectionId:m.optional(m.uuid()),documentId:m.optional(m.uuid())});m.discriminatedUnion(`outcome`,[m.extend(fp,{outcome:m.literal(`captured`),screen:dp,issues:m.optional(ta)}),m.extend(fp,{outcome:m.literal(`menu-svg`),markup:m.string().check(m.startsWith(`data:image/svg+xml`))}),m.extend(fp,{outcome:m.literal(`failed`),error:m.string().check(m.minLength(1)),code:m.optional(m.enum([`capture-failed`,`capture-busy`]))})]);const pp=m.number().check(m.minimum(0),m.maximum(6e4)),mp={wheelQuietMs:280,pointerSlopPx:4,singleAxisRatio:1.2,momentumTailSpeed:100,axisRatio:1.25,openingSamplePx:4,openingWindowMs:35},hp=m.object({directionConfirmation:m._default(m.literal(`next-sample`),`next-sample`),openingSamplePx:m._default(m.number().check(m.minimum(0),m.maximum(16)),mp.openingSamplePx),openingWindowMs:m._default(m.number().check(m.minimum(0),m.maximum(50)),mp.openingWindowMs),canvasProtection:m._default(m.literal(`slow-tail`),`slow-tail`),momentumTailSpeed:m._default(m.number().check(m.minimum(0),m.maximum(1e3)),mp.momentumTailSpeed),wheelQuietMs:m._default(pp,mp.wheelQuietMs),pointerSlopPx:m._default(m.number().check(m.minimum(0),m.maximum(50)),mp.pointerSlopPx),singleAxisRatio:m._default(m.number().check(m.minimum(.25),m.maximum(4)),mp.singleAxisRatio),axisRatio:m._default(m.number().check(m.minimum(1),m.maximum(4)),mp.axisRatio)});hp.parse({});const gp=m.object({inputVersion:m.literal(2)});m.extend(gp,{type:m.literal(`enhance.prototype.input-context`),settings:hp,navigationAt:m.number(),canvasPhysicalAt:m._default(m.number(),0),canvasSubstantialAt:m._default(m.number(),0),canvasSpeed:m._default(m.number().check(m.nonnegative()),0),canvasWheelUntil:m.number(),canvasMomentum:m.nullable(m.boolean()),escapeAt:m._default(m.number(),0),escapePending:m._default(m.boolean(),!1),appWheelUntil:m._default(m.number(),0),appMomentum:m._default(m.nullable(m.boolean()),null),toolOwnsInput:m.boolean(),interactive:m._default(m.boolean(),!0),pointerPan:m.optional(m.boolean()),pointerPanId:m.optional(m.int().check(m.nonnegative())),pointer:m.nullable(m.object({x:m.number(),y:m.number()})),cursor:m.optional(m.nullable(m.object({anchor:m.nullable(m.object({x:m.number(),y:m.number()})),fallback:m.string(),pointerTime:m.number()}))),visible:m.boolean()});const _p=m.extend(gp,{type:m.literal(`enhance.prototype.wheel`),deltaX:m.number(),deltaY:m.number(),zoom:m.boolean(),momentum:m.nullable(m.boolean()),openingHandoff:m.optional(m.boolean()),anchorX:m.number().check(m.minimum(0),m.maximum(1)),anchorY:m.number().check(m.minimum(0),m.maximum(1))}),vp=m.extend(gp,{type:m.literal(`enhance.prototype.pan`),phase:m.enum([`start`,`move`,`end`,`cancel`]),pointerId:m.int().check(m.nonnegative()),clientPoint:m.optional(m.object({x:m.number(),y:m.number()})),screenX:m.number(),screenY:m.number(),anchorX:m.number().check(m.minimum(0),m.maximum(1)),anchorY:m.number().check(m.minimum(0),m.maximum(1))}),yp=m.extend(gp,{type:m.literal(`enhance.prototype.input-activity`),owner:m.enum([`app`,`canvas`,`none`]),reason:m.string().check(m.maxLength(120)),momentum:m.nullable(m.boolean()),focused:m.boolean(),hovered:m._default(m.boolean(),!1),suppressed:m._default(m.boolean(),!1),protected:m.boolean(),screenX:m.number(),screenY:m.number(),pointerAnchor:m._default(m.nullable(m.object({x:m.number(),y:m.number()})),null),pointerTime:m._default(m.number(),0),kind:m.enum([`pointer`,`interaction`,`wheel`,`focus`,`protection`,`escape`,`select`])}),bp=m.extend(gp,{type:m.literal(`enhance.prototype.input-ready`),build:m.string().check(m.maxLength(120))}),xp=m.extend(gp,{type:m.literal(`enhance.prototype.context-menu`),anchorX:m.number().check(m.minimum(0),m.maximum(1)),anchorY:m.number().check(m.minimum(0),m.maximum(1)),keyboard:m.boolean(),ctrlKey:m.boolean(),metaKey:m.boolean()});m.discriminatedUnion(`type`,[_p,yp,bp,vp,xp]);const Sp=2166136261,Cp=Number.parseInt(`9e3779b9`,16),wp=Number.parseInt(`85ebca6b`,16),Tp=Number.parseInt(`c2b2ae35`,16);Sp^Cp,Sp^wp,Sp^Tp;const Ep=p.object({width:p.number().int().positive(),height:p.number().int().positive()}),Dp=p.object({mimeType:p.string().min(1).max(100),sampleRate:p.number().int().min(8e3).max(192e3)});p.object({sourceUrl:p.string(),viewport:Ep,pageTitle:p.string().nullable(),audio:Dp.nullable().default(null)}),p.object({recordingId:p.uuid(),ownerPersonId:p.uuid(),chunkIndex:p.literal(0),upload:P,audioUpload:P.nullable()}),p.object({recordingId:p.uuid(),index:p.number().int().min(0),firstEventMs:p.number().int().min(0),lastEventMs:p.number().int().min(0),eventCount:p.number().int().min(0),continues:p.boolean().default(!1),bytes:p.number().int().min(1),etag:p.string().min(1).max(200).optional()}),p.object({nextChunkIndex:p.number().int().min(1),upload:P}),p.object({recordingId:p.uuid(),index:p.number().int().min(0),firstMs:p.number().int().min(0),lastMs:p.number().int().min(0),bytes:p.number().int().min(1),epoch:p.number().int().min(0).default(0),startsEpoch:p.boolean().default(!1),etag:p.string().min(1).max(200).optional()}),p.object({nextChunkIndex:p.number().int().min(1),upload:P}),p.object({recordingId:p.uuid(),durationMs:p.number().int().min(0),viewport:Ep,sourceUrl:p.string(),interrupted:p.boolean().default(!1),canvasId:p.uuid().optional(),organisationId:p.uuid().optional(),audioChunkCount:p.number().int().min(0).default(0),hasRecoverableBytes:p.boolean().default(!1)}).refine(e=>e.canvasId===void 0||e.organisationId===void 0,{message:`choose an existing canvas or a team for a new canvas, not both`});const Op=p.enum([`whole`,`recovering`,`partial`]),kp=p.enum([`dom`,`audio`]);p.object({recordingId:p.uuid(),canvasId:p.uuid(),canvasTitle:p.string().min(1),isNewCanvas:p.boolean(),storedChunkCount:p.number().int().min(0),missingChunkIndexes:p.array(p.number().int().min(0)).max(64),missingChunkCount:p.number().int().min(0),storedAudioChunkCount:p.number().int().min(0),missingAudioChunkIndexes:p.array(p.number().int().min(0)).max(64),missingAudioChunkCount:p.number().int().min(0),integrity:Op});const Ap=p.object({recordingId:p.uuid(),durationMs:p.number().int().min(0),viewport:Ep,interrupted:p.boolean(),chunkCount:p.number().int().min(0),startedAt:p.iso.datetime(),isCopy:p.boolean()}),jp=p.array(p.object({url:p.url(),contentType:p.string().min(1).max(200),byteSize:p.number().int().min(1),sha256:p.string().regex(/^[a-f0-9]{64}$/u).optional()})).max(400);p.union([p.object({recordingId:p.uuid(),assets:jp}),p.object({screenId:p.uuid(),assets:jp})]),p.object({reserved:p.array(p.object({url:p.string(),upload:P}))});const Mp=p.array(p.object({url:p.url(),etag:p.string().min(1).max(200),byteSize:p.number().int().min(1)})).max(400);p.union([p.object({recordingId:p.uuid(),arrived:Mp}),p.object({screenId:p.uuid(),arrived:Mp})]),p.object({missingAssetCount:p.number().int().min(0)}),p.object({canvasId:p.uuid(),recordingId:p.uuid()});const Np=p.object({seq:p.number().int().min(0),firstEventMs:p.number().int().min(0),lastEventMs:p.number().int().min(0),continues:p.boolean()}),Pp=p.discriminatedUnion(`state`,[Np.extend({state:p.literal(`available`),download:nc}),Np.extend({state:p.literal(`missing`)})]),Fp=p.object({seq:p.number().int().min(0),firstMs:p.number().int().min(0),lastMs:p.number().int().min(0),epoch:p.number().int().min(0),startsEpoch:p.boolean()}),Ip=p.discriminatedUnion(`state`,[Fp.extend({state:p.literal(`available`),download:nc}),Fp.extend({state:p.literal(`missing`)})]);p.object({recordingId:p.uuid(),durationMs:p.number().int().min(0),viewport:Ep,sourceUrl:p.string(),interrupted:p.boolean(),integrity:Op,chunks:p.array(Pp),audio:p.object({mimeType:p.string(),chunks:p.array(Ip)}).nullable(),assets:p.array(p.object({url:p.string(),contentType:p.string(),path:p.string().startsWith(`/v1/recording-assets/`)})),missingAssetCount:p.number().int().min(0),missingAssetUrls:p.array(p.string()).optional()});const Lp=p.object({recordingId:p.uuid(),track:kp,index:p.number().int().min(0)});p.object({upload:P}),Lp.extend({etag:p.string().min(1).max(200)}),p.object({integrity:Op}),p.object({canvasId:p.uuid()}),w(Ap).extend({unreadableCount:p.number().int().min(0)}),p.object({recordingId:p.uuid()}),p.object({recordingId:p.uuid(),discarded:p.literal(!0)}),p.object({canvasId:p.uuid(),recordingId:p.uuid()}),p.object({recordingId:p.uuid(),detachedScreenCount:p.number().int().min(0)}),[`[data-enhance-unsupported]:not([data-enhance-unsupported-hidden]):not([style*="display: none"]) {
|
|
18
|
+
`).action(async e=>Xr(t,e))},Qr=e=>e.replaceAll(/([a-z\d])([A-Z])/gu,`$1-$2`).toLowerCase(),$r=(e,t)=>typeof t==`number`&&!Yr.has(e)?`${String(t)}px`:String(t),ei=e=>Object.entries(e).filter(([,e])=>e!==null).map(([e,t])=>{let n=Qr(e);return`${n}:${$r(n,t??``)}`}).join(`;`).replaceAll(`&`,`&`).replaceAll(`"`,`"`),ti=e=>e.length===0?0:Math.max(...e.map(e=>e.x+e.width))+80,ni=(e,t)=>{e.command(`create-artboard`).description(`Create a top-level frame.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID to edit.`).requiredOption(`--base-version <integer>`,`Exact current canvas version.`).requiredOption(`--name <name>`,`Meaningful layer name.`).requiredOption(`--styles <json-or-@path>`,`CSSProperties with width and height.`).option(`--client-token <uuid>`,`Stable UUID for retrying this exact creation and review.`).option(`--output <path>`,`Review PNG path.`).option(`--force`,`Replace an existing review PNG.`,!1).action(async e=>{let n=g(e.styles,_n,`--styles`);if(n.width===void 0||n.height===void 0)throw new u(`BAD_REQUEST`,`--styles must include width and height.`,`Use explicit whole-pixel dimensions such as 1440px and 900px.`);On(t,e.clientToken,!0);let r=te(e.canvas),i=Dn(e.baseVersion),a=await Je(t,r,i),o=Object.entries(a.relationships).flatMap(([e,t])=>{let n=a.nodes[e]?.box;return n!==void 0&&t.parentId===`root`?[n]:[]}),s={display:`flex`,flexDirection:`column`,left:ti(o),top:0,...n,position:`absolute`},c=e.name.replaceAll(`&`,`&`).replaceAll(`"`,`"`);t.output.result(await it(t.remote,t.render).execute({canvasId:r,targetNodeId:`root`,mode:`insert-children`,html:`<div layer-name="${c}" data-enhance-kind="frame" style="${ei(s)}"></div>`,idPrefix:`artboard_${t.mutationKey.current(`canvas.render.importSource`,{canvasId:r})}`,baseVersion:i,renderClientToken:t.mutationKey.current(`canvas.render.create`,{purpose:`create-artboard-review`}),renderOutputPath:e.output??null,overwriteRender:e.force===!0,renderScale:1,renderTimeoutMs:12e4}))})},ri=(e,t)=>{Zr(e,t),ni(e,t)},ii=(e,t)=>{for(let n of[`canvas.insertHtml`,`canvas.makeEditable`,`canvas.capture`,`canvas.arrange`]){let r=d(t.catalog(),n),i=n===`canvas.insertHtml`?`insert-html`:n===`canvas.makeEditable`?`make-editable`:n.slice(7);e.command(i).description(r.guide.summary).requiredOption(`--input <json-or-@path>`,`Canvas reference, base version and explicit native authoring request.`).requiredOption(`--client-token <uuid>`,`Stable intent ID; reuse unchanged after an uncertain outcome.`).action(async e=>{t.output.result(await t.invocation.invoke({capability:r,arguments:g(e.input,r.inputSchema,`--input`),clientToken:p.uuid().parse(e.clientToken)}))})}},ai=(e,t)=>{e.command(`remove`).description(`Remove explicitly named canvas subtrees with scope, lock and revision checks.`).requiredOption(`--input <json-or-@path>`,`Request containing canvasRef, baseVersion and rootNodeIds.`).requiredOption(`--client-token <uuid>`,`Stable intent ID; reuse unchanged after an uncertain outcome.`).action(async e=>{t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.remove`),arguments:g(e.input,fe,`--input`),clientToken:p.uuid().parse(e.clientToken)}))})},oi=(e,t)=>{e.command(`read`).description(`Read complete editable content, bounded evidence, or the supplied reference.`).summary(`Read linked canvas content.`).option(`--input <json-or-@path>`,`Bounded read request containing canvasRef, view and target options.`).option(`--canvas <url-or-id>`,`Complete canvas, page or selection URL for comprehensive reads.`).option(`--node-id <id>`,`Subtree within --canvas; unavailable with --input.`).action(async e=>{if(e.input===void 0==(e.canvas===void 0)||e.input!==void 0&&e.nodeId!==void 0)throw new u(`BAD_REQUEST`,`Choose exactly one of --input or --canvas; --node-id requires --canvas.`,`Use --input for bounded views, or --canvas with an optional --node-id for comprehensive reads.`);let n=e.input===void 0?{canvas:e.canvas,...e.nodeId!==void 0&&{nodeId:e.nodeId}}:g(e.input,me,`--input`);t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.read`),arguments:n,clientToken:null}))})},si=(e,t)=>{e.command(`find`).description(`Find accessible canvases and existing creation destinations with bounded results.`).option(`--input <json-or-@path>`,`Search title, collection, limit and continuation cursor.`,`{}`).action(async e=>{t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.find`),arguments:g(e.input,le,`--input`),clientToken:null}))}),ai(e,t),oi(e,t),e.command(`update-html`).description(`Apply an identity-preserving edit from a complete HTML snapshot.`).requiredOption(`--input <json-or-@path>`,`Request containing canvasRef, snapshotToken, html and removeNodeIds.`).requiredOption(`--client-token <uuid>`,`Stable intent ID; reuse unchanged after an uncertain outcome.`).action(async e=>{let n=g(e.input,Ie,`--input`);t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.updateHtml`),arguments:n,clientToken:p.uuid().parse(e.clientToken)}))})},ci=(e,t)=>{let n=d(t.catalog(),`prototype.publishCanvas`);e.command(`publish-prototype`).description(n.guide.summary).requiredOption(`--input <json-or-@path>`,`Complete canvas reference, baseVersion, unpacked build directory or existing deployment, and bounded waitMs.`).requiredOption(`--client-token <uuid>`,`Stable attachment intent; reuse the same arguments after uncertainty, use a new token after replanning.`).action(async e=>{t.output.result(await t.invocation.invoke({capability:n,arguments:g(e.input,n.inputSchema,`--input`),clientToken:p.uuid().parse(e.clientToken)}))})},li=(e,t)=>{let n=d(t.catalog(),`canvas.importAsset`);e.command(`import-asset`).description(n.guide.summary).requiredOption(`--input <json-or-@path>`,`Canvas reference and selected local file source.`).requiredOption(`--client-token <uuid>`,`Stable import intent; reuse after uncertainty.`).action(async e=>{t.output.result(await t.invocation.invoke({capability:n,arguments:g(e.input,n.inputSchema,`--input`),clientToken:p.uuid().parse(e.clientToken)}))})},ui=(e,t)=>{si(e,t),ci(e,t),li(e,t),ii(e,t),Hr(e,t),ri(e,t),Qn(e,t),qr(e,t),Kn(e,t)},di=e=>{let t=e.getOptionValue(`canvas`),r=e.getOptionValue(`canvasId`);if(t!==void 0&&r!==void 0)throw new u(`BAD_REQUEST`,`--canvas and --canvas-id cannot be combined.`,`Pass the pasted URL or UUID through --canvas.`);let i=t??r;if(typeof i!=`string`)throw TypeError(`The required-option check let canvas ${e.name()} run without --canvas.`);return{reference:n(i),url:i}},fi=(e,t)=>{let n=e.getOptionValue(`nodeId`)??(t.nodeIds.length===1?t.nodeIds[0]:void 0);if(typeof n!=`string`||n===``)throw new u(`BAD_REQUEST`,`--node-id or a single-node selection link is required.`,`Choose one node, or use canvas tree to inspect the linked selection.`);return n},pi=async(e,t,n,r)=>{let i=e.name()===`node`?fi(e,n):void 0,a=await Xe(t.remote,{canvas:r,...i!==void 0&&{nodeId:i}});if(i===void 0)return a;let{nodes:o,...s}=a;return{...s,node:o.find(e=>e.id===i)}},mi=(e,t)=>{for(let n of[`inspect`,`tree`,`node`,`selection`]){let r=e.commands.find(e=>e.name()===n),i=r?.options.find(e=>e.long===`--canvas-id`);r!==void 0&&i!==void 0&&(i.makeOptionMandatory(!1),r.options.find(e=>e.long===`--node-id`)?.makeOptionMandatory(!1),r.option(`--canvas <url-or-id>`,`Pasted canvas URL or UUID. Selection links limit reads and edits to the linked subtree.`),r.action(async()=>{let{reference:e,url:i}=di(r),a=xe(e)?await pi(r,t,e,i):await t.remote.query(`canvas.${n}`,{canvasId:e.canvasId,...n===`node`&&{nodeId:fi(r,e)}});t.output.result(a)}))}},hi=e=>{if(e.input===void 0)return null;if(e.canvas!==void 0||e.nodeId!==void 0||e.bounds!==void 0||e.expectedVersion!==void 0||e.atMs!==void 0||e.output!==void 0||e.force===!0||e.scale!==`1`||e.timeoutMs!==`120000`)throw new u(`BAD_REQUEST`,`The bounded --input request cannot be combined with individual render options.`,`Put the entire scoped render request in --input.`);return{arguments:g(e.input,Ne,`--input`),clientToken:Ur(e.clientToken)}},gi=`canvas render --canvas 0b9f4c1e-5d2a-4e8b-9c3f-7a6d1e2b4c50`,_i={"canvas render":gi},vi=p.coerce.number().int().positive(),yi=p.coerce.number().int().nonnegative(),bi=p.coerce.number().positive(),xi=(e,t,n,r=`canvas render`)=>{let i=e.safeParse(t);if(!i.success)throw new u(`BAD_REQUEST`,`${n} is invalid.`,`Run 'enhance ${r} --help'.`);return i.data},Si=e=>{if(e===void 0)return null;try{let t=de.safeParse(JSON.parse(e));if(t.success)return t.data}catch{}throw new u(`BAD_REQUEST`,`--bounds must be a finite positive world rectangle.`,`Pass JSON such as '{"x":0,"y":0,"width":800,"height":600}'.`)},Ci=(e,t)=>e===void 0?t===null?{kind:`content`}:{kind:`bounds`,bounds:t}:{kind:`node`,nodeId:e},wi=e=>{if(!(typeof e!=`string`||!e.startsWith(`rec_`)))return p.uuid().safeParse(e.slice(4)).data},Ti=(e,t)=>{let n=p.uuid().nullable().safeParse(t??null);if(!n.success)throw new u(`BAD_REQUEST`,`--client-token must be a UUID.`,`Mint one UUID and reuse it only when retrying this exact render.`);return e.mutationKey.select(n.data,!1),e.mutationKey.current(`canvas.render.create`,{})},Ei=async(e,t)=>{let r=n(e.canvas??``),a=Ci(e.nodeId,Si(e.bounds)),o=e.expectedVersion===void 0?null:xi(vi,e.expectedVersion,`--expected-version`);if(!xe(r))return{target:a,expectedVersion:o};let s=se.parse(await t.remote.query(`canvas.document.get`,{canvasId:r.canvasId}));if(o!==null&&o!==s.version)throw new u(`CONFLICT`,`The canvas changed before rendering.`,`Read the linked page or selection and render its current version.`);return{target:i(r,Fe.parse(s.document),a),expectedVersion:s.version}},Di=async(e,t)=>{if(e.canvas===void 0)throw TypeError(`The required-option check let canvas render run without --canvas.`);if(e.nodeId!==void 0&&e.bounds!==void 0)throw new u(`BAD_REQUEST`,`--node-id and --bounds cannot be combined.`,`Choose one focused target, or omit both to render all authored content.`);let r=await Ei(e,t),i=r.target.kind===`node`?r.target.nodeId:void 0;if(i===void 0&&e.atMs!==void 0)throw new u(`BAD_REQUEST`,`--at-ms requires --node-id.`,"Render the stable recording node returned by `enhance canvas tree`.");let a=e.atMs===void 0?null:wi(i);if(a===void 0&&e.atMs!==void 0)throw new u(`BAD_REQUEST`,`--at-ms requires a stable recording node id such as rec_<recording-uuid>.`,"Run `enhance canvas tree --canvas <url-or-id>` and choose a recording node.");Ti(t,e.clientToken);let o=await t.invocation.invoke({capability:d(t.catalog(),`canvas.render`),arguments:{canvasId:n(e.canvas).canvasId,...r,sourceState:a==null?null:{kind:`recording`,recordingId:a,atMs:xi(yi,e.atMs??``,`--at-ms`)},scale:xi(bi,e.scale,`--scale`),outputPath:e.output??null,overwrite:e.force===!0,timeoutMs:xi(vi,e.timeoutMs,`--timeout-ms`)},clientToken:e.clientToken??null});t.output.result(o)},Oi=e=>e.parent===null?e:Oi(e.parent),ki=(e,t)=>{e.option(`--input <json-or-@path>`,`Bounded scoped render request; requires --client-token.`).option(`--canvas <url-or-id>`,`Canvas URL or UUID to render.`).option(`--node-id <id>`,`Render one stable canvas node instead of all authored content.`).option(`--bounds <json>`,`Render an explicit rectangle in canvas world coordinates.`).option(`--expected-version <integer>`,`Refuse pixels from any other document version.`).option(`--at-ms <integer>`,`Pause a recording node at this millisecond; inspect the PNG before snapshotting it.`).option(`--scale <number>`,`Output pixels per canvas unit, from 0.1 to 4.`,`1`).option(`--output <path>`,`Write the PNG to this path instead of a protected temporary file.`).option(`--force`,`Replace an existing --output file deliberately.`,!1).option(`--timeout-ms <integer>`,`Local polling deadline in milliseconds.`,`120000`).option(`--client-token <uuid>`,`Stable UUID to reuse only when retrying this render request.`).addHelpText(`after`,()=>`\nExample:\n ${Oi(e).name()} ${gi}\n\nFor transcript-led selection, inspect nearby --at-ms renders and reject transitions or duplicate states before running recording snapshot.\n`).action(async e=>{let n=hi(e);if(n===null)return Di(e,t);t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`canvas.render`),...n}))})},Ai=(e,t)=>{let n=e.commands.find(e=>e.name()===`canvas`);if(n===void 0)throw TypeError(`the API router did not supply canvas commands`);n.configureHelp({subcommandTerm:e=>e.name()});let r=n.commands.find(e=>e.name()===`render`);if(r===void 0)throw TypeError(`the API router did not supply canvas render`);let i=at(t.remote,Ke(t.configDirectory),t.now,t.output.result);zn(n,t),ui(n,{...t,render:i}),mi(n,t),ki(r,t)},v=p.string().trim().min(1).max(160),ji=p.string().regex(/^[a-f0-9]{64}$/u),Mi=p.number().int().positive(),Ni=p.strictObject({source:v,journey:v,step:v,variant:v}),Pi=p.strictObject({sha256:ji,bytes:p.number().int().positive(),mediaType:p.string().min(1).max(200)}),Fi=p.strictObject({organisationId:p.uuid().optional()}),Ii=p.strictObject({key:p.string().min(1),label:p.string().min(1),url:p.url().optional(),sequence:p.number().int().nonnegative(),attempt:p.number().int().nonnegative().default(0)}),Li=p.union([p.strictObject({runId:p.uuid()}),p.strictObject({reference:p.string().min(1),revision:p.string().min(1).optional()})]),Ri=p.strictObject({destination:Fi,context:Ii.optional(),revision:p.string().min(1).optional(),baselineRunId:p.uuid().nullable(),compareTo:Li.optional()}),zi=p.enum([`awaiting-review`,`approved`,`changes-requested`]),Bi=p.strictObject({format:p.literal(`enhance-capture`),version:p.literal(1),key:Ni,label:v,journeyLabel:v,order:p.number().int().nonnegative(),page:p.string().min(1).optional(),viewport:p.strictObject({width:Mi,height:Mi,deviceScaleFactor:p.number().positive()}),extent:p.enum([`viewport`,`full-page`]),source:p.strictObject({format:p.literal(`rrweb-screen`),version:p.literal(1),blob:Pi}),preview:p.strictObject({blob:Pi,width:Mi,height:Mi,pixelRatio:p.number().positive()}),assets:p.array(p.strictObject({url:p.url(),blob:Pi})),provenance:p.strictObject({adapter:v,sdkVersion:v,kernelVersion:v,browser:v,capturedAt:p.iso.datetime(),sourceUrl:p.url().optional(),commit:p.string().min(1).max(200).optional()}),issues:p.array(p.strictObject({code:v,message:p.string().min(1).max(500)}))}).superRefine((e,t)=>{(e.preview.width/e.preview.pixelRatio!==e.viewport.width||e.preview.height/e.preview.pixelRatio!==e.viewport.height)&&t.addIssue({code:`custom`,path:[`preview`],message:`The preview and captured CSS extent must match.`}),e.source.blob.mediaType!==`application/json`&&t.addIssue({code:`custom`,path:[`source`,`blob`,`mediaType`],message:`Capture sources must be frozen JSON.`}),e.preview.blob.mediaType!==`image/png`&&t.addIssue({code:`custom`,path:[`preview`,`blob`,`mediaType`],message:`Capture previews must be PNG.`}),new Set(e.assets.map(e=>e.url)).size!==e.assets.length&&t.addIssue({code:`custom`,path:[`assets`],message:`Capture resource URLs must be unique.`})}),Vi=p.strictObject({id:p.uuid(),canvasId:p.uuid(),source:v,runKey:v,generation:p.number().int().nonnegative(),participants:p.array(v).min(1),expiresAt:p.iso.datetime(),formatVersion:p.literal(1),review:Ri.optional()}),Hi={participant:v,retry:p.number().int().nonnegative(),status:p.enum([`passed`,`failed`,`skipped`,`interrupted`,`timedOut`]),title:p.string().min(1).optional(),location:p.strictObject({file:p.string().min(1),line:p.number().int()}).optional(),captures:p.array(Bi)},Ui=p.strictObject({runner:p.literal(`playwright`).optional(),testId:v,project:v,...Hi}),Wi=p.strictObject({runner:p.literal(`script`),...Hi}),Gi=p.union([Ui,Wi]),Ki=p.strictObject({key:Ni.optional(),testId:v.optional(),message:p.string().min(1).max(500)}),qi=p.strictObject({format:p.literal(`enhance-capture-run`),version:p.literal(1),run:Vi,participants:p.array(p.strictObject({id:v,status:p.enum([`passed`,`failed`,`interrupted`])})).min(1),attempts:p.array(Gi),ordering:p.enum([`partial`,`complete`]),leftOut:p.array(Ki).optional()}),Ji=p.strictObject({runId:p.uuid(),canvasId:p.uuid(),canvasUrl:p.url(),version:p.number().int().positive(),manifestDigest:ji,frames:p.array(p.strictObject({key:Ni,frameId:v,captureId:p.uuid()})),issues:p.array(p.strictObject({code:v,message:p.string().max(500)}))}),Yi=p.strictObject({canvasId:p.uuid().optional(),destination:Fi.optional(),title:p.string().trim().min(1).optional(),context:Ii.optional(),revision:p.string().min(1).optional(),compareTo:Li.optional(),source:v.default(`default`),runKey:v,participants:p.array(v).min(1).default([`local`]),formatVersion:p.literal(1).default(1)}).superRefine((e,t)=>{e.canvasId===void 0==(e.destination===void 0)&&t.addIssue({code:`custom`,message:`Choose either a canvas or a destination for this run.`}),e.canvasId!==void 0&&(e.context!==void 0||e.compareTo!==void 0)&&t.addIssue({code:`custom`,message:`Run review requires a destination.`})}),Xi=p.strictObject({run:Vi});p.strictObject({runId:p.uuid()});const Zi=p.enum([`collecting`,`sealed`,`converting`,`committed`,`failed`,`cancelled`]),Qi=p.strictObject({run:Vi,state:Zi,receipt:Ji.nullable(),verdict:zi.optional(),failure:p.strictObject({code:v,message:p.string().max(1e3)}).nullable()});p.strictObject({runId:p.uuid(),blobs:p.array(Pi).min(1).max(400)});const $i=p.strictObject({uploads:p.array(p.strictObject({sha256:ji,upload:p.strictObject({url:p.url(),headers:p.record(p.string(),p.string()),expiresAt:p.iso.datetime()}).nullable()})).max(400)});p.strictObject({canvasId:p.uuid(),frameId:p.string().min(1),captureId:p.uuid()});const ea=p.strictObject({captureId:p.uuid(),capturedAt:p.iso.datetime(),commit:p.string().max(200).optional(),url:p.string().min(1),width:p.number().positive(),height:p.number().positive(),pixelRatio:p.number().positive()});p.strictObject({frameId:p.string(),before:ea,after:ea});const ta=m.array(m.object({code:m.string().check(m.minLength(1),m.maxLength(160)),message:m.string().check(m.minLength(1),m.maxLength(500))})).check(m.maxLength(32));m.object({issues:m.optional(ta),prototype:m.optional(m.object({prototypeId:m.uuid(),deploymentId:m.uuid()}))});const na={unreadable:`its saved capture could not be read`,notACapture:`it is not an Enhance capture`,pictureMismatch:`its picture does not match the size of its page`,nothingArrived:`none of its files arrived`,notSaved:`it could not be saved on this machine`,noPicture:`it could not be compiled and has no picture`,anotherSource:`it was captured for another source`,outsideShards:`its test ran outside this run's shards`},ra=(e,t)=>e<t?-1:e===t?0:1,ia=(e,t)=>{let n=Object.keys(e).toSorted(ra);t.output.push(`{`),t.pending.push({text:`}`});for(let r=n.length-1;r>=0;r--){let i=n[r];i!==void 0&&(t.pending.push({value:Reflect.get(e,i)},{text:`${JSON.stringify(i)}:`}),r>0&&t.pending.push({text:`,`}))}},aa=(e,t)=>{if(e===null||typeof e==`boolean`||typeof e==`string`||typeof e==`number`&&Number.isFinite(e))return t.output.push(JSON.stringify(e)),!0;if(typeof e!=`object`||t.active.has(e)||!Array.isArray(e)&&Object.getPrototypeOf(e)!==Object.prototype)return!1;if(t.active.add(e),t.pending.push({leave:e}),Array.isArray(e)){t.output.push(`[`),t.pending.push({text:`]`});for(let n=e.length-1;n>=0;n--)t.pending.push({value:e[n]}),n>0&&t.pending.push({text:`,`})}else ia(e,t);return!0},oa=e=>{let t={pending:[{value:e}],active:new Set,output:[]};for(;t.pending.length>0;){let e=t.pending.pop();if(e===void 0)break;if(`text`in e)t.output.push(e.text);else if(`leave`in e)t.active.delete(e.leave);else if(!aa(e.value,t))return null}return t.output.join(``)},sa=e=>{let t=2166136261;for(let n of e)t^=n.codePointAt(0)??0,t=Math.imul(t,16777619)>>>0;return t.toString(16).padStart(8,`0`)},ca=e=>{let t=e.trim();return t.length<=160?t:`${t.slice(0,151).trimEnd()} ${sa(t)}`},la=e=>JSON.stringify([e.source,e.journey,e.step,e.variant]),ua=(e,t)=>e<t?-1:e===t?0:1,da=e=>{let t=new Set,n=[];for(let r of e)for(let e of[r.source.blob,r.preview.blob,...r.assets.map(e=>e.blob)])t.has(e.sha256)||(t.add(e.sha256),n.push(e));return n.toSorted((e,t)=>ua(e.sha256,t.sha256))},fa=`node`,pa=e=>`testId`in e&&e.testId!==fa?e.testId:void 0,y=e=>`testId`in e&&e.testId!==fa?JSON.stringify([e.participant,e.project,e.testId]):JSON.stringify([e.participant,`script`]),ma=(e,t)=>{let n=pa(e);return e.captures.map(e=>({key:e.key,...n!==void 0&&{testId:n},message:t}))},ha=(e,t)=>{let n=new Set(e.run.participants),r=new Set,i=new Map;for(let a of e.attempts){let e=JSON.stringify([y(a),a.retry]);if(!n.has(a.participant)){t.push(...ma(a,na.outsideShards));continue}if(r.has(e)||(r.add(e),a.captures.length===0))continue;let o=i.get(y(a));(o===void 0||o.retry<a.retry)&&i.set(y(a),a)}return e.attempts.filter(e=>i.get(y(e))===e)},ga=e=>JSON.stringify([e.key.journey,e.key.variant]),_a=(...e)=>e.find(e=>e!==0)??0,va=(e,t)=>_a(ua(e.artifact.key.journey,t.artifact.key.journey),ua(e.artifact.key.variant,t.artifact.key.variant),e.artifact.order-t.artifact.order,ua(e.attempt.location?.file??``,t.attempt.location?.file??``),(e.attempt.location?.line??0)-(t.attempt.location?.line??0),ua(y(e.attempt),y(t.attempt)),e.index-t.index),ya=e=>{let t=Map.groupBy(e,e=>la(e.artifact.key)),n=new Map;for(let e of t.values()){let t=Map.groupBy(e,e=>y(e.attempt));for(let e of t.values())for(let[r,i]of e.entries()){let e=t.size>1?` · ${i.attempt.title??pa(i.attempt)??`script`}`:``,a=r>0?` (${String(r+1)})`:``;n.set(i,`${e}${a}`)}}return n},ba=e=>{let t=ya(e),n=new Map(da(e.map(e=>e.artifact)).map(e=>[e.sha256,e])),r=e=>n.get(e.sha256)??e,i=new Map,a=new Map;return e.map(e=>{let{artifact:n}=e,o=ga(n);i.has(o)||i.set(o,n.page);let s=a.get(o)??0;a.set(o,s+1);let c=t.get(e)??``,l=i.get(o),u={...n};return delete u.page,{...u,...l!==void 0&&{page:l},key:{...n.key,step:ca(`${n.key.step}${c}`)},label:ca(`${n.label}${c}`),order:s,source:{...n.source,blob:r(n.source.blob)},preview:{...n.preview,blob:r(n.preview.blob)},assets:n.assets.map(e=>({...e,blob:r(e.blob)}))}})},xa=e=>{let t=qi.safeParse(e);if(!t.success)return{refusal:`Invalid capture manifest.`,leftOut:[]};let n=t.data,r=[...n.leftOut??[]],i=ha(n,r).flatMap(e=>e.captures.map((t,n)=>({artifact:t,attempt:e,index:n}))).filter(e=>{if(e.artifact.key.source===n.run.source)return!0;let t=pa(e.attempt);return r.push({key:e.artifact.key,...t!==void 0&&{testId:t},message:na.anotherSource}),!1}).toSorted(va);return i.length===0?{refusal:`A run must contain at least one capture.`,leftOut:r}:{captures:ba(i),leftOut:r}},Sa=(e,t)=>oa({...e,expiresAt:``})===oa({...t,expiresAt:``}),Ca=e=>{let t=oa(e);return t===null?null:`enhance-capture-run:v1\0${t}`},wa=(e,t)=>_a(ua(y(e),y(t)),e.retry-t.retry),Ta=e=>{let t=e[0];if(t===void 0)return`At least one participant manifest is required.`;let n=new Map,r=[],i=[];for(let a of e){if(!Sa(a.run,t.run)||a.ordering!==t.ordering)return`Participant manifests must belong to the same reserved run and ordering.`;if(!a.participants.some(e=>n.has(e.id))){for(let e of a.participants)n.set(e.id,e);i.push(...a.leftOut??[]);for(let e of a.attempts)a.participants.some(t=>t.id===e.participant)?r.push(e):i.push(...ma(e,na.outsideShards))}}let a={...t};return delete a.leftOut,{...a,participants:Array.from(n,([,e])=>e).toSorted((e,t)=>ua(e.id,t.id)),attempts:r.toSorted(wa),...i.length>0&&{leftOut:i}}},Ea=[`journey`,`step`,`variant`],Da=[`label`,`journeyLabel`],Oa=e=>typeof e==`string`?ca(e):e,ka=e=>{if(typeof e!=`object`||!e||Array.isArray(e))return e;let t={...e};for(let e of Da)t[e]=Oa(t[e]);let n=t.key;if(typeof n==`object`&&n&&!Array.isArray(n)){let e={...n};for(let t of Ea)e[t]=Oa(e[t]);t.key=e}return t},Aa=e=>e.length>0&&e.every(e=>e.path.length===1&&e.path[0]===`preview`),ja=(e,t,n)=>{let r=typeof e==`object`&&e?Ni.safeParse(Reflect.get(e,`key`)):null;return{...r?.success===!0&&{key:r.data},...t!==void 0&&{testId:t},message:Aa(n)?na.pictureMismatch:na.notACapture}},Ma={captures:p.array(p.unknown())},Na=qi.extend({attempts:p.array(p.union([Ui.extend(Ma),Wi.extend(Ma)]))}).transform(e=>{let t=[...e.leftOut??[]],n=e.attempts.map(e=>({...e,captures:e.captures.flatMap(n=>{let r=ka(n),i=Bi.safeParse(r);return i.success?[i.data]:(t.push(ja(r,`testId`in e?e.testId:void 0,i.error.issues)),[])})}));return{...e,attempts:n,...t.length>0&&{leftOut:t}}});p.strictObject({manifest:Na}),p.strictObject({canvasId:p.uuid()}).extend({verdict:zi});const Pa=p.strictObject({canvasId:p.uuid(),name:p.string().min(1)}),Fa=p.strictObject({runId:p.uuid(),revision:p.string(),version:p.number().int().positive()}),Ia=Pa.extend({expectedVersion:p.number().int().nonnegative(),revision:p.string().min(1)}),La=p.strictObject({current:Qi,latest:Vi,related:p.array(p.strictObject({run:Vi,verdict:zi})),changes:p.array(p.strictObject({key:Ni,frameId:p.string(),label:p.string(),journeyLabel:p.string(),page:p.string().optional(),change:p.enum([`new`,`changed`,`unchanged`,`uncompared`])}))}),b=(e,t,n,r)=>Object.assign(Error(t),{code:e,...n!==void 0&&{runId:n},...r}),Ra=e=>e instanceof Error&&typeof Reflect.get(e,`code`)==`string`,za=e=>Dt(`sha256`).update(e).digest(`hex`),Ba=async e=>{let t=Dt(`sha256`);return await It(_t(e),async e=>{for await(let n of e)t.update(n)}),t.digest(`hex`)},Va=e=>{let t=Ca(e);if(t===null)throw Error(`A capture manifest must contain only finite JSON values.`);return Dt(`sha256`).update(t).digest(`hex`)},Ha=Lt(`enhance.capture.resources`),Ua=(e,t)=>{if(!/^[a-f0-9]{64}$/u.test(t))throw b(`artifact`,`Invalid capture blob digest.`);return h.join(h.resolve(e),`blobs`,t)},Wa=async(e,t)=>{for(let n of e)try{let e=Ua(n,t.sha256),r=await Pt(e);if(r.isFile()&&r.size===t.bytes&&await Ba(e)===t.sha256)return e}catch(e){Ha.publish({stage:`local-read`,sha256:t.sha256,error:e})}return null},Ga=e=>e instanceof Error&&Reflect.get(e,`code`)===`EEXIST`,Ka=async(e,t)=>{try{await kt(e,t)}catch(e){if(!Ga(e)||!(await Pt(t)).isFile())throw e}finally{await Nt(e,{force:!0})}},qa=async(e,t,n)=>{try{if(t.bytes!==n.byteLength||za(n)!==t.sha256)throw b(`artifact`,`Capture blob bytes do not match their descriptor.`);await At(h.join(e,`blobs`),{recursive:!0});let r=Ua(e,t.sha256),i=`${r}.${globalThis.crypto.randomUUID()}.tmp`;return await Ft(i,n,{flag:`wx`,mode:384}),await Ka(i,r),!0}catch(e){return Ha.publish({stage:`local-write`,sha256:t.sha256,error:e}),!1}},Ja=async(e,t)=>{let n=Bi.parse(t);if(await Wa([e],n.source.blob)===null&&await Wa([e],n.preview.blob)===null)throw b(`artifact`,`Neither the snapshot nor the preview of a capture is on disk.`);return n},Ya=async(e,t)=>{let n=`${e}.${globalThis.crypto.randomUUID()}.tmp`;await Ft(n,JSON.stringify(t),{mode:384}),await Mt(n,e)},Xa=async e=>{let t=JSON.parse(await jt(e,`utf8`));return Na.parse(t)},x={unversioned:void 0,v1:1,v2:2,v3:3,v4:4,v5:5,v6:6,v7:7,v8:8,v9:9,v10:10,v11:11,v12:12,v13:13,v14:14},Za={[x.v1]:`layout`,[x.v2]:`layout`,[x.v3]:`typography`,[x.v4]:`typography`,[x.v5]:`typography`,[x.v6]:`geometry`,[x.v7]:`geometry`,[x.v8]:`geometry`,[x.v9]:`geometry`,[x.v10]:`geometry`,[x.v11]:`css`,[x.v12]:`text-shadow-blend`,[x.v13]:`format-number`,[x.v14]:`format-number`},Qa=[`appearance-unsupported-component`,`styles-unsupported-component`,`text-shadow-blend-unsupported`,`recording-aspect-not-preserved`],S=e=>typeof e==`object`&&!!e&&!Array.isArray(e),$a=e=>Array.isArray(e)?e:void 0,C=(e,...t)=>Object.fromEntries(Object.entries(e).filter(([e])=>!t.includes(e))),eo=e=>`${e}~mask`,to={alpha:`alpha`,luminance:`luminance`,vector:`outline`},no=e=>{if(!S(e)||!S(e.compositing))return;let t=e.compositing.mask;return typeof t==`string`?to[t]:void 0},ro=e=>S(e)?C(e,`blendMode`,`blendSource`):e,io=e=>S(e)&&`paint`in e?{...C(e,`paint`,`alignment`),paints:[e.paint]}:e,ao=e=>{if(!S(e)||!S(e.progression))return e;let t=e.progression.startValue,n=e.value;return{...C(e,`progression`),value:typeof t==`number`&&typeof n==`number`?Math.max(t,n):n}},oo=e=>S(e)&&e.kind===`image`?C(e,`adjustments`):e,so=e=>$a(e)?.filter(e=>!S(e)||e.kind!==`inner`).map(e=>S(e)?{...e,spread:0}:e)??e,co=e=>{if(!S(e))return e;let t={...e,paint:ro(e.paint)};return e.alignment===`inside`?{...t,alignment:`center`}:t},lo=e=>{if(!S(e)||e.kind!==`span`)return e;let t=C(e,`decorationBlendMode`),n=$a(e.fills);n!==void 0&&(t.fills=n.map(e=>ro(e))),S(e.stroke)&&(t.stroke=co(e.stroke));let r=$a(e.children);return r!==void 0&&(t.children=r.map(e=>lo(e))),t},uo=(e,t)=>{let n=$a(t.fills);if(n===void 0)return;let[r]=n,i=S(r)?r.blendMode:void 0;typeof i==`string`&&n.length===1&&(e.blendMode??`normal`)===`normal`&&(t.blendMode=i),t.fills=n.map(e=>ro(e))},fo=(e,t)=>{let n={...e};`border`in e&&(n.border=io(e.border)),`outline`in e&&(n.outline=io(e.outline));let r=$a(e.fills);r!==void 0&&(n.fills=r.map(e=>oo(e)));let i=$a(e.filters);return i!==void 0&&(n.filters=i.map(e=>ao(e))),t?(`shadows`in e&&(n.shadows=so(e.shadows)),uo(e,n),n):n},po=e=>{let t=e.props;if(!S(t)||!S(t.paintFallback))return{...e};let n=t.paintFallback.mask;if(n===void 0)return{...e};let r=C(t.paintFallback,`mask`),i=Object.keys(r).length===0?C(t,`paintFallback`):{...t,paintFallback:r},a=e.styles,o=C(e,`props`);return S(n)&&S(a)&&(o.styles=Object.fromEntries(Object.entries(a).filter(([e,t])=>n[e]!==t))),Object.keys(i).length>0&&(o.props=i),o},mo=e=>{let t=e.compositing;return S(t)?t.groupMode===void 0?t.paintSemantics===`web`&&(e.component===`frame`||e.component===`group`):t.groupMode===`isolated`:!1},ho=e=>{let t={...e};return`stroke`in e&&(t.stroke=co(e.stroke)),S(e.decoration)&&(t.decoration=C(e.decoration,`blendMode`)),t},go=e=>{if(!S(e))return e;let t=C(po(e),`compositing`);mo(e)&&S(t.styles)&&(t.styles={...t.styles,isolation:`isolate`});let n=e.component===`text`;if(S(e.appearance)&&(t.appearance=fo(e.appearance,n)),!n)return t;S(e.typography)&&(t.typography=ho(e.typography));let r=t.props,i=S(r)?$a(r.richText):void 0;return i!==void 0&&S(r)&&(t.props={...r,richText:i.map(e=>lo(e))}),t},_o=e=>S(e)&&typeof e.sortKey==`string`?e.sortKey:``,vo=e=>{let t=new Map;for(let[n,r]of Object.entries(e)){if(!S(r)||typeof r.parentId!=`string`)continue;let e=t.get(r.parentId);e===void 0?t.set(r.parentId,[n]):e.push(n)}let n=t=>_o(e[t]),r=(e,t)=>n(e)<n(t)?-1:Number(n(e)>n(t));for(let e of t.values())e.sort(r);return t},yo=(e,t,n)=>({id:e,label:`Mask`,labelOrigin:`generated`,component:`group`,styles:{},geometry:{kind:`mask`,maskId:t,mode:n}}),bo=(e,t,n,r)=>{let i=``;for(let a of t){let t=no(e[a]);t!==void 0&&(i=eo(a),n[i]=yo(i,a,t),r[i]=r[a]);let o=r[a];i!==``&&S(o)&&(r[a]={...o,parentId:i})}},xo=(e,t,n)=>{for(let[r,i]of vo(n)){let a=i.filter(t=>no(e[t])!==void 0),[o]=i,s=t[r],c=no(e[o]);c!==void 0&&a.length===1&&S(s)&&s.component===`group`&&s.geometry===void 0?t[r]={...s,geometry:{kind:`mask`,maskId:o,mode:c}}:bo(e,i,t,n)}},So=e=>{let t=e.nodes;if(!S(t))return e;let n=Object.fromEntries(Object.entries(t).map(([e,t])=>[e,go(t)]));if(!S(e.relationships))return{...e,nodes:n};let r={...e.relationships};return xo(t,n,r),{...e,nodes:n,relationships:r}},Co=e=>typeof e==`object`&&!!e&&!Array.isArray(e),wo=e=>Array.isArray(e),To=e=>{if(!Co(e))return e;let t={...e};return Reflect.deleteProperty(t,`blendMode`),Reflect.deleteProperty(t,`blendSource`),t},Eo=e=>{if(!Co(e)||e.component!==`text`||!Co(e.appearance))return e;let t=e.appearance.shadows;return wo(t)?{...e,appearance:{...e.appearance,shadows:t.map(e=>To(e))}}:e},Do=e=>{let t=e.nodes;return Co(t)?{...e,nodes:Object.fromEntries(Object.entries(t).map(([e,t])=>[e,Eo(t)]))}:e},Oo=new Set([...Object.values(x),15]),ko=e=>Oo.has(e),Ao=new Set([`format-number`,`text-shadow-blend`,`css`,`geometry`]),jo=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Mo=e=>{if(!jo(e))return e;let t=Object.fromEntries(Object.entries(e).filter(([e])=>e!==`gridTrack`)),n=t.container;jo(n)&&(t.container=Object.fromEntries(Object.entries(n).filter(([e])=>e!==`materialized`)));for(let e of[`horizontal`,`vertical`]){let n=t[e];jo(n)&&n.mode===`hug`&&(t[e]=Object.fromEntries(Object.entries(n).filter(([e])=>e!==`basis`)))}return t},No=e=>{let t=e.version;if(!ko(t))return null;if(t===15||!jo(e.nodes))return e;let n=Object.entries(Za).find(([e])=>Number(e)===t)?.[1];return Ao.has(n)?{...e,version:15}:Object.values(e.nodes).some(e=>jo(e)&&e.geometry!==void 0)?null:n===`typography`?{...e,version:15}:{...e,version:15,nodes:Object.fromEntries(Object.entries(e.nodes).map(([e,t])=>[e,jo(t)&&t.layout!==void 0?{...t,layout:Mo(t.layout)}:t]))}},Po=e=>{let t=No(e);return t===null||t===e||e.version===x.v13||e.version===x.v14?t:Do(e.version===x.v12?t:So(t))};p.strictObject({}),p.object({firstAgentWorkAt:p.iso.datetime().nullable()});const Fo=p.object({cursor:p.string().nullable().default(null),limit:p.number().int().min(1).max(100).default(20)}),w=e=>p.object({items:p.array(e),truncated:p.boolean()}),Io=2048,Lo=p.enum([`never-captured`,`capture-pending`,`extension-unavailable`,`capture-failed`,`source-mismatch`,`upload-incomplete`,`blob-missing`,`image-load-failed`,`unsupported-legacy-state`]),Ro=p.object({background:p.string().optional(),documentVersion:p.number().int().positive().optional(),thumbnailId:p.uuid(),url:p.string(),width:p.literal(528),height:p.literal(312),bytes:p.number().int().min(1).max(1048576)});p.object({canvasId:p.uuid(),thumbnailId:p.uuid(),clientReleaseIdentity:p.string().min(1).max(100),attemptedOperation:p.literal(`thumbnail-download`),recoveryOutcome:p.literal(`fallback-shown`)}),p.object({recorded:p.literal(!0)});const zo=p.enum([`invite-only`,`link-view`,`link-comment`,`link-edit`]),Bo=p.enum([`owner`,`can-edit`,`can-comment`,`can-view`]),Vo=p.enum([`can-edit`,`can-comment`,`can-view`]),Ho=p.object({read:p.boolean(),comment:p.enum([`yes`,`sign-in`,`no`]),edit:p.enum([`yes`,`sign-in`,`no`]).default(`no`),grants:p.array(p.object({source:p.enum([`direct`,`team`,`link`]),accessLevel:Bo})).default([]),grantableAccessLevels:p.array(Vo).default([]),share:p.boolean(),manage:p.boolean(),readHistory:p.boolean().default(!1)}),Uo=p.object({id:p.uuid(),title:p.string().min(1),accessState:zo,organisationId:p.uuid().nullable(),sourceUrl:p.string().nullable(),unresolvedCount:p.number().int().min(0),viewerCan:Ho,createdAt:p.iso.datetime(),lastActivityAt:p.iso.datetime()});p.object({title:p.string().trim().min(1),organisationId:p.uuid().nullable().default(null),sourceUrl:p.string().nullable().default(null)}),Uo.extend({version:p.number().int().positive()}),p.object({canvasId:p.uuid()});const Wo=p.union([p.literal(`own`),p.literal(`everything`),p.uuid()]);p.object({collection:Wo.default(`own`),title:p.string().trim().min(1).optional().describe(`Title text to match before returning canvas ids.`),deleted:p.boolean().default(!1),accessState:zo.optional(),scope:p.enum([`all`,`mine`,`shared`]).default(`all`),hasUnresolved:p.boolean().default(!1)});const Go=Uo.extend({screenCount:p.number().int().min(0),hasRecording:p.boolean(),lastViewedAt:p.iso.datetime().nullable()});w(p.union([Go.extend({thumbnail:Ro}),Go.extend({thumbnail:p.null(),thumbnailFallbackReason:Lo})])),p.object({canvasId:p.uuid(),title:p.string().trim().min(1)}),p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),deletedAt:p.iso.datetime()}),p.object({canvasId:p.uuid(),organisationId:p.union([p.uuid(),p.literal(`personal`)])}),p.object({canvas:Uo}),p.object({canvasId:p.uuid(),organisationId:p.union([p.uuid(),p.literal(`personal`)]),title:p.string().trim().min(1).optional()}),p.object({canvas:Uo}),p.object({canvasId:p.uuid(),sourceCanvasId:p.uuid().optional(),organisationId:p.union([p.uuid(),p.literal(`personal`)]),title:p.string().trim().min(1),document:p.record(p.string(),p.unknown()),screenIds:p.array(p.uuid())}),p.object({canvas:Uo,document:p.record(p.string(),p.unknown())}),p.object({canvasId:p.uuid(),confirmation:p.string().min(1)}),p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),accessState:zo}),p.object({canvas:Uo,widened:p.boolean()}),p.object({canvasId:p.uuid()}),p.object({lastViewedAt:p.iso.datetime().nullable()}),p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid()});const Ko=/javascript|vbscript|data\s*:\s*text\/html|expression\s*\(|@import/iu,qo=p.string().refine(e=>!Ko.test(e),`unsafe CSS value`),T=p.number(),E=p.number().nonnegative(),D=T,Jo=E,O=p.number().min(0).max(1),k=p.string().min(1),Yo=p.object({space:p.enum([`srgb`,`display-p3`]),red:O,green:O,blue:O,alpha:O,definitionId:k.optional()}),Xo=p.object({id:k,position:O,color:Yo}),Zo=p.object({id:k,visible:p.boolean()}),Qo=Zo.extend({kind:p.literal(`blur`),value:Jo,parameter:p.enum([`radius`,`standard-deviation`]).optional()}),$o=[Zo.extend({kind:p.literal(`brightness`),value:Jo}),Zo.extend({kind:p.literal(`contrast`),value:Jo}),Zo.extend({kind:p.literal(`grayscale`),value:O}),Zo.extend({kind:p.literal(`hue-rotate`),value:D}),Zo.extend({kind:p.literal(`invert`),value:O}),Zo.extend({kind:p.literal(`saturate`),value:Jo}),Zo.extend({kind:p.literal(`sepia`),value:O})],es=p.discriminatedUnion(`kind`,[Qo,...$o]),ts=p.discriminatedUnion(`kind`,[Qo.extend({progression:p.object({startValue:Jo,start:p.object({x:D,y:D}),end:p.object({x:D,y:D})}).optional()}),...$o]),ns=p.tuple([D,D,D,D,D,D]).refine(([e,t,n,r])=>e*r!==t*n,`paint transform must be invertible`),rs=p.enum([`normal`,`multiply`,`screen`,`overlay`,`darken`,`lighten`,`plus-lighter`,`color-dodge`,`color-burn`,`hard-light`,`soft-light`,`difference`,`exclusion`,`hue`,`saturation`,`color`,`luminosity`]),is=p.object({kind:p.literal(`figma`),originalMode:p.string(),mappedMode:rs,sourceGuid:p.string().optional(),path:p.array(p.string())}),as=p.object({id:k,blendMode:rs.optional(),blendSource:is.optional(),visible:p.boolean(),opacity:O}),os=p.discriminatedUnion(`kind`,[as.extend({kind:p.literal(`solid`),color:Yo}),as.extend({kind:p.literal(`linear-gradient`),angle:D,transform:ns.optional(),stops:p.array(Xo).min(2)}),as.extend({kind:p.literal(`radial-gradient`),center:p.object({x:D,y:D}),radius:p.object({x:Jo,y:Jo}),transform:ns.optional(),stops:p.array(Xo).min(2)}),as.extend({kind:p.literal(`angular-gradient`),transform:ns,stops:p.array(Xo).min(2)}),as.extend({kind:p.literal(`diamond-gradient`),transform:ns,stops:p.array(Xo).min(2)}),as.extend({kind:p.literal(`image`),assetId:p.string().min(1),fit:p.enum([`fill`,`cover`,`fit`,`crop`,`tile`]),tileScale:D.positive().optional(),tileOrigin:p.enum([`center`,`top-left`]).optional(),rotation:p.union([p.literal(0),p.literal(90),p.literal(180),p.literal(270)]).optional(),crop:p.object({x:O,y:O,width:O,height:O}).optional(),transform:ns.optional(),filters:p.array(es).optional(),naturalSize:p.object({width:D.positive(),height:D.positive()}).optional()}).refine(e=>e.crop===void 0||e.transform===void 0,{message:`image paint cannot have both a crop rectangle and an affine transform`,path:[`transform`]})]),ss=p.intersection(os,p.object({alternatives:p.partialRecord(p.enum([`solid`,`linear-gradient`,`radial-gradient`,`angular-gradient`,`diamond-gradient`,`image`]),os).optional(),recentGradient:p.enum([`linear-gradient`,`radial-gradient`,`angular-gradient`,`diamond-gradient`]).optional()})),cs=p.object({id:k,name:p.string().trim().min(1),value:p.union([Yo.omit({definitionId:!0}),p.object({definitionId:k})]),source:p.object({kind:p.literal(`figma`),key:k,modeId:k.optional()}).optional()}),ls=p.object({op:p.literal(`setArtworkColor`),nodeId:p.literal(`root`),colorId:p.string().min(1),definition:cs.nullable()}).refine(e=>e.definition===null||e.definition.id===e.colorId,`colour identity must match`),us=p.object({ratio:E,offset:T.optional()}),ds=p.object({min:E.optional(),max:E.optional(),minParent:us.optional(),maxParent:us.optional()}).refine(({min:e,max:t})=>e===void 0||t===void 0||e<=t,`size minimum cannot exceed maximum`),fs=p.discriminatedUnion(`mode`,[p.object({mode:p.literal(`fixed`),value:E}).strict(),ds.extend({mode:p.literal(`hug`),implicitExtent:E.optional()}).strict(),ds.extend({mode:p.literal(`fill`),offset:T.optional()}).strict()]),ps=p.object({top:E,right:E,bottom:E,left:E}),ms=p.union([p.literal(`auto`),T]),hs=p.object({top:ms,right:ms,bottom:ms,left:ms}),gs=p.object({mode:p.enum([`auto-fill`,`auto-fit`]),minimum:p.number().positive()}),_s=p.object({x:T,y:T}),vs=p.object({direction:p.enum([`row`,`column`]),alignItems:p.enum([`start`,`center`,`end`,`stretch`]),alignContent:p.enum([`start`,`center`,`end`,`stretch`,`space-between`,`space-around`,`space-evenly`]).optional(),justifyContent:p.enum([`start`,`center`,`end`,`space-between`,`space-around`,`space-evenly`]),gap:T,rowGap:T.optional(),columnGap:T.optional(),crossGapMode:p.literal(`auto`).optional(),wrap:p.enum([`nowrap`,`wrap`]).optional(),gridColumns:p.number().int().positive().optional(),gridAutoRepeat:gs.optional(),padding:ps}).strict(),ys=p.object({button:p.literal(!0).optional(),overflowClip:p.literal(!0).optional(),lineAboveBorderBottom:T.optional()}).strict(),bs=p.object({top:E.optional(),right:E.optional(),bottom:E.optional(),left:E.optional()}).strict(),xs=p.object({ratio:T,offset:T.optional()}).strict(),Ss=p.object({x:xs.optional(),y:xs.optional()}).strict(),Cs=p.object({rotation:T.optional(),flipHorizontal:p.boolean().optional(),flipVertical:p.boolean().optional(),aspectRatioLocked:p.boolean().optional(),aspectRatio:p.number().positive().optional(),horizontal:fs.optional(),vertical:fs.optional(),position:p.enum([`flow`,`absolute`]).optional(),retainedIgnore:p.literal(!0).optional(),gridParticipation:p.literal(`unassigned`).optional(),gridEmptyPlacement:p.literal(`manual`).optional(),gridAutoTrackPolicy:p.object({rows:p.literal(`extend-last`).optional(),columns:p.literal(`extend-last`).optional()}).strict().optional(),retainedFlexSpacing:p.object({gap:p.union([T,qo.min(1)]),counterGap:p.union([T,qo.min(1)]),crossGapMode:p.literal(`auto`).optional()}).strict().optional(),alignSelf:p.enum([`auto`,`start`,`center`,`end`,`stretch`]).optional(),flexGrow:E.optional(),flexShrink:E.optional(),flexBasis:p.union([p.literal(`auto`),E,us]).optional(),flowOffset:_s.optional(),positionParent:Ss.optional(),order:T.int().optional(),margin:hs.partial().optional(),clipContent:p.boolean().optional(),baselineSource:ys.optional(),scrollbarGutter:bs.optional(),container:vs.partial().extend({padding:ps.partial().optional()}).optional()}).strict(),ws=T,A=E,Ts=p.number().min(0).max(1),Es=p.string().min(1),Ds=p.object({topLeft:A,topRight:A,bottomRight:A,bottomLeft:A,smoothing:Ts.optional()}),Os=p.array(A).min(1),ks=p.enum([`none`,`round`,`square`]),As=p.object({visible:p.boolean(),layoutInclusion:p.enum([`always`,`visible`,`none`]).optional(),width:p.object({top:A,right:A,bottom:A,left:A}),style:p.enum([`solid`,`dashed`,`dotted`]),paints:p.array(ss),dashPattern:Os.optional(),dashCap:ks.optional(),dashOrigin:p.literal(`css`).optional(),alignment:p.enum([`inside`,`center`,`outside`]).optional()}),js=As.pick({width:!0,style:!0,layoutInclusion:!0}),Ms=p.object({visible:p.boolean(),width:A,offset:ws,style:p.enum([`solid`,`dashed`,`dotted`]),paints:p.array(ss),dashPattern:Os.optional(),dashCap:ks.optional()}),Ns=p.object({id:Es,visible:p.boolean(),kind:p.enum([`outer`,`inner`]),color:Yo,offsetX:ws,offsetY:ws,blur:A,spread:ws,blendMode:rs.optional(),blendSource:is.optional(),isShownBehindNode:p.boolean().optional()}),Ps=p.object({opacity:Ts,blendMode:rs,fills:p.array(ss),border:As,retainedBorder:js.optional(),outline:Ms,radius:Ds,shadows:p.array(Ns),filters:p.array(es),backdropFilters:p.array(ts)}),Fs=Ps.partial().refine(e=>Object.keys(e).length>0,`appearance values cannot be empty`),Is=[`opacity`,`blendMode`,`fills`,`border`,`retainedBorder`,`outline`,`radius`,`shadows`,`filters`,`backdropFilters`],Ls=p.enum(Is),Rs=Ps.partial().extend({clear:p.array(Ls).min(1).max(Is.length).optional()}).refine(e=>Object.keys(e).length>0,`appearance patch cannot be empty`).refine(({clear:e,...t})=>e===void 0||e.every(e=>t[e]===void 0),`appearance patch cannot set and clear the same property`),j=p.number(),M=p.number().nonnegative(),zs=p.string().regex(/^[\u{20}-\u{7E}]{4}$/u),Bs=zs.refine(e=>![`wght`,`opsz`].includes(e)),N=p.object({family:p.string().min(1),fallbackFamilies:p.array(p.string().min(1)),size:M,weight:p.number().min(1).max(1e3),variations:p.record(Bs,j).optional(),features:p.record(zs,p.number().int().nonnegative().max(65535)).optional(),opticalSize:p.discriminatedUnion(`mode`,[p.object({mode:p.literal(`auto`)}),p.object({mode:p.literal(`font-default`)}),p.object({mode:p.literal(`fixed`),value:j})]).optional(),style:p.enum([`normal`,`italic`,`oblique`]),lineHeight:p.discriminatedUnion(`mode`,[p.object({mode:p.literal(`normal`)}),p.object({mode:p.literal(`fixed`),value:M}),p.object({mode:p.literal(`percent`),value:M})]),letterSpacing:p.union([j,p.object({mode:p.literal(`percent`),value:j})]),align:p.enum([`left`,`center`,`right`,`justify`]),direction:p.enum([`auto`,`ltr`,`rtl`]).optional(),verticalAlign:p.enum([`top`,`middle`,`bottom`]),verticalTrim:p.enum([`none`,`cap-height`]).optional(),transform:p.enum([`none`,`uppercase`,`lowercase`,`capitalize`]),decoration:p.object({line:p.enum([`none`,`underline`,`line-through`]),style:p.enum([`solid`,`double`,`dotted`,`dashed`,`wavy`]),color:Yo.optional(),blendMode:rs.optional(),thickness:p.union([M,p.object({mode:p.literal(`percent`),value:M}),p.object({mode:p.literal(`font-default`)})]).optional(),offset:p.union([j,p.object({mode:p.literal(`percent`),value:j})]).optional(),skipInk:p.enum([`auto`,`none`,`all`]).optional()}),stroke:p.object({width:M,paint:ss,alignment:p.enum([`center`,`outside`]).optional()}).optional(),wrapping:p.enum([`wrap`,`nowrap`,`pre`,`pre-line`,`pre-wrap`,`break-spaces`]),wrapStyle:p.enum([`auto`,`pretty`,`balance`]).optional(),paragraphSpacing:M.optional(),paragraphIndent:M.optional(),listStyle:p.enum([`none`,`bulleted`,`numbered`]).optional(),listSpacing:M.optional(),hangingList:p.boolean().optional(),hangingPunctuation:p.boolean().optional(),truncation:p.object({mode:p.enum([`none`,`ellipsis`]),maxLines:p.number().int().min(1).nullable()}).optional(),insets:p.object({top:j,right:j,bottom:j,left:j}).optional()}),Vs=N.pick({align:!0,direction:!0,wrapStyle:!0,paragraphSpacing:!0,paragraphIndent:!0,listStyle:!0,listSpacing:!0,hangingList:!0}).partial().extend({listLevel:p.number().int().min(1).optional(),listStart:p.number().int().min(1).optional()}).strict(),Hs=N.partial().strict(),Us=N.keyof().options,Ws=Hs.extend({featureChanges:p.object({set:N.shape.features,clear:p.array(zs).optional(),removeIfEmpty:p.boolean().optional()}).strict().optional(),variationChanges:p.object({set:N.shape.variations,clear:p.array(Bs).optional(),removeIfEmpty:p.boolean().optional()}).strict().optional(),clear:p.array(N.keyof()).max(Us.length).optional()}).refine(e=>e.clear?.every(t=>e[t]===void 0)??!0,`a typography property cannot be set and cleared in the same patch`).refine(e=>[`features`,`variations`].every(t=>{let n=e[t===`features`?`featureChanges`:`variationChanges`];return n===void 0||e[t]===void 0&&e.clear?.includes(t)!==!0&&(n.clear?.every(e=>n.set?.[e]===void 0)??!0)}),`font settings cannot be replaced and patched, or set and cleared, together`),Gs={"font-family":[`family`,`fallbackFamilies`],"font-size":[`size`],"font-weight":[`weight`],"font-variation-settings":[`weight`,`variations`,`opticalSize`],"font-optical-sizing":[`opticalSize`],"font-feature-settings":[`features`],"font-style":[`style`],"line-height":[`lineHeight`],"letter-spacing":[`letterSpacing`],"text-align":[`align`],direction:[`direction`],"unicode-bidi":[`direction`],"text-indent":[`paragraphIndent`],"hanging-punctuation":[`hangingPunctuation`],"align-content":[`verticalAlign`],"text-box":[`verticalTrim`],"text-box-trim":[`verticalTrim`],"text-box-edge":[`verticalTrim`],"text-transform":[`transform`],"text-decoration":[`decoration`],"text-decoration-line":[`decoration`],"text-decoration-style":[`decoration`],"text-decoration-color":[`decoration`],"text-decoration-thickness":[`decoration`],"text-underline-offset":[`decoration`],"text-decoration-skip-ink":[`decoration`],"-webkit-text-stroke":[`stroke`],"-webkit-text-stroke-width":[`stroke`],"-webkit-text-stroke-color":[`stroke`],"--canvas-text-stroke-alignment":[`stroke`],"paint-order":[`stroke`],"white-space":[`wrapping`],"text-wrap-style":[`wrapStyle`],"text-wrap":[`wrapStyle`]},Ks=/^(?:behavior|-moz-binding)$/iu,qs=p.string().min(1).regex(/^(?:--[\w-]+|-(?:webkit|moz|ms|o)-[a-z][a-z\d-]*|[a-z][a-z\d-]*)$/iu).refine(e=>!Ks.test(e),`unsafe CSS property`),P=p.object({id:p.string().min(1),property:qs,value:qo,enabled:p.boolean()}),Js=p.object({declarations:p.array(P)}).refine(({declarations:e})=>new Set(e.map(e=>e.id)).size===e.length,`additional style ids must be unique`),Ys=p.array(P.shape.id).refine(e=>new Set(e).size===e.length,`declaration ids must be unique`),Xs=p.object({set:p.array(P).refine(e=>new Set(e.map(e=>e.id)).size===e.length,`declaration ids must be unique`).optional(),clear:Ys.optional(),order:Ys.optional(),empty:p.enum([`keep`,`remove`]).optional()}).strict().refine(e=>e.set?.every(t=>e.clear?.includes(t.id)!==!0)??!0,`a declaration cannot be set and cleared in the same patch`),Zs=N.pick({family:!0,fallbackFamilies:!0,size:!0,weight:!0,style:!0,variations:!0,opticalSize:!0,features:!0,lineHeight:!0,letterSpacing:!0,transform:!0,decoration:!0,paragraphSpacing:!0,paragraphIndent:!0,listSpacing:!0,hangingList:!0,hangingPunctuation:!0,verticalTrim:!0,wrapStyle:!0}).extend({decoration:N.shape.decoration.omit({blendMode:!0})}).strict(),Qs=Zs.keyof().options,$s=p.object({id:p.string().min(1),name:p.string().trim().min(1),description:p.string().max(2e3),sortKey:p.string().min(1).optional(),sourceStyleId:p.string().min(1).optional(),sourceCanvasId:p.uuid().optional(),sourceRevision:p.number().int().positive().optional(),typography:Zs.extend({listStyle:N.shape.listStyle}).transform(e=>(Reflect.deleteProperty(e,`listStyle`),e))}).strict().refine(e=>e.sourceCanvasId===void 0||e.sourceStyleId!==void 0,{message:`A source canvas belongs to a reference snapshot.`,path:[`sourceCanvasId`]}).refine(e=>e.sourceRevision===void 0||e.sourceCanvasId!==void 0&&e.sourceStyleId!==void 0,{message:`A published revision belongs to a source style and canvas.`,path:[`sourceRevision`]});p.object({id:$s.shape.id,position:p.enum([`normal`,`subscript`,`superscript`]).optional(),overrides:p.partialRecord(p.enum([`fontWeight`,`fontStyle`,`fontVariationSettings`,`fontOpticalSizing`,`textDecorationLine`,`textDecorationStyle`,`textDecorationColor`,`textDecorationThickness`,`textUnderlineOffset`,`textDecorationSkipInk`]),p.union([p.string().max(1e3),p.number()])).optional()}).strict();const ec=ss.array().optional();p.object({fills:ec}),Vs.pick({paragraphSpacing:!0,paragraphIndent:!0,listSpacing:!0,wrapStyle:!0}).extend({hangingPunctuation:N.shape.hangingPunctuation,verticalTrim:N.shape.verticalTrim,stroke:N.shape.stroke.nullable(),decorationBlendMode:N.shape.decoration.shape.blendMode,backgroundBlendMode:rs.optional()}).strip();const F=p.object({url:p.url(),expiresAt:p.iso.datetime(),headers:p.record(p.string(),p.string())}),tc=p.object({url:p.url(),expiresAt:p.iso.datetime(),bytes:p.number().int().min(0)}),nc=`/v1/canvas-assets/`,rc=[`image/avif`,`image/gif`,`image/jpeg`,`image/png`,`image/webp`],ic=p.string().regex(/^image\/[a-z0-9.+-]+$/u);p.object({canvasId:p.uuid(),contentType:p.enum(rc),bytes:p.number().int().positive()}),p.object({assetId:p.uuid(),path:p.string().startsWith(`/v1/canvas-assets/`),upload:F});const ac=(e,t)=>`${nc}${encodeURIComponent(e)}/${encodeURIComponent(t)}`,oc=p.tuple([p.uuid(),p.uuid()]),sc=e=>{if(!e.startsWith(`/v1/canvas-assets/`))return null;let t=oc.safeParse(e.slice(18).split(`/`)).data;return t===void 0?null:{canvasId:t[0],assetId:t[1]}},cc=[`font/ttf`,`font/otf`,`font/woff`,`font/woff2`,`font/collection`],lc=p.object({canvasId:p.uuid(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)});lc.extend({bytes:p.number().int().positive()}).extend({contentType:p.enum(cc)}),p.object({path:p.string().startsWith(`/v1/canvas-assets/`)}).extend({upload:F});const uc=(e,t)=>`${nc}${encodeURIComponent(e)}/fonts/${encodeURIComponent(t)}`;p.object({canvasId:p.uuid(),sources:p.array(lc).min(1)}),p.object({resources:p.array(p.object({source:lc,path:p.string()}))});const dc=1e3,fc=new Set(cc),pc=(e,t)=>e===`image`?ic.safeParse(t).success:fc.has(t),mc=p.strictObject({canvasId:p.uuid(),clientToken:p.uuid()});p.discriminatedUnion(`kind`,[mc.extend({kind:p.literal(`image`),contentType:p.enum(rc),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)}),mc.extend({kind:p.literal(`font`),contentType:p.enum(cc),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)})]);const hc=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`image`),width:p.number().int().positive(),height:p.number().int().positive()}),p.strictObject({kind:p.literal(`font`),family:p.string().min(1),subfamily:p.string(),style:p.enum([`normal`,`italic`,`oblique`]),minimumWeight:p.number().min(1).max(dc),maximumWeight:p.number().min(1).max(dc)}).refine(e=>e.minimumWeight<=e.maximumWeight,`Font weight bounds must be ordered.`)]);p.strictObject({canvasId:p.uuid(),clientToken:p.uuid(),assetId:p.uuid(),kind:p.enum([`image`,`font`]),contentType:p.string(),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u),path:p.string().startsWith(`/v1/canvas-assets/`),state:p.enum([`awaiting_upload`,`ready`]),metadata:hc.nullable()}).refine(e=>e.state===`ready`==(e.metadata!==null),`Readiness must match verified metadata.`).refine(e=>e.metadata===null||e.metadata.kind===e.kind,`Metadata must describe the reserved asset kind.`).refine(e=>pc(e.kind,e.contentType),`Content type must match the asset kind.`).refine(e=>e.path===(e.kind===`image`?ac(e.canvasId,e.assetId):uc(e.canvasId,e.sha256)),`The resource path must match its native identity.`).safeExtend({upload:F.nullable()}).refine(e=>e.state===`awaiting_upload`==(e.upload!==null),`Only pending uploads receive upload access.`);const gc=[`top`,`right`,`bottom`,`left`];gc.map(e=>`padding-${e}`),gc.map(e=>`margin-${e}`);const _c=p.enum([`png`,`jpeg`]),vc=p.number().positive(),yc=p.strictObject({format:_c.optional(),scale:vc.optional()}),bc=p.strictObject({format:_c.nullable().optional(),scale:vc.nullable().optional()}).refine(e=>e.format!==void 0||e.scale!==void 0),xc=p.number(),Sc=xc.nonnegative(),Cc=p.string().min(1).max(200),wc=p.string().regex(/^[MmLlHhVvCcSsQqTtAaZzEe\d\s.,+-]*$/u),Tc=p.strictObject({x:xc,y:xc,width:Sc,height:Sc}),Ec=p.strictObject({kind:p.literal(`path`),path:wc.min(1),fillRule:p.enum([`nonzero`,`evenodd`]),viewBox:Tc.extend({width:Sc.positive(),height:Sc.positive()})}),Dc=p.strictObject({kind:p.literal(`polygon`),count:p.number().int().min(3),innerRatio:p.number().min(0).max(1).optional(),cornerRadius:Sc,cornerSmoothing:p.number().min(0).max(1)}),Oc=p.enum([`union`,`subtract`,`intersect`,`exclude`]),kc=p.strictObject({kind:p.literal(`boolean`),operation:Oc,operandIds:p.array(Cc).min(1).refine(e=>new Set(e).size===e.length),result:p.strictObject({path:wc,fillRule:p.literal(`nonzero`),isEmpty:p.boolean(),bounds:Tc,inputKey:p.string().regex(/^[a-f0-9]{16}$/u)}).refine(e=>e.isEmpty===(e.path===``))}),Ac=p.discriminatedUnion(`kind`,[Ec,Dc,p.strictObject({kind:p.literal(`mask`),maskId:Cc,mode:p.enum([`alpha`,`luminance`,`outline`]).optional()}),kc]),jc=`Update Enhance: compositing is no longer supported. Use the isolation style or a mask group.`,Mc=p.literal(15,{error:`This editor uses an unsupported document format. Update the editor before changing this canvas.`});p.object({signature:p.string().regex(/^[a-f0-9]{16}$/u),image:p.string().refine(e=>e.startsWith(`data:image/jpeg;base64,`)||sc(e)!==null),families:p.array(p.string().min(1)).min(1)});const I=p.object({x:p.number(),y:p.number(),width:p.number().nonnegative(),height:p.number().nonnegative()}),Nc=p.enum([`start`,`center`,`end`,`stretch`,`scale`]),Pc=p.object({x:Nc,y:Nc}),Fc=p.enum([`source`,`generated`,`content`,`user`]),L=p.looseObject({id:p.string().min(1),label:p.string(),component:p.string().min(1),labelOrigin:Fc.optional(),visible:p.boolean().optional(),locked:p.boolean().optional(),constraints:Pc.optional(),styles:p.record(p.string(),p.union([p.string(),p.number()])),layout:Cs.optional(),responsive:p.never().optional(),appearance:Fs.optional(),exportSettings:yc.optional(),typography:Hs.optional(),additionalStyles:Js.optional(),geometry:Ac.optional(),compositing:p.never({error:jc}).optional(),props:p.record(p.string(),p.unknown()).optional(),box:I.optional()}),Ic=p.object({version:p.literal(15),nodes:p.record(p.string(),L),relationships:p.record(p.string(),p.object({parentId:p.string().min(1),sortKey:p.string().min(1)})),tombstones:p.record(p.string(),p.literal(!0)).default({})}),Lc=p.record(p.string(),p.unknown());p.preprocess(e=>{let t=Lc.safeParse(e).data;return t===void 0?e:Object.keys(t).length===0?Rc():Po(t)},Ic);const Rc=()=>({version:15,nodes:{root:{id:`root`,label:`Canvas`,component:`root`,labelOrigin:`generated`,visible:!0,locked:!1,styles:{}}},relationships:{},tombstones:{}}),zc=p.string().min(1),Bc=p.object({code:p.enum([`asset-unavailable`,`content-omitted`,`cross-origin-frame`,`nodes-truncated`,`responsive-behavior-not-editable`,`style-degraded`,`unsupported-surface`]),message:p.string().min(1),temporaryId:zc.optional()}),Vc=p.enum([`text-stroke-inside`,`text-stroke-outside-translucent`,`text-stroke-paints`,`text-inner-shadow`,`text-shadow-spread`,`text-shadow-blend`,`text-background-blur`,`progressive-layer-blur`,`progressive-background-blur`,`blend-plus-darker`,`blend-linear-burn`,`image-exposure`,`image-contrast`,`image-saturation`,`image-temperature`,`image-tint`,`image-highlights`,`image-shadows`,`effect-noise`,`effect-texture`,`effect-glass`]),Hc=p.object({nodeCount:p.number().int().positive(),unsupportedFeatures:p.array(p.object({feature:Vc,count:p.number().int().positive()})).optional(),sourceNodeCount:p.number().int().positive().optional(),collapsedNodeCount:p.number().int().nonnegative().optional(),collapsedWrapperNodeCount:p.number().int().nonnegative().optional(),collapsedNeutralWrapperNodeCount:p.number().int().nonnegative().optional(),collapsedTransferredWrapperNodeCount:p.number().int().nonnegative().optional(),layoutContainerCount:p.number().int().nonnegative().optional(),removedLeafNodeCount:p.number().int().nonnegative().optional(),retainedSemanticOwnerNodeCount:p.number().int().nonnegative().optional(),truncatedNodeCount:p.number().int().nonnegative().optional(),addedLayoutNodeCount:p.number().int().nonnegative().optional(),issues:p.array(Bc)}),Uc=L.omit({id:!0}).extend({temporaryId:zc}),Wc=p.object({temporaryId:zc,parentTemporaryId:zc,sortKey:p.string().min(1)}),Gc=p.object({version:p.literal(1),rootTemporaryId:zc,nodes:p.array(Uc).min(1),relationships:p.array(Wc),report:Hc.catch({nodeCount:0,issues:[]})}).transform(e=>({...e,report:{...e.report,nodeCount:e.nodes.length}}));p.object({canvasId:p.uuid(),documentFormatVersion:Mc,mutationId:p.uuid(),baseVersion:p.number().int().positive(),screenNodeId:p.string().min(1),draft:Gc});const Kc=p.object({canvasId:p.uuid(),mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),rootNodeId:p.string().min(1),idMap:p.record(zc,p.string().min(1)),insertedNodeIds:p.array(p.string().min(1)),removedNodeIds:p.array(p.string().min(1)),boxes:p.record(p.string().min(1),I),affectedBounds:I}),qc=[`queued`,`claimed`,`grant`,`navigate`,`document`,`sources`,`fonts`,`layout`,`target`,`capture`,`serialize`,`compile`,`commit`,`upload`,`complete`],Jc=[`queued`,`running`,`succeeded`,`failed`,`cancelled`,`expired`],Yc=[`VERSION_CHANGED`,`TARGET_NOT_FOUND`,`TARGET_INVALID`,`OUTPUT_TOO_LARGE`,`READINESS_TIMEOUT`,`SOURCE_FAILED`,`BROWSER_CRASH`,`CAPTURE_FAILED`,`CONVERSION_FAILED`,`PREPARATION_FAILED`,`UPLOAD_FAILED`,`WORKER_UNAVAILABLE`,`CANCELLED`,`EXPIRED`,`INTERNAL`],Xc=[`ASSET_UNAVAILABLE`,`FONT_FALLBACK`,`LOCAL_FONT_FALLBACK`,`SOURCE_FALLBACK`,`SCALE_REDUCED`,`LAYOUT_FALLBACK`],Zc=p.number().int().positive(),Qc=p.object({x:p.number(),y:p.number(),width:p.number().positive(),height:p.number().positive()}),$c=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`content`)}),p.object({kind:p.literal(`page`),pageId:p.string().min(1)}),p.object({kind:p.literal(`node`),nodeId:p.string().min(1)}),p.object({kind:p.literal(`bounds`),bounds:Qc})]),el=p.object({kind:p.literal(`recording`),recordingId:p.uuid(),atMs:p.number().int().nonnegative()}),tl=p.object({kind:p.literal(`recording`),recordingId:p.uuid(),requestedAtMs:p.number().int().nonnegative(),settledAtMs:p.number().int().nonnegative()}),nl=p.object({recordingId:p.uuid(),atMs:p.number().int().nonnegative(),screenId:p.uuid(),screenNodeId:p.string().min(1),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()}),box:Qc,version:p.number().int().positive(),alreadyPresent:p.boolean()}),rl=p.object({canvasId:p.uuid(),expectedVersion:p.number().int().positive().optional(),scope:p.strictObject({pageId:p.string().min(1).optional(),nodeIds:p.array(p.string().min(1))}).optional(),target:$c.default({kind:`content`}),sourceState:el.optional(),scale:p.number().positive().default(1),maxOutputPixels:Zc.optional(),format:p.literal(`png`).default(`png`)}).refine(e=>e.sourceState===void 0||e.target.kind===`node`,{message:`a source state requires a node render target`,path:[`sourceState`]}),il=p.enum(qc);p.enum(Jc);const al=p.enum(Yc),ol=p.enum(Xc),sl=p.object({code:ol,message:p.string().min(1).max(500),sourceId:p.string().min(1).nullable()}),R=p.object({reason:al,phase:il,message:p.string().min(1).max(500),retryable:p.boolean(),sourceId:p.string().min(1).nullable()}),cl=p.object({phase:il,durationMs:p.number().int().min(0)}),ll=p.object({canvasId:p.uuid(),requestedVersion:p.number().int().positive(),loadedVersion:p.number().int().positive(),target:$c,sourceState:tl.optional(),snapshot:nl.optional(),bounds:Qc,width:p.number().int().positive(),height:p.number().int().positive(),scale:p.number().positive(),contentType:p.literal(`image/png`),bytes:p.number().int().positive(),warnings:p.array(sl),timings:p.array(cl),expiresAt:p.iso.datetime()}),ul=p.object({id:p.uuid(),canvasId:p.uuid(),purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),phase:il,requestedVersion:p.number().int().positive(),target:$c,sourceState:el.optional(),scale:p.number().positive(),maxOutputPixels:Zc.optional(),format:p.literal(`png`),attempt:p.number().int().min(0),lastFailure:R.optional(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),dl=p.discriminatedUnion(`state`,[ul.extend({state:p.literal(`queued`),result:p.null(),failure:p.null()}),ul.extend({state:p.literal(`running`),result:p.null(),failure:p.null()}),ul.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:ll,failure:p.null()}),ul.extend({state:p.literal(`failed`),result:p.null(),failure:R}),ul.extend({state:p.literal(`cancelled`),result:p.null(),failure:R.extend({reason:p.literal(`CANCELLED`)})}),ul.extend({state:p.literal(`expired`),result:p.null(),failure:R.extend({reason:p.literal(`EXPIRED`)})})]);p.object({job:dl,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}).extend({waitMs:p.number().int().min(0).max(1e4).optional()}),p.object({job:dl}),p.object({jobId:p.uuid()}),p.object({job:dl});const fl=p.discriminatedUnion(`status`,[p.object({status:p.literal(`available`),version:p.number().int().positive(),format:p.literal(`enhance-scene-json`),code:p.string(),prototypes:p.array(p.object({nodeId:p.string(),prototypeId:p.uuid(),deploymentId:p.uuid(),capability:p.literal(`canvas.read`),canvasPath:p.string(),input:p.object({canvasRef:p.uuid(),view:p.literal(`source`),nodeId:p.string()}),guidance:p.string()})),guidance:p.string()}),p.object({status:p.literal(`unavailable`),guidance:p.string()})]);p.object({canvasId:p.uuid(),nodeId:p.string().min(1),expectedVersion:p.number().int().positive(),scale:p.number().positive()}),p.object({jobId:p.uuid()}),p.object({jobId:p.uuid(),download:tc,source:fl.optional()});const pl=p.strictObject({previewJobId:p.uuid(),scope:p.strictObject({pageId:p.string().min(1).optional(),nodeIds:p.array(p.string().min(1))}),placement:p.strictObject({kind:p.literal(`below-source`)})});p.object({canvasId:p.uuid(),recordingId:p.uuid(),atMs:p.number().int().nonnegative(),context:p.strictObject({expectedVersion:p.number().int().positive(),request:pl}).optional()}),p.object({job:dl,alreadyExists:p.boolean()});const ml=p.object({rootIds:p.array(p.string().min(1))}),hl=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`adjacent`)}),p.object({kind:p.literal(`insert-children`),pageId:p.string().min(1).optional(),targetNodeId:p.string().min(1)}),p.object({kind:p.literal(`replace`),targetNodeId:p.string().min(1)})]),gl=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`screen`),nodeId:p.string().min(1)}),p.object({kind:p.literal(`html`),html:p.string().min(1),label:p.string().min(1),idPrefix:p.string().min(1).regex(/^[\w-]+$/u).optional()})]),_l=p.object({source:gl,destination:hl,revisionPolicy:p.enum([`strict`,`rebase`]).optional()}).superRefine((e,t)=>{e.source.kind===`screen`&&e.destination.kind!==`adjacent`&&t.addIssue({code:`custom`,message:`stored screens convert beside their source`,path:[`destination`]}),e.source.kind===`html`&&e.destination.kind===`adjacent`&&t.addIssue({code:`custom`,message:`authored HTML requires an editable destination`,path:[`destination`]})}),vl=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`screen`),nodeId:p.string().min(1)}),p.object({kind:p.literal(`html`),label:p.string().min(1)})]),yl=p.object({id:p.uuid(),canvasId:p.uuid(),source:vl,destination:hl,phase:il,requestedVersion:p.number().int().positive(),attempt:p.number().int().nonnegative(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),bl=p.discriminatedUnion(`state`,[yl.extend({state:p.literal(`queued`),result:p.null(),failure:p.null()}),yl.extend({state:p.literal(`running`),result:p.null(),failure:p.null()}),yl.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:Kc.extend({report:Hc}),failure:p.null()}),yl.extend({state:p.literal(`failed`),result:p.null(),failure:R}),yl.extend({state:p.literal(`cancelled`),result:p.null(),failure:R.extend({reason:p.literal(`CANCELLED`)})}),yl.extend({state:p.literal(`expired`),result:p.null(),failure:R.extend({reason:p.literal(`EXPIRED`)})})]);_l.and(p.object({canvasId:p.uuid(),expectedVersion:p.number().int().positive().optional(),mutationId:p.uuid().optional(),writeScope:ml.optional(),scope:rl.shape.scope})).refine(e=>e.scope===void 0&&e.revisionPolicy!==`strict`||e.expectedVersion!==void 0,{message:`scoped or strict conversion requires an expected version`,path:[`expectedVersion`]}),p.object({job:bl,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}),p.object({job:bl}),p.object({jobId:p.uuid()}),p.object({job:bl}),p.discriminatedUnion(`state`,[p.object({state:p.literal(`loading`),jobId:p.uuid()}),p.object({state:p.literal(`ready`),jobId:p.uuid(),loadedVersion:p.number().int().positive(),draft:Gc}),p.object({state:p.literal(`failed`),jobId:p.uuid(),message:p.string().min(1)})]);const xl=p.object({add:p.array(p.object({resourceId:p.string().min(1)}).catchall(p.unknown())),remove:p.array(p.string().min(1))}),z=p.union([p.string(),T]),B=p.union([P.shape.value,T]).nullable().optional(),Sl=p.strictObject({border:B,"border-block":B,"border-block-color":B,"border-block-style":B,"border-block-width":B,"border-block-end":B,"border-block-end-color":B,"border-block-end-style":B,"border-block-end-width":B,"border-block-start":B,"border-block-start-color":B,"border-block-start-style":B,"border-block-start-width":B,"border-bottom":B,"border-bottom-color":B,"border-bottom-style":B,"border-bottom-left-radius":z.optional(),"border-bottom-right-radius":z.optional(),"border-bottom-width":z.optional(),"border-color":p.string().nullable().optional(),"border-image":B,"border-image-source":B,"border-image-slice":B,"border-image-width":B,"border-image-outset":B,"border-image-repeat":B,"border-inline":B,"border-inline-color":B,"border-inline-style":B,"border-inline-width":B,"border-inline-end":B,"border-inline-end-color":B,"border-inline-end-style":B,"border-inline-end-width":B,"border-inline-start":B,"border-inline-start-color":B,"border-inline-start-style":B,"border-inline-start-width":B,"border-left":B,"border-left-color":B,"border-left-style":B,"border-left-width":z.optional(),"border-radius":z.nullable().optional(),"border-right":B,"border-right-color":B,"border-right-style":B,"border-right-width":z.optional(),"border-style":B,"border-top":B,"border-top-color":B,"border-top-style":B,"border-top-left-radius":z.optional(),"border-top-right-radius":z.optional(),"border-top-width":z.optional(),"border-width":z.nullable().optional(),outline:B,"outline-color":B,"outline-style":B,"outline-offset":z.optional(),"outline-width":z.optional()}),Cl=p.string().regex(/^(?:\d+(?:\.\d+)?|\.\d+)px$/u),wl=p.string().regex(/^-?(?:\d+(?:\.\d+)?|\.\d+)px$/u),Tl=P.shape.value.refine(e=>!/\burl\s*\(/iu.test(e),`invalid text colour`),El=p.union([N.shape.weight,p.enum([`normal`,`bold`,`bolder`,`lighter`]),p.string().regex(/^\d+(?:\.\d+)?$/u).refine(e=>N.shape.weight.safeParse(Number(e)).success)]),V={color:Tl,"font-family":P.shape.value,"font-size":p.union([E,Cl]),"font-weight":El,"font-style":p.enum([`normal`,`italic`,`oblique`]),"letter-spacing":T,"line-height":p.union([p.number().positive(),p.string().regex(/^(?:\d+(?:\.\d+)?(?:px|em|rem|%)?|normal)$/u)]),"text-align":p.enum([`left`,`center`,`right`]),"white-space":p.enum([`normal`,`nowrap`,`pre`,`pre-wrap`,`pre-line`,`break-spaces`])},Dl=p.strictObject({color:V.color.optional(),"font-family":V[`font-family`].optional(),"font-size":V[`font-size`].optional(),"font-weight":V[`font-weight`].optional(),"font-style":V[`font-style`].optional(),"letter-spacing":V[`letter-spacing`].optional(),"line-height":V[`line-height`].optional(),"text-align":V[`text-align`].optional(),"white-space":V[`white-space`].optional()}),Ol=p.union([P.shape.value,T]).nullable().optional(),kl=p.strictObject({"text-decoration":Ol,"text-decoration-line":Ol,"text-decoration-style":Ol,"text-decoration-color":Ol,"text-decoration-thickness":Ol,"text-underline-offset":Ol,"text-decoration-skip-ink":Ol,color:V.color.nullable().optional(),"font-family":V[`font-family`].nullable().optional(),"font-size":V[`font-size`].nullable().optional(),"font-weight":V[`font-weight`].nullable().optional(),"font-optical-sizing":p.enum([`auto`,`none`]).nullable().optional(),"font-variation-settings":P.shape.value.nullable().optional(),"font-feature-settings":P.shape.value.nullable().optional(),"text-wrap":P.shape.value.nullable().optional(),"text-wrap-mode":P.shape.value.nullable().optional(),"text-wrap-style":P.shape.value.nullable().optional(),"text-box":P.shape.value.nullable().optional(),"text-box-trim":P.shape.value.nullable().optional(),"text-box-edge":P.shape.value.nullable().optional(),"font-style":V[`font-style`].nullable().optional(),"font-stretch":p.union([p.enum([`normal`,`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`]),p.string().regex(/^\d+(?:\.\d+)?%$/u)]).nullable().optional(),"letter-spacing":p.union([T,wl,p.literal(`normal`)]).nullable().optional(),"line-height":V[`line-height`].nullable().optional(),"text-align":V[`text-align`].nullable().optional(),"text-indent":p.union([T,wl]).nullable().optional(),"white-space":V[`white-space`].nullable().optional(),"word-spacing":p.union([T,wl,p.literal(`normal`)]).nullable().optional()}),Al=P.shape.value,H=p.union([p.string(),T]),U=p.union([P.shape.value,T]).nullable().optional(),jl=kl.extend(Sl.shape).extend({"align-content":U,"align-items":U,"align-self":U,"aspect-ratio":U,"block-size":U,bottom:U,"box-sizing":U,display:U,flex:U,"flex-basis":U,"flex-direction":U,"flex-grow":U,"flex-shrink":U,"flex-wrap":U,grid:U,"grid-template":U,"grid-template-columns":U,"grid-template-rows":U,"grid-template-areas":U,"grid-auto-columns":U,"grid-auto-rows":U,"grid-auto-flow":U,"grid-row":U,"grid-column":U,"grid-area":U,"grid-row-start":U,"grid-row-end":U,"grid-column-start":U,"grid-column-end":U,"justify-items":U,"justify-self":U,"place-items":U,"place-self":U,"place-content":U,height:U,"inline-size":U,inset:U,"inset-block":U,"inset-block-end":U,"inset-block-start":U,"inset-inline":U,"inset-inline-end":U,"inset-inline-start":U,isolation:U,"justify-content":U,left:U,margin:U,"margin-block":U,"margin-block-end":U,"margin-block-start":U,"margin-inline":U,"margin-inline-end":U,"margin-inline-start":U,"max-block-size":U,"max-height":U,"max-inline-size":U,"max-width":U,"min-block-size":U,"min-height":U,"min-inline-size":U,"min-width":U,order:U,padding:U,"padding-block":U,"padding-block-end":U,"padding-block-start":U,"padding-inline":U,"padding-inline-end":U,"padding-inline-start":U,position:U,right:U,top:U,width:U,background:p.string().nullable().optional(),"background-color":p.string().nullable().optional(),"background-image":U,"background-size":U,"background-position":U,"background-repeat":U,"background-origin":U,"background-blend-mode":U,"box-shadow":p.string().nullable().optional(),"column-gap":H.optional(),gap:H.optional(),"margin-bottom":H.optional(),"margin-left":H.optional(),"margin-right":H.optional(),"margin-top":H.optional(),opacity:p.union([p.string(),p.number()]).nullable().optional(),overflow:Al.nullable().optional(),"overflow-x":Al.nullable().optional(),"overflow-y":Al.nullable().optional(),"padding-bottom":H.optional(),"padding-left":H.optional(),"padding-right":H.optional(),"padding-top":H.optional(),"row-gap":H.optional(),"stroke-width":H.optional()}),Ml=p.union([jl.keyof(),P.shape.property.refine(e=>e.startsWith(`--`))]),Nl=jl.catchall(U).refine(e=>Object.keys(e).every(e=>Ml.safeParse(e).success)),Pl=p.record(p.string(),p.unknown()),Fl=p.number().int().positive(),Il=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`retain`),count:Fl,attributes:Pl.optional(),shouldPreserveParagraph:p.boolean().optional()}),p.object({kind:p.literal(`delete`),count:Fl}),p.object({kind:p.literal(`insert`),text:p.string().min(1).refine(e=>e.isWellFormed()),attributes:Pl.optional(),shouldPreserveParagraph:p.boolean().optional()})]),Ll=p.object({baseLength:p.number().int().nonnegative(),representation:p.enum([`plain`,`rich`,`links`]).optional(),steps:p.array(Il),endAttributes:Pl.optional(),properties:Pl.refine(e=>[`text`,`richText`,`links`].every(t=>!Object.hasOwn(e,t))).optional()}).superRefine((e,t)=>{let n=0;for(let t of e.steps)t.kind!==`insert`&&(n+=t.count);n!==e.baseLength&&t.addIssue({code:`custom`,message:`text change must consume its exact base`})}),Rl=p.object({actionId:p.string().min(1),baseVersion:p.number().int().nonnegative(),isActive:p.boolean()}),zl=p.object({baseVersion:p.number().int().nonnegative(),after:p.array(p.string().min(1)),change:Ll}),Bl=p.object({actionId:p.string().min(1),baseVersion:p.number().int().nonnegative(),originalChange:Ll,inverse:Ll,history:Rl.optional(),source:zl.optional()}),Vl=p.object({op:p.literal(`editText`),nodeId:p.string().min(1),change:Ll,actionId:p.string().min(1).optional(),revision:Bl.optional(),history:Rl.optional(),source:zl.optional()}),Hl=2e3,Ul=p.object({title:p.string().trim().min(1).max(200)}).strict(),Wl=p.array($s.shape.id),Gl=p.object({canvasId:p.uuid()}),Kl=p.object({definition:$s.refine(e=>e.sourceStyleId===void 0),revision:p.number().int().positive(),fontFaces:p.array(p.record(p.string(),p.unknown()))}),ql=p.object({styles:p.array(Kl).refine(e=>new Set(e.map(e=>e.definition.id)).size===e.length)});Gl.extend({revision:p.number().int().positive(),documentVersion:p.number().int().positive(),description:p.string().max(Hl),publishedAt:p.iso.datetime(),...ql.shape}),Gl.extend({mutationId:p.uuid(),expectedRevision:p.number().int().nonnegative(),documentVersion:p.number().int().positive(),publish:Wl,remove:Wl,description:p.string().trim().max(Hl)}).strict().refine(e=>{let t=[...e.publish,...e.remove];return t.length>0&&new Set(t).size===t.length},{message:`Select each changed style once.`});const Jl=p.object({canvasId:p.uuid(),title:p.string().max(200)});p.object({search:p.string().trim().max(200).default(``),cursor:Jl.nullable().default(null),limit:p.number().int().min(1).max(50).default(20)});const Yl=p.object({canvasId:p.uuid(),title:p.string(),organisationId:p.uuid().nullable(),revision:p.number().int().positive(),styleCount:p.number().int().positive(),publishedAt:p.iso.datetime()});p.object({items:p.array(Yl).max(50),nextCursor:Jl.nullable()});const Xl=p.object({parentId:p.string().min(1),sortKey:p.string().min(1)}),Zl=p.object({op:p.literal(`insertConvertedSubtree`),destination:hl,sourceNodeId:p.string().min(1).optional(),rootNodeId:p.string().min(1),nodes:p.record(p.string().min(1),L),relationships:p.record(p.string().min(1),Xl)}),W=p.string().min(1),Ql=I.extend({width:p.number().positive(),height:p.number().positive()}),$l=p.object({parentId:W,afterId:W.optional()}),eu=Xl,tu=p.object({op:p.literal(`setStyles`),nodeId:W,styles:Nl,clear:p.array(Ml).min(1).refine(e=>new Set(e).size===e.length).optional()}).refine(e=>(e.clear??[]).every(t=>!Object.hasOwn(e.styles,t))),nu=p.discriminatedUnion(`op`,[Zl,p.object({op:p.literal(`insertNode`),node:L,parentage:eu,prototypeSource:p.object({canvasId:p.uuid(),nodeId:W,documentVersion:p.number().int().nonnegative(),versionEntryId:p.uuid().optional()}).optional(),screenSource:p.object({canvasId:p.uuid()}).optional(),pageCopyBase:p.string().refine(e=>e.trim()!==``).optional()}),$l.extend({op:p.literal(`insertText`),nodeId:W,label:p.string().default(`Text`),text:p.string(),box:Ql,styles:Dl.default({})}),$l.extend({op:p.literal(`insertPrototype`),nodeId:W,label:p.string().default(`Prototype`),prototypeId:p.uuid(),deploymentId:p.uuid(),box:Ql,canvasPageId:W.optional()}),p.object({op:p.literal(`setPrototypeDeployment`),nodeId:W,prototypeId:p.uuid(),deploymentId:p.uuid(),expected:p.object({prototypeId:p.uuid(),deploymentId:p.uuid()}).optional()}),Vl,p.object({op:p.literal(`setText`),nodeId:W,text:p.string()}),p.object({op:p.literal(`setBox`),nodeId:W,box:p.union([I,p.literal(`default`)])}),p.object({op:p.literal(`setLabel`),nodeId:W,label:p.string().trim().min(1),labelOrigin:Fc.nullable().optional()}),p.object({op:p.literal(`setContainerKind`),nodeId:W,component:p.enum([`frame`,`group`])}),p.object({op:p.literal(`setVisibility`),nodeId:W,visible:p.boolean().nullable()}),p.object({op:p.literal(`setLocked`),nodeId:W,locked:p.boolean().nullable()}),p.object({op:p.literal(`setConstraints`),nodeId:W,constraints:Pc.nullable()}),tu,p.object({op:p.literal(`patchExportSettings`),nodeId:W,exportSettings:bc}),p.object({op:p.literal(`setAppearance`),nodeId:W,appearance:Rs}),p.object({op:p.literal(`setLayout`),nodeId:W,layout:p.union([Cs,p.literal(`default`)]),fields:p.array(Cs.keyof()).optional()}),p.object({op:p.literal(`patchTypography`),nodeId:W,typography:Ws}),p.object({op:p.literal(`setTypography`),nodeId:W,typography:p.union([Hs,p.literal(`default`)])}),p.object({op:p.literal(`patchAdditionalStyles`),nodeId:W,additionalStyles:Xs}),p.object({op:p.literal(`setAdditionalStyles`),nodeId:W,additionalStyles:p.union([Js,p.literal(`default`)])}),ls,p.object({op:p.literal(`setTextStyleLibrary`),nodeId:p.literal(`root`),sourceCanvasId:p.uuid(),library:Ul.nullable()}),p.object({op:p.literal(`patchFontLibrary`),nodeId:p.literal(`root`),fonts:xl}),p.object({op:p.literal(`setTextStyle`),nodeId:p.literal(`root`),styleId:$s.shape.id,textStyle:$s.nullable(),changedTextNodeIds:p.array(W).optional()}).refine(e=>e.textStyle===null||e.textStyle.id===e.styleId,`text style identity must match`),p.object({op:p.literal(`setGeometry`),nodeId:W,geometry:p.union([Ac,p.literal(`default`)])}),p.object({op:p.literal(`setProps`),nodeId:W,props:p.union([p.record(p.string(),p.unknown()),p.literal(`default`)])}),p.object({op:p.literal(`setParentage`),nodeId:W,parentage:eu}),$l.extend({op:p.literal(`move`),nodeId:W}),p.object({op:p.literal(`remove`),nodeId:W,removedText:p.record(W,L.pick({props:!0})).optional()})]),ru=nu.options.map(e=>e.shape.op.value),iu=p.preprocess((e,t)=>typeof e!=`object`||!e||Reflect.get(e,`op`)!==`setCompositing`?e:(t.issues.push({code:`custom`,message:jc,input:e}),p.NEVER),nu);Kc.extend({operation:Zl,next:p.array(p.string().min(1))});const au=p.record(p.string(),p.unknown());p.object({canvasId:p.uuid(),afterVersion:p.number().int().positive().optional()});const ou=p.object({screenId:p.uuid(),clientToken:p.uuid(),route:p.string().nullable(),title:p.string().nullable(),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()}),atMs:p.number().int().min(0).nullable(),sourceRecordingId:p.uuid().nullable(),assetBundle:p.object({assetBundleId:p.uuid(),sourceUrl:p.string(),assets:p.array(p.object({url:p.string(),contentType:p.string(),path:p.string().startsWith(`/v1/recording-assets/`)})),missingAssetCount:p.number().int().min(0)}).nullable(),download:tc.nullable()}),su=p.object({mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(iu)});p.object({mutations:p.array(su).optional(),version:p.number().int().min(1),restoreFenceVersion:p.number().int().positive().optional(),document:au.optional(),screens:p.array(ou)}).extend({document:au}),p.object({canvasId:p.uuid(),baseVersion:p.number().int().min(1),document:au.refine(e=>Ic.safeParse(e).success,`A save requires a valid current-format canvas document.`),screenIds:p.array(p.uuid())}),p.discriminatedUnion(`outcome`,[p.object({outcome:p.literal(`saved`),version:p.number().int().min(1)}),p.object({outcome:p.literal(`conflict`),version:p.number().int().min(1),document:au})]);const cu=p.object({start:p.number().int().nonnegative(),end:p.number().int().positive(),href:p.url().refine(e=>[`http:`,`https:`].includes(new URL(e).protocol))});p.object({text:p.string(),links:p.array(cu).optional()});const lu=p.enum([`position`,`layout`,`clip`,`cornerRadius`,`blending`,`typography`,`nativeControl`,`textDecoration`,`fill`,`outline`,`textStroke`,`border`,`outerShadow`,`innerShadow`,`filters`,`additionalStyles`,`vector`,`export`,`source`]),uu=p.object({id:p.string().min(1),label:p.string().max(500),kind:p.string().min(1).max(100),parentId:p.string().min(1).nullable(),childCount:p.number().int().min(0),box:I.nullable(),propertySections:p.array(lu)});p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),openUrl:p.url(),title:p.string().min(1),version:p.number().int().positive(),nodeCount:p.number().int().min(0),rootChildCount:p.number().int().min(0),bounds:I.nullable(),kinds:p.record(p.string(),p.number().int().min(0)),next:p.array(p.string().min(1))}),p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),version:p.number().int().positive(),nodes:p.array(uu)}),p.object({canvasId:p.uuid(),nodeId:p.string().min(1)}),p.object({canvasId:p.uuid(),version:p.number().int().positive(),node:uu.extend({styles:p.record(p.string(),p.union([p.string(),p.number()])),layout:Cs.optional(),appearance:Fs.optional(),geometry:Ac.optional(),typography:Hs.optional(),additionalStyles:Js.optional(),props:p.record(p.string(),p.unknown()),children:p.array(p.string().min(1))}),next:p.array(p.string().min(1))});const du=L.shape.id,fu=I.extend({width:p.number().positive(),height:p.number().positive()}),pu=p.record(du,du),mu=p.strictObject({fingerprint:p.string().regex(/^[a-f0-9]{64}$/u),revisionPolicy:p.enum([`strict`,`rebase`]),copiedNodeIds:pu.optional()});p.object({canvasId:p.uuid(),mutationId:p.uuid(),documentFormatVersion:Mc,baseVersion:p.number().int().positive(),operations:p.array(iu).min(1),requestContext:mu.optional(),writeScope:ml.optional()});const hu=p.object({canvasId:p.uuid(),mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(iu),insertedNodeIds:p.array(du),changedNodeIds:p.array(du),removedNodeIds:p.array(du),boxes:p.record(du,I),affectedBounds:fu.nullable(),copiedNodeIds:pu.optional(),next:p.array(p.string().min(1))});p.strictObject({canvasId:p.uuid(),mutationId:p.uuid(),fingerprint:mu.shape.fingerprint}),p.discriminatedUnion(`state`,[p.strictObject({state:p.literal(`not-found`)}),p.strictObject({state:p.literal(`committed`),result:hu})]);const gu={nodes:1e3,fields:20,id:200,label:500,value:1e3},_u=p.object({available:p.boolean(),omittedNodes:p.number().int().nonnegative(),nodes:p.array(p.object({nodeId:p.string().min(1),label:p.string().max(gu.label),kind:p.enum([`inserted`,`removed`,`changed`,`unchanged`,`unavailable`]),omittedFields:p.number().int().nonnegative(),fields:p.array(p.object({label:p.string().max(gu.id),before:p.string().max(gu.value).nullable(),after:p.string().max(gu.value).nullable(),truncated:p.boolean()})).max(gu.fields)})).max(gu.nodes)}),vu=[`position`,`layout`,`cornerRadius`,`blending`,`fill`,`outline`,`border`,`outerShadow`,`innerShadow`,`filters`,`additionalStyles`,`export`],yu=[`position`,`layout`,`clip`,...vu.filter(e=>e!==`position`&&e!==`layout`)],bu=[...vu,`vector`];Object.fromEntries([{objectKind:`prototype`,label:`Prototype`,category:`import`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},capture:{preservesHtmlCssAssets:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:[`position`,`layout`,`cornerRadius`,`blending`,`outline`,`outerShadow`,`innerShadow`,`filters`]},{objectKind:`root`,label:`Canvas`,category:`container`,capabilities:{canSelect:!1,canContainChildren:!0,canEditProperties:!1},selectionBehavior:{hitTarget:`children`},propertySections:[]},{objectKind:`page`,label:`Page`,category:`container`,capabilities:{canSelect:!1,canContainChildren:!1,canEditProperties:!1},selectionBehavior:{hitTarget:`children`},propertySections:[]},{objectKind:`screen`,label:`Screen`,category:`import`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!1,commentAnchor:`screen`},capture:{preservesHtmlCssAssets:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:[`position`,`layout`,`source`]},{objectKind:`frame`,label:`Frame`,category:`container`,capabilities:{canSelect:!0,canContainChildren:!0,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:yu},{objectKind:`group`,label:`Group`,category:`container`,capabilities:{canSelect:!0,canContainChildren:!0,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:[`position`,`layout`,`blending`,`filters`,`additionalStyles`,`export`]},{objectKind:`rectangle`,label:`Rectangle`,category:`primitive`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:vu},{objectKind:`image`,label:`Image`,category:`media`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`scale`,preservesAspect:!0,canLockAspectRatio:!0},propertySections:vu},{objectKind:`svg`,label:`SVG`,category:`primitive`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},capture:{preservesVectorData:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`scale`,preservesAspect:!0,canLockAspectRatio:!0},propertySections:bu},{objectKind:`boolean`,label:`Boolean`,category:`container`,capabilities:{canSelect:!0,canContainChildren:!0,canEditProperties:!0,commentAnchor:`node`},capture:{preservesVectorData:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`scale`,preservesAspect:!1,canLockAspectRatio:!0},propertySections:bu},{objectKind:`recording`,label:`Recording`,category:`media`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!1},capture:{preservesAssets:!0},selectionBehavior:{hitTarget:`frame`},resizeBehavior:{mode:`scale`,preservesAspect:!0,canLockAspectRatio:!0},propertySections:[]},{objectKind:`text`,label:`Text`,category:`primitive`,capabilities:{canSelect:!0,canContainChildren:!1,canEditProperties:!0,commentAnchor:`node`},selectionBehavior:{hitTarget:`text`},resizeBehavior:{mode:`reflow`,preservesAspect:!1,canLockAspectRatio:!1},propertySections:[`position`,`layout`,`typography`,`nativeControl`,`textDecoration`,`textStroke`,`blending`,`fill`,`outerShadow`,`filters`,`additionalStyles`,`export`]}].map(e=>[e.objectKind,e]));const G=L.shape.id,xu=p.array(G).min(1),Su=p.strictObject({x:p.number(),y:p.number()}),Cu=p.strictObject({width:p.number().positive().optional(),height:p.number().positive().optional()}).refine(e=>e.width!==void 0||e.height!==void 0,{message:`Specify width, height, or both.`}),wu=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`position`),nodeId:G,parentPosition:Su}),p.strictObject({kind:p.literal(`resize`),nodeId:G,size:Cu}),p.strictObject({kind:p.literal(`relative-position`),nodeId:G,referenceNodeId:G,side:p.enum([`above`,`below`,`left`,`right`]),gap:p.number().nonnegative(),align:p.enum([`start`,`center`,`end`])}),p.strictObject({kind:p.literal(`move`),nodeIds:xu,targetNodeId:G,position:p.enum([`before`,`inside`,`after`])}),p.strictObject({kind:p.literal(`group`),nodeIds:xu,label:p.string().min(1).optional()}),p.strictObject({kind:p.literal(`ungroup`),nodeIds:xu}),p.strictObject({kind:p.literal(`label`),nodeId:G,label:p.string().min(1)}),p.strictObject({kind:p.literal(`visibility`),nodeId:G,visible:p.boolean()}),p.strictObject({kind:p.literal(`lock`),nodeId:G,locked:p.boolean()})]),Tu=p.strictObject({kind:p.literal(`arrange`),changes:p.array(wu).min(1)}),Eu=p.strictObject({kind:p.literal(`duplicate`),nodeIds:xu,destination:p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`native`)}),p.strictObject({kind:p.literal(`inside`),parentId:G})])}),Du=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`compile-screens`),sources:p.array(p.strictObject({screenId:p.uuid(),captureId:p.uuid(),label:p.string().min(1)})).min(1)}),Tu,Eu,p.strictObject({kind:p.literal(`compile-html`),contextOperations:p.array(iu).refine(e=>e.every(e=>`nodeId`in e&&![`remove`,`move`,`setParentage`,`insertText`,`insertPrototype`,`insertNode`,`insertConvertedSubtree`].includes(e.op)),`Compilation context may update retained fields only.`),fragments:p.array(p.strictObject({id:G,parentNodeId:G,html:p.string().min(1)})).min(1).refine(e=>new Set(e.map(e=>e.id)).size===e.length,`HTML fragment ids must be unique.`)})]),Ou=p.strictObject({pageId:G.optional(),nodeIds:p.array(G)}),ku=p.strictObject({request:Du,scope:Ou}),Au=p.strictObject({operations:p.array(iu),idMap:p.record(G,G),rootNodeIds:p.array(G)}),ju=Au.extend({compilations:p.array(p.strictObject({id:G,draft:Gc,warnings:p.array(sl).optional()})).optional()});p.discriminatedUnion(`state`,[p.object({state:p.literal(`loading`),jobId:p.uuid()}),p.object({state:p.literal(`ready`),jobId:p.uuid(),loadedVersion:p.number().int().positive(),plan:ju}),p.object({state:p.literal(`failed`),jobId:p.uuid(),message:p.string().min(1),reason:p.enum([`SOURCE_FAILED`,`PREPARATION_FAILED`]).optional(),retryable:p.boolean().optional()})]);const Mu=p.object({id:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),request:Du,scope:Ou,phase:il,attempt:p.number().int().nonnegative(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),Nu=p.discriminatedUnion(`state`,[Mu.extend({state:p.enum([`queued`,`running`]),result:p.null(),failure:p.null()}),Mu.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:Au.extend({loadedVersion:p.number().int().positive()}),failure:p.null()}),Mu.extend({state:p.enum([`failed`,`cancelled`,`expired`]),result:p.null(),failure:R})]);p.strictObject({canvasId:p.uuid(),expectedVersion:p.number().int().positive(),request:Du,scope:Ou}),p.object({job:Nu,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}),p.object({job:Nu});const Pu=p.string().trim().min(1).max(80).regex(/^[\w .+/-]+$/u),Fu=p.strictObject({path:p.enum([`local_mcp`,`hosted_mcp`,`direct_cli`]),name:Pu.optional(),version:Pu.optional()});Fu.pick({path:!0}).strip();const Iu=p.strictObject({agent_client:p.enum([`claude_code`,`codex`,`cursor`,`unknown`]),connection_path:Fu.shape.path,identity_source:p.enum([`mcp_client_info`,`documented_cli_fallback`,`unavailable`]),auth_method:p.enum([`personal_agent_token`,`mcp_oauth`]),agent_client_version:Pu.optional()}),Lu=p.enum([`green`,`blue`,`indigo`,`amber`,`lime`,`teal`,`cyan`,`sky`,`violet`,`purple`,`fuchsia`,`pink`]),Ru=p.string().regex(/^[0-9a-f]{32}$/),zu=p.object({viewKey:Ru.optional(),admissionOrder:p.number().int().nonnegative().optional(),followColour:Lu.optional()}),Bu=p.object({pageId:p.string().min(1).nullable().optional(),followingViewKey:Ru.nullable().optional()}),Vu=`enhance3.canvas.v1`,Hu=16384,Uu=p.enum([`blue`,`violet`,`green`,`amber`,`magenta`,`teal`,`red`,`orange`]),Wu=p.object({kind:p.literal(`person`),connectionId:p.uuid(),personId:p.uuid(),displayName:p.string().min(1).max(100),initials:p.string().min(1).max(8),avatarUrl:p.string().max(Io).nullable().optional(),colour:Uu}),Gu=Wu.extend(zu.shape),Ku=p.object({kind:p.literal(`guest`),connectionId:p.uuid(),displayName:p.string().min(1).max(100),initials:p.string().min(1).max(8),colour:Uu,...zu.shape}),qu=p.discriminatedUnion(`kind`,[Gu,Ku]),Ju=p.object({kind:p.literal(`agent`),personId:p.uuid(),displayName:p.string().min(1).max(100),initials:p.string().min(1).max(8),tokenLabel:p.string().min(1).max(100),agentAttribution:Iu.optional(),colour:Uu}),Yu=p.discriminatedUnion(`kind`,[Wu.omit({connectionId:!0,avatarUrl:!0}),Ju]),Xu=p.object({x:p.number(),y:p.number()}),Zu=I.extend({width:p.number().positive(),height:p.number().positive()}),Qu=p.object({count:p.number().int().positive(),bounds:Zu.nullable()}),$u=p.object({kind:p.enum([`drag`,`resize`]),baseVersion:p.number().int().positive(),boxes:p.record(p.string().min(1),Zu).refine(e=>Object.keys(e).length<=100&&new TextEncoder().encode(JSON.stringify(e)).byteLength<=16384),summary:Qu.optional()}),ed=p.object({cursor:Xu.nullable().optional(),input:p.enum([`pointer`,`touch`,`keyboard`]).optional(),focused:p.boolean().optional(),selectedNodeIds:p.array(p.string().min(1)).max(100).refine(e=>new TextEncoder().encode(JSON.stringify(e)).byteLength<=Hu).optional(),selectionSummary:Qu.nullable().optional(),visibleWorldBox:Zu.optional(),gesture:$u.nullable().optional(),cursorChat:p.string().max(140).nullable().optional(),...Bu.shape}).refine(e=>Object.keys(e).length>0,`presence patch cannot be empty`),td=p.object({actor:qu,seq:p.number().int().nonnegative(),cursor:Xu.nullable(),input:p.enum([`pointer`,`touch`,`keyboard`]),focused:p.boolean(),selectedNodeIds:p.array(p.string().min(1)).max(100).refine(e=>new TextEncoder().encode(JSON.stringify(e)).byteLength<=Hu),selectionSummary:Qu.nullable().optional(),visibleWorldBox:Zu.nullable(),gesture:$u.nullable(),cursorChat:p.string().max(140).nullable().default(null),...Bu.shape,followOrder:p.number().int().nonnegative().optional(),expiresAt:p.iso.datetime()}),nd=p.enum([`reading`,`writing`,`creating`,`deleting`,`rendering`]),rd=p.object({activityId:p.uuid(),canvasId:p.uuid(),actor:Ju,phase:nd,nodeIds:p.array(p.string().min(1)).max(100),bounds:Zu.nullable(),expiresAt:p.iso.datetime()}),id=p.object({canvasId:p.uuid(),phase:nd,nodeIds:p.array(p.string().min(1)).max(100).default([]),bounds:Zu.nullable().default(null)});p.object({activityId:p.uuid(),expiresAt:p.iso.datetime(),renewAfterMs:p.number().int().positive()}),id.extend({activityId:p.uuid()}),p.object({canvasId:p.uuid(),activityId:p.uuid()}),p.object({ended:p.literal(!0)});const K={v:p.literal(1),seq:p.number().int().nonnegative()};p.discriminatedUnion(`type`,[p.object({...K,type:p.literal(`access.changed`),payload:p.object({})}),p.object({...K,type:p.literal(`comments.changed`),payload:p.object({threadId:p.uuid()})}),p.object({...K,type:p.literal(`resources.changed`),payload:p.object({})}),p.object({...K,type:p.literal(`room.snapshot`),payload:p.object({connectionId:p.uuid(),viewKey:zu.shape.viewKey,peers:p.array(td),activities:p.array(rd),documentVersion:p.number().int().positive()})}),p.object({...K,type:p.literal(`presence.patch`),payload:td}),p.object({...K,type:p.literal(`presence.left`),payload:p.object({connectionId:p.uuid()})}),p.object({...K,type:p.literal(`agent.activity`),payload:p.object({activityId:p.uuid(),activity:rd.nullable()})}),p.object({...K,type:p.literal(`document.committed`),payload:p.object({mutationId:p.uuid(),actor:Yu,previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(iu).min(1)})}),p.object({...K,type:p.literal(`sync.required`),payload:p.object({version:p.number().int().positive(),reason:p.enum([`gap`,`relay`,`replace`,`history-restored`])})}),p.object({...K,type:p.literal(`room.ping`),payload:p.object({pingId:p.uuid(),sentAt:p.iso.datetime()})}),p.object({...K,type:p.literal(`room.error`),payload:p.object({code:p.enum([`auth`,`permission`,`protocol`,`payload`,`rate`,`unavailable`]),message:p.string().min(1).max(200)})})]),p.discriminatedUnion(`type`,[p.object({v:p.literal(1),type:p.literal(`presence.patch`),seq:p.number().int().nonnegative(),payload:ed}),p.object({v:p.literal(1),type:p.literal(`selection.chunk`),seq:p.number().int().nonnegative(),payload:p.object({transferId:p.uuid(),offset:p.number().int().nonnegative(),total:p.number().int().positive(),nodeIds:p.array(p.string().min(1)).min(1).max(1e3)})}),p.object({v:p.literal(1),type:p.literal(`selection.unavailable`),seq:p.number().int().nonnegative(),payload:p.object({count:p.number().int().positive()})}),p.object({v:p.literal(1),type:p.literal(`room.pong`),seq:p.number().int().nonnegative(),payload:p.object({pingId:p.uuid()})})]).refine(e=>e.type!==`selection.chunk`||e.payload.offset+e.payload.nodeIds.length<=e.payload.total&&new TextEncoder().encode(JSON.stringify(e)).byteLength<=49152),p.object({canvasId:p.uuid(),protocols:p.array(p.literal(Vu)).min(1).max(1),viewId:p.uuid().optional()}),p.object({endpoint:p.url(),ticket:p.string().min(1).max(4096),protocol:p.literal(Vu),expiresAt:p.iso.datetime()}),p.uuid();const ad=L.shape.id;p.array(ad),p.object({jobId:p.uuid()});const od=p.object({jobId:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),target:$c,sourceState:el.optional()});p.discriminatedUnion(`purpose`,[od.extend({purpose:p.literal(`preparation`),preparation:ku,screens:p.array(ou).optional(),attempts:p.strictObject({counted:p.number().int().nonnegative(),limit:p.number().int().positive()}).optional(),deadlineAt:p.iso.datetime().optional(),sourceState:p.undefined().optional(),scale:p.literal(1),format:p.literal(`json`)}),od.extend({purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),scale:p.number().positive(),maxOutputPixels:Zc.optional(),format:p.literal(`png`)}),od.extend({purpose:p.literal(`conversion`),target:p.object({kind:p.literal(`node`),nodeId:p.string().min(1)}),sourceState:p.undefined().optional(),conversion:_l,scale:p.literal(1),format:p.literal(`json`)})]),p.object({jobId:p.uuid()}),p.object({jobId:p.uuid()});const sd=p.object({jobId:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),grantToken:p.string().startsWith(`rgr_`).min(40).max(100),grantCookieName:p.string().min(1).max(100),renderUrl:p.url(),deadlineAt:p.iso.datetime().optional(),releaseIdentity:p.string().min(1).max(100)});p.discriminatedUnion(`purpose`,[sd.extend({purpose:p.literal(`preparation`),target:$c,preparation:ku,sourceState:p.undefined().optional(),scale:p.literal(1)}),sd.extend({purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),target:$c,sourceState:el.optional(),scale:p.number().positive(),maxOutputPixels:Zc.optional(),outputKey:p.string().min(1).max(500)}),sd.extend({purpose:p.literal(`conversion`),target:p.object({kind:p.literal(`node`),nodeId:p.string().min(1).max(200)}),sourceState:p.undefined().optional(),conversion:_l,scale:p.literal(1)})]),p.object({jobId:p.uuid(),loadedVersion:p.number().int().positive(),bounds:Qc,width:p.number().int().positive(),height:p.number().int().positive(),scale:p.number().positive(),bytes:p.number().int().positive(),storageKey:p.string().min(1).max(500),warnings:p.array(sl),timings:p.array(cl),sourceState:tl.optional(),snapshot:p.object({artifactBytes:p.number().int().positive(),artifactStorageKey:p.string().min(1).max(500),route:p.string().optional(),title:p.string().optional(),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()})}).optional()}),p.object({accepted:p.literal(!0)}),p.object({jobId:p.uuid(),loadedVersion:p.number().int().positive(),draft:Gc}),p.object({accepted:p.literal(!0)}),p.object({recordingId:p.uuid(),requestedAtMs:p.number().int().nonnegative(),settledAtMs:p.number().int().nonnegative(),artifact:p.string().min(1),route:p.string().optional(),title:p.string().optional(),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()})}),p.object({jobId:p.uuid(),failure:R}),p.object({accepted:p.literal(!0),willRetry:p.boolean()}),p.object({workerId:p.string().regex(/^[\w.-]+$/u).min(1).max(100),releaseIdentity:p.string().min(1).max(100),timestamp:p.coerce.number().int().nonnegative(),nonce:p.uuid(),mac:p.base64().min(32).max(200)});const cd=p.object({total:p.number().int().nonnegative(),loading:p.number().int().nonnegative(),unavailable:p.number().int().nonnegative()}),ld=p.object({jobId:p.uuid(),canvasId:p.uuid().nullable(),requestedVersion:p.number().int().positive().nullable(),loadedVersion:p.number().int().positive().nullable(),phase:il.exclude([`queued`,`claimed`,`capture`,`upload`,`complete`]),sources:cd,warnings:p.array(sl),timings:p.array(cl),sourceState:tl.optional()}),ud=p.object({selector:p.string().min(1).max(500),contentSelector:p.string().min(1).max(500).optional(),expectsPaint:p.boolean().optional(),bounds:Qc,width:p.number().int().positive(),height:p.number().int().positive(),scale:p.number().positive()});p.discriminatedUnion(`state`,[ld.extend({state:p.literal(`loading`),capture:p.null(),failure:p.null()}),ld.extend({state:p.literal(`ready`),phase:p.literal(`target`),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),loadedVersion:p.number().int().positive(),capture:ud,failure:p.null()}),ld.extend({state:p.literal(`failed`),failure:p.object({reason:al,message:p.string().min(1).max(500),sourceId:p.string().min(1).max(200).nullable(),overtaken:p.boolean().optional()}),capture:p.null()})]),p.object({jobId:p.uuid(),loadedVersion:p.number().int().positive(),plan:ju});const dd=p.string().min(1);p.object({canvasId:p.uuid()}),p.object({canvasId:p.uuid(),status:p.enum([`selected`,`none`,`offline`,`stale`,`updating`,`unsupported`]),documentVersion:p.number().int().positive(),selectionRevision:p.number().int().positive().nullable(),selectionChangedAt:p.iso.datetime().nullable(),selectedNodeIds:p.array(dd),missingNodeIds:p.array(dd),nodes:p.array(uu),contextRootId:dd.nullable(),visibleWorldBox:Qc.nullable(),next:p.array(p.string().min(1)).max(12)});const fd=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`recording`),recordingId:p.string()})]);p.object({html:p.string().optional(),viewport:p.object({width:p.number(),height:p.number()}),atMs:p.number(),screenId:p.string().nullable().default(null),sourceNodeId:p.string().optional(),provenance:fd.optional()}),p.object({provenance:fd.optional(),report:Hc.optional()}),p.object({recordingId:p.string()}),p.object({prototypeId:p.uuid(),deploymentId:p.uuid()}),p.object({preparedExperience:p.enum([`agent-connection`,`whisper-prototype`]),ownerPersonId:p.uuid(),resources:p.array(p.string().min(1))});const pd=new Set(Qs);new Set(Object.entries(Gs).flatMap(([e,t])=>t.some(e=>pd.has(e))?[e.replaceAll(/-([a-z])/gu,(e,t)=>t.toUpperCase())]:[]));const md=new Set(Qs);new Set(Object.entries(Gs).flatMap(([e,t])=>t.some(e=>md.has(e))?[e]:[]));const hd=1e3,gd=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`person`),personId:p.uuid(),displayName:p.string().min(1).max(200),initials:p.string().min(1).max(2)}),p.object({kind:p.literal(`agent`),personId:p.uuid(),displayName:p.string().min(1).max(200),initials:p.string().min(1).max(2),tokenLabel:p.string().min(1).max(200)})]),_d=p.object({id:p.uuid(),canvasId:p.uuid(),documentVersion:p.number().int().positive(),origin:p.enum([`automatic`,`manual`,`restore`]),restoreRole:p.enum([`before`,`result`]).nullable(),retention:p.enum([`automatic`,`named`,`restore-boundary`]),title:p.string().min(1).nullable(),description:p.string().max(hd).nullable(),actor:gd,sourceVersionEntryId:p.uuid().nullable(),expiresAt:p.iso.datetime().nullable(),checkpointAt:p.iso.datetime(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime(),screenCount:p.number().int().min(0)});p.object({canvasId:p.uuid(),limit:p.number().int().min(1).max(100).default(50),cursor:p.string().min(1).max(1e3).optional(),includeAutomatic:p.boolean().default(!1),actor:p.enum([`all`,`mine`]).default(`all`)}),p.object({current:p.object({documentVersion:p.number().int().positive(),updatedAt:p.iso.datetime()}),items:p.array(_d),nextCursor:p.string().min(1).nullable(),hasExpiredHistory:p.boolean()}),p.object({canvasId:p.uuid(),versionId:p.uuid()});const vd=p.object({outcome:p.literal(`ready`),entry:_d,document:au,screens:p.array(ou)}),yd=p.object({outcome:p.literal(`missing-resources`),entry:_d,document:au,screens:p.array(ou),missingScreenIds:p.array(p.uuid()).min(1)});p.discriminatedUnion(`outcome`,[vd,yd,p.object({outcome:p.literal(`corrupt`),entry:_d})]);const bd=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`current`),expectedVersion:p.number().int().positive()}),p.object({kind:p.literal(`version`),versionId:p.uuid()})]);p.object({canvasId:p.uuid(),target:bd,title:p.string().trim().min(1),description:p.string().trim().max(hd).nullable().default(null)}),p.object({canvasId:p.uuid(),versionId:p.uuid(),title:p.string().trim().min(1),description:p.string().trim().max(hd).nullable().default(null)}),p.object({canvasId:p.uuid(),versionId:p.uuid()}),p.object({entry:_d}),p.object({canvasId:p.uuid(),documentFormatVersion:Mc,versionId:p.uuid(),expectedVersion:p.number().int().positive()}),p.object({canvasId:p.uuid(),version:p.number().int().positive(),beforeVersionId:p.uuid(),restoredVersionId:p.uuid(),restoreFenceVersion:p.number().int().positive()}),p.object({canvasId:p.uuid(),documentFormatVersion:Mc,versionId:p.uuid(),organisationId:p.union([p.uuid(),p.literal(`personal`)]),title:p.string().trim().min(1).optional()}),p.object({canvasId:p.uuid(),title:p.string().min(1),version:p.literal(1)}),p.object({canvasId:p.uuid(),sourceCanvasId:p.uuid(),recordingIds:p.array(p.uuid()).min(1)}),p.object({copies:p.array(p.object({sourceRecordingId:p.uuid(),recordingId:p.uuid()}))});const xd=(e,t,n=1/0)=>{let r=e.split(` `).map(e=>Number(e.replace(`%`,``)));return r.every(e=>Number.isFinite(e)&&e>=t&&e<=n)&&(r.length===1||(r[0]??0)<=(r[1]??0))},Sd=p.string().regex(/^[a-f0-9]{64}$/u),Cd=p.string().trim().min(1),wd=p.object({organisationId:p.uuid().nullable()}),Td=p.object({family:p.string().regex(/^uploaded-font-[a-f0-9]{64}(?:-[a-f0-9]{12})?$/u),familyName:Cd,subfamilyName:Cd,version:Cd,weight:p.string().regex(/^\d+(?:\.\d+)?(?: \d+(?:\.\d+)?)?$/u).refine(e=>xd(e,1,1e3)),style:p.enum([`normal`,`italic`,`oblique`]),stretch:p.union([p.enum([`normal`,`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`]),p.string().regex(/^\d+(?:\.\d+)?%(?: \d+(?:\.\d+)?%)?$/u).refine(e=>xd(e,0))]),format:p.enum([`truetype`,`opentype`,`woff`,`woff2`])}),Ed=p.object({kind:p.enum([`personal`,`team`]),ownerId:p.uuid(),sha256:Sd}),Dd=wd.extend({sha256:Sd,bytes:p.number().int().positive(),contentType:p.enum(cc)});p.object({upload:F}),Dd.extend({metadata:Td,hasSharingRights:p.literal(!0)});const Od=Ed.extend({bytes:p.number().int().positive(),metadata:Td,createdAt:p.iso.datetime(),path:p.string().startsWith(`/v1/font-catalog/`)});p.object({entries:p.array(Od),canManage:p.boolean()}),wd.extend({sha256:Sd}),wd.extend({canvasId:p.uuid(),sha256:p.array(Sd).min(1)}),p.object({resources:p.array(p.object({entry:Od,path:p.string().startsWith(`/v1/canvas-assets/`)}))});const kd=p.object({inviteId:p.uuid(),email:p.string().max(254),accessLevel:Vo,sendCount:p.number().int().min(1),lastSentAt:p.iso.datetime(),expiresAt:p.iso.datetime(),state:p.enum([`pending`,`expired`]),deliveryState:p.enum([`queued`,`accepted`,`failed`]),deliveryError:p.string()});p.object({canvasTitle:p.string().min(1),invitedBy:p.string().min(1),email:p.string().max(254).pipe(p.email()),accessLevel:Vo,expiresAt:p.iso.datetime(),state:p.enum([`pending`,`accepted`]),hasAccount:p.boolean()}),p.object({canvasId:p.uuid(),email:p.string().max(254).transform(e=>e.trim().toLowerCase()).pipe(p.email()),accessLevel:Vo}),p.object({invite:kd,acceptToken:p.string().max(512).optional()}),p.object({canvasId:p.uuid()}),w(kd),p.object({canvasId:p.uuid(),inviteId:p.uuid()}),p.object({canvasId:p.uuid(),inviteId:p.uuid()});const Ad=p.string().min(1).max(512);p.object({token:Ad}),p.object({token:Ad}),p.object({canvasId:p.uuid(),accessLevel:Bo});const jd=p.object({personId:p.uuid().nullable(),email:p.string().max(254).nullable(),displayName:p.string().max(120).nullable(),initials:p.string().max(4).nullable(),avatarUrl:p.string().max(Io).nullable(),accessLevel:Bo,isPending:p.boolean(),reviewState:p.enum([`not-started`,`in-progress`,`done`]).nullable(),lastViewedAt:p.iso.datetime().nullable()});p.object({canvasId:p.uuid()}),w(jd),p.object({canvasId:p.uuid(),personId:p.uuid(),accessLevel:Vo}),p.object({canvasId:p.uuid(),personId:p.uuid()}),p.object({personId:p.uuid(),revoked:p.boolean()});const Md=p.object({canvasId:p.uuid(),reviewState:p.enum([`not-started`,`in-progress`,`done`])});p.object({reviewState:Md.shape.reviewState.nullable()});const Nd=Fo.extend({cursor:p.string().max(2048).nullable().default(null)}),Pd=p.object({selector:p.string().min(1),tagName:p.string().min(1),label:p.string().nullable(),source:p.object({file:p.string().min(1),line:p.number().int().min(0).nullable()}).nullable()}),Fd=p.object({x:p.number(),y:p.number()}),Id=p.object({x:p.number().min(0).max(1),y:p.number().min(0).max(1)}),Ld=p.object({x:p.number().min(0).max(1),y:p.number().min(0).max(1),width:p.number().min(0).max(1),height:p.number().min(0).max(1)}),Rd=Pd.extend({role:p.string().min(1).optional()}),zd=p.object({path:p.array(p.number().int().min(0)),offset:p.number().int().min(0)}),Bd=p.object({version:p.literal(1),kind:p.literal(`element`),locator:Rd,attachment:Id,fallbackBounds:Ld}),Vd=p.object({version:p.literal(1),kind:p.literal(`text`),root:Rd,quote:p.object({exact:p.string().min(1),prefix:p.string(),suffix:p.string()}),range:p.object({start:zd,end:zd}),attachment:Id,fallbackBounds:Ld}),Hd=p.object({version:p.literal(1),kind:p.literal(`elements`),members:p.array(Rd).min(2),truncated:p.boolean(),attachment:Id,fallbackBounds:Ld}),Ud=p.object({version:p.literal(1),kind:p.literal(`area`),bounds:Ld,attachment:Id}),Wd=p.discriminatedUnion(`kind`,[Bd,Vd,Hd,Ud]),Gd=p.discriminatedUnion(`on`,[p.object({on:p.literal(`canvas`),point:Fd,pageId:p.string().min(1).max(256).optional()}),p.object({on:p.literal(`node`),nodeId:p.string().min(1),point:Fd,element:p.null()}),p.object({on:p.literal(`screen`),nodeId:p.string().min(1),screenId:p.uuid(),point:Fd,element:Pd.nullable(),target:Wd.optional()})]),Kd=p.object({kind:p.enum([`person`,`agent`]),personId:p.uuid(),name:p.string().min(1).max(120),initials:p.string().min(1).max(4),avatarUrl:p.string().max(Io).nullable(),tokenLabel:p.string().max(120).nullable()}),qd=p.object({personId:p.uuid(),name:p.string().min(1).max(120)}),Jd=p.object({emoji:p.string().min(1).max(16),people:p.array(qd).min(1)}),Yd=p.object({messageId:p.uuid(),seq:p.number().int().min(1),body:p.string().min(1),isDeleted:p.boolean(),author:Kd,createdAt:p.iso.datetime(),editedAt:p.iso.datetime().nullable(),mentions:p.array(qd),reactions:p.array(Jd)}),Xd=p.object({kind:p.enum([`person`,`agent`]),personId:p.uuid(),name:p.string().min(1).max(120),tokenLabel:p.string().max(120).nullable()}),Zd=p.object({revision:p.number().int().positive(),threadId:p.uuid(),canvasId:p.uuid(),anchor:Gd,author:Kd,messages:p.array(Yd).min(1).max(50),messageCount:p.number().int().min(1),hasMoreMessages:p.boolean(),isResolved:p.boolean(),resolvedAt:p.iso.datetime().nullable(),resolvedBy:Xd.nullable(),createdAt:p.iso.datetime(),lastMessageAt:p.iso.datetime()}),Qd=p.strictObject({canvasRef:p.string().min(1),expectedVersion:p.number().int().positive()}),$d=Qd.extend({coordinateSpace:p.enum([`canvas-world`,`node-normalized`,`screen-normalized`])});p.object({context:Qd.optional(),page:Nd.optional(),canvasId:p.uuid(),filter:p.enum([`open`,`resolved`,`all`]).default(`open`),authorPersonId:p.uuid().optional(),agentActionable:p.boolean().default(!1),query:p.string().trim().max(200).optional()}),w(Zd).extend({nextCursor:p.string().nullable().optional()}),Nd.extend({context:Qd.optional(),canvasId:p.uuid(),threadId:p.uuid(),expectedRevision:p.number().int().positive().optional()}),p.object({thread:Zd.omit({messages:!0,hasMoreMessages:!0}),messages:p.array(Yd).max(100),nextCursor:p.string().nullable()}),p.object({context:$d.optional(),canvasId:p.uuid(),clientThreadId:p.uuid(),anchor:Gd,body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),p.object({context:Qd.optional(),canvasId:p.uuid(),threadId:p.uuid(),clientMessageId:p.uuid(),body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),Zd.extend({postedMessage:Yd}),p.object({canvasId:p.uuid(),threadId:p.uuid(),messageId:p.uuid(),body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),p.object({canvasId:p.uuid(),threadId:p.uuid(),messageId:p.uuid(),emoji:p.string().trim().min(1).max(16),reacted:p.boolean()}),p.object({canvasId:p.uuid(),threadId:p.uuid(),anchor:Gd}),p.object({context:Qd.optional(),expectedRevision:p.number().int().positive().optional(),canvasId:p.uuid(),threadId:p.uuid(),resolved:p.boolean()}),p.object({canvasId:p.uuid(),threadId:p.uuid(),messageId:p.uuid().optional()}),p.object({deletedThreadIds:p.array(p.uuid()),deletedMessageIds:p.array(p.uuid())});const q={shortText:200,name:100,label:500,page:50,cursor:64,questionOptions:3},J=p.uuid(),ef=p.string().min(1),tf=p.object({id:J,name:p.string().trim().min(1).max(q.name),content:p.string().trim().min(1),version:p.string().min(1).max(q.name)}),nf=p.object({canvasId:J,nodeId:ef,label:p.string(),role:p.enum([`target`,`reference`])}),rf=p.discriminatedUnion(`type`,[p.object({type:p.literal(`text`),text:p.string()}),nf.extend({type:p.literal(`object`)})]),af=p.object({revision:p.number().int().nonnegative(),text:p.string(),task:p.enum([`chat`,`rewrite`,`shorten`,`translate`,`replace`,`rename`]).default(`chat`),references:p.array(nf),contentVersion:p.literal(1).default(1),parts:p.array(rf).optional(),attachmentIds:p.array(J),model:p.enum([`default`,`sonnet`,`opus`,`haiku`]).default(`default`),effort:p.enum([`default`,`low`,`medium`,`high`]).default(`default`),instructions:p.array(p.object({name:p.string().max(q.name),content:p.string(),version:p.string().max(q.name)})).default([])}).transform(e=>{let t=e.parts??[...e.references.flatMap(e=>[{type:`object`,...e},{type:`text`,text:`
|
|
19
|
+
`}]),{type:`text`,text:e.text}],n=t.map(e=>e.type===`text`?e.text:e.label).join(``),r=new Map;for(let e of t){if(e.type===`text`)continue;let t=`${e.canvasId}:${e.nodeId}`,n=r.get(t);r.set(t,{canvasId:e.canvasId,nodeId:e.nodeId,label:e.label,role:n?.role===`target`?`target`:e.role})}return{...e,text:n,references:Array.from(r,([,e])=>e),parts:t}}),of=p.object({state:p.enum([`checking`,`not-installed`,`unsupported`,`signed-out`,`signing-in`,`connected`,`usage-limited`,`auth-expired`,`unavailable`]),version:p.string().nullable(),account:p.string().nullable(),issue:p.string().nullable()}),sf=p.object({canvasId:J,mutationId:J,previousVersion:p.number().int().positive(),version:p.number().int().positive(),nodeIds:p.array(ef),reverted:p.boolean().default(!1),review:_u.optional()}),cf=p.object({prompt:p.string().trim().min(1),options:p.array(p.string().trim().min(1).max(q.shortText)).max(q.questionOptions).refine(e=>new Set(e).size===e.length,`Options must be distinct.`).default([])}).extend({id:J,digest:p.string().min(1).max(q.name),state:p.enum([`pending`,`answered`,`cancelled`]),answer:p.string().nullable()}),lf=p.object({jobId:J,version:p.number().int().positive(),target:$c,state:p.enum([`rendered`,`checked`,`needs-review`]),summary:p.string().max(q.label)}),uf=p.object({parts:p.array(rf).optional(),id:p.string().min(1).max(q.shortText),role:p.enum([`user`,`assistant`,`tool`]),text:p.string(),tool:p.string().nullable().default(null),outcome:p.enum([`running`,`completed`,`denied`,`failed`]).nullable().default(null)}),df=p.object({id:p.string().min(1).max(q.shortText),tool:p.string().max(q.shortText),digest:p.string().max(q.name),input:p.record(p.string(),p.unknown())}),ff=p.object({mutationId:J,canvasId:J,procedure:p.enum([`canvas.applyOperations`,`canvas.render.importSource`]),input:p.record(p.string(),p.unknown()),state:p.enum([`recorded`,`accepted`,`unknown`,`refused`])}),pf=p.object({id:J,name:p.string().max(q.shortText),mediaType:p.enum([`image/png`,`image/jpeg`,`image/webp`]),width:p.number().int().positive(),height:p.number().int().positive(),bytes:p.number().int().positive(),preview:p.string().regex(/^data:image\/(?:png|jpeg|webp);base64,[A-Za-z0-9+/=]+$/u)}),mf=p.object({id:J,state:p.enum([`preparing`,`starting`,`running`,`waiting`,`stopping`,`reconciling`,`completed`,`stopped`,`failed`,`interrupted`,`needs-review`]),submittedDraft:af,attachments:p.array(pf).optional(),model:p.string().nullable().default(null),runtimeVersion:p.string().nullable().default(null),lastActivityAt:p.iso.datetime().optional(),stillWorking:p.boolean().default(!1),preparedContext:p.string().default(``),baseVersion:p.number().int().positive(),startedAt:p.iso.datetime(),endedAt:p.iso.datetime().nullable(),messages:p.array(uf),receipts:p.array(sf),inspections:p.array(lf).default([]),questions:p.array(cf).optional(),intents:p.array(ff).default([]),pending:df.nullable(),recoveryIssue:p.string().nullable().optional(),issue:p.string().nullable()}),hf=p.object({id:J,canvasId:J,ownerId:J,title:p.string().trim().min(1).max(q.shortText),titleSource:p.enum([`automatic`,`manual`]).optional(),visibility:p.enum([`private`,`shared`]),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime(),sessionId:J,hasSession:p.boolean(),draft:af,turns:p.array(mf),earlierMessages:p.number().int().nonnegative().optional(),sequence:p.number().int().nonnegative()}),Y=p.uuid(),gf=mf.pick({id:!0,state:!0,model:!0,runtimeVersion:!0,stillWorking:!0,startedAt:!0,endedAt:!0,messages:!0,attachments:!0,receipts:!0,inspections:!0,questions:!0,recoveryIssue:!0,issue:!0}),_f=p.object({canvasId:Y,chatId:Y,title:p.string().trim().min(1).max(q.shortText),visibility:p.enum([`private`,`shared`]),sequence:p.number().int().nonnegative(),mergeTurns:p.boolean().optional(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime(),turns:p.array(gf)}).omit({mergeTurns:!0}).extend({earlierMessages:p.number().int().nonnegative().optional(),ownerId:Y,ownerName:p.string().optional(),readSequence:p.number().int().nonnegative().optional(),unread:p.boolean().optional()});p.object({canvasId:Y,search:p.string().max(q.shortText).default(``),ownerId:Y.optional(),sort:p.enum([`date`,`unread`]).default(`date`),cursor:p.object({updatedAt:p.iso.datetime(),chatId:Y,unread:p.boolean().optional()}).optional(),limit:p.number().int().min(1).max(q.page).default(q.page)}),p.object({items:p.array(_f),next:p.object({updatedAt:p.iso.datetime(),chatId:Y,unread:p.boolean().optional()}).nullable()});const vf=p.object({canvasId:Y,chatId:Y});vf.extend({before:p.number().int().nonnegative().optional()}),p.object({chat:_f.nullable(),next:p.number().int().nonnegative().nullable()}),vf.extend({sequence:p.number().int().nonnegative()}),p.object({saved:p.boolean()}),p.object({canvasId:Y,cursor:p.string().max(q.cursor).default(``)}),p.object({cursor:p.string(),changed:p.boolean()});const yf=p.string().min(1),X=p.uuid();p.object({protocol:p.literal(4),shellVersion:p.string(),hostId:X.optional(),eventSequence:p.number().int().nonnegative().default(0),installationId:X,profileId:X.nullable(),credential:p.object({tokenId:X,expiresAt:p.iso.datetime()}).nullable().default(null),connection:of,chats:p.array(hf),chatPages:p.array(p.object({canvasId:X,hasMore:p.boolean()})).default([]),attachments:p.array(pf),instructions:p.array(tf).default([]),issue:p.string().nullable(),capabilities:p.object({images:p.boolean(),dictation:p.boolean()})});const bf=p.object({personId:X,tokenId:X,token:p.string().startsWith(`enh_`).max(q.label),expiresAt:p.iso.datetime()}),xf=p.object({canvasId:X,rootIds:p.array(yf),version:p.number().int().positive()});p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`desktop.describe`)}),p.object({kind:p.literal(`claude.status`)}),p.object({kind:p.literal(`claude.connect`)}),p.object({kind:p.literal(`claude.cancelConnection`)}),p.object({kind:p.literal(`claude.chooseExecutable`)}),p.object({kind:p.literal(`profile.connect`),profile:bf}),p.object({kind:p.literal(`profile.disconnect`)}),p.object({kind:p.literal(`instruction.import`),name:p.string().trim().min(1).max(q.name),content:p.string().trim().min(1)}),p.object({kind:p.literal(`instruction.remove`),instructionId:X}),p.object({kind:p.literal(`chat.list`),canvasId:X,more:p.boolean().optional()}),p.object({kind:p.literal(`chat.read`),chatId:X,more:p.boolean().optional()}),p.object({kind:p.literal(`chat.create`),canvasId:X,visibility:p.enum([`private`,`shared`])}),p.object({kind:p.literal(`chat.saveDraft`),chatId:X,expectedRevision:p.number().int().nonnegative(),draft:af}),p.object({kind:p.literal(`chat.rename`),chatId:X,title:p.string().trim().min(1).max(q.shortText)}),p.object({kind:p.literal(`chat.visibility`),chatId:X,visibility:p.enum([`private`,`shared`])}),p.object({kind:p.literal(`chat.delete`),chatId:X,stop:p.boolean()}),p.object({kind:p.literal(`turn.start`),chatId:X,draftRevision:p.number().int().nonnegative(),scope:xf}),p.object({kind:p.literal(`turn.stop`),chatId:X,turnId:X}),p.object({kind:p.literal(`turn.checkChanges`),chatId:X,turnId:X}),p.object({kind:p.literal(`turn.undo`),chatId:X,turnId:X}),p.object({kind:p.literal(`question.respond`),chatId:X,turnId:X,questionId:X,digest:p.string().min(1).max(q.name),answer:p.string().trim().min(1).nullable()}),p.object({kind:p.literal(`request.respond`),chatId:X,turnId:X,requestId:p.string().max(q.shortText),digest:p.string().max(q.name),allow:p.boolean()}),p.object({kind:p.literal(`attachment.choose`),chatId:X}),p.object({kind:p.literal(`attachment.prepare`),chatId:X,name:p.string().max(q.shortText),bytes:p.string()}),p.object({kind:p.literal(`attachment.remove`),chatId:X,attachmentId:X}),p.object({kind:p.literal(`desktop.update`)}),p.object({kind:p.literal(`desktop.retryHost`)}),p.object({kind:p.literal(`desktop.openHistory`)})]);const Sf=p.string().trim().min(1).max(2e3);p.object({message:Sf,diagnostics:p.unknown().optional(),workspaceId:p.uuid().optional(),canvasId:p.uuid().optional()}),p.object({status:p.enum([`sent`,`unavailable`,`unconfirmed`]),attemptId:p.uuid(),retryAfterSeconds:p.number().int().min(1).max(3600).optional()});const Cf=p.enum([`home`,`recents`,`shared`,`trash`,`team`,`canvas`,`invite`,`sign-in`,`sign-up`,`other`]),wf=p.enum([`Error`,`TypeError`,`RangeError`,`ReferenceError`,`SyntaxError`,`URIError`,`AbortError`,`NetworkError`,`SecurityError`,`UnhandledRejection`]),Tf=1e6,Ef=p.number().int().min(0).max(864e5),Df=p.object({name:wf,atMs:Ef,source:p.enum([`application`,`external`,`unknown`]),line:p.number().int().min(0).max(Tf).optional(),column:p.number().int().min(0).max(Tf).optional()}),Of=p.object({path:p.string().max(256).regex(/^(?:canvas|comment|organisation|person|prototype|recording|recordingAsset|screen|transcript|telemetry)(?:\.[A-Za-z]+){1,4}$/u),status:p.enum([`ok`,`refused`,`unavailable`,`cancelled`]),durationMs:Ef,atMs:Ef,correlationId:p.uuid().optional()}),kf=p.object({action:p.enum([`navigate`,`feedback.open`]),route:Cf,atMs:Ef}),Af=p.string().max(512).transform((e,t)=>{let n=URL.parse(e),r=n?.searchParams.get(`replay_id`),i=n?.searchParams.get(`distinct_id`),a=n?.searchParams.get(`token`);return typeof a!=`string`||n?.origin!==`https://mixpanel.com`||n.pathname!==`/projects/replay-redirect`||!p.uuid().safeParse(r).success||!p.uuid().safeParse(i).success||!/^[\da-f]{32}$/iu.test(a)?(t.addIssue({code:`custom`,message:`unsupported replay reference`}),p.NEVER):`https://mixpanel.com/projects/replay-redirect?${new URLSearchParams({replay_id:r??``,distinct_id:i??``,token:a}).toString()}`});p.object({route:Cf,environment:p.object({browser:p.enum([`Chrome`,`Edge`,`Firefox`,`Safari`,`Other`]),os:p.enum([`macOS`,`Windows`,`Linux`,`iOS`,`Android`,`Other`]),release:p.string().max(256).regex(/^[\w.+-]+$/u)}),errors:p.array(Df).max(10),api:p.array(Of).max(10),activity:p.array(kf).max(20),replayUrl:Af.optional().catch(void 0)});const jf=p.enum([`owner`,`admin`,`member`]),Mf=p.enum([`can-view`,`can-comment`,`can-edit`]),Nf=p.object({id:p.uuid(),name:p.string().min(1).max(120),role:jf});p.object({}),w(Nf),p.object({name:p.string().trim().min(1).max(120)}),p.object({organisation:Nf}),p.object({organisationId:p.uuid(),name:p.string().trim().min(1).max(120)}),p.object({organisationId:p.uuid()}),p.object({organisationId:p.uuid(),movedCanvasCount:p.number().int().min(0)});const Pf=p.object({personId:p.uuid(),displayName:p.string().max(120),initials:p.string().max(4),avatarUrl:p.string().max(Io).nullable().optional(),email:p.string().max(254).nullable(),contentAccess:Mf.default(`can-comment`),role:jf});p.object({organisationId:p.uuid()}),w(Pf),p.object({organisationId:p.uuid(),email:p.email().trim().toLowerCase().max(254),role:p.enum([`admin`,`member`]).default(`member`),contentAccess:Mf.default(`can-comment`)}),p.object({personId:p.uuid()}),p.object({organisationId:p.uuid(),personId:p.uuid(),role:p.enum([`admin`,`member`])}).pick({personId:!0,role:!0}),p.object({organisationId:p.uuid(),personId:p.uuid(),contentAccess:Mf}).pick({personId:!0,contentAccess:!0}),p.object({organisationId:p.uuid(),personId:p.uuid()}),p.object({personId:p.uuid(),removed:p.literal(!0)}),p.object({organisationId:p.uuid(),personId:p.uuid()}),p.object({ownerPersonId:p.uuid()});const Ff=p.object({inviteId:p.uuid(),email:p.string().max(254).pipe(p.email()),contentAccess:Mf.default(`can-comment`),role:p.enum([`admin`,`member`]),sendCount:p.number().int().min(1),lastSentAt:p.iso.datetime(),expiresAt:p.iso.datetime(),state:p.enum([`pending`,`expired`]),deliveryState:p.enum([`queued`,`accepted`,`failed`]),deliveryError:p.string()});p.object({organisationId:p.uuid(),email:p.string().trim().toLowerCase().max(254).pipe(p.email()),role:p.enum([`admin`,`member`]).default(`member`),contentAccess:Mf.default(`can-comment`)}),p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`member`),personId:p.uuid()}),p.object({kind:p.literal(`invitation`),invite:Ff})]),p.object({invite:Ff}),p.object({organisationId:p.uuid()}),w(Ff),p.object({organisationId:p.uuid(),inviteId:p.uuid()}).extend({});const If=p.string().min(1).max(512);p.object({token:If}),p.object({token:If}),p.object({teamName:p.string().min(1).max(120),invitedBy:p.string().min(1).max(120),email:p.string().max(254).pipe(p.email()),contentAccess:Mf.default(`can-comment`),role:p.enum([`admin`,`member`]),expiresAt:p.iso.datetime(),state:p.enum([`pending`,`accepted`]),hasAccount:p.boolean()}),p.object({organisationId:p.uuid()});const Lf=p.object({id:p.uuid(),label:p.string().min(1).max(120),createdAt:p.iso.datetime(),lastUsedAt:p.iso.datetime().nullable(),expiresAt:p.iso.datetime().nullable(),revoked:p.boolean()});p.object({label:p.string().trim().min(1).max(120).describe(`Label naming the agent.`),expiresAt:p.iso.datetime().nullable().describe(`Expiry timestamp, or null for a token that does not expire.`)}),p.object({token:p.string().startsWith(`enh_`),agentToken:Lf}),p.object({}),p.object({items:p.array(Lf),isConnected:p.boolean()}),p.object({tokenId:p.uuid()}),p.object({tokenId:p.uuid(),revoked:p.literal(!0)}),p.discriminatedUnion(`method`,[p.object({method:p.literal(`token`)}),p.object({method:p.literal(`browser`),issuer:p.url(),clientId:p.string().min(1),scope:p.literal(`openid`)})]);const Rf=p.object({id:p.uuid(),preparedCanvasId:p.uuid(),displayName:p.string().min(1).max(120),initials:p.string().min(1).max(4),avatarUrl:p.string().max(Io).nullable(),email:p.string().max(254).nullable(),createdAt:p.iso.datetime()});p.object({}),p.object({person:Rf.nullable(),authentication:p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`anonymous`)}),p.object({kind:p.literal(`person`)}),p.object({kind:p.literal(`agent`),tokenId:p.uuid(),tokenLabel:p.string(),expiresAt:p.iso.datetime().nullable()}),p.object({kind:p.literal(`oauth-agent`),tokenId:p.uuid(),tokenLabel:p.string(),clientId:p.string().min(1),scopes:p.array(p.string()),expiresAt:p.iso.datetime(),resource:p.url()})])}),p.object({displayName:p.string().trim().min(1).max(120)}),p.object({person:Rf});const zf=p.string().trim().toLowerCase().min(3).max(40).regex(/^[a-z0-9][a-z0-9._-]*$/,`letters, digits, dot, underscore and dash only`),Bf=p.enum([`cookie`,`token`]).default(`cookie`);p.object({username:zf,password:p.string().min(10).max(200),displayName:p.string().trim().min(1).max(120),deliver:Bf,email:p.string().max(254).transform(e=>e.trim().toLowerCase()).pipe(p.email())}),p.object({username:zf,password:p.string().min(1).max(200),deliver:Bf}),p.object({person:Rf,token:p.string().nullable()}).extend({preparedCanvasId:p.uuid()}),p.object({}),p.object({signedOut:p.literal(!0)});const Vf=p.enum([`image/jpeg`,`image/png`,`image/webp`]);p.object({contentType:Vf,bytes:p.number().int().positive()}),p.object({assetId:p.uuid(),upload:p.object({url:p.url(),headers:p.record(p.string(),p.string()),expiresAt:p.iso.datetime()})}),p.object({assetId:p.uuid()}),p.object({assetId:p.uuid(),previewUrl:p.url()}),p.object({abandoned:p.boolean()}),p.object({requestId:p.uuid(),displayName:p.string().trim().min(1).max(120),photoAssetId:p.uuid().optional()}),p.object({person:Rf});const Hf=p.string().max(254).pipe(p.email()),Uf=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`person`),personId:p.uuid(),displayName:p.string().min(1).max(120),initials:p.string().min(1).max(4),avatarUrl:p.string().max(Io).nullable().optional(),email:Hf}),p.object({kind:p.literal(`email`),email:Hf})]);p.object({query:p.string().trim().min(1).max(200)});const Wf=p.object({recipients:p.array(Uf).max(5)});p.object({}),Wf.extend({});const Gf=`enhance3:session-handoff`;p.union([p.object({kind:p.literal(Gf),body:p.object({token:p.string().min(1),displayName:p.string().min(1)})}),p.object({kind:p.literal(Gf),signedOut:p.literal(!0)})]);const Kf=p.string().length(64).refine(e=>{for(let t of e)if(!/[\da-f]/u.test(t))return!1;return!0}),qf=e=>{for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e===127||e<=31))return!0}return!1},Jf=p.string().min(1).refine(e=>e===e.normalize(`NFC`),{message:`prototype paths must use NFC Unicode normalization`}).refine(e=>!e.startsWith(`/`)&&!/^[A-Za-z]:\//u.test(e)&&!e.endsWith(`/`)&&!e.includes(`\\`)&&!qf(e)&&!e.startsWith(`__enhance/`)&&e.split(`/`).every(e=>e!==``&&e!==`.`&&e!==`..`),{message:`prototype paths must be portable relative file paths`}),Yf=p.object({path:Jf,contentType:p.string().trim().min(1).max(200).refine(e=>!qf(e)),bytes:p.number().int().nonnegative().max(2**53-1),sha256:Kf});p.object({version:p.literal(1),entryPath:Jf,files:p.array(Yf).min(1)});const Xf=p.object({artifactBytes:p.number().int().positive().max(2**53-1),expandedBytes:p.number().int().positive().optional(),fileBytes:p.number().int().positive().max(2**53-1),manifestBytes:p.number().int().positive().optional(),fileCount:p.number().int().positive().optional(),pathBytes:p.number().int().positive().max(2**53-1)});p.object({}),p.object({attachmentProtocolVersion:p.literal(1).optional(),protocolVersion:p.literal(1),format:p.literal(`zip`),limits:Xf});const Zf=p.object({protocolVersion:p.literal(1),format:p.literal(`zip`),bytes:p.number().int().positive().max(2**53-1),sha256:Kf,fileCount:p.number().int().positive().max(2**53-1),expandedBytes:p.number().int().positive().max(2**53-1)});p.object({canvasId:p.uuid(),targetMode:p.enum([`node`,`prototype`]).optional(),canvasPageId:p.string().min(1).optional(),prototypeId:p.uuid().optional(),clientToken:p.uuid(),nodeId:p.string().min(1),title:p.string().trim().min(1).max(200),entryPath:Jf,artifact:Zf,box:I.extend({width:p.number().positive(),height:p.number().positive()})});const Qf=p.enum([`uploading`,`queued`,`ingesting`,`ready`,`failed`,`abandoned`]),$f=p.array(p.object({path:p.string().min(1),code:p.string().min(1)})),ep=p.object({prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),alreadyExists:p.boolean(),artifact:Zf});p.discriminatedUnion(`state`,[ep.extend({state:p.literal(`uploading`),upload:F}),ep.extend({state:p.enum([`queued`,`ingesting`,`ready`,`failed`,`abandoned`])})]);const tp=p.object({canvasId:p.uuid(),deploymentId:p.uuid()});p.object({deploymentId:p.uuid(),state:Qf}),p.object(tp.shape);const np=p.object({prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),fileCount:p.number().int().nonnegative(),totalBytes:p.number().int().nonnegative().max(2**53-1),processedFiles:p.number().int().nonnegative(),unavailableFiles:$f.optional()});p.discriminatedUnion(`state`,[np.extend({state:p.literal(`failed`),failure:p.object({code:p.string().min(1),message:p.string().min(1),path:Jf.optional()})}),np.extend({state:p.enum([`uploading`,`queued`,`ingesting`,`ready`,`abandoned`])})]),p.object({canvasId:p.uuid(),deploymentId:p.uuid(),baseVersion:p.number().int().positive(),canvasPageId:p.string().min(1).optional(),attachment:p.object({clientToken:p.uuid(),scope:p.object({pageId:p.string().min(1).optional(),nodeIds:p.array(p.string().min(1))})}).optional()}),p.object({canvasId:p.uuid(),prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),version:p.number().int().positive(),state:p.literal(`ready`),origin:p.url(),openUrl:p.string().startsWith(`/c/`),canvasUrl:p.url().optional(),unavailableFiles:$f.optional(),attachment:p.discriminatedUnion(`outcome`,[p.object({outcome:p.literal(`committed`),mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive()}),p.object({outcome:p.literal(`no_op`),version:p.number().int().positive()})]).optional()});const rp=p.string().min(1).refine(e=>!e.startsWith(`/`)&&!e.endsWith(`/`)&&!e.includes(`\\`)&&!e.includes(`\0`)&&e.split(`/`).every(e=>e!==``&&e!==`.`&&e!==`..`),{message:`prototype paths must be portable relative file paths`}),ip=p.object({path:rp,contentType:p.string().min(1).max(200),bytes:p.number().int().nonnegative()}),ap=p.enum([`uploading`,`verifying`,`ready`,`failed`,`abandoned`]);p.object({canvasId:p.uuid(),prototypeId:p.uuid().optional(),clientToken:p.uuid(),nodeId:p.string().min(1),targetMode:p.enum([`node`,`prototype`]).optional(),canvasPageId:p.string().min(1).optional(),title:p.string().trim().min(1).max(200),entryPath:rp.default(`index.html`),files:p.array(ip).min(1),box:I.extend({width:p.number().positive(),height:p.number().positive()})}),p.object({prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),state:ap,alreadyExists:p.boolean(),fileCount:p.number().int().positive(),totalBytes:p.number().int().positive()}),p.object({canvasId:p.uuid(),deploymentId:p.uuid(),cursor:p.number().int().min(0).default(0)});const op=p.object({path:rp,upload:F});p.object({deploymentId:p.uuid(),uploads:p.array(op).max(50),nextCursor:p.number().int().min(0).optional()}),p.object({canvasId:p.uuid(),deploymentId:p.uuid(),baseVersion:p.number().int().positive(),canvasPageId:p.string().min(1).optional()}),p.object({canvasId:p.uuid(),prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),version:p.number().int().positive(),state:p.literal(`ready`),origin:p.url(),openUrl:p.string().startsWith(`/c/`),canvasUrl:p.url().optional(),unavailableFiles:$f.optional()}),p.object({context:p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`live`),nodeId:p.string().min(1)}),p.object({kind:p.literal(`version`),nodeId:p.string().min(1),versionEntryId:p.uuid()})]).optional(),canvasId:p.uuid(),prototypeId:p.uuid(),deploymentId:p.uuid()}),p.object({deploymentId:p.uuid(),origin:p.url(),bootUrl:p.url(),expiresAt:p.iso.datetime()});const sp=m.int().check(m.minimum(0),m.maximum(6e5)),cp=m.enum([`none`,`completed`,`background`,`failed`]);m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.gate`),generation:m.uuid(),nonce:m.uuid(),outcome:m.enum([`opening`,`migrating`,`accepted`,`expired-or-used`,`temporary-error`,`denied`]),timing:m.optional(m.object({exchangeMs:sp,migration:cp,migrationWaitMs:sp}))}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.capture`),requestId:m.uuid(),connectionId:m.optional(m.uuid()),documentId:m.optional(m.uuid()),format:m.optional(m.literal(`menu-svg`))});const lp=m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.connect`),connectionId:m.uuid()});m.extend(lp,{type:m.literal(`enhance.prototype.connected`),documentId:m.uuid(),capabilities:m.array(m.string()),release:m.string().check(m.minLength(1))}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.unloading`),documentId:m.uuid()}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.ready`),inputVersion:m.optional(m.int()),build:m.optional(m.string()),capabilities:m.optional(m.array(m.string()))});const up=m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.present`),generation:m.uuid(),nonce:m.uuid()});m.extend(up,{type:m.literal(`enhance.prototype.presented`),documentId:m.uuid()}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.escape`)}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.zoom`),deltaX:m.number(),deltaY:m.number(),deltaMode:m.union([m.literal(0),m.literal(1),m.literal(2)]),anchorX:m.number().check(m.minimum(0),m.maximum(1)),anchorY:m.number().check(m.minimum(0),m.maximum(1))}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.navigate`),direction:m.enum([`back`,`forward`,`reload`])}),m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.navigation`),path:m.optional(m.string()),canGoBack:m.boolean(),canGoForward:m.boolean(),isNavigating:m._default(m.boolean(),!1)});const dp=m.object({artifact:m.string().check(m.minLength(1)),viewport:m.object({width:m.number().check(m.positive()),height:m.number().check(m.positive())}),title:m.string(),files:m.optional(m.object({named:m.array(m.string()),fetched:m.array(m.object({url:m.string(),contentType:m.string(),bytes:m.custom(e=>Object.prototype.toString.call(e)===`[object ArrayBuffer]`)}))}))}),fp=m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.captured`),requestId:m.uuid(),connectionId:m.optional(m.uuid()),documentId:m.optional(m.uuid())});m.discriminatedUnion(`outcome`,[m.extend(fp,{outcome:m.literal(`captured`),screen:dp,issues:m.optional(ta)}),m.extend(fp,{outcome:m.literal(`menu-svg`),markup:m.string().check(m.startsWith(`data:image/svg+xml`))}),m.extend(fp,{outcome:m.literal(`failed`),error:m.string().check(m.minLength(1)),code:m.optional(m.enum([`capture-failed`,`capture-busy`]))})]);const pp=m.number().check(m.minimum(0),m.maximum(6e4)),mp={wheelQuietMs:280,pointerSlopPx:4,singleAxisRatio:1.2,momentumTailSpeed:100,axisRatio:1.25,openingSamplePx:4,openingWindowMs:35},hp=m.object({directionConfirmation:m._default(m.literal(`next-sample`),`next-sample`),openingSamplePx:m._default(m.number().check(m.minimum(0),m.maximum(16)),mp.openingSamplePx),openingWindowMs:m._default(m.number().check(m.minimum(0),m.maximum(50)),mp.openingWindowMs),canvasProtection:m._default(m.literal(`slow-tail`),`slow-tail`),momentumTailSpeed:m._default(m.number().check(m.minimum(0),m.maximum(1e3)),mp.momentumTailSpeed),wheelQuietMs:m._default(pp,mp.wheelQuietMs),pointerSlopPx:m._default(m.number().check(m.minimum(0),m.maximum(50)),mp.pointerSlopPx),singleAxisRatio:m._default(m.number().check(m.minimum(.25),m.maximum(4)),mp.singleAxisRatio),axisRatio:m._default(m.number().check(m.minimum(1),m.maximum(4)),mp.axisRatio)});hp.parse({});const gp=m.object({inputVersion:m.literal(2)});m.extend(gp,{type:m.literal(`enhance.prototype.input-context`),settings:hp,navigationAt:m.number(),canvasPhysicalAt:m._default(m.number(),0),canvasSubstantialAt:m._default(m.number(),0),canvasSpeed:m._default(m.number().check(m.nonnegative()),0),canvasWheelUntil:m.number(),canvasMomentum:m.nullable(m.boolean()),escapeAt:m._default(m.number(),0),escapePending:m._default(m.boolean(),!1),appWheelUntil:m._default(m.number(),0),appMomentum:m._default(m.nullable(m.boolean()),null),toolOwnsInput:m.boolean(),interactive:m._default(m.boolean(),!0),pointerPan:m.optional(m.boolean()),pointerPanId:m.optional(m.int().check(m.nonnegative())),pointer:m.nullable(m.object({x:m.number(),y:m.number()})),cursor:m.optional(m.nullable(m.object({anchor:m.nullable(m.object({x:m.number(),y:m.number()})),fallback:m.string(),pointerTime:m.number()}))),visible:m.boolean()});const _p=m.extend(gp,{type:m.literal(`enhance.prototype.wheel`),deltaX:m.number(),deltaY:m.number(),zoom:m.boolean(),momentum:m.nullable(m.boolean()),openingHandoff:m.optional(m.boolean()),anchorX:m.number().check(m.minimum(0),m.maximum(1)),anchorY:m.number().check(m.minimum(0),m.maximum(1))}),vp=m.extend(gp,{type:m.literal(`enhance.prototype.pan`),phase:m.enum([`start`,`move`,`end`,`cancel`]),pointerId:m.int().check(m.nonnegative()),clientPoint:m.optional(m.object({x:m.number(),y:m.number()})),screenX:m.number(),screenY:m.number(),anchorX:m.number().check(m.minimum(0),m.maximum(1)),anchorY:m.number().check(m.minimum(0),m.maximum(1))}),yp=m.extend(gp,{type:m.literal(`enhance.prototype.input-activity`),owner:m.enum([`app`,`canvas`,`none`]),reason:m.string().check(m.maxLength(120)),momentum:m.nullable(m.boolean()),focused:m.boolean(),hovered:m._default(m.boolean(),!1),suppressed:m._default(m.boolean(),!1),protected:m.boolean(),screenX:m.number(),screenY:m.number(),pointerAnchor:m._default(m.nullable(m.object({x:m.number(),y:m.number()})),null),pointerTime:m._default(m.number(),0),kind:m.enum([`pointer`,`interaction`,`wheel`,`focus`,`protection`,`escape`,`select`])}),bp=m.extend(gp,{type:m.literal(`enhance.prototype.input-ready`),build:m.string().check(m.maxLength(120))}),xp=m.extend(gp,{type:m.literal(`enhance.prototype.context-menu`),anchorX:m.number().check(m.minimum(0),m.maximum(1)),anchorY:m.number().check(m.minimum(0),m.maximum(1)),keyboard:m.boolean(),ctrlKey:m.boolean(),metaKey:m.boolean()});m.discriminatedUnion(`type`,[_p,yp,bp,vp,xp]);const Sp=2166136261,Cp=Number.parseInt(`9e3779b9`,16),wp=Number.parseInt(`85ebca6b`,16),Tp=Number.parseInt(`c2b2ae35`,16);Sp^Cp,Sp^wp,Sp^Tp;const Ep=p.object({width:p.number().int().positive(),height:p.number().int().positive()}),Dp=p.object({mimeType:p.string().min(1).max(100),sampleRate:p.number().int().min(8e3).max(192e3)});p.object({sourceUrl:p.string(),viewport:Ep,pageTitle:p.string().nullable(),audio:Dp.nullable().default(null)}),p.object({recordingId:p.uuid(),ownerPersonId:p.uuid(),chunkIndex:p.literal(0),upload:F,audioUpload:F.nullable()}),p.object({recordingId:p.uuid(),index:p.number().int().min(0),firstEventMs:p.number().int().min(0),lastEventMs:p.number().int().min(0),eventCount:p.number().int().min(0),continues:p.boolean().default(!1),bytes:p.number().int().min(1),etag:p.string().min(1).max(200).optional()}),p.object({nextChunkIndex:p.number().int().min(1),upload:F}),p.object({recordingId:p.uuid(),index:p.number().int().min(0),firstMs:p.number().int().min(0),lastMs:p.number().int().min(0),bytes:p.number().int().min(1),epoch:p.number().int().min(0).default(0),startsEpoch:p.boolean().default(!1),etag:p.string().min(1).max(200).optional()}),p.object({nextChunkIndex:p.number().int().min(1),upload:F}),p.object({recordingId:p.uuid(),durationMs:p.number().int().min(0),viewport:Ep,sourceUrl:p.string(),interrupted:p.boolean().default(!1),canvasId:p.uuid().optional(),organisationId:p.uuid().optional(),audioChunkCount:p.number().int().min(0).default(0),hasRecoverableBytes:p.boolean().default(!1)}).refine(e=>e.canvasId===void 0||e.organisationId===void 0,{message:`choose an existing canvas or a team for a new canvas, not both`});const Op=p.enum([`whole`,`recovering`,`partial`]),kp=p.enum([`dom`,`audio`]);p.object({recordingId:p.uuid(),canvasId:p.uuid(),canvasTitle:p.string().min(1),isNewCanvas:p.boolean(),storedChunkCount:p.number().int().min(0),missingChunkIndexes:p.array(p.number().int().min(0)).max(64),missingChunkCount:p.number().int().min(0),storedAudioChunkCount:p.number().int().min(0),missingAudioChunkIndexes:p.array(p.number().int().min(0)).max(64),missingAudioChunkCount:p.number().int().min(0),integrity:Op});const Ap=p.object({recordingId:p.uuid(),durationMs:p.number().int().min(0),viewport:Ep,interrupted:p.boolean(),chunkCount:p.number().int().min(0),startedAt:p.iso.datetime(),isCopy:p.boolean()}),jp=p.array(p.object({url:p.url(),contentType:p.string().min(1).max(200),byteSize:p.number().int().min(1),sha256:p.string().regex(/^[a-f0-9]{64}$/u).optional()})).max(400);p.union([p.object({recordingId:p.uuid(),assets:jp}),p.object({screenId:p.uuid(),assets:jp})]),p.object({reserved:p.array(p.object({url:p.string(),upload:F}))});const Mp=p.array(p.object({url:p.url(),etag:p.string().min(1).max(200),byteSize:p.number().int().min(1)})).max(400);p.union([p.object({recordingId:p.uuid(),arrived:Mp}),p.object({screenId:p.uuid(),arrived:Mp})]),p.object({missingAssetCount:p.number().int().min(0)}),p.object({canvasId:p.uuid(),recordingId:p.uuid()});const Np=p.object({seq:p.number().int().min(0),firstEventMs:p.number().int().min(0),lastEventMs:p.number().int().min(0),continues:p.boolean()}),Pp=p.discriminatedUnion(`state`,[Np.extend({state:p.literal(`available`),download:tc}),Np.extend({state:p.literal(`missing`)})]),Fp=p.object({seq:p.number().int().min(0),firstMs:p.number().int().min(0),lastMs:p.number().int().min(0),epoch:p.number().int().min(0),startsEpoch:p.boolean()}),Ip=p.discriminatedUnion(`state`,[Fp.extend({state:p.literal(`available`),download:tc}),Fp.extend({state:p.literal(`missing`)})]);p.object({recordingId:p.uuid(),durationMs:p.number().int().min(0),viewport:Ep,sourceUrl:p.string(),interrupted:p.boolean(),integrity:Op,chunks:p.array(Pp),audio:p.object({mimeType:p.string(),chunks:p.array(Ip)}).nullable(),assets:p.array(p.object({url:p.string(),contentType:p.string(),path:p.string().startsWith(`/v1/recording-assets/`)})),missingAssetCount:p.number().int().min(0),missingAssetUrls:p.array(p.string()).optional()});const Lp=p.object({recordingId:p.uuid(),track:kp,index:p.number().int().min(0)});p.object({upload:F}),Lp.extend({etag:p.string().min(1).max(200)}),p.object({integrity:Op}),p.object({canvasId:p.uuid()}),w(Ap).extend({unreadableCount:p.number().int().min(0)}),p.object({recordingId:p.uuid()}),p.object({recordingId:p.uuid(),discarded:p.literal(!0)}),p.object({canvasId:p.uuid(),recordingId:p.uuid()}),p.object({recordingId:p.uuid(),detachedScreenCount:p.number().int().min(0)}),[`[data-enhance-unsupported]:not([data-enhance-unsupported-hidden]):not([style*="display: none"]) {
|
|
20
20
|
align-items: center !important;
|
|
21
21
|
background-color: #f7f7f8 !important;
|
|
22
22
|
background-image: linear-gradient(to top right, transparent calc(50% - 1px), #a8a8b0 50%, transparent calc(50% + 1px)), linear-gradient(to bottom right, transparent calc(50% - 1px), #a8a8b0 50%, transparent calc(50% + 1px)) !important;
|
|
@@ -31,9 +31,9 @@ Write one visual group at a time. Use --review none for a committed receipt, the
|
|
|
31
31
|
}`,`[data-enhance-unsupported-hidden], [data-enhance-unsupported][style*="display: none"] {
|
|
32
32
|
display: none !important;
|
|
33
33
|
}`].join(`
|
|
34
|
-
`),p.object({clientToken:p.uuid(),isRecordingMark:p.boolean().default(!0),provenance:p.object({sourceRecordingId:p.uuid(),atMs:p.number().int().min(0)}).nullable(),route:p.string().nullable(),pageTitle:p.string().nullable(),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()}),bytes:p.number().int().min(1).max(2**53-1),sha256:p.string().regex(/^[a-f0-9]{64}$/u).optional()}),p.object({screenId:p.uuid(),upload:P,alreadyExists:p.boolean(),state:p.enum([`pending`,`stored`])}),p.object({screenId:p.uuid(),etag:p.string().min(1).max(200)}),p.object({screenId:p.uuid(),storedBytes:p.number().int().min(1),uploadedAt:p.iso.datetime()}),p.object({screenId:p.uuid()}),p.object({screenId:p.uuid(),deletedThreadCount:p.number().int().min(0)}),p.object({code:p.enum([`BAD_REQUEST`,`UNAUTHORIZED`,`FORBIDDEN`,`NOT_FOUND`,`CONFLICT`,`RATE_LIMITED`,`INTERNAL`]),message:p.string().min(1),fields:p.record(p.string(),p.string()).optional()}),p.object({canvasId:p.uuid(),attemptId:p.uuid(),sourceNodeId:p.string().min(1),releaseIdentity:p.string().min(1).max(100),outcome:p.enum([`started`,`succeeded`,`blocked`,`failed`]),reason:p.enum([`none`,`pending-changes`,`editor-busy`,`editor-stale`,`editor-read-only`,`source-missing`,`editor-changed`,`cancelled`,`source-invalid-box`,`source-loading`,`source-unavailable`,`source-unreadable`,`source-changed`,`source-unsettled`,`captured-fonts-unavailable`,`conversion-failed`]),durationMs:p.number().int().min(0).max(18e5)}),p.object({accepted:p.literal(!0)});const Rp=p.enum([`answered`,`skipped`,`none`]),Z=p.number().int().min(0).max(18e5),Q=p.number().int().min(0).max(1e6),zp={canvasId:p.uuid(),clientViewId:p.uuid(),releaseIdentity:p.string().min(1).max(100),capabilityVersion:p.number().int().min(1).max(16)},Bp={longTaskCount:Q,longTaskTotalMs:Z,longestTaskMs:Z,loafCount:Q,loafTotalBlockingMs:Z,loafLongestBlockingMs:Z,loafStyleAndLayoutMs:Z,loafTopScriptMs:Z,loafTopScriptSource:p.enum([`app`,`extension`,`third-party`,`unknown`])};p.discriminatedUnion(`name`,[p.object({...zp,...Bp,name:p.literal(`canvas_load`),outcome:p.enum([`ready`,`slow`,`degraded`,`timed-out`,`unavailable`]),bottleneck:p.enum([`metadata`,`details`,`document`,`walkthrough-list`,`restore`,`projection`,`sources`,`replays`]),browserCopyCheck:Rp.optional(),durationMs:Z,shellMs:Z,projectionMs:Z,sourcesMs:Z,replaysMs:Z,nodeCount:Q,recordingCount:Q,screenCount:Q,replayCount:Q,unavailableSourceCount:Q,assetFailureCount:Q,apiRequestCount:Q,apiLongestMs:Z,mirroredAssetRequestCount:Q,mirroredAssetUniqueCount:Q,mirroredAssetTransferBytes:p.number().int().min(0).max(1073741824)}),p.object({...zp,...Bp,name:p.literal(`canvas_interaction`),kind:p.enum([`pan`,`zoom`,`drag`,`edit`]),outcome:p.enum([`smooth`,`janky`,`refused`]),pendingCandidateCount:Q.optional(),durationMs:Z,frameCount:Q,slowFrameCount:Q,worstFrameMs:Z,nodeCount:Q,replayCount:Q}),p.object({...zp,name:p.literal(`canvas_measurement`),outcome:p.literal(`drift`),layerCount:Q}),p.object({...zp,name:p.literal(`prototype_open`),kind:p.enum([`open`,`recovered`,`capabilities`]).optional(),navigationId:p.uuid().optional(),captureReady:p.boolean().optional(),deploymentId:p.uuid(),outcome:p.enum([`loaded`,`still-opening`,`failed`]),reason:p.enum([`none`,`ticket-refused`,`ticket-failed`,`denied`,`expired-or-used`,`temporary-error`,`deadline`,`ticket-held`,`gate-silent`,`exchange-held`,`document-held`,`document-unconfirmed`]),attempts:p.number().int().min(1).max(16),durationMs:Z,ticketMs:Z,exchangeMs:Z.nullable(),migration:p.enum([`none`,`completed`,`background`,`failed`,`unknown`]),migrationWaitMs:Z.nullable(),liveMs:Z.nullable(),inputReady:p.boolean()}),p.object({...zp,name:p.literal(`canvas_realtime`),kind:p.enum([`room-ready`,`reconnect`,`recovery`]),outcome:p.enum([`succeeded`,`failed`]),reason:p.enum([`initial`,`transport`,`snapshot`,`gap`,`replace`,`relay`,`history-restored`]),durationMs:Z})]),p.object({accepted:p.literal(!0)});const Vp=1e7,Hp=p.number().int().min(0).max(1e3),Up=p.strictObject({version:p.literal(1),severity:p.enum([`fatal`,`contained`,`recovered`]),boundary:p.enum([`application`,`properties`,`layers`,`stage`]),phase:p.enum([`render`,`bootstrap`,`event`,`async`,`empty`,`startup`]),errorCode:p.enum([`select-value-unavailable`,`select-options-duplicate`,`render-loop`,`resize-observer-loop`,`unexpected-error`,`application-empty`,`startup-stalled`,`export-incomplete`,`export-image-refused`,`export-image-unreachable`,`export-image-not-an-image`,`export-font-unread`,`clipboard-unavailable`,`clipboard-image-pending`,`clipboard-image-unavailable`,`edit-target-unsupported`,`react-hook-order`,`menu-rows-unsupported`]),controlId:p.enum([`canvas-stacking`,`canvas-export`,`styles-copy`,`styles-paste`,`unknown`]),outcome:p.enum([`failed`,`displayed`,`shown`,`retried`,`recovered`]),frames:p.array(p.strictObject({asset:p.string().max(128).regex(/^[\w-][\w.-]*\.js$/u),line:p.number().int().min(1).max(Vp),column:p.number().int().min(1).max(Vp)})).max(8),occurredAt:p.iso.datetime().optional(),clientBuild:p.string().regex(/^[\w-]{1,64}$/u).optional(),frameStatus:p.enum([`recorded`,`no-stack`,`no-application-frames`,`malformed-stack`,`no-asset-list`,`kept-local`]).optional(),subsystem:p.enum([`menu`,`menu-picture`,`unknown`]).optional(),repeats:Hp.optional(),resourceCount:Hp.optional(),httpStatus:p.number().int().min(100).max(599).optional(),deliveryGap:p.strictObject({refused:Hp,expired:Hp,evicted:Hp,exhausted:Hp}).optional()}),Wp={incidentId:p.uuid(),releaseIdentity:p.string().min(1).max(100),reason:p.enum([`render-loop`,`render-error`]),details:Up.optional()};p.discriminatedUnion(`surface`,[p.object({...Wp,surface:p.literal(`canvas`),canvasId:p.uuid()}),p.object({...Wp,surface:p.literal(`application`)})]),p.object({accepted:p.literal(!0)});const Gp=[`root`,`page`,`screen`,`frame`,`group`,`rectangle`,`image`,`svg`,`boolean`,`recording`,`prototype`,`text`],Kp=[`text-layer-missing`,`text-history-mismatch`,`text-action-identity`,`text-history-resolution`,`text-history-unavailable`,`resync-failed`,`unexpected`],qp=[`refused`,`fault`,`sign-in`,`no-edit-access`,`gone`,`restored`,`replan`,`deleted-target`,`whole-value-text`,`retrying`,`recovery`,`trace`],Jp=[...Kp,`request-too-large`,`server-refused`,`repeated-server-error`,`mutation-id-reused`,`base-ahead`,`upload-not-kept`,`preview-conflict`,`competing-edits`,`invalid-reconciliation`,`invalid-recovery-plan`,`history-restored`,`local-changes`,`no-edit-access`,`saved-canvas-unavailable`,`image-unreadable`,`storage-refused`,`unknown-baseline`,`invalid-text-source`,`session-expired`],Yp=[`saved`,`saving`,`review`,`retrying`,`upload`,`reconnecting`,`offline`,`not-kept`,`view-only`,`sign-in`,`gone`,`restored`],Xp=[`new`,`reopened`],Zp=[`started`,`resolved`,`superseded`,`shown`,`held-back`,`dismissed`,`action-started`,`action-outcome`,`long-wait`,`long-wait-ended`,`reported`],Qp=[`departure-protection`,`retained-copy-review`,`host-priority`,`owner-reentry`,`new-edit-while-blocked`,`restored-work`,`new-blocker`,`unknown`],$p=[`offline`,`retrying`,`upload`,`missing-image`,`missing-capture`,`review`,`view-only`,`not-backed-up`,`gone`,`refused`,`copy-refused`,`copy-preview`,`unknown`],em=[`critical`,`warning`,`info`],tm=[`kept`,`writing`,`unprotected`],nm=[`try-again`,`sync`,`overwrite`,`review`,`save-copy`,`save-separate-copy`,`send-feedback`,`retry-upload`,`choose-file`,`remove-screen`,`go-to-canvases`],rm=[`saved`,`kept-copy`,`still-blocked`],im=[`active`,`disabled`,`unavailable`],am=[`in-flight`,`retry-wait`,`device-write`,`upload`,`read`,`recovery`,`decision`,`offline`,`paused`,`not-held`],om=[`current-changes-unresolved`,`checking-saved-canvas`,`offline`,`saved-canvas-unavailable`,`sign-in`,`request-unsettled`,`no-edit-access`,`missing-file`,`local-copy-unsaved`,`file-unavailable`,`invalid-review`,`too-large`],sm=[`unknown`,`unclassified`,...Qa],cm=p.string().max(256).regex(/^[\w:.-]*$/u),lm=p.number().int().nonnegative(),um=e=>p.string().refine(t=>t===`unknown`||e.includes(t)),dm=um(ru),fm=p.strictObject({schema:p.literal(1),eventId:p.uuid(),occurredAt:p.number().int().nonnegative(),kind:p.enum(Zp),episodeKey:cm.optional(),nextEpisodeKey:cm.optional(),appearanceId:p.uuid().optional(),trigger:p.enum(Qp).optional(),cause:p.enum($p).optional(),severity:p.enum(em),command:p.literal(`unknown`),operationKinds:p.array(dm).max(64),refusalCode:p.enum(sm).optional(),operation:dm.optional(),component:um(Gp).optional(),deviceProtection:p.enum(tm),uploadsWaiting:lm,uploadsBlocked:lm,saveHold:p.enum(am).optional(),actions:p.array(p.enum(nm)).max(nm.length),syncBlock:p.enum(om).optional(),overwriteBlock:p.enum(om).optional(),outcome:p.enum(rm).optional(),action:p.enum(nm).optional(),replay:p.enum(im),lostRecords:lm});p.strictObject({canvasId:p.uuid(),releaseIdentity:p.string().min(1).max(100),report:p.enum(qp),detail:p.enum(Jp).optional(),mutationId:p.uuid().optional(),version:p.number().int().nonnegative(),attempts:p.number().int().nonnegative(),durationMs:p.number().int().nonnegative(),pendingChanges:p.number().int().nonnegative(),reason:p.enum(Jp).optional(),status:p.enum(Yp).optional(),episode:p.enum(Xp).optional(),trace:fm.optional()}),p.object({accepted:p.literal(!0),analytics:p.enum([`delivered`,`failed`,`disabled`,`no-identity`]).optional()}),p.discriminatedUnion(`type`,[p.object({type:p.literal(`enhance3:extension-probe`)}).strict(),p.object({type:p.literal(`enhance3:extension-present`)}).strict()]);const pm=p.enum([`content`,`popup`,`worker`,`offscreen`,`synthetic`]),mm=p.uuid(),hm=p.string().regex(/^[\w.-]{1,64}$/u),gm=p.enum([`0`,`1`,`2-5`,`6-25`,`26+`]),_m=p.number().int().min(0).max(18e5),$={correlationId:mm,extensionRelease:hm,capabilityVersion:p.number().int().min(1).max(16),context:pm};p.discriminatedUnion(`name`,[p.object({...$,name:p.literal(`context_lifecycle`),outcome:p.enum([`opened`,`ready`,`closed`,`open-failed`,`close-failed`])}),p.object({...$,name:p.literal(`screen_preview`),outcome:p.enum([`ready`,`unavailable`,`failed`]),source:p.enum([`button`,`shortcut`]),durationMs:_m,messageBytes:p.number().int().min(0).max(67108864)}),p.object({...$,name:p.literal(`authentication`),state:p.enum([`signed-in`,`signed-out`,`invalid`,`unknown`])}),p.object({...$,name:p.literal(`destination_request`),outcome:p.enum([`succeeded`,`empty`,`failed`]),latencyMs:_m,resultCountBucket:gm,retryOutcome:p.enum([`not-retried`,`retry-succeeded`,`retry-failed`])}),p.object({...$,name:p.literal(`destination_picker`),outcome:p.enum([`options`,`blank`,`error`]),optionCountBucket:gm}),p.object({...$,name:p.literal(`recording_transition`),state:p.enum([`starting`,`recording`,`stopping`,`landed`,`failed`,`cancelled`,`reloaded`]),terminalReason:p.enum([`none`,`completed`,`failed`,`cancelled`,`tab-closed`,`worker-reloaded`,`start-timeout`,`session-rejected`])}),p.object({...$,name:p.literal(`microphone_session`),outcome:p.enum([`opened`,`refused`,`closed`,`still-active`]),durationMs:_m,activeAudioTrackCount:p.number().int().min(0).max(8)}),p.object({...$,name:p.literal(`microphone_permission`),standing:p.enum([`prompt`,`granted`,`denied`,`unknown`]),outcome:p.enum([`observed`,`request-started`,`granted`,`denied`,`refused`,`no-device`,`in-use`,`unavailable`,`settings-opened`])}),p.object({...$,name:p.literal(`recording_cleanup`),outcome:p.enum([`released`,`still-active`,`incomplete`]),terminalReason:p.enum([`completed`,`failed`,`cancelled`,`tab-closed`,`worker-reloaded`,`start-timeout`,`session-rejected`]),mediaRecorderState:p.enum([`not-created`,`inactive`,`recording`,`paused`,`unknown`]),activeAudioTrackCount:p.number().int().min(0).max(8),audioContextState:p.enum([`not-created`,`closed`,`running`,`suspended`,`interrupted`,`unknown`]),offscreenDocumentState:p.enum([`open`,`closed`,`not-open`,`unknown`])}),p.object({...$,name:p.literal(`synthetic_stage`),stage:p.enum([`release-identity`,`authentication`,`destination-list`,`recording-start`,`recording-landed`,`microphone-release`]),outcome:p.enum([`passed`,`failed`]),durationMs:_m})]),p.object({accepted:p.literal(!0)});const vm=(e,t)=>typeof t==`string`&&e.includes(t)?t:null,ym=e=>{let{refusalCode:t,operation:n,component:r}=e.fields??{};if(t===void 0&&n===void 0&&r===void 0)return;let i=sm.find(e=>e===t);return{refusalCode:t===void 0?`unclassified`:i??`unknown`,operation:vm(ru,n)??`unknown`,component:vm(Gp,r)??`unknown`}},bm=`mutation-id-reused`,xm=`request-too-large`,Sm=/^\d+$/u,Cm=e=>{let t=e.fields?.reason;return t===`session-expired`||t===`session-invalid`?t:`signed-out`},wm=e=>{let t=e.fields??{},n=String(t.restoreFenceVersion);return Sm.test(n)?{kind:`restored`,fenceVersion:Number(n)}:t.retry===`later`?{kind:`transient`,retryAfterMs:null}:t.reason===`mutation-id-reused`?{kind:`fault`,detail:bm}:t.recovery===`required`?{kind:`replan`}:{kind:`refused`,reason:e.message}},Tm=e=>{let t=e.fields?.reason;if(t===`mutation-id-reused`)return{kind:`fault`,detail:bm};if(t===`request-too-large`)return{kind:`refused`,reason:xm};let n=ym(e);return{kind:`refused`,reason:e.message,...n!==void 0&&{refusal:n}}},Em=(e,t)=>{switch(e.code){case`UNAUTHORIZED`:return{kind:`sign-in`,reason:Cm(e)};case`FORBIDDEN`:return{kind:`no-edit-access`};case`NOT_FOUND`:return{kind:`gone`};case`CONFLICT`:return wm(e);case`RATE_LIMITED`:case`INTERNAL`:return{kind:`transient`,retryAfterMs:t};case`BAD_REQUEST`:return Tm(e)}},Dm=(e,t)=>e===401?{kind:`sign-in`,reason:`signed-out`}:e===403?{kind:`no-edit-access`}:e===404?{kind:`gone`}:e===413?{kind:`refused`,reason:xm}:e===408||e===429||e===460||e>=500?{kind:`transient`,retryAfterMs:t}:{kind:`refused`,reason:`the server answered ${String(e)}`},Om=e=>e.kind===`no-response`?{kind:`transient`,retryAfterMs:null}:e.appError===null?Dm(e.status,e.retryAfterMs):Em(e.appError,e.retryAfterMs),km=/^\d+$/u,Am=e=>{let t=e?.headers.get(`retry-after`)?.trim()??``;if(km.test(t))return Number(t)*1e3;let n=t.endsWith(` GMT`)?Date.parse(t):NaN;return Number.isNaN(n)?null:Math.max(0,n-Date.now())},jm=.2,Mm=(e,t=Math.random)=>{let n=Math.min(3e4,1e3*2**Math.max(0,e-1));return Math.round(n*(1-jm+2*jm*t()))},Nm=async e=>{try{return{value:await e}}catch(e){return{error:e}}},Pm=async e=>{if(`error`in e)throw e.error;return e.value},Fm=async(e,t)=>{for(let n=0;;n++){let r=await Nm(e(n)),i=t.failureOf(r),a=i===null?null:Om(i);if(a?.kind!==`transient`||n+1>=3)return Pm(r);let o=a.retryAfterMs??Mm(n+1);if(t.deadline!==void 0&&Date.now()+o>=t.deadline)return Pm(r);`value`in r&&await t.release?.(r.value),await t.wait(o)}};p.object({canvasId:p.uuid(),recordingId:p.uuid()});const Im=p.object({sequence:p.number().int().min(0),startMs:p.number().int().min(0),endMs:p.number().int().min(0),text:p.string().min(1)}),Lm=p.object({state:p.literal(`processing`),hasPublishedTranscript:p.boolean()}),Rm=p.object({state:p.literal(`ready`),languageCode:p.string().min(1),integrity:p.enum([`whole`,`partial`]),isRefreshing:p.boolean(),cues:p.array(Im)}),zm=p.object({state:p.literal(`empty`),reason:p.enum([`no-audio`,`too-short`,`audio-missing`,`no-speech`])}),Bm=p.object({state:p.literal(`failed`),canRetry:p.boolean()});p.discriminatedUnion(`state`,[Lm,Rm,zm,Bm]);const Vm=async(e,t)=>{try{await e.cancel(t)}catch{}},Hm=(e,t)=>{let{signal:n,arm:r,stop:i}=t,a=e.getReader();return new ReadableStream({start:e=>{n.addEventListener(`abort`,()=>{e.error(n.reason),Vm(a,n.reason)},{once:!0})},pull:async e=>{try{let t=await a.read();if(n.aborted)return;if(t.done){i(),e.close();return}r(),e.enqueue(t.value)}catch(t){i(),n.aborted||e.error(t)}},cancel:async e=>{i(),await a.cancel(e)}})},Um=(e,t=6e4)=>{let n=new AbortController,r=null,i=()=>{r!==null&&clearTimeout(r),r=null},a=()=>{i();let e=performance.now()+t;r=setTimeout(()=>{performance.now()-e>1e3?a():n.abort(new DOMException(`The transfer made no progress`,`TimeoutError`))},t)},o=e==null?n.signal:AbortSignal.any([e,n.signal]);return o.addEventListener(`abort`,i,{once:!0}),a(),{signal:o,stop:i,progress:()=>{o.aborted||a()},watchedBody:e=>(a(),Hm(e,{signal:o,arm:a,stop:i})),watchBody:e=>e.body===null?(i(),e):(a(),new Response(Hm(e.body,{signal:o,arm:a,stop:i}),{status:e.status,statusText:e.statusText,headers:e.headers}))}},Wm=e=>`Enhance: ${e}\n`,Gm=(e,t)=>{if(e.key!==void 0)return`${e.key.journey} › ${e.key.step}`;let n=t.find(t=>`testId`in t&&t.testId===e.testId)?.title??e.testId;return n===void 0?`a capture`:`a capture of "${n}"`},Km=e=>e.map(e=>Wm(`${e.code}: ${e.address}: ${e.reason}`)).join(``),qm=(e,t)=>(e.leftOut??[]).map(e=>Wm(`capture-left-out: ${Gm(e,t)}: ${e.message}`)).join(``)+Km(e.notUploaded??[]),Jm=(e,t)=>(e.runId===t?``:Wm(`run ${t} had expired, so its captures were published through run ${e.runId}.`))+Wm(e.canvasUrl)+e.issues.map(e=>Wm(`${e.code}: ${e.message}`)).join(``)+Km(e.notUploaded),Ym={unreadable:`it could not be read on this machine`,refused:`Enhance's storage refused it`},Xm=2147483647,Zm=new Map([[401,`authorization`],[403,`authorization`],[409,`conflict`],[400,`artifact`]]),Qm=e=>`error`in e?{kind:`no-response`}:e.value.ok?null:{kind:`response`,status:e.value.status,appError:null,retryAfterMs:Am(e.value)},$m=async(e,t)=>Fm(e,{failureOf:Qm,deadline:t,wait:async e=>{await new Promise(t=>{setTimeout(t,e)})},release:async e=>{await e.body?.cancel()}}),eh=async(e,t,n,r)=>{try{return await $m(async()=>fetch(e,{...t,signal:AbortSignal.timeout(n)}),r)}catch{throw b(`transport`,`Enhance did not confirm the request. Resume the same run to recover its result.`)}},th=async e=>{try{return await e.json()}catch{return null}},nh=async(e,t,n,r)=>{let{procedure:i,timeoutMs:a,publicationTimeoutMs:o}=r,s=await eh(e,t,a,Date.now()+o),c=await th(s);if(!s.ok){let e=typeof c==`object`&&c?Reflect.get(c,`error`):null,t=typeof e==`object`&&e?Reflect.get(e,`message`):null;throw b(Zm.get(s.status)??`transport`,typeof t==`string`?t.slice(0,1e3):`Enhance rejected ${i} (HTTP ${String(s.status)}).`)}let l=typeof c==`object`&&c?Reflect.get(c,`result`):null,u=typeof l==`object`&&l?Reflect.get(l,`data`):void 0,ee=n.safeParse(u);if(!ee.success)throw b(`transport`,`Enhance returned an incompatible ${i} response.`);return ee.data},rh=e=>{let t=URL.parse(e.apiUrl);if(t===null||![`http:`,`https:`].includes(t.protocol)||t.username!==``||t.password!==``||e.token.trim()===``)throw b(`configuration`,`Enhance needs an HTTP API URL and an explicit token.`);let n=e.timeoutMs??3e4,r=e.publicationTimeoutMs??6e5;if(!Number.isSafeInteger(r)||r<1)throw b(`configuration`,`Enhance publication timeout must be a positive integer in milliseconds.`);if(!Number.isSafeInteger(n)||n<1||n>Xm)throw b(`configuration`,`Enhance timeout must fit the Node timer range of 1 to 2147483647 milliseconds.`);return{timeoutMs:n,publicationTimeoutMs:r,request:async(i,a,o,{isQuery:s=!1,timeoutMs:c=n}={})=>{let l=new URL(`${t.pathname.replace(/\/$/u,``)}/trpc/${i}`,t.origin);return s&&l.searchParams.set(`input`,JSON.stringify(a)),nh(l,{method:s?`GET`:`POST`,headers:{authorization:`Bearer ${e.token}`,"content-type":`application/json`},...!s&&{body:JSON.stringify(a)},redirect:`error`},o,{procedure:i,timeoutMs:Math.max(1,Math.min(c,Xm)),publicationTimeoutMs:r})}}},ih=e=>{let t=new Map;for(let n of e){let e=`${n.key.journey} › ${n.key.step}`;for(let[r,i]of[[n.source.blob,`the snapshot of ${e}`],[n.preview.blob,`the picture of ${e}`],...n.assets.map(e=>[e.blob,e.url])])t.has(r.sha256)||t.set(r.sha256,i)}return t},ah=async e=>{try{return{value:await e}}catch(e){return{error:e}}},oh=async(e,t)=>{let n=Um();try{let r=await xt(e),i={method:`PUT`,headers:t.headers,body:n.watchedBody(r.stream()),duplex:`half`,signal:n.signal,redirect:`error`};return await fetch(t.url,i)}finally{n.stop()}},sh=async(e,t,n)=>{let r=await ah($m(async()=>oh(t,n),Date.now()+e.publicationTimeoutMs));if(`error`in r)return Ha.publish({stage:`upload`,error:r.error}),`retry`;let i=r.value;if(i.ok)return`stored`;let a=await i.text();return Ha.publish({stage:`upload`,status:i.status,answer:a}),i.status===403&&a.includes(`Request has expired`)?`expired`:Om({kind:`response`,status:i.status,appError:null,retryAfterMs:null}).kind===`transient`?`retry`:`refused`},ch=async(e,t,n)=>{let r=await e.request(`captureRun.reserveAssets`,{runId:t,blobs:n},$i);return new Map(r.uploads.map(e=>[e.sha256,e]))},lh=async(e,t,n,r)=>{if(r?.upload===null)return`stored`;if(r===void 0)return`retry`;let i=await sh(e,n.path,r.upload);if(i!==`expired`)return i;let a=(await ch(e,t,[n.blob])).get(n.blob.sha256);if(a?.upload===null)return`stored`;if(a===void 0)return`retry`;let o=await sh(e,n.path,a.upload);return o===`expired`?`retry`:o},uh=async(e,t,n,r)=>{let i=t.run.id,a=ih(r),o=[],s=(e,t)=>{o.push({code:`file-not-uploaded`,address:a.get(e.sha256)??e.sha256,reason:t})},c=[];for(let e of da(r)){let t=await Wa(n,e);t===null?s(e,Ym.unreadable):c.push({blob:e,path:t})}let l=!0;for(let t=0;t<c.length;t+=400){let n=c.slice(t,t+400),r=await ch(e,i,n.map(e=>e.blob));for(let t of n){let n=await lh(e,i,t,r.get(t.blob.sha256));n===`refused`?s(t.blob,Ym.refused):n!==`stored`&&(l=!1)}}return{notUploaded:o,isComplete:l}},dh=new Set([`sealed`,`converting`,`committed`]),fh=e=>b(`transport`,`Enhance could not take every file of this run yet. Resume the same manifest from this machine to finish it.`,e),ph=async(e,t)=>e.request(`captureRun.get`,{runId:t},Qi,{isQuery:!0}),mh=async(e,t)=>{try{return await ph(e,t)}catch{throw fh(t)}},hh=async(e,t,n)=>{let r=t.run.id;try{await e.request(`captureRun.seal`,{manifest:t},Qi,{timeoutMs:e.publicationTimeoutMs});return}catch(e){if(!Ra(e))throw e;if(e.code===`conflict`&&e.message===`None of this run’s screens arrived.`)throw b(`artifact`,e.message,r,n);if((e.code!==`conflict`||e.message!==`This capture run changed while it was being sealed.`)&&e.code!==`transport`)throw e}let i=await mh(e,r);if(!dh.has(i.state))throw i.state===`failed`?b(`conversion`,i.failure?.message??`The capture run failed.`,r,n):fh(r)},gh=async(e,t)=>{let n=t.run.id,r=()=>b(`pending`,`Capture run ${n} is still publishing to canvas ${t.run.canvasId}. It appears there when done.`,n),i=async()=>{try{return await e.request(`captureRun.publish`,{runId:n},Qi)}catch(e){throw Ra(e)&&e.code===`transport`?r():e}},a=await i(),o=Date.now()+e.publicationTimeoutMs;for(;a.receipt===null&&a.failure===null&&![`cancelled`,`failed`].includes(a.state);){if(Date.now()>=o)throw r();await new Promise(e=>{setTimeout(e,250)}),a=await i()}if(a.receipt===null)throw b(a.failure?.code===`conflict`?`conflict`:`conversion`,a.failure?.message??`The capture run was cancelled.`,n);return a.receipt},_h=(e,t)=>{if(e.runId!==t.run.id||e.canvasId!==t.run.canvasId||e.manifestDigest!==Va(t))throw b(`conflict`,`This run committed a different manifest.`,t.run.id);return e},vh=async(e,t)=>{let{review:n}=t.run,r=n===void 0?{canvasId:t.run.canvasId}:{destination:n.destination,...n.context!==void 0&&{context:n.context},...n.revision!==void 0&&{revision:n.revision},...n.compareTo!==void 0&&{compareTo:n.compareTo}},{run:i}=await e.transport.request(`captureRun.begin`,{...r,source:t.run.source,runKey:globalThis.crypto.randomUUID(),participants:t.run.participants},Xi);if(i.canvasId!==t.run.canvasId)throw b(`conflict`,`Capture run ${t.run.id} expired, and a new run for its review would publish to another canvas, so nothing was published. Capture again to publish this review.`,t.run.id);let a={...t,run:i};return await Ya(h.join(e.directory,`manifest-${i.id}.json`),a),a},yh=async(e,t,n)=>{let{transport:r,directory:i}=e,a=t.run.id,o=xa(t);if(`refusal`in o)throw b(`artifact`,o.refusal,a,{leftOut:o.leftOut,notUploaded:[]});let s=await ph(r,a);if(s.receipt!==null){let e=_h(s.receipt,t);return await Ya(h.join(i,`receipt.json`),e),{...e,notUploaded:[]}}if(s.state===`collecting`&&Date.parse(s.run.expiresAt)<=Date.now()){if(!n)throw fh(a);return yh(e,await vh(e,t),!1)}let c=[];if(s.state===`collecting`){let n=await uh(r,t,e.blobDirectories,o.captures);if(!n.isComplete)throw fh(a);({notUploaded:c}=n)}dh.has(s.state)||await hh(r,t,{leftOut:o.leftOut,notUploaded:c});let l=_h(await gh(r,t),t);return await Ya(h.join(i,`receipt.json`),l),{...l,notUploaded:c}},bh=async(e,t,n,r=[n])=>{try{return await yh({transport:e,directory:n,blobDirectories:r},t,!0)}catch(e){if(e instanceof Error){let n=Reflect.get(e,`runId`);throw Object.assign(e,{runId:typeof n==`string`?n:t.run.id})}throw b(`transport`,`Capture publication was not confirmed. Resume the same manifest.`,t.run.id)}},xh=(e,t)=>{let n=e.participants[0];if(n===void 0)throw b(`configuration`,`No capture participant was reserved.`);return{format:`enhance-capture-run`,version:1,run:e,ordering:`partial`,participants:[{id:n,status:`passed`}],attempts:[{runner:`script`,participant:n,retry:0,status:`passed`,captures:t}]}},Sh=async(e,t)=>{for(let n of t.blobs)await qa(e,n.description,n.bytes);return Ja(e,t.artifact)},Ch=(e,t,n)=>{let r=Vi.parse(t),i=[],a=!1;return{descriptor:r,directory:n,add:async e=>{if(a)throw b(`configuration`,`This run no longer accepts captures.`);let t=Sh(n,e);i.push(t),await t},publish:async()=>{a=!0;let t=await Promise.all(i);if(r.participants.length!==1)throw b(`configuration`,`Multi-participant runs must publish a complete merged manifest.`);let o=xh(r,t);return await At(n,{recursive:!0}),await Ya(h.join(n,`manifest.json`),o),bh(e,o,n)},cancel:async()=>(a=!0,(await e.request(`captureRun.cancel`,{runId:r.id},Qi)).receipt)}},wh=async(e,t)=>{let n=Yi.parse({canvasId:t.canvas,destination:t.destination,title:t.title,context:t.context,revision:t.revision,compareTo:t.compareTo,source:t.source,runKey:t.runKey,participants:t.participants}),{run:r}=await e.request(`captureRun.begin`,n,Xi),i=t.directory??h.join(`.enhance`,`captures`,r.id);return await At(i,{recursive:!0}),await Ya(h.join(i,`run.json`),r),Ch(e,r,i)},Th=async(e,t,n)=>{try{let r=await n();return t(Jm(r,e.run.id)),r}catch(n){throw Ra(n)&&t(qm(n,e.attempts)),n}},Eh=e=>f.stderr.write(e),Dh=e=>{let t=rh(e);return{captures:{review:async e=>t.request(`captureRun.review`,{canvasId:e},La.nullable(),{isQuery:!0}),decide:async(e,n)=>{await t.request(`captureRun.decide`,{canvasId:e,verdict:n},p.object({accepted:p.literal(!0)}))},reference:async(e,n)=>t.request(`captureRun.reference`,{canvasId:e,name:n},Fa.nullable(),{isQuery:!0}),promote:async e=>t.request(`captureRun.promote`,Ia.parse(e),Fa),publishManifests:async(e,n={})=>{let r=Ta(await Promise.all(e.map(async e=>Xa(e))));if(typeof r==`string`)throw b(`artifact`,r);let i=h.dirname(e[0]??`.`);return await Ya(h.join(i,`merged-manifest.json`),r),Th(r,n.write??Eh,async()=>bh(t,r,i,e.map(e=>h.dirname(e))))},begin:async e=>wh(t,e),publishManifest:async(e,n={})=>{let r=await Xa(e);return Th(r,n.write??Eh,async()=>bh(t,r,h.dirname(e)))},get:async e=>t.request(`captureRun.get`,{runId:e},Qi,{isQuery:!0})}}},Oh=(e,t)=>{let n=e instanceof Error?Reflect.get(e,`code`):void 0;return new u(n===`authorization`?`UNAUTHORIZED`:n===`conflict`?`CONFLICT`:[`configuration`,`artifact`].includes(String(n))?`BAD_REQUEST`:`INTERNAL`,e instanceof Error?e.message:`Capture publication was not confirmed.`,`Retry enhance captures publish with the same manifest: ${t}`)},kh=(e,t)=>{e.command(`captures`).description(`Publish SDK captures as editable canvas journeys.`).command(`publish <manifest>`).description(`Publish or resume a reserved capture manifest and print its durable receipt.`).action(async e=>{let n=await t.credentials.read();if(n===null)throw new u(`UNAUTHORIZED`,`Capture publication requires an agent token.`,`Run enhance auth login, then retry the same manifest.`);let r=Dh({apiUrl:t.apiUrl,token:n});try{t.output.result(await r.captures.publishManifest(e))}catch(t){throw Oh(t,e)}})},Ah={"captureRun.review":`Read product review for a run canvas.`,"canvas chats":`Chat history.`,"canvas.createEditableFrame":`Make a screen editable.`,"canvas.create":`Create a canvas.`,"canvas.get":`Read a canvas and access.`,"canvas.setAccess":`Change canvas link access.`,"canvas.list":`List canvases.`,"canvas.rename":`Rename a canvas.`,"canvas.setReviewState":`Set review state.`,"canvas.delete":`Bin a canvas.`,"canvas.move":`Move between shelves.`,"canvas.duplicate":`Copy a canvas.`,"canvas.copyWalkthroughs":`Copy walkthroughs between canvases.`,"canvas.deletePermanently":`Permanently delete a canvas.`,"canvas.restore":`Restore a binned canvas.`,"canvas.inspect":`Inspect a canvas.`,"canvas.tree":`Read the node hierarchy.`,"canvas.node":`Read a node and children.`,"canvas.selection":`Read the live selection.`,"canvas asset":`Manage uploaded assets.`,"canvas mutation":`Read mutation receipts.`,"canvas apply":`Apply canvas operations.`,"canvas find":`Find accessible canvases.`,"canvas remove":`Remove scoped subtrees.`,"canvas read":`Read linked content.`,"canvas update-html":`Update an HTML snapshot.`,"canvas publish-prototype":`Publish a static build.`,"canvas import-asset":`Import an image or font.`,"canvas insert-html":`Insert compiled HTML.`,"canvas make-editable":`Convert a captured screen.`,"canvas capture":`Capture a recording moment.`,"canvas arrange":`Arrange canvas objects.`,"canvas duplicate-nodes":`Duplicate node subtrees.`,"canvas text-style-library":`Manage text styles.`,"canvas realtime":`Canvas presence and activity.`,"canvas document":`Read or replace documents.`,"canvas version":`Retained canvas history.`,"canvas render":`Render canvas pixels.`,"canvas participants":`Manage participants.`,"canvas invites":`Invite people to a canvas.`},jh=(e,t=!1)=>{let n=Symbol(`explicit-null`),r=e.parseArg;return r===void 0?()=>!1:(e.argParser((e,i)=>{if(t&&e===`null`)return n;try{return r(e,i)}catch(t){try{return r(JSON.stringify(e),i)}catch{throw t}}}),e=>e===n)},Mh=()=>({exit:e=>{throw new he(e)}}),Nh=new Map([[`comment.resolve --resolved`,null],[`recording.start --page-title`,null],[`recording.start --viewport`,null],[`screen.create --page-title`,null],[`screen.create --provenance`,null],[`screen.create --route`,null],[`screen.create --viewport`,null],[`canvas render --canvas`,`--input`],[`canvas.inspect --canvas`,`--canvas-id`],[`canvas.tree --canvas`,`--canvas-id`],[`canvas.node --canvas`,`--canvas-id`],[`canvas.selection --canvas`,`--canvas-id`],[`canvas read --canvas`,`--input`],[`canvas duplicate-nodes --canvas`,`--input`],[`canvas duplicate-nodes --base-version`,`--input`],[`canvas duplicate-nodes --nodes`,`--input`]]),Ph=(e,t)=>Nh.get(`${e} ${t??``}`),Fh=(e,t)=>e.options.flatMap(n=>{let r=Ph(t,n.long);if(r===void 0)return[];if(r===null)return[{option:n,replacement:null}];let i=e.options.find(e=>e.long===r);if(i===void 0)throw TypeError(`${t} has no ${r} to replace ${n.flags}.`);return[{option:n,replacement:i}]}),Ih=({option:e,replacement:t})=>{let n=e.long??e.flags;return t===null?new u(`BAD_REQUEST`,`${n} is required unless --json supplies the complete input.`,`Pass ${n} explicitly, including false or null when that is the intended value.`):new u(`BAD_REQUEST`,`${n} is required unless ${t.long??t.flags} is given.`,`Pass ${n}, or use ${t.long??t.flags} instead.`)},Lh=(e,t)=>{let n=Fh(e,t);if(n.length!==0){for(let{option:e,replacement:t}of n)t!==null&&(e.description=`${e.description} Required unless ${t.long??t.flags} is given.`);e.hook(`preAction`,(t,r)=>{if(r!==e||r.getOptionValueSource(`json`)===`cli`)return;let i=e=>r.getOptionValueSource(e.attributeName())===`cli`,a=n.find(({option:e,replacement:t})=>!i(e)&&(t===null||!i(t)));if(a!==void 0)throw Ih(a)})}},Rh={"canvas text-style-library":`Find, read, and publish reusable text styles across canvases.`,"canvas chats":`Inspect and manage authorized canvas chat history.`,canvas:`Create, find, share and manage canvases.`,"canvas render":`Render production-faithful canvas pixels after inspecting exact structure and geometry.`,"canvas version":`Inspect and name retained canvas history.`,"canvas document":`Read or replace the opaque document stored on a canvas.`,"canvas invites":`Invite people to a canvas and manage pending invitations.`,"canvas participants":`List and change the people who can reach a canvas.`,comment:`Comment threads and replies anchored to canvas content.`,organisation:`Teams the authenticated person belongs to or creates.`,"organisation invites":`Invite people to a team and manage pending invitations.`,"organisation people":`Team roster membership and roles.`,person:`The current person, sharing recipients, and agent tokens.`,"person recipients":`People available when choosing sharing recipients.`,recording:`Recorded walkthroughs, chunks, recovery, and completion.`,"recording-asset":`External page assets mirrored for durable replay.`,screen:`Captured pages uploaded for placement on a canvas.`},zh=new Set([`canvas.invites.accept`,`canvas.invites.preview`,`organisation.invites.accept`,`organisation.invites.preview`]),Bh=new Set([`canvas.create --organisation-id`,`canvas.create --source-url`,`recording.start --audio`,`recording.start --page-title`,`screen.create --page-title`,`screen.create --provenance`,`screen.create --route`]),Vh=e=>typeof e==`object`&&e&&!Array.isArray(e)?Object.fromEntries(Object.entries(e)):null,Hh=e=>{let t=Vh(Reflect.get(e,`__trpcCli`)),n=t===null?void 0:t.path;return typeof n==`string`?n:null},Uh=(e,t,n,r)=>{let i=t.long,a=Hh(e)??r.join(` `),o=a===``||i===void 0?void 0:ce[`${a} ${i}`];if(o!==void 0)return o;if(i!==void 0&&ce[i]!==void 0)return ce[i];let s=(n.split(/Any of:|One of:/u,1)[0]?.trim()??``).split(`;`).map(e=>e.trim()).filter(e=>e!==``&&[`Format:`,`Pattern:`,`Min length:`,`Max length:`].every(t=>!e.startsWith(t))).join(`; `);return s===``?`Value for ${i??t.attributeName()} on ${e.name()}.`:s},Wh=(e,t,n)=>{let r=Mh();e.exitOverride(e=>r.exit(e.exitCode)),e.configureOutput({writeOut:e=>t.output.logger.info?.(e),writeErr:e=>t.output.logger.error?.(e)}),e.showHelpAfterError(!1).showSuggestionAfterError(!1);let i=[],a=Hh(e)??n.join(` `);for(let t of e.options){t.description=Uh(e,t,t.description,n);let r=Bh.has(`${a} ${t.long??``}`),o=jh(t,r);r&&i.push({name:t.attributeName(),matches:o})}i.length>0&&e.hook(`preAction`,e=>{for(let t of i)t.matches(e.getOptionValue(t.name))&&e.setOptionValueWithSource(t.name,null,`cli`)}),Lh(e,a)},Gh=(e,t,n,r)=>{(n!==null&&r.mutationPaths.has(n)||t[0]===`fixture`)&&(e.options.every(e=>e.long!==`--client-token`)&&e.option(`--client-token <uuid>`,ce[`--client-token`]),e.hook(`preAction`,e=>{let n=e.getOptionValue(`clientToken`),i=p.uuid().nullable().safeParse(n??null);if(!i.success)throw new u(`BAD_REQUEST`,`--client-token must be a UUID.`,`Mint one UUID and reuse it only when retrying this exact command.`);r.mutationKey.select(i.data,t[0]===`fixture`)}))},Kh=(e,t,n)=>{n===null||!zh.has(n)||(e.options.find(e=>e.long===`--token`)?.makeOptionMandatory(!1),e.hook(`preAction`,async e=>{let n=e.getOptionValue(`token`);if(n===void 0&&e.getOptionValue(`json`)!==void 0)return;let r=await un(typeof n==`string`?n:void 0,`enhance ${t.join(` `)}`);e.setOptionValueWithSource(`token`,r,`cli`)}))},qh=(e,t,n,r)=>{let i=Rh[t.join(` `)];i===void 0?n!==null&&e.description(ze[n]??r.get(n)??`Run the ${n} API operation.`):e.description(i);let a=Ah[t.join(` `)]??(n===null?void 0:Ah[n]);a!==void 0&&e.summary(a)},Jh=(e,t,n=[])=>{Wh(e,t,n);for(let r of e.commands){let e=[...n,r.name()],i=Hh(r);Gh(r,e,i,t),qh(r,e,i,t.descriptions),Kh(r,e,i),Jh(r,t,e)}},Yh=ve().excludedProcedures,Xh=new Set([`canvas thumbnail`,`canvas font-catalog`,`telemetry`]),Zh=e=>{let t=Reflect.get(e,`__trpcCli`);if(typeof t!=`object`||!t)return null;let n=Reflect.get(t,`path`);return typeof n==`string`?n:null},Qh=(e,t=[])=>{let n=e.commands.filter(e=>{let n=Zh(e),r=[...t,e.name()].join(` `);return!Xh.has(r)&&(n===null||!Yh.has(n))});Reflect.set(e,`commands`,n);for(let e of n)Qh(e,[...t,e.name()])},$h=e=>{let t=Reflect.get(e,`__trpcCli`);if(typeof t!=`object`||!t)return null;let n=Reflect.get(t,`path`);return typeof n==`string`?n:null},eg=(e,t=[])=>e.commands.filter(e=>e.name()!==`help`).flatMap(e=>{let n=[...t,e.name()];return[{command:e,path:n.join(` `)},...eg(e,n)]}),tg=(e,t=[])=>e.commands.filter(e=>e.name()!==`help`).flatMap(e=>{let n=[...t,e.name()],r=$h(e);return[{path:n.join(` `),procedure:r,description:e.description(),kind:r===null?e.commands.length>0?`namespace`:`utility`:`derived`,helpCharacters:e.helpInformation().length},...tg(e,n)]}),ng=(e,t)=>({...t.describe(e.id),outputSchema:p.toJSONSchema(e.outputSchema,{unrepresentable:`any`,io:`output`}),exampleOutput:e.guide.examples[0]?.output??null}),rg=(e,t)=>{let n=t(),r=Ee(n),i=Pe();return eg(e).flatMap(({command:e,path:t})=>{let a=$h(e),o=n.find(({cli:e})=>e?.path===t);return o===void 0&&a===null&&e.commands.length>0?[]:[{path:t,description:e.description(),usage:`${t} ${e.usage()}`,arguments:e.registeredArguments.map(e=>({name:e.name(),required:e.required,variadic:e.variadic,description:e.description})),options:e.options.filter(e=>!e.hidden).map(e=>{let n=Ph(a??t,e.long);return{flags:e.flags,description:e.description,required:n!==void 0||e.mandatory,...typeof n==`string`&&{requiredUnless:n},...e.defaultValue!==void 0&&{defaultValue:e.defaultValue}}}),..._i[t]!==void 0&&{example:_i[t]},capability:o===void 0?null:ng(o,r),exitCodes:i}]})},ig=(e,t,n)=>{e.command(`commands`).description(`Emit the command inventory as NDJSON without walking the help tree.`).option(`--namespace <path>`,`Keep commands at or below this space-separated path.`).option(`--capabilities`,`Emit the transport-neutral capability inventory.`,!1).option(`--reference`,`Emit complete shared capability contracts for documentation.`,!1).option(`--records`,`Emit the complete contract of each listed command for documentation.`,!1).action(r=>{if(r.reference){let e=ue(n()),r=Ee(e);t.result({items:e.map(e=>ng(e,r)),truncated:!1});return}if(r.records){t.result({items:rg(e,n),truncated:!1});return}if(r.capabilities){t.result({items:lt(n()),truncated:!1});return}let i=r.namespace?.trim(),a=tg(e).filter(e=>i===void 0||e.path===i||e.path.startsWith(`${i} `));t.result({items:a,truncated:!1})})},ag=(e,t,n,r)=>{let i=e.commands.find(e=>e.name()===`comment`);if(i===void 0)throw TypeError(`derived comment namespace is missing`);i.command(`attention`).description(`List every open comment needing attention; source metadata is included when a capture has it.`).argument(`<canvas-url-or-id>`,`A pasted Enhance canvas URL shaped /c/<UUID>, or a bare canvas UUID.`).action(async e=>{r.result(await t.invoke({capability:d(n(),`comment.attention`),arguments:{canvasId:te(e)},clientToken:null}))})},og=(e,t)=>{let{version:n,credentials:r,remote:i,output:a}=t;e.command(`doctor`).description(`Check the installed binary, API reachability, and credential file without changes.`).action(async()=>{let[e,t]=await Promise.all([i.health(),r.read()]);a.result({status:t!==null&&e.reachable?`ok`:`degraded`,binary:f.argv[1]??`enhance`,version:n,api:e,credential:{path:r.path,present:t!==null}})})},sg=e=>p.coerce.number().int().positive().parse(e),cg=p.record(p.string(),p.unknown()),lg=(e,t)=>{let n=cg.safeParse(e);if(!n.success)return 0;let r=n.data.atMs;if(typeof r==`number`&&Number.isFinite(r))return Math.max(0,Math.round(r));let i=n.data.timestamp;return typeof i==`number`&&Number.isFinite(i)?Math.max(0,Math.round(i-t)):0},ug=async e=>{let t=(await jt(e,`utf8`)).split(`
|
|
34
|
+
`),p.object({clientToken:p.uuid(),isRecordingMark:p.boolean().default(!0),provenance:p.object({sourceRecordingId:p.uuid(),atMs:p.number().int().min(0)}).nullable(),route:p.string().nullable(),pageTitle:p.string().nullable(),viewport:p.object({width:p.number().int().positive(),height:p.number().int().positive()}),bytes:p.number().int().min(1).max(2**53-1),sha256:p.string().regex(/^[a-f0-9]{64}$/u).optional()}),p.object({screenId:p.uuid(),upload:F,alreadyExists:p.boolean(),state:p.enum([`pending`,`stored`])}),p.object({screenId:p.uuid(),etag:p.string().min(1).max(200)}),p.object({screenId:p.uuid(),storedBytes:p.number().int().min(1),uploadedAt:p.iso.datetime()}),p.object({screenId:p.uuid()}),p.object({screenId:p.uuid(),deletedThreadCount:p.number().int().min(0)}),p.object({code:p.enum([`BAD_REQUEST`,`UNAUTHORIZED`,`FORBIDDEN`,`NOT_FOUND`,`CONFLICT`,`RATE_LIMITED`,`INTERNAL`]),message:p.string().min(1),fields:p.record(p.string(),p.string()).optional()}),p.object({canvasId:p.uuid(),attemptId:p.uuid(),sourceNodeId:p.string().min(1),releaseIdentity:p.string().min(1).max(100),outcome:p.enum([`started`,`succeeded`,`blocked`,`failed`]),reason:p.enum([`none`,`pending-changes`,`editor-busy`,`editor-stale`,`editor-read-only`,`source-missing`,`editor-changed`,`cancelled`,`source-invalid-box`,`source-loading`,`source-unavailable`,`source-unreadable`,`source-changed`,`source-unsettled`,`captured-fonts-unavailable`,`conversion-failed`]),durationMs:p.number().int().min(0).max(18e5)}),p.object({accepted:p.literal(!0)});const Rp=p.enum([`answered`,`skipped`,`none`]),Z=p.number().int().min(0).max(18e5),Q=p.number().int().min(0).max(1e6),zp={canvasId:p.uuid(),clientViewId:p.uuid(),releaseIdentity:p.string().min(1).max(100),capabilityVersion:p.number().int().min(1).max(16)},Bp={longTaskCount:Q,longTaskTotalMs:Z,longestTaskMs:Z,loafCount:Q,loafTotalBlockingMs:Z,loafLongestBlockingMs:Z,loafStyleAndLayoutMs:Z,loafTopScriptMs:Z,loafTopScriptSource:p.enum([`app`,`extension`,`third-party`,`unknown`])};p.discriminatedUnion(`name`,[p.object({...zp,...Bp,name:p.literal(`canvas_load`),outcome:p.enum([`ready`,`slow`,`degraded`,`timed-out`,`unavailable`]),bottleneck:p.enum([`metadata`,`details`,`document`,`walkthrough-list`,`restore`,`projection`,`sources`,`replays`]),browserCopyCheck:Rp.optional(),durationMs:Z,shellMs:Z,projectionMs:Z,sourcesMs:Z,replaysMs:Z,nodeCount:Q,recordingCount:Q,screenCount:Q,replayCount:Q,unavailableSourceCount:Q,assetFailureCount:Q,apiRequestCount:Q,apiLongestMs:Z,mirroredAssetRequestCount:Q,mirroredAssetUniqueCount:Q,mirroredAssetTransferBytes:p.number().int().min(0).max(1073741824)}),p.object({...zp,...Bp,name:p.literal(`canvas_interaction`),kind:p.enum([`pan`,`zoom`,`drag`,`edit`]),outcome:p.enum([`smooth`,`janky`,`refused`]),pendingCandidateCount:Q.optional(),durationMs:Z,frameCount:Q,slowFrameCount:Q,worstFrameMs:Z,nodeCount:Q,replayCount:Q}),p.object({...zp,name:p.literal(`canvas_measurement`),outcome:p.literal(`drift`),layerCount:Q}),p.object({...zp,name:p.literal(`prototype_open`),kind:p.enum([`open`,`recovered`,`capabilities`]).optional(),navigationId:p.uuid().optional(),captureReady:p.boolean().optional(),deploymentId:p.uuid(),outcome:p.enum([`loaded`,`still-opening`,`failed`]),reason:p.enum([`none`,`ticket-refused`,`ticket-failed`,`denied`,`expired-or-used`,`temporary-error`,`deadline`,`ticket-held`,`gate-silent`,`exchange-held`,`document-held`,`document-unconfirmed`]),attempts:p.number().int().min(1).max(16),durationMs:Z,ticketMs:Z,exchangeMs:Z.nullable(),migration:p.enum([`none`,`completed`,`background`,`failed`,`unknown`]),migrationWaitMs:Z.nullable(),liveMs:Z.nullable(),inputReady:p.boolean()}),p.object({...zp,name:p.literal(`canvas_realtime`),kind:p.enum([`room-ready`,`reconnect`,`recovery`]),outcome:p.enum([`succeeded`,`failed`]),reason:p.enum([`initial`,`transport`,`snapshot`,`gap`,`replace`,`relay`,`history-restored`]),durationMs:Z})]),p.object({accepted:p.literal(!0)});const Vp=1e7,Hp=p.number().int().min(0).max(1e3),Up=p.strictObject({version:p.literal(1),severity:p.enum([`fatal`,`contained`,`recovered`]),boundary:p.enum([`application`,`properties`,`layers`,`stage`]),phase:p.enum([`render`,`bootstrap`,`event`,`async`,`empty`,`startup`]),errorCode:p.enum([`select-value-unavailable`,`select-options-duplicate`,`render-loop`,`resize-observer-loop`,`unexpected-error`,`application-empty`,`startup-stalled`,`export-incomplete`,`export-image-refused`,`export-image-unreachable`,`export-image-not-an-image`,`export-font-unread`,`clipboard-unavailable`,`clipboard-image-pending`,`clipboard-image-unavailable`,`edit-target-unsupported`,`react-hook-order`,`menu-rows-unsupported`]),controlId:p.enum([`canvas-stacking`,`canvas-export`,`styles-copy`,`styles-paste`,`unknown`]),outcome:p.enum([`failed`,`displayed`,`shown`,`retried`,`recovered`]),frames:p.array(p.strictObject({asset:p.string().max(128).regex(/^[\w-][\w.-]*\.js$/u),line:p.number().int().min(1).max(Vp),column:p.number().int().min(1).max(Vp)})).max(8),occurredAt:p.iso.datetime().optional(),clientBuild:p.string().regex(/^[\w-]{1,64}$/u).optional(),frameStatus:p.enum([`recorded`,`no-stack`,`no-application-frames`,`malformed-stack`,`no-asset-list`,`kept-local`]).optional(),subsystem:p.enum([`menu`,`menu-picture`,`unknown`]).optional(),repeats:Hp.optional(),resourceCount:Hp.optional(),httpStatus:p.number().int().min(100).max(599).optional(),deliveryGap:p.strictObject({refused:Hp,expired:Hp,evicted:Hp,exhausted:Hp}).optional()}),Wp={incidentId:p.uuid(),releaseIdentity:p.string().min(1).max(100),reason:p.enum([`render-loop`,`render-error`]),details:Up.optional()};p.discriminatedUnion(`surface`,[p.object({...Wp,surface:p.literal(`canvas`),canvasId:p.uuid()}),p.object({...Wp,surface:p.literal(`application`)})]),p.object({accepted:p.literal(!0)});const Gp=[`root`,`page`,`screen`,`frame`,`group`,`rectangle`,`image`,`svg`,`boolean`,`recording`,`prototype`,`text`],Kp=[`text-layer-missing`,`text-history-mismatch`,`text-action-identity`,`text-history-resolution`,`text-history-unavailable`,`resync-failed`,`unexpected`],qp=[`refused`,`fault`,`sign-in`,`no-edit-access`,`gone`,`restored`,`replan`,`deleted-target`,`whole-value-text`,`retrying`,`recovery`,`trace`],Jp=[...Kp,`request-too-large`,`server-refused`,`repeated-server-error`,`mutation-id-reused`,`base-ahead`,`upload-not-kept`,`preview-conflict`,`competing-edits`,`invalid-reconciliation`,`invalid-recovery-plan`,`history-restored`,`local-changes`,`no-edit-access`,`saved-canvas-unavailable`,`image-unreadable`,`storage-refused`,`unknown-baseline`,`invalid-text-source`,`session-expired`],Yp=[`saved`,`saving`,`review`,`retrying`,`upload`,`reconnecting`,`offline`,`not-kept`,`view-only`,`sign-in`,`gone`,`restored`],Xp=[`new`,`reopened`],Zp=[`started`,`resolved`,`superseded`,`shown`,`held-back`,`dismissed`,`action-started`,`action-outcome`,`long-wait`,`long-wait-ended`,`reported`],Qp=[`departure-protection`,`retained-copy-review`,`host-priority`,`owner-reentry`,`new-edit-while-blocked`,`restored-work`,`new-blocker`,`unknown`],$p=[`offline`,`retrying`,`upload`,`missing-image`,`missing-capture`,`review`,`view-only`,`not-backed-up`,`gone`,`refused`,`copy-refused`,`copy-preview`,`unknown`],em=[`critical`,`warning`,`info`],tm=[`kept`,`writing`,`unprotected`],nm=[`try-again`,`sync`,`overwrite`,`review`,`save-copy`,`save-separate-copy`,`send-feedback`,`retry-upload`,`choose-file`,`remove-screen`,`go-to-canvases`],rm=[`saved`,`kept-copy`,`still-blocked`],im=[`active`,`disabled`,`unavailable`],am=[`in-flight`,`retry-wait`,`device-write`,`upload`,`read`,`recovery`,`decision`,`offline`,`paused`,`not-held`],om=[`current-changes-unresolved`,`checking-saved-canvas`,`offline`,`saved-canvas-unavailable`,`sign-in`,`request-unsettled`,`no-edit-access`,`missing-file`,`local-copy-unsaved`,`file-unavailable`,`invalid-review`,`too-large`],sm=[`unknown`,`unclassified`,...Qa],cm=p.string().max(256).regex(/^[\w:.-]*$/u),lm=p.number().int().nonnegative(),um=e=>p.string().refine(t=>t===`unknown`||e.includes(t)),dm=um(ru),fm=p.strictObject({schema:p.literal(1),eventId:p.uuid(),occurredAt:p.number().int().nonnegative(),kind:p.enum(Zp),episodeKey:cm.optional(),nextEpisodeKey:cm.optional(),appearanceId:p.uuid().optional(),trigger:p.enum(Qp).optional(),cause:p.enum($p).optional(),severity:p.enum(em),command:p.literal(`unknown`),operationKinds:p.array(dm).max(64),refusalCode:p.enum(sm).optional(),operation:dm.optional(),component:um(Gp).optional(),deviceProtection:p.enum(tm),uploadsWaiting:lm,uploadsBlocked:lm,saveHold:p.enum(am).optional(),actions:p.array(p.enum(nm)).max(nm.length),syncBlock:p.enum(om).optional(),overwriteBlock:p.enum(om).optional(),outcome:p.enum(rm).optional(),action:p.enum(nm).optional(),replay:p.enum(im),lostRecords:lm});p.strictObject({canvasId:p.uuid(),releaseIdentity:p.string().min(1).max(100),report:p.enum(qp),detail:p.enum(Jp).optional(),mutationId:p.uuid().optional(),version:p.number().int().nonnegative(),attempts:p.number().int().nonnegative(),durationMs:p.number().int().nonnegative(),pendingChanges:p.number().int().nonnegative(),reason:p.enum(Jp).optional(),status:p.enum(Yp).optional(),episode:p.enum(Xp).optional(),trace:fm.optional()}),p.object({accepted:p.literal(!0),analytics:p.enum([`delivered`,`failed`,`disabled`,`no-identity`]).optional()}),p.discriminatedUnion(`type`,[p.object({type:p.literal(`enhance3:extension-probe`)}).strict(),p.object({type:p.literal(`enhance3:extension-present`)}).strict()]);const pm=p.enum([`content`,`popup`,`worker`,`offscreen`,`synthetic`]),mm=p.uuid(),hm=p.string().regex(/^[\w.-]{1,64}$/u),gm=p.enum([`0`,`1`,`2-5`,`6-25`,`26+`]),_m=p.number().int().min(0).max(18e5),$={correlationId:mm,extensionRelease:hm,capabilityVersion:p.number().int().min(1).max(16),context:pm};p.discriminatedUnion(`name`,[p.object({...$,name:p.literal(`context_lifecycle`),outcome:p.enum([`opened`,`ready`,`closed`,`open-failed`,`close-failed`])}),p.object({...$,name:p.literal(`screen_preview`),outcome:p.enum([`ready`,`unavailable`,`failed`]),source:p.enum([`button`,`shortcut`]),durationMs:_m,messageBytes:p.number().int().min(0).max(67108864)}),p.object({...$,name:p.literal(`authentication`),state:p.enum([`signed-in`,`signed-out`,`invalid`,`unknown`])}),p.object({...$,name:p.literal(`destination_request`),outcome:p.enum([`succeeded`,`empty`,`failed`]),latencyMs:_m,resultCountBucket:gm,retryOutcome:p.enum([`not-retried`,`retry-succeeded`,`retry-failed`])}),p.object({...$,name:p.literal(`destination_picker`),outcome:p.enum([`options`,`blank`,`error`]),optionCountBucket:gm}),p.object({...$,name:p.literal(`recording_transition`),state:p.enum([`starting`,`recording`,`stopping`,`landed`,`failed`,`cancelled`,`reloaded`]),terminalReason:p.enum([`none`,`completed`,`failed`,`cancelled`,`tab-closed`,`worker-reloaded`,`start-timeout`,`session-rejected`])}),p.object({...$,name:p.literal(`microphone_session`),outcome:p.enum([`opened`,`refused`,`closed`,`still-active`]),durationMs:_m,activeAudioTrackCount:p.number().int().min(0).max(8)}),p.object({...$,name:p.literal(`microphone_permission`),standing:p.enum([`prompt`,`granted`,`denied`,`unknown`]),outcome:p.enum([`observed`,`request-started`,`granted`,`denied`,`refused`,`no-device`,`in-use`,`unavailable`,`settings-opened`])}),p.object({...$,name:p.literal(`recording_cleanup`),outcome:p.enum([`released`,`still-active`,`incomplete`]),terminalReason:p.enum([`completed`,`failed`,`cancelled`,`tab-closed`,`worker-reloaded`,`start-timeout`,`session-rejected`]),mediaRecorderState:p.enum([`not-created`,`inactive`,`recording`,`paused`,`unknown`]),activeAudioTrackCount:p.number().int().min(0).max(8),audioContextState:p.enum([`not-created`,`closed`,`running`,`suspended`,`interrupted`,`unknown`]),offscreenDocumentState:p.enum([`open`,`closed`,`not-open`,`unknown`])}),p.object({...$,name:p.literal(`synthetic_stage`),stage:p.enum([`release-identity`,`authentication`,`destination-list`,`recording-start`,`recording-landed`,`microphone-release`]),outcome:p.enum([`passed`,`failed`]),durationMs:_m})]),p.object({accepted:p.literal(!0)});const vm=(e,t)=>typeof t==`string`&&e.includes(t)?t:null,ym=e=>{let{refusalCode:t,operation:n,component:r}=e.fields??{};if(t===void 0&&n===void 0&&r===void 0)return;let i=sm.find(e=>e===t);return{refusalCode:t===void 0?`unclassified`:i??`unknown`,operation:vm(ru,n)??`unknown`,component:vm(Gp,r)??`unknown`}},bm=`mutation-id-reused`,xm=`request-too-large`,Sm=/^\d+$/u,Cm=e=>{let t=e.fields?.reason;return t===`session-expired`||t===`session-invalid`?t:`signed-out`},wm=e=>{let t=e.fields??{},n=String(t.restoreFenceVersion);return Sm.test(n)?{kind:`restored`,fenceVersion:Number(n)}:t.retry===`later`?{kind:`transient`,retryAfterMs:null}:t.reason===`mutation-id-reused`?{kind:`fault`,detail:bm}:t.recovery===`required`?{kind:`replan`}:{kind:`refused`,reason:e.message}},Tm=e=>{let t=e.fields?.reason;if(t===`mutation-id-reused`)return{kind:`fault`,detail:bm};if(t===`request-too-large`)return{kind:`refused`,reason:xm};let n=ym(e);return{kind:`refused`,reason:e.message,...n!==void 0&&{refusal:n}}},Em=(e,t)=>{switch(e.code){case`UNAUTHORIZED`:return{kind:`sign-in`,reason:Cm(e)};case`FORBIDDEN`:return{kind:`no-edit-access`};case`NOT_FOUND`:return{kind:`gone`};case`CONFLICT`:return wm(e);case`RATE_LIMITED`:case`INTERNAL`:return{kind:`transient`,retryAfterMs:t};case`BAD_REQUEST`:return Tm(e)}},Dm=(e,t)=>e===401?{kind:`sign-in`,reason:`signed-out`}:e===403?{kind:`no-edit-access`}:e===404?{kind:`gone`}:e===413?{kind:`refused`,reason:xm}:e===408||e===429||e===460||e>=500?{kind:`transient`,retryAfterMs:t}:{kind:`refused`,reason:`the server answered ${String(e)}`},Om=e=>e.kind===`no-response`?{kind:`transient`,retryAfterMs:null}:e.appError===null?Dm(e.status,e.retryAfterMs):Em(e.appError,e.retryAfterMs),km=/^\d+$/u,Am=e=>{let t=e?.headers.get(`retry-after`)?.trim()??``;if(km.test(t))return Number(t)*1e3;let n=t.endsWith(` GMT`)?Date.parse(t):NaN;return Number.isNaN(n)?null:Math.max(0,n-Date.now())},jm=.2,Mm=(e,t=Math.random)=>{let n=Math.min(3e4,1e3*2**Math.max(0,e-1));return Math.round(n*(1-jm+2*jm*t()))},Nm=async e=>{try{return{value:await e}}catch(e){return{error:e}}},Pm=async e=>{if(`error`in e)throw e.error;return e.value},Fm=async(e,t)=>{for(let n=0;;n++){let r=await Nm(e(n)),i=t.failureOf(r),a=i===null?null:Om(i);if(a?.kind!==`transient`||n+1>=3)return Pm(r);let o=a.retryAfterMs??Mm(n+1);if(t.deadline!==void 0&&Date.now()+o>=t.deadline)return Pm(r);`value`in r&&await t.release?.(r.value),await t.wait(o)}};p.object({canvasId:p.uuid(),recordingId:p.uuid()});const Im=p.object({sequence:p.number().int().min(0),startMs:p.number().int().min(0),endMs:p.number().int().min(0),text:p.string().min(1)}),Lm=p.object({state:p.literal(`processing`),hasPublishedTranscript:p.boolean()}),Rm=p.object({state:p.literal(`ready`),languageCode:p.string().min(1),integrity:p.enum([`whole`,`partial`]),isRefreshing:p.boolean(),cues:p.array(Im)}),zm=p.object({state:p.literal(`empty`),reason:p.enum([`no-audio`,`too-short`,`audio-missing`,`no-speech`])}),Bm=p.object({state:p.literal(`failed`),canRetry:p.boolean()});p.discriminatedUnion(`state`,[Lm,Rm,zm,Bm]);const Vm=async(e,t)=>{try{await e.cancel(t)}catch{}},Hm=(e,t)=>{let{signal:n,arm:r,stop:i}=t,a=e.getReader();return new ReadableStream({start:e=>{n.addEventListener(`abort`,()=>{e.error(n.reason),Vm(a,n.reason)},{once:!0})},pull:async e=>{try{let t=await a.read();if(n.aborted)return;if(t.done){i(),e.close();return}r(),e.enqueue(t.value)}catch(t){i(),n.aborted||e.error(t)}},cancel:async e=>{i(),await a.cancel(e)}})},Um=(e,t=6e4)=>{let n=new AbortController,r=null,i=()=>{r!==null&&clearTimeout(r),r=null},a=()=>{i();let e=performance.now()+t;r=setTimeout(()=>{performance.now()-e>1e3?a():n.abort(new DOMException(`The transfer made no progress`,`TimeoutError`))},t)},o=e==null?n.signal:AbortSignal.any([e,n.signal]);return o.addEventListener(`abort`,i,{once:!0}),a(),{signal:o,stop:i,progress:()=>{o.aborted||a()},watchedBody:e=>(a(),Hm(e,{signal:o,arm:a,stop:i})),watchBody:e=>e.body===null?(i(),e):(a(),new Response(Hm(e.body,{signal:o,arm:a,stop:i}),{status:e.status,statusText:e.statusText,headers:e.headers}))}},Wm=e=>`Enhance: ${e}\n`,Gm=(e,t)=>{if(e.key!==void 0)return`${e.key.journey} › ${e.key.step}`;let n=t.find(t=>`testId`in t&&t.testId===e.testId)?.title??e.testId;return n===void 0?`a capture`:`a capture of "${n}"`},Km=e=>e.map(e=>Wm(`${e.code}: ${e.address}: ${e.reason}`)).join(``),qm=(e,t)=>(e.leftOut??[]).map(e=>Wm(`capture-left-out: ${Gm(e,t)}: ${e.message}`)).join(``)+Km(e.notUploaded??[]),Jm=(e,t)=>(e.runId===t?``:Wm(`run ${t} had expired, so its captures were published through run ${e.runId}.`))+Wm(e.canvasUrl)+e.issues.map(e=>Wm(`${e.code}: ${e.message}`)).join(``)+Km(e.notUploaded),Ym={unreadable:`it could not be read on this machine`,refused:`Enhance's storage refused it`},Xm=2147483647,Zm=new Map([[401,`authorization`],[403,`authorization`],[409,`conflict`],[400,`artifact`]]),Qm=e=>`error`in e?{kind:`no-response`}:e.value.ok?null:{kind:`response`,status:e.value.status,appError:null,retryAfterMs:Am(e.value)},$m=async(e,t)=>Fm(e,{failureOf:Qm,deadline:t,wait:async e=>{await new Promise(t=>{setTimeout(t,e)})},release:async e=>{await e.body?.cancel()}}),eh=async(e,t,n,r)=>{try{return await $m(async()=>fetch(e,{...t,signal:AbortSignal.timeout(n)}),r)}catch{throw b(`transport`,`Enhance did not confirm the request. Resume the same run to recover its result.`)}},th=async e=>{try{return await e.json()}catch{return null}},nh=async(e,t,n,r)=>{let{procedure:i,timeoutMs:a,publicationTimeoutMs:o}=r,s=await eh(e,t,a,Date.now()+o),c=await th(s);if(!s.ok){let e=typeof c==`object`&&c?Reflect.get(c,`error`):null,t=typeof e==`object`&&e?Reflect.get(e,`message`):null;throw b(Zm.get(s.status)??`transport`,typeof t==`string`?t.slice(0,1e3):`Enhance rejected ${i} (HTTP ${String(s.status)}).`)}let l=typeof c==`object`&&c?Reflect.get(c,`result`):null,u=typeof l==`object`&&l?Reflect.get(l,`data`):void 0,ee=n.safeParse(u);if(!ee.success)throw b(`transport`,`Enhance returned an incompatible ${i} response.`);return ee.data},rh=e=>{let t=URL.parse(e.apiUrl);if(t===null||![`http:`,`https:`].includes(t.protocol)||t.username!==``||t.password!==``||e.token.trim()===``)throw b(`configuration`,`Enhance needs an HTTP API URL and an explicit token.`);let n=e.timeoutMs??3e4,r=e.publicationTimeoutMs??6e5;if(!Number.isSafeInteger(r)||r<1)throw b(`configuration`,`Enhance publication timeout must be a positive integer in milliseconds.`);if(!Number.isSafeInteger(n)||n<1||n>Xm)throw b(`configuration`,`Enhance timeout must fit the Node timer range of 1 to 2147483647 milliseconds.`);return{timeoutMs:n,publicationTimeoutMs:r,request:async(i,a,o,{isQuery:s=!1,timeoutMs:c=n}={})=>{let l=new URL(`${t.pathname.replace(/\/$/u,``)}/trpc/${i}`,t.origin);return s&&l.searchParams.set(`input`,JSON.stringify(a)),nh(l,{method:s?`GET`:`POST`,headers:{authorization:`Bearer ${e.token}`,"content-type":`application/json`},...!s&&{body:JSON.stringify(a)},redirect:`error`},o,{procedure:i,timeoutMs:Math.max(1,Math.min(c,Xm)),publicationTimeoutMs:r})}}},ih=e=>{let t=new Map;for(let n of e){let e=`${n.key.journey} › ${n.key.step}`;for(let[r,i]of[[n.source.blob,`the snapshot of ${e}`],[n.preview.blob,`the picture of ${e}`],...n.assets.map(e=>[e.blob,e.url])])t.has(r.sha256)||t.set(r.sha256,i)}return t},ah=async e=>{try{return{value:await e}}catch(e){return{error:e}}},oh=async(e,t)=>{let n=Um();try{let r=await xt(e),i={method:`PUT`,headers:t.headers,body:n.watchedBody(r.stream()),duplex:`half`,signal:n.signal,redirect:`error`};return await fetch(t.url,i)}finally{n.stop()}},sh=async(e,t,n)=>{let r=await ah($m(async()=>oh(t,n),Date.now()+e.publicationTimeoutMs));if(`error`in r)return Ha.publish({stage:`upload`,error:r.error}),`retry`;let i=r.value;if(i.ok)return`stored`;let a=await i.text();return Ha.publish({stage:`upload`,status:i.status,answer:a}),i.status===403&&a.includes(`Request has expired`)?`expired`:Om({kind:`response`,status:i.status,appError:null,retryAfterMs:null}).kind===`transient`?`retry`:`refused`},ch=async(e,t,n)=>{let r=await e.request(`captureRun.reserveAssets`,{runId:t,blobs:n},$i);return new Map(r.uploads.map(e=>[e.sha256,e]))},lh=async(e,t,n,r)=>{if(r?.upload===null)return`stored`;if(r===void 0)return`retry`;let i=await sh(e,n.path,r.upload);if(i!==`expired`)return i;let a=(await ch(e,t,[n.blob])).get(n.blob.sha256);if(a?.upload===null)return`stored`;if(a===void 0)return`retry`;let o=await sh(e,n.path,a.upload);return o===`expired`?`retry`:o},uh=async(e,t,n,r)=>{let i=t.run.id,a=ih(r),o=[],s=(e,t)=>{o.push({code:`file-not-uploaded`,address:a.get(e.sha256)??e.sha256,reason:t})},c=[];for(let e of da(r)){let t=await Wa(n,e);t===null?s(e,Ym.unreadable):c.push({blob:e,path:t})}let l=!0;for(let t=0;t<c.length;t+=400){let n=c.slice(t,t+400),r=await ch(e,i,n.map(e=>e.blob));for(let t of n){let n=await lh(e,i,t,r.get(t.blob.sha256));n===`refused`?s(t.blob,Ym.refused):n!==`stored`&&(l=!1)}}return{notUploaded:o,isComplete:l}},dh=new Set([`sealed`,`converting`,`committed`]),fh=e=>b(`transport`,`Enhance could not take every file of this run yet. Resume the same manifest from this machine to finish it.`,e),ph=async(e,t)=>e.request(`captureRun.get`,{runId:t},Qi,{isQuery:!0}),mh=async(e,t)=>{try{return await ph(e,t)}catch{throw fh(t)}},hh=async(e,t,n)=>{let r=t.run.id;try{await e.request(`captureRun.seal`,{manifest:t},Qi,{timeoutMs:e.publicationTimeoutMs});return}catch(e){if(!Ra(e))throw e;if(e.code===`conflict`&&e.message===`None of this run’s screens arrived.`)throw b(`artifact`,e.message,r,n);if((e.code!==`conflict`||e.message!==`This capture run changed while it was being sealed.`)&&e.code!==`transport`)throw e}let i=await mh(e,r);if(!dh.has(i.state))throw i.state===`failed`?b(`conversion`,i.failure?.message??`The capture run failed.`,r,n):fh(r)},gh=async(e,t)=>{let n=t.run.id,r=()=>b(`pending`,`Capture run ${n} is still publishing to canvas ${t.run.canvasId}. It appears there when done.`,n),i=async()=>{try{return await e.request(`captureRun.publish`,{runId:n},Qi)}catch(e){throw Ra(e)&&e.code===`transport`?r():e}},a=await i(),o=Date.now()+e.publicationTimeoutMs;for(;a.receipt===null&&a.failure===null&&![`cancelled`,`failed`].includes(a.state);){if(Date.now()>=o)throw r();await new Promise(e=>{setTimeout(e,250)}),a=await i()}if(a.receipt===null)throw b(a.failure?.code===`conflict`?`conflict`:`conversion`,a.failure?.message??`The capture run was cancelled.`,n);return a.receipt},_h=(e,t)=>{if(e.runId!==t.run.id||e.canvasId!==t.run.canvasId||e.manifestDigest!==Va(t))throw b(`conflict`,`This run committed a different manifest.`,t.run.id);return e},vh=async(e,t)=>{let{review:n}=t.run,r=n===void 0?{canvasId:t.run.canvasId}:{destination:n.destination,...n.context!==void 0&&{context:n.context},...n.revision!==void 0&&{revision:n.revision},...n.compareTo!==void 0&&{compareTo:n.compareTo}},{run:i}=await e.transport.request(`captureRun.begin`,{...r,source:t.run.source,runKey:globalThis.crypto.randomUUID(),participants:t.run.participants},Xi);if(i.canvasId!==t.run.canvasId)throw b(`conflict`,`Capture run ${t.run.id} expired, and a new run for its review would publish to another canvas, so nothing was published. Capture again to publish this review.`,t.run.id);let a={...t,run:i};return await Ya(h.join(e.directory,`manifest-${i.id}.json`),a),a},yh=async(e,t,n)=>{let{transport:r,directory:i}=e,a=t.run.id,o=xa(t);if(`refusal`in o)throw b(`artifact`,o.refusal,a,{leftOut:o.leftOut,notUploaded:[]});let s=await ph(r,a);if(s.receipt!==null){let e=_h(s.receipt,t);return await Ya(h.join(i,`receipt.json`),e),{...e,notUploaded:[]}}if(s.state===`collecting`&&Date.parse(s.run.expiresAt)<=Date.now()){if(!n)throw fh(a);return yh(e,await vh(e,t),!1)}let c=[];if(s.state===`collecting`){let n=await uh(r,t,e.blobDirectories,o.captures);if(!n.isComplete)throw fh(a);({notUploaded:c}=n)}dh.has(s.state)||await hh(r,t,{leftOut:o.leftOut,notUploaded:c});let l=_h(await gh(r,t),t);return await Ya(h.join(i,`receipt.json`),l),{...l,notUploaded:c}},bh=async(e,t,n,r=[n])=>{try{return await yh({transport:e,directory:n,blobDirectories:r},t,!0)}catch(e){if(e instanceof Error){let n=Reflect.get(e,`runId`);throw Object.assign(e,{runId:typeof n==`string`?n:t.run.id})}throw b(`transport`,`Capture publication was not confirmed. Resume the same manifest.`,t.run.id)}},xh=(e,t)=>{let n=e.participants[0];if(n===void 0)throw b(`configuration`,`No capture participant was reserved.`);return{format:`enhance-capture-run`,version:1,run:e,ordering:`partial`,participants:[{id:n,status:`passed`}],attempts:[{runner:`script`,participant:n,retry:0,status:`passed`,captures:t}]}},Sh=async(e,t)=>{for(let n of t.blobs)await qa(e,n.description,n.bytes);return Ja(e,t.artifact)},Ch=(e,t,n)=>{let r=Vi.parse(t),i=[],a=!1;return{descriptor:r,directory:n,add:async e=>{if(a)throw b(`configuration`,`This run no longer accepts captures.`);let t=Sh(n,e);i.push(t),await t},publish:async()=>{a=!0;let t=await Promise.all(i);if(r.participants.length!==1)throw b(`configuration`,`Multi-participant runs must publish a complete merged manifest.`);let o=xh(r,t);return await At(n,{recursive:!0}),await Ya(h.join(n,`manifest.json`),o),bh(e,o,n)},cancel:async()=>(a=!0,(await e.request(`captureRun.cancel`,{runId:r.id},Qi)).receipt)}},wh=async(e,t)=>{let n=Yi.parse({canvasId:t.canvas,destination:t.destination,title:t.title,context:t.context,revision:t.revision,compareTo:t.compareTo,source:t.source,runKey:t.runKey,participants:t.participants}),{run:r}=await e.request(`captureRun.begin`,n,Xi),i=t.directory??h.join(`.enhance`,`captures`,r.id);return await At(i,{recursive:!0}),await Ya(h.join(i,`run.json`),r),Ch(e,r,i)},Th=async(e,t,n)=>{try{let r=await n();return t(Jm(r,e.run.id)),r}catch(n){throw Ra(n)&&t(qm(n,e.attempts)),n}},Eh=e=>f.stderr.write(e),Dh=e=>{let t=rh(e);return{captures:{review:async e=>t.request(`captureRun.review`,{canvasId:e},La.nullable(),{isQuery:!0}),decide:async(e,n)=>{await t.request(`captureRun.decide`,{canvasId:e,verdict:n},p.object({accepted:p.literal(!0)}))},reference:async(e,n)=>t.request(`captureRun.reference`,{canvasId:e,name:n},Fa.nullable(),{isQuery:!0}),promote:async e=>t.request(`captureRun.promote`,Ia.parse(e),Fa),publishManifests:async(e,n={})=>{let r=Ta(await Promise.all(e.map(async e=>Xa(e))));if(typeof r==`string`)throw b(`artifact`,r);let i=h.dirname(e[0]??`.`);return await Ya(h.join(i,`merged-manifest.json`),r),Th(r,n.write??Eh,async()=>bh(t,r,i,e.map(e=>h.dirname(e))))},begin:async e=>wh(t,e),publishManifest:async(e,n={})=>{let r=await Xa(e);return Th(r,n.write??Eh,async()=>bh(t,r,h.dirname(e)))},get:async e=>t.request(`captureRun.get`,{runId:e},Qi,{isQuery:!0})}}},Oh=(e,t)=>{let n=e instanceof Error?Reflect.get(e,`code`):void 0;return new u(n===`authorization`?`UNAUTHORIZED`:n===`conflict`?`CONFLICT`:[`configuration`,`artifact`].includes(String(n))?`BAD_REQUEST`:`INTERNAL`,e instanceof Error?e.message:`Capture publication was not confirmed.`,`Retry enhance captures publish with the same manifest: ${t}`)},kh=(e,t)=>{e.command(`captures`).description(`Publish SDK captures as editable canvas journeys.`).command(`publish <manifest>`).description(`Publish or resume a reserved capture manifest and print its durable receipt.`).action(async e=>{let n=await t.credentials.read();if(n===null)throw new u(`UNAUTHORIZED`,`Capture publication requires an agent token.`,`Run enhance auth login, then retry the same manifest.`);let r=Dh({apiUrl:t.apiUrl,token:n});try{t.output.result(await r.captures.publishManifest(e))}catch(t){throw Oh(t,e)}})},Ah={"captureRun.review":`Read product review for a run canvas.`,"canvas chats":`Chat history.`,"canvas.createEditableFrame":`Make a screen editable.`,"canvas.create":`Create a canvas.`,"canvas.get":`Read a canvas and access.`,"canvas.setAccess":`Change canvas link access.`,"canvas.list":`List canvases.`,"canvas.rename":`Rename a canvas.`,"canvas.setReviewState":`Set review state.`,"canvas.delete":`Bin a canvas.`,"canvas.move":`Move between shelves.`,"canvas.duplicate":`Copy a canvas.`,"canvas.copyWalkthroughs":`Copy walkthroughs between canvases.`,"canvas.deletePermanently":`Permanently delete a canvas.`,"canvas.restore":`Restore a binned canvas.`,"canvas.inspect":`Inspect a canvas.`,"canvas.tree":`Read the node hierarchy.`,"canvas.node":`Read a node and children.`,"canvas.selection":`Read the live selection.`,"canvas asset":`Manage uploaded assets.`,"canvas mutation":`Read mutation receipts.`,"canvas apply":`Apply canvas operations.`,"canvas find":`Find accessible canvases.`,"canvas remove":`Remove scoped subtrees.`,"canvas read":`Read linked content.`,"canvas update-html":`Update an HTML snapshot.`,"canvas publish-prototype":`Publish a static build.`,"canvas import-asset":`Import an image or font.`,"canvas insert-html":`Insert compiled HTML.`,"canvas make-editable":`Convert a captured screen.`,"canvas capture":`Capture a recording moment.`,"canvas arrange":`Arrange canvas objects.`,"canvas duplicate-nodes":`Duplicate node subtrees.`,"canvas text-style-library":`Manage text styles.`,"canvas realtime":`Canvas presence and activity.`,"canvas document":`Read or replace documents.`,"canvas version":`Retained canvas history.`,"canvas render":`Render canvas pixels.`,"canvas participants":`Manage participants.`,"canvas invites":`Invite people to a canvas.`},jh=(e,t=!1)=>{let n=Symbol(`explicit-null`),r=e.parseArg;return r===void 0?()=>!1:(e.argParser((e,i)=>{if(t&&e===`null`)return n;try{return r(e,i)}catch(t){try{return r(JSON.stringify(e),i)}catch{throw t}}}),e=>e===n)},Mh=()=>({exit:e=>{throw new he(e)}}),Nh=new Map([[`comment.resolve --resolved`,null],[`recording.start --page-title`,null],[`recording.start --viewport`,null],[`screen.create --page-title`,null],[`screen.create --provenance`,null],[`screen.create --route`,null],[`screen.create --viewport`,null],[`canvas render --canvas`,`--input`],[`canvas.inspect --canvas`,`--canvas-id`],[`canvas.tree --canvas`,`--canvas-id`],[`canvas.node --canvas`,`--canvas-id`],[`canvas.selection --canvas`,`--canvas-id`],[`canvas read --canvas`,`--input`],[`canvas duplicate-nodes --canvas`,`--input`],[`canvas duplicate-nodes --base-version`,`--input`],[`canvas duplicate-nodes --nodes`,`--input`]]),Ph=(e,t)=>Nh.get(`${e} ${t??``}`),Fh=(e,t)=>e.options.flatMap(n=>{let r=Ph(t,n.long);if(r===void 0)return[];if(r===null)return[{option:n,replacement:null}];let i=e.options.find(e=>e.long===r);if(i===void 0)throw TypeError(`${t} has no ${r} to replace ${n.flags}.`);return[{option:n,replacement:i}]}),Ih=({option:e,replacement:t})=>{let n=e.long??e.flags;return t===null?new u(`BAD_REQUEST`,`${n} is required unless --json supplies the complete input.`,`Pass ${n} explicitly, including false or null when that is the intended value.`):new u(`BAD_REQUEST`,`${n} is required unless ${t.long??t.flags} is given.`,`Pass ${n}, or use ${t.long??t.flags} instead.`)},Lh=(e,t)=>{let n=Fh(e,t);if(n.length!==0){for(let{option:e,replacement:t}of n)t!==null&&(e.description=`${e.description} Required unless ${t.long??t.flags} is given.`);e.hook(`preAction`,(t,r)=>{if(r!==e||r.getOptionValueSource(`json`)===`cli`)return;let i=e=>r.getOptionValueSource(e.attributeName())===`cli`,a=n.find(({option:e,replacement:t})=>!i(e)&&(t===null||!i(t)));if(a!==void 0)throw Ih(a)})}},Rh={"canvas text-style-library":`Find, read, and publish reusable text styles across canvases.`,"canvas chats":`Inspect and manage authorized canvas chat history.`,canvas:`Create, find, share and manage canvases.`,"canvas render":`Render production-faithful canvas pixels after inspecting exact structure and geometry.`,"canvas version":`Inspect and name retained canvas history.`,"canvas document":`Read or replace the opaque document stored on a canvas.`,"canvas invites":`Invite people to a canvas and manage pending invitations.`,"canvas participants":`List and change the people who can reach a canvas.`,comment:`Comment threads and replies anchored to canvas content.`,organisation:`Teams the authenticated person belongs to or creates.`,"organisation invites":`Invite people to a team and manage pending invitations.`,"organisation people":`Team roster membership and roles.`,person:`The current person, sharing recipients, and agent tokens.`,"person recipients":`People available when choosing sharing recipients.`,recording:`Recorded walkthroughs, chunks, recovery, and completion.`,"recording-asset":`External page assets mirrored for durable replay.`,screen:`Captured pages uploaded for placement on a canvas.`},zh=new Set([`canvas.invites.accept`,`canvas.invites.preview`,`organisation.invites.accept`,`organisation.invites.preview`]),Bh=new Set([`canvas.create --organisation-id`,`canvas.create --source-url`,`recording.start --audio`,`recording.start --page-title`,`screen.create --page-title`,`screen.create --provenance`,`screen.create --route`]),Vh=e=>typeof e==`object`&&e&&!Array.isArray(e)?Object.fromEntries(Object.entries(e)):null,Hh=e=>{let t=Vh(Reflect.get(e,`__trpcCli`)),n=t===null?void 0:t.path;return typeof n==`string`?n:null},Uh=(e,t,n,r)=>{let i=t.long,a=Hh(e)??r.join(` `),o=a===``||i===void 0?void 0:ce[`${a} ${i}`];if(o!==void 0)return o;if(i!==void 0&&ce[i]!==void 0)return ce[i];let s=(n.split(/Any of:|One of:/u,1)[0]?.trim()??``).split(`;`).map(e=>e.trim()).filter(e=>e!==``&&[`Format:`,`Pattern:`,`Min length:`,`Max length:`].every(t=>!e.startsWith(t))).join(`; `);return s===``?`Value for ${i??t.attributeName()} on ${e.name()}.`:s},Wh=(e,t,n)=>{let r=Mh();e.exitOverride(e=>r.exit(e.exitCode)),e.configureOutput({writeOut:e=>t.output.logger.info?.(e),writeErr:e=>t.output.logger.error?.(e)}),e.showHelpAfterError(!1).showSuggestionAfterError(!1);let i=[],a=Hh(e)??n.join(` `);for(let t of e.options){t.description=Uh(e,t,t.description,n);let r=Bh.has(`${a} ${t.long??``}`),o=jh(t,r);r&&i.push({name:t.attributeName(),matches:o})}i.length>0&&e.hook(`preAction`,e=>{for(let t of i)t.matches(e.getOptionValue(t.name))&&e.setOptionValueWithSource(t.name,null,`cli`)}),Lh(e,a)},Gh=(e,t,n,r)=>{(n!==null&&r.mutationPaths.has(n)||t[0]===`fixture`)&&(e.options.every(e=>e.long!==`--client-token`)&&e.option(`--client-token <uuid>`,ce[`--client-token`]),e.hook(`preAction`,e=>{let n=e.getOptionValue(`clientToken`),i=p.uuid().nullable().safeParse(n??null);if(!i.success)throw new u(`BAD_REQUEST`,`--client-token must be a UUID.`,`Mint one UUID and reuse it only when retrying this exact command.`);r.mutationKey.select(i.data,t[0]===`fixture`)}))},Kh=(e,t,n)=>{n===null||!zh.has(n)||(e.options.find(e=>e.long===`--token`)?.makeOptionMandatory(!1),e.hook(`preAction`,async e=>{let n=e.getOptionValue(`token`);if(n===void 0&&e.getOptionValue(`json`)!==void 0)return;let r=await un(typeof n==`string`?n:void 0,`enhance ${t.join(` `)}`);e.setOptionValueWithSource(`token`,r,`cli`)}))},qh=(e,t,n,r)=>{let i=Rh[t.join(` `)];i===void 0?n!==null&&e.description(ze[n]??r.get(n)??`Run the ${n} API operation.`):e.description(i);let a=Ah[t.join(` `)]??(n===null?void 0:Ah[n]);a!==void 0&&e.summary(a)},Jh=(e,t,n=[])=>{Wh(e,t,n);for(let r of e.commands){let e=[...n,r.name()],i=Hh(r);Gh(r,e,i,t),qh(r,e,i,t.descriptions),Kh(r,e,i),Jh(r,t,e)}},Yh=ve().excludedProcedures,Xh=new Set([`canvas thumbnail`,`canvas font-catalog`,`telemetry`]),Zh=e=>{let t=Reflect.get(e,`__trpcCli`);if(typeof t!=`object`||!t)return null;let n=Reflect.get(t,`path`);return typeof n==`string`?n:null},Qh=(e,t=[])=>{let n=e.commands.filter(e=>{let n=Zh(e),r=[...t,e.name()].join(` `);return!Xh.has(r)&&(n===null||!Yh.has(n))});Reflect.set(e,`commands`,n);for(let e of n)Qh(e,[...t,e.name()])},$h=e=>{let t=Reflect.get(e,`__trpcCli`);if(typeof t!=`object`||!t)return null;let n=Reflect.get(t,`path`);return typeof n==`string`?n:null},eg=(e,t=[])=>e.commands.filter(e=>e.name()!==`help`).flatMap(e=>{let n=[...t,e.name()];return[{command:e,path:n.join(` `)},...eg(e,n)]}),tg=(e,t=[])=>e.commands.filter(e=>e.name()!==`help`).flatMap(e=>{let n=[...t,e.name()],r=$h(e);return[{path:n.join(` `),procedure:r,description:e.description(),kind:r===null?e.commands.length>0?`namespace`:`utility`:`derived`,helpCharacters:e.helpInformation().length},...tg(e,n)]}),ng=(e,t)=>({...t.describe(e.id),outputSchema:p.toJSONSchema(e.outputSchema,{unrepresentable:`any`,io:`output`}),exampleOutput:e.guide.examples[0]?.output??null}),rg=(e,t)=>{let n=t(),r=Ee(n),i=Pe();return eg(e).flatMap(({command:e,path:t})=>{let a=$h(e),o=n.find(({cli:e})=>e?.path===t);return o===void 0&&a===null&&e.commands.length>0?[]:[{path:t,description:e.description(),usage:`${t} ${e.usage()}`,arguments:e.registeredArguments.map(e=>({name:e.name(),required:e.required,variadic:e.variadic,description:e.description})),options:e.options.filter(e=>!e.hidden).map(e=>{let n=Ph(a??t,e.long);return{flags:e.flags,description:e.description,required:n!==void 0||e.mandatory,...typeof n==`string`&&{requiredUnless:n},...e.defaultValue!==void 0&&{defaultValue:e.defaultValue}}}),..._i[t]!==void 0&&{example:_i[t]},capability:o===void 0?null:ng(o,r),exitCodes:i}]})},ig=(e,t,n)=>{e.command(`commands`).description(`Emit the command inventory as NDJSON without walking the help tree.`).option(`--namespace <path>`,`Keep commands at or below this space-separated path.`).option(`--capabilities`,`Emit the transport-neutral capability inventory.`,!1).option(`--reference`,`Emit complete shared capability contracts for documentation.`,!1).option(`--records`,`Emit the complete contract of each listed command for documentation.`,!1).action(r=>{if(r.reference){let e=ue(n()),r=Ee(e);t.result({items:e.map(e=>ng(e,r)),truncated:!1});return}if(r.records){t.result({items:rg(e,n),truncated:!1});return}if(r.capabilities){t.result({items:lt(n()),truncated:!1});return}let i=r.namespace?.trim(),a=tg(e).filter(e=>i===void 0||e.path===i||e.path.startsWith(`${i} `));t.result({items:a,truncated:!1})})},ag=(e,t,n,r)=>{let i=e.commands.find(e=>e.name()===`comment`);if(i===void 0)throw TypeError(`derived comment namespace is missing`);i.command(`attention`).description(`List every open comment needing attention; source metadata is included when a capture has it.`).argument(`<canvas-url-or-id>`,`A pasted Enhance canvas URL shaped /c/<UUID>, or a bare canvas UUID.`).action(async e=>{r.result(await t.invoke({capability:d(n(),`comment.attention`),arguments:{canvasId:te(e)},clientToken:null}))})},og=(e,t)=>{let{version:n,credentials:r,remote:i,output:a}=t;e.command(`doctor`).description(`Check the installed binary, API reachability, and credential file without changes.`).action(async()=>{let[e,t]=await Promise.all([i.health(),r.read()]);a.result({status:t!==null&&e.reachable?`ok`:`degraded`,binary:f.argv[1]??`enhance`,version:n,api:e,credential:{path:r.path,present:t!==null}})})},sg=e=>p.coerce.number().int().positive().parse(e),cg=p.record(p.string(),p.unknown()),lg=(e,t)=>{let n=cg.safeParse(e);if(!n.success)return 0;let r=n.data.atMs;if(typeof r==`number`&&Number.isFinite(r))return Math.max(0,Math.round(r));let i=n.data.timestamp;return typeof i==`number`&&Number.isFinite(i)?Math.max(0,Math.round(i-t)):0},ug=async e=>{let t=(await jt(e,`utf8`)).split(`
|
|
35
35
|
`).filter(e=>e.trim()!==``).map(e=>JSON.parse(e)),n=t.map(e=>cg.safeParse(e).data?.timestamp).find(e=>typeof e==`number`&&Number.isFinite(e));return t.map(e=>({atMs:lg(e,n??0),event:e}))},dg=async e=>({clientToken:e.clientToken??Ot(),body:await jt(e.file),route:e.route??null,pageTitle:e.pageTitle??h.basename(e.file),viewport:{width:e.width,height:e.height},provenance:null}),fg=e=>e.option(`--width <pixels>`,`Captured viewport width.`,sg,1440).option(`--height <pixels>`,`Captured viewport height.`,sg,900),pg=(e,t,n)=>{fg(e.command(`screen`).description(`Upload one captured page and return its reusable screen id.`).requiredOption(`--file <path>`,`File containing the captured HTML bytes.`).option(`--client-token <uuid>`,`Stable UUID to reuse when retrying the same upload.`).option(`--route <url>`,`Original browser route, when it is safe to retain.`).option(`--page-title <title>`,`Captured page title.`)).action(async e=>{n.result(await t(await dg(e)))})},mg=(e,t,n)=>{fg(e.command(`recording`).description(`Upload NDJSON rrweb events as a walkthrough; chunk offsets start at the first event.`).requiredOption(`--file <path>`,'NDJSON with one rrweb event per line; minimum example: `{"type":2,"timestamp":1000}`.').requiredOption(`--source-url <url>`,`Required route the recording represents.`).option(`--page-title <title>`,`Title for a newly created walkthrough canvas.`).option(`--canvas-id <uuid>`,`Existing canvas to receive the walkthrough.`)).action(async e=>{n.result(await t({entries:await ug(e.file),sourceUrl:e.sourceUrl,pageTitle:e.pageTitle??null,viewport:{width:e.width,height:e.height},...e.canvasId!==void 0&&{canvasId:e.canvasId}}))})},hg=(e,t,n)=>{fg(e.command(`world`).description(`Create a team, a canvas, and zero or more attached screen fixtures.`).requiredOption(`--organisation-name <name>`,`Name of the team to create.`).requiredOption(`--canvas-title <title>`,`Title of the canvas to create.`).option(`--screen <path...>`,`Captured HTML files to upload and attach.`)).action(async e=>{let r=[],i=e.screen??[];for(let t of i)r.push(await dg({file:t,width:e.width,height:e.height}));n.result(await t({organisationName:e.organisationName,canvasTitle:e.canvasTitle,screens:r}))})},gg=(e,t,n)=>{let r=e.command(`fixture`).description(`Build deterministic product fixtures.`);pg(r,t.screen,n),mg(r,t.recording,n),hg(r,t.world,n)},_g=(e,n)=>{e.command(`operation`).description(`Read existing domain-owned operation outcomes.`).command(`status`).description(`Recover an existing outcome without creating or resuming work.`).requiredOption(`--input <json-or-@path>`,`Operation reference and optional detail offset/limit.`).action(async e=>{n.output.result(await n.invocation.invoke({capability:d(n.catalog(),`operation.status`),arguments:g(e.input,t,`--input`),clientToken:null}))})},vg=e=>p.coerce.number().parse(e),yg=e=>p.coerce.number().positive().parse(e),bg=e=>p.coerce.number().int().positive().parse(e),xg=(e,t,n,r)=>{(e.commands.find(e=>e.name()===`prototype`)??e.command(`prototype`).description(`Publish static frontend prototypes.`)).command(`publish`).description(`Package and publish an unpacked static build directory. The CLI creates the upload artifact. To update a prototype, publish to its owner node: pass --prototype-id and that node as --node-id. Any other node that shows it forks into its own prototype. An update keeps the title the node shows; --title only names a new node.`).requiredOption(`--canvas-id <uuid>`,`Canvas that receives the prototype.`).requiredOption(`--directory <path>`,`Unpacked static build directory; do not pass a ZIP file.`).requiredOption(`--title <title>`,`Label above the prototype frame.`).requiredOption(`--base-version <number>`,`Current canvas document version.`,bg).option(`--prototype-id <uuid>`,`Existing prototype identity to publish a new deployment.`).option(`--client-token <uuid>`,`Stable retry token for this exact build.`).option(`--node-id <id>`,`Exact canvas node to create, update, or fork when it is a copy.`).option(`--entry <path>`,`HTML entry relative to the uploaded directory.`,`index.html`).option(`--x <pixels>`,`Canvas x coordinate.`,vg,48).option(`--y <pixels>`,`Canvas y coordinate.`,vg,48).option(`--width <pixels>`,`Prototype viewport width.`,yg,1440).option(`--height <pixels>`,`Prototype viewport height.`,yg,900).action(async e=>{let i=e.clientToken??Ot();r.result(await t.invoke({capability:d(n(),`prototype.publish`),arguments:{canvasId:e.canvasId,prototypeId:e.prototypeId??null,targetMode:e.prototypeId!==void 0&&e.nodeId===void 0?`prototype`:`node`,nodeId:e.nodeId??`proto_${i.replaceAll(`-`,``)}`,title:e.title,directory:e.directory,entryPath:e.entry,baseVersion:e.baseVersion,box:{x:e.x,y:e.y,width:e.width,height:e.height}},clientToken:i}))})},Sg=(e,t,n)=>{let r=(n?p.coerce.number().int().positive():p.coerce.number().int().nonnegative()).safeParse(e);if(!r.success)throw new u(`BAD_REQUEST`,`${t} is invalid.`,`Run 'enhance recording snapshot --help'.`);return r.data},Cg=(e,t)=>{let n=e.commands.find(e=>e.name()===`recording`);if(n===void 0)throw TypeError(`the API router did not supply recording commands`);n.command(`snapshot`).description(`Persist one visually accepted recording moment as an ordinary screen and frame.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID containing the recording.`).requiredOption(`--recording-id <uuid>`,`Recording UUID returned by recording list.`).requiredOption(`--at-ms <integer>`,`Accepted recording timestamp in milliseconds.`).option(`--timeout-ms <integer>`,`Local polling deadline in milliseconds.`,`120000`).option(`--client-token <uuid>`,`Stable UUID to reuse only when retrying this exact snapshot.`).addHelpText(`after`,`
|
|
36
36
|
Preview first: canvas render --node-id rec_<recording-uuid> --at-ms <integer>, then inspect its PNG. This command persists the accepted moment.
|
|
37
37
|
`).action(async e=>{let n=p.uuid().nullable().safeParse(e.clientToken??null),r=p.uuid().safeParse(e.recordingId);if(!n.success||!r.success)throw new u(`BAD_REQUEST`,`The recording id or client token is not a UUID.`,"Use the recording id from `recording list`; mint one client token per accepted moment.");t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`recording.snapshot`),arguments:{canvasId:te(e.canvas),recordingId:r.data,atMs:Sg(e.atMs,`--at-ms`,!1),timeoutMs:Sg(e.timeoutMs,`--timeout-ms`,!0)},clientToken:n.data}))})},wg=(e,t,n)=>{if(e!==`canvas.document.save`||typeof n!=`object`||!n||!(`outcome`in n)||n.outcome!==`conflict`)return n;throw new u(`CONFLICT`,`The canvas document changed before this save landed.`,`Run 'enhance canvas document get --canvas-id ${typeof t==`object`&&t&&`canvasId`in t&&typeof t.canvasId==`string`?t.canvasId:`<canvas-id>`}', merge your change into that document, then retry with its version.`)},Tg=(e,t)=>Rt(e,e=>({[e]:{query:async n=>t.query(e,n),mutate:async n=>wg(e,n,await t.mutate(e,n))}})),Eg=(e,t)=>{let n=e.commands.find(e=>e.name()===`transcript`);if(n===void 0)throw TypeError(`the API router did not supply transcript commands`);n.command(`get`).description(`Read timestamped speech cues as candidate moments; render and inspect candidate PNGs before snapshotting.`).requiredOption(`--canvas <url-or-id>`,`Canvas URL or UUID containing the recording.`).requiredOption(`--recording-id <uuid>`,`Recording UUID returned by recording list.`).action(async e=>{let n=p.uuid().safeParse(e.recordingId);if(!n.success)throw new u(`BAD_REQUEST`,`--recording-id must be a UUID.`,"Use the recording id returned by `enhance recording list`.");t.output.result(await t.invocation.invoke({capability:d(t.catalog(),`transcript.read`),arguments:{canvasId:te(e.canvas),recordingId:n.data},clientToken:null}))})},Dg={jsonInput:`auto`,prompts:!1,logger:`ndjson`,errorMapping:`stable-exit-codes`},Og=e=>{let t=e.state;return{logger:e.output.logger,prompts:Dg.prompts,process:Mh(),formatError:e=>{let n=pe(e,t.pendingParserMessage);return t.exitCode=Ae(n,!1,e),t.pendingParserMessage=null,JSON.stringify(n)}}},kg=e=>typeof e==`object`&&e&&!Array.isArray(e)?Object.fromEntries(Object.entries(e)):null,Ag=e=>{let t=kg(e),n=t===null?void 0:t.description;return typeof n==`string`&&n!==``?n:null},jg=e=>({descriptions:new Map(e.flatMap(([e,t])=>{let n=Ag(t.meta);return n===null?[]:[[e,n]]})),mutationPaths:new Set(e.flatMap(([e,t])=>t.type===`mutation`?[e]:[]))}),Mg=()=>{let e=null;return()=>(e??=De(),e)},Ng=(e,t,n)=>{let r=sn(t.remote),i=nt({remote:t.remote,mutationKey:t.mutationKey,configDirectory:t.configDirectory,now:()=>new Date,progress:t.output.result});fn(e,ct(t.credentials,t.remote,$e(t.remote)),t.output),ag(e,i,n,t.output),kh(e,t),_g(e,{invocation:i,catalog:n,output:t.output}),og(e,{version:t.version,credentials:t.credentials,remote:t.remote,output:t.output}),gg(e,{screen:r,recording:an(t.remote),world:ln(t.remote,r)},t.output),ig(e,t.output,n),Ai(e,{remote:t.remote,mutationKey:t.mutationKey,invocation:i,catalog:n,output:t.output,configDirectory:t.configDirectory,now:()=>new Date}),Cg(e,{invocation:i,catalog:n,output:t.output}),xg(e,i,n,t.output),Eg(e,{invocation:i,catalog:n,output:t.output})},Pg=e=>{let t=ft({router:Se()}),n=Mg(),{descriptions:r,mutationPaths:i}=jg(t),a=dt({router:Tg(t,e.remote),name:e.commandName,version:e.version,description:`Operate Enhance as the authenticated person.`,jsonInput:Dg.jsonInput}),o=Og(e),s=a.buildProgram(o);if(!(s instanceof ut))throw TypeError(`trpc-cli did not return a Commander program`);Qh(s),Ng(s,e,n),Jh(s,{descriptions:r,mutationPaths:i,mutationKey:e.mutationKey,output:e.output}),s.description(`Operate Enhance as the authenticated person.`);let c=e.state;return{program:s,run:async()=>{try{await a.run(o,s)}catch(t){if(!(t instanceof he))throw t;if(t.requestedCode!==0&&c.pendingParserMessage!==null){let n=pe(t,c.pendingParserMessage);c.exitCode=Ae(n,!0),c.pendingParserMessage=null,e.output.failure(n)}throw t}}}},Fg=e=>f.exit(e),Ig=36e5,Lg=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Rg=e=>{if(Array.isArray(e))return e.map(e=>JSON.stringify(e));if(!Lg(e)||!Array.isArray(e.items)||`nextCursor`in e)return[JSON.stringify(e)];let t=e.items;if(t.length===0)return[JSON.stringify(e)];let n=e.truncated===!0;return t.map(e=>JSON.stringify(Lg(e)?{...e,truncated:n}:{value:e,truncated:n}))},zg=e=>{let t=`${e.join(`
|
|
38
38
|
`)}\n`;if(!(t.length>25e3||e.some(e=>e.length>2e3))){f.stdout.write(t);return}let n=Dt(`sha256`).update(t).digest(`hex`).slice(0,16),r=h.join(mt(),`enhance-${n}.ndjson`);Et(r,t,{mode:384}),f.stdout.write(`${JSON.stringify({path:r,characters:t.length,records:e.length})}\n`)},Bg=e=>{try{let t=new URL(e),n=new Set;for(let e of t.searchParams.keys())n.add(e.toLowerCase());return n.has(`x-amz-signature`)||n.has(`x-amz-credential`)||n.has(`x-amz-algorithm`)}catch{return!1}},Vg=e=>typeof e==`string`?Bg(e):Array.isArray(e)?e.some(e=>Vg(e)):Lg(e)?Object.values(e).some(e=>Vg(e)):!1,Hg=e=>{bt(e,{recursive:!0,mode:448}),gt(e,448)},Ug=e=>{if(!vt(e))return;let t=Date.now()-Ig,n=Ct(e,{withFileTypes:!0});for(let r of n){if(!r.isFile()||!r.name.startsWith(`result-`))continue;let n=h.join(e,r.name);yt(n).mtimeMs<t&&Tt(n)}},Wg=e=>({...e,sensitive:!0,cleanup:`unlink-after-use`,deleteAfter:new Date(Date.now()+Ig).toISOString()}),Gg=(e,t)=>{let n=Rg(e),r=`${n.join(`
|
|
39
|
-
`)}\n`;Hg(t);let i=h.join(t,`result-${Ot()}.ndjson`);Et(i,r,{mode:384,flag:`wx`}),f.stdout.write(`${JSON.stringify(Wg({path:i,characters:r.length,records:n.length,reason:`signed-url`}))}\n`)},Kg=e=>Lg(e)?typeof e.token==`string`?{field:`token`,value:e.token}:typeof e.acceptToken==`string`?{field:`acceptToken`,value:e.acceptToken}:null:null,qg=(e,t,n)=>{let r=`${t.value}\n`;Hg(n);let i=h.join(n,`result-${Ot()}.token`);Et(i,r,{mode:384,flag:`wx`});let a=Object.fromEntries(Object.entries(e).filter(([e])=>e!==t.field));f.stdout.write(`${JSON.stringify({...a,secret:Wg({path:i,field:t.field,characters:r.length})})}\n`)},Jg=e=>e.includes(`Usage:`)||e.includes(`Options:`)||e.includes(`Commands:`),Yg=ne.omit({fields:!0}).extend({remediation:p.string(),fields:p.array(p.object({path:p.string(),message:p.string()})).optional()}),Xg=e=>{try{let t=JSON.parse(e),n=Yg.safeParse(t);return n.success?{code:n.data.code,message:n.data.message,remediation:n.data.remediation,...n.data.fields!==void 0&&{fields:n.data.fields}}:null}catch{return null}},Zg=(e,t)=>{if(typeof e==`string`&&Jg(e)){f.stdout.write(e);return}let n=Kg(e);if(n!==null&&Lg(e)){qg(e,n,t);return}if(Vg(e)){Gg(e,t);return}let r=ke(e);if(r!==null){let e=null;if(r.detail!==null){Hg(t);let n=h.join(t,`result-${Ot()}.ndjson`),i=`${JSON.stringify(r.detail)}\n`;Et(n,i,{mode:384,flag:`wx`}),e=Wg({path:n,characters:i.length,records:1})}f.stdout.write(`${JSON.stringify({...r.value,...e!==null&&{detail:e}})}\n`);return}zg(Rg(e))},Qg=e=>{f.stderr.write(`${JSON.stringify(e)}\n`)},$g=(e,t,n=`enhance`)=>{let r=e,i=h.join(t,`sensitive`);return Ug(i),{result:e=>{Zg(we(e,n),i)},failure:e=>{Qg(je(e,n))},logger:{info:(...e)=>{Zg(we(e.length===1?e[0]:e,n),i)},error:(...e)=>{let t=String(we(e.map(String).join(``),n)),i=Xg(t);i===null?r.pendingParserMessage=t:Qg(i)}}}};(async()=>{let e=Ye(),t={exitCode:1,pendingParserMessage:null},n=$g(t,e.configDirectory,e.commandName),r=tt(e.configDirectory),i=rt(),a=Qe(e.apiUrl,r,i),o=Pg({apiUrl:e.apiUrl,version:`0.1.41-dev.sha-
|
|
39
|
+
`)}\n`;Hg(t);let i=h.join(t,`result-${Ot()}.ndjson`);Et(i,r,{mode:384,flag:`wx`}),f.stdout.write(`${JSON.stringify(Wg({path:i,characters:r.length,records:n.length,reason:`signed-url`}))}\n`)},Kg=e=>Lg(e)?typeof e.token==`string`?{field:`token`,value:e.token}:typeof e.acceptToken==`string`?{field:`acceptToken`,value:e.acceptToken}:null:null,qg=(e,t,n)=>{let r=`${t.value}\n`;Hg(n);let i=h.join(n,`result-${Ot()}.token`);Et(i,r,{mode:384,flag:`wx`});let a=Object.fromEntries(Object.entries(e).filter(([e])=>e!==t.field));f.stdout.write(`${JSON.stringify({...a,secret:Wg({path:i,field:t.field,characters:r.length})})}\n`)},Jg=e=>e.includes(`Usage:`)||e.includes(`Options:`)||e.includes(`Commands:`),Yg=ne.omit({fields:!0}).extend({remediation:p.string(),fields:p.array(p.object({path:p.string(),message:p.string()})).optional()}),Xg=e=>{try{let t=JSON.parse(e),n=Yg.safeParse(t);return n.success?{code:n.data.code,message:n.data.message,remediation:n.data.remediation,...n.data.fields!==void 0&&{fields:n.data.fields}}:null}catch{return null}},Zg=(e,t)=>{if(typeof e==`string`&&Jg(e)){f.stdout.write(e);return}let n=Kg(e);if(n!==null&&Lg(e)){qg(e,n,t);return}if(Vg(e)){Gg(e,t);return}let r=ke(e);if(r!==null){let e=null;if(r.detail!==null){Hg(t);let n=h.join(t,`result-${Ot()}.ndjson`),i=`${JSON.stringify(r.detail)}\n`;Et(n,i,{mode:384,flag:`wx`}),e=Wg({path:n,characters:i.length,records:1})}f.stdout.write(`${JSON.stringify({...r.value,...e!==null&&{detail:e}})}\n`);return}zg(Rg(e))},Qg=e=>{f.stderr.write(`${JSON.stringify(e)}\n`)},$g=(e,t,n=`enhance`)=>{let r=e,i=h.join(t,`sensitive`);return Ug(i),{result:e=>{Zg(we(e,n),i)},failure:e=>{Qg(je(e,n))},logger:{info:(...e)=>{Zg(we(e.length===1?e[0]:e,n),i)},error:(...e)=>{let t=String(we(e.map(String).join(``),n)),i=Xg(t);i===null?r.pendingParserMessage=t:Qg(i)}}}};(async()=>{let e=Ye(),t={exitCode:1,pendingParserMessage:null},n=$g(t,e.configDirectory,e.commandName),r=tt(e.configDirectory),i=rt(),a=Qe(e.apiUrl,r,i),o=Pg({apiUrl:e.apiUrl,version:`0.1.41-dev.sha-4a76a9fc808c`,credentials:r,remote:a,mutationKey:i,output:n,state:t,configDirectory:e.configDirectory,commandName:e.commandName});try{await o.run()}catch(e){e instanceof he&&Fg(e.requestedCode===0?0:t.exitCode),n.failure(pe(e,null)),Fg(1)}})().catch(e=>{f.stderr.write(`${e instanceof Error?e.message:`CLI startup failed.`}\n`),f.exitCode=1});export{};
|