@enhance-eng/enhance-dev 0.1.40-dev.sha-bac7358efc9e → 0.1.41-dev.sha-34e2502f4133
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-BcUP7hqi.mjs → cli-output-identity.lib-a7FnosDV.mjs} +1 -1
- package/dist/main.mjs +3 -3
- package/dist/mcp-main.mjs +2 -2
- package/dist/{mcp-server.adapter-Dgwz_yER.mjs → mcp-server.adapter-BcqAycvw.mjs} +1 -1
- package/dist/mcp.mjs +1 -1
- package/dist/{mutation-key.adapter-nl7UiXCz.mjs → mutation-key.adapter-DajAZPlF.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-a7FnosDV.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-DajAZPlF.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,7 +15,7 @@ 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},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`},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),14]),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===14||!jo(e.nodes))return e;let n=Object.entries(Za).find(([e])=>Number(e)===t)?.[1];return Ao.has(n)?{...e,version:14}:Object.values(e.nodes).some(e=>jo(e)&&e.geometry!==void 0)?null:n===`typography`?{...e,version:14}:{...e,version:14,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?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({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(),order:T.int().optional(),margin:gs.partial().optional(),clipContent:p.boolean().optional(),baselineSource:bs.optional(),container:ys.partial().extend({padding:ms.partial().optional()}).optional()}).strict(),Ss=T,k=E,Cs=p.number().min(0).max(1),ws=p.string().min(1),Ts=p.object({topLeft:k,topRight:k,bottomRight:k,bottomLeft:k,smoothing:Cs.optional()}),Es=p.array(k).min(1),Ds=p.enum([`none`,`round`,`square`]),Os=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:Es.optional(),dashCap:Ds.optional(),dashOrigin:p.literal(`css`).optional(),alignment:p.enum([`inside`,`center`,`outside`]).optional()}),ks=Os.pick({width:!0,style:!0,layoutInclusion:!0}),As=p.object({visible:p.boolean(),width:k,offset:Ss,style:p.enum([`solid`,`dashed`,`dotted`]),paints:p.array(cs),dashPattern:Es.optional(),dashCap:Ds.optional()}),js=p.object({id:ws,visible:p.boolean(),kind:p.enum([`outer`,`inner`]),color:Xo,offsetX:Ss,offsetY:Ss,blur:k,spread:Ss,blendMode:is.optional(),blendSource:as.optional(),isShownBehindNode:p.boolean().optional()}),Ms=p.object({opacity:Cs,blendMode:is,fills:p.array(cs),border:Os,retainedBorder:ks.optional(),outline:As,radius:Ts,shadows:p.array(js),filters:p.array(ts),backdropFilters:p.array(ns)}),Ns=Ms.partial().refine(e=>Object.keys(e).length>0,`appearance values cannot be empty`),Ps=[`opacity`,`blendMode`,`fills`,`border`,`retainedBorder`,`outline`,`radius`,`shadows`,`filters`,`backdropFilters`],Fs=p.enum(Ps),Is=Ms.partial().extend({clear:p.array(Fs).min(1).max(Ps.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(),Ls=p.string().regex(/^[\u{20}-\u{7E}]{4}$/u),Rs=Ls.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(Rs,A).optional(),features:p.record(Ls,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()}),zs=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(),Bs=M.partial().strict(),Vs=M.keyof().options,Hs=Bs.extend({featureChanges:p.object({set:M.shape.features,clear:p.array(Ls).optional(),removeIfEmpty:p.boolean().optional()}).strict().optional(),variationChanges:p.object({set:M.shape.variations,clear:p.array(Rs).optional(),removeIfEmpty:p.boolean().optional()}).strict().optional(),clear:p.array(M.keyof()).max(Vs.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`),Us={"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`]},Ws=/^(?:behavior|-moz-binding)$/iu,Gs=p.string().min(1).regex(/^(?:--[\w-]+|-(?:webkit|moz|ms|o)-[a-z][a-z\d-]*|[a-z][a-z\d-]*)$/iu).refine(e=>!Ws.test(e),`unsafe CSS property`),N=p.object({id:p.string().min(1),property:Gs,value:qo,enabled:p.boolean()}),Ks=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`),qs=p.array(N.shape.id).refine(e=>new Set(e).size===e.length,`declaration ids must be unique`),Js=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:qs.optional(),order:qs.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`),Ys=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(),Xs=Ys.keyof().options,Zs=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:Ys.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:Zs.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 Qs=cs.array().optional();p.object({fills:Qs}),zs.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())}),$s=p.object({url:p.url(),expiresAt:p.iso.datetime(),bytes:p.number().int().min(0)}),ec=`/v1/canvas-assets/`,tc=[`image/avif`,`image/gif`,`image/jpeg`,`image/png`,`image/webp`],nc=p.string().regex(/^image\/[a-z0-9.+-]+$/u);p.object({canvasId:p.uuid(),contentType:p.enum(tc),bytes:p.number().int().positive()}),p.object({assetId:p.uuid(),path:p.string().startsWith(`/v1/canvas-assets/`),upload:P});const rc=(e,t)=>`${ec}${encodeURIComponent(e)}/${encodeURIComponent(t)}`,ic=p.tuple([p.uuid(),p.uuid()]),ac=e=>{if(!e.startsWith(`/v1/canvas-assets/`))return null;let t=ic.safeParse(e.slice(18).split(`/`)).data;return t===void 0?null:{canvasId:t[0],assetId:t[1]}},oc=[`font/ttf`,`font/otf`,`font/woff`,`font/woff2`,`font/collection`],sc=p.object({canvasId:p.uuid(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)});sc.extend({bytes:p.number().int().positive()}).extend({contentType:p.enum(oc)}),p.object({path:p.string().startsWith(`/v1/canvas-assets/`)}).extend({upload:P});const cc=(e,t)=>`${ec}${encodeURIComponent(e)}/fonts/${encodeURIComponent(t)}`;p.object({canvasId:p.uuid(),sources:p.array(sc).min(1)}),p.object({resources:p.array(p.object({source:sc,path:p.string()}))});const lc=1e3,uc=new Set(oc),dc=(e,t)=>e===`image`?nc.safeParse(t).success:uc.has(t),fc=p.strictObject({canvasId:p.uuid(),clientToken:p.uuid()});p.discriminatedUnion(`kind`,[fc.extend({kind:p.literal(`image`),contentType:p.enum(tc),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)}),fc.extend({kind:p.literal(`font`),contentType:p.enum(oc),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)})]);const pc=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(lc),maximumWeight:p.number().min(1).max(lc)}).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:pc.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=>dc(e.kind,e.contentType),`Content type must match the asset kind.`).refine(e=>e.path===(e.kind===`image`?rc(e.canvasId,e.assetId):cc(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 mc=[`top`,`right`,`bottom`,`left`];mc.map(e=>`padding-${e}`),mc.map(e=>`margin-${e}`);const hc=p.enum([`png`,`jpeg`]),gc=p.number().positive(),_c=p.strictObject({format:hc.optional(),scale:gc.optional()}),vc=p.strictObject({format:hc.nullable().optional(),scale:gc.nullable().optional()}).refine(e=>e.format!==void 0||e.scale!==void 0),yc=p.number(),bc=yc.nonnegative(),xc=p.string().min(1).max(200),Sc=p.string().regex(/^[MmLlHhVvCcSsQqTtAaZzEe\d\s.,+-]*$/u),Cc=p.strictObject({x:yc,y:yc,width:bc,height:bc}),wc=p.strictObject({kind:p.literal(`path`),path:Sc.min(1),fillRule:p.enum([`nonzero`,`evenodd`]),viewBox:Cc.extend({width:bc.positive(),height:bc.positive()})}),Tc=p.strictObject({kind:p.literal(`polygon`),count:p.number().int().min(3),innerRatio:p.number().min(0).max(1).optional(),cornerRadius:bc,cornerSmoothing:p.number().min(0).max(1)}),Ec=p.enum([`union`,`subtract`,`intersect`,`exclude`]),Dc=p.strictObject({kind:p.literal(`boolean`),operation:Ec,operandIds:p.array(xc).min(1).refine(e=>new Set(e).size===e.length),result:p.strictObject({path:Sc,fillRule:p.literal(`nonzero`),isEmpty:p.boolean(),bounds:Cc,inputKey:p.string().regex(/^[a-f0-9]{16}$/u)}).refine(e=>e.isEmpty===(e.path===``))}),Oc=p.discriminatedUnion(`kind`,[wc,Tc,p.strictObject({kind:p.literal(`mask`),maskId:xc,mode:p.enum([`alpha`,`luminance`,`outline`]).optional()}),Dc]),kc=`Update Enhance: compositing is no longer supported. Use the isolation style or a mask group.`,Ac=p.literal(14,{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,`)||ac(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()}),jc=p.enum([`start`,`center`,`end`,`stretch`,`scale`]),Mc=p.object({x:jc,y:jc}),Nc=p.enum([`source`,`generated`,`content`,`user`]),I=p.looseObject({id:p.string().min(1),label:p.string(),component:p.string().min(1),labelOrigin:Nc.optional(),visible:p.boolean().optional(),locked:p.boolean().optional(),constraints:Mc.optional(),styles:p.record(p.string(),p.union([p.string(),p.number()])),layout:xs.optional(),responsive:p.never().optional(),appearance:Ns.optional(),exportSettings:_c.optional(),typography:Bs.optional(),additionalStyles:Ks.optional(),geometry:Oc.optional(),compositing:p.never({error:kc}).optional(),props:p.record(p.string(),p.unknown()).optional(),box:F.optional()}),Pc=p.object({version:p.literal(14),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({})}),Fc=p.record(p.string(),p.unknown());p.preprocess(e=>{let t=Fc.safeParse(e).data;return t===void 0?e:Object.keys(t).length===0?Ic():Po(t)},Pc);const Ic=()=>({version:14,nodes:{root:{id:`root`,label:`Canvas`,component:`root`,labelOrigin:`generated`,visible:!0,locked:!1,styles:{}}},relationships:{},tombstones:{}}),Lc=p.string().min(1),Rc=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:Lc.optional()}),zc=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`]),Bc=p.object({nodeCount:p.number().int().positive(),unsupportedFeatures:p.array(p.object({feature:zc,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(Rc)}),Vc=I.omit({id:!0}).extend({temporaryId:Lc}),Hc=p.object({temporaryId:Lc,parentTemporaryId:Lc,sortKey:p.string().min(1)}),Uc=p.object({version:p.literal(1),rootTemporaryId:Lc,nodes:p.array(Vc).min(1),relationships:p.array(Hc),report:Bc.catch({nodeCount:0,issues:[]})}).transform(e=>({...e,report:{...e.report,nodeCount:e.nodes.length}}));p.object({canvasId:p.uuid(),documentFormatVersion:Ac,mutationId:p.uuid(),baseVersion:p.number().int().positive(),screenNodeId:p.string().min(1),draft:Uc});const Wc=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(Lc,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}),Gc=[`queued`,`claimed`,`grant`,`navigate`,`document`,`sources`,`fonts`,`layout`,`target`,`capture`,`serialize`,`compile`,`commit`,`upload`,`complete`],Kc=[`queued`,`running`,`succeeded`,`failed`,`cancelled`,`expired`],qc=[`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`],Jc=[`ASSET_UNAVAILABLE`,`FONT_FALLBACK`,`LOCAL_FONT_FALLBACK`,`SOURCE_FALLBACK`,`SCALE_REDUCED`,`LAYOUT_FALLBACK`],Yc=p.number().int().positive(),L=p.object({x:p.number(),y:p.number(),width:p.number().positive(),height:p.number().positive()}),Xc=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})]),Zc=p.object({kind:p.literal(`recording`),recordingId:p.uuid(),atMs:p.number().int().nonnegative()}),Qc=p.object({kind:p.literal(`recording`),recordingId:p.uuid(),requestedAtMs:p.number().int().nonnegative(),settledAtMs:p.number().int().nonnegative()}),$c=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()}),el=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:Xc.default({kind:`content`}),sourceState:Zc.optional(),scale:p.number().positive().default(1),maxOutputPixels:Yc.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`]}),tl=p.enum(Gc);p.enum(Kc);const nl=p.enum(qc),rl=p.enum(Jc),il=p.object({code:rl,message:p.string().min(1).max(500),sourceId:p.string().min(1).nullable()}),R=p.object({reason:nl,phase:tl,message:p.string().min(1).max(500),retryable:p.boolean(),sourceId:p.string().min(1).nullable()}),al=p.object({phase:tl,durationMs:p.number().int().min(0)}),ol=p.object({canvasId:p.uuid(),requestedVersion:p.number().int().positive(),loadedVersion:p.number().int().positive(),target:Xc,sourceState:Qc.optional(),snapshot:$c.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(il),timings:p.array(al),expiresAt:p.iso.datetime()}),sl=p.object({id:p.uuid(),canvasId:p.uuid(),purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),phase:tl,requestedVersion:p.number().int().positive(),target:Xc,sourceState:Zc.optional(),scale:p.number().positive(),maxOutputPixels:Yc.optional(),format:p.literal(`png`),attempt:p.number().int().min(0),lastFailure:R.optional(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),cl=p.discriminatedUnion(`state`,[sl.extend({state:p.literal(`queued`),result:p.null(),failure:p.null()}),sl.extend({state:p.literal(`running`),result:p.null(),failure:p.null()}),sl.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:ol,failure:p.null()}),sl.extend({state:p.literal(`failed`),result:p.null(),failure:R}),sl.extend({state:p.literal(`cancelled`),result:p.null(),failure:R.extend({reason:p.literal(`CANCELLED`)})}),sl.extend({state:p.literal(`expired`),result:p.null(),failure:R.extend({reason:p.literal(`EXPIRED`)})})]);p.object({job:cl,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}).extend({waitMs:p.number().int().min(0).max(1e4).optional()}),p.object({job:cl}),p.object({jobId:p.uuid()}),p.object({job:cl});const ll=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:$s,source:ll.optional()});const ul=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:ul}).optional()}),p.object({job:cl,alreadyExists:p.boolean()});const dl=p.object({rootIds:p.array(p.string().min(1))}),fl=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)})]),pl=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()})]),ml=p.object({source:pl,destination:fl,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`]})}),hl=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)})]),gl=p.object({id:p.uuid(),canvasId:p.uuid(),source:hl,destination:fl,phase:tl,requestedVersion:p.number().int().positive(),attempt:p.number().int().nonnegative(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),_l=p.discriminatedUnion(`state`,[gl.extend({state:p.literal(`queued`),result:p.null(),failure:p.null()}),gl.extend({state:p.literal(`running`),result:p.null(),failure:p.null()}),gl.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:Wc.extend({report:Bc}),failure:p.null()}),gl.extend({state:p.literal(`failed`),result:p.null(),failure:R}),gl.extend({state:p.literal(`cancelled`),result:p.null(),failure:R.extend({reason:p.literal(`CANCELLED`)})}),gl.extend({state:p.literal(`expired`),result:p.null(),failure:R.extend({reason:p.literal(`EXPIRED`)})})]);ml.and(p.object({canvasId:p.uuid(),expectedVersion:p.number().int().positive().optional(),mutationId:p.uuid().optional(),writeScope:dl.optional(),scope:el.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:_l,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}),p.object({job:_l}),p.object({jobId:p.uuid()}),p.object({job:_l}),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:Uc}),p.object({state:p.literal(`failed`),jobId:p.uuid(),message:p.string().min(1)})]);const vl=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(),yl=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()}),bl=p.string().regex(/^(?:\d+(?:\.\d+)?|\.\d+)px$/u),xl=p.string().regex(/^-?(?:\d+(?:\.\d+)?|\.\d+)px$/u),Sl=N.shape.value.refine(e=>!/\burl\s*\(/iu.test(e),`invalid text colour`),Cl=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:Sl,"font-family":N.shape.value,"font-size":p.union([E,bl]),"font-weight":Cl,"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`])},wl=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()}),Tl=p.union([N.shape.value,T]).nullable().optional(),El=p.strictObject({"text-decoration":Tl,"text-decoration-line":Tl,"text-decoration-style":Tl,"text-decoration-color":Tl,"text-decoration-thickness":Tl,"text-underline-offset":Tl,"text-decoration-skip-ink":Tl,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,xl,p.literal(`normal`)]).nullable().optional(),"line-height":V[`line-height`].nullable().optional(),"text-align":V[`text-align`].nullable().optional(),"text-indent":p.union([T,xl]).nullable().optional(),"white-space":V[`white-space`].nullable().optional(),"word-spacing":p.union([T,xl,p.literal(`normal`)]).nullable().optional()}),Dl=N.shape.value,H=p.union([p.string(),T]),U=p.union([N.shape.value,T]).nullable().optional(),Ol=El.extend(yl.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:Dl.nullable().optional(),"overflow-x":Dl.nullable().optional(),"overflow-y":Dl.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()}),kl=p.union([Ol.keyof(),N.shape.property.refine(e=>e.startsWith(`--`))]),Al=Ol.catchall(U).refine(e=>Object.keys(e).every(e=>kl.safeParse(e).success)),jl=p.record(p.string(),p.unknown()),Ml=p.number().int().positive(),Nl=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`retain`),count:Ml,attributes:jl.optional(),shouldPreserveParagraph:p.boolean().optional()}),p.object({kind:p.literal(`delete`),count:Ml}),p.object({kind:p.literal(`insert`),text:p.string().min(1).refine(e=>e.isWellFormed()),attributes:jl.optional(),shouldPreserveParagraph:p.boolean().optional()})]),Pl=p.object({baseLength:p.number().int().nonnegative(),representation:p.enum([`plain`,`rich`,`links`]).optional(),steps:p.array(Nl),endAttributes:jl.optional(),properties:jl.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`})}),Fl=p.object({actionId:p.string().min(1),baseVersion:p.number().int().nonnegative(),isActive:p.boolean()}),Il=p.object({baseVersion:p.number().int().nonnegative(),after:p.array(p.string().min(1)),change:Pl}),Ll=p.object({actionId:p.string().min(1),baseVersion:p.number().int().nonnegative(),originalChange:Pl,inverse:Pl,history:Fl.optional(),source:Il.optional()}),Rl=p.object({op:p.literal(`editText`),nodeId:p.string().min(1),change:Pl,actionId:p.string().min(1).optional(),revision:Ll.optional(),history:Fl.optional(),source:Il.optional()}),zl=2e3,Bl=p.object({title:p.string().trim().min(1).max(200)}).strict(),Vl=p.array(Zs.shape.id),Hl=p.object({canvasId:p.uuid()}),Ul=p.object({definition:Zs.refine(e=>e.sourceStyleId===void 0),revision:p.number().int().positive(),fontFaces:p.array(p.record(p.string(),p.unknown()))}),Wl=p.object({styles:p.array(Ul).refine(e=>new Set(e.map(e=>e.definition.id)).size===e.length)});Hl.extend({revision:p.number().int().positive(),documentVersion:p.number().int().positive(),description:p.string().max(zl),publishedAt:p.iso.datetime(),...Wl.shape}),Hl.extend({mutationId:p.uuid(),expectedRevision:p.number().int().nonnegative(),documentVersion:p.number().int().positive(),publish:Vl,remove:Vl,description:p.string().trim().max(zl)}).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 Gl=p.object({canvasId:p.uuid(),title:p.string().max(200)});p.object({search:p.string().trim().max(200).default(``),cursor:Gl.nullable().default(null),limit:p.number().int().min(1).max(50).default(20)});const Kl=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(Kl).max(50),nextCursor:Gl.nullable()});const ql=p.object({parentId:p.string().min(1),sortKey:p.string().min(1)}),Jl=p.object({op:p.literal(`insertConvertedSubtree`),destination:fl,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),ql)}),W=p.string().min(1),Yl=F.extend({width:p.number().positive(),height:p.number().positive()}),Xl=p.object({parentId:W,afterId:W.optional()}),Zl=ql,Ql=p.object({op:p.literal(`setStyles`),nodeId:W,styles:Al,clear:p.array(kl).min(1).refine(e=>new Set(e).size===e.length).optional()}).refine(e=>(e.clear??[]).every(t=>!Object.hasOwn(e.styles,t))),$l=p.discriminatedUnion(`op`,[Jl,p.object({op:p.literal(`insertNode`),node:I,parentage:Zl,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()}),Xl.extend({op:p.literal(`insertText`),nodeId:W,label:p.string().default(`Text`),text:p.string(),box:Yl,styles:wl.default({})}),Xl.extend({op:p.literal(`insertPrototype`),nodeId:W,label:p.string().default(`Prototype`),prototypeId:p.uuid(),deploymentId:p.uuid(),box:Yl,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()}),Rl,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:Nc.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:Mc.nullable()}),Ql,p.object({op:p.literal(`patchExportSettings`),nodeId:W,exportSettings:vc}),p.object({op:p.literal(`setAppearance`),nodeId:W,appearance:Is}),p.object({op:p.literal(`setLayout`),nodeId:W,layout:p.union([xs,p.literal(`default`)]),fields:p.array(xs.keyof()).optional()}),p.object({op:p.literal(`patchTypography`),nodeId:W,typography:Hs}),p.object({op:p.literal(`setTypography`),nodeId:W,typography:p.union([Bs,p.literal(`default`)])}),p.object({op:p.literal(`patchAdditionalStyles`),nodeId:W,additionalStyles:Js}),p.object({op:p.literal(`setAdditionalStyles`),nodeId:W,additionalStyles:p.union([Ks,p.literal(`default`)])}),us,p.object({op:p.literal(`setTextStyleLibrary`),nodeId:p.literal(`root`),sourceCanvasId:p.uuid(),library:Bl.nullable()}),p.object({op:p.literal(`patchFontLibrary`),nodeId:p.literal(`root`),fonts:vl}),p.object({op:p.literal(`setTextStyle`),nodeId:p.literal(`root`),styleId:Zs.shape.id,textStyle:Zs.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([Oc,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:Zl}),Xl.extend({op:p.literal(`move`),nodeId:W}),p.object({op:p.literal(`remove`),nodeId:W,removedText:p.record(W,I.pick({props:!0})).optional()})]),eu=$l.options.map(e=>e.shape.op.value),tu=p.preprocess((e,t)=>typeof e!=`object`||!e||Reflect.get(e,`op`)!==`setCompositing`?e:(t.issues.push({code:`custom`,message:kc,input:e}),p.NEVER),$l);Wc.extend({operation:Jl,next:p.array(p.string().min(1))});const nu=p.record(p.string(),p.unknown());p.object({canvasId:p.uuid(),afterVersion:p.number().int().positive().optional()});const ru=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:$s.nullable()}),iu=p.object({mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(tu)});p.object({mutations:p.array(iu).optional(),version:p.number().int().min(1),restoreFenceVersion:p.number().int().positive().optional(),document:nu.optional(),screens:p.array(ru)}).extend({document:nu}),p.object({canvasId:p.uuid(),baseVersion:p.number().int().min(1),document:nu.refine(e=>Pc.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:nu})]);const au=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(au).optional()});const ou=p.enum([`position`,`layout`,`clip`,`cornerRadius`,`blending`,`typography`,`nativeControl`,`textDecoration`,`fill`,`outline`,`textStroke`,`border`,`outerShadow`,`innerShadow`,`filters`,`additionalStyles`,`vector`,`export`,`source`]),su=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(ou)});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(su)}),p.object({canvasId:p.uuid(),nodeId:p.string().min(1)}),p.object({canvasId:p.uuid(),version:p.number().int().positive(),node:su.extend({styles:p.record(p.string(),p.union([p.string(),p.number()])),layout:xs.optional(),appearance:Ns.optional(),geometry:Oc.optional(),typography:Bs.optional(),additionalStyles:Ks.optional(),props:p.record(p.string(),p.unknown()),children:p.array(p.string().min(1))}),next:p.array(p.string().min(1))});const cu=I.shape.id,lu=F.extend({width:p.number().positive(),height:p.number().positive()}),uu=p.record(cu,cu),du=p.strictObject({fingerprint:p.string().regex(/^[a-f0-9]{64}$/u),revisionPolicy:p.enum([`strict`,`rebase`]),copiedNodeIds:uu.optional()});p.object({canvasId:p.uuid(),mutationId:p.uuid(),documentFormatVersion:Ac,baseVersion:p.number().int().positive(),operations:p.array(tu).min(1),requestContext:du.optional(),writeScope:dl.optional()});const fu=p.object({canvasId:p.uuid(),mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(tu),insertedNodeIds:p.array(cu),changedNodeIds:p.array(cu),removedNodeIds:p.array(cu),boxes:p.record(cu,F),affectedBounds:lu.nullable(),copiedNodeIds:uu.optional(),next:p.array(p.string().min(1))});p.strictObject({canvasId:p.uuid(),mutationId:p.uuid(),fingerprint:du.shape.fingerprint}),p.discriminatedUnion(`state`,[p.strictObject({state:p.literal(`not-found`)}),p.strictObject({state:p.literal(`committed`),result:fu})]);const pu={nodes:1e3,fields:20,id:200,label:500,value:1e3},mu=p.object({available:p.boolean(),omittedNodes:p.number().int().nonnegative(),nodes:p.array(p.object({nodeId:p.string().min(1),label:p.string().max(pu.label),kind:p.enum([`inserted`,`removed`,`changed`,`unchanged`,`unavailable`]),omittedFields:p.number().int().nonnegative(),fields:p.array(p.object({label:p.string().max(pu.id),before:p.string().max(pu.value).nullable(),after:p.string().max(pu.value).nullable(),truncated:p.boolean()})).max(pu.fields)})).max(pu.nodes)}),hu=[`position`,`layout`,`cornerRadius`,`blending`,`fill`,`outline`,`border`,`outerShadow`,`innerShadow`,`filters`,`additionalStyles`,`export`],gu=[`position`,`layout`,`clip`,...hu.filter(e=>e!==`position`&&e!==`layout`)],_u=[...hu,`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:gu},{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:hu},{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:hu},{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:_u},{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:_u},{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,vu=p.array(G).min(1),yu=p.strictObject({x:p.number(),y:p.number()}),bu=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.`}),xu=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`position`),nodeId:G,parentPosition:yu}),p.strictObject({kind:p.literal(`resize`),nodeId:G,size:bu}),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:vu,targetNodeId:G,position:p.enum([`before`,`inside`,`after`])}),p.strictObject({kind:p.literal(`group`),nodeIds:vu,label:p.string().min(1).optional()}),p.strictObject({kind:p.literal(`ungroup`),nodeIds:vu}),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()})]),Su=p.strictObject({kind:p.literal(`arrange`),changes:p.array(xu).min(1)}),Cu=p.strictObject({kind:p.literal(`duplicate`),nodeIds:vu,destination:p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`native`)}),p.strictObject({kind:p.literal(`inside`),parentId:G})])}),wu=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)}),Su,Cu,p.strictObject({kind:p.literal(`compile-html`),contextOperations:p.array(tu).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.`)})]),Tu=p.strictObject({pageId:G.optional(),nodeIds:p.array(G)}),Eu=p.strictObject({request:wu,scope:Tu}),Du=p.strictObject({operations:p.array(tu),idMap:p.record(G,G),rootNodeIds:p.array(G)}),Ou=Du.extend({compilations:p.array(p.strictObject({id:G,draft:Uc,warnings:p.array(il).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:Ou}),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 ku=p.object({id:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),request:wu,scope:Tu,phase:tl,attempt:p.number().int().nonnegative(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),Au=p.discriminatedUnion(`state`,[ku.extend({state:p.enum([`queued`,`running`]),result:p.null(),failure:p.null()}),ku.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:Du.extend({loadedVersion:p.number().int().positive()}),failure:p.null()}),ku.extend({state:p.enum([`failed`,`cancelled`,`expired`]),result:p.null(),failure:R})]);p.strictObject({canvasId:p.uuid(),expectedVersion:p.number().int().positive(),request:wu,scope:Tu}),p.object({job:Au,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}),p.object({job:Au});const ju=p.string().trim().min(1).max(80).regex(/^[\w .+/-]+$/u),Mu=p.strictObject({path:p.enum([`local_mcp`,`hosted_mcp`,`direct_cli`]),name:ju.optional(),version:ju.optional()});Mu.pick({path:!0}).strip();const Nu=p.strictObject({agent_client:p.enum([`claude_code`,`codex`,`cursor`,`unknown`]),connection_path:Mu.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:ju.optional()}),Pu=p.enum([`green`,`blue`,`indigo`,`amber`,`lime`,`teal`,`cyan`,`sky`,`violet`,`purple`,`fuchsia`,`pink`]),Fu=p.string().regex(/^[0-9a-f]{32}$/),Iu=p.object({viewKey:Fu.optional(),admissionOrder:p.number().int().nonnegative().optional(),followColour:Pu.optional()}),Lu=p.object({pageId:p.string().min(1).nullable().optional(),followingViewKey:Fu.nullable().optional()}),Ru=`enhance3.canvas.v1`,zu=16384,Bu=p.enum([`blue`,`violet`,`green`,`amber`,`magenta`,`teal`,`red`,`orange`]),Vu=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:Bu}),Hu=Vu.extend(Iu.shape),Uu=p.object({kind:p.literal(`guest`),connectionId:p.uuid(),displayName:p.string().min(1).max(100),initials:p.string().min(1).max(8),colour:Bu,...Iu.shape}),Wu=p.discriminatedUnion(`kind`,[Hu,Uu]),Gu=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:Nu.optional(),colour:Bu}),Ku=p.discriminatedUnion(`kind`,[Vu.omit({connectionId:!0,avatarUrl:!0}),Gu]),qu=p.object({x:p.number(),y:p.number()}),Ju=F.extend({width:p.number().positive(),height:p.number().positive()}),Yu=p.object({count:p.number().int().positive(),bounds:Ju.nullable()}),Xu=p.object({kind:p.enum([`drag`,`resize`]),baseVersion:p.number().int().positive(),boxes:p.record(p.string().min(1),Ju).refine(e=>Object.keys(e).length<=100&&new TextEncoder().encode(JSON.stringify(e)).byteLength<=16384),summary:Yu.optional()}),Zu=p.object({cursor:qu.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<=zu).optional(),selectionSummary:Yu.nullable().optional(),visibleWorldBox:Ju.optional(),gesture:Xu.nullable().optional(),cursorChat:p.string().max(140).nullable().optional(),...Lu.shape}).refine(e=>Object.keys(e).length>0,`presence patch cannot be empty`),Qu=p.object({actor:Wu,seq:p.number().int().nonnegative(),cursor:qu.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<=zu),selectionSummary:Yu.nullable().optional(),visibleWorldBox:Ju.nullable(),gesture:Xu.nullable(),cursorChat:p.string().max(140).nullable().default(null),...Lu.shape,followOrder:p.number().int().nonnegative().optional(),expiresAt:p.iso.datetime()}),$u=p.enum([`reading`,`writing`,`creating`,`deleting`,`rendering`]),ed=p.object({activityId:p.uuid(),canvasId:p.uuid(),actor:Gu,phase:$u,nodeIds:p.array(p.string().min(1)).max(100),bounds:Ju.nullable(),expiresAt:p.iso.datetime()}),td=p.object({canvasId:p.uuid(),phase:$u,nodeIds:p.array(p.string().min(1)).max(100).default([]),bounds:Ju.nullable().default(null)});p.object({activityId:p.uuid(),expiresAt:p.iso.datetime(),renewAfterMs:p.number().int().positive()}),td.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:Iu.shape.viewKey,peers:p.array(Qu),activities:p.array(ed),documentVersion:p.number().int().positive()})}),p.object({...K,type:p.literal(`presence.patch`),payload:Qu}),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:ed.nullable()})}),p.object({...K,type:p.literal(`document.committed`),payload:p.object({mutationId:p.uuid(),actor:Ku,previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(tu).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:Zu}),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(Ru)).min(1).max(1),viewId:p.uuid().optional()}),p.object({endpoint:p.url(),ticket:p.string().min(1).max(4096),protocol:p.literal(Ru),expiresAt:p.iso.datetime()}),p.uuid();const nd=I.shape.id;p.array(nd),p.object({jobId:p.uuid()});const rd=p.object({jobId:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),target:Xc,sourceState:Zc.optional()});p.discriminatedUnion(`purpose`,[rd.extend({purpose:p.literal(`preparation`),preparation:Eu,screens:p.array(ru).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`)}),rd.extend({purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),scale:p.number().positive(),maxOutputPixels:Yc.optional(),format:p.literal(`png`)}),rd.extend({purpose:p.literal(`conversion`),target:p.object({kind:p.literal(`node`),nodeId:p.string().min(1)}),sourceState:p.undefined().optional(),conversion:ml,scale:p.literal(1),format:p.literal(`json`)})]),p.object({jobId:p.uuid()}),p.object({jobId:p.uuid()});const id=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`,[id.extend({purpose:p.literal(`preparation`),target:Xc,preparation:Eu,sourceState:p.undefined().optional(),scale:p.literal(1)}),id.extend({purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),target:Xc,sourceState:Zc.optional(),scale:p.number().positive(),maxOutputPixels:Yc.optional(),outputKey:p.string().min(1).max(500)}),id.extend({purpose:p.literal(`conversion`),target:p.object({kind:p.literal(`node`),nodeId:p.string().min(1).max(200)}),sourceState:p.undefined().optional(),conversion:ml,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(il),timings:p.array(al),sourceState:Qc.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:Uc}),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 ad=p.object({total:p.number().int().nonnegative(),loading:p.number().int().nonnegative(),unavailable:p.number().int().nonnegative()}),od=p.object({jobId:p.uuid(),canvasId:p.uuid().nullable(),requestedVersion:p.number().int().positive().nullable(),loadedVersion:p.number().int().positive().nullable(),phase:tl.exclude([`queued`,`claimed`,`capture`,`upload`,`complete`]),sources:ad,warnings:p.array(il),timings:p.array(al),sourceState:Qc.optional()}),sd=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`,[od.extend({state:p.literal(`loading`),capture:p.null(),failure:p.null()}),od.extend({state:p.literal(`ready`),phase:p.literal(`target`),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),loadedVersion:p.number().int().positive(),capture:sd,failure:p.null()}),od.extend({state:p.literal(`failed`),failure:p.object({reason:nl,message:p.string().min(1).max(500),sourceId:p.string().min(1).max(200).nullable()}),capture:p.null()})]),p.object({jobId:p.uuid(),loadedVersion:p.number().int().positive(),plan:Ou});const cd=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(cd),missingNodeIds:p.array(cd),nodes:p.array(su),contextRootId:cd.nullable(),visibleWorldBox:L.nullable(),next:p.array(p.string().min(1)).max(12)});const ld=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:ld.optional()}),p.object({provenance:ld.optional(),report:Bc.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 ud=new Set(Xs);new Set(Object.entries(Us).flatMap(([e,t])=>t.some(e=>ud.has(e))?[e.replaceAll(/-([a-z])/gu,(e,t)=>t.toUpperCase())]:[]));const dd=new Set(Xs);new Set(Object.entries(Us).flatMap(([e,t])=>t.some(e=>dd.has(e))?[e]:[]));const fd=1e3,pd=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)})]),md=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(fd).nullable(),actor:pd,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(md),nextCursor:p.string().min(1).nullable(),hasExpiredHistory:p.boolean()}),p.object({canvasId:p.uuid(),versionId:p.uuid()});const hd=p.object({outcome:p.literal(`ready`),entry:md,document:nu,screens:p.array(ru)}),gd=p.object({outcome:p.literal(`missing-resources`),entry:md,document:nu,screens:p.array(ru),missingScreenIds:p.array(p.uuid()).min(1)});p.discriminatedUnion(`outcome`,[hd,gd,p.object({outcome:p.literal(`corrupt`),entry:md})]);const _d=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:_d,title:p.string().trim().min(1),description:p.string().trim().max(fd).nullable().default(null)}),p.object({canvasId:p.uuid(),versionId:p.uuid(),title:p.string().trim().min(1),description:p.string().trim().max(fd).nullable().default(null)}),p.object({canvasId:p.uuid(),versionId:p.uuid()}),p.object({entry:md}),p.object({canvasId:p.uuid(),documentFormatVersion:Ac,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:Ac,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 vd=(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))},yd=p.string().regex(/^[a-f0-9]{64}$/u),bd=p.string().trim().min(1),xd=p.object({organisationId:p.uuid().nullable()}),Sd=p.object({family:p.string().regex(/^uploaded-font-[a-f0-9]{64}(?:-[a-f0-9]{12})?$/u),familyName:bd,subfamilyName:bd,version:bd,weight:p.string().regex(/^\d+(?:\.\d+)?(?: \d+(?:\.\d+)?)?$/u).refine(e=>vd(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=>vd(e,0))]),format:p.enum([`truetype`,`opentype`,`woff`,`woff2`])}),Cd=p.object({kind:p.enum([`personal`,`team`]),ownerId:p.uuid(),sha256:yd}),wd=xd.extend({sha256:yd,bytes:p.number().int().positive(),contentType:p.enum(oc)});p.object({upload:P}),wd.extend({metadata:Sd,hasSharingRights:p.literal(!0)});const Td=Cd.extend({bytes:p.number().int().positive(),metadata:Sd,createdAt:p.iso.datetime(),path:p.string().startsWith(`/v1/font-catalog/`)});p.object({entries:p.array(Td),canManage:p.boolean()}),xd.extend({sha256:yd}),xd.extend({canvasId:p.uuid(),sha256:p.array(yd).min(1)}),p.object({resources:p.array(p.object({entry:Td,path:p.string().startsWith(`/v1/canvas-assets/`)}))});const Ed=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:Ed,acceptToken:p.string().max(512).optional()}),p.object({canvasId:p.uuid()}),w(Ed),p.object({canvasId:p.uuid(),inviteId:p.uuid()}),p.object({canvasId:p.uuid(),inviteId:p.uuid()});const Dd=p.string().min(1).max(512);p.object({token:Dd}),p.object({token:Dd}),p.object({canvasId:p.uuid(),accessLevel:Bo});const Od=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(Od),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 kd=p.object({canvasId:p.uuid(),reviewState:p.enum([`not-started`,`in-progress`,`done`])});p.object({reviewState:kd.shape.reviewState.nullable()});const Ad=Fo.extend({cursor:p.string().max(2048).nullable().default(null)}),jd=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()}),Md=p.object({x:p.number(),y:p.number()}),Nd=p.object({x:p.number().min(0).max(1),y:p.number().min(0).max(1)}),Pd=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)}),Fd=jd.extend({role:p.string().min(1).optional()}),Id=p.object({path:p.array(p.number().int().min(0)),offset:p.number().int().min(0)}),Ld=p.object({version:p.literal(1),kind:p.literal(`element`),locator:Fd,attachment:Nd,fallbackBounds:Pd}),Rd=p.object({version:p.literal(1),kind:p.literal(`text`),root:Fd,quote:p.object({exact:p.string().min(1),prefix:p.string(),suffix:p.string()}),range:p.object({start:Id,end:Id}),attachment:Nd,fallbackBounds:Pd}),zd=p.object({version:p.literal(1),kind:p.literal(`elements`),members:p.array(Fd).min(2),truncated:p.boolean(),attachment:Nd,fallbackBounds:Pd}),Bd=p.object({version:p.literal(1),kind:p.literal(`area`),bounds:Pd,attachment:Nd}),Vd=p.discriminatedUnion(`kind`,[Ld,Rd,zd,Bd]),Hd=p.discriminatedUnion(`on`,[p.object({on:p.literal(`canvas`),point:Md,pageId:p.string().min(1).max(256).optional()}),p.object({on:p.literal(`node`),nodeId:p.string().min(1),point:Md,element:p.null()}),p.object({on:p.literal(`screen`),nodeId:p.string().min(1),screenId:p.uuid(),point:Md,element:jd.nullable(),target:Vd.optional()})]),Ud=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()}),Wd=p.object({personId:p.uuid(),name:p.string().min(1).max(120)}),Gd=p.object({emoji:p.string().min(1).max(16),people:p.array(Wd).min(1)}),Kd=p.object({messageId:p.uuid(),seq:p.number().int().min(1),body:p.string().min(1),isDeleted:p.boolean(),author:Ud,createdAt:p.iso.datetime(),editedAt:p.iso.datetime().nullable(),mentions:p.array(Wd),reactions:p.array(Gd)}),qd=p.object({kind:p.enum([`person`,`agent`]),personId:p.uuid(),name:p.string().min(1).max(120),tokenLabel:p.string().max(120).nullable()}),Jd=p.object({revision:p.number().int().positive(),threadId:p.uuid(),canvasId:p.uuid(),anchor:Hd,author:Ud,messages:p.array(Kd).min(1).max(50),messageCount:p.number().int().min(1),hasMoreMessages:p.boolean(),isResolved:p.boolean(),resolvedAt:p.iso.datetime().nullable(),resolvedBy:qd.nullable(),createdAt:p.iso.datetime(),lastMessageAt:p.iso.datetime()}),Yd=p.strictObject({canvasRef:p.string().min(1),expectedVersion:p.number().int().positive()}),Xd=Yd.extend({coordinateSpace:p.enum([`canvas-world`,`node-normalized`,`screen-normalized`])});p.object({context:Yd.optional(),page:Ad.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(Jd).extend({nextCursor:p.string().nullable().optional()}),Ad.extend({context:Yd.optional(),canvasId:p.uuid(),threadId:p.uuid(),expectedRevision:p.number().int().positive().optional()}),p.object({thread:Jd.omit({messages:!0,hasMoreMessages:!0}),messages:p.array(Kd).max(100),nextCursor:p.string().nullable()}),p.object({context:Xd.optional(),canvasId:p.uuid(),clientThreadId:p.uuid(),anchor:Hd,body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),p.object({context:Yd.optional(),canvasId:p.uuid(),threadId:p.uuid(),clientMessageId:p.uuid(),body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),Jd.extend({postedMessage:Kd}),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:Hd}),p.object({context:Yd.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(),Zd=p.string().min(1),Qd=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)}),$d=p.object({canvasId:J,nodeId:Zd,label:p.string(),role:p.enum([`target`,`reference`])}),ef=p.discriminatedUnion(`type`,[p.object({type:p.literal(`text`),text:p.string()}),$d.extend({type:p.literal(`object`)})]),tf=p.object({revision:p.number().int().nonnegative(),text:p.string(),task:p.enum([`chat`,`rewrite`,`shorten`,`translate`,`replace`,`rename`]).default(`chat`),references:p.array($d),contentVersion:p.literal(1).default(1),parts:p.array(ef).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:`
|
|
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},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`},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),14]),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===14||!jo(e.nodes))return e;let n=Object.entries(Za).find(([e])=>Number(e)===t)?.[1];return Ao.has(n)?{...e,version:14}:Object.values(e.nodes).some(e=>jo(e)&&e.geometry!==void 0)?null:n===`typography`?{...e,version:14}:{...e,version:14,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?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({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(),order:T.int().optional(),margin:gs.partial().optional(),clipContent:p.boolean().optional(),baselineSource:bs.optional(),container:ys.partial().extend({padding:ms.partial().optional()}).optional()}).strict(),Ss=T,k=E,Cs=p.number().min(0).max(1),ws=p.string().min(1),Ts=p.object({topLeft:k,topRight:k,bottomRight:k,bottomLeft:k,smoothing:Cs.optional()}),Es=p.array(k).min(1),Ds=p.enum([`none`,`round`,`square`]),Os=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:Es.optional(),dashCap:Ds.optional(),dashOrigin:p.literal(`css`).optional(),alignment:p.enum([`inside`,`center`,`outside`]).optional()}),ks=Os.pick({width:!0,style:!0,layoutInclusion:!0}),As=p.object({visible:p.boolean(),width:k,offset:Ss,style:p.enum([`solid`,`dashed`,`dotted`]),paints:p.array(cs),dashPattern:Es.optional(),dashCap:Ds.optional()}),js=p.object({id:ws,visible:p.boolean(),kind:p.enum([`outer`,`inner`]),color:Xo,offsetX:Ss,offsetY:Ss,blur:k,spread:Ss,blendMode:is.optional(),blendSource:as.optional(),isShownBehindNode:p.boolean().optional()}),Ms=p.object({opacity:Cs,blendMode:is,fills:p.array(cs),border:Os,retainedBorder:ks.optional(),outline:As,radius:Ts,shadows:p.array(js),filters:p.array(ts),backdropFilters:p.array(ns)}),Ns=Ms.partial().refine(e=>Object.keys(e).length>0,`appearance values cannot be empty`),Ps=[`opacity`,`blendMode`,`fills`,`border`,`retainedBorder`,`outline`,`radius`,`shadows`,`filters`,`backdropFilters`],Fs=p.enum(Ps),Is=Ms.partial().extend({clear:p.array(Fs).min(1).max(Ps.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(),Ls=p.string().regex(/^[\u{20}-\u{7E}]{4}$/u),Rs=Ls.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(Rs,A).optional(),features:p.record(Ls,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()}),zs=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(),Bs=M.partial().strict(),Vs=M.keyof().options,Hs=Bs.extend({featureChanges:p.object({set:M.shape.features,clear:p.array(Ls).optional(),removeIfEmpty:p.boolean().optional()}).strict().optional(),variationChanges:p.object({set:M.shape.variations,clear:p.array(Rs).optional(),removeIfEmpty:p.boolean().optional()}).strict().optional(),clear:p.array(M.keyof()).max(Vs.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`),Us={"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`]},Ws=/^(?:behavior|-moz-binding)$/iu,Gs=p.string().min(1).regex(/^(?:--[\w-]+|-(?:webkit|moz|ms|o)-[a-z][a-z\d-]*|[a-z][a-z\d-]*)$/iu).refine(e=>!Ws.test(e),`unsafe CSS property`),N=p.object({id:p.string().min(1),property:Gs,value:qo,enabled:p.boolean()}),Ks=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`),qs=p.array(N.shape.id).refine(e=>new Set(e).size===e.length,`declaration ids must be unique`),Js=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:qs.optional(),order:qs.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`),Ys=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(),Xs=Ys.keyof().options,Zs=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:Ys.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:Zs.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 Qs=cs.array().optional();p.object({fills:Qs}),zs.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())}),$s=p.object({url:p.url(),expiresAt:p.iso.datetime(),bytes:p.number().int().min(0)}),ec=`/v1/canvas-assets/`,tc=[`image/avif`,`image/gif`,`image/jpeg`,`image/png`,`image/webp`],nc=p.string().regex(/^image\/[a-z0-9.+-]+$/u);p.object({canvasId:p.uuid(),contentType:p.enum(tc),bytes:p.number().int().positive()}),p.object({assetId:p.uuid(),path:p.string().startsWith(`/v1/canvas-assets/`),upload:P});const rc=(e,t)=>`${ec}${encodeURIComponent(e)}/${encodeURIComponent(t)}`,ic=p.tuple([p.uuid(),p.uuid()]),ac=e=>{if(!e.startsWith(`/v1/canvas-assets/`))return null;let t=ic.safeParse(e.slice(18).split(`/`)).data;return t===void 0?null:{canvasId:t[0],assetId:t[1]}},oc=[`font/ttf`,`font/otf`,`font/woff`,`font/woff2`,`font/collection`],sc=p.object({canvasId:p.uuid(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)});sc.extend({bytes:p.number().int().positive()}).extend({contentType:p.enum(oc)}),p.object({path:p.string().startsWith(`/v1/canvas-assets/`)}).extend({upload:P});const cc=(e,t)=>`${ec}${encodeURIComponent(e)}/fonts/${encodeURIComponent(t)}`;p.object({canvasId:p.uuid(),sources:p.array(sc).min(1)}),p.object({resources:p.array(p.object({source:sc,path:p.string()}))});const lc=1e3,uc=new Set(oc),dc=(e,t)=>e===`image`?nc.safeParse(t).success:uc.has(t),fc=p.strictObject({canvasId:p.uuid(),clientToken:p.uuid()});p.discriminatedUnion(`kind`,[fc.extend({kind:p.literal(`image`),contentType:p.enum(tc),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)}),fc.extend({kind:p.literal(`font`),contentType:p.enum(oc),bytes:p.number().int().positive(),sha256:p.string().regex(/^[a-f0-9]{64}$/u)})]);const pc=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(lc),maximumWeight:p.number().min(1).max(lc)}).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:pc.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=>dc(e.kind,e.contentType),`Content type must match the asset kind.`).refine(e=>e.path===(e.kind===`image`?rc(e.canvasId,e.assetId):cc(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 mc=[`top`,`right`,`bottom`,`left`];mc.map(e=>`padding-${e}`),mc.map(e=>`margin-${e}`);const hc=p.enum([`png`,`jpeg`]),gc=p.number().positive(),_c=p.strictObject({format:hc.optional(),scale:gc.optional()}),vc=p.strictObject({format:hc.nullable().optional(),scale:gc.nullable().optional()}).refine(e=>e.format!==void 0||e.scale!==void 0),yc=p.number(),bc=yc.nonnegative(),xc=p.string().min(1).max(200),Sc=p.string().regex(/^[MmLlHhVvCcSsQqTtAaZzEe\d\s.,+-]*$/u),Cc=p.strictObject({x:yc,y:yc,width:bc,height:bc}),wc=p.strictObject({kind:p.literal(`path`),path:Sc.min(1),fillRule:p.enum([`nonzero`,`evenodd`]),viewBox:Cc.extend({width:bc.positive(),height:bc.positive()})}),Tc=p.strictObject({kind:p.literal(`polygon`),count:p.number().int().min(3),innerRatio:p.number().min(0).max(1).optional(),cornerRadius:bc,cornerSmoothing:p.number().min(0).max(1)}),Ec=p.enum([`union`,`subtract`,`intersect`,`exclude`]),Dc=p.strictObject({kind:p.literal(`boolean`),operation:Ec,operandIds:p.array(xc).min(1).refine(e=>new Set(e).size===e.length),result:p.strictObject({path:Sc,fillRule:p.literal(`nonzero`),isEmpty:p.boolean(),bounds:Cc,inputKey:p.string().regex(/^[a-f0-9]{16}$/u)}).refine(e=>e.isEmpty===(e.path===``))}),Oc=p.discriminatedUnion(`kind`,[wc,Tc,p.strictObject({kind:p.literal(`mask`),maskId:xc,mode:p.enum([`alpha`,`luminance`,`outline`]).optional()}),Dc]),kc=`Update Enhance: compositing is no longer supported. Use the isolation style or a mask group.`,Ac=p.literal(14,{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,`)||ac(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()}),jc=p.enum([`start`,`center`,`end`,`stretch`,`scale`]),Mc=p.object({x:jc,y:jc}),Nc=p.enum([`source`,`generated`,`content`,`user`]),I=p.looseObject({id:p.string().min(1),label:p.string(),component:p.string().min(1),labelOrigin:Nc.optional(),visible:p.boolean().optional(),locked:p.boolean().optional(),constraints:Mc.optional(),styles:p.record(p.string(),p.union([p.string(),p.number()])),layout:xs.optional(),responsive:p.never().optional(),appearance:Ns.optional(),exportSettings:_c.optional(),typography:Bs.optional(),additionalStyles:Ks.optional(),geometry:Oc.optional(),compositing:p.never({error:kc}).optional(),props:p.record(p.string(),p.unknown()).optional(),box:F.optional()}),Pc=p.object({version:p.literal(14),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({})}),Fc=p.record(p.string(),p.unknown());p.preprocess(e=>{let t=Fc.safeParse(e).data;return t===void 0?e:Object.keys(t).length===0?Ic():Po(t)},Pc);const Ic=()=>({version:14,nodes:{root:{id:`root`,label:`Canvas`,component:`root`,labelOrigin:`generated`,visible:!0,locked:!1,styles:{}}},relationships:{},tombstones:{}}),Lc=p.string().min(1),Rc=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:Lc.optional()}),zc=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`]),Bc=p.object({nodeCount:p.number().int().positive(),unsupportedFeatures:p.array(p.object({feature:zc,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(Rc)}),Vc=I.omit({id:!0}).extend({temporaryId:Lc}),Hc=p.object({temporaryId:Lc,parentTemporaryId:Lc,sortKey:p.string().min(1)}),Uc=p.object({version:p.literal(1),rootTemporaryId:Lc,nodes:p.array(Vc).min(1),relationships:p.array(Hc),report:Bc.catch({nodeCount:0,issues:[]})}).transform(e=>({...e,report:{...e.report,nodeCount:e.nodes.length}}));p.object({canvasId:p.uuid(),documentFormatVersion:Ac,mutationId:p.uuid(),baseVersion:p.number().int().positive(),screenNodeId:p.string().min(1),draft:Uc});const Wc=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(Lc,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}),Gc=[`queued`,`claimed`,`grant`,`navigate`,`document`,`sources`,`fonts`,`layout`,`target`,`capture`,`serialize`,`compile`,`commit`,`upload`,`complete`],Kc=[`queued`,`running`,`succeeded`,`failed`,`cancelled`,`expired`],qc=[`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`],Jc=[`ASSET_UNAVAILABLE`,`FONT_FALLBACK`,`LOCAL_FONT_FALLBACK`,`SOURCE_FALLBACK`,`SCALE_REDUCED`,`LAYOUT_FALLBACK`],Yc=p.number().int().positive(),L=p.object({x:p.number(),y:p.number(),width:p.number().positive(),height:p.number().positive()}),Xc=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})]),Zc=p.object({kind:p.literal(`recording`),recordingId:p.uuid(),atMs:p.number().int().nonnegative()}),Qc=p.object({kind:p.literal(`recording`),recordingId:p.uuid(),requestedAtMs:p.number().int().nonnegative(),settledAtMs:p.number().int().nonnegative()}),$c=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()}),el=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:Xc.default({kind:`content`}),sourceState:Zc.optional(),scale:p.number().positive().default(1),maxOutputPixels:Yc.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`]}),tl=p.enum(Gc);p.enum(Kc);const nl=p.enum(qc),rl=p.enum(Jc),il=p.object({code:rl,message:p.string().min(1).max(500),sourceId:p.string().min(1).nullable()}),R=p.object({reason:nl,phase:tl,message:p.string().min(1).max(500),retryable:p.boolean(),sourceId:p.string().min(1).nullable()}),al=p.object({phase:tl,durationMs:p.number().int().min(0)}),ol=p.object({canvasId:p.uuid(),requestedVersion:p.number().int().positive(),loadedVersion:p.number().int().positive(),target:Xc,sourceState:Qc.optional(),snapshot:$c.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(il),timings:p.array(al),expiresAt:p.iso.datetime()}),sl=p.object({id:p.uuid(),canvasId:p.uuid(),purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),phase:tl,requestedVersion:p.number().int().positive(),target:Xc,sourceState:Zc.optional(),scale:p.number().positive(),maxOutputPixels:Yc.optional(),format:p.literal(`png`),attempt:p.number().int().min(0),lastFailure:R.optional(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),cl=p.discriminatedUnion(`state`,[sl.extend({state:p.literal(`queued`),result:p.null(),failure:p.null()}),sl.extend({state:p.literal(`running`),result:p.null(),failure:p.null()}),sl.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:ol,failure:p.null()}),sl.extend({state:p.literal(`failed`),result:p.null(),failure:R}),sl.extend({state:p.literal(`cancelled`),result:p.null(),failure:R.extend({reason:p.literal(`CANCELLED`)})}),sl.extend({state:p.literal(`expired`),result:p.null(),failure:R.extend({reason:p.literal(`EXPIRED`)})})]);p.object({job:cl,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}).extend({waitMs:p.number().int().min(0).max(1e4).optional()}),p.object({job:cl}),p.object({jobId:p.uuid()}),p.object({job:cl});const ll=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:$s,source:ll.optional()});const ul=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:ul}).optional()}),p.object({job:cl,alreadyExists:p.boolean()});const dl=p.object({rootIds:p.array(p.string().min(1))}),fl=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)})]),pl=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()})]),ml=p.object({source:pl,destination:fl,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`]})}),hl=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)})]),gl=p.object({id:p.uuid(),canvasId:p.uuid(),source:hl,destination:fl,phase:tl,requestedVersion:p.number().int().positive(),attempt:p.number().int().nonnegative(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),_l=p.discriminatedUnion(`state`,[gl.extend({state:p.literal(`queued`),result:p.null(),failure:p.null()}),gl.extend({state:p.literal(`running`),result:p.null(),failure:p.null()}),gl.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:Wc.extend({report:Bc}),failure:p.null()}),gl.extend({state:p.literal(`failed`),result:p.null(),failure:R}),gl.extend({state:p.literal(`cancelled`),result:p.null(),failure:R.extend({reason:p.literal(`CANCELLED`)})}),gl.extend({state:p.literal(`expired`),result:p.null(),failure:R.extend({reason:p.literal(`EXPIRED`)})})]);ml.and(p.object({canvasId:p.uuid(),expectedVersion:p.number().int().positive().optional(),mutationId:p.uuid().optional(),writeScope:dl.optional(),scope:el.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:_l,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}),p.object({job:_l}),p.object({jobId:p.uuid()}),p.object({job:_l}),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:Uc}),p.object({state:p.literal(`failed`),jobId:p.uuid(),message:p.string().min(1)})]);const vl=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(),yl=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()}),bl=p.string().regex(/^(?:\d+(?:\.\d+)?|\.\d+)px$/u),xl=p.string().regex(/^-?(?:\d+(?:\.\d+)?|\.\d+)px$/u),Sl=N.shape.value.refine(e=>!/\burl\s*\(/iu.test(e),`invalid text colour`),Cl=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:Sl,"font-family":N.shape.value,"font-size":p.union([E,bl]),"font-weight":Cl,"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`])},wl=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()}),Tl=p.union([N.shape.value,T]).nullable().optional(),El=p.strictObject({"text-decoration":Tl,"text-decoration-line":Tl,"text-decoration-style":Tl,"text-decoration-color":Tl,"text-decoration-thickness":Tl,"text-underline-offset":Tl,"text-decoration-skip-ink":Tl,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,xl,p.literal(`normal`)]).nullable().optional(),"line-height":V[`line-height`].nullable().optional(),"text-align":V[`text-align`].nullable().optional(),"text-indent":p.union([T,xl]).nullable().optional(),"white-space":V[`white-space`].nullable().optional(),"word-spacing":p.union([T,xl,p.literal(`normal`)]).nullable().optional()}),Dl=N.shape.value,H=p.union([p.string(),T]),U=p.union([N.shape.value,T]).nullable().optional(),Ol=El.extend(yl.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:Dl.nullable().optional(),"overflow-x":Dl.nullable().optional(),"overflow-y":Dl.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()}),kl=p.union([Ol.keyof(),N.shape.property.refine(e=>e.startsWith(`--`))]),Al=Ol.catchall(U).refine(e=>Object.keys(e).every(e=>kl.safeParse(e).success)),jl=p.record(p.string(),p.unknown()),Ml=p.number().int().positive(),Nl=p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`retain`),count:Ml,attributes:jl.optional(),shouldPreserveParagraph:p.boolean().optional()}),p.object({kind:p.literal(`delete`),count:Ml}),p.object({kind:p.literal(`insert`),text:p.string().min(1).refine(e=>e.isWellFormed()),attributes:jl.optional(),shouldPreserveParagraph:p.boolean().optional()})]),Pl=p.object({baseLength:p.number().int().nonnegative(),representation:p.enum([`plain`,`rich`,`links`]).optional(),steps:p.array(Nl),endAttributes:jl.optional(),properties:jl.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`})}),Fl=p.object({actionId:p.string().min(1),baseVersion:p.number().int().nonnegative(),isActive:p.boolean()}),Il=p.object({baseVersion:p.number().int().nonnegative(),after:p.array(p.string().min(1)),change:Pl}),Ll=p.object({actionId:p.string().min(1),baseVersion:p.number().int().nonnegative(),originalChange:Pl,inverse:Pl,history:Fl.optional(),source:Il.optional()}),Rl=p.object({op:p.literal(`editText`),nodeId:p.string().min(1),change:Pl,actionId:p.string().min(1).optional(),revision:Ll.optional(),history:Fl.optional(),source:Il.optional()}),zl=2e3,Bl=p.object({title:p.string().trim().min(1).max(200)}).strict(),Vl=p.array(Zs.shape.id),Hl=p.object({canvasId:p.uuid()}),Ul=p.object({definition:Zs.refine(e=>e.sourceStyleId===void 0),revision:p.number().int().positive(),fontFaces:p.array(p.record(p.string(),p.unknown()))}),Wl=p.object({styles:p.array(Ul).refine(e=>new Set(e.map(e=>e.definition.id)).size===e.length)});Hl.extend({revision:p.number().int().positive(),documentVersion:p.number().int().positive(),description:p.string().max(zl),publishedAt:p.iso.datetime(),...Wl.shape}),Hl.extend({mutationId:p.uuid(),expectedRevision:p.number().int().nonnegative(),documentVersion:p.number().int().positive(),publish:Vl,remove:Vl,description:p.string().trim().max(zl)}).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 Gl=p.object({canvasId:p.uuid(),title:p.string().max(200)});p.object({search:p.string().trim().max(200).default(``),cursor:Gl.nullable().default(null),limit:p.number().int().min(1).max(50).default(20)});const Kl=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(Kl).max(50),nextCursor:Gl.nullable()});const ql=p.object({parentId:p.string().min(1),sortKey:p.string().min(1)}),Jl=p.object({op:p.literal(`insertConvertedSubtree`),destination:fl,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),ql)}),W=p.string().min(1),Yl=F.extend({width:p.number().positive(),height:p.number().positive()}),Xl=p.object({parentId:W,afterId:W.optional()}),Zl=ql,Ql=p.object({op:p.literal(`setStyles`),nodeId:W,styles:Al,clear:p.array(kl).min(1).refine(e=>new Set(e).size===e.length).optional()}).refine(e=>(e.clear??[]).every(t=>!Object.hasOwn(e.styles,t))),$l=p.discriminatedUnion(`op`,[Jl,p.object({op:p.literal(`insertNode`),node:I,parentage:Zl,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()}),Xl.extend({op:p.literal(`insertText`),nodeId:W,label:p.string().default(`Text`),text:p.string(),box:Yl,styles:wl.default({})}),Xl.extend({op:p.literal(`insertPrototype`),nodeId:W,label:p.string().default(`Prototype`),prototypeId:p.uuid(),deploymentId:p.uuid(),box:Yl,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()}),Rl,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:Nc.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:Mc.nullable()}),Ql,p.object({op:p.literal(`patchExportSettings`),nodeId:W,exportSettings:vc}),p.object({op:p.literal(`setAppearance`),nodeId:W,appearance:Is}),p.object({op:p.literal(`setLayout`),nodeId:W,layout:p.union([xs,p.literal(`default`)]),fields:p.array(xs.keyof()).optional()}),p.object({op:p.literal(`patchTypography`),nodeId:W,typography:Hs}),p.object({op:p.literal(`setTypography`),nodeId:W,typography:p.union([Bs,p.literal(`default`)])}),p.object({op:p.literal(`patchAdditionalStyles`),nodeId:W,additionalStyles:Js}),p.object({op:p.literal(`setAdditionalStyles`),nodeId:W,additionalStyles:p.union([Ks,p.literal(`default`)])}),us,p.object({op:p.literal(`setTextStyleLibrary`),nodeId:p.literal(`root`),sourceCanvasId:p.uuid(),library:Bl.nullable()}),p.object({op:p.literal(`patchFontLibrary`),nodeId:p.literal(`root`),fonts:vl}),p.object({op:p.literal(`setTextStyle`),nodeId:p.literal(`root`),styleId:Zs.shape.id,textStyle:Zs.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([Oc,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:Zl}),Xl.extend({op:p.literal(`move`),nodeId:W}),p.object({op:p.literal(`remove`),nodeId:W,removedText:p.record(W,I.pick({props:!0})).optional()})]),eu=$l.options.map(e=>e.shape.op.value),tu=p.preprocess((e,t)=>typeof e!=`object`||!e||Reflect.get(e,`op`)!==`setCompositing`?e:(t.issues.push({code:`custom`,message:kc,input:e}),p.NEVER),$l);Wc.extend({operation:Jl,next:p.array(p.string().min(1))});const nu=p.record(p.string(),p.unknown());p.object({canvasId:p.uuid(),afterVersion:p.number().int().positive().optional()});const ru=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:$s.nullable()}),iu=p.object({mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(tu)});p.object({mutations:p.array(iu).optional(),version:p.number().int().min(1),restoreFenceVersion:p.number().int().positive().optional(),document:nu.optional(),screens:p.array(ru)}).extend({document:nu}),p.object({canvasId:p.uuid(),baseVersion:p.number().int().min(1),document:nu.refine(e=>Pc.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:nu})]);const au=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(au).optional()});const ou=p.enum([`position`,`layout`,`clip`,`cornerRadius`,`blending`,`typography`,`nativeControl`,`textDecoration`,`fill`,`outline`,`textStroke`,`border`,`outerShadow`,`innerShadow`,`filters`,`additionalStyles`,`vector`,`export`,`source`]),su=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(ou)});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(su)}),p.object({canvasId:p.uuid(),nodeId:p.string().min(1)}),p.object({canvasId:p.uuid(),version:p.number().int().positive(),node:su.extend({styles:p.record(p.string(),p.union([p.string(),p.number()])),layout:xs.optional(),appearance:Ns.optional(),geometry:Oc.optional(),typography:Bs.optional(),additionalStyles:Ks.optional(),props:p.record(p.string(),p.unknown()),children:p.array(p.string().min(1))}),next:p.array(p.string().min(1))});const cu=I.shape.id,lu=F.extend({width:p.number().positive(),height:p.number().positive()}),uu=p.record(cu,cu),du=p.strictObject({fingerprint:p.string().regex(/^[a-f0-9]{64}$/u),revisionPolicy:p.enum([`strict`,`rebase`]),copiedNodeIds:uu.optional()});p.object({canvasId:p.uuid(),mutationId:p.uuid(),documentFormatVersion:Ac,baseVersion:p.number().int().positive(),operations:p.array(tu).min(1),requestContext:du.optional(),writeScope:dl.optional()});const fu=p.object({canvasId:p.uuid(),mutationId:p.uuid(),previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(tu),insertedNodeIds:p.array(cu),changedNodeIds:p.array(cu),removedNodeIds:p.array(cu),boxes:p.record(cu,F),affectedBounds:lu.nullable(),copiedNodeIds:uu.optional(),next:p.array(p.string().min(1))});p.strictObject({canvasId:p.uuid(),mutationId:p.uuid(),fingerprint:du.shape.fingerprint}),p.discriminatedUnion(`state`,[p.strictObject({state:p.literal(`not-found`)}),p.strictObject({state:p.literal(`committed`),result:fu})]);const pu={nodes:1e3,fields:20,id:200,label:500,value:1e3},mu=p.object({available:p.boolean(),omittedNodes:p.number().int().nonnegative(),nodes:p.array(p.object({nodeId:p.string().min(1),label:p.string().max(pu.label),kind:p.enum([`inserted`,`removed`,`changed`,`unchanged`,`unavailable`]),omittedFields:p.number().int().nonnegative(),fields:p.array(p.object({label:p.string().max(pu.id),before:p.string().max(pu.value).nullable(),after:p.string().max(pu.value).nullable(),truncated:p.boolean()})).max(pu.fields)})).max(pu.nodes)}),hu=[`position`,`layout`,`cornerRadius`,`blending`,`fill`,`outline`,`border`,`outerShadow`,`innerShadow`,`filters`,`additionalStyles`,`export`],gu=[`position`,`layout`,`clip`,...hu.filter(e=>e!==`position`&&e!==`layout`)],_u=[...hu,`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:gu},{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:hu},{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:hu},{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:_u},{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:_u},{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,vu=p.array(G).min(1),yu=p.strictObject({x:p.number(),y:p.number()}),bu=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.`}),xu=p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`position`),nodeId:G,parentPosition:yu}),p.strictObject({kind:p.literal(`resize`),nodeId:G,size:bu}),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:vu,targetNodeId:G,position:p.enum([`before`,`inside`,`after`])}),p.strictObject({kind:p.literal(`group`),nodeIds:vu,label:p.string().min(1).optional()}),p.strictObject({kind:p.literal(`ungroup`),nodeIds:vu}),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()})]),Su=p.strictObject({kind:p.literal(`arrange`),changes:p.array(xu).min(1)}),Cu=p.strictObject({kind:p.literal(`duplicate`),nodeIds:vu,destination:p.discriminatedUnion(`kind`,[p.strictObject({kind:p.literal(`native`)}),p.strictObject({kind:p.literal(`inside`),parentId:G})])}),wu=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)}),Su,Cu,p.strictObject({kind:p.literal(`compile-html`),contextOperations:p.array(tu).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.`)})]),Tu=p.strictObject({pageId:G.optional(),nodeIds:p.array(G)}),Eu=p.strictObject({request:wu,scope:Tu}),Du=p.strictObject({operations:p.array(tu),idMap:p.record(G,G),rootNodeIds:p.array(G)}),Ou=Du.extend({compilations:p.array(p.strictObject({id:G,draft:Uc,warnings:p.array(il).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:Ou}),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 ku=p.object({id:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),request:wu,scope:Tu,phase:tl,attempt:p.number().int().nonnegative(),createdAt:p.iso.datetime(),updatedAt:p.iso.datetime()}),Au=p.discriminatedUnion(`state`,[ku.extend({state:p.enum([`queued`,`running`]),result:p.null(),failure:p.null()}),ku.extend({state:p.literal(`succeeded`),phase:p.literal(`complete`),result:Du.extend({loadedVersion:p.number().int().positive()}),failure:p.null()}),ku.extend({state:p.enum([`failed`,`cancelled`,`expired`]),result:p.null(),failure:R})]);p.strictObject({canvasId:p.uuid(),expectedVersion:p.number().int().positive(),request:wu,scope:Tu}),p.object({job:Au,alreadyExists:p.boolean()}),p.object({jobId:p.uuid()}),p.object({job:Au});const ju=p.string().trim().min(1).max(80).regex(/^[\w .+/-]+$/u),Mu=p.strictObject({path:p.enum([`local_mcp`,`hosted_mcp`,`direct_cli`]),name:ju.optional(),version:ju.optional()});Mu.pick({path:!0}).strip();const Nu=p.strictObject({agent_client:p.enum([`claude_code`,`codex`,`cursor`,`unknown`]),connection_path:Mu.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:ju.optional()}),Pu=p.enum([`green`,`blue`,`indigo`,`amber`,`lime`,`teal`,`cyan`,`sky`,`violet`,`purple`,`fuchsia`,`pink`]),Fu=p.string().regex(/^[0-9a-f]{32}$/),Iu=p.object({viewKey:Fu.optional(),admissionOrder:p.number().int().nonnegative().optional(),followColour:Pu.optional()}),Lu=p.object({pageId:p.string().min(1).nullable().optional(),followingViewKey:Fu.nullable().optional()}),Ru=`enhance3.canvas.v1`,zu=16384,Bu=p.enum([`blue`,`violet`,`green`,`amber`,`magenta`,`teal`,`red`,`orange`]),Vu=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:Bu}),Hu=Vu.extend(Iu.shape),Uu=p.object({kind:p.literal(`guest`),connectionId:p.uuid(),displayName:p.string().min(1).max(100),initials:p.string().min(1).max(8),colour:Bu,...Iu.shape}),Wu=p.discriminatedUnion(`kind`,[Hu,Uu]),Gu=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:Nu.optional(),colour:Bu}),Ku=p.discriminatedUnion(`kind`,[Vu.omit({connectionId:!0,avatarUrl:!0}),Gu]),qu=p.object({x:p.number(),y:p.number()}),Ju=F.extend({width:p.number().positive(),height:p.number().positive()}),Yu=p.object({count:p.number().int().positive(),bounds:Ju.nullable()}),Xu=p.object({kind:p.enum([`drag`,`resize`]),baseVersion:p.number().int().positive(),boxes:p.record(p.string().min(1),Ju).refine(e=>Object.keys(e).length<=100&&new TextEncoder().encode(JSON.stringify(e)).byteLength<=16384),summary:Yu.optional()}),Zu=p.object({cursor:qu.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<=zu).optional(),selectionSummary:Yu.nullable().optional(),visibleWorldBox:Ju.optional(),gesture:Xu.nullable().optional(),cursorChat:p.string().max(140).nullable().optional(),...Lu.shape}).refine(e=>Object.keys(e).length>0,`presence patch cannot be empty`),Qu=p.object({actor:Wu,seq:p.number().int().nonnegative(),cursor:qu.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<=zu),selectionSummary:Yu.nullable().optional(),visibleWorldBox:Ju.nullable(),gesture:Xu.nullable(),cursorChat:p.string().max(140).nullable().default(null),...Lu.shape,followOrder:p.number().int().nonnegative().optional(),expiresAt:p.iso.datetime()}),$u=p.enum([`reading`,`writing`,`creating`,`deleting`,`rendering`]),ed=p.object({activityId:p.uuid(),canvasId:p.uuid(),actor:Gu,phase:$u,nodeIds:p.array(p.string().min(1)).max(100),bounds:Ju.nullable(),expiresAt:p.iso.datetime()}),td=p.object({canvasId:p.uuid(),phase:$u,nodeIds:p.array(p.string().min(1)).max(100).default([]),bounds:Ju.nullable().default(null)});p.object({activityId:p.uuid(),expiresAt:p.iso.datetime(),renewAfterMs:p.number().int().positive()}),td.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:Iu.shape.viewKey,peers:p.array(Qu),activities:p.array(ed),documentVersion:p.number().int().positive()})}),p.object({...K,type:p.literal(`presence.patch`),payload:Qu}),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:ed.nullable()})}),p.object({...K,type:p.literal(`document.committed`),payload:p.object({mutationId:p.uuid(),actor:Ku,previousVersion:p.number().int().positive(),version:p.number().int().positive(),operations:p.array(tu).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:Zu}),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(Ru)).min(1).max(1),viewId:p.uuid().optional()}),p.object({endpoint:p.url(),ticket:p.string().min(1).max(4096),protocol:p.literal(Ru),expiresAt:p.iso.datetime()}),p.uuid();const nd=I.shape.id;p.array(nd),p.object({jobId:p.uuid()});const rd=p.object({jobId:p.uuid(),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),target:Xc,sourceState:Zc.optional()});p.discriminatedUnion(`purpose`,[rd.extend({purpose:p.literal(`preparation`),preparation:Eu,screens:p.array(ru).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`)}),rd.extend({purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),scale:p.number().positive(),maxOutputPixels:Yc.optional(),format:p.literal(`png`)}),rd.extend({purpose:p.literal(`conversion`),target:p.object({kind:p.literal(`node`),nodeId:p.string().min(1)}),sourceState:p.undefined().optional(),conversion:ml,scale:p.literal(1),format:p.literal(`json`)})]),p.object({jobId:p.uuid()}),p.object({jobId:p.uuid()});const id=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`,[id.extend({purpose:p.literal(`preparation`),target:Xc,preparation:Eu,sourceState:p.undefined().optional(),scale:p.literal(1)}),id.extend({purpose:p.enum([`inspection`,`snapshot`,`thumbnail`,`export`]),target:Xc,sourceState:Zc.optional(),scale:p.number().positive(),maxOutputPixels:Yc.optional(),outputKey:p.string().min(1).max(500)}),id.extend({purpose:p.literal(`conversion`),target:p.object({kind:p.literal(`node`),nodeId:p.string().min(1).max(200)}),sourceState:p.undefined().optional(),conversion:ml,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(il),timings:p.array(al),sourceState:Qc.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:Uc}),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 ad=p.object({total:p.number().int().nonnegative(),loading:p.number().int().nonnegative(),unavailable:p.number().int().nonnegative()}),od=p.object({jobId:p.uuid(),canvasId:p.uuid().nullable(),requestedVersion:p.number().int().positive().nullable(),loadedVersion:p.number().int().positive().nullable(),phase:tl.exclude([`queued`,`claimed`,`capture`,`upload`,`complete`]),sources:ad,warnings:p.array(il),timings:p.array(al),sourceState:Qc.optional()}),sd=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`,[od.extend({state:p.literal(`loading`),capture:p.null(),failure:p.null()}),od.extend({state:p.literal(`ready`),phase:p.literal(`target`),canvasId:p.uuid(),requestedVersion:p.number().int().positive(),loadedVersion:p.number().int().positive(),capture:sd,failure:p.null()}),od.extend({state:p.literal(`failed`),failure:p.object({reason:nl,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:Ou});const cd=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(cd),missingNodeIds:p.array(cd),nodes:p.array(su),contextRootId:cd.nullable(),visibleWorldBox:L.nullable(),next:p.array(p.string().min(1)).max(12)});const ld=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:ld.optional()}),p.object({provenance:ld.optional(),report:Bc.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 ud=new Set(Xs);new Set(Object.entries(Us).flatMap(([e,t])=>t.some(e=>ud.has(e))?[e.replaceAll(/-([a-z])/gu,(e,t)=>t.toUpperCase())]:[]));const dd=new Set(Xs);new Set(Object.entries(Us).flatMap(([e,t])=>t.some(e=>dd.has(e))?[e]:[]));const fd=1e3,pd=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)})]),md=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(fd).nullable(),actor:pd,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(md),nextCursor:p.string().min(1).nullable(),hasExpiredHistory:p.boolean()}),p.object({canvasId:p.uuid(),versionId:p.uuid()});const hd=p.object({outcome:p.literal(`ready`),entry:md,document:nu,screens:p.array(ru)}),gd=p.object({outcome:p.literal(`missing-resources`),entry:md,document:nu,screens:p.array(ru),missingScreenIds:p.array(p.uuid()).min(1)});p.discriminatedUnion(`outcome`,[hd,gd,p.object({outcome:p.literal(`corrupt`),entry:md})]);const _d=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:_d,title:p.string().trim().min(1),description:p.string().trim().max(fd).nullable().default(null)}),p.object({canvasId:p.uuid(),versionId:p.uuid(),title:p.string().trim().min(1),description:p.string().trim().max(fd).nullable().default(null)}),p.object({canvasId:p.uuid(),versionId:p.uuid()}),p.object({entry:md}),p.object({canvasId:p.uuid(),documentFormatVersion:Ac,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:Ac,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 vd=(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))},yd=p.string().regex(/^[a-f0-9]{64}$/u),bd=p.string().trim().min(1),xd=p.object({organisationId:p.uuid().nullable()}),Sd=p.object({family:p.string().regex(/^uploaded-font-[a-f0-9]{64}(?:-[a-f0-9]{12})?$/u),familyName:bd,subfamilyName:bd,version:bd,weight:p.string().regex(/^\d+(?:\.\d+)?(?: \d+(?:\.\d+)?)?$/u).refine(e=>vd(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=>vd(e,0))]),format:p.enum([`truetype`,`opentype`,`woff`,`woff2`])}),Cd=p.object({kind:p.enum([`personal`,`team`]),ownerId:p.uuid(),sha256:yd}),wd=xd.extend({sha256:yd,bytes:p.number().int().positive(),contentType:p.enum(oc)});p.object({upload:P}),wd.extend({metadata:Sd,hasSharingRights:p.literal(!0)});const Td=Cd.extend({bytes:p.number().int().positive(),metadata:Sd,createdAt:p.iso.datetime(),path:p.string().startsWith(`/v1/font-catalog/`)});p.object({entries:p.array(Td),canManage:p.boolean()}),xd.extend({sha256:yd}),xd.extend({canvasId:p.uuid(),sha256:p.array(yd).min(1)}),p.object({resources:p.array(p.object({entry:Td,path:p.string().startsWith(`/v1/canvas-assets/`)}))});const Ed=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:Ed,acceptToken:p.string().max(512).optional()}),p.object({canvasId:p.uuid()}),w(Ed),p.object({canvasId:p.uuid(),inviteId:p.uuid()}),p.object({canvasId:p.uuid(),inviteId:p.uuid()});const Dd=p.string().min(1).max(512);p.object({token:Dd}),p.object({token:Dd}),p.object({canvasId:p.uuid(),accessLevel:Bo});const Od=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(Od),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 kd=p.object({canvasId:p.uuid(),reviewState:p.enum([`not-started`,`in-progress`,`done`])});p.object({reviewState:kd.shape.reviewState.nullable()});const Ad=Fo.extend({cursor:p.string().max(2048).nullable().default(null)}),jd=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()}),Md=p.object({x:p.number(),y:p.number()}),Nd=p.object({x:p.number().min(0).max(1),y:p.number().min(0).max(1)}),Pd=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)}),Fd=jd.extend({role:p.string().min(1).optional()}),Id=p.object({path:p.array(p.number().int().min(0)),offset:p.number().int().min(0)}),Ld=p.object({version:p.literal(1),kind:p.literal(`element`),locator:Fd,attachment:Nd,fallbackBounds:Pd}),Rd=p.object({version:p.literal(1),kind:p.literal(`text`),root:Fd,quote:p.object({exact:p.string().min(1),prefix:p.string(),suffix:p.string()}),range:p.object({start:Id,end:Id}),attachment:Nd,fallbackBounds:Pd}),zd=p.object({version:p.literal(1),kind:p.literal(`elements`),members:p.array(Fd).min(2),truncated:p.boolean(),attachment:Nd,fallbackBounds:Pd}),Bd=p.object({version:p.literal(1),kind:p.literal(`area`),bounds:Pd,attachment:Nd}),Vd=p.discriminatedUnion(`kind`,[Ld,Rd,zd,Bd]),Hd=p.discriminatedUnion(`on`,[p.object({on:p.literal(`canvas`),point:Md,pageId:p.string().min(1).max(256).optional()}),p.object({on:p.literal(`node`),nodeId:p.string().min(1),point:Md,element:p.null()}),p.object({on:p.literal(`screen`),nodeId:p.string().min(1),screenId:p.uuid(),point:Md,element:jd.nullable(),target:Vd.optional()})]),Ud=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()}),Wd=p.object({personId:p.uuid(),name:p.string().min(1).max(120)}),Gd=p.object({emoji:p.string().min(1).max(16),people:p.array(Wd).min(1)}),Kd=p.object({messageId:p.uuid(),seq:p.number().int().min(1),body:p.string().min(1),isDeleted:p.boolean(),author:Ud,createdAt:p.iso.datetime(),editedAt:p.iso.datetime().nullable(),mentions:p.array(Wd),reactions:p.array(Gd)}),qd=p.object({kind:p.enum([`person`,`agent`]),personId:p.uuid(),name:p.string().min(1).max(120),tokenLabel:p.string().max(120).nullable()}),Jd=p.object({revision:p.number().int().positive(),threadId:p.uuid(),canvasId:p.uuid(),anchor:Hd,author:Ud,messages:p.array(Kd).min(1).max(50),messageCount:p.number().int().min(1),hasMoreMessages:p.boolean(),isResolved:p.boolean(),resolvedAt:p.iso.datetime().nullable(),resolvedBy:qd.nullable(),createdAt:p.iso.datetime(),lastMessageAt:p.iso.datetime()}),Yd=p.strictObject({canvasRef:p.string().min(1),expectedVersion:p.number().int().positive()}),Xd=Yd.extend({coordinateSpace:p.enum([`canvas-world`,`node-normalized`,`screen-normalized`])});p.object({context:Yd.optional(),page:Ad.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(Jd).extend({nextCursor:p.string().nullable().optional()}),Ad.extend({context:Yd.optional(),canvasId:p.uuid(),threadId:p.uuid(),expectedRevision:p.number().int().positive().optional()}),p.object({thread:Jd.omit({messages:!0,hasMoreMessages:!0}),messages:p.array(Kd).max(100),nextCursor:p.string().nullable()}),p.object({context:Xd.optional(),canvasId:p.uuid(),clientThreadId:p.uuid(),anchor:Hd,body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),p.object({context:Yd.optional(),canvasId:p.uuid(),threadId:p.uuid(),clientMessageId:p.uuid(),body:p.string().trim().min(1),mentionedPersonIds:p.array(p.uuid()).default([])}),Jd.extend({postedMessage:Kd}),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:Hd}),p.object({context:Yd.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(),Zd=p.string().min(1),Qd=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)}),$d=p.object({canvasId:J,nodeId:Zd,label:p.string(),role:p.enum([`target`,`reference`])}),ef=p.discriminatedUnion(`type`,[p.object({type:p.literal(`text`),text:p.string()}),$d.extend({type:p.literal(`object`)})]),tf=p.object({revision:p.number().int().nonnegative(),text:p.string(),task:p.enum([`chat`,`rewrite`,`shorten`,`translate`,`replace`,`rename`]).default(`chat`),references:p.array($d),contentVersion:p.literal(1).default(1),parts:p.array(ef).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
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}}),nf=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()}),rf=p.object({canvasId:J,mutationId:J,previousVersion:p.number().int().positive(),version:p.number().int().positive(),nodeIds:p.array(Zd),reverted:p.boolean().default(!1),review:mu.optional()}),af=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()}),of=p.object({jobId:J,version:p.number().int().positive(),target:Xc,state:p.enum([`rendered`,`checked`,`needs-review`]),summary:p.string().max(q.label)}),sf=p.object({parts:p.array(ef).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)}),cf=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())}),lf=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`])}),uf=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)}),df=p.object({id:J,state:p.enum([`preparing`,`starting`,`running`,`waiting`,`stopping`,`reconciling`,`completed`,`stopped`,`failed`,`interrupted`,`needs-review`]),submittedDraft:tf,attachments:p.array(uf).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(sf),receipts:p.array(rf),inspections:p.array(of).default([]),questions:p.array(af).optional(),intents:p.array(lf).default([]),pending:cf.nullable(),recoveryIssue:p.string().nullable().optional(),issue:p.string().nullable()}),ff=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:tf,turns:p.array(df),earlierMessages:p.number().int().nonnegative().optional(),sequence:p.number().int().nonnegative()}),Y=p.uuid(),pf=df.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}),mf=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(pf)}).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(mf),next:p.object({updatedAt:p.iso.datetime(),chatId:Y,unread:p.boolean().optional()}).nullable()});const hf=p.object({canvasId:Y,chatId:Y});hf.extend({before:p.number().int().nonnegative().optional()}),p.object({chat:mf.nullable(),next:p.number().int().nonnegative().nullable()}),hf.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 gf=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:nf,chats:p.array(ff),chatPages:p.array(p.object({canvasId:X,hasMore:p.boolean()})).default([]),attachments:p.array(uf),instructions:p.array(Qd).default([]),issue:p.string().nullable(),capabilities:p.object({images:p.boolean(),dictation:p.boolean()})});const _f=p.object({personId:X,tokenId:X,token:p.string().startsWith(`enh_`).max(q.label),expiresAt:p.iso.datetime()}),vf=p.object({canvasId:X,rootIds:p.array(gf),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:_f}),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:tf}),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:vf}),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 yf=p.string().trim().min(1).max(2e3);p.object({message:yf,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 bf=p.enum([`home`,`recents`,`shared`,`trash`,`team`,`canvas`,`invite`,`sign-in`,`sign-up`,`other`]),xf=p.enum([`Error`,`TypeError`,`RangeError`,`ReferenceError`,`SyntaxError`,`URIError`,`AbortError`,`NetworkError`,`SecurityError`,`UnhandledRejection`]),Sf=1e6,Cf=p.number().int().min(0).max(864e5),wf=p.object({name:xf,atMs:Cf,source:p.enum([`application`,`external`,`unknown`]),line:p.number().int().min(0).max(Sf).optional(),column:p.number().int().min(0).max(Sf).optional()}),Tf=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:Cf,atMs:Cf,correlationId:p.uuid().optional()}),Ef=p.object({action:p.enum([`navigate`,`feedback.open`]),route:bf,atMs:Cf}),Df=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:bf,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(wf).max(10),api:p.array(Tf).max(10),activity:p.array(Ef).max(20),replayUrl:Df.optional().catch(void 0)});const Of=p.enum([`owner`,`admin`,`member`]),kf=p.enum([`can-view`,`can-comment`,`can-edit`]),Af=p.object({id:p.uuid(),name:p.string().min(1).max(120),role:Of});p.object({}),w(Af),p.object({name:p.string().trim().min(1).max(120)}),p.object({organisation:Af}),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 jf=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:kf.default(`can-comment`),role:Of});p.object({organisationId:p.uuid()}),w(jf),p.object({organisationId:p.uuid(),email:p.email().trim().toLowerCase().max(254),role:p.enum([`admin`,`member`]).default(`member`),contentAccess:kf.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:kf}).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 Mf=p.object({inviteId:p.uuid(),email:p.string().max(254).pipe(p.email()),contentAccess:kf.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:kf.default(`can-comment`)}),p.discriminatedUnion(`kind`,[p.object({kind:p.literal(`member`),personId:p.uuid()}),p.object({kind:p.literal(`invitation`),invite:Mf})]),p.object({invite:Mf}),p.object({organisationId:p.uuid()}),w(Mf),p.object({organisationId:p.uuid(),inviteId:p.uuid()}).extend({});const Nf=p.string().min(1).max(512);p.object({token:Nf}),p.object({token:Nf}),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:kf.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 Pf=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:Pf}),p.object({}),p.object({items:p.array(Pf),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 Ff=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:Ff.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:Ff});const If=p.string().trim().toLowerCase().min(3).max(40).regex(/^[a-z0-9][a-z0-9._-]*$/,`letters, digits, dot, underscore and dash only`),Lf=p.enum([`cookie`,`token`]).default(`cookie`);p.object({username:If,password:p.string().min(10).max(200),displayName:p.string().trim().min(1).max(120),deliver:Lf,email:p.string().max(254).transform(e=>e.trim().toLowerCase()).pipe(p.email())}),p.object({username:If,password:p.string().min(1).max(200),deliver:Lf}),p.object({person:Ff,token:p.string().nullable()}).extend({preparedCanvasId:p.uuid()}),p.object({}),p.object({signedOut:p.literal(!0)});const Rf=p.enum([`image/jpeg`,`image/png`,`image/webp`]);p.object({contentType:Rf,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:Ff});const zf=p.string().max(254).pipe(p.email()),Bf=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:zf}),p.object({kind:p.literal(`email`),email:zf})]);p.object({query:p.string().trim().min(1).max(200)});const Vf=p.object({recipients:p.array(Bf).max(5)});p.object({}),Vf.extend({});const Hf=`enhance3:session-handoff`;p.union([p.object({kind:p.literal(Hf),body:p.object({token:p.string().min(1),displayName:p.string().min(1)})}),p.object({kind:p.literal(Hf),signedOut:p.literal(!0)})]);const Uf=p.string().length(64).refine(e=>{for(let t of e)if(!/[\da-f]/u.test(t))return!1;return!0}),Wf=e=>{for(let t of e){let e=t.codePointAt(0);if(e!==void 0&&(e===127||e<=31))return!0}return!1},Gf=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(`\\`)&&!Wf(e)&&!e.startsWith(`__enhance/`)&&e.split(`/`).every(e=>e!==``&&e!==`.`&&e!==`..`),{message:`prototype paths must be portable relative file paths`}),Kf=p.object({path:Gf,contentType:p.string().trim().min(1).max(200).refine(e=>!Wf(e)),bytes:p.number().int().nonnegative().max(2**53-1),sha256:Uf});p.object({version:p.literal(1),entryPath:Gf,files:p.array(Kf).min(1)});const qf=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:qf});const Jf=p.object({protocolVersion:p.literal(1),format:p.literal(`zip`),bytes:p.number().int().positive().max(2**53-1),sha256:Uf,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:Gf,artifact:Jf,box:F.extend({width:p.number().positive(),height:p.number().positive()})});const Yf=p.enum([`uploading`,`queued`,`ingesting`,`ready`,`failed`,`abandoned`]),Xf=p.array(p.object({path:p.string().min(1),code:p.string().min(1)})),Zf=p.object({prototypeId:p.uuid(),deploymentId:p.uuid(),nodeId:p.string().min(1),alreadyExists:p.boolean(),artifact:Jf});p.discriminatedUnion(`state`,[Zf.extend({state:p.literal(`uploading`),upload:P}),Zf.extend({state:p.enum([`queued`,`ingesting`,`ready`,`failed`,`abandoned`])})]);const Qf=p.object({canvasId:p.uuid(),deploymentId:p.uuid()});p.object({deploymentId:p.uuid(),state:Yf}),p.object(Qf.shape);const $f=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:Xf.optional()});p.discriminatedUnion(`state`,[$f.extend({state:p.literal(`failed`),failure:p.object({code:p.string().min(1),message:p.string().min(1),path:Gf.optional()})}),$f.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:Xf.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 ep=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`}),tp=p.object({path:ep,contentType:p.string().min(1).max(200),bytes:p.number().int().nonnegative()}),np=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:ep.default(`index.html`),files:p.array(tp).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:np,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 rp=p.object({path:ep,upload:P});p.object({deploymentId:p.uuid(),uploads:p.array(rp).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:Xf.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 ip=m.int().check(m.minimum(0),m.maximum(6e5)),ap=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:ip,migration:ap,migrationWaitMs:ip}))}),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 op=m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.connect`),connectionId:m.uuid()});m.extend(op,{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 sp=m.object({protocol:m.literal(1),type:m.literal(`enhance.prototype.present`),generation:m.uuid(),nonce:m.uuid()});m.extend(sp,{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 cp=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]`)}))}))}),lp=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(lp,{outcome:m.literal(`captured`),screen:cp,issues:m.optional(ta)}),m.extend(lp,{outcome:m.literal(`menu-svg`),markup:m.string().check(m.startsWith(`data:image/svg+xml`))}),m.extend(lp,{outcome:m.literal(`failed`),error:m.string().check(m.minLength(1)),code:m.optional(m.enum([`capture-failed`,`capture-busy`]))})]);const up=m.number().check(m.minimum(0),m.maximum(6e4)),dp={wheelQuietMs:280,pointerSlopPx:4,singleAxisRatio:1.2,momentumTailSpeed:100,axisRatio:1.25,openingSamplePx:4,openingWindowMs:35},fp=m.object({directionConfirmation:m._default(m.literal(`next-sample`),`next-sample`),openingSamplePx:m._default(m.number().check(m.minimum(0),m.maximum(16)),dp.openingSamplePx),openingWindowMs:m._default(m.number().check(m.minimum(0),m.maximum(50)),dp.openingWindowMs),canvasProtection:m._default(m.literal(`slow-tail`),`slow-tail`),momentumTailSpeed:m._default(m.number().check(m.minimum(0),m.maximum(1e3)),dp.momentumTailSpeed),wheelQuietMs:m._default(up,dp.wheelQuietMs),pointerSlopPx:m._default(m.number().check(m.minimum(0),m.maximum(50)),dp.pointerSlopPx),singleAxisRatio:m._default(m.number().check(m.minimum(.25),m.maximum(4)),dp.singleAxisRatio),axisRatio:m._default(m.number().check(m.minimum(1),m.maximum(4)),dp.axisRatio)});fp.parse({});const pp=m.object({inputVersion:m.literal(2)});m.extend(pp,{type:m.literal(`enhance.prototype.input-context`),settings:fp,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 mp=m.extend(pp,{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))}),hp=m.extend(pp,{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))}),gp=m.extend(pp,{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`])}),_p=m.extend(pp,{type:m.literal(`enhance.prototype.input-ready`),build:m.string().check(m.maxLength(120))}),vp=m.extend(pp,{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`,[mp,gp,_p,hp,vp]);const yp=2166136261,bp=Number.parseInt(`9e3779b9`,16),xp=Number.parseInt(`85ebca6b`,16),Sp=Number.parseInt(`c2b2ae35`,16);yp^bp,yp^xp,yp^Sp;const Cp=p.object({width:p.number().int().positive(),height:p.number().int().positive()}),wp=p.object({mimeType:p.string().min(1).max(100),sampleRate:p.number().int().min(8e3).max(192e3)});p.object({sourceUrl:p.string(),viewport:Cp,pageTitle:p.string().nullable(),audio:wp.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:Cp,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 Tp=p.enum([`whole`,`recovering`,`partial`]),Ep=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:Tp});const Dp=p.object({recordingId:p.uuid(),durationMs:p.number().int().min(0),viewport:Cp,interrupted:p.boolean(),chunkCount:p.number().int().min(0),startedAt:p.iso.datetime(),isCopy:p.boolean()}),Op=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:Op}),p.object({screenId:p.uuid(),assets:Op})]),p.object({reserved:p.array(p.object({url:p.string(),upload:P}))});const kp=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:kp}),p.object({screenId:p.uuid(),arrived:kp})]),p.object({missingAssetCount:p.number().int().min(0)}),p.object({canvasId:p.uuid(),recordingId:p.uuid()});const Ap=p.object({seq:p.number().int().min(0),firstEventMs:p.number().int().min(0),lastEventMs:p.number().int().min(0),continues:p.boolean()}),jp=p.discriminatedUnion(`state`,[Ap.extend({state:p.literal(`available`),download:$s}),Ap.extend({state:p.literal(`missing`)})]),Mp=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()}),Np=p.discriminatedUnion(`state`,[Mp.extend({state:p.literal(`available`),download:$s}),Mp.extend({state:p.literal(`missing`)})]);p.object({recordingId:p.uuid(),durationMs:p.number().int().min(0),viewport:Cp,sourceUrl:p.string(),interrupted:p.boolean(),integrity:Tp,chunks:p.array(jp),audio:p.object({mimeType:p.string(),chunks:p.array(Np)}).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 Pp=p.object({recordingId:p.uuid(),track:Ep,index:p.number().int().min(0)});p.object({upload:P}),Pp.extend({etag:p.string().min(1).max(200)}),p.object({integrity:Tp}),p.object({canvasId:p.uuid()}),w(Dp).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;
|
|
@@ -36,4 +36,4 @@ Write one visual group at a time. Use --review none for a committed receipt, the
|
|
|
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:yg(e.atMs,`--at-ms`,!1),timeoutMs:yg(e.timeoutMs,`--timeout-ms`,!0)},clientToken:n.data}))})},xg=(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.`)},Sg=(e,t)=>Rt(e,e=>({[e]:{query:async n=>t.query(e,n),mutate:async n=>xg(e,n,await t.mutate(e,n))}})),Cg=(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}))})},wg={jsonInput:`auto`,prompts:!1,logger:`ndjson`,errorMapping:`stable-exit-codes`},Tg=e=>{let t=e.state;return{logger:e.output.logger,prompts:wg.prompts,process:kh(),formatError:e=>{let n=pe(e,t.pendingParserMessage);return t.exitCode=Ae(n,!1,e),t.pendingParserMessage=null,JSON.stringify(n)}}},Eg=e=>typeof e==`object`&&e&&!Array.isArray(e)?Object.fromEntries(Object.entries(e)):null,Dg=e=>{let t=Eg(e),n=t===null?void 0:t.description;return typeof n==`string`&&n!==``?n:null},Og=e=>({descriptions:new Map(e.flatMap(([e,t])=>{let n=Dg(t.meta);return n===null?[]:[[e,n]]})),mutationPaths:new Set(e.flatMap(([e,t])=>t.type===`mutation`?[e]:[]))}),kg=()=>{let e=null;return()=>(e??=De(),e)},Ag=(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),ng(e,i,n,t.output),Eh(e,t),mg(e,{invocation:i,catalog:n,output:t.output}),rg(e,{version:t.version,credentials:t.credentials,remote:t.remote,output:t.output}),pg(e,{screen:r,recording:an(t.remote),world:ln(t.remote,r)},t.output),tg(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}),bg(e,{invocation:i,catalog:n,output:t.output}),vg(e,i,n,t.output),Cg(e,{invocation:i,catalog:n,output:t.output})},jg=e=>{let t=ft({router:Se()}),n=kg(),{descriptions:r,mutationPaths:i}=Og(t),a=dt({router:Sg(t,e.remote),name:e.commandName,version:e.version,description:`Operate Enhance as the authenticated person.`,jsonInput:wg.jsonInput}),o=Tg(e),s=a.buildProgram(o);if(!(s instanceof ut))throw TypeError(`trpc-cli did not return a Commander program`);Yh(s),Ag(s,e,n),Gh(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}}}},Mg=e=>f.exit(e),Ng=36e5,Pg=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Fg=e=>{if(Array.isArray(e))return e.map(e=>JSON.stringify(e));if(!Pg(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(Pg(e)?{...e,truncated:n}:{value:e,truncated:n}))},Ig=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`)},Lg=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}},Rg=e=>typeof e==`string`?Lg(e):Array.isArray(e)?e.some(e=>Rg(e)):Pg(e)?Object.values(e).some(e=>Rg(e)):!1,zg=e=>{bt(e,{recursive:!0,mode:448}),gt(e,448)},Bg=e=>{if(!vt(e))return;let t=Date.now()-Ng,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)}},Vg=e=>({...e,sensitive:!0,cleanup:`unlink-after-use`,deleteAfter:new Date(Date.now()+Ng).toISOString()}),Hg=(e,t)=>{let n=Fg(e),r=`${n.join(`
|
|
39
|
-
`)}\n`;zg(t);let i=h.join(t,`result-${Ot()}.ndjson`);Et(i,r,{mode:384,flag:`wx`}),f.stdout.write(`${JSON.stringify(Vg({path:i,characters:r.length,records:n.length,reason:`signed-url`}))}\n`)},Ug=e=>Pg(e)?typeof e.token==`string`?{field:`token`,value:e.token}:typeof e.acceptToken==`string`?{field:`acceptToken`,value:e.acceptToken}:null:null,Wg=(e,t,n)=>{let r=`${t.value}\n`;zg(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:Vg({path:i,field:t.field,characters:r.length})})}\n`)},Gg=e=>e.includes(`Usage:`)||e.includes(`Options:`)||e.includes(`Commands:`),Kg=ne.omit({fields:!0}).extend({remediation:p.string(),fields:p.array(p.object({path:p.string(),message:p.string()})).optional()}),qg=e=>{try{let t=JSON.parse(e),n=Kg.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}},Jg=(e,t)=>{if(typeof e==`string`&&Gg(e)){f.stdout.write(e);return}let n=Ug(e);if(n!==null&&Pg(e)){Wg(e,n,t);return}if(Rg(e)){Hg(e,t);return}let r=ke(e);if(r!==null){let e=null;if(r.detail!==null){zg(t);let n=h.join(t,`result-${Ot()}.ndjson`),i=`${JSON.stringify(r.detail)}\n`;Et(n,i,{mode:384,flag:`wx`}),e=Vg({path:n,characters:i.length,records:1})}f.stdout.write(`${JSON.stringify({...r.value,...e!==null&&{detail:e}})}\n`);return}Ig(Fg(e))},Yg=e=>{f.stderr.write(`${JSON.stringify(e)}\n`)},Xg=(e,t,n=`enhance`)=>{let r=e,i=h.join(t,`sensitive`);return Bg(i),{result:e=>{Jg(we(e,n),i)},failure:e=>{Yg(je(e,n))},logger:{info:(...e)=>{Jg(we(e.length===1?e[0]:e,n),i)},error:(...e)=>{let t=String(we(e.map(String).join(``),n)),i=qg(t);i===null?r.pendingParserMessage=t:Yg(i)}}}};(async()=>{let e=Ye(),t={exitCode:1,pendingParserMessage:null},n=Xg(t,e.configDirectory,e.commandName),r=tt(e.configDirectory),i=rt(),a=Qe(e.apiUrl,r,i),o=jg({apiUrl:e.apiUrl,version:`0.1.
|
|
39
|
+
`)}\n`;zg(t);let i=h.join(t,`result-${Ot()}.ndjson`);Et(i,r,{mode:384,flag:`wx`}),f.stdout.write(`${JSON.stringify(Vg({path:i,characters:r.length,records:n.length,reason:`signed-url`}))}\n`)},Ug=e=>Pg(e)?typeof e.token==`string`?{field:`token`,value:e.token}:typeof e.acceptToken==`string`?{field:`acceptToken`,value:e.acceptToken}:null:null,Wg=(e,t,n)=>{let r=`${t.value}\n`;zg(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:Vg({path:i,field:t.field,characters:r.length})})}\n`)},Gg=e=>e.includes(`Usage:`)||e.includes(`Options:`)||e.includes(`Commands:`),Kg=ne.omit({fields:!0}).extend({remediation:p.string(),fields:p.array(p.object({path:p.string(),message:p.string()})).optional()}),qg=e=>{try{let t=JSON.parse(e),n=Kg.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}},Jg=(e,t)=>{if(typeof e==`string`&&Gg(e)){f.stdout.write(e);return}let n=Ug(e);if(n!==null&&Pg(e)){Wg(e,n,t);return}if(Rg(e)){Hg(e,t);return}let r=ke(e);if(r!==null){let e=null;if(r.detail!==null){zg(t);let n=h.join(t,`result-${Ot()}.ndjson`),i=`${JSON.stringify(r.detail)}\n`;Et(n,i,{mode:384,flag:`wx`}),e=Vg({path:n,characters:i.length,records:1})}f.stdout.write(`${JSON.stringify({...r.value,...e!==null&&{detail:e}})}\n`);return}Ig(Fg(e))},Yg=e=>{f.stderr.write(`${JSON.stringify(e)}\n`)},Xg=(e,t,n=`enhance`)=>{let r=e,i=h.join(t,`sensitive`);return Bg(i),{result:e=>{Jg(we(e,n),i)},failure:e=>{Yg(je(e,n))},logger:{info:(...e)=>{Jg(we(e.length===1?e[0]:e,n),i)},error:(...e)=>{let t=String(we(e.map(String).join(``),n)),i=qg(t);i===null?r.pendingParserMessage=t:Yg(i)}}}};(async()=>{let e=Ye(),t={exitCode:1,pendingParserMessage:null},n=Xg(t,e.configDirectory,e.commandName),r=tt(e.configDirectory),i=rt(),a=Qe(e.apiUrl,r,i),o=jg({apiUrl:e.apiUrl,version:`0.1.41-dev.sha-34e2502f4133`,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&&Mg(e.requestedCode===0?0:t.exitCode),n.failure(pe(e,null)),Mg(1)}})().catch(e=>{f.stderr.write(`${e instanceof Error?e.message:`CLI startup failed.`}\n`),f.exitCode=1});export{};
|