@superdurable/dex 0.1.3 → 0.1.5

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 (57) hide show
  1. package/README.md +69 -3
  2. package/dist/src/attribute-store-sync.d.ts +5 -0
  3. package/dist/src/attribute-store-sync.js +19 -0
  4. package/dist/src/attribute-store-sync.js.map +1 -0
  5. package/dist/src/blob-cache.d.ts +36 -0
  6. package/dist/src/blob-cache.js +13 -0
  7. package/dist/src/blob-cache.js.map +1 -1
  8. package/dist/src/client.d.ts +205 -4
  9. package/dist/src/client.js +201 -37
  10. package/dist/src/client.js.map +1 -1
  11. package/dist/src/codec.d.ts +73 -0
  12. package/dist/src/codec.js +23 -0
  13. package/dist/src/codec.js.map +1 -1
  14. package/dist/src/context.d.ts +92 -0
  15. package/dist/src/errors.d.ts +122 -6
  16. package/dist/src/errors.js +139 -9
  17. package/dist/src/errors.js.map +1 -1
  18. package/dist/src/flow.d.ts +36 -1
  19. package/dist/src/flow.js +96 -28
  20. package/dist/src/flow.js.map +1 -1
  21. package/dist/src/gen/dex.d.ts +58 -9
  22. package/dist/src/gen/dex.js +417 -55
  23. package/dist/src/gen/dex.js.map +1 -1
  24. package/dist/src/grpc-status.d.ts +5 -4
  25. package/dist/src/grpc-status.js +52 -6
  26. package/dist/src/grpc-status.js.map +1 -1
  27. package/dist/src/invocation-context.d.ts +2 -0
  28. package/dist/src/invocation-context.js +33 -0
  29. package/dist/src/invocation-context.js.map +1 -1
  30. package/dist/src/options.d.ts +150 -1
  31. package/dist/src/options.js +53 -0
  32. package/dist/src/options.js.map +1 -1
  33. package/dist/src/persistence.d.ts +115 -0
  34. package/dist/src/persistence.js +114 -0
  35. package/dist/src/persistence.js.map +1 -1
  36. package/dist/src/rpc.d.ts +53 -0
  37. package/dist/src/rpc.js +17 -0
  38. package/dist/src/rpc.js.map +1 -1
  39. package/dist/src/step.d.ts +163 -1
  40. package/dist/src/step.js +86 -1
  41. package/dist/src/step.js.map +1 -1
  42. package/dist/src/value-mapper.js +48 -18
  43. package/dist/src/value-mapper.js.map +1 -1
  44. package/dist/src/wait.d.ts +193 -0
  45. package/dist/src/wait.js +174 -0
  46. package/dist/src/wait.js.map +1 -1
  47. package/dist/src/worker-dispatcher.js +67 -35
  48. package/dist/src/worker-dispatcher.js.map +1 -1
  49. package/dist/src/worker.d.ts +30 -1
  50. package/dist/src/worker.js +48 -2
  51. package/dist/src/worker.js.map +1 -1
  52. package/native/linux-aarch64/dex_blob_cache_node.node +0 -0
  53. package/native/linux-x86_64/dex_blob_cache_node.node +0 -0
  54. package/native/macos-aarch64/dex_blob_cache_node.node +0 -0
  55. package/native/macos-x86_64/dex_blob_cache_node.node +0 -0
  56. package/native/windows-x86_64/dex_blob_cache_node.node +0 -0
  57. package/package.json +2 -1
package/README.md CHANGED
@@ -26,7 +26,7 @@ class ApproveOrder implements Step<string> {
26
26
  }
27
27
 
28
28
  waitFor(_context: Context, _orderId: string): Wait {
29
- return Wait.allOf(Timer.byDuration(1_000));
29
+ return Wait.until(Timer.byDuration(1_000));
30
30
  }
31
31
 
32
32
  execute(_context: Context, orderId: string): StepDecision {
@@ -59,9 +59,42 @@ heterogeneous Steps with `.otherSteps(...)`. Use
59
59
  Non-starting Steps may use unrelated input types. `Flow` defaults to `void` for
60
60
  Flows without a start input.
61
61
 
62
+ `Worker.start()` synchronizes every registered Indexed Attribute with Dex
63
+ Server before binding its listener. Existing indexes return immediately;
64
+ failure or the default 120-second deadline aborts startup. An indexed
65
+ `AttributeMap` must provide one fixed `indexKey`.
66
+
62
67
  `StepOptions.waitForMethodTimeoutMs` and `executeMethodTimeoutMs` bound the two
63
68
  handler calls. Timer and channel conditions determine how long a Step waits.
64
69
 
70
+ Opt an Attribute or AttributeMap into Attribute Store synchronization, then
71
+ select the Server-configured Store for the Flow:
72
+
73
+ ```typescript
74
+ const email = new Attribute("customer-email", stringCodec)
75
+ .syncToAttributeStore();
76
+ const config: FlowConfig = { attributeStoreName: "profiles" };
77
+ ```
78
+
79
+ The Store is an asynchronous latest-state projection. Deletion writes SQL
80
+ `NULL`, and projection failures do not roll back Flow Attributes. Omitting
81
+ `attributeStoreName` preserves the current target; `attributeStoreName: ""`
82
+ disables future synchronization while retaining protocol presence.
83
+
84
+ ### Waiting and map inspection
85
+
86
+ `Wait.allOf` and `Wait.anyOf` may contain unnamed Conditions and send empty
87
+ Condition IDs. Every Condition in `Wait.anyCombinationOf` needs a non-empty
88
+ user ID; the same Condition object may be reused across combinations.
89
+
90
+ `Client.waitForAttributeEqual` and `waitForAttributeMapEqual` target the current
91
+ run and accept only string, boolean, integer, or double wire values. JSON,
92
+ bytes, and null reject before transport. `AttributeMap.getMapSize` and
93
+ `getAllInstanceKeys` include buffered sets and deletes. The matching
94
+ `ChannelMap` methods are RPC-only, include buffered publishes, and omit empty
95
+ instances. Keys are decoded and sorted. Use
96
+ `forceCompleteIfChannelsEmpty(...)` for conditional completion.
97
+
65
98
  ### Async handlers
66
99
 
67
100
  `Step.execute`, `Step.waitFor`, and RPC methods may be `async` and return a
@@ -93,6 +126,33 @@ Every TypeScript Flow and Step must return an explicit durable name from
93
126
  `getFlowType()` or `getStepType()`. Class names are never used as fallbacks
94
127
  because bundlers and minifiers may rename them.
95
128
 
129
+ ## Errors
130
+
131
+ Client calls reject with concrete `DexServiceError` subclasses. Existing-Flow
132
+ reads (`getAttribute`, `describeFlow`, `waitForFlow`, and `resetFlow`) use
133
+ `FlowNotFoundError`; operations that require a running Flow use
134
+ `FlowNotActiveError`. Start conflicts, worker failures, RPC lock contention,
135
+ and long-poll timeouts use `FlowAlreadyStartedError`,
136
+ `WorkerInvocationError`, `RpcLockConflictError`, and `LongPollTimeoutError`.
137
+
138
+ ```typescript
139
+ try {
140
+ await client.publish(flowId, orders.approved, orderId);
141
+ } catch (error) {
142
+ if (error instanceof FlowNotActiveError) {
143
+ // The Flow is missing or already closed.
144
+ } else {
145
+ throw error;
146
+ }
147
+ }
148
+ ```
149
+
150
+ Every service error retains `code`, `subStatus`, `detail`, `operation`,
151
+ `flowId`, and the original gRPC error as `cause`. `WorkerInvocationError` also
152
+ retains `workerCode`, `workerErrorType`, and `workerErrorDetail`. Registration,
153
+ serialization, and invalid handler returns use `FlowDefinitionError`,
154
+ `ValueMappingError`, and `InvalidStepResultError` instead of transport errors.
155
+
96
156
  ## Source layout
97
157
 
98
158
  Public contracts are grouped by domain under `src/`. The root `src/index.ts`
@@ -113,8 +173,14 @@ continue importing only from `@superdurable/dex`.
113
173
  - `gen/`: checked-in protobuf and grpc-js bindings
114
174
 
115
175
  Run `npm run build:native` once to stage the DXBC Node addon for the current
116
- platform, then `npm test` for runtime contracts and `npm run typecheck` for
117
- strict static contracts. Run `./run-integration-tests.sh` for all 58 IWF
176
+ platform, then `npm test` for runtime contracts, `npm run typecheck` for strict
177
+ static contracts, and `npm run docs:check` for public API documentation. The
178
+ documentation check follows the actual exports of `src/index.ts` and requires
179
+ JSDoc for every public class, interface, type, overload, member, object-style
180
+ enum value, type parameter, input, and output; generated sources are excluded.
181
+ The comments appear in TypeScript language-service and IDE hovers.
182
+
183
+ Run `./run-integration-tests.sh` for all 58 IWF
118
184
  compatibility scenarios against an isolated `dexcli dev` environment. Run
119
185
  `npm run generate:proto` after changing `protos/dex.proto`; `protoc` and its
120
186
  standard protobuf includes must be installed.
@@ -0,0 +1,5 @@
1
+ import type { AttributeSyncConfig } from "./gen/dex.js";
2
+ import type { FlowConfig } from "./options.js";
3
+ export declare function markAttributeStoreSynced<Definition extends object>(definition: Definition): Definition;
4
+ export declare function mapAttributeStoreSync(definition: object): AttributeSyncConfig | undefined;
5
+ export declare function mapAttributeStoreName(config: FlowConfig | undefined): string | undefined;
@@ -0,0 +1,19 @@
1
+ // Copyright (c) 2026 Super Durable, Inc.
2
+ //
3
+ // Licensed under the Super Durable Source License 1.0.
4
+ // You may not use this file except in compliance with the License.
5
+ // See the LICENSE file in the repository root.
6
+ //
7
+ // SPDX-License-Identifier: LicenseRef-Super-Durable-1.0
8
+ const syncedDefinitions = new WeakSet();
9
+ export function markAttributeStoreSynced(definition) {
10
+ syncedDefinitions.add(definition);
11
+ return definition;
12
+ }
13
+ export function mapAttributeStoreSync(definition) {
14
+ return syncedDefinitions.has(definition) ? { enabled: true } : undefined;
15
+ }
16
+ export function mapAttributeStoreName(config) {
17
+ return config?.attributeStoreName;
18
+ }
19
+ //# sourceMappingURL=attribute-store-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute-store-sync.js","sourceRoot":"","sources":["../../src/attribute-store-sync.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,uDAAuD;AACvD,mEAAmE;AACnE,+CAA+C;AAC/C,EAAE;AACF,wDAAwD;AAKxD,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAU,CAAC;AAEhD,MAAM,UAAU,wBAAwB,CACtC,UAAsB;IAEtB,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,UAAkB;IAElB,OAAO,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA8B;IAClE,OAAO,MAAM,EAAE,kBAAkB,CAAC;AACpC,CAAC"}
@@ -1,14 +1,50 @@
1
+ /** Configures the local persistent cache for large Dex values. */
1
2
  export interface BlobCacheConfig {
3
+ /** Writable directory used for cache payloads and metadata. */
2
4
  readonly directory: string;
5
+ /** Positive maximum on-disk payload size in bytes. */
3
6
  readonly maxBytes: number;
7
+ /** Admission-policy counter count; zero or `undefined` uses the native default. */
4
8
  readonly frequencyCounters?: number;
5
9
  }
10
+ /** Provides concurrent, bounded storage for content-addressed Dex blobs. */
6
11
  export interface BlobCache {
12
+ /** Effective configuration used by this cache. */
7
13
  readonly config: BlobCacheConfig;
14
+ /**
15
+ * Reads a cached payload without contacting Dex.
16
+ * @param blobId - Opaque server-assigned blob identifier.
17
+ * @returns A copied payload, or `undefined` when absent.
18
+ */
8
19
  get(blobId: string): Uint8Array | undefined;
20
+ /**
21
+ * Offers a payload to the bounded cache.
22
+ * @param blobId - Opaque server-assigned blob identifier.
23
+ * @param payload - Bytes copied into native storage.
24
+ * @returns `true` when admitted or `false` when rejected by policy.
25
+ */
9
26
  put(blobId: string, payload: Uint8Array): boolean;
27
+ /**
28
+ * Deletes one cached payload when present.
29
+ * @param blobId - Opaque identifier to remove.
30
+ */
10
31
  delete(blobId: string): void;
32
+ /** Deletes every payload while keeping the cache open. */
11
33
  deleteAll(): void;
34
+ /** Flushes metadata and releases native resources; repeated calls are safe. */
12
35
  close(): void;
13
36
  }
37
+ /**
38
+ * Opens or creates a native BlobCache owned by the caller.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const cache = openBlobCache({ directory: ".dex-cache", maxBytes: 64 * 1024 ** 2 });
43
+ * try { cache.put("blob-1", new Uint8Array([1, 2])); } finally { cache.close(); }
44
+ * ```
45
+ * @param config - Directory, positive byte capacity, and optional counter count.
46
+ * @returns An open cache that must be closed at application shutdown.
47
+ * @throws {@link TypeError} when the directory is empty.
48
+ * @throws {@link RangeError} when a numeric setting is invalid.
49
+ */
14
50
  export declare function openBlobCache(config: BlobCacheConfig): BlobCache;
@@ -10,6 +10,19 @@ import { dirname, join } from "node:path";
10
10
  import { fileURLToPath } from "node:url";
11
11
  const require = createRequire(import.meta.url);
12
12
  let nativeModule;
13
+ /**
14
+ * Opens or creates a native BlobCache owned by the caller.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const cache = openBlobCache({ directory: ".dex-cache", maxBytes: 64 * 1024 ** 2 });
19
+ * try { cache.put("blob-1", new Uint8Array([1, 2])); } finally { cache.close(); }
20
+ * ```
21
+ * @param config - Directory, positive byte capacity, and optional counter count.
22
+ * @returns An open cache that must be closed at application shutdown.
23
+ * @throws {@link TypeError} when the directory is empty.
24
+ * @throws {@link RangeError} when a numeric setting is invalid.
25
+ */
13
26
  export function openBlobCache(config) {
14
27
  if (config.directory.length === 0) {
15
28
  throw new TypeError("blob cache directory is required");
@@ -1 +1 @@
1
- {"version":3,"file":"blob-cache.js","sourceRoot":"","sources":["../../src/blob-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blob-cache.js","sourceRoot":"","sources":["../../src/blob-cache.ts"],"names":[],"mappings":"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"}
@@ -6,33 +6,234 @@ import { type ClientOptions, type FlowConfig, type FlowInfo, type ResetFlowOptio
6
6
  import { AttributeMap, type Attribute } from "./persistence.js";
7
7
  import type { RPCResult } from "./rpc.js";
8
8
  import { ChannelMap, type Channel } from "./wait.js";
9
+ /**
10
+ * Calls Dex FlowService through registered, typed Flow definitions.
11
+ *
12
+ * Methods perform asynchronous gRPC I/O. A Client owns its service connection but
13
+ * not its Registry or BlobCache; call `close` during application shutdown.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const client = new Client(registry, cache);
18
+ * try {
19
+ * const runId = await client.startFlow(orders, "order-42", input);
20
+ * const result = await client.waitForFlow("order-42", orderResultCodec);
21
+ * } finally { await client.close(); }
22
+ * ```
23
+ */
9
24
  export declare class Client {
10
25
  readonly registry: Registry;
11
26
  readonly blobCache: BlobCache;
12
27
  readonly options: ClientOptions;
13
28
  private readonly service;
14
29
  private readonly hydrator;
30
+ /**
31
+ * Constructs a Client and lazy plaintext gRPC connection.
32
+ * @param registry - Flow definitions used for validation and routing.
33
+ * @param blobCache - Open cache used to hydrate large response values.
34
+ * @param options - Service address and default Worker target.
35
+ */
15
36
  constructor(registry: Registry, blobCache: BlobCache, options?: ClientOptions);
37
+ /**
38
+ * Starts a Flow and returns after Dex accepts it.
39
+ * @typeParam StartInput - Starting Step input type.
40
+ * @param flow - Exact Flow instance registered with this Client.
41
+ * @param flowId - Non-empty application ID stable across runs.
42
+ * @param input - Starting Step input, or `undefined` when no start Step exists.
43
+ * @param options - Timeout, reuse, retry, configuration, and initial state.
44
+ * @returns The server-assigned run ID.
45
+ * @throws {@link FlowAlreadyStartedError} when reuse policy rejects the Flow ID.
46
+ * @throws {@link FlowDefinitionError} when `flow` is not registered.
47
+ */
16
48
  startFlow<StartInput>(flow: Flow<StartInput>, flowId: string, input: StartInput, options?: StartFlowOptions): Promise<string>;
17
- invokeRPC<Input, Output>(rpcMethod: (context: Context, input: Input) => RPCResult<Output>, flowId: string, input: Input, runId?: string): Promise<Output>;
18
- invokeRPC<Output>(rpcMethod: (context: Context) => RPCResult<Output>, flowId: string, runId?: string): Promise<Output>;
19
- invokeRPC<Input>(rpcMethod: (context: Context, input: Input) => void, flowId: string, input: Input, runId?: string): Promise<void>;
20
- invokeRPC(rpcMethod: (context: Context) => void, flowId: string, runId?: string): Promise<void>;
49
+ /**
50
+ * Invokes an RPC with typed input and output.
51
+ * @typeParam Input - RPC input type.
52
+ * @typeParam Output - RPC output type.
53
+ * @param rpcMethod - Bound method decorated with `rpc` on the registered Flow.
54
+ * @param flowId - Non-empty target Flow ID.
55
+ * @param input - Typed handler input.
56
+ * @param runId - Optional exact run; targets the active run when omitted.
57
+ * @returns The decoded RPCResult output.
58
+ */
59
+ invokeRPC<Input, Output>(rpcMethod: (context: Context, input: Input) => RPCResult<Output> | Promise<RPCResult<Output>>, flowId: string, input: Input, runId?: string): Promise<Output>;
60
+ /**
61
+ * Invokes an input-free RPC with typed output.
62
+ * @typeParam Output - RPC output type.
63
+ * @param rpcMethod - Bound method decorated with `rpc` on the registered Flow.
64
+ * @param flowId - Non-empty target Flow ID.
65
+ * @param runId - Optional exact run; targets the active run when omitted.
66
+ * @returns The decoded RPCResult output.
67
+ */
68
+ invokeRPC<Output>(rpcMethod: (context: Context) => RPCResult<Output> | Promise<RPCResult<Output>>, flowId: string, runId?: string): Promise<Output>;
69
+ /**
70
+ * Invokes a typed-input RPC that returns no output.
71
+ * @typeParam Input - RPC input type.
72
+ * @param rpcMethod - Bound method decorated with `rpc` on the registered Flow.
73
+ * @param flowId - Non-empty target Flow ID.
74
+ * @param input - Typed handler input.
75
+ * @param runId - Optional exact run; targets the active run when omitted.
76
+ * @returns A promise resolved after successful handler completion.
77
+ */
78
+ invokeRPC<Input>(rpcMethod: (context: Context, input: Input) => void | Promise<void>, flowId: string, input: Input, runId?: string): Promise<void>;
79
+ /**
80
+ * Invokes an input-free, output-free RPC.
81
+ * @param rpcMethod - Bound method decorated with `rpc` on the registered Flow.
82
+ * @param flowId - Non-empty target Flow ID.
83
+ * @param runId - Optional exact run; targets the active run when omitted.
84
+ * @returns A promise resolved after successful handler completion.
85
+ */
86
+ invokeRPC(rpcMethod: (context: Context) => void | Promise<void>, flowId: string, runId?: string): Promise<void>;
87
+ /**
88
+ * Reads a singleton Attribute.
89
+ * @typeParam T - Attribute value type.
90
+ * @param flowId - Non-empty existing Flow ID.
91
+ * @param attribute - Typed singleton Attribute definition.
92
+ * @param runId - Optional exact run; targets the current run when omitted.
93
+ * @returns The decoded value, or `undefined` when unset.
94
+ */
21
95
  getAttribute<T>(flowId: string, attribute: Attribute<T>, runId?: string): Promise<T | undefined>;
96
+ /**
97
+ * Reads one AttributeMap instance.
98
+ * @typeParam T - Attribute value type.
99
+ * @param flowId - Non-empty existing Flow ID.
100
+ * @param attribute - Typed AttributeMap definition.
101
+ * @param instance - Non-empty logical map key.
102
+ * @param runId - Optional exact run; targets the current run when omitted.
103
+ * @returns The decoded value, or `undefined` when unset.
104
+ */
22
105
  getAttribute<T>(flowId: string, attribute: AttributeMap<T>, instance: string, runId?: string): Promise<T | undefined>;
106
+ /**
107
+ * Writes a singleton Attribute on an active Flow.
108
+ * @typeParam T - Attribute value type.
109
+ * @param flowId - Non-empty active Flow ID.
110
+ * @param attribute - Typed singleton Attribute definition.
111
+ * @param value - Value encoded by the Attribute codec.
112
+ * @param runId - Optional exact run; targets the active run when omitted.
113
+ * @returns A promise resolved after Dex applies the write.
114
+ */
23
115
  setAttribute<T>(flowId: string, attribute: Attribute<T>, value: T, runId?: string): Promise<void>;
116
+ /**
117
+ * Writes one AttributeMap instance on an active Flow.
118
+ * @typeParam T - Attribute value type.
119
+ * @param flowId - Non-empty active Flow ID.
120
+ * @param attribute - Typed AttributeMap definition.
121
+ * @param instance - Non-empty logical map key.
122
+ * @param value - Value encoded by the Attribute codec.
123
+ * @param runId - Optional exact run; targets the active run when omitted.
124
+ * @returns A promise resolved after Dex applies the write.
125
+ */
24
126
  setAttribute<T>(flowId: string, attribute: AttributeMap<T>, instance: string, value: T, runId?: string): Promise<void>;
127
+ /**
128
+ * Publishes one or more values to a singleton Channel.
129
+ * @typeParam T - Channel element type.
130
+ * @param flowId - Non-empty active Flow ID.
131
+ * @param channel - Typed singleton Channel definition.
132
+ * @param values - Values appended in argument order.
133
+ * @returns A promise resolved after Dex accepts the batch.
134
+ */
25
135
  publish<T>(flowId: string, channel: Channel<T>, ...values: readonly T[]): Promise<void>;
136
+ /**
137
+ * Publishes one or more values to a ChannelMap instance.
138
+ * @typeParam T - Channel element type.
139
+ * @param flowId - Non-empty active Flow ID.
140
+ * @param channel - Typed ChannelMap definition.
141
+ * @param instance - Non-empty logical map key.
142
+ * @param values - Values appended in argument order.
143
+ * @returns A promise resolved after Dex accepts the batch.
144
+ */
26
145
  publish<T>(flowId: string, channel: ChannelMap<T>, instance: string, ...values: readonly T[]): Promise<void>;
146
+ /**
147
+ * Waits for successful Flow completion without decoding output.
148
+ * @param flowId - Non-empty existing Flow ID.
149
+ * @returns A promise resolved on successful completion.
150
+ */
27
151
  waitForFlow(flowId: string): Promise<void>;
152
+ /**
153
+ * Waits for successful Flow completion and decodes the latest Step output.
154
+ * @typeParam Output - Expected completion output type.
155
+ * @param flowId - Non-empty existing Flow ID.
156
+ * @param outputCodec - Codec for the expected output.
157
+ * @param timeoutMs - Optional server-side long-poll duration in milliseconds.
158
+ * @returns The decoded latest completed Step output.
159
+ */
28
160
  waitForFlow<Output>(flowId: string, outputCodec: Codec<Output>, timeoutMs?: number): Promise<Output>;
161
+ /**
162
+ * Requests cancellation, termination, or failure of an active Flow.
163
+ * The promise resolves after acceptance and does not await terminal status.
164
+ * @param flowId - Non-empty active Flow ID.
165
+ * @param options - Stop mode and optional recorded reason.
166
+ */
29
167
  stopFlow(flowId: string, options?: StopFlowOptions): Promise<void>;
168
+ /**
169
+ * Returns summary metadata for the current or latest Flow run.
170
+ * @param flowId - Non-empty existing Flow ID.
171
+ * @returns Flow ID, run ID, type, status, and UTC start time.
172
+ */
30
173
  describeFlow(flowId: string): Promise<FlowInfo>;
174
+ /**
175
+ * Returns one page of Flow runs matching a visibility query.
176
+ * @param query - Dex visibility query; empty uses server defaults.
177
+ * @param pageSize - Non-negative requested maximum result count.
178
+ * @param nextPageToken - Opaque token from the preceding page, or empty first.
179
+ * @returns Server-ordered entries and the next-page token.
180
+ */
31
181
  searchFlows(query: string, pageSize: number, nextPageToken?: string): Promise<SearchFlowsPage>;
32
182
  private mapSearchEntry;
183
+ /**
184
+ * Creates a new run from a selected point in existing Flow history.
185
+ * @param flowId - Non-empty Flow ID whose history is reset.
186
+ * @param options - Reset selector, reason, and replay controls.
187
+ * @returns The new server-assigned run ID; the Flow ID remains unchanged.
188
+ */
33
189
  resetFlow(flowId: string, options: ResetFlowOptions): Promise<string>;
190
+ /**
191
+ * Makes one waiting Timer condition immediately ready.
192
+ * @param flowId - Non-empty active Flow ID.
193
+ * @param stepExecutionId - Step type and positive execution number.
194
+ * @param timerId - Exactly one Timer condition ID or zero-based index.
195
+ */
34
196
  skipTimer(flowId: string, stepExecutionId: StepExecutionId, timerId: TimerId): Promise<void>;
197
+ /**
198
+ * Long-polls until one Step execution completes.
199
+ * @param flowId - Non-empty active Flow ID.
200
+ * @param stepExecutionId - Step type and positive execution number.
201
+ * @param timeoutMs - Non-negative server-side wait duration in milliseconds.
202
+ * @throws {@link LongPollTimeoutError} when completion is not observed in time.
203
+ */
35
204
  waitForStepCompletion(flowId: string, stepExecutionId: StepExecutionId, timeoutMs: number): Promise<void>;
205
+ /**
206
+ * Waits until a scalar Attribute in the current run equals the expected value.
207
+ * Generates a request ID and rejects JSON, bytes, and null before transport.
208
+ * @typeParam T - Attribute value type.
209
+ * @param flowId - Non-empty active Flow ID.
210
+ * @param attribute - Registered scalar Attribute to observe.
211
+ * @param expected - String, boolean, integer, or number value to await.
212
+ * @param timeoutMs - Non-negative server-side wait duration in milliseconds.
213
+ */
214
+ waitForAttributeEqual<T>(flowId: string, attribute: Attribute<T>, expected: T, timeoutMs: number): Promise<void>;
215
+ /**
216
+ * Waits until one scalar AttributeMap instance in the current run matches.
217
+ * Scalar restrictions and timeout errors match `waitForAttributeEqual`.
218
+ * @typeParam T - AttributeMap value type.
219
+ * @param flowId - Non-empty active Flow ID.
220
+ * @param attribute - Registered AttributeMap to observe.
221
+ * @param instance - Non-empty logical map key to observe.
222
+ * @param expected - String, boolean, integer, or number value to await.
223
+ * @param timeoutMs - Non-negative server-side wait duration in milliseconds.
224
+ */
225
+ waitForAttributeMapEqual<T>(flowId: string, attribute: AttributeMap<T>, instance: string, expected: T, timeoutMs: number): Promise<void>;
226
+ private waitForAttributeValue;
227
+ /**
228
+ * Replaces mutable configuration for an active Flow.
229
+ * The update affects later decisions and does not recall dispatched work.
230
+ * @param flowId - Non-empty active Flow ID.
231
+ * @param config - New optional Flow configuration fields.
232
+ */
36
233
  updateFlowConfig(flowId: string, config: FlowConfig): Promise<void>;
234
+ /**
235
+ * Closes the owned FlowService connection.
236
+ * Registry and BlobCache ownership remains with the caller.
237
+ */
37
238
  close(): Promise<void>;
38
239
  }