workflow 5.0.0-beta.2 → 5.0.0-beta.21
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/dist/api-workflow.d.ts +1 -1
- package/dist/api-workflow.d.ts.map +1 -1
- package/dist/api-workflow.js +2 -2
- package/dist/api.d.ts +5 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +14 -2
- package/dist/internal/builtins.d.ts +17 -0
- package/dist/internal/builtins.d.ts.map +1 -1
- package/dist/internal/builtins.js +65 -1
- package/dist/observability.d.ts +1 -1
- package/dist/observability.js +2 -2
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -2
- package/docs/ai/index.mdx +27 -23
- package/docs/api-reference/index.mdx +24 -0
- package/docs/api-reference/meta.json +8 -0
- package/docs/api-reference/vitest/index.mdx +28 -7
- package/docs/api-reference/workflow/create-hook.mdx +38 -0
- package/docs/api-reference/workflow/create-webhook.mdx +1 -0
- package/docs/api-reference/workflow/experimental-set-attributes.mdx +65 -0
- package/docs/api-reference/workflow/fetch.mdx +5 -0
- package/docs/api-reference/workflow/index.mdx +3 -0
- package/docs/api-reference/workflow-ai/durable-agent.mdx +7 -45
- package/docs/api-reference/workflow-api/get-hook-by-token.mdx +7 -0
- package/docs/api-reference/workflow-api/get-run.mdx +6 -0
- package/docs/api-reference/workflow-api/index.mdx +6 -8
- package/docs/api-reference/workflow-api/resume-hook.mdx +57 -0
- package/docs/api-reference/workflow-api/start.mdx +13 -5
- package/docs/api-reference/workflow-astro/index.mdx +18 -0
- package/docs/api-reference/workflow-astro/meta.json +4 -0
- package/docs/api-reference/workflow-astro/workflow.mdx +45 -0
- package/docs/api-reference/workflow-errors/hook-conflict-error.mdx +60 -0
- package/docs/api-reference/workflow-errors/index.mdx +85 -0
- package/docs/api-reference/workflow-errors/meta.json +5 -0
- package/docs/api-reference/workflow-errors/run-not-supported-error.mdx +58 -0
- package/docs/api-reference/workflow-errors/workflow-error.mdx +52 -0
- package/docs/api-reference/workflow-errors/workflow-run-failed-error.mdx +16 -6
- package/docs/api-reference/workflow-errors/workflow-run-not-completed-error.mdx +58 -0
- package/docs/api-reference/workflow-errors/workflow-runtime-error.mdx +58 -0
- package/docs/api-reference/workflow-nest/configure-workflow-controller.mdx +33 -0
- package/docs/api-reference/workflow-nest/index.mdx +31 -0
- package/docs/api-reference/workflow-nest/meta.json +9 -0
- package/docs/api-reference/workflow-nest/nest-local-builder.mdx +64 -0
- package/docs/api-reference/workflow-nest/workflow-controller.mdx +40 -0
- package/docs/api-reference/workflow-nest/workflow-module.mdx +74 -0
- package/docs/api-reference/workflow-next/with-workflow.mdx +56 -2
- package/docs/api-reference/workflow-nitro/index.mdx +59 -0
- package/docs/api-reference/workflow-nuxt/index.mdx +47 -0
- package/docs/api-reference/workflow-observability/hydrate-data.mdx +35 -0
- package/docs/api-reference/workflow-observability/hydrate-resource-io.mdx +62 -0
- package/docs/api-reference/workflow-observability/index.mdx +64 -0
- package/docs/api-reference/workflow-observability/meta.json +11 -0
- package/docs/api-reference/workflow-observability/observability-revivers.mdx +50 -0
- package/docs/api-reference/workflow-observability/parse-class-name.mdx +41 -0
- package/docs/api-reference/workflow-observability/parse-step-name.mdx +40 -0
- package/docs/api-reference/workflow-observability/parse-workflow-name.mdx +55 -0
- package/docs/api-reference/workflow-runtime/create-world.mdx +39 -0
- package/docs/api-reference/workflow-runtime/get-world-handlers.mdx +44 -0
- package/docs/api-reference/{workflow-api → workflow-runtime}/get-world.mdx +7 -10
- package/docs/api-reference/workflow-runtime/health-check.mdx +50 -0
- package/docs/api-reference/workflow-runtime/index.mdx +43 -0
- package/docs/api-reference/workflow-runtime/meta.json +12 -0
- package/docs/api-reference/workflow-runtime/set-world.mdx +49 -0
- package/docs/api-reference/workflow-runtime/workflow-entrypoint.mdx +42 -0
- package/docs/api-reference/{workflow-api → workflow-runtime}/world/index.mdx +5 -8
- package/docs/api-reference/workflow-runtime/world/meta.json +4 -0
- package/docs/api-reference/{workflow-api → workflow-runtime}/world/queue.mdx +2 -2
- package/docs/api-reference/{workflow-api → workflow-runtime}/world/storage.mdx +11 -4
- package/docs/api-reference/{workflow-api → workflow-runtime}/world/streams.mdx +2 -2
- package/docs/api-reference/workflow-serde/index.mdx +0 -1
- package/docs/api-reference/workflow-serde/workflow-deserialize.mdx +1 -2
- package/docs/api-reference/workflow-serde/workflow-serialize.mdx +1 -2
- package/docs/api-reference/workflow-sveltekit/index.mdx +18 -0
- package/docs/api-reference/workflow-sveltekit/meta.json +4 -0
- package/docs/api-reference/workflow-sveltekit/workflow-plugin.mdx +42 -0
- package/docs/api-reference/workflow-vite/index.mdx +18 -0
- package/docs/api-reference/workflow-vite/meta.json +4 -0
- package/docs/api-reference/workflow-vite/workflow.mdx +48 -0
- package/docs/changelog/attributes-mvp.mdx +380 -0
- package/docs/changelog/eager-processing.mdx +269 -0
- package/docs/changelog/index.mdx +2 -1
- package/docs/changelog/lazy-event-creation.md +127 -0
- package/docs/changelog/meta.json +7 -1
- package/docs/changelog/resilient-start.mdx +31 -283
- package/docs/changelog/turbo-mode.md +87 -0
- package/docs/cookbook/advanced/child-workflows.mdx +315 -0
- package/docs/cookbook/advanced/meta.json +2 -3
- package/docs/cookbook/advanced/publishing-libraries.mdx +87 -29
- package/docs/cookbook/advanced/serializable-steps.mdx +17 -5
- package/docs/cookbook/advanced/upgrading-workflows.mdx +195 -0
- package/docs/cookbook/agent-patterns/agent-cancellation.mdx +156 -0
- package/docs/cookbook/agent-patterns/durable-agent.mdx +11 -184
- package/docs/cookbook/agent-patterns/human-in-the-loop.mdx +150 -173
- package/docs/cookbook/agent-patterns/meta.json +1 -7
- package/docs/cookbook/common-patterns/batching.mdx +44 -118
- package/docs/cookbook/common-patterns/idempotency.mdx +36 -52
- package/docs/cookbook/common-patterns/meta.json +4 -4
- package/docs/cookbook/common-patterns/rate-limiting.mdx +1 -1
- package/docs/cookbook/common-patterns/saga.mdx +128 -33
- package/docs/cookbook/common-patterns/scheduling.mdx +77 -193
- package/docs/cookbook/common-patterns/sequential-and-parallel.mdx +155 -0
- package/docs/cookbook/common-patterns/timeouts.mdx +100 -0
- package/docs/cookbook/common-patterns/workflow-composition.mdx +117 -0
- package/docs/cookbook/index.mdx +14 -17
- package/docs/cookbook/integrations/ai-sdk.mdx +330 -142
- package/docs/cookbook/integrations/chat-sdk.mdx +264 -151
- package/docs/cookbook/integrations/sandbox.mdx +482 -81
- package/docs/cookbook/meta.json +1 -1
- package/docs/deploying/building-a-world.mdx +1 -1
- package/docs/deploying/world/postgres-world.mdx +5 -3
- package/docs/deploying/world/vercel-world.mdx +2 -0
- package/docs/errors/abort-signal-timeout-in-workflow.mdx +80 -0
- package/docs/errors/corrupted-event-log.mdx +5 -5
- package/docs/errors/hook-conflict.mdx +56 -4
- package/docs/errors/index.mdx +9 -0
- package/docs/errors/replay-divergence.mdx +27 -0
- package/docs/errors/runtime-decryption-failed.mdx +77 -0
- package/docs/errors/step-executed-multiple-times.mdx +23 -0
- package/docs/errors/step-not-registered.mdx +1 -1
- package/docs/foundations/cancellation.mdx +459 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/idempotency.mdx +236 -11
- package/docs/foundations/index.mdx +3 -3
- package/docs/foundations/meta.json +3 -2
- package/docs/foundations/serialization.mdx +78 -42
- package/docs/foundations/starting-workflows.mdx +6 -2
- package/docs/foundations/streaming.mdx +14 -23
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/getting-started/astro.mdx +6 -0
- package/docs/getting-started/index.mdx +6 -7
- package/docs/getting-started/meta.json +1 -0
- package/docs/getting-started/nestjs.mdx +9 -0
- package/docs/getting-started/next.mdx +5 -3
- package/docs/getting-started/nitro.mdx +22 -0
- package/docs/getting-started/sveltekit.mdx +6 -0
- package/docs/getting-started/tanstack-start.mdx +241 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +2 -2
- package/docs/how-it-works/encryption.mdx +2 -2
- package/docs/how-it-works/event-sourcing.mdx +2 -2
- package/docs/how-it-works/meta.json +2 -1
- package/docs/internal/index.mdx +21 -0
- package/docs/internal/meta.json +10 -0
- package/docs/internal/nitro-native-build.mdx +38 -0
- package/docs/internal/nitro-web-ui.mdx +24 -0
- package/docs/internal/serializable-abort-controller.mdx +148 -0
- package/docs/migration-guides/migrating-from-aws-step-functions.mdx +63 -16
- package/docs/migration-guides/migrating-from-inngest.mdx +44 -22
- package/docs/migration-guides/migrating-from-temporal.mdx +43 -14
- package/docs/migration-guides/migrating-from-trigger-dev.mdx +59 -27
- package/docs/observability/attributes.mdx +87 -0
- package/docs/observability/index.mdx +25 -1
- package/docs/observability/meta.json +1 -1
- package/docs/observability/tracing.mdx +106 -0
- package/docs/testing/index.mdx +2 -2
- package/package.json +14 -13
- package/docs/api-reference/workflow-api/world/meta.json +0 -4
- package/docs/api-reference/workflow-api/world/observability.mdx +0 -164
- package/docs/cookbook/advanced/custom-serialization.mdx +0 -168
- package/docs/cookbook/advanced/durable-objects.mdx +0 -148
- package/docs/cookbook/advanced/isomorphic-packages.mdx +0 -145
- package/docs/cookbook/agent-patterns/stop-workflow.mdx +0 -216
- package/docs/cookbook/agent-patterns/tool-orchestration.mdx +0 -255
- package/docs/cookbook/agent-patterns/tool-streaming.mdx +0 -181
- package/docs/cookbook/common-patterns/child-workflows.mdx +0 -372
- package/docs/cookbook/common-patterns/content-router.mdx +0 -207
- package/docs/cookbook/common-patterns/fan-out.mdx +0 -208
- package/docs/foundations/common-patterns.mdx +0 -265
package/dist/api-workflow.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
export type { Event, StartOptions, StopSleepOptions, StopSleepResult, WorkflowReadableStreamOptions, WorkflowRun, } from '@workflow/core/runtime';
|
|
2
2
|
export { Run } from '@workflow/core/runtime/run';
|
|
3
|
+
export { start } from '@workflow/core/runtime/start';
|
|
3
4
|
export declare const getRun: () => never;
|
|
4
5
|
export declare const getHookByToken: () => never;
|
|
5
6
|
export declare const resumeHook: () => never;
|
|
6
7
|
export declare const resumeWebhook: () => never;
|
|
7
8
|
export declare const runStep: () => never;
|
|
8
|
-
export declare const start: () => never;
|
|
9
9
|
//# sourceMappingURL=api-workflow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-workflow.d.ts","sourceRoot":"","sources":["../src/api-workflow.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,6BAA6B,EAC7B,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"api-workflow.d.ts","sourceRoot":"","sources":["../src/api-workflow.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,6BAA6B,EAC7B,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAQrD,eAAO,MAAM,MAAM,aAA+B,CAAC;AACnD,eAAO,MAAM,cAAc,aAAuC,CAAC;AACnE,eAAO,MAAM,UAAU,aAAmC,CAAC;AAC3D,eAAO,MAAM,aAAa,aAAsC,CAAC;AACjE,eAAO,MAAM,OAAO,aAAgC,CAAC"}
|
package/dist/api-workflow.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { Run } from '@workflow/core/runtime/run';
|
|
2
|
+
export { start } from '@workflow/core/runtime/start';
|
|
2
3
|
const workflowStub = (item) => {
|
|
3
4
|
throw new Error(`The workflow environment doesn't allow this runtime usage of ${item}. Move this call to a step function ("use step") or call it outside the workflow context.`);
|
|
4
5
|
};
|
|
@@ -7,5 +8,4 @@ export const getHookByToken = () => workflowStub('getHookByToken');
|
|
|
7
8
|
export const resumeHook = () => workflowStub('resumeHook');
|
|
8
9
|
export const resumeWebhook = () => workflowStub('resumeWebhook');
|
|
9
10
|
export const runStep = () => workflowStub('runStep');
|
|
10
|
-
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS13b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFakQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtJQUNwQyxNQUFNLElBQUksS0FBSyxDQUNiLGdFQUFnRSxJQUFJLDJGQUEyRixDQUNoSyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDbkUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIHtcbiAgRXZlbnQsXG4gIFN0YXJ0T3B0aW9ucyxcbiAgU3RvcFNsZWVwT3B0aW9ucyxcbiAgU3RvcFNsZWVwUmVzdWx0LFxuICBXb3JrZmxvd1JlYWRhYmxlU3RyZWFtT3B0aW9ucyxcbiAgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuXG5leHBvcnQgeyBSdW4gfSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lL3J1bic7XG5cbmNvbnN0IHdvcmtmbG93U3R1YiA9IChpdGVtOiBzdHJpbmcpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBUaGUgd29ya2Zsb3cgZW52aXJvbm1lbnQgZG9lc24ndCBhbGxvdyB0aGlzIHJ1bnRpbWUgdXNhZ2Ugb2YgJHtpdGVtfS4gTW92ZSB0aGlzIGNhbGwgdG8gYSBzdGVwIGZ1bmN0aW9uIChcInVzZSBzdGVwXCIpIG9yIGNhbGwgaXQgb3V0c2lkZSB0aGUgd29ya2Zsb3cgY29udGV4dC5gXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UnVuID0gKCkgPT4gd29ya2Zsb3dTdHViKCdnZXRSdW4nKTtcbmV4cG9ydCBjb25zdCBnZXRIb29rQnlUb2tlbiA9ICgpID0+IHdvcmtmbG93U3R1YignZ2V0SG9va0J5VG9rZW4nKTtcbmV4cG9ydCBjb25zdCByZXN1bWVIb29rID0gKCkgPT4gd29ya2Zsb3dTdHViKCdyZXN1bWVIb29rJyk7XG5leHBvcnQgY29uc3QgcmVzdW1lV2ViaG9vayA9ICgpID0+IHdvcmtmbG93U3R1YigncmVzdW1lV2ViaG9vaycpO1xuZXhwb3J0IGNvbnN0IHJ1blN0ZXAgPSAoKSA9PiB3b3JrZmxvd1N0dWIoJ3J1blN0ZXAnKTtcbmV4cG9ydCBjb25zdCBzdGFydCA9ICgpID0+IHdvcmtmbG93U3R1Yignc3RhcnQnKTtcbiJdfQ==
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS13b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXJELE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7SUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FDYixnRUFBZ0UsSUFBSSwyRkFBMkYsQ0FDaEssQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbkQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDM0QsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUge1xuICBFdmVudCxcbiAgU3RhcnRPcHRpb25zLFxuICBTdG9wU2xlZXBPcHRpb25zLFxuICBTdG9wU2xlZXBSZXN1bHQsXG4gIFdvcmtmbG93UmVhZGFibGVTdHJlYW1PcHRpb25zLFxuICBXb3JrZmxvd1J1bixcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG5cbmV4cG9ydCB7IFJ1biB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUvcnVuJztcbmV4cG9ydCB7IHN0YXJ0IH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZS9zdGFydCc7XG5cbmNvbnN0IHdvcmtmbG93U3R1YiA9IChpdGVtOiBzdHJpbmcpID0+IHtcbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBUaGUgd29ya2Zsb3cgZW52aXJvbm1lbnQgZG9lc24ndCBhbGxvdyB0aGlzIHJ1bnRpbWUgdXNhZ2Ugb2YgJHtpdGVtfS4gTW92ZSB0aGlzIGNhbGwgdG8gYSBzdGVwIGZ1bmN0aW9uIChcInVzZSBzdGVwXCIpIG9yIGNhbGwgaXQgb3V0c2lkZSB0aGUgd29ya2Zsb3cgY29udGV4dC5gXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UnVuID0gKCkgPT4gd29ya2Zsb3dTdHViKCdnZXRSdW4nKTtcbmV4cG9ydCBjb25zdCBnZXRIb29rQnlUb2tlbiA9ICgpID0+IHdvcmtmbG93U3R1YignZ2V0SG9va0J5VG9rZW4nKTtcbmV4cG9ydCBjb25zdCByZXN1bWVIb29rID0gKCkgPT4gd29ya2Zsb3dTdHViKCdyZXN1bWVIb29rJyk7XG5leHBvcnQgY29uc3QgcmVzdW1lV2ViaG9vayA9ICgpID0+IHdvcmtmbG93U3R1YigncmVzdW1lV2ViaG9vaycpO1xuZXhwb3J0IGNvbnN0IHJ1blN0ZXAgPSAoKSA9PiB3b3JrZmxvd1N0dWIoJ3J1blN0ZXAnKTtcbiJdfQ==
|
package/dist/api.d.ts
CHANGED
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import '@workflow/core/runtime/world-init';
|
|
2
|
+
export type { Event, StopSleepOptions, StopSleepResult, WorkflowRun, } from '@workflow/core/runtime';
|
|
3
|
+
export { getHookByToken, resumeHook, resumeWebhook, } from '@workflow/core/runtime/resume-hook';
|
|
4
|
+
export { getRun, Run, type WorkflowReadableStream, type WorkflowReadableStreamOptions, } from '@workflow/core/runtime/run';
|
|
5
|
+
export { type StartOptions, start, } from '@workflow/core/runtime/start';
|
|
2
6
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AASA,OAAO,mCAAmC,CAAC;AAE3C,YAAY,EACV,KAAK,EACL,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,UAAU,EACV,aAAa,GACd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,MAAM,EACN,GAAG,EACH,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,GACnC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,GACN,MAAM,8BAA8B,CAAC"}
|
package/dist/api.js
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// Side-effect import: ensure `world.ts` is loaded so its module-load
|
|
2
|
+
// `globalThis[GetWorldFnKey] ??= getWorld` registration fires before any
|
|
3
|
+
// host route reaches `getWorldLazy()`. Without this, webpack/turbopack
|
|
4
|
+
// tree-shake `world.ts` out of routes that only use `start` (the most
|
|
5
|
+
// common host-side entry point) and `getWorldLazy()`'s dynamic-import
|
|
6
|
+
// fallback then fails because the bundler inlined `get-world-lazy.js`
|
|
7
|
+
// into the route bundle. Resolved to an empty stub via the `workflow`
|
|
8
|
+
// export condition in VM/step bundles, so this stays host-only.
|
|
9
|
+
// See `@workflow/core/src/runtime/world-init.ts` for the full rationale.
|
|
10
|
+
import '@workflow/core/runtime/world-init';
|
|
11
|
+
export { getHookByToken, resumeHook, resumeWebhook, } from '@workflow/core/runtime/resume-hook';
|
|
12
|
+
export { getRun, Run, } from '@workflow/core/runtime/run';
|
|
13
|
+
export { start, } from '@workflow/core/runtime/start';
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxRUFBcUU7QUFDckUseUVBQXlFO0FBQ3pFLHVFQUF1RTtBQUN2RSxzRUFBc0U7QUFDdEUsc0VBQXNFO0FBQ3RFLHNFQUFzRTtBQUN0RSxzRUFBc0U7QUFDdEUsZ0VBQWdFO0FBQ2hFLHlFQUF5RTtBQUN6RSxPQUFPLG1DQUFtQyxDQUFDO0FBUTNDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsVUFBVSxFQUNWLGFBQWEsR0FDZCxNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDTCxNQUFNLEVBQ04sR0FBRyxHQUdKLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUVMLEtBQUssR0FDTixNQUFNLDhCQUE4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gU2lkZS1lZmZlY3QgaW1wb3J0OiBlbnN1cmUgYHdvcmxkLnRzYCBpcyBsb2FkZWQgc28gaXRzIG1vZHVsZS1sb2FkXG4vLyBgZ2xvYmFsVGhpc1tHZXRXb3JsZEZuS2V5XSA/Pz0gZ2V0V29ybGRgIHJlZ2lzdHJhdGlvbiBmaXJlcyBiZWZvcmUgYW55XG4vLyBob3N0IHJvdXRlIHJlYWNoZXMgYGdldFdvcmxkTGF6eSgpYC4gV2l0aG91dCB0aGlzLCB3ZWJwYWNrL3R1cmJvcGFja1xuLy8gdHJlZS1zaGFrZSBgd29ybGQudHNgIG91dCBvZiByb3V0ZXMgdGhhdCBvbmx5IHVzZSBgc3RhcnRgICh0aGUgbW9zdFxuLy8gY29tbW9uIGhvc3Qtc2lkZSBlbnRyeSBwb2ludCkgYW5kIGBnZXRXb3JsZExhenkoKWAncyBkeW5hbWljLWltcG9ydFxuLy8gZmFsbGJhY2sgdGhlbiBmYWlscyBiZWNhdXNlIHRoZSBidW5kbGVyIGlubGluZWQgYGdldC13b3JsZC1sYXp5LmpzYFxuLy8gaW50byB0aGUgcm91dGUgYnVuZGxlLiBSZXNvbHZlZCB0byBhbiBlbXB0eSBzdHViIHZpYSB0aGUgYHdvcmtmbG93YFxuLy8gZXhwb3J0IGNvbmRpdGlvbiBpbiBWTS9zdGVwIGJ1bmRsZXMsIHNvIHRoaXMgc3RheXMgaG9zdC1vbmx5LlxuLy8gU2VlIGBAd29ya2Zsb3cvY29yZS9zcmMvcnVudGltZS93b3JsZC1pbml0LnRzYCBmb3IgdGhlIGZ1bGwgcmF0aW9uYWxlLlxuaW1wb3J0ICdAd29ya2Zsb3cvY29yZS9ydW50aW1lL3dvcmxkLWluaXQnO1xuXG5leHBvcnQgdHlwZSB7XG4gIEV2ZW50LFxuICBTdG9wU2xlZXBPcHRpb25zLFxuICBTdG9wU2xlZXBSZXN1bHQsXG4gIFdvcmtmbG93UnVuLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lJztcbmV4cG9ydCB7XG4gIGdldEhvb2tCeVRva2VuLFxuICByZXN1bWVIb29rLFxuICByZXN1bWVXZWJob29rLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9ydW50aW1lL3Jlc3VtZS1ob29rJztcbmV4cG9ydCB7XG4gIGdldFJ1bixcbiAgUnVuLFxuICB0eXBlIFdvcmtmbG93UmVhZGFibGVTdHJlYW0sXG4gIHR5cGUgV29ya2Zsb3dSZWFkYWJsZVN0cmVhbU9wdGlvbnMsXG59IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUvcnVuJztcbmV4cG9ydCB7XG4gIHR5cGUgU3RhcnRPcHRpb25zLFxuICBzdGFydCxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZS9zdGFydCc7XG4iXX0=
|
|
@@ -6,4 +6,21 @@
|
|
|
6
6
|
export declare function __builtin_response_array_buffer(this: Request | Response): Promise<ArrayBuffer>;
|
|
7
7
|
export declare function __builtin_response_json(this: Request | Response): Promise<unknown>;
|
|
8
8
|
export declare function __builtin_response_text(this: Request | Response): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Step bridge for workflow-body `setAttributes` calls. The VM-side
|
|
11
|
+
* helper validates input and dispatches here via `useStep`. This step
|
|
12
|
+
* runs in normal Node context with full world access.
|
|
13
|
+
*
|
|
14
|
+
* The dispatch reads the world and current run id directly from
|
|
15
|
+
* `globalThis` symbols populated by the workflow/step runtime — this
|
|
16
|
+
* intentionally avoids importing `@workflow/core` so the Next.js
|
|
17
|
+
* deferred-entries discoverer can't walk a chain into world adapters
|
|
18
|
+
* and `@vercel/queue` from this step file.
|
|
19
|
+
*/
|
|
20
|
+
export declare function __builtin_set_attributes(changes: Array<{
|
|
21
|
+
key: string;
|
|
22
|
+
value: string | null;
|
|
23
|
+
}>, options?: {
|
|
24
|
+
allowReservedAttributes?: boolean;
|
|
25
|
+
}): Promise<void>;
|
|
9
26
|
//# sourceMappingURL=builtins.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/internal/builtins.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,OAAO,GAAG,QAAQ,wBAIzB;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,oBAGrE;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,mBAGrE"}
|
|
1
|
+
{"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../src/internal/builtins.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,OAAO,GAAG,QAAQ,wBAIzB;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,oBAGrE;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,mBAGrE;AAmBD;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,EACrD,OAAO,CAAC,EAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAE,iBAsEhD"}
|
|
@@ -15,4 +15,68 @@ export async function __builtin_response_text() {
|
|
|
15
15
|
'use step';
|
|
16
16
|
return this.text();
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Process-wide dedupe for the unsupported-world warning so high-volume
|
|
20
|
+
* callers don't flood logs.
|
|
21
|
+
*/
|
|
22
|
+
const UNSUPPORTED_WORLD_WARNED = Symbol.for('@workflow/setAttributes//unsupportedWorldWarned');
|
|
23
|
+
const INTERNAL_ATTRIBUTES_MAX_ATTEMPTS = 3;
|
|
24
|
+
function formatUnknownError(error) {
|
|
25
|
+
if (error instanceof Error) {
|
|
26
|
+
return error.stack ?? `${error.name}: ${error.message}`;
|
|
27
|
+
}
|
|
28
|
+
return String(error);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Step bridge for workflow-body `setAttributes` calls. The VM-side
|
|
32
|
+
* helper validates input and dispatches here via `useStep`. This step
|
|
33
|
+
* runs in normal Node context with full world access.
|
|
34
|
+
*
|
|
35
|
+
* The dispatch reads the world and current run id directly from
|
|
36
|
+
* `globalThis` symbols populated by the workflow/step runtime — this
|
|
37
|
+
* intentionally avoids importing `@workflow/core` so the Next.js
|
|
38
|
+
* deferred-entries discoverer can't walk a chain into world adapters
|
|
39
|
+
* and `@vercel/queue` from this step file.
|
|
40
|
+
*/
|
|
41
|
+
export async function __builtin_set_attributes(changes, options) {
|
|
42
|
+
'use step';
|
|
43
|
+
if (changes.length === 0)
|
|
44
|
+
return;
|
|
45
|
+
const g = globalThis;
|
|
46
|
+
const contextStorage = g[Symbol.for('WORKFLOW_STEP_CONTEXT_STORAGE')];
|
|
47
|
+
const store = contextStorage?.getStore?.();
|
|
48
|
+
const attempt = typeof store?.stepMetadata?.attempt === 'number'
|
|
49
|
+
? store.stepMetadata.attempt
|
|
50
|
+
: INTERNAL_ATTRIBUTES_MAX_ATTEMPTS;
|
|
51
|
+
const world = g[Symbol.for('@workflow/world//cache')];
|
|
52
|
+
if (typeof world?.runs?.experimentalSetAttributes !== 'function') {
|
|
53
|
+
// World adapter doesn't implement attributes yet — no-op the call,
|
|
54
|
+
// but emit one process-wide warning so users know their writes are
|
|
55
|
+
// being dropped. The VM-side validation already ran so the input
|
|
56
|
+
// is well-formed.
|
|
57
|
+
if (!g[UNSUPPORTED_WORLD_WARNED]) {
|
|
58
|
+
g[UNSUPPORTED_WORLD_WARNED] = true;
|
|
59
|
+
const worldName = world?.name ? ` (${world.name})` : '';
|
|
60
|
+
console.warn(`[workflow] setAttributes: the current world implementation${worldName} does not implement experimentalSetAttributes; this call (and any subsequent setAttributes calls in this process) is a no-op. Attributes will become available once the world adapter adds support.`);
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
const runId = store?.workflowMetadata?.workflowRunId;
|
|
66
|
+
if (!runId) {
|
|
67
|
+
throw new Error('__builtin_set_attributes: no workflow run id available in step context');
|
|
68
|
+
}
|
|
69
|
+
await world.runs.experimentalSetAttributes(runId, changes, options);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (attempt < INTERNAL_ATTRIBUTES_MAX_ATTEMPTS) {
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
// Failing to post tags should not fail a run during the experimental phase.
|
|
76
|
+
// After three attempts, log and let the internal step complete so the
|
|
77
|
+
// runtime does not convert retry exhaustion into a FatalError.
|
|
78
|
+
console.error(`[workflow] setAttributes: failed to post tags after ${INTERNAL_ATTRIBUTES_MAX_ATTEMPTS} attempts; dropping the internal attribute write. ${formatUnknownError(error)}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
__builtin_set_attributes.maxRetries = INTERNAL_ATTRIBUTES_MAX_ATTEMPTS - 1;
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbHRpbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJuYWwvYnVpbHRpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILE1BQU0sQ0FBQyxLQUFLLFVBQVUsK0JBQStCO0lBR25ELFVBQVUsQ0FBQztJQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QjtJQUMzQyxVQUFVLENBQUM7SUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUI7SUFDM0MsVUFBVSxDQUFDO0lBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FDekMsaURBQWlELENBQ2xELENBQUM7QUFFRixNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQztBQUUzQyxTQUFTLGtCQUFrQixDQUFDLEtBQWM7SUFDeEMsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDMUQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsT0FBcUQsRUFDckQsT0FBK0M7SUFFL0MsVUFBVSxDQUFDO0lBQ1gsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQ2pDLE1BQU0sQ0FBQyxHQUFHLFVBQXFDLENBQUM7SUFFaEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FTdkQsQ0FBQztJQUNkLE1BQU0sS0FBSyxHQUFHLGNBQWMsRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDO0lBQzNDLE1BQU0sT0FBTyxHQUNYLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEtBQUssUUFBUTtRQUM5QyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPO1FBQzVCLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQztJQUV2QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQVd2QyxDQUFDO0lBQ2QsSUFBSSxPQUFPLEtBQUssRUFBRSxJQUFJLEVBQUUseUJBQXlCLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDakUsbUVBQW1FO1FBQ25FLG1FQUFtRTtRQUNuRSxpRUFBaUU7UUFDakUsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNuQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELE9BQU8sQ0FBQyxJQUFJLENBQ1YsNkRBQTZELFNBQVMscU1BQXFNLENBQzVRLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDO1FBQ3JELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0VBQXdFLENBQ3pFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLE9BQU8sR0FBRyxnQ0FBZ0MsRUFBRSxDQUFDO1lBQy9DLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUVELDRFQUE0RTtRQUM1RSxzRUFBc0U7UUFDdEUsK0RBQStEO1FBQy9ELE9BQU8sQ0FBQyxLQUFLLENBQ1gsdURBQXVELGdDQUFnQyxxREFBcUQsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDeEssQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDO0FBR0Msd0JBR0QsQ0FBQyxVQUFVLEdBQUcsZ0NBQWdDLEdBQUcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGVzZSBhcmUgdGhlIGJ1aWx0LWluIHN0ZXBzIHRoYXQgYXJlIFwiYXV0b21hdGljYWxseSBhdmFpbGFibGVcIiBpbiB0aGUgd29ya2Zsb3cgc2NvcGUuIFRoZXkgYXJlXG4gKiBzaW1pbGFyIHRvIFwic3RkbGliXCIgZXhjZXB0IHRoYXQgYXJlIG5vdCBtZWFudCB0byBiZSBpbXBvcnRlZCBieSB1c2VycywgYnV0IGFyZSBpbnN0ZWFkIFwianVzdCBhdmFpbGFibGVcIlxuICogYWxvbmdzaWRlIHVzZXIgZGVmaW5lZCBzdGVwcy4gVGhleSBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBydW50aW1lXG4gKi9cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXIoXG4gIHRoaXM6IFJlcXVlc3QgfCBSZXNwb25zZVxuKSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiB0aGlzLmFycmF5QnVmZmVyKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfX2J1aWx0aW5fcmVzcG9uc2VfanNvbih0aGlzOiBSZXF1ZXN0IHwgUmVzcG9uc2UpIHtcbiAgJ3VzZSBzdGVwJztcbiAgcmV0dXJuIHRoaXMuanNvbigpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX19idWlsdGluX3Jlc3BvbnNlX3RleHQodGhpczogUmVxdWVzdCB8IFJlc3BvbnNlKSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiB0aGlzLnRleHQoKTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUgZGVkdXBlIGZvciB0aGUgdW5zdXBwb3J0ZWQtd29ybGQgd2FybmluZyBzbyBoaWdoLXZvbHVtZVxuICogY2FsbGVycyBkb24ndCBmbG9vZCBsb2dzLlxuICovXG5jb25zdCBVTlNVUFBPUlRFRF9XT1JMRF9XQVJORUQgPSBTeW1ib2wuZm9yKFxuICAnQHdvcmtmbG93L3NldEF0dHJpYnV0ZXMvL3Vuc3VwcG9ydGVkV29ybGRXYXJuZWQnXG4pO1xuXG5jb25zdCBJTlRFUk5BTF9BVFRSSUJVVEVTX01BWF9BVFRFTVBUUyA9IDM7XG5cbmZ1bmN0aW9uIGZvcm1hdFVua25vd25FcnJvcihlcnJvcjogdW5rbm93bikge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBlcnJvci5zdGFjayA/PyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG59XG5cbi8qKlxuICogU3RlcCBicmlkZ2UgZm9yIHdvcmtmbG93LWJvZHkgYHNldEF0dHJpYnV0ZXNgIGNhbGxzLiBUaGUgVk0tc2lkZVxuICogaGVscGVyIHZhbGlkYXRlcyBpbnB1dCBhbmQgZGlzcGF0Y2hlcyBoZXJlIHZpYSBgdXNlU3RlcGAuIFRoaXMgc3RlcFxuICogcnVucyBpbiBub3JtYWwgTm9kZSBjb250ZXh0IHdpdGggZnVsbCB3b3JsZCBhY2Nlc3MuXG4gKlxuICogVGhlIGRpc3BhdGNoIHJlYWRzIHRoZSB3b3JsZCBhbmQgY3VycmVudCBydW4gaWQgZGlyZWN0bHkgZnJvbVxuICogYGdsb2JhbFRoaXNgIHN5bWJvbHMgcG9wdWxhdGVkIGJ5IHRoZSB3b3JrZmxvdy9zdGVwIHJ1bnRpbWUg4oCUIHRoaXNcbiAqIGludGVudGlvbmFsbHkgYXZvaWRzIGltcG9ydGluZyBgQHdvcmtmbG93L2NvcmVgIHNvIHRoZSBOZXh0LmpzXG4gKiBkZWZlcnJlZC1lbnRyaWVzIGRpc2NvdmVyZXIgY2FuJ3Qgd2FsayBhIGNoYWluIGludG8gd29ybGQgYWRhcHRlcnNcbiAqIGFuZCBgQHZlcmNlbC9xdWV1ZWAgZnJvbSB0aGlzIHN0ZXAgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9fYnVpbHRpbl9zZXRfYXR0cmlidXRlcyhcbiAgY2hhbmdlczogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bGwgfT4sXG4gIG9wdGlvbnM/OiB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbiB9XG4pIHtcbiAgJ3VzZSBzdGVwJztcbiAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGNvbnN0IGcgPSBnbG9iYWxUaGlzIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+O1xuXG4gIGNvbnN0IGNvbnRleHRTdG9yYWdlID0gZ1tTeW1ib2wuZm9yKCdXT1JLRkxPV19TVEVQX0NPTlRFWFRfU1RPUkFHRScpXSBhc1xuICAgIHwge1xuICAgICAgICBnZXRTdG9yZTogKCkgPT5cbiAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgc3RlcE1ldGFkYXRhPzogeyBhdHRlbXB0PzogbnVtYmVyIH07XG4gICAgICAgICAgICAgIHdvcmtmbG93TWV0YWRhdGE/OiB7IHdvcmtmbG93UnVuSWQ/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RvcmUgPSBjb250ZXh0U3RvcmFnZT8uZ2V0U3RvcmU/LigpO1xuICBjb25zdCBhdHRlbXB0ID1cbiAgICB0eXBlb2Ygc3RvcmU/LnN0ZXBNZXRhZGF0YT8uYXR0ZW1wdCA9PT0gJ251bWJlcidcbiAgICAgID8gc3RvcmUuc3RlcE1ldGFkYXRhLmF0dGVtcHRcbiAgICAgIDogSU5URVJOQUxfQVRUUklCVVRFU19NQVhfQVRURU1QVFM7XG5cbiAgY29uc3Qgd29ybGQgPSBnW1N5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vY2FjaGUnKV0gYXNcbiAgICB8IHtcbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgICAgcnVucz86IHtcbiAgICAgICAgICBleHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzPzogKFxuICAgICAgICAgICAgcnVuSWQ6IHN0cmluZyxcbiAgICAgICAgICAgIGNoYW5nZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudWxsIH0+LFxuICAgICAgICAgICAgb3B0aW9ucz86IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuIH1cbiAgICAgICAgICApID0+IFByb21pc2U8dW5rbm93bj47XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2Ygd29ybGQ/LnJ1bnM/LmV4cGVyaW1lbnRhbFNldEF0dHJpYnV0ZXMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBXb3JsZCBhZGFwdGVyIGRvZXNuJ3QgaW1wbGVtZW50IGF0dHJpYnV0ZXMgeWV0IOKAlCBuby1vcCB0aGUgY2FsbCxcbiAgICAvLyBidXQgZW1pdCBvbmUgcHJvY2Vzcy13aWRlIHdhcm5pbmcgc28gdXNlcnMga25vdyB0aGVpciB3cml0ZXMgYXJlXG4gICAgLy8gYmVpbmcgZHJvcHBlZC4gVGhlIFZNLXNpZGUgdmFsaWRhdGlvbiBhbHJlYWR5IHJhbiBzbyB0aGUgaW5wdXRcbiAgICAvLyBpcyB3ZWxsLWZvcm1lZC5cbiAgICBpZiAoIWdbVU5TVVBQT1JURURfV09STERfV0FSTkVEXSkge1xuICAgICAgZ1tVTlNVUFBPUlRFRF9XT1JMRF9XQVJORURdID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHdvcmxkTmFtZSA9IHdvcmxkPy5uYW1lID8gYCAoJHt3b3JsZC5uYW1lfSlgIDogJyc7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbd29ya2Zsb3ddIHNldEF0dHJpYnV0ZXM6IHRoZSBjdXJyZW50IHdvcmxkIGltcGxlbWVudGF0aW9uJHt3b3JsZE5hbWV9IGRvZXMgbm90IGltcGxlbWVudCBleHBlcmltZW50YWxTZXRBdHRyaWJ1dGVzOyB0aGlzIGNhbGwgKGFuZCBhbnkgc3Vic2VxdWVudCBzZXRBdHRyaWJ1dGVzIGNhbGxzIGluIHRoaXMgcHJvY2VzcykgaXMgYSBuby1vcC4gQXR0cmlidXRlcyB3aWxsIGJlY29tZSBhdmFpbGFibGUgb25jZSB0aGUgd29ybGQgYWRhcHRlciBhZGRzIHN1cHBvcnQuYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBydW5JZCA9IHN0b3JlPy53b3JrZmxvd01ldGFkYXRhPy53b3JrZmxvd1J1bklkO1xuICAgIGlmICghcnVuSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ19fYnVpbHRpbl9zZXRfYXR0cmlidXRlczogbm8gd29ya2Zsb3cgcnVuIGlkIGF2YWlsYWJsZSBpbiBzdGVwIGNvbnRleHQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHdvcmxkLnJ1bnMuZXhwZXJpbWVudGFsU2V0QXR0cmlidXRlcyhydW5JZCwgY2hhbmdlcywgb3B0aW9ucyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGF0dGVtcHQgPCBJTlRFUk5BTF9BVFRSSUJVVEVTX01BWF9BVFRFTVBUUykge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gRmFpbGluZyB0byBwb3N0IHRhZ3Mgc2hvdWxkIG5vdCBmYWlsIGEgcnVuIGR1cmluZyB0aGUgZXhwZXJpbWVudGFsIHBoYXNlLlxuICAgIC8vIEFmdGVyIHRocmVlIGF0dGVtcHRzLCBsb2cgYW5kIGxldCB0aGUgaW50ZXJuYWwgc3RlcCBjb21wbGV0ZSBzbyB0aGVcbiAgICAvLyBydW50aW1lIGRvZXMgbm90IGNvbnZlcnQgcmV0cnkgZXhoYXVzdGlvbiBpbnRvIGEgRmF0YWxFcnJvci5cbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgYFt3b3JrZmxvd10gc2V0QXR0cmlidXRlczogZmFpbGVkIHRvIHBvc3QgdGFncyBhZnRlciAke0lOVEVSTkFMX0FUVFJJQlVURVNfTUFYX0FUVEVNUFRTfSBhdHRlbXB0czsgZHJvcHBpbmcgdGhlIGludGVybmFsIGF0dHJpYnV0ZSB3cml0ZS4gJHtmb3JtYXRVbmtub3duRXJyb3IoZXJyb3IpfWBcbiAgICApO1xuICB9XG59XG5cbihcbiAgX19idWlsdGluX3NldF9hdHRyaWJ1dGVzIGFzIHR5cGVvZiBfX2J1aWx0aW5fc2V0X2F0dHJpYnV0ZXMgJiB7XG4gICAgbWF4UmV0cmllczogbnVtYmVyO1xuICB9XG4pLm1heFJldHJpZXMgPSBJTlRFUk5BTF9BVFRSSUJVVEVTX01BWF9BVFRFTVBUUyAtIDE7XG4iXX0=
|
package/dist/observability.d.ts
CHANGED
package/dist/observability.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```ts
|
|
9
|
-
* import { getWorld } from 'workflow/
|
|
9
|
+
* import { getWorld } from 'workflow/runtime';
|
|
10
10
|
* import { hydrateResourceIO, observabilityRevivers } from 'workflow/observability';
|
|
11
11
|
*
|
|
12
12
|
* const world = await getWorld();
|
|
@@ -17,4 +17,4 @@
|
|
|
17
17
|
*/
|
|
18
18
|
export { hydrateData, hydrateResourceIO, observabilityRevivers, } from '@workflow/core/serialization-format';
|
|
19
19
|
export { parseClassName, parseStepName, parseWorkflowName, } from '@workflow/utils';
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vYnNlcnZhYmlsaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsT0FBTyxFQUNMLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIscUJBQXFCLEdBRXRCLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsT0FBTyxFQUNMLGNBQWMsRUFDZCxhQUFhLEVBQ2IsaUJBQWlCLEdBQ2xCLE1BQU0saUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9ic2VydmFiaWxpdHkgdXRpbGl0aWVzIGZvciBoeWRyYXRpbmcgc2VyaWFsaXplZCB3b3JrZmxvdyBkYXRhLlxuICpcbiAqIFVzZSB0aGVzZSB3aGVuIGluc3BlY3Rpbmcgd29ya2Zsb3cgc3RlcCBJL08sIHJ1biBpbnB1dHMvb3V0cHV0cyxcbiAqIG9yIGV2ZW50IGRhdGEgZnJvbSB0aGUgV29ya2Zsb3cgU0RLJ3Mgd29ybGQgQVBJcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGdldFdvcmxkIH0gZnJvbSAnd29ya2Zsb3cvcnVudGltZSc7XG4gKiBpbXBvcnQgeyBoeWRyYXRlUmVzb3VyY2VJTywgb2JzZXJ2YWJpbGl0eVJldml2ZXJzIH0gZnJvbSAnd29ya2Zsb3cvb2JzZXJ2YWJpbGl0eSc7XG4gKlxuICogY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICogY29uc3Qgc3RlcCA9IGF3YWl0IHdvcmxkLnN0ZXBzLmdldChydW5JZCwgc3RlcElkLCB7IHJlc29sdmVEYXRhOiAnYWxsJyB9KTtcbiAqIGNvbnN0IGh5ZHJhdGVkID0gaHlkcmF0ZVJlc291cmNlSU8oc3RlcCwgb2JzZXJ2YWJpbGl0eVJldml2ZXJzKTtcbiAqIC8vIGh5ZHJhdGVkLmlucHV0IGFuZCBoeWRyYXRlZC5vdXRwdXQgYXJlIG5vdyBwbGFpbiBKUyBvYmplY3RzXG4gKiBgYGBcbiAqL1xuZXhwb3J0IHtcbiAgaHlkcmF0ZURhdGEsXG4gIGh5ZHJhdGVSZXNvdXJjZUlPLFxuICBvYnNlcnZhYmlsaXR5UmV2aXZlcnMsXG4gIHR5cGUgUmV2aXZlcnMsXG59IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24tZm9ybWF0JztcblxuZXhwb3J0IHtcbiAgcGFyc2VDbGFzc05hbWUsXG4gIHBhcnNlU3RlcE5hbWUsXG4gIHBhcnNlV29ya2Zsb3dOYW1lLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuIl19
|
package/dist/runtime.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createWorld, getWorld, getWorldHandlers, healthCheck, type HealthCheckEndpoint, type HealthCheckOptions, type HealthCheckResult, setWorld,
|
|
1
|
+
export { createWorld, getWorld, getWorldHandlers, healthCheck, type HealthCheckEndpoint, type HealthCheckOptions, type HealthCheckResult, setWorld, workflowEntrypoint, } from '@workflow/core/runtime';
|
|
2
2
|
//# sourceMappingURL=runtime.d.ts.map
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,WAAW,EACX,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,QAAQ,EACR,kBAAkB,GACnB,MAAM,wBAAwB,CAAC"}
|
package/dist/runtime.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createWorld, getWorld, getWorldHandlers, healthCheck, setWorld,
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export { createWorld, getWorld, getWorldHandlers, healthCheck, setWorld, workflowEntrypoint, } from '@workflow/core/runtime';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxXQUFXLEVBQ1gsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixXQUFXLEVBSVgsUUFBUSxFQUNSLGtCQUFrQixHQUNuQixNQUFNLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtcbiAgY3JlYXRlV29ybGQsXG4gIGdldFdvcmxkLFxuICBnZXRXb3JsZEhhbmRsZXJzLFxuICBoZWFsdGhDaGVjayxcbiAgdHlwZSBIZWFsdGhDaGVja0VuZHBvaW50LFxuICB0eXBlIEhlYWx0aENoZWNrT3B0aW9ucyxcbiAgdHlwZSBIZWFsdGhDaGVja1Jlc3VsdCxcbiAgc2V0V29ybGQsXG4gIHdvcmtmbG93RW50cnlwb2ludCxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4iXX0=
|
package/docs/ai/index.mdx
CHANGED
|
@@ -92,7 +92,7 @@ Then modify your API endpoint to use the OpenAI provider:
|
|
|
92
92
|
{/* @skip-typecheck: incomplete code sample */}
|
|
93
93
|
```typescript title="app/api/chat/route.ts" lineNumbers
|
|
94
94
|
// ...
|
|
95
|
-
import { openai } from "@
|
|
95
|
+
import { openai } from "@ai-sdk/openai"; // [!code highlight]
|
|
96
96
|
|
|
97
97
|
export async function POST(req: Request) {
|
|
98
98
|
// ...
|
|
@@ -120,16 +120,17 @@ The core code that makes all of this happen is quite simple. Here's a breakdown
|
|
|
120
120
|
|
|
121
121
|
<Tab value="API Route">
|
|
122
122
|
|
|
123
|
-
Our API route makes a simple call to [AI SDK's `
|
|
123
|
+
Our API route makes a simple call to [AI SDK's `ToolLoopAgent` class](https://ai-sdk.dev/docs/agents/overview), which encapsulates the LLM call, tool execution loop, and stopping conditions on top of [AI SDK's `streamText` function](https://ai-sdk.dev/docs/reference/ai-sdk-core/stream-text#streamtext). This is also where we pass tools to the agent.
|
|
124
124
|
|
|
125
125
|
```typescript title="app/api/chat/route.ts" lineNumbers
|
|
126
|
-
import {
|
|
127
|
-
import type {
|
|
126
|
+
import { ToolLoopAgent } from "ai";
|
|
127
|
+
import type { UIMessage } from "ai";
|
|
128
|
+
import { convertToModelMessages, createUIMessageStreamResponse } from "ai";
|
|
128
129
|
|
|
129
130
|
export async function POST(req: Request) {
|
|
130
131
|
const { messages }: { messages: UIMessage[] } = await req.json();
|
|
131
|
-
const agent = new
|
|
132
|
-
model:
|
|
132
|
+
const agent = new ToolLoopAgent({ // [!code highlight]
|
|
133
|
+
model: "bedrock/claude-4-5-haiku-20251001-v1",
|
|
133
134
|
instructions: FLIGHT_ASSISTANT_PROMPT,
|
|
134
135
|
tools: flightBookingTools,
|
|
135
136
|
});
|
|
@@ -231,7 +232,7 @@ Now that we have a basic agent using AI SDK, we can modify it to make it durable
|
|
|
231
232
|
Add the Workflow SDK packages to your project:
|
|
232
233
|
|
|
233
234
|
```package-install
|
|
234
|
-
npm i workflow @workflow
|
|
235
|
+
npm i workflow @ai-sdk/workflow
|
|
235
236
|
```
|
|
236
237
|
|
|
237
238
|
and extend the Next.js config to transform your workflow code (see [Getting Started](/docs/getting-started/next) for more details).
|
|
@@ -257,18 +258,18 @@ Move the agent logic into a separate function, which will serve as our workflow
|
|
|
257
258
|
|
|
258
259
|
{/* @skip-typecheck: Shows two mutually exclusive model options */}
|
|
259
260
|
```typescript title="workflows/chat/workflow.ts" lineNumbers
|
|
260
|
-
import {
|
|
261
|
+
import { WorkflowAgent, type ModelCallStreamPart } from "@ai-sdk/workflow"; // [!code highlight]
|
|
261
262
|
import { getWritable } from "workflow"; // [!code highlight]
|
|
262
263
|
import { tools } from "@/ai/tools";
|
|
263
|
-
import { openai } from "@
|
|
264
|
-
import
|
|
264
|
+
import { openai } from "@ai-sdk/openai";
|
|
265
|
+
import { convertToModelMessages, type UIMessage } from "ai";
|
|
265
266
|
|
|
266
|
-
export async function chatWorkflow(messages:
|
|
267
|
+
export async function chatWorkflow(messages: UIMessage[]) {
|
|
267
268
|
"use workflow"; // [!code highlight]
|
|
268
269
|
|
|
269
|
-
const writable = getWritable<
|
|
270
|
+
const writable = getWritable<ModelCallStreamPart>(); // [!code highlight]
|
|
270
271
|
|
|
271
|
-
const agent = new
|
|
272
|
+
const agent = new WorkflowAgent({ // [!code highlight]
|
|
272
273
|
|
|
273
274
|
// If using AI Gateway, just specify the model name as a string:
|
|
274
275
|
model: "bedrock/claude-4-5-haiku-20251001-v1", // [!code highlight]
|
|
@@ -280,8 +281,10 @@ export async function chatWorkflow(messages: ModelMessage[]) {
|
|
|
280
281
|
tools: flightBookingTools,
|
|
281
282
|
});
|
|
282
283
|
|
|
284
|
+
const modelMessages = await convertToModelMessages(messages); // [!code highlight]
|
|
285
|
+
|
|
283
286
|
await agent.stream({ // [!code highlight]
|
|
284
|
-
messages,
|
|
287
|
+
messages: modelMessages,
|
|
285
288
|
writable,
|
|
286
289
|
});
|
|
287
290
|
}
|
|
@@ -290,8 +293,9 @@ export async function chatWorkflow(messages: ModelMessage[]) {
|
|
|
290
293
|
Key changes:
|
|
291
294
|
|
|
292
295
|
- Add the `"use workflow"` directive to mark our Agent as a workflow function
|
|
293
|
-
-
|
|
294
|
-
-
|
|
296
|
+
- Replace the in-memory agent with [`WorkflowAgent`](https://ai-sdk.dev/v7/docs/agents/workflow-agent#workflowagent) from `@ai-sdk/workflow`. This runs the agent loop inside a workflow, persists state across step boundaries, and lets tool executions marked with `"use step"` retry automatically.
|
|
297
|
+
- Convert AI SDK `UIMessage` values to model messages inside the workflow before calling `agent.stream()`.
|
|
298
|
+
- Use [`getWritable()`](/docs/api-reference/workflow/get-writable) to get a stream for agent output. `WorkflowAgent` writes `ModelCallStreamPart` chunks to this persistent stream, and API endpoints can read from a run's stream at any time.
|
|
295
299
|
</Step>
|
|
296
300
|
|
|
297
301
|
<Step>
|
|
@@ -300,19 +304,18 @@ Key changes:
|
|
|
300
304
|
Remove the agent call that we just extracted, and replace it with a call to `start()` to run the workflow:
|
|
301
305
|
|
|
302
306
|
```typescript title="app/api/chat/route.ts" lineNumbers
|
|
303
|
-
import
|
|
304
|
-
import {
|
|
307
|
+
import { createModelCallToUIChunkTransform } from "@ai-sdk/workflow";
|
|
308
|
+
import { createUIMessageStreamResponse, type UIMessage } from "ai";
|
|
305
309
|
import { start } from "workflow/api";
|
|
306
310
|
import { chatWorkflow } from "@/workflows/chat/workflow";
|
|
307
311
|
|
|
308
312
|
export async function POST(req: Request) {
|
|
309
313
|
const { messages }: { messages: UIMessage[] } = await req.json();
|
|
310
|
-
const modelMessages = await convertToModelMessages(messages);
|
|
311
314
|
|
|
312
|
-
const run = await start(chatWorkflow, [
|
|
315
|
+
const run = await start(chatWorkflow, [messages]); // [!code highlight]
|
|
313
316
|
|
|
314
317
|
return createUIMessageStreamResponse({
|
|
315
|
-
stream: run.readable, // [!code highlight]
|
|
318
|
+
stream: run.readable.pipeThrough(createModelCallToUIChunkTransform()), // [!code highlight]
|
|
316
319
|
});
|
|
317
320
|
}
|
|
318
321
|
```
|
|
@@ -320,7 +323,8 @@ export async function POST(req: Request) {
|
|
|
320
323
|
Key changes:
|
|
321
324
|
|
|
322
325
|
- Call `start()` to run the workflow function. This returns a `Run` object, which contains the run ID and the readable stream (see [Starting Workflows](/docs/foundations/starting-workflows) for more details on the `Run` object).
|
|
323
|
-
- Pass the `writable` to `agent.stream()` instead of returning a stream directly, ensuring all the Agent output is written to
|
|
326
|
+
- Pass the `writable` to `agent.stream()` instead of returning a stream directly, ensuring all the Agent output is written to the run's stream.
|
|
327
|
+
- Pipe the readable stream through `createModelCallToUIChunkTransform()` so the raw model-call chunks become AI SDK UI message chunks before they are returned to the client.
|
|
324
328
|
|
|
325
329
|
</Step>
|
|
326
330
|
|
|
@@ -422,7 +426,7 @@ A complete example that includes all of the above, plus all of the "next steps"
|
|
|
422
426
|
## Related Documentation
|
|
423
427
|
|
|
424
428
|
- [Tools](/docs/ai/defining-tools) - Patterns for defining tools for your agent
|
|
425
|
-
- [`
|
|
429
|
+
- [`WorkflowAgent`](https://ai-sdk.dev/v7/docs/agents/workflow-agent#workflowagent) - AI SDK API for durable, resumable agents
|
|
426
430
|
- [Workflows and Steps](/docs/foundations/workflows-and-steps) - Core concepts
|
|
427
431
|
- [Streaming](/docs/foundations/streaming) - In-depth streaming guide
|
|
428
432
|
- [Errors and Retries](/docs/foundations/errors-and-retries) - Error handling patterns
|
|
@@ -17,9 +17,33 @@ All the functions and primitives that come with Workflow SDK by package.
|
|
|
17
17
|
<Card title="workflow/api" href="/docs/api-reference/workflow-api">
|
|
18
18
|
API reference for runtime functions from the `workflow/api` package.
|
|
19
19
|
</Card>
|
|
20
|
+
<Card title="workflow/runtime" href="/docs/api-reference/workflow-runtime">
|
|
21
|
+
Runtime functions for resolving the World instance and the low-level World SDK.
|
|
22
|
+
</Card>
|
|
23
|
+
<Card title="workflow/observability" href="/docs/api-reference/workflow-observability">
|
|
24
|
+
Utilities to hydrate step I/O, parse display names, and decrypt workflow data.
|
|
25
|
+
</Card>
|
|
20
26
|
<Card title="workflow/next" href="/docs/api-reference/workflow-next">
|
|
21
27
|
Next.js integration for Workflow SDK that automatically configures bundling and runtime support.
|
|
22
28
|
</Card>
|
|
29
|
+
<Card title="workflow/nitro" href="/docs/api-reference/workflow-nitro">
|
|
30
|
+
Nitro module for workflow bundling and runtime support.
|
|
31
|
+
</Card>
|
|
32
|
+
<Card title="workflow/nuxt" href="/docs/api-reference/workflow-nuxt">
|
|
33
|
+
Nuxt module for workflow bundling and runtime support.
|
|
34
|
+
</Card>
|
|
35
|
+
<Card title="workflow/sveltekit" href="/docs/api-reference/workflow-sveltekit">
|
|
36
|
+
SvelteKit Vite plugin for workflow bundling and runtime support.
|
|
37
|
+
</Card>
|
|
38
|
+
<Card title="workflow/astro" href="/docs/api-reference/workflow-astro">
|
|
39
|
+
Astro integration for workflow bundling and runtime support.
|
|
40
|
+
</Card>
|
|
41
|
+
<Card title="workflow/vite" href="/docs/api-reference/workflow-vite">
|
|
42
|
+
Standalone Vite plugin for workflow bundling and runtime support.
|
|
43
|
+
</Card>
|
|
44
|
+
<Card title="workflow/nest" href="/docs/api-reference/workflow-nest">
|
|
45
|
+
NestJS module for workflow bundling and runtime support.
|
|
46
|
+
</Card>
|
|
23
47
|
<Card title="workflow/errors" href="/docs/api-reference/workflow-errors">
|
|
24
48
|
Semantic error types for handling workflow storage backend failures.
|
|
25
49
|
</Card>
|
|
@@ -4,7 +4,15 @@
|
|
|
4
4
|
"workflow-globals",
|
|
5
5
|
"workflow",
|
|
6
6
|
"workflow-api",
|
|
7
|
+
"workflow-runtime",
|
|
8
|
+
"workflow-observability",
|
|
7
9
|
"workflow-next",
|
|
10
|
+
"workflow-nitro",
|
|
11
|
+
"workflow-nuxt",
|
|
12
|
+
"workflow-sveltekit",
|
|
13
|
+
"workflow-astro",
|
|
14
|
+
"workflow-vite",
|
|
15
|
+
"workflow-nest",
|
|
8
16
|
"workflow-errors",
|
|
9
17
|
"workflow-serde",
|
|
10
18
|
"workflow-ai",
|
|
@@ -11,7 +11,6 @@ The `@workflow/vitest` package provides a Vitest plugin and test helpers for run
|
|
|
11
11
|
|
|
12
12
|
Returns a Vite plugin array that handles SWC transforms, bundle building, and in-process handler registration automatically.
|
|
13
13
|
|
|
14
|
-
{/* @skip-typecheck - @workflow/vitest not available in docs-typecheck */}
|
|
15
14
|
|
|
16
15
|
```typescript
|
|
17
16
|
import { defineConfig } from "vitest/config";
|
|
@@ -22,6 +21,29 @@ export default defineConfig({
|
|
|
22
21
|
});
|
|
23
22
|
```
|
|
24
23
|
|
|
24
|
+
Pass a [`WorkflowTestOptions`](#workflowtestoptions) object when your project uses a non-standard layout — for example, a monorepo where `workflows/` does not live at the Vitest config's directory, or when the default `.workflow-data` / `.workflow-vitest` output locations need to move. The plugin forwards these paths to `buildWorkflowTests()` and `setupWorkflowTests()` through Vitest's per-project provided context, so each Vitest workspace project stays isolated.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { defineConfig } from "vitest/config";
|
|
29
|
+
import { workflow } from "@workflow/vitest";
|
|
30
|
+
|
|
31
|
+
export default defineConfig({
|
|
32
|
+
plugins: [
|
|
33
|
+
workflow({
|
|
34
|
+
cwd: "./apps/api",
|
|
35
|
+
rootDir: "./apps/api/test-artifacts",
|
|
36
|
+
}),
|
|
37
|
+
],
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Parameters:**
|
|
42
|
+
|
|
43
|
+
| Parameter | Type | Description |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| `options?` | `WorkflowTestOptions` | Optional configuration |
|
|
46
|
+
|
|
25
47
|
**Returns:** `Plugin[]`
|
|
26
48
|
|
|
27
49
|
## Setup Functions
|
|
@@ -30,7 +52,6 @@ export default defineConfig({
|
|
|
30
52
|
|
|
31
53
|
Builds workflow and step bundles to disk. Called automatically by the `workflow()` plugin in `globalSetup`. Use directly only for [manual setup](/docs/testing#manual-setup).
|
|
32
54
|
|
|
33
|
-
{/* @skip-typecheck - @workflow/vitest not available in docs-typecheck */}
|
|
34
55
|
|
|
35
56
|
```typescript
|
|
36
57
|
import { buildWorkflowTests } from "@workflow/vitest";
|
|
@@ -48,11 +69,10 @@ export async function setup() {
|
|
|
48
69
|
|
|
49
70
|
### `setupWorkflowTests()`
|
|
50
71
|
|
|
51
|
-
Sets up an in-process workflow runtime in each test worker. Imports pre-built bundles, creates a [Local World](/
|
|
72
|
+
Sets up an in-process workflow runtime in each test worker. Imports pre-built bundles, creates a [Local World](/worlds/local) instance with direct handlers, and sets it as the global world. Clears all workflow data on each invocation for full test isolation.
|
|
52
73
|
|
|
53
74
|
Called automatically by the `workflow()` plugin in `setupFiles`. Use directly only for [manual setup](/docs/testing#manual-setup).
|
|
54
75
|
|
|
55
|
-
{/* @skip-typecheck - @workflow/vitest not available in docs-typecheck */}
|
|
56
76
|
|
|
57
77
|
```typescript
|
|
58
78
|
import { beforeAll, afterAll } from "vitest";
|
|
@@ -83,7 +103,10 @@ Tears down the workflow test world. Clears the global world and closes the Local
|
|
|
83
103
|
|
|
84
104
|
| Option | Type | Default | Description |
|
|
85
105
|
| --- | --- | --- | --- |
|
|
86
|
-
| `cwd` | `string` | `process.cwd()` | The working directory of the project (where `workflows/` lives) |
|
|
106
|
+
| `cwd` | `string` | `process.cwd()` | The working directory of the project (where `workflows/` lives). Relative paths resolve against `process.cwd()`. |
|
|
107
|
+
| `rootDir` | `string` | same as `cwd` | Root directory used for default test artifacts. When set, `dataDir` and `outDir` default to `<rootDir>/.workflow-data` and `<rootDir>/.workflow-vitest`. Relative paths resolve against `cwd`. |
|
|
108
|
+
| `dataDir` | `string` | `<rootDir>/.workflow-data` | Directory for workflow runtime data written by the test world. Relative paths resolve against `cwd`. |
|
|
109
|
+
| `outDir` | `string` | `<rootDir>/.workflow-vitest` | Directory for generated workflow and step bundles. Relative paths resolve against `cwd`. |
|
|
87
110
|
|
|
88
111
|
## Test Helpers
|
|
89
112
|
|
|
@@ -91,7 +114,6 @@ Tears down the workflow test world. Clears the global world and closes the Local
|
|
|
91
114
|
|
|
92
115
|
Polls the event log until the workflow has a pending `sleep()` call — one with a `wait_created` event but no corresponding `wait_completed` event. Returns the correlation ID of the pending sleep, which can be passed to [`wakeUp()`](/docs/api-reference/workflow-api/get-run) to target a specific sleep.
|
|
93
116
|
|
|
94
|
-
{/* @skip-typecheck - @workflow/vitest not available in docs-typecheck */}
|
|
95
117
|
|
|
96
118
|
```typescript
|
|
97
119
|
import { waitForSleep } from "@workflow/vitest"; // [!code highlight]
|
|
@@ -120,7 +142,6 @@ await getRun(run.runId).wakeUp({ correlationIds: [sleepId] }); // [!code highlig
|
|
|
120
142
|
|
|
121
143
|
Polls the hook list and event log until a hook matching the optional `token` filter exists that hasn't been received yet. Returns the matching hook object.
|
|
122
144
|
|
|
123
|
-
{/* @skip-typecheck - @workflow/vitest not available in docs-typecheck */}
|
|
124
145
|
|
|
125
146
|
```typescript
|
|
126
147
|
import { waitForHook } from "@workflow/vitest"; // [!code highlight]
|
|
@@ -8,6 +8,7 @@ prerequisites:
|
|
|
8
8
|
related:
|
|
9
9
|
- /docs/api-reference/workflow/define-hook
|
|
10
10
|
- /docs/api-reference/workflow/create-webhook
|
|
11
|
+
- /docs/foundations/idempotency
|
|
11
12
|
---
|
|
12
13
|
|
|
13
14
|
Creates a low-level hook primitive that can be used to resume a workflow run with arbitrary payloads.
|
|
@@ -65,6 +66,8 @@ export default Hook;`}
|
|
|
65
66
|
|
|
66
67
|
The returned `Hook` object also implements `AsyncIterable<T>`, which allows you to iterate over incoming payloads using `for await...of` syntax.
|
|
67
68
|
|
|
69
|
+
Use `hook.getConflict()` to check whether the hook token is already claimed by another active hook, without waiting for hook payload data. Calling `createHook()` on its own does not register the hook — registration is only committed when the workflow suspends. Awaiting `hook.getConflict()` suspends the workflow to commit the registration, then resolves with `null` once `hook_created` is recorded, or with the conflicting [`Run`](/docs/api-reference/workflow-api/get-run) if another active hook already owns the same token.
|
|
70
|
+
|
|
68
71
|
## Examples
|
|
69
72
|
|
|
70
73
|
### Basic Usage
|
|
@@ -112,6 +115,40 @@ export async function slackBotWorkflow(channelId: string) {
|
|
|
112
115
|
}
|
|
113
116
|
```
|
|
114
117
|
|
|
118
|
+
### Detecting Token Conflicts
|
|
119
|
+
|
|
120
|
+
Use `hook.getConflict()` when the workflow needs to claim a hook token before doing other work, but does not need a payload yet:
|
|
121
|
+
|
|
122
|
+
```typescript lineNumbers
|
|
123
|
+
import { createHook } from "workflow";
|
|
124
|
+
|
|
125
|
+
declare function chargeOrder(orderId: string): Promise<void>; // @setup
|
|
126
|
+
|
|
127
|
+
async function processOrder(orderId: string) {
|
|
128
|
+
"use workflow";
|
|
129
|
+
|
|
130
|
+
using hook = createHook({ // [!code highlight]
|
|
131
|
+
token: `order:${orderId}` // [!code highlight]
|
|
132
|
+
}); // [!code highlight]
|
|
133
|
+
|
|
134
|
+
const conflict = await hook.getConflict(); // [!code highlight]
|
|
135
|
+
if (conflict) { // [!code highlight]
|
|
136
|
+
// Another active workflow run already owns this token.
|
|
137
|
+
return { dedupedTo: conflict.runId };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
await chargeOrder(orderId);
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Because `createHook()` alone does not suspend the workflow, awaiting `hook.getConflict()` is what actually suspends the run and commits the hook registration. It only waits for registration — to receive payload data from a future `resumeHook()` call, await the hook itself or iterate it with `for await...of`.
|
|
145
|
+
|
|
146
|
+
On a conflict, the resolved value is a `Run` handle for the run that currently owns the token, with durable step-backed accessors. The duplicate run can decide in code how to handle it: return or log `conflict.runId`, inspect `await conflict.status`, wait on `await conflict.returnValue`, or cancel the owner with `await conflict.cancel()` and continue in the current run. See [Run idempotency](/docs/foundations/idempotency#run-idempotency) for these strategies in context.
|
|
147
|
+
|
|
148
|
+
<Callout type="info">
|
|
149
|
+
Custom hook tokens are the recommended way to coordinate active workflow runs. Use a deterministic token from your domain, such as an order ID or conversation ID, create the hook near the beginning of the workflow, and check `await hook.getConflict()` before work that depends on owning the token. See [Run idempotency](/docs/foundations/idempotency#run-idempotency).
|
|
150
|
+
</Callout>
|
|
151
|
+
|
|
115
152
|
### Waiting for Multiple Payloads
|
|
116
153
|
|
|
117
154
|
You can also wait for multiple payloads by using the `for await...of` syntax.
|
|
@@ -195,3 +232,4 @@ This is equivalent to manually calling `dispose()` but ensures the hook is alway
|
|
|
195
232
|
- [`defineHook()`](/docs/api-reference/workflow/define-hook) - Type-safe hook helper
|
|
196
233
|
- [`resumeHook()`](/docs/api-reference/workflow-api/resume-hook) - Resume a hook with a payload
|
|
197
234
|
- [`createWebhook()`](/docs/api-reference/workflow/create-webhook) - Higher-level HTTP webhook abstraction
|
|
235
|
+
- [Idempotency](/docs/foundations/idempotency) - Deduplicate step side effects and workflow starts
|
|
@@ -55,6 +55,7 @@ The returned `Webhook` object has:
|
|
|
55
55
|
|
|
56
56
|
- `url`: The HTTP endpoint URL that external systems can call
|
|
57
57
|
- `token`: The unique token identifying this webhook
|
|
58
|
+
- `getConflict()`: A promise that resolves with the conflicting run if another active hook already owns this token, or `null` once the webhook endpoint has been registered
|
|
58
59
|
- Implements `AsyncIterable<T>` for handling multiple requests, where `T` is `Request` (default) or `RequestWithResponse` (manual mode)
|
|
59
60
|
|
|
60
61
|
When using `createWebhook({ respondWith: 'manual' })`, the resolved request type is `RequestWithResponse`, which extends the standard `Request` interface with a `respondWith(response: Response): Promise<void>` method for sending custom responses back to the caller.
|