@walkeros/cli 1.4.0-next-1771279991849 → 1.4.0-next-1771334965900

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,17 +1,18 @@
1
1
  # @walkeros/cli
2
2
 
3
- ## 1.4.0-next-1771279991849
3
+ ## 1.4.0-next-1771334965900
4
4
 
5
5
  ### Minor Changes
6
6
 
7
+ - a2f27d4: Add deploy command for web and server deployments
7
8
  - 7b2d750: Add walkerOS.json package convention for CDN-based schema discovery
8
9
 
9
10
  ### Patch Changes
10
11
 
11
12
  - 1ae6972: Fix missing trailing newline in JSON output
12
13
  - Updated dependencies [7b2d750]
13
- - @walkeros/core@1.4.0-next-1771279991849
14
- - @walkeros/server-core@1.0.6-next-1771279991849
14
+ - @walkeros/core@1.4.0-next-1771334965900
15
+ - @walkeros/server-core@1.0.6-next-1771334965900
15
16
 
16
17
  ## 1.3.0
17
18
 
package/dist/cli.js CHANGED
@@ -798,7 +798,7 @@ async function resolveDependencies(pkg, packageDir, logger2, visited = /* @__PUR
798
798
  }
799
799
  return dependencies;
800
800
  }
801
- async function downloadPackages(packages, targetDir, logger2, useCache = true, configDir) {
801
+ async function downloadPackages(packages, targetDir, logger2, useCache = true, configDir, tmpDir) {
802
802
  const packagePaths = /* @__PURE__ */ new Map();
803
803
  const downloadQueue = [...packages];
804
804
  const processed = /* @__PURE__ */ new Set();
@@ -841,8 +841,8 @@ async function downloadPackages(packages, targetDir, logger2, useCache = true, c
841
841
  }
842
842
  const packageSpec = `${pkg.name}@${pkg.version}`;
843
843
  const packageDir = getPackageDirectory(targetDir, pkg.name, pkg.version);
844
- const cachedPath = await getCachedPackagePath(pkg);
845
- if (useCache && await isPackageCached(pkg)) {
844
+ const cachedPath = await getCachedPackagePath(pkg, tmpDir);
845
+ if (useCache && await isPackageCached(pkg, tmpDir)) {
846
846
  if (userSpecifiedPackages.has(pkg.name)) {
847
847
  logger2.debug(`Downloading ${packageSpec} (cached)`);
848
848
  }
@@ -866,7 +866,7 @@ async function downloadPackages(packages, targetDir, logger2, useCache = true, c
866
866
  }
867
867
  try {
868
868
  await fs6.ensureDir(path7.dirname(packageDir));
869
- const cacheDir = process.env.NPM_CACHE_DIR || getTmpPath(void 0, "cache", "npm");
869
+ const cacheDir = process.env.NPM_CACHE_DIR || getTmpPath(tmpDir, "cache", "npm");
870
870
  await withTimeout(
871
871
  pacote.extract(packageSpec, packageDir, {
872
872
  // Force npm registry download, prevent workspace resolution
@@ -1050,9 +1050,9 @@ async function bundleCore(flowConfig, buildOptions, logger2, showStats = false)
1050
1050
  const TEMP_DIR = buildOptions.tempDir || getTmpPath();
1051
1051
  if (buildOptions.cache !== false) {
1052
1052
  const configContent = generateCacheKeyContent(flowConfig, buildOptions);
1053
- const cached = await isBuildCached(configContent);
1053
+ const cached = await isBuildCached(configContent, TEMP_DIR);
1054
1054
  if (cached) {
1055
- const cachedBuild = await getCachedBuild(configContent);
1055
+ const cachedBuild = await getCachedBuild(configContent, TEMP_DIR);
1056
1056
  if (cachedBuild) {
1057
1057
  logger2.debug("Using cached build");
1058
1058
  const outputPath = path9.resolve(buildOptions.output);
@@ -1105,8 +1105,9 @@ async function bundleCore(flowConfig, buildOptions, logger2, showStats = false)
1105
1105
  TEMP_DIR,
1106
1106
  logger2,
1107
1107
  buildOptions.cache,
1108
- buildOptions.configDir
1108
+ buildOptions.configDir,
1109
1109
  // For resolving relative local paths
1110
+ TEMP_DIR
1110
1111
  );
1111
1112
  for (const [pkgName, pkgPath] of packagePaths.entries()) {
1112
1113
  if (pkgName.startsWith("@walkeros/")) {
@@ -1166,7 +1167,7 @@ async function bundleCore(flowConfig, buildOptions, logger2, showStats = false)
1166
1167
  if (buildOptions.cache !== false) {
1167
1168
  const configContent = generateCacheKeyContent(flowConfig, buildOptions);
1168
1169
  const buildOutput = await fs8.readFile(outputPath, "utf-8");
1169
- await cacheBuild(configContent, buildOutput);
1170
+ await cacheBuild(configContent, buildOutput, TEMP_DIR);
1170
1171
  logger2.debug("Build cached for future use");
1171
1172
  }
1172
1173
  let stats;
@@ -2420,7 +2421,7 @@ async function simulateCommand(options) {
2420
2421
  const stdinContent = await readStdin();
2421
2422
  const fs15 = await import("fs-extra");
2422
2423
  const path15 = await import("path");
2423
- const tmpPath = path15.default.resolve(".tmp", "stdin-simulate.json");
2424
+ const tmpPath = getTmpPath(void 0, "stdin-simulate.json");
2424
2425
  await fs15.default.ensureDir(path15.default.dirname(tmpPath));
2425
2426
  await fs15.default.writeFile(tmpPath, stdinContent, "utf-8");
2426
2427
  config = tmpPath;
@@ -2559,7 +2560,7 @@ async function pushCommand(options) {
2559
2560
  let config;
2560
2561
  if (isStdinPiped() && !options.config) {
2561
2562
  const stdinContent = await readStdin();
2562
- const tmpPath = path12.resolve(".tmp", "stdin-push.json");
2563
+ const tmpPath = getTmpPath(void 0, "stdin-push.json");
2563
2564
  await fs12.ensureDir(path12.dirname(tmpPath));
2564
2565
  await fs12.writeFile(tmpPath, stdinContent, "utf-8");
2565
2566
  config = tmpPath;
@@ -2632,9 +2633,8 @@ async function executeConfigPush(options, validatedEvent, logger2, setTempDir) {
2632
2633
  const platform = getPlatform4(flowConfig);
2633
2634
  logger2.debug("Bundling flow configuration");
2634
2635
  const configDir = buildOptions.configDir || process.cwd();
2635
- const tempDir = path12.join(
2636
- configDir,
2637
- ".tmp",
2636
+ const tempDir = getTmpPath(
2637
+ void 0,
2638
2638
  `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
2639
2639
  );
2640
2640
  setTempDir(tempDir);
@@ -2672,9 +2672,8 @@ async function executeConfigPush(options, validatedEvent, logger2, setTempDir) {
2672
2672
  }
2673
2673
  }
2674
2674
  async function executeBundlePush(bundleContent, platform, validatedEvent, logger2, setTempDir, context = {}) {
2675
- const tempDir = path12.join(
2676
- process.cwd(),
2677
- ".tmp",
2675
+ const tempDir = getTmpPath(
2676
+ void 0,
2678
2677
  `push-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
2679
2678
  );
2680
2679
  setTempDir(tempDir);
@@ -2922,10 +2921,8 @@ function validatePort(port) {
2922
2921
  import path13 from "path";
2923
2922
  import fs13 from "fs-extra";
2924
2923
  async function prepareBundleForRun(configPath, options) {
2925
- const configDir = path13.dirname(path13.resolve(configPath));
2926
- const tempDir = path13.join(
2927
- configDir,
2928
- ".tmp",
2924
+ const tempDir = getTmpPath(
2925
+ void 0,
2929
2926
  `run-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`
2930
2927
  );
2931
2928
  await fs13.ensureDir(tempDir);
@@ -3991,6 +3988,115 @@ async function readFlowStdin() {
3991
3988
  return readStdin();
3992
3989
  }
3993
3990
 
3991
+ // src/commands/deploy/index.ts
3992
+ async function deploy(options) {
3993
+ const projectId = options.projectId ?? requireProjectId();
3994
+ const client = createApiClient();
3995
+ const { data, error } = await client.POST(
3996
+ "/api/projects/{projectId}/flows/{flowId}/deploy",
3997
+ { params: { path: { projectId, flowId: options.flowId } } }
3998
+ );
3999
+ if (error)
4000
+ throw new Error(error.error?.message || "Failed to start deployment");
4001
+ if (!options.wait) return data;
4002
+ const terminalStatuses = ["active", "published", "failed", "deleted"];
4003
+ let status = data.status;
4004
+ let result = { ...data };
4005
+ while (!terminalStatuses.includes(status)) {
4006
+ await new Promise((r) => setTimeout(r, 3e3));
4007
+ const { data: advanced, error: advanceError } = await client.POST(
4008
+ "/api/projects/{projectId}/flows/{flowId}/deploy/{deploymentId}/advance",
4009
+ {
4010
+ params: {
4011
+ path: {
4012
+ projectId,
4013
+ flowId: options.flowId,
4014
+ deploymentId: data.deploymentId
4015
+ }
4016
+ }
4017
+ }
4018
+ );
4019
+ if (advanceError)
4020
+ throw new Error(
4021
+ advanceError.error?.message || "Failed to advance deployment"
4022
+ );
4023
+ if (advanced) {
4024
+ status = advanced.status;
4025
+ result = { ...advanced };
4026
+ }
4027
+ }
4028
+ return result;
4029
+ }
4030
+ async function getDeployment(options) {
4031
+ const projectId = options.projectId ?? requireProjectId();
4032
+ const client = createApiClient();
4033
+ const { data, error } = await client.GET(
4034
+ "/api/projects/{projectId}/flows/{flowId}/deploy",
4035
+ { params: { path: { projectId, flowId: options.flowId } } }
4036
+ );
4037
+ if (error)
4038
+ throw new Error(error.error?.message || "Failed to get deployment");
4039
+ return data;
4040
+ }
4041
+ async function deployCommand(flowId, options) {
4042
+ const log = createCommandLogger(options);
4043
+ try {
4044
+ const result = await deploy({
4045
+ flowId,
4046
+ projectId: options.project,
4047
+ wait: options.wait !== false
4048
+ });
4049
+ if (options.json) {
4050
+ await writeResult(JSON.stringify(result, null, 2), options);
4051
+ return;
4052
+ }
4053
+ const r = result;
4054
+ if (r.status === "published") {
4055
+ log.success(`Published: ${r.publicUrl}`);
4056
+ if (r.scriptTag) log.info(`Script tag: ${r.scriptTag}`);
4057
+ } else if (r.status === "active") {
4058
+ log.success(`Active: ${r.containerUrl}`);
4059
+ } else if (r.status === "failed") {
4060
+ log.error(`Failed: ${r.errorMessage || "Unknown error"}`);
4061
+ process.exit(1);
4062
+ } else if (r.status === "bundling") {
4063
+ log.info(`Deployment started: ${r.deploymentId} (${r.type})`);
4064
+ } else {
4065
+ log.info(`Status: ${r.status}`);
4066
+ }
4067
+ } catch (err) {
4068
+ log.error(err instanceof Error ? err.message : "Deploy failed");
4069
+ process.exit(1);
4070
+ }
4071
+ }
4072
+ async function getDeploymentCommand(flowId, options) {
4073
+ const log = createCommandLogger(options);
4074
+ try {
4075
+ const result = await getDeployment({
4076
+ flowId,
4077
+ projectId: options.project
4078
+ });
4079
+ if (options.json) {
4080
+ await writeResult(JSON.stringify(result, null, 2), options);
4081
+ return;
4082
+ }
4083
+ if (!result) {
4084
+ log.info("No deployment found");
4085
+ return;
4086
+ }
4087
+ log.info(`Deployment: ${result.id}`);
4088
+ log.info(`Type: ${result.type}`);
4089
+ log.info(`Status: ${result.status}`);
4090
+ if (result.containerUrl) log.info(`Endpoint: ${result.containerUrl}`);
4091
+ if (result.publicUrl) log.info(`URL: ${result.publicUrl}`);
4092
+ if (result.scriptTag) log.info(`Script tag: ${result.scriptTag}`);
4093
+ if (result.errorMessage) log.error(`Error: ${result.errorMessage}`);
4094
+ } catch (err) {
4095
+ log.error(err instanceof Error ? err.message : "Failed to get deployment");
4096
+ process.exit(1);
4097
+ }
4098
+ }
4099
+
3994
4100
  // src/cli.ts
3995
4101
  var program = new Command();
3996
4102
  program.name("walkeros").description("walkerOS CLI - Bundle and deploy walkerOS components").version(VERSION);
@@ -4118,6 +4224,13 @@ flowsCmd.command("delete <flowId>").description("Delete a flow").option("--proje
4118
4224
  flowsCmd.command("duplicate <flowId>").description("Duplicate a flow").option("--project <id>", "project ID (defaults to WALKEROS_PROJECT_ID)").option("--name <name>", "name for the copy").option("-o, --output <path>", "output file path").option("--json", "output as JSON").option("-v, --verbose", "verbose output").option("-s, --silent", "suppress output").action(async (flowId, options) => {
4119
4225
  await duplicateFlowCommand(flowId, options);
4120
4226
  });
4227
+ var deployCmd = program.command("deploy").description("Deploy flows to walkerOS cloud");
4228
+ deployCmd.command("start <flowId>").description("Deploy a flow (auto-detects web or server)").option("--project <id>", "project ID (defaults to WALKEROS_PROJECT_ID)").option("--no-wait", "do not wait for deployment to complete").option("-o, --output <path>", "output file path").option("--json", "output as JSON").option("-v, --verbose", "verbose output").option("-s, --silent", "suppress output").action(async (flowId, options) => {
4229
+ await deployCommand(flowId, options);
4230
+ });
4231
+ deployCmd.command("status <flowId>").description("Get the latest deployment status for a flow").option("--project <id>", "project ID (defaults to WALKEROS_PROJECT_ID)").option("-o, --output <path>", "output file path").option("--json", "output as JSON").option("-v, --verbose", "verbose output").option("-s, --silent", "suppress output").action(async (flowId, options) => {
4232
+ await getDeploymentCommand(flowId, options);
4233
+ });
4121
4234
  var runCmd = program.command("run").description("Run walkerOS flows in collect or serve mode");
4122
4235
  runCmd.command("collect [file]").description(
4123
4236
  "Run collector mode (event collection endpoint). Defaults to server-collect.mjs if no file specified."
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { Flow, Elb } from '@walkeros/core';
2
2
  export { Flow } from '@walkeros/core';
3
3
  import { BuildOptions as BuildOptions$1 } from 'esbuild';
4
4
  import { z } from '@walkeros/core/dev';
5
+ import * as openapi_typescript_helpers from 'openapi-typescript-helpers';
5
6
  import * as openapi_fetch from 'openapi-fetch';
6
7
 
7
8
  /**
@@ -2322,6 +2323,171 @@ interface paths {
2322
2323
  patch?: never;
2323
2324
  trace?: never;
2324
2325
  };
2326
+ '/api/projects/{projectId}/flows/{flowId}/deploy': {
2327
+ parameters: {
2328
+ query?: never;
2329
+ header?: never;
2330
+ path?: never;
2331
+ cookie?: never;
2332
+ };
2333
+ /**
2334
+ * Get latest deployment
2335
+ * @description Get the latest deployment for a flow.
2336
+ */
2337
+ get: {
2338
+ parameters: {
2339
+ query?: never;
2340
+ header?: never;
2341
+ path: {
2342
+ projectId: string;
2343
+ flowId: string;
2344
+ };
2345
+ cookie?: never;
2346
+ };
2347
+ requestBody?: never;
2348
+ responses: {
2349
+ /** @description Latest deployment (or null) */
2350
+ 200: {
2351
+ headers: {
2352
+ [name: string]: unknown;
2353
+ };
2354
+ content: {
2355
+ 'application/json': components['schemas']['Deployment'] | null;
2356
+ };
2357
+ };
2358
+ /** @description Unauthorized */
2359
+ 401: {
2360
+ headers: {
2361
+ [name: string]: unknown;
2362
+ };
2363
+ content: {
2364
+ 'application/json': components['schemas']['ErrorResponse'];
2365
+ };
2366
+ };
2367
+ };
2368
+ };
2369
+ put?: never;
2370
+ /**
2371
+ * Deploy flow
2372
+ * @description Start a deployment for a flow. Auto-detects web or server from flow content.
2373
+ */
2374
+ post: {
2375
+ parameters: {
2376
+ query?: never;
2377
+ header?: never;
2378
+ path: {
2379
+ projectId: string;
2380
+ flowId: string;
2381
+ };
2382
+ cookie?: never;
2383
+ };
2384
+ requestBody?: never;
2385
+ responses: {
2386
+ /** @description Deployment started */
2387
+ 201: {
2388
+ headers: {
2389
+ [name: string]: unknown;
2390
+ };
2391
+ content: {
2392
+ 'application/json': components['schemas']['DeployResponse'];
2393
+ };
2394
+ };
2395
+ /** @description Invalid flow */
2396
+ 400: {
2397
+ headers: {
2398
+ [name: string]: unknown;
2399
+ };
2400
+ content: {
2401
+ 'application/json': components['schemas']['ErrorResponse'];
2402
+ };
2403
+ };
2404
+ /** @description Unauthorized */
2405
+ 401: {
2406
+ headers: {
2407
+ [name: string]: unknown;
2408
+ };
2409
+ content: {
2410
+ 'application/json': components['schemas']['ErrorResponse'];
2411
+ };
2412
+ };
2413
+ /** @description Not found */
2414
+ 404: {
2415
+ headers: {
2416
+ [name: string]: unknown;
2417
+ };
2418
+ content: {
2419
+ 'application/json': components['schemas']['ErrorResponse'];
2420
+ };
2421
+ };
2422
+ };
2423
+ };
2424
+ delete?: never;
2425
+ options?: never;
2426
+ head?: never;
2427
+ patch?: never;
2428
+ trace?: never;
2429
+ };
2430
+ '/api/projects/{projectId}/flows/{flowId}/deploy/{deploymentId}/advance': {
2431
+ parameters: {
2432
+ query?: never;
2433
+ header?: never;
2434
+ path?: never;
2435
+ cookie?: never;
2436
+ };
2437
+ get?: never;
2438
+ put?: never;
2439
+ /**
2440
+ * Advance deployment
2441
+ * @description Advance the deployment state machine. Poll until terminal status.
2442
+ */
2443
+ post: {
2444
+ parameters: {
2445
+ query?: never;
2446
+ header?: never;
2447
+ path: {
2448
+ projectId: string;
2449
+ flowId: string;
2450
+ deploymentId: string;
2451
+ };
2452
+ cookie?: never;
2453
+ };
2454
+ requestBody?: never;
2455
+ responses: {
2456
+ /** @description Current deployment state */
2457
+ 200: {
2458
+ headers: {
2459
+ [name: string]: unknown;
2460
+ };
2461
+ content: {
2462
+ 'application/json': components['schemas']['Deployment'];
2463
+ };
2464
+ };
2465
+ /** @description Unauthorized */
2466
+ 401: {
2467
+ headers: {
2468
+ [name: string]: unknown;
2469
+ };
2470
+ content: {
2471
+ 'application/json': components['schemas']['ErrorResponse'];
2472
+ };
2473
+ };
2474
+ /** @description Not found */
2475
+ 404: {
2476
+ headers: {
2477
+ [name: string]: unknown;
2478
+ };
2479
+ content: {
2480
+ 'application/json': components['schemas']['ErrorResponse'];
2481
+ };
2482
+ };
2483
+ };
2484
+ };
2485
+ delete?: never;
2486
+ options?: never;
2487
+ head?: never;
2488
+ patch?: never;
2489
+ trace?: never;
2490
+ };
2325
2491
  '/api/projects/{projectId}/observe/ticket': {
2326
2492
  parameters: {
2327
2493
  query?: never;
@@ -2964,6 +3130,38 @@ interface components {
2964
3130
  ValidateTicketRequest: {
2965
3131
  ticket: string;
2966
3132
  };
3133
+ Deployment: {
3134
+ /** @example dep_a1b2c3d4 */
3135
+ id: string;
3136
+ /** @example flow_a1b2c3d4 */
3137
+ flowId: string;
3138
+ /** @enum {string} */
3139
+ type: 'web' | 'server';
3140
+ /** @enum {string} */
3141
+ status:
3142
+ | 'bundling'
3143
+ | 'deploying'
3144
+ | 'active'
3145
+ | 'failed'
3146
+ | 'deleted'
3147
+ | 'published';
3148
+ containerUrl?: string | null;
3149
+ publicUrl?: string | null;
3150
+ scriptTag?: string | null;
3151
+ errorMessage?: string | null;
3152
+ /** Format: date-time */
3153
+ createdAt: string;
3154
+ /** Format: date-time */
3155
+ updatedAt: string;
3156
+ };
3157
+ DeployResponse: {
3158
+ /** @example dep_a1b2c3d4 */
3159
+ deploymentId: string;
3160
+ /** @enum {string} */
3161
+ type: 'web' | 'server';
3162
+ /** @example bundling */
3163
+ status: string;
3164
+ };
2967
3165
  HealthResponse: {
2968
3166
  /** @example ok */
2969
3167
  status: string;
@@ -2976,6 +3174,46 @@ interface components {
2976
3174
  pathItems: never;
2977
3175
  }
2978
3176
 
3177
+ interface DeployOptions {
3178
+ flowId: string;
3179
+ projectId?: string;
3180
+ wait?: boolean;
3181
+ }
3182
+ declare function deploy(options: DeployOptions): Promise<Record<string, unknown> | {
3183
+ deploymentId: string;
3184
+ type: "web" | "server";
3185
+ status: string;
3186
+ }>;
3187
+ declare function getDeployment(options: {
3188
+ flowId: string;
3189
+ projectId?: string;
3190
+ }): Promise<openapi_typescript_helpers.Readable<openapi_typescript_helpers.SuccessResponse<{
3191
+ 200: {
3192
+ headers: {
3193
+ [name: string]: unknown;
3194
+ };
3195
+ content: {
3196
+ "application/json": components["schemas"]["Deployment"] | null;
3197
+ };
3198
+ };
3199
+ 401: {
3200
+ headers: {
3201
+ [name: string]: unknown;
3202
+ };
3203
+ content: {
3204
+ "application/json": components["schemas"]["ErrorResponse"];
3205
+ };
3206
+ };
3207
+ }, `${string}/${string}`>>>;
3208
+ interface DeployCommandOptions extends GlobalOptions {
3209
+ project?: string;
3210
+ wait?: boolean;
3211
+ output?: string;
3212
+ json?: boolean;
3213
+ }
3214
+ declare function deployCommand(flowId: string, options: DeployCommandOptions): Promise<void>;
3215
+ declare function getDeploymentCommand(flowId: string, options: DeployCommandOptions): Promise<void>;
3216
+
2979
3217
  declare function createApiClient(): openapi_fetch.Client<paths, `${string}/${string}`>;
2980
3218
 
2981
- export { type BuildOptions, type BundleStats, type CLIBuildOptions, type GlobalOptions, type ListFlowsOptions, type MinifyOptions, type PushResult, type RunCommandOptions, type RunMode, type RunOptions, type RunResult, type SimulationResult, type ValidateResult, type ValidationError, type ValidationType, type ValidationWarning, bundle, bundleCommand, bundleRemote, createApiClient, createFlow, createFlowCommand, createProject, createProjectCommand, deleteFlow, deleteFlowCommand, deleteProject, deleteProjectCommand, duplicateFlow, duplicateFlowCommand, getAuthHeaders, getFlow, getFlowCommand, getProject, getProjectCommand, getToken, listFlows, listFlowsCommand, listProjects, listProjectsCommand, loginCommand, logoutCommand, push, pushCommand, requireProjectId, resolveBaseUrl, run, runCommand, simulate, simulateCommand, updateFlow, updateFlowCommand, updateProject, updateProjectCommand, validate, validateCommand, whoami, whoamiCommand };
3219
+ export { type BuildOptions, type BundleStats, type CLIBuildOptions, type DeployOptions, type GlobalOptions, type ListFlowsOptions, type MinifyOptions, type PushResult, type RunCommandOptions, type RunMode, type RunOptions, type RunResult, type SimulationResult, type ValidateResult, type ValidationError, type ValidationType, type ValidationWarning, bundle, bundleCommand, bundleRemote, createApiClient, createFlow, createFlowCommand, createProject, createProjectCommand, deleteFlow, deleteFlowCommand, deleteProject, deleteProjectCommand, deploy, deployCommand, duplicateFlow, duplicateFlowCommand, getAuthHeaders, getDeployment, getDeploymentCommand, getFlow, getFlowCommand, getProject, getProjectCommand, getToken, listFlows, listFlowsCommand, listProjects, listProjectsCommand, loginCommand, logoutCommand, push, pushCommand, requireProjectId, resolveBaseUrl, run, runCommand, simulate, simulateCommand, updateFlow, updateFlowCommand, updateProject, updateProjectCommand, validate, validateCommand, whoami, whoamiCommand };