@tailor-platform/sdk 2.12.0 → 2.13.1

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,4 +1,4 @@
1
- import{t as e}from"./schema-6d_OHyZf.mjs";import{t}from"./wait-point-registry-B-ESkTZX.mjs";import{$ as n,At as r,B as i,C as a,Ct as o,D as s,Dt as c,Et as l,G as u,Gt as d,I as f,It as p,Jt as m,K as h,L as g,Lt as _,M as v,Mt as y,N as b,Nt as x,O as S,Ot as C,P as w,Pt as ee,Q as te,R as ne,Rt as re,S as ie,Tt as ae,U as oe,Ut as se,V as ce,W as le,Wt as ue,X as de,Xt as fe,Y as pe,Yt as me,_ as he,_t as ge,a as _e,at as ve,b as ye,bt as be,ct as xe,d as Se,dt as Ce,en as we,et as T,f as Te,ft as Ee,g as De,gt as Oe,h as E,ht as ke,i as Ae,it as je,j as Me,jt as Ne,k as Pe,kt as Fe,l as D,lt as Ie,mt as Le,nn as Re,nt as ze,o as Be,ot as Ve,p as He,pt as Ue,qt as We,r as Ge,rn as Ke,rt as qe,s as Je,st as Ye,t as Xe,tn as Ze,tt as O,u as Qe,ut as $e,v as et,vt as tt,w as nt,wt as rt,x as it,xt as at,y as k,yt as ot,zt as st}from"./workspace_resource_pb-u9bj6p3i.mjs";import{t as A}from"./assert-WeXvmG4j.mjs";import{a as ct,i as j,n as M,o as lt,r as N,s as ut,t as dt}from"./logger-CCjs1DuH.mjs";import{$ as ft,B as pt,C as mt,D as ht,E as gt,F as _t,H as P,I as vt,J as yt,K as bt,L as xt,M as St,N as Ct,O as wt,P as Tt,Q as F,R as Et,S as Dt,T as Ot,U as kt,V as At,W as jt,X as Mt,Y as I,Z as Nt,at as Pt,b as Ft,c as It,et as Lt,g as Rt,h as zt,i as Bt,it as Vt,l as Ht,n as Ut,nt as Wt,o as Gt,ot as Kt,p as qt,q as Jt,r as Yt,rt as Xt,s as Zt,t as Qt,tt as $t,v as en,w as tn,x as nn,y as rn}from"./application-D3HlhR3i.mjs";import{_ as an,d as on,g as sn,l as cn,t as ln,v as un,x as dn,y as fn}from"./service-BzsSm2f6.mjs";import{t as L}from"./multiline-EyzjEwn9.mjs";import{t as pn}from"./package-json-C690ceex.mjs";import{t as mn}from"./user-agent-vdHYF3QL.mjs";import{a as hn,i as gn,n as _n,o as vn,t as R}from"./errors-BlX4gUw5.mjs";import{n as yn,r as bn}from"./secret-file-C9wp_FCX.mjs";import{r as z}from"./telemetry-Bklv9kQY.mjs";import{n as xn,t as Sn}from"./field-column-type-QMtF6lUp.mjs";import{a as Cn,i as wn,o as Tn,r as En,s as Dn,t as On}from"./seed-CMkupmX8.mjs";import*as kn from"node:module";import*as B from"pathe";import{basename as An,dirname as jn,join as Mn,resolve as Nn}from"pathe";import{resolveTSConfig as Pn}from"pkg-types";import{arg as V,createDefineCommand as Fn,defineCommand as In,runCommand as Ln}from"politty";import{z as H}from"zod";import{create as U,createRegistry as Rn,fromJson as zn,toJson as Bn}from"@bufbuild/protobuf";import*as W from"node:fs";import{mkdirSync as Vn,readFileSync as Hn,renameSync as Un,rmSync as Wn,statSync as Gn,utimesSync as Kn,writeFileSync as qn}from"node:fs";import{parseEnv as Jn}from"node:util";import{ValueSchema as Yn,timestampDate as G}from"@bufbuild/protobuf/wkt";import{formatDistanceToNowStrict as Xn}from"date-fns";import{pathToFileURL as Zn}from"node:url";import{parseYAML as Qn,stringifyYAML as $n}from"confbox";import{findUpSync as er}from"find-up-simple";import{lt as tr}from"semver";import{xdgConfig as nr}from"xdg-basedir";import{Code as K,ConnectError as q}from"@connectrpc/connect";import rr from"p-limit";import*as ir from"node:crypto";import{createHash as ar,randomUUID as or}from"node:crypto";import{ExitPromptError as sr}from"@inquirer/core";import{confirm as cr,input as lr,password as ur,select as dr}from"@inquirer/prompts";import{isCI as fr}from"std-env";import*as pr from"rolldown";import{parseSync as mr}from"oxc-parser";import*as hr from"inflection";import{tmpdir as gr}from"node:os";import{pathToString as _r,usedTypes as vr}from"@bufbuild/protobuf/reflect";import{createValidator as yr}from"@bufbuild/protovalidate";import*as J from"node:fs/promises";import{mkdir as br,readFile as xr,rename as Sr,rm as Cr,writeFile as wr}from"node:fs/promises";import{setTimeout as Tr}from"timers/promises";import{setTimeout as Er}from"node:timers/promises";import{spawn as Dr}from"node:child_process";import*as Or from"fs";import{lookup as kr}from"mime-types";import{createPrompt as Ar}from"@toiroakr/read-multiline";import{astVisitor as jr,parse as Mr}from"pgsql-ast-parser";import{parse as Nr}from"@0no-co/graphql.web";const Pr={ms:1,s:1e3,m:6e4},Fr=/^(\d+)(ms|s|m)$/,Ir=H.string().refine(e=>Fr.test(e),{message:`Invalid duration format. Expected format: '3s', '500ms', '1m'`}).refine(e=>{let t=e.match(Fr);if(!t)return!1;let n=t[1];return n!==void 0&&parseInt(n,10)>0},{message:`Duration must be greater than 0`});function parseDuration(e){let t=A(e.match(Fr),`invalid duration format: ${e}`),n=parseInt(A(t[1],`duration digits group missing`),10),r=A(t[2],`duration unit group missing`);return n*Pr[r]}const Lr=H.coerce.number().int().positive(),Rr=H.coerce.number().int().nonnegative(),zr=H.enum([`asc`,`desc`]);function toPageDirection(e){if(e!==void 0)return e===`asc`?Ke.ASC:Ke.DESC}function hasMachineUserFlag(e){return e.slice(0,e.indexOf(`--`)===-1?e.length:e.indexOf(`--`)).some(e=>e===`-m`||e.startsWith(`-m=`)||e===`--machine-user`||e.startsWith(`--machine-user=`)||e===`--machineUser`||e.startsWith(`--machineUser=`)||e===`--machineuser`||e.startsWith(`--machineuser=`))}function resolveMachineUserInputSource(e,t=process.argv.slice(2),n={}){if(e!==void 0)return n.valueIsExplicit||hasMachineUserFlag(t)?`option`:process.env.TAILOR_PLATFORM_MACHINE_USER_NAME===e?`env`:`option`}function loadEnvFiles(e,t){let n=new Set(Object.keys(process.env)),load=(e,t)=>{for(let r of[e??[]].flat()){let e=B.resolve(process.cwd(),r);if(!W.existsSync(e)){if(t)throw Error(`Environment file not found: ${e}`);continue}let i=W.readFileSync(e,`utf-8`),a=Jn(i);for(let[e,t]of Object.entries(a))n.has(e)||(process.env[e]=t)}};load(e,!0),load(t,!1)}function createCommonArgs(e={}){return{"env-file":V(H.string().optional(),{alias:`e`,description:`Path to the environment file (error if not found)`,completion:{type:`file`,matcher:[`.env.*`,`.env`]}}),"env-file-if-exists":V(H.string().optional(),{description:`Path to the environment file (ignored if not found)`,completion:{type:`file`,matcher:[`.env.*`,`.env`]},effect:(e,{args:t})=>{loadEnvFiles(t[`env-file`],t[`env-file-if-exists`])}}),verbose:V(H.boolean().default(!1),{...e.verboseAlias===void 0?{}:{alias:e.verboseAlias},description:`Enable verbose logging`,effect:e=>{M.verbose=e}}),json:V(H.boolean().default(!1),{alias:`j`,description:`Output as JSON`,effect:e=>{M.jsonMode=e}})}}const Br=createCommonArgs(),Y={"workspace-id":V(H.string().optional(),{alias:`w`,description:`Workspace ID`,env:`TAILOR_PLATFORM_WORKSPACE_ID`,completion:{type:`none`}}),profile:V(H.string().optional(),{alias:`p`,description:`Workspace profile`,env:`TAILOR_PLATFORM_PROFILE`,completion:{type:`none`}})},Vr=`tailor.config.ts`;function formatConfigArg(e){if(!e)return;let t=B.relative(process.cwd(),e);if(t!==`tailor.config.ts`)return`--config=${t}`}const Hr={config:V(H.string().default(Vr),{alias:`c`,description:`Path to Tailor config file`,env:`TAILOR_CONFIG_PATH`,completion:{type:`file`,extensions:[`ts`]}})},Ur={config:V(H.string().default(Vr),{alias:`c`,description:`Path to SDK config file. Use comma-separated paths to deploy multiple apps together.`,env:`TAILOR_PLATFORM_SDK_CONFIG_PATH`,completion:{type:`file`,extensions:[`ts`]}})},Wr={...Y,...Hr},Gr={yes:V(H.boolean().default(!1),{alias:`y`,description:`Skip confirmation prompts`})},Kr={"organization-id":V(H.string(),{alias:`o`,description:`Organization ID`,env:`TAILOR_PLATFORM_ORGANIZATION_ID`,completion:{type:`none`}})},paginationArgs=(e=`desc`)=>({order:V(zr.default(e),{description:`Sort order (asc or desc)`}),limit:V(Rr.optional(),{alias:`l`,description:`Maximum number of items to return (0 or omit: unlimited)`})}),qr={order:V(zr.default(`desc`),{description:`Sort order (asc or desc)`}),limit:V(Rr.default(50),{alias:`l`,description:`Maximum number of items to return (0: unlimited)`})},Jr={"folder-id":V(H.string(),{alias:`f`,description:`Folder ID`,env:`TAILOR_PLATFORM_FOLDER_ID`,completion:{type:`none`}})},X=Fn(),Yr=H.union([H.string(),H.number(),H.boolean()]),Xr=H.union([H.string(),H.number()]),Zr=H.union([Yr,H.strictObject({value:Xr,allowSecretReason:H.string().min(1,{message:`'allowSecretReason' must state why the value is safe to keep in 'env'.`})})]),Qr=H.enum(Kt),$r=H.string().refine(e=>Qr.safeParse(e.trim().toUpperCase()).success,{message:`'logLevel' must be one of: ${Kt.join(`, `)}.`}),ei=H.strictObject({id:H.uuid({message:`'id' must be a UUID.`}).optional(),name:H.string().min(1,{message:`'name' must be a non-empty string.`}),env:H.record(H.string(),Zr).optional(),cors:H.array(H.string()).optional(),allowedIpAddresses:H.array(H.string()).optional(),disableIntrospection:H.boolean().optional(),inlineSourcemap:H.boolean().optional(),logLevel:$r.optional(),db:H.unknown().optional(),resolver:H.unknown().optional(),idp:H.unknown().optional(),auth:H.unknown().optional(),executor:H.unknown().optional(),workflow:H.unknown().optional(),httpAdapter:H.unknown().optional(),staticWebsites:H.unknown().optional(),aiGateways:H.unknown().optional(),secrets:H.unknown().optional()}),ti=H.looseObject({id:H.string(),description:H.string(),importPath:H.string().optional(),pluginConfig:H.unknown().optional(),tableConfigRequired:H.union([H.boolean(),dn]).optional(),onTableLoaded:dn.optional(),onNamespaceLoaded:dn.optional(),onTailorDBReady:dn.optional(),onResolverReady:dn.optional(),onExecutorReady:dn.optional()}).refine(e=>!(e.onTableLoaded||e.onNamespaceLoaded)||!!e.importPath,{message:`importPath is required when plugin has definition-time hooks (onTableLoaded/onNamespaceLoaded)`}).transform(e=>e),ni=`tailor-platform-cli`;let ri;async function getEntryClass(){if(ri!==void 0)return ri;try{let e=await import(`@napi-rs/keyring`),t=new e.Entry(ni,`__probe__`);t.setPassword(`probe`),t.deletePassword(),ri=e.Entry}catch{M.warn(`System keyring is not available. Tokens will be stored in the config file. Set TAILOR_PLATFORM_TOKEN environment variable for CI environments.`),ri=!1}return ri}async function isKeyringAvailable(){return await getEntryClass()!==!1}async function loadKeyringTokens(e){let t=await getEntryClass();if(t)try{let n=new t(ni,e).getPassword();return n===null?void 0:JSON.parse(n)}catch{return}}async function saveKeyringTokens(e,t){let n=await getEntryClass();n&&new n(ni,e).setPassword(JSON.stringify(t))}async function deleteKeyringTokens(e){let t=await getEntryClass();if(t)try{new t(ni,e).deletePassword()}catch{}}const ii=H.object({user:H.string(),workspace_id:H.string(),readonly:H.boolean().optional(),machine_user:H.string().optional(),machine_user_override:H.enum([`allow`,`deny`]).optional(),platform_url:H.url().optional(),oauth2_client_id:H.string().optional(),console_url:H.url().optional()}),ai=H.object({access_token:H.string(),refresh_token:H.string().optional(),token_expires_at:H.string()}),oi=H.object({storage:H.literal(`keyring`),token_expires_at:H.string()}),si=H.object({storage:H.literal(`file`),token_expires_at:H.string(),access_token:H.string(),refresh_token:H.string().optional()}),ci=H.discriminatedUnion(`storage`,[oi,si]),li=oi.extend({email:H.string().optional()}),ui=si.extend({email:H.string().optional()}),di=H.discriminatedUnion(`storage`,[li,ui]),fi=H.object({version:H.literal(1),users:H.partialRecord(H.string(),ai),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()}),pi=`2.0.0`,mi=H.templateLiteral([H.number().int(),`.`,H.number().int(),`.`,H.number().int()]),hi=H.object({version:H.literal(2),min_sdk_version:mi,latest_version:H.number().int().optional(),latest_min_sdk_version:mi.optional(),users:H.partialRecord(H.string(),ci),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()}),gi=H.object({version:H.literal(3),min_sdk_version:mi,latest_version:H.number().int().optional(),latest_min_sdk_version:mi.optional(),users:H.partialRecord(H.string(),di),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()});function platformConfigPath(){if(!nr)throw Error(`User home directory not found`);return B.join(nr,`tailor-platform`,`config.yaml`)}function platformConfigFromProfile(e){let t={...e?.platform_url?{platformUrl:e.platform_url}:{},...e?.oauth2_client_id?{oauth2ClientId:e.oauth2_client_id}:{},...e?.console_url?{consoleUrl:e.console_url}:{}};return Object.keys(t).length>0?t:void 0}function platformUserKey(e,t){let n=Mt(t);return n===$t(`https://api.tailor.tech`)?e:`${n}|${e}`}function userFromPlatformUserKey(e,t){let n=`${Mt(t)}|`;return e.startsWith(n)?e.slice(n.length):e}function canUseLegacyUserKey(e){try{return Mt()===e}catch{return!1}}function findUserByEmail(e,t,n){let r=Mt(n),i=`${r}|`,a=r===$t(pt);return Object.entries(e).find(([e,n])=>n?.email===t?a?!e.includes(`|`):e.startsWith(i):!1)}function findUserEntry(e,t,n,r={}){let i=platformUserKey(t,n),a=e.users[i];if(a)return{userKey:i,userEntry:a};let o=findUserByEmail(e.users,t,n);if(o?.[1])return{userKey:o[0],userEntry:o[1]};let s=Mt(n);if(i!==t&&(r.allowLegacyUserKey===!1||!canUseLegacyUserKey(s)))return{userKey:i,userEntry:a};let c=e.users[t];return c?{userKey:t,userEntry:c}:{userKey:i,userEntry:a}}function resolveUserTokenKey(e,t,n,r){return findUserEntry(e,t,n,r).userKey}function resolveConfigUser(e,t,n,r){let{userKey:i,userEntry:a}=findUserEntry(e,t,n,r);return a?userFromPlatformUserKey(i,n):void 0}function hasUserTokenEntry(e,t,n,r){return findUserEntry(e,t,n,r).userEntry!==void 0}function hasUserKeyForName(e,t){return e[t]!==void 0||Object.keys(e).some(e=>e.endsWith(`|${t}`))}function hasUserEmailEntry(e,t){return Object.values(e).some(e=>e?.email===t)}function hasAnyUserTokenEntry(e,t){return hasUserKeyForName(e.users,t)||hasUserEmailEntry(e.users,t)}function hasCurrentUserEntry(e,t){return hasUserKeyForName(e,t)}function migrateV1ToV2(e){let t={};for(let[n,r]of Object.entries(e.users))r&&(t[n]={access_token:r.access_token,refresh_token:r.refresh_token,token_expires_at:r.token_expires_at,storage:`file`});return{version:2,min_sdk_version:`1.29.0`,users:t,profiles:e.profiles,current_user:e.current_user}}function inferEmailFromUserId(e){return H.email().safeParse(e).success?e:void 0}function migrateV2ToV3(e){let t={};for(let[n,r]of Object.entries(e.users)){if(!r)continue;let e=inferEmailFromUserId(n);t[n]={...r,...e?{email:e}:{}}}return{version:3,min_sdk_version:pi,users:t,profiles:e.profiles,current_user:e.current_user}}function migrateV1ToV3(e){return migrateV2ToV3(migrateV1ToV2(e))}function formatUnknownError(e){return e instanceof Error?e.message:String(e)}async function trySaveTokensInKeyring(e,t){if(!await isKeyringAvailable())return!1;try{return await saveKeyringTokens(e,t),!0}catch(e){return M.warn(`System keyring failed to store credentials. Tokens will be stored in the config file. ${formatUnknownError(e)}`),!1}}async function warnIfNewerConfigAvailable(e){if(!e.latest_min_sdk_version)return;let t=(await pn()).version??`0.0.0`;tr(t,e.latest_min_sdk_version)&&M.warn(L`
1
+ import{t as e}from"./schema-6d_OHyZf.mjs";import{t}from"./wait-point-registry-B-ESkTZX.mjs";import{$ as n,At as r,B as i,C as a,Ct as o,D as s,Dt as c,Et as l,G as u,Gt as d,I as f,It as p,Jt as m,K as h,L as g,Lt as _,M as v,Mt as y,N as b,Nt as x,O as S,Ot as C,P as w,Pt as ee,Q as te,R as ne,Rt as re,S as ie,Tt as ae,U as oe,Ut as se,V as ce,W as le,Wt as ue,X as de,Xt as fe,Y as pe,Yt as me,_ as he,_t as ge,a as _e,at as ve,b as ye,bt as be,ct as xe,d as Se,dt as Ce,en as we,et as T,f as Te,ft as Ee,g as De,gt as Oe,h as E,ht as ke,i as Ae,it as je,j as Me,jt as Ne,k as Pe,kt as Fe,l as D,lt as Ie,mt as Le,nn as Re,nt as ze,o as Be,ot as Ve,p as He,pt as Ue,qt as We,r as Ge,rn as Ke,rt as qe,s as Je,st as Ye,t as Xe,tn as Ze,tt as O,u as Qe,ut as $e,v as et,vt as tt,w as nt,wt as rt,x as it,xt as at,y as k,yt as ot,zt as st}from"./workspace_resource_pb-u9bj6p3i.mjs";import{t as A}from"./assert-WeXvmG4j.mjs";import{a as ct,i as j,n as M,o as lt,r as N,s as ut,t as dt}from"./logger-CCjs1DuH.mjs";import{$ as ft,B as pt,C as mt,D as ht,E as gt,F as _t,H as P,I as vt,J as yt,K as bt,L as xt,M as St,N as Ct,O as wt,P as Tt,Q as F,R as Et,S as Dt,T as Ot,U as kt,V as At,W as jt,X as Mt,Y as I,Z as Nt,at as Pt,b as Ft,c as It,et as Lt,g as Rt,h as zt,i as Bt,it as Vt,l as Ht,n as Ut,nt as Wt,o as Gt,ot as Kt,p as qt,q as Jt,r as Yt,rt as Xt,s as Zt,t as Qt,tt as $t,v as en,w as tn,x as nn,y as rn}from"./application-D3HlhR3i.mjs";import{_ as an,d as on,g as sn,l as cn,t as ln,v as un,x as dn,y as fn}from"./service-BzsSm2f6.mjs";import{t as L}from"./multiline-EyzjEwn9.mjs";import{t as pn}from"./package-json-C690ceex.mjs";import{t as mn}from"./user-agent-vdHYF3QL.mjs";import{a as hn,i as gn,n as _n,o as vn,t as R}from"./errors-BlX4gUw5.mjs";import{n as yn,r as bn}from"./secret-file-C9wp_FCX.mjs";import{r as z}from"./telemetry-Bklv9kQY.mjs";import{n as xn,t as Sn}from"./field-column-type-QMtF6lUp.mjs";import{a as Cn,i as wn,o as Tn,r as En,s as Dn,t as On}from"./seed-CCc9Xk66.mjs";import*as kn from"node:module";import*as B from"pathe";import{basename as An,dirname as jn,join as Mn,resolve as Nn}from"pathe";import{resolveTSConfig as Pn}from"pkg-types";import{arg as V,createDefineCommand as Fn,defineCommand as In,runCommand as Ln}from"politty";import{z as H}from"zod";import{create as U,createRegistry as Rn,fromJson as zn,toJson as Bn}from"@bufbuild/protobuf";import*as W from"node:fs";import{mkdirSync as Vn,readFileSync as Hn,renameSync as Un,rmSync as Wn,statSync as Gn,utimesSync as Kn,writeFileSync as qn}from"node:fs";import{parseEnv as Jn}from"node:util";import{ValueSchema as Yn,timestampDate as G}from"@bufbuild/protobuf/wkt";import{formatDistanceToNowStrict as Xn}from"date-fns";import{pathToFileURL as Zn}from"node:url";import{parseYAML as Qn,stringifyYAML as $n}from"confbox";import{findUpSync as er}from"find-up-simple";import{lt as tr}from"semver";import{xdgConfig as nr}from"xdg-basedir";import{Code as K,ConnectError as q}from"@connectrpc/connect";import rr from"p-limit";import*as ir from"node:crypto";import{createHash as ar,randomUUID as or}from"node:crypto";import{ExitPromptError as sr}from"@inquirer/core";import{confirm as cr,input as lr,password as ur,select as dr}from"@inquirer/prompts";import{isCI as fr}from"std-env";import*as pr from"rolldown";import{parseSync as mr}from"oxc-parser";import*as hr from"inflection";import{tmpdir as gr}from"node:os";import{pathToString as _r,usedTypes as vr}from"@bufbuild/protobuf/reflect";import{createValidator as yr}from"@bufbuild/protovalidate";import*as J from"node:fs/promises";import{mkdir as br,readFile as xr,rename as Sr,rm as Cr,writeFile as wr}from"node:fs/promises";import{setTimeout as Tr}from"timers/promises";import{setTimeout as Er}from"node:timers/promises";import{spawn as Dr}from"node:child_process";import*as Or from"fs";import{lookup as kr}from"mime-types";import{createPrompt as Ar}from"@toiroakr/read-multiline";import{astVisitor as jr,parse as Mr}from"pgsql-ast-parser";import{parse as Nr}from"@0no-co/graphql.web";const Pr={ms:1,s:1e3,m:6e4},Fr=/^(\d+)(ms|s|m)$/,Ir=H.string().refine(e=>Fr.test(e),{message:`Invalid duration format. Expected format: '3s', '500ms', '1m'`}).refine(e=>{let t=e.match(Fr);if(!t)return!1;let n=t[1];return n!==void 0&&parseInt(n,10)>0},{message:`Duration must be greater than 0`});function parseDuration(e){let t=A(e.match(Fr),`invalid duration format: ${e}`),n=parseInt(A(t[1],`duration digits group missing`),10),r=A(t[2],`duration unit group missing`);return n*Pr[r]}const Lr=H.coerce.number().int().positive(),Rr=H.coerce.number().int().nonnegative(),zr=H.enum([`asc`,`desc`]);function toPageDirection(e){if(e!==void 0)return e===`asc`?Ke.ASC:Ke.DESC}function hasMachineUserFlag(e){return e.slice(0,e.indexOf(`--`)===-1?e.length:e.indexOf(`--`)).some(e=>e===`-m`||e.startsWith(`-m=`)||e===`--machine-user`||e.startsWith(`--machine-user=`)||e===`--machineUser`||e.startsWith(`--machineUser=`)||e===`--machineuser`||e.startsWith(`--machineuser=`))}function resolveMachineUserInputSource(e,t=process.argv.slice(2),n={}){if(e!==void 0)return n.valueIsExplicit||hasMachineUserFlag(t)?`option`:process.env.TAILOR_PLATFORM_MACHINE_USER_NAME===e?`env`:`option`}function loadEnvFiles(e,t){let n=new Set(Object.keys(process.env)),load=(e,t)=>{for(let r of[e??[]].flat()){let e=B.resolve(process.cwd(),r);if(!W.existsSync(e)){if(t)throw Error(`Environment file not found: ${e}`);continue}let i=W.readFileSync(e,`utf-8`),a=Jn(i);for(let[e,t]of Object.entries(a))n.has(e)||(process.env[e]=t)}};load(e,!0),load(t,!1)}function createCommonArgs(e={}){return{"env-file":V(H.string().optional(),{alias:`e`,description:`Path to the environment file (error if not found)`,completion:{type:`file`,matcher:[`.env.*`,`.env`]}}),"env-file-if-exists":V(H.string().optional(),{description:`Path to the environment file (ignored if not found)`,completion:{type:`file`,matcher:[`.env.*`,`.env`]},effect:(e,{args:t})=>{loadEnvFiles(t[`env-file`],t[`env-file-if-exists`])}}),verbose:V(H.boolean().default(!1),{...e.verboseAlias===void 0?{}:{alias:e.verboseAlias},description:`Enable verbose logging`,effect:e=>{M.verbose=e}}),json:V(H.boolean().default(!1),{alias:`j`,description:`Output as JSON`,effect:e=>{M.jsonMode=e}})}}const Br=createCommonArgs(),Y={"workspace-id":V(H.string().optional(),{alias:`w`,description:`Workspace ID`,env:`TAILOR_PLATFORM_WORKSPACE_ID`,completion:{type:`none`}}),profile:V(H.string().optional(),{alias:`p`,description:`Workspace profile`,env:`TAILOR_PLATFORM_PROFILE`,completion:{type:`none`}})},Vr=`tailor.config.ts`;function formatConfigArg(e){if(!e)return;let t=B.relative(process.cwd(),e);if(t!==`tailor.config.ts`)return`--config=${t}`}const Hr={config:V(H.string().default(Vr),{alias:`c`,description:`Path to Tailor config file`,env:`TAILOR_CONFIG_PATH`,completion:{type:`file`,extensions:[`ts`]}})},Ur={config:V(H.string().default(Vr),{alias:`c`,description:`Path to SDK config file. Use comma-separated paths to deploy multiple apps together.`,env:`TAILOR_PLATFORM_SDK_CONFIG_PATH`,completion:{type:`file`,extensions:[`ts`]}})},Wr={...Y,...Hr},Gr={yes:V(H.boolean().default(!1),{alias:`y`,description:`Skip confirmation prompts`})},Kr={"organization-id":V(H.string(),{alias:`o`,description:`Organization ID`,env:`TAILOR_PLATFORM_ORGANIZATION_ID`,completion:{type:`none`}})},paginationArgs=(e=`desc`)=>({order:V(zr.default(e),{description:`Sort order (asc or desc)`}),limit:V(Rr.optional(),{alias:`l`,description:`Maximum number of items to return (0 or omit: unlimited)`})}),qr={order:V(zr.default(`desc`),{description:`Sort order (asc or desc)`}),limit:V(Rr.default(50),{alias:`l`,description:`Maximum number of items to return (0: unlimited)`})},Jr={"folder-id":V(H.string(),{alias:`f`,description:`Folder ID`,env:`TAILOR_PLATFORM_FOLDER_ID`,completion:{type:`none`}})},X=Fn(),Yr=H.union([H.string(),H.number(),H.boolean()]),Xr=H.union([H.string(),H.number()]),Zr=H.union([Yr,H.strictObject({value:Xr,allowSecretReason:H.string().min(1,{message:`'allowSecretReason' must state why the value is safe to keep in 'env'.`})})]),Qr=H.enum(Kt),$r=H.string().refine(e=>Qr.safeParse(e.trim().toUpperCase()).success,{message:`'logLevel' must be one of: ${Kt.join(`, `)}.`}),ei=H.strictObject({id:H.uuid({message:`'id' must be a UUID.`}).optional(),name:H.string().min(1,{message:`'name' must be a non-empty string.`}),env:H.record(H.string(),Zr).optional(),cors:H.array(H.string()).optional(),allowedIpAddresses:H.array(H.string()).optional(),disableIntrospection:H.boolean().optional(),inlineSourcemap:H.boolean().optional(),logLevel:$r.optional(),db:H.unknown().optional(),resolver:H.unknown().optional(),idp:H.unknown().optional(),auth:H.unknown().optional(),executor:H.unknown().optional(),workflow:H.unknown().optional(),httpAdapter:H.unknown().optional(),staticWebsites:H.unknown().optional(),aiGateways:H.unknown().optional(),secrets:H.unknown().optional()}),ti=H.looseObject({id:H.string(),description:H.string(),importPath:H.string().optional(),pluginConfig:H.unknown().optional(),tableConfigRequired:H.union([H.boolean(),dn]).optional(),onTableLoaded:dn.optional(),onNamespaceLoaded:dn.optional(),onTailorDBReady:dn.optional(),onResolverReady:dn.optional(),onExecutorReady:dn.optional()}).refine(e=>!(e.onTableLoaded||e.onNamespaceLoaded)||!!e.importPath,{message:`importPath is required when plugin has definition-time hooks (onTableLoaded/onNamespaceLoaded)`}).transform(e=>e),ni=`tailor-platform-cli`;let ri;async function getEntryClass(){if(ri!==void 0)return ri;try{let e=await import(`@napi-rs/keyring`),t=new e.Entry(ni,`__probe__`);t.setPassword(`probe`),t.deletePassword(),ri=e.Entry}catch{M.warn(`System keyring is not available. Tokens will be stored in the config file. Set TAILOR_PLATFORM_TOKEN environment variable for CI environments.`),ri=!1}return ri}async function isKeyringAvailable(){return await getEntryClass()!==!1}async function loadKeyringTokens(e){let t=await getEntryClass();if(t)try{let n=new t(ni,e).getPassword();return n===null?void 0:JSON.parse(n)}catch{return}}async function saveKeyringTokens(e,t){let n=await getEntryClass();n&&new n(ni,e).setPassword(JSON.stringify(t))}async function deleteKeyringTokens(e){let t=await getEntryClass();if(t)try{new t(ni,e).deletePassword()}catch{}}const ii=H.object({user:H.string(),workspace_id:H.string(),readonly:H.boolean().optional(),machine_user:H.string().optional(),machine_user_override:H.enum([`allow`,`deny`]).optional(),platform_url:H.url().optional(),oauth2_client_id:H.string().optional(),console_url:H.url().optional()}),ai=H.object({access_token:H.string(),refresh_token:H.string().optional(),token_expires_at:H.string()}),oi=H.object({storage:H.literal(`keyring`),token_expires_at:H.string()}),si=H.object({storage:H.literal(`file`),token_expires_at:H.string(),access_token:H.string(),refresh_token:H.string().optional()}),ci=H.discriminatedUnion(`storage`,[oi,si]),li=oi.extend({email:H.string().optional()}),ui=si.extend({email:H.string().optional()}),di=H.discriminatedUnion(`storage`,[li,ui]),fi=H.object({version:H.literal(1),users:H.partialRecord(H.string(),ai),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()}),pi=`2.0.0`,mi=H.templateLiteral([H.number().int(),`.`,H.number().int(),`.`,H.number().int()]),hi=H.object({version:H.literal(2),min_sdk_version:mi,latest_version:H.number().int().optional(),latest_min_sdk_version:mi.optional(),users:H.partialRecord(H.string(),ci),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()}),gi=H.object({version:H.literal(3),min_sdk_version:mi,latest_version:H.number().int().optional(),latest_min_sdk_version:mi.optional(),users:H.partialRecord(H.string(),di),profiles:H.partialRecord(H.string(),ii),current_user:H.string().nullable()});function platformConfigPath(){if(!nr)throw Error(`User home directory not found`);return B.join(nr,`tailor-platform`,`config.yaml`)}function platformConfigFromProfile(e){let t={...e?.platform_url?{platformUrl:e.platform_url}:{},...e?.oauth2_client_id?{oauth2ClientId:e.oauth2_client_id}:{},...e?.console_url?{consoleUrl:e.console_url}:{}};return Object.keys(t).length>0?t:void 0}function platformUserKey(e,t){let n=Mt(t);return n===$t(`https://api.tailor.tech`)?e:`${n}|${e}`}function userFromPlatformUserKey(e,t){let n=`${Mt(t)}|`;return e.startsWith(n)?e.slice(n.length):e}function canUseLegacyUserKey(e){try{return Mt()===e}catch{return!1}}function findUserByEmail(e,t,n){let r=Mt(n),i=`${r}|`,a=r===$t(pt);return Object.entries(e).find(([e,n])=>n?.email===t?a?!e.includes(`|`):e.startsWith(i):!1)}function findUserEntry(e,t,n,r={}){let i=platformUserKey(t,n),a=e.users[i];if(a)return{userKey:i,userEntry:a};let o=findUserByEmail(e.users,t,n);if(o?.[1])return{userKey:o[0],userEntry:o[1]};let s=Mt(n);if(i!==t&&(r.allowLegacyUserKey===!1||!canUseLegacyUserKey(s)))return{userKey:i,userEntry:a};let c=e.users[t];return c?{userKey:t,userEntry:c}:{userKey:i,userEntry:a}}function resolveUserTokenKey(e,t,n,r){return findUserEntry(e,t,n,r).userKey}function resolveConfigUser(e,t,n,r){let{userKey:i,userEntry:a}=findUserEntry(e,t,n,r);return a?userFromPlatformUserKey(i,n):void 0}function hasUserTokenEntry(e,t,n,r){return findUserEntry(e,t,n,r).userEntry!==void 0}function hasUserKeyForName(e,t){return e[t]!==void 0||Object.keys(e).some(e=>e.endsWith(`|${t}`))}function hasUserEmailEntry(e,t){return Object.values(e).some(e=>e?.email===t)}function hasAnyUserTokenEntry(e,t){return hasUserKeyForName(e.users,t)||hasUserEmailEntry(e.users,t)}function hasCurrentUserEntry(e,t){return hasUserKeyForName(e,t)}function migrateV1ToV2(e){let t={};for(let[n,r]of Object.entries(e.users))r&&(t[n]={access_token:r.access_token,refresh_token:r.refresh_token,token_expires_at:r.token_expires_at,storage:`file`});return{version:2,min_sdk_version:`1.29.0`,users:t,profiles:e.profiles,current_user:e.current_user}}function inferEmailFromUserId(e){return H.email().safeParse(e).success?e:void 0}function migrateV2ToV3(e){let t={};for(let[n,r]of Object.entries(e.users)){if(!r)continue;let e=inferEmailFromUserId(n);t[n]={...r,...e?{email:e}:{}}}return{version:3,min_sdk_version:pi,users:t,profiles:e.profiles,current_user:e.current_user}}function migrateV1ToV3(e){return migrateV2ToV3(migrateV1ToV2(e))}function formatUnknownError(e){return e instanceof Error?e.message:String(e)}async function trySaveTokensInKeyring(e,t){if(!await isKeyringAvailable())return!1;try{return await saveKeyringTokens(e,t),!0}catch(e){return M.warn(`System keyring failed to store credentials. Tokens will be stored in the config file. ${formatUnknownError(e)}`),!1}}async function warnIfNewerConfigAvailable(e){if(!e.latest_min_sdk_version)return;let t=(await pn()).version??`0.0.0`;tr(t,e.latest_min_sdk_version)&&M.warn(L`
2
2
  A newer config version (${String(e.latest_version)}) is available.
3
3
  Please update your SDK to >= ${e.latest_min_sdk_version}: pnpm update @tailor-platform/sdk
4
4
  `)}async function readPlatformConfig(){let e=platformConfigPath();if(!W.existsSync(e)){let e={version:3,min_sdk_version:pi,users:{},profiles:{},current_user:null};return writePlatformConfig(e),e}let t=Qn(W.readFileSync(e,`utf-8`));yn(e);let n=typeof t==`object`&&t&&`version`in t?t.version:void 0;if(typeof n==`number`&&n>3){let e=`min_sdk_version`in t?String(t.min_sdk_version):void 0,r=e?`Please update your SDK to >= ${e}: pnpm update @tailor-platform/sdk`:`Please update your SDK: pnpm update @tailor-platform/sdk`;throw Error(L`
@@ -59,7 +59,7 @@ If a value is genuinely safe to keep in 'env', allow it where it is defined: ${a
59
59
  }
60
60
  `;W.writeFileSync(o,c);let l=i??B.dirname(s),u=await ht(l),d=St({tsconfig:u}),f=await pr.build({plugins:[Ot(o,l),gt(),wt],input:o,write:!1,output:{format:`esm`,sourcemap:!1,minify:!1,codeSplitting:!1,globals:{tailordb:`tailordb`}},external:[`tailordb`],resolve:{conditionNames:[`node`,`import`]},tsconfig:u,treeshake:{moduleSideEffects:!1,annotations:!0,unknownGlobalSideEffects:!1},...d.options});return d.assertAllResolved(),{namespace:t,migrationNumber:n,bundledCode:f.output[0].code}}function formatMigrationScriptCommand(e){let{migrationNumber:t,namespace:n,configPath:r,noScript:i}=e,a=[`tailor`,`tailordb`,`migration`,`script`,formatMigrationNumber(t),`--namespace`,n],o=formatConfigArg(r);return o!==void 0&&a.push(o),i&&a.push(`--no-script`,`--reason`,`<reason>`),_n(a)}const fo=[`⠋`,`⠙`,`⠹`,`⠸`,`⠼`,`⠴`,`⠦`,`⠧`,`⠇`,`⠏`],po=`\x1B[?25h`,mo=`\x1B[2K`,ho=/\u001B\[[0-9;]*[a-zA-Z]/g;function visibleLength(e){return e.replace(ho,``).length}const go=new Set;let _o=!1,vo=!1;function installExitHook(){_o||(_o=!0,process.on(`exit`,()=>{for(let e of go)e.cleanupOnExit()}))}function installSignalHook(){if(vo)return;vo=!0;let handler=()=>{for(let e of go)e.stop()};process.prependListener(`SIGINT`,handler),process.prependListener(`SIGTERM`,handler)}var Spinner=class{text;#e;#t;#n;#r=0;#i;#a=0;#o=!1;constructor(e={}){this.text=``,this.#e=e.indent??0,this.#t=e.stream??process.stderr,this.#n=!!this.#t.isTTY}start(e){return e!==void 0&&(this.text=e),this.#n?this.#o?this:(installExitHook(),installSignalHook(),go.add(this),this.#o=!0,this.#t.write(`\x1B[?25l`),this.#c(),this.#i=setInterval(()=>this.#c(),80),typeof this.#i.unref==`function`&&this.#i.unref(),this):(this.#u(`- ${this.text}`),this)}stop(){return this.#o?(this.#o=!1,this.#i&&=(clearInterval(this.#i),void 0),this.#n&&(this.#l(),this.#t.write(po)),go.delete(this),this):this}succeed(e){return this.#s(j.success,e)}fail(e){return this.#s(j.error,e)}warn(e){return this.#s(j.warning,e)}cleanupOnExit(){this.#i&&=(clearInterval(this.#i),void 0),this.#n&&this.#t.write(po)}#s(e,t){return t!==void 0&&(this.text=t),this.#o&&(this.#o=!1,this.#i&&=(clearInterval(this.#i),void 0),this.#n&&(this.#l(),this.#t.write(po)),go.delete(this)),this.#u(`${e} ${this.text}`),this}#c(){this.#t.write(`\x1B[?2026h`),this.#l();let e=N.info(fo[this.#r]??A(fo[0],`spinner frames empty`));this.#r=(this.#r+1)%fo.length;let t=`${` `.repeat(this.#e)}${e} ${this.text}`;this.#t.write(ut(this.#t,t)),this.#t.write(`\x1B[?2026l`);let n=this.#t.columns||80;this.#a=Math.max(1,Math.ceil(visibleLength(t)/n))}#l(){if(this.#a!==0){this.#t.write(`\r`),this.#t.write(mo);for(let e=1;e<this.#a;e++)this.#t.write(`\x1B[1A`),this.#t.write(mo);this.#a=0}}#u(e){let t=` `.repeat(this.#e);this.#t.write(ut(this.#t,`${t}${e}\n`))}};function spinner(e){return new Spinner(e)}const yo=65536;function migrationWorkflowResourceName(e,t){return`tailordb-migration--${e}--${formatMigrationNumber(t)}`}async function uploadMigrationFunction(e,t,n,r,i,a){let o=Buffer.from(r,`utf-8`),s={workspaceId:t,name:n,description:`Temporary function for a TailorDB migration`,sizeBytes:BigInt(o.length),contentHash:ir.createHash(`sha256`).update(r,`utf-8`).digest(`hex`)};async function*stream(){yield{payload:{case:`info`,value:s}};for(let e=0;e<o.length;e+=yo)yield{payload:{case:`chunk`,value:o.subarray(e,Math.min(e+yo,o.length))}}}await e.createFunctionRegistry(stream()),await writeMetadataLabelsDirect(e,await buildMetaRequest({trn:resourceTrn(t,`function_registry`,n),appName:i,appId:a}))}async function teardown(e,t,n,r){let i=[...r?[[`workflow`,()=>e.deleteWorkflow({workspaceId:t,workflowId:r})]]:[],[`job function`,()=>e.deleteWorkflowJobFunction({workspaceId:t,jobFunctionName:n})],[`function`,()=>e.deleteFunctionRegistry({workspaceId:t,name:n})]];for(let[e,t]of i)try{await t()}catch(t){if(Lt(t))continue;M.warn(`Could not remove the temporary migration ${e} '${n}': ${t instanceof Error?t.message:String(t)}. It is labeled as owned by this app and can be removed by a later deploy.`)}}async function reclaimLeftovers(e,t,n){await teardown(e,t,n,await findMigrationWorkflowId(e,t,n))}async function findMigrationWorkflowId(e,t,n){try{let{workflow:r}=await e.getWorkflowByName({workspaceId:t,workflowName:n});return r?.id}catch(e){if(Lt(e))return;throw e}}async function executeMigrationAsWorkflow(e){let{client:t,workspaceId:n,code:r,namespace:i,migrationNumber:a,invoker:o,appName:s,appId:c}=e,l=migrationWorkflowResourceName(i,a),u=e.pollIntervalMs??3e3,d;try{await reclaimLeftovers(t,n,l),await uploadMigrationFunction(t,n,l,r,s,c);let{jobFunction:e}=await t.createWorkflowJobFunction({workspaceId:n,jobFunctionName:l,scriptRef:l,publishExecutionEvents:!1});await writeMetadataLabelsDirect(t,await buildMetaRequest({trn:resourceTrn(n,`workflow_job_function`,l),appName:s,appId:c}));let i=e?.version;if(i===void 0)throw Error(`Temporary migration job function '${l}' was created without a version.`);let{workflow:a}=await t.createWorkflow({workspaceId:n,workflowName:l,mainJobFunctionName:l,jobFunctions:{[l]:i}});if(d=a?.id,!d)throw Error(`Temporary migration workflow '${l}' was created without an id.`);await writeMetadataLabelsDirect(t,await buildMetaRequest({trn:resourceTrn(n,`workflow`,l),appName:s,appId:c}));let{executionId:f}=await t.startWorkflow({workspaceId:n,workflowId:d,authInvoker:o});return await waitForMigrationWorkflow(t,n,f,u)}finally{await teardown(t,n,l,d)}}async function waitForMigrationWorkflow(e,t,n,r){for(;;){let{execution:i}=await e.getWorkflowExecution({workspaceId:t,executionId:n});if(!i)throw Error(`Migration workflow execution '${n}' not found.`);if(i.status===D.SUCCESS){let{logs:n}=await collectJobOutcomes(e,t,i);return{success:!0,logs:n}}if(i.status===D.FAILED){let n=await collectJobOutcomes(e,t,i);return{success:!1,logs:n.logs,error:extractFailureMessage(n)}}await new Promise(e=>setTimeout(e,r))}}async function collectJobOutcomes(e,t,n){let r=await Promise.all(n.jobExecutions.map(async n=>{if(n.executionId)try{let{execution:r}=await e.getFunctionExecution({workspaceId:t,executionId:n.executionId});if(!r)return;let i=r.error?.message.trim()||r.result.trim()||``;return{logs:r.logs,failure:i}}catch{return}}));return{logs:r.map(e=>e?.logs).filter(Boolean).join(`
61
61
  `),failures:r.map(e=>e?.failure).filter(e=>!!e)}}function extractFailureMessage(e){return e.failures.at(-1)||e.logs.split(`
62
- `).filter(e=>/error/i.test(e)).at(-1)?.trim()||`Migration workflow execution failed.`}async function getCurrentMigrationNumber(e,t,n){try{let r=resourceTrn(t,`tailordb`,n),{metadata:i}=await e.getMetadata({trn:r}),a=i?.labels[Yi];return a?parseMigrationLabelNumber(a)??0:0}catch(e){if(Lt(e))return 0;throw e}}async function detectPendingMigrations(e,t,n,r,i){let a=[];for(let{namespace:o,migrationsDir:s}of n){let n=i?.get(o)??await getCurrentMigrationNumber(e,t,o),c=getMigrationFiles(s);for(let e of c){if(e.number<=n)continue;let t=getMigrationFilePath(s,e.number,`diff`);if(!W.existsSync(t))continue;let i=loadDiff(t),c=getMigrationFilePath(s,e.number,`migrate`),l=W.existsSync(c);if(i.requiresMigrationScript&&!l&&!i.scriptSkipped){let t={migrationNumber:e.number,namespace:o,configPath:r};throw Error(`Migration ${o}/${formatMigrationNumber(e.number)} requires a migration script but migrate.ts was not found.\nTo resolve, either:\n - Add a script: ${formatMigrationScriptCommand(t)}\n - Or record that no script is needed: ${formatMigrationScriptCommand({...t,noScript:!0})}`)}if(i.scriptSkipped){let t=`${o}/${formatMigrationNumber(e.number)}`;if(l)throw Error(`Migration ${t} has both a --no-script skip acknowledgment and migrate.ts.\nTo resolve, either:\n - Keep the script and clear the stale acknowledgment: ${formatMigrationScriptCommand({migrationNumber:e.number,namespace:o,configPath:r})}\n - Or keep the skip: delete migrate.ts`);M.info(`Migration ${t} runs without a script (skip acknowledged at ${i.scriptSkipped.acknowledgedAt}: ${i.scriptSkipped.reason})`)}a.push({number:e.number,scriptPath:c,hasScript:l,diffPath:t,namespace:o,migrationsDir:s,diff:i})}}return a.toSorted((e,t)=>e.namespace===t.namespace?e.number-t.number:e.namespace.localeCompare(t.namespace))}async function executeSingleMigration(e,t){let{client:n,workspaceId:r,invoker:i,env:a,configDir:o,appName:s,appId:c}=e,l=await executeMigrationAsWorkflow({client:n,workspaceId:r,code:(await bundleMigrationScript(t.scriptPath,t.namespace,t.number,a,o)).bundledCode,namespace:t.namespace,migrationNumber:t.number,invoker:i,appName:s,appId:c});return{namespace:t.namespace,migrationNumber:t.number,success:l.success,logs:l.logs,error:l.error}}async function updateMigrationLabel(e,t,n,r,i){await writeMetadataLabelsDirect(e,{trn:resourceTrn(t,`tailordb`,n),labels:{[Yi]:sanitizeMigrationLabel(r),...i?{[Xi]:i}:{}},remove:i?void 0:[Xi]})}async function executeMigrations(e,t){let n=t.filter(e=>e.hasScript);if(n.length===0)return;let r=groupMigrationsByNamespace(n);for(let[t,n]of r){let r=e.dbConfig[t]?.migration,i=getMigrationMachineUser(r,e.machineUsers);if(!i)throw Error(`No machine user available for migration execution in namespace '${t}'. Either configure 'migration.machineUser' in db config or define machine users in auth config.`);let a=U(C,{namespace:e.authNamespace,machineUserName:i}),o={client:e.client,workspaceId:e.workspaceId,invoker:a,env:e.env,configDir:e.configDir,appName:e.appName,appId:e.appId};M.info(`Using machine user: ${N.bold(i)} for namespace '${t}'`);for(let e of n){let t=`${e.namespace}/${formatMigrationNumber(e.number)}`,n=spinner().start(`Executing migration ${t} (this can take a while)...`),r=await executeSingleMigration(o,e);if(r.success)n.succeed(`Migration ${t} completed successfully`),r.logs&&r.logs.trim()&&M.log(`Logs:\n${r.logs}`);else throw n.fail(`Migration ${t} failed`),r.logs&&M.error(`Logs:\n${r.logs}`),Error(r.error??`Migration failed`)}}}function getMigrationMachineUser(e,t){if(e?.machineUser)return e.machineUser;if(t&&t.length>0)return t[0]}function groupMigrationsByNamespace(e){let t=new Map;for(let n of e){let e=t.get(n.namespace)??[];e.push(n),t.set(n.namespace,e)}return t}function defineRecordEntry(e,t,n){Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0,configurable:!0})}const bo=new Set([`field_added`,`field_modified`,`field_type_modified`,`field_removed`,`field_renamed`]);function isPreMigrationFieldChange(e){return bo.has(e.kind)}function createPreMigrationSnapshotType(e,t,n){let r=structuredClone(e.fields),i=!1;for(let[e,n]of t)n.kind===`field_type_modified`&&(i=!0,defineRecordEntry(r,e,structuredClone(n.before)));let a={...e,fields:r};if(!i||!n)return a;let{typeHookExpr:o,typeValidateExpr:s,...c}=a;return{...c,...n.before.typeHookExpr&&{typeHookExpr:structuredClone(n.before.typeHookExpr)},...n.before.typeValidateExpr!==void 0&&{typeValidateExpr:n.before.typeValidateExpr}}}function buildPreMigrationChangesMap(e){let t=new Map;for(let n of e)for(let e of n.diff.changes){if(!isPreMigrationFieldChange(e)||!e.fieldName)continue;let n=t.get(e.tableName)??new Map;n.set(e.fieldName,e),t.set(e.tableName,n)}return t}function applyPreMigrationFieldAdjustments(e,t){for(let[n,r]of t){if(r.kind===`field_removed`){defineRecordEntry(e,n,convertFieldConfigToProto(r.before));continue}if(r.kind===`field_renamed`){defineRecordEntry(e,r.previousFieldName,convertFieldConfigToProto(r.before));let t=e[n];t&&(r.after.required&&(t.required=!1),(r.after.unique??!1)&&(t.unique=!1));continue}let t=e[n];if(!t)continue;if(r.kind===`field_added`){r.after.required&&(t.required=!1);continue}if(r.kind===`field_type_modified`){defineRecordEntry(e,n,convertFieldConfigToProto(r.before));continue}let{before:i,after:a}=r;if(!i.required&&a.required&&(t.required=!1),!(i.unique??!1)&&(a.unique??!1)&&(t.unique=!1),i.allowedValues&&a.allowedValues){let e=new Set(a.allowedValues.map(e=>e.value));if(i.allowedValues.filter(t=>!e.has(t.value)).length>0){let e=new Map;for(let t of i.allowedValues)e.set(t.value,t.description??``);for(let t of a.allowedValues)e.has(t.value)||e.set(t.value,t.description??``);t.allowedValues=Array.from(e.entries()).map(([e,t])=>({value:e,description:t}))}}}}function buildPreMigrationIndexChangesMap(e){let t=new Map;for(let n of e)for(let e of n.diff.changes){if(e.kind!==`index_added`&&e.kind!==`index_modified`)continue;let n=e.kind===`index_modified`?e.before:void 0;if(!isBreakingIndexChange(e.tableName,e.indexName,n,e.after))continue;let r=t.get(e.tableName)??new Map;r.set(e.indexName,e),t.set(e.tableName,r)}return t}function applyPreMigrationIndexAdjustments(e,t){for(let[n,r]of t){if(r.kind===`index_added`){delete e[n];continue}r.kind===`index_modified`&&defineRecordEntry(e,n,convertIndexToProto(r.before))}}async function captureMigrationRestrictionState(e,t,n){let r=new Map;for(let i of n){let n=await P(async(n,r)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:i,pageToken:n,pageSize:r});return[a,o]}),a=new Map;for(let e of n){let t=e.schema?.settings;e.name&&a.set(e.name,{bulkUpsert:t?.bulkUpsert??!1,publishRecordEvents:t?.publishRecordEvents??!1,...t?.disableGqlOperations&&{disableGqlOperations:{create:t.disableGqlOperations.create,update:t.disableGqlOperations.update,delete:t.disableGqlOperations.delete,read:t.disableGqlOperations.read}},tailordbType:structuredClone(e)})}r.set(i,a)}return r}function getAffectedTableNames(e){let t=new Set;for(let n of e.diff.changes)t.add(n.tableName);return t}function getDeletedTableNames(e){let t=new Set;for(let n of e.diff.changes)n.kind===`table_removed`?t.add(n.tableName):n.kind===`table_renamed`&&t.add(n.previousTableName);return t}const xo={created:new Set,updated:new Set,gqlPermissionsProcessed:new Set,reset(){this.created.clear(),this.updated.clear(),this.gqlPermissionsProcessed.clear()}},So={cache:new Map,reset(){this.cache.clear()},load(e){let t=`${e.namespace}/${e.number}`,n=this.cache.get(t);if(!n){let r=reconstructSnapshotFromMigrations(e.migrationsDir,e.number);if(!r)throw Error(`Cannot reconstruct snapshot for ${e.namespace} migration ${e.number}: no migrations found in ${e.migrationsDir}`);n=r,this.cache.set(t,n)}return n}};function buildSnapshotTypeManifest(e,t,n,r){let i=So.load(e).tables[t];if(!i)return;let a=n.find(t=>t.namespace===e.namespace),o=e.diff.changes.find(e=>e.kind===`table_scripts_modified`&&e.tableName===t);return generateTailorDBTypeManifestFromSnapshot(r?createPreMigrationSnapshotType(i,r,o):i,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:a?.config.gqlOperations})}async function awaitAllSettledOrThrow(e){let t=(await Promise.allSettled(e.filter(e=>e!==void 0))).find(e=>e.status===`rejected`);if(t)throw t.reason}async function executeSingleMigrationPrePhase(e,t,n,r,i){let a=buildPreMigrationChangesMap([n]),o=buildPreMigrationIndexChangesMap([n]),s=getAffectedTableNames(n),c=new Set(xo.created);for(let l of t.type.creates){let t=l.request.tailordbType?.name;if(!t||!s.has(t)||c.has(t))continue;let u=a.get(t),d=buildSnapshotTypeManifest(n,t,r,u);if(!d)continue;let f=structuredClone(l.request);f.tailordbType=d,u&&u.size>0&&f.tailordbType.schema?.fields&&applyPreMigrationFieldAdjustments(f.tailordbType.schema.fields,u);let p=o.get(t);p&&p.size>0&&f.tailordbType.schema?.indexes&&applyPreMigrationIndexAdjustments(f.tailordbType.schema.indexes,p),xo.created.add(t),i.add(t),await e.createTailorDBType(f)}for(let l of t.type.creates){let t=l.request.tailordbType?.name;if(!t||!s.has(t)||!c.has(t))continue;let u=a.get(t),d=buildSnapshotTypeManifest(n,t,r,u);if(!d)continue;let f=structuredClone(d);u&&u.size>0&&f.schema?.fields&&applyPreMigrationFieldAdjustments(f.schema.fields,u);let p=o.get(t);p&&p.size>0&&f.schema?.indexes&&applyPreMigrationIndexAdjustments(f.schema.indexes,p),xo.updated.add(t),i.add(t),await e.updateTailorDBType({workspaceId:l.request.workspaceId,namespaceName:l.request.namespaceName,tailordbType:f})}for(let c of t.type.updates){let t=c.request.tailordbType?.name;if(!t||!s.has(t))continue;let l=a.get(t),u=buildSnapshotTypeManifest(n,t,r,l);if(!u)continue;let d=structuredClone(c.request);d.tailordbType=u,l&&l.size>0&&d.tailordbType.schema?.fields&&applyPreMigrationFieldAdjustments(d.tailordbType.schema.fields,l);let f=o.get(t);f&&f.size>0&&d.tailordbType.schema?.indexes&&applyPreMigrationIndexAdjustments(d.tailordbType.schema.indexes,f),xo.updated.add(t),i.add(t),await e.updateTailorDBType(d)}let l=new Set(Object.keys(So.load(n).tables)),permissionKey=e=>`${n.namespace}/${e}`,u=t.gqlPermission.creates.filter(e=>e.request.namespaceName===n.namespace&&l.has(e.name)&&!xo.gqlPermissionsProcessed.has(permissionKey(e.name))),d=t.gqlPermission.updates.filter(e=>e.request.namespaceName===n.namespace&&l.has(e.name)&&!xo.gqlPermissionsProcessed.has(permissionKey(e.name)));if(u.length+d.length>0){let a=new Set(u.map(e=>e.name)),o=t.type.creates.filter(e=>{let t=e.request.tailordbType?.name;return e.request.namespaceName===n.namespace&&t&&a.has(t)&&!xo.created.has(t)});if(o.length>0)for(let t of o){let a=t.request.tailordbType?.name;if(!a)continue;let o=buildSnapshotTypeManifest(n,a,r);if(!o)continue;xo.created.add(a),i.add(a);let s=structuredClone(t.request);s.tailordbType=o,await e.createTailorDBType(s)}await awaitAllSettledOrThrow([...u.map(t=>e.createTailorDBGQLPermission(t.request)),...d.map(t=>e.updateTailorDBGQLPermission(t.request))]);for(let e of[...u.map(e=>e.name),...d.map(e=>e.name)])xo.gqlPermissionsProcessed.add(permissionKey(e))}}const Co={types:new Set,gqlPermissions:new Set,reset(){this.types.clear(),this.gqlPermissions.clear()}};async function rollbackSingleMigrationAfterFailure(e,t,n,r,i){try{await rollbackSingleMigrationPrePhase(e,t,n,r,i)}catch(e){M.warn(`Failed to roll back migration ${t.namespace}/${formatMigrationNumber(t.number)}: ${e instanceof Error?e.message:String(e)}`)}}async function executeSingleMigrationPostPhase(e,t,n,r,i){let a=buildPreMigrationChangesMap([n]),o=buildPreMigrationIndexChangesMap([n]),s=new Set([...a.keys(),...o.keys()]),c=getAffectedTableNames(n);try{for(let a of t.type.creates){let t=a.request.tailordbType?.name;if(!t||!c.has(t)||!s.has(t))continue;let o=buildSnapshotTypeManifest(n,t,r);o&&(i.add(t),await e.updateTailorDBType({workspaceId:a.request.workspaceId,namespaceName:a.request.namespaceName,tailordbType:o}))}for(let a of t.type.updates){let t=a.request.tailordbType?.name;if(!t||!c.has(t)||!s.has(t))continue;let o=buildSnapshotTypeManifest(n,t,r);o&&(i.add(t),await e.updateTailorDBType({workspaceId:a.request.workspaceId,namespaceName:a.request.namespaceName,tailordbType:o}))}}catch(e){handleOptionalToRequiredError(e,[`This error occurred during post-migration phase. Please check your migration script.`,`Ensure all existing records have values for fields being changed to required.`])}}function acceptsMigrationWrites(e){let t=e.disableGqlOperations;return e.publishRecordEvents||e.bulkUpsert||t?.create!==!0||t.update!==!0||t.delete!==!0}async function rewriteRestrictedTables(e,t){let{workspaceId:n,namespaceName:r,snapshot:i,input:a,executorUsedTables:o,settingsState:s,restricted:c,continueOnError:l=!1}=t,u,d=new Set([...Object.keys(i.tables),...s?.keys()??[]]);for(let t of d)try{let l=i.tables[t],u=s?.get(t);if(s&&!u||c&&(!u||!acceptsMigrationWrites(u)))continue;let d=l?c?generateTailorDBTypeManifestFromSnapshot(l,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:a.config.gqlOperations}):generateTailorDBTypeManifestFromSnapshot(l,{subscribed:o.has(t),namespaceGqlOperations:a.config.gqlOperations}):u?.tailordbType?structuredClone(u.tailordbType):void 0;if(!d?.schema)continue;d.schema.settings??={};let f=d.schema.settings;c&&(f.bulkUpsert=!1,f.publishRecordEvents=!1,f.disableGqlOperations={create:!0,update:!0,delete:!0,read:!0}),!c&&u&&(f.bulkUpsert=u.bulkUpsert,f.publishRecordEvents=u.publishRecordEvents,f.disableGqlOperations=u.disableGqlOperations?{...u.disableGqlOperations}:void 0),await e.updateTailorDBType({workspaceId:n,namespaceName:r,tailordbType:d})}catch(e){if(!l)throw e;u??=e instanceof Error?e:Error(String(e),{cause:e})}if(u!==void 0)throw u}function resolveMigrationSnapshotSettings(e,t,n){let r=new Map;for(let[i,a]of Object.entries(e.tables)){let e=generateTailorDBTypeManifestFromSnapshot(a,{subscribed:!1,namespaceGqlOperations:t.config.gqlOperations}).schema?.settings;e&&r.set(i,{bulkUpsert:e.bulkUpsert??!1,publishRecordEvents:a.settings?.publishEvents??n.has(i),...e.disableGqlOperations&&{disableGqlOperations:{create:e.disableGqlOperations.create??!1,update:e.disableGqlOperations.update??!1,delete:e.disableGqlOperations.delete??!1,read:e.disableGqlOperations.read??!1}}})}return r}async function applyMigrationRestrictions(e,t,n,r,i,a){for(let[o,s]of t){let t=r.find(e=>e.namespace===o);t&&await rewriteRestrictedTables(e,{workspaceId:a,namespaceName:o,snapshot:s,input:t,executorUsedTables:i,settingsState:n.get(o)??new Map,restricted:!0})}}async function restoreMigrationRestrictions(e,t,n,r,i,a){let o;for(let[s,c]of t){let t=r.find(e=>e.namespace===s);if(t)try{await rewriteRestrictedTables(e,{workspaceId:a,namespaceName:s,snapshot:c,input:t,executorUsedTables:i,settingsState:n?.get(s),restricted:!1,continueOnError:!0})}catch(e){o??=e instanceof Error?e:Error(String(e),{cause:e})}}if(o!==void 0)throw o}async function executeSingleMigrationPostPhaseDeletions(e,t,n){let r=getDeletedTableNames(n);if(r.size>0){let n=t.gqlPermission.deletes.filter(e=>{let t=`${e.request.namespaceName}/${e.name}`;if(Co.gqlPermissions.has(t))return!1;let n=e.name;return r.has(n)});for(let t of n)await e.deleteTailorDBGQLPermission(t.request),Co.gqlPermissions.add(`${t.request.namespaceName}/${t.name}`);let i=t.type.deletes.filter(e=>{let t=e.name;return!t||Co.types.has(t)?!1:r.has(t)});for(let t of i)await e.deleteTailorDBType(t.request),Co.types.add(t.name)}}async function rollbackSingleMigrationPrePhase(e,t,n,r,i){if(t.number<=0||i.size===0)return;let a=reconstructSnapshotFromMigrations(t.migrationsDir,t.number-1);if(!a){M.warn(`Cannot roll back migration ${t.namespace}/${formatMigrationNumber(t.number)}: prior snapshot (migration ${formatMigrationNumber(t.number-1)}) could not be reconstructed. Leaving schema as-is; manual repair may be required.`);return}let o=r.find(e=>e.namespace===t.namespace);M.warn(`Migration ${t.namespace}/${formatMigrationNumber(t.number)} failed; rolling back its pre-migration schema changes.`);let s=[...i].flatMap(e=>{let t=a.tables[e];return t?[{tableName:e,priorTable:t}]:[]}),c=[...i].filter(e=>!a.tables[e]);for(let{tableName:r,priorTable:i}of s)try{let r=generateTailorDBTypeManifestFromSnapshot(i,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:o?.config.gqlOperations});await e.updateTailorDBType({workspaceId:n,namespaceName:t.namespace,tailordbType:r})}catch(e){M.warn(`Failed to roll back table '${r}' in namespace '${t.namespace}': ${e instanceof Error?e.message:String(e)}`)}for(let r of c)try{await e.deleteTailorDBGQLPermission({workspaceId:n,namespaceName:t.namespace,typeName:r}).catch(()=>void 0),await e.deleteTailorDBType({workspaceId:n,namespaceName:t.namespace,tailordbTypeName:r})}catch(e){M.warn(`Failed to roll back table '${r}' in namespace '${t.namespace}': ${e instanceof Error?e.message:String(e)}`)}}function toTailorDBDeployInput(e){let t={};for(let[n,r]of Object.entries(e.types))t[n]=createSnapshotType(r);return{namespace:e.namespace,config:e.config,types:t}}async function fetchRemoteTypes(e,t,n){return P(async(r,i)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]})}async function fetchRemoteGqlPermissions(e,t,n){return P(async(r,i)=>{let{permissions:a,nextPageToken:o}=await e.listTailorDBGQLPermissions({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]})}async function fetchRemoteSchemaSnapshot(e,t,n){let[r,i]=await Promise.all([fetchRemoteTypes(e,t,n),fetchRemoteGqlPermissions(e,t,n)]);return createSnapshotFromRemoteTypes(r,n,i)}function definedWhenNotEmpty(e){return Object.keys(e).length>0?e:void 0}function namespaceConfig(e,t,n){return t.find(e=>e.namespace===n)?.config??e.db?.[n]}function namespaceGqlOperations(e,t,n){return namespaceConfig(e,t,n)?.gqlOperations}const wo=[`create`,`update`,`delete`,`read`];function configuredDisabledGqlOperations(e){if(!e)return;if(e===`query`)return{create:!1,update:!1,delete:!1};let t={};for(let n of wo)e[n]===!1&&(t[n]=!1);return definedWhenNotEmpty(t)}function appliedConfiguredDisabledGqlOperations(e,t){if(!e||!t)return;let n={};for(let r of wo)t[r]===!1&&e[r]&&(n[r]=!1);return definedWhenNotEmpty(n)}function deployComparableSnapshot(e,t,n){let r=new Map(t.map(e=>[e.name,e])),i=configuredDisabledGqlOperations(n),a={};for(let[t,n]of Object.entries(e.tables)){let e={...n.settings},o=r.get(t)?.schema?.settings;if(n.settings?.publishEvents===void 0&&o?.publishRecordEvents&&(e.publishEvents=!0),n.settings?.gqlOperations===void 0){let t=appliedConfiguredDisabledGqlOperations(o?.disableGqlOperations,i);t&&(e.gqlOperations=t)}let s={...n},c=definedWhenNotEmpty(e);c?s.settings=c:delete s.settings,a[t]=s}return{...e,tables:a}}async function verifyRemoteSchema(e,t,n,r,i){let a=[];for(let{namespace:o,migrationsDir:s}of n){let n=await fetchRemoteMigrationState(e,resourceTrn(t,`tailordb`,o)),{metadataExists:c,number:l}=n;if(n.historyIdInvalid||l===null&&n.historyId!==null){a.push({namespace:o,remoteMigrationNumber:l??0,drifts:[],hasDrift:!1,checkpointMissingLocal:!0});continue}if(l===null){a.push({namespace:o,remoteMigrationNumber:0,drifts:[],hasDrift:!1,skipped:c?`no_migration_label`:`not_deployed`});continue}let u=getLatestMigrationNumber(s),d=reconstructSnapshotFromMigrations(s,0)?.rebaseline,f=d?n.historyId===d.historyId:n.historyId===null,p=d?n.historyId===d.replacedHistoryId:!1,m=d&&p&&l===d.replacedLatestMigration?{from:l,to:0,fromHistoryId:n.historyId,toHistoryId:d.historyId}:void 0;if(!f&&!m||l>u&&!m){a.push({namespace:o,remoteMigrationNumber:l,drifts:[],hasDrift:!1,checkpointMissingLocal:!0});continue}let h=reconstructSnapshotFromMigrations(s,m?.to??l);if(!h){a.push({namespace:o,remoteMigrationNumber:l,drifts:[],hasDrift:!1,skipped:`no_snapshot`});continue}let[g,_]=await Promise.all([fetchRemoteTypes(e,t,o),fetchRemoteGqlPermissions(e,t,o)]),v=compareRemoteWithSnapshot(g,deployComparableSnapshot(h,g,namespaceGqlOperations(r,i,o)),_);a.push({namespace:o,remoteMigrationNumber:l,drifts:v,hasDrift:v.length>0,...m&&v.length===0?{checkpointRepair:m}:{}})}return a}function isMissingRemoteScriptHashDrift(e){return e.kind===`script_mismatch`&&e.details.endsWith(`has no script hash on remote`)}function isLikelyPreV2ScriptHashDrift(e){let t=e.filter(e=>e.hasDrift);return t.length>0&&t.every(e=>e.drifts.length>0&&e.drifts.every(isMissingRemoteScriptHashDrift))}function logRemoteDriftGuidance(e){M.info(`This may indicate:`),M.info(` - Another developer applied different migrations`,{mode:`plain`}),M.info(` - Manual schema changes were made directly`,{mode:`plain`}),M.info(` - Migration history is out of sync`,{mode:`plain`}),M.newline(),M.info(`To resolve:`),M.info(` - Run 'tailor tailordb migration status' to compare local vs remote.`,{mode:`plain`}),M.info(` - If remote is correct, update local tables and run 'migration generate'.`,{mode:`plain`}),M.info(` - If local migration history is correct, run 'migration sync <N>' to overwrite remote.`,{mode:`plain`}),M.info(` - If only bookkeeping is stale, run 'migration set <N>'.`,{mode:`plain`}),e&&isLikelyPreV2ScriptHashDrift(e)&&(M.newline(),M.info(`Every listed drift is '${lo}'. Run 'migration sync <N>' above to add the missing hashes.`))}function formatRemoteVerificationResults(e){let t=[];for(let n of e)n.hasDrift&&(t.push(`Namespace: ${n.namespace}`),t.push(` Remote migration: ${formatMigrationNumber(n.remoteMigrationNumber)}`),t.push(` Differences:`),t.push(formatSchemaDrifts(n.drifts)),t.push(``));return t.join(`
62
+ `).filter(e=>/error/i.test(e)).at(-1)?.trim()||`Migration workflow execution failed.`}async function getCurrentMigrationNumber(e,t,n){try{let r=resourceTrn(t,`tailordb`,n),{metadata:i}=await e.getMetadata({trn:r}),a=i?.labels[Yi];return a?parseMigrationLabelNumber(a)??0:0}catch(e){if(Lt(e))return 0;throw e}}async function detectPendingMigrations(e,t,n,r,i){let a=[];for(let{namespace:o,migrationsDir:s}of n){let n=i?.get(o)??await getCurrentMigrationNumber(e,t,o),c=getMigrationFiles(s);for(let e of c){if(e.number<=n)continue;let t=getMigrationFilePath(s,e.number,`diff`);if(!W.existsSync(t))continue;let i=loadDiff(t),c=getMigrationFilePath(s,e.number,`migrate`),l=W.existsSync(c);if(i.requiresMigrationScript&&!l&&!i.scriptSkipped){let t={migrationNumber:e.number,namespace:o,configPath:r};throw Error(`Migration ${o}/${formatMigrationNumber(e.number)} requires a migration script but migrate.ts was not found.\nTo resolve, either:\n - Add a script: ${formatMigrationScriptCommand(t)}\n - Or record that no script is needed: ${formatMigrationScriptCommand({...t,noScript:!0})}`)}if(i.scriptSkipped){let t=`${o}/${formatMigrationNumber(e.number)}`;if(l)throw Error(`Migration ${t} has both a --no-script skip acknowledgment and migrate.ts.\nTo resolve, either:\n - Keep the script and clear the stale acknowledgment: ${formatMigrationScriptCommand({migrationNumber:e.number,namespace:o,configPath:r})}\n - Or keep the skip: delete migrate.ts`);M.info(`Migration ${t} runs without a script (skip acknowledged at ${i.scriptSkipped.acknowledgedAt}: ${i.scriptSkipped.reason})`)}a.push({number:e.number,scriptPath:c,hasScript:l,diffPath:t,namespace:o,migrationsDir:s,diff:i})}}return a.toSorted((e,t)=>e.namespace===t.namespace?e.number-t.number:e.namespace.localeCompare(t.namespace))}async function executeSingleMigration(e,t){let{client:n,workspaceId:r,invoker:i,env:a,configDir:o,appName:s,appId:c}=e,l=await executeMigrationAsWorkflow({client:n,workspaceId:r,code:(await bundleMigrationScript(t.scriptPath,t.namespace,t.number,a,o)).bundledCode,namespace:t.namespace,migrationNumber:t.number,invoker:i,appName:s,appId:c});return{namespace:t.namespace,migrationNumber:t.number,success:l.success,logs:l.logs,error:l.error}}async function updateMigrationLabel(e,t,n,r,i){await writeMetadataLabelsDirect(e,{trn:resourceTrn(t,`tailordb`,n),labels:{[Yi]:sanitizeMigrationLabel(r),...i?{[Xi]:i}:{}},remove:i?void 0:[Xi]})}async function executeMigrations(e,t){let n=t.filter(e=>e.hasScript);if(n.length===0)return;let r=groupMigrationsByNamespace(n);for(let[t,n]of r){let r=e.dbConfig[t]?.migration,i=getMigrationMachineUser(r,e.machineUsers);if(!i)throw Error(`No machine user available for migration execution in namespace '${t}'. Either configure 'migration.machineUser' in db config or define machine users in auth config.`);let a=U(C,{namespace:e.authNamespace,machineUserName:i}),o={client:e.client,workspaceId:e.workspaceId,invoker:a,env:e.env,configDir:e.configDir,appName:e.appName,appId:e.appId};M.info(`Using machine user: ${N.bold(i)} for namespace '${t}'`);for(let e of n){let t=`${e.namespace}/${formatMigrationNumber(e.number)}`,n=spinner().start(`Executing migration ${t} (this can take a while)...`),r=await executeSingleMigration(o,e);if(r.success)n.succeed(`Migration ${t} completed successfully`),r.logs&&r.logs.trim()&&M.log(`Logs:\n${r.logs}`);else throw n.fail(`Migration ${t} failed`),r.logs&&M.error(`Logs:\n${r.logs}`),Error(r.error??`Migration failed`)}}}function getMigrationMachineUser(e,t){if(e?.machineUser)return e.machineUser;if(t&&t.length>0)return t[0]}function groupMigrationsByNamespace(e){let t=new Map;for(let n of e){let e=t.get(n.namespace)??[];e.push(n),t.set(n.namespace,e)}return t}function defineRecordEntry(e,t,n){Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0,configurable:!0})}const bo=new Set([`field_added`,`field_modified`,`field_type_modified`,`field_removed`,`field_renamed`]);function isPreMigrationFieldChange(e){return bo.has(e.kind)}function createPreMigrationSnapshotType(e,t,n){let r=structuredClone(e.fields),i=!1;for(let[e,n]of t)n.kind===`field_type_modified`&&(i=!0,defineRecordEntry(r,e,structuredClone(n.before)));let a={...e,fields:r};if(!i||!n)return a;let{typeHookExpr:o,typeValidateExpr:s,...c}=a;return{...c,...n.before.typeHookExpr&&{typeHookExpr:structuredClone(n.before.typeHookExpr)},...n.before.typeValidateExpr!==void 0&&{typeValidateExpr:n.before.typeValidateExpr}}}function buildPreMigrationChangesMap(e){let t=new Map;for(let n of e)for(let e of n.diff.changes){if(!isPreMigrationFieldChange(e)||!e.fieldName)continue;let n=t.get(e.tableName)??new Map;n.set(e.fieldName,e),t.set(e.tableName,n)}return t}function applyPreMigrationFieldAdjustments(e,t){for(let[n,r]of t){if(r.kind===`field_removed`){defineRecordEntry(e,n,convertFieldConfigToProto(r.before));continue}if(r.kind===`field_renamed`){defineRecordEntry(e,r.previousFieldName,convertFieldConfigToProto(r.before));let t=e[n];t&&(r.after.required&&(t.required=!1),(r.after.unique??!1)&&(t.unique=!1));continue}let t=e[n];if(!t)continue;if(r.kind===`field_added`){r.after.required&&(t.required=!1);continue}if(r.kind===`field_type_modified`){defineRecordEntry(e,n,convertFieldConfigToProto(r.before));continue}let{before:i,after:a}=r;!i.required&&a.required&&(t.required=!1),!(i.unique??!1)&&(a.unique??!1)&&(t.unique=!1);let o=i.allowedValues??[],s=a.allowedValues??[],c=new Set(s.map(e=>e.value));if(o.filter(e=>!c.has(e.value)).length>0){let e=new Map;for(let t of o)e.set(t.value,t.description??``);for(let t of s)e.has(t.value)||e.set(t.value,t.description??``);t.allowedValues=Array.from(e.entries()).map(([e,t])=>({value:e,description:t}))}}}function buildPreMigrationIndexChangesMap(e){let t=new Map;for(let n of e)for(let e of n.diff.changes){if(e.kind!==`index_added`&&e.kind!==`index_modified`)continue;let n=e.kind===`index_modified`?e.before:void 0;if(!isBreakingIndexChange(e.tableName,e.indexName,n,e.after))continue;let r=t.get(e.tableName)??new Map;r.set(e.indexName,e),t.set(e.tableName,r)}return t}function applyPreMigrationIndexAdjustments(e,t){for(let[n,r]of t){if(r.kind===`index_added`){delete e[n];continue}r.kind===`index_modified`&&defineRecordEntry(e,n,convertIndexToProto(r.before))}}async function captureMigrationRestrictionState(e,t,n){let r=new Map;for(let i of n){let n=await P(async(n,r)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:i,pageToken:n,pageSize:r});return[a,o]}),a=new Map;for(let e of n){let t=e.schema?.settings;e.name&&a.set(e.name,{bulkUpsert:t?.bulkUpsert??!1,publishRecordEvents:t?.publishRecordEvents??!1,...t?.disableGqlOperations&&{disableGqlOperations:{create:t.disableGqlOperations.create,update:t.disableGqlOperations.update,delete:t.disableGqlOperations.delete,read:t.disableGqlOperations.read}},tailordbType:structuredClone(e)})}r.set(i,a)}return r}function getAffectedTableNames(e){let t=new Set;for(let n of e.diff.changes)t.add(n.tableName);return t}function getDeletedTableNames(e){let t=new Set;for(let n of e.diff.changes)n.kind===`table_removed`?t.add(n.tableName):n.kind===`table_renamed`&&t.add(n.previousTableName);return t}const xo={created:new Set,updated:new Set,gqlPermissionsProcessed:new Set,reset(){this.created.clear(),this.updated.clear(),this.gqlPermissionsProcessed.clear()}},So={cache:new Map,reset(){this.cache.clear()},load(e){let t=`${e.namespace}/${e.number}`,n=this.cache.get(t);if(!n){let r=reconstructSnapshotFromMigrations(e.migrationsDir,e.number);if(!r)throw Error(`Cannot reconstruct snapshot for ${e.namespace} migration ${e.number}: no migrations found in ${e.migrationsDir}`);n=r,this.cache.set(t,n)}return n}};function buildSnapshotTypeManifest(e,t,n,r){let i=So.load(e).tables[t];if(!i)return;let a=n.find(t=>t.namespace===e.namespace),o=e.diff.changes.find(e=>e.kind===`table_scripts_modified`&&e.tableName===t);return generateTailorDBTypeManifestFromSnapshot(r?createPreMigrationSnapshotType(i,r,o):i,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:a?.config.gqlOperations})}async function awaitAllSettledOrThrow(e){let t=(await Promise.allSettled(e.filter(e=>e!==void 0))).find(e=>e.status===`rejected`);if(t)throw t.reason}async function executeSingleMigrationPrePhase(e,t,n,r,i){let a=buildPreMigrationChangesMap([n]),o=buildPreMigrationIndexChangesMap([n]),s=getAffectedTableNames(n),c=new Set(xo.created);for(let l of t.type.creates){let t=l.request.tailordbType?.name;if(!t||!s.has(t)||c.has(t))continue;let u=a.get(t),d=buildSnapshotTypeManifest(n,t,r,u);if(!d)continue;let f=structuredClone(l.request);f.tailordbType=d,u&&u.size>0&&f.tailordbType.schema?.fields&&applyPreMigrationFieldAdjustments(f.tailordbType.schema.fields,u);let p=o.get(t);p&&p.size>0&&f.tailordbType.schema?.indexes&&applyPreMigrationIndexAdjustments(f.tailordbType.schema.indexes,p),xo.created.add(t),i.add(t),await e.createTailorDBType(f)}for(let l of t.type.creates){let t=l.request.tailordbType?.name;if(!t||!s.has(t)||!c.has(t))continue;let u=a.get(t),d=buildSnapshotTypeManifest(n,t,r,u);if(!d)continue;let f=structuredClone(d);u&&u.size>0&&f.schema?.fields&&applyPreMigrationFieldAdjustments(f.schema.fields,u);let p=o.get(t);p&&p.size>0&&f.schema?.indexes&&applyPreMigrationIndexAdjustments(f.schema.indexes,p),xo.updated.add(t),i.add(t),await e.updateTailorDBType({workspaceId:l.request.workspaceId,namespaceName:l.request.namespaceName,tailordbType:f})}for(let c of t.type.updates){let t=c.request.tailordbType?.name;if(!t||!s.has(t))continue;let l=a.get(t),u=buildSnapshotTypeManifest(n,t,r,l);if(!u)continue;let d=structuredClone(c.request);d.tailordbType=u,l&&l.size>0&&d.tailordbType.schema?.fields&&applyPreMigrationFieldAdjustments(d.tailordbType.schema.fields,l);let f=o.get(t);f&&f.size>0&&d.tailordbType.schema?.indexes&&applyPreMigrationIndexAdjustments(d.tailordbType.schema.indexes,f),xo.updated.add(t),i.add(t),await e.updateTailorDBType(d)}let l=new Set(Object.keys(So.load(n).tables)),permissionKey=e=>`${n.namespace}/${e}`,u=t.gqlPermission.creates.filter(e=>e.request.namespaceName===n.namespace&&l.has(e.name)&&!xo.gqlPermissionsProcessed.has(permissionKey(e.name))),d=t.gqlPermission.updates.filter(e=>e.request.namespaceName===n.namespace&&l.has(e.name)&&!xo.gqlPermissionsProcessed.has(permissionKey(e.name)));if(u.length+d.length>0){let a=new Set(u.map(e=>e.name)),o=t.type.creates.filter(e=>{let t=e.request.tailordbType?.name;return e.request.namespaceName===n.namespace&&t&&a.has(t)&&!xo.created.has(t)});if(o.length>0)for(let t of o){let a=t.request.tailordbType?.name;if(!a)continue;let o=buildSnapshotTypeManifest(n,a,r);if(!o)continue;xo.created.add(a),i.add(a);let s=structuredClone(t.request);s.tailordbType=o,await e.createTailorDBType(s)}await awaitAllSettledOrThrow([...u.map(t=>e.createTailorDBGQLPermission(t.request)),...d.map(t=>e.updateTailorDBGQLPermission(t.request))]);for(let e of[...u.map(e=>e.name),...d.map(e=>e.name)])xo.gqlPermissionsProcessed.add(permissionKey(e))}}const Co={types:new Set,gqlPermissions:new Set,reset(){this.types.clear(),this.gqlPermissions.clear()}};async function rollbackSingleMigrationAfterFailure(e,t,n,r,i){try{await rollbackSingleMigrationPrePhase(e,t,n,r,i)}catch(e){M.warn(`Failed to roll back migration ${t.namespace}/${formatMigrationNumber(t.number)}: ${e instanceof Error?e.message:String(e)}`)}}async function executeSingleMigrationPostPhase(e,t,n,r,i){let a=buildPreMigrationChangesMap([n]),o=buildPreMigrationIndexChangesMap([n]),s=new Set([...a.keys(),...o.keys()]),c=getAffectedTableNames(n);try{for(let a of t.type.creates){let t=a.request.tailordbType?.name;if(!t||!c.has(t)||!s.has(t))continue;let o=buildSnapshotTypeManifest(n,t,r);o&&(i.add(t),await e.updateTailorDBType({workspaceId:a.request.workspaceId,namespaceName:a.request.namespaceName,tailordbType:o}))}for(let a of t.type.updates){let t=a.request.tailordbType?.name;if(!t||!c.has(t)||!s.has(t))continue;let o=buildSnapshotTypeManifest(n,t,r);o&&(i.add(t),await e.updateTailorDBType({workspaceId:a.request.workspaceId,namespaceName:a.request.namespaceName,tailordbType:o}))}}catch(e){handleOptionalToRequiredError(e,[`This error occurred during post-migration phase. Please check your migration script.`,`Ensure all existing records have values for fields being changed to required.`])}}function acceptsMigrationWrites(e){let t=e.disableGqlOperations;return e.publishRecordEvents||e.bulkUpsert||t?.create!==!0||t.update!==!0||t.delete!==!0}async function rewriteRestrictedTables(e,t){let{workspaceId:n,namespaceName:r,snapshot:i,input:a,executorUsedTables:o,settingsState:s,restricted:c,continueOnError:l=!1}=t,u,d=new Set([...Object.keys(i.tables),...s?.keys()??[]]);for(let t of d)try{let l=i.tables[t],u=s?.get(t);if(s&&!u||c&&(!u||!acceptsMigrationWrites(u)))continue;let d=l?c?generateTailorDBTypeManifestFromSnapshot(l,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:a.config.gqlOperations}):generateTailorDBTypeManifestFromSnapshot(l,{subscribed:o.has(t),namespaceGqlOperations:a.config.gqlOperations}):u?.tailordbType?structuredClone(u.tailordbType):void 0;if(!d?.schema)continue;d.schema.settings??={};let f=d.schema.settings;c&&(f.bulkUpsert=!1,f.publishRecordEvents=!1,f.disableGqlOperations={create:!0,update:!0,delete:!0,read:!0}),!c&&u&&(f.bulkUpsert=u.bulkUpsert,f.publishRecordEvents=u.publishRecordEvents,f.disableGqlOperations=u.disableGqlOperations?{...u.disableGqlOperations}:void 0),await e.updateTailorDBType({workspaceId:n,namespaceName:r,tailordbType:d})}catch(e){if(!l)throw e;u??=e instanceof Error?e:Error(String(e),{cause:e})}if(u!==void 0)throw u}function resolveMigrationSnapshotSettings(e,t,n){let r=new Map;for(let[i,a]of Object.entries(e.tables)){let e=generateTailorDBTypeManifestFromSnapshot(a,{subscribed:!1,namespaceGqlOperations:t.config.gqlOperations}).schema?.settings;e&&r.set(i,{bulkUpsert:e.bulkUpsert??!1,publishRecordEvents:a.settings?.publishEvents??n.has(i),...e.disableGqlOperations&&{disableGqlOperations:{create:e.disableGqlOperations.create??!1,update:e.disableGqlOperations.update??!1,delete:e.disableGqlOperations.delete??!1,read:e.disableGqlOperations.read??!1}}})}return r}async function applyMigrationRestrictions(e,t,n,r,i,a){for(let[o,s]of t){let t=r.find(e=>e.namespace===o);t&&await rewriteRestrictedTables(e,{workspaceId:a,namespaceName:o,snapshot:s,input:t,executorUsedTables:i,settingsState:n.get(o)??new Map,restricted:!0})}}async function restoreMigrationRestrictions(e,t,n,r,i,a){let o;for(let[s,c]of t){let t=r.find(e=>e.namespace===s);if(t)try{await rewriteRestrictedTables(e,{workspaceId:a,namespaceName:s,snapshot:c,input:t,executorUsedTables:i,settingsState:n?.get(s),restricted:!1,continueOnError:!0})}catch(e){o??=e instanceof Error?e:Error(String(e),{cause:e})}}if(o!==void 0)throw o}async function executeSingleMigrationPostPhaseDeletions(e,t,n){let r=getDeletedTableNames(n);if(r.size>0){let n=t.gqlPermission.deletes.filter(e=>{let t=`${e.request.namespaceName}/${e.name}`;if(Co.gqlPermissions.has(t))return!1;let n=e.name;return r.has(n)});for(let t of n)await e.deleteTailorDBGQLPermission(t.request),Co.gqlPermissions.add(`${t.request.namespaceName}/${t.name}`);let i=t.type.deletes.filter(e=>{let t=e.name;return!t||Co.types.has(t)?!1:r.has(t)});for(let t of i)await e.deleteTailorDBType(t.request),Co.types.add(t.name)}}async function rollbackSingleMigrationPrePhase(e,t,n,r,i){if(t.number<=0||i.size===0)return;let a=reconstructSnapshotFromMigrations(t.migrationsDir,t.number-1);if(!a){M.warn(`Cannot roll back migration ${t.namespace}/${formatMigrationNumber(t.number)}: prior snapshot (migration ${formatMigrationNumber(t.number-1)}) could not be reconstructed. Leaving schema as-is; manual repair may be required.`);return}let o=r.find(e=>e.namespace===t.namespace);M.warn(`Migration ${t.namespace}/${formatMigrationNumber(t.number)} failed; rolling back its pre-migration schema changes.`);let s=[...i].flatMap(e=>{let t=a.tables[e];return t?[{tableName:e,priorTable:t}]:[]}),c=[...i].filter(e=>!a.tables[e]);for(let{tableName:r,priorTable:i}of s)try{let r=generateTailorDBTypeManifestFromSnapshot(i,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:o?.config.gqlOperations});await e.updateTailorDBType({workspaceId:n,namespaceName:t.namespace,tailordbType:r})}catch(e){M.warn(`Failed to roll back table '${r}' in namespace '${t.namespace}': ${e instanceof Error?e.message:String(e)}`)}for(let r of c)try{await e.deleteTailorDBGQLPermission({workspaceId:n,namespaceName:t.namespace,typeName:r}).catch(()=>void 0),await e.deleteTailorDBType({workspaceId:n,namespaceName:t.namespace,tailordbTypeName:r})}catch(e){M.warn(`Failed to roll back table '${r}' in namespace '${t.namespace}': ${e instanceof Error?e.message:String(e)}`)}}function toTailorDBDeployInput(e){let t={};for(let[n,r]of Object.entries(e.types))t[n]=createSnapshotType(r);return{namespace:e.namespace,config:e.config,types:t}}async function fetchRemoteTypes(e,t,n){return P(async(r,i)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]})}async function fetchRemoteGqlPermissions(e,t,n){return P(async(r,i)=>{let{permissions:a,nextPageToken:o}=await e.listTailorDBGQLPermissions({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]})}async function fetchRemoteSchemaSnapshot(e,t,n){let[r,i]=await Promise.all([fetchRemoteTypes(e,t,n),fetchRemoteGqlPermissions(e,t,n)]);return createSnapshotFromRemoteTypes(r,n,i)}function definedWhenNotEmpty(e){return Object.keys(e).length>0?e:void 0}function namespaceConfig(e,t,n){return t.find(e=>e.namespace===n)?.config??e.db?.[n]}function namespaceGqlOperations(e,t,n){return namespaceConfig(e,t,n)?.gqlOperations}const wo=[`create`,`update`,`delete`,`read`];function configuredDisabledGqlOperations(e){if(!e)return;if(e===`query`)return{create:!1,update:!1,delete:!1};let t={};for(let n of wo)e[n]===!1&&(t[n]=!1);return definedWhenNotEmpty(t)}function appliedConfiguredDisabledGqlOperations(e,t){if(!e||!t)return;let n={};for(let r of wo)t[r]===!1&&e[r]&&(n[r]=!1);return definedWhenNotEmpty(n)}function deployComparableSnapshot(e,t,n){let r=new Map(t.map(e=>[e.name,e])),i=configuredDisabledGqlOperations(n),a={};for(let[t,n]of Object.entries(e.tables)){let e={...n.settings},o=r.get(t)?.schema?.settings;if(n.settings?.publishEvents===void 0&&o?.publishRecordEvents&&(e.publishEvents=!0),n.settings?.gqlOperations===void 0){let t=appliedConfiguredDisabledGqlOperations(o?.disableGqlOperations,i);t&&(e.gqlOperations=t)}let s={...n},c=definedWhenNotEmpty(e);c?s.settings=c:delete s.settings,a[t]=s}return{...e,tables:a}}async function verifyRemoteSchema(e,t,n,r,i){let a=[];for(let{namespace:o,migrationsDir:s}of n){let n=await fetchRemoteMigrationState(e,resourceTrn(t,`tailordb`,o)),{metadataExists:c,number:l}=n;if(n.historyIdInvalid||l===null&&n.historyId!==null){a.push({namespace:o,remoteMigrationNumber:l??0,drifts:[],hasDrift:!1,checkpointMissingLocal:!0});continue}if(l===null){a.push({namespace:o,remoteMigrationNumber:0,drifts:[],hasDrift:!1,skipped:c?`no_migration_label`:`not_deployed`});continue}let u=getLatestMigrationNumber(s),d=reconstructSnapshotFromMigrations(s,0)?.rebaseline,f=d?n.historyId===d.historyId:n.historyId===null,p=d?n.historyId===d.replacedHistoryId:!1,m=d&&p&&l===d.replacedLatestMigration?{from:l,to:0,fromHistoryId:n.historyId,toHistoryId:d.historyId}:void 0;if(!f&&!m||l>u&&!m){a.push({namespace:o,remoteMigrationNumber:l,drifts:[],hasDrift:!1,checkpointMissingLocal:!0});continue}let h=reconstructSnapshotFromMigrations(s,m?.to??l);if(!h){a.push({namespace:o,remoteMigrationNumber:l,drifts:[],hasDrift:!1,skipped:`no_snapshot`});continue}let[g,_]=await Promise.all([fetchRemoteTypes(e,t,o),fetchRemoteGqlPermissions(e,t,o)]),v=compareRemoteWithSnapshot(g,deployComparableSnapshot(h,g,namespaceGqlOperations(r,i,o)),_);a.push({namespace:o,remoteMigrationNumber:l,drifts:v,hasDrift:v.length>0,...m&&v.length===0?{checkpointRepair:m}:{}})}return a}function isMissingRemoteScriptHashDrift(e){return e.kind===`script_mismatch`&&e.details.endsWith(`has no script hash on remote`)}function isLikelyPreV2ScriptHashDrift(e){let t=e.filter(e=>e.hasDrift);return t.length>0&&t.every(e=>e.drifts.length>0&&e.drifts.every(isMissingRemoteScriptHashDrift))}function logRemoteDriftGuidance(e){M.info(`This may indicate:`),M.info(` - Another developer applied different migrations`,{mode:`plain`}),M.info(` - Manual schema changes were made directly`,{mode:`plain`}),M.info(` - Migration history is out of sync`,{mode:`plain`}),M.newline(),M.info(`To resolve:`),M.info(` - Run 'tailor tailordb migration status' to compare local vs remote.`,{mode:`plain`}),M.info(` - If remote is correct, update local tables and run 'migration generate'.`,{mode:`plain`}),M.info(` - If local migration history is correct, run 'migration sync <N>' to overwrite remote.`,{mode:`plain`}),M.info(` - If only bookkeeping is stale, run 'migration set <N>'.`,{mode:`plain`}),e&&isLikelyPreV2ScriptHashDrift(e)&&(M.newline(),M.info(`Every listed drift is '${lo}'. Run 'migration sync <N>' above to add the missing hashes.`))}function formatRemoteVerificationResults(e){let t=[];for(let n of e)n.hasDrift&&(t.push(`Namespace: ${n.namespace}`),t.push(` Remote migration: ${formatMigrationNumber(n.remoteMigrationNumber)}`),t.push(` Differences:`),t.push(formatSchemaDrifts(n.drifts)),t.push(``));return t.join(`
63
63
  `)}async function checkMigrationDiffs(e,t){let n=[];for(let{namespace:r,migrationsDir:i}of t){let t=e.get(r);if(!t)continue;let a=reconstructSnapshotFromMigrations(i);if(!a){n.push({namespace:r,migrationsDir:i,hasDiff:!0,diff:void 0});continue}let o=compareLocalTypesWithSnapshot(a,t,r);n.push({namespace:r,migrationsDir:i,hasDiff:hasChanges(o),diff:hasChanges(o)?o:void 0})}return n}function formatMigrationCheckResults(e){let t=[];for(let n of e)n.hasDiff&&(t.push(`Namespace: ${n.namespace}`),n.diff?(t.push(` ${formatDiffSummary(n.diff)}`),t.push(``),t.push(formatMigrationDiff(n.diff))):t.push(` No migration snapshot found. Run 'tailor tailordb migration generate' first.`),t.push(``));return t.join(`
64
64
  `)}function migrationFileStatesEqual(e,t){let n=Object.keys(e).toSorted(),r=Object.keys(t).toSorted();return n.length===r.length&&n.every((n,i)=>n===r[i]&&e[n]===t[n])}async function validateAndDetectMigrations(e,t,n,r,i,a){let o=getNamespacesWithMigrations(r,B.dirname(r.path)),s=[],c=[],l=Object.create(null);if(o.length>0){for(let{namespace:e,migrationsDir:t}of o)assertValidMigrationFiles(t,e),l[e]=reconstructSnapshotFromMigrations(t)?.rebaseline?.historyId??null;if(!i){let i=await checkMigrationDiffs(n,o);if(i.some(e=>e.hasDiff))throw M.error(`Schema changes detected that are not in migration files:`),M.log(formatMigrationCheckResults(i)),M.newline(),M.info(`Run 'tailor tailordb migration generate' to create migration files.`),M.info(`Or use '--no-schema-check' to skip this check.`),Error(`Schema migration check failed`);let s=await verifyRemoteSchema(e,t,o,r,a);c=s.flatMap(e=>e.checkpointRepair?[{namespace:e.namespace,...e.checkpointRepair}]:[]);let l=s.filter(e=>e.checkpointMissingLocal);if(l.length>0){M.error(`Remote migration checkpoint is not in the local migration history:`);for(let e of l)M.log(` ${e.namespace}: ${formatMigrationNumber(e.remoteMigrationNumber)}`);throw M.newline(),M.info(`Pull the latest migration files, or run 'tailor tailordb migration status' to compare.`),Error(`Remote migration checkpoint verification failed`)}if(s.some(e=>e.hasDrift))throw M.error(`Remote schema drift detected:`),M.log(formatRemoteVerificationResults(s)),M.newline(),logRemoteDriftGuidance(s),M.newline(),M.info(`Use '--no-schema-check' to skip this check (not recommended).`),Error(`Remote schema verification failed`);for(let e of c)M.warn(`Remote migration checkpoint for ${e.namespace} will be reset to 0000 after confirmation (${formatMigrationNumber(e.from)} → 0000); the remote schema already matches the local baseline.`)}let u=new Map(c.map(e=>[e.namespace,e.to]));if(s=await detectPendingMigrations(e,t,o,r.path,u),s.length>0){M.newline();let e=s.filter(e=>e.hasScript),t=s.filter(e=>!e.hasScript);M.info(`${s.length} pending migration(s) will be applied:`),t.length>0&&M.info(` • ${t.length} schema change(s) (applied automatically with schema deployment)`,{mode:`plain`}),e.length>0&&M.info(` • ${e.length} data migration(s) (requires migration script execution)`,{mode:`plain`})}}return{pendingMigrations:s,checkpointRepairs:c,namespacesWithMigrations:o,migrationFileState:captureMigrationFileState(o),migrationHistoryIds:l}}async function reconcileMigrationLabels(e,t,n,r){for(let{namespace:i,migrationsDir:a}of n){if(getMigrationFiles(a).length===0)continue;let n=getLatestMigrationNumber(a),o=r[i]??null,s=await fetchRemoteMigrationState(e,resourceTrn(t,`tailordb`,i)).catch(()=>null),c=s?.number??null;s&&c===n&&s.historyId===o||(await updateMigrationLabel(e,t,i,n,o??void 0),s?M.info(`Migration label for namespace ${i} reconciled: ${describeMigrationCheckpoint(c)} → ${formatMigrationNumber(n)}.`):M.info(`Migration label for namespace ${i} reconciled to ${formatMigrationNumber(n)}.`))}}function buildMigrationContextForScripts(e,t,n){let r=t.application.authService;if(!r)throw Error(`Auth configuration is required to execute migration scripts.`);let i={};for(let e of n)e.namespace in i||(i[e.namespace]=t.config.db?.[e.namespace]);return{client:e,workspaceId:t.workspaceId,authNamespace:r.config.name,machineUsers:r.config.machineUsers?Object.keys(r.config.machineUsers):void 0,dbConfig:i,env:t.config.env??{},configDir:B.dirname(t.config.path),appName:t.application.name,appId:t.application.id}}async function validateTailorDBMigrationState(e,t){let{context:n}=t;if(n.migrationTestBaselines){let e=captureMigrationFileState(getNamespacesWithMigrations(n.config,B.dirname(n.config.path)));if(!migrationFileStatesEqual(n.migrationFileState,e))throw Error(`Migration files changed after deployment planning. Run the migration test again to create a fresh plan.`);return{pendingMigrations:[],checkpointRepairs:[],namespacesWithMigrations:[],migrationFileState:e,migrationHistoryIds:{}}}let r=new Map;for(let e of n.tailorDBInputs)r.set(e.namespace,e.types);let i=await validateAndDetectMigrations(e,n.workspaceId,r,n.config,n.noSchemaCheck,n.tailorDBInputs),a=n.checkpointRepairs;if(a.length!==i.checkpointRepairs.length||i.checkpointRepairs.some(e=>!a.some(t=>t.namespace===e.namespace&&t.from===e.from&&t.fromHistoryId===e.fromHistoryId&&t.toHistoryId===e.toHistoryId)))throw Error(`Remote migration checkpoint repair changed after deployment planning. Run the deployment again to review the updated repair.`);if(!migrationFileStatesEqual(n.migrationFileState,i.migrationFileState))throw Error(`Migration files changed after deployment planning. Run the deployment again to create a fresh plan.`);return i}async function preflightTailorDB(e,t){await validateTailorDBMigrationState(e,t)}function includeUndeletedTables(e,t,n){let r=[...getDeletedTableNames(n)].flatMap(e=>{let n=t?.tables[e];return n?[[e,n]]:[]});return{...e,tables:{...e.tables,...Object.fromEntries(r)}}}function describeMigrationCheckpoint(e){return e==null?`<unset>`:formatMigrationNumber(e)}async function applyTailorDB(e,t,n=`create-update`){let{changeSet:r,context:i}=t;if(n===`create-update`){let{pendingMigrations:n,checkpointRepairs:a,namespacesWithMigrations:o,migrationHistoryIds:s}=await validateTailorDBMigrationState(e,t);for(let t of a)await updateMigrationLabel(e,i.workspaceId,t.namespace,t.to,t.toHistoryId),M.info(`Migration checkpoint for namespace ${t.namespace} reset: ${formatMigrationNumber(t.from)} → 0000.`);if(n.length>0){xo.reset(),Co.reset(),So.reset();let t=new Set(n.map(e=>e.namespace)),a=await captureMigrationRestrictionState(e,i.workspaceId,t);await executeServicesCreation(e,r);let isOutsideMigrations=e=>e!==void 0&&!t.has(e),o=new Map,c=new Map,l=new Set;for(let e of n){let t=o.get(e.namespace);(!t||e.number<t.number)&&o.set(e.namespace,e);let n=c.get(e.namespace)??new Set;for(let t of getDeletedTableNames(e))n.add(t);c.set(e.namespace,n);for(let t of Object.keys(So.load(e).tables))l.add(`${e.namespace}/${t}`)}let u=new Map;for(let[e,t]of o){let n=reconstructSnapshotFromMigrations(t.migrationsDir,t.number-1);if(!n)throw Error(`Cannot reconstruct the schema state before migration ${formatMigrationNumber(t.number)} for namespace "${e}"`);u.set(e,n)}let d=new Set,f=new Set([...r.gqlPermission.creates,...r.gqlPermission.updates].filter(e=>{let n=e.request.namespaceName;return i.noSchemaCheck&&n!==void 0&&t.has(n)&&!l.has(`${n}/${e.name}`)}).map(e=>`${e.request.namespaceName}/${e.name}`));try{for(let t of r.type.creates){let n=t.request.namespaceName;if(isOutsideMigrations(n)){await e.createTailorDBType(t.request);continue}let r=t.request.tailordbType?.name;if(!n||!r)continue;let a=u.get(n)?.tables[r];if(!a){i.noSchemaCheck&&!l.has(`${n}/${r}`)&&d.add(`${n}/${r}`);continue}if(c.get(n)?.has(r))continue;let o=i.tailorDBInputs.find(e=>e.namespace===n);xo.created.add(r),await e.createTailorDBType({workspaceId:t.request.workspaceId,namespaceName:n,tailordbType:generateTailorDBTypeManifestFromSnapshot(a,{suppressRecordEvents:!0,suppressGqlOperations:!0,namespaceGqlOperations:o?.config.gqlOperations})})}for(let t of r.type.updates)isOutsideMigrations(t.request.namespaceName)&&await e.updateTailorDBType(t.request)}catch(e){handleOptionalToRequiredError(e,[`Run 'tailor tailordb migration generate' to create migration files.`,`Migration scripts allow you to handle existing data before applying the schema change.`])}await Promise.all([...r.gqlPermission.creates.filter(e=>isOutsideMigrations(e.request.namespaceName)).map(t=>e.createTailorDBGQLPermission(t.request)),...r.gqlPermission.updates.filter(e=>isOutsideMigrations(e.request.namespaceName)).map(t=>e.updateTailorDBGQLPermission(t.request))]);let p=n.filter(e=>e.hasScript),m=p.length>0?buildMigrationContextForScripts(e,i,p):void 0;p.length>0&&(M.info(`Executing ${p.length} data migration(s)...`),M.newline());let h=new Map(u),g=new Map(a),_=new Map([...o].map(([e,t])=>[e,{number:t.number>0?t.number-1:null,historyId:s[e]??null}])),v;try{await applyMigrationRestrictions(e,u,a,i.tailorDBInputs,i.executorUsedTables,i.workspaceId);for(let t of n){let n=new Set;try{await z(`apply.tailorDB.migration.prePhase`,()=>executeSingleMigrationPrePhase(e,r,t,i.tailorDBInputs,n)),t.hasScript&&m&&await z(`apply.tailorDB.migration.script`,()=>executeMigrations(m,[t]))}catch(r){throw await rollbackSingleMigrationAfterFailure(e,t,i.workspaceId,i.tailorDBInputs,n),r}try{await z(`apply.tailorDB.migration.postPhase`,()=>executeSingleMigrationPostPhase(e,r,t,i.tailorDBInputs,n))}catch(r){throw await rollbackSingleMigrationAfterFailure(e,t,i.workspaceId,i.tailorDBInputs,n),r}let a=h.get(t.namespace),o=g.get(t.namespace),c=So.load(t);h.set(t.namespace,c);let l=s[t.namespace]??null;try{await updateMigrationLabel(e,i.workspaceId,t.namespace,t.number,l??void 0)}catch(n){let r;try{r=await fetchRemoteMigrationState(e,resourceTrn(i.workspaceId,`tailordb`,t.namespace))}catch(e){throw M.warn(`Could not verify migration checkpoint ${t.namespace}/${formatMigrationNumber(t.number)} after its update failed: ${e instanceof Error?e.message:String(e)}. Leaving the post-migration schema unchanged to avoid rolling back a committed checkpoint.`),n}let o=r.number??void 0,s=r.historyIdInvalid||r.historyId!==l?`${describeMigrationCheckpoint(r.number)} in a different migration history`:o!==void 0&&o>t.number?formatMigrationNumber(o):void 0;if(s!==void 0)throw h.delete(t.namespace),Error(`Migration checkpoint ${t.namespace}/${formatMigrationNumber(t.number)} advanced concurrently to ${s}. Leaving the post-migration schema unchanged and aborting this deployment.`,{cause:n});if(o!==t.number)throw h.set(t.namespace,includeUndeletedTables(c,a,t)),M.warn(`Migration checkpoint ${t.namespace}/${formatMigrationNumber(t.number)} could not be confirmed after its update failed; remote remains at ${describeMigrationCheckpoint(o)}. Leaving the post-migration schema unchanged to avoid rolling back a concurrent deployment. Repair the checkpoint before retrying.`),n}_.set(t.namespace,{number:t.number,historyId:l});let u=i.tailorDBInputs.find(e=>e.namespace===t.namespace);if(u){let e=resolveMigrationSnapshotSettings(c,u,i.executorUsedTables);for(let[t,n]of o??[])a?.tables[t]||e.set(t,n);g.set(t.namespace,e)}try{await executeSingleMigrationPostPhaseDeletions(e,r,t)}catch(e){throw M.warn(`Migration checkpoint ${t.namespace}/${formatMigrationNumber(t.number)} was committed, but post-checkpoint cleanup failed. The leftover resources remain locked. Remove them manually before the next deployment; remote schema verification will fail closed until then.`),e}}p.length>0&&(M.newline(),M.success(`All data migrations completed successfully.`))}catch(e){v={error:e}}for(let[t,n]of _)try{let r=await fetchRemoteMigrationState(e,resourceTrn(i.workspaceId,`tailordb`,t));if(r.number===n.number&&!r.historyIdInvalid&&r.historyId===n.historyId)continue;h.delete(t);let a=Error(`Migration checkpoint ${t}/${describeMigrationCheckpoint(n.number)} advanced concurrently to ${describeMigrationCheckpoint(r.number)}. Skipping restoration for this namespace and aborting this deployment.`);v?M.warn(`${a.message} The original migration error is reported below.`):v={error:a}}catch(e){h.delete(t);let r=Error(`Could not verify ownership of migration checkpoint ${t}/${describeMigrationCheckpoint(n.number)} before restoring table settings: ${e instanceof Error?e.message:String(e)}. Skipping restoration for this namespace and aborting this deployment.`);v?M.warn(`${r.message} The original migration error is reported below.`):v={error:r}}try{await restoreMigrationRestrictions(e,h,g,i.tailorDBInputs,i.executorUsedTables,i.workspaceId)}catch(e){if(!v)throw e;M.warn(`Could not restore every TailorDB table after the migration failed: ${e instanceof Error?e.message:String(e)}. The original migration error is reported below.`)}if(v)throw v.error;for(let t of r.type.creates){let n=t.request.namespaceName,r=t.request.tailordbType?.name;!n||!r||d.has(`${n}/${r}`)&&await e.createTailorDBType(t.request)}await Promise.all([...r.gqlPermission.creates.filter(e=>f.has(`${e.request.namespaceName}/${e.name}`)).map(t=>e.createTailorDBGQLPermission(t.request)),...r.gqlPermission.updates.filter(e=>f.has(`${e.request.namespaceName}/${e.name}`)).map(t=>e.updateTailorDBGQLPermission(t.request))]);let y=r.gqlPermission.deletes.filter(e=>{let t=`${e.request.namespaceName}/${e.name}`;return!Co.gqlPermissions.has(t)});y.length>0&&await Promise.all(y.map(t=>e.deleteTailorDBGQLPermission(t.request))),await Promise.all(r.type.deletes.filter(e=>isOutsideMigrations(e.request.namespaceName)&&!Co.types.has(e.name)).map(t=>e.deleteTailorDBType(t.request))),await Promise.all([...r.type.creates,...r.type.updates,...r.type.unchanged].filter(e=>e.metaRequest&&!Co.types.has(e.name)).flatMap(t=>t.metaRequest?[writeMetadataLabels(e,t.metaRequest)]:[]))}else{await Promise.all([...r.service.creates.map(async t=>{await e.createTailorDBService(t.request),await writeMetadataLabels(e,t.metaRequest)}),...r.service.updates.map(t=>writeMetadataLabels(e,t.metaRequest))]);try{for(let t of r.type.creates)await e.createTailorDBType(t.request),await writeMetadataLabels(e,t.metaRequest);for(let t of r.type.updates)await e.updateTailorDBType(t.request),await writeMetadataLabels(e,t.metaRequest);await Promise.all(r.type.unchanged.flatMap(t=>t.metaRequest?[writeMetadataLabels(e,t.metaRequest)]:[]))}catch(e){handleOptionalToRequiredError(e,[`Run 'tailor tailordb migration generate' to create migration files.`,`Migration scripts allow you to handle existing data before applying the schema change.`])}await Promise.all([...r.gqlPermission.creates.map(t=>e.createTailorDBGQLPermission(t.request)),...r.gqlPermission.updates.map(t=>e.updateTailorDBGQLPermission(t.request))]),await Promise.all(r.gqlPermission.deletes.map(t=>e.deleteTailorDBGQLPermission(t.request))),await Promise.all(r.type.deletes.map(t=>e.deleteTailorDBType(t.request)))}o.length>0&&(i.noSchemaCheck||n.length===0)&&await reconcileMigrationLabels(e,i.workspaceId,o,s)}else n===`delete-resources`?(await Promise.all(r.gqlPermission.deletes.map(t=>e.deleteTailorDBGQLPermission(t.request))),await Promise.all(r.type.deletes.map(t=>e.deleteTailorDBType(t.request)))):await Promise.all(r.service.deletes.map(t=>e.deleteTailorDBService(t.request)))}async function executeServicesCreation(e,t){await Promise.all([...t.service.creates.map(async t=>{await e.createTailorDBService(t.request),await writeMetadataLabels(e,t.metaRequest)}),...t.service.updates.map(t=>writeMetadataLabels(e,t.metaRequest))])}function itemKey(e){return`${e.request?.namespaceName??``}/${e.name}`}function collectTailorDBDisplayEntries(e,t,n){let r=new Set(t.map(itemKey)),i=new Set(n.map(itemKey)),a=t.map(t=>({action:e,symbol:Ai[e],name:t.name,labels:i.has(itemKey(t))?[`table`,`gqlPermission`]:[`table`],namespace:t.request?.namespaceName})),o=n.filter(e=>!r.has(itemKey(e))).map(t=>({action:e,symbol:Ai[e],name:t.name,labels:[`gqlPermission`],namespace:t.request?.namespaceName}));return[...a,...o]}function formatTailorDBResourceChangeEntries(e,t){return[...collectTailorDBDisplayEntries(`create`,e.creates,t.creates),...collectTailorDBDisplayEntries(`delete`,e.deletes,t.deletes),...collectTailorDBDisplayEntries(`update`,e.updates,t.updates),...collectTailorDBDisplayEntries(`replace`,e.replaces,t.replaces)]}function normalizeComparableTailorDBService(e){return normalizeProtoConfig({namespace:e.namespace,defaultTimezone:e.defaultTimezone||`UTC`})}function areTailorDBServicesEqual(e,t){return areNormalizedEqual(normalizeComparableTailorDBService({namespace:e.namespace?.name,defaultTimezone:e.defaultTimezone}),normalizeComparableTailorDBService({namespace:t.namespace,defaultTimezone:`UTC`}))}function isPlainObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const To={disableGqlOperations:{create:!1,update:!1,delete:!1,read:!1},emptyExpression:``,numericStringPaths:new Set([`schema.fields.*.serial.start`,`schema.fields.*.serial.maxValue`,`schema.settings.defaultQueryLimitSize`,`schema.settings.maxBulkUpsertSize`])};function normalizeComparableTailorDBType(e){let t=normalizeProtoConfig(toComparableProtoJson(et,e));return normalizeTailorDBCompareValue({name:t?.name??``,schema:{description:t?.schema?.description??``,fields:t?.schema?.fields??{},relationships:t?.schema?.relationships??{},settings:t?.schema?.settings??{},indexes:t?.schema?.indexes??{},files:t?.schema?.files??{},permission:t?.schema?.permission??{},typeHook:t?.schema?.typeHook??{},typeValidate:t?.schema?.typeValidate??{}}},[])}function isPermissionPolicyArrayPath(e){return e.length===3&&e[0]===`schema`&&e[1]===`permission`&&(e[2]===`create`||e[2]===`read`||e[2]===`update`||e[2]===`delete`)}function normalizeTailorDBCompareValue(e,t){if(e==null)return e;if(typeof e==`boolean`)return t.at(-1)===`optionalOnCreate`&&e===!1?void 0:e;if(typeof e==`number`||typeof e==`bigint`||typeof e==`string`)return matchesNumericStringPath(t)&&isNumericLikeValue(e)?String(e):(t.at(-1)===`expr`||t.at(-1)===`description`)&&e===To.emptyExpression?void 0:e;if(Array.isArray(e)){let n=e.map((e,n)=>normalizeTailorDBCompareValue(e,[...t,n])).filter(e=>e!==void 0);return n.length===0&&t.at(-1)===`validate`?void 0:isPermissionPolicyArrayPath(t)?n.toSorted((e,t)=>JSON.stringify(e)<JSON.stringify(t)?-1:1):n}if(!isPlainObject(e))return e;let n=Object.entries(e).map(([e,n])=>[e,normalizeTailorDBCompareValue(n,[...t,e])]).filter(([,e])=>e!==void 0),r=Object.fromEntries(n);if((t.at(-1)!==`fields`||Object.keys(r).length!==0)&&!(t.at(-1)===`disableGqlOperations`&&(Object.keys(r).length===0||areNormalizedEqual(r,To.disableGqlOperations))))return r}function matchesNumericStringPath(e){let t=e.map(e=>String(e)).join(`.`);return[...To.numericStringPaths].some(e=>{let n=e.split(`.`),r=t.split(`.`);return n.length===r.length&&n.every((e,t)=>e===`*`||e===r[t])})}function isNumericLikeValue(e){return typeof e==`number`||typeof e==`bigint`||/^-?\d+$/.test(e)}function normalizeComparableGqlPermission(e){return{policies:(normalizeProtoConfig(e)?.policies??[]).map(e=>({...e,actions:(e.actions??[]).toSorted((e,t)=>e-t)}))}}async function planTailorDB(e){let{client:t,workspaceId:n,application:r,forRemoval:i,config:a,noSchemaCheck:o,forceApplyAll:s=!1}=e,c=[],l=e.migrationTestSnapshots??(e.migrationTestBaselines?new Map([...e.migrationTestBaselines].map(([e,t])=>[e,t.snapshot])):void 0);if(!i)for(let e of r.tailorDBServices){await e.loadTypes();let t=toTailorDBDeployInput(e),n=l?.get(e.namespace);c.push(n?{...t,types:n.tables}:t)}let u=i?[]:Object.values(await r.executorService?.loadExecutors()??{}),d=new Set(e.executorUsedTailorDBTables??[]);for(let e of u)subscribesToEvents(e)&&e.trigger.kind===`tailordb`&&d.add(e.trigger.tableName);let f=new Map;for(let e of c)f.set(e.namespace,e.types);let p=e.migrationTestBaselines;if(l){for(let e of l.keys())if(!c.some(t=>t.namespace===e))throw Error(`Migration test snapshot targets unknown TailorDB namespace "${e}".`);let e=new Map;for(let t of c)for(let n of Object.keys(t.types)){let r=e.get(n);if(r)throw Error(`Migration test snapshot has duplicate TailorDB table name "${n}" in namespaces "${r}" and "${t.namespace}".`);e.set(n,t.namespace)}}let m=getNamespacesWithMigrations(a,B.dirname(a.path)),{namespacesWithMigrations:h,migrationFileState:g,checkpointRepairs:_}=i?{namespacesWithMigrations:[],migrationFileState:{},checkpointRepairs:[]}:p?{namespacesWithMigrations:m,migrationFileState:captureMigrationFileState(m),checkpointRepairs:[]}:await validateAndDetectMigrations(t,n,f,a,o??!1,c),{changeSet:v,conflicts:y,unmanaged:b,resourceOwners:x}=await planServices(t,n,r.name,r.id,c),S=v.deletes.map(e=>e.name),[C,w]=await Promise.all([planTypes(t,n,c,d,S,void 0,s,{appName:r.name,appId:r.id,dependentApps:e.dependentApps,runAppIds:e.runAppIds}),planGqlPermissions(t,n,c,S,s)]);return C.creates.sort(Vt),C.updates.sort(Vt),C.deletes.sort(Vt),{changeSet:{service:v,type:C,gqlPermission:w},conflicts:y,unmanaged:b,resourceOwners:x,context:{workspaceId:n,application:r,tailorDBInputs:c,executorUsedTables:d,config:a,noSchemaCheck:o??!1,...p?{migrationTestBaselines:p}:{},namespacesWithMigrations:h,migrationFileState:g,checkpointRepairs:_}}}async function planServices(e,t,n,r,i){let a=createChangeSet(`TailorDB services`),o=[],s=[],c=new Set,l=await fetchExistingResourcesWithLabels({client:e,fetchPage:async(n,r)=>{let{tailordbServices:i,nextPageToken:a}=await e.listTailorDBServices({workspaceId:t,pageToken:n,pageSize:r});return[i,a]},getName:e=>e.namespace?.name,getTrn:e=>resourceTrn(t,`tailordb`,e)});for(let e of i){let i=l[e.namespace],c=await buildMetaRequest({trn:resourceTrn(t,`tailordb`,e.namespace),appName:n,appId:r});i?(trackDesiredResourceOwnership({labels:i.allLabels,ownerLabel:i.label,appName:n,appId:r,resourceType:`TailorDB service`,resourceName:e.namespace,conflicts:o,unmanaged:s})&&hasMatchingSdkVersion(i.allLabels,c.labels)&&areTailorDBServicesEqual(i.resource,e)?a.unchanged.push({name:e.namespace}):a.updates.push({name:e.namespace,metaRequest:c}),delete l[e.namespace]):a.creates.push({name:e.namespace,request:{workspaceId:t,namespaceName:e.namespace,defaultTimezone:`UTC`},metaRequest:c})}return Object.entries(l).forEach(([e])=>{let i=l[e];trackRemainingResourceOwner({labels:i?.allLabels,ownerLabel:i?.label,appName:n,appId:r,resourceOwners:c})&&a.deletes.push({name:e,request:{workspaceId:t,namespaceName:e}})}),{changeSet:a,conflicts:o,unmanaged:s,resourceOwners:c}}async function planTypes(e,t,n,r,i,a,o=!1,s={}){let c=createChangeSet(`TailorDB tables`),{appName:l,appId:u,dependentApps:d,runAppIds:f}=s,typeMetaRequest=async(e,n,r)=>addDependencyRecords(await buildMetaRequest({trn:tailorDBTypeTrn(t,e,n),appName:l??``,appId:u}),{key:Q.tailorDBType(e,n),dependentApps:d,runAppIds:f,pinned:r!==void 0}),fetchTypes=n=>P(async(r,i)=>{let{tailordbTypes:a,nextPageToken:o}=await e.listTailorDBTypes({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]});for(let e of n){let t=a?.get(e.namespace)??e.types;for(let[e,n]of Object.entries(t))assertNoPublishEventsConflict({explicit:n.settings?.publishEvents,subscribed:r.has(e),conflict:Mi.tailorDBType(e)})}for(let e of n){let n=await fetchTypes(e.namespace),i=new Map(n.map(e=>[e.name,e])),s=a?.get(e.namespace)??e.types,typeMeta=t=>typeMetaRequest(e.namespace,t,s[t]?.settings?.publishEvents);for(let[n,a]of Object.entries(s)){let s=generateTailorDBTypeManifestFromSnapshot(a,{subscribed:r.has(n),namespaceGqlOperations:e.config.gqlOperations}),l=i.get(n);l?(!o&&areNormalizedEqual(normalizeComparableTailorDBType(l),normalizeComparableTailorDBType(s))?c.unchanged.push({name:n,metaRequest:await typeMeta(n)}):c.updates.push({name:n,request:{workspaceId:t,namespaceName:e.namespace,tailordbType:s},metaRequest:await typeMeta(n)}),i.delete(n)):c.creates.push({name:n,request:{workspaceId:t,namespaceName:e.namespace,tailordbType:s},metaRequest:await typeMeta(n)})}i.forEach((n,r)=>{c.deletes.push({name:r,request:{workspaceId:t,namespaceName:e.namespace,tailordbTypeName:r}})})}for(let e of i)(await fetchTypes(e)).forEach(n=>{c.deletes.push({name:n.name,request:{workspaceId:t,namespaceName:e,tailordbTypeName:n.name}})});return c}async function planGqlPermissions(e,t,n,r,i=!1){let a=createChangeSet(`TailorDB gqlPermissions`),fetchGqlPermissions=n=>P(async(r,i)=>{let{permissions:a,nextPageToken:o}=await e.listTailorDBGQLPermissions({workspaceId:t,namespaceName:n,pageToken:r,pageSize:i});return[a,o]});for(let e of n){let n=await fetchGqlPermissions(e.namespace),r=new Set;n.forEach(e=>{r.add(e.typeName)});let o=e.types;for(let[s,c]of Object.entries(o)){let o=c.permissions?.gql;if(!o)continue;let l=protoGqlPermission(o),u=n.find(e=>e.typeName===s);r.has(s)?(!i&&u&&areNormalizedEqual(normalizeComparableGqlPermission(u.permission),normalizeComparableGqlPermission(l))?a.unchanged.push({name:s}):a.updates.push({name:s,request:{workspaceId:t,namespaceName:e.namespace,typeName:s,permission:l}}),r.delete(s)):a.creates.push({name:s,request:{workspaceId:t,namespaceName:e.namespace,typeName:s,permission:l}})}r.forEach(n=>{a.deletes.push({name:n,request:{workspaceId:t,namespaceName:e.namespace,typeName:n}})})}for(let e of r)(await fetchGqlPermissions(e)).forEach(n=>{a.deletes.push({name:n.typeName,request:{workspaceId:t,namespaceName:e,typeName:n.typeName}})});return a}async function applyWorkflow(e,t,n=`create-update`){let{changeSet:r,appName:i,appId:a}=t;if(n===`create-update`){let n=await registerJobFunctions(e,r,i,a,t.unchangedWorkflowJobNames,t.jobFunctionPublishEvents);await Promise.all([...r.creates.map(async t=>{let r=filterJobFunctionVersions(n,t.usedJobNames),i=buildWorkflowValidationShape(t.workspaceId,t.workflow);await e.createWorkflow({workspaceId:i.workspaceId,workflowName:i.workflowName,mainJobFunctionName:i.mainJobFunctionName,retryPolicy:i.retryPolicy,concurrencyPolicy:i.concurrencyPolicy,jobFunctions:r,publishExecutionEvents:i.publishExecutionEvents}),await writeMetadataLabels(e,t.metaRequest)}),...r.updates.map(async t=>{let r=filterJobFunctionVersions(n,t.usedJobNames),i=buildWorkflowValidationShape(t.workspaceId,t.workflow);await e.updateWorkflow({workspaceId:i.workspaceId,workflowName:i.workflowName,mainJobFunctionName:i.mainJobFunctionName,retryPolicy:i.retryPolicy,concurrencyPolicy:i.concurrencyPolicy,jobFunctions:r,publishExecutionEvents:i.publishExecutionEvents}),await writeMetadataLabels(e,t.metaRequest)}),...r.unchanged.flatMap(t=>t.metaRequest?[writeMetadataLabels(e,t.metaRequest)]:[])])}else await deleteAllSettled(r.deletes.map(t=>({resourceType:`workflow`,resourceName:t.name,run:()=>e.deleteWorkflow({workspaceId:t.workspaceId,workflowId:t.workflowId})}))),await deleteAllSettled(t.jobFunctionDeletes.map(t=>({resourceType:`workflow job function`,resourceName:t.jobFunctionName,run:()=>e.deleteWorkflowJobFunction({workspaceId:t.workspaceId,jobFunctionName:t.jobFunctionName})})))}async function deleteAllSettled(e){let t=await Promise.allSettled(e.map(e=>e.run())),n=[];t.forEach((t,r)=>{if(t.status===`fulfilled`)return;let i=A(e[r],`operation missing at index`),a=t.reason;if(!(a instanceof q&&a.code===K.NotFound)){if(a instanceof q&&a.code===K.FailedPrecondition){M.warn(`Skipped deleting ${i.resourceType} "${i.resourceName}" because it is still referenced.`);return}n.push(hn(a))}});let r=n[0];if(r)throw r}function filterJobFunctionVersions(e,t){let n={};for(let r of t)e[r]!==void 0&&(n[r]=e[r]);return n}async function registerJobFunctions(e,t,n,r,i=new Set,a=new Map){let o={},s=t.creates[0]||t.updates[0]||t.deletes[0];if(!s)return o;let{workspaceId:c}=s,l=new Set;i.forEach(e=>l.add(e));for(let e of[...t.creates,...t.updates])for(let t of e.usedJobNames)l.add(t);let u=await At(async(t,n)=>{let r=await e.listWorkflowJobFunctions({workspaceId:c,pageToken:t,pageSize:n});return[r.jobFunctions.map(e=>e.name),r.nextPageToken]}),d=new Set(u);if(t.creates.length>0||t.updates.length>0){let t=await Promise.all(Array.from(l).map(async t=>{let i=d.has(t),o={workspaceId:c,jobFunctionName:t,scriptRef:workflowJobFunctionName(t),publishExecutionEvents:a.get(t)??!1},s=i?await e.updateWorkflowJobFunction(o):await e.createWorkflowJobFunction(o);return await writeMetadataLabels(e,await buildMetaRequest({trn:resourceTrn(c,`workflow_job_function`,t),appName:n,appId:r})),{jobName:t,version:s.jobFunction?.version}}));for(let{jobName:e,version:n}of t)n&&(o[e]=n)}return o}function parseDurationToProto(e){let t=parseDuration(e),n=Math.floor(t/1e3),r=t%1e3*1e6;return{seconds:BigInt(n),nanos:r}}function toRetryPolicy(e){return{maxRetries:e.maxRetries,initialBackoff:parseDurationToProto(e.initialBackoff),maxBackoff:parseDurationToProto(e.maxBackoff),backoffMultiplier:e.backoffMultiplier}}function toConcurrencyPolicy(e){return{maxConcurrentExecutions:e.maxConcurrentExecutions}}function buildWorkflowValidationShape(e,t){return{workspaceId:e,workflowName:t.name,mainJobFunctionName:t.mainJob.name,...t.retryPolicy&&{retryPolicy:toRetryPolicy(t.retryPolicy)},...t.concurrencyPolicy&&{concurrencyPolicy:toConcurrencyPolicy(t.concurrencyPolicy)},publishExecutionEvents:t.publishEvents??!1}}const Eo={workflowNames:new Set};function isSubscribed(e,t){return e.workflowNames.has(t)}function subscribedWorkflowJobNames(e){let{workflows:t,mainJobDeps:n,isSubscribed:r}=e,i=new Set;for(let e of t)if(r(e.name))for(let t of n[e.mainJob.name]??[])i.add(t);return i}function resolveJobPublishEvents(e){let{workflows:t,mainJobDeps:n,subscribers:r,explicit:i}=e,a=new Set;for(let e of Object.values(t))for(let t of n[e.mainJob.name]??[])a.add(t);let o=subscribedWorkflowJobNames({workflows:Object.values(t),mainJobDeps:n,isSubscribed:e=>isSubscribed(r,e)}),s=new Map;for(let e of a)s.set(e,resolvePublishEvents({explicit:i.get(e),subscribed:o.has(e),conflict:Mi.workflowJob(e)}));return s}function collectStaleJobFunctionNames(e,t){let n=new Set;for(let[r,i]of t){let t=e.get(r);t&&t.publishExecutionEvents!==i&&n.add(r)}return n}async function planWorkflow(e,t,n,r,i,a,o=new Set,s={}){let c=createChangeSet(`Workflows`),l=[],u=[],d=new Set,f=new Set,p=new Set,m=s.execution??Eo,{dependentApps:h,runAppIds:g}=s,everyJobDeclaresPublishEvents=e=>{let t=a[i[e]?.mainJob.name??``]??[],n=s.jobPublishEvents??new Map;return t.length>0&&t.every(e=>n.has(e))},_=await fetchExistingJobFunctions(e,t),v=resolveJobPublishEvents({workflows:i,mainJobDeps:a,subscribers:s.jobExecution??Eo,explicit:s.jobPublishEvents??new Map}),y=collectStaleJobFunctionNames(_,v),b=await fetchExistingResourcesWithLabels({client:e,fetchPage:async(n,r)=>{let i=await e.listWorkflows({workspaceId:t,pageToken:n,pageSize:r});return[i.workflows,i.nextPageToken]},getName:e=>e.name,getTrn:e=>resourceTrn(t,`workflow`,e)});for(let e of Object.values(i)){let i=b[e.name],s=addDependencyRecords(await buildMetaRequest({trn:resourceTrn(t,`workflow`,e.name),appName:n,appId:r}),{key:Q.workflow(e.name),dependentApps:h,runAppIds:g,pinned:e.publishEvents!==void 0});addDependencyRecords(s,{key:Q.workflowJobs(e.name),dependentApps:h,runAppIds:g,pinned:everyJobDeclaresPublishEvents(e.name),scope:`jobs`});let d=a[e.mainJob.name];if(!d)throw Error(`Job "${e.mainJob.name}" (mainJob of workflow "${e.name}") was not found.\n\nPossible causes:\n - The job is not exported as a named export\n - The file containing the job is not included in workflow.files glob pattern\n\nSolution:\n export const ${e.mainJob.name} = createWorkflowJob({ name: "${e.mainJob.name}", ... })`);d.forEach(e=>p.add(e));let _={...e,publishEvents:resolvePublishEvents({explicit:e.publishEvents,subscribed:isSubscribed(m,e.name),conflict:Mi.workflow(e.name)})};if(i){if(trackDesiredResourceOwnership({labels:i.allLabels,ownerLabel:i.label,appName:n,appId:r,resourceType:`Workflow`,resourceName:e.name,conflicts:l,unmanaged:u})&&hasMatchingSdkVersion(i.allLabels,s.labels)&&canTreatWorkflowAsUnchanged({existing:i.resource,workflow:_,usedJobNames:d,unchangedJobFunctions:o,staleJobFunctionNames:y})){c.unchanged.push({name:e.name,metaRequest:s});for(let e of d)f.add(e)}else c.updates.push({name:e.name,workspaceId:t,workflow:_,usedJobNames:d,metaRequest:s});delete b[e.name]}else c.creates.push({name:e.name,workspaceId:t,workflow:_,usedJobNames:d,metaRequest:s})}let x=[];Object.values(b).forEach(e=>{if(!e)return;let i=trackRemainingResourceOwner({labels:e.allLabels,ownerLabel:e.label,appName:n,appId:r,resourceOwners:d}),a=getExistingWorkflowJobNames(e.resource);i?x.push({name:e.resource.name,workspaceId:t,workflowId:e.resource.id,usedJobNames:a,deletableJobNames:[]}):a.forEach(e=>p.add(e))});let S=await planWorkflowJobFunctionDeletes({client:e,workspaceId:t,appName:n,appId:r,existingJobFunctionNames:[..._.keys()],retainedWorkflowJobNames:p,resourceOwners:d}),C=new Set(S.map(e=>e.jobFunctionName));for(let e of x)c.deletes.push({...e,deletableJobNames:e.usedJobNames.filter(e=>!p.has(e)&&C.has(e))});return{changeSet:c,conflicts:l,unmanaged:u,resourceOwners:d,appName:n,appId:r,unchangedWorkflowJobNames:f,jobFunctionDeletes:S,jobFunctionPublishEvents:v}}async function fetchExistingJobFunctions(e,t){let n=await At(async(n,r)=>{let i=await e.listWorkflowJobFunctions({workspaceId:t,pageToken:n,pageSize:r});return[i.jobFunctions,i.nextPageToken]});return new Map(n.map(e=>[e.name,e]))}async function planWorkflowJobFunctionDeletes(e){let{client:t,workspaceId:n,appName:r,appId:i,existingJobFunctionNames:a,retainedWorkflowJobNames:o,resourceOwners:s}=e,c=a.filter(e=>!o.has(e));return(await Promise.all(c.map(async e=>{let{metadata:a}=await t.getMetadata({trn:resourceTrn(n,`workflow_job_function`,e)});return trackRemainingResourceOwner({labels:a?.labels,ownerLabel:a?.labels[`sdk-name`],appName:r,appId:i,resourceOwners:s})?{workspaceId:n,jobFunctionName:e}:void 0}))).filter(e=>e!==void 0)}function formatWorkflowChangeEntries(e,t){return formatChangeEntriesWithFunctionRegistry(`workflow`,e,t,e=>`usedJobNames`in e?e.usedJobNames.map(e=>workflowJobFunctionName(e)):[])}function canTreatWorkflowAsUnchanged(e){let{existing:t,workflow:n,usedJobNames:r,unchangedJobFunctions:i,staleJobFunctionNames:a}=e;return!r.every(e=>i.has(e))||r.some(e=>a.has(e))?!1:areWorkflowsEqual(t,n,r)}function areWorkflowsEqual(e,t,n){return e.mainJobFunctionName===t.mainJob.name&&(e.publishExecutionEvents??!1)===(t.publishEvents??!1)&&areNormalizedEqual(normalizeComparableExistingWorkflowRetryPolicy(e.retryPolicy),normalizeComparableWorkflowRetryPolicy(t.retryPolicy))&&areNormalizedEqual(normalizeComparableConcurrencyPolicy(e.concurrencyPolicy),normalizeComparableConcurrencyPolicy(t.concurrencyPolicy))&&areNormalizedEqual(normalizeComparableWorkflowJobNames(e.jobFunctions),normalizeComparableWorkflowJobNames(n))}function normalizeComparableExistingWorkflowRetryPolicy(e){if(e)return normalizeRetryPolicyForCompare({maxRetries:e.maxRetries??0,backoffMultiplier:e.backoffMultiplier??0,initialBackoff:{seconds:e.initialBackoff?.seconds??0n,nanos:e.initialBackoff?.nanos??0},maxBackoff:{seconds:e.maxBackoff?.seconds??0n,nanos:e.maxBackoff?.nanos??0}})}function normalizeComparableWorkflowRetryPolicy(e){if(e)return normalizeRetryPolicyForCompare({maxRetries:e.maxRetries,backoffMultiplier:e.backoffMultiplier,initialBackoff:parseDurationToProto(e.initialBackoff),maxBackoff:parseDurationToProto(e.maxBackoff)})}function normalizeComparableConcurrencyPolicy(e){if(!(!e||!e.maxConcurrentExecutions))return{maxConcurrentExecutions:e.maxConcurrentExecutions}}function normalizeComparableWorkflowJobNames(e){return Array.isArray(e)?e.toSorted():Object.keys(e??{}).toSorted()}function getExistingWorkflowJobNames(e){let t=new Set(Object.keys(e.jobFunctions??{}));return e.mainJobFunctionName&&t.add(e.mainJobFunctionName),[...t].toSorted()}function normalizeRetryPolicyForCompare(e){return{maxRetries:e.maxRetries,backoffMultiplier:e.backoffMultiplier,initialBackoff:{seconds:String(e.initialBackoff.seconds),nanos:e.initialBackoff.nanos},maxBackoff:{seconds:String(e.maxBackoff.seconds),nanos:e.maxBackoff.nanos}}}function toConcurrencyPolicyInit(e){if(e)return{maxConcurrentExecutions:e.maxConcurrentExecutions}}function normalizeComparableConcurrency(e){if(!(!e||!e.maxConcurrentExecutions))return{maxConcurrentExecutions:e.maxConcurrentExecutions}}function declaredKey(e){if(e.matchType===`exact`)return e.key;let t=e.key;if(typeof t!=`string`)throw Error(`Invalid workflow execution policy "${e.name}": prefix policies must be created via defineWorkflowExecutionPolicy() or defineWorkflowExecutionPolicies(), not a hand-constructed object.`);return t}function toPlatformExecutionPolicyKey(e){let t=declaredKey(e);return e.matchType===`prefix`?`${t}*`:t}function validatePolicy(e){if(declaredKey(e).endsWith(`*`))throw Error(`Invalid workflow execution policy "${e.name}": key must not end with '*'; omit the '*' and set matchType: "prefix" for wildcard policies (the SDK appends '*' automatically).`);let t=Ht.safeParse({name:e.name,key:toPlatformExecutionPolicyKey(e),concurrencyPolicy:e.concurrencyPolicy});if(!t.success)throw Error(`Invalid workflow execution policy "${e.name}": ${t.error.issues.map(e=>e.message).join(`; `)}`)}async function planWorkflowJobFunctionExecutionPolicy(e,t,n,r,i){let a=createChangeSet(`Workflow execution policies`),o=[],s=[],c=new Set,l=Object.values(i);for(let e of l)validatePolicy(e);let u=await fetchExistingResourcesWithLabels({client:e,fetchPage:async(n,r)=>{let i=await e.listWorkflowJobFunctionExecutionPolicies({workspaceId:t,pageToken:n,pageSize:r});return[i.policies,i.nextPageToken]},getName:e=>e.name,getTrn:e=>resourceTrn(t,`workflow_job_function_execution_policy`,e)}),d=new Set;for(let e of l){if(d.has(e.name))throw Error(`Duplicate workflow execution policy name "${e.name}". Each policy must have a unique name within the workspace.`);d.add(e.name);let i=await buildMetaRequest({trn:resourceTrn(t,`workflow_job_function_execution_policy`,e.name),appName:n,appId:r}),c=u[e.name];if(c){let l=trackDesiredResourceOwnership({labels:c.allLabels,ownerLabel:c.label,appName:n,appId:r,resourceType:`Workflow execution policy`,resourceName:e.name,conflicts:o,unmanaged:s}),d=c.resource.executionPolicyKey,f=toPlatformExecutionPolicyKey(e),p=normalizeComparableConcurrency(c.resource.concurrencyPolicy),m=normalizeComparableConcurrency(e.concurrencyPolicy);l&&hasMatchingSdkVersion(c.allLabels,i.labels)&&d===f&&areNormalizedEqual(p,m)?a.unchanged.push({name:e.name}):d===f?a.updates.push({name:e.name,workspaceId:t,policy:e,metaRequest:i}):a.replaces.push({name:e.name,workspaceId:t,policy:e,metaRequest:i}),delete u[e.name]}else a.creates.push({name:e.name,workspaceId:t,policy:e,metaRequest:i})}for(let[e,i]of Object.entries(u))i&&trackRemainingResourceOwner({labels:i.allLabels,ownerLabel:i.label,appName:n,appId:r,resourceOwners:c})&&a.deletes.push({name:e,workspaceId:t});return{changeSet:a,conflicts:o,unmanaged:s,resourceOwners:c}}async function applyWorkflowJobFunctionExecutionPolicy(e,t,n=`create-update`){let{changeSet:r}=t;n===`create-update`?await Promise.all([...r.replaces.map(async t=>{await e.deleteWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.name}),await e.createWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.policy.name,executionPolicyKey:toPlatformExecutionPolicyKey(t.policy),concurrencyPolicy:toConcurrencyPolicyInit(t.policy.concurrencyPolicy)}),await writeMetadataLabels(e,t.metaRequest)}),...r.creates.map(async t=>{await e.createWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.policy.name,executionPolicyKey:toPlatformExecutionPolicyKey(t.policy),concurrencyPolicy:toConcurrencyPolicyInit(t.policy.concurrencyPolicy)}),await writeMetadataLabels(e,t.metaRequest)}),...r.updates.map(async t=>{await e.updateWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.policy.name,concurrencyPolicy:toConcurrencyPolicyInit(t.policy.concurrencyPolicy)}),await writeMetadataLabels(e,t.metaRequest)})]):await Promise.all(r.deletes.map(t=>e.deleteWorkflowJobFunctionExecutionPolicy({workspaceId:t.workspaceId,executionPolicyName:t.name})))}function deploymentPlanResults(e){let{application:t,...n}=e;return n}async function applyDeploymentPlans(e,t,n){let forEachDeployment=async e=>{for(let t of n)await e(t)},step=(e,t)=>z(e,()=>forEachDeployment(t));await z(`apply.preflight`,async()=>{await forEachDeployment(t=>preflightTailorDB(e,t.tailorDB))}),await withMetadataWriteBatch(e,async e=>{await z(`apply.createUpdateServices`,async()=>{await step(`apply.secretManager.createUpdate`,t=>applySecretManager(e,t.secretManager,`create-update`,t.application)),await step(`apply.functionRegistry.createUpdate`,n=>applyFunctionRegistry(e,t,n.functionRegistry,`create-update`)),await step(`apply.staticWebsite.createUpdate`,t=>applyStaticWebsite(e,t.staticWebsite,`create-update`)),await step(`apply.aiGateway.createUpdate`,t=>applyAIGateway(e,t.aiGateway,`create-update`)),await step(`apply.idp.createUpdate`,t=>applyIdP(e,t.idp,`create-update`)),await step(`apply.auth.createUpdatePrerequisites`,t=>applyAuth(e,t.auth,`create-update-prerequisites`)),await step(`apply.tailorDB.createUpdate`,t=>applyTailorDB(e,t.tailorDB,`create-update`)),await step(`apply.auth.createUpdateDependents`,t=>applyAuth(e,t.auth,`create-update-dependents`)),await step(`apply.pipeline.createUpdate`,t=>applyPipeline(e,t.pipeline,`create-update`))}),await z(`apply.deleteSubgraphResources`,async()=>{await forEachDeployment(t=>applyPipeline(e,t.pipeline,`delete-resources`)),await forEachDeployment(t=>applyAuth(e,t.auth,`delete-resources`)),await forEachDeployment(t=>applyIdP(e,t.idp,`delete-resources`))}),await z(`apply.createUpdateApplication`,async()=>{await forEachDeployment(t=>applyApplication(e,t.app,`create-update`))}),await z(`apply.createUpdateDependentServices`,async()=>{await step(`apply.executor.createUpdate`,t=>applyExecutor(e,t.executor,`create-update`)),await step(`apply.workflowExecutionPolicy.createUpdate`,t=>applyWorkflowJobFunctionExecutionPolicy(e,t.workflowExecutionPolicy,`create-update`)),await step(`apply.workflow.createUpdate`,t=>applyWorkflow(e,t.workflow,`create-update`))})}),await z(`apply.deleteDependentServices`,async()=>{await forEachDeployment(t=>applyWorkflow(e,t.workflow,`delete`)),await forEachDeployment(t=>applyWorkflowJobFunctionExecutionPolicy(e,t.workflowExecutionPolicy,`delete`)),await forEachDeployment(t=>applyExecutor(e,t.executor,`delete`)),await forEachDeployment(t=>applyStaticWebsite(e,t.staticWebsite,`delete`)),await forEachDeployment(t=>applyAIGateway(e,t.aiGateway,`delete`)),await forEachDeployment(t=>applySecretManager(e,t.secretManager,`delete`,t.application))}),await z(`apply.deleteApplication`,async()=>{await forEachDeployment(t=>applyApplication(e,t.app,`delete`))}),await z(`apply.deleteSubgraphServices`,async()=>{await forEachDeployment(t=>applyPipeline(e,t.pipeline,`delete-services`)),await forEachDeployment(t=>applyAuth(e,t.auth,`delete-services`)),await forEachDeployment(t=>applyIdP(e,t.idp,`delete-services`)),await forEachDeployment(t=>applyTailorDB(e,t.tailorDB,`delete-services`))}),await z(`apply.cleanup`,async()=>{await forEachDeployment(n=>applyFunctionRegistry(e,t,n.functionRegistry,`delete`))})}function setBundledScript(e,t,n,r){if(e.has(t))throw Error(`Duplicate ${r} bundle name "${t}" across config files.`);e.set(t,n)}function addBundledScripts(e,t,n){for(let[r,i]of t)setBundledScript(e,r,i,n)}function mergeBundledScripts(e){let t={resolvers:new Map,executors:new Map,workflowJobs:new Map,authHooks:new Map};for(let n of e)addBundledScripts(t.resolvers,n.bundledScripts.resolvers,`resolver`),addBundledScripts(t.executors,n.bundledScripts.executors,`executor`),addBundledScripts(t.workflowJobs,n.bundledScripts.workflowJobs,`workflow job`),addBundledScripts(t.authHooks,n.bundledScripts.authHooks,`auth hook`);return t}async function confirmMigrationCheckpointRepairs(e,t){if(e.length!==0){M.warn(`TailorDB migration checkpoints and history IDs need to be updated before this deployment:`);for(let t of e.toSorted((e,t)=>e.namespace.localeCompare(t.namespace)))M.log(` ${t.namespace}:`),M.log(` Checkpoint: ${formatMigrationNumber(t.from)} → ${formatMigrationNumber(t.to)}`),M.log(` Migration history ID: ${t.fromHistoryId??`<unset>`} → ${t.toHistoryId}`);if(M.log(` The checkpoint reset itself changes only metadata.`),M.log(` This deployment may still apply pending schema or data migrations afterward.`),!t&&!await Z.confirm({message:`Reset these migration checkpoints, align their history IDs, and continue with the deployment?`,default:!1}))throw Error(`Apply cancelled: migration checkpoint reset was not confirmed.`)}}async function confirmOwnerConflict(e,t,n,r){if(e.length===0)return;let i=e.filter(e=>e.currentOwner===t),a=e.filter(e=>e.currentOwner!==t);i.length>0&&await(r?confirmIdRegeneration(i,t,n):confirmMissingConfigId(i,t,n)),a.length>0&&await confirmNameMismatch(a,t,n)}async function confirmIdRegeneration(e,t,n){if(logIdMismatch(`Application id was regenerated for "${t}":`,e),n){M.success(`Re-tagging resources with the new id (--yes flag specified)...`,{mode:`plain`});return}if(!await Z.confirm({message:`Re-tag these resources with the new id for "${t}"?\n${N.dim(`(The id in tailor.config.ts was removed since the previous deploy, so a new one was generated)`)}`,default:!1}))throw Error(L`
65
65
  Apply cancelled. Resources remain tagged with the previous id.
@@ -126,8 +126,8 @@ export {};
126
126
  Add an 'id' to the object passed to defineConfig() — a config that re-exports it from
127
127
  another file cannot have one injected automatically. 'tailor deploy' can add it for you.`))}const Ao=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function findDefineConfigCalls(e,t){if(!e||typeof e!=`object`)return;let n=e;if(n.type===`CallExpression`){let e=n;if(e.callee.type===`Identifier`&&e.callee.name===`defineConfig`){let n=e.arguments[0],r=n&&n.type===`ObjectExpression`?n:null;t.push({callExpr:e,configObj:r})}}for(let e of Object.keys(n)){let r=n[e];if(Array.isArray(r))for(let e of r)findDefineConfigCalls(e,t);else r&&typeof r==`object`&&findDefineConfigCalls(r,t)}}function findIdProperty(e){for(let t of e.properties)if(t.type===`Property`&&(t.key.type===`Identifier`?t.key.name:t.key.type===`Literal`?t.key.value:null)===`id`)return t;return null}async function ensureConfigId(e){let t=await W.promises.readFile(e,`utf-8`),{program:n}=mr(e,t),r=[];if(findDefineConfigCalls(n,r),r.length===0)return null;if(r.length>1)throw Error(`Multiple defineConfig() calls found in ${e}. Only one is supported.`);let{configObj:i}=A(r[0],`defineConfig call site missing`);if(!i)throw Error(`defineConfig() argument must be an inline object literal in ${e} so the SDK can manage the 'id' field.`);let a=findIdProperty(i);if(a){let t=a.value;if(t.type!==`Literal`)throw Error(`'id' field in ${e} must be a string literal. To use this config for a separate app, delete it.`);let n=t.value;if(typeof n!=`string`||n===``)throw Error(`'id' field in ${e} must be a non-empty string literal. To use this config for a separate app, delete it.`);if(!Ao.test(n))throw Error(`'id' field in ${e} must be a UUID. To use this config for a separate app, delete it.`);return{id:n,injected:!1}}let o=crypto.randomUUID(),s=insertIdProperty(t,i,o);return await W.promises.writeFile(e,s,`utf-8`),M.info(`Generated app id and wrote to ${e}: ${o}`),{id:o,injected:!0}}async function readConfigId(e){let t=await W.promises.readFile(e,`utf-8`),{program:n}=mr(e,t),r=[];if(findDefineConfigCalls(n,r),r.length===0)return null;if(r.length>1)throw Error(`Multiple defineConfig() calls found in ${e}. Only one is supported.`);let{configObj:i}=A(r[0],`defineConfig call site missing`);if(!i)throw Error(`defineConfig() argument must be an inline object literal in ${e} so the SDK can manage the 'id' field.`);let a=findIdProperty(i);if(!a||a.value.type!==`Literal`)return{id:null};let o=a.value.value;return{id:typeof o==`string`&&o!==``?o:null}}async function assertConfigIdInCI(e){let t=await readConfigId(e);if(t!==null){if(!t.id)throw Error(`tailor.config.ts is missing an 'id'. CI does not auto-generate one (each run would be treated as a separate app and break resource ownership). Run 'tailor deploy' locally and commit the injected id.`);if(!Ao.test(t.id))throw Error(`'id' in ${e} must be a UUID. To use this config for a separate app, delete it.`)}}async function ensureConfigIdForDeploy(e){let{configPath:t,dryRun:n,buildOnly:r}=e;if(r)return;let i=ct(process.env.TAILOR_CI_ALLOW_ID_INJECTION)===!0,a=fr&&!i;if(n){a&&await assertConfigIdInCI(t);return}if(a){await assertConfigIdInCI(t);return}await ensureConfigId(t)}const jo=`// SDK-managed app id — do not edit, except when copying this config to a separate app.`;function insertIdProperty(e,t,n){let r=`id: ${JSON.stringify(n)}`;if(t.properties.length>0){let n=A(t.properties[0],`first property missing`),i=e.lastIndexOf(`
128
128
  `,n.start-1)+1,a=e.slice(i,n.start);if(!/^[\t ]*$/.test(a))return e.slice(0,n.start)+`${r}, `+e.slice(n.start);let o=`${jo}\n${a}${r},\n${a}`;return e.slice(0,n.start)+o+e.slice(n.start)}let i=t.start+1,a=e.lastIndexOf(`
129
- `,t.start)+1,o=e.slice(a).match(/^[\t ]*/)?.[0]??``,s=`${o} `,c=`\n${s}${jo}\n${s}${r},\n${o}`;return e.slice(0,i)+c+e.slice(i)}function parseDeployConfigPaths(e){let t=e??process.env.TAILOR_PLATFORM_SDK_CONFIG_PATH;if(t===void 0)return[void 0];let n=t.split(`,`).map(e=>e.trim());if(n.some(e=>e.length===0))throw Error(`--config must contain one or more non-empty config paths.`);return n}async function buildDeploymentTarget(e){let{configPath:t,loadedConfig:n,dryRun:r,buildOnly:i,noCache:a,packageVersion:o,cacheDir:s}=e,{config:c,plugins:l}=n??await loadDeployConfig({configPath:t,dryRun:r,buildOnly:i}),u=B.dirname(c.path),d=er(`pnpm-lock.yaml`,{cwd:u})??er(`package-lock.json`,{cwd:u})??er(`yarn.lock`,{cwd:u})??er(`bun.lock`,{cwd:u}),f=createCacheManager({enabled:!a,cacheDir:s,sdkVersion:o,lockfileHash:d?_t(d):void 0}),p;l.length>0&&(p=new PluginManager(l)),await z(`build.generateUserTypes`,()=>generateUserTypes({config:c,configPath:c.path}));let m,h,g,_;try{let e=await z(`build.loadApplication`,()=>Yt({config:c,pluginManager:p,bundleCache:f.bundleCache}));m=e.application,h=e.workflowBuildResult,g=e.httpAdapterBuildResult,_=e.bundledScripts}finally{f.finalize()}return{config:c,application:m,workflowBuildResult:h,httpAdapterBuildResult:g,bundledScripts:_}}async function loadDeployConfig(e){let{configPath:t,dryRun:n,buildOnly:r}=e;return z(`build.loadConfig`,async()=>{let e=loadConfigPath(t);if(e){let t=B.resolve(process.cwd(),e);W.existsSync(t)&&await ensureConfigIdForDeploy({configPath:t,dryRun:n,buildOnly:r})}let i=await loadConfig(t);return r||warnMissingAppId(i.config.id),i})}async function buildDeploymentTargets(e){let{configPaths:t,loadedConfigs:n,buildTarget:r=buildDeploymentTarget,...i}=e;return Promise.all(t.map((e,t)=>r({...i,configPath:e,loadedConfig:n?.[t]})))}function addPossiblyAmbiguousNamespace(e,t,n){if(e.has(t)){e.get(t)!==n&&e.set(t,void 0);return}e.set(t,n)}function collectVisibleResources(e){let{application:t,applications:n,visibleKeysOf:r,resourcesOf:i,createResult:a,addResource:o}=e,s=r(t),c=a();for(let e of n)for(let t of i(e))s.has(t.visibilityKey)&&o(c,t.resourceKey,t.visibilityKey);return c}function collectApplicationTailorDBNamespaces(e){return new Set([...e.tailorDBServices.map(e=>e.namespace),...e.externalTailorDBNamespaces])}function*tailorDBTypeResources(e){for(let t of e.tailorDBServices)for(let e of Object.keys(t.types))yield{visibilityKey:t.namespace,resourceKey:e}}function collectVisibleTailorDBTypeNamespaces(e,t){return collectVisibleResources({application:e,applications:t,visibleKeysOf:collectApplicationTailorDBNamespaces,resourcesOf:tailorDBTypeResources,createResult:()=>new Map,addResource:addPossiblyAmbiguousNamespace})}function collectApplicationResolverNamespaces(e){return new Set(e.subgraphs.filter(e=>e.Type===`pipeline`).map(e=>e.Name))}function*idpNameResources(e){for(let t of collectApplicationIdpNames(e))yield{visibilityKey:t,resourceKey:t}}function collectVisibleIdpNames(e,t){return collectVisibleResources({application:e,applications:t,visibleKeysOf:collectApplicationIdpNames,resourcesOf:idpNameResources,createResult:()=>new Set,addResource:(e,t)=>{e.add(t)}})}function*resolverResources(e){for(let t of e.resolverServices)for(let e of Object.values(t.resolvers))yield{visibilityKey:t.namespace,resourceKey:e.name}}function collectVisibleResolverNamespaces(e,t){return collectVisibleResources({application:e,applications:t,visibleKeysOf:collectApplicationResolverNamespaces,resourcesOf:resolverResources,createResult:()=>new Map,addResource:addPossiblyAmbiguousNamespace})}function subscribedIdpName(e,t){if(t.idp!=null)return t.idp;let n=collectApplicationIdpNames(e);if(n.size!==1)return;let[r]=n;return r}function missingOwnerMessage(e,t,n){let r=`Executor "${e}" subscribes to ${t.resource}, which no config in this deploy declares.`,i=t.externalHint(n);return i?`${r} This config declares ${i}, so add the config that owns it to --config.`:t.trigger.kind===`workflowExecution`||t.trigger.kind===`workflowJobExecution`?`${r} A workflow has no "external" declaration, unlike a TailorDB namespace or resolver, so nothing in this config points at the one that owns it. Check the name, or add the config that declares the workflow to --config.`:`${r} This config declares nothing external that could hold it, so check the name.`}function collectEventSubscriptions(e){let t=[],n=e.map(e=>e.application);for(let r of e){let i=r.application.executorService?.executors??{},a=collectSubscriberVisibility(r,n);for(let n of Object.values(i)){let i=eventSourceLookup(n,r,a);if(!i)continue;let o={subscriber:r,executorName:n.name,resource:i.resource,disabled:!subscribesToEvents(n),trigger:i.trigger};if(i.declaredBy(r)){t.push({...o,owner:r,pinned:i.pinned(r),key:i.keyIn(r)});continue}let s=e.filter(e=>e.config.path!==r.config.path&&i.declaredBy(e)),c=i.narrowOwners(s);if(c===`ambiguous`)continue;let[l]=c;if(!l)throw Error(missingOwnerMessage(n.name,i,r));t.push({...o,owner:l,pinned:i.pinned(l),key:i.keyIn(l)})}}return t}function subscribedResourceKeys(e,t){return new Set(publishingSubscriptions(ownedSubscriptions(e,t)).flatMap(e=>e.key??[]))}function ownedSubscriptions(e,t){return e.filter(e=>e.owner.config.path===t.config.path)}function publishingSubscriptions(e){return e.filter(e=>!e.disabled)}function subscribedTailorDBTables(e){return new Set(publishingSubscriptions(e).flatMap(e=>e.trigger.kind===`tailordb`?[e.trigger.tableName]:[]))}function subscribedResolvers(e){return new Set(publishingSubscriptions(e).flatMap(e=>e.trigger.kind===`resolverExecuted`?[e.trigger.resolverName]:[]))}function subscribedIdps(e){return new Set(publishingSubscriptions(e).flatMap(e=>e.trigger.kind===`idpUser`?[subscribedIdpName(e.subscriber.application,e.trigger)??[]].flat():[]))}function subscribedWorkflows(e){let t={workflowNames:new Set},n={workflowNames:new Set};for(let{trigger:r}of publishingSubscriptions(e))r.kind===`workflowExecution`?t.workflowNames.add(r.workflowName):r.kind===`workflowJobExecution`&&n.workflowNames.add(r.workflowName);return{execution:t,jobExecution:n}}function collectDependentApps(e){let t=new Map;for(let{subscriber:n,owner:r,pinned:i,key:a}of publishingSubscriptions(e)){if(n.config.path===r.config.path||i||a===void 0)continue;let e=n.application.id;if(e===void 0)continue;let o=t.get(a)??new Map;o.set(e,`publish-events`),t.set(a,o)}return t}function collectWorkflowJobPublishEvents(e){let t=new Map;for(let n of e.application.workflowService?.jobs??[])n.publishEvents!==void 0&&t.set(n.name,n.publishEvents);return t}function collectSubscriberVisibility(e,t){return{tailorDBTypes:collectVisibleTailorDBTypeNamespaces(e.application,t),resolvers:collectVisibleResolverNamespaces(e.application,t),idps:collectVisibleIdpNames(e.application,t)}}function externalTailorDBNamespaces(e){return e.application.externalTailorDBNamespaces}function externalSubgraphNames(e,t,n){return e.application.subgraphs.filter(e=>e.Type===t&&!n.has(e.Name)).map(e=>e.Name)}function externalResolverNamespaces(e){return externalSubgraphNames(e,`pipeline`,new Set(e.application.resolverServices.map(e=>e.namespace)))}function externalIdpNames(e){return externalSubgraphNames(e,`idp`,new Set(e.application.idpServices.map(e=>e.name)))}function describeExternal(e,t){if(t.length!==0)return`external ${t.length===1?e:`${e}s`} ${t.map(e=>`"${e}"`).join(`, `)}`}function declaresTailorDBType(e,t){return e.application.tailorDBServices.some(e=>e.types[t])||void 0}function declaresResolver(e,t){return e.application.resolverServices.some(e=>Object.values(e.resolvers).some(e=>e.name===t))||void 0}function declaresIdp(e,t){return e.application.idpServices.some(e=>e.name===t)||void 0}function declaresWorkflow(e,t){return Object.values(e.application.workflowService?.workflows??{}).some(e=>e.name===t)||void 0}function pinsTailorDBType(e,t){for(let n of e.application.tailorDBServices){let e=n.types[t];if(e)return e.settings.publishEvents!==void 0}return!1}function pinsResolverIn(e,t,n){return e.application.resolverServices.some(e=>e.namespace===t&&Object.values(e.resolvers).some(e=>e.name===n&&e.publishEvents!==void 0))}function pinsIdp(e,t){return e.application.idpServices.some(e=>e.name===t&&e.publishEvents!==void 0)}function pinsWorkflow(e,t){return Object.values(e.application.workflowService?.workflows??{}).some(e=>e.name===t&&e.publishEvents!==void 0)}function pinsEveryJobOfWorkflow(e,t){let n=Object.values(e.application.workflowService?.workflows??{}).find(e=>e.name===t);if(n===void 0)return!1;let r=e.workflowBuildResult?.mainJobDeps[n.mainJob.name]??[],i=collectWorkflowJobPublishEvents(e);return r.length>0&&r.every(e=>i.has(e))}function tailorDBTypeNamespaceIn(e,t){return e.application.tailorDBServices.find(e=>e.types[t])?.namespace}function narrowByVisibleNamespace(e){let{candidates:t,visible:n,resourceKey:r,declaresIn:i}=e;if(!n.has(r))return[];let a=n.get(r);return a===void 0?`ambiguous`:t.filter(e=>i(e,a))}function declaresTailorDBTypeIn(e,t,n){return e.application.tailorDBServices.some(e=>e.namespace===t&&!!e.types[n])}function declaresResolverIn(e,t,n){return e.application.resolverServices.some(e=>e.namespace===t&&Object.values(e.resolvers).some(e=>e.name===n))}function eventSourceLookup(e,t,n){let{trigger:r}=e;switch(r.kind){case`tailordb`:return{resource:Mi.tailorDBType(r.tableName).resource,trigger:r,declaredBy:e=>declaresTailorDBType(e,r.tableName),pinned:e=>pinsTailorDBType(e,r.tableName),keyIn:e=>{let t=tailorDBTypeNamespaceIn(e,r.tableName);return t&&Q.tailorDBType(t,r.tableName)},narrowOwners:e=>narrowByVisibleNamespace({candidates:e,visible:n.tailorDBTypes,resourceKey:r.tableName,declaresIn:(e,t)=>declaresTailorDBTypeIn(e,t,r.tableName)}),externalHint:e=>describeExternal(`TailorDB namespace`,externalTailorDBNamespaces(e))};case`resolverExecuted`:{let e=findResolverNamespace(t.application,r.resolverName)??n.resolvers.get(r.resolverName);return{resource:Mi.resolver(r.resolverName).resource,trigger:r,declaredBy:e=>declaresResolver(e,r.resolverName),pinned:t=>e!==void 0&&pinsResolverIn(t,e,r.resolverName),keyIn:()=>e&&Q.resolver(e,r.resolverName),narrowOwners:e=>narrowByVisibleNamespace({candidates:e,visible:n.resolvers,resourceKey:r.resolverName,declaresIn:(e,t)=>declaresResolverIn(e,t,r.resolverName)}),externalHint:e=>describeExternal(`resolver namespace`,externalResolverNamespaces(e))}}case`idpUser`:{let e=subscribedIdpName(t.application,r);return e===void 0?void 0:{resource:Mi.idpService(e).resource,trigger:r,declaredBy:t=>declaresIdp(t,e),pinned:t=>pinsIdp(t,e),keyIn:()=>Q.idp(e),narrowOwners:t=>n.idps.has(e)?t.filter(t=>declaresIdp(t,e)):[],externalHint:t=>describeExternal(`IdP`,externalIdpNames(t).filter(t=>t===e))}}case`workflowExecution`:case`workflowJobExecution`:return{resource:r.kind===`workflowExecution`?ji.workflow(r.workflowName):ji.workflowJobs(r.workflowName),trigger:r,declaredBy:e=>declaresWorkflow(e,r.workflowName),pinned:e=>r.kind===`workflowExecution`?pinsWorkflow(e,r.workflowName):pinsEveryJobOfWorkflow(e,r.workflowName),keyIn:()=>r.kind===`workflowExecution`?Q.workflow(r.workflowName):Q.workflowJobs(r.workflowName),narrowOwners:e=>e.filter(e=>declaresWorkflow(e,r.workflowName)),externalHint:()=>void 0};default:return}}function assertRecordableDependencies(e,t){for(let{subscriber:n,owner:r,executorName:i,resource:a,pinned:o}of publishingSubscriptions(e)){if(n.config.path===r.config.path||o||!t)continue;let e=n.application.id;if(e!==void 0&&dependedByAppLabelKey(e)!==void 0)continue;let s=e===void 0?`${n.config.path} resolves without an "id" — a config that re-exports defineConfig() from another file never gets one`:`${n.config.path} resolves to the id "${e}", which is not the lowercase UUID deploy writes`,c=e===void 0?`Call defineConfig() inline in ${n.config.path} so deploy can manage its "id".`:`Restore the generated value in ${n.config.path}'s "id".`;throw Error(`Executor "${i}" in ${n.config.path} subscribes to ${a} in ${r.config.path}, which would enable event publishing on it for this deploy only. ${s} — so deploy cannot record which config the dependency belongs to, and deploying ${r.config.path} alone later would turn publishing back off without asking.\n\n${c}`)}}function computeRenamedAppDeletions(e){let{conflicts:t,resourceOwners:n,protectedAppNames:r}=e;return[...new Set(t.map(e=>e.currentOwner))].filter(e=>!n.has(e)&&!r.has(e))}function assertUniqueGlobalResourceNames(e){for(let t of Mo){let n=new Set;for(let r of e)for(let e of t.namesOf(r)){if(n.has(e))throw Error(`Duplicate ${t.resourceLabel} name "${e}" across config files. ${t.resourceLabel} names must be unique across all configs in a single deploy.`);n.add(e)}}}function ownershipTrackedPlans(e){return Object.values(e)}function collectOwnerConflicts(e){return ownershipTrackedPlans(e).flatMap(e=>e.conflicts)}function collectUnmanagedResources(e){return ownershipTrackedPlans(e).flatMap(e=>e.unmanaged)}function collectResourceOwners(e){return new Set(ownershipTrackedPlans(e).flatMap(e=>[...e.resourceOwners]))}function collectImportantResourceDeletions(e){let t=[];for(let n of e.tailorDB.changeSet.type.deletes)t.push({resourceType:`TailorDB table`,resourceName:n.name});for(let n of e.staticWebsite.changeSet.deletes)t.push({resourceType:`StaticWebsite`,resourceName:n.name});for(let n of e.aiGateway.changeSet.deletes)t.push({resourceType:`AIGateway`,resourceName:n.name});for(let n of e.auth.changeSet.oauth2Client.deletes)t.push({resourceType:`OAuth2 client`,resourceName:n.name});for(let n of e.auth.changeSet.oauth2Client.replaces)t.push({resourceType:`OAuth2 client (client type change)`,resourceName:n.name});for(let n of e.auth.changeSet.connection.deletes)t.push({resourceType:`Auth connection`,resourceName:n.name});for(let n of e.secretManager.vaultChangeSet.deletes)t.push({resourceType:`Secret Manager vault`,resourceName:n.name});for(let n of e.secretManager.secretChangeSet.deletes)t.push({resourceType:`Secret Manager secret`,resourceName:n.name});return t}function readResourceField(e,t){let n=e;for(let e of[`request`,`deleteRequest`,`createRequest`]){let r=n[e];if(r&&typeof r==`object`&&t in r){let e=r[t];return e==null?void 0:String(e)}}let r=n[t];return r==null?void 0:String(r)}function managedResourceName(e,t){return e.getName?e.getName(t):t.name}function managedResourceKey(e,t){let n=e.namespaceFields?.map(e=>readResourceField(t,e)).find(e=>e!==void 0),r=managedResourceName(e,t);return n===void 0?`${e.resourceType}:${r}`:`${e.resourceType}:${n}:${r}`}function managedNamespaceOwnerKey(e,t){if(!e.namespaceOwnerResourceType)return;let n=e.namespaceFields?.map(e=>readResourceField(t,e)).find(e=>e!==void 0);return n===void 0?void 0:`${e.namespaceOwnerResourceType}:${n}`}function addManagedResourceClaims(e,t,n){e.add(managedResourceKey(t,n));let r=managedNamespaceOwnerKey(t,n);r&&e.add(r)}function isManagedResourceClaimed(e,t,n){if(e.has(managedResourceKey(t,n)))return!0;let r=managedNamespaceOwnerKey(t,n);return r?e.has(r):!1}function retainDeletesNotClaimed(e,t){let n=0;for(let r of e.changeSet.deletes){if(isManagedResourceClaimed(t,e,r)){M.debug(`Skipping delete of ${managedResourceKey(e,r)}: still managed by another config in this deploy.`);continue}e.changeSet.deletes[n]=r,n+=1}e.changeSet.deletes.length=n}function workflowJobFunctionItems(e){let t=new Set;for(let n of e){let e=n.usedJobNames;if(Array.isArray(e))for(let n of e)typeof n==`string`&&t.add(n)}return[...t].map(e=>({name:e}))}function workflowJobFunctionResourceGroup(e){return{changeSet:{creates:workflowJobFunctionItems(e.workflow.changeSet.creates),updates:workflowJobFunctionItems(e.workflow.changeSet.updates),replaces:workflowJobFunctionItems(e.workflow.changeSet.replaces),unchanged:[...e.workflow.unchangedWorkflowJobNames].map(e=>({name:e})),deletes:e.workflow.jobFunctionDeletes},resourceType:`workflow_job_function`,getName:e=>`jobFunctionName`in e?e.jobFunctionName:e.name}}const $=[`namespaceName`,`authNamespace`,`vaultName`,`staticWebsiteName`],Mo=[{resourceLabel:`Application`,resourceType:`application`,namesOf:e=>[e.application.name],changeSetOf:e=>e.app},{resourceLabel:`Executor`,resourceType:`executor`,namesOf:e=>Object.values(e.application.executorService?.executors??{}).map(e=>e.name),changeSetOf:e=>e.executor.changeSet},{resourceLabel:`Workflow job`,resourceType:`workflow_job_function`,namesOf:e=>e.bundledScripts.workflowJobs.keys(),changeSetOf:e=>workflowJobFunctionResourceGroup(e).changeSet,getName:e=>`jobFunctionName`in e?e.jobFunctionName:e.name},{resourceLabel:`Workflow`,resourceType:`workflow`,namesOf:e=>Object.values(e.application.workflowService?.workflows??{}).map(e=>e.name),changeSetOf:e=>e.workflow.changeSet},{resourceLabel:`Workflow execution policy`,resourceType:`workflow_job_function_execution_policy`,namesOf:e=>Object.values(e.config.workflow?.executionPolicies??{}).map(e=>e.name),changeSetOf:e=>e.workflowExecutionPolicy.changeSet},{resourceLabel:`Auth connection`,resourceType:`auth.connection`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`,namesOf:e=>Object.keys(e.application.authService?.connections??{}),changeSetOf:e=>e.auth.changeSet.connection},{resourceLabel:`StaticWebsite`,resourceType:`staticwebsite`,namesOf:e=>e.application.staticWebsiteServices.map(e=>e.name),changeSetOf:e=>e.staticWebsite.changeSet},{resourceLabel:`TailorDB namespace`,resourceType:`tailordb.service`,namesOf:e=>e.application.tailorDBServices.map(e=>e.namespace),changeSetOf:e=>e.tailorDB.changeSet.service},{resourceLabel:`Auth namespace`,resourceType:`auth.service`,namesOf:e=>{let t=e.application.authService?.config.name;return t===void 0?[]:[t]},changeSetOf:e=>e.auth.changeSet.service},{resourceLabel:`IdP namespace`,resourceType:`idp.service`,namesOf:e=>e.application.idpServices.map(e=>e.name),changeSetOf:e=>e.idp.changeSet.service},{resourceLabel:`Resolver namespace`,resourceType:`pipeline.service`,namesOf:e=>e.application.resolverServices.map(e=>e.namespace),changeSetOf:e=>e.pipeline.changeSet.service},{resourceLabel:`AIGateway`,resourceType:`aigateway`,namesOf:e=>e.application.aiGatewayServices.map(e=>e.name),changeSetOf:e=>e.aiGateway.changeSet},{resourceLabel:`Secret Manager vault`,resourceType:`secret.vault`,namesOf:e=>e.application.secrets.map(e=>e.vaultName),changeSetOf:e=>e.secretManager.vaultChangeSet}];function managedResourceGroupFromDefinition(e,t){let{changeSetOf:n,namesOf:r,resourceLabel:i,...a}=e;return{...a,changeSet:n(t)}}function managedResourceGroups(e){return[{changeSet:e.functionRegistry.changeSet,resourceType:`function_registry`},...Mo.map(t=>managedResourceGroupFromDefinition(t,e)),{changeSet:e.tailorDB.changeSet.type,resourceType:`tailordb.type`,namespaceFields:$,namespaceOwnerResourceType:`tailordb.service`},{changeSet:e.tailorDB.changeSet.gqlPermission,resourceType:`tailordb.gql_permission`,namespaceFields:$,namespaceOwnerResourceType:`tailordb.service`},{changeSet:e.staticWebsite.customDomainChangeSet,resourceType:`staticwebsite.custom_domain`,namespaceFields:$,namespaceOwnerResourceType:`staticwebsite`},{changeSet:e.idp.changeSet.client,resourceType:`idp.client`,namespaceFields:$,namespaceOwnerResourceType:`idp.service`},{changeSet:e.auth.changeSet.idpConfig,resourceType:`auth.idp_config`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.userProfileConfig,resourceType:`auth.user_profile_config`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.tenantConfig,resourceType:`auth.tenant_config`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.machineUser,resourceType:`auth.machine_user`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.oauth2Client,resourceType:`auth.oauth2_client`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.authHook,resourceType:`auth.hook`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.scim,resourceType:`auth.scim`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.scimResource,resourceType:`auth.scim_resource`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.pipeline.changeSet.resolver,resourceType:`pipeline.resolver`,namespaceFields:$,namespaceOwnerResourceType:`pipeline.service`},{changeSet:e.secretManager.secretChangeSet,resourceType:`secret.secret`,namespaceFields:$,namespaceOwnerResourceType:`secret.vault`}]}function dropCrossDeploymentManagedDeletes(e){let t=e.map(e=>managedResourceGroups(deploymentPlanResults(e))),n=t.map(e=>e.reduce((e,t)=>{for(let n of[...t.changeSet.creates,...t.changeSet.updates,...t.changeSet.replaces,...t.changeSet.unchanged])addManagedResourceClaims(e,t,n);return e},new Set));t.forEach((e,t)=>{let r=new Set;n.forEach((e,n)=>{if(n!==t)for(let t of e)r.add(t)});for(let t of e)retainDeletesNotClaimed(t,r)})}function collectDeploymentResourceOwners(e){let t=new Set;for(let n of e)for(let e of collectResourceOwners(deploymentPlanResults(n)))t.add(e);return t}function ownershipFilters(e){let t=new Map;for(let n of e)if(t.set(`${yi}\0${n.name}`,{[yi]:n.name}),n.id){let e=sdkAppIdLabelValue(n.id);t.set(`${xi}\0${e}`,{[xi]:e})}return[...t.values()]}async function createMetadataLookupClient(e){let{client:t,workspaceId:n,applications:r}=e,i=await Promise.all(ownershipFilters(r).map(e=>P(async(r,i)=>{let{results:a,nextPageToken:o}=await t.listMetadata({workspaceId:n,labels:e,pageToken:r,pageSize:i});return[a,o]}))),a=new Map;for(let e of i.flat())e.metadata&&a.set(e.trn,e.metadata);let o=new Map,getMetadata=(e,n)=>{let r=a.get(e.trn??``);if(r)return Promise.resolve(U(ne,{metadata:r}));let i=e.trn??``,s=o.get(i);return s||(s=t.getMetadata(e,n),o.set(i,s)),s};return new Proxy(t,{get(e,t,n){return t===`getMetadata`?getMetadata:Reflect.get(e,t,n)}})}function buildPlanReport(e){let t=formatExecutorChangeEntries(e.executor.changeSet,buildPlannedExecutorsByName(e.executor.changeSet),e.functionRegistry.executorFunctionChanges),n=formatResolverChangeEntries(e.pipeline.changeSet.resolver,e.functionRegistry.resolverFunctionChanges),r=formatWorkflowChangeEntries(e.workflow.changeSet,e.functionRegistry.workflowJobChanges),i=formatChangeSetEntries(e.workflowExecutionPolicy.changeSet,[`executionPolicy`]),a=formatAuthHookChangeEntries(e.auth.changeSet.authHook,e.functionRegistry.authHookFunctionChanges),o=formatTailorDBResourceChangeEntries(e.tailorDB.changeSet.type,e.tailorDB.changeSet.gqlPermission),s=e.tailorDB.context.checkpointRepairs.map(e=>({action:`update`,symbol:Ai.update,name:`migration checkpoint ${formatMigrationNumber(e.from)} → ${formatMigrationNumber(e.to)}`,labels:[`migrationCheckpoint`],namespace:e.namespace})),c=[...o,...s],l=[...n],namespaceOf=e=>{if(`request`in e&&e.request&&typeof e.request==`object`&&`namespaceName`in e.request)return e.request.namespaceName;if(`namespaceName`in e)return e.namespaceName},authNamespaceOf=e=>`request`in e&&e.request&&typeof e.request==`object`&&`authNamespace`in e.request?e.request.authNamespace:void 0,u=[...formatChangeSetEntries(e.idp.changeSet.client,[`client`],namespaceOf)],d=[...formatChangeSetEntries(e.auth.changeSet.idpConfig,[`idpConfig`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.userProfileConfig,[`userProfileConfig`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.tenantConfig,[`tenantConfig`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.machineUser,[`machineUser`],authNamespaceOf),...a,...formatChangeSetEntries(e.auth.changeSet.oauth2Client,[`oauth2Client`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.scim,[`scimConfig`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.scimResource,[`scimResource`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.connection,[`connection`],namespaceOf)],{otherChanges:f}=splitFunctionRegistryChanges(e.functionRegistry.changeSet),p=extractServiceActions(e.tailorDB.changeSet.service),m=extractServiceActions(e.pipeline.changeSet.service),h=extractServiceActions(e.idp.changeSet.service),g=extractServiceActions(e.auth.changeSet.service),_=[...c,...l,...t,...r,...i,...u,...d],v=summarizePlanResults(e,_,[...p,...m,...h,...g]),y=[...e.functionRegistry.unmanaged,...e.tailorDB.unmanaged,...e.staticWebsite.unmanaged,...e.aiGateway.unmanaged,...e.idp.unmanaged,...e.auth.unmanaged,...e.pipeline.unmanaged,...e.executor.unmanaged,...e.workflow.unmanaged,...e.secretManager.unmanaged],b=[...e.functionRegistry.conflicts,...e.tailorDB.conflicts,...e.staticWebsite.conflicts,...e.aiGateway.conflicts,...e.idp.conflicts,...e.auth.conflicts,...e.pipeline.conflicts,...e.executor.conflicts,...e.workflow.conflicts,...e.secretManager.conflicts],x=[..._,...p.map(({action:e,name:t})=>({action:e,name:t,labels:[`tailorDB`],namespace:void 0})),...m.map(({action:e,name:t})=>({action:e,name:t,labels:[`pipeline`],namespace:void 0})),...h.map(({action:e,name:t})=>({action:e,name:t,labels:[`idp`],namespace:void 0})),...g.map(({action:e,name:t})=>({action:e,name:t,labels:[`auth`],namespace:void 0})),...formatChangeSetEntries(f),...formatChangeSetEntries(e.staticWebsite.changeSet,[`staticWebsite`]),...formatChangeSetEntries(e.staticWebsite.customDomainChangeSet,[`customDomain`]),...formatChangeSetEntries(e.aiGateway.changeSet,[`aiGateway`]),...formatChangeSetEntries(e.app,[`application`]),...formatChangeSetEntries(e.secretManager.vaultChangeSet,[`vault`]),...formatChangeSetEntries(e.secretManager.secretChangeSet,[`secret`])].map(({action:e,name:t,labels:n,namespace:r})=>({action:e,name:t,labels:n,namespace:r})),S=[...y.map(({resourceType:e,resourceName:t})=>({type:`unmanaged`,resourceType:e,name:t})),...e.secretManager.skippedSecrets.map(e=>({type:`skippedSecret`,resourceType:`secret`,name:e}))],C=b.map(({resourceType:e,resourceName:t,currentOwner:n})=>({resourceType:e,name:t,currentOwner:n})),w=[...buildGroupedDisplayLines(e.functionRegistry.changeSet.title,formatChangeSetEntries(f)),...e.staticWebsite.changeSet.lines(),...e.staticWebsite.customDomainChangeSet.lines(),...e.aiGateway.changeSet.lines(),...e.app.lines(),...buildGroupedDisplayLines(`TailorDB`,c,p),...buildGroupedDisplayLines(`Resolver`,l,m),...buildGroupedDisplayLines(`Executor`,t),...buildGroupedDisplayLines(`Workflow`,r),...buildGroupedDisplayLines(`IdP`,u,h),...buildGroupedDisplayLines(`Auth`,d,g),...e.secretManager.vaultChangeSet.lines(),...e.secretManager.secretChangeSet.lines()];if(y.length>0){w.push(N.bold(`Unmanaged resources (not in config):`));for(let{resourceType:e,resourceName:t}of y)w.push(` ${N.warning(`⚠`)} ${N.bold(e)} "${t}"`)}if(e.secretManager.skippedSecrets.length>0){w.push(N.bold(`Secret Manager secrets (skipped - no value provided):`));for(let t of e.secretManager.skippedSecrets)w.push(` ${N.dim(`○`)} ${t}`)}if(b.length>0){w.push(N.bold(`Owner conflicts (will require confirmation on apply):`));for(let{resourceType:e,resourceName:t,currentOwner:n}of b)w.push(` ${N.warning(`!`)} ${N.bold(e)} "${t}" — owned by "${n}"`)}return w.push(formatPlanSummary(v)),{summary:v,json:{summary:v,changes:x,warnings:S,conflicts:C},lines:w}}function printPlanResults(e,t){let n=buildPlanReport(e);if(M.jsonMode&&t?.dryRun)return M.out(n.json),n.summary;let r=n.lines.join(`
130
- `);return t?.dryRun?M.out(r):M.log(r),n.summary}function summarizePlanResults(e,t,n){let r={create:0,update:0,delete:0,replace:0};for(let e of t)r[e.action]+=1;for(let e of n)r[e.action]+=1;let{otherChanges:i}=splitFunctionRegistryChanges(e.functionRegistry.changeSet),a=summarizeChangeSets([i,e.staticWebsite.changeSet,e.staticWebsite.customDomainChangeSet,e.aiGateway.changeSet,e.app,e.secretManager.vaultChangeSet,e.secretManager.secretChangeSet]);return r.create+=a.create,r.update+=a.update,r.delete+=a.delete,r.replace+=a.replace,r}function sumPlanSummaries(e){return e.reduce((e,t)=>({create:e.create+t.create,update:e.update+t.update,delete:e.delete+t.delete,replace:e.replace+t.replace}),{create:0,update:0,delete:0,replace:0})}function printDeploymentPlans(e,t){if(M.jsonMode&&t?.dryRun){let t=e.map(e=>buildPlanReport(deploymentPlanResults(e))),n=sumPlanSummaries(t.map(e=>e.summary));return M.out({summary:n,changes:t.flatMap(e=>e.json.changes),warnings:t.flatMap(e=>e.json.warnings),conflicts:t.flatMap(e=>e.json.conflicts)}),n}return sumPlanSummaries(e.map(e=>printPlanResults(deploymentPlanResults(e),t)))}const No=new Map;function validatorFor(e){let t=No.get(e.typeName);if(t)return t;let n=yr({registry:Rn(e,...vr(e))});return No.set(e.typeName,n),n}function validateItems(e){let{schema:t,kind:n,action:r,items:i,requestKey:a,violations:o}=e;if(i.length===0)return;let s=validatorFor(t);for(let e of i){let i=e[a],c=U(t,i),l=s.validate(t,c);if(l.kind===`invalid`)for(let t of l.violations)o.push({kind:n,name:e.name,action:r,fieldPath:t.field.length>0?_r(t.field):`(message)`,message:t.message});else l.kind===`error`&&M.warn(`Could not validate ${n} "${e.name}" (${r}): ${l.error.message}`)}}async function validatePlan(e){let{tailorDB:t,staticWebsite:n,aiGateway:r,idp:o,auth:c,pipeline:l,app:u,executor:f,workflow:p,workflowExecutionPolicy:m,secretManager:h}=e,g=[];function creates(e,t,n){validateItems({schema:e,kind:t,action:`create`,items:n,requestKey:`request`,violations:g})}function updates(e,t,n){validateItems({schema:e,kind:t,action:`update`,items:n,requestKey:`request`,violations:g})}function replaces(e,t,n){validateItems({schema:e,kind:t,action:`replace`,items:n,requestKey:`createRequest`,violations:g})}function inPlaceReplaces(e,t,n){validateItems({schema:e,kind:t,action:`replace`,items:n,requestKey:`updateRequest`,violations:g})}creates(Se,`TailorDB service`,t.changeSet.service.creates),creates(Te,`TailorDB table`,t.changeSet.type.creates),updates(He,`TailorDB table`,t.changeSet.type.updates),creates(a,`StaticWebsite`,n.changeSet.creates),updates(nt,`StaticWebsite`,n.changeSet.updates),creates(ie,`StaticWebsite custom domain`,n.customDomainChangeSet.creates),creates(me,`AIGateway`,r.changeSet.creates.map(e=>({name:e.name,request:{...e.request,cors:void 0}}))),updates(fe,`AIGateway`,r.changeSet.updates.map(e=>({name:e.name,request:{...e.request,cors:void 0}})));let substituteIdpReturnOrigins=e=>{let t=e.request,n=t.userAuthPolicy?.allowedReturnOrigins;if(!Array.isArray(n)||n.length===0)return e;let r=n.map(e=>typeof e==`string`&&/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]:url$/.test(e)?`https://placeholder.invalid`:e);return{...e,request:{...t,userAuthPolicy:{...t.userAuthPolicy,allowedReturnOrigins:r}}}};creates(i,`IdP service`,o.changeSet.service.creates.map(substituteIdpReturnOrigins)),updates(ce,`IdP service`,o.changeSet.service.updates.map(substituteIdpReturnOrigins));let _=[...o.changeSet.client.creates.map(e=>({clientName:e.request.client?.name??``,namespaceName:e.request.namespaceName??``,workspaceId:e.request.workspaceId??``})),...o.changeSet.client.updates.map(e=>({clientName:e.name,namespaceName:e.namespaceName,workspaceId:e.workspaceId}))];creates(S,`IdP client secret`,_.map(e=>({name:e.clientName,request:{workspaceId:e.workspaceId,secretmanagerVaultName:idpClientVaultName(e.namespaceName,e.clientName)}}))),creates(s,`IdP client secret`,_.map(e=>({name:e.clientName,request:{workspaceId:e.workspaceId,secretmanagerVaultName:idpClientVaultName(e.namespaceName,e.clientName),secretmanagerSecretName:idpClientSecretName(e.namespaceName,e.clientName)}}))),creates(Ie,`Auth service`,c.changeSet.service.creates),updates(ot,`Auth service`,c.changeSet.service.updates),creates(je,`Auth IDP config`,c.changeSet.idpConfig.creates),updates(Le,`Auth IDP config`,c.changeSet.idpConfig.updates),creates(Ce,`Auth user profile config`,c.changeSet.userProfileConfig.creates),updates(at,`Auth user profile config`,c.changeSet.userProfileConfig.updates),creates($e,`Auth tenant config`,c.changeSet.tenantConfig.creates),updates(be,`Auth tenant config`,c.changeSet.tenantConfig.updates),creates(ve,`Auth machine user`,c.changeSet.machineUser.creates),updates(ke,`Auth machine user`,c.changeSet.machineUser.updates),creates(qe,`Auth hook`,c.changeSet.authHook.creates),updates(Ue,`Auth hook`,c.changeSet.authHook.updates),creates(Ye,`Auth SCIM config`,c.changeSet.scim.creates),updates(ge,`Auth SCIM config`,c.changeSet.scim.updates),creates(xe,`Auth SCIM resource`,c.changeSet.scimResource.creates),updates(tt,`Auth SCIM resource`,c.changeSet.scimResource.updates),creates(Ve,`OAuth2 client`,c.changeSet.oauth2Client.creates),updates(Oe,`OAuth2 client`,c.changeSet.oauth2Client.updates),replaces(Ve,`OAuth2 client`,c.changeSet.oauth2Client.replaces),creates(v,`Pipeline service`,l.changeSet.service.creates),updates(w,`Pipeline service`,l.changeSet.service.updates),creates(Me,`Resolver`,l.changeSet.resolver.creates),updates(b,`Resolver`,l.changeSet.resolver.updates),creates(pe,`Executor`,f.changeSet.creates),updates(de,`Executor`,f.changeSet.updates),creates(_e,`Workflow`,p.changeSet.creates.map(e=>({name:e.name,request:buildWorkflowValidationShape(e.workspaceId,e.workflow)}))),updates(Je,`Workflow`,p.changeSet.updates.map(e=>({name:e.name,request:buildWorkflowValidationShape(e.workspaceId,e.workflow)})));let y=p.changeSet.creates[0]?.workspaceId??p.changeSet.updates[0]?.workspaceId??``;if(y){let e=new Set;for(let t of[...p.changeSet.creates,...p.changeSet.updates])for(let n of t.usedJobNames)e.add(n);for(let t of p.unchangedWorkflowJobNames)e.add(t);creates(Ae,`Workflow job function`,[...e].map(e=>({name:e,request:{workspaceId:y,jobFunctionName:e,scriptRef:e}})))}if(creates(Ge,`Workflow execution policy`,[...m.changeSet.creates,...m.changeSet.replaces].map(e=>({name:e.name,request:{workspaceId:e.workspaceId,executionPolicyName:e.policy.name,executionPolicyKey:toPlatformExecutionPolicyKey(e.policy),...e.policy.concurrencyPolicy&&{concurrencyPolicy:{maxConcurrentExecutions:e.policy.concurrencyPolicy.maxConcurrentExecutions}}}}))),updates(Be,`Workflow execution policy`,m.changeSet.updates.map(e=>({name:e.name,request:{workspaceId:e.workspaceId,executionPolicyName:e.policy.name,...e.policy.concurrencyPolicy&&{concurrencyPolicy:{maxConcurrentExecutions:e.policy.concurrencyPolicy.maxConcurrentExecutions}}}}))),creates(S,`Secret Manager vault`,h.vaultChangeSet.creates.map(e=>({name:e.name,request:vaultCreateRequest(e)}))),creates(s,`Secret Manager secret`,h.secretChangeSet.creates.map(e=>({name:e.name,request:secretCreateRequest(e)}))),updates(Pe,`Secret Manager secret`,h.secretChangeSet.updates.map(e=>({name:e.name,request:secretUpdateRequest(e)}))),creates(se,`Application`,u.creates.map(e=>({name:e.name,request:{...e.request,cors:void 0}}))),updates(d,`Application`,[...u.updates,...u.unchanged].map(e=>({name:e.name,request:{...e.request,cors:void 0}}))),creates(ze,`Auth connection`,c.changeSet.connection.creates),inPlaceReplaces(Ee,`Auth connection`,c.changeSet.connection.replaces),g.length===0)return;let x=new Set(g.map(e=>`${e.kind}:${e.name}`));M.error(`Pre-flight validation found ${g.length} violation(s) across ${x.size} resource(s):`);for(let e of g)M.log(` ${N.resourceType(e.kind)} ${N.resourceName(e.name)} (${e.action}) — ${N.bold(e.fieldPath)}: ${e.message}`);throw Error(`${g.length} validation error(s) found in ${x.size} resource(s)`)}function formatIssues(e){return e.map(e=>e.message).join(`; `)||`Invalid options`}function parseOptions(e,t){let n=e.safeParse(t);if(!n.success)throw Error(formatIssues(n.error.issues));return n.data}const Po=H.string().min(1,`Profile must not be empty`),Fo=H.string().min(3,`Name must be at least 3 characters`).max(63,`Name must be at most 63 characters`).regex(/^[a-z0-9-]+$/,`Name can only contain lowercase letters, numbers, and hyphens`).refine(e=>!e.startsWith(`-`)&&!e.endsWith(`-`),`Name cannot start or end with a hyphen`);function validateWorkspaceName(e){let t=Fo.safeParse(e);return t.success?!0:formatIssues(t.error.issues)}function formatTimestamp(e){if(!e)return null;let t=G(e);return Number.isNaN(t.getTime())?null:t}function formatTable(e,t){return lt(e,t)}function formatKeyValueTable(e){return formatTable(e,{singleLine:!0})}function humanizeRelativeTime(e){if(e===null)return`N/A`;let t=e instanceof Date?e:new Date(e);return Number.isNaN(t.getTime())?typeof e==`string`?e:`N/A`:Xn(t,{addSuffix:!0})}const workspaceInfo=(e,t)=>{let n={id:e.id,name:e.name,region:e.region,...e.organizationId?{organizationId:e.organizationId}:{},...e.folderId?{folderId:e.folderId}:{},createdAt:formatTimestamp(e.createTime),updatedAt:formatTimestamp(e.updateTime)};return t?{...n,folderName:t}:n},workspaceDetails=(e,t)=>({...workspaceInfo(e,t),deleteProtection:e.deleteProtection,organizationId:e.organizationId,folderId:e.folderId});async function resolveWorkspaceFolderName(e,t){if(!(!t.organizationId||!t.folderId))try{return(await e.getOrganizationFolder({organizationId:t.organizationId,folderId:t.folderId})).folder?.name||void 0}catch(e){if(e instanceof q&&(e.code===K.NotFound||e.code===K.PermissionDenied))return;M.warn(`Failed to resolve workspace folder name: ${e}`);return}}function createWorkspaceFolderNameResolver(e){let t=new Map;return n=>{if(!n.organizationId||!n.folderId)return Promise.resolve(void 0);let r=`${n.organizationId}/${n.folderId}`,i=t.get(r);if(i)return i;let a=resolveWorkspaceFolderName(e,n);return t.set(r,a),a}}async function workspaceInfoWithFolderName(e,t){let n=await resolveWorkspaceFolderName(e,t);return workspaceInfo(t,n)}async function workspaceDetailsWithFolderName(e,t){let n=await resolveWorkspaceFolderName(e,t);return workspaceDetails(t,n)}async function workspaceInfosWithFolderNames(e,t){let n=createWorkspaceFolderNameResolver(e),r=rr(5);return Promise.all(t.map(e=>r(async()=>workspaceInfo(e,await n(e)))))}function workspaceDisplayName(e){return e.folderName?`${e.folderName}/${e.name}`:e.name}function createWorkspaceNameTransformer(e,t){return(n,r)=>{let i=r,a=i[e],o=i[t];return typeof a==`string`&&typeof o==`string`?workspaceDisplayName({name:a,folderName:o}):String(n??``)}}const Io=createWorkspaceNameTransformer(`name`,`folderName`),Lo=H.object({name:Fo,region:H.string(),deleteProtection:H.boolean().optional(),organizationId:H.uuid().optional(),folderId:H.uuid().optional(),profile:Po.optional()}),validateRegion=async(e,t)=>{let n=await t.listAvailableWorkspaceRegions({});if(!n.regions.includes(e))throw Error(`Region must be one of: ${n.regions.join(`, `)}.`)};function profilePlatformSettings(e){let t=e?.oauth2ClientId||process.env.TAILOR_PLATFORM_OAUTH2_CLIENT_ID,n=e?.consoleUrl??process.env.TAILOR_PLATFORM_CONSOLE_URL;return{...ft(e)?{}:{platform_url:Mt(e)},...t?{oauth2_client_id:yt(e)}:{},...n?{console_url:$t(n)}:{}}}async function createWorkspace$1(e){let t=validateCreateWorkspaceOptions(e),n=await loadAccessToken({profile:t.profile}),r=await loadPlatformClientConfig({profile:t.profile}),i=await F(n,r);return await validateRegion(t.region,i),createValidatedWorkspaceWithClient(i,t)}async function createValidatedWorkspaceWithClient(e,t){let n=await e.createWorkspace({workspaceName:t.name,workspaceRegion:t.region,deleteProtection:t.deleteProtection??!1,organizationId:t.organizationId,folderId:t.folderId});return workspaceInfoWithFolderName(e,A(n.workspace,`createWorkspace response missing workspace`))}function validateCreateWorkspaceOptions(e){return parseOptions(Lo,e)}const Ro=X({name:`create`,description:`Create a new Tailor Platform workspace.`,args:H.strictObject({name:V(H.string(),{alias:`n`,description:`Workspace name`}),region:V(H.string(),{alias:`r`,description:`Workspace region (us-west, asia-northeast)`}),"delete-protection":V(H.boolean().default(!1),{alias:`d`,description:`Enable delete protection`}),"organization-id":V(H.string().optional(),{alias:`o`,description:`Organization ID to workspace associate with`,env:`TAILOR_PLATFORM_ORGANIZATION_ID`}),"folder-id":V(H.string().optional(),{alias:`f`,description:`Folder ID to workspace associate with`,env:`TAILOR_PLATFORM_FOLDER_ID`}),"profile-name":V(H.string().optional(),{alias:`p`,description:`Profile name to create`}),profile:V(Po.optional(),{description:`Workspace profile used for authentication and Platform selection`,env:`TAILOR_PLATFORM_PROFILE`}),"profile-user":V(H.string().optional(),{description:`User email address or machine user client ID for the profile (defaults to current user)`}),permission:V(H.enum([`write`,`read`]).default(`write`),{description:`Profile permission (requires --profile-name). 'read' blocks all write commands while the profile is active.`})}),run:async e=>{await assertWritable({profile:e.profile});let t=e[`profile-name`],n;if(t){let r=await readPlatformConfig();if(r.profiles[t])throw Error(`Profile "${t}" already exists.`);let i=e.profile,a=i?r.profiles[i]:void 0,o=a?platformConfigFromProfile(a):void 0,s=e[`profile-user`]||a?.user||r.current_user;if(!s)throw Error(`Current user not found. Please login or specify --profile-user to create a profile.`);let c=resolveConfigUser(r,s,o);if(!c)throw Error(`User "${s}" not found.\nPlease verify your user name and login using 'tailor login' command.`);n={name:t,user:c,platformSettings:profilePlatformSettings(o)}}let r=await createWorkspace$1({name:e.name,region:e.region,deleteProtection:e[`delete-protection`],organizationId:e[`organization-id`],folderId:e[`folder-id`],profile:e.profile}),i;if(n){let t=await readPlatformConfig(),a=n.platformSettings;t.profiles[n.name]={user:n.user,workspace_id:r.id,...e.permission===`read`?{readonly:!0}:{},...a},writePlatformConfig(t),i={name:n.name,user:n.user,workspaceId:r.id,permission:e.permission,...a.platform_url?{platformUrl:a.platform_url}:{},...a.oauth2_client_id?{oauth2ClientId:a.oauth2_client_id}:{},...a.console_url?{consoleUrl:a.console_url}:{}},e.json||M.success(`Profile "${n.name}" created successfully.`)}if(e.json||M.success(`Workspace "${workspaceDisplayName(r)}" created successfully.`),e.json&&i){M.out({...r,profile:i});return}M.out(r,{display:{name:Io,folderName:null}}),i&&(M.out(`Profile:`),M.out(i))}});async function listWorkspaces(e){let t=Po.optional().parse(e?.profile),n=await loadAccessToken({profile:t}),r=await loadPlatformClientConfig({profile:t});return listWorkspacesWithClient(await F(n,r),e)}async function listWorkspacesWithClient(e,t){let n=toPageDirection(t?.order);return workspaceInfosWithFolderNames(e,await jt(async(t,r)=>{let{workspaces:i,nextPageToken:a}=await e.listWorkspaces({pageToken:t,pageSize:r,pageDirection:n});return[i,a]},{limit:t?.limit}))}const zo=X({name:`list`,description:`List all Tailor Platform workspaces.`,args:H.strictObject({...paginationArgs(),profile:V(Po.optional(),{description:`Workspace profile used for authentication and Platform selection`,env:`TAILOR_PLATFORM_PROFILE`})}),run:async e=>{let t=await listWorkspaces({order:e.order,limit:e.limit,profile:e.profile});M.out(t,{display:{name:Io,folderName:null,organizationId:null,folderId:null,updatedAt:null}})}}),Bo=H.object({version:H.literal(1),platformUrl:H.url(),applicationId:H.string().min(1).optional(),workspaceId:H.uuid()});function defaultConfigPath(){return Nn(process.cwd(),`tailor.config.ts`)}function contextPath(e){return Mn(jn(e),Gt(),`${An(e)}.context.json`)}async function loadWorkspaceContext(e,t=defaultConfigPath(),n){let r;try{r=await xr(contextPath(t),`utf8`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let i;try{i=JSON.parse(r)}catch{return}let a=Bo.safeParse(i);if(!(!a.success||a.data.platformUrl!==e||n!==void 0&&a.data.applicationId!==n))return a.data}async function saveWorkspaceContext(e,t=defaultConfigPath(),n){let r=Bo.parse({...e,...n===void 0?{}:{applicationId:n}}),i=Mn(jn(t),Gt()),a=contextPath(t),o=`${JSON.stringify(r,null,2)}\n`;try{if(await xr(a,`utf8`)===o)return}catch{}let s=`${a}.${process.pid}.${or()}.tmp`;await br(i,{recursive:!0});try{await wr(s,o,{mode:384}),await Sr(s,a)}catch(e){throw await Cr(s,{force:!0}).catch(()=>void 0),e}}function suggestedWorkspaceName(){let e=An(process.cwd()).toLowerCase().replaceAll(/[^a-z0-9-]+/g,`-`).replaceAll(/^-+|-+$/g,``).slice(0,63).replace(/-+$/,``);return validateWorkspaceName(e)===!0?e:`my-workspace`}function executableAction(e){return{command:`tailor`,args:e}}function deployArgs(e){return e.deployArgs??[`deploy`]}function workspaceCommandArgs(e){return e.workspaceCommandArgs??[]}function createDeployArgs(e,t,n){return[...deployArgs(e),`--create-workspace`,`--workspace-name`,t,`--workspace-region`,n,...e.organizationId?[`--organization-id`,e.organizationId]:[],...e.folderId?[`--folder-id`,e.folderId]:[]]}function selectDeployArgs(e){return[...deployArgs(e),`--workspace-id`,`<workspace-id>`]}function workspaceLabel(e){let t=e.organizationId??`personal`;return`${workspaceDisplayName(e)} (${e.region}, org: ${t}, id: ${e.id})`}function workspaceMatchesRequestedIdentity(e,t){return t.workspaceName===e.name&&t.workspaceRegion===e.region&&t.organizationId===e.organizationId&&t.folderId===e.folderId}function workspaceIdentity(e){let{id:t,name:n,region:r,organizationId:i,folderId:a}=e;return{id:t,name:n,region:r,organizationId:i,folderId:a}}function projectContextTargets(e){if(e)return[...new Map(e.map(e=>[e.configPath,e])).values()]}async function loadProjectContexts(e,t){let n=projectContextTargets(t);if(!n||n.length===0){let t=await loadWorkspaceContext(e);return t?[t]:[]}return(await Promise.all(n.map(({configPath:t,applicationId:n})=>loadWorkspaceContext(e,t,n)))).filter(e=>e!==void 0)}async function persistWorkspaceContext(e,t){let n=projectContextTargets(t);if(!n||n.length===0){await saveWorkspaceContext(e);return}let r=(await Promise.allSettled(n.map(({configPath:t,applicationId:n})=>saveWorkspaceContext(e,t,n)))).filter(e=>e.status===`rejected`);if(r.length>0)throw Error(r.map(({reason:e})=>e instanceof Error?e.message:String(e)).join(`; `))}async function rememberWorkspaceContext(e,t,n=`error-on-partial`){if(!t.dryRun)try{await persistWorkspaceContext(e,t.contextTargets)}catch(r){if((projectContextTargets(t.contextTargets)?.length??0)>1&&n===`error-on-partial`)throw R({code:`WORKSPACE_CONTEXT_SAVE_FAILED`,message:`The workspace selection could not be saved for every configuration file.`,details:r instanceof Error?r.message:String(r),suggestion:`Fix project state permissions, then rerun deploy with the workspace ID.`,next:executableAction([...deployArgs(t),`--workspace-id`,e.workspaceId]),context:{workspaceId:e.workspaceId,configPaths:t.contextTargets?.map(({configPath:e})=>e)}});M.warn(`Could not save the project workspace selection (${r instanceof Error?r.message:String(r)}). Continue with --workspace-id ${e.workspaceId} on later runs.`)}}async function useWorkspace(e,t,n,r,i=`error-on-partial`){return await rememberWorkspaceContext({version:1,platformUrl:t,workspaceId:n.id},r,i),M.info(`Using workspace: ${workspaceLabel(n)}`),{client:e,workspaceId:n.id}}function useRememberedWorkspace(e,t){return M.warn(`Using saved workspace selection: ${workspaceLabel(t)}`),{client:e,workspaceId:t.id}}const Vo=`create-new-workspace`;async function chooseWorkspace(e,t,n,r){let i=await Z.select({message:`Select a workspace`,choices:[...n.map(e=>({name:workspaceLabel(e),value:e.id})),{name:`Create new workspace`,value:Vo}]});if(i===Vo)return createWorkspaceForDeploy(e,t,r);let a=n.find(({id:e})=>e===i);if(!a)throw Error(`Selected workspace was not found`);return useWorkspace(e,t,a,r)}function invalidCreateOptionsError(e,t,n,r){return R({code:`WORKSPACE_CREATE_OPTIONS_INVALID`,message:`Workspace creation options are invalid.`,details:r,suggestion:`Correct the workspace creation options and rerun deploy.`,next:executableAction(createDeployArgs(e,t,n))})}async function createWorkspace(e,t,n,r,i){let a=n.workspaceName,o=n.workspaceRegion,s=canPrompt();if(s)a??=await Z.text({message:`Workspace name`,default:suggestedWorkspaceName(),validate:validateWorkspaceName}),o??=await Z.select({message:`Workspace region`,choices:r.map(e=>({name:e,value:e}))});else{let e=[...a===void 0?[`--workspace-name`]:[],...o===void 0?[`--workspace-region`]:[]];if(e.length>0)throw R({code:`WORKSPACE_CREATE_OPTIONS_REQUIRED`,message:`Workspace creation requires a name and region in non-interactive mode.`,suggestion:`Provide every workspace creation option and rerun deploy.`,next:executableAction(createDeployArgs(n,a??`<name>`,o??`<region>`)),context:{missingOptions:e}})}if(!a||!o)throw Error(`Workspace creation options were not resolved`);let c=i;if(!c){try{c=validateCreateWorkspaceOptions({name:a,region:o,organizationId:n.organizationId,folderId:n.folderId})}catch(e){throw invalidCreateOptionsError(n,a,o,e instanceof Error?e.message:String(e))}if(!r.includes(o))throw invalidCreateOptionsError(n,a,o,`Region must be one of: ${r.join(`, `)}.`)}if(s){let e=[n.organizationId?`organization: ${n.organizationId}`:void 0,n.folderId?`folder: ${n.folderId}`:void 0].filter(e=>e!==void 0);if(!await Z.confirm({message:`Create workspace "${a}" in ${o}${e.length>0?` (${e.join(`, `)})`:``}?`,default:!0}))throw R({code:`WORKSPACE_CREATION_CANCELLED`,message:`Workspace creation was cancelled.`})}let l;try{l=await createValidatedWorkspaceWithClient(e,c)}catch(e){throw e instanceof q&&![K.Canceled,K.Unknown,K.DeadlineExceeded,K.Aborted,K.Internal,K.Unavailable,K.DataLoss].includes(e.code)?e:R({code:`WORKSPACE_CREATION_FAILED`,message:`Workspace creation did not complete successfully.`,details:e instanceof Error?e.message:String(e),suggestion:`The outcome may be uncertain. List workspaces before retrying creation to avoid duplicates.`,next:executableAction([`workspace`,`list`,...workspaceCommandArgs(n),`--json`])})}return await rememberWorkspaceContext({version:1,platformUrl:t,workspaceId:l.id},n),M.success(`Created workspace: ${workspaceLabel(l)}`),M.info(`Reuse this workspace with: tailor deploy --workspace-id ${l.id}`),M.info(`Or set TAILOR_PLATFORM_WORKSPACE_ID=${l.id}.`),{client:e,workspaceId:l.id}}async function createWorkspaceForDeploy(e,t,n,r,i){let a=r??(await e.listAvailableWorkspaceRegions({})).regions;if(n.dryRun)throw R({code:`WORKSPACE_CREATION_DISABLED_IN_DRY_RUN`,message:`Dry-run cannot create the workspace required to build a deployment plan.`,suggestion:`Create a workspace explicitly, then rerun the same dry-run with its workspace ID.`,context:{availableRegions:a}});return createWorkspace(e,t,n,a,i)}async function resolveDeployWorkspace(e={}){let t=[e.workspaceName===void 0?void 0:`--workspace-name`,e.workspaceRegion===void 0?void 0:`--workspace-region`].filter(e=>e!==void 0);if(!e.createWorkspace&&t.length>0)throw R({code:`WORKSPACE_CREATE_FLAG_REQUIRED`,message:`Workspace creation options require --create-workspace.`,suggestion:`Add --create-workspace or remove the workspace creation options.`,next:executableAction(createDeployArgs(e,e.workspaceName??`<name>`,e.workspaceRegion??`<region>`)),context:{options:t}});if(e.createWorkspace&&e.workspaceName!==void 0){let t=validateWorkspaceName(e.workspaceName);if(t!==!0)throw invalidCreateOptionsError(e,e.workspaceName,e.workspaceRegion??`<region>`,t)}if(e.createWorkspace&&e.workspaceRegion===``)throw invalidCreateOptionsError(e,e.workspaceName??`<name>`,e.workspaceRegion,`Region must not be empty.`);let n=await tryLoadWorkspaceId({workspaceId:e.workspaceId,profile:e.profile}),r=await loadAccessToken({profile:e.profile}),i=await loadPlatformClientConfig({profile:e.profile,allowMissingProfile:n!==void 0}),a=Mt(i),o=await F(r,i);if(n){let t;try{t=await o.getWorkspace({workspaceId:n})}catch(e){throw e instanceof q&&e.code===K.NotFound?R({code:`WORKSPACE_NOT_FOUND`,message:`Workspace "${n}" was not found.`}):e}if(!t.workspace)throw R({code:`WORKSPACE_NOT_FOUND`,message:`Workspace "${n}" was not found.`});return useWorkspace(o,a,workspaceInfo(t.workspace),e,`warn`)}let s;if(e.createWorkspace&&e.workspaceName!==void 0&&e.workspaceRegion!==void 0)try{s=validateCreateWorkspaceOptions({name:e.workspaceName,region:e.workspaceRegion,organizationId:e.organizationId,folderId:e.folderId})}catch(t){throw invalidCreateOptionsError(e,e.workspaceName,e.workspaceRegion,t instanceof Error?t.message:String(t))}let[c,l]=await Promise.all([loadProjectContexts(a,e.contextTargets),listWorkspacesWithClient(o)]),u=canPrompt(),d=new Set(c.map(({workspaceId:e})=>e)),f=d.size===1?l.find(({id:e})=>d.has(e)):void 0;if(f&&(!e.createWorkspace||workspaceMatchesRequestedIdentity(f,e))){let t=projectContextTargets(e.contextTargets)?.length??1;return c.length===t?useRememberedWorkspace(o,f):useWorkspace(o,a,f,e)}let p=l.length===1?l[0]:void 0,m=p!==void 0&&s!==void 0&&workspaceMatchesRequestedIdentity(p,e),h;if(s&&!m&&(h=await o.listAvailableWorkspaceRegions({}),!h.regions.includes(s.region)))throw invalidCreateOptionsError(e,s.name,s.region,`Region must be one of: ${h.regions.join(`, `)}.`);if(l.length===0&&(u||e.createWorkspace||c.length===0)){let t=h?.regions??(await o.listAvailableWorkspaceRegions({})).regions;if(e.dryRun||u||e.createWorkspace)return createWorkspaceForDeploy(o,a,e,t,s);throw R({code:`WORKSPACE_NOT_FOUND`,message:`No workspaces are available for this account.`,suggestion:`Create one during deploy by providing the workspace name and one of the available regions.`,next:executableAction(createDeployArgs(e,`<name>`,`<region>`)),context:{availableRegions:t}})}if(d.size>1){let t=e.createWorkspace===!0&&e.workspaceName!==void 0&&e.workspaceRegion!==void 0&&l.length===0;if(!u&&!t)throw R({code:`WORKSPACE_CONTEXT_CONFLICT`,message:`The deployed configuration files are linked to different workspaces.`,suggestion:`Choose one workspace explicitly for the combined deployment.`,next:executableAction(selectDeployArgs(e)),context:{savedWorkspaceIds:[...d]}});if(l.length>0&&!e.createWorkspace)return chooseWorkspace(o,a,l,e)}if(!f&&c.length>0){let t=e.createWorkspace===!0&&e.workspaceName!==void 0&&e.workspaceRegion!==void 0&&l.length<=1;if(!u&&!t)throw R({code:`WORKSPACE_CONTEXT_STALE`,message:`The saved project workspace is no longer available.`,suggestion:`Choose an available workspace explicitly before deploying.`,next:executableAction(selectDeployArgs(e)),context:{savedWorkspaceIds:[...d],workspaces:l.map(workspaceIdentity)}});if(l.length>0&&u&&!e.createWorkspace)return chooseWorkspace(o,a,l,e)}if(l.length===1){let[t]=l;if(!t)throw Error(`Workspace discovery returned an invalid result`);if(e.createWorkspace&&!workspaceMatchesRequestedIdentity(t,e))throw R({code:`WORKSPACE_CREATE_CONFLICT`,message:`The existing workspace does not match the requested workspace.`,suggestion:`Use the existing workspace, or run the explicit workspace create command to create another one.`,next:executableAction([`workspace`,`create`,...workspaceCommandArgs(e),...e.workspaceCommandJson?[`--json`]:[],`--name`,e.workspaceName??`<name>`,`--region`,e.workspaceRegion??`<region>`,...e.organizationId?[`--organization-id`,e.organizationId]:[],...e.folderId?[`--folder-id`,e.folderId]:[]]),context:{existingWorkspace:workspaceIdentity(t)}});return u&&!e.createWorkspace?chooseWorkspace(o,a,l,e):useWorkspace(o,a,t,e)}if(l.length>1){if(!u)throw R({code:`WORKSPACE_SELECTION_REQUIRED`,message:`Multiple workspaces are available.`,suggestion:`Choose one explicitly for non-interactive deployment.`,next:executableAction(selectDeployArgs(e)),context:{workspaces:l.map(workspaceIdentity)}});return chooseWorkspace(o,a,l,e)}throw Error(`Workspace discovery returned an invalid result`)}function collectExpectedLocalStaticWebsiteNames(e){let t=new Set;for(let n of e)for(let e of n.application.staticWebsiteServices)t.add(e.name);return t}async function shouldForceApplyAll(e,t,n,r){let i=(await buildMetaRequest({trn:resourceTrn(t,`application`,n.name),appName:n.name,appId:n.id})).labels,a=new Set;n.subgraphs.length>0&&a.add(resourceTrn(t,`application`,n.name)),n.staticWebsiteServices.forEach(e=>{a.add(resourceTrn(t,`staticwebsite`,e.name))}),n.aiGatewayServices.forEach(e=>{a.add(resourceTrn(t,`aigateway`,e.name))}),n.resolverServices.forEach(e=>{a.add(resourceTrn(t,`pipeline`,e.namespace))}),n.idpServices.forEach(e=>{a.add(resourceTrn(t,`idp`,e.name))}),n.authService&&a.add(resourceTrn(t,`auth`,n.authService.config.name)),Object.values(n.executorService?.executors??{}).forEach(e=>{a.add(resourceTrn(t,`executor`,e.name))}),Object.values(n.workflowService?.workflows??{}).forEach(e=>{a.add(resourceTrn(t,`workflow`,e.name))}),n.tailorDBServices.forEach(e=>{a.add(resourceTrn(t,`tailordb`,e.namespace))}),n.secrets.forEach(e=>{a.add(resourceTrn(t,`vault`,e.vaultName))}),r.forEach(e=>{a.add(resourceTrn(t,`function_registry`,e.name))});let o=await Promise.allSettled([...a].map(t=>I(async()=>{let{metadata:n}=await e.getMetadata({trn:t});return n})));if(o.some(e=>e.status===`fulfilled`&&e.value?.labels[`sdk-name`]===n.name&&!hasMatchingSdkVersion(e.value.labels,i)))return!0;let s=o.find(e=>e.status===`rejected`);if(s)throw s.reason;return!1}function recoveryEnvironmentArgs(e,t){return[...t?.envFile?[`--env-file`,B.resolve(process.cwd(),t.envFile)]:[],...t?.envFileIfExists?[`--env-file-if-exists`,B.resolve(process.cwd(),t.envFileIfExists)]:[],...e?.profile?[`--profile`,e.profile]:[]]}function recoveryOutputArgs(e){return[...e?.verbose?[`--verbose`]:[],...e?.json||M.jsonMode?[`--json`]:[]]}function retryDeployArgs(e,t,n){return[`deploy`,`--config`,t.join(`,`),...recoveryEnvironmentArgs(e,n),...e?.dryRun?[`--dry-run`]:[],...e?.yes?[`--yes`]:[],...e?.noSchemaCheck?[`--no-schema-check`]:[],...e?.noValidate?[`--no-validate`]:[],...e?.noCache?[`--no-cache`]:[],...e?.cleanCache?[`--clean-cache`]:[],...recoveryOutputArgs(n)]}function workspaceRecoveryArgs(e,t){return[...recoveryEnvironmentArgs(e,t),...t?.verbose?[`--verbose`]:[]]}function collectPlannedExternalTailorDBServices(e,t){let n=new Set(e.application.externalTailorDBNamespaces);return n.size===0?[]:t.flatMap(e=>e.application.tailorDBServices.filter(e=>n.has(e.namespace)))}function collectExternalAuthIdpConfigNames(e){let t=new Map;for(let n of e){let e=n.application.authService;if(!e)continue;let{name:r}=e.config,i=e.config.idProvider?.name;if(t.has(r)&&t.get(r)!==i)throw Error(`Auth namespace "${r}" is defined by multiple config files with different IdP configs. Auth namespace names must be unique across all configs in a single deploy.`);t.set(r,i)}return t}function collectDeployRunPlanInputs(e,t){let n=collectEventSubscriptions(e);return assertRecordableDependencies(n,t),{eventSubscriptions:n,runAppIds:new Set(e.map(e=>e.application.id).filter(e=>e!==void 0)),expectedLocalStaticWebsiteNames:collectExpectedLocalStaticWebsiteNames(e),externalAuthIdpConfigNames:collectExternalAuthIdpConfigNames(e)}}async function planDeploymentTarget(e){let{target:t,targets:n,runInputs:r,client:i,workspaceId:a,noSchemaCheck:o,migrationTestBaselines:s,migrationTestSnapshots:c}=e,{config:l,application:u,workflowBuildResult:d,httpAdapterBuildResult:f,bundledScripts:p}=t,m=ownedSubscriptions(r.eventSubscriptions,t),h=u.tailorDBServices.map(e=>{let t=c?.get(e.namespace);return t?{...e,types:t.tables,typeSourceInfo:{}}:e});await z(`plan.validateTailorDBTypeNames`,()=>rn({client:i,workspaceId:a,tailorDBServices:h,externalTailorDBNamespaces:u.externalTailorDBNamespaces,plannedExternalTailorDBServices:collectPlannedExternalTailorDBServices(t,n)}));let g=u.workflowService,_=collectFunctionEntries(u,filterBundledWorkflowJobs(g?.jobs??[],d?.usedJobNames??[]),p),v=await z(`plan.detectSdkVersionChange`,()=>shouldForceApplyAll(i,a,u,_));return z(`plan`,async()=>{let e=n.map(e=>e.application),p=collectVisibleTailorDBTypeNamespaces(u,e),h=collectVisibleResolverNamespaces(u,e),y=collectVisibleIdpNames(u,e),b={client:i,workspaceId:a,application:u,forRemoval:!1,config:l,noSchemaCheck:o,migrationTestBaselines:s,migrationTestSnapshots:c,forceApplyAll:v,...r,idpUserTriggerTargets:subscribedIdps(m),executorUsedTailorDBTables:subscribedTailorDBTables(m),executorUsedResolvers:subscribedResolvers(m),dependentApps:collectDependentApps(m),tailorDBTypeNamespaces:p,resolverNamespaces:h,idpNames:y},x=await z(`plan.functionRegistry`,()=>planFunctionRegistry(i,a,u.name,u.id,_)),S=new Set(x.changeSet.unchanged.filter(e=>e.name.startsWith(ki)).map(e=>e.name.slice(10))),[C,w,ee,te,ne,re,ie,ae,oe,se,ce]=await Promise.all([z(`plan.tailorDB`,()=>planTailorDB(b)),z(`plan.staticWebsite`,()=>planStaticWebsite(b)),z(`plan.aiGateway`,()=>planAIGateway(b)),z(`plan.idp`,()=>planIdP(b)),z(`plan.auth`,()=>planAuth(b)),z(`plan.pipeline`,()=>planPipeline(b)),z(`plan.application`,()=>planApplication(b,f)),z(`plan.executor`,()=>planExecutor(b)),z(`plan.workflow`,()=>planWorkflow(i,a,u.name,u.id,g?.workflows??{},d?.mainJobDeps??{},S,{...subscribedWorkflows(m),jobPublishEvents:collectWorkflowJobPublishEvents(t),dependentApps:b.dependentApps,runAppIds:b.runAppIds})),z(`plan.workflowExecutionPolicy`,()=>planWorkflowJobFunctionExecutionPolicy(i,a,u.name,u.id,l.workflow?.executionPolicies??{})),z(`plan.secretManager`,()=>planSecretManager(b))]);return{application:u,functionRegistry:x,tailorDB:C,staticWebsite:w,aiGateway:ee,idp:te,auth:ne,pipeline:re,app:ie,executor:ae,workflow:oe,workflowExecutionPolicy:se,secretManager:ce}})}async function planDeploymentTargets(e){let{targets:t,planTarget:n=planDeploymentTarget,...r}=e;return Promise.all(t.map(e=>n({...r,target:e,targets:t})))}async function confirmDeploymentPlans(e){let{deployments:t,yes:n,dryRun:r=!1,missingDependentApps:i=[]}=e;r||await confirmMigrationCheckpointRepairs(t.flatMap(e=>e.tailorDB.context.checkpointRepairs),n),await confirmMissingDependentApps(i,n);let a=new Set(t.map(e=>e.application.name)),o=collectDeploymentResourceOwners(t),s=new Set,c=[];for(let e of t){let t=deploymentPlanResults(e),r=collectOwnerConflicts(t);await confirmOwnerConflict(r,e.application.name,n,e.application.id),await confirmUnmanagedResources(collectUnmanagedResources(t),e.application.name,n),c.push(...collectImportantResourceDeletions(t));let i=computeRenamedAppDeletions({conflicts:r,resourceOwners:o,protectedAppNames:a});for(let t of i)s.has(t)||(s.add(t),e.app.deletes.push({name:t,request:{workspaceId:e.tailorDB.context.workspaceId,applicationName:t}}))}await confirmImportantResourceDeletion(c,n)}async function validateDeploymentPlans(e){for(let t of e)await validatePlan(deploymentPlanResults(t))}function adjustApplicationForMigrationTest(e,t){if(!t?.migrationTestSnapshots)return e;let n=t.migrationTestBaselines!==void 0,r=n&&e.authService?{...e.authService,userProfile:void 0}:e.authService,i={...e,executorService:n?void 0:e.executorService,authService:r,staticWebsiteServices:e.staticWebsiteServices.map(e=>({...e,customDomains:void 0})),get applications(){return[i]}};return i}async function deployInternal(e,n,r){return z(`deploy`,async i=>{i.setAttribute(`deploy.dry_run`,e?.dryRun??!1),un(),t();let a=parseDeployConfigPaths(e?.configPath),o=e?.dryRun??!1,s=e?.buildOnly??ct(process.env.TAILOR_DEPLOY_BUILD_ONLY)===!0,c=s?[]:await z(`config.preflight`,()=>Promise.all(a.map(e=>loadDeployConfig({configPath:e,dryRun:o,buildOnly:s})))),l=c.map(({config:e})=>e.path),u=c.map(({config:e})=>({configPath:e.path,applicationId:e.id??`name:${e.name}`})),d=s?void 0:await resolveDeployWorkspace({workspaceId:e?.workspaceId,profile:e?.profile,createWorkspace:e?.createWorkspace,workspaceName:e?.workspaceName,workspaceRegion:e?.workspaceRegion,organizationId:e?.organizationId,folderId:e?.folderId,dryRun:o,contextTargets:u,deployArgs:retryDeployArgs(e,l,n),workspaceCommandArgs:workspaceRecoveryArgs(e,n),workspaceCommandJson:n?.json||M.jsonMode}),f=await z(`build`,async()=>{let t=e?.noCache??!1,n=await pn(),r=B.resolve(Gt(),`cache`);return e?.cleanCache&&(W.rmSync(r,{recursive:!0,force:!0}),M.info(`Bundle cache cleaned`)),await buildDeploymentTargets({configPaths:a,loadedConfigs:c,dryRun:o,buildOnly:s,noCache:t,packageVersion:n.version??`unknown`,cacheDir:r})});if(s)return{bundledScripts:mergeBundledScripts(f)};if(assertUniqueGlobalResourceNames(f),!d)throw Error(`Workspace was not resolved`);let{client:p,workspaceId:m}=d;i.setAttribute(`app.name`,f.map(e=>e.application.name).join(`,`)),i.setAttribute(`workspace.id`,m);let h=f.map(e=>({...e,application:adjustApplicationForMigrationTest(e.application,r)})),g=await z(`plan.metadataLookup`,()=>createMetadataLookupClient({client:p,workspaceId:m,applications:h.map(({application:e})=>e)})),_=collectDeployRunPlanInputs(h,!e?.dryRun),v=await planDeploymentTargets({targets:h,runInputs:_,client:g,workspaceId:m,noSchemaCheck:e?.noSchemaCheck,migrationTestBaselines:r?.migrationTestBaselines,migrationTestSnapshots:r?.migrationTestSnapshots}),y=e?.yes??!1;dropCrossDeploymentManagedDeletes(v);let b=(await Promise.all(h.map(e=>fetchMissingDependentApps({client:g,workspaceId:m,application:e.application,runAppIds:_.runAppIds??new Set,subscribedKeys:subscribedResourceKeys(_.eventSubscriptions,e),jobsByWorkflow:e.workflowBuildResult?.mainJobDeps??{}})))).flat();await z(`confirm`,async()=>{await confirmDeploymentPlans({deployments:v,yes:y,dryRun:o,missingDependentApps:b})});let x=printDeploymentPlans(v,{dryRun:e?.dryRun});if(e?.noValidate?M.warn(`Client-side validation skipped (--no-validate).`):await validateDeploymentPlans(v),o){M.info(`Dry run enabled. No changes applied.`);return}await applyDeploymentPlans(p,m,v),r?.suppressResultOutput||(M.jsonMode?M.out({summary:x,status:`applied`}):M.success(`Successfully applied changes.`))})}function deploy(e){return deployInternal(e)}function deployMigrationTestBaseline(e,t,n){return deployInternal(e,void 0,{migrationTestBaselines:t,migrationTestSnapshots:n,suppressResultOutput:!0})}function deployMigrationTestTarget(e,t){return deployInternal(e,void 0,{migrationTestSnapshots:t,suppressResultOutput:!0})}function deployFromCLI(e,t){return deployInternal(e,t)}function colorizeExecutorJobStatus(e){switch(e){case`PENDING`:return N.dim(e);case`RUNNING`:return N.info(e);case`SUCCESS`:return N.success(e);case`FAILED`:return N.error(e);case`CANCELED`:return N.warning(e);default:return e}}function isExecutorJobTerminalStatus(e){return isExecutorJobSuccessStatus(e)||isExecutorJobFailureStatus(e)}function isExecutorJobSuccessStatus(e){return e===n.SUCCESS}function isExecutorJobFailureStatus(e){return e===n.FAILED||e===n.CANCELED}function isExecutorJobTransientStatus(e){return e===n.UNSPECIFIED||e===n.PENDING||e===n.RUNNING}function classifyExecutorJobStatus(e){return isExecutorJobSuccessStatus(e)?`success`:isExecutorJobTerminalStatus(e)?`failure`:(isExecutorJobTransientStatus(e),`transient`)}function parseExecutorJobStatus(e){switch(e.toUpperCase()){case`PENDING`:return n.PENDING;case`RUNNING`:return n.RUNNING;case`SUCCESS`:return n.SUCCESS;case`FAILED`:return n.FAILED;case`CANCELED`:return n.CANCELED;default:throw Error(`Invalid status: ${e}. Valid values: PENDING, RUNNING, SUCCESS, FAILED, CANCELED`)}}function colorizeFunctionExecutionStatus(e){switch(e){case`RUNNING`:return N.info(e);case`SUCCESS`:return N.success(e);case`FAILED`:return N.error(e);default:return e}}function isFunctionExecutionTerminalStatus(e){return e===h.SUCCESS||e===h.FAILED||e===h.CANCELED}function executorTargetTypeToString(e){switch(e){case T.WEBHOOK:return`WEBHOOK`;case T.TAILOR_GRAPHQL:return`GRAPHQL`;case T.FUNCTION:return`FUNCTION`;case T.JOB_FUNCTION:return`JOB_FUNCTION`;case T.WORKFLOW:return`WORKFLOW`;default:return`UNSPECIFIED`}}function executorTriggerTypeToString(e){switch(e){case O.SCHEDULE:return`SCHEDULE`;case O.EVENT:return`EVENT`;case O.INCOMING_WEBHOOK:return`INCOMING_WEBHOOK`;default:return`UNSPECIFIED`}}function executorJobStatusToString(e){switch(e){case n.PENDING:return`PENDING`;case n.RUNNING:return`RUNNING`;case n.SUCCESS:return`SUCCESS`;case n.FAILED:return`FAILED`;case n.CANCELED:return`CANCELED`;default:return`UNSPECIFIED`}}function toExecutorJobListInfo(e){return{id:e.id,executorName:e.executorName,status:executorJobStatusToString(e.status),createdAt:e.createdAt?G(e.createdAt).toISOString():`N/A`}}function toExecutorJobInfo(e){return{id:e.id,executorName:e.executorName,status:executorJobStatusToString(e.status),scheduledAt:e.scheduledAt?G(e.scheduledAt).toISOString():`N/A`,createdAt:e.createdAt?G(e.createdAt).toISOString():`N/A`,updatedAt:e.updatedAt?G(e.updatedAt).toISOString():`N/A`}}function toExecutorJobAttemptInfo(e){return{id:e.id,jobId:e.jobId,status:executorJobStatusToString(e.status),error:e.error||``,startedAt:e.startedAt?G(e.startedAt).toISOString():`N/A`,finishedAt:e.finishedAt?G(e.finishedAt).toISOString():`N/A`,operationReference:e.operationReference||``}}function formatSubjectEvent(e,t){let n=t.map(e=>e.split(`.`).at(-1)??e).join(`, `);return n?`event: ${e} ${n}`:`event: ${e}`}function formatTypedEventTrigger(e){let t=e.typedConfig;if(t.case===void 0)return null;switch(t.case){case`tailordb`:return formatSubjectEvent(t.value.typeName,t.value.eventTypes);case`pipeline`:return formatSubjectEvent(t.value.resolverName,t.value.eventTypes);case`idp`:return formatSubjectEvent(`idp user`,t.value.eventTypes);case`auth`:return formatSubjectEvent(`auth access_token`,t.value.eventTypes);default:return null}}function formatTriggerType(e){let t=e.triggerConfig?.config;if(!t||t.case===void 0)return executorTriggerTypeToString(e.triggerType);switch(t.case){case`schedule`:return`schedule: ${t.value.frequency} (${t.value.timezone})`;case`event`:{let n=formatTypedEventTrigger(t.value);if(n)return n;let r=readLegacyEventTriggerConfig(t.value);return r.eventType?formatEventTrigger(r.eventType,r.condition):executorTriggerTypeToString(e.triggerType)}case`incomingWebhook`:return`webhook`;default:return executorTriggerTypeToString(e.triggerType)}}function readLegacyEventTriggerConfig(e){return{eventType:e.eventType,condition:e.condition?.expr}}function formatEventTrigger(e,t){let n=e.split(`.`);if(n.length<3)return`event: ${e}`;let[r,i,a]=n;if(t){let e=t.match(/args\.typeName\s*===?\s*["']([^"']+)["']/);if(e)return`event: ${e[1]} ${a}`;let n=t.match(/args\.resolverName\s*===?\s*["']([^"']+)["']/);if(n)return`event: ${n[1]} ${a}`}return`event: ${r} ${i} ${a}`}function formatTriggerConfig(e){let t=e.triggerConfig?.config;if(!t||t.case===void 0)return{};switch(t.case){case`schedule`:return{timezone:t.value.timezone,frequency:t.value.frequency};case`event`:return formatEventTriggerConfig(t.value);case`incomingWebhook`:return{secret:t.value.secret?`***`:``};default:return{}}}function formatEventTriggerConfig(e){let t=e.typedConfig;if(t.case===void 0){let t=readLegacyEventTriggerConfig(e);return{eventType:t.eventType,condition:t.condition||``}}if(t.case===`workflow`)return{kind:t.case,eventTypes:t.value.eventTypes,condition:t.value.condition?.expr||``,...t.value.workflowName&&{workflowName:t.value.workflowName}};let n={kind:t.case,eventTypes:t.value.eventTypes,namespaceName:t.value.namespaceName,condition:t.value.condition?.expr||``};switch(t.case){case`tailordb`:return{...n,typeName:t.value.typeName};case`pipeline`:return{...n,resolverName:t.value.resolverName};default:return n}}function formatTargetConfig(e){let t=e.targetConfig?.config;if(!t||t.case===void 0)return{};switch(t.case){case`webhook`:return{url:t.value.url?.expr||``,headers:t.value.headers.length};case`tailorGraphql`:return{appName:t.value.appName,query:t.value.query};case`function`:return{name:t.value.name};case`workflow`:return{workflowName:t.value.workflowName};default:return{}}}function toExecutorListInfo(e){return{name:e.name,triggerType:formatTriggerType(e),targetType:executorTargetTypeToString(e.targetType),disabled:e.disabled}}function toExecutorInfo(e){return{name:e.name,description:e.description,triggerType:formatTriggerType(e),targetType:executorTargetTypeToString(e.targetType),disabled:e.disabled,triggerConfig:formatTriggerConfig(e),targetConfig:formatTargetConfig(e)}}const Ho={name:V(H.string(),{positional:!0,description:`Executor name`})};async function resolveExecutor(e,t,n){let{executor:r}=await e.getExecutorExecutor({workspaceId:t,name:n});if(!r)throw Error(`Executor '${n}' not found.`);return r}async function getExecutor(e){let t=e.executor.name,{client:n,workspaceId:r}=await loadOperatorWorkspaceContext({profile:e.profile,workspaceId:e.workspaceId});try{return toExecutorInfo(await resolveExecutor(n,r,t))}catch(e){throw e instanceof q&&e.code===K.NotFound?Error(`Executor '${t}' not found.`,{cause:e}):e}}const Uo=X({name:`get`,description:`Get executor details`,args:H.strictObject({...Y,...Ho}),run:async e=>{let t=await getExecutor({executor:{name:e.name},workspaceId:e[`workspace-id`],profile:e.profile});M.out(t,{display:{triggerConfig:null,targetConfig:null}})}});function functionExecutionStatusToString(e){switch(e){case h.RUNNING:return`RUNNING`;case h.SUCCESS:return`SUCCESS`;case h.FAILED:return`FAILED`;case h.SUSPEND:return`SUSPEND`;case h.CANCELING:return`CANCELING`;case h.CANCELED:return`CANCELED`;default:return`UNSPECIFIED`}}function formatWaitError(e){return e instanceof Error?e.message:String(e)}function isRetryableWaitError(e){return e instanceof q?e.code===K.Aborted||e.code===K.ResourceExhausted||e.code===K.Unavailable:!1}const Wo=H.enum([`success`,`suspended`,`terminal`]),Go={name:V(H.string(),{positional:!0,description:`Workflow name`})},Ko={interval:V(Ir.default(`3s`),{alias:`i`,description:`Polling interval when waiting (e.g., '3s', '500ms', '1m')`}),timeout:V(Ir.default(`10m`),{alias:`t`,description:`Maximum time to wait (e.g., '30s', '10m')`}),until:V(Wo.default(`terminal`),{alias:`u`,description:`Wait target (success, suspended, terminal)`}),logs:V(H.boolean().default(!1),{alias:`l`,description:`Display job execution logs after completion`})},qo={wait:V(H.boolean().default(!1),{alias:`W`,description:`Wait for execution to complete`}),...Ko};function isWorkflowExecutionSuccessStatus(e){return e===D.SUCCESS}function isWorkflowJobExecutionSuspendedStatus(e){return e===Qe.SUSPEND||e===Qe.WAITING}function isWorkflowExecutionSuspendedStatus(e){return e===D.PENDING_RESUME||e===D.WAITING}function isWorkflowExecutionFailureStatus(e){return e===D.FAILED}function isWorkflowExecutionTransientStatus(e){return e===D.UNSPECIFIED||e===D.PENDING||e===D.RUNNING||e===D.PENDING_RETRY}function isWorkflowExecutionTerminalStatus(e){return isWorkflowExecutionSuccessStatus(e)||isWorkflowExecutionFailureStatus(e)||isWorkflowExecutionSuspendedStatus(e)}function classifyWorkflowExecutionStatus(e){return isWorkflowExecutionTerminalStatus(e.status)?isWorkflowExecutionSuccessStatus(e.status)?{statusClass:`success`,status:e.status}:isWorkflowExecutionFailureStatus(e.status)?{statusClass:`failure`,status:e.status}:{statusClass:`suspended`,status:e.status}:e.jobExecutions.some(e=>isWorkflowJobExecutionSuspendedStatus(e.status))?{statusClass:`suspended`,status:e.status}:(isWorkflowExecutionTransientStatus(e.status),{statusClass:`transient`,status:e.status})}function hasReachedWorkflowWaitTarget(e,t){switch(t){case`success`:return e.statusClass===`success`;case`suspended`:return e.statusClass===`suspended`;case`terminal`:return e.statusClass===`success`||e.statusClass===`failure`||e.statusClass===`suspended`}}function workflowExecutionStatusToString(e){switch(e){case D.PENDING:return`PENDING`;case D.PENDING_RESUME:return`PENDING_RESUME`;case D.RUNNING:return`RUNNING`;case D.SUCCESS:return`SUCCESS`;case D.FAILED:return`FAILED`;case D.PENDING_RETRY:return`PENDING_RETRY`;case D.WAITING:return`WAITING`;default:return`UNSPECIFIED`}}function workflowJobExecutionStatusToString(e){switch(e){case Qe.RUNNING:return`RUNNING`;case Qe.SUSPEND:return`SUSPEND`;case Qe.SUCCESS:return`SUCCESS`;case Qe.FAILED:return`FAILED`;case Qe.WAITING:return`WAITING`;default:return`UNSPECIFIED`}}function toWorkflowListInfo(e){return{name:e.name,mainJob:e.mainJobFunctionName,jobFunctions:Object.keys(e.jobFunctions).length,updatedAt:e.updatedAt?G(e.updatedAt):null}}function toWorkflowInfo(e){let t={};for(let[n,r]of Object.entries(e.jobFunctions))t[n]=r.toString();return{name:e.name,id:e.id,mainJob:e.mainJobFunctionName,jobFunctions:t,createdAt:e.createdAt?G(e.createdAt):null,updatedAt:e.updatedAt?G(e.updatedAt):null}}function toWorkflowJobExecutionInfo(e){return{id:e.id,stackedJobName:e.stackedJobName,status:workflowJobExecutionStatusToString(e.status),executionId:e.executionId,startedAt:e.startedAt?G(e.startedAt):null,finishedAt:e.finishedAt?G(e.finishedAt):null}}function toWorkflowExecutionInfo(e){return{id:e.id,workflowName:e.workflowName,status:workflowExecutionStatusToString(e.status),jobExecutions:e.jobExecutions.length,startedAt:e.startedAt?G(e.startedAt):null,finishedAt:e.finishedAt?G(e.finishedAt):null}}function formatTime$1(e){return e.toLocaleTimeString(`en-US`,{hour12:!1})}function colorizeStatus(e){let t=D[e];switch(e){case D.PENDING:case D.UNSPECIFIED:return N.dim(t);case D.PENDING_RESUME:case D.PENDING_RETRY:case D.WAITING:return N.warning(t);case D.RUNNING:return N.info(t);case D.SUCCESS:return N.success(t);case D.FAILED:return N.error(t);default:return t}}function getActiveJobs(e){return e.jobExecutions.filter(e=>e.status===Qe.RUNNING||e.status===Qe.SUSPEND||e.status===Qe.WAITING).map(e=>e.stackedJobName).join(`, `)}function createWorkflowWaitResult(e){let t=Date.now()-e.startedAt;if(e.execution){let n=classifyWorkflowExecutionStatus(e.execution);return{...toWorkflowExecutionInfo(e.execution),statusClass:n.statusClass,elapsedMs:t,attempts:e.attempts,timedOut:e.timedOut,lastError:e.lastError}}return{id:e.executionId,workflowName:``,status:`UNKNOWN`,statusClass:`unknown`,jobExecutions:0,startedAt:null,finishedAt:null,elapsedMs:t,attempts:e.attempts,timedOut:e.timedOut,lastError:e.lastError}}async function waitForWorkflowExecution(e){let t=e.interval??3e3,n=e.until??`terminal`,r=Date.now(),i=e.showProgress?spinner({indent:2}).start(`Waiting for workflow to complete...`):null,a=0,o,s=null,c,l;try{for(;;){let u=Date.now()-r,d=e.timeout===void 0?void 0:e.timeout-u;if(d!==void 0&&d<=0)return i?.fail(`Workflow wait timed out.`),createWorkflowWaitResult({executionId:e.executionId,execution:o,startedAt:r,attempts:a,timedOut:!0,lastError:s});try{a+=1;let{execution:t}=await e.client.getWorkflowExecution({workspaceId:e.workspaceId,executionId:e.executionId});if(!t)throw i?.fail(`Execution '${e.executionId}' not found.`),Error(`Execution '${e.executionId}' not found.`);o=t,s=null;let u=classifyWorkflowExecutionStatus(t),d=colorizeStatus(t.status);if(t.status!==c&&(e.showProgress&&(i?.stop(),M.info(`Status: ${d}`,{mode:`stream`,indent:2}),i?.start(`Waiting for workflow to complete...`)),c=t.status),e.trackJobs){let n=getActiveJobs(t);n&&n!==l&&(e.showProgress&&(i?.stop(),M.info(`Job | ${n}: ${d}`,{mode:`stream`,indent:2}),i?.start(`Waiting for workflow to complete...`)),l=n)}if(i&&(i.text=`Waiting for workflow to complete... (${formatTime$1(new Date)})`),hasReachedWorkflowWaitTarget(u,n)||u.statusClass===`failure`||n===`suspended`&&u.statusClass===`success`)return t.status===D.SUCCESS?i?.succeed(`Completed: ${d}`):isWorkflowExecutionFailureStatus(t.status)?i?.fail(`Completed: ${d}`):isWorkflowExecutionSuspendedStatus(t.status)?i?.warn(`Completed: ${d}`):i?.succeed(`Completed: ${d}`),createWorkflowWaitResult({executionId:e.executionId,execution:t,startedAt:r,attempts:a,timedOut:!1,lastError:s})}catch(t){if(!isRetryableWaitError(t))throw t;s=formatWaitError(t),e.showProgress&&i&&(i.text=`Retrying workflow status poll... (${formatTime$1(new Date)})`)}let f=Date.now()-r,p=e.timeout===void 0?void 0:e.timeout-f;if(p!==void 0&&p<=0)return i?.fail(`Workflow wait timed out.`),createWorkflowWaitResult({executionId:e.executionId,execution:o,startedAt:r,attempts:a,timedOut:!0,lastError:s});await Er(p===void 0?t:Math.min(t,p))}}finally{i?.stop()}}async function waitForWorkflowExecutionById(e){let{client:t,workspaceId:n}=await loadOperatorWorkspaceContext({profile:e.profile,workspaceId:e.workspaceId});return await waitForWorkflowExecution({client:t,workspaceId:n,executionId:e.executionId,interval:e.interval,timeout:e.timeout,until:e.until,showProgress:e.showProgress,trackJobs:e.trackJobs})}function getWorkflowWaitFailureMessage(e,t){if(e.timedOut)return`Timed out waiting for workflow execution '${e.id}' to reach ${t}. Last status: ${e.status}.`;if(e.status===`FAILED`)return`Workflow execution '${e.id}' failed.`;if(t===`success`&&e.statusClass!==`success`)return`Workflow execution '${e.id}' reached ${e.status} before success.`;if(t===`suspended`&&e.statusClass!==`suspended`)return`Workflow execution '${e.id}' reached ${e.status} before suspension.`}function parseStatus(e){switch(e.toUpperCase()){case`PENDING`:return D.PENDING;case`PENDING_RESUME`:return D.PENDING_RESUME;case`RUNNING`:return D.RUNNING;case`SUCCESS`:return D.SUCCESS;case`FAILED`:return D.FAILED;case`PENDING_RETRY`:return D.PENDING_RETRY;case`WAITING`:return D.WAITING;case`UNSPECIFIED`:return D.UNSPECIFIED;default:throw Error(`Invalid status: ${e}. Valid values: UNSPECIFIED, PENDING, PENDING_RESUME, RUNNING, SUCCESS, FAILED, PENDING_RETRY, WAITING`)}}async function listWorkflowExecutions(e){let t=e?.workflow?.name,{client:n,workspaceId:r}=await loadOperatorWorkspaceContext({profile:e?.profile,workspaceId:e?.workspaceId}),i=[];if(e?.status){let t=parseStatus(e.status);i.push(U(Re,{condition:U(we,{field:`status`,operator:Ze.EQ,value:{kind:{case:`numberValue`,value:t}}})}))}let a=i.length>0?U(Re,{and:i}):void 0,o=toPageDirection(e?.order??`desc`);return(await jt(async(e,i)=>{let{executions:s,nextPageToken:c}=await n.listWorkflowExecutions({workspaceId:r,workflowName:t??``,pageToken:e,pageSize:i,pageDirection:o,filter:a});return[s,c]},{limit:e?.limit})).map(toWorkflowExecutionInfo)}async function getWorkflowExecution(e){let{client:t,workspaceId:n}=await loadOperatorWorkspaceContext({profile:e.profile,workspaceId:e.workspaceId});async function fetchFunctionExecution(e){try{let r=U(Re,{condition:U(we,{field:`id`,operator:Ze.EQ,value:{kind:{case:`stringValue`,value:e}}})});return(await t.listFunctionExecutions({workspaceId:n,filter:r,pageSize:1})).executions[0]}catch{return}}async function fetchExecutionWithLogs(e,r){let{execution:i}=await t.getWorkflowExecution({workspaceId:n,executionId:e});if(!i)throw Error(`Execution '${e}' not found.`);let a=toWorkflowExecutionInfo(i);return r&&i.jobExecutions.length>0&&(a.jobDetails=await Promise.all(i.jobExecutions.map(async e=>{let t=toWorkflowJobExecutionInfo(e);if(e.executionId){let n=await fetchFunctionExecution(e.executionId);if(n)return{...t,logs:n.logs||void 0,result:n.result||void 0}}return t}))),a}async function waitForCompletion(){let r=e.interval??3e3,i=await waitForWorkflowExecution({client:t,workspaceId:n,executionId:e.executionId,interval:r,timeout:e.timeout,until:e.until??`terminal`});return{...await fetchExecutionWithLogs(e.executionId,e.logs??!1),statusClass:i.statusClass,elapsedMs:i.elapsedMs,attempts:i.attempts,timedOut:i.timedOut,lastError:i.lastError}}return{execution:await fetchExecutionWithLogs(e.executionId,e.logs??!1),wait:waitForCompletion}}function printExecutionWithLogs(e){let formatDate=e=>e?e.toISOString():`N/A`,t=[[`id`,e.id],[`workflowName`,e.workflowName],[`status`,e.status],[`jobExecutions`,e.jobExecutions.toString()],[`startedAt`,formatDate(e.startedAt)],[`finishedAt`,formatDate(e.finishedAt)]];if(M.out(formatKeyValueTable(t)),e.jobDetails&&e.jobDetails.length>0){M.log(N.bold(`
129
+ `,t.start)+1,o=e.slice(a).match(/^[\t ]*/)?.[0]??``,s=`${o} `,c=`\n${s}${jo}\n${s}${r},\n${o}`;return e.slice(0,i)+c+e.slice(i)}function parseDeployConfigPaths(e){let t=e??process.env.TAILOR_PLATFORM_SDK_CONFIG_PATH;if(t===void 0)return[void 0];let n=t.split(`,`).map(e=>e.trim());if(n.some(e=>e.length===0))throw Error(`--config must contain one or more non-empty config paths.`);return n}async function buildDeploymentTarget(e){let{configPath:t,loadedConfig:n,dryRun:r,buildOnly:i,noCache:a,packageVersion:o,cacheDir:s}=e,{config:c,plugins:l}=n??await loadPreparedDeployConfig({configPath:t,dryRun:r,buildOnly:i}),u=B.dirname(c.path),d=er(`pnpm-lock.yaml`,{cwd:u})??er(`package-lock.json`,{cwd:u})??er(`yarn.lock`,{cwd:u})??er(`bun.lock`,{cwd:u}),f=createCacheManager({enabled:!a,cacheDir:s,sdkVersion:o,lockfileHash:d?_t(d):void 0}),p;l.length>0&&(p=new PluginManager(l)),await z(`build.generateUserTypes`,()=>generateUserTypes({config:c,configPath:c.path}));let m,h,g,_;try{let e=await z(`build.loadApplication`,()=>Yt({config:c,pluginManager:p,bundleCache:f.bundleCache}));m=e.application,h=e.workflowBuildResult,g=e.httpAdapterBuildResult,_=e.bundledScripts}finally{f.finalize()}return{config:c,application:m,workflowBuildResult:h,httpAdapterBuildResult:g,bundledScripts:_}}function resolveExistingConfigPath(e){let t=loadConfigPath(e);if(!t)return;let n=B.resolve(process.cwd(),t);return W.existsSync(n)?n:void 0}async function prepareDeployConfigs(e){let{configPaths:t,dryRun:n,buildOnly:r}=e,i=new Set(t.map(resolveExistingConfigPath).filter(e=>e!==void 0));await Promise.all([...i].map(e=>z(`build.prepareConfig`,()=>ensureConfigIdForDeploy({configPath:e,dryRun:n,buildOnly:r}))))}async function loadPreparedDeployConfig(e){return z(`build.loadConfig`,async()=>{let{configPath:t,buildOnly:n}=e,r=await loadConfig(t);return n||warnMissingAppId(r.config.id),r})}async function loadDeployConfigs(e){return await prepareDeployConfigs(e),Promise.all(e.configPaths.map(t=>loadPreparedDeployConfig({...e,configPath:t})))}async function buildDeploymentTargets(e){let{configPaths:t,loadedConfigs:n,buildTarget:r,...i}=e;if(n!==void 0&&(n.length!==t.length||t.some((e,t)=>n[t]===void 0)))throw Error(`loadedConfigs must contain exactly one entry for every configPath`);r===void 0&&n===void 0&&await prepareDeployConfigs({configPaths:t,dryRun:e.dryRun,buildOnly:e.buildOnly});let a=r??buildDeploymentTarget;return Promise.all(t.map((e,t)=>a({...i,configPath:e,loadedConfig:n?.[t]})))}function addPossiblyAmbiguousNamespace(e,t,n){if(e.has(t)){e.get(t)!==n&&e.set(t,void 0);return}e.set(t,n)}function collectVisibleResources(e){let{application:t,applications:n,visibleKeysOf:r,resourcesOf:i,createResult:a,addResource:o}=e,s=r(t),c=a();for(let e of n)for(let t of i(e))s.has(t.visibilityKey)&&o(c,t.resourceKey,t.visibilityKey);return c}function collectApplicationTailorDBNamespaces(e){return new Set([...e.tailorDBServices.map(e=>e.namespace),...e.externalTailorDBNamespaces])}function*tailorDBTypeResources(e){for(let t of e.tailorDBServices)for(let e of Object.keys(t.types))yield{visibilityKey:t.namespace,resourceKey:e}}function collectVisibleTailorDBTypeNamespaces(e,t){return collectVisibleResources({application:e,applications:t,visibleKeysOf:collectApplicationTailorDBNamespaces,resourcesOf:tailorDBTypeResources,createResult:()=>new Map,addResource:addPossiblyAmbiguousNamespace})}function collectApplicationResolverNamespaces(e){return new Set(e.subgraphs.filter(e=>e.Type===`pipeline`).map(e=>e.Name))}function*idpNameResources(e){for(let t of collectApplicationIdpNames(e))yield{visibilityKey:t,resourceKey:t}}function collectVisibleIdpNames(e,t){return collectVisibleResources({application:e,applications:t,visibleKeysOf:collectApplicationIdpNames,resourcesOf:idpNameResources,createResult:()=>new Set,addResource:(e,t)=>{e.add(t)}})}function*resolverResources(e){for(let t of e.resolverServices)for(let e of Object.values(t.resolvers))yield{visibilityKey:t.namespace,resourceKey:e.name}}function collectVisibleResolverNamespaces(e,t){return collectVisibleResources({application:e,applications:t,visibleKeysOf:collectApplicationResolverNamespaces,resourcesOf:resolverResources,createResult:()=>new Map,addResource:addPossiblyAmbiguousNamespace})}function subscribedIdpName(e,t){if(t.idp!=null)return t.idp;let n=collectApplicationIdpNames(e);if(n.size!==1)return;let[r]=n;return r}function missingOwnerMessage(e,t,n){let r=`Executor "${e}" subscribes to ${t.resource}, which no config in this deploy declares.`,i=t.externalHint(n);return i?`${r} This config declares ${i}, so add the config that owns it to --config.`:t.trigger.kind===`workflowExecution`||t.trigger.kind===`workflowJobExecution`?`${r} A workflow has no "external" declaration, unlike a TailorDB namespace or resolver, so nothing in this config points at the one that owns it. Check the name, or add the config that declares the workflow to --config.`:`${r} This config declares nothing external that could hold it, so check the name.`}function collectEventSubscriptions(e){let t=[],n=e.map(e=>e.application);for(let r of e){let i=r.application.executorService?.executors??{},a=collectSubscriberVisibility(r,n);for(let n of Object.values(i)){let i=eventSourceLookup(n,r,a);if(!i)continue;let o={subscriber:r,executorName:n.name,resource:i.resource,disabled:!subscribesToEvents(n),trigger:i.trigger};if(i.declaredBy(r)){t.push({...o,owner:r,pinned:i.pinned(r),key:i.keyIn(r)});continue}let s=e.filter(e=>e.config.path!==r.config.path&&i.declaredBy(e)),c=i.narrowOwners(s);if(c===`ambiguous`)continue;let[l]=c;if(!l)throw Error(missingOwnerMessage(n.name,i,r));t.push({...o,owner:l,pinned:i.pinned(l),key:i.keyIn(l)})}}return t}function subscribedResourceKeys(e,t){return new Set(publishingSubscriptions(ownedSubscriptions(e,t)).flatMap(e=>e.key??[]))}function ownedSubscriptions(e,t){return e.filter(e=>e.owner.config.path===t.config.path)}function publishingSubscriptions(e){return e.filter(e=>!e.disabled)}function subscribedTailorDBTables(e){return new Set(publishingSubscriptions(e).flatMap(e=>e.trigger.kind===`tailordb`?[e.trigger.tableName]:[]))}function subscribedResolvers(e){return new Set(publishingSubscriptions(e).flatMap(e=>e.trigger.kind===`resolverExecuted`?[e.trigger.resolverName]:[]))}function subscribedIdps(e){return new Set(publishingSubscriptions(e).flatMap(e=>e.trigger.kind===`idpUser`?[subscribedIdpName(e.subscriber.application,e.trigger)??[]].flat():[]))}function subscribedWorkflows(e){let t={workflowNames:new Set},n={workflowNames:new Set};for(let{trigger:r}of publishingSubscriptions(e))r.kind===`workflowExecution`?t.workflowNames.add(r.workflowName):r.kind===`workflowJobExecution`&&n.workflowNames.add(r.workflowName);return{execution:t,jobExecution:n}}function collectDependentApps(e){let t=new Map;for(let{subscriber:n,owner:r,pinned:i,key:a}of publishingSubscriptions(e)){if(n.config.path===r.config.path||i||a===void 0)continue;let e=n.application.id;if(e===void 0)continue;let o=t.get(a)??new Map;o.set(e,`publish-events`),t.set(a,o)}return t}function collectWorkflowJobPublishEvents(e){let t=new Map;for(let n of e.application.workflowService?.jobs??[])n.publishEvents!==void 0&&t.set(n.name,n.publishEvents);return t}function collectSubscriberVisibility(e,t){return{tailorDBTypes:collectVisibleTailorDBTypeNamespaces(e.application,t),resolvers:collectVisibleResolverNamespaces(e.application,t),idps:collectVisibleIdpNames(e.application,t)}}function externalTailorDBNamespaces(e){return e.application.externalTailorDBNamespaces}function externalSubgraphNames(e,t,n){return e.application.subgraphs.filter(e=>e.Type===t&&!n.has(e.Name)).map(e=>e.Name)}function externalResolverNamespaces(e){return externalSubgraphNames(e,`pipeline`,new Set(e.application.resolverServices.map(e=>e.namespace)))}function externalIdpNames(e){return externalSubgraphNames(e,`idp`,new Set(e.application.idpServices.map(e=>e.name)))}function describeExternal(e,t){if(t.length!==0)return`external ${t.length===1?e:`${e}s`} ${t.map(e=>`"${e}"`).join(`, `)}`}function declaresTailorDBType(e,t){return e.application.tailorDBServices.some(e=>e.types[t])||void 0}function declaresResolver(e,t){return e.application.resolverServices.some(e=>Object.values(e.resolvers).some(e=>e.name===t))||void 0}function declaresIdp(e,t){return e.application.idpServices.some(e=>e.name===t)||void 0}function declaresWorkflow(e,t){return Object.values(e.application.workflowService?.workflows??{}).some(e=>e.name===t)||void 0}function pinsTailorDBType(e,t){for(let n of e.application.tailorDBServices){let e=n.types[t];if(e)return e.settings.publishEvents!==void 0}return!1}function pinsResolverIn(e,t,n){return e.application.resolverServices.some(e=>e.namespace===t&&Object.values(e.resolvers).some(e=>e.name===n&&e.publishEvents!==void 0))}function pinsIdp(e,t){return e.application.idpServices.some(e=>e.name===t&&e.publishEvents!==void 0)}function pinsWorkflow(e,t){return Object.values(e.application.workflowService?.workflows??{}).some(e=>e.name===t&&e.publishEvents!==void 0)}function pinsEveryJobOfWorkflow(e,t){let n=Object.values(e.application.workflowService?.workflows??{}).find(e=>e.name===t);if(n===void 0)return!1;let r=e.workflowBuildResult?.mainJobDeps[n.mainJob.name]??[],i=collectWorkflowJobPublishEvents(e);return r.length>0&&r.every(e=>i.has(e))}function tailorDBTypeNamespaceIn(e,t){return e.application.tailorDBServices.find(e=>e.types[t])?.namespace}function narrowByVisibleNamespace(e){let{candidates:t,visible:n,resourceKey:r,declaresIn:i}=e;if(!n.has(r))return[];let a=n.get(r);return a===void 0?`ambiguous`:t.filter(e=>i(e,a))}function declaresTailorDBTypeIn(e,t,n){return e.application.tailorDBServices.some(e=>e.namespace===t&&!!e.types[n])}function declaresResolverIn(e,t,n){return e.application.resolverServices.some(e=>e.namespace===t&&Object.values(e.resolvers).some(e=>e.name===n))}function eventSourceLookup(e,t,n){let{trigger:r}=e;switch(r.kind){case`tailordb`:return{resource:Mi.tailorDBType(r.tableName).resource,trigger:r,declaredBy:e=>declaresTailorDBType(e,r.tableName),pinned:e=>pinsTailorDBType(e,r.tableName),keyIn:e=>{let t=tailorDBTypeNamespaceIn(e,r.tableName);return t&&Q.tailorDBType(t,r.tableName)},narrowOwners:e=>narrowByVisibleNamespace({candidates:e,visible:n.tailorDBTypes,resourceKey:r.tableName,declaresIn:(e,t)=>declaresTailorDBTypeIn(e,t,r.tableName)}),externalHint:e=>describeExternal(`TailorDB namespace`,externalTailorDBNamespaces(e))};case`resolverExecuted`:{let e=findResolverNamespace(t.application,r.resolverName)??n.resolvers.get(r.resolverName);return{resource:Mi.resolver(r.resolverName).resource,trigger:r,declaredBy:e=>declaresResolver(e,r.resolverName),pinned:t=>e!==void 0&&pinsResolverIn(t,e,r.resolverName),keyIn:()=>e&&Q.resolver(e,r.resolverName),narrowOwners:e=>narrowByVisibleNamespace({candidates:e,visible:n.resolvers,resourceKey:r.resolverName,declaresIn:(e,t)=>declaresResolverIn(e,t,r.resolverName)}),externalHint:e=>describeExternal(`resolver namespace`,externalResolverNamespaces(e))}}case`idpUser`:{let e=subscribedIdpName(t.application,r);return e===void 0?void 0:{resource:Mi.idpService(e).resource,trigger:r,declaredBy:t=>declaresIdp(t,e),pinned:t=>pinsIdp(t,e),keyIn:()=>Q.idp(e),narrowOwners:t=>n.idps.has(e)?t.filter(t=>declaresIdp(t,e)):[],externalHint:t=>describeExternal(`IdP`,externalIdpNames(t).filter(t=>t===e))}}case`workflowExecution`:case`workflowJobExecution`:return{resource:r.kind===`workflowExecution`?ji.workflow(r.workflowName):ji.workflowJobs(r.workflowName),trigger:r,declaredBy:e=>declaresWorkflow(e,r.workflowName),pinned:e=>r.kind===`workflowExecution`?pinsWorkflow(e,r.workflowName):pinsEveryJobOfWorkflow(e,r.workflowName),keyIn:()=>r.kind===`workflowExecution`?Q.workflow(r.workflowName):Q.workflowJobs(r.workflowName),narrowOwners:e=>e.filter(e=>declaresWorkflow(e,r.workflowName)),externalHint:()=>void 0};default:return}}function assertRecordableDependencies(e,t){for(let{subscriber:n,owner:r,executorName:i,resource:a,pinned:o}of publishingSubscriptions(e)){if(n.config.path===r.config.path||o||!t)continue;let e=n.application.id;if(e!==void 0&&dependedByAppLabelKey(e)!==void 0)continue;let s=e===void 0?`${n.config.path} resolves without an "id" — a config that re-exports defineConfig() from another file never gets one`:`${n.config.path} resolves to the id "${e}", which is not the lowercase UUID deploy writes`,c=e===void 0?`Call defineConfig() inline in ${n.config.path} so deploy can manage its "id".`:`Restore the generated value in ${n.config.path}'s "id".`;throw Error(`Executor "${i}" in ${n.config.path} subscribes to ${a} in ${r.config.path}, which would enable event publishing on it for this deploy only. ${s} — so deploy cannot record which config the dependency belongs to, and deploying ${r.config.path} alone later would turn publishing back off without asking.\n\n${c}`)}}function computeRenamedAppDeletions(e){let{conflicts:t,resourceOwners:n,protectedAppNames:r}=e;return[...new Set(t.map(e=>e.currentOwner))].filter(e=>!n.has(e)&&!r.has(e))}function assertUniqueGlobalResourceNames(e){for(let t of Mo){let n=new Set;for(let r of e)for(let e of t.namesOf(r)){if(n.has(e))throw Error(`Duplicate ${t.resourceLabel} name "${e}" across config files. ${t.resourceLabel} names must be unique across all configs in a single deploy.`);n.add(e)}}}function ownershipTrackedPlans(e){return Object.values(e)}function collectOwnerConflicts(e){return ownershipTrackedPlans(e).flatMap(e=>e.conflicts)}function collectUnmanagedResources(e){return ownershipTrackedPlans(e).flatMap(e=>e.unmanaged)}function collectResourceOwners(e){return new Set(ownershipTrackedPlans(e).flatMap(e=>[...e.resourceOwners]))}function collectImportantResourceDeletions(e){let t=[];for(let n of e.tailorDB.changeSet.type.deletes)t.push({resourceType:`TailorDB table`,resourceName:n.name});for(let n of e.staticWebsite.changeSet.deletes)t.push({resourceType:`StaticWebsite`,resourceName:n.name});for(let n of e.aiGateway.changeSet.deletes)t.push({resourceType:`AIGateway`,resourceName:n.name});for(let n of e.auth.changeSet.oauth2Client.deletes)t.push({resourceType:`OAuth2 client`,resourceName:n.name});for(let n of e.auth.changeSet.oauth2Client.replaces)t.push({resourceType:`OAuth2 client (client type change)`,resourceName:n.name});for(let n of e.auth.changeSet.connection.deletes)t.push({resourceType:`Auth connection`,resourceName:n.name});for(let n of e.secretManager.vaultChangeSet.deletes)t.push({resourceType:`Secret Manager vault`,resourceName:n.name});for(let n of e.secretManager.secretChangeSet.deletes)t.push({resourceType:`Secret Manager secret`,resourceName:n.name});return t}function readResourceField(e,t){let n=e;for(let e of[`request`,`deleteRequest`,`createRequest`]){let r=n[e];if(r&&typeof r==`object`&&t in r){let e=r[t];return e==null?void 0:String(e)}}let r=n[t];return r==null?void 0:String(r)}function managedResourceName(e,t){return e.getName?e.getName(t):t.name}function managedResourceKey(e,t){let n=e.namespaceFields?.map(e=>readResourceField(t,e)).find(e=>e!==void 0),r=managedResourceName(e,t);return n===void 0?`${e.resourceType}:${r}`:`${e.resourceType}:${n}:${r}`}function managedNamespaceOwnerKey(e,t){if(!e.namespaceOwnerResourceType)return;let n=e.namespaceFields?.map(e=>readResourceField(t,e)).find(e=>e!==void 0);return n===void 0?void 0:`${e.namespaceOwnerResourceType}:${n}`}function addManagedResourceClaims(e,t,n){e.add(managedResourceKey(t,n));let r=managedNamespaceOwnerKey(t,n);r&&e.add(r)}function isManagedResourceClaimed(e,t,n){if(e.has(managedResourceKey(t,n)))return!0;let r=managedNamespaceOwnerKey(t,n);return r?e.has(r):!1}function retainDeletesNotClaimed(e,t){let n=0;for(let r of e.changeSet.deletes){if(isManagedResourceClaimed(t,e,r)){M.debug(`Skipping delete of ${managedResourceKey(e,r)}: still managed by another config in this deploy.`);continue}e.changeSet.deletes[n]=r,n+=1}e.changeSet.deletes.length=n}function workflowJobFunctionItems(e){let t=new Set;for(let n of e){let e=n.usedJobNames;if(Array.isArray(e))for(let n of e)typeof n==`string`&&t.add(n)}return[...t].map(e=>({name:e}))}function workflowJobFunctionResourceGroup(e){return{changeSet:{creates:workflowJobFunctionItems(e.workflow.changeSet.creates),updates:workflowJobFunctionItems(e.workflow.changeSet.updates),replaces:workflowJobFunctionItems(e.workflow.changeSet.replaces),unchanged:[...e.workflow.unchangedWorkflowJobNames].map(e=>({name:e})),deletes:e.workflow.jobFunctionDeletes},resourceType:`workflow_job_function`,getName:e=>`jobFunctionName`in e?e.jobFunctionName:e.name}}const $=[`namespaceName`,`authNamespace`,`vaultName`,`staticWebsiteName`],Mo=[{resourceLabel:`Application`,resourceType:`application`,namesOf:e=>[e.application.name],changeSetOf:e=>e.app},{resourceLabel:`Executor`,resourceType:`executor`,namesOf:e=>Object.values(e.application.executorService?.executors??{}).map(e=>e.name),changeSetOf:e=>e.executor.changeSet},{resourceLabel:`Workflow job`,resourceType:`workflow_job_function`,namesOf:e=>e.bundledScripts.workflowJobs.keys(),changeSetOf:e=>workflowJobFunctionResourceGroup(e).changeSet,getName:e=>`jobFunctionName`in e?e.jobFunctionName:e.name},{resourceLabel:`Workflow`,resourceType:`workflow`,namesOf:e=>Object.values(e.application.workflowService?.workflows??{}).map(e=>e.name),changeSetOf:e=>e.workflow.changeSet},{resourceLabel:`Workflow execution policy`,resourceType:`workflow_job_function_execution_policy`,namesOf:e=>Object.values(e.config.workflow?.executionPolicies??{}).map(e=>e.name),changeSetOf:e=>e.workflowExecutionPolicy.changeSet},{resourceLabel:`Auth connection`,resourceType:`auth.connection`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`,namesOf:e=>Object.keys(e.application.authService?.connections??{}),changeSetOf:e=>e.auth.changeSet.connection},{resourceLabel:`StaticWebsite`,resourceType:`staticwebsite`,namesOf:e=>e.application.staticWebsiteServices.map(e=>e.name),changeSetOf:e=>e.staticWebsite.changeSet},{resourceLabel:`TailorDB namespace`,resourceType:`tailordb.service`,namesOf:e=>e.application.tailorDBServices.map(e=>e.namespace),changeSetOf:e=>e.tailorDB.changeSet.service},{resourceLabel:`Auth namespace`,resourceType:`auth.service`,namesOf:e=>{let t=e.application.authService?.config.name;return t===void 0?[]:[t]},changeSetOf:e=>e.auth.changeSet.service},{resourceLabel:`IdP namespace`,resourceType:`idp.service`,namesOf:e=>e.application.idpServices.map(e=>e.name),changeSetOf:e=>e.idp.changeSet.service},{resourceLabel:`Resolver namespace`,resourceType:`pipeline.service`,namesOf:e=>e.application.resolverServices.map(e=>e.namespace),changeSetOf:e=>e.pipeline.changeSet.service},{resourceLabel:`AIGateway`,resourceType:`aigateway`,namesOf:e=>e.application.aiGatewayServices.map(e=>e.name),changeSetOf:e=>e.aiGateway.changeSet},{resourceLabel:`Secret Manager vault`,resourceType:`secret.vault`,namesOf:e=>e.application.secrets.map(e=>e.vaultName),changeSetOf:e=>e.secretManager.vaultChangeSet}];function managedResourceGroupFromDefinition(e,t){let{changeSetOf:n,namesOf:r,resourceLabel:i,...a}=e;return{...a,changeSet:n(t)}}function managedResourceGroups(e){return[{changeSet:e.functionRegistry.changeSet,resourceType:`function_registry`},...Mo.map(t=>managedResourceGroupFromDefinition(t,e)),{changeSet:e.tailorDB.changeSet.type,resourceType:`tailordb.type`,namespaceFields:$,namespaceOwnerResourceType:`tailordb.service`},{changeSet:e.tailorDB.changeSet.gqlPermission,resourceType:`tailordb.gql_permission`,namespaceFields:$,namespaceOwnerResourceType:`tailordb.service`},{changeSet:e.staticWebsite.customDomainChangeSet,resourceType:`staticwebsite.custom_domain`,namespaceFields:$,namespaceOwnerResourceType:`staticwebsite`},{changeSet:e.idp.changeSet.client,resourceType:`idp.client`,namespaceFields:$,namespaceOwnerResourceType:`idp.service`},{changeSet:e.auth.changeSet.idpConfig,resourceType:`auth.idp_config`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.userProfileConfig,resourceType:`auth.user_profile_config`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.tenantConfig,resourceType:`auth.tenant_config`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.machineUser,resourceType:`auth.machine_user`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.oauth2Client,resourceType:`auth.oauth2_client`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.authHook,resourceType:`auth.hook`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.scim,resourceType:`auth.scim`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.auth.changeSet.scimResource,resourceType:`auth.scim_resource`,namespaceFields:$,namespaceOwnerResourceType:`auth.service`},{changeSet:e.pipeline.changeSet.resolver,resourceType:`pipeline.resolver`,namespaceFields:$,namespaceOwnerResourceType:`pipeline.service`},{changeSet:e.secretManager.secretChangeSet,resourceType:`secret.secret`,namespaceFields:$,namespaceOwnerResourceType:`secret.vault`}]}function dropCrossDeploymentManagedDeletes(e){let t=e.map(e=>managedResourceGroups(deploymentPlanResults(e))),n=t.map(e=>e.reduce((e,t)=>{for(let n of[...t.changeSet.creates,...t.changeSet.updates,...t.changeSet.replaces,...t.changeSet.unchanged])addManagedResourceClaims(e,t,n);return e},new Set));t.forEach((e,t)=>{let r=new Set;n.forEach((e,n)=>{if(n!==t)for(let t of e)r.add(t)});for(let t of e)retainDeletesNotClaimed(t,r)})}function collectDeploymentResourceOwners(e){let t=new Set;for(let n of e)for(let e of collectResourceOwners(deploymentPlanResults(n)))t.add(e);return t}function ownershipFilters(e){let t=new Map;for(let n of e)if(t.set(`${yi}\0${n.name}`,{[yi]:n.name}),n.id){let e=sdkAppIdLabelValue(n.id);t.set(`${xi}\0${e}`,{[xi]:e})}return[...t.values()]}async function createMetadataLookupClient(e){let{client:t,workspaceId:n,applications:r}=e,i=await Promise.all(ownershipFilters(r).map(e=>P(async(r,i)=>{let{results:a,nextPageToken:o}=await t.listMetadata({workspaceId:n,labels:e,pageToken:r,pageSize:i});return[a,o]}))),a=new Map;for(let e of i.flat())e.metadata&&a.set(e.trn,e.metadata);let o=new Map,getMetadata=(e,n)=>{let r=a.get(e.trn??``);if(r)return Promise.resolve(U(ne,{metadata:r}));let i=e.trn??``,s=o.get(i);return s||(s=t.getMetadata(e,n),o.set(i,s)),s};return new Proxy(t,{get(e,t,n){return t===`getMetadata`?getMetadata:Reflect.get(e,t,n)}})}function buildPlanReport(e){let t=formatExecutorChangeEntries(e.executor.changeSet,buildPlannedExecutorsByName(e.executor.changeSet),e.functionRegistry.executorFunctionChanges),n=formatResolverChangeEntries(e.pipeline.changeSet.resolver,e.functionRegistry.resolverFunctionChanges),r=formatWorkflowChangeEntries(e.workflow.changeSet,e.functionRegistry.workflowJobChanges),i=formatChangeSetEntries(e.workflowExecutionPolicy.changeSet,[`executionPolicy`]),a=formatAuthHookChangeEntries(e.auth.changeSet.authHook,e.functionRegistry.authHookFunctionChanges),o=formatTailorDBResourceChangeEntries(e.tailorDB.changeSet.type,e.tailorDB.changeSet.gqlPermission),s=e.tailorDB.context.checkpointRepairs.map(e=>({action:`update`,symbol:Ai.update,name:`migration checkpoint ${formatMigrationNumber(e.from)} → ${formatMigrationNumber(e.to)}`,labels:[`migrationCheckpoint`],namespace:e.namespace})),c=[...o,...s],l=[...n],namespaceOf=e=>{if(`request`in e&&e.request&&typeof e.request==`object`&&`namespaceName`in e.request)return e.request.namespaceName;if(`namespaceName`in e)return e.namespaceName},authNamespaceOf=e=>`request`in e&&e.request&&typeof e.request==`object`&&`authNamespace`in e.request?e.request.authNamespace:void 0,u=[...formatChangeSetEntries(e.idp.changeSet.client,[`client`],namespaceOf)],d=[...formatChangeSetEntries(e.auth.changeSet.idpConfig,[`idpConfig`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.userProfileConfig,[`userProfileConfig`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.tenantConfig,[`tenantConfig`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.machineUser,[`machineUser`],authNamespaceOf),...a,...formatChangeSetEntries(e.auth.changeSet.oauth2Client,[`oauth2Client`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.scim,[`scimConfig`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.scimResource,[`scimResource`],namespaceOf),...formatChangeSetEntries(e.auth.changeSet.connection,[`connection`],namespaceOf)],{otherChanges:f}=splitFunctionRegistryChanges(e.functionRegistry.changeSet),p=extractServiceActions(e.tailorDB.changeSet.service),m=extractServiceActions(e.pipeline.changeSet.service),h=extractServiceActions(e.idp.changeSet.service),g=extractServiceActions(e.auth.changeSet.service),_=[...c,...l,...t,...r,...i,...u,...d],v=summarizePlanResults(e,_,[...p,...m,...h,...g]),y=[...e.functionRegistry.unmanaged,...e.tailorDB.unmanaged,...e.staticWebsite.unmanaged,...e.aiGateway.unmanaged,...e.idp.unmanaged,...e.auth.unmanaged,...e.pipeline.unmanaged,...e.executor.unmanaged,...e.workflow.unmanaged,...e.secretManager.unmanaged],b=[...e.functionRegistry.conflicts,...e.tailorDB.conflicts,...e.staticWebsite.conflicts,...e.aiGateway.conflicts,...e.idp.conflicts,...e.auth.conflicts,...e.pipeline.conflicts,...e.executor.conflicts,...e.workflow.conflicts,...e.secretManager.conflicts],x=[..._,...p.map(({action:e,name:t})=>({action:e,name:t,labels:[`tailorDB`],namespace:void 0})),...m.map(({action:e,name:t})=>({action:e,name:t,labels:[`pipeline`],namespace:void 0})),...h.map(({action:e,name:t})=>({action:e,name:t,labels:[`idp`],namespace:void 0})),...g.map(({action:e,name:t})=>({action:e,name:t,labels:[`auth`],namespace:void 0})),...formatChangeSetEntries(f),...formatChangeSetEntries(e.staticWebsite.changeSet,[`staticWebsite`]),...formatChangeSetEntries(e.staticWebsite.customDomainChangeSet,[`customDomain`]),...formatChangeSetEntries(e.aiGateway.changeSet,[`aiGateway`]),...formatChangeSetEntries(e.app,[`application`]),...formatChangeSetEntries(e.secretManager.vaultChangeSet,[`vault`]),...formatChangeSetEntries(e.secretManager.secretChangeSet,[`secret`])].map(({action:e,name:t,labels:n,namespace:r})=>({action:e,name:t,labels:n,namespace:r})),S=[...y.map(({resourceType:e,resourceName:t})=>({type:`unmanaged`,resourceType:e,name:t})),...e.secretManager.skippedSecrets.map(e=>({type:`skippedSecret`,resourceType:`secret`,name:e}))],C=b.map(({resourceType:e,resourceName:t,currentOwner:n})=>({resourceType:e,name:t,currentOwner:n})),w=[...buildGroupedDisplayLines(e.functionRegistry.changeSet.title,formatChangeSetEntries(f)),...e.staticWebsite.changeSet.lines(),...e.staticWebsite.customDomainChangeSet.lines(),...e.aiGateway.changeSet.lines(),...e.app.lines(),...buildGroupedDisplayLines(`TailorDB`,c,p),...buildGroupedDisplayLines(`Resolver`,l,m),...buildGroupedDisplayLines(`Executor`,t),...buildGroupedDisplayLines(`Workflow`,r),...buildGroupedDisplayLines(`IdP`,u,h),...buildGroupedDisplayLines(`Auth`,d,g),...e.secretManager.vaultChangeSet.lines(),...e.secretManager.secretChangeSet.lines()];if(y.length>0){w.push(N.bold(`Unmanaged resources (not in config):`));for(let{resourceType:e,resourceName:t}of y)w.push(` ${N.warning(`⚠`)} ${N.bold(e)} "${t}"`)}if(e.secretManager.skippedSecrets.length>0){w.push(N.bold(`Secret Manager secrets (skipped - no value provided):`));for(let t of e.secretManager.skippedSecrets)w.push(` ${N.dim(`○`)} ${t}`)}if(b.length>0){w.push(N.bold(`Owner conflicts (will require confirmation on apply):`));for(let{resourceType:e,resourceName:t,currentOwner:n}of b)w.push(` ${N.warning(`!`)} ${N.bold(e)} "${t}" — owned by "${n}"`)}return w.push(formatPlanSummary(v)),{summary:v,json:{summary:v,changes:x,warnings:S,conflicts:C},lines:w}}function printPlanResults(e,t){let n=buildPlanReport(e);if(M.jsonMode&&t?.dryRun)return M.out(n.json),n.summary;let r=n.lines.join(`
130
+ `);return t?.dryRun?M.out(r):M.log(r),n.summary}function summarizePlanResults(e,t,n){let r={create:0,update:0,delete:0,replace:0};for(let e of t)r[e.action]+=1;for(let e of n)r[e.action]+=1;let{otherChanges:i}=splitFunctionRegistryChanges(e.functionRegistry.changeSet),a=summarizeChangeSets([i,e.staticWebsite.changeSet,e.staticWebsite.customDomainChangeSet,e.aiGateway.changeSet,e.app,e.secretManager.vaultChangeSet,e.secretManager.secretChangeSet]);return r.create+=a.create,r.update+=a.update,r.delete+=a.delete,r.replace+=a.replace,r}function sumPlanSummaries(e){return e.reduce((e,t)=>({create:e.create+t.create,update:e.update+t.update,delete:e.delete+t.delete,replace:e.replace+t.replace}),{create:0,update:0,delete:0,replace:0})}function printDeploymentPlans(e,t){if(M.jsonMode&&t?.dryRun){let t=e.map(e=>buildPlanReport(deploymentPlanResults(e))),n=sumPlanSummaries(t.map(e=>e.summary));return M.out({summary:n,changes:t.flatMap(e=>e.json.changes),warnings:t.flatMap(e=>e.json.warnings),conflicts:t.flatMap(e=>e.json.conflicts)}),n}return sumPlanSummaries(e.map(e=>printPlanResults(deploymentPlanResults(e),t)))}const No=new Map;function validatorFor(e){let t=No.get(e.typeName);if(t)return t;let n=yr({registry:Rn(e,...vr(e))});return No.set(e.typeName,n),n}function validateItems(e){let{schema:t,kind:n,action:r,items:i,requestKey:a,violations:o}=e;if(i.length===0)return;let s=validatorFor(t);for(let e of i){let i=e[a],c=U(t,i),l=s.validate(t,c);if(l.kind===`invalid`)for(let t of l.violations)o.push({kind:n,name:e.name,action:r,fieldPath:t.field.length>0?_r(t.field):`(message)`,message:t.message});else l.kind===`error`&&M.warn(`Could not validate ${n} "${e.name}" (${r}): ${l.error.message}`)}}async function validatePlan(e){let{tailorDB:t,staticWebsite:n,aiGateway:r,idp:o,auth:c,pipeline:l,app:u,executor:f,workflow:p,workflowExecutionPolicy:m,secretManager:h}=e,g=[];function creates(e,t,n){validateItems({schema:e,kind:t,action:`create`,items:n,requestKey:`request`,violations:g})}function updates(e,t,n){validateItems({schema:e,kind:t,action:`update`,items:n,requestKey:`request`,violations:g})}function replaces(e,t,n){validateItems({schema:e,kind:t,action:`replace`,items:n,requestKey:`createRequest`,violations:g})}function inPlaceReplaces(e,t,n){validateItems({schema:e,kind:t,action:`replace`,items:n,requestKey:`updateRequest`,violations:g})}creates(Se,`TailorDB service`,t.changeSet.service.creates),creates(Te,`TailorDB table`,t.changeSet.type.creates),updates(He,`TailorDB table`,t.changeSet.type.updates),creates(a,`StaticWebsite`,n.changeSet.creates),updates(nt,`StaticWebsite`,n.changeSet.updates),creates(ie,`StaticWebsite custom domain`,n.customDomainChangeSet.creates),creates(me,`AIGateway`,r.changeSet.creates.map(e=>({name:e.name,request:{...e.request,cors:void 0}}))),updates(fe,`AIGateway`,r.changeSet.updates.map(e=>({name:e.name,request:{...e.request,cors:void 0}})));let substituteIdpReturnOrigins=e=>{let t=e.request,n=t.userAuthPolicy?.allowedReturnOrigins;if(!Array.isArray(n)||n.length===0)return e;let r=n.map(e=>typeof e==`string`&&/^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]:url$/.test(e)?`https://placeholder.invalid`:e);return{...e,request:{...t,userAuthPolicy:{...t.userAuthPolicy,allowedReturnOrigins:r}}}};creates(i,`IdP service`,o.changeSet.service.creates.map(substituteIdpReturnOrigins)),updates(ce,`IdP service`,o.changeSet.service.updates.map(substituteIdpReturnOrigins));let _=[...o.changeSet.client.creates.map(e=>({clientName:e.request.client?.name??``,namespaceName:e.request.namespaceName??``,workspaceId:e.request.workspaceId??``})),...o.changeSet.client.updates.map(e=>({clientName:e.name,namespaceName:e.namespaceName,workspaceId:e.workspaceId}))];creates(S,`IdP client secret`,_.map(e=>({name:e.clientName,request:{workspaceId:e.workspaceId,secretmanagerVaultName:idpClientVaultName(e.namespaceName,e.clientName)}}))),creates(s,`IdP client secret`,_.map(e=>({name:e.clientName,request:{workspaceId:e.workspaceId,secretmanagerVaultName:idpClientVaultName(e.namespaceName,e.clientName),secretmanagerSecretName:idpClientSecretName(e.namespaceName,e.clientName)}}))),creates(Ie,`Auth service`,c.changeSet.service.creates),updates(ot,`Auth service`,c.changeSet.service.updates),creates(je,`Auth IDP config`,c.changeSet.idpConfig.creates),updates(Le,`Auth IDP config`,c.changeSet.idpConfig.updates),creates(Ce,`Auth user profile config`,c.changeSet.userProfileConfig.creates),updates(at,`Auth user profile config`,c.changeSet.userProfileConfig.updates),creates($e,`Auth tenant config`,c.changeSet.tenantConfig.creates),updates(be,`Auth tenant config`,c.changeSet.tenantConfig.updates),creates(ve,`Auth machine user`,c.changeSet.machineUser.creates),updates(ke,`Auth machine user`,c.changeSet.machineUser.updates),creates(qe,`Auth hook`,c.changeSet.authHook.creates),updates(Ue,`Auth hook`,c.changeSet.authHook.updates),creates(Ye,`Auth SCIM config`,c.changeSet.scim.creates),updates(ge,`Auth SCIM config`,c.changeSet.scim.updates),creates(xe,`Auth SCIM resource`,c.changeSet.scimResource.creates),updates(tt,`Auth SCIM resource`,c.changeSet.scimResource.updates),creates(Ve,`OAuth2 client`,c.changeSet.oauth2Client.creates),updates(Oe,`OAuth2 client`,c.changeSet.oauth2Client.updates),replaces(Ve,`OAuth2 client`,c.changeSet.oauth2Client.replaces),creates(v,`Pipeline service`,l.changeSet.service.creates),updates(w,`Pipeline service`,l.changeSet.service.updates),creates(Me,`Resolver`,l.changeSet.resolver.creates),updates(b,`Resolver`,l.changeSet.resolver.updates),creates(pe,`Executor`,f.changeSet.creates),updates(de,`Executor`,f.changeSet.updates),creates(_e,`Workflow`,p.changeSet.creates.map(e=>({name:e.name,request:buildWorkflowValidationShape(e.workspaceId,e.workflow)}))),updates(Je,`Workflow`,p.changeSet.updates.map(e=>({name:e.name,request:buildWorkflowValidationShape(e.workspaceId,e.workflow)})));let y=p.changeSet.creates[0]?.workspaceId??p.changeSet.updates[0]?.workspaceId??``;if(y){let e=new Set;for(let t of[...p.changeSet.creates,...p.changeSet.updates])for(let n of t.usedJobNames)e.add(n);for(let t of p.unchangedWorkflowJobNames)e.add(t);creates(Ae,`Workflow job function`,[...e].map(e=>({name:e,request:{workspaceId:y,jobFunctionName:e,scriptRef:e}})))}if(creates(Ge,`Workflow execution policy`,[...m.changeSet.creates,...m.changeSet.replaces].map(e=>({name:e.name,request:{workspaceId:e.workspaceId,executionPolicyName:e.policy.name,executionPolicyKey:toPlatformExecutionPolicyKey(e.policy),...e.policy.concurrencyPolicy&&{concurrencyPolicy:{maxConcurrentExecutions:e.policy.concurrencyPolicy.maxConcurrentExecutions}}}}))),updates(Be,`Workflow execution policy`,m.changeSet.updates.map(e=>({name:e.name,request:{workspaceId:e.workspaceId,executionPolicyName:e.policy.name,...e.policy.concurrencyPolicy&&{concurrencyPolicy:{maxConcurrentExecutions:e.policy.concurrencyPolicy.maxConcurrentExecutions}}}}))),creates(S,`Secret Manager vault`,h.vaultChangeSet.creates.map(e=>({name:e.name,request:vaultCreateRequest(e)}))),creates(s,`Secret Manager secret`,h.secretChangeSet.creates.map(e=>({name:e.name,request:secretCreateRequest(e)}))),updates(Pe,`Secret Manager secret`,h.secretChangeSet.updates.map(e=>({name:e.name,request:secretUpdateRequest(e)}))),creates(se,`Application`,u.creates.map(e=>({name:e.name,request:{...e.request,cors:void 0}}))),updates(d,`Application`,[...u.updates,...u.unchanged].map(e=>({name:e.name,request:{...e.request,cors:void 0}}))),creates(ze,`Auth connection`,c.changeSet.connection.creates),inPlaceReplaces(Ee,`Auth connection`,c.changeSet.connection.replaces),g.length===0)return;let x=new Set(g.map(e=>`${e.kind}:${e.name}`));M.error(`Pre-flight validation found ${g.length} violation(s) across ${x.size} resource(s):`);for(let e of g)M.log(` ${N.resourceType(e.kind)} ${N.resourceName(e.name)} (${e.action}) — ${N.bold(e.fieldPath)}: ${e.message}`);throw Error(`${g.length} validation error(s) found in ${x.size} resource(s)`)}function formatIssues(e){return e.map(e=>e.message).join(`; `)||`Invalid options`}function parseOptions(e,t){let n=e.safeParse(t);if(!n.success)throw Error(formatIssues(n.error.issues));return n.data}const Po=H.string().min(1,`Profile must not be empty`),Fo=H.string().min(3,`Name must be at least 3 characters`).max(63,`Name must be at most 63 characters`).regex(/^[a-z0-9-]+$/,`Name can only contain lowercase letters, numbers, and hyphens`).refine(e=>!e.startsWith(`-`)&&!e.endsWith(`-`),`Name cannot start or end with a hyphen`);function validateWorkspaceName(e){let t=Fo.safeParse(e);return t.success?!0:formatIssues(t.error.issues)}function formatTimestamp(e){if(!e)return null;let t=G(e);return Number.isNaN(t.getTime())?null:t}function formatTable(e,t){return lt(e,t)}function formatKeyValueTable(e){return formatTable(e,{singleLine:!0})}function humanizeRelativeTime(e){if(e===null)return`N/A`;let t=e instanceof Date?e:new Date(e);return Number.isNaN(t.getTime())?typeof e==`string`?e:`N/A`:Xn(t,{addSuffix:!0})}const workspaceInfo=(e,t)=>{let n={id:e.id,name:e.name,region:e.region,...e.organizationId?{organizationId:e.organizationId}:{},...e.folderId?{folderId:e.folderId}:{},createdAt:formatTimestamp(e.createTime),updatedAt:formatTimestamp(e.updateTime)};return t?{...n,folderName:t}:n},workspaceDetails=(e,t)=>({...workspaceInfo(e,t),deleteProtection:e.deleteProtection,organizationId:e.organizationId,folderId:e.folderId});async function resolveWorkspaceFolderName(e,t){if(!(!t.organizationId||!t.folderId))try{return(await e.getOrganizationFolder({organizationId:t.organizationId,folderId:t.folderId})).folder?.name||void 0}catch(e){if(e instanceof q&&(e.code===K.NotFound||e.code===K.PermissionDenied))return;M.warn(`Failed to resolve workspace folder name: ${e}`);return}}function createWorkspaceFolderNameResolver(e){let t=new Map;return n=>{if(!n.organizationId||!n.folderId)return Promise.resolve(void 0);let r=`${n.organizationId}/${n.folderId}`,i=t.get(r);if(i)return i;let a=resolveWorkspaceFolderName(e,n);return t.set(r,a),a}}async function workspaceInfoWithFolderName(e,t){let n=await resolveWorkspaceFolderName(e,t);return workspaceInfo(t,n)}async function workspaceDetailsWithFolderName(e,t){let n=await resolveWorkspaceFolderName(e,t);return workspaceDetails(t,n)}async function workspaceInfosWithFolderNames(e,t){let n=createWorkspaceFolderNameResolver(e),r=rr(5);return Promise.all(t.map(e=>r(async()=>workspaceInfo(e,await n(e)))))}function workspaceDisplayName(e){return e.folderName?`${e.folderName}/${e.name}`:e.name}function createWorkspaceNameTransformer(e,t){return(n,r)=>{let i=r,a=i[e],o=i[t];return typeof a==`string`&&typeof o==`string`?workspaceDisplayName({name:a,folderName:o}):String(n??``)}}const Io=createWorkspaceNameTransformer(`name`,`folderName`),Lo=H.object({name:Fo,region:H.string(),deleteProtection:H.boolean().optional(),organizationId:H.uuid().optional(),folderId:H.uuid().optional(),profile:Po.optional()}),validateRegion=async(e,t)=>{let n=await t.listAvailableWorkspaceRegions({});if(!n.regions.includes(e))throw Error(`Region must be one of: ${n.regions.join(`, `)}.`)};function profilePlatformSettings(e){let t=e?.oauth2ClientId||process.env.TAILOR_PLATFORM_OAUTH2_CLIENT_ID,n=e?.consoleUrl??process.env.TAILOR_PLATFORM_CONSOLE_URL;return{...ft(e)?{}:{platform_url:Mt(e)},...t?{oauth2_client_id:yt(e)}:{},...n?{console_url:$t(n)}:{}}}async function createWorkspace$1(e){let t=validateCreateWorkspaceOptions(e),n=await loadAccessToken({profile:t.profile}),r=await loadPlatformClientConfig({profile:t.profile}),i=await F(n,r);return await validateRegion(t.region,i),createValidatedWorkspaceWithClient(i,t)}async function createValidatedWorkspaceWithClient(e,t){let n=await e.createWorkspace({workspaceName:t.name,workspaceRegion:t.region,deleteProtection:t.deleteProtection??!1,organizationId:t.organizationId,folderId:t.folderId});return workspaceInfoWithFolderName(e,A(n.workspace,`createWorkspace response missing workspace`))}function validateCreateWorkspaceOptions(e){return parseOptions(Lo,e)}const Ro=X({name:`create`,description:`Create a new Tailor Platform workspace.`,args:H.strictObject({name:V(H.string(),{alias:`n`,description:`Workspace name`}),region:V(H.string(),{alias:`r`,description:`Workspace region (us-west, asia-northeast)`}),"delete-protection":V(H.boolean().default(!1),{alias:`d`,description:`Enable delete protection`}),"organization-id":V(H.string().optional(),{alias:`o`,description:`Organization ID to workspace associate with`,env:`TAILOR_PLATFORM_ORGANIZATION_ID`}),"folder-id":V(H.string().optional(),{alias:`f`,description:`Folder ID to workspace associate with`,env:`TAILOR_PLATFORM_FOLDER_ID`}),"profile-name":V(H.string().optional(),{alias:`p`,description:`Profile name to create`}),profile:V(Po.optional(),{description:`Workspace profile used for authentication and Platform selection`,env:`TAILOR_PLATFORM_PROFILE`}),"profile-user":V(H.string().optional(),{description:`User email address or machine user client ID for the profile (defaults to current user)`}),permission:V(H.enum([`write`,`read`]).default(`write`),{description:`Profile permission (requires --profile-name). 'read' blocks all write commands while the profile is active.`})}),run:async e=>{await assertWritable({profile:e.profile});let t=e[`profile-name`],n;if(t){let r=await readPlatformConfig();if(r.profiles[t])throw Error(`Profile "${t}" already exists.`);let i=e.profile,a=i?r.profiles[i]:void 0,o=a?platformConfigFromProfile(a):void 0,s=e[`profile-user`]||a?.user||r.current_user;if(!s)throw Error(`Current user not found. Please login or specify --profile-user to create a profile.`);let c=resolveConfigUser(r,s,o);if(!c)throw Error(`User "${s}" not found.\nPlease verify your user name and login using 'tailor login' command.`);n={name:t,user:c,platformSettings:profilePlatformSettings(o)}}let r=await createWorkspace$1({name:e.name,region:e.region,deleteProtection:e[`delete-protection`],organizationId:e[`organization-id`],folderId:e[`folder-id`],profile:e.profile}),i;if(n){let t=await readPlatformConfig(),a=n.platformSettings;t.profiles[n.name]={user:n.user,workspace_id:r.id,...e.permission===`read`?{readonly:!0}:{},...a},writePlatformConfig(t),i={name:n.name,user:n.user,workspaceId:r.id,permission:e.permission,...a.platform_url?{platformUrl:a.platform_url}:{},...a.oauth2_client_id?{oauth2ClientId:a.oauth2_client_id}:{},...a.console_url?{consoleUrl:a.console_url}:{}},e.json||M.success(`Profile "${n.name}" created successfully.`)}if(e.json||M.success(`Workspace "${workspaceDisplayName(r)}" created successfully.`),e.json&&i){M.out({...r,profile:i});return}M.out(r,{display:{name:Io,folderName:null}}),i&&(M.out(`Profile:`),M.out(i))}});async function listWorkspaces(e){let t=Po.optional().parse(e?.profile),n=await loadAccessToken({profile:t}),r=await loadPlatformClientConfig({profile:t});return listWorkspacesWithClient(await F(n,r),e)}async function listWorkspacesWithClient(e,t){let n=toPageDirection(t?.order);return workspaceInfosWithFolderNames(e,await jt(async(t,r)=>{let{workspaces:i,nextPageToken:a}=await e.listWorkspaces({pageToken:t,pageSize:r,pageDirection:n});return[i,a]},{limit:t?.limit}))}const zo=X({name:`list`,description:`List all Tailor Platform workspaces.`,args:H.strictObject({...paginationArgs(),profile:V(Po.optional(),{description:`Workspace profile used for authentication and Platform selection`,env:`TAILOR_PLATFORM_PROFILE`})}),run:async e=>{let t=await listWorkspaces({order:e.order,limit:e.limit,profile:e.profile});M.out(t,{display:{name:Io,folderName:null,organizationId:null,folderId:null,updatedAt:null}})}}),Bo=H.object({version:H.literal(1),platformUrl:H.url(),applicationId:H.string().min(1).optional(),workspaceId:H.uuid()});function defaultConfigPath(){return Nn(process.cwd(),`tailor.config.ts`)}function contextPath(e){return Mn(jn(e),Gt(),`${An(e)}.context.json`)}async function loadWorkspaceContext(e,t=defaultConfigPath(),n){let r;try{r=await xr(contextPath(t),`utf8`)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}let i;try{i=JSON.parse(r)}catch{return}let a=Bo.safeParse(i);if(!(!a.success||a.data.platformUrl!==e||n!==void 0&&a.data.applicationId!==n))return a.data}async function saveWorkspaceContext(e,t=defaultConfigPath(),n){let r=Bo.parse({...e,...n===void 0?{}:{applicationId:n}}),i=Mn(jn(t),Gt()),a=contextPath(t),o=`${JSON.stringify(r,null,2)}\n`;try{if(await xr(a,`utf8`)===o)return}catch{}let s=`${a}.${process.pid}.${or()}.tmp`;await br(i,{recursive:!0});try{await wr(s,o,{mode:384}),await Sr(s,a)}catch(e){throw await Cr(s,{force:!0}).catch(()=>void 0),e}}function suggestedWorkspaceName(){let e=An(process.cwd()).toLowerCase().replaceAll(/[^a-z0-9-]+/g,`-`).replaceAll(/^-+|-+$/g,``).slice(0,63).replace(/-+$/,``);return validateWorkspaceName(e)===!0?e:`my-workspace`}function executableAction(e){return{command:`tailor`,args:e}}function deployArgs(e){return e.deployArgs??[`deploy`]}function workspaceCommandArgs(e){return e.workspaceCommandArgs??[]}function createDeployArgs(e,t,n){return[...deployArgs(e),`--create-workspace`,`--workspace-name`,t,`--workspace-region`,n,...e.organizationId?[`--organization-id`,e.organizationId]:[],...e.folderId?[`--folder-id`,e.folderId]:[]]}function selectDeployArgs(e){return[...deployArgs(e),`--workspace-id`,`<workspace-id>`]}function workspaceLabel(e){let t=e.organizationId??`personal`;return`${workspaceDisplayName(e)} (${e.region}, org: ${t}, id: ${e.id})`}function workspaceMatchesRequestedIdentity(e,t){return t.workspaceName===e.name&&t.workspaceRegion===e.region&&t.organizationId===e.organizationId&&t.folderId===e.folderId}function workspaceIdentity(e){let{id:t,name:n,region:r,organizationId:i,folderId:a}=e;return{id:t,name:n,region:r,organizationId:i,folderId:a}}function projectContextTargets(e){if(e)return[...new Map(e.map(e=>[e.configPath,e])).values()]}async function loadProjectContexts(e,t){let n=projectContextTargets(t);if(!n||n.length===0){let t=await loadWorkspaceContext(e);return t?[t]:[]}return(await Promise.all(n.map(({configPath:t,applicationId:n})=>loadWorkspaceContext(e,t,n)))).filter(e=>e!==void 0)}async function persistWorkspaceContext(e,t){let n=projectContextTargets(t);if(!n||n.length===0){await saveWorkspaceContext(e);return}let r=(await Promise.allSettled(n.map(({configPath:t,applicationId:n})=>saveWorkspaceContext(e,t,n)))).filter(e=>e.status===`rejected`);if(r.length>0)throw Error(r.map(({reason:e})=>e instanceof Error?e.message:String(e)).join(`; `))}async function rememberWorkspaceContext(e,t,n=`error-on-partial`){if(!t.dryRun)try{await persistWorkspaceContext(e,t.contextTargets)}catch(r){if((projectContextTargets(t.contextTargets)?.length??0)>1&&n===`error-on-partial`)throw R({code:`WORKSPACE_CONTEXT_SAVE_FAILED`,message:`The workspace selection could not be saved for every configuration file.`,details:r instanceof Error?r.message:String(r),suggestion:`Fix project state permissions, then rerun deploy with the workspace ID.`,next:executableAction([...deployArgs(t),`--workspace-id`,e.workspaceId]),context:{workspaceId:e.workspaceId,configPaths:t.contextTargets?.map(({configPath:e})=>e)}});M.warn(`Could not save the project workspace selection (${r instanceof Error?r.message:String(r)}). Continue with --workspace-id ${e.workspaceId} on later runs.`)}}async function useWorkspace(e,t,n,r,i=`error-on-partial`){return await rememberWorkspaceContext({version:1,platformUrl:t,workspaceId:n.id},r,i),M.info(`Using workspace: ${workspaceLabel(n)}`),{client:e,workspaceId:n.id}}function useRememberedWorkspace(e,t){return M.warn(`Using saved workspace selection: ${workspaceLabel(t)}`),{client:e,workspaceId:t.id}}const Vo=`create-new-workspace`;async function chooseWorkspace(e,t,n,r){let i=await Z.select({message:`Select a workspace`,choices:[...n.map(e=>({name:workspaceLabel(e),value:e.id})),{name:`Create new workspace`,value:Vo}]});if(i===Vo)return createWorkspaceForDeploy(e,t,r);let a=n.find(({id:e})=>e===i);if(!a)throw Error(`Selected workspace was not found`);return useWorkspace(e,t,a,r)}function invalidCreateOptionsError(e,t,n,r){return R({code:`WORKSPACE_CREATE_OPTIONS_INVALID`,message:`Workspace creation options are invalid.`,details:r,suggestion:`Correct the workspace creation options and rerun deploy.`,next:executableAction(createDeployArgs(e,t,n))})}async function createWorkspace(e,t,n,r,i){let a=n.workspaceName,o=n.workspaceRegion,s=canPrompt();if(s)a??=await Z.text({message:`Workspace name`,default:suggestedWorkspaceName(),validate:validateWorkspaceName}),o??=await Z.select({message:`Workspace region`,choices:r.map(e=>({name:e,value:e}))});else{let e=[...a===void 0?[`--workspace-name`]:[],...o===void 0?[`--workspace-region`]:[]];if(e.length>0)throw R({code:`WORKSPACE_CREATE_OPTIONS_REQUIRED`,message:`Workspace creation requires a name and region in non-interactive mode.`,suggestion:`Provide every workspace creation option and rerun deploy.`,next:executableAction(createDeployArgs(n,a??`<name>`,o??`<region>`)),context:{missingOptions:e}})}if(!a||!o)throw Error(`Workspace creation options were not resolved`);let c=i;if(!c){try{c=validateCreateWorkspaceOptions({name:a,region:o,organizationId:n.organizationId,folderId:n.folderId})}catch(e){throw invalidCreateOptionsError(n,a,o,e instanceof Error?e.message:String(e))}if(!r.includes(o))throw invalidCreateOptionsError(n,a,o,`Region must be one of: ${r.join(`, `)}.`)}if(s){let e=[n.organizationId?`organization: ${n.organizationId}`:void 0,n.folderId?`folder: ${n.folderId}`:void 0].filter(e=>e!==void 0);if(!await Z.confirm({message:`Create workspace "${a}" in ${o}${e.length>0?` (${e.join(`, `)})`:``}?`,default:!0}))throw R({code:`WORKSPACE_CREATION_CANCELLED`,message:`Workspace creation was cancelled.`})}let l;try{l=await createValidatedWorkspaceWithClient(e,c)}catch(e){throw e instanceof q&&![K.Canceled,K.Unknown,K.DeadlineExceeded,K.Aborted,K.Internal,K.Unavailable,K.DataLoss].includes(e.code)?e:R({code:`WORKSPACE_CREATION_FAILED`,message:`Workspace creation did not complete successfully.`,details:e instanceof Error?e.message:String(e),suggestion:`The outcome may be uncertain. List workspaces before retrying creation to avoid duplicates.`,next:executableAction([`workspace`,`list`,...workspaceCommandArgs(n),`--json`])})}return await rememberWorkspaceContext({version:1,platformUrl:t,workspaceId:l.id},n),M.success(`Created workspace: ${workspaceLabel(l)}`),M.info(`Reuse this workspace with: tailor deploy --workspace-id ${l.id}`),M.info(`Or set TAILOR_PLATFORM_WORKSPACE_ID=${l.id}.`),{client:e,workspaceId:l.id}}async function createWorkspaceForDeploy(e,t,n,r,i){let a=r??(await e.listAvailableWorkspaceRegions({})).regions;if(n.dryRun)throw R({code:`WORKSPACE_CREATION_DISABLED_IN_DRY_RUN`,message:`Dry-run cannot create the workspace required to build a deployment plan.`,suggestion:`Create a workspace explicitly, then rerun the same dry-run with its workspace ID.`,context:{availableRegions:a}});return createWorkspace(e,t,n,a,i)}async function resolveDeployWorkspace(e={}){let t=[e.workspaceName===void 0?void 0:`--workspace-name`,e.workspaceRegion===void 0?void 0:`--workspace-region`].filter(e=>e!==void 0);if(!e.createWorkspace&&t.length>0)throw R({code:`WORKSPACE_CREATE_FLAG_REQUIRED`,message:`Workspace creation options require --create-workspace.`,suggestion:`Add --create-workspace or remove the workspace creation options.`,next:executableAction(createDeployArgs(e,e.workspaceName??`<name>`,e.workspaceRegion??`<region>`)),context:{options:t}});if(e.createWorkspace&&e.workspaceName!==void 0){let t=validateWorkspaceName(e.workspaceName);if(t!==!0)throw invalidCreateOptionsError(e,e.workspaceName,e.workspaceRegion??`<region>`,t)}if(e.createWorkspace&&e.workspaceRegion===``)throw invalidCreateOptionsError(e,e.workspaceName??`<name>`,e.workspaceRegion,`Region must not be empty.`);let n=await tryLoadWorkspaceId({workspaceId:e.workspaceId,profile:e.profile}),r=await loadAccessToken({profile:e.profile}),i=await loadPlatformClientConfig({profile:e.profile,allowMissingProfile:n!==void 0}),a=Mt(i),o=await F(r,i);if(n){let t;try{t=await o.getWorkspace({workspaceId:n})}catch(e){throw e instanceof q&&e.code===K.NotFound?R({code:`WORKSPACE_NOT_FOUND`,message:`Workspace "${n}" was not found.`}):e}if(!t.workspace)throw R({code:`WORKSPACE_NOT_FOUND`,message:`Workspace "${n}" was not found.`});return useWorkspace(o,a,workspaceInfo(t.workspace),e,`warn`)}let s;if(e.createWorkspace&&e.workspaceName!==void 0&&e.workspaceRegion!==void 0)try{s=validateCreateWorkspaceOptions({name:e.workspaceName,region:e.workspaceRegion,organizationId:e.organizationId,folderId:e.folderId})}catch(t){throw invalidCreateOptionsError(e,e.workspaceName,e.workspaceRegion,t instanceof Error?t.message:String(t))}let[c,l]=await Promise.all([loadProjectContexts(a,e.contextTargets),listWorkspacesWithClient(o)]),u=canPrompt(),d=new Set(c.map(({workspaceId:e})=>e)),f=d.size===1?l.find(({id:e})=>d.has(e)):void 0;if(f&&(!e.createWorkspace||workspaceMatchesRequestedIdentity(f,e))){let t=projectContextTargets(e.contextTargets)?.length??1;return c.length===t?useRememberedWorkspace(o,f):useWorkspace(o,a,f,e)}let p=l.length===1?l[0]:void 0,m=p!==void 0&&s!==void 0&&workspaceMatchesRequestedIdentity(p,e),h;if(s&&!m&&(h=await o.listAvailableWorkspaceRegions({}),!h.regions.includes(s.region)))throw invalidCreateOptionsError(e,s.name,s.region,`Region must be one of: ${h.regions.join(`, `)}.`);if(l.length===0&&(u||e.createWorkspace||c.length===0)){let t=h?.regions??(await o.listAvailableWorkspaceRegions({})).regions;if(e.dryRun||u||e.createWorkspace)return createWorkspaceForDeploy(o,a,e,t,s);throw R({code:`WORKSPACE_NOT_FOUND`,message:`No workspaces are available for this account.`,suggestion:`Create one during deploy by providing the workspace name and one of the available regions.`,next:executableAction(createDeployArgs(e,`<name>`,`<region>`)),context:{availableRegions:t}})}if(d.size>1){let t=e.createWorkspace===!0&&e.workspaceName!==void 0&&e.workspaceRegion!==void 0&&l.length===0;if(!u&&!t)throw R({code:`WORKSPACE_CONTEXT_CONFLICT`,message:`The deployed configuration files are linked to different workspaces.`,suggestion:`Choose one workspace explicitly for the combined deployment.`,next:executableAction(selectDeployArgs(e)),context:{savedWorkspaceIds:[...d]}});if(l.length>0&&!e.createWorkspace)return chooseWorkspace(o,a,l,e)}if(!f&&c.length>0){let t=e.createWorkspace===!0&&e.workspaceName!==void 0&&e.workspaceRegion!==void 0&&l.length<=1;if(!u&&!t)throw R({code:`WORKSPACE_CONTEXT_STALE`,message:`The saved project workspace is no longer available.`,suggestion:`Choose an available workspace explicitly before deploying.`,next:executableAction(selectDeployArgs(e)),context:{savedWorkspaceIds:[...d],workspaces:l.map(workspaceIdentity)}});if(l.length>0&&u&&!e.createWorkspace)return chooseWorkspace(o,a,l,e)}if(l.length===1){let[t]=l;if(!t)throw Error(`Workspace discovery returned an invalid result`);if(e.createWorkspace&&!workspaceMatchesRequestedIdentity(t,e))throw R({code:`WORKSPACE_CREATE_CONFLICT`,message:`The existing workspace does not match the requested workspace.`,suggestion:`Use the existing workspace, or run the explicit workspace create command to create another one.`,next:executableAction([`workspace`,`create`,...workspaceCommandArgs(e),...e.workspaceCommandJson?[`--json`]:[],`--name`,e.workspaceName??`<name>`,`--region`,e.workspaceRegion??`<region>`,...e.organizationId?[`--organization-id`,e.organizationId]:[],...e.folderId?[`--folder-id`,e.folderId]:[]]),context:{existingWorkspace:workspaceIdentity(t)}});return u&&!e.createWorkspace?chooseWorkspace(o,a,l,e):useWorkspace(o,a,t,e)}if(l.length>1){if(!u)throw R({code:`WORKSPACE_SELECTION_REQUIRED`,message:`Multiple workspaces are available.`,suggestion:`Choose one explicitly for non-interactive deployment.`,next:executableAction(selectDeployArgs(e)),context:{workspaces:l.map(workspaceIdentity)}});return chooseWorkspace(o,a,l,e)}throw Error(`Workspace discovery returned an invalid result`)}function collectExpectedLocalStaticWebsiteNames(e){let t=new Set;for(let n of e)for(let e of n.application.staticWebsiteServices)t.add(e.name);return t}async function shouldForceApplyAll(e,t,n,r){let i=(await buildMetaRequest({trn:resourceTrn(t,`application`,n.name),appName:n.name,appId:n.id})).labels,a=new Set;n.subgraphs.length>0&&a.add(resourceTrn(t,`application`,n.name)),n.staticWebsiteServices.forEach(e=>{a.add(resourceTrn(t,`staticwebsite`,e.name))}),n.aiGatewayServices.forEach(e=>{a.add(resourceTrn(t,`aigateway`,e.name))}),n.resolverServices.forEach(e=>{a.add(resourceTrn(t,`pipeline`,e.namespace))}),n.idpServices.forEach(e=>{a.add(resourceTrn(t,`idp`,e.name))}),n.authService&&a.add(resourceTrn(t,`auth`,n.authService.config.name)),Object.values(n.executorService?.executors??{}).forEach(e=>{a.add(resourceTrn(t,`executor`,e.name))}),Object.values(n.workflowService?.workflows??{}).forEach(e=>{a.add(resourceTrn(t,`workflow`,e.name))}),n.tailorDBServices.forEach(e=>{a.add(resourceTrn(t,`tailordb`,e.namespace))}),n.secrets.forEach(e=>{a.add(resourceTrn(t,`vault`,e.vaultName))}),r.forEach(e=>{a.add(resourceTrn(t,`function_registry`,e.name))});let o=await Promise.allSettled([...a].map(t=>I(async()=>{let{metadata:n}=await e.getMetadata({trn:t});return n})));if(o.some(e=>e.status===`fulfilled`&&e.value?.labels[`sdk-name`]===n.name&&!hasMatchingSdkVersion(e.value.labels,i)))return!0;let s=o.find(e=>e.status===`rejected`);if(s)throw s.reason;return!1}function recoveryEnvironmentArgs(e,t){return[...t?.envFile?[`--env-file`,B.resolve(process.cwd(),t.envFile)]:[],...t?.envFileIfExists?[`--env-file-if-exists`,B.resolve(process.cwd(),t.envFileIfExists)]:[],...e?.profile?[`--profile`,e.profile]:[]]}function recoveryOutputArgs(e){return[...e?.verbose?[`--verbose`]:[],...e?.json||M.jsonMode?[`--json`]:[]]}function retryDeployArgs(e,t,n){return[`deploy`,`--config`,t.join(`,`),...recoveryEnvironmentArgs(e,n),...e?.dryRun?[`--dry-run`]:[],...e?.yes?[`--yes`]:[],...e?.noSchemaCheck?[`--no-schema-check`]:[],...e?.noValidate?[`--no-validate`]:[],...e?.noCache?[`--no-cache`]:[],...e?.cleanCache?[`--clean-cache`]:[],...recoveryOutputArgs(n)]}function workspaceRecoveryArgs(e,t){return[...recoveryEnvironmentArgs(e,t),...t?.verbose?[`--verbose`]:[]]}function collectPlannedExternalTailorDBServices(e,t){let n=new Set(e.application.externalTailorDBNamespaces);return n.size===0?[]:t.flatMap(e=>e.application.tailorDBServices.filter(e=>n.has(e.namespace)))}function collectExternalAuthIdpConfigNames(e){let t=new Map;for(let n of e){let e=n.application.authService;if(!e)continue;let{name:r}=e.config,i=e.config.idProvider?.name;if(t.has(r)&&t.get(r)!==i)throw Error(`Auth namespace "${r}" is defined by multiple config files with different IdP configs. Auth namespace names must be unique across all configs in a single deploy.`);t.set(r,i)}return t}function collectDeployRunPlanInputs(e,t){let n=collectEventSubscriptions(e);return assertRecordableDependencies(n,t),{eventSubscriptions:n,runAppIds:new Set(e.map(e=>e.application.id).filter(e=>e!==void 0)),expectedLocalStaticWebsiteNames:collectExpectedLocalStaticWebsiteNames(e),externalAuthIdpConfigNames:collectExternalAuthIdpConfigNames(e)}}async function planDeploymentTarget(e){let{target:t,targets:n,runInputs:r,client:i,workspaceId:a,noSchemaCheck:o,migrationTestBaselines:s,migrationTestSnapshots:c}=e,{config:l,application:u,workflowBuildResult:d,httpAdapterBuildResult:f,bundledScripts:p}=t,m=ownedSubscriptions(r.eventSubscriptions,t),h=u.tailorDBServices.map(e=>{let t=c?.get(e.namespace);return t?{...e,types:t.tables,typeSourceInfo:{}}:e});await z(`plan.validateTailorDBTypeNames`,()=>rn({client:i,workspaceId:a,tailorDBServices:h,externalTailorDBNamespaces:u.externalTailorDBNamespaces,plannedExternalTailorDBServices:collectPlannedExternalTailorDBServices(t,n)}));let g=u.workflowService,_=collectFunctionEntries(u,filterBundledWorkflowJobs(g?.jobs??[],d?.usedJobNames??[]),p),v=await z(`plan.detectSdkVersionChange`,()=>shouldForceApplyAll(i,a,u,_));return z(`plan`,async()=>{let e=n.map(e=>e.application),p=collectVisibleTailorDBTypeNamespaces(u,e),h=collectVisibleResolverNamespaces(u,e),y=collectVisibleIdpNames(u,e),b={client:i,workspaceId:a,application:u,forRemoval:!1,config:l,noSchemaCheck:o,migrationTestBaselines:s,migrationTestSnapshots:c,forceApplyAll:v,...r,idpUserTriggerTargets:subscribedIdps(m),executorUsedTailorDBTables:subscribedTailorDBTables(m),executorUsedResolvers:subscribedResolvers(m),dependentApps:collectDependentApps(m),tailorDBTypeNamespaces:p,resolverNamespaces:h,idpNames:y},x=await z(`plan.functionRegistry`,()=>planFunctionRegistry(i,a,u.name,u.id,_)),S=new Set(x.changeSet.unchanged.filter(e=>e.name.startsWith(ki)).map(e=>e.name.slice(10))),[C,w,ee,te,ne,re,ie,ae,oe,se,ce]=await Promise.all([z(`plan.tailorDB`,()=>planTailorDB(b)),z(`plan.staticWebsite`,()=>planStaticWebsite(b)),z(`plan.aiGateway`,()=>planAIGateway(b)),z(`plan.idp`,()=>planIdP(b)),z(`plan.auth`,()=>planAuth(b)),z(`plan.pipeline`,()=>planPipeline(b)),z(`plan.application`,()=>planApplication(b,f)),z(`plan.executor`,()=>planExecutor(b)),z(`plan.workflow`,()=>planWorkflow(i,a,u.name,u.id,g?.workflows??{},d?.mainJobDeps??{},S,{...subscribedWorkflows(m),jobPublishEvents:collectWorkflowJobPublishEvents(t),dependentApps:b.dependentApps,runAppIds:b.runAppIds})),z(`plan.workflowExecutionPolicy`,()=>planWorkflowJobFunctionExecutionPolicy(i,a,u.name,u.id,l.workflow?.executionPolicies??{})),z(`plan.secretManager`,()=>planSecretManager(b))]);return{application:u,functionRegistry:x,tailorDB:C,staticWebsite:w,aiGateway:ee,idp:te,auth:ne,pipeline:re,app:ie,executor:ae,workflow:oe,workflowExecutionPolicy:se,secretManager:ce}})}async function planDeploymentTargets(e){let{targets:t,planTarget:n=planDeploymentTarget,...r}=e;return Promise.all(t.map(e=>n({...r,target:e,targets:t})))}async function confirmDeploymentPlans(e){let{deployments:t,yes:n,dryRun:r=!1,missingDependentApps:i=[]}=e;r||await confirmMigrationCheckpointRepairs(t.flatMap(e=>e.tailorDB.context.checkpointRepairs),n),await confirmMissingDependentApps(i,n);let a=new Set(t.map(e=>e.application.name)),o=collectDeploymentResourceOwners(t),s=new Set,c=[];for(let e of t){let t=deploymentPlanResults(e),r=collectOwnerConflicts(t);await confirmOwnerConflict(r,e.application.name,n,e.application.id),await confirmUnmanagedResources(collectUnmanagedResources(t),e.application.name,n),c.push(...collectImportantResourceDeletions(t));let i=computeRenamedAppDeletions({conflicts:r,resourceOwners:o,protectedAppNames:a});for(let t of i)s.has(t)||(s.add(t),e.app.deletes.push({name:t,request:{workspaceId:e.tailorDB.context.workspaceId,applicationName:t}}))}await confirmImportantResourceDeletion(c,n)}async function validateDeploymentPlans(e){for(let t of e)await validatePlan(deploymentPlanResults(t))}function adjustApplicationForMigrationTest(e,t){if(!t?.migrationTestSnapshots)return e;let n=t.migrationTestBaselines!==void 0,r=n&&e.authService?{...e.authService,userProfile:void 0}:e.authService,i={...e,executorService:n?void 0:e.executorService,authService:r,staticWebsiteServices:e.staticWebsiteServices.map(e=>({...e,customDomains:void 0})),get applications(){return[i]}};return i}async function deployInternal(e,n,r){return z(`deploy`,async i=>{i.setAttribute(`deploy.dry_run`,e?.dryRun??!1),un(),t();let a=parseDeployConfigPaths(e?.configPath),o=e?.dryRun??!1,s=e?.buildOnly??ct(process.env.TAILOR_DEPLOY_BUILD_ONLY)===!0,c=s?[]:await z(`config.preflight`,()=>loadDeployConfigs({configPaths:a,dryRun:o,buildOnly:s})),l=c.map(({config:e})=>e.path),u=c.map(({config:e})=>({configPath:e.path,applicationId:e.id??`name:${e.name}`})),d=s?void 0:await resolveDeployWorkspace({workspaceId:e?.workspaceId,profile:e?.profile,createWorkspace:e?.createWorkspace,workspaceName:e?.workspaceName,workspaceRegion:e?.workspaceRegion,organizationId:e?.organizationId,folderId:e?.folderId,dryRun:o,contextTargets:u,deployArgs:retryDeployArgs(e,l,n),workspaceCommandArgs:workspaceRecoveryArgs(e,n),workspaceCommandJson:n?.json||M.jsonMode}),f=await z(`build`,async()=>{let t=e?.noCache??!1,n=await pn(),r=B.resolve(Gt(),`cache`);return e?.cleanCache&&(W.rmSync(r,{recursive:!0,force:!0}),M.info(`Bundle cache cleaned`)),await buildDeploymentTargets({configPaths:a,loadedConfigs:s?void 0:c,dryRun:o,buildOnly:s,noCache:t,packageVersion:n.version??`unknown`,cacheDir:r})});if(s)return{bundledScripts:mergeBundledScripts(f)};if(assertUniqueGlobalResourceNames(f),!d)throw Error(`Workspace was not resolved`);let{client:p,workspaceId:m}=d;i.setAttribute(`app.name`,f.map(e=>e.application.name).join(`,`)),i.setAttribute(`workspace.id`,m);let h=f.map(e=>({...e,application:adjustApplicationForMigrationTest(e.application,r)})),g=await z(`plan.metadataLookup`,()=>createMetadataLookupClient({client:p,workspaceId:m,applications:h.map(({application:e})=>e)})),_=collectDeployRunPlanInputs(h,!e?.dryRun),v=await planDeploymentTargets({targets:h,runInputs:_,client:g,workspaceId:m,noSchemaCheck:e?.noSchemaCheck,migrationTestBaselines:r?.migrationTestBaselines,migrationTestSnapshots:r?.migrationTestSnapshots}),y=e?.yes??!1;dropCrossDeploymentManagedDeletes(v);let b=(await Promise.all(h.map(e=>fetchMissingDependentApps({client:g,workspaceId:m,application:e.application,runAppIds:_.runAppIds??new Set,subscribedKeys:subscribedResourceKeys(_.eventSubscriptions,e),jobsByWorkflow:e.workflowBuildResult?.mainJobDeps??{}})))).flat();await z(`confirm`,async()=>{await confirmDeploymentPlans({deployments:v,yes:y,dryRun:o,missingDependentApps:b})});let x=printDeploymentPlans(v,{dryRun:e?.dryRun});if(e?.noValidate?M.warn(`Client-side validation skipped (--no-validate).`):await validateDeploymentPlans(v),o){M.info(`Dry run enabled. No changes applied.`);return}await applyDeploymentPlans(p,m,v),r?.suppressResultOutput||(M.jsonMode?M.out({summary:x,status:`applied`}):M.success(`Successfully applied changes.`))})}function deploy(e){return deployInternal(e)}function deployMigrationTestBaseline(e,t,n){return deployInternal(e,void 0,{migrationTestBaselines:t,migrationTestSnapshots:n,suppressResultOutput:!0})}function deployMigrationTestTarget(e,t){return deployInternal(e,void 0,{migrationTestSnapshots:t,suppressResultOutput:!0})}function deployFromCLI(e,t){return deployInternal(e,t)}function colorizeExecutorJobStatus(e){switch(e){case`PENDING`:return N.dim(e);case`RUNNING`:return N.info(e);case`SUCCESS`:return N.success(e);case`FAILED`:return N.error(e);case`CANCELED`:return N.warning(e);default:return e}}function isExecutorJobTerminalStatus(e){return isExecutorJobSuccessStatus(e)||isExecutorJobFailureStatus(e)}function isExecutorJobSuccessStatus(e){return e===n.SUCCESS}function isExecutorJobFailureStatus(e){return e===n.FAILED||e===n.CANCELED}function isExecutorJobTransientStatus(e){return e===n.UNSPECIFIED||e===n.PENDING||e===n.RUNNING}function classifyExecutorJobStatus(e){return isExecutorJobSuccessStatus(e)?`success`:isExecutorJobTerminalStatus(e)?`failure`:(isExecutorJobTransientStatus(e),`transient`)}function parseExecutorJobStatus(e){switch(e.toUpperCase()){case`PENDING`:return n.PENDING;case`RUNNING`:return n.RUNNING;case`SUCCESS`:return n.SUCCESS;case`FAILED`:return n.FAILED;case`CANCELED`:return n.CANCELED;default:throw Error(`Invalid status: ${e}. Valid values: PENDING, RUNNING, SUCCESS, FAILED, CANCELED`)}}function colorizeFunctionExecutionStatus(e){switch(e){case`RUNNING`:return N.info(e);case`SUCCESS`:return N.success(e);case`FAILED`:return N.error(e);default:return e}}function isFunctionExecutionTerminalStatus(e){return e===h.SUCCESS||e===h.FAILED||e===h.CANCELED}function executorTargetTypeToString(e){switch(e){case T.WEBHOOK:return`WEBHOOK`;case T.TAILOR_GRAPHQL:return`GRAPHQL`;case T.FUNCTION:return`FUNCTION`;case T.JOB_FUNCTION:return`JOB_FUNCTION`;case T.WORKFLOW:return`WORKFLOW`;default:return`UNSPECIFIED`}}function executorTriggerTypeToString(e){switch(e){case O.SCHEDULE:return`SCHEDULE`;case O.EVENT:return`EVENT`;case O.INCOMING_WEBHOOK:return`INCOMING_WEBHOOK`;default:return`UNSPECIFIED`}}function executorJobStatusToString(e){switch(e){case n.PENDING:return`PENDING`;case n.RUNNING:return`RUNNING`;case n.SUCCESS:return`SUCCESS`;case n.FAILED:return`FAILED`;case n.CANCELED:return`CANCELED`;default:return`UNSPECIFIED`}}function toExecutorJobListInfo(e){return{id:e.id,executorName:e.executorName,status:executorJobStatusToString(e.status),createdAt:e.createdAt?G(e.createdAt).toISOString():`N/A`}}function toExecutorJobInfo(e){return{id:e.id,executorName:e.executorName,status:executorJobStatusToString(e.status),scheduledAt:e.scheduledAt?G(e.scheduledAt).toISOString():`N/A`,createdAt:e.createdAt?G(e.createdAt).toISOString():`N/A`,updatedAt:e.updatedAt?G(e.updatedAt).toISOString():`N/A`}}function toExecutorJobAttemptInfo(e){return{id:e.id,jobId:e.jobId,status:executorJobStatusToString(e.status),error:e.error||``,startedAt:e.startedAt?G(e.startedAt).toISOString():`N/A`,finishedAt:e.finishedAt?G(e.finishedAt).toISOString():`N/A`,operationReference:e.operationReference||``}}function formatSubjectEvent(e,t){let n=t.map(e=>e.split(`.`).at(-1)??e).join(`, `);return n?`event: ${e} ${n}`:`event: ${e}`}function formatTypedEventTrigger(e){let t=e.typedConfig;if(t.case===void 0)return null;switch(t.case){case`tailordb`:return formatSubjectEvent(t.value.typeName,t.value.eventTypes);case`pipeline`:return formatSubjectEvent(t.value.resolverName,t.value.eventTypes);case`idp`:return formatSubjectEvent(`idp user`,t.value.eventTypes);case`auth`:return formatSubjectEvent(`auth access_token`,t.value.eventTypes);default:return null}}function formatTriggerType(e){let t=e.triggerConfig?.config;if(!t||t.case===void 0)return executorTriggerTypeToString(e.triggerType);switch(t.case){case`schedule`:return`schedule: ${t.value.frequency} (${t.value.timezone})`;case`event`:{let n=formatTypedEventTrigger(t.value);if(n)return n;let r=readLegacyEventTriggerConfig(t.value);return r.eventType?formatEventTrigger(r.eventType,r.condition):executorTriggerTypeToString(e.triggerType)}case`incomingWebhook`:return`webhook`;default:return executorTriggerTypeToString(e.triggerType)}}function readLegacyEventTriggerConfig(e){return{eventType:e.eventType,condition:e.condition?.expr}}function formatEventTrigger(e,t){let n=e.split(`.`);if(n.length<3)return`event: ${e}`;let[r,i,a]=n;if(t){let e=t.match(/args\.typeName\s*===?\s*["']([^"']+)["']/);if(e)return`event: ${e[1]} ${a}`;let n=t.match(/args\.resolverName\s*===?\s*["']([^"']+)["']/);if(n)return`event: ${n[1]} ${a}`}return`event: ${r} ${i} ${a}`}function formatTriggerConfig(e){let t=e.triggerConfig?.config;if(!t||t.case===void 0)return{};switch(t.case){case`schedule`:return{timezone:t.value.timezone,frequency:t.value.frequency};case`event`:return formatEventTriggerConfig(t.value);case`incomingWebhook`:return{secret:t.value.secret?`***`:``};default:return{}}}function formatEventTriggerConfig(e){let t=e.typedConfig;if(t.case===void 0){let t=readLegacyEventTriggerConfig(e);return{eventType:t.eventType,condition:t.condition||``}}if(t.case===`workflow`)return{kind:t.case,eventTypes:t.value.eventTypes,condition:t.value.condition?.expr||``,...t.value.workflowName&&{workflowName:t.value.workflowName}};let n={kind:t.case,eventTypes:t.value.eventTypes,namespaceName:t.value.namespaceName,condition:t.value.condition?.expr||``};switch(t.case){case`tailordb`:return{...n,typeName:t.value.typeName};case`pipeline`:return{...n,resolverName:t.value.resolverName};default:return n}}function formatTargetConfig(e){let t=e.targetConfig?.config;if(!t||t.case===void 0)return{};switch(t.case){case`webhook`:return{url:t.value.url?.expr||``,headers:t.value.headers.length};case`tailorGraphql`:return{appName:t.value.appName,query:t.value.query};case`function`:return{name:t.value.name};case`workflow`:return{workflowName:t.value.workflowName};default:return{}}}function toExecutorListInfo(e){return{name:e.name,triggerType:formatTriggerType(e),targetType:executorTargetTypeToString(e.targetType),disabled:e.disabled}}function toExecutorInfo(e){return{name:e.name,description:e.description,triggerType:formatTriggerType(e),targetType:executorTargetTypeToString(e.targetType),disabled:e.disabled,triggerConfig:formatTriggerConfig(e),targetConfig:formatTargetConfig(e)}}const Ho={name:V(H.string(),{positional:!0,description:`Executor name`})};async function resolveExecutor(e,t,n){let{executor:r}=await e.getExecutorExecutor({workspaceId:t,name:n});if(!r)throw Error(`Executor '${n}' not found.`);return r}async function getExecutor(e){let t=e.executor.name,{client:n,workspaceId:r}=await loadOperatorWorkspaceContext({profile:e.profile,workspaceId:e.workspaceId});try{return toExecutorInfo(await resolveExecutor(n,r,t))}catch(e){throw e instanceof q&&e.code===K.NotFound?Error(`Executor '${t}' not found.`,{cause:e}):e}}const Uo=X({name:`get`,description:`Get executor details`,args:H.strictObject({...Y,...Ho}),run:async e=>{let t=await getExecutor({executor:{name:e.name},workspaceId:e[`workspace-id`],profile:e.profile});M.out(t,{display:{triggerConfig:null,targetConfig:null}})}});function functionExecutionStatusToString(e){switch(e){case h.RUNNING:return`RUNNING`;case h.SUCCESS:return`SUCCESS`;case h.FAILED:return`FAILED`;case h.SUSPEND:return`SUSPEND`;case h.CANCELING:return`CANCELING`;case h.CANCELED:return`CANCELED`;default:return`UNSPECIFIED`}}function formatWaitError(e){return e instanceof Error?e.message:String(e)}function isRetryableWaitError(e){return e instanceof q?e.code===K.Aborted||e.code===K.ResourceExhausted||e.code===K.Unavailable:!1}const Wo=H.enum([`success`,`suspended`,`terminal`]),Go={name:V(H.string(),{positional:!0,description:`Workflow name`})},Ko={interval:V(Ir.default(`3s`),{alias:`i`,description:`Polling interval when waiting (e.g., '3s', '500ms', '1m')`}),timeout:V(Ir.default(`10m`),{alias:`t`,description:`Maximum time to wait (e.g., '30s', '10m')`}),until:V(Wo.default(`terminal`),{alias:`u`,description:`Wait target (success, suspended, terminal)`}),logs:V(H.boolean().default(!1),{alias:`l`,description:`Display job execution logs after completion`})},qo={wait:V(H.boolean().default(!1),{alias:`W`,description:`Wait for execution to complete`}),...Ko};function isWorkflowExecutionSuccessStatus(e){return e===D.SUCCESS}function isWorkflowJobExecutionSuspendedStatus(e){return e===Qe.SUSPEND||e===Qe.WAITING}function isWorkflowExecutionSuspendedStatus(e){return e===D.PENDING_RESUME||e===D.WAITING}function isWorkflowExecutionFailureStatus(e){return e===D.FAILED}function isWorkflowExecutionTransientStatus(e){return e===D.UNSPECIFIED||e===D.PENDING||e===D.RUNNING||e===D.PENDING_RETRY}function isWorkflowExecutionTerminalStatus(e){return isWorkflowExecutionSuccessStatus(e)||isWorkflowExecutionFailureStatus(e)||isWorkflowExecutionSuspendedStatus(e)}function classifyWorkflowExecutionStatus(e){return isWorkflowExecutionTerminalStatus(e.status)?isWorkflowExecutionSuccessStatus(e.status)?{statusClass:`success`,status:e.status}:isWorkflowExecutionFailureStatus(e.status)?{statusClass:`failure`,status:e.status}:{statusClass:`suspended`,status:e.status}:e.jobExecutions.some(e=>isWorkflowJobExecutionSuspendedStatus(e.status))?{statusClass:`suspended`,status:e.status}:(isWorkflowExecutionTransientStatus(e.status),{statusClass:`transient`,status:e.status})}function hasReachedWorkflowWaitTarget(e,t){switch(t){case`success`:return e.statusClass===`success`;case`suspended`:return e.statusClass===`suspended`;case`terminal`:return e.statusClass===`success`||e.statusClass===`failure`||e.statusClass===`suspended`}}function workflowExecutionStatusToString(e){switch(e){case D.PENDING:return`PENDING`;case D.PENDING_RESUME:return`PENDING_RESUME`;case D.RUNNING:return`RUNNING`;case D.SUCCESS:return`SUCCESS`;case D.FAILED:return`FAILED`;case D.PENDING_RETRY:return`PENDING_RETRY`;case D.WAITING:return`WAITING`;default:return`UNSPECIFIED`}}function workflowJobExecutionStatusToString(e){switch(e){case Qe.RUNNING:return`RUNNING`;case Qe.SUSPEND:return`SUSPEND`;case Qe.SUCCESS:return`SUCCESS`;case Qe.FAILED:return`FAILED`;case Qe.WAITING:return`WAITING`;default:return`UNSPECIFIED`}}function toWorkflowListInfo(e){return{name:e.name,mainJob:e.mainJobFunctionName,jobFunctions:Object.keys(e.jobFunctions).length,updatedAt:e.updatedAt?G(e.updatedAt):null}}function toWorkflowInfo(e){let t={};for(let[n,r]of Object.entries(e.jobFunctions))t[n]=r.toString();return{name:e.name,id:e.id,mainJob:e.mainJobFunctionName,jobFunctions:t,createdAt:e.createdAt?G(e.createdAt):null,updatedAt:e.updatedAt?G(e.updatedAt):null}}function toWorkflowJobExecutionInfo(e){return{id:e.id,stackedJobName:e.stackedJobName,status:workflowJobExecutionStatusToString(e.status),executionId:e.executionId,startedAt:e.startedAt?G(e.startedAt):null,finishedAt:e.finishedAt?G(e.finishedAt):null}}function toWorkflowExecutionInfo(e){return{id:e.id,workflowName:e.workflowName,status:workflowExecutionStatusToString(e.status),jobExecutions:e.jobExecutions.length,startedAt:e.startedAt?G(e.startedAt):null,finishedAt:e.finishedAt?G(e.finishedAt):null}}function formatTime$1(e){return e.toLocaleTimeString(`en-US`,{hour12:!1})}function colorizeStatus(e){let t=D[e];switch(e){case D.PENDING:case D.UNSPECIFIED:return N.dim(t);case D.PENDING_RESUME:case D.PENDING_RETRY:case D.WAITING:return N.warning(t);case D.RUNNING:return N.info(t);case D.SUCCESS:return N.success(t);case D.FAILED:return N.error(t);default:return t}}function getActiveJobs(e){return e.jobExecutions.filter(e=>e.status===Qe.RUNNING||e.status===Qe.SUSPEND||e.status===Qe.WAITING).map(e=>e.stackedJobName).join(`, `)}function createWorkflowWaitResult(e){let t=Date.now()-e.startedAt;if(e.execution){let n=classifyWorkflowExecutionStatus(e.execution);return{...toWorkflowExecutionInfo(e.execution),statusClass:n.statusClass,elapsedMs:t,attempts:e.attempts,timedOut:e.timedOut,lastError:e.lastError}}return{id:e.executionId,workflowName:``,status:`UNKNOWN`,statusClass:`unknown`,jobExecutions:0,startedAt:null,finishedAt:null,elapsedMs:t,attempts:e.attempts,timedOut:e.timedOut,lastError:e.lastError}}async function waitForWorkflowExecution(e){let t=e.interval??3e3,n=e.until??`terminal`,r=Date.now(),i=e.showProgress?spinner({indent:2}).start(`Waiting for workflow to complete...`):null,a=0,o,s=null,c,l;try{for(;;){let u=Date.now()-r,d=e.timeout===void 0?void 0:e.timeout-u;if(d!==void 0&&d<=0)return i?.fail(`Workflow wait timed out.`),createWorkflowWaitResult({executionId:e.executionId,execution:o,startedAt:r,attempts:a,timedOut:!0,lastError:s});try{a+=1;let{execution:t}=await e.client.getWorkflowExecution({workspaceId:e.workspaceId,executionId:e.executionId});if(!t)throw i?.fail(`Execution '${e.executionId}' not found.`),Error(`Execution '${e.executionId}' not found.`);o=t,s=null;let u=classifyWorkflowExecutionStatus(t),d=colorizeStatus(t.status);if(t.status!==c&&(e.showProgress&&(i?.stop(),M.info(`Status: ${d}`,{mode:`stream`,indent:2}),i?.start(`Waiting for workflow to complete...`)),c=t.status),e.trackJobs){let n=getActiveJobs(t);n&&n!==l&&(e.showProgress&&(i?.stop(),M.info(`Job | ${n}: ${d}`,{mode:`stream`,indent:2}),i?.start(`Waiting for workflow to complete...`)),l=n)}if(i&&(i.text=`Waiting for workflow to complete... (${formatTime$1(new Date)})`),hasReachedWorkflowWaitTarget(u,n)||u.statusClass===`failure`||n===`suspended`&&u.statusClass===`success`)return t.status===D.SUCCESS?i?.succeed(`Completed: ${d}`):isWorkflowExecutionFailureStatus(t.status)?i?.fail(`Completed: ${d}`):isWorkflowExecutionSuspendedStatus(t.status)?i?.warn(`Completed: ${d}`):i?.succeed(`Completed: ${d}`),createWorkflowWaitResult({executionId:e.executionId,execution:t,startedAt:r,attempts:a,timedOut:!1,lastError:s})}catch(t){if(!isRetryableWaitError(t))throw t;s=formatWaitError(t),e.showProgress&&i&&(i.text=`Retrying workflow status poll... (${formatTime$1(new Date)})`)}let f=Date.now()-r,p=e.timeout===void 0?void 0:e.timeout-f;if(p!==void 0&&p<=0)return i?.fail(`Workflow wait timed out.`),createWorkflowWaitResult({executionId:e.executionId,execution:o,startedAt:r,attempts:a,timedOut:!0,lastError:s});await Er(p===void 0?t:Math.min(t,p))}}finally{i?.stop()}}async function waitForWorkflowExecutionById(e){let{client:t,workspaceId:n}=await loadOperatorWorkspaceContext({profile:e.profile,workspaceId:e.workspaceId});return await waitForWorkflowExecution({client:t,workspaceId:n,executionId:e.executionId,interval:e.interval,timeout:e.timeout,until:e.until,showProgress:e.showProgress,trackJobs:e.trackJobs})}function getWorkflowWaitFailureMessage(e,t){if(e.timedOut)return`Timed out waiting for workflow execution '${e.id}' to reach ${t}. Last status: ${e.status}.`;if(e.status===`FAILED`)return`Workflow execution '${e.id}' failed.`;if(t===`success`&&e.statusClass!==`success`)return`Workflow execution '${e.id}' reached ${e.status} before success.`;if(t===`suspended`&&e.statusClass!==`suspended`)return`Workflow execution '${e.id}' reached ${e.status} before suspension.`}function parseStatus(e){switch(e.toUpperCase()){case`PENDING`:return D.PENDING;case`PENDING_RESUME`:return D.PENDING_RESUME;case`RUNNING`:return D.RUNNING;case`SUCCESS`:return D.SUCCESS;case`FAILED`:return D.FAILED;case`PENDING_RETRY`:return D.PENDING_RETRY;case`WAITING`:return D.WAITING;case`UNSPECIFIED`:return D.UNSPECIFIED;default:throw Error(`Invalid status: ${e}. Valid values: UNSPECIFIED, PENDING, PENDING_RESUME, RUNNING, SUCCESS, FAILED, PENDING_RETRY, WAITING`)}}async function listWorkflowExecutions(e){let t=e?.workflow?.name,{client:n,workspaceId:r}=await loadOperatorWorkspaceContext({profile:e?.profile,workspaceId:e?.workspaceId}),i=[];if(e?.status){let t=parseStatus(e.status);i.push(U(Re,{condition:U(we,{field:`status`,operator:Ze.EQ,value:{kind:{case:`numberValue`,value:t}}})}))}let a=i.length>0?U(Re,{and:i}):void 0,o=toPageDirection(e?.order??`desc`);return(await jt(async(e,i)=>{let{executions:s,nextPageToken:c}=await n.listWorkflowExecutions({workspaceId:r,workflowName:t??``,pageToken:e,pageSize:i,pageDirection:o,filter:a});return[s,c]},{limit:e?.limit})).map(toWorkflowExecutionInfo)}async function getWorkflowExecution(e){let{client:t,workspaceId:n}=await loadOperatorWorkspaceContext({profile:e.profile,workspaceId:e.workspaceId});async function fetchFunctionExecution(e){try{let r=U(Re,{condition:U(we,{field:`id`,operator:Ze.EQ,value:{kind:{case:`stringValue`,value:e}}})});return(await t.listFunctionExecutions({workspaceId:n,filter:r,pageSize:1})).executions[0]}catch{return}}async function fetchExecutionWithLogs(e,r){let{execution:i}=await t.getWorkflowExecution({workspaceId:n,executionId:e});if(!i)throw Error(`Execution '${e}' not found.`);let a=toWorkflowExecutionInfo(i);return r&&i.jobExecutions.length>0&&(a.jobDetails=await Promise.all(i.jobExecutions.map(async e=>{let t=toWorkflowJobExecutionInfo(e);if(e.executionId){let n=await fetchFunctionExecution(e.executionId);if(n)return{...t,logs:n.logs||void 0,result:n.result||void 0}}return t}))),a}async function waitForCompletion(){let r=e.interval??3e3,i=await waitForWorkflowExecution({client:t,workspaceId:n,executionId:e.executionId,interval:r,timeout:e.timeout,until:e.until??`terminal`});return{...await fetchExecutionWithLogs(e.executionId,e.logs??!1),statusClass:i.statusClass,elapsedMs:i.elapsedMs,attempts:i.attempts,timedOut:i.timedOut,lastError:i.lastError}}return{execution:await fetchExecutionWithLogs(e.executionId,e.logs??!1),wait:waitForCompletion}}function printExecutionWithLogs(e){let formatDate=e=>e?e.toISOString():`N/A`,t=[[`id`,e.id],[`workflowName`,e.workflowName],[`status`,e.status],[`jobExecutions`,e.jobExecutions.toString()],[`startedAt`,formatDate(e.startedAt)],[`finishedAt`,formatDate(e.finishedAt)]];if(M.out(formatKeyValueTable(t)),e.jobDetails&&e.jobDetails.length>0){M.log(N.bold(`
131
131
  Job Executions:`));for(let t of e.jobDetails){if(M.log(N.info(`\n--- ${t.stackedJobName} ---`)),M.log(` Status: ${t.status}`),M.log(` Started: ${formatDate(t.startedAt)}`),M.log(` Finished: ${formatDate(t.finishedAt)}`),t.logs){M.log(N.warning(`
132
132
  Logs:`));let e=t.logs.split(`
133
133
  `);for(let t of e)M.log(` ${t}`)}if(t.result){M.log(N.success(`
@@ -155,14 +155,14 @@ Function Execution:`)),M.log(` ID: ${n.functionExecutionId}`),n.functionStatus&
155
155
  Resources tagged with "${r.name}" were left in place: they carry an application id this config does not match.
156
156
  Put that id in your config, or run deploy to take them over first, then remove again.
157
157
  `);return}M.success(`Successfully removed all resources managed by "${r.name}".`)}});function applicationInfo(e){return{name:e.name,domain:e.domain,url:e.url,auth:e.authNamespace,cors:e.cors,allowedIpAddresses:e.allowedIpAddresses,disableIntrospection:e.disableIntrospection,createdAt:e.createTime?G(e.createTime):null,updatedAt:e.updateTime?G(e.updateTime):null}}async function fetchAIGateways(e,t,n){return(await Promise.all(n.map(async n=>{try{let{aigateway:r}=await e.getAIGateway({workspaceId:t,aigatewayName:n});return r?{name:r.name,url:r.url}:void 0}catch(e){if(e instanceof q&&e.code===K.NotFound)return;throw e}}))).filter(e=>e!==void 0)}async function show(e){let{client:t,workspaceId:n}=await loadOperatorWorkspaceContext({profile:e?.profile,workspaceId:e?.workspaceId}),{config:r}=await loadConfig(e?.configPath),i=r.aiGateways?.length?[...new Set(r.aiGateways.map(e=>e.name))]:[],[a,o,s]=await Promise.all([t.getWorkspace({workspaceId:n}),t.getApplication({workspaceId:n,applicationName:r.name}),fetchAIGateways(t,n,i)]),{name:c,...l}=applicationInfo(A(o.application,`application "${r.name}" not found in workspace`)),u=a.workspace,d=u?await resolveWorkspaceFolderName(t,u):``;return{name:c,workspaceId:n,workspaceName:u?.name??``,...d?{workspaceFolderName:d}:{},workspaceRegion:u?.region??``,...l,aiGateways:s}}const ks=createWorkspaceNameTransformer(`workspaceName`,`workspaceFolderName`),As=X({name:`show`,description:`Show information about the deployed application.`,args:H.strictObject({...Wr}),run:async e=>{let t=await show({workspaceId:e[`workspace-id`],profile:e.profile,configPath:e.config});M.out(t,{display:{workspaceName:ks,workspaceFolderName:null}})}});function createProgress(e,t){let n=0;return{update:()=>{n+=1;let r=Math.round(n/t*100);process.stderr.write(`\r${e} ${n}/${t} (${r}%)`)},finish:()=>{process.stderr.write(`
158
- `)}}}async function withTimeout(e,t,n){let r=new AbortController;try{return await Promise.race([e,Er(t,void 0,{signal:r.signal}).then(()=>{throw Error(n)})])}finally{r.abort()}}const js=new Set([`.DS_Store`,`thumbs.db`,`desktop.ini`]);function shouldIgnoreFile(e){let t=B.basename(e).toLowerCase();return js.has(t)}async function deployStaticWebsite(e,t,n,r,i=!0){let{deploymentId:a}=await e.createDeployment({workspaceId:t,name:n});if(!a)throw Error(`createDeployment returned empty deploymentId`);let o=await uploadDirectory(e,t,a,r,i),{url:s}=await e.publishDeployment({workspaceId:t,deploymentId:a});if(!s)throw Error(`publishDeployment returned empty url`);return{url:s,skippedFiles:o}}async function uploadDirectory(e,t,n,r,i){let a=await collectFiles(r);if(a.length===0)return M.warn(`No files found under ${r}`),[];let o=rr(5),s=a.length,c=i?createProgress(`Uploading files`,s):void 0,l=[];return await Promise.all(a.map(i=>o(async()=>{await uploadSingleFile(e,t,n,r,i,l),c&&c.update()}))),c&&c.finish(),l}async function collectFiles(e,t=``){let n=B.join(e,t),r=await Or.promises.readdir(n,{withFileTypes:!0}),i=[];for(let n of r){let r=B.join(t,n.name);if(n.isDirectory()){let t=await collectFiles(e,r);i.push(...t)}else n.isFile()&&!n.isSymbolicLink()&&!shouldIgnoreFile(r)&&i.push(r)}return i}async function uploadSingleFile(e,t,n,r,i,a){let o=B.join(r,i),s=kr(i);if(!s){a.push(`${i} (unsupported content type; no MIME mapping found)`);return}let c=s,l=Or.createReadStream(o,{highWaterMark:65536});async function*requestStream(){yield{payload:{case:`initialMetadata`,value:{workspaceId:t,deploymentId:n,filePath:i,contentType:c}}};for await(let e of l)yield{payload:{case:`chunkData`,value:e}}}async function uploadWithLogging(){try{await e.uploadFile(requestStream())}catch(e){if(e instanceof q&&e.code===K.InvalidArgument){a.push(`${i} (server rejected file as invalid: ${e.message})`);return}throw e}}await withTimeout(uploadWithLogging(),12e4,`Upload timed out for "${i}"`)}function logSkippedFiles(e){if(e.length!==0){M.warn(`Deployment completed, but some files failed to upload. These files may have unsupported content types or other validation issues. Please review the list below:`);for(let t of e)M.log(` - ${t}`)}}const Ms=X({name:`deploy`,description:`Deploy a static website from a local build directory.`,args:H.strictObject({...Y,name:V(H.string(),{alias:`n`,description:`Static website name`}),dir:V(H.string(),{alias:`d`,description:`Path to the static website files`,completion:{type:`directory`}})}),run:async e=>{await assertWritable({profile:e.profile}),M.info(`Deploying static website "${e.name}" from directory: ${e.dir}`);let t=await loadAccessToken({profile:e.profile}),n=await F(t),r=e.name,i=B.resolve(process.cwd(),e.dir),a=await loadWorkspaceId({workspaceId:e[`workspace-id`],profile:e.profile});if(!Or.existsSync(i)||!Or.statSync(i).isDirectory())throw Error(`Directory not found or not a directory: ${i}`);let{url:o,skippedFiles:s}=await withTimeout(deployStaticWebsite(n,a,r,i,!e.json),6e5,`Deployment timed out after 10 minutes.`);e.json?M.out({name:r,workspaceId:a,url:o,skippedFiles:s}):(M.success(`Static website "${r}" deployed successfully. URL: ${o}`),logSkippedFiles(s))}});function logBetaWarning(e){M.warn(`The '${e}' command is a beta feature and may introduce breaking changes in future releases.`),M.newline()}function normalizeEditorCommand(e){let t=e?.trim();return t&&t.length>0?t:void 0}function getConfiguredEditorCommand(){return normalizeEditorCommand(process.env.VISUAL)??normalizeEditorCommand(process.env.EDITOR)}function getEditorCommand(){return getConfiguredEditorCommand()??`editor`}function parseEditorCommand(e){let[t,...n]=e.trim().split(/\s+/);if(!t)throw Error(`Editor command is empty.`);return{command:t,args:n}}async function openInEditor(e,t=getEditorCommand()){let{command:n,args:r}=parseEditorCommand(t);return await new Promise((t,i)=>{let a=Dr(n,[...r,e],{stdio:`inherit`,detached:!1});a.once(`error`,e=>i(e)),a.once(`close`,e=>{if(e==null||e===0){t();return}i(Error(`Editor exited with code ${e}.`))})}),!0}async function openInConfiguredEditor(e){let t=getConfiguredEditorCommand();return t?await openInEditor(e,t):!1}function fieldKey(e,t){return`${e}.${t}`}function buildTempFieldName(e,t){let n=`${e}Migrate`;for(let e=1;e<=t.size+1;e++){let r=e===1?n:`${n}${e}`;if(r.length>63)break;if(!t.has(r))return r}throw Error(`Cannot derive a temporary field name for "${e}": every candidate is taken or exceeds 63 characters.`)}function canConvertField(e){return getExpandContractEligibility(e).eligible}function getExpandContractEligibility(e){let{previous:t,current:n,tableName:r,fieldName:i}=e,a=t.tables[r]?.fields[i],o=n.tables[r]?.fields[i];if(!a||!o)return{eligible:!1,reason:`the field does not exist in both schemas`};let s=getExpandContractFieldChangeEligibility(a,o);return s.eligible?isFieldReferenced(t.tables[r],i)||isFieldReferenced(n.tables[r],i)?{eligible:!1,reason:`another schema feature references the field`}:{eligible:!0}:s}function typeMemberNames(e){return e?[...Object.keys(e.fields),...Object.keys(e.files??{}),...Object.keys(e.forwardRelationships??{}),...Object.keys(e.backwardRelationships??{})]:[]}function staticPropertyName(e,t){if(!t&&e.type===`Identifier`)return e.name;if(e.type===`Literal`&&typeof e.value==`string`)return e.value;if(e.type===`TemplateLiteral`&&e.expressions.length===0)return e.quasis[0]?.value.cooked??void 0}const Ns=new Set([`input`,`newRecord`,`oldRecord`,`invoker`,`now`]);function walkScriptAst(e,t,n=[]){if(!e)return;t(e,n);let r=[...n,e],i=e;for(let[e,n]of Object.entries(i))if(e!==`type`&&e!==`parent`){if(Array.isArray(n))for(let e of n)e&&typeof e==`object`&&`type`in e&&walkScriptAst(e,t,r);else n&&typeof n==`object`&&`type`in n&&walkScriptAst(n,t,r)}}function unwrapFunction(e){return e.type===`ParenthesizedExpression`?unwrapFunction(e.expression):e}function collectIssueBindings(e){let t=new Set([`__issues`]);walkScriptAst(e,e=>{if(e.type!==`CallExpression`)return;let n=unwrapFunction(e.callee);if(n.type!==`ArrowFunctionExpression`&&n.type!==`FunctionExpression`||e.arguments[1]?.type!==`Identifier`||e.arguments[1].name!==`__issues`)return;let r=n.params[1];r?.type===`Identifier`&&t.add(r.name)});let n;do{let r=t.size;walkScriptAst(e,e=>{e.type===`VariableDeclarator`&&e.id.type===`Identifier`&&e.init?.type===`Identifier`&&t.has(e.init.name)&&t.add(e.id.name)}),n=t.size>r}while(n);return t}function isWrapperArgumentProperty(e,t){if(e.type!==`Property`)return!1;let n=staticPropertyName(e.key,e.computed);if(!n||!Ns.has(n))return!1;let r=t.at(-1),i=t.at(-2);return r?.type!==`ObjectExpression`||i?.type!==`CallExpression`?!1:i.arguments[0]===r&&[`ArrowFunctionExpression`,`FunctionExpression`].includes(unwrapFunction(i.callee).type)}function isWrapperParameterProperty(e,t){if(e.type!==`Property`)return!1;let n=staticPropertyName(e.key,e.computed);if(!n||!Ns.has(n))return!1;let r=t.at(-1);if(r?.type!==`ObjectPattern`)return!1;for(let e=t.length-2;e>=0;e--){let i=t[e];if(i&&(i.type===`ArrowFunctionExpression`||i.type===`FunctionExpression`)&&i.params[0]===r)return t.slice(0,e).some(e=>e.type===`CallExpression`&&unwrapFunction(e.callee)===i&&e.arguments[0]?.type===`ObjectExpression`&&e.arguments[0].properties.some(e=>e.type===`Property`&&staticPropertyName(e.key,e.computed)===n))}return!1}function isIssueMessage(e,t,n){let r=t.at(-1);return r?.type===`CallExpression`&&r.callee.type===`Identifier`&&n.has(r.callee.name)&&r.arguments.findIndex(t=>t===e)>0}function scriptReferencesField(e,t){try{let{program:n,errors:r}=mr(`expand-contract-reference.js`,e,{sourceType:`module`});if(r.length>0)return!0;let i=collectIssueBindings(n),a=!1;return walkScriptAst(n,(e,n)=>{a||(e.type===`MemberExpression`&&(staticPropertyName(e.property,e.computed)===t||e.computed&&staticPropertyName(e.property,!0)===void 0)||e.type===`Property`&&(staticPropertyName(e.key,e.computed)===t||e.computed&&staticPropertyName(e.key,!0)===void 0)&&(e.computed||!isWrapperArgumentProperty(e,n)&&!isWrapperParameterProperty(e,n))||e.type===`CallExpression`&&e.callee.type===`Identifier`&&i.has(e.callee.name)&&e.arguments[0]!==void 0&&e.arguments[0].type!==`SpreadElement`&&staticPropertyName(e.arguments[0],!0)===t||(e.type===`Literal`||e.type===`TemplateLiteral`)&&staticPropertyName(e,!0)===t&&!isIssueMessage(e,n,i))&&(a=!0)}),a}catch{return!0}}function permissionsReferenceField(e,t){return e?[...e.record?Object.values(e.record).flatMap(e=>e):[],...e.gql??[]].some(e=>e.conditions.some(e=>{let[n,,r]=e;return[n,r].some(e=>isSnapshotFieldRefOperand(e)&&(`record`in e&&e.record===t||`newRecord`in e&&e.newRecord===t||`oldRecord`in e&&e.oldRecord===t))})):!1}function isFieldReferenced(e,t){return e?Object.values(e.indexes??{}).some(e=>e.fields.includes(t))||[...Object.values(e.forwardRelationships??{}),...Object.values(e.backwardRelationships??{})].some(e=>e.sourceField===t||e.targetField===t)||permissionsReferenceField(e.permissions,t)?!0:[e.typeHookExpr?.create,e.typeHookExpr?.update,e.typeValidateExpr].filter(e=>e!==void 0).some(e=>scriptReferencesField(e,t)):!1}function planExpandContract(e){let{previous:t,current:n,diff:r,confirmed:i}=e,a=[],o=new Set;for(let e of r.changes){if(e.kind!==`field_type_modified`)continue;let r=fieldKey(e.tableName,e.fieldName);if(!i.has(r)||!canConvertField({previous:t,current:n,tableName:e.tableName,fieldName:e.fieldName}))continue;let s=new Set([...typeMemberNames(t.tables[e.tableName]),...typeMemberNames(n.tables[e.tableName]),...a.filter(t=>t.tableName===e.tableName).map(e=>e.tempFieldName)]);a.push({tableName:e.tableName,fieldName:e.fieldName,tempFieldName:buildTempFieldName(e.fieldName,s),before:e.before,after:e.after}),o.add(r)}return{plans:a,blocked:r.breakingChanges.filter(e=>e.unsupported&&!(e.fieldName&&o.has(fieldKey(e.tableName,e.fieldName))))}}function extractBreakingChangeFields(e){let t=new Map,n=new Map,r=new Map,i=new Map,a=new Map;for(let o of e.changes)if(o.kind===`field_modified`||o.kind===`field_type_modified`){let{before:e,after:n}=o;if(!e.required&&n.required&&(t.has(o.tableName)||t.set(o.tableName,new Set),A(t.get(o.tableName),`optionalToRequired entry missing`).add(o.fieldName)),e.type===`enum`&&n.type===`enum`&&e.allowedValues&&n.allowedValues){let t=e.allowedValues.map(e=>e.value),i=n.allowedValues.map(e=>e.value),a=new Set(t),s=new Set(i);(t.some(e=>!s.has(e))||i.some(e=>!a.has(e)))&&(r.has(o.tableName)||r.set(o.tableName,new Map),A(r.get(o.tableName),`enumValueChanges entry missing`).set(o.fieldName,{beforeValues:t,afterValues:i}))}}else if(o.kind===`field_added`){let{after:e}=o;e.required&&(n.has(o.tableName)||n.set(o.tableName,new Map),A(n.get(o.tableName),`addedRequiredFields entry missing`).set(o.fieldName,e))}else o.kind===`field_renamed`?(i.has(o.tableName)||i.set(o.tableName,new Map),A(i.get(o.tableName),`renamedFields entry missing`).set(o.fieldName,o.after)):o.kind===`table_renamed`&&a.set(o.tableName,o.after);return{optionalToRequired:t,addedRequiredFields:n,enumValueChanges:r,renamedFields:i,clearedFields:new Map,renamedTypes:a}}function generateDbTypesFromSnapshot(e,t,n=[]){let r=t?extractBreakingChangeFields(t):{optionalToRequired:new Map,addedRequiredFields:new Map,enumValueChanges:new Map,renamedFields:new Map,clearedFields:new Map,renamedTypes:new Map};for(let e of n){let t=r.renamedFields.get(e.tableName)??new Map;t.set(e.tempFieldName,{...e.after,required:!1,unique:!1}),r.renamedFields.set(e.tableName,t);let n=r.clearedFields.get(e.tableName)??new Set;n.add(e.fieldName),r.clearedFields.set(e.tableName,n)}let i=[...Object.values(e.tables),...r.renamedTypes.values()];if(i.length===0)return generateEmptyDbTypes(e.namespace);let a=new Set,o=!1,s=[];for(let e of i){let t=generateTableType(e,r);t.usedTimestamp&&a.add(`Timestamp`),o||=t.usedArrayColumnType,s.push(t.typeDef)}let c=[`type ColumnType`,`type Transaction as KyselyTransaction`];o&&c.push(`type ArrayColumnType`);let l=[];return a.has(`Timestamp`)&&l.push(`type Timestamp = ColumnType<Date, Date | string, Date | string>;`),l.push(`type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
158
+ `)}}}async function withTimeout(e,t,n){let r=new AbortController;try{return await Promise.race([e,Er(t,void 0,{signal:r.signal}).then(()=>{throw Error(n)})])}finally{r.abort()}}const js=new Set([`.DS_Store`,`thumbs.db`,`desktop.ini`]);function shouldIgnoreFile(e){let t=B.basename(e).toLowerCase();return js.has(t)}async function deployStaticWebsite(e,t,n,r,i=!0){let{deploymentId:a}=await e.createDeployment({workspaceId:t,name:n});if(!a)throw Error(`createDeployment returned empty deploymentId`);let o=await uploadDirectory(e,t,a,r,i),{url:s}=await e.publishDeployment({workspaceId:t,deploymentId:a});if(!s)throw Error(`publishDeployment returned empty url`);return{url:s,skippedFiles:o}}async function uploadDirectory(e,t,n,r,i){let a=await collectFiles(r);if(a.length===0)return M.warn(`No files found under ${r}`),[];let o=rr(5),s=a.length,c=i?createProgress(`Uploading files`,s):void 0,l=[];return await Promise.all(a.map(i=>o(async()=>{await uploadSingleFile(e,t,n,r,i,l),c&&c.update()}))),c&&c.finish(),l}async function collectFiles(e,t=``){let n=B.join(e,t),r=await Or.promises.readdir(n,{withFileTypes:!0}),i=[];for(let n of r){let r=B.join(t,n.name);if(n.isDirectory()){let t=await collectFiles(e,r);i.push(...t)}else n.isFile()&&!n.isSymbolicLink()&&!shouldIgnoreFile(r)&&i.push(r)}return i}async function uploadSingleFile(e,t,n,r,i,a){let o=B.join(r,i),s=kr(i);if(!s){a.push(`${i} (unsupported content type; no MIME mapping found)`);return}let c=s,l=Or.createReadStream(o,{highWaterMark:65536});async function*requestStream(){yield{payload:{case:`initialMetadata`,value:{workspaceId:t,deploymentId:n,filePath:i,contentType:c}}};for await(let e of l)yield{payload:{case:`chunkData`,value:e}}}async function uploadWithLogging(){try{await e.uploadFile(requestStream())}catch(e){if(e instanceof q&&e.code===K.InvalidArgument){a.push(`${i} (server rejected file as invalid: ${e.message})`);return}throw e}}await withTimeout(uploadWithLogging(),12e4,`Upload timed out for "${i}"`)}function logSkippedFiles(e){if(e.length!==0){M.warn(`Deployment completed, but some files failed to upload. These files may have unsupported content types or other validation issues. Please review the list below:`);for(let t of e)M.log(` - ${t}`)}}const Ms=X({name:`deploy`,description:`Deploy a static website from a local build directory.`,args:H.strictObject({...Y,name:V(H.string(),{alias:`n`,description:`Static website name`}),dir:V(H.string(),{alias:`d`,description:`Path to the static website files`,completion:{type:`directory`}})}),run:async e=>{await assertWritable({profile:e.profile}),M.info(`Deploying static website "${e.name}" from directory: ${e.dir}`);let t=await loadAccessToken({profile:e.profile}),n=await F(t),r=e.name,i=B.resolve(process.cwd(),e.dir),a=await loadWorkspaceId({workspaceId:e[`workspace-id`],profile:e.profile});if(!Or.existsSync(i)||!Or.statSync(i).isDirectory())throw Error(`Directory not found or not a directory: ${i}`);let{url:o,skippedFiles:s}=await withTimeout(deployStaticWebsite(n,a,r,i,!e.json),6e5,`Deployment timed out after 10 minutes.`);e.json?M.out({name:r,workspaceId:a,url:o,skippedFiles:s}):(M.success(`Static website "${r}" deployed successfully. URL: ${o}`),logSkippedFiles(s))}});function logBetaWarning(e){M.warn(`The '${e}' command is a beta feature and may introduce breaking changes in future releases.`),M.newline()}function normalizeEditorCommand(e){let t=e?.trim();return t&&t.length>0?t:void 0}function getConfiguredEditorCommand(){return normalizeEditorCommand(process.env.VISUAL)??normalizeEditorCommand(process.env.EDITOR)}function getEditorCommand(){return getConfiguredEditorCommand()??`editor`}function parseEditorCommand(e){let[t,...n]=e.trim().split(/\s+/);if(!t)throw Error(`Editor command is empty.`);return{command:t,args:n}}async function openInEditor(e,t=getEditorCommand()){let{command:n,args:r}=parseEditorCommand(t);return await new Promise((t,i)=>{let a=Dr(n,[...r,e],{stdio:`inherit`,detached:!1});a.once(`error`,e=>i(e)),a.once(`close`,e=>{if(e==null||e===0){t();return}i(Error(`Editor exited with code ${e}.`))})}),!0}async function openInConfiguredEditor(e){let t=getConfiguredEditorCommand();return t?await openInEditor(e,t):!1}function fieldKey(e,t){return`${e}.${t}`}function buildTempFieldName(e,t){let n=`${e}Migrate`;for(let e=1;e<=t.size+1;e++){let r=e===1?n:`${n}${e}`;if(r.length>63)break;if(!t.has(r))return r}throw Error(`Cannot derive a temporary field name for "${e}": every candidate is taken or exceeds 63 characters.`)}function canConvertField(e){return getExpandContractEligibility(e).eligible}function getExpandContractEligibility(e){let{previous:t,current:n,tableName:r,fieldName:i}=e,a=t.tables[r]?.fields[i],o=n.tables[r]?.fields[i];if(!a||!o)return{eligible:!1,reason:`the field does not exist in both schemas`};let s=getExpandContractFieldChangeEligibility(a,o);return s.eligible?isFieldReferenced(t.tables[r],i)||isFieldReferenced(n.tables[r],i)?{eligible:!1,reason:`another schema feature references the field`}:{eligible:!0}:s}function typeMemberNames(e){return e?[...Object.keys(e.fields),...Object.keys(e.files??{}),...Object.keys(e.forwardRelationships??{}),...Object.keys(e.backwardRelationships??{})]:[]}function staticPropertyName(e,t){if(!t&&e.type===`Identifier`)return e.name;if(e.type===`Literal`&&typeof e.value==`string`)return e.value;if(e.type===`TemplateLiteral`&&e.expressions.length===0)return e.quasis[0]?.value.cooked??void 0}const Ns=new Set([`input`,`newRecord`,`oldRecord`,`invoker`,`now`]);function walkScriptAst(e,t,n=[]){if(!e)return;t(e,n);let r=[...n,e],i=e;for(let[e,n]of Object.entries(i))if(e!==`type`&&e!==`parent`){if(Array.isArray(n))for(let e of n)e&&typeof e==`object`&&`type`in e&&walkScriptAst(e,t,r);else n&&typeof n==`object`&&`type`in n&&walkScriptAst(n,t,r)}}function unwrapFunction(e){return e.type===`ParenthesizedExpression`?unwrapFunction(e.expression):e}function collectIssueBindings(e){let t=new Set([`__issues`]);walkScriptAst(e,e=>{if(e.type!==`CallExpression`)return;let n=unwrapFunction(e.callee);if(n.type!==`ArrowFunctionExpression`&&n.type!==`FunctionExpression`||e.arguments[1]?.type!==`Identifier`||e.arguments[1].name!==`__issues`)return;let r=n.params[1];r?.type===`Identifier`&&t.add(r.name)});let n;do{let r=t.size;walkScriptAst(e,e=>{e.type===`VariableDeclarator`&&e.id.type===`Identifier`&&e.init?.type===`Identifier`&&t.has(e.init.name)&&t.add(e.id.name)}),n=t.size>r}while(n);return t}function isWrapperArgumentProperty(e,t){if(e.type!==`Property`)return!1;let n=staticPropertyName(e.key,e.computed);if(!n||!Ns.has(n))return!1;let r=t.at(-1),i=t.at(-2);return r?.type!==`ObjectExpression`||i?.type!==`CallExpression`?!1:i.arguments[0]===r&&[`ArrowFunctionExpression`,`FunctionExpression`].includes(unwrapFunction(i.callee).type)}function isWrapperParameterProperty(e,t){if(e.type!==`Property`)return!1;let n=staticPropertyName(e.key,e.computed);if(!n||!Ns.has(n))return!1;let r=t.at(-1);if(r?.type!==`ObjectPattern`)return!1;for(let e=t.length-2;e>=0;e--){let i=t[e];if(i&&(i.type===`ArrowFunctionExpression`||i.type===`FunctionExpression`)&&i.params[0]===r)return t.slice(0,e).some(e=>e.type===`CallExpression`&&unwrapFunction(e.callee)===i&&e.arguments[0]?.type===`ObjectExpression`&&e.arguments[0].properties.some(e=>e.type===`Property`&&staticPropertyName(e.key,e.computed)===n))}return!1}function isIssueMessage(e,t,n){let r=t.at(-1);return r?.type===`CallExpression`&&r.callee.type===`Identifier`&&n.has(r.callee.name)&&r.arguments.findIndex(t=>t===e)>0}function scriptReferencesField(e,t){try{let{program:n,errors:r}=mr(`expand-contract-reference.js`,e,{sourceType:`module`});if(r.length>0)return!0;let i=collectIssueBindings(n),a=!1;return walkScriptAst(n,(e,n)=>{a||(e.type===`MemberExpression`&&(staticPropertyName(e.property,e.computed)===t||e.computed&&staticPropertyName(e.property,!0)===void 0)||e.type===`Property`&&(staticPropertyName(e.key,e.computed)===t||e.computed&&staticPropertyName(e.key,!0)===void 0)&&(e.computed||!isWrapperArgumentProperty(e,n)&&!isWrapperParameterProperty(e,n))||e.type===`CallExpression`&&e.callee.type===`Identifier`&&i.has(e.callee.name)&&e.arguments[0]!==void 0&&e.arguments[0].type!==`SpreadElement`&&staticPropertyName(e.arguments[0],!0)===t||(e.type===`Literal`||e.type===`TemplateLiteral`)&&staticPropertyName(e,!0)===t&&!isIssueMessage(e,n,i))&&(a=!0)}),a}catch{return!0}}function permissionsReferenceField(e,t){return e?[...e.record?Object.values(e.record).flatMap(e=>e):[],...e.gql??[]].some(e=>e.conditions.some(e=>{let[n,,r]=e;return[n,r].some(e=>isSnapshotFieldRefOperand(e)&&(`record`in e&&e.record===t||`newRecord`in e&&e.newRecord===t||`oldRecord`in e&&e.oldRecord===t))})):!1}function isFieldReferenced(e,t){return e?Object.values(e.indexes??{}).some(e=>e.fields.includes(t))||[...Object.values(e.forwardRelationships??{}),...Object.values(e.backwardRelationships??{})].some(e=>e.sourceField===t||e.targetField===t)||permissionsReferenceField(e.permissions,t)?!0:[e.typeHookExpr?.create,e.typeHookExpr?.update,e.typeValidateExpr].filter(e=>e!==void 0).some(e=>scriptReferencesField(e,t)):!1}function planExpandContract(e){let{previous:t,current:n,diff:r,confirmed:i}=e,a=[],o=new Set;for(let e of r.changes){if(e.kind!==`field_type_modified`)continue;let r=fieldKey(e.tableName,e.fieldName);if(!i.has(r)||!canConvertField({previous:t,current:n,tableName:e.tableName,fieldName:e.fieldName}))continue;let s=new Set([...typeMemberNames(t.tables[e.tableName]),...typeMemberNames(n.tables[e.tableName]),...a.filter(t=>t.tableName===e.tableName).map(e=>e.tempFieldName)]);a.push({tableName:e.tableName,fieldName:e.fieldName,tempFieldName:buildTempFieldName(e.fieldName,s),before:e.before,after:e.after}),o.add(r)}return{plans:a,blocked:r.breakingChanges.filter(e=>e.unsupported&&!(e.fieldName&&o.has(fieldKey(e.tableName,e.fieldName))))}}function extractBreakingChangeFields(e){let t=new Map,n=new Map,r=new Map,i=new Map,a=new Map;for(let o of e.changes)if(o.kind===`field_modified`||o.kind===`field_type_modified`){let{before:e,after:n}=o;if(!e.required&&n.required&&(t.has(o.tableName)||t.set(o.tableName,new Set),A(t.get(o.tableName),`optionalToRequired entry missing`).add(o.fieldName)),e.type===`enum`&&n.type===`enum`){let t=(e.allowedValues??[]).map(e=>e.value),i=(n.allowedValues??[]).map(e=>e.value),a=new Set(t),s=new Set(i);(t.some(e=>!s.has(e))||i.some(e=>!a.has(e)))&&(r.has(o.tableName)||r.set(o.tableName,new Map),A(r.get(o.tableName),`enumValueChanges entry missing`).set(o.fieldName,{beforeValues:t,afterValues:i,afterRequired:n.required}))}}else if(o.kind===`field_added`){let{after:e}=o;e.required&&(n.has(o.tableName)||n.set(o.tableName,new Map),A(n.get(o.tableName),`addedRequiredFields entry missing`).set(o.fieldName,e))}else o.kind===`field_renamed`?(i.has(o.tableName)||i.set(o.tableName,new Map),A(i.get(o.tableName),`renamedFields entry missing`).set(o.fieldName,o.after)):o.kind===`table_renamed`&&a.set(o.tableName,o.after);return{optionalToRequired:t,addedRequiredFields:n,enumValueChanges:r,renamedFields:i,clearedFields:new Map,renamedTypes:a}}function generateDbTypesFromSnapshot(e,t,n=[]){let r=t?extractBreakingChangeFields(t):{optionalToRequired:new Map,addedRequiredFields:new Map,enumValueChanges:new Map,renamedFields:new Map,clearedFields:new Map,renamedTypes:new Map};for(let e of n){let t=r.renamedFields.get(e.tableName)??new Map;t.set(e.tempFieldName,{...e.after,required:!1,unique:!1}),r.renamedFields.set(e.tableName,t);let n=r.clearedFields.get(e.tableName)??new Set;n.add(e.fieldName),r.clearedFields.set(e.tableName,n)}let i=[...Object.values(e.tables),...r.renamedTypes.values()];if(i.length===0)return generateEmptyDbTypes(e.namespace);let a=new Set,o=!1,s=[];for(let e of i){let t=generateTableType(e,r);t.usedTimestamp&&a.add(`Timestamp`),o||=t.usedArrayColumnType,s.push(t.typeDef)}let c=[`type ColumnType`,`type Transaction as KyselyTransaction`];o&&c.push(`type ArrayColumnType`);let l=[];return a.has(`Timestamp`)&&l.push(`type Timestamp = ColumnType<Date, Date | string, Date | string>;`),l.push(`type Generated<T> = T extends ColumnType<infer S, infer I, infer U>
159
159
  ? ColumnType<S, I | undefined, U>
160
160
  : ColumnType<T, T | undefined, T>;`),a.has(`Serial`)&&l.push(`type Serial<T = string | number> = ColumnType<T, never, never>;`),[`/**`,` * Auto-generated Kysely types for migration script.`,` * These types reflect the database schema state at this migration point.`,` *`,` * DO NOT EDIT - This file is auto-generated by the migration system.`,` */`,``,`import { ${c.join(`, `)} } from "@tailor-platform/sdk/kysely";`,`import type { Env } from "@tailor-platform/sdk";`,``,...l,``,`export interface Database {`,...s,`}`,``,`export type Transaction = KyselyTransaction<Database>;`,``,"/** Context passed as the second argument to the migration's `main` function. */",`export type MigrationContext = {`,` env: keyof Env extends never ? Record<string, string | number | boolean> : Env;`,`};`].join(`
161
161
  `)+`
162
162
  `}function generateEmptyDbTypes(e){return[`/**`,` * Auto-generated Kysely types for migration script.`,` * Namespace: ${e}`,` *`,` * DO NOT EDIT - This file is auto-generated by the migration system.`,` */`,``,`import { type Transaction as KyselyTransaction } from "@tailor-platform/sdk/kysely";`,`import type { Env } from "@tailor-platform/sdk";`,``,`// eslint-disable-next-line @typescript-eslint/no-empty-object-type`,`export interface Database {}`,``,`export type Transaction = KyselyTransaction<Database>;`,``,"/** Context passed as the second argument to the migration's `main` function. */",`export type MigrationContext = {`,` env: keyof Env extends never ? Record<string, string | number | boolean> : Env;`,`};`].join(`
163
163
  `)+`
164
164
  `}function generateTableType(e,t){let n=[],r=!1,i=!1,a=!1;n.push(` id: Generated<string>;`);let o=t.optionalToRequired.get(e.name)||new Set,s=t.addedRequiredFields.get(e.name)||new Map,c=t.enumValueChanges.get(e.name)||new Map,l=t.clearedFields.get(e.name)??new Set;for(let[t,s]of Object.entries(e.fields)){if(t===`id`)continue;let e=generateFieldType(s,o.has(t),c.get(t)),u=l.has(t),d=u?generateClearableFieldType(s):e;n.push(` ${t}: ${d.type};`),r||=d.usedTimestamp,i=i||e.usedColumnType||u,a||=!u&&e.usedArrayColumnType}for(let[e,t]of s){let o=generateFieldType(t,!0,void 0);n.push(` ${e}: ${o.type};`),r||=o.usedTimestamp,i||=o.usedColumnType,a||=o.usedArrayColumnType}let u=t.renamedFields.get(e.name)||new Map;for(let[e,t]of u){let o=generateFieldType(t,t.required,void 0);n.push(` ${e}: ${o.type};`),r||=o.usedTimestamp,i||=o.usedColumnType,a||=o.usedArrayColumnType}return{typeDef:` ${e.name}: {\n${n.join(`
165
- `)}\n }`,usedTimestamp:r,usedColumnType:i,usedArrayColumnType:a}}function mapToTsType(e){if(e===`enum`||e===`nested`)return{type:`string`,usedTimestamp:!1};let t=xn(e);return{type:t,usedTimestamp:t===`Timestamp`}}function formatEnumUnion(e){return e.length===0?`never`:e.map(e=>`"${e}"`).join(` | `)}function generateEnumChangeColumnType(e,t){let n=formatEnumUnion([...new Set([...e.beforeValues,...e.afterValues])]),r=formatEnumUnion(e.afterValues);return t.array&&!t.required?`ColumnType<(${n})[] | null, (${r})[] | null, (${r})[] | null>`:t.array?`ColumnType<(${n})[], (${r})[], (${r})[]>`:t.required?`ColumnType<${n}, ${r}, ${r}>`:`ColumnType<(${n}) | null, (${r}) | null, (${r}) | null>`}function generateClearableFieldType(e){let{type:t}=mapToTsType(e.type),n=Sn.get(t);if(n){let t=e.array?`${n.select}[]`:n.select,r=e.array?`(${n.write})[]`:n.write;return{type:`ColumnType<${t} | null, ${r} | null, ${r} | null>`,usedTimestamp:!1}}let r=e.array?`${t}[]`:t;return{type:`ColumnType<${r} | null, ${r} | null, ${r} | null>`,usedTimestamp:!1}}function generateOptionalToRequiredDateColumnType(e){if(e.type!==`date`&&e.type!==`datetime`)return null;let t=Sn.get(xn(e.type));if(!t)return null;let n=e.array?`${t.select}[]`:t.select,r=e.array?`(${t.write})[]`:t.write;return`ColumnType<${n} | null, ${r}, ${r}>`}function generateFieldType(e,t,n){if(n)return{type:generateEnumChangeColumnType(n,e),usedTimestamp:!1,usedColumnType:!0,usedArrayColumnType:!1};let r,i=!1;if(e.type===`enum`){let t=e.allowedValues?.map(e=>e.value)??[];r=t.length>0?formatEnumUnion(t):`string`}else{let t=mapToTsType(e.type);r=t.type,i=t.usedTimestamp}if(t){let t=generateOptionalToRequiredDateColumnType(e);if(t)return{type:t,usedTimestamp:!1,usedColumnType:!0,usedArrayColumnType:!1}}let a=r;if(e.array){if(Sn.has(r)){let t=`ArrayColumnType<${r}>`;return{type:e.required?t:`${t} | null`,usedTimestamp:i,usedColumnType:!1,usedArrayColumnType:!0}}a=e.type===`enum`&&e.allowedValues&&e.allowedValues.length>0?`(${r})[]`:`${r}[]`}return t?{type:`ColumnType<${a} | null, ${a}, ${a}>`,usedTimestamp:i,usedColumnType:!0,usedArrayColumnType:!1}:(e.required||(a=`${a} | null`),{type:a,usedTimestamp:i,usedColumnType:!1,usedArrayColumnType:!1})}async function writeDbTypesFile(e,t,n,r,i=[]){let a=generateDbTypesFromSnapshot(e,r,i),o=getMigrationFilePath(t,n,`db`);return await J.writeFile(o,a),o}const Ps=`TODO(tailor-migration-review)`;async function fileExists(e){try{return await J.access(e),!0}catch{return!1}}async function ensureFileNotExists(e){if(await fileExists(e))throw Error(`Migration file already exists: ${e}`)}async function generateSchemaFile(e,t,n){let r=getMigrationDirPath(t,n);await J.mkdir(r,{recursive:!0});let i=getMigrationFilePath(t,n,`schema`);return await ensureFileNotExists(i),await J.writeFile(i,JSON.stringify(e,null,2)),{filePath:i,migrationNumber:n}}async function generateDiffFiles(e,t,n,r,i,a=[]){let o=getMigrationDirPath(t,n);await J.mkdir(o,{recursive:!0});let s=getMigrationFilePath(t,n,`diff`),c=getMigrationFilePath(t,n,`migrate`),l=getMigrationFilePath(t,n,`db`),u=e.requiresMigrationScript;await ensureFileNotExists(s),u&&(await ensureFileNotExists(c),await ensureFileNotExists(l));let d=i?{...e,description:i}:e;await J.writeFile(s,JSON.stringify(d,null,2));let f={diffFilePath:s,migrationNumber:n};if(u){let e=generateMigrationScript(d,a);await J.writeFile(c,e),f.migrateFilePath=c,await writeDbTypesFile(r,t,n,d,a),f.dbTypesFilePath=l}return f}async function generateDataOnlyMigrationFiles(e){let{migrationsDir:t,migrationNumber:n,snapshot:r,description:i}=e,a=getMigrationDirPath(t,n);await J.mkdir(a,{recursive:!0});let o=getMigrationFilePath(t,n,`diff`),s=getMigrationFilePath(t,n,`migrate`),c=getMigrationFilePath(t,n,`db`);await ensureFileNotExists(o),await ensureFileNotExists(s),await ensureFileNotExists(c);let l=i?{...e.diff,description:i}:e.diff;return await J.writeFile(o,JSON.stringify(l,null,2)),await J.writeFile(s,generateDataOnlyMigrationScript(l.namespace)),await writeDbTypesFile(r,t,n,l),{diffFilePath:o,migrateFilePath:s,dbTypesFilePath:c,migrationNumber:n}}function generateDataOnlyMigrationScript(e){return`/**
165
+ `)}\n }`,usedTimestamp:r,usedColumnType:i,usedArrayColumnType:a}}function mapToTsType(e){if(e===`enum`||e===`nested`)return{type:`string`,usedTimestamp:!1};let t=xn(e);return{type:t,usedTimestamp:t===`Timestamp`}}function formatEnumUnion(e){return e.map(e=>`"${e}"`).join(` | `)}function formatEnumSlot(e,t,n){if(e.length===0)return t?n?`never[] | null`:`never[]`:n?`null`:`never`;let r=formatEnumUnion(e);return t?n?`(${r})[] | null`:`(${r})[]`:n?`(${r}) | null`:r}function generateEnumChangeColumnType(e,t){let n=t.array??!1,r=[...new Set([...e.beforeValues,...e.afterValues])],i=!e.afterRequired,a=formatEnumSlot(r,n,!t.required||i),o=formatEnumSlot(e.afterValues,n,i);return`ColumnType<${a}, ${o}, ${o}>`}function generateClearableFieldType(e){let{type:t}=mapToTsType(e.type),n=Sn.get(t);if(n){let t=e.array?`${n.select}[]`:n.select,r=e.array?`(${n.write})[]`:n.write;return{type:`ColumnType<${t} | null, ${r} | null, ${r} | null>`,usedTimestamp:!1}}let r=e.array?`${t}[]`:t;return{type:`ColumnType<${r} | null, ${r} | null, ${r} | null>`,usedTimestamp:!1}}function generateOptionalToRequiredDateColumnType(e){if(e.type!==`date`&&e.type!==`datetime`)return null;let t=Sn.get(xn(e.type));if(!t)return null;let n=e.array?`${t.select}[]`:t.select,r=e.array?`(${t.write})[]`:t.write;return`ColumnType<${n} | null, ${r}, ${r}>`}function generateFieldType(e,t,n){if(n)return{type:generateEnumChangeColumnType(n,e),usedTimestamp:!1,usedColumnType:!0,usedArrayColumnType:!1};let r,i=!1;if(e.type===`enum`){let t=e.allowedValues?.map(e=>e.value)??[];r=t.length>0?formatEnumUnion(t):`string`}else{let t=mapToTsType(e.type);r=t.type,i=t.usedTimestamp}if(t){let t=generateOptionalToRequiredDateColumnType(e);if(t)return{type:t,usedTimestamp:!1,usedColumnType:!0,usedArrayColumnType:!1}}let a=r;if(e.array){if(Sn.has(r)){let t=`ArrayColumnType<${r}>`;return{type:e.required?t:`${t} | null`,usedTimestamp:i,usedColumnType:!1,usedArrayColumnType:!0}}a=e.type===`enum`&&e.allowedValues&&e.allowedValues.length>0?`(${r})[]`:`${r}[]`}return t?{type:`ColumnType<${a} | null, ${a}, ${a}>`,usedTimestamp:i,usedColumnType:!0,usedArrayColumnType:!1}:(e.required||(a=`${a} | null`),{type:a,usedTimestamp:i,usedColumnType:!1,usedArrayColumnType:!1})}async function writeDbTypesFile(e,t,n,r,i=[]){let a=generateDbTypesFromSnapshot(e,r,i),o=getMigrationFilePath(t,n,`db`);return await J.writeFile(o,a),o}const Ps=`TODO(tailor-migration-review)`;async function fileExists(e){try{return await J.access(e),!0}catch{return!1}}async function ensureFileNotExists(e){if(await fileExists(e))throw Error(`Migration file already exists: ${e}`)}async function generateSchemaFile(e,t,n){let r=getMigrationDirPath(t,n);await J.mkdir(r,{recursive:!0});let i=getMigrationFilePath(t,n,`schema`);return await ensureFileNotExists(i),await J.writeFile(i,JSON.stringify(e,null,2)),{filePath:i,migrationNumber:n}}async function generateDiffFiles(e,t,n,r,i,a=[]){let o=getMigrationDirPath(t,n);await J.mkdir(o,{recursive:!0});let s=getMigrationFilePath(t,n,`diff`),c=getMigrationFilePath(t,n,`migrate`),l=getMigrationFilePath(t,n,`db`),u=e.requiresMigrationScript;await ensureFileNotExists(s),u&&(await ensureFileNotExists(c),await ensureFileNotExists(l));let d=i?{...e,description:i}:e;await J.writeFile(s,JSON.stringify(d,null,2));let f={diffFilePath:s,migrationNumber:n};if(u){let e=generateMigrationScript(d,a);await J.writeFile(c,e),f.migrateFilePath=c,await writeDbTypesFile(r,t,n,d,a),f.dbTypesFilePath=l}return f}async function generateDataOnlyMigrationFiles(e){let{migrationsDir:t,migrationNumber:n,snapshot:r,description:i}=e,a=getMigrationDirPath(t,n);await J.mkdir(a,{recursive:!0});let o=getMigrationFilePath(t,n,`diff`),s=getMigrationFilePath(t,n,`migrate`),c=getMigrationFilePath(t,n,`db`);await ensureFileNotExists(o),await ensureFileNotExists(s),await ensureFileNotExists(c);let l=i?{...e.diff,description:i}:e.diff;return await J.writeFile(o,JSON.stringify(l,null,2)),await J.writeFile(s,generateDataOnlyMigrationScript(l.namespace)),await writeDbTypesFile(r,t,n,l),{diffFilePath:o,migrateFilePath:s,dbTypesFilePath:c,migrationNumber:n}}function generateDataOnlyMigrationScript(e){return`/**
166
166
  * Data-only migration script for ${e}
167
167
  *
168
168
  * This migration carries no schema change; it exists to run this script.
@@ -267,11 +267,11 @@ describe(${JSON.stringify(`${e.namespace} migration`)}, () => {
267
267
  ${e.fieldName}: null, // TODO: Set appropriate default value
268
268
  })
269
269
  .where("${e.fieldName}", "is", null)
270
- .execute();`),!t){let t=generateUniqueConstraintScript(e);t&&a.push(t)}if(r.type===`enum`&&i.type===`enum`){let t=(r.allowedValues??[]).map(e=>e.value),n=(i.allowedValues??[]).map(e=>e.value),o=t.filter(e=>!n.includes(e));if(o.length>0){let t=n[0]??`NEW_VALUE`;a.push(` // Migrate records with removed enum values: ${o.join(`, `)}
270
+ .execute();`),!t){let t=generateUniqueConstraintScript(e);t&&a.push(t)}if(r.type===`enum`&&i.type===`enum`){let t=(r.allowedValues??[]).map(e=>e.value),n=(i.allowedValues??[]).map(e=>e.value),o=t.filter(e=>!n.includes(e));if(o.length>0){let[t]=n,r=t===void 0?i.required?`"NEW_VALUE"`:`null`:JSON.stringify(t);a.push(` // Migrate records with removed enum values: ${o.join(`, `)}
271
271
  await trx
272
272
  .updateTable("${e.tableName}")
273
- .set({ ${e.fieldName}: "${t}" }) // TODO: Set appropriate value
274
- .where("${e.fieldName}", "in", [${o.map(e=>`"${e}"`).join(`, `)}])
273
+ .set({ ${e.fieldName}: ${r} }) // TODO: Set appropriate value
274
+ .where("${e.fieldName}", "in", [${o.map(e=>JSON.stringify(e)).join(`, `)}])
275
275
  .execute();`)}}return isBreakingForeignKeyRetarget(r,i,n)&&a.push(` // Migrate ${e.fieldName} references from ${r.foreignKeyType} to ${i.foreignKeyType}
276
276
  // Find records that don't have a valid reference in the new target table
277
277
  {
@@ -639,4 +639,4 @@ This is the baseline schema. Future changes will be tracked as diffs.`)}function
639
639
  `}async function bundleQueryScript(e,t){let n=B.resolve(Gt(),`query`);W.mkdirSync(n,{recursive:!0});let r=B.join(n,`query_${e}.entry.ts`),i=e===`sql`?createSqlEntry():createGqlEntry();W.writeFileSync(r,i);let a=await ht(t),o=St({tsconfig:a}),s=await pr.build({plugins:[Ot(r,t),gt(),wt],input:r,write:!1,output:{format:`esm`,sourcemap:!1,minify:!1,codeSplitting:!1,globals:{tailordb:`tailordb`}},external:e===`sql`?[`tailordb`]:[],resolve:{conditionNames:[`node`,`import`]},tsconfig:a,treeshake:{moduleSideEffects:!1,annotations:!0,unknownGlobalSideEffects:!1},...o.options});return o.assertAllResolved(),s.output[0].code}function toErrorMessage(e){return e instanceof Error?e.message:String(e)}function mapQueryExecutionError(e){let t=toErrorMessage(e.error);if(t.includes(`machine user does not exist`))return R({code:`not_found`,message:`Machine user '${e.machineUser??`unknown`}' was not found.`,suggestion:"Run `tailor machineuser list` and use an existing name."});if(e.engine===`sql`&&t.includes(`sqlaccess error: failed to fetch schema: query returned an unexpected number of rows`))return R({code:`invalid_namespace`,message:`Failed to load TailorDB schema for namespace '${e.namespace}'.`,suggestion:`Ensure the query references TailorDB tables from a single namespace and re-apply if needed.`});if(e.engine===`sql`&&t.includes(`sqlaccess error: failed to parse:`)){let e=t.split(`sqlaccess error: failed to parse:`).at(1)?.split(`
640
640
  `).at(0)?.trim();return R({code:`invalid_sql`,message:`SQL parse error.`,suggestion:e??`The SQL query contains unsupported syntax.`})}return e.error instanceof Error?e.error:Error(t)}function isGraphQLInputComplete(e){if(e.trim().length===0)return!1;try{return Nr(e),!0}catch{return!1}}function isSqlInputComplete(e){let t=!1,n=!1,r=!1,i=0,a=null,o=!1;for(let s=0;s<e.length;s+=1){let c=A(e[s],`character at index ${s} missing`),l=e[s+1];if(r){c===`
641
641
  `&&(r=!1);continue}if(i>0){if(c===`/`&&l===`*`){i+=1,s+=1;continue}c===`*`&&l===`/`&&(--i,s+=1);continue}if(a!=null){e.startsWith(a,s)&&(s+=a.length-1,a=null);continue}if(t){if(c===`'`&&l===`'`){s+=1;continue}c===`'`&&(t=!1);continue}if(n){if(c===`"`&&l===`"`){s+=1;continue}c===`"`&&(n=!1);continue}if(c===`-`&&l===`-`){r=!0,s+=1;continue}if(c===`/`&&l===`*`){i=1,s+=1;continue}if(c===`'`){o=!1,t=!0;continue}if(c===`"`){o=!1,n=!0;continue}if(c===`$`){let t=e.slice(s),n=t.match(/^\$[A-Za-z_][A-Za-z0-9_]*\$/)??t.match(/^\$\$/);if(n!=null){o=!1,a=n[0],s+=n[0].length-1;continue}}if(c===`;`){o=!0;continue}/\s/.test(c)||(o=!1)}return o&&!t&&!n&&i===0&&a==null}function extractTableNamesFromSql(e){let t;try{t=Mr(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`SQL parse error: ${t}\nIf your table name is a reserved keyword (e.g. User), wrap it in double quotes: SELECT * FROM "User"`,{cause:e})}let n=new Set,r=jr(e=>({tableRef:t=>(n.add(t.name),e.super().tableRef(t),t)}));for(let e of t)r.statement(e);return[...n]}function collectAliasMap(e){let t=new Map;for(let n of e)if(n.type===`table`){let e=n.name.name,r=n.name.alias??e;t.set(r,e)}return t}function extractColumnTemplate(e){try{let t=Mr(e);for(let e of t){if(e.type!==`select`||!e.columns)continue;let t=collectAliasMap(e.from??[]),n=[],r=!1;for(let i of e.columns)if(i.expr.type===`ref`&&i.expr.name===`*`){if(r=!0,i.expr.table){let e=t.get(i.expr.table.name);n.push({type:`wildcard`,tableNames:e?[e]:[]})}else n.push({type:`wildcard`,tableNames:[...new Set(t.values())]})}else{let e=i.alias?.name??(i.expr.type===`ref`?i.expr.name:null);e&&n.push({type:`explicit`,name:e})}return r?n:null}return null}catch{return null}}async function loadTypeFieldOrder(e,t){let n=new Map,r=e.db?.[t];if(!r||!(`files`in r)||r.files.length===0)return n;let i=B.dirname(e.path),a=sn(r,i);return await Promise.all(a.map(async e=>{try{let t=await import(Zn(e).href);for(let e of Object.values(t)){let t=on.safeParse(cn(e));t.success&&n.set(t.data.name,Object.keys(t.data.fields))}}catch{}})),n}const oc=H.enum([`sql`,`gql`]),sc=H.object({workspaceId:H.string().optional(),profile:H.string().optional(),configPath:H.string().optional(),engine:oc,machineUser:H.string().optional(),machineUserSource:H.enum([`option`,`env`]).optional()}),cc=sc.extend({query:H.string()});async function getNamespaceFromSqlQuery(e,t,n,r){if(r.length===0)throw Error(`No namespaces found in configuration.`);if(r.length===1)return A(r[0],`namespace missing`);let i=extractTableNamesFromSql(t);if(i.length===0)throw Error(`Could not infer namespace from query. Detected namespaces: ${r.join(`, `)}.`);let a=await resolveTableNamespaces({workspaceId:e,namespaces:r,tableNames:i,client:n}),o=i.filter(e=>!a.has(e));if(o.length>0)throw Error(`Could not find namespace for tables in query: ${o.join(`, `)}.`);let s=new Set(a.values());if(s.size===1)return A([...s][0],`namespace from types missing`);throw Error(`Query references tables from multiple namespaces: ${[...s].join(`, `)}.`)}async function loadOptions(e){let t=parseOptions(sc,e),n=await loadMachineUserName({machineUser:t.machineUser,machineUserSource:t.machineUserSource,profile:t.profile});if(!n)throw Error(`Machine user is required. Specify --machine-user, set TAILOR_PLATFORM_MACHINE_USER_NAME, or set a profile default with 'tailor profile update <profile> --machine-user <name>'.`);let r=await loadAccessToken({profile:t.profile}),i=await F(r),a=await loadWorkspaceId({workspaceId:t.workspaceId,profile:t.profile}),{config:o}=await loadConfig(e.configPath),s=extractAllNamespaces(o),{application:c}=await i.getApplication({workspaceId:a,applicationName:o.name});if(!c?.authNamespace)throw Error(`Application ${o.name} does not have an auth configuration.`);let{machineUser:l}=await i.getAuthMachineUser({workspaceId:a,authNamespace:c.authNamespace,name:n});if(!l)throw Error(`Machine user ${n} not found.`);return{engine:t.engine,client:i,workspaceId:a,config:o,application:c,machineUserResource:l,namespaces:s}}async function sqlQuery(e,t,n){let r=splitSqlStatements(n.query),i=await executeScript({client:e,workspaceId:n.workspaceId,name:`query-sql-${n.namespace}.js`,code:n.bundledCode,arg:{namespace:n.namespace,queries:r},invoker:t});if(!i.success)throw Error(i.error);return{engine:`sql`,namespace:n.namespace,query:n.query,result:parseExecutionResult(i.result)}}async function gqlQuery(e,t,n,r,i){let{access_token:a}=await kt(n.url,r.clientId,r.clientSecret),o=await executeScript({client:e,workspaceId:i.workspaceId,name:`query-gql.js`,code:i.bundledCode,arg:{endpoint:`${n.url}/query`,accessToken:a,query:i.query},invoker:t});if(!o.success)throw Error(o.error);return{engine:`gql`,query:i.query,result:parseExecutionResult(o.result)}}function parseExecutionResult(e){if(!e)return null;try{return JSON.parse(e)}catch{return e}}async function resolveQueryCommandInput(e){return e.query==null?e.file==null?e.edit?await resolveEditedQueryInput(e.engine):{mode:`repl`}:{mode:`query`,query:await J.readFile(e.file,`utf-8`)}:{mode:`query`,query:e.query}}async function resolveEditedQueryInput(e){if(!process.stdin.isTTY||!process.stdout.isTTY)throw Error(`Non-interactive terminals are not supported. Pass -q/--query or -f/--file to run a query.`);let t=getEditorCommand(),n=await J.mkdtemp(B.join(gr(),`tailor-query-`)),r=e===`sql`?`sql`:`graphql`,i=B.join(n,`query.${r}`);try{await J.writeFile(i,``,`utf-8`);try{await openInEditor(i,t)}catch(e){throw Error(`Failed to open query editor "${t}": ${e instanceof Error?e.message:String(e)}`,{cause:e})}let e=await J.readFile(i,`utf-8`);return e.trim().length===0||e===``?{mode:`abort`}:{mode:`query`,query:e}}finally{await J.rm(n,{recursive:!0,force:!0})}}async function query(e){let t=parseOptions(cc,e);return await(await prepareQueryExecutor(t))(t.query)}async function prepareQueryExecutor(e){let{client:t,workspaceId:n,config:r,application:i,machineUserResource:a,engine:o,namespaces:s}=await loadOptions(e),c=await bundleQueryScript(o,B.dirname(r.path)),l=U(C,{namespace:i.authNamespace,machineUserName:a.name});return async e=>{let u;try{switch(o){case`sql`:return u=await getNamespaceFromSqlQuery(n,e,t,s),reorderSqlColumns(await sqlQuery(t,l,{workspaceId:n,namespace:u,bundledCode:c,query:e}),r,u,e);case`gql`:return await gqlQuery(t,l,i,a,{workspaceId:n,bundledCode:c,query:e});default:throw Error(`Unsupported query engine: ${o}`)}}catch(e){throw mapQueryExecutionError({error:e,engine:o,namespace:u,machineUser:a.name})}}}function resolveReplCommand(e){let t=e.trim();return t.startsWith(`\\`)?t===`\\q`||t===`\\quit`?`quit`:t===`\\help`||t===`\\h`||t===`\\?`?`help`:t===`\\clear`||t===`\\c`?`clear`:`unknown`:null}function clearReplScreen(){process.stdout.write(`\x1Bc`)}function sanitizeHistoryScope(e){return e.replace(/[^a-zA-Z0-9._-]/g,`_`)}function getReplHistoryPath(e,t,n){if(!nr)return;let r=[t,n].filter(e=>!!e).map(sanitizeHistoryScope).join(`-`),i=e===`sql`?`sql`:`gql`,a=r?`-${r}`:``;return B.join(nr,`tailor-platform`,`query-history-${i}${a}.json`)}function createReplValidator(e){return t=>{let n=t.trim();if(n!==``&&resolveReplCommand(n)===null)return e===`sql`?isSqlInputComplete(t)?void 0:`SQL statement is incomplete (missing ';').`:isGraphQLInputComplete(t)?void 0:`GraphQL document is incomplete.`}}async function runRepl(e){if(!process.stdin.isTTY||!process.stdout.isTTY)throw Error(`Non-interactive terminals are not supported. Pass -q/--query or -f/--file to run a query.`);let t=await prepareQueryExecutor(e),n=getReplHistoryPath(e.engine,e.profile,e.workspaceId),r=createReplValidator(e.engine),{highlightSqlLine:i,highlightGraphqlLine:a,replTransform:o}=await import(`./repl-editor-BG1aDOfH.mjs`),s=e.engine===`sql`?i:a,c=Ar({prefix:``,preferNewlineOnEnter:e.newlineOnEnter,validate:r,highlight:s,transform:o,theme:{submitRender:`preserve`},history:n?{filePath:n,maxEntries:100}:[],helpFooter:{items:[`submit`,`newline`],maxLines:1}});for(M.info(`Entering ${e.engine.toUpperCase()} REPL mode.`),M.info(`Type \\help for usage, \\q to quit.`);;){let[n,r]=await c(`${e.engine}> `);if(r?.kind===`cancel`){if(n.length===0)return;continue}if(r?.kind===`eof`)return;let i=n.trim();if(i===``)continue;let a=resolveReplCommand(i);if(a===`quit`)return;if(a===`help`){printReplHelp(e.engine);continue}if(a===`clear`){clearReplScreen();continue}if(a===`unknown`){M.warn(`Unknown command: ${i}`);continue}try{let n=await t(i);n.engine===`sql`?printSqlResult(n,{json:e.json}):printGqlResult(n,{json:e.json})}catch(e){if(gn(e)){M.log(e.format());continue}if(e instanceof Error){M.error(e.message);continue}M.error(String(e))}}}function printReplHelp(e){M.log(`REPL commands:`),M.log(` \\help, \\h, \\? Show this help`),M.log(` \\q, \\quit Exit REPL`),M.log(` \\clear, \\c Clear the screen`),M.log(``),M.log(`Key bindings (see footer for terminal-specific submit/newline keys):`),M.log(` Ctrl+J Insert newline (always available)`),M.log(` Ctrl+C Cancel current input`),M.log(` Ctrl+D Exit REPL (on empty input)`),M.log(` Ctrl+Z / Ctrl+Y Undo / Redo`),M.log(` Up/Down (first/last line) Navigate history`),M.log(``),M.log(`Editing aids:`),M.log(` Syntax highlighting Enabled for the current engine`),M.log(` ( [ { Auto-inserts the matching closing bracket`),M.log(` Enter after open bracket Adds one indent level and closes the block`),M.log(``),M.log(e===`sql`?`Input must end with ';' to submit.`:`Input must be a complete GraphQL document to submit.`)}async function querySql(e){let t=await query({...e,engine:`sql`});if(t.engine!==`sql`)throw Error(`Expected sql engine result but got: ${t.engine}`);return t}async function queryGql(e){let t=await query({...e,engine:`gql`});if(t.engine!==`gql`)throw Error(`Expected gql engine result but got: ${t.engine}`);return t}async function reorderSqlColumns(e,t,n,r){if(!isSQLExecutionResult(e.result)||e.result.rows.length===0)return e;let i=extractColumnTemplate(r);if(!i)return e;try{let r=buildExpectedColumnOrder(i,await loadTypeFieldOrder(t,n));if(r.length===0)return e;let a=e.result.rows.map(e=>reorderRowByTemplate(e,r));return{...e,result:{...e.result,rows:a}}}catch{return e}}const lc=[`id`];function buildExpectedColumnOrder(e,t){let n=[];for(let r of e)if(r.type===`explicit`)n.push(r.name);else for(let e of r.tableNames)n.push(...lc),n.push(...t.get(e)??[]);return n}function reorderRowByTemplate(e,t){let n={},r=new Set(Object.keys(e)),i=new Map;for(let e of r)i.set(e.toLowerCase(),e);for(let a of t){let t=i.get(a.toLowerCase());t!=null&&r.has(t)&&(n[t]=e[t],r.delete(t),i.delete(a.toLowerCase()))}for(let t of r)n[t]=e[t];return n}const uc=X({name:`query`,description:`Run SQL/GraphQL query.`,args:H.strictObject({...Wr,engine:V(oc,{description:`Query engine (sql or gql)`}),query:V(H.string().optional(),{alias:`q`,description:`Query string to execute directly; omit to start REPL mode`}),file:V(H.string().optional(),{alias:`f`,description:`Read query string from file; omit to start REPL mode`}),edit:V(H.boolean().default(!1),{description:`Open a temporary file in your editor; omit to start REPL mode`}),"machine-user":V(H.string().optional(),{alias:`m`,description:`Machine user name for query execution. Falls back to the active profile's default machine user.`,env:`TAILOR_PLATFORM_MACHINE_USER_NAME`}),"newline-on-enter":V(H.boolean().optional(),{description:`REPL: when true, Enter inserts a newline and Shift+Enter submits. Use --no-newline-on-enter to swap.`})}).superRefine((e,t)=>{e.query!=null&&e.file!=null&&t.addIssue({code:`custom`,path:[`file`],message:`Pass either -q/--query or -f/--file, not both.`}),e.edit&&e.query!=null&&t.addIssue({code:`custom`,path:[`edit`],message:`Pass only one of --edit, -q/--query, or -f/--file.`}),e.edit&&e.file!=null&&t.addIssue({code:`custom`,path:[`edit`],message:`Pass only one of --edit, -q/--query, or -f/--file.`})}),run:async e=>{let t=await resolveQueryCommandInput({query:e.query,file:e.file,edit:e.edit,engine:e.engine}),n={workspaceId:e[`workspace-id`],profile:e.profile,configPath:e.config,engine:e.engine,machineUser:e[`machine-user`],machineUserSource:resolveMachineUserInputSource(e[`machine-user`])};if(t.mode===`abort`){M.info(`Editor closed without a query. Nothing was executed.`);return}if(t.mode===`repl`){let t=e[`newline-on-enter`]??ct(process.env.TAILOR_QUERY_NEWLINE_ON_ENTER)??!0;await runRepl({...n,json:e.json,newlineOnEnter:t});return}let r=t.query;if(e.engine===`sql`){printSqlResult(await querySql({...n,query:r}),{json:e.json});return}printGqlResult(await queryGql({...n,query:r}),{json:e.json})}});function isSQLExecutionResult(e){if(!e||typeof e!=`object`)return!1;let t=e;return Array.isArray(t.rows)&&typeof t.rowCount==`number`}function printSingleSqlResult(e,t={}){if(e.rows.length===0){if(t.json){M.out({results:[],rowCount:0});return}M.info(`No rows returned.`);return}if(t.json){M.out({results:e.rows,rowCount:e.rowCount});return}M.out(e.rows,{showNull:!0}),M.out(`rows: ${e.rowCount}`)}function splitSqlStatements(e){let t=Mr(e,{locationTracking:!0});return t.map((n,r)=>{let i=A(n._location,`SQL statement location missing`).start,a=t[r+1],o=a===void 0?e.length:A(a._location,`SQL statement location missing`).start;return e.substring(i,o)})}function isSQLExecutionResultArray(e){return Array.isArray(e)&&e.length>0&&e.every(isSQLExecutionResult)}function printSqlResult(e,t={}){if(isSQLExecutionResultArray(e.result)){if(t.json){M.out(e.result.map(e=>({results:e.rows,rowCount:e.rowCount})));return}let n=splitSqlStatements(e.query);for(let r=0;r<e.result.length;r++)r>0&&M.log(``),M.info(n[r]??`Statement ${r+1}`),printSingleSqlResult(A(e.result[r],`SQL result at index ${r} missing`),t);return}if(isSQLExecutionResult(e.result)){printSingleSqlResult(e.result,t);return}M.out({engine:e.engine,query:e.query,result:e.result})}function printGqlResult(e,t={}){if(t.json){M.out({result:e.result});return}M.out(JSON.stringify(e.result,null,2))}function errorToJson(e,t){if(gn(e))return{error:{code:e.code??`CLI_ERROR`,message:e.message,...e.details?{details:e.details}:{},...e.suggestion?{suggestion:e.suggestion}:{},...e.command?{help:executableHelpAction(e.command)}:{},...e.next?{next:e.next}:{},...e.context?{context:e.context}:{},...t?.includeStack&&e.stack?{stack:e.stack}:{}}};if(e instanceof q){let n=K[e.code];return{error:{code:`RPC_${typeof n==`string`?n.replaceAll(/([a-z0-9])([A-Z])/g,`$1_$2`).toUpperCase():`CODE_${e.code}`}`,message:e.message,...t?.includeStack&&e.stack?{stack:e.stack}:{}}}}if(e instanceof Error){let n=vn(e);return{error:{code:e.name===`CIPromptError`?`INTERACTIVE_PROMPT_REQUIRED`:`UNEXPECTED_ERROR`,message:e.message,...n?{suggestion:n}:{},...t?.includeStack&&e.stack?{stack:e.stack}:{}}}}return{error:{code:`UNKNOWN_ERROR`,message:String(e)}}}function serializeError(e,t){let n=errorToJson(e,t);try{return JSON.stringify(n)}catch{let e={...n.error};return delete e.context,delete e.stack,JSON.stringify({error:e})}}function executableHelpAction(e){return{command:`tailor`,args:[...e.split(/\s+/).filter(Boolean),`--help`]}}function isNativeTypeScriptRuntime(){return isBun()||isDeno()}function isBun(){return`Bun`in globalThis}function isDeno(){return`Deno`in globalThis}async function registerTsHook(e){if(isNativeTypeScriptRuntime())return;let{resolveSync:t,loadSync:n}=await import(e.href);kn.registerHooks({resolve:t,load:n})}export{Cs as $,loadDiff as $n,Ur as $r,deployFromCLI as $t,truncate as A,selectTargetNamespace as An,loadAccessToken as Ar,getFunctionRegistry as At,logBetaWarning as B,Za as Bn,removeLegacyUserAlias as Br,listExecutorJobs as Bt,Hs as C,bundleMigrationScript as Cn,apiCall as Cr,extractAllNamespaces as Ct,resumeWorkflow as D,fetchRemoteMigrationNumber as Dn,fetchLatestToken as Dr,ss as Dt,zs as E,protoGqlPermission as En,deleteUserTokens as Er,waitForExecution as Et,generate as F,createSnapshotFromLocalTypes as Fn,loadPlatformClientConfig as Fr,Qo as Ft,remove as G,to as Gn,X as Gr,getWorkflow as Gt,deployStaticWebsite as H,Qa as Hn,resolveUserTokenKey as Hr,Xo as Ht,Is as I,createSnapshotType as In,loadStoredUserTokens as Ir,listExecutors as It,updateOrganization as J,getLatestMigrationNumber as Jn,Hr as Jr,listWorkflowExecutions as Jt,Os as K,Xa as Kn,Vr as Kr,Jo as Kt,Fs as L,assertValidMigrationFiles as Ln,loadWorkspaceId as Lr,getExecutorJob as Lt,loadSeedContext as M,captureMigrationFileState as Mn,loadConfigPath as Mr,rs as Mt,chunkSeedData as N,createRemoteComparableSnapshot as Nn,loadConsoleBaseUrl as Nr,ts as Nt,Rs as O,fetchRemoteMigrationState as On,hasAnyUserTokenEntry as Or,listFunctionRegistries as Ot,bundleSeedScript as P,formatSchemaDrifts as Pn,loadMachineUserName as Pr,triggerExecutor as Pt,listOrganizations as Q,getNextMigrationNumber as Qn,loadEnvFiles as Qr,deploy as Qt,Ps as R,reconstructSnapshotFromMigrations as Rn,platformConfigFromProfile as Rr,getExecutorWaitFailureMessage as Rt,getAppHealth as S,formatMigrationScriptCommand as Sn,loadOperatorWorkspaceContext as Sr,loadTailorDBNamespaces as St,waitWorkflowExecution as T,generateAllTypeManifestsFromSnapshot as Tn,loadConfig as Tr,executeScript as Tt,show as U,$a as Un,saveUserTokens as Ur,startWorkflow as Ut,Ms as V,Ya as Vn,resolveConfigUser as Vr,watchExecutorJob as Vt,As as W,no as Wn,writePlatformConfig as Wr,Yo as Wt,Ts as X,getMigrationFilePath as Xn,createCommonArgs as Xr,Uo as Xt,organizationTree as Y,getMigrationDirPath as Yn,Gr as Yr,functionExecutionStatusToString as Yt,ws as Z,getMigrationFiles as Zn,Wr as Zr,getExecutor as Zt,getWorkspace as _,logRemoteDriftGuidance as _n,xi as _r,cs as _t,uc as a,createValidatedWorkspaceWithClient as an,sanitizeMigrationLabel as ar,_s as at,listApps as b,getMigrationMachineUser as bn,writeMetadataLabels as br,resolvePluginConfig as bt,rc as c,formatTimestamp as cn,UnsupportedMigrationFileVersionError as cr,deleteFolder as ct,listUsers as d,ensureConfigId as dn,parseMigrationNumberArg as dr,ds as dt,qr as ei,deployMigrationTestBaseline as en,loadSnapshot as er,getOrganization as et,$s as f,PluginManager as fn,formatDiffSummary as fr,listOAuth2Clients as ft,Js as g,formatRemoteVerificationResults as gn,resourceTrn as gr,ls as gt,restoreWorkspace as h,fetchRemoteSchemaSnapshot as hn,subscribesToEvents as hr,getMachineUserToken as ht,query as i,Y as ii,Ro as in,handleOptionalToRequiredError as ir,listFolders as it,Ls as j,captureFileState as jn,loadAuthStatus as jr,listWebhookExecutors as jt,listWorkflows as k,getNamespacesWithMigrations as kn,hasUserTokenEntry as kr,as as kt,removeUser as l,humanizeRelativeTime as ln,normalizeSchemaSnapshot as lr,ps as lt,Xs as m,checkMigrationDiffs as mn,hasChanges as mr,getOAuth2Client as mt,errorToJson as n,resolveMachineUserInputSource as ni,zo as nn,Yi as nr,updateFolder as nt,ac as o,createWorkspace$1 as on,compareLocalTypesWithSnapshot as or,getFolder as ot,inviteUser as p,generateUserTypes as pn,formatMigrationDiff as pr,us as pt,Ds as q,assertMigrationNumberExists as qn,Br as qr,getWorkflowExecution as qt,serializeError as r,toPageDirection as ri,listWorkspaces as rn,createMigrationHistoryId as rr,ys as rt,updateUser as s,formatKeyValueTable as sn,compareSnapshots as sr,hs as st,registerTsHook as t,paginationArgs as ti,deployMigrationTestTarget as tn,Xi as tr,xs as tt,tc as u,Fo as un,formatMigrationNumber as ur,createFolder as ut,Ks as v,toTailorDBDeployInput as vn,yi as vr,listMachineUsers as vt,Bs as w,compareSnapshotWithRemote as wn,assertWritable as wr,extractOwnedNamespaces as wt,Ws as x,updateMigrationLabel as xn,Z as xr,loadApplicationNamespaces as xt,deleteWorkspace as y,verifyRemoteSchema as yn,bi as yr,generate$1 as yt,generateSchemaFile as z,eo as zn,readPlatformConfig as zr,Zo as zt};
642
- //# sourceMappingURL=register-ts-hook-rBH346V_.mjs.map
642
+ //# sourceMappingURL=register-ts-hook-BJmGCQAA.mjs.map