velloo 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/README.md +29 -7
  2. package/canvas/assets/index-BDBBHdHH.css +2 -0
  3. package/canvas/assets/index-QdsLJNY9.js +29 -0
  4. package/canvas/assets/lucide-all-R8DUyY-B.js +1 -0
  5. package/canvas/index.html +2 -2
  6. package/chunk-0rdf6trc.js +2 -0
  7. package/{chunk-tkvb3wb8.js → chunk-0wafc9aw.js} +1 -1
  8. package/chunk-0wqxb8r9.js +3 -0
  9. package/{chunk-hzjzmkp6.js → chunk-10hap8kc.js} +1 -1
  10. package/chunk-18eqh3s1.js +2 -0
  11. package/chunk-19xyzep8.js +2 -0
  12. package/{chunk-sn9vg42q.js → chunk-1h3gqy7w.js} +1 -1
  13. package/{chunk-3kqtny5t.js → chunk-33t0csxs.js} +2 -2
  14. package/{chunk-0r80246c.js → chunk-3ffs39e8.js} +1 -1
  15. package/chunk-42bj6r30.js +3 -0
  16. package/chunk-49w26e94.js +5 -0
  17. package/{chunk-nte0t7v3.js → chunk-4pkw6d9n.js} +2 -2
  18. package/{chunk-vh4144az.js → chunk-4sjvdakg.js} +1 -1
  19. package/chunk-5f0xv80x.js +5 -0
  20. package/{chunk-2fgfex9b.js → chunk-5ma8zbty.js} +1 -1
  21. package/{chunk-8yz604tw.js → chunk-5y9hem1j.js} +1 -1
  22. package/chunk-66qgm91k.js +708 -0
  23. package/{chunk-46xykc71.js → chunk-675tr675.js} +1 -1
  24. package/{chunk-7cktk5qr.js → chunk-6cgvzwec.js} +1 -1
  25. package/chunk-6k05kqnc.js +3 -0
  26. package/{chunk-09385g5r.js → chunk-6ytv1v2r.js} +1 -1
  27. package/{chunk-33r6266k.js → chunk-75sc3adm.js} +1 -1
  28. package/chunk-7cexzg71.js +2 -0
  29. package/chunk-98rann8t.js +2 -0
  30. package/{chunk-e56eb38j.js → chunk-a16mz9zf.js} +1 -1
  31. package/chunk-afe25dpr.js +2 -0
  32. package/{chunk-zkn1m8tw.js → chunk-ahm4zd56.js} +1 -1
  33. package/chunk-asvdqkdp.js +6 -0
  34. package/{chunk-8sfx5x8k.js → chunk-b3x80jc1.js} +1 -1
  35. package/{chunk-4rvmpsda.js → chunk-cdqah1hy.js} +1 -1
  36. package/{chunk-z1r0sc3k.js → chunk-cqt1dpxd.js} +1 -1
  37. package/{chunk-k10n8na7.js → chunk-d4r0myxr.js} +1 -1
  38. package/{chunk-cdxy4xzs.js → chunk-d9kx7v12.js} +1 -1
  39. package/{chunk-t4zss1tk.js → chunk-df557bn4.js} +1 -1
  40. package/{chunk-25j8vgpa.js → chunk-edgwx026.js} +1 -1
  41. package/chunk-emv1j50t.js +2 -0
  42. package/{chunk-3gbmq4jz.js → chunk-ewgdcgrk.js} +1 -1
  43. package/chunk-f45p6kcb.js +2 -0
  44. package/{chunk-8krqgzny.js → chunk-gn9wcc1b.js} +1 -1
  45. package/{chunk-vbe2r4kv.js → chunk-hr3gbak5.js} +2 -2
  46. package/{chunk-y0rwf1ze.js → chunk-j7tzbt3d.js} +1 -1
  47. package/chunk-mm8wv3bg.js +3 -0
  48. package/chunk-nbbnb5e9.js +3 -0
  49. package/{chunk-c4fym47a.js → chunk-ngbqd7kb.js} +32 -12
  50. package/chunk-nkqtnwzz.js +2 -0
  51. package/{chunk-jtsn41cs.js → chunk-q3kf8243.js} +1 -1
  52. package/{chunk-c6hywdvq.js → chunk-qpv28z8d.js} +1 -1
  53. package/{chunk-n5acf0s3.js → chunk-rd65xm6r.js} +1 -1
  54. package/{chunk-ys3s5gaa.js → chunk-ryga3ny1.js} +1 -1
  55. package/{chunk-cvn689d5.js → chunk-sb5h27w9.js} +2 -2
  56. package/chunk-tw4kw4ps.js +22 -0
  57. package/chunk-v6c3h9ft.js +3 -0
  58. package/chunk-vgx47anc.js +3 -0
  59. package/chunk-vrvkvb0v.js +244 -0
  60. package/{chunk-v0syg2hx.js → chunk-vryadew3.js} +9 -7
  61. package/chunk-w6f40y2x.js +11 -0
  62. package/{chunk-c5zjen06.js → chunk-we8hvy6e.js} +1 -1
  63. package/chunk-wkqrb2tz.js +4 -0
  64. package/{chunk-js6mz7h1.js → chunk-xzkczmgg.js} +1 -1
  65. package/{chunk-8yadb6xz.js → chunk-ycrddh47.js} +1 -1
  66. package/{chunk-bhx8k09w.js → chunk-z78c1kf8.js} +1 -1
  67. package/cli.js +1 -1
  68. package/package.json +3 -1
  69. package/pkgs/provider-html/src/index.ts +68 -0
  70. package/pkgs/provider-html/src/registry.ts +121 -0
  71. package/pkgs/provider-html/src/version.ts +1 -0
  72. package/pkgs/provider-none/src/components-inline.tsx +12 -3
  73. package/pkgs/provider-none/src/components.tsx +11 -3
  74. package/pkgs/provider-none/src/manifest.ts +1 -0
  75. package/pkgs/schema/src/comment.ts +12 -0
  76. package/pkgs/schema/src/config.ts +33 -1
  77. package/pkgs/schema/src/css-declarations.ts +41 -0
  78. package/pkgs/schema/src/index.ts +4 -0
  79. package/pkgs/schema/src/theme.ts +40 -0
  80. package/plugins/claude/velloo/agents/velloo-design-reviewer.md +56 -13
  81. package/plugins/claude/velloo/agents/velloo-designer.md +4 -1
  82. package/skills/velloo-setup/SKILL.md +19 -55
  83. package/canvas/assets/index-CSSyvzzo.css +0 -2
  84. package/canvas/assets/index-MXiDRs_Q.js +0 -29
  85. package/canvas/assets/lucide-all-BSrW0hTo.js +0 -1
  86. package/chunk-0zen7bzb.js +0 -3
  87. package/chunk-1tdh4h14.js +0 -6
  88. package/chunk-38ev3cp3.js +0 -3
  89. package/chunk-5qd2ykvw.js +0 -26
  90. package/chunk-6qfyem23.js +0 -2
  91. package/chunk-6z0kpe65.js +0 -2
  92. package/chunk-8g5ghy46.js +0 -5
  93. package/chunk-cgzhcvsj.js +0 -2
  94. package/chunk-egccxmed.js +0 -688
  95. package/chunk-fjbzk4sw.js +0 -3
  96. package/chunk-gsne0ap4.js +0 -2
  97. package/chunk-nc5k1ez4.js +0 -2
  98. package/chunk-njhdn9j0.js +0 -4
  99. package/chunk-q4d60wr3.js +0 -3
  100. package/chunk-rsy246re.js +0 -2
  101. package/chunk-syg6k8m0.js +0 -10
  102. package/chunk-t8xk4thc.js +0 -244
  103. package/chunk-tqwe5tc3.js +0 -2
  104. package/chunk-va9v9y5m.js +0 -2
  105. package/chunk-yjmawrv5.js +0 -5
package/chunk-fjbzk4sw.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- import{existsSync}from"fs";import{join}from"path";function resolveProviderSrcDir(here,pkgName,envOverride){let dev=join(here,"..","src");return[envOverride,join(here,"pkgs",pkgName,"src"),dev].filter((p)=>Boolean(p)).find((d)=>existsSync(join(d,"tailwind-entry.css")))??dev}
3
- export{resolveProviderSrcDir};
package/chunk-gsne0ap4.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{NEVER,string,number,boolean,_null,unknown,array,object,strictObject,union,record,_enum,literal,preprocess,FrameSchemeSchema,MAX_BOARD_NAME_LENGTH,NodeIdSchema,RepoComponentRefSchema,NodeSchema,SnippetParamSchema}from"./chunk-nte0t7v3.js";var Visibility=_enum(["public","private"]),AuthConfigResponseSchema=object({appUrl:string().optional(),issuer:string().optional(),clientId:string().optional()}),HealthResponseSchema=object({ok:boolean().optional(),db:object({ok:boolean().optional()}).optional(),blob:object({ok:boolean().optional()}).optional()}),AccountResponseSchema=object({email:string(),name:string().optional(),tier:string().optional(),creditMicros:number().nullable().optional()});function protectedSharesAllowed(tier){return tier!=="free"}var PROTECTED_SHARES_UNAVAILABLE="private and password-protected links need a paid plan \u2014 free accounts publish public links only";function teamOnlyAllowed(tier){return tier===void 0||tier==="business"||tier==="enterprise"}var GUESTS_UNAVAILABLE="sharing a board with guests needs a paid plan \u2014 upgrade your plan to invite guests",PublishSlotSchema=object({slug:string(),url:string(),title:string(),teamId:string().nullable(),visibility:Visibility,passwordProtected:boolean(),latestVersionId:string().nullable(),lastPublishedAt:string().nullable(),context:object({boardIds:array(string()),selectionFingerprint:string().nullable(),contextKnown:boolean(),repo:string().nullable(),branch:string().nullable()})}),PublishDestinationsResponseSchema=object({effectiveTeamId:string().nullable(),slots:array(PublishSlotSchema)}),LinkAudienceEntrySchema=object({type:_enum(["organization","team","account"]),id:string(),name:string().optional()}),LinkResponseSchema=object({slug:string(),visibility:Visibility.optional(),passwordProtected:boolean().optional(),audience:array(LinkAudienceEntrySchema).optional(),publicComments:boolean().optional()}),LinkAccessResponseSchema=object({visibility:Visibility,passwordProtected:boolean(),audience:array(LinkAudienceEntrySchema).optional(),publicComments:boolean().optional()}),VersionUploadResponseSchema=object({files:number(),bytes:number(),url:string(),tier:string().optional(),history:object({retained:boolean(),versions:number(),pruned:number()}).optional()}),PublishedDesignSchema=object({slug:string(),title:string().nullable(),url:string(),visibility:Visibility,passwordProtected:boolean(),canManage:boolean(),mine:boolean(),ownerEmail:string().nullable().optional(),ownerName:string().nullable().optional(),teamName:string().nullable().optional(),audience:array(LinkAudienceEntrySchema).optional(),publicComments:boolean().optional(),guestCount:number().optional(),git:object({repo:string().optional(),branch:string().optional()}).nullable().optional(),published:boolean(),lastPublishedAt:string().nullable()}),PublishedDesignsResponseSchema=object({links:array(PublishedDesignSchema).optional()}),TeamSchema=object({id:string(),name:string(),isDefault:boolean().optional(),role:string().optional(),canPublish:boolean().optional(),canManage:boolean().optional()}),TeamsResponseSchema=object({teams:array(TeamSchema)}),GuestSchema=object({id:string(),name:string().nullable(),email:string().optional(),createdAt:string(),lastSeenAt:string().nullable(),linkExpiresAt:string().nullable().optional()}),GuestsResponseSchema=object({guests:array(GuestSchema)}),GuestInviteResponseSchema=object({guest:GuestSchema,delivery:object({sent:boolean(),reason:string().optional()}),guestUrl:string().optional()}),GuestLinkResponseSchema=object({guestUrl:string()}),DeviceCodeResponseSchema=object({device_code:string(),user_code:string(),verification_uri:string(),verification_uri_complete:string(),expires_in:number(),interval:number()}),DeviceTokenResponseSchema=object({access_token:string().optional(),error:string().optional(),error_description:string().optional()}),CliTokenResponseSchema=object({token:string(),email:string()}),IntentPriceSchema=object({intent:string(),summary:string(),priceMicros:number(),output:_enum(["image","svg"]),aspects:array(string()),defaultAspect:string(),reference:_enum(["forbidden","optional","required"])}),IntentCatalogResponseSchema=object({intents:array(IntentPriceSchema),maxCount:number().optional()}),GeneratedAssetPayloadSchema=object({kind:_enum(["image","svg"]),dataUrl:string()}),GenerateResponseSchema=object({id:string(),intent:string().optional(),chargedMicros:number(),balanceMicros:number(),assets:array(GeneratedAssetPayloadSchema).min(1).optional(),kind:_enum(["image","svg"]).optional(),dataUrl:string().optional()}).transform((r,ctx)=>{let assets=r.assets??(r.dataUrl&&r.kind?[{kind:r.kind,dataUrl:r.dataUrl}]:null);if(!assets)return ctx.addIssue({code:"custom",message:"no assets in the generation reply"}),NEVER;return{id:r.id,intent:r.intent??"",assets,chargedMicros:r.chargedMicros,balanceMicros:r.balanceMicros}}),FeedbackIssuerResponseSchema=object({scheme:string(),publicKey:string()}),FeedbackSignaturesResponseSchema=object({signatures:array(string())});var ACTIVITY_EVENT_TYPE="activity",SocketFrameSchema=union([object({type:literal("screen-changed"),screenId:string().min(1)}),object({type:literal("board-changed"),boardId:string().min(1)}),object({type:literal("theme-changed")}),object({type:literal("snippet-changed"),snippetId:string().min(1)}),object({type:literal("annotations-changed"),screenId:string().min(1)}),object({type:literal("notes-changed"),boardId:string().min(1)}),object({type:literal("comments-changed"),boardId:string().min(1),scope:_enum(["local","shared"])}),object({type:literal("config-changed")}),object({type:literal("folder-reloaded")}),object({type:literal("reload-error"),source:string(),message:string()}),object({type:literal(ACTIVITY_EVENT_TYPE)}).loose()]);var CLOUD_ERROR_CODES=["bad_request","unauthorized","sign_in_required","insufficient_credits","forbidden","not_found","conflict","payload_too_large","unsupported_media_type","rate_limited","generation_failed","billing_upstream","unavailable","storage_unavailable","internal"];function isCloudErrorCode(value){return typeof value==="string"&&CLOUD_ERROR_CODES.includes(value)}var unreachable=(error,opts={})=>({kind:"Unreachable",detail:error instanceof Error?error.message:String(error),...opts.url!==void 0?{url:opts.url}:{},...opts.timedOut?{timedOut:!0}:{}}),httpFailure=(operation,status,detail,code)=>({kind:"HttpFailure",operation,status,detail:detail&&detail.length>0?detail:"unknown",...code!==void 0?{code}:{}}),loggedOut=(detail)=>detail===void 0?{kind:"LoggedOut"}:{kind:"LoggedOut",detail},protocolViolation=(detail)=>({kind:"ProtocolViolation",detail}),uploadRaceLost=()=>({kind:"UploadRaceLost"}),insecureCloudUrl=(url)=>({kind:"InsecureCloudUrl",url}),invalidRequest=(detail)=>({kind:"InvalidRequest",detail});async function readFailure(res){let body=await res.json().catch(()=>{return});if(!body||typeof body!=="object")return{detail:"unknown"};let{message,error}=body,detail=typeof message==="string"&&message.length>0?message:"unknown";return isCloudErrorCode(error)?{detail,code:error}:{detail}}function cloudFailure(operation,status,detail,code){if(status!==401&&code!=="unauthorized")return httpFailure(operation,status,detail,code);return loggedOut(detail&&detail.length>0&&detail!=="unknown"?`velloo-cloud rejected the stored credential (${detail})`:"velloo-cloud rejected the stored credential")}async function httpFailureFrom(operation,res){let{detail,code}=await readFailure(res);return cloudFailure(operation,res.status,detail,code)}function boardLimitFrom(error){if(error.kind!=="HttpFailure"||error.status!==403)return null;let match=/\bthe (\w+) plan is limited to (\d+) active cloud boards\b/.exec(error.detail);if(!match?.[1]||!match[2])return null;return{tier:match[1],limit:Number(match[2])}}function describeBoardLimit({tier,limit}){return`the ${tier} plan keeps ${limit} board${limit===1?"":"s"} published at a time \u2014 take one down to publish another`}var serverTrouble=(status)=>status>=500?" \u2014 the cloud is having trouble; check its status or try again later":"";function describeCloudError(error){switch(error.kind){case"Unreachable":{let target=error.url?`cannot reach ${error.url}`:"cannot reach the cloud";return error.timedOut?`${target} \u2014 timed out (${error.detail}); check your connection and try again`:`${target} (${error.detail}) \u2014 check your connection and try again`}case"HttpFailure":return`${error.operation} failed (${error.status}): ${error.detail}${serverTrouble(error.status)}`;case"LoggedOut":return error.detail?`${error.detail} \u2014 run \`velloo login\``:"you are signed out \u2014 run `velloo login`";case"ProtocolViolation":return`${error.detail} \u2014 this is a bug; please report it`;case"UploadRaceLost":return"upload confirmation was lost and the retry found the publish slot changed \u2014 "+"the publish may have succeeded; check your published boards before retrying";case"InsecureCloudUrl":return`refusing to send credentials to ${error.url} over an insecure connection`;case"InvalidRequest":return error.detail;default:{let exhaustive=error;return"the cloud request failed"}}}function ok(value){return{ok:!0,value}}function err(error){return{ok:!1,error}}function map(r,fn){return r.ok?ok(fn(r.value)):r}async function tryCatchAsync(fn,onError){try{return ok(await fn())}catch(thrown){return err(onError(thrown))}}function*$(r){if(!r.ok)throw yield r,Error("unreachable: generator resumed after err");return r.value}async function DoAsync(gen){let iter=gen(),step=await iter.next();while(!step.done){let r=step.value;if(!r.ok)return r;step=await iter.next(r.value)}return ok(step.value)}async function cloudJson(res,schema,operation){let body;try{body=await res.json()}catch(error){return err(protocolViolation(`${operation}: the cloud's response was not JSON (${error instanceof Error?error.message:String(error)})`))}let parsed=schema.safeParse(body);if(!parsed.success)return err(protocolViolation(`${operation}: the cloud's response did not match the protocol`));return ok(parsed.data)}async function cloudFetch(url,schema,opts){let{operation,token,timeoutMs,...init}=opts,res;try{res=await fetch(url,{...init,headers:{...token!==void 0?{authorization:`Bearer ${token}`}:{},...init.headers},...timeoutMs!==void 0?{signal:AbortSignal.timeout(timeoutMs)}:{}})}catch(error){let timedOut=error instanceof Error&&error.name==="TimeoutError";return err(unreachable(error,{url,...timedOut?{timedOut:!0}:{}}))}if(!res.ok)return err(await httpFailureFrom(operation,res));return cloudJson(res,schema,operation)}var PathArraySchema=array(number()),IdLocatorSchema=string().regex(/^@[a-zA-Z][a-zA-Z0-9_-]*$/,{message:"id locator must match /^@[a-zA-Z][a-zA-Z0-9_-]*$/"}),jsonTolerant=(schema)=>preprocess((v)=>{if(typeof v==="string"){let t=v.trim();if(t.startsWith("[")||t.startsWith("{"))try{return JSON.parse(t)}catch{}}return v},schema),singularTolerant=(schema)=>preprocess((v)=>typeof v==="object"&&v!==null&&!Array.isArray(v)?[v]:v,schema),LocatorSchema=jsonTolerant(union([PathArraySchema,IdLocatorSchema])).describe('Node address: an "@id" like "@hero-cta", or an index path from the root ([0,2,1])'),LocatorOrRootSchema=LocatorSchema.default([]),InnerPathSchema=string().describe('Body node: "@id" (preferred \u2014 survives restructures), a dotted index path ("0.2"), or "" for the root'),PatchRecordSchema=record(string(),unknown());var invalid=(message,issues)=>issues===void 0?{ok:!1,message}:{ok:!1,message,issues},ScreenId=string().min(1),BoardId=string().min(1),FrameId=string().min(1),SnippetId=string().min(1),FramePatchSchema=strictObject({x:number().optional(),y:number().optional(),w:number().int().positive().optional(),h:number().int().positive().optional(),label:string().nullable().optional(),group:string().nullable().optional(),scheme:FrameSchemeSchema.nullable().optional()}),EmitAsSchema=object({name:string().min(1),importPath:string().min(1)}).describe("Mark the node a host-component facade: the canvas renders the subtree, emit_code emits <name /> from importPath instead."),AnnotationPositionSchema=union([object({x:number(),y:number()}),literal("auto")]),addNodeShape={screenId:ScreenId,parentPath:LocatorOrRootSchema,componentRef:string().min(1),id:NodeIdSchema.optional(),props:PatchRecordSchema.optional(),children:jsonTolerant(union([array(NodeSchema),string(),number()])).optional(),index:number().int().nonnegative().optional(),emitAs:EmitAsSchema.optional(),repo:RepoComponentRefSchema.optional().describe("Place an app component by identity (importPath + exportName [+ member]) when it isn't in list_components' repo catalog yet")},AddNodeBody=strictObject(addNodeShape);function normalizeAddNode(input){let{children,...rest}=input;if(typeof children==="string"||typeof children==="number")return invalid("add_node: `children` must be an array of nodes.",[{code:"invalid_type",expected:"array",path:["children"]}]);let props=input.props;return{ok:!0,args:{...rest,...props===void 0?{}:{props},...children===void 0?{}:{children}}}}var StylePayloadSchema=jsonTolerant(union([string(),PatchRecordSchema,_null()])).describe("Native style channel: a className string (Tailwind), an object of properties (sx / style), or null to clear"),PropsPatchEntrySchema=object({path:LocatorSchema,propPatch:PatchRecordSchema.optional(),style:StylePayloadSchema.optional()}).refine((e)=>e.propPatch!==void 0||e.style!==void 0,{message:"each patch needs propPatch, style, or both"}),GestureSchema=string().max(64).optional().describe("Opaque id of the drag this write belongs to; merges its undo steps into one"),updatePropsShape={screenId:ScreenId,patches:jsonTolerant(singularTolerant(array(PropsPatchEntrySchema).min(1))).describe("One entry per node; length 1 for a single edit"),gesture:GestureSchema},UpdatePropsBody=strictObject(updatePropsShape),applyClassesShape={screenId:ScreenId,path:LocatorOrRootSchema,classes:string(),gesture:GestureSchema},ApplyClassesBody=strictObject(applyClassesShape),removeNodeShape={screenId:ScreenId,path:LocatorSchema},RemoveNodeBody=strictObject(removeNodeShape),moveNodeShape={screenId:ScreenId,fromPath:LocatorSchema,toParent:LocatorSchema,toIndex:number().int().nonnegative().optional()},MoveNodeBody=strictObject(moveNodeShape),setNodeIdShape={screenId:ScreenId,path:LocatorSchema,id:NodeIdSchema.nullable()},SetNodeIdBody=strictObject(setNodeIdShape),RoutePath=string().trim().min(1).transform((value)=>value.startsWith("/")?value:`/${value}`),addScreenShape={name:string().min(1),id:string().min(1).optional(),fromScreenId:string().min(1).optional(),tree:NodeSchema.optional(),route:RoutePath.optional()},AddScreenBody=strictObject(addScreenShape),removeScreenShape={screenId:ScreenId},RemoveScreenBody=strictObject(removeScreenShape),setScreenTreeShape={screenId:ScreenId,tree:NodeSchema},SetScreenTreeBody=strictObject(setScreenTreeShape),updateScreenShape={screenId:ScreenId,patch:object({name:string().min(1).optional(),route:RoutePath.nullable().optional()})},UpdateScreenBody=strictObject(updateScreenShape),addBoardShape={name:string().min(1).max(MAX_BOARD_NAME_LENGTH),id:string().min(1).optional(),group:string().min(1).optional()},AddBoardBody=strictObject(addBoardShape),updateBoardShape={boardId:BoardId,patch:object({name:string().min(1).max(MAX_BOARD_NAME_LENGTH).optional(),theme:string().min(1).nullable().optional(),archived:boolean().optional(),group:string().min(1).nullable().optional()})},UpdateBoardBody=strictObject(updateBoardShape),removeBoardShape={boardId:BoardId},RemoveBoardBody=strictObject(removeBoardShape),reorderBoardsShape={order:array(string().min(1))},ReorderBoardsBody=strictObject(reorderBoardsShape),addBoardGroupShape={name:string().min(1),color:string().min(1).optional()},AddBoardGroupBody=strictObject(addBoardGroupShape),updateBoardGroupShape={groupId:string().min(1),patch:object({name:string().min(1).optional(),color:string().min(1).nullable().optional()})},UpdateBoardGroupBody=strictObject(updateBoardGroupShape),removeBoardGroupShape={groupId:string().min(1)},RemoveBoardGroupBody=strictObject(removeBoardGroupShape),reorderBoardGroupsShape={order:array(string().min(1))},ReorderBoardGroupsBody=strictObject(reorderBoardGroupsShape),addFrameShape={boardId:BoardId,screenId:ScreenId,x:number().optional(),y:number().optional(),w:number().int().positive(),h:number().int().positive(),label:string().optional(),group:string().optional(),id:string().min(1).optional()},AddFrameBody=strictObject(addFrameShape),FramePatchEntrySchema=preprocess((v)=>{if(typeof v!=="object"||v===null||Array.isArray(v)||"patch"in v)return v;let{frameId,...patch}=v;return Object.keys(patch).length>0?{frameId,patch}:v},object({frameId:FrameId,patch:FramePatchSchema})),updateFrameShape={boardId:BoardId,patches:jsonTolerant(singularTolerant(array(FramePatchEntrySchema).min(1))).describe("One entry per frame; length 1 for a single edit")},UpdateFrameBody=strictObject(updateFrameShape),removeFrameShape={boardId:BoardId,frameId:FrameId},RemoveFrameBody=strictObject(removeFrameShape),moveFrameShape={boardId:BoardId,frameId:FrameId,toBoardId:BoardId,x:number().optional(),y:number().optional()},MoveFrameBody=strictObject(moveFrameShape),addSnippetShape={name:string().min(1),id:string().min(1).optional(),params:array(SnippetParamSchema).default([]),tree:NodeSchema},AddSnippetBody=strictObject(addSnippetShape),updateSnippetShape={snippetId:SnippetId,patch:object({name:string().min(1).optional(),params:array(SnippetParamSchema).optional(),tree:NodeSchema.optional(),innerPatch:object({innerPath:InnerPathSchema,propPatch:PatchRecordSchema}).optional()})},UpdateSnippetBody=strictObject(updateSnippetShape),removeSnippetShape={snippetId:SnippetId},RemoveSnippetBody=strictObject(removeSnippetShape),instantiateSnippetShape={screenId:ScreenId,parentPath:LocatorOrRootSchema,snippetId:SnippetId,id:NodeIdSchema.optional(),args:PatchRecordSchema.optional(),extraClassName:string().optional().describe("One-off classes layered onto the snippet body's root, for this instance"),overrides:record(string(),object({props:PatchRecordSchema})).optional(),index:number().int().nonnegative().optional()},InstantiateSnippetBody=strictObject(instantiateSnippetShape),overrideSnippetPropsShape={screenId:ScreenId,path:LocatorSchema,innerPath:InnerPathSchema,propPatch:PatchRecordSchema},OverrideSnippetPropsBody=strictObject(overrideSnippetPropsShape),updateSnippetArgsShape={screenId:ScreenId,path:LocatorSchema,argPatch:PatchRecordSchema.default({}),extraClassName:string().nullable().optional(),gesture:GestureSchema},UpdateSnippetArgsBody=strictObject(updateSnippetArgsShape),updateSnippetInstanceShape={screenId:ScreenId,path:LocatorSchema,argPatch:PatchRecordSchema.optional(),extraClassName:string().nullable().optional(),innerPath:InnerPathSchema.optional(),propPatch:PatchRecordSchema.optional()},UpdateSnippetInstanceBody=strictObject(updateSnippetInstanceShape);function normalizeUpdateSnippetInstance(input){let wantsArgs=input.argPatch!==void 0||input.extraClassName!==void 0,hasInner=input.innerPath!==void 0,hasPatch=input.propPatch!==void 0;if(hasInner!==hasPatch)return invalid("update_snippet_instance: innerPath and propPatch go together.");if(!wantsArgs&&!hasInner)return invalid("update_snippet_instance: pass argPatch, extraClassName, or innerPath+propPatch.");let plan={};if(wantsArgs)plan.args={screenId:input.screenId,path:input.path,argPatch:input.argPatch??{},...input.extraClassName!==void 0?{extraClassName:input.extraClassName}:{}};if(hasInner&&input.innerPath!==void 0&&input.propPatch!==void 0)plan.override={screenId:input.screenId,path:input.path,innerPath:input.innerPath,propPatch:input.propPatch};return{ok:!0,args:plan}}var addAnnotationShape={screenId:ScreenId,target:object({locator:LocatorSchema}),body:string(),position:AnnotationPositionSchema.optional(),collapsed:boolean().optional()},AddAnnotationBody=strictObject(addAnnotationShape),updateAnnotationShape={screenId:ScreenId,annotationId:string().min(1),patch:object({body:string().optional(),position:AnnotationPositionSchema.optional(),collapsed:boolean().nullable().optional()})},UpdateAnnotationBody=strictObject(updateAnnotationShape),removeAnnotationShape={screenId:ScreenId,annotationId:string().min(1)},RemoveAnnotationBody=strictObject(removeAnnotationShape),NoteAttachmentSchema=object({frameId:FrameId,screenId:ScreenId,locator:LocatorSchema}),addNoteShape={boardId:BoardId,x:number().optional(),y:number().optional(),width:number().positive().optional(),body:string(),attachment:NoteAttachmentSchema.optional()},AddNoteBody=object(addNoteShape).refine((a)=>a.attachment!==void 0||a.x!==void 0&&a.y!==void 0,{message:"A note without an attachment needs x and y",path:["x"]}),updateNoteShape={boardId:BoardId,noteId:string().min(1),patch:object({x:number().optional(),y:number().optional(),width:number().positive().optional(),body:string().optional()})},UpdateNoteBody=strictObject(updateNoteShape),removeNoteShape={boardId:BoardId,noteId:string().min(1)},RemoveNoteBody=strictObject(removeNoteShape),updateViewportPresetsShape={presets:array(object({name:string().min(1),w:number().int().positive(),h:number().int().positive()}))},UpdateViewportPresetsBody=strictObject(updateViewportPresetsShape),updateDefaultsShape={defaultBoard:string().min(1).nullable().optional(),defaultScreen:string().min(1).nullable().optional()},UpdateDefaultsBody=strictObject(updateDefaultsShape),updateCodegenShape={componentsAlias:string().nullable().optional()},UpdateCodegenBody=strictObject(updateCodegenShape),updateDesignNameShape={name:string()},UpdateDesignNameBody=strictObject(updateDesignNameShape),updateFeedbackShape={enabled:boolean().optional(),contactOk:boolean().optional()},UpdateFeedbackBody=strictObject(updateFeedbackShape);export{ok,err,map,tryCatchAsync,$,DoAsync,isCloudErrorCode,AuthConfigResponseSchema,HealthResponseSchema,AccountResponseSchema,protectedSharesAllowed,PROTECTED_SHARES_UNAVAILABLE,teamOnlyAllowed,GUESTS_UNAVAILABLE,PublishDestinationsResponseSchema,LinkResponseSchema,LinkAccessResponseSchema,VersionUploadResponseSchema,PublishedDesignsResponseSchema,TeamsResponseSchema,GuestsResponseSchema,GuestInviteResponseSchema,GuestLinkResponseSchema,DeviceCodeResponseSchema,DeviceTokenResponseSchema,CliTokenResponseSchema,IntentCatalogResponseSchema,GenerateResponseSchema,FeedbackIssuerResponseSchema,FeedbackSignaturesResponseSchema,unreachable,loggedOut,protocolViolation,uploadRaceLost,insecureCloudUrl,invalidRequest,readFailure,cloudFailure,httpFailureFrom,boardLimitFrom,describeBoardLimit,describeCloudError,cloudJson,cloudFetch,LocatorSchema,AddNodeBody,normalizeAddNode,updatePropsShape,UpdatePropsBody,ApplyClassesBody,removeNodeShape,RemoveNodeBody,moveNodeShape,MoveNodeBody,setNodeIdShape,SetNodeIdBody,addScreenShape,AddScreenBody,removeScreenShape,RemoveScreenBody,SetScreenTreeBody,updateScreenShape,addBoardShape,AddBoardBody,updateBoardShape,UpdateBoardBody,removeBoardShape,RemoveBoardBody,reorderBoardsShape,ReorderBoardsBody,AddBoardGroupBody,UpdateBoardGroupBody,RemoveBoardGroupBody,ReorderBoardGroupsBody,addFrameShape,AddFrameBody,updateFrameShape,UpdateFrameBody,removeFrameShape,RemoveFrameBody,MoveFrameBody,addSnippetShape,AddSnippetBody,updateSnippetShape,UpdateSnippetBody,removeSnippetShape,RemoveSnippetBody,InstantiateSnippetBody,UpdateSnippetArgsBody,updateSnippetInstanceShape,UpdateSnippetInstanceBody,normalizeUpdateSnippetInstance,AddAnnotationBody,UpdateAnnotationBody,RemoveAnnotationBody,AddNoteBody,UpdateNoteBody,RemoveNoteBody,updateViewportPresetsShape,UpdateViewportPresetsBody,UpdateDefaultsBody,UpdateCodegenBody,UpdateDesignNameBody,UpdateFeedbackBody};
package/chunk-nc5k1ez4.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import"./chunk-nte0t7v3.js";import{signInRequired,boardLimitReached,topUpTokens,createServer}from"./chunk-egccxmed.js";import{ok,err,GUESTS_UNAVAILABLE,GuestsResponseSchema,GuestInviteResponseSchema,GuestLinkResponseSchema,unreachable,httpFailureFrom,boardLimitFrom,describeCloudError,cloudFetch}from"./chunk-gsne0ap4.js";import"./chunk-c4fym47a.js";import{loadCredential,saveCredential,deleteCredential,fetchAccount,revokeCredential,performDeviceLogin}from"./chunk-njhdn9j0.js";import{listPublishedDesigns,unpublishDesign,listPublishDestinations,describePublishError,PUBLISH_VIEWPORT,gitContext,publishableTeams,resolvePublishTeam,listTeams,publishDesign}from"./chunk-8g5ghy46.js";import{TOOL_VERSION}from"./chunk-q4d60wr3.js";import{updateStatus,upgradeInstalledVelloo}from"./chunk-tkvb3wb8.js";import{assertLoopbackHost,daemonRoot,writeLock,removeLock,readRememberedPort,rememberPort,portCandidates,registryUpsert,registryRemove}from"./chunk-1tdh4h14.js";import{defaultCloudUrl,fetchCloudAppUrl}from"./chunk-25j8vgpa.js";import{defineCommand}from"./chunk-2smsg2ct.js";import{existsSync as existsSync2}from"fs";import{existsSync}from"fs";import{dirname,join}from"path";import{fileURLToPath}from"url";var here=dirname(fileURLToPath(import.meta.url));function resolveCanvasDist(){let devLayout=join(here,"..","dist");return[process.env.VELLOO_CANVAS_DIST,join(here,"canvas"),devLayout].filter((p)=>Boolean(p)).find((p)=>existsSync(join(p,"index.html")))??devLayout}var canvasDistPath=resolveCanvasDist();var ACCOUNT_TTL_MS=60000,ACCOUNT_TIMEOUT_MS=5000;function createCanvasAuth(cloudUrl,dependencies={}){let runDeviceLogin=dependencies.performDeviceLogin??performDeviceLogin,login={state:"idle"},pending=null,cached=null,cachedApp=null,describe=async(token,email)=>{if(cached&&cached.token===token&&Date.now()-cached.at<ACCOUNT_TTL_MS)return{account:cached.account,verified:cached.verified};let found=await fetchAccount(cloudUrl,token,ACCOUNT_TIMEOUT_MS),resolved=found.status==="ok"?{account:found.account,verified:!0}:{account:{email},verified:found.status==="rejected"?!1:null};return cached={token,at:Date.now(),...resolved},resolved},resolveAppUrl=async()=>{if(cachedApp&&Date.now()-cachedApp.at<ACCOUNT_TTL_MS)return cachedApp.url;let url=await fetchCloudAppUrl(cloudUrl,ACCOUNT_TIMEOUT_MS);return cachedApp={at:Date.now(),url},url},status=async()=>{let cred=await loadCredential(cloudUrl),appUrlP=resolveAppUrl();if(!cred?.token)return{loggedIn:!1,cloudUrl,appUrl:await appUrlP,verified:null,login};let[{account,verified},appUrl]=await Promise.all([describe(cred.token,cred.email),appUrlP]);return{loggedIn:!0,cloudUrl,appUrl,verified,login,...account?{account}:{}}};return{status,async beginLogin(){if(login.state==="pending")return status();let attempt=new AbortController;pending=attempt,login={state:"idle"};let settle=()=>{},ready=new Promise((resolve)=>{settle=resolve});return runDeviceLogin(cloudUrl,({verificationUrl,userCode,expiresIn})=>{login={state:"pending",userCode,verificationUrl,expiresAt:new Date(Date.now()+expiresIn*1000).toISOString()},settle()},attempt.signal).then(async(result)=>{await saveCredential(cloudUrl,result),cached=null,login={state:"idle"},await topUpTokens({url:cloudUrl,token:result.token},10).catch(()=>{return})}).catch((err)=>{login=attempt.signal.aborted?{state:"idle"}:{state:"error",message:err instanceof Error?err.message:String(err)}}).finally(()=>{if(pending===attempt)pending=null;settle()}),await ready,status()},async cancelLogin(){pending?.abort(),pending=null,login={state:"idle"}},async logout(){pending?.abort(),pending=null,login={state:"idle"},cached=null;let stored=await loadCredential(cloudUrl);if(stored)await revokeCredential(cloudUrl,stored.token);await deleteCredential(cloudUrl)}}}var guestsUrl=({baseUrl,slug},rest="")=>`${baseUrl}/v1/links/${encodeURIComponent(slug)}/guests${rest}`,json=(body)=>({method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(body)});async function listGuests(target){let body=await cloudFetch(guestsUrl(target),GuestsResponseSchema,{operation:"listing guests",token:target.token});return body.ok?ok(body.value.guests):body}function inviteGuest(target,guest){return cloudFetch(guestsUrl(target),GuestInviteResponseSchema,{operation:"inviting a guest",token:target.token,...json({email:guest.email,...guest.name?{name:guest.name}:{}})})}function resendGuestLink(target,guestId){return cloudFetch(guestsUrl(target,`/${encodeURIComponent(guestId)}/resend`),GuestInviteResponseSchema,{operation:"resending a guest's link",token:target.token,...json({})})}async function mintGuestLink(target,guestId){let body=await cloudFetch(guestsUrl(target,`/${encodeURIComponent(guestId)}/link`),GuestLinkResponseSchema,{operation:"making a guest link",token:target.token,...json({})});return body.ok?ok(body.value.guestUrl):body}async function removeGuest(target,guestId){let res=await fetch(guestsUrl(target,`/${encodeURIComponent(guestId)}`),{method:"DELETE",headers:{authorization:`Bearer ${target.token}`}}).catch((error)=>error);if(!(res instanceof Response))return err(unreachable(res,{url:target.baseUrl}));if(!res.ok)return err(await httpFailureFrom("removing a guest",res));return ok(void 0)}function createCanvasPublish(cloudUrl,auth){let tokenFor=async()=>(await loadCredential(cloudUrl))?.token,access=async()=>{if(!await tokenFor())return{state:"signed-out"};return(await auth.status().catch(()=>null))?.verified===!1?{state:"expired"}:{state:"ready"}},rejection=(error)=>error.kind==="LoggedOut"?signInRequired("expired",describeCloudError(error)):Error(describeCloudError(error)),guestRejection=(error)=>error.kind==="HttpFailure"&&error.status===403&&/\bguests requires\b/.test(error.detail)?Error(GUESTS_UNAVAILABLE):rejection(error),guestTarget=async(slug)=>{let token=await tokenFor();if(!token)throw signInRequired("signed-out","not signed in to velloo-cloud");return{baseUrl:cloudUrl,token,slug}},settled=(result)=>{if(!result.ok)throw guestRejection(result.error);return result.value},publishedAt=(value)=>{let parsed=value?Date.parse(value):Number.NaN;return Number.isFinite(parsed)?parsed:Number.NEGATIVE_INFINITY},soleTeamId=async(token)=>{let listed=await listTeams(cloudUrl,token);if(!listed.ok)return null;let resolved=resolvePublishTeam(listed.value);return resolved.ok&&resolved.value.kind==="team"?resolved.value.team.id:null};return{access,async teams(){let token=await tokenFor();if(!token)return[];let listed=await listTeams(cloudUrl,token);return listed.ok?publishableTeams(listed.value):[]},async blocked(){let token=await tokenFor();if(!token)return null;let listed=await listTeams(cloudUrl,token);if(!listed.ok)return null;let resolved=resolvePublishTeam(listed.value);return!resolved.ok&&resolved.error.kind==="NoPublishableTeam"?describePublishError(resolved.error):null},async published(){let token=await tokenFor();if(!token)throw signInRequired("signed-out","not signed in to velloo-cloud");let listed=await listPublishedDesigns({baseUrl:cloudUrl,token});if(!listed.ok)throw rejection(listed.error);return listed.value.map((design)=>({slug:design.slug,title:design.title??"",url:design.url,visibility:design.visibility,passwordProtected:design.passwordProtected,canManage:design.canManage,lastPublishedAt:design.lastPublishedAt,...design.guestCount!==void 0?{guestCount:design.guestCount}:{},...design.visibility==="private"&&design.teamName&&design.audience?.some((entry)=>entry.type==="team")?{onlyTeam:design.teamName}:{}})).sort((left,right)=>publishedAt(right.lastPublishedAt)-publishedAt(left.lastPublishedAt))},async unpublish(slug){let token=await tokenFor();if(!token)throw signInRequired("signed-out","not signed in to velloo-cloud");let removed=await unpublishDesign({baseUrl:cloudUrl,token,slug});if(!removed.ok)throw rejection(removed.error)},guests:{async list(slug){return settled(await listGuests(await guestTarget(slug))).map(canvasGuest)},async invite(slug,guest){return canvasInvite(settled(await inviteGuest(await guestTarget(slug),guest)))},async resend(slug,guestId){return canvasInvite(settled(await resendGuestLink(await guestTarget(slug),guestId)))},async link(slug,guestId){return settled(await mintGuestLink(await guestTarget(slug),guestId))},async remove(slug,guestId){settled(await removeGuest(await guestTarget(slug),guestId))}},async destinations(host){let token=await tokenFor();if(!token)throw signInRequired("signed-out","not signed in to velloo-cloud");let provenance=gitContext(host.folder.root),folderId=host.folder.config.folderId;if(!folderId){let teams=await listTeams(cloudUrl,token);if(!teams.ok)throw rejection(teams.error);let publishable=publishableTeams(teams.value);return{effectiveTeamId:publishable.length===1?publishable[0]?.id??null:null,provenance,slots:[]}}let listed=await listPublishDestinations({baseUrl:cloudUrl,token,folderId});if(!listed.ok)throw rejection(listed.error);return{...listed.value,provenance}},async run(host,request,onProgress,onWarning){let token=await tokenFor();if(!token)throw signInRequired("signed-out","not signed in to velloo-cloud \u2014 sign in from the account menu first.");let teamOnlyId=request.teamOnly?request.teamId??await soleTeamId(token):null;if(request.teamOnly&&!teamOnlyId)throw Error("a team-only link needs a team to publish into \u2014 choose one");let step="start",message="starting",published=await publishDesign({baseUrl:cloudUrl,token},{folder:host.folder,providers:host.providers,defaultProvider:host.defaultProvider,snapshotCss:host.snapshotCss},{boardIds:request.boardIds,...request.title?{title:request.title}:{},visibility:teamOnlyId?"private":request.visibility,...request.password?{password:request.password}:{},destination:request.destination,...request.teamId?{teamId:request.teamId}:{},...teamOnlyId?{audience:[{type:"team",id:teamOnlyId}]}:{},...request.publicComments!==void 0?{publicComments:request.publicComments}:{},provenance:gitContext(host.folder.root),viewport:PUBLISH_VIEWPORT},(event)=>{if(event.kind==="warn"){onWarning(event.message);return}if(event.kind==="note"){onWarning(event.message);return}if(event.kind==="info")return;if(event.kind==="capture"){onProgress({step,message,capture:{done:event.done,total:event.total}});return}step=event.step,message=event.message,onProgress({step,message})});if(!published.ok){let reason=describePublishError(published.error);if(published.error.kind==="LoggedOut")throw signInRequired("expired",reason);let limit=published.error.kind==="HttpFailure"?boardLimitFrom(published.error):null;if(limit)throw boardLimitReached(limit,reason);throw Error(reason)}let outcome=published.value,teamAudience=outcome.audience?.find((entry)=>entry.type==="team");return{shareUrl:outcome.shareUrl,slug:outcome.slug,visibility:outcome.visibility,passwordProtected:outcome.passwordProtected,...teamAudience?{onlyTeam:teamAudience.name||"your team"}:{},files:outcome.files,bytes:outcome.bytes,screenshots:outcome.screenshots,boards:outcome.boards,screens:outcome.screens,created:outcome.created,...outcome.tier!==void 0?{tier:outcome.tier}:{},...outcome.history!==void 0?{history:outcome.history}:{}}}}}function canvasGuest(guest){return{id:guest.id,name:guest.name,...guest.email!==void 0?{email:guest.email}:{},createdAt:guest.createdAt,lastSeenAt:guest.lastSeenAt,linkExpiresAt:guest.linkExpiresAt??null}}function canvasInvite(invite){return{guest:canvasGuest(invite.guest),emailed:invite.delivery.sent,...invite.delivery.reason?{reason:invite.delivery.reason}:{},...invite.guestUrl?{guestUrl:invite.guestUrl}:{}}}function createCanvasUpdates(){return{async status(opts={}){let status=await updateStatus(opts);return{current:status.current,latest:status.latest,available:status.available,method:status.method,channel:status.channel,upgradable:status.upgradable,...status.reason===void 0?{}:{reason:status.reason}}},async upgrade(){let outcome=await upgradeInstalledVelloo();return{upgraded:outcome.upgraded,from:outcome.from,to:outcome.to,restartRequired:outcome.upgraded}}}}var IDLE_MS=300000;function portFree(port,host){try{return Bun.serve({port,hostname:host,fetch:()=>new Response("")}).stop(!0),!0}catch{return!1}}var daemon_default=defineCommand({meta:{name:"__daemon",hidden:!0,description:"(internal) Run the persistent canvas daemon. Spawned by `velloo run` / `velloo mcp`."},args:{folder:{type:"positional",required:!0,description:"Design folder (absolute)"},port:{type:"string",description:"Preferred canvas port"},host:{type:"string",description:"Bind hostname (default 127.0.0.1)"}},async run({args}){let root=daemonRoot(args.folder),host=args.host??"127.0.0.1";assertLoopbackHost(host);let cloudUrl=defaultCloudUrl(),cred=await loadCredential(cloudUrl),cloud={url:cloudUrl,token:cred?.token,resolveToken:async()=>(await loadCredential(cloudUrl))?.token},auth=createCanvasAuth(cloudUrl),publish=createCanvasPublish(cloudUrl,auth),updates=createCanvasUpdates(),canvasPort=portCandidates({explicit:args.port?Number(args.port):void 0,remembered:await readRememberedPort(root),root}).find((port)=>portFree(port,host))??0,handle;try{handle=await createServer({folder:root,port:canvasPort,host,mcp:{transport:"http",port:0},canvasDist:canvasDistPath,cloud,auth,publish,updates})}catch(err){if(canvasPort===0)throw err;handle=await createServer({folder:root,port:0,host,mcp:{transport:"http",port:0},canvasDist:canvasDistPath,cloud,auth,publish,updates})}let rec={root,pid:process.pid,canvasUrl:handle.url,canvasPort:handle.port,mcpUrl:handle.mcpUrl??"",mcpPort:handle.mcpPort??0,cloudUrl,version:TOOL_VERSION,startedAt:new Date().toISOString()};await writeLock(rec),await registryUpsert(rec),await rememberPort(root,handle.port).catch(()=>{return}),console.error(`velloo: canvas daemon up at ${handle.url} (mcp ${handle.mcpUrl}), pid ${process.pid}`);let stopped=!1,shutdown=async()=>{if(stopped)return;stopped=!0,removeLock(root),await registryRemove(root).catch(()=>{return}),await handle.close(),process.exit(0)};process.on("SIGTERM",shutdown),process.on("SIGINT",shutdown);let rootMissing=0;setInterval(()=>{if(existsSync2(root)){rootMissing=0;return}if(rootMissing+=1,rootMissing>=2)console.error(`velloo: design folder ${root} is gone \u2014 shutting down.`),shutdown()},1e4);let idleSince=Date.now();setInterval(()=>{let{canvas,mcp}=handle.connections();if(canvas+mcp>0){idleSince=null;return}if(idleSince===null){idleSince=Date.now();return}if(Date.now()-idleSince>=IDLE_MS)console.error("velloo: canvas idle for 5 min \u2014 shutting down."),shutdown()},30000),await new Promise(()=>{})}});export{daemon_default as default};
package/chunk-njhdn9j0.js DELETED
@@ -1,4 +0,0 @@
1
- // @bun
2
- import{AuthConfigResponseSchema,AccountResponseSchema,DeviceCodeResponseSchema,DeviceTokenResponseSchema,CliTokenResponseSchema,readFailure}from"./chunk-gsne0ap4.js";import{string,object,record,literal}from"./chunk-nte0t7v3.js";import{openUrl}from"./chunk-hggap8fq.js";import{isSecureCloudUrl,assertSecureCloudUrl}from"./chunk-25j8vgpa.js";import{chmod,mkdir,readFile,writeFile}from"fs/promises";import{homedir}from"os";import{dirname,join}from"path";var CloudCredentialSchema=object({token:string().min(1),email:string().min(1)}),CredentialsFileSchema=object({version:literal(1),clouds:record(string(),CloudCredentialSchema)}),credentialsPath=()=>process.env.VELLOO_CREDENTIALS_PATH??join(homedir(),".velloo","credentials.json"),normalizeCloudUrl=(url)=>url.replace(/\/+$/,"");async function readAll(){try{let parsed=CredentialsFileSchema.safeParse(JSON.parse(await readFile(credentialsPath(),"utf8")));if(parsed.success)return parsed.data}catch{}return{version:1,clouds:{}}}async function loadCredential(cloudUrl){return(await readAll()).clouds[normalizeCloudUrl(cloudUrl)]??null}async function listCredentials(){return(await readAll()).clouds}async function saveCredential(cloudUrl,cred){let all=await readAll();return all.clouds[normalizeCloudUrl(cloudUrl)]=cred,writeAll(all)}async function deleteCredential(cloudUrl){let all=await readAll(),key=normalizeCloudUrl(cloudUrl);if(!(key in all.clouds))return!1;return delete all.clouds[key],await writeAll(all),!0}async function clearCredentials(){let all=await readAll(),count=Object.keys(all.clouds).length;if(count===0)return 0;return await writeAll({version:1,clouds:{}}),count}async function writeAll(all){let path=credentialsPath();return await mkdir(dirname(path),{recursive:!0,mode:448}),await writeFile(path,`${JSON.stringify(all,null,2)}
3
- `,{mode:384}),await chmod(path,384),path}import{hostname}from"os";async function fetchAccount(cloudUrl,token,timeoutMs=8000){if(!isSecureCloudUrl(cloudUrl))return{status:"unreachable"};let res=await fetch(`${cloudUrl}/v1/me`,{headers:{authorization:`Bearer ${token}`},signal:AbortSignal.timeout(timeoutMs)}).catch(()=>null);if(!res)return{status:"unreachable"};if(res.status===401||res.status===403)return{status:"rejected"};if(!res.ok)return{status:"unreachable"};let parsed=AccountResponseSchema.safeParse(await res.json().catch(()=>null));if(!parsed.success)return{status:"unreachable"};let body=parsed.data;return{status:"ok",account:{email:body.email,...body.name?{name:body.name}:{},...body.tier?{tier:body.tier}:{},...body.creditMicros!==void 0?{creditMicros:body.creditMicros}:{}}}}async function verifyCredential(cloudUrl,token,timeoutMs=8000){let found=await fetchAccount(cloudUrl,token,timeoutMs);return found.status==="ok"?found.account.email:null}async function revokeCredential(cloudUrl,token,timeoutMs=5000){if(!isSecureCloudUrl(cloudUrl))return!1;return(await fetch(`${cloudUrl}/v1/auth/cli-token`,{method:"DELETE",headers:{authorization:`Bearer ${token}`},signal:AbortSignal.timeout(timeoutMs)}).catch(()=>null))?.ok??!1}var sleepCancelable=(ms,signal)=>new Promise((resolve,reject)=>{if(signal.aborted){reject(Error("cancelled"));return}let timer=setTimeout(resolve,ms);signal.addEventListener("abort",()=>{clearTimeout(timer),reject(Error("cancelled"))},{once:!0})});async function performDeviceLogin(cloudUrl,onPrompt,signal){assertSecureCloudUrl(cloudUrl);let configRes=await fetch(`${cloudUrl}/v1/auth/config`).catch(()=>null);if(!configRes?.ok)throw Error(`cannot reach ${cloudUrl} \u2014 is velloo-cloud up?`);let config=AuthConfigResponseSchema.safeParse(await configRes.json().catch(()=>null)),issuer=config.success?config.data.issuer:void 0,clientId=config.success?config.data.clientId:void 0;if(issuer===void 0||clientId===void 0)throw Error(`${cloudUrl} does not advertise a sign-in service \u2014 is velloo-cloud current?`);let codeRes=await fetch(`${issuer}/api/auth/device/code`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({client_id:clientId})}).catch(()=>null);if(!codeRes?.ok)throw Error(`the auth service at ${issuer} is not answering \u2014 is it up?`);let deviceBody=DeviceCodeResponseSchema.safeParse(await codeRes.json().catch(()=>null));if(!deviceBody.success)throw Error(`the auth service at ${issuer} answered something this velloo can't read`);let device=deviceBody.data;await onPrompt({verificationUrl:device.verification_uri_complete,userCode:device.user_code,expiresIn:device.expires_in}),openUrl(device.verification_uri_complete);let deadline=Date.now()+device.expires_in*1000,intervalMs=Math.max(1,device.interval)*1000,accessToken=null,abortSignal=signal??new AbortController().signal;while(Date.now()<deadline){await sleepCancelable(intervalMs,abortSignal);let res=await fetch(`${issuer}/api/auth/device/token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:device.device_code,client_id:clientId}),signal:abortSignal}),polled=DeviceTokenResponseSchema.safeParse(await res.json().catch(()=>({}))),body=polled.success?polled.data:{};if(body.access_token){accessToken=body.access_token;break}if(body.error==="authorization_pending")continue;if(body.error==="slow_down"){intervalMs+=5000;continue}throw Error(body.error_description??body.error??"device authorization failed")}if(!accessToken)throw Error("the sign-in code expired \u2014 run velloo login again");let label=hostname().trim().slice(0,80),exchangeRes=await fetch(`${cloudUrl}/v1/auth/cli-token`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({accessToken,...label?{label}:{}})});if(exchangeRes.status!==201){let{detail}=await readFailure(exchangeRes);throw Error(`token exchange failed (${exchangeRes.status}): ${detail}`)}let exchanged=CliTokenResponseSchema.safeParse(await exchangeRes.json().catch(()=>null));if(!exchanged.success)throw Error(`${cloudUrl} returned a sign-in token this velloo can't read`);return exchanged.data}
4
- export{normalizeCloudUrl,loadCredential,listCredentials,saveCredential,deleteCredential,clearCredentials,fetchAccount,verifyCredential,revokeCredential,performDeviceLogin};
package/chunk-q4d60wr3.js DELETED
@@ -1,3 +0,0 @@
1
- // @bun
2
- var package_default={name:"@velloo/cli",version:"0.4.0",license:"Apache-2.0",private:!0,type:"module",description:"Velloo CLI",bin:{velloo:"./src/cli.ts"},exports:{".":"./src/cli.ts"},engines:{bun:">=1.4.0"},scripts:{build:"bun run build.ts"},dependencies:{"@clack/prompts":"1.7.0","@velloo/canvas":"workspace:*","@velloo/codegen":"workspace:*","@velloo/protocol":"workspace:*","@velloo/provider":"workspace:*","@velloo/provider-antd":"workspace:*","@velloo/provider-chakra":"workspace:*","@velloo/provider-mui":"workspace:*","@velloo/provider-none":"workspace:*","@velloo/renderer":"workspace:*","@velloo/result":"workspace:*","@velloo/schema":"workspace:*","@velloo/server":"workspace:*","@velloo/shadcn-snapshot":"workspace:*",citty:"0.2.2",picocolors:"1.1.1",zod:"4.5.4"}};var PACKAGE_VERSION=package_default.version,TOOL_VERSION="0.4.0",BUILD_TIME_MS=1790259137747;
3
- export{PACKAGE_VERSION,TOOL_VERSION,BUILD_TIME_MS};
package/chunk-rsy246re.js DELETED
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{isCancel,select}from"./chunk-80fjfyha.js";import{closePooledBrowser}from"./chunk-c4fym47a.js";import"./chunk-nte0t7v3.js";import{writeText,findFrame,exportFilename,exportFramePng,exportBoardPng,exportFramePdf,exportBoardPdf,exportScreenHtml,exportScreenPng,exportScreenPdf,exportFrameHtml,exportBoardHtml,screensForExportTarget}from"./chunk-egccxmed.js";import"./chunk-gsne0ap4.js";import{fail}from"./chunk-s23gtejf.js";import{captureWithBrowserSetup}from"./chunk-2fgfex9b.js";import{confirmRenderFailures}from"./chunk-y0rwf1ze.js";import{loadPipeline}from"./chunk-7cktk5qr.js";import{withAssetServer}from"./chunk-0zen7bzb.js";import{DESIGN_ARG_DESCRIPTION,resolveDesign}from"./chunk-46xykc71.js";import{defineCommand}from"./chunk-2smsg2ct.js";import{extname,isAbsolute,resolve}from"path";var export_default=defineCommand({meta:{name:"export",description:"Export a screen, frame, or board as PNG, PDF, or standalone HTML (format = --to extension)"},args:{target:{type:"positional",required:!1,description:"Screen, frame, or board id. Omit to pick interactively."},design:{type:"string",description:DESIGN_ARG_DESCRIPTION},to:{type:"string",description:"Output path; extension picks the format (.png | .pdf | .html). Default: ./<target>.png"},mode:{type:"string",description:"light (default) | dark | compare (side-by-side light|dark; PNG, non-board only)"},scale:{type:"string",description:"PNG raster density (0.25\u20133; default 1; 2 = retina)"},theme:{type:"string",description:"Named theme to render with (default: the board's pin, else the folder default)"},w:{type:"string",description:"Viewport width for screen targets (default: first preset)"},h:{type:"string",description:"Viewport height for screen targets (default: first preset)"},yes:{type:"boolean",description:"Export even when a component fails to render (required without an interactive terminal)"}},async run({args}){let folder=await resolveDesign(args.design,"export",{designFlag:"--design"}),pipeline=await loadPipeline(folder),design=pipeline.design,mode=args.mode??"light";if(!["light","dark","compare"].includes(mode))fail("export",`--mode must be light, dark, or compare \u2014 got '${args.mode}'`);let scale=args.scale?Number(args.scale):1;if(!Number.isFinite(scale)||scale<0.25||scale>3)fail("export",`--scale must be between 0.25 and 3 \u2014 got '${args.scale}'`);let targetId=args.target;if(!targetId){let options=[...[...design.boards.values()].map((b)=>({value:b.id,label:b.name,hint:`board \xB7 ${b.frames.length} frame${b.frames.length===1?"":"s"}`})),...[...design.screens.values()].map((s)=>({value:s.id,label:s.name||s.id,hint:"screen"}))];if(options.length===0)fail("export",`nothing to export in ${folder}.`);if(!process.stdin.isTTY)fail("export",`pass a target: ${options.map((o)=>o.value).join(", ")} (boards and screens; frame ids work too)`);let chosen=await select({message:"Export what?",options});if(isCancel(chosen))fail("export","cancelled.");targetId=chosen}let screen=design.screens.get(targetId),framed=screen?null:findFrame(design,targetId),board=screen||framed?null:design.boards.get(targetId),kind=screen?"screen":framed?"frame":board?"board":null;if(!kind)fail("export",`no screen, frame, or board with id "${targetId}" in ${folder}. Boards: ${[...design.boards.keys()].join(", ")||"(none)"}; screens: ${[...design.screens.keys()].join(", ")||"(none)"}.`);let name=screen?.name||framed?.frame.label||(framed?design.screens.get(framed.frame.screen)?.name:void 0)||board?.name||targetId,outPath=args.to?isAbsolute(args.to)?args.to:resolve(args.to):resolve(exportFilename(name,"png")),ext=extname(outPath).toLowerCase().slice(1);if(ext!=="png"&&ext!=="pdf"&&ext!=="html")fail("export",`unsupported output extension ".${ext}" \u2014 use .png, .pdf, or .html.`);let format=ext;if(mode==="compare"&&(format!=="png"||kind==="board"))fail("export",'mode "compare" is PNG-only and not available for boards.');let preset=design.config.viewportPresets[0]??{name:"default",w:1440,h:900},viewport={w:args.w?Number(args.w):preset.w,h:args.h?Number(args.h):preset.h};await confirmRenderFailures("export",{folder:design,providers:pipeline.providers,defaultProvider:pipeline.defaultProvider},screensForExportTarget(design,kind,targetId),args.yes===!0);let opts={mode,scale,...args.theme?{theme:args.theme}:{}},assetOrigin,p={folder:design,providers:pipeline.providers,defaultProvider:pipeline.defaultProvider,snapshotCss:async()=>pipeline.snapshotCss,assetOrigin:()=>assetOrigin},produce=async()=>{if(kind==="screen"&&screen){if(format==="html"){let out=await exportScreenHtml(p,screen,{dark:mode==="dark",...args.theme?{theme:args.theme}:{},viewport});return{bytes:out.html,warnings:out.warnings}}if(format==="pdf")return{bytes:await exportScreenPdf(p,screen,{...opts,viewport}),warnings:[]};return{bytes:await exportScreenPng(p,screen,{...opts,viewport}),warnings:[]}}if(kind==="frame"&&framed){if(format==="html"){let out=await exportFrameHtml(p,framed.board,framed.frame,opts);return{bytes:out.html,warnings:out.warnings}}return{bytes:format==="pdf"?await exportFramePdf(p,framed.board,framed.frame,opts):await exportFramePng(p,framed.board,framed.frame,opts),warnings:[]}}if(!board)fail("export","internal: target resolution failed");if(format==="html"){let out=await exportBoardHtml(p,board,opts);return{bytes:out.html,warnings:out.warnings}}return{bytes:format==="pdf"?await exportBoardPdf(p,board,opts):await exportBoardPng(p,board,opts),warnings:[]}},result;try{if(format==="html")result=await produce();else await withAssetServer(folder,null,async(baseHref)=>{assetOrigin=baseHref,await captureWithBrowserSetup("export",async()=>{result=await produce()})})}finally{await closePooledBrowser()}if(!result)fail("export","capture produced no output");if(typeof result.bytes==="string")await writeText(outPath,result.bytes);else await Bun.write(outPath,result.bytes);console.log(`velloo export: wrote ${outPath} (${kind}=${targetId}, mode=${mode})`);for(let warning of result.warnings)console.log(` note: ${warning}`)}});export{export_default as default};
package/chunk-syg6k8m0.js DELETED
@@ -1,10 +0,0 @@
1
- // @bun
2
- import{ScreenSchema}from"./chunk-nte0t7v3.js";import{detectTailwindMajor,emitCode,moduleTarget,v3ClassIssues,classNamesInJsx,styleChannelOf,loadDesignFolder,hostAppRootFrom,resolveProviders}from"./chunk-egccxmed.js";import"./chunk-gsne0ap4.js";import"./chunk-c4fym47a.js";import"./chunk-80fjfyha.js";import{fail}from"./chunk-s23gtejf.js";import{findDesignConfig}from"./chunk-bhx8k09w.js";import{createProgress}from"./chunk-pjtg3wnm.js";import{DESIGN_ARG_DESCRIPTION,resolveDesign,pickScreen}from"./chunk-46xykc71.js";import{defineCommand}from"./chunk-2smsg2ct.js";import{readFile,writeFile}from"fs/promises";import{isAbsolute,resolve}from"path";import{stdout}from"process";async function folderEmitContext(screenPath,screen){let found=await findDesignConfig(screenPath);if(!found)return{};let design=await loadDesignFolder(found.folder),{providers,defaultProvider}=await resolveProviders(design.config,found.folder),provider=screen.library&&providers[screen.library]||defaultProvider,adapter=provider,target;if(adapter.codegenModule){let manifest=await provider.loadManifest();target=moduleTarget(manifest.filter((c)=>c.source!=="velloo").map((c)=>c.id),adapter.codegenModule)}let inlineStyle=styleChannelOf(provider,design.config.styling?.framework).kind==="style";return{snippets:design.snippets,...design.config.extensions?{extensions:design.config.extensions}:{},...target?{target}:{},...inlineStyle?{inlineStyle:!0}:{}}}var emit_default=defineCommand({meta:{name:"emit",description:"Print or write agent-consumed IR for a screen."},args:{screen:{type:"positional",required:!1,description:"Screen id, or a path to a screen JSON. Omit to pick interactively."},design:{type:"string",description:DESIGN_ARG_DESCRIPTION},to:{type:"string",description:"Write IR as JSON to this path. Omit to print the JSX body to stdout (agent-friendly when piped)."},"components-alias":{type:"string",description:'Override the import prefix the IR mentions in snippet identifiers. Defaults to .design/config.json#codegen.componentsAlias, else "@/components/ui".'}},async run({args}){let interactive=Boolean(process.stdin.isTTY),screenArg=args.screen,screenPath=!!screenArg&&(screenArg.includes("/")||screenArg.endsWith(".json"))?resolve(screenArg):(await pickScreen(await resolveDesign(args.design,"emit",{designFlag:"--design"}),screenArg,interactive,"emit")).path,screenJson=JSON.parse(await readFile(screenPath,"utf8")),screen=ScreenSchema.parse(screenJson),progress=createProgress();progress.start("preparing code");try{let componentsAlias=args["components-alias"]??await readConfigAlias(screenPath),context=await folderEmitContext(screenPath,screen);progress.step("generating code");let result=await emitCode(screen,{...componentsAlias?{componentsAlias}:{},...context});if(!result.ok){progress.fail("code generation failed");let e=result.error;if(e.kind==="UnknownComponent")fail("emit",`unknown component: ${JSON.stringify(e.ref)}`);else if(e.kind==="SnippetNotFound")fail("emit",`snippet not found: ${JSON.stringify(e.snippetId)}`);else fail("emit",`screen not found: ${JSON.stringify(e.screenId)}`)}let found=await findDesignConfig(screenPath),tailwindV3Compat=found&&!context?.target&&!context?.inlineStyle?detectTailwindMajor(hostAppRootFrom(found.folder,found.config.hostApp))===3?v3ClassIssues([...result.value.classesUsed,...result.value.snippetsUsed.flatMap((s)=>classNamesInJsx(s.jsx))]):[]:[];if(args.to){progress.step("writing code");let outPath=isAbsolute(args.to)?args.to:resolve(args.to),ir=tailwindV3Compat.length>0?{...result.value,tailwindV3Compat}:result.value;await writeFile(outPath,JSON.stringify(ir,null,2),"utf8"),progress.succeed("generated code"),console.log(`velloo emit: wrote ${outPath}`);return}if(progress.succeed("generated code"),stdout.write(`// screen: ${result.value.screen.id} (${result.value.screen.name})
3
- `),stdout.write(`// components: ${result.value.componentsUsed.join(", ")||"(none)"}
4
- `),result.value.iconsUsed.length>0)stdout.write(`// icons (lucide): ${result.value.iconsUsed.join(", ")}
5
- `);if(result.value.snippetsUsed.length>0)stdout.write(`// snippets: ${result.value.snippetsUsed.map((s)=>`${s.componentName}(${s.id})`).join(", ")}
6
- `);for(let issue of tailwindV3Compat)stdout.write(issue.v3?`// tailwind v3 host: \`${issue.class}\` \u2192 \`${issue.v3}\` (${issue.note})
7
- `:`// tailwind v3 host: \`${issue.class}\` \u2014 ${issue.note}
8
- `);stdout.write(`
9
- `),stdout.write(`${result.value.jsx}
10
- `)}catch(error){throw progress.fail("code generation failed"),error}}});async function readConfigAlias(screenPath){return(await findDesignConfig(screenPath))?.config.codegen?.componentsAlias}export{emit_default as default};