@tailor-platform/sdk 2.12.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  # politty-completion-version: 1
2
- # politty-bin-sig: 1788439716
2
+ # politty-bin-sig: 1788490694
3
3
  # politty-bin-path: /home/runner/work/sdk/sdk/node_modules/.bin/tailor
4
4
  # program: tailor
5
5
  # shell: zsh
@@ -768,8 +768,15 @@ __tailor_worker_opt_takes_value() {
768
768
  tailordb:migration:validate:--namespace|tailordb:migration:validate:-n|tailordb:migration:validate:--n) return 0 ;;
769
769
  upgrade:--from) return 0 ;;
770
770
  upgrade:--path) return 0 ;;
771
+ user:current:--profile|user:current:-p|user:current:--p) return 0 ;;
772
+ user:list:--profile|user:list:-p|user:list:--p) return 0 ;;
773
+ user:switch:--profile|user:switch:-p|user:switch:--p) return 0 ;;
771
774
  user:pat:list:--order) return 0 ;;
772
775
  user:pat:list:--limit|user:pat:list:-l|user:pat:list:--l) return 0 ;;
776
+ user:pat:list:--profile|user:pat:list:-p|user:pat:list:--p) return 0 ;;
777
+ user:pat:create:--profile|user:pat:create:-p|user:pat:create:--p) return 0 ;;
778
+ user:pat:delete:--profile|user:pat:delete:-p|user:pat:delete:--p) return 0 ;;
779
+ user:pat:update:--profile|user:pat:update:-p|user:pat:update:--p) return 0 ;;
773
780
  workflow:list:--workspace-id|workflow:list:--workspaceId|workflow:list:-w|workflow:list:--w) return 0 ;;
774
781
  workflow:list:--profile|workflow:list:-p|workflow:list:--p) return 0 ;;
775
782
  workflow:list:--order) return 0 ;;
@@ -3400,6 +3407,7 @@ __tailor_worker_complete_user_current() {
3400
3407
  if (( _after_dd )); then return 0; fi
3401
3408
  if [[ "${words[CURRENT]}" == -* ]]; then
3402
3409
  local -a _opts=()
3410
+ __tailor_worker_not_used "--profile" "-p" "--p" && _opts+=("--profile:Workspace profile")
3403
3411
  __tailor_worker_not_used "--help" && _opts+=("--help:Show help")
3404
3412
  __tailor_worker_cdescribe 'options' _opts
3405
3413
  return 0
@@ -3412,6 +3420,7 @@ __tailor_worker_complete_user_list() {
3412
3420
  if (( _after_dd )); then return 0; fi
3413
3421
  if [[ "${words[CURRENT]}" == -* ]]; then
3414
3422
  local -a _opts=()
3423
+ __tailor_worker_not_used "--profile" "-p" "--p" && _opts+=("--profile:Workspace profile")
3415
3424
  __tailor_worker_not_used "--help" && _opts+=("--help:Show help")
3416
3425
  __tailor_worker_cdescribe 'options' _opts
3417
3426
  return 0
@@ -3430,6 +3439,7 @@ __tailor_worker_complete_user_switch() {
3430
3439
  fi
3431
3440
  if [[ "${words[CURRENT]}" == -* ]]; then
3432
3441
  local -a _opts=()
3442
+ __tailor_worker_not_used "--profile" "-p" "--p" && _opts+=("--profile:Workspace profile")
3433
3443
  __tailor_worker_not_used "--help" && _opts+=("--help:Show help")
3434
3444
  __tailor_worker_cdescribe 'options' _opts
3435
3445
  return 0
@@ -3454,6 +3464,7 @@ __tailor_worker_complete_user_pat_list() {
3454
3464
  local -a _opts=()
3455
3465
  __tailor_worker_not_used "--order" && _opts+=("--order:Sort order (asc or desc)")
3456
3466
  __tailor_worker_not_used "--limit" "-l" "--l" && _opts+=("--limit:Maximum number of items to return (0 or omit\: unlimited)")
3467
+ __tailor_worker_not_used "--profile" "-p" "--p" && _opts+=("--profile:Workspace profile")
3457
3468
  __tailor_worker_not_used "--help" && _opts+=("--help:Show help")
3458
3469
  __tailor_worker_cdescribe 'options' _opts
3459
3470
  return 0
@@ -3473,6 +3484,7 @@ __tailor_worker_complete_user_pat_create() {
3473
3484
  if [[ "${words[CURRENT]}" == -* ]]; then
3474
3485
  local -a _opts=()
3475
3486
  __tailor_worker_not_used "--write" "-W" "--W" && _opts+=("--write:Grant write permission (default\: read-only)")
3487
+ __tailor_worker_not_used "--profile" "-p" "--p" && _opts+=("--profile:Workspace profile")
3476
3488
  __tailor_worker_not_used "--help" && _opts+=("--help:Show help")
3477
3489
  __tailor_worker_cdescribe 'options' _opts
3478
3490
  return 0
@@ -3495,6 +3507,7 @@ __tailor_worker_complete_user_pat_delete() {
3495
3507
  fi
3496
3508
  if [[ "${words[CURRENT]}" == -* ]]; then
3497
3509
  local -a _opts=()
3510
+ __tailor_worker_not_used "--profile" "-p" "--p" && _opts+=("--profile:Workspace profile")
3498
3511
  __tailor_worker_not_used "--help" && _opts+=("--help:Show help")
3499
3512
  __tailor_worker_cdescribe 'options' _opts
3500
3513
  return 0
@@ -3518,6 +3531,7 @@ __tailor_worker_complete_user_pat_update() {
3518
3531
  if [[ "${words[CURRENT]}" == -* ]]; then
3519
3532
  local -a _opts=()
3520
3533
  __tailor_worker_not_used "--write" "-W" "--W" && _opts+=("--write:Grant write permission (if not specified, keeps read-only)")
3534
+ __tailor_worker_not_used "--profile" "-p" "--p" && _opts+=("--profile:Workspace profile")
3521
3535
  __tailor_worker_not_used "--help" && _opts+=("--help:Show help")
3522
3536
  __tailor_worker_cdescribe 'options' _opts
3523
3537
  return 0
@@ -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(`
@@ -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-CoZS-8Mx.mjs.map