@elevasis/sdk 0.9.7 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -40455,7 +40455,7 @@ var RegistryValidationError = class extends Error {
40455
40455
  this.name = "RegistryValidationError";
40456
40456
  }
40457
40457
  };
40458
- function validateOrganizationResources(orgName, resources) {
40458
+ function validateDeploymentSpec(orgName, resources) {
40459
40459
  const seenIds = /* @__PURE__ */ new Set();
40460
40460
  resources.workflows?.forEach((workflow) => {
40461
40461
  const id = workflow.config.resourceId;
@@ -40587,7 +40587,8 @@ function isZodOptional(schema) {
40587
40587
  return schema.isOptional();
40588
40588
  }
40589
40589
  function validateRelationships(orgName, resources) {
40590
- if (!resources.relationships && !resources.triggers && !resources.externalResources && !resources.humanCheckpoints) return;
40590
+ if (!resources.relationships && !resources.triggers && !resources.externalResources && !resources.humanCheckpoints)
40591
+ return;
40591
40592
  const validAgentIds = new Set(resources.agents?.map((a) => a.config.resourceId) ?? []);
40592
40593
  const validWorkflowIds = new Set(resources.workflows?.map((w) => w.config.resourceId) ?? []);
40593
40594
  const validIntegrationIds = new Set(resources.integrations?.map((i) => i.resourceId) ?? []);
@@ -43100,6 +43101,7 @@ function serializeOrganization(resources) {
43100
43101
  const humanCheckpoints = resources.humanCheckpoints ?? [];
43101
43102
  const domainDefinitions = deriveDomainDefinitions(resources);
43102
43103
  return {
43104
+ version: resources.version,
43103
43105
  resources: {
43104
43106
  workflows: workflowResources,
43105
43107
  agents: agentResources,
@@ -43258,7 +43260,7 @@ var ResourceRegistry = class {
43258
43260
  */
43259
43261
  validateRegistry() {
43260
43262
  for (const [orgName, resources] of Object.entries(this.registry)) {
43261
- validateOrganizationResources(orgName, resources);
43263
+ validateDeploymentSpec(orgName, resources);
43262
43264
  }
43263
43265
  }
43264
43266
  /**
@@ -43891,7 +43893,7 @@ function wrapAction(commandName, fn) {
43891
43893
  // package.json
43892
43894
  var package_default = {
43893
43895
  name: "@elevasis/sdk",
43894
- version: "0.9.7",
43896
+ version: "1.0.1",
43895
43897
  description: "SDK for building Elevasis organization resources",
43896
43898
  type: "module",
43897
43899
  bin: {
@@ -44008,6 +44010,17 @@ function extractResourceMetadata(resource, schemaWarnings) {
44008
44010
  }
44009
44011
  return meta;
44010
44012
  }
44013
+ function bumpVersion(current, type) {
44014
+ const [major, minor, patch] = current.split(".").map(Number);
44015
+ switch (type) {
44016
+ case "major":
44017
+ return `${major + 1}.0.0`;
44018
+ case "minor":
44019
+ return `${major}.${minor + 1}.0`;
44020
+ case "patch":
44021
+ return `${major}.${minor}.${patch + 1}`;
44022
+ }
44023
+ }
44011
44024
  var IGNORED_DOC_DIRS = /* @__PURE__ */ new Set([".archive"]);
44012
44025
  async function scanDocumentation() {
44013
44026
  const docsDir = (0, import_path.resolve)("docs");
@@ -44486,218 +44499,234 @@ async function generateNavigationMap(docs) {
44486
44499
  function registerDeployCommand(program3) {
44487
44500
  program3.command("deploy").description(
44488
44501
  "Validate, bundle, upload, and deploy project resources\n Example: elevasis-sdk deploy --api-url http://localhost:5170"
44489
- ).option("--api-url <url>", "API URL").option("--entry <path>", "Path to entry file (default: ./src/index.ts)").option("--prod", "Deploy to production (overrides NODE_ENV=development)").action(
44490
- wrapAction("deploy", async (options2) => {
44491
- const startTime = Date.now();
44492
- const apiUrl = resolveApiUrl(options2.apiUrl, options2.prod);
44493
- const env2 = resolveEnvironment(options2.prod);
44494
- const entryPath = options2.entry ?? "./src/index.ts";
44495
- const authSpinner = ora("Authenticating...").start();
44496
- let orgName;
44497
- try {
44498
- const me = await apiGet("/api/external/me", apiUrl);
44499
- orgName = me.organizationName;
44500
- authSpinner.succeed(
44501
- source_default.green("Authenticating...") + source_default.white(" done") + source_default.gray(` (${orgName})`)
44502
- );
44503
- } catch (error46) {
44504
- authSpinner.fail(source_default.red("Authentication failed"));
44505
- const errMsg = error46 instanceof Error ? error46.message : String(error46);
44506
- if (errMsg.includes("401") || errMsg.toLowerCase().includes("unauthorized")) {
44507
- const keyVar = !options2.prod && process.env.NODE_ENV === "development" && process.env.ELEVASIS_PLATFORM_KEY_DEV ? "ELEVASIS_PLATFORM_KEY_DEV" : "ELEVASIS_PLATFORM_KEY";
44508
- console.error(source_default.red(" Invalid API key."));
44509
- console.error(source_default.gray(` Your ${keyVar} was rejected by the server.`));
44510
- console.error(source_default.gray(" Check your .env file and verify the key in the Elevasis dashboard."));
44511
- } else {
44512
- console.error(source_default.gray(" Check your API key and API URL."));
44502
+ ).option("--api-url <url>", "API URL").option("--entry <path>", "Path to entry file (default: ./src/index.ts)").option("--prod", "Deploy to production (overrides NODE_ENV=development)").option("--major", "Bump major version before deploying (1.0.0 \u2192 2.0.0)").option("--minor", "Bump minor version before deploying (1.0.0 \u2192 1.1.0)").option("--patch", "Bump patch version before deploying (1.0.0 \u2192 1.0.1)").action(
44503
+ wrapAction(
44504
+ "deploy",
44505
+ async (options2) => {
44506
+ const startTime = Date.now();
44507
+ const apiUrl = resolveApiUrl(options2.apiUrl, options2.prod);
44508
+ const env2 = resolveEnvironment(options2.prod);
44509
+ const entryPath = options2.entry ?? "./src/index.ts";
44510
+ const authSpinner = ora("Authenticating...").start();
44511
+ let orgName;
44512
+ try {
44513
+ const me = await apiGet("/api/external/me", apiUrl);
44514
+ orgName = me.organizationName;
44515
+ authSpinner.succeed(
44516
+ source_default.green("Authenticating...") + source_default.white(" done") + source_default.gray(` (${orgName})`)
44517
+ );
44518
+ } catch (error46) {
44519
+ authSpinner.fail(source_default.red("Authentication failed"));
44520
+ const errMsg = error46 instanceof Error ? error46.message : String(error46);
44521
+ if (errMsg.includes("401") || errMsg.toLowerCase().includes("unauthorized")) {
44522
+ const keyVar = !options2.prod && process.env.NODE_ENV === "development" && process.env.ELEVASIS_PLATFORM_KEY_DEV ? "ELEVASIS_PLATFORM_KEY_DEV" : "ELEVASIS_PLATFORM_KEY";
44523
+ console.error(source_default.red(" Invalid API key."));
44524
+ console.error(source_default.gray(` Your ${keyVar} was rejected by the server.`));
44525
+ console.error(source_default.gray(" Check your .env file and verify the key in the Elevasis dashboard."));
44526
+ } else {
44527
+ console.error(source_default.gray(" Check your API key and API URL."));
44528
+ }
44529
+ throw error46;
44513
44530
  }
44514
- throw error46;
44515
- }
44516
- const validateSpinner = ora("Validating...").start();
44517
- let org;
44518
- let activeWorkflows = [];
44519
- let activeAgents = [];
44520
- try {
44521
- const entryModule = await loadTsModule(entryPath);
44522
- org = entryModule.default;
44523
- if (!org) {
44524
- validateSpinner.fail("Invalid entry: no default export found");
44525
- console.error(source_default.gray(` Entry file: ${(0, import_path.resolve)(entryPath)}`));
44526
- throw new Error("Invalid entry: no default export found");
44527
- }
44528
- new ResourceRegistry({ [orgName]: org });
44529
- activeWorkflows = (org.workflows ?? []).filter((w) => !w.config.archived);
44530
- activeAgents = (org.agents ?? []).filter((a) => !a.config.archived);
44531
- const archivedCount = (org.workflows?.length ?? 0) + (org.agents?.length ?? 0) - activeWorkflows.length - activeAgents.length;
44532
- const totalCount = activeWorkflows.length + activeAgents.length;
44533
- validateSpinner.succeed(
44534
- source_default.green("Validating...") + source_default.white(" done") + source_default.gray(` (${totalCount} resource${totalCount !== 1 ? "s" : ""}, 0 errors)`)
44535
- );
44536
- if (archivedCount > 0) {
44537
- console.log(source_default.gray(` Skipping ${archivedCount} archived resource${archivedCount !== 1 ? "s" : ""}`));
44531
+ const validateSpinner = ora("Validating...").start();
44532
+ let org;
44533
+ let activeWorkflows = [];
44534
+ let activeAgents = [];
44535
+ try {
44536
+ const entryModule = await loadTsModule(entryPath);
44537
+ org = entryModule.default;
44538
+ if (!org) {
44539
+ validateSpinner.fail("Invalid entry: no default export found");
44540
+ console.error(source_default.gray(` Entry file: ${(0, import_path.resolve)(entryPath)}`));
44541
+ throw new Error("Invalid entry: no default export found");
44542
+ }
44543
+ new ResourceRegistry({ [orgName]: org });
44544
+ activeWorkflows = (org.workflows ?? []).filter((w) => !w.config.archived);
44545
+ activeAgents = (org.agents ?? []).filter((a) => !a.config.archived);
44546
+ const archivedCount = (org.workflows?.length ?? 0) + (org.agents?.length ?? 0) - activeWorkflows.length - activeAgents.length;
44547
+ const totalCount = activeWorkflows.length + activeAgents.length;
44548
+ validateSpinner.succeed(
44549
+ source_default.green("Validating...") + source_default.white(" done") + source_default.gray(` (${totalCount} resource${totalCount !== 1 ? "s" : ""}, 0 errors)`)
44550
+ );
44551
+ if (archivedCount > 0) {
44552
+ console.log(source_default.gray(` Skipping ${archivedCount} archived resource${archivedCount !== 1 ? "s" : ""}`));
44553
+ }
44554
+ const bumpType = options2.major ? "major" : options2.minor ? "minor" : "patch";
44555
+ const currentVersion = org.version;
44556
+ const newVersion = bumpVersion(currentVersion, bumpType);
44557
+ const absEntryPath = (0, import_path.resolve)(entryPath);
44558
+ const entryContent = await (0, import_promises.readFile)(absEntryPath, "utf-8");
44559
+ const updatedContent = entryContent.replace(
44560
+ /version:\s*['"][\d]+\.[\d]+\.[\d]+['"]/,
44561
+ `version: '${newVersion}'`
44562
+ );
44563
+ await (0, import_promises.writeFile)(absEntryPath, updatedContent, "utf-8");
44564
+ org.version = newVersion;
44565
+ console.log("");
44566
+ console.log(source_default.gray(` Org: ${orgName}`));
44567
+ console.log(source_default.gray(` Target: ${apiUrl} (${env2})`));
44568
+ console.log(source_default.gray(` Version: ${currentVersion} \u2192 ${source_default.white(newVersion)} (${bumpType})`));
44569
+ console.log("");
44570
+ for (const w of activeWorkflows) {
44571
+ console.log(source_default.gray(` workflow ${source_default.white(w.config.resourceId)} v${w.config.version}`));
44572
+ }
44573
+ for (const a of activeAgents) {
44574
+ console.log(source_default.gray(` agent ${source_default.white(a.config.resourceId)} v${a.config.version}`));
44575
+ }
44576
+ console.log("");
44577
+ } catch (error46) {
44578
+ if (error46 instanceof RegistryValidationError) {
44579
+ validateSpinner.fail(source_default.red("Validation failed"));
44580
+ console.error("");
44581
+ console.error(source_default.red(` ERROR ${error46.message}`));
44582
+ if (error46.resourceId) {
44583
+ console.error(source_default.gray(` Resource: ${error46.resourceId}`));
44584
+ }
44585
+ console.error("");
44586
+ console.error(source_default.gray(" Deploy aborted."));
44587
+ }
44588
+ throw error46;
44538
44589
  }
44539
- console.log("");
44540
- console.log(source_default.gray(` Org: ${orgName}`));
44541
- console.log(source_default.gray(` Target: ${apiUrl} (${env2})`));
44542
- console.log("");
44543
- for (const w of activeWorkflows) {
44544
- console.log(source_default.gray(` workflow ${source_default.white(w.config.resourceId)} v${w.config.version}`));
44590
+ await generateResourceMap(org);
44591
+ await generateProjectMap(org);
44592
+ let documentation = await scanDocumentation();
44593
+ if (documentation) {
44594
+ await generateNavigationMap(documentation);
44595
+ documentation = await scanDocumentation();
44596
+ console.log(
44597
+ source_default.gray(
44598
+ ` docs ${source_default.white(String(documentation.length))} file${documentation.length !== 1 ? "s" : ""}`
44599
+ )
44600
+ );
44545
44601
  }
44546
- for (const a of activeAgents) {
44547
- console.log(source_default.gray(` agent ${source_default.white(a.config.resourceId)} v${a.config.version}`));
44602
+ const triggerCount = org.triggers?.length ?? 0;
44603
+ const integrationCount = org.integrations?.length ?? 0;
44604
+ const checkpointCount = org.humanCheckpoints?.length ?? 0;
44605
+ if (triggerCount > 0) console.log(source_default.gray(` triggers ${source_default.white(String(triggerCount))}`));
44606
+ if (integrationCount > 0) console.log(source_default.gray(` integrations ${source_default.white(String(integrationCount))}`));
44607
+ if (checkpointCount > 0) console.log(source_default.gray(` checkpoints ${source_default.white(String(checkpointCount))}`));
44608
+ const relationshipCount = org.relationships ? Object.keys(org.relationships).length : 0;
44609
+ if (relationshipCount > 0) {
44610
+ console.log(
44611
+ source_default.gray(
44612
+ ` rels ${source_default.white(String(relationshipCount))} resource${relationshipCount !== 1 ? "s" : ""}`
44613
+ )
44614
+ );
44548
44615
  }
44549
- console.log("");
44550
- } catch (error46) {
44551
- if (error46 instanceof RegistryValidationError) {
44552
- validateSpinner.fail(source_default.red("Validation failed"));
44553
- console.error("");
44554
- console.error(source_default.red(` ERROR ${error46.message}`));
44555
- if (error46.resourceId) {
44556
- console.error(source_default.gray(` Resource: ${error46.resourceId}`));
44616
+ const schemaWarnings = [];
44617
+ const workflows = activeWorkflows.map((w) => extractResourceMetadata(w, schemaWarnings));
44618
+ const agents = activeAgents.map((a) => extractResourceMetadata(a, schemaWarnings));
44619
+ if (schemaWarnings.length > 0) {
44620
+ for (const warning of schemaWarnings) {
44621
+ console.log(source_default.yellow(` warn ${warning}`));
44557
44622
  }
44558
- console.error("");
44559
- console.error(source_default.gray(" Deploy aborted."));
44560
- }
44561
- throw error46;
44562
- }
44563
- await generateResourceMap(org);
44564
- await generateProjectMap(org);
44565
- let documentation = await scanDocumentation();
44566
- if (documentation) {
44567
- await generateNavigationMap(documentation);
44568
- documentation = await scanDocumentation();
44569
- console.log(
44570
- source_default.gray(
44571
- ` docs ${source_default.white(String(documentation.length))} file${documentation.length !== 1 ? "s" : ""}`
44572
- )
44573
- );
44574
- }
44575
- const triggerCount = org.triggers?.length ?? 0;
44576
- const integrationCount = org.integrations?.length ?? 0;
44577
- const checkpointCount = org.humanCheckpoints?.length ?? 0;
44578
- if (triggerCount > 0) console.log(source_default.gray(` triggers ${source_default.white(String(triggerCount))}`));
44579
- if (integrationCount > 0) console.log(source_default.gray(` integrations ${source_default.white(String(integrationCount))}`));
44580
- if (checkpointCount > 0) console.log(source_default.gray(` checkpoints ${source_default.white(String(checkpointCount))}`));
44581
- const relationshipCount = org.relationships ? Object.keys(org.relationships).length : 0;
44582
- if (relationshipCount > 0) {
44583
- console.log(
44584
- source_default.gray(
44585
- ` rels ${source_default.white(String(relationshipCount))} resource${relationshipCount !== 1 ? "s" : ""}`
44586
- )
44587
- );
44588
- }
44589
- const schemaWarnings = [];
44590
- const workflows = activeWorkflows.map((w) => extractResourceMetadata(w, schemaWarnings));
44591
- const agents = activeAgents.map((a) => extractResourceMetadata(a, schemaWarnings));
44592
- if (schemaWarnings.length > 0) {
44593
- for (const warning of schemaWarnings) {
44594
- console.log(source_default.yellow(` warn ${warning}`));
44623
+ console.log(source_default.gray(" Schemas will be unavailable on the platform for these resources."));
44624
+ console.log("");
44595
44625
  }
44596
- console.log(source_default.gray(" Schemas will be unavailable on the platform for these resources."));
44597
- console.log("");
44598
- }
44599
- const bundleSpinner = ora("Bundling...").start();
44600
- const wrapperPath = (0, import_path.resolve)("__elevasis_worker.ts");
44601
- const bundleOutfile = (0, import_path.resolve)("dist/bundle.js");
44602
- try {
44603
- const entryImport = entryPath.replace(/\.ts$/, ".js");
44604
- const wrapperContent = `import org from ${JSON.stringify(entryImport)}
44626
+ const bundleSpinner = ora("Bundling...").start();
44627
+ const wrapperPath = (0, import_path.resolve)("__elevasis_worker.ts");
44628
+ const bundleOutfile = (0, import_path.resolve)("dist/bundle.js");
44629
+ try {
44630
+ const entryImport = entryPath.replace(/\.ts$/, ".js");
44631
+ const wrapperContent = `import org from ${JSON.stringify(entryImport)}
44605
44632
  import { startWorker } from '@elevasis/sdk/worker'
44606
44633
  startWorker(org)
44607
44634
  `;
44608
- await (0, import_promises.writeFile)(wrapperPath, wrapperContent, "utf-8");
44609
- await (0, import_promises.mkdir)((0, import_path.resolve)("dist"), { recursive: true });
44610
- const esbuild = getEsbuild();
44611
- await esbuild.build({
44612
- entryPoints: [wrapperPath],
44613
- bundle: true,
44614
- platform: "node",
44615
- format: "cjs",
44616
- outfile: bundleOutfile
44617
- });
44618
- await (0, import_promises.unlink)(wrapperPath);
44619
- const bundleBuffer = await (0, import_promises.readFile)(bundleOutfile);
44620
- const bundleSizeKB = Math.round(bundleBuffer.length / 1024);
44621
- bundleSpinner.succeed(
44622
- source_default.green("Bundling...") + source_default.white(" done") + source_default.gray(` (${bundleSizeKB} KB)`)
44623
- );
44624
- } catch (error46) {
44625
- try {
44635
+ await (0, import_promises.writeFile)(wrapperPath, wrapperContent, "utf-8");
44636
+ await (0, import_promises.mkdir)((0, import_path.resolve)("dist"), { recursive: true });
44637
+ const esbuild = getEsbuild();
44638
+ await esbuild.build({
44639
+ entryPoints: [wrapperPath],
44640
+ bundle: true,
44641
+ platform: "node",
44642
+ format: "cjs",
44643
+ outfile: bundleOutfile
44644
+ });
44626
44645
  await (0, import_promises.unlink)(wrapperPath);
44627
- } catch {
44628
- }
44629
- bundleSpinner.fail(source_default.red("Bundling failed"));
44630
- throw error46;
44631
- }
44632
- const uploadSpinner = ora("Uploading...").start();
44633
- try {
44634
- const bundleBuffer = await (0, import_promises.readFile)(bundleOutfile);
44635
- const apiKey = resolveApiKey(options2.prod);
44636
- if (!apiKey) {
44637
- uploadSpinner.fail(source_default.red("Missing API key environment variable"));
44638
- console.error(source_default.gray(" Set it in your .env file or shell environment:"));
44639
- if (!options2.prod && process.env.NODE_ENV === "development") {
44640
- console.error(source_default.gray(" ELEVASIS_PLATFORM_KEY_DEV=sk_... (or ELEVASIS_PLATFORM_KEY as fallback)"));
44641
- } else {
44642
- console.error(source_default.gray(" ELEVASIS_PLATFORM_KEY=sk_..."));
44646
+ const bundleBuffer = await (0, import_promises.readFile)(bundleOutfile);
44647
+ const bundleSizeKB = Math.round(bundleBuffer.length / 1024);
44648
+ bundleSpinner.succeed(
44649
+ source_default.green("Bundling...") + source_default.white(" done") + source_default.gray(` (${bundleSizeKB} KB)`)
44650
+ );
44651
+ } catch (error46) {
44652
+ try {
44653
+ await (0, import_promises.unlink)(wrapperPath);
44654
+ } catch {
44643
44655
  }
44644
- throw new Error("Missing API key environment variable");
44656
+ bundleSpinner.fail(source_default.red("Bundling failed"));
44657
+ throw error46;
44645
44658
  }
44646
- const metadata = {
44647
- sdkVersion: SDK_VERSION,
44648
- mode: env2,
44649
- resources: { workflows, agents },
44650
- ...documentation ? { documentation } : {},
44651
- ...org.relationships ? { relationships: org.relationships } : {}
44652
- };
44653
- const form = new FormData();
44654
- form.append("bundle", new Blob([bundleBuffer]), "bundle.js");
44655
- form.append("metadata", JSON.stringify(metadata));
44656
- const response = await fetch(`${apiUrl}/api/external/deploy`, {
44657
- method: "POST",
44658
- headers: { Authorization: `Bearer ${apiKey}` },
44659
- body: form
44660
- });
44661
- if (!response.ok) {
44662
- const errorText = await response.text();
44663
- uploadSpinner.fail(source_default.red("Upload failed"));
44664
- console.error(source_default.red(` ${response.status}: ${errorText}`));
44665
- throw new Error(`Deploy upload failed (${response.status}): ${errorText}`);
44666
- }
44667
- const result = await response.json();
44668
- uploadSpinner.succeed(source_default.green("Uploading...") + source_default.white(" done"));
44669
- const totalResources = activeWorkflows.length + activeAgents.length;
44670
- const elapsed = ((Date.now() - startTime) / 1e3).toFixed(1);
44671
- if (result.status === "active") {
44672
- console.log("");
44673
- console.log(
44674
- source_default.green.bold(` Deployed! ${totalResources} resource${totalResources !== 1 ? "s" : ""} live.`)
44675
- );
44676
- if (result.deployId) {
44677
- console.log(source_default.gray(` Version: ${result.deployId}`));
44659
+ const uploadSpinner = ora("Uploading...").start();
44660
+ try {
44661
+ const bundleBuffer = await (0, import_promises.readFile)(bundleOutfile);
44662
+ const apiKey = resolveApiKey(options2.prod);
44663
+ if (!apiKey) {
44664
+ uploadSpinner.fail(source_default.red("Missing API key environment variable"));
44665
+ console.error(source_default.gray(" Set it in your .env file or shell environment:"));
44666
+ if (!options2.prod && process.env.NODE_ENV === "development") {
44667
+ console.error(
44668
+ source_default.gray(" ELEVASIS_PLATFORM_KEY_DEV=sk_... (or ELEVASIS_PLATFORM_KEY as fallback)")
44669
+ );
44670
+ } else {
44671
+ console.error(source_default.gray(" ELEVASIS_PLATFORM_KEY=sk_..."));
44672
+ }
44673
+ throw new Error("Missing API key environment variable");
44678
44674
  }
44679
- console.log(source_default.gray(` Duration: ${elapsed}s`));
44680
- } else if (result.status === "failed") {
44681
- console.log("");
44682
- console.log(source_default.red.bold(" Deploy failed."));
44683
- if (result.error) {
44684
- console.error(source_default.red(` ${result.error}`));
44675
+ const metadata = {
44676
+ sdkVersion: SDK_VERSION,
44677
+ deploymentVersion: org.version,
44678
+ mode: env2,
44679
+ resources: { workflows, agents },
44680
+ ...documentation ? { documentation } : {},
44681
+ ...org.relationships ? { relationships: org.relationships } : {}
44682
+ };
44683
+ const form = new FormData();
44684
+ form.append("bundle", new Blob([bundleBuffer]), "bundle.js");
44685
+ form.append("metadata", JSON.stringify(metadata));
44686
+ const response = await fetch(`${apiUrl}/api/external/deploy`, {
44687
+ method: "POST",
44688
+ headers: { Authorization: `Bearer ${apiKey}` },
44689
+ body: form
44690
+ });
44691
+ if (!response.ok) {
44692
+ const errorText = await response.text();
44693
+ uploadSpinner.fail(source_default.red("Upload failed"));
44694
+ console.error(source_default.red(` ${response.status}: ${errorText}`));
44695
+ throw new Error(`Deploy upload failed (${response.status}): ${errorText}`);
44696
+ }
44697
+ const result = await response.json();
44698
+ uploadSpinner.succeed(source_default.green("Uploading...") + source_default.white(" done"));
44699
+ const totalResources = activeWorkflows.length + activeAgents.length;
44700
+ const elapsed = ((Date.now() - startTime) / 1e3).toFixed(1);
44701
+ if (result.status === "active") {
44702
+ console.log("");
44703
+ console.log(
44704
+ source_default.green.bold(` Deployed! ${totalResources} resource${totalResources !== 1 ? "s" : ""} live.`)
44705
+ );
44706
+ console.log(source_default.gray(` Version: ${source_default.white(`v${org.version}`)}`));
44707
+ console.log(source_default.gray(` Duration: ${elapsed}s`));
44708
+ } else if (result.status === "failed") {
44709
+ console.log("");
44710
+ console.log(source_default.red.bold(" Deploy failed."));
44711
+ if (result.error) {
44712
+ console.error(source_default.red(` ${result.error}`));
44713
+ }
44714
+ throw new Error(`Deploy failed: ${result.error ?? "unknown error"}`);
44715
+ } else {
44716
+ console.log("");
44717
+ console.log(source_default.yellow(` Deploy status: ${result.status ?? "unknown"}`));
44718
+ if (result.deployId) {
44719
+ console.log(source_default.gray(` Version: ${result.deployId}`));
44720
+ }
44685
44721
  }
44686
- throw new Error(`Deploy failed: ${result.error ?? "unknown error"}`);
44687
- } else {
44688
- console.log("");
44689
- console.log(source_default.yellow(` Deploy status: ${result.status ?? "unknown"}`));
44690
- if (result.deployId) {
44691
- console.log(source_default.gray(` Version: ${result.deployId}`));
44722
+ } catch (error46) {
44723
+ if (uploadSpinner.isSpinning) {
44724
+ uploadSpinner.fail(source_default.red("Deploy failed"));
44692
44725
  }
44726
+ throw error46;
44693
44727
  }
44694
- } catch (error46) {
44695
- if (uploadSpinner.isSpinning) {
44696
- uploadSpinner.fail(source_default.red("Deploy failed"));
44697
- }
44698
- throw error46;
44699
44728
  }
44700
- })
44729
+ )
44701
44730
  );
44702
44731
  }
44703
44732
 
package/dist/index.d.ts CHANGED
@@ -2310,6 +2310,7 @@ type Database = {
2310
2310
  Row: {
2311
2311
  compiled_docs: Json | null;
2312
2312
  created_at: string;
2313
+ deployment_version: string | null;
2313
2314
  documentation: Json | null;
2314
2315
  error_message: string | null;
2315
2316
  id: string;
@@ -2324,6 +2325,7 @@ type Database = {
2324
2325
  Insert: {
2325
2326
  compiled_docs?: Json | null;
2326
2327
  created_at?: string;
2328
+ deployment_version?: string | null;
2327
2329
  documentation?: Json | null;
2328
2330
  error_message?: string | null;
2329
2331
  id?: string;
@@ -2338,6 +2340,7 @@ type Database = {
2338
2340
  Update: {
2339
2341
  compiled_docs?: Json | null;
2340
2342
  created_at?: string;
2343
+ deployment_version?: string | null;
2341
2344
  documentation?: Json | null;
2342
2345
  error_message?: string | null;
2343
2346
  id?: string;
@@ -3475,6 +3478,8 @@ interface RemoteOrgConfig {
3475
3478
  toolCredentials?: Record<string, string>;
3476
3479
  /** SDK version used to deploy this bundle */
3477
3480
  sdkVersion?: string;
3481
+ /** Deployment version (semver) of the deployed bundle */
3482
+ deploymentVersion?: string;
3478
3483
  }
3479
3484
  /**
3480
3485
  * Organization-specific resource collection
@@ -3482,7 +3487,9 @@ interface RemoteOrgConfig {
3482
3487
  * Complete manifest of all automation resources for an organization.
3483
3488
  * Used by ResourceRegistry for discovery and Command View for visualization.
3484
3489
  */
3485
- interface OrganizationResources {
3490
+ interface DeploymentSpec {
3491
+ /** Deployment version (semver) */
3492
+ version: string;
3486
3493
  /** Workflow definitions */
3487
3494
  workflows?: WorkflowDefinition[];
3488
3495
  /** Agent definitions */
@@ -3498,10 +3505,12 @@ interface OrganizationResources {
3498
3505
  /** Human checkpoint definitions - human decision points in automation */
3499
3506
  humanCheckpoints?: HumanCheckpointDefinition[];
3500
3507
  }
3508
+ /** @deprecated Use DeploymentSpec instead */
3509
+ type OrganizationResources = DeploymentSpec;
3501
3510
  /**
3502
3511
  * Organization Registry type
3503
3512
  */
3504
- type OrganizationRegistry = Record<string, OrganizationResources>;
3513
+ type OrganizationRegistry = Record<string, DeploymentSpec>;
3505
3514
  declare class ResourceRegistry {
3506
3515
  private registry;
3507
3516
  /**
@@ -3568,7 +3577,7 @@ declare class ResourceRegistry {
3568
3577
  * @throws Error if incoming resourceId conflicts with a static resource
3569
3578
  * @throws Error if incoming deployment contains duplicate resourceIds
3570
3579
  */
3571
- registerOrganization(orgName: string, org: OrganizationResources, remote: RemoteOrgConfig): void;
3580
+ registerOrganization(orgName: string, org: DeploymentSpec, remote: RemoteOrgConfig): void;
3572
3581
  /**
3573
3582
  * Patch serialized cache with pre-serialized schemas from an external manifest.
3574
3583
  *
@@ -3603,7 +3612,7 @@ declare class ResourceRegistry {
3603
3612
  * @param orgName - Organization name
3604
3613
  * @param org - Resource definitions with real handlers (not stubs)
3605
3614
  */
3606
- registerStaticResources(orgName: string, org: OrganizationResources): void;
3615
+ registerStaticResources(orgName: string, org: DeploymentSpec): void;
3607
3616
  /**
3608
3617
  * Unregister runtime-registered resources for an organization
3609
3618
  *
@@ -7398,4 +7407,4 @@ declare class ToolingError extends ExecutionError {
7398
7407
  }
7399
7408
 
7400
7409
  export { ExecutionError, RegistryValidationError, ResourceRegistry, StepType, ToolingError };
7401
- export type { AbsoluteScheduleConfig, AcqCompany, AcqContact, AcqDeal, AcqList, AddToCampaignLead, AddToCampaignParams, AddToCampaignResult, AgentConfig, AgentConstraints, AgentDefinition, AgentMemory, FindCompanyEmailParams as AnymailfinderFindCompanyEmailParams, FindCompanyEmailResult as AnymailfinderFindCompanyEmailResult, FindDecisionMakerEmailParams as AnymailfinderFindDecisionMakerEmailParams, FindDecisionMakerEmailResult as AnymailfinderFindDecisionMakerEmailResult, FindPersonEmailParams as AnymailfinderFindPersonEmailParams, FindPersonEmailResult as AnymailfinderFindPersonEmailResult, AnymailfinderToolMap, VerifyEmailParams as AnymailfinderVerifyEmailParams, VerifyEmailResult as AnymailfinderVerifyEmailResult, ApifyToolMap, ApifyWebhookConfig, AppendRowsParams, AppendRowsResult, ApprovalToolMap, AttioToolMap, BatchUpdateParams, BatchUpdateResult, BulkDeleteLeadsParams, BulkDeleteLeadsResult, BulkImportParams, BulkImportResult, CancelHitlByDealIdParams, CancelSchedulesAndHitlByEmailParams, ClearDealFieldsParams, ClearRangeParams, ClearRangeResult, CompanyFilters, ConditionalNext, ContactFilters, Contract, CreateAttributeParams, CreateAttributeResult, CreateAutoPaymentLinkParams, CreateAutoPaymentLinkResult, CreateCheckoutSessionParams, CreateCheckoutSessionResult, CreateCompanyParams, CreateContactParams, CreateEnvelopeParams, CreateEnvelopeResult, CreateFolderParams, CreateFolderResult, CreateListParams, CreateNoteParams, CreateNoteResult, CreatePaymentLinkParams, CreatePaymentLinkResult, CreateRecordParams, CreateRecordResult, CreateScheduleInput, DeleteDealParams, DeleteNoteParams, DeleteNoteResult, DeleteRecordParams, DeleteRecordResult, DeleteRowByValueParams, DeleteRowByValueResult, DomainDefinition, DownloadDocumentParams, DownloadDocumentResult, DropboxToolMap, ElevasConfig, EmailToolMap, EnvelopeDocument, EventTriggerConfig, ExecutionContext, ExecutionInterface, ExecutionMetadata, ExecutionToolMap, FilterExpression, FilterRowsParams, FilterRowsResult, FormField, FormFieldType, FormSchema, GetDailyCampaignAnalyticsParams, GetDailyCampaignAnalyticsResult, GetEmailsParams, GetEmailsResult, GetEnvelopeParams, GetEnvelopeResult, GetHeadersParams, GetHeadersResult, GetLastRowParams, GetLastRowResult, GetPaymentLinkParams, GetPaymentLinkResult, GetRecordParams, GetRecordResult, GetRowByValueParams, GetRowByValueResult, GetSpreadsheetMetadataParams, GetSpreadsheetMetadataResult, GmailSendEmailParams, GmailSendEmailResult, GmailToolMap, GoogleSheetsToolMap, HumanCheckpointDefinition, InstantlyToolMap, IntegrationDefinition, LLMAdapterFactory, LLMGenerateRequest, LLMGenerateResponse, LLMMessage, LLMModel, LeadToolMap, LinearNext, ListAttributesParams, ListAttributesResult, ListLeadsParams, ListLeadsResult, ListNotesParams, ListNotesResult, ListObjectsResult, ListPaymentLinksParams, ListPaymentLinksResult, MarkProposalReviewedParams, MarkProposalSentParams, MethodEntry, MillionVerifierToolMap, ModelConfig, NextConfig, NotificationSDKInput, NotificationToolMap, OrganizationResources, PaginatedResult, PaginationParams, PdfToolMap, QueryRecordsParams, QueryRecordsResult, ReadSheetParams, ReadSheetResult, Recipient, RecurringScheduleConfig, RelationshipDeclaration, RelativeScheduleConfig, RemoveFromSubsequenceParams, RemoveFromSubsequenceResult, ResendGetEmailParams, ResendGetEmailResult, ResendSendEmailParams, ResendSendEmailResult, ResendToolMap, ResourceDefinition, ResourceDomain, ResourceMetricsConfig, ResourceRelationships, ResourceStatus$1 as ResourceStatus, ResourceType, RunActorParams, RunActorResult, SDKLLMGenerateParams, ScheduleOriginTracking, ScheduleTarget, ScheduleTriggerConfig, SchedulerToolMap, SendReplyParams, SendReplyResult, SetContactNurtureParams, SheetInfo, SignatureApiFieldType, SignatureApiToolMap, SigningPlace, SortCriteria, StartActorParams, StartActorResult, StepHandler, StorageDeleteInput, StorageDeleteOutput, StorageDownloadInput, StorageDownloadOutput, StorageListInput, StorageListOutput, StorageSignedUrlInput, StorageSignedUrlOutput, StorageToolMap, StorageUploadInput, StorageUploadOutput, StripeToolMap, SyncDealStageParams, TaskSchedule, TaskScheduleConfig, TombaToolMap, Tool, ToolExecutionOptions, ToolMethodMap, ToolingErrorType, TriggerConfig, TriggerDefinition, UpdateAttributeParams, UpdateAttributeResult, UpdateCloseLostReasonParams, UpdateCompanyParams, UpdateContactParams, UpdateDiscoveryDataParams, UpdateFeesParams, UpdateInterestStatusParams, UpdateInterestStatusResult, UpdateListParams, UpdatePaymentLinkParams, UpdatePaymentLinkResult, UpdateProposalDataParams, UpdateRecordParams, UpdateRecordResult, UpdateRowByValueParams, UpdateRowByValueResult, UploadFileParams, UploadFileResult, UpsertCompanyParams, UpsertContactParams, UpsertDealParams, UpsertRowParams, UpsertRowResult, VoidEnvelopeParams, VoidEnvelopeResult, WebhookProviderType, WebhookTriggerConfig, WorkflowConfig, WorkflowDefinition, WorkflowStep, WriteSheetParams, WriteSheetResult };
7410
+ export type { AbsoluteScheduleConfig, AcqCompany, AcqContact, AcqDeal, AcqList, AddToCampaignLead, AddToCampaignParams, AddToCampaignResult, AgentConfig, AgentConstraints, AgentDefinition, AgentMemory, FindCompanyEmailParams as AnymailfinderFindCompanyEmailParams, FindCompanyEmailResult as AnymailfinderFindCompanyEmailResult, FindDecisionMakerEmailParams as AnymailfinderFindDecisionMakerEmailParams, FindDecisionMakerEmailResult as AnymailfinderFindDecisionMakerEmailResult, FindPersonEmailParams as AnymailfinderFindPersonEmailParams, FindPersonEmailResult as AnymailfinderFindPersonEmailResult, AnymailfinderToolMap, VerifyEmailParams as AnymailfinderVerifyEmailParams, VerifyEmailResult as AnymailfinderVerifyEmailResult, ApifyToolMap, ApifyWebhookConfig, AppendRowsParams, AppendRowsResult, ApprovalToolMap, AttioToolMap, BatchUpdateParams, BatchUpdateResult, BulkDeleteLeadsParams, BulkDeleteLeadsResult, BulkImportParams, BulkImportResult, CancelHitlByDealIdParams, CancelSchedulesAndHitlByEmailParams, ClearDealFieldsParams, ClearRangeParams, ClearRangeResult, CompanyFilters, ConditionalNext, ContactFilters, Contract, CreateAttributeParams, CreateAttributeResult, CreateAutoPaymentLinkParams, CreateAutoPaymentLinkResult, CreateCheckoutSessionParams, CreateCheckoutSessionResult, CreateCompanyParams, CreateContactParams, CreateEnvelopeParams, CreateEnvelopeResult, CreateFolderParams, CreateFolderResult, CreateListParams, CreateNoteParams, CreateNoteResult, CreatePaymentLinkParams, CreatePaymentLinkResult, CreateRecordParams, CreateRecordResult, CreateScheduleInput, DeleteDealParams, DeleteNoteParams, DeleteNoteResult, DeleteRecordParams, DeleteRecordResult, DeleteRowByValueParams, DeleteRowByValueResult, DeploymentSpec, DomainDefinition, DownloadDocumentParams, DownloadDocumentResult, DropboxToolMap, ElevasConfig, EmailToolMap, EnvelopeDocument, EventTriggerConfig, ExecutionContext, ExecutionInterface, ExecutionMetadata, ExecutionToolMap, FilterExpression, FilterRowsParams, FilterRowsResult, FormField, FormFieldType, FormSchema, GetDailyCampaignAnalyticsParams, GetDailyCampaignAnalyticsResult, GetEmailsParams, GetEmailsResult, GetEnvelopeParams, GetEnvelopeResult, GetHeadersParams, GetHeadersResult, GetLastRowParams, GetLastRowResult, GetPaymentLinkParams, GetPaymentLinkResult, GetRecordParams, GetRecordResult, GetRowByValueParams, GetRowByValueResult, GetSpreadsheetMetadataParams, GetSpreadsheetMetadataResult, GmailSendEmailParams, GmailSendEmailResult, GmailToolMap, GoogleSheetsToolMap, HumanCheckpointDefinition, InstantlyToolMap, IntegrationDefinition, LLMAdapterFactory, LLMGenerateRequest, LLMGenerateResponse, LLMMessage, LLMModel, LeadToolMap, LinearNext, ListAttributesParams, ListAttributesResult, ListLeadsParams, ListLeadsResult, ListNotesParams, ListNotesResult, ListObjectsResult, ListPaymentLinksParams, ListPaymentLinksResult, MarkProposalReviewedParams, MarkProposalSentParams, MethodEntry, MillionVerifierToolMap, ModelConfig, NextConfig, NotificationSDKInput, NotificationToolMap, OrganizationResources, PaginatedResult, PaginationParams, PdfToolMap, QueryRecordsParams, QueryRecordsResult, ReadSheetParams, ReadSheetResult, Recipient, RecurringScheduleConfig, RelationshipDeclaration, RelativeScheduleConfig, RemoveFromSubsequenceParams, RemoveFromSubsequenceResult, ResendGetEmailParams, ResendGetEmailResult, ResendSendEmailParams, ResendSendEmailResult, ResendToolMap, ResourceDefinition, ResourceDomain, ResourceMetricsConfig, ResourceRelationships, ResourceStatus$1 as ResourceStatus, ResourceType, RunActorParams, RunActorResult, SDKLLMGenerateParams, ScheduleOriginTracking, ScheduleTarget, ScheduleTriggerConfig, SchedulerToolMap, SendReplyParams, SendReplyResult, SetContactNurtureParams, SheetInfo, SignatureApiFieldType, SignatureApiToolMap, SigningPlace, SortCriteria, StartActorParams, StartActorResult, StepHandler, StorageDeleteInput, StorageDeleteOutput, StorageDownloadInput, StorageDownloadOutput, StorageListInput, StorageListOutput, StorageSignedUrlInput, StorageSignedUrlOutput, StorageToolMap, StorageUploadInput, StorageUploadOutput, StripeToolMap, SyncDealStageParams, TaskSchedule, TaskScheduleConfig, TombaToolMap, Tool, ToolExecutionOptions, ToolMethodMap, ToolingErrorType, TriggerConfig, TriggerDefinition, UpdateAttributeParams, UpdateAttributeResult, UpdateCloseLostReasonParams, UpdateCompanyParams, UpdateContactParams, UpdateDiscoveryDataParams, UpdateFeesParams, UpdateInterestStatusParams, UpdateInterestStatusResult, UpdateListParams, UpdatePaymentLinkParams, UpdatePaymentLinkResult, UpdateProposalDataParams, UpdateRecordParams, UpdateRecordResult, UpdateRowByValueParams, UpdateRowByValueResult, UploadFileParams, UploadFileResult, UpsertCompanyParams, UpsertContactParams, UpsertDealParams, UpsertRowParams, UpsertRowResult, VoidEnvelopeParams, VoidEnvelopeResult, WebhookProviderType, WebhookTriggerConfig, WorkflowConfig, WorkflowDefinition, WorkflowStep, WriteSheetParams, WriteSheetResult };
package/dist/index.js CHANGED
@@ -426,7 +426,7 @@ var RegistryValidationError = class extends Error {
426
426
  this.name = "RegistryValidationError";
427
427
  }
428
428
  };
429
- function validateOrganizationResources(orgName, resources) {
429
+ function validateDeploymentSpec(orgName, resources) {
430
430
  const seenIds = /* @__PURE__ */ new Set();
431
431
  resources.workflows?.forEach((workflow) => {
432
432
  const id = workflow.config.resourceId;
@@ -558,7 +558,8 @@ function isZodOptional(schema) {
558
558
  return schema.isOptional();
559
559
  }
560
560
  function validateRelationships(orgName, resources) {
561
- if (!resources.relationships && !resources.triggers && !resources.externalResources && !resources.humanCheckpoints) return;
561
+ if (!resources.relationships && !resources.triggers && !resources.externalResources && !resources.humanCheckpoints)
562
+ return;
562
563
  const validAgentIds = new Set(resources.agents?.map((a) => a.config.resourceId) ?? []);
563
564
  const validWorkflowIds = new Set(resources.workflows?.map((w) => w.config.resourceId) ?? []);
564
565
  const validIntegrationIds = new Set(resources.integrations?.map((i) => i.resourceId) ?? []);
@@ -3027,6 +3028,7 @@ function serializeOrganization(resources) {
3027
3028
  const humanCheckpoints = resources.humanCheckpoints ?? [];
3028
3029
  const domainDefinitions = deriveDomainDefinitions(resources);
3029
3030
  return {
3031
+ version: resources.version,
3030
3032
  resources: {
3031
3033
  workflows: workflowResources,
3032
3034
  agents: agentResources,
@@ -3185,7 +3187,7 @@ var ResourceRegistry = class {
3185
3187
  */
3186
3188
  validateRegistry() {
3187
3189
  for (const [orgName, resources] of Object.entries(this.registry)) {
3188
- validateOrganizationResources(orgName, resources);
3190
+ validateDeploymentSpec(orgName, resources);
3189
3191
  }
3190
3192
  }
3191
3193
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/sdk",
3
- "version": "0.9.7",
3
+ "version": "1.0.1",
4
4
  "description": "SDK for building Elevasis organization resources",
5
5
  "type": "module",
6
6
  "bin": {
@@ -50,8 +50,8 @@
50
50
  "tsup": "^8.0.0",
51
51
  "typescript": "5.9.2",
52
52
  "zod": "^4.1.0",
53
- "@repo/core": "0.0.0",
54
- "@repo/typescript-config": "0.0.0"
53
+ "@repo/typescript-config": "0.0.0",
54
+ "@repo/core": "0.0.0"
55
55
  },
56
56
  "scripts": {
57
57
  "build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.core-dts.json && tsc -p tsconfig.build.json && tsup && rollup -c rollup.dts.config.mjs && esbuild src/cli/index.ts --bundle --platform=node --outfile=dist/cli.cjs --format=cjs --external:esbuild --banner:js=\"#!/usr/bin/env node\" && node scripts/copy-reference-docs.mjs && node scripts/generate-navigation.mjs",