@lostgradient/weft 0.9.0 → 0.11.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.
- package/README.md +12 -4
- package/dist/alerting/alert-manager.d.ts +3 -1
- package/dist/alerting/alert-manager.js +5 -2
- package/dist/cli-main.js +63 -63
- package/dist/core/checkpoint/serialization.js +2 -2
- package/dist/core/context/index.d.ts +2 -1
- package/dist/core/context/index.js +8 -0
- package/dist/core/context/operation-request.d.ts +2 -0
- package/dist/core/context/parallel-cache-entry.d.ts +1 -1
- package/dist/core/context/parallel-cache-entry.js +12 -8
- package/dist/core/context/parallel-operations.d.ts +1 -1
- package/dist/core/context/parallel-operations.js +50 -8
- package/dist/core/engine/async-activity-completion.d.ts +24 -54
- package/dist/core/engine/async-activity-completion.js +25 -90
- package/dist/core/engine/async-activity-records.d.ts +106 -0
- package/dist/core/engine/async-activity-records.js +124 -0
- package/dist/core/engine/bulk-operations-purge.js +2 -1
- package/dist/core/engine/callback-creators-core.js +1 -0
- package/dist/core/engine/construction.d.ts +1 -3
- package/dist/core/engine/construction.js +2 -5
- package/dist/core/engine/deferred-consume-envelope.d.ts +10 -1
- package/dist/core/engine/deferred-consume-envelope.js +9 -1
- package/dist/core/engine/disposal.js +4 -0
- package/dist/core/engine/engine-internal-types.d.ts +1 -0
- package/dist/core/engine/engine-leak-warnings.d.ts +2 -0
- package/dist/core/engine/engine-leak-warnings.js +7 -1
- package/dist/core/engine/engine-runtime-helpers.d.ts +8 -0
- package/dist/core/engine/engine-runtime-helpers.js +9 -0
- package/dist/core/engine/errors.js +1 -1
- package/dist/core/engine/index.d.ts +18 -5
- package/dist/core/engine/index.js +41 -10
- package/dist/core/engine/inline-parking.js +14 -1
- package/dist/core/engine/internals.d.ts +23 -2
- package/dist/core/engine/lifecycle/recovered-services.d.ts +4 -2
- package/dist/core/engine/lifecycle/recovered-services.js +37 -7
- package/dist/core/engine/lifecycle/resume.d.ts +2 -2
- package/dist/core/engine/lifecycle/resume.js +39 -7
- package/dist/core/engine/lifecycle/shared.d.ts +34 -0
- package/dist/core/engine/lifecycle/transition.d.ts +1 -1
- package/dist/core/engine/lifecycle/transition.js +3 -3
- package/dist/core/engine/lifecycle.d.ts +1 -1
- package/dist/core/engine/memo-durable-activity.js +7 -9
- package/dist/core/engine/operations-activity.js +1 -1
- package/dist/core/engine/operations-coordination.d.ts +15 -1
- package/dist/core/engine/operations-coordination.js +43 -10
- package/dist/core/engine/operations-time.js +8 -28
- package/dist/core/engine/ownership-options.d.ts +1 -0
- package/dist/core/engine/ownership-options.js +14 -0
- package/dist/core/engine/retention.js +4 -0
- package/dist/core/engine/schedule-run-metadata.d.ts +3 -0
- package/dist/core/engine/schedule-run-metadata.js +29 -0
- package/dist/core/engine/schedule-run.js +19 -4
- package/dist/core/engine/schedules.js +4 -3
- package/dist/core/engine/sleep-timer-acknowledgements.d.ts +15 -0
- package/dist/core/engine/sleep-timer-acknowledgements.js +144 -0
- package/dist/core/engine/sub-operation.js +6 -13
- package/dist/core/engine/termination/cleanup.js +6 -1
- package/dist/core/types/options.d.ts +12 -0
- package/dist/core/types/services-resolution.d.ts +8 -3
- package/dist/core/types/workflow-builder.d.ts +2 -2
- package/dist/core/types/workflow-context.d.ts +27 -0
- package/dist/index.d.ts +2 -2
- package/dist/mcp/cli.js +17 -17
- package/dist/server/authorization.d.ts +3 -3
- package/dist/server/fault-to-json-rpc.d.ts +2 -1
- package/dist/server/handler.js +22 -22
- package/dist/server/index.js +17 -17
- package/dist/server/json-rpc-dispatch.d.ts +2 -2
- package/dist/server/json-rpc-parse.d.ts +1 -1
- package/dist/server/json-rpc-protocol.d.ts +2 -2
- package/dist/server/json-rpc-websocket.d.ts +1 -1
- package/dist/server/operation-fault.d.ts +3 -1
- package/dist/server/operations/async-activity.js +2 -2
- package/dist/server/principal.d.ts +2 -2
- package/dist/server/stdio-session.d.ts +4 -4
- package/dist/service-worker/index.js +13 -13
- package/dist/service-worker/scheduler.js +1 -0
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/http.js +2 -2
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/indexeddb.js +1 -1
- package/dist/storage/interface.d.ts +1 -0
- package/dist/storage/interface.js +1 -1
- package/dist/storage/lazy-postgres-pool.d.ts +38 -0
- package/dist/storage/lazy-postgres-pool.js +38 -0
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon-batch.d.ts +8 -8
- package/dist/storage/neon.d.ts +26 -79
- package/dist/storage/neon.js +3 -3
- package/dist/storage/postgres-key-value-queries.d.ts +1 -1
- package/dist/storage/postgres-key-value-queries.js +1 -1
- package/dist/storage/postgres-key-value-storage.d.ts +110 -0
- package/dist/storage/postgres-key-value-storage.js +204 -0
- package/dist/storage/postgres.d.ts +59 -0
- package/dist/storage/postgres.js +15 -0
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/testing.js +1 -1
- package/dist/storage/turso.js +1 -1
- package/dist/storage/typed-storage.js +1 -1
- package/dist/storage/web-extension.js +1 -1
- package/dist/testing/index.js +17 -17
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +17 -4
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
export async function handleSleepTimerWithAcknowledgement(internals, entry, loadWorkflowState) {
|
|
2
|
+
const operationId = entry.id.replace("sleep:", "");
|
|
3
|
+
if (await shouldIgnoreUnclaimedSleepTimer(internals, entry, operationId, loadWorkflowState))
|
|
4
|
+
return;
|
|
5
|
+
const acknowledgement = internals.inlineStrategy === null ? null : createSleepTimerAcknowledgement(internals, entry.workflowId, operationId, entry.fireAt);
|
|
6
|
+
if (!resolveSleepTimer(internals, entry)) {
|
|
7
|
+
acknowledgement?.cancel();
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
await acknowledgement?.promise;
|
|
11
|
+
}
|
|
12
|
+
async function shouldIgnoreUnclaimedSleepTimer(internals, entry, operationId, loadWorkflowState) {
|
|
13
|
+
const resolverKey = `${entry.workflowId}:${operationId}`;
|
|
14
|
+
if (internals.sleepResolvers.has(resolverKey) || internals.inlineStrategy === null)
|
|
15
|
+
return !1;
|
|
16
|
+
const durableOperation = internals.durableInlineOperations.get(entry.workflowId);
|
|
17
|
+
if (durableOperationBelongsToAnotherOperation(durableOperation, operationId))
|
|
18
|
+
return !0;
|
|
19
|
+
if (workflowReplayIsAdvancing(internals, entry.workflowId))
|
|
20
|
+
return !1;
|
|
21
|
+
if ((await loadWorkflowState(entry.workflowId))?.status !== "running")
|
|
22
|
+
return !0;
|
|
23
|
+
throw Error(`Sleep timer "${entry.id}" fired before workflow "${entry.workflowId}" was ready to consume it.`);
|
|
24
|
+
}
|
|
25
|
+
function durableOperationBelongsToAnotherOperation(durableOperation, operationId) {
|
|
26
|
+
if (durableOperation === void 0)
|
|
27
|
+
return !1;
|
|
28
|
+
if (durableOperation.type !== "sleep")
|
|
29
|
+
return !0;
|
|
30
|
+
return durableOperation.operationId !== operationId;
|
|
31
|
+
}
|
|
32
|
+
function workflowReplayIsAdvancing(internals, workflowId) {
|
|
33
|
+
const inlineStrategy = internals.inlineStrategy;
|
|
34
|
+
if (inlineStrategy === null)
|
|
35
|
+
return !1;
|
|
36
|
+
return inlineStrategy.waitForWorkflowAdvance(workflowId) !== void 0 || inlineStrategy.waitForWorkflowTurn(workflowId) !== void 0;
|
|
37
|
+
}
|
|
38
|
+
function removeWaiter(internals, workflowId, waiter) {
|
|
39
|
+
const workflowWaiters = internals.sleepTimerAcknowledgementWaiters.get(workflowId);
|
|
40
|
+
if (!workflowWaiters)
|
|
41
|
+
return;
|
|
42
|
+
workflowWaiters.delete(waiter);
|
|
43
|
+
if (workflowWaiters.size === 0)
|
|
44
|
+
internals.sleepTimerAcknowledgementWaiters.delete(workflowId);
|
|
45
|
+
}
|
|
46
|
+
export function createSleepTimerAcknowledgement(internals, workflowId, operationId, fireAt) {
|
|
47
|
+
const { promise, reject, resolve } = Promise.withResolvers(), waiter = { fireAt, operationId, reject, resolve };
|
|
48
|
+
let workflowWaiters = internals.sleepTimerAcknowledgementWaiters.get(workflowId);
|
|
49
|
+
if (!workflowWaiters) {
|
|
50
|
+
workflowWaiters = new Set;
|
|
51
|
+
internals.sleepTimerAcknowledgementWaiters.set(workflowId, workflowWaiters);
|
|
52
|
+
}
|
|
53
|
+
workflowWaiters.add(waiter);
|
|
54
|
+
return {
|
|
55
|
+
promise,
|
|
56
|
+
cancel: () => {
|
|
57
|
+
removeWaiter(internals, workflowId, waiter);
|
|
58
|
+
resolve();
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function recordDurableInlineOperation(internals, workflowId, operation) {
|
|
63
|
+
const durableOperation = {
|
|
64
|
+
operationId: operation.operationId,
|
|
65
|
+
type: operation.type,
|
|
66
|
+
...operation.type === "sleep" && { scheduledFireAt: operation.scheduledFireAt }
|
|
67
|
+
};
|
|
68
|
+
internals.durableInlineOperations.set(workflowId, durableOperation);
|
|
69
|
+
const workflowWaiters = internals.sleepTimerAcknowledgementWaiters.get(workflowId);
|
|
70
|
+
if (!workflowWaiters)
|
|
71
|
+
return;
|
|
72
|
+
for (const waiter of workflowWaiters) {
|
|
73
|
+
const stillWaitingOnThisSleep = durableOperation.type === "sleep" && durableOperation.operationId === waiter.operationId, supersededByLaterDeadline = stillWaitingOnThisSleep && durableOperation.scheduledFireAt !== void 0 && waiter.fireAt < durableOperation.scheduledFireAt;
|
|
74
|
+
if (stillWaitingOnThisSleep && !supersededByLaterDeadline)
|
|
75
|
+
continue;
|
|
76
|
+
removeWaiter(internals, workflowId, waiter);
|
|
77
|
+
waiter.resolve();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function settleSleepTimerAcknowledgements(internals, workflowId, disposition) {
|
|
81
|
+
internals.durableInlineOperations.delete(workflowId);
|
|
82
|
+
if (disposition === "suspended") {
|
|
83
|
+
rejectSleepTimerAcknowledgements(internals, workflowId, Error(`Workflow "${workflowId}" was suspended before its sleep timer was acknowledged.`));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const workflowWaiters = internals.sleepTimerAcknowledgementWaiters.get(workflowId);
|
|
87
|
+
if (!workflowWaiters)
|
|
88
|
+
return;
|
|
89
|
+
internals.sleepTimerAcknowledgementWaiters.delete(workflowId);
|
|
90
|
+
for (const waiter of workflowWaiters)
|
|
91
|
+
waiter.resolve();
|
|
92
|
+
}
|
|
93
|
+
export function acknowledgeSupersededSleepTimers(internals, workflowId, currentDeadline) {
|
|
94
|
+
const workflowWaiters = internals.sleepTimerAcknowledgementWaiters.get(workflowId);
|
|
95
|
+
if (!workflowWaiters)
|
|
96
|
+
return;
|
|
97
|
+
for (const waiter of workflowWaiters) {
|
|
98
|
+
if (waiter.fireAt >= currentDeadline)
|
|
99
|
+
continue;
|
|
100
|
+
removeWaiter(internals, workflowId, waiter);
|
|
101
|
+
waiter.resolve();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export function rejectSleepTimerAcknowledgements(internals, workflowId, error) {
|
|
105
|
+
const workflowWaiters = internals.sleepTimerAcknowledgementWaiters.get(workflowId);
|
|
106
|
+
if (!workflowWaiters)
|
|
107
|
+
return;
|
|
108
|
+
internals.sleepTimerAcknowledgementWaiters.delete(workflowId);
|
|
109
|
+
const rejection = error instanceof Error ? error : Error(String(error));
|
|
110
|
+
for (const waiter of workflowWaiters)
|
|
111
|
+
waiter.reject(rejection);
|
|
112
|
+
}
|
|
113
|
+
export function rejectAllSleepTimerAcknowledgements(internals, error) {
|
|
114
|
+
for (const workflowId of internals.sleepTimerAcknowledgementWaiters.keys())
|
|
115
|
+
rejectSleepTimerAcknowledgements(internals, workflowId, error);
|
|
116
|
+
}
|
|
117
|
+
export function resolveSleepTimer(internals, entry) {
|
|
118
|
+
const operationId = entry.id.replace("sleep:", ""), resolverKey = `${entry.workflowId}:${operationId}`, resolver = internals.sleepResolvers.get(resolverKey);
|
|
119
|
+
if (!resolver) {
|
|
120
|
+
let workflowMarkers = internals.sleepTimersFiredWithoutResolver.get(entry.workflowId);
|
|
121
|
+
if (!workflowMarkers) {
|
|
122
|
+
workflowMarkers = new Map;
|
|
123
|
+
internals.sleepTimersFiredWithoutResolver.set(entry.workflowId, workflowMarkers);
|
|
124
|
+
}
|
|
125
|
+
const existing = workflowMarkers.get(operationId);
|
|
126
|
+
if (existing === void 0 || entry.fireAt > existing)
|
|
127
|
+
workflowMarkers.set(operationId, entry.fireAt);
|
|
128
|
+
return !0;
|
|
129
|
+
}
|
|
130
|
+
if (entry.fireAt < resolver.fireAt)
|
|
131
|
+
return !1;
|
|
132
|
+
internals.sleepResolvers.delete(resolverKey);
|
|
133
|
+
untrackSleepResolver(internals, entry.workflowId, operationId);
|
|
134
|
+
resolver.resolve();
|
|
135
|
+
return !0;
|
|
136
|
+
}
|
|
137
|
+
function untrackSleepResolver(internals, workflowId, operationId) {
|
|
138
|
+
const workflowOperations = internals.sleepResolversByWorkflow.get(workflowId);
|
|
139
|
+
if (!workflowOperations)
|
|
140
|
+
return;
|
|
141
|
+
workflowOperations.delete(operationId);
|
|
142
|
+
if (workflowOperations.size === 0)
|
|
143
|
+
internals.sleepResolversByWorkflow.delete(workflowId);
|
|
144
|
+
}
|
|
@@ -16,7 +16,10 @@ import {
|
|
|
16
16
|
executeActivityOperationResult
|
|
17
17
|
} from "./operations-activity.js";
|
|
18
18
|
import {
|
|
19
|
-
|
|
19
|
+
assertValidRaceBranchNames,
|
|
20
|
+
executeRaceSubOperations,
|
|
21
|
+
executeRunAllOperationResult,
|
|
22
|
+
wrapRaceWinner
|
|
20
23
|
} from "./operations-coordination.js";
|
|
21
24
|
import { callMemoFunction } from "./state-utilities.js";
|
|
22
25
|
export async function processWaitReviewOperation(_internals, workflowId, operation, callbacks) {
|
|
@@ -82,16 +85,6 @@ async function executeParallelSubOperation(internals, workflowId, operation, cal
|
|
|
82
85
|
}
|
|
83
86
|
async function executeRaceSubOperation(internals, workflowId, operation, callbacks, signal, speculativeState) {
|
|
84
87
|
signal?.throwIfAborted();
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
};
|
|
88
|
-
signal?.addEventListener("abort", abortNestedRace, { once: !0 });
|
|
89
|
-
const subOperations = operation.operations.map((subOperation) => executeSubOperation(internals, workflowId, subOperation, callbacks, controller.signal, speculativeState));
|
|
90
|
-
Promise.allSettled(subOperations);
|
|
91
|
-
try {
|
|
92
|
-
return await Promise.race(subOperations);
|
|
93
|
-
} finally {
|
|
94
|
-
signal?.removeEventListener("abort", abortNestedRace);
|
|
95
|
-
controller.abort();
|
|
96
|
-
}
|
|
88
|
+
assertValidRaceBranchNames(operation);
|
|
89
|
+
return executeRaceSubOperations(internals, workflowId, operation.operations, (subOperation, branchSignal) => executeSubOperation(internals, workflowId, subOperation, callbacks, branchSignal, speculativeState), signal, (winnerIndex, value) => wrapRaceWinner(operation, winnerIndex, value));
|
|
97
90
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { KEYS, encodeStorageKeyComponent, storageHas } from "../../../storage/interface.js";
|
|
2
2
|
import { CleanupWarningEvent } from "../../events.js";
|
|
3
|
-
import { asyncActivityWorkflowPrefix } from "../async-activity-
|
|
3
|
+
import { asyncActivityWorkflowPrefix } from "../async-activity-records.js";
|
|
4
4
|
import { forgetCommittedCheckpointBytes } from "../checkpoint-commit-snapshots.js";
|
|
5
|
+
import { settleSleepTimerAcknowledgements } from "../sleep-timer-acknowledgements.js";
|
|
5
6
|
import { parseTerminalCleanupTimerId, workflowFeedListenerKey } from "../state-utilities.js";
|
|
6
7
|
import { releaseWorkflowConcurrencySlot } from "../workflow-concurrency.js";
|
|
7
8
|
export const TERMINAL_WORKFLOW_STATUSES = new Set([
|
|
@@ -102,6 +103,7 @@ export function cleanupWaiters(internals, workflowId, callbacks) {
|
|
|
102
103
|
internals.workflowTypeByWorkflowId.delete(workflowId);
|
|
103
104
|
}
|
|
104
105
|
export function evictSuspendedWorkflowWaiters(internals, workflowId, callbacks) {
|
|
106
|
+
settleSleepTimerAcknowledgements(internals, workflowId, "suspended");
|
|
105
107
|
for (const kind of TRACKED_WAITER_KINDS)
|
|
106
108
|
cleanupTrackedWaiter(internals, workflowId, kind);
|
|
107
109
|
evictSleepResolversWithoutResolving(internals, workflowId);
|
|
@@ -148,6 +150,7 @@ export async function cleanupWorkflowStorage(internals, workflowId, includeOutpu
|
|
|
148
150
|
await flush();
|
|
149
151
|
}
|
|
150
152
|
export function cleanupTerminalWorkflowMemory(internals, workflowId, callbacks) {
|
|
153
|
+
settleSleepTimerAcknowledgements(internals, workflowId, "terminal");
|
|
151
154
|
internals.workflowsNeedingTerminalCleanup.delete(workflowId);
|
|
152
155
|
forgetCommittedCheckpointBytes(internals, workflowId);
|
|
153
156
|
internals.checkpoints.delete(workflowId);
|
|
@@ -194,7 +197,9 @@ export async function runDeferredTerminalCleanup(internals, workflowId, timerId,
|
|
|
194
197
|
if (state.terminalCleanupToken !== parsedTimer.terminalCleanupToken)
|
|
195
198
|
return;
|
|
196
199
|
try {
|
|
200
|
+
await finalizeScheduledWorkflowTerminal(internals, workflowId, callbacks);
|
|
197
201
|
await cleanupTerminalWorkflowDurableState(internals, workflowId, parsedTimer.includeOutputArtifacts, callbacks);
|
|
202
|
+
await internals.storage.delete(KEYS.scheduleRun(workflowId));
|
|
198
203
|
} catch (error) {
|
|
199
204
|
callbacks.handleCleanupError("cleanupTerminalWorkflowDurableState", error, workflowId);
|
|
200
205
|
throw error;
|
|
@@ -218,6 +218,18 @@ export interface ForkOptions {
|
|
|
218
218
|
export interface EngineOptions<TServices = unknown> {
|
|
219
219
|
storage?: WeftStorage;
|
|
220
220
|
development?: boolean;
|
|
221
|
+
/**
|
|
222
|
+
* Select how engine-owned periodic work is driven. The default `'automatic'`
|
|
223
|
+
* profile starts in-process intervals for update-response cleanup, configured
|
|
224
|
+
* retention sweeps, alert re-evaluation, and the durable-timer scheduler used
|
|
225
|
+
* by {@link Engine.create}. Use `'manual'` in runtimes such as Cloudflare
|
|
226
|
+
* Durable Objects where the host must wake the engine through alarms or Cron
|
|
227
|
+
* triggers, then call {@link Engine.runMaintenance} from each wake-up.
|
|
228
|
+
*
|
|
229
|
+
* Manual mode rejects interval-dependent ownership and second-instance
|
|
230
|
+
* detection options instead of silently starting background work.
|
|
231
|
+
*/
|
|
232
|
+
backgroundTasks?: 'automatic' | 'manual';
|
|
221
233
|
serializer?: Serializer;
|
|
222
234
|
retention?: RetentionPolicy;
|
|
223
235
|
retentionSweepInterval?: Duration;
|
|
@@ -50,7 +50,11 @@ export interface WorkflowServicesResolverLaunchOptions {
|
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
52
|
* Schedule context passed to {@link EngineOptions.resolveWorkflowServices} for
|
|
53
|
-
* scheduled occurrences.
|
|
53
|
+
* scheduled occurrences. New scheduled runs persist this context with the
|
|
54
|
+
* workflow record, so a fresh-process recovery receives the same schedule id and
|
|
55
|
+
* known occurrence timestamp as the live launch path. Runs from older stores
|
|
56
|
+
* that predate the metadata may omit it, and queue-drained runs may omit
|
|
57
|
+
* `occurrence` because their original grid timestamp was not retained.
|
|
54
58
|
*
|
|
55
59
|
* @example
|
|
56
60
|
* ```ts
|
|
@@ -72,8 +76,9 @@ export interface WorkflowServicesResolverScheduleInfo {
|
|
|
72
76
|
* recovered workflow or scheduled occurrence. `input` is the original durable
|
|
73
77
|
* launch input, available at resume time — typically enough to rebuild the run's
|
|
74
78
|
* dependencies (tenant, model, tool registry) without a side table. When tags or
|
|
75
|
-
* schedule identity are part of the durable launch context, they are exposed
|
|
76
|
-
*
|
|
79
|
+
* schedule identity are part of the durable launch context, they are exposed on
|
|
80
|
+
* both live scheduled launches and recovery so resolvers do not need parallel
|
|
81
|
+
* side channels for the same classification.
|
|
77
82
|
*
|
|
78
83
|
* @example
|
|
79
84
|
* ```ts
|
|
@@ -50,8 +50,8 @@ export type WorkflowGenerator<TInput, TOutput, TActivities extends ActivityMap,
|
|
|
50
50
|
* Bare-`WorkflowContext` callers (no declared activity/signal/etc. maps)
|
|
51
51
|
* typecheck because the interface's generics all default to permissive shapes:
|
|
52
52
|
* the typed overloads de-prioritise to `never` and the dynamic string-name /
|
|
53
|
-
* callable overloads match instead. This permissive path is current API
|
|
54
|
-
*
|
|
53
|
+
* callable overloads match instead. This permissive path is the current API for
|
|
54
|
+
* untyped, ad-hoc-name authoring.
|
|
55
55
|
*/
|
|
56
56
|
export type WorkflowContextOf<TActivities extends ActivityMap = ActivityMap, TSignals extends SignalMap = SignalMap, TUpdates extends UpdateMap = UpdateMap, TQueries extends QueryMap = QueryMap, TSearchAttributes extends SearchAttributeSchema = SearchAttributeSchema, TServices = unknown> = WorkflowContext<TActivities, TSignals, TUpdates, TQueries, TSearchAttributes, TServices>;
|
|
57
57
|
/**
|
|
@@ -15,6 +15,32 @@ export type WorkflowOperationResult<TOperation> = TOperation extends Generator<u
|
|
|
15
15
|
export type WorkflowOperationTupleResult<TOperations extends readonly WorkflowOperation<unknown>[]> = {
|
|
16
16
|
-readonly [TIndex in keyof TOperations]: WorkflowOperationResult<TOperations[TIndex]>;
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Discriminated winner returned by {@link WorkflowContext.raceKeyed}. Checking
|
|
20
|
+
* `key` narrows `value` to the result type of that named workflow operation.
|
|
21
|
+
* Numeric object keys are returned as strings, matching JavaScript object
|
|
22
|
+
* enumeration; symbol keys are rejected at runtime.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* import type { WorkflowKeyedRaceResult, WorkflowOperation } from '@lostgradient/weft';
|
|
27
|
+
*
|
|
28
|
+
* type Winner = WorkflowKeyedRaceResult<{
|
|
29
|
+
* event: WorkflowOperation<string>;
|
|
30
|
+
* idle: WorkflowOperation<void>;
|
|
31
|
+
* }>;
|
|
32
|
+
*
|
|
33
|
+
* function handleWinner(winner: Winner): string {
|
|
34
|
+
* return winner.key === 'event' ? winner.value : 'timed out';
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export type WorkflowKeyedRaceResult<TOperations extends Readonly<Record<string, WorkflowOperation<unknown>>>> = {
|
|
39
|
+
[TKey in keyof TOperations]: {
|
|
40
|
+
key: TKey extends string | number ? `${TKey}` : never;
|
|
41
|
+
value: WorkflowOperationResult<TOperations[TKey]>;
|
|
42
|
+
};
|
|
43
|
+
}[keyof TOperations];
|
|
18
44
|
type RunAllBranchResult<TBranch> = TBranch extends readonly [
|
|
19
45
|
execute: infer TExecute,
|
|
20
46
|
...rest: unknown[]
|
|
@@ -180,6 +206,7 @@ export interface WorkflowContext<TActivities extends ActivityMap = {}, TSignals
|
|
|
180
206
|
review(options: HumanReviewOptions): WorkflowOperation<HumanReviewResult>;
|
|
181
207
|
all<const TOperations extends readonly WorkflowOperation<unknown>[]>(operations: TOperations): WorkflowOperation<WorkflowOperationTupleResult<TOperations>>;
|
|
182
208
|
race<const TOperations extends readonly WorkflowOperation<unknown>[]>(operations: TOperations): WorkflowOperation<WorkflowOperationTupleResult<TOperations>[number]>;
|
|
209
|
+
raceKeyed<const TOperations extends Readonly<Record<string, WorkflowOperation<unknown>>>>(operations: TOperations): WorkflowOperation<WorkflowKeyedRaceResult<TOperations>>;
|
|
183
210
|
memo<T>(key: string, fn: () => T | Promise<T>): WorkflowOperation<T>;
|
|
184
211
|
offload<T>(key: string, fn: () => Promise<T>): WorkflowOperation<OffloadReference>;
|
|
185
212
|
stream(key: string, fn: (sink: StreamSink) => AsyncGenerator<unknown, void, unknown>): WorkflowOperation<StreamReference>;
|
package/dist/index.d.ts
CHANGED
|
@@ -22,9 +22,9 @@ export { FAULT_CODE_TO_FAILURE_CATEGORY, failureCategoryForFaultCode, isFaultCod
|
|
|
22
22
|
export type { FaultCode } from './core/fault-code.ts';
|
|
23
23
|
export { DurableActivityScopeError, DurableActivityUnsupportedError, durableActivity, } from './core/context/durable-activity.ts';
|
|
24
24
|
export { ActivityReconciliationCapabilityError, ActivityReconciliationConflictError, ActivityReconciliationIndeterminateError, ActivityResolutionError, AsyncActivityTokenNotFoundError, BulkDeleteRequiresTerminalWorkflowsError, BulkOperationConfirmationError, ENGINE_LEASE_LOST_WARNING_NAME, ENGINE_LEASE_SYNCHRONOUS_DISPOSE_WARNING_NAME, Engine, EngineCreateNameMismatchError, EngineDisposedError, EngineLeaseAcquisitionTimeoutError, EngineLeaseCorruptedError, EngineLeaseNotHeldError, IdempotencyKeyPurgedError, PersistedDataIncompatibleError, ScheduleHandle, StartOrSignalConflictError, WorkflowAlreadyExistsError, WorkflowConcurrencyLimitExceededError, WorkflowHandle, WorkflowNotFoundError, WorkflowNotRegisteredError, WorkflowSuspendNotSupportedError, WorkflowTeardownPendingError, WorkflowTypeNotRegisteredForRecoveryError, } from './core/engine';
|
|
25
|
-
export type { EngineCreateOptions, EngineStateNamespace, RecoverAllOptions } from './core/engine';
|
|
25
|
+
export type { EngineCreateOptions, EngineStateNamespace, RecoverAllOptions, RecoveredWorkflowInfo, } from './core/engine';
|
|
26
26
|
export { DEFAULT_CHECKPOINT_SIZE_WARNING_THRESHOLD, DEFAULT_MAX_NESTING_DEPTH, DEFAULT_POLL_INTERVAL_MS, DEFAULT_RETRY_POLICY, DEFAULT_VISIBILITY_TIMEOUT_MS, HISTORY_CIRCUIT_BREAKER_REASON, WorkflowBuilderError, query, schedule, signal, update, workflow, } from './core/types';
|
|
27
|
-
export type { ActivityArgsFor, ActivityCallOptions, ActivityCallable, ActivityContext, ActivityDefinition, ActivityEntryInput, ActivityFunction, ActivityMap, ActivityMapInput, ActivityObjectInput, ActivityResultFor, ActivityVerificationContext, ActivityVerificationPhase, ActivityVerificationResult, AnyActivityDefinition, AnyWorkflowDefinition, ArchiveAdapter, BuilderState, BuiltWorkflowDefinition, BulkCancelResult, BulkDeleteResult, BulkOperationAction, BulkOperationAuditEvent, BulkOperationCommitOptions, BulkOperationDryRunOptions, BulkOperationDryRunResult, BulkOperationError, BulkOperationFilterSummary, BulkOperationOptions, BulkOperationPrincipal, BulkOperationScopeSummary, BulkRetryFailedResult, BulkSignalAllCommitOptions, BulkSignalAllDryRunOptions, BulkSignalAllOptions, BulkSignalResult, BulkTagResult, Checkpoint, CheckpointState, CheckpointSummary, CompletedReviewEntry, CoordinatedUpdateResult, DefinitionSchema, Duration, EngineOptions, FailureCategory, ForkLineage, ForkOptions, HistoryPolicy, InferActivityEntries, InferActivityEntry, InferWorkflowEntries, InferWorkflowEntry, InitialBuilderState, LaunchMetadata, ListFilter, ListOptions, MarkBuilderState, NormalizeActivities, NormalizedActivityEntry, NormalizedRetentionPolicy, PaginatedResult, PayloadSizePolicy, PendingReviewEntry, PurgeResult, QueryDefinition, QueryMap, QueryShape, RegisteredWorkflowDefinition, RetentionOverview, RetentionPolicy, RetryPolicy, ReviewListEntry, ReviewListFilter, ReviewStatus, ScheduleDefinition, ScheduleFilter, ScheduleOptions, ScheduleOverlapPolicy, ScheduleSpec, ScheduleState, ScheduleStatus, ScheduleSummary, SearchAttributeDefinition, SearchAttributeHandle, SearchAttributeSchema, SearchAttributeValue, Serializer, SignalDefinition, SignalDeliveryOptions, SignalMap, SignalPayload, StartOptions, StartOrSignalOptions, StartOrSignalSignal, SubmitReviewOptions, TerminationReason, UpdateDefinition, UpdateMap, UpdatePayload, WorkerReplayOperationFailure, WorkerReplayOperationSignature, WorkflowAlreadyRegistered, WorkflowAtomicState, WorkflowAtomicStateOptions, WorkflowBuilder, WorkflowBuilderOptions, WorkflowConcurrencyOptions, WorkflowContext, WorkflowDefinition, WorkflowEvent, WorkflowFunction, WorkflowGenerator, WorkflowId, WorkflowLogLevel, WorkflowLogRecord, WorkflowLogger, WorkflowRegistry, WorkflowReplay, WorkflowServicesResolution, WorkflowServicesResolverInfo, WorkflowServicesResolverLaunchOptions, WorkflowServicesResolverScheduleInfo, WorkflowSessionState, WorkflowSnapshot, WorkflowState, WorkflowStateNamespace, WorkflowStatus, WorkflowSummary, WorkflowTimelineEntry, WorkflowTimelineStatus, WorkflowTypeRetentionPolicy, } from './core/types';
|
|
27
|
+
export type { ActivityArgsFor, ActivityCallOptions, ActivityCallable, ActivityContext, ActivityDefinition, ActivityEntryInput, ActivityFunction, ActivityMap, ActivityMapInput, ActivityObjectInput, ActivityResultFor, ActivityVerificationContext, ActivityVerificationPhase, ActivityVerificationResult, AnyActivityDefinition, AnyWorkflowDefinition, ArchiveAdapter, BuilderState, BuiltWorkflowDefinition, BulkCancelResult, BulkDeleteResult, BulkOperationAction, BulkOperationAuditEvent, BulkOperationCommitOptions, BulkOperationDryRunOptions, BulkOperationDryRunResult, BulkOperationError, BulkOperationFilterSummary, BulkOperationOptions, BulkOperationPrincipal, BulkOperationScopeSummary, BulkRetryFailedResult, BulkSignalAllCommitOptions, BulkSignalAllDryRunOptions, BulkSignalAllOptions, BulkSignalResult, BulkTagResult, Checkpoint, CheckpointState, CheckpointSummary, CompletedReviewEntry, CoordinatedUpdateResult, DefinitionSchema, Duration, EngineOptions, FailureCategory, ForkLineage, ForkOptions, HistoryPolicy, InferActivityEntries, InferActivityEntry, InferWorkflowEntries, InferWorkflowEntry, InitialBuilderState, LaunchMetadata, ListFilter, ListOptions, MarkBuilderState, NormalizeActivities, NormalizedActivityEntry, NormalizedRetentionPolicy, PaginatedResult, PayloadSizePolicy, PendingReviewEntry, PurgeResult, QueryDefinition, QueryMap, QueryShape, RegisteredWorkflowDefinition, RetentionOverview, RetentionPolicy, RetryPolicy, ReviewListEntry, ReviewListFilter, ReviewStatus, ScheduleDefinition, ScheduleFilter, ScheduleOptions, ScheduleOverlapPolicy, ScheduleSpec, ScheduleState, ScheduleStatus, ScheduleSummary, SearchAttributeDefinition, SearchAttributeHandle, SearchAttributeSchema, SearchAttributeValue, Serializer, SignalDefinition, SignalDeliveryOptions, SignalMap, SignalPayload, StartOptions, StartOrSignalOptions, StartOrSignalSignal, SubmitReviewOptions, TerminationReason, UpdateDefinition, UpdateMap, UpdatePayload, WorkerReplayOperationFailure, WorkerReplayOperationSignature, WorkflowAlreadyRegistered, WorkflowAtomicState, WorkflowAtomicStateOptions, WorkflowBuilder, WorkflowBuilderOptions, WorkflowConcurrencyOptions, WorkflowContext, WorkflowDefinition, WorkflowEvent, WorkflowFunction, WorkflowGenerator, WorkflowId, WorkflowKeyedRaceResult, WorkflowLogLevel, WorkflowLogRecord, WorkflowLogger, WorkflowRegistry, WorkflowReplay, WorkflowServicesResolution, WorkflowServicesResolverInfo, WorkflowServicesResolverLaunchOptions, WorkflowServicesResolverScheduleInfo, WorkflowSessionState, WorkflowSnapshot, WorkflowState, WorkflowStateNamespace, WorkflowStatus, WorkflowSummary, WorkflowTimelineEntry, WorkflowTimelineStatus, WorkflowTypeRetentionPolicy, } from './core/types';
|
|
28
28
|
export { AlertManager } from './alerting/index';
|
|
29
29
|
export type { AlertAction, AlertMetric, AlertRule, AlertState, AlertStatus, AlertingOptions, WebhookTarget, } from './alerting/types';
|
|
30
30
|
export { ActivityAsyncPendingEvent, ActivityCompletedEvent, ActivityFailedEvent, ActivityStartedEvent, AlertFiredEvent, AlertResolvedEvent, AttributesChangedEvent, CheckpointSizeWarningEvent, ConstraintViolatedEvent, DevelopmentWarningEvent, ScheduleFiredEvent, ScheduleMissedFireEvent, SignalDeliveredEvent, SignalReceivedEvent, StorageSizeReportedEvent, TaskResultDeadLetteredEvent, UpdateCompletedEvent, UpdateReceivedEvent, WorkflowCancelledEvent, WorkflowCompletedEvent, WorkflowDefinitionRegisteredEvent, WorkflowFailedEvent, WorkflowRecoverySkippedEvent, WorkflowResumedEvent, WorkflowStartedEvent, WorkflowSuspendedEvent, WorkflowTeardownEvent, WorkflowTimedOutEvent, } from './core/events';
|