@oomol-lab/open-flow 0.1.0-beta.81 → 0.1.0-beta.83

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 (52) hide show
  1. package/README.md +35 -0
  2. package/dist/browser/{FlowCanvas-CrsiDHK8.js → FlowCanvas-ChbukrDh.js} +879 -535
  3. package/dist/browser/{createResourceDialog-CS3u9ga9.js → createResourceDialog-Bi4fUnbD.js} +5 -4
  4. package/dist/browser/{dialog-CFlvkliO.js → dialog-BzoSxhXQ.js} +1 -1
  5. package/dist/browser/{exportPng-BOPfjeEi.js → exportPng-CrAFfOaD.js} +187 -70
  6. package/dist/browser/{flowChanges-CFj5pL4Y.js → flowChanges-C567g-Pc.js} +2675 -93
  7. package/dist/browser/{flowWorkspace-BeQaeJ3e.js → flowWorkspace-rvcneG4q.js} +980 -2621
  8. package/dist/browser/licenses.md +2 -2
  9. package/dist/browser/{markdownContent-frwDfQQU.js → markdownContent-B-GLj5DU.js} +18 -40
  10. package/dist/browser/{markdownContent-CAG_CQfH.js → markdownContent-D8G_oNOe.js} +18 -41
  11. package/dist/browser/preview.css +125 -80
  12. package/dist/browser/preview.js +1093 -379
  13. package/dist/browser/{tooltip-BDcVTNpu.js → tooltip-DGj5pudg.js} +1 -1
  14. package/dist/browser/ui.css +45 -0
  15. package/dist/browser/{dist-CHwj9BhV.js → videoLink-NAWDmBtf.js} +35 -1
  16. package/dist/browser/workbench-contract.d.ts +6 -0
  17. package/dist/browser/workbench.css +296 -251
  18. package/dist/browser/workbench.d.ts +2 -0
  19. package/dist/browser/workbench.js +294 -141
  20. package/dist/browser/{workbenchSelect-Ci0KCYv9.js → workbenchSelect-BIaEVTx6.js} +2 -2
  21. package/dist/browser/{ContentIcon-CMn0c-kl.js → wrapLayout-C4moMKgb.js} +4400 -4148
  22. package/dist/command/index.js +43 -41
  23. package/dist/common/authoring.d.ts +1 -1
  24. package/dist/common/control-api-conformance.js +306 -2
  25. package/dist/common/control-api.d.ts +20 -0
  26. package/dist/common/control-api.js +306 -4
  27. package/dist/common/control-requests.d.ts +3 -5
  28. package/dist/common/control-requests.js +5 -7
  29. package/dist/common/flow-encoding.d.ts +1 -0
  30. package/dist/common/flow-encoding.js +167 -1
  31. package/dist/common/flow-semantics.js +20 -0
  32. package/dist/common/flow-workflowBundle.d.ts +27 -0
  33. package/dist/common/flow-workflowFile.d.ts +2 -0
  34. package/dist/common/flow-workflowReferences.d.ts +4 -0
  35. package/dist/common/mcp.d.ts +2 -0
  36. package/dist/common/mcp.js +312 -4
  37. package/dist/render/browser/licenses.md +4047 -0
  38. package/dist/render/browser/runtime.css +14914 -0
  39. package/dist/render/browser/runtime.js +267526 -0
  40. package/dist/render/common/png.d.ts +32 -0
  41. package/dist/render/node/index.d.ts +11 -0
  42. package/dist/render/node/index.js +9508 -0
  43. package/dist/render/node/licenses.md +75 -0
  44. package/package.json +12 -2
  45. package/src/control/common/api.ts +50 -0
  46. package/src/control/common/flowDecoders.ts +2 -0
  47. package/src/control/common/mcp.ts +4 -4
  48. package/src/control/common/requests.ts +12 -1
  49. package/src/flow/common/encoding.ts +1 -0
  50. package/src/flow/common/workflowBundle.ts +117 -0
  51. package/src/flow/common/workflowFile.ts +4 -0
  52. package/src/flow/common/workflowReferences.ts +20 -0
@@ -82,6 +82,7 @@ export declare function authoringNode(content: RevisionContent, ref: string): {
82
82
  })[];
83
83
  };
84
84
  export declare function readAuthoring(content: RevisionContent, query?: AuthoringRead): {
85
+ nodes?: undefined;
85
86
  text: {
86
87
  node: string;
87
88
  field: "code" | "prompt";
@@ -92,7 +93,6 @@ export declare function readAuthoring(content: RevisionContent, query?: Authorin
92
93
  nextStart?: number | undefined;
93
94
  truncated: boolean;
94
95
  };
95
- nodes?: undefined;
96
96
  edges?: undefined;
97
97
  } | {
98
98
  text?: undefined;
@@ -9474,6 +9474,27 @@ function assertDocumentHttpAuthBindings(content) {
9474
9474
  for (const graphNode of Object.values(content.graph.nodes)) if (graphNode.kind == "task" && "executor" in graphNode.task && ["openapi", "http-request"].includes(graphNode.task.executor.kind)) assertHttpAuthBindings(graphNode.inputs);
9475
9475
  }
9476
9476
  //#endregion
9477
+ //#region src/flow/common/condition.ts
9478
+ function clearConditionBinding(operand) {
9479
+ return operand.kind == "source" && operand.source.kind == "binding" ? { kind: "value" } : operand;
9480
+ }
9481
+ function clearConditionBindings(node) {
9482
+ return {
9483
+ ...node,
9484
+ cases: node.cases.map((item) => ({
9485
+ ...item,
9486
+ groups: item.groups.map((group) => ({
9487
+ ...group,
9488
+ expressions: group.expressions.map((expression) => ({
9489
+ ...expression,
9490
+ left: clearConditionBinding(expression.left),
9491
+ ...expression.right == null ? {} : { right: clearConditionBinding(expression.right) }
9492
+ }))
9493
+ }))
9494
+ }))
9495
+ };
9496
+ }
9497
+ //#endregion
9477
9498
  //#region src/flow/common/change.ts
9478
9499
  /** Lossless upgrade of readable content. Historical content and its encoding stay unchanged. */
9479
9500
  function upgradeRevisionContent(content) {
@@ -9582,6 +9603,31 @@ function findEngineContract(contract) {
9582
9603
  };
9583
9604
  }
9584
9605
  //#endregion
9606
+ //#region src/flow/common/workflowReferences.ts
9607
+ /** Workflow declarations share discovery across authoring, admission and resource indexing. */
9608
+ function nodeWorkflowReferences(node) {
9609
+ if (node.kind != "task") return [];
9610
+ if ("moduleId" in node.task) return (node.task.capabilities ?? []).flatMap((item, index) => item.kind == "workflow" ? [{
9611
+ target: item,
9612
+ path: `task/capabilities/${index}`,
9613
+ tool: item.name
9614
+ }] : []);
9615
+ if (node.task.executor.kind == "workflow") return [{
9616
+ target: {
9617
+ ...node.task.executor,
9618
+ inputs: node.task.inputs.filter((port) => "handle" in port),
9619
+ outputs: node.task.outputs.filter((port) => "handle" in port)
9620
+ },
9621
+ path: "task/executor"
9622
+ }];
9623
+ if (node.task.executor.kind == "agent") return node.task.executor.tools.flatMap((item, index) => item.kind == "workflow" ? [{
9624
+ target: item,
9625
+ path: `task/executor/tools/${index}`,
9626
+ tool: item.name
9627
+ }] : []);
9628
+ return [];
9629
+ }
9630
+ //#endregion
9585
9631
  //#region src/workflow/common/workflow.ts
9586
9632
  var portSchema = object({
9587
9633
  handle: string$1().min(1),
@@ -10495,12 +10541,12 @@ function decodeLiveDetails(value) {
10495
10541
  publication: current,
10496
10542
  status,
10497
10543
  enabled: source.enabled,
10498
- entries: decodeEntries(source.entries, current),
10544
+ entries: decodeEntries$1(source.entries, current),
10499
10545
  version: 1
10500
10546
  };
10501
10547
  }
10502
10548
  /** Both producers and consumers enforce the same published-entry invariants. */
10503
- function decodeEntries(values, current) {
10549
+ function decodeEntries$1(values, current) {
10504
10550
  const parsed = array(entrySchema).safeParse(values);
10505
10551
  if (!parsed.success) return invalidResponse();
10506
10552
  const ids = /* @__PURE__ */ new Set();
@@ -10547,11 +10593,109 @@ function providerIconAppearance(metadata, position) {
10547
10593
  };
10548
10594
  }
10549
10595
  //#endregion
10596
+ //#region src/trigger/common/config.ts
10597
+ /** Deployment-bound selections owned by the Trigger configuration contract. */
10598
+ function clearTriggerExternalConfig(key, config) {
10599
+ const fields = key == "jira.on_issue_event" || key == "intercom.on_conversation_event" || key == "sentry.on_issue_alert" || key == "zoom.on_recording_ready" || key == "fireflies.on_meeting_ready" ? ["sourceId", "eventTypes"] : key == "slackbot.on_event" ? [
10600
+ "sourceId",
10601
+ "eventTypes",
10602
+ "channelIds"
10603
+ ] : key == "feishu_app_bot.on_event" ? [
10604
+ "sourceId",
10605
+ "eventTypes",
10606
+ "resource",
10607
+ "chatIds"
10608
+ ] : key == "linear.on_issue_changed" ? ["teamId", "stateIds"] : [];
10609
+ return {
10610
+ ...config,
10611
+ ...Object.fromEntries(fields.map((field) => [field, { kind: "unset" }]))
10612
+ };
10613
+ }
10614
+ //#endregion
10615
+ //#region src/flow/common/connectionUsage.ts
10616
+ function clearNodeConnections(graph, connectionId) {
10617
+ return {
10618
+ ...graph,
10619
+ nodes: Object.fromEntries(Object.entries(graph.nodes).map(([id, node]) => {
10620
+ if ((node.kind == "poll" || node.kind == "integration") && (connectionId == null || node.connectionId == connectionId)) {
10621
+ const { connectionId: _, ...remaining } = node;
10622
+ return [id, remaining];
10623
+ }
10624
+ if (node.kind != "task") return [id, node];
10625
+ if ("executor" in node.task) {
10626
+ const executor = node.task.executor;
10627
+ const clear = (value) => {
10628
+ if (value.connectionId === "") return value;
10629
+ if (connectionId != null && value.connectionId != connectionId) return value;
10630
+ const { connectionId: _, ...rest } = value;
10631
+ return rest;
10632
+ };
10633
+ if (executor.kind == "connector") return [id, {
10634
+ ...node,
10635
+ task: {
10636
+ ...node.task,
10637
+ executor: clear(executor)
10638
+ }
10639
+ }];
10640
+ if (executor.kind == "agent") return [id, {
10641
+ ...node,
10642
+ task: {
10643
+ ...node.task,
10644
+ executor: {
10645
+ ...executor,
10646
+ tools: executor.tools.map(clear),
10647
+ ...executor.notification == null ? {} : { notification: clear(executor.notification) }
10648
+ }
10649
+ }
10650
+ }];
10651
+ return [id, node];
10652
+ }
10653
+ const capabilities = node.task.capabilities?.map((capability) => {
10654
+ if (capability.kind == "workflow" || capability.kind == "http") return capability;
10655
+ if (!("mode" in capability)) {
10656
+ if ("action" in capability) {
10657
+ const { connectionId: selected, ...rest } = capability;
10658
+ return {
10659
+ ...rest,
10660
+ connections: capability.connections.filter((item) => connectionId != null && item.connectionId != connectionId),
10661
+ ...selected != null && connectionId != null && selected != connectionId ? { connectionId: selected } : {}
10662
+ };
10663
+ }
10664
+ return {
10665
+ ...capability,
10666
+ ...connectionId == null && (capability.connectionHints?.length ?? 0) > 0 ? { actionHints: [.../* @__PURE__ */ new Set([...capability.actionHints ?? [], ...capability.connectionHints.map((hint) => hint.action)])] } : {},
10667
+ ...capability.connectionHints == null ? {} : { connectionHints: capability.connectionHints.filter((item) => connectionId != null && item.connectionId != connectionId) }
10668
+ };
10669
+ }
10670
+ if (capability.mode != "independent") return capability;
10671
+ return {
10672
+ ...capability,
10673
+ actions: capability.actions.map((action) => {
10674
+ if (action.connectionId === "") return action;
10675
+ if (connectionId != null && action.connectionId != connectionId) return action;
10676
+ const { connectionId: _, ...remaining } = action;
10677
+ return remaining;
10678
+ })
10679
+ };
10680
+ });
10681
+ return [id, capabilities == null ? node : {
10682
+ ...node,
10683
+ task: {
10684
+ ...node.task,
10685
+ capabilities
10686
+ }
10687
+ }];
10688
+ }))
10689
+ };
10690
+ }
10691
+ //#endregion
10550
10692
  //#region src/flow/common/workflowFile.ts
10551
10693
  var envelope = strictObject({
10552
10694
  kind: literal("open-flow-workflow"),
10553
10695
  version: literal(1),
10554
10696
  name: string$1().optional(),
10697
+ icon: string$1().optional(),
10698
+ description: string$1().optional(),
10555
10699
  content: unknown(),
10556
10700
  presentation: record$3(string$1(), json$4()).optional()
10557
10701
  });
@@ -10564,6 +10708,126 @@ function decodeWorkflowFile(value) {
10564
10708
  content: decodeRevisionContent(file.content)
10565
10709
  };
10566
10710
  }
10711
+ function cleanInput(input) {
10712
+ if (input.kind != "sources" || !input.sources.some((source) => source.kind == "binding")) return input;
10713
+ const sources = input.sources.filter((source) => source.kind != "binding");
10714
+ return sources.length == 0 ? { kind: "unset" } : {
10715
+ kind: "sources",
10716
+ sources
10717
+ };
10718
+ }
10719
+ /** Clear only owned structured references, never strings in code or business values. */
10720
+ function cleanWorkflowFile(value) {
10721
+ const file = decodeWorkflowFile(value);
10722
+ const original = file.content.document.graph;
10723
+ const graph = clearNodeConnections(original);
10724
+ const nodes = Object.fromEntries(Object.entries(graph.nodes).map(([id, source]) => {
10725
+ let node = source;
10726
+ if ("inputs" in node) node = {
10727
+ ...node,
10728
+ inputs: Object.fromEntries(Object.entries(node.inputs).map(([key, input]) => [key, cleanInput(input)]))
10729
+ };
10730
+ if (node.kind == "outputs") node = {
10731
+ ...node,
10732
+ outputMappings: Object.fromEntries(Object.entries(node.outputMappings).map(([key, input]) => [key, cleanInput(input)]))
10733
+ };
10734
+ if (node.kind == "condition") node = clearConditionBindings(node);
10735
+ if (node.kind == "error" && node.sourceFlowIds != null) node = {
10736
+ ...node,
10737
+ sourceFlowIds: []
10738
+ };
10739
+ if (node.kind == "poll" || node.kind == "integration") node = {
10740
+ ...node,
10741
+ config: clearTriggerExternalConfig(node.definition.key, node.config)
10742
+ };
10743
+ return [id, node];
10744
+ }));
10745
+ return {
10746
+ file: {
10747
+ ...file,
10748
+ content: {
10749
+ ...file.content,
10750
+ document: {
10751
+ ...file.content.document,
10752
+ bindings: {},
10753
+ graph: {
10754
+ ...graph,
10755
+ nodes
10756
+ }
10757
+ }
10758
+ }
10759
+ },
10760
+ summary: {
10761
+ changedNodeIds: Object.keys(nodes).filter((id) => !dequal(nodes[id], original.nodes[id])),
10762
+ removedBindings: Object.keys(file.content.document.bindings).length
10763
+ }
10764
+ };
10765
+ }
10766
+ //#endregion
10767
+ //#region src/flow/common/workflowBundle.ts
10768
+ var entries = array(strictObject({
10769
+ flowId: string$1().min(1),
10770
+ file: unknown()
10771
+ })).min(1);
10772
+ var bundleSchema = strictObject({
10773
+ kind: literal("open-flow-workflow-bundle"),
10774
+ version: literal(1),
10775
+ entryFlowId: string$1().min(1),
10776
+ workflows: entries
10777
+ });
10778
+ var previewSchema = strictObject({
10779
+ version: literal(1),
10780
+ entryFlowId: string$1().min(1),
10781
+ workflows: entries,
10782
+ unavailableFlowIds: array(string$1().min(1))
10783
+ });
10784
+ function decodeEntries(value, entryFlowId, unavailableFlowIds = []) {
10785
+ const workflows = value.map(({ flowId, file }) => ({
10786
+ flowId,
10787
+ file: decodeWorkflowFile(file)
10788
+ }));
10789
+ const ids = new Set(workflows.map(({ flowId }) => flowId));
10790
+ if (ids.size != workflows.length || !ids.has(entryFlowId)) throw new TypeError("Workflow identities must be unique and include the entry workflow.");
10791
+ const unavailable = new Set(unavailableFlowIds);
10792
+ if (unavailable.size != unavailableFlowIds.length || unavailableFlowIds.some((id) => ids.has(id))) throw new TypeError("Invalid unavailable workflow identities.");
10793
+ for (const { file } of workflows) for (const node of Object.values(file.content.document.graph.nodes)) for (const { target } of nodeWorkflowReferences(node)) if (target.flowId && !ids.has(target.flowId) && !unavailable.has(target.flowId)) throw new TypeError("A referenced workflow is missing from the bundle.");
10794
+ return workflows;
10795
+ }
10796
+ function decodeWorkflowBundle(value) {
10797
+ checkJsonDepth(value, -4);
10798
+ const bundle = bundleSchema.parse(value);
10799
+ return {
10800
+ ...bundle,
10801
+ workflows: decodeEntries(bundle.workflows, bundle.entryFlowId)
10802
+ };
10803
+ }
10804
+ function decodeWorkflowExportPreview(value) {
10805
+ checkJsonDepth(value, -4);
10806
+ const preview = previewSchema.parse(value);
10807
+ return {
10808
+ ...preview,
10809
+ workflows: decodeEntries(preview.workflows, preview.entryFlowId, preview.unavailableFlowIds)
10810
+ };
10811
+ }
10812
+ function cleanWorkflowBundle(value) {
10813
+ const bundle = decodeWorkflowBundle(value);
10814
+ return {
10815
+ ...bundle,
10816
+ workflows: bundle.workflows.map(({ flowId, file }) => ({
10817
+ flowId,
10818
+ file: cleanWorkflowFile(file).file
10819
+ }))
10820
+ };
10821
+ }
10822
+ function workflowBundleFromPreview(preview) {
10823
+ if (preview.unavailableFlowIds.length) throw new TypeError("Some referenced workflows are unavailable.");
10824
+ return cleanWorkflowBundle({
10825
+ kind: "open-flow-workflow-bundle",
10826
+ version: 1,
10827
+ entryFlowId: preview.entryFlowId,
10828
+ workflows: preview.workflows
10829
+ });
10830
+ }
10567
10831
  new TextEncoder();
10568
10832
  //#endregion
10569
10833
  //#region src/control/common/providerAccess.ts
@@ -11308,6 +11572,8 @@ function flow(value) {
11308
11572
  resourceReferences: resourceReferences(source.resourceReferences),
11309
11573
  flowId: string(source.flowId),
11310
11574
  name: string(source.name),
11575
+ ...source.icon === void 0 ? {} : { icon: string(source.icon) },
11576
+ ...source.description === void 0 ? {} : { description: string(source.description) },
11311
11577
  status,
11312
11578
  updatedAt: string(source.updatedAt),
11313
11579
  version: 1
@@ -11794,6 +12060,18 @@ function decodeTagListItem(value) {
11794
12060
  }
11795
12061
  //#endregion
11796
12062
  //#region src/control/common/api.ts
12063
+ function decodeWorkflowBundleImportResult(value) {
12064
+ const source = record$1(value);
12065
+ if (source.version != 1 || !Array.isArray(source.flows) || source.flows.length == 0) return invalidResponse();
12066
+ const entry = flow(source.flow);
12067
+ const flows = source.flows.map(flow);
12068
+ if (new Set(flows.map((item) => item.flowId)).size != flows.length || !flows.some((item) => item.flowId == entry.flowId)) return invalidResponse();
12069
+ return {
12070
+ version: 1,
12071
+ flow: entry,
12072
+ flows
12073
+ };
12074
+ }
11797
12075
  function decodeRunEvent(value) {
11798
12076
  const source = record$1(value);
11799
12077
  const sequence = integer(source.sequence);
@@ -12108,6 +12386,32 @@ var ControlClient = class {
12108
12386
  return invalidResponse();
12109
12387
  }
12110
12388
  }
12389
+ async getFlowExportPreview(flowId) {
12390
+ const value = await this.request(`/v1/flows/${segment(flowId)}/export-preview`);
12391
+ try {
12392
+ return decodeWorkflowExportPreview(value);
12393
+ } catch {
12394
+ return invalidResponse();
12395
+ }
12396
+ }
12397
+ async exportFlowBundle(flowId) {
12398
+ const preview = await this.getFlowExportPreview(flowId);
12399
+ if (preview.unavailableFlowIds.length) throw new ApiError(400, "flow.invalid", "Some referenced workflows are unavailable.");
12400
+ return workflowBundleFromPreview(preview);
12401
+ }
12402
+ async importFlowBundle(file, options = {}) {
12403
+ return decodeWorkflowBundleImportResult(await this.request("/v1/flows/import-bundle", {
12404
+ method: "POST",
12405
+ headers: { "Idempotency-Key": options.idempotencyKey ?? `flow-${randomId()}` },
12406
+ body: JSON.stringify({
12407
+ file,
12408
+ name: options.name,
12409
+ teamId: options.teamId,
12410
+ tagIds: options.tagIds,
12411
+ version: 1
12412
+ })
12413
+ }));
12414
+ }
12111
12415
  async importFlow(file, options = {}) {
12112
12416
  return flow(await this.request("/v1/flows/import", {
12113
12417
  method: "POST",
@@ -27,8 +27,10 @@ import type { ResultQuery } from './run-results.js';
27
27
  import { decodeResultList, decodeResultRead } from './run-results.js';
28
28
  export { readResult, parseResultQuery, decodeResultList, decodeResultRead, type ResultCall, type ResultInfo, type ResultPage, type ResultQuery, } from './run-results.js';
29
29
  import type { RunStatus } from './run-lifecycle.js';
30
+ import type { WorkflowBundle, WorkflowExportPreview } from './flow-workflowBundle.js';
30
31
  import type { WorkflowFile } from './flow-workflowFile.js';
31
32
  export type { WorkflowFile, WorkflowCleanupSummary } from './flow-workflowFile.js';
33
+ export type { WorkflowBundle, WorkflowExportPreview } from './flow-workflowBundle.js';
32
34
  import type { InputPortDefinition, JsonValue, PortDefinition, RevisionContent, TriggerKeySnapshot, WaitAction } from './flow-change.js';
33
35
  import type { FlowResourceReferences } from './flow-semantics.js';
34
36
  export type { JsonValue, TriggerKeySnapshot, WaitAction } from './flow-change.js';
@@ -63,8 +65,16 @@ export interface FlowResources {
63
65
  }
64
66
  export interface FlowUpdate {
65
67
  readonly name?: string;
68
+ readonly icon?: string | null;
69
+ readonly description?: string | null;
66
70
  readonly tagIds?: readonly string[];
67
71
  }
72
+ export interface WorkflowBundleImportResult {
73
+ readonly version: 1;
74
+ readonly flow: Flow;
75
+ readonly flows: readonly Flow[];
76
+ }
77
+ export declare function decodeWorkflowBundleImportResult(value: unknown): WorkflowBundleImportResult;
68
78
  export interface FlowQuery {
69
79
  readonly query?: string;
70
80
  readonly tagIds?: readonly string[];
@@ -93,6 +103,8 @@ export interface Flow {
93
103
  /** Connector Team scope used by the OOMOL resource cache. */
94
104
  readonly connectorTeamId?: string;
95
105
  readonly name: string;
106
+ readonly icon?: string;
107
+ readonly description?: string;
96
108
  readonly status: 'active' | 'retiring';
97
109
  readonly updatedAt: string;
98
110
  readonly version: 1;
@@ -828,6 +840,14 @@ export declare class ControlClient {
828
840
  putVariable(name: string, value: string): Promise<Variable>;
829
841
  deleteVariable(name: string): Promise<void>;
830
842
  exportFlow(flowId: string): Promise<WorkflowFile>;
843
+ getFlowExportPreview(flowId: string): Promise<WorkflowExportPreview>;
844
+ exportFlowBundle(flowId: string): Promise<WorkflowBundle>;
845
+ importFlowBundle(file: WorkflowBundle, options?: {
846
+ readonly name?: string;
847
+ readonly teamId?: string;
848
+ readonly idempotencyKey?: string;
849
+ readonly tagIds?: readonly string[];
850
+ }): Promise<WorkflowBundleImportResult>;
831
851
  importFlow(file: WorkflowFile, options?: {
832
852
  readonly name?: string;
833
853
  readonly teamId?: string;