@elevasis/sdk 1.52.1 → 1.53.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,4 +1,4 @@
1
- import { __require } from './chunk-VYWGWJRW.js';
1
+ import { __require } from './chunk-HB7DC5LT.js';
2
2
  import { z, ZodError } from 'zod';
3
3
 
4
4
  // src/define-contract.ts
@@ -7787,6 +7787,9 @@ function getLeadGenCrmHandoffResourceIds(model) {
7787
7787
  (resource) => resource.systemPath === LEAD_GEN_CRM_HANDOFF_INTERFACE.systemPath && resource.ontology?.usesCatalogs?.includes(CRM_PIPELINE_CATALOG_ONTOLOGY_ID) === true
7788
7788
  ).map((resource) => resource.id);
7789
7789
  }
7790
+ function isLeadGenCrmHandoffAdopted(model) {
7791
+ return getSystem(model, LEAD_GEN_API_INTERFACE.systemPath)?.apiInterface !== void 0 && getSystem(model, CRM_API_INTERFACE.systemPath)?.apiInterface !== void 0;
7792
+ }
7790
7793
  function mergeLeadGenDerivedCatalogs(model) {
7791
7794
  const baseCatalogTypes = model.ontology?.catalogTypes ?? {};
7792
7795
  const derivedCatalogTypes = {};
@@ -7835,11 +7838,14 @@ registerBuiltInReadinessProfile(LEAD_GEN_CRM_HANDOFF_INTERFACE.readinessProfile,
7835
7838
  registerReadinessInterfaceMarker(
7836
7839
  LEAD_GEN_CRM_HANDOFF_INTERFACE.systemPath,
7837
7840
  LEAD_GEN_CRM_HANDOFF_INTERFACE.interfaceKey,
7838
- (model) => ({
7839
- lifecycle: "active",
7840
- readinessProfile: LEAD_GEN_CRM_HANDOFF_INTERFACE.readinessProfile,
7841
- resourceIds: getLeadGenCrmHandoffResourceIds(model)
7842
- })
7841
+ (model) => {
7842
+ if (!isLeadGenCrmHandoffAdopted(model)) return void 0;
7843
+ return {
7844
+ lifecycle: "active",
7845
+ readinessProfile: LEAD_GEN_CRM_HANDOFF_INTERFACE.readinessProfile,
7846
+ resourceIds: getLeadGenCrmHandoffResourceIds(model)
7847
+ };
7848
+ }
7843
7849
  );
7844
7850
  function findLeadGenTemplateStepCatalog(index) {
7845
7851
  return Object.values(index.ontology.catalogTypes).find(
@@ -1,4 +1,4 @@
1
- import { ProcessingStageStatusSchema, ListBuilderStageKeySchema, zodToJsonSchema, LLMResponseParseError, errorToString, getErrorDetails, ExecutionError2, validateEntryPoint, validateTerminalSteps, validateStepReferences, WorkflowTimeoutError, WorkflowStalledError, WorkflowCancellationError, logWorkflowStart, detectCycle, WorkflowStepError, logStepStart, validateTerminalOutput, logStepSuccess, determineNextStep, logStepFailure, logExecutionPath, logWorkflowSuccess, logWorkflowFailure, estimateTokens, truncationCharBudget, buildIterationResponseSchema } from './chunk-XC57JNMA.js';
1
+ import { ProcessingStageStatusSchema, ListBuilderStageKeySchema, zodToJsonSchema, LLMResponseParseError, errorToString, getErrorDetails, ExecutionError2, validateEntryPoint, validateTerminalSteps, validateStepReferences, WorkflowTimeoutError, WorkflowStalledError, WorkflowCancellationError, logWorkflowStart, detectCycle, WorkflowStepError, logStepStart, validateTerminalOutput, logStepSuccess, determineNextStep, logStepFailure, logExecutionPath, logWorkflowSuccess, logWorkflowFailure, estimateTokens, truncationCharBudget, buildIterationResponseSchema } from './chunk-B2KAVPNB.js';
2
2
  import { workerData, parentPort } from 'worker_threads';
3
3
  import { z, ZodError } from 'zod';
4
4
  import { createHmac } from 'crypto';
@@ -14,6 +14,22 @@ function toSdkResourceDescriptor(resource, getResourceOntologyBinding) {
14
14
  systemId: resource.systemPath
15
15
  };
16
16
  }
17
+ function projectDisplayIdentity(resourceId, local, descriptor) {
18
+ if (descriptor.title !== void 0 && descriptor.title !== local.name) {
19
+ console.warn(
20
+ `[deployment-spec] "${resourceId}" name disagrees with its OM descriptor \u2014 using the OM title. config.name: "${local.name}", OM title: "${descriptor.title}"`
21
+ );
22
+ }
23
+ if (descriptor.description !== void 0 && descriptor.description !== local.description) {
24
+ console.warn(
25
+ `[deployment-spec] "${resourceId}" description disagrees with its OM descriptor \u2014 using the OM description.`
26
+ );
27
+ }
28
+ return {
29
+ name: descriptor.title ?? local.name,
30
+ description: descriptor.description ?? local.description
31
+ };
32
+ }
17
33
  function withPlatformResourceDescriptor(workflow, getWorkflowResourceDescriptor, getResourceOntologyBinding) {
18
34
  const resource = getWorkflowResourceDescriptor(workflow.config.resourceId);
19
35
  const sdkResource = toSdkResourceDescriptor(resource, getResourceOntologyBinding);
@@ -21,6 +37,7 @@ function withPlatformResourceDescriptor(workflow, getWorkflowResourceDescriptor,
21
37
  ...workflow,
22
38
  config: {
23
39
  ...workflow.config,
40
+ ...projectDisplayIdentity(sdkResource.id, workflow.config, sdkResource),
24
41
  resource: sdkResource,
25
42
  resourceId: sdkResource.id,
26
43
  type: sdkResource.kind
@@ -39,6 +56,7 @@ function withPlatformAgentResourceDescriptor(agent, getAgentResourceDescriptor,
39
56
  ...agent,
40
57
  config: {
41
58
  ...agent.config,
59
+ ...projectDisplayIdentity(sdkResource.id, agent.config, sdkResource),
42
60
  resource: sdkResource,
43
61
  resourceId: sdkResource.id,
44
62
  type: sdkResource.kind
package/dist/cli.cjs CHANGED
@@ -46947,10 +46947,64 @@ var init_sse = __esm({
46947
46947
  }
46948
46948
  });
46949
46949
 
46950
+ // ../core/src/platform/api/describe-error.ts
46951
+ function parseAPIErrorEnvelope(body) {
46952
+ try {
46953
+ const parsed = JSON.parse(body);
46954
+ if (parsed && typeof parsed === "object" && typeof parsed.error === "string") {
46955
+ return parsed;
46956
+ }
46957
+ } catch {
46958
+ }
46959
+ return null;
46960
+ }
46961
+ function describeAPIError(status, envelope, options = {}) {
46962
+ const trailer = [];
46963
+ if (options.endpoint) trailer.push(` Endpoint: ${options.endpoint}`);
46964
+ if (envelope.requestId) trailer.push(` Request ID: ${envelope.requestId}`);
46965
+ if (envelope.fields) {
46966
+ for (const [field2, messages] of Object.entries(envelope.fields)) {
46967
+ trailer.push(` ${field2}: ${messages.join("; ")}`);
46968
+ }
46969
+ }
46970
+ const suffix = trailer.length > 0 ? `
46971
+ ${trailer.join("\n")}` : "";
46972
+ if (status === 403) {
46973
+ return `403 Access denied: ${envelope.error}
46974
+ The API refused this deliberately -- the request reached the handler and was rejected,
46975
+ so nothing was written. Usual causes, in order of likelihood:
46976
+ - the role on this organization membership lacks the required permission
46977
+ - a row-level security policy refused the row
46978
+ - the credential is scoped to a different organization than the one addressed` + suffix;
46979
+ }
46980
+ if (status === 401) {
46981
+ return `401 Unauthorized: ${envelope.error}
46982
+ The credential was missing, malformed, or not accepted. This is authentication,
46983
+ not permission -- a valid credential that lacks access returns 403 instead.` + suffix;
46984
+ }
46985
+ if (status === 404) {
46986
+ return `404 Not found: ${envelope.error}
46987
+ Check the identifier. Deployed resources carry a suffix (e.g. '-workflow'), and a
46988
+ resource in another organization reads as absent rather than forbidden.` + suffix;
46989
+ }
46990
+ if (status === 429) {
46991
+ const retry = envelope.retryAfter ? ` Retry in ${envelope.retryAfter}s.` : "";
46992
+ return `429 Rate limited: ${envelope.error}${retry}${suffix}`;
46993
+ }
46994
+ const label = envelope.code ? `${status} ${envelope.code}` : String(status);
46995
+ return `API request failed (${label}): ${envelope.error}${suffix}`;
46996
+ }
46997
+ var init_describe_error = __esm({
46998
+ "../core/src/platform/api/describe-error.ts"() {
46999
+ "use strict";
47000
+ }
47001
+ });
47002
+
46950
47003
  // ../core/src/platform/api/index.ts
46951
47004
  var init_api2 = __esm({
46952
47005
  "../core/src/platform/api/index.ts"() {
46953
47006
  "use strict";
47007
+ init_describe_error();
46954
47008
  }
46955
47009
  });
46956
47010
 
@@ -48452,6 +48506,9 @@ function getLeadGenCrmHandoffResourceIds(model) {
48452
48506
  (resource) => resource.systemPath === LEAD_GEN_CRM_HANDOFF_INTERFACE.systemPath && resource.ontology?.usesCatalogs?.includes(CRM_PIPELINE_CATALOG_ONTOLOGY_ID) === true
48453
48507
  ).map((resource) => resource.id);
48454
48508
  }
48509
+ function isLeadGenCrmHandoffAdopted(model) {
48510
+ return getSystem(model, LEAD_GEN_API_INTERFACE.systemPath)?.apiInterface !== void 0 && getSystem(model, CRM_API_INTERFACE.systemPath)?.apiInterface !== void 0;
48511
+ }
48455
48512
  function mergeLeadGenDerivedCatalogs(model) {
48456
48513
  const baseCatalogTypes = model.ontology?.catalogTypes ?? {};
48457
48514
  const derivedCatalogTypes = {};
@@ -48482,6 +48539,7 @@ var init_ontology_validation = __esm({
48482
48539
  init_ontology();
48483
48540
  init_systems();
48484
48541
  init_migration_helpers();
48542
+ init_helpers();
48485
48543
  init_engine();
48486
48544
  LEAD_GEN_API_INTERFACE = SYSTEM_INTERFACE_PROFILES[0];
48487
48545
  CRM_API_INTERFACE = SYSTEM_INTERFACE_PROFILES[1];
@@ -48563,11 +48621,14 @@ var init_ontology_validation = __esm({
48563
48621
  registerReadinessInterfaceMarker(
48564
48622
  LEAD_GEN_CRM_HANDOFF_INTERFACE.systemPath,
48565
48623
  LEAD_GEN_CRM_HANDOFF_INTERFACE.interfaceKey,
48566
- (model) => ({
48567
- lifecycle: "active",
48568
- readinessProfile: LEAD_GEN_CRM_HANDOFF_INTERFACE.readinessProfile,
48569
- resourceIds: getLeadGenCrmHandoffResourceIds(model)
48570
- })
48624
+ (model) => {
48625
+ if (!isLeadGenCrmHandoffAdopted(model)) return void 0;
48626
+ return {
48627
+ lifecycle: "active",
48628
+ readinessProfile: LEAD_GEN_CRM_HANDOFF_INTERFACE.readinessProfile,
48629
+ resourceIds: getLeadGenCrmHandoffResourceIds(model)
48630
+ };
48631
+ }
48571
48632
  );
48572
48633
  }
48573
48634
  });
@@ -49273,7 +49334,12 @@ async function request(method, endpoint, apiUrl, body) {
49273
49334
  if (GATEWAY_STATUSES.has(response.status)) {
49274
49335
  throw new Error(describeGatewayFailure(response.status, endpoint, elapsedMs));
49275
49336
  }
49276
- throw new Error(`API request failed (${response.status}): ${errorText}`);
49337
+ const envelope = parseAPIErrorEnvelope(errorText);
49338
+ if (envelope) {
49339
+ throw new Error(describeAPIError(response.status, envelope, { endpoint }));
49340
+ }
49341
+ throw new Error(`API request failed (${response.status}): ${errorText}
49342
+ Endpoint: ${endpoint}`);
49277
49343
  }
49278
49344
  if (response.status === 204) {
49279
49345
  return {};
@@ -49296,6 +49362,7 @@ var DEFAULT_TIMEOUT_MS, GATEWAY_STATUSES;
49296
49362
  var init_api_client = __esm({
49297
49363
  "src/cli/api-client.ts"() {
49298
49364
  "use strict";
49365
+ init_src();
49299
49366
  init_config2();
49300
49367
  init_readiness_failure();
49301
49368
  DEFAULT_TIMEOUT_MS = 2 * 60 * 60 * 1e3;
@@ -49308,7 +49375,7 @@ function wrapAction(commandName, fn) {
49308
49375
  return async (...args) => {
49309
49376
  try {
49310
49377
  await fn(...args);
49311
- process.exitCode = 0;
49378
+ process.exitCode ??= 0;
49312
49379
  } catch (error46) {
49313
49380
  const errorMessage = error46 instanceof Error ? error46.message : String(error46);
49314
49381
  console.error(source_default.red("\nError:"), errorMessage);
@@ -49330,7 +49397,7 @@ var init_package = __esm({
49330
49397
  "package.json"() {
49331
49398
  package_default = {
49332
49399
  name: "@elevasis/sdk",
49333
- version: "1.52.1",
49400
+ version: "1.53.0",
49334
49401
  description: "SDK for building Elevasis organization resources",
49335
49402
  type: "module",
49336
49403
  bin: {
@@ -58735,6 +58802,13 @@ function mergeOmDoctorDiagnostics(report, extra, options = {}) {
58735
58802
  const summary = summarize(merged);
58736
58803
  return { ...report, ok: summary.error === 0, summary, diagnostics: merged };
58737
58804
  }
58805
+ function requireDeployedUnavailableDiagnostic(unavailableReason) {
58806
+ return {
58807
+ severity: "error",
58808
+ code: "deployed-readiness-unavailable",
58809
+ message: `--require-deployed was set but the deployed-snapshot readiness check did not run: ${unavailableReason}`
58810
+ };
58811
+ }
58738
58812
  function formatDiagnostic(diagnostic) {
58739
58813
  const target = diagnostic.targetId ? ` (${diagnostic.targetId})` : "";
58740
58814
  const source = diagnostic.source ? ` [${diagnostic.source}]` : "";
@@ -58769,9 +58843,15 @@ function formatOmDoctorReport(report) {
58769
58843
  // src/cli/commands/om/doctor.ts
58770
58844
  function registerOmDoctorCommand(program3) {
58771
58845
  program3.command("om:doctor").description(
58772
- "Reduced model doctor \u2014 runs 3 of the platform's 5 checks, plus deployed readiness\n Checks: ontology references, knowledge links, rename-orphan hints\n NOT run (monorepo-only): UI-manifest consistency, contract-ref resolution\n Readiness is read from the deployed snapshot; it reports NOT RUN when offline\n Example: elevasis-sdk om:doctor\n Example: elevasis-sdk om:doctor --scope sales.crm\n Example: elevasis-sdk om:doctor --skip-deployed\n Example: elevasis-sdk om:doctor --json"
58773
- ).option("--json", "Output as grouped JSON envelope").option("--scope <systemPath>", "Limit diagnostics to a system path and descendants").option("--skip-deployed", "Structural checks only \u2014 do not ask the API about readiness").option("--prod", "Target production (overrides NODE_ENV=development)").option("--api-url <url>", "API URL").action(
58846
+ "Reduced model doctor \u2014 runs 3 of the platform's 5 checks, plus deployed readiness\n Checks: ontology references, knowledge links, rename-orphan hints\n NOT run (monorepo-only): UI-manifest consistency, contract-ref resolution\n Readiness is read from the deployed snapshot; it reports NOT RUN when offline\n Example: elevasis-sdk om:doctor\n Example: elevasis-sdk om:doctor --scope sales.crm\n Example: elevasis-sdk om:doctor --skip-deployed\n Example: elevasis-sdk om:doctor --require-deployed\n Example: elevasis-sdk om:doctor --json"
58847
+ ).option("--json", "Output as grouped JSON envelope").option("--scope <systemPath>", "Limit diagnostics to a system path and descendants").option("--skip-deployed", "Structural checks only \u2014 do not ask the API about readiness").option(
58848
+ "--require-deployed",
58849
+ "Fail (non-zero exit) if the deployed-snapshot readiness check is unavailable \u2014 API unreachable or no platform key \u2014 instead of the default degraded pass. Opt-in: default behavior is unchanged, and this is rejected together with --skip-deployed."
58850
+ ).option("--prod", "Target production (overrides NODE_ENV=development)").option("--api-url <url>", "API URL").action(
58774
58851
  wrapAction("om:doctor", async (options) => {
58852
+ if (options.requireDeployed && options.skipDeployed) {
58853
+ throw new Error("--require-deployed and --skip-deployed are mutually exclusive");
58854
+ }
58775
58855
  let report;
58776
58856
  try {
58777
58857
  const projectRoot = getProjectRoot();
@@ -58786,6 +58866,13 @@ function registerOmDoctorCommand(program3) {
58786
58866
  });
58787
58867
  if (readiness.unavailableReason !== void 0) {
58788
58868
  report.sources.readinessUnavailableReason = readiness.unavailableReason;
58869
+ if (options.requireDeployed) {
58870
+ report = mergeOmDoctorDiagnostics(
58871
+ report,
58872
+ [requireDeployedUnavailableDiagnostic(readiness.unavailableReason)],
58873
+ { scope: options.scope }
58874
+ );
58875
+ }
58789
58876
  } else {
58790
58877
  report.sources.readiness = {
58791
58878
  activeDeploymentId: readiness.activeDeploymentId,
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { ActivityEventSchema, BuildPlanSnapshotStepSchema, ProspectingBuildTemplateSchema as BuildTemplateSchema, ContractRefResolutionError, CrmStageKeySchema, CrmStateKeySchema, EmailSchema, ExecutionError, ListBuilderStageKeySchema, ProcessingStageStatusSchema, RegistryValidationError, ResourceRegistry, StepType, ToolingError, bindResourceDescriptor, compileBusinessOntologyValidationIndex, concurrentPool, createLeadGenStageValidators, defineContract, defineResource, defineResourceOntology, defineResources, defineStep, defineTopology, defineTopologyRelationship, defineWorkflow, defineWorkflowConfig, deriveActions, diagnosticOutput, integrationInput, isBuiltInReadinessProfile, isZodType, lookupReadinessProfile, parseTopologyNodeRef, registerReadinessProfile, resolveContractRef, runDiagnostic, splitName, topologyRef, topologyRelationship, validateDeclaredSystemInterfaceReadiness, validateResourceGovernance } from './chunk-XC57JNMA.js';
2
- export { projectDeploymentSpec, projectTopologyRelationships, toSdkResourceDescriptor, withPlatformAgentResourceDescriptor, withPlatformAgentResourceDescriptors, withPlatformIntegrationResourceDescriptor, withPlatformIntegrationResourceDescriptors, withPlatformResourceDescriptor, withPlatformResourceDescriptors } from './chunk-VYWGWJRW.js';
1
+ export { ActivityEventSchema, BuildPlanSnapshotStepSchema, ProspectingBuildTemplateSchema as BuildTemplateSchema, ContractRefResolutionError, CrmStageKeySchema, CrmStateKeySchema, EmailSchema, ExecutionError, ListBuilderStageKeySchema, ProcessingStageStatusSchema, RegistryValidationError, ResourceRegistry, StepType, ToolingError, bindResourceDescriptor, compileBusinessOntologyValidationIndex, concurrentPool, createLeadGenStageValidators, defineContract, defineResource, defineResourceOntology, defineResources, defineStep, defineTopology, defineTopologyRelationship, defineWorkflow, defineWorkflowConfig, deriveActions, diagnosticOutput, integrationInput, isBuiltInReadinessProfile, isZodType, lookupReadinessProfile, parseTopologyNodeRef, registerReadinessProfile, resolveContractRef, runDiagnostic, splitName, topologyRef, topologyRelationship, validateDeclaredSystemInterfaceReadiness, validateResourceGovernance } from './chunk-B2KAVPNB.js';
2
+ export { projectDeploymentSpec, projectTopologyRelationships, toSdkResourceDescriptor, withPlatformAgentResourceDescriptor, withPlatformAgentResourceDescriptors, withPlatformIntegrationResourceDescriptor, withPlatformIntegrationResourceDescriptors, withPlatformResourceDescriptor, withPlatformResourceDescriptors } from './chunk-HB7DC5LT.js';
@@ -1,4 +1,4 @@
1
- export { projectDeploymentSpec, projectTopologyRelationships, toSdkResourceDescriptor, withPlatformAgentResourceDescriptor, withPlatformAgentResourceDescriptors, withPlatformIntegrationResourceDescriptor, withPlatformIntegrationResourceDescriptors, withPlatformResourceDescriptor, withPlatformResourceDescriptors } from '../chunk-VYWGWJRW.js';
1
+ export { projectDeploymentSpec, projectTopologyRelationships, toSdkResourceDescriptor, withPlatformAgentResourceDescriptor, withPlatformAgentResourceDescriptors, withPlatformIntegrationResourceDescriptor, withPlatformIntegrationResourceDescriptors, withPlatformResourceDescriptor, withPlatformResourceDescriptors } from '../chunk-HB7DC5LT.js';
2
2
  import { readFileSync, mkdirSync, writeFileSync, readdirSync } from 'fs';
3
3
  import { relative, dirname, resolve, join, extname } from 'path';
4
4
  import { compile } from '@mdx-js/mdx';
@@ -1,6 +1,6 @@
1
- import { executeWorkflow } from '../chunk-T6DTAP2U.js';
2
- import { validateDeploymentSpec, validateRelationships } from '../chunk-XC57JNMA.js';
3
- import '../chunk-VYWGWJRW.js';
1
+ import { executeWorkflow } from '../chunk-FUOIYRIZ.js';
2
+ import { validateDeploymentSpec, validateRelationships } from '../chunk-B2KAVPNB.js';
3
+ import '../chunk-HB7DC5LT.js';
4
4
  import { vi } from 'vitest';
5
5
 
6
6
  // src/test-utils/workflow.ts
@@ -1,3 +1,3 @@
1
- export { ListBuilderResultSchema, ListBuilderResultsSchema, PlatformToolError, acqDb, approval, artifacts, classifyPlatformToolError, content, createAdapter, createAnymailfinderAdapter, createApifyAdapter, createAttioAdapter, createCaptionGenerationWorkflow, createCaptureInstagramMetricsWorkflow, createClickUpAdapter, createDropboxAdapter, createGmailAdapter, createGoogleSheetsAdapter, createImageAnalysisWorkflow, createInstagramAdapter, createInstantlyAdapter, createMillionVerifierAdapter, createPublishInstagramWorkflow, createResendAdapter, createSignatureApiAdapter, createStripeAdapter, createTombaAdapter, crm, email, executeWorkflow, execution, generateHmacToken, list, listBuilderWorkflow, llm, notifications, pdf, platform, projects, scheduler, startWorker, storage, toContentMetrics } from '../chunk-T6DTAP2U.js';
2
- import '../chunk-XC57JNMA.js';
3
- import '../chunk-VYWGWJRW.js';
1
+ export { ListBuilderResultSchema, ListBuilderResultsSchema, PlatformToolError, acqDb, approval, artifacts, classifyPlatformToolError, content, createAdapter, createAnymailfinderAdapter, createApifyAdapter, createAttioAdapter, createCaptionGenerationWorkflow, createCaptureInstagramMetricsWorkflow, createClickUpAdapter, createDropboxAdapter, createGmailAdapter, createGoogleSheetsAdapter, createImageAnalysisWorkflow, createInstagramAdapter, createInstantlyAdapter, createMillionVerifierAdapter, createPublishInstagramWorkflow, createResendAdapter, createSignatureApiAdapter, createStripeAdapter, createTombaAdapter, crm, email, executeWorkflow, execution, generateHmacToken, list, listBuilderWorkflow, llm, notifications, pdf, platform, projects, scheduler, startWorker, storage, toContentMetrics } from '../chunk-FUOIYRIZ.js';
2
+ import '../chunk-B2KAVPNB.js';
3
+ import '../chunk-HB7DC5LT.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevasis/sdk",
3
- "version": "1.52.1",
3
+ "version": "1.53.0",
4
4
  "description": "SDK for building Elevasis organization resources",
5
5
  "type": "module",
6
6
  "bin": {
@@ -56,6 +56,18 @@ Deploy accepts `--major`, `--minor`, `--patch` flags to bump the deployment vers
56
56
  1. **Bundle:** esbuild compiles `operations/src/index.ts` + all dependencies into a single self-contained CJS file. No `node_modules` needed at runtime.
57
57
  2. **Metadata:** Resource definitions, OM Resources descriptor bindings, Zod schemas (converted to JSON Schema), relationships, triggers.
58
58
 
59
+ ## The OM Descriptor Owns Display Identity
60
+
61
+ A resource's `name` and `description` in its `operations/src/**` config are **not** what the platform shows. At deploy time the projected spec takes `title` and `description` from that resource's OM descriptor in `core/config/organization-model.ts` and overrides the locally declared strings, because the descriptor is what Command Center's action surfaces render and a config string only ever reached the execution log.
62
+
63
+ Deploy warns per resource when the two disagree:
64
+
65
+ ```text
66
+ [deployment-spec] "<resource-id>" name disagrees with its OM descriptor -- using the OM title.
67
+ ```
68
+
69
+ That warning does not fail the deploy. Fix it by editing the OM descriptor when the descriptor is wrong, or the config when the config is. Editing only the config and redeploying changes nothing a user sees.
70
+
59
71
  ## Environment
60
72
 
61
73
  - `ELEVASIS_PLATFORM_KEY` in `.env` is required for CLI auth (used for every deploy unless `NODE_ENV=development` with no `--prod`)