@oomol-lab/open-flow 0.1.0-beta.79 → 0.1.0-beta.80

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 (32) hide show
  1. package/dist/browser/{FlowCanvas-BQGBcfoL.js → FlowCanvas-CrsiDHK8.js} +50 -51
  2. package/dist/browser/{createResourceDialog-DkovGogv.js → createResourceDialog-CS3u9ga9.js} +2 -2
  3. package/dist/browser/{dialog-CFFuRM8s.js → dialog-CFlvkliO.js} +7 -2
  4. package/dist/browser/{exportSvg-CYwyYiuH.js → exportPng-BOPfjeEi.js} +236 -38
  5. package/dist/browser/{flowChanges-CN2R-m1M.js → flowChanges-pFjPHU5k.js} +326 -203
  6. package/dist/browser/{flowWorkspace-CXVL1FNv.js → flowWorkspace-CRlqc403.js} +698 -480
  7. package/dist/browser/preview.css +153 -132
  8. package/dist/browser/preview.js +921 -643
  9. package/dist/browser/ui-logo.d.ts +1 -0
  10. package/dist/browser/ui.css +29 -4
  11. package/dist/browser/ui.js +4 -1
  12. package/dist/browser/workbench.css +153 -132
  13. package/dist/browser/workbench.js +9 -9
  14. package/dist/browser/{workbenchSelect-CkOS95gX.js → workbenchSelect-Ci0KCYv9.js} +1 -1
  15. package/dist/command/index.js +41 -41
  16. package/dist/common/control-api-conformance.js +49 -19
  17. package/dist/common/control-api.d.ts +26 -6
  18. package/dist/common/control-api.js +49 -19
  19. package/dist/common/control-requests.js +6 -2
  20. package/dist/common/flow-authoring.js +6 -2
  21. package/dist/common/flow-change.js +6 -2
  22. package/dist/common/flow-encoding.js +6 -2
  23. package/dist/common/flow-semantics.js +6 -2
  24. package/dist/common/flow-state.d.ts +47 -0
  25. package/dist/common/flow-state.js +7 -1
  26. package/dist/common/mcp.js +49 -18
  27. package/dist/common/scheduler.js +6 -2
  28. package/package.json +1 -1
  29. package/src/control/common/api.ts +24 -8
  30. package/src/control/common/connectorDecoders.ts +11 -30
  31. package/src/control/common/revisionDecoders.ts +14 -0
  32. package/src/state/common/state.ts +14 -0
@@ -8638,7 +8638,7 @@ var keySchema = string$1().min(1).refine((value) => new TextEncoder().encode(val
8638
8638
  strictObject({
8639
8639
  scope: _enum(["draft", "live"]),
8640
8640
  values: literal(false).optional()
8641
- });
8641
+ }).omit({ values: true });
8642
8642
  strictObject({
8643
8643
  scope: _enum(["draft", "live"]),
8644
8644
  keys: array(keySchema).min(1).max(stateReadLimits.maxKeys).refine((keys) => new Set(keys).size === keys.length, "State keys must be distinct.")
@@ -8651,6 +8651,7 @@ strictObject({
8651
8651
  scope: _enum(["draft", "live"]),
8652
8652
  space: string$1().regex(/^(flow|node:.+)$/)
8653
8653
  });
8654
+ strictObject({ scope: _enum(["draft", "live"]) });
8654
8655
  var skipDuplicatesConfigSchema = strictObject({ fields: array(string$1().refine((field) => field.length > 0 && field.split(".").every((part) => part.length > 0), "Use a nonempty dot-separated field path.")).refine((fields) => new Set(fields).size === fields.length, "Identity fields must be distinct.").default([]) });
8655
8656
  var skipDuplicatesExecutorSchema = skipDuplicatesConfigSchema.extend({ kind: literal("skip-duplicates") });
8656
8657
  var flowStateViewSchema = object({
@@ -8676,6 +8677,10 @@ var flowStateViewSchema = object({
8676
8677
  updatedAt: number()
8677
8678
  }))
8678
8679
  });
8680
+ var flowStateSummarySchema = flowStateViewSchema.extend({ values: strictObject({
8681
+ count: number().int().nonnegative(),
8682
+ updatedAt: number().nullable()
8683
+ }) });
8679
8684
  var flowStateValuesSchema = object({
8680
8685
  version: literal(1),
8681
8686
  scope: _enum(["draft", "live"]),
@@ -10589,7 +10594,7 @@ function leinaBots(value) {
10589
10594
  }
10590
10595
  function accessPermissions(value) {
10591
10596
  const source = record$1(value);
10592
- exact(source, [
10597
+ requiredFields(source, [
10593
10598
  "actionIds",
10594
10599
  "allActions",
10595
10600
  "triggerIds",
@@ -10627,19 +10632,15 @@ function accessBinding(value, candidate) {
10627
10632
  const legacy = Object.hasOwn(source, "displayName") && !Object.hasOwn(source, "connectionDisplayName");
10628
10633
  const permissions = candidate && Object.hasOwn(source, "permissions") ? accessPermissions(source.permissions) : void 0;
10629
10634
  const permissionGroupName = source.permissionGroupName;
10630
- exact(source, [
10635
+ requiredFields(source, [
10631
10636
  "accessBindingId",
10632
10637
  "connectionId",
10633
10638
  "source",
10634
10639
  legacy ? "displayName" : "connectionDisplayName",
10635
- ...candidate && Object.hasOwn(source, "isDefault") ? ["isDefault"] : [],
10636
- ...candidate && permissions != null ? ["permissions"] : [],
10637
- ...Object.hasOwn(source, "permissionGroupName") ? ["permissionGroupName"] : [],
10638
- ...policyRevision == null ? [] : ["policyRevision"],
10639
10640
  "providerId",
10640
10641
  ...candidate ? [] : ["status"]
10641
10642
  ]);
10642
- if (policyRevision != null && typeof policyRevision != "string") return invalidResponse("policyRevision: expected a string.");
10643
+ if (policyRevision !== void 0 && typeof policyRevision != "string") return invalidResponse("policyRevision: expected a string.");
10643
10644
  if (candidate && isDefault !== void 0 && typeof isDefault != "boolean") return invalidResponse("isDefault: expected a boolean.");
10644
10645
  if (permissionGroupName !== void 0 && permissionGroupName !== null && typeof permissionGroupName != "string") return invalidResponse("permissionGroupName: expected a string or null.");
10645
10646
  if (!candidate && status != "active" && status != "forbidden" && status != "invalid" && status != "missing") return invalidResponse();
@@ -10668,13 +10669,11 @@ function accessMode(value) {
10668
10669
  }
10669
10670
  function connectorAccess(value) {
10670
10671
  const source = record$1(value);
10671
- exact(source, [
10672
+ requiredFields(source, [
10672
10673
  "accessRevision",
10673
10674
  "bindings",
10674
10675
  "mode",
10675
10676
  "sharedAccessDigest",
10676
- ..."providerIds" in source ? ["providerIds"] : [],
10677
- ..."discardedBindingCount" in source ? ["discardedBindingCount"] : [],
10678
10677
  "version"
10679
10678
  ]);
10680
10679
  const accessRevision = integer(source.accessRevision);
@@ -10715,13 +10714,12 @@ function accessGrants(value) {
10715
10714
  if (!Array.isArray(value)) return invalidResponse();
10716
10715
  const bindings = value.map((candidate) => {
10717
10716
  const entry = record$1(candidate);
10718
- exact(entry, [
10717
+ requiredFields(entry, [
10719
10718
  "accessBindingId",
10720
10719
  "connectionId",
10721
10720
  "providerId",
10722
10721
  "source",
10723
- "connectionDisplayName",
10724
- ..."permissionGroupName" in entry ? ["permissionGroupName"] : []
10722
+ "connectionDisplayName"
10725
10723
  ]);
10726
10724
  let identity;
10727
10725
  try {
@@ -10744,7 +10742,7 @@ function accessGrants(value) {
10744
10742
  }
10745
10743
  function connectorAccessSnapshot(value) {
10746
10744
  const source = record$1(value);
10747
- exact(source, [
10745
+ requiredFields(source, [
10748
10746
  "mode",
10749
10747
  "sharedAccessDigest",
10750
10748
  "sharedBindings",
@@ -10766,7 +10764,7 @@ function connectorAccessSnapshot(value) {
10766
10764
  }
10767
10765
  function connectorAccessCandidates(value, providerId) {
10768
10766
  const source = record$1(value);
10769
- exact(source, [
10767
+ requiredFields(source, [
10770
10768
  "candidates",
10771
10769
  "mode",
10772
10770
  "providerId",
@@ -10787,7 +10785,7 @@ function connectorAccessCandidates(value, providerId) {
10787
10785
  }
10788
10786
  function connectorAccessCandidatesBatch(value, providerIds) {
10789
10787
  const source = record$1(value);
10790
- exact(source, ["results", "version"]);
10788
+ requiredFields(source, ["results", "version"]);
10791
10789
  if (source.version != 1) return invalidResponse("version: expected 1.");
10792
10790
  if (!Array.isArray(source.results)) return invalidResponse("results: expected an array.");
10793
10791
  const remaining = new Set(providerIds);
@@ -10796,9 +10794,9 @@ function connectorAccessCandidatesBatch(value, providerIds) {
10796
10794
  const providerId = string(item.providerId);
10797
10795
  if (!remaining.delete(providerId)) return invalidResponse("results[].providerId: duplicate or unrequested provider.");
10798
10796
  if (!Object.hasOwn(item, "error")) return connectorAccessCandidates(item, providerId);
10799
- exact(item, ["providerId", "error"]);
10797
+ requiredFields(item, ["providerId", "error"]);
10800
10798
  const error = record$1(item.error);
10801
- exact(error, ["code", "message"]);
10799
+ requiredFields(error, ["code", "message"]);
10802
10800
  return {
10803
10801
  providerId,
10804
10802
  error: {
@@ -11440,6 +11438,25 @@ function draft(value) {
11440
11438
  return invalidResponse();
11441
11439
  }
11442
11440
  }
11441
+ function revisionTriggers(value) {
11442
+ const source = record$1(value);
11443
+ const graph = record$1(record$1(record$1(source.content).document).graph);
11444
+ const triggers = Object.entries(record$1(graph.nodes)).flatMap(([triggerId, entry]) => {
11445
+ const node = record$1(entry);
11446
+ if (node.kind == "outputs" || Object.hasOwn(node, "inputs")) return [];
11447
+ const kind = string(node.kind);
11448
+ if (node.name !== void 0 && typeof node.name != "string") return invalidResponse();
11449
+ return [{
11450
+ triggerId: string(triggerId),
11451
+ kind,
11452
+ ...node.name === void 0 ? {} : { name: node.name }
11453
+ }];
11454
+ });
11455
+ return {
11456
+ ...revisionMetadata(source),
11457
+ triggers
11458
+ };
11459
+ }
11443
11460
  function presentation(value) {
11444
11461
  const source = record$1(value);
11445
11462
  if (source.version != 1 || integer(source.revision) < 1) return invalidResponse();
@@ -12196,6 +12213,10 @@ var ControlClient = class {
12196
12213
  const result = flowStateViewSchema.safeParse(await this.request(`/v1/flows/${segment(flowId)}/state?scope=${scope}`));
12197
12214
  return result.success && result.data.scope === scope ? result.data : invalidResponse();
12198
12215
  }
12216
+ async getFlowStateSummary(flowId, scope, signal) {
12217
+ const result = flowStateSummarySchema.safeParse(await this.request(`/v1/flows/${segment(flowId)}/state/summary?scope=${scope}`, { signal }));
12218
+ return result.success && result.data.scope === scope ? result.data : invalidResponse();
12219
+ }
12199
12220
  async getFlowStateValues(flowId, scope, keys, signal) {
12200
12221
  const result = flowStateValuesSchema.safeParse(await this.request(`/v1/flows/${segment(flowId)}/state/read`, {
12201
12222
  method: "POST",
@@ -12216,6 +12237,10 @@ var ControlClient = class {
12216
12237
  const source = record$1(await this.request(`/v1/flows/${segment(flowId)}/dedupe?scope=${scope}&space=${encodeURIComponent(space)}`, { method: "DELETE" }));
12217
12238
  if (source.version !== 1 || source.cleared !== true) invalidResponse();
12218
12239
  }
12240
+ async clearAllFlowDedupe(flowId, scope) {
12241
+ const source = record$1(await this.request(`/v1/flows/${segment(flowId)}/dedupe/all?scope=${scope}`, { method: "DELETE" }));
12242
+ if (source.version !== 1 || source.cleared !== true) invalidResponse();
12243
+ }
12219
12244
  async renameFlow(flowId, name) {
12220
12245
  return this.updateFlow(flowId, { name });
12221
12246
  }
@@ -12328,6 +12353,11 @@ var ControlClient = class {
12328
12353
  async getRevision(flowId, revisionId, signal) {
12329
12354
  return draft(await this.request(`/v1/flows/${segment(flowId)}/revisions/${segment(revisionId)}`, { signal }));
12330
12355
  }
12356
+ async getRevisionTriggers(flowId, revisionId, signal) {
12357
+ const revision = revisionTriggers(await this.request(`/v1/flows/${segment(flowId)}/revisions/${segment(revisionId)}`, { signal }));
12358
+ if (revision.flowId != flowId || revision.revisionId != revisionId) return invalidResponse();
12359
+ return revision;
12360
+ }
12331
12361
  async listTriggerConfigOptions(flowId, nodeId, field, signal) {
12332
12362
  const source = record$1(await this.request(`/v1/flows/${segment(flowId)}/triggers/${segment(nodeId)}/options/${segment(field)}`, { signal }));
12333
12363
  requiredFields(source, ["options", "version"]);
@@ -1,5 +1,5 @@
1
1
  import type { CanvasCommand } from './canvas-commands.js';
2
- import type { FlowStateValues, FlowStateView, StateScope } from './flow-state.js';
2
+ import type { FlowStateSummary, FlowStateValues, FlowStateView, StateScope } from './flow-state.js';
3
3
  export type { CanvasCommand, CanvasCommandSubscriber } from './canvas-commands.js';
4
4
  import type { LiveDetails } from './liveDetails.js';
5
5
  export { liveEntries } from './liveDetails.js';
@@ -835,7 +835,7 @@ export declare class ControlClient {
835
835
  readonly tagIds?: readonly string[];
836
836
  }): Promise<Flow>;
837
837
  createFlow(name: string, idempotencyKey?: string, teamId?: string, tagIds?: readonly string[], initialPresentation?: Readonly<Record<string, JsonValue>>): Promise<Flow>;
838
- broadcastCanvas(flowId: string, command: CanvasCommand): Promise<CanvasBroadcast>;
838
+ broadcastCanvas(flowId: string, command: CanvasCommand | Readonly<Record<string, unknown>>): Promise<CanvasBroadcast>;
839
839
  getFlow(flowId: string): Promise<Flow>;
840
840
  getErrorListeners(flowId: string, signal?: AbortSignal): Promise<readonly ErrorListener[]>;
841
841
  listTags(signal?: AbortSignal): Promise<{
@@ -848,9 +848,11 @@ export declare class ControlClient {
848
848
  setFlowTags(flowId: string, tagIds: readonly string[]): Promise<Flow>;
849
849
  updateFlow(flowId: string, changes: FlowUpdate): Promise<Flow>;
850
850
  getFlowState(flowId: string, scope: StateScope): Promise<FlowStateView>;
851
+ getFlowStateSummary(flowId: string, scope: StateScope, signal?: AbortSignal): Promise<FlowStateSummary>;
851
852
  getFlowStateValues(flowId: string, scope: StateScope, keys: readonly string[], signal?: AbortSignal): Promise<FlowStateValues>;
852
853
  clearFlowState(flowId: string, scope: StateScope, key?: string): Promise<void>;
853
854
  clearFlowDedupe(flowId: string, scope: StateScope, space: string): Promise<void>;
855
+ clearAllFlowDedupe(flowId: string, scope: StateScope): Promise<void>;
854
856
  renameFlow(flowId: string, name: string): Promise<Flow>;
855
857
  deleteFlow(flowId: string): Promise<Flow>;
856
858
  listTriggerKeys(signal?: AbortSignal, locale?: string): Promise<readonly TriggerKeySummary[]>;
@@ -880,6 +882,21 @@ export declare class ControlClient {
880
882
  getDraft(flowId: string): Promise<Draft>;
881
883
  syncDraft(flowId: string): Promise<DraftSync>;
882
884
  getRevision(flowId: string, revisionId: string, signal?: AbortSignal): Promise<Draft>;
885
+ getRevisionTriggers(flowId: string, revisionId: string, signal?: AbortSignal): Promise<{
886
+ triggers: {
887
+ triggerId: string;
888
+ kind: string;
889
+ name?: string | undefined;
890
+ }[];
891
+ actorId: string;
892
+ createdAt: string;
893
+ digest: string;
894
+ modelVersion: number;
895
+ parentRevisionId: string | null;
896
+ flowId: string;
897
+ revisionId: string;
898
+ version: 1;
899
+ }>;
883
900
  listTriggerConfigOptions(flowId: string, nodeId: string, field: string, signal?: AbortSignal): Promise<readonly TriggerConfigOption[]>;
884
901
  listConnectorTeams(signal?: AbortSignal): Promise<{
885
902
  enabled: boolean;
@@ -905,7 +922,7 @@ export declare class ControlClient {
905
922
  listAllConnectorConnections(signal?: AbortSignal, flowId?: string, fresh?: boolean): Promise<readonly ConnectorConnection[]>;
906
923
  listConnectorConnections(serviceId: string, signal?: AbortSignal, flowId?: string, fresh?: boolean): Promise<readonly ConnectorConnection[]>;
907
924
  createConnectorConnectionPage(serviceId: string, flowId?: string, teamId?: string): Promise<string>;
908
- readAuthoring(flowId: string, query?: AuthoringRead): Promise<{
925
+ readAuthoring(flowId: string, query?: AuthoringRead | Readonly<Record<string, unknown>>): Promise<{
909
926
  flowId: string;
910
927
  revision: string;
911
928
  data: {
@@ -915,7 +932,7 @@ export declare class ControlClient {
915
932
  };
916
933
  version: 1;
917
934
  }>;
918
- searchAuthoring(flowId: string, query: AuthoringSearch): Promise<{
935
+ searchAuthoring(flowId: string, query: AuthoringSearch | Readonly<Record<string, unknown>>): Promise<{
919
936
  flowId: string;
920
937
  revision: string;
921
938
  data: {
@@ -933,8 +950,11 @@ export declare class ControlClient {
933
950
  authoringSchema(flowId: string, query: {
934
951
  type?: AuthoringType;
935
952
  action?: string;
936
- }): Promise<Readonly<Record<string, unknown>>>;
937
- editAuthoring(flowId: string, request: AuthoringRequest): Promise<{
953
+ } | Readonly<Record<string, unknown>>): Promise<Readonly<Record<string, unknown>>>;
954
+ editAuthoring(flowId: string, request: AuthoringRequest | {
955
+ readonly requestId: string;
956
+ readonly [key: string]: unknown;
957
+ }): Promise<{
938
958
  flowId: string;
939
959
  saved: true;
940
960
  revision: string;
@@ -5783,7 +5783,7 @@ var keySchema = string$1().min(1).refine((value) => new TextEncoder().encode(val
5783
5783
  strictObject({
5784
5784
  scope: _enum(["draft", "live"]),
5785
5785
  values: literal(false).optional()
5786
- });
5786
+ }).omit({ values: true });
5787
5787
  strictObject({
5788
5788
  scope: _enum(["draft", "live"]),
5789
5789
  keys: array(keySchema).min(1).max(stateReadLimits.maxKeys).refine((keys) => new Set(keys).size === keys.length, "State keys must be distinct.")
@@ -5796,6 +5796,7 @@ strictObject({
5796
5796
  scope: _enum(["draft", "live"]),
5797
5797
  space: string$1().regex(/^(flow|node:.+)$/)
5798
5798
  });
5799
+ strictObject({ scope: _enum(["draft", "live"]) });
5799
5800
  var skipDuplicatesConfigSchema = strictObject({ fields: array(string$1().refine((field) => field.length > 0 && field.split(".").every((part) => part.length > 0), "Use a nonempty dot-separated field path.")).refine((fields) => new Set(fields).size === fields.length, "Identity fields must be distinct.").default([]) });
5800
5801
  var skipDuplicatesExecutorSchema = skipDuplicatesConfigSchema.extend({ kind: literal("skip-duplicates") });
5801
5802
  var flowStateViewSchema = object({
@@ -5821,6 +5822,10 @@ var flowStateViewSchema = object({
5821
5822
  updatedAt: number()
5822
5823
  }))
5823
5824
  });
5825
+ var flowStateSummarySchema = flowStateViewSchema.extend({ values: strictObject({
5826
+ count: number().int().nonnegative(),
5827
+ updatedAt: number().nullable()
5828
+ }) });
5824
5829
  var flowStateValuesSchema = object({
5825
5830
  version: literal(1),
5826
5831
  scope: _enum(["draft", "live"]),
@@ -10744,7 +10749,7 @@ function leinaBots(value) {
10744
10749
  }
10745
10750
  function accessPermissions(value) {
10746
10751
  const source = record(value);
10747
- exact(source, [
10752
+ requiredFields(source, [
10748
10753
  "actionIds",
10749
10754
  "allActions",
10750
10755
  "triggerIds",
@@ -10782,19 +10787,15 @@ function accessBinding(value, candidate) {
10782
10787
  const legacy = Object.hasOwn(source, "displayName") && !Object.hasOwn(source, "connectionDisplayName");
10783
10788
  const permissions = candidate && Object.hasOwn(source, "permissions") ? accessPermissions(source.permissions) : void 0;
10784
10789
  const permissionGroupName = source.permissionGroupName;
10785
- exact(source, [
10790
+ requiredFields(source, [
10786
10791
  "accessBindingId",
10787
10792
  "connectionId",
10788
10793
  "source",
10789
10794
  legacy ? "displayName" : "connectionDisplayName",
10790
- ...candidate && Object.hasOwn(source, "isDefault") ? ["isDefault"] : [],
10791
- ...candidate && permissions != null ? ["permissions"] : [],
10792
- ...Object.hasOwn(source, "permissionGroupName") ? ["permissionGroupName"] : [],
10793
- ...policyRevision == null ? [] : ["policyRevision"],
10794
10795
  "providerId",
10795
10796
  ...candidate ? [] : ["status"]
10796
10797
  ]);
10797
- if (policyRevision != null && typeof policyRevision != "string") return invalidResponse("policyRevision: expected a string.");
10798
+ if (policyRevision !== void 0 && typeof policyRevision != "string") return invalidResponse("policyRevision: expected a string.");
10798
10799
  if (candidate && isDefault !== void 0 && typeof isDefault != "boolean") return invalidResponse("isDefault: expected a boolean.");
10799
10800
  if (permissionGroupName !== void 0 && permissionGroupName !== null && typeof permissionGroupName != "string") return invalidResponse("permissionGroupName: expected a string or null.");
10800
10801
  if (!candidate && status != "active" && status != "forbidden" && status != "invalid" && status != "missing") return invalidResponse();
@@ -10823,13 +10824,11 @@ function accessMode(value) {
10823
10824
  }
10824
10825
  function connectorAccess(value) {
10825
10826
  const source = record(value);
10826
- exact(source, [
10827
+ requiredFields(source, [
10827
10828
  "accessRevision",
10828
10829
  "bindings",
10829
10830
  "mode",
10830
10831
  "sharedAccessDigest",
10831
- ..."providerIds" in source ? ["providerIds"] : [],
10832
- ..."discardedBindingCount" in source ? ["discardedBindingCount"] : [],
10833
10832
  "version"
10834
10833
  ]);
10835
10834
  const accessRevision = integer(source.accessRevision);
@@ -10870,13 +10869,12 @@ function accessGrants(value) {
10870
10869
  if (!Array.isArray(value)) return invalidResponse();
10871
10870
  const bindings = value.map((candidate) => {
10872
10871
  const entry = record(candidate);
10873
- exact(entry, [
10872
+ requiredFields(entry, [
10874
10873
  "accessBindingId",
10875
10874
  "connectionId",
10876
10875
  "providerId",
10877
10876
  "source",
10878
- "connectionDisplayName",
10879
- ..."permissionGroupName" in entry ? ["permissionGroupName"] : []
10877
+ "connectionDisplayName"
10880
10878
  ]);
10881
10879
  let identity;
10882
10880
  try {
@@ -10899,7 +10897,7 @@ function accessGrants(value) {
10899
10897
  }
10900
10898
  function connectorAccessSnapshot(value) {
10901
10899
  const source = record(value);
10902
- exact(source, [
10900
+ requiredFields(source, [
10903
10901
  "mode",
10904
10902
  "sharedAccessDigest",
10905
10903
  "sharedBindings",
@@ -10921,7 +10919,7 @@ function connectorAccessSnapshot(value) {
10921
10919
  }
10922
10920
  function connectorAccessCandidates(value, providerId) {
10923
10921
  const source = record(value);
10924
- exact(source, [
10922
+ requiredFields(source, [
10925
10923
  "candidates",
10926
10924
  "mode",
10927
10925
  "providerId",
@@ -10942,7 +10940,7 @@ function connectorAccessCandidates(value, providerId) {
10942
10940
  }
10943
10941
  function connectorAccessCandidatesBatch(value, providerIds) {
10944
10942
  const source = record(value);
10945
- exact(source, ["results", "version"]);
10943
+ requiredFields(source, ["results", "version"]);
10946
10944
  if (source.version != 1) return invalidResponse("version: expected 1.");
10947
10945
  if (!Array.isArray(source.results)) return invalidResponse("results: expected an array.");
10948
10946
  const remaining = new Set(providerIds);
@@ -10951,9 +10949,9 @@ function connectorAccessCandidatesBatch(value, providerIds) {
10951
10949
  const providerId = string(item.providerId);
10952
10950
  if (!remaining.delete(providerId)) return invalidResponse("results[].providerId: duplicate or unrequested provider.");
10953
10951
  if (!Object.hasOwn(item, "error")) return connectorAccessCandidates(item, providerId);
10954
- exact(item, ["providerId", "error"]);
10952
+ requiredFields(item, ["providerId", "error"]);
10955
10953
  const error = record(item.error);
10956
- exact(error, ["code", "message"]);
10954
+ requiredFields(error, ["code", "message"]);
10957
10955
  return {
10958
10956
  providerId,
10959
10957
  error: {
@@ -12128,6 +12126,25 @@ function draft(value) {
12128
12126
  return invalidResponse();
12129
12127
  }
12130
12128
  }
12129
+ function revisionTriggers(value) {
12130
+ const source = record(value);
12131
+ const graph = record(record(record(source.content).document).graph);
12132
+ const triggers = Object.entries(record(graph.nodes)).flatMap(([triggerId, entry]) => {
12133
+ const node = record(entry);
12134
+ if (node.kind == "outputs" || Object.hasOwn(node, "inputs")) return [];
12135
+ const kind = string(node.kind);
12136
+ if (node.name !== void 0 && typeof node.name != "string") return invalidResponse();
12137
+ return [{
12138
+ triggerId: string(triggerId),
12139
+ kind,
12140
+ ...node.name === void 0 ? {} : { name: node.name }
12141
+ }];
12142
+ });
12143
+ return {
12144
+ ...revisionMetadata(source),
12145
+ triggers
12146
+ };
12147
+ }
12131
12148
  function presentation(value) {
12132
12149
  const source = record(value);
12133
12150
  if (source.version != 1 || integer(source.revision) < 1) return invalidResponse();
@@ -12887,6 +12904,10 @@ var ControlClient = class {
12887
12904
  const result = flowStateViewSchema.safeParse(await this.request(`/v1/flows/${segment(flowId)}/state?scope=${scope}`));
12888
12905
  return result.success && result.data.scope === scope ? result.data : invalidResponse();
12889
12906
  }
12907
+ async getFlowStateSummary(flowId, scope, signal) {
12908
+ const result = flowStateSummarySchema.safeParse(await this.request(`/v1/flows/${segment(flowId)}/state/summary?scope=${scope}`, { signal }));
12909
+ return result.success && result.data.scope === scope ? result.data : invalidResponse();
12910
+ }
12890
12911
  async getFlowStateValues(flowId, scope, keys, signal) {
12891
12912
  const result = flowStateValuesSchema.safeParse(await this.request(`/v1/flows/${segment(flowId)}/state/read`, {
12892
12913
  method: "POST",
@@ -12907,6 +12928,10 @@ var ControlClient = class {
12907
12928
  const source = record(await this.request(`/v1/flows/${segment(flowId)}/dedupe?scope=${scope}&space=${encodeURIComponent(space)}`, { method: "DELETE" }));
12908
12929
  if (source.version !== 1 || source.cleared !== true) invalidResponse();
12909
12930
  }
12931
+ async clearAllFlowDedupe(flowId, scope) {
12932
+ const source = record(await this.request(`/v1/flows/${segment(flowId)}/dedupe/all?scope=${scope}`, { method: "DELETE" }));
12933
+ if (source.version !== 1 || source.cleared !== true) invalidResponse();
12934
+ }
12910
12935
  async renameFlow(flowId, name) {
12911
12936
  return this.updateFlow(flowId, { name });
12912
12937
  }
@@ -13019,6 +13044,11 @@ var ControlClient = class {
13019
13044
  async getRevision(flowId, revisionId, signal) {
13020
13045
  return draft(await this.request(`/v1/flows/${segment(flowId)}/revisions/${segment(revisionId)}`, { signal }));
13021
13046
  }
13047
+ async getRevisionTriggers(flowId, revisionId, signal) {
13048
+ const revision = revisionTriggers(await this.request(`/v1/flows/${segment(flowId)}/revisions/${segment(revisionId)}`, { signal }));
13049
+ if (revision.flowId != flowId || revision.revisionId != revisionId) return invalidResponse();
13050
+ return revision;
13051
+ }
13022
13052
  async listTriggerConfigOptions(flowId, nodeId, field, signal) {
13023
13053
  const source = record(await this.request(`/v1/flows/${segment(flowId)}/triggers/${segment(nodeId)}/options/${segment(field)}`, { signal }));
13024
13054
  requiredFields(source, ["options", "version"]);
@@ -12483,7 +12483,7 @@ var keySchema = string().min(1).refine((value) => new TextEncoder().encode(value
12483
12483
  strictObject({
12484
12484
  scope: _enum(["draft", "live"]),
12485
12485
  values: literal(false).optional()
12486
- });
12486
+ }).omit({ values: true });
12487
12487
  var stateReadSchema = strictObject({
12488
12488
  scope: _enum(["draft", "live"]),
12489
12489
  keys: array(keySchema).min(1).max(stateReadLimits.maxKeys).refine((keys) => new Set(keys).size === keys.length, "State keys must be distinct.")
@@ -12496,6 +12496,7 @@ strictObject({
12496
12496
  scope: _enum(["draft", "live"]),
12497
12497
  space: string().regex(/^(flow|node:.+)$/)
12498
12498
  });
12499
+ strictObject({ scope: _enum(["draft", "live"]) });
12499
12500
  var skipDuplicatesConfigSchema = strictObject({ fields: array(string().refine((field) => field.length > 0 && field.split(".").every((part) => part.length > 0), "Use a nonempty dot-separated field path.")).refine((fields) => new Set(fields).size === fields.length, "Identity fields must be distinct.").default([]) });
12500
12501
  var skipDuplicatesExecutorSchema = skipDuplicatesConfigSchema.extend({ kind: literal("skip-duplicates") });
12501
12502
  function skipDuplicatesTask(config = skipDuplicatesConfigSchema.parse({}), name = "Skip Duplicates") {
@@ -12539,7 +12540,10 @@ object$1({
12539
12540
  reservedCount: number().nonnegative(),
12540
12541
  updatedAt: number()
12541
12542
  }))
12542
- });
12543
+ }).extend({ values: strictObject({
12544
+ count: number().int().nonnegative(),
12545
+ updatedAt: number().nullable()
12546
+ }) });
12543
12547
  object$1({
12544
12548
  version: literal(1),
12545
12549
  scope: _enum(["draft", "live"]),
@@ -8770,7 +8770,7 @@ var keySchema = string().min(1).refine((value) => new TextEncoder().encode(value
8770
8770
  strictObject({
8771
8771
  scope: _enum(["draft", "live"]),
8772
8772
  values: literal(false).optional()
8773
- });
8773
+ }).omit({ values: true });
8774
8774
  strictObject({
8775
8775
  scope: _enum(["draft", "live"]),
8776
8776
  keys: array(keySchema).min(1).max(stateReadLimits.maxKeys).refine((keys) => new Set(keys).size === keys.length, "State keys must be distinct.")
@@ -8783,6 +8783,7 @@ strictObject({
8783
8783
  scope: _enum(["draft", "live"]),
8784
8784
  space: string().regex(/^(flow|node:.+)$/)
8785
8785
  });
8786
+ strictObject({ scope: _enum(["draft", "live"]) });
8786
8787
  var skipDuplicatesExecutorSchema = strictObject({ fields: array(string().refine((field) => field.length > 0 && field.split(".").every((part) => part.length > 0), "Use a nonempty dot-separated field path.")).refine((fields) => new Set(fields).size === fields.length, "Identity fields must be distinct.").default([]) }).extend({ kind: literal("skip-duplicates") });
8787
8788
  object({
8788
8789
  version: literal(1),
@@ -8806,7 +8807,10 @@ object({
8806
8807
  reservedCount: number().nonnegative(),
8807
8808
  updatedAt: number()
8808
8809
  }))
8809
- });
8810
+ }).extend({ values: strictObject({
8811
+ count: number().int().nonnegative(),
8812
+ updatedAt: number().nullable()
8813
+ }) });
8810
8814
  object({
8811
8815
  version: literal(1),
8812
8816
  scope: _enum(["draft", "live"]),
@@ -8843,7 +8843,7 @@ var keySchema = string().min(1).refine((value) => new TextEncoder().encode(value
8843
8843
  strictObject({
8844
8844
  scope: _enum(["draft", "live"]),
8845
8845
  values: literal(false).optional()
8846
- });
8846
+ }).omit({ values: true });
8847
8847
  strictObject({
8848
8848
  scope: _enum(["draft", "live"]),
8849
8849
  keys: array(keySchema).min(1).max(stateReadLimits.maxKeys).refine((keys) => new Set(keys).size === keys.length, "State keys must be distinct.")
@@ -8856,6 +8856,7 @@ strictObject({
8856
8856
  scope: _enum(["draft", "live"]),
8857
8857
  space: string().regex(/^(flow|node:.+)$/)
8858
8858
  });
8859
+ strictObject({ scope: _enum(["draft", "live"]) });
8859
8860
  var skipDuplicatesExecutorSchema = strictObject({ fields: array(string().refine((field) => field.length > 0 && field.split(".").every((part) => part.length > 0), "Use a nonempty dot-separated field path.")).refine((fields) => new Set(fields).size === fields.length, "Identity fields must be distinct.").default([]) }).extend({ kind: literal("skip-duplicates") });
8860
8861
  object({
8861
8862
  version: literal(1),
@@ -8879,7 +8880,10 @@ object({
8879
8880
  reservedCount: number().nonnegative(),
8880
8881
  updatedAt: number()
8881
8882
  }))
8882
- });
8883
+ }).extend({ values: strictObject({
8884
+ count: number().int().nonnegative(),
8885
+ updatedAt: number().nullable()
8886
+ }) });
8883
8887
  object({
8884
8888
  version: literal(1),
8885
8889
  scope: _enum(["draft", "live"]),
@@ -8614,7 +8614,7 @@ var keySchema = string().min(1).refine((value) => new TextEncoder().encode(value
8614
8614
  strictObject({
8615
8615
  scope: _enum(["draft", "live"]),
8616
8616
  values: literal(false).optional()
8617
- });
8617
+ }).omit({ values: true });
8618
8618
  strictObject({
8619
8619
  scope: _enum(["draft", "live"]),
8620
8620
  keys: array(keySchema).min(1).max(stateReadLimits.maxKeys).refine((keys) => new Set(keys).size === keys.length, "State keys must be distinct.")
@@ -8627,6 +8627,7 @@ strictObject({
8627
8627
  scope: _enum(["draft", "live"]),
8628
8628
  space: string().regex(/^(flow|node:.+)$/)
8629
8629
  });
8630
+ strictObject({ scope: _enum(["draft", "live"]) });
8630
8631
  var skipDuplicatesExecutorSchema = strictObject({ fields: array(string().refine((field) => field.length > 0 && field.split(".").every((part) => part.length > 0), "Use a nonempty dot-separated field path.")).refine((fields) => new Set(fields).size === fields.length, "Identity fields must be distinct.").default([]) }).extend({ kind: literal("skip-duplicates") });
8631
8632
  object({
8632
8633
  version: literal(1),
@@ -8650,7 +8651,10 @@ object({
8650
8651
  reservedCount: number().nonnegative(),
8651
8652
  updatedAt: number()
8652
8653
  }))
8653
- });
8654
+ }).extend({ values: strictObject({
8655
+ count: number().int().nonnegative(),
8656
+ updatedAt: number().nullable()
8657
+ }) });
8654
8658
  object({
8655
8659
  version: literal(1),
8656
8660
  scope: _enum(["draft", "live"]),
@@ -10372,7 +10372,7 @@ var keySchema = string().min(1).refine((value) => new TextEncoder().encode(value
10372
10372
  strictObject({
10373
10373
  scope: _enum(["draft", "live"]),
10374
10374
  values: literal(false).optional()
10375
- });
10375
+ }).omit({ values: true });
10376
10376
  strictObject({
10377
10377
  scope: _enum(["draft", "live"]),
10378
10378
  keys: array(keySchema).min(1).max(stateReadLimits.maxKeys).refine((keys) => new Set(keys).size === keys.length, "State keys must be distinct.")
@@ -10385,6 +10385,7 @@ strictObject({
10385
10385
  scope: _enum(["draft", "live"]),
10386
10386
  space: string().regex(/^(flow|node:.+)$/)
10387
10387
  });
10388
+ strictObject({ scope: _enum(["draft", "live"]) });
10388
10389
  var skipDuplicatesConfigSchema = strictObject({ fields: array(string().refine((field) => field.length > 0 && field.split(".").every((part) => part.length > 0), "Use a nonempty dot-separated field path.")).refine((fields) => new Set(fields).size === fields.length, "Identity fields must be distinct.").default([]) });
10389
10390
  var skipDuplicatesExecutorSchema = skipDuplicatesConfigSchema.extend({ kind: literal("skip-duplicates") });
10390
10391
  function skipDuplicatesTask(config = skipDuplicatesConfigSchema.parse({}), name = "Skip Duplicates") {
@@ -10428,7 +10429,10 @@ object$1({
10428
10429
  reservedCount: number().nonnegative(),
10429
10430
  updatedAt: number()
10430
10431
  }))
10431
- });
10432
+ }).extend({ values: strictObject({
10433
+ count: number().int().nonnegative(),
10434
+ updatedAt: number().nullable()
10435
+ }) });
10432
10436
  object$1({
10433
10437
  version: literal(1),
10434
10438
  scope: _enum(["draft", "live"]),
@@ -13,6 +13,12 @@ export declare const stateQuerySchema: z.ZodObject<{
13
13
  }>;
14
14
  values: z.ZodOptional<z.ZodLiteral<false>>;
15
15
  }, z.core.$strict>;
16
+ export declare const stateSummaryQuerySchema: z.ZodObject<{
17
+ scope: z.ZodEnum<{
18
+ draft: "draft";
19
+ live: "live";
20
+ }>;
21
+ }, z.core.$strict>;
16
22
  export declare const stateReadSchema: z.ZodObject<{
17
23
  scope: z.ZodEnum<{
18
24
  draft: "draft";
@@ -35,6 +41,12 @@ export declare const dedupeClearSchema: z.ZodObject<{
35
41
  }>;
36
42
  space: z.ZodString;
37
43
  }, z.core.$strict>;
44
+ export declare const dedupeClearAllSchema: z.ZodObject<{
45
+ scope: z.ZodEnum<{
46
+ draft: "draft";
47
+ live: "live";
48
+ }>;
49
+ }, z.core.$strict>;
38
50
  export type DedupeIdentity = string | number;
39
51
  export declare const skipDuplicatesConfigSchema: z.ZodObject<{
40
52
  fields: z.ZodDefault<z.ZodArray<z.ZodString>>;
@@ -108,6 +120,41 @@ export declare const flowStateViewSchema: z.ZodObject<{
108
120
  updatedAt: z.ZodNumber;
109
121
  }, z.core.$strip>>;
110
122
  }, z.core.$strip>;
123
+ export interface FlowStateSummary {
124
+ readonly version: 1;
125
+ readonly scope: StateScope;
126
+ readonly limits: FlowStateView['limits'];
127
+ readonly values: {
128
+ readonly count: number;
129
+ readonly updatedAt: number | null;
130
+ };
131
+ readonly spaces: FlowStateView['spaces'];
132
+ }
133
+ export declare const flowStateSummarySchema: z.ZodObject<{
134
+ version: z.ZodLiteral<1>;
135
+ scope: z.ZodEnum<{
136
+ draft: "draft";
137
+ live: "live";
138
+ }>;
139
+ limits: z.ZodObject<{
140
+ maxValueBytes: z.ZodNumber;
141
+ maxValues: z.ZodNumber;
142
+ maxSpaces: z.ZodNumber;
143
+ maxIdentities: z.ZodNumber;
144
+ maxRunWrites: z.ZodNumber;
145
+ }, z.core.$strip>;
146
+ spaces: z.ZodArray<z.ZodObject<{
147
+ space: z.ZodString;
148
+ count: z.ZodNumber;
149
+ pendingCount: z.ZodNumber;
150
+ reservedCount: z.ZodNumber;
151
+ updatedAt: z.ZodNumber;
152
+ }, z.core.$strip>>;
153
+ values: z.ZodObject<{
154
+ count: z.ZodNumber;
155
+ updatedAt: z.ZodNullable<z.ZodNumber>;
156
+ }, z.core.$strict>;
157
+ }, z.core.$strip>;
111
158
  export interface FlowStateValues {
112
159
  readonly version: 1;
113
160
  readonly scope: StateScope;