@voobase/cli 0.1.1-nonprod.2073 → 0.1.1-nonprod.2077

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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));var require_punycode=__commonJS({"../../node_modules/.pnpm/punycode.js@2.3.1/node_modules/punycode.js/punycode.js"(exports,module){"use strict";var regexPunycode=/^xn--/,regexNonASCII=/[^\0-\x7F]/,regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,errors={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=35,floor=Math.floor,stringFromCharCode=String.fromCharCode;function error(type){throw new RangeError(errors[type])}function map(array,callback){let result=[],length=array.length;for(;length--;)result[length]=callback(array[length]);return result}function mapDomain(domain,callback){let parts=domain.split("@"),result="";parts.length>1&&(result=parts[0]+"@",domain=parts[1]),domain=domain.replace(regexSeparators,".");let labels=domain.split("."),encoded=map(labels,callback).join(".");return result+encoded}function ucs2decode(string){let output=[],counter=0,length=string.length;for(;counter<length;){let value=string.charCodeAt(counter++);if(value>=55296&&value<=56319&&counter<length){let extra=string.charCodeAt(counter++);(extra&64512)==56320?output.push(((value&1023)<<10)+(extra&1023)+65536):(output.push(value),counter--)}else output.push(value)}return output}var ucs2encode=codePoints=>String.fromCodePoint(...codePoints),basicToDigit=function(codePoint){return codePoint>=48&&codePoint<58?26+(codePoint-48):codePoint>=65&&codePoint<91?codePoint-65:codePoint>=97&&codePoint<123?codePoint-97:36},digitToBasic=function(digit,flag){return digit+22+75*(digit<26)-((flag!=0)<<5)},adapt=function(delta,numPoints,firstTime){let k=0;for(delta=firstTime?floor(delta/700):delta>>1,delta+=floor(delta/numPoints);delta>baseMinusTMin*26>>1;k+=36)delta=floor(delta/baseMinusTMin);return floor(k+(baseMinusTMin+1)*delta/(delta+38))},decode2=function(input){let output=[],inputLength=input.length,i=0,n=128,bias=72,basic=input.lastIndexOf("-");basic<0&&(basic=0);for(let j=0;j<basic;++j)input.charCodeAt(j)>=128&&error("not-basic"),output.push(input.charCodeAt(j));for(let index=basic>0?basic+1:0;index<inputLength;){let oldi=i;for(let w=1,k=36;;k+=36){index>=inputLength&&error("invalid-input");let digit=basicToDigit(input.charCodeAt(index++));digit>=36&&error("invalid-input"),digit>floor((2147483647-i)/w)&&error("overflow"),i+=digit*w;let t=k<=bias?1:k>=bias+26?26:k-bias;if(digit<t)break;let baseMinusT=36-t;w>floor(2147483647/baseMinusT)&&error("overflow"),w*=baseMinusT}let out=output.length+1;bias=adapt(i-oldi,out,oldi==0),floor(i/out)>2147483647-n&&error("overflow"),n+=floor(i/out),i%=out,output.splice(i++,0,n)}return String.fromCodePoint(...output)},encode2=function(input){let output=[];input=ucs2decode(input);let inputLength=input.length,n=128,delta=0,bias=72;for(let currentValue of input)currentValue<128&&output.push(stringFromCharCode(currentValue));let basicLength=output.length,handledCPCount=basicLength;for(basicLength&&output.push("-");handledCPCount<inputLength;){let m=2147483647;for(let currentValue of input)currentValue>=n&&currentValue<m&&(m=currentValue);let handledCPCountPlusOne=handledCPCount+1;m-n>floor((2147483647-delta)/handledCPCountPlusOne)&&error("overflow"),delta+=(m-n)*handledCPCountPlusOne,n=m;for(let currentValue of input)if(currentValue<n&&++delta>2147483647&&error("overflow"),currentValue===n){let q=delta;for(let k=36;;k+=36){let t=k<=bias?1:k>=bias+26?26:k-bias;if(q<t)break;let qMinusT=q-t,baseMinusT=36-t;output.push(stringFromCharCode(digitToBasic(t+qMinusT%baseMinusT,0))),q=floor(qMinusT/baseMinusT)}output.push(stringFromCharCode(digitToBasic(q,0))),bias=adapt(delta,handledCPCountPlusOne,handledCPCount===basicLength),delta=0,++handledCPCount}++delta,++n}return output.join("")},toUnicode=function(input){return mapDomain(input,function(string){return regexPunycode.test(string)?decode2(string.slice(4).toLowerCase()):string})},toASCII=function(input){return mapDomain(input,function(string){return regexNonASCII.test(string)?"xn--"+encode2(string):string})},punycode2={version:"2.3.1",ucs2:{decode:ucs2decode,encode:ucs2encode},decode:decode2,encode:encode2,toASCII,toUnicode};module.exports=punycode2}});import{existsSync as existsSync28,readFileSync as readFileSync29}from"node:fs";import{resolve as resolve19}from"node:path";import process7 from"node:process";async function batchUpdateTenantCmsItems(args){let collection=args.payload.collection.trim(),itemIds=Array.from(new Set(args.payload.item_ids.map(itemId=>itemId.trim()).filter(Boolean))),tagAdds=dedupeTags(args.payload.changes.tags.add),discover=await args.sdk.discoverTenantCmsCollection(collection),schemaSpec=discover.active_schema??discover.draft_schema;if(!schemaSpec)throw new Error(`Collection \`${collection}\` \u5F53\u524D\u6CA1\u6709\u53EF\u7528 schema\u3002`);let succeeded=[],failed=[];for(let itemId of itemIds){let title=itemId;try{let item=await args.sdk.getTenantCmsItem({collection,id:itemId});title=resolveCmsItemTitle(item);let currentStatus=item.system.publish_status??"draft",targetStatus=args.payload.changes.publish_status.mode==="set"?args.payload.changes.publish_status.value:void 0,hasCategoryChange=args.payload.changes.category.mode!=="keep",hasTagChange=tagAdds.length>0,hasMetadataChange=hasCategoryChange||hasTagChange,effectiveStatus=currentStatus;if(hasMetadataChange){currentStatus==="archived"&&targetStatus&&targetStatus!=="archived"&&(await args.sdk.applyTenantCmsPublish({collection,item_id:itemId,target_status:targetStatus}),effectiveStatus=targetStatus);let payload=buildCmsItemWritePayloadFromDelivery({item,schemaSpec,publishStatus:targetStatus&&targetStatus!=="archived"?targetStatus:effectiveStatus,categoryChange:args.payload.changes.category,tagsToAdd:tagAdds});await args.sdk.configureTenantCmsItem({...payload,item_id:itemId}),targetStatus==="archived"&&effectiveStatus!=="archived"?await args.sdk.applyTenantCmsPublish({collection,item_id:itemId,target_status:"archived"}):targetStatus&&targetStatus!=="archived"&&(effectiveStatus=targetStatus)}else targetStatus&&targetStatus!==effectiveStatus&&await args.sdk.applyTenantCmsPublish({collection,item_id:itemId,target_status:targetStatus});succeeded.push({item_id:itemId,title})}catch(error){failed.push({item_id:itemId,title,message:error instanceof Error?error.message:"\u6279\u91CF\u66F4\u65B0\u5931\u8D25"})}}return{total:itemIds.length,succeeded,failed}}function buildCmsItemWritePayloadFromDelivery(args){let nextTags=dedupeTags([...args.item.system.tags??[],...args.tagsToAdd]);return{collection:args.item.collection,system:{publish_status:args.publishStatus,...args.item.system.slug?{slug:args.item.system.slug}:{},featured:args.item.system.featured??!1,tags:nextTags,category_id:resolveNextCategoryId(args.item,args.categoryChange),...args.item.system.content_format?{content_format:args.item.system.content_format}:{},...args.item.system.source?{source:{...args.item.system.source}}:{}},content:normalizeCmsContentForWrite(args.item.content,args.schemaSpec.fields)}}function resolveNextCategoryId(item,categoryChange){return categoryChange.mode==="clear"?null:categoryChange.mode==="set"?categoryChange.category_id?.trim()||null:item.system.category_id??null}function resolveCmsItemTitle(item){let title=item.content.title,name=item.content.name;return typeof title=="string"&&title.trim()?title.trim():typeof name=="string"&&name.trim()?name.trim():item.system.slug??item.system.id??"Untitled item"}function dedupeTags(values){let seen=new Set,next=[];for(let value of values){let normalized=value.trim();if(!normalized)continue;let lowered=normalized.toLowerCase();seen.has(lowered)||(seen.add(lowered),next.push(normalized))}return next}function normalizeCmsContentForWrite(content,fields){let normalized={};for(let field of fields)normalized[field.name]=normalizeFieldValueForPayload(field,content[field.name]);return normalized}function normalizeFieldValueForPayload(field,value){switch(field.type){case"date":if(typeof value=="string"){let normalized=value.trim();return normalized.length>0?normalized:null}return value??null;case"number":if(typeof value=="string"){let parsed=Number.parseFloat(value.trim());return Number.isFinite(parsed)?field.ui?.number_kind==="integer"?Math.trunc(parsed):parsed:0}return value;case"bool":return!!value;case"multi_select":return normalizeStringArrayValue(value);case"image":case"file":return normalizeAssetValue(value);case"images":case"files":return normalizeAssetArrayValue(value);case"relation":return normalizeRelationId(value);case"relations":return normalizeRelationArrayValue(value);default:return typeof value=="string"?value:value??""}}function normalizeRelationId(value){if(typeof value=="string"){let normalized=value.trim();return normalized.length>0?normalized:null}if(value&&typeof value=="object"&&!Array.isArray(value)&&"id"in value){let id=value.id;return typeof id=="string"&&id.trim().length>0?id.trim():null}return null}function normalizeAssetValue(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function normalizeStringArrayValue(value){return Array.isArray(value)?value.map(item=>String(item)):typeof value=="string"?value.split(",").map(item=>item.trim()).filter(Boolean):[]}function normalizeAssetArrayValue(value){return Array.isArray(value)?value.filter(item=>!!item&&typeof item=="object"&&!Array.isArray(item)):[]}function normalizeRelationArrayValue(value){return Array.isArray(value)?value.map(item=>normalizeRelationId(item)).filter(item=>!!item):[]}import{createHash}from"node:crypto";import{URL as URL2}from"node:url";var IMAGE_URL_ATTRS=["src","data-src","data-original","data-original-src","data-lazy-src"],IMAGE_SRCSET_ATTRS=["srcset","data-srcset"];function trimToUndefined(value){let normalized=value?.trim();return normalized||void 0}function normalizeUrl(value,baseUrl){let trimmed=trimToUndefined(value);if(trimmed)try{return baseUrl?new URL2(trimmed,baseUrl).toString():new URL2(trimmed).toString()}catch{return}}function isPlatformHostedAssetUrl(value){try{let parsed=new URL2(value);return/^\/assets\/[^/]+\/(original|variants\/[^/]+)$/.test(parsed.pathname)||parsed.pathname.startsWith("/api/tenant/assets/")}catch{return!1}}function inferMimeTypeFromUrl(value){if(!value)return;let pathname=(()=>{try{return new URL2(value).pathname.toLowerCase()}catch{return value.toLowerCase()}})();if(pathname.endsWith(".png"))return"image/png";if(pathname.endsWith(".webp"))return"image/webp";if(pathname.endsWith(".gif"))return"image/gif";if(pathname.endsWith(".svg"))return"image/svg+xml";if(pathname.endsWith(".jpg")||pathname.endsWith(".jpeg"))return"image/jpeg";if(pathname.endsWith(".avif"))return"image/avif"}function computeChecksum(content){return`sha256:${createHash("sha256").update(content).digest("hex")}`}function inferRemoteImageFileName(url,mimeType){let lastSegment=(()=>{try{return new URL2(url).pathname}catch{return url}})().split("/").filter(Boolean).at(-1);return lastSegment&&/\.[a-z0-9]{2,6}$/i.test(lastSegment)?decodeURIComponent(lastSegment):`remote-image.${(()=>{switch(mimeType){case"image/png":return"png";case"image/webp":return"webp";case"image/gif":return"gif";case"image/svg+xml":return"svg";case"image/avif":return"avif";case"image/jpeg":default:return"jpg"}})()}`}function buildTenantAssetReference(asset){return{asset_id:asset.asset.asset_id,title:asset.asset.title,media_type:asset.asset.media_type,mime_type:asset.asset.mime_type,size_bytes:asset.original_file.size_bytes,folder_id:asset.asset.folder_id,original_url:asset.original_url,variant_urls:asset.variant_urls}}function replaceImageAttributeUrls(html,replacementsByUrl,attribute2){let pattern=new RegExp(`(<img\\b[^>]*?\\s${attribute2}\\s*=\\s*)(["'])(.*?)\\2`,"gi");return html.replace(pattern,(fullMatch,prefix,quote,rawUrl)=>{let replacement=replacementsByUrl.get(rawUrl);return!replacement||replacement.finalUrl===rawUrl?fullMatch:`${prefix}${quote}${replacement.finalUrl}${quote}`})}function stripImageAttributes(html,attributes){let nextHtml=html;for(let attribute2 of attributes){let pattern=new RegExp(`\\s${attribute2}\\s*=\\s*(["']).*?\\1`,"gi");nextHtml=nextHtml.replace(pattern,"")}return nextHtml}async function fetchRemoteImageBinary(args){let response=await(args.fetchImpl??fetch)(args.url,{headers:{accept:"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8"}});if(!response.ok)throw new Error(`\u56FE\u7247\u62C9\u53D6\u5931\u8D25\uFF08HTTP ${response.status}\uFF09`);let normalizedMimeType=String(response.headers.get("content-type")??"").split(";")[0]?.trim().toLowerCase()||inferMimeTypeFromUrl(args.url);if(!normalizedMimeType||!normalizedMimeType.startsWith("image/"))throw new Error("\u8FDC\u7A0B\u8D44\u6E90\u4E0D\u662F\u53D7\u652F\u6301\u7684\u56FE\u7247\u7C7B\u578B");let content=new Uint8Array(await response.arrayBuffer()),maxBytes=args.maxBytes??20*1024*1024;if(content.byteLength===0)throw new Error("\u8FDC\u7A0B\u56FE\u7247\u5185\u5BB9\u4E3A\u7A7A");if(content.byteLength>maxBytes)throw new Error(`\u8FDC\u7A0B\u56FE\u7247\u8D85\u8FC7\u5927\u5C0F\u9650\u5236\uFF08${content.byteLength} bytes\uFF09`);return{content,mimeType:normalizedMimeType}}async function ingestRemoteImageCandidates(args){let uniqueCandidates=new Map;for(let candidate of args.candidates)uniqueCandidates.has(candidate.url)||uniqueCandidates.set(candidate.url,candidate);let resultsByUrl=new Map,resultsByChecksum=new Map,warnings=[];for(let candidate of uniqueCandidates.values())try{let{content,mimeType}=await fetchRemoteImageBinary({url:candidate.url,fetchImpl:args.fetchImpl,maxBytes:args.maxBytes}),checksum3=computeChecksum(content),existingByChecksum=resultsByChecksum.get(checksum3);if(existingByChecksum){let reused={...existingByChecksum,originalUrl:candidate.url,status:"reused"};resultsByUrl.set(candidate.url,reused);continue}let fileName=inferRemoteImageFileName(candidate.url,mimeType),uploadedAsset=await args.sdk.createTenantAssetBinary({fileName,mimeType,content,title:candidate.title,...args.folderId?{folderId:args.folderId}:{}}),uploaded={originalUrl:candidate.url,finalUrl:uploadedAsset.original_url,asset:uploadedAsset,assetReference:buildTenantAssetReference(uploadedAsset),mimeType,checksum:checksum3,status:"uploaded"};resultsByUrl.set(candidate.url,uploaded),resultsByChecksum.set(checksum3,uploaded)}catch(error){let message=error instanceof Error?error.message:"\u5916\u94FE\u56FE\u7247\u8D44\u4EA7\u5316\u5931\u8D25";warnings.push(`\u56FE\u7247 \`${candidate.url}\` \u8D44\u4EA7\u5316\u5931\u8D25\uFF0C\u5DF2\u56DE\u9000\u539F\u94FE\u63A5\uFF1A${message}`),resultsByUrl.set(candidate.url,{originalUrl:candidate.url,finalUrl:candidate.url,mimeType:inferMimeTypeFromUrl(candidate.url),status:"fallback",warning:message})}return{resultsByUrl,warnings}}function collectExternalImageCandidatesFromHtml(args){let candidates=new Map;return args.html.replace(/<img\b[^>]*>/gi,tag=>{for(let attribute2 of IMAGE_URL_ATTRS){let rawUrl=tag.match(new RegExp(`(?:^|\\s)${attribute2}\\s*=\\s*(["'])(.*?)\\1`,"i"))?.[2],normalizedUrl=normalizeUrl(rawUrl,args.baseUrl);!normalizedUrl||normalizedUrl.startsWith("data:")||isPlatformHostedAssetUrl(normalizedUrl)||candidates.has(normalizedUrl)||candidates.set(normalizedUrl,{url:normalizedUrl,title:args.title,source:"body"})}return""}),[...candidates.values()]}async function assetizeExternalImagesInHtml(args){let bodyCandidates=collectExternalImageCandidatesFromHtml({html:args.html,baseUrl:args.baseUrl,title:args.bodyTitle}),normalizedCoverUrl=normalizeUrl(args.coverUrl,args.baseUrl),coverCandidate=normalizedCoverUrl&&!normalizedCoverUrl.startsWith("data:")&&!isPlatformHostedAssetUrl(normalizedCoverUrl)?{url:normalizedCoverUrl,title:args.coverTitle??args.bodyTitle,source:"cover"}:null,candidates=coverCandidate?[coverCandidate,...bodyCandidates]:bodyCandidates,{resultsByUrl,warnings}=await ingestRemoteImageCandidates({sdk:args.sdk,candidates,folderId:args.folderId,fetchImpl:args.fetchImpl,maxBytes:args.maxBytes}),html=args.html;for(let attribute2 of IMAGE_URL_ATTRS)html=replaceImageAttributeUrls(html,resultsByUrl,attribute2);html=stripImageAttributes(html,IMAGE_SRCSET_ATTRS);let replacements=[...resultsByUrl.values()].map(result=>({originalUrl:result.originalUrl,finalUrl:result.finalUrl,...result.asset?.asset.asset_id?{assetId:result.asset.asset.asset_id}:{},status:result.status}));if(!normalizedCoverUrl)return{html,cover:{mode:"none"},replacements,warnings};let coverResult=resultsByUrl.get(normalizedCoverUrl);return coverResult?.assetReference?{html,cover:{mode:"asset",value:coverResult.assetReference},replacements,warnings}:{html,cover:{mode:"remote",value:{title:args.coverTitle??args.bodyTitle??"Remote cover",...coverResult?.mimeType||args.coverMimeType?{mime_type:coverResult?.mimeType??args.coverMimeType}:{},original_url:normalizedCoverUrl}},replacements,warnings}}var PlatformApiError=class extends Error{status;code;detail;requestId;capability;category;remediation;constructor(message,status,code2,detail,requestId,capability,category,remediation){super(message),this.status=status,this.code=code2,this.detail=detail,this.requestId=requestId,this.capability=capability,this.category=category,this.remediation=remediation,this.name="PlatformApiError"}},BasePlatformSdk=class{options;fetchImpl;constructor(options){this.options=options,this.fetchImpl=options.fetchImpl??fetch}async request(path3,init={}){return this.requestUrl(new URL(path3,this.options.baseUrl),init)}async requestBinary(path3,init={}){return this.requestBinaryUrl(new URL(path3,this.options.baseUrl),init)}async requestVoid(path3,init={}){return this.requestVoidUrl(new URL(path3,this.options.baseUrl),init)}async requestUrl(url,init={}){let response=await this.fetchResponse(url,init),payload=await parseJsonResponse(response);if(!response.ok){let errorPayload=payload,error=errorPayload.error;throw new PlatformApiError(error?.message??`Request failed: ${response.status}`,response.status,error?.code,error?.detail??errorPayload.detail,errorPayload.request_id,error?.capability,error?.category,error?.remediation)}return payload}async requestBinaryUrl(url,init={}){let response=await this.fetchResponse(url,init);if(!response.ok){let payload=await parseJsonResponse(response),error=payload.error;throw new PlatformApiError(error?.message??`Request failed: ${response.status}`,response.status,error?.code,error?.detail??payload.detail,payload.request_id,error?.capability,error?.category,error?.remediation)}return new Uint8Array(await response.arrayBuffer())}async requestVoidUrl(url,init={}){let response=await this.fetchResponse(url,init);if(!response.ok){let payload=await parseJsonResponse(response),error=payload.error;throw new PlatformApiError(error?.message??`Request failed: ${response.status}`,response.status,error?.code,error?.detail??payload.detail,payload.request_id,error?.capability,error?.category,error?.remediation)}}async fetchResponse(url,init={}){let headers=new Headers(init.headers);!headers.has("Content-Type")&&init.body&&headers.set("Content-Type","application/json");let extraHeaders=await this.options.getHeaders?.();return extraHeaders&&new Headers(extraHeaders).forEach((value,key)=>{headers.set(key,value)}),this.fetchImpl(url,{...init,headers})}};async function parseJsonResponse(response){let text2=await response.text();if(text2.trim().length===0)return{};try{return JSON.parse(text2)}catch{if(response.ok)return{};throw new PlatformApiError(`Request failed with non-JSON response: ${response.status}`,response.status,"non_json_response",{content_type:response.headers.get("content-type")??void 0,body_preview:text2.replace(/\s+/g," ").slice(0,240)})}}var PlatformSdk=class extends BasePlatformSdk{notification;constructor(options){super(options),this.notification=new NotificationSdkNamespace(this)}async listNotificationInbox(filters={}){let url=new URL("/api/tenant/notification/inbox",this.options.baseUrl);return setOptionalSearchParam(url,"app_id",filters.app_id),setOptionalSearchParam(url,"inbox_type",filters.inbox_type),setOptionalSearchParam(url,"status",filters.status),typeof filters.limit=="number"&&Number.isFinite(filters.limit)&&url.searchParams.set("limit",String(filters.limit)),this.request(`${url.pathname}${url.search}`)}async updateNotificationInboxItemStatus(itemId,payload){return(await this.request(`/api/tenant/notification/inbox/${encodeURIComponent(itemId)}`,{method:"PATCH",body:JSON.stringify(payload)})).item}async batchUpdateNotificationInboxItemsStatus(payload){return this.request("/api/tenant/notification/inbox:batch",{method:"PATCH",body:JSON.stringify(payload)})}async listNotificationDeliveries(filters={}){let url=new URL("/api/tenant/notification/deliveries",this.options.baseUrl);return setOptionalSearchParam(url,"app_id",filters.app_id),setOptionalSearchParam(url,"status",filters.status),(await this.request(`${url.pathname}${url.search}`)).items}async announcePlatformNotification(payload){return(await this.request("/api/admin/notification/announcements/platform",{method:"POST",body:JSON.stringify(payload)})).item}async announceAppNotification(appId,payload){return(await this.request(`/api/tenant/notification/apps/${encodeURIComponent(appId)}/announcements`,{method:"POST",body:JSON.stringify(payload)})).item}async getAppNotificationConfig(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/config`)}async listAppNotificationAnnouncements(appId,options={}){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/announcements`,this.options.baseUrl);return typeof options.limit=="number"&&Number.isFinite(options.limit)&&url.searchParams.set("limit",String(options.limit)),this.request(`${url.pathname}${url.search}`)}async createAppNotificationAnnouncement(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/announcements`,{method:"POST",body:JSON.stringify(payload)})}async archiveAppNotificationAnnouncement(appId,announcementId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/announcements/${encodeURIComponent(announcementId)}:archive`,{method:"POST"})}async publishEndUserNotification(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/publish`,{method:"POST",body:JSON.stringify(payload)})}async createEndUserNotificationReminder(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/reminders`,{method:"POST",body:JSON.stringify(payload)})}async projectEndUserTaskNotification(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/task-projections`,{method:"POST",body:JSON.stringify(payload)})}async listEndUserNotificationInbox(appId,query){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/inbox`,this.options.baseUrl);return url.searchParams.set("end_user_id",query.end_user_id),setOptionalSearchParam(url,"status",query.status),setOptionalSearchParam(url,"inbox_type",query.inbox_type),typeof query.limit=="number"&&Number.isFinite(query.limit)&&url.searchParams.set("limit",String(query.limit)),this.request(`${url.pathname}${url.search}`)}async getEndUserNotificationUnreadCount(appId,endUserId){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/unread-count`,this.options.baseUrl);return url.searchParams.set("end_user_id",endUserId),this.request(`${url.pathname}${url.search}`)}async createWorkflowDefinition(payload){return(await this.request("/api/workflow/definitions",{method:"POST",body:JSON.stringify(payload)})).item}async listWorkflowTemplates(){return(await this.request("/api/workflow/templates")).items}async listWorkflowDefinitions(filters={}){let url=new URL("/api/workflow/definitions",this.options.baseUrl);return setOptionalSearchParam(url,"target_id",filters.target_id),setOptionalSearchParam(url,"status",filters.status),(await this.request(`${url.pathname}${url.search}`)).items}async listWorkflowBindings(filters={}){let url=new URL("/api/workflow/bindings",this.options.baseUrl);return setOptionalSearchParam(url,"target_id",filters.target_id),setOptionalSearchParam(url,"definition_key",filters.definition_key),(await this.request(`${url.pathname}${url.search}`)).items}async updateWorkflowDefinitionMetadata(payload){return(await this.request(`/api/workflow/definitions/${encodeURIComponent(payload.definition_key)}`,{method:"PATCH",body:JSON.stringify(payload)})).item}async saveWorkflowRoleBindings(payload){return(await this.request(`/api/workflow/definitions/${encodeURIComponent(payload.definition_key)}/role-bindings`,{method:"POST",body:JSON.stringify(payload)})).items}async getWorkflowBindingOverride(args){let url=new URL(`/api/workflow/definitions/${encodeURIComponent(args.definition_key)}/binding-override`,this.options.baseUrl);return setOptionalSearchParam(url,"target_scope",args.target_scope),setOptionalSearchParam(url,"target_id",args.target_id),(await this.request(`${url.pathname}${url.search}`)).item}async saveWorkflowBindingOverride(payload){return(await this.request(`/api/workflow/definitions/${encodeURIComponent(payload.definition_key)}/binding-override`,{method:"POST",body:JSON.stringify(payload)})).item}async listWorkflowRoleBindings(args){let url=new URL(`/api/workflow/definitions/${encodeURIComponent(args.definition_key)}/role-bindings`,this.options.baseUrl);return setOptionalSearchParam(url,"target_scope",args.target_scope),setOptionalSearchParam(url,"target_id",args.target_id),(await this.request(`${url.pathname}${url.search}`)).items}async startWorkflow(payload){return(await this.request("/api/workflow/instances/start",{method:"POST",body:JSON.stringify(payload)})).item}async performWorkflowAction(instanceId,payload){return(await this.request(`/api/workflow/instances/${encodeURIComponent(instanceId)}/actions`,{method:"POST",body:JSON.stringify(payload)})).item}async getWorkflowInstance(instanceId){return(await this.request(`/api/workflow/instances/${encodeURIComponent(instanceId)}`)).item}async listWorkflowTasks(filters={}){let url=new URL("/api/workflow/tasks",this.options.baseUrl);return setOptionalSearchParam(url,"app_id",filters.app_id),setOptionalSearchParam(url,"status",filters.status),(await this.request(`${url.pathname}${url.search}`)).items}async getWhoAmI(){return this.request("/api/auth/whoami")}async getResolvedPermissions(){return this.request("/api/auth/permissions")}async switchTenantContext(payload){return this.request("/api/auth/context/switch-tenant",{method:"POST",body:JSON.stringify(payload)})}async listTenantWorkspaces(){return this.request("/api/auth/workspaces")}async ensurePersonalWorkspace(){return this.request("/api/auth/workspaces/ensure-personal",{method:"POST"})}async getAdminOverview(){return this.request("/api/admin/overview")}async listAdminWorkbenchEntries(){return this.request("/api/admin/workbench-entries")}async getAdminWorkbenchEntryDetail(entryKey){return this.request(`/api/admin/workbench-entries/${encodeURIComponent(entryKey)}`)}async updateAdminWorkbenchEntryVisibility(entryKey,payload){return this.request(`/api/admin/workbench-entries/${encodeURIComponent(entryKey)}/visibility`,{method:"PUT",body:JSON.stringify(payload)})}async resetAdminWorkbenchEntryVisibility(entryKey){return this.request(`/api/admin/workbench-entries/${encodeURIComponent(entryKey)}/visibility`,{method:"DELETE"})}async previewAdminWorkbenchEntryVisibility(entryKey,payload){return this.request(`/api/admin/workbench-entries/${encodeURIComponent(entryKey)}/visibility:preview`,{method:"POST",body:JSON.stringify(payload)})}async createTenantAsset(payload){return this.request("/api/tenant/assets",{method:"POST",body:JSON.stringify(payload)})}async createTenantAssetBinary(args){let headers=new Headers({"Content-Type":args.mimeType,"X-Asset-File-Name":encodeURIComponent(args.fileName)});return args.title?.trim()&&headers.set("X-Asset-Title",encodeURIComponent(args.title.trim())),args.folderId?.trim()&&headers.set("X-Asset-Folder-Id",encodeURIComponent(args.folderId.trim())),this.request("/api/tenant/assets/upload",{method:"POST",headers,body:Buffer.from(args.content)})}async listTenantAssets(filters={}){let url=new URL("/api/tenant/assets",this.options.baseUrl);return setOptionalSearchParam(url,"q",filters.q),setOptionalSearchParam(url,"media_type",filters.media_type),setOptionalSearchParam(url,"mime_type",filters.mime_type),setOptionalSearchParam(url,"folder_id",filters.folder_id),setOptionalSearchParam(url,"tag_ids",filters.tag_ids?.join(",")),setOptionalSearchParam(url,"scene",filters.scene),setOptionalSearchParam(url,"objects",filters.objects?.join(",")),setOptionalSearchParam(url,"safety_flags",filters.safety_flags?.join(",")),setOptionalSearchParam(url,"orientation",filters.orientation),setOptionalBooleanSearchParam(url,"has_ocr",filters.has_ocr),setOptionalBooleanSearchParam(url,"has_person",filters.has_person),setOptionalBooleanSearchParam(url,"is_svg",filters.is_svg),typeof filters.page=="number"&&Number.isFinite(filters.page)&&url.searchParams.set("page",String(filters.page)),typeof filters.limit=="number"&&Number.isFinite(filters.limit)&&url.searchParams.set("limit",String(filters.limit)),this.request(`${url.pathname}${url.search}`)}async getTenantAsset(assetId){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}`)}async deleteTenantAsset(assetId){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}`,{method:"DELETE"})}async batchUpdateTenantAssets(payload){return this.request("/api/tenant/assets/batch",{method:"POST",body:JSON.stringify(payload)})}async listTenantAssetFolders(){return this.request("/api/tenant/assets/folders")}async createTenantAssetFolder(payload){return this.request("/api/tenant/assets/folders",{method:"POST",body:JSON.stringify(payload)})}async updateTenantAssetFolderMetadata(folderId,payload){return this.request(`/api/tenant/assets/folders/${encodeURIComponent(folderId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async deleteTenantAssetFolder(folderId){return this.request(`/api/tenant/assets/folders/${encodeURIComponent(folderId)}`,{method:"DELETE"})}async moveTenantAssetFolder(folderId,direction){return this.request(`/api/tenant/assets/folders/${encodeURIComponent(folderId)}/move-${direction}`,{method:"POST"})}async updateTenantAssetFolder(assetId,payload){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}/folder`,{method:"PATCH",body:JSON.stringify(payload)})}async updateTenantAssetMetadata(assetId,payload){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}/metadata`,{method:"PATCH",body:JSON.stringify(payload)})}async listTenantAssetTags(options){let url=new URL("/api/tenant/assets/tags",this.options.baseUrl);return options?.assetId&&url.searchParams.set("asset_id",options.assetId),this.request(`${url.pathname}${url.search}`)}async addTenantAssetTag(assetId,payload){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}/tags`,{method:"POST",body:JSON.stringify(payload)})}async removeTenantAssetTag(assetId,label){let url=new URL(`/api/tenant/assets/${encodeURIComponent(assetId)}/tags`,this.options.baseUrl);return url.searchParams.set("label",label),this.request(`${url.pathname}${url.search}`,{method:"DELETE"})}async downloadTenantAssetOriginal(assetId){return this.requestBinary(`/api/tenant/assets/${encodeURIComponent(assetId)}/original`)}async downloadTenantAssetVariant(assetId,variantKind){return this.requestBinary(`/assets/${encodeURIComponent(assetId)}/variants/${encodeURIComponent(variantKind)}`)}async createTenantBlobUploadSession(payload){return this.request("/api/tenant/blobs/upload-sessions",{method:"POST",body:JSON.stringify(payload)})}async uploadTenantBlobBinary(uploadSessionId,payload){let url=resolveRelativeOrAbsoluteUrl(payload.upload_url??`/api/tenant/blobs/upload-sessions/${encodeURIComponent(uploadSessionId)}/content`,this.options.baseUrl),headers=new Headers(payload.headers);headers.set("Content-Type",payload.content_type?.trim()||"application/octet-stream"),await this.requestVoidUrl(url,{method:"PUT",headers,body:Buffer.from(payload.content)})}async completeTenantBlobUpload(uploadSessionId,payload={}){return this.request(`/api/tenant/blobs/upload-sessions/${encodeURIComponent(uploadSessionId)}/complete`,{method:"POST",body:JSON.stringify(payload)})}async createTenantBlobBinary(args){let contentType=args.contentType?.trim()||"application/octet-stream",session=await this.createTenantBlobUploadSession({original_filename:args.fileName,content_type:contentType,size_bytes:args.content.byteLength,...args.appId?.trim()?{app_id:args.appId.trim()}:{},...args.clientRequestId?.trim()?{client_request_id:args.clientRequestId.trim()}:{}});return await this.uploadTenantBlobBinary(session.upload_session_id,{content:args.content,content_type:contentType,upload_url:session.upload_url,headers:session.headers}),this.completeTenantBlobUpload(session.upload_session_id,{size_bytes:args.content.byteLength,...args.sha256?.trim()?{sha256:args.sha256.trim()}:{}})}async listTenantBlobs(filters={}){let url=new URL("/api/tenant/blobs",this.options.baseUrl);return setOptionalSearchParam(url,"cursor",filters.cursor),setOptionalSearchParam(url,"app_id",filters.app_id??void 0),setOptionalSearchParam(url,"q",filters.q??void 0),typeof filters.limit=="number"&&Number.isFinite(filters.limit)&&url.searchParams.set("limit",String(filters.limit)),this.request(`${url.pathname}${url.search}`)}async getTenantBlob(blobId){return this.request(`/api/tenant/blobs/${encodeURIComponent(blobId)}`)}async issueTenantBlobDownloadUrl(blobId,payload={}){return this.request(`/api/tenant/blobs/${encodeURIComponent(blobId)}/download-url`,{method:"POST",body:JSON.stringify(payload)})}async getTenantOverview(){return this.request("/api/tenant/overview")}async getTenantEffectiveState(){return this.request("/api/tenant/effective-state")}async getTenantWorkbenchNavigation(){return this.request("/api/tenant/workbench/navigation")}async createTenantApp(payload){return this.request("/api/tenant/apps",{method:"POST",body:JSON.stringify(payload)})}async updateTenantApp(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async listAppTemplates(){return this.request("/api/tenant/app-templates")}async createAppTemplate(payload){return this.request("/api/tenant/app-templates",{method:"POST",body:JSON.stringify(payload)})}async getAppTemplate(templateId){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}`)}async openAppTemplatePreview(templateId){return this.requestVoid(`/api/tenant/app-templates/${encodeURIComponent(templateId)}/preview`)}async updateAppTemplateSettings(templateId,payload){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async deleteAppTemplate(templateId,payload={}){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}`,{method:"DELETE",body:JSON.stringify(payload)})}async createAppTemplateInitializationTask(templateId,payload){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}/initialization-tasks`,{method:"POST",body:JSON.stringify(payload)})}async getAppTemplateInitializationTask(taskId){return this.request(`/api/tenant/app-template-initialization-tasks/${encodeURIComponent(taskId)}`)}async createAppMarketSubmission(templateId,payload={}){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}/market-submissions`,{method:"POST",body:JSON.stringify(payload)})}async cancelAppMarketSubmission(submissionId){return this.request(`/api/tenant/app-market/submissions/${encodeURIComponent(submissionId)}/cancel`,{method:"POST"})}async listTenantAppMarketSubmissions(options){let url=new URL("/api/tenant/app-market/submissions",this.options.baseUrl);return options?.status&&url.searchParams.set("status",options.status),this.request(`${url.pathname}${url.search}`)}async listAppMarketListings(options){let url=new URL("/api/tenant/app-market/listings",this.options.baseUrl);return options?.query&&url.searchParams.set("query",options.query),options?.tag&&url.searchParams.set("tag",options.tag),this.request(`${url.pathname}${url.search}`)}async listAdminAppMarketListings(options){let url=new URL("/api/admin/app-market/listings",this.options.baseUrl);return options?.query&&url.searchParams.set("query",options.query),options?.tag&&url.searchParams.set("tag",options.tag),this.request(`${url.pathname}${url.search}`)}async getAppMarketListing(listingId){return this.request(`/api/tenant/app-market/listings/${encodeURIComponent(listingId)}`)}async openAppMarketSubmissionPreview(submissionId){return this.requestVoid(`/api/tenant/app-market/submissions/${encodeURIComponent(submissionId)}/preview`)}async createAppMarketInstall(listingId,payload){return this.request(`/api/tenant/app-market/listings/${encodeURIComponent(listingId)}/installs`,{method:"POST",body:JSON.stringify(payload)})}async listAdminAppMarketSubmissions(options){let url=new URL("/api/admin/app-market/submissions",this.options.baseUrl);return options?.status&&url.searchParams.set("status",options.status),this.request(`${url.pathname}${url.search}`)}async approveAppMarketSubmission(submissionId){return this.request(`/api/admin/app-market/submissions/${encodeURIComponent(submissionId)}/approve`,{method:"POST"})}async rejectAppMarketSubmission(submissionId,payload={}){return this.request(`/api/admin/app-market/submissions/${encodeURIComponent(submissionId)}/reject`,{method:"POST",body:JSON.stringify(payload)})}async unlistAppMarketListing(listingId,payload={}){return this.request(`/api/admin/app-market/listings/${encodeURIComponent(listingId)}/unlist`,{method:"POST",body:JSON.stringify(payload)})}async publishAppMarketListing(listingId,payload={}){return this.request(`/api/admin/app-market/listings/${encodeURIComponent(listingId)}/publish`,{method:"POST",body:JSON.stringify(payload)})}async listAdminLightAppLibraries(options){let url=new URL("/api/admin/light-app-library/libraries",this.options.baseUrl);return options?.visibility&&url.searchParams.set("visibility",options.visibility),this.request(`${url.pathname}${url.search}`)}async setAdminLightAppLibraryVisibility(libraryId,payload){return this.request(`/api/admin/light-app-library/libraries/${encodeURIComponent(libraryId)}/visibility`,{method:"POST",body:JSON.stringify(payload)})}async listLightAppLibraryEntries(options){let url=new URL("/api/tenant/light-app-library/entries",this.options.baseUrl);return options?.query&&url.searchParams.set("query",options.query),options?.status&&url.searchParams.set("status",options.status),options?.template_key&&url.searchParams.set("template_key",options.template_key),options?.tag&&url.searchParams.set("tag",options.tag),options?.visibility&&url.searchParams.set("visibility",options.visibility),typeof options?.include_public=="boolean"&&url.searchParams.set("include_public",String(options.include_public)),this.request(`${url.pathname}${url.search}`)}async searchLightAppLibraryEntries(query){let url=new URL("/api/tenant/light-app-library/entries/search",this.options.baseUrl);return url.searchParams.set("query",query),this.request(`${url.pathname}${url.search}`)}async getLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}`)}async createLightAppLibraryEntry(payload){return this.request("/api/tenant/light-app-library/entries",{method:"POST",body:JSON.stringify(payload)})}async updateLightAppLibraryEntry(entryId,payload){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async submitLightAppLibraryEntrySnapshot(entryId,payload){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/snapshots`,{method:"POST",body:JSON.stringify(payload)})}async publishLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/publish`,{method:"POST"})}async unpublishLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/unpublish`,{method:"POST"})}async archiveLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/archive`,{method:"POST"})}async deleteLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}`,{method:"DELETE"})}async getLightAppLibraryEntrySource(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/source`)}async readLightAppLibraryEntrySourceFile(entryId,path3){let url=new URL(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/source/files`,this.options.baseUrl);return url.searchParams.set("path",path3),this.request(`${url.pathname}${url.search}`)}async searchLightAppLibraryEntrySource(entryId,query){let url=new URL(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/source/search`,this.options.baseUrl);return url.searchParams.set("query",query),this.request(`${url.pathname}${url.search}`)}async listLightAppPrototypeEntries(options){let url=new URL("/api/tenant/prototypes",this.options.baseUrl);return options?.q&&url.searchParams.set("q",options.q),options?.status&&url.searchParams.set("status",options.status),this.request(`${url.pathname}${url.search}`)}async getLightAppPrototypeEntry(entryId){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}`)}async createLightAppPrototypeEntry(payload){return this.request("/api/tenant/prototypes",{method:"POST",body:JSON.stringify(payload)})}async updateLightAppPrototypeEntry(entryId,payload){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async copyLightAppPrototypeEntry(entryId){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}/copy`,{method:"POST"})}async deleteLightAppPrototypeEntry(entryId){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}`,{method:"DELETE"})}async saveLightAppPrototypeCurrentVersion(entryId,payload){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}/current-version`,{method:"PUT",body:JSON.stringify(payload)})}async submitLightAppPrototypeVersion(entryId,payload){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}/versions`,{method:"POST",body:JSON.stringify(payload)})}async getLightAppPrototypeVersion(entryId,versionId){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}/versions/${encodeURIComponent(versionId)}`)}async deleteTenantApp(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}`,{method:"DELETE"})}async getTenantAppDeletePreview(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/delete-preview`,{method:"POST"})}async getTenantAppDeleteJob(jobId){return this.request(`/api/tenant/app-delete-jobs/${encodeURIComponent(jobId)}`)}async getTenantAppUndeployPreview(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/undeploy-preview`,{method:"POST"})}async undeployTenantApp(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/undeploy`,{method:"POST"})}async getTenantAppUndeployJob(jobId){return this.request(`/api/tenant/app-undeploy-jobs/${encodeURIComponent(jobId)}`)}async createBuild(payload){return this.request("/api/builds",{method:"POST",body:JSON.stringify(payload)})}async listBuilds(appId,options){let url=new URL("/api/builds",this.options.baseUrl);return url.searchParams.set("app_id",appId),typeof options?.limit=="number"&&Number.isFinite(options.limit)&&url.searchParams.set("limit",String(options.limit)),this.request(`${url.pathname}${url.search}`)}async getBuildPrecheck(appId,args){let url=new URL("/api/builds/precheck",this.options.baseUrl);return url.searchParams.set("app_id",appId),url.searchParams.set("source_version_id",args.source_version_id),args.build_config?.dockerfile_path&&url.searchParams.set("dockerfile_path",args.build_config.dockerfile_path),args.build_config?.context_subdir&&url.searchParams.set("context_subdir",args.build_config.context_subdir),args.build_config?.target&&url.searchParams.set("target",args.build_config.target),this.request(`${url.pathname}${url.search}`)}async getBuild(buildId){return this.request(`/api/builds/${encodeURIComponent(buildId)}`)}async listBuildEvents(buildId){return this.request(`/api/builds/${encodeURIComponent(buildId)}/events`)}async createLocalBuildSession(payload){return this.request("/api/builds/local-sessions",{method:"POST",body:JSON.stringify(payload)})}async completeLocalBuildSession(buildId,payload){return this.request(`/api/builds/${encodeURIComponent(buildId)}/local-complete`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppSourceWorkspace(appId,options){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/source-workspace`,this.options.baseUrl);return options?.sourceVersionId&&url.searchParams.set("source_version_id",options.sourceVersionId),this.request(`${url.pathname}${url.search}`)}async getTenantAppDevWorkspace(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/dev-workspace`)}async pushTenantAppDevWorkspace(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/dev-workspace/push`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(payload)})}async createTenantAppDevWorkspacePreview(appId,payload={}){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/dev-workspace/preview`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppDevWorkspacePreview(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/dev-workspace/preview`)}async listTenantAppSourceVersions(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions`)}async updateTenantAppSourceVersion(appId,sourceVersionId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions/${encodeURIComponent(sourceVersionId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async getTenantAppEndUserAuthConfig(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/config`)}async getTenantAppEndUserAuthDiscovery(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/discovery`)}async getTenantAppEndUserAuthInspect(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/inspect`)}async configureTenantAppEndUserAuth(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/configure`,{method:"POST",body:JSON.stringify(payload)})}async bindTenantAppEndUserAuth(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/bind`,{method:"POST",body:JSON.stringify(payload)})}async listTenantAppEndUsers(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users`)}async listTenantAppEndUserRoles(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/roles`)}async createTenantAppEndUserRole(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/roles`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppEndUserRole(appId,roleKey){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/roles/${encodeURIComponent(roleKey)}`)}async updateTenantAppEndUserRole(appId,roleKey,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/roles/${encodeURIComponent(roleKey)}`,{method:"PATCH",body:JSON.stringify(payload)})}async listTenantAppUserRoles(appId,appUserId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users/${encodeURIComponent(appUserId)}/roles`)}async assignTenantAppUserRoles(appId,appUserId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users/${encodeURIComponent(appUserId)}/roles:assign`,{method:"POST",body:JSON.stringify(payload)})}async replaceTenantAppUserRoles(appId,appUserId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users/${encodeURIComponent(appUserId)}/roles`,{method:"PUT",body:JSON.stringify(payload)})}async removeTenantAppUserRole(appId,appUserId,roleKey){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users/${encodeURIComponent(appUserId)}/roles/${encodeURIComponent(roleKey)}`,{method:"DELETE"})}async discoverTenantCmsCollection(collection){let url=new URL("/api/tenant/cms/discover",this.options.baseUrl);return url.searchParams.set("collection",collection),this.request(`${url.pathname}${url.search}`)}async listTenantCmsCollections(){return this.request("/api/tenant/cms/collections")}async inspectTenantCmsSchema(collection){let url=new URL("/api/tenant/cms/inspect/schema",this.options.baseUrl);return url.searchParams.set("collection",collection),this.request(`${url.pathname}${url.search}`)}async listTenantCmsItems(args){let url=new URL("/api/tenant/cms/items",this.options.baseUrl);return url.searchParams.set("collection",args.collection),typeof args.page=="number"&&Number.isFinite(args.page)&&url.searchParams.set("page",String(args.page)),typeof args.pageSize=="number"&&Number.isFinite(args.pageSize)&&url.searchParams.set("page_size",String(args.pageSize)),setOptionalSearchParam(url,"category_id",args.categoryId),setOptionalSearchParam(url,"status",args.status),setOptionalSearchParam(url,"q",args.query),this.request(`${url.pathname}${url.search}`)}async getTenantCmsItem(args){let url=new URL(`/api/tenant/cms/items/${encodeURIComponent(args.id)}`,this.options.baseUrl);return url.searchParams.set("collection",args.collection),this.request(`${url.pathname}${url.search}`)}async configureTenantCmsCollection(spec){return this.request("/api/tenant/cms/configure/collection",{method:"POST",body:JSON.stringify(spec)})}async configureTenantCmsItem(payload){return this.request("/api/tenant/cms/configure/item",{method:"POST",body:JSON.stringify(payload)})}async configureTenantCmsCategory(payload){return this.request("/api/tenant/cms/configure/category",{method:"POST",body:JSON.stringify(payload)})}async applyTenantCmsSchema(payload){return this.request("/api/tenant/cms/apply/schema",{method:"POST",body:JSON.stringify(payload)})}async applyTenantCmsCollectionStatus(payload){return this.request("/api/tenant/cms/apply/collection-status",{method:"POST",body:JSON.stringify(payload)})}async applyTenantCmsPublish(payload){return this.request("/api/tenant/cms/apply/publish",{method:"POST",body:JSON.stringify(payload)})}async listPublicCmsItems(args){let url=new URL(`/api/public/cms/collections/${encodeURIComponent(args.collection)}/items`,this.options.baseUrl);url.searchParams.set("tenant_id",args.tenantId),typeof args.page=="number"&&Number.isFinite(args.page)&&url.searchParams.set("page",String(args.page)),typeof args.pageSize=="number"&&Number.isFinite(args.pageSize)&&url.searchParams.set("page_size",String(args.pageSize)),setOptionalSearchParam(url,"category_id",args.categoryId),setOptionalSearchParam(url,"sort_field",args.sortField),setOptionalSearchParam(url,"sort_direction",args.sortDirection);for(let tag of args.tags??[])url.searchParams.append("tag",tag);return this.request(`${url.pathname}${url.search}`)}async getPublicCmsItemBySlug(args){let url=new URL(`/api/public/cms/collections/${encodeURIComponent(args.collection)}/items/by-slug/${encodeURIComponent(args.slug)}`,this.options.baseUrl);return url.searchParams.set("tenant_id",args.tenantId),this.request(`${url.pathname}${url.search}`)}async getPublicCmsItemById(args){let url=new URL(`/api/public/cms/collections/${encodeURIComponent(args.collection)}/items/${encodeURIComponent(args.id)}`,this.options.baseUrl);return url.searchParams.set("tenant_id",args.tenantId),this.request(`${url.pathname}${url.search}`)}async listPublicCmsCategories(args){let url=new URL(`/api/public/cms/collections/${encodeURIComponent(args.collection)}/categories`,this.options.baseUrl);return url.searchParams.set("tenant_id",args.tenantId),this.request(`${url.pathname}${url.search}`)}async listTenantAppDeploymentTimeline(appId,options){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/deployments`,this.options.baseUrl);return typeof options?.limit=="number"&&Number.isFinite(options.limit)&&url.searchParams.set("limit",String(options.limit)),this.request(`${url.pathname}${url.search}`)}async getTenantAppPublishSettings(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/publish-settings`)}async updateTenantAppPublishSettings(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/publish-settings`,{method:"PATCH",body:JSON.stringify(payload)})}async setTenantAppCurrentPublishedVersion(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/publish-settings/current-version`,{method:"POST",body:JSON.stringify(payload)})}async createTenantAppPreview(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/previews`,{method:"POST",body:JSON.stringify(payload)})}async createTenantAppSourceVersion(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions`,{method:"POST",body:JSON.stringify(payload)})}async createTenantAppSourceVersionFromTemplate(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions:from-template`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppReleaseDeletePreview(appId,releaseId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/releases/${encodeURIComponent(releaseId)}/delete-preview`,{method:"POST"})}async deleteTenantAppRelease(appId,releaseId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/releases/${encodeURIComponent(releaseId)}/delete`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppSourceVersionDeletePreview(appId,sourceVersionId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions/${encodeURIComponent(sourceVersionId)}/delete-preview`,{method:"POST"})}async deleteTenantAppSourceVersion(appId,sourceVersionId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions/${encodeURIComponent(sourceVersionId)}/delete`,{method:"POST",body:JSON.stringify(payload)})}async getTenantVersionDeleteJob(jobId){return this.request(`/api/tenant/version-delete-jobs/${encodeURIComponent(jobId)}`)}async getTenantAppBuildDeletePreview(appId,buildId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/builds/${encodeURIComponent(buildId)}/delete-preview`,{method:"POST"})}async deleteTenantAppBuild(appId,buildId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/builds/${encodeURIComponent(buildId)}/delete`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppDbInstance(appId,env="preview"){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db`,this.options.baseUrl);return url.searchParams.set("env",env),this.requestUrl(url)}async getTenantAppDbRuntimeBindings(appId,env="preview",purpose){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/runtime-bindings`,this.options.baseUrl);return url.searchParams.set("env",env),purpose&&url.searchParams.set("purpose",purpose),this.requestUrl(url)}async resolveDevRuntimeBindings(payload){return this.request("/api/dev-runtime-bindings/resolve",{method:"POST",body:JSON.stringify(payload)})}async revokeDevRuntimeBindings(payload){return this.request("/api/dev-runtime-bindings/revoke",{method:"POST",body:JSON.stringify(payload)})}async listTenantAppDbTables(appId,env="preview"){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables`,this.options.baseUrl);return url.searchParams.set("env",env),this.requestUrl(url)}async getTenantAppDbTableSchema(appId,tableName,env="preview"){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/schema`,this.options.baseUrl);return url.searchParams.set("env",env),this.requestUrl(url)}async getTenantAppDbTableRows(appId,tableName,args={}){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/rows`,this.options.baseUrl);return url.searchParams.set("env",args.env??"preview"),typeof args.page=="number"&&url.searchParams.set("page",String(args.page)),typeof args.page_size=="number"&&url.searchParams.set("page_size",String(args.page_size)),typeof args.sort_by=="string"&&args.sort_by.trim().length>0&&url.searchParams.set("sort_by",args.sort_by),args.sort_order==="desc"&&url.searchParams.set("sort_order","desc"),typeof args.filter_column=="string"&&args.filter_column.trim().length>0&&url.searchParams.set("filter_column",args.filter_column),typeof args.filter_value=="string"&&args.filter_value.length>0&&url.searchParams.set("filter_value",args.filter_value),typeof args.search_query=="string"&&args.search_query.trim().length>0&&url.searchParams.set("search_query",args.search_query),this.requestUrl(url)}async listTenantAppDbMigrationRuns(appId,args={}){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/migrations`,this.options.baseUrl);return url.searchParams.set("env",args.env??"preview"),typeof args.limit=="number"&&url.searchParams.set("limit",String(args.limit)),this.requestUrl(url)}async listTenantAppDbChangeAudits(appId,args={}){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/audits`,this.options.baseUrl);return url.searchParams.set("env",args.env??"preview"),typeof args.table_name=="string"&&args.table_name.trim().length>0&&url.searchParams.set("table_name",args.table_name),typeof args.limit=="number"&&url.searchParams.set("limit",String(args.limit)),this.requestUrl(url)}async insertTenantAppDbRow(appId,tableName,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/rows`,{method:"POST",body:JSON.stringify(payload)})}async updateTenantAppDbRow(appId,tableName,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/rows`,{method:"PATCH",body:JSON.stringify(payload)})}async deleteTenantAppDbRow(appId,tableName,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/rows`,{method:"DELETE",body:JSON.stringify(payload)})}async queryTenantAppDb(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/db/query`,{method:"POST",body:JSON.stringify(payload)})}async createWorkspace(payload){return this.request("/api/admin/workspaces",{method:"POST",body:JSON.stringify(payload)})}async deleteWorkspace(workspaceId,payload){return this.request(`/api/admin/workspaces/${encodeURIComponent(workspaceId)}`,{method:"DELETE",...payload?{body:JSON.stringify(payload)}:{}})}async createApproval(payload){return this.request("/api/admin/resource-approvals",{method:"POST",body:JSON.stringify(payload)})}async listApprovals(filters){let url=new URL("/api/admin/resource-approvals",this.options.baseUrl);return filters?.tenant_id&&url.searchParams.set("tenant_id",filters.tenant_id),filters?.app_id&&url.searchParams.set("app_id",filters.app_id),filters?.status&&url.searchParams.set("status",filters.status),filters?.operation&&url.searchParams.set("operation",filters.operation),this.requestUrl(url)}async decideApproval(approvalId,payload){return this.request(`/api/admin/resource-approvals/${approvalId}/decision`,{method:"POST",body:JSON.stringify(payload)})}async listResourceLocks(filters){let url=new URL("/api/admin/resource-locks",this.options.baseUrl);return filters?.tenant_id&&url.searchParams.set("tenant_id",filters.tenant_id),filters?.app_id&&url.searchParams.set("app_id",filters.app_id),filters?.env&&url.searchParams.set("env",filters.env),this.requestUrl(url)}async diffResources(payload){return this.request("/api/resources/diff",{method:"POST",body:JSON.stringify(payload)})}async applyResources(payload){return this.request("/api/resources/apply",{method:"POST",body:JSON.stringify(payload)})}async rollbackResources(payload){return this.request("/api/resources/rollback",{method:"POST",body:JSON.stringify(payload)})}async deployRelease(payload){return this.request("/api/releases/deploy",{method:"POST",body:JSON.stringify(payload)})}async rollbackRelease(payload){return this.request("/api/releases/rollback",{method:"POST",body:JSON.stringify(payload)})}async queryLogs(payload){return this.request("/api/logs/query",{method:"POST",body:JSON.stringify(payload)})}};function setOptionalSearchParam(url,key,value){typeof value=="string"&&value.trim().length>0&&url.searchParams.set(key,value)}function setOptionalBooleanSearchParam(url,key,value){typeof value=="boolean"&&url.searchParams.set(key,value?"true":"false")}function resolveRelativeOrAbsoluteUrl(pathOrUrl,baseUrl){return new URL(pathOrUrl,baseUrl)}function createPlatformSdk(options){return new PlatformSdk(options)}var NotificationSdkNamespace=class{sdk;endUser;constructor(sdk){this.sdk=sdk,this.endUser=new EndUserNotificationNamespace(sdk)}},EndUserNotificationNamespace=class{sdk;constructor(sdk){this.sdk=sdk}forApp(appId){return new EndUserNotificationAppClient(this.sdk,appId)}},EndUserNotificationAppClient=class{sdk;appId;announcements;constructor(sdk,appId){this.sdk=sdk,this.appId=appId,this.announcements=new EndUserNotificationAppAnnouncementsClient(sdk,appId)}listUsers(){return this.sdk.listTenantAppEndUsers(this.appId)}forUser(endUserId){return new EndUserNotificationUserClient(this.sdk,this.appId,endUserId)}listInbox(endUserId,query={}){return this.sdk.listEndUserNotificationInbox(this.appId,{end_user_id:endUserId,...query})}getUnreadCount(endUserId){return this.sdk.getEndUserNotificationUnreadCount(this.appId,endUserId)}publish(input){return this.sdk.publishEndUserNotification(this.appId,{recipient:buildDirectEndUserRecipientRef(this.appId,input.end_user_id),title:input.title,body:input.body??null,notification_type:input.notification_type??"notification",object_ref:input.object_ref,action_ref:input.action_ref,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("publish",this.appId,input.end_user_id),deliver_to:input.deliver_to})}remind(input){return this.sdk.createEndUserNotificationReminder(this.appId,{recipient:buildDirectEndUserRecipientRef(this.appId,input.end_user_id),remind_at:input.remind_at,title:input.title,body:input.body??null,object_ref:input.object_ref,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("reminder",this.appId,input.end_user_id)})}projectTask(input){return this.sdk.projectEndUserTaskNotification(this.appId,{recipient:buildDirectEndUserRecipientRef(this.appId,input.end_user_id),source_task_ref:input.source_task_ref,title:input.title,summary:input.summary??null,due_at:input.due_at??null,source_event_id:input.source_event_id??null,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("task-projection",this.appId,input.end_user_id)})}},EndUserNotificationAppAnnouncementsClient=class{sdk;appId;constructor(sdk,appId){this.sdk=sdk,this.appId=appId}getConfig(){return this.sdk.getAppNotificationConfig(this.appId)}list(limit){return this.sdk.listAppNotificationAnnouncements(this.appId,{limit})}create(input){return this.sdk.createAppNotificationAnnouncement(this.appId,input)}archive(announcementId){return this.sdk.archiveAppNotificationAnnouncement(this.appId,announcementId)}},EndUserNotificationUserClient=class{sdk;appId;endUserId;constructor(sdk,appId,endUserId){this.sdk=sdk,this.appId=appId,this.endUserId=endUserId}buildRecipientRef(){return buildDirectEndUserRecipientRef(this.appId,this.endUserId)}listInbox(query={}){return this.sdk.listEndUserNotificationInbox(this.appId,{end_user_id:this.endUserId,...query})}getUnreadCount(){return this.sdk.getEndUserNotificationUnreadCount(this.appId,this.endUserId)}publish(input){return this.sdk.publishEndUserNotification(this.appId,{recipient:this.buildRecipientRef(),title:input.title,body:input.body??null,notification_type:input.notification_type??"notification",object_ref:input.object_ref,action_ref:input.action_ref,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("publish",this.appId,this.endUserId),deliver_to:input.deliver_to})}remind(input){return this.sdk.createEndUserNotificationReminder(this.appId,{recipient:this.buildRecipientRef(),remind_at:input.remind_at,title:input.title,body:input.body??null,object_ref:input.object_ref,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("reminder",this.appId,this.endUserId)})}projectTask(input){return this.sdk.projectEndUserTaskNotification(this.appId,{recipient:this.buildRecipientRef(),source_task_ref:input.source_task_ref,title:input.title,summary:input.summary??null,due_at:input.due_at??null,source_event_id:input.source_event_id??null,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("task-projection",this.appId,this.endUserId)})}};function buildDirectEndUserRecipientRef(appId,endUserId){return{app_id:appId,end_user_id:endUserId,recipient_type:"direct_user"}}function buildNotificationIdempotencyKey(prefix,appId,endUserId){return`${prefix}:${appId}:${endUserId}:${Date.now()}`}var AUTH_PAGE_HTML=String.raw`<!doctype html>
2
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));var require_punycode=__commonJS({"../../node_modules/.pnpm/punycode.js@2.3.1/node_modules/punycode.js/punycode.js"(exports,module){"use strict";var regexPunycode=/^xn--/,regexNonASCII=/[^\0-\x7F]/,regexSeparators=/[\x2E\u3002\uFF0E\uFF61]/g,errors={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=35,floor=Math.floor,stringFromCharCode=String.fromCharCode;function error(type){throw new RangeError(errors[type])}function map(array,callback){let result=[],length=array.length;for(;length--;)result[length]=callback(array[length]);return result}function mapDomain(domain,callback){let parts=domain.split("@"),result="";parts.length>1&&(result=parts[0]+"@",domain=parts[1]),domain=domain.replace(regexSeparators,".");let labels=domain.split("."),encoded=map(labels,callback).join(".");return result+encoded}function ucs2decode(string){let output=[],counter=0,length=string.length;for(;counter<length;){let value=string.charCodeAt(counter++);if(value>=55296&&value<=56319&&counter<length){let extra=string.charCodeAt(counter++);(extra&64512)==56320?output.push(((value&1023)<<10)+(extra&1023)+65536):(output.push(value),counter--)}else output.push(value)}return output}var ucs2encode=codePoints=>String.fromCodePoint(...codePoints),basicToDigit=function(codePoint){return codePoint>=48&&codePoint<58?26+(codePoint-48):codePoint>=65&&codePoint<91?codePoint-65:codePoint>=97&&codePoint<123?codePoint-97:36},digitToBasic=function(digit,flag){return digit+22+75*(digit<26)-((flag!=0)<<5)},adapt=function(delta,numPoints,firstTime){let k=0;for(delta=firstTime?floor(delta/700):delta>>1,delta+=floor(delta/numPoints);delta>baseMinusTMin*26>>1;k+=36)delta=floor(delta/baseMinusTMin);return floor(k+(baseMinusTMin+1)*delta/(delta+38))},decode2=function(input){let output=[],inputLength=input.length,i=0,n=128,bias=72,basic=input.lastIndexOf("-");basic<0&&(basic=0);for(let j=0;j<basic;++j)input.charCodeAt(j)>=128&&error("not-basic"),output.push(input.charCodeAt(j));for(let index=basic>0?basic+1:0;index<inputLength;){let oldi=i;for(let w=1,k=36;;k+=36){index>=inputLength&&error("invalid-input");let digit=basicToDigit(input.charCodeAt(index++));digit>=36&&error("invalid-input"),digit>floor((2147483647-i)/w)&&error("overflow"),i+=digit*w;let t=k<=bias?1:k>=bias+26?26:k-bias;if(digit<t)break;let baseMinusT=36-t;w>floor(2147483647/baseMinusT)&&error("overflow"),w*=baseMinusT}let out=output.length+1;bias=adapt(i-oldi,out,oldi==0),floor(i/out)>2147483647-n&&error("overflow"),n+=floor(i/out),i%=out,output.splice(i++,0,n)}return String.fromCodePoint(...output)},encode2=function(input){let output=[];input=ucs2decode(input);let inputLength=input.length,n=128,delta=0,bias=72;for(let currentValue of input)currentValue<128&&output.push(stringFromCharCode(currentValue));let basicLength=output.length,handledCPCount=basicLength;for(basicLength&&output.push("-");handledCPCount<inputLength;){let m=2147483647;for(let currentValue of input)currentValue>=n&&currentValue<m&&(m=currentValue);let handledCPCountPlusOne=handledCPCount+1;m-n>floor((2147483647-delta)/handledCPCountPlusOne)&&error("overflow"),delta+=(m-n)*handledCPCountPlusOne,n=m;for(let currentValue of input)if(currentValue<n&&++delta>2147483647&&error("overflow"),currentValue===n){let q=delta;for(let k=36;;k+=36){let t=k<=bias?1:k>=bias+26?26:k-bias;if(q<t)break;let qMinusT=q-t,baseMinusT=36-t;output.push(stringFromCharCode(digitToBasic(t+qMinusT%baseMinusT,0))),q=floor(qMinusT/baseMinusT)}output.push(stringFromCharCode(digitToBasic(q,0))),bias=adapt(delta,handledCPCountPlusOne,handledCPCount===basicLength),delta=0,++handledCPCount}++delta,++n}return output.join("")},toUnicode=function(input){return mapDomain(input,function(string){return regexPunycode.test(string)?decode2(string.slice(4).toLowerCase()):string})},toASCII=function(input){return mapDomain(input,function(string){return regexNonASCII.test(string)?"xn--"+encode2(string):string})},punycode2={version:"2.3.1",ucs2:{decode:ucs2decode,encode:ucs2encode},decode:decode2,encode:encode2,toASCII,toUnicode};module.exports=punycode2}});import{existsSync as existsSync28,readFileSync as readFileSync29,rmSync as rmSync7}from"node:fs";import{join as join24,resolve as resolve19}from"node:path";import process7 from"node:process";async function batchUpdateTenantCmsItems(args){let collection=args.payload.collection.trim(),itemIds=Array.from(new Set(args.payload.item_ids.map(itemId=>itemId.trim()).filter(Boolean))),tagAdds=dedupeTags(args.payload.changes.tags.add),discover=await args.sdk.discoverTenantCmsCollection(collection),schemaSpec=discover.active_schema??discover.draft_schema;if(!schemaSpec)throw new Error(`Collection \`${collection}\` \u5F53\u524D\u6CA1\u6709\u53EF\u7528 schema\u3002`);let succeeded=[],failed=[];for(let itemId of itemIds){let title=itemId;try{let item=await args.sdk.getTenantCmsItem({collection,id:itemId});title=resolveCmsItemTitle(item);let currentStatus=item.system.publish_status??"draft",targetStatus=args.payload.changes.publish_status.mode==="set"?args.payload.changes.publish_status.value:void 0,hasCategoryChange=args.payload.changes.category.mode!=="keep",hasTagChange=tagAdds.length>0,hasMetadataChange=hasCategoryChange||hasTagChange,effectiveStatus=currentStatus;if(hasMetadataChange){currentStatus==="archived"&&targetStatus&&targetStatus!=="archived"&&(await args.sdk.applyTenantCmsPublish({collection,item_id:itemId,target_status:targetStatus}),effectiveStatus=targetStatus);let payload=buildCmsItemWritePayloadFromDelivery({item,schemaSpec,publishStatus:targetStatus&&targetStatus!=="archived"?targetStatus:effectiveStatus,categoryChange:args.payload.changes.category,tagsToAdd:tagAdds});await args.sdk.configureTenantCmsItem({...payload,item_id:itemId}),targetStatus==="archived"&&effectiveStatus!=="archived"?await args.sdk.applyTenantCmsPublish({collection,item_id:itemId,target_status:"archived"}):targetStatus&&targetStatus!=="archived"&&(effectiveStatus=targetStatus)}else targetStatus&&targetStatus!==effectiveStatus&&await args.sdk.applyTenantCmsPublish({collection,item_id:itemId,target_status:targetStatus});succeeded.push({item_id:itemId,title})}catch(error){failed.push({item_id:itemId,title,message:error instanceof Error?error.message:"\u6279\u91CF\u66F4\u65B0\u5931\u8D25"})}}return{total:itemIds.length,succeeded,failed}}function buildCmsItemWritePayloadFromDelivery(args){let nextTags=dedupeTags([...args.item.system.tags??[],...args.tagsToAdd]);return{collection:args.item.collection,system:{publish_status:args.publishStatus,...args.item.system.slug?{slug:args.item.system.slug}:{},featured:args.item.system.featured??!1,tags:nextTags,category_id:resolveNextCategoryId(args.item,args.categoryChange),...args.item.system.content_format?{content_format:args.item.system.content_format}:{},...args.item.system.source?{source:{...args.item.system.source}}:{}},content:normalizeCmsContentForWrite(args.item.content,args.schemaSpec.fields)}}function resolveNextCategoryId(item,categoryChange){return categoryChange.mode==="clear"?null:categoryChange.mode==="set"?categoryChange.category_id?.trim()||null:item.system.category_id??null}function resolveCmsItemTitle(item){let title=item.content.title,name=item.content.name;return typeof title=="string"&&title.trim()?title.trim():typeof name=="string"&&name.trim()?name.trim():item.system.slug??item.system.id??"Untitled item"}function dedupeTags(values){let seen=new Set,next=[];for(let value of values){let normalized=value.trim();if(!normalized)continue;let lowered=normalized.toLowerCase();seen.has(lowered)||(seen.add(lowered),next.push(normalized))}return next}function normalizeCmsContentForWrite(content,fields){let normalized={};for(let field of fields)normalized[field.name]=normalizeFieldValueForPayload(field,content[field.name]);return normalized}function normalizeFieldValueForPayload(field,value){switch(field.type){case"date":if(typeof value=="string"){let normalized=value.trim();return normalized.length>0?normalized:null}return value??null;case"number":if(typeof value=="string"){let parsed=Number.parseFloat(value.trim());return Number.isFinite(parsed)?field.ui?.number_kind==="integer"?Math.trunc(parsed):parsed:0}return value;case"bool":return!!value;case"multi_select":return normalizeStringArrayValue(value);case"image":case"file":return normalizeAssetValue(value);case"images":case"files":return normalizeAssetArrayValue(value);case"relation":return normalizeRelationId(value);case"relations":return normalizeRelationArrayValue(value);default:return typeof value=="string"?value:value??""}}function normalizeRelationId(value){if(typeof value=="string"){let normalized=value.trim();return normalized.length>0?normalized:null}if(value&&typeof value=="object"&&!Array.isArray(value)&&"id"in value){let id=value.id;return typeof id=="string"&&id.trim().length>0?id.trim():null}return null}function normalizeAssetValue(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:null}function normalizeStringArrayValue(value){return Array.isArray(value)?value.map(item=>String(item)):typeof value=="string"?value.split(",").map(item=>item.trim()).filter(Boolean):[]}function normalizeAssetArrayValue(value){return Array.isArray(value)?value.filter(item=>!!item&&typeof item=="object"&&!Array.isArray(item)):[]}function normalizeRelationArrayValue(value){return Array.isArray(value)?value.map(item=>normalizeRelationId(item)).filter(item=>!!item):[]}import{createHash}from"node:crypto";import{URL as URL2}from"node:url";var IMAGE_URL_ATTRS=["src","data-src","data-original","data-original-src","data-lazy-src"],IMAGE_SRCSET_ATTRS=["srcset","data-srcset"];function trimToUndefined(value){let normalized=value?.trim();return normalized||void 0}function normalizeUrl(value,baseUrl){let trimmed=trimToUndefined(value);if(trimmed)try{return baseUrl?new URL2(trimmed,baseUrl).toString():new URL2(trimmed).toString()}catch{return}}function isPlatformHostedAssetUrl(value){try{let parsed=new URL2(value);return/^\/assets\/[^/]+\/(original|variants\/[^/]+)$/.test(parsed.pathname)||parsed.pathname.startsWith("/api/tenant/assets/")}catch{return!1}}function inferMimeTypeFromUrl(value){if(!value)return;let pathname=(()=>{try{return new URL2(value).pathname.toLowerCase()}catch{return value.toLowerCase()}})();if(pathname.endsWith(".png"))return"image/png";if(pathname.endsWith(".webp"))return"image/webp";if(pathname.endsWith(".gif"))return"image/gif";if(pathname.endsWith(".svg"))return"image/svg+xml";if(pathname.endsWith(".jpg")||pathname.endsWith(".jpeg"))return"image/jpeg";if(pathname.endsWith(".avif"))return"image/avif"}function computeChecksum(content){return`sha256:${createHash("sha256").update(content).digest("hex")}`}function inferRemoteImageFileName(url,mimeType){let lastSegment=(()=>{try{return new URL2(url).pathname}catch{return url}})().split("/").filter(Boolean).at(-1);return lastSegment&&/\.[a-z0-9]{2,6}$/i.test(lastSegment)?decodeURIComponent(lastSegment):`remote-image.${(()=>{switch(mimeType){case"image/png":return"png";case"image/webp":return"webp";case"image/gif":return"gif";case"image/svg+xml":return"svg";case"image/avif":return"avif";case"image/jpeg":default:return"jpg"}})()}`}function buildTenantAssetReference(asset){return{asset_id:asset.asset.asset_id,title:asset.asset.title,media_type:asset.asset.media_type,mime_type:asset.asset.mime_type,size_bytes:asset.original_file.size_bytes,folder_id:asset.asset.folder_id,original_url:asset.original_url,variant_urls:asset.variant_urls}}function replaceImageAttributeUrls(html,replacementsByUrl,attribute2){let pattern=new RegExp(`(<img\\b[^>]*?\\s${attribute2}\\s*=\\s*)(["'])(.*?)\\2`,"gi");return html.replace(pattern,(fullMatch,prefix,quote,rawUrl)=>{let replacement=replacementsByUrl.get(rawUrl);return!replacement||replacement.finalUrl===rawUrl?fullMatch:`${prefix}${quote}${replacement.finalUrl}${quote}`})}function stripImageAttributes(html,attributes){let nextHtml=html;for(let attribute2 of attributes){let pattern=new RegExp(`\\s${attribute2}\\s*=\\s*(["']).*?\\1`,"gi");nextHtml=nextHtml.replace(pattern,"")}return nextHtml}async function fetchRemoteImageBinary(args){let response=await(args.fetchImpl??fetch)(args.url,{headers:{accept:"image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8"}});if(!response.ok)throw new Error(`\u56FE\u7247\u62C9\u53D6\u5931\u8D25\uFF08HTTP ${response.status}\uFF09`);let normalizedMimeType=String(response.headers.get("content-type")??"").split(";")[0]?.trim().toLowerCase()||inferMimeTypeFromUrl(args.url);if(!normalizedMimeType||!normalizedMimeType.startsWith("image/"))throw new Error("\u8FDC\u7A0B\u8D44\u6E90\u4E0D\u662F\u53D7\u652F\u6301\u7684\u56FE\u7247\u7C7B\u578B");let content=new Uint8Array(await response.arrayBuffer()),maxBytes=args.maxBytes??20*1024*1024;if(content.byteLength===0)throw new Error("\u8FDC\u7A0B\u56FE\u7247\u5185\u5BB9\u4E3A\u7A7A");if(content.byteLength>maxBytes)throw new Error(`\u8FDC\u7A0B\u56FE\u7247\u8D85\u8FC7\u5927\u5C0F\u9650\u5236\uFF08${content.byteLength} bytes\uFF09`);return{content,mimeType:normalizedMimeType}}async function ingestRemoteImageCandidates(args){let uniqueCandidates=new Map;for(let candidate of args.candidates)uniqueCandidates.has(candidate.url)||uniqueCandidates.set(candidate.url,candidate);let resultsByUrl=new Map,resultsByChecksum=new Map,warnings=[];for(let candidate of uniqueCandidates.values())try{let{content,mimeType}=await fetchRemoteImageBinary({url:candidate.url,fetchImpl:args.fetchImpl,maxBytes:args.maxBytes}),checksum3=computeChecksum(content),existingByChecksum=resultsByChecksum.get(checksum3);if(existingByChecksum){let reused={...existingByChecksum,originalUrl:candidate.url,status:"reused"};resultsByUrl.set(candidate.url,reused);continue}let fileName=inferRemoteImageFileName(candidate.url,mimeType),uploadedAsset=await args.sdk.createTenantAssetBinary({fileName,mimeType,content,title:candidate.title,...args.folderId?{folderId:args.folderId}:{}}),uploaded={originalUrl:candidate.url,finalUrl:uploadedAsset.original_url,asset:uploadedAsset,assetReference:buildTenantAssetReference(uploadedAsset),mimeType,checksum:checksum3,status:"uploaded"};resultsByUrl.set(candidate.url,uploaded),resultsByChecksum.set(checksum3,uploaded)}catch(error){let message=error instanceof Error?error.message:"\u5916\u94FE\u56FE\u7247\u8D44\u4EA7\u5316\u5931\u8D25";warnings.push(`\u56FE\u7247 \`${candidate.url}\` \u8D44\u4EA7\u5316\u5931\u8D25\uFF0C\u5DF2\u56DE\u9000\u539F\u94FE\u63A5\uFF1A${message}`),resultsByUrl.set(candidate.url,{originalUrl:candidate.url,finalUrl:candidate.url,mimeType:inferMimeTypeFromUrl(candidate.url),status:"fallback",warning:message})}return{resultsByUrl,warnings}}function collectExternalImageCandidatesFromHtml(args){let candidates=new Map;return args.html.replace(/<img\b[^>]*>/gi,tag=>{for(let attribute2 of IMAGE_URL_ATTRS){let rawUrl=tag.match(new RegExp(`(?:^|\\s)${attribute2}\\s*=\\s*(["'])(.*?)\\1`,"i"))?.[2],normalizedUrl=normalizeUrl(rawUrl,args.baseUrl);!normalizedUrl||normalizedUrl.startsWith("data:")||isPlatformHostedAssetUrl(normalizedUrl)||candidates.has(normalizedUrl)||candidates.set(normalizedUrl,{url:normalizedUrl,title:args.title,source:"body"})}return""}),[...candidates.values()]}async function assetizeExternalImagesInHtml(args){let bodyCandidates=collectExternalImageCandidatesFromHtml({html:args.html,baseUrl:args.baseUrl,title:args.bodyTitle}),normalizedCoverUrl=normalizeUrl(args.coverUrl,args.baseUrl),coverCandidate=normalizedCoverUrl&&!normalizedCoverUrl.startsWith("data:")&&!isPlatformHostedAssetUrl(normalizedCoverUrl)?{url:normalizedCoverUrl,title:args.coverTitle??args.bodyTitle,source:"cover"}:null,candidates=coverCandidate?[coverCandidate,...bodyCandidates]:bodyCandidates,{resultsByUrl,warnings}=await ingestRemoteImageCandidates({sdk:args.sdk,candidates,folderId:args.folderId,fetchImpl:args.fetchImpl,maxBytes:args.maxBytes}),html=args.html;for(let attribute2 of IMAGE_URL_ATTRS)html=replaceImageAttributeUrls(html,resultsByUrl,attribute2);html=stripImageAttributes(html,IMAGE_SRCSET_ATTRS);let replacements=[...resultsByUrl.values()].map(result=>({originalUrl:result.originalUrl,finalUrl:result.finalUrl,...result.asset?.asset.asset_id?{assetId:result.asset.asset.asset_id}:{},status:result.status}));if(!normalizedCoverUrl)return{html,cover:{mode:"none"},replacements,warnings};let coverResult=resultsByUrl.get(normalizedCoverUrl);return coverResult?.assetReference?{html,cover:{mode:"asset",value:coverResult.assetReference},replacements,warnings}:{html,cover:{mode:"remote",value:{title:args.coverTitle??args.bodyTitle??"Remote cover",...coverResult?.mimeType||args.coverMimeType?{mime_type:coverResult?.mimeType??args.coverMimeType}:{},original_url:normalizedCoverUrl}},replacements,warnings}}var PlatformApiError=class extends Error{status;code;detail;requestId;capability;category;remediation;constructor(message,status,code2,detail,requestId,capability,category,remediation){super(message),this.status=status,this.code=code2,this.detail=detail,this.requestId=requestId,this.capability=capability,this.category=category,this.remediation=remediation,this.name="PlatformApiError"}},BasePlatformSdk=class{options;fetchImpl;constructor(options){this.options=options,this.fetchImpl=options.fetchImpl??fetch}async request(path3,init={}){return this.requestUrl(new URL(path3,this.options.baseUrl),init)}async requestBinary(path3,init={}){return this.requestBinaryUrl(new URL(path3,this.options.baseUrl),init)}async requestVoid(path3,init={}){return this.requestVoidUrl(new URL(path3,this.options.baseUrl),init)}async requestUrl(url,init={}){let response=await this.fetchResponse(url,init),payload=await parseJsonResponse(response);if(!response.ok){let errorPayload=payload,error=errorPayload.error;throw new PlatformApiError(error?.message??`Request failed: ${response.status}`,response.status,error?.code,error?.detail??errorPayload.detail,errorPayload.request_id,error?.capability,error?.category,error?.remediation)}return payload}async requestBinaryUrl(url,init={}){let response=await this.fetchResponse(url,init);if(!response.ok){let payload=await parseJsonResponse(response),error=payload.error;throw new PlatformApiError(error?.message??`Request failed: ${response.status}`,response.status,error?.code,error?.detail??payload.detail,payload.request_id,error?.capability,error?.category,error?.remediation)}return new Uint8Array(await response.arrayBuffer())}async requestVoidUrl(url,init={}){let response=await this.fetchResponse(url,init);if(!response.ok){let payload=await parseJsonResponse(response),error=payload.error;throw new PlatformApiError(error?.message??`Request failed: ${response.status}`,response.status,error?.code,error?.detail??payload.detail,payload.request_id,error?.capability,error?.category,error?.remediation)}}async fetchResponse(url,init={}){let headers=new Headers(init.headers);!headers.has("Content-Type")&&init.body&&headers.set("Content-Type","application/json");let extraHeaders=await this.options.getHeaders?.();return extraHeaders&&new Headers(extraHeaders).forEach((value,key)=>{headers.set(key,value)}),this.fetchImpl(url,{...init,headers})}};async function parseJsonResponse(response){let text2=await response.text();if(text2.trim().length===0)return{};try{return JSON.parse(text2)}catch{if(response.ok)return{};throw new PlatformApiError(`Request failed with non-JSON response: ${response.status}`,response.status,"non_json_response",{content_type:response.headers.get("content-type")??void 0,body_preview:text2.replace(/\s+/g," ").slice(0,240)})}}var PlatformSdk=class extends BasePlatformSdk{notification;constructor(options){super(options),this.notification=new NotificationSdkNamespace(this)}async listNotificationInbox(filters={}){let url=new URL("/api/tenant/notification/inbox",this.options.baseUrl);return setOptionalSearchParam(url,"app_id",filters.app_id),setOptionalSearchParam(url,"inbox_type",filters.inbox_type),setOptionalSearchParam(url,"status",filters.status),typeof filters.limit=="number"&&Number.isFinite(filters.limit)&&url.searchParams.set("limit",String(filters.limit)),this.request(`${url.pathname}${url.search}`)}async updateNotificationInboxItemStatus(itemId,payload){return(await this.request(`/api/tenant/notification/inbox/${encodeURIComponent(itemId)}`,{method:"PATCH",body:JSON.stringify(payload)})).item}async batchUpdateNotificationInboxItemsStatus(payload){return this.request("/api/tenant/notification/inbox:batch",{method:"PATCH",body:JSON.stringify(payload)})}async listNotificationDeliveries(filters={}){let url=new URL("/api/tenant/notification/deliveries",this.options.baseUrl);return setOptionalSearchParam(url,"app_id",filters.app_id),setOptionalSearchParam(url,"status",filters.status),(await this.request(`${url.pathname}${url.search}`)).items}async announcePlatformNotification(payload){return(await this.request("/api/admin/notification/announcements/platform",{method:"POST",body:JSON.stringify(payload)})).item}async announceAppNotification(appId,payload){return(await this.request(`/api/tenant/notification/apps/${encodeURIComponent(appId)}/announcements`,{method:"POST",body:JSON.stringify(payload)})).item}async getAppNotificationConfig(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/config`)}async listAppNotificationAnnouncements(appId,options={}){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/announcements`,this.options.baseUrl);return typeof options.limit=="number"&&Number.isFinite(options.limit)&&url.searchParams.set("limit",String(options.limit)),this.request(`${url.pathname}${url.search}`)}async createAppNotificationAnnouncement(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/announcements`,{method:"POST",body:JSON.stringify(payload)})}async archiveAppNotificationAnnouncement(appId,announcementId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/announcements/${encodeURIComponent(announcementId)}:archive`,{method:"POST"})}async publishEndUserNotification(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/publish`,{method:"POST",body:JSON.stringify(payload)})}async createEndUserNotificationReminder(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/reminders`,{method:"POST",body:JSON.stringify(payload)})}async projectEndUserTaskNotification(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/task-projections`,{method:"POST",body:JSON.stringify(payload)})}async listEndUserNotificationInbox(appId,query){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/inbox`,this.options.baseUrl);return url.searchParams.set("end_user_id",query.end_user_id),setOptionalSearchParam(url,"status",query.status),setOptionalSearchParam(url,"inbox_type",query.inbox_type),typeof query.limit=="number"&&Number.isFinite(query.limit)&&url.searchParams.set("limit",String(query.limit)),this.request(`${url.pathname}${url.search}`)}async getEndUserNotificationUnreadCount(appId,endUserId){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/notification/agent/unread-count`,this.options.baseUrl);return url.searchParams.set("end_user_id",endUserId),this.request(`${url.pathname}${url.search}`)}async createWorkflowDefinition(payload){return(await this.request("/api/workflow/definitions",{method:"POST",body:JSON.stringify(payload)})).item}async listWorkflowTemplates(){return(await this.request("/api/workflow/templates")).items}async listWorkflowDefinitions(filters={}){let url=new URL("/api/workflow/definitions",this.options.baseUrl);return setOptionalSearchParam(url,"target_id",filters.target_id),setOptionalSearchParam(url,"status",filters.status),(await this.request(`${url.pathname}${url.search}`)).items}async listWorkflowBindings(filters={}){let url=new URL("/api/workflow/bindings",this.options.baseUrl);return setOptionalSearchParam(url,"target_id",filters.target_id),setOptionalSearchParam(url,"definition_key",filters.definition_key),(await this.request(`${url.pathname}${url.search}`)).items}async updateWorkflowDefinitionMetadata(payload){return(await this.request(`/api/workflow/definitions/${encodeURIComponent(payload.definition_key)}`,{method:"PATCH",body:JSON.stringify(payload)})).item}async saveWorkflowRoleBindings(payload){return(await this.request(`/api/workflow/definitions/${encodeURIComponent(payload.definition_key)}/role-bindings`,{method:"POST",body:JSON.stringify(payload)})).items}async getWorkflowBindingOverride(args){let url=new URL(`/api/workflow/definitions/${encodeURIComponent(args.definition_key)}/binding-override`,this.options.baseUrl);return setOptionalSearchParam(url,"target_scope",args.target_scope),setOptionalSearchParam(url,"target_id",args.target_id),(await this.request(`${url.pathname}${url.search}`)).item}async saveWorkflowBindingOverride(payload){return(await this.request(`/api/workflow/definitions/${encodeURIComponent(payload.definition_key)}/binding-override`,{method:"POST",body:JSON.stringify(payload)})).item}async listWorkflowRoleBindings(args){let url=new URL(`/api/workflow/definitions/${encodeURIComponent(args.definition_key)}/role-bindings`,this.options.baseUrl);return setOptionalSearchParam(url,"target_scope",args.target_scope),setOptionalSearchParam(url,"target_id",args.target_id),(await this.request(`${url.pathname}${url.search}`)).items}async startWorkflow(payload){return(await this.request("/api/workflow/instances/start",{method:"POST",body:JSON.stringify(payload)})).item}async performWorkflowAction(instanceId,payload){return(await this.request(`/api/workflow/instances/${encodeURIComponent(instanceId)}/actions`,{method:"POST",body:JSON.stringify(payload)})).item}async getWorkflowInstance(instanceId){return(await this.request(`/api/workflow/instances/${encodeURIComponent(instanceId)}`)).item}async listWorkflowTasks(filters={}){let url=new URL("/api/workflow/tasks",this.options.baseUrl);return setOptionalSearchParam(url,"app_id",filters.app_id),setOptionalSearchParam(url,"status",filters.status),(await this.request(`${url.pathname}${url.search}`)).items}async getWhoAmI(){return this.request("/api/auth/whoami")}async getResolvedPermissions(){return this.request("/api/auth/permissions")}async switchTenantContext(payload){return this.request("/api/auth/context/switch-tenant",{method:"POST",body:JSON.stringify(payload)})}async listTenantWorkspaces(){return this.request("/api/auth/workspaces")}async ensurePersonalWorkspace(){return this.request("/api/auth/workspaces/ensure-personal",{method:"POST"})}async getAdminOverview(){return this.request("/api/admin/overview")}async listAdminWorkbenchEntries(){return this.request("/api/admin/workbench-entries")}async getAdminWorkbenchEntryDetail(entryKey){return this.request(`/api/admin/workbench-entries/${encodeURIComponent(entryKey)}`)}async updateAdminWorkbenchEntryVisibility(entryKey,payload){return this.request(`/api/admin/workbench-entries/${encodeURIComponent(entryKey)}/visibility`,{method:"PUT",body:JSON.stringify(payload)})}async resetAdminWorkbenchEntryVisibility(entryKey){return this.request(`/api/admin/workbench-entries/${encodeURIComponent(entryKey)}/visibility`,{method:"DELETE"})}async previewAdminWorkbenchEntryVisibility(entryKey,payload){return this.request(`/api/admin/workbench-entries/${encodeURIComponent(entryKey)}/visibility:preview`,{method:"POST",body:JSON.stringify(payload)})}async createTenantAsset(payload){return this.request("/api/tenant/assets",{method:"POST",body:JSON.stringify(payload)})}async createTenantAssetBinary(args){let headers=new Headers({"Content-Type":args.mimeType,"X-Asset-File-Name":encodeURIComponent(args.fileName)});return args.title?.trim()&&headers.set("X-Asset-Title",encodeURIComponent(args.title.trim())),args.folderId?.trim()&&headers.set("X-Asset-Folder-Id",encodeURIComponent(args.folderId.trim())),this.request("/api/tenant/assets/upload",{method:"POST",headers,body:Buffer.from(args.content)})}async listTenantAssets(filters={}){let url=new URL("/api/tenant/assets",this.options.baseUrl);return setOptionalSearchParam(url,"q",filters.q),setOptionalSearchParam(url,"media_type",filters.media_type),setOptionalSearchParam(url,"mime_type",filters.mime_type),setOptionalSearchParam(url,"folder_id",filters.folder_id),setOptionalSearchParam(url,"tag_ids",filters.tag_ids?.join(",")),setOptionalSearchParam(url,"scene",filters.scene),setOptionalSearchParam(url,"objects",filters.objects?.join(",")),setOptionalSearchParam(url,"safety_flags",filters.safety_flags?.join(",")),setOptionalSearchParam(url,"orientation",filters.orientation),setOptionalBooleanSearchParam(url,"has_ocr",filters.has_ocr),setOptionalBooleanSearchParam(url,"has_person",filters.has_person),setOptionalBooleanSearchParam(url,"is_svg",filters.is_svg),typeof filters.page=="number"&&Number.isFinite(filters.page)&&url.searchParams.set("page",String(filters.page)),typeof filters.limit=="number"&&Number.isFinite(filters.limit)&&url.searchParams.set("limit",String(filters.limit)),this.request(`${url.pathname}${url.search}`)}async getTenantAsset(assetId){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}`)}async deleteTenantAsset(assetId){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}`,{method:"DELETE"})}async batchUpdateTenantAssets(payload){return this.request("/api/tenant/assets/batch",{method:"POST",body:JSON.stringify(payload)})}async listTenantAssetFolders(){return this.request("/api/tenant/assets/folders")}async createTenantAssetFolder(payload){return this.request("/api/tenant/assets/folders",{method:"POST",body:JSON.stringify(payload)})}async updateTenantAssetFolderMetadata(folderId,payload){return this.request(`/api/tenant/assets/folders/${encodeURIComponent(folderId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async deleteTenantAssetFolder(folderId){return this.request(`/api/tenant/assets/folders/${encodeURIComponent(folderId)}`,{method:"DELETE"})}async moveTenantAssetFolder(folderId,direction){return this.request(`/api/tenant/assets/folders/${encodeURIComponent(folderId)}/move-${direction}`,{method:"POST"})}async updateTenantAssetFolder(assetId,payload){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}/folder`,{method:"PATCH",body:JSON.stringify(payload)})}async updateTenantAssetMetadata(assetId,payload){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}/metadata`,{method:"PATCH",body:JSON.stringify(payload)})}async listTenantAssetTags(options){let url=new URL("/api/tenant/assets/tags",this.options.baseUrl);return options?.assetId&&url.searchParams.set("asset_id",options.assetId),this.request(`${url.pathname}${url.search}`)}async addTenantAssetTag(assetId,payload){return this.request(`/api/tenant/assets/${encodeURIComponent(assetId)}/tags`,{method:"POST",body:JSON.stringify(payload)})}async removeTenantAssetTag(assetId,label){let url=new URL(`/api/tenant/assets/${encodeURIComponent(assetId)}/tags`,this.options.baseUrl);return url.searchParams.set("label",label),this.request(`${url.pathname}${url.search}`,{method:"DELETE"})}async downloadTenantAssetOriginal(assetId){return this.requestBinary(`/api/tenant/assets/${encodeURIComponent(assetId)}/original`)}async downloadTenantAssetVariant(assetId,variantKind){return this.requestBinary(`/assets/${encodeURIComponent(assetId)}/variants/${encodeURIComponent(variantKind)}`)}async createTenantBlobUploadSession(payload){return this.request("/api/tenant/blobs/upload-sessions",{method:"POST",body:JSON.stringify(payload)})}async uploadTenantBlobBinary(uploadSessionId,payload){let url=resolveRelativeOrAbsoluteUrl(payload.upload_url??`/api/tenant/blobs/upload-sessions/${encodeURIComponent(uploadSessionId)}/content`,this.options.baseUrl),headers=new Headers(payload.headers);headers.set("Content-Type",payload.content_type?.trim()||"application/octet-stream"),await this.requestVoidUrl(url,{method:"PUT",headers,body:Buffer.from(payload.content)})}async completeTenantBlobUpload(uploadSessionId,payload={}){return this.request(`/api/tenant/blobs/upload-sessions/${encodeURIComponent(uploadSessionId)}/complete`,{method:"POST",body:JSON.stringify(payload)})}async createTenantBlobBinary(args){let contentType=args.contentType?.trim()||"application/octet-stream",session=await this.createTenantBlobUploadSession({original_filename:args.fileName,content_type:contentType,size_bytes:args.content.byteLength,...args.appId?.trim()?{app_id:args.appId.trim()}:{},...args.clientRequestId?.trim()?{client_request_id:args.clientRequestId.trim()}:{}});return await this.uploadTenantBlobBinary(session.upload_session_id,{content:args.content,content_type:contentType,upload_url:session.upload_url,headers:session.headers}),this.completeTenantBlobUpload(session.upload_session_id,{size_bytes:args.content.byteLength,...args.sha256?.trim()?{sha256:args.sha256.trim()}:{}})}async listTenantBlobs(filters={}){let url=new URL("/api/tenant/blobs",this.options.baseUrl);return setOptionalSearchParam(url,"cursor",filters.cursor),setOptionalSearchParam(url,"app_id",filters.app_id??void 0),setOptionalSearchParam(url,"q",filters.q??void 0),typeof filters.limit=="number"&&Number.isFinite(filters.limit)&&url.searchParams.set("limit",String(filters.limit)),this.request(`${url.pathname}${url.search}`)}async getTenantBlob(blobId){return this.request(`/api/tenant/blobs/${encodeURIComponent(blobId)}`)}async issueTenantBlobDownloadUrl(blobId,payload={}){return this.request(`/api/tenant/blobs/${encodeURIComponent(blobId)}/download-url`,{method:"POST",body:JSON.stringify(payload)})}async getTenantOverview(){return this.request("/api/tenant/overview")}async getTenantEffectiveState(){return this.request("/api/tenant/effective-state")}async getTenantWorkbenchNavigation(){return this.request("/api/tenant/workbench/navigation")}async createTenantApp(payload){return this.request("/api/tenant/apps",{method:"POST",body:JSON.stringify(payload)})}async updateTenantApp(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async listAppTemplates(){return this.request("/api/tenant/app-templates")}async createAppTemplate(payload){return this.request("/api/tenant/app-templates",{method:"POST",body:JSON.stringify(payload)})}async getAppTemplate(templateId){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}`)}async openAppTemplatePreview(templateId){return this.requestVoid(`/api/tenant/app-templates/${encodeURIComponent(templateId)}/preview`)}async updateAppTemplateSettings(templateId,payload){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async deleteAppTemplate(templateId,payload={}){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}`,{method:"DELETE",body:JSON.stringify(payload)})}async createAppTemplateInitializationTask(templateId,payload){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}/initialization-tasks`,{method:"POST",body:JSON.stringify(payload)})}async getAppTemplateInitializationTask(taskId){return this.request(`/api/tenant/app-template-initialization-tasks/${encodeURIComponent(taskId)}`)}async createAppMarketSubmission(templateId,payload={}){return this.request(`/api/tenant/app-templates/${encodeURIComponent(templateId)}/market-submissions`,{method:"POST",body:JSON.stringify(payload)})}async cancelAppMarketSubmission(submissionId){return this.request(`/api/tenant/app-market/submissions/${encodeURIComponent(submissionId)}/cancel`,{method:"POST"})}async listTenantAppMarketSubmissions(options){let url=new URL("/api/tenant/app-market/submissions",this.options.baseUrl);return options?.status&&url.searchParams.set("status",options.status),this.request(`${url.pathname}${url.search}`)}async listAppMarketListings(options){let url=new URL("/api/tenant/app-market/listings",this.options.baseUrl);return options?.query&&url.searchParams.set("query",options.query),options?.tag&&url.searchParams.set("tag",options.tag),this.request(`${url.pathname}${url.search}`)}async listAdminAppMarketListings(options){let url=new URL("/api/admin/app-market/listings",this.options.baseUrl);return options?.query&&url.searchParams.set("query",options.query),options?.tag&&url.searchParams.set("tag",options.tag),this.request(`${url.pathname}${url.search}`)}async getAppMarketListing(listingId){return this.request(`/api/tenant/app-market/listings/${encodeURIComponent(listingId)}`)}async openAppMarketSubmissionPreview(submissionId){return this.requestVoid(`/api/tenant/app-market/submissions/${encodeURIComponent(submissionId)}/preview`)}async createAppMarketInstall(listingId,payload){return this.request(`/api/tenant/app-market/listings/${encodeURIComponent(listingId)}/installs`,{method:"POST",body:JSON.stringify(payload)})}async listAdminAppMarketSubmissions(options){let url=new URL("/api/admin/app-market/submissions",this.options.baseUrl);return options?.status&&url.searchParams.set("status",options.status),this.request(`${url.pathname}${url.search}`)}async approveAppMarketSubmission(submissionId){return this.request(`/api/admin/app-market/submissions/${encodeURIComponent(submissionId)}/approve`,{method:"POST"})}async rejectAppMarketSubmission(submissionId,payload={}){return this.request(`/api/admin/app-market/submissions/${encodeURIComponent(submissionId)}/reject`,{method:"POST",body:JSON.stringify(payload)})}async unlistAppMarketListing(listingId,payload={}){return this.request(`/api/admin/app-market/listings/${encodeURIComponent(listingId)}/unlist`,{method:"POST",body:JSON.stringify(payload)})}async publishAppMarketListing(listingId,payload={}){return this.request(`/api/admin/app-market/listings/${encodeURIComponent(listingId)}/publish`,{method:"POST",body:JSON.stringify(payload)})}async listAdminLightAppLibraries(options){let url=new URL("/api/admin/light-app-library/libraries",this.options.baseUrl);return options?.visibility&&url.searchParams.set("visibility",options.visibility),this.request(`${url.pathname}${url.search}`)}async setAdminLightAppLibraryVisibility(libraryId,payload){return this.request(`/api/admin/light-app-library/libraries/${encodeURIComponent(libraryId)}/visibility`,{method:"POST",body:JSON.stringify(payload)})}async listLightAppLibraryEntries(options){let url=new URL("/api/tenant/light-app-library/entries",this.options.baseUrl);return options?.query&&url.searchParams.set("query",options.query),options?.status&&url.searchParams.set("status",options.status),options?.template_key&&url.searchParams.set("template_key",options.template_key),options?.tag&&url.searchParams.set("tag",options.tag),options?.visibility&&url.searchParams.set("visibility",options.visibility),typeof options?.include_public=="boolean"&&url.searchParams.set("include_public",String(options.include_public)),this.request(`${url.pathname}${url.search}`)}async searchLightAppLibraryEntries(query){let url=new URL("/api/tenant/light-app-library/entries/search",this.options.baseUrl);return url.searchParams.set("query",query),this.request(`${url.pathname}${url.search}`)}async getLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}`)}async createLightAppLibraryEntry(payload){return this.request("/api/tenant/light-app-library/entries",{method:"POST",body:JSON.stringify(payload)})}async updateLightAppLibraryEntry(entryId,payload){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async submitLightAppLibraryEntrySnapshot(entryId,payload){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/snapshots`,{method:"POST",body:JSON.stringify(payload)})}async publishLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/publish`,{method:"POST"})}async unpublishLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/unpublish`,{method:"POST"})}async archiveLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/archive`,{method:"POST"})}async deleteLightAppLibraryEntry(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}`,{method:"DELETE"})}async getLightAppLibraryEntrySource(entryId){return this.request(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/source`)}async readLightAppLibraryEntrySourceFile(entryId,path3){let url=new URL(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/source/files`,this.options.baseUrl);return url.searchParams.set("path",path3),this.request(`${url.pathname}${url.search}`)}async searchLightAppLibraryEntrySource(entryId,query){let url=new URL(`/api/tenant/light-app-library/entries/${encodeURIComponent(entryId)}/source/search`,this.options.baseUrl);return url.searchParams.set("query",query),this.request(`${url.pathname}${url.search}`)}async listLightAppPrototypeEntries(options){let url=new URL("/api/tenant/prototypes",this.options.baseUrl);return options?.q&&url.searchParams.set("q",options.q),options?.status&&url.searchParams.set("status",options.status),this.request(`${url.pathname}${url.search}`)}async getLightAppPrototypeEntry(entryId){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}`)}async createLightAppPrototypeEntry(payload){return this.request("/api/tenant/prototypes",{method:"POST",body:JSON.stringify(payload)})}async updateLightAppPrototypeEntry(entryId,payload){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async copyLightAppPrototypeEntry(entryId){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}/copy`,{method:"POST"})}async deleteLightAppPrototypeEntry(entryId){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}`,{method:"DELETE"})}async saveLightAppPrototypeCurrentVersion(entryId,payload){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}/current-version`,{method:"PUT",body:JSON.stringify(payload)})}async submitLightAppPrototypeVersion(entryId,payload){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}/versions`,{method:"POST",body:JSON.stringify(payload)})}async getLightAppPrototypeVersion(entryId,versionId){return this.request(`/api/tenant/prototypes/entries/${encodeURIComponent(entryId)}/versions/${encodeURIComponent(versionId)}`)}async deleteTenantApp(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}`,{method:"DELETE"})}async getTenantAppDeletePreview(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/delete-preview`,{method:"POST"})}async getTenantAppDeleteJob(jobId){return this.request(`/api/tenant/app-delete-jobs/${encodeURIComponent(jobId)}`)}async getTenantAppUndeployPreview(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/undeploy-preview`,{method:"POST"})}async undeployTenantApp(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/undeploy`,{method:"POST"})}async getTenantAppUndeployJob(jobId){return this.request(`/api/tenant/app-undeploy-jobs/${encodeURIComponent(jobId)}`)}async createBuild(payload){return this.request("/api/builds",{method:"POST",body:JSON.stringify(payload)})}async listBuilds(appId,options){let url=new URL("/api/builds",this.options.baseUrl);return url.searchParams.set("app_id",appId),typeof options?.limit=="number"&&Number.isFinite(options.limit)&&url.searchParams.set("limit",String(options.limit)),this.request(`${url.pathname}${url.search}`)}async getBuildPrecheck(appId,args){let url=new URL("/api/builds/precheck",this.options.baseUrl);return url.searchParams.set("app_id",appId),url.searchParams.set("source_version_id",args.source_version_id),args.build_config?.dockerfile_path&&url.searchParams.set("dockerfile_path",args.build_config.dockerfile_path),args.build_config?.context_subdir&&url.searchParams.set("context_subdir",args.build_config.context_subdir),args.build_config?.target&&url.searchParams.set("target",args.build_config.target),this.request(`${url.pathname}${url.search}`)}async getBuild(buildId){return this.request(`/api/builds/${encodeURIComponent(buildId)}`)}async listBuildEvents(buildId){return this.request(`/api/builds/${encodeURIComponent(buildId)}/events`)}async createLocalBuildSession(payload){return this.request("/api/builds/local-sessions",{method:"POST",body:JSON.stringify(payload)})}async completeLocalBuildSession(buildId,payload){return this.request(`/api/builds/${encodeURIComponent(buildId)}/local-complete`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppSourceWorkspace(appId,options){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/source-workspace`,this.options.baseUrl);return options?.sourceVersionId&&url.searchParams.set("source_version_id",options.sourceVersionId),this.request(`${url.pathname}${url.search}`)}async getTenantAppDevWorkspace(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/dev-workspace`)}async pushTenantAppDevWorkspace(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/dev-workspace/push`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(payload)})}async createTenantAppDevWorkspacePreview(appId,payload={}){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/dev-workspace/preview`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppDevWorkspacePreview(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/dev-workspace/preview`)}async listTenantAppSourceVersions(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions`)}async updateTenantAppSourceVersion(appId,sourceVersionId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions/${encodeURIComponent(sourceVersionId)}`,{method:"PATCH",body:JSON.stringify(payload)})}async getTenantAppEndUserAuthConfig(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/config`)}async getTenantAppEndUserAuthDiscovery(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/discovery`)}async getTenantAppEndUserAuthInspect(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/inspect`)}async configureTenantAppEndUserAuth(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/configure`,{method:"POST",body:JSON.stringify(payload)})}async bindTenantAppEndUserAuth(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/bind`,{method:"POST",body:JSON.stringify(payload)})}async listTenantAppEndUsers(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users`)}async listTenantAppEndUserRoles(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/roles`)}async createTenantAppEndUserRole(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/roles`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppEndUserRole(appId,roleKey){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/roles/${encodeURIComponent(roleKey)}`)}async updateTenantAppEndUserRole(appId,roleKey,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/roles/${encodeURIComponent(roleKey)}`,{method:"PATCH",body:JSON.stringify(payload)})}async listTenantAppUserRoles(appId,appUserId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users/${encodeURIComponent(appUserId)}/roles`)}async assignTenantAppUserRoles(appId,appUserId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users/${encodeURIComponent(appUserId)}/roles:assign`,{method:"POST",body:JSON.stringify(payload)})}async replaceTenantAppUserRoles(appId,appUserId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users/${encodeURIComponent(appUserId)}/roles`,{method:"PUT",body:JSON.stringify(payload)})}async removeTenantAppUserRole(appId,appUserId,roleKey){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/end-user-auth/app-users/${encodeURIComponent(appUserId)}/roles/${encodeURIComponent(roleKey)}`,{method:"DELETE"})}async discoverTenantCmsCollection(collection){let url=new URL("/api/tenant/cms/discover",this.options.baseUrl);return url.searchParams.set("collection",collection),this.request(`${url.pathname}${url.search}`)}async listTenantCmsCollections(){return this.request("/api/tenant/cms/collections")}async inspectTenantCmsSchema(collection){let url=new URL("/api/tenant/cms/inspect/schema",this.options.baseUrl);return url.searchParams.set("collection",collection),this.request(`${url.pathname}${url.search}`)}async listTenantCmsItems(args){let url=new URL("/api/tenant/cms/items",this.options.baseUrl);return url.searchParams.set("collection",args.collection),typeof args.page=="number"&&Number.isFinite(args.page)&&url.searchParams.set("page",String(args.page)),typeof args.pageSize=="number"&&Number.isFinite(args.pageSize)&&url.searchParams.set("page_size",String(args.pageSize)),setOptionalSearchParam(url,"category_id",args.categoryId),setOptionalSearchParam(url,"status",args.status),setOptionalSearchParam(url,"q",args.query),this.request(`${url.pathname}${url.search}`)}async getTenantCmsItem(args){let url=new URL(`/api/tenant/cms/items/${encodeURIComponent(args.id)}`,this.options.baseUrl);return url.searchParams.set("collection",args.collection),this.request(`${url.pathname}${url.search}`)}async configureTenantCmsCollection(spec){return this.request("/api/tenant/cms/configure/collection",{method:"POST",body:JSON.stringify(spec)})}async configureTenantCmsItem(payload){return this.request("/api/tenant/cms/configure/item",{method:"POST",body:JSON.stringify(payload)})}async configureTenantCmsCategory(payload){return this.request("/api/tenant/cms/configure/category",{method:"POST",body:JSON.stringify(payload)})}async applyTenantCmsSchema(payload){return this.request("/api/tenant/cms/apply/schema",{method:"POST",body:JSON.stringify(payload)})}async applyTenantCmsCollectionStatus(payload){return this.request("/api/tenant/cms/apply/collection-status",{method:"POST",body:JSON.stringify(payload)})}async applyTenantCmsPublish(payload){return this.request("/api/tenant/cms/apply/publish",{method:"POST",body:JSON.stringify(payload)})}async listPublicCmsItems(args){let url=new URL(`/api/public/cms/collections/${encodeURIComponent(args.collection)}/items`,this.options.baseUrl);url.searchParams.set("tenant_id",args.tenantId),typeof args.page=="number"&&Number.isFinite(args.page)&&url.searchParams.set("page",String(args.page)),typeof args.pageSize=="number"&&Number.isFinite(args.pageSize)&&url.searchParams.set("page_size",String(args.pageSize)),setOptionalSearchParam(url,"category_id",args.categoryId),setOptionalSearchParam(url,"sort_field",args.sortField),setOptionalSearchParam(url,"sort_direction",args.sortDirection);for(let tag of args.tags??[])url.searchParams.append("tag",tag);return this.request(`${url.pathname}${url.search}`)}async getPublicCmsItemBySlug(args){let url=new URL(`/api/public/cms/collections/${encodeURIComponent(args.collection)}/items/by-slug/${encodeURIComponent(args.slug)}`,this.options.baseUrl);return url.searchParams.set("tenant_id",args.tenantId),this.request(`${url.pathname}${url.search}`)}async getPublicCmsItemById(args){let url=new URL(`/api/public/cms/collections/${encodeURIComponent(args.collection)}/items/${encodeURIComponent(args.id)}`,this.options.baseUrl);return url.searchParams.set("tenant_id",args.tenantId),this.request(`${url.pathname}${url.search}`)}async listPublicCmsCategories(args){let url=new URL(`/api/public/cms/collections/${encodeURIComponent(args.collection)}/categories`,this.options.baseUrl);return url.searchParams.set("tenant_id",args.tenantId),this.request(`${url.pathname}${url.search}`)}async listTenantAppDeploymentTimeline(appId,options){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/deployments`,this.options.baseUrl);return typeof options?.limit=="number"&&Number.isFinite(options.limit)&&url.searchParams.set("limit",String(options.limit)),this.request(`${url.pathname}${url.search}`)}async getTenantAppPublishSettings(appId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/publish-settings`)}async updateTenantAppPublishSettings(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/publish-settings`,{method:"PATCH",body:JSON.stringify(payload)})}async setTenantAppCurrentPublishedVersion(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/publish-settings/current-version`,{method:"POST",body:JSON.stringify(payload)})}async createTenantAppPreview(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/previews`,{method:"POST",body:JSON.stringify(payload)})}async createTenantAppSourceVersion(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions`,{method:"POST",body:JSON.stringify(payload)})}async createTenantAppSourceVersionFromTemplate(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions:from-template`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppReleaseDeletePreview(appId,releaseId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/releases/${encodeURIComponent(releaseId)}/delete-preview`,{method:"POST"})}async deleteTenantAppRelease(appId,releaseId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/releases/${encodeURIComponent(releaseId)}/delete`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppSourceVersionDeletePreview(appId,sourceVersionId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions/${encodeURIComponent(sourceVersionId)}/delete-preview`,{method:"POST"})}async deleteTenantAppSourceVersion(appId,sourceVersionId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/source-versions/${encodeURIComponent(sourceVersionId)}/delete`,{method:"POST",body:JSON.stringify(payload)})}async getTenantVersionDeleteJob(jobId){return this.request(`/api/tenant/version-delete-jobs/${encodeURIComponent(jobId)}`)}async getTenantAppBuildDeletePreview(appId,buildId){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/builds/${encodeURIComponent(buildId)}/delete-preview`,{method:"POST"})}async deleteTenantAppBuild(appId,buildId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/builds/${encodeURIComponent(buildId)}/delete`,{method:"POST",body:JSON.stringify(payload)})}async getTenantAppDbInstance(appId,env="preview"){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db`,this.options.baseUrl);return url.searchParams.set("env",env),this.requestUrl(url)}async getTenantAppDbRuntimeBindings(appId,env="preview",purpose){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/runtime-bindings`,this.options.baseUrl);return url.searchParams.set("env",env),purpose&&url.searchParams.set("purpose",purpose),this.requestUrl(url)}async resolveDevRuntimeBindings(payload){return this.request("/api/dev-runtime-bindings/resolve",{method:"POST",body:JSON.stringify(payload)})}async revokeDevRuntimeBindings(payload){return this.request("/api/dev-runtime-bindings/revoke",{method:"POST",body:JSON.stringify(payload)})}async listTenantAppDbTables(appId,env="preview"){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables`,this.options.baseUrl);return url.searchParams.set("env",env),this.requestUrl(url)}async getTenantAppDbTableSchema(appId,tableName,env="preview"){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/schema`,this.options.baseUrl);return url.searchParams.set("env",env),this.requestUrl(url)}async getTenantAppDbTableRows(appId,tableName,args={}){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/rows`,this.options.baseUrl);return url.searchParams.set("env",args.env??"preview"),typeof args.page=="number"&&url.searchParams.set("page",String(args.page)),typeof args.page_size=="number"&&url.searchParams.set("page_size",String(args.page_size)),typeof args.sort_by=="string"&&args.sort_by.trim().length>0&&url.searchParams.set("sort_by",args.sort_by),args.sort_order==="desc"&&url.searchParams.set("sort_order","desc"),typeof args.filter_column=="string"&&args.filter_column.trim().length>0&&url.searchParams.set("filter_column",args.filter_column),typeof args.filter_value=="string"&&args.filter_value.length>0&&url.searchParams.set("filter_value",args.filter_value),typeof args.search_query=="string"&&args.search_query.trim().length>0&&url.searchParams.set("search_query",args.search_query),this.requestUrl(url)}async listTenantAppDbMigrationRuns(appId,args={}){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/migrations`,this.options.baseUrl);return url.searchParams.set("env",args.env??"preview"),typeof args.limit=="number"&&url.searchParams.set("limit",String(args.limit)),this.requestUrl(url)}async listTenantAppDbChangeAudits(appId,args={}){let url=new URL(`/api/tenant/apps/${encodeURIComponent(appId)}/db/audits`,this.options.baseUrl);return url.searchParams.set("env",args.env??"preview"),typeof args.table_name=="string"&&args.table_name.trim().length>0&&url.searchParams.set("table_name",args.table_name),typeof args.limit=="number"&&url.searchParams.set("limit",String(args.limit)),this.requestUrl(url)}async insertTenantAppDbRow(appId,tableName,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/rows`,{method:"POST",body:JSON.stringify(payload)})}async updateTenantAppDbRow(appId,tableName,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/rows`,{method:"PATCH",body:JSON.stringify(payload)})}async deleteTenantAppDbRow(appId,tableName,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/db/tables/${encodeURIComponent(tableName)}/rows`,{method:"DELETE",body:JSON.stringify(payload)})}async queryTenantAppDb(appId,payload){return this.request(`/api/tenant/apps/${encodeURIComponent(appId)}/db/query`,{method:"POST",body:JSON.stringify(payload)})}async createWorkspace(payload){return this.request("/api/admin/workspaces",{method:"POST",body:JSON.stringify(payload)})}async deleteWorkspace(workspaceId,payload){return this.request(`/api/admin/workspaces/${encodeURIComponent(workspaceId)}`,{method:"DELETE",...payload?{body:JSON.stringify(payload)}:{}})}async createApproval(payload){return this.request("/api/admin/resource-approvals",{method:"POST",body:JSON.stringify(payload)})}async listApprovals(filters){let url=new URL("/api/admin/resource-approvals",this.options.baseUrl);return filters?.tenant_id&&url.searchParams.set("tenant_id",filters.tenant_id),filters?.app_id&&url.searchParams.set("app_id",filters.app_id),filters?.status&&url.searchParams.set("status",filters.status),filters?.operation&&url.searchParams.set("operation",filters.operation),this.requestUrl(url)}async decideApproval(approvalId,payload){return this.request(`/api/admin/resource-approvals/${approvalId}/decision`,{method:"POST",body:JSON.stringify(payload)})}async listResourceLocks(filters){let url=new URL("/api/admin/resource-locks",this.options.baseUrl);return filters?.tenant_id&&url.searchParams.set("tenant_id",filters.tenant_id),filters?.app_id&&url.searchParams.set("app_id",filters.app_id),filters?.env&&url.searchParams.set("env",filters.env),this.requestUrl(url)}async diffResources(payload){return this.request("/api/resources/diff",{method:"POST",body:JSON.stringify(payload)})}async applyResources(payload){return this.request("/api/resources/apply",{method:"POST",body:JSON.stringify(payload)})}async rollbackResources(payload){return this.request("/api/resources/rollback",{method:"POST",body:JSON.stringify(payload)})}async deployRelease(payload){return this.request("/api/releases/deploy",{method:"POST",body:JSON.stringify(payload)})}async rollbackRelease(payload){return this.request("/api/releases/rollback",{method:"POST",body:JSON.stringify(payload)})}async queryLogs(payload){return this.request("/api/logs/query",{method:"POST",body:JSON.stringify(payload)})}};function setOptionalSearchParam(url,key,value){typeof value=="string"&&value.trim().length>0&&url.searchParams.set(key,value)}function setOptionalBooleanSearchParam(url,key,value){typeof value=="boolean"&&url.searchParams.set(key,value?"true":"false")}function resolveRelativeOrAbsoluteUrl(pathOrUrl,baseUrl){return new URL(pathOrUrl,baseUrl)}function createPlatformSdk(options){return new PlatformSdk(options)}var NotificationSdkNamespace=class{sdk;endUser;constructor(sdk){this.sdk=sdk,this.endUser=new EndUserNotificationNamespace(sdk)}},EndUserNotificationNamespace=class{sdk;constructor(sdk){this.sdk=sdk}forApp(appId){return new EndUserNotificationAppClient(this.sdk,appId)}},EndUserNotificationAppClient=class{sdk;appId;announcements;constructor(sdk,appId){this.sdk=sdk,this.appId=appId,this.announcements=new EndUserNotificationAppAnnouncementsClient(sdk,appId)}listUsers(){return this.sdk.listTenantAppEndUsers(this.appId)}forUser(endUserId){return new EndUserNotificationUserClient(this.sdk,this.appId,endUserId)}listInbox(endUserId,query={}){return this.sdk.listEndUserNotificationInbox(this.appId,{end_user_id:endUserId,...query})}getUnreadCount(endUserId){return this.sdk.getEndUserNotificationUnreadCount(this.appId,endUserId)}publish(input){return this.sdk.publishEndUserNotification(this.appId,{recipient:buildDirectEndUserRecipientRef(this.appId,input.end_user_id),title:input.title,body:input.body??null,notification_type:input.notification_type??"notification",object_ref:input.object_ref,action_ref:input.action_ref,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("publish",this.appId,input.end_user_id),deliver_to:input.deliver_to})}remind(input){return this.sdk.createEndUserNotificationReminder(this.appId,{recipient:buildDirectEndUserRecipientRef(this.appId,input.end_user_id),remind_at:input.remind_at,title:input.title,body:input.body??null,object_ref:input.object_ref,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("reminder",this.appId,input.end_user_id)})}projectTask(input){return this.sdk.projectEndUserTaskNotification(this.appId,{recipient:buildDirectEndUserRecipientRef(this.appId,input.end_user_id),source_task_ref:input.source_task_ref,title:input.title,summary:input.summary??null,due_at:input.due_at??null,source_event_id:input.source_event_id??null,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("task-projection",this.appId,input.end_user_id)})}},EndUserNotificationAppAnnouncementsClient=class{sdk;appId;constructor(sdk,appId){this.sdk=sdk,this.appId=appId}getConfig(){return this.sdk.getAppNotificationConfig(this.appId)}list(limit){return this.sdk.listAppNotificationAnnouncements(this.appId,{limit})}create(input){return this.sdk.createAppNotificationAnnouncement(this.appId,input)}archive(announcementId){return this.sdk.archiveAppNotificationAnnouncement(this.appId,announcementId)}},EndUserNotificationUserClient=class{sdk;appId;endUserId;constructor(sdk,appId,endUserId){this.sdk=sdk,this.appId=appId,this.endUserId=endUserId}buildRecipientRef(){return buildDirectEndUserRecipientRef(this.appId,this.endUserId)}listInbox(query={}){return this.sdk.listEndUserNotificationInbox(this.appId,{end_user_id:this.endUserId,...query})}getUnreadCount(){return this.sdk.getEndUserNotificationUnreadCount(this.appId,this.endUserId)}publish(input){return this.sdk.publishEndUserNotification(this.appId,{recipient:this.buildRecipientRef(),title:input.title,body:input.body??null,notification_type:input.notification_type??"notification",object_ref:input.object_ref,action_ref:input.action_ref,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("publish",this.appId,this.endUserId),deliver_to:input.deliver_to})}remind(input){return this.sdk.createEndUserNotificationReminder(this.appId,{recipient:this.buildRecipientRef(),remind_at:input.remind_at,title:input.title,body:input.body??null,object_ref:input.object_ref,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("reminder",this.appId,this.endUserId)})}projectTask(input){return this.sdk.projectEndUserTaskNotification(this.appId,{recipient:this.buildRecipientRef(),source_task_ref:input.source_task_ref,title:input.title,summary:input.summary??null,due_at:input.due_at??null,source_event_id:input.source_event_id??null,idempotency_key:input.idempotency_key??buildNotificationIdempotencyKey("task-projection",this.appId,this.endUserId)})}};function buildDirectEndUserRecipientRef(appId,endUserId){return{app_id:appId,end_user_id:endUserId,recipient_type:"direct_user"}}function buildNotificationIdempotencyKey(prefix,appId,endUserId){return`${prefix}:${appId}:${endUserId}:${Date.now()}`}var AUTH_PAGE_HTML=String.raw`<!doctype html>
3
3
  <html lang="zh-CN">
4
4
  <head>
5
5
  <meta charset="utf-8" />
@@ -2464,7 +2464,7 @@ ${routeMarker}`)}return next}function buildAuthDebugPageSource(){return["export
2464
2464
  `)}function buildWorkflowDebugPageSource(){return["export function renderWorkflowDebugPage() {"," return `<!doctype html>",'<html lang="zh-CN">'," <head>",' <meta charset="utf-8" />',' <meta name="viewport" content="width=device-width, initial-scale=1" />'," <title>Workflow Debug</title>"," <style>",' :root { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color-scheme: light; }'," body { margin: 0; background: #f8fafc; color: #0f172a; }"," main { width: min(1080px, calc(100vw - 32px)); margin: 40px auto; padding: 32px; border-radius: 24px; background: #fff; border: 1px solid #e2e8f0; box-shadow: 0 24px 80px rgba(15,23,42,.08); }"," h1 { margin: 0 0 12px; font-size: 32px; }"," p { margin: 0 0 12px; color: #475569; line-height: 1.7; }"," .status { margin-top: 16px; padding: 12px 14px; border-radius: 14px; border: 1px solid #e2e8f0; background: #f8fafc; color: #334155; }"," .status-neutral { background: #f8fafc; border-color: #e2e8f0; color: #334155; }"," .status-success { background: #ecfdf5; border-color: #86efac; color: #166534; }"," .status-warning { background: #fffbeb; border-color: #fcd34d; color: #92400e; }"," .status-error { background: #fff1f2; border-color: #fecdd3; color: #be123c; }"," .hero { display: grid; grid-template-columns: 1.2fr 0.8fr; gap: 16px; margin-top: 20px; }"," .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-top: 16px; }"," .card { border: 1px solid #e2e8f0; border-radius: 16px; padding: 16px; }"," .label { font-size: 12px; color: #64748b; }"," .value { margin-top: 8px; font-weight: 600; word-break: break-word; }"," .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }"," .actions, .inline-actions { display: flex; gap: 12px; flex-wrap: wrap; }"," .actions { margin-top: 16px; }"," input { width: 100%; border: 1px solid #cbd5e1; border-radius: 12px; padding: 12px 14px; font: inherit; }"," button, a { border: 0; border-radius: 12px; padding: 12px 16px; font: inherit; font-weight: 600; cursor: pointer; background: #0f172a; color: #fff; text-decoration: none; display: inline-flex; align-items: center; }"," button.secondary, a.secondary { background: #fff; color: #0f172a; border: 1px solid #cbd5e1; }"," .list { display: grid; gap: 12px; margin-top: 16px; }"," .item { border: 1px solid #e2e8f0; border-radius: 14px; padding: 14px; }"," .muted { color: #64748b; font-size: 14px; }"," @media (max-width: 920px) { .hero, .grid { grid-template-columns: 1fr; } }"," </style>"," </head>"," <body>"," <main>"," <h1>Workflow \u6700\u5C0F\u8054\u8C03\u9875</h1>"," <p>\u8FD9\u4E2A\u9875\u9762\u53EA\u7528\u4E8E\u672C\u5730\u6216 preview \u8054\u8C03 workflow \u8FD0\u884C\u65F6\u3002\u5B83\u4E0D\u4F1A\u4FEE\u6539\u4F60\u7684\u4E1A\u52A1\u9875\uFF0C\u53EA\u63D0\u4F9B\u6700\u5C0F\u7684\u5BF9\u8C61\u72B6\u6001\u8BFB\u53D6\u3001\u542F\u52A8\u6D41\u7A0B\u3001\u52A8\u4F5C\u6267\u884C\u4E0E\u5F85\u529E\u67E5\u770B\u3002</p>",' <div class="status status-neutral" id="status">\u6B63\u5728\u6821\u9A8C\u5F53\u524D\u7EC8\u7AEF\u7528\u6237\u4F1A\u8BDD...</div>',' <div class="hero">',' <div class="card">',' <div class="grid" style="margin-top:0">',' <div><div class="label">Definition Key</div><input id="definition-key" type="text" placeholder="\u4F8B\u5982 wf-demo-simple-approval" /></div>',' <div><div class="label">Object Type</div><input id="object-type" type="text" placeholder="\u4F8B\u5982 demo_request" /></div>',' <div><div class="label">Object ID</div><input id="object-id" type="text" value="demo-request-001" /></div>',' <div><div class="label">\u52A8\u4F5C\u5907\u6CE8</div><input id="comment" type="text" placeholder="\u4F8B\u5982\uFF1A\u4FE1\u606F\u5B8C\u6574\uFF0C\u901A\u8FC7" /></div>'," </div>",' <div class="actions">',' <button id="start" type="button">\u542F\u52A8\u6D41\u7A0B</button>',' <button class="secondary" id="refresh" type="button">\u5237\u65B0\u72B6\u6001</button>',' <a class="secondary" href="/app">\u8FD4\u56DE\u4E1A\u52A1\u9875</a>'," </div>"," </div>",' <div class="card">',' <div class="label">\u5F53\u524D\u5B9E\u4F8B</div><div class="value mono" id="instance-id">-</div>',' <div class="label" style="margin-top:16px">\u5F53\u524D\u72B6\u6001</div><div class="value" id="state">-</div>',' <div class="label" style="margin-top:16px">\u751F\u547D\u5468\u671F</div><div class="value mono" id="lifecycle">-</div>',' <div class="label" style="margin-top:16px">\u53EF\u6267\u884C\u52A8\u4F5C</div><div class="inline-actions" id="available-actions" style="margin-top:8px"></div>'," </div>"," </div>",' <div class="grid">',' <div class="card"><div class="label">\u5F53\u524D\u7528\u6237\u5F85\u529E</div><div class="list" id="tasks"></div></div>',' <div class="card"><div class="label">\u65F6\u95F4\u7EBF</div><div class="list" id="timeline"></div></div>'," </div>"," </main>",' <script type="module">'," import { getPlatformRuntimeApp, requireReadyEndUser, getRuntimeStatusFromAccess, getRuntimeStatusFromError, applyRuntimeStatus } from '/assets/platform-runtime.js';"," const appRuntime = getPlatformRuntimeApp();"," const statusEl = document.getElementById('status');"," const definitionKeyEl = document.getElementById('definition-key');"," const objectTypeEl = document.getElementById('object-type');"," const objectIdEl = document.getElementById('object-id');"," const commentEl = document.getElementById('comment');"," const instanceIdEl = document.getElementById('instance-id');"," const stateEl = document.getElementById('state');"," const lifecycleEl = document.getElementById('lifecycle');"," const actionsEl = document.getElementById('available-actions');"," const tasksEl = document.getElementById('tasks');"," const timelineEl = document.getElementById('timeline');"," const startEl = document.getElementById('start');"," const refreshEl = document.getElementById('refresh');"," function readValue(element) { return String(element?.value || '').trim(); }",` function renderEmpty(element, text) { element.innerHTML = '<div class="item muted">' + escapeHtml(text) + '</div>'; }`," function setBusy(isBusy, message) {"," startEl.disabled = isBusy;"," refreshEl.disabled = isBusy;"," actionsEl.querySelectorAll('button').forEach((button) => { button.disabled = isBusy; });"," if (message) applyRuntimeStatus(statusEl, { tone: 'neutral', message });"," }"," function renderState(state) {"," instanceIdEl.textContent = state?.instanceId || '-';"," stateEl.textContent = state?.currentStateDisplayName || state?.currentStateKey || '\u5C1A\u672A\u542F\u52A8';"," lifecycleEl.textContent = state?.lifecycleStatus || (state?.hasActiveInstance ? 'active' : 'idle');"," const actions = Array.isArray(state?.availableActions) ? state.availableActions : [];"," if (actions.length === 0) { renderEmpty(actionsEl, '\u5F53\u524D\u6CA1\u6709\u53EF\u6267\u884C\u52A8\u4F5C\u3002'); return; }",` actionsEl.innerHTML = actions.map((action) => '<button type="button" data-instance-id="' + escapeHtml(state.instanceId || '') + '" data-action-key="' + escapeHtml(action.actionKey) + '">' + escapeHtml(action.displayName) + '</button>').join('');`," }"," function renderTasks(items, currentObjectId) {"," if (!Array.isArray(items) || items.length === 0) { renderEmpty(tasksEl, '\u5F53\u524D\u7528\u6237\u6682\u65E0\u5F85\u529E\u3002'); return; }"," tasksEl.innerHTML = items.map((task) => {",` const actions = (task.availableActions || []).map((action) => '<button type="button" class="secondary" data-task-instance-id="' + escapeHtml(task.instanceId) + '" data-action-key="' + escapeHtml(action.actionKey) + '">' + escapeHtml(action.displayName) + '</button>').join('');`,` return '<div class="item"><strong>' + escapeHtml(task.definitionDisplayName || task.definitionKey) + '</strong><div class="muted mono">' + escapeHtml(task.objectType) + ' / ' + escapeHtml(task.objectId) + '</div><div class="muted">\u72B6\u6001\uFF1A' + escapeHtml(task.currentStateDisplayName || task.currentStateKey || '-') + (task.objectId === currentObjectId ? ' \xB7 \u5F53\u524D\u5BF9\u8C61' : '') + '</div><div class="inline-actions" style="margin-top:8px">' + actions + '</div></div>';`," }).join('');"," }"," function renderTimeline(items) {"," if (!Array.isArray(items) || items.length === 0) { renderEmpty(timelineEl, '\u6682\u65E0\u65F6\u95F4\u7EBF\u3002'); return; }",` timelineEl.innerHTML = items.map((item) => '<div class="item"><strong>' + escapeHtml(item.actionDisplayName || item.actionKey || 'start') + '</strong><div class="muted">' + escapeHtml(item.fromStateDisplayName || item.fromStateKey || '-') + ' -> ' + escapeHtml(item.toStateDisplayName || item.toStateKey || '-') + '</div><div class="muted">\u6267\u884C\u4EBA\uFF1A' + escapeHtml(item.actorDisplayName || item.actorId || '-') + '</div></div>').join('');`," }"," async function refreshWorkflow() {"," const objectType = readValue(objectTypeEl);"," const objectId = readValue(objectIdEl);"," if (!objectType || !objectId) {"," renderEmpty(actionsEl, '\u8BF7\u5148\u586B\u5199 object type \u548C object id\u3002');"," renderEmpty(tasksEl, '\u8BF7\u5148\u586B\u5199 object type \u548C object id\u3002');"," renderEmpty(timelineEl, '\u8BF7\u5148\u586B\u5199 object type \u548C object id\u3002');"," stateEl.textContent = '-'; lifecycleEl.textContent = '-'; instanceIdEl.textContent = '-';"," applyRuntimeStatus(statusEl, { tone: 'warning', message: '\u5237\u65B0\u524D\u9700\u8981\u5148\u586B\u5199 object type \u548C object id\u3002' });"," return;"," }"," setBusy(true, '\u6B63\u5728\u5237\u65B0 workflow \u72B6\u6001...');"," try {"," const [state, tasks, timeline] = await Promise.all(["," appRuntime.getWorkflowObjectState({ objectType, objectId }),"," appRuntime.listMyTasks({ status: 'pending', limit: 20 }),"," appRuntime.listWorkflowTimeline({ objectType, objectId }).catch(() => [])"," ]);"," renderState(state);"," renderTasks(tasks.items || [], objectId);"," renderTimeline(timeline);"," applyRuntimeStatus(statusEl, { tone: 'success', message: 'Workflow \u8FD0\u884C\u65F6\u8BF7\u6C42\u6210\u529F\u3002' });"," } catch (error) {"," renderEmpty(actionsEl, '\u72B6\u6001\u8BFB\u53D6\u5931\u8D25\u3002');"," renderEmpty(tasksEl, '\u5F85\u529E\u8BFB\u53D6\u5931\u8D25\u3002');"," renderEmpty(timelineEl, '\u65F6\u95F4\u7EBF\u8BFB\u53D6\u5931\u8D25\u3002');"," applyRuntimeStatus(statusEl, getRuntimeStatusFromError(error, 'Workflow \u8C03\u8BD5\u8BF7\u6C42\u5931\u8D25\u3002'));"," } finally {"," setBusy(false);"," }"," }"," async function startWorkflow() {"," const definitionKey = readValue(definitionKeyEl);"," const objectType = readValue(objectTypeEl);"," const objectId = readValue(objectIdEl);"," if (!definitionKey || !objectType || !objectId) {"," applyRuntimeStatus(statusEl, { tone: 'warning', message: '\u542F\u52A8\u524D\u9700\u8981\u586B\u5199 definition key\u3001object type \u548C object id\u3002' });"," return;"," }"," setBusy(true, '\u6B63\u5728\u542F\u52A8 workflow...');"," try {"," await appRuntime.startWorkflow({ definitionKey, objectType, objectId, payload: { source: 'workflow-debug-page' } });"," await refreshWorkflow();"," } catch (error) {"," applyRuntimeStatus(statusEl, getRuntimeStatusFromError(error, 'Workflow \u542F\u52A8\u5931\u8D25\u3002'));"," setBusy(false);"," }"," }"," async function runAction(instanceId, actionKey) {"," setBusy(true, '\u6B63\u5728\u6267\u884C workflow \u52A8\u4F5C...');"," try {"," await appRuntime.performWorkflowAction({ instanceId, actionKey, comment: readValue(commentEl) || undefined });"," await refreshWorkflow();"," } catch (error) {"," applyRuntimeStatus(statusEl, getRuntimeStatusFromError(error, 'Workflow \u52A8\u4F5C\u6267\u884C\u5931\u8D25\u3002'));"," setBusy(false);"," }"," }"," async function bootstrap() {"," try {"," const session = await requireReadyEndUser({ returnTo: '/debug/workflow', redirectToSignIn: true });"," applyRuntimeStatus(statusEl, getRuntimeStatusFromAccess(session.access));"," if (session.ready) { await refreshWorkflow(); }"," } catch (error) {"," applyRuntimeStatus(statusEl, getRuntimeStatusFromError(error, 'Workflow \u8C03\u8BD5\u9875\u521D\u59CB\u5316\u5931\u8D25\u3002'));"," }"," }"," startEl.addEventListener('click', () => { void startWorkflow(); });"," refreshEl.addEventListener('click', () => { void refreshWorkflow(); });"," actionsEl.addEventListener('click', (event) => {"," const button = event.target instanceof HTMLElement ? event.target.closest('button[data-action-key][data-instance-id]') : null;"," if (!button) return;"," void runAction(button.getAttribute('data-instance-id') || '', button.getAttribute('data-action-key') || '');"," });"," tasksEl.addEventListener('click', (event) => {"," const button = event.target instanceof HTMLElement ? event.target.closest('button[data-task-instance-id][data-action-key]') : null;"," if (!button) return;"," void runAction(button.getAttribute('data-task-instance-id') || '', button.getAttribute('data-action-key') || '');"," });"," function escapeHtml(value) {",` return String(value || '').replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#39;');`," }"," void bootstrap();"," </script>"," </body>","</html>`;","}",""].join(`
2465
2465
  `)}function buildCmsDebugPageSource(){return["export function renderCmsDebugPage() {"," return `<!doctype html>",'<html lang="zh-CN">'," <head>",' <meta charset="utf-8" />',' <meta name="viewport" content="width=device-width, initial-scale=1" />'," <title>CMS Debug</title>"," <style>",' :root { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color-scheme: light; }'," body { margin: 0; background: #f8fafc; color: #0f172a; }"," main { width: min(1080px, calc(100vw - 32px)); margin: 40px auto; padding: 32px; border-radius: 24px; background: #fff; border: 1px solid #e2e8f0; box-shadow: 0 24px 80px rgba(15,23,42,.08); }"," h1 { margin: 0 0 12px; font-size: 32px; }"," p { margin: 0 0 12px; color: #475569; line-height: 1.7; }"," .status { margin-top: 16px; padding: 12px 14px; border-radius: 14px; border: 1px solid #e2e8f0; background: #f8fafc; color: #334155; }"," .status-neutral { background: #f8fafc; border-color: #e2e8f0; color: #334155; }"," .status-success { background: #ecfdf5; border-color: #86efac; color: #166534; }"," .status-warning { background: #fffbeb; border-color: #fcd34d; color: #92400e; }"," .status-error { background: #fff1f2; border-color: #fecdd3; color: #be123c; }"," .hero { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-top: 20px; }"," .card { border: 1px solid #e2e8f0; border-radius: 16px; padding: 16px; }"," .label { font-size: 12px; color: #64748b; }"," .value { margin-top: 8px; font-weight: 600; word-break: break-word; }"," .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }"," .actions { display: flex; gap: 12px; margin-top: 16px; flex-wrap: wrap; }"," input { width: 100%; border: 1px solid #cbd5e1; border-radius: 12px; padding: 12px 14px; font: inherit; box-sizing: border-box; }"," button, a { border: 0; border-radius: 12px; padding: 12px 16px; font: inherit; font-weight: 600; cursor: pointer; background: #0f172a; color: #fff; text-decoration: none; display: inline-flex; align-items: center; }"," button.secondary, a.secondary { background: #fff; color: #0f172a; border: 1px solid #cbd5e1; }"," .list { display: grid; gap: 12px; margin-top: 16px; }"," .item { border: 1px solid #e2e8f0; border-radius: 14px; padding: 14px; }"," .muted { color: #64748b; font-size: 14px; }"," pre { margin: 0; white-space: pre-wrap; word-break: break-word; }"," @media (max-width: 920px) { .hero { grid-template-columns: 1fr; } }"," </style>"," </head>"," <body>"," <main>"," <h1>CMS \u6700\u5C0F\u8054\u8C03\u9875</h1>"," <p>\u8FD9\u4E2A\u9875\u9762\u53EA\u7528\u4E8E\u672C\u5730\u6216 preview \u8054\u8C03 CMS \u8FD0\u884C\u65F6\u3002\u5B83\u4F1A\u76F4\u63A5\u9A8C\u8BC1 collection \u5217\u8868\u3001collection meta\u3001\u5185\u5BB9\u5217\u8868\u4E0E slug \u8BFB\u53D6\uFF0C\u4E0D\u5C5E\u4E8E\u6B63\u5F0F\u4E1A\u52A1\u9875\u9762\u3002</p>",' <div class="status status-neutral" id="status">\u6B63\u5728\u6821\u9A8C CMS \u8FD0\u884C\u65F6...</div>',' <div class="hero">',' <div class="card">',' <div class="label">Collection</div>',' <input id="collection" type="text" value="article" />',' <div class="label" style="margin-top:16px">Slug</div>',' <input id="slug" type="text" placeholder="\u4F8B\u5982 cms-demo-entry" />',' <div class="actions">',' <button id="refresh" type="button">\u5237\u65B0</button>',' <button class="secondary" id="load-slug" type="button">\u6309 Slug \u8BFB\u53D6</button>',' <a class="secondary" href="/app">\u8FD4\u56DE\u4E1A\u52A1\u9875</a>'," </div>"," </div>",' <div class="card">',' <div class="label">\u5F53\u524D\u79DF\u6237</div><div class="value mono" id="tenant-id">-</div>',' <div class="label" style="margin-top:16px">Collection Meta</div><div class="value"><pre id="meta">-</pre></div>'," </div>"," </div>",' <div class="hero">',' <div class="card"><div class="label">Collection \u5217\u8868</div><div class="list" id="collections"></div></div>',' <div class="card"><div class="label">\u5185\u5BB9\u5217\u8868</div><div class="list" id="items"></div></div>'," </div>",' <div class="card" style="margin-top:16px"><div class="label">\u5F53\u524D\u6761\u76EE</div><div class="value"><pre id="item-detail">-</pre></div></div>'," </main>",' <script type="module">'," import { getPlatformRuntimeApp, getRuntimeStatusFromError, applyRuntimeStatus } from '/assets/platform-runtime.js';"," const appRuntime = getPlatformRuntimeApp();"," const statusEl = document.getElementById('status');"," const tenantIdEl = document.getElementById('tenant-id');"," const collectionEl = document.getElementById('collection');"," const slugEl = document.getElementById('slug');"," const metaEl = document.getElementById('meta');"," const collectionsEl = document.getElementById('collections');"," const itemsEl = document.getElementById('items');"," const itemDetailEl = document.getElementById('item-detail');"," const refreshEl = document.getElementById('refresh');"," const loadSlugEl = document.getElementById('load-slug');"," let tenantId = '';"," function readCollection() { return String(collectionEl.value || '').trim(); }"," function readSlug() { return String(slugEl.value || '').trim(); }",` function renderEmpty(element, text) { element.innerHTML = '<div class="item muted">' + escapeHtml(text) + '</div>'; }`," function renderCollections(items) {"," if (!Array.isArray(items) || items.length === 0) { renderEmpty(collectionsEl, '\u6682\u65E0\u53EF\u89C1 collection\u3002'); return; }",` collectionsEl.innerHTML = items.map((item) => '<div class="item"><strong>' + escapeHtml(item.label || item.collection) + '</strong><div class="muted mono">' + escapeHtml(item.collection) + '</div><div class="muted">template: ' + escapeHtml(item.template || '-') + '</div></div>').join('');`," }"," function renderItems(items) {"," if (!Array.isArray(items) || items.length === 0) { renderEmpty(itemsEl, '\u5F53\u524D collection \u6682\u65E0\u5DF2\u53D1\u5E03\u5185\u5BB9\u3002'); return; }",` itemsEl.innerHTML = items.map((item) => '<div class="item"><strong>' + escapeHtml(item.content?.title || item.system?.slug || item.system?.id || '-') + '</strong><div class="muted mono">' + escapeHtml(item.system?.slug || '-') + '</div><div class="muted">status: ' + escapeHtml(item.system?.publish_status || '-') + '</div></div>').join('');`," }"," async function refreshCms() {"," const collection = readCollection();"," if (!tenantId) {"," const context = await fetch('/api/me').then((item) => item.json()).catch(() => null);"," tenantId = typeof context?.tenant_id === 'string' ? context.tenant_id : '';"," tenantIdEl.textContent = tenantId || '-';"," }"," if (!tenantId || !collection) {"," applyRuntimeStatus(statusEl, { tone: 'warning', message: '\u5237\u65B0\u524D\u9700\u8981 tenantId \u548C collection\u3002' });"," return;"," }"," applyRuntimeStatus(statusEl, { tone: 'neutral', message: '\u6B63\u5728\u5237\u65B0 CMS \u72B6\u6001...' });"," try {"," const [collections, meta, list] = await Promise.all(["," appRuntime.listCmsCollections({ tenantId }),"," appRuntime.getCmsCollectionMeta({ tenantId, collection }),"," appRuntime.listCmsItems({ tenantId, collection, page: 1, pageSize: 10 }).catch(() => ({ items: [], total: 0, page: 1, page_size: 10 }))"," ]);"," renderCollections(collections.items || []);"," renderItems(list.items || []);"," metaEl.textContent = JSON.stringify(meta, null, 2);"," itemDetailEl.textContent = '-';"," applyRuntimeStatus(statusEl, { tone: 'success', message: 'CMS \u8FD0\u884C\u65F6\u8BF7\u6C42\u6210\u529F\u3002' });"," } catch (error) {"," renderEmpty(collectionsEl, 'Collection \u8BFB\u53D6\u5931\u8D25\u3002');"," renderEmpty(itemsEl, '\u5185\u5BB9\u5217\u8868\u8BFB\u53D6\u5931\u8D25\u3002');"," metaEl.textContent = '-';"," applyRuntimeStatus(statusEl, getRuntimeStatusFromError(error, 'CMS \u8C03\u8BD5\u8BF7\u6C42\u5931\u8D25\u3002'));"," }"," }"," async function loadBySlug() {"," const collection = readCollection();"," if (!tenantId) {"," const context = await fetch('/api/me').then((item) => item.json()).catch(() => null);"," tenantId = typeof context?.tenant_id === 'string' ? context.tenant_id : '';"," tenantIdEl.textContent = tenantId || '-';"," }"," const slug = readSlug();"," if (!tenantId || !collection || !slug) {"," applyRuntimeStatus(statusEl, { tone: 'warning', message: '\u6309 slug \u8BFB\u53D6\u524D\u9700\u8981 tenantId\u3001collection \u548C slug\u3002' });"," return;"," }"," applyRuntimeStatus(statusEl, { tone: 'neutral', message: '\u6B63\u5728\u6309 slug \u8BFB\u53D6 CMS \u6761\u76EE...' });"," try {"," const item = await appRuntime.getCmsItemBySlug({ tenantId, collection, slug });"," itemDetailEl.textContent = JSON.stringify(item, null, 2);"," applyRuntimeStatus(statusEl, { tone: 'success', message: 'CMS \u6761\u76EE\u8BFB\u53D6\u6210\u529F\u3002' });"," } catch (error) {"," itemDetailEl.textContent = '-';"," applyRuntimeStatus(statusEl, getRuntimeStatusFromError(error, 'CMS \u6761\u76EE\u8BFB\u53D6\u5931\u8D25\u3002'));"," }"," }"," refreshEl.addEventListener('click', () => { void refreshCms(); });"," loadSlugEl.addEventListener('click', () => { void loadBySlug(); });"," function escapeHtml(value) {",` return String(value || '').replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#39;');`," }"," void refreshCms();"," </script>"," </body>","</html>`;","}",""].join(`
2466
2466
  `)}function buildDbDebugPageSource(){return["export function renderDbDebugPage() {"," return `<!doctype html>",'<html lang="zh-CN">'," <head>",' <meta charset="utf-8" />',' <meta name="viewport" content="width=device-width, initial-scale=1" />'," <title>DB Debug</title>"," <style>",' :root { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color-scheme: light; }'," body { margin: 0; background: #f8fafc; color: #0f172a; }"," main { width: min(1080px, calc(100vw - 32px)); margin: 40px auto; padding: 32px; border-radius: 24px; background: #fff; border: 1px solid #e2e8f0; box-shadow: 0 24px 80px rgba(15,23,42,.08); }"," h1 { margin: 0 0 12px; font-size: 32px; }"," p { margin: 0 0 12px; color: #475569; line-height: 1.7; }"," .status { margin-top: 16px; padding: 12px 14px; border-radius: 14px; border: 1px solid #e2e8f0; background: #f8fafc; color: #334155; }"," .status-neutral { background: #f8fafc; border-color: #e2e8f0; color: #334155; }"," .status-success { background: #ecfdf5; border-color: #86efac; color: #166534; }"," .status-warning { background: #fffbeb; border-color: #fcd34d; color: #92400e; }"," .status-error { background: #fff1f2; border-color: #fecdd3; color: #be123c; }"," .grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-top: 20px; }"," .card { border: 1px solid #e2e8f0; border-radius: 16px; padding: 16px; }"," .label { font-size: 12px; color: #64748b; }"," .value { margin-top: 8px; font-weight: 600; word-break: break-word; }"," .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }"," .actions { display: flex; gap: 12px; margin-top: 20px; flex-wrap: wrap; }"," button, a { border: 0; border-radius: 12px; padding: 12px 16px; font: inherit; font-weight: 600; cursor: pointer; background: #0f172a; color: #fff; text-decoration: none; display: inline-flex; align-items: center; }"," button.secondary, a.secondary { background: #fff; color: #0f172a; border: 1px solid #cbd5e1; }"," ul { margin: 0; padding-left: 20px; color: #334155; }"," li { margin: 8px 0; }"," pre { margin: 0; white-space: pre-wrap; word-break: break-word; }"," @media (max-width: 720px) { .grid { grid-template-columns: 1fr; } }"," </style>"," </head>"," <body>"," <main>"," <h1>DB \u6700\u5C0F\u8054\u8C03\u9875</h1>"," <p>\u8FD9\u4E2A\u9875\u9762\u53EA\u7528\u4E8E\u672C\u5730\u6216 preview \u8054\u8C03\u5E73\u53F0 DB \u7ED1\u5B9A\uFF0C\u4E0D\u5C5E\u4E8E\u6B63\u5F0F\u4E1A\u52A1\u9875\u9762\u3002\u5B83\u4F1A\u8BFB\u53D6\u5F53\u524D\u5E94\u7528\u7684 DB \u7ED1\u5B9A\u4E0A\u4E0B\u6587\uFF0C\u5E76\u63D0\u793A\u4F60\u7EE7\u7EED\u4F7F\u7528 `platform db` \u548C `platform dev --remote-bindings` \u9A8C\u8BC1\u771F\u5B9E\u8868\u7ED3\u6784\u4E0E\u67E5\u8BE2\u3002</p>",' <div class="status status-neutral" id="status">\u6B63\u5728\u8BFB\u53D6 DB \u7ED1\u5B9A\u4E0A\u4E0B\u6587...</div>',' <div class="grid">',' <div class="card"><div class="label">\u5F53\u524D\u79DF\u6237 / \u5E94\u7528 / \u73AF\u5883</div><div class="value mono" id="identity">-</div></div>',' <div class="card"><div class="label">DATABASE_URL \u6CE8\u5165\u72B6\u6001</div><div class="value mono" id="db-ready">-</div></div>',' <div class="card"><div class="label">DATABASE_SCHEMA</div><div class="value mono" id="db-schema">-</div></div>',' <div class="card"><div class="label">Capability Version</div><div class="value mono" id="db-capability">-</div></div>'," </div>",' <div class="card" style="margin-top:16px"><div class="label">\u540E\u7AEF\u8FD4\u56DE\u7684 DB \u4E0A\u4E0B\u6587</div><div class="value"><pre id="db-context">-</pre></div></div>',' <div class="card" style="margin-top:16px"><div class="label">\u4E0B\u4E00\u6B65\u5EFA\u8BAE</div><div class="value"><ul><li>\u5148\u8DD1 <code>platform db status</code> \u770B binding / schema / migration\u3002</li><li>\u518D\u8DD1 <code>platform db tables</code> \u6216 <code>platform db query --sql "SELECT ..."</code> \u786E\u8BA4\u771F\u5B9E\u8868\u7ED3\u6784\u3002</li><li>\u5982\u679C\u4F60\u8981\u9A8C\u8BC1\u5E94\u7528\u4EE3\u7801\u76F4\u8FDE DB\uFF0C\u4F7F\u7528 <code>platform dev --remote-bindings</code>\uFF0C\u4E0D\u8981\u53EA\u8DD1\u666E\u901A <code>platform dev</code>\u3002</li></ul></div></div>',' <div class="actions">',' <button id="refresh" type="button">\u5237\u65B0\u72B6\u6001</button>',' <a class="secondary" href="/app">\u8FD4\u56DE\u4E1A\u52A1\u9875</a>'," </div>"," </main>",' <script type="module">'," import { getRuntimeStatusFromError, applyRuntimeStatus } from '/assets/platform-runtime.js';"," const statusEl = document.getElementById('status');"," const identityEl = document.getElementById('identity');"," const dbReadyEl = document.getElementById('db-ready');"," const dbSchemaEl = document.getElementById('db-schema');"," const dbCapabilityEl = document.getElementById('db-capability');"," const dbContextEl = document.getElementById('db-context');"," const refreshEl = document.getElementById('refresh');"," async function refreshDbDebug() {"," applyRuntimeStatus(statusEl, { tone: 'neutral', message: '\u6B63\u5728\u8BFB\u53D6 DB \u8C03\u8BD5\u72B6\u6001...' });"," try {"," const [context, dbContext] = await Promise.all(["," fetch('/api/me').then((item) => item.json()).catch(() => null),"," fetch('/api/debug/db-context').then((item) => item.json()).catch(() => null)"," ]);"," identityEl.textContent = [dbContext?.tenant_id || context?.tenant_id || '-', dbContext?.app_id || context?.app_id || '-', dbContext?.env || context?.env || '-'].join(' / ');"," dbReadyEl.textContent = dbContext?.database_ready ? 'ready' : 'not_injected';"," dbSchemaEl.textContent = dbContext?.database_schema || '-';"," dbCapabilityEl.textContent = dbContext?.database_capability_version || '-';"," dbContextEl.textContent = dbContext ? JSON.stringify(dbContext, null, 2) : '-';"," applyRuntimeStatus(statusEl, dbContext?.database_ready"," ? { tone: 'success', message: '\u5DF2\u68C0\u6D4B\u5230 DATABASE_URL\u3002\u4E0B\u4E00\u6B65\u8BF7\u7528 platform db tables/query \u9A8C\u8BC1\u771F\u5B9E\u8868\u7ED3\u6784\u3002' }"," : { tone: 'warning', message: '\u5F53\u524D\u8FD8\u6CA1\u68C0\u6D4B\u5230 DATABASE_URL\u3002\u82E5\u8981\u8054\u8C03\u5E73\u53F0 DB\uFF0C\u8BF7\u6539\u7528 platform dev --remote-bindings\u3002' });"," } catch (error) {"," applyRuntimeStatus(statusEl, getRuntimeStatusFromError(error, 'DB \u8C03\u8BD5\u9875\u521D\u59CB\u5316\u5931\u8D25\u3002'));"," }"," }"," refreshEl.addEventListener('click', () => { void refreshDbDebug(); });"," void refreshDbDebug();"," </script>"," </body>","</html>`;","}",""].join(`
2467
- `)}function resolveWorkspaceDevTarget(target){if(!target)return null;let workspaceRoot=findWorkspaceRoot();return{command:`corepack pnpm --filter ${target.startsWith("@platform/")?target:`@platform/${target}`} dev`,cwd:workspaceRoot}}function buildDevEnvironment(binding,runtimeBindings={}){return{...process.env,PLATFORM_ACTIVE_TENANT_ID:binding?.tenant_id??"",PLATFORM_ACTIVE_APP_ID:binding?.app_id??"",PLATFORM_ACTIVE_ENV:binding?.env??"",PLATFORM_ACTIVE_APP_NAME:binding?.app_name??"",APP_ID:process.env.APP_ID??binding?.app_id??"",APP_ENV:process.env.APP_ENV??binding?.env??"preview",TENANT_ID:process.env.TENANT_ID??runtimeBindings.TENANT_ID??binding?.tenant_id??"",PUBLIC_APP_BASE_URL:process.env.PUBLIC_APP_BASE_URL??runtimeBindings.PUBLIC_APP_BASE_URL??"",CONTROL_API_BASE_URL:process.env.CONTROL_API_BASE_URL??runtimeBindings.CONTROL_API_BASE_URL??DEFAULT_CONTROL_API_BASE_URL,DATABASE_URL:process.env.DATABASE_URL??runtimeBindings.DATABASE_URL??"",DATABASE_SCHEMA:process.env.DATABASE_SCHEMA??runtimeBindings.DATABASE_SCHEMA??"",DATABASE_MIGRATOR_ROLE:process.env.DATABASE_MIGRATOR_ROLE??runtimeBindings.DATABASE_MIGRATOR_ROLE??"",DATABASE_RUNTIME_ROLE:process.env.DATABASE_RUNTIME_ROLE??runtimeBindings.DATABASE_RUNTIME_ROLE??"",DATABASE_CAPABILITY_VERSION:process.env.DATABASE_CAPABILITY_VERSION??runtimeBindings.DATABASE_CAPABILITY_VERSION??""}}function detectLocalDependencyInstallPlan(appDir){let packageJsonPath=join7(appDir,"package.json"),nodeModulesPath=join7(appDir,"node_modules");if(!existsSync11(packageJsonPath))return null;let packageJson=JSON.parse(readFileSync10(packageJsonPath,"utf8")),declaredPackageManager=typeof packageJson.packageManager=="string"?packageJson.packageManager.trim():"",declaredPackageManagerName=declaredPackageManager.includes("@")?declaredPackageManager.slice(0,declaredPackageManager.lastIndexOf("@")):declaredPackageManager,lockfiles=["package-lock.json","pnpm-lock.yaml","yarn.lock"].filter(fileName=>existsSync11(join7(appDir,fileName)));if(lockfiles.length>1)throw new Error(`[conflicting_lockfiles] \u68C0\u6D4B\u5230\u591A\u4E2A\u5305\u7BA1\u7406\u5668 lockfile\uFF1A${lockfiles.join(", ")}\u3002\u8BF7\u53EA\u4FDD\u7559\u9879\u76EE\u58F0\u660E\u7684\u5305\u7BA1\u7406\u5668 lockfile \u540E\u91CD\u8BD5\u3002`);let lockfilePackageManagers={"package-lock.json":"npm","pnpm-lock.yaml":"pnpm","yarn.lock":"yarn"},lockfile=lockfiles[0];if(declaredPackageManagerName&&lockfile&&lockfilePackageManagers[lockfile]!==declaredPackageManagerName)throw new Error(`[package_manager_lock_mismatch] packageManager ${declaredPackageManager} \u4E0E ${lockfile} \u4E0D\u5339\u914D\u3002\u8BF7\u4FDD\u7559\u4E0E packageManager \u4E00\u81F4\u7684 lockfile \u540E\u91CD\u8BD5\u3002`);return existsSync11(nodeModulesPath)?null:lockfile==="package-lock.json"?declaredPackageManagerName==="npm"&&declaredPackageManager?{command:"npx",args:["--yes",declaredPackageManager,"ci","--no-audit","--no-fund"],lockfile:"package-lock.json"}:{command:"npm",args:["ci","--no-audit","--no-fund"],lockfile:"package-lock.json"}:lockfile==="pnpm-lock.yaml"?{command:"corepack",args:["pnpm","install","--frozen-lockfile"],lockfile:"pnpm-lock.yaml"}:lockfile==="yarn.lock"?{command:"yarn",args:["install","--frozen-lockfile"],lockfile:"yarn.lock"}:null}function detectRequestedRemoteBindings(startDir=process.cwd()){let capabilities=new Set;try{let appRoot=findAppRoot(startDir);workspaceHasEffectiveDbMigration(appRoot)&&capabilities.add("db")}catch{return[]}return[...capabilities]}function templatePrefersPlatformCapabilityBindings(templateKey){return templateKey==="frontend-app-vite"||templateKey==="backend-app-node"}function recommendDevCommandForTemplate(templateKey,options={}){return(options.requestedRemoteBindings??[]).includes("db")?"platform dev --remote-bindings=db":templatePrefersPlatformCapabilityBindings(templateKey)?"platform dev --remote-bindings":null}function workspaceHasEffectiveDbMigration(appRoot){let migrationsDir=join7(appRoot,"resources","db","migrations");if(!existsSync11(migrationsDir)||!statSync2(migrationsDir).isDirectory())return!1;for(let entry of readdirSync3(migrationsDir,{withFileTypes:!0})){if(!entry.isFile())continue;if(readFileSync10(join7(migrationsDir,entry.name),"utf8").split(`
2467
+ `)}function resolveWorkspaceDevTarget(target){if(!target)return null;let workspaceRoot=findWorkspaceRoot();return{command:`corepack pnpm --filter ${target.startsWith("@platform/")?target:`@platform/${target}`} dev`,cwd:workspaceRoot}}function buildDevEnvironment(binding,runtimeBindings={}){return{...process.env,PLATFORM_ACTIVE_TENANT_ID:binding?.tenant_id??"",PLATFORM_ACTIVE_APP_ID:binding?.app_id??"",PLATFORM_ACTIVE_ENV:binding?.env??"",PLATFORM_ACTIVE_APP_NAME:binding?.app_name??"",APP_ID:process.env.APP_ID??binding?.app_id??"",APP_ENV:process.env.APP_ENV??binding?.env??"preview",TENANT_ID:process.env.TENANT_ID??runtimeBindings.TENANT_ID??binding?.tenant_id??"",PUBLIC_APP_BASE_URL:process.env.PUBLIC_APP_BASE_URL??runtimeBindings.PUBLIC_APP_BASE_URL??"",CONTROL_API_BASE_URL:process.env.CONTROL_API_BASE_URL??runtimeBindings.CONTROL_API_BASE_URL??DEFAULT_CONTROL_API_BASE_URL,DATABASE_URL:process.env.DATABASE_URL??runtimeBindings.DATABASE_URL??"",DATABASE_SCHEMA:process.env.DATABASE_SCHEMA??runtimeBindings.DATABASE_SCHEMA??"",DATABASE_MIGRATOR_ROLE:process.env.DATABASE_MIGRATOR_ROLE??runtimeBindings.DATABASE_MIGRATOR_ROLE??"",DATABASE_RUNTIME_ROLE:process.env.DATABASE_RUNTIME_ROLE??runtimeBindings.DATABASE_RUNTIME_ROLE??"",DATABASE_CAPABILITY_VERSION:process.env.DATABASE_CAPABILITY_VERSION??runtimeBindings.DATABASE_CAPABILITY_VERSION??""}}function detectLocalDependencyInstallPlan(appDir,options={}){let packageJsonPath=join7(appDir,"package.json"),nodeModulesPath=join7(appDir,"node_modules");if(!existsSync11(packageJsonPath))return null;let packageJson=JSON.parse(readFileSync10(packageJsonPath,"utf8")),declaredPackageManager=typeof packageJson.packageManager=="string"?packageJson.packageManager.trim():"",declaredPackageManagerMatch=declaredPackageManager?/^(npm|pnpm|yarn)@(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/u.exec(declaredPackageManager):null;if(declaredPackageManager&&!declaredPackageManagerMatch)throw new Error(`[package_manager_invalid] packageManager \u5FC5\u987B\u4F7F\u7528\u53D7\u652F\u6301\u5305\u7BA1\u7406\u5668\u7684\u7CBE\u786E\u7248\u672C\uFF0C\u4F8B\u5982 npm@10.9.2\u3001pnpm@11.15.1 \u6216 yarn@1.22.22\uFF1B\u5F53\u524D\u4E3A ${declaredPackageManager}\u3002`);let devEnginesPackageManagerMatch=parseLocalDevEnginesPackageManager(packageJson.devEngines);if(declaredPackageManagerMatch&&devEnginesPackageManagerMatch&&(declaredPackageManagerMatch[1]!==devEnginesPackageManagerMatch.name||localPackageManagerVersionsConflict(declaredPackageManagerMatch[2],devEnginesPackageManagerMatch.version)))throw new Error(`[package_manager_declaration_conflict] packageManager ${declaredPackageManager} \u4E0E devEngines.packageManager ${devEnginesPackageManagerMatch.name}@${devEnginesPackageManagerMatch.version} \u4E0D\u4E00\u81F4\u3002`);let declaredPackageManagerName=declaredPackageManagerMatch?.[1]??devEnginesPackageManagerMatch?.name??"",declaredPackageManagerVersion=declaredPackageManagerMatch?.[2]??devEnginesPackageManagerMatch?.version??"",selectedPackageManager=declaredPackageManagerName?`${declaredPackageManagerName}@${declaredPackageManagerVersion}`:"";if(declaredPackageManagerName&&!isSupportedLocalPackageManagerVersion(declaredPackageManagerName,declaredPackageManagerVersion))throw new Error(`[package_manager_version_unsupported] \u5F53\u524D CLI \u4E0D\u652F\u6301 ${selectedPackageManager}\uFF1B\u652F\u6301 npm 10.x\u3001pnpm 10.34+ / 11.4+\u3001yarn 1/3/4 \u7684\u7CBE\u786E\u7248\u672C\u58F0\u660E\u3002`);let lockfiles=["package-lock.json","pnpm-lock.yaml","yarn.lock"].filter(fileName=>existsSync11(join7(appDir,fileName))),lockfilePackageManagers={"package-lock.json":"npm","pnpm-lock.yaml":"pnpm","yarn.lock":"yarn"},declaredLockfile=Object.entries(lockfilePackageManagers).find(([,packageManager])=>packageManager===declaredPackageManagerName)?.[0];if(lockfiles.length>1&&(!declaredLockfile||!lockfiles.includes(declaredLockfile)))throw new Error(`[conflicting_lockfiles] \u68C0\u6D4B\u5230\u591A\u4E2A\u5305\u7BA1\u7406\u5668 lockfile\uFF1A${lockfiles.join(", ")}\u3002\u8BF7\u901A\u8FC7\u7CBE\u786E packageManager \u58F0\u660E\u9009\u62E9\u5176\u4E2D\u4E00\u4E2A\uFF0C\u6216\u53EA\u4FDD\u7559\u76EE\u6807\u5305\u7BA1\u7406\u5668\u7684 lockfile \u540E\u91CD\u8BD5\u3002`);let lockfile=declaredLockfile&&lockfiles.includes(declaredLockfile)?declaredLockfile:lockfiles[0];if(declaredPackageManagerName&&lockfile&&lockfilePackageManagers[lockfile]!==declaredPackageManagerName)throw new Error(`[package_manager_lock_mismatch] packageManager ${selectedPackageManager} \u4E0E ${lockfile} \u4E0D\u5339\u914D\u3002\u8BF7\u4FDD\u7559\u4E0E packageManager \u4E00\u81F4\u7684 lockfile \u540E\u91CD\u8BD5\u3002`);if(existsSync11(nodeModulesPath)&&!options.compatInstall)return null;if(lockfile==="package-lock.json")return declaredPackageManagerName==="npm"&&selectedPackageManager?{command:"npx",args:["--yes",selectedPackageManager,options.compatInstall?"install":"ci","--no-audit","--no-fund"],lockfile:"package-lock.json",mode:options.compatInstall?"compatible":"deterministic"}:{command:"npm",args:[options.compatInstall?"install":"ci","--no-audit","--no-fund"],lockfile:"package-lock.json",mode:options.compatInstall?"compatible":"deterministic"};if(lockfile==="pnpm-lock.yaml"){if(!declaredPackageManagerName){let lockfileContent=readFileSync10(join7(appDir,lockfile),"utf8"),lockfileVersion=/^\s*lockfileVersion:\s*['"]?([^'"\s]+)['"]?\s*$/mu.exec(lockfileContent)?.[1];if(lockfileVersion!=="9.0")throw new Error(`[pnpm_lockfile_version_unsupported] \u672A\u58F0\u660E\u5305\u7BA1\u7406\u5668\u7248\u672C\u7684\u5386\u53F2\u9879\u76EE\u4EC5\u652F\u6301 pnpm lockfileVersion 9.0\uFF1B\u5F53\u524D\u4E3A ${lockfileVersion??"unknown"}\u3002`)}return{command:"corepack",args:[declaredPackageManagerName==="pnpm"?`pnpm@${declaredPackageManagerVersion}`:"pnpm@11.15.1","install",options.compatInstall?"--no-frozen-lockfile":"--frozen-lockfile"],lockfile:"pnpm-lock.yaml",mode:options.compatInstall?"compatible":"deterministic"}}if(lockfile==="yarn.lock")return{command:declaredPackageManagerName==="yarn"?"corepack":"yarn",args:declaredPackageManagerName==="yarn"?[`yarn@${declaredPackageManagerVersion}`,"install",...options.compatInstall?[]:["--frozen-lockfile"]]:options.compatInstall?["install"]:["install","--frozen-lockfile"],lockfile:"yarn.lock",mode:options.compatInstall?"compatible":"deterministic"};if(!options.compatInstall)throw new Error("[lockfile_missing] \u5F53\u524D\u9879\u76EE\u7F3A\u5C11 package-lock.json\u3001pnpm-lock.yaml \u6216 yarn.lock\uFF1BCLI \u9ED8\u8BA4\u4E0D\u4F1A\u6267\u884C\u975E\u786E\u5B9A\u6027\u5B89\u88C5\u3002\u5982\u786E\u8BA4\u8981\u4E3A\u5386\u53F2\u9879\u76EE\u751F\u6210 lockfile\uFF0C\u8BF7\u663E\u5F0F\u6267\u884C `platform dev --compat-install`\u3002");return declaredPackageManagerName==="pnpm"?{command:"corepack",args:[`pnpm@${declaredPackageManagerVersion}`,"install"],lockfile:"package.json",mode:"unlocked"}:declaredPackageManagerName==="yarn"?{command:"corepack",args:[`yarn@${declaredPackageManagerVersion}`,"install"],lockfile:"package.json",mode:"unlocked"}:declaredPackageManagerName==="npm"&&selectedPackageManager?{command:"npx",args:["--yes",selectedPackageManager,"install","--no-audit","--no-fund"],lockfile:"package.json",mode:"unlocked"}:{command:"npm",args:["install","--no-audit","--no-fund"],lockfile:"package.json",mode:"unlocked"}}function localPackageManagerVersionsConflict(left,right){let[leftVersion,leftIntegrity]=left.split("+",2),[rightVersion,rightIntegrity]=right.split("+",2);return leftVersion!==rightVersion||!!(leftIntegrity&&rightIntegrity&&leftIntegrity!==rightIntegrity)}function parseLocalDevEnginesPackageManager(devEngines){if(!devEngines||typeof devEngines!="object"||Array.isArray(devEngines))return null;let packageManager=devEngines.packageManager;if(packageManager===void 0)return null;if(!packageManager||typeof packageManager!="object"||Array.isArray(packageManager))throw new Error("[package_manager_dev_engines_invalid] devEngines.packageManager \u5FC5\u987B\u5305\u542B\u7CBE\u786E\u7684 name \u4E0E version\u3002");let value=packageManager;if(typeof value.name!="string"||typeof value.version!="string")throw new Error("[package_manager_dev_engines_invalid] devEngines.packageManager \u5FC5\u987B\u5305\u542B\u7CBE\u786E\u7684 name \u4E0E version\u3002");let match2=/^(npm|pnpm|yarn)@(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?)$/u.exec(`${value.name.trim()}@${value.version.trim()}`);if(!match2)throw new Error(`[package_manager_dev_engines_invalid] \u4E0D\u652F\u6301\u975E\u7CBE\u786E devEngines.packageManager ${value.name}@${value.version}\u3002`);return{name:match2[1],version:match2[2]}}function isSupportedLocalPackageManagerVersion(packageManager,version){let major=Number(version.split(".",1)[0]);if(!Number.isInteger(major))return!1;if(packageManager==="npm")return major===10;if(packageManager==="pnpm"){let[coreVersion,prerelease]=version.split("-",2),[,minor]=coreVersion.split(".").map(Number);return prerelease?!1:major===10&&minor>=34||major===11&&minor>=4}return packageManager==="yarn"?major===1||major===3||major===4:!1}function detectRequestedRemoteBindings(startDir=process.cwd()){let capabilities=new Set;try{let appRoot=findAppRoot(startDir);workspaceHasEffectiveDbMigration(appRoot)&&capabilities.add("db")}catch{return[]}return[...capabilities]}function templatePrefersPlatformCapabilityBindings(templateKey){return templateKey==="frontend-app-vite"||templateKey==="backend-app-node"}function recommendDevCommandForTemplate(templateKey,options={}){return(options.requestedRemoteBindings??[]).includes("db")?"platform dev --remote-bindings=db":templatePrefersPlatformCapabilityBindings(templateKey)?"platform dev --remote-bindings":null}function workspaceHasEffectiveDbMigration(appRoot){let migrationsDir=join7(appRoot,"resources","db","migrations");if(!existsSync11(migrationsDir)||!statSync2(migrationsDir).isDirectory())return!1;for(let entry of readdirSync3(migrationsDir,{withFileTypes:!0})){if(!entry.isFile())continue;if(readFileSync10(join7(migrationsDir,entry.name),"utf8").split(`
2468
2468
  `).map(line=>line.replace(/--.*$/,"").trim()).filter(Boolean).join(`
2469
2469
  `).trim().length>0)return!0}return!1}async function resolveAvailableLocalDevPort(preferredPort,options={}){let host=options.host;return await canBindPort(preferredPort,host)?{port:preferredPort,reusedPreferred:!0}:{port:await allocateEphemeralPort(host),reusedPreferred:!1}}async function canBindPort(port,host){return new Promise(resolve20=>{let server=createNetServer(),finish=available=>{server.removeAllListeners(),resolve20(available)};server.once("error",()=>{finish(!1)});let onListening=()=>{server.close(()=>finish(!0))};if(host){server.listen(port,host,onListening);return}server.listen(port,onListening)})}async function allocateEphemeralPort(host){return new Promise((resolve20,reject)=>{let server=createNetServer();server.once("error",error=>{reject(error instanceof Error?error:new Error(String(error)))});let onListening=()=>{let address=server.address();if(!address||typeof address=="string"){server.close(()=>reject(new Error("\u65E0\u6CD5\u4E3A\u672C\u5730 dev \u5206\u914D\u56DE\u9000\u7AEF\u53E3\u3002")));return}let{port}=address;server.close(error=>{if(error){reject(error);return}resolve20(port)})};if(host){server.listen(0,host,onListening);return}server.listen(0,onListening)})}function collectDevPreflight(startDir=process.cwd(),target,runtimeBindings={}){let{manifest,directory}=readAppManifest(startDir),linked=readBinding(startDir);if(!linked?.binding.tenant_id||!linked.binding.app_id){let sourceContextPath=join7(directory,SOURCE_CONTEXT_FILE);throw new Error(existsSync11(sourceContextPath)?"\u5F53\u524D\u9879\u76EE\u672A\u7ED1\u5B9A tenant/app/env\u3002\u4F18\u5148\u5EFA\u8BAE\u6267\u884C `platform app create ...` \u6216 `platform app checkout --tenant <tenant-id> --app <app-id> --dir <project-name>` \u83B7\u53D6\u4E00\u4E2A\u5DF2\u7ED1\u5B9A\u76EE\u5F55\uFF1B\u82E5\u4F60\u8981\u4FEE\u590D\u5F53\u524D\u76EE\u5F55\uFF0C\u518D\u624B\u52A8\u6267\u884C `platform link --tenant <tenant-id> --app <app-id> --env preview`\u3002":"\u5F53\u524D\u76EE\u5F55\u5DF2\u68C0\u6D4B\u5230 `app.yaml`\uFF0C\u4F46\u7F3A\u5C11 `.platform/source-context.json`\uFF0C\u770B\u8D77\u6765\u50CF\u4E00\u4E2A\u5DF2\u8FC1\u79FB\u6216\u672A\u91CD\u65B0\u7ED1\u5B9A\u7684\u5E94\u7528\u5DE5\u7A0B\u3002\u8BF7\u6267\u884C `platform link --tenant <tenant-id> --app <app-id> --env preview` \u91CD\u65B0\u7ED1\u5B9A\u5F53\u524D\u76EE\u5F55\u3002")}let sourceContext=readSourceContext(startDir)?.sourceContext,workspaceTarget=resolveWorkspaceDevTarget(target),command=workspaceTarget?.command??manifest.entry.command,cwd=workspaceTarget?.cwd??directory,env=buildDevEnvironment(linked.binding,runtimeBindings),port=Number(env.PORT||manifest.entry.port||3e3);env.PUBLIC_APP_BASE_URL||(env.PUBLIC_APP_BASE_URL=`http://127.0.0.1:${port}`);let healthPath=manifest.entry.health_check||"/healthz",resolvedTemplateKey=typeof sourceContext?.template_key=="string"&&sourceContext.template_key.trim().length>0?sourceContext.template_key.trim():manifest.template_key,devCommandAnalysis=analyzeDevCommand(command,cwd),previewAddressMayChange=!manifest.dev.auto_restart&&devCommandAnalysis.portMayChange,warnings=["\u5F53\u524D\u9ED8\u8BA4\u8D70\u8F7B\u91CF\u5F00\u53D1\u6A21\u5F0F\uFF1A\u672C\u5730\u5F00\u53D1\u4E0D\u8981\u6C42 registry\u3001kind\u3001ingress-nginx \u6216 build-runner\u3002",`\u5F53\u524D\u542F\u52A8\u547D\u4EE4\u6765\u81EA app.yaml \u7684 entry.command\uFF1A${command}`];return manifest.dev.auto_restart?warnings.push("\u5F53\u524D app.yaml \u5DF2\u914D\u7F6E `dev.auto_restart: true`\uFF1BCLI \u4F1A\u5728\u68C0\u6D4B\u5230\u6E90\u7801\u53D8\u66F4\u540E\u81EA\u52A8\u91CD\u542F dev \u5B50\u8FDB\u7A0B\u3002"):devCommandAnalysis.managedByCommand?warnings.push(devCommandAnalysis.message):warnings.push("\u5F53\u524D\u547D\u4EE4\u81EA\u8EAB\u4E0D\u5E26\u70ED\u66F4\u65B0\uFF1BCLI \u9ED8\u8BA4\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F\u3002\u82E5\u4F60\u9700\u8981\u81EA\u52A8\u91CD\u542F\uFF0C\u8BF7\u5728 app.yaml \u4E2D\u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\u3002"),env.DATABASE_URL||warnings.push("\u672A\u68C0\u6D4B\u5230 DATABASE_URL\uFF1B\u672C\u5730\u6A21\u677F\u63A5\u53E3\u548C\u9875\u9762\u5F00\u53D1\u4ECD\u53EF\u7EE7\u7EED\u3002\u82E5\u4F60\u9700\u8981\u8054\u8C03\u5E73\u53F0 DB\uFF0C\u518D\u6267\u884C `platform dev --remote-bindings` \u6216\u624B\u52A8\u8BBE\u7F6E\u672C\u5730\u73AF\u5883\u53D8\u91CF\u3002"),templatePrefersPlatformCapabilityBindings(resolvedTemplateKey)&&warnings.push("\u5F53\u524D\u5B98\u65B9\u6A21\u677F\u9ED8\u8BA4\u5E26 Auth / CMS / Data Form \u793A\u4F8B\u9875\u3002\u82E5\u4F60\u8981\u8054\u8C03\u8FD9\u4E9B\u771F\u5B9E\u5E73\u53F0\u80FD\u529B\uFF0C\u5EFA\u8BAE\u76F4\u63A5\u6267\u884C `platform dev --remote-bindings`\u3002"),!process.env.PUBLIC_APP_BASE_URL&&!runtimeBindings.PUBLIC_APP_BASE_URL&&warnings.push(`\u672A\u663E\u5F0F\u914D\u7F6E PUBLIC_APP_BASE_URL\uFF1B\u672C\u5730 dev \u5DF2\u4E34\u65F6\u56DE\u9000\u4E3A ${env.PUBLIC_APP_BASE_URL}\u3002`),resolvedTemplateKey&&resolvedTemplateKey!=="frontend-app-vite"&&resolvedTemplateKey!=="backend-app-node"&&warnings.push(`\u5F53\u524D\u6A21\u677F\u4E3A ${resolvedTemplateKey}\uFF0C\u8BF7\u786E\u8BA4\u5165\u53E3\u547D\u4EE4\u4E0E\u5065\u5EB7\u68C0\u67E5\u8DEF\u5F84\u5DF2\u7ECF\u548C app.yaml \u5BF9\u9F50\u3002`),{binding:linked.binding,manifest,templateKey:resolvedTemplateKey,directory,command,cwd,env,healthcheckUrl:`http://localhost:${port}${healthPath}`,previewAddressMayChange,warnings}}function analyzeDevCommand(command,cwd){if(/(--watch|\bwatch\b|nodemon|vite|next dev|webpack serve|tsx watch)/iu.test(command))return{managedByCommand:!0,portMayChange:/\bvite\b/iu.test(command),message:"\u5F53\u524D\u547D\u4EE4\u81EA\u8EAB\u5DF2\u5305\u542B watch / \u70ED\u66F4\u65B0\u80FD\u529B\uFF1BCLI \u9ED8\u8BA4\u4E0D\u4F1A\u989D\u5916\u63A5\u7BA1\u81EA\u52A8\u91CD\u542F\u3002"};let npmScriptMatch=command.trim().match(/^(?:npm|pnpm|yarn)\s+run\s+([a-zA-Z0-9:_-]+)|^corepack\s+pnpm\s+run\s+([a-zA-Z0-9:_-]+)/u),scriptName=npmScriptMatch?.[1]??npmScriptMatch?.[2];if(!scriptName)return{managedByCommand:!1,portMayChange:!1,message:"\u5F53\u524D\u547D\u4EE4\u81EA\u8EAB\u4E0D\u5E26\u70ED\u66F4\u65B0\uFF1BCLI \u9ED8\u8BA4\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F\u3002\u82E5\u4F60\u9700\u8981\u81EA\u52A8\u91CD\u542F\uFF0C\u8BF7\u5728 app.yaml \u4E2D\u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\u3002"};let packageJsonPath=join7(cwd,"package.json");if(!existsSync11(packageJsonPath))return{managedByCommand:!1,portMayChange:!1,message:"\u5F53\u524D\u547D\u4EE4\u81EA\u8EAB\u4E0D\u5E26\u70ED\u66F4\u65B0\uFF1BCLI \u9ED8\u8BA4\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F\u3002\u82E5\u4F60\u9700\u8981\u81EA\u52A8\u91CD\u542F\uFF0C\u8BF7\u5728 app.yaml \u4E2D\u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\u3002"};try{let scriptCommand=JSON.parse(readFileSync10(packageJsonPath,"utf8")).scripts?.[scriptName];if(typeof scriptCommand=="string"&&/(--watch|\bwatch\b|nodemon|vite|next dev|webpack serve|tsx watch|scripts\/dev\.mjs|scripts\\dev\.mjs)/iu.test(scriptCommand))return{managedByCommand:!0,portMayChange:/\bvite\b|scripts\/dev\.mjs|scripts\\dev\.mjs/iu.test(scriptCommand),message:scriptCommand.includes("scripts/dev.mjs")?"\u5F53\u524D\u547D\u4EE4\u901A\u8FC7\u6A21\u677F\u81EA\u5E26\u7684\u672C\u5730 dev \u7F16\u6392\u811A\u672C\u542F\u52A8\uFF1B\u524D\u7AEF\u70ED\u66F4\u65B0\u4E0E\u670D\u52A1\u7AEF\u81EA\u52A8\u91CD\u542F\u7531\u6A21\u677F\u81EA\u5DF1\u7BA1\u7406\uFF0CCLI \u4E0D\u4F1A\u989D\u5916\u63A5\u7BA1\u81EA\u52A8\u91CD\u542F\u3002":"\u5F53\u524D\u547D\u4EE4\u901A\u8FC7 package.json script \u81EA\u5E26 watch / \u70ED\u66F4\u65B0\u80FD\u529B\uFF1BCLI \u9ED8\u8BA4\u4E0D\u4F1A\u989D\u5916\u63A5\u7BA1\u81EA\u52A8\u91CD\u542F\u3002"}}catch{return{managedByCommand:!1,portMayChange:!1,message:"\u5F53\u524D\u547D\u4EE4\u81EA\u8EAB\u4E0D\u5E26\u70ED\u66F4\u65B0\uFF1BCLI \u9ED8\u8BA4\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F\u3002\u82E5\u4F60\u9700\u8981\u81EA\u52A8\u91CD\u542F\uFF0C\u8BF7\u5728 app.yaml \u4E2D\u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\u3002"}}return{managedByCommand:!1,portMayChange:!1,message:"\u5F53\u524D\u547D\u4EE4\u81EA\u8EAB\u4E0D\u5E26\u70ED\u66F4\u65B0\uFF1BCLI \u9ED8\u8BA4\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F\u3002\u82E5\u4F60\u9700\u8981\u81EA\u52A8\u91CD\u542F\uFF0C\u8BF7\u5728 app.yaml \u4E2D\u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\u3002"}}async function runAppLibraryCommand(args,deps={}){let subcommand=args.rest[0];if(hasHelpFlag2(args)||args.rest.length===0||subcommand==="help"){printAppLibraryHelp();return}if(subcommand==="config"){await runConfig(args);return}let sdk=deps.sdk,tenantId=deps.tenantId;if(!sdk||!tenantId){let credentials=await loadStoredCredentialsEnsuringFresh();if(!credentials)throw new Error("\u672A\u627E\u5230\u672C\u5730\u51ED\u636E\uFF0C\u8BF7\u5148\u6267\u884C `platform login`\u3002");if(tenantId=deps.tenantId??resolveTenantId(args),!tenantId)throw new Error("`platform app-library` \u9700\u8981 tenant \u4E0A\u4E0B\u6587\u3002\u8BF7\u5148\u5728\u5F53\u524D\u9879\u76EE\u7ED1\u5B9A tenant/app\uFF0C\u6216\u663E\u5F0F\u4F20\u5165 `--tenant`\u3002");sdk=createControlApiSdk({accessToken:selectApiToken(credentials),tenantId,capability:"dashboard",requestClass:"control"})}switch(subcommand){case"list":await runList(args,sdk);return;case"search":await runSearch(args,sdk);return;case"inspect":await runInspect(args,sdk);return;case"source":await runSource(args,sdk);return;case"open":await runOpen(args,deps);return;case"checkout":await runCheckout(args,sdk);return;case"create":await runCreate(args,sdk);return;case"update":await runUpdate(args,sdk);return;case"submit":await runSubmit(args,sdk,deps);return;case"publish":await runStateAction(args,sdk,"publish");return;case"unpublish":await runStateAction(args,sdk,"unpublish");return;case"archive":await runStateAction(args,sdk,"archive");return;case"delete":await runDelete(args,sdk);return;default:throw new Error("`platform app-library` \u4EC5\u652F\u6301 `list`\u3001`search`\u3001`inspect`\u3001`source`\u3001`config`\u3001`open`\u3001`checkout`\u3001`create`\u3001`update`\u3001`submit`\u3001`publish`\u3001`unpublish`\u3001`archive`\u3001`delete`\u3002")}}function printAppLibraryHelp(){process.stdout.write(["platform app-library <command>","","Commands:"," platform app-library list [--query <keyword>] [--status draft|published|unpublished|archived] [--tag <tag>] [--template-key <key>] [--visibility private|public] [--full] [--json]"," platform app-library search <keyword> [--status draft|published|unpublished|archived] [--full] [--json]"," platform app-library inspect <entry-id> [--json]"," platform app-library source tree <entry-id> [--json]"," platform app-library source read <entry-id> <path> [--json]"," platform app-library source search <entry-id> <query> [--json]"," platform app-library config init [--file app-library.yaml] [--force]"," platform app-library config validate [--file app-library.yaml] [--json]"," platform app-library open <entry-id> [--no-browser]"," platform app-library checkout <entry-id> [--dir <target-dir>] [--write-config] [--no-config] [--json]"," platform app-library create [--file app-library.yaml] [--name <name>] [--summary <text>] [--tags a,b] [--template-key <key>] [--write-config] [--json]"," platform app-library update <entry-id> [--file app-library.yaml] [--name <name>] [--summary <text>] [--tags a,b] [--template-key <key>] [--write-config] [--json]"," platform app-library submit <entry-id> [--file app-library.yaml] [--json]"," platform app-library publish <entry-id> [--json]"," platform app-library unpublish <entry-id> [--json]"," platform app-library archive <entry-id> [--json]"," platform app-library delete <entry-id> [--json]","","Notes:"," - \u521D\u671F\u4EC5\u652F\u6301 `example-app` \u6761\u76EE"," - `list` / `search` \u9ED8\u8BA4\u8FD4\u56DE\u8F7B\u6458\u8981\uFF1B\u5982\u9700\u5B8C\u6574\u5B57\u6BB5\u8BF7\u663E\u5F0F\u4F20 `--full`\uFF0C\u6216\u8FDB\u4E00\u6B65\u6267\u884C `inspect`"," - `list` / `search` \u9ED8\u8BA4\u4F1A\u67E5\u8BE2\u672C\u79DF\u6237 + \u8DE8\u79DF\u6237\u5DF2\u53D1\u5E03\u6761\u76EE\uFF1B\u5982\u663E\u5F0F\u4F20 `--status draft|unpublished|archived`\uFF0C\u5219\u4EC5\u67E5\u8BE2\u672C\u79DF\u6237\u6761\u76EE"," - `submit` \u9700\u8981\u5728\u672C\u5730\u8F7B\u5E94\u7528\u76EE\u5F55\u6267\u884C\uFF0C\u4F1A\u8BFB\u53D6\u5F53\u524D\u6E90\u7801\u5DE5\u4F5C\u533A\u5E76\u4E0A\u4F20\u4E3A\u5F53\u524D\u5FEB\u7167"," - \u5143\u6570\u636E\u9ED8\u8BA4\u8BFB\u53D6\u5F53\u524D\u5E94\u7528\u6839\u76EE\u5F55\u4E0B\u7684 `app-library.yaml`\uFF0CCLI flags \u53EF\u8986\u76D6\u540C\u540D\u5B57\u6BB5"," - `create` / `update` \u5728\u68C0\u6D4B\u5230\u73B0\u6709\u914D\u7F6E\u6587\u4EF6\u6216\u663E\u5F0F\u4F20\u5165 `--write-config` \u65F6\uFF0C\u4F1A\u628A\u6700\u65B0\u5143\u6570\u636E\u56DE\u5199\u5230 `app-library.yaml`"," - `checkout` \u9ED8\u8BA4\u5728\u76EE\u6807\u6E90\u7801\u4E0D\u5305\u542B `app-library.yaml` \u65F6\u81EA\u52A8\u751F\u6210\u4E00\u4EFD\uFF1B\u53EF\u7528 `--write-config` \u5F3A\u5236\u8986\u76D6\uFF0C`--no-config` \u8DF3\u8FC7"," - `open` \u9ED8\u8BA4\u6253\u5F00\u672C\u5730 tenant-workbench \u7684 `#app-library/<entry-id>` \u8DEF\u7531"," - `source tree/read/search` \u7528\u4E8E\u4E0D checkout \u7684\u4E91\u7AEF\u6E90\u7801\u7406\u89E3",""].join(`
2470
2470
  `))}async function runList(args,sdk){let status=readStatusOption(args,"status")??"published",includePublic=status==="published",response=await sdk.listLightAppLibraryEntries({query:readStringOption2(args,"query"),status,template_key:readStringOption2(args,"template-key"),tag:readStringOption2(args,"tag"),visibility:readVisibilityOption(args,"visibility"),include_public:includePublic}).catch(error=>{throw formatAppLibraryError(error,"list")}),full=args.options.full===!0;writeJsonOrText(args.options.json===!0,full?response:toEntryListBriefPayload(response),[`items: ${response.items.length}`,...response.items.flatMap((item,index)=>formatEntrySummary(item,index+1,full))])}async function runSearch(args,sdk){let query=args.rest[1]?.trim();if(!query)throw new Error("`platform app-library search` \u9700\u8981 <keyword>\u3002");let status=readStatusOption(args,"status")??"published",includePublic=status==="published",response=await sdk.listLightAppLibraryEntries({query,status,include_public:includePublic}).catch(error=>{throw formatAppLibraryError(error,"search")}),full=args.options.full===!0;writeJsonOrText(args.options.json===!0,full?response:toEntryListBriefPayload(response),[`query: ${query}`,`items: ${response.items.length}`,...response.items.flatMap((item,index)=>formatEntrySummary(item,index+1,full))])}async function runInspect(args,sdk){let config2=loadAppLibraryConfigOptional(),entryId=resolveEntryId(args,config2);if(!entryId)throw new Error("`platform app-library inspect` \u9700\u8981 <entry-id>\uFF0C\u6216\u5728 `app-library.yaml` \u4E2D\u63D0\u4F9B `entry_id`\u3002");let[entry,source]=await Promise.all([sdk.getLightAppLibraryEntry(entryId).catch(error=>{throw formatAppLibraryError(error,"inspect")}),sdk.getLightAppLibraryEntrySource(entryId).catch(error=>{throw formatAppLibraryError(error,"inspect(source)")})]);writeJsonOrText(args.options.json===!0,{entry,source},[`entry_id: ${entry.entry_id}`,`name: ${entry.name}`,`type: ${entry.type==="example_app"?"example-app":entry.type}`,`status: ${entry.status}`,`library: ${entry.library.name} (${entry.library.visibility})`,`summary: ${entry.summary?.trim()||"-"}`,`tags: ${entry.tags.length?entry.tags.join(", "):"-"}`,`template_key: ${entry.template_key??"-"}`,`capabilities: ${entry.capability_dependencies.length?entry.capability_dependencies.map(item=>item.minVersion?`${item.capability}@${item.minVersion}`:item.capability).join(", "):"-"}`,`current_snapshot_id: ${entry.current_snapshot_id??"-"}`,`source_files: ${source.files.length}`,`key_files: ${source.files.filter(file=>file.is_key_file).slice(0,8).map(file=>file.path).join(", ")||"-"}`,`next.inspect: platform app-library inspect ${entry.entry_id} --json`,`next.checkout: platform app-library checkout ${entry.entry_id} --dir ./${sanitizeDirectoryName(entry.name||entry.entry_id)}`])}async function runSource(args,sdk){let action=args.rest[1];if(action==="tree"){await runSourceTree(args,sdk);return}if(action==="read"){await runSourceRead(args,sdk);return}if(action==="search"){await runSourceSearch(args,sdk);return}throw new Error("`platform app-library source` \u4EC5\u652F\u6301 `tree`\u3001`read`\u3001`search`\u3002")}async function runConfig(args){let action=args.rest[1];if(action==="init"){runConfigInit(args);return}if(action==="validate"){runConfigValidate(args);return}throw new Error("`platform app-library config` \u4EC5\u652F\u6301 `init`\u3001`validate`\u3002")}async function runSourceTree(args,sdk){let entryId=resolvePositionalOrConfigEntryId(args,2);if(!entryId)throw new Error("`platform app-library source tree` \u9700\u8981 <entry-id>\uFF0C\u6216\u5728 `app-library.yaml` \u4E2D\u63D0\u4F9B `entry_id`\u3002");let source=await sdk.getLightAppLibraryEntrySource(entryId).catch(error=>{throw formatAppLibraryError(error,"source(tree)")});writeJsonOrText(args.options.json===!0,source,[`entry_id: ${entryId}`,`snapshot_id: ${source.snapshot_id}`,`files: ${source.files.length}`,...source.files.map(file=>{let markers=[file.is_key_file?"key":null,file.is_text?"text":"binary",file.ext||"-"].filter(Boolean).join(", ");return`- ${file.path} [${markers}]`})])}async function runSourceRead(args,sdk){let entryId=resolvePositionalOrConfigEntryId(args,2);if(!entryId)throw new Error("`platform app-library source read` \u9700\u8981 <entry-id>\uFF0C\u6216\u5728 `app-library.yaml` \u4E2D\u63D0\u4F9B `entry_id`\u3002");let path3=args.rest[3]?.trim()||readStringOption2(args,"path");if(!path3)throw new Error("`platform app-library source read` \u9700\u8981 <path>\uFF0C\u6216\u663E\u5F0F\u4F20\u5165 `--path`\u3002");let response=await sdk.readLightAppLibraryEntrySourceFile(entryId,path3).catch(error=>{throw formatAppLibraryError(error,"source(read)")});if(args.options.json===!0){writeJsonOrText(!0,response,[]);return}process.stdout.write(`# ${response.file.path}
@@ -2732,7 +2732,7 @@ ${normalized}`}function countExecutableSqlStatements(sql){return stripSqlComment
2732
2732
  `)}async function runWorkflowBindingSubcommand(sdk,context,args){let action=args.rest[1];if(action==="list"){let items=await sdk.listWorkflowBindings({target_id:readStringOption13(args,"target-id")??readStringOption13(args,"app")??context.appId,definition_key:readStringOption13(args,"definition")??readStringOption13(args,"definition-key")});process6.stdout.write(`${JSON.stringify(items,null,2)}
2733
2733
  `);return}if(action==="inspect"){let definitionKey=readStringOption13(args,"definition")??readStringOption13(args,"definition-key")??readStringOption13(args,"binding"),targetScope=readStringOption13(args,"target-scope")??"tenant_app",targetId=readStringOption13(args,"target-id")??readStringOption13(args,"app")??context.appId;if(!definitionKey||!targetId)throw new Error("`platform workflow binding inspect` \u9700\u8981 `--definition <key>` \u548C `--target-id <id>`\uFF1B\u5728\u8F7B\u5E94\u7528\u4E0A\u4E0B\u6587\u91CC\u53EF\u7701\u7565 `--target-id`\u3002");let item=(await sdk.listWorkflowBindings({target_id:targetId,definition_key:definitionKey})).find(candidate=>candidate.definition_key===definitionKey&&candidate.target_id===targetId);if(!item)throw new Error(`\u672A\u627E\u5230 Workflow binding: ${definitionKey} @ ${targetId}`);let[override,roleBindings]=await Promise.all([sdk.getWorkflowBindingOverride({target_scope:targetScope,target_id:targetId,definition_key:definitionKey}),sdk.listWorkflowRoleBindings({target_scope:targetScope,target_id:targetId,definition_key:definitionKey})]);process6.stdout.write(`${JSON.stringify({binding:item,override,role_bindings:roleBindings},null,2)}
2734
2734
  `);return}if(action==="update"){let file=readStringOption13(args,"file"),payloadFromFile=file?readJsonFile(file):null,definitionKey=readStringOption13(args,"definition")??readStringOption13(args,"definition-key")??readString(payloadFromFile,"definition_key"),targetScope=readStringOption13(args,"target-scope")??readString(payloadFromFile,"target_scope")??"tenant_app",targetId=readStringOption13(args,"target-id")??readStringOption13(args,"app")??context.appId??readString(payloadFromFile,"target_id");if(!file||!definitionKey||!targetId)throw new Error("`platform workflow binding update` \u9700\u8981 `--file <override.json>`\u3001`--definition <key>`\uFF0C\u4EE5\u53CA `--target-id <id>`\uFF1B\u5728\u8F7B\u5E94\u7528\u4E0A\u4E0B\u6587\u91CC\u53EF\u7701\u7565 `--target-id`\u3002");let item=await sdk.saveWorkflowBindingOverride({tenant_id:context.tenantId,definition_key:definitionKey,target_scope:targetScope,target_id:targetId,state_overrides:payloadFromFile?.state_overrides??[],action_overrides:payloadFromFile?.action_overrides??[]});targetScope==="tenant_app"&&await syncLocalControlPlaneSummary({sdk,startDir:process6.cwd(),tenantId:context.tenantId,appId:targetId}),process6.stdout.write(`${JSON.stringify(item,null,2)}
2735
- `);return}throw new Error("`platform workflow binding` \u76EE\u524D\u4EC5\u652F\u6301 `list`\u3001`inspect` \u6216 `update`\u3002")}function resolveWorkflowContext(args){let storedContext=loadStoredCliContext(),binding;try{binding=readBinding(findAppRoot(process6.cwd()))?.binding}catch{binding=void 0}return{tenantId:readStringOption13(args,"tenant")??binding?.tenant_id??storedContext?.selected_app_tenant_id,appId:readStringOption13(args,"app")??binding?.app_id??storedContext?.selected_app_id}}function readStringOption13(args,key){let value=args.options[key];return typeof value=="string"?value:void 0}function readJsonOption(args,key){let value=readStringOption13(args,key);if(value)return JSON.parse(value)}function readJsonFile(path3){return JSON.parse(readFileSync28(path3,"utf8"))}function readString(record,key){let value=record?.[key];return typeof value=="string"?value:void 0}function readNullableString(record,key){let value=record?.[key];return value===null?null:typeof value=="string"?value:void 0}function getDevHelpLines(){return["platform dev","","\u7B2C\u4E00\u9636\u6BB5\u53EF\u7528\u5165\u53E3\uFF1A"," platform dev"," platform dev --remote-bindings"," platform dev --remote-bindings=db"," platform dev push"," platform dev preview generate"," platform dev preview open","","\u8BF4\u660E\uFF1A"," - `platform dev` \u7EE7\u7EED\u4F5C\u4E3A\u672C\u5730\u8F7B\u91CF\u5F00\u53D1\u5165\u53E3\uFF0C\u5B9E\u9645\u6267\u884C app.yaml \u4E2D\u7684 `entry.command`"," - `platform dev` \u9ED8\u8BA4\u5355\u6B21\u542F\u52A8 `entry.command`\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F"," - \u82E5 app.yaml \u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\uFF0CCLI \u624D\u4F1A\u76D1\u542C\u6E90\u7801\u53D8\u66F4\u5E76\u81EA\u52A8\u91CD\u542F\u672C\u5730 dev \u5B50\u8FDB\u7A0B"," - `platform dev --remote-bindings` \u9ED8\u8BA4\u6309 `auto` \u6A21\u5F0F\u8FD0\u884C\uFF1A\u53EA\u5C1D\u8BD5\u6CE8\u5165\u5F53\u524D\u5DE5\u4F5C\u533A\u5DF2\u58F0\u660E\u7684\u8FDC\u7AEF binding"," - \u82E5\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u68C0\u6D4B\u5230\u771F\u5B9E DB migration\uFF0C`platform dev --remote-bindings` \u4F1A\u8DF3\u8FC7 DB binding\uFF0C\u4E0D\u963B\u65AD\u672C\u5730\u542F\u52A8"," - \u82E5\u4F60\u786E\u8BA4\u8981\u8054\u8C03\u5E73\u53F0 DB\uFF0C\u53EF\u663E\u5F0F\u6267\u884C `platform dev --remote-bindings=db`"," - `platform dev` \u8F93\u51FA\u7684\u662F\u672C\u5730\u9884\u89C8\u5730\u5740\uFF1B\u4E91\u7AEF\u53EF\u5206\u4EAB\u7684 Preview \u9700\u8981\u5355\u72EC\u6267\u884C `platform preview generate` \u6216 `platform dev preview generate`"," - `platform dev push` \u5C06\u5F53\u524D\u672C\u5730\u6E90\u7801\u8986\u76D6\u63A8\u9001\u5230\u4E91\u7AEF Dev Workspace"," - `platform dev preview generate/open` \u53EA\u64CD\u4F5C\u5DE5\u4F5C\u533A Preview"," - \u6B63\u5F0F\u7248\u672C\u751F\u6210\u7EE7\u7EED\u4F7F\u7528 `platform app submit`"," - \u7B2C\u4E00\u9636\u6BB5\u4E0D\u5F15\u5165 `platform dev save`","","\u793A\u4F8B\uFF1A"," platform dev"," platform dev --remote-bindings"," platform dev --remote-bindings=db"," platform dev push"," platform dev preview generate"," platform dev preview open",' platform app submit --message "formal version"',""]}function getDevPreviewHelpLines(){return["platform dev preview","","\u53EF\u7528\u5B50\u547D\u4EE4\uFF1A"," platform dev preview generate"," platform dev preview open","","\u8BF4\u660E\uFF1A"," - `generate` \u57FA\u4E8E\u4E91\u7AEF Dev Workspace \u751F\u6210\u5DE5\u4F5C\u533A Preview"," - `open` \u6253\u5F00\u5F53\u524D\u5DE5\u4F5C\u533A Preview"," - \u5DE5\u4F5C\u533A Preview \u4E0E\u7248\u672C Preview \u5171\u7528 app \u7684 Preview \u69FD\u4F4D",""]}function getDevSaveUnsupportedMessage(){return["`platform dev save` \u5728\u7B2C\u4E00\u9636\u6BB5\u672A\u5F00\u653E\u3002","\u5F53\u524D\u6B63\u5F0F\u7248\u672C\u751F\u6210\u7EE7\u7EED\u6CBF\u7528\u73B0\u6709\u6B63\u5F0F\u7248\u672C\u94FE\u8DEF\u3002",'\u4E0B\u4E00\u6B65\u5EFA\u8BAE\uFF1A\u4F7F\u7528 `platform app submit --message "..."` \u751F\u6210\u65B0\u7684\u6B63\u5F0F\u7248\u672C\u3002'].join(`
2735
+ `);return}throw new Error("`platform workflow binding` \u76EE\u524D\u4EC5\u652F\u6301 `list`\u3001`inspect` \u6216 `update`\u3002")}function resolveWorkflowContext(args){let storedContext=loadStoredCliContext(),binding;try{binding=readBinding(findAppRoot(process6.cwd()))?.binding}catch{binding=void 0}return{tenantId:readStringOption13(args,"tenant")??binding?.tenant_id??storedContext?.selected_app_tenant_id,appId:readStringOption13(args,"app")??binding?.app_id??storedContext?.selected_app_id}}function readStringOption13(args,key){let value=args.options[key];return typeof value=="string"?value:void 0}function readJsonOption(args,key){let value=readStringOption13(args,key);if(value)return JSON.parse(value)}function readJsonFile(path3){return JSON.parse(readFileSync28(path3,"utf8"))}function readString(record,key){let value=record?.[key];return typeof value=="string"?value:void 0}function readNullableString(record,key){let value=record?.[key];return value===null?null:typeof value=="string"?value:void 0}function getDevHelpLines(){return["platform dev","","\u7B2C\u4E00\u9636\u6BB5\u53EF\u7528\u5165\u53E3\uFF1A"," platform dev"," platform dev --remote-bindings"," platform dev --remote-bindings=db"," platform dev --compat-install"," platform dev push"," platform dev preview generate"," platform dev preview open","","\u8BF4\u660E\uFF1A"," - `platform dev` \u7EE7\u7EED\u4F5C\u4E3A\u672C\u5730\u8F7B\u91CF\u5F00\u53D1\u5165\u53E3\uFF0C\u5B9E\u9645\u6267\u884C app.yaml \u4E2D\u7684 `entry.command`"," - `platform dev` \u9ED8\u8BA4\u5355\u6B21\u542F\u52A8 `entry.command`\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u91CD\u542F"," - \u82E5 app.yaml \u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\uFF0CCLI \u624D\u4F1A\u76D1\u542C\u6E90\u7801\u53D8\u66F4\u5E76\u81EA\u52A8\u91CD\u542F\u672C\u5730 dev \u5B50\u8FDB\u7A0B"," - `platform dev --remote-bindings` \u9ED8\u8BA4\u6309 `auto` \u6A21\u5F0F\u8FD0\u884C\uFF1A\u53EA\u5C1D\u8BD5\u6CE8\u5165\u5F53\u524D\u5DE5\u4F5C\u533A\u5DF2\u58F0\u660E\u7684\u8FDC\u7AEF binding"," - \u82E5\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u68C0\u6D4B\u5230\u771F\u5B9E DB migration\uFF0C`platform dev --remote-bindings` \u4F1A\u8DF3\u8FC7 DB binding\uFF0C\u4E0D\u963B\u65AD\u672C\u5730\u542F\u52A8"," - \u82E5\u4F60\u786E\u8BA4\u8981\u8054\u8C03\u5E73\u53F0 DB\uFF0C\u53EF\u663E\u5F0F\u6267\u884C `platform dev --remote-bindings=db`"," - \u9ED8\u8BA4\u6309 lockfile \u786E\u5B9A\u6027\u5B89\u88C5\uFF1B\u4EC5\u5728\u4F60\u660E\u786E\u63A5\u53D7\u672C\u5730 lockfile \u53EF\u80FD\u53D8\u5316\u65F6\u4F7F\u7528 `--compat-install`"," - `platform dev` \u8F93\u51FA\u7684\u662F\u672C\u5730\u9884\u89C8\u5730\u5740\uFF1B\u4E91\u7AEF\u53EF\u5206\u4EAB\u7684 Preview \u9700\u8981\u5355\u72EC\u6267\u884C `platform preview generate` \u6216 `platform dev preview generate`"," - `platform dev push` \u5C06\u5F53\u524D\u672C\u5730\u6E90\u7801\u8986\u76D6\u63A8\u9001\u5230\u4E91\u7AEF Dev Workspace"," - `platform dev preview generate/open` \u53EA\u64CD\u4F5C\u5DE5\u4F5C\u533A Preview"," - \u6B63\u5F0F\u7248\u672C\u751F\u6210\u7EE7\u7EED\u4F7F\u7528 `platform app submit`"," - \u7B2C\u4E00\u9636\u6BB5\u4E0D\u5F15\u5165 `platform dev save`","","\u793A\u4F8B\uFF1A"," platform dev"," platform dev --remote-bindings"," platform dev --remote-bindings=db"," platform dev --compat-install"," platform dev push"," platform dev preview generate"," platform dev preview open",' platform app submit --message "formal version"',""]}function getDevPreviewHelpLines(){return["platform dev preview","","\u53EF\u7528\u5B50\u547D\u4EE4\uFF1A"," platform dev preview generate"," platform dev preview open","","\u8BF4\u660E\uFF1A"," - `generate` \u57FA\u4E8E\u4E91\u7AEF Dev Workspace \u751F\u6210\u5DE5\u4F5C\u533A Preview"," - `open` \u6253\u5F00\u5F53\u524D\u5DE5\u4F5C\u533A Preview"," - \u5DE5\u4F5C\u533A Preview \u4E0E\u7248\u672C Preview \u5171\u7528 app \u7684 Preview \u69FD\u4F4D",""]}function getDevSaveUnsupportedMessage(){return["`platform dev save` \u5728\u7B2C\u4E00\u9636\u6BB5\u672A\u5F00\u653E\u3002","\u5F53\u524D\u6B63\u5F0F\u7248\u672C\u751F\u6210\u7EE7\u7EED\u6CBF\u7528\u73B0\u6709\u6B63\u5F0F\u7248\u672C\u94FE\u8DEF\u3002",'\u4E0B\u4E00\u6B65\u5EFA\u8BAE\uFF1A\u4F7F\u7528 `platform app submit --message "..."` \u751F\u6210\u65B0\u7684\u6B63\u5F0F\u7248\u672C\u3002'].join(`
2736
2736
  `)}import{spawn as spawn4}from"node:child_process";var implementedWorkers=new Set(["preview-retention"]);async function runWorkerCommand(args){let worker=args.rest[0]??"help";if(worker==="help"||args.options.help===!0||args.options.h===!0){printWorkerHelp();return}if(!implementedWorkers.has(worker)){let payload={ok:!1,code:"worker_not_implemented",worker,implemented_workers:[...implementedWorkers]};args.options.json===!0?process.stderr.write(`${JSON.stringify(payload,null,2)}
2737
2737
  `):process.stderr.write(`worker \u672A\u5B9E\u73B0: ${worker}
2738
2738
  \u5F53\u524D\u5DF2\u5B9E\u73B0: ${[...implementedWorkers].join(", ")}
@@ -2753,15 +2753,14 @@ ${normalized}`}function countExecutableSqlStatements(sql){return stripSqlComment
2753
2753
  `):process7.stdout.write(`\u51ED\u636E\u8FC1\u79FB\u672A\u5B8C\u6210\uFF0C\u539F\u6709\u53EF\u7528\u767B\u5F55\u6001\u5DF2\u4FDD\u7559\u3002
2754
2754
  \u5F53\u524D\u5B58\u50A8\u540E\u7AEF: ${result.backend}
2755
2755
  \u5EFA\u8BAE\uFF1A\u8FD0\u884C \`platform diagnostics credentials\` \u540E\u91CD\u8BD5\u3002
2756
- `),result.status==="failed"&&(process7.exitCode=2)}function printLogoutHelp(){process7.stdout.write(["platform logout","","\u7528\u6CD5\uFF1A"," platform logout [--json]","","\u8BF4\u660E\uFF1A"," \u6E05\u7406\u7CFB\u7EDF\u5B89\u5168\u5B58\u50A8\u3001\u517C\u5BB9\u51ED\u636E\u6587\u4EF6\u548C\u5168\u5C40 tenant/app \u9009\u62E9\u4E0A\u4E0B\u6587\u3002"," \u4FDD\u7559 environment profile \u548C\u9879\u76EE\u5185 .platform/source-context.json \u7ED1\u5B9A\u3002"," \u672C\u547D\u4EE4\u53EA\u6E05\u7406\u672C\u5730\u72B6\u6001\uFF0C\u4E0D\u64A4\u9500\u6D4F\u89C8\u5668 SSO \u6216\u670D\u52A1\u7AEF token\u3002",""].join(`
2756
+ `),result.status==="failed"&&(process7.exitCode=2)}function printLogoutHelp(){process7.stdout.write(["platform logout","","\u7528\u6CD5\uFF1A"," platform logout [--json]","","\u8BF4\u660E\uFF1A"," \u6E05\u7406\u672C\u5730\u51ED\u636E\u548C\u5168\u5C40 tenant/app \u9009\u62E9\u4E0A\u4E0B\u6587\u3002"," \u4FDD\u7559 environment profile \u548C\u9879\u76EE\u5185 .platform/source-context.json \u7ED1\u5B9A\u3002"," \u672C\u547D\u4EE4\u53EA\u6E05\u7406\u672C\u5730\u72B6\u6001\uFF0C\u4E0D\u64A4\u9500\u6D4F\u89C8\u5668 SSO \u6216\u670D\u52A1\u7AEF token\u3002",""].join(`
2757
2757
  `))}async function runLogout(args){if(hasFlag2(args,"help")||hasFlag2(args,"h")){printLogoutHelp();return}if(args.rest.length>0)throw printLogoutHelp(),new Error(`\u672A\u77E5 logout \u53C2\u6570: ${args.rest.join(" ")}`);let unsupportedOptions=Object.entries(args.options).filter(([key,value])=>!["help","h","json"].includes(key)||value!==!0);if(unsupportedOptions.length>0)throw new Error(`logout \u4E0D\u652F\u6301\u53C2\u6570: ${unsupportedOptions.map(([key])=>`--${key}`).join(", ")}\u3002\u672C\u6B21\u672A\u6267\u884C\u4EFB\u4F55\u6E05\u7406\uFF1B\u53EF\u8FD0\u884C \`platform logout --help\` \u67E5\u770B\u7528\u6CD5\u3002`);let result=clearStoredAuthentication(),stateDir=getCliStateDir(),output={status:result.status,state_dir:stateDir,cleared:result.cleared,failed:result.failed,preserved:["environment_profile","project_source_context"]};hasFlag2(args,"json")?process7.stdout.write(`${JSON.stringify(output,null,2)}
2758
2758
  `):process7.stdout.write([result.status==="cleared"?"\u672C\u5730 CLI \u767B\u5F55\u6001\u5DF2\u6E05\u7406\u3002":"\u672C\u5730 CLI \u767B\u5F55\u6001\u5DF2\u90E8\u5206\u6E05\u7406\u3002",`state \u76EE\u5F55: ${stateDir}`,"\u5DF2\u4FDD\u7559: environment profile\u3001\u9879\u76EE\u5185 .platform/source-context.json",...result.failed.length>0?[`\u672A\u6E05\u7406\u9879: ${result.failed.map(item=>item.target).join(", ")}`,"\u5EFA\u8BAE\uFF1A\u5173\u95ED\u5360\u7528\u7A0B\u5E8F\u6216\u89E3\u9501\u7CFB\u7EDF\u5B89\u5168\u5B58\u50A8\u540E\u91CD\u8BD5 `platform logout`\u3002"]:[],""].join(`
2759
- `)),result.status==="partial"&&(process7.exitCode=2)}async function runLogin(args){let issuer=readRequiredEnv("OIDC_ISSUER"),audience=process7.env.OIDC_AUDIENCE?.trim(),scopes=(process7.env.LOGTO_CLI_SCOPES??"openid profile offline_access").split(/\s+/u).filter(Boolean),cliClientId=readAuthConfigValue(AUTH_CLI_CLIENT_ID_KEYS),browserLoginConfig=resolveBrowserLoginConfig(),pat=readOption2(args,"pat")?.trim(),credentials;if(pat){if(!cliClientId)throw new Error("`platform login --pat` \u9700\u8981\u5DF2\u914D\u7F6E `AUTH_CLI_CLIENT_ID`\uFF08\u6216\u517C\u5BB9\u65E7\u540D `LOGTO_CLI_APP_ID`\uFF09\u3002");credentials=await performPatTokenExchangeLogin({issuer,clientId:cliClientId,audience,scopes,subjectToken:pat});let persistence2=persistCredentials(credentials);process7.stdout.write(["PAT \u767B\u5F55\u5DF2\u5B8C\u6210\u3002",`\u51ED\u636E\u5B58\u50A8\u540E\u7AEF: ${persistence2.backend}`,...persistence2.backend==="file"?[`\u517C\u5BB9\u51ED\u636E\u6587\u4EF6: ${getCredentialPath()}`]:[],"\u8BF4\u660E: \u5F53\u524D\u4E3A\u673A\u5668\u51ED\u636E\u6A21\u5F0F\uFF0CCLI \u4F1A\u5728 7 \u5929\u7A97\u53E3\u5185\u81EA\u52A8\u91CD\u65B0\u4EA4\u6362 access token\u3002",...persistence2.backend==="file"?["\u6CE8\u610F: \u7CFB\u7EDF\u5B89\u5168\u5B58\u50A8\u4E0D\u53EF\u7528\uFF0C\u539F\u59CB PAT \u672A\u5199\u5165\u6587\u4EF6\uFF1B\u5F53\u524D access token \u5230\u671F\u540E\u9700\u91CD\u65B0\u767B\u5F55\u3002"]:[],"\u4E0B\u4E00\u6B65\u5EFA\u8BAE\uFF1A"," 1. platform whoami"," 2. \u5982\u9700\u957F\u671F\u4EBA\u5DE5\u5F00\u53D1\uFF0C\u4F18\u5148\u6539\u7528 `platform login` \u6D4F\u89C8\u5668\u767B\u5F55",""].join(`
2759
+ `)),result.status==="partial"&&(process7.exitCode=2)}async function runLogin(args){let issuer=readRequiredEnv("OIDC_ISSUER"),audience=process7.env.OIDC_AUDIENCE?.trim(),scopes=(process7.env.LOGTO_CLI_SCOPES??"openid profile offline_access").split(/\s+/u).filter(Boolean),cliClientId=readAuthConfigValue(AUTH_CLI_CLIENT_ID_KEYS),browserLoginConfig=resolveBrowserLoginConfig(),pat=readOption2(args,"pat")?.trim(),credentials;if(pat){if(!cliClientId)throw new Error("`platform login --pat` \u9700\u8981\u5DF2\u914D\u7F6E `AUTH_CLI_CLIENT_ID`\uFF08\u6216\u517C\u5BB9\u65E7\u540D `LOGTO_CLI_APP_ID`\uFF09\u3002");credentials=await performPatTokenExchangeLogin({issuer,clientId:cliClientId,audience,scopes,subjectToken:pat});let persistence2=persistCredentials(credentials);process7.stdout.write(["PAT \u767B\u5F55\u5DF2\u5B8C\u6210\u3002",`\u51ED\u636E\u5B58\u50A8\u540E\u7AEF: ${persistence2.backend}`,...persistence2.backend==="file"?["\u6CE8\u610F: \u4E3A\u5B89\u5168\u8D77\u89C1\u4E0D\u4F1A\u4FDD\u5B58\u539F\u59CB PAT\uFF0C\u5F53\u524D access token \u5230\u671F\u540E\u9700\u91CD\u65B0\u767B\u5F55\u3002"]:["\u8BF4\u660E: \u5F53\u524D\u4E3A\u673A\u5668\u51ED\u636E\u6A21\u5F0F\uFF0CCLI \u4F1A\u5728 7 \u5929\u7A97\u53E3\u5185\u81EA\u52A8\u91CD\u65B0\u4EA4\u6362 access token\u3002"],"\u4E0B\u4E00\u6B65\u5EFA\u8BAE\uFF1A"," 1. platform whoami"," 2. \u5982\u9700\u957F\u671F\u4EBA\u5DE5\u5F00\u53D1\uFF0C\u4F18\u5148\u6539\u7528 `platform login` \u6D4F\u89C8\u5668\u767B\u5F55",""].join(`
2760
2760
  `));return}if(cliClientId)try{credentials=await performDeviceCodeLogin({issuer,clientId:cliClientId,audience,scopes,onPrompt:async({verificationUri,userCode,expiresIn})=>{let{opened}=await openExternal(verificationUri);process7.stdout.write((opened?["\u5DF2\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u5B8C\u6210\u767B\u5F55\u6388\u6743\u3002",""]:["\u8BF7\u5728\u6D4F\u89C8\u5668\u5B8C\u6210\u767B\u5F55\u6388\u6743\u3002",`\u9A8C\u8BC1\u5730\u5740: ${verificationUri}`,`User Code: ${userCode}`,`\u6709\u6548\u671F: ${expiresIn} \u79D2`,""]).join(`
2761
- `))}})}catch(error){if(!shouldFallbackToBrowserLogin(error))throw error;if(process7.stdout.write(`\u5F53\u524D\u73AF\u5883\u4E0D\u53EF\u7528 Device Flow\uFF0C\u81EA\u52A8\u5207\u6362\u5230\u6D4F\u89C8\u5668\u6388\u6743\u7801\u767B\u5F55\u3002
2762
- `),!browserLoginConfig)throw new Error("\u5F53\u524D\u73AF\u5883\u7F3A\u5C11\u53EF\u7528\u4E8E\u6D4F\u89C8\u5668\u767B\u5F55\u7684\u914D\u7F6E\uFF0C\u8BF7\u8865\u9F50 `AUTH_CLI_REDIRECT_URI`\uFF08\u6216\u517C\u5BB9\u65E7\u540D `LOGTO_CLI_REDIRECT_URI`\uFF09\uFF0C\u6216\u63D0\u4F9B `AUTH_TENANT_CLIENT_ID / AUTH_TENANT_REDIRECT_URI`\uFF08\u65E7\u540D `LOGTO_TENANT_*`\uFF09\u4F5C\u4E3A\u56DE\u9000\u3002");credentials=await performAuthorizationCodeLogin({issuer,clientId:browserLoginConfig.clientId,redirectUri:browserLoginConfig.redirectUri,audience,scopes,prompt:"login",onPrompt:async({authorizationUrl,redirectUri})=>{let{opened}=await openExternal(authorizationUrl);process7.stdout.write(formatAuthorizationCodeLoginPrompt({opened,authorizationUrl,redirectUri,source:browserLoginConfig.source}))}})}else{if(!browserLoginConfig)throw new Error("\u7F3A\u5C11\u6D4F\u89C8\u5668\u767B\u5F55\u914D\u7F6E\uFF1A\u8BF7\u4F18\u5148\u8865\u9F50 `AUTH_CLI_CLIENT_ID / AUTH_CLI_REDIRECT_URI`\uFF08\u517C\u5BB9\u65E7\u540D `LOGTO_CLI_*`\uFF09\uFF1B\u82E5\u6682\u65F6\u65E0\u6CD5\u63D0\u4F9B\uFF0C\u518D\u8865\u9F50 `AUTH_TENANT_CLIENT_ID / AUTH_TENANT_REDIRECT_URI`\uFF08\u517C\u5BB9\u65E7\u540D `LOGTO_TENANT_*`\uFF09\u4F5C\u4E3A\u56DE\u9000\u3002");process7.stdout.write(browserLoginConfig.source==="cli-app"?`\u5F53\u524D\u4F7F\u7528\u4E13\u7528 CLI App \u6267\u884C\u6D4F\u89C8\u5668\u6388\u6743\u7801\u767B\u5F55\uFF0C\u5E76\u81EA\u52A8\u9644\u5E26 consent \u4EE5\u6362\u53D6 refresh token\u3002
2761
+ `))}})}catch(error){if(!shouldFallbackToBrowserLogin(error))throw error;if(!browserLoginConfig)throw new Error("\u5F53\u524D\u73AF\u5883\u7F3A\u5C11\u53EF\u7528\u4E8E\u6D4F\u89C8\u5668\u767B\u5F55\u7684\u914D\u7F6E\uFF0C\u8BF7\u8865\u9F50 `AUTH_CLI_REDIRECT_URI`\uFF08\u6216\u517C\u5BB9\u65E7\u540D `LOGTO_CLI_REDIRECT_URI`\uFF09\uFF0C\u6216\u63D0\u4F9B `AUTH_TENANT_CLIENT_ID / AUTH_TENANT_REDIRECT_URI`\uFF08\u65E7\u540D `LOGTO_TENANT_*`\uFF09\u4F5C\u4E3A\u56DE\u9000\u3002");credentials=await performAuthorizationCodeLogin({issuer,clientId:browserLoginConfig.clientId,redirectUri:browserLoginConfig.redirectUri,audience,scopes,prompt:"login",onPrompt:async({authorizationUrl,redirectUri})=>{let{opened}=await openExternal(authorizationUrl);process7.stdout.write(formatAuthorizationCodeLoginPrompt({opened,authorizationUrl,redirectUri,source:browserLoginConfig.source}))}})}else{if(!browserLoginConfig)throw new Error("\u7F3A\u5C11\u6D4F\u89C8\u5668\u767B\u5F55\u914D\u7F6E\uFF1A\u8BF7\u4F18\u5148\u8865\u9F50 `AUTH_CLI_CLIENT_ID / AUTH_CLI_REDIRECT_URI`\uFF08\u517C\u5BB9\u65E7\u540D `LOGTO_CLI_*`\uFF09\uFF1B\u82E5\u6682\u65F6\u65E0\u6CD5\u63D0\u4F9B\uFF0C\u518D\u8865\u9F50 `AUTH_TENANT_CLIENT_ID / AUTH_TENANT_REDIRECT_URI`\uFF08\u517C\u5BB9\u65E7\u540D `LOGTO_TENANT_*`\uFF09\u4F5C\u4E3A\u56DE\u9000\u3002");process7.stdout.write(browserLoginConfig.source==="cli-app"?`\u5F53\u524D\u4F7F\u7528\u4E13\u7528 CLI App \u6267\u884C\u6D4F\u89C8\u5668\u6388\u6743\u7801\u767B\u5F55\uFF0C\u5E76\u81EA\u52A8\u9644\u5E26 consent \u4EE5\u6362\u53D6 refresh token\u3002
2763
2762
  `:`\u672A\u914D\u7F6E\u5B8C\u6574\u4E13\u7528 CLI \u6D4F\u89C8\u5668\u767B\u5F55\u53C2\u6570\uFF0C\u81EA\u52A8\u56DE\u9000\u590D\u7528 workbench \u767B\u5F55\u914D\u7F6E\uFF0C\u5E76\u5F3A\u5236 prompt=login consent\u3002
2764
- `),credentials=await performAuthorizationCodeLogin({issuer,clientId:browserLoginConfig.clientId,redirectUri:browserLoginConfig.redirectUri,audience,scopes,prompt:"login",onPrompt:async({authorizationUrl,redirectUri})=>{let{opened}=await openExternal(authorizationUrl);process7.stdout.write(formatAuthorizationCodeLoginPrompt({opened,authorizationUrl,redirectUri,source:browserLoginConfig.source}))}})}let persistence=persistCredentials({...credentials,credential_mode:"interactive"}),autoSelectedTenant=null,autoSelectionNote=null;try{let workspaces=await listTenantWorkspaces({baseUrl:getControlApiBaseUrl(),accessToken:selectApiToken(credentials)});autoSelectedTenant=chooseDefaultTenantWorkspace(workspaces.items),autoSelectedTenant?persistActiveTenantSelection(autoSelectedTenant):workspaces.items.length>1&&(autoSelectionNote="\u68C0\u6D4B\u5230\u591A\u4E2A\u53EF\u7528\u79DF\u6237\uFF0C\u672A\u81EA\u52A8\u5207\u6362\u9ED8\u8BA4\u79DF\u6237\uFF1B\u8BF7\u6267\u884C `platform tenant use <tenant-id>`\u3002")}catch(error){autoSelectionNote=`\u9ED8\u8BA4\u79DF\u6237\u81EA\u52A8\u9009\u62E9\u5931\u8D25\uFF1A${error.message}`}process7.stdout.write(["\u767B\u5F55\u5DF2\u5B8C\u6210\u3002",`\u51ED\u636E\u5B58\u50A8\u540E\u7AEF: ${persistence.backend}`,...persistence.backend==="file"?[`\u517C\u5BB9\u51ED\u636E\u6587\u4EF6: ${getCredentialPath()}`]:[],...autoSelectedTenant?[`\u9ED8\u8BA4\u79DF\u6237\u5DF2\u81EA\u52A8\u8BBE\u7F6E: ${autoSelectedTenant.tenant_id} (${autoSelectedTenant.name})`,`\u4E0A\u4E0B\u6587\u5DF2\u5199\u5165: ${getCliContextPath()}`]:autoSelectionNote?[autoSelectionNote]:[],"\u4E0B\u4E00\u6B65\u5EFA\u8BAE\uFF1A"," 1. platform whoami",' 2. \u65B0\u5EFA\u5E94\u7528\uFF1Aplatform app create --tenant <tenant-id> --name "<app-name>" --dir <project-name>'," 3. \u7F16\u8F91\u5DF2\u6709\u5E94\u7528\uFF1Aplatform app checkout --tenant <tenant-id> --app <app-id> --dir <project-name>"," 4. cd <project-name> && platform dev"," 5. \u9ED8\u8BA4\u5148\u8D70\u8F7B\u91CF\u5F00\u53D1\u6A21\u5F0F\uFF1B\u771F\u5B9E build / preview \u8054\u8C03\u5C5E\u4E8E\u9AD8\u7EA7\u8DEF\u5F84",""].join(`
2763
+ `),credentials=await performAuthorizationCodeLogin({issuer,clientId:browserLoginConfig.clientId,redirectUri:browserLoginConfig.redirectUri,audience,scopes,prompt:"login",onPrompt:async({authorizationUrl,redirectUri})=>{let{opened}=await openExternal(authorizationUrl);process7.stdout.write(formatAuthorizationCodeLoginPrompt({opened,authorizationUrl,redirectUri,source:browserLoginConfig.source}))}})}let persistence=persistCredentials({...credentials,credential_mode:"interactive"}),autoSelectedTenant=null,autoSelectionNote=null;try{let workspaces=await listTenantWorkspaces({baseUrl:getControlApiBaseUrl(),accessToken:selectApiToken(credentials)});autoSelectedTenant=chooseDefaultTenantWorkspace(workspaces.items),autoSelectedTenant?persistActiveTenantSelection(autoSelectedTenant):workspaces.items.length>1&&(autoSelectionNote="\u68C0\u6D4B\u5230\u591A\u4E2A\u53EF\u7528\u79DF\u6237\uFF0C\u672A\u81EA\u52A8\u5207\u6362\u9ED8\u8BA4\u79DF\u6237\uFF1B\u8BF7\u6267\u884C `platform tenant use <tenant-id>`\u3002")}catch(error){autoSelectionNote=`\u9ED8\u8BA4\u79DF\u6237\u81EA\u52A8\u9009\u62E9\u5931\u8D25\uFF1A${error.message}`}process7.stdout.write(["\u767B\u5F55\u5DF2\u5B8C\u6210\u3002",`\u51ED\u636E\u5B58\u50A8\u540E\u7AEF: ${persistence.backend}`,...autoSelectedTenant?[`\u9ED8\u8BA4\u79DF\u6237\u5DF2\u81EA\u52A8\u8BBE\u7F6E: ${autoSelectedTenant.tenant_id} (${autoSelectedTenant.name})`,`\u4E0A\u4E0B\u6587\u5DF2\u5199\u5165: ${getCliContextPath()}`]:autoSelectionNote?[autoSelectionNote]:[],"\u4E0B\u4E00\u6B65\u5EFA\u8BAE\uFF1A"," 1. platform whoami",' 2. \u65B0\u5EFA\u5E94\u7528\uFF1Aplatform app create --tenant <tenant-id> --name "<app-name>" --dir <project-name>'," 3. \u7F16\u8F91\u5DF2\u6709\u5E94\u7528\uFF1Aplatform app checkout --tenant <tenant-id> --app <app-id> --dir <project-name>"," 4. cd <project-name> && platform dev"," 5. \u9ED8\u8BA4\u5148\u8D70\u8F7B\u91CF\u5F00\u53D1\u6A21\u5F0F\uFF1B\u771F\u5B9E build / preview \u8054\u8C03\u5C5E\u4E8E\u9AD8\u7EA7\u8DEF\u5F84",""].join(`
2765
2764
  `))}async function runWhoAmI(args){let credentials=await loadStoredCredentialsEnsuringFresh();if(!credentials)throw new Error("\u672A\u627E\u5230\u672C\u5730\u51ED\u636E\uFF0C\u8BF7\u5148\u6267\u884C `platform login`\u3002");let tenantId=resolveTenantContext(args),payload=await fetchWhoAmI({baseUrl:getControlApiBaseUrl(),accessToken:selectApiToken(credentials),tenantId});process7.stdout.write(`${JSON.stringify(payload,null,2)}
2766
2765
  `)}async function runTenant(args){let subcommand=args.rest[0]??"current";if(subcommand==="current"){let context=loadStoredCliContext();if(!context?.active_tenant_id){process7.stdout.write(`\u5F53\u524D\u672A\u8BBE\u7F6E\u9ED8\u8BA4\u79DF\u6237\u4E0A\u4E0B\u6587\u3002
2767
2766
  `);return}process7.stdout.write([`\u5F53\u524D\u9ED8\u8BA4\u79DF\u6237: ${context.active_tenant_id}`,`\u79DF\u6237\u540D\u79F0: ${context.active_tenant_name??"-"}`,`\u66F4\u65B0\u65F6\u95F4: ${context.updated_at}`,`\u4E0A\u4E0B\u6587\u6587\u4EF6: ${getCliContextPath()}`,""].join(`
@@ -2821,15 +2820,15 @@ ${normalized}`}function countExecutableSqlStatements(sql){return stripSqlComment
2821
2820
  `));return}let timeline=await sdk.listTenantAppDeploymentTimeline(appId,{limit:10}).catch(()=>({items:[]})),previewItem=findDevPreviewTimelineItem(timeline.items,{deploymentId:response.deployment_id,releaseId:response.release_id});process7.stdout.write([...formatDevPreviewLines({title:"\u5DE5\u4F5C\u533A Preview \u5DF2\u751F\u6210\u3002",tenantId,appId,releaseId:response.release_id,deploymentId:response.deployment_id,buildId:previewItem?.build_id??response.build_id??null,sourceVersionId:previewItem?.source_version_id??response.source_version_id??null,previewUrl:previewItem?.preview_url??response.runtime.preview_url??null,health:previewItem?.health??response.runtime.health??null,healthCheckUrl:previewItem?.health_check_url??null,message:previewItem?.message??response.runtime.message??null,failureReason:previewItem?.failure_reason??response.runtime.failure_reason??null,diagnosticUrl:previewItem?.diagnostic_url??response.runtime.diagnostic_url??null}),"\u4E0B\u4E00\u6B65: \u82E5\u9875\u9762\u5F02\u5E38\uFF0C\u4F18\u5148\u8BB0\u5F55 build/release/deployment/source version\uFF0C\u518D\u6392\u67E5\u5BF9\u5E94\u8BCA\u65AD\u4E0E\u65E5\u5FD7\u3002",""].join(`
2822
2821
  `));return}if(action==="open"){let credentials=await loadStoredCredentialsEnsuringFresh(),binding=tryReadCurrentBinding2()?.binding,tenantId=readOption2(args,"tenant")??binding?.tenant_id??resolveTenantContext(args),appId=readOption2(args,"app")??binding?.app_id??resolveAppIdFromContext(args,3);if(!tenantId||!appId)throw new Error("`platform dev preview open` \u9700\u8981\u5728\u5DF2\u7ED1\u5B9A\u7684\u5E94\u7528\u76EE\u5F55\u6267\u884C\uFF0C\u6216\u663E\u5F0F\u4F20\u5165 `--tenant` \u4E0E `--app`\u3002");let sdk=createTenantScopedSdk(credentials,tenantId,{capability:"dashboard"});try{let preview=await sdk.getTenantAppDevWorkspacePreview(appId),timeline=await sdk.listTenantAppDeploymentTimeline(appId,{limit:10}).catch(()=>({items:[]})),previewItem=findDevPreviewTimelineItem(timeline.items,{deploymentId:preview.deployment_id,releaseId:preview.release_id}),{opened}=await openExternal(preview.preview_url);process7.stdout.write([...formatDevPreviewLines({title:"\u5DE5\u4F5C\u533A Preview \u5DF2\u5B9A\u4F4D\u3002",tenantId:preview.tenant_id,appId:preview.app_id,releaseId:preview.release_id,deploymentId:preview.deployment_id,buildId:previewItem?.build_id??preview.build_id??null,sourceVersionId:previewItem?.source_version_id??preview.source_version_id??null,previewUrl:preview.preview_url,health:previewItem?.health??preview.health??null,healthCheckUrl:previewItem?.health_check_url??null,message:previewItem?.message??null,failureReason:previewItem?.failure_reason??null,diagnosticUrl:previewItem?.diagnostic_url??null}),opened?"\u5DF2\u5C1D\u8BD5\u5728\u9ED8\u8BA4\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u3002":"\u672A\u80FD\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u590D\u5236 preview_url\u3002",""].join(`
2823
2822
  `))}catch(error){throw error instanceof PlatformApiError&&(error.code==="dev_workspace_preview_not_found"||error.code==="dev_workspace_preview_not_current"||error.code==="dev_workspace_preview_not_ready")?new Error([error.message,"\u4E0B\u4E00\u6B65\u5EFA\u8BAE\uFF1A\u5148\u6267\u884C `platform dev preview generate`\uFF1B\u5982\u679C\u5F53\u524D Preview \u5DF2\u88AB\u6B63\u5F0F\u7248\u672C\u66FF\u6362\uFF0C\u9700\u8981\u91CD\u65B0\u751F\u6210\u5DE5\u4F5C\u533A Preview\u3002"].join(`
2824
- `)):error}return}throw new Error(`\u672A\u77E5 dev preview \u5B50\u547D\u4EE4: ${action}`)}let target=readOption2(args,"target"),initialRuntime=collectDevPreflight(process7.cwd(),target),runtimeBindings={},bindingWarnings=[],cleanupRemoteBindings=null,remoteBindingsValue=args.options["remote-bindings"],enableRemoteBindings=remoteBindingsValue===!0||typeof remoteBindingsValue=="string",requestedRemoteBindings=enableRemoteBindings?resolveRequestedRemoteBindings(args):null;if(enableRemoteBindings)if((requestedRemoteBindings?.capabilities.length??0)===0)bindingWarnings.push(requestedRemoteBindings?.mode==="auto"?"\u5DF2\u542F\u7528 `--remote-bindings`\uFF0C\u4F46\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u68C0\u6D4B\u5230\u771F\u5B9E DB migration\uFF1B\u672C\u6B21\u8DF3\u8FC7\u8FDC\u7AEF DB binding\u3002\u82E5\u4F60\u786E\u8BA4\u9700\u8981\u8054\u8C03\u5E73\u53F0 DB\uFF0C\u53EF\u663E\u5F0F\u6267\u884C `platform dev --remote-bindings=db`\u3002":"\u5DF2\u542F\u7528 `--remote-bindings`\uFF0C\u4F46\u5F53\u524D\u672A\u8BF7\u6C42\u4EFB\u4F55\u53EF\u7528\u7684\u8FDC\u7AEF binding\u3002");else try{let remoteBindings=await loadRemoteDbRuntimeBindings(initialRuntime.binding,requestedRemoteBindings.capabilities);runtimeBindings=remoteBindings.values;let preparedBindings=await prepareLocalDevDatabaseBindings(runtimeBindings,{sshHost:process7.env.TEST_ENV_SSH_HOST});runtimeBindings=preparedBindings.bindings,cleanupRemoteBindings=async()=>{await preparedBindings.cleanup?.(),await remoteBindings.cleanup?.()},bindingWarnings.push(...preparedBindings.warnings)}catch(error){bindingWarnings.push(error instanceof Error?`\u8FDC\u7AEF DB binding \u62C9\u53D6\u5931\u8D25\uFF0C\u5C06\u56DE\u9000\u5230\u672C\u5730\u73AF\u5883\u53D8\u91CF\uFF1A${error.message}`:"\u8FDC\u7AEF DB binding \u62C9\u53D6\u5931\u8D25\uFF0C\u5C06\u56DE\u9000\u5230\u672C\u5730\u73AF\u5883\u53D8\u91CF\u3002")}else bindingWarnings.push("\u8F7B\u91CF\u5F00\u53D1\u6A21\u5F0F\u9ED8\u8BA4\u4E0D\u4E3B\u52A8\u62C9\u53D6\u8FDC\u7AEF binding\uFF1B\u5982\u9700\u6309\u5DE5\u4F5C\u533A\u58F0\u660E\u81EA\u52A8\u5C1D\u8BD5\u8FDC\u7AEF\u80FD\u529B\uFF0C\u8BF7\u6267\u884C `platform dev --remote-bindings`\uFF1B\u5982\u9700\u663E\u5F0F\u8054\u8C03\u5E73\u53F0 DB\uFF0C\u8BF7\u6267\u884C `platform dev --remote-bindings=db`\u3002");let runtime=collectDevPreflight(process7.cwd(),target,runtimeBindings),autoRestartEnabled=runtime.manifest.dev.auto_restart===!0,hasLocalPageRenderRegistry=existsSync28(`${runtime.cwd}/page-render/registry.json`),recommendedDevCommand=enableRemoteBindings?null:recommendDevCommandForTemplate(runtime.templateKey,{requestedRemoteBindings:requestedRemoteBindings?.capabilities??[]}),dependencyInstallWarning=await ensureLocalDevDependencies(runtime.cwd),explicitPort=typeof process7.env.PORT=="string"&&process7.env.PORT.trim().length>0,explicitBaseUrl=typeof process7.env.PUBLIC_APP_BASE_URL=="string"&&process7.env.PUBLIC_APP_BASE_URL.trim().length>0||typeof runtimeBindings.PUBLIC_APP_BASE_URL=="string"&&runtimeBindings.PUBLIC_APP_BASE_URL.trim().length>0;if(!explicitPort&&!explicitBaseUrl){let preferredPort=Number(runtime.manifest.entry.port||3e3),resolvedPort=await resolveAvailableLocalDevPort(preferredPort);resolvedPort.reusedPreferred||(runtime.env.PORT=String(resolvedPort.port),runtime.env.PUBLIC_APP_BASE_URL=`http://127.0.0.1:${resolvedPort.port}`,runtime.healthcheckUrl=`http://localhost:${resolvedPort.port}${runtime.manifest.entry.health_check||"/healthz"}`,runtime.warnings=runtime.warnings.map(warning=>warning.startsWith("\u672A\u663E\u5F0F\u914D\u7F6E PUBLIC_APP_BASE_URL\uFF1B\u672C\u5730 dev \u5DF2\u4E34\u65F6\u56DE\u9000\u4E3A ")?`\u672A\u663E\u5F0F\u914D\u7F6E PUBLIC_APP_BASE_URL\uFF1B\u672C\u5730 dev \u5DF2\u4E34\u65F6\u56DE\u9000\u4E3A ${runtime.env.PUBLIC_APP_BASE_URL}\u3002`:warning),runtime.warnings.unshift(`\u68C0\u6D4B\u5230\u672C\u5730\u7AEF\u53E3 ${preferredPort} \u5DF2\u88AB\u5360\u7528\uFF1BCLI \u5DF2\u81EA\u52A8\u56DE\u9000\u5230\u53EF\u7528\u7AEF\u53E3 ${resolvedPort.port}\u3002\u82E5\u4F60\u8981\u56FA\u5B9A\u7AEF\u53E3\uFF0C\u8BF7\u663E\u5F0F\u8BBE\u7F6E \`PORT\` \u4E0E \`PUBLIC_APP_BASE_URL\`\u3002`))}hasLocalPageRenderRegistry&&(runtime.warnings.unshift("\u68C0\u6D4B\u5230 `page-render/registry.json`\uFF1A\u672C\u5730 `platform dev` \u4E0B\uFF0C\u5DF2\u6CE8\u518C\u9875\u9762\u8DEF\u7531\u4F1A\u4F18\u5148\u6620\u5C04\u5230\u672C\u5730 HTML \u6A21\u677F\uFF0C\u7528\u4E8E\u7ED3\u6784/\u6837\u5F0F/\u57FA\u7840\u4EA4\u4E92\u9884\u89C8\uFF1B\u6B63\u5F0F\u9996\u5C4F HTML \u4ECD\u4EE5 preview / prod \u7684\u5E73\u53F0\u9875\u9762\u6E32\u67D3\u7ED3\u679C\u4E3A\u51C6\u3002"),enableRemoteBindings&&runtime.warnings.unshift("`platform dev --remote-bindings` \u53EA\u589E\u5F3A\u5E73\u53F0 API / Auth / CMS / DB \u7B49\u8054\u8C03\u80FD\u529B\uFF0C\u4E0D\u4F1A\u628A\u672C\u5730 dev \u5207\u6362\u6210\u5E73\u53F0\u670D\u52A1\u7AEF HTML \u6E32\u67D3\u3002")),enableRemoteBindings&&(bindingWarnings.push(`\u5DF2\u542F\u7528 \`--remote-bindings\`\uFF1ACLI \u4F1A\u6CE8\u5165\u771F\u5B9E\u5E73\u53F0\u7ED1\u5B9A\uFF0C\u5E76\u6CBF\u7528\u4E0E \`platform dev\` \u76F8\u540C\u7684${autoRestartEnabled?"\u81EA\u52A8\u91CD\u542F":"\u5355\u6B21\u542F\u52A8"}\u6A21\u5F0F\u3002`),bindingWarnings.push("\u82E5\u8054\u8C03 CMS / DB / Auth \u4ECD\u5F02\u5E38\uFF0C\u4F18\u5148\u6267\u884C `platform app diagnose --env preview` \u786E\u8BA4\u76EE\u6807\u5E94\u7528\u5F53\u524D\u72B6\u6001\u3002")),runtime.warnings.unshift(...bindingWarnings),dependencyInstallWarning&&runtime.warnings.unshift(dependencyInstallWarning);let hasLocalCredentials=!!loadStoredCredentials();process7.stdout.write(["dev preflight \u901A\u8FC7\u3002","\u6A21\u5F0F: \u8F7B\u91CF\u5F00\u53D1\u6A21\u5F0F\uFF08\u9ED8\u8BA4\uFF09",`tenant/app/env: ${runtime.binding.tenant_id}/${runtime.binding.app_id}/${runtime.binding.env}`,"\u4E0A\u4E0B\u6587\u6765\u6E90: \u5F53\u524D\u76EE\u5F55 .platform/source-context.json",`CLI \u767B\u5F55\u6001: ${hasLocalCredentials?"\u5DF2\u68C0\u6D4B\u5230\u672C\u5730\u51ED\u636E":"\u672A\u68C0\u6D4B\u5230\u672C\u5730\u51ED\u636E\uFF08\u4EC5\u672C\u5730\u9875\u9762\u5F00\u53D1\u53EF\u7EE7\u7EED\uFF1B\u82E5\u9700\u63A7\u5236\u9762\u80FD\u529B\u8BF7\u5148\u6267\u884C `platform login`\uFF09"}`,`\u5DE5\u4F5C\u76EE\u5F55: ${runtime.cwd}`,`\u542F\u52A8\u547D\u4EE4: ${runtime.command}`,`\u5EFA\u8BAE\u547D\u4EE4: ${recommendedDevCommand||"\u4FDD\u6301\u5F53\u524D `platform dev` \u5373\u53EF"}`,autoRestartEnabled?`\u6587\u4EF6\u76D1\u542C\u76EE\u5F55: ${runtime.cwd}`:"\u6587\u4EF6\u76D1\u542C\u76EE\u5F55: \u672A\u542F\u7528\uFF08\u9700\u5728 app.yaml \u4E2D\u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\uFF09",runtime.previewAddressMayChange?`\u672C\u5730\u9884\u89C8\u5730\u5740: \u542F\u52A8\u540E\u4EE5 dev server \u5B9E\u9645\u8F93\u51FA\u4E3A\u51C6\uFF08\u5F53\u524D\u9884\u671F ${runtime.env.PUBLIC_APP_BASE_URL||"-"}\uFF09`:`\u672C\u5730\u9884\u89C8\u5730\u5740: ${runtime.env.PUBLIC_APP_BASE_URL||"-"}`,`\u5065\u5EB7\u68C0\u67E5: ${runtime.healthcheckUrl}`,"\u4E91\u7AEF Preview: \u5982\u9700\u751F\u6210\u4E91\u7AEF\u53EF\u5206\u4EAB\u5730\u5740\uFF0C\u8BF7\u6267\u884C `platform preview generate`\uFF1B\u82E5\u4F60\u8D70\u7684\u662F Dev Workspace \u8054\u8C03\u94FE\u8DEF\uFF0C\u518D\u6267\u884C `platform dev preview generate`\u3002",runtime.warnings.length>0?`\u63D0\u793A:
2823
+ `)):error}return}throw new Error(`\u672A\u77E5 dev preview \u5B50\u547D\u4EE4: ${action}`)}let target=readOption2(args,"target"),initialRuntime=collectDevPreflight(process7.cwd(),target),runtimeBindings={},bindingWarnings=[],cleanupRemoteBindings=null,remoteBindingsValue=args.options["remote-bindings"],enableRemoteBindings=remoteBindingsValue===!0||typeof remoteBindingsValue=="string",requestedRemoteBindings=enableRemoteBindings?resolveRequestedRemoteBindings(args):null;if(enableRemoteBindings)if((requestedRemoteBindings?.capabilities.length??0)===0)bindingWarnings.push(requestedRemoteBindings?.mode==="auto"?"\u5DF2\u542F\u7528 `--remote-bindings`\uFF0C\u4F46\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u68C0\u6D4B\u5230\u771F\u5B9E DB migration\uFF1B\u672C\u6B21\u8DF3\u8FC7\u8FDC\u7AEF DB binding\u3002\u82E5\u4F60\u786E\u8BA4\u9700\u8981\u8054\u8C03\u5E73\u53F0 DB\uFF0C\u53EF\u663E\u5F0F\u6267\u884C `platform dev --remote-bindings=db`\u3002":"\u5DF2\u542F\u7528 `--remote-bindings`\uFF0C\u4F46\u5F53\u524D\u672A\u8BF7\u6C42\u4EFB\u4F55\u53EF\u7528\u7684\u8FDC\u7AEF binding\u3002");else try{let remoteBindings=await loadRemoteDbRuntimeBindings(initialRuntime.binding,requestedRemoteBindings.capabilities);runtimeBindings=remoteBindings.values;let preparedBindings=await prepareLocalDevDatabaseBindings(runtimeBindings,{sshHost:process7.env.TEST_ENV_SSH_HOST});runtimeBindings=preparedBindings.bindings,cleanupRemoteBindings=async()=>{await preparedBindings.cleanup?.(),await remoteBindings.cleanup?.()},bindingWarnings.push(...preparedBindings.warnings)}catch(error){bindingWarnings.push(error instanceof Error?`\u8FDC\u7AEF DB binding \u62C9\u53D6\u5931\u8D25\uFF0C\u5C06\u56DE\u9000\u5230\u672C\u5730\u73AF\u5883\u53D8\u91CF\uFF1A${error.message}`:"\u8FDC\u7AEF DB binding \u62C9\u53D6\u5931\u8D25\uFF0C\u5C06\u56DE\u9000\u5230\u672C\u5730\u73AF\u5883\u53D8\u91CF\u3002")}else bindingWarnings.push("\u8F7B\u91CF\u5F00\u53D1\u6A21\u5F0F\u9ED8\u8BA4\u4E0D\u4E3B\u52A8\u62C9\u53D6\u8FDC\u7AEF binding\uFF1B\u5982\u9700\u6309\u5DE5\u4F5C\u533A\u58F0\u660E\u81EA\u52A8\u5C1D\u8BD5\u8FDC\u7AEF\u80FD\u529B\uFF0C\u8BF7\u6267\u884C `platform dev --remote-bindings`\uFF1B\u5982\u9700\u663E\u5F0F\u8054\u8C03\u5E73\u53F0 DB\uFF0C\u8BF7\u6267\u884C `platform dev --remote-bindings=db`\u3002");let runtime=collectDevPreflight(process7.cwd(),target,runtimeBindings),autoRestartEnabled=runtime.manifest.dev.auto_restart===!0,hasLocalPageRenderRegistry=existsSync28(`${runtime.cwd}/page-render/registry.json`),recommendedDevCommand=enableRemoteBindings?null:recommendDevCommandForTemplate(runtime.templateKey,{requestedRemoteBindings:requestedRemoteBindings?.capabilities??[]}),dependencyInstallWarning=await ensureLocalDevDependencies(runtime.cwd,{compatInstall:hasFlag2(args,"compat-install")}),explicitPort=typeof process7.env.PORT=="string"&&process7.env.PORT.trim().length>0,explicitBaseUrl=typeof process7.env.PUBLIC_APP_BASE_URL=="string"&&process7.env.PUBLIC_APP_BASE_URL.trim().length>0||typeof runtimeBindings.PUBLIC_APP_BASE_URL=="string"&&runtimeBindings.PUBLIC_APP_BASE_URL.trim().length>0;if(!explicitPort&&!explicitBaseUrl){let preferredPort=Number(runtime.manifest.entry.port||3e3),resolvedPort=await resolveAvailableLocalDevPort(preferredPort);resolvedPort.reusedPreferred||(runtime.env.PORT=String(resolvedPort.port),runtime.env.PUBLIC_APP_BASE_URL=`http://127.0.0.1:${resolvedPort.port}`,runtime.healthcheckUrl=`http://localhost:${resolvedPort.port}${runtime.manifest.entry.health_check||"/healthz"}`,runtime.warnings=runtime.warnings.map(warning=>warning.startsWith("\u672A\u663E\u5F0F\u914D\u7F6E PUBLIC_APP_BASE_URL\uFF1B\u672C\u5730 dev \u5DF2\u4E34\u65F6\u56DE\u9000\u4E3A ")?`\u672A\u663E\u5F0F\u914D\u7F6E PUBLIC_APP_BASE_URL\uFF1B\u672C\u5730 dev \u5DF2\u4E34\u65F6\u56DE\u9000\u4E3A ${runtime.env.PUBLIC_APP_BASE_URL}\u3002`:warning),runtime.warnings.unshift(`\u68C0\u6D4B\u5230\u672C\u5730\u7AEF\u53E3 ${preferredPort} \u5DF2\u88AB\u5360\u7528\uFF1BCLI \u5DF2\u81EA\u52A8\u56DE\u9000\u5230\u53EF\u7528\u7AEF\u53E3 ${resolvedPort.port}\u3002\u82E5\u4F60\u8981\u56FA\u5B9A\u7AEF\u53E3\uFF0C\u8BF7\u663E\u5F0F\u8BBE\u7F6E \`PORT\` \u4E0E \`PUBLIC_APP_BASE_URL\`\u3002`))}hasLocalPageRenderRegistry&&(runtime.warnings.unshift("\u68C0\u6D4B\u5230 `page-render/registry.json`\uFF1A\u672C\u5730 `platform dev` \u4E0B\uFF0C\u5DF2\u6CE8\u518C\u9875\u9762\u8DEF\u7531\u4F1A\u4F18\u5148\u6620\u5C04\u5230\u672C\u5730 HTML \u6A21\u677F\uFF0C\u7528\u4E8E\u7ED3\u6784/\u6837\u5F0F/\u57FA\u7840\u4EA4\u4E92\u9884\u89C8\uFF1B\u6B63\u5F0F\u9996\u5C4F HTML \u4ECD\u4EE5 preview / prod \u7684\u5E73\u53F0\u9875\u9762\u6E32\u67D3\u7ED3\u679C\u4E3A\u51C6\u3002"),enableRemoteBindings&&runtime.warnings.unshift("`platform dev --remote-bindings` \u53EA\u589E\u5F3A\u5E73\u53F0 API / Auth / CMS / DB \u7B49\u8054\u8C03\u80FD\u529B\uFF0C\u4E0D\u4F1A\u628A\u672C\u5730 dev \u5207\u6362\u6210\u5E73\u53F0\u670D\u52A1\u7AEF HTML \u6E32\u67D3\u3002")),enableRemoteBindings&&(bindingWarnings.push(`\u5DF2\u542F\u7528 \`--remote-bindings\`\uFF1ACLI \u4F1A\u6CE8\u5165\u771F\u5B9E\u5E73\u53F0\u7ED1\u5B9A\uFF0C\u5E76\u6CBF\u7528\u4E0E \`platform dev\` \u76F8\u540C\u7684${autoRestartEnabled?"\u81EA\u52A8\u91CD\u542F":"\u5355\u6B21\u542F\u52A8"}\u6A21\u5F0F\u3002`),bindingWarnings.push("\u82E5\u8054\u8C03 CMS / DB / Auth \u4ECD\u5F02\u5E38\uFF0C\u4F18\u5148\u6267\u884C `platform app diagnose --env preview` \u786E\u8BA4\u76EE\u6807\u5E94\u7528\u5F53\u524D\u72B6\u6001\u3002")),runtime.warnings.unshift(...bindingWarnings),dependencyInstallWarning&&runtime.warnings.unshift(dependencyInstallWarning);let hasLocalCredentials=!!loadStoredCredentials();process7.stdout.write(["dev preflight \u901A\u8FC7\u3002","\u6A21\u5F0F: \u8F7B\u91CF\u5F00\u53D1\u6A21\u5F0F\uFF08\u9ED8\u8BA4\uFF09",`tenant/app/env: ${runtime.binding.tenant_id}/${runtime.binding.app_id}/${runtime.binding.env}`,"\u4E0A\u4E0B\u6587\u6765\u6E90: \u5F53\u524D\u76EE\u5F55 .platform/source-context.json",`CLI \u767B\u5F55\u6001: ${hasLocalCredentials?"\u5DF2\u68C0\u6D4B\u5230\u672C\u5730\u51ED\u636E":"\u672A\u68C0\u6D4B\u5230\u672C\u5730\u51ED\u636E\uFF08\u4EC5\u672C\u5730\u9875\u9762\u5F00\u53D1\u53EF\u7EE7\u7EED\uFF1B\u82E5\u9700\u63A7\u5236\u9762\u80FD\u529B\u8BF7\u5148\u6267\u884C `platform login`\uFF09"}`,`\u5DE5\u4F5C\u76EE\u5F55: ${runtime.cwd}`,`\u542F\u52A8\u547D\u4EE4: ${runtime.command}`,`\u5EFA\u8BAE\u547D\u4EE4: ${recommendedDevCommand||"\u4FDD\u6301\u5F53\u524D `platform dev` \u5373\u53EF"}`,autoRestartEnabled?`\u6587\u4EF6\u76D1\u542C\u76EE\u5F55: ${runtime.cwd}`:"\u6587\u4EF6\u76D1\u542C\u76EE\u5F55: \u672A\u542F\u7528\uFF08\u9700\u5728 app.yaml \u4E2D\u663E\u5F0F\u914D\u7F6E `dev.auto_restart: true`\uFF09",runtime.previewAddressMayChange?`\u672C\u5730\u9884\u89C8\u5730\u5740: \u542F\u52A8\u540E\u4EE5 dev server \u5B9E\u9645\u8F93\u51FA\u4E3A\u51C6\uFF08\u5F53\u524D\u9884\u671F ${runtime.env.PUBLIC_APP_BASE_URL||"-"}\uFF09`:`\u672C\u5730\u9884\u89C8\u5730\u5740: ${runtime.env.PUBLIC_APP_BASE_URL||"-"}`,`\u5065\u5EB7\u68C0\u67E5: ${runtime.healthcheckUrl}`,"\u4E91\u7AEF Preview: \u5982\u9700\u751F\u6210\u4E91\u7AEF\u53EF\u5206\u4EAB\u5730\u5740\uFF0C\u8BF7\u6267\u884C `platform preview generate`\uFF1B\u82E5\u4F60\u8D70\u7684\u662F Dev Workspace \u8054\u8C03\u94FE\u8DEF\uFF0C\u518D\u6267\u884C `platform dev preview generate`\u3002",runtime.warnings.length>0?`\u63D0\u793A:
2825
2824
  - ${runtime.warnings.join(`
2826
2825
  - `)}`:`\u63D0\u793A:
2827
2826
  - \u65E0`,"\u9AD8\u7EA7\u6A21\u5F0F\u63D0\u793A: \u82E5\u4F60\u8981\u9A8C\u8BC1\u5E73\u53F0\u539F\u751F\u6784\u5EFA\u3001\u771F\u5B9E preview\u3001rollback\uFF0C\u8BF7\u6539\u8D70\u5B8C\u6574\u8054\u8C03\u73AF\u5883\u3002",""].join(`
2828
2827
  `));try{autoRestartEnabled?await runDevSupervisor({command:runtime.command,cwd:runtime.cwd,env:runtime.env,watchRoot:runtime.cwd,onWatching:message=>{process7.stdout.write(`[dev] ${message}
2829
- `)}}):await runSingleDevProcess(runtime.command,runtime.cwd,runtime.env)}finally{await cleanupRemoteBindings?.()}}async function runSingleDevProcess(command,cwd,env){await runDevSupervisor({command,cwd,env})}async function ensureLocalDevDependencies(cwd){let installPlan=detectLocalDependencyInstallPlan(cwd);if(!installPlan)return null;let renderedCommand=[installPlan.command,...installPlan.args].join(" ");return process7.stdout.write(`\u68C0\u6D4B\u5230\u5F53\u524D\u5DE5\u4F5C\u533A\u7F3A\u5C11 node_modules\uFF1B\u6B63\u5728\u6309 ${installPlan.lockfile} \u6267\u884C\u4F9D\u8D56\u5B89\u88C5\uFF1A${renderedCommand}
2828
+ `)}}):await runSingleDevProcess(runtime.command,runtime.cwd,runtime.env)}finally{await cleanupRemoteBindings?.()}}async function runSingleDevProcess(command,cwd,env){await runDevSupervisor({command,cwd,env})}async function ensureLocalDevDependencies(cwd,options={}){let installPlan=detectLocalDependencyInstallPlan(cwd,options);if(!installPlan)return null;let renderedCommand=[installPlan.command,...installPlan.args].join(" "),originalLockfile=installPlan.mode==="compatible"&&installPlan.lockfile!=="package.json"?readFileSync29(join24(cwd,installPlan.lockfile),"utf8"):null;if(installPlan.mode==="compatible"&&rmSync7(join24(cwd,"node_modules"),{recursive:!0,force:!0}),process7.stdout.write(`\u68C0\u6D4B\u5230\u5F53\u524D\u5DE5\u4F5C\u533A\u7F3A\u5C11 node_modules\uFF1B\u6B63\u5728\u6309 ${installPlan.lockfile} \u6267\u884C${installPlan.mode==="deterministic"?"\u786E\u5B9A\u6027":"\u517C\u5BB9"}\u4F9D\u8D56\u5B89\u88C5\uFF1A${renderedCommand}
2830
2829
  `),await new Promise((resolve20,reject)=>{let child=spawnCrossPlatform(installPlan.command,installPlan.args,{cwd,env:process7.env,stdio:"inherit",shell:!1});child.on("error",error=>{let detail=error instanceof Error?error.message:String(error);reject(new Error(`${detail}
2831
2830
  ${formatDependencyInstallFailureHint(installPlan.lockfile)}`))}),child.on("exit",(code2,signal)=>{if(signal){reject(new Error(`\u4F9D\u8D56\u5B89\u88C5\u88AB\u4FE1\u53F7 ${signal} \u7EC8\u6B62`));return}if(code2&&code2!==0){reject(new Error(`\u4F9D\u8D56\u5B89\u88C5\u5931\u8D25\uFF0C\u72B6\u6001\u7801 ${code2}
2832
- ${formatDependencyInstallFailureHint(installPlan.lockfile)}`));return}resolve20()})}),`\u68C0\u6D4B\u5230\u5F53\u524D\u5DE5\u4F5C\u533A\u7F3A\u5C11 node_modules\uFF1BCLI \u5DF2\u6309 ${installPlan.lockfile} \u81EA\u52A8\u5B8C\u6210\u4F9D\u8D56\u5B89\u88C5\u3002`}async function runAuth(args){let subcommand=args.rest[0]??"discover";if(hasFlag2(args,"help")||hasFlag2(args,"h")){printAuthHelp(args.rest[0]??"");return}if(!["discover","configure","bind","inspect","role","user-role"].includes(subcommand))throw new Error(`\u672A\u77E5 auth \u5B50\u547D\u4EE4: ${subcommand}`);let credentials=await loadStoredCredentialsEnsuringFresh(),tenantId=resolveTenantContext(args),appId=resolveAppIdFromContext(args);if(!tenantId||!appId)throw new Error("`platform auth` \u9700\u8981 `--tenant` \u6216\u9ED8\u8BA4\u79DF\u6237\u4E0A\u4E0B\u6587\uFF0C\u4EE5\u53CA `--app`\u3001\u5F53\u524D\u76EE\u5F55\u7ED1\u5B9A\u6216\u5DF2\u9009\u5E94\u7528\u4E0A\u4E0B\u6587\u3002");let sdk=createTenantScopedSdk(credentials,tenantId,{capability:"end_user_auth"}),jsonMode=args.options.json===!0;if(subcommand==="role"){let action2=args.rest[1]??"list";if(!["list","create","inspect","update"].includes(action2))throw new Error(`\u672A\u77E5 auth role \u5B50\u547D\u4EE4: ${action2}`);if(action2==="list"){let response3=await sdk.listTenantAppEndUserRoles(appId);if(jsonMode){process7.stdout.write(`${JSON.stringify(response3,null,2)}
2831
+ ${formatDependencyInstallFailureHint(installPlan.lockfile)}`));return}resolve20()})}),installPlan.mode==="compatible"){let currentLockfile=existsSync28(join24(cwd,installPlan.lockfile))?readFileSync29(join24(cwd,installPlan.lockfile),"utf8"):null,lockfileChanged=originalLockfile!==currentLockfile;return[`CLI \u5DF2\u6309\u663E\u5F0F \`--compat-install\` \u4F7F\u7528 ${installPlan.lockfile} \u5B8C\u6210\u517C\u5BB9\u5B89\u88C5\u3002`,lockfileChanged?`\u672C\u5730 ${installPlan.lockfile} \u5DF2\u66F4\u65B0\uFF1B\u8BF7\u5148\u6267\u884C \`git diff -- ${installPlan.lockfile}\` \u68C0\u67E5\u53D8\u5316\uFF0C\u518D\u51B3\u5B9A\u662F\u5426\u63D0\u4EA4\u3002`:`${installPlan.lockfile} \u672A\u53D1\u751F\u53D8\u5316\u3002`].join(" ")}return installPlan.mode==="unlocked"?"\u5F53\u524D\u9879\u76EE\u672A\u63D0\u4F9B lockfile\uFF0CCLI \u5DF2\u6267\u884C\u666E\u901A\u4F9D\u8D56\u5B89\u88C5\uFF1B\u5EFA\u8BAE\u68C0\u67E5\u5E76\u63D0\u4EA4\u751F\u6210\u7684 lockfile\uFF0C\u4EE5\u63D0\u9AD8\u672C\u5730\u4E0E\u4E91\u7AEF\u6784\u5EFA\u53EF\u590D\u73B0\u6027\u3002":`\u68C0\u6D4B\u5230\u5F53\u524D\u5DE5\u4F5C\u533A\u7F3A\u5C11 node_modules\uFF1BCLI \u5DF2\u6309 ${installPlan.lockfile} \u81EA\u52A8\u5B8C\u6210\u786E\u5B9A\u6027\u4F9D\u8D56\u5B89\u88C5\u3002`}async function runAuth(args){let subcommand=args.rest[0]??"discover";if(hasFlag2(args,"help")||hasFlag2(args,"h")){printAuthHelp(args.rest[0]??"");return}if(!["discover","configure","bind","inspect","role","user-role"].includes(subcommand))throw new Error(`\u672A\u77E5 auth \u5B50\u547D\u4EE4: ${subcommand}`);let credentials=await loadStoredCredentialsEnsuringFresh(),tenantId=resolveTenantContext(args),appId=resolveAppIdFromContext(args);if(!tenantId||!appId)throw new Error("`platform auth` \u9700\u8981 `--tenant` \u6216\u9ED8\u8BA4\u79DF\u6237\u4E0A\u4E0B\u6587\uFF0C\u4EE5\u53CA `--app`\u3001\u5F53\u524D\u76EE\u5F55\u7ED1\u5B9A\u6216\u5DF2\u9009\u5E94\u7528\u4E0A\u4E0B\u6587\u3002");let sdk=createTenantScopedSdk(credentials,tenantId,{capability:"end_user_auth"}),jsonMode=args.options.json===!0;if(subcommand==="role"){let action2=args.rest[1]??"list";if(!["list","create","inspect","update"].includes(action2))throw new Error(`\u672A\u77E5 auth role \u5B50\u547D\u4EE4: ${action2}`);if(action2==="list"){let response3=await sdk.listTenantAppEndUserRoles(appId);if(jsonMode){process7.stdout.write(`${JSON.stringify(response3,null,2)}
2833
2832
  `);return}printAppRoleList(response3.items);return}if(action2==="create"){let roleKey2=readOption2(args,"key"),displayName=readOption2(args,"name");if(!roleKey2||!displayName)throw new Error("`platform auth role create` \u9700\u8981 `--key <role-key>` \u548C `--name <display-name>`\u3002");let response3=await sdk.createTenantAppEndUserRole(appId,{role_key:roleKey2,display_name:displayName,description:readOption2(args,"description"),status:normalizeAppRoleStatus(readOption2(args,"status"))});if(jsonMode){process7.stdout.write(`${JSON.stringify(response3,null,2)}
2834
2833
  `);return}printAppRoleDetail(response3);return}let roleKey=readOption2(args,"role");if(!roleKey)throw new Error("`platform auth role inspect/update` \u9700\u8981 `--role <role-key>`\u3002");if(action2==="inspect"){let response3=await sdk.getTenantAppEndUserRole(appId,roleKey);if(jsonMode){process7.stdout.write(`${JSON.stringify(response3,null,2)}
2835
2834
  `);return}printAppRoleDetail(response3);return}let hasDescription=Object.prototype.hasOwnProperty.call(args.options,"description"),clearDescription=hasFlag2(args,"clear-description"),payload={display_name:readOption2(args,"name"),description:clearDescription?null:hasDescription?readOption2(args,"description")??null:void 0,status:normalizeAppRoleStatus(readOption2(args,"status"))};if(payload.display_name===void 0&&payload.description===void 0&&payload.status===void 0)throw new Error("`platform auth role update` \u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u53D8\u66F4\u53C2\u6570\uFF1A`--name`\u3001`--description`\u3001`--clear-description` \u6216 `--status`\u3002");let response2=await sdk.updateTenantAppEndUserRole(appId,roleKey,payload);if(jsonMode){process7.stdout.write(`${JSON.stringify(response2,null,2)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voobase/cli",
3
- "version": "0.1.1-nonprod.2073",
3
+ "version": "0.1.1-nonprod.2077",
4
4
  "private": false,
5
5
  "platformDistributionProfile": {
6
6
  "name": "nonprod",
@@ -56,10 +56,10 @@
56
56
  "bundleDependencies": [],
57
57
  "platformDistributionBuild": {
58
58
  "channel": "nonprod",
59
- "version": "0.1.1-nonprod.2073",
60
- "sequence": 2073,
61
- "gitSha": "a773879",
62
- "fullGitSha": "a773879666d11a1a36137354066b0cdb95419b79",
63
- "buildId": "0.1.1-nonprod.2073+a773879"
59
+ "version": "0.1.1-nonprod.2077",
60
+ "sequence": 2077,
61
+ "gitSha": "d297516",
62
+ "fullGitSha": "d297516151ae5046a85ae324bc88cf2f31996ebd",
63
+ "buildId": "0.1.1-nonprod.2077+d297516"
64
64
  }
65
65
  }