@scenario-labs/sdk 0.2.0 → 0.3.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.
Files changed (115) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +4 -2
  3. package/client.d.mts +4 -4
  4. package/client.d.mts.map +1 -1
  5. package/client.d.ts +4 -4
  6. package/client.d.ts.map +1 -1
  7. package/client.js +11 -11
  8. package/client.js.map +1 -1
  9. package/client.mjs +11 -11
  10. package/client.mjs.map +1 -1
  11. package/index.d.mts +1 -0
  12. package/index.d.mts.map +1 -1
  13. package/index.d.ts +1 -0
  14. package/index.d.ts.map +1 -1
  15. package/index.js +3 -1
  16. package/index.js.map +1 -1
  17. package/index.mjs +1 -0
  18. package/index.mjs.map +1 -1
  19. package/internal/request-options.d.mts +1 -1
  20. package/internal/request-options.d.mts.map +1 -1
  21. package/internal/request-options.d.ts +1 -1
  22. package/internal/request-options.d.ts.map +1 -1
  23. package/lib/workflow.d.mts +6 -1
  24. package/lib/workflow.d.mts.map +1 -1
  25. package/lib/workflow.d.ts +6 -1
  26. package/lib/workflow.d.ts.map +1 -1
  27. package/lib/workflow.js +9 -1
  28. package/lib/workflow.js.map +1 -1
  29. package/lib/workflow.mjs +9 -1
  30. package/lib/workflow.mjs.map +1 -1
  31. package/lib/workflow_validator.d.mts +22 -0
  32. package/lib/workflow_validator.d.mts.map +1 -0
  33. package/lib/workflow_validator.d.ts +22 -0
  34. package/lib/workflow_validator.d.ts.map +1 -0
  35. package/lib/workflow_validator.js +124 -0
  36. package/lib/workflow_validator.js.map +1 -0
  37. package/lib/workflow_validator.mjs +121 -0
  38. package/lib/workflow_validator.mjs.map +1 -0
  39. package/package.json +1 -1
  40. package/resources/assets/assets.d.mts +9 -3
  41. package/resources/assets/assets.d.mts.map +1 -1
  42. package/resources/assets/assets.d.ts +9 -3
  43. package/resources/assets/assets.d.ts.map +1 -1
  44. package/resources/assets/assets.js +2 -2
  45. package/resources/assets/assets.js.map +1 -1
  46. package/resources/assets/assets.mjs +2 -2
  47. package/resources/assets/assets.mjs.map +1 -1
  48. package/resources/assets/index.d.mts +1 -1
  49. package/resources/assets/index.d.mts.map +1 -1
  50. package/resources/assets/index.d.ts +1 -1
  51. package/resources/assets/index.d.ts.map +1 -1
  52. package/resources/assets/index.js.map +1 -1
  53. package/resources/assets/index.mjs.map +1 -1
  54. package/resources/collections/assets.d.mts +8 -2
  55. package/resources/collections/assets.d.mts.map +1 -1
  56. package/resources/collections/assets.d.ts +8 -2
  57. package/resources/collections/assets.d.ts.map +1 -1
  58. package/resources/collections/assets.js +2 -2
  59. package/resources/collections/assets.js.map +1 -1
  60. package/resources/collections/assets.mjs +2 -2
  61. package/resources/collections/assets.mjs.map +1 -1
  62. package/resources/collections/collections.d.mts +4 -4
  63. package/resources/collections/collections.d.mts.map +1 -1
  64. package/resources/collections/collections.d.ts +4 -4
  65. package/resources/collections/collections.d.ts.map +1 -1
  66. package/resources/collections/collections.js.map +1 -1
  67. package/resources/collections/collections.mjs.map +1 -1
  68. package/resources/collections/index.d.mts +2 -2
  69. package/resources/collections/index.d.mts.map +1 -1
  70. package/resources/collections/index.d.ts +2 -2
  71. package/resources/collections/index.d.ts.map +1 -1
  72. package/resources/collections/index.js.map +1 -1
  73. package/resources/collections/index.mjs +2 -2
  74. package/resources/collections/index.mjs.map +1 -1
  75. package/resources/collections/models.d.mts +8 -2
  76. package/resources/collections/models.d.mts.map +1 -1
  77. package/resources/collections/models.d.ts +8 -2
  78. package/resources/collections/models.d.ts.map +1 -1
  79. package/resources/collections/models.js +2 -2
  80. package/resources/collections/models.js.map +1 -1
  81. package/resources/collections/models.mjs +2 -2
  82. package/resources/collections/models.mjs.map +1 -1
  83. package/resources/index.d.mts +1 -1
  84. package/resources/index.d.mts.map +1 -1
  85. package/resources/index.d.ts +1 -1
  86. package/resources/index.d.ts.map +1 -1
  87. package/resources/index.js.map +1 -1
  88. package/resources/index.mjs.map +1 -1
  89. package/resources/models/models.d.mts +133 -133
  90. package/resources/models/models.d.mts.map +1 -1
  91. package/resources/models/models.d.ts +133 -133
  92. package/resources/models/models.d.ts.map +1 -1
  93. package/resources/models/train.d.mts +38 -38
  94. package/resources/models/train.d.mts.map +1 -1
  95. package/resources/models/train.d.ts +38 -38
  96. package/resources/models/train.d.ts.map +1 -1
  97. package/src/client.ts +15 -13
  98. package/src/index.ts +1 -0
  99. package/src/internal/request-options.ts +1 -1
  100. package/src/lib/workflow.ts +10 -1
  101. package/src/lib/workflow_validator.ts +167 -0
  102. package/src/resources/assets/assets.ts +84 -3
  103. package/src/resources/assets/index.ts +1 -0
  104. package/src/resources/collections/assets.ts +14 -2
  105. package/src/resources/collections/collections.ts +4 -2
  106. package/src/resources/collections/index.ts +14 -2
  107. package/src/resources/collections/models.ts +14 -2
  108. package/src/resources/index.ts +1 -0
  109. package/src/resources/models/models.ts +140 -140
  110. package/src/resources/models/train.ts +40 -40
  111. package/src/version.ts +1 -1
  112. package/version.d.mts +1 -1
  113. package/version.d.ts +1 -1
  114. package/version.js +1 -1
  115. package/version.mjs +1 -1
package/index.mjs CHANGED
@@ -6,6 +6,7 @@ export { Scenario } from "./lib/scenario.mjs";
6
6
  export { ScenarioError, APIError, APIConnectionError, APIConnectionTimeoutError, APIUserAbortError, NotFoundError, ConflictError, RateLimitError, BadRequestError, AuthenticationError, InternalServerError, PermissionDeniedError, UnprocessableEntityError, } from "./core/error.mjs";
7
7
  export { Job } from "./lib/job.mjs";
8
8
  export { EnhancedWorkflows, WorkflowEntity } from "./lib/workflow.mjs";
9
+ export { validateWorkflowFlow } from "./lib/workflow_validator.mjs";
9
10
  export { EnhancedGenerate } from "./lib/generate.mjs";
10
11
  export { EnhancedModels, EnhancedTrain } from "./lib/models.mjs";
11
12
  //# sourceMappingURL=index.mjs.map
package/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAE/E,EAAE,QAAQ,IAAI,OAAO,EAAE;OAEvB,EAAmB,MAAM,EAAE;OAC3B,EAAE,UAAU,EAAE;OACd,EAAE,QAAQ,EAAE;OAEZ,EACL,aAAa,EACb,QAAQ,EACR,kBAAkB,EAClB,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB;OACM,EAAE,GAAG,EAAkC;OACvC,EAAE,iBAAiB,EAAE,cAAc,EAAE;OACrC,EAAE,gBAAgB,EAAE;OACpB,EAAE,cAAc,EAAE,aAAa,EAAE"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAE/E,EAAE,QAAQ,IAAI,OAAO,EAAE;OAEvB,EAAmB,MAAM,EAAE;OAC3B,EAAE,UAAU,EAAE;OACd,EAAE,QAAQ,EAAE;OAEZ,EACL,aAAa,EACb,QAAQ,EACR,kBAAkB,EAClB,yBAAyB,EACzB,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB;OACM,EAAE,GAAG,EAAkC;OACvC,EAAE,iBAAiB,EAAE,cAAc,EAAE;OACrC,EAAE,oBAAoB,EAAE;OACxB,EAAE,gBAAgB,EAAE;OACpB,EAAE,cAAc,EAAE,aAAa,EAAE"}
@@ -62,8 +62,8 @@ export type RequestOptions = {
62
62
  */
63
63
  defaultBaseURL?: string | undefined;
64
64
  __security?: {
65
- scBearerAuth?: boolean;
66
65
  scBasicAuth?: boolean;
66
+ scBearerAuth?: boolean;
67
67
  };
68
68
  __binaryResponse?: boolean | undefined;
69
69
  };
@@ -1 +1 @@
1
- {"version":3,"file":"request-options.d.mts","sourceRoot":"","sources":["../src/internal/request-options.ts"],"names":[],"mappings":"OAEO,EAAE,eAAe,EAAE;OAEnB,KAAK,EAAE,QAAQ,EAAE;OACjB,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE;OACtC,EAAE,KAAK,WAAW,EAAE;AAE3B,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAElC;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE7B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IAExC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEpC,UAAU,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAE/D,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,KAAK,cAAc,CAAC;AAEtG,eAAO,MAAM,eAAe,EAAE,cAO7B,CAAC"}
1
+ {"version":3,"file":"request-options.d.mts","sourceRoot":"","sources":["../src/internal/request-options.ts"],"names":[],"mappings":"OAEO,EAAE,eAAe,EAAE;OAEnB,KAAK,EAAE,QAAQ,EAAE;OACjB,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE;OACtC,EAAE,KAAK,WAAW,EAAE;AAE3B,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAElC;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE7B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IAExC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEpC,UAAU,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAE/D,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,KAAK,cAAc,CAAC;AAEtG,eAAO,MAAM,eAAe,EAAE,cAO7B,CAAC"}
@@ -62,8 +62,8 @@ export type RequestOptions = {
62
62
  */
63
63
  defaultBaseURL?: string | undefined;
64
64
  __security?: {
65
- scBearerAuth?: boolean;
66
65
  scBasicAuth?: boolean;
66
+ scBearerAuth?: boolean;
67
67
  };
68
68
  __binaryResponse?: boolean | undefined;
69
69
  };
@@ -1 +1 @@
1
- {"version":3,"file":"request-options.d.ts","sourceRoot":"","sources":["../src/internal/request-options.ts"],"names":[],"mappings":"OAEO,EAAE,eAAe,EAAE;OAEnB,KAAK,EAAE,QAAQ,EAAE;OACjB,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE;OACtC,EAAE,KAAK,WAAW,EAAE;AAE3B,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAElC;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE7B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IAExC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEpC,UAAU,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAE/D,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,KAAK,cAAc,CAAC;AAEtG,eAAO,MAAM,eAAe,EAAE,cAO7B,CAAC"}
1
+ {"version":3,"file":"request-options.d.ts","sourceRoot":"","sources":["../src/internal/request-options.ts"],"names":[],"mappings":"OAEO,EAAE,eAAe,EAAE;OAEnB,KAAK,EAAE,QAAQ,EAAE;OACjB,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE;OACtC,EAAE,KAAK,WAAW,EAAE;AAE3B,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAElC;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE7B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,iBAAiB,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAAC;IAExC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEpC,UAAU,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAE/D,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAAE,WAAW,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,KAAK,cAAc,CAAC;AAEtG,eAAO,MAAM,eAAe,EAAE,cAO7B,CAAC"}
@@ -21,6 +21,11 @@ export declare class WorkflowEntity {
21
21
  findNode(this: WorkflowEntity & WorkflowRetrieveResponse.Workflow, nodeId: string): DefinitionFlow | undefined;
22
22
  /** Get all nodes of a specific type from the workflow definition. */
23
23
  getNodesByType(this: WorkflowEntity & WorkflowRetrieveResponse.Workflow, type: NodeType): DefinitionFlow[];
24
+ /**
25
+ * Validate the structural integrity of a workflow flow.
26
+ * Throws an `Error` with a human-readable message on the first violation found.
27
+ */
28
+ validate(this: WorkflowEntity & WorkflowRetrieveResponse.Workflow): void;
24
29
  /** @internal Create a WorkflowEntity from raw workflow data. */
25
30
  static from(data: WorkflowRetrieveResponse.Workflow): WorkflowRetrieveResponse.Workflow & WorkflowEntity;
26
31
  }
@@ -36,7 +41,7 @@ export type EnhancedWorkflowRetrieveResponse = Omit<WorkflowRetrieveResponse, 'w
36
41
  export declare class EnhancedWorkflows extends Workflows {
37
42
  /**
38
43
  * Get workflow by ID. Returns an enhanced response where `workflow` has
39
- * `findNode()` and `getNodesByType()`.
44
+ * `findNode()`, `getNodesByType()`, and `validate()`.
40
45
  */
41
46
  retrieve(workflowID: string, options?: RequestOptions): APIPromise<EnhancedWorkflowRetrieveResponse>;
42
47
  /** Run a workflow. Returns an enhanced response where `job` has `.wait()`. */
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.mts","sourceRoot":"","sources":["../src/lib/workflow.ts"],"names":[],"mappings":"OAAO,KAAK,EAAE,UAAU,EAAE;OACnB,KAAK,EAAE,cAAc,EAAE;OACvB,EACL,SAAS,EACT,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB;OACM,EAAE,KAAK,OAAO,EAAc;AAEnC,KAAK,cAAc,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7D,KAAK,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IACzB,oDAAoD;IACpD,QAAQ,CACN,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,EACxD,MAAM,EAAE,MAAM,GACb,cAAc,GAAG,SAAS;IAI7B,qEAAqE;IACrE,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,cAAc,EAAE;IAI1G,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,GAAG,cAAc;CAGzG;AAED,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,wBAAwB,EAAE,UAAU,CAAC,GAAG;IAC1F,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,GAAG,cAAc,CAAC;CAC9D,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C;;;OAGG;IACM,QAAQ,CACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,gCAAgC,CAAC;IAO/C,8EAA8E;IACrE,GAAG,CACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAI3C,4FAA4F;IACnF,WAAW,CAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,yBAAyB,EAC/B,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAGpD"}
1
+ {"version":3,"file":"workflow.d.mts","sourceRoot":"","sources":["../src/lib/workflow.ts"],"names":[],"mappings":"OAAO,KAAK,EAAE,UAAU,EAAE;OACnB,KAAK,EAAE,cAAc,EAAE;OACvB,EACL,SAAS,EACT,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB;OACM,EAAE,KAAK,OAAO,EAAc;AAGnC,KAAK,cAAc,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7D,KAAK,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IACzB,oDAAoD;IACpD,QAAQ,CACN,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,EACxD,MAAM,EAAE,MAAM,GACb,cAAc,GAAG,SAAS;IAI7B,qEAAqE;IACrE,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,cAAc,EAAE;IAI1G;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,GAAG,IAAI;IAIxE,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,GAAG,cAAc;CAGzG;AAED,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,wBAAwB,EAAE,UAAU,CAAC,GAAG;IAC1F,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,GAAG,cAAc,CAAC;CAC9D,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C;;;OAGG;IACM,QAAQ,CACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,gCAAgC,CAAC;IAO/C,8EAA8E;IACrE,GAAG,CACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAI3C,4FAA4F;IACnF,WAAW,CAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,yBAAyB,EAC/B,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAGpD"}
package/lib/workflow.d.ts CHANGED
@@ -21,6 +21,11 @@ export declare class WorkflowEntity {
21
21
  findNode(this: WorkflowEntity & WorkflowRetrieveResponse.Workflow, nodeId: string): DefinitionFlow | undefined;
22
22
  /** Get all nodes of a specific type from the workflow definition. */
23
23
  getNodesByType(this: WorkflowEntity & WorkflowRetrieveResponse.Workflow, type: NodeType): DefinitionFlow[];
24
+ /**
25
+ * Validate the structural integrity of a workflow flow.
26
+ * Throws an `Error` with a human-readable message on the first violation found.
27
+ */
28
+ validate(this: WorkflowEntity & WorkflowRetrieveResponse.Workflow): void;
24
29
  /** @internal Create a WorkflowEntity from raw workflow data. */
25
30
  static from(data: WorkflowRetrieveResponse.Workflow): WorkflowRetrieveResponse.Workflow & WorkflowEntity;
26
31
  }
@@ -36,7 +41,7 @@ export type EnhancedWorkflowRetrieveResponse = Omit<WorkflowRetrieveResponse, 'w
36
41
  export declare class EnhancedWorkflows extends Workflows {
37
42
  /**
38
43
  * Get workflow by ID. Returns an enhanced response where `workflow` has
39
- * `findNode()` and `getNodesByType()`.
44
+ * `findNode()`, `getNodesByType()`, and `validate()`.
40
45
  */
41
46
  retrieve(workflowID: string, options?: RequestOptions): APIPromise<EnhancedWorkflowRetrieveResponse>;
42
47
  /** Run a workflow. Returns an enhanced response where `job` has `.wait()`. */
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/lib/workflow.ts"],"names":[],"mappings":"OAAO,KAAK,EAAE,UAAU,EAAE;OACnB,KAAK,EAAE,cAAc,EAAE;OACvB,EACL,SAAS,EACT,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB;OACM,EAAE,KAAK,OAAO,EAAc;AAEnC,KAAK,cAAc,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7D,KAAK,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IACzB,oDAAoD;IACpD,QAAQ,CACN,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,EACxD,MAAM,EAAE,MAAM,GACb,cAAc,GAAG,SAAS;IAI7B,qEAAqE;IACrE,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,cAAc,EAAE;IAI1G,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,GAAG,cAAc;CAGzG;AAED,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,wBAAwB,EAAE,UAAU,CAAC,GAAG;IAC1F,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,GAAG,cAAc,CAAC;CAC9D,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C;;;OAGG;IACM,QAAQ,CACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,gCAAgC,CAAC;IAO/C,8EAA8E;IACrE,GAAG,CACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAI3C,4FAA4F;IACnF,WAAW,CAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,yBAAyB,EAC/B,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAGpD"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/lib/workflow.ts"],"names":[],"mappings":"OAAO,KAAK,EAAE,UAAU,EAAE;OACnB,KAAK,EAAE,cAAc,EAAE;OACvB,EACL,SAAS,EACT,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB;OACM,EAAE,KAAK,OAAO,EAAc;AAGnC,KAAK,cAAc,GAAG,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC7D,KAAK,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEvC;;;;;;;;;;;GAWG;AACH,qBAAa,cAAc;IACzB,oDAAoD;IACpD,QAAQ,CACN,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,EACxD,MAAM,EAAE,MAAM,GACb,cAAc,GAAG,SAAS;IAI7B,qEAAqE;IACrE,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,cAAc,EAAE;IAI1G;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,wBAAwB,CAAC,QAAQ,GAAG,IAAI;IAIxE,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,QAAQ,GAAG,wBAAwB,CAAC,QAAQ,GAAG,cAAc;CAGzG;AAED,+DAA+D;AAC/D,MAAM,MAAM,gCAAgC,GAAG,IAAI,CAAC,wBAAwB,EAAE,UAAU,CAAC,GAAG;IAC1F,QAAQ,EAAE,wBAAwB,CAAC,QAAQ,GAAG,cAAc,CAAC;CAC9D,CAAC;AAEF;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C;;;OAGG;IACM,QAAQ,CACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,gCAAgC,CAAC;IAO/C,8EAA8E;IACrE,GAAG,CACV,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAI3C,4FAA4F;IACnF,WAAW,CAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,yBAAyB,EAC/B,OAAO,CAAC,EAAE,cAAc,GACvB,UAAU,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;CAGpD"}
package/lib/workflow.js CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EnhancedWorkflows = exports.WorkflowEntity = void 0;
4
4
  const workflows_1 = require("../resources/workflows.js");
5
5
  const job_1 = require("./job.js");
6
+ const workflow_validator_1 = require("./workflow_validator.js");
6
7
  /**
7
8
  * Enhanced workflow object with helper methods.
8
9
  * Has all original workflow fields plus `findNode()`, `getNodesByType()`.
@@ -24,6 +25,13 @@ class WorkflowEntity {
24
25
  getNodesByType(type) {
25
26
  return this.flow.filter((node) => node.type === type);
26
27
  }
28
+ /**
29
+ * Validate the structural integrity of a workflow flow.
30
+ * Throws an `Error` with a human-readable message on the first violation found.
31
+ */
32
+ validate() {
33
+ (0, workflow_validator_1.validateWorkflowFlow)(this.flow);
34
+ }
27
35
  /** @internal Create a WorkflowEntity from raw workflow data. */
28
36
  static from(data) {
29
37
  return Object.assign(Object.create(WorkflowEntity.prototype), data);
@@ -38,7 +46,7 @@ exports.WorkflowEntity = WorkflowEntity;
38
46
  class EnhancedWorkflows extends workflows_1.Workflows {
39
47
  /**
40
48
  * Get workflow by ID. Returns an enhanced response where `workflow` has
41
- * `findNode()` and `getNodesByType()`.
49
+ * `findNode()`, `getNodesByType()`, and `validate()`.
42
50
  */
43
51
  retrieve(workflowID, options) {
44
52
  return super.retrieve(workflowID, options)._thenUnwrap((data) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/lib/workflow.ts"],"names":[],"mappings":";;;AAEA,yDAOgC;AAChC,kCAAiD;AAKjD;;;;;;;;;;;GAWG;AACH,MAAa,cAAc;IACzB,oDAAoD;IACpD,QAAQ,CAEN,MAAc;QAEd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,qEAAqE;IACrE,cAAc,CAA2D,IAAc;QACrF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,IAAuC;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;CACF;AAlBD,wCAkBC;AAOD;;;;GAIG;AACH,MAAa,iBAAkB,SAAQ,qBAAS;IAC9C;;;OAGG;IACM,QAAQ,CACf,UAAkB,EAClB,OAAwB;QAExB,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChE,GAAG,IAAI;YACP,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC7C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,8EAA8E;IACrE,GAAG,CACV,UAAkB,EAClB,MAAyB,EACzB,OAAwB;QAExB,OAAO,IAAA,gBAAU,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,4FAA4F;IACnF,WAAW,CAClB,UAAkB,EAClB,IAA+B,EAC/B,OAAwB;QAExB,OAAO,IAAA,gBAAU,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAChF,CAAC;CACF;AAhCD,8CAgCC"}
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/lib/workflow.ts"],"names":[],"mappings":";;;AAEA,yDAOgC;AAChC,kCAAiD;AACjD,gEAA4D;AAK5D;;;;;;;;;;;GAWG;AACH,MAAa,cAAc;IACzB,oDAAoD;IACpD,QAAQ,CAEN,MAAc;QAEd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,qEAAqE;IACrE,cAAc,CAA2D,IAAc;QACrF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,IAAA,yCAAoB,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,IAAuC;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;CACF;AA1BD,wCA0BC;AAOD;;;;GAIG;AACH,MAAa,iBAAkB,SAAQ,qBAAS;IAC9C;;;OAGG;IACM,QAAQ,CACf,UAAkB,EAClB,OAAwB;QAExB,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChE,GAAG,IAAI;YACP,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC7C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,8EAA8E;IACrE,GAAG,CACV,UAAkB,EAClB,MAAyB,EACzB,OAAwB;QAExB,OAAO,IAAA,gBAAU,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,4FAA4F;IACnF,WAAW,CAClB,UAAkB,EAClB,IAA+B,EAC/B,OAAwB;QAExB,OAAO,IAAA,gBAAU,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAChF,CAAC;CACF;AAhCD,8CAgCC"}
package/lib/workflow.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Workflows, } from "../resources/workflows.mjs";
2
2
  import { enhanceJob } from "./job.mjs";
3
+ import { validateWorkflowFlow } from "./workflow_validator.mjs";
3
4
  /**
4
5
  * Enhanced workflow object with helper methods.
5
6
  * Has all original workflow fields plus `findNode()`, `getNodesByType()`.
@@ -21,6 +22,13 @@ export class WorkflowEntity {
21
22
  getNodesByType(type) {
22
23
  return this.flow.filter((node) => node.type === type);
23
24
  }
25
+ /**
26
+ * Validate the structural integrity of a workflow flow.
27
+ * Throws an `Error` with a human-readable message on the first violation found.
28
+ */
29
+ validate() {
30
+ validateWorkflowFlow(this.flow);
31
+ }
24
32
  /** @internal Create a WorkflowEntity from raw workflow data. */
25
33
  static from(data) {
26
34
  return Object.assign(Object.create(WorkflowEntity.prototype), data);
@@ -34,7 +42,7 @@ export class WorkflowEntity {
34
42
  export class EnhancedWorkflows extends Workflows {
35
43
  /**
36
44
  * Get workflow by ID. Returns an enhanced response where `workflow` has
37
- * `findNode()` and `getNodesByType()`.
45
+ * `findNode()`, `getNodesByType()`, and `validate()`.
38
46
  */
39
47
  retrieve(workflowID, options) {
40
48
  return super.retrieve(workflowID, options)._thenUnwrap((data) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.mjs","sourceRoot":"","sources":["../src/lib/workflow.ts"],"names":[],"mappings":"OAEO,EACL,SAAS,GAMV;OACM,EAAgB,UAAU,EAAE;AAKnC;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,cAAc;IACzB,oDAAoD;IACpD,QAAQ,CAEN,MAAc;QAEd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,qEAAqE;IACrE,cAAc,CAA2D,IAAc;QACrF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,IAAuC;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;CACF;AAOD;;;;GAIG;AACH,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C;;;OAGG;IACM,QAAQ,CACf,UAAkB,EAClB,OAAwB;QAExB,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChE,GAAG,IAAI;YACP,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC7C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,8EAA8E;IACrE,GAAG,CACV,UAAkB,EAClB,MAAyB,EACzB,OAAwB;QAExB,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,4FAA4F;IACnF,WAAW,CAClB,UAAkB,EAClB,IAA+B,EAC/B,OAAwB;QAExB,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAChF,CAAC;CACF"}
1
+ {"version":3,"file":"workflow.mjs","sourceRoot":"","sources":["../src/lib/workflow.ts"],"names":[],"mappings":"OAEO,EACL,SAAS,GAMV;OACM,EAAgB,UAAU,EAAE;OAC5B,EAAE,oBAAoB,EAAE;AAK/B;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,cAAc;IACzB,oDAAoD;IACpD,QAAQ,CAEN,MAAc;QAEd,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,qEAAqE;IACrE,cAAc,CAA2D,IAAc;QACrF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,gEAAgE;IAChE,MAAM,CAAC,IAAI,CAAC,IAAuC;QACjD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;CACF;AAOD;;;;GAIG;AACH,MAAM,OAAO,iBAAkB,SAAQ,SAAS;IAC9C;;;OAGG;IACM,QAAQ,CACf,UAAkB,EAClB,OAAwB;QAExB,OAAO,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAChE,GAAG,IAAI;YACP,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC7C,CAAC,CAAC,CAAC;IACN,CAAC;IAED,8EAA8E;IACrE,GAAG,CACV,UAAkB,EAClB,MAAyB,EACzB,OAAwB;QAExB,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,4FAA4F;IACnF,WAAW,CAClB,UAAkB,EAClB,IAA+B,EAC/B,OAAwB;QAExB,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAChF,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Validates the structural integrity of a workflow flow (array of nodes).
3
+ *
4
+ * Throws an `Error` with a human-readable message on the first violation found.
5
+ *
6
+ * Checks performed:
7
+ * 1. Every node has a non-empty string `id`
8
+ * 2. Node IDs are unique within the flow
9
+ * 3. Every node `type` is a recognized workflow node type
10
+ * 4. Per-type required fields:
11
+ * - custom-model → modelId
12
+ * - workflow → workflowId
13
+ * - logic → logicType
14
+ * - for-each → loopBodyNodeIds (non-empty) OR count (>0)
15
+ * 5. Cross-references all point to node IDs that exist in the flow:
16
+ * - dependsOn entries
17
+ * - input ref.node (excluding "workflow" which is a reserved keyword)
18
+ * - input ref.conditional entries
19
+ * - loopBodyNodeIds entries
20
+ */
21
+ export declare function validateWorkflowFlow(flow: unknown[]): void;
22
+ //# sourceMappingURL=workflow_validator.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_validator.d.mts","sourceRoot":"","sources":["../src/lib/workflow_validator.ts"],"names":[],"mappings":"AAoCA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CA4E1D"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Validates the structural integrity of a workflow flow (array of nodes).
3
+ *
4
+ * Throws an `Error` with a human-readable message on the first violation found.
5
+ *
6
+ * Checks performed:
7
+ * 1. Every node has a non-empty string `id`
8
+ * 2. Node IDs are unique within the flow
9
+ * 3. Every node `type` is a recognized workflow node type
10
+ * 4. Per-type required fields:
11
+ * - custom-model → modelId
12
+ * - workflow → workflowId
13
+ * - logic → logicType
14
+ * - for-each → loopBodyNodeIds (non-empty) OR count (>0)
15
+ * 5. Cross-references all point to node IDs that exist in the flow:
16
+ * - dependsOn entries
17
+ * - input ref.node (excluding "workflow" which is a reserved keyword)
18
+ * - input ref.conditional entries
19
+ * - loopBodyNodeIds entries
20
+ */
21
+ export declare function validateWorkflowFlow(flow: unknown[]): void;
22
+ //# sourceMappingURL=workflow_validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_validator.d.ts","sourceRoot":"","sources":["../src/lib/workflow_validator.ts"],"names":[],"mappings":"AAoCA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CA4E1D"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateWorkflowFlow = validateWorkflowFlow;
4
+ const VALID_NODE_TYPES = new Set([
5
+ 'custom-model',
6
+ 'for-each',
7
+ 'generate-prompt',
8
+ 'list',
9
+ 'logic',
10
+ 'model',
11
+ 'remove-background',
12
+ 'transform',
13
+ 'user-approval',
14
+ 'workflow',
15
+ ]);
16
+ /**
17
+ * Validates the structural integrity of a workflow flow (array of nodes).
18
+ *
19
+ * Throws an `Error` with a human-readable message on the first violation found.
20
+ *
21
+ * Checks performed:
22
+ * 1. Every node has a non-empty string `id`
23
+ * 2. Node IDs are unique within the flow
24
+ * 3. Every node `type` is a recognized workflow node type
25
+ * 4. Per-type required fields:
26
+ * - custom-model → modelId
27
+ * - workflow → workflowId
28
+ * - logic → logicType
29
+ * - for-each → loopBodyNodeIds (non-empty) OR count (>0)
30
+ * 5. Cross-references all point to node IDs that exist in the flow:
31
+ * - dependsOn entries
32
+ * - input ref.node (excluding "workflow" which is a reserved keyword)
33
+ * - input ref.conditional entries
34
+ * - loopBodyNodeIds entries
35
+ */
36
+ function validateWorkflowFlow(flow) {
37
+ const nodeIds = new Set();
38
+ const firstSeenAt = new Map();
39
+ // Pass 1 — per-node checks (ID, type, required fields)
40
+ for (let i = 0; i < flow.length; i++) {
41
+ const node = flow[i];
42
+ if (typeof node.id !== 'string' || !node.id) {
43
+ throw new Error(`Node at index ${i} is missing an "id" field`);
44
+ }
45
+ if (nodeIds.has(node.id)) {
46
+ throw new Error(`Duplicate node id "${node.id}" at index ${i} (first seen at index ${firstSeenAt.get(node.id)})`);
47
+ }
48
+ nodeIds.add(node.id);
49
+ firstSeenAt.set(node.id, i);
50
+ const label = `"${node.id}"`;
51
+ if (typeof node.type !== 'string' || !VALID_NODE_TYPES.has(node.type)) {
52
+ throw new Error(`Node ${label} has invalid type "${node.type}". Valid types are: ${[...VALID_NODE_TYPES].join(', ')}`);
53
+ }
54
+ const type = node.type;
55
+ if (type === 'custom-model' && !node.modelId) {
56
+ throw new Error(`Node ${label} (custom-model) is missing required field "modelId"`);
57
+ }
58
+ if (type === 'workflow' && !node.workflowId) {
59
+ throw new Error(`Node ${label} (workflow) is missing required field "workflowId"`);
60
+ }
61
+ if (type === 'logic' && !node.logicType) {
62
+ throw new Error(`Node ${label} (logic) is missing required field "logicType"`);
63
+ }
64
+ if (type === 'for-each') {
65
+ const hasLoopBody = Array.isArray(node.loopBodyNodeIds) && node.loopBodyNodeIds.length > 0;
66
+ const hasCount = typeof node.count === 'number' && node.count > 0;
67
+ if (!hasLoopBody && !hasCount) {
68
+ throw new Error(`Node ${label} (for-each) requires either "loopBodyNodeIds" (non-empty array) or "count" (positive number)`);
69
+ }
70
+ }
71
+ }
72
+ // Pass 2 — cross-reference checks (all node IDs are now collected)
73
+ for (const rawNode of flow) {
74
+ const node = rawNode;
75
+ const nodeId = node.id;
76
+ if (Array.isArray(node.dependsOn)) {
77
+ for (const depId of node.dependsOn) {
78
+ if (typeof depId === 'string' && !nodeIds.has(depId)) {
79
+ throw new Error(`Node "${nodeId}" dependsOn unknown node "${depId}"`);
80
+ }
81
+ }
82
+ }
83
+ if (Array.isArray(node.inputs)) {
84
+ for (const input of node.inputs) {
85
+ validateInputRefs(nodeId, input, nodeIds);
86
+ }
87
+ }
88
+ if (Array.isArray(node.loopBodyNodeIds)) {
89
+ for (const bodyId of node.loopBodyNodeIds) {
90
+ if (typeof bodyId === 'string' && !nodeIds.has(bodyId)) {
91
+ throw new Error(`Node "${nodeId}" loopBodyNodeIds references unknown node "${bodyId}"`);
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ function validateInputRefs(nodeId, input, nodeIds) {
98
+ const inputName = typeof input.name === 'string' && input.name ? input.name : '(unnamed)';
99
+ if (input.ref) {
100
+ const { node: refNode, conditional } = input.ref;
101
+ // "workflow" is a reserved keyword meaning "take from the workflow's own inputs"
102
+ if (typeof refNode === 'string' && refNode !== 'workflow' && !nodeIds.has(refNode)) {
103
+ throw new Error(`Node "${nodeId}" input "${inputName}" references unknown node "${refNode}"`);
104
+ }
105
+ if (Array.isArray(conditional)) {
106
+ for (const condId of conditional) {
107
+ if (typeof condId === 'string' && !nodeIds.has(condId)) {
108
+ throw new Error(`Node "${nodeId}" input "${inputName}" has a conditional ref pointing to unknown node "${condId}"`);
109
+ }
110
+ }
111
+ }
112
+ }
113
+ // Recurse into INPUTS_ARRAY sub-inputs
114
+ if (Array.isArray(input.items)) {
115
+ for (const item of input.items) {
116
+ if (Array.isArray(item)) {
117
+ for (const subInput of item) {
118
+ validateInputRefs(nodeId, subInput, nodeIds);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ //# sourceMappingURL=workflow_validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_validator.js","sourceRoot":"","sources":["../src/lib/workflow_validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ const VALID_NODE_TYPES = new Set([
2
+ 'custom-model',
3
+ 'for-each',
4
+ 'generate-prompt',
5
+ 'list',
6
+ 'logic',
7
+ 'model',
8
+ 'remove-background',
9
+ 'transform',
10
+ 'user-approval',
11
+ 'workflow',
12
+ ]);
13
+ /**
14
+ * Validates the structural integrity of a workflow flow (array of nodes).
15
+ *
16
+ * Throws an `Error` with a human-readable message on the first violation found.
17
+ *
18
+ * Checks performed:
19
+ * 1. Every node has a non-empty string `id`
20
+ * 2. Node IDs are unique within the flow
21
+ * 3. Every node `type` is a recognized workflow node type
22
+ * 4. Per-type required fields:
23
+ * - custom-model → modelId
24
+ * - workflow → workflowId
25
+ * - logic → logicType
26
+ * - for-each → loopBodyNodeIds (non-empty) OR count (>0)
27
+ * 5. Cross-references all point to node IDs that exist in the flow:
28
+ * - dependsOn entries
29
+ * - input ref.node (excluding "workflow" which is a reserved keyword)
30
+ * - input ref.conditional entries
31
+ * - loopBodyNodeIds entries
32
+ */
33
+ export function validateWorkflowFlow(flow) {
34
+ const nodeIds = new Set();
35
+ const firstSeenAt = new Map();
36
+ // Pass 1 — per-node checks (ID, type, required fields)
37
+ for (let i = 0; i < flow.length; i++) {
38
+ const node = flow[i];
39
+ if (typeof node.id !== 'string' || !node.id) {
40
+ throw new Error(`Node at index ${i} is missing an "id" field`);
41
+ }
42
+ if (nodeIds.has(node.id)) {
43
+ throw new Error(`Duplicate node id "${node.id}" at index ${i} (first seen at index ${firstSeenAt.get(node.id)})`);
44
+ }
45
+ nodeIds.add(node.id);
46
+ firstSeenAt.set(node.id, i);
47
+ const label = `"${node.id}"`;
48
+ if (typeof node.type !== 'string' || !VALID_NODE_TYPES.has(node.type)) {
49
+ throw new Error(`Node ${label} has invalid type "${node.type}". Valid types are: ${[...VALID_NODE_TYPES].join(', ')}`);
50
+ }
51
+ const type = node.type;
52
+ if (type === 'custom-model' && !node.modelId) {
53
+ throw new Error(`Node ${label} (custom-model) is missing required field "modelId"`);
54
+ }
55
+ if (type === 'workflow' && !node.workflowId) {
56
+ throw new Error(`Node ${label} (workflow) is missing required field "workflowId"`);
57
+ }
58
+ if (type === 'logic' && !node.logicType) {
59
+ throw new Error(`Node ${label} (logic) is missing required field "logicType"`);
60
+ }
61
+ if (type === 'for-each') {
62
+ const hasLoopBody = Array.isArray(node.loopBodyNodeIds) && node.loopBodyNodeIds.length > 0;
63
+ const hasCount = typeof node.count === 'number' && node.count > 0;
64
+ if (!hasLoopBody && !hasCount) {
65
+ throw new Error(`Node ${label} (for-each) requires either "loopBodyNodeIds" (non-empty array) or "count" (positive number)`);
66
+ }
67
+ }
68
+ }
69
+ // Pass 2 — cross-reference checks (all node IDs are now collected)
70
+ for (const rawNode of flow) {
71
+ const node = rawNode;
72
+ const nodeId = node.id;
73
+ if (Array.isArray(node.dependsOn)) {
74
+ for (const depId of node.dependsOn) {
75
+ if (typeof depId === 'string' && !nodeIds.has(depId)) {
76
+ throw new Error(`Node "${nodeId}" dependsOn unknown node "${depId}"`);
77
+ }
78
+ }
79
+ }
80
+ if (Array.isArray(node.inputs)) {
81
+ for (const input of node.inputs) {
82
+ validateInputRefs(nodeId, input, nodeIds);
83
+ }
84
+ }
85
+ if (Array.isArray(node.loopBodyNodeIds)) {
86
+ for (const bodyId of node.loopBodyNodeIds) {
87
+ if (typeof bodyId === 'string' && !nodeIds.has(bodyId)) {
88
+ throw new Error(`Node "${nodeId}" loopBodyNodeIds references unknown node "${bodyId}"`);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ function validateInputRefs(nodeId, input, nodeIds) {
95
+ const inputName = typeof input.name === 'string' && input.name ? input.name : '(unnamed)';
96
+ if (input.ref) {
97
+ const { node: refNode, conditional } = input.ref;
98
+ // "workflow" is a reserved keyword meaning "take from the workflow's own inputs"
99
+ if (typeof refNode === 'string' && refNode !== 'workflow' && !nodeIds.has(refNode)) {
100
+ throw new Error(`Node "${nodeId}" input "${inputName}" references unknown node "${refNode}"`);
101
+ }
102
+ if (Array.isArray(conditional)) {
103
+ for (const condId of conditional) {
104
+ if (typeof condId === 'string' && !nodeIds.has(condId)) {
105
+ throw new Error(`Node "${nodeId}" input "${inputName}" has a conditional ref pointing to unknown node "${condId}"`);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ // Recurse into INPUTS_ARRAY sub-inputs
111
+ if (Array.isArray(input.items)) {
112
+ for (const item of input.items) {
113
+ if (Array.isArray(item)) {
114
+ for (const subInput of item) {
115
+ validateInputRefs(nodeId, subInput, nodeIds);
116
+ }
117
+ }
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=workflow_validator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_validator.mjs","sourceRoot":"","sources":["../src/lib/workflow_validator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scenario-labs/sdk",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "The official TypeScript library for the Scenario API",
5
5
  "author": "Scenario <support@scenario.com>",
6
6
  "types": "./index.d.ts",
@@ -27,7 +27,7 @@ export declare class Assets extends APIResource {
27
27
  /**
28
28
  * Delete multiple assets
29
29
  */
30
- deleteMultiple(options?: RequestOptions): APIPromise<unknown>;
30
+ deleteMultiple(body: AssetDeleteMultipleParams, options?: RequestOptions): APIPromise<unknown>;
31
31
  /**
32
32
  * Duplicate an asset
33
33
  */
@@ -6570,7 +6570,7 @@ export interface AssetListParams {
6570
6570
  * img2img, txt2video, uploaded, uploaded-video, uploaded-audio, uploaded-3d,
6571
6571
  * uploaded-avatar, upscale-video
6572
6572
  */
6573
- types?: string;
6573
+ types?: 'inference-txt2img' | 'inference-txt2img-ip-adapter' | 'inference-txt2img-texture' | 'inference-img2img' | 'inference-img2img-ip-adapter' | 'inference-img2img-texture' | 'inference-inpaint' | 'inference-inpaint-ip-adapter' | 'inference-reference' | 'inference-reference-texture' | 'inference-controlnet' | 'inference-controlnet-ip-adapter' | 'inference-controlnet-img2img' | 'inference-controlnet-reference' | 'inference-controlnet-inpaint' | 'inference-controlnet-inpaint-ip-adapter' | 'inference-controlnet-texture' | 'background-removal' | 'canvas' | 'canvas-export' | 'canvas-drawing' | 'detection' | 'patch' | 'pixelization' | 'upscale' | 'upscale-texture' | 'upscale-skybox' | 'vectorization' | 'segment' | 'segmentation-image' | 'segmentation-mask' | 'skybox-base-360' | 'skybox-hdri' | 'skybox-3d' | 'restyle' | 'reframe' | 'generative-fill' | 'texture' | 'texture-height' | 'texture-normal' | 'texture-smoothness' | 'texture-metallic' | 'texture-edge' | 'texture-ao' | 'texture-albedo' | 'image-prompt-editing' | 'unknown' | 'img23d' | 'txt23d' | 'video23d' | '3d23d' | '3d23d-texture' | '3d-texture' | '3d-texture-mtl' | '3d-texture-albedo' | '3d-texture-normal' | '3d-texture-roughness' | '3d-texture-metallic' | 'img2video' | 'txt2audio' | 'audio2audio' | 'voice-clone' | 'video2video' | 'video2img' | 'txt2img' | 'img2img' | 'txt2video' | 'uploaded' | 'uploaded-video' | 'uploaded-audio' | 'uploaded-3d' | 'uploaded-avatar' | 'upscale-video';
6574
6574
  /**
6575
6575
  * Filter results to only return assets updated after the specified ISO string date
6576
6576
  * (exclusive). Requires the sortBy parameter to be "updatedAt"
@@ -6582,6 +6582,12 @@ export interface AssetListParams {
6582
6582
  */
6583
6583
  updatedBefore?: string;
6584
6584
  }
6585
+ export interface AssetDeleteMultipleParams {
6586
+ /**
6587
+ * The ids of the assets to delete. (Max 100 at once)
6588
+ */
6589
+ assetIds: Array<string>;
6590
+ }
6585
6591
  export interface AssetDuplicateParams {
6586
6592
  /**
6587
6593
  * Query param: If set to true, returns the original asset without transformation
@@ -6695,7 +6701,7 @@ export interface AssetUploadParams {
6695
6701
  thumbnail?: string;
6696
6702
  }
6697
6703
  export declare namespace Assets {
6698
- export { type AssetRetrieveResponse as AssetRetrieveResponse, type AssetUpdateResponse as AssetUpdateResponse, type AssetListResponse as AssetListResponse, type AssetDeleteMultipleResponse as AssetDeleteMultipleResponse, type AssetDuplicateResponse as AssetDuplicateResponse, type AssetGetBulkResponse as AssetGetBulkResponse, type AssetListSnapshotsResponse as AssetListSnapshotsResponse, type AssetLockResponse as AssetLockResponse, type AssetUnlockResponse as AssetUnlockResponse, type AssetUpdateTagsResponse as AssetUpdateTagsResponse, type AssetUploadResponse as AssetUploadResponse, type AssetRetrieveParams as AssetRetrieveParams, type AssetUpdateParams as AssetUpdateParams, type AssetListParams as AssetListParams, type AssetDuplicateParams as AssetDuplicateParams, type AssetGetBulkParams as AssetGetBulkParams, type AssetListSnapshotsParams as AssetListSnapshotsParams, type AssetLockParams as AssetLockParams, type AssetUnlockParams as AssetUnlockParams, type AssetUpdateTagsParams as AssetUpdateTagsParams, type AssetUploadParams as AssetUploadParams, };
6704
+ export { type AssetRetrieveResponse as AssetRetrieveResponse, type AssetUpdateResponse as AssetUpdateResponse, type AssetListResponse as AssetListResponse, type AssetDeleteMultipleResponse as AssetDeleteMultipleResponse, type AssetDuplicateResponse as AssetDuplicateResponse, type AssetGetBulkResponse as AssetGetBulkResponse, type AssetListSnapshotsResponse as AssetListSnapshotsResponse, type AssetLockResponse as AssetLockResponse, type AssetUnlockResponse as AssetUnlockResponse, type AssetUpdateTagsResponse as AssetUpdateTagsResponse, type AssetUploadResponse as AssetUploadResponse, type AssetRetrieveParams as AssetRetrieveParams, type AssetUpdateParams as AssetUpdateParams, type AssetListParams as AssetListParams, type AssetDeleteMultipleParams as AssetDeleteMultipleParams, type AssetDuplicateParams as AssetDuplicateParams, type AssetGetBulkParams as AssetGetBulkParams, type AssetListSnapshotsParams as AssetListSnapshotsParams, type AssetLockParams as AssetLockParams, type AssetUnlockParams as AssetUnlockParams, type AssetUpdateTagsParams as AssetUpdateTagsParams, type AssetUploadParams as AssetUploadParams, };
6699
6705
  export { Download as Download, type DownloadGetStatusResponse as DownloadGetStatusResponse, type DownloadRequestResponse as DownloadRequestResponse, type DownloadRequestBatchResponse as DownloadRequestBatchResponse, type DownloadRequestParams as DownloadRequestParams, type DownloadRequestBatchParams as DownloadRequestBatchParams, };
6700
6706
  export { Public as Public, type PublicRetrieveResponse as PublicRetrieveResponse, type PublicListResponse as PublicListResponse, type PublicListParams as PublicListParams, };
6701
6707
  }